From unknown Sun Jun 22 11:49:37 2025 X-Loop: help-debbugs@gnu.org Subject: [bug#59053] [PATCH] gnu: Add spectre-meltdown-checker. Resent-From: Hilton Chain Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Sat, 05 Nov 2022 15:59:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 59053 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 59053@debbugs.gnu.org X-Debbugs-Original-To: guix-patches@gnu.org Received: via spool by submit@debbugs.gnu.org id=B.166766389318245 (code B ref -1); Sat, 05 Nov 2022 15:59:02 +0000 Received: (at submit) by debbugs.gnu.org; 5 Nov 2022 15:58:13 +0000 Received: from localhost ([127.0.0.1]:57861 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1orLYf-0004k9-MP for submit@debbugs.gnu.org; Sat, 05 Nov 2022 11:58:13 -0400 Received: from lists.gnu.org ([209.51.188.17]:44182) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1orLYT-0004jZ-7n for submit@debbugs.gnu.org; Sat, 05 Nov 2022 11:58:08 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1orLYT-0005Mw-2E for guix-patches@gnu.org; Sat, 05 Nov 2022 11:57:57 -0400 Received: from mail.boiledscript.com ([144.168.59.46]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1orLYR-000512-8J for guix-patches@gnu.org; Sat, 05 Nov 2022 11:57:56 -0400 Date: Sat, 05 Nov 2022 23:57:31 +0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ultrarare.space; s=dkim; t=1667663870; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Ttl4L85m1+0yZ08LJcm7GzOCew1V1+q69FtD9JJH3/c=; b=WXXOI4CLHWaWqLKVc4UlLUHsp5f6co6wmX0ARhOULAMexXC+YvE1r0enpoFYjQ1dcxbguL YwSBeusTFIt4uTks/ra7PbMbIp+67Q5z3dI7uKXKBy2zvix4DJdGusagLVNffwqVLAMNGY Mu5bgCDDt64fNRaaYZyx+4ovIgMqd/5Tv2HllzM8f8C73ciPUx55uvKOjUfD3QpdYYDguU UH4T9KBkR7pQGBmlnKyGAH5mERj90TQjgYWs/W7DQ36NXxJjaw4lWiWEWI2CGdv9gA9x0g cc2RijIjrNW/KG66vQ/Zwu8PnotWhL4KOnS7hqVWwhs19xxd+izty1RA6wZwuA== Message-ID: From: Hilton Chain MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 8bit X-Spamd-Bar: / Authentication-Results: mail.boiledscript.com; auth=pass smtp.mailfrom=hako@ultrarare.space Received-SPF: pass client-ip=144.168.59.46; envelope-from=hako@ultrarare.space; helo=mail.boiledscript.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: 1.0 (+) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.3 (--) * gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch: New file. * gnu/packages/linux.scm (spectre-meltdown-checker): New variable. * gnu/local.mk (dist_patch_DATA): Add it. --- gnu/local.mk | 1 + gnu/packages/linux.scm | 41 +++++++++++++++++++ ...n-checker-support-guix-system-kernel.patch | 26 ++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch diff --git a/gnu/local.mk b/gnu/local.mk index eb6ac3df58..88c1fa6278 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -1848,6 +1848,7 @@ dist_patch_DATA = \ %D%/packages/patches/syslinux-strip-gnu-property.patch \ %D%/packages/patches/snappy-add-O2-flag-in-CmakeLists.txt.patch \ %D%/packages/patches/snappy-add-inline-for-GCC.patch \ + %D%/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch \ %D%/packages/patches/sphinxbase-fix-doxygen.patch \ %D%/packages/patches/spice-vdagent-glib-2.68.patch \ %D%/packages/patches/sssd-optional-systemd.patch \ diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index cf11a7fc1b..db199869a7 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -9512,3 +9512,44 @@ (define-public tp-smapi-module @acronym{SMAPI, System Management Application Program Interface} and direct access to the embedded controller.") (license license:gpl2+))) + +(define-public spectre-meltdown-checker + (package + (name "spectre-meltdown-checker") + (version "0.45") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/speed47/spectre-meltdown-checker") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (patches + (search-patches + ;; https://github.com/speed47/spectre-meltdown-checker/pull/441 + "spectre-meltdown-checker-support-guix-system-kernel.patch")) + (sha256 + (base32 + "1xx8h5791lhc2xw0dcbzjkklzvlxwxkjzh8di4g8divfy24fqsn8")))) + (build-system copy-build-system) + (arguments + (list #:install-plan + #~'(("spectre-meltdown-checker.sh" "bin/spectre-meltdown-checker")) + #:phases + #~(modify-phases %standard-phases + (add-after 'unpack 'fixpath + (lambda* (#:key inputs #:allow-other-keys) + (substitute* "spectre-meltdown-checker.sh" + (("\\$\\{opt_arch_prefix\\}readelf") + (search-input-file inputs "/bin/readelf")) + (("perl") + (search-input-file inputs "/bin/perl")))))))) + (inputs (list binutils perl)) + (home-page "https://github.com/speed47/spectre-meltdown-checker") + (synopsis + "Spectre, Meltdown, Foreshadow, Fallout, RIDL, ZombieLoad vulnerability / +mitigation checker for Linux & BSD") + (description + "A shell script to assess your system's resilience against the several +transient execution CVEs that were published since early 2018, and give you +guidance as to how to mitigate them.") + (license license:gpl3))) diff --git a/gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch b/gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch new file mode 100644 index 0000000000..afec52b418 --- /dev/null +++ b/gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch @@ -0,0 +1,26 @@ +From 5b757d930ec0cf102b03fb9817d17e06c72e74b3 Mon Sep 17 00:00:00 2001 +From: Hilton Chain +Date: Sat, 5 Nov 2022 23:22:31 +0800 +Subject: [PATCH] Add support for Guix System kernel. + +--- + spectre-meltdown-checker.sh | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/spectre-meltdown-checker.sh b/spectre-meltdown-checker.sh +index 248a444..855a090 100755 +--- a/spectre-meltdown-checker.sh ++++ b/spectre-meltdown-checker.sh +@@ -2251,6 +2251,8 @@ if [ "$opt_live" = 1 ]; then + [ -e "/boot/kernel-genkernel-$(uname -m)-$(uname -r)" ] && opt_kernel="/boot/kernel-genkernel-$(uname -m)-$(uname -r)" + # NixOS: + [ -e "/run/booted-system/kernel" ] && opt_kernel="/run/booted-system/kernel" ++ # Guix System: ++ [ -e "/run/booted-system/kernel/bzImage" ] && opt_kernel="/run/booted-system/kernel/bzImage" + # systemd kernel-install: + [ -e "/etc/machine-id" ] && [ -e "/boot/$(cat /etc/machine-id)/$(uname -r)/linux" ] && opt_kernel="/boot/$(cat /etc/machine-id)/$(uname -r)/linux" + # Clear Linux: + +base-commit: a6c943d38f315f339697ec26e7374a09b88f2183 +-- +2.38.0 base-commit: 2211f50ec1ebcf5f880454b4133ac40e41abac21 -- 2.38.0 From unknown Sun Jun 22 11:49:37 2025 X-Loop: help-debbugs@gnu.org Subject: [bug#59053] [PATCH] gnu: Add spectre-meltdown-checker. Resent-From: Liliana Marie Prikler Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Sat, 05 Nov 2022 16:46:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 59053 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: Hilton Chain , 59053@debbugs.gnu.org Cc: control@debbugs.gnu.org Received: via spool by 59053-submit@debbugs.gnu.org id=B59053.166766675222654 (code B ref 59053); Sat, 05 Nov 2022 16:46:02 +0000 Received: (at 59053) by debbugs.gnu.org; 5 Nov 2022 16:45:52 +0000 Received: from localhost ([127.0.0.1]:57886 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1orMIq-0005tJ-7S for submit@debbugs.gnu.org; Sat, 05 Nov 2022 12:45:52 -0400 Received: from mail-ed1-f67.google.com ([209.85.208.67]:41753) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1orMIo-0005t2-41; Sat, 05 Nov 2022 12:45:51 -0400 Received: by mail-ed1-f67.google.com with SMTP id v17so11705237edc.8; Sat, 05 Nov 2022 09:45:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:cc:to:from:subject:message-id:from:to:cc:subject :date:message-id:reply-to; bh=7M8NKLQ7w9K+f/nHYZ/0zOrlPTS/APgA5uhTucjTY6Q=; b=cFiIJTlq6UYdp2LT4sszSRU68f+qG3D4oI2SX7NdYgTD1sZBhflPgVg9fyN/TC9bwg ME4gsTvWh7mqyZEf1WGEP7CTS2poQiQlJ4rwws+jTWg27CMw8KuadtiEhQ627hMPTPGR a7E4SgoZyGlTrUOIQaAX62A4ve4tlGLsU3wfD1Dk4zlr+ChUG+/xEiaaNIIuL7jq4fZa WxGOBkhEffswCiAJoDvCy+Sd+AokvlNY6id35Kd2wBumSOy00YjjSED/vZb3/znjH8DI hA7q3n2PJOXij3JFkEsnJvUeRnjzv28r8yUrigVhFntmRKD5FnyqHh6kCq69/RxrYakn rGTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:cc:to:from:subject:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=7M8NKLQ7w9K+f/nHYZ/0zOrlPTS/APgA5uhTucjTY6Q=; b=Dc2RW5at0tnP3SEUxu9eIMNeJ6fZHqLWW6UoInTwkTJCyfSTB4/rxu6EIzR2oso26y G7XPYtI8KxIAzLgL0x8zMi7EY7gHk51yeSShrMfX4d7UMNkvyV2zfqwaVWCtzc8Kq5Ik n4g8W9mPj0UbzVF02VAOHnYc8pcNAXNixUt6iNlx4ZWxRDEbT6B5p/75Z4vItQ32Db7w ZAKum4f9UC6NqCkElSAnUZibMjyF4tw+XRnrDO6cnwhsu9tyhvJ8V9jH3G540FQplYTP y8alGK7ZTOnvVjsLSB68tez2PTyPcrdi7p/Bu9MvWkwnR3ksH8zZ01oHqcScutHWgikc Q83A== X-Gm-Message-State: ACrzQf3ki8c+TAQZgJzonNSoW21v2Y+zAYfJkfbzjTLFPHHCViSis/E3 77bkgtQCFo/Z8TB27yPguGA= X-Google-Smtp-Source: AMsMyM6fznyWelwnRDSv09cpDIfJpDIPLGp+MhnI4Mk0AtQTLz0uVivjkWpH7mhiA4PhwRmMbnEsGQ== X-Received: by 2002:a05:6402:501b:b0:459:df91:983 with SMTP id p27-20020a056402501b00b00459df910983mr39804883eda.85.1667666743648; Sat, 05 Nov 2022 09:45:43 -0700 (PDT) Received: from lumine.fritz.box (85-127-52-93.dsl.dynamic.surfer.at. [85.127.52.93]) by smtp.gmail.com with ESMTPSA id se19-20020a170906ce5300b0078194737761sm1083686ejb.124.2022.11.05.09.45.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 05 Nov 2022 09:45:43 -0700 (PDT) Message-ID: From: Liliana Marie Prikler Date: Sat, 05 Nov 2022 17:45:41 +0100 In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 User-Agent: Evolution 3.46.0 MIME-Version: 1.0 X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) bWVyZ2UgNTkwNTMgNDk4OTgKdGhhbmtzCgpIaSBIaWx0b24sCgp0aGFua3MgZm9yIHRoZSByZW5l d2VkIGludGVyZXN0IGluIHNwZWN0cmUtbWVsdGRvd24tY2hlY2tlci4gIFNlZSB0aGUKb3RoZXIg dGhyZWFkIGZvciBhIGdlbmVyYWwgZGlzY3Vzc2lvbiwgYnV0IEknbGwgcmVwZWF0IHRoZSBtb3N0 CmltcG9ydGFudCBwb2ludHMuCgpBbSBTYW1zdGFnLCBkZW0gMDUuMTEuMjAyMiB1bSAyMzo1NyAr MDgwMCBzY2hyaWViIEhpbHRvbiBDaGFpbjoKPiAqIGdudS9wYWNrYWdlcy9wYXRjaGVzL3NwZWN0 cmUtbWVsdGRvd24tY2hlY2tlci1zdXBwb3J0LWd1aXgtc3lzdGVtLQo+IGtlcm5lbC5wYXRjaDog TmV3IGZpbGUuCj4gKiBnbnUvcGFja2FnZXMvbGludXguc2NtIChzcGVjdHJlLW1lbHRkb3duLWNo ZWNrZXIpOiBOZXcgdmFyaWFibGUuCj4gKiBnbnUvbG9jYWwubWsgKGRpc3RfcGF0Y2hfREFUQSk6 IEFkZCBpdC4KTm90ZSB0aGF0ICJBZGQgaXQiIGxvc3QgaXRzIGNvbnRleHQgYmVjYXVzZSB0aGUg bmV3IHZhcmlhYmxlIGlzIGJldHdlZW4KaXQgYW5kIHRoZSBmaWxlIGFkZGVkLgo+IC0tLQo+IMKg Z251L2xvY2FsLm1rwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzCoCAxICsKPiDCoGdudS9wYWNrYWdlcy9saW51eC5zY23C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwgNDEKPiArKysr KysrKysrKysrKysrKysrCj4gwqAuLi5uLWNoZWNrZXItc3VwcG9ydC1ndWl4LXN5c3RlbS1rZXJu ZWwucGF0Y2ggfCAyNiArKysrKysrKysrKysKPiDCoDMgZmlsZXMgY2hhbmdlZCwgNjggaW5zZXJ0 aW9ucygrKQo+IMKgY3JlYXRlIG1vZGUgMTAwNjQ0IGdudS9wYWNrYWdlcy9wYXRjaGVzL3NwZWN0 cmUtbWVsdGRvd24tY2hlY2tlci0KPiBzdXBwb3J0LWd1aXgtc3lzdGVtLWtlcm5lbC5wYXRjaAo+ IAo+IGRpZmYgLS1naXQgYS9nbnUvbG9jYWwubWsgYi9nbnUvbG9jYWwubWsKPiBpbmRleCBlYjZh YzNkZjU4Li44OGMxZmE2Mjc4IDEwMDY0NAo+IC0tLSBhL2dudS9sb2NhbC5tawo+ICsrKyBiL2du dS9sb2NhbC5tawo+IEBAIC0xODQ4LDYgKzE4NDgsNyBAQCBkaXN0X3BhdGNoX0RBVEEKPiA9wqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiDCoMKgICVEJS9wYWNrYWdlcy9wYXRjaGVzL3N5c2xp bnV4LXN0cmlwLWdudS1wcm9wZXJ0eS5wYXRjaMKgwqDCoMKgwqDCoMKgXAo+IMKgwqAgJUQlL3Bh Y2thZ2VzL3BhdGNoZXMvc25hcHB5LWFkZC1PMi1mbGFnLWluLQo+IENtYWtlTGlzdHMudHh0LnBh dGNowqDCoMKgwqDCoMKgXAo+IMKgwqAgJUQlL3BhY2thZ2VzL3BhdGNoZXMvc25hcHB5LWFkZC1p bmxpbmUtZm9yLUdDQy5wYXRjaMKgwqDCoMKgwqDCoMKgwqDCoFwKPiArwqAgJUQlL3BhY2thZ2Vz L3BhdGNoZXMvc3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyLXN1cHBvcnQtZ3VpeC1zeXN0ZW0tCj4g a2VybmVsLnBhdGNoIFwKPiDCoMKgICVEJS9wYWNrYWdlcy9wYXRjaGVzL3NwaGlueGJhc2UtZml4 LWRveHlnZW4ucGF0Y2jCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBcCj4gwqDCoCAlRCUvcGFja2Fn ZXMvcGF0Y2hlcy9zcGljZS12ZGFnZW50LWdsaWItMi42OC5wYXRjaMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBcCj4gwqDCoCAlRCUvcGFja2FnZXMvcGF0Y2hlcy9zc3NkLW9wdGlvbmFsLXN5c3RlbWQu cGF0Y2jCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiBkaWZmIC0tZ2l0IGEvZ251L3BhY2th Z2VzL2xpbnV4LnNjbSBiL2dudS9wYWNrYWdlcy9saW51eC5zY20KPiBpbmRleCBjZjExYTdmYzFi Li5kYjE5OTg2OWE3IDEwMDY0NAo+IC0tLSBhL2dudS9wYWNrYWdlcy9saW51eC5zY20KPiArKysg Yi9nbnUvcGFja2FnZXMvbGludXguc2NtCj4gQEAgLTk1MTIsMyArOTUxMiw0NCBAQCAoZGVmaW5l LXB1YmxpYyB0cC1zbWFwaS1tb2R1bGUKPiDCoEBhY3Jvbnlte1NNQVBJLCBTeXN0ZW0gTWFuYWdl bWVudCBBcHBsaWNhdGlvbiBQcm9ncmFtIEludGVyZmFjZX0gYW5kCj4gZGlyZWN0Cj4gwqBhY2Nl c3MgdG8gdGhlIGVtYmVkZGVkIGNvbnRyb2xsZXIuIikKPiDCoMKgwqDCoCAobGljZW5zZSBsaWNl bnNlOmdwbDIrKSkpCj4gKwo+ICsoZGVmaW5lLXB1YmxpYyBzcGVjdHJlLW1lbHRkb3duLWNoZWNr ZXIKPiArwqAgKHBhY2thZ2UKPiArwqDCoMKgIChuYW1lICJzcGVjdHJlLW1lbHRkb3duLWNoZWNr ZXIiKQo+ICvCoMKgwqAgKHZlcnNpb24gIjAuNDUiKQo+ICvCoMKgwqAgKHNvdXJjZSAob3JpZ2lu Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChtZXRob2QgZ2l0LWZldGNoKQo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAodXJpIChnaXQtcmVmZXJlbmNlCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICh1cmwKPiAiaHR0cHM6Ly9naXRodWIuY29tL3Nw ZWVkNDcvc3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyIikKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgKGNvbW1pdCAoc3RyaW5nLWFwcGVuZCAidiIgdmVyc2lvbikpKSkK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGZpbGUtbmFtZSAoZ2l0LWZpbGUtbmFtZSBu YW1lIHZlcnNpb24pKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAocGF0Y2hlcwo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChzZWFyY2gtcGF0Y2hlcwo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsKPiBodHRwczovL2dpdGh1Yi5jb20vc3BlZWQ0Ny9zcGVj dHJlLW1lbHRkb3duLWNoZWNrZXIvcHVsbC80NDEKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgICJzcGVjdHJlLW1lbHRkb3duLWNoZWNrZXItc3VwcG9ydC1ndWl4LXN5c3RlbS0KPiBr ZXJuZWwucGF0Y2giKSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHNoYTI1Ngo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChiYXNlMzIKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgCj4gIjF4eDhoNTc5MWxoYzJ4dzBkY2J6amtrbHp2bHh3eGtqemg4ZGk0Zzhk aXZmeTI0ZnFzbjgiKSkpKQo+ICvCoMKgwqAgKGJ1aWxkLXN5c3RlbSBjb3B5LWJ1aWxkLXN5c3Rl bSkKPiArwqDCoMKgIChhcmd1bWVudHMKPiArwqDCoMKgwqAgKGxpc3QgIzppbnN0YWxsLXBsYW4K PiArwqDCoMKgwqDCoMKgwqDCoMKgwqAgI34nKCgic3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyLnNo IiAiYmluL3NwZWN0cmUtbWVsdGRvd24tCj4gY2hlY2tlciIpKQo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoCAjOnBoYXNlcwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoCAjfihtb2RpZnktcGhhc2VzICVz dGFuZGFyZC1waGFzZXMKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoYWRkLWFmdGVy ICd1bnBhY2sgJ2ZpeHBhdGgKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGxh bWJkYSogKCM6a2V5IGlucHV0cyAjOmFsbG93LW90aGVyLWtleXMpCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoc3Vic3RpdHV0ZSogInNwZWN0cmUtbWVsdGRvd24tY2hl Y2tlci5zaCIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoKCJc XCRcXHtvcHRfYXJjaF9wcmVmaXhcXH1yZWFkZWxmIikKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIChzZWFyY2gtaW5wdXQtZmlsZSBpbnB1dHMgIi9iaW4vcmVh ZGVsZiIpKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICgoInBl cmwiKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHNlYXJj aC1pbnB1dC1maWxlIGlucHV0cyAiL2Jpbi9wZXJsIikpKSkpKSkpCkknbSBwcmV0dHkgc3VyZSBy ZWFkZWxmIGFuZCBwZXJsIGFyZSBub3QgdGhlIG9ubHkgY29tbWFuZHMgaW52b2tlZC4KCgo+ICvC oMKgwqAgKGlucHV0cyAobGlzdCBiaW51dGlscyBwZXJsKSkKPiArwqDCoMKgIChob21lLXBhZ2UK PiAiaHR0cHM6Ly9naXRodWIuY29tL3NwZWVkNDcvc3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyIikK PiArwqDCoMKgIChzeW5vcHNpcwo+ICvCoMKgwqDCoCAiU3BlY3RyZSwgTWVsdGRvd24sIEZvcmVz aGFkb3csIEZhbGxvdXQsIFJJREwsIFpvbWJpZUxvYWQKPiB2dWxuZXJhYmlsaXR5IC8KPiArbWl0 aWdhdGlvbiBjaGVja2VyIGZvciBMaW51eCAmIEJTRCIpCiJmb3IgTGludXggJiBCU0QiIGlzIGdy YXR1aXRvdXMgaW5mb3JtYXRpb24gaW1oby4KQXMgZm9yIHRoZSB2dWxuZXJhYmlsaXRpZXMgbGlz dGVkIGluIHRoZSBzeW5vcHNpcyBzdXJlbHkgdGhlcmUgbXVzdCBiZQphIHdheSBvZiBzaG9ydGVu aW5nIHRoYXQuCj4gK8KgwqDCoCAoZGVzY3JpcHRpb24KPiArwqDCoMKgwqAgIkEgc2hlbGwgc2Ny aXB0IHRvIGFzc2VzcyB5b3VyIHN5c3RlbSdzIHJlc2lsaWVuY2UgYWdhaW5zdCB0aGUKPiBzZXZl cmFsCj4gK3RyYW5zaWVudCBleGVjdXRpb24gQ1ZFcyB0aGF0IHdlcmUgcHVibGlzaGVkIHNpbmNl IGVhcmx5IDIwMTgsIGFuZAo+IGdpdmUgeW91Cj4gK2d1aWRhbmNlIGFzIHRvIGhvdyB0byBtaXRp Z2F0ZSB0aGVtLiIpCk5vdCBhIGZ1bGwgc2VudGVuY2UuCj4gK8KgwqDCoCAobGljZW5zZSBsaWNl bnNlOmdwbDMpKSkKPiBkaWZmIC0tZ2l0IGEvZ251L3BhY2thZ2VzL3BhdGNoZXMvc3BlY3RyZS1t ZWx0ZG93bi1jaGVja2VyLXN1cHBvcnQtCj4gZ3VpeC1zeXN0ZW0ta2VybmVsLnBhdGNoIGIvZ251 L3BhY2thZ2VzL3BhdGNoZXMvc3BlY3RyZS1tZWx0ZG93bi0KPiBjaGVja2VyLXN1cHBvcnQtZ3Vp eC1zeXN0ZW0ta2VybmVsLnBhdGNoCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAw MDAwMDAwLi5hZmVjNTJiNDE4Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2dudS9wYWNrYWdlcy9w YXRjaGVzL3NwZWN0cmUtbWVsdGRvd24tY2hlY2tlci1zdXBwb3J0LWd1aXgtCj4gc3lzdGVtLWtl cm5lbC5wYXRjaAo+IEBAIC0wLDAgKzEsMjYgQEAKPiArRnJvbSA1Yjc1N2Q5MzBlYzBjZjEwMmIw M2ZiOTgxN2QxN2UwNmM3MmU3NGIzIE1vbiBTZXAgMTcgMDA6MDA6MDAKPiAyMDAxCj4gK0Zyb206 IEhpbHRvbiBDaGFpbiA8aGFrb0B1bHRyYXJhcmUuc3BhY2U+Cj4gK0RhdGU6IFNhdCwgNSBOb3Yg MjAyMiAyMzoyMjozMSArMDgwMAo+ICtTdWJqZWN0OiBbUEFUQ0hdIEFkZCBzdXBwb3J0IGZvciBH dWl4IFN5c3RlbSBrZXJuZWwuCj4gKwo+ICstLS0KPiArIHNwZWN0cmUtbWVsdGRvd24tY2hlY2tl ci5zaCB8IDIgKysKPiArIDEgZmlsZSBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKykKPiArCj4gK2Rp ZmYgLS1naXQgYS9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXIuc2ggYi9zcGVjdHJlLW1lbHRkb3du LQo+IGNoZWNrZXIuc2gKPiAraW5kZXggMjQ4YTQ0NC4uODU1YTA5MCAxMDA3NTUKPiArLS0tIGEv c3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyLnNoCj4gKysrKyBiL3NwZWN0cmUtbWVsdGRvd24tY2hl Y2tlci5zaAo+ICtAQCAtMjI1MSw2ICsyMjUxLDggQEAgaWYgWyAiJG9wdF9saXZlIiA9IDEgXTsg dGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC1lICIvYm9vdC9rZXJuZWwt Z2Vua2VybmVsLSQodW5hbWUgLW0pLSQodW5hbWUgLXIpIgo+IF0gJiYgb3B0X2tlcm5lbD0iL2Jv b3Qva2VybmVsLWdlbmtlcm5lbC0kKHVuYW1lIC1tKS0kKHVuYW1lIC1yKSIKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBOaXhPUzoKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgWyAtZSAiL3J1bi9ib290ZWQtc3lzdGVtL2tlcm5lbCIgXSAmJgo+IG9wdF9rZXJuZWw9 Ii9ydW4vYm9vdGVkLXN5c3RlbS9rZXJuZWwiCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIyBHdWl4IFN5c3RlbToKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC1lICIv cnVuL2Jvb3RlZC1zeXN0ZW0va2VybmVsL2J6SW1hZ2UiIF0gJiYKPiBvcHRfa2VybmVsPSIvcnVu L2Jvb3RlZC1zeXN0ZW0va2VybmVsL2J6SW1hZ2UiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCMgc3lzdGVtZCBrZXJuZWwtaW5zdGFsbDoKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgWyAtZSAiL2V0Yy9tYWNoaW5lLWlkIiBdICYmIFsgLWUgIi9ib290LyQoY2F0Cj4g L2V0Yy9tYWNoaW5lLWlkKS8kKHVuYW1lIC1yKS9saW51eCIgXSAmJiBvcHRfa2VybmVsPSIvYm9v dC8kKGNhdAo+IC9ldGMvbWFjaGluZS1pZCkvJCh1bmFtZSAtcikvbGludXgiCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgQ2xlYXIgTGludXg6Cj4gKwo+ICtiYXNlLWNvbW1pdDog YTZjOTQzZDM4ZjMxNWYzMzk2OTdlYzI2ZTczNzRhMDliODhmMjE4Mwo+ICstLQo+ICsyLjM4LjAK PiAKPiBiYXNlLWNvbW1pdDogMjIxMWY1MGVjMWViY2Y1Zjg4MDQ1NGI0MTMzYWM0MGU0MWFiYWMy MQpUaGlzIHBhdGNoIExHVE0uCgpOb3RlIHRoYXQgYXMgZGlzY3Vzc2VkIGluIHRoZSBvdGhlciB0 aHJlYWQsIHdlJ2QgYWxzbyB3YW50IHRoZSBjaGVja2VyCnRvIG5vdCBkb3dubG9hZCBwcm9wcmll dGFyeSBmaXJtd2FyZS4gIENvdWxkIHlvdSBhZGp1c3QgdGhlIHBhY2thZ2UKYWNjb3JkaW5nbHk/ CgpDaGVlcnMKCg== From debbugs-submit-bounces@debbugs.gnu.org Sun Nov 06 09:20:31 2022 Received: (at control) by debbugs.gnu.org; 6 Nov 2022 14:20:31 +0000 Received: from localhost ([127.0.0.1]:59056 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1orgVj-0001RC-Lj for submit@debbugs.gnu.org; Sun, 06 Nov 2022 09:20:31 -0500 Received: from mira.cbaines.net ([212.71.252.8]:41784) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1orgVi-0001R5-8n for control@debbugs.gnu.org; Sun, 06 Nov 2022 09:20:30 -0500 Received: from localhost (host-82-184-251-30.business.telecomitalia.it [82.184.251.30]) by mira.cbaines.net (Postfix) with ESMTPSA id 61C8127BBE9 for ; Sun, 6 Nov 2022 14:20:29 +0000 (GMT) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id 96dc263e for ; Sun, 6 Nov 2022 14:20:28 +0000 (UTC) From: Christopher Baines To: control@debbugs.gnu.org Subject: tag 59053 moreinfo Date: Sun, 06 Nov 2022 14:20:28 +0000 Message-ID: <87y1sow4er.fsf@cbaines.net> MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) tags 59053 + moreinfo quit From unknown Sun Jun 22 11:49:37 2025 X-Loop: help-debbugs@gnu.org Subject: [bug#59053] [PATCH v2] gnu: Add spectre-meltdown-checker. Resent-From: Hilton Chain Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Fri, 11 Nov 2022 11:12:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 59053 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: moreinfo patch To: Liliana Marie Prikler Cc: control@debbugs.gnu.org, 59053@debbugs.gnu.org Received: via spool by 59053-submit@debbugs.gnu.org id=B59053.166816508323223 (code B ref 59053); Fri, 11 Nov 2022 11:12:02 +0000 Received: (at 59053) by debbugs.gnu.org; 11 Nov 2022 11:11:23 +0000 Received: from localhost ([127.0.0.1]:45178 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1otRwQ-00062V-VS for submit@debbugs.gnu.org; Fri, 11 Nov 2022 06:11:23 -0500 Received: from mail.boiledscript.com ([144.168.59.46]:36010) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1otRwO-00062F-TZ; Fri, 11 Nov 2022 06:11:21 -0500 Date: Fri, 11 Nov 2022 19:10:33 +0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ultrarare.space; s=dkim; t=1668165072; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Cs7GcIb9dCnSYExoLwQLDqZyvx0fLsp1xY80LCxOqKU=; b=kCQcoRT1n3kY0v8QEkcoGJKRdLN4alhsVHbHZS85OUhPfgckMbtHJTeKNkQyPrKRRvCZaM VJyxg++CoRjSXikLqWMgjboJL6Zxig8rEPlqGGyvg3oXZT/OHIQOtqjCCoNuu1MyYFk7Zc /oBo3ODW/w6BX76KX33Uafdr0jDzgWYIOU5s4/tpnYKg2I0Esg0dSn/fyS7XZ7c5Z+2W1D 3R4mXNT7MDPfmyQi+ZAZ/G8HhwOQhkvftwba3UK1LG/vaOdWXQWR4WKb436HavFuO7KO9X qxR9tFUtHfYVKH2tlM0y6zdnfk58Kf1yMmojwXmCpb1S3mAOG3pVhqznrBKdxQ== Message-ID: From: Hilton Chain In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 8bit X-Spamd-Bar: / Authentication-Results: mail.boiledscript.com; auth=pass smtp.mailfrom=hako@ultrarare.space X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" * gnu/packages/linux.scm (spectre-meltdown-checker): New variable. * gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch: New file. * gnu/packages/patches/spectre-meltdown-checker-stage-commands-for-substitution.patch: New file. * gnu/packages/patches/spectre-meltdown-checker-remove-builtin-firmware-database.patch: New file. * gnu/local.mk (dist_patch_DATA): Add patches. --- v1 -> v2: gnu/local.mk | 3 + gnu/packages/linux.scm | 53 + ...ker-remove-builtin-firmware-database.patch | 554 +++++ ...cker-stage-commands-for-substitution.patch | 1947 +++++++++++++++++ ...n-checker-support-guix-system-kernel.patch | 26 + 5 files changed, 2583 insertions(+) create mode 100644 gnu/packages/patches/spectre-meltdown-checker-remove-builtin-firmware-database.patch create mode 100644 gnu/packages/patches/spectre-meltdown-checker-stage-commands-for-substitution.patch create mode 100644 gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch diff --git a/gnu/local.mk b/gnu/local.mk index 27b31ea27f..d518cd8641 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -1851,6 +1851,9 @@ dist_patch_DATA = \ %D%/packages/patches/syslinux-strip-gnu-property.patch \ %D%/packages/patches/snappy-add-O2-flag-in-CmakeLists.txt.patch \ %D%/packages/patches/snappy-add-inline-for-GCC.patch \ + %D%/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch \ + %D%/packages/patches/spectre-meltdown-checker-stage-commands-for-substitution.patch \ + %D%/packages/patches/spectre-meltdown-checker-remove-builtin-firmware-database.patch \ %D%/packages/patches/sphinxbase-fix-doxygen.patch \ %D%/packages/patches/spice-vdagent-glib-2.68.patch \ %D%/packages/patches/sssd-optional-systemd.patch \ diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index 2c06269504..5a0d55833a 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -9595,3 +9595,56 @@ (define-public edac-utils error detection and correction (EDAC).") (home-page "https://github.com/grondo/edac-utils") (license license:gpl2+))) + +(define-public spectre-meltdown-checker + (package + (name "spectre-meltdown-checker") + (version "0.45") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/speed47/spectre-meltdown-checker") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (patches + (search-patches + ;; https://github.com/speed47/spectre-meltdown-checker/pull/441 + "spectre-meltdown-checker-support-guix-system-kernel.patch" + ;; NOTE: Update these patches when updating. + "spectre-meltdown-checker-stage-commands-for-substitution.patch" + "spectre-meltdown-checker-remove-builtin-firmware-database.patch")) + (sha256 + (base32 + "1xx8h5791lhc2xw0dcbzjkklzvlxwxkjzh8di4g8divfy24fqsn8")))) + (build-system copy-build-system) + (arguments + (list #:install-plan + #~'(("spectre-meltdown-checker.sh" "bin/spectre-meltdown-checker")) + #:phases + #~(modify-phases %standard-phases + (add-after 'unpack 'fixpath + (lambda* (#:key inputs #:allow-other-keys) + (substitute* "spectre-meltdown-checker.sh" + (("@sysctl@") (search-input-file inputs "/sbin/sysctl")) + (("@([a-z0-9]*)@" _ m _) + (search-input-file inputs (string-append "/bin/" m))))))))) + (inputs + (list binutils + coreutils + grep + kmod + lz4 + lzop + perl + procps + sharutils + util-linux + which + zstd)) + (home-page "https://github.com/speed47/spectre-meltdown-checker") + (synopsis "CPU vulnerability / mitigation checker") + (description + "This package provides a shell script to assess your system's resilience +against the several transient execution CVEs that were published since early +2018, and give you guidance as to how to mitigate them.") + (license license:gpl3))) diff --git a/gnu/packages/patches/spectre-meltdown-checker-remove-builtin-firmware-database.patch b/gnu/packages/patches/spectre-meltdown-checker-remove-builtin-firmware-database.patch new file mode 100644 index 0000000000..e926551550 --- /dev/null +++ b/gnu/packages/patches/spectre-meltdown-checker-remove-builtin-firmware-database.patch @@ -0,0 +1,554 @@ +From ac4bb2e61e4e8d195d560014816e107b315817ff Mon Sep 17 00:00:00 2001 +From: Hilton Chain +Date: Fri, 11 Nov 2022 18:55:25 +0800 +Subject: [PATCH 2/2] Remove builtin firmware database. + +--- + spectre-meltdown-checker.sh | 477 ++---------------------------------- + 1 file changed, 27 insertions(+), 450 deletions(-) + +diff --git a/spectre-meltdown-checker.sh b/spectre-meltdown-checker.sh +index 82cf1b6..79c4bb7 100755 +--- a/spectre-meltdown-checker.sh ++++ b/spectre-meltdown-checker.sh +@@ -95,7 +95,6 @@ show_usage() + --cpu [#,all] interact with CPUID and MSR of CPU core number #, or all (default: CPU core 0) + --update-fwdb update our local copy of the CPU microcodes versions database (using the awesome + MCExtractor project and the Intel firmwares GitHub repository) +- --update-builtin-fwdb same as --update-fwdb but update builtin DB inside the script itself + --dump-mock-data used to mimick a CPU on an other system, mainly used to help debugging this script + + Return codes: +@@ -853,9 +852,9 @@ update_fwdb() + mcedb_tmp="$(@mktemp@ -t smc-mcedb-XXXXXX)" + mcedb_url='https://github.com/platomav/MCExtractor/raw/master/MCE.db' + _info_nol "Fetching MCE.db from the MCExtractor project... " +- if command -v wget >/dev/null 2>&1; then +- wget -q "$mcedb_url" -O "$mcedb_tmp"; ret=$? +- elif command -v curl >/dev/null 2>&1; then ++ # if command -v wget >/dev/null 2>&1; then ++ # wget -q "$mcedb_url" -O "$mcedb_tmp"; ret=$? ++ if command -v curl >/dev/null 2>&1; then + curl -sL "$mcedb_url" -o "$mcedb_tmp"; ret=$? + elif command -v fetch >/dev/null 2>&1; then + fetch -q "$mcedb_url" -o "$mcedb_tmp"; ret=$? +@@ -874,9 +873,9 @@ update_fwdb() + intel_url="https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files/archive/main.zip" + _info_nol "Fetching Intel firmwares... " + ## https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files.git +- if command -v wget >/dev/null 2>&1; then +- wget -q "$intel_url" -O "$intel_tmp/fw.zip"; ret=$? +- elif command -v curl >/dev/null 2>&1; then ++ # if command -v wget >/dev/null 2>&1; then ++ # wget -q "$intel_url" -O "$intel_tmp/fw.zip"; ret=$? ++ if command -v curl >/dev/null 2>&1; then + curl -sL "$intel_url" -o "$intel_tmp/fw.zip"; ret=$? + elif command -v fetch >/dev/null 2>&1; then + fetch -q "$intel_url" -o "$intel_tmp/fw.zip"; ret=$? +@@ -969,13 +968,13 @@ update_fwdb() + } > "$mcedb_cache" + echo DONE "(version $dbversion)" + +- if [ "$1" = builtin ]; then +- newfile=$(@mktemp@ -t smc-builtin-XXXXXX) +- @awk@ '/^# %%% MCEDB / { exit }; { print }' "$0" > "$newfile" +- @awk@ '{ if (NR>1) { print } }' "$mcedb_cache" >> "$newfile" +- @cat@ "$newfile" > "$0" +- @rm@ -f "$newfile" +- fi ++ # if [ "$1" = builtin ]; then ++ # newfile=$(@mktemp@ -t smc-builtin-XXXXXX) ++ # @awk@ '/^# %%% MCEDB / { exit }; { print }' "$0" > "$newfile" ++ # @awk@ '{ if (NR>1) { print } }' "$mcedb_cache" >> "$newfile" ++ # @cat@ "$newfile" > "$0" ++ # @rm@ -f "$newfile" ++ # fi + } + + parse_opt_file() +@@ -1070,9 +1069,9 @@ while [ -n "${1:-}" ]; do + elif [ "$1" = "--update-fwdb" ] || [ "$1" = "--update-mcedb" ]; then + update_fwdb + exit $? +- elif [ "$1" = "--update-builtin-fwdb" ] || [ "$1" = "--update-builtin-mcedb" ]; then +- update_fwdb builtin +- exit $? ++ # elif [ "$1" = "--update-builtin-fwdb" ] || [ "$1" = "--update-builtin-mcedb" ]; then ++ # update_fwdb builtin ++ # exit $? + elif [ "$1" = "--dump-mock-data" ]; then + opt_mock=1 + shift +@@ -2033,22 +2032,22 @@ is_xen_domU() + fi + } + +-builtin_dbversion=$(@awk@ '/^# %%% MCEDB / { print $4 }' "$0") ++# builtin_dbversion=$(@awk@ '/^# %%% MCEDB / { print $4 }' "$0") + if [ -r "$mcedb_cache" ]; then + # we have a local cache file, but it might be older than the builtin version we have + local_dbversion=$( @awk@ '/^# %%% MCEDB / { print $4 }' "$mcedb_cache") + # sort -V sorts by version number +- older_dbversion=$(printf "%b\n%b" "$local_dbversion" "$builtin_dbversion" | @sort@ -V | @head@ -n1) +- if [ "$older_dbversion" = "$builtin_dbversion" ]; then ++ # older_dbversion=$(printf "%b\n%b" "$local_dbversion" "$builtin_dbversion" | @sort@ -V | @head@ -n1) ++ # if [ "$older_dbversion" = "$builtin_dbversion" ]; then + mcedb_source="$mcedb_cache" + mcedb_info="local firmwares DB $local_dbversion" +- fi ++ # fi + fi + # if mcedb_source is not set, either we don't have a local cached db, or it is older than the builtin db +-if [ -z "${mcedb_source:-}" ]; then +- mcedb_source="$0" +- mcedb_info="builtin firmwares DB $builtin_dbversion" +-fi ++# if [ -z "${mcedb_source:-}" ]; then ++# mcedb_source="$0" ++# mcedb_info="builtin firmwares DB $builtin_dbversion" ++# fi + read_mcedb() + { + @awk@ '{ if (DELIM==1) { print $2 } } /^# %%% MCEDB / { DELIM=1 }' "$mcedb_source" +@@ -2070,6 +2069,9 @@ is_latest_known_ucode() + else + return 2 + fi ++ if [ -z "$mcedb_source" ]; then ++ return 2 ++ fi + for tuple in $(read_mcedb | @grep@ "$(printf "^$cpu_brand_prefix,0x%08X," "$cpu_cpuid")") + do + ucode=$(( $(echo "$tuple" | @cut@ -d, -f3) )) +@@ -5833,428 +5835,3 @@ fi + [ "$global_critical" = 1 ] && exit 2 # critical + [ "$global_unknown" = 1 ] && exit 3 # unknown + exit 0 # ok +- +-# We're using MCE.db from the excellent platomav's MCExtractor project +-# The builtin version follows, but the user can download an up-to-date copy (to be stored in his $HOME) by using --update-fwdb +-# To update the builtin version itself (by *modifying* this very file), use --update-builtin-fwdb +- +-# %%% MCEDB v222+i20220208 +-# I,0x00000611,0x00000B27,19961218 +-# I,0x00000612,0x000000C6,19961210 +-# I,0x00000616,0x000000C6,19961210 +-# I,0x00000617,0x000000C6,19961210 +-# I,0x00000619,0x000000D2,19980218 +-# I,0x00000630,0x00000013,19960827 +-# I,0x00000632,0x00000020,19960903 +-# I,0x00000633,0x00000036,19980923 +-# I,0x00000634,0x00000037,19980923 +-# I,0x00000650,0x00000045,19990525 +-# I,0x00000651,0x00000042,19990525 +-# I,0x00000652,0x0000002D,19990518 +-# I,0x00000653,0x00000010,19990628 +-# I,0x00000660,0x0000000A,19990505 +-# I,0x00000665,0x00000003,19990505 +-# I,0x0000066A,0x0000000D,19990505 +-# I,0x0000066D,0x00000007,19990505 +-# I,0x00000670,0x00000007,19980602 +-# I,0x00000671,0x00000014,19980811 +-# I,0x00000672,0x00000038,19990922 +-# I,0x00000673,0x0000002E,19990910 +-# I,0x00000680,0x00000017,19990610 +-# I,0x00000681,0x00000014,19991209 +-# I,0x00000683,0x00000014,20010206 +-# I,0x00000686,0x00000008,20000505 +-# I,0x0000068A,0x00000005,20001207 +-# I,0x00000690,0x00000004,20000206 +-# I,0x00000691,0x00000001,20020527 +-# I,0x00000692,0x00000001,20020620 +-# I,0x00000694,0x00000002,20020926 +-# I,0x00000695,0x00000047,20041109 +-# I,0x00000696,0x00000001,20000707 +-# I,0x000006A0,0x00000003,20000110 +-# I,0x000006A1,0x00000001,20000306 +-# I,0x000006A4,0x00000001,20000616 +-# I,0x000006B0,0x0000001A,20010129 +-# I,0x000006B1,0x0000001D,20010220 +-# I,0x000006B4,0x00000002,20020111 +-# I,0x000006D0,0x00000006,20030522 +-# I,0x000006D1,0x00000009,20030709 +-# I,0x000006D2,0x00000010,20030814 +-# I,0x000006D6,0x00000018,20041017 +-# I,0x000006D8,0x00000021,20060831 +-# I,0x000006E0,0x00000008,20050215 +-# I,0x000006E1,0x0000000C,20050413 +-# I,0x000006E4,0x00000026,20050816 +-# I,0x000006E8,0x0000003C,20060208 +-# I,0x000006EC,0x0000005B,20070208 +-# I,0x000006F0,0x00000005,20050818 +-# I,0x000006F1,0x00000012,20051129 +-# I,0x000006F2,0x0000005D,20101002 +-# I,0x000006F4,0x00000028,20060417 +-# I,0x000006F5,0x00000039,20060727 +-# I,0x000006F6,0x000000D2,20101001 +-# I,0x000006F7,0x0000006B,20101002 +-# I,0x000006F9,0x00000084,20061012 +-# I,0x000006FA,0x00000095,20101002 +-# I,0x000006FB,0x000000C1,20111004 +-# I,0x000006FD,0x000000A4,20101002 +-# I,0x00000F00,0xFFFF0001,20000130 +-# I,0x00000F01,0xFFFF0007,20000404 +-# I,0x00000F02,0xFFFF000B,20000518 +-# I,0x00000F03,0xFFFF0001,20000518 +-# I,0x00000F04,0xFFFF0010,20000803 +-# I,0x00000F05,0x0000000C,20000824 +-# I,0x00000F06,0x00000004,20000911 +-# I,0x00000F07,0x00000012,20020716 +-# I,0x00000F08,0x00000008,20001101 +-# I,0x00000F09,0x00000008,20010104 +-# I,0x00000F0A,0x00000015,20020821 +-# I,0x00000F11,0x0000000A,20030729 +-# I,0x00000F12,0x0000002F,20030502 +-# I,0x00000F13,0x00000005,20030508 +-# I,0x00000F20,0x00000001,20010423 +-# I,0x00000F21,0x00000003,20010529 +-# I,0x00000F22,0x00000005,20030729 +-# I,0x00000F23,0x0000000D,20010817 +-# I,0x00000F24,0x00000021,20030610 +-# I,0x00000F25,0x0000002C,20040826 +-# I,0x00000F26,0x00000010,20040805 +-# I,0x00000F27,0x00000039,20030604 +-# I,0x00000F29,0x0000002F,20040811 +-# I,0x00000F30,0x00000013,20030815 +-# I,0x00000F31,0x0000000B,20031021 +-# I,0x00000F32,0x0000000A,20040511 +-# I,0x00000F33,0x0000000C,20050421 +-# I,0x00000F34,0x00000017,20050421 +-# I,0x00000F36,0x00000007,20040309 +-# I,0x00000F37,0x00000003,20031218 +-# I,0x00000F40,0x00000006,20040318 +-# I,0x00000F41,0x00000017,20050422 +-# I,0x00000F42,0x00000003,20050421 +-# I,0x00000F43,0x00000005,20050421 +-# I,0x00000F44,0x00000006,20050421 +-# I,0x00000F46,0x00000004,20050411 +-# I,0x00000F47,0x00000003,20050421 +-# I,0x00000F48,0x0000000E,20080115 +-# I,0x00000F49,0x00000003,20050421 +-# I,0x00000F4A,0x00000004,20051214 +-# I,0x00000F60,0x00000005,20050124 +-# I,0x00000F61,0x00000008,20050610 +-# I,0x00000F62,0x0000000F,20051215 +-# I,0x00000F63,0x00000005,20051010 +-# I,0x00000F64,0x00000004,20051223 +-# I,0x00000F65,0x0000000B,20070510 +-# I,0x00000F66,0x0000001B,20060310 +-# I,0x00000F68,0x00000009,20060714 +-# I,0x00001632,0x00000002,19980610 +-# I,0x00010650,0x00000002,20060513 +-# I,0x00010660,0x00000004,20060612 +-# I,0x00010661,0x00000045,20101004 +-# I,0x00010670,0x00000005,20070209 +-# I,0x00010671,0x00000106,20070329 +-# I,0x00010674,0x84050100,20070726 +-# I,0x00010676,0x00000612,20150802 +-# I,0x00010677,0x0000070D,20150802 +-# I,0x0001067A,0x00000A0E,20150729 +-# I,0x000106A0,0xFFFF001A,20071128 +-# I,0x000106A1,0xFFFF000B,20080220 +-# I,0x000106A2,0xFFFF0019,20080714 +-# I,0x000106A4,0x00000013,20150630 +-# I,0x000106A5,0x0000001D,20180511 +-# I,0x000106C0,0x00000007,20070824 +-# I,0x000106C1,0x00000109,20071203 +-# I,0x000106C2,0x00000219,20090410 +-# I,0x000106C9,0x00000007,20090213 +-# I,0x000106CA,0x00000107,20090825 +-# I,0x000106D0,0x00000005,20071204 +-# I,0x000106D1,0x0000002A,20150803 +-# I,0x000106E0,0xFFFF0022,20090116 +-# I,0x000106E1,0xFFFF000D,20090206 +-# I,0x000106E2,0xFFFF0011,20090924 +-# I,0x000106E3,0xFFFF0011,20090512 +-# I,0x000106E4,0x00000003,20130701 +-# I,0x000106E5,0x0000000A,20180508 +-# I,0x000106F0,0xFFFF0009,20090210 +-# I,0x000106F1,0xFFFF0007,20090210 +-# I,0x00020650,0xFFFF0008,20090218 +-# I,0x00020651,0xFFFF0018,20090818 +-# I,0x00020652,0x00000011,20180508 +-# I,0x00020654,0xFFFF0007,20091124 +-# I,0x00020655,0x00000007,20180423 +-# I,0x00020661,0x00000105,20110718 +-# I,0x000206A0,0x00000029,20091102 +-# I,0x000206A1,0x00000007,20091223 +-# I,0x000206A2,0x00000027,20100502 +-# I,0x000206A3,0x00000009,20100609 +-# I,0x000206A4,0x00000022,20100414 +-# I,0x000206A5,0x00000007,20100722 +-# I,0x000206A6,0x90030028,20100924 +-# I,0x000206A7,0x0000002F,20190217 +-# I,0x000206C0,0xFFFF001C,20091214 +-# I,0x000206C1,0x00000006,20091222 +-# I,0x000206C2,0x0000001F,20180508 +-# I,0x000206D0,0x80000006,20100816 +-# I,0x000206D1,0x80000106,20101201 +-# I,0x000206D2,0xAF506958,20110714 +-# I,0x000206D3,0xAF50696A,20110816 +-# I,0x000206D5,0xAF5069E5,20120118 +-# I,0x000206D6,0x00000621,20200304 +-# I,0x000206D7,0x0000071A,20200324 +-# I,0x000206E0,0xE3493401,20090108 +-# I,0x000206E1,0xE3493402,20090224 +-# I,0x000206E2,0xFFFF0004,20081001 +-# I,0x000206E3,0xE4486547,20090701 +-# I,0x000206E4,0xFFFF0008,20090619 +-# I,0x000206E5,0xFFFF0018,20091215 +-# I,0x000206E6,0x0000000D,20180515 +-# I,0x000206F0,0x00000005,20100729 +-# I,0x000206F1,0x00000008,20101013 +-# I,0x000206F2,0x0000003B,20180516 +-# I,0x00030650,0x00000009,20120118 +-# I,0x00030651,0x00000110,20131014 +-# I,0x00030660,0x00000003,20101103 +-# I,0x00030661,0x0000010F,20150721 +-# I,0x00030669,0x0000010D,20130515 +-# I,0x00030671,0x00000117,20130410 +-# I,0x00030672,0x0000022E,20140401 +-# I,0x00030673,0x83290100,20190916 +-# I,0x00030678,0x00000838,20190422 +-# I,0x00030679,0x0000090D,20190710 +-# I,0x000306A0,0x00000007,20110407 +-# I,0x000306A2,0x0000000C,20110725 +-# I,0x000306A4,0x00000007,20110908 +-# I,0x000306A5,0x00000009,20111110 +-# I,0x000306A6,0x00000004,20111114 +-# I,0x000306A8,0x00000010,20120220 +-# I,0x000306A9,0x00000021,20190213 +-# I,0x000306C0,0xFFFF0013,20111110 +-# I,0x000306C1,0xFFFF0014,20120725 +-# I,0x000306C2,0xFFFF0006,20121017 +-# I,0x000306C3,0x00000028,20191112 +-# I,0x000306D1,0xFFFF0009,20131015 +-# I,0x000306D2,0xFFFF0009,20131219 +-# I,0x000306D3,0xE3121338,20140825 +-# I,0x000306D4,0x0000002F,20191112 +-# I,0x000306E0,0xE920080F,20121113 +-# I,0x000306E2,0xE9220827,20130523 +-# I,0x000306E3,0x00000308,20130321 +-# I,0x000306E4,0x0000042E,20190314 +-# I,0x000306E6,0x00000600,20130619 +-# I,0x000306E7,0x00000715,20190314 +-# I,0x000306F0,0xFFFF0017,20130730 +-# I,0x000306F1,0xD141D629,20140416 +-# I,0x000306F2,0x00000049,20210811 +-# I,0x000306F3,0x0000000D,20160211 +-# I,0x000306F4,0x0000001A,20210524 +-# I,0x00040650,0xFFFF000B,20121206 +-# I,0x00040651,0x00000026,20191112 +-# I,0x00040660,0xFFFF0011,20121012 +-# I,0x00040661,0x0000001C,20191112 +-# I,0x00040670,0xFFFF0006,20140304 +-# I,0x00040671,0x00000022,20191112 +-# I,0x000406A0,0x80124001,20130521 +-# I,0x000406A8,0x0000081F,20140812 +-# I,0x000406A9,0x0000081F,20140812 +-# I,0x000406C1,0x0000010B,20140814 +-# I,0x000406C2,0x00000221,20150218 +-# I,0x000406C3,0x00000368,20190423 +-# I,0x000406C4,0x00000411,20190423 +-# I,0x000406D0,0x0000000E,20130612 +-# I,0x000406D8,0x0000012D,20190916 +-# I,0x000406E1,0x00000020,20141111 +-# I,0x000406E2,0x0000002C,20150521 +-# I,0x000406E3,0x000000EC,20210428 +-# I,0x000406E8,0x00000026,20160414 +-# I,0x000406F0,0x00000014,20150702 +-# I,0x000406F1,0x0B000040,20210519 +-# I,0x00050650,0x8000002B,20160208 +-# I,0x00050651,0x8000002B,20160208 +-# I,0x00050652,0x80000037,20170502 +-# I,0x00050653,0x0100015C,20210526 +-# I,0x00050654,0x02006C0A,20210616 +-# I,0x00050655,0x03000012,20190412 +-# I,0x00050656,0x0400320A,20210813 +-# I,0x00050657,0x0500320A,20210813 +-# I,0x0005065A,0x86002302,20210416 +-# I,0x0005065B,0x07002402,20210604 +-# I,0x00050661,0xF1000008,20150130 +-# I,0x00050662,0x0000001C,20190617 +-# I,0x00050663,0x0700001C,20210612 +-# I,0x00050664,0x0F00001A,20210612 +-# I,0x00050665,0x0E000014,20210918 +-# I,0x00050670,0xFFFF0030,20151113 +-# I,0x00050671,0x000001B6,20180108 +-# I,0x000506A0,0x00000038,20150112 +-# I,0x000506C2,0x00000014,20180511 +-# I,0x000506C8,0x90011010,20160323 +-# I,0x000506C9,0x00000046,20210510 +-# I,0x000506CA,0x00000022,20210622 +-# I,0x000506D1,0x00000102,20150605 +-# I,0x000506E0,0x00000018,20141119 +-# I,0x000506E1,0x0000002A,20150602 +-# I,0x000506E2,0x0000002E,20150815 +-# I,0x000506E3,0x000000F0,20211112 +-# I,0x000506E8,0x00000034,20160710 +-# I,0x000506F0,0x00000010,20160607 +-# I,0x000506F1,0x00000036,20210510 +-# I,0x00060660,0x0000000C,20160821 +-# I,0x00060661,0x0000000E,20170128 +-# I,0x00060662,0x00000022,20171129 +-# I,0x00060663,0x0000002A,20180417 +-# I,0x000606A0,0x80000031,20200308 +-# I,0x000606A4,0x0B000280,20200817 +-# I,0x000606A5,0x0C0002F0,20210308 +-# I,0x000606A6,0x0D000332,20211217 +-# I,0x000606E0,0x0000000B,20161104 +-# I,0x000606E1,0x00000108,20190423 +-# I,0x000706A0,0x00000026,20170712 +-# I,0x000706A1,0x00000038,20210510 +-# I,0x000706A8,0x0000001C,20210510 +-# I,0x000706E0,0x0000002C,20180614 +-# I,0x000706E1,0x00000042,20190420 +-# I,0x000706E2,0x00000042,20190420 +-# I,0x000706E3,0x81000008,20181002 +-# I,0x000706E4,0x00000046,20190905 +-# I,0x000706E5,0x000000A8,20210526 +-# I,0x00080650,0x00000018,20180108 +-# I,0x00080664,0x0B00000F,20210217 +-# I,0x00080665,0x0B00000F,20210217 +-# I,0x000806A0,0x00000010,20190507 +-# I,0x000806A1,0x0000002D,20210902 +-# I,0x000806C0,0x00000068,20200402 +-# I,0x000806C1,0x0000009C,20211026 +-# I,0x000806C2,0x00000022,20210716 +-# I,0x000806D0,0x00000050,20201217 +-# I,0x000806D1,0x0000003C,20210716 +-# I,0x000806E9,0x000000EC,20210428 +-# I,0x000806EA,0x000000EC,20210428 +-# I,0x000806EB,0x000000EC,20210428 +-# I,0x000806EC,0x000000EC,20210428 +-# I,0x00090660,0x00000009,20200617 +-# I,0x00090661,0x00000015,20210921 +-# I,0x00090670,0x00000019,20201111 +-# I,0x00090671,0x0000001C,20210614 +-# I,0x00090672,0x0000001F,20220303 +-# I,0x00090674,0x00000219,20210425 +-# I,0x00090675,0x0000001F,20220303 +-# I,0x000906A0,0x0000001C,20210614 +-# I,0x000906A1,0x0000011F,20211104 +-# I,0x000906A2,0x00000315,20220102 +-# I,0x000906A3,0x0000041B,20220308 +-# I,0x000906A4,0x0000041B,20220308 +-# I,0x000906C0,0x2400001F,20210809 +-# I,0x000906E9,0x000000F0,20211112 +-# I,0x000906EA,0x000000EC,20210428 +-# I,0x000906EB,0x000000EC,20210428 +-# I,0x000906EC,0x000000EC,20210428 +-# I,0x000906ED,0x000000EC,20210428 +-# I,0x000A0650,0x000000BE,20191010 +-# I,0x000A0651,0x000000C2,20191113 +-# I,0x000A0652,0x000000EC,20210428 +-# I,0x000A0653,0x000000EC,20210428 +-# I,0x000A0654,0x000000C6,20200123 +-# I,0x000A0655,0x000000EE,20210428 +-# I,0x000A0660,0x000000EA,20210428 +-# I,0x000A0661,0x000000EC,20210429 +-# I,0x000A0670,0x0000002C,20201124 +-# I,0x000A0671,0x00000050,20210829 +-# I,0x000A0680,0x80000002,20200121 +-# I,0x000B0670,0x00000009,20211115 +-# I,0x000B06F2,0x0000001F,20220303 +-# I,0x000B06F5,0x0000001F,20220303 +-# A,0x00000F00,0x02000008,20070614 +-# A,0x00000F01,0x0000001C,20021031 +-# A,0x00000F10,0x00000003,20020325 +-# A,0x00000F11,0x0000001F,20030220 +-# A,0x00000F48,0x00000046,20040719 +-# A,0x00000F4A,0x00000047,20040719 +-# A,0x00000F50,0x00000024,20021212 +-# A,0x00000F51,0x00000025,20030115 +-# A,0x00010F50,0x00000041,20040225 +-# A,0x00020F10,0x0000004D,20050428 +-# A,0x00040F01,0xC0012102,20050916 +-# A,0x00040F0A,0x00000068,20060920 +-# A,0x00040F13,0x0000007A,20080508 +-# A,0x00040F14,0x00000062,20060127 +-# A,0x00040F1B,0x0000006D,20060920 +-# A,0x00040F33,0x0000007B,20080514 +-# A,0x00060F80,0x00000083,20060929 +-# A,0x000C0F1B,0x0000006E,20060921 +-# A,0x000F0F00,0x00000005,20020627 +-# A,0x000F0F01,0x00000015,20020627 +-# A,0x00100F00,0x01000020,20070326 +-# A,0x00100F20,0x010000CA,20100331 +-# A,0x00100F22,0x010000C9,20100331 +-# A,0x00100F40,0x01000085,20080501 +-# A,0x00100F41,0x010000DB,20111024 +-# A,0x00100F42,0x01000092,20081021 +-# A,0x00100F43,0x010000C8,20100311 +-# A,0x00100F62,0x010000C7,20100311 +-# A,0x00100F80,0x010000DA,20111024 +-# A,0x00100F81,0x010000D9,20111012 +-# A,0x00100FA0,0x010000DC,20111024 +-# A,0x00120F00,0x03000002,20100324 +-# A,0x00200F30,0x02000018,20070921 +-# A,0x00200F31,0x02000057,20080502 +-# A,0x00200F32,0x02000034,20080307 +-# A,0x00300F01,0x0300000E,20101004 +-# A,0x00300F10,0x03000027,20111309 +-# A,0x00500F00,0x0500000B,20100601 +-# A,0x00500F01,0x0500001A,20100908 +-# A,0x00500F10,0x05000029,20130121 +-# A,0x00500F20,0x05000119,20130118 +-# A,0x00580F00,0x0500000B,20100601 +-# A,0x00580F01,0x0500001A,20100908 +-# A,0x00580F10,0x05000028,20101124 +-# A,0x00580F20,0x05000103,20110526 +-# A,0x00600F00,0x06000017,20101029 +-# A,0x00600F01,0x0600011F,20110227 +-# A,0x00600F10,0x06000425,20110408 +-# A,0x00600F11,0x0600050D,20110627 +-# A,0x00600F12,0x0600063E,20180207 +-# A,0x00600F20,0x06000852,20180206 +-# A,0x00610F00,0x0600100E,20111102 +-# A,0x00610F01,0x0600111F,20180305 +-# A,0x00630F00,0x0600301C,20130817 +-# A,0x00630F01,0x06003109,20180227 +-# A,0x00660F00,0x06006012,20141014 +-# A,0x00660F01,0x0600611A,20180126 +-# A,0x00670F00,0x06006705,20180220 +-# A,0x00680F00,0x06000017,20101029 +-# A,0x00680F01,0x0600011F,20110227 +-# A,0x00680F10,0x06000410,20110314 +-# A,0x00690F00,0x06001009,20110613 +-# A,0x00700F00,0x0700002A,20121218 +-# A,0x00700F01,0x07000110,20180209 +-# A,0x00730F00,0x07030009,20131206 +-# A,0x00730F01,0x07030106,20180209 +-# A,0x00800F00,0x0800002A,20161006 +-# A,0x00800F10,0x0800100C,20170131 +-# A,0x00800F11,0x08001138,20190204 +-# A,0x00800F12,0x0800126E,20211111 +-# A,0x00800F82,0x0800820D,20190416 +-# A,0x00810F00,0x08100004,20161120 +-# A,0x00810F10,0x08101016,20190430 +-# A,0x00810F11,0x08101103,20190417 +-# A,0x00810F80,0x08108002,20180605 +-# A,0x00810F81,0x08108109,20190417 +-# A,0x00820F00,0x08200002,20180214 +-# A,0x00820F01,0x08200103,20190417 +-# A,0x00830F00,0x08300027,20190401 +-# A,0x00830F10,0x08301052,20211111 +-# A,0x00850F00,0x08500004,20180212 +-# A,0x00860F00,0x0860000E,20200127 +-# A,0x00860F01,0x08600106,20200619 +-# A,0x00860F81,0x08608103,20200702 +-# A,0x00870F00,0x08700004,20181206 +-# A,0x00870F10,0x08701021,20200125 +-# A,0x00A00F00,0x0A000033,20200413 +-# A,0x00A00F10,0x0A001053,20211217 +-# A,0x00A00F11,0x0A00115D,20211119 +-# A,0x00A00F12,0x0A001227,20211215 +-# A,0x00A00F80,0x0A008003,20211015 +-# A,0x00A00F82,0x0A008204,20211015 +-# A,0x00A20F00,0x0A200025,20200121 +-# A,0x00A20F10,0x0A201016,20210408 +-# A,0x00A20F12,0x0A201205,20210719 +-# A,0x00A50F00,0x0A50000C,20201208 +-- +2.38.1 + diff --git a/gnu/packages/patches/spectre-meltdown-checker-stage-commands-for-substitution.patch b/gnu/packages/patches/spectre-meltdown-checker-stage-commands-for-substitution.patch new file mode 100644 index 0000000000..a2f13e4195 --- /dev/null +++ b/gnu/packages/patches/spectre-meltdown-checker-stage-commands-for-substitution.patch @@ -0,0 +1,1947 @@ +From 4dc8ae01aec5a8a2aa2afc015603261d514620ae Mon Sep 17 00:00:00 2001 +From: Hilton Chain +Date: Fri, 11 Nov 2022 18:49:50 +0800 +Subject: [PATCH 1/2] Stage commands for later substitution. + +awk, base64, basename, bunzip2, cat, cut, dd, dirname, dmesg, find, getent, +grep, gunzip, gzip, head, id, lz4, lzop, mktemp, modprobe, mount, nm, +nproc, objdump, od, perl, pgrep, readelf, rm, rmmod, sed, sort, stat, +strings, sysctl, tr, umount, uname, unlzma, unxz, unzstd, uuencode, which, +whoami, xargs. +--- + spectre-meltdown-checker.sh | 648 ++++++++++++++++++------------------ + 1 file changed, 324 insertions(+), 324 deletions(-) + +diff --git a/spectre-meltdown-checker.sh b/spectre-meltdown-checker.sh +index 30f760c..82cf1b6 100755 +--- a/spectre-meltdown-checker.sh ++++ b/spectre-meltdown-checker.sh +@@ -19,33 +19,33 @@ trap '_warn "interrupted, cleaning up..."; exit_cleanup; exit 1' INT + exit_cleanup() + { + # cleanup the temp decompressed config & kernel image +- [ -n "${dumped_config:-}" ] && [ -f "$dumped_config" ] && rm -f "$dumped_config" +- [ -n "${kerneltmp:-}" ] && [ -f "$kerneltmp" ] && rm -f "$kerneltmp" +- [ -n "${kerneltmp2:-}" ] && [ -f "$kerneltmp2" ] && rm -f "$kerneltmp2" +- [ -n "${mcedb_tmp:-}" ] && [ -f "$mcedb_tmp" ] && rm -f "$mcedb_tmp" +- [ -n "${intel_tmp:-}" ] && [ -d "$intel_tmp" ] && rm -rf "$intel_tmp" +- [ "${mounted_debugfs:-}" = 1 ] && umount /sys/kernel/debug 2>/dev/null +- [ "${mounted_procfs:-}" = 1 ] && umount "$procfs" 2>/dev/null +- [ "${insmod_cpuid:-}" = 1 ] && rmmod cpuid 2>/dev/null +- [ "${insmod_msr:-}" = 1 ] && rmmod msr 2>/dev/null ++ [ -n "${dumped_config:-}" ] && [ -f "$dumped_config" ] && @rm@ -f "$dumped_config" ++ [ -n "${kerneltmp:-}" ] && [ -f "$kerneltmp" ] && @rm@ -f "$kerneltmp" ++ [ -n "${kerneltmp2:-}" ] && [ -f "$kerneltmp2" ] && @rm@ -f "$kerneltmp2" ++ [ -n "${mcedb_tmp:-}" ] && [ -f "$mcedb_tmp" ] && @rm@ -f "$mcedb_tmp" ++ [ -n "${intel_tmp:-}" ] && [ -d "$intel_tmp" ] && @rm@ -rf "$intel_tmp" ++ [ "${mounted_debugfs:-}" = 1 ] && @umount@ /sys/kernel/debug 2>/dev/null ++ [ "${mounted_procfs:-}" = 1 ] && @umount@ "$procfs" 2>/dev/null ++ [ "${insmod_cpuid:-}" = 1 ] && @rmmod@ cpuid 2>/dev/null ++ [ "${insmod_msr:-}" = 1 ] && @rmmod@ msr 2>/dev/null + [ "${kldload_cpuctl:-}" = 1 ] && kldunload cpuctl 2>/dev/null + [ "${kldload_vmm:-}" = 1 ] && kldunload vmm 2>/dev/null + } + + # if we were git clone'd, adjust VERSION +-if [ -d "$(dirname "$0")/.git" ] && command -v git >/dev/null 2>&1; then +- describe=$(git -C "$(dirname "$0")" describe --tags --dirty 2>/dev/null) +- [ -n "$describe" ] && VERSION=$(echo "$describe" | sed -e s/^v//) ++if [ -d "$(@dirname@ "$0")/.git" ] && command -v git >/dev/null 2>&1; then ++ describe=$(git -C "$(@dirname@ "$0")" describe --tags --dirty 2>/dev/null) ++ [ -n "$describe" ] && VERSION=$(echo "$describe" | @sed@ -e s/^v//) + fi + + show_usage() + { + # shellcheck disable=SC2086 +- cat <] [--config ] [--map ]> --live +- Offline mode: $(basename $0) [options] <[--kernel ] [--config ] [--map ]> ++ Live mode (auto): $(@basename@ $0) [options] ++ Live mode (manual): $(@basename@ $0) [options] <[--kernel ] [--config ] [--map ]> --live ++ Offline mode: $(@basename@ $0) [options] <[--kernel ] [--config ] [--map ]> + + Modes: + Two modes are available. +@@ -110,7 +110,7 @@ EOF + + show_disclaimer() + { +- cat < spectre 2 not affected + # https://github.com/paboldin/meltdown-exploit/issues/19 ^F E5200 => meltdown affected + # model name : Pentium(R) Dual-Core CPU E5200 @ 2.50GHz +- if echo "$cpu_friendly_name" | grep -qE 'Pentium\(R\) Dual-Core[[:space:]]+CPU[[:space:]]+E[0-9]{4}K?'; then ++ if echo "$cpu_friendly_name" | @grep@ -qE 'Pentium\(R\) Dual-Core[[:space:]]+CPU[[:space:]]+E[0-9]{4}K?'; then + variant1=vuln + [ -z "$variant2" ] && variant2=immune + variant3=vuln +@@ -486,7 +486,7 @@ is_cpu_affected() + i=$(( i + 1 )) + # do NOT quote $cpu_arch_list below + # shellcheck disable=SC2086 +- cpuarch=$(echo $cpu_arch_list | awk '{ print $'$i' }') ++ cpuarch=$(echo $cpu_arch_list | @awk@ '{ print $'$i' }') + _debug "checking cpu$i: <$cpupart> <$cpuarch>" + # some kernels report AArch64 instead of 8 + [ "$cpuarch" = "AArch64" ] && cpuarch=8 +@@ -497,49 +497,49 @@ is_cpu_affected() + # part ? ? c08 c09 c0d c0f c0e d07 d08 d09 d0a d0b d0c d0d + # arch 7? 7? 7 7 7 7 7 8 8 8 8 8 8 8 + # +- # Whitelist identified non-affected processors, use vulnerability information from ++ # Whitelist identified non-affected processors, use vulnerability information from + # https://developer.arm.com/support/arm-security-updates/speculative-processor-vulnerability + # Partnumbers can be found here: + # https://github.com/gcc-mirror/gcc/blob/master/gcc/config/arm/arm-cpus.in + # + # Maintain cumulative check of vulnerabilities - + # if at least one of the cpu is affected, then the system is affected +- if [ "$cpuarch" = 7 ] && echo "$cpupart" | grep -q -w -e 0xc08 -e 0xc09 -e 0xc0d -e 0xc0e; then ++ if [ "$cpuarch" = 7 ] && echo "$cpupart" | @grep@ -q -w -e 0xc08 -e 0xc09 -e 0xc0d -e 0xc0e; then + variant1=vuln + variant2=vuln + [ -z "$variant3" ] && variant3=immune + [ -z "$variant3a" ] && variant3a=immune + [ -z "$variant4" ] && variant4=immune + _debug "checking cpu$i: armv7 A8/A9/A12/A17 non affected to variants 3, 3a & 4" +- elif [ "$cpuarch" = 7 ] && echo "$cpupart" | grep -q -w -e 0xc0f; then ++ elif [ "$cpuarch" = 7 ] && echo "$cpupart" | @grep@ -q -w -e 0xc0f; then + variant1=vuln + variant2=vuln + [ -z "$variant3" ] && variant3=immune + variant3a=vuln + [ -z "$variant4" ] && variant4=immune + _debug "checking cpu$i: armv7 A15 non affected to variants 3 & 4" +- elif [ "$cpuarch" = 8 ] && echo "$cpupart" | grep -q -w -e 0xd07 -e 0xd08; then ++ elif [ "$cpuarch" = 8 ] && echo "$cpupart" | @grep@ -q -w -e 0xd07 -e 0xd08; then + variant1=vuln + variant2=vuln + [ -z "$variant3" ] && variant3=immune + variant3a=vuln + variant4=vuln + _debug "checking cpu$i: armv8 A57/A72 non affected to variants 3" +- elif [ "$cpuarch" = 8 ] && echo "$cpupart" | grep -q -w -e 0xd09; then ++ elif [ "$cpuarch" = 8 ] && echo "$cpupart" | @grep@ -q -w -e 0xd09; then + variant1=vuln + variant2=vuln + [ -z "$variant3" ] && variant3=immune + [ -z "$variant3a" ] && variant3a=immune + variant4=vuln + _debug "checking cpu$i: armv8 A73 non affected to variants 3 & 3a" +- elif [ "$cpuarch" = 8 ] && echo "$cpupart" | grep -q -w -e 0xd0a; then ++ elif [ "$cpuarch" = 8 ] && echo "$cpupart" | @grep@ -q -w -e 0xd0a; then + variant1=vuln + variant2=vuln + variant3=vuln + [ -z "$variant3a" ] && variant3a=immune + variant4=vuln + _debug "checking cpu$i: armv8 A75 non affected to variant 3a" +- elif [ "$cpuarch" = 8 ] && echo "$cpupart" | grep -q -w -e 0xd0b -e 0xd0c -e 0xd0d; then ++ elif [ "$cpuarch" = 8 ] && echo "$cpupart" | @grep@ -q -w -e 0xd0b -e 0xd0c -e 0xd0d; then + variant1=vuln + [ -z "$variant2" ] && variant2=immune + [ -z "$variant3" ] && variant3=immune +@@ -820,7 +820,7 @@ is_cpu_ssb_free() + if [ "$cpu_family" = "18" ] || \ + [ "$cpu_family" = "17" ] || \ + [ "$cpu_family" = "16" ] || \ +- [ "$cpu_family" = "15" ]; then ++ [ "$cpu_family" = "15" ]; then + return 0 + fi + fi +@@ -837,7 +837,7 @@ show_header() + _info + } + +-[ -z "$HOME" ] && HOME="$(getent passwd "$(whoami)" | cut -d: -f6)" ++[ -z "$HOME" ] && HOME="$(@getent@ passwd "$(@whoami@)" | @cut@ -d: -f6)" + mcedb_cache="$HOME/.mcedb" + update_fwdb() + { +@@ -846,11 +846,11 @@ update_fwdb() + set -e + + if [ -r "$mcedb_cache" ]; then +- previous_dbversion=$(awk '/^# %%% MCEDB / { print $4 }' "$mcedb_cache") ++ previous_dbversion=$(@awk@ '/^# %%% MCEDB / { print $4 }' "$mcedb_cache") + fi + + # first, download the MCE.db from the excellent platomav's MCExtractor project +- mcedb_tmp="$(mktemp -t smc-mcedb-XXXXXX)" ++ mcedb_tmp="$(@mktemp@ -t smc-mcedb-XXXXXX)" + mcedb_url='https://github.com/platomav/MCExtractor/raw/master/MCE.db' + _info_nol "Fetching MCE.db from the MCExtractor project... " + if command -v wget >/dev/null 2>&1; then +@@ -870,7 +870,7 @@ update_fwdb() + echo DONE + + # second, get the Intel firmwares from GitHub +- intel_tmp="$(mktemp -d -t smc-intelfw-XXXXXX)" ++ intel_tmp="$(@mktemp@ -d -t smc-intelfw-XXXXXX)" + intel_url="https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files/archive/main.zip" + _info_nol "Fetching Intel firmwares... " + ## https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files.git +@@ -930,20 +930,20 @@ update_fwdb() + fi + # 079/001: sig 0x000106c2, pf_mask 0x01, 2009-04-10, rev 0x0217, size 5120 + # 078/004: sig 0x000106ca, pf_mask 0x10, 2009-08-25, rev 0x0107, size 5120 +- $iucode_tool -l "$intel_tmp/Intel-Linux-Processor-Microcode-Data-Files-main/intel-ucode" | grep -wF sig | while read -r _line ++ $iucode_tool -l "$intel_tmp/Intel-Linux-Processor-Microcode-Data-Files-main/intel-ucode" | @grep@ -wF sig | while read -r _line + do +- _line=$( echo "$_line" | tr -d ',') +- _cpuid=$( echo "$_line" | awk '{print $3}') ++ _line=$( echo "$_line" | @tr@ -d ',') ++ _cpuid=$( echo "$_line" | @awk@ '{print $3}') + _cpuid=$(( _cpuid )) + _cpuid=$(printf "0x%08X" "$_cpuid") +- _date=$( echo "$_line" | awk '{print $6}' | tr -d '-') +- _version=$(echo "$_line" | awk '{print $8}') ++ _date=$( echo "$_line" | @awk@ '{print $6}' | @tr@ -d '-') ++ _version=$(echo "$_line" | @awk@ '{print $8}') + _version=$(( _version )) + _version=$(printf "0x%08X" "$_version") + _sqlstm="$(printf "INSERT INTO Intel (origin,cpuid,version,yyyymmdd) VALUES (\"%s\",\"%s\",\"%s\",\"%s\");" "intel" "$(printf "%08X" "$_cpuid")" "$(printf "%08X" "$_version")" "$_date")" + sqlite3 "$mcedb_tmp" "$_sqlstm" + done +- _intel_timestamp=$(stat -c %Y "$intel_tmp/Intel-Linux-Processor-Microcode-Data-Files-main/license" 2>/dev/null) ++ _intel_timestamp=$(@stat@ -c %Y "$intel_tmp/Intel-Linux-Processor-Microcode-Data-Files-main/license" 2>/dev/null) + if [ -n "$_intel_timestamp" ]; then + # use this date, it matches the last commit date + _intel_latest_date=$(date +%Y%m%d -d @"$_intel_timestamp") +@@ -964,17 +964,17 @@ update_fwdb() + { + echo "# Spectre & Meltdown Checker"; + echo "# %%% MCEDB v$dbversion"; +- sqlite3 "$mcedb_tmp" "SELECT '# I,0x'||t1.cpuid||',0x'||MAX(t1.version)||','||t1.yyyymmdd FROM Intel AS t1 LEFT OUTER JOIN Intel AS t2 ON t2.cpuid=t1.cpuid AND t2.yyyymmdd > t1.yyyymmdd WHERE t2.yyyymmdd IS NULL GROUP BY t1.cpuid ORDER BY t1.cpuid ASC;" | grep -v '^# .,0x00000000,'; +- sqlite3 "$mcedb_tmp" "SELECT '# A,0x'||t1.cpuid||',0x'||MAX(t1.version)||','||t1.yyyymmdd FROM AMD AS t1 LEFT OUTER JOIN AMD AS t2 ON t2.cpuid=t1.cpuid AND t2.yyyymmdd > t1.yyyymmdd WHERE t2.yyyymmdd IS NULL GROUP BY t1.cpuid ORDER BY t1.cpuid ASC;" | grep -v '^# .,0x00000000,'; ++ sqlite3 "$mcedb_tmp" "SELECT '# I,0x'||t1.cpuid||',0x'||MAX(t1.version)||','||t1.yyyymmdd FROM Intel AS t1 LEFT OUTER JOIN Intel AS t2 ON t2.cpuid=t1.cpuid AND t2.yyyymmdd > t1.yyyymmdd WHERE t2.yyyymmdd IS NULL GROUP BY t1.cpuid ORDER BY t1.cpuid ASC;" | @grep@ -v '^# .,0x00000000,'; ++ sqlite3 "$mcedb_tmp" "SELECT '# A,0x'||t1.cpuid||',0x'||MAX(t1.version)||','||t1.yyyymmdd FROM AMD AS t1 LEFT OUTER JOIN AMD AS t2 ON t2.cpuid=t1.cpuid AND t2.yyyymmdd > t1.yyyymmdd WHERE t2.yyyymmdd IS NULL GROUP BY t1.cpuid ORDER BY t1.cpuid ASC;" | @grep@ -v '^# .,0x00000000,'; + } > "$mcedb_cache" + echo DONE "(version $dbversion)" + + if [ "$1" = builtin ]; then +- newfile=$(mktemp -t smc-builtin-XXXXXX) +- awk '/^# %%% MCEDB / { exit }; { print }' "$0" > "$newfile" +- awk '{ if (NR>1) { print } }' "$mcedb_cache" >> "$newfile" +- cat "$newfile" > "$0" +- rm -f "$newfile" ++ newfile=$(@mktemp@ -t smc-builtin-XXXXXX) ++ @awk@ '/^# %%% MCEDB / { exit }; { print }' "$0" > "$newfile" ++ @awk@ '{ if (NR>1) { print } }' "$mcedb_cache" >> "$newfile" ++ @cat@ "$newfile" > "$0" ++ @rm@ -f "$newfile" + fi + } + +@@ -1055,7 +1055,7 @@ while [ -n "${1:-}" ]; do + elif [ "$1" = "--cpu" ]; then + opt_cpu=$2 + if [ "$opt_cpu" != all ]; then +- if echo "$opt_cpu" | grep -Eq '^[0-9]+'; then ++ if echo "$opt_cpu" | @grep@ -Eq '^[0-9]+'; then + opt_cpu=$(( opt_cpu )) + else + echo "$0: error: --cpu should be an integer or 'all', got '$opt_cpu'" >&2 +@@ -1103,7 +1103,7 @@ while [ -n "${1:-}" ]; do + echo "$0: error: option --cve expects a parameter, supported CVEs are: $supported_cve_list" >&2 + exit 255 + fi +- selected_cve=$(echo "$supported_cve_list" | grep -iwo "$2") ++ selected_cve=$(echo "$supported_cve_list" | @grep@ -iwo "$2") + if [ -n "$selected_cve" ]; then + opt_cve_list="$opt_cve_list $selected_cve" + opt_cve_all=0 +@@ -1308,14 +1308,14 @@ check_kernel() + # a damaged ELF file and validate it, check for stderr warnings too + + # the warning "readelf: Warning: [16]: Link field (0) should index a symtab section./" can appear on valid kernels, ignore it +- _readelf_warnings=$("${opt_arch_prefix}readelf" -S "$_file" 2>&1 >/dev/null | grep -v 'should index a symtab section' | tr "\n" "/"); ret=$? +- _readelf_sections=$("${opt_arch_prefix}readelf" -S "$_file" 2>/dev/null | grep -c -e data -e text -e init) +- _kernel_size=$(stat -c %s "$_file" 2>/dev/null || stat -f %z "$_file" 2>/dev/null || echo 10000) ++ _readelf_warnings=$("@readelf@" -S "$_file" 2>&1 >/dev/null | @grep@ -v 'should index a symtab section' | @tr@ "\n" "/"); ret=$? ++ _readelf_sections=$("@readelf@" -S "$_file" 2>/dev/null | @grep@ -c -e data -e text -e init) ++ _kernel_size=$(@stat@ -c %s "$_file" 2>/dev/null || @stat@ -f %z "$_file" 2>/dev/null || echo 10000) + _debug "check_kernel: ret=$? size=$_kernel_size sections=$_readelf_sections warnings=$_readelf_warnings" + if [ "$_mode" = desperate ]; then +- if "${opt_arch_prefix}strings" "$_file" | grep -Eq '^Linux version '; then ++ if "@strings@" "$_file" | @grep@ -Eq '^Linux version '; then + _debug "check_kernel (desperate): ... matched!" +- if [ "$_readelf_sections" = 0 ] && grep -qF -e armv6 -e armv7 "$_file"; then ++ if [ "$_readelf_sections" = 0 ] && @grep@ -qF -e armv6 -e armv7 "$_file"; then + _debug "check_kernel (desperate): raw arm binary found, adjusting objdump options" + objdump_options="-D -b binary -marm" + else +@@ -1348,7 +1348,7 @@ try_decompress() + + # Try to find the header ($1) and decompress from here + _debug "try_decompress: looking for $3 magic in $6" +- for pos in $(tr "$1\n$2" "\n$2=" < "$6" | grep -abo "^$2") ++ for pos in $(@tr@ "$1\n$2" "\n$2=" < "$6" | @grep@ -abo "^$2") + do + _debug "try_decompress: magic for $3 found at offset $pos" + if ! command -v "$3" >/dev/null 2>&1; then +@@ -1375,11 +1375,11 @@ try_decompress() + kernel="$kerneltmp" + _debug "try_decompress: decompressed with $3 successfully!" + return 0 +- elif [ "$3" != "cat" ]; then ++ elif [ "$3" != "@cat@" ]; then + _debug "try_decompress: decompression with $3 worked but result is not a kernel, trying with an offset" +- [ -z "$kerneltmp2" ] && kerneltmp2=$(mktemp -t smc-kernel-XXXXXX) +- cat "$kerneltmp" > "$kerneltmp2" +- try_decompress '\177ELF' xxy 'cat' '' cat "$kerneltmp2" && return 0 ++ [ -z "$kerneltmp2" ] && kerneltmp2=$(@mktemp@ -t smc-kernel-XXXXXX) ++ @cat@ "$kerneltmp" > "$kerneltmp2" ++ try_decompress '\177ELF' xxy '@cat@' '' cat "$kerneltmp2" && return 0 + else + _debug "try_decompress: decompression with $3 worked but result is not a kernel" + fi +@@ -1391,12 +1391,12 @@ extract_kernel() + { + [ -n "${1:-}" ] || return 1 + # Prepare temp files: +- kerneltmp="$(mktemp -t smc-kernel-XXXXXX)" ++ kerneltmp="$(@mktemp@ -t smc-kernel-XXXXXX)" + + # Initial attempt for uncompressed images or objects: + if check_kernel "$1"; then + _debug "extract_kernel: found kernel is valid, no decompression needed" +- cat "$1" > "$kerneltmp" ++ @cat@ "$1" > "$kerneltmp" + kernel=$kerneltmp + return 0 + fi +@@ -1405,14 +1405,14 @@ extract_kernel() + for pass in 1 2; do + for mode in normal desperate; do + _debug "extract_kernel: pass $pass $mode mode" +- try_decompress '\037\213\010' xy gunzip '' gunzip "$1" "$mode" "$pass" && return 0 +- try_decompress '\002\041\114\030' xyy 'lz4' '-d -l' liblz4-tool "$1" "$mode" "$pass" && return 0 +- try_decompress '\3757zXZ\000' abcde unxz '' xz-utils "$1" "$mode" "$pass" && return 0 +- try_decompress 'BZh' xy bunzip2 '' bzip2 "$1" "$mode" "$pass" && return 0 +- try_decompress '\135\0\0\0' xxx unlzma '' xz-utils "$1" "$mode" "$pass" && return 0 +- try_decompress '\211\114\132' xy 'lzop' '-d' lzop "$1" "$mode" "$pass" && return 0 +- try_decompress '\177ELF' xxy 'cat' '' cat "$1" "$mode" "$pass" && return 0 +- try_decompress '(\265/\375' xxy unzstd '' zstd "$1" "$mode" "$pass" && return 0 ++ try_decompress '\037\213\010' xy @gunzip@ '' gunzip "$1" "$mode" "$pass" && return 0 ++ try_decompress '\002\041\114\030' xyy '@lz4@' '-d -l' liblz4-tool "$1" "$mode" "$pass" && return 0 ++ try_decompress '\3757zXZ\000' abcde @unxz@ '' xz-utils "$1" "$mode" "$pass" && return 0 ++ try_decompress 'BZh' xy @bunzip2@ '' bzip2 "$1" "$mode" "$pass" && return 0 ++ try_decompress '\135\0\0\0' xxx @unlzma@ '' xz-utils "$1" "$mode" "$pass" && return 0 ++ try_decompress '\211\114\132' xy '@lzop@' '-d' lzop "$1" "$mode" "$pass" && return 0 ++ try_decompress '\177ELF' xxy '@cat@' '' cat "$1" "$mode" "$pass" && return 0 ++ try_decompress '(\265/\375' xxy @unzstd@ '' zstd "$1" "$mode" "$pass" && return 0 + done + done + # kernel_err might already have been populated by try_decompress() if we're missing one of the tools +@@ -1429,7 +1429,7 @@ mount_debugfs() + { + if [ ! -e /sys/kernel/debug/sched_features ]; then + # try to mount the debugfs hierarchy ourselves and remember it to umount afterwards +- mount -t debugfs debugfs /sys/kernel/debug 2>/dev/null && mounted_debugfs=1 ++ @mount@ -t debugfs debugfs /sys/kernel/debug 2>/dev/null && mounted_debugfs=1 + fi + } + +@@ -1440,12 +1440,12 @@ load_msr() + load_msr_once=1 + + if [ "$os" = Linux ]; then +- if ! grep -qw msr "$procfs/modules" 2>/dev/null; then +- modprobe msr 2>/dev/null && insmod_msr=1 ++ if ! @grep@ -qw msr "$procfs/modules" 2>/dev/null; then ++ @modprobe@ msr 2>/dev/null && insmod_msr=1 + _debug "attempted to load module msr, insmod_msr=$insmod_msr" + else + _debug "msr module already loaded" +- fi ++ fi + else + if ! kldstat -q -m cpuctl; then + kldload cpuctl 2>/dev/null && kldload_cpuctl=1 +@@ -1463,12 +1463,12 @@ load_cpuid() + load_cpuid_once=1 + + if [ "$os" = Linux ]; then +- if ! grep -qw cpuid "$procfs/modules" 2>/dev/null; then +- modprobe cpuid 2>/dev/null && insmod_cpuid=1 ++ if ! @grep@ -qw cpuid "$procfs/modules" 2>/dev/null; then ++ @modprobe@ cpuid 2>/dev/null && insmod_cpuid=1 + _debug "attempted to load module cpuid, insmod_cpuid=$insmod_cpuid" + else + _debug "cpuid module already loaded" +- fi ++ fi + else + if ! kldstat -q -m cpuctl; then + kldload cpuctl 2>/dev/null && kldload_cpuctl=1 +@@ -1557,7 +1557,7 @@ read_cpuid_one_core() + fi + # on some kernel versions, /dev/cpu/0/cpuid doesn't imply that the cpuid module is loaded, in that case dd returns an error, + # we use that fact to load the module if dd returns an error +- if ! dd if=/dev/cpu/0/cpuid bs=16 count=1 >/dev/null 2>&1; then ++ if ! @dd@ if=/dev/cpu/0/cpuid bs=16 count=1 >/dev/null 2>&1; then + load_cpuid + fi + # we need _leaf to be converted to decimal for dd +@@ -1568,14 +1568,14 @@ read_cpuid_one_core() + _ddskip=$(( _position / 16 )) + _odskip=$(( _position - _ddskip * 16 )) + # now read the value +- _cpuid=$(dd if="/dev/cpu/$_core/cpuid" bs=16 skip=$_ddskip count=$((_odskip + 1)) 2>/dev/null | od -j $((_odskip * 16)) -A n -t u4) ++ _cpuid=$(@dd@ if="/dev/cpu/$_core/cpuid" bs=16 skip=$_ddskip count=$((_odskip + 1)) 2>/dev/null | @od@ -j $((_odskip * 16)) -A n -t u4) + elif [ -e /dev/cpuctl0 ]; then + # BSD + if [ ! -r /dev/cpuctl0 ]; then + read_cpuid_msg="Couldn't read cpuid info from cpuctl" + return $READ_CPUID_RET_ERR + fi +- _cpuid=$(cpucontrol -i "$_leaf","$_subleaf" "/dev/cpuctl$_core" 2>/dev/null | cut -d: -f2-) ++ _cpuid=$(cpucontrol -i "$_leaf","$_subleaf" "/dev/cpuctl$_core" 2>/dev/null | @cut@ -d: -f2-) + # cpuid level 0x4, level_type 0x2: 0x1c004143 0x01c0003f 0x000001ff 0x00000000 + else + read_cpuid_msg="Found no way to read cpuid info" +@@ -1598,7 +1598,7 @@ read_cpuid_one_core() + fi + + # get the value of the register we want +- _reg=$(echo "$_cpuid" | awk '{print $'"$_register"'}') ++ _reg=$(echo "$_cpuid" | @awk@ '{print $'"$_register"'}') + # Linux returns it as decimal, BSD as hex, normalize to decimal + _reg=$(( _reg )) + # shellcheck disable=SC2046 +@@ -1626,11 +1626,11 @@ dmesg_grep() + # grep for something in dmesg, ensuring that the dmesg buffer + # has not been truncated + dmesg_grepped='' +- if ! dmesg | grep -qE -e '(^|\] )Linux version [0-9]' -e '^FreeBSD is a registered' ; then ++ if ! @dmesg@ | @grep@ -qE -e '(^|\] )Linux version [0-9]' -e '^FreeBSD is a registered' ; then + # dmesg truncated + return 2 + fi +- dmesg_grepped=$(dmesg | grep -E "$1" | head -1) ++ dmesg_grepped=$(@dmesg@ | @grep@ -E "$1" | @head@ -1) + # not found: + [ -z "$dmesg_grepped" ] && return 1 + # found, output is in $dmesg_grepped +@@ -1647,12 +1647,12 @@ parse_cpu_details() + { + [ "${parse_cpu_details_done:-}" = 1 ] && return 0 + +- if command -v nproc >/dev/null; then +- number_of_cores=$(nproc) +- elif echo "$os" | grep -q BSD; then +- number_of_cores=$(sysctl -n hw.ncpu 2>/dev/null || echo 1) ++ if command -v @nproc@ >/dev/null; then ++ number_of_cores=$(@nproc@) ++ elif echo "$os" | @grep@ -q BSD; then ++ number_of_cores=$(@sysctl@ -n hw.ncpu 2>/dev/null || echo 1) + elif [ -e "$procfs/cpuinfo" ]; then +- number_of_cores=$(grep -c ^processor "$procfs/cpuinfo" 2>/dev/null || echo 1) ++ number_of_cores=$(@grep@ -c ^processor "$procfs/cpuinfo" 2>/dev/null || echo 1) + else + # if we don't know, default to 1 CPU + number_of_cores=1 +@@ -1660,43 +1660,43 @@ parse_cpu_details() + max_core_id=$(( number_of_cores - 1 )) + + if [ -e "$procfs/cpuinfo" ]; then +- cpu_vendor=$( grep '^vendor_id' "$procfs/cpuinfo" | awk '{print $3}' | head -1) +- cpu_friendly_name=$(grep '^model name' "$procfs/cpuinfo" | cut -d: -f2- | head -1 | sed -e 's/^ *//') ++ cpu_vendor=$( @grep@ '^vendor_id' "$procfs/cpuinfo" | @awk@ '{print $3}' | @head@ -1) ++ cpu_friendly_name=$(@grep@ '^model name' "$procfs/cpuinfo" | @cut@ -d: -f2- | @head@ -1 | @sed@ -e 's/^ *//') + # special case for ARM follows +- if grep -qi 'CPU implementer[[:space:]]*:[[:space:]]*0x41' "$procfs/cpuinfo"; then ++ if @grep@ -qi 'CPU implementer[[:space:]]*:[[:space:]]*0x41' "$procfs/cpuinfo"; then + cpu_vendor='ARM' + # some devices (phones or other) have several ARMs and as such different part numbers, + # an example is "bigLITTLE", so we need to store the whole list, this is needed for is_cpu_affected +- cpu_part_list=$(awk '/CPU part/ {print $4}' "$procfs/cpuinfo") +- cpu_arch_list=$(awk '/CPU architecture/ {print $3}' "$procfs/cpuinfo") ++ cpu_part_list=$(@awk@ '/CPU part/ {print $4}' "$procfs/cpuinfo") ++ cpu_arch_list=$(@awk@ '/CPU architecture/ {print $3}' "$procfs/cpuinfo") + # take the first one to fill the friendly name, do NOT quote the vars below + # shellcheck disable=SC2086 +- cpu_arch=$(echo $cpu_arch_list | awk '{ print $1 }') ++ cpu_arch=$(echo $cpu_arch_list | @awk@ '{ print $1 }') + # shellcheck disable=SC2086 +- cpu_part=$(echo $cpu_part_list | awk '{ print $1 }') ++ cpu_part=$(echo $cpu_part_list | @awk@ '{ print $1 }') + [ "$cpu_arch" = "AArch64" ] && cpu_arch=8 + cpu_friendly_name="ARM" + [ -n "$cpu_arch" ] && cpu_friendly_name="$cpu_friendly_name v$cpu_arch" + [ -n "$cpu_part" ] && cpu_friendly_name="$cpu_friendly_name model $cpu_part" + +- elif grep -qi 'CPU implementer[[:space:]]*:[[:space:]]*0x43' "$procfs/cpuinfo"; then ++ elif @grep@ -qi 'CPU implementer[[:space:]]*:[[:space:]]*0x43' "$procfs/cpuinfo"; then + cpu_vendor='CAVIUM' +- elif grep -qi 'CPU implementer[[:space:]]*:[[:space:]]*0x70' "$procfs/cpuinfo"; then ++ elif @grep@ -qi 'CPU implementer[[:space:]]*:[[:space:]]*0x70' "$procfs/cpuinfo"; then + cpu_vendor='PHYTIUM' + fi + +- cpu_family=$( grep '^cpu family' "$procfs/cpuinfo" | awk '{print $4}' | grep -E '^[0-9]+$' | head -1) +- cpu_model=$( grep '^model' "$procfs/cpuinfo" | awk '{print $3}' | grep -E '^[0-9]+$' | head -1) +- cpu_stepping=$(grep '^stepping' "$procfs/cpuinfo" | awk '{print $3}' | grep -E '^[0-9]+$' | head -1) +- cpu_ucode=$( grep '^microcode' "$procfs/cpuinfo" | awk '{print $3}' | head -1) ++ cpu_family=$( @grep@ '^cpu family' "$procfs/cpuinfo" | @awk@ '{print $4}' | @grep@ -E '^[0-9]+$' | @head@ -1) ++ cpu_model=$( @grep@ '^model' "$procfs/cpuinfo" | @awk@ '{print $3}' | @grep@ -E '^[0-9]+$' | @head@ -1) ++ cpu_stepping=$(@grep@ '^stepping' "$procfs/cpuinfo" | @awk@ '{print $3}' | @grep@ -E '^[0-9]+$' | @head@ -1) ++ cpu_ucode=$( @grep@ '^microcode' "$procfs/cpuinfo" | @awk@ '{print $3}' | @head@ -1) + else +- cpu_vendor=$( dmesg | grep -i -m1 'Origin=' | cut -f2 -w | cut -f2 -d= | cut -f2 -d\" ) +- cpu_family=$( dmesg | grep -i -m1 'Family=' | cut -f4 -w | cut -f2 -d= ) ++ cpu_vendor=$( @dmesg@ | @grep@ -i -m1 'Origin=' | @cut@ -f2 -w | @cut@ -f2 -d= | @cut@ -f2 -d\" ) ++ cpu_family=$( @dmesg@ | @grep@ -i -m1 'Family=' | @cut@ -f4 -w | @cut@ -f2 -d= ) + cpu_family=$(( cpu_family )) +- cpu_model=$( dmesg | grep -i -m1 'Model=' | cut -f5 -w | cut -f2 -d= ) ++ cpu_model=$( @dmesg@ | @grep@ -i -m1 'Model=' | @cut@ -f5 -w | @cut@ -f2 -d= ) + cpu_model=$(( cpu_model )) +- cpu_stepping=$( dmesg | grep -i -m1 'Stepping=' | cut -f6 -w | cut -f2 -d= ) +- cpu_friendly_name=$(sysctl -n hw.model 2>/dev/null) ++ cpu_stepping=$( @dmesg@ | @grep@ -i -m1 'Stepping=' | @cut@ -f6 -w | @cut@ -f2 -d= ) ++ cpu_friendly_name=$(@sysctl@ -n hw.model 2>/dev/null) + fi + + if [ -n "${SMC_MOCK_CPU_FRIENDLY_NAME:-}" ]; then +@@ -1751,7 +1751,7 @@ parse_cpu_details() + # call CPUID + cpucontrol -i 1 /dev/cpuctl0 >/dev/null + # read MSR +- cpu_ucode=$(cpucontrol -m 0x8b /dev/cpuctl0 | awk '{print $3}') ++ cpu_ucode=$(cpucontrol -m 0x8b /dev/cpuctl0 | @awk@ '{print $3}') + # convert to decimal + cpu_ucode=$(( cpu_ucode )) + # convert back to hex +@@ -1770,7 +1770,7 @@ parse_cpu_details() + mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_CPU_UCODE='$cpu_ucode'") + fi + +- echo "$cpu_ucode" | grep -q ^0x && cpu_ucode=$(( cpu_ucode )) ++ echo "$cpu_ucode" | @grep@ -q ^0x && cpu_ucode=$(( cpu_ucode )) + ucode_found=$(printf "family 0x%x model 0x%x stepping 0x%x ucode 0x%x cpuid 0x%x" "$cpu_family" "$cpu_model" "$cpu_stepping" "$cpu_ucode" "$cpu_cpuid") + + # also define those that we will need in other funcs +@@ -1867,8 +1867,8 @@ is_cpu_smt_enabled() + { + # SMT / HyperThreading is enabled if siblings != cpucores + if [ -e "$procfs/cpuinfo" ]; then +- _siblings=$(awk '/^siblings/ {print $3;exit}' "$procfs/cpuinfo") +- _cpucores=$(awk '/^cpu cores/ {print $4;exit}' "$procfs/cpuinfo") ++ _siblings=$(@awk@ '/^siblings/ {print $3;exit}' "$procfs/cpuinfo") ++ _cpucores=$(@awk@ '/^cpu cores/ {print $4;exit}' "$procfs/cpuinfo") + if [ -n "$_siblings" ] && [ -n "$_cpucores" ]; then + if [ "$_siblings" = "$_cpucores" ]; then + return 1 +@@ -1916,10 +1916,10 @@ is_ucode_blacklisted() + $INTEL_FAM6_SANDYBRIDGE_X,0x06,0x61b \ + $INTEL_FAM6_SANDYBRIDGE_X,0x07,0x712 + do +- model=$(echo "$tuple" | cut -d, -f1) +- stepping=$(( $(echo "$tuple" | cut -d, -f2) )) ++ model=$(echo "$tuple" | @cut@ -d, -f1) ++ stepping=$(( $(echo "$tuple" | @cut@ -d, -f2) )) + if [ "$cpu_model" = "$model" ] && [ "$cpu_stepping" = "$stepping" ]; then +- ucode=$(( $(echo "$tuple" | cut -d, -f3) )) ++ ucode=$(( $(echo "$tuple" | @cut@ -d, -f3) )) + if [ "$cpu_ucode" = "$ucode" ]; then + _debug "is_ucode_blacklisted: we have a match! ($cpu_model/$cpu_stepping/$cpu_ucode)" + return 0 +@@ -2007,7 +2007,7 @@ is_xen_dom0() + return 1 + fi + +- if [ -e "$procfs/xen/capabilities" ] && grep -q "control_d" "$procfs/xen/capabilities"; then ++ if [ -e "$procfs/xen/capabilities" ] && @grep@ -q "control_d" "$procfs/xen/capabilities"; then + return 0 + else + return 1 +@@ -2033,12 +2033,12 @@ is_xen_domU() + fi + } + +-builtin_dbversion=$(awk '/^# %%% MCEDB / { print $4 }' "$0") ++builtin_dbversion=$(@awk@ '/^# %%% MCEDB / { print $4 }' "$0") + if [ -r "$mcedb_cache" ]; then + # we have a local cache file, but it might be older than the builtin version we have +- local_dbversion=$( awk '/^# %%% MCEDB / { print $4 }' "$mcedb_cache") ++ local_dbversion=$( @awk@ '/^# %%% MCEDB / { print $4 }' "$mcedb_cache") + # sort -V sorts by version number +- older_dbversion=$(printf "%b\n%b" "$local_dbversion" "$builtin_dbversion" | sort -V | head -n1) ++ older_dbversion=$(printf "%b\n%b" "$local_dbversion" "$builtin_dbversion" | @sort@ -V | @head@ -n1) + if [ "$older_dbversion" = "$builtin_dbversion" ]; then + mcedb_source="$mcedb_cache" + mcedb_info="local firmwares DB $local_dbversion" +@@ -2051,7 +2051,7 @@ if [ -z "${mcedb_source:-}" ]; then + fi + read_mcedb() + { +- awk '{ if (DELIM==1) { print $2 } } /^# %%% MCEDB / { DELIM=1 }' "$mcedb_source" ++ @awk@ '{ if (DELIM==1) { print $2 } } /^# %%% MCEDB / { DELIM=1 }' "$mcedb_source" + } + + is_latest_known_ucode() +@@ -2070,10 +2070,10 @@ is_latest_known_ucode() + else + return 2 + fi +- for tuple in $(read_mcedb | grep "$(printf "^$cpu_brand_prefix,0x%08X," "$cpu_cpuid")") ++ for tuple in $(read_mcedb | @grep@ "$(printf "^$cpu_brand_prefix,0x%08X," "$cpu_cpuid")") + do +- ucode=$(( $(echo "$tuple" | cut -d, -f3) )) +- ucode_date=$(echo "$tuple" | cut -d, -f4 | sed -r 's=(....)(..)(..)=\1/\2/\3=') ++ ucode=$(( $(echo "$tuple" | @cut@ -d, -f3) )) ++ ucode_date=$(echo "$tuple" | @cut@ -d, -f4 | @sed@ -r 's=(....)(..)(..)=\1/\2/\3=') + _debug "is_latest_known_ucode: with cpuid $cpu_cpuid has ucode $cpu_ucode, last known is $ucode from $ucode_date" + ucode_latest=$(printf "latest version is 0x%x dated $ucode_date according to $mcedb_info" "$ucode") + if [ "$cpu_ucode" -ge "$ucode" ]; then +@@ -2098,7 +2098,7 @@ get_cmdline() + kernel_cmdline="$SMC_MOCK_CMDLINE" + return + else +- kernel_cmdline=$(cat "$procfs/cmdline") ++ kernel_cmdline=$(@cat@ "$procfs/cmdline") + mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_CMDLINE='$kernel_cmdline'") + fi + } +@@ -2106,7 +2106,7 @@ get_cmdline() + # ENTRYPOINT + + # we can't do anything useful under WSL +-if uname -a | grep -qE -- '-Microsoft #[0-9]+-Microsoft '; then ++if @uname@ -a | @grep@ -qE -- '-Microsoft #[0-9]+-Microsoft '; then + _warn "This script doesn't work under Windows Subsystem for Linux" + _warn "You should use the official Microsoft tool instead." + _warn "It can be found under https://aka.ms/SpeculationControlPS" +@@ -2155,15 +2155,15 @@ fi + + # if we're under a BSD, try to mount linprocfs for "$procfs/cpuinfo" + procfs=/proc +-if echo "$os" | grep -q BSD; then ++if echo "$os" | @grep@ -q BSD; then + _debug "We're under BSD, check if we have procfs" +- procfs=$(mount | awk '/^linprocfs/ { print $3; exit; }') ++ procfs=$(@mount@ | @awk@ '/^linprocfs/ { print $3; exit; }') + if [ -z "$procfs" ]; then + _debug "we don't, try to mount it" + procfs=/proc + [ -d /compat/linux/proc ] && procfs=/compat/linux/proc + test -d $procfs || mkdir $procfs +- if mount -t linprocfs linprocfs $procfs 2>/dev/null; then ++ if @mount@ -t linprocfs linprocfs $procfs 2>/dev/null; then + mounted_procfs=1 + _debug "procfs just mounted at $procfs" + else +@@ -2195,14 +2195,14 @@ fi + + if [ "$opt_live" = 1 ]; then + # root check (only for live mode, for offline mode, we already checked if we could read the files) +- if [ "$(id -u)" -ne 0 ]; then ++ if [ "$(@id@ -u)" -ne 0 ]; then + _warn "Note that you should launch this script with root privileges to get accurate information." + _warn "We'll proceed but you might see permission denied errors." + _warn "To run it as root, you can try the following command: sudo $0" + _warn + fi + _info "Checking for vulnerabilities on current system" +- _info "Kernel is \033[35m$os $(uname -r) $(uname -v) $(uname -m)\033[0m" ++ _info "Kernel is \033[35m$os $(@uname@ -r) $(@uname@ -v) $(@uname@ -m)\033[0m" + _info "CPU is \033[35m$cpu_friendly_name\033[0m" + + # try to find the image of the current running kernel +@@ -2210,12 +2210,12 @@ if [ "$opt_live" = 1 ]; then + # specified by user on cmdline, with --live, don't override + : + # first, look for the BOOT_IMAGE hint in the kernel cmdline +- elif echo "$kernel_cmdline" | grep -q 'BOOT_IMAGE='; then +- opt_kernel=$(echo "$kernel_cmdline" | grep -Eo 'BOOT_IMAGE=[^ ]+' | cut -d= -f2) ++ elif echo "$kernel_cmdline" | @grep@ -q 'BOOT_IMAGE='; then ++ opt_kernel=$(echo "$kernel_cmdline" | @grep@ -Eo 'BOOT_IMAGE=[^ ]+' | @cut@ -d= -f2) + _debug "found opt_kernel=$opt_kernel in $procfs/cmdline" + # if the boot partition is within a btrfs subvolume, strip the subvolume name + # if /boot is a separate subvolume, the remainder of the code in this section should handle it +- if echo "$opt_kernel" | grep -q "^/@"; then opt_kernel=$(echo "$opt_kernel" | sed "s:/@[^/]*::"); fi ++ if echo "$opt_kernel" | @grep@ -q "^/@"; then opt_kernel=$(echo "$opt_kernel" | @sed@ "s:/@[^/]*::"); fi + # if we have a dedicated /boot partition, our bootloader might have just called it / + # so try to prepend /boot and see if we find anything + [ -e "/boot/$opt_kernel" ] && opt_kernel="/boot/$opt_kernel" +@@ -2227,7 +2227,7 @@ if [ "$opt_live" = 1 ]; then + # if we didn't find a kernel, default to guessing + if [ ! -e "$opt_kernel" ]; then + # Fedora: +- [ -e "/lib/modules/$(uname -r)/vmlinuz" ] && opt_kernel="/lib/modules/$(uname -r)/vmlinuz" ++ [ -e "/lib/modules/$(@uname@ -r)/vmlinuz" ] && opt_kernel="/lib/modules/$(@uname@ -r)/vmlinuz" + # Slackware: + [ -e "/boot/vmlinuz" ] && opt_kernel="/boot/vmlinuz" + # Arch aarch64: +@@ -2241,24 +2241,24 @@ if [ "$opt_live" = 1 ]; then + # pine64 + [ -e "/boot/pine64/Image" ] && opt_kernel="/boot/pine64/Image" + # generic: +- [ -e "/boot/vmlinuz-$(uname -r)" ] && opt_kernel="/boot/vmlinuz-$(uname -r)" +- [ -e "/boot/kernel-$( uname -r)" ] && opt_kernel="/boot/kernel-$( uname -r)" +- [ -e "/boot/bzImage-$(uname -r)" ] && opt_kernel="/boot/bzImage-$(uname -r)" ++ [ -e "/boot/vmlinuz-$(@uname@ -r)" ] && opt_kernel="/boot/vmlinuz-$(@uname@ -r)" ++ [ -e "/boot/kernel-$( @uname@ -r)" ] && opt_kernel="/boot/kernel-$( @uname@ -r)" ++ [ -e "/boot/bzImage-$(@uname@ -r)" ] && opt_kernel="/boot/bzImage-$(@uname@ -r)" + # Gentoo: +- [ -e "/boot/kernel-genkernel-$(uname -m)-$(uname -r)" ] && opt_kernel="/boot/kernel-genkernel-$(uname -m)-$(uname -r)" ++ [ -e "/boot/kernel-genkernel-$(@uname@ -m)-$(@uname@ -r)" ] && opt_kernel="/boot/kernel-genkernel-$(@uname@ -m)-$(@uname@ -r)" + # NixOS: + [ -e "/run/booted-system/kernel" ] && opt_kernel="/run/booted-system/kernel" + # Guix System: + [ -e "/run/booted-system/kernel/bzImage" ] && opt_kernel="/run/booted-system/kernel/bzImage" + # systemd kernel-install: +- [ -e "/etc/machine-id" ] && [ -e "/boot/$(cat /etc/machine-id)/$(uname -r)/linux" ] && opt_kernel="/boot/$(cat /etc/machine-id)/$(uname -r)/linux" ++ [ -e "/etc/machine-id" ] && [ -e "/boot/$(@cat@ /etc/machine-id)/$(@uname@ -r)/linux" ] && opt_kernel="/boot/$(@cat@ /etc/machine-id)/$(@uname@ -r)/linux" + # Clear Linux: +- str_uname=$(uname -r) ++ str_uname=$(@uname@ -r) + clear_linux_kernel="/lib/kernel/org.clearlinux.${str_uname##*.}.${str_uname%.*}" + [ -e "$clear_linux_kernel" ] && opt_kernel=$clear_linux_kernel + # Custom Arch seems to have the kernel path in its cmdline in the form "\directory\kernelimage", + # with actual \'s instead of /'s: +- custom_arch_kernel=$(echo "$kernel_cmdline" | grep -Eo "(^|\s)\\\\[\\\\a-zA-Z0-9_.-]+" | tr "\\\\" "/" | tr -d '[:space:]') ++ custom_arch_kernel=$(echo "$kernel_cmdline" | @grep@ -Eo "(^|\s)\\\\[\\\\a-zA-Z0-9_.-]+" | @tr@ "\\\\" "/" | @tr@ -d '[:space:]') + if [ -n "$custom_arch_kernel" ] && [ -e "$custom_arch_kernel" ]; then + opt_kernel="$custom_arch_kernel" + fi +@@ -2272,12 +2272,12 @@ if [ "$opt_live" = 1 ]; then + : + elif [ -e "$procfs/kallsyms" ] ; then + opt_map="$procfs/kallsyms" +- elif [ -e "/lib/modules/$(uname -r)/System.map" ] ; then +- opt_map="/lib/modules/$(uname -r)/System.map" +- elif [ -e "/boot/System.map-$(uname -r)" ] ; then +- opt_map="/boot/System.map-$(uname -r)" +- elif [ -e "/lib/kernel/System.map-$(uname -r)" ]; then +- opt_map="/lib/kernel/System.map-$(uname -r)" ++ elif [ -e "/lib/modules/$(@uname@ -r)/System.map" ] ; then ++ opt_map="/lib/modules/$(@uname@ -r)/System.map" ++ elif [ -e "/boot/System.map-$(@uname@ -r)" ] ; then ++ opt_map="/boot/System.map-$(@uname@ -r)" ++ elif [ -e "/lib/kernel/System.map-$(@uname@ -r)" ]; then ++ opt_map="/lib/kernel/System.map-$(@uname@ -r)" + fi + + # config +@@ -2285,18 +2285,18 @@ if [ "$opt_live" = 1 ]; then + # specified by user on cmdline, with --live, don't override + : + elif [ -e "$procfs/config.gz" ] ; then +- dumped_config="$(mktemp -t smc-config-XXXXXX)" +- gunzip -c "$procfs/config.gz" > "$dumped_config" ++ dumped_config="$(@mktemp@ -t smc-config-XXXXXX)" ++ @gunzip@ -c "$procfs/config.gz" > "$dumped_config" + # dumped_config will be deleted at the end of the script + opt_config="$dumped_config" +- elif [ -e "/lib/modules/$(uname -r)/config" ]; then +- opt_config="/lib/modules/$(uname -r)/config" +- elif [ -e "/boot/config-$(uname -r)" ]; then +- opt_config="/boot/config-$(uname -r)" +- elif [ -e "/etc/kernels/kernel-config-$(uname -m)-$(uname -r)" ]; then +- opt_config="/etc/kernels/kernel-config-$(uname -m)-$(uname -r)" +- elif [ -e "/lib/kernel/config-$(uname -r)" ]; then +- opt_config="/lib/kernel/config-$(uname -r)" ++ elif [ -e "/lib/modules/$(@uname@ -r)/config" ]; then ++ opt_config="/lib/modules/$(@uname@ -r)/config" ++ elif [ -e "/boot/config-$(@uname@ -r)" ]; then ++ opt_config="/boot/config-$(@uname@ -r)" ++ elif [ -e "/etc/kernels/kernel-config-$(@uname@ -m)-$(@uname@ -r)" ]; then ++ opt_config="/etc/kernels/kernel-config-$(@uname@ -m)-$(@uname@ -r)" ++ elif [ -e "/lib/kernel/config-$(@uname@ -r)" ]; then ++ opt_config="/lib/kernel/config-$(@uname@ -r)" + fi + else + _info "Checking for vulnerabilities against specified kernel" +@@ -2311,7 +2311,7 @@ else + fi + + if [ "$os" = Linux ]; then +- if [ -n "$opt_config" ] && ! grep -q '^CONFIG_' "$opt_config"; then ++ if [ -n "$opt_config" ] && ! @grep@ -q '^CONFIG_' "$opt_config"; then + # given file is invalid! + _warn "The kernel config file seems invalid, was expecting a plain-text file, ignoring it!" + opt_config='' +@@ -2339,7 +2339,7 @@ if [ "$os" = Linux ]; then + fi + + if [ -e "$opt_kernel" ]; then +- if ! command -v "${opt_arch_prefix}readelf" >/dev/null 2>&1; then ++ if ! command -v "@readelf@" >/dev/null 2>&1; then + _debug "readelf not found" + kernel_err="missing '${opt_arch_prefix}readelf' tool, please install it, usually it's in the 'binutils' package" + elif [ "$opt_sysfs_only" = 1 ] || [ "$opt_hw_only" = 1 ]; then +@@ -2357,20 +2357,20 @@ else + # vanilla kernels have with ^Linux version + # also try harder with some kernels (such as Red Hat) that don't have ^Linux version before their version string + # and check for FreeBSD +- kernel_version=$("${opt_arch_prefix}strings" "$kernel" 2>/dev/null | grep -E \ ++ kernel_version=$("@strings@" "$kernel" 2>/dev/null | @grep@ -E \ + -e '^Linux version ' \ + -e '^[[:alnum:]][^[:space:]]+ \([^[:space:]]+\) #[0-9]+ .+ (19|20)[0-9][0-9]$' \ +- -e '^FreeBSD [0-9]' | head -1) ++ -e '^FreeBSD [0-9]' | @head@ -1) + if [ -z "$kernel_version" ]; then + # try even harder with some kernels (such as ARM) that split the release (uname -r) and version (uname -v) in 2 adjacent strings +- kernel_version=$("${opt_arch_prefix}strings" "$kernel" 2>/dev/null | grep -E -B1 '^#[0-9]+ .+ (19|20)[0-9][0-9]$' | tr "\n" " ") ++ kernel_version=$("@strings@" "$kernel" 2>/dev/null | @grep@ -E -B1 '^#[0-9]+ .+ (19|20)[0-9][0-9]$' | @tr@ "\n" " ") + fi + if [ -n "$kernel_version" ]; then + # in live mode, check if the img we found is the correct one + if [ "$opt_live" = 1 ]; then + _verbose "Kernel image is \033[35m$kernel_version" +- if ! echo "$kernel_version" | grep -qF "$(uname -r)"; then +- _warn "Possible discrepancy between your running kernel '$(uname -r)' and the image '$kernel_version' we found ($opt_kernel), results might be incorrect" ++ if ! echo "$kernel_version" | @grep@ -qF "$(@uname@ -r)"; then ++ _warn "Possible discrepancy between your running kernel '$(@uname@ -r)' and the image '$kernel_version' we found ($opt_kernel), results might be incorrect" + fi + else + _info "Kernel image is \033[35m$kernel_version" +@@ -2398,11 +2398,11 @@ sys_interface_check() + if [ "$opt_live" = 1 ] && [ "$opt_no_sysfs" = 0 ] && [ -r "$file" ]; then + : + else +- mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_SYSFS_$(basename "$file")_RET=1") ++ mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_SYSFS_$(@basename@ "$file")_RET=1") + return 1 + fi + +- _mockvarname="SMC_MOCK_SYSFS_$(basename "$file")_RET" ++ _mockvarname="SMC_MOCK_SYSFS_$(@basename@ "$file")_RET" + # shellcheck disable=SC2086,SC1083 + if [ -n "$(eval echo \${$_mockvarname:-})" ]; then + _debug "sysfs: MOCKING enabled for $file func returns $(eval echo \$$_mockvarname)" +@@ -2411,17 +2411,17 @@ sys_interface_check() + fi + + [ -n "$regex" ] || regex='.*' +- _mockvarname="SMC_MOCK_SYSFS_$(basename "$file")" ++ _mockvarname="SMC_MOCK_SYSFS_$(@basename@ "$file")" + # shellcheck disable=SC2086,SC1083 + if [ -n "$(eval echo \${$_mockvarname:-})" ]; then + fullmsg="$(eval echo \$$_mockvarname)" +- msg=$(echo "$fullmsg" | grep -Eo "$regex") ++ msg=$(echo "$fullmsg" | @grep@ -Eo "$regex") + _debug "sysfs: MOCKING enabled for $file, will return $fullmsg" + mocked=1 + else +- fullmsg=$(cat "$file") +- msg=$(grep -Eo "$regex" "$file") +- mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_SYSFS_$(basename "$file")='$fullmsg'") ++ fullmsg=$(@cat@ "$file") ++ msg=$(@grep@ -Eo "$regex" "$file") ++ mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_SYSFS_$(@basename@ "$file")='$fullmsg'") + fi + if [ "$mode" = silent ]; then + return 0 +@@ -2430,15 +2430,15 @@ sys_interface_check() + return 0 + fi + _info_nol "* Mitigated according to the /sys interface: " +- if echo "$msg" | grep -qi '^not affected'; then ++ if echo "$msg" | @grep@ -qi '^not affected'; then + # Not affected + status=OK + pstatus green YES "$fullmsg" +- elif echo "$msg" | grep -qEi '^(kvm: )?mitigation'; then ++ elif echo "$msg" | @grep@ -qEi '^(kvm: )?mitigation'; then + # Mitigation: PTI + status=OK + pstatus green YES "$fullmsg" +- elif echo "$msg" | grep -qi '^vulnerable'; then ++ elif echo "$msg" | @grep@ -qi '^vulnerable'; then + # Vulnerable + status=VULN + pstatus yellow NO "$fullmsg" +@@ -2526,20 +2526,20 @@ write_msr_one_core() + # ret=4: msr doesn't exist, ret=127: msr.allow_writes=off + [ "$ret" = 127 ] && _write_denied=1 + # or fallback to dd if it supports seek_bytes, we prefer it over perl because we can tell the difference between EPERM and EIO +- elif dd if=/dev/null of=/dev/null bs=8 count=1 seek="$_msr_dec" oflag=seek_bytes 2>/dev/null && [ "${SMC_NO_DD:-}" != 1 ]; then ++ elif @dd@ if=/dev/null of=/dev/null bs=8 count=1 seek="$_msr_dec" oflag=seek_bytes 2>/dev/null && [ "${SMC_NO_DD:-}" != 1 ]; then + _debug "write_msr: using dd" +- dd if=/dev/zero of=/dev/cpu/"$_core"/msr bs=8 count=1 seek="$_msr_dec" oflag=seek_bytes 2>/dev/null; ret=$? ++ @dd@ if=/dev/zero of=/dev/cpu/"$_core"/msr bs=8 count=1 seek="$_msr_dec" oflag=seek_bytes 2>/dev/null; ret=$? + # if it failed, inspect stderrto look for EPERM + if [ "$ret" != 0 ]; then +- if dd if=/dev/zero of=/dev/cpu/"$_core"/msr bs=8 count=1 seek="$_msr_dec" oflag=seek_bytes 2>&1 | grep -qF 'Operation not permitted'; then ++ if @dd@ if=/dev/zero of=/dev/cpu/"$_core"/msr bs=8 count=1 seek="$_msr_dec" oflag=seek_bytes 2>&1 | @grep@ -qF 'Operation not permitted'; then + _write_denied=1 + fi + fi + # or if we have perl, use it, any 5.x version will work +- elif command -v perl >/dev/null 2>&1 && [ "${SMC_NO_PERL:-}" != 1 ]; then ++ elif command -v @perl@ >/dev/null 2>&1 && [ "${SMC_NO_PERL:-}" != 1 ]; then + _debug "write_msr: using perl" + ret=1 +- perl -e "open(M,'>','/dev/cpu/$_core/msr') and seek(M,$_msr_dec,0) and exit(syswrite(M,pack('H16',0)))"; [ $? -eq 8 ] && ret=0 ++ @perl@ -e "open(M,'>','/dev/cpu/$_core/msr') and seek(M,$_msr_dec,0) and exit(syswrite(M,pack('H16',0)))"; [ $? -eq 8 ] && ret=0 + else + _debug "write_msr: got no wrmsr, perl or recent enough dd!" + mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_WRMSR_${_msr}_RET=$WRITE_MSR_RET_ERR") +@@ -2561,13 +2561,13 @@ write_msr_one_core() + msr_locked_down=1 + write_msr_msg="your kernel is configured to deny writes to MSRs from user space" + return $WRITE_MSR_RET_LOCKDOWN +- elif dmesg | grep -qF "msr: Direct access to MSR"; then ++ elif @dmesg@ | @grep@ -qF "msr: Direct access to MSR"; then + _debug "write_msr: locked down kernel detected (Red Hat / Fedora)" + mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_WRMSR_${_msr}_RET=$WRITE_MSR_RET_LOCKDOWN") + msr_locked_down=1 + write_msr_msg="your kernel is locked down (Fedora/Red Hat), please reboot without secure boot and retry" + return $WRITE_MSR_RET_LOCKDOWN +- elif dmesg | grep -qF "raw MSR access is restricted"; then ++ elif @dmesg@ | @grep@ -qF "raw MSR access is restricted"; then + _debug "write_msr: locked down kernel detected (vanilla)" + mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_WRMSR_${_msr}_RET=$WRITE_MSR_RET_LOCKDOWN") + msr_locked_down=1 +@@ -2666,8 +2666,8 @@ read_msr_one_core() + return $READ_MSR_RET_KO + fi + # MSR 0x10: 0x000003e1 0xb106dded +- _msr_h=$(echo "$_msr" | awk '{print $3}'); +- _msr_l=$(echo "$_msr" | awk '{print $4}'); ++ _msr_h=$(echo "$_msr" | @awk@ '{print $3}'); ++ _msr_l=$(echo "$_msr" | @awk@ '{print $4}'); + read_msr_value=$(( _msr_h << 32 | _msr_l )) + else + # for Linux +@@ -2678,15 +2678,15 @@ read_msr_one_core() + # if rdmsr is available, use it + elif command -v rdmsr >/dev/null 2>&1 && [ "${SMC_NO_RDMSR:-}" != 1 ]; then + _debug "read_msr: using rdmsr on $_msr" +- read_msr_value=$(rdmsr -r $_msr_dec 2>/dev/null | od -t u8 -A n) ++ read_msr_value=$(rdmsr -r $_msr_dec 2>/dev/null | @od@ -t u8 -A n) + # or if we have perl, use it, any 5.x version will work +- elif command -v perl >/dev/null 2>&1 && [ "${SMC_NO_PERL:-}" != 1 ]; then ++ elif command -v @perl@ >/dev/null 2>&1 && [ "${SMC_NO_PERL:-}" != 1 ]; then + _debug "read_msr: using perl on $_msr" +- read_msr_value=$(perl -e "open(M,'<','/dev/cpu/$_core/msr') and seek(M,$_msr_dec,0) and read(M,\$_,8) and print" | od -t u8 -A n) ++ read_msr_value=$(@perl@ -e "open(M,'<','/dev/cpu/$_core/msr') and seek(M,$_msr_dec,0) and read(M,\$_,8) and print" | @od@ -t u8 -A n) + # fallback to dd if it supports skip_bytes +- elif dd if=/dev/null of=/dev/null bs=8 count=1 skip="$_msr_dec" iflag=skip_bytes 2>/dev/null; then ++ elif @dd@ if=/dev/null of=/dev/null bs=8 count=1 skip="$_msr_dec" iflag=skip_bytes 2>/dev/null; then + _debug "read_msr: using dd on $_msr" +- read_msr_value=$(dd if=/dev/cpu/"$_core"/msr bs=8 count=1 skip="$_msr_dec" iflag=skip_bytes 2>/dev/null | od -t u8 -A n) ++ read_msr_value=$(@dd@ if=/dev/cpu/"$_core"/msr bs=8 count=1 skip="$_msr_dec" iflag=skip_bytes 2>/dev/null | @od@ -t u8 -A n) + else + _debug "read_msr: got no rdmsr, perl or recent enough dd!" + mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_RDMSR_${_msr}_RET=$READ_MSR_RET_ERR") +@@ -2710,7 +2710,7 @@ check_cpu() + { + _info "\033[1;34mHardware check\033[0m" + +- if ! uname -m | grep -qwE 'x86_64|i[3-6]86|amd64'; then ++ if ! @uname@ -m | @grep@ -qwE 'x86_64|i[3-6]86|amd64'; then + return + fi + +@@ -3326,19 +3326,19 @@ check_redhat_canonical_spectre() + # if we were already called, don't do it again + [ -n "${redhat_canonical_spectre:-}" ] && return + +- if ! command -v "${opt_arch_prefix}strings" >/dev/null 2>&1; then ++ if ! command -v "@strings@" >/dev/null 2>&1; then + redhat_canonical_spectre=-1 + elif [ -n "$kernel_err" ]; then + redhat_canonical_spectre=-2 + else + # Red Hat / Ubuntu specific variant1 patch is difficult to detect, + # let's use the two same tricks than the official Red Hat detection script uses: +- if "${opt_arch_prefix}strings" "$kernel" | grep -qw noibrs && "${opt_arch_prefix}strings" "$kernel" | grep -qw noibpb; then ++ if "@strings@" "$kernel" | @grep@ -qw noibrs && "@strings@" "$kernel" | @grep@ -qw noibpb; then + # 1) detect their specific variant2 patch. If it's present, it means + # that the variant1 patch is also present (both were merged at the same time) + _debug "found redhat/canonical version of the variant2 patch (implies variant1)" + redhat_canonical_spectre=1 +- elif "${opt_arch_prefix}strings" "$kernel" | grep -q 'x86/pti:'; then ++ elif "@strings@" "$kernel" | @grep@ -q 'x86/pti:'; then + # 2) detect their specific variant3 patch. If it's present, but the variant2 + # is not, it means that only variant1 is present in addition to variant3 + _debug "found redhat/canonical version of the variant3 patch (implies variant1 but not variant2)" +@@ -3363,13 +3363,13 @@ check_has_vmm() + # If we find no evidence that this is the case, assume we're not (to avoid scaring users), + # this can always be overridden with --vmm in any case. + has_vmm=0 +- if command -v pgrep >/dev/null 2>&1; then ++ if command -v @pgrep@ >/dev/null 2>&1; then + # remove xenbus and xenwatch, also present inside domU + # remove libvirtd as it can also be used to manage containers and not VMs + # for each binary we want to grep, get the pids + for _binary in qemu kvm xenstored xenconsoled + do +- for _pid in $(pgrep -x $_binary) ++ for _pid in $(@pgrep@ -x $_binary) + do + # resolve the exe symlink, if it doesn't resolve with -m, + # which doesn't even need the dest to exist, it means the symlink +@@ -3385,7 +3385,7 @@ check_has_vmm() + else + # ignore SC2009 as `ps ax` is actually used as a fallback if `pgrep` isn't installed + # shellcheck disable=SC2009 +- if command -v ps >/devnull && ps ax | grep -vw grep | grep -q -e '\/devnull && ps ax | @grep@ -vw grep | @grep@ -q -e '\/dev/null 2>&1; then ++ elif ! command -v @perl@ >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing 'perl' binary, please install it" + else +- perl -ne '/\x0f\x83....\x48\x19\xd2\x48\x21\xd0/ and $found++; END { exit($found) }' "$kernel"; ret=$? ++ @perl@ -ne '/\x0f\x83....\x48\x19\xd2\x48\x21\xd0/ and $found++; END { exit($found) }' "$kernel"; ret=$? + if [ $ret -gt 0 ]; then + pstatus green YES "$ret occurrence(s) found of x86 64 bits array_index_mask_nospec()" + v1_mask_nospec="x86 64 bits array_index_mask_nospec" + else +- perl -ne '/\x3b\x82..\x00\x00\x73.\x19\xd2\x21\xd0/ and $found++; END { exit($found) }' "$kernel"; ret=$? ++ @perl@ -ne '/\x3b\x82..\x00\x00\x73.\x19\xd2\x21\xd0/ and $found++; END { exit($found) }' "$kernel"; ret=$? + if [ $ret -gt 0 ]; then + pstatus green YES "$ret occurrence(s) found of x86 32 bits array_index_mask_nospec()" + v1_mask_nospec="x86 32 bits array_index_mask_nospec" + else +- ret=$("${opt_arch_prefix}objdump" $objdump_options "$kernel" | grep -w -e f3af8014 -e e320f014 -B2 | grep -B1 -w sbc | grep -w -c cmp) ++ ret=$("@objdump@" $objdump_options "$kernel" | @grep@ -w -e f3af8014 -e e320f014 -B2 | @grep@ -B1 -w sbc | @grep@ -w -c cmp) + if [ "$ret" -gt 0 ]; then + pstatus green YES "$ret occurrence(s) found of arm 32 bits array_index_mask_nospec()" + v1_mask_nospec="arm 32 bits array_index_mask_nospec" +@@ -3526,12 +3526,12 @@ check_CVE_2017_5753_linux() + pstatus yellow NO + elif [ -n "$kernel_err" ]; then + pstatus yellow UNKNOWN "couldn't check ($kernel_err)" +- elif ! command -v perl >/dev/null 2>&1; then ++ elif ! command -v @perl@ >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing 'perl' binary, please install it" +- elif ! command -v "${opt_arch_prefix}objdump" >/dev/null 2>&1; then ++ elif ! command -v "@objdump@" >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing '${opt_arch_prefix}objdump' tool, please install it, usually it's in the binutils package" + else +- "${opt_arch_prefix}objdump" $objdump_options "$kernel" | perl -ne 'push @r, $_; /\s(hint|csdb)\s/ && $r[0]=~/\ssub\s+(x\d+)/ && $r[1]=~/\sbic\s+$1,\s+$1,/ && $r[2]=~/\sand\s/ && exit(9); shift @r if @r>3'; ret=$? ++ "@objdump@" $objdump_options "$kernel" | @perl@ -ne 'push @r, $_; /\s(hint|csdb)\s/ && $r[0]=~/\ssub\s+(x\d+)/ && $r[1]=~/\sbic\s+$1,\s+$1,/ && $r[2]=~/\sand\s/ && exit(9); shift @r if @r>3'; ret=$? + if [ "$ret" -eq 9 ]; then + pstatus green YES "mask_nospec64 macro is present and used" + v1_mask_nospec="arm64 mask_nospec64" +@@ -3553,12 +3553,12 @@ check_CVE_2017_5753_linux() + pstatus yellow NO + elif [ -n "$kernel_err" ]; then + pstatus yellow UNKNOWN "couldn't check ($kernel_err)" +- elif ! command -v perl >/dev/null 2>&1; then ++ elif ! command -v @perl@ >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing 'perl' binary, please install it" +- elif ! command -v "${opt_arch_prefix}objdump" >/dev/null 2>&1; then ++ elif ! command -v "@objdump@" >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing '${opt_arch_prefix}objdump' tool, please install it, usually it's in the binutils package" + else +- "${opt_arch_prefix}objdump" -d "$kernel" | perl -ne 'push @r, $_; /\s(hint|csdb)\s/ && $r[0]=~/\smov\s+(w\d+),\s+(w\d+)/ && $r[1]=~/\scmp\s+(x\d+),\s+(x\d+)/ && $r[2]=~/\sngc\s+$2,/ && exit(9); shift @r if @r>3'; ret=$? ++ "@objdump@" -d "$kernel" | @perl@ -ne 'push @r, $_; /\s(hint|csdb)\s/ && $r[0]=~/\smov\s+(w\d+),\s+(w\d+)/ && $r[1]=~/\scmp\s+(x\d+),\s+(x\d+)/ && $r[2]=~/\sngc\s+$2,/ && exit(9); shift @r if @r>3'; ret=$? + if [ "$ret" -eq 9 ]; then + pstatus green YES "array_index_nospec macro is present and used" + v1_mask_nospec="arm64 array_index_nospec" +@@ -3574,7 +3574,7 @@ check_CVE_2017_5753_linux() + if [ -n "$kernel_err" ]; then + pstatus yellow UNKNOWN "couldn't check ($kernel_err)" + else +- if ! command -v "${opt_arch_prefix}objdump" >/dev/null 2>&1; then ++ if ! command -v "@objdump@" >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing '${opt_arch_prefix}objdump' tool, please install it, usually it's in the binutils package" + else + # here we disassemble the kernel and count the number of occurrences of the LFENCE opcode +@@ -3584,7 +3584,7 @@ check_CVE_2017_5753_linux() + # so let's push the threshold to 70. + # v0.33+: now only count lfence opcodes after a jump, way less error-prone + # non patched kernel have between 0 and 20 matches, patched ones have at least 40-45 +- nb_lfence=$("${opt_arch_prefix}objdump" $objdump_options "$kernel" 2>/dev/null | grep -w -B1 lfence | grep -Ewc 'jmp|jne|je') ++ nb_lfence=$("@objdump@" $objdump_options "$kernel" 2>/dev/null | @grep@ -w -B1 lfence | @grep@ -Ewc 'jmp|jne|je') + if [ "$nb_lfence" -lt 30 ]; then + pstatus yellow NO "only $nb_lfence jump-then-lfence instructions found, should be >= 30 (heuristic)" + else +@@ -3655,7 +3655,7 @@ check_CVE_2017_5715() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2017_5715_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2017_5715_bsd + else + _warn "Unsupported OS ($os)" +@@ -3697,13 +3697,13 @@ check_CVE_2017_5715_linux() + # /proc/sys/kernel/ibrs_enabled: OpenSUSE tumbleweed + specex_knob_dir=$dir + ibrs_supported="$dir/ibrs_enabled exists" +- ibrs_enabled=$(cat "$dir/ibrs_enabled" 2>/dev/null) ++ ibrs_enabled=$(@cat@ "$dir/ibrs_enabled" 2>/dev/null) + _debug "ibrs: found $dir/ibrs_enabled=$ibrs_enabled" + # if ibrs_enabled is there, ibpb_enabled will be in the same dir + if [ -e "$dir/ibpb_enabled" ]; then + # if the file is there, we have IBPB compiled-in (see note above for IBRS) + ibpb_supported="$dir/ibpb_enabled exists" +- ibpb_enabled=$(cat "$dir/ibpb_enabled" 2>/dev/null) ++ ibpb_enabled=$(@cat@ "$dir/ibpb_enabled" 2>/dev/null) + _debug "ibpb: found $dir/ibpb_enabled=$ibpb_enabled" + else + _debug "ibpb: $dir/ibpb_enabled file doesn't exist" +@@ -3718,7 +3718,7 @@ check_CVE_2017_5715_linux() + # which in that case means ibrs is supported *and* enabled for kernel & user + # as per the ibrs patch series v3 + if [ -z "$ibrs_supported" ]; then +- if grep ^flags "$procfs/cpuinfo" | grep -qw spec_ctrl_ibrs; then ++ if @grep@ ^flags "$procfs/cpuinfo" | @grep@ -qw spec_ctrl_ibrs; then + _debug "ibrs: found spec_ctrl_ibrs flag in $procfs/cpuinfo" + ibrs_supported="spec_ctrl_ibrs flag in $procfs/cpuinfo" + # enabled=2 -> kernel & user +@@ -3728,13 +3728,13 @@ check_CVE_2017_5715_linux() + fi + if [ -n "$fullmsg" ]; then + # when IBPB is enabled on 4.15+, we can see it in sysfs +- if echo "$fullmsg" | grep -q 'IBPB'; then ++ if echo "$fullmsg" | @grep@ -q 'IBPB'; then + _debug "ibpb: found enabled in sysfs" + [ -z "$ibpb_supported" ] && ibpb_supported='IBPB found enabled in sysfs' + [ -z "$ibpb_enabled" ] && ibpb_enabled=1 + fi + # when IBRS_FW is enabled on 4.15+, we can see it in sysfs +- if echo "$fullmsg" | grep -q ', IBRS_FW'; then ++ if echo "$fullmsg" | @grep@ -q ', IBRS_FW'; then + _debug "ibrs: found IBRS_FW in sysfs" + [ -z "$ibrs_supported" ] && ibrs_supported='found IBRS_FW in sysfs' + ibrs_fw_enabled=1 +@@ -3742,13 +3742,13 @@ check_CVE_2017_5715_linux() + # when IBRS is enabled on 4.15+, we can see it in sysfs + # on a more recent kernel, classic "IBRS" is not even longer an option, because of the performance impact. + # only "Enhanced IBRS" is available (on CPUs with the IBRS_ALL flag) +- if echo "$fullmsg" | grep -q -e '\' -e 'Indirect Branch Restricted Speculation'; then ++ if echo "$fullmsg" | @grep@ -q -e '\' -e 'Indirect Branch Restricted Speculation'; then + _debug "ibrs: found IBRS in sysfs" + [ -z "$ibrs_supported" ] && ibrs_supported='found IBRS in sysfs' + [ -z "$ibrs_enabled" ] && ibrs_enabled=3 + fi + # checking for 'Enhanced IBRS' in sysfs, enabled on CPUs with IBRS_ALL +- if echo "$fullmsg" | grep -q -e 'Enhanced IBRS'; then ++ if echo "$fullmsg" | @grep@ -q -e 'Enhanced IBRS'; then + [ -z "$ibrs_supported" ] && ibrs_supported='found Enhanced IBRS in sysfs' + # 4 isn't actually a valid value of the now extinct "ibrs_enabled" flag file, + # that only went from 0 to 3, so we use 4 as "enhanced ibrs is enabled" +@@ -3767,11 +3767,11 @@ check_CVE_2017_5715_linux() + fi + fi + if [ -z "$ibrs_supported" ] && [ -n "$kernel" ]; then +- if ! command -v "${opt_arch_prefix}strings" >/dev/null 2>&1; then ++ if ! command -v "@strings@" >/dev/null 2>&1; then + : + else + ibrs_can_tell=1 +- ibrs_supported=$("${opt_arch_prefix}strings" "$kernel" | grep -Fw -e ', IBRS_FW' | head -1) ++ ibrs_supported=$("@strings@" "$kernel" | @grep@ -Fw -e ', IBRS_FW' | @head@ -1) + if [ -n "$ibrs_supported" ]; then + _debug "ibrs: found ibrs evidence in kernel image ($ibrs_supported)" + ibrs_supported="found '$ibrs_supported' in kernel image" +@@ -3780,7 +3780,7 @@ check_CVE_2017_5715_linux() + fi + if [ -z "$ibrs_supported" ] && [ -n "$opt_map" ]; then + ibrs_can_tell=1 +- if grep -q spec_ctrl "$opt_map"; then ++ if @grep@ -q spec_ctrl "$opt_map"; then + ibrs_supported="found spec_ctrl in symbols file" + _debug "ibrs: found '*spec_ctrl*' symbol in $opt_map" + fi +@@ -3788,11 +3788,11 @@ check_CVE_2017_5715_linux() + # recent (4.15) vanilla kernels have IBPB but not IBRS, and without the debugfs tunables of Red Hat + # we can detect it directly in the image + if [ -z "$ibpb_supported" ] && [ -n "$kernel" ]; then +- if ! command -v "${opt_arch_prefix}strings" >/dev/null 2>&1; then ++ if ! command -v "@strings@" >/dev/null 2>&1; then + : + else + ibpb_can_tell=1 +- ibpb_supported=$("${opt_arch_prefix}strings" "$kernel" | grep -Fw -e 'ibpb' -e ', IBPB' | head -1) ++ ibpb_supported=$("@strings@" "$kernel" | @grep@ -Fw -e 'ibpb' -e ', IBPB' | @head@ -1) + if [ -n "$ibpb_supported" ]; then + _debug "ibpb: found ibpb evidence in kernel image ($ibpb_supported)" + ibpb_supported="found '$ibpb_supported' in kernel image" +@@ -3841,9 +3841,9 @@ check_CVE_2017_5715_linux() + 2) if [ "$ibrs_fw_enabled" = 1 ]; then pstatus green YES "for kernel, user space, and firmware code" ; else pstatus green YES "for both kernel and user space"; fi;; + 3) if [ "$ibrs_fw_enabled" = 1 ]; then pstatus green YES "for kernel and firmware code"; else pstatus green YES; fi;; + 4) pstatus green YES "Enhanced flavor, performance impact will be greatly reduced";; +- *) if [ "$cpuid_ibrs" != 'SPEC_CTRL' ] && [ "$cpuid_ibrs" != 'IBRS_SUPPORT' ] && [ "$cpuid_spec_ctrl" != -1 ]; +- then pstatus yellow NO; _debug "ibrs: known cpu not supporting SPEC-CTRL or IBRS"; +- else ++ *) if [ "$cpuid_ibrs" != 'SPEC_CTRL' ] && [ "$cpuid_ibrs" != 'IBRS_SUPPORT' ] && [ "$cpuid_spec_ctrl" != -1 ]; ++ then pstatus yellow NO; _debug "ibrs: known cpu not supporting SPEC-CTRL or IBRS"; ++ else + pstatus yellow UNKNOWN; fi;; + esac + fi +@@ -3894,7 +3894,7 @@ check_CVE_2017_5715_linux() + bp_harden='' + if [ -r "$opt_config" ]; then + bp_harden_can_tell=1 +- bp_harden=$(grep -w 'CONFIG_HARDEN_BRANCH_PREDICTOR=y' "$opt_config") ++ bp_harden=$(@grep@ -w 'CONFIG_HARDEN_BRANCH_PREDICTOR=y' "$opt_config") + if [ -n "$bp_harden" ]; then + pstatus green YES + _debug "bp_harden: found '$bp_harden' in $opt_config" +@@ -3902,7 +3902,7 @@ check_CVE_2017_5715_linux() + fi + if [ -z "$bp_harden" ] && [ -n "$opt_map" ]; then + bp_harden_can_tell=1 +- bp_harden=$(grep -w bp_hardening_data "$opt_map") ++ bp_harden=$(@grep@ -w bp_hardening_data "$opt_map") + if [ -n "$bp_harden" ]; then + pstatus green YES + _debug "bp_harden: found '$bp_harden' in $opt_map" +@@ -3920,11 +3920,11 @@ check_CVE_2017_5715_linux() + # We check the RETPOLINE kernel options + retpoline=0 + if [ -r "$opt_config" ]; then +- if grep -q '^CONFIG_RETPOLINE=y' "$opt_config"; then ++ if @grep@ -q '^CONFIG_RETPOLINE=y' "$opt_config"; then + pstatus green YES + retpoline=1 + # shellcheck disable=SC2046 +- _debug 'retpoline: found '$(grep '^CONFIG_RETPOLINE' "$opt_config")" in $opt_config" ++ _debug 'retpoline: found '$(@grep@ '^CONFIG_RETPOLINE' "$opt_config")" in $opt_config" + else + pstatus yellow NO + fi +@@ -3945,8 +3945,8 @@ check_CVE_2017_5715_linux() + # since 5.15.28, this is now "Retpolines" as the implementation was switched to a generic one, + # so we look for both "retpoline" and "retpolines" + if [ "$opt_live" = 1 ] && [ -n "$fullmsg" ]; then +- if echo "$fullmsg" | grep -qwi -e retpoline -e retpolines; then +- if echo "$fullmsg" | grep -qwi minimal; then ++ if echo "$fullmsg" | @grep@ -qwi -e retpoline -e retpolines; then ++ if echo "$fullmsg" | @grep@ -qwi minimal; then + retpoline_compiler=0 + retpoline_compiler_reason="kernel reports minimal retpoline compilation" + else +@@ -3956,19 +3956,19 @@ check_CVE_2017_5715_linux() + fi + elif [ -n "$opt_map" ]; then + # look for the symbol +- if grep -qw noretpoline_setup "$opt_map"; then ++ if @grep@ -qw noretpoline_setup "$opt_map"; then + retpoline_compiler=1 + retpoline_compiler_reason="noretpoline_setup symbol found in System.map" + fi + elif [ -n "$kernel" ]; then + # look for the symbol +- if command -v "${opt_arch_prefix}nm" >/dev/null 2>&1; then ++ if command -v "@nm@" >/dev/null 2>&1; then + # the proper way: use nm and look for the symbol +- if "${opt_arch_prefix}nm" "$kernel" 2>/dev/null | grep -qw 'noretpoline_setup'; then ++ if "@nm@" "$kernel" 2>/dev/null | @grep@ -qw 'noretpoline_setup'; then + retpoline_compiler=1 + retpoline_compiler_reason="noretpoline_setup found in kernel symbols" + fi +- elif grep -q noretpoline_setup "$kernel"; then ++ elif @grep@ -q noretpoline_setup "$kernel"; then + # if we don't have nm, nevermind, the symbol name is long enough to not have + # any false positive using good old grep directly on the binary + retpoline_compiler=1 +@@ -3997,7 +3997,7 @@ check_CVE_2017_5715_linux() + retp_enabled=-1 + if [ "$opt_live" = 1 ]; then + if [ -e "$specex_knob_dir/retp_enabled" ]; then +- retp_enabled=$(cat "$specex_knob_dir/retp_enabled" 2>/dev/null) ++ retp_enabled=$(@cat@ "$specex_knob_dir/retp_enabled" 2>/dev/null) + _debug "retpoline: found $specex_knob_dir/retp_enabled=$retp_enabled" + _info_nol " * Retpoline is enabled: " + if [ "$retp_enabled" = 1 ]; then +@@ -4027,7 +4027,7 @@ check_CVE_2017_5715_linux() + rsb_filling=0 + if [ "$opt_live" = 1 ] && [ "$opt_no_sysfs" != 1 ]; then + # if we're live and we aren't denied looking into /sys, let's do it +- if echo "$msg" | grep -qw RSB; then ++ if echo "$msg" | @grep@ -qw RSB; then + rsb_filling=1 + pstatus green YES + fi +@@ -4036,7 +4036,7 @@ check_CVE_2017_5715_linux() + if [ -n "$kernel_err" ]; then + pstatus yellow UNKNOWN "couldn't check ($kernel_err)" + else +- if grep -qw -e 'Filling RSB on context switch' "$kernel"; then ++ if @grep@ -qw -e 'Filling RSB on context switch' "$kernel"; then + rsb_filling=1 + pstatus green YES + else +@@ -4198,7 +4198,7 @@ check_CVE_2017_5715_bsd() + { + _info "* Mitigation 1" + _info_nol " * Kernel supports IBRS: " +- ibrs_disabled=$(sysctl -n hw.ibrs_disable 2>/dev/null) ++ ibrs_disabled=$(@sysctl@ -n hw.ibrs_disable 2>/dev/null) + if [ -z "$ibrs_disabled" ]; then + pstatus yellow NO + else +@@ -4206,7 +4206,7 @@ check_CVE_2017_5715_bsd() + fi + + _info_nol " * IBRS enabled and active: " +- ibrs_active=$(sysctl -n hw.ibrs_active 2>/dev/null) ++ ibrs_active=$(@sysctl@ -n hw.ibrs_active 2>/dev/null) + if [ "$ibrs_active" = 1 ]; then + pstatus green YES + else +@@ -4219,10 +4219,10 @@ check_CVE_2017_5715_bsd() + if [ -n "$kernel_err" ]; then + pstatus yellow UNKNOWN "couldn't check ($kernel_err)" + else +- if ! command -v "${opt_arch_prefix}readelf" >/dev/null 2>&1; then ++ if ! command -v "@readelf@" >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing '${opt_arch_prefix}readelf' tool, please install it, usually it's in the binutils package" + else +- nb_thunks=$("${opt_arch_prefix}readelf" -s "$kernel" | grep -c -e __llvm_retpoline_ -e __llvm_external_retpoline_ -e __x86_indirect_thunk_) ++ nb_thunks=$("@readelf@" -s "$kernel" | @grep@ -c -e __llvm_retpoline_ -e __llvm_external_retpoline_ -e __x86_indirect_thunk_) + if [ "$nb_thunks" -gt 0 ]; then + retpoline=1 + pstatus green YES "found $nb_thunks thunk(s)" +@@ -4263,7 +4263,7 @@ check_CVE_2017_5715_bsd() + pti_performance_check() + { + _info_nol " * Reduced performance impact of PTI: " +- if [ -e "$procfs/cpuinfo" ] && grep ^flags "$procfs/cpuinfo" | grep -qw pcid; then ++ if [ -e "$procfs/cpuinfo" ] && @grep@ ^flags "$procfs/cpuinfo" | @grep@ -qw pcid; then + cpu_pcid=1 + else + read_cpuid 0x1 0x0 $ECX 17 1 1; ret=$? +@@ -4272,7 +4272,7 @@ pti_performance_check() + fi + fi + +- if [ -e "$procfs/cpuinfo" ] && grep ^flags "$procfs/cpuinfo" | grep -qw invpcid; then ++ if [ -e "$procfs/cpuinfo" ] && @grep@ ^flags "$procfs/cpuinfo" | @grep@ -qw invpcid; then + cpu_invpcid=1 + else + read_cpuid 0x7 0x0 $EBX 10 1 1; ret=$? +@@ -4297,7 +4297,7 @@ check_CVE_2017_5754() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2017_5754_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2017_5754_bsd + else + _warn "Unsupported OS ($os)" +@@ -4319,7 +4319,7 @@ check_CVE_2017_5754_linux() + kpti_can_tell=0 + if [ -n "$opt_config" ]; then + kpti_can_tell=1 +- kpti_support=$(grep -w -e CONFIG_PAGE_TABLE_ISOLATION=y -e CONFIG_KAISER=y -e CONFIG_UNMAP_KERNEL_AT_EL0=y "$opt_config") ++ kpti_support=$(@grep@ -w -e CONFIG_PAGE_TABLE_ISOLATION=y -e CONFIG_KAISER=y -e CONFIG_UNMAP_KERNEL_AT_EL0=y "$opt_config") + if [ -n "$kpti_support" ]; then + _debug "kpti_support: found option '$kpti_support' in $opt_config" + fi +@@ -4329,7 +4329,7 @@ check_CVE_2017_5754_linux() + # so we try to find an exported symbol that is part of the PTI patch in System.map + # parse_kpti: arm + kpti_can_tell=1 +- kpti_support=$(grep -w -e kpti_force_enabled -e parse_kpti "$opt_map") ++ kpti_support=$(@grep@ -w -e kpti_force_enabled -e parse_kpti "$opt_map") + if [ -n "$kpti_support" ]; then + _debug "kpti_support: found '$kpti_support' in $opt_map" + fi +@@ -4339,10 +4339,10 @@ check_CVE_2017_5754_linux() + # nopti option that is part of the patch (kernel command line option) + # 'kpti=': arm + kpti_can_tell=1 +- if ! command -v "${opt_arch_prefix}strings" >/dev/null 2>&1; then ++ if ! command -v "@strings@" >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing '${opt_arch_prefix}strings' tool, please install it, usually it's in the binutils package" + else +- kpti_support=$("${opt_arch_prefix}strings" "$kernel" | grep -w -e nopti -e kpti=) ++ kpti_support=$("@strings@" "$kernel" | @grep@ -w -e nopti -e kpti=) + if [ -n "$kpti_support" ]; then + _debug "kpti_support: found '$kpti_support' in $kernel" + fi +@@ -4369,20 +4369,20 @@ check_CVE_2017_5754_linux() + dmesg_grep="$dmesg_grep|x86/pti: Unmapping kernel while in userspace" + # aarch64 + dmesg_grep="$dmesg_grep|CPU features: detected( feature)?: Kernel page table isolation \(KPTI\)" +- if grep ^flags "$procfs/cpuinfo" | grep -qw pti; then ++ if @grep@ ^flags "$procfs/cpuinfo" | @grep@ -qw pti; then + # vanilla PTI patch sets the 'pti' flag in cpuinfo + _debug "kpti_enabled: found 'pti' flag in $procfs/cpuinfo" + kpti_enabled=1 +- elif grep ^flags "$procfs/cpuinfo" | grep -qw kaiser; then ++ elif @grep@ ^flags "$procfs/cpuinfo" | @grep@ -qw kaiser; then + # kernel line 4.9 sets the 'kaiser' flag in cpuinfo + _debug "kpti_enabled: found 'kaiser' flag in $procfs/cpuinfo" + kpti_enabled=1 + elif [ -e /sys/kernel/debug/x86/pti_enabled ]; then + # Red Hat Backport creates a dedicated file, see https://access.redhat.com/articles/3311301 +- kpti_enabled=$(cat /sys/kernel/debug/x86/pti_enabled 2>/dev/null) ++ kpti_enabled=$(@cat@ /sys/kernel/debug/x86/pti_enabled 2>/dev/null) + _debug "kpti_enabled: file /sys/kernel/debug/x86/pti_enabled exists and says: $kpti_enabled" + elif is_xen_dom0; then +- pti_xen_pv_domU=$(xl dmesg | grep 'XPTI' | grep 'DomU enabled' | head -1) ++ pti_xen_pv_domU=$(xl @dmesg@ | @grep@ 'XPTI' | @grep@ 'DomU enabled' | @head@ -1) + + [ -n "$pti_xen_pv_domU" ] && kpti_enabled=1 + fi +@@ -4457,7 +4457,7 @@ check_CVE_2017_5754_linux() + if [ -n "$kpti_support" ]; then + if [ -e "/sys/kernel/debug/x86/pti_enabled" ]; then + explain "Your kernel supports PTI but it's disabled, you can enable it with \`echo 1 > /sys/kernel/debug/x86/pti_enabled\`" +- elif echo "$kernel_cmdline" | grep -q -w -e nopti -e pti=off; then ++ elif echo "$kernel_cmdline" | @grep@ -q -w -e nopti -e pti=off; then + explain "Your kernel supports PTI but it has been disabled on command-line, remove the nopti or pti=off option from your bootloader configuration" + else + explain "Your kernel supports PTI but it has been disabled, check \`dmesg\` right after boot to find clues why the system disabled it" +@@ -4508,7 +4508,7 @@ check_CVE_2017_5754_linux() + check_CVE_2017_5754_bsd() + { + _info_nol "* Kernel supports Page Table Isolation (PTI): " +- kpti_enabled=$(sysctl -n vm.pmap.pti 2>/dev/null) ++ kpti_enabled=$(@sysctl@ -n vm.pmap.pti 2>/dev/null) + if [ -z "$kpti_enabled" ]; then + pstatus yellow NO + else +@@ -4579,7 +4579,7 @@ check_CVE_2018_3639() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2018_3639_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2018_3639_bsd + else + _warn "Unsupported OS ($os)" +@@ -4598,33 +4598,33 @@ check_CVE_2018_3639_linux() + if [ "$opt_sysfs_only" != 1 ]; then + _info_nol "* Kernel supports disabling speculative store bypass (SSB): " + if [ "$opt_live" = 1 ]; then +- if grep -Eq 'Speculation.?Store.?Bypass:' "$procfs/self/status" 2>/dev/null; then ++ if @grep@ -Eq 'Speculation.?Store.?Bypass:' "$procfs/self/status" 2>/dev/null; then + kernel_ssb="found in $procfs/self/status" + _debug "found Speculation.Store.Bypass: in $procfs/self/status" + fi + fi + # arm64 kernels can have cpu_show_spec_store_bypass with ARM64_SSBD, so exclude them +- if [ -z "$kernel_ssb" ] && [ -n "$kernel" ] && ! grep -q 'arm64_sys_' "$kernel"; then +- kernel_ssb=$("${opt_arch_prefix}strings" "$kernel" | grep spec_store_bypass | head -n1); ++ if [ -z "$kernel_ssb" ] && [ -n "$kernel" ] && ! @grep@ -q 'arm64_sys_' "$kernel"; then ++ kernel_ssb=$("@strings@" "$kernel" | @grep@ spec_store_bypass | @head@ -n1); + [ -n "$kernel_ssb" ] && kernel_ssb="found $kernel_ssb in kernel" + fi + # arm64 kernels can have cpu_show_spec_store_bypass with ARM64_SSBD, so exclude them +- if [ -z "$kernel_ssb" ] && [ -n "$opt_map" ] && ! grep -q 'arm64_sys_' "$opt_map"; then +- kernel_ssb=$(grep spec_store_bypass "$opt_map" | awk '{print $3}' | head -n1) ++ if [ -z "$kernel_ssb" ] && [ -n "$opt_map" ] && ! @grep@ -q 'arm64_sys_' "$opt_map"; then ++ kernel_ssb=$(@grep@ spec_store_bypass "$opt_map" | @awk@ '{print $3}' | @head@ -n1) + [ -n "$kernel_ssb" ] && kernel_ssb="found $kernel_ssb in System.map" + fi + # arm64 only: + if [ -z "$kernel_ssb" ] && [ -n "$opt_map" ]; then +- kernel_ssb=$(grep -w cpu_enable_ssbs "$opt_map" | awk '{print $3}' | head -n1) ++ kernel_ssb=$(@grep@ -w cpu_enable_ssbs "$opt_map" | @awk@ '{print $3}' | @head@ -n1) + [ -n "$kernel_ssb" ] && kernel_ssb="found $kernel_ssb in System.map" + fi + if [ -z "$kernel_ssb" ] && [ -n "$opt_config" ]; then +- kernel_ssb=$(grep -w 'CONFIG_ARM64_SSBD=y' "$opt_config") ++ kernel_ssb=$(@grep@ -w 'CONFIG_ARM64_SSBD=y' "$opt_config") + [ -n "$kernel_ssb" ] && kernel_ssb="CONFIG_ARM64_SSBD enabled in kconfig" + fi + if [ -z "$kernel_ssb" ] && [ -n "$kernel" ]; then + # this string only appears in kernel if CONFIG_ARM64_SSBD is set +- kernel_ssb=$(grep -w "Speculative Store Bypassing Safe (SSBS)" "$kernel") ++ kernel_ssb=$(@grep@ -w "Speculative Store Bypassing Safe (SSBS)" "$kernel") + [ -n "$kernel_ssb" ] && kernel_ssb="found 'Speculative Store Bypassing Safe (SSBS)' in kernel" + fi + # /arm64 only +@@ -4639,31 +4639,31 @@ check_CVE_2018_3639_linux() + if [ "$opt_live" = 1 ]; then + # https://elixir.bootlin.com/linux/v5.0/source/fs/proc/array.c#L340 + _info_nol "* SSB mitigation is enabled and active: " +- if grep -Eq 'Speculation.?Store.?Bypass:[[:space:]]+thread' "$procfs/self/status" 2>/dev/null; then ++ if @grep@ -Eq 'Speculation.?Store.?Bypass:[[:space:]]+thread' "$procfs/self/status" 2>/dev/null; then + kernel_ssbd_enabled=1 + pstatus green YES "per-thread through prctl" +- elif grep -Eq 'Speculation.?Store.?Bypass:[[:space:]]+globally mitigated' "$procfs/self/status" 2>/dev/null; then ++ elif @grep@ -Eq 'Speculation.?Store.?Bypass:[[:space:]]+globally mitigated' "$procfs/self/status" 2>/dev/null; then + kernel_ssbd_enabled=2 + pstatus green YES "global" +- elif grep -Eq 'Speculation.?Store.?Bypass:[[:space:]]+vulnerable' "$procfs/self/status" 2>/dev/null; then ++ elif @grep@ -Eq 'Speculation.?Store.?Bypass:[[:space:]]+vulnerable' "$procfs/self/status" 2>/dev/null; then + kernel_ssbd_enabled=0 + pstatus yellow NO +- elif grep -Eq 'Speculation.?Store.?Bypass:[[:space:]]+not vulnerable' "$procfs/self/status" 2>/dev/null; then ++ elif @grep@ -Eq 'Speculation.?Store.?Bypass:[[:space:]]+not vulnerable' "$procfs/self/status" 2>/dev/null; then + kernel_ssbd_enabled=-2 + pstatus blue NO "not vulnerable" +- elif grep -Eq 'Speculation.?Store.?Bypass:[[:space:]]+unknown' "$procfs/self/status" 2>/dev/null; then ++ elif @grep@ -Eq 'Speculation.?Store.?Bypass:[[:space:]]+unknown' "$procfs/self/status" 2>/dev/null; then + kernel_ssbd_enabled=0 + pstatus blue NO + else +- pstatus blue UNKNOWN "unknown value: $(grep -E 'Speculation.?Store.?Bypass:' "$procfs/self/status" 2>/dev/null | cut -d: -f2-)" ++ pstatus blue UNKNOWN "unknown value: $(@grep@ -E 'Speculation.?Store.?Bypass:' "$procfs/self/status" 2>/dev/null | @cut@ -d: -f2-)" + fi + + if [ "$kernel_ssbd_enabled" = 1 ]; then + _info_nol "* SSB mitigation currently active for selected processes: " + # silence grep's stderr here to avoid ENOENT errors from processes that have exited since the shell's expansion of the * +- mitigated_processes=$(find /proc -mindepth 2 -maxdepth 2 -type f -name status -print0 2>/dev/null \ +- | xargs -r0 grep -El 'Speculation.?Store.?Bypass:[[:space:]]+thread (force )?mitigated' 2>/dev/null \ +- | sed s/status/exe/ | xargs -r -n1 readlink -f 2>/dev/null | xargs -r -n1 basename | sort -u | tr "\n" " " | sed 's/ $//') ++ mitigated_processes=$(@find@ /proc -mindepth 2 -maxdepth 2 -type f -name status -print0 2>/dev/null \ ++ | @xargs@ -r0 @grep@ -El 'Speculation.?Store.?Bypass:[[:space:]]+thread (force )?mitigated' 2>/dev/null \ ++ | @sed@ s/status/exe/ | @xargs@ -r -n1 readlink -f 2>/dev/null | @xargs@ -r -n1 @basename@ | @sort@ -u | @tr@ "\n" " " | @sed@ 's/ $//') + if [ -n "$mitigated_processes" ]; then + pstatus green YES "$mitigated_processes" + else +@@ -4715,7 +4715,7 @@ check_CVE_2018_3639_linux() + check_CVE_2018_3639_bsd() + { + _info_nol "* Kernel supports speculation store bypass: " +- if sysctl hw.spec_store_bypass_disable >/dev/null 2>&1; then ++ if @sysctl@ hw.spec_store_bypass_disable >/dev/null 2>&1; then + kernel_ssb=1 + pstatus green YES + else +@@ -4724,7 +4724,7 @@ check_CVE_2018_3639_bsd() + fi + + _info_nol "* Speculation store bypass is administratively enabled: " +- ssb_enabled=$(sysctl -n hw.spec_store_bypass_disable 2>/dev/null) ++ ssb_enabled=$(@sysctl@ -n hw.spec_store_bypass_disable 2>/dev/null) + _debug "hw.spec_store_bypass_disable=$ssb_enabled" + case "$ssb_enabled" in + 0) pstatus yellow NO "disabled";; +@@ -4734,7 +4734,7 @@ check_CVE_2018_3639_bsd() + esac + + _info_nol "* Speculation store bypass is currently active: " +- ssb_active=$(sysctl -n hw.spec_store_bypass_disable_active 2>/dev/null) ++ ssb_active=$(@sysctl@ -n hw.spec_store_bypass_disable_active 2>/dev/null) + _debug "hw.spec_store_bypass_disable_active=$ssb_active" + case "$ssb_active" in + 1) pstatus green YES;; +@@ -4806,7 +4806,7 @@ check_CVE_2018_3620() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2018_3620_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2018_3620_bsd + else + _warn "Unsupported OS ($os)" +@@ -4824,14 +4824,14 @@ check_CVE_2018_3620_linux() + fi + if [ "$opt_sysfs_only" != 1 ]; then + _info_nol "* Kernel supports PTE inversion: " +- if ! command -v "${opt_arch_prefix}strings" >/dev/null 2>&1; then ++ if ! command -v "@strings@" >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing 'strings' tool, please install it" + pteinv_supported=-1 + elif [ -n "$kernel_err" ]; then + pstatus yellow UNKNOWN "$kernel_err" + pteinv_supported=-1 + else +- if "${opt_arch_prefix}strings" "$kernel" | grep -Fq 'PTE Inversion'; then ++ if "@strings@" "$kernel" | @grep@ -Fq 'PTE Inversion'; then + pstatus green YES "found in kernel image" + _debug "pteinv: found pte inversion evidence in kernel image" + pteinv_supported=1 +@@ -4844,7 +4844,7 @@ check_CVE_2018_3620_linux() + _info_nol "* PTE inversion enabled and active: " + if [ "$opt_live" = 1 ]; then + if [ -n "$fullmsg" ]; then +- if echo "$fullmsg" | grep -q 'Mitigation: PTE Inversion'; then ++ if echo "$fullmsg" | @grep@ -q 'Mitigation: PTE Inversion'; then + pstatus green YES + pteinv_active=1 + else +@@ -4892,7 +4892,7 @@ check_CVE_2018_3620_bsd() + else + _debug "vmm module already loaded" + fi +- if sysctl hw.vmm.vmx.l1d_flush >/dev/null 2>&1; then ++ if @sysctl@ hw.vmm.vmx.l1d_flush >/dev/null 2>&1; then + # https://security.FreeBSD.org/patches/SA-18:09/l1tf-11.2.patch + # this is very difficult to detect that the kernel reserved the 0 page, but this fix + # is part of the exact same patch than the other L1TF CVE, so we detect it +@@ -4922,7 +4922,7 @@ check_CVE_2018_3646() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2018_3646_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2018_3646_bsd + else + _warn "Unsupported OS ($os)" +@@ -4948,7 +4948,7 @@ check_CVE_2018_3646_linux() + if [ "$opt_live" = 1 ]; then + if ! [ -r /sys/module/kvm_intel/parameters/ept ]; then + pstatus blue N/A "the kvm_intel module is not loaded" +- elif [ "$(cat /sys/module/kvm_intel/parameters/ept)" = N ]; then ++ elif [ "$(@cat@ /sys/module/kvm_intel/parameters/ept)" = N ]; then + pstatus green YES + ept_disabled=1 + else +@@ -4960,15 +4960,15 @@ check_CVE_2018_3646_linux() + + _info "* Mitigation 2" + _info_nol " * L1D flush is supported by kernel: " +- if [ "$opt_live" = 1 ] && grep -qw flush_l1d "$procfs/cpuinfo"; then ++ if [ "$opt_live" = 1 ] && @grep@ -qw flush_l1d "$procfs/cpuinfo"; then + l1d_kernel="found flush_l1d in $procfs/cpuinfo" + fi + if [ -z "$l1d_kernel" ]; then +- if ! command -v "${opt_arch_prefix}strings" >/dev/null 2>&1; then ++ if ! command -v "@strings@" >/dev/null 2>&1; then + l1d_kernel_err="missing '${opt_arch_prefix}strings' tool, please install it, usually it's in the binutils package" + elif [ -n "$kernel_err" ]; then + l1d_kernel_err="$kernel_err" +- elif "${opt_arch_prefix}strings" "$kernel" | grep -qw flush_l1d; then ++ elif "@strings@" "$kernel" | @grep@ -qw flush_l1d; then + l1d_kernel='found flush_l1d in kernel image' + fi + fi +@@ -4989,20 +4989,20 @@ check_CVE_2018_3646_linux() + # $l1dstatus is one of (auto|vulnerable|conditional cache flushes|cache flushes|EPT disabled|flush not necessary) + # $smtstatus is one of (vulnerable|disabled) + # can also just be "Not affected" +- if echo "$fullmsg" | grep -Eq -e 'Not affected' -e '(VMX:|L1D) (EPT disabled|vulnerable|flush not necessary)'; then ++ if echo "$fullmsg" | @grep@ -Eq -e 'Not affected' -e '(VMX:|L1D) (EPT disabled|vulnerable|flush not necessary)'; then + l1d_mode=0 + pstatus yellow NO +- elif echo "$fullmsg" | grep -Eq '(VMX:|L1D) conditional cache flushes'; then ++ elif echo "$fullmsg" | @grep@ -Eq '(VMX:|L1D) conditional cache flushes'; then + l1d_mode=1 + pstatus green YES "conditional flushes" +- elif echo "$fullmsg" | grep -Eq '(VMX:|L1D) cache flushes'; then ++ elif echo "$fullmsg" | @grep@ -Eq '(VMX:|L1D) cache flushes'; then + l1d_mode=2 + pstatus green YES "unconditional flushes" + else + if is_xen_dom0; then +- l1d_xen_hardware=$(xl dmesg | grep 'Hardware features:' | grep 'L1D_FLUSH' | head -1) +- l1d_xen_hypervisor=$(xl dmesg | grep 'Xen settings:' | grep 'L1D_FLUSH' | head -1) +- l1d_xen_pv_domU=$(xl dmesg | grep 'PV L1TF shadowing:' | grep 'DomU enabled' | head -1) ++ l1d_xen_hardware=$(xl @dmesg@ | @grep@ 'Hardware features:' | @grep@ 'L1D_FLUSH' | @head@ -1) ++ l1d_xen_hypervisor=$(xl @dmesg@ | @grep@ 'Xen settings:' | @grep@ 'L1D_FLUSH' | @head@ -1) ++ l1d_xen_pv_domU=$(xl @dmesg@ | @grep@ 'PV L1TF shadowing:' | @grep@ 'DomU enabled' | @head@ -1) + + if [ -n "$l1d_xen_hardware" ] && [ -n "$l1d_xen_hypervisor" ] && [ -n "$l1d_xen_pv_domU" ]; then + l1d_mode=5 +@@ -5033,7 +5033,7 @@ check_CVE_2018_3646_linux() + + _info_nol " * Hardware-backed L1D flush supported: " + if [ "$opt_live" = 1 ]; then +- if grep -qw flush_l1d "$procfs/cpuinfo" || [ -n "$l1d_xen_hardware" ]; then ++ if @grep@ -qw flush_l1d "$procfs/cpuinfo" || [ -n "$l1d_xen_hardware" ]; then + pstatus green YES "performance impact of the mitigation will be greatly reduced" + else + pstatus blue NO "flush will be done in software, this is slower" +@@ -5105,7 +5105,7 @@ check_CVE_2018_3646_linux() + check_CVE_2018_3646_bsd() + { + _info_nol "* Kernel supports L1D flushing: " +- if sysctl hw.vmm.vmx.l1d_flush >/dev/null 2>&1; then ++ if @sysctl@ hw.vmm.vmx.l1d_flush >/dev/null 2>&1; then + pstatus green YES + kernel_l1d_supported=1 + else +@@ -5114,7 +5114,7 @@ check_CVE_2018_3646_bsd() + fi + + _info_nol "* L1D flushing is enabled: " +- kernel_l1d_enabled=$(sysctl -n hw.vmm.vmx.l1d_flush 2>/dev/null) ++ kernel_l1d_enabled=$(@sysctl@ -n hw.vmm.vmx.l1d_flush 2>/dev/null) + case "$kernel_l1d_enabled" in + 0) pstatus yellow NO;; + 1) pstatus green YES;; +@@ -5168,7 +5168,7 @@ check_CVE_2018_12127() + ################### + # MDSUM SECTION + +-# Microarchitectural Data Sampling Uncacheable Memory ++# Microarchitectural Data Sampling Uncacheable Memory + check_CVE_2019_11091() + { + cve='CVE-2019-11091' +@@ -5182,7 +5182,7 @@ check_mds() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_mds_linux "$cve" +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_mds_bsd "$cve" + else + _warn "Unsupported OS ($os)" +@@ -5193,7 +5193,7 @@ check_mds_bsd() + { + _info_nol "* Kernel supports using MD_CLEAR mitigation: " + if [ "$opt_live" = 1 ]; then +- if sysctl hw.mds_disable >/dev/null 2>&1; then ++ if @sysctl@ hw.mds_disable >/dev/null 2>&1; then + pstatus green YES + kernel_md_clear=1 + else +@@ -5201,7 +5201,7 @@ check_mds_bsd() + kernel_md_clear=0 + fi + else +- if grep -Fq hw.mds_disable $opt_kernel; then ++ if @grep@ -Fq hw.mds_disable $opt_kernel; then + pstatus green YES + kernel_md_clear=1 + else +@@ -5211,8 +5211,8 @@ check_mds_bsd() + fi + + _info_nol "* CPU Hyper-Threading (SMT) is disabled: " +- if sysctl machdep.hyperthreading_allowed >/dev/null 2>&1; then +- kernel_smt_allowed=$(sysctl -n machdep.hyperthreading_allowed 2>/dev/null) ++ if @sysctl@ machdep.hyperthreading_allowed >/dev/null 2>&1; then ++ kernel_smt_allowed=$(@sysctl@ -n machdep.hyperthreading_allowed 2>/dev/null) + if [ "$kernel_smt_allowed" = 1 ]; then + pstatus yellow NO + else +@@ -5224,7 +5224,7 @@ check_mds_bsd() + + _info_nol "* Kernel mitigation is enabled: " + if [ "$kernel_md_clear" = 1 ]; then +- kernel_mds_enabled=$(sysctl -n hw.mds_disable 2>/dev/null) ++ kernel_mds_enabled=$(@sysctl@ -n hw.mds_disable 2>/dev/null) + else + kernel_mds_enabled=0 + fi +@@ -5238,7 +5238,7 @@ check_mds_bsd() + + _info_nol "* Kernel mitigation is active: " + if [ "$kernel_md_clear" = 1 ]; then +- kernel_mds_state=$(sysctl -n hw.mds_disable_state 2>/dev/null) ++ kernel_mds_state=$(@sysctl@ -n hw.mds_disable_state 2>/dev/null) + else + kernel_mds_state=inactive + fi +@@ -5296,16 +5296,16 @@ check_mds_linux() + _info_nol "* Kernel supports using MD_CLEAR mitigation: " + kernel_md_clear='' + kernel_md_clear_can_tell=1 +- if [ "$opt_live" = 1 ] && grep ^flags "$procfs/cpuinfo" | grep -qw md_clear; then ++ if [ "$opt_live" = 1 ] && @grep@ ^flags "$procfs/cpuinfo" | @grep@ -qw md_clear; then + kernel_md_clear="md_clear found in $procfs/cpuinfo" + pstatus green YES "$kernel_md_clear" + fi + if [ -z "$kernel_md_clear" ]; then +- if ! command -v "${opt_arch_prefix}strings" >/dev/null 2>&1; then ++ if ! command -v "@strings@" >/dev/null 2>&1; then + kernel_md_clear_can_tell=0 + elif [ -n "$kernel_err" ]; then + kernel_md_clear_can_tell=0 +- elif "${opt_arch_prefix}strings" "$kernel" | grep -q 'Clear CPU buffers'; then ++ elif "@strings@" "$kernel" | @grep@ -q 'Clear CPU buffers'; then + _debug "md_clear: found 'Clear CPU buffers' string in kernel image" + kernel_md_clear='found md_clear implementation evidence in kernel image' + pstatus green YES "$kernel_md_clear" +@@ -5321,7 +5321,7 @@ check_mds_linux() + + if [ "$opt_live" = 1 ] && [ "$sys_interface_available" = 1 ]; then + _info_nol "* Kernel mitigation is enabled and active: " +- if echo "$fullmsg" | grep -qi ^mitigation; then ++ if echo "$fullmsg" | @grep@ -qi ^mitigation; then + mds_mitigated=1 + pstatus green YES + else +@@ -5329,7 +5329,7 @@ check_mds_linux() + pstatus yellow NO + fi + _info_nol "* SMT is either mitigated or disabled: " +- if echo "$fullmsg" | grep -Eq 'SMT (disabled|mitigated)'; then ++ if echo "$fullmsg" | @grep@ -Eq 'SMT (disabled|mitigated)'; then + mds_smt_mitigated=1 + pstatus green YES + else +@@ -5415,7 +5415,7 @@ check_CVE_2019_11135() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2019_11135_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2019_11135_bsd + else + _warn "Unsupported OS ($os)" +@@ -5436,7 +5436,7 @@ check_CVE_2019_11135_linux() + kernel_taa='' + if [ -n "$kernel_err" ]; then + kernel_taa_err="$kernel_err" +- elif grep -q 'tsx_async_abort' "$kernel"; then ++ elif @grep@ -q 'tsx_async_abort' "$kernel"; then + kernel_taa="found tsx_async_abort in kernel image" + fi + if [ -n "$kernel_taa" ]; then +@@ -5450,7 +5450,7 @@ check_CVE_2019_11135_linux() + _info_nol "* TAA mitigation enabled and active: " + if [ "$opt_live" = 1 ]; then + if [ -n "$fullmsg" ]; then +- if echo "$fullmsg" | grep -qE '^Mitigation'; then ++ if echo "$fullmsg" | @grep@ -qE '^Mitigation'; then + pstatus green YES "$fullmsg" + else + pstatus yellow NO +@@ -5485,9 +5485,9 @@ check_CVE_2019_11135_linux() + else + if [ "$opt_paranoid" = 1 ]; then + # in paranoid mode, TSX or SMT enabled are not OK, even if TAA is mitigated +- if ! echo "$fullmsg" | grep -qF 'TSX disabled'; then ++ if ! echo "$fullmsg" | @grep@ -qF 'TSX disabled'; then + pvulnstatus $cve VULN "TSX must be disabled for full mitigation" +- elif echo "$fullmsg" | grep -qF 'SMT vulnerable'; then ++ elif echo "$fullmsg" | @grep@ -qF 'SMT vulnerable'; then + pvulnstatus $cve VULN "SMT (HyperThreading) must be disabled for full mitigation" + else + pvulnstatus $cve "$status" "$msg" +@@ -5517,7 +5517,7 @@ check_CVE_2018_12207() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2018_12207_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2018_12207_bsd + else + _warn "Unsupported OS ($os)" +@@ -5541,7 +5541,7 @@ check_CVE_2018_12207_linux() + if [ -n "$kernel_err" ]; then + kernel_itlbmh_err="$kernel_err" + # commit 5219505fcbb640e273a0d51c19c38de0100ec5a9 +- elif grep -q 'itlb_multihit' "$kernel"; then ++ elif @grep@ -q 'itlb_multihit' "$kernel"; then + kernel_itlbmh="found itlb_multihit in kernel image" + fi + if [ -n "$kernel_itlbmh" ]; then +@@ -5555,7 +5555,7 @@ check_CVE_2018_12207_linux() + _info_nol "* iTLB Multihit mitigation enabled and active: " + if [ "$opt_live" = 1 ]; then + if [ -n "$fullmsg" ]; then +- if echo "$fullmsg" | grep -qF 'Mitigation'; then ++ if echo "$fullmsg" | @grep@ -qF 'Mitigation'; then + pstatus green YES "$fullmsg" + else + pstatus yellow NO +@@ -5597,7 +5597,7 @@ check_CVE_2018_12207_linux() + check_CVE_2018_12207_bsd() + { + _info_nol "* Kernel supports disabling superpages for executable mappings under EPT: " +- kernel_2m_x_ept=$(sysctl -n vm.pmap.allow_2m_x_ept 2>/dev/null) ++ kernel_2m_x_ept=$(@sysctl@ -n vm.pmap.allow_2m_x_ept 2>/dev/null) + if [ -z "$kernel_2m_x_ept" ]; then + pstatus yellow NO + else +@@ -5634,7 +5634,7 @@ check_CVE_2020_0543() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2020_0543_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2020_0543_bsd + else + _warn "Unsupported OS ($os)" +@@ -5655,7 +5655,7 @@ check_CVE_2020_0543_linux() + kernel_srbds='' + if [ -n "$kernel_err" ]; then + kernel_srbds_err="$kernel_err" +- elif grep -q 'Dependent on hypervisor' "$kernel"; then ++ elif @grep@ -q 'Dependent on hypervisor' "$kernel"; then + kernel_srbds="found SRBDS implementation evidence in kernel image. Your kernel is up to date for SRBDS mitigation" + fi + if [ -n "$kernel_srbds" ]; then +@@ -5668,7 +5668,7 @@ check_CVE_2020_0543_linux() + _info_nol "* SRBDS mitigation control is enabled and active: " + if [ "$opt_live" = 1 ]; then + if [ -n "$fullmsg" ]; then +- if echo "$fullmsg" | grep -qE '^Mitigation'; then ++ if echo "$fullmsg" | @grep@ -qE '^Mitigation'; then + pstatus green YES "$fullmsg" + else + pstatus yellow NO +@@ -5758,8 +5758,8 @@ fi + # now run the checks the user asked for + for cve in $supported_cve_list + do +- if [ "$opt_cve_all" = 1 ] || echo "$opt_cve_list" | grep -qw "$cve"; then +- check_"$(echo "$cve" | tr - _)" ++ if [ "$opt_cve_all" = 1 ] || echo "$opt_cve_list" | @grep@ -qw "$cve"; then ++ check_"$(echo "$cve" | @tr@ - _)" + _info + fi + done +@@ -5773,17 +5773,17 @@ if [ "$bad_accuracy" = 1 ]; then + _warn "We're missing some kernel info (see -v), accuracy might be reduced" + fi + +-_vars=$(set | grep -Ev '^[A-Z_[:space:]]' | grep -v -F 'mockme=' | sort | tr "\n" '|') ++_vars=$(set | @grep@ -Ev '^[A-Z_[:space:]]' | @grep@ -v -F 'mockme=' | @sort@ | @tr@ "\n" '|') + _debug "variables at end of script: $_vars" + + if [ -n "$mockme" ] && [ "$opt_mock" = 1 ]; then +- if command -v "gzip" >/dev/null 2>&1; then ++ if command -v "@gzip@" >/dev/null 2>&1; then + # not a useless use of cat: gzipping cpuinfo directly doesn't work well + # shellcheck disable=SC2002 +- if command -v "base64" >/dev/null 2>&1; then +- mock_cpuinfo="$(cat /proc/cpuinfo | gzip -c | base64 -w0)" +- elif command -v "uuencode" >/dev/null 2>&1; then +- mock_cpuinfo="$(cat /proc/cpuinfo | gzip -c | uuencode -m - | grep -Fv 'begin-base64' | grep -Fxv -- '====' | tr -d "\n")" ++ if command -v "@base64@" >/dev/null 2>&1; then ++ mock_cpuinfo="$(@cat@ /proc/cpuinfo | @gzip@ -c | @base64@ -w0)" ++ elif command -v "@uuencode@" >/dev/null 2>&1; then ++ mock_cpuinfo="$(@cat@ /proc/cpuinfo | @gzip@ -c | @uuencode@ -m - | @grep@ -Fv 'begin-base64' | @grep@ -Fxv -- '====' | @tr@ -d "\n")" + fi + fi + if [ -n "$mock_cpuinfo" ]; then +@@ -5792,7 +5792,7 @@ if [ -n "$mockme" ] && [ "$opt_mock" = 1 ]; then + fi + _info "" + # shellcheck disable=SC2046 +- _warn "To mock this CPU, set those vars: "$(echo "$mockme" | sort -u) ++ _warn "To mock this CPU, set those vars: "$(echo "$mockme" | @sort@ -u) + fi + + if [ "$opt_explain" = 0 ]; then +-- +2.38.1 + diff --git a/gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch b/gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch new file mode 100644 index 0000000000..afec52b418 --- /dev/null +++ b/gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch @@ -0,0 +1,26 @@ +From 5b757d930ec0cf102b03fb9817d17e06c72e74b3 Mon Sep 17 00:00:00 2001 +From: Hilton Chain +Date: Sat, 5 Nov 2022 23:22:31 +0800 +Subject: [PATCH] Add support for Guix System kernel. + +--- + spectre-meltdown-checker.sh | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/spectre-meltdown-checker.sh b/spectre-meltdown-checker.sh +index 248a444..855a090 100755 +--- a/spectre-meltdown-checker.sh ++++ b/spectre-meltdown-checker.sh +@@ -2251,6 +2251,8 @@ if [ "$opt_live" = 1 ]; then + [ -e "/boot/kernel-genkernel-$(uname -m)-$(uname -r)" ] && opt_kernel="/boot/kernel-genkernel-$(uname -m)-$(uname -r)" + # NixOS: + [ -e "/run/booted-system/kernel" ] && opt_kernel="/run/booted-system/kernel" ++ # Guix System: ++ [ -e "/run/booted-system/kernel/bzImage" ] && opt_kernel="/run/booted-system/kernel/bzImage" + # systemd kernel-install: + [ -e "/etc/machine-id" ] && [ -e "/boot/$(cat /etc/machine-id)/$(uname -r)/linux" ] && opt_kernel="/boot/$(cat /etc/machine-id)/$(uname -r)/linux" + # Clear Linux: + +base-commit: a6c943d38f315f339697ec26e7374a09b88f2183 +-- +2.38.0 base-commit: 70df5c47a89f4f353a1df94467581a0f0da599a4 -- 2.38.1 From unknown Sun Jun 22 11:49:37 2025 X-Loop: help-debbugs@gnu.org Subject: [bug#59053] [PATCH v2] gnu: Add spectre-meltdown-checker. Resent-From: Liliana Marie Prikler Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Fri, 11 Nov 2022 15:14:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 59053 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: moreinfo patch To: Hilton Chain Cc: 59053@debbugs.gnu.org Received: via spool by 59053-submit@debbugs.gnu.org id=B59053.16681795956714 (code B ref 59053); Fri, 11 Nov 2022 15:14:01 +0000 Received: (at 59053) by debbugs.gnu.org; 11 Nov 2022 15:13:15 +0000 Received: from localhost ([127.0.0.1]:46608 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1otViV-0001kE-Du for submit@debbugs.gnu.org; Fri, 11 Nov 2022 10:13:15 -0500 Received: from mail-ej1-f67.google.com ([209.85.218.67]:35822) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1otViT-0001k1-7X for 59053@debbugs.gnu.org; Fri, 11 Nov 2022 10:13:13 -0500 Received: by mail-ej1-f67.google.com with SMTP id k2so13274588ejr.2 for <59053@debbugs.gnu.org>; Fri, 11 Nov 2022 07:13:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:cc:to:from:subject:message-id:from:to:cc:subject :date:message-id:reply-to; bh=pndj4GH8nhLWOA+vTrfwpptHjHCQPsuCvZvfJl5k1RQ=; b=QSI2fYXakFBJTF1UAJ9KIvahY+tXWP3tvyBZZRnVNn0jsoKMUQpMfbXpQiP2yqBVeb 8fh6qJom+nvW+qam3w+XIviIQ2m1ci8/PJCYV02QuaoDQTXuM3KZXmttLj1J6puV/x41 0gvY4IjLYdx1DX3DNyh50Gmsx/Zhi/lwvA97c4V9KC9wY+pfQ1/ALCHwJJa+73qQOLuf IywQXDQsuBTnQL7M131Nlf+4PiPeHCcSR3FCQhUx+tmxOJZ7Uah0m0cUBK2vHRlVt/JX Cab+kIKllaUGVwckL6Qrrb8krPqHiimyXjipeNyE/keBVcYvGiamG79UgOSnF7aM+E9O Jdzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:cc:to:from:subject:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=pndj4GH8nhLWOA+vTrfwpptHjHCQPsuCvZvfJl5k1RQ=; b=soY4M8B14uYqK9XqyM03cI39gvZ++AfcZk/2buPSiIlq9K0SYWeu3hFllF7ZGGiPnI 35s2IPl8Kc5ra6PpEpYKRybSXB9LYpsYRQz8OJ+xOITUVqQ3mBRdijjjF5INc03eUcb5 vXN5b/wMWtige65eQR7iZzN8gUku1WGjaoO6PewKpQNW8IdybFf2IDY0Xdu8q0WiwLPU j1ni9wLcLMq+PJmioqgRrxMkRyzoyoZVU/f16OVtaMNDyCXY7MAlF8HTunRp4DMYS8l3 iim3lucYOVS5PL0oIH/OfS8+VdIUA4fmn61lz/sB0KvjJ99ChdKEpL4sPYlPJpzBYYnr CyFw== X-Gm-Message-State: ANoB5pmnrXgvgg999KkTfU8MN8dhczT9uyP20nuqGjYCFsdv8aN/1/cm tYWx/uLw7oVSgRQCsZZ6FJSIiCZ1h7E= X-Google-Smtp-Source: AA0mqf6IGlv8hZxDek3ejJsgzUoQPBmtj5Y1heFDdQzhphPmHXaDTJPEdL2H8dKz8xWn78TcEZPOkA== X-Received: by 2002:a17:906:616:b0:7ae:37aa:6bf with SMTP id s22-20020a170906061600b007ae37aa06bfmr2159088ejb.481.1668179585938; Fri, 11 Nov 2022 07:13:05 -0800 (PST) Received: from lumine.fritz.box (85-127-52-93.dsl.dynamic.surfer.at. [85.127.52.93]) by smtp.gmail.com with ESMTPSA id g4-20020a170906538400b0078128c89439sm998852ejo.6.2022.11.11.07.13.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Nov 2022 07:13:04 -0800 (PST) Message-ID: <62dbdc4784403cc138909884b50a399485a2451f.camel@gmail.com> From: Liliana Marie Prikler Date: Fri, 11 Nov 2022 16:13:03 +0100 In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 User-Agent: Evolution 3.46.0 MIME-Version: 1.0 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" SGksCgpBbSBGcmVpdGFnLCBkZW0gMTEuMTEuMjAyMiB1bSAxOToxMCArMDgwMCBzY2hyaWViIEhp bHRvbiBDaGFpbjoKPiAqIGdudS9wYWNrYWdlcy9saW51eC5zY20gKHNwZWN0cmUtbWVsdGRvd24t Y2hlY2tlcik6IE5ldyB2YXJpYWJsZS4KPiAqIGdudS9wYWNrYWdlcy9wYXRjaGVzL3NwZWN0cmUt bWVsdGRvd24tY2hlY2tlci1zdXBwb3J0LWd1aXgtc3lzdGVtLQo+IGtlcm5lbC5wYXRjaDoKPiBO ZXcgZmlsZS4KPiAqIGdudS9wYWNrYWdlcy9wYXRjaGVzL3NwZWN0cmUtbWVsdGRvd24tY2hlY2tl ci1zdGFnZS1jb21tYW5kcy1mb3ItCj4gc3Vic3RpdHV0aW9uLnBhdGNoOgo+IE5ldyBmaWxlLgo+ ICogZ251L3BhY2thZ2VzL3BhdGNoZXMvc3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyLXJlbW92ZS1i dWlsdGluLQo+IGZpcm13YXJlLWRhdGFiYXNlLnBhdGNoOgo+IE5ldyBmaWxlLgo+ICogZ251L2xv Y2FsLm1rIChkaXN0X3BhdGNoX0RBVEEpOiBBZGQgcGF0Y2hlcy4KPiAtLS0KPiB2MSAtPiB2MjoK PiAKPiDCoGdudS9sb2NhbC5ta8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoMKgIDMgKwo+IMKgZ251L3BhY2thZ2Vz L2xpbnV4LnNjbcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg fMKgwqAgNTMgKwo+IMKgLi4ua2VyLXJlbW92ZS1idWlsdGluLWZpcm13YXJlLWRhdGFiYXNlLnBh dGNoIHzCoCA1NTQgKysrKysKPiDCoC4uLmNrZXItc3RhZ2UtY29tbWFuZHMtZm9yLXN1YnN0aXR1 dGlvbi5wYXRjaCB8IDE5NDcKPiArKysrKysrKysrKysrKysrKwo+IMKgLi4ubi1jaGVja2VyLXN1 cHBvcnQtZ3VpeC1zeXN0ZW0ta2VybmVsLnBhdGNoIHzCoMKgIDI2ICsKPiDCoDUgZmlsZXMgY2hh bmdlZCwgMjU4MyBpbnNlcnRpb25zKCspCj4gwqBjcmVhdGUgbW9kZSAxMDA2NDQgZ251L3BhY2th Z2VzL3BhdGNoZXMvc3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyLQo+IHJlbW92ZS1idWlsdGluLWZp cm13YXJlLWRhdGFiYXNlLnBhdGNoCj4gwqBjcmVhdGUgbW9kZSAxMDA2NDQgZ251L3BhY2thZ2Vz L3BhdGNoZXMvc3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyLQo+IHN0YWdlLWNvbW1hbmRzLWZvci1z dWJzdGl0dXRpb24ucGF0Y2gKPiDCoGNyZWF0ZSBtb2RlIDEwMDY0NCBnbnUvcGFja2FnZXMvcGF0 Y2hlcy9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXItCj4gc3VwcG9ydC1ndWl4LXN5c3RlbS1rZXJu ZWwucGF0Y2gKPiAKPiBkaWZmIC0tZ2l0IGEvZ251L2xvY2FsLm1rIGIvZ251L2xvY2FsLm1rCj4g aW5kZXggMjdiMzFlYTI3Zi4uZDUxOGNkODY0MSAxMDA2NDQKPiAtLS0gYS9nbnUvbG9jYWwubWsK PiArKysgYi9nbnUvbG9jYWwubWsKPiBAQCAtMTg1MSw2ICsxODUxLDkgQEAgZGlzdF9wYXRjaF9E QVRBCj4gPcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBcCj4gwqDCoCAlRCUvcGFja2FnZXMvcGF0 Y2hlcy9zeXNsaW51eC1zdHJpcC1nbnUtcHJvcGVydHkucGF0Y2jCoMKgwqDCoMKgwqDCoFwKPiDC oMKgICVEJS9wYWNrYWdlcy9wYXRjaGVzL3NuYXBweS1hZGQtTzItZmxhZy1pbi0KPiBDbWFrZUxp c3RzLnR4dC5wYXRjaMKgwqDCoMKgwqDCoFwKPiDCoMKgICVEJS9wYWNrYWdlcy9wYXRjaGVzL3Nu YXBweS1hZGQtaW5saW5lLWZvci1HQ0MucGF0Y2jCoMKgwqDCoMKgwqDCoMKgwqBcCj4gK8KgICVE JS9wYWNrYWdlcy9wYXRjaGVzL3NwZWN0cmUtbWVsdGRvd24tY2hlY2tlci1zdXBwb3J0LWd1aXgt c3lzdGVtLQo+IGtlcm5lbC5wYXRjaCBcCj4gK8KgICVEJS9wYWNrYWdlcy9wYXRjaGVzL3NwZWN0 cmUtbWVsdGRvd24tY2hlY2tlci1zdGFnZS1jb21tYW5kcy1mb3ItCj4gc3Vic3RpdHV0aW9uLnBh dGNoIFwKPiArwqAgJUQlL3BhY2thZ2VzL3BhdGNoZXMvc3BlY3RyZS1tZWx0ZG93bi1jaGVja2Vy LXJlbW92ZS1idWlsdGluLQo+IGZpcm13YXJlLWRhdGFiYXNlLnBhdGNoIFwKPiDCoMKgICVEJS9w YWNrYWdlcy9wYXRjaGVzL3NwaGlueGJhc2UtZml4LWRveHlnZW4ucGF0Y2jCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBcCj4gwqDCoCAlRCUvcGFja2FnZXMvcGF0Y2hlcy9zcGljZS12ZGFnZW50LWds aWItMi42OC5wYXRjaMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBcCj4gwqDCoCAlRCUvcGFja2FnZXMv cGF0Y2hlcy9zc3NkLW9wdGlvbmFsLXN5c3RlbWQucGF0Y2jCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoFwKPiBkaWZmIC0tZ2l0IGEvZ251L3BhY2thZ2VzL2xpbnV4LnNjbSBiL2dudS9wYWNrYWdl cy9saW51eC5zY20KPiBpbmRleCAyYzA2MjY5NTA0Li41YTBkNTU4MzNhIDEwMDY0NAo+IC0tLSBh L2dudS9wYWNrYWdlcy9saW51eC5zY20KPiArKysgYi9nbnUvcGFja2FnZXMvbGludXguc2NtCj4g QEAgLTk1OTUsMyArOTU5NSw1NiBAQCAoZGVmaW5lLXB1YmxpYyBlZGFjLXV0aWxzCj4gwqBlcnJv ciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gKEVEQUMpLiIpCj4gwqDCoMKgwqAgKGhvbWUtcGFn ZSAiaHR0cHM6Ly9naXRodWIuY29tL2dyb25kby9lZGFjLXV0aWxzIikKPiDCoMKgwqDCoCAobGlj ZW5zZSBsaWNlbnNlOmdwbDIrKSkpCj4gKwo+ICsoZGVmaW5lLXB1YmxpYyBzcGVjdHJlLW1lbHRk b3duLWNoZWNrZXIKPiArwqAgKHBhY2thZ2UKPiArwqDCoMKgIChuYW1lICJzcGVjdHJlLW1lbHRk b3duLWNoZWNrZXIiKQo+ICvCoMKgwqAgKHZlcnNpb24gIjAuNDUiKQo+ICvCoMKgwqAgKHNvdXJj ZSAob3JpZ2luCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChtZXRob2QgZ2l0LWZldGNo KQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAodXJpIChnaXQtcmVmZXJlbmNlCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICh1cmwKPiAiaHR0cHM6Ly9naXRo dWIuY29tL3NwZWVkNDcvc3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyIikKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGNvbW1pdCAoc3RyaW5nLWFwcGVuZCAidiIgdmVy c2lvbikpKSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGZpbGUtbmFtZSAoZ2l0LWZp bGUtbmFtZSBuYW1lIHZlcnNpb24pKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAocGF0 Y2hlcwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChzZWFyY2gtcGF0Y2hlcwo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsKPiBodHRwczovL2dpdGh1Yi5jb20vc3Bl ZWQ0Ny9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXIvcHVsbC80NDEKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgICJzcGVjdHJlLW1lbHRkb3duLWNoZWNrZXItc3VwcG9ydC1ndWl4LXN5 c3RlbS0KPiBrZXJuZWwucGF0Y2giCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCA7 OyBOT1RFOiBVcGRhdGUgdGhlc2UgcGF0Y2hlcyB3aGVuIHVwZGF0aW5nLgo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgInNwZWN0cmUtbWVsdGRvd24tY2hlY2tlci1zdGFnZS1jb21t YW5kcy1mb3ItCj4gc3Vic3RpdHV0aW9uLnBhdGNoIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgInNwZWN0cmUtbWVsdGRvd24tY2hlY2tlci1yZW1vdmUtYnVpbHRpbi1maXJtd2Fy ZS0KPiBkYXRhYmFzZS5wYXRjaCIpKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoc2hh MjU2Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGJhc2UzMgo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAKPiAiMXh4OGg1NzkxbGhjMnh3MGRjYnpqa2tsenZseHd4a2p6 aDhkaTRnOGRpdmZ5MjRmcXNuOCIpKSkpCj4gK8KgwqDCoCAoYnVpbGQtc3lzdGVtIGNvcHktYnVp bGQtc3lzdGVtKQo+ICvCoMKgwqAgKGFyZ3VtZW50cwo+ICvCoMKgwqDCoCAobGlzdCAjOmluc3Rh bGwtcGxhbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoCAjficoKCJzcGVjdHJlLW1lbHRkb3duLWNo ZWNrZXIuc2giICJiaW4vc3BlY3RyZS1tZWx0ZG93bi0KPiBjaGVja2VyIikpCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgICM6cGhhc2VzCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgICN+KG1vZGlmeS1w aGFzZXMgJXN0YW5kYXJkLXBoYXNlcwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChh ZGQtYWZ0ZXIgJ3VucGFjayAnZml4cGF0aAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCAobGFtYmRhKiAoIzprZXkgaW5wdXRzICM6YWxsb3ctb3RoZXIta2V5cykKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChzdWJzdGl0dXRlKiAic3BlY3RyZS1tZWx0 ZG93bi1jaGVja2VyLnNoIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICgoIkBzeXNjdGxAIikgKHNlYXJjaC1pbnB1dC1maWxlIGlucHV0cwo+ICIvc2Jpbi9zeXNj dGwiKSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoKCJAKFth LXowLTldKilAIiBfIG0gXykKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIChzZWFyY2gtaW5wdXQtZmlsZSBpbnB1dHMgKHN0cmluZy1hcHBlbmQKPiAiL2Jpbi8i IG0pKSkpKSkpKSkKSSdkIHByZWZlciAiY29tbWFuZCIgaW5zdGVhZCBvZiBtIGFzIGEgdmFyaWFi bGUgbmFtZSBoZXJlLgo+ICvCoMKgwqAgKGlucHV0cwo+ICvCoMKgwqDCoCAobGlzdCBiaW51dGls cwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb3JldXRpbHMKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqAgZ3JlcAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoCBrbW9kCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgIGx6NAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoCBsem9wCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgIHBlcmwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJvY3BzCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgIHNoYXJ1dGlscwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoCB1dGlsLWxpbnV4Cj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgIHdoaWNoCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgIHpzdGQpKQo+ ICvCoMKgwqAgKGhvbWUtcGFnZQo+ICJodHRwczovL2dpdGh1Yi5jb20vc3BlZWQ0Ny9zcGVjdHJl LW1lbHRkb3duLWNoZWNrZXIiKQo+ICvCoMKgwqAgKHN5bm9wc2lzICJDUFUgdnVsbmVyYWJpbGl0 eSAvIG1pdGlnYXRpb24gY2hlY2tlciIpCj4gK8KgwqDCoCAoZGVzY3JpcHRpb24KPiArwqDCoMKg wqAgIlRoaXMgcGFja2FnZSBwcm92aWRlcyBhIHNoZWxsIHNjcmlwdCB0byBhc3Nlc3MgeW91ciBz eXN0ZW0ncwo+IHJlc2lsaWVuY2UKPiArYWdhaW5zdCB0aGUgc2V2ZXJhbCB0cmFuc2llbnQgZXhl Y3V0aW9uIENWRXMgdGhhdCB3ZXJlIHB1Ymxpc2hlZAo+IHNpbmNlIGVhcmx5Cj4gKzIwMTgsIGFu ZCBnaXZlIHlvdSBndWlkYW5jZSBhcyB0byBob3cgdG8gbWl0aWdhdGUgdGhlbS4iKQo+ICvCoMKg wqAgKGxpY2Vuc2UgbGljZW5zZTpncGwzKSkpCj4gZGlmZiAtLWdpdCBhL2dudS9wYWNrYWdlcy9w YXRjaGVzL3NwZWN0cmUtbWVsdGRvd24tY2hlY2tlci1yZW1vdmUtCj4gYnVpbHRpbi1maXJtd2Fy ZS1kYXRhYmFzZS5wYXRjaCBiL2dudS9wYWNrYWdlcy9wYXRjaGVzL3NwZWN0cmUtCj4gbWVsdGRv d24tY2hlY2tlci1yZW1vdmUtYnVpbHRpbi1maXJtd2FyZS1kYXRhYmFzZS5wYXRjaAo+IG5ldyBm aWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMC4uZTkyNjU1MTU1MAo+IC0tLSAvZGV2 L251bGwKPiArKysgYi9nbnUvcGFja2FnZXMvcGF0Y2hlcy9zcGVjdHJlLW1lbHRkb3duLWNoZWNr ZXItcmVtb3ZlLWJ1aWx0aW4tCj4gZmlybXdhcmUtZGF0YWJhc2UucGF0Y2gKPiBAQCAtMCwwICsx LDU1NCBAQAo+ICtGcm9tIGFjNGJiMmU2MWU0ZThkMTk1ZDU2MDAxNDgxNmUxMDdiMzE1ODE3ZmYg TW9uIFNlcCAxNyAwMDowMDowMAo+IDIwMDEKPiArRnJvbTogSGlsdG9uIENoYWluIDxoYWtvQHVs dHJhcmFyZS5zcGFjZT4KPiArRGF0ZTogRnJpLCAxMSBOb3YgMjAyMiAxODo1NToyNSArMDgwMAo+ ICtTdWJqZWN0OiBbUEFUQ0ggMi8yXSBSZW1vdmUgYnVpbHRpbiBmaXJtd2FyZSBkYXRhYmFzZS4K PiArCj4gKy0tLQo+ICsgc3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyLnNoIHwgNDc3ICsrLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+IC0tLQo+ICsgMSBmaWxlIGNoYW5nZWQsIDI3IGlu c2VydGlvbnMoKyksIDQ1MCBkZWxldGlvbnMoLSkKPiArCj4gK2RpZmYgLS1naXQgYS9zcGVjdHJl LW1lbHRkb3duLWNoZWNrZXIuc2ggYi9zcGVjdHJlLW1lbHRkb3duLQo+IGNoZWNrZXIuc2gKPiAr aW5kZXggODJjZjFiNi4uNzljNGJiNyAxMDA3NTUKPiArLS0tIGEvc3BlY3RyZS1tZWx0ZG93bi1j aGVja2VyLnNoCj4gKysrKyBiL3NwZWN0cmUtbWVsdGRvd24tY2hlY2tlci5zaAo+ICtAQCAtOTUs NyArOTUsNiBAQCBzaG93X3VzYWdlKCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg LS1jcHUgWyMsYWxsXcKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpbnRlcmFjdCB3aXRoIENQVUlEIGFu ZCBNU1IKPiBvZiBDUFUgY29yZSBudW1iZXIgIywgb3IgYWxsIChkZWZhdWx0OiBDUFUgY29yZSAw KQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAtLXVwZGF0ZS1md2RiwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHVwZGF0ZSBvdXIgbG9jYWwgY29weSBvZiB0aGUKPiBDUFUgbWljcm9jb2Rl cyB2ZXJzaW9ucyBkYXRhYmFzZSAodXNpbmcgdGhlIGF3ZXNvbWUKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgTUNFeHRyYWN0b3IgcHJvamVjdCBhbmQgdGhlCj4gSW50ZWwgZmlybXdhcmVzIEdpdEh1 YiByZXBvc2l0b3J5KQo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC0tdXBkYXRlLWJ1 aWx0aW4tZndkYsKgwqDCoHNhbWUgYXMgLS11cGRhdGUtZndkYiBidXQKPiB1cGRhdGUgYnVpbHRp biBEQiBpbnNpZGUgdGhlIHNjcmlwdCBpdHNlbGYKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgLS1kdW1wLW1vY2stZGF0YcKgwqDCoMKgwqDCoMKgwqB1c2VkIHRvIG1pbWljayBhIENQ VSBvbiBhbgo+IG90aGVyIHN5c3RlbSwgbWFpbmx5IHVzZWQgdG8gaGVscCBkZWJ1Z2dpbmcgdGhp cyBzY3JpcHQKPiArCj4gK8KgwqDCoMKgwqDCoMKgUmV0dXJuIGNvZGVzOgo+ICtAQCAtODUzLDkg Kzg1Miw5IEBAIHVwZGF0ZV9md2RiKCkKPiArwqDCoMKgwqDCoMKgwqBtY2VkYl90bXA9IiQoQG1r dGVtcEAgLXQgc21jLW1jZWRiLVhYWFhYWCkiCj4gK8KgwqDCoMKgwqDCoMKgbWNlZGJfdXJsPScK PiBodHRwczovL2dpdGh1Yi5jb20vcGxhdG9tYXYvTUNFeHRyYWN0b3IvcmF3L21hc3Rlci9NQ0Uu ZGInCj4gK8KgwqDCoMKgwqDCoMKgX2luZm9fbm9sICJGZXRjaGluZyBNQ0UuZGIgZnJvbSB0aGUg TUNFeHRyYWN0b3IgcHJvamVjdC4uLiAiCj4gKy3CoMKgwqDCoMKgwqBpZiBjb21tYW5kIC12IHdn ZXQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg d2dldCAtcSAiJG1jZWRiX3VybCIgLU8gIiRtY2VkYl90bXAiOyByZXQ9JD8KPiArLcKgwqDCoMKg wqDCoGVsaWYgY29tbWFuZCAtdiBjdXJsID4vZGV2L251bGwgMj4mMTsgdGhlbgo+ICsrwqDCoMKg wqDCoMKgIyBpZiBjb21tYW5kIC12IHdnZXQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gKyvCoMKg wqDCoMKgwqAjwqDCoMKgwqDCoMKgwqB3Z2V0IC1xICIkbWNlZGJfdXJsIiAtTyAiJG1jZWRiX3Rt cCI7IHJldD0kPwo+ICsrwqDCoMKgwqDCoMKgaWYgY29tbWFuZCAtdiBjdXJsID4vZGV2L251bGwg Mj4mMTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjdXJsIC1zTCAiJG1j ZWRiX3VybCIgLW8gIiRtY2VkYl90bXAiOyByZXQ9JD8KPiArwqDCoMKgwqDCoMKgwqBlbGlmIGNv bW1hbmQgLXYgZmV0Y2ggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGZldGNoIC1xICIkbWNlZGJfdXJsIiAtbyAiJG1jZWRiX3RtcCI7IHJldD0k PwpUaGUgY3VybCBsaW5lIGFuZCBmZXRjaCBsaW5lIGRvIHRoZSBzYW1lIHRoaW5nIGFzIHRoZSB3 Z2V0IGxpbmUuIApQcmVmZXIgcmVtb3ZhbCBvdmVyIGNvbW1lbnRpbmcuCj4gK0BAIC04NzQsOSAr ODczLDkgQEAgdXBkYXRlX2Z3ZGIoKQo+ICvCoMKgwqDCoMKgwqDCoGludGVsX3VybD0iCj4gaHR0 cHM6Ly9naXRodWIuY29tL2ludGVsL0ludGVsLUxpbnV4LVByb2Nlc3Nvci1NaWNyb2NvZGUtRGF0 YS0KPiBGaWxlcy9hcmNoaXZlL21haW4uemlwIgo+ICvCoMKgwqDCoMKgwqDCoF9pbmZvX25vbCAi RmV0Y2hpbmcgSW50ZWwgZmlybXdhcmVzLi4uICIKPiArwqDCoMKgwqDCoMKgwqAjIwo+IGh0dHBz Oi8vZ2l0aHViLmNvbS9pbnRlbC9JbnRlbC1MaW51eC1Qcm9jZXNzb3ItTWljcm9jb2RlLURhdGEt RmlsZXMuZ2l0Cj4gKy3CoMKgwqDCoMKgwqBpZiBjb21tYW5kIC12IHdnZXQgPi9kZXYvbnVsbCAy PiYxOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgd2dldCAtcSAiJGludGVs X3VybCIgLU8gIiRpbnRlbF90bXAvZncuemlwIjsgcmV0PSQ/Cj4gKy3CoMKgwqDCoMKgwqBlbGlm IGNvbW1hbmQgLXYgY3VybCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiArK8KgwqDCoMKgwqDCoCMg aWYgY29tbWFuZCAtdiB3Z2V0ID4vZGV2L251bGwgMj4mMTsgdGhlbgo+ICsrwqDCoMKgwqDCoMKg I8KgwqDCoMKgwqDCoMKgd2dldCAtcSAiJGludGVsX3VybCIgLU8gIiRpbnRlbF90bXAvZncuemlw IjsgcmV0PSQ/Cj4gKyvCoMKgwqDCoMKgwqBpZiBjb21tYW5kIC12IGN1cmwgPi9kZXYvbnVsbCAy PiYxOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGN1cmwgLXNMICIkaW50 ZWxfdXJsIiAtbyAiJGludGVsX3RtcC9mdy56aXAiOyByZXQ9JD8KPiArwqDCoMKgwqDCoMKgwqBl bGlmIGNvbW1hbmQgLXYgZmV0Y2ggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGZldGNoIC1xICIkaW50ZWxfdXJsIiAtbyAiJGludGVsX3RtcC9m dy56aXAiOyByZXQ9JD8KU2FtZSBoZXJlLgo+ICtAQCAtOTY5LDEzICs5NjgsMTMgQEAgdXBkYXRl X2Z3ZGIoKQo+ICvCoMKgwqDCoMKgwqDCoH0gPiAiJG1jZWRiX2NhY2hlIgo+ICvCoMKgwqDCoMKg wqDCoGVjaG8gRE9ORSAiKHZlcnNpb24gJGRidmVyc2lvbikiCj4gKwo+ICstwqDCoMKgwqDCoMKg aWYgWyAiJDEiID0gYnVpbHRpbiBdOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgbmV3ZmlsZT0kKEBta3RlbXBAIC10IHNtYy1idWlsdGluLVhYWFhYWCkKPiArLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBAYXdrQCAnL14jICUlJSBNQ0VEQiAvIHsgZXhpdCB9OyB7IHBy aW50IH0nICIkMCIgPgo+ICIkbmV3ZmlsZSIKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBAYXdrQCAneyBpZiAoTlI+MSkgeyBwcmludCB9IH0nICIkbWNlZGJfY2FjaGUiID4+Cj4gIiRu ZXdmaWxlIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoEBjYXRAICIkbmV3ZmlsZSIg PiAiJDAiCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgQHJtQCAtZiAiJG5ld2ZpbGUi Cj4gKy3CoMKgwqDCoMKgwqBmaQo+ICsrwqDCoMKgwqDCoMKgIyBpZiBbICIkMSIgPSBidWlsdGlu IF07IHRoZW4KPiArK8KgwqDCoMKgwqDCoCPCoMKgwqDCoMKgwqDCoG5ld2ZpbGU9JChAbWt0ZW1w QCAtdCBzbWMtYnVpbHRpbi1YWFhYWFgpCj4gKyvCoMKgwqDCoMKgwqAjwqDCoMKgwqDCoMKgwqBA YXdrQCAnL14jICUlJSBNQ0VEQiAvIHsgZXhpdCB9OyB7IHByaW50IH0nICIkMCIgPgo+ICIkbmV3 ZmlsZSIKPiArK8KgwqDCoMKgwqDCoCPCoMKgwqDCoMKgwqDCoEBhd2tAICd7IGlmIChOUj4xKSB7 IHByaW50IH0gfScgIiRtY2VkYl9jYWNoZSIgPj4KPiAiJG5ld2ZpbGUiCj4gKyvCoMKgwqDCoMKg wqAjwqDCoMKgwqDCoMKgwqBAY2F0QCAiJG5ld2ZpbGUiID4gIiQwIgo+ICsrwqDCoMKgwqDCoMKg I8KgwqDCoMKgwqDCoMKgQHJtQCAtZiAiJG5ld2ZpbGUiCj4gKyvCoMKgwqDCoMKgwqAjIGZpClRo aXMgdGltZSwgaXQgc2VlbXMgY29tcGxldGVseSByZW1vdmVkLCBidXQgc3RpbGwgcHJlZmVyIHJl bW92YWwgb3Zlcgpjb21tZW50aW5nLgo+ICsgfQo+ICsKPiArIHBhcnNlX29wdF9maWxlKCkKPiAr QEAgLTEwNzAsOSArMTA2OSw5IEBAIHdoaWxlIFsgLW4gIiR7MTotfSIgXTsgZG8KPiArwqDCoMKg wqDCoMKgwqBlbGlmIFsgIiQxIiA9ICItLXVwZGF0ZS1md2RiIiBdIHx8IFsgIiQxIiA9ICItLXVw ZGF0ZS1tY2VkYiIKPiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHVw ZGF0ZV9md2RiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGV4aXQgJD8KPiArLcKg wqDCoMKgwqDCoGVsaWYgWyAiJDEiID0gIi0tdXBkYXRlLWJ1aWx0aW4tZndkYiIgXSB8fCBbICIk MSIgPSAiLS0KPiB1cGRhdGUtYnVpbHRpbi1tY2VkYiIgXTsgdGhlbgo+ICstwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHVwZGF0ZV9md2RiIGJ1aWx0aW4KPiArLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBleGl0ICQ/Cj4gKyvCoMKgwqDCoMKgwqAjIGVsaWYgWyAiJDEiID0gIi0tdXBk YXRlLWJ1aWx0aW4tZndkYiIgXSB8fCBbICIkMSIgPSAiLS0KPiB1cGRhdGUtYnVpbHRpbi1tY2Vk YiIgXTsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgI8KgwqDCoMKgwqDCoMKgdXBkYXRlX2Z3ZGIgYnVp bHRpbgo+ICsrwqDCoMKgwqDCoMKgI8KgwqDCoMKgwqDCoMKgZXhpdCAkPwo+ICvCoMKgwqDCoMKg wqDCoGVsaWYgWyAiJDEiID0gIi0tZHVtcC1tb2NrLWRhdGEiIF07IHRoZW4KPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgb3B0X21vY2s9MQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBzaGlmdAo+ICtAQCAtMjAzMywyMiArMjAzMiwyMiBAQCBpc194ZW5fZG9tVSgpCj4g K8KgwqDCoMKgwqDCoMKgZmkKPiArIH0KPiArCj4gKy1idWlsdGluX2RidmVyc2lvbj0kKEBhd2tA ICcvXiMgJSUlIE1DRURCIC8geyBwcmludCAkNCB9JyAiJDAiKQo+ICsrIyBidWlsdGluX2RidmVy c2lvbj0kKEBhd2tAICcvXiMgJSUlIE1DRURCIC8geyBwcmludCAkNCB9JyAiJDAiKQo+ICsgaWYg WyAtciAiJG1jZWRiX2NhY2hlIiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgIyB3ZSBoYXZlIGEg bG9jYWwgY2FjaGUgZmlsZSwgYnV0IGl0IG1pZ2h0IGJlIG9sZGVyIHRoYW4gdGhlCj4gYnVpbHRp biB2ZXJzaW9uIHdlIGhhdmUKPiArwqDCoMKgwqDCoMKgwqBsb2NhbF9kYnZlcnNpb249JCjCoCBA YXdrQCAnL14jICUlJSBNQ0VEQiAvIHsgcHJpbnQgJDQgfScKPiAiJG1jZWRiX2NhY2hlIikKPiAr wqDCoMKgwqDCoMKgwqAjIHNvcnQgLVYgc29ydHMgYnkgdmVyc2lvbiBudW1iZXIKPiArLcKgwqDC oMKgwqDCoG9sZGVyX2RidmVyc2lvbj0kKHByaW50ZiAiJWJcbiViIiAiJGxvY2FsX2RidmVyc2lv biIKPiAiJGJ1aWx0aW5fZGJ2ZXJzaW9uIiB8IEBzb3J0QCAtViB8IEBoZWFkQCAtbjEpCj4gKy3C oMKgwqDCoMKgwqBpZiBbICIkb2xkZXJfZGJ2ZXJzaW9uIiA9ICIkYnVpbHRpbl9kYnZlcnNpb24i IF07IHRoZW4KPiArK8KgwqDCoMKgwqDCoCMgb2xkZXJfZGJ2ZXJzaW9uPSQocHJpbnRmICIlYlxu JWIiICIkbG9jYWxfZGJ2ZXJzaW9uIgo+ICIkYnVpbHRpbl9kYnZlcnNpb24iIHwgQHNvcnRAIC1W IHwgQGhlYWRAIC1uMSkKPiArK8KgwqDCoMKgwqDCoCMgaWYgWyAiJG9sZGVyX2RidmVyc2lvbiIg PSAiJGJ1aWx0aW5fZGJ2ZXJzaW9uIiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoG1jZWRiX3NvdXJjZT0iJG1jZWRiX2NhY2hlIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBtY2VkYl9pbmZvPSJsb2NhbCBmaXJtd2FyZXMgREIgJGxvY2FsX2RidmVyc2lv biIKPiArLcKgwqDCoMKgwqDCoGZpCj4gKyvCoMKgwqDCoMKgwqAjIGZpCj4gKyBmaQo+ICsgIyBp ZiBtY2VkYl9zb3VyY2UgaXMgbm90IHNldCwgZWl0aGVyIHdlIGRvbid0IGhhdmUgYSBsb2NhbCBj YWNoZWQKPiBkYiwgb3IgaXQgaXMgb2xkZXIgdGhhbiB0aGUgYnVpbHRpbiBkYgo+ICstaWYgWyAt eiAiJHttY2VkYl9zb3VyY2U6LX0iIF07IHRoZW4KPiArLcKgwqDCoMKgwqDCoG1jZWRiX3NvdXJj ZT0iJDAiCj4gKy3CoMKgwqDCoMKgwqBtY2VkYl9pbmZvPSJidWlsdGluIGZpcm13YXJlcyBEQiAk YnVpbHRpbl9kYnZlcnNpb24iCj4gKy1maQo+ICsrIyBpZiBbIC16ICIke21jZWRiX3NvdXJjZTot fSIgXTsgdGhlbgo+ICsrI8KgwqDCoMKgwqBtY2VkYl9zb3VyY2U9IiQwIgo+ICsrI8KgwqDCoMKg wqBtY2VkYl9pbmZvPSJidWlsdGluIGZpcm13YXJlcyBEQiAkYnVpbHRpbl9kYnZlcnNpb24iCj4g KysjIGZpCkknbSBub3Qgc3VyZSB3aGV0aGVyIHRoaXMgaXMgY29ycmVjdGx5IHBhdGNoZWQuCj4g KyByZWFkX21jZWRiKCkKPiArIHsKPiArwqDCoMKgwqDCoMKgwqBAYXdrQCAneyBpZiAoREVMSU09 PTEpIHsgcHJpbnQgJDIgfSB9IC9eIyAlJSUgTUNFREIgLyB7Cj4gREVMSU09MSB9JyAiJG1jZWRi X3NvdXJjZSIKPiArQEAgLTIwNzAsNiArMjA2OSw5IEBAIGlzX2xhdGVzdF9rbm93bl91Y29kZSgp Cj4gK8KgwqDCoMKgwqDCoMKgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBy ZXR1cm4gMgo+ICvCoMKgwqDCoMKgwqDCoGZpCj4gKyvCoMKgwqDCoMKgwqBpZiBbIC16ICIkbWNl ZGJfc291cmNlIiBdOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4g Mgo+ICsrwqDCoMKgwqDCoMKgZmkKSGVyZSBuZWl0aGVyLCB3aGF0IGRvZXMgdGhlIHJldHVybiAy IGFib3ZlIGRvPwo+ICvCoMKgwqDCoMKgwqDCoGZvciB0dXBsZSBpbiAkKHJlYWRfbWNlZGIgfCBA Z3JlcEAgIiQocHJpbnRmCj4gIl4kY3B1X2JyYW5kX3ByZWZpeCwweCUwOFgsIiAiJGNwdV9jcHVp ZCIpIikKPiArwqDCoMKgwqDCoMKgwqBkbwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqB1Y29kZT0kKCjCoCAkKGVjaG8gIiR0dXBsZSIgfCBAY3V0QCAtZCwgLWYzKSApKQo+ICtAQCAt NTgzMyw0MjggKzU4MzUsMyBAQCBmaQo+ICsgWyAiJGdsb2JhbF9jcml0aWNhbCIgPSAxIF0gJiYg ZXhpdCAywqAgIyBjcml0aWNhbAo+ICsgWyAiJGdsb2JhbF91bmtub3duIsKgID0gMSBdICYmIGV4 aXQgM8KgICMgdW5rbm93bgo+ICsgZXhpdCAwwqAgIyBvawo+ICstCj4gKy0jIFdlJ3JlIHVzaW5n IE1DRS5kYiBmcm9tIHRoZSBleGNlbGxlbnQgcGxhdG9tYXYncyBNQ0V4dHJhY3Rvcgo+IHByb2pl Y3QKPiArLSMgVGhlIGJ1aWx0aW4gdmVyc2lvbiBmb2xsb3dzLCBidXQgdGhlIHVzZXIgY2FuIGRv d25sb2FkIGFuIHVwLXRvLQo+IGRhdGUgY29weSAodG8gYmUgc3RvcmVkIGluIGhpcyAkSE9NRSkg YnkgdXNpbmcgLS11cGRhdGUtZndkYgo+ICstIyBUbyB1cGRhdGUgdGhlIGJ1aWx0aW4gdmVyc2lv biBpdHNlbGYgKGJ5ICptb2RpZnlpbmcqIHRoaXMgdmVyeQo+IGZpbGUpLCB1c2UgLS11cGRhdGUt YnVpbHRpbi1md2RiCj4gKy0KQ2FuIHdlIHJlbW92ZSB0aGlzIGJ1aWx0aW4gdmVyc2lvbiB3aXRo b3V0IGEgcGF0Y2gsIGkuZS4gYSBzbmlwcGV0PwpJIHRoaW5rIHRoYXQgZG9pbmcgc28gd291bGQg YmUgbW9yZSByb2J1c3QgdGhhbiBrZWVwaW5nIHRoZSBwYXRjaCB1cCB0bwpkYXRlLgo+ICstIyAl JSUgTUNFREIgdjIyMitpMjAyMjAyMDgKPiArLSMgSSwweDAwMDAwNjExLDB4MDAwMDBCMjcsMTk5 NjEyMTgKPiArLSMgSSwweDAwMDAwNjEyLDB4MDAwMDAwQzYsMTk5NjEyMTAKPiArLSMgSSwweDAw MDAwNjE2LDB4MDAwMDAwQzYsMTk5NjEyMTAKPiArLSMgSSwweDAwMDAwNjE3LDB4MDAwMDAwQzYs MTk5NjEyMTAKPiArLSMgSSwweDAwMDAwNjE5LDB4MDAwMDAwRDIsMTk5ODAyMTgKPiArLSMgSSww eDAwMDAwNjMwLDB4MDAwMDAwMTMsMTk5NjA4MjcKPiArLSMgSSwweDAwMDAwNjMyLDB4MDAwMDAw MjAsMTk5NjA5MDMKPiArLSMgSSwweDAwMDAwNjMzLDB4MDAwMDAwMzYsMTk5ODA5MjMKPiArLSMg SSwweDAwMDAwNjM0LDB4MDAwMDAwMzcsMTk5ODA5MjMKPiArLSMgSSwweDAwMDAwNjUwLDB4MDAw MDAwNDUsMTk5OTA1MjUKPiArLSMgSSwweDAwMDAwNjUxLDB4MDAwMDAwNDIsMTk5OTA1MjUKPiAr LSMgSSwweDAwMDAwNjUyLDB4MDAwMDAwMkQsMTk5OTA1MTgKPiArLSMgSSwweDAwMDAwNjUzLDB4 MDAwMDAwMTAsMTk5OTA2MjgKPiArLSMgSSwweDAwMDAwNjYwLDB4MDAwMDAwMEEsMTk5OTA1MDUK PiArLSMgSSwweDAwMDAwNjY1LDB4MDAwMDAwMDMsMTk5OTA1MDUKPiArLSMgSSwweDAwMDAwNjZB LDB4MDAwMDAwMEQsMTk5OTA1MDUKPiArLSMgSSwweDAwMDAwNjZELDB4MDAwMDAwMDcsMTk5OTA1 MDUKPiArLSMgSSwweDAwMDAwNjcwLDB4MDAwMDAwMDcsMTk5ODA2MDIKPiArLSMgSSwweDAwMDAw NjcxLDB4MDAwMDAwMTQsMTk5ODA4MTEKPiArLSMgSSwweDAwMDAwNjcyLDB4MDAwMDAwMzgsMTk5 OTA5MjIKPiArLSMgSSwweDAwMDAwNjczLDB4MDAwMDAwMkUsMTk5OTA5MTAKPiArLSMgSSwweDAw MDAwNjgwLDB4MDAwMDAwMTcsMTk5OTA2MTAKPiArLSMgSSwweDAwMDAwNjgxLDB4MDAwMDAwMTQs MTk5OTEyMDkKPiArLSMgSSwweDAwMDAwNjgzLDB4MDAwMDAwMTQsMjAwMTAyMDYKPiArLSMgSSww eDAwMDAwNjg2LDB4MDAwMDAwMDgsMjAwMDA1MDUKPiArLSMgSSwweDAwMDAwNjhBLDB4MDAwMDAw MDUsMjAwMDEyMDcKPiArLSMgSSwweDAwMDAwNjkwLDB4MDAwMDAwMDQsMjAwMDAyMDYKPiArLSMg SSwweDAwMDAwNjkxLDB4MDAwMDAwMDEsMjAwMjA1MjcKPiArLSMgSSwweDAwMDAwNjkyLDB4MDAw MDAwMDEsMjAwMjA2MjAKPiArLSMgSSwweDAwMDAwNjk0LDB4MDAwMDAwMDIsMjAwMjA5MjYKPiAr LSMgSSwweDAwMDAwNjk1LDB4MDAwMDAwNDcsMjAwNDExMDkKPiArLSMgSSwweDAwMDAwNjk2LDB4 MDAwMDAwMDEsMjAwMDA3MDcKPiArLSMgSSwweDAwMDAwNkEwLDB4MDAwMDAwMDMsMjAwMDAxMTAK PiArLSMgSSwweDAwMDAwNkExLDB4MDAwMDAwMDEsMjAwMDAzMDYKPiArLSMgSSwweDAwMDAwNkE0 LDB4MDAwMDAwMDEsMjAwMDA2MTYKPiArLSMgSSwweDAwMDAwNkIwLDB4MDAwMDAwMUEsMjAwMTAx MjkKPiArLSMgSSwweDAwMDAwNkIxLDB4MDAwMDAwMUQsMjAwMTAyMjAKPiArLSMgSSwweDAwMDAw NkI0LDB4MDAwMDAwMDIsMjAwMjAxMTEKPiArLSMgSSwweDAwMDAwNkQwLDB4MDAwMDAwMDYsMjAw MzA1MjIKPiArLSMgSSwweDAwMDAwNkQxLDB4MDAwMDAwMDksMjAwMzA3MDkKPiArLSMgSSwweDAw MDAwNkQyLDB4MDAwMDAwMTAsMjAwMzA4MTQKPiArLSMgSSwweDAwMDAwNkQ2LDB4MDAwMDAwMTgs MjAwNDEwMTcKPiArLSMgSSwweDAwMDAwNkQ4LDB4MDAwMDAwMjEsMjAwNjA4MzEKPiArLSMgSSww eDAwMDAwNkUwLDB4MDAwMDAwMDgsMjAwNTAyMTUKPiArLSMgSSwweDAwMDAwNkUxLDB4MDAwMDAw MEMsMjAwNTA0MTMKPiArLSMgSSwweDAwMDAwNkU0LDB4MDAwMDAwMjYsMjAwNTA4MTYKPiArLSMg SSwweDAwMDAwNkU4LDB4MDAwMDAwM0MsMjAwNjAyMDgKPiArLSMgSSwweDAwMDAwNkVDLDB4MDAw MDAwNUIsMjAwNzAyMDgKPiArLSMgSSwweDAwMDAwNkYwLDB4MDAwMDAwMDUsMjAwNTA4MTgKPiAr LSMgSSwweDAwMDAwNkYxLDB4MDAwMDAwMTIsMjAwNTExMjkKPiArLSMgSSwweDAwMDAwNkYyLDB4 MDAwMDAwNUQsMjAxMDEwMDIKPiArLSMgSSwweDAwMDAwNkY0LDB4MDAwMDAwMjgsMjAwNjA0MTcK PiArLSMgSSwweDAwMDAwNkY1LDB4MDAwMDAwMzksMjAwNjA3MjcKPiArLSMgSSwweDAwMDAwNkY2 LDB4MDAwMDAwRDIsMjAxMDEwMDEKPiArLSMgSSwweDAwMDAwNkY3LDB4MDAwMDAwNkIsMjAxMDEw MDIKPiArLSMgSSwweDAwMDAwNkY5LDB4MDAwMDAwODQsMjAwNjEwMTIKPiArLSMgSSwweDAwMDAw NkZBLDB4MDAwMDAwOTUsMjAxMDEwMDIKPiArLSMgSSwweDAwMDAwNkZCLDB4MDAwMDAwQzEsMjAx MTEwMDQKPiArLSMgSSwweDAwMDAwNkZELDB4MDAwMDAwQTQsMjAxMDEwMDIKPiArLSMgSSwweDAw MDAwRjAwLDB4RkZGRjAwMDEsMjAwMDAxMzAKPiArLSMgSSwweDAwMDAwRjAxLDB4RkZGRjAwMDcs MjAwMDA0MDQKPiArLSMgSSwweDAwMDAwRjAyLDB4RkZGRjAwMEIsMjAwMDA1MTgKPiArLSMgSSww eDAwMDAwRjAzLDB4RkZGRjAwMDEsMjAwMDA1MTgKPiArLSMgSSwweDAwMDAwRjA0LDB4RkZGRjAw MTAsMjAwMDA4MDMKPiArLSMgSSwweDAwMDAwRjA1LDB4MDAwMDAwMEMsMjAwMDA4MjQKPiArLSMg SSwweDAwMDAwRjA2LDB4MDAwMDAwMDQsMjAwMDA5MTEKPiArLSMgSSwweDAwMDAwRjA3LDB4MDAw MDAwMTIsMjAwMjA3MTYKPiArLSMgSSwweDAwMDAwRjA4LDB4MDAwMDAwMDgsMjAwMDExMDEKPiAr LSMgSSwweDAwMDAwRjA5LDB4MDAwMDAwMDgsMjAwMTAxMDQKPiArLSMgSSwweDAwMDAwRjBBLDB4 MDAwMDAwMTUsMjAwMjA4MjEKPiArLSMgSSwweDAwMDAwRjExLDB4MDAwMDAwMEEsMjAwMzA3MjkK PiArLSMgSSwweDAwMDAwRjEyLDB4MDAwMDAwMkYsMjAwMzA1MDIKPiArLSMgSSwweDAwMDAwRjEz LDB4MDAwMDAwMDUsMjAwMzA1MDgKPiArLSMgSSwweDAwMDAwRjIwLDB4MDAwMDAwMDEsMjAwMTA0 MjMKPiArLSMgSSwweDAwMDAwRjIxLDB4MDAwMDAwMDMsMjAwMTA1MjkKPiArLSMgSSwweDAwMDAw RjIyLDB4MDAwMDAwMDUsMjAwMzA3MjkKPiArLSMgSSwweDAwMDAwRjIzLDB4MDAwMDAwMEQsMjAw MTA4MTcKPiArLSMgSSwweDAwMDAwRjI0LDB4MDAwMDAwMjEsMjAwMzA2MTAKPiArLSMgSSwweDAw MDAwRjI1LDB4MDAwMDAwMkMsMjAwNDA4MjYKPiArLSMgSSwweDAwMDAwRjI2LDB4MDAwMDAwMTAs MjAwNDA4MDUKPiArLSMgSSwweDAwMDAwRjI3LDB4MDAwMDAwMzksMjAwMzA2MDQKPiArLSMgSSww eDAwMDAwRjI5LDB4MDAwMDAwMkYsMjAwNDA4MTEKPiArLSMgSSwweDAwMDAwRjMwLDB4MDAwMDAw MTMsMjAwMzA4MTUKPiArLSMgSSwweDAwMDAwRjMxLDB4MDAwMDAwMEIsMjAwMzEwMjEKPiArLSMg SSwweDAwMDAwRjMyLDB4MDAwMDAwMEEsMjAwNDA1MTEKPiArLSMgSSwweDAwMDAwRjMzLDB4MDAw MDAwMEMsMjAwNTA0MjEKPiArLSMgSSwweDAwMDAwRjM0LDB4MDAwMDAwMTcsMjAwNTA0MjEKPiAr LSMgSSwweDAwMDAwRjM2LDB4MDAwMDAwMDcsMjAwNDAzMDkKPiArLSMgSSwweDAwMDAwRjM3LDB4 MDAwMDAwMDMsMjAwMzEyMTgKPiArLSMgSSwweDAwMDAwRjQwLDB4MDAwMDAwMDYsMjAwNDAzMTgK PiArLSMgSSwweDAwMDAwRjQxLDB4MDAwMDAwMTcsMjAwNTA0MjIKPiArLSMgSSwweDAwMDAwRjQy LDB4MDAwMDAwMDMsMjAwNTA0MjEKPiArLSMgSSwweDAwMDAwRjQzLDB4MDAwMDAwMDUsMjAwNTA0 MjEKPiArLSMgSSwweDAwMDAwRjQ0LDB4MDAwMDAwMDYsMjAwNTA0MjEKPiArLSMgSSwweDAwMDAw RjQ2LDB4MDAwMDAwMDQsMjAwNTA0MTEKPiArLSMgSSwweDAwMDAwRjQ3LDB4MDAwMDAwMDMsMjAw NTA0MjEKPiArLSMgSSwweDAwMDAwRjQ4LDB4MDAwMDAwMEUsMjAwODAxMTUKPiArLSMgSSwweDAw MDAwRjQ5LDB4MDAwMDAwMDMsMjAwNTA0MjEKPiArLSMgSSwweDAwMDAwRjRBLDB4MDAwMDAwMDQs MjAwNTEyMTQKPiArLSMgSSwweDAwMDAwRjYwLDB4MDAwMDAwMDUsMjAwNTAxMjQKPiArLSMgSSww eDAwMDAwRjYxLDB4MDAwMDAwMDgsMjAwNTA2MTAKPiArLSMgSSwweDAwMDAwRjYyLDB4MDAwMDAw MEYsMjAwNTEyMTUKPiArLSMgSSwweDAwMDAwRjYzLDB4MDAwMDAwMDUsMjAwNTEwMTAKPiArLSMg SSwweDAwMDAwRjY0LDB4MDAwMDAwMDQsMjAwNTEyMjMKPiArLSMgSSwweDAwMDAwRjY1LDB4MDAw MDAwMEIsMjAwNzA1MTAKPiArLSMgSSwweDAwMDAwRjY2LDB4MDAwMDAwMUIsMjAwNjAzMTAKPiAr LSMgSSwweDAwMDAwRjY4LDB4MDAwMDAwMDksMjAwNjA3MTQKPiArLSMgSSwweDAwMDAxNjMyLDB4 MDAwMDAwMDIsMTk5ODA2MTAKPiArLSMgSSwweDAwMDEwNjUwLDB4MDAwMDAwMDIsMjAwNjA1MTMK PiArLSMgSSwweDAwMDEwNjYwLDB4MDAwMDAwMDQsMjAwNjA2MTIKPiArLSMgSSwweDAwMDEwNjYx LDB4MDAwMDAwNDUsMjAxMDEwMDQKPiArLSMgSSwweDAwMDEwNjcwLDB4MDAwMDAwMDUsMjAwNzAy MDkKPiArLSMgSSwweDAwMDEwNjcxLDB4MDAwMDAxMDYsMjAwNzAzMjkKPiArLSMgSSwweDAwMDEw Njc0LDB4ODQwNTAxMDAsMjAwNzA3MjYKPiArLSMgSSwweDAwMDEwNjc2LDB4MDAwMDA2MTIsMjAx NTA4MDIKPiArLSMgSSwweDAwMDEwNjc3LDB4MDAwMDA3MEQsMjAxNTA4MDIKPiArLSMgSSwweDAw MDEwNjdBLDB4MDAwMDBBMEUsMjAxNTA3MjkKPiArLSMgSSwweDAwMDEwNkEwLDB4RkZGRjAwMUEs MjAwNzExMjgKPiArLSMgSSwweDAwMDEwNkExLDB4RkZGRjAwMEIsMjAwODAyMjAKPiArLSMgSSww eDAwMDEwNkEyLDB4RkZGRjAwMTksMjAwODA3MTQKPiArLSMgSSwweDAwMDEwNkE0LDB4MDAwMDAw MTMsMjAxNTA2MzAKPiArLSMgSSwweDAwMDEwNkE1LDB4MDAwMDAwMUQsMjAxODA1MTEKPiArLSMg SSwweDAwMDEwNkMwLDB4MDAwMDAwMDcsMjAwNzA4MjQKPiArLSMgSSwweDAwMDEwNkMxLDB4MDAw MDAxMDksMjAwNzEyMDMKPiArLSMgSSwweDAwMDEwNkMyLDB4MDAwMDAyMTksMjAwOTA0MTAKPiAr LSMgSSwweDAwMDEwNkM5LDB4MDAwMDAwMDcsMjAwOTAyMTMKPiArLSMgSSwweDAwMDEwNkNBLDB4 MDAwMDAxMDcsMjAwOTA4MjUKPiArLSMgSSwweDAwMDEwNkQwLDB4MDAwMDAwMDUsMjAwNzEyMDQK PiArLSMgSSwweDAwMDEwNkQxLDB4MDAwMDAwMkEsMjAxNTA4MDMKPiArLSMgSSwweDAwMDEwNkUw LDB4RkZGRjAwMjIsMjAwOTAxMTYKPiArLSMgSSwweDAwMDEwNkUxLDB4RkZGRjAwMEQsMjAwOTAy MDYKPiArLSMgSSwweDAwMDEwNkUyLDB4RkZGRjAwMTEsMjAwOTA5MjQKPiArLSMgSSwweDAwMDEw NkUzLDB4RkZGRjAwMTEsMjAwOTA1MTIKPiArLSMgSSwweDAwMDEwNkU0LDB4MDAwMDAwMDMsMjAx MzA3MDEKPiArLSMgSSwweDAwMDEwNkU1LDB4MDAwMDAwMEEsMjAxODA1MDgKPiArLSMgSSwweDAw MDEwNkYwLDB4RkZGRjAwMDksMjAwOTAyMTAKPiArLSMgSSwweDAwMDEwNkYxLDB4RkZGRjAwMDcs MjAwOTAyMTAKPiArLSMgSSwweDAwMDIwNjUwLDB4RkZGRjAwMDgsMjAwOTAyMTgKPiArLSMgSSww eDAwMDIwNjUxLDB4RkZGRjAwMTgsMjAwOTA4MTgKPiArLSMgSSwweDAwMDIwNjUyLDB4MDAwMDAw MTEsMjAxODA1MDgKPiArLSMgSSwweDAwMDIwNjU0LDB4RkZGRjAwMDcsMjAwOTExMjQKPiArLSMg SSwweDAwMDIwNjU1LDB4MDAwMDAwMDcsMjAxODA0MjMKPiArLSMgSSwweDAwMDIwNjYxLDB4MDAw MDAxMDUsMjAxMTA3MTgKPiArLSMgSSwweDAwMDIwNkEwLDB4MDAwMDAwMjksMjAwOTExMDIKPiAr LSMgSSwweDAwMDIwNkExLDB4MDAwMDAwMDcsMjAwOTEyMjMKPiArLSMgSSwweDAwMDIwNkEyLDB4 MDAwMDAwMjcsMjAxMDA1MDIKPiArLSMgSSwweDAwMDIwNkEzLDB4MDAwMDAwMDksMjAxMDA2MDkK PiArLSMgSSwweDAwMDIwNkE0LDB4MDAwMDAwMjIsMjAxMDA0MTQKPiArLSMgSSwweDAwMDIwNkE1 LDB4MDAwMDAwMDcsMjAxMDA3MjIKPiArLSMgSSwweDAwMDIwNkE2LDB4OTAwMzAwMjgsMjAxMDA5 MjQKPiArLSMgSSwweDAwMDIwNkE3LDB4MDAwMDAwMkYsMjAxOTAyMTcKPiArLSMgSSwweDAwMDIw NkMwLDB4RkZGRjAwMUMsMjAwOTEyMTQKPiArLSMgSSwweDAwMDIwNkMxLDB4MDAwMDAwMDYsMjAw OTEyMjIKPiArLSMgSSwweDAwMDIwNkMyLDB4MDAwMDAwMUYsMjAxODA1MDgKPiArLSMgSSwweDAw MDIwNkQwLDB4ODAwMDAwMDYsMjAxMDA4MTYKPiArLSMgSSwweDAwMDIwNkQxLDB4ODAwMDAxMDYs MjAxMDEyMDEKPiArLSMgSSwweDAwMDIwNkQyLDB4QUY1MDY5NTgsMjAxMTA3MTQKPiArLSMgSSww eDAwMDIwNkQzLDB4QUY1MDY5NkEsMjAxMTA4MTYKPiArLSMgSSwweDAwMDIwNkQ1LDB4QUY1MDY5 RTUsMjAxMjAxMTgKPiArLSMgSSwweDAwMDIwNkQ2LDB4MDAwMDA2MjEsMjAyMDAzMDQKPiArLSMg SSwweDAwMDIwNkQ3LDB4MDAwMDA3MUEsMjAyMDAzMjQKPiArLSMgSSwweDAwMDIwNkUwLDB4RTM0 OTM0MDEsMjAwOTAxMDgKPiArLSMgSSwweDAwMDIwNkUxLDB4RTM0OTM0MDIsMjAwOTAyMjQKPiAr LSMgSSwweDAwMDIwNkUyLDB4RkZGRjAwMDQsMjAwODEwMDEKPiArLSMgSSwweDAwMDIwNkUzLDB4 RTQ0ODY1NDcsMjAwOTA3MDEKPiArLSMgSSwweDAwMDIwNkU0LDB4RkZGRjAwMDgsMjAwOTA2MTkK PiArLSMgSSwweDAwMDIwNkU1LDB4RkZGRjAwMTgsMjAwOTEyMTUKPiArLSMgSSwweDAwMDIwNkU2 LDB4MDAwMDAwMEQsMjAxODA1MTUKPiArLSMgSSwweDAwMDIwNkYwLDB4MDAwMDAwMDUsMjAxMDA3 MjkKPiArLSMgSSwweDAwMDIwNkYxLDB4MDAwMDAwMDgsMjAxMDEwMTMKPiArLSMgSSwweDAwMDIw NkYyLDB4MDAwMDAwM0IsMjAxODA1MTYKPiArLSMgSSwweDAwMDMwNjUwLDB4MDAwMDAwMDksMjAx MjAxMTgKPiArLSMgSSwweDAwMDMwNjUxLDB4MDAwMDAxMTAsMjAxMzEwMTQKPiArLSMgSSwweDAw MDMwNjYwLDB4MDAwMDAwMDMsMjAxMDExMDMKPiArLSMgSSwweDAwMDMwNjYxLDB4MDAwMDAxMEYs MjAxNTA3MjEKPiArLSMgSSwweDAwMDMwNjY5LDB4MDAwMDAxMEQsMjAxMzA1MTUKPiArLSMgSSww eDAwMDMwNjcxLDB4MDAwMDAxMTcsMjAxMzA0MTAKPiArLSMgSSwweDAwMDMwNjcyLDB4MDAwMDAy MkUsMjAxNDA0MDEKPiArLSMgSSwweDAwMDMwNjczLDB4ODMyOTAxMDAsMjAxOTA5MTYKPiArLSMg SSwweDAwMDMwNjc4LDB4MDAwMDA4MzgsMjAxOTA0MjIKPiArLSMgSSwweDAwMDMwNjc5LDB4MDAw MDA5MEQsMjAxOTA3MTAKPiArLSMgSSwweDAwMDMwNkEwLDB4MDAwMDAwMDcsMjAxMTA0MDcKPiAr LSMgSSwweDAwMDMwNkEyLDB4MDAwMDAwMEMsMjAxMTA3MjUKPiArLSMgSSwweDAwMDMwNkE0LDB4 MDAwMDAwMDcsMjAxMTA5MDgKPiArLSMgSSwweDAwMDMwNkE1LDB4MDAwMDAwMDksMjAxMTExMTAK PiArLSMgSSwweDAwMDMwNkE2LDB4MDAwMDAwMDQsMjAxMTExMTQKPiArLSMgSSwweDAwMDMwNkE4 LDB4MDAwMDAwMTAsMjAxMjAyMjAKPiArLSMgSSwweDAwMDMwNkE5LDB4MDAwMDAwMjEsMjAxOTAy MTMKPiArLSMgSSwweDAwMDMwNkMwLDB4RkZGRjAwMTMsMjAxMTExMTAKPiArLSMgSSwweDAwMDMw NkMxLDB4RkZGRjAwMTQsMjAxMjA3MjUKPiArLSMgSSwweDAwMDMwNkMyLDB4RkZGRjAwMDYsMjAx MjEwMTcKPiArLSMgSSwweDAwMDMwNkMzLDB4MDAwMDAwMjgsMjAxOTExMTIKPiArLSMgSSwweDAw MDMwNkQxLDB4RkZGRjAwMDksMjAxMzEwMTUKPiArLSMgSSwweDAwMDMwNkQyLDB4RkZGRjAwMDks MjAxMzEyMTkKPiArLSMgSSwweDAwMDMwNkQzLDB4RTMxMjEzMzgsMjAxNDA4MjUKPiArLSMgSSww eDAwMDMwNkQ0LDB4MDAwMDAwMkYsMjAxOTExMTIKPiArLSMgSSwweDAwMDMwNkUwLDB4RTkyMDA4 MEYsMjAxMjExMTMKPiArLSMgSSwweDAwMDMwNkUyLDB4RTkyMjA4MjcsMjAxMzA1MjMKPiArLSMg SSwweDAwMDMwNkUzLDB4MDAwMDAzMDgsMjAxMzAzMjEKPiArLSMgSSwweDAwMDMwNkU0LDB4MDAw MDA0MkUsMjAxOTAzMTQKPiArLSMgSSwweDAwMDMwNkU2LDB4MDAwMDA2MDAsMjAxMzA2MTkKPiAr LSMgSSwweDAwMDMwNkU3LDB4MDAwMDA3MTUsMjAxOTAzMTQKPiArLSMgSSwweDAwMDMwNkYwLDB4 RkZGRjAwMTcsMjAxMzA3MzAKPiArLSMgSSwweDAwMDMwNkYxLDB4RDE0MUQ2MjksMjAxNDA0MTYK PiArLSMgSSwweDAwMDMwNkYyLDB4MDAwMDAwNDksMjAyMTA4MTEKPiArLSMgSSwweDAwMDMwNkYz LDB4MDAwMDAwMEQsMjAxNjAyMTEKPiArLSMgSSwweDAwMDMwNkY0LDB4MDAwMDAwMUEsMjAyMTA1 MjQKPiArLSMgSSwweDAwMDQwNjUwLDB4RkZGRjAwMEIsMjAxMjEyMDYKPiArLSMgSSwweDAwMDQw NjUxLDB4MDAwMDAwMjYsMjAxOTExMTIKPiArLSMgSSwweDAwMDQwNjYwLDB4RkZGRjAwMTEsMjAx MjEwMTIKPiArLSMgSSwweDAwMDQwNjYxLDB4MDAwMDAwMUMsMjAxOTExMTIKPiArLSMgSSwweDAw MDQwNjcwLDB4RkZGRjAwMDYsMjAxNDAzMDQKPiArLSMgSSwweDAwMDQwNjcxLDB4MDAwMDAwMjIs MjAxOTExMTIKPiArLSMgSSwweDAwMDQwNkEwLDB4ODAxMjQwMDEsMjAxMzA1MjEKPiArLSMgSSww eDAwMDQwNkE4LDB4MDAwMDA4MUYsMjAxNDA4MTIKPiArLSMgSSwweDAwMDQwNkE5LDB4MDAwMDA4 MUYsMjAxNDA4MTIKPiArLSMgSSwweDAwMDQwNkMxLDB4MDAwMDAxMEIsMjAxNDA4MTQKPiArLSMg SSwweDAwMDQwNkMyLDB4MDAwMDAyMjEsMjAxNTAyMTgKPiArLSMgSSwweDAwMDQwNkMzLDB4MDAw MDAzNjgsMjAxOTA0MjMKPiArLSMgSSwweDAwMDQwNkM0LDB4MDAwMDA0MTEsMjAxOTA0MjMKPiAr LSMgSSwweDAwMDQwNkQwLDB4MDAwMDAwMEUsMjAxMzA2MTIKPiArLSMgSSwweDAwMDQwNkQ4LDB4 MDAwMDAxMkQsMjAxOTA5MTYKPiArLSMgSSwweDAwMDQwNkUxLDB4MDAwMDAwMjAsMjAxNDExMTEK PiArLSMgSSwweDAwMDQwNkUyLDB4MDAwMDAwMkMsMjAxNTA1MjEKPiArLSMgSSwweDAwMDQwNkUz LDB4MDAwMDAwRUMsMjAyMTA0MjgKPiArLSMgSSwweDAwMDQwNkU4LDB4MDAwMDAwMjYsMjAxNjA0 MTQKPiArLSMgSSwweDAwMDQwNkYwLDB4MDAwMDAwMTQsMjAxNTA3MDIKPiArLSMgSSwweDAwMDQw NkYxLDB4MEIwMDAwNDAsMjAyMTA1MTkKPiArLSMgSSwweDAwMDUwNjUwLDB4ODAwMDAwMkIsMjAx NjAyMDgKPiArLSMgSSwweDAwMDUwNjUxLDB4ODAwMDAwMkIsMjAxNjAyMDgKPiArLSMgSSwweDAw MDUwNjUyLDB4ODAwMDAwMzcsMjAxNzA1MDIKPiArLSMgSSwweDAwMDUwNjUzLDB4MDEwMDAxNUMs MjAyMTA1MjYKPiArLSMgSSwweDAwMDUwNjU0LDB4MDIwMDZDMEEsMjAyMTA2MTYKPiArLSMgSSww eDAwMDUwNjU1LDB4MDMwMDAwMTIsMjAxOTA0MTIKPiArLSMgSSwweDAwMDUwNjU2LDB4MDQwMDMy MEEsMjAyMTA4MTMKPiArLSMgSSwweDAwMDUwNjU3LDB4MDUwMDMyMEEsMjAyMTA4MTMKPiArLSMg SSwweDAwMDUwNjVBLDB4ODYwMDIzMDIsMjAyMTA0MTYKPiArLSMgSSwweDAwMDUwNjVCLDB4MDcw MDI0MDIsMjAyMTA2MDQKPiArLSMgSSwweDAwMDUwNjYxLDB4RjEwMDAwMDgsMjAxNTAxMzAKPiAr LSMgSSwweDAwMDUwNjYyLDB4MDAwMDAwMUMsMjAxOTA2MTcKPiArLSMgSSwweDAwMDUwNjYzLDB4 MDcwMDAwMUMsMjAyMTA2MTIKPiArLSMgSSwweDAwMDUwNjY0LDB4MEYwMDAwMUEsMjAyMTA2MTIK PiArLSMgSSwweDAwMDUwNjY1LDB4MEUwMDAwMTQsMjAyMTA5MTgKPiArLSMgSSwweDAwMDUwNjcw LDB4RkZGRjAwMzAsMjAxNTExMTMKPiArLSMgSSwweDAwMDUwNjcxLDB4MDAwMDAxQjYsMjAxODAx MDgKPiArLSMgSSwweDAwMDUwNkEwLDB4MDAwMDAwMzgsMjAxNTAxMTIKPiArLSMgSSwweDAwMDUw NkMyLDB4MDAwMDAwMTQsMjAxODA1MTEKPiArLSMgSSwweDAwMDUwNkM4LDB4OTAwMTEwMTAsMjAx NjAzMjMKPiArLSMgSSwweDAwMDUwNkM5LDB4MDAwMDAwNDYsMjAyMTA1MTAKPiArLSMgSSwweDAw MDUwNkNBLDB4MDAwMDAwMjIsMjAyMTA2MjIKPiArLSMgSSwweDAwMDUwNkQxLDB4MDAwMDAxMDIs MjAxNTA2MDUKPiArLSMgSSwweDAwMDUwNkUwLDB4MDAwMDAwMTgsMjAxNDExMTkKPiArLSMgSSww eDAwMDUwNkUxLDB4MDAwMDAwMkEsMjAxNTA2MDIKPiArLSMgSSwweDAwMDUwNkUyLDB4MDAwMDAw MkUsMjAxNTA4MTUKPiArLSMgSSwweDAwMDUwNkUzLDB4MDAwMDAwRjAsMjAyMTExMTIKPiArLSMg SSwweDAwMDUwNkU4LDB4MDAwMDAwMzQsMjAxNjA3MTAKPiArLSMgSSwweDAwMDUwNkYwLDB4MDAw MDAwMTAsMjAxNjA2MDcKPiArLSMgSSwweDAwMDUwNkYxLDB4MDAwMDAwMzYsMjAyMTA1MTAKPiAr LSMgSSwweDAwMDYwNjYwLDB4MDAwMDAwMEMsMjAxNjA4MjEKPiArLSMgSSwweDAwMDYwNjYxLDB4 MDAwMDAwMEUsMjAxNzAxMjgKPiArLSMgSSwweDAwMDYwNjYyLDB4MDAwMDAwMjIsMjAxNzExMjkK PiArLSMgSSwweDAwMDYwNjYzLDB4MDAwMDAwMkEsMjAxODA0MTcKPiArLSMgSSwweDAwMDYwNkEw LDB4ODAwMDAwMzEsMjAyMDAzMDgKPiArLSMgSSwweDAwMDYwNkE0LDB4MEIwMDAyODAsMjAyMDA4 MTcKPiArLSMgSSwweDAwMDYwNkE1LDB4MEMwMDAyRjAsMjAyMTAzMDgKPiArLSMgSSwweDAwMDYw NkE2LDB4MEQwMDAzMzIsMjAyMTEyMTcKPiArLSMgSSwweDAwMDYwNkUwLDB4MDAwMDAwMEIsMjAx NjExMDQKPiArLSMgSSwweDAwMDYwNkUxLDB4MDAwMDAxMDgsMjAxOTA0MjMKPiArLSMgSSwweDAw MDcwNkEwLDB4MDAwMDAwMjYsMjAxNzA3MTIKPiArLSMgSSwweDAwMDcwNkExLDB4MDAwMDAwMzgs MjAyMTA1MTAKPiArLSMgSSwweDAwMDcwNkE4LDB4MDAwMDAwMUMsMjAyMTA1MTAKPiArLSMgSSww eDAwMDcwNkUwLDB4MDAwMDAwMkMsMjAxODA2MTQKPiArLSMgSSwweDAwMDcwNkUxLDB4MDAwMDAw NDIsMjAxOTA0MjAKPiArLSMgSSwweDAwMDcwNkUyLDB4MDAwMDAwNDIsMjAxOTA0MjAKPiArLSMg SSwweDAwMDcwNkUzLDB4ODEwMDAwMDgsMjAxODEwMDIKPiArLSMgSSwweDAwMDcwNkU0LDB4MDAw MDAwNDYsMjAxOTA5MDUKPiArLSMgSSwweDAwMDcwNkU1LDB4MDAwMDAwQTgsMjAyMTA1MjYKPiAr LSMgSSwweDAwMDgwNjUwLDB4MDAwMDAwMTgsMjAxODAxMDgKPiArLSMgSSwweDAwMDgwNjY0LDB4 MEIwMDAwMEYsMjAyMTAyMTcKPiArLSMgSSwweDAwMDgwNjY1LDB4MEIwMDAwMEYsMjAyMTAyMTcK PiArLSMgSSwweDAwMDgwNkEwLDB4MDAwMDAwMTAsMjAxOTA1MDcKPiArLSMgSSwweDAwMDgwNkEx LDB4MDAwMDAwMkQsMjAyMTA5MDIKPiArLSMgSSwweDAwMDgwNkMwLDB4MDAwMDAwNjgsMjAyMDA0 MDIKPiArLSMgSSwweDAwMDgwNkMxLDB4MDAwMDAwOUMsMjAyMTEwMjYKPiArLSMgSSwweDAwMDgw NkMyLDB4MDAwMDAwMjIsMjAyMTA3MTYKPiArLSMgSSwweDAwMDgwNkQwLDB4MDAwMDAwNTAsMjAy MDEyMTcKPiArLSMgSSwweDAwMDgwNkQxLDB4MDAwMDAwM0MsMjAyMTA3MTYKPiArLSMgSSwweDAw MDgwNkU5LDB4MDAwMDAwRUMsMjAyMTA0MjgKPiArLSMgSSwweDAwMDgwNkVBLDB4MDAwMDAwRUMs MjAyMTA0MjgKPiArLSMgSSwweDAwMDgwNkVCLDB4MDAwMDAwRUMsMjAyMTA0MjgKPiArLSMgSSww eDAwMDgwNkVDLDB4MDAwMDAwRUMsMjAyMTA0MjgKPiArLSMgSSwweDAwMDkwNjYwLDB4MDAwMDAw MDksMjAyMDA2MTcKPiArLSMgSSwweDAwMDkwNjYxLDB4MDAwMDAwMTUsMjAyMTA5MjEKPiArLSMg SSwweDAwMDkwNjcwLDB4MDAwMDAwMTksMjAyMDExMTEKPiArLSMgSSwweDAwMDkwNjcxLDB4MDAw MDAwMUMsMjAyMTA2MTQKPiArLSMgSSwweDAwMDkwNjcyLDB4MDAwMDAwMUYsMjAyMjAzMDMKPiAr LSMgSSwweDAwMDkwNjc0LDB4MDAwMDAyMTksMjAyMTA0MjUKPiArLSMgSSwweDAwMDkwNjc1LDB4 MDAwMDAwMUYsMjAyMjAzMDMKPiArLSMgSSwweDAwMDkwNkEwLDB4MDAwMDAwMUMsMjAyMTA2MTQK PiArLSMgSSwweDAwMDkwNkExLDB4MDAwMDAxMUYsMjAyMTExMDQKPiArLSMgSSwweDAwMDkwNkEy LDB4MDAwMDAzMTUsMjAyMjAxMDIKPiArLSMgSSwweDAwMDkwNkEzLDB4MDAwMDA0MUIsMjAyMjAz MDgKPiArLSMgSSwweDAwMDkwNkE0LDB4MDAwMDA0MUIsMjAyMjAzMDgKPiArLSMgSSwweDAwMDkw NkMwLDB4MjQwMDAwMUYsMjAyMTA4MDkKPiArLSMgSSwweDAwMDkwNkU5LDB4MDAwMDAwRjAsMjAy MTExMTIKPiArLSMgSSwweDAwMDkwNkVBLDB4MDAwMDAwRUMsMjAyMTA0MjgKPiArLSMgSSwweDAw MDkwNkVCLDB4MDAwMDAwRUMsMjAyMTA0MjgKPiArLSMgSSwweDAwMDkwNkVDLDB4MDAwMDAwRUMs MjAyMTA0MjgKPiArLSMgSSwweDAwMDkwNkVELDB4MDAwMDAwRUMsMjAyMTA0MjgKPiArLSMgSSww eDAwMEEwNjUwLDB4MDAwMDAwQkUsMjAxOTEwMTAKPiArLSMgSSwweDAwMEEwNjUxLDB4MDAwMDAw QzIsMjAxOTExMTMKPiArLSMgSSwweDAwMEEwNjUyLDB4MDAwMDAwRUMsMjAyMTA0MjgKPiArLSMg SSwweDAwMEEwNjUzLDB4MDAwMDAwRUMsMjAyMTA0MjgKPiArLSMgSSwweDAwMEEwNjU0LDB4MDAw MDAwQzYsMjAyMDAxMjMKPiArLSMgSSwweDAwMEEwNjU1LDB4MDAwMDAwRUUsMjAyMTA0MjgKPiAr LSMgSSwweDAwMEEwNjYwLDB4MDAwMDAwRUEsMjAyMTA0MjgKPiArLSMgSSwweDAwMEEwNjYxLDB4 MDAwMDAwRUMsMjAyMTA0MjkKPiArLSMgSSwweDAwMEEwNjcwLDB4MDAwMDAwMkMsMjAyMDExMjQK PiArLSMgSSwweDAwMEEwNjcxLDB4MDAwMDAwNTAsMjAyMTA4MjkKPiArLSMgSSwweDAwMEEwNjgw LDB4ODAwMDAwMDIsMjAyMDAxMjEKPiArLSMgSSwweDAwMEIwNjcwLDB4MDAwMDAwMDksMjAyMTEx MTUKPiArLSMgSSwweDAwMEIwNkYyLDB4MDAwMDAwMUYsMjAyMjAzMDMKPiArLSMgSSwweDAwMEIw NkY1LDB4MDAwMDAwMUYsMjAyMjAzMDMKPiArLSMgQSwweDAwMDAwRjAwLDB4MDIwMDAwMDgsMjAw NzA2MTQKPiArLSMgQSwweDAwMDAwRjAxLDB4MDAwMDAwMUMsMjAwMjEwMzEKPiArLSMgQSwweDAw MDAwRjEwLDB4MDAwMDAwMDMsMjAwMjAzMjUKPiArLSMgQSwweDAwMDAwRjExLDB4MDAwMDAwMUYs MjAwMzAyMjAKPiArLSMgQSwweDAwMDAwRjQ4LDB4MDAwMDAwNDYsMjAwNDA3MTkKPiArLSMgQSww eDAwMDAwRjRBLDB4MDAwMDAwNDcsMjAwNDA3MTkKPiArLSMgQSwweDAwMDAwRjUwLDB4MDAwMDAw MjQsMjAwMjEyMTIKPiArLSMgQSwweDAwMDAwRjUxLDB4MDAwMDAwMjUsMjAwMzAxMTUKPiArLSMg QSwweDAwMDEwRjUwLDB4MDAwMDAwNDEsMjAwNDAyMjUKPiArLSMgQSwweDAwMDIwRjEwLDB4MDAw MDAwNEQsMjAwNTA0MjgKPiArLSMgQSwweDAwMDQwRjAxLDB4QzAwMTIxMDIsMjAwNTA5MTYKPiAr LSMgQSwweDAwMDQwRjBBLDB4MDAwMDAwNjgsMjAwNjA5MjAKPiArLSMgQSwweDAwMDQwRjEzLDB4 MDAwMDAwN0EsMjAwODA1MDgKPiArLSMgQSwweDAwMDQwRjE0LDB4MDAwMDAwNjIsMjAwNjAxMjcK PiArLSMgQSwweDAwMDQwRjFCLDB4MDAwMDAwNkQsMjAwNjA5MjAKPiArLSMgQSwweDAwMDQwRjMz LDB4MDAwMDAwN0IsMjAwODA1MTQKPiArLSMgQSwweDAwMDYwRjgwLDB4MDAwMDAwODMsMjAwNjA5 MjkKPiArLSMgQSwweDAwMEMwRjFCLDB4MDAwMDAwNkUsMjAwNjA5MjEKPiArLSMgQSwweDAwMEYw RjAwLDB4MDAwMDAwMDUsMjAwMjA2MjcKPiArLSMgQSwweDAwMEYwRjAxLDB4MDAwMDAwMTUsMjAw MjA2MjcKPiArLSMgQSwweDAwMTAwRjAwLDB4MDEwMDAwMjAsMjAwNzAzMjYKPiArLSMgQSwweDAw MTAwRjIwLDB4MDEwMDAwQ0EsMjAxMDAzMzEKPiArLSMgQSwweDAwMTAwRjIyLDB4MDEwMDAwQzks MjAxMDAzMzEKPiArLSMgQSwweDAwMTAwRjQwLDB4MDEwMDAwODUsMjAwODA1MDEKPiArLSMgQSww eDAwMTAwRjQxLDB4MDEwMDAwREIsMjAxMTEwMjQKPiArLSMgQSwweDAwMTAwRjQyLDB4MDEwMDAw OTIsMjAwODEwMjEKPiArLSMgQSwweDAwMTAwRjQzLDB4MDEwMDAwQzgsMjAxMDAzMTEKPiArLSMg QSwweDAwMTAwRjYyLDB4MDEwMDAwQzcsMjAxMDAzMTEKPiArLSMgQSwweDAwMTAwRjgwLDB4MDEw MDAwREEsMjAxMTEwMjQKPiArLSMgQSwweDAwMTAwRjgxLDB4MDEwMDAwRDksMjAxMTEwMTIKPiAr LSMgQSwweDAwMTAwRkEwLDB4MDEwMDAwREMsMjAxMTEwMjQKPiArLSMgQSwweDAwMTIwRjAwLDB4 MDMwMDAwMDIsMjAxMDAzMjQKPiArLSMgQSwweDAwMjAwRjMwLDB4MDIwMDAwMTgsMjAwNzA5MjEK PiArLSMgQSwweDAwMjAwRjMxLDB4MDIwMDAwNTcsMjAwODA1MDIKPiArLSMgQSwweDAwMjAwRjMy LDB4MDIwMDAwMzQsMjAwODAzMDcKPiArLSMgQSwweDAwMzAwRjAxLDB4MDMwMDAwMEUsMjAxMDEw MDQKPiArLSMgQSwweDAwMzAwRjEwLDB4MDMwMDAwMjcsMjAxMTEzMDkKPiArLSMgQSwweDAwNTAw RjAwLDB4MDUwMDAwMEIsMjAxMDA2MDEKPiArLSMgQSwweDAwNTAwRjAxLDB4MDUwMDAwMUEsMjAx MDA5MDgKPiArLSMgQSwweDAwNTAwRjEwLDB4MDUwMDAwMjksMjAxMzAxMjEKPiArLSMgQSwweDAw NTAwRjIwLDB4MDUwMDAxMTksMjAxMzAxMTgKPiArLSMgQSwweDAwNTgwRjAwLDB4MDUwMDAwMEIs MjAxMDA2MDEKPiArLSMgQSwweDAwNTgwRjAxLDB4MDUwMDAwMUEsMjAxMDA5MDgKPiArLSMgQSww eDAwNTgwRjEwLDB4MDUwMDAwMjgsMjAxMDExMjQKPiArLSMgQSwweDAwNTgwRjIwLDB4MDUwMDAx MDMsMjAxMTA1MjYKPiArLSMgQSwweDAwNjAwRjAwLDB4MDYwMDAwMTcsMjAxMDEwMjkKPiArLSMg QSwweDAwNjAwRjAxLDB4MDYwMDAxMUYsMjAxMTAyMjcKPiArLSMgQSwweDAwNjAwRjEwLDB4MDYw MDA0MjUsMjAxMTA0MDgKPiArLSMgQSwweDAwNjAwRjExLDB4MDYwMDA1MEQsMjAxMTA2MjcKPiAr LSMgQSwweDAwNjAwRjEyLDB4MDYwMDA2M0UsMjAxODAyMDcKPiArLSMgQSwweDAwNjAwRjIwLDB4 MDYwMDA4NTIsMjAxODAyMDYKPiArLSMgQSwweDAwNjEwRjAwLDB4MDYwMDEwMEUsMjAxMTExMDIK PiArLSMgQSwweDAwNjEwRjAxLDB4MDYwMDExMUYsMjAxODAzMDUKPiArLSMgQSwweDAwNjMwRjAw LDB4MDYwMDMwMUMsMjAxMzA4MTcKPiArLSMgQSwweDAwNjMwRjAxLDB4MDYwMDMxMDksMjAxODAy MjcKPiArLSMgQSwweDAwNjYwRjAwLDB4MDYwMDYwMTIsMjAxNDEwMTQKPiArLSMgQSwweDAwNjYw RjAxLDB4MDYwMDYxMUEsMjAxODAxMjYKPiArLSMgQSwweDAwNjcwRjAwLDB4MDYwMDY3MDUsMjAx ODAyMjAKPiArLSMgQSwweDAwNjgwRjAwLDB4MDYwMDAwMTcsMjAxMDEwMjkKPiArLSMgQSwweDAw NjgwRjAxLDB4MDYwMDAxMUYsMjAxMTAyMjcKPiArLSMgQSwweDAwNjgwRjEwLDB4MDYwMDA0MTAs MjAxMTAzMTQKPiArLSMgQSwweDAwNjkwRjAwLDB4MDYwMDEwMDksMjAxMTA2MTMKPiArLSMgQSww eDAwNzAwRjAwLDB4MDcwMDAwMkEsMjAxMjEyMTgKPiArLSMgQSwweDAwNzAwRjAxLDB4MDcwMDAx MTAsMjAxODAyMDkKPiArLSMgQSwweDAwNzMwRjAwLDB4MDcwMzAwMDksMjAxMzEyMDYKPiArLSMg QSwweDAwNzMwRjAxLDB4MDcwMzAxMDYsMjAxODAyMDkKPiArLSMgQSwweDAwODAwRjAwLDB4MDgw MDAwMkEsMjAxNjEwMDYKPiArLSMgQSwweDAwODAwRjEwLDB4MDgwMDEwMEMsMjAxNzAxMzEKPiAr LSMgQSwweDAwODAwRjExLDB4MDgwMDExMzgsMjAxOTAyMDQKPiArLSMgQSwweDAwODAwRjEyLDB4 MDgwMDEyNkUsMjAyMTExMTEKPiArLSMgQSwweDAwODAwRjgyLDB4MDgwMDgyMEQsMjAxOTA0MTYK PiArLSMgQSwweDAwODEwRjAwLDB4MDgxMDAwMDQsMjAxNjExMjAKPiArLSMgQSwweDAwODEwRjEw LDB4MDgxMDEwMTYsMjAxOTA0MzAKPiArLSMgQSwweDAwODEwRjExLDB4MDgxMDExMDMsMjAxOTA0 MTcKPiArLSMgQSwweDAwODEwRjgwLDB4MDgxMDgwMDIsMjAxODA2MDUKPiArLSMgQSwweDAwODEw RjgxLDB4MDgxMDgxMDksMjAxOTA0MTcKPiArLSMgQSwweDAwODIwRjAwLDB4MDgyMDAwMDIsMjAx ODAyMTQKPiArLSMgQSwweDAwODIwRjAxLDB4MDgyMDAxMDMsMjAxOTA0MTcKPiArLSMgQSwweDAw ODMwRjAwLDB4MDgzMDAwMjcsMjAxOTA0MDEKPiArLSMgQSwweDAwODMwRjEwLDB4MDgzMDEwNTIs MjAyMTExMTEKPiArLSMgQSwweDAwODUwRjAwLDB4MDg1MDAwMDQsMjAxODAyMTIKPiArLSMgQSww eDAwODYwRjAwLDB4MDg2MDAwMEUsMjAyMDAxMjcKPiArLSMgQSwweDAwODYwRjAxLDB4MDg2MDAx MDYsMjAyMDA2MTkKPiArLSMgQSwweDAwODYwRjgxLDB4MDg2MDgxMDMsMjAyMDA3MDIKPiArLSMg QSwweDAwODcwRjAwLDB4MDg3MDAwMDQsMjAxODEyMDYKPiArLSMgQSwweDAwODcwRjEwLDB4MDg3 MDEwMjEsMjAyMDAxMjUKPiArLSMgQSwweDAwQTAwRjAwLDB4MEEwMDAwMzMsMjAyMDA0MTMKPiAr LSMgQSwweDAwQTAwRjEwLDB4MEEwMDEwNTMsMjAyMTEyMTcKPiArLSMgQSwweDAwQTAwRjExLDB4 MEEwMDExNUQsMjAyMTExMTkKPiArLSMgQSwweDAwQTAwRjEyLDB4MEEwMDEyMjcsMjAyMTEyMTUK PiArLSMgQSwweDAwQTAwRjgwLDB4MEEwMDgwMDMsMjAyMTEwMTUKPiArLSMgQSwweDAwQTAwRjgy LDB4MEEwMDgyMDQsMjAyMTEwMTUKPiArLSMgQSwweDAwQTIwRjAwLDB4MEEyMDAwMjUsMjAyMDAx MjEKPiArLSMgQSwweDAwQTIwRjEwLDB4MEEyMDEwMTYsMjAyMTA0MDgKPiArLSMgQSwweDAwQTIw RjEyLDB4MEEyMDEyMDUsMjAyMTA3MTkKPiArLSMgQSwweDAwQTUwRjAwLDB4MEE1MDAwMEMsMjAy MDEyMDgKPiArLS0KPiArMi4zOC4xCj4gKwo+IGRpZmYgLS1naXQgYS9nbnUvcGFja2FnZXMvcGF0 Y2hlcy9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXItc3RhZ2UtCj4gY29tbWFuZHMtZm9yLXN1YnN0 aXR1dGlvbi5wYXRjaCBiL2dudS9wYWNrYWdlcy9wYXRjaGVzL3NwZWN0cmUtCj4gbWVsdGRvd24t Y2hlY2tlci1zdGFnZS1jb21tYW5kcy1mb3Itc3Vic3RpdHV0aW9uLnBhdGNoCj4gbmV3IGZpbGUg bW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwLi5hMmYxM2U0MTk1Cj4gLS0tIC9kZXYvbnVs bAo+ICsrKyBiL2dudS9wYWNrYWdlcy9wYXRjaGVzL3NwZWN0cmUtbWVsdGRvd24tY2hlY2tlci1z dGFnZS1jb21tYW5kcy0KPiBmb3Itc3Vic3RpdHV0aW9uLnBhdGNoCj4gQEAgLTAsMCArMSwxOTQ3 IEBACj4gK0Zyb20gNGRjOGFlMDFhZWM1YThhMmFhMmFmYzAxNTYwMzI2MWQ1MTQ2MjBhZSBNb24g U2VwIDE3IDAwOjAwOjAwCj4gMjAwMQo+ICtGcm9tOiBIaWx0b24gQ2hhaW4gPGhha29AdWx0cmFy YXJlLnNwYWNlPgo+ICtEYXRlOiBGcmksIDExIE5vdiAyMDIyIDE4OjQ5OjUwICswODAwCj4gK1N1 YmplY3Q6IFtQQVRDSCAxLzJdIFN0YWdlIGNvbW1hbmRzIGZvciBsYXRlciBzdWJzdGl0dXRpb24u Cj4gKwo+ICthd2ssIGJhc2U2NCwgYmFzZW5hbWUsIGJ1bnppcDIsIGNhdCwgY3V0LCBkZCwgZGly bmFtZSwgZG1lc2csIGZpbmQsCj4gZ2V0ZW50LAo+ICtncmVwLCBndW56aXAsIGd6aXAsIGhlYWQs IGlkLCBsejQsIGx6b3AsIG1rdGVtcCwgbW9kcHJvYmUsIG1vdW50LAo+IG5tLAo+ICtucHJvYywg b2JqZHVtcCwgb2QsIHBlcmwsIHBncmVwLCByZWFkZWxmLCBybSwgcm1tb2QsIHNlZCwgc29ydCwK PiBzdGF0LAo+ICtzdHJpbmdzLCBzeXNjdGwsIHRyLCB1bW91bnQsIHVuYW1lLCB1bmx6bWEsIHVu eHosIHVuenN0ZCwgdXVlbmNvZGUsCj4gd2hpY2gsCj4gK3dob2FtaSwgeGFyZ3MuCj4gKy0tLQo+ ICsgc3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyLnNoIHwgNjQ4ICsrKysrKysrKysrKysrKysrKy0t LS0tLS0tLS0tLS0tLQo+IC0tLQo+ICsgMSBmaWxlIGNoYW5nZWQsIDMyNCBpbnNlcnRpb25zKCsp LCAzMjQgZGVsZXRpb25zKC0pCj4gKwo+ICtkaWZmIC0tZ2l0IGEvc3BlY3RyZS1tZWx0ZG93bi1j aGVja2VyLnNoIGIvc3BlY3RyZS1tZWx0ZG93bi0KPiBjaGVja2VyLnNoCj4gK2luZGV4IDMwZjc2 MGMuLjgyY2YxYjYgMTAwNzU1Cj4gKy0tLSBhL3NwZWN0cmUtbWVsdGRvd24tY2hlY2tlci5zaAo+ ICsrKysgYi9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXIuc2gKPiArQEAgLTE5LDMzICsxOSwzMyBA QCB0cmFwICdfd2FybiAiaW50ZXJydXB0ZWQsIGNsZWFuaW5nIHVwLi4uIjsKPiBleGl0X2NsZWFu dXA7IGV4aXQgMScgSU5UCj4gKyBleGl0X2NsZWFudXAoKQo+ICsgewo+ICvCoMKgwqDCoMKgwqDC oCMgY2xlYW51cCB0aGUgdGVtcCBkZWNvbXByZXNzZWQgY29uZmlnICYga2VybmVsIGltYWdlCj4g Ky3CoMKgwqDCoMKgwqBbIC1uICIke2R1bXBlZF9jb25maWc6LX0iIF0gJiYgWyAtZiAiJGR1bXBl ZF9jb25maWciIF0gJiYgcm0KPiAtZiAiJGR1bXBlZF9jb25maWciCj4gKy3CoMKgwqDCoMKgwqBb IC1uICIke2tlcm5lbHRtcDotfSLCoMKgwqDCoCBdICYmIFsgLWYgIiRrZXJuZWx0bXAiwqDCoMKg wqAgXSAmJiBybQo+IC1mICIka2VybmVsdG1wIgo+ICstwqDCoMKgwqDCoMKgWyAtbiAiJHtrZXJu ZWx0bXAyOi19IsKgwqDCoCBdICYmIFsgLWYgIiRrZXJuZWx0bXAyIsKgwqDCoCBdICYmIHJtCj4g LWYgIiRrZXJuZWx0bXAyIgo+ICstwqDCoMKgwqDCoMKgWyAtbiAiJHttY2VkYl90bXA6LX0iwqDC oMKgwqAgXSAmJiBbIC1mICIkbWNlZGJfdG1wIsKgwqDCoMKgIF0gJiYgcm0KPiAtZiAiJG1jZWRi X3RtcCIKPiArLcKgwqDCoMKgwqDCoFsgLW4gIiR7aW50ZWxfdG1wOi19IsKgwqDCoMKgIF0gJiYg WyAtZCAiJGludGVsX3RtcCLCoMKgwqDCoCBdICYmIHJtCj4gLXJmICIkaW50ZWxfdG1wIgo+ICst wqDCoMKgwqDCoMKgWyAiJHttb3VudGVkX2RlYnVnZnM6LX0iID0gMSBdICYmIHVtb3VudCAvc3lz L2tlcm5lbC9kZWJ1Zwo+IDI+L2Rldi9udWxsCj4gKy3CoMKgwqDCoMKgwqBbICIke21vdW50ZWRf cHJvY2ZzOi19IsKgID0gMSBdICYmIHVtb3VudCAiJHByb2NmcyIKPiAyPi9kZXYvbnVsbAo+ICst wqDCoMKgwqDCoMKgWyAiJHtpbnNtb2RfY3B1aWQ6LX0iwqDCoMKgID0gMSBdICYmIHJtbW9kIGNw dWlkIDI+L2Rldi9udWxsCj4gKy3CoMKgwqDCoMKgwqBbICIke2luc21vZF9tc3I6LX0iwqDCoMKg wqDCoCA9IDEgXSAmJiBybW1vZCBtc3IgMj4vZGV2L251bGwKPiArK8KgwqDCoMKgwqDCoFsgLW4g IiR7ZHVtcGVkX2NvbmZpZzotfSIgXSAmJiBbIC1mICIkZHVtcGVkX2NvbmZpZyIgXSAmJgo+IEBy bUAgLWYgIiRkdW1wZWRfY29uZmlnIgo+ICsrwqDCoMKgwqDCoMKgWyAtbiAiJHtrZXJuZWx0bXA6 LX0iwqDCoMKgwqAgXSAmJiBbIC1mICIka2VybmVsdG1wIsKgwqDCoMKgIF0gJiYKPiBAcm1AIC1m ICIka2VybmVsdG1wIgo+ICsrwqDCoMKgwqDCoMKgWyAtbiAiJHtrZXJuZWx0bXAyOi19IsKgwqDC oCBdICYmIFsgLWYgIiRrZXJuZWx0bXAyIsKgwqDCoCBdICYmCj4gQHJtQCAtZiAiJGtlcm5lbHRt cDIiCj4gKyvCoMKgwqDCoMKgwqBbIC1uICIke21jZWRiX3RtcDotfSLCoMKgwqDCoCBdICYmIFsg LWYgIiRtY2VkYl90bXAiwqDCoMKgwqAgXSAmJgo+IEBybUAgLWYgIiRtY2VkYl90bXAiCj4gKyvC oMKgwqDCoMKgwqBbIC1uICIke2ludGVsX3RtcDotfSLCoMKgwqDCoCBdICYmIFsgLWQgIiRpbnRl bF90bXAiwqDCoMKgwqAgXSAmJgo+IEBybUAgLXJmICIkaW50ZWxfdG1wIgo+ICsrwqDCoMKgwqDC oMKgWyAiJHttb3VudGVkX2RlYnVnZnM6LX0iID0gMSBdICYmIEB1bW91bnRAIC9zeXMva2VybmVs L2RlYnVnCj4gMj4vZGV2L251bGwKPiArK8KgwqDCoMKgwqDCoFsgIiR7bW91bnRlZF9wcm9jZnM6 LX0iwqAgPSAxIF0gJiYgQHVtb3VudEAgIiRwcm9jZnMiCj4gMj4vZGV2L251bGwKPiArK8KgwqDC oMKgwqDCoFsgIiR7aW5zbW9kX2NwdWlkOi19IsKgwqDCoCA9IDEgXSAmJiBAcm1tb2RAIGNwdWlk IDI+L2Rldi9udWxsCj4gKyvCoMKgwqDCoMKgwqBbICIke2luc21vZF9tc3I6LX0iwqDCoMKgwqDC oCA9IDEgXSAmJiBAcm1tb2RAIG1zciAyPi9kZXYvbnVsbAo+ICvCoMKgwqDCoMKgwqDCoFsgIiR7 a2xkbG9hZF9jcHVjdGw6LX0iwqAgPSAxIF0gJiYga2xkdW5sb2FkIGNwdWN0bAo+IDI+L2Rldi9u dWxsCj4gK8KgwqDCoMKgwqDCoMKgWyAiJHtrbGRsb2FkX3ZtbTotfSLCoMKgwqDCoCA9IDEgXSAm JiBrbGR1bmxvYWQgdm1twqDCoMKgCj4gMj4vZGV2L251bGwKPiArIH0KPiArCj4gKyAjIGlmIHdl IHdlcmUgZ2l0IGNsb25lJ2QsIGFkanVzdCBWRVJTSU9OCj4gKy1pZiBbIC1kICIkKGRpcm5hbWUg IiQwIikvLmdpdCIgXSAmJiBjb21tYW5kIC12IGdpdCA+L2Rldi9udWxsIDI+JjE7Cj4gdGhlbgo+ ICstwqDCoMKgwqDCoMKgZGVzY3JpYmU9JChnaXQgLUMgIiQoZGlybmFtZSAiJDAiKSIgZGVzY3Jp YmUgLS10YWdzIC0tZGlydHkKPiAyPi9kZXYvbnVsbCkKPiArLcKgwqDCoMKgwqDCoFsgLW4gIiRk ZXNjcmliZSIgXSAmJiBWRVJTSU9OPSQoZWNobyAiJGRlc2NyaWJlIiB8IHNlZCAtZQo+IHMvXnYv LykKPiArK2lmIFsgLWQgIiQoQGRpcm5hbWVAICIkMCIpLy5naXQiIF0gJiYgY29tbWFuZCAtdiBn aXQgPi9kZXYvbnVsbAo+IDI+JjE7IHRoZW4KPiArK8KgwqDCoMKgwqDCoGRlc2NyaWJlPSQoZ2l0 IC1DICIkKEBkaXJuYW1lQCAiJDAiKSIgZGVzY3JpYmUgLS10YWdzIC0tZGlydHkKPiAyPi9kZXYv bnVsbCkKPiArK8KgwqDCoMKgwqDCoFsgLW4gIiRkZXNjcmliZSIgXSAmJiBWRVJTSU9OPSQoZWNo byAiJGRlc2NyaWJlIiB8IEBzZWRAIC1lCj4gcy9edi8vKQo+ICsgZmkKPiArCj4gKyBzaG93X3Vz YWdlKCkKPiArIHsKPiArwqDCoMKgwqDCoMKgwqAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwODYK PiArLcKgwqDCoMKgwqDCoGNhdCA8PEVPRgo+ICsrwqDCoMKgwqDCoMKgQGNhdEAgPDxFT0YKPiAr wqDCoMKgwqDCoMKgwqBVc2FnZToKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBMaXZl IG1vZGUgKGF1dG8pOsKgwqAgJChiYXNlbmFtZSAkMCkgW29wdGlvbnNdCj4gKy3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgTGl2ZSBtb2RlIChtYW51YWwpOiAkKGJhc2VuYW1lICQwKSBbb3B0 aW9uc10gPFstLQo+IGtlcm5lbCA8a2ltYWdlPl0gWy0tY29uZmlnIDxrY29uZmlnPl0gWy0tbWFw IDxtYXBmaWxlPl0+IC0tbGl2ZQo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoE9mZmxp bmUgbW9kZTrCoMKgwqDCoMKgwqAgJChiYXNlbmFtZSAkMCkgW29wdGlvbnNdIDxbLS0KPiBrZXJu ZWwgPGtpbWFnZT5dIFstLWNvbmZpZyA8a2NvbmZpZz5dIFstLW1hcCA8bWFwZmlsZT5dPgo+ICsr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoExpdmUgbW9kZSAoYXV0byk6wqDCoCAkKEBiYXNl bmFtZUAgJDApIFtvcHRpb25zXQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoExpdmUg bW9kZSAobWFudWFsKTogJChAYmFzZW5hbWVAICQwKSBbb3B0aW9uc10gPFstLQo+IGtlcm5lbCA8 a2ltYWdlPl0gWy0tY29uZmlnIDxrY29uZmlnPl0gWy0tbWFwIDxtYXBmaWxlPl0+IC0tbGl2ZQo+ ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoE9mZmxpbmUgbW9kZTrCoMKgwqDCoMKgwqAg JChAYmFzZW5hbWVAICQwKSBbb3B0aW9uc10gPFstLQo+IGtlcm5lbCA8a2ltYWdlPl0gWy0tY29u ZmlnIDxrY29uZmlnPl0gWy0tbWFwIDxtYXBmaWxlPl0+Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoE1v ZGVzOgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBUd28gbW9kZXMgYXJlIGF2YWls YWJsZS4KPiArQEAgLTExMCw3ICsxMTAsNyBAQCBFT0YKPiArCj4gKyBzaG93X2Rpc2NsYWltZXIo KQo+ICsgewo+ICstwqDCoMKgwqDCoMKgY2F0IDw8RU9GCj4gKyvCoMKgwqDCoMKgwqBAY2F0QCA8 PEVPRgo+ICsgRGlzY2xhaW1lcjoKPiArCj4gKyBUaGlzIHRvb2wgZG9lcyBpdHMgYmVzdCB0byBk ZXRlcm1pbmUgd2hldGhlciB5b3VyIHN5c3RlbSBpcyBpbW11bmUKPiAob3IgaGFzIHByb3BlciBt aXRpZ2F0aW9ucyBpbiBwbGFjZSkgZm9yIHRoZQo+ICtAQCAtMTM4LDcgKzEzOCw3IEBAIFRoaXMg dG9vbCBoYXMgYmVlbiByZWxlYXNlZCBpbiB0aGUgaG9wZSB0aGF0Cj4gaXQnbGwgYmUgdXNlZnVs LCBidXQgZG9uJ3QgdXNlIGl0IHQKPiArIEVPRgo+ICsgfQo+ICsKPiArLW9zPSQodW5hbWUgLXMp Cj4gKytvcz0kKEB1bmFtZUAgLXMpCj4gKwo+ICsgIyBwYXJzZSBvcHRpb25zCj4gKyBvcHRfa2Vy bmVsPScnCj4gK0BAIC0yMDcsNyArMjA3LDcgQEAgX19lY2hvKCkKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9pbnRlcnByZXRfY2hhcnM9Jy1lJwo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBfY3RybGNoYXI9JCgkZWNob19jbWQgJF9pbnRlcnByZXRfY2hhcnMgIlwwMzMiKQo+ ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9tc2c9JCgkZWNob19jbWQgJF9pbnRlcnBy ZXRfY2hhcnMgIiRfbXNnIiB8IHNlZCAtcgo+ICJzLyRfY3RybGNoYXJcWyhbMC05XVswLTldPyg7 WzAtOV1bMC05XT8pPyk/bS8vZyIpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX21z Zz0kKCRlY2hvX2NtZCAkX2ludGVycHJldF9jaGFycyAiJF9tc2ciIHwgQHNlZEAgLXIKPiAicy8k X2N0cmxjaGFyXFsoWzAtOV1bMC05XT8oO1swLTldWzAtOV0/KT8pP20vL2ciKQo+ICvCoMKgwqDC oMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgaWYgWyAiJGVjaG9fY21kX3R5cGUiID0gcHJpbnRm IF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAiJG9wdCIgPSAi LW4iIF07IHRoZW4KPiArQEAgLTM4Myw3ICszODMsNyBAQCBpc19jcHVfYWZmZWN0ZWQoKQo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIGh0dHBzOi8vZ2l0aHViLmNvbS9jcm96b25l L1NwZWN0cmVQb0MvaXNzdWVzLzHCoF5GCj4gRTUyMDAgPT4gc3BlY3RyZSAyIG5vdCBhZmZlY3Rl ZAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjCj4gaHR0cHM6Ly9naXRodWIuY29t L3BhYm9sZGluL21lbHRkb3duLWV4cGxvaXQvaXNzdWVzLzE5wqBeRiBFNTIwMCA9Pgo+IG1lbHRk b3duIGFmZmVjdGVkCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgbW9kZWwgbmFt ZSA6IFBlbnRpdW0oUikgRHVhbC1Db3JlwqAgQ1BVwqDCoMKgwqDCoCBFNTIwMMKgCj4gQCAyLjUw R0h6Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgZWNobyAiJGNwdV9mcmllbmRs eV9uYW1lIiB8IGdyZXAgLXFFICdQZW50aXVtXChSXCkKPiBEdWFsLUNvcmVbWzpzcGFjZTpdXStD UFVbWzpzcGFjZTpdXStFWzAtOV17NH1LPyc7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBpZiBlY2hvICIkY3B1X2ZyaWVuZGx5X25hbWUiIHwgQGdyZXBAIC1xRQo+ICdQZW50 aXVtXChSXCkgRHVhbC1Db3JlW1s6c3BhY2U6XV0rQ1BVW1s6c3BhY2U6XV0rRVswLTldezR9Sz8n OyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB2 YXJpYW50MT12dWxuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBbIC16ICIkdmFyaWFudDIiIF0gJiYgdmFyaWFudDI9aW1tdW5lCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB2YXJpYW50Mz12dWxuCj4gK0BAIC00 ODYsNyArNDg2LDcgQEAgaXNfY3B1X2FmZmVjdGVkKCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGk9JCgoIGkgKyAxICkpCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIGRvIE5PVCBxdW90ZSAkY3B1X2FyY2hf bGlzdCBiZWxvdwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDg2Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNwdWFyY2g9JChlY2hvICRjcHVfYXJjaF9saXN0IHwgYXdr ICd7IHByaW50Cj4gJCckaScgfScpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGNwdWFyY2g9JChlY2hvICRjcHVfYXJjaF9saXN0IHwgQGF3a0AgJ3sKPiBw cmludCAkJyRpJyB9JykKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoF9kZWJ1ZyAiY2hlY2tpbmcgY3B1JGk6IDwkY3B1cGFydD4KPiA8JGNwdWFyY2g+Igo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBzb21lIGtl cm5lbHMgcmVwb3J0IEFBcmNoNjQgaW5zdGVhZCBvZiA4Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbICIkY3B1YXJjaCIgPSAiQUFyY2g2NCIgXSAmJiBj cHVhcmNoPTgKPiArQEAgLTQ5Nyw0OSArNDk3LDQ5IEBAIGlzX2NwdV9hZmZlY3RlZCgpCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIyBwYXJ0wqDCoCA/wqAgPyBjMDggYzA5IGMwZCBjMGYgYzBlIGQwNwo+IGQwOCBkMDkgZDBh IGQwYiBkMGPCoMKgwqDCoMKgwqDCoMKgIGQwZAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgYXJjaMKgIDc/IDc/IDfCoMKg IDfCoMKgIDfCoMKgIDfCoMKgIDfCoMKgIDjCoMKgCj4gOMKgwqAgOMKgwqAgOMKgwqAgOMKgwqAg OMKgwqDCoMKgwqDCoMKgwqDCoMKgIDgKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIFdoaXRlbGlzdCBpZGVu dGlmaWVkIG5vbi1hZmZlY3RlZAo+IHByb2Nlc3NvcnMsIHVzZSB2dWxuZXJhYmlsaXR5IGluZm9y bWF0aW9uIGZyb20KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCMgV2hpdGVsaXN0IGlkZW50aWZpZWQgbm9uLWFmZmVjdGVkCj4g cHJvY2Vzc29ycywgdXNlIHZ1bG5lcmFiaWxpdHkgaW5mb3JtYXRpb24gZnJvbQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMK PiBodHRwczovL2RldmVsb3Blci5hcm0uY29tL3N1cHBvcnQvYXJtLXNlY3VyaXR5LXVwZGF0ZXMv c3BlY3VsYXRpdmUtcHJvY2Vzc29yLXZ1bG5lcmFiaWxpdHkKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIFBhcnRudW1iZXJz IGNhbiBiZSBmb3VuZCBoZXJlOgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMKPiBodHRwczovL2dpdGh1Yi5jb20vZ2NjLW1p cnJvci9nY2MvYmxvYi9tYXN0ZXIvZ2NjL2NvbmZpZy9hcm0vYXJtLWNwdXMuaW4KPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAj Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIyBNYWludGFpbiBjdW11bGF0aXZlIGNoZWNrIG9mCj4gdnVsbmVyYWJpbGl0aWVz IC0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAjIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgY3B1IGlzCj4gYWZmZWN0ZWQsIHRo ZW4gdGhlIHN5c3RlbSBpcyBhZmZlY3RlZAo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAiJGNwdWFyY2giID0gNyBdICYm IGVjaG8KPiAiJGNwdXBhcnQiIHwgZ3JlcCAtcSAtdyAtZSAweGMwOCAtZSAweGMwOSAtZSAweGMw ZCAtZSAweGMwZTsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAiJGNwdWFyY2giID0gNyBdICYmIGVjaG8KPiAi JGNwdXBhcnQiIHwgQGdyZXBAIC1xIC13IC1lIDB4YzA4IC1lIDB4YzA5IC1lIDB4YzBkIC1lIDB4 YzBlOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHZhcmlhbnQxPXZ1bG4KPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgdmFyaWFudDI9dnVsbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC16 ICIkdmFyaWFudDMiIF0gJiYKPiB2YXJpYW50Mz1pbW11bmUKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgWyAteiAiJHZhcmlhbnQzYSIgXSAmJgo+IHZhcmlhbnQzYT1pbW11bmUKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgWyAteiAiJHZhcmlhbnQ0IiBdICYmCj4gdmFyaWFudDQ9aW1tdW5lCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAiY2hlY2tpbmcgY3B1JGk6IGFybXY3Cj4gQTgvQTkv QTEyL0ExNyBub24gYWZmZWN0ZWQgdG8gdmFyaWFudHMgMywgM2EgJiA0Igo+ICstwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiBb ICIkY3B1YXJjaCIgPSA3IF0gJiYgZWNobwo+ICIkY3B1cGFydCIgfCBncmVwIC1xIC13IC1lIDB4 YzBmOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBlbGlmIFsgIiRjcHVhcmNoIiA9IDcgXSAmJiBlY2hvCj4gIiRjcHVw YXJ0IiB8IEBncmVwQCAtcSAtdyAtZSAweGMwZjsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqB2YXJpYW50MT12dWxuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHZhcmlhbnQyPXZ1bG4KPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgWyAteiAiJHZhcmlhbnQzIiBdICYmCj4gdmFyaWFudDM9aW1t dW5lCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHZhcmlhbnQzYT12dWxuCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoFsgLXogIiR2YXJpYW50NCIgXSAmJgo+IHZhcmlhbnQ0PWltbXVuZQo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgImNoZWNraW5nIGNwdSRpOiBhcm12Nwo+IEExNSBub24g YWZmZWN0ZWQgdG8gdmFyaWFudHMgMyAmIDQiCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIFsgIiRjcHVhcmNoIiA9IDgg XSAmJiBlY2hvCj4gIiRjcHVwYXJ0IiB8IGdyZXAgLXEgLXcgLWUgMHhkMDcgLWUgMHhkMDg7IHRo ZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGVsaWYgWyAiJGNwdWFyY2giID0gOCBdICYmIGVjaG8KPiAiJGNwdXBhcnQiIHwg QGdyZXBAIC1xIC13IC1lIDB4ZDA3IC1lIDB4ZDA4OyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHZhcmlhbnQxPXZ1bG4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdmFyaWFudDI9dnVsbgo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC16ICIkdmFyaWFudDMiIF0gJiYKPiB2YXJpYW50Mz1p bW11bmUKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdmFyaWFudDNhPXZ1bG4KPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgdmFyaWFudDQ9dnVsbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcg ImNoZWNraW5nIGNwdSRpOiBhcm12OAo+IEE1Ny9BNzIgbm9uIGFmZmVjdGVkIHRvIHZhcmlhbnRz IDMiCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBlbGlmIFsgIiRjcHVhcmNoIiA9IDggXSAmJiBlY2hvCj4gIiRjcHVwYXJ0IiB8 IGdyZXAgLXEgLXcgLWUgMHhkMDk7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgWyAiJGNwdWFyY2giID0gOCBd ICYmIGVjaG8KPiAiJGNwdXBhcnQiIHwgQGdyZXBAIC1xIC13IC1lIDB4ZDA5OyB0aGVuCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHZhcmlhbnQxPXZ1bG4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg dmFyaWFudDI9dnVsbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC16ICIkdmFyaWFudDMiIF0g JiYKPiB2YXJpYW50Mz1pbW11bmUKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgWyAteiAiJHZhcmlh bnQzYSIgXSAmJgo+IHZhcmlhbnQzYT1pbW11bmUKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdmFy aWFudDQ9dnVsbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgImNoZWNraW5nIGNwdSRp OiBhcm12OAo+IEE3MyBub24gYWZmZWN0ZWQgdG8gdmFyaWFudHMgMyAmIDNhIgo+ICstwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxp ZiBbICIkY3B1YXJjaCIgPSA4IF0gJiYgZWNobwo+ICIkY3B1cGFydCIgfCBncmVwIC1xIC13IC1l IDB4ZDBhOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIFsgIiRjcHVhcmNoIiA9IDggXSAmJiBlY2hvCj4gIiRj cHVwYXJ0IiB8IEBncmVwQCAtcSAtdyAtZSAweGQwYTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqB2YXJpYW50MT12dWxuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHZhcmlhbnQyPXZ1bG4K PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdmFyaWFudDM9dnVsbgo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBbIC16ICIkdmFyaWFudDNhIiBdICYmCj4gdmFyaWFudDNhPWltbXVuZQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqB2YXJpYW50ND12dWxuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1 ZyAiY2hlY2tpbmcgY3B1JGk6IGFybXY4Cj4gQTc1IG5vbiBhZmZlY3RlZCB0byB2YXJpYW50IDNh Igo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgZWxpZiBbICIkY3B1YXJjaCIgPSA4IF0gJiYgZWNobwo+ICIkY3B1cGFydCIgfCBn cmVwIC1xIC13IC1lIDB4ZDBiIC1lIDB4ZDBjIC1lIDB4ZDBkOyB0aGVuCj4gKyvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIFsg IiRjcHVhcmNoIiA9IDggXSAmJiBlY2hvCj4gIiRjcHVwYXJ0IiB8IEBncmVwQCAtcSAtdyAtZSAw eGQwYiAtZSAweGQwYyAtZSAweGQwZDsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB2YXJp YW50MT12dWxuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgLXogIiR2YXJpYW50MiIgXSAmJgo+ IHZhcmlhbnQyPWltbXVuZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC16ICIkdmFyaWFudDMi IF0gJiYKPiB2YXJpYW50Mz1pbW11bmUKPiArQEAgLTgyMCw3ICs4MjAsNyBAQCBpc19jcHVfc3Ni X2ZyZWUoKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICIkY3B1X2ZhbWls eSIgPSAiMTgiIF0gfHwgXAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgWyAiJGNwdV9mYW1pbHkiID0gIjE3IiBdIHx8IFwKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgIiRjcHVfZmFtaWx5IiA9ICIxNiIgXSB8 fCBcCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgIiRj cHVfZmFtaWx5IiA9ICIxNSIgXTsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBbICIkY3B1X2ZhbWlseSIgPSAiMTUiIF07IHRoZW4KPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAwCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgZmkKPiArQEAgLTgz Nyw3ICs4MzcsNyBAQCBzaG93X2hlYWRlcigpCj4gK8KgwqDCoMKgwqDCoMKgX2luZm8KPiArIH0K PiArCj4gKy1bIC16ICIkSE9NRSIgXSAmJiBIT01FPSIkKGdldGVudCBwYXNzd2QgIiQod2hvYW1p KSIgfCBjdXQgLWQ6IC1mNikiCj4gKytbIC16ICIkSE9NRSIgXSAmJiBIT01FPSIkKEBnZXRlbnRA IHBhc3N3ZCAiJChAd2hvYW1pQCkiIHwgQGN1dEAgLWQ6Cj4gLWY2KSIKPiArIG1jZWRiX2NhY2hl PSIkSE9NRS8ubWNlZGIiCj4gKyB1cGRhdGVfZndkYigpCj4gKyB7Cj4gK0BAIC04NDYsMTEgKzg0 NiwxMSBAQCB1cGRhdGVfZndkYigpCj4gK8KgwqDCoMKgwqDCoMKgc2V0IC1lCj4gKwo+ICvCoMKg wqDCoMKgwqDCoGlmIFsgLXIgIiRtY2VkYl9jYWNoZSIgXTsgdGhlbgo+ICstwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHByZXZpb3VzX2RidmVyc2lvbj0kKGF3ayAnL14jICUlJSBNQ0VEQiAv IHsgcHJpbnQgJDQKPiB9JyAiJG1jZWRiX2NhY2hlIikKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBwcmV2aW91c19kYnZlcnNpb249JChAYXdrQCAnL14jICUlJSBNQ0VEQiAvIHsgcHJp bnQKPiAkNCB9JyAiJG1jZWRiX2NhY2hlIikKPiArwqDCoMKgwqDCoMKgwqBmaQo+ICsKPiArwqDC oMKgwqDCoMKgwqAjIGZpcnN0LCBkb3dubG9hZCB0aGUgTUNFLmRiIGZyb20gdGhlIGV4Y2VsbGVu dCBwbGF0b21hdidzCj4gTUNFeHRyYWN0b3IgcHJvamVjdAo+ICstwqDCoMKgwqDCoMKgbWNlZGJf dG1wPSIkKG1rdGVtcCAtdCBzbWMtbWNlZGItWFhYWFhYKSIKPiArK8KgwqDCoMKgwqDCoG1jZWRi X3RtcD0iJChAbWt0ZW1wQCAtdCBzbWMtbWNlZGItWFhYWFhYKSIKPiArwqDCoMKgwqDCoMKgwqBt Y2VkYl91cmw9Jwo+IGh0dHBzOi8vZ2l0aHViLmNvbS9wbGF0b21hdi9NQ0V4dHJhY3Rvci9yYXcv bWFzdGVyL01DRS5kYicKPiArwqDCoMKgwqDCoMKgwqBfaW5mb19ub2wgIkZldGNoaW5nIE1DRS5k YiBmcm9tIHRoZSBNQ0V4dHJhY3RvciBwcm9qZWN0Li4uICIKPiArwqDCoMKgwqDCoMKgwqBpZiBj b21tYW5kIC12IHdnZXQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gK0BAIC04NzAsNyArODcwLDcg QEAgdXBkYXRlX2Z3ZGIoKQo+ICvCoMKgwqDCoMKgwqDCoGVjaG8gRE9ORQo+ICsKPiArwqDCoMKg wqDCoMKgwqAjIHNlY29uZCwgZ2V0IHRoZSBJbnRlbCBmaXJtd2FyZXMgZnJvbSBHaXRIdWIKPiAr LcKgwqDCoMKgwqDCoGludGVsX3RtcD0iJChta3RlbXAgLWQgLXQgc21jLWludGVsZnctWFhYWFhY KSIKPiArK8KgwqDCoMKgwqDCoGludGVsX3RtcD0iJChAbWt0ZW1wQCAtZCAtdCBzbWMtaW50ZWxm dy1YWFhYWFgpIgo+ICvCoMKgwqDCoMKgwqDCoGludGVsX3VybD0iCj4gaHR0cHM6Ly9naXRodWIu Y29tL2ludGVsL0ludGVsLUxpbnV4LVByb2Nlc3Nvci1NaWNyb2NvZGUtRGF0YS0KPiBGaWxlcy9h cmNoaXZlL21haW4uemlwIgo+ICvCoMKgwqDCoMKgwqDCoF9pbmZvX25vbCAiRmV0Y2hpbmcgSW50 ZWwgZmlybXdhcmVzLi4uICIKPiArwqDCoMKgwqDCoMKgwqAjIwo+IGh0dHBzOi8vZ2l0aHViLmNv bS9pbnRlbC9JbnRlbC1MaW51eC1Qcm9jZXNzb3ItTWljcm9jb2RlLURhdGEtRmlsZXMuZ2l0Cj4g K0BAIC05MzAsMjAgKzkzMCwyMCBAQCB1cGRhdGVfZndkYigpCj4gK8KgwqDCoMKgwqDCoMKgZmkK PiArwqDCoMKgwqDCoMKgwqAjwqAgMDc5LzAwMTogc2lnIDB4MDAwMTA2YzIsIHBmX21hc2sgMHgw MSwgMjAwOS0wNC0xMCwgcmV2Cj4gMHgwMjE3LCBzaXplIDUxMjAKPiArwqDCoMKgwqDCoMKgwqAj wqAgMDc4LzAwNDogc2lnIDB4MDAwMTA2Y2EsIHBmX21hc2sgMHgxMCwgMjAwOS0wOC0yNSwgcmV2 Cj4gMHgwMTA3LCBzaXplIDUxMjAKPiArLcKgwqDCoMKgwqDCoCRpdWNvZGVfdG9vbCAtbCAiJGlu dGVsX3RtcC9JbnRlbC1MaW51eC1Qcm9jZXNzb3ItTWljcm9jb2RlLQo+IERhdGEtRmlsZXMtbWFp bi9pbnRlbC11Y29kZSIgfCBncmVwIC13RiBzaWcgfCB3aGlsZSByZWFkIC1yIF9saW5lCj4gKyvC oMKgwqDCoMKgwqAkaXVjb2RlX3Rvb2wgLWwgIiRpbnRlbF90bXAvSW50ZWwtTGludXgtUHJvY2Vz c29yLU1pY3JvY29kZS0KPiBEYXRhLUZpbGVzLW1haW4vaW50ZWwtdWNvZGUiIHwgQGdyZXBAIC13 RiBzaWcgfCB3aGlsZSByZWFkIC1yIF9saW5lCj4gK8KgwqDCoMKgwqDCoMKgZG8KPiArLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfbGluZT0kKMKgwqAgZWNobyAiJF9saW5lIiB8IHRyIC1k ICcsJykKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfY3B1aWQ9JCjCoCBlY2hvICIk X2xpbmUiIHwgYXdrICd7cHJpbnQgJDN9JykKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBfbGluZT0kKMKgwqAgZWNobyAiJF9saW5lIiB8IEB0ckAgLWQgJywnKQo+ICsrwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoF9jcHVpZD0kKMKgIGVjaG8gIiRfbGluZSIgfCBAYXdrQCAne3By aW50ICQzfScpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9jcHVpZD0kKCggX2Nw dWlkICkpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9jcHVpZD0kKHByaW50ZiAi MHglMDhYIiAiJF9jcHVpZCIpCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2RhdGU9 JCjCoMKgIGVjaG8gIiRfbGluZSIgfCBhd2sgJ3twcmludCAkNn0nIHwgdHIgLWQKPiAnLScpCj4g Ky3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX3ZlcnNpb249JChlY2hvICIkX2xpbmUiIHwg YXdrICd7cHJpbnQgJDh9JykKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGF0ZT0k KMKgwqAgZWNobyAiJF9saW5lIiB8IEBhd2tAICd7cHJpbnQgJDZ9JyB8IEB0ckAKPiAtZCAnLScp Cj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX3ZlcnNpb249JChlY2hvICIkX2xpbmUi IHwgQGF3a0AgJ3twcmludCAkOH0nKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBf dmVyc2lvbj0kKCggX3ZlcnNpb24gKSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg X3ZlcnNpb249JChwcmludGYgIjB4JTA4WCIgIiRfdmVyc2lvbiIpCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoF9zcWxzdG09IiQocHJpbnRmICJJTlNFUlQgSU5UTyBJbnRlbAo+IChv cmlnaW4sY3B1aWQsdmVyc2lvbix5eXl5bW1kZCkgVkFMVUVTCj4gKFwiJXNcIixcIiVzXCIsXCIl c1wiLFwiJXNcIik7IiAiaW50ZWwiICIkKHByaW50ZiAiJTA4WCIgIiRfY3B1aWQiKSIKPiAiJChw cmludGYgIiUwOFgiICIkX3ZlcnNpb24iKSIgIiRfZGF0ZSIpIgo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBzcWxpdGUzICIkbWNlZGJfdG1wIiAiJF9zcWxzdG0iCj4gK8KgwqDCoMKg wqDCoMKgZG9uZQo+ICstwqDCoMKgwqDCoMKgX2ludGVsX3RpbWVzdGFtcD0kKHN0YXQgLWMgJVkg IiRpbnRlbF90bXAvSW50ZWwtTGludXgtCj4gUHJvY2Vzc29yLU1pY3JvY29kZS1EYXRhLUZpbGVz LW1haW4vbGljZW5zZSIgMj4vZGV2L251bGwpCj4gKyvCoMKgwqDCoMKgwqBfaW50ZWxfdGltZXN0 YW1wPSQoQHN0YXRAIC1jICVZICIkaW50ZWxfdG1wL0ludGVsLUxpbnV4LQo+IFByb2Nlc3Nvci1N aWNyb2NvZGUtRGF0YS1GaWxlcy1tYWluL2xpY2Vuc2UiIDI+L2Rldi9udWxsKQo+ICvCoMKgwqDC oMKgwqDCoGlmIFsgLW4gIiRfaW50ZWxfdGltZXN0YW1wIiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCMgdXNlIHRoaXMgZGF0ZSwgaXQgbWF0Y2hlcyB0aGUgbGFzdCBj b21taXQgZGF0ZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfaW50ZWxfbGF0ZXN0 X2RhdGU9JChkYXRlICslWSVtJWQgLWQKPiBAIiRfaW50ZWxfdGltZXN0YW1wIikKPiArQEAgLTk2 NCwxNyArOTY0LDE3IEBAIHVwZGF0ZV9md2RiKCkKPiArwqDCoMKgwqDCoMKgwqB7Cj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVjaG8gIiMgU3BlY3RyZSAmIE1lbHRkb3duIENoZWNr ZXIiOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlY2hvICIjICUlJSBNQ0VEQiB2 JGRidmVyc2lvbiI7Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc3FsaXRlMyAiJG1j ZWRiX3RtcCIgIlNFTEVDVCAnIwo+IEksMHgnfHx0MS5jcHVpZHx8JywweCd8fE1BWCh0MS52ZXJz aW9uKXx8JywnfHx0MS55eXl5bW1kZCBGUk9NIEludGVsCj4gQVMgdDEgTEVGVCBPVVRFUiBKT0lO IEludGVsIEFTIHQyIE9OIHQyLmNwdWlkPXQxLmNwdWlkIEFORAo+IHQyLnl5eXltbWRkID4gdDEu eXl5eW1tZGQgV0hFUkUgdDIueXl5eW1tZGQgSVMgTlVMTCBHUk9VUCBCWSB0MS5jcHVpZAo+IE9S REVSIEJZIHQxLmNwdWlkIEFTQzsiIHwgZ3JlcCAtdiAnXiMgLiwweDAwMDAwMDAwLCc7Cj4gKy3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc3FsaXRlMyAiJG1jZWRiX3RtcCIgIlNFTEVDVCAn Iwo+IEEsMHgnfHx0MS5jcHVpZHx8JywweCd8fE1BWCh0MS52ZXJzaW9uKXx8JywnfHx0MS55eXl5 bW1kZCBGUk9NIEFNRMKgwqAKPiBBUyB0MSBMRUZUIE9VVEVSIEpPSU4gQU1EwqDCoCBBUyB0MiBP TiB0Mi5jcHVpZD10MS5jcHVpZCBBTkQKPiB0Mi55eXl5bW1kZCA+IHQxLnl5eXltbWRkIFdIRVJF IHQyLnl5eXltbWRkIElTIE5VTEwgR1JPVVAgQlkgdDEuY3B1aWQKPiBPUkRFUiBCWSB0MS5jcHVp ZCBBU0M7IiB8IGdyZXAgLXYgJ14jIC4sMHgwMDAwMDAwMCwnOwo+ICsrwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHNxbGl0ZTMgIiRtY2VkYl90bXAiICJTRUxFQ1QgJyMKPiBJLDB4J3x8dDEu Y3B1aWR8fCcsMHgnfHxNQVgodDEudmVyc2lvbil8fCcsJ3x8dDEueXl5eW1tZGQgRlJPTSBJbnRl bAo+IEFTIHQxIExFRlQgT1VURVIgSk9JTiBJbnRlbCBBUyB0MiBPTiB0Mi5jcHVpZD10MS5jcHVp ZCBBTkQKPiB0Mi55eXl5bW1kZCA+IHQxLnl5eXltbWRkIFdIRVJFIHQyLnl5eXltbWRkIElTIE5V TEwgR1JPVVAgQlkgdDEuY3B1aWQKPiBPUkRFUiBCWSB0MS5jcHVpZCBBU0M7IiB8IEBncmVwQCAt diAnXiMgLiwweDAwMDAwMDAwLCc7Cj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc3Fs aXRlMyAiJG1jZWRiX3RtcCIgIlNFTEVDVCAnIwo+IEEsMHgnfHx0MS5jcHVpZHx8JywweCd8fE1B WCh0MS52ZXJzaW9uKXx8JywnfHx0MS55eXl5bW1kZCBGUk9NIEFNRMKgwqAKPiBBUyB0MSBMRUZU IE9VVEVSIEpPSU4gQU1EwqDCoCBBUyB0MiBPTiB0Mi5jcHVpZD10MS5jcHVpZCBBTkQKPiB0Mi55 eXl5bW1kZCA+IHQxLnl5eXltbWRkIFdIRVJFIHQyLnl5eXltbWRkIElTIE5VTEwgR1JPVVAgQlkg dDEuY3B1aWQKPiBPUkRFUiBCWSB0MS5jcHVpZCBBU0M7IiB8IEBncmVwQCAtdiAnXiMgLiwweDAw MDAwMDAwLCc7Cj4gK8KgwqDCoMKgwqDCoMKgfSA+ICIkbWNlZGJfY2FjaGUiCj4gK8KgwqDCoMKg wqDCoMKgZWNobyBET05FICIodmVyc2lvbiAkZGJ2ZXJzaW9uKSIKPiArCj4gK8KgwqDCoMKgwqDC oMKgaWYgWyAiJDEiID0gYnVpbHRpbiBdOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgbmV3ZmlsZT0kKG1rdGVtcCAtdCBzbWMtYnVpbHRpbi1YWFhYWFgpCj4gKy3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgYXdrICcvXiMgJSUlIE1DRURCIC8geyBleGl0IH07IHsgcHJp bnQgfScgIiQwIiA+Cj4gIiRuZXdmaWxlIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGF3ayAneyBpZiAoTlI+MSkgeyBwcmludCB9IH0nICIkbWNlZGJfY2FjaGUiID4+Cj4gIiRuZXdm aWxlIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNhdCAiJG5ld2ZpbGUiID4gIiQw Igo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJtIC1mICIkbmV3ZmlsZSIKPiArK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBuZXdmaWxlPSQoQG1rdGVtcEAgLXQgc21jLWJ1aWx0 aW4tWFhYWFhYKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoEBhd2tAICcvXiMgJSUl IE1DRURCIC8geyBleGl0IH07IHsgcHJpbnQgfScgIiQwIiA+Cj4gIiRuZXdmaWxlIgo+ICsrwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoEBhd2tAICd7IGlmIChOUj4xKSB7IHByaW50IH0gfScg IiRtY2VkYl9jYWNoZSIgPj4KPiAiJG5ld2ZpbGUiCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgQGNhdEAgIiRuZXdmaWxlIiA+ICIkMCIKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBAcm1AIC1mICIkbmV3ZmlsZSIKPiArwqDCoMKgwqDCoMKgwqBmaQo+ICsgfQo+ICsKPiAr QEAgLTEwNTUsNyArMTA1NSw3IEBAIHdoaWxlIFsgLW4gIiR7MTotfSIgXTsgZG8KPiArwqDCoMKg wqDCoMKgwqBlbGlmIFsgIiQxIiA9ICItLWNwdSIgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBvcHRfY3B1PSQyCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGlmIFsgIiRvcHRfY3B1IiAhPSBhbGwgXTsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBlY2hvICIkb3B0X2NwdSIgfCBncmVwIC1FcSAnXlsw LTldKyc7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaWYgZWNobyAiJG9wdF9jcHUiIHwgQGdyZXBAIC1FcSAnXlswLTldKyc7Cj4gdGhlbgo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoG9wdF9jcHU9JCgoIG9wdF9jcHUgKSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlY2hvICIkMDogZXJyb3I6IC0tY3B1IHNo b3VsZCBiZSBhbgo+IGludGVnZXIgb3IgJ2FsbCcsIGdvdCAnJG9wdF9jcHUnIiA+JjIKPiArQEAg LTExMDMsNyArMTEwMyw3IEBAIHdoaWxlIFsgLW4gIiR7MTotfSIgXTsgZG8KPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVjaG8gIiQwOiBlcnJvcjogb3B0 aW9uIC0tY3ZlIGV4cGVjdHMgYQo+IHBhcmFtZXRlciwgc3VwcG9ydGVkIENWRXMgYXJlOiAkc3Vw cG9ydGVkX2N2ZV9saXN0IiA+JjIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGV4aXQgMjU1Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZp Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc2VsZWN0ZWRfY3ZlPSQoZWNobyAiJHN1 cHBvcnRlZF9jdmVfbGlzdCIgfCBncmVwIC1pd28KPiAiJDIiKQo+ICsrwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHNlbGVjdGVkX2N2ZT0kKGVjaG8gIiRzdXBwb3J0ZWRfY3ZlX2xpc3QiIHwg QGdyZXBAIC0KPiBpd28gIiQyIikKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYg WyAtbiAiJHNlbGVjdGVkX2N2ZSIgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgb3B0X2N2ZV9saXN0PSIkb3B0X2N2ZV9saXN0ICRzZWxlY3Rl ZF9jdmUiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBv cHRfY3ZlX2FsbD0wCj4gK0BAIC0xMzA4LDE0ICsxMzA4LDE0IEBAIGNoZWNrX2tlcm5lbCgpCj4g K8KgwqDCoMKgwqDCoMKgIyBhIGRhbWFnZWQgRUxGIGZpbGUgYW5kIHZhbGlkYXRlIGl0LCBjaGVj ayBmb3Igc3RkZXJyCj4gd2FybmluZ3MgdG9vCj4gKwo+ICvCoMKgwqDCoMKgwqDCoCMgdGhlIHdh cm5pbmcgInJlYWRlbGY6IFdhcm5pbmc6IFsxNl06IExpbmsgZmllbGQgKDApIHNob3VsZAo+IGlu ZGV4IGEgc3ltdGFiIHNlY3Rpb24uLyIgY2FuIGFwcGVhciBvbiB2YWxpZCBrZXJuZWxzLCBpZ25v cmUgaXQKPiArLcKgwqDCoMKgwqDCoF9yZWFkZWxmX3dhcm5pbmdzPSQoIiR7b3B0X2FyY2hfcHJl Zml4fXJlYWRlbGYiIC1TICIkX2ZpbGUiCj4gMj4mMSA+L2Rldi9udWxsIHwgZ3JlcCAtdiAnc2hv dWxkIGluZGV4IGEgc3ltdGFiIHNlY3Rpb24nIHwgdHIgIlxuIgo+ICIvIik7IHJldD0kPwo+ICst wqDCoMKgwqDCoMKgX3JlYWRlbGZfc2VjdGlvbnM9JCgiJHtvcHRfYXJjaF9wcmVmaXh9cmVhZGVs ZiIgLVMgIiRfZmlsZSIKPiAyPi9kZXYvbnVsbCB8IGdyZXAgLWMgLWUgZGF0YSAtZSB0ZXh0IC1l IGluaXQpCj4gKy3CoMKgwqDCoMKgwqBfa2VybmVsX3NpemU9JChzdGF0IC1jICVzICIkX2ZpbGUi IDI+L2Rldi9udWxsIHx8IHN0YXQgLWYgJXoKPiAiJF9maWxlIiAyPi9kZXYvbnVsbCB8fCBlY2hv IDEwMDAwKQo+ICsrwqDCoMKgwqDCoMKgX3JlYWRlbGZfd2FybmluZ3M9JCgiQHJlYWRlbGZAIiAt UyAiJF9maWxlIiAyPiYxID4vZGV2L251bGwgfAo+IEBncmVwQCAtdiAnc2hvdWxkIGluZGV4IGEg c3ltdGFiIHNlY3Rpb24nIHwgQHRyQCAiXG4iICIvIik7IHJldD0kPwo+ICsrwqDCoMKgwqDCoMKg X3JlYWRlbGZfc2VjdGlvbnM9JCgiQHJlYWRlbGZAIiAtUyAiJF9maWxlIiAyPi9kZXYvbnVsbCB8 Cj4gQGdyZXBAIC1jIC1lIGRhdGEgLWUgdGV4dCAtZSBpbml0KQo+ICsrwqDCoMKgwqDCoMKgX2tl cm5lbF9zaXplPSQoQHN0YXRAIC1jICVzICIkX2ZpbGUiIDI+L2Rldi9udWxsIHx8IEBzdGF0QCAt Zgo+ICV6ICIkX2ZpbGUiIDI+L2Rldi9udWxsIHx8IGVjaG8gMTAwMDApCj4gK8KgwqDCoMKgwqDC oMKgX2RlYnVnICJjaGVja19rZXJuZWw6IHJldD0kPyBzaXplPSRfa2VybmVsX3NpemUKPiBzZWN0 aW9ucz0kX3JlYWRlbGZfc2VjdGlvbnMgd2FybmluZ3M9JF9yZWFkZWxmX3dhcm5pbmdzIgo+ICvC oMKgwqDCoMKgwqDCoGlmIFsgIiRfbW9kZSIgPSBkZXNwZXJhdGUgXTsgdGhlbgo+ICstwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICIke29wdF9hcmNoX3ByZWZpeH1zdHJpbmdzIiAiJF9m aWxlIiB8IGdyZXAgLUVxCj4gJ15MaW51eCB2ZXJzaW9uICc7IHRoZW4KPiArK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBpZiAiQHN0cmluZ3NAIiAiJF9maWxlIiB8IEBncmVwQCAtRXEgJ15M aW51eCB2ZXJzaW9uCj4gJzsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgX2RlYnVnICJjaGVja19rZXJuZWwgKGRlc3BlcmF0ZSk6IC4uLgo+IG1h dGNoZWQhIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBp ZiBbICIkX3JlYWRlbGZfc2VjdGlvbnMiID0gMCBdICYmIGdyZXAgLXFGIC0KPiBlIGFybXY2IC1l IGFybXY3ICIkX2ZpbGUiOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGlmIFsgIiRfcmVhZGVsZl9zZWN0aW9ucyIgPSAwIF0gJiYgQGdyZXBAIC1x Rgo+IC1lIGFybXY2IC1lIGFybXY3ICIkX2ZpbGUiOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2RlYnVnICJjaGVj a19rZXJuZWwgKGRlc3BlcmF0ZSk6IHJhdwo+IGFybSBiaW5hcnkgZm91bmQsIGFkanVzdGluZyBv YmpkdW1wIG9wdGlvbnMiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgb2JqZHVtcF9vcHRpb25zPSItRCAtYiBiaW5hcnkgLW1h cm0iCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbHNl Cj4gK0BAIC0xMzQ4LDcgKzEzNDgsNyBAQCB0cnlfZGVjb21wcmVzcygpCj4gKwo+ICvCoMKgwqDC oMKgwqDCoCMgVHJ5IHRvIGZpbmQgdGhlIGhlYWRlciAoJDEpIGFuZCBkZWNvbXByZXNzIGZyb20g aGVyZQo+ICvCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAidHJ5X2RlY29tcHJlc3M6IGxvb2tpbmcgZm9y ICQzIG1hZ2ljIGluICQ2Igo+ICstwqDCoMKgwqDCoMKgZm9ywqDCoMKgwqAgcG9zIGluICQodHIg IiQxXG4kMiIgIlxuJDI9IiA8ICIkNiIgfCBncmVwIC1hYm8KPiAiXiQyIikKPiArK8KgwqDCoMKg wqDCoGZvcsKgwqDCoMKgIHBvcyBpbiAkKEB0ckAgIiQxXG4kMiIgIlxuJDI9IiA8ICIkNiIgfCBA Z3JlcEAgLWFibwo+ICJeJDIiKQo+ICvCoMKgwqDCoMKgwqDCoGRvCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAidHJ5X2RlY29tcHJlc3M6IG1hZ2ljIGZvciAkMyBmb3Vu ZCBhdCBvZmZzZXQKPiAkcG9zIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAh IGNvbW1hbmQgLXYgIiQzIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiArQEAgLTEzNzUsMTEgKzEz NzUsMTEgQEAgdHJ5X2RlY29tcHJlc3MoKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKga2VybmVsPSIka2VybmVsdG1wIgo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2RlYnVnICJ0cnlfZGVjb21wcmVzczogZGVj b21wcmVzc2VkIHdpdGggJDMKPiBzdWNjZXNzZnVsbHkhIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIDAKPiArLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBlbGlmIFsgIiQzIiAhPSAiY2F0IiBdOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZWxpZiBbICIkMyIgIT0gIkBjYXRAIiBdOyB0aGVuCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgInRyeV9kZWNvbXBy ZXNzOiBkZWNvbXByZXNzaW9uIHdpdGggJDMKPiB3b3JrZWQgYnV0IHJlc3VsdCBpcyBub3QgYSBr ZXJuZWwsIHRyeWluZyB3aXRoIGFuIG9mZnNldCIKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgWyAteiAiJGtlcm5lbHRtcDIiIF0gJiYga2VybmVsdG1wMj0k KG1rdGVtcCAtCj4gdCBzbWMta2VybmVsLVhYWFhYWCkKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY2F0ICIka2VybmVsdG1wIiA+ICIka2VybmVsdG1wMiIK PiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdHJ5X2RlY29t cHJlc3MgJ1wxNzdFTEYnIHh4eSAnY2F0JyAnJyBjYXQKPiAiJGtlcm5lbHRtcDIiICYmIHJldHVy biAwCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgLXog IiRrZXJuZWx0bXAyIiBdICYmIGtlcm5lbHRtcDI9JChAbWt0ZW1wQAo+IC10IHNtYy1rZXJuZWwt WFhYWFhYKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBA Y2F0QCAiJGtlcm5lbHRtcCIgPiAiJGtlcm5lbHRtcDIiCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHRyeV9kZWNvbXByZXNzICdcMTc3RUxGJyB4eHkgJ0Bj YXRAJyAnJyBjYXQKPiAiJGtlcm5lbHRtcDIiICYmIHJldHVybiAwCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoF9kZWJ1ZyAidHJ5X2RlY29tcHJlc3M6IGRlY29tcHJlc3Npb24gd2l0aCAk Mwo+IHdvcmtlZCBidXQgcmVzdWx0IGlzIG5vdCBhIGtlcm5lbCIKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZmkKPiArQEAgLTEzOTEsMTIgKzEzOTEsMTIgQEAgZXh0cmFjdF9rZXJu ZWwoKQo+ICsgewo+ICvCoMKgwqDCoMKgwqDCoFsgLW4gIiR7MTotfSIgXSB8fCByZXR1cm4gMQo+ ICvCoMKgwqDCoMKgwqDCoCMgUHJlcGFyZSB0ZW1wIGZpbGVzOgo+ICstwqDCoMKgwqDCoMKga2Vy bmVsdG1wPSIkKG1rdGVtcCAtdCBzbWMta2VybmVsLVhYWFhYWCkiCj4gKyvCoMKgwqDCoMKgwqBr ZXJuZWx0bXA9IiQoQG1rdGVtcEAgLXQgc21jLWtlcm5lbC1YWFhYWFgpIgo+ICsKPiArwqDCoMKg wqDCoMKgwqAjIEluaXRpYWwgYXR0ZW1wdCBmb3IgdW5jb21wcmVzc2VkIGltYWdlcyBvciBvYmpl Y3RzOgo+ICvCoMKgwqDCoMKgwqDCoGlmIGNoZWNrX2tlcm5lbCAiJDEiOyB0aGVuCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAiZXh0cmFjdF9rZXJuZWw6IGZvdW5kIGtl cm5lbCBpcyB2YWxpZCwgbm8KPiBkZWNvbXByZXNzaW9uIG5lZWRlZCIKPiArLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBjYXQgIiQxIiA+ICIka2VybmVsdG1wIgo+ICsrwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoEBjYXRAICIkMSIgPiAiJGtlcm5lbHRtcCIKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKga2VybmVsPSRrZXJuZWx0bXAKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgcmV0dXJuIDAKPiArwqDCoMKgwqDCoMKgwqBmaQo+ICtAQCAtMTQwNSwxNCAr MTQwNSwxNCBAQCBleHRyYWN0X2tlcm5lbCgpCj4gK8KgwqDCoMKgwqDCoMKgZm9yIHBhc3MgaW4g MSAyOyBkbwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmb3IgbW9kZSBpbiBub3Jt YWwgZGVzcGVyYXRlOyBkbwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgX2RlYnVnICJleHRyYWN0X2tlcm5lbDogcGFzcyAkcGFzcyAkbW9kZQo+IG1vZGUi Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHRyeV9kZWNv bXByZXNzICdcMDM3XDIxM1wwMTAnwqDCoMKgwqAgeHnCoMKgwqAKPiBndW56aXDCoCAnJ8KgwqDC oMKgwqAgZ3VuemlwwqDCoMKgwqDCoCAiJDEiICIkbW9kZSIgIiRwYXNzIiAmJiByZXR1cm4gMAo+ ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB0cnlfZGVjb21w cmVzcyAnXDAwMlwwNDFcMTE0XDAzMCcgeHl5wqDCoAo+ICdsejQnwqDCoCAnLWQgLWwnIGxpYmx6 NC10b29sICIkMSIgIiRtb2RlIiAiJHBhc3MiICYmIHJldHVybiAwCj4gKy3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHRyeV9kZWNvbXByZXNzICdcMzc1N3pYWlww MDAnwqDCoMKgwqAgYWJjZGUKPiB1bnh6wqDCoMKgICcnwqDCoMKgwqDCoCB4ei11dGlsc8KgwqDC oCAiJDEiICIkbW9kZSIgIiRwYXNzIiAmJiByZXR1cm4gMAo+ICstwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB0cnlfZGVjb21wcmVzcyAnQlpoJ8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHh5wqDCoMKgCj4gYnVuemlwMiAnJ8KgwqDCoMKgwqAgYnppcDLCoMKg wqDCoMKgwqAgIiQxIiAiJG1vZGUiICIkcGFzcyIgJiYgcmV0dXJuIDAKPiArLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdHJ5X2RlY29tcHJlc3MgJ1wxMzVcMFww XDAnwqDCoMKgwqDCoMKgIHh4eMKgwqAKPiB1bmx6bWHCoCAnJ8KgwqDCoMKgwqAgeHotdXRpbHPC oMKgwqAgIiQxIiAiJG1vZGUiICIkcGFzcyIgJiYgcmV0dXJuIDAKPiArLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdHJ5X2RlY29tcHJlc3MgJ1wyMTFcMTE0XDEz MifCoMKgwqDCoCB4ecKgwqDCoAo+ICdsem9wJ8KgICctZCfCoMKgwqAgbHpvcMKgwqDCoMKgwqDC oMKgICIkMSIgIiRtb2RlIiAiJHBhc3MiICYmIHJldHVybiAwCj4gKy3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHRyeV9kZWNvbXByZXNzICdcMTc3RUxGJ8KgwqDC oMKgwqDCoMKgwqDCoCB4eHnCoMKgCj4gJ2NhdCfCoMKgICcnwqDCoMKgwqDCoCBjYXTCoMKgwqDC oMKgwqDCoMKgICIkMSIgIiRtb2RlIiAiJHBhc3MiICYmIHJldHVybiAwCj4gKy3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHRyeV9kZWNvbXByZXNzICcoXDI2NS9c Mzc1J8KgwqDCoMKgwqDCoCB4eHnCoMKgCj4gdW56c3RkwqAgJyfCoMKgwqDCoMKgIHpzdGTCoMKg wqDCoMKgwqDCoCAiJDEiICIkbW9kZSIgIiRwYXNzIiAmJiByZXR1cm4gMAo+ICsrwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB0cnlfZGVjb21wcmVzcyAnXDAzN1wy MTNcMDEwJ8KgwqDCoMKgIHh5wqDCoMKgCj4gQGd1bnppcEDCoCAnJ8KgwqDCoMKgwqAgZ3Vuemlw wqDCoMKgwqDCoCAiJDEiICIkbW9kZSIgIiRwYXNzIiAmJiByZXR1cm4gMAo+ICsrwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB0cnlfZGVjb21wcmVzcyAnXDAwMlww NDFcMTE0XDAzMCcgeHl5wqDCoAo+ICdAbHo0QCfCoMKgICctZCAtbCcgbGlibHo0LXRvb2wgIiQx IiAiJG1vZGUiICIkcGFzcyIgJiYgcmV0dXJuIDAKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgdHJ5X2RlY29tcHJlc3MgJ1wzNzU3elhaXDAwMCfCoMKgwqDC oCBhYmNkZQo+IEB1bnh6QMKgwqDCoCAnJ8KgwqDCoMKgwqAgeHotdXRpbHPCoMKgwqAgIiQxIiAi JG1vZGUiICIkcGFzcyIgJiYgcmV0dXJuIDAKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgdHJ5X2RlY29tcHJlc3MgJ0JaaCfCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB4ecKgwqDCoAo+IEBidW56aXAyQCAnJ8KgwqDCoMKgwqAgYnppcDLCoMKgwqDCoMKg wqAgIiQxIiAiJG1vZGUiICIkcGFzcyIgJiYgcmV0dXJuIDAKPiArK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdHJ5X2RlY29tcHJlc3MgJ1wxMzVcMFwwXDAnwqDC oMKgwqDCoMKgIHh4eMKgwqAKPiBAdW5sem1hQMKgICcnwqDCoMKgwqDCoCB4ei11dGlsc8KgwqDC oCAiJDEiICIkbW9kZSIgIiRwYXNzIiAmJiByZXR1cm4gMAo+ICsrwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB0cnlfZGVjb21wcmVzcyAnXDIxMVwxMTRcMTMyJ8Kg wqDCoMKgIHh5wqDCoMKgCj4gJ0Bsem9wQCfCoCAnLWQnwqDCoMKgIGx6b3DCoMKgwqDCoMKgwqDC oCAiJDEiICIkbW9kZSIgIiRwYXNzIiAmJiByZXR1cm4gMAo+ICsrwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB0cnlfZGVjb21wcmVzcyAnXDE3N0VMRifCoMKgwqDC oMKgwqDCoMKgwqAgeHh5wqDCoAo+ICdAY2F0QCfCoMKgICcnwqDCoMKgwqDCoCBjYXTCoMKgwqDC oMKgwqDCoMKgICIkMSIgIiRtb2RlIiAiJHBhc3MiICYmIHJldHVybiAwCj4gKyvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHRyeV9kZWNvbXByZXNzICcoXDI2NS9c Mzc1J8KgwqDCoMKgwqDCoCB4eHnCoMKgCj4gQHVuenN0ZEDCoCAnJ8KgwqDCoMKgwqAgenN0ZMKg wqDCoMKgwqDCoMKgICIkMSIgIiRtb2RlIiAiJHBhc3MiICYmIHJldHVybiAwCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRvbmUKPiArwqDCoMKgwqDCoMKgwqBkb25lCj4gK8KgwqDC oMKgwqDCoMKgIyBrZXJuZWxfZXJyIG1pZ2h0IGFscmVhZHkgaGF2ZSBiZWVuIHBvcHVsYXRlZCBi eQo+IHRyeV9kZWNvbXByZXNzKCkgaWYgd2UncmUgbWlzc2luZyBvbmUgb2YgdGhlIHRvb2xzCj4g K0BAIC0xNDI5LDcgKzE0MjksNyBAQCBtb3VudF9kZWJ1Z2ZzKCkKPiArIHsKPiArwqDCoMKgwqDC oMKgwqBpZiBbICEgLWUgL3N5cy9rZXJuZWwvZGVidWcvc2NoZWRfZmVhdHVyZXMgXTsgdGhlbgo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIHRyeSB0byBtb3VudCB0aGUgZGVidWdm cyBoaWVyYXJjaHkgb3Vyc2VsdmVzIGFuZAo+IHJlbWVtYmVyIGl0IHRvIHVtb3VudCBhZnRlcndh cmRzCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbW91bnQgLXQgZGVidWdmcyBkZWJ1 Z2ZzIC9zeXMva2VybmVsL2RlYnVnCj4gMj4vZGV2L251bGwgJiYgbW91bnRlZF9kZWJ1Z2ZzPTEK PiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBAbW91bnRAIC10IGRlYnVnZnMgZGVidWdm cyAvc3lzL2tlcm5lbC9kZWJ1Zwo+IDI+L2Rldi9udWxsICYmIG1vdW50ZWRfZGVidWdmcz0xCj4g K8KgwqDCoMKgwqDCoMKgZmkKPiArIH0KPiArCj4gK0BAIC0xNDQwLDEyICsxNDQwLDEyIEBAIGxv YWRfbXNyKCkKPiArwqDCoMKgwqDCoMKgwqBsb2FkX21zcl9vbmNlPTEKPiArCj4gK8KgwqDCoMKg wqDCoMKgaWYgWyAiJG9zIiA9IExpbnV4IF07IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBpZiAhIGdyZXAgLXF3IG1zciAiJHByb2Nmcy9tb2R1bGVzIiAyPi9kZXYvbnVsbDsg dGhlbgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBtb2Rw cm9iZSBtc3IgMj4vZGV2L251bGwgJiYgaW5zbW9kX21zcj0xCj4gKyvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgaWYgISBAZ3JlcEAgLXF3IG1zciAiJHByb2Nmcy9tb2R1bGVzIiAyPi9kZXYv bnVsbDsKPiB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoEBtb2Rwcm9iZUAgbXNyIDI+L2Rldi9udWxsICYmIGluc21vZF9tc3I9MQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2RlYnVnICJhdHRlbXB0ZWQg dG8gbG9hZCBtb2R1bGUgbXNyLAo+IGluc21vZF9tc3I9JGluc21vZF9tc3IiCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAibXNyIG1vZHVsZSBhbHJlYWR5IGxvYWRlZCIKPiAr LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBpZiAhIGtsZHN0YXQgLXEgLW0gY3B1Y3RsOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrbGRsb2FkIGNwdWN0bCAyPi9kZXYvbnVs bCAmJgo+IGtsZGxvYWRfY3B1Y3RsPTEKPiArQEAgLTE0NjMsMTIgKzE0NjMsMTIgQEAgbG9hZF9j cHVpZCgpCj4gK8KgwqDCoMKgwqDCoMKgbG9hZF9jcHVpZF9vbmNlPTEKPiArCj4gK8KgwqDCoMKg wqDCoMKgaWYgWyAiJG9zIiA9IExpbnV4IF07IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBpZiAhIGdyZXAgLXF3IGNwdWlkICIkcHJvY2ZzL21vZHVsZXMiIDI+L2Rldi9udWxs Owo+IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg bW9kcHJvYmUgY3B1aWQgMj4vZGV2L251bGwgJiYgaW5zbW9kX2NwdWlkPTEKPiArK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAhIEBncmVwQCAtcXcgY3B1aWQgIiRwcm9jZnMvbW9kdWxl cyIgMj4vZGV2L251bGw7Cj4gdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBAbW9kcHJvYmVAIGNwdWlkIDI+L2Rldi9udWxsICYmCj4gaW5zbW9kX2Nw dWlkPTEKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9k ZWJ1ZyAiYXR0ZW1wdGVkIHRvIGxvYWQgbW9kdWxlIGNwdWlkLAo+IGluc21vZF9jcHVpZD0kaW5z bW9kX2NwdWlkIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbHNlCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgImNwdWlkIG1v ZHVsZSBhbHJlYWR5IGxvYWRlZCIKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgZWxzZQo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAhIGtsZHN0YXQgLXEgLW0gY3B1Y3Rs OyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBr bGRsb2FkIGNwdWN0bCAyPi9kZXYvbnVsbCAmJgo+IGtsZGxvYWRfY3B1Y3RsPTEKPiArQEAgLTE1 NTcsNyArMTU1Nyw3IEBAIHJlYWRfY3B1aWRfb25lX2NvcmUoKQo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBmaQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIG9uIHNv bWUga2VybmVsIHZlcnNpb25zLCAvZGV2L2NwdS8wL2NwdWlkIGRvZXNuJ3QKPiBpbXBseSB0aGF0 IHRoZSBjcHVpZCBtb2R1bGUgaXMgbG9hZGVkLCBpbiB0aGF0IGNhc2UgZGQgcmV0dXJucyBhbgo+ IGVycm9yLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIHdlIHVzZSB0aGF0IGZh Y3QgdG8gbG9hZCB0aGUgbW9kdWxlIGlmIGRkIHJldHVybnMKPiBhbiBlcnJvcgo+ICstwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICEgZGQgaWY9L2Rldi9jcHUvMC9jcHVpZCBicz0xNiBj b3VudD0xID4vZGV2L251bGwKPiAyPiYxOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgaWYgISBAZGRAIGlmPS9kZXYvY3B1LzAvY3B1aWQgYnM9MTYgY291bnQ9MQo+ID4vZGV2 L251bGwgMj4mMTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgbG9hZF9jcHVpZAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIHdlIG5lZWQgX2xlYWYgdG8gYmUgY29u dmVydGVkIHRvIGRlY2ltYWwgZm9yIGRkCj4gK0BAIC0xNTY4LDE0ICsxNTY4LDE0IEBAIHJlYWRf Y3B1aWRfb25lX2NvcmUoKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGRza2lw PSQoKCBfcG9zaXRpb24gLyAxNiApKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBf b2Rza2lwPSQoKCBfcG9zaXRpb24gLSBfZGRza2lwICogMTYgKSkKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIyBub3cgcmVhZCB0aGUgdmFsdWUKPiArLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBfY3B1aWQ9JChkZCBpZj0iL2Rldi9jcHUvJF9jb3JlL2NwdWlkIiBicz0xNgo+ IHNraXA9JF9kZHNraXAgY291bnQ9JCgoX29kc2tpcCArIDEpKSAyPi9kZXYvbnVsbCB8IG9kIC1q ICQoKF9vZHNraXAgKgo+IDE2KSkgLUEgbiAtdCB1NCkKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBfY3B1aWQ9JChAZGRAIGlmPSIvZGV2L2NwdS8kX2NvcmUvY3B1aWQiIGJzPTE2Cj4g c2tpcD0kX2Rkc2tpcCBjb3VudD0kKChfb2Rza2lwICsgMSkpIDI+L2Rldi9udWxsIHwgQG9kQCAt aiAkKChfb2Rza2lwCj4gKiAxNikpIC1BIG4gLXQgdTQpCj4gK8KgwqDCoMKgwqDCoMKgZWxpZiBb IC1lIC9kZXYvY3B1Y3RsMCBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCMgQlNECj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgISAtciAvZGV2L2Nw dWN0bDAgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgcmVhZF9jcHVpZF9tc2c9IkNvdWxkbid0IHJlYWQgY3B1aWQgaW5mbyBmcm9tCj4gY3B1 Y3RsIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0 dXJuICRSRUFEX0NQVUlEX1JFVF9FUlIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg ZmkKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfY3B1aWQ9JChjcHVjb250cm9sIC1p ICIkX2xlYWYiLCIkX3N1YmxlYWYiCj4gIi9kZXYvY3B1Y3RsJF9jb3JlIiAyPi9kZXYvbnVsbCB8 IGN1dCAtZDogLWYyLSkKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfY3B1aWQ9JChj cHVjb250cm9sIC1pICIkX2xlYWYiLCIkX3N1YmxlYWYiCj4gIi9kZXYvY3B1Y3RsJF9jb3JlIiAy Pi9kZXYvbnVsbCB8IEBjdXRAIC1kOiAtZjItKQpZb3UncmUgbWlzc2luZyBjcHVjb250cm9sIGhl cmUuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgY3B1aWQgbGV2ZWwgMHg0LCBs ZXZlbF90eXBlIDB4MjogMHgxYzAwNDE0Mwo+IDB4MDFjMDAwM2YgMHgwMDAwMDFmZiAweDAwMDAw MDAwCj4gK8KgwqDCoMKgwqDCoMKgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqByZWFkX2NwdWlkX21zZz0iRm91bmQgbm8gd2F5IHRvIHJlYWQgY3B1aWQgaW5mbyIKPiArQEAg LTE1OTgsNyArMTU5OCw3IEBAIHJlYWRfY3B1aWRfb25lX2NvcmUoKQo+ICvCoMKgwqDCoMKgwqDC oGZpCj4gKwo+ICvCoMKgwqDCoMKgwqDCoCMgZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIg d2Ugd2FudAo+ICstwqDCoMKgwqDCoMKgX3JlZz0kKGVjaG8gIiRfY3B1aWQiIHwgYXdrICd7cHJp bnQgJCciJF9yZWdpc3RlciInfScpCj4gKyvCoMKgwqDCoMKgwqBfcmVnPSQoZWNobyAiJF9jcHVp ZCIgfCBAYXdrQCAne3ByaW50ICQnIiRfcmVnaXN0ZXIiJ30nKQo+ICvCoMKgwqDCoMKgwqDCoCMg TGludXggcmV0dXJucyBpdCBhcyBkZWNpbWFsLCBCU0QgYXMgaGV4LCBub3JtYWxpemUgdG8KPiBk ZWNpbWFsCj4gK8KgwqDCoMKgwqDCoMKgX3JlZz0kKCggX3JlZyApKQo+ICvCoMKgwqDCoMKgwqDC oCMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjA0Ngo+ICtAQCAtMTYyNiwxMSArMTYyNiwxMSBAQCBk bWVzZ19ncmVwKCkKPiArwqDCoMKgwqDCoMKgwqAjIGdyZXAgZm9yIHNvbWV0aGluZyBpbiBkbWVz ZywgZW5zdXJpbmcgdGhhdCB0aGUgZG1lc2cgYnVmZmVyCj4gK8KgwqDCoMKgwqDCoMKgIyBoYXMg bm90IGJlZW4gdHJ1bmNhdGVkCj4gK8KgwqDCoMKgwqDCoMKgZG1lc2dfZ3JlcHBlZD0nJwo+ICst wqDCoMKgwqDCoMKgaWYgISBkbWVzZyB8IGdyZXAgLXFFIC1lICcoXnxcXSApTGludXggdmVyc2lv biBbMC05XScgLWUKPiAnXkZyZWVCU0QgaXMgYSByZWdpc3RlcmVkJyA7IHRoZW4KPiArK8KgwqDC oMKgwqDCoGlmICEgQGRtZXNnQCB8IEBncmVwQCAtcUUgLWUgJyhefFxdIClMaW51eCB2ZXJzaW9u IFswLTldJyAtZQo+ICdeRnJlZUJTRCBpcyBhIHJlZ2lzdGVyZWQnIDsgdGhlbgo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIGRtZXNnIHRydW5jYXRlZAo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gMgo+ICvCoMKgwqDCoMKgwqDCoGZpCj4gKy3CoMKgwqDC oMKgwqBkbWVzZ19ncmVwcGVkPSQoZG1lc2cgfCBncmVwIC1FICIkMSIgfCBoZWFkIC0xKQo+ICsr wqDCoMKgwqDCoMKgZG1lc2dfZ3JlcHBlZD0kKEBkbWVzZ0AgfCBAZ3JlcEAgLUUgIiQxIiB8IEBo ZWFkQCAtMSkKPiArwqDCoMKgwqDCoMKgwqAjIG5vdCBmb3VuZDoKPiArwqDCoMKgwqDCoMKgwqBb IC16ICIkZG1lc2dfZ3JlcHBlZCIgXSAmJiByZXR1cm4gMQo+ICvCoMKgwqDCoMKgwqDCoCMgZm91 bmQsIG91dHB1dCBpcyBpbiAkZG1lc2dfZ3JlcHBlZAo+ICtAQCAtMTY0NywxMiArMTY0NywxMiBA QCBwYXJzZV9jcHVfZGV0YWlscygpCj4gKyB7Cj4gK8KgwqDCoMKgwqDCoMKgWyAiJHtwYXJzZV9j cHVfZGV0YWlsc19kb25lOi19IiA9IDEgXSAmJiByZXR1cm4gMAo+ICsKPiArLcKgwqDCoMKgwqDC oGlmIGNvbW1hbmQgLXYgbnByb2MgPi9kZXYvbnVsbDsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoG51bWJlcl9vZl9jb3Jlcz0kKG5wcm9jKQo+ICstwqDCoMKgwqDCoMKgZWxp ZiBlY2hvICIkb3MiIHwgZ3JlcCAtcSBCU0Q7IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBudW1iZXJfb2ZfY29yZXM9JChzeXNjdGwgLW4gaHcubmNwdSAyPi9kZXYvbnVsbCB8 fAo+IGVjaG8gMSkKPiArK8KgwqDCoMKgwqDCoGlmIGNvbW1hbmQgLXYgQG5wcm9jQCA+L2Rldi9u dWxsOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbnVtYmVyX29mX2NvcmVz PSQoQG5wcm9jQCkKPiArK8KgwqDCoMKgwqDCoGVsaWYgZWNobyAiJG9zIiB8IEBncmVwQCAtcSBC U0Q7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBudW1iZXJfb2ZfY29yZXM9 JChAc3lzY3RsQCAtbiBody5uY3B1IDI+L2Rldi9udWxsIHx8Cj4gZWNobyAxKQo+ICvCoMKgwqDC oMKgwqDCoGVsaWYgWyAtZSAiJHByb2Nmcy9jcHVpbmZvIiBdOyB0aGVuCj4gKy3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgbnVtYmVyX29mX2NvcmVzPSQoZ3JlcCAtYyBecHJvY2Vzc29yCj4g IiRwcm9jZnMvY3B1aW5mbyIgMj4vZGV2L251bGwgfHwgZWNobyAxKQo+ICsrwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoG51bWJlcl9vZl9jb3Jlcz0kKEBncmVwQCAtYyBecHJvY2Vzc29yCj4g IiRwcm9jZnMvY3B1aW5mbyIgMj4vZGV2L251bGwgfHwgZWNobyAxKQo+ICvCoMKgwqDCoMKgwqDC oGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBpZiB3ZSBkb24ndCBrbm93 LCBkZWZhdWx0IHRvIDEgQ1BVCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG51bWJl cl9vZl9jb3Jlcz0xCj4gK0BAIC0xNjYwLDQzICsxNjYwLDQzIEBAIHBhcnNlX2NwdV9kZXRhaWxz KCkKPiArwqDCoMKgwqDCoMKgwqBtYXhfY29yZV9pZD0kKCggbnVtYmVyX29mX2NvcmVzIC0gMSAp KQo+ICsKPiArwqDCoMKgwqDCoMKgwqBpZiBbIC1lICIkcHJvY2ZzL2NwdWluZm8iIF07IHRoZW4K PiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfdmVuZG9yPSQowqAgZ3JlcCAnXnZl bmRvcl9pZCfCoCAiJHByb2Nmcy9jcHVpbmZvIiB8Cj4gYXdrICd7cHJpbnQgJDN9JyB8IGhlYWQg LTEpCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY3B1X2ZyaWVuZGx5X25hbWU9JChn cmVwICdebW9kZWwgbmFtZScKPiAiJHByb2Nmcy9jcHVpbmZvIiB8IGN1dCAtZDogLWYyLSB8IGhl YWQgLTEgfCBzZWQgLWUgJ3MvXiAqLy8nKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGNwdV92ZW5kb3I9JCjCoCBAZ3JlcEAgJ152ZW5kb3JfaWQnwqAgIiRwcm9jZnMvY3B1aW5mbyIK PiB8IEBhd2tAICd7cHJpbnQgJDN9JyB8IEBoZWFkQCAtMSkKPiArK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBjcHVfZnJpZW5kbHlfbmFtZT0kKEBncmVwQCAnXm1vZGVsIG5hbWUnCj4gIiRw cm9jZnMvY3B1aW5mbyIgfCBAY3V0QCAtZDogLWYyLSB8IEBoZWFkQCAtMSB8IEBzZWRAIC1lICdz L14gKi8vJykKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBzcGVjaWFsIGNhc2Ug Zm9yIEFSTSBmb2xsb3dzCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgZ3JlcCAt cWkgJ0NQVQo+IGltcGxlbWVudGVyW1s6c3BhY2U6XV0qOltbOnNwYWNlOl1dKjB4NDEnICIkcHJv Y2ZzL2NwdWluZm8iOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgQGdy ZXBAIC1xaSAnQ1BVCj4gaW1wbGVtZW50ZXJbWzpzcGFjZTpdXSo6W1s6c3BhY2U6XV0qMHg0MScg IiRwcm9jZnMvY3B1aW5mbyI7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGNwdV92ZW5kb3I9J0FSTScKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgc29tZSBkZXZpY2VzIChwaG9uZXMgb3Igb3RoZXIp IGhhdmUgc2V2ZXJhbAo+IEFSTXMgYW5kIGFzIHN1Y2ggZGlmZmVyZW50IHBhcnQgbnVtYmVycywK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgYW4gZXhh bXBsZSBpcyAiYmlnTElUVExFIiwgc28gd2UgbmVlZCB0bwo+IHN0b3JlIHRoZSB3aG9sZSBsaXN0 LCB0aGlzIGlzIG5lZWRlZCBmb3IgaXNfY3B1X2FmZmVjdGVkCj4gKy3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNwdV9wYXJ0X2xpc3Q9JChhd2sgJy9DUFUgcGFy dC/CoMKgwqDCoMKgwqDCoMKgCj4ge3ByaW50ICQ0fScgIiRwcm9jZnMvY3B1aW5mbyIpCj4gKy3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNwdV9hcmNoX2xpc3Q9 JChhd2sgJy9DUFUgYXJjaGl0ZWN0dXJlLwo+IHtwcmludCAkM30nICIkcHJvY2ZzL2NwdWluZm8i KQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfcGFy dF9saXN0PSQoQGF3a0AgJy9DUFUgcGFydC/CoMKgwqDCoMKgwqDCoMKgCj4ge3ByaW50ICQ0fScg IiRwcm9jZnMvY3B1aW5mbyIpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGNwdV9hcmNoX2xpc3Q9JChAYXdrQCAnL0NQVSBhcmNoaXRlY3R1cmUvCj4ge3By aW50ICQzfScgIiRwcm9jZnMvY3B1aW5mbyIpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAjIHRha2UgdGhlIGZpcnN0IG9uZSB0byBmaWxsIHRoZSBmcmll bmRseQo+IG5hbWUsIGRvIE5PVCBxdW90ZSB0aGUgdmFycyBiZWxvdwo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0My MDg2Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNwdV9h cmNoPSQoZWNobyAkY3B1X2FyY2hfbGlzdCB8IGF3ayAneyBwcmludAo+ICQxIH0nKQo+ICsrwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfYXJjaD0kKGVjaG8g JGNwdV9hcmNoX2xpc3QgfCBAYXdrQCAnewo+IHByaW50ICQxIH0nKQo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0My MDg2Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNwdV9w YXJ0PSQoZWNobyAkY3B1X3BhcnRfbGlzdCB8IGF3ayAneyBwcmludAo+ICQxIH0nKQo+ICsrwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfcGFydD0kKGVjaG8g JGNwdV9wYXJ0X2xpc3QgfCBAYXdrQCAnewo+IHByaW50ICQxIH0nKQo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgWyAiJGNwdV9hcmNoIiA9ICJBQXJjaDY0 IiBdICYmIGNwdV9hcmNoPTgKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGNwdV9mcmllbmRseV9uYW1lPSJBUk0iCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC1uICIkY3B1X2FyY2giIF0gJiYKPiBjcHVfZnJp ZW5kbHlfbmFtZT0iJGNwdV9mcmllbmRseV9uYW1lIHYkY3B1X2FyY2giCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC1uICIkY3B1X3BhcnQiIF0gJiYK PiBjcHVfZnJpZW5kbHlfbmFtZT0iJGNwdV9mcmllbmRseV9uYW1lIG1vZGVsICRjcHVfcGFydCIK PiArCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiBncmVwIC1xaSAnQ1BVCj4g aW1wbGVtZW50ZXJbWzpzcGFjZTpdXSo6W1s6c3BhY2U6XV0qMHg0MycgIiRwcm9jZnMvY3B1aW5m byI7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIEBncmVwQCAtcWkg J0NQVQo+IGltcGxlbWVudGVyW1s6c3BhY2U6XV0qOltbOnNwYWNlOl1dKjB4NDMnICIkcHJvY2Zz L2NwdWluZm8iOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBjcHVfdmVuZG9yPSdDQVZJVU0nCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgZWxpZiBncmVwIC1xaSAnQ1BVCj4gaW1wbGVtZW50ZXJbWzpzcGFjZTpdXSo6W1s6c3BhY2U6 XV0qMHg3MCcgIiRwcm9jZnMvY3B1aW5mbyI7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBlbGlmIEBncmVwQCAtcWkgJ0NQVQo+IGltcGxlbWVudGVyW1s6c3BhY2U6XV0qOltb OnNwYWNlOl1dKjB4NzAnICIkcHJvY2ZzL2NwdWluZm8iOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfdmVuZG9yPSdQSFlUSVVNJwo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ICsKPiArLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBjcHVfZmFtaWx5PSQowqAgZ3JlcCAnXmNwdSBmYW1pbHknICIkcHJvY2ZzL2Nw dWluZm8iIHwKPiBhd2sgJ3twcmludCAkNH0nIHwgZ3JlcCAtRSAnXlswLTldKyQnIHwgaGVhZCAt MSkKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfbW9kZWw9JCjCoMKgIGdyZXAg J15tb2RlbCfCoMKgwqDCoMKgICIkcHJvY2ZzL2NwdWluZm8iIHwKPiBhd2sgJ3twcmludCAkM30n IHwgZ3JlcCAtRSAnXlswLTldKyQnIHwgaGVhZCAtMSkKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBjcHVfc3RlcHBpbmc9JChncmVwICdec3RlcHBpbmcnwqDCoCAiJHByb2Nmcy9jcHVp bmZvIiB8Cj4gYXdrICd7cHJpbnQgJDN9JyB8IGdyZXAgLUUgJ15bMC05XSskJyB8IGhlYWQgLTEp Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY3B1X3Vjb2RlPSQowqDCoCBncmVwICde bWljcm9jb2RlJ8KgICIkcHJvY2ZzL2NwdWluZm8iIHwKPiBhd2sgJ3twcmludCAkM30nIHwgaGVh ZCAtMSkKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfZmFtaWx5PSQowqAgQGdy ZXBAICdeY3B1IGZhbWlseScgIiRwcm9jZnMvY3B1aW5mbyIKPiB8IEBhd2tAICd7cHJpbnQgJDR9 JyB8IEBncmVwQCAtRSAnXlswLTldKyQnIHwgQGhlYWRAIC0xKQo+ICsrwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGNwdV9tb2RlbD0kKMKgwqAgQGdyZXBAICdebW9kZWwnwqDCoMKgwqDCoCAi JHByb2Nmcy9jcHVpbmZvIgo+IHwgQGF3a0AgJ3twcmludCAkM30nIHwgQGdyZXBAIC1FICdeWzAt OV0rJCcgfCBAaGVhZEAgLTEpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY3B1X3N0 ZXBwaW5nPSQoQGdyZXBAICdec3RlcHBpbmcnwqDCoCAiJHByb2Nmcy9jcHVpbmZvIgo+IHwgQGF3 a0AgJ3twcmludCAkM30nIHwgQGdyZXBAIC1FICdeWzAtOV0rJCcgfCBAaGVhZEAgLTEpCj4gKyvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY3B1X3Vjb2RlPSQowqDCoCBAZ3JlcEAgJ15taWNy b2NvZGUnwqAgIiRwcm9jZnMvY3B1aW5mbyIKPiB8IEBhd2tAICd7cHJpbnQgJDN9JyB8IEBoZWFk QCAtMSkKPiArwqDCoMKgwqDCoMKgwqBlbHNlCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgY3B1X3ZlbmRvcj0kKCBkbWVzZyB8IGdyZXAgLWkgLW0xICdPcmlnaW49JyB8IGN1dCAtZjIK PiAtdyB8IGN1dCAtZjIgLWQ9IHwgY3V0IC1mMiAtZFwiICkKPiArLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBjcHVfZmFtaWx5PSQoIGRtZXNnIHwgZ3JlcCAtaSAtbTEgJ0ZhbWlseT0nIHwg Y3V0IC1mNAo+IC13IHwgY3V0IC1mMiAtZD0gKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGNwdV92ZW5kb3I9JCggQGRtZXNnQCB8IEBncmVwQCAtaSAtbTEgJ09yaWdpbj0nIHwKPiBA Y3V0QCAtZjIgLXcgfCBAY3V0QCAtZjIgLWQ9IHwgQGN1dEAgLWYyIC1kXCIgKQo+ICsrwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNwdV9mYW1pbHk9JCggQGRtZXNnQCB8IEBncmVwQCAtaSAt bTEgJ0ZhbWlseT0nIHwKPiBAY3V0QCAtZjQgLXcgfCBAY3V0QCAtZjIgLWQ9ICkKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY3B1X2ZhbWlseT0kKCggY3B1X2ZhbWlseSApKQo+ICst wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNwdV9tb2RlbD0kKCBkbWVzZyB8IGdyZXAgLWkg LW0xICdNb2RlbD0nIHwgY3V0IC1mNSAtCj4gdyB8IGN1dCAtZjIgLWQ9ICkKPiArK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfbW9kZWw9JCggQGRtZXNnQCB8IEBncmVwQCAtaSAtbTEg J01vZGVsPScgfCBAY3V0QAo+IC1mNSAtdyB8IEBjdXRAIC1mMiAtZD0gKQo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfbW9kZWw9JCgoIGNwdV9tb2RlbCApKQo+ICstwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNwdV9zdGVwcGluZz0kKCBkbWVzZyB8IGdyZXAgLWkgLW0x ICdTdGVwcGluZz0nIHwgY3V0Cj4gLWY2IC13IHwgY3V0IC1mMiAtZD0gKQo+ICstwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGNwdV9mcmllbmRseV9uYW1lPSQoc3lzY3RsIC1uIGh3Lm1vZGVs IDI+L2Rldi9udWxsKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNwdV9zdGVwcGlu Zz0kKCBAZG1lc2dAIHwgQGdyZXBAIC1pIC1tMSAnU3RlcHBpbmc9JyB8Cj4gQGN1dEAgLWY2IC13 IHwgQGN1dEAgLWYyIC1kPSApCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY3B1X2Zy aWVuZGx5X25hbWU9JChAc3lzY3RsQCAtbiBody5tb2RlbCAyPi9kZXYvbnVsbCkKPiArwqDCoMKg wqDCoMKgwqBmaQo+ICsKPiArwqDCoMKgwqDCoMKgwqBpZiBbIC1uICIke1NNQ19NT0NLX0NQVV9G UklFTkRMWV9OQU1FOi19IiBdOyB0aGVuCj4gK0BAIC0xNzUxLDcgKzE3NTEsNyBAQCBwYXJzZV9j cHVfZGV0YWlscygpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAjIGNhbGwgQ1BVSUQKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGNwdWNvbnRyb2wgLWkgMSAvZGV2L2NwdWN0bDAgPi9kZXYvbnVsbAo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyByZWFkIE1TUgo+ICst wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfdWNvZGU9JChj cHVjb250cm9sIC1tIDB4OGIgL2Rldi9jcHVjdGwwIHwKPiBhd2sgJ3twcmludCAkM30nKQo+ICsr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfdWNvZGU9JChj cHVjb250cm9sIC1tIDB4OGIgL2Rldi9jcHVjdGwwIHwKPiBAYXdrQCAne3ByaW50ICQzfScpCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIGNvbnZlcnQg dG8gZGVjaW1hbAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgY3B1X3Vjb2RlPSQoKCBjcHVfdWNvZGUgKSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgY29udmVydCBiYWNrIHRvIGhleAo+ICtAQCAtMTc3MCw3 ICsxNzcwLDcgQEAgcGFyc2VfY3B1X2RldGFpbHMoKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBtb2NrbWU9JChwcmludGYgIiViXG4lYiIgIiRtb2NrbWUiCj4gIlNNQ19NT0NLX0NQ VV9VQ09ERT0nJGNwdV91Y29kZSciKQo+ICvCoMKgwqDCoMKgwqDCoGZpCj4gKwo+ICstwqDCoMKg wqDCoMKgZWNobyAiJGNwdV91Y29kZSIgfCBncmVwIC1xIF4weCAmJiBjcHVfdWNvZGU9JCgoIGNw dV91Y29kZSApKQo+ICsrwqDCoMKgwqDCoMKgZWNobyAiJGNwdV91Y29kZSIgfCBAZ3JlcEAgLXEg XjB4ICYmIGNwdV91Y29kZT0kKCggY3B1X3Vjb2RlCj4gKSkKPiArwqDCoMKgwqDCoMKgwqB1Y29k ZV9mb3VuZD0kKHByaW50ZiAiZmFtaWx5IDB4JXggbW9kZWwgMHgleCBzdGVwcGluZyAweCV4Cj4g dWNvZGUgMHgleCBjcHVpZCAweCV4IiAiJGNwdV9mYW1pbHkiICIkY3B1X21vZGVsIiAiJGNwdV9z dGVwcGluZyIKPiAiJGNwdV91Y29kZSIgIiRjcHVfY3B1aWQiKQo+ICsKPiArwqDCoMKgwqDCoMKg wqAjIGFsc28gZGVmaW5lIHRob3NlIHRoYXQgd2Ugd2lsbCBuZWVkIGluIG90aGVyIGZ1bmNzCj4g K0BAIC0xODY3LDggKzE4NjcsOCBAQCBpc19jcHVfc210X2VuYWJsZWQoKQo+ICsgewo+ICvCoMKg wqDCoMKgwqDCoCMgU01UIC8gSHlwZXJUaHJlYWRpbmcgaXMgZW5hYmxlZCBpZiBzaWJsaW5ncyAh PSBjcHVjb3Jlcwo+ICvCoMKgwqDCoMKgwqDCoGlmIFsgLWUgIiRwcm9jZnMvY3B1aW5mbyIgXTsg dGhlbgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9zaWJsaW5ncz0kKGF3ayAnL15z aWJsaW5ncy/CoCB7cHJpbnQgJDM7ZXhpdH0nCj4gIiRwcm9jZnMvY3B1aW5mbyIpCj4gKy3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2NwdWNvcmVzPSQoYXdrICcvXmNwdSBjb3Jlcy8ge3By aW50ICQ0O2V4aXR9Jwo+ICIkcHJvY2ZzL2NwdWluZm8iKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoF9zaWJsaW5ncz0kKEBhd2tAICcvXnNpYmxpbmdzL8KgIHtwcmludCAkMztleGl0 fScKPiAiJHByb2Nmcy9jcHVpbmZvIikKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBf Y3B1Y29yZXM9JChAYXdrQCAnL15jcHUgY29yZXMvIHtwcmludCAkNDtleGl0fScKPiAiJHByb2Nm cy9jcHVpbmZvIikKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAtbiAiJF9z aWJsaW5ncyIgXSAmJiBbIC1uICIkX2NwdWNvcmVzIiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICIkX3NpYmxpbmdzIiA9ICIkX2Nw dWNvcmVzIiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIDEKPiArQEAgLTE5MTYsMTAgKzE5MTYsMTAg QEAgaXNfdWNvZGVfYmxhY2tsaXN0ZWQoKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAkSU5URUxfRkFNNl9TQU5EWUJSSURHRV9YLDB4MDYsMHg2MWLCoMKgIFwKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgJElOVEVMX0ZBTTZfU0FORFlCUklER0VfWCwweDA3LDB4NzEy Cj4gK8KgwqDCoMKgwqDCoMKgZG8KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBtb2Rl bD0kKGVjaG8gIiR0dXBsZSIgfCBjdXQgLWQsIC1mMSkKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBzdGVwcGluZz0kKCggJChlY2hvICIkdHVwbGUiIHwgY3V0IC1kLCAtZjIpICkpCj4g KyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbW9kZWw9JChlY2hvICIkdHVwbGUiIHwgQGN1 dEAgLWQsIC1mMSkKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzdGVwcGluZz0kKCgg JChlY2hvICIkdHVwbGUiIHwgQGN1dEAgLWQsIC1mMikgKSkKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgaWYgWyAiJGNwdV9tb2RlbCIgPSAiJG1vZGVsIiBdICYmIFsgIiRjcHVfc3Rl cHBpbmciID0KPiAiJHN0ZXBwaW5nIiBdOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoHVjb2RlPSQoKCAkKGVjaG8gIiR0dXBsZSIgfCBjdXQgLWQs IC1mMykgKSkKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg dWNvZGU9JCgoICQoZWNobyAiJHR1cGxlIiB8IEBjdXRAIC1kLCAtZjMpICkpCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICIkY3B1X3Vjb2RlIiA9 ICIkdWNvZGUiIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgImlzX3Vjb2RlX2JsYWNrbGlzdGVkOiB3 ZSBoYXZlCj4gYSBtYXRjaCEgKCRjcHVfbW9kZWwvJGNwdV9zdGVwcGluZy8kY3B1X3Vjb2RlKSIK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqByZXR1cm4gMAo+ICtAQCAtMjAwNyw3ICsyMDA3LDcgQEAgaXNfeGVuX2RvbTAoKQo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gMQo+ICvCoMKgwqDCoMKgwqDC oGZpCj4gKwo+ICstwqDCoMKgwqDCoMKgaWYgWyAtZSAiJHByb2Nmcy94ZW4vY2FwYWJpbGl0aWVz IiBdICYmIGdyZXAgLXEgImNvbnRyb2xfZCIKPiAiJHByb2Nmcy94ZW4vY2FwYWJpbGl0aWVzIjsg dGhlbgo+ICsrwqDCoMKgwqDCoMKgaWYgWyAtZSAiJHByb2Nmcy94ZW4vY2FwYWJpbGl0aWVzIiBd ICYmIEBncmVwQCAtcSAiY29udHJvbF9kIgo+ICIkcHJvY2ZzL3hlbi9jYXBhYmlsaXRpZXMiOyB0 aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAwCj4gK8KgwqDCoMKg wqDCoMKgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gMQo+ICtA QCAtMjAzMywxMiArMjAzMywxMiBAQCBpc194ZW5fZG9tVSgpCj4gK8KgwqDCoMKgwqDCoMKgZmkK PiArIH0KPiArCj4gKy1idWlsdGluX2RidmVyc2lvbj0kKGF3ayAnL14jICUlJSBNQ0VEQiAvIHsg cHJpbnQgJDQgfScgIiQwIikKPiArK2J1aWx0aW5fZGJ2ZXJzaW9uPSQoQGF3a0AgJy9eIyAlJSUg TUNFREIgLyB7IHByaW50ICQ0IH0nICIkMCIpCj4gKyBpZiBbIC1yICIkbWNlZGJfY2FjaGUiIF07 IHRoZW4KPiArwqDCoMKgwqDCoMKgwqAjIHdlIGhhdmUgYSBsb2NhbCBjYWNoZSBmaWxlLCBidXQg aXQgbWlnaHQgYmUgb2xkZXIgdGhhbiB0aGUKPiBidWlsdGluIHZlcnNpb24gd2UgaGF2ZQo+ICst wqDCoMKgwqDCoMKgbG9jYWxfZGJ2ZXJzaW9uPSQowqAgYXdrICcvXiMgJSUlIE1DRURCIC8geyBw cmludCAkNCB9Jwo+ICIkbWNlZGJfY2FjaGUiKQo+ICsrwqDCoMKgwqDCoMKgbG9jYWxfZGJ2ZXJz aW9uPSQowqAgQGF3a0AgJy9eIyAlJSUgTUNFREIgLyB7IHByaW50ICQ0IH0nCj4gIiRtY2VkYl9j YWNoZSIpCj4gK8KgwqDCoMKgwqDCoMKgIyBzb3J0IC1WIHNvcnRzIGJ5IHZlcnNpb24gbnVtYmVy Cj4gKy3CoMKgwqDCoMKgwqBvbGRlcl9kYnZlcnNpb249JChwcmludGYgIiViXG4lYiIgIiRsb2Nh bF9kYnZlcnNpb24iCj4gIiRidWlsdGluX2RidmVyc2lvbiIgfCBzb3J0IC1WIHwgaGVhZCAtbjEp Cj4gKyvCoMKgwqDCoMKgwqBvbGRlcl9kYnZlcnNpb249JChwcmludGYgIiViXG4lYiIgIiRsb2Nh bF9kYnZlcnNpb24iCj4gIiRidWlsdGluX2RidmVyc2lvbiIgfCBAc29ydEAgLVYgfCBAaGVhZEAg LW4xKQo+ICvCoMKgwqDCoMKgwqDCoGlmIFsgIiRvbGRlcl9kYnZlcnNpb24iID0gIiRidWlsdGlu X2RidmVyc2lvbiIgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBtY2Vk Yl9zb3VyY2U9IiRtY2VkYl9jYWNoZSIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg bWNlZGJfaW5mbz0ibG9jYWwgZmlybXdhcmVzIERCICRsb2NhbF9kYnZlcnNpb24iCj4gK0BAIC0y MDUxLDcgKzIwNTEsNyBAQCBpZiBbIC16ICIke21jZWRiX3NvdXJjZTotfSIgXTsgdGhlbgo+ICsg ZmkKPiArIHJlYWRfbWNlZGIoKQo+ICsgewo+ICstwqDCoMKgwqDCoMKgYXdrICd7IGlmIChERUxJ TT09MSkgeyBwcmludCAkMiB9IH0gL14jICUlJSBNQ0VEQiAvIHsgREVMSU09MQo+IH0nICIkbWNl ZGJfc291cmNlIgo+ICsrwqDCoMKgwqDCoMKgQGF3a0AgJ3sgaWYgKERFTElNPT0xKSB7IHByaW50 ICQyIH0gfSAvXiMgJSUlIE1DRURCIC8gewo+IERFTElNPTEgfScgIiRtY2VkYl9zb3VyY2UiCj4g KyB9Cj4gKwo+ICsgaXNfbGF0ZXN0X2tub3duX3Vjb2RlKCkKPiArQEAgLTIwNzAsMTAgKzIwNzAs MTAgQEAgaXNfbGF0ZXN0X2tub3duX3Vjb2RlKCkKPiArwqDCoMKgwqDCoMKgwqBlbHNlCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAyCj4gK8KgwqDCoMKgwqDCoMKgZmkK PiArLcKgwqDCoMKgwqDCoGZvciB0dXBsZSBpbiAkKHJlYWRfbWNlZGIgfCBncmVwICIkKHByaW50 Zgo+ICJeJGNwdV9icmFuZF9wcmVmaXgsMHglMDhYLCIgIiRjcHVfY3B1aWQiKSIpCj4gKyvCoMKg wqDCoMKgwqBmb3IgdHVwbGUgaW4gJChyZWFkX21jZWRiIHwgQGdyZXBAICIkKHByaW50Zgo+ICJe JGNwdV9icmFuZF9wcmVmaXgsMHglMDhYLCIgIiRjcHVfY3B1aWQiKSIpCj4gK8KgwqDCoMKgwqDC oMKgZG8KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB1Y29kZT0kKCjCoCAkKGVjaG8g IiR0dXBsZSIgfCBjdXQgLWQsIC1mMykgKSkKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqB1Y29kZV9kYXRlPSQoZWNobyAiJHR1cGxlIiB8IGN1dCAtZCwgLWY0IHwgc2VkIC1yCj4gJ3M9 KC4uLi4pKC4uKSguLik9XDEvXDIvXDM9JykKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqB1Y29kZT0kKCjCoCAkKGVjaG8gIiR0dXBsZSIgfCBAY3V0QCAtZCwgLWYzKSApKQo+ICsrwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHVjb2RlX2RhdGU9JChlY2hvICIkdHVwbGUiIHwgQGN1 dEAgLWQsIC1mNCB8IEBzZWRAIC1yCj4gJ3M9KC4uLi4pKC4uKSguLik9XDEvXDIvXDM9JykKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2RlYnVnICJpc19sYXRlc3Rfa25vd25fdWNv ZGU6IHdpdGggY3B1aWQgJGNwdV9jcHVpZAo+IGhhcyB1Y29kZSAkY3B1X3Vjb2RlLCBsYXN0IGtu b3duIGlzICR1Y29kZSBmcm9tICR1Y29kZV9kYXRlIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqB1Y29kZV9sYXRlc3Q9JChwcmludGYgImxhdGVzdCB2ZXJzaW9uIGlzIDB4JXggZGF0 ZWQKPiAkdWNvZGVfZGF0ZSBhY2NvcmRpbmcgdG8gJG1jZWRiX2luZm8iICIkdWNvZGUiKQo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICIkY3B1X3Vjb2RlIiAtZ2UgIiR1Y29k ZSIgXTsgdGhlbgo+ICtAQCAtMjA5OCw3ICsyMDk4LDcgQEAgZ2V0X2NtZGxpbmUoKQo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrZXJuZWxfY21kbGluZT0iJFNNQ19NT0NLX0NNRExJ TkUiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybgo+ICvCoMKgwqDCoMKg wqDCoGVsc2UKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrZXJuZWxfY21kbGluZT0k KGNhdCAiJHByb2Nmcy9jbWRsaW5lIikKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBr ZXJuZWxfY21kbGluZT0kKEBjYXRAICIkcHJvY2ZzL2NtZGxpbmUiKQo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBtb2NrbWU9JChwcmludGYgIiViXG4lYiIgIiRtb2NrbWUiCj4gIlNN Q19NT0NLX0NNRExJTkU9JyRrZXJuZWxfY21kbGluZSciKQo+ICvCoMKgwqDCoMKgwqDCoGZpCj4g KyB9Cj4gK0BAIC0yMTA2LDcgKzIxMDYsNyBAQCBnZXRfY21kbGluZSgpCj4gKyAjIEVOVFJZUE9J TlQKPiArCj4gKyAjIHdlIGNhbid0IGRvIGFueXRoaW5nIHVzZWZ1bCB1bmRlciBXU0wKPiArLWlm IHVuYW1lIC1hIHwgZ3JlcCAtcUUgLS0gJy1NaWNyb3NvZnQgI1swLTldKy1NaWNyb3NvZnQgJzsg dGhlbgo+ICsraWYgQHVuYW1lQCAtYSB8IEBncmVwQCAtcUUgLS0gJy1NaWNyb3NvZnQgI1swLTld Ky1NaWNyb3NvZnQgJzsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoF93YXJuICJUaGlzIHNjcmlwdCBk b2Vzbid0IHdvcmsgdW5kZXIgV2luZG93cyBTdWJzeXN0ZW0gZm9yCj4gTGludXgiCj4gK8KgwqDC oMKgwqDCoMKgX3dhcm4gIllvdSBzaG91bGQgdXNlIHRoZSBvZmZpY2lhbCBNaWNyb3NvZnQgdG9v bCBpbnN0ZWFkLiIKPiArwqDCoMKgwqDCoMKgwqBfd2FybiAiSXQgY2FuIGJlIGZvdW5kIHVuZGVy Cj4gaHR0cHM6Ly9ha2EubXMvU3BlY3VsYXRpb25Db250cm9sUFMiCj4gK0BAIC0yMTU1LDE1ICsy MTU1LDE1IEBAIGZpCj4gKwo+ICsgIyBpZiB3ZSdyZSB1bmRlciBhIEJTRCwgdHJ5IHRvIG1vdW50 IGxpbnByb2NmcyBmb3IKPiAiJHByb2Nmcy9jcHVpbmZvIgo+ICsgcHJvY2ZzPS9wcm9jCj4gKy1p ZiBlY2hvICIkb3MiIHwgZ3JlcCAtcSBCU0Q7IHRoZW4KPiArK2lmIGVjaG8gIiRvcyIgfCBAZ3Jl cEAgLXEgQlNEOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgX2RlYnVnICJXZSdyZSB1bmRlciBCU0Qs IGNoZWNrIGlmIHdlIGhhdmUgcHJvY2ZzIgo+ICstwqDCoMKgwqDCoMKgcHJvY2ZzPSQobW91bnQg fCBhd2sgJy9ebGlucHJvY2ZzLyB7IHByaW50ICQzOyBleGl0OyB9JykKPiArK8KgwqDCoMKgwqDC oHByb2Nmcz0kKEBtb3VudEAgfCBAYXdrQCAnL15saW5wcm9jZnMvIHsgcHJpbnQgJDM7IGV4aXQ7 IH0nKQo+ICvCoMKgwqDCoMKgwqDCoGlmIFsgLXogIiRwcm9jZnMiIF07IHRoZW4KPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2RlYnVnICJ3ZSBkb24ndCwgdHJ5IHRvIG1vdW50IGl0 Igo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwcm9jZnM9L3Byb2MKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgWyAtZCAvY29tcGF0L2xpbnV4L3Byb2MgXSAmJgo+IHBy b2Nmcz0vY29tcGF0L2xpbnV4L3Byb2MKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg dGVzdCAtZCAkcHJvY2ZzIHx8IG1rZGlyICRwcm9jZnMKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBpZiBtb3VudCAtdCBsaW5wcm9jZnMgbGlucHJvY2ZzICRwcm9jZnMgMj4vZGV2L251 bGw7Cj4gdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIEBtb3VudEAgLXQg bGlucHJvY2ZzIGxpbnByb2NmcyAkcHJvY2ZzCj4gMj4vZGV2L251bGw7IHRoZW4KPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1vdW50ZWRfcHJvY2ZzPTEK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAi cHJvY2ZzIGp1c3QgbW91bnRlZCBhdCAkcHJvY2ZzIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBlbHNlCj4gK0BAIC0yMTk1LDE0ICsyMTk1LDE0IEBAIGZpCj4gKwo+ICsgaWYgWyAi JG9wdF9saXZlIiA9IDEgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoCMgcm9vdCBjaGVjayAob25s eSBmb3IgbGl2ZSBtb2RlLCBmb3Igb2ZmbGluZSBtb2RlLCB3ZQo+IGFscmVhZHkgY2hlY2tlZCBp ZiB3ZSBjb3VsZCByZWFkIHRoZSBmaWxlcykKPiArLcKgwqDCoMKgwqDCoGlmIFsgIiQoaWQgLXUp IiAtbmUgMCBdOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqBpZiBbICIkKEBpZEAgLXUpIiAtbmUgMCBd OyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF93YXJuICJOb3RlIHRoYXQg eW91IHNob3VsZCBsYXVuY2ggdGhpcyBzY3JpcHQgd2l0aAo+IHJvb3QgcHJpdmlsZWdlcyB0byBn ZXQgYWNjdXJhdGUgaW5mb3JtYXRpb24uIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBfd2FybiAiV2UnbGwgcHJvY2VlZCBidXQgeW91IG1pZ2h0IHNlZSBwZXJtaXNzaW9uCj4gZGVu aWVkIGVycm9ycy4iCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF93YXJuICJUbyBy dW4gaXQgYXMgcm9vdCwgeW91IGNhbiB0cnkgdGhlIGZvbGxvd2luZwo+IGNvbW1hbmQ6IHN1ZG8g JDAiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF93YXJuCj4gK8KgwqDCoMKgwqDC oMKgZmkKPiArwqDCoMKgwqDCoMKgwqBfaW5mbyAiQ2hlY2tpbmcgZm9yIHZ1bG5lcmFiaWxpdGll cyBvbiBjdXJyZW50IHN5c3RlbSIKPiArLcKgwqDCoMKgwqDCoF9pbmZvICJLZXJuZWwgaXMgXDAz M1szNW0kb3MgJCh1bmFtZSAtcikgJCh1bmFtZSAtdikgJCh1bmFtZQo+IC1tKVwwMzNbMG0iCj4g KyvCoMKgwqDCoMKgwqBfaW5mbyAiS2VybmVsIGlzIFwwMzNbMzVtJG9zICQoQHVuYW1lQCAtcikg JChAdW5hbWVAIC12KQo+ICQoQHVuYW1lQCAtbSlcMDMzWzBtIgo+ICvCoMKgwqDCoMKgwqDCoF9p bmZvICJDUFUgaXMgXDAzM1szNW0kY3B1X2ZyaWVuZGx5X25hbWVcMDMzWzBtIgo+ICsKPiArwqDC oMKgwqDCoMKgwqAjIHRyeSB0byBmaW5kIHRoZSBpbWFnZSBvZiB0aGUgY3VycmVudCBydW5uaW5n IGtlcm5lbAo+ICtAQCAtMjIxMCwxMiArMjIxMCwxMiBAQCBpZiBbICIkb3B0X2xpdmUiID0gMSBd OyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgc3BlY2lmaWVkIGJ5IHVz ZXIgb24gY21kbGluZSwgd2l0aCAtLWxpdmUsIGRvbid0Cj4gb3ZlcnJpZGUKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgOgo+ICvCoMKgwqDCoMKgwqDCoCMgZmlyc3QsIGxvb2sgZm9y IHRoZSBCT09UX0lNQUdFIGhpbnQgaW4gdGhlIGtlcm5lbCBjbWRsaW5lCj4gKy3CoMKgwqDCoMKg wqBlbGlmIGVjaG8gIiRrZXJuZWxfY21kbGluZSIgfCBncmVwIC1xICdCT09UX0lNQUdFPSc7IHRo ZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBvcHRfa2VybmVsPSQoZWNobyAiJGtl cm5lbF9jbWRsaW5lIiB8IGdyZXAgLUVvCj4gJ0JPT1RfSU1BR0U9W14gXSsnIHwgY3V0IC1kPSAt ZjIpCj4gKyvCoMKgwqDCoMKgwqBlbGlmIGVjaG8gIiRrZXJuZWxfY21kbGluZSIgfCBAZ3JlcEAg LXEgJ0JPT1RfSU1BR0U9JzsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG9w dF9rZXJuZWw9JChlY2hvICIka2VybmVsX2NtZGxpbmUiIHwgQGdyZXBAIC1Fbwo+ICdCT09UX0lN QUdFPVteIF0rJyB8IEBjdXRAIC1kPSAtZjIpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoF9kZWJ1ZyAiZm91bmQgb3B0X2tlcm5lbD0kb3B0X2tlcm5lbCBpbgo+ICRwcm9jZnMvY21k bGluZSIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBpZiB0aGUgYm9vdCBwYXJ0 aXRpb24gaXMgd2l0aGluIGEgYnRyZnMgc3Vidm9sdW1lLAo+IHN0cmlwIHRoZSBzdWJ2b2x1bWUg bmFtZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIGlmIC9ib290IGlzIGEgc2Vw YXJhdGUgc3Vidm9sdW1lLCB0aGUgcmVtYWluZGVyIG9mCj4gdGhlIGNvZGUgaW4gdGhpcyBzZWN0 aW9uIHNob3VsZCBoYW5kbGUgaXQKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBl Y2hvICIkb3B0X2tlcm5lbCIgfCBncmVwIC1xICJeL0AiOyB0aGVuCj4gb3B0X2tlcm5lbD0kKGVj aG8gIiRvcHRfa2VybmVsIiB8IHNlZCAiczovQFteL10qOjoiKTsgZmkKPiArK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBpZiBlY2hvICIkb3B0X2tlcm5lbCIgfCBAZ3JlcEAgLXEgIl4vQCI7 IHRoZW4KPiBvcHRfa2VybmVsPSQoZWNobyAiJG9wdF9rZXJuZWwiIHwgQHNlZEAgInM6L0BbXi9d Kjo6Iik7IGZpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgaWYgd2UgaGF2ZSBh IGRlZGljYXRlZCAvYm9vdCBwYXJ0aXRpb24sIG91cgo+IGJvb3Rsb2FkZXIgbWlnaHQgaGF2ZSBq dXN0IGNhbGxlZCBpdCAvCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgc28gdHJ5 IHRvIHByZXBlbmQgL2Jvb3QgYW5kIHNlZSBpZiB3ZSBmaW5kIGFueXRoaW5nCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgLWUgIi9ib290LyRvcHRfa2VybmVsIiBdICYmCj4gb3B0 X2tlcm5lbD0iL2Jvb3QvJG9wdF9rZXJuZWwiCj4gK0BAIC0yMjI3LDcgKzIyMjcsNyBAQCBpZiBb ICIkb3B0X2xpdmUiID0gMSBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgIyBpZiB3ZSBkaWRuJ3Qg ZmluZCBhIGtlcm5lbCwgZGVmYXVsdCB0byBndWVzc2luZwo+ICvCoMKgwqDCoMKgwqDCoGlmIFsg ISAtZSAiJG9wdF9rZXJuZWwiIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIyBGZWRvcmE6Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgWyAtZSAiL2xpYi9t b2R1bGVzLyQodW5hbWUgLXIpL3ZtbGludXoiIF0gJiYKPiBvcHRfa2VybmVsPSIvbGliL21vZHVs ZXMvJCh1bmFtZSAtcikvdm1saW51eiIKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBb IC1lICIvbGliL21vZHVsZXMvJChAdW5hbWVAIC1yKS92bWxpbnV6IiBdICYmCj4gb3B0X2tlcm5l bD0iL2xpYi9tb2R1bGVzLyQoQHVuYW1lQCAtcikvdm1saW51eiIKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIyBTbGFja3dhcmU6Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoFsgLWUgIi9ib290L3ZtbGludXoiwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIF0gJiYKPiBv cHRfa2VybmVsPSIvYm9vdC92bWxpbnV6Igo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAjIEFyY2ggYWFyY2g2NDoKPiArQEAgLTIyNDEsMjQgKzIyNDEsMjQgQEAgaWYgWyAiJG9wdF9s aXZlIiA9IDEgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIHBpbmU2 NAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC1lICIvYm9vdC9waW5lNjQvSW1h Z2UiwqDCoMKgwqDCoMKgwqAgXSAmJgo+IG9wdF9rZXJuZWw9Ii9ib290L3BpbmU2NC9JbWFnZSIK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBnZW5lcmljOgo+ICstwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoFsgLWUgIi9ib290L3ZtbGludXotJCh1bmFtZSAtcikiIF0gJiYK PiBvcHRfa2VybmVsPSIvYm9vdC92bWxpbnV6LSQodW5hbWUgLXIpIgo+ICstwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoFsgLWUgIi9ib290L2tlcm5lbC0kKCB1bmFtZSAtcikiIF0gJiYKPiBv cHRfa2VybmVsPSIvYm9vdC9rZXJuZWwtJCggdW5hbWUgLXIpIgo+ICstwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoFsgLWUgIi9ib290L2J6SW1hZ2UtJCh1bmFtZSAtcikiIF0gJiYKPiBvcHRf a2VybmVsPSIvYm9vdC9iekltYWdlLSQodW5hbWUgLXIpIgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoFsgLWUgIi9ib290L3ZtbGludXotJChAdW5hbWVAIC1yKSIgXSAmJgo+IG9wdF9r ZXJuZWw9Ii9ib290L3ZtbGludXotJChAdW5hbWVAIC1yKSIKPiArK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBbIC1lICIvYm9vdC9rZXJuZWwtJCggQHVuYW1lQCAtcikiIF0gJiYKPiBvcHRf a2VybmVsPSIvYm9vdC9rZXJuZWwtJCggQHVuYW1lQCAtcikiCj4gKyvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgWyAtZSAiL2Jvb3QvYnpJbWFnZS0kKEB1bmFtZUAgLXIpIiBdICYmCj4gb3B0 X2tlcm5lbD0iL2Jvb3QvYnpJbWFnZS0kKEB1bmFtZUAgLXIpIgo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAjIEdlbnRvbzoKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBb IC1lICIvYm9vdC9rZXJuZWwtZ2Vua2VybmVsLSQodW5hbWUgLW0pLSQodW5hbWUgLXIpIgo+IF0g JiYgb3B0X2tlcm5lbD0iL2Jvb3Qva2VybmVsLWdlbmtlcm5lbC0kKHVuYW1lIC1tKS0kKHVuYW1l IC1yKSIKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC1lICIvYm9vdC9rZXJuZWwt Z2Vua2VybmVsLSQoQHVuYW1lQCAtbSktJChAdW5hbWVACj4gLXIpIiBdICYmIG9wdF9rZXJuZWw9 Ii9ib290L2tlcm5lbC1nZW5rZXJuZWwtJChAdW5hbWVAIC1tKS0kKEB1bmFtZUAKPiAtcikiCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgTml4T1M6Cj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoFsgLWUgIi9ydW4vYm9vdGVkLXN5c3RlbS9rZXJuZWwiIF0gJiYKPiBv cHRfa2VybmVsPSIvcnVuL2Jvb3RlZC1zeXN0ZW0va2VybmVsIgo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAjIEd1aXggU3lzdGVtOgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBbIC1lICIvcnVuL2Jvb3RlZC1zeXN0ZW0va2VybmVsL2J6SW1hZ2UiIF0gJiYKPiBvcHRf a2VybmVsPSIvcnVuL2Jvb3RlZC1zeXN0ZW0va2VybmVsL2J6SW1hZ2UiCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCMgc3lzdGVtZCBrZXJuZWwtaW5zdGFsbDoKPiArLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBbIC1lICIvZXRjL21hY2hpbmUtaWQiIF0gJiYgWyAtZSAiL2Jv b3QvJChjYXQKPiAvZXRjL21hY2hpbmUtaWQpLyQodW5hbWUgLXIpL2xpbnV4IiBdICYmIG9wdF9r ZXJuZWw9Ii9ib290LyQoY2F0Cj4gL2V0Yy9tYWNoaW5lLWlkKS8kKHVuYW1lIC1yKS9saW51eCIK PiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC1lICIvZXRjL21hY2hpbmUtaWQiIF0g JiYgWyAtZSAiL2Jvb3QvJChAY2F0QAo+IC9ldGMvbWFjaGluZS1pZCkvJChAdW5hbWVAIC1yKS9s aW51eCIgXSAmJiBvcHRfa2VybmVsPSIvYm9vdC8kKEBjYXRACj4gL2V0Yy9tYWNoaW5lLWlkKS8k KEB1bmFtZUAgLXIpL2xpbnV4Igo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIENs ZWFyIExpbnV4Ogo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0cl91bmFtZT0kKHVu YW1lIC1yKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0cl91bmFtZT0kKEB1bmFt ZUAgLXIpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNsZWFyX2xpbnV4X2tlcm5l bD0iL2xpYi9rZXJuZWwvb3JnLmNsZWFybGludXguJHtzdHJfCj4gdW5hbWUjIyoufS4ke3N0cl91 bmFtZSUuKn0iCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgLWUgIiRjbGVhcl9s aW51eF9rZXJuZWwiIF0gJiYKPiBvcHRfa2VybmVsPSRjbGVhcl9saW51eF9rZXJuZWwKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBDdXN0b20gQXJjaCBzZWVtcyB0byBoYXZlIHRo ZSBrZXJuZWwgcGF0aCBpbiBpdHMKPiBjbWRsaW5lIGluIHRoZSBmb3JtICJcZGlyZWN0b3J5XGtl cm5lbGltYWdlIiwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyB3aXRoIGFjdHVh bCBcJ3MgaW5zdGVhZCBvZiAvJ3M6Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY3Vz dG9tX2FyY2hfa2VybmVsPSQoZWNobyAiJGtlcm5lbF9jbWRsaW5lIiB8IGdyZXAgLQo+IEVvICIo XnxccylcXFxcW1xcXFxhLXpBLVowLTlfLi1dKyIgfCB0ciAiXFxcXCIgIi8iIHwgdHIgLWQKPiAn WzpzcGFjZTpdJykKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjdXN0b21fYXJjaF9r ZXJuZWw9JChlY2hvICIka2VybmVsX2NtZGxpbmUiIHwgQGdyZXBACj4gLUVvICIoXnxccylcXFxc W1xcXFxhLXpBLVowLTlfLi1dKyIgfCBAdHJAICJcXFxcIiAiLyIgfCBAdHJAIC1kCj4gJ1s6c3Bh Y2U6XScpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLW4gIiRjdXN0b21f YXJjaF9rZXJuZWwiIF0gJiYgWyAtZQo+ICIkY3VzdG9tX2FyY2hfa2VybmVsIiBdOyB0aGVuCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBvcHRfa2VybmVs PSIkY3VzdG9tX2FyY2hfa2VybmVsIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBm aQo+ICtAQCAtMjI3MiwxMiArMjI3MiwxMiBAQCBpZiBbICIkb3B0X2xpdmUiID0gMSBdOyB0aGVu Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDoKPiArwqDCoMKgwqDCoMKgwqBlbGlm IFsgLWUgIiRwcm9jZnMva2FsbHN5bXMiIF0gOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoG9wdF9tYXA9IiRwcm9jZnMva2FsbHN5bXMiCj4gKy3CoMKgwqDCoMKgwqBlbGlm IFsgLWUgIi9saWIvbW9kdWxlcy8kKHVuYW1lIC1yKS9TeXN0ZW0ubWFwIiBdIDsgdGhlbgo+ICst wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG9wdF9tYXA9Ii9saWIvbW9kdWxlcy8kKHVuYW1l IC1yKS9TeXN0ZW0ubWFwIgo+ICstwqDCoMKgwqDCoMKgZWxpZiBbIC1lICIvYm9vdC9TeXN0ZW0u bWFwLSQodW5hbWUgLXIpIiBdIDsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oG9wdF9tYXA9Ii9ib290L1N5c3RlbS5tYXAtJCh1bmFtZSAtcikiCj4gKy3CoMKgwqDCoMKgwqBl bGlmIFsgLWUgIi9saWIva2VybmVsL1N5c3RlbS5tYXAtJCh1bmFtZSAtcikiIF07IHRoZW4KPiAr LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBvcHRfbWFwPSIvbGliL2tlcm5lbC9TeXN0ZW0u bWFwLSQodW5hbWUgLXIpIgo+ICsrwqDCoMKgwqDCoMKgZWxpZiBbIC1lICIvbGliL21vZHVsZXMv JChAdW5hbWVAIC1yKS9TeXN0ZW0ubWFwIiBdIDsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoG9wdF9tYXA9Ii9saWIvbW9kdWxlcy8kKEB1bmFtZUAgLXIpL1N5c3RlbS5tYXAi Cj4gKyvCoMKgwqDCoMKgwqBlbGlmIFsgLWUgIi9ib290L1N5c3RlbS5tYXAtJChAdW5hbWVAIC1y KSIgXSA7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBvcHRfbWFwPSIvYm9v dC9TeXN0ZW0ubWFwLSQoQHVuYW1lQCAtcikiCj4gKyvCoMKgwqDCoMKgwqBlbGlmIFsgLWUgIi9s aWIva2VybmVsL1N5c3RlbS5tYXAtJChAdW5hbWVAIC1yKSIgXTsgdGhlbgo+ICsrwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoG9wdF9tYXA9Ii9saWIva2VybmVsL1N5c3RlbS5tYXAtJChAdW5h bWVAIC1yKSIKPiArwqDCoMKgwqDCoMKgwqBmaQo+ICsKPiArwqDCoMKgwqDCoMKgwqAjIGNvbmZp Zwo+ICtAQCAtMjI4NSwxOCArMjI4NSwxOCBAQCBpZiBbICIkb3B0X2xpdmUiID0gMSBdOyB0aGVu Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgc3BlY2lmaWVkIGJ5IHVzZXIgb24g Y21kbGluZSwgd2l0aCAtLWxpdmUsIGRvbid0Cj4gb3ZlcnJpZGUKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgOgo+ICvCoMKgwqDCoMKgwqDCoGVsaWYgWyAtZSAiJHByb2Nmcy9jb25m aWcuZ3oiIF0gOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZHVtcGVkX2Nv bmZpZz0iJChta3RlbXAgLXQgc21jLWNvbmZpZy1YWFhYWFgpIgo+ICstwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGd1bnppcCAtYyAiJHByb2Nmcy9jb25maWcuZ3oiID4gIiRkdW1wZWRfY29u ZmlnIgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGR1bXBlZF9jb25maWc9IiQoQG1r dGVtcEAgLXQgc21jLWNvbmZpZy1YWFhYWFgpIgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoEBndW56aXBAIC1jICIkcHJvY2ZzL2NvbmZpZy5neiIgPiAiJGR1bXBlZF9jb25maWciCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgZHVtcGVkX2NvbmZpZyB3aWxsIGJlIGRl bGV0ZWQgYXQgdGhlIGVuZCBvZiB0aGUKPiBzY3JpcHQKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgb3B0X2NvbmZpZz0iJGR1bXBlZF9jb25maWciCj4gKy3CoMKgwqDCoMKgwqBlbGlm IFsgLWUgIi9saWIvbW9kdWxlcy8kKHVuYW1lIC1yKS9jb25maWciIF07IHRoZW4KPiArLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBvcHRfY29uZmlnPSIvbGliL21vZHVsZXMvJCh1bmFtZSAt cikvY29uZmlnIgo+ICstwqDCoMKgwqDCoMKgZWxpZiBbIC1lICIvYm9vdC9jb25maWctJCh1bmFt ZSAtcikiIF07IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBvcHRfY29uZmln PSIvYm9vdC9jb25maWctJCh1bmFtZSAtcikiCj4gKy3CoMKgwqDCoMKgwqBlbGlmIFsgLWUgIi9l dGMva2VybmVscy9rZXJuZWwtY29uZmlnLSQodW5hbWUgLW0pLSQodW5hbWUgLQo+IHIpIiBdOyB0 aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgb3B0X2NvbmZpZz0iL2V0Yy9rZXJu ZWxzL2tlcm5lbC1jb25maWctJCh1bmFtZSAtbSktCj4gJCh1bmFtZSAtcikiCj4gKy3CoMKgwqDC oMKgwqBlbGlmIFsgLWUgIi9saWIva2VybmVsL2NvbmZpZy0kKHVuYW1lIC1yKSIgXTsgdGhlbgo+ ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG9wdF9jb25maWc9Ii9saWIva2VybmVsL2Nv bmZpZy0kKHVuYW1lIC1yKSIKPiArK8KgwqDCoMKgwqDCoGVsaWYgWyAtZSAiL2xpYi9tb2R1bGVz LyQoQHVuYW1lQCAtcikvY29uZmlnIiBdOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgb3B0X2NvbmZpZz0iL2xpYi9tb2R1bGVzLyQoQHVuYW1lQCAtcikvY29uZmlnIgo+ICsr wqDCoMKgwqDCoMKgZWxpZiBbIC1lICIvYm9vdC9jb25maWctJChAdW5hbWVAIC1yKSIgXTsgdGhl bgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG9wdF9jb25maWc9Ii9ib290L2NvbmZp Zy0kKEB1bmFtZUAgLXIpIgo+ICsrwqDCoMKgwqDCoMKgZWxpZiBbIC1lICIvZXRjL2tlcm5lbHMv a2VybmVsLWNvbmZpZy0kKEB1bmFtZUAgLW0pLSQoQHVuYW1lQAo+IC1yKSIgXTsgdGhlbgo+ICsr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG9wdF9jb25maWc9Ii9ldGMva2VybmVscy9rZXJu ZWwtY29uZmlnLSQoQHVuYW1lQCAtbSktCj4gJChAdW5hbWVAIC1yKSIKPiArK8KgwqDCoMKgwqDC oGVsaWYgWyAtZSAiL2xpYi9rZXJuZWwvY29uZmlnLSQoQHVuYW1lQCAtcikiIF07IHRoZW4KPiAr K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBvcHRfY29uZmlnPSIvbGliL2tlcm5lbC9jb25m aWctJChAdW5hbWVAIC1yKSIKPiArwqDCoMKgwqDCoMKgwqBmaQo+ICsgZWxzZQo+ICvCoMKgwqDC oMKgwqDCoF9pbmZvICJDaGVja2luZyBmb3IgdnVsbmVyYWJpbGl0aWVzIGFnYWluc3Qgc3BlY2lm aWVkIGtlcm5lbCIKPiArQEAgLTIzMTEsNyArMjMxMSw3IEBAIGVsc2UKPiArIGZpCj4gKwo+ICsg aWYgWyAiJG9zIiA9IExpbnV4IF07IHRoZW4KPiArLcKgwqDCoMKgwqDCoGlmIFsgLW4gIiRvcHRf Y29uZmlnIiBdICYmICEgZ3JlcCAtcSAnXkNPTkZJR18nCj4gIiRvcHRfY29uZmlnIjsgdGhlbgo+ ICsrwqDCoMKgwqDCoMKgaWYgWyAtbiAiJG9wdF9jb25maWciIF0gJiYgISBAZ3JlcEAgLXEgJ15D T05GSUdfJwo+ICIkb3B0X2NvbmZpZyI7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIyBnaXZlbiBmaWxlIGlzIGludmFsaWQhCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoF93YXJuICJUaGUga2VybmVsIGNvbmZpZyBmaWxlIHNlZW1zIGludmFsaWQsIHdhcwo+ IGV4cGVjdGluZyBhIHBsYWluLXRleHQgZmlsZSwgaWdub3JpbmcgaXQhIgo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBvcHRfY29uZmlnPScnCj4gK0BAIC0yMzM5LDcgKzIzMzksNyBA QCBpZiBbICIkb3MiID0gTGludXggXTsgdGhlbgo+ICsgZmkKPiArCj4gKyBpZiBbIC1lICIkb3B0 X2tlcm5lbCIgXTsgdGhlbgo+ICstwqDCoMKgwqDCoMKgaWYgISBjb21tYW5kIC12ICIke29wdF9h cmNoX3ByZWZpeH1yZWFkZWxmIiA+L2Rldi9udWxsIDI+JjE7Cj4gdGhlbgo+ICsrwqDCoMKgwqDC oMKgaWYgISBjb21tYW5kIC12ICJAcmVhZGVsZkAiID4vZGV2L251bGwgMj4mMTsgdGhlbgo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgInJlYWRlbGYgbm90IGZvdW5kIgo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrZXJuZWxfZXJyPSJtaXNzaW5nICcke29w dF9hcmNoX3ByZWZpeH1yZWFkZWxmJyB0b29sLAo+IHBsZWFzZSBpbnN0YWxsIGl0LCB1c3VhbGx5 IGl0J3MgaW4gdGhlICdiaW51dGlscycgcGFja2FnZSIKPiArwqDCoMKgwqDCoMKgwqBlbGlmIFsg IiRvcHRfc3lzZnNfb25seSIgPSAxIF0gfHwgWyAiJG9wdF9od19vbmx5IiA9IDEgXTsKPiB0aGVu Cj4gK0BAIC0yMzU3LDIwICsyMzU3LDIwIEBAIGVsc2UKPiArwqDCoMKgwqDCoMKgwqAjIHZhbmls bGEga2VybmVscyBoYXZlIHdpdGggXkxpbnV4IHZlcnNpb24KPiArwqDCoMKgwqDCoMKgwqAjIGFs c28gdHJ5IGhhcmRlciB3aXRoIHNvbWUga2VybmVscyAoc3VjaCBhcyBSZWQgSGF0KSB0aGF0Cj4g ZG9uJ3QgaGF2ZSBeTGludXggdmVyc2lvbiBiZWZvcmUgdGhlaXIgdmVyc2lvbiBzdHJpbmcKPiAr wqDCoMKgwqDCoMKgwqAjIGFuZCBjaGVjayBmb3IgRnJlZUJTRAo+ICstwqDCoMKgwqDCoMKga2Vy bmVsX3ZlcnNpb249JCgiJHtvcHRfYXJjaF9wcmVmaXh9c3RyaW5ncyIgIiRrZXJuZWwiCj4gMj4v ZGV2L251bGwgfCBncmVwIC1FIFwKPiArK8KgwqDCoMKgwqDCoGtlcm5lbF92ZXJzaW9uPSQoIkBz dHJpbmdzQCIgIiRrZXJuZWwiIDI+L2Rldi9udWxsIHwgQGdyZXBAIC0KPiBFIFwKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLWUgJ15MaW51eCB2ZXJzaW9uICcgXAo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAtZSAnXltbOmFsbnVtOl1dW15bOnNwYWNlOl1dKyBcKFte WzpzcGFjZTpdXStcKSAjWzAtCj4gOV0rIC4rICgxOXwyMClbMC05XVswLTldJCcgXAo+ICstwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC1lICdeRnJlZUJTRCBbMC05XScgfCBoZWFkIC0xKQo+ ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC1lICdeRnJlZUJTRCBbMC05XScgfCBAaGVh ZEAgLTEpCj4gK8KgwqDCoMKgwqDCoMKgaWYgWyAteiAiJGtlcm5lbF92ZXJzaW9uIiBdOyB0aGVu Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgdHJ5IGV2ZW4gaGFyZGVyIHdpdGgg c29tZSBrZXJuZWxzIChzdWNoIGFzIEFSTSkKPiB0aGF0IHNwbGl0IHRoZSByZWxlYXNlICh1bmFt ZSAtcikgYW5kIHZlcnNpb24gKHVuYW1lIC12KSBpbiAyCj4gYWRqYWNlbnQgc3RyaW5ncwo+ICst wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF92ZXJzaW9uPSQoIiR7b3B0X2FyY2hf cHJlZml4fXN0cmluZ3MiCj4gIiRrZXJuZWwiIDI+L2Rldi9udWxsIHwgZ3JlcCAtRSAtQjEgJ14j WzAtOV0rIC4rICgxOXwyMClbMC05XVswLTldJCcKPiB8IHRyICJcbiIgIiAiKQo+ICsrwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF92ZXJzaW9uPSQoIkBzdHJpbmdzQCIgIiRrZXJu ZWwiIDI+L2Rldi9udWxsIHwKPiBAZ3JlcEAgLUUgLUIxICdeI1swLTldKyAuKyAoMTl8MjApWzAt OV1bMC05XSQnIHwgQHRyQCAiXG4iICIgIikKPiArwqDCoMKgwqDCoMKgwqBmaQo+ICvCoMKgwqDC oMKgwqDCoGlmIFsgLW4gIiRrZXJuZWxfdmVyc2lvbiIgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAjIGluIGxpdmUgbW9kZSwgY2hlY2sgaWYgdGhlIGltZyB3ZSBmb3Vu ZCBpcyB0aGUKPiBjb3JyZWN0IG9uZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBp ZiBbICIkb3B0X2xpdmUiID0gMSBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBfdmVyYm9zZSAiS2VybmVsIGltYWdlIGlzCj4gXDAzM1szNW0k a2VybmVsX3ZlcnNpb24iCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGlmICEgZWNobyAiJGtlcm5lbF92ZXJzaW9uIiB8IGdyZXAgLXFGCj4gIiQodW5hbWUg LXIpIjsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgX3dhcm4gIlBvc3NpYmxlIGRpc2NyZXBhbmN5IGJldHdlZW4KPiB5 b3VyIHJ1bm5pbmcga2VybmVsICckKHVuYW1lIC1yKScgYW5kIHRoZSBpbWFnZSAnJGtlcm5lbF92 ZXJzaW9uJyB3ZQo+IGZvdW5kICgkb3B0X2tlcm5lbCksIHJlc3VsdHMgbWlnaHQgYmUgaW5jb3Jy ZWN0Igo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAh IGVjaG8gIiRrZXJuZWxfdmVyc2lvbiIgfCBAZ3JlcEAgLXFGCj4gIiQoQHVuYW1lQCAtcikiOyB0 aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBfd2FybiAiUG9zc2libGUgZGlzY3JlcGFuY3kgYmV0d2Vlbgo+IHlvdXIgcnVu bmluZyBrZXJuZWwgJyQoQHVuYW1lQCAtciknIGFuZCB0aGUgaW1hZ2UgJyRrZXJuZWxfdmVyc2lv bicKPiB3ZSBmb3VuZCAoJG9wdF9rZXJuZWwpLCByZXN1bHRzIG1pZ2h0IGJlIGluY29ycmVjdCIK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9pbmZvICJLZXJuZWwgaW1hZ2UgaXMKPiBcMDMzWzM1 bSRrZXJuZWxfdmVyc2lvbiIKPiArQEAgLTIzOTgsMTEgKzIzOTgsMTEgQEAgc3lzX2ludGVyZmFj ZV9jaGVjaygpCj4gK8KgwqDCoMKgwqDCoMKgaWYgWyAiJG9wdF9saXZlIiA9IDEgXSAmJiBbICIk b3B0X25vX3N5c2ZzIiA9IDAgXSAmJiBbIC1yCj4gIiRmaWxlIiBdOyB0aGVuCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoDoKPiArwqDCoMKgwqDCoMKgwqBlbHNlCj4gKy3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgbW9ja21lPSQocHJpbnRmICIlYlxuJWIiICIkbW9ja21lIgo+ ICJTTUNfTU9DS19TWVNGU18kKGJhc2VuYW1lICIkZmlsZSIpX1JFVD0xIikKPiArK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBtb2NrbWU9JChwcmludGYgIiViXG4lYiIgIiRtb2NrbWUiCj4g IlNNQ19NT0NLX1NZU0ZTXyQoQGJhc2VuYW1lQCAiJGZpbGUiKV9SRVQ9MSIpCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAxCj4gK8KgwqDCoMKgwqDCoMKgZmkKPiArCj4g Ky3CoMKgwqDCoMKgwqBfbW9ja3Zhcm5hbWU9IlNNQ19NT0NLX1NZU0ZTXyQoYmFzZW5hbWUgIiRm aWxlIilfUkVUIgo+ICsrwqDCoMKgwqDCoMKgX21vY2t2YXJuYW1lPSJTTUNfTU9DS19TWVNGU18k KEBiYXNlbmFtZUAgIiRmaWxlIilfUkVUIgo+ICvCoMKgwqDCoMKgwqDCoCMgc2hlbGxjaGVjayBk aXNhYmxlPVNDMjA4NixTQzEwODMKPiArwqDCoMKgwqDCoMKgwqBpZiBbIC1uICIkKGV2YWwgZWNo byBcJHskX21vY2t2YXJuYW1lOi19KSIgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBfZGVidWcgInN5c2ZzOiBNT0NLSU5HIGVuYWJsZWQgZm9yICRmaWxlIGZ1bmMgcmV0 dXJucwo+ICQoZXZhbCBlY2hvIFwkJF9tb2NrdmFybmFtZSkiCj4gK0BAIC0yNDExLDE3ICsyNDEx LDE3IEBAIHN5c19pbnRlcmZhY2VfY2hlY2soKQo+ICvCoMKgwqDCoMKgwqDCoGZpCj4gKwo+ICvC oMKgwqDCoMKgwqDCoFsgLW4gIiRyZWdleCIgXSB8fCByZWdleD0nLionCj4gKy3CoMKgwqDCoMKg wqBfbW9ja3Zhcm5hbWU9IlNNQ19NT0NLX1NZU0ZTXyQoYmFzZW5hbWUgIiRmaWxlIikiCj4gKyvC oMKgwqDCoMKgwqBfbW9ja3Zhcm5hbWU9IlNNQ19NT0NLX1NZU0ZTXyQoQGJhc2VuYW1lQCAiJGZp bGUiKSIKPiArwqDCoMKgwqDCoMKgwqAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwODYsU0MxMDgz Cj4gK8KgwqDCoMKgwqDCoMKgaWYgWyAtbiAiJChldmFsIGVjaG8gXCR7JF9tb2NrdmFybmFtZTot fSkiIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZnVsbG1zZz0iJChl dmFsIGVjaG8gXCQkX21vY2t2YXJuYW1lKSIKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBtc2c9JChlY2hvICIkZnVsbG1zZyIgfCBncmVwIC1FbyAiJHJlZ2V4IikKPiArK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBtc2c9JChlY2hvICIkZnVsbG1zZyIgfCBAZ3JlcEAgLUVvICIk cmVnZXgiKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgInN5c2ZzOiBN T0NLSU5HIGVuYWJsZWQgZm9yICRmaWxlLCB3aWxsIHJldHVybgo+ICRmdWxsbXNnIgo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBtb2NrZWQ9MQo+ICvCoMKgwqDCoMKgwqDCoGVsc2UK PiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmdWxsbXNnPSQoY2F0ICIkZmlsZSIpCj4g Ky3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbXNnPSQoZ3JlcCAtRW8gIiRyZWdleCIgIiRm aWxlIikKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBtb2NrbWU9JChwcmludGYgIiVi XG4lYiIgIiRtb2NrbWUiCj4gIlNNQ19NT0NLX1NZU0ZTXyQoYmFzZW5hbWUgIiRmaWxlIik9JyRm dWxsbXNnJyIpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZnVsbG1zZz0kKEBjYXRA ICIkZmlsZSIpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbXNnPSQoQGdyZXBAIC1F byAiJHJlZ2V4IiAiJGZpbGUiKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1vY2tt ZT0kKHByaW50ZiAiJWJcbiViIiAiJG1vY2ttZSIKPiAiU01DX01PQ0tfU1lTRlNfJChAYmFzZW5h bWVAICIkZmlsZSIpPSckZnVsbG1zZyciKQo+ICvCoMKgwqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKg wqDCoMKgaWYgWyAiJG1vZGUiID0gc2lsZW50IF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgcmV0dXJuIDAKPiArQEAgLTI0MzAsMTUgKzI0MzAsMTUgQEAgc3lzX2ludGVy ZmFjZV9jaGVjaygpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAwCj4g K8KgwqDCoMKgwqDCoMKgZmkKPiArwqDCoMKgwqDCoMKgwqBfaW5mb19ub2wgIiogTWl0aWdhdGVk IGFjY29yZGluZyB0byB0aGUgL3N5cyBpbnRlcmZhY2U6ICIKPiArLcKgwqDCoMKgwqDCoGlmIGVj aG8gIiRtc2ciIHwgZ3JlcCAtcWkgJ15ub3QgYWZmZWN0ZWQnOyB0aGVuCj4gKyvCoMKgwqDCoMKg wqBpZiBlY2hvICIkbXNnIiB8IEBncmVwQCAtcWkgJ15ub3QgYWZmZWN0ZWQnOyB0aGVuCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgTm90IGFmZmVjdGVkCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHN0YXR1cz1PSwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBwc3RhdHVzIGdyZWVuIFlFUyAiJGZ1bGxtc2ciCj4gKy3CoMKgwqDCoMKgwqBlbGlmIGVj aG8gIiRtc2ciIHwgZ3JlcCAtcUVpICdeKGt2bTogKT9taXRpZ2F0aW9uJzsgdGhlbgo+ICsrwqDC oMKgwqDCoMKgZWxpZiBlY2hvICIkbXNnIiB8IEBncmVwQCAtcUVpICdeKGt2bTogKT9taXRpZ2F0 aW9uJzsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIE1pdGlnYXRpb246 IFBUSQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzdGF0dXM9T0sKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyBncmVlbiBZRVMgIiRmdWxsbXNnIgo+ICst wqDCoMKgwqDCoMKgZWxpZiBlY2hvICIkbXNnIiB8IGdyZXAgLXFpICdednVsbmVyYWJsZSc7IHRo ZW4KPiArK8KgwqDCoMKgwqDCoGVsaWYgZWNobyAiJG1zZyIgfCBAZ3JlcEAgLXFpICdednVsbmVy YWJsZSc7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBWdWxuZXJhYmxl Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0YXR1cz1WVUxOCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgeWVsbG93IE5PICIkZnVsbG1zZyIKPiArQEAg LTI1MjYsMjAgKzI1MjYsMjAgQEAgd3JpdGVfbXNyX29uZV9jb3JlKCkKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgcmV0PTQ6IG1zciBkb2Vzbid0IGV4 aXN0LCByZXQ9MTI3Ogo+IG1zci5hbGxvd193cml0ZXM9b2ZmCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbICIkcmV0IiA9IDEyNyBdICYmIF93cml0ZV9k ZW5pZWQ9MQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIG9yIGZhbGxiYWNrIHRv IGRkIGlmIGl0IHN1cHBvcnRzIHNlZWtfYnl0ZXMsIHdlCj4gcHJlZmVyIGl0IG92ZXIgcGVybCBi ZWNhdXNlIHdlIGNhbiB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gRVBFUk0KPiBhbmQgRUlP Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiBkZCBpZj0vZGV2L251bGwgb2Y9 L2Rldi9udWxsIGJzPTggY291bnQ9MQo+IHNlZWs9IiRfbXNyX2RlYyIgb2ZsYWc9c2Vla19ieXRl cyAyPi9kZXYvbnVsbCAmJiBbICIke1NNQ19OT19ERDotfSIKPiAhPSAxIF07IHRoZW4KPiArK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIEBkZEAgaWY9L2Rldi9udWxsIG9mPS9kZXYv bnVsbCBicz04IGNvdW50PTEKPiBzZWVrPSIkX21zcl9kZWMiIG9mbGFnPXNlZWtfYnl0ZXMgMj4v ZGV2L251bGwgJiYgWyAiJHtTTUNfTk9fREQ6LX0iCj4gIT0gMSBdOyB0aGVuCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgIndyaXRlX21zcjog dXNpbmcgZGQiCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGRkIGlmPS9kZXYvemVybyBvZj0vZGV2L2NwdS8iJF9jb3JlIi9tc3IgYnM9OAo+IGNvdW50PTEg c2Vlaz0iJF9tc3JfZGVjIiBvZmxhZz1zZWVrX2J5dGVzIDI+L2Rldi9udWxsOyByZXQ9JD8KPiAr K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgQGRkQCBpZj0vZGV2 L3plcm8gb2Y9L2Rldi9jcHUvIiRfY29yZSIvbXNyCj4gYnM9OCBjb3VudD0xIHNlZWs9IiRfbXNy X2RlYyIgb2ZsYWc9c2Vla19ieXRlcyAyPi9kZXYvbnVsbDsgcmV0PSQ/Cj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIGlmIGl0IGZhaWxlZCwgaW5zcGVj dCBzdGRlcnJ0byBsb29rIGZvcgo+IEVQRVJNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICIkcmV0IiAhPSAwIF07IHRoZW4KPiArLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGRk IGlmPS9kZXYvemVybwo+IG9mPS9kZXYvY3B1LyIkX2NvcmUiL21zciBicz04IGNvdW50PTEgc2Vl az0iJF9tc3JfZGVjIgo+IG9mbGFnPXNlZWtfYnl0ZXMgMj4mMSB8IGdyZXAgLXFGICdPcGVyYXRp b24gbm90IHBlcm1pdHRlZCc7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIEBkZEAgaWY9L2Rldi96ZXJvCj4gb2Y9 L2Rldi9jcHUvIiRfY29yZSIvbXNyIGJzPTggY291bnQ9MSBzZWVrPSIkX21zcl9kZWMiCj4gb2Zs YWc9c2Vla19ieXRlcyAyPiYxIHwgQGdyZXBAIC1xRiAnT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQn OyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF93cml0ZV9kZW5pZWQ9MQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZp Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIG9yIGlmIHdlIGhhdmUgcGVybCwgdXNlIGl0 LCBhbnkgNS54IHZlcnNpb24gd2lsbAo+IHdvcmsKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBlbGlmIGNvbW1hbmQgLXYgcGVybCA+L2Rldi9udWxsIDI+JjEgJiYgWwo+ICIke1NNQ19O T19QRVJMOi19IiAhPSAxIF07IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBl bGlmIGNvbW1hbmQgLXYgQHBlcmxAID4vZGV2L251bGwgMj4mMSAmJiBbCj4gIiR7U01DX05PX1BF Ukw6LX0iICE9IDEgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgX2RlYnVnICJ3cml0ZV9tc3I6IHVzaW5nIHBlcmwiCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQ9MQo+ICstwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwZXJsIC1lICJvcGVuKE0sJz4nLCcvZGV2 L2NwdS8kX2NvcmUvbXNyJykKPiBhbmQgc2VlayhNLCRfbXNyX2RlYywwKSBhbmQgZXhpdChzeXN3 cml0ZShNLHBhY2soJ0gxNicsMCkpKSI7IFsgJD8gLQo+IGVxIDggXSAmJiByZXQ9MAo+ICsrwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBAcGVybEAgLWUgIm9wZW4o TSwnPicsJy9kZXYvY3B1LyRfY29yZS9tc3InKQo+IGFuZCBzZWVrKE0sJF9tc3JfZGVjLDApIGFu ZCBleGl0KHN5c3dyaXRlKE0scGFjaygnSDE2JywwKSkpIjsgWyAkPyAtCj4gZXEgOCBdICYmIHJl dD0wCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAid3JpdGVfbXNyOiBnb3Qg bm8gd3Jtc3IsIHBlcmwgb3IKPiByZWNlbnQgZW5vdWdoIGRkISIKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1vY2ttZT0kKHByaW50ZiAiJWJcbiViIiAi JG1vY2ttZSIKPiAiU01DX01PQ0tfV1JNU1JfJHtfbXNyfV9SRVQ9JFdSSVRFX01TUl9SRVRfRVJS IikKPiArQEAgLTI1NjEsMTMgKzI1NjEsMTMgQEAgd3JpdGVfbXNyX29uZV9jb3JlKCkKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBtc3JfbG9ja2VkX2Rvd249MQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHdyaXRlX21zcl9tc2c9InlvdXIga2VybmVsIGlz Cj4gY29uZmlndXJlZCB0byBkZW55IHdyaXRlcyB0byBNU1JzIGZyb20gdXNlciBzcGFjZSIKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqByZXR1cm4gJFdSSVRFX01TUl9SRVRfTE9DS0RPV04KPiArLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiBkbWVzZyB8IGdyZXAgLXFGICJtc3I6IERp cmVjdCBhY2Nlc3MgdG8KPiBNU1IiOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgQGRtZXNnQCB8IEBncmVwQCAtcUYgIm1zcjogRGlyZWN0 IGFjY2Vzcwo+IHRvIE1TUiI7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgIndyaXRlX21zcjogbG9ja2Vk IGRvd24ga2VybmVsCj4gZGV0ZWN0ZWQgKFJlZCBIYXQgLyBGZWRvcmEpIgo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1vY2tt ZT0kKHByaW50ZiAiJWJcbiViIiAiJG1vY2ttZSIKPiAiU01DX01PQ0tfV1JNU1JfJHtfbXNyfV9S RVQ9JFdSSVRFX01TUl9SRVRfTE9DS0RPV04iKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1zcl9sb2NrZWRfZG93bj0xCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgd3JpdGVfbXNyX21zZz0ieW91ciBrZXJuZWwgaXMgbG9ja2VkCj4gZG93biAoRmVkb3Jh L1JlZCBIYXQpLCBwbGVhc2UgcmVib290IHdpdGhvdXQgc2VjdXJlIGJvb3QgYW5kIHJldHJ5Igo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoHJldHVybiAkV1JJVEVfTVNSX1JFVF9MT0NLRE9XTgo+ICstwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIGRtZXNnIHwgZ3JlcCAtcUYgInJhdyBN U1IgYWNjZXNzIGlzCj4gcmVzdHJpY3RlZCI7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiBAZG1lc2dAIHwgQGdyZXBAIC1xRiAicmF3IE1T UiBhY2Nlc3MgaXMKPiByZXN0cmljdGVkIjsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAid3JpdGVfbXNy OiBsb2NrZWQgZG93biBrZXJuZWwKPiBkZXRlY3RlZCAodmFuaWxsYSkiCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbW9ja21l PSQocHJpbnRmICIlYlxuJWIiICIkbW9ja21lIgo+ICJTTUNfTU9DS19XUk1TUl8ke19tc3J9X1JF VD0kV1JJVEVfTVNSX1JFVF9MT0NLRE9XTiIpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbXNyX2xvY2tlZF9kb3duPTEKPiAr QEAgLTI2NjYsOCArMjY2Niw4IEBAIHJlYWRfbXNyX29uZV9jb3JlKCkKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAkUkVBRF9NU1JfUkVUX0tP Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCMgTVNSIDB4MTA6IDB4MDAwMDAzZTEgMHhiMTA2ZGRlZAo+ICstwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9tc3JfaD0kKGVjaG8gIiRfbXNyIiB8IGF3ayAne3ByaW50 ICQzfScpOwo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9tc3JfbD0kKGVjaG8gIiRf bXNyIiB8IGF3ayAne3ByaW50ICQ0fScpOwo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oF9tc3JfaD0kKGVjaG8gIiRfbXNyIiB8IEBhd2tAICd7cHJpbnQgJDN9Jyk7Cj4gKyvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgX21zcl9sPSQoZWNobyAiJF9tc3IiIHwgQGF3a0AgJ3twcmlu dCAkNH0nKTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmVhZF9tc3JfdmFsdWU9 JCgoIF9tc3JfaCA8PCAzMiB8IF9tc3JfbCApKQo+ICvCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBmb3IgTGludXgKPiArQEAgLTI2NzgsMTUgKzI2 NzgsMTUgQEAgcmVhZF9tc3Jfb25lX2NvcmUoKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAjIGlmIHJkbXNyIGlzIGF2YWlsYWJsZSwgdXNlIGl0Cj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGVsaWYgY29tbWFuZCAtdiByZG1zciA+L2Rldi9udWxsIDI+JjEgJiYgWwo+ ICIke1NNQ19OT19SRE1TUjotfSIgIT0gMSBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgInJlYWRfbXNyOiB1c2luZyByZG1zciBv biAkX21zciIKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg cmVhZF9tc3JfdmFsdWU9JChyZG1zciAtciAkX21zcl9kZWMKPiAyPi9kZXYvbnVsbCB8IG9kIC10 IHU4IC1BIG4pCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHJlYWRfbXNyX3ZhbHVlPSQocmRtc3IgLXIgJF9tc3JfZGVjCj4gMj4vZGV2L251bGwgfCBAb2RA IC10IHU4IC1BIG4pCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgb3IgaWYgd2Ug aGF2ZSBwZXJsLCB1c2UgaXQsIGFueSA1LnggdmVyc2lvbiB3aWxsCj4gd29yawo+ICstwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgY29tbWFuZCAtdiBwZXJsID4vZGV2L251bGwgMj4m MSAmJiBbCj4gIiR7U01DX05PX1BFUkw6LX0iICE9IDEgXTsgdGhlbgo+ICsrwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGVsaWYgY29tbWFuZCAtdiBAcGVybEAgPi9kZXYvbnVsbCAyPiYxICYm IFsKPiAiJHtTTUNfTk9fUEVSTDotfSIgIT0gMSBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgInJlYWRfbXNyOiB1c2luZyBwZXJs IG9uICRfbXNyIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqByZWFkX21zcl92YWx1ZT0kKHBlcmwgLWUKPiAib3BlbihNLCc8JywnL2Rldi9jcHUvJF9jb3Jl L21zcicpIGFuZCBzZWVrKE0sJF9tc3JfZGVjLDApIGFuZAo+IHJlYWQoTSxcJF8sOCkgYW5kIHBy aW50IiB8IG9kIC10IHU4IC1BIG4pCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHJlYWRfbXNyX3ZhbHVlPSQoQHBlcmxAIC1lCj4gIm9wZW4oTSwnPCcsJy9k ZXYvY3B1LyRfY29yZS9tc3InKSBhbmQgc2VlayhNLCRfbXNyX2RlYywwKSBhbmQKPiByZWFkKE0s XCRfLDgpIGFuZCBwcmludCIgfCBAb2RAIC10IHU4IC1BIG4pCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCMgZmFsbGJhY2sgdG8gZGQgaWYgaXQgc3VwcG9ydHMgc2tpcF9ieXRlcwo+ ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgZGQgaWY9L2Rldi9udWxsIG9mPS9k ZXYvbnVsbCBicz04IGNvdW50PTEKPiBza2lwPSIkX21zcl9kZWMiIGlmbGFnPXNraXBfYnl0ZXMg Mj4vZGV2L251bGw7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIEBk ZEAgaWY9L2Rldi9udWxsIG9mPS9kZXYvbnVsbCBicz04IGNvdW50PTEKPiBza2lwPSIkX21zcl9k ZWMiIGlmbGFnPXNraXBfYnl0ZXMgMj4vZGV2L251bGw7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAicmVhZF9tc3I6IHVzaW5nIGRk IG9uICRfbXNyIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqByZWFkX21zcl92YWx1ZT0kKGRkIGlmPS9kZXYvY3B1LyIkX2NvcmUiL21zcgo+IGJzPTggY291 bnQ9MSBza2lwPSIkX21zcl9kZWMiIGlmbGFnPXNraXBfYnl0ZXMgMj4vZGV2L251bGwgfCBvZCAt dCB1OAo+IC1BIG4pCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHJlYWRfbXNyX3ZhbHVlPSQoQGRkQAo+IGlmPS9kZXYvY3B1LyIkX2NvcmUiL21zciBicz04 IGNvdW50PTEgc2tpcD0iJF9tc3JfZGVjIgo+IGlmbGFnPXNraXBfYnl0ZXMgMj4vZGV2L251bGwg fCBAb2RAIC10IHU4IC1BIG4pCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAi cmVhZF9tc3I6IGdvdCBubyByZG1zciwgcGVybCBvcgo+IHJlY2VudCBlbm91Z2ggZGQhIgo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbW9ja21lPSQocHJp bnRmICIlYlxuJWIiICIkbW9ja21lIgo+ICJTTUNfTU9DS19SRE1TUl8ke19tc3J9X1JFVD0kUkVB RF9NU1JfUkVUX0VSUiIpCj4gK0BAIC0yNzEwLDcgKzI3MTAsNyBAQCBjaGVja19jcHUoKQo+ICsg ewo+ICvCoMKgwqDCoMKgwqDCoF9pbmZvICJcMDMzWzE7MzRtSGFyZHdhcmUgY2hlY2tcMDMzWzBt Igo+ICsKPiArLcKgwqDCoMKgwqDCoGlmICEgdW5hbWUgLW0gfCBncmVwIC1xd0UgJ3g4Nl82NHxp WzMtNl04NnxhbWQ2NCc7IHRoZW4KPiArK8KgwqDCoMKgwqDCoGlmICEgQHVuYW1lQCAtbSB8IEBn cmVwQCAtcXdFICd4ODZfNjR8aVszLTZdODZ8YW1kNjQnOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHJldHVybgo+ICvCoMKgwqDCoMKgwqDCoGZpCj4gKwo+ICtAQCAtMzMy NiwxOSArMzMyNiwxOSBAQCBjaGVja19yZWRoYXRfY2Fub25pY2FsX3NwZWN0cmUoKQo+ICvCoMKg wqDCoMKgwqDCoCMgaWYgd2Ugd2VyZSBhbHJlYWR5IGNhbGxlZCwgZG9uJ3QgZG8gaXQgYWdhaW4K PiArwqDCoMKgwqDCoMKgwqBbIC1uICIke3JlZGhhdF9jYW5vbmljYWxfc3BlY3RyZTotfSIgXSAm JiByZXR1cm4KPiArCj4gKy3CoMKgwqDCoMKgwqBpZiAhIGNvbW1hbmQgLXYgIiR7b3B0X2FyY2hf cHJlZml4fXN0cmluZ3MiID4vZGV2L251bGwgMj4mMTsKPiB0aGVuCj4gKyvCoMKgwqDCoMKgwqBp ZiAhIGNvbW1hbmQgLXYgIkBzdHJpbmdzQCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJlZGhhdF9jYW5vbmljYWxfc3BlY3RyZT0tMQo+ICvC oMKgwqDCoMKgwqDCoGVsaWYgWyAtbiAiJGtlcm5lbF9lcnIiIF07IHRoZW4KPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgcmVkaGF0X2Nhbm9uaWNhbF9zcGVjdHJlPS0yCj4gK8KgwqDC oMKgwqDCoMKgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIFJlZCBIYXQg LyBVYnVudHUgc3BlY2lmaWMgdmFyaWFudDEgcGF0Y2ggaXMKPiBkaWZmaWN1bHQgdG8gZGV0ZWN0 LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIGxldCdzIHVzZSB0aGUgdHdvIHNh bWUgdHJpY2tzIHRoYW4gdGhlIG9mZmljaWFsIFJlZAo+IEhhdCBkZXRlY3Rpb24gc2NyaXB0IHVz ZXM6Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgIiR7b3B0X2FyY2hfcHJlZml4 fXN0cmluZ3MiICIka2VybmVsIiB8IGdyZXAgLXF3Cj4gbm9pYnJzICYmICIke29wdF9hcmNoX3By ZWZpeH1zdHJpbmdzIiAiJGtlcm5lbCIgfCBncmVwIC1xdyBub2licGI7Cj4gdGhlbgo+ICsrwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICJAc3RyaW5nc0AiICIka2VybmVsIiB8IEBncmVw QCAtcXcgbm9pYnJzICYmCj4gIkBzdHJpbmdzQCIgIiRrZXJuZWwiIHwgQGdyZXBAIC1xdyBub2li cGI7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCMgMSkgZGV0ZWN0IHRoZWlyIHNwZWNpZmljIHZhcmlhbnQyIHBhdGNoLiBJZgo+IGl0J3MgcHJl c2VudCwgaXQgbWVhbnMKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCMgdGhhdCB0aGUgdmFyaWFudDEgcGF0Y2ggaXMgYWxzbyBwcmVzZW50Cj4gKGJvdGgg d2VyZSBtZXJnZWQgYXQgdGhlIHNhbWUgdGltZSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAiZm91bmQgcmVkaGF0L2Nhbm9uaWNhbCB2ZXJz aW9uIG9mIHRoZQo+IHZhcmlhbnQyIHBhdGNoIChpbXBsaWVzIHZhcmlhbnQxKSIKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJlZGhhdF9jYW5vbmljYWxf c3BlY3RyZT0xCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiAiJHtvcHRfYXJj aF9wcmVmaXh9c3RyaW5ncyIgIiRrZXJuZWwiIHwgZ3JlcCAtcQo+ICd4ODYvcHRpOic7IHRoZW4K PiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmICJAc3RyaW5nc0AiICIka2VybmVs IiB8IEBncmVwQCAtcSAneDg2L3B0aTonOwo+IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgMikgZGV0ZWN0IHRoZWlyIHNwZWNpZmljIHZhcmlh bnQzIHBhdGNoLiBJZgo+IGl0J3MgcHJlc2VudCwgYnV0IHRoZSB2YXJpYW50Mgo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBpcyBub3QsIGl0IG1lYW5z IHRoYXQgb25seSB2YXJpYW50MSBpcwo+IHByZXNlbnQgaW4gYWRkaXRpb24gdG8gdmFyaWFudDMK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAi Zm91bmQgcmVkaGF0L2Nhbm9uaWNhbCB2ZXJzaW9uIG9mIHRoZQo+IHZhcmlhbnQzIHBhdGNoIChp bXBsaWVzIHZhcmlhbnQxIGJ1dCBub3QgdmFyaWFudDIpIgo+ICtAQCAtMzM2MywxMyArMzM2Mywx MyBAQCBjaGVja19oYXNfdm1tKCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBJ ZiB3ZSBmaW5kIG5vIGV2aWRlbmNlIHRoYXQgdGhpcyBpcyB0aGUgY2FzZSwKPiBhc3N1bWUgd2Un cmUgbm90ICh0byBhdm9pZCBzY2FyaW5nIHVzZXJzKSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIyB0aGlzIGNhbiBhbHdheXMgYmUgb3ZlcnJpZGRlbiB3aXRoIC0tdm1tIGluIGFu eQo+IGNhc2UuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhhc192bW09MAo+ICst wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGNvbW1hbmQgLXYgcGdyZXAgPi9kZXYvbnVs bCAyPiYxOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgY29tbWFuZCAt diBAcGdyZXBAID4vZGV2L251bGwgMj4mMTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyByZW1vdmUgeGVuYnVzIGFuZCB4ZW53YXRjaCwgYWxz byBwcmVzZW50Cj4gaW5zaWRlIGRvbVUKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCMgcmVtb3ZlIGxpYnZpcnRkIGFzIGl0IGNhbiBhbHNvIGJlIHVzZWQg dG8KPiBtYW5hZ2UgY29udGFpbmVycyBhbmQgbm90IFZNcwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBmb3IgZWFjaCBiaW5hcnkgd2Ugd2FudCB0byBn cmVwLCBnZXQgdGhlCj4gcGlkcwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgZm9yIF9iaW5hcnkgaW4gcWVtdSBrdm0geGVuc3RvcmVkIHhlbmNvbnNvbGVk Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBkbwo+ICst wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgZm9yIF9waWQgaW4gJChwZ3JlcCAteCAkX2JpbmFyeSkKPiArK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZvciBfcGlkIGluICQo QHBncmVwQCAteCAkX2JpbmFyeSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBkbwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAj IHJlc29sdmUgdGhlIGV4ZSBzeW1saW5rLCBpZgo+IGl0IGRvZXNuJ3QgcmVzb2x2ZSB3aXRoIC1t LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIHdoaWNoIGRvZXNuJ3QgZXZlbiBuZWVkIHRoZQo+ IGRlc3QgdG8gZXhpc3QsIGl0IG1lYW5zIHRoZSBzeW1saW5rCj4gK0BAIC0zMzg1LDcgKzMzODUs NyBAQCBjaGVja19oYXNfdm1tKCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxz ZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBpZ25v cmUgU0MyMDA5IGFzIGBwcyBheGAgaXMgYWN0dWFsbHkgdXNlZAo+IGFzIGEgZmFsbGJhY2sgaWYg YHBncmVwYCBpc24ndCBpbnN0YWxsZWQKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAwOQo+ICstwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBjb21tYW5kIC12IHBzID4vZGV2 bnVsbCAmJiBwcyBheCB8IGdyZXAgLQo+IHZ3IGdyZXAgfCBncmVwIC1xIC1lICdcPHFlbXUnIC1l ICcvcWVtdScgLWUgJzxca3ZtJyAtZSAnL2t2bScgLWUKPiAnL3hlbnN0b3JlZCcgLWUgJy94ZW5j b25zb2xlZCc7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgaWYgY29tbWFuZCAtdiBwcyA+L2Rldm51bGwgJiYgcHMgYXggfCBAZ3JlcEAKPiAtdncg Z3JlcCB8IEBncmVwQCAtcSAtZSAnXDxxZW11JyAtZSAnL3FlbXUnIC1lICc8XGt2bScgLWUgJy9r dm0nIC1lCj4gJy94ZW5zdG9yZWQnIC1lICcveGVuY29uc29sZWQnOyB0aGVuCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFz X3ZtbT0xCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBm aQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ICtAQCAtMzQxNyw3ICszNDE3 LDcgQEAgY2hlY2tfQ1ZFXzIwMTdfNTc1MygpCj4gK8KgwqDCoMKgwqDCoMKgX2luZm8gIlwwMzNb MTszNG0kY3ZlIGFrYSAnJChjdmUybmFtZSAiJGN2ZSIpJ1wwMzNbMG0iCj4gK8KgwqDCoMKgwqDC oMKgaWYgWyAiJG9zIiA9IExpbnV4IF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgY2hlY2tfQ1ZFXzIwMTdfNTc1M19saW51eAo+ICstwqDCoMKgwqDCoMKgZWxpZiBlY2hv ICIkb3MiIHwgZ3JlcCAtcSBCU0Q7IHRoZW4KPiArK8KgwqDCoMKgwqDCoGVsaWYgZWNobyAiJG9z IiB8IEBncmVwQCAtcSBCU0Q7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg Y2hlY2tfQ1ZFXzIwMTdfNTc1M19ic2QKPiArwqDCoMKgwqDCoMKgwqBlbHNlCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoF93YXJuICJVbnN1cHBvcnRlZCBPUyAoJG9zKSIKPiArQEAg LTM0NjksMjAgKzM0NjksMjAgQEAgY2hlY2tfQ1ZFXzIwMTdfNTc1M19saW51eCgpCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHYxX21hc2tfbm9zcGVjPScnCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLW4gIiRrZXJuZWxfZXJyIiBdOyB0aGVuCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIHllbGxvdyBV TktOT1dOICJjb3VsZG4ndCBjaGVjawo+ICgka2VybmVsX2VycikiCj4gKy3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZWxpZiAhIGNvbW1hbmQgLXYgcGVybCA+L2Rldi9udWxsIDI+JjE7IHRo ZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmICEgY29tbWFuZCAtdiBAcGVy bEAgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIHllbGxvdyBVTktOT1dOICJtaXNzaW5nICdwZXJsJwo+ IGJpbmFyeSwgcGxlYXNlIGluc3RhbGwgaXQiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGVsc2UKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg cGVybCAtbmUKPiAnL1x4MGZceDgzLi4uLlx4NDhceDE5XHhkMlx4NDhceDIxXHhkMC8gYW5kICRm b3VuZCsrOyBFTkQgewo+IGV4aXQoJGZvdW5kKSB9JyAiJGtlcm5lbCI7IHJldD0kPwo+ICsrwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBAcGVybEAgLW5lCj4gJy9c eDBmXHg4My4uLi5ceDQ4XHgxOVx4ZDJceDQ4XHgyMVx4ZDAvIGFuZCAkZm91bmQrKzsgRU5EIHsK PiBleGl0KCRmb3VuZCkgfScgIiRrZXJuZWwiOyByZXQ9JD8KPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgJHJldCAtZ3QgMCBdOyB0aGVuCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgcHN0YXR1cyBncmVlbiBZRVMgIiRyZXQgb2NjdXJyZW5jZShzKQo+IGZvdW5kIG9mIHg4NiA2 NCBiaXRzIGFycmF5X2luZGV4X21hc2tfbm9zcGVjKCkiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdjFfbWFza19ub3NwZWM9 Ing4NiA2NCBiaXRzCj4gYXJyYXlfaW5kZXhfbWFza19ub3NwZWMiCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbHNlCj4gKy3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwZXJsIC1uZQo+ICcv XHgzYlx4ODIuLlx4MDBceDAwXHg3My5ceDE5XHhkMlx4MjFceGQwLyBhbmQgJGZvdW5kKys7IEVO RCB7Cj4gZXhpdCgkZm91bmQpIH0nICIka2VybmVsIjsgcmV0PSQ/Cj4gKyvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBAcGVybEAgLW5l Cj4gJy9ceDNiXHg4Mi4uXHgwMFx4MDBceDczLlx4MTlceGQyXHgyMVx4ZDAvIGFuZCAkZm91bmQr KzsgRU5EIHsKPiBleGl0KCRmb3VuZCkgfScgIiRrZXJuZWwiOyByZXQ9JD8KPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBb ICRyZXQgLWd0IDAgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIGdyZWVu IFlFUyAiJHJldAo+IG9jY3VycmVuY2UocykgZm91bmQgb2YgeDg2IDMyIGJpdHMgYXJyYXlfaW5k ZXhfbWFza19ub3NwZWMoKSIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdjFfbWFza19ub3NwZWM9 Ing4NiAzMiBiaXRzCj4gYXJyYXlfaW5kZXhfbWFza19ub3NwZWMiCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxzZQo+ICst Cj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldD0kKCIke29wdF9hcmNoX3ByZWZpeH1vYmpkdW0KPiBw IiAkb2JqZHVtcF9vcHRpb25zICIka2VybmVsIiB8IGdyZXAgLXcgLWUgZjNhZjgwMTQgLWUgZTMy MGYwMTQgLUIyIHwKPiBncmVwIC1CMSAtdyBzYmMgfCBncmVwIC13IC1jIGNtcCkKPiArK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqByZXQ9JCgiQG9iamR1bXBAIgo+ICRvYmpkdW1wX29wdGlvbnMgIiRrZXJu ZWwiIHwgQGdyZXBAIC13IC1lIGYzYWY4MDE0IC1lIGUzMjBmMDE0IC1CMiB8Cj4gQGdyZXBAIC1C MSAtdyBzYmMgfCBAZ3JlcEAgLXcgLWMgY21wKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBb ICIkcmV0IiAtZ3QgMCBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBwc3RhdHVzIGdyZWVuIFlFUwo+ICIkcmV0IG9jY3VycmVuY2UocykgZm91bmQgb2YgYXJt IDMyIGJpdHMgYXJyYXlfaW5kZXhfbWFza19ub3NwZWMoKSIKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHYxX21hc2tfbm9zcGVjPSJhcm0KPiAzMiBiaXRzIGFycmF5X2lu ZGV4X21hc2tfbm9zcGVjIgo+ICtAQCAtMzUyNiwxMiArMzUyNiwxMiBAQCBjaGVja19DVkVfMjAx N181NzUzX2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoHBzdGF0dXMgeWVsbG93IE5PCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGVsaWYgWyAtbiAiJGtlcm5lbF9lcnIiIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgeWVsbG93IFVOS05PV04gImNvdWxkbid0 IGNoZWNrCj4gKCRrZXJuZWxfZXJyKSIKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBl bGlmICEgY29tbWFuZCAtdiBwZXJsID4vZGV2L251bGwgMj4mMTsgdGhlbgo+ICsrwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgISBjb21tYW5kIC12IEBwZXJsQCA+L2Rldi9udWxsIDI+ JjE7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHBzdGF0dXMgeWVsbG93IFVOS05PV04gIm1pc3NpbmcgJ3BlcmwnCj4gYmluYXJ5LCBwbGVhc2Ug aW5zdGFsbCBpdCIKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmICEgY29tbWFu ZCAtdiAiJHtvcHRfYXJjaF9wcmVmaXh9b2JqZHVtcCIKPiA+L2Rldi9udWxsIDI+JjE7IHRoZW4K PiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmICEgY29tbWFuZCAtdiAiQG9iamR1 bXBAIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgeWVsbG93IFVOS05PV04gIm1pc3NpbmcKPiAnJHtv cHRfYXJjaF9wcmVmaXh9b2JqZHVtcCcgdG9vbCwgcGxlYXNlIGluc3RhbGwgaXQsIHVzdWFsbHkg aXQncyBpbgo+IHRoZSBiaW51dGlscyBwYWNrYWdlIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBlbHNlCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCIke29wdF9hcmNoX3ByZWZpeH1vYmpkdW1wIiAkb2JqZHVtcF9vcHRpb25zCj4gIiRrZXJu ZWwiIHwgcGVybCAtbmUgJ3B1c2ggQHIsICRfOyAvXHMoaGludHxjc2RiKVxzLyAmJgo+ICRyWzBd PX4vXHNzdWJccysoeFxkKykvICYmICRyWzFdPX4vXHNiaWNccyskMSxccyskMSwvICYmCj4gJHJb Ml09fi9cc2FuZFxzLyAmJiBleGl0KDkpOyBzaGlmdCBAciBpZiBAcj4zJzsgcmV0PSQ/Cj4gKyvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCJAb2JqZHVtcEAiICRv YmpkdW1wX29wdGlvbnMgIiRrZXJuZWwiIHwKPiBAcGVybEAgLW5lICdwdXNoIEByLCAkXzsgL1xz KGhpbnR8Y3NkYilccy8gJiYgJHJbMF09fi9cc3N1YlxzKyh4XGQrKS8KPiAmJiAkclsxXT1+L1xz YmljXHMrJDEsXHMrJDEsLyAmJiAkclsyXT1+L1xzYW5kXHMvICYmIGV4aXQoOSk7IHNoaWZ0Cj4g QHIgaWYgQHI+Myc7IHJldD0kPwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgaWYgWyAiJHJldCIgLWVxIDkgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgZ3Jl ZW4gWUVTICJtYXNrX25vc3BlYzY0Cj4gbWFjcm8gaXMgcHJlc2VudCBhbmQgdXNlZCIKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqB2MV9tYXNrX25vc3BlYz0iYXJtNjQgbWFza19ub3NwZWM2NCIKPiArQEAgLTM1NTMsMTIgKzM1 NTMsMTIgQEAgY2hlY2tfQ1ZFXzIwMTdfNTc1M19saW51eCgpCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIHllbGxvdyBOTwo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIFsgLW4gIiRrZXJuZWxfZXJyIiBdOyB0aGVuCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIHll bGxvdyBVTktOT1dOICJjb3VsZG4ndCBjaGVjawo+ICgka2VybmVsX2VycikiCj4gKy3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiAhIGNvbW1hbmQgLXYgcGVybCA+L2Rldi9udWxsIDI+ JjE7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmICEgY29tbWFuZCAt diBAcGVybEAgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIHllbGxvdyBVTktOT1dOICJtaXNzaW5nICdw ZXJsJwo+IGJpbmFyeSwgcGxlYXNlIGluc3RhbGwgaXQiCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgZWxpZiAhIGNvbW1hbmQgLXYgIiR7b3B0X2FyY2hfcHJlZml4fW9iamR1bXAiCj4g Pi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxp ZiAhIGNvbW1hbmQgLXYgIkBvYmpkdW1wQCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIHllbGxvdyBV TktOT1dOICJtaXNzaW5nCj4gJyR7b3B0X2FyY2hfcHJlZml4fW9iamR1bXAnIHRvb2wsIHBsZWFz ZSBpbnN0YWxsIGl0LCB1c3VhbGx5IGl0J3MgaW4KPiB0aGUgYmludXRpbHMgcGFja2FnZSIKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxzZQo+ICstwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAiJHtvcHRfYXJjaF9wcmVmaXh9b2JqZHVtcCIgLWQg IiRrZXJuZWwiIHwKPiBwZXJsIC1uZSAncHVzaCBAciwgJF87IC9ccyhoaW50fGNzZGIpXHMvICYm Cj4gJHJbMF09fi9cc21vdlxzKyh3XGQrKSxccysod1xkKykvICYmCj4gJHJbMV09fi9cc2NtcFxz Kyh4XGQrKSxccysoeFxkKykvICYmICRyWzJdPX4vXHNuZ2NccyskMiwvICYmIGV4aXQoOSk7Cj4g c2hpZnQgQHIgaWYgQHI+Myc7IHJldD0kPwo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAiQG9iamR1bXBAIiAtZCAiJGtlcm5lbCIgfCBAcGVybEAgLW5lICdw dXNoCj4gQHIsICRfOyAvXHMoaGludHxjc2RiKVxzLyAmJiAkclswXT1+L1xzbW92XHMrKHdcZCsp LFxzKyh3XGQrKS8gJiYKPiAkclsxXT1+L1xzY21wXHMrKHhcZCspLFxzKyh4XGQrKS8gJiYgJHJb Ml09fi9cc25nY1xzKyQyLC8gJiYgZXhpdCg5KTsKPiBzaGlmdCBAciBpZiBAcj4zJzsgcmV0PSQ/ Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICIk cmV0IiAtZXEgOSBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyBncmVlbiBZRVMgImFycmF5X2luZGV4 X25vc3BlYwo+IG1hY3JvIGlzIHByZXNlbnQgYW5kIHVzZWQiCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdjFfbWFza19ub3Nw ZWM9ImFybTY0Cj4gYXJyYXlfaW5kZXhfbm9zcGVjIgo+ICtAQCAtMzU3NCw3ICszNTc0LDcgQEAg Y2hlY2tfQ1ZFXzIwMTdfNTc1M19saW51eCgpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbIC1uICIka2VybmVsX2VyciIgXTsgdGhlbgo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHBzdGF0dXMgeWVsbG93IFVOS05PV04gImNvdWxkbid0Cj4gY2hlY2sgKCRrZXJuZWxfZXJyKSIK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiAr LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGlmICEgY29tbWFuZCAtdgo+ICIke29wdF9hcmNoX3ByZWZpeH1vYmpkdW1wIiA+L2Rldi9u dWxsIDI+JjE7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICEgY29tbWFuZCAtdiAiQG9iamR1bXBAIgo+ID4vZGV2 L251bGwgMj4mMTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIHllbGxvdyBV TktOT1dOCj4gIm1pc3NpbmcgJyR7b3B0X2FyY2hfcHJlZml4fW9iamR1bXAnIHRvb2wsIHBsZWFz ZSBpbnN0YWxsIGl0LCB1c3VhbGx5Cj4gaXQncyBpbiB0aGUgYmludXRpbHMgcGFja2FnZSIKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBlbHNlCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgaGVyZSB3ZSBkaXNhc3NlbWJsZSB0 aGUKPiBrZXJuZWwgYW5kIGNvdW50IHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdGhlIExG RU5DRSBvcGNvZGUKPiArQEAgLTM1ODQsNyArMzU4NCw3IEBAIGNoZWNrX0NWRV8yMDE3XzU3NTNf bGludXgoKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIHNvIGxldCdzIHB1c2ggdGhlIHRocmVz aG9sZAo+IHRvIDcwLgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIHYwLjMzKzogbm93IG9ubHkg Y291bnQKPiBsZmVuY2Ugb3Bjb2RlcyBhZnRlciBhIGp1bXAsIHdheSBsZXNzIGVycm9yLXByb25l Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgbm9uIHBhdGNoZWQga2VybmVsIGhhdmUKPiBiZXR3 ZWVuIDAgYW5kIDIwIG1hdGNoZXMsIHBhdGNoZWQgb25lcyBoYXZlIGF0IGxlYXN0IDQwLTQ1Cj4g Ky0KPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbmJfbGZlbmNlPSQoIiR7b3B0X2FyY2hfcHJlZml4fQo+ IG9iamR1bXAiICRvYmpkdW1wX29wdGlvbnMgIiRrZXJuZWwiIDI+L2Rldi9udWxsIHwgZ3JlcCAt dyAtQjEgbGZlbmNlCj4gfCBncmVwIC1Fd2MgJ2ptcHxqbmV8amUnKQo+ICsrwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoG5iX2xmZW5jZT0kKCJAb2JqZHVtcEAiCj4gJG9iamR1bXBfb3B0aW9ucyAiJGtlcm5l bCIgMj4vZGV2L251bGwgfCBAZ3JlcEAgLXcgLUIxIGxmZW5jZSB8Cj4gQGdyZXBAIC1Fd2MgJ2pt cHxqbmV8amUnKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICIkbmJfbGZlbmNlIiAtbHQg MzAgXTsKPiB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3Rh dHVzIHllbGxvdyBOTwo+ICJvbmx5ICRuYl9sZmVuY2UganVtcC10aGVuLWxmZW5jZSBpbnN0cnVj dGlvbnMgZm91bmQsIHNob3VsZCBiZSA+PSAzMAo+IChoZXVyaXN0aWMpIgo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBlbHNlCj4gK0BAIC0zNjU1LDcgKzM2NTUsNyBAQCBjaGVja19DVkVfMjAxN181 NzE1KCkKPiArwqDCoMKgwqDCoMKgwqBfaW5mbyAiXDAzM1sxOzM0bSRjdmUgYWthICckKGN2ZTJu YW1lICIkY3ZlIiknXDAzM1swbSIKPiArwqDCoMKgwqDCoMKgwqBpZiBbICIkb3MiID0gTGludXgg XTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjaGVja19DVkVfMjAxN181 NzE1X2xpbnV4Cj4gKy3CoMKgwqDCoMKgwqBlbGlmIGVjaG8gIiRvcyIgfCBncmVwIC1xIEJTRDsg dGhlbgo+ICsrwqDCoMKgwqDCoMKgZWxpZiBlY2hvICIkb3MiIHwgQGdyZXBAIC1xIEJTRDsgdGhl bgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjaGVja19DVkVfMjAxN181NzE1X2Jz ZAo+ICvCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg X3dhcm4gIlVuc3VwcG9ydGVkIE9TICgkb3MpIgo+ICtAQCAtMzY5NywxMyArMzY5NywxMyBAQCBj aGVja19DVkVfMjAxN181NzE1X2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIwo+IC9w cm9jL3N5cy9rZXJuZWwvaWJyc19lbmFibGVkOiBPcGVuU1VTRSB0dW1ibGV3ZWVkCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHNwZWNleF9rbm9iX2Rpcj0kZGlyCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGlicnNfc3VwcG9ydGVkPSIkZGlyL2licnNfZW5hCj4gYmxlZCBleGlzdHMiCj4gKy3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgaWJyc19lbmFibGVkPSQoY2F0Cj4gIiRkaXIvaWJyc19lbmFibGVkIiAy Pi9kZXYvbnVsbCkKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpYnJzX2VuYWJsZWQ9JChAY2F0QAo+ ICIkZGlyL2licnNfZW5hYmxlZCIgMj4vZGV2L251bGwpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oF9kZWJ1ZyAiaWJyczogZm91bmQKPiAkZGlyL2licnNfZW5hYmxlZD0kaWJyc19lbmFibGVkIgo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIGlmIGlicnNfZW5hYmxlZCBpcyB0aGVyZSwKPiBpYnBi X2VuYWJsZWQgd2lsbCBiZSBpbiB0aGUgc2FtZSBkaXIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg aWYgWyAtZSAiJGRpci9pYnBiX2VuYWJsZWQiCj4gXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBpZiB0aGUgZmlsZSBpcwo+IHRoZXJlLCB3ZSBoYXZlIElC UEIgY29tcGlsZWQtaW4gKHNlZSBub3RlIGFib3ZlIGZvciBJQlJTKQo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWJwYl9zdXBwb3J0ZWQ9IiRkaXIvCj4gaWJwYl9lbmFi bGVkIGV4aXN0cyIKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWJwYl9l bmFibGVkPSQoY2F0Cj4gIiRkaXIvaWJwYl9lbmFibGVkIiAyPi9kZXYvbnVsbCkKPiArK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWJwYl9lbmFibGVkPSQoQGNhdEAKPiAiJGRp ci9pYnBiX2VuYWJsZWQiIDI+L2Rldi9udWxsKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgX2RlYnVnICJpYnBiOiBmb3VuZAo+ICRkaXIvaWJwYl9lbmFibGVkPSRpYnBi X2VuYWJsZWQiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAiaWJwYjoKPiAkZGlyL2licGJfZW5hYmxlZCBm aWxlIGRvZXNuJ3QgZXhpc3QiCj4gK0BAIC0zNzE4LDcgKzM3MTgsNyBAQCBjaGVja19DVkVfMjAx N181NzE1X2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCMgd2hpY2ggaW4gdGhhdCBjYXNlIG1lYW5zIGlicnMgaXMgc3VwcG9ydGVkCj4gKmFu ZCogZW5hYmxlZCBmb3Iga2VybmVsICYgdXNlcgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBhcyBwZXIgdGhlIGlicnMgcGF0Y2ggc2VyaWVzIHYzCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbIC16ICIk aWJyc19zdXBwb3J0ZWQiIF07IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGdyZXAgXmZsYWdzICIkcHJvY2ZzL2Nw dWluZm8iIHwKPiBncmVwIC1xdyBzcGVjX2N0cmxfaWJyczsgdGhlbgo+ICsrwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgQGdyZXBA IF5mbGFncyAiJHByb2Nmcy9jcHVpbmZvIiB8Cj4gQGdyZXBAIC1xdyBzcGVjX2N0cmxfaWJyczsg dGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgImlicnM6IGZvdW5kCj4gc3BlY19j dHJsX2licnMgZmxhZyBpbiAkcHJvY2ZzL2NwdWluZm8iCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGlicnNfc3VwcG9ydGVkPSJzcGVjX2N0cmxfaWJyCj4gcyBmbGFnIGluICRwcm9jZnMvY3B1aW5m byIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBlbmFibGVkPTIgLT4ga2VybmVsICYgdXNlcgo+ ICtAQCAtMzcyOCwxMyArMzcyOCwxMyBAQCBjaGVja19DVkVfMjAxN181NzE1X2xpbnV4KCkKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbIC1uICIkZnVsbG1z ZyIgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCMgd2hlbiBJQlBCIGlzIGVuYWJsZWQgb24gNC4xNSssIHdlCj4g Y2FuIHNlZSBpdCBpbiBzeXNmcwo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgZWNobyAiJGZ1bGxtc2ciIHwgZ3JlcCAtcSAn SUJQQic7Cj4gdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgZWNobyAiJGZ1bGxtc2ciIHwgQGdyZXBAIC1xCj4gJ0lC UEInOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAiaWJwYjogZm91bmQgZW5h YmxlZAo+IGluIHN5c2ZzIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC16ICIkaWJwYl9zdXBw b3J0ZWQiIF0gJiYKPiBpYnBiX3N1cHBvcnRlZD0nSUJQQiBmb3VuZCBlbmFibGVkIGluIHN5c2Zz Jwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC16ICIkaWJwYl9lbmFibGVkIsKgwqAgXSAmJgo+ IGlicGJfZW5hYmxlZD0xCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZmkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIHdoZW4gSUJSU19GVyBpcyBlbmFi bGVkIG9uIDQuMTUrLAo+IHdlIGNhbiBzZWUgaXQgaW4gc3lzZnMKPiArLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGVjaG8gIiRm dWxsbXNnIiB8IGdyZXAgLXEgJywKPiBJQlJTX0ZXJzsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgZWNobyAiJGZ1 bGxtc2ciIHwgQGdyZXBAIC1xICcsCj4gSUJSU19GVyc7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgX2RlYnVnICJpYnJzOiBmb3VuZCBJQlJTX0ZXCj4gaW4gc3lzZnMiCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoFsgLXogIiRpYnJzX3N1cHBvcnRlZCIgXSAmJgo+IGlicnNfc3VwcG9ydGVk PSdmb3VuZCBJQlJTX0ZXIGluIHN5c2ZzJwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpYnJzX2Z3 X2VuYWJsZWQ9MQo+ICtAQCAtMzc0MiwxMyArMzc0MiwxMyBAQCBjaGVja19DVkVfMjAxN181NzE1 X2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAjIHdoZW4gSUJSUyBpcyBlbmFibGVkIG9uIDQuMTUrLCB3ZQo+IGNh biBzZWUgaXQgaW4gc3lzZnMKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIG9uIGEgbW9yZSByZWNlbnQga2VybmVsLCBjbGFz c2ljCj4gIklCUlMiIGlzIG5vdCBldmVuIGxvbmdlciBhbiBvcHRpb24sIGJlY2F1c2Ugb2YgdGhl IHBlcmZvcm1hbmNlCj4gaW1wYWN0Lgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgb25seSAiRW5oYW5jZWQgSUJSUyIgaXMg YXZhaWxhYmxlCj4gKG9uIENQVXMgd2l0aCB0aGUgSUJSU19BTEwgZmxhZykKPiArLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGVj aG8gIiRmdWxsbXNnIiB8IGdyZXAgLXEgLWUKPiAnXDxJQlJTXD4nIC1lICdJbmRpcmVjdCBCcmFu Y2ggUmVzdHJpY3RlZCBTcGVjdWxhdGlvbic7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGVjaG8gIiRmdWxsbXNn IiB8IEBncmVwQCAtcSAtZQo+ICdcPElCUlNcPicgLWUgJ0luZGlyZWN0IEJyYW5jaCBSZXN0cmlj dGVkIFNwZWN1bGF0aW9uJzsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgImli cnM6IGZvdW5kIElCUlMgaW4KPiBzeXNmcyIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgWyAteiAi JGlicnNfc3VwcG9ydGVkIiBdICYmCj4gaWJyc19zdXBwb3J0ZWQ9J2ZvdW5kIElCUlMgaW4gc3lz ZnMnCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgLXogIiRpYnJzX2VuYWJsZWQiwqDCoCBdICYm Cj4gaWJyc19lbmFibGVkPTMKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgY2hlY2tpbmcgZm9yICdFbmhh bmNlZCBJQlJTJyBpbgo+IHN5c2ZzLCBlbmFibGVkIG9uIENQVXMgd2l0aCBJQlJTX0FMTAo+ICst wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaWYgZWNobyAiJGZ1bGxtc2ciIHwgZ3JlcCAtcSAtZQo+ICdFbmhhbmNlZCBJQlJTJzsgdGhl bgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgaWYgZWNobyAiJGZ1bGxtc2ciIHwgQGdyZXBAIC1xIC1lCj4gJ0VuaGFuY2VkIElC UlMnOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgLXogIiRpYnJzX3N1cHBvcnRlZCIg XSAmJgo+IGlicnNfc3VwcG9ydGVkPSdmb3VuZCBFbmhhbmNlZCBJQlJTIGluIHN5c2ZzJwo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAjIDQgaXNuJ3QgYWN0dWFsbHkgYSB2YWxpZAo+IHZhbHVlIG9m IHRoZSBub3cgZXh0aW5jdCAiaWJyc19lbmFibGVkIiBmbGFnIGZpbGUsCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCMgdGhhdCBvbmx5IHdlbnQgZnJvbSAwIHRvIDMsCj4gc28gd2UgdXNlIDQgYXMg ImVuaGFuY2VkIGlicnMgaXMgZW5hYmxlZCIKPiArQEAgLTM3NjcsMTEgKzM3NjcsMTEgQEAgY2hl Y2tfQ1ZFXzIwMTdfNTcxNV9saW51eCgpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBmaQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbIC16ICIkaWJyc19zdXBwb3J0ZWQi IF0gJiYgWyAtbiAiJGtlcm5lbCIgXTsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAhIGNvbW1hbmQgLXYgIiR7b3B0X2FyY2hfcHJlZml4fXN0 cmluZ3MiCj4gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICEgY29tbWFuZCAtdiAiQHN0cmluZ3NAIiA+L2Rldi9u dWxsIDI+JjE7Cj4gdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDoKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpYnJzX2Nhbl90ZWxsPTEKPiArLQo+IMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGlicnNfc3VwcG9ydGVkPSQoIiR7b3B0X2FyY2hfcHJlZml4fXN0cgo+IGluZ3MiICIka2VybmVs IiB8IGdyZXAgLUZ3IC1lICcsIElCUlNfRlcnIHwgaGVhZCAtMSkKPiArK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlicnNfc3VwcG9y dGVkPSQoIkBzdHJpbmdzQCIKPiAiJGtlcm5lbCIgfCBAZ3JlcEAgLUZ3IC1lICcsIElCUlNfRlcn IHwgQGhlYWRAIC0xKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLW4gIiRpYnJzX3N1cHBvcnRlZCIgXTsgdGhlbgo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgImlicnM6IGZvdW5kIGlicnMKPiBldmlkZW5j ZSBpbiBrZXJuZWwgaW1hZ2UgKCRpYnJzX3N1cHBvcnRlZCkiCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGlicnNfc3VwcG9ydGVkPSJmb3VuZAo+ICckaWJyc19zdXBwb3J0ZWQnIGluIGtlcm5lbCBp bWFnZSIKPiArQEAgLTM3ODAsNyArMzc4MCw3IEBAIGNoZWNrX0NWRV8yMDE3XzU3MTVfbGludXgo KQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBpZiBbIC16ICIkaWJyc19zdXBwb3J0ZWQiIF0gJiYgWyAtbiAiJG9wdF9t YXAiIF07Cj4gdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgaWJyc19jYW5fdGVsbD0xCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGlmIGdyZXAgLXEgc3BlY19jdHJsICIkb3B0X21hcCI7IHRoZW4KPiArK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgQGdyZXBAIC1xIHNw ZWNfY3RybCAiJG9wdF9tYXAiOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWJyc19zdXBwb3J0ZWQ9ImZvdW5kIHNw ZWNfY3RybCBpbgo+IHN5bWJvbHMgZmlsZSIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgImlicnM6IGZvdW5kICcq c3BlY19jdHJsKicKPiBzeW1ib2wgaW4gJG9wdF9tYXAiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ICtAQCAtMzc4OCwxMSArMzc4OCwxMSBAQCBj aGVja19DVkVfMjAxN181NzE1X2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIyByZWNlbnQgKDQuMTUpIHZhbmlsbGEga2VybmVscyBoYXZlIElCUEIgYnV0IG5vdAo+IElC UlMsIGFuZCB3aXRob3V0IHRoZSBkZWJ1Z2ZzIHR1bmFibGVzIG9mIFJlZCBIYXQKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyB3ZSBjYW4gZGV0ZWN0IGl0IGRpcmVjdGx5IGluIHRo ZSBpbWFnZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbIC16ICIkaWJwYl9z dXBwb3J0ZWQiIF0gJiYgWyAtbiAiJGtlcm5lbCIgXTsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAhIGNvbW1hbmQgLXYgIiR7b3B0X2FyY2hf cHJlZml4fXN0cmluZ3MiCj4gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICEgY29tbWFuZCAtdiAiQHN0cmluZ3NA IiA+L2Rldi9udWxsIDI+JjE7Cj4gdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDoKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpYnBiX2Nhbl90ZWxsPTEK PiArLQo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGlicGJfc3VwcG9ydGVkPSQoIiR7b3B0X2FyY2hfcHJlZml4fXN0cgo+IGluZ3Mi ICIka2VybmVsIiB8IGdyZXAgLUZ3IC1lICdpYnBiJyAtZSAnLCBJQlBCJyB8IGhlYWQgLTEpCj4g KyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBpYnBiX3N1cHBvcnRlZD0kKCJAc3RyaW5nc0AiCj4gIiRrZXJuZWwiIHwgQGdyZXBAIC1G dyAtZSAnaWJwYicgLWUgJywgSUJQQicgfCBAaGVhZEAgLTEpCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAtbiAiJGli cGJfc3VwcG9ydGVkIiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAiaWJw YjogZm91bmQgaWJwYgo+IGV2aWRlbmNlIGluIGtlcm5lbCBpbWFnZSAoJGlicGJfc3VwcG9ydGVk KSIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWJwYl9zdXBwb3J0ZWQ9ImZvdW5kCj4gJyRpYnBi X3N1cHBvcnRlZCcgaW4ga2VybmVsIGltYWdlIgo+ICtAQCAtMzg0MSw5ICszODQxLDkgQEAgY2hl Y2tfQ1ZFXzIwMTdfNTcxNV9saW51eCgpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDIpwqDCoMKg wqDCoMKgaWYgWwo+ICIkaWJyc19md19lbmFibGVkIiA9IDEgXTsgdGhlbiBwc3RhdHVzIGdyZWVu IFlFUyAiZm9yIGtlcm5lbCwgdXNlcgo+IHNwYWNlLCBhbmQgZmlybXdhcmUgY29kZSIgOyBlbHNl IHBzdGF0dXMgZ3JlZW4gWUVTICJmb3IgYm90aCBrZXJuZWwKPiBhbmQgdXNlciBzcGFjZSI7IGZp OzsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgMynCoMKgwqDCoMKgwqBpZiBbCj4gIiRpYnJzX2Z3 X2VuYWJsZWQiID0gMSBdOyB0aGVuIHBzdGF0dXMgZ3JlZW4gWUVTICJmb3Iga2VybmVsIGFuZAo+ IGZpcm13YXJlIGNvZGUiOyBlbHNlIHBzdGF0dXMgZ3JlZW4gWUVTOyBmaTs7Cj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoDQpwqDCoMKgwqDCoMKgcHN0YXR1cyBncmVlbiBZRVMKPiAiRW5oYW5jZWQg Zmxhdm9yLCBwZXJmb3JtYW5jZSBpbXBhY3Qgd2lsbCBiZSBncmVhdGx5IHJlZHVjZWQiOzsKPiAr LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAqKcKgwqDCoMKgwqDCoGlmIFsgIiRjcHVpZF9pYnJzIiAhPQo+ ICdTUEVDX0NUUkwnIF0gJiYgWyAiJGNwdWlkX2licnMiICE9ICdJQlJTX1NVUFBPUlQnIF0gJiYg Wwo+ICIkY3B1aWRfc3BlY19jdHJsIiAhPSAtMSBdOwo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdGhlbiBwc3RhdHVzCj4geWVsbG93IE5POyBf ZGVidWcgImlicnM6IGtub3duIGNwdSBub3Qgc3VwcG9ydGluZyBTUEVDLUNUUkwgb3IgSUJSUyI7 Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAqKcKgwqDCoMKgwqDCoGlmIFsgIiRjcHVpZF9pYnJzIiAhPQo+ICdTUEVDX0NU UkwnIF0gJiYgWyAiJGNwdWlkX2licnMiICE9ICdJQlJTX1NVUFBPUlQnIF0gJiYgWwo+ICIkY3B1 aWRfc3BlY19jdHJsIiAhPSAtMSBdOwo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgdGhlbiBwc3RhdHVzCj4geWVsbG93IE5POyBfZGVidWcgImli cnM6IGtub3duIGNwdSBub3Qgc3VwcG9ydGluZyBTUEVDLUNUUkwgb3IgSUJSUyI7Cj4gKyvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzCj4geWVsbG93IFVOS05P V047IGZpOzsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBlc2FjCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBmaQo+ICtAQCAtMzg5NCw3ICszODk0LDcgQEAgY2hlY2tfQ1ZFXzIwMTdf NTcxNV9saW51eCgpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJwX2hhcmRlbj0n Jwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbIC1yICIkb3B0X2NvbmZpZyIg XTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg YnBfaGFyZGVuX2Nhbl90ZWxsPTEKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgYnBfaGFyZGVuPSQoZ3JlcCAtdwo+ICdDT05GSUdfSEFSREVOX0JSQU5DSF9Q UkVESUNUT1I9eScgIiRvcHRfY29uZmlnIikKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgYnBfaGFyZGVuPSQoQGdyZXBAIC13Cj4gJ0NPTkZJR19IQVJERU5f QlJBTkNIX1BSRURJQ1RPUj15JyAiJG9wdF9jb25maWciKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAtbiAiJGJwX2hhcmRlbiIgXTsgdGhlbgo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoHBzdGF0dXMgZ3JlZW4gWUVTCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2RlYnVnICJicF9oYXJkZW46IGZvdW5k ICckYnBfaGFyZGVuJwo+IGluICRvcHRfY29uZmlnIgo+ICtAQCAtMzkwMiw3ICszOTAyLDcgQEAg Y2hlY2tfQ1ZFXzIwMTdfNTcxNV9saW51eCgpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLXogIiRicF9oYXJk ZW4iIF0gJiYgWyAtbiAiJG9wdF9tYXAiIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJwX2hhcmRlbl9jYW5fdGVsbD0xCj4gKy3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJwX2hhcmRlbj0kKGdyZXAgLXcg YnBfaGFyZGVuaW5nX2RhdGEKPiAiJG9wdF9tYXAiKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBicF9oYXJkZW49JChAZ3JlcEAgLXcgYnBfaGFyZGVuaW5n X2RhdGEKPiAiJG9wdF9tYXAiKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgaWYgWyAtbiAiJGJwX2hhcmRlbiIgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMg Z3JlZW4gWUVTCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgX2RlYnVnICJicF9oYXJkZW46IGZvdW5kICckYnBfaGFyZGVuJwo+ IGluICRvcHRfbWFwIgo+ICtAQCAtMzkyMCwxMSArMzkyMCwxMSBAQCBjaGVja19DVkVfMjAxN181 NzE1X2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBXZSBjaGVjayB0 aGUgUkVUUE9MSU5FIGtlcm5lbCBvcHRpb25zCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHJldHBvbGluZT0wCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLXIg IiRvcHRfY29uZmlnIiBdOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGlmIGdyZXAgLXEgJ15DT05GSUdfUkVUUE9MSU5FPXknCj4gIiRvcHRfY29u ZmlnIjsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBpZiBAZ3JlcEAgLXEgJ15DT05GSUdfUkVUUE9MSU5FPXknCj4gIiRvcHRfY29uZmlnIjsgdGhl bgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoHBzdGF0dXMgZ3JlZW4gWUVTCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0cG9saW5lPTEKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAj IHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwNDYKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAncmV0cG9saW5lOiBmb3Vu ZCAnJChncmVwCj4gJ15DT05GSUdfUkVUUE9MSU5FJyAiJG9wdF9jb25maWciKSIgaW4gJG9wdF9j b25maWciCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBfZGVidWcgJ3JldHBvbGluZTogZm91bmQgJyQoQGdyZXBACj4gJ15DT05G SUdfUkVUUE9MSU5FJyAiJG9wdF9jb25maWciKSIgaW4gJG9wdF9jb25maWciCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbHNlCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1 cyB5ZWxsb3cgTk8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGZpCj4gK0BAIC0zOTQ1LDggKzM5NDUsOCBAQCBjaGVja19DVkVfMjAxN181NzE1X2xpbnV4 KCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgc2lu Y2UgNS4xNS4yOCwgdGhpcyBpcyBub3cgIlJldHBvbGluZXMiIGFzCj4gdGhlIGltcGxlbWVudGF0 aW9uIHdhcyBzd2l0Y2hlZCB0byBhIGdlbmVyaWMgb25lLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBzbyB3ZSBsb29rIGZvciBib3RoICJyZXRwb2xp bmUiIGFuZAo+ICJyZXRwb2xpbmVzIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgaWYgWyAiJG9wdF9saXZlIiA9IDEgXSAmJiBbIC1uICIkZnVsbG1zZyIg XTsKPiB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBpZiBlY2hvICIkZnVsbG1zZyIgfCBncmVwIC1xd2kgLWUKPiByZXRw b2xpbmUgLWUgcmV0cG9saW5lczsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGVjaG8g IiRmdWxsbXNnIiB8IGdyZXAgLQo+IHF3aSBtaW5pbWFsOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBlY2hvICIk ZnVsbG1zZyIgfCBAZ3JlcEAgLXF3aSAtZQo+IHJldHBvbGluZSAtZSByZXRwb2xpbmVzOyB0aGVu Cj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgZWNobyAiJGZ1bGxtc2ciIHwgQGdyZXBAIC0KPiBx d2kgbWluaW1hbDsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg cmV0cG9saW5lX2NvbXBpbGVyPTAKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHJldHBvbGluZV9jb21waWxlcl9yZQo+IGFzb249Imtlcm5lbCByZXBvcnRzIG1pbmltYWwg cmV0cG9saW5lIGNvbXBpbGF0aW9uIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbHNlCj4gK0BA IC0zOTU2LDE5ICszOTU2LDE5IEBAIGNoZWNrX0NWRV8yMDE3XzU3MTVfbGludXgoKQo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGZpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlm IFsgLW4gIiRvcHRfbWFwIiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBsb29rIGZvciB0aGUgc3ltYm9sCj4g Ky3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBpZiBncmVwIC1xdyBub3JldHBvbGluZV9zZXR1cAo+ICIkb3B0X21hcCI7IHRoZW4KPiAr K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGlmIEBncmVwQCAtcXcgbm9yZXRwb2xpbmVfc2V0dXAKPiAiJG9wdF9tYXAiOyB0aGVuCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHBvbGluZV9jb21waWxlcj0xCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoHJldHBvbGluZV9jb21waWxlcl9yZWFzb249Im5vCj4gcmV0cG9saW5lX3NldHVw IHN5bWJvbCBmb3VuZCBpbiBTeXN0ZW0ubWFwIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIFsgLW4gIiRrZXJuZWwiIF07IHRo ZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAjIGxvb2sgZm9yIHRoZSBzeW1ib2wKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGNvbW1hbmQgLXYgIiR7 b3B0X2FyY2hfcHJlZml4fW5tIgo+ID4vZGV2L251bGwgMj4mMTsgdGhlbgo+ICsrwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgY29t bWFuZCAtdiAiQG5tQCIgPi9kZXYvbnVsbCAyPiYxOwo+IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIyB0aGUgcHJvcGVyIHdheTogdXNlIG5tIGFuZAo+IGxvb2sgZm9yIHRoZSBzeW1ib2wK PiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAiJHtvcHRfYXJjaF9wcmVmaXh9bm0iCj4gIiRrZXJu ZWwiIDI+L2Rldi9udWxsIHwgZ3JlcCAtcXcgJ25vcmV0cG9saW5lX3NldHVwJzsgdGhlbgo+ICsr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGlmICJAbm1AIiAiJGtlcm5lbCIKPiAyPi9kZXYvbnVsbCB8IEBn cmVwQCAtcXcgJ25vcmV0cG9saW5lX3NldHVwJzsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgcmV0cG9saW5lX2NvbXBpbGVyPTEKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHBvbGluZV9jb21waWxlcl9yZQo+IGFzb249Im5vcmV0 cG9saW5lX3NldHVwIGZvdW5kIGluIGtlcm5lbCBzeW1ib2xzIgo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBmaQo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZWxpZiBncmVwIC1xIG5vcmV0cG9saW5lX3NldHVwCj4gIiRrZXJuZWwi OyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBlbGlmIEBncmVwQCAtcSBub3JldHBvbGluZV9zZXR1cAo+ICIka2VybmVs IjsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIGlmIHdlIGRvbid0IGhhdmUgbm0sCj4g bmV2ZXJtaW5kLCB0aGUgc3ltYm9sIG5hbWUgaXMgbG9uZyBlbm91Z2ggdG8gbm90IGhhdmUKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBhbnkgZmFsc2UgcG9zaXRpdmUgdXNpbmcKPiBnb29kIG9s ZCBncmVwIGRpcmVjdGx5IG9uIHRoZSBiaW5hcnkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0 cG9saW5lX2NvbXBpbGVyPTEKPiArQEAgLTM5OTcsNyArMzk5Nyw3IEBAIGNoZWNrX0NWRV8yMDE3 XzU3MTVfbGludXgoKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXRwX2VuYWJs ZWQ9LTEKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAiJG9wdF9saXZlIiA9 IDEgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaWYgWyAtZSAiJHNwZWNleF9rbm9iX2Rpci9yZXRwX2VuYWJsZWQiIF07Cj4gdGhlbgo+ICst wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgcmV0cF9lbmFibGVkPSQoY2F0Cj4gIiRzcGVjZXhfa25vYl9kaXIvcmV0cF9lbmFibGVkIiAy Pi9kZXYvbnVsbCkKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHJldHBfZW5hYmxlZD0kKEBjYXRACj4gIiRzcGVjZXhfa25vYl9k aXIvcmV0cF9lbmFibGVkIiAyPi9kZXYvbnVsbCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgInJldHBvbGluZTog Zm91bmQKPiAkc3BlY2V4X2tub2JfZGlyL3JldHBfZW5hYmxlZD0kcmV0cF9lbmFibGVkIgo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoF9pbmZvX25vbCAiwqDCoMKgICogUmV0cG9saW5lIGlzCj4gZW5hYmxlZDogIgo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGlmIFsgIiRyZXRwX2VuYWJsZWQiID0gMSBdOyB0aGVuCj4gK0BAIC00MDI3LDcgKzQwMjcsNyBA QCBjaGVja19DVkVfMjAxN181NzE1X2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJzYl9maWxsaW5nPTAKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgIiRvcHRfbGl2ZSIgPSAxIF0gJiYgWyAi JG9wdF9ub19zeXNmcyIKPiAhPSAxIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIGlmIHdlJ3JlIGxpdmUgYW5k IHdlIGFyZW4ndCBkZW5pZWQKPiBsb29raW5nIGludG8gL3N5cywgbGV0J3MgZG8gaXQKPiArLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGlmIGVjaG8gIiRtc2ciIHwgZ3JlcCAtcXcgUlNCOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBlY2hvICIkbXNn IiB8IEBncmVwQCAtcXcgUlNCOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJzYl9maWxs aW5nPTEKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyBncmVlbiBZRVMKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBm aQo+ICtAQCAtNDAzNiw3ICs0MDM2LDcgQEAgY2hlY2tfQ1ZFXzIwMTdfNTcxNV9saW51eCgpCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgaWYgWyAtbiAiJGtlcm5lbF9lcnIiIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgcHN0YXR1cyB5ZWxsb3cgVU5LTk9XTgo+ICJjb3VsZG4ndCBjaGVjayAoJGtlcm5lbF9lcnIp Igo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGVsc2UKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBncmVwIC1xdyAtZSAnRmls bGluZyBSU0IKPiBvbiBjb250ZXh0IHN3aXRjaCcgIiRrZXJuZWwiOyB0aGVuCj4gKyvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgaWYgQGdyZXBAIC1xdyAtZSAnRmlsbGluZyBSU0IKPiBvbiBjb250ZXh0IHN3 aXRjaCcgIiRrZXJuZWwiOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqByc2JfZmlsbGluZz0xCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBwc3RhdHVzIGdyZWVuIFlFUwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbHNlCj4gK0BAIC00 MTk4LDcgKzQxOTgsNyBAQCBjaGVja19DVkVfMjAxN181NzE1X2JzZCgpCj4gKyB7Cj4gK8KgwqDC oMKgwqDCoMKgX2luZm/CoMKgwqDCoCAiKiBNaXRpZ2F0aW9uIDEiCj4gK8KgwqDCoMKgwqDCoMKg X2luZm9fbm9sICLCoCAqIEtlcm5lbCBzdXBwb3J0cyBJQlJTOiAiCj4gKy3CoMKgwqDCoMKgwqBp YnJzX2Rpc2FibGVkPSQoc3lzY3RsIC1uIGh3LmlicnNfZGlzYWJsZSAyPi9kZXYvbnVsbCkKPiAr K8KgwqDCoMKgwqDCoGlicnNfZGlzYWJsZWQ9JChAc3lzY3RsQCAtbiBody5pYnJzX2Rpc2FibGUg Mj4vZGV2L251bGwpCj4gK8KgwqDCoMKgwqDCoMKgaWYgWyAteiAiJGlicnNfZGlzYWJsZWQiIF07 IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyB5ZWxsb3cgTk8K PiArwqDCoMKgwqDCoMKgwqBlbHNlCj4gK0BAIC00MjA2LDcgKzQyMDYsNyBAQCBjaGVja19DVkVf MjAxN181NzE1X2JzZCgpCj4gK8KgwqDCoMKgwqDCoMKgZmkKPiArCj4gK8KgwqDCoMKgwqDCoMKg X2luZm9fbm9sICLCoCAqIElCUlMgZW5hYmxlZCBhbmQgYWN0aXZlOiAiCj4gKy3CoMKgwqDCoMKg wqBpYnJzX2FjdGl2ZT0kKHN5c2N0bCAtbiBody5pYnJzX2FjdGl2ZSAyPi9kZXYvbnVsbCkKPiAr K8KgwqDCoMKgwqDCoGlicnNfYWN0aXZlPSQoQHN5c2N0bEAgLW4gaHcuaWJyc19hY3RpdmUgMj4v ZGV2L251bGwpCj4gK8KgwqDCoMKgwqDCoMKgaWYgWyAiJGlicnNfYWN0aXZlIiA9IDEgXTsgdGhl bgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIGdyZWVuIFlFUwo+ICvC oMKgwqDCoMKgwqDCoGVsc2UKPiArQEAgLTQyMTksMTAgKzQyMTksMTAgQEAgY2hlY2tfQ1ZFXzIw MTdfNTcxNV9ic2QoKQo+ICvCoMKgwqDCoMKgwqDCoGlmIFsgLW4gIiRrZXJuZWxfZXJyIiBdOyB0 aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgeWVsbG93IFVOS05P V04gImNvdWxkbid0IGNoZWNrICgka2VybmVsX2VycikiCj4gK8KgwqDCoMKgwqDCoMKgZWxzZQo+ ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICEgY29tbWFuZCAtdiAiJHtvcHRfYXJj aF9wcmVmaXh9cmVhZGVsZiIKPiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiArK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBpZiAhIGNvbW1hbmQgLXYgIkByZWFkZWxmQCIgPi9kZXYvbnVsbCAy PiYxOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBwc3RhdHVzIHllbGxvdyBVTktOT1dOICJtaXNzaW5nCj4gJyR7b3B0X2FyY2hfcHJlZml4fXJl YWRlbGYnIHRvb2wsIHBsZWFzZSBpbnN0YWxsIGl0LCB1c3VhbGx5IGl0J3MgaW4KPiB0aGUgYmlu dXRpbHMgcGFja2FnZSIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxzZQo+ICst wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBuYl90aHVua3M9JCgi JHtvcHRfYXJjaF9wcmVmaXh9cmVhZGVsZiIgLXMKPiAiJGtlcm5lbCIgfCBncmVwIC1jIC1lIF9f bGx2bV9yZXRwb2xpbmVfIC1lCj4gX19sbHZtX2V4dGVybmFsX3JldHBvbGluZV8gLWUgX194ODZf aW5kaXJlY3RfdGh1bmtfKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBuYl90aHVua3M9JCgiQHJlYWRlbGZAIiAtcyAiJGtlcm5lbCIgfCBAZ3JlcEAKPiAt YyAtZSBfX2xsdm1fcmV0cG9saW5lXyAtZSBfX2xsdm1fZXh0ZXJuYWxfcmV0cG9saW5lXyAtZQo+ IF9feDg2X2luZGlyZWN0X3RodW5rXykKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGlmIFsgIiRuYl90aHVua3MiIC1ndCAwIF07IHRoZW4KPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBy ZXRwb2xpbmU9MQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgZ3JlZW4gWUVTICJmb3VuZCAkbmJfdGh1bmtzCj4g dGh1bmsocykiCj4gK0BAIC00MjYzLDcgKzQyNjMsNyBAQCBjaGVja19DVkVfMjAxN181NzE1X2Jz ZCgpCj4gKyBwdGlfcGVyZm9ybWFuY2VfY2hlY2soKQo+ICsgewo+ICvCoMKgwqDCoMKgwqDCoF9p bmZvX25vbCAiwqAgKiBSZWR1Y2VkIHBlcmZvcm1hbmNlIGltcGFjdCBvZiBQVEk6ICIKPiArLcKg wqDCoMKgwqDCoGlmIFsgLWUgIiRwcm9jZnMvY3B1aW5mbyIgXSAmJiBncmVwIF5mbGFncyAiJHBy b2Nmcy9jcHVpbmZvIgo+IHwgZ3JlcCAtcXcgcGNpZDsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgaWYg WyAtZSAiJHByb2Nmcy9jcHVpbmZvIiBdICYmIEBncmVwQCBeZmxhZ3MKPiAiJHByb2Nmcy9jcHVp bmZvIiB8IEBncmVwQCAtcXcgcGNpZDsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBjcHVfcGNpZD0xCj4gK8KgwqDCoMKgwqDCoMKgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqByZWFkX2NwdWlkIDB4MSAweDAgJEVDWCAxNyAxIDE7IHJldD0kPwo+ICtA QCAtNDI3Miw3ICs0MjcyLDcgQEAgcHRpX3BlcmZvcm1hbmNlX2NoZWNrKCkKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgZmkKPiArwqDCoMKgwqDCoMKgwqBmaQo+ICsKPiArLcKgwqDC oMKgwqDCoGlmIFsgLWUgIiRwcm9jZnMvY3B1aW5mbyIgXSAmJiBncmVwIF5mbGFncyAiJHByb2Nm cy9jcHVpbmZvIgo+IHwgZ3JlcCAtcXcgaW52cGNpZDsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgaWYg WyAtZSAiJHByb2Nmcy9jcHVpbmZvIiBdICYmIEBncmVwQCBeZmxhZ3MKPiAiJHByb2Nmcy9jcHVp bmZvIiB8IEBncmVwQCAtcXcgaW52cGNpZDsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBjcHVfaW52cGNpZD0xCj4gK8KgwqDCoMKgwqDCoMKgZWxzZQo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqByZWFkX2NwdWlkIDB4NyAweDAgJEVCWCAxMCAxIDE7IHJldD0k Pwo+ICtAQCAtNDI5Nyw3ICs0Mjk3LDcgQEAgY2hlY2tfQ1ZFXzIwMTdfNTc1NCgpCj4gK8KgwqDC oMKgwqDCoMKgX2luZm8gIlwwMzNbMTszNG0kY3ZlIGFrYSAnJChjdmUybmFtZSAiJGN2ZSIpJ1ww MzNbMG0iCj4gK8KgwqDCoMKgwqDCoMKgaWYgWyAiJG9zIiA9IExpbnV4IF07IHRoZW4KPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY2hlY2tfQ1ZFXzIwMTdfNTc1NF9saW51eAo+ICst wqDCoMKgwqDCoMKgZWxpZiBlY2hvICIkb3MiIHwgZ3JlcCAtcSBCU0Q7IHRoZW4KPiArK8KgwqDC oMKgwqDCoGVsaWYgZWNobyAiJG9zIiB8IEBncmVwQCAtcSBCU0Q7IHRoZW4KPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgY2hlY2tfQ1ZFXzIwMTdfNTc1NF9ic2QKPiArwqDCoMKgwqDC oMKgwqBlbHNlCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF93YXJuICJVbnN1cHBv cnRlZCBPUyAoJG9zKSIKPiArQEAgLTQzMTksNyArNDMxOSw3IEBAIGNoZWNrX0NWRV8yMDE3XzU3 NTRfbGludXgoKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrcHRpX2Nhbl90ZWxs PTAKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAtbiAiJG9wdF9jb25maWci IF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGtwdGlfY2FuX3RlbGw9MQo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBrcHRpX3N1cHBvcnQ9JChncmVwIC13IC1lCj4gQ09ORklHX1BBR0VfVEFCTEVfSVNP TEFUSU9OPXkgLWUgQ09ORklHX0tBSVNFUj15IC1lCj4gQ09ORklHX1VOTUFQX0tFUk5FTF9BVF9F TDA9eSAiJG9wdF9jb25maWciKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBrcHRpX3N1cHBvcnQ9JChAZ3JlcEAgLXcgLWUKPiBDT05GSUdfUEFHRV9UQUJM RV9JU09MQVRJT049eSAtZSBDT05GSUdfS0FJU0VSPXkgLWUKPiBDT05GSUdfVU5NQVBfS0VSTkVM X0FUX0VMMD15ICIkb3B0X2NvbmZpZyIpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBpZiBbIC1uICIka3B0aV9zdXBwb3J0IiBdOyB0aGVuCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg X2RlYnVnICJrcHRpX3N1cHBvcnQ6IGZvdW5kIG9wdGlvbgo+ICcka3B0aV9zdXBwb3J0JyBpbiAk b3B0X2NvbmZpZyIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGZpCj4gK0BAIC00MzI5LDcgKzQzMjksNyBAQCBjaGVja19DVkVfMjAxN181NzU0X2xpbnV4 KCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgc28g d2UgdHJ5IHRvIGZpbmQgYW4gZXhwb3J0ZWQgc3ltYm9sIHRoYXQKPiBpcyBwYXJ0IG9mIHRoZSBQ VEkgcGF0Y2ggaW4gU3lzdGVtLm1hcAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIyBwYXJzZV9rcHRpOiBhcm0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtwdGlfY2FuX3RlbGw9MQo+ICstwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrcHRpX3N1cHBvcnQ9JChncmVwIC13IC1l IGtwdGlfZm9yY2VfZW5hYmxlZAo+IC1lIHBhcnNlX2twdGkgIiRvcHRfbWFwIikKPiArK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKga3B0aV9zdXBwb3J0PSQoQGdy ZXBAIC13IC1lCj4ga3B0aV9mb3JjZV9lbmFibGVkIC1lIHBhcnNlX2twdGkgIiRvcHRfbWFwIikK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLW4g IiRrcHRpX3N1cHBvcnQiIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgImtwdGlfc3VwcG9ydDogZm91 bmQKPiAnJGtwdGlfc3VwcG9ydCcgaW4gJG9wdF9tYXAiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ICtAQCAtNDMzOSwxMCArNDMzOSwxMCBAQCBj aGVja19DVkVfMjAxN181NzU0X2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCMgbm9wdGkgb3B0aW9uIHRoYXQgaXMgcGFydCBvZiB0aGUgcGF0 Y2gKPiAoa2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb24pCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjICdrcHRpPSc6IGFybQo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKga3B0aV9jYW5fdGVsbD0xCj4gKy3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICEgY29tbWFuZCAtdiAi JHtvcHRfYXJjaF9wcmVmaXh9c3RyaW5ncyIKPiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiArK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgISBjb21tYW5kIC12 ICJAc3RyaW5nc0AiID4vZGV2L251bGwgMj4mMTsKPiB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyB5ZWxs b3cgVU5LTk9XTiAibWlzc2luZwo+ICcke29wdF9hcmNoX3ByZWZpeH1zdHJpbmdzJyB0b29sLCBw bGVhc2UgaW5zdGFsbCBpdCwgdXN1YWxseSBpdCdzIGluCj4gdGhlIGJpbnV0aWxzIHBhY2thZ2Ui Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbHNlCj4g Ky0KPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBrcHRpX3N1cHBvcnQ9JCgiJHtvcHRfYXJjaF9wcmVmaXh9c3RyaW4KPiBncyIgIiRr ZXJuZWwiIHwgZ3JlcCAtdyAtZSBub3B0aSAtZSBrcHRpPSkKPiArK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtwdGlfc3VwcG9ydD0k KCJAc3RyaW5nc0AiICIka2VybmVsIgo+IHwgQGdyZXBAIC13IC1lIG5vcHRpIC1lIGtwdGk9KQo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGlmIFsgLW4gIiRrcHRpX3N1cHBvcnQiIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgX2RlYnVnICJrcHRpX3N1cHBvcnQ6IGZvdW5kCj4gJyRrcHRpX3N1cHBvcnQnIGluICRr ZXJuZWwiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZmkKPiArQEAgLTQzNjksMjAgKzQzNjksMjAgQEAgY2hlY2tfQ1ZFXzIw MTdfNTc1NF9saW51eCgpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBkbWVzZ19ncmVwPSIkZG1lc2dfZ3JlcHx4ODYvcHRpOiBVbm1hcHBpbmcKPiBrZXJu ZWwgd2hpbGUgaW4gdXNlcnNwYWNlIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIyBhYXJjaDY0Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBkbWVzZ19ncmVwPSIkZG1lc2dfZ3JlcHxDUFUgZmVhdHVyZXM6Cj4g ZGV0ZWN0ZWQoIGZlYXR1cmUpPzogS2VybmVsIHBhZ2UgdGFibGUgaXNvbGF0aW9uIFwoS1BUSVwp Igo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBncmVw IF5mbGFncyAiJHByb2Nmcy9jcHVpbmZvIiB8IGdyZXAgLXF3Cj4gcHRpOyB0aGVuCj4gKyvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIEBncmVwQCBeZmxhZ3Mg IiRwcm9jZnMvY3B1aW5mbyIgfCBAZ3JlcEAgLQo+IHF3IHB0aTsgdGhlbgo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgdmFu aWxsYSBQVEkgcGF0Y2ggc2V0cyB0aGUgJ3B0aScKPiBmbGFnIGluIGNwdWluZm8KPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBf ZGVidWcgImtwdGlfZW5hYmxlZDogZm91bmQgJ3B0aScKPiBmbGFnIGluICRwcm9jZnMvY3B1aW5m byIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBrcHRpX2VuYWJsZWQ9MQo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBlbGlmIGdyZXAgXmZsYWdzICIkcHJvY2ZzL2NwdWluZm8iIHwgZ3Jl cCAtcXcKPiBrYWlzZXI7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgZWxpZiBAZ3JlcEAgXmZsYWdzICIkcHJvY2ZzL2NwdWluZm8iIHwgQGdyZXBA Cj4gLXF3IGthaXNlcjsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMga2VybmVsIGxpbmUgNC45IHNldHMgdGhlICdr YWlzZXInCj4gZmxhZyBpbiBjcHVpbmZvCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2RlYnVnICJrcHRpX2VuYWJsZWQ6IGZv dW5kICdrYWlzZXInCj4gZmxhZyBpbiAkcHJvY2ZzL2NwdWluZm8iCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKga3B0aV9lbmFi bGVkPTEKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVs aWYgWyAtZSAvc3lzL2tlcm5lbC9kZWJ1Zy94ODYvcHRpX2VuYWJsZWQKPiBdOyB0aGVuCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIyBSZWQgSGF0IEJhY2twb3J0IGNyZWF0ZXMgYQo+IGRlZGljYXRlZCBmaWxlLCBzZWUgaHR0 cHM6Ly9hY2Nlc3MucmVkaGF0LmNvbS9hcnRpY2xlcy8zMzExMzAxCj4gKy3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrcHRpX2VuYWJs ZWQ9JChjYXQKPiAvc3lzL2tlcm5lbC9kZWJ1Zy94ODYvcHRpX2VuYWJsZWQgMj4vZGV2L251bGwp Cj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBrcHRpX2VuYWJsZWQ9JChAY2F0QAo+IC9zeXMva2VybmVsL2RlYnVnL3g4Ni9wdGlf ZW5hYmxlZCAyPi9kZXYvbnVsbCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgImtwdGlfZW5hYmxlZDogZmlsZQo+ IC9zeXMva2VybmVsL2RlYnVnL3g4Ni9wdGlfZW5hYmxlZCBleGlzdHMgYW5kIHNheXM6ICRrcHRp X2VuYWJsZWQiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBlbGlmIGlzX3hlbl9kb20wOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwdGlfeGVuX3B2X2RvbVU9JCh4bCBkbWVz ZyB8IGdyZXAKPiAnWFBUSScgfCBncmVwICdEb21VIGVuYWJsZWQnIHwgaGVhZCAtMSkKPiArK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHB0aV94ZW5fcHZfZG9tVT0kKHhsIEBkbWVzZ0AgfCBAZ3JlcEAKPiAnWFBUSScgfCBAZ3JlcEAg J0RvbVUgZW5hYmxlZCcgfCBAaGVhZEAgLTEpCj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgLW4gIiRwdGlfeGVuX3B2 X2RvbVUiIF0gJiYKPiBrcHRpX2VuYWJsZWQ9MQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgZmkKPiArQEAgLTQ0NTcsNyArNDQ1Nyw3IEBAIGNoZWNrX0NW RV8yMDE3XzU3NTRfbGludXgoKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLW4gIiRrcHRpX3N1cHBvcnQiIF07IHRo ZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAtZQo+ICIvc3lzL2tlcm5lbC9kZWJ1Zy94 ODYvcHRpX2VuYWJsZWQiIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGV4cGxhaW4gIllvdXIga2VybmVsCj4gc3VwcG9ydHMgUFRJIGJ1dCBpdCdzIGRpc2Fi bGVkLCB5b3UgY2FuIGVuYWJsZSBpdCB3aXRoIFxgZWNobyAxID4KPiAvc3lzL2tlcm5lbC9kZWJ1 Zy94ODYvcHRpX2VuYWJsZWRcYCIKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIGVjaG8gIiRr ZXJuZWxfY21kbGluZSIgfAo+IGdyZXAgLXEgLXcgLWUgbm9wdGkgLWUgcHRpPW9mZjsgdGhlbgo+ ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgZWNobyAiJGtlcm5lbF9jbWRsaW5lIiB8Cj4gQGdy ZXBAIC1xIC13IC1lIG5vcHRpIC1lIHB0aT1vZmY7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGV4cGxhaW4gIllvdXIga2VybmVsCj4gc3VwcG9ydHMgUFRJIGJ1 dCBpdCBoYXMgYmVlbiBkaXNhYmxlZCBvbiBjb21tYW5kLWxpbmUsIHJlbW92ZSB0aGUKPiBub3B0 aSBvciBwdGk9b2ZmIG9wdGlvbiBmcm9tIHlvdXIgYm9vdGxvYWRlciBjb25maWd1cmF0aW9uIgo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbHNlCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBleHBsYWluICJZb3VyIGtlcm5lbAo+IHN1cHBvcnRzIFBUSSBidXQgaXQgaGFz IGJlZW4gZGlzYWJsZWQsIGNoZWNrIFxgZG1lc2dcYCByaWdodCBhZnRlcgo+IGJvb3QgdG8gZmlu ZCBjbHVlcyB3aHkgdGhlIHN5c3RlbSBkaXNhYmxlZCBpdCIKPiArQEAgLTQ1MDgsNyArNDUwOCw3 IEBAIGNoZWNrX0NWRV8yMDE3XzU3NTRfbGludXgoKQo+ICsgY2hlY2tfQ1ZFXzIwMTdfNTc1NF9i c2QoKQo+ICsgewo+ICvCoMKgwqDCoMKgwqDCoF9pbmZvX25vbCAiKiBLZXJuZWwgc3VwcG9ydHMg UGFnZSBUYWJsZSBJc29sYXRpb24gKFBUSSk6ICIKPiArLcKgwqDCoMKgwqDCoGtwdGlfZW5hYmxl ZD0kKHN5c2N0bCAtbiB2bS5wbWFwLnB0aSAyPi9kZXYvbnVsbCkKPiArK8KgwqDCoMKgwqDCoGtw dGlfZW5hYmxlZD0kKEBzeXNjdGxAIC1uIHZtLnBtYXAucHRpIDI+L2Rldi9udWxsKQo+ICvCoMKg wqDCoMKgwqDCoGlmIFsgLXogIiRrcHRpX2VuYWJsZWQiIF07IHRoZW4KPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyB5ZWxsb3cgTk8KPiArwqDCoMKgwqDCoMKgwqBlbHNl Cj4gK0BAIC00NTc5LDcgKzQ1NzksNyBAQCBjaGVja19DVkVfMjAxOF8zNjM5KCkKPiArwqDCoMKg wqDCoMKgwqBfaW5mbyAiXDAzM1sxOzM0bSRjdmUgYWthICckKGN2ZTJuYW1lICIkY3ZlIiknXDAz M1swbSIKPiArwqDCoMKgwqDCoMKgwqBpZiBbICIkb3MiID0gTGludXggXTsgdGhlbgo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjaGVja19DVkVfMjAxOF8zNjM5X2xpbnV4Cj4gKy3C oMKgwqDCoMKgwqBlbGlmIGVjaG8gIiRvcyIgfCBncmVwIC1xIEJTRDsgdGhlbgo+ICsrwqDCoMKg wqDCoMKgZWxpZiBlY2hvICIkb3MiIHwgQGdyZXBAIC1xIEJTRDsgdGhlbgo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBjaGVja19DVkVfMjAxOF8zNjM5X2JzZAo+ICvCoMKgwqDCoMKg wqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX3dhcm4gIlVuc3VwcG9y dGVkIE9TICgkb3MpIgo+ICtAQCAtNDU5OCwzMyArNDU5OCwzMyBAQCBjaGVja19DVkVfMjAxOF8z NjM5X2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqBpZiBbICIkb3B0X3N5c2ZzX29ubHkiICE9IDEg XTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfaW5mb19ub2wgIiogS2Vy bmVsIHN1cHBvcnRzIGRpc2FibGluZyBzcGVjdWxhdGl2ZQo+IHN0b3JlIGJ5cGFzcyAoU1NCKTog Igo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICIkb3B0X2xpdmUiID0gMSBd OyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlm IGdyZXAgLUVxICdTcGVjdWxhdGlvbi4/U3RvcmUuP0J5cGFzczonCj4gIiRwcm9jZnMvc2VsZi9z dGF0dXMiIDI+L2Rldi9udWxsOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGlmIEBncmVwQCAtRXEgJ1NwZWN1bGF0aW9uLj9TdG9yZS4/QnlwYXNz OicKPiAiJHByb2Nmcy9zZWxmL3N0YXR1cyIgMj4vZGV2L251bGw7IHRoZW4KPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrZXJu ZWxfc3NiPSJmb3VuZCBpbgo+ICRwcm9jZnMvc2VsZi9zdGF0dXMiCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2RlYnVnICJm b3VuZAo+IFNwZWN1bGF0aW9uLlN0b3JlLkJ5cGFzczogaW4gJHByb2Nmcy9zZWxmL3N0YXR1cyIK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCMgYXJtNjQga2VybmVscyBjYW4gaGF2ZSBjcHVfc2hvd19zcGVjX3N0b3JlX2J5cGFz cwo+IHdpdGggQVJNNjRfU1NCRCwgc28gZXhjbHVkZSB0aGVtCj4gKy3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgaWYgWyAteiAiJGtlcm5lbF9zc2IiIF0gJiYgWyAtbiAiJGtlcm5lbCIgXSAm JiAhIGdyZXAKPiAtcSAnYXJtNjRfc3lzXycgIiRrZXJuZWwiOyB0aGVuCj4gKy3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF9zc2I9JCgiJHtvcHRfYXJj aF9wcmVmaXh9c3RyaW5ncyIKPiAiJGtlcm5lbCIgfCBncmVwIHNwZWNfc3RvcmVfYnlwYXNzIHwg aGVhZCAtbjEpOwo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLXogIiRrZXJu ZWxfc3NiIiBdICYmIFsgLW4gIiRrZXJuZWwiIF0gJiYgIQo+IEBncmVwQCAtcSAnYXJtNjRfc3lz XycgIiRrZXJuZWwiOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGtlcm5lbF9zc2I9JCgiQHN0cmluZ3NAIiAiJGtlcm5lbCIgfCBAZ3JlcEAKPiBz cGVjX3N0b3JlX2J5cGFzcyB8IEBoZWFkQCAtbjEpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgWyAtbiAiJGtlcm5lbF9zc2IiIF0gJiYga2VybmVsX3Nz Yj0iZm91bmQKPiAka2VybmVsX3NzYiBpbiBrZXJuZWwiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgYXJtNjQga2Vy bmVscyBjYW4gaGF2ZSBjcHVfc2hvd19zcGVjX3N0b3JlX2J5cGFzcwo+IHdpdGggQVJNNjRfU1NC RCwgc28gZXhjbHVkZSB0aGVtCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAt eiAiJGtlcm5lbF9zc2IiIF0gJiYgWyAtbiAiJG9wdF9tYXAiIF0gJiYgIQo+IGdyZXAgLXEgJ2Fy bTY0X3N5c18nICIkb3B0X21hcCI7IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKga2VybmVsX3NzYj0kKGdyZXAgc3BlY19zdG9yZV9ieXBhc3MKPiAi JG9wdF9tYXAiIHwgYXdrICd7cHJpbnQgJDN9JyB8IGhlYWQgLW4xKQo+ICsrwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGlmIFsgLXogIiRrZXJuZWxfc3NiIiBdICYmIFsgLW4gIiRvcHRfbWFw IiBdICYmICEKPiBAZ3JlcEAgLXEgJ2FybTY0X3N5c18nICIkb3B0X21hcCI7IHRoZW4KPiArK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKga2VybmVsX3NzYj0kKEBn cmVwQCBzcGVjX3N0b3JlX2J5cGFzcwo+ICIkb3B0X21hcCIgfCBAYXdrQCAne3ByaW50ICQzfScg fCBAaGVhZEAgLW4xKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgWyAtbiAiJGtlcm5lbF9zc2IiIF0gJiYga2VybmVsX3NzYj0iZm91bmQKPiAka2VybmVs X3NzYiBpbiBTeXN0ZW0ubWFwIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIGFybTY0IG9ubHk6Cj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLXogIiRrZXJuZWxfc3NiIiBdICYmIFsgLW4gIiRv cHRfbWFwIiBdOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGtlcm5lbF9zc2I9JChncmVwIC13IGNwdV9lbmFibGVfc3Nicwo+ICIkb3B0X21hcCIg fCBhd2sgJ3twcmludCAkM30nIHwgaGVhZCAtbjEpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF9zc2I9JChAZ3JlcEAgLXcgY3B1X2VuYWJsZV9z c2JzCj4gIiRvcHRfbWFwIiB8IEBhd2tAICd7cHJpbnQgJDN9JyB8IEBoZWFkQCAtbjEpCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC1uICIka2VybmVs X3NzYiIgXSAmJiBrZXJuZWxfc3NiPSJmb3VuZAo+ICRrZXJuZWxfc3NiIGluIFN5c3RlbS5tYXAi Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGlmIFsgLXogIiRrZXJuZWxfc3NiIiBdICYmIFsgLW4gIiRvcHRfY29uZmln IiBdOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGtlcm5lbF9zc2I9JChncmVwIC13ICdDT05GSUdfQVJNNjRfU1NCRD15Jwo+ICIkb3B0X2NvbmZp ZyIpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5l bF9zc2I9JChAZ3JlcEAgLXcgJ0NPTkZJR19BUk02NF9TU0JEPXknCj4gIiRvcHRfY29uZmlnIikK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgLW4gIiRr ZXJuZWxfc3NiIiBdICYmCj4ga2VybmVsX3NzYj0iQ09ORklHX0FSTTY0X1NTQkQgZW5hYmxlZCBp biBrY29uZmlnIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbIC16ICIka2VybmVsX3NzYiIgXSAmJiBbIC1uICIk a2VybmVsIiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAjIHRoaXMgc3RyaW5nIG9ubHkgYXBwZWFycyBpbiBrZXJuZWwgaWYKPiBDT05GSUdf QVJNNjRfU1NCRCBpcyBzZXQKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKga2VybmVsX3NzYj0kKGdyZXAgLXcgIlNwZWN1bGF0aXZlIFN0b3JlCj4gQnlwYXNz aW5nIFNhZmUgKFNTQlMpIiAiJGtlcm5lbCIpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF9zc2I9JChAZ3JlcEAgLXcgIlNwZWN1bGF0aXZlIFN0 b3JlCj4gQnlwYXNzaW5nIFNhZmUgKFNTQlMpIiAiJGtlcm5lbCIpCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC1uICIka2VybmVsX3NzYiIgXSAmJiBr ZXJuZWxfc3NiPSJmb3VuZAo+ICdTcGVjdWxhdGl2ZSBTdG9yZSBCeXBhc3NpbmcgU2FmZSAoU1NC UyknIGluIGtlcm5lbCIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZmkKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyAvYXJtNjQgb25seQo+ICtAQCAtNDYzOSwzMSAr NDYzOSwzMSBAQCBjaGVja19DVkVfMjAxOF8zNjM5X2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgaWYgWyAiJG9wdF9saXZlIiA9IDEgXTsgdGhlbgo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIwo+IGh0dHBzOi8vZWxpeGlyLmJv b3RsaW4uY29tL2xpbnV4L3Y1LjAvc291cmNlL2ZzL3Byb2MvYXJyYXkuYyNMMzQwCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfaW5mb19ub2wgIiogU1NC IG1pdGlnYXRpb24gaXMgZW5hYmxlZCBhbmQKPiBhY3RpdmU6ICIKPiArLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgZ3JlcCAtRXEKPiAnU3BlY3VsYXRpb24u P1N0b3JlLj9CeXBhc3M6W1s6c3BhY2U6XV0rdGhyZWFkJyAiJHByb2Nmcy9zZWxmL3N0YXR1cyIK PiAyPi9kZXYvbnVsbDsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBpZiBAZ3JlcEAgLUVxCj4gJ1NwZWN1bGF0aW9uLj9TdG9yZS4/QnlwYXNzOltb OnNwYWNlOl1dK3RocmVhZCcgIiRwcm9jZnMvc2VsZi9zdGF0dXMiCj4gMj4vZGV2L251bGw7IHRo ZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBrZXJuZWxfc3NiZF9lbmFibGVkPTEKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIGdyZWVuIFlF UyAicGVyLXRocmVhZCB0aHJvdWdoCj4gcHJjdGwiCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgZ3JlcCAtRXEKPiAnU3BlY3VsYXRpb24uP1N0b3Jl Lj9CeXBhc3M6W1s6c3BhY2U6XV0rZ2xvYmFsbHkgbWl0aWdhdGVkJwo+ICIkcHJvY2ZzL3NlbGYv c3RhdHVzIiAyPi9kZXYvbnVsbDsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBlbGlmIEBncmVwQCAtRXEKPiAnU3BlY3VsYXRpb24uP1N0b3JlLj9C eXBhc3M6W1s6c3BhY2U6XV0rZ2xvYmFsbHkgbWl0aWdhdGVkJwo+ICIkcHJvY2ZzL3NlbGYvc3Rh dHVzIiAyPi9kZXYvbnVsbDsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF9zc2JkX2VuYWJsZWQ9Mgo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHBzdGF0dXMgZ3JlZW4gWUVTICJnbG9iYWwiCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgZ3JlcCAtRXEKPiAnU3BlY3VsYXRpb24uP1N0b3Jl Lj9CeXBhc3M6W1s6c3BhY2U6XV0rdnVsbmVyYWJsZScKPiAiJHByb2Nmcy9zZWxmL3N0YXR1cyIg Mj4vZGV2L251bGw7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgZWxpZiBAZ3JlcEAgLUVxCj4gJ1NwZWN1bGF0aW9uLj9TdG9yZS4/QnlwYXNzOltb OnNwYWNlOl1dK3Z1bG5lcmFibGUnCj4gIiRwcm9jZnMvc2VsZi9zdGF0dXMiIDI+L2Rldi9udWxs OyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKga2VybmVsX3NzYmRfZW5hYmxlZD0wCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyB5ZWxs b3cgTk8KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxp ZiBncmVwIC1FcQo+ICdTcGVjdWxhdGlvbi4/U3RvcmUuP0J5cGFzczpbWzpzcGFjZTpdXStub3Qg dnVsbmVyYWJsZScKPiAiJHByb2Nmcy9zZWxmL3N0YXR1cyIgMj4vZGV2L251bGw7IHRoZW4KPiAr K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiBAZ3JlcEAg LUVxCj4gJ1NwZWN1bGF0aW9uLj9TdG9yZS4/QnlwYXNzOltbOnNwYWNlOl1dK25vdCB2dWxuZXJh YmxlJwo+ICIkcHJvY2ZzL3NlbGYvc3RhdHVzIiAyPi9kZXYvbnVsbDsgdGhlbgo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtl cm5lbF9zc2JkX2VuYWJsZWQ9LTIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIGJsdWUgTk8gIm5vdCB2dWxuZXJh YmxlIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlm IGdyZXAgLUVxCj4gJ1NwZWN1bGF0aW9uLj9TdG9yZS4/QnlwYXNzOltbOnNwYWNlOl1dK3Vua25v d24nCj4gIiRwcm9jZnMvc2VsZi9zdGF0dXMiIDI+L2Rldi9udWxsOyB0aGVuCj4gKyvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgQGdyZXBAIC1FcQo+ICdT cGVjdWxhdGlvbi4/U3RvcmUuP0J5cGFzczpbWzpzcGFjZTpdXSt1bmtub3duJwo+ICIkcHJvY2Zz L3NlbGYvc3RhdHVzIiAyPi9kZXYvbnVsbDsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF9zc2JkX2VuYWJs ZWQ9MAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHBzdGF0dXMgYmx1ZSBOTwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxzZQo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyBibHVlIFVOS05PV04gInVu a25vd24gdmFsdWU6Cj4gJChncmVwIC1FICdTcGVjdWxhdGlvbi4/U3RvcmUuP0J5cGFzczonICIk cHJvY2ZzL3NlbGYvc3RhdHVzIgo+IDI+L2Rldi9udWxsIHwgY3V0IC1kOiAtZjItKSIKPiArK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHBzdGF0dXMgYmx1ZSBVTktOT1dOICJ1bmtub3duIHZhbHVlOgo+ICQoQGdyZXBAIC1FICdTcGVj dWxhdGlvbi4/U3RvcmUuP0J5cGFzczonICIkcHJvY2ZzL3NlbGYvc3RhdHVzIgo+IDI+L2Rldi9u dWxsIHwgQGN1dEAgLWQ6IC1mMi0pIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZmkKPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBpZiBbICIka2VybmVsX3NzYmRfZW5hYmxlZCIgPSAxIF07IHRoZW4KPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBfaW5mb19ub2wgIiogU1NCIG1pdGlnYXRpb24gY3VycmVudGx5Cj4gYWN0aXZlIGZvciBz ZWxlY3RlZCBwcm9jZXNzZXM6ICIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIHNpbGVuY2UgZ3JlcCdzIHN0ZGVyciBoZXJl IHRvIGF2b2lkCj4gRU5PRU5UIGVycm9ycyBmcm9tIHByb2Nlc3NlcyB0aGF0IGhhdmUgZXhpdGVk IHNpbmNlIHRoZSBzaGVsbCdzCj4gZXhwYW5zaW9uIG9mIHRoZSAqCj4gKy3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBtaXRpZ2F0ZWRf cHJvY2Vzc2VzPSQoZmluZCAvcHJvYyAtCj4gbWluZGVwdGggMiAtbWF4ZGVwdGggMiAtdHlwZSBm IC1uYW1lIHN0YXR1cyAtcHJpbnQwIDI+L2Rldi9udWxsIFwKPiArLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqB8IHhhcmdzIC1yMCBncmVwIC1FbAo+ICdTcGVjdWxhdGlvbi4/U3RvcmUuP0J5cGFzczpbWzpz cGFjZTpdXSt0aHJlYWQgKGZvcmNlICk/bWl0aWdhdGVkJwo+IDI+L2Rldi9udWxsIFwKPiArLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqB8IHNlZCBzL3N0YXR1cy9leGUvIHwgeGFyZ3MgLQo+IHIgLW4xIHJl YWRsaW5rIC1mIDI+L2Rldi9udWxsIHwgeGFyZ3MgLXIgLW4xIGJhc2VuYW1lIHwgc29ydCAtdSB8 IHRyCj4gIlxuIiAiICIgfCBzZWQgJ3MvICQvLycpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBtaXRpZ2F0ZWRfcHJvY2Vzc2Vz PSQoQGZpbmRAIC9wcm9jIC0KPiBtaW5kZXB0aCAyIC1tYXhkZXB0aCAyIC10eXBlIGYgLW5hbWUg c3RhdHVzIC1wcmludDAgMj4vZGV2L251bGwgXAo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHwgQHhh cmdzQCAtcjAgQGdyZXBAIC1FbAo+ICdTcGVjdWxhdGlvbi4/U3RvcmUuP0J5cGFzczpbWzpzcGFj ZTpdXSt0aHJlYWQgKGZvcmNlICk/bWl0aWdhdGVkJwo+IDI+L2Rldi9udWxsIFwKPiArK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqB8IEBzZWRAIHMvc3RhdHVzL2V4ZS8gfAo+IEB4YXJnc0AgLXIgLW4xIHJl YWRsaW5rIC1mIDI+L2Rldi9udWxsIHwgQHhhcmdzQCAtciAtbjEgQGJhc2VuYW1lQCB8Cj4gQHNv cnRAIC11IHwgQHRyQCAiXG4iICIgIiB8IEBzZWRAICdzLyAkLy8nKQo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLW4g IiRtaXRpZ2F0ZWRfcHJvY2Vzc2VzIiBdOwo+IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg cHN0YXR1cyBncmVlbiBZRVMKPiAiJG1pdGlnYXRlZF9wcm9jZXNzZXMiCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxzZQo+ ICtAQCAtNDcxNSw3ICs0NzE1LDcgQEAgY2hlY2tfQ1ZFXzIwMThfMzYzOV9saW51eCgpCj4gKyBj aGVja19DVkVfMjAxOF8zNjM5X2JzZCgpCj4gKyB7Cj4gK8KgwqDCoMKgwqDCoMKgX2luZm9fbm9s ICIqIEtlcm5lbCBzdXBwb3J0cyBzcGVjdWxhdGlvbiBzdG9yZSBieXBhc3M6ICIKPiArLcKgwqDC oMKgwqDCoGlmIHN5c2N0bCBody5zcGVjX3N0b3JlX2J5cGFzc19kaXNhYmxlID4vZGV2L251bGwg Mj4mMTsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgaWYgQHN5c2N0bEAgaHcuc3BlY19zdG9yZV9ieXBh c3NfZGlzYWJsZSA+L2Rldi9udWxsIDI+JjE7Cj4gdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBrZXJuZWxfc3NiPTEKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg cHN0YXR1cyBncmVlbiBZRVMKPiArwqDCoMKgwqDCoMKgwqBlbHNlCj4gK0BAIC00NzI0LDcgKzQ3 MjQsNyBAQCBjaGVja19DVkVfMjAxOF8zNjM5X2JzZCgpCj4gK8KgwqDCoMKgwqDCoMKgZmkKPiAr Cj4gK8KgwqDCoMKgwqDCoMKgX2luZm9fbm9sICIqIFNwZWN1bGF0aW9uIHN0b3JlIGJ5cGFzcyBp cyBhZG1pbmlzdHJhdGl2ZWx5Cj4gZW5hYmxlZDogIgo+ICstwqDCoMKgwqDCoMKgc3NiX2VuYWJs ZWQ9JChzeXNjdGwgLW4gaHcuc3BlY19zdG9yZV9ieXBhc3NfZGlzYWJsZQo+IDI+L2Rldi9udWxs KQo+ICsrwqDCoMKgwqDCoMKgc3NiX2VuYWJsZWQ9JChAc3lzY3RsQCAtbiBody5zcGVjX3N0b3Jl X2J5cGFzc19kaXNhYmxlCj4gMj4vZGV2L251bGwpCj4gK8KgwqDCoMKgwqDCoMKgX2RlYnVnICJo dy5zcGVjX3N0b3JlX2J5cGFzc19kaXNhYmxlPSRzc2JfZW5hYmxlZCIKPiArwqDCoMKgwqDCoMKg wqBjYXNlICIkc3NiX2VuYWJsZWQiIGluCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oDApIHBzdGF0dXMgeWVsbG93IE5PICJkaXNhYmxlZCI7Owo+ICtAQCAtNDczNCw3ICs0NzM0LDcg QEAgY2hlY2tfQ1ZFXzIwMThfMzYzOV9ic2QoKQo+ICvCoMKgwqDCoMKgwqDCoGVzYWMKPiArCj4g K8KgwqDCoMKgwqDCoMKgX2luZm9fbm9sICIqIFNwZWN1bGF0aW9uIHN0b3JlIGJ5cGFzcyBpcyBj dXJyZW50bHkgYWN0aXZlOiAiCj4gKy3CoMKgwqDCoMKgwqBzc2JfYWN0aXZlPSQoc3lzY3RsIC1u IGh3LnNwZWNfc3RvcmVfYnlwYXNzX2Rpc2FibGVfYWN0aXZlCj4gMj4vZGV2L251bGwpCj4gKyvC oMKgwqDCoMKgwqBzc2JfYWN0aXZlPSQoQHN5c2N0bEAgLW4gaHcuc3BlY19zdG9yZV9ieXBhc3Nf ZGlzYWJsZV9hY3RpdmUKPiAyPi9kZXYvbnVsbCkKPiArwqDCoMKgwqDCoMKgwqBfZGVidWcgImh3 LnNwZWNfc3RvcmVfYnlwYXNzX2Rpc2FibGVfYWN0aXZlPSRzc2JfYWN0aXZlIgo+ICvCoMKgwqDC oMKgwqDCoGNhc2UgIiRzc2JfYWN0aXZlIiBpbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAxKSBwc3RhdHVzIGdyZWVuIFlFUzs7Cj4gK0BAIC00ODA2LDcgKzQ4MDYsNyBAQCBjaGVj a19DVkVfMjAxOF8zNjIwKCkKPiArwqDCoMKgwqDCoMKgwqBfaW5mbyAiXDAzM1sxOzM0bSRjdmUg YWthICckKGN2ZTJuYW1lICIkY3ZlIiknXDAzM1swbSIKPiArwqDCoMKgwqDCoMKgwqBpZiBbICIk b3MiID0gTGludXggXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjaGVj a19DVkVfMjAxOF8zNjIwX2xpbnV4Cj4gKy3CoMKgwqDCoMKgwqBlbGlmIGVjaG8gIiRvcyIgfCBn cmVwIC1xIEJTRDsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgZWxpZiBlY2hvICIkb3MiIHwgQGdyZXBA IC1xIEJTRDsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjaGVja19DVkVf MjAxOF8zNjIwX2JzZAo+ICvCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgX3dhcm4gIlVuc3VwcG9ydGVkIE9TICgkb3MpIgo+ICtAQCAtNDgyNCwxNCAr NDgyNCwxNCBAQCBjaGVja19DVkVfMjAxOF8zNjIwX2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqBm aQo+ICvCoMKgwqDCoMKgwqDCoGlmIFsgIiRvcHRfc3lzZnNfb25seSIgIT0gMSBdOyB0aGVuCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9pbmZvX25vbCAiKiBLZXJuZWwgc3VwcG9y dHMgUFRFIGludmVyc2lvbjogIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICEg Y29tbWFuZCAtdiAiJHtvcHRfYXJjaF9wcmVmaXh9c3RyaW5ncyIKPiA+L2Rldi9udWxsIDI+JjE7 IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAhIGNvbW1hbmQgLXYgIkBz dHJpbmdzQCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIHllbGxvdyBVTktOT1dOICJtaXNzaW5nICdz dHJpbmdzJwo+IHRvb2wsIHBsZWFzZSBpbnN0YWxsIGl0Igo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHRlaW52X3N1cHBvcnRlZD0tMQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIFsgLW4gIiRrZXJuZWxfZXJyIiBdOyB0aGVuCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIHll bGxvdyBVTktOT1dOICIka2VybmVsX2VyciIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHB0ZWludl9zdXBwb3J0ZWQ9LTEKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZWxzZQo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBpZiAiJHtvcHRfYXJjaF9wcmVmaXh9c3RyaW5ncyIgIiRrZXJuZWwiIHwKPiBn cmVwIC1GcSAnUFRFIEludmVyc2lvbic7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgIkBzdHJpbmdzQCIgIiRrZXJuZWwiIHwgQGdyZXBAIC1G cSAnUFRFCj4gSW52ZXJzaW9uJzsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgZ3JlZW4gWUVTICJmb3Vu ZCBpbiBrZXJuZWwKPiBpbWFnZSIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgInB0ZWludjogZm91bmQgcHRlIGlu dmVyc2lvbgo+IGV2aWRlbmNlIGluIGtlcm5lbCBpbWFnZSIKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwdGVpbnZfc3VwcG9y dGVkPTEKPiArQEAgLTQ4NDQsNyArNDg0NCw3IEBAIGNoZWNrX0NWRV8yMDE4XzM2MjBfbGludXgo KQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfaW5mb19ub2wgIiogUFRFIGludmVy c2lvbiBlbmFibGVkIGFuZCBhY3RpdmU6ICIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaWYgWyAiJG9wdF9saXZlIiA9IDEgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAtbiAiJGZ1bGxtc2ciIF07IHRoZW4KPiArLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGlmIGVjaG8gIiRmdWxsbXNnIiB8IGdyZXAgLXEKPiAnTWl0aWdhdGlvbjogUFRFIEludmVyc2lv bic7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGlmIGVjaG8gIiRmdWxsbXNnIiB8IEBncmVwQCAtcQo+ICdNaXRpZ2F0 aW9uOiBQVEUgSW52ZXJzaW9uJzsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVz IGdyZWVuIFlFUwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwdGVpbnZfYWN0aXZlPTEKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBlbHNlCj4gK0BAIC00ODkyLDcgKzQ4OTIsNyBAQCBjaGVja19DVkVfMjAxOF8zNjIwX2JzZCgp Cj4gK8KgwqDCoMKgwqDCoMKgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBf ZGVidWcgInZtbSBtb2R1bGUgYWxyZWFkeSBsb2FkZWQiCj4gK8KgwqDCoMKgwqDCoMKgZmkKPiAr LcKgwqDCoMKgwqDCoGlmIHN5c2N0bCBody52bW0udm14LmwxZF9mbHVzaCA+L2Rldi9udWxsIDI+ JjE7IHRoZW4KPiArK8KgwqDCoMKgwqDCoGlmIEBzeXNjdGxAIGh3LnZtbS52bXgubDFkX2ZsdXNo ID4vZGV2L251bGwgMj4mMTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAj Cj4gaHR0cHM6Ly9zZWN1cml0eS5GcmVlQlNELm9yZy9wYXRjaGVzL1NBLTE4OjA5L2wxdGYtMTEu Mi5wYXRjaAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIHRoaXMgaXMgdmVyeSBk aWZmaWN1bHQgdG8gZGV0ZWN0IHRoYXQgdGhlIGtlcm5lbAo+IHJlc2VydmVkIHRoZSAwIHBhZ2Us IGJ1dCB0aGlzIGZpeAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIGlzIHBhcnQg b2YgdGhlIGV4YWN0IHNhbWUgcGF0Y2ggdGhhbiB0aGUgb3RoZXIgTDFURgo+IENWRSwgc28gd2Ug ZGV0ZWN0IGl0Cj4gK0BAIC00OTIyLDcgKzQ5MjIsNyBAQCBjaGVja19DVkVfMjAxOF8zNjQ2KCkK PiArwqDCoMKgwqDCoMKgwqBfaW5mbyAiXDAzM1sxOzM0bSRjdmUgYWthICckKGN2ZTJuYW1lICIk Y3ZlIiknXDAzM1swbSIKPiArwqDCoMKgwqDCoMKgwqBpZiBbICIkb3MiID0gTGludXggXTsgdGhl bgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjaGVja19DVkVfMjAxOF8zNjQ2X2xp bnV4Cj4gKy3CoMKgwqDCoMKgwqBlbGlmIGVjaG8gIiRvcyIgfCBncmVwIC1xIEJTRDsgdGhlbgo+ ICsrwqDCoMKgwqDCoMKgZWxpZiBlY2hvICIkb3MiIHwgQGdyZXBAIC1xIEJTRDsgdGhlbgo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjaGVja19DVkVfMjAxOF8zNjQ2X2JzZAo+ICvC oMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX3dhcm4g IlVuc3VwcG9ydGVkIE9TICgkb3MpIgo+ICtAQCAtNDk0OCw3ICs0OTQ4LDcgQEAgY2hlY2tfQ1ZF XzIwMThfMzY0Nl9saW51eCgpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsg IiRvcHRfbGl2ZSIgPSAxIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGlmICEgWyAtcgo+IC9zeXMvbW9kdWxlL2t2bV9pbnRlbC9wYXJhbWV0 ZXJzL2VwdCBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyBibHVlIE4vQSAidGhlIGt2bV9pbnRlbAo+ IG1vZHVsZSBpcyBub3QgbG9hZGVkIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBlbGlmIFsgIiQoY2F0Cj4gL3N5cy9tb2R1bGUva3ZtX2ludGVsL3BhcmFt ZXRlcnMvZXB0KSIgPSBOIF07IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZWxpZiBbICIkKEBjYXRACj4gL3N5cy9tb2R1bGUva3ZtX2ludGVsL3Bh cmFtZXRlcnMvZXB0KSIgPSBOIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIGdyZWVuIFlFUwo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGVwdF9kaXNhYmxlZD0xCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBlbHNlCj4gK0BAIC00OTYwLDE1ICs0OTYwLDE1IEBAIGNoZWNrX0NWRV8yMDE4 XzM2NDZfbGludXgoKQo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2luZm8g IiogTWl0aWdhdGlvbiAyIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfaW5mb19u b2wgIsKgICogTDFEIGZsdXNoIGlzIHN1cHBvcnRlZCBieSBrZXJuZWw6ICIKPiArLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICIkb3B0X2xpdmUiID0gMSBdICYmIGdyZXAgLXF3IGZs dXNoX2wxZAo+ICIkcHJvY2ZzL2NwdWluZm8iOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgaWYgWyAiJG9wdF9saXZlIiA9IDEgXSAmJiBAZ3JlcEAgLXF3IGZsdXNoX2wxZAo+ ICIkcHJvY2ZzL2NwdWluZm8iOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBsMWRfa2VybmVsPSJmb3VuZCBmbHVzaF9sMWQgaW4KPiAkcHJvY2Zz L2NwdWluZm8iCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLXogIiRsMWRfa2VybmVsIiBdOyB0aGVuCj4gKy3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICEgY29tbWFuZCAt diAiJHtvcHRfYXJjaF9wcmVmaXh9c3RyaW5ncyIKPiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiAr K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgISBjb21tYW5k IC12ICJAc3RyaW5nc0AiID4vZGV2L251bGwgMj4mMTsKPiB0aGVuCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbDFkX2tlcm5l bF9lcnI9Im1pc3NpbmcKPiAnJHtvcHRfYXJjaF9wcmVmaXh9c3RyaW5ncycgdG9vbCwgcGxlYXNl IGluc3RhbGwgaXQsIHVzdWFsbHkgaXQncyBpbgo+IHRoZSBiaW51dGlscyBwYWNrYWdlIgo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiBbIC1uICIk a2VybmVsX2VyciIgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGwxZF9rZXJuZWxfZXJyPSIka2VybmVsX2VyciIK PiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiAiJHtv cHRfYXJjaF9wcmVmaXh9c3RyaW5ncyIgIiRrZXJuZWwiIHwKPiBncmVwIC1xdyBmbHVzaF9sMWQ7 IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxp ZiAiQHN0cmluZ3NAIiAiJGtlcm5lbCIgfCBAZ3JlcEAgLXF3Cj4gZmx1c2hfbDFkOyB0aGVuCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgbDFkX2tlcm5lbD0nZm91bmQgZmx1c2hfbDFkIGluIGtlcm5lbAo+IGltYWdlJwo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZmkKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZmkKPiArQEAgLTQ5ODksMjAgKzQ5ODksMjAgQEAgY2hl Y2tfQ1ZFXzIwMThfMzY0Nl9saW51eCgpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyAkbDFkc3RhdHVzIGlzIG9uZSBvZgo+ IChhdXRvfHZ1bG5lcmFibGV8Y29uZGl0aW9uYWwgY2FjaGUgZmx1c2hlc3xjYWNoZSBmbHVzaGVz fEVQVAo+IGRpc2FibGVkfGZsdXNoIG5vdCBuZWNlc3NhcnkpCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyAkc210c3RhdHVz IGlzIG9uZSBvZgo+ICh2dWxuZXJhYmxlfGRpc2FibGVkKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgY2FuIGFsc28ganVz dCBiZSAiTm90IGFmZmVjdGVkIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgZWNobyAiJGZ1bGxtc2ciIHwgZ3JlcCAtRXEg LWUgJ05vdAo+IGFmZmVjdGVkJyAtZSAnKFZNWDp8TDFEKSAoRVBUIGRpc2FibGVkfHZ1bG5lcmFi bGV8Zmx1c2ggbm90Cj4gbmVjZXNzYXJ5KSc7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGVjaG8gIiRmdWxsbXNn IiB8IEBncmVwQCAtRXEgLWUKPiAnTm90IGFmZmVjdGVkJyAtZSAnKFZNWDp8TDFEKSAoRVBUIGRp c2FibGVkfHZ1bG5lcmFibGV8Zmx1c2ggbm90Cj4gbmVjZXNzYXJ5KSc7IHRoZW4KPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgbDFkX21vZGU9MAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVz IHllbGxvdyBOTwo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgZWxpZiBlY2hvICIkZnVsbG1zZyIgfCBncmVwIC1FcQo+ICcoVk1Y OnxMMUQpIGNvbmRpdGlvbmFsIGNhY2hlIGZsdXNoZXMnOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIGVjaG8g IiRmdWxsbXNnIiB8IEBncmVwQCAtRXEKPiAnKFZNWDp8TDFEKSBjb25kaXRpb25hbCBjYWNoZSBm bHVzaGVzJzsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsMWRfbW9kZT0xCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgZ3JlZW4gWUVTCj4gImNvbmRpdGlvbmFsIGZsdXNoZXMi Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBlbGlmIGVjaG8gIiRmdWxsbXNnIiB8IGdyZXAgLUVxCj4gJyhWTVg6fEwxRCkgY2Fj aGUgZmx1c2hlcyc7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgZWNobyAiJGZ1bGxtc2ciIHwgQGdyZXBAIC1F cQo+ICcoVk1YOnxMMUQpIGNhY2hlIGZsdXNoZXMnOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGwxZF9tb2RlPTIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyBncmVlbiBZRVMK PiAidW5jb25kaXRpb25hbCBmbHVzaGVzIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgaWYgaXNfeGVuX2RvbTA7IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgbDFkX3hlbl9oYXJkd2FyZT0kKHhsCj4gZG1lc2cgfCBncmVwICdIYXJkd2FyZSBm ZWF0dXJlczonIHwgZ3JlcCAnTDFEX0ZMVVNIJyB8IGhlYWQgLTEpCj4gKy0KPiDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGwxZF94ZW5faHlwZXJ2aXNvcj0kKHhsCj4gZG1lc2cg fCBncmVwICdYZW4gc2V0dGluZ3M6JyB8IGdyZXAgJ0wxRF9GTFVTSCcgfCBoZWFkIC0xKQo+ICst wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsMWRfeGVuX3B2X2RvbVU9JCh4bAo+ IGRtZXNnIHwgZ3JlcCAnUFYgTDFURiBzaGFkb3dpbmc6JyB8IGdyZXAgJ0RvbVUgZW5hYmxlZCcg fCBoZWFkIC0xKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsMWRfeGVu X2hhcmR3YXJlPSQoeGwKPiBAZG1lc2dAIHwgQGdyZXBAICdIYXJkd2FyZSBmZWF0dXJlczonIHwg QGdyZXBAICdMMURfRkxVU0gnIHwgQGhlYWRAIC0KPiAxKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBsMWRfeGVuX2h5cGVydmlzb3I9JCgKPiB4bCBAZG1lc2dAIHwgQGdy ZXBAICdYZW4gc2V0dGluZ3M6JyB8IEBncmVwQCAnTDFEX0ZMVVNIJyB8IEBoZWFkQCAtMSkKPiAr K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbDFkX3hlbl9wdl9kb21VPSQoeGwK PiBAZG1lc2dAIHwgQGdyZXBAICdQViBMMVRGIHNoYWRvd2luZzonIHwgQGdyZXBAICdEb21VIGVu YWJsZWQnIHwKPiBAaGVhZEAgLTEpCj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgaWYgWyAtbgo+ICIkbDFkX3hlbl9oYXJkd2FyZSIgXSAmJiBbIC1uICIkbDFkX3hl bl9oeXBlcnZpc29yIiBdICYmIFsgLW4KPiAiJGwxZF94ZW5fcHZfZG9tVSIgXTsgdGhlbgo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGwxZF9t b2RlPTUKPiArQEAgLTUwMzMsNyArNTAzMyw3IEBAIGNoZWNrX0NWRV8yMDE4XzM2NDZfbGludXgo KQo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2luZm9fbm9sICLCoCAqIEhh cmR3YXJlLWJhY2tlZCBMMUQgZmx1c2ggc3VwcG9ydGVkOiAiCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGlmIFsgIiRvcHRfbGl2ZSIgPSAxIF07IHRoZW4KPiArLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgZ3JlcCAtcXcgZmx1c2hfbDFkICIk cHJvY2ZzL2NwdWluZm8iIHx8IFsKPiAtbiAiJGwxZF94ZW5faGFyZHdhcmUiIF07IHRoZW4KPiAr K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgQGdyZXBAIC1x dyBmbHVzaF9sMWQgIiRwcm9jZnMvY3B1aW5mbyIgfHwKPiBbIC1uICIkbDFkX3hlbl9oYXJkd2Fy ZSIgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgZ3JlZW4gWUVTICJwZXJmb3JtYW5jZSBpbXBhY3QK PiBvZiB0aGUgbWl0aWdhdGlvbiB3aWxsIGJlIGdyZWF0bHkgcmVkdWNlZCIKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVz IGJsdWUgTk8gImZsdXNoIHdpbGwgYmUgZG9uZQo+IGluIHNvZnR3YXJlLCB0aGlzIGlzIHNsb3dl ciIKPiArQEAgLTUxMDUsNyArNTEwNSw3IEBAIGNoZWNrX0NWRV8yMDE4XzM2NDZfbGludXgoKQo+ ICsgY2hlY2tfQ1ZFXzIwMThfMzY0Nl9ic2QoKQo+ICsgewo+ICvCoMKgwqDCoMKgwqDCoF9pbmZv X25vbCAiKiBLZXJuZWwgc3VwcG9ydHMgTDFEIGZsdXNoaW5nOiAiCj4gKy3CoMKgwqDCoMKgwqBp ZiBzeXNjdGwgaHcudm1tLnZteC5sMWRfZmx1c2ggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gKyvC oMKgwqDCoMKgwqBpZiBAc3lzY3RsQCBody52bW0udm14LmwxZF9mbHVzaCA+L2Rldi9udWxsIDI+ JjE7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyBncmVlbiBZ RVMKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKga2VybmVsX2wxZF9zdXBwb3J0ZWQ9 MQo+ICvCoMKgwqDCoMKgwqDCoGVsc2UKPiArQEAgLTUxMTQsNyArNTExNCw3IEBAIGNoZWNrX0NW RV8yMDE4XzM2NDZfYnNkKCkKPiArwqDCoMKgwqDCoMKgwqBmaQo+ICsKPiArwqDCoMKgwqDCoMKg wqBfaW5mb19ub2wgIiogTDFEIGZsdXNoaW5nIGlzIGVuYWJsZWQ6ICIKPiArLcKgwqDCoMKgwqDC oGtlcm5lbF9sMWRfZW5hYmxlZD0kKHN5c2N0bCAtbiBody52bW0udm14LmwxZF9mbHVzaAo+IDI+ L2Rldi9udWxsKQo+ICsrwqDCoMKgwqDCoMKga2VybmVsX2wxZF9lbmFibGVkPSQoQHN5c2N0bEAg LW4gaHcudm1tLnZteC5sMWRfZmx1c2gKPiAyPi9kZXYvbnVsbCkKPiArwqDCoMKgwqDCoMKgwqBj YXNlICIka2VybmVsX2wxZF9lbmFibGVkIiBpbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAwKSBwc3RhdHVzIHllbGxvdyBOTzs7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoDEpIHBzdGF0dXMgZ3JlZW4gWUVTOzsKPiArQEAgLTUxNjgsNyArNTE2OCw3IEBAIGNoZWNr X0NWRV8yMDE4XzEyMTI3KCkKPiArICMjIyMjIyMjIyMjIyMjIyMjIyMKPiArICMgTURTVU0gU0VD VElPTgo+ICsKPiArLSMgTWljcm9hcmNoaXRlY3R1cmFsIERhdGEgU2FtcGxpbmcgVW5jYWNoZWFi bGUgTWVtb3J5Cj4gKysjIE1pY3JvYXJjaGl0ZWN0dXJhbCBEYXRhIFNhbXBsaW5nIFVuY2FjaGVh YmxlIE1lbW9yeQo+ICsgY2hlY2tfQ1ZFXzIwMTlfMTEwOTEoKQo+ICsgewo+ICvCoMKgwqDCoMKg wqDCoGN2ZT0nQ1ZFLTIwMTktMTEwOTEnCj4gK0BAIC01MTgyLDcgKzUxODIsNyBAQCBjaGVja19t ZHMoKQo+ICvCoMKgwqDCoMKgwqDCoF9pbmZvICJcMDMzWzE7MzRtJGN2ZSBha2EgJyQoY3ZlMm5h bWUgIiRjdmUiKSdcMDMzWzBtIgo+ICvCoMKgwqDCoMKgwqDCoGlmIFsgIiRvcyIgPSBMaW51eCBd OyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNoZWNrX21kc19saW51eCAi JGN2ZSIKPiArLcKgwqDCoMKgwqDCoGVsaWYgZWNobyAiJG9zIiB8IGdyZXAgLXEgQlNEOyB0aGVu Cj4gKyvCoMKgwqDCoMKgwqBlbGlmIGVjaG8gIiRvcyIgfCBAZ3JlcEAgLXEgQlNEOyB0aGVuCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNoZWNrX21kc19ic2QgIiRjdmUiCj4gK8Kg wqDCoMKgwqDCoMKgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfd2FybiAi VW5zdXBwb3J0ZWQgT1MgKCRvcykiCj4gK0BAIC01MTkzLDcgKzUxOTMsNyBAQCBjaGVja19tZHNf YnNkKCkKPiArIHsKPiArwqDCoMKgwqDCoMKgwqBfaW5mb19ub2wgIiogS2VybmVsIHN1cHBvcnRz IHVzaW5nIE1EX0NMRUFSIG1pdGlnYXRpb246ICIKPiArwqDCoMKgwqDCoMKgwqBpZiBbICIkb3B0 X2xpdmUiID0gMSBdOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgc3lz Y3RsIGh3Lm1kc19kaXNhYmxlID4vZGV2L251bGwgMj4mMTsgdGhlbgo+ICsrwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGlmIEBzeXNjdGxAIGh3Lm1kc19kaXNhYmxlID4vZGV2L251bGwgMj4m MTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg cHN0YXR1cyBncmVlbiBZRVMKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGtlcm5lbF9tZF9jbGVhcj0xCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGVsc2UKPiArQEAgLTUyMDEsNyArNTIwMSw3IEBAIGNoZWNrX21kc19ic2QoKQo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKga2VybmVsX21kX2NsZWFy PTAKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZmkKPiArwqDCoMKgwqDCoMKgwqBl bHNlCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgZ3JlcCAtRnEgaHcubWRzX2Rp c2FibGUgJG9wdF9rZXJuZWw7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBp ZiBAZ3JlcEAgLUZxIGh3Lm1kc19kaXNhYmxlICRvcHRfa2VybmVsOyB0aGVuCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIGdyZWVuIFlFUwo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKga2VybmVsX21k X2NsZWFyPTEKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxzZQo+ICtAQCAtNTIx MSw4ICs1MjExLDggQEAgY2hlY2tfbWRzX2JzZCgpCj4gK8KgwqDCoMKgwqDCoMKgZmkKPiArCj4g K8KgwqDCoMKgwqDCoMKgX2luZm9fbm9sICIqIENQVSBIeXBlci1UaHJlYWRpbmcgKFNNVCkgaXMg ZGlzYWJsZWQ6ICIKPiArLcKgwqDCoMKgwqDCoGlmIHN5c2N0bCBtYWNoZGVwLmh5cGVydGhyZWFk aW5nX2FsbG93ZWQgPi9kZXYvbnVsbCAyPiYxOwo+IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBrZXJuZWxfc210X2FsbG93ZWQ9JChzeXNjdGwgLW4KPiBtYWNoZGVwLmh5cGVy dGhyZWFkaW5nX2FsbG93ZWQgMj4vZGV2L251bGwpCj4gKyvCoMKgwqDCoMKgwqBpZiBAc3lzY3Rs QCBtYWNoZGVwLmh5cGVydGhyZWFkaW5nX2FsbG93ZWQgPi9kZXYvbnVsbCAyPiYxOwo+IHRoZW4K PiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrZXJuZWxfc210X2FsbG93ZWQ9JChAc3lz Y3RsQCAtbgo+IG1hY2hkZXAuaHlwZXJ0aHJlYWRpbmdfYWxsb3dlZCAyPi9kZXYvbnVsbCkKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAiJGtlcm5lbF9zbXRfYWxsb3dlZCIg PSAxIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHBzdGF0dXMgeWVsbG93IE5PCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVs c2UKPiArQEAgLTUyMjQsNyArNTIyNCw3IEBAIGNoZWNrX21kc19ic2QoKQo+ICsKPiArwqDCoMKg wqDCoMKgwqBfaW5mb19ub2wgIiogS2VybmVsIG1pdGlnYXRpb24gaXMgZW5hYmxlZDogIgo+ICvC oMKgwqDCoMKgwqDCoGlmIFsgIiRrZXJuZWxfbWRfY2xlYXIiID0gMSBdOyB0aGVuCj4gKy3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKga2VybmVsX21kc19lbmFibGVkPSQoc3lzY3RsIC1uIGh3 Lm1kc19kaXNhYmxlCj4gMj4vZGV2L251bGwpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKga2VybmVsX21kc19lbmFibGVkPSQoQHN5c2N0bEAgLW4gaHcubWRzX2Rpc2FibGUKPiAyPi9k ZXYvbnVsbCkKPiArwqDCoMKgwqDCoMKgwqBlbHNlCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGtlcm5lbF9tZHNfZW5hYmxlZD0wCj4gK8KgwqDCoMKgwqDCoMKgZmkKPiArQEAgLTUy MzgsNyArNTIzOCw3IEBAIGNoZWNrX21kc19ic2QoKQo+ICsKPiArwqDCoMKgwqDCoMKgwqBfaW5m b19ub2wgIiogS2VybmVsIG1pdGlnYXRpb24gaXMgYWN0aXZlOiAiCj4gK8KgwqDCoMKgwqDCoMKg aWYgWyAiJGtlcm5lbF9tZF9jbGVhciIgPSAxIF07IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBrZXJuZWxfbWRzX3N0YXRlPSQoc3lzY3RsIC1uIGh3Lm1kc19kaXNhYmxlX3N0 YXRlCj4gMj4vZGV2L251bGwpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKga2VybmVs X21kc19zdGF0ZT0kKEBzeXNjdGxAIC1uIGh3Lm1kc19kaXNhYmxlX3N0YXRlCj4gMj4vZGV2L251 bGwpCj4gK8KgwqDCoMKgwqDCoMKgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBrZXJuZWxfbWRzX3N0YXRlPWluYWN0aXZlCj4gK8KgwqDCoMKgwqDCoMKgZmkKPiArQEAgLTUy OTYsMTYgKzUyOTYsMTYgQEAgY2hlY2tfbWRzX2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgX2luZm9fbm9sICIqIEtlcm5lbCBzdXBwb3J0cyB1c2luZyBNRF9DTEVBUgo+ IG1pdGlnYXRpb246ICIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKga2VybmVsX21k X2NsZWFyPScnCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF9tZF9jbGVh cl9jYW5fdGVsbD0xCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAiJG9wdF9s aXZlIiA9IDEgXSAmJiBncmVwIF5mbGFncwo+ICIkcHJvY2ZzL2NwdWluZm8iIHwgZ3JlcCAtcXcg bWRfY2xlYXI7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICIkb3B0 X2xpdmUiID0gMSBdICYmIEBncmVwQCBeZmxhZ3MKPiAiJHByb2Nmcy9jcHVpbmZvIiB8IEBncmVw QCAtcXcgbWRfY2xlYXI7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGtlcm5lbF9tZF9jbGVhcj0ibWRfY2xlYXIgZm91bmQgaW4KPiAkcHJvY2Zz L2NwdWluZm8iCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBwc3RhdHVzIGdyZWVuIFlFUyAiJGtlcm5lbF9tZF9jbGVhciIKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZmkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAt eiAiJGtlcm5lbF9tZF9jbGVhciIgXTsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAhIGNvbW1hbmQgLXYgIiR7b3B0X2FyY2hfcHJlZml4fXN0 cmluZ3MiCj4gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICEgY29tbWFuZCAtdiAiQHN0cmluZ3NAIiA+L2Rldi9u dWxsIDI+JjE7Cj4gdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF9tZF9jbGVhcl9jYW5fdGVsbD0wCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIFsgLW4gIiRr ZXJuZWxfZXJyIiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKga2VybmVsX21kX2NsZWFyX2Nhbl90ZWxsPTAKPiAr LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiAiJHtvcHRf YXJjaF9wcmVmaXh9c3RyaW5ncyIgIiRrZXJuZWwiIHwKPiBncmVwIC1xICdDbGVhciBDUFUgYnVm ZmVycyc7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgZWxpZiAiQHN0cmluZ3NAIiAiJGtlcm5lbCIgfCBAZ3JlcEAgLXEgJ0NsZWFyCj4gQ1BVIGJ1 ZmZlcnMnOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgX2RlYnVnICJtZF9jbGVhcjogZm91bmQgJ0NsZWFyIENQVQo+ IGJ1ZmZlcnMnIHN0cmluZyBpbiBrZXJuZWwgaW1hZ2UiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKga2VybmVsX21kX2NsZWFy PSdmb3VuZCBtZF9jbGVhcgo+IGltcGxlbWVudGF0aW9uIGV2aWRlbmNlIGluIGtlcm5lbCBpbWFn ZScKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBwc3RhdHVzIGdyZWVuIFlFUyAiJGtlcm5lbF9tZF9jbGVhciIKPiArQEAgLTUz MjEsNyArNTMyMSw3IEBAIGNoZWNrX21kc19saW51eCgpCj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBpZiBbICIkb3B0X2xpdmUiID0gMSBdICYmIFsKPiAiJHN5c19pbnRlcmZh Y2VfYXZhaWxhYmxlIiA9IDEgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgX2luZm9fbm9sICIqIEtlcm5lbCBtaXRpZ2F0aW9uIGlzIGVuYWJs ZWQgYW5kCj4gYWN0aXZlOiAiCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGlmIGVjaG8gIiRmdWxsbXNnIiB8IGdyZXAgLXFpIF5taXRpZ2F0aW9uOwo+IHRo ZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgZWNo byAiJGZ1bGxtc2ciIHwgQGdyZXBAIC1xaSBebWl0aWdhdGlvbjsKPiB0aGVuCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbWRz X21pdGlnYXRlZD0xCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyBncmVlbiBZRVMKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArQEAgLTUzMjksNyArNTMyOSw3 IEBAIGNoZWNrX21kc19saW51eCgpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyB5ZWxsb3cgTk8KPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfaW5mb19ub2wgIiogU01UIGlzIGVp dGhlciBtaXRpZ2F0ZWQgb3IKPiBkaXNhYmxlZDogIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBlY2hvICIkZnVsbG1zZyIgfCBncmVwIC1FcSAnU01U Cj4gKGRpc2FibGVkfG1pdGlnYXRlZCknOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGVjaG8gIiRmdWxsbXNnIiB8IEBncmVwQCAtRXEgJ1NN VAo+IChkaXNhYmxlZHxtaXRpZ2F0ZWQpJzsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1kc19zbXRfbWl0aWdhdGVk PTEKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBwc3RhdHVzIGdyZWVuIFlFUwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxzZQo+ICtAQCAtNTQxNSw3ICs1NDE1LDcgQEAgY2hlY2tf Q1ZFXzIwMTlfMTExMzUoKQo+ICvCoMKgwqDCoMKgwqDCoF9pbmZvICJcMDMzWzE7MzRtJGN2ZSBh a2EgJyQoY3ZlMm5hbWUgIiRjdmUiKSdcMDMzWzBtIgo+ICvCoMKgwqDCoMKgwqDCoGlmIFsgIiRv cyIgPSBMaW51eCBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNoZWNr X0NWRV8yMDE5XzExMTM1X2xpbnV4Cj4gKy3CoMKgwqDCoMKgwqBlbGlmIGVjaG8gIiRvcyIgfCBn cmVwIC1xIEJTRDsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgZWxpZiBlY2hvICIkb3MiIHwgQGdyZXBA IC1xIEJTRDsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjaGVja19DVkVf MjAxOV8xMTEzNV9ic2QKPiArwqDCoMKgwqDCoMKgwqBlbHNlCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoF93YXJuICJVbnN1cHBvcnRlZCBPUyAoJG9zKSIKPiArQEAgLTU0MzYsNyAr NTQzNiw3IEBAIGNoZWNrX0NWRV8yMDE5XzExMTM1X2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKga2VybmVsX3RhYT0nJwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBpZiBbIC1uICIka2VybmVsX2VyciIgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKga2VybmVsX3RhYV9lcnI9IiRrZXJuZWxfZXJyIgo+ ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgZ3JlcCAtcSAndHN4X2FzeW5jX2Fi b3J0JyAiJGtlcm5lbCI7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlm IEBncmVwQCAtcSAndHN4X2FzeW5jX2Fib3J0JyAiJGtlcm5lbCI7IHRoZW4KPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF90YWE9ImZvdW5kIHRz eF9hc3luY19hYm9ydCBpbiBrZXJuZWwKPiBpbWFnZSIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgZmkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAtbiAiJGtl cm5lbF90YWEiIF07IHRoZW4KPiArQEAgLTU0NTAsNyArNTQ1MCw3IEBAIGNoZWNrX0NWRV8yMDE5 XzExMTM1X2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2luZm9fbm9s ICIqIFRBQSBtaXRpZ2F0aW9uIGVuYWJsZWQgYW5kIGFjdGl2ZTogIgo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBpZiBbICIkb3B0X2xpdmUiID0gMSBdOyB0aGVuCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbIC1uICIkZnVsbG1zZyIg XTsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgaWYgZWNobyAiJGZ1bGxtc2ciIHwgZ3JlcCAtcUUKPiAnXk1pdGlnYXRp b24nOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBpZiBlY2hvICIkZnVsbG1zZyIgfCBAZ3JlcEAgLXFFCj4gJ15NaXRp Z2F0aW9uJzsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIGdyZWVuIFlFUyAi JGZ1bGxtc2ciCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIHll bGxvdyBOTwo+ICtAQCAtNTQ4NSw5ICs1NDg1LDkgQEAgY2hlY2tfQ1ZFXzIwMTlfMTExMzVfbGlu dXgoKQo+ICvCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaWYgWyAiJG9wdF9wYXJhbm9pZCIgPSAxIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgaW4gcGFyYW5vaWQgbW9kZSwgVFNYIG9yIFNN VCBlbmFibGVkIGFyZQo+IG5vdCBPSywgZXZlbiBpZiBUQUEgaXMgbWl0aWdhdGVkCj4gKy3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICEgZWNobyAiJGZ1bGxt c2ciIHwgZ3JlcCAtcUYgJ1RTWAo+IGRpc2FibGVkJzsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAhIGVjaG8gIiRmdWxsbXNnIiB8IEBncmVw QCAtcUYgJ1RTWAo+IGRpc2FibGVkJzsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHB2dWxuc3RhdHVzICRjdmUgVlVM TiAiVFNYIG11c3QgYmUKPiBkaXNhYmxlZCBmb3IgZnVsbCBtaXRpZ2F0aW9uIgo+ICstwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIGVjaG8gIiRmdWxsbXNn IiB8IGdyZXAgLXFGICdTTVQKPiB2dWxuZXJhYmxlJzsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIGVjaG8gIiRmdWxsbXNnIiB8IEBncmVw QCAtcUYgJ1NNVAo+IHZ1bG5lcmFibGUnOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHZ1bG5zdGF0dXMgJGN2ZSBW VUxOICJTTVQKPiAoSHlwZXJUaHJlYWRpbmcpIG11c3QgYmUgZGlzYWJsZWQgZm9yIGZ1bGwgbWl0 aWdhdGlvbiIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBwdnVsbnN0YXR1cyAkY3ZlICIkc3RhdHVzIiAiJG1zZyIKPiArQEAgLTU1 MTcsNyArNTUxNyw3IEBAIGNoZWNrX0NWRV8yMDE4XzEyMjA3KCkKPiArwqDCoMKgwqDCoMKgwqBf aW5mbyAiXDAzM1sxOzM0bSRjdmUgYWthICckKGN2ZTJuYW1lICIkY3ZlIiknXDAzM1swbSIKPiAr wqDCoMKgwqDCoMKgwqBpZiBbICIkb3MiID0gTGludXggXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBjaGVja19DVkVfMjAxOF8xMjIwN19saW51eAo+ICstwqDCoMKgwqDC oMKgZWxpZiBlY2hvICIkb3MiIHwgZ3JlcCAtcSBCU0Q7IHRoZW4KPiArK8KgwqDCoMKgwqDCoGVs aWYgZWNobyAiJG9zIiB8IEBncmVwQCAtcSBCU0Q7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgY2hlY2tfQ1ZFXzIwMThfMTIyMDdfYnNkCj4gK8KgwqDCoMKgwqDCoMKgZWxz ZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfd2FybiAiVW5zdXBwb3J0ZWQgT1Mg KCRvcykiCj4gK0BAIC01NTQxLDcgKzU1NDEsNyBAQCBjaGVja19DVkVfMjAxOF8xMjIwN19saW51 eCgpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLW4gIiRrZXJuZWxfZXJy IiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBrZXJuZWxfaXRsYm1oX2Vycj0iJGtlcm5lbF9lcnIiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCMgY29tbWl0IDUyMTk1MDVmY2JiNjQwZTI3M2EwZDUxYzE5YzM4ZGUwMTAwZWM1 YTkKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIGdyZXAgLXEgJ2l0bGJfbXVs dGloaXQnICIka2VybmVsIjsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVs aWYgQGdyZXBAIC1xICdpdGxiX211bHRpaGl0JyAiJGtlcm5lbCI7IHRoZW4KPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF9pdGxibWg9ImZvdW5k IGl0bGJfbXVsdGloaXQgaW4ga2VybmVsCj4gaW1hZ2UiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLW4gIiRr ZXJuZWxfaXRsYm1oIiBdOyB0aGVuCj4gK0BAIC01NTU1LDcgKzU1NTUsNyBAQCBjaGVja19DVkVf MjAxOF8xMjIwN19saW51eCgpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9pbmZv X25vbCAiKiBpVExCIE11bHRpaGl0IG1pdGlnYXRpb24gZW5hYmxlZCBhbmQKPiBhY3RpdmU6ICIK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAiJG9wdF9saXZlIiA9IDEgXTsg dGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYg WyAtbiAiJGZ1bGxtc2ciIF07IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGVjaG8gIiRmdWxsbXNnIiB8IGdyZXAg LXFGCj4gJ01pdGlnYXRpb24nOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBlY2hvICIkZnVsbG1zZyIgfCBAZ3Jl cEAgLXFGCj4gJ01pdGlnYXRpb24nOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0 dXMgZ3JlZW4gWUVTICIkZnVsbG1zZyIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbHNlCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHBzdGF0dXMgeWVsbG93IE5PCj4gK0BAIC01NTk3LDcgKzU1OTcsNyBAQCBjaGVja19DVkVf MjAxOF8xMjIwN19saW51eCgpCj4gKyBjaGVja19DVkVfMjAxOF8xMjIwN19ic2QoKQo+ICsgewo+ ICvCoMKgwqDCoMKgwqDCoF9pbmZvX25vbCAiKiBLZXJuZWwgc3VwcG9ydHMgZGlzYWJsaW5nIHN1 cGVycGFnZXMgZm9yCj4gZXhlY3V0YWJsZSBtYXBwaW5ncyB1bmRlciBFUFQ6ICIKPiArLcKgwqDC oMKgwqDCoGtlcm5lbF8ybV94X2VwdD0kKHN5c2N0bCAtbiB2bS5wbWFwLmFsbG93XzJtX3hfZXB0 Cj4gMj4vZGV2L251bGwpCj4gKyvCoMKgwqDCoMKgwqBrZXJuZWxfMm1feF9lcHQ9JChAc3lzY3Rs QCAtbiB2bS5wbWFwLmFsbG93XzJtX3hfZXB0Cj4gMj4vZGV2L251bGwpCj4gK8KgwqDCoMKgwqDC oMKgaWYgWyAteiAiJGtlcm5lbF8ybV94X2VwdCIgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBwc3RhdHVzIHllbGxvdyBOTwo+ICvCoMKgwqDCoMKgwqDCoGVsc2UKPiAr QEAgLTU2MzQsNyArNTYzNCw3IEBAIGNoZWNrX0NWRV8yMDIwXzA1NDMoKQo+ICvCoMKgwqDCoMKg wqDCoF9pbmZvICJcMDMzWzE7MzRtJGN2ZSBha2EgJyQoY3ZlMm5hbWUgIiRjdmUiKSdcMDMzWzBt Igo+ICvCoMKgwqDCoMKgwqDCoGlmIFsgIiRvcyIgPSBMaW51eCBdOyB0aGVuCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNoZWNrX0NWRV8yMDIwXzA1NDNfbGludXgKPiArLcKgwqDC oMKgwqDCoGVsaWYgZWNobyAiJG9zIiB8IGdyZXAgLXEgQlNEOyB0aGVuCj4gKyvCoMKgwqDCoMKg wqBlbGlmIGVjaG8gIiRvcyIgfCBAZ3JlcEAgLXEgQlNEOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGNoZWNrX0NWRV8yMDIwXzA1NDNfYnNkCj4gK8KgwqDCoMKgwqDCoMKg ZWxzZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfd2FybiAiVW5zdXBwb3J0ZWQg T1MgKCRvcykiCj4gK0BAIC01NjU1LDcgKzU2NTUsNyBAQCBjaGVja19DVkVfMjAyMF8wNTQzX2xp bnV4KCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKga2VybmVsX3NyYmRzPScnCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLW4gIiRrZXJuZWxfZXJyIiBdOyB0 aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrZXJu ZWxfc3JiZHNfZXJyPSIka2VybmVsX2VyciIKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBlbGlmIGdyZXAgLXEgJ0RlcGVuZGVudCBvbiBoeXBlcnZpc29yJyAiJGtlcm5lbCI7Cj4gdGhl bgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgQGdyZXBAIC1xICdEZXBlbmRl bnQgb24gaHlwZXJ2aXNvcicgIiRrZXJuZWwiOwo+IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF9zcmJkcz0iZm91bmQgU1JCRFMgaW1w bGVtZW50YXRpb24KPiBldmlkZW5jZSBpbiBrZXJuZWwgaW1hZ2UuIFlvdXIga2VybmVsIGlzIHVw IHRvIGRhdGUgZm9yIFNSQkRTCj4gbWl0aWdhdGlvbiIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgZmkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAtbiAiJGtl cm5lbF9zcmJkcyIgXTsgdGhlbgo+ICtAQCAtNTY2OCw3ICs1NjY4LDcgQEAgY2hlY2tfQ1ZFXzIw MjBfMDU0M19saW51eCgpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9pbmZvX25v bCAiKiBTUkJEUyBtaXRpZ2F0aW9uIGNvbnRyb2wgaXMgZW5hYmxlZCBhbmQKPiBhY3RpdmU6ICIK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAiJG9wdF9saXZlIiA9IDEgXTsg dGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYg WyAtbiAiJGZ1bGxtc2ciIF07IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGVjaG8gIiRmdWxsbXNnIiB8IGdyZXAg LXFFCj4gJ15NaXRpZ2F0aW9uJzsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgZWNobyAiJGZ1bGxtc2ciIHwgQGdy ZXBAIC1xRQo+ICdeTWl0aWdhdGlvbic7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0 YXR1cyBncmVlbiBZRVMgIiRmdWxsbXNnIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgcHN0YXR1cyB5ZWxsb3cgTk8KPiArQEAgLTU3NTgsOCArNTc1OCw4IEBAIGZpCj4gKyAj IG5vdyBydW4gdGhlIGNoZWNrcyB0aGUgdXNlciBhc2tlZCBmb3IKPiArIGZvciBjdmUgaW4gJHN1 cHBvcnRlZF9jdmVfbGlzdAo+ICsgZG8KPiArLcKgwqDCoMKgwqDCoGlmIFsgIiRvcHRfY3ZlX2Fs bCIgPSAxIF0gfHwgZWNobyAiJG9wdF9jdmVfbGlzdCIgfCBncmVwIC1xdwo+ICIkY3ZlIjsgdGhl bgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNoZWNrXyIkKGVjaG8gIiRjdmUiIHwg dHIgLSBfKSIKPiArK8KgwqDCoMKgwqDCoGlmIFsgIiRvcHRfY3ZlX2FsbCIgPSAxIF0gfHwgZWNo byAiJG9wdF9jdmVfbGlzdCIgfCBAZ3JlcEAgLQo+IHF3ICIkY3ZlIjsgdGhlbgo+ICsrwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNoZWNrXyIkKGVjaG8gIiRjdmUiIHwgQHRyQCAtIF8pIgo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfaW5mbwo+ICvCoMKgwqDCoMKgwqDCoGZp Cj4gKyBkb25lCj4gK0BAIC01NzczLDE3ICs1NzczLDE3IEBAIGlmIFsgIiRiYWRfYWNjdXJhY3ki ID0gMSBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgX3dhcm4gIldlJ3JlIG1pc3Npbmcgc29tZSBr ZXJuZWwgaW5mbyAoc2VlIC12KSwgYWNjdXJhY3kKPiBtaWdodCBiZSByZWR1Y2VkIgo+ICsgZmkK PiArCj4gKy1fdmFycz0kKHNldCB8IGdyZXAgLUV2ICdeW0EtWl9bOnNwYWNlOl1dJyB8IGdyZXAg LXYgLUYgJ21vY2ttZT0nIHwKPiBzb3J0IHwgdHIgIlxuIiAnfCcpCj4gKytfdmFycz0kKHNldCB8 IEBncmVwQCAtRXYgJ15bQS1aX1s6c3BhY2U6XV0nIHwgQGdyZXBAIC12IC1GCj4gJ21vY2ttZT0n IHwgQHNvcnRAIHwgQHRyQCAiXG4iICd8JykKPiArIF9kZWJ1ZyAidmFyaWFibGVzIGF0IGVuZCBv ZiBzY3JpcHQ6ICRfdmFycyIKPiArCj4gKyBpZiBbIC1uICIkbW9ja21lIiBdICYmIFsgIiRvcHRf bW9jayIgPSAxIF07IHRoZW4KPiArLcKgwqDCoMKgwqDCoGlmIGNvbW1hbmQgLXYgImd6aXAiID4v ZGV2L251bGwgMj4mMTsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgaWYgY29tbWFuZCAtdiAiQGd6aXBA IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IyBub3QgYSB1c2VsZXNzIHVzZSBvZiBjYXQ6IGd6aXBwaW5nIGNwdWluZm8gZGlyZWN0bHkKPiBk b2Vzbid0IHdvcmsgd2VsbAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIHNoZWxs Y2hlY2sgZGlzYWJsZT1TQzIwMDIKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBj b21tYW5kIC12ICJiYXNlNjQiID4vZGV2L251bGwgMj4mMTsgdGhlbgo+ICstwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBtb2NrX2NwdWluZm89IiQoY2F0IC9wcm9j L2NwdWluZm8gfCBnemlwIC1jIHwKPiBiYXNlNjQgLXcwKSIKPiArLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBlbGlmIGNvbW1hbmQgLXYgInV1ZW5jb2RlIiA+L2Rldi9udWxsIDI+JjE7IHRo ZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbW9ja19j cHVpbmZvPSIkKGNhdCAvcHJvYy9jcHVpbmZvIHwgZ3ppcCAtYyB8Cj4gdXVlbmNvZGUgLW0gLSB8 IGdyZXAgLUZ2ICdiZWdpbi1iYXNlNjQnIHwgZ3JlcCAtRnh2IC0tICc9PT09JyB8IHRyIC1kCj4g IlxuIikiCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgY29tbWFuZCAtdiAiQGJh c2U2NEAiID4vZGV2L251bGwgMj4mMTsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBtb2NrX2NwdWluZm89IiQoQGNhdEAgL3Byb2MvY3B1aW5mbyB8 IEBnemlwQAo+IC1jIHwgQGJhc2U2NEAgLXcwKSIKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBlbGlmIGNvbW1hbmQgLXYgIkB1dWVuY29kZUAiID4vZGV2L251bGwgMj4mMTsgdGhlbgo+ ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBtb2NrX2NwdWlu Zm89IiQoQGNhdEAgL3Byb2MvY3B1aW5mbyB8IEBnemlwQAo+IC1jIHwgQHV1ZW5jb2RlQCAtbSAt IHwgQGdyZXBAIC1GdiAnYmVnaW4tYmFzZTY0JyB8IEBncmVwQCAtRnh2IC0tCj4gJz09PT0nIHwg QHRyQCAtZCAiXG4iKSIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZmkKPiArwqDC oMKgwqDCoMKgwqBmaQo+ICvCoMKgwqDCoMKgwqDCoGlmIFsgLW4gIiRtb2NrX2NwdWluZm8iIF07 IHRoZW4KPiArQEAgLTU3OTIsNyArNTc5Miw3IEBAIGlmIFsgLW4gIiRtb2NrbWUiIF0gJiYgWyAi JG9wdF9tb2NrIiA9IDEgXTsKPiB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgZmkKPiArwqDCoMKgwqDC oMKgwqBfaW5mbyAiIgo+ICvCoMKgwqDCoMKgwqDCoCMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjA0 Ngo+ICstwqDCoMKgwqDCoMKgX3dhcm4gIlRvIG1vY2sgdGhpcyBDUFUsIHNldCB0aG9zZSB2YXJz OiAiJChlY2hvICIkbW9ja21lIiB8Cj4gc29ydCAtdSkKPiArK8KgwqDCoMKgwqDCoF93YXJuICJU byBtb2NrIHRoaXMgQ1BVLCBzZXQgdGhvc2UgdmFyczogIiQoZWNobyAiJG1vY2ttZSIgfAo+IEBz b3J0QCAtdSkKPiArIGZpCj4gKwo+ICsgaWYgWyAiJG9wdF9leHBsYWluIiA9IDAgXTsgdGhlbgo+ ICstLQo+ICsyLjM4LjEKPiArCj4gZGlmZiAtLWdpdCBhL2dudS9wYWNrYWdlcy9wYXRjaGVzL3Nw ZWN0cmUtbWVsdGRvd24tY2hlY2tlci1zdXBwb3J0LQo+IGd1aXgtc3lzdGVtLWtlcm5lbC5wYXRj aCBiL2dudS9wYWNrYWdlcy9wYXRjaGVzL3NwZWN0cmUtbWVsdGRvd24tCj4gY2hlY2tlci1zdXBw b3J0LWd1aXgtc3lzdGVtLWtlcm5lbC5wYXRjaAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5k ZXggMDAwMDAwMDAwMC4uYWZlYzUyYjQxOAo+IC0tLSAvZGV2L251bGwKPiArKysgYi9nbnUvcGFj a2FnZXMvcGF0Y2hlcy9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXItc3VwcG9ydC1ndWl4LQo+IHN5 c3RlbS1rZXJuZWwucGF0Y2gKPiBAQCAtMCwwICsxLDI2IEBACj4gK0Zyb20gNWI3NTdkOTMwZWMw Y2YxMDJiMDNmYjk4MTdkMTdlMDZjNzJlNzRiMyBNb24gU2VwIDE3IDAwOjAwOjAwCj4gMjAwMQo+ ICtGcm9tOiBIaWx0b24gQ2hhaW4gPGhha29AdWx0cmFyYXJlLnNwYWNlPgo+ICtEYXRlOiBTYXQs IDUgTm92IDIwMjIgMjM6MjI6MzEgKzA4MDAKPiArU3ViamVjdDogW1BBVENIXSBBZGQgc3VwcG9y dCBmb3IgR3VpeCBTeXN0ZW0ga2VybmVsLgo+ICsKPiArLS0tCj4gKyBzcGVjdHJlLW1lbHRkb3du LWNoZWNrZXIuc2ggfCAyICsrCj4gKyAxIGZpbGUgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspCj4g Kwo+ICtkaWZmIC0tZ2l0IGEvc3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyLnNoIGIvc3BlY3RyZS1t ZWx0ZG93bi0KPiBjaGVja2VyLnNoCj4gK2luZGV4IDI0OGE0NDQuLjg1NWEwOTAgMTAwNzU1Cj4g Ky0tLSBhL3NwZWN0cmUtbWVsdGRvd24tY2hlY2tlci5zaAo+ICsrKysgYi9zcGVjdHJlLW1lbHRk b3duLWNoZWNrZXIuc2gKPiArQEAgLTIyNTEsNiArMjI1MSw4IEBAIGlmIFsgIiRvcHRfbGl2ZSIg PSAxIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgWyAtZSAiL2Jvb3Qv a2VybmVsLWdlbmtlcm5lbC0kKHVuYW1lIC1tKS0kKHVuYW1lIC1yKSIKPiBdICYmIG9wdF9rZXJu ZWw9Ii9ib290L2tlcm5lbC1nZW5rZXJuZWwtJCh1bmFtZSAtbSktJCh1bmFtZSAtcikiCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgTml4T1M6Cj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoFsgLWUgIi9ydW4vYm9vdGVkLXN5c3RlbS9rZXJuZWwiIF0gJiYKPiBvcHRf a2VybmVsPSIvcnVuL2Jvb3RlZC1zeXN0ZW0va2VybmVsIgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCMgR3VpeCBTeXN0ZW06Cj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg WyAtZSAiL3J1bi9ib290ZWQtc3lzdGVtL2tlcm5lbC9iekltYWdlIiBdICYmCj4gb3B0X2tlcm5l bD0iL3J1bi9ib290ZWQtc3lzdGVtL2tlcm5lbC9iekltYWdlIgo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAjIHN5c3RlbWQga2VybmVsLWluc3RhbGw6Cj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoFsgLWUgIi9ldGMvbWFjaGluZS1pZCIgXSAmJiBbIC1lICIvYm9vdC8k KGNhdAo+IC9ldGMvbWFjaGluZS1pZCkvJCh1bmFtZSAtcikvbGludXgiIF0gJiYgb3B0X2tlcm5l bD0iL2Jvb3QvJChjYXQKPiAvZXRjL21hY2hpbmUtaWQpLyQodW5hbWUgLXIpL2xpbnV4Igo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIENsZWFyIExpbnV4Ogo+ICsKPiArYmFzZS1j b21taXQ6IGE2Yzk0M2QzOGYzMTVmMzM5Njk3ZWMyNmU3Mzc0YTA5Yjg4ZjIxODMKPiArLS0KPiAr Mi4zOC4wCj4gCj4gYmFzZS1jb21taXQ6IDcwZGY1YzQ3YTg5ZjRmMzUzYTFkZjk0NDY3NTgxYTBm MGRhNTk5YTQKPiAtLQo+IDIuMzguMQpIYXZlbid0IGxvb2tlZCBhdCBhbGwgdGhlIG90aGVyIHN1 YnN0aXR1dGVkIGNvbW1hbmRzLCBidXQgb3RoZXJ3aXNlCnNlZW1zIGdvb2QgdG8gbWUuCgpDaGVl cnMK From unknown Sun Jun 22 11:49:37 2025 X-Loop: help-debbugs@gnu.org Subject: [bug#59053] [PATCH v3] gnu: Add spectre-meltdown-checker. Resent-From: Hilton Chain Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Sat, 12 Nov 2022 12:16:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 59053 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: moreinfo patch To: Liliana Marie Prikler Cc: 59053@debbugs.gnu.org Received: via spool by 59053-submit@debbugs.gnu.org id=B59053.166825531715237 (code B ref 59053); Sat, 12 Nov 2022 12:16:02 +0000 Received: (at 59053) by debbugs.gnu.org; 12 Nov 2022 12:15:17 +0000 Received: from localhost ([127.0.0.1]:47448 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1otpPp-0003xh-1m for submit@debbugs.gnu.org; Sat, 12 Nov 2022 07:15:17 -0500 Received: from mail.boiledscript.com ([144.168.59.46]:57572) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1otpPo-0003xP-3u for 59053@debbugs.gnu.org; Sat, 12 Nov 2022 07:15:16 -0500 Date: Sat, 12 Nov 2022 20:14:28 +0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ultrarare.space; s=dkim; t=1668255306; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=DAVUZF7mX7sKxR4eeejm/OzTavEBSYYh7l2P7S8E+Fk=; b=kCVVai2sdXhxdqer2RUVWK1voL+1YCv7JOZDRTtLolRgJiPkvAfncnRPJE0Hd/zc5z+ce4 RCUUrv9D8RVaA7QtZkAsp7VUDFhXZgNzmgyn6JA8kuXOC0fDLSuNU2I7eKeHPWFV8WVAVW FNxlHxfPwD/Y+ux3YBDE1MrRfMIzBfgkshGLKGyekSF54kckGMX47vn3iuFQ9rILEeh6c5 oPWqtq23LKUwJZgtPk//jirMtD+ngmHUGpkaalYHISDwFFTXEHeiTEnSYsl+Feej2qSBLy txb1hfzdwjcvG4TkHVzvl+GWfeLUirLQiVbhPYjvl0Cku1hAw+2+5ObV7kh69A== Message-ID: From: Hilton Chain In-Reply-To: <62dbdc4784403cc138909884b50a399485a2451f.camel@gmail.com> References: <62dbdc4784403cc138909884b50a399485a2451f.camel@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 8bit X-Spamd-Bar: / Authentication-Results: mail.boiledscript.com; auth=pass smtp.mailfrom=hako@ultrarare.space X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" * gnu/packages/linux.scm (spectre-meltdown-checker): New variable. * gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch: New file. * gnu/packages/patches/spectre-meltdown-checker-stage-commands-for-substitution.patch: New file. * gnu/packages/patches/spectre-meltdown-checker-remove-builtin-firmware-database.patch: New file. * gnu/local.mk (dist_patch_DATA): Add patches. --- v2 -> v3: 1. Use curl as default downloader (It seems that wget doesn't work out of the box for TLS?). 2. Remove instead of commenting. 3. Remove builtin firmware database via a snippet. 4. Adjust position of the "return 2" statement. For the purpose, it's there to stop the version checking function, as later steps assumes a valid firmware database. For the very value, it's that return value of is_latest_known_ucode() other than 0 or 1, is considered "unknown" in the final output. gnu/local.mk | 3 + gnu/packages/linux.scm | 58 + ...ker-remove-builtin-firmware-database.patch | 113 + ...cker-stage-commands-for-substitution.patch | 1947 +++++++++++++++++ ...n-checker-support-guix-system-kernel.patch | 26 + 5 files changed, 2147 insertions(+) create mode 100644 gnu/packages/patches/spectre-meltdown-checker-remove-builtin-firmware-database.patch create mode 100644 gnu/packages/patches/spectre-meltdown-checker-stage-commands-for-substitution.patch create mode 100644 gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch diff --git a/gnu/local.mk b/gnu/local.mk index e3e02314bb..46b299d0d6 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -1857,6 +1857,9 @@ dist_patch_DATA = \ %D%/packages/patches/syslinux-strip-gnu-property.patch \ %D%/packages/patches/snappy-add-O2-flag-in-CmakeLists.txt.patch \ %D%/packages/patches/snappy-add-inline-for-GCC.patch \ + %D%/packages/patches/spectre-meltdown-checker-remove-builtin-firmware-database.patch \ + %D%/packages/patches/spectre-meltdown-checker-stage-commands-for-substitution.patch \ + %D%/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch \ %D%/packages/patches/sphinxbase-fix-doxygen.patch \ %D%/packages/patches/spice-vdagent-glib-2.68.patch \ %D%/packages/patches/sssd-optional-systemd.patch \ diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index fea33dfa0b..b15899baf6 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -9595,3 +9595,61 @@ (define-public edac-utils error detection and correction (EDAC).") (home-page "https://github.com/grondo/edac-utils") (license license:gpl2+))) + +(define-public spectre-meltdown-checker + (package + (name "spectre-meltdown-checker") + (version "0.45") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/speed47/spectre-meltdown-checker") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (patches + (search-patches + ;; https://github.com/speed47/spectre-meltdown-checker/pull/441 + "spectre-meltdown-checker-support-guix-system-kernel.patch" + ;; NOTE: Update these patches when updating. + "spectre-meltdown-checker-stage-commands-for-substitution.patch" + "spectre-meltdown-checker-remove-builtin-firmware-database.patch")) + ;; Remove builtin firmware database. + (modules '((guix build utils))) + (snippet '(substitute* "spectre-meltdown-checker.sh" + (("^# [AI],.*") ""))) + (sha256 + (base32 + "1xx8h5791lhc2xw0dcbzjkklzvlxwxkjzh8di4g8divfy24fqsn8")))) + (build-system copy-build-system) + (arguments + (list #:install-plan + #~'(("spectre-meltdown-checker.sh" "bin/spectre-meltdown-checker")) + #:phases + #~(modify-phases %standard-phases + (add-after 'unpack 'fixpath + (lambda* (#:key inputs #:allow-other-keys) + (substitute* "spectre-meltdown-checker.sh" + (("@sysctl@") (search-input-file inputs "/sbin/sysctl")) + (("@([a-z0-9]*)@" _ command _) + (search-input-file + inputs (string-append "/bin/" command))))))))) + (inputs + (list binutils + coreutils + grep + kmod + lz4 + lzop + perl + procps + sharutils + util-linux + which + zstd)) + (home-page "https://github.com/speed47/spectre-meltdown-checker") + (synopsis "CPU vulnerability / mitigation checker") + (description + "This package provides a shell script to assess your system's resilience +against the several transient execution CVEs that were published since early +2018, and give you guidance as to how to mitigate them.") + (license license:gpl3))) diff --git a/gnu/packages/patches/spectre-meltdown-checker-remove-builtin-firmware-database.patch b/gnu/packages/patches/spectre-meltdown-checker-remove-builtin-firmware-database.patch new file mode 100644 index 0000000000..400d8d3a07 --- /dev/null +++ b/gnu/packages/patches/spectre-meltdown-checker-remove-builtin-firmware-database.patch @@ -0,0 +1,113 @@ +From e2cc68814cf658638946e069406ef6a6032ab318 Mon Sep 17 00:00:00 2001 +From: Hilton Chain +Date: Sat, 12 Nov 2022 19:49:36 +0800 +Subject: [PATCH 2/2] Remove references to the builtin firmware database. + +--- + spectre-meltdown-checker.sh | 43 +++++++++++-------------------------- + 1 file changed, 12 insertions(+), 31 deletions(-) + +diff --git a/spectre-meltdown-checker.sh b/spectre-meltdown-checker.sh +index 82cf1b6..5104599 100755 +--- a/spectre-meltdown-checker.sh ++++ b/spectre-meltdown-checker.sh +@@ -95,7 +95,6 @@ show_usage() + --cpu [#,all] interact with CPUID and MSR of CPU core number #, or all (default: CPU core 0) + --update-fwdb update our local copy of the CPU microcodes versions database (using the awesome + MCExtractor project and the Intel firmwares GitHub repository) +- --update-builtin-fwdb same as --update-fwdb but update builtin DB inside the script itself + --dump-mock-data used to mimick a CPU on an other system, mainly used to help debugging this script + + Return codes: +@@ -853,10 +852,10 @@ update_fwdb() + mcedb_tmp="$(@mktemp@ -t smc-mcedb-XXXXXX)" + mcedb_url='https://github.com/platomav/MCExtractor/raw/master/MCE.db' + _info_nol "Fetching MCE.db from the MCExtractor project... " +- if command -v wget >/dev/null 2>&1; then +- wget -q "$mcedb_url" -O "$mcedb_tmp"; ret=$? +- elif command -v curl >/dev/null 2>&1; then ++ if command -v curl >/dev/null 2>&1; then + curl -sL "$mcedb_url" -o "$mcedb_tmp"; ret=$? ++ elif command -v wget >/dev/null 2>&1; then ++ wget -q "$mcedb_url" -O "$mcedb_tmp"; ret=$? + elif command -v fetch >/dev/null 2>&1; then + fetch -q "$mcedb_url" -o "$mcedb_tmp"; ret=$? + else +@@ -874,10 +873,10 @@ update_fwdb() + intel_url="https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files/archive/main.zip" + _info_nol "Fetching Intel firmwares... " + ## https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files.git +- if command -v wget >/dev/null 2>&1; then +- wget -q "$intel_url" -O "$intel_tmp/fw.zip"; ret=$? +- elif command -v curl >/dev/null 2>&1; then ++ if command -v curl >/dev/null 2>&1; then + curl -sL "$intel_url" -o "$intel_tmp/fw.zip"; ret=$? ++ elif command -v wget >/dev/null 2>&1; then ++ wget -q "$intel_url" -O "$intel_tmp/fw.zip"; ret=$? + elif command -v fetch >/dev/null 2>&1; then + fetch -q "$intel_url" -o "$intel_tmp/fw.zip"; ret=$? + else +@@ -968,14 +967,6 @@ update_fwdb() + sqlite3 "$mcedb_tmp" "SELECT '# A,0x'||t1.cpuid||',0x'||MAX(t1.version)||','||t1.yyyymmdd FROM AMD AS t1 LEFT OUTER JOIN AMD AS t2 ON t2.cpuid=t1.cpuid AND t2.yyyymmdd > t1.yyyymmdd WHERE t2.yyyymmdd IS NULL GROUP BY t1.cpuid ORDER BY t1.cpuid ASC;" | @grep@ -v '^# .,0x00000000,'; + } > "$mcedb_cache" + echo DONE "(version $dbversion)" +- +- if [ "$1" = builtin ]; then +- newfile=$(@mktemp@ -t smc-builtin-XXXXXX) +- @awk@ '/^# %%% MCEDB / { exit }; { print }' "$0" > "$newfile" +- @awk@ '{ if (NR>1) { print } }' "$mcedb_cache" >> "$newfile" +- @cat@ "$newfile" > "$0" +- @rm@ -f "$newfile" +- fi + } + + parse_opt_file() +@@ -1070,9 +1061,6 @@ while [ -n "${1:-}" ]; do + elif [ "$1" = "--update-fwdb" ] || [ "$1" = "--update-mcedb" ]; then + update_fwdb + exit $? +- elif [ "$1" = "--update-builtin-fwdb" ] || [ "$1" = "--update-builtin-mcedb" ]; then +- update_fwdb builtin +- exit $? + elif [ "$1" = "--dump-mock-data" ]; then + opt_mock=1 + shift +@@ -2033,21 +2021,11 @@ is_xen_domU() + fi + } + +-builtin_dbversion=$(@awk@ '/^# %%% MCEDB / { print $4 }' "$0") + if [ -r "$mcedb_cache" ]; then + # we have a local cache file, but it might be older than the builtin version we have + local_dbversion=$( @awk@ '/^# %%% MCEDB / { print $4 }' "$mcedb_cache") +- # sort -V sorts by version number +- older_dbversion=$(printf "%b\n%b" "$local_dbversion" "$builtin_dbversion" | @sort@ -V | @head@ -n1) +- if [ "$older_dbversion" = "$builtin_dbversion" ]; then +- mcedb_source="$mcedb_cache" +- mcedb_info="local firmwares DB $local_dbversion" +- fi +-fi +-# if mcedb_source is not set, either we don't have a local cached db, or it is older than the builtin db +-if [ -z "${mcedb_source:-}" ]; then +- mcedb_source="$0" +- mcedb_info="builtin firmwares DB $builtin_dbversion" ++ mcedb_source="$mcedb_cache" ++ mcedb_info="local firmwares DB $local_dbversion" + fi + read_mcedb() + { +@@ -2063,7 +2041,10 @@ is_latest_known_ucode() + return 2 + fi + ucode_latest="latest microcode version for your CPU model is unknown" +- if is_intel; then ++ if [ -z "$mcedb_source" ]; then ++ # When $mcedb_source is not set, skip version checking and report unknown. ++ return 2 ++ elif is_intel; then + cpu_brand_prefix=I + elif is_amd; then + cpu_brand_prefix=A +-- +2.38.1 + diff --git a/gnu/packages/patches/spectre-meltdown-checker-stage-commands-for-substitution.patch b/gnu/packages/patches/spectre-meltdown-checker-stage-commands-for-substitution.patch new file mode 100644 index 0000000000..a2f13e4195 --- /dev/null +++ b/gnu/packages/patches/spectre-meltdown-checker-stage-commands-for-substitution.patch @@ -0,0 +1,1947 @@ +From 4dc8ae01aec5a8a2aa2afc015603261d514620ae Mon Sep 17 00:00:00 2001 +From: Hilton Chain +Date: Fri, 11 Nov 2022 18:49:50 +0800 +Subject: [PATCH 1/2] Stage commands for later substitution. + +awk, base64, basename, bunzip2, cat, cut, dd, dirname, dmesg, find, getent, +grep, gunzip, gzip, head, id, lz4, lzop, mktemp, modprobe, mount, nm, +nproc, objdump, od, perl, pgrep, readelf, rm, rmmod, sed, sort, stat, +strings, sysctl, tr, umount, uname, unlzma, unxz, unzstd, uuencode, which, +whoami, xargs. +--- + spectre-meltdown-checker.sh | 648 ++++++++++++++++++------------------ + 1 file changed, 324 insertions(+), 324 deletions(-) + +diff --git a/spectre-meltdown-checker.sh b/spectre-meltdown-checker.sh +index 30f760c..82cf1b6 100755 +--- a/spectre-meltdown-checker.sh ++++ b/spectre-meltdown-checker.sh +@@ -19,33 +19,33 @@ trap '_warn "interrupted, cleaning up..."; exit_cleanup; exit 1' INT + exit_cleanup() + { + # cleanup the temp decompressed config & kernel image +- [ -n "${dumped_config:-}" ] && [ -f "$dumped_config" ] && rm -f "$dumped_config" +- [ -n "${kerneltmp:-}" ] && [ -f "$kerneltmp" ] && rm -f "$kerneltmp" +- [ -n "${kerneltmp2:-}" ] && [ -f "$kerneltmp2" ] && rm -f "$kerneltmp2" +- [ -n "${mcedb_tmp:-}" ] && [ -f "$mcedb_tmp" ] && rm -f "$mcedb_tmp" +- [ -n "${intel_tmp:-}" ] && [ -d "$intel_tmp" ] && rm -rf "$intel_tmp" +- [ "${mounted_debugfs:-}" = 1 ] && umount /sys/kernel/debug 2>/dev/null +- [ "${mounted_procfs:-}" = 1 ] && umount "$procfs" 2>/dev/null +- [ "${insmod_cpuid:-}" = 1 ] && rmmod cpuid 2>/dev/null +- [ "${insmod_msr:-}" = 1 ] && rmmod msr 2>/dev/null ++ [ -n "${dumped_config:-}" ] && [ -f "$dumped_config" ] && @rm@ -f "$dumped_config" ++ [ -n "${kerneltmp:-}" ] && [ -f "$kerneltmp" ] && @rm@ -f "$kerneltmp" ++ [ -n "${kerneltmp2:-}" ] && [ -f "$kerneltmp2" ] && @rm@ -f "$kerneltmp2" ++ [ -n "${mcedb_tmp:-}" ] && [ -f "$mcedb_tmp" ] && @rm@ -f "$mcedb_tmp" ++ [ -n "${intel_tmp:-}" ] && [ -d "$intel_tmp" ] && @rm@ -rf "$intel_tmp" ++ [ "${mounted_debugfs:-}" = 1 ] && @umount@ /sys/kernel/debug 2>/dev/null ++ [ "${mounted_procfs:-}" = 1 ] && @umount@ "$procfs" 2>/dev/null ++ [ "${insmod_cpuid:-}" = 1 ] && @rmmod@ cpuid 2>/dev/null ++ [ "${insmod_msr:-}" = 1 ] && @rmmod@ msr 2>/dev/null + [ "${kldload_cpuctl:-}" = 1 ] && kldunload cpuctl 2>/dev/null + [ "${kldload_vmm:-}" = 1 ] && kldunload vmm 2>/dev/null + } + + # if we were git clone'd, adjust VERSION +-if [ -d "$(dirname "$0")/.git" ] && command -v git >/dev/null 2>&1; then +- describe=$(git -C "$(dirname "$0")" describe --tags --dirty 2>/dev/null) +- [ -n "$describe" ] && VERSION=$(echo "$describe" | sed -e s/^v//) ++if [ -d "$(@dirname@ "$0")/.git" ] && command -v git >/dev/null 2>&1; then ++ describe=$(git -C "$(@dirname@ "$0")" describe --tags --dirty 2>/dev/null) ++ [ -n "$describe" ] && VERSION=$(echo "$describe" | @sed@ -e s/^v//) + fi + + show_usage() + { + # shellcheck disable=SC2086 +- cat <] [--config ] [--map ]> --live +- Offline mode: $(basename $0) [options] <[--kernel ] [--config ] [--map ]> ++ Live mode (auto): $(@basename@ $0) [options] ++ Live mode (manual): $(@basename@ $0) [options] <[--kernel ] [--config ] [--map ]> --live ++ Offline mode: $(@basename@ $0) [options] <[--kernel ] [--config ] [--map ]> + + Modes: + Two modes are available. +@@ -110,7 +110,7 @@ EOF + + show_disclaimer() + { +- cat < spectre 2 not affected + # https://github.com/paboldin/meltdown-exploit/issues/19 ^F E5200 => meltdown affected + # model name : Pentium(R) Dual-Core CPU E5200 @ 2.50GHz +- if echo "$cpu_friendly_name" | grep -qE 'Pentium\(R\) Dual-Core[[:space:]]+CPU[[:space:]]+E[0-9]{4}K?'; then ++ if echo "$cpu_friendly_name" | @grep@ -qE 'Pentium\(R\) Dual-Core[[:space:]]+CPU[[:space:]]+E[0-9]{4}K?'; then + variant1=vuln + [ -z "$variant2" ] && variant2=immune + variant3=vuln +@@ -486,7 +486,7 @@ is_cpu_affected() + i=$(( i + 1 )) + # do NOT quote $cpu_arch_list below + # shellcheck disable=SC2086 +- cpuarch=$(echo $cpu_arch_list | awk '{ print $'$i' }') ++ cpuarch=$(echo $cpu_arch_list | @awk@ '{ print $'$i' }') + _debug "checking cpu$i: <$cpupart> <$cpuarch>" + # some kernels report AArch64 instead of 8 + [ "$cpuarch" = "AArch64" ] && cpuarch=8 +@@ -497,49 +497,49 @@ is_cpu_affected() + # part ? ? c08 c09 c0d c0f c0e d07 d08 d09 d0a d0b d0c d0d + # arch 7? 7? 7 7 7 7 7 8 8 8 8 8 8 8 + # +- # Whitelist identified non-affected processors, use vulnerability information from ++ # Whitelist identified non-affected processors, use vulnerability information from + # https://developer.arm.com/support/arm-security-updates/speculative-processor-vulnerability + # Partnumbers can be found here: + # https://github.com/gcc-mirror/gcc/blob/master/gcc/config/arm/arm-cpus.in + # + # Maintain cumulative check of vulnerabilities - + # if at least one of the cpu is affected, then the system is affected +- if [ "$cpuarch" = 7 ] && echo "$cpupart" | grep -q -w -e 0xc08 -e 0xc09 -e 0xc0d -e 0xc0e; then ++ if [ "$cpuarch" = 7 ] && echo "$cpupart" | @grep@ -q -w -e 0xc08 -e 0xc09 -e 0xc0d -e 0xc0e; then + variant1=vuln + variant2=vuln + [ -z "$variant3" ] && variant3=immune + [ -z "$variant3a" ] && variant3a=immune + [ -z "$variant4" ] && variant4=immune + _debug "checking cpu$i: armv7 A8/A9/A12/A17 non affected to variants 3, 3a & 4" +- elif [ "$cpuarch" = 7 ] && echo "$cpupart" | grep -q -w -e 0xc0f; then ++ elif [ "$cpuarch" = 7 ] && echo "$cpupart" | @grep@ -q -w -e 0xc0f; then + variant1=vuln + variant2=vuln + [ -z "$variant3" ] && variant3=immune + variant3a=vuln + [ -z "$variant4" ] && variant4=immune + _debug "checking cpu$i: armv7 A15 non affected to variants 3 & 4" +- elif [ "$cpuarch" = 8 ] && echo "$cpupart" | grep -q -w -e 0xd07 -e 0xd08; then ++ elif [ "$cpuarch" = 8 ] && echo "$cpupart" | @grep@ -q -w -e 0xd07 -e 0xd08; then + variant1=vuln + variant2=vuln + [ -z "$variant3" ] && variant3=immune + variant3a=vuln + variant4=vuln + _debug "checking cpu$i: armv8 A57/A72 non affected to variants 3" +- elif [ "$cpuarch" = 8 ] && echo "$cpupart" | grep -q -w -e 0xd09; then ++ elif [ "$cpuarch" = 8 ] && echo "$cpupart" | @grep@ -q -w -e 0xd09; then + variant1=vuln + variant2=vuln + [ -z "$variant3" ] && variant3=immune + [ -z "$variant3a" ] && variant3a=immune + variant4=vuln + _debug "checking cpu$i: armv8 A73 non affected to variants 3 & 3a" +- elif [ "$cpuarch" = 8 ] && echo "$cpupart" | grep -q -w -e 0xd0a; then ++ elif [ "$cpuarch" = 8 ] && echo "$cpupart" | @grep@ -q -w -e 0xd0a; then + variant1=vuln + variant2=vuln + variant3=vuln + [ -z "$variant3a" ] && variant3a=immune + variant4=vuln + _debug "checking cpu$i: armv8 A75 non affected to variant 3a" +- elif [ "$cpuarch" = 8 ] && echo "$cpupart" | grep -q -w -e 0xd0b -e 0xd0c -e 0xd0d; then ++ elif [ "$cpuarch" = 8 ] && echo "$cpupart" | @grep@ -q -w -e 0xd0b -e 0xd0c -e 0xd0d; then + variant1=vuln + [ -z "$variant2" ] && variant2=immune + [ -z "$variant3" ] && variant3=immune +@@ -820,7 +820,7 @@ is_cpu_ssb_free() + if [ "$cpu_family" = "18" ] || \ + [ "$cpu_family" = "17" ] || \ + [ "$cpu_family" = "16" ] || \ +- [ "$cpu_family" = "15" ]; then ++ [ "$cpu_family" = "15" ]; then + return 0 + fi + fi +@@ -837,7 +837,7 @@ show_header() + _info + } + +-[ -z "$HOME" ] && HOME="$(getent passwd "$(whoami)" | cut -d: -f6)" ++[ -z "$HOME" ] && HOME="$(@getent@ passwd "$(@whoami@)" | @cut@ -d: -f6)" + mcedb_cache="$HOME/.mcedb" + update_fwdb() + { +@@ -846,11 +846,11 @@ update_fwdb() + set -e + + if [ -r "$mcedb_cache" ]; then +- previous_dbversion=$(awk '/^# %%% MCEDB / { print $4 }' "$mcedb_cache") ++ previous_dbversion=$(@awk@ '/^# %%% MCEDB / { print $4 }' "$mcedb_cache") + fi + + # first, download the MCE.db from the excellent platomav's MCExtractor project +- mcedb_tmp="$(mktemp -t smc-mcedb-XXXXXX)" ++ mcedb_tmp="$(@mktemp@ -t smc-mcedb-XXXXXX)" + mcedb_url='https://github.com/platomav/MCExtractor/raw/master/MCE.db' + _info_nol "Fetching MCE.db from the MCExtractor project... " + if command -v wget >/dev/null 2>&1; then +@@ -870,7 +870,7 @@ update_fwdb() + echo DONE + + # second, get the Intel firmwares from GitHub +- intel_tmp="$(mktemp -d -t smc-intelfw-XXXXXX)" ++ intel_tmp="$(@mktemp@ -d -t smc-intelfw-XXXXXX)" + intel_url="https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files/archive/main.zip" + _info_nol "Fetching Intel firmwares... " + ## https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files.git +@@ -930,20 +930,20 @@ update_fwdb() + fi + # 079/001: sig 0x000106c2, pf_mask 0x01, 2009-04-10, rev 0x0217, size 5120 + # 078/004: sig 0x000106ca, pf_mask 0x10, 2009-08-25, rev 0x0107, size 5120 +- $iucode_tool -l "$intel_tmp/Intel-Linux-Processor-Microcode-Data-Files-main/intel-ucode" | grep -wF sig | while read -r _line ++ $iucode_tool -l "$intel_tmp/Intel-Linux-Processor-Microcode-Data-Files-main/intel-ucode" | @grep@ -wF sig | while read -r _line + do +- _line=$( echo "$_line" | tr -d ',') +- _cpuid=$( echo "$_line" | awk '{print $3}') ++ _line=$( echo "$_line" | @tr@ -d ',') ++ _cpuid=$( echo "$_line" | @awk@ '{print $3}') + _cpuid=$(( _cpuid )) + _cpuid=$(printf "0x%08X" "$_cpuid") +- _date=$( echo "$_line" | awk '{print $6}' | tr -d '-') +- _version=$(echo "$_line" | awk '{print $8}') ++ _date=$( echo "$_line" | @awk@ '{print $6}' | @tr@ -d '-') ++ _version=$(echo "$_line" | @awk@ '{print $8}') + _version=$(( _version )) + _version=$(printf "0x%08X" "$_version") + _sqlstm="$(printf "INSERT INTO Intel (origin,cpuid,version,yyyymmdd) VALUES (\"%s\",\"%s\",\"%s\",\"%s\");" "intel" "$(printf "%08X" "$_cpuid")" "$(printf "%08X" "$_version")" "$_date")" + sqlite3 "$mcedb_tmp" "$_sqlstm" + done +- _intel_timestamp=$(stat -c %Y "$intel_tmp/Intel-Linux-Processor-Microcode-Data-Files-main/license" 2>/dev/null) ++ _intel_timestamp=$(@stat@ -c %Y "$intel_tmp/Intel-Linux-Processor-Microcode-Data-Files-main/license" 2>/dev/null) + if [ -n "$_intel_timestamp" ]; then + # use this date, it matches the last commit date + _intel_latest_date=$(date +%Y%m%d -d @"$_intel_timestamp") +@@ -964,17 +964,17 @@ update_fwdb() + { + echo "# Spectre & Meltdown Checker"; + echo "# %%% MCEDB v$dbversion"; +- sqlite3 "$mcedb_tmp" "SELECT '# I,0x'||t1.cpuid||',0x'||MAX(t1.version)||','||t1.yyyymmdd FROM Intel AS t1 LEFT OUTER JOIN Intel AS t2 ON t2.cpuid=t1.cpuid AND t2.yyyymmdd > t1.yyyymmdd WHERE t2.yyyymmdd IS NULL GROUP BY t1.cpuid ORDER BY t1.cpuid ASC;" | grep -v '^# .,0x00000000,'; +- sqlite3 "$mcedb_tmp" "SELECT '# A,0x'||t1.cpuid||',0x'||MAX(t1.version)||','||t1.yyyymmdd FROM AMD AS t1 LEFT OUTER JOIN AMD AS t2 ON t2.cpuid=t1.cpuid AND t2.yyyymmdd > t1.yyyymmdd WHERE t2.yyyymmdd IS NULL GROUP BY t1.cpuid ORDER BY t1.cpuid ASC;" | grep -v '^# .,0x00000000,'; ++ sqlite3 "$mcedb_tmp" "SELECT '# I,0x'||t1.cpuid||',0x'||MAX(t1.version)||','||t1.yyyymmdd FROM Intel AS t1 LEFT OUTER JOIN Intel AS t2 ON t2.cpuid=t1.cpuid AND t2.yyyymmdd > t1.yyyymmdd WHERE t2.yyyymmdd IS NULL GROUP BY t1.cpuid ORDER BY t1.cpuid ASC;" | @grep@ -v '^# .,0x00000000,'; ++ sqlite3 "$mcedb_tmp" "SELECT '# A,0x'||t1.cpuid||',0x'||MAX(t1.version)||','||t1.yyyymmdd FROM AMD AS t1 LEFT OUTER JOIN AMD AS t2 ON t2.cpuid=t1.cpuid AND t2.yyyymmdd > t1.yyyymmdd WHERE t2.yyyymmdd IS NULL GROUP BY t1.cpuid ORDER BY t1.cpuid ASC;" | @grep@ -v '^# .,0x00000000,'; + } > "$mcedb_cache" + echo DONE "(version $dbversion)" + + if [ "$1" = builtin ]; then +- newfile=$(mktemp -t smc-builtin-XXXXXX) +- awk '/^# %%% MCEDB / { exit }; { print }' "$0" > "$newfile" +- awk '{ if (NR>1) { print } }' "$mcedb_cache" >> "$newfile" +- cat "$newfile" > "$0" +- rm -f "$newfile" ++ newfile=$(@mktemp@ -t smc-builtin-XXXXXX) ++ @awk@ '/^# %%% MCEDB / { exit }; { print }' "$0" > "$newfile" ++ @awk@ '{ if (NR>1) { print } }' "$mcedb_cache" >> "$newfile" ++ @cat@ "$newfile" > "$0" ++ @rm@ -f "$newfile" + fi + } + +@@ -1055,7 +1055,7 @@ while [ -n "${1:-}" ]; do + elif [ "$1" = "--cpu" ]; then + opt_cpu=$2 + if [ "$opt_cpu" != all ]; then +- if echo "$opt_cpu" | grep -Eq '^[0-9]+'; then ++ if echo "$opt_cpu" | @grep@ -Eq '^[0-9]+'; then + opt_cpu=$(( opt_cpu )) + else + echo "$0: error: --cpu should be an integer or 'all', got '$opt_cpu'" >&2 +@@ -1103,7 +1103,7 @@ while [ -n "${1:-}" ]; do + echo "$0: error: option --cve expects a parameter, supported CVEs are: $supported_cve_list" >&2 + exit 255 + fi +- selected_cve=$(echo "$supported_cve_list" | grep -iwo "$2") ++ selected_cve=$(echo "$supported_cve_list" | @grep@ -iwo "$2") + if [ -n "$selected_cve" ]; then + opt_cve_list="$opt_cve_list $selected_cve" + opt_cve_all=0 +@@ -1308,14 +1308,14 @@ check_kernel() + # a damaged ELF file and validate it, check for stderr warnings too + + # the warning "readelf: Warning: [16]: Link field (0) should index a symtab section./" can appear on valid kernels, ignore it +- _readelf_warnings=$("${opt_arch_prefix}readelf" -S "$_file" 2>&1 >/dev/null | grep -v 'should index a symtab section' | tr "\n" "/"); ret=$? +- _readelf_sections=$("${opt_arch_prefix}readelf" -S "$_file" 2>/dev/null | grep -c -e data -e text -e init) +- _kernel_size=$(stat -c %s "$_file" 2>/dev/null || stat -f %z "$_file" 2>/dev/null || echo 10000) ++ _readelf_warnings=$("@readelf@" -S "$_file" 2>&1 >/dev/null | @grep@ -v 'should index a symtab section' | @tr@ "\n" "/"); ret=$? ++ _readelf_sections=$("@readelf@" -S "$_file" 2>/dev/null | @grep@ -c -e data -e text -e init) ++ _kernel_size=$(@stat@ -c %s "$_file" 2>/dev/null || @stat@ -f %z "$_file" 2>/dev/null || echo 10000) + _debug "check_kernel: ret=$? size=$_kernel_size sections=$_readelf_sections warnings=$_readelf_warnings" + if [ "$_mode" = desperate ]; then +- if "${opt_arch_prefix}strings" "$_file" | grep -Eq '^Linux version '; then ++ if "@strings@" "$_file" | @grep@ -Eq '^Linux version '; then + _debug "check_kernel (desperate): ... matched!" +- if [ "$_readelf_sections" = 0 ] && grep -qF -e armv6 -e armv7 "$_file"; then ++ if [ "$_readelf_sections" = 0 ] && @grep@ -qF -e armv6 -e armv7 "$_file"; then + _debug "check_kernel (desperate): raw arm binary found, adjusting objdump options" + objdump_options="-D -b binary -marm" + else +@@ -1348,7 +1348,7 @@ try_decompress() + + # Try to find the header ($1) and decompress from here + _debug "try_decompress: looking for $3 magic in $6" +- for pos in $(tr "$1\n$2" "\n$2=" < "$6" | grep -abo "^$2") ++ for pos in $(@tr@ "$1\n$2" "\n$2=" < "$6" | @grep@ -abo "^$2") + do + _debug "try_decompress: magic for $3 found at offset $pos" + if ! command -v "$3" >/dev/null 2>&1; then +@@ -1375,11 +1375,11 @@ try_decompress() + kernel="$kerneltmp" + _debug "try_decompress: decompressed with $3 successfully!" + return 0 +- elif [ "$3" != "cat" ]; then ++ elif [ "$3" != "@cat@" ]; then + _debug "try_decompress: decompression with $3 worked but result is not a kernel, trying with an offset" +- [ -z "$kerneltmp2" ] && kerneltmp2=$(mktemp -t smc-kernel-XXXXXX) +- cat "$kerneltmp" > "$kerneltmp2" +- try_decompress '\177ELF' xxy 'cat' '' cat "$kerneltmp2" && return 0 ++ [ -z "$kerneltmp2" ] && kerneltmp2=$(@mktemp@ -t smc-kernel-XXXXXX) ++ @cat@ "$kerneltmp" > "$kerneltmp2" ++ try_decompress '\177ELF' xxy '@cat@' '' cat "$kerneltmp2" && return 0 + else + _debug "try_decompress: decompression with $3 worked but result is not a kernel" + fi +@@ -1391,12 +1391,12 @@ extract_kernel() + { + [ -n "${1:-}" ] || return 1 + # Prepare temp files: +- kerneltmp="$(mktemp -t smc-kernel-XXXXXX)" ++ kerneltmp="$(@mktemp@ -t smc-kernel-XXXXXX)" + + # Initial attempt for uncompressed images or objects: + if check_kernel "$1"; then + _debug "extract_kernel: found kernel is valid, no decompression needed" +- cat "$1" > "$kerneltmp" ++ @cat@ "$1" > "$kerneltmp" + kernel=$kerneltmp + return 0 + fi +@@ -1405,14 +1405,14 @@ extract_kernel() + for pass in 1 2; do + for mode in normal desperate; do + _debug "extract_kernel: pass $pass $mode mode" +- try_decompress '\037\213\010' xy gunzip '' gunzip "$1" "$mode" "$pass" && return 0 +- try_decompress '\002\041\114\030' xyy 'lz4' '-d -l' liblz4-tool "$1" "$mode" "$pass" && return 0 +- try_decompress '\3757zXZ\000' abcde unxz '' xz-utils "$1" "$mode" "$pass" && return 0 +- try_decompress 'BZh' xy bunzip2 '' bzip2 "$1" "$mode" "$pass" && return 0 +- try_decompress '\135\0\0\0' xxx unlzma '' xz-utils "$1" "$mode" "$pass" && return 0 +- try_decompress '\211\114\132' xy 'lzop' '-d' lzop "$1" "$mode" "$pass" && return 0 +- try_decompress '\177ELF' xxy 'cat' '' cat "$1" "$mode" "$pass" && return 0 +- try_decompress '(\265/\375' xxy unzstd '' zstd "$1" "$mode" "$pass" && return 0 ++ try_decompress '\037\213\010' xy @gunzip@ '' gunzip "$1" "$mode" "$pass" && return 0 ++ try_decompress '\002\041\114\030' xyy '@lz4@' '-d -l' liblz4-tool "$1" "$mode" "$pass" && return 0 ++ try_decompress '\3757zXZ\000' abcde @unxz@ '' xz-utils "$1" "$mode" "$pass" && return 0 ++ try_decompress 'BZh' xy @bunzip2@ '' bzip2 "$1" "$mode" "$pass" && return 0 ++ try_decompress '\135\0\0\0' xxx @unlzma@ '' xz-utils "$1" "$mode" "$pass" && return 0 ++ try_decompress '\211\114\132' xy '@lzop@' '-d' lzop "$1" "$mode" "$pass" && return 0 ++ try_decompress '\177ELF' xxy '@cat@' '' cat "$1" "$mode" "$pass" && return 0 ++ try_decompress '(\265/\375' xxy @unzstd@ '' zstd "$1" "$mode" "$pass" && return 0 + done + done + # kernel_err might already have been populated by try_decompress() if we're missing one of the tools +@@ -1429,7 +1429,7 @@ mount_debugfs() + { + if [ ! -e /sys/kernel/debug/sched_features ]; then + # try to mount the debugfs hierarchy ourselves and remember it to umount afterwards +- mount -t debugfs debugfs /sys/kernel/debug 2>/dev/null && mounted_debugfs=1 ++ @mount@ -t debugfs debugfs /sys/kernel/debug 2>/dev/null && mounted_debugfs=1 + fi + } + +@@ -1440,12 +1440,12 @@ load_msr() + load_msr_once=1 + + if [ "$os" = Linux ]; then +- if ! grep -qw msr "$procfs/modules" 2>/dev/null; then +- modprobe msr 2>/dev/null && insmod_msr=1 ++ if ! @grep@ -qw msr "$procfs/modules" 2>/dev/null; then ++ @modprobe@ msr 2>/dev/null && insmod_msr=1 + _debug "attempted to load module msr, insmod_msr=$insmod_msr" + else + _debug "msr module already loaded" +- fi ++ fi + else + if ! kldstat -q -m cpuctl; then + kldload cpuctl 2>/dev/null && kldload_cpuctl=1 +@@ -1463,12 +1463,12 @@ load_cpuid() + load_cpuid_once=1 + + if [ "$os" = Linux ]; then +- if ! grep -qw cpuid "$procfs/modules" 2>/dev/null; then +- modprobe cpuid 2>/dev/null && insmod_cpuid=1 ++ if ! @grep@ -qw cpuid "$procfs/modules" 2>/dev/null; then ++ @modprobe@ cpuid 2>/dev/null && insmod_cpuid=1 + _debug "attempted to load module cpuid, insmod_cpuid=$insmod_cpuid" + else + _debug "cpuid module already loaded" +- fi ++ fi + else + if ! kldstat -q -m cpuctl; then + kldload cpuctl 2>/dev/null && kldload_cpuctl=1 +@@ -1557,7 +1557,7 @@ read_cpuid_one_core() + fi + # on some kernel versions, /dev/cpu/0/cpuid doesn't imply that the cpuid module is loaded, in that case dd returns an error, + # we use that fact to load the module if dd returns an error +- if ! dd if=/dev/cpu/0/cpuid bs=16 count=1 >/dev/null 2>&1; then ++ if ! @dd@ if=/dev/cpu/0/cpuid bs=16 count=1 >/dev/null 2>&1; then + load_cpuid + fi + # we need _leaf to be converted to decimal for dd +@@ -1568,14 +1568,14 @@ read_cpuid_one_core() + _ddskip=$(( _position / 16 )) + _odskip=$(( _position - _ddskip * 16 )) + # now read the value +- _cpuid=$(dd if="/dev/cpu/$_core/cpuid" bs=16 skip=$_ddskip count=$((_odskip + 1)) 2>/dev/null | od -j $((_odskip * 16)) -A n -t u4) ++ _cpuid=$(@dd@ if="/dev/cpu/$_core/cpuid" bs=16 skip=$_ddskip count=$((_odskip + 1)) 2>/dev/null | @od@ -j $((_odskip * 16)) -A n -t u4) + elif [ -e /dev/cpuctl0 ]; then + # BSD + if [ ! -r /dev/cpuctl0 ]; then + read_cpuid_msg="Couldn't read cpuid info from cpuctl" + return $READ_CPUID_RET_ERR + fi +- _cpuid=$(cpucontrol -i "$_leaf","$_subleaf" "/dev/cpuctl$_core" 2>/dev/null | cut -d: -f2-) ++ _cpuid=$(cpucontrol -i "$_leaf","$_subleaf" "/dev/cpuctl$_core" 2>/dev/null | @cut@ -d: -f2-) + # cpuid level 0x4, level_type 0x2: 0x1c004143 0x01c0003f 0x000001ff 0x00000000 + else + read_cpuid_msg="Found no way to read cpuid info" +@@ -1598,7 +1598,7 @@ read_cpuid_one_core() + fi + + # get the value of the register we want +- _reg=$(echo "$_cpuid" | awk '{print $'"$_register"'}') ++ _reg=$(echo "$_cpuid" | @awk@ '{print $'"$_register"'}') + # Linux returns it as decimal, BSD as hex, normalize to decimal + _reg=$(( _reg )) + # shellcheck disable=SC2046 +@@ -1626,11 +1626,11 @@ dmesg_grep() + # grep for something in dmesg, ensuring that the dmesg buffer + # has not been truncated + dmesg_grepped='' +- if ! dmesg | grep -qE -e '(^|\] )Linux version [0-9]' -e '^FreeBSD is a registered' ; then ++ if ! @dmesg@ | @grep@ -qE -e '(^|\] )Linux version [0-9]' -e '^FreeBSD is a registered' ; then + # dmesg truncated + return 2 + fi +- dmesg_grepped=$(dmesg | grep -E "$1" | head -1) ++ dmesg_grepped=$(@dmesg@ | @grep@ -E "$1" | @head@ -1) + # not found: + [ -z "$dmesg_grepped" ] && return 1 + # found, output is in $dmesg_grepped +@@ -1647,12 +1647,12 @@ parse_cpu_details() + { + [ "${parse_cpu_details_done:-}" = 1 ] && return 0 + +- if command -v nproc >/dev/null; then +- number_of_cores=$(nproc) +- elif echo "$os" | grep -q BSD; then +- number_of_cores=$(sysctl -n hw.ncpu 2>/dev/null || echo 1) ++ if command -v @nproc@ >/dev/null; then ++ number_of_cores=$(@nproc@) ++ elif echo "$os" | @grep@ -q BSD; then ++ number_of_cores=$(@sysctl@ -n hw.ncpu 2>/dev/null || echo 1) + elif [ -e "$procfs/cpuinfo" ]; then +- number_of_cores=$(grep -c ^processor "$procfs/cpuinfo" 2>/dev/null || echo 1) ++ number_of_cores=$(@grep@ -c ^processor "$procfs/cpuinfo" 2>/dev/null || echo 1) + else + # if we don't know, default to 1 CPU + number_of_cores=1 +@@ -1660,43 +1660,43 @@ parse_cpu_details() + max_core_id=$(( number_of_cores - 1 )) + + if [ -e "$procfs/cpuinfo" ]; then +- cpu_vendor=$( grep '^vendor_id' "$procfs/cpuinfo" | awk '{print $3}' | head -1) +- cpu_friendly_name=$(grep '^model name' "$procfs/cpuinfo" | cut -d: -f2- | head -1 | sed -e 's/^ *//') ++ cpu_vendor=$( @grep@ '^vendor_id' "$procfs/cpuinfo" | @awk@ '{print $3}' | @head@ -1) ++ cpu_friendly_name=$(@grep@ '^model name' "$procfs/cpuinfo" | @cut@ -d: -f2- | @head@ -1 | @sed@ -e 's/^ *//') + # special case for ARM follows +- if grep -qi 'CPU implementer[[:space:]]*:[[:space:]]*0x41' "$procfs/cpuinfo"; then ++ if @grep@ -qi 'CPU implementer[[:space:]]*:[[:space:]]*0x41' "$procfs/cpuinfo"; then + cpu_vendor='ARM' + # some devices (phones or other) have several ARMs and as such different part numbers, + # an example is "bigLITTLE", so we need to store the whole list, this is needed for is_cpu_affected +- cpu_part_list=$(awk '/CPU part/ {print $4}' "$procfs/cpuinfo") +- cpu_arch_list=$(awk '/CPU architecture/ {print $3}' "$procfs/cpuinfo") ++ cpu_part_list=$(@awk@ '/CPU part/ {print $4}' "$procfs/cpuinfo") ++ cpu_arch_list=$(@awk@ '/CPU architecture/ {print $3}' "$procfs/cpuinfo") + # take the first one to fill the friendly name, do NOT quote the vars below + # shellcheck disable=SC2086 +- cpu_arch=$(echo $cpu_arch_list | awk '{ print $1 }') ++ cpu_arch=$(echo $cpu_arch_list | @awk@ '{ print $1 }') + # shellcheck disable=SC2086 +- cpu_part=$(echo $cpu_part_list | awk '{ print $1 }') ++ cpu_part=$(echo $cpu_part_list | @awk@ '{ print $1 }') + [ "$cpu_arch" = "AArch64" ] && cpu_arch=8 + cpu_friendly_name="ARM" + [ -n "$cpu_arch" ] && cpu_friendly_name="$cpu_friendly_name v$cpu_arch" + [ -n "$cpu_part" ] && cpu_friendly_name="$cpu_friendly_name model $cpu_part" + +- elif grep -qi 'CPU implementer[[:space:]]*:[[:space:]]*0x43' "$procfs/cpuinfo"; then ++ elif @grep@ -qi 'CPU implementer[[:space:]]*:[[:space:]]*0x43' "$procfs/cpuinfo"; then + cpu_vendor='CAVIUM' +- elif grep -qi 'CPU implementer[[:space:]]*:[[:space:]]*0x70' "$procfs/cpuinfo"; then ++ elif @grep@ -qi 'CPU implementer[[:space:]]*:[[:space:]]*0x70' "$procfs/cpuinfo"; then + cpu_vendor='PHYTIUM' + fi + +- cpu_family=$( grep '^cpu family' "$procfs/cpuinfo" | awk '{print $4}' | grep -E '^[0-9]+$' | head -1) +- cpu_model=$( grep '^model' "$procfs/cpuinfo" | awk '{print $3}' | grep -E '^[0-9]+$' | head -1) +- cpu_stepping=$(grep '^stepping' "$procfs/cpuinfo" | awk '{print $3}' | grep -E '^[0-9]+$' | head -1) +- cpu_ucode=$( grep '^microcode' "$procfs/cpuinfo" | awk '{print $3}' | head -1) ++ cpu_family=$( @grep@ '^cpu family' "$procfs/cpuinfo" | @awk@ '{print $4}' | @grep@ -E '^[0-9]+$' | @head@ -1) ++ cpu_model=$( @grep@ '^model' "$procfs/cpuinfo" | @awk@ '{print $3}' | @grep@ -E '^[0-9]+$' | @head@ -1) ++ cpu_stepping=$(@grep@ '^stepping' "$procfs/cpuinfo" | @awk@ '{print $3}' | @grep@ -E '^[0-9]+$' | @head@ -1) ++ cpu_ucode=$( @grep@ '^microcode' "$procfs/cpuinfo" | @awk@ '{print $3}' | @head@ -1) + else +- cpu_vendor=$( dmesg | grep -i -m1 'Origin=' | cut -f2 -w | cut -f2 -d= | cut -f2 -d\" ) +- cpu_family=$( dmesg | grep -i -m1 'Family=' | cut -f4 -w | cut -f2 -d= ) ++ cpu_vendor=$( @dmesg@ | @grep@ -i -m1 'Origin=' | @cut@ -f2 -w | @cut@ -f2 -d= | @cut@ -f2 -d\" ) ++ cpu_family=$( @dmesg@ | @grep@ -i -m1 'Family=' | @cut@ -f4 -w | @cut@ -f2 -d= ) + cpu_family=$(( cpu_family )) +- cpu_model=$( dmesg | grep -i -m1 'Model=' | cut -f5 -w | cut -f2 -d= ) ++ cpu_model=$( @dmesg@ | @grep@ -i -m1 'Model=' | @cut@ -f5 -w | @cut@ -f2 -d= ) + cpu_model=$(( cpu_model )) +- cpu_stepping=$( dmesg | grep -i -m1 'Stepping=' | cut -f6 -w | cut -f2 -d= ) +- cpu_friendly_name=$(sysctl -n hw.model 2>/dev/null) ++ cpu_stepping=$( @dmesg@ | @grep@ -i -m1 'Stepping=' | @cut@ -f6 -w | @cut@ -f2 -d= ) ++ cpu_friendly_name=$(@sysctl@ -n hw.model 2>/dev/null) + fi + + if [ -n "${SMC_MOCK_CPU_FRIENDLY_NAME:-}" ]; then +@@ -1751,7 +1751,7 @@ parse_cpu_details() + # call CPUID + cpucontrol -i 1 /dev/cpuctl0 >/dev/null + # read MSR +- cpu_ucode=$(cpucontrol -m 0x8b /dev/cpuctl0 | awk '{print $3}') ++ cpu_ucode=$(cpucontrol -m 0x8b /dev/cpuctl0 | @awk@ '{print $3}') + # convert to decimal + cpu_ucode=$(( cpu_ucode )) + # convert back to hex +@@ -1770,7 +1770,7 @@ parse_cpu_details() + mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_CPU_UCODE='$cpu_ucode'") + fi + +- echo "$cpu_ucode" | grep -q ^0x && cpu_ucode=$(( cpu_ucode )) ++ echo "$cpu_ucode" | @grep@ -q ^0x && cpu_ucode=$(( cpu_ucode )) + ucode_found=$(printf "family 0x%x model 0x%x stepping 0x%x ucode 0x%x cpuid 0x%x" "$cpu_family" "$cpu_model" "$cpu_stepping" "$cpu_ucode" "$cpu_cpuid") + + # also define those that we will need in other funcs +@@ -1867,8 +1867,8 @@ is_cpu_smt_enabled() + { + # SMT / HyperThreading is enabled if siblings != cpucores + if [ -e "$procfs/cpuinfo" ]; then +- _siblings=$(awk '/^siblings/ {print $3;exit}' "$procfs/cpuinfo") +- _cpucores=$(awk '/^cpu cores/ {print $4;exit}' "$procfs/cpuinfo") ++ _siblings=$(@awk@ '/^siblings/ {print $3;exit}' "$procfs/cpuinfo") ++ _cpucores=$(@awk@ '/^cpu cores/ {print $4;exit}' "$procfs/cpuinfo") + if [ -n "$_siblings" ] && [ -n "$_cpucores" ]; then + if [ "$_siblings" = "$_cpucores" ]; then + return 1 +@@ -1916,10 +1916,10 @@ is_ucode_blacklisted() + $INTEL_FAM6_SANDYBRIDGE_X,0x06,0x61b \ + $INTEL_FAM6_SANDYBRIDGE_X,0x07,0x712 + do +- model=$(echo "$tuple" | cut -d, -f1) +- stepping=$(( $(echo "$tuple" | cut -d, -f2) )) ++ model=$(echo "$tuple" | @cut@ -d, -f1) ++ stepping=$(( $(echo "$tuple" | @cut@ -d, -f2) )) + if [ "$cpu_model" = "$model" ] && [ "$cpu_stepping" = "$stepping" ]; then +- ucode=$(( $(echo "$tuple" | cut -d, -f3) )) ++ ucode=$(( $(echo "$tuple" | @cut@ -d, -f3) )) + if [ "$cpu_ucode" = "$ucode" ]; then + _debug "is_ucode_blacklisted: we have a match! ($cpu_model/$cpu_stepping/$cpu_ucode)" + return 0 +@@ -2007,7 +2007,7 @@ is_xen_dom0() + return 1 + fi + +- if [ -e "$procfs/xen/capabilities" ] && grep -q "control_d" "$procfs/xen/capabilities"; then ++ if [ -e "$procfs/xen/capabilities" ] && @grep@ -q "control_d" "$procfs/xen/capabilities"; then + return 0 + else + return 1 +@@ -2033,12 +2033,12 @@ is_xen_domU() + fi + } + +-builtin_dbversion=$(awk '/^# %%% MCEDB / { print $4 }' "$0") ++builtin_dbversion=$(@awk@ '/^# %%% MCEDB / { print $4 }' "$0") + if [ -r "$mcedb_cache" ]; then + # we have a local cache file, but it might be older than the builtin version we have +- local_dbversion=$( awk '/^# %%% MCEDB / { print $4 }' "$mcedb_cache") ++ local_dbversion=$( @awk@ '/^# %%% MCEDB / { print $4 }' "$mcedb_cache") + # sort -V sorts by version number +- older_dbversion=$(printf "%b\n%b" "$local_dbversion" "$builtin_dbversion" | sort -V | head -n1) ++ older_dbversion=$(printf "%b\n%b" "$local_dbversion" "$builtin_dbversion" | @sort@ -V | @head@ -n1) + if [ "$older_dbversion" = "$builtin_dbversion" ]; then + mcedb_source="$mcedb_cache" + mcedb_info="local firmwares DB $local_dbversion" +@@ -2051,7 +2051,7 @@ if [ -z "${mcedb_source:-}" ]; then + fi + read_mcedb() + { +- awk '{ if (DELIM==1) { print $2 } } /^# %%% MCEDB / { DELIM=1 }' "$mcedb_source" ++ @awk@ '{ if (DELIM==1) { print $2 } } /^# %%% MCEDB / { DELIM=1 }' "$mcedb_source" + } + + is_latest_known_ucode() +@@ -2070,10 +2070,10 @@ is_latest_known_ucode() + else + return 2 + fi +- for tuple in $(read_mcedb | grep "$(printf "^$cpu_brand_prefix,0x%08X," "$cpu_cpuid")") ++ for tuple in $(read_mcedb | @grep@ "$(printf "^$cpu_brand_prefix,0x%08X," "$cpu_cpuid")") + do +- ucode=$(( $(echo "$tuple" | cut -d, -f3) )) +- ucode_date=$(echo "$tuple" | cut -d, -f4 | sed -r 's=(....)(..)(..)=\1/\2/\3=') ++ ucode=$(( $(echo "$tuple" | @cut@ -d, -f3) )) ++ ucode_date=$(echo "$tuple" | @cut@ -d, -f4 | @sed@ -r 's=(....)(..)(..)=\1/\2/\3=') + _debug "is_latest_known_ucode: with cpuid $cpu_cpuid has ucode $cpu_ucode, last known is $ucode from $ucode_date" + ucode_latest=$(printf "latest version is 0x%x dated $ucode_date according to $mcedb_info" "$ucode") + if [ "$cpu_ucode" -ge "$ucode" ]; then +@@ -2098,7 +2098,7 @@ get_cmdline() + kernel_cmdline="$SMC_MOCK_CMDLINE" + return + else +- kernel_cmdline=$(cat "$procfs/cmdline") ++ kernel_cmdline=$(@cat@ "$procfs/cmdline") + mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_CMDLINE='$kernel_cmdline'") + fi + } +@@ -2106,7 +2106,7 @@ get_cmdline() + # ENTRYPOINT + + # we can't do anything useful under WSL +-if uname -a | grep -qE -- '-Microsoft #[0-9]+-Microsoft '; then ++if @uname@ -a | @grep@ -qE -- '-Microsoft #[0-9]+-Microsoft '; then + _warn "This script doesn't work under Windows Subsystem for Linux" + _warn "You should use the official Microsoft tool instead." + _warn "It can be found under https://aka.ms/SpeculationControlPS" +@@ -2155,15 +2155,15 @@ fi + + # if we're under a BSD, try to mount linprocfs for "$procfs/cpuinfo" + procfs=/proc +-if echo "$os" | grep -q BSD; then ++if echo "$os" | @grep@ -q BSD; then + _debug "We're under BSD, check if we have procfs" +- procfs=$(mount | awk '/^linprocfs/ { print $3; exit; }') ++ procfs=$(@mount@ | @awk@ '/^linprocfs/ { print $3; exit; }') + if [ -z "$procfs" ]; then + _debug "we don't, try to mount it" + procfs=/proc + [ -d /compat/linux/proc ] && procfs=/compat/linux/proc + test -d $procfs || mkdir $procfs +- if mount -t linprocfs linprocfs $procfs 2>/dev/null; then ++ if @mount@ -t linprocfs linprocfs $procfs 2>/dev/null; then + mounted_procfs=1 + _debug "procfs just mounted at $procfs" + else +@@ -2195,14 +2195,14 @@ fi + + if [ "$opt_live" = 1 ]; then + # root check (only for live mode, for offline mode, we already checked if we could read the files) +- if [ "$(id -u)" -ne 0 ]; then ++ if [ "$(@id@ -u)" -ne 0 ]; then + _warn "Note that you should launch this script with root privileges to get accurate information." + _warn "We'll proceed but you might see permission denied errors." + _warn "To run it as root, you can try the following command: sudo $0" + _warn + fi + _info "Checking for vulnerabilities on current system" +- _info "Kernel is \033[35m$os $(uname -r) $(uname -v) $(uname -m)\033[0m" ++ _info "Kernel is \033[35m$os $(@uname@ -r) $(@uname@ -v) $(@uname@ -m)\033[0m" + _info "CPU is \033[35m$cpu_friendly_name\033[0m" + + # try to find the image of the current running kernel +@@ -2210,12 +2210,12 @@ if [ "$opt_live" = 1 ]; then + # specified by user on cmdline, with --live, don't override + : + # first, look for the BOOT_IMAGE hint in the kernel cmdline +- elif echo "$kernel_cmdline" | grep -q 'BOOT_IMAGE='; then +- opt_kernel=$(echo "$kernel_cmdline" | grep -Eo 'BOOT_IMAGE=[^ ]+' | cut -d= -f2) ++ elif echo "$kernel_cmdline" | @grep@ -q 'BOOT_IMAGE='; then ++ opt_kernel=$(echo "$kernel_cmdline" | @grep@ -Eo 'BOOT_IMAGE=[^ ]+' | @cut@ -d= -f2) + _debug "found opt_kernel=$opt_kernel in $procfs/cmdline" + # if the boot partition is within a btrfs subvolume, strip the subvolume name + # if /boot is a separate subvolume, the remainder of the code in this section should handle it +- if echo "$opt_kernel" | grep -q "^/@"; then opt_kernel=$(echo "$opt_kernel" | sed "s:/@[^/]*::"); fi ++ if echo "$opt_kernel" | @grep@ -q "^/@"; then opt_kernel=$(echo "$opt_kernel" | @sed@ "s:/@[^/]*::"); fi + # if we have a dedicated /boot partition, our bootloader might have just called it / + # so try to prepend /boot and see if we find anything + [ -e "/boot/$opt_kernel" ] && opt_kernel="/boot/$opt_kernel" +@@ -2227,7 +2227,7 @@ if [ "$opt_live" = 1 ]; then + # if we didn't find a kernel, default to guessing + if [ ! -e "$opt_kernel" ]; then + # Fedora: +- [ -e "/lib/modules/$(uname -r)/vmlinuz" ] && opt_kernel="/lib/modules/$(uname -r)/vmlinuz" ++ [ -e "/lib/modules/$(@uname@ -r)/vmlinuz" ] && opt_kernel="/lib/modules/$(@uname@ -r)/vmlinuz" + # Slackware: + [ -e "/boot/vmlinuz" ] && opt_kernel="/boot/vmlinuz" + # Arch aarch64: +@@ -2241,24 +2241,24 @@ if [ "$opt_live" = 1 ]; then + # pine64 + [ -e "/boot/pine64/Image" ] && opt_kernel="/boot/pine64/Image" + # generic: +- [ -e "/boot/vmlinuz-$(uname -r)" ] && opt_kernel="/boot/vmlinuz-$(uname -r)" +- [ -e "/boot/kernel-$( uname -r)" ] && opt_kernel="/boot/kernel-$( uname -r)" +- [ -e "/boot/bzImage-$(uname -r)" ] && opt_kernel="/boot/bzImage-$(uname -r)" ++ [ -e "/boot/vmlinuz-$(@uname@ -r)" ] && opt_kernel="/boot/vmlinuz-$(@uname@ -r)" ++ [ -e "/boot/kernel-$( @uname@ -r)" ] && opt_kernel="/boot/kernel-$( @uname@ -r)" ++ [ -e "/boot/bzImage-$(@uname@ -r)" ] && opt_kernel="/boot/bzImage-$(@uname@ -r)" + # Gentoo: +- [ -e "/boot/kernel-genkernel-$(uname -m)-$(uname -r)" ] && opt_kernel="/boot/kernel-genkernel-$(uname -m)-$(uname -r)" ++ [ -e "/boot/kernel-genkernel-$(@uname@ -m)-$(@uname@ -r)" ] && opt_kernel="/boot/kernel-genkernel-$(@uname@ -m)-$(@uname@ -r)" + # NixOS: + [ -e "/run/booted-system/kernel" ] && opt_kernel="/run/booted-system/kernel" + # Guix System: + [ -e "/run/booted-system/kernel/bzImage" ] && opt_kernel="/run/booted-system/kernel/bzImage" + # systemd kernel-install: +- [ -e "/etc/machine-id" ] && [ -e "/boot/$(cat /etc/machine-id)/$(uname -r)/linux" ] && opt_kernel="/boot/$(cat /etc/machine-id)/$(uname -r)/linux" ++ [ -e "/etc/machine-id" ] && [ -e "/boot/$(@cat@ /etc/machine-id)/$(@uname@ -r)/linux" ] && opt_kernel="/boot/$(@cat@ /etc/machine-id)/$(@uname@ -r)/linux" + # Clear Linux: +- str_uname=$(uname -r) ++ str_uname=$(@uname@ -r) + clear_linux_kernel="/lib/kernel/org.clearlinux.${str_uname##*.}.${str_uname%.*}" + [ -e "$clear_linux_kernel" ] && opt_kernel=$clear_linux_kernel + # Custom Arch seems to have the kernel path in its cmdline in the form "\directory\kernelimage", + # with actual \'s instead of /'s: +- custom_arch_kernel=$(echo "$kernel_cmdline" | grep -Eo "(^|\s)\\\\[\\\\a-zA-Z0-9_.-]+" | tr "\\\\" "/" | tr -d '[:space:]') ++ custom_arch_kernel=$(echo "$kernel_cmdline" | @grep@ -Eo "(^|\s)\\\\[\\\\a-zA-Z0-9_.-]+" | @tr@ "\\\\" "/" | @tr@ -d '[:space:]') + if [ -n "$custom_arch_kernel" ] && [ -e "$custom_arch_kernel" ]; then + opt_kernel="$custom_arch_kernel" + fi +@@ -2272,12 +2272,12 @@ if [ "$opt_live" = 1 ]; then + : + elif [ -e "$procfs/kallsyms" ] ; then + opt_map="$procfs/kallsyms" +- elif [ -e "/lib/modules/$(uname -r)/System.map" ] ; then +- opt_map="/lib/modules/$(uname -r)/System.map" +- elif [ -e "/boot/System.map-$(uname -r)" ] ; then +- opt_map="/boot/System.map-$(uname -r)" +- elif [ -e "/lib/kernel/System.map-$(uname -r)" ]; then +- opt_map="/lib/kernel/System.map-$(uname -r)" ++ elif [ -e "/lib/modules/$(@uname@ -r)/System.map" ] ; then ++ opt_map="/lib/modules/$(@uname@ -r)/System.map" ++ elif [ -e "/boot/System.map-$(@uname@ -r)" ] ; then ++ opt_map="/boot/System.map-$(@uname@ -r)" ++ elif [ -e "/lib/kernel/System.map-$(@uname@ -r)" ]; then ++ opt_map="/lib/kernel/System.map-$(@uname@ -r)" + fi + + # config +@@ -2285,18 +2285,18 @@ if [ "$opt_live" = 1 ]; then + # specified by user on cmdline, with --live, don't override + : + elif [ -e "$procfs/config.gz" ] ; then +- dumped_config="$(mktemp -t smc-config-XXXXXX)" +- gunzip -c "$procfs/config.gz" > "$dumped_config" ++ dumped_config="$(@mktemp@ -t smc-config-XXXXXX)" ++ @gunzip@ -c "$procfs/config.gz" > "$dumped_config" + # dumped_config will be deleted at the end of the script + opt_config="$dumped_config" +- elif [ -e "/lib/modules/$(uname -r)/config" ]; then +- opt_config="/lib/modules/$(uname -r)/config" +- elif [ -e "/boot/config-$(uname -r)" ]; then +- opt_config="/boot/config-$(uname -r)" +- elif [ -e "/etc/kernels/kernel-config-$(uname -m)-$(uname -r)" ]; then +- opt_config="/etc/kernels/kernel-config-$(uname -m)-$(uname -r)" +- elif [ -e "/lib/kernel/config-$(uname -r)" ]; then +- opt_config="/lib/kernel/config-$(uname -r)" ++ elif [ -e "/lib/modules/$(@uname@ -r)/config" ]; then ++ opt_config="/lib/modules/$(@uname@ -r)/config" ++ elif [ -e "/boot/config-$(@uname@ -r)" ]; then ++ opt_config="/boot/config-$(@uname@ -r)" ++ elif [ -e "/etc/kernels/kernel-config-$(@uname@ -m)-$(@uname@ -r)" ]; then ++ opt_config="/etc/kernels/kernel-config-$(@uname@ -m)-$(@uname@ -r)" ++ elif [ -e "/lib/kernel/config-$(@uname@ -r)" ]; then ++ opt_config="/lib/kernel/config-$(@uname@ -r)" + fi + else + _info "Checking for vulnerabilities against specified kernel" +@@ -2311,7 +2311,7 @@ else + fi + + if [ "$os" = Linux ]; then +- if [ -n "$opt_config" ] && ! grep -q '^CONFIG_' "$opt_config"; then ++ if [ -n "$opt_config" ] && ! @grep@ -q '^CONFIG_' "$opt_config"; then + # given file is invalid! + _warn "The kernel config file seems invalid, was expecting a plain-text file, ignoring it!" + opt_config='' +@@ -2339,7 +2339,7 @@ if [ "$os" = Linux ]; then + fi + + if [ -e "$opt_kernel" ]; then +- if ! command -v "${opt_arch_prefix}readelf" >/dev/null 2>&1; then ++ if ! command -v "@readelf@" >/dev/null 2>&1; then + _debug "readelf not found" + kernel_err="missing '${opt_arch_prefix}readelf' tool, please install it, usually it's in the 'binutils' package" + elif [ "$opt_sysfs_only" = 1 ] || [ "$opt_hw_only" = 1 ]; then +@@ -2357,20 +2357,20 @@ else + # vanilla kernels have with ^Linux version + # also try harder with some kernels (such as Red Hat) that don't have ^Linux version before their version string + # and check for FreeBSD +- kernel_version=$("${opt_arch_prefix}strings" "$kernel" 2>/dev/null | grep -E \ ++ kernel_version=$("@strings@" "$kernel" 2>/dev/null | @grep@ -E \ + -e '^Linux version ' \ + -e '^[[:alnum:]][^[:space:]]+ \([^[:space:]]+\) #[0-9]+ .+ (19|20)[0-9][0-9]$' \ +- -e '^FreeBSD [0-9]' | head -1) ++ -e '^FreeBSD [0-9]' | @head@ -1) + if [ -z "$kernel_version" ]; then + # try even harder with some kernels (such as ARM) that split the release (uname -r) and version (uname -v) in 2 adjacent strings +- kernel_version=$("${opt_arch_prefix}strings" "$kernel" 2>/dev/null | grep -E -B1 '^#[0-9]+ .+ (19|20)[0-9][0-9]$' | tr "\n" " ") ++ kernel_version=$("@strings@" "$kernel" 2>/dev/null | @grep@ -E -B1 '^#[0-9]+ .+ (19|20)[0-9][0-9]$' | @tr@ "\n" " ") + fi + if [ -n "$kernel_version" ]; then + # in live mode, check if the img we found is the correct one + if [ "$opt_live" = 1 ]; then + _verbose "Kernel image is \033[35m$kernel_version" +- if ! echo "$kernel_version" | grep -qF "$(uname -r)"; then +- _warn "Possible discrepancy between your running kernel '$(uname -r)' and the image '$kernel_version' we found ($opt_kernel), results might be incorrect" ++ if ! echo "$kernel_version" | @grep@ -qF "$(@uname@ -r)"; then ++ _warn "Possible discrepancy between your running kernel '$(@uname@ -r)' and the image '$kernel_version' we found ($opt_kernel), results might be incorrect" + fi + else + _info "Kernel image is \033[35m$kernel_version" +@@ -2398,11 +2398,11 @@ sys_interface_check() + if [ "$opt_live" = 1 ] && [ "$opt_no_sysfs" = 0 ] && [ -r "$file" ]; then + : + else +- mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_SYSFS_$(basename "$file")_RET=1") ++ mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_SYSFS_$(@basename@ "$file")_RET=1") + return 1 + fi + +- _mockvarname="SMC_MOCK_SYSFS_$(basename "$file")_RET" ++ _mockvarname="SMC_MOCK_SYSFS_$(@basename@ "$file")_RET" + # shellcheck disable=SC2086,SC1083 + if [ -n "$(eval echo \${$_mockvarname:-})" ]; then + _debug "sysfs: MOCKING enabled for $file func returns $(eval echo \$$_mockvarname)" +@@ -2411,17 +2411,17 @@ sys_interface_check() + fi + + [ -n "$regex" ] || regex='.*' +- _mockvarname="SMC_MOCK_SYSFS_$(basename "$file")" ++ _mockvarname="SMC_MOCK_SYSFS_$(@basename@ "$file")" + # shellcheck disable=SC2086,SC1083 + if [ -n "$(eval echo \${$_mockvarname:-})" ]; then + fullmsg="$(eval echo \$$_mockvarname)" +- msg=$(echo "$fullmsg" | grep -Eo "$regex") ++ msg=$(echo "$fullmsg" | @grep@ -Eo "$regex") + _debug "sysfs: MOCKING enabled for $file, will return $fullmsg" + mocked=1 + else +- fullmsg=$(cat "$file") +- msg=$(grep -Eo "$regex" "$file") +- mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_SYSFS_$(basename "$file")='$fullmsg'") ++ fullmsg=$(@cat@ "$file") ++ msg=$(@grep@ -Eo "$regex" "$file") ++ mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_SYSFS_$(@basename@ "$file")='$fullmsg'") + fi + if [ "$mode" = silent ]; then + return 0 +@@ -2430,15 +2430,15 @@ sys_interface_check() + return 0 + fi + _info_nol "* Mitigated according to the /sys interface: " +- if echo "$msg" | grep -qi '^not affected'; then ++ if echo "$msg" | @grep@ -qi '^not affected'; then + # Not affected + status=OK + pstatus green YES "$fullmsg" +- elif echo "$msg" | grep -qEi '^(kvm: )?mitigation'; then ++ elif echo "$msg" | @grep@ -qEi '^(kvm: )?mitigation'; then + # Mitigation: PTI + status=OK + pstatus green YES "$fullmsg" +- elif echo "$msg" | grep -qi '^vulnerable'; then ++ elif echo "$msg" | @grep@ -qi '^vulnerable'; then + # Vulnerable + status=VULN + pstatus yellow NO "$fullmsg" +@@ -2526,20 +2526,20 @@ write_msr_one_core() + # ret=4: msr doesn't exist, ret=127: msr.allow_writes=off + [ "$ret" = 127 ] && _write_denied=1 + # or fallback to dd if it supports seek_bytes, we prefer it over perl because we can tell the difference between EPERM and EIO +- elif dd if=/dev/null of=/dev/null bs=8 count=1 seek="$_msr_dec" oflag=seek_bytes 2>/dev/null && [ "${SMC_NO_DD:-}" != 1 ]; then ++ elif @dd@ if=/dev/null of=/dev/null bs=8 count=1 seek="$_msr_dec" oflag=seek_bytes 2>/dev/null && [ "${SMC_NO_DD:-}" != 1 ]; then + _debug "write_msr: using dd" +- dd if=/dev/zero of=/dev/cpu/"$_core"/msr bs=8 count=1 seek="$_msr_dec" oflag=seek_bytes 2>/dev/null; ret=$? ++ @dd@ if=/dev/zero of=/dev/cpu/"$_core"/msr bs=8 count=1 seek="$_msr_dec" oflag=seek_bytes 2>/dev/null; ret=$? + # if it failed, inspect stderrto look for EPERM + if [ "$ret" != 0 ]; then +- if dd if=/dev/zero of=/dev/cpu/"$_core"/msr bs=8 count=1 seek="$_msr_dec" oflag=seek_bytes 2>&1 | grep -qF 'Operation not permitted'; then ++ if @dd@ if=/dev/zero of=/dev/cpu/"$_core"/msr bs=8 count=1 seek="$_msr_dec" oflag=seek_bytes 2>&1 | @grep@ -qF 'Operation not permitted'; then + _write_denied=1 + fi + fi + # or if we have perl, use it, any 5.x version will work +- elif command -v perl >/dev/null 2>&1 && [ "${SMC_NO_PERL:-}" != 1 ]; then ++ elif command -v @perl@ >/dev/null 2>&1 && [ "${SMC_NO_PERL:-}" != 1 ]; then + _debug "write_msr: using perl" + ret=1 +- perl -e "open(M,'>','/dev/cpu/$_core/msr') and seek(M,$_msr_dec,0) and exit(syswrite(M,pack('H16',0)))"; [ $? -eq 8 ] && ret=0 ++ @perl@ -e "open(M,'>','/dev/cpu/$_core/msr') and seek(M,$_msr_dec,0) and exit(syswrite(M,pack('H16',0)))"; [ $? -eq 8 ] && ret=0 + else + _debug "write_msr: got no wrmsr, perl or recent enough dd!" + mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_WRMSR_${_msr}_RET=$WRITE_MSR_RET_ERR") +@@ -2561,13 +2561,13 @@ write_msr_one_core() + msr_locked_down=1 + write_msr_msg="your kernel is configured to deny writes to MSRs from user space" + return $WRITE_MSR_RET_LOCKDOWN +- elif dmesg | grep -qF "msr: Direct access to MSR"; then ++ elif @dmesg@ | @grep@ -qF "msr: Direct access to MSR"; then + _debug "write_msr: locked down kernel detected (Red Hat / Fedora)" + mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_WRMSR_${_msr}_RET=$WRITE_MSR_RET_LOCKDOWN") + msr_locked_down=1 + write_msr_msg="your kernel is locked down (Fedora/Red Hat), please reboot without secure boot and retry" + return $WRITE_MSR_RET_LOCKDOWN +- elif dmesg | grep -qF "raw MSR access is restricted"; then ++ elif @dmesg@ | @grep@ -qF "raw MSR access is restricted"; then + _debug "write_msr: locked down kernel detected (vanilla)" + mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_WRMSR_${_msr}_RET=$WRITE_MSR_RET_LOCKDOWN") + msr_locked_down=1 +@@ -2666,8 +2666,8 @@ read_msr_one_core() + return $READ_MSR_RET_KO + fi + # MSR 0x10: 0x000003e1 0xb106dded +- _msr_h=$(echo "$_msr" | awk '{print $3}'); +- _msr_l=$(echo "$_msr" | awk '{print $4}'); ++ _msr_h=$(echo "$_msr" | @awk@ '{print $3}'); ++ _msr_l=$(echo "$_msr" | @awk@ '{print $4}'); + read_msr_value=$(( _msr_h << 32 | _msr_l )) + else + # for Linux +@@ -2678,15 +2678,15 @@ read_msr_one_core() + # if rdmsr is available, use it + elif command -v rdmsr >/dev/null 2>&1 && [ "${SMC_NO_RDMSR:-}" != 1 ]; then + _debug "read_msr: using rdmsr on $_msr" +- read_msr_value=$(rdmsr -r $_msr_dec 2>/dev/null | od -t u8 -A n) ++ read_msr_value=$(rdmsr -r $_msr_dec 2>/dev/null | @od@ -t u8 -A n) + # or if we have perl, use it, any 5.x version will work +- elif command -v perl >/dev/null 2>&1 && [ "${SMC_NO_PERL:-}" != 1 ]; then ++ elif command -v @perl@ >/dev/null 2>&1 && [ "${SMC_NO_PERL:-}" != 1 ]; then + _debug "read_msr: using perl on $_msr" +- read_msr_value=$(perl -e "open(M,'<','/dev/cpu/$_core/msr') and seek(M,$_msr_dec,0) and read(M,\$_,8) and print" | od -t u8 -A n) ++ read_msr_value=$(@perl@ -e "open(M,'<','/dev/cpu/$_core/msr') and seek(M,$_msr_dec,0) and read(M,\$_,8) and print" | @od@ -t u8 -A n) + # fallback to dd if it supports skip_bytes +- elif dd if=/dev/null of=/dev/null bs=8 count=1 skip="$_msr_dec" iflag=skip_bytes 2>/dev/null; then ++ elif @dd@ if=/dev/null of=/dev/null bs=8 count=1 skip="$_msr_dec" iflag=skip_bytes 2>/dev/null; then + _debug "read_msr: using dd on $_msr" +- read_msr_value=$(dd if=/dev/cpu/"$_core"/msr bs=8 count=1 skip="$_msr_dec" iflag=skip_bytes 2>/dev/null | od -t u8 -A n) ++ read_msr_value=$(@dd@ if=/dev/cpu/"$_core"/msr bs=8 count=1 skip="$_msr_dec" iflag=skip_bytes 2>/dev/null | @od@ -t u8 -A n) + else + _debug "read_msr: got no rdmsr, perl or recent enough dd!" + mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_RDMSR_${_msr}_RET=$READ_MSR_RET_ERR") +@@ -2710,7 +2710,7 @@ check_cpu() + { + _info "\033[1;34mHardware check\033[0m" + +- if ! uname -m | grep -qwE 'x86_64|i[3-6]86|amd64'; then ++ if ! @uname@ -m | @grep@ -qwE 'x86_64|i[3-6]86|amd64'; then + return + fi + +@@ -3326,19 +3326,19 @@ check_redhat_canonical_spectre() + # if we were already called, don't do it again + [ -n "${redhat_canonical_spectre:-}" ] && return + +- if ! command -v "${opt_arch_prefix}strings" >/dev/null 2>&1; then ++ if ! command -v "@strings@" >/dev/null 2>&1; then + redhat_canonical_spectre=-1 + elif [ -n "$kernel_err" ]; then + redhat_canonical_spectre=-2 + else + # Red Hat / Ubuntu specific variant1 patch is difficult to detect, + # let's use the two same tricks than the official Red Hat detection script uses: +- if "${opt_arch_prefix}strings" "$kernel" | grep -qw noibrs && "${opt_arch_prefix}strings" "$kernel" | grep -qw noibpb; then ++ if "@strings@" "$kernel" | @grep@ -qw noibrs && "@strings@" "$kernel" | @grep@ -qw noibpb; then + # 1) detect their specific variant2 patch. If it's present, it means + # that the variant1 patch is also present (both were merged at the same time) + _debug "found redhat/canonical version of the variant2 patch (implies variant1)" + redhat_canonical_spectre=1 +- elif "${opt_arch_prefix}strings" "$kernel" | grep -q 'x86/pti:'; then ++ elif "@strings@" "$kernel" | @grep@ -q 'x86/pti:'; then + # 2) detect their specific variant3 patch. If it's present, but the variant2 + # is not, it means that only variant1 is present in addition to variant3 + _debug "found redhat/canonical version of the variant3 patch (implies variant1 but not variant2)" +@@ -3363,13 +3363,13 @@ check_has_vmm() + # If we find no evidence that this is the case, assume we're not (to avoid scaring users), + # this can always be overridden with --vmm in any case. + has_vmm=0 +- if command -v pgrep >/dev/null 2>&1; then ++ if command -v @pgrep@ >/dev/null 2>&1; then + # remove xenbus and xenwatch, also present inside domU + # remove libvirtd as it can also be used to manage containers and not VMs + # for each binary we want to grep, get the pids + for _binary in qemu kvm xenstored xenconsoled + do +- for _pid in $(pgrep -x $_binary) ++ for _pid in $(@pgrep@ -x $_binary) + do + # resolve the exe symlink, if it doesn't resolve with -m, + # which doesn't even need the dest to exist, it means the symlink +@@ -3385,7 +3385,7 @@ check_has_vmm() + else + # ignore SC2009 as `ps ax` is actually used as a fallback if `pgrep` isn't installed + # shellcheck disable=SC2009 +- if command -v ps >/devnull && ps ax | grep -vw grep | grep -q -e '\/devnull && ps ax | @grep@ -vw grep | @grep@ -q -e '\/dev/null 2>&1; then ++ elif ! command -v @perl@ >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing 'perl' binary, please install it" + else +- perl -ne '/\x0f\x83....\x48\x19\xd2\x48\x21\xd0/ and $found++; END { exit($found) }' "$kernel"; ret=$? ++ @perl@ -ne '/\x0f\x83....\x48\x19\xd2\x48\x21\xd0/ and $found++; END { exit($found) }' "$kernel"; ret=$? + if [ $ret -gt 0 ]; then + pstatus green YES "$ret occurrence(s) found of x86 64 bits array_index_mask_nospec()" + v1_mask_nospec="x86 64 bits array_index_mask_nospec" + else +- perl -ne '/\x3b\x82..\x00\x00\x73.\x19\xd2\x21\xd0/ and $found++; END { exit($found) }' "$kernel"; ret=$? ++ @perl@ -ne '/\x3b\x82..\x00\x00\x73.\x19\xd2\x21\xd0/ and $found++; END { exit($found) }' "$kernel"; ret=$? + if [ $ret -gt 0 ]; then + pstatus green YES "$ret occurrence(s) found of x86 32 bits array_index_mask_nospec()" + v1_mask_nospec="x86 32 bits array_index_mask_nospec" + else +- ret=$("${opt_arch_prefix}objdump" $objdump_options "$kernel" | grep -w -e f3af8014 -e e320f014 -B2 | grep -B1 -w sbc | grep -w -c cmp) ++ ret=$("@objdump@" $objdump_options "$kernel" | @grep@ -w -e f3af8014 -e e320f014 -B2 | @grep@ -B1 -w sbc | @grep@ -w -c cmp) + if [ "$ret" -gt 0 ]; then + pstatus green YES "$ret occurrence(s) found of arm 32 bits array_index_mask_nospec()" + v1_mask_nospec="arm 32 bits array_index_mask_nospec" +@@ -3526,12 +3526,12 @@ check_CVE_2017_5753_linux() + pstatus yellow NO + elif [ -n "$kernel_err" ]; then + pstatus yellow UNKNOWN "couldn't check ($kernel_err)" +- elif ! command -v perl >/dev/null 2>&1; then ++ elif ! command -v @perl@ >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing 'perl' binary, please install it" +- elif ! command -v "${opt_arch_prefix}objdump" >/dev/null 2>&1; then ++ elif ! command -v "@objdump@" >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing '${opt_arch_prefix}objdump' tool, please install it, usually it's in the binutils package" + else +- "${opt_arch_prefix}objdump" $objdump_options "$kernel" | perl -ne 'push @r, $_; /\s(hint|csdb)\s/ && $r[0]=~/\ssub\s+(x\d+)/ && $r[1]=~/\sbic\s+$1,\s+$1,/ && $r[2]=~/\sand\s/ && exit(9); shift @r if @r>3'; ret=$? ++ "@objdump@" $objdump_options "$kernel" | @perl@ -ne 'push @r, $_; /\s(hint|csdb)\s/ && $r[0]=~/\ssub\s+(x\d+)/ && $r[1]=~/\sbic\s+$1,\s+$1,/ && $r[2]=~/\sand\s/ && exit(9); shift @r if @r>3'; ret=$? + if [ "$ret" -eq 9 ]; then + pstatus green YES "mask_nospec64 macro is present and used" + v1_mask_nospec="arm64 mask_nospec64" +@@ -3553,12 +3553,12 @@ check_CVE_2017_5753_linux() + pstatus yellow NO + elif [ -n "$kernel_err" ]; then + pstatus yellow UNKNOWN "couldn't check ($kernel_err)" +- elif ! command -v perl >/dev/null 2>&1; then ++ elif ! command -v @perl@ >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing 'perl' binary, please install it" +- elif ! command -v "${opt_arch_prefix}objdump" >/dev/null 2>&1; then ++ elif ! command -v "@objdump@" >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing '${opt_arch_prefix}objdump' tool, please install it, usually it's in the binutils package" + else +- "${opt_arch_prefix}objdump" -d "$kernel" | perl -ne 'push @r, $_; /\s(hint|csdb)\s/ && $r[0]=~/\smov\s+(w\d+),\s+(w\d+)/ && $r[1]=~/\scmp\s+(x\d+),\s+(x\d+)/ && $r[2]=~/\sngc\s+$2,/ && exit(9); shift @r if @r>3'; ret=$? ++ "@objdump@" -d "$kernel" | @perl@ -ne 'push @r, $_; /\s(hint|csdb)\s/ && $r[0]=~/\smov\s+(w\d+),\s+(w\d+)/ && $r[1]=~/\scmp\s+(x\d+),\s+(x\d+)/ && $r[2]=~/\sngc\s+$2,/ && exit(9); shift @r if @r>3'; ret=$? + if [ "$ret" -eq 9 ]; then + pstatus green YES "array_index_nospec macro is present and used" + v1_mask_nospec="arm64 array_index_nospec" +@@ -3574,7 +3574,7 @@ check_CVE_2017_5753_linux() + if [ -n "$kernel_err" ]; then + pstatus yellow UNKNOWN "couldn't check ($kernel_err)" + else +- if ! command -v "${opt_arch_prefix}objdump" >/dev/null 2>&1; then ++ if ! command -v "@objdump@" >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing '${opt_arch_prefix}objdump' tool, please install it, usually it's in the binutils package" + else + # here we disassemble the kernel and count the number of occurrences of the LFENCE opcode +@@ -3584,7 +3584,7 @@ check_CVE_2017_5753_linux() + # so let's push the threshold to 70. + # v0.33+: now only count lfence opcodes after a jump, way less error-prone + # non patched kernel have between 0 and 20 matches, patched ones have at least 40-45 +- nb_lfence=$("${opt_arch_prefix}objdump" $objdump_options "$kernel" 2>/dev/null | grep -w -B1 lfence | grep -Ewc 'jmp|jne|je') ++ nb_lfence=$("@objdump@" $objdump_options "$kernel" 2>/dev/null | @grep@ -w -B1 lfence | @grep@ -Ewc 'jmp|jne|je') + if [ "$nb_lfence" -lt 30 ]; then + pstatus yellow NO "only $nb_lfence jump-then-lfence instructions found, should be >= 30 (heuristic)" + else +@@ -3655,7 +3655,7 @@ check_CVE_2017_5715() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2017_5715_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2017_5715_bsd + else + _warn "Unsupported OS ($os)" +@@ -3697,13 +3697,13 @@ check_CVE_2017_5715_linux() + # /proc/sys/kernel/ibrs_enabled: OpenSUSE tumbleweed + specex_knob_dir=$dir + ibrs_supported="$dir/ibrs_enabled exists" +- ibrs_enabled=$(cat "$dir/ibrs_enabled" 2>/dev/null) ++ ibrs_enabled=$(@cat@ "$dir/ibrs_enabled" 2>/dev/null) + _debug "ibrs: found $dir/ibrs_enabled=$ibrs_enabled" + # if ibrs_enabled is there, ibpb_enabled will be in the same dir + if [ -e "$dir/ibpb_enabled" ]; then + # if the file is there, we have IBPB compiled-in (see note above for IBRS) + ibpb_supported="$dir/ibpb_enabled exists" +- ibpb_enabled=$(cat "$dir/ibpb_enabled" 2>/dev/null) ++ ibpb_enabled=$(@cat@ "$dir/ibpb_enabled" 2>/dev/null) + _debug "ibpb: found $dir/ibpb_enabled=$ibpb_enabled" + else + _debug "ibpb: $dir/ibpb_enabled file doesn't exist" +@@ -3718,7 +3718,7 @@ check_CVE_2017_5715_linux() + # which in that case means ibrs is supported *and* enabled for kernel & user + # as per the ibrs patch series v3 + if [ -z "$ibrs_supported" ]; then +- if grep ^flags "$procfs/cpuinfo" | grep -qw spec_ctrl_ibrs; then ++ if @grep@ ^flags "$procfs/cpuinfo" | @grep@ -qw spec_ctrl_ibrs; then + _debug "ibrs: found spec_ctrl_ibrs flag in $procfs/cpuinfo" + ibrs_supported="spec_ctrl_ibrs flag in $procfs/cpuinfo" + # enabled=2 -> kernel & user +@@ -3728,13 +3728,13 @@ check_CVE_2017_5715_linux() + fi + if [ -n "$fullmsg" ]; then + # when IBPB is enabled on 4.15+, we can see it in sysfs +- if echo "$fullmsg" | grep -q 'IBPB'; then ++ if echo "$fullmsg" | @grep@ -q 'IBPB'; then + _debug "ibpb: found enabled in sysfs" + [ -z "$ibpb_supported" ] && ibpb_supported='IBPB found enabled in sysfs' + [ -z "$ibpb_enabled" ] && ibpb_enabled=1 + fi + # when IBRS_FW is enabled on 4.15+, we can see it in sysfs +- if echo "$fullmsg" | grep -q ', IBRS_FW'; then ++ if echo "$fullmsg" | @grep@ -q ', IBRS_FW'; then + _debug "ibrs: found IBRS_FW in sysfs" + [ -z "$ibrs_supported" ] && ibrs_supported='found IBRS_FW in sysfs' + ibrs_fw_enabled=1 +@@ -3742,13 +3742,13 @@ check_CVE_2017_5715_linux() + # when IBRS is enabled on 4.15+, we can see it in sysfs + # on a more recent kernel, classic "IBRS" is not even longer an option, because of the performance impact. + # only "Enhanced IBRS" is available (on CPUs with the IBRS_ALL flag) +- if echo "$fullmsg" | grep -q -e '\' -e 'Indirect Branch Restricted Speculation'; then ++ if echo "$fullmsg" | @grep@ -q -e '\' -e 'Indirect Branch Restricted Speculation'; then + _debug "ibrs: found IBRS in sysfs" + [ -z "$ibrs_supported" ] && ibrs_supported='found IBRS in sysfs' + [ -z "$ibrs_enabled" ] && ibrs_enabled=3 + fi + # checking for 'Enhanced IBRS' in sysfs, enabled on CPUs with IBRS_ALL +- if echo "$fullmsg" | grep -q -e 'Enhanced IBRS'; then ++ if echo "$fullmsg" | @grep@ -q -e 'Enhanced IBRS'; then + [ -z "$ibrs_supported" ] && ibrs_supported='found Enhanced IBRS in sysfs' + # 4 isn't actually a valid value of the now extinct "ibrs_enabled" flag file, + # that only went from 0 to 3, so we use 4 as "enhanced ibrs is enabled" +@@ -3767,11 +3767,11 @@ check_CVE_2017_5715_linux() + fi + fi + if [ -z "$ibrs_supported" ] && [ -n "$kernel" ]; then +- if ! command -v "${opt_arch_prefix}strings" >/dev/null 2>&1; then ++ if ! command -v "@strings@" >/dev/null 2>&1; then + : + else + ibrs_can_tell=1 +- ibrs_supported=$("${opt_arch_prefix}strings" "$kernel" | grep -Fw -e ', IBRS_FW' | head -1) ++ ibrs_supported=$("@strings@" "$kernel" | @grep@ -Fw -e ', IBRS_FW' | @head@ -1) + if [ -n "$ibrs_supported" ]; then + _debug "ibrs: found ibrs evidence in kernel image ($ibrs_supported)" + ibrs_supported="found '$ibrs_supported' in kernel image" +@@ -3780,7 +3780,7 @@ check_CVE_2017_5715_linux() + fi + if [ -z "$ibrs_supported" ] && [ -n "$opt_map" ]; then + ibrs_can_tell=1 +- if grep -q spec_ctrl "$opt_map"; then ++ if @grep@ -q spec_ctrl "$opt_map"; then + ibrs_supported="found spec_ctrl in symbols file" + _debug "ibrs: found '*spec_ctrl*' symbol in $opt_map" + fi +@@ -3788,11 +3788,11 @@ check_CVE_2017_5715_linux() + # recent (4.15) vanilla kernels have IBPB but not IBRS, and without the debugfs tunables of Red Hat + # we can detect it directly in the image + if [ -z "$ibpb_supported" ] && [ -n "$kernel" ]; then +- if ! command -v "${opt_arch_prefix}strings" >/dev/null 2>&1; then ++ if ! command -v "@strings@" >/dev/null 2>&1; then + : + else + ibpb_can_tell=1 +- ibpb_supported=$("${opt_arch_prefix}strings" "$kernel" | grep -Fw -e 'ibpb' -e ', IBPB' | head -1) ++ ibpb_supported=$("@strings@" "$kernel" | @grep@ -Fw -e 'ibpb' -e ', IBPB' | @head@ -1) + if [ -n "$ibpb_supported" ]; then + _debug "ibpb: found ibpb evidence in kernel image ($ibpb_supported)" + ibpb_supported="found '$ibpb_supported' in kernel image" +@@ -3841,9 +3841,9 @@ check_CVE_2017_5715_linux() + 2) if [ "$ibrs_fw_enabled" = 1 ]; then pstatus green YES "for kernel, user space, and firmware code" ; else pstatus green YES "for both kernel and user space"; fi;; + 3) if [ "$ibrs_fw_enabled" = 1 ]; then pstatus green YES "for kernel and firmware code"; else pstatus green YES; fi;; + 4) pstatus green YES "Enhanced flavor, performance impact will be greatly reduced";; +- *) if [ "$cpuid_ibrs" != 'SPEC_CTRL' ] && [ "$cpuid_ibrs" != 'IBRS_SUPPORT' ] && [ "$cpuid_spec_ctrl" != -1 ]; +- then pstatus yellow NO; _debug "ibrs: known cpu not supporting SPEC-CTRL or IBRS"; +- else ++ *) if [ "$cpuid_ibrs" != 'SPEC_CTRL' ] && [ "$cpuid_ibrs" != 'IBRS_SUPPORT' ] && [ "$cpuid_spec_ctrl" != -1 ]; ++ then pstatus yellow NO; _debug "ibrs: known cpu not supporting SPEC-CTRL or IBRS"; ++ else + pstatus yellow UNKNOWN; fi;; + esac + fi +@@ -3894,7 +3894,7 @@ check_CVE_2017_5715_linux() + bp_harden='' + if [ -r "$opt_config" ]; then + bp_harden_can_tell=1 +- bp_harden=$(grep -w 'CONFIG_HARDEN_BRANCH_PREDICTOR=y' "$opt_config") ++ bp_harden=$(@grep@ -w 'CONFIG_HARDEN_BRANCH_PREDICTOR=y' "$opt_config") + if [ -n "$bp_harden" ]; then + pstatus green YES + _debug "bp_harden: found '$bp_harden' in $opt_config" +@@ -3902,7 +3902,7 @@ check_CVE_2017_5715_linux() + fi + if [ -z "$bp_harden" ] && [ -n "$opt_map" ]; then + bp_harden_can_tell=1 +- bp_harden=$(grep -w bp_hardening_data "$opt_map") ++ bp_harden=$(@grep@ -w bp_hardening_data "$opt_map") + if [ -n "$bp_harden" ]; then + pstatus green YES + _debug "bp_harden: found '$bp_harden' in $opt_map" +@@ -3920,11 +3920,11 @@ check_CVE_2017_5715_linux() + # We check the RETPOLINE kernel options + retpoline=0 + if [ -r "$opt_config" ]; then +- if grep -q '^CONFIG_RETPOLINE=y' "$opt_config"; then ++ if @grep@ -q '^CONFIG_RETPOLINE=y' "$opt_config"; then + pstatus green YES + retpoline=1 + # shellcheck disable=SC2046 +- _debug 'retpoline: found '$(grep '^CONFIG_RETPOLINE' "$opt_config")" in $opt_config" ++ _debug 'retpoline: found '$(@grep@ '^CONFIG_RETPOLINE' "$opt_config")" in $opt_config" + else + pstatus yellow NO + fi +@@ -3945,8 +3945,8 @@ check_CVE_2017_5715_linux() + # since 5.15.28, this is now "Retpolines" as the implementation was switched to a generic one, + # so we look for both "retpoline" and "retpolines" + if [ "$opt_live" = 1 ] && [ -n "$fullmsg" ]; then +- if echo "$fullmsg" | grep -qwi -e retpoline -e retpolines; then +- if echo "$fullmsg" | grep -qwi minimal; then ++ if echo "$fullmsg" | @grep@ -qwi -e retpoline -e retpolines; then ++ if echo "$fullmsg" | @grep@ -qwi minimal; then + retpoline_compiler=0 + retpoline_compiler_reason="kernel reports minimal retpoline compilation" + else +@@ -3956,19 +3956,19 @@ check_CVE_2017_5715_linux() + fi + elif [ -n "$opt_map" ]; then + # look for the symbol +- if grep -qw noretpoline_setup "$opt_map"; then ++ if @grep@ -qw noretpoline_setup "$opt_map"; then + retpoline_compiler=1 + retpoline_compiler_reason="noretpoline_setup symbol found in System.map" + fi + elif [ -n "$kernel" ]; then + # look for the symbol +- if command -v "${opt_arch_prefix}nm" >/dev/null 2>&1; then ++ if command -v "@nm@" >/dev/null 2>&1; then + # the proper way: use nm and look for the symbol +- if "${opt_arch_prefix}nm" "$kernel" 2>/dev/null | grep -qw 'noretpoline_setup'; then ++ if "@nm@" "$kernel" 2>/dev/null | @grep@ -qw 'noretpoline_setup'; then + retpoline_compiler=1 + retpoline_compiler_reason="noretpoline_setup found in kernel symbols" + fi +- elif grep -q noretpoline_setup "$kernel"; then ++ elif @grep@ -q noretpoline_setup "$kernel"; then + # if we don't have nm, nevermind, the symbol name is long enough to not have + # any false positive using good old grep directly on the binary + retpoline_compiler=1 +@@ -3997,7 +3997,7 @@ check_CVE_2017_5715_linux() + retp_enabled=-1 + if [ "$opt_live" = 1 ]; then + if [ -e "$specex_knob_dir/retp_enabled" ]; then +- retp_enabled=$(cat "$specex_knob_dir/retp_enabled" 2>/dev/null) ++ retp_enabled=$(@cat@ "$specex_knob_dir/retp_enabled" 2>/dev/null) + _debug "retpoline: found $specex_knob_dir/retp_enabled=$retp_enabled" + _info_nol " * Retpoline is enabled: " + if [ "$retp_enabled" = 1 ]; then +@@ -4027,7 +4027,7 @@ check_CVE_2017_5715_linux() + rsb_filling=0 + if [ "$opt_live" = 1 ] && [ "$opt_no_sysfs" != 1 ]; then + # if we're live and we aren't denied looking into /sys, let's do it +- if echo "$msg" | grep -qw RSB; then ++ if echo "$msg" | @grep@ -qw RSB; then + rsb_filling=1 + pstatus green YES + fi +@@ -4036,7 +4036,7 @@ check_CVE_2017_5715_linux() + if [ -n "$kernel_err" ]; then + pstatus yellow UNKNOWN "couldn't check ($kernel_err)" + else +- if grep -qw -e 'Filling RSB on context switch' "$kernel"; then ++ if @grep@ -qw -e 'Filling RSB on context switch' "$kernel"; then + rsb_filling=1 + pstatus green YES + else +@@ -4198,7 +4198,7 @@ check_CVE_2017_5715_bsd() + { + _info "* Mitigation 1" + _info_nol " * Kernel supports IBRS: " +- ibrs_disabled=$(sysctl -n hw.ibrs_disable 2>/dev/null) ++ ibrs_disabled=$(@sysctl@ -n hw.ibrs_disable 2>/dev/null) + if [ -z "$ibrs_disabled" ]; then + pstatus yellow NO + else +@@ -4206,7 +4206,7 @@ check_CVE_2017_5715_bsd() + fi + + _info_nol " * IBRS enabled and active: " +- ibrs_active=$(sysctl -n hw.ibrs_active 2>/dev/null) ++ ibrs_active=$(@sysctl@ -n hw.ibrs_active 2>/dev/null) + if [ "$ibrs_active" = 1 ]; then + pstatus green YES + else +@@ -4219,10 +4219,10 @@ check_CVE_2017_5715_bsd() + if [ -n "$kernel_err" ]; then + pstatus yellow UNKNOWN "couldn't check ($kernel_err)" + else +- if ! command -v "${opt_arch_prefix}readelf" >/dev/null 2>&1; then ++ if ! command -v "@readelf@" >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing '${opt_arch_prefix}readelf' tool, please install it, usually it's in the binutils package" + else +- nb_thunks=$("${opt_arch_prefix}readelf" -s "$kernel" | grep -c -e __llvm_retpoline_ -e __llvm_external_retpoline_ -e __x86_indirect_thunk_) ++ nb_thunks=$("@readelf@" -s "$kernel" | @grep@ -c -e __llvm_retpoline_ -e __llvm_external_retpoline_ -e __x86_indirect_thunk_) + if [ "$nb_thunks" -gt 0 ]; then + retpoline=1 + pstatus green YES "found $nb_thunks thunk(s)" +@@ -4263,7 +4263,7 @@ check_CVE_2017_5715_bsd() + pti_performance_check() + { + _info_nol " * Reduced performance impact of PTI: " +- if [ -e "$procfs/cpuinfo" ] && grep ^flags "$procfs/cpuinfo" | grep -qw pcid; then ++ if [ -e "$procfs/cpuinfo" ] && @grep@ ^flags "$procfs/cpuinfo" | @grep@ -qw pcid; then + cpu_pcid=1 + else + read_cpuid 0x1 0x0 $ECX 17 1 1; ret=$? +@@ -4272,7 +4272,7 @@ pti_performance_check() + fi + fi + +- if [ -e "$procfs/cpuinfo" ] && grep ^flags "$procfs/cpuinfo" | grep -qw invpcid; then ++ if [ -e "$procfs/cpuinfo" ] && @grep@ ^flags "$procfs/cpuinfo" | @grep@ -qw invpcid; then + cpu_invpcid=1 + else + read_cpuid 0x7 0x0 $EBX 10 1 1; ret=$? +@@ -4297,7 +4297,7 @@ check_CVE_2017_5754() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2017_5754_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2017_5754_bsd + else + _warn "Unsupported OS ($os)" +@@ -4319,7 +4319,7 @@ check_CVE_2017_5754_linux() + kpti_can_tell=0 + if [ -n "$opt_config" ]; then + kpti_can_tell=1 +- kpti_support=$(grep -w -e CONFIG_PAGE_TABLE_ISOLATION=y -e CONFIG_KAISER=y -e CONFIG_UNMAP_KERNEL_AT_EL0=y "$opt_config") ++ kpti_support=$(@grep@ -w -e CONFIG_PAGE_TABLE_ISOLATION=y -e CONFIG_KAISER=y -e CONFIG_UNMAP_KERNEL_AT_EL0=y "$opt_config") + if [ -n "$kpti_support" ]; then + _debug "kpti_support: found option '$kpti_support' in $opt_config" + fi +@@ -4329,7 +4329,7 @@ check_CVE_2017_5754_linux() + # so we try to find an exported symbol that is part of the PTI patch in System.map + # parse_kpti: arm + kpti_can_tell=1 +- kpti_support=$(grep -w -e kpti_force_enabled -e parse_kpti "$opt_map") ++ kpti_support=$(@grep@ -w -e kpti_force_enabled -e parse_kpti "$opt_map") + if [ -n "$kpti_support" ]; then + _debug "kpti_support: found '$kpti_support' in $opt_map" + fi +@@ -4339,10 +4339,10 @@ check_CVE_2017_5754_linux() + # nopti option that is part of the patch (kernel command line option) + # 'kpti=': arm + kpti_can_tell=1 +- if ! command -v "${opt_arch_prefix}strings" >/dev/null 2>&1; then ++ if ! command -v "@strings@" >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing '${opt_arch_prefix}strings' tool, please install it, usually it's in the binutils package" + else +- kpti_support=$("${opt_arch_prefix}strings" "$kernel" | grep -w -e nopti -e kpti=) ++ kpti_support=$("@strings@" "$kernel" | @grep@ -w -e nopti -e kpti=) + if [ -n "$kpti_support" ]; then + _debug "kpti_support: found '$kpti_support' in $kernel" + fi +@@ -4369,20 +4369,20 @@ check_CVE_2017_5754_linux() + dmesg_grep="$dmesg_grep|x86/pti: Unmapping kernel while in userspace" + # aarch64 + dmesg_grep="$dmesg_grep|CPU features: detected( feature)?: Kernel page table isolation \(KPTI\)" +- if grep ^flags "$procfs/cpuinfo" | grep -qw pti; then ++ if @grep@ ^flags "$procfs/cpuinfo" | @grep@ -qw pti; then + # vanilla PTI patch sets the 'pti' flag in cpuinfo + _debug "kpti_enabled: found 'pti' flag in $procfs/cpuinfo" + kpti_enabled=1 +- elif grep ^flags "$procfs/cpuinfo" | grep -qw kaiser; then ++ elif @grep@ ^flags "$procfs/cpuinfo" | @grep@ -qw kaiser; then + # kernel line 4.9 sets the 'kaiser' flag in cpuinfo + _debug "kpti_enabled: found 'kaiser' flag in $procfs/cpuinfo" + kpti_enabled=1 + elif [ -e /sys/kernel/debug/x86/pti_enabled ]; then + # Red Hat Backport creates a dedicated file, see https://access.redhat.com/articles/3311301 +- kpti_enabled=$(cat /sys/kernel/debug/x86/pti_enabled 2>/dev/null) ++ kpti_enabled=$(@cat@ /sys/kernel/debug/x86/pti_enabled 2>/dev/null) + _debug "kpti_enabled: file /sys/kernel/debug/x86/pti_enabled exists and says: $kpti_enabled" + elif is_xen_dom0; then +- pti_xen_pv_domU=$(xl dmesg | grep 'XPTI' | grep 'DomU enabled' | head -1) ++ pti_xen_pv_domU=$(xl @dmesg@ | @grep@ 'XPTI' | @grep@ 'DomU enabled' | @head@ -1) + + [ -n "$pti_xen_pv_domU" ] && kpti_enabled=1 + fi +@@ -4457,7 +4457,7 @@ check_CVE_2017_5754_linux() + if [ -n "$kpti_support" ]; then + if [ -e "/sys/kernel/debug/x86/pti_enabled" ]; then + explain "Your kernel supports PTI but it's disabled, you can enable it with \`echo 1 > /sys/kernel/debug/x86/pti_enabled\`" +- elif echo "$kernel_cmdline" | grep -q -w -e nopti -e pti=off; then ++ elif echo "$kernel_cmdline" | @grep@ -q -w -e nopti -e pti=off; then + explain "Your kernel supports PTI but it has been disabled on command-line, remove the nopti or pti=off option from your bootloader configuration" + else + explain "Your kernel supports PTI but it has been disabled, check \`dmesg\` right after boot to find clues why the system disabled it" +@@ -4508,7 +4508,7 @@ check_CVE_2017_5754_linux() + check_CVE_2017_5754_bsd() + { + _info_nol "* Kernel supports Page Table Isolation (PTI): " +- kpti_enabled=$(sysctl -n vm.pmap.pti 2>/dev/null) ++ kpti_enabled=$(@sysctl@ -n vm.pmap.pti 2>/dev/null) + if [ -z "$kpti_enabled" ]; then + pstatus yellow NO + else +@@ -4579,7 +4579,7 @@ check_CVE_2018_3639() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2018_3639_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2018_3639_bsd + else + _warn "Unsupported OS ($os)" +@@ -4598,33 +4598,33 @@ check_CVE_2018_3639_linux() + if [ "$opt_sysfs_only" != 1 ]; then + _info_nol "* Kernel supports disabling speculative store bypass (SSB): " + if [ "$opt_live" = 1 ]; then +- if grep -Eq 'Speculation.?Store.?Bypass:' "$procfs/self/status" 2>/dev/null; then ++ if @grep@ -Eq 'Speculation.?Store.?Bypass:' "$procfs/self/status" 2>/dev/null; then + kernel_ssb="found in $procfs/self/status" + _debug "found Speculation.Store.Bypass: in $procfs/self/status" + fi + fi + # arm64 kernels can have cpu_show_spec_store_bypass with ARM64_SSBD, so exclude them +- if [ -z "$kernel_ssb" ] && [ -n "$kernel" ] && ! grep -q 'arm64_sys_' "$kernel"; then +- kernel_ssb=$("${opt_arch_prefix}strings" "$kernel" | grep spec_store_bypass | head -n1); ++ if [ -z "$kernel_ssb" ] && [ -n "$kernel" ] && ! @grep@ -q 'arm64_sys_' "$kernel"; then ++ kernel_ssb=$("@strings@" "$kernel" | @grep@ spec_store_bypass | @head@ -n1); + [ -n "$kernel_ssb" ] && kernel_ssb="found $kernel_ssb in kernel" + fi + # arm64 kernels can have cpu_show_spec_store_bypass with ARM64_SSBD, so exclude them +- if [ -z "$kernel_ssb" ] && [ -n "$opt_map" ] && ! grep -q 'arm64_sys_' "$opt_map"; then +- kernel_ssb=$(grep spec_store_bypass "$opt_map" | awk '{print $3}' | head -n1) ++ if [ -z "$kernel_ssb" ] && [ -n "$opt_map" ] && ! @grep@ -q 'arm64_sys_' "$opt_map"; then ++ kernel_ssb=$(@grep@ spec_store_bypass "$opt_map" | @awk@ '{print $3}' | @head@ -n1) + [ -n "$kernel_ssb" ] && kernel_ssb="found $kernel_ssb in System.map" + fi + # arm64 only: + if [ -z "$kernel_ssb" ] && [ -n "$opt_map" ]; then +- kernel_ssb=$(grep -w cpu_enable_ssbs "$opt_map" | awk '{print $3}' | head -n1) ++ kernel_ssb=$(@grep@ -w cpu_enable_ssbs "$opt_map" | @awk@ '{print $3}' | @head@ -n1) + [ -n "$kernel_ssb" ] && kernel_ssb="found $kernel_ssb in System.map" + fi + if [ -z "$kernel_ssb" ] && [ -n "$opt_config" ]; then +- kernel_ssb=$(grep -w 'CONFIG_ARM64_SSBD=y' "$opt_config") ++ kernel_ssb=$(@grep@ -w 'CONFIG_ARM64_SSBD=y' "$opt_config") + [ -n "$kernel_ssb" ] && kernel_ssb="CONFIG_ARM64_SSBD enabled in kconfig" + fi + if [ -z "$kernel_ssb" ] && [ -n "$kernel" ]; then + # this string only appears in kernel if CONFIG_ARM64_SSBD is set +- kernel_ssb=$(grep -w "Speculative Store Bypassing Safe (SSBS)" "$kernel") ++ kernel_ssb=$(@grep@ -w "Speculative Store Bypassing Safe (SSBS)" "$kernel") + [ -n "$kernel_ssb" ] && kernel_ssb="found 'Speculative Store Bypassing Safe (SSBS)' in kernel" + fi + # /arm64 only +@@ -4639,31 +4639,31 @@ check_CVE_2018_3639_linux() + if [ "$opt_live" = 1 ]; then + # https://elixir.bootlin.com/linux/v5.0/source/fs/proc/array.c#L340 + _info_nol "* SSB mitigation is enabled and active: " +- if grep -Eq 'Speculation.?Store.?Bypass:[[:space:]]+thread' "$procfs/self/status" 2>/dev/null; then ++ if @grep@ -Eq 'Speculation.?Store.?Bypass:[[:space:]]+thread' "$procfs/self/status" 2>/dev/null; then + kernel_ssbd_enabled=1 + pstatus green YES "per-thread through prctl" +- elif grep -Eq 'Speculation.?Store.?Bypass:[[:space:]]+globally mitigated' "$procfs/self/status" 2>/dev/null; then ++ elif @grep@ -Eq 'Speculation.?Store.?Bypass:[[:space:]]+globally mitigated' "$procfs/self/status" 2>/dev/null; then + kernel_ssbd_enabled=2 + pstatus green YES "global" +- elif grep -Eq 'Speculation.?Store.?Bypass:[[:space:]]+vulnerable' "$procfs/self/status" 2>/dev/null; then ++ elif @grep@ -Eq 'Speculation.?Store.?Bypass:[[:space:]]+vulnerable' "$procfs/self/status" 2>/dev/null; then + kernel_ssbd_enabled=0 + pstatus yellow NO +- elif grep -Eq 'Speculation.?Store.?Bypass:[[:space:]]+not vulnerable' "$procfs/self/status" 2>/dev/null; then ++ elif @grep@ -Eq 'Speculation.?Store.?Bypass:[[:space:]]+not vulnerable' "$procfs/self/status" 2>/dev/null; then + kernel_ssbd_enabled=-2 + pstatus blue NO "not vulnerable" +- elif grep -Eq 'Speculation.?Store.?Bypass:[[:space:]]+unknown' "$procfs/self/status" 2>/dev/null; then ++ elif @grep@ -Eq 'Speculation.?Store.?Bypass:[[:space:]]+unknown' "$procfs/self/status" 2>/dev/null; then + kernel_ssbd_enabled=0 + pstatus blue NO + else +- pstatus blue UNKNOWN "unknown value: $(grep -E 'Speculation.?Store.?Bypass:' "$procfs/self/status" 2>/dev/null | cut -d: -f2-)" ++ pstatus blue UNKNOWN "unknown value: $(@grep@ -E 'Speculation.?Store.?Bypass:' "$procfs/self/status" 2>/dev/null | @cut@ -d: -f2-)" + fi + + if [ "$kernel_ssbd_enabled" = 1 ]; then + _info_nol "* SSB mitigation currently active for selected processes: " + # silence grep's stderr here to avoid ENOENT errors from processes that have exited since the shell's expansion of the * +- mitigated_processes=$(find /proc -mindepth 2 -maxdepth 2 -type f -name status -print0 2>/dev/null \ +- | xargs -r0 grep -El 'Speculation.?Store.?Bypass:[[:space:]]+thread (force )?mitigated' 2>/dev/null \ +- | sed s/status/exe/ | xargs -r -n1 readlink -f 2>/dev/null | xargs -r -n1 basename | sort -u | tr "\n" " " | sed 's/ $//') ++ mitigated_processes=$(@find@ /proc -mindepth 2 -maxdepth 2 -type f -name status -print0 2>/dev/null \ ++ | @xargs@ -r0 @grep@ -El 'Speculation.?Store.?Bypass:[[:space:]]+thread (force )?mitigated' 2>/dev/null \ ++ | @sed@ s/status/exe/ | @xargs@ -r -n1 readlink -f 2>/dev/null | @xargs@ -r -n1 @basename@ | @sort@ -u | @tr@ "\n" " " | @sed@ 's/ $//') + if [ -n "$mitigated_processes" ]; then + pstatus green YES "$mitigated_processes" + else +@@ -4715,7 +4715,7 @@ check_CVE_2018_3639_linux() + check_CVE_2018_3639_bsd() + { + _info_nol "* Kernel supports speculation store bypass: " +- if sysctl hw.spec_store_bypass_disable >/dev/null 2>&1; then ++ if @sysctl@ hw.spec_store_bypass_disable >/dev/null 2>&1; then + kernel_ssb=1 + pstatus green YES + else +@@ -4724,7 +4724,7 @@ check_CVE_2018_3639_bsd() + fi + + _info_nol "* Speculation store bypass is administratively enabled: " +- ssb_enabled=$(sysctl -n hw.spec_store_bypass_disable 2>/dev/null) ++ ssb_enabled=$(@sysctl@ -n hw.spec_store_bypass_disable 2>/dev/null) + _debug "hw.spec_store_bypass_disable=$ssb_enabled" + case "$ssb_enabled" in + 0) pstatus yellow NO "disabled";; +@@ -4734,7 +4734,7 @@ check_CVE_2018_3639_bsd() + esac + + _info_nol "* Speculation store bypass is currently active: " +- ssb_active=$(sysctl -n hw.spec_store_bypass_disable_active 2>/dev/null) ++ ssb_active=$(@sysctl@ -n hw.spec_store_bypass_disable_active 2>/dev/null) + _debug "hw.spec_store_bypass_disable_active=$ssb_active" + case "$ssb_active" in + 1) pstatus green YES;; +@@ -4806,7 +4806,7 @@ check_CVE_2018_3620() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2018_3620_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2018_3620_bsd + else + _warn "Unsupported OS ($os)" +@@ -4824,14 +4824,14 @@ check_CVE_2018_3620_linux() + fi + if [ "$opt_sysfs_only" != 1 ]; then + _info_nol "* Kernel supports PTE inversion: " +- if ! command -v "${opt_arch_prefix}strings" >/dev/null 2>&1; then ++ if ! command -v "@strings@" >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing 'strings' tool, please install it" + pteinv_supported=-1 + elif [ -n "$kernel_err" ]; then + pstatus yellow UNKNOWN "$kernel_err" + pteinv_supported=-1 + else +- if "${opt_arch_prefix}strings" "$kernel" | grep -Fq 'PTE Inversion'; then ++ if "@strings@" "$kernel" | @grep@ -Fq 'PTE Inversion'; then + pstatus green YES "found in kernel image" + _debug "pteinv: found pte inversion evidence in kernel image" + pteinv_supported=1 +@@ -4844,7 +4844,7 @@ check_CVE_2018_3620_linux() + _info_nol "* PTE inversion enabled and active: " + if [ "$opt_live" = 1 ]; then + if [ -n "$fullmsg" ]; then +- if echo "$fullmsg" | grep -q 'Mitigation: PTE Inversion'; then ++ if echo "$fullmsg" | @grep@ -q 'Mitigation: PTE Inversion'; then + pstatus green YES + pteinv_active=1 + else +@@ -4892,7 +4892,7 @@ check_CVE_2018_3620_bsd() + else + _debug "vmm module already loaded" + fi +- if sysctl hw.vmm.vmx.l1d_flush >/dev/null 2>&1; then ++ if @sysctl@ hw.vmm.vmx.l1d_flush >/dev/null 2>&1; then + # https://security.FreeBSD.org/patches/SA-18:09/l1tf-11.2.patch + # this is very difficult to detect that the kernel reserved the 0 page, but this fix + # is part of the exact same patch than the other L1TF CVE, so we detect it +@@ -4922,7 +4922,7 @@ check_CVE_2018_3646() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2018_3646_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2018_3646_bsd + else + _warn "Unsupported OS ($os)" +@@ -4948,7 +4948,7 @@ check_CVE_2018_3646_linux() + if [ "$opt_live" = 1 ]; then + if ! [ -r /sys/module/kvm_intel/parameters/ept ]; then + pstatus blue N/A "the kvm_intel module is not loaded" +- elif [ "$(cat /sys/module/kvm_intel/parameters/ept)" = N ]; then ++ elif [ "$(@cat@ /sys/module/kvm_intel/parameters/ept)" = N ]; then + pstatus green YES + ept_disabled=1 + else +@@ -4960,15 +4960,15 @@ check_CVE_2018_3646_linux() + + _info "* Mitigation 2" + _info_nol " * L1D flush is supported by kernel: " +- if [ "$opt_live" = 1 ] && grep -qw flush_l1d "$procfs/cpuinfo"; then ++ if [ "$opt_live" = 1 ] && @grep@ -qw flush_l1d "$procfs/cpuinfo"; then + l1d_kernel="found flush_l1d in $procfs/cpuinfo" + fi + if [ -z "$l1d_kernel" ]; then +- if ! command -v "${opt_arch_prefix}strings" >/dev/null 2>&1; then ++ if ! command -v "@strings@" >/dev/null 2>&1; then + l1d_kernel_err="missing '${opt_arch_prefix}strings' tool, please install it, usually it's in the binutils package" + elif [ -n "$kernel_err" ]; then + l1d_kernel_err="$kernel_err" +- elif "${opt_arch_prefix}strings" "$kernel" | grep -qw flush_l1d; then ++ elif "@strings@" "$kernel" | @grep@ -qw flush_l1d; then + l1d_kernel='found flush_l1d in kernel image' + fi + fi +@@ -4989,20 +4989,20 @@ check_CVE_2018_3646_linux() + # $l1dstatus is one of (auto|vulnerable|conditional cache flushes|cache flushes|EPT disabled|flush not necessary) + # $smtstatus is one of (vulnerable|disabled) + # can also just be "Not affected" +- if echo "$fullmsg" | grep -Eq -e 'Not affected' -e '(VMX:|L1D) (EPT disabled|vulnerable|flush not necessary)'; then ++ if echo "$fullmsg" | @grep@ -Eq -e 'Not affected' -e '(VMX:|L1D) (EPT disabled|vulnerable|flush not necessary)'; then + l1d_mode=0 + pstatus yellow NO +- elif echo "$fullmsg" | grep -Eq '(VMX:|L1D) conditional cache flushes'; then ++ elif echo "$fullmsg" | @grep@ -Eq '(VMX:|L1D) conditional cache flushes'; then + l1d_mode=1 + pstatus green YES "conditional flushes" +- elif echo "$fullmsg" | grep -Eq '(VMX:|L1D) cache flushes'; then ++ elif echo "$fullmsg" | @grep@ -Eq '(VMX:|L1D) cache flushes'; then + l1d_mode=2 + pstatus green YES "unconditional flushes" + else + if is_xen_dom0; then +- l1d_xen_hardware=$(xl dmesg | grep 'Hardware features:' | grep 'L1D_FLUSH' | head -1) +- l1d_xen_hypervisor=$(xl dmesg | grep 'Xen settings:' | grep 'L1D_FLUSH' | head -1) +- l1d_xen_pv_domU=$(xl dmesg | grep 'PV L1TF shadowing:' | grep 'DomU enabled' | head -1) ++ l1d_xen_hardware=$(xl @dmesg@ | @grep@ 'Hardware features:' | @grep@ 'L1D_FLUSH' | @head@ -1) ++ l1d_xen_hypervisor=$(xl @dmesg@ | @grep@ 'Xen settings:' | @grep@ 'L1D_FLUSH' | @head@ -1) ++ l1d_xen_pv_domU=$(xl @dmesg@ | @grep@ 'PV L1TF shadowing:' | @grep@ 'DomU enabled' | @head@ -1) + + if [ -n "$l1d_xen_hardware" ] && [ -n "$l1d_xen_hypervisor" ] && [ -n "$l1d_xen_pv_domU" ]; then + l1d_mode=5 +@@ -5033,7 +5033,7 @@ check_CVE_2018_3646_linux() + + _info_nol " * Hardware-backed L1D flush supported: " + if [ "$opt_live" = 1 ]; then +- if grep -qw flush_l1d "$procfs/cpuinfo" || [ -n "$l1d_xen_hardware" ]; then ++ if @grep@ -qw flush_l1d "$procfs/cpuinfo" || [ -n "$l1d_xen_hardware" ]; then + pstatus green YES "performance impact of the mitigation will be greatly reduced" + else + pstatus blue NO "flush will be done in software, this is slower" +@@ -5105,7 +5105,7 @@ check_CVE_2018_3646_linux() + check_CVE_2018_3646_bsd() + { + _info_nol "* Kernel supports L1D flushing: " +- if sysctl hw.vmm.vmx.l1d_flush >/dev/null 2>&1; then ++ if @sysctl@ hw.vmm.vmx.l1d_flush >/dev/null 2>&1; then + pstatus green YES + kernel_l1d_supported=1 + else +@@ -5114,7 +5114,7 @@ check_CVE_2018_3646_bsd() + fi + + _info_nol "* L1D flushing is enabled: " +- kernel_l1d_enabled=$(sysctl -n hw.vmm.vmx.l1d_flush 2>/dev/null) ++ kernel_l1d_enabled=$(@sysctl@ -n hw.vmm.vmx.l1d_flush 2>/dev/null) + case "$kernel_l1d_enabled" in + 0) pstatus yellow NO;; + 1) pstatus green YES;; +@@ -5168,7 +5168,7 @@ check_CVE_2018_12127() + ################### + # MDSUM SECTION + +-# Microarchitectural Data Sampling Uncacheable Memory ++# Microarchitectural Data Sampling Uncacheable Memory + check_CVE_2019_11091() + { + cve='CVE-2019-11091' +@@ -5182,7 +5182,7 @@ check_mds() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_mds_linux "$cve" +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_mds_bsd "$cve" + else + _warn "Unsupported OS ($os)" +@@ -5193,7 +5193,7 @@ check_mds_bsd() + { + _info_nol "* Kernel supports using MD_CLEAR mitigation: " + if [ "$opt_live" = 1 ]; then +- if sysctl hw.mds_disable >/dev/null 2>&1; then ++ if @sysctl@ hw.mds_disable >/dev/null 2>&1; then + pstatus green YES + kernel_md_clear=1 + else +@@ -5201,7 +5201,7 @@ check_mds_bsd() + kernel_md_clear=0 + fi + else +- if grep -Fq hw.mds_disable $opt_kernel; then ++ if @grep@ -Fq hw.mds_disable $opt_kernel; then + pstatus green YES + kernel_md_clear=1 + else +@@ -5211,8 +5211,8 @@ check_mds_bsd() + fi + + _info_nol "* CPU Hyper-Threading (SMT) is disabled: " +- if sysctl machdep.hyperthreading_allowed >/dev/null 2>&1; then +- kernel_smt_allowed=$(sysctl -n machdep.hyperthreading_allowed 2>/dev/null) ++ if @sysctl@ machdep.hyperthreading_allowed >/dev/null 2>&1; then ++ kernel_smt_allowed=$(@sysctl@ -n machdep.hyperthreading_allowed 2>/dev/null) + if [ "$kernel_smt_allowed" = 1 ]; then + pstatus yellow NO + else +@@ -5224,7 +5224,7 @@ check_mds_bsd() + + _info_nol "* Kernel mitigation is enabled: " + if [ "$kernel_md_clear" = 1 ]; then +- kernel_mds_enabled=$(sysctl -n hw.mds_disable 2>/dev/null) ++ kernel_mds_enabled=$(@sysctl@ -n hw.mds_disable 2>/dev/null) + else + kernel_mds_enabled=0 + fi +@@ -5238,7 +5238,7 @@ check_mds_bsd() + + _info_nol "* Kernel mitigation is active: " + if [ "$kernel_md_clear" = 1 ]; then +- kernel_mds_state=$(sysctl -n hw.mds_disable_state 2>/dev/null) ++ kernel_mds_state=$(@sysctl@ -n hw.mds_disable_state 2>/dev/null) + else + kernel_mds_state=inactive + fi +@@ -5296,16 +5296,16 @@ check_mds_linux() + _info_nol "* Kernel supports using MD_CLEAR mitigation: " + kernel_md_clear='' + kernel_md_clear_can_tell=1 +- if [ "$opt_live" = 1 ] && grep ^flags "$procfs/cpuinfo" | grep -qw md_clear; then ++ if [ "$opt_live" = 1 ] && @grep@ ^flags "$procfs/cpuinfo" | @grep@ -qw md_clear; then + kernel_md_clear="md_clear found in $procfs/cpuinfo" + pstatus green YES "$kernel_md_clear" + fi + if [ -z "$kernel_md_clear" ]; then +- if ! command -v "${opt_arch_prefix}strings" >/dev/null 2>&1; then ++ if ! command -v "@strings@" >/dev/null 2>&1; then + kernel_md_clear_can_tell=0 + elif [ -n "$kernel_err" ]; then + kernel_md_clear_can_tell=0 +- elif "${opt_arch_prefix}strings" "$kernel" | grep -q 'Clear CPU buffers'; then ++ elif "@strings@" "$kernel" | @grep@ -q 'Clear CPU buffers'; then + _debug "md_clear: found 'Clear CPU buffers' string in kernel image" + kernel_md_clear='found md_clear implementation evidence in kernel image' + pstatus green YES "$kernel_md_clear" +@@ -5321,7 +5321,7 @@ check_mds_linux() + + if [ "$opt_live" = 1 ] && [ "$sys_interface_available" = 1 ]; then + _info_nol "* Kernel mitigation is enabled and active: " +- if echo "$fullmsg" | grep -qi ^mitigation; then ++ if echo "$fullmsg" | @grep@ -qi ^mitigation; then + mds_mitigated=1 + pstatus green YES + else +@@ -5329,7 +5329,7 @@ check_mds_linux() + pstatus yellow NO + fi + _info_nol "* SMT is either mitigated or disabled: " +- if echo "$fullmsg" | grep -Eq 'SMT (disabled|mitigated)'; then ++ if echo "$fullmsg" | @grep@ -Eq 'SMT (disabled|mitigated)'; then + mds_smt_mitigated=1 + pstatus green YES + else +@@ -5415,7 +5415,7 @@ check_CVE_2019_11135() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2019_11135_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2019_11135_bsd + else + _warn "Unsupported OS ($os)" +@@ -5436,7 +5436,7 @@ check_CVE_2019_11135_linux() + kernel_taa='' + if [ -n "$kernel_err" ]; then + kernel_taa_err="$kernel_err" +- elif grep -q 'tsx_async_abort' "$kernel"; then ++ elif @grep@ -q 'tsx_async_abort' "$kernel"; then + kernel_taa="found tsx_async_abort in kernel image" + fi + if [ -n "$kernel_taa" ]; then +@@ -5450,7 +5450,7 @@ check_CVE_2019_11135_linux() + _info_nol "* TAA mitigation enabled and active: " + if [ "$opt_live" = 1 ]; then + if [ -n "$fullmsg" ]; then +- if echo "$fullmsg" | grep -qE '^Mitigation'; then ++ if echo "$fullmsg" | @grep@ -qE '^Mitigation'; then + pstatus green YES "$fullmsg" + else + pstatus yellow NO +@@ -5485,9 +5485,9 @@ check_CVE_2019_11135_linux() + else + if [ "$opt_paranoid" = 1 ]; then + # in paranoid mode, TSX or SMT enabled are not OK, even if TAA is mitigated +- if ! echo "$fullmsg" | grep -qF 'TSX disabled'; then ++ if ! echo "$fullmsg" | @grep@ -qF 'TSX disabled'; then + pvulnstatus $cve VULN "TSX must be disabled for full mitigation" +- elif echo "$fullmsg" | grep -qF 'SMT vulnerable'; then ++ elif echo "$fullmsg" | @grep@ -qF 'SMT vulnerable'; then + pvulnstatus $cve VULN "SMT (HyperThreading) must be disabled for full mitigation" + else + pvulnstatus $cve "$status" "$msg" +@@ -5517,7 +5517,7 @@ check_CVE_2018_12207() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2018_12207_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2018_12207_bsd + else + _warn "Unsupported OS ($os)" +@@ -5541,7 +5541,7 @@ check_CVE_2018_12207_linux() + if [ -n "$kernel_err" ]; then + kernel_itlbmh_err="$kernel_err" + # commit 5219505fcbb640e273a0d51c19c38de0100ec5a9 +- elif grep -q 'itlb_multihit' "$kernel"; then ++ elif @grep@ -q 'itlb_multihit' "$kernel"; then + kernel_itlbmh="found itlb_multihit in kernel image" + fi + if [ -n "$kernel_itlbmh" ]; then +@@ -5555,7 +5555,7 @@ check_CVE_2018_12207_linux() + _info_nol "* iTLB Multihit mitigation enabled and active: " + if [ "$opt_live" = 1 ]; then + if [ -n "$fullmsg" ]; then +- if echo "$fullmsg" | grep -qF 'Mitigation'; then ++ if echo "$fullmsg" | @grep@ -qF 'Mitigation'; then + pstatus green YES "$fullmsg" + else + pstatus yellow NO +@@ -5597,7 +5597,7 @@ check_CVE_2018_12207_linux() + check_CVE_2018_12207_bsd() + { + _info_nol "* Kernel supports disabling superpages for executable mappings under EPT: " +- kernel_2m_x_ept=$(sysctl -n vm.pmap.allow_2m_x_ept 2>/dev/null) ++ kernel_2m_x_ept=$(@sysctl@ -n vm.pmap.allow_2m_x_ept 2>/dev/null) + if [ -z "$kernel_2m_x_ept" ]; then + pstatus yellow NO + else +@@ -5634,7 +5634,7 @@ check_CVE_2020_0543() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2020_0543_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2020_0543_bsd + else + _warn "Unsupported OS ($os)" +@@ -5655,7 +5655,7 @@ check_CVE_2020_0543_linux() + kernel_srbds='' + if [ -n "$kernel_err" ]; then + kernel_srbds_err="$kernel_err" +- elif grep -q 'Dependent on hypervisor' "$kernel"; then ++ elif @grep@ -q 'Dependent on hypervisor' "$kernel"; then + kernel_srbds="found SRBDS implementation evidence in kernel image. Your kernel is up to date for SRBDS mitigation" + fi + if [ -n "$kernel_srbds" ]; then +@@ -5668,7 +5668,7 @@ check_CVE_2020_0543_linux() + _info_nol "* SRBDS mitigation control is enabled and active: " + if [ "$opt_live" = 1 ]; then + if [ -n "$fullmsg" ]; then +- if echo "$fullmsg" | grep -qE '^Mitigation'; then ++ if echo "$fullmsg" | @grep@ -qE '^Mitigation'; then + pstatus green YES "$fullmsg" + else + pstatus yellow NO +@@ -5758,8 +5758,8 @@ fi + # now run the checks the user asked for + for cve in $supported_cve_list + do +- if [ "$opt_cve_all" = 1 ] || echo "$opt_cve_list" | grep -qw "$cve"; then +- check_"$(echo "$cve" | tr - _)" ++ if [ "$opt_cve_all" = 1 ] || echo "$opt_cve_list" | @grep@ -qw "$cve"; then ++ check_"$(echo "$cve" | @tr@ - _)" + _info + fi + done +@@ -5773,17 +5773,17 @@ if [ "$bad_accuracy" = 1 ]; then + _warn "We're missing some kernel info (see -v), accuracy might be reduced" + fi + +-_vars=$(set | grep -Ev '^[A-Z_[:space:]]' | grep -v -F 'mockme=' | sort | tr "\n" '|') ++_vars=$(set | @grep@ -Ev '^[A-Z_[:space:]]' | @grep@ -v -F 'mockme=' | @sort@ | @tr@ "\n" '|') + _debug "variables at end of script: $_vars" + + if [ -n "$mockme" ] && [ "$opt_mock" = 1 ]; then +- if command -v "gzip" >/dev/null 2>&1; then ++ if command -v "@gzip@" >/dev/null 2>&1; then + # not a useless use of cat: gzipping cpuinfo directly doesn't work well + # shellcheck disable=SC2002 +- if command -v "base64" >/dev/null 2>&1; then +- mock_cpuinfo="$(cat /proc/cpuinfo | gzip -c | base64 -w0)" +- elif command -v "uuencode" >/dev/null 2>&1; then +- mock_cpuinfo="$(cat /proc/cpuinfo | gzip -c | uuencode -m - | grep -Fv 'begin-base64' | grep -Fxv -- '====' | tr -d "\n")" ++ if command -v "@base64@" >/dev/null 2>&1; then ++ mock_cpuinfo="$(@cat@ /proc/cpuinfo | @gzip@ -c | @base64@ -w0)" ++ elif command -v "@uuencode@" >/dev/null 2>&1; then ++ mock_cpuinfo="$(@cat@ /proc/cpuinfo | @gzip@ -c | @uuencode@ -m - | @grep@ -Fv 'begin-base64' | @grep@ -Fxv -- '====' | @tr@ -d "\n")" + fi + fi + if [ -n "$mock_cpuinfo" ]; then +@@ -5792,7 +5792,7 @@ if [ -n "$mockme" ] && [ "$opt_mock" = 1 ]; then + fi + _info "" + # shellcheck disable=SC2046 +- _warn "To mock this CPU, set those vars: "$(echo "$mockme" | sort -u) ++ _warn "To mock this CPU, set those vars: "$(echo "$mockme" | @sort@ -u) + fi + + if [ "$opt_explain" = 0 ]; then +-- +2.38.1 + diff --git a/gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch b/gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch new file mode 100644 index 0000000000..afec52b418 --- /dev/null +++ b/gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch @@ -0,0 +1,26 @@ +From 5b757d930ec0cf102b03fb9817d17e06c72e74b3 Mon Sep 17 00:00:00 2001 +From: Hilton Chain +Date: Sat, 5 Nov 2022 23:22:31 +0800 +Subject: [PATCH] Add support for Guix System kernel. + +--- + spectre-meltdown-checker.sh | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/spectre-meltdown-checker.sh b/spectre-meltdown-checker.sh +index 248a444..855a090 100755 +--- a/spectre-meltdown-checker.sh ++++ b/spectre-meltdown-checker.sh +@@ -2251,6 +2251,8 @@ if [ "$opt_live" = 1 ]; then + [ -e "/boot/kernel-genkernel-$(uname -m)-$(uname -r)" ] && opt_kernel="/boot/kernel-genkernel-$(uname -m)-$(uname -r)" + # NixOS: + [ -e "/run/booted-system/kernel" ] && opt_kernel="/run/booted-system/kernel" ++ # Guix System: ++ [ -e "/run/booted-system/kernel/bzImage" ] && opt_kernel="/run/booted-system/kernel/bzImage" + # systemd kernel-install: + [ -e "/etc/machine-id" ] && [ -e "/boot/$(cat /etc/machine-id)/$(uname -r)/linux" ] && opt_kernel="/boot/$(cat /etc/machine-id)/$(uname -r)/linux" + # Clear Linux: + +base-commit: a6c943d38f315f339697ec26e7374a09b88f2183 +-- +2.38.0 base-commit: 2757de2e2b271d87f6f72ba4161c2225fbdc9e78 -- 2.38.1 From unknown Sun Jun 22 11:49:37 2025 X-Loop: help-debbugs@gnu.org Subject: [bug#59053] [PATCH v3] gnu: Add spectre-meltdown-checker. Resent-From: Liliana Marie Prikler Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Sat, 12 Nov 2022 12:30:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 59053 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: moreinfo patch To: Hilton Chain Cc: 59053@debbugs.gnu.org Received: via spool by 59053-submit@debbugs.gnu.org id=B59053.166825614716481 (code B ref 59053); Sat, 12 Nov 2022 12:30:02 +0000 Received: (at 59053) by debbugs.gnu.org; 12 Nov 2022 12:29:07 +0000 Received: from localhost ([127.0.0.1]:47458 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1otpdC-0004Hk-LI for submit@debbugs.gnu.org; Sat, 12 Nov 2022 07:29:06 -0500 Received: from mail-ej1-f66.google.com ([209.85.218.66]:35661) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1otpdB-0004HF-Hc for 59053@debbugs.gnu.org; Sat, 12 Nov 2022 07:29:05 -0500 Received: by mail-ej1-f66.google.com with SMTP id k2so18163141ejr.2 for <59053@debbugs.gnu.org>; Sat, 12 Nov 2022 04:29:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:cc:to:from:subject:message-id:from:to:cc:subject :date:message-id:reply-to; bh=pMdUvVt1olUen1Ggrxzz/gINsdmR9Me7APcTiJC5C1M=; b=og296vRcHXtdnwSt/CmMGNdPwb/5WTsW5f/cSyPXsgmNbXJln7LP6OkBb2Fn8ylW2k Oe3lbPyMWtR13o2JzqQXnNx9E2oZKEzMKT3mnHP4gLu/zZtQtUKmGuVUvy4QS36vRz3T j6lGoeSwi/mvZWAxHInc80lbpGLYXyVjPYhBDXCdUrBUabkb2cmxcwGGok0f2Xbl4oql fV9OhVF9SZadglYEPUwAgSyLmHW3B7vz2TxMtCXc//7h/wIB8FHFY+VJnWG5NxLX73Gb NbWsf9JAdkPzRHu8AquBlvHISi1eYUJO58w39YPENzNFJ+0LSimWKkmBJJDKKD4vHbuI 7b1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:cc:to:from:subject:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=pMdUvVt1olUen1Ggrxzz/gINsdmR9Me7APcTiJC5C1M=; b=FJrY1rBwXazTtVaZq3N9K5jdrqLqoK1kZugyi/JLsb2+pU1JUMq04Swj8RlurD1rW5 bWr+LDhUhYLyQrcY/O7SxAnKW7vEA90I3ljyAFY3Li74c6zMn2efNX34kw6c07bdbvKK QWpWZScJN7xrF35BSJSaG+zAwuoVOfb/RkJzdY59c+Voa+NRntxu1aOV/TG55VmVN1wG gYCNKAt1UHtq6sIvpy7EeDOD9xGENkDoH5xYWsLEmpMsPY3M9mLLtUvW8ptgnqRNmj/3 33+roGsbkWHPrpB4yVjAShY4IuKtt2YYet3eypp3FxKONn/KQh21lVfrOzihxU1kNLkH pBnw== X-Gm-Message-State: ANoB5pnff9aeFouk+TGUsjEt6Td3tx63cc+NUJzylsvfxVrRvXIwtTfR ntE3lWvcartxExRwKxLsy3o= X-Google-Smtp-Source: AA0mqf4/3n4i1H6Nc2792E5BS07ZwXKYDQqiyI4Sk08TYXA5hIoFfoAI8VOVPPz4FP4MnJRt0NGP7A== X-Received: by 2002:a17:907:7681:b0:78d:d10b:4bd5 with SMTP id jv1-20020a170907768100b0078dd10b4bd5mr4998193ejc.467.1668256139613; Sat, 12 Nov 2022 04:28:59 -0800 (PST) Received: from lumine.fritz.box (85-127-52-93.dsl.dynamic.surfer.at. [85.127.52.93]) by smtp.gmail.com with ESMTPSA id qo9-20020a170907874900b0078c1e174e11sm1872286ejc.136.2022.11.12.04.28.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 12 Nov 2022 04:28:59 -0800 (PST) Message-ID: From: Liliana Marie Prikler Date: Sat, 12 Nov 2022 13:28:58 +0100 In-Reply-To: References: <62dbdc4784403cc138909884b50a399485a2451f.camel@gmail.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable User-Agent: Evolution 3.46.0 MIME-Version: 1.0 X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Am Samstag, dem 12.11.2022 um 20:14 +0800 schrieb Hilton Chain: > 1. Use curl as default downloader (It seems that wget doesn't work > out of the box for TLS?). Uhm, what exactly is the checker downloading that it needs wget or curl for? From unknown Sun Jun 22 11:49:37 2025 X-Loop: help-debbugs@gnu.org Subject: [bug#59053] [PATCH v3] gnu: Add spectre-meltdown-checker. Resent-From: Hilton Chain Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Sat, 12 Nov 2022 12:52:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 59053 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: moreinfo patch To: Liliana Marie Prikler Cc: 59053@debbugs.gnu.org Received: via spool by 59053-submit@debbugs.gnu.org id=B59053.166825747127275 (code B ref 59053); Sat, 12 Nov 2022 12:52:02 +0000 Received: (at 59053) by debbugs.gnu.org; 12 Nov 2022 12:51:11 +0000 Received: from localhost ([127.0.0.1]:47499 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1otpyZ-00075p-3a for submit@debbugs.gnu.org; Sat, 12 Nov 2022 07:51:11 -0500 Received: from mail.boiledscript.com ([144.168.59.46]:38398) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1otpyW-00075N-8X for 59053@debbugs.gnu.org; Sat, 12 Nov 2022 07:51:10 -0500 Date: Sat, 12 Nov 2022 20:50:25 +0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ultrarare.space; s=dkim; t=1668257461; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=UODT0b9pdXeruSMuX435Dq3OqRqyuWwoC/gn0/Pjg2o=; b=GPPPfx6jye5IPj9E1fSdxqxuhHKeT82xGO3t4nOXeYEvr3chVTlOupfiycqgpSv6BNcFu0 wx2gIRhxjMOXRPehFdWh9NKjQRSaTSxOzaBjSEhkZz7P/BHgxY6lLK5enKyUwD1l52MBRQ oScaqXAg2jSAZo8uGDmQLdBMXeKvwgHrSk7JKuJLlR7UTpTeLUiue1QmFaspxIk6jEwoX3 bO6+Wx8uDWsFvNdvalbHcfTmVbc7wwkl4vxN/Ynz5plpPqOzd2MIwUR/FTcZBhu8a3s0lM WKGQKKRb321TFnLJPK/ePTTps62Xke9i3OsN167G1qYwD1H0jAZUe7je201LrA== Message-ID: From: Hilton Chain In-Reply-To: References: <62dbdc4784403cc138909884b50a399485a2451f.camel@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-Spamd-Bar: / Authentication-Results: mail.boiledscript.com; auth=pass smtp.mailfrom=hako@ultrarare.space X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) On Sat, 12 Nov 2022 20:28:58 +0800, Liliana Marie Prikler wrote: > Uhm, what exactly is the checker downloading that it needs wget or curl > for? With option "--update-fwdb", the checker fetches source files and builds the firmware database. From unknown Sun Jun 22 11:49:37 2025 X-Loop: help-debbugs@gnu.org Subject: [bug#59053] [PATCH v3] gnu: Add spectre-meltdown-checker. Resent-From: Liliana Marie Prikler Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Sat, 12 Nov 2022 13:41:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 59053 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: moreinfo patch To: Hilton Chain Cc: 59053@debbugs.gnu.org Received: via spool by 59053-submit@debbugs.gnu.org id=B59053.166826042332178 (code B ref 59053); Sat, 12 Nov 2022 13:41:02 +0000 Received: (at 59053) by debbugs.gnu.org; 12 Nov 2022 13:40:23 +0000 Received: from localhost ([127.0.0.1]:47544 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1otqkB-0008Mw-9x for submit@debbugs.gnu.org; Sat, 12 Nov 2022 08:40:23 -0500 Received: from mail-ej1-f65.google.com ([209.85.218.65]:40741) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1otqk9-0008Mg-13 for 59053@debbugs.gnu.org; Sat, 12 Nov 2022 08:40:21 -0500 Received: by mail-ej1-f65.google.com with SMTP id kt23so18333947ejc.7 for <59053@debbugs.gnu.org>; Sat, 12 Nov 2022 05:40:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:cc:to:from:subject:message-id:from:to:cc:subject :date:message-id:reply-to; bh=QujhEgs34gGq604Y9N9Zbtv/9cN61p+gn4sZb03YhHY=; b=nejsAVzCF5DoWIx1luIFLy3WgyswsKFuQlOUA8rE8836RSO6kK5d2+YmLgxmAotOYE rj4wxzhXjlGN8fNZhA9Ai1n1LKNzUuXQo18yXnc8zHlNIqtHvZmllNw+Vjc+Zb1+ztQC rQsB7IP0jJo+Sqlz0Wh3sCJOCmAhgcMIYmcFf3dHpXUbUodWazxJ/4y8BKXbRgMvsRjY cNqxiGHyX0cXf5Bkj0jp0BGIVpLMiCow9gBtiYt5MMeDoay/Q+C05tPaFRXb6nqvZg7W V+hx1lLngL8qvMbCbESwJJAOgAqGshTwxXIJoC+KI2BbjgeSiuUx0WDC5XSO6j05EbwY wjZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:cc:to:from:subject:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=QujhEgs34gGq604Y9N9Zbtv/9cN61p+gn4sZb03YhHY=; b=eQxS4EFGv9icwjlY+6uNYBb1CR3n7CeGZCOulkiWsU6xs1/Eav8GIIfRf9zsdsu1UL 9kvPu/UxVPp8xn5YJQ6oQmBFk1H7fJ5kefc3QG268pfXjWxmvw5/siW6yAuxsEA87+q2 QacvklSJ7fEC6AS6k4n6wQVbb/mpGdeXtQIxFAcn6MmO4gzOVuB4Or8FrfmjWHi18zHr 6dcDLdHTjRvAYLcTysM/hmH0SrxwWDjUTBdrPOkVK7yhgm9WNaO39oChECMTIl1VkOhu 1GWa3rrbCnsTiSW11caepE5BoEVFpxuStLFGGFj67xNfkIrvJ7Xkq7Ufp1pIleUOeg0B blAg== X-Gm-Message-State: ANoB5pke9TxMqMGUtcGpdfrUVtgFQdp5SEvGagDah0rAsbNYFLZ9wiOm a1AHcgIrV6711rOD0rwmSno= X-Google-Smtp-Source: AA0mqf7dKgvwds+86Q/qBPX2OIgrd4sxFDhCo7Qsb1vIqw0m3y0anIf+ec1gk0GvboCayhLnS5uI1A== X-Received: by 2002:a17:907:765c:b0:7ad:49b8:1687 with SMTP id kj28-20020a170907765c00b007ad49b81687mr5223534ejc.407.1668260414804; Sat, 12 Nov 2022 05:40:14 -0800 (PST) Received: from lumine.fritz.box (85-127-52-93.dsl.dynamic.surfer.at. [85.127.52.93]) by smtp.gmail.com with ESMTPSA id f24-20020a17090631d800b0073d81b0882asm1962506ejf.7.2022.11.12.05.40.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 12 Nov 2022 05:40:14 -0800 (PST) Message-ID: <60647514a548fc2589c1816ca8fef94fa20a7b94.camel@gmail.com> From: Liliana Marie Prikler Date: Sat, 12 Nov 2022 14:40:13 +0100 In-Reply-To: References: <62dbdc4784403cc138909884b50a399485a2451f.camel@gmail.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable User-Agent: Evolution 3.46.0 MIME-Version: 1.0 X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Am Samstag, dem 12.11.2022 um 20:50 +0800 schrieb Hilton Chain: > On Sat, 12 Nov 2022 20:28:58 +0800, > Liliana Marie Prikler wrote: > > Uhm, what exactly is the checker downloading that it needs wget or > > curl for? > With option "--update-fwdb", the checker fetches source files and > builds the firmware database. You mean proprietary firmware? From unknown Sun Jun 22 11:49:37 2025 X-Loop: help-debbugs@gnu.org Subject: [bug#59053] [PATCH v4] gnu: Add spectre-meltdown-checker. Resent-From: Hilton Chain Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Sat, 12 Nov 2022 15:16:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 59053 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: moreinfo patch To: Liliana Marie Prikler Cc: 59053@debbugs.gnu.org Received: via spool by 59053-submit@debbugs.gnu.org id=B59053.166826616118594 (code B ref 59053); Sat, 12 Nov 2022 15:16:02 +0000 Received: (at 59053) by debbugs.gnu.org; 12 Nov 2022 15:16:01 +0000 Received: from localhost ([127.0.0.1]:48784 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1otsEj-0004po-C4 for submit@debbugs.gnu.org; Sat, 12 Nov 2022 10:16:01 -0500 Received: from mail.boiledscript.com ([144.168.59.46]:57828) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1otsEg-0004pW-UL for 59053@debbugs.gnu.org; Sat, 12 Nov 2022 10:15:59 -0500 Date: Sat, 12 Nov 2022 23:15:18 +0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ultrarare.space; s=dkim; t=1668266151; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=C5jz1sIjqTx+ApcwLiNHbeyKpK64O4p2dQP2mpy7lts=; b=w0cZHYenR7fCz9r8MFUPjMR6xHprOZAy9P/jnCxcevSJqNOO8/cFnodnchNB04b4CY/9oG Pxs1aUF73IIBJTy0cCU7GJ7GN+llAJjXFtlUZCjxiL3uKoJIAGECbsX/Zcu8DJmvdaGUac s75kX/UkAjxc/SMMLkn0f4OB1N10vZcMmrt3A4Iw8PyQKRX3EtTHkjQK5voM9yuWZfVyt/ m0/lUVuFL5fqjWlOci1zJVefc3Ts6z5IG6DtKkmF8j/+pcFjKoUNbpoB53sjvM/cSUjyJ0 RvYBYWXvK4ZWLtm83A2ENvQn8UlYGuPsP5JL1DUfFECvM6j/yJVigbRSDl86bg== Message-ID: From: Hilton Chain In-Reply-To: <60647514a548fc2589c1816ca8fef94fa20a7b94.camel@gmail.com> References: <62dbdc4784403cc138909884b50a399485a2451f.camel@gmail.com> <60647514a548fc2589c1816ca8fef94fa20a7b94.camel@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 8bit X-Spamd-Bar: / Authentication-Results: mail.boiledscript.com; auth=pass smtp.mailfrom=hako@ultrarare.space X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" * gnu/packages/linux.scm (spectre-meltdown-checker): New variable. * gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch: New file. * gnu/packages/patches/spectre-meltdown-checker-remove-builtin-firmware-database.patch: New file. * gnu/packages/patches/spectre-meltdown-checker-stage-commands-for-substitution.patch: New file. * gnu/local.mk (dist_patch_DATA): Add patches. --- v3 -> v4: 1. Remove downloading function. 2. Add option for supplying a local database. gnu/local.mk | 3 + gnu/packages/linux.scm | 54 + ...ker-remove-builtin-firmware-database.patch | 243 +++ ...cker-stage-commands-for-substitution.patch | 1849 +++++++++++++++++ ...n-checker-support-guix-system-kernel.patch | 26 + 5 files changed, 2175 insertions(+) create mode 100644 gnu/packages/patches/spectre-meltdown-checker-remove-builtin-firmware-database.patch create mode 100644 gnu/packages/patches/spectre-meltdown-checker-stage-commands-for-substitution.patch create mode 100644 gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch diff --git a/gnu/local.mk b/gnu/local.mk index e3e02314bb..46b299d0d6 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -1857,6 +1857,9 @@ dist_patch_DATA = \ %D%/packages/patches/syslinux-strip-gnu-property.patch \ %D%/packages/patches/snappy-add-O2-flag-in-CmakeLists.txt.patch \ %D%/packages/patches/snappy-add-inline-for-GCC.patch \ + %D%/packages/patches/spectre-meltdown-checker-remove-builtin-firmware-database.patch \ + %D%/packages/patches/spectre-meltdown-checker-stage-commands-for-substitution.patch \ + %D%/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch \ %D%/packages/patches/sphinxbase-fix-doxygen.patch \ %D%/packages/patches/spice-vdagent-glib-2.68.patch \ %D%/packages/patches/sssd-optional-systemd.patch \ diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index fea33dfa0b..1807fd5655 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -9595,3 +9595,57 @@ (define-public edac-utils error detection and correction (EDAC).") (home-page "https://github.com/grondo/edac-utils") (license license:gpl2+))) + +(define-public spectre-meltdown-checker + (package + (name "spectre-meltdown-checker") + (version "0.45") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/speed47/spectre-meltdown-checker") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (patches + (search-patches + ;; https://github.com/speed47/spectre-meltdown-checker/pull/441 + "spectre-meltdown-checker-support-guix-system-kernel.patch" + ;; NOTE: Update these patches when updating. + "spectre-meltdown-checker-remove-builtin-firmware-database.patch" + "spectre-meltdown-checker-stage-commands-for-substitution.patch")) + ;; Remove builtin firmware database. + (modules '((guix build utils))) + (snippet '(substitute* "spectre-meltdown-checker.sh" + (("^# [AI],.*") ""))) + (sha256 + (base32 + "1xx8h5791lhc2xw0dcbzjkklzvlxwxkjzh8di4g8divfy24fqsn8")))) + (build-system copy-build-system) + (arguments + (list #:install-plan + #~'(("spectre-meltdown-checker.sh" "bin/spectre-meltdown-checker")) + #:phases + #~(modify-phases %standard-phases + (add-after 'unpack 'fixpath + (lambda* (#:key inputs #:allow-other-keys) + (substitute* "spectre-meltdown-checker.sh" + (("@sysctl@") (search-input-file inputs "/sbin/sysctl")) + (("@([a-z0-9]*)@" _ command _) + (search-input-file + inputs (string-append "/bin/" command))))))))) + (inputs + (list kmod + lz4 + lzop + perl + procps + sharutils + util-linux + zstd)) + (home-page "https://github.com/speed47/spectre-meltdown-checker") + (synopsis "CPU vulnerability / mitigation checker") + (description + "This package provides a shell script to assess your system's resilience +against the several transient execution CVEs that were published since early +2018, and give you guidance as to how to mitigate them.") + (license license:gpl3))) diff --git a/gnu/packages/patches/spectre-meltdown-checker-remove-builtin-firmware-database.patch b/gnu/packages/patches/spectre-meltdown-checker-remove-builtin-firmware-database.patch new file mode 100644 index 0000000000..888bb0c2b1 --- /dev/null +++ b/gnu/packages/patches/spectre-meltdown-checker-remove-builtin-firmware-database.patch @@ -0,0 +1,243 @@ +From a3a9b7ca93071393e6bfd999fedd737009718aab Mon Sep 17 00:00:00 2001 +From: Hilton Chain +Date: Sat, 12 Nov 2022 22:45:24 +0800 +Subject: [PATCH 1/2] Remove builtin firmware database. + +1. Remove downloading function. +2. Add option for supplying a local database. +--- + spectre-meltdown-checker.sh | 180 +++--------------------------------- + 1 file changed, 15 insertions(+), 165 deletions(-) + +diff --git a/spectre-meltdown-checker.sh b/spectre-meltdown-checker.sh +index 30f760c..ce46970 100755 +--- a/spectre-meltdown-checker.sh ++++ b/spectre-meltdown-checker.sh +@@ -22,8 +22,6 @@ exit_cleanup() + [ -n "${dumped_config:-}" ] && [ -f "$dumped_config" ] && rm -f "$dumped_config" + [ -n "${kerneltmp:-}" ] && [ -f "$kerneltmp" ] && rm -f "$kerneltmp" + [ -n "${kerneltmp2:-}" ] && [ -f "$kerneltmp2" ] && rm -f "$kerneltmp2" +- [ -n "${mcedb_tmp:-}" ] && [ -f "$mcedb_tmp" ] && rm -f "$mcedb_tmp" +- [ -n "${intel_tmp:-}" ] && [ -d "$intel_tmp" ] && rm -rf "$intel_tmp" + [ "${mounted_debugfs:-}" = 1 ] && umount /sys/kernel/debug 2>/dev/null + [ "${mounted_procfs:-}" = 1 ] && umount "$procfs" 2>/dev/null + [ "${insmod_cpuid:-}" = 1 ] && rmmod cpuid 2>/dev/null +@@ -93,9 +91,7 @@ show_usage() + --vmm [auto,yes,no] override the detection of the presence of a hypervisor, default: auto + --allow-msr-write allow probing for write-only MSRs, this might produce kernel logs or be blocked by your system + --cpu [#,all] interact with CPUID and MSR of CPU core number #, or all (default: CPU core 0) +- --update-fwdb update our local copy of the CPU microcodes versions database (using the awesome +- MCExtractor project and the Intel firmwares GitHub repository) +- --update-builtin-fwdb same as --update-fwdb but update builtin DB inside the script itself ++ --with-fwdb FILE supply the CPU microcodes versions database + --dump-mock-data used to mimick a CPU on an other system, mainly used to help debugging this script + + Return codes: +@@ -837,147 +833,6 @@ show_header() + _info + } + +-[ -z "$HOME" ] && HOME="$(getent passwd "$(whoami)" | cut -d: -f6)" +-mcedb_cache="$HOME/.mcedb" +-update_fwdb() +-{ +- show_header +- +- set -e +- +- if [ -r "$mcedb_cache" ]; then +- previous_dbversion=$(awk '/^# %%% MCEDB / { print $4 }' "$mcedb_cache") +- fi +- +- # first, download the MCE.db from the excellent platomav's MCExtractor project +- mcedb_tmp="$(mktemp -t smc-mcedb-XXXXXX)" +- mcedb_url='https://github.com/platomav/MCExtractor/raw/master/MCE.db' +- _info_nol "Fetching MCE.db from the MCExtractor project... " +- if command -v wget >/dev/null 2>&1; then +- wget -q "$mcedb_url" -O "$mcedb_tmp"; ret=$? +- elif command -v curl >/dev/null 2>&1; then +- curl -sL "$mcedb_url" -o "$mcedb_tmp"; ret=$? +- elif command -v fetch >/dev/null 2>&1; then +- fetch -q "$mcedb_url" -o "$mcedb_tmp"; ret=$? +- else +- echo ERROR "please install one of \`wget\`, \`curl\` of \`fetch\` programs" +- return 1 +- fi +- if [ "$ret" != 0 ]; then +- echo ERROR "error $ret while downloading MCE.db" +- return $ret +- fi +- echo DONE +- +- # second, get the Intel firmwares from GitHub +- intel_tmp="$(mktemp -d -t smc-intelfw-XXXXXX)" +- intel_url="https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files/archive/main.zip" +- _info_nol "Fetching Intel firmwares... " +- ## https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files.git +- if command -v wget >/dev/null 2>&1; then +- wget -q "$intel_url" -O "$intel_tmp/fw.zip"; ret=$? +- elif command -v curl >/dev/null 2>&1; then +- curl -sL "$intel_url" -o "$intel_tmp/fw.zip"; ret=$? +- elif command -v fetch >/dev/null 2>&1; then +- fetch -q "$intel_url" -o "$intel_tmp/fw.zip"; ret=$? +- else +- echo ERROR "please install one of \`wget\`, \`curl\` of \`fetch\` programs" +- return 1 +- fi +- if [ "$ret" != 0 ]; then +- echo ERROR "error $ret while downloading Intel firmwares" +- return $ret +- fi +- echo DONE +- +- # now extract MCEdb contents using sqlite +- _info_nol "Extracting MCEdb data... " +- if ! command -v sqlite3 >/dev/null 2>&1; then +- echo ERROR "please install the \`sqlite3\` program" +- return 1 +- fi +- mcedb_revision=$(sqlite3 "$mcedb_tmp" "select revision from MCE") +- if [ -z "$mcedb_revision" ]; then +- echo ERROR "downloaded file seems invalid" +- return 1 +- fi +- sqlite3 "$mcedb_tmp" "alter table Intel add column origin text" +- sqlite3 "$mcedb_tmp" "update Intel set origin='mce'" +- +- echo OK "MCExtractor database revision $mcedb_revision" +- +- # parse Intel firmwares to get their versions +- _info_nol "Integrating Intel firmwares data to db... " +- if ! command -v unzip >/dev/null 2>&1; then +- echo ERROR "please install the \`unzip\` program" +- return 1 +- fi +- ( cd "$intel_tmp" && unzip fw.zip >/dev/null; ) +- if ! [ -d "$intel_tmp/Intel-Linux-Processor-Microcode-Data-Files-main/intel-ucode" ]; then +- echo ERROR "expected the 'intel-ucode' folder in the downloaded zip file" +- return 1 +- fi +- +- if ! command -v iucode_tool >/dev/null 2>&1; then +- if ! command -v iucode-tool >/dev/null 2>&1; then +- echo ERROR "please install the \`iucode-tool\` program" +- return 1 +- else +- iucode_tool="iucode-tool" +- fi +- else +- iucode_tool="iucode_tool" +- fi +- # 079/001: sig 0x000106c2, pf_mask 0x01, 2009-04-10, rev 0x0217, size 5120 +- # 078/004: sig 0x000106ca, pf_mask 0x10, 2009-08-25, rev 0x0107, size 5120 +- $iucode_tool -l "$intel_tmp/Intel-Linux-Processor-Microcode-Data-Files-main/intel-ucode" | grep -wF sig | while read -r _line +- do +- _line=$( echo "$_line" | tr -d ',') +- _cpuid=$( echo "$_line" | awk '{print $3}') +- _cpuid=$(( _cpuid )) +- _cpuid=$(printf "0x%08X" "$_cpuid") +- _date=$( echo "$_line" | awk '{print $6}' | tr -d '-') +- _version=$(echo "$_line" | awk '{print $8}') +- _version=$(( _version )) +- _version=$(printf "0x%08X" "$_version") +- _sqlstm="$(printf "INSERT INTO Intel (origin,cpuid,version,yyyymmdd) VALUES (\"%s\",\"%s\",\"%s\",\"%s\");" "intel" "$(printf "%08X" "$_cpuid")" "$(printf "%08X" "$_version")" "$_date")" +- sqlite3 "$mcedb_tmp" "$_sqlstm" +- done +- _intel_timestamp=$(stat -c %Y "$intel_tmp/Intel-Linux-Processor-Microcode-Data-Files-main/license" 2>/dev/null) +- if [ -n "$_intel_timestamp" ]; then +- # use this date, it matches the last commit date +- _intel_latest_date=$(date +%Y%m%d -d @"$_intel_timestamp") +- else +- echo "Falling back to the latest microcode date" +- _intel_latest_date=$(sqlite3 "$mcedb_tmp" "SELECT yyyymmdd from Intel WHERE origin = 'intel' ORDER BY yyyymmdd DESC LIMIT 1;") +- fi +- echo DONE "(version $_intel_latest_date)" +- +- dbversion="$mcedb_revision+i$_intel_latest_date" +- +- if [ "$1" != builtin ] && [ -n "$previous_dbversion" ] && [ "$previous_dbversion" = "v$dbversion" ]; then +- echo "We already have this version locally, no update needed" +- return 0 +- fi +- +- _info_nol "Building local database... " +- { +- echo "# Spectre & Meltdown Checker"; +- echo "# %%% MCEDB v$dbversion"; +- sqlite3 "$mcedb_tmp" "SELECT '# I,0x'||t1.cpuid||',0x'||MAX(t1.version)||','||t1.yyyymmdd FROM Intel AS t1 LEFT OUTER JOIN Intel AS t2 ON t2.cpuid=t1.cpuid AND t2.yyyymmdd > t1.yyyymmdd WHERE t2.yyyymmdd IS NULL GROUP BY t1.cpuid ORDER BY t1.cpuid ASC;" | grep -v '^# .,0x00000000,'; +- sqlite3 "$mcedb_tmp" "SELECT '# A,0x'||t1.cpuid||',0x'||MAX(t1.version)||','||t1.yyyymmdd FROM AMD AS t1 LEFT OUTER JOIN AMD AS t2 ON t2.cpuid=t1.cpuid AND t2.yyyymmdd > t1.yyyymmdd WHERE t2.yyyymmdd IS NULL GROUP BY t1.cpuid ORDER BY t1.cpuid ASC;" | grep -v '^# .,0x00000000,'; +- } > "$mcedb_cache" +- echo DONE "(version $dbversion)" +- +- if [ "$1" = builtin ]; then +- newfile=$(mktemp -t smc-builtin-XXXXXX) +- awk '/^# %%% MCEDB / { exit }; { print }' "$0" > "$newfile" +- awk '{ if (NR>1) { print } }' "$mcedb_cache" >> "$newfile" +- cat "$newfile" > "$0" +- rm -f "$newfile" +- fi +-} +- + parse_opt_file() + { + # parse_opt_file option_name option_value +@@ -1067,12 +922,15 @@ while [ -n "${1:-}" ]; do + # deprecated, kept for compatibility + opt_explain=0 + shift +- elif [ "$1" = "--update-fwdb" ] || [ "$1" = "--update-mcedb" ]; then +- update_fwdb +- exit $? +- elif [ "$1" = "--update-builtin-fwdb" ] || [ "$1" = "--update-builtin-mcedb" ]; then +- update_fwdb builtin +- exit $? ++ elif [ "$1" = "--with-fwdb" ] || [ "$1" = "--with-mcedb" ]; then ++ opt_fwdb=$2 ++ if [ -f "$opt_fwdb" ]; then ++ mcedb_cache=$2 ++ else ++ echo "$0: error: --with-fwdb should be a file, got '$opt_fwdb'" >&2 ++ exit 255 ++ fi ++ shift 2 + elif [ "$1" = "--dump-mock-data" ]; then + opt_mock=1 + shift +@@ -2033,21 +1891,11 @@ is_xen_domU() + fi + } + +-builtin_dbversion=$(awk '/^# %%% MCEDB / { print $4 }' "$0") + if [ -r "$mcedb_cache" ]; then + # we have a local cache file, but it might be older than the builtin version we have + local_dbversion=$( awk '/^# %%% MCEDB / { print $4 }' "$mcedb_cache") +- # sort -V sorts by version number +- older_dbversion=$(printf "%b\n%b" "$local_dbversion" "$builtin_dbversion" | sort -V | head -n1) +- if [ "$older_dbversion" = "$builtin_dbversion" ]; then +- mcedb_source="$mcedb_cache" +- mcedb_info="local firmwares DB $local_dbversion" +- fi +-fi +-# if mcedb_source is not set, either we don't have a local cached db, or it is older than the builtin db +-if [ -z "${mcedb_source:-}" ]; then +- mcedb_source="$0" +- mcedb_info="builtin firmwares DB $builtin_dbversion" ++ mcedb_source="$mcedb_cache" ++ mcedb_info="local firmwares DB $local_dbversion" + fi + read_mcedb() + { +@@ -2063,7 +1911,9 @@ is_latest_known_ucode() + return 2 + fi + ucode_latest="latest microcode version for your CPU model is unknown" +- if is_intel; then ++ if [ -z "$mcedb_source" ]; then ++ return 2 ++ elif is_intel; then + cpu_brand_prefix=I + elif is_amd; then + cpu_brand_prefix=A +-- +2.38.1 + diff --git a/gnu/packages/patches/spectre-meltdown-checker-stage-commands-for-substitution.patch b/gnu/packages/patches/spectre-meltdown-checker-stage-commands-for-substitution.patch new file mode 100644 index 0000000000..a8e7531f32 --- /dev/null +++ b/gnu/packages/patches/spectre-meltdown-checker-stage-commands-for-substitution.patch @@ -0,0 +1,1849 @@ +From 1d79c223d5dc114f63da2c5061d2c713d8a05687 Mon Sep 17 00:00:00 2001 +From: Hilton Chain +Date: Fri, 11 Nov 2022 18:49:50 +0800 +Subject: [PATCH 2/2] Stage commands for later substitution. + +awk, base64, basename, bunzip2, cat, cut, dd, dirname, dmesg, find, grep, +gunzip, gzip, head, id, lz4, lzop, mktemp, modprobe, mount, nm, nproc, +objdump, od, perl, pgrep, readelf, rm, rmmod, sed, sort, stat, strings, +sysctl, tr, umount, uname, unlzma, unxz, unzstd, uuencode, xargs. +--- + spectre-meltdown-checker.sh | 606 ++++++++++++++++++------------------ + 1 file changed, 303 insertions(+), 303 deletions(-) + +diff --git a/spectre-meltdown-checker.sh b/spectre-meltdown-checker.sh +index ce46970..4889ebb 100755 +--- a/spectre-meltdown-checker.sh ++++ b/spectre-meltdown-checker.sh +@@ -19,31 +19,31 @@ trap '_warn "interrupted, cleaning up..."; exit_cleanup; exit 1' INT + exit_cleanup() + { + # cleanup the temp decompressed config & kernel image +- [ -n "${dumped_config:-}" ] && [ -f "$dumped_config" ] && rm -f "$dumped_config" +- [ -n "${kerneltmp:-}" ] && [ -f "$kerneltmp" ] && rm -f "$kerneltmp" +- [ -n "${kerneltmp2:-}" ] && [ -f "$kerneltmp2" ] && rm -f "$kerneltmp2" +- [ "${mounted_debugfs:-}" = 1 ] && umount /sys/kernel/debug 2>/dev/null +- [ "${mounted_procfs:-}" = 1 ] && umount "$procfs" 2>/dev/null +- [ "${insmod_cpuid:-}" = 1 ] && rmmod cpuid 2>/dev/null +- [ "${insmod_msr:-}" = 1 ] && rmmod msr 2>/dev/null ++ [ -n "${dumped_config:-}" ] && [ -f "$dumped_config" ] && @rm@ -f "$dumped_config" ++ [ -n "${kerneltmp:-}" ] && [ -f "$kerneltmp" ] && @rm@ -f "$kerneltmp" ++ [ -n "${kerneltmp2:-}" ] && [ -f "$kerneltmp2" ] && @rm@ -f "$kerneltmp2" ++ [ "${mounted_debugfs:-}" = 1 ] && @umount@ /sys/kernel/debug 2>/dev/null ++ [ "${mounted_procfs:-}" = 1 ] && @umount@ "$procfs" 2>/dev/null ++ [ "${insmod_cpuid:-}" = 1 ] && @rmmod@ cpuid 2>/dev/null ++ [ "${insmod_msr:-}" = 1 ] && @rmmod@ msr 2>/dev/null + [ "${kldload_cpuctl:-}" = 1 ] && kldunload cpuctl 2>/dev/null + [ "${kldload_vmm:-}" = 1 ] && kldunload vmm 2>/dev/null + } + + # if we were git clone'd, adjust VERSION +-if [ -d "$(dirname "$0")/.git" ] && command -v git >/dev/null 2>&1; then +- describe=$(git -C "$(dirname "$0")" describe --tags --dirty 2>/dev/null) +- [ -n "$describe" ] && VERSION=$(echo "$describe" | sed -e s/^v//) ++if [ -d "$(@dirname@ "$0")/.git" ] && command -v git >/dev/null 2>&1; then ++ describe=$(git -C "$(@dirname@ "$0")" describe --tags --dirty 2>/dev/null) ++ [ -n "$describe" ] && VERSION=$(echo "$describe" | @sed@ -e s/^v//) + fi + + show_usage() + { + # shellcheck disable=SC2086 +- cat <] [--config ] [--map ]> --live +- Offline mode: $(basename $0) [options] <[--kernel ] [--config ] [--map ]> ++ Live mode (auto): $(@basename@ $0) [options] ++ Live mode (manual): $(@basename@ $0) [options] <[--kernel ] [--config ] [--map ]> --live ++ Offline mode: $(@basename@ $0) [options] <[--kernel ] [--config ] [--map ]> + + Modes: + Two modes are available. +@@ -106,7 +106,7 @@ EOF + + show_disclaimer() + { +- cat < spectre 2 not affected + # https://github.com/paboldin/meltdown-exploit/issues/19 ^F E5200 => meltdown affected + # model name : Pentium(R) Dual-Core CPU E5200 @ 2.50GHz +- if echo "$cpu_friendly_name" | grep -qE 'Pentium\(R\) Dual-Core[[:space:]]+CPU[[:space:]]+E[0-9]{4}K?'; then ++ if echo "$cpu_friendly_name" | @grep@ -qE 'Pentium\(R\) Dual-Core[[:space:]]+CPU[[:space:]]+E[0-9]{4}K?'; then + variant1=vuln + [ -z "$variant2" ] && variant2=immune + variant3=vuln +@@ -482,7 +482,7 @@ is_cpu_affected() + i=$(( i + 1 )) + # do NOT quote $cpu_arch_list below + # shellcheck disable=SC2086 +- cpuarch=$(echo $cpu_arch_list | awk '{ print $'$i' }') ++ cpuarch=$(echo $cpu_arch_list | @awk@ '{ print $'$i' }') + _debug "checking cpu$i: <$cpupart> <$cpuarch>" + # some kernels report AArch64 instead of 8 + [ "$cpuarch" = "AArch64" ] && cpuarch=8 +@@ -493,49 +493,49 @@ is_cpu_affected() + # part ? ? c08 c09 c0d c0f c0e d07 d08 d09 d0a d0b d0c d0d + # arch 7? 7? 7 7 7 7 7 8 8 8 8 8 8 8 + # +- # Whitelist identified non-affected processors, use vulnerability information from ++ # Whitelist identified non-affected processors, use vulnerability information from + # https://developer.arm.com/support/arm-security-updates/speculative-processor-vulnerability + # Partnumbers can be found here: + # https://github.com/gcc-mirror/gcc/blob/master/gcc/config/arm/arm-cpus.in + # + # Maintain cumulative check of vulnerabilities - + # if at least one of the cpu is affected, then the system is affected +- if [ "$cpuarch" = 7 ] && echo "$cpupart" | grep -q -w -e 0xc08 -e 0xc09 -e 0xc0d -e 0xc0e; then ++ if [ "$cpuarch" = 7 ] && echo "$cpupart" | @grep@ -q -w -e 0xc08 -e 0xc09 -e 0xc0d -e 0xc0e; then + variant1=vuln + variant2=vuln + [ -z "$variant3" ] && variant3=immune + [ -z "$variant3a" ] && variant3a=immune + [ -z "$variant4" ] && variant4=immune + _debug "checking cpu$i: armv7 A8/A9/A12/A17 non affected to variants 3, 3a & 4" +- elif [ "$cpuarch" = 7 ] && echo "$cpupart" | grep -q -w -e 0xc0f; then ++ elif [ "$cpuarch" = 7 ] && echo "$cpupart" | @grep@ -q -w -e 0xc0f; then + variant1=vuln + variant2=vuln + [ -z "$variant3" ] && variant3=immune + variant3a=vuln + [ -z "$variant4" ] && variant4=immune + _debug "checking cpu$i: armv7 A15 non affected to variants 3 & 4" +- elif [ "$cpuarch" = 8 ] && echo "$cpupart" | grep -q -w -e 0xd07 -e 0xd08; then ++ elif [ "$cpuarch" = 8 ] && echo "$cpupart" | @grep@ -q -w -e 0xd07 -e 0xd08; then + variant1=vuln + variant2=vuln + [ -z "$variant3" ] && variant3=immune + variant3a=vuln + variant4=vuln + _debug "checking cpu$i: armv8 A57/A72 non affected to variants 3" +- elif [ "$cpuarch" = 8 ] && echo "$cpupart" | grep -q -w -e 0xd09; then ++ elif [ "$cpuarch" = 8 ] && echo "$cpupart" | @grep@ -q -w -e 0xd09; then + variant1=vuln + variant2=vuln + [ -z "$variant3" ] && variant3=immune + [ -z "$variant3a" ] && variant3a=immune + variant4=vuln + _debug "checking cpu$i: armv8 A73 non affected to variants 3 & 3a" +- elif [ "$cpuarch" = 8 ] && echo "$cpupart" | grep -q -w -e 0xd0a; then ++ elif [ "$cpuarch" = 8 ] && echo "$cpupart" | @grep@ -q -w -e 0xd0a; then + variant1=vuln + variant2=vuln + variant3=vuln + [ -z "$variant3a" ] && variant3a=immune + variant4=vuln + _debug "checking cpu$i: armv8 A75 non affected to variant 3a" +- elif [ "$cpuarch" = 8 ] && echo "$cpupart" | grep -q -w -e 0xd0b -e 0xd0c -e 0xd0d; then ++ elif [ "$cpuarch" = 8 ] && echo "$cpupart" | @grep@ -q -w -e 0xd0b -e 0xd0c -e 0xd0d; then + variant1=vuln + [ -z "$variant2" ] && variant2=immune + [ -z "$variant3" ] && variant3=immune +@@ -816,7 +816,7 @@ is_cpu_ssb_free() + if [ "$cpu_family" = "18" ] || \ + [ "$cpu_family" = "17" ] || \ + [ "$cpu_family" = "16" ] || \ +- [ "$cpu_family" = "15" ]; then ++ [ "$cpu_family" = "15" ]; then + return 0 + fi + fi +@@ -910,7 +910,7 @@ while [ -n "${1:-}" ]; do + elif [ "$1" = "--cpu" ]; then + opt_cpu=$2 + if [ "$opt_cpu" != all ]; then +- if echo "$opt_cpu" | grep -Eq '^[0-9]+'; then ++ if echo "$opt_cpu" | @grep@ -Eq '^[0-9]+'; then + opt_cpu=$(( opt_cpu )) + else + echo "$0: error: --cpu should be an integer or 'all', got '$opt_cpu'" >&2 +@@ -961,7 +961,7 @@ while [ -n "${1:-}" ]; do + echo "$0: error: option --cve expects a parameter, supported CVEs are: $supported_cve_list" >&2 + exit 255 + fi +- selected_cve=$(echo "$supported_cve_list" | grep -iwo "$2") ++ selected_cve=$(echo "$supported_cve_list" | @grep@ -iwo "$2") + if [ -n "$selected_cve" ]; then + opt_cve_list="$opt_cve_list $selected_cve" + opt_cve_all=0 +@@ -1166,14 +1166,14 @@ check_kernel() + # a damaged ELF file and validate it, check for stderr warnings too + + # the warning "readelf: Warning: [16]: Link field (0) should index a symtab section./" can appear on valid kernels, ignore it +- _readelf_warnings=$("${opt_arch_prefix}readelf" -S "$_file" 2>&1 >/dev/null | grep -v 'should index a symtab section' | tr "\n" "/"); ret=$? +- _readelf_sections=$("${opt_arch_prefix}readelf" -S "$_file" 2>/dev/null | grep -c -e data -e text -e init) +- _kernel_size=$(stat -c %s "$_file" 2>/dev/null || stat -f %z "$_file" 2>/dev/null || echo 10000) ++ _readelf_warnings=$("@readelf@" -S "$_file" 2>&1 >/dev/null | @grep@ -v 'should index a symtab section' | @tr@ "\n" "/"); ret=$? ++ _readelf_sections=$("@readelf@" -S "$_file" 2>/dev/null | @grep@ -c -e data -e text -e init) ++ _kernel_size=$(@stat@ -c %s "$_file" 2>/dev/null || @stat@ -f %z "$_file" 2>/dev/null || echo 10000) + _debug "check_kernel: ret=$? size=$_kernel_size sections=$_readelf_sections warnings=$_readelf_warnings" + if [ "$_mode" = desperate ]; then +- if "${opt_arch_prefix}strings" "$_file" | grep -Eq '^Linux version '; then ++ if "@strings@" "$_file" | @grep@ -Eq '^Linux version '; then + _debug "check_kernel (desperate): ... matched!" +- if [ "$_readelf_sections" = 0 ] && grep -qF -e armv6 -e armv7 "$_file"; then ++ if [ "$_readelf_sections" = 0 ] && @grep@ -qF -e armv6 -e armv7 "$_file"; then + _debug "check_kernel (desperate): raw arm binary found, adjusting objdump options" + objdump_options="-D -b binary -marm" + else +@@ -1206,7 +1206,7 @@ try_decompress() + + # Try to find the header ($1) and decompress from here + _debug "try_decompress: looking for $3 magic in $6" +- for pos in $(tr "$1\n$2" "\n$2=" < "$6" | grep -abo "^$2") ++ for pos in $(@tr@ "$1\n$2" "\n$2=" < "$6" | @grep@ -abo "^$2") + do + _debug "try_decompress: magic for $3 found at offset $pos" + if ! command -v "$3" >/dev/null 2>&1; then +@@ -1233,11 +1233,11 @@ try_decompress() + kernel="$kerneltmp" + _debug "try_decompress: decompressed with $3 successfully!" + return 0 +- elif [ "$3" != "cat" ]; then ++ elif [ "$3" != "@cat@" ]; then + _debug "try_decompress: decompression with $3 worked but result is not a kernel, trying with an offset" +- [ -z "$kerneltmp2" ] && kerneltmp2=$(mktemp -t smc-kernel-XXXXXX) +- cat "$kerneltmp" > "$kerneltmp2" +- try_decompress '\177ELF' xxy 'cat' '' cat "$kerneltmp2" && return 0 ++ [ -z "$kerneltmp2" ] && kerneltmp2=$(@mktemp@ -t smc-kernel-XXXXXX) ++ @cat@ "$kerneltmp" > "$kerneltmp2" ++ try_decompress '\177ELF' xxy '@cat@' '' cat "$kerneltmp2" && return 0 + else + _debug "try_decompress: decompression with $3 worked but result is not a kernel" + fi +@@ -1249,12 +1249,12 @@ extract_kernel() + { + [ -n "${1:-}" ] || return 1 + # Prepare temp files: +- kerneltmp="$(mktemp -t smc-kernel-XXXXXX)" ++ kerneltmp="$(@mktemp@ -t smc-kernel-XXXXXX)" + + # Initial attempt for uncompressed images or objects: + if check_kernel "$1"; then + _debug "extract_kernel: found kernel is valid, no decompression needed" +- cat "$1" > "$kerneltmp" ++ @cat@ "$1" > "$kerneltmp" + kernel=$kerneltmp + return 0 + fi +@@ -1263,14 +1263,14 @@ extract_kernel() + for pass in 1 2; do + for mode in normal desperate; do + _debug "extract_kernel: pass $pass $mode mode" +- try_decompress '\037\213\010' xy gunzip '' gunzip "$1" "$mode" "$pass" && return 0 +- try_decompress '\002\041\114\030' xyy 'lz4' '-d -l' liblz4-tool "$1" "$mode" "$pass" && return 0 +- try_decompress '\3757zXZ\000' abcde unxz '' xz-utils "$1" "$mode" "$pass" && return 0 +- try_decompress 'BZh' xy bunzip2 '' bzip2 "$1" "$mode" "$pass" && return 0 +- try_decompress '\135\0\0\0' xxx unlzma '' xz-utils "$1" "$mode" "$pass" && return 0 +- try_decompress '\211\114\132' xy 'lzop' '-d' lzop "$1" "$mode" "$pass" && return 0 +- try_decompress '\177ELF' xxy 'cat' '' cat "$1" "$mode" "$pass" && return 0 +- try_decompress '(\265/\375' xxy unzstd '' zstd "$1" "$mode" "$pass" && return 0 ++ try_decompress '\037\213\010' xy @gunzip@ '' gunzip "$1" "$mode" "$pass" && return 0 ++ try_decompress '\002\041\114\030' xyy '@lz4@' '-d -l' liblz4-tool "$1" "$mode" "$pass" && return 0 ++ try_decompress '\3757zXZ\000' abcde @unxz@ '' xz-utils "$1" "$mode" "$pass" && return 0 ++ try_decompress 'BZh' xy @bunzip2@ '' bzip2 "$1" "$mode" "$pass" && return 0 ++ try_decompress '\135\0\0\0' xxx @unlzma@ '' xz-utils "$1" "$mode" "$pass" && return 0 ++ try_decompress '\211\114\132' xy '@lzop@' '-d' lzop "$1" "$mode" "$pass" && return 0 ++ try_decompress '\177ELF' xxy '@cat@' '' cat "$1" "$mode" "$pass" && return 0 ++ try_decompress '(\265/\375' xxy @unzstd@ '' zstd "$1" "$mode" "$pass" && return 0 + done + done + # kernel_err might already have been populated by try_decompress() if we're missing one of the tools +@@ -1287,7 +1287,7 @@ mount_debugfs() + { + if [ ! -e /sys/kernel/debug/sched_features ]; then + # try to mount the debugfs hierarchy ourselves and remember it to umount afterwards +- mount -t debugfs debugfs /sys/kernel/debug 2>/dev/null && mounted_debugfs=1 ++ @mount@ -t debugfs debugfs /sys/kernel/debug 2>/dev/null && mounted_debugfs=1 + fi + } + +@@ -1298,12 +1298,12 @@ load_msr() + load_msr_once=1 + + if [ "$os" = Linux ]; then +- if ! grep -qw msr "$procfs/modules" 2>/dev/null; then +- modprobe msr 2>/dev/null && insmod_msr=1 ++ if ! @grep@ -qw msr "$procfs/modules" 2>/dev/null; then ++ @modprobe@ msr 2>/dev/null && insmod_msr=1 + _debug "attempted to load module msr, insmod_msr=$insmod_msr" + else + _debug "msr module already loaded" +- fi ++ fi + else + if ! kldstat -q -m cpuctl; then + kldload cpuctl 2>/dev/null && kldload_cpuctl=1 +@@ -1321,12 +1321,12 @@ load_cpuid() + load_cpuid_once=1 + + if [ "$os" = Linux ]; then +- if ! grep -qw cpuid "$procfs/modules" 2>/dev/null; then +- modprobe cpuid 2>/dev/null && insmod_cpuid=1 ++ if ! @grep@ -qw cpuid "$procfs/modules" 2>/dev/null; then ++ @modprobe@ cpuid 2>/dev/null && insmod_cpuid=1 + _debug "attempted to load module cpuid, insmod_cpuid=$insmod_cpuid" + else + _debug "cpuid module already loaded" +- fi ++ fi + else + if ! kldstat -q -m cpuctl; then + kldload cpuctl 2>/dev/null && kldload_cpuctl=1 +@@ -1415,7 +1415,7 @@ read_cpuid_one_core() + fi + # on some kernel versions, /dev/cpu/0/cpuid doesn't imply that the cpuid module is loaded, in that case dd returns an error, + # we use that fact to load the module if dd returns an error +- if ! dd if=/dev/cpu/0/cpuid bs=16 count=1 >/dev/null 2>&1; then ++ if ! @dd@ if=/dev/cpu/0/cpuid bs=16 count=1 >/dev/null 2>&1; then + load_cpuid + fi + # we need _leaf to be converted to decimal for dd +@@ -1426,14 +1426,14 @@ read_cpuid_one_core() + _ddskip=$(( _position / 16 )) + _odskip=$(( _position - _ddskip * 16 )) + # now read the value +- _cpuid=$(dd if="/dev/cpu/$_core/cpuid" bs=16 skip=$_ddskip count=$((_odskip + 1)) 2>/dev/null | od -j $((_odskip * 16)) -A n -t u4) ++ _cpuid=$(@dd@ if="/dev/cpu/$_core/cpuid" bs=16 skip=$_ddskip count=$((_odskip + 1)) 2>/dev/null | @od@ -j $((_odskip * 16)) -A n -t u4) + elif [ -e /dev/cpuctl0 ]; then + # BSD + if [ ! -r /dev/cpuctl0 ]; then + read_cpuid_msg="Couldn't read cpuid info from cpuctl" + return $READ_CPUID_RET_ERR + fi +- _cpuid=$(cpucontrol -i "$_leaf","$_subleaf" "/dev/cpuctl$_core" 2>/dev/null | cut -d: -f2-) ++ _cpuid=$(cpucontrol -i "$_leaf","$_subleaf" "/dev/cpuctl$_core" 2>/dev/null | @cut@ -d: -f2-) + # cpuid level 0x4, level_type 0x2: 0x1c004143 0x01c0003f 0x000001ff 0x00000000 + else + read_cpuid_msg="Found no way to read cpuid info" +@@ -1456,7 +1456,7 @@ read_cpuid_one_core() + fi + + # get the value of the register we want +- _reg=$(echo "$_cpuid" | awk '{print $'"$_register"'}') ++ _reg=$(echo "$_cpuid" | @awk@ '{print $'"$_register"'}') + # Linux returns it as decimal, BSD as hex, normalize to decimal + _reg=$(( _reg )) + # shellcheck disable=SC2046 +@@ -1484,11 +1484,11 @@ dmesg_grep() + # grep for something in dmesg, ensuring that the dmesg buffer + # has not been truncated + dmesg_grepped='' +- if ! dmesg | grep -qE -e '(^|\] )Linux version [0-9]' -e '^FreeBSD is a registered' ; then ++ if ! @dmesg@ | @grep@ -qE -e '(^|\] )Linux version [0-9]' -e '^FreeBSD is a registered' ; then + # dmesg truncated + return 2 + fi +- dmesg_grepped=$(dmesg | grep -E "$1" | head -1) ++ dmesg_grepped=$(@dmesg@ | @grep@ -E "$1" | @head@ -1) + # not found: + [ -z "$dmesg_grepped" ] && return 1 + # found, output is in $dmesg_grepped +@@ -1505,12 +1505,12 @@ parse_cpu_details() + { + [ "${parse_cpu_details_done:-}" = 1 ] && return 0 + +- if command -v nproc >/dev/null; then +- number_of_cores=$(nproc) +- elif echo "$os" | grep -q BSD; then +- number_of_cores=$(sysctl -n hw.ncpu 2>/dev/null || echo 1) ++ if command -v @nproc@ >/dev/null; then ++ number_of_cores=$(@nproc@) ++ elif echo "$os" | @grep@ -q BSD; then ++ number_of_cores=$(@sysctl@ -n hw.ncpu 2>/dev/null || echo 1) + elif [ -e "$procfs/cpuinfo" ]; then +- number_of_cores=$(grep -c ^processor "$procfs/cpuinfo" 2>/dev/null || echo 1) ++ number_of_cores=$(@grep@ -c ^processor "$procfs/cpuinfo" 2>/dev/null || echo 1) + else + # if we don't know, default to 1 CPU + number_of_cores=1 +@@ -1518,43 +1518,43 @@ parse_cpu_details() + max_core_id=$(( number_of_cores - 1 )) + + if [ -e "$procfs/cpuinfo" ]; then +- cpu_vendor=$( grep '^vendor_id' "$procfs/cpuinfo" | awk '{print $3}' | head -1) +- cpu_friendly_name=$(grep '^model name' "$procfs/cpuinfo" | cut -d: -f2- | head -1 | sed -e 's/^ *//') ++ cpu_vendor=$( @grep@ '^vendor_id' "$procfs/cpuinfo" | @awk@ '{print $3}' | @head@ -1) ++ cpu_friendly_name=$(@grep@ '^model name' "$procfs/cpuinfo" | @cut@ -d: -f2- | @head@ -1 | @sed@ -e 's/^ *//') + # special case for ARM follows +- if grep -qi 'CPU implementer[[:space:]]*:[[:space:]]*0x41' "$procfs/cpuinfo"; then ++ if @grep@ -qi 'CPU implementer[[:space:]]*:[[:space:]]*0x41' "$procfs/cpuinfo"; then + cpu_vendor='ARM' + # some devices (phones or other) have several ARMs and as such different part numbers, + # an example is "bigLITTLE", so we need to store the whole list, this is needed for is_cpu_affected +- cpu_part_list=$(awk '/CPU part/ {print $4}' "$procfs/cpuinfo") +- cpu_arch_list=$(awk '/CPU architecture/ {print $3}' "$procfs/cpuinfo") ++ cpu_part_list=$(@awk@ '/CPU part/ {print $4}' "$procfs/cpuinfo") ++ cpu_arch_list=$(@awk@ '/CPU architecture/ {print $3}' "$procfs/cpuinfo") + # take the first one to fill the friendly name, do NOT quote the vars below + # shellcheck disable=SC2086 +- cpu_arch=$(echo $cpu_arch_list | awk '{ print $1 }') ++ cpu_arch=$(echo $cpu_arch_list | @awk@ '{ print $1 }') + # shellcheck disable=SC2086 +- cpu_part=$(echo $cpu_part_list | awk '{ print $1 }') ++ cpu_part=$(echo $cpu_part_list | @awk@ '{ print $1 }') + [ "$cpu_arch" = "AArch64" ] && cpu_arch=8 + cpu_friendly_name="ARM" + [ -n "$cpu_arch" ] && cpu_friendly_name="$cpu_friendly_name v$cpu_arch" + [ -n "$cpu_part" ] && cpu_friendly_name="$cpu_friendly_name model $cpu_part" + +- elif grep -qi 'CPU implementer[[:space:]]*:[[:space:]]*0x43' "$procfs/cpuinfo"; then ++ elif @grep@ -qi 'CPU implementer[[:space:]]*:[[:space:]]*0x43' "$procfs/cpuinfo"; then + cpu_vendor='CAVIUM' +- elif grep -qi 'CPU implementer[[:space:]]*:[[:space:]]*0x70' "$procfs/cpuinfo"; then ++ elif @grep@ -qi 'CPU implementer[[:space:]]*:[[:space:]]*0x70' "$procfs/cpuinfo"; then + cpu_vendor='PHYTIUM' + fi + +- cpu_family=$( grep '^cpu family' "$procfs/cpuinfo" | awk '{print $4}' | grep -E '^[0-9]+$' | head -1) +- cpu_model=$( grep '^model' "$procfs/cpuinfo" | awk '{print $3}' | grep -E '^[0-9]+$' | head -1) +- cpu_stepping=$(grep '^stepping' "$procfs/cpuinfo" | awk '{print $3}' | grep -E '^[0-9]+$' | head -1) +- cpu_ucode=$( grep '^microcode' "$procfs/cpuinfo" | awk '{print $3}' | head -1) ++ cpu_family=$( @grep@ '^cpu family' "$procfs/cpuinfo" | @awk@ '{print $4}' | @grep@ -E '^[0-9]+$' | @head@ -1) ++ cpu_model=$( @grep@ '^model' "$procfs/cpuinfo" | @awk@ '{print $3}' | @grep@ -E '^[0-9]+$' | @head@ -1) ++ cpu_stepping=$(@grep@ '^stepping' "$procfs/cpuinfo" | @awk@ '{print $3}' | @grep@ -E '^[0-9]+$' | @head@ -1) ++ cpu_ucode=$( @grep@ '^microcode' "$procfs/cpuinfo" | @awk@ '{print $3}' | @head@ -1) + else +- cpu_vendor=$( dmesg | grep -i -m1 'Origin=' | cut -f2 -w | cut -f2 -d= | cut -f2 -d\" ) +- cpu_family=$( dmesg | grep -i -m1 'Family=' | cut -f4 -w | cut -f2 -d= ) ++ cpu_vendor=$( @dmesg@ | @grep@ -i -m1 'Origin=' | @cut@ -f2 -w | @cut@ -f2 -d= | @cut@ -f2 -d\" ) ++ cpu_family=$( @dmesg@ | @grep@ -i -m1 'Family=' | @cut@ -f4 -w | @cut@ -f2 -d= ) + cpu_family=$(( cpu_family )) +- cpu_model=$( dmesg | grep -i -m1 'Model=' | cut -f5 -w | cut -f2 -d= ) ++ cpu_model=$( @dmesg@ | @grep@ -i -m1 'Model=' | @cut@ -f5 -w | @cut@ -f2 -d= ) + cpu_model=$(( cpu_model )) +- cpu_stepping=$( dmesg | grep -i -m1 'Stepping=' | cut -f6 -w | cut -f2 -d= ) +- cpu_friendly_name=$(sysctl -n hw.model 2>/dev/null) ++ cpu_stepping=$( @dmesg@ | @grep@ -i -m1 'Stepping=' | @cut@ -f6 -w | @cut@ -f2 -d= ) ++ cpu_friendly_name=$(@sysctl@ -n hw.model 2>/dev/null) + fi + + if [ -n "${SMC_MOCK_CPU_FRIENDLY_NAME:-}" ]; then +@@ -1609,7 +1609,7 @@ parse_cpu_details() + # call CPUID + cpucontrol -i 1 /dev/cpuctl0 >/dev/null + # read MSR +- cpu_ucode=$(cpucontrol -m 0x8b /dev/cpuctl0 | awk '{print $3}') ++ cpu_ucode=$(cpucontrol -m 0x8b /dev/cpuctl0 | @awk@ '{print $3}') + # convert to decimal + cpu_ucode=$(( cpu_ucode )) + # convert back to hex +@@ -1628,7 +1628,7 @@ parse_cpu_details() + mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_CPU_UCODE='$cpu_ucode'") + fi + +- echo "$cpu_ucode" | grep -q ^0x && cpu_ucode=$(( cpu_ucode )) ++ echo "$cpu_ucode" | @grep@ -q ^0x && cpu_ucode=$(( cpu_ucode )) + ucode_found=$(printf "family 0x%x model 0x%x stepping 0x%x ucode 0x%x cpuid 0x%x" "$cpu_family" "$cpu_model" "$cpu_stepping" "$cpu_ucode" "$cpu_cpuid") + + # also define those that we will need in other funcs +@@ -1725,8 +1725,8 @@ is_cpu_smt_enabled() + { + # SMT / HyperThreading is enabled if siblings != cpucores + if [ -e "$procfs/cpuinfo" ]; then +- _siblings=$(awk '/^siblings/ {print $3;exit}' "$procfs/cpuinfo") +- _cpucores=$(awk '/^cpu cores/ {print $4;exit}' "$procfs/cpuinfo") ++ _siblings=$(@awk@ '/^siblings/ {print $3;exit}' "$procfs/cpuinfo") ++ _cpucores=$(@awk@ '/^cpu cores/ {print $4;exit}' "$procfs/cpuinfo") + if [ -n "$_siblings" ] && [ -n "$_cpucores" ]; then + if [ "$_siblings" = "$_cpucores" ]; then + return 1 +@@ -1774,10 +1774,10 @@ is_ucode_blacklisted() + $INTEL_FAM6_SANDYBRIDGE_X,0x06,0x61b \ + $INTEL_FAM6_SANDYBRIDGE_X,0x07,0x712 + do +- model=$(echo "$tuple" | cut -d, -f1) +- stepping=$(( $(echo "$tuple" | cut -d, -f2) )) ++ model=$(echo "$tuple" | @cut@ -d, -f1) ++ stepping=$(( $(echo "$tuple" | @cut@ -d, -f2) )) + if [ "$cpu_model" = "$model" ] && [ "$cpu_stepping" = "$stepping" ]; then +- ucode=$(( $(echo "$tuple" | cut -d, -f3) )) ++ ucode=$(( $(echo "$tuple" | @cut@ -d, -f3) )) + if [ "$cpu_ucode" = "$ucode" ]; then + _debug "is_ucode_blacklisted: we have a match! ($cpu_model/$cpu_stepping/$cpu_ucode)" + return 0 +@@ -1865,7 +1865,7 @@ is_xen_dom0() + return 1 + fi + +- if [ -e "$procfs/xen/capabilities" ] && grep -q "control_d" "$procfs/xen/capabilities"; then ++ if [ -e "$procfs/xen/capabilities" ] && @grep@ -q "control_d" "$procfs/xen/capabilities"; then + return 0 + else + return 1 +@@ -1893,13 +1893,13 @@ is_xen_domU() + + if [ -r "$mcedb_cache" ]; then + # we have a local cache file, but it might be older than the builtin version we have +- local_dbversion=$( awk '/^# %%% MCEDB / { print $4 }' "$mcedb_cache") ++ local_dbversion=$( @awk@ '/^# %%% MCEDB / { print $4 }' "$mcedb_cache") + mcedb_source="$mcedb_cache" + mcedb_info="local firmwares DB $local_dbversion" + fi + read_mcedb() + { +- awk '{ if (DELIM==1) { print $2 } } /^# %%% MCEDB / { DELIM=1 }' "$mcedb_source" ++ @awk@ '{ if (DELIM==1) { print $2 } } /^# %%% MCEDB / { DELIM=1 }' "$mcedb_source" + } + + is_latest_known_ucode() +@@ -1920,10 +1920,10 @@ is_latest_known_ucode() + else + return 2 + fi +- for tuple in $(read_mcedb | grep "$(printf "^$cpu_brand_prefix,0x%08X," "$cpu_cpuid")") ++ for tuple in $(read_mcedb | @grep@ "$(printf "^$cpu_brand_prefix,0x%08X," "$cpu_cpuid")") + do +- ucode=$(( $(echo "$tuple" | cut -d, -f3) )) +- ucode_date=$(echo "$tuple" | cut -d, -f4 | sed -r 's=(....)(..)(..)=\1/\2/\3=') ++ ucode=$(( $(echo "$tuple" | @cut@ -d, -f3) )) ++ ucode_date=$(echo "$tuple" | @cut@ -d, -f4 | @sed@ -r 's=(....)(..)(..)=\1/\2/\3=') + _debug "is_latest_known_ucode: with cpuid $cpu_cpuid has ucode $cpu_ucode, last known is $ucode from $ucode_date" + ucode_latest=$(printf "latest version is 0x%x dated $ucode_date according to $mcedb_info" "$ucode") + if [ "$cpu_ucode" -ge "$ucode" ]; then +@@ -1948,7 +1948,7 @@ get_cmdline() + kernel_cmdline="$SMC_MOCK_CMDLINE" + return + else +- kernel_cmdline=$(cat "$procfs/cmdline") ++ kernel_cmdline=$(@cat@ "$procfs/cmdline") + mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_CMDLINE='$kernel_cmdline'") + fi + } +@@ -1956,7 +1956,7 @@ get_cmdline() + # ENTRYPOINT + + # we can't do anything useful under WSL +-if uname -a | grep -qE -- '-Microsoft #[0-9]+-Microsoft '; then ++if @uname@ -a | @grep@ -qE -- '-Microsoft #[0-9]+-Microsoft '; then + _warn "This script doesn't work under Windows Subsystem for Linux" + _warn "You should use the official Microsoft tool instead." + _warn "It can be found under https://aka.ms/SpeculationControlPS" +@@ -2005,15 +2005,15 @@ fi + + # if we're under a BSD, try to mount linprocfs for "$procfs/cpuinfo" + procfs=/proc +-if echo "$os" | grep -q BSD; then ++if echo "$os" | @grep@ -q BSD; then + _debug "We're under BSD, check if we have procfs" +- procfs=$(mount | awk '/^linprocfs/ { print $3; exit; }') ++ procfs=$(@mount@ | @awk@ '/^linprocfs/ { print $3; exit; }') + if [ -z "$procfs" ]; then + _debug "we don't, try to mount it" + procfs=/proc + [ -d /compat/linux/proc ] && procfs=/compat/linux/proc + test -d $procfs || mkdir $procfs +- if mount -t linprocfs linprocfs $procfs 2>/dev/null; then ++ if @mount@ -t linprocfs linprocfs $procfs 2>/dev/null; then + mounted_procfs=1 + _debug "procfs just mounted at $procfs" + else +@@ -2045,14 +2045,14 @@ fi + + if [ "$opt_live" = 1 ]; then + # root check (only for live mode, for offline mode, we already checked if we could read the files) +- if [ "$(id -u)" -ne 0 ]; then ++ if [ "$(@id@ -u)" -ne 0 ]; then + _warn "Note that you should launch this script with root privileges to get accurate information." + _warn "We'll proceed but you might see permission denied errors." + _warn "To run it as root, you can try the following command: sudo $0" + _warn + fi + _info "Checking for vulnerabilities on current system" +- _info "Kernel is \033[35m$os $(uname -r) $(uname -v) $(uname -m)\033[0m" ++ _info "Kernel is \033[35m$os $(@uname@ -r) $(@uname@ -v) $(@uname@ -m)\033[0m" + _info "CPU is \033[35m$cpu_friendly_name\033[0m" + + # try to find the image of the current running kernel +@@ -2060,12 +2060,12 @@ if [ "$opt_live" = 1 ]; then + # specified by user on cmdline, with --live, don't override + : + # first, look for the BOOT_IMAGE hint in the kernel cmdline +- elif echo "$kernel_cmdline" | grep -q 'BOOT_IMAGE='; then +- opt_kernel=$(echo "$kernel_cmdline" | grep -Eo 'BOOT_IMAGE=[^ ]+' | cut -d= -f2) ++ elif echo "$kernel_cmdline" | @grep@ -q 'BOOT_IMAGE='; then ++ opt_kernel=$(echo "$kernel_cmdline" | @grep@ -Eo 'BOOT_IMAGE=[^ ]+' | @cut@ -d= -f2) + _debug "found opt_kernel=$opt_kernel in $procfs/cmdline" + # if the boot partition is within a btrfs subvolume, strip the subvolume name + # if /boot is a separate subvolume, the remainder of the code in this section should handle it +- if echo "$opt_kernel" | grep -q "^/@"; then opt_kernel=$(echo "$opt_kernel" | sed "s:/@[^/]*::"); fi ++ if echo "$opt_kernel" | @grep@ -q "^/@"; then opt_kernel=$(echo "$opt_kernel" | @sed@ "s:/@[^/]*::"); fi + # if we have a dedicated /boot partition, our bootloader might have just called it / + # so try to prepend /boot and see if we find anything + [ -e "/boot/$opt_kernel" ] && opt_kernel="/boot/$opt_kernel" +@@ -2077,7 +2077,7 @@ if [ "$opt_live" = 1 ]; then + # if we didn't find a kernel, default to guessing + if [ ! -e "$opt_kernel" ]; then + # Fedora: +- [ -e "/lib/modules/$(uname -r)/vmlinuz" ] && opt_kernel="/lib/modules/$(uname -r)/vmlinuz" ++ [ -e "/lib/modules/$(@uname@ -r)/vmlinuz" ] && opt_kernel="/lib/modules/$(@uname@ -r)/vmlinuz" + # Slackware: + [ -e "/boot/vmlinuz" ] && opt_kernel="/boot/vmlinuz" + # Arch aarch64: +@@ -2091,24 +2091,24 @@ if [ "$opt_live" = 1 ]; then + # pine64 + [ -e "/boot/pine64/Image" ] && opt_kernel="/boot/pine64/Image" + # generic: +- [ -e "/boot/vmlinuz-$(uname -r)" ] && opt_kernel="/boot/vmlinuz-$(uname -r)" +- [ -e "/boot/kernel-$( uname -r)" ] && opt_kernel="/boot/kernel-$( uname -r)" +- [ -e "/boot/bzImage-$(uname -r)" ] && opt_kernel="/boot/bzImage-$(uname -r)" ++ [ -e "/boot/vmlinuz-$(@uname@ -r)" ] && opt_kernel="/boot/vmlinuz-$(@uname@ -r)" ++ [ -e "/boot/kernel-$( @uname@ -r)" ] && opt_kernel="/boot/kernel-$( @uname@ -r)" ++ [ -e "/boot/bzImage-$(@uname@ -r)" ] && opt_kernel="/boot/bzImage-$(@uname@ -r)" + # Gentoo: +- [ -e "/boot/kernel-genkernel-$(uname -m)-$(uname -r)" ] && opt_kernel="/boot/kernel-genkernel-$(uname -m)-$(uname -r)" ++ [ -e "/boot/kernel-genkernel-$(@uname@ -m)-$(@uname@ -r)" ] && opt_kernel="/boot/kernel-genkernel-$(@uname@ -m)-$(@uname@ -r)" + # NixOS: + [ -e "/run/booted-system/kernel" ] && opt_kernel="/run/booted-system/kernel" + # Guix System: + [ -e "/run/booted-system/kernel/bzImage" ] && opt_kernel="/run/booted-system/kernel/bzImage" + # systemd kernel-install: +- [ -e "/etc/machine-id" ] && [ -e "/boot/$(cat /etc/machine-id)/$(uname -r)/linux" ] && opt_kernel="/boot/$(cat /etc/machine-id)/$(uname -r)/linux" ++ [ -e "/etc/machine-id" ] && [ -e "/boot/$(@cat@ /etc/machine-id)/$(@uname@ -r)/linux" ] && opt_kernel="/boot/$(@cat@ /etc/machine-id)/$(@uname@ -r)/linux" + # Clear Linux: +- str_uname=$(uname -r) ++ str_uname=$(@uname@ -r) + clear_linux_kernel="/lib/kernel/org.clearlinux.${str_uname##*.}.${str_uname%.*}" + [ -e "$clear_linux_kernel" ] && opt_kernel=$clear_linux_kernel + # Custom Arch seems to have the kernel path in its cmdline in the form "\directory\kernelimage", + # with actual \'s instead of /'s: +- custom_arch_kernel=$(echo "$kernel_cmdline" | grep -Eo "(^|\s)\\\\[\\\\a-zA-Z0-9_.-]+" | tr "\\\\" "/" | tr -d '[:space:]') ++ custom_arch_kernel=$(echo "$kernel_cmdline" | @grep@ -Eo "(^|\s)\\\\[\\\\a-zA-Z0-9_.-]+" | @tr@ "\\\\" "/" | @tr@ -d '[:space:]') + if [ -n "$custom_arch_kernel" ] && [ -e "$custom_arch_kernel" ]; then + opt_kernel="$custom_arch_kernel" + fi +@@ -2122,12 +2122,12 @@ if [ "$opt_live" = 1 ]; then + : + elif [ -e "$procfs/kallsyms" ] ; then + opt_map="$procfs/kallsyms" +- elif [ -e "/lib/modules/$(uname -r)/System.map" ] ; then +- opt_map="/lib/modules/$(uname -r)/System.map" +- elif [ -e "/boot/System.map-$(uname -r)" ] ; then +- opt_map="/boot/System.map-$(uname -r)" +- elif [ -e "/lib/kernel/System.map-$(uname -r)" ]; then +- opt_map="/lib/kernel/System.map-$(uname -r)" ++ elif [ -e "/lib/modules/$(@uname@ -r)/System.map" ] ; then ++ opt_map="/lib/modules/$(@uname@ -r)/System.map" ++ elif [ -e "/boot/System.map-$(@uname@ -r)" ] ; then ++ opt_map="/boot/System.map-$(@uname@ -r)" ++ elif [ -e "/lib/kernel/System.map-$(@uname@ -r)" ]; then ++ opt_map="/lib/kernel/System.map-$(@uname@ -r)" + fi + + # config +@@ -2135,18 +2135,18 @@ if [ "$opt_live" = 1 ]; then + # specified by user on cmdline, with --live, don't override + : + elif [ -e "$procfs/config.gz" ] ; then +- dumped_config="$(mktemp -t smc-config-XXXXXX)" +- gunzip -c "$procfs/config.gz" > "$dumped_config" ++ dumped_config="$(@mktemp@ -t smc-config-XXXXXX)" ++ @gunzip@ -c "$procfs/config.gz" > "$dumped_config" + # dumped_config will be deleted at the end of the script + opt_config="$dumped_config" +- elif [ -e "/lib/modules/$(uname -r)/config" ]; then +- opt_config="/lib/modules/$(uname -r)/config" +- elif [ -e "/boot/config-$(uname -r)" ]; then +- opt_config="/boot/config-$(uname -r)" +- elif [ -e "/etc/kernels/kernel-config-$(uname -m)-$(uname -r)" ]; then +- opt_config="/etc/kernels/kernel-config-$(uname -m)-$(uname -r)" +- elif [ -e "/lib/kernel/config-$(uname -r)" ]; then +- opt_config="/lib/kernel/config-$(uname -r)" ++ elif [ -e "/lib/modules/$(@uname@ -r)/config" ]; then ++ opt_config="/lib/modules/$(@uname@ -r)/config" ++ elif [ -e "/boot/config-$(@uname@ -r)" ]; then ++ opt_config="/boot/config-$(@uname@ -r)" ++ elif [ -e "/etc/kernels/kernel-config-$(@uname@ -m)-$(@uname@ -r)" ]; then ++ opt_config="/etc/kernels/kernel-config-$(@uname@ -m)-$(@uname@ -r)" ++ elif [ -e "/lib/kernel/config-$(@uname@ -r)" ]; then ++ opt_config="/lib/kernel/config-$(@uname@ -r)" + fi + else + _info "Checking for vulnerabilities against specified kernel" +@@ -2161,7 +2161,7 @@ else + fi + + if [ "$os" = Linux ]; then +- if [ -n "$opt_config" ] && ! grep -q '^CONFIG_' "$opt_config"; then ++ if [ -n "$opt_config" ] && ! @grep@ -q '^CONFIG_' "$opt_config"; then + # given file is invalid! + _warn "The kernel config file seems invalid, was expecting a plain-text file, ignoring it!" + opt_config='' +@@ -2189,7 +2189,7 @@ if [ "$os" = Linux ]; then + fi + + if [ -e "$opt_kernel" ]; then +- if ! command -v "${opt_arch_prefix}readelf" >/dev/null 2>&1; then ++ if ! command -v "@readelf@" >/dev/null 2>&1; then + _debug "readelf not found" + kernel_err="missing '${opt_arch_prefix}readelf' tool, please install it, usually it's in the 'binutils' package" + elif [ "$opt_sysfs_only" = 1 ] || [ "$opt_hw_only" = 1 ]; then +@@ -2207,20 +2207,20 @@ else + # vanilla kernels have with ^Linux version + # also try harder with some kernels (such as Red Hat) that don't have ^Linux version before their version string + # and check for FreeBSD +- kernel_version=$("${opt_arch_prefix}strings" "$kernel" 2>/dev/null | grep -E \ ++ kernel_version=$("@strings@" "$kernel" 2>/dev/null | @grep@ -E \ + -e '^Linux version ' \ + -e '^[[:alnum:]][^[:space:]]+ \([^[:space:]]+\) #[0-9]+ .+ (19|20)[0-9][0-9]$' \ +- -e '^FreeBSD [0-9]' | head -1) ++ -e '^FreeBSD [0-9]' | @head@ -1) + if [ -z "$kernel_version" ]; then + # try even harder with some kernels (such as ARM) that split the release (uname -r) and version (uname -v) in 2 adjacent strings +- kernel_version=$("${opt_arch_prefix}strings" "$kernel" 2>/dev/null | grep -E -B1 '^#[0-9]+ .+ (19|20)[0-9][0-9]$' | tr "\n" " ") ++ kernel_version=$("@strings@" "$kernel" 2>/dev/null | @grep@ -E -B1 '^#[0-9]+ .+ (19|20)[0-9][0-9]$' | @tr@ "\n" " ") + fi + if [ -n "$kernel_version" ]; then + # in live mode, check if the img we found is the correct one + if [ "$opt_live" = 1 ]; then + _verbose "Kernel image is \033[35m$kernel_version" +- if ! echo "$kernel_version" | grep -qF "$(uname -r)"; then +- _warn "Possible discrepancy between your running kernel '$(uname -r)' and the image '$kernel_version' we found ($opt_kernel), results might be incorrect" ++ if ! echo "$kernel_version" | @grep@ -qF "$(@uname@ -r)"; then ++ _warn "Possible discrepancy between your running kernel '$(@uname@ -r)' and the image '$kernel_version' we found ($opt_kernel), results might be incorrect" + fi + else + _info "Kernel image is \033[35m$kernel_version" +@@ -2248,11 +2248,11 @@ sys_interface_check() + if [ "$opt_live" = 1 ] && [ "$opt_no_sysfs" = 0 ] && [ -r "$file" ]; then + : + else +- mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_SYSFS_$(basename "$file")_RET=1") ++ mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_SYSFS_$(@basename@ "$file")_RET=1") + return 1 + fi + +- _mockvarname="SMC_MOCK_SYSFS_$(basename "$file")_RET" ++ _mockvarname="SMC_MOCK_SYSFS_$(@basename@ "$file")_RET" + # shellcheck disable=SC2086,SC1083 + if [ -n "$(eval echo \${$_mockvarname:-})" ]; then + _debug "sysfs: MOCKING enabled for $file func returns $(eval echo \$$_mockvarname)" +@@ -2261,17 +2261,17 @@ sys_interface_check() + fi + + [ -n "$regex" ] || regex='.*' +- _mockvarname="SMC_MOCK_SYSFS_$(basename "$file")" ++ _mockvarname="SMC_MOCK_SYSFS_$(@basename@ "$file")" + # shellcheck disable=SC2086,SC1083 + if [ -n "$(eval echo \${$_mockvarname:-})" ]; then + fullmsg="$(eval echo \$$_mockvarname)" +- msg=$(echo "$fullmsg" | grep -Eo "$regex") ++ msg=$(echo "$fullmsg" | @grep@ -Eo "$regex") + _debug "sysfs: MOCKING enabled for $file, will return $fullmsg" + mocked=1 + else +- fullmsg=$(cat "$file") +- msg=$(grep -Eo "$regex" "$file") +- mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_SYSFS_$(basename "$file")='$fullmsg'") ++ fullmsg=$(@cat@ "$file") ++ msg=$(@grep@ -Eo "$regex" "$file") ++ mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_SYSFS_$(@basename@ "$file")='$fullmsg'") + fi + if [ "$mode" = silent ]; then + return 0 +@@ -2280,15 +2280,15 @@ sys_interface_check() + return 0 + fi + _info_nol "* Mitigated according to the /sys interface: " +- if echo "$msg" | grep -qi '^not affected'; then ++ if echo "$msg" | @grep@ -qi '^not affected'; then + # Not affected + status=OK + pstatus green YES "$fullmsg" +- elif echo "$msg" | grep -qEi '^(kvm: )?mitigation'; then ++ elif echo "$msg" | @grep@ -qEi '^(kvm: )?mitigation'; then + # Mitigation: PTI + status=OK + pstatus green YES "$fullmsg" +- elif echo "$msg" | grep -qi '^vulnerable'; then ++ elif echo "$msg" | @grep@ -qi '^vulnerable'; then + # Vulnerable + status=VULN + pstatus yellow NO "$fullmsg" +@@ -2376,20 +2376,20 @@ write_msr_one_core() + # ret=4: msr doesn't exist, ret=127: msr.allow_writes=off + [ "$ret" = 127 ] && _write_denied=1 + # or fallback to dd if it supports seek_bytes, we prefer it over perl because we can tell the difference between EPERM and EIO +- elif dd if=/dev/null of=/dev/null bs=8 count=1 seek="$_msr_dec" oflag=seek_bytes 2>/dev/null && [ "${SMC_NO_DD:-}" != 1 ]; then ++ elif @dd@ if=/dev/null of=/dev/null bs=8 count=1 seek="$_msr_dec" oflag=seek_bytes 2>/dev/null && [ "${SMC_NO_DD:-}" != 1 ]; then + _debug "write_msr: using dd" +- dd if=/dev/zero of=/dev/cpu/"$_core"/msr bs=8 count=1 seek="$_msr_dec" oflag=seek_bytes 2>/dev/null; ret=$? ++ @dd@ if=/dev/zero of=/dev/cpu/"$_core"/msr bs=8 count=1 seek="$_msr_dec" oflag=seek_bytes 2>/dev/null; ret=$? + # if it failed, inspect stderrto look for EPERM + if [ "$ret" != 0 ]; then +- if dd if=/dev/zero of=/dev/cpu/"$_core"/msr bs=8 count=1 seek="$_msr_dec" oflag=seek_bytes 2>&1 | grep -qF 'Operation not permitted'; then ++ if @dd@ if=/dev/zero of=/dev/cpu/"$_core"/msr bs=8 count=1 seek="$_msr_dec" oflag=seek_bytes 2>&1 | @grep@ -qF 'Operation not permitted'; then + _write_denied=1 + fi + fi + # or if we have perl, use it, any 5.x version will work +- elif command -v perl >/dev/null 2>&1 && [ "${SMC_NO_PERL:-}" != 1 ]; then ++ elif command -v @perl@ >/dev/null 2>&1 && [ "${SMC_NO_PERL:-}" != 1 ]; then + _debug "write_msr: using perl" + ret=1 +- perl -e "open(M,'>','/dev/cpu/$_core/msr') and seek(M,$_msr_dec,0) and exit(syswrite(M,pack('H16',0)))"; [ $? -eq 8 ] && ret=0 ++ @perl@ -e "open(M,'>','/dev/cpu/$_core/msr') and seek(M,$_msr_dec,0) and exit(syswrite(M,pack('H16',0)))"; [ $? -eq 8 ] && ret=0 + else + _debug "write_msr: got no wrmsr, perl or recent enough dd!" + mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_WRMSR_${_msr}_RET=$WRITE_MSR_RET_ERR") +@@ -2411,13 +2411,13 @@ write_msr_one_core() + msr_locked_down=1 + write_msr_msg="your kernel is configured to deny writes to MSRs from user space" + return $WRITE_MSR_RET_LOCKDOWN +- elif dmesg | grep -qF "msr: Direct access to MSR"; then ++ elif @dmesg@ | @grep@ -qF "msr: Direct access to MSR"; then + _debug "write_msr: locked down kernel detected (Red Hat / Fedora)" + mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_WRMSR_${_msr}_RET=$WRITE_MSR_RET_LOCKDOWN") + msr_locked_down=1 + write_msr_msg="your kernel is locked down (Fedora/Red Hat), please reboot without secure boot and retry" + return $WRITE_MSR_RET_LOCKDOWN +- elif dmesg | grep -qF "raw MSR access is restricted"; then ++ elif @dmesg@ | @grep@ -qF "raw MSR access is restricted"; then + _debug "write_msr: locked down kernel detected (vanilla)" + mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_WRMSR_${_msr}_RET=$WRITE_MSR_RET_LOCKDOWN") + msr_locked_down=1 +@@ -2516,8 +2516,8 @@ read_msr_one_core() + return $READ_MSR_RET_KO + fi + # MSR 0x10: 0x000003e1 0xb106dded +- _msr_h=$(echo "$_msr" | awk '{print $3}'); +- _msr_l=$(echo "$_msr" | awk '{print $4}'); ++ _msr_h=$(echo "$_msr" | @awk@ '{print $3}'); ++ _msr_l=$(echo "$_msr" | @awk@ '{print $4}'); + read_msr_value=$(( _msr_h << 32 | _msr_l )) + else + # for Linux +@@ -2528,15 +2528,15 @@ read_msr_one_core() + # if rdmsr is available, use it + elif command -v rdmsr >/dev/null 2>&1 && [ "${SMC_NO_RDMSR:-}" != 1 ]; then + _debug "read_msr: using rdmsr on $_msr" +- read_msr_value=$(rdmsr -r $_msr_dec 2>/dev/null | od -t u8 -A n) ++ read_msr_value=$(rdmsr -r $_msr_dec 2>/dev/null | @od@ -t u8 -A n) + # or if we have perl, use it, any 5.x version will work +- elif command -v perl >/dev/null 2>&1 && [ "${SMC_NO_PERL:-}" != 1 ]; then ++ elif command -v @perl@ >/dev/null 2>&1 && [ "${SMC_NO_PERL:-}" != 1 ]; then + _debug "read_msr: using perl on $_msr" +- read_msr_value=$(perl -e "open(M,'<','/dev/cpu/$_core/msr') and seek(M,$_msr_dec,0) and read(M,\$_,8) and print" | od -t u8 -A n) ++ read_msr_value=$(@perl@ -e "open(M,'<','/dev/cpu/$_core/msr') and seek(M,$_msr_dec,0) and read(M,\$_,8) and print" | @od@ -t u8 -A n) + # fallback to dd if it supports skip_bytes +- elif dd if=/dev/null of=/dev/null bs=8 count=1 skip="$_msr_dec" iflag=skip_bytes 2>/dev/null; then ++ elif @dd@ if=/dev/null of=/dev/null bs=8 count=1 skip="$_msr_dec" iflag=skip_bytes 2>/dev/null; then + _debug "read_msr: using dd on $_msr" +- read_msr_value=$(dd if=/dev/cpu/"$_core"/msr bs=8 count=1 skip="$_msr_dec" iflag=skip_bytes 2>/dev/null | od -t u8 -A n) ++ read_msr_value=$(@dd@ if=/dev/cpu/"$_core"/msr bs=8 count=1 skip="$_msr_dec" iflag=skip_bytes 2>/dev/null | @od@ -t u8 -A n) + else + _debug "read_msr: got no rdmsr, perl or recent enough dd!" + mockme=$(printf "%b\n%b" "$mockme" "SMC_MOCK_RDMSR_${_msr}_RET=$READ_MSR_RET_ERR") +@@ -2560,7 +2560,7 @@ check_cpu() + { + _info "\033[1;34mHardware check\033[0m" + +- if ! uname -m | grep -qwE 'x86_64|i[3-6]86|amd64'; then ++ if ! @uname@ -m | @grep@ -qwE 'x86_64|i[3-6]86|amd64'; then + return + fi + +@@ -3176,19 +3176,19 @@ check_redhat_canonical_spectre() + # if we were already called, don't do it again + [ -n "${redhat_canonical_spectre:-}" ] && return + +- if ! command -v "${opt_arch_prefix}strings" >/dev/null 2>&1; then ++ if ! command -v "@strings@" >/dev/null 2>&1; then + redhat_canonical_spectre=-1 + elif [ -n "$kernel_err" ]; then + redhat_canonical_spectre=-2 + else + # Red Hat / Ubuntu specific variant1 patch is difficult to detect, + # let's use the two same tricks than the official Red Hat detection script uses: +- if "${opt_arch_prefix}strings" "$kernel" | grep -qw noibrs && "${opt_arch_prefix}strings" "$kernel" | grep -qw noibpb; then ++ if "@strings@" "$kernel" | @grep@ -qw noibrs && "@strings@" "$kernel" | @grep@ -qw noibpb; then + # 1) detect their specific variant2 patch. If it's present, it means + # that the variant1 patch is also present (both were merged at the same time) + _debug "found redhat/canonical version of the variant2 patch (implies variant1)" + redhat_canonical_spectre=1 +- elif "${opt_arch_prefix}strings" "$kernel" | grep -q 'x86/pti:'; then ++ elif "@strings@" "$kernel" | @grep@ -q 'x86/pti:'; then + # 2) detect their specific variant3 patch. If it's present, but the variant2 + # is not, it means that only variant1 is present in addition to variant3 + _debug "found redhat/canonical version of the variant3 patch (implies variant1 but not variant2)" +@@ -3213,13 +3213,13 @@ check_has_vmm() + # If we find no evidence that this is the case, assume we're not (to avoid scaring users), + # this can always be overridden with --vmm in any case. + has_vmm=0 +- if command -v pgrep >/dev/null 2>&1; then ++ if command -v @pgrep@ >/dev/null 2>&1; then + # remove xenbus and xenwatch, also present inside domU + # remove libvirtd as it can also be used to manage containers and not VMs + # for each binary we want to grep, get the pids + for _binary in qemu kvm xenstored xenconsoled + do +- for _pid in $(pgrep -x $_binary) ++ for _pid in $(@pgrep@ -x $_binary) + do + # resolve the exe symlink, if it doesn't resolve with -m, + # which doesn't even need the dest to exist, it means the symlink +@@ -3235,7 +3235,7 @@ check_has_vmm() + else + # ignore SC2009 as `ps ax` is actually used as a fallback if `pgrep` isn't installed + # shellcheck disable=SC2009 +- if command -v ps >/devnull && ps ax | grep -vw grep | grep -q -e '\/devnull && ps ax | @grep@ -vw grep | @grep@ -q -e '\/dev/null 2>&1; then ++ elif ! command -v @perl@ >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing 'perl' binary, please install it" + else +- perl -ne '/\x0f\x83....\x48\x19\xd2\x48\x21\xd0/ and $found++; END { exit($found) }' "$kernel"; ret=$? ++ @perl@ -ne '/\x0f\x83....\x48\x19\xd2\x48\x21\xd0/ and $found++; END { exit($found) }' "$kernel"; ret=$? + if [ $ret -gt 0 ]; then + pstatus green YES "$ret occurrence(s) found of x86 64 bits array_index_mask_nospec()" + v1_mask_nospec="x86 64 bits array_index_mask_nospec" + else +- perl -ne '/\x3b\x82..\x00\x00\x73.\x19\xd2\x21\xd0/ and $found++; END { exit($found) }' "$kernel"; ret=$? ++ @perl@ -ne '/\x3b\x82..\x00\x00\x73.\x19\xd2\x21\xd0/ and $found++; END { exit($found) }' "$kernel"; ret=$? + if [ $ret -gt 0 ]; then + pstatus green YES "$ret occurrence(s) found of x86 32 bits array_index_mask_nospec()" + v1_mask_nospec="x86 32 bits array_index_mask_nospec" + else +- ret=$("${opt_arch_prefix}objdump" $objdump_options "$kernel" | grep -w -e f3af8014 -e e320f014 -B2 | grep -B1 -w sbc | grep -w -c cmp) ++ ret=$("@objdump@" $objdump_options "$kernel" | @grep@ -w -e f3af8014 -e e320f014 -B2 | @grep@ -B1 -w sbc | @grep@ -w -c cmp) + if [ "$ret" -gt 0 ]; then + pstatus green YES "$ret occurrence(s) found of arm 32 bits array_index_mask_nospec()" + v1_mask_nospec="arm 32 bits array_index_mask_nospec" +@@ -3376,12 +3376,12 @@ check_CVE_2017_5753_linux() + pstatus yellow NO + elif [ -n "$kernel_err" ]; then + pstatus yellow UNKNOWN "couldn't check ($kernel_err)" +- elif ! command -v perl >/dev/null 2>&1; then ++ elif ! command -v @perl@ >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing 'perl' binary, please install it" +- elif ! command -v "${opt_arch_prefix}objdump" >/dev/null 2>&1; then ++ elif ! command -v "@objdump@" >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing '${opt_arch_prefix}objdump' tool, please install it, usually it's in the binutils package" + else +- "${opt_arch_prefix}objdump" $objdump_options "$kernel" | perl -ne 'push @r, $_; /\s(hint|csdb)\s/ && $r[0]=~/\ssub\s+(x\d+)/ && $r[1]=~/\sbic\s+$1,\s+$1,/ && $r[2]=~/\sand\s/ && exit(9); shift @r if @r>3'; ret=$? ++ "@objdump@" $objdump_options "$kernel" | @perl@ -ne 'push @r, $_; /\s(hint|csdb)\s/ && $r[0]=~/\ssub\s+(x\d+)/ && $r[1]=~/\sbic\s+$1,\s+$1,/ && $r[2]=~/\sand\s/ && exit(9); shift @r if @r>3'; ret=$? + if [ "$ret" -eq 9 ]; then + pstatus green YES "mask_nospec64 macro is present and used" + v1_mask_nospec="arm64 mask_nospec64" +@@ -3403,12 +3403,12 @@ check_CVE_2017_5753_linux() + pstatus yellow NO + elif [ -n "$kernel_err" ]; then + pstatus yellow UNKNOWN "couldn't check ($kernel_err)" +- elif ! command -v perl >/dev/null 2>&1; then ++ elif ! command -v @perl@ >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing 'perl' binary, please install it" +- elif ! command -v "${opt_arch_prefix}objdump" >/dev/null 2>&1; then ++ elif ! command -v "@objdump@" >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing '${opt_arch_prefix}objdump' tool, please install it, usually it's in the binutils package" + else +- "${opt_arch_prefix}objdump" -d "$kernel" | perl -ne 'push @r, $_; /\s(hint|csdb)\s/ && $r[0]=~/\smov\s+(w\d+),\s+(w\d+)/ && $r[1]=~/\scmp\s+(x\d+),\s+(x\d+)/ && $r[2]=~/\sngc\s+$2,/ && exit(9); shift @r if @r>3'; ret=$? ++ "@objdump@" -d "$kernel" | @perl@ -ne 'push @r, $_; /\s(hint|csdb)\s/ && $r[0]=~/\smov\s+(w\d+),\s+(w\d+)/ && $r[1]=~/\scmp\s+(x\d+),\s+(x\d+)/ && $r[2]=~/\sngc\s+$2,/ && exit(9); shift @r if @r>3'; ret=$? + if [ "$ret" -eq 9 ]; then + pstatus green YES "array_index_nospec macro is present and used" + v1_mask_nospec="arm64 array_index_nospec" +@@ -3424,7 +3424,7 @@ check_CVE_2017_5753_linux() + if [ -n "$kernel_err" ]; then + pstatus yellow UNKNOWN "couldn't check ($kernel_err)" + else +- if ! command -v "${opt_arch_prefix}objdump" >/dev/null 2>&1; then ++ if ! command -v "@objdump@" >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing '${opt_arch_prefix}objdump' tool, please install it, usually it's in the binutils package" + else + # here we disassemble the kernel and count the number of occurrences of the LFENCE opcode +@@ -3434,7 +3434,7 @@ check_CVE_2017_5753_linux() + # so let's push the threshold to 70. + # v0.33+: now only count lfence opcodes after a jump, way less error-prone + # non patched kernel have between 0 and 20 matches, patched ones have at least 40-45 +- nb_lfence=$("${opt_arch_prefix}objdump" $objdump_options "$kernel" 2>/dev/null | grep -w -B1 lfence | grep -Ewc 'jmp|jne|je') ++ nb_lfence=$("@objdump@" $objdump_options "$kernel" 2>/dev/null | @grep@ -w -B1 lfence | @grep@ -Ewc 'jmp|jne|je') + if [ "$nb_lfence" -lt 30 ]; then + pstatus yellow NO "only $nb_lfence jump-then-lfence instructions found, should be >= 30 (heuristic)" + else +@@ -3505,7 +3505,7 @@ check_CVE_2017_5715() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2017_5715_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2017_5715_bsd + else + _warn "Unsupported OS ($os)" +@@ -3547,13 +3547,13 @@ check_CVE_2017_5715_linux() + # /proc/sys/kernel/ibrs_enabled: OpenSUSE tumbleweed + specex_knob_dir=$dir + ibrs_supported="$dir/ibrs_enabled exists" +- ibrs_enabled=$(cat "$dir/ibrs_enabled" 2>/dev/null) ++ ibrs_enabled=$(@cat@ "$dir/ibrs_enabled" 2>/dev/null) + _debug "ibrs: found $dir/ibrs_enabled=$ibrs_enabled" + # if ibrs_enabled is there, ibpb_enabled will be in the same dir + if [ -e "$dir/ibpb_enabled" ]; then + # if the file is there, we have IBPB compiled-in (see note above for IBRS) + ibpb_supported="$dir/ibpb_enabled exists" +- ibpb_enabled=$(cat "$dir/ibpb_enabled" 2>/dev/null) ++ ibpb_enabled=$(@cat@ "$dir/ibpb_enabled" 2>/dev/null) + _debug "ibpb: found $dir/ibpb_enabled=$ibpb_enabled" + else + _debug "ibpb: $dir/ibpb_enabled file doesn't exist" +@@ -3568,7 +3568,7 @@ check_CVE_2017_5715_linux() + # which in that case means ibrs is supported *and* enabled for kernel & user + # as per the ibrs patch series v3 + if [ -z "$ibrs_supported" ]; then +- if grep ^flags "$procfs/cpuinfo" | grep -qw spec_ctrl_ibrs; then ++ if @grep@ ^flags "$procfs/cpuinfo" | @grep@ -qw spec_ctrl_ibrs; then + _debug "ibrs: found spec_ctrl_ibrs flag in $procfs/cpuinfo" + ibrs_supported="spec_ctrl_ibrs flag in $procfs/cpuinfo" + # enabled=2 -> kernel & user +@@ -3578,13 +3578,13 @@ check_CVE_2017_5715_linux() + fi + if [ -n "$fullmsg" ]; then + # when IBPB is enabled on 4.15+, we can see it in sysfs +- if echo "$fullmsg" | grep -q 'IBPB'; then ++ if echo "$fullmsg" | @grep@ -q 'IBPB'; then + _debug "ibpb: found enabled in sysfs" + [ -z "$ibpb_supported" ] && ibpb_supported='IBPB found enabled in sysfs' + [ -z "$ibpb_enabled" ] && ibpb_enabled=1 + fi + # when IBRS_FW is enabled on 4.15+, we can see it in sysfs +- if echo "$fullmsg" | grep -q ', IBRS_FW'; then ++ if echo "$fullmsg" | @grep@ -q ', IBRS_FW'; then + _debug "ibrs: found IBRS_FW in sysfs" + [ -z "$ibrs_supported" ] && ibrs_supported='found IBRS_FW in sysfs' + ibrs_fw_enabled=1 +@@ -3592,13 +3592,13 @@ check_CVE_2017_5715_linux() + # when IBRS is enabled on 4.15+, we can see it in sysfs + # on a more recent kernel, classic "IBRS" is not even longer an option, because of the performance impact. + # only "Enhanced IBRS" is available (on CPUs with the IBRS_ALL flag) +- if echo "$fullmsg" | grep -q -e '\' -e 'Indirect Branch Restricted Speculation'; then ++ if echo "$fullmsg" | @grep@ -q -e '\' -e 'Indirect Branch Restricted Speculation'; then + _debug "ibrs: found IBRS in sysfs" + [ -z "$ibrs_supported" ] && ibrs_supported='found IBRS in sysfs' + [ -z "$ibrs_enabled" ] && ibrs_enabled=3 + fi + # checking for 'Enhanced IBRS' in sysfs, enabled on CPUs with IBRS_ALL +- if echo "$fullmsg" | grep -q -e 'Enhanced IBRS'; then ++ if echo "$fullmsg" | @grep@ -q -e 'Enhanced IBRS'; then + [ -z "$ibrs_supported" ] && ibrs_supported='found Enhanced IBRS in sysfs' + # 4 isn't actually a valid value of the now extinct "ibrs_enabled" flag file, + # that only went from 0 to 3, so we use 4 as "enhanced ibrs is enabled" +@@ -3617,11 +3617,11 @@ check_CVE_2017_5715_linux() + fi + fi + if [ -z "$ibrs_supported" ] && [ -n "$kernel" ]; then +- if ! command -v "${opt_arch_prefix}strings" >/dev/null 2>&1; then ++ if ! command -v "@strings@" >/dev/null 2>&1; then + : + else + ibrs_can_tell=1 +- ibrs_supported=$("${opt_arch_prefix}strings" "$kernel" | grep -Fw -e ', IBRS_FW' | head -1) ++ ibrs_supported=$("@strings@" "$kernel" | @grep@ -Fw -e ', IBRS_FW' | @head@ -1) + if [ -n "$ibrs_supported" ]; then + _debug "ibrs: found ibrs evidence in kernel image ($ibrs_supported)" + ibrs_supported="found '$ibrs_supported' in kernel image" +@@ -3630,7 +3630,7 @@ check_CVE_2017_5715_linux() + fi + if [ -z "$ibrs_supported" ] && [ -n "$opt_map" ]; then + ibrs_can_tell=1 +- if grep -q spec_ctrl "$opt_map"; then ++ if @grep@ -q spec_ctrl "$opt_map"; then + ibrs_supported="found spec_ctrl in symbols file" + _debug "ibrs: found '*spec_ctrl*' symbol in $opt_map" + fi +@@ -3638,11 +3638,11 @@ check_CVE_2017_5715_linux() + # recent (4.15) vanilla kernels have IBPB but not IBRS, and without the debugfs tunables of Red Hat + # we can detect it directly in the image + if [ -z "$ibpb_supported" ] && [ -n "$kernel" ]; then +- if ! command -v "${opt_arch_prefix}strings" >/dev/null 2>&1; then ++ if ! command -v "@strings@" >/dev/null 2>&1; then + : + else + ibpb_can_tell=1 +- ibpb_supported=$("${opt_arch_prefix}strings" "$kernel" | grep -Fw -e 'ibpb' -e ', IBPB' | head -1) ++ ibpb_supported=$("@strings@" "$kernel" | @grep@ -Fw -e 'ibpb' -e ', IBPB' | @head@ -1) + if [ -n "$ibpb_supported" ]; then + _debug "ibpb: found ibpb evidence in kernel image ($ibpb_supported)" + ibpb_supported="found '$ibpb_supported' in kernel image" +@@ -3691,9 +3691,9 @@ check_CVE_2017_5715_linux() + 2) if [ "$ibrs_fw_enabled" = 1 ]; then pstatus green YES "for kernel, user space, and firmware code" ; else pstatus green YES "for both kernel and user space"; fi;; + 3) if [ "$ibrs_fw_enabled" = 1 ]; then pstatus green YES "for kernel and firmware code"; else pstatus green YES; fi;; + 4) pstatus green YES "Enhanced flavor, performance impact will be greatly reduced";; +- *) if [ "$cpuid_ibrs" != 'SPEC_CTRL' ] && [ "$cpuid_ibrs" != 'IBRS_SUPPORT' ] && [ "$cpuid_spec_ctrl" != -1 ]; +- then pstatus yellow NO; _debug "ibrs: known cpu not supporting SPEC-CTRL or IBRS"; +- else ++ *) if [ "$cpuid_ibrs" != 'SPEC_CTRL' ] && [ "$cpuid_ibrs" != 'IBRS_SUPPORT' ] && [ "$cpuid_spec_ctrl" != -1 ]; ++ then pstatus yellow NO; _debug "ibrs: known cpu not supporting SPEC-CTRL or IBRS"; ++ else + pstatus yellow UNKNOWN; fi;; + esac + fi +@@ -3744,7 +3744,7 @@ check_CVE_2017_5715_linux() + bp_harden='' + if [ -r "$opt_config" ]; then + bp_harden_can_tell=1 +- bp_harden=$(grep -w 'CONFIG_HARDEN_BRANCH_PREDICTOR=y' "$opt_config") ++ bp_harden=$(@grep@ -w 'CONFIG_HARDEN_BRANCH_PREDICTOR=y' "$opt_config") + if [ -n "$bp_harden" ]; then + pstatus green YES + _debug "bp_harden: found '$bp_harden' in $opt_config" +@@ -3752,7 +3752,7 @@ check_CVE_2017_5715_linux() + fi + if [ -z "$bp_harden" ] && [ -n "$opt_map" ]; then + bp_harden_can_tell=1 +- bp_harden=$(grep -w bp_hardening_data "$opt_map") ++ bp_harden=$(@grep@ -w bp_hardening_data "$opt_map") + if [ -n "$bp_harden" ]; then + pstatus green YES + _debug "bp_harden: found '$bp_harden' in $opt_map" +@@ -3770,11 +3770,11 @@ check_CVE_2017_5715_linux() + # We check the RETPOLINE kernel options + retpoline=0 + if [ -r "$opt_config" ]; then +- if grep -q '^CONFIG_RETPOLINE=y' "$opt_config"; then ++ if @grep@ -q '^CONFIG_RETPOLINE=y' "$opt_config"; then + pstatus green YES + retpoline=1 + # shellcheck disable=SC2046 +- _debug 'retpoline: found '$(grep '^CONFIG_RETPOLINE' "$opt_config")" in $opt_config" ++ _debug 'retpoline: found '$(@grep@ '^CONFIG_RETPOLINE' "$opt_config")" in $opt_config" + else + pstatus yellow NO + fi +@@ -3795,8 +3795,8 @@ check_CVE_2017_5715_linux() + # since 5.15.28, this is now "Retpolines" as the implementation was switched to a generic one, + # so we look for both "retpoline" and "retpolines" + if [ "$opt_live" = 1 ] && [ -n "$fullmsg" ]; then +- if echo "$fullmsg" | grep -qwi -e retpoline -e retpolines; then +- if echo "$fullmsg" | grep -qwi minimal; then ++ if echo "$fullmsg" | @grep@ -qwi -e retpoline -e retpolines; then ++ if echo "$fullmsg" | @grep@ -qwi minimal; then + retpoline_compiler=0 + retpoline_compiler_reason="kernel reports minimal retpoline compilation" + else +@@ -3806,19 +3806,19 @@ check_CVE_2017_5715_linux() + fi + elif [ -n "$opt_map" ]; then + # look for the symbol +- if grep -qw noretpoline_setup "$opt_map"; then ++ if @grep@ -qw noretpoline_setup "$opt_map"; then + retpoline_compiler=1 + retpoline_compiler_reason="noretpoline_setup symbol found in System.map" + fi + elif [ -n "$kernel" ]; then + # look for the symbol +- if command -v "${opt_arch_prefix}nm" >/dev/null 2>&1; then ++ if command -v "@nm@" >/dev/null 2>&1; then + # the proper way: use nm and look for the symbol +- if "${opt_arch_prefix}nm" "$kernel" 2>/dev/null | grep -qw 'noretpoline_setup'; then ++ if "@nm@" "$kernel" 2>/dev/null | @grep@ -qw 'noretpoline_setup'; then + retpoline_compiler=1 + retpoline_compiler_reason="noretpoline_setup found in kernel symbols" + fi +- elif grep -q noretpoline_setup "$kernel"; then ++ elif @grep@ -q noretpoline_setup "$kernel"; then + # if we don't have nm, nevermind, the symbol name is long enough to not have + # any false positive using good old grep directly on the binary + retpoline_compiler=1 +@@ -3847,7 +3847,7 @@ check_CVE_2017_5715_linux() + retp_enabled=-1 + if [ "$opt_live" = 1 ]; then + if [ -e "$specex_knob_dir/retp_enabled" ]; then +- retp_enabled=$(cat "$specex_knob_dir/retp_enabled" 2>/dev/null) ++ retp_enabled=$(@cat@ "$specex_knob_dir/retp_enabled" 2>/dev/null) + _debug "retpoline: found $specex_knob_dir/retp_enabled=$retp_enabled" + _info_nol " * Retpoline is enabled: " + if [ "$retp_enabled" = 1 ]; then +@@ -3877,7 +3877,7 @@ check_CVE_2017_5715_linux() + rsb_filling=0 + if [ "$opt_live" = 1 ] && [ "$opt_no_sysfs" != 1 ]; then + # if we're live and we aren't denied looking into /sys, let's do it +- if echo "$msg" | grep -qw RSB; then ++ if echo "$msg" | @grep@ -qw RSB; then + rsb_filling=1 + pstatus green YES + fi +@@ -3886,7 +3886,7 @@ check_CVE_2017_5715_linux() + if [ -n "$kernel_err" ]; then + pstatus yellow UNKNOWN "couldn't check ($kernel_err)" + else +- if grep -qw -e 'Filling RSB on context switch' "$kernel"; then ++ if @grep@ -qw -e 'Filling RSB on context switch' "$kernel"; then + rsb_filling=1 + pstatus green YES + else +@@ -4048,7 +4048,7 @@ check_CVE_2017_5715_bsd() + { + _info "* Mitigation 1" + _info_nol " * Kernel supports IBRS: " +- ibrs_disabled=$(sysctl -n hw.ibrs_disable 2>/dev/null) ++ ibrs_disabled=$(@sysctl@ -n hw.ibrs_disable 2>/dev/null) + if [ -z "$ibrs_disabled" ]; then + pstatus yellow NO + else +@@ -4056,7 +4056,7 @@ check_CVE_2017_5715_bsd() + fi + + _info_nol " * IBRS enabled and active: " +- ibrs_active=$(sysctl -n hw.ibrs_active 2>/dev/null) ++ ibrs_active=$(@sysctl@ -n hw.ibrs_active 2>/dev/null) + if [ "$ibrs_active" = 1 ]; then + pstatus green YES + else +@@ -4069,10 +4069,10 @@ check_CVE_2017_5715_bsd() + if [ -n "$kernel_err" ]; then + pstatus yellow UNKNOWN "couldn't check ($kernel_err)" + else +- if ! command -v "${opt_arch_prefix}readelf" >/dev/null 2>&1; then ++ if ! command -v "@readelf@" >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing '${opt_arch_prefix}readelf' tool, please install it, usually it's in the binutils package" + else +- nb_thunks=$("${opt_arch_prefix}readelf" -s "$kernel" | grep -c -e __llvm_retpoline_ -e __llvm_external_retpoline_ -e __x86_indirect_thunk_) ++ nb_thunks=$("@readelf@" -s "$kernel" | @grep@ -c -e __llvm_retpoline_ -e __llvm_external_retpoline_ -e __x86_indirect_thunk_) + if [ "$nb_thunks" -gt 0 ]; then + retpoline=1 + pstatus green YES "found $nb_thunks thunk(s)" +@@ -4113,7 +4113,7 @@ check_CVE_2017_5715_bsd() + pti_performance_check() + { + _info_nol " * Reduced performance impact of PTI: " +- if [ -e "$procfs/cpuinfo" ] && grep ^flags "$procfs/cpuinfo" | grep -qw pcid; then ++ if [ -e "$procfs/cpuinfo" ] && @grep@ ^flags "$procfs/cpuinfo" | @grep@ -qw pcid; then + cpu_pcid=1 + else + read_cpuid 0x1 0x0 $ECX 17 1 1; ret=$? +@@ -4122,7 +4122,7 @@ pti_performance_check() + fi + fi + +- if [ -e "$procfs/cpuinfo" ] && grep ^flags "$procfs/cpuinfo" | grep -qw invpcid; then ++ if [ -e "$procfs/cpuinfo" ] && @grep@ ^flags "$procfs/cpuinfo" | @grep@ -qw invpcid; then + cpu_invpcid=1 + else + read_cpuid 0x7 0x0 $EBX 10 1 1; ret=$? +@@ -4147,7 +4147,7 @@ check_CVE_2017_5754() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2017_5754_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2017_5754_bsd + else + _warn "Unsupported OS ($os)" +@@ -4169,7 +4169,7 @@ check_CVE_2017_5754_linux() + kpti_can_tell=0 + if [ -n "$opt_config" ]; then + kpti_can_tell=1 +- kpti_support=$(grep -w -e CONFIG_PAGE_TABLE_ISOLATION=y -e CONFIG_KAISER=y -e CONFIG_UNMAP_KERNEL_AT_EL0=y "$opt_config") ++ kpti_support=$(@grep@ -w -e CONFIG_PAGE_TABLE_ISOLATION=y -e CONFIG_KAISER=y -e CONFIG_UNMAP_KERNEL_AT_EL0=y "$opt_config") + if [ -n "$kpti_support" ]; then + _debug "kpti_support: found option '$kpti_support' in $opt_config" + fi +@@ -4179,7 +4179,7 @@ check_CVE_2017_5754_linux() + # so we try to find an exported symbol that is part of the PTI patch in System.map + # parse_kpti: arm + kpti_can_tell=1 +- kpti_support=$(grep -w -e kpti_force_enabled -e parse_kpti "$opt_map") ++ kpti_support=$(@grep@ -w -e kpti_force_enabled -e parse_kpti "$opt_map") + if [ -n "$kpti_support" ]; then + _debug "kpti_support: found '$kpti_support' in $opt_map" + fi +@@ -4189,10 +4189,10 @@ check_CVE_2017_5754_linux() + # nopti option that is part of the patch (kernel command line option) + # 'kpti=': arm + kpti_can_tell=1 +- if ! command -v "${opt_arch_prefix}strings" >/dev/null 2>&1; then ++ if ! command -v "@strings@" >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing '${opt_arch_prefix}strings' tool, please install it, usually it's in the binutils package" + else +- kpti_support=$("${opt_arch_prefix}strings" "$kernel" | grep -w -e nopti -e kpti=) ++ kpti_support=$("@strings@" "$kernel" | @grep@ -w -e nopti -e kpti=) + if [ -n "$kpti_support" ]; then + _debug "kpti_support: found '$kpti_support' in $kernel" + fi +@@ -4219,20 +4219,20 @@ check_CVE_2017_5754_linux() + dmesg_grep="$dmesg_grep|x86/pti: Unmapping kernel while in userspace" + # aarch64 + dmesg_grep="$dmesg_grep|CPU features: detected( feature)?: Kernel page table isolation \(KPTI\)" +- if grep ^flags "$procfs/cpuinfo" | grep -qw pti; then ++ if @grep@ ^flags "$procfs/cpuinfo" | @grep@ -qw pti; then + # vanilla PTI patch sets the 'pti' flag in cpuinfo + _debug "kpti_enabled: found 'pti' flag in $procfs/cpuinfo" + kpti_enabled=1 +- elif grep ^flags "$procfs/cpuinfo" | grep -qw kaiser; then ++ elif @grep@ ^flags "$procfs/cpuinfo" | @grep@ -qw kaiser; then + # kernel line 4.9 sets the 'kaiser' flag in cpuinfo + _debug "kpti_enabled: found 'kaiser' flag in $procfs/cpuinfo" + kpti_enabled=1 + elif [ -e /sys/kernel/debug/x86/pti_enabled ]; then + # Red Hat Backport creates a dedicated file, see https://access.redhat.com/articles/3311301 +- kpti_enabled=$(cat /sys/kernel/debug/x86/pti_enabled 2>/dev/null) ++ kpti_enabled=$(@cat@ /sys/kernel/debug/x86/pti_enabled 2>/dev/null) + _debug "kpti_enabled: file /sys/kernel/debug/x86/pti_enabled exists and says: $kpti_enabled" + elif is_xen_dom0; then +- pti_xen_pv_domU=$(xl dmesg | grep 'XPTI' | grep 'DomU enabled' | head -1) ++ pti_xen_pv_domU=$(xl @dmesg@ | @grep@ 'XPTI' | @grep@ 'DomU enabled' | @head@ -1) + + [ -n "$pti_xen_pv_domU" ] && kpti_enabled=1 + fi +@@ -4307,7 +4307,7 @@ check_CVE_2017_5754_linux() + if [ -n "$kpti_support" ]; then + if [ -e "/sys/kernel/debug/x86/pti_enabled" ]; then + explain "Your kernel supports PTI but it's disabled, you can enable it with \`echo 1 > /sys/kernel/debug/x86/pti_enabled\`" +- elif echo "$kernel_cmdline" | grep -q -w -e nopti -e pti=off; then ++ elif echo "$kernel_cmdline" | @grep@ -q -w -e nopti -e pti=off; then + explain "Your kernel supports PTI but it has been disabled on command-line, remove the nopti or pti=off option from your bootloader configuration" + else + explain "Your kernel supports PTI but it has been disabled, check \`dmesg\` right after boot to find clues why the system disabled it" +@@ -4358,7 +4358,7 @@ check_CVE_2017_5754_linux() + check_CVE_2017_5754_bsd() + { + _info_nol "* Kernel supports Page Table Isolation (PTI): " +- kpti_enabled=$(sysctl -n vm.pmap.pti 2>/dev/null) ++ kpti_enabled=$(@sysctl@ -n vm.pmap.pti 2>/dev/null) + if [ -z "$kpti_enabled" ]; then + pstatus yellow NO + else +@@ -4429,7 +4429,7 @@ check_CVE_2018_3639() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2018_3639_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2018_3639_bsd + else + _warn "Unsupported OS ($os)" +@@ -4448,33 +4448,33 @@ check_CVE_2018_3639_linux() + if [ "$opt_sysfs_only" != 1 ]; then + _info_nol "* Kernel supports disabling speculative store bypass (SSB): " + if [ "$opt_live" = 1 ]; then +- if grep -Eq 'Speculation.?Store.?Bypass:' "$procfs/self/status" 2>/dev/null; then ++ if @grep@ -Eq 'Speculation.?Store.?Bypass:' "$procfs/self/status" 2>/dev/null; then + kernel_ssb="found in $procfs/self/status" + _debug "found Speculation.Store.Bypass: in $procfs/self/status" + fi + fi + # arm64 kernels can have cpu_show_spec_store_bypass with ARM64_SSBD, so exclude them +- if [ -z "$kernel_ssb" ] && [ -n "$kernel" ] && ! grep -q 'arm64_sys_' "$kernel"; then +- kernel_ssb=$("${opt_arch_prefix}strings" "$kernel" | grep spec_store_bypass | head -n1); ++ if [ -z "$kernel_ssb" ] && [ -n "$kernel" ] && ! @grep@ -q 'arm64_sys_' "$kernel"; then ++ kernel_ssb=$("@strings@" "$kernel" | @grep@ spec_store_bypass | @head@ -n1); + [ -n "$kernel_ssb" ] && kernel_ssb="found $kernel_ssb in kernel" + fi + # arm64 kernels can have cpu_show_spec_store_bypass with ARM64_SSBD, so exclude them +- if [ -z "$kernel_ssb" ] && [ -n "$opt_map" ] && ! grep -q 'arm64_sys_' "$opt_map"; then +- kernel_ssb=$(grep spec_store_bypass "$opt_map" | awk '{print $3}' | head -n1) ++ if [ -z "$kernel_ssb" ] && [ -n "$opt_map" ] && ! @grep@ -q 'arm64_sys_' "$opt_map"; then ++ kernel_ssb=$(@grep@ spec_store_bypass "$opt_map" | @awk@ '{print $3}' | @head@ -n1) + [ -n "$kernel_ssb" ] && kernel_ssb="found $kernel_ssb in System.map" + fi + # arm64 only: + if [ -z "$kernel_ssb" ] && [ -n "$opt_map" ]; then +- kernel_ssb=$(grep -w cpu_enable_ssbs "$opt_map" | awk '{print $3}' | head -n1) ++ kernel_ssb=$(@grep@ -w cpu_enable_ssbs "$opt_map" | @awk@ '{print $3}' | @head@ -n1) + [ -n "$kernel_ssb" ] && kernel_ssb="found $kernel_ssb in System.map" + fi + if [ -z "$kernel_ssb" ] && [ -n "$opt_config" ]; then +- kernel_ssb=$(grep -w 'CONFIG_ARM64_SSBD=y' "$opt_config") ++ kernel_ssb=$(@grep@ -w 'CONFIG_ARM64_SSBD=y' "$opt_config") + [ -n "$kernel_ssb" ] && kernel_ssb="CONFIG_ARM64_SSBD enabled in kconfig" + fi + if [ -z "$kernel_ssb" ] && [ -n "$kernel" ]; then + # this string only appears in kernel if CONFIG_ARM64_SSBD is set +- kernel_ssb=$(grep -w "Speculative Store Bypassing Safe (SSBS)" "$kernel") ++ kernel_ssb=$(@grep@ -w "Speculative Store Bypassing Safe (SSBS)" "$kernel") + [ -n "$kernel_ssb" ] && kernel_ssb="found 'Speculative Store Bypassing Safe (SSBS)' in kernel" + fi + # /arm64 only +@@ -4489,31 +4489,31 @@ check_CVE_2018_3639_linux() + if [ "$opt_live" = 1 ]; then + # https://elixir.bootlin.com/linux/v5.0/source/fs/proc/array.c#L340 + _info_nol "* SSB mitigation is enabled and active: " +- if grep -Eq 'Speculation.?Store.?Bypass:[[:space:]]+thread' "$procfs/self/status" 2>/dev/null; then ++ if @grep@ -Eq 'Speculation.?Store.?Bypass:[[:space:]]+thread' "$procfs/self/status" 2>/dev/null; then + kernel_ssbd_enabled=1 + pstatus green YES "per-thread through prctl" +- elif grep -Eq 'Speculation.?Store.?Bypass:[[:space:]]+globally mitigated' "$procfs/self/status" 2>/dev/null; then ++ elif @grep@ -Eq 'Speculation.?Store.?Bypass:[[:space:]]+globally mitigated' "$procfs/self/status" 2>/dev/null; then + kernel_ssbd_enabled=2 + pstatus green YES "global" +- elif grep -Eq 'Speculation.?Store.?Bypass:[[:space:]]+vulnerable' "$procfs/self/status" 2>/dev/null; then ++ elif @grep@ -Eq 'Speculation.?Store.?Bypass:[[:space:]]+vulnerable' "$procfs/self/status" 2>/dev/null; then + kernel_ssbd_enabled=0 + pstatus yellow NO +- elif grep -Eq 'Speculation.?Store.?Bypass:[[:space:]]+not vulnerable' "$procfs/self/status" 2>/dev/null; then ++ elif @grep@ -Eq 'Speculation.?Store.?Bypass:[[:space:]]+not vulnerable' "$procfs/self/status" 2>/dev/null; then + kernel_ssbd_enabled=-2 + pstatus blue NO "not vulnerable" +- elif grep -Eq 'Speculation.?Store.?Bypass:[[:space:]]+unknown' "$procfs/self/status" 2>/dev/null; then ++ elif @grep@ -Eq 'Speculation.?Store.?Bypass:[[:space:]]+unknown' "$procfs/self/status" 2>/dev/null; then + kernel_ssbd_enabled=0 + pstatus blue NO + else +- pstatus blue UNKNOWN "unknown value: $(grep -E 'Speculation.?Store.?Bypass:' "$procfs/self/status" 2>/dev/null | cut -d: -f2-)" ++ pstatus blue UNKNOWN "unknown value: $(@grep@ -E 'Speculation.?Store.?Bypass:' "$procfs/self/status" 2>/dev/null | @cut@ -d: -f2-)" + fi + + if [ "$kernel_ssbd_enabled" = 1 ]; then + _info_nol "* SSB mitigation currently active for selected processes: " + # silence grep's stderr here to avoid ENOENT errors from processes that have exited since the shell's expansion of the * +- mitigated_processes=$(find /proc -mindepth 2 -maxdepth 2 -type f -name status -print0 2>/dev/null \ +- | xargs -r0 grep -El 'Speculation.?Store.?Bypass:[[:space:]]+thread (force )?mitigated' 2>/dev/null \ +- | sed s/status/exe/ | xargs -r -n1 readlink -f 2>/dev/null | xargs -r -n1 basename | sort -u | tr "\n" " " | sed 's/ $//') ++ mitigated_processes=$(@find@ /proc -mindepth 2 -maxdepth 2 -type f -name status -print0 2>/dev/null \ ++ | @xargs@ -r0 @grep@ -El 'Speculation.?Store.?Bypass:[[:space:]]+thread (force )?mitigated' 2>/dev/null \ ++ | @sed@ s/status/exe/ | @xargs@ -r -n1 readlink -f 2>/dev/null | @xargs@ -r -n1 @basename@ | @sort@ -u | @tr@ "\n" " " | @sed@ 's/ $//') + if [ -n "$mitigated_processes" ]; then + pstatus green YES "$mitigated_processes" + else +@@ -4565,7 +4565,7 @@ check_CVE_2018_3639_linux() + check_CVE_2018_3639_bsd() + { + _info_nol "* Kernel supports speculation store bypass: " +- if sysctl hw.spec_store_bypass_disable >/dev/null 2>&1; then ++ if @sysctl@ hw.spec_store_bypass_disable >/dev/null 2>&1; then + kernel_ssb=1 + pstatus green YES + else +@@ -4574,7 +4574,7 @@ check_CVE_2018_3639_bsd() + fi + + _info_nol "* Speculation store bypass is administratively enabled: " +- ssb_enabled=$(sysctl -n hw.spec_store_bypass_disable 2>/dev/null) ++ ssb_enabled=$(@sysctl@ -n hw.spec_store_bypass_disable 2>/dev/null) + _debug "hw.spec_store_bypass_disable=$ssb_enabled" + case "$ssb_enabled" in + 0) pstatus yellow NO "disabled";; +@@ -4584,7 +4584,7 @@ check_CVE_2018_3639_bsd() + esac + + _info_nol "* Speculation store bypass is currently active: " +- ssb_active=$(sysctl -n hw.spec_store_bypass_disable_active 2>/dev/null) ++ ssb_active=$(@sysctl@ -n hw.spec_store_bypass_disable_active 2>/dev/null) + _debug "hw.spec_store_bypass_disable_active=$ssb_active" + case "$ssb_active" in + 1) pstatus green YES;; +@@ -4656,7 +4656,7 @@ check_CVE_2018_3620() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2018_3620_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2018_3620_bsd + else + _warn "Unsupported OS ($os)" +@@ -4674,14 +4674,14 @@ check_CVE_2018_3620_linux() + fi + if [ "$opt_sysfs_only" != 1 ]; then + _info_nol "* Kernel supports PTE inversion: " +- if ! command -v "${opt_arch_prefix}strings" >/dev/null 2>&1; then ++ if ! command -v "@strings@" >/dev/null 2>&1; then + pstatus yellow UNKNOWN "missing 'strings' tool, please install it" + pteinv_supported=-1 + elif [ -n "$kernel_err" ]; then + pstatus yellow UNKNOWN "$kernel_err" + pteinv_supported=-1 + else +- if "${opt_arch_prefix}strings" "$kernel" | grep -Fq 'PTE Inversion'; then ++ if "@strings@" "$kernel" | @grep@ -Fq 'PTE Inversion'; then + pstatus green YES "found in kernel image" + _debug "pteinv: found pte inversion evidence in kernel image" + pteinv_supported=1 +@@ -4694,7 +4694,7 @@ check_CVE_2018_3620_linux() + _info_nol "* PTE inversion enabled and active: " + if [ "$opt_live" = 1 ]; then + if [ -n "$fullmsg" ]; then +- if echo "$fullmsg" | grep -q 'Mitigation: PTE Inversion'; then ++ if echo "$fullmsg" | @grep@ -q 'Mitigation: PTE Inversion'; then + pstatus green YES + pteinv_active=1 + else +@@ -4742,7 +4742,7 @@ check_CVE_2018_3620_bsd() + else + _debug "vmm module already loaded" + fi +- if sysctl hw.vmm.vmx.l1d_flush >/dev/null 2>&1; then ++ if @sysctl@ hw.vmm.vmx.l1d_flush >/dev/null 2>&1; then + # https://security.FreeBSD.org/patches/SA-18:09/l1tf-11.2.patch + # this is very difficult to detect that the kernel reserved the 0 page, but this fix + # is part of the exact same patch than the other L1TF CVE, so we detect it +@@ -4772,7 +4772,7 @@ check_CVE_2018_3646() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2018_3646_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2018_3646_bsd + else + _warn "Unsupported OS ($os)" +@@ -4798,7 +4798,7 @@ check_CVE_2018_3646_linux() + if [ "$opt_live" = 1 ]; then + if ! [ -r /sys/module/kvm_intel/parameters/ept ]; then + pstatus blue N/A "the kvm_intel module is not loaded" +- elif [ "$(cat /sys/module/kvm_intel/parameters/ept)" = N ]; then ++ elif [ "$(@cat@ /sys/module/kvm_intel/parameters/ept)" = N ]; then + pstatus green YES + ept_disabled=1 + else +@@ -4810,15 +4810,15 @@ check_CVE_2018_3646_linux() + + _info "* Mitigation 2" + _info_nol " * L1D flush is supported by kernel: " +- if [ "$opt_live" = 1 ] && grep -qw flush_l1d "$procfs/cpuinfo"; then ++ if [ "$opt_live" = 1 ] && @grep@ -qw flush_l1d "$procfs/cpuinfo"; then + l1d_kernel="found flush_l1d in $procfs/cpuinfo" + fi + if [ -z "$l1d_kernel" ]; then +- if ! command -v "${opt_arch_prefix}strings" >/dev/null 2>&1; then ++ if ! command -v "@strings@" >/dev/null 2>&1; then + l1d_kernel_err="missing '${opt_arch_prefix}strings' tool, please install it, usually it's in the binutils package" + elif [ -n "$kernel_err" ]; then + l1d_kernel_err="$kernel_err" +- elif "${opt_arch_prefix}strings" "$kernel" | grep -qw flush_l1d; then ++ elif "@strings@" "$kernel" | @grep@ -qw flush_l1d; then + l1d_kernel='found flush_l1d in kernel image' + fi + fi +@@ -4839,20 +4839,20 @@ check_CVE_2018_3646_linux() + # $l1dstatus is one of (auto|vulnerable|conditional cache flushes|cache flushes|EPT disabled|flush not necessary) + # $smtstatus is one of (vulnerable|disabled) + # can also just be "Not affected" +- if echo "$fullmsg" | grep -Eq -e 'Not affected' -e '(VMX:|L1D) (EPT disabled|vulnerable|flush not necessary)'; then ++ if echo "$fullmsg" | @grep@ -Eq -e 'Not affected' -e '(VMX:|L1D) (EPT disabled|vulnerable|flush not necessary)'; then + l1d_mode=0 + pstatus yellow NO +- elif echo "$fullmsg" | grep -Eq '(VMX:|L1D) conditional cache flushes'; then ++ elif echo "$fullmsg" | @grep@ -Eq '(VMX:|L1D) conditional cache flushes'; then + l1d_mode=1 + pstatus green YES "conditional flushes" +- elif echo "$fullmsg" | grep -Eq '(VMX:|L1D) cache flushes'; then ++ elif echo "$fullmsg" | @grep@ -Eq '(VMX:|L1D) cache flushes'; then + l1d_mode=2 + pstatus green YES "unconditional flushes" + else + if is_xen_dom0; then +- l1d_xen_hardware=$(xl dmesg | grep 'Hardware features:' | grep 'L1D_FLUSH' | head -1) +- l1d_xen_hypervisor=$(xl dmesg | grep 'Xen settings:' | grep 'L1D_FLUSH' | head -1) +- l1d_xen_pv_domU=$(xl dmesg | grep 'PV L1TF shadowing:' | grep 'DomU enabled' | head -1) ++ l1d_xen_hardware=$(xl @dmesg@ | @grep@ 'Hardware features:' | @grep@ 'L1D_FLUSH' | @head@ -1) ++ l1d_xen_hypervisor=$(xl @dmesg@ | @grep@ 'Xen settings:' | @grep@ 'L1D_FLUSH' | @head@ -1) ++ l1d_xen_pv_domU=$(xl @dmesg@ | @grep@ 'PV L1TF shadowing:' | @grep@ 'DomU enabled' | @head@ -1) + + if [ -n "$l1d_xen_hardware" ] && [ -n "$l1d_xen_hypervisor" ] && [ -n "$l1d_xen_pv_domU" ]; then + l1d_mode=5 +@@ -4883,7 +4883,7 @@ check_CVE_2018_3646_linux() + + _info_nol " * Hardware-backed L1D flush supported: " + if [ "$opt_live" = 1 ]; then +- if grep -qw flush_l1d "$procfs/cpuinfo" || [ -n "$l1d_xen_hardware" ]; then ++ if @grep@ -qw flush_l1d "$procfs/cpuinfo" || [ -n "$l1d_xen_hardware" ]; then + pstatus green YES "performance impact of the mitigation will be greatly reduced" + else + pstatus blue NO "flush will be done in software, this is slower" +@@ -4955,7 +4955,7 @@ check_CVE_2018_3646_linux() + check_CVE_2018_3646_bsd() + { + _info_nol "* Kernel supports L1D flushing: " +- if sysctl hw.vmm.vmx.l1d_flush >/dev/null 2>&1; then ++ if @sysctl@ hw.vmm.vmx.l1d_flush >/dev/null 2>&1; then + pstatus green YES + kernel_l1d_supported=1 + else +@@ -4964,7 +4964,7 @@ check_CVE_2018_3646_bsd() + fi + + _info_nol "* L1D flushing is enabled: " +- kernel_l1d_enabled=$(sysctl -n hw.vmm.vmx.l1d_flush 2>/dev/null) ++ kernel_l1d_enabled=$(@sysctl@ -n hw.vmm.vmx.l1d_flush 2>/dev/null) + case "$kernel_l1d_enabled" in + 0) pstatus yellow NO;; + 1) pstatus green YES;; +@@ -5018,7 +5018,7 @@ check_CVE_2018_12127() + ################### + # MDSUM SECTION + +-# Microarchitectural Data Sampling Uncacheable Memory ++# Microarchitectural Data Sampling Uncacheable Memory + check_CVE_2019_11091() + { + cve='CVE-2019-11091' +@@ -5032,7 +5032,7 @@ check_mds() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_mds_linux "$cve" +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_mds_bsd "$cve" + else + _warn "Unsupported OS ($os)" +@@ -5043,7 +5043,7 @@ check_mds_bsd() + { + _info_nol "* Kernel supports using MD_CLEAR mitigation: " + if [ "$opt_live" = 1 ]; then +- if sysctl hw.mds_disable >/dev/null 2>&1; then ++ if @sysctl@ hw.mds_disable >/dev/null 2>&1; then + pstatus green YES + kernel_md_clear=1 + else +@@ -5051,7 +5051,7 @@ check_mds_bsd() + kernel_md_clear=0 + fi + else +- if grep -Fq hw.mds_disable $opt_kernel; then ++ if @grep@ -Fq hw.mds_disable $opt_kernel; then + pstatus green YES + kernel_md_clear=1 + else +@@ -5061,8 +5061,8 @@ check_mds_bsd() + fi + + _info_nol "* CPU Hyper-Threading (SMT) is disabled: " +- if sysctl machdep.hyperthreading_allowed >/dev/null 2>&1; then +- kernel_smt_allowed=$(sysctl -n machdep.hyperthreading_allowed 2>/dev/null) ++ if @sysctl@ machdep.hyperthreading_allowed >/dev/null 2>&1; then ++ kernel_smt_allowed=$(@sysctl@ -n machdep.hyperthreading_allowed 2>/dev/null) + if [ "$kernel_smt_allowed" = 1 ]; then + pstatus yellow NO + else +@@ -5074,7 +5074,7 @@ check_mds_bsd() + + _info_nol "* Kernel mitigation is enabled: " + if [ "$kernel_md_clear" = 1 ]; then +- kernel_mds_enabled=$(sysctl -n hw.mds_disable 2>/dev/null) ++ kernel_mds_enabled=$(@sysctl@ -n hw.mds_disable 2>/dev/null) + else + kernel_mds_enabled=0 + fi +@@ -5088,7 +5088,7 @@ check_mds_bsd() + + _info_nol "* Kernel mitigation is active: " + if [ "$kernel_md_clear" = 1 ]; then +- kernel_mds_state=$(sysctl -n hw.mds_disable_state 2>/dev/null) ++ kernel_mds_state=$(@sysctl@ -n hw.mds_disable_state 2>/dev/null) + else + kernel_mds_state=inactive + fi +@@ -5146,16 +5146,16 @@ check_mds_linux() + _info_nol "* Kernel supports using MD_CLEAR mitigation: " + kernel_md_clear='' + kernel_md_clear_can_tell=1 +- if [ "$opt_live" = 1 ] && grep ^flags "$procfs/cpuinfo" | grep -qw md_clear; then ++ if [ "$opt_live" = 1 ] && @grep@ ^flags "$procfs/cpuinfo" | @grep@ -qw md_clear; then + kernel_md_clear="md_clear found in $procfs/cpuinfo" + pstatus green YES "$kernel_md_clear" + fi + if [ -z "$kernel_md_clear" ]; then +- if ! command -v "${opt_arch_prefix}strings" >/dev/null 2>&1; then ++ if ! command -v "@strings@" >/dev/null 2>&1; then + kernel_md_clear_can_tell=0 + elif [ -n "$kernel_err" ]; then + kernel_md_clear_can_tell=0 +- elif "${opt_arch_prefix}strings" "$kernel" | grep -q 'Clear CPU buffers'; then ++ elif "@strings@" "$kernel" | @grep@ -q 'Clear CPU buffers'; then + _debug "md_clear: found 'Clear CPU buffers' string in kernel image" + kernel_md_clear='found md_clear implementation evidence in kernel image' + pstatus green YES "$kernel_md_clear" +@@ -5171,7 +5171,7 @@ check_mds_linux() + + if [ "$opt_live" = 1 ] && [ "$sys_interface_available" = 1 ]; then + _info_nol "* Kernel mitigation is enabled and active: " +- if echo "$fullmsg" | grep -qi ^mitigation; then ++ if echo "$fullmsg" | @grep@ -qi ^mitigation; then + mds_mitigated=1 + pstatus green YES + else +@@ -5179,7 +5179,7 @@ check_mds_linux() + pstatus yellow NO + fi + _info_nol "* SMT is either mitigated or disabled: " +- if echo "$fullmsg" | grep -Eq 'SMT (disabled|mitigated)'; then ++ if echo "$fullmsg" | @grep@ -Eq 'SMT (disabled|mitigated)'; then + mds_smt_mitigated=1 + pstatus green YES + else +@@ -5265,7 +5265,7 @@ check_CVE_2019_11135() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2019_11135_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2019_11135_bsd + else + _warn "Unsupported OS ($os)" +@@ -5286,7 +5286,7 @@ check_CVE_2019_11135_linux() + kernel_taa='' + if [ -n "$kernel_err" ]; then + kernel_taa_err="$kernel_err" +- elif grep -q 'tsx_async_abort' "$kernel"; then ++ elif @grep@ -q 'tsx_async_abort' "$kernel"; then + kernel_taa="found tsx_async_abort in kernel image" + fi + if [ -n "$kernel_taa" ]; then +@@ -5300,7 +5300,7 @@ check_CVE_2019_11135_linux() + _info_nol "* TAA mitigation enabled and active: " + if [ "$opt_live" = 1 ]; then + if [ -n "$fullmsg" ]; then +- if echo "$fullmsg" | grep -qE '^Mitigation'; then ++ if echo "$fullmsg" | @grep@ -qE '^Mitigation'; then + pstatus green YES "$fullmsg" + else + pstatus yellow NO +@@ -5335,9 +5335,9 @@ check_CVE_2019_11135_linux() + else + if [ "$opt_paranoid" = 1 ]; then + # in paranoid mode, TSX or SMT enabled are not OK, even if TAA is mitigated +- if ! echo "$fullmsg" | grep -qF 'TSX disabled'; then ++ if ! echo "$fullmsg" | @grep@ -qF 'TSX disabled'; then + pvulnstatus $cve VULN "TSX must be disabled for full mitigation" +- elif echo "$fullmsg" | grep -qF 'SMT vulnerable'; then ++ elif echo "$fullmsg" | @grep@ -qF 'SMT vulnerable'; then + pvulnstatus $cve VULN "SMT (HyperThreading) must be disabled for full mitigation" + else + pvulnstatus $cve "$status" "$msg" +@@ -5367,7 +5367,7 @@ check_CVE_2018_12207() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2018_12207_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2018_12207_bsd + else + _warn "Unsupported OS ($os)" +@@ -5391,7 +5391,7 @@ check_CVE_2018_12207_linux() + if [ -n "$kernel_err" ]; then + kernel_itlbmh_err="$kernel_err" + # commit 5219505fcbb640e273a0d51c19c38de0100ec5a9 +- elif grep -q 'itlb_multihit' "$kernel"; then ++ elif @grep@ -q 'itlb_multihit' "$kernel"; then + kernel_itlbmh="found itlb_multihit in kernel image" + fi + if [ -n "$kernel_itlbmh" ]; then +@@ -5405,7 +5405,7 @@ check_CVE_2018_12207_linux() + _info_nol "* iTLB Multihit mitigation enabled and active: " + if [ "$opt_live" = 1 ]; then + if [ -n "$fullmsg" ]; then +- if echo "$fullmsg" | grep -qF 'Mitigation'; then ++ if echo "$fullmsg" | @grep@ -qF 'Mitigation'; then + pstatus green YES "$fullmsg" + else + pstatus yellow NO +@@ -5447,7 +5447,7 @@ check_CVE_2018_12207_linux() + check_CVE_2018_12207_bsd() + { + _info_nol "* Kernel supports disabling superpages for executable mappings under EPT: " +- kernel_2m_x_ept=$(sysctl -n vm.pmap.allow_2m_x_ept 2>/dev/null) ++ kernel_2m_x_ept=$(@sysctl@ -n vm.pmap.allow_2m_x_ept 2>/dev/null) + if [ -z "$kernel_2m_x_ept" ]; then + pstatus yellow NO + else +@@ -5484,7 +5484,7 @@ check_CVE_2020_0543() + _info "\033[1;34m$cve aka '$(cve2name "$cve")'\033[0m" + if [ "$os" = Linux ]; then + check_CVE_2020_0543_linux +- elif echo "$os" | grep -q BSD; then ++ elif echo "$os" | @grep@ -q BSD; then + check_CVE_2020_0543_bsd + else + _warn "Unsupported OS ($os)" +@@ -5505,7 +5505,7 @@ check_CVE_2020_0543_linux() + kernel_srbds='' + if [ -n "$kernel_err" ]; then + kernel_srbds_err="$kernel_err" +- elif grep -q 'Dependent on hypervisor' "$kernel"; then ++ elif @grep@ -q 'Dependent on hypervisor' "$kernel"; then + kernel_srbds="found SRBDS implementation evidence in kernel image. Your kernel is up to date for SRBDS mitigation" + fi + if [ -n "$kernel_srbds" ]; then +@@ -5518,7 +5518,7 @@ check_CVE_2020_0543_linux() + _info_nol "* SRBDS mitigation control is enabled and active: " + if [ "$opt_live" = 1 ]; then + if [ -n "$fullmsg" ]; then +- if echo "$fullmsg" | grep -qE '^Mitigation'; then ++ if echo "$fullmsg" | @grep@ -qE '^Mitigation'; then + pstatus green YES "$fullmsg" + else + pstatus yellow NO +@@ -5608,8 +5608,8 @@ fi + # now run the checks the user asked for + for cve in $supported_cve_list + do +- if [ "$opt_cve_all" = 1 ] || echo "$opt_cve_list" | grep -qw "$cve"; then +- check_"$(echo "$cve" | tr - _)" ++ if [ "$opt_cve_all" = 1 ] || echo "$opt_cve_list" | @grep@ -qw "$cve"; then ++ check_"$(echo "$cve" | @tr@ - _)" + _info + fi + done +@@ -5623,17 +5623,17 @@ if [ "$bad_accuracy" = 1 ]; then + _warn "We're missing some kernel info (see -v), accuracy might be reduced" + fi + +-_vars=$(set | grep -Ev '^[A-Z_[:space:]]' | grep -v -F 'mockme=' | sort | tr "\n" '|') ++_vars=$(set | @grep@ -Ev '^[A-Z_[:space:]]' | @grep@ -v -F 'mockme=' | @sort@ | @tr@ "\n" '|') + _debug "variables at end of script: $_vars" + + if [ -n "$mockme" ] && [ "$opt_mock" = 1 ]; then +- if command -v "gzip" >/dev/null 2>&1; then ++ if command -v "@gzip@" >/dev/null 2>&1; then + # not a useless use of cat: gzipping cpuinfo directly doesn't work well + # shellcheck disable=SC2002 +- if command -v "base64" >/dev/null 2>&1; then +- mock_cpuinfo="$(cat /proc/cpuinfo | gzip -c | base64 -w0)" +- elif command -v "uuencode" >/dev/null 2>&1; then +- mock_cpuinfo="$(cat /proc/cpuinfo | gzip -c | uuencode -m - | grep -Fv 'begin-base64' | grep -Fxv -- '====' | tr -d "\n")" ++ if command -v "@base64@" >/dev/null 2>&1; then ++ mock_cpuinfo="$(@cat@ /proc/cpuinfo | @gzip@ -c | @base64@ -w0)" ++ elif command -v "@uuencode@" >/dev/null 2>&1; then ++ mock_cpuinfo="$(@cat@ /proc/cpuinfo | @gzip@ -c | @uuencode@ -m - | @grep@ -Fv 'begin-base64' | @grep@ -Fxv -- '====' | @tr@ -d "\n")" + fi + fi + if [ -n "$mock_cpuinfo" ]; then +@@ -5642,7 +5642,7 @@ if [ -n "$mockme" ] && [ "$opt_mock" = 1 ]; then + fi + _info "" + # shellcheck disable=SC2046 +- _warn "To mock this CPU, set those vars: "$(echo "$mockme" | sort -u) ++ _warn "To mock this CPU, set those vars: "$(echo "$mockme" | @sort@ -u) + fi + + if [ "$opt_explain" = 0 ]; then +-- +2.38.1 + diff --git a/gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch b/gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch new file mode 100644 index 0000000000..afec52b418 --- /dev/null +++ b/gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch @@ -0,0 +1,26 @@ +From 5b757d930ec0cf102b03fb9817d17e06c72e74b3 Mon Sep 17 00:00:00 2001 +From: Hilton Chain +Date: Sat, 5 Nov 2022 23:22:31 +0800 +Subject: [PATCH] Add support for Guix System kernel. + +--- + spectre-meltdown-checker.sh | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/spectre-meltdown-checker.sh b/spectre-meltdown-checker.sh +index 248a444..855a090 100755 +--- a/spectre-meltdown-checker.sh ++++ b/spectre-meltdown-checker.sh +@@ -2251,6 +2251,8 @@ if [ "$opt_live" = 1 ]; then + [ -e "/boot/kernel-genkernel-$(uname -m)-$(uname -r)" ] && opt_kernel="/boot/kernel-genkernel-$(uname -m)-$(uname -r)" + # NixOS: + [ -e "/run/booted-system/kernel" ] && opt_kernel="/run/booted-system/kernel" ++ # Guix System: ++ [ -e "/run/booted-system/kernel/bzImage" ] && opt_kernel="/run/booted-system/kernel/bzImage" + # systemd kernel-install: + [ -e "/etc/machine-id" ] && [ -e "/boot/$(cat /etc/machine-id)/$(uname -r)/linux" ] && opt_kernel="/boot/$(cat /etc/machine-id)/$(uname -r)/linux" + # Clear Linux: + +base-commit: a6c943d38f315f339697ec26e7374a09b88f2183 +-- +2.38.0 base-commit: 2757de2e2b271d87f6f72ba4161c2225fbdc9e78 -- 2.38.1 From unknown Sun Jun 22 11:49:37 2025 X-Loop: help-debbugs@gnu.org Subject: [bug#59053] [PATCH v4] gnu: Add spectre-meltdown-checker. Resent-From: Liliana Marie Prikler Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Sat, 12 Nov 2022 16:59:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 59053 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: moreinfo patch To: Hilton Chain Cc: 59053@debbugs.gnu.org Received: via spool by 59053-submit@debbugs.gnu.org id=B59053.166827232728454 (code B ref 59053); Sat, 12 Nov 2022 16:59:02 +0000 Received: (at 59053) by debbugs.gnu.org; 12 Nov 2022 16:58:47 +0000 Received: from localhost ([127.0.0.1]:48879 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ottqB-0007Os-D1 for submit@debbugs.gnu.org; Sat, 12 Nov 2022 11:58:47 -0500 Received: from mail-ej1-f66.google.com ([209.85.218.66]:46939) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ottq9-0007Od-HR for 59053@debbugs.gnu.org; Sat, 12 Nov 2022 11:58:46 -0500 Received: by mail-ej1-f66.google.com with SMTP id bj12so18971959ejb.13 for <59053@debbugs.gnu.org>; Sat, 12 Nov 2022 08:58:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:cc:to:from:subject:message-id:from:to:cc:subject :date:message-id:reply-to; bh=C4dIO2Js6wqZqBDDKwJaqDBrv+EjoovXJnu+Vj7dE6s=; b=gKKqZqOTiTc+IrfS4b+8tKnm3+1SYOgSXUKgtz7MFpR05ls/uEtxl+unJcW8I03J01 Y0gn3VUx8WGEwZIGTH5CHa8tquNA2KZ4RQPqKQql5CypmDa5hRy6eAqGDILuUXlHrSEw lfEL7D2ESqiCEG+LbhNJQlSizKQTKtKS8XqQKRaTKdss3JxG4n7J+BU79hXen4+vZB+C swLi6gSxOEjlBbeVOPnjBXxqdtyjIhACWT+7X4bMlD0cMzWc8T+C2q4lEdy9WrU2nCcj qlk5XaEhnnE9uCSEiK8+8q1ARNf2SDGQFER+NVS93pZxzXinkEM1brsHXGXqLn7r6hAr crug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:cc:to:from:subject:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=C4dIO2Js6wqZqBDDKwJaqDBrv+EjoovXJnu+Vj7dE6s=; b=lRreHw/aG2erYjJ/f4ZZ4CsS2/vAkHShivTs1efPj3Ixo3vYK8SYgJnGNElQenktNK apuHQ2yBO2otIO76YL0ZRnq6PEeMYNc0V+/tICP5njouOM1GO+cXUJttTRPFrhOn46Ya 3QtXDEEbPnDcbGv4I+LRv+7NyKwzKfeOPScf6ez/a+Abas6vzFH273+lCc/4/Y9bpZe6 E0S5YLuvYK1aIPq5UjsjGLSxBdU8ZQYrlE/M8X07sfwK1C90gk7lsZzY4Ed4I/o4Gadn qfDoI5ayD1SZARqiEGXxW7ViKcQ3D3a7/rGHAfUIe5gtX2hqVJYY9Szu5yPb168eJxgM 6Nfg== X-Gm-Message-State: ANoB5pmqkgGoalMma2Mf425XU2lAXFYnwr89TraOwr4dAvXsICEqZuyl sBx6fpdESLUtrcD62Urwk/Y= X-Google-Smtp-Source: AA0mqf5+ivUk/j5ka3cfF26gTNIrXGeh35F7aLbKHt12JtFAfcvXtUL5m5fPkU8DAaYCx8AmEw3cwg== X-Received: by 2002:a17:906:230d:b0:7ae:1063:55d3 with SMTP id l13-20020a170906230d00b007ae106355d3mr5318917eja.578.1668272318533; Sat, 12 Nov 2022 08:58:38 -0800 (PST) Received: from lumine.fritz.box (85-127-52-93.dsl.dynamic.surfer.at. [85.127.52.93]) by smtp.gmail.com with ESMTPSA id c1-20020a17090618a100b0078b03d57fa7sm2093259ejf.34.2022.11.12.08.58.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 12 Nov 2022 08:58:37 -0800 (PST) Message-ID: <3e3c90ad73311a445a3b06c7c8afb42dcf0af1b1.camel@gmail.com> From: Liliana Marie Prikler Date: Sat, 12 Nov 2022 17:58:33 +0100 In-Reply-To: References: <62dbdc4784403cc138909884b50a399485a2451f.camel@gmail.com> <60647514a548fc2589c1816ca8fef94fa20a7b94.camel@gmail.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 User-Agent: Evolution 3.46.0 MIME-Version: 1.0 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" QW0gU2Ftc3RhZywgZGVtIDEyLjExLjIwMjIgdW0gMjM6MTUgKzA4MDAgc2NocmllYiBIaWx0b24g Q2hhaW46Cj4gKiBnbnUvcGFja2FnZXMvbGludXguc2NtIChzcGVjdHJlLW1lbHRkb3duLWNoZWNr ZXIpOiBOZXcgdmFyaWFibGUuCj4gKiBnbnUvcGFja2FnZXMvcGF0Y2hlcy9zcGVjdHJlLW1lbHRk b3duLWNoZWNrZXItc3VwcG9ydC1ndWl4LXN5c3RlbS0KPiBrZXJuZWwucGF0Y2g6Cj4gTmV3IGZp bGUuCj4gKiBnbnUvcGFja2FnZXMvcGF0Y2hlcy9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXItcmVt b3ZlLWJ1aWx0aW4tCj4gZmlybXdhcmUtZGF0YWJhc2UucGF0Y2g6Cj4gTmV3IGZpbGUuCj4gKiBn bnUvcGFja2FnZXMvcGF0Y2hlcy9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXItc3RhZ2UtY29tbWFu ZHMtZm9yLQo+IHN1YnN0aXR1dGlvbi5wYXRjaDoKPiBOZXcgZmlsZS4KPiAqIGdudS9sb2NhbC5t ayAoZGlzdF9wYXRjaF9EQVRBKTogQWRkIHBhdGNoZXMuCj4gLS0tCj4gdjMgLT4gdjQ6Cj4gMS4g UmVtb3ZlIGRvd25sb2FkaW5nIGZ1bmN0aW9uLgo+IDIuIEFkZCBvcHRpb24gZm9yIHN1cHBseWlu ZyBhIGxvY2FsIGRhdGFiYXNlLgo+IAo+IMKgZ251L2xvY2FsLm1rwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzCoMKgwqAg MyArCj4gwqBnbnUvcGFja2FnZXMvbGludXguc2NtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoCA1NCArCj4gwqAuLi5rZXItcmVtb3ZlLWJ1aWx0aW4t ZmlybXdhcmUtZGF0YWJhc2UucGF0Y2ggfMKgIDI0MyArKysKPiDCoC4uLmNrZXItc3RhZ2UtY29t bWFuZHMtZm9yLXN1YnN0aXR1dGlvbi5wYXRjaCB8IDE4NDkKPiArKysrKysrKysrKysrKysrKwo+ IMKgLi4ubi1jaGVja2VyLXN1cHBvcnQtZ3VpeC1zeXN0ZW0ta2VybmVsLnBhdGNoIHzCoMKgIDI2 ICsKPiDCoDUgZmlsZXMgY2hhbmdlZCwgMjE3NSBpbnNlcnRpb25zKCspCj4gwqBjcmVhdGUgbW9k ZSAxMDA2NDQgZ251L3BhY2thZ2VzL3BhdGNoZXMvc3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyLQo+ IHJlbW92ZS1idWlsdGluLWZpcm13YXJlLWRhdGFiYXNlLnBhdGNoCj4gwqBjcmVhdGUgbW9kZSAx MDA2NDQgZ251L3BhY2thZ2VzL3BhdGNoZXMvc3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyLQo+IHN0 YWdlLWNvbW1hbmRzLWZvci1zdWJzdGl0dXRpb24ucGF0Y2gKPiDCoGNyZWF0ZSBtb2RlIDEwMDY0 NCBnbnUvcGFja2FnZXMvcGF0Y2hlcy9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXItCj4gc3VwcG9y dC1ndWl4LXN5c3RlbS1rZXJuZWwucGF0Y2gKPiAKPiBkaWZmIC0tZ2l0IGEvZ251L2xvY2FsLm1r IGIvZ251L2xvY2FsLm1rCj4gaW5kZXggZTNlMDIzMTRiYi4uNDZiMjk5ZDBkNiAxMDA2NDQKPiAt LS0gYS9nbnUvbG9jYWwubWsKPiArKysgYi9nbnUvbG9jYWwubWsKPiBAQCAtMTg1Nyw2ICsxODU3 LDkgQEAgZGlzdF9wYXRjaF9EQVRBCj4gPcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBcCj4gwqDC oCAlRCUvcGFja2FnZXMvcGF0Y2hlcy9zeXNsaW51eC1zdHJpcC1nbnUtcHJvcGVydHkucGF0Y2jC oMKgwqDCoMKgwqDCoFwKPiDCoMKgICVEJS9wYWNrYWdlcy9wYXRjaGVzL3NuYXBweS1hZGQtTzIt ZmxhZy1pbi0KPiBDbWFrZUxpc3RzLnR4dC5wYXRjaMKgwqDCoMKgwqDCoFwKPiDCoMKgICVEJS9w YWNrYWdlcy9wYXRjaGVzL3NuYXBweS1hZGQtaW5saW5lLWZvci1HQ0MucGF0Y2jCoMKgwqDCoMKg wqDCoMKgwqBcCj4gK8KgICVEJS9wYWNrYWdlcy9wYXRjaGVzL3NwZWN0cmUtbWVsdGRvd24tY2hl Y2tlci1yZW1vdmUtYnVpbHRpbi0KPiBmaXJtd2FyZS1kYXRhYmFzZS5wYXRjaCBcCj4gK8KgICVE JS9wYWNrYWdlcy9wYXRjaGVzL3NwZWN0cmUtbWVsdGRvd24tY2hlY2tlci1zdGFnZS1jb21tYW5k cy1mb3ItCj4gc3Vic3RpdHV0aW9uLnBhdGNoIFwKPiArwqAgJUQlL3BhY2thZ2VzL3BhdGNoZXMv c3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyLXN1cHBvcnQtZ3VpeC1zeXN0ZW0tCj4ga2VybmVsLnBh dGNoIFwKPiDCoMKgICVEJS9wYWNrYWdlcy9wYXRjaGVzL3NwaGlueGJhc2UtZml4LWRveHlnZW4u cGF0Y2jCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBcCj4gwqDCoCAlRCUvcGFja2FnZXMvcGF0Y2hl cy9zcGljZS12ZGFnZW50LWdsaWItMi42OC5wYXRjaMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBcCj4g wqDCoCAlRCUvcGFja2FnZXMvcGF0Y2hlcy9zc3NkLW9wdGlvbmFsLXN5c3RlbWQucGF0Y2jCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiBkaWZmIC0tZ2l0IGEvZ251L3BhY2thZ2VzL2xpbnV4 LnNjbSBiL2dudS9wYWNrYWdlcy9saW51eC5zY20KPiBpbmRleCBmZWEzM2RmYTBiLi4xODA3ZmQ1 NjU1IDEwMDY0NAo+IC0tLSBhL2dudS9wYWNrYWdlcy9saW51eC5zY20KPiArKysgYi9nbnUvcGFj a2FnZXMvbGludXguc2NtCj4gQEAgLTk1OTUsMyArOTU5NSw1NyBAQCAoZGVmaW5lLXB1YmxpYyBl ZGFjLXV0aWxzCj4gwqBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gKEVEQUMpLiIpCj4g wqDCoMKgwqAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL2dyb25kby9lZGFjLXV0aWxz IikKPiDCoMKgwqDCoCAobGljZW5zZSBsaWNlbnNlOmdwbDIrKSkpCj4gKwo+ICsoZGVmaW5lLXB1 YmxpYyBzcGVjdHJlLW1lbHRkb3duLWNoZWNrZXIKPiArwqAgKHBhY2thZ2UKPiArwqDCoMKgIChu YW1lICJzcGVjdHJlLW1lbHRkb3duLWNoZWNrZXIiKQo+ICvCoMKgwqAgKHZlcnNpb24gIjAuNDUi KQo+ICvCoMKgwqAgKHNvdXJjZSAob3JpZ2luCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IChtZXRob2QgZ2l0LWZldGNoKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAodXJpIChn aXQtcmVmZXJlbmNlCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICh1 cmwKPiAiaHR0cHM6Ly9naXRodWIuY29tL3NwZWVkNDcvc3BlY3RyZS1tZWx0ZG93bi1jaGVja2Vy IikKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGNvbW1pdCAoc3Ry aW5nLWFwcGVuZCAidiIgdmVyc2lvbikpKSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg KGZpbGUtbmFtZSAoZ2l0LWZpbGUtbmFtZSBuYW1lIHZlcnNpb24pKQo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCAocGF0Y2hlcwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChz ZWFyY2gtcGF0Y2hlcwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsKPiBodHRw czovL2dpdGh1Yi5jb20vc3BlZWQ0Ny9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXIvcHVsbC80NDEK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJzcGVjdHJlLW1lbHRkb3duLWNoZWNr ZXItc3VwcG9ydC1ndWl4LXN5c3RlbS0KPiBrZXJuZWwucGF0Y2giCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCA7OyBOT1RFOiBVcGRhdGUgdGhlc2UgcGF0Y2hlcyB3aGVuIHVwZGF0 aW5nLgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgInNwZWN0cmUtbWVsdGRvd24t Y2hlY2tlci1yZW1vdmUtYnVpbHRpbi1maXJtd2FyZS0KPiBkYXRhYmFzZS5wYXRjaCIKSXMgdGhp cyBjb21tZW50IHN0aWxsIG5lZWRlZD8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg ICJzcGVjdHJlLW1lbHRkb3duLWNoZWNrZXItc3RhZ2UtY29tbWFuZHMtZm9yLQo+IHN1YnN0aXR1 dGlvbi5wYXRjaCIpKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCA7OyBSZW1vdmUgYnVp bHRpbiBmaXJtd2FyZSBkYXRhYmFzZS4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKG1v ZHVsZXMgJygoZ3VpeCBidWlsZCB1dGlscykpKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCAoc25pcHBldCAnKHN1YnN0aXR1dGUqICJzcGVjdHJlLW1lbHRkb3duLWNoZWNrZXIuc2giCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICgoIl4j IFtBSV0sLioiKSAiIikpKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoc2hhMjU2Cj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGJhc2UzMgo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAKPiAiMXh4OGg1NzkxbGhjMnh3MGRjYnpqa2tsenZseHd4a2p6aDhkaTRn OGRpdmZ5MjRmcXNuOCIpKSkpCj4gK8KgwqDCoCAoYnVpbGQtc3lzdGVtIGNvcHktYnVpbGQtc3lz dGVtKQo+ICvCoMKgwqAgKGFyZ3VtZW50cwo+ICvCoMKgwqDCoCAobGlzdCAjOmluc3RhbGwtcGxh bgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoCAjficoKCJzcGVjdHJlLW1lbHRkb3duLWNoZWNrZXIu c2giICJiaW4vc3BlY3RyZS1tZWx0ZG93bi0KPiBjaGVja2VyIikpCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgICM6cGhhc2VzCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgICN+KG1vZGlmeS1waGFzZXMg JXN0YW5kYXJkLXBoYXNlcwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChhZGQtYWZ0 ZXIgJ3VucGFjayAnZml4cGF0aAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAo bGFtYmRhKiAoIzprZXkgaW5wdXRzICM6YWxsb3ctb3RoZXIta2V5cykKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChzdWJzdGl0dXRlKiAic3BlY3RyZS1tZWx0ZG93bi1j aGVja2VyLnNoIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICgo IkBzeXNjdGxAIikgKHNlYXJjaC1pbnB1dC1maWxlIGlucHV0cwo+ICIvc2Jpbi9zeXNjdGwiKSkK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoKCJAKFthLXowLTld KilAIiBfIGNvbW1hbmQgXykKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIChzZWFyY2gtaW5wdXQtZmlsZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBpbnB1dHMgKHN0cmluZy1hcHBlbmQgIi9iaW4vIgo+IGNvbW1hbmQp KSkpKSkpKSkKPiArwqDCoMKgIChpbnB1dHMKPiArwqDCoMKgwqAgKGxpc3Qga21vZAo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoCBsejQKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqAgbHpvcAo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoCBwZXJsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgIHByb2Nwcwo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoCBzaGFydXRpbHMKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqAgdXRp bC1saW51eAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoCB6c3RkKSkKPiArwqDCoMKgIChob21lLXBh Z2UKPiAiaHR0cHM6Ly9naXRodWIuY29tL3NwZWVkNDcvc3BlY3RyZS1tZWx0ZG93bi1jaGVja2Vy IikKPiArwqDCoMKgIChzeW5vcHNpcyAiQ1BVIHZ1bG5lcmFiaWxpdHkgLyBtaXRpZ2F0aW9uIGNo ZWNrZXIiKQo+ICvCoMKgwqAgKGRlc2NyaXB0aW9uCj4gK8KgwqDCoMKgICJUaGlzIHBhY2thZ2Ug cHJvdmlkZXMgYSBzaGVsbCBzY3JpcHQgdG8gYXNzZXNzIHlvdXIgc3lzdGVtJ3MKPiByZXNpbGll bmNlCj4gK2FnYWluc3QgdGhlIHNldmVyYWwgdHJhbnNpZW50IGV4ZWN1dGlvbiBDVkVzIHRoYXQg d2VyZSBwdWJsaXNoZWQKPiBzaW5jZSBlYXJseQo+ICsyMDE4LCBhbmQgZ2l2ZSB5b3UgZ3VpZGFu Y2UgYXMgdG8gaG93IHRvIG1pdGlnYXRlIHRoZW0uIikKPiArwqDCoMKgIChsaWNlbnNlIGxpY2Vu c2U6Z3BsMykpKQo+IGRpZmYgLS1naXQgYS9nbnUvcGFja2FnZXMvcGF0Y2hlcy9zcGVjdHJlLW1l bHRkb3duLWNoZWNrZXItcmVtb3ZlLQo+IGJ1aWx0aW4tZmlybXdhcmUtZGF0YWJhc2UucGF0Y2gg Yi9nbnUvcGFja2FnZXMvcGF0Y2hlcy9zcGVjdHJlLQo+IG1lbHRkb3duLWNoZWNrZXItcmVtb3Zl LWJ1aWx0aW4tZmlybXdhcmUtZGF0YWJhc2UucGF0Y2gKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ IGluZGV4IDAwMDAwMDAwMDAuLjg4OGJiMGMyYjEKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZ251 L3BhY2thZ2VzL3BhdGNoZXMvc3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyLXJlbW92ZS1idWlsdGlu LQo+IGZpcm13YXJlLWRhdGFiYXNlLnBhdGNoCj4gQEAgLTAsMCArMSwyNDMgQEAKPiArRnJvbSBh M2E5YjdjYTkzMDcxMzkzZTZiZmQ5OTlmZWRkNzM3MDA5NzE4YWFiIE1vbiBTZXAgMTcgMDA6MDA6 MDAKPiAyMDAxCj4gK0Zyb206IEhpbHRvbiBDaGFpbiA8aGFrb0B1bHRyYXJhcmUuc3BhY2U+Cj4g K0RhdGU6IFNhdCwgMTIgTm92IDIwMjIgMjI6NDU6MjQgKzA4MDAKPiArU3ViamVjdDogW1BBVENI IDEvMl0gUmVtb3ZlIGJ1aWx0aW4gZmlybXdhcmUgZGF0YWJhc2UuCj4gKwo+ICsxLiBSZW1vdmUg ZG93bmxvYWRpbmcgZnVuY3Rpb24uCj4gKzIuIEFkZCBvcHRpb24gZm9yIHN1cHBseWluZyBhIGxv Y2FsIGRhdGFiYXNlLgo+ICstLS0KPiArIHNwZWN0cmUtbWVsdGRvd24tY2hlY2tlci5zaCB8IDE4 MCArKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiAtLS0KPiArIDEgZmlsZSBjaGFu Z2VkLCAxNSBpbnNlcnRpb25zKCspLCAxNjUgZGVsZXRpb25zKC0pCj4gKwo+ICtkaWZmIC0tZ2l0 IGEvc3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyLnNoIGIvc3BlY3RyZS1tZWx0ZG93bi0KPiBjaGVj a2VyLnNoCj4gK2luZGV4IDMwZjc2MGMuLmNlNDY5NzAgMTAwNzU1Cj4gKy0tLSBhL3NwZWN0cmUt bWVsdGRvd24tY2hlY2tlci5zaAo+ICsrKysgYi9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXIuc2gK PiArQEAgLTIyLDggKzIyLDYgQEAgZXhpdF9jbGVhbnVwKCkKPiArwqDCoMKgwqDCoMKgwqBbIC1u ICIke2R1bXBlZF9jb25maWc6LX0iIF0gJiYgWyAtZiAiJGR1bXBlZF9jb25maWciIF0gJiYgcm0K PiAtZiAiJGR1bXBlZF9jb25maWciCj4gK8KgwqDCoMKgwqDCoMKgWyAtbiAiJHtrZXJuZWx0bXA6 LX0iwqDCoMKgwqAgXSAmJiBbIC1mICIka2VybmVsdG1wIsKgwqDCoMKgIF0gJiYgcm0KPiAtZiAi JGtlcm5lbHRtcCIKPiArwqDCoMKgwqDCoMKgwqBbIC1uICIke2tlcm5lbHRtcDI6LX0iwqDCoMKg IF0gJiYgWyAtZiAiJGtlcm5lbHRtcDIiwqDCoMKgIF0gJiYgcm0KPiAtZiAiJGtlcm5lbHRtcDIi Cj4gKy3CoMKgwqDCoMKgwqBbIC1uICIke21jZWRiX3RtcDotfSLCoMKgwqDCoCBdICYmIFsgLWYg IiRtY2VkYl90bXAiwqDCoMKgwqAgXSAmJiBybQo+IC1mICIkbWNlZGJfdG1wIgo+ICstwqDCoMKg wqDCoMKgWyAtbiAiJHtpbnRlbF90bXA6LX0iwqDCoMKgwqAgXSAmJiBbIC1kICIkaW50ZWxfdG1w IsKgwqDCoMKgIF0gJiYgcm0KPiAtcmYgIiRpbnRlbF90bXAiCj4gK8KgwqDCoMKgwqDCoMKgWyAi JHttb3VudGVkX2RlYnVnZnM6LX0iID0gMSBdICYmIHVtb3VudCAvc3lzL2tlcm5lbC9kZWJ1Zwo+ IDI+L2Rldi9udWxsCj4gK8KgwqDCoMKgwqDCoMKgWyAiJHttb3VudGVkX3Byb2NmczotfSLCoCA9 IDEgXSAmJiB1bW91bnQgIiRwcm9jZnMiCj4gMj4vZGV2L251bGwKPiArwqDCoMKgwqDCoMKgwqBb ICIke2luc21vZF9jcHVpZDotfSLCoMKgwqAgPSAxIF0gJiYgcm1tb2QgY3B1aWQgMj4vZGV2L251 bGwKPiArQEAgLTkzLDkgKzkxLDcgQEAgc2hvd191c2FnZSgpCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoC0tdm1tIFthdXRvLHllcyxub13CoMKgwqDCoMKgb3ZlcnJpZGUgdGhlIGRl dGVjdGlvbiBvZiB0aGUKPiBwcmVzZW5jZSBvZiBhIGh5cGVydmlzb3IsIGRlZmF1bHQ6IGF1dG8K PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLS1hbGxvdy1tc3Itd3JpdGXCoMKgwqDC oMKgwqDCoGFsbG93IHByb2JpbmcgZm9yIHdyaXRlLW9ubHkKPiBNU1JzLCB0aGlzIG1pZ2h0IHBy b2R1Y2Uga2VybmVsIGxvZ3Mgb3IgYmUgYmxvY2tlZCBieSB5b3VyIHN5c3RlbQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAtLWNwdSBbIyxhbGxdwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGludGVyYWN0IHdpdGggQ1BVSUQgYW5kIE1TUgo+IG9mIENQVSBjb3JlIG51bWJlciAjLCBvciBh bGwgKGRlZmF1bHQ6IENQVSBjb3JlIDApCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg LS11cGRhdGUtZndkYsKgwqDCoMKgwqDCoMKgwqDCoMKgwqB1cGRhdGUgb3VyIGxvY2FsIGNvcHkg b2YgdGhlCj4gQ1BVIG1pY3JvY29kZXMgdmVyc2lvbnMgZGF0YWJhc2UgKHVzaW5nIHRoZSBhd2Vz b21lCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgTUNFeHRyYWN0b3IgcHJvamVjdCBhbmQgdGhlCj4g SW50ZWwgZmlybXdhcmVzIEdpdEh1YiByZXBvc2l0b3J5KQo+ICstwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoC0tdXBkYXRlLWJ1aWx0aW4tZndkYsKgwqDCoHNhbWUgYXMgLS11cGRhdGUtZndk YiBidXQKPiB1cGRhdGUgYnVpbHRpbiBEQiBpbnNpZGUgdGhlIHNjcmlwdCBpdHNlbGYKPiArK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAtLXdpdGgtZndkYiBGSUxFwqDCoMKgwqDCoMKgwqDC oHN1cHBseSB0aGUgQ1BVIG1pY3JvY29kZXMKPiB2ZXJzaW9ucyBkYXRhYmFzZQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAtLWR1bXAtbW9jay1kYXRhwqDCoMKgwqDCoMKgwqDCoHVz ZWQgdG8gbWltaWNrIGEgQ1BVIG9uIGFuCj4gb3RoZXIgc3lzdGVtLCBtYWlubHkgdXNlZCB0byBo ZWxwIGRlYnVnZ2luZyB0aGlzIHNjcmlwdAo+ICsKPiArwqDCoMKgwqDCoMKgwqBSZXR1cm4gY29k ZXM6Cj4gK0BAIC04MzcsMTQ3ICs4MzMsNiBAQCBzaG93X2hlYWRlcigpCj4gK8KgwqDCoMKgwqDC oMKgX2luZm8KPiArIH0KPiArCj4gKy1bIC16ICIkSE9NRSIgXSAmJiBIT01FPSIkKGdldGVudCBw YXNzd2QgIiQod2hvYW1pKSIgfCBjdXQgLWQ6IC1mNikiCj4gKy1tY2VkYl9jYWNoZT0iJEhPTUUv Lm1jZWRiIgo+ICstdXBkYXRlX2Z3ZGIoKQo+ICstewo+ICstwqDCoMKgwqDCoMKgc2hvd19oZWFk ZXIKPiArLQo+ICstwqDCoMKgwqDCoMKgc2V0IC1lCj4gKy0KPiArLcKgwqDCoMKgwqDCoGlmIFsg LXIgIiRtY2VkYl9jYWNoZSIgXTsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHByZXZpb3VzX2RidmVyc2lvbj0kKGF3ayAnL14jICUlJSBNQ0VEQiAvIHsgcHJpbnQgJDQKPiB9 JyAiJG1jZWRiX2NhY2hlIikKPiArLcKgwqDCoMKgwqDCoGZpCj4gKy0KPiArLcKgwqDCoMKgwqDC oCMgZmlyc3QsIGRvd25sb2FkIHRoZSBNQ0UuZGIgZnJvbSB0aGUgZXhjZWxsZW50IHBsYXRvbWF2 J3MKPiBNQ0V4dHJhY3RvciBwcm9qZWN0Cj4gKy3CoMKgwqDCoMKgwqBtY2VkYl90bXA9IiQobWt0 ZW1wIC10IHNtYy1tY2VkYi1YWFhYWFgpIgo+ICstCj4gwqDCoMKgwqDCoMKgbWNlZGJfdXJsPSdo dHRwczovL2dpdGh1Yi5jb20vcGxhdG9tYXYvTUNFeHRyYWN0b3IvcmF3L21hc3Rlci9NCj4gQ0Uu ZGInCj4gKy3CoMKgwqDCoMKgwqBfaW5mb19ub2wgIkZldGNoaW5nIE1DRS5kYiBmcm9tIHRoZSBN Q0V4dHJhY3RvciBwcm9qZWN0Li4uICIKPiArLcKgwqDCoMKgwqDCoGlmIGNvbW1hbmQgLXYgd2dl dCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB3 Z2V0IC1xICIkbWNlZGJfdXJsIiAtTyAiJG1jZWRiX3RtcCI7IHJldD0kPwo+ICstwqDCoMKgwqDC oMKgZWxpZiBjb21tYW5kIC12IGN1cmwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gKy3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgY3VybCAtc0wgIiRtY2VkYl91cmwiIC1vICIkbWNlZGJfdG1w IjsgcmV0PSQ/Cj4gKy3CoMKgwqDCoMKgwqBlbGlmIGNvbW1hbmQgLXYgZmV0Y2ggPi9kZXYvbnVs bCAyPiYxOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZmV0Y2ggLXEgIiRt Y2VkYl91cmwiIC1vICIkbWNlZGJfdG1wIjsgcmV0PSQ/Cj4gKy3CoMKgwqDCoMKgwqBlbHNlCj4g Ky3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWNobyBFUlJPUiAicGxlYXNlIGluc3RhbGwg b25lIG9mIFxgd2dldFxgLCBcYGN1cmxcYAo+IG9mIFxgZmV0Y2hcYCBwcm9ncmFtcyIKPiArLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gMQo+ICstwqDCoMKgwqDCoMKgZmkKPiAr LcKgwqDCoMKgwqDCoGlmIFsgIiRyZXQiICE9IDAgXTsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGVjaG8gRVJST1IgImVycm9yICRyZXQgd2hpbGUgZG93bmxvYWRpbmcgTUNF LmRiIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAkcmV0Cj4gKy3CoMKg wqDCoMKgwqBmaQo+ICstwqDCoMKgwqDCoMKgZWNobyBET05FCj4gKy0KPiArLcKgwqDCoMKgwqDC oCMgc2Vjb25kLCBnZXQgdGhlIEludGVsIGZpcm13YXJlcyBmcm9tIEdpdEh1Ygo+ICstwqDCoMKg wqDCoMKgaW50ZWxfdG1wPSIkKG1rdGVtcCAtZCAtdCBzbWMtaW50ZWxmdy1YWFhYWFgpIgo+ICst Cj4gwqDCoMKgwqDCoMKgaW50ZWxfdXJsPSJodHRwczovL2dpdGh1Yi5jb20vaW50ZWwvSW50ZWwt TGludXgtUHJvY2Vzc29yLU1pY3JvCj4gY29kZS1EYXRhLUZpbGVzL2FyY2hpdmUvbWFpbi56aXAi Cj4gKy3CoMKgwqDCoMKgwqBfaW5mb19ub2wgIkZldGNoaW5nIEludGVsIGZpcm13YXJlcy4uLiAi Cj4gKy3CoMKgwqDCoMKgwqAjIwo+IGh0dHBzOi8vZ2l0aHViLmNvbS9pbnRlbC9JbnRlbC1MaW51 eC1Qcm9jZXNzb3ItTWljcm9jb2RlLURhdGEtRmlsZXMuZ2l0Cj4gKy3CoMKgwqDCoMKgwqBpZiBj b21tYW5kIC12IHdnZXQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgd2dldCAtcSAiJGludGVsX3VybCIgLU8gIiRpbnRlbF90bXAvZncuemlwIjsg cmV0PSQ/Cj4gKy3CoMKgwqDCoMKgwqBlbGlmIGNvbW1hbmQgLXYgY3VybCA+L2Rldi9udWxsIDI+ JjE7IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjdXJsIC1zTCAiJGludGVs X3VybCIgLW8gIiRpbnRlbF90bXAvZncuemlwIjsgcmV0PSQ/Cj4gKy3CoMKgwqDCoMKgwqBlbGlm IGNvbW1hbmQgLXYgZmV0Y2ggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZmV0Y2ggLXEgIiRpbnRlbF91cmwiIC1vICIkaW50ZWxfdG1wL2Z3Lnpp cCI7IHJldD0kPwo+ICstwqDCoMKgwqDCoMKgZWxzZQo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGVjaG8gRVJST1IgInBsZWFzZSBpbnN0YWxsIG9uZSBvZiBcYHdnZXRcYCwgXGBjdXJs XGAKPiBvZiBcYGZldGNoXGAgcHJvZ3JhbXMiCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgcmV0dXJuIDEKPiArLcKgwqDCoMKgwqDCoGZpCj4gKy3CoMKgwqDCoMKgwqBpZiBbICIkcmV0 IiAhPSAwIF07IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlY2hvIEVSUk9S ICJlcnJvciAkcmV0IHdoaWxlIGRvd25sb2FkaW5nIEludGVsCj4gZmlybXdhcmVzIgo+ICstwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAkcmV0Cj4gKy3CoMKgwqDCoMKgwqBmaQo+ ICstwqDCoMKgwqDCoMKgZWNobyBET05FCj4gKy0KPiArLcKgwqDCoMKgwqDCoCMgbm93IGV4dHJh Y3QgTUNFZGIgY29udGVudHMgdXNpbmcgc3FsaXRlCj4gKy3CoMKgwqDCoMKgwqBfaW5mb19ub2wg IkV4dHJhY3RpbmcgTUNFZGIgZGF0YS4uLiAiCj4gKy3CoMKgwqDCoMKgwqBpZiAhIGNvbW1hbmQg LXYgc3FsaXRlMyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBlY2hvIEVSUk9SICJwbGVhc2UgaW5zdGFsbCB0aGUgXGBzcWxpdGUzXGAgcHJvZ3Jh bSIKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gMQo+ICstwqDCoMKgwqDC oMKgZmkKPiArLcKgwqDCoMKgwqDCoG1jZWRiX3JldmlzaW9uPSQoc3FsaXRlMyAiJG1jZWRiX3Rt cCIgInNlbGVjdCByZXZpc2lvbiBmcm9tCj4gTUNFIikKPiArLcKgwqDCoMKgwqDCoGlmIFsgLXog IiRtY2VkYl9yZXZpc2lvbiIgXTsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGVjaG8gRVJST1IgImRvd25sb2FkZWQgZmlsZSBzZWVtcyBpbnZhbGlkIgo+ICstwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAxCj4gKy3CoMKgwqDCoMKgwqBmaQo+ICstwqDCoMKg wqDCoMKgc3FsaXRlMyAiJG1jZWRiX3RtcCIgImFsdGVyIHRhYmxlIEludGVsIGFkZCBjb2x1bW4g b3JpZ2luCj4gdGV4dCIKPiArLcKgwqDCoMKgwqDCoHNxbGl0ZTMgIiRtY2VkYl90bXAiICJ1cGRh dGUgSW50ZWwgc2V0IG9yaWdpbj0nbWNlJyIKPiArLQo+ICstwqDCoMKgwqDCoMKgZWNobyBPSyAi TUNFeHRyYWN0b3IgZGF0YWJhc2UgcmV2aXNpb24gJG1jZWRiX3JldmlzaW9uIgo+ICstCj4gKy3C oMKgwqDCoMKgwqAjIHBhcnNlIEludGVsIGZpcm13YXJlcyB0byBnZXQgdGhlaXIgdmVyc2lvbnMK PiArLcKgwqDCoMKgwqDCoF9pbmZvX25vbCAiSW50ZWdyYXRpbmcgSW50ZWwgZmlybXdhcmVzIGRh dGEgdG8gZGIuLi4gIgo+ICstwqDCoMKgwqDCoMKgaWYgISBjb21tYW5kIC12IHVuemlwID4vZGV2 L251bGwgMj4mMTsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVjaG8gRVJS T1IgInBsZWFzZSBpbnN0YWxsIHRoZSBcYHVuemlwXGAgcHJvZ3JhbSIKPiArLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gMQo+ICstwqDCoMKgwqDCoMKgZmkKPiArLcKgwqDCoMKg wqDCoCggY2QgIiRpbnRlbF90bXAiICYmIHVuemlwIGZ3LnppcCA+L2Rldi9udWxsOyApCj4gKy3C oMKgwqDCoMKgwqBpZiAhIFsgLWQgIiRpbnRlbF90bXAvSW50ZWwtTGludXgtUHJvY2Vzc29yLU1p Y3JvY29kZS1EYXRhLQo+IEZpbGVzLW1haW4vaW50ZWwtdWNvZGUiIF07IHRoZW4KPiArLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlY2hvIEVSUk9SICJleHBlY3RlZCB0aGUgJ2ludGVsLXVj b2RlJyBmb2xkZXIgaW4gdGhlCj4gZG93bmxvYWRlZCB6aXAgZmlsZSIKPiArLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gMQo+ICstwqDCoMKgwqDCoMKgZmkKPiArLQo+ICstwqDC oMKgwqDCoMKgaWYgISBjb21tYW5kIC12IGl1Y29kZV90b29sID4vZGV2L251bGwgMj4mMTsgdGhl bgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICEgY29tbWFuZCAtdiBpdWNvZGUt dG9vbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgZWNobyBFUlJPUiAicGxlYXNlIGluc3RhbGwgdGhlIFxgaXVjb2Rl LQo+IHRvb2xcYCBwcm9ncmFtIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqByZXR1cm4gMQo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UK PiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaXVjb2RlX3Rv b2w9Iml1Y29kZS10b29sIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gKy3C oMKgwqDCoMKgwqBlbHNlCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaXVjb2RlX3Rv b2w9Iml1Y29kZV90b29sIgo+ICstwqDCoMKgwqDCoMKgZmkKPiArLcKgwqDCoMKgwqDCoCPCoCAw NzkvMDAxOiBzaWcgMHgwMDAxMDZjMiwgcGZfbWFzayAweDAxLCAyMDA5LTA0LTEwLCByZXYKPiAw eDAyMTcsIHNpemUgNTEyMAo+ICstwqDCoMKgwqDCoMKgI8KgIDA3OC8wMDQ6IHNpZyAweDAwMDEw NmNhLCBwZl9tYXNrIDB4MTAsIDIwMDktMDgtMjUsIHJldgo+IDB4MDEwNywgc2l6ZSA1MTIwCj4g Ky3CoMKgwqDCoMKgwqAkaXVjb2RlX3Rvb2wgLWwgIiRpbnRlbF90bXAvSW50ZWwtTGludXgtUHJv Y2Vzc29yLU1pY3JvY29kZS0KPiBEYXRhLUZpbGVzLW1haW4vaW50ZWwtdWNvZGUiIHwgZ3JlcCAt d0Ygc2lnIHwgd2hpbGUgcmVhZCAtciBfbGluZQo+ICstwqDCoMKgwqDCoMKgZG8KPiArLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfbGluZT0kKMKgwqAgZWNobyAiJF9saW5lIiB8IHRyIC1k ICcsJykKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfY3B1aWQ9JCjCoCBlY2hvICIk X2xpbmUiIHwgYXdrICd7cHJpbnQgJDN9JykKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBfY3B1aWQ9JCgoIF9jcHVpZCApKQo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9j cHVpZD0kKHByaW50ZiAiMHglMDhYIiAiJF9jcHVpZCIpCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgX2RhdGU9JCjCoMKgIGVjaG8gIiRfbGluZSIgfCBhd2sgJ3twcmludCAkNn0nIHwg dHIgLWQKPiAnLScpCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX3ZlcnNpb249JChl Y2hvICIkX2xpbmUiIHwgYXdrICd7cHJpbnQgJDh9JykKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBfdmVyc2lvbj0kKCggX3ZlcnNpb24gKSkKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBfdmVyc2lvbj0kKHByaW50ZiAiMHglMDhYIiAiJF92ZXJzaW9uIikKPiArLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfc3Fsc3RtPSIkKHByaW50ZiAiSU5TRVJUIElOVE8gSW50 ZWwKPiAob3JpZ2luLGNwdWlkLHZlcnNpb24seXl5eW1tZGQpIFZBTFVFUwo+IChcIiVzXCIsXCIl c1wiLFwiJXNcIixcIiVzXCIpOyIgImludGVsIiAiJChwcmludGYgIiUwOFgiICIkX2NwdWlkIiki Cj4gIiQocHJpbnRmICIlMDhYIiAiJF92ZXJzaW9uIikiICIkX2RhdGUiKSIKPiArLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBzcWxpdGUzICIkbWNlZGJfdG1wIiAiJF9zcWxzdG0iCj4gKy3C oMKgwqDCoMKgwqBkb25lCj4gKy3CoMKgwqDCoMKgwqBfaW50ZWxfdGltZXN0YW1wPSQoc3RhdCAt YyAlWSAiJGludGVsX3RtcC9JbnRlbC1MaW51eC0KPiBQcm9jZXNzb3ItTWljcm9jb2RlLURhdGEt RmlsZXMtbWFpbi9saWNlbnNlIiAyPi9kZXYvbnVsbCkKPiArLcKgwqDCoMKgwqDCoGlmIFsgLW4g IiRfaW50ZWxfdGltZXN0YW1wIiBdOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIyB1c2UgdGhpcyBkYXRlLCBpdCBtYXRjaGVzIHRoZSBsYXN0IGNvbW1pdCBkYXRlCj4gKy3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2ludGVsX2xhdGVzdF9kYXRlPSQoZGF0ZSArJVkl bSVkIC1kCj4gQCIkX2ludGVsX3RpbWVzdGFtcCIpCj4gKy3CoMKgwqDCoMKgwqBlbHNlCj4gKy3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWNobyAiRmFsbGluZyBiYWNrIHRvIHRoZSBsYXRl c3QgbWljcm9jb2RlIGRhdGUiCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2ludGVs X2xhdGVzdF9kYXRlPSQoc3FsaXRlMyAiJG1jZWRiX3RtcCIgIlNFTEVDVAo+IHl5eXltbWRkIGZy b20gSW50ZWwgV0hFUkUgb3JpZ2luID0gJ2ludGVsJyBPUkRFUiBCWSB5eXl5bW1kZCBERVNDCj4g TElNSVQgMTsiKQo+ICstwqDCoMKgwqDCoMKgZmkKPiArLcKgwqDCoMKgwqDCoGVjaG8gRE9ORSAi KHZlcnNpb24gJF9pbnRlbF9sYXRlc3RfZGF0ZSkiCj4gKy0KPiArLcKgwqDCoMKgwqDCoGRidmVy c2lvbj0iJG1jZWRiX3JldmlzaW9uK2kkX2ludGVsX2xhdGVzdF9kYXRlIgo+ICstCj4gKy3CoMKg wqDCoMKgwqBpZiBbICIkMSIgIT0gYnVpbHRpbiBdICYmIFsgLW4gIiRwcmV2aW91c19kYnZlcnNp b24iIF0gJiYgWwo+ICIkcHJldmlvdXNfZGJ2ZXJzaW9uIiA9ICJ2JGRidmVyc2lvbiIgXTsgdGhl bgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVjaG8gIldlIGFscmVhZHkgaGF2ZSB0 aGlzIHZlcnNpb24gbG9jYWxseSwgbm8gdXBkYXRlCj4gbmVlZGVkIgo+ICstwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHJldHVybiAwCj4gKy3CoMKgwqDCoMKgwqBmaQo+ICstCj4gKy3CoMKg wqDCoMKgwqBfaW5mb19ub2wgIkJ1aWxkaW5nIGxvY2FsIGRhdGFiYXNlLi4uICIKPiArLcKgwqDC oMKgwqDCoHsKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlY2hvICIjIFNwZWN0cmUg JiBNZWx0ZG93biBDaGVja2VyIjsKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlY2hv ICIjICUlJSBNQ0VEQiB2JGRidmVyc2lvbiI7Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgc3FsaXRlMyAiJG1jZWRiX3RtcCIgIlNFTEVDVCAnIwo+IEksMHgnfHx0MS5jcHVpZHx8Jyww eCd8fE1BWCh0MS52ZXJzaW9uKXx8JywnfHx0MS55eXl5bW1kZCBGUk9NIEludGVsCj4gQVMgdDEg TEVGVCBPVVRFUiBKT0lOIEludGVsIEFTIHQyIE9OIHQyLmNwdWlkPXQxLmNwdWlkIEFORAo+IHQy Lnl5eXltbWRkID4gdDEueXl5eW1tZGQgV0hFUkUgdDIueXl5eW1tZGQgSVMgTlVMTCBHUk9VUCBC WSB0MS5jcHVpZAo+IE9SREVSIEJZIHQxLmNwdWlkIEFTQzsiIHwgZ3JlcCAtdiAnXiMgLiwweDAw MDAwMDAwLCc7Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc3FsaXRlMyAiJG1jZWRi X3RtcCIgIlNFTEVDVCAnIwo+IEEsMHgnfHx0MS5jcHVpZHx8JywweCd8fE1BWCh0MS52ZXJzaW9u KXx8JywnfHx0MS55eXl5bW1kZCBGUk9NIEFNRMKgwqAKPiBBUyB0MSBMRUZUIE9VVEVSIEpPSU4g QU1EwqDCoCBBUyB0MiBPTiB0Mi5jcHVpZD10MS5jcHVpZCBBTkQKPiB0Mi55eXl5bW1kZCA+IHQx Lnl5eXltbWRkIFdIRVJFIHQyLnl5eXltbWRkIElTIE5VTEwgR1JPVVAgQlkgdDEuY3B1aWQKPiBP UkRFUiBCWSB0MS5jcHVpZCBBU0M7IiB8IGdyZXAgLXYgJ14jIC4sMHgwMDAwMDAwMCwnOwo+ICst wqDCoMKgwqDCoMKgfSA+ICIkbWNlZGJfY2FjaGUiCj4gKy3CoMKgwqDCoMKgwqBlY2hvIERPTkUg Iih2ZXJzaW9uICRkYnZlcnNpb24pIgo+ICstCj4gKy3CoMKgwqDCoMKgwqBpZiBbICIkMSIgPSBi dWlsdGluIF07IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBuZXdmaWxlPSQo bWt0ZW1wIC10IHNtYy1idWlsdGluLVhYWFhYWCkKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBhd2sgJy9eIyAlJSUgTUNFREIgLyB7IGV4aXQgfTsgeyBwcmludCB9JyAiJDAiID4KPiAi JG5ld2ZpbGUiCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgYXdrICd7IGlmIChOUj4x KSB7IHByaW50IH0gfScgIiRtY2VkYl9jYWNoZSIgPj4KPiAiJG5ld2ZpbGUiCj4gKy3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgY2F0ICIkbmV3ZmlsZSIgPiAiJDAiCj4gKy3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgcm0gLWYgIiRuZXdmaWxlIgo+ICstwqDCoMKgwqDCoMKgZmkKPiAr LX0KPiArLQo+ICsgcGFyc2Vfb3B0X2ZpbGUoKQo+ICsgewo+ICvCoMKgwqDCoMKgwqDCoCMgcGFy c2Vfb3B0X2ZpbGUgb3B0aW9uX25hbWUgb3B0aW9uX3ZhbHVlCj4gK0BAIC0xMDY3LDEyICs5MjIs MTUgQEAgd2hpbGUgWyAtbiAiJHsxOi19IiBdOyBkbwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAjIGRlcHJlY2F0ZWQsIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgb3B0X2V4cGxhaW49MAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBzaGlmdAo+ICstwqDCoMKgwqDCoMKgZWxpZiBbICIkMSIgPSAiLS11cGRhdGUt ZndkYiIgXSB8fCBbICIkMSIgPSAiLS11cGRhdGUtbWNlZGIiCj4gXTsgdGhlbgo+ICstwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoHVwZGF0ZV9md2RiCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgZXhpdCAkPwo+ICstwqDCoMKgwqDCoMKgZWxpZiBbICIkMSIgPSAiLS11cGRhdGUt YnVpbHRpbi1md2RiIiBdIHx8IFsgIiQxIiA9ICItLQo+IHVwZGF0ZS1idWlsdGluLW1jZWRiIiBd OyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdXBkYXRlX2Z3ZGIgYnVpbHRp bgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGV4aXQgJD8KPiArK8KgwqDCoMKgwqDC oGVsaWYgWyAiJDEiID0gIi0td2l0aC1md2RiIiBdIHx8IFsgIiQxIiA9ICItLXdpdGgtbWNlZGIi IF07Cj4gdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgb3B0X2Z3ZGI9JDIKPiAr K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbIC1mICIkb3B0X2Z3ZGIiIF07IHRoZW4K PiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBtY2VkYl9jYWNo ZT0kMgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlY2hvICIkMDogZXJyb3I6IC0td2l0aC1m d2RiIHNob3VsZCBiZSBhCj4gZmlsZSwgZ290ICckb3B0X2Z3ZGInIiA+JjIKPiArK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBleGl0IDI1NQo+ICsrwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc2hp ZnQgMgo+ICvCoMKgwqDCoMKgwqDCoGVsaWYgWyAiJDEiID0gIi0tZHVtcC1tb2NrLWRhdGEiIF07 IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgb3B0X21vY2s9MQo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzaGlmdAo+ICtAQCAtMjAzMywyMSArMTg5MSwxMSBA QCBpc194ZW5fZG9tVSgpCj4gK8KgwqDCoMKgwqDCoMKgZmkKPiArIH0KPiArCj4gKy1idWlsdGlu X2RidmVyc2lvbj0kKGF3ayAnL14jICUlJSBNQ0VEQiAvIHsgcHJpbnQgJDQgfScgIiQwIikKPiAr IGlmIFsgLXIgIiRtY2VkYl9jYWNoZSIgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoCMgd2UgaGF2 ZSBhIGxvY2FsIGNhY2hlIGZpbGUsIGJ1dCBpdCBtaWdodCBiZSBvbGRlciB0aGFuIHRoZQo+IGJ1 aWx0aW4gdmVyc2lvbiB3ZSBoYXZlCj4gK8KgwqDCoMKgwqDCoMKgbG9jYWxfZGJ2ZXJzaW9uPSQo wqAgYXdrICcvXiMgJSUlIE1DRURCIC8geyBwcmludCAkNCB9Jwo+ICIkbWNlZGJfY2FjaGUiKQo+ ICstwqDCoMKgwqDCoMKgIyBzb3J0IC1WIHNvcnRzIGJ5IHZlcnNpb24gbnVtYmVyCj4gKy3CoMKg wqDCoMKgwqBvbGRlcl9kYnZlcnNpb249JChwcmludGYgIiViXG4lYiIgIiRsb2NhbF9kYnZlcnNp b24iCj4gIiRidWlsdGluX2RidmVyc2lvbiIgfCBzb3J0IC1WIHwgaGVhZCAtbjEpCj4gKy3CoMKg wqDCoMKgwqBpZiBbICIkb2xkZXJfZGJ2ZXJzaW9uIiA9ICIkYnVpbHRpbl9kYnZlcnNpb24iIF07 IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBtY2VkYl9zb3VyY2U9IiRtY2Vk Yl9jYWNoZSIKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBtY2VkYl9pbmZvPSJsb2Nh bCBmaXJtd2FyZXMgREIgJGxvY2FsX2RidmVyc2lvbiIKPiArLcKgwqDCoMKgwqDCoGZpCj4gKy1m aQo+ICstIyBpZiBtY2VkYl9zb3VyY2UgaXMgbm90IHNldCwgZWl0aGVyIHdlIGRvbid0IGhhdmUg YSBsb2NhbCBjYWNoZWQKPiBkYiwgb3IgaXQgaXMgb2xkZXIgdGhhbiB0aGUgYnVpbHRpbiBkYgo+ ICstaWYgWyAteiAiJHttY2VkYl9zb3VyY2U6LX0iIF07IHRoZW4KPiArLcKgwqDCoMKgwqDCoG1j ZWRiX3NvdXJjZT0iJDAiCj4gKy3CoMKgwqDCoMKgwqBtY2VkYl9pbmZvPSJidWlsdGluIGZpcm13 YXJlcyBEQiAkYnVpbHRpbl9kYnZlcnNpb24iCj4gKyvCoMKgwqDCoMKgwqBtY2VkYl9zb3VyY2U9 IiRtY2VkYl9jYWNoZSIKPiArK8KgwqDCoMKgwqDCoG1jZWRiX2luZm89ImxvY2FsIGZpcm13YXJl cyBEQiAkbG9jYWxfZGJ2ZXJzaW9uIgo+ICsgZmkKPiArIHJlYWRfbWNlZGIoKQo+ICsgewo+ICtA QCAtMjA2Myw3ICsxOTExLDkgQEAgaXNfbGF0ZXN0X2tub3duX3Vjb2RlKCkKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIDIKPiArwqDCoMKgwqDCoMKgwqBmaQo+ICvCoMKg wqDCoMKgwqDCoHVjb2RlX2xhdGVzdD0ibGF0ZXN0IG1pY3JvY29kZSB2ZXJzaW9uIGZvciB5b3Vy IENQVSBtb2RlbCBpcwo+IHVua25vd24iCj4gKy3CoMKgwqDCoMKgwqBpZiBpc19pbnRlbDsgdGhl bgo+ICsrwqDCoMKgwqDCoMKgaWYgWyAteiAiJG1jZWRiX3NvdXJjZSIgXTsgdGhlbgo+ICsrwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIDIKPiArK8KgwqDCoMKgwqDCoGVsaWYgaXNf aW50ZWw7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY3B1X2JyYW5kX3By ZWZpeD1JCj4gK8KgwqDCoMKgwqDCoMKgZWxpZiBpc19hbWQ7IHRoZW4KPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgY3B1X2JyYW5kX3ByZWZpeD1BCj4gKy0tCj4gKzIuMzguMQo+ICsK TEdUTS4KPiBkaWZmIC0tZ2l0IGEvZ251L3BhY2thZ2VzL3BhdGNoZXMvc3BlY3RyZS1tZWx0ZG93 bi1jaGVja2VyLXN0YWdlLQo+IGNvbW1hbmRzLWZvci1zdWJzdGl0dXRpb24ucGF0Y2ggYi9nbnUv cGFja2FnZXMvcGF0Y2hlcy9zcGVjdHJlLQo+IG1lbHRkb3duLWNoZWNrZXItc3RhZ2UtY29tbWFu ZHMtZm9yLXN1YnN0aXR1dGlvbi5wYXRjaAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXgg MDAwMDAwMDAwMC4uYThlNzUzMWYzMgo+IC0tLSAvZGV2L251bGwKPiArKysgYi9nbnUvcGFja2Fn ZXMvcGF0Y2hlcy9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXItc3RhZ2UtY29tbWFuZHMtCj4gZm9y LXN1YnN0aXR1dGlvbi5wYXRjaAo+IEBAIC0wLDAgKzEsMTg0OSBAQAo+ICtGcm9tIDFkNzljMjIz ZDVkYzExNGY2M2RhMmM1MDYxZDJjNzEzZDhhMDU2ODcgTW9uIFNlcCAxNyAwMDowMDowMAo+IDIw MDEKPiArRnJvbTogSGlsdG9uIENoYWluIDxoYWtvQHVsdHJhcmFyZS5zcGFjZT4KPiArRGF0ZTog RnJpLCAxMSBOb3YgMjAyMiAxODo0OTo1MCArMDgwMAo+ICtTdWJqZWN0OiBbUEFUQ0ggMi8yXSBT dGFnZSBjb21tYW5kcyBmb3IgbGF0ZXIgc3Vic3RpdHV0aW9uLgo+ICsKPiArYXdrLCBiYXNlNjQs IGJhc2VuYW1lLCBidW56aXAyLCBjYXQsIGN1dCwgZGQsIGRpcm5hbWUsIGRtZXNnLCBmaW5kLAo+ IGdyZXAsCj4gK2d1bnppcCwgZ3ppcCwgaGVhZCwgaWQsIGx6NCwgbHpvcCwgbWt0ZW1wLCBtb2Rw cm9iZSwgbW91bnQsIG5tLAo+IG5wcm9jLAo+ICtvYmpkdW1wLCBvZCwgcGVybCwgcGdyZXAsIHJl YWRlbGYsIHJtLCBybW1vZCwgc2VkLCBzb3J0LCBzdGF0LAo+IHN0cmluZ3MsCj4gK3N5c2N0bCwg dHIsIHVtb3VudCwgdW5hbWUsIHVubHptYSwgdW54eiwgdW56c3RkLCB1dWVuY29kZSwgeGFyZ3Mu Cj4gKy0tLQpJIHRoaW5rIGl0J2QgYmV0dGVyIHRvIHByb3ZpZGUgYSBsaXR0bGUgbW9yZSBpbmZv cm1hdGlvbiBpbiB0aGUgcGF0Y2gKbm90ZSwgZS5nLiAiVGhlIGZvbGxvd2luZyBjb21tYW5kcyBh cmUgdGFrZW4gZnJvbSB0aGUgZW52aXJvbm1lbnQgYW5kCnRodXMgbmVlZCB0byBiZSBzdWJzdGl0 dXRlZDoKLSBhd2sKLSBiYXNlNjQKLSBiYXNlbmFtZQotIC4uLgpUaGUgZm9sbG93aW5nIGFyZSBz aGVsbCBidWlsdC1pbnMgYW5kIGNhbiByZW1haW4gYXMgaXMKLSBjb21tYW5kCi0gZWNobwotIC4u LiIKCkJ5IHRoZSB3YXksIEkgZmVlbCBsaWtlIGl0J2QgYmUgYW4gaW1wcm92ZW1lbnQgdG8gY3Jh bmsgZG93biBvbiB0aGUKbnVtYmVyIG9mIGNvbnRleHQgbGluZXMgb3IgdHJhbnNsYXRlIHRoaXMg aW50byBhbiBlcXVpdmFsZW50CnN1YnN0aXR1dGUqLCBpLmUuCihzdWJzdGl0dXRlKiAic3BlY3Ry ZS1tZWx0ZG93bi1jaGVja2VyLnNoIgogICgoIlxcPChhd2t8YmFzZTY0fC4uLilcXD4iIGFsbCBj bWQpCiAgIChmaW5kLWNvbW1hbmQgaW5wdXRzIGNtZCkpCiAgKCgiXFw8KGd6aXB8Z3VuemlwfC4u LilcXD4iIGFsbCBjbWQpCiAgIChmaW5kLWNvbW1hbmQgaW5wdXRzIGNtZCkpCiAgLi4uKQoKd2hl cmXCoAooZGVmaW5lKiAoZmluZC1jb21tYW5kIGlucHV0cyBjbWQgIzpvcHRpb25hbCAoYmluICJi aW4iKSkKICAoc2VhcmNoLWlucHV0LWZpbGUgaW5wdXRzIChzdHJpbmctYXBwZW5kIGJpbiAiLyIg Y21kKSkpCiAKPiArIHNwZWN0cmUtbWVsdGRvd24tY2hlY2tlci5zaCB8IDYwNiArKysrKysrKysr KysrKysrKystLS0tLS0tLS0tLS0tLS0KPiAtLS0KPiArIDEgZmlsZSBjaGFuZ2VkLCAzMDMgaW5z ZXJ0aW9ucygrKSwgMzAzIGRlbGV0aW9ucygtKQo+ICsKPiArZGlmZiAtLWdpdCBhL3NwZWN0cmUt bWVsdGRvd24tY2hlY2tlci5zaCBiL3NwZWN0cmUtbWVsdGRvd24tCj4gY2hlY2tlci5zaAo+ICtp bmRleCBjZTQ2OTcwLi40ODg5ZWJiIDEwMDc1NQo+ICstLS0gYS9zcGVjdHJlLW1lbHRkb3duLWNo ZWNrZXIuc2gKPiArKysrIGIvc3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyLnNoCj4gK0BAIC0xOSwz MSArMTksMzEgQEAgdHJhcCAnX3dhcm4gImludGVycnVwdGVkLCBjbGVhbmluZyB1cC4uLiI7Cj4g ZXhpdF9jbGVhbnVwOyBleGl0IDEnIElOVAo+ICsgZXhpdF9jbGVhbnVwKCkKPiArIHsKPiArwqDC oMKgwqDCoMKgwqAjIGNsZWFudXAgdGhlIHRlbXAgZGVjb21wcmVzc2VkIGNvbmZpZyAmIGtlcm5l bCBpbWFnZQo+ICstwqDCoMKgwqDCoMKgWyAtbiAiJHtkdW1wZWRfY29uZmlnOi19IiBdICYmIFsg LWYgIiRkdW1wZWRfY29uZmlnIiBdICYmIHJtCj4gLWYgIiRkdW1wZWRfY29uZmlnIgo+ICstwqDC oMKgwqDCoMKgWyAtbiAiJHtrZXJuZWx0bXA6LX0iwqDCoMKgwqAgXSAmJiBbIC1mICIka2VybmVs dG1wIsKgwqDCoMKgIF0gJiYgcm0KPiAtZiAiJGtlcm5lbHRtcCIKPiArLcKgwqDCoMKgwqDCoFsg LW4gIiR7a2VybmVsdG1wMjotfSLCoMKgwqAgXSAmJiBbIC1mICIka2VybmVsdG1wMiLCoMKgwqAg XSAmJiBybQo+IC1mICIka2VybmVsdG1wMiIKPiArLcKgwqDCoMKgwqDCoFsgIiR7bW91bnRlZF9k ZWJ1Z2ZzOi19IiA9IDEgXSAmJiB1bW91bnQgL3N5cy9rZXJuZWwvZGVidWcKPiAyPi9kZXYvbnVs bAo+ICstwqDCoMKgwqDCoMKgWyAiJHttb3VudGVkX3Byb2NmczotfSLCoCA9IDEgXSAmJiB1bW91 bnQgIiRwcm9jZnMiCj4gMj4vZGV2L251bGwKPiArLcKgwqDCoMKgwqDCoFsgIiR7aW5zbW9kX2Nw dWlkOi19IsKgwqDCoCA9IDEgXSAmJiBybW1vZCBjcHVpZCAyPi9kZXYvbnVsbAo+ICstwqDCoMKg wqDCoMKgWyAiJHtpbnNtb2RfbXNyOi19IsKgwqDCoMKgwqAgPSAxIF0gJiYgcm1tb2QgbXNyIDI+ L2Rldi9udWxsCj4gKyvCoMKgwqDCoMKgwqBbIC1uICIke2R1bXBlZF9jb25maWc6LX0iIF0gJiYg WyAtZiAiJGR1bXBlZF9jb25maWciIF0gJiYKPiBAcm1AIC1mICIkZHVtcGVkX2NvbmZpZyIKPiAr K8KgwqDCoMKgwqDCoFsgLW4gIiR7a2VybmVsdG1wOi19IsKgwqDCoMKgIF0gJiYgWyAtZiAiJGtl cm5lbHRtcCLCoMKgwqDCoCBdICYmCj4gQHJtQCAtZiAiJGtlcm5lbHRtcCIKPiArK8KgwqDCoMKg wqDCoFsgLW4gIiR7a2VybmVsdG1wMjotfSLCoMKgwqAgXSAmJiBbIC1mICIka2VybmVsdG1wMiLC oMKgwqAgXSAmJgo+IEBybUAgLWYgIiRrZXJuZWx0bXAyIgo+ICsrwqDCoMKgwqDCoMKgWyAiJHtt b3VudGVkX2RlYnVnZnM6LX0iID0gMSBdICYmIEB1bW91bnRAIC9zeXMva2VybmVsL2RlYnVnCj4g Mj4vZGV2L251bGwKPiArK8KgwqDCoMKgwqDCoFsgIiR7bW91bnRlZF9wcm9jZnM6LX0iwqAgPSAx IF0gJiYgQHVtb3VudEAgIiRwcm9jZnMiCj4gMj4vZGV2L251bGwKPiArK8KgwqDCoMKgwqDCoFsg IiR7aW5zbW9kX2NwdWlkOi19IsKgwqDCoCA9IDEgXSAmJiBAcm1tb2RAIGNwdWlkIDI+L2Rldi9u dWxsCj4gKyvCoMKgwqDCoMKgwqBbICIke2luc21vZF9tc3I6LX0iwqDCoMKgwqDCoCA9IDEgXSAm JiBAcm1tb2RAIG1zciAyPi9kZXYvbnVsbAo+ICvCoMKgwqDCoMKgwqDCoFsgIiR7a2xkbG9hZF9j cHVjdGw6LX0iwqAgPSAxIF0gJiYga2xkdW5sb2FkIGNwdWN0bAo+IDI+L2Rldi9udWxsCj4gK8Kg wqDCoMKgwqDCoMKgWyAiJHtrbGRsb2FkX3ZtbTotfSLCoMKgwqDCoCA9IDEgXSAmJiBrbGR1bmxv YWQgdm1twqDCoMKgCj4gMj4vZGV2L251bGwKPiArIH0KPiArCj4gKyAjIGlmIHdlIHdlcmUgZ2l0 IGNsb25lJ2QsIGFkanVzdCBWRVJTSU9OCj4gKy1pZiBbIC1kICIkKGRpcm5hbWUgIiQwIikvLmdp dCIgXSAmJiBjb21tYW5kIC12IGdpdCA+L2Rldi9udWxsIDI+JjE7Cj4gdGhlbgo+ICstwqDCoMKg wqDCoMKgZGVzY3JpYmU9JChnaXQgLUMgIiQoZGlybmFtZSAiJDAiKSIgZGVzY3JpYmUgLS10YWdz IC0tZGlydHkKPiAyPi9kZXYvbnVsbCkKPiArLcKgwqDCoMKgwqDCoFsgLW4gIiRkZXNjcmliZSIg XSAmJiBWRVJTSU9OPSQoZWNobyAiJGRlc2NyaWJlIiB8IHNlZCAtZQo+IHMvXnYvLykKPiArK2lm IFsgLWQgIiQoQGRpcm5hbWVAICIkMCIpLy5naXQiIF0gJiYgY29tbWFuZCAtdiBnaXQgPi9kZXYv bnVsbAo+IDI+JjE7IHRoZW4KPiArK8KgwqDCoMKgwqDCoGRlc2NyaWJlPSQoZ2l0IC1DICIkKEBk aXJuYW1lQCAiJDAiKSIgZGVzY3JpYmUgLS10YWdzIC0tZGlydHkKPiAyPi9kZXYvbnVsbCkKPiAr K8KgwqDCoMKgwqDCoFsgLW4gIiRkZXNjcmliZSIgXSAmJiBWRVJTSU9OPSQoZWNobyAiJGRlc2Ny aWJlIiB8IEBzZWRAIC1lCj4gcy9edi8vKQo+ICsgZmkKPiArCj4gKyBzaG93X3VzYWdlKCkKPiAr IHsKPiArwqDCoMKgwqDCoMKgwqAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwODYKPiArLcKgwqDC oMKgwqDCoGNhdCA8PEVPRgo+ICsrwqDCoMKgwqDCoMKgQGNhdEAgPDxFT0YKPiArwqDCoMKgwqDC oMKgwqBVc2FnZToKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBMaXZlIG1vZGUgKGF1 dG8pOsKgwqAgJChiYXNlbmFtZSAkMCkgW29wdGlvbnNdCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgTGl2ZSBtb2RlIChtYW51YWwpOiAkKGJhc2VuYW1lICQwKSBbb3B0aW9uc10gPFst LQo+IGtlcm5lbCA8a2ltYWdlPl0gWy0tY29uZmlnIDxrY29uZmlnPl0gWy0tbWFwIDxtYXBmaWxl Pl0+IC0tbGl2ZQo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoE9mZmxpbmUgbW9kZTrC oMKgwqDCoMKgwqAgJChiYXNlbmFtZSAkMCkgW29wdGlvbnNdIDxbLS0KPiBrZXJuZWwgPGtpbWFn ZT5dIFstLWNvbmZpZyA8a2NvbmZpZz5dIFstLW1hcCA8bWFwZmlsZT5dPgo+ICsrwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoExpdmUgbW9kZSAoYXV0byk6wqDCoCAkKEBiYXNlbmFtZUAgJDAp IFtvcHRpb25zXQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoExpdmUgbW9kZSAobWFu dWFsKTogJChAYmFzZW5hbWVAICQwKSBbb3B0aW9uc10gPFstLQo+IGtlcm5lbCA8a2ltYWdlPl0g Wy0tY29uZmlnIDxrY29uZmlnPl0gWy0tbWFwIDxtYXBmaWxlPl0+IC0tbGl2ZQo+ICsrwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoE9mZmxpbmUgbW9kZTrCoMKgwqDCoMKgwqAgJChAYmFzZW5h bWVAICQwKSBbb3B0aW9uc10gPFstLQo+IGtlcm5lbCA8a2ltYWdlPl0gWy0tY29uZmlnIDxrY29u ZmlnPl0gWy0tbWFwIDxtYXBmaWxlPl0+Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoE1vZGVzOgo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBUd28gbW9kZXMgYXJlIGF2YWlsYWJsZS4KPiAr QEAgLTEwNiw3ICsxMDYsNyBAQCBFT0YKPiArCj4gKyBzaG93X2Rpc2NsYWltZXIoKQo+ICsgewo+ ICstwqDCoMKgwqDCoMKgY2F0IDw8RU9GCj4gKyvCoMKgwqDCoMKgwqBAY2F0QCA8PEVPRgo+ICsg RGlzY2xhaW1lcjoKPiArCj4gKyBUaGlzIHRvb2wgZG9lcyBpdHMgYmVzdCB0byBkZXRlcm1pbmUg d2hldGhlciB5b3VyIHN5c3RlbSBpcyBpbW11bmUKPiAob3IgaGFzIHByb3BlciBtaXRpZ2F0aW9u cyBpbiBwbGFjZSkgZm9yIHRoZQo+ICtAQCAtMTM0LDcgKzEzNCw3IEBAIFRoaXMgdG9vbCBoYXMg YmVlbiByZWxlYXNlZCBpbiB0aGUgaG9wZSB0aGF0Cj4gaXQnbGwgYmUgdXNlZnVsLCBidXQgZG9u J3QgdXNlIGl0IHQKPiArIEVPRgo+ICsgfQo+ICsKPiArLW9zPSQodW5hbWUgLXMpCj4gKytvcz0k KEB1bmFtZUAgLXMpCj4gKwo+ICsgIyBwYXJzZSBvcHRpb25zCj4gKyBvcHRfa2VybmVsPScnCj4g K0BAIC0yMDMsNyArMjAzLDcgQEAgX19lY2hvKCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9pbnRlcnByZXRfY2hhcnM9Jy1lJwo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBf Y3RybGNoYXI9JCgkZWNob19jbWQgJF9pbnRlcnByZXRfY2hhcnMgIlwwMzMiKQo+ICstwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9tc2c9JCgkZWNob19jbWQgJF9pbnRlcnByZXRfY2hhcnMg IiRfbXNnIiB8IHNlZCAtcgo+ICJzLyRfY3RybGNoYXJcWyhbMC05XVswLTldPyg7WzAtOV1bMC05 XT8pPyk/bS8vZyIpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX21zZz0kKCRlY2hv X2NtZCAkX2ludGVycHJldF9jaGFycyAiJF9tc2ciIHwgQHNlZEAgLXIKPiAicy8kX2N0cmxjaGFy XFsoWzAtOV1bMC05XT8oO1swLTldWzAtOV0/KT8pP20vL2ciKQo+ICvCoMKgwqDCoMKgwqDCoGZp Cj4gK8KgwqDCoMKgwqDCoMKgaWYgWyAiJGVjaG9fY21kX3R5cGUiID0gcHJpbnRmIF07IHRoZW4K PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAiJG9wdCIgPSAiLW4iIF07IHRo ZW4KPiArQEAgLTM3OSw3ICszNzksNyBAQCBpc19jcHVfYWZmZWN0ZWQoKQo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAjIGh0dHBzOi8vZ2l0aHViLmNvbS9jcm96b25lL1NwZWN0cmVQ b0MvaXNzdWVzLzHCoF5GCj4gRTUyMDAgPT4gc3BlY3RyZSAyIG5vdCBhZmZlY3RlZAo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjCj4gaHR0cHM6Ly9naXRodWIuY29tL3BhYm9sZGlu L21lbHRkb3duLWV4cGxvaXQvaXNzdWVzLzE5wqBeRiBFNTIwMCA9Pgo+IG1lbHRkb3duIGFmZmVj dGVkCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgbW9kZWwgbmFtZSA6IFBlbnRp dW0oUikgRHVhbC1Db3JlwqAgQ1BVwqDCoMKgwqDCoCBFNTIwMMKgCj4gQCAyLjUwR0h6Cj4gKy3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgZWNobyAiJGNwdV9mcmllbmRseV9uYW1lIiB8 IGdyZXAgLXFFICdQZW50aXVtXChSXCkKPiBEdWFsLUNvcmVbWzpzcGFjZTpdXStDUFVbWzpzcGFj ZTpdXStFWzAtOV17NH1LPyc7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBp ZiBlY2hvICIkY3B1X2ZyaWVuZGx5X25hbWUiIHwgQGdyZXBAIC1xRQo+ICdQZW50aXVtXChSXCkg RHVhbC1Db3JlW1s6c3BhY2U6XV0rQ1BVW1s6c3BhY2U6XV0rRVswLTldezR9Sz8nOyB0aGVuCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB2YXJpYW50MT12 dWxuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC16 ICIkdmFyaWFudDIiIF0gJiYgdmFyaWFudDI9aW1tdW5lCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB2YXJpYW50Mz12dWxuCj4gK0BAIC00ODIsNyArNDgy LDcgQEAgaXNfY3B1X2FmZmVjdGVkKCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGk9JCgoIGkgKyAxICkpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIGRvIE5PVCBxdW90ZSAkY3B1X2FyY2hfbGlzdCBiZWxv dwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBzaGVs bGNoZWNrIGRpc2FibGU9U0MyMDg2Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGNwdWFyY2g9JChlY2hvICRjcHVfYXJjaF9saXN0IHwgYXdrICd7IHByaW50 Cj4gJCckaScgfScpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGNwdWFyY2g9JChlY2hvICRjcHVfYXJjaF9saXN0IHwgQGF3a0AgJ3sKPiBwcmludCAkJyRp JyB9JykKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9k ZWJ1ZyAiY2hlY2tpbmcgY3B1JGk6IDwkY3B1cGFydD4KPiA8JGNwdWFyY2g+Igo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBzb21lIGtlcm5lbHMgcmVw b3J0IEFBcmNoNjQgaW5zdGVhZCBvZiA4Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBbICIkY3B1YXJjaCIgPSAiQUFyY2g2NCIgXSAmJiBjcHVhcmNoPTgK PiArQEAgLTQ5Myw0OSArNDkzLDQ5IEBAIGlzX2NwdV9hZmZlY3RlZCgpCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBwYXJ0 wqDCoCA/wqAgPyBjMDggYzA5IGMwZCBjMGYgYzBlIGQwNwo+IGQwOCBkMDkgZDBhIGQwYiBkMGPC oMKgwqDCoMKgwqDCoMKgIGQwZAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgYXJjaMKgIDc/IDc/IDfCoMKgIDfCoMKgIDfC oMKgIDfCoMKgIDfCoMKgIDjCoMKgCj4gOMKgwqAgOMKgwqAgOMKgwqAgOMKgwqAgOMKgwqDCoMKg wqDCoMKgwqDCoMKgIDgKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIFdoaXRlbGlzdCBpZGVudGlmaWVkIG5v bi1hZmZlY3RlZAo+IHByb2Nlc3NvcnMsIHVzZSB2dWxuZXJhYmlsaXR5IGluZm9ybWF0aW9uIGZy b20KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCMgV2hpdGVsaXN0IGlkZW50aWZpZWQgbm9uLWFmZmVjdGVkCj4gcHJvY2Vzc29y cywgdXNlIHZ1bG5lcmFiaWxpdHkgaW5mb3JtYXRpb24gZnJvbQo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMKPiBodHRwczov L2RldmVsb3Blci5hcm0uY29tL3N1cHBvcnQvYXJtLXNlY3VyaXR5LXVwZGF0ZXMvc3BlY3VsYXRp dmUtcHJvY2Vzc29yLXZ1bG5lcmFiaWxpdHkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIFBhcnRudW1iZXJzIGNhbiBiZSBm b3VuZCBoZXJlOgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCMKPiBodHRwczovL2dpdGh1Yi5jb20vZ2NjLW1pcnJvci9nY2Mv YmxvYi9tYXN0ZXIvZ2NjL2NvbmZpZy9hcm0vYXJtLWNwdXMuaW4KPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IyBNYWludGFpbiBjdW11bGF0aXZlIGNoZWNrIG9mCj4gdnVsbmVyYWJpbGl0aWVzIC0KPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAjIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgY3B1IGlzCj4gYWZmZWN0ZWQsIHRoZW4gdGhlIHN5 c3RlbSBpcyBhZmZlY3RlZAo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAiJGNwdWFyY2giID0gNyBdICYmIGVjaG8KPiAi JGNwdXBhcnQiIHwgZ3JlcCAtcSAtdyAtZSAweGMwOCAtZSAweGMwOSAtZSAweGMwZCAtZSAweGMw ZTsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgaWYgWyAiJGNwdWFyY2giID0gNyBdICYmIGVjaG8KPiAiJGNwdXBhcnQi IHwgQGdyZXBAIC1xIC13IC1lIDB4YzA4IC1lIDB4YzA5IC1lIDB4YzBkIC1lIDB4YzBlOyB0aGVu Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHZhcmlhbnQxPXZ1bG4KPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgdmFyaWFudDI9dnVsbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC16ICIkdmFyaWFu dDMiIF0gJiYKPiB2YXJpYW50Mz1pbW11bmUKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgWyAteiAi JHZhcmlhbnQzYSIgXSAmJgo+IHZhcmlhbnQzYT1pbW11bmUKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgWyAteiAiJHZhcmlhbnQ0IiBdICYmCj4gdmFyaWFudDQ9aW1tdW5lCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoF9kZWJ1ZyAiY2hlY2tpbmcgY3B1JGk6IGFybXY3Cj4gQTgvQTkvQTEyL0ExNyBu b24gYWZmZWN0ZWQgdG8gdmFyaWFudHMgMywgM2EgJiA0Igo+ICstwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiBbICIkY3B1YXJj aCIgPSA3IF0gJiYgZWNobwo+ICIkY3B1cGFydCIgfCBncmVwIC1xIC13IC1lIDB4YzBmOyB0aGVu Cj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBlbGlmIFsgIiRjcHVhcmNoIiA9IDcgXSAmJiBlY2hvCj4gIiRjcHVwYXJ0IiB8IEBn cmVwQCAtcSAtdyAtZSAweGMwZjsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB2YXJpYW50 MT12dWxuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHZhcmlhbnQyPXZ1bG4KPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgWyAteiAiJHZhcmlhbnQzIiBdICYmCj4gdmFyaWFudDM9aW1tdW5lCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHZhcmlhbnQzYT12dWxuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oFsgLXogIiR2YXJpYW50NCIgXSAmJgo+IHZhcmlhbnQ0PWltbXVuZQo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBfZGVidWcgImNoZWNraW5nIGNwdSRpOiBhcm12Nwo+IEExNSBub24gYWZmZWN0ZWQg dG8gdmFyaWFudHMgMyAmIDQiCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIFsgIiRjcHVhcmNoIiA9IDggXSAmJiBlY2hv Cj4gIiRjcHVwYXJ0IiB8IGdyZXAgLXEgLXcgLWUgMHhkMDcgLWUgMHhkMDg7IHRoZW4KPiArK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGVsaWYgWyAiJGNwdWFyY2giID0gOCBdICYmIGVjaG8KPiAiJGNwdXBhcnQiIHwgQGdyZXBAIC1x IC13IC1lIDB4ZDA3IC1lIDB4ZDA4OyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHZhcmlh bnQxPXZ1bG4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdmFyaWFudDI9dnVsbgo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBbIC16ICIkdmFyaWFudDMiIF0gJiYKPiB2YXJpYW50Mz1pbW11bmUKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgdmFyaWFudDNhPXZ1bG4KPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgdmFyaWFudDQ9dnVsbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgImNoZWNraW5n IGNwdSRpOiBhcm12OAo+IEE1Ny9BNzIgbm9uIGFmZmVjdGVkIHRvIHZhcmlhbnRzIDMiCj4gKy3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBlbGlmIFsgIiRjcHVhcmNoIiA9IDggXSAmJiBlY2hvCj4gIiRjcHVwYXJ0IiB8IGdyZXAgLXEg LXcgLWUgMHhkMDk7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgWyAiJGNwdWFyY2giID0gOCBdICYmIGVjaG8K PiAiJGNwdXBhcnQiIHwgQGdyZXBAIC1xIC13IC1lIDB4ZDA5OyB0aGVuCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoHZhcmlhbnQxPXZ1bG4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdmFyaWFudDI9 dnVsbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC16ICIkdmFyaWFudDMiIF0gJiYKPiB2YXJp YW50Mz1pbW11bmUKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgWyAteiAiJHZhcmlhbnQzYSIgXSAm Jgo+IHZhcmlhbnQzYT1pbW11bmUKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdmFyaWFudDQ9dnVs bgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgImNoZWNraW5nIGNwdSRpOiBhcm12OAo+ IEE3MyBub24gYWZmZWN0ZWQgdG8gdmFyaWFudHMgMyAmIDNhIgo+ICstwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiBbICIkY3B1 YXJjaCIgPSA4IF0gJiYgZWNobwo+ICIkY3B1cGFydCIgfCBncmVwIC1xIC13IC1lIDB4ZDBhOyB0 aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBlbGlmIFsgIiRjcHVhcmNoIiA9IDggXSAmJiBlY2hvCj4gIiRjcHVwYXJ0IiB8 IEBncmVwQCAtcSAtdyAtZSAweGQwYTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB2YXJp YW50MT12dWxuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHZhcmlhbnQyPXZ1bG4KPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgdmFyaWFudDM9dnVsbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC16 ICIkdmFyaWFudDNhIiBdICYmCj4gdmFyaWFudDNhPWltbXVuZQo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqB2YXJpYW50ND12dWxuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAiY2hlY2tp bmcgY3B1JGk6IGFybXY4Cj4gQTc1IG5vbiBhZmZlY3RlZCB0byB2YXJpYW50IDNhIgo+ICstwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg ZWxpZiBbICIkY3B1YXJjaCIgPSA4IF0gJiYgZWNobwo+ICIkY3B1cGFydCIgfCBncmVwIC1xIC13 IC1lIDB4ZDBiIC1lIDB4ZDBjIC1lIDB4ZDBkOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIFsgIiRjcHVhcmNo IiA9IDggXSAmJiBlY2hvCj4gIiRjcHVwYXJ0IiB8IEBncmVwQCAtcSAtdyAtZSAweGQwYiAtZSAw eGQwYyAtZSAweGQwZDsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB2YXJpYW50MT12dWxu Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgLXogIiR2YXJpYW50MiIgXSAmJgo+IHZhcmlhbnQy PWltbXVuZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC16ICIkdmFyaWFudDMiIF0gJiYKPiB2 YXJpYW50Mz1pbW11bmUKPiArQEAgLTgxNiw3ICs4MTYsNyBAQCBpc19jcHVfc3NiX2ZyZWUoKQo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICIkY3B1X2ZhbWlseSIgPSAiMTgi IF0gfHwgXAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg WyAiJGNwdV9mYW1pbHkiID0gIjE3IiBdIHx8IFwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgIiRjcHVfZmFtaWx5IiA9ICIxNiIgXSB8fCBcCj4gKy3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgIiRjcHVfZmFtaWx5 IiA9ICIxNSIgXTsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBbICIkY3B1X2ZhbWlseSIgPSAiMTUiIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAwCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgZmkKPiArQEAgLTkxMCw3ICs5MTAs NyBAQCB3aGlsZSBbIC1uICIkezE6LX0iIF07IGRvCj4gK8KgwqDCoMKgwqDCoMKgZWxpZiBbICIk MSIgPSAiLS1jcHUiIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgb3B0 X2NwdT0kMgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICIkb3B0X2NwdSIg IT0gYWxsIF07IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgaWYgZWNobyAiJG9wdF9jcHUiIHwgZ3JlcCAtRXEgJ15bMC05XSsnOyB0aGVuCj4gKyvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGVjaG8gIiRvcHRf Y3B1IiB8IEBncmVwQCAtRXEgJ15bMC05XSsnOwo+IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBvcHRfY3B1PSQoKCBv cHRfY3B1ICkpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBlbHNlCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZWNobyAiJDA6IGVycm9yOiAtLWNwdSBzaG91bGQgYmUgYW4KPiBpbnRl Z2VyIG9yICdhbGwnLCBnb3QgJyRvcHRfY3B1JyIgPiYyCj4gK0BAIC05NjEsNyArOTYxLDcgQEAg d2hpbGUgWyAtbiAiJHsxOi19IiBdOyBkbwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgZWNobyAiJDA6IGVycm9yOiBvcHRpb24gLS1jdmUgZXhwZWN0cyBh Cj4gcGFyYW1ldGVyLCBzdXBwb3J0ZWQgQ1ZFcyBhcmU6ICRzdXBwb3J0ZWRfY3ZlX2xpc3QiID4m Mgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZXhpdCAy NTUKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZmkKPiArLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBzZWxlY3RlZF9jdmU9JChlY2hvICIkc3VwcG9ydGVkX2N2ZV9saXN0IiB8 IGdyZXAgLWl3bwo+ICIkMiIpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc2VsZWN0 ZWRfY3ZlPSQoZWNobyAiJHN1cHBvcnRlZF9jdmVfbGlzdCIgfCBAZ3JlcEAgLQo+IGl3byAiJDIi KQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbIC1uICIkc2VsZWN0ZWRfY3Zl IiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBvcHRfY3ZlX2xpc3Q9IiRvcHRfY3ZlX2xpc3QgJHNlbGVjdGVkX2N2ZSIKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG9wdF9jdmVfYWxsPTAKPiArQEAg LTExNjYsMTQgKzExNjYsMTQgQEAgY2hlY2tfa2VybmVsKCkKPiArwqDCoMKgwqDCoMKgwqAjIGEg ZGFtYWdlZCBFTEYgZmlsZSBhbmQgdmFsaWRhdGUgaXQsIGNoZWNrIGZvciBzdGRlcnIKPiB3YXJu aW5ncyB0b28KPiArCj4gK8KgwqDCoMKgwqDCoMKgIyB0aGUgd2FybmluZyAicmVhZGVsZjogV2Fy bmluZzogWzE2XTogTGluayBmaWVsZCAoMCkgc2hvdWxkCj4gaW5kZXggYSBzeW10YWIgc2VjdGlv bi4vIiBjYW4gYXBwZWFyIG9uIHZhbGlkIGtlcm5lbHMsIGlnbm9yZSBpdAo+ICstwqDCoMKgwqDC oMKgX3JlYWRlbGZfd2FybmluZ3M9JCgiJHtvcHRfYXJjaF9wcmVmaXh9cmVhZGVsZiIgLVMgIiRf ZmlsZSIKPiAyPiYxID4vZGV2L251bGwgfCBncmVwIC12ICdzaG91bGQgaW5kZXggYSBzeW10YWIg c2VjdGlvbicgfCB0ciAiXG4iCj4gIi8iKTsgcmV0PSQ/Cj4gKy3CoMKgwqDCoMKgwqBfcmVhZGVs Zl9zZWN0aW9ucz0kKCIke29wdF9hcmNoX3ByZWZpeH1yZWFkZWxmIiAtUyAiJF9maWxlIgo+IDI+ L2Rldi9udWxsIHwgZ3JlcCAtYyAtZSBkYXRhIC1lIHRleHQgLWUgaW5pdCkKPiArLcKgwqDCoMKg wqDCoF9rZXJuZWxfc2l6ZT0kKHN0YXQgLWMgJXMgIiRfZmlsZSIgMj4vZGV2L251bGwgfHwgc3Rh dCAtZiAlego+ICIkX2ZpbGUiIDI+L2Rldi9udWxsIHx8IGVjaG8gMTAwMDApCj4gKyvCoMKgwqDC oMKgwqBfcmVhZGVsZl93YXJuaW5ncz0kKCJAcmVhZGVsZkAiIC1TICIkX2ZpbGUiIDI+JjEgPi9k ZXYvbnVsbCB8Cj4gQGdyZXBAIC12ICdzaG91bGQgaW5kZXggYSBzeW10YWIgc2VjdGlvbicgfCBA dHJAICJcbiIgIi8iKTsgcmV0PSQ/Cj4gKyvCoMKgwqDCoMKgwqBfcmVhZGVsZl9zZWN0aW9ucz0k KCJAcmVhZGVsZkAiIC1TICIkX2ZpbGUiIDI+L2Rldi9udWxsIHwKPiBAZ3JlcEAgLWMgLWUgZGF0 YSAtZSB0ZXh0IC1lIGluaXQpCj4gKyvCoMKgwqDCoMKgwqBfa2VybmVsX3NpemU9JChAc3RhdEAg LWMgJXMgIiRfZmlsZSIgMj4vZGV2L251bGwgfHwgQHN0YXRAIC1mCj4gJXogIiRfZmlsZSIgMj4v ZGV2L251bGwgfHwgZWNobyAxMDAwMCkKPiArwqDCoMKgwqDCoMKgwqBfZGVidWcgImNoZWNrX2tl cm5lbDogcmV0PSQ/IHNpemU9JF9rZXJuZWxfc2l6ZQo+IHNlY3Rpb25zPSRfcmVhZGVsZl9zZWN0 aW9ucyB3YXJuaW5ncz0kX3JlYWRlbGZfd2FybmluZ3MiCj4gK8KgwqDCoMKgwqDCoMKgaWYgWyAi JF9tb2RlIiA9IGRlc3BlcmF0ZSBdOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaWYgIiR7b3B0X2FyY2hfcHJlZml4fXN0cmluZ3MiICIkX2ZpbGUiIHwgZ3JlcCAtRXEKPiAn XkxpbnV4IHZlcnNpb24gJzsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlm ICJAc3RyaW5nc0AiICIkX2ZpbGUiIHwgQGdyZXBAIC1FcSAnXkxpbnV4IHZlcnNpb24KPiAnOyB0 aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVi dWcgImNoZWNrX2tlcm5lbCAoZGVzcGVyYXRlKTogLi4uCj4gbWF0Y2hlZCEiCj4gKy3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgIiRfcmVhZGVsZl9zZWN0 aW9ucyIgPSAwIF0gJiYgZ3JlcCAtcUYgLQo+IGUgYXJtdjYgLWUgYXJtdjcgIiRfZmlsZSI7IHRo ZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAi JF9yZWFkZWxmX3NlY3Rpb25zIiA9IDAgXSAmJiBAZ3JlcEAgLXFGCj4gLWUgYXJtdjYgLWUgYXJt djcgIiRfZmlsZSI7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgImNoZWNrX2tlcm5lbCAoZGVzcGVyYXRl KTogcmF3Cj4gYXJtIGJpbmFyeSBmb3VuZCwgYWRqdXN0aW5nIG9iamR1bXAgb3B0aW9ucyIKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBvYmpkdW1wX29wdGlvbnM9Ii1EIC1iIGJpbmFyeSAtbWFybSIKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArQEAgLTEyMDYsNyArMTIw Niw3IEBAIHRyeV9kZWNvbXByZXNzKCkKPiArCj4gK8KgwqDCoMKgwqDCoMKgIyBUcnkgdG8gZmlu ZCB0aGUgaGVhZGVyICgkMSkgYW5kIGRlY29tcHJlc3MgZnJvbSBoZXJlCj4gK8KgwqDCoMKgwqDC oMKgX2RlYnVnICJ0cnlfZGVjb21wcmVzczogbG9va2luZyBmb3IgJDMgbWFnaWMgaW4gJDYiCj4g Ky3CoMKgwqDCoMKgwqBmb3LCoMKgwqDCoCBwb3MgaW4gJCh0ciAiJDFcbiQyIiAiXG4kMj0iIDwg IiQ2IiB8IGdyZXAgLWFibwo+ICJeJDIiKQo+ICsrwqDCoMKgwqDCoMKgZm9ywqDCoMKgwqAgcG9z IGluICQoQHRyQCAiJDFcbiQyIiAiXG4kMj0iIDwgIiQ2IiB8IEBncmVwQCAtYWJvCj4gIl4kMiIp Cj4gK8KgwqDCoMKgwqDCoMKgZG8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2Rl YnVnICJ0cnlfZGVjb21wcmVzczogbWFnaWMgZm9yICQzIGZvdW5kIGF0IG9mZnNldAo+ICRwb3Mi Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICEgY29tbWFuZCAtdiAiJDMiID4v ZGV2L251bGwgMj4mMTsgdGhlbgo+ICtAQCAtMTIzMywxMSArMTIzMywxMSBAQCB0cnlfZGVjb21w cmVzcygpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBr ZXJuZWw9IiRrZXJuZWx0bXAiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBfZGVidWcgInRyeV9kZWNvbXByZXNzOiBkZWNvbXByZXNzZWQgd2l0aCAkMwo+ IHN1Y2Nlc3NmdWxseSEiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqByZXR1cm4gMAo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgWyAi JDMiICE9ICJjYXQiIF07IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlm IFsgIiQzIiAhPSAiQGNhdEAiIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAidHJ5X2RlY29tcHJlc3M6IGRlY29tcHJlc3Npb24g d2l0aCAkMwo+IHdvcmtlZCBidXQgcmVzdWx0IGlzIG5vdCBhIGtlcm5lbCwgdHJ5aW5nIHdpdGgg YW4gb2Zmc2V0Igo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBbIC16ICIka2VybmVsdG1wMiIgXSAmJiBrZXJuZWx0bXAyPSQobWt0ZW1wIC0KPiB0IHNtYy1r ZXJuZWwtWFhYWFhYKQo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBjYXQgIiRrZXJuZWx0bXAiID4gIiRrZXJuZWx0bXAyIgo+ICstwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB0cnlfZGVjb21wcmVzcyAnXDE3N0VMRicgeHh5 ICdjYXQnICcnIGNhdAo+ICIka2VybmVsdG1wMiIgJiYgcmV0dXJuIDAKPiArK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgWyAteiAiJGtlcm5lbHRtcDIiIF0gJiYg a2VybmVsdG1wMj0kKEBta3RlbXBACj4gLXQgc21jLWtlcm5lbC1YWFhYWFgpCj4gKyvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoEBjYXRAICIka2VybmVsdG1wIiA+ ICIka2VybmVsdG1wMiIKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgdHJ5X2RlY29tcHJlc3MgJ1wxNzdFTEYnIHh4eSAnQGNhdEAnICcnIGNhdAo+ICIka2Vy bmVsdG1wMiIgJiYgcmV0dXJuIDAKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxz ZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2RlYnVn ICJ0cnlfZGVjb21wcmVzczogZGVjb21wcmVzc2lvbiB3aXRoICQzCj4gd29ya2VkIGJ1dCByZXN1 bHQgaXMgbm90IGEga2VybmVsIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ ICtAQCAtMTI0OSwxMiArMTI0OSwxMiBAQCBleHRyYWN0X2tlcm5lbCgpCj4gKyB7Cj4gK8KgwqDC oMKgwqDCoMKgWyAtbiAiJHsxOi19IiBdIHx8IHJldHVybiAxCj4gK8KgwqDCoMKgwqDCoMKgIyBQ cmVwYXJlIHRlbXAgZmlsZXM6Cj4gKy3CoMKgwqDCoMKgwqBrZXJuZWx0bXA9IiQobWt0ZW1wIC10 IHNtYy1rZXJuZWwtWFhYWFhYKSIKPiArK8KgwqDCoMKgwqDCoGtlcm5lbHRtcD0iJChAbWt0ZW1w QCAtdCBzbWMta2VybmVsLVhYWFhYWCkiCj4gKwo+ICvCoMKgwqDCoMKgwqDCoCMgSW5pdGlhbCBh dHRlbXB0IGZvciB1bmNvbXByZXNzZWQgaW1hZ2VzIG9yIG9iamVjdHM6Cj4gK8KgwqDCoMKgwqDC oMKgaWYgY2hlY2tfa2VybmVsICIkMSI7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgX2RlYnVnICJleHRyYWN0X2tlcm5lbDogZm91bmQga2VybmVsIGlzIHZhbGlkLCBubwo+ IGRlY29tcHJlc3Npb24gbmVlZGVkIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNh dCAiJDEiID4gIiRrZXJuZWx0bXAiCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgQGNh dEAgIiQxIiA+ICIka2VybmVsdG1wIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBr ZXJuZWw9JGtlcm5lbHRtcAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4g MAo+ICvCoMKgwqDCoMKgwqDCoGZpCj4gK0BAIC0xMjYzLDE0ICsxMjYzLDE0IEBAIGV4dHJhY3Rf a2VybmVsKCkKPiArwqDCoMKgwqDCoMKgwqBmb3IgcGFzcyBpbiAxIDI7IGRvCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZvciBtb2RlIGluIG5vcm1hbCBkZXNwZXJhdGU7IGRvCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgImV4 dHJhY3Rfa2VybmVsOiBwYXNzICRwYXNzICRtb2RlCj4gbW9kZSIKPiArLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdHJ5X2RlY29tcHJlc3MgJ1wwMzdcMjEzXDAx MCfCoMKgwqDCoCB4ecKgwqDCoAo+IGd1bnppcMKgICcnwqDCoMKgwqDCoCBndW56aXDCoMKgwqDC oMKgICIkMSIgIiRtb2RlIiAiJHBhc3MiICYmIHJldHVybiAwCj4gKy3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHRyeV9kZWNvbXByZXNzICdcMDAyXDA0MVwxMTRc MDMwJyB4eXnCoMKgCj4gJ2x6NCfCoMKgICctZCAtbCcgbGlibHo0LXRvb2wgIiQxIiAiJG1vZGUi ICIkcGFzcyIgJiYgcmV0dXJuIDAKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgdHJ5X2RlY29tcHJlc3MgJ1wzNzU3elhaXDAwMCfCoMKgwqDCoCBhYmNkZQo+ IHVueHrCoMKgwqAgJyfCoMKgwqDCoMKgIHh6LXV0aWxzwqDCoMKgICIkMSIgIiRtb2RlIiAiJHBh c3MiICYmIHJldHVybiAwCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoHRyeV9kZWNvbXByZXNzICdCWmgnwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgeHnC oMKgwqAKPiBidW56aXAyICcnwqDCoMKgwqDCoCBiemlwMsKgwqDCoMKgwqDCoCAiJDEiICIkbW9k ZSIgIiRwYXNzIiAmJiByZXR1cm4gMAo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqB0cnlfZGVjb21wcmVzcyAnXDEzNVwwXDBcMCfCoMKgwqDCoMKgwqAgeHh4 wqDCoAo+IHVubHptYcKgICcnwqDCoMKgwqDCoCB4ei11dGlsc8KgwqDCoCAiJDEiICIkbW9kZSIg IiRwYXNzIiAmJiByZXR1cm4gMAo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqB0cnlfZGVjb21wcmVzcyAnXDIxMVwxMTRcMTMyJ8KgwqDCoMKgIHh5wqDCoMKg Cj4gJ2x6b3AnwqAgJy1kJ8KgwqDCoCBsem9wwqDCoMKgwqDCoMKgwqAgIiQxIiAiJG1vZGUiICIk cGFzcyIgJiYgcmV0dXJuIDAKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgdHJ5X2RlY29tcHJlc3MgJ1wxNzdFTEYnwqDCoMKgwqDCoMKgwqDCoMKgIHh4ecKg wqAKPiAnY2F0J8KgwqAgJyfCoMKgwqDCoMKgIGNhdMKgwqDCoMKgwqDCoMKgwqAgIiQxIiAiJG1v ZGUiICIkcGFzcyIgJiYgcmV0dXJuIDAKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgdHJ5X2RlY29tcHJlc3MgJyhcMjY1L1wzNzUnwqDCoMKgwqDCoMKgIHh4 ecKgwqAKPiB1bnpzdGTCoCAnJ8KgwqDCoMKgwqAgenN0ZMKgwqDCoMKgwqDCoMKgICIkMSIgIiRt b2RlIiAiJHBhc3MiICYmIHJldHVybiAwCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHRyeV9kZWNvbXByZXNzICdcMDM3XDIxM1wwMTAnwqDCoMKgwqAgeHnC oMKgwqAKPiBAZ3VuemlwQMKgICcnwqDCoMKgwqDCoCBndW56aXDCoMKgwqDCoMKgICIkMSIgIiRt b2RlIiAiJHBhc3MiICYmIHJldHVybiAwCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHRyeV9kZWNvbXByZXNzICdcMDAyXDA0MVwxMTRcMDMwJyB4eXnCoMKg Cj4gJ0BsejRAJ8KgwqAgJy1kIC1sJyBsaWJsejQtdG9vbCAiJDEiICIkbW9kZSIgIiRwYXNzIiAm JiByZXR1cm4gMAo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqB0cnlfZGVjb21wcmVzcyAnXDM3NTd6WFpcMDAwJ8KgwqDCoMKgIGFiY2RlCj4gQHVueHpAwqDC oMKgICcnwqDCoMKgwqDCoCB4ei11dGlsc8KgwqDCoCAiJDEiICIkbW9kZSIgIiRwYXNzIiAmJiBy ZXR1cm4gMAo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB0 cnlfZGVjb21wcmVzcyAnQlpoJ8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHh5wqDCoMKgCj4g QGJ1bnppcDJAICcnwqDCoMKgwqDCoCBiemlwMsKgwqDCoMKgwqDCoCAiJDEiICIkbW9kZSIgIiRw YXNzIiAmJiByZXR1cm4gMAo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqB0cnlfZGVjb21wcmVzcyAnXDEzNVwwXDBcMCfCoMKgwqDCoMKgwqAgeHh4wqDCoAo+ IEB1bmx6bWFAwqAgJyfCoMKgwqDCoMKgIHh6LXV0aWxzwqDCoMKgICIkMSIgIiRtb2RlIiAiJHBh c3MiICYmIHJldHVybiAwCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoHRyeV9kZWNvbXByZXNzICdcMjExXDExNFwxMzInwqDCoMKgwqAgeHnCoMKgwqAKPiAn QGx6b3BAJ8KgICctZCfCoMKgwqAgbHpvcMKgwqDCoMKgwqDCoMKgICIkMSIgIiRtb2RlIiAiJHBh c3MiICYmIHJldHVybiAwCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoHRyeV9kZWNvbXByZXNzICdcMTc3RUxGJ8KgwqDCoMKgwqDCoMKgwqDCoCB4eHnCoMKg Cj4gJ0BjYXRAJ8KgwqAgJyfCoMKgwqDCoMKgIGNhdMKgwqDCoMKgwqDCoMKgwqAgIiQxIiAiJG1v ZGUiICIkcGFzcyIgJiYgcmV0dXJuIDAKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgdHJ5X2RlY29tcHJlc3MgJyhcMjY1L1wzNzUnwqDCoMKgwqDCoMKgIHh4 ecKgwqAKPiBAdW56c3RkQMKgICcnwqDCoMKgwqDCoCB6c3RkwqDCoMKgwqDCoMKgwqAgIiQxIiAi JG1vZGUiICIkcGFzcyIgJiYgcmV0dXJuIDAKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgZG9uZQo+ICvCoMKgwqDCoMKgwqDCoGRvbmUKPiArwqDCoMKgwqDCoMKgwqAjIGtlcm5lbF9l cnIgbWlnaHQgYWxyZWFkeSBoYXZlIGJlZW4gcG9wdWxhdGVkIGJ5Cj4gdHJ5X2RlY29tcHJlc3Mo KSBpZiB3ZSdyZSBtaXNzaW5nIG9uZSBvZiB0aGUgdG9vbHMKPiArQEAgLTEyODcsNyArMTI4Nyw3 IEBAIG1vdW50X2RlYnVnZnMoKQo+ICsgewo+ICvCoMKgwqDCoMKgwqDCoGlmIFsgISAtZSAvc3lz L2tlcm5lbC9kZWJ1Zy9zY2hlZF9mZWF0dXJlcyBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCMgdHJ5IHRvIG1vdW50IHRoZSBkZWJ1Z2ZzIGhpZXJhcmNoeSBvdXJzZWx2 ZXMgYW5kCj4gcmVtZW1iZXIgaXQgdG8gdW1vdW50IGFmdGVyd2FyZHMKPiArLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBtb3VudCAtdCBkZWJ1Z2ZzIGRlYnVnZnMgL3N5cy9rZXJuZWwvZGVi dWcKPiAyPi9kZXYvbnVsbCAmJiBtb3VudGVkX2RlYnVnZnM9MQo+ICsrwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoEBtb3VudEAgLXQgZGVidWdmcyBkZWJ1Z2ZzIC9zeXMva2VybmVsL2RlYnVn Cj4gMj4vZGV2L251bGwgJiYgbW91bnRlZF9kZWJ1Z2ZzPTEKPiArwqDCoMKgwqDCoMKgwqBmaQo+ ICsgfQo+ICsKPiArQEAgLTEyOTgsMTIgKzEyOTgsMTIgQEAgbG9hZF9tc3IoKQo+ICvCoMKgwqDC oMKgwqDCoGxvYWRfbXNyX29uY2U9MQo+ICsKPiArwqDCoMKgwqDCoMKgwqBpZiBbICIkb3MiID0g TGludXggXTsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICEgZ3JlcCAt cXcgbXNyICIkcHJvY2ZzL21vZHVsZXMiIDI+L2Rldi9udWxsOyB0aGVuCj4gKy3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1vZHByb2JlIG1zciAyPi9kZXYvbnVs bCAmJiBpbnNtb2RfbXNyPTEKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAhIEBn cmVwQCAtcXcgbXNyICIkcHJvY2ZzL21vZHVsZXMiIDI+L2Rldi9udWxsOwo+IHRoZW4KPiArK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgQG1vZHByb2JlQCBtc3Ig Mj4vZGV2L251bGwgJiYgaW5zbW9kX21zcj0xCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgImF0dGVtcHRlZCB0byBsb2FkIG1vZHVsZSBtc3Is Cj4gaW5zbW9kX21zcj0kaW5zbW9kX21zciIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg X2RlYnVnICJtc3IgbW9kdWxlIGFscmVhZHkgbG9hZGVkIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGZpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZmkKPiArwqDCoMKg wqDCoMKgwqBlbHNlCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICEga2xkc3Rh dCAtcSAtbSBjcHVjdGw7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGtsZGxvYWQgY3B1Y3RsIDI+L2Rldi9udWxsICYmCj4ga2xkbG9hZF9jcHVj dGw9MQo+ICtAQCAtMTMyMSwxMiArMTMyMSwxMiBAQCBsb2FkX2NwdWlkKCkKPiArwqDCoMKgwqDC oMKgwqBsb2FkX2NwdWlkX29uY2U9MQo+ICsKPiArwqDCoMKgwqDCoMKgwqBpZiBbICIkb3MiID0g TGludXggXTsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICEgZ3JlcCAt cXcgY3B1aWQgIiRwcm9jZnMvbW9kdWxlcyIgMj4vZGV2L251bGw7Cj4gdGhlbgo+ICstwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBtb2Rwcm9iZSBjcHVpZCAyPi9k ZXYvbnVsbCAmJiBpbnNtb2RfY3B1aWQ9MQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGlmICEgQGdyZXBAIC1xdyBjcHVpZCAiJHByb2Nmcy9tb2R1bGVzIiAyPi9kZXYvbnVsbDsKPiB0 aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoEBtb2Rw cm9iZUAgY3B1aWQgMj4vZGV2L251bGwgJiYKPiBpbnNtb2RfY3B1aWQ9MQo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2RlYnVnICJhdHRlbXB0ZWQgdG8g bG9hZCBtb2R1bGUgY3B1aWQsCj4gaW5zbW9kX2NwdWlkPSRpbnNtb2RfY3B1aWQiCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAiY3B1aWQgbW9kdWxlIGFscmVhZHkgbG9hZGVk Igo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gKyvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgZmkKPiArwqDCoMKgwqDCoMKgwqBlbHNlCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGlmICEga2xkc3RhdCAtcSAtbSBjcHVjdGw7IHRoZW4KPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtsZGxvYWQgY3B1Y3RsIDI+L2Rl di9udWxsICYmCj4ga2xkbG9hZF9jcHVjdGw9MQo+ICtAQCAtMTQxNSw3ICsxNDE1LDcgQEAgcmVh ZF9jcHVpZF9vbmVfY29yZSgpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgb24gc29tZSBrZXJuZWwgdmVyc2lvbnMs IC9kZXYvY3B1LzAvY3B1aWQgZG9lc24ndAo+IGltcGx5IHRoYXQgdGhlIGNwdWlkIG1vZHVsZSBp cyBsb2FkZWQsIGluIHRoYXQgY2FzZSBkZCByZXR1cm5zIGFuCj4gZXJyb3IsCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgd2UgdXNlIHRoYXQgZmFjdCB0byBsb2FkIHRoZSBtb2R1 bGUgaWYgZGQgcmV0dXJucwo+IGFuIGVycm9yCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaWYgISBkZCBpZj0vZGV2L2NwdS8wL2NwdWlkIGJzPTE2IGNvdW50PTEgPi9kZXYvbnVsbAo+ IDI+JjE7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAhIEBkZEAgaWY9 L2Rldi9jcHUvMC9jcHVpZCBicz0xNiBjb3VudD0xCj4gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsb2FkX2NwdWlk Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCMgd2UgbmVlZCBfbGVhZiB0byBiZSBjb252ZXJ0ZWQgdG8gZGVjaW1hbCBm b3IgZGQKPiArQEAgLTE0MjYsMTQgKzE0MjYsMTQgQEAgcmVhZF9jcHVpZF9vbmVfY29yZSgpCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9kZHNraXA9JCgoIF9wb3NpdGlvbiAvIDE2 ICkpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9vZHNraXA9JCgoIF9wb3NpdGlv biAtIF9kZHNraXAgKiAxNiApKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIG5v dyByZWFkIHRoZSB2YWx1ZQo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9jcHVpZD0k KGRkIGlmPSIvZGV2L2NwdS8kX2NvcmUvY3B1aWQiIGJzPTE2Cj4gc2tpcD0kX2Rkc2tpcCBjb3Vu dD0kKChfb2Rza2lwICsgMSkpIDI+L2Rldi9udWxsIHwgb2QgLWogJCgoX29kc2tpcCAqCj4gMTYp KSAtQSBuIC10IHU0KQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9jcHVpZD0kKEBk ZEAgaWY9Ii9kZXYvY3B1LyRfY29yZS9jcHVpZCIgYnM9MTYKPiBza2lwPSRfZGRza2lwIGNvdW50 PSQoKF9vZHNraXAgKyAxKSkgMj4vZGV2L251bGwgfCBAb2RAIC1qICQoKF9vZHNraXAKPiAqIDE2 KSkgLUEgbiAtdCB1NCkKPiArwqDCoMKgwqDCoMKgwqBlbGlmIFsgLWUgL2Rldi9jcHVjdGwwIF07 IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBCU0QKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAhIC1yIC9kZXYvY3B1Y3RsMCBdOyB0aGVuCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZWFkX2NwdWlkX21z Zz0iQ291bGRuJ3QgcmVhZCBjcHVpZCBpbmZvIGZyb20KPiBjcHVjdGwiCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gJFJFQURfQ1BVSURfUkVU X0VSUgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ICstwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoF9jcHVpZD0kKGNwdWNvbnRyb2wgLWkgIiRfbGVhZiIsIiRfc3VibGVh ZiIKPiAiL2Rldi9jcHVjdGwkX2NvcmUiIDI+L2Rldi9udWxsIHwgY3V0IC1kOiAtZjItKQo+ICsr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9jcHVpZD0kKGNwdWNvbnRyb2wgLWkgIiRfbGVh ZiIsIiRfc3VibGVhZiIKPiAiL2Rldi9jcHVjdGwkX2NvcmUiIDI+L2Rldi9udWxsIHwgQGN1dEAg LWQ6IC1mMi0pCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgY3B1aWQgbGV2ZWwg MHg0LCBsZXZlbF90eXBlIDB4MjogMHgxYzAwNDE0Mwo+IDB4MDFjMDAwM2YgMHgwMDAwMDFmZiAw eDAwMDAwMDAwCj4gK8KgwqDCoMKgwqDCoMKgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqByZWFkX2NwdWlkX21zZz0iRm91bmQgbm8gd2F5IHRvIHJlYWQgY3B1aWQgaW5mbyIK PiArQEAgLTE0NTYsNyArMTQ1Niw3IEBAIHJlYWRfY3B1aWRfb25lX2NvcmUoKQo+ICvCoMKgwqDC oMKgwqDCoGZpCj4gKwo+ICvCoMKgwqDCoMKgwqDCoCMgZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgcmVn aXN0ZXIgd2Ugd2FudAo+ICstwqDCoMKgwqDCoMKgX3JlZz0kKGVjaG8gIiRfY3B1aWQiIHwgYXdr ICd7cHJpbnQgJCciJF9yZWdpc3RlciInfScpCj4gKyvCoMKgwqDCoMKgwqBfcmVnPSQoZWNobyAi JF9jcHVpZCIgfCBAYXdrQCAne3ByaW50ICQnIiRfcmVnaXN0ZXIiJ30nKQo+ICvCoMKgwqDCoMKg wqDCoCMgTGludXggcmV0dXJucyBpdCBhcyBkZWNpbWFsLCBCU0QgYXMgaGV4LCBub3JtYWxpemUg dG8KPiBkZWNpbWFsCj4gK8KgwqDCoMKgwqDCoMKgX3JlZz0kKCggX3JlZyApKQo+ICvCoMKgwqDC oMKgwqDCoCMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjA0Ngo+ICtAQCAtMTQ4NCwxMSArMTQ4NCwx MSBAQCBkbWVzZ19ncmVwKCkKPiArwqDCoMKgwqDCoMKgwqAjIGdyZXAgZm9yIHNvbWV0aGluZyBp biBkbWVzZywgZW5zdXJpbmcgdGhhdCB0aGUgZG1lc2cgYnVmZmVyCj4gK8KgwqDCoMKgwqDCoMKg IyBoYXMgbm90IGJlZW4gdHJ1bmNhdGVkCj4gK8KgwqDCoMKgwqDCoMKgZG1lc2dfZ3JlcHBlZD0n Jwo+ICstwqDCoMKgwqDCoMKgaWYgISBkbWVzZyB8IGdyZXAgLXFFIC1lICcoXnxcXSApTGludXgg dmVyc2lvbiBbMC05XScgLWUKPiAnXkZyZWVCU0QgaXMgYSByZWdpc3RlcmVkJyA7IHRoZW4KPiAr K8KgwqDCoMKgwqDCoGlmICEgQGRtZXNnQCB8IEBncmVwQCAtcUUgLWUgJyhefFxdIClMaW51eCB2 ZXJzaW9uIFswLTldJyAtZQo+ICdeRnJlZUJTRCBpcyBhIHJlZ2lzdGVyZWQnIDsgdGhlbgo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIGRtZXNnIHRydW5jYXRlZAo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gMgo+ICvCoMKgwqDCoMKgwqDCoGZpCj4gKy3C oMKgwqDCoMKgwqBkbWVzZ19ncmVwcGVkPSQoZG1lc2cgfCBncmVwIC1FICIkMSIgfCBoZWFkIC0x KQo+ICsrwqDCoMKgwqDCoMKgZG1lc2dfZ3JlcHBlZD0kKEBkbWVzZ0AgfCBAZ3JlcEAgLUUgIiQx IiB8IEBoZWFkQCAtMSkKPiArwqDCoMKgwqDCoMKgwqAjIG5vdCBmb3VuZDoKPiArwqDCoMKgwqDC oMKgwqBbIC16ICIkZG1lc2dfZ3JlcHBlZCIgXSAmJiByZXR1cm4gMQo+ICvCoMKgwqDCoMKgwqDC oCMgZm91bmQsIG91dHB1dCBpcyBpbiAkZG1lc2dfZ3JlcHBlZAo+ICtAQCAtMTUwNSwxMiArMTUw NSwxMiBAQCBwYXJzZV9jcHVfZGV0YWlscygpCj4gKyB7Cj4gK8KgwqDCoMKgwqDCoMKgWyAiJHtw YXJzZV9jcHVfZGV0YWlsc19kb25lOi19IiA9IDEgXSAmJiByZXR1cm4gMAo+ICsKPiArLcKgwqDC oMKgwqDCoGlmIGNvbW1hbmQgLXYgbnByb2MgPi9kZXYvbnVsbDsgdGhlbgo+ICstwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoG51bWJlcl9vZl9jb3Jlcz0kKG5wcm9jKQo+ICstwqDCoMKgwqDC oMKgZWxpZiBlY2hvICIkb3MiIHwgZ3JlcCAtcSBCU0Q7IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBudW1iZXJfb2ZfY29yZXM9JChzeXNjdGwgLW4gaHcubmNwdSAyPi9kZXYv bnVsbCB8fAo+IGVjaG8gMSkKPiArK8KgwqDCoMKgwqDCoGlmIGNvbW1hbmQgLXYgQG5wcm9jQCA+ L2Rldi9udWxsOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbnVtYmVyX29m X2NvcmVzPSQoQG5wcm9jQCkKPiArK8KgwqDCoMKgwqDCoGVsaWYgZWNobyAiJG9zIiB8IEBncmVw QCAtcSBCU0Q7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBudW1iZXJfb2Zf Y29yZXM9JChAc3lzY3RsQCAtbiBody5uY3B1IDI+L2Rldi9udWxsIHx8Cj4gZWNobyAxKQo+ICvC oMKgwqDCoMKgwqDCoGVsaWYgWyAtZSAiJHByb2Nmcy9jcHVpbmZvIiBdOyB0aGVuCj4gKy3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbnVtYmVyX29mX2NvcmVzPSQoZ3JlcCAtYyBecHJvY2Vz c29yCj4gIiRwcm9jZnMvY3B1aW5mbyIgMj4vZGV2L251bGwgfHwgZWNobyAxKQo+ICsrwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoG51bWJlcl9vZl9jb3Jlcz0kKEBncmVwQCAtYyBecHJvY2Vz c29yCj4gIiRwcm9jZnMvY3B1aW5mbyIgMj4vZGV2L251bGwgfHwgZWNobyAxKQo+ICvCoMKgwqDC oMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBpZiB3ZSBkb24n dCBrbm93LCBkZWZhdWx0IHRvIDEgQ1BVCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oG51bWJlcl9vZl9jb3Jlcz0xCj4gK0BAIC0xNTE4LDQzICsxNTE4LDQzIEBAIHBhcnNlX2NwdV9k ZXRhaWxzKCkKPiArwqDCoMKgwqDCoMKgwqBtYXhfY29yZV9pZD0kKCggbnVtYmVyX29mX2NvcmVz IC0gMSApKQo+ICsKPiArwqDCoMKgwqDCoMKgwqBpZiBbIC1lICIkcHJvY2ZzL2NwdWluZm8iIF07 IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfdmVuZG9yPSQowqAgZ3Jl cCAnXnZlbmRvcl9pZCfCoCAiJHByb2Nmcy9jcHVpbmZvIiB8Cj4gYXdrICd7cHJpbnQgJDN9JyB8 IGhlYWQgLTEpCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY3B1X2ZyaWVuZGx5X25h bWU9JChncmVwICdebW9kZWwgbmFtZScKPiAiJHByb2Nmcy9jcHVpbmZvIiB8IGN1dCAtZDogLWYy LSB8IGhlYWQgLTEgfCBzZWQgLWUgJ3MvXiAqLy8nKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGNwdV92ZW5kb3I9JCjCoCBAZ3JlcEAgJ152ZW5kb3JfaWQnwqAgIiRwcm9jZnMvY3B1 aW5mbyIKPiB8IEBhd2tAICd7cHJpbnQgJDN9JyB8IEBoZWFkQCAtMSkKPiArK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBjcHVfZnJpZW5kbHlfbmFtZT0kKEBncmVwQCAnXm1vZGVsIG5hbWUn Cj4gIiRwcm9jZnMvY3B1aW5mbyIgfCBAY3V0QCAtZDogLWYyLSB8IEBoZWFkQCAtMSB8IEBzZWRA IC1lICdzL14gKi8vJykKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBzcGVjaWFs IGNhc2UgZm9yIEFSTSBmb2xsb3dzCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYg Z3JlcCAtcWkgJ0NQVQo+IGltcGxlbWVudGVyW1s6c3BhY2U6XV0qOltbOnNwYWNlOl1dKjB4NDEn ICIkcHJvY2ZzL2NwdWluZm8iOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg aWYgQGdyZXBAIC1xaSAnQ1BVCj4gaW1wbGVtZW50ZXJbWzpzcGFjZTpdXSo6W1s6c3BhY2U6XV0q MHg0MScgIiRwcm9jZnMvY3B1aW5mbyI7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNwdV92ZW5kb3I9J0FSTScKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgc29tZSBkZXZpY2VzIChwaG9uZXMgb3Ig b3RoZXIpIGhhdmUgc2V2ZXJhbAo+IEFSTXMgYW5kIGFzIHN1Y2ggZGlmZmVyZW50IHBhcnQgbnVt YmVycywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMg YW4gZXhhbXBsZSBpcyAiYmlnTElUVExFIiwgc28gd2UgbmVlZCB0bwo+IHN0b3JlIHRoZSB3aG9s ZSBsaXN0LCB0aGlzIGlzIG5lZWRlZCBmb3IgaXNfY3B1X2FmZmVjdGVkCj4gKy3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNwdV9wYXJ0X2xpc3Q9JChhd2sgJy9D UFUgcGFydC/CoMKgwqDCoMKgwqDCoMKgCj4ge3ByaW50ICQ0fScgIiRwcm9jZnMvY3B1aW5mbyIp Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNwdV9hcmNo X2xpc3Q9JChhd2sgJy9DUFUgYXJjaGl0ZWN0dXJlLwo+IHtwcmludCAkM30nICIkcHJvY2ZzL2Nw dWluZm8iKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBj cHVfcGFydF9saXN0PSQoQGF3a0AgJy9DUFUgcGFydC/CoMKgwqDCoMKgwqDCoMKgCj4ge3ByaW50 ICQ0fScgIiRwcm9jZnMvY3B1aW5mbyIpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGNwdV9hcmNoX2xpc3Q9JChAYXdrQCAnL0NQVSBhcmNoaXRlY3R1cmUv Cj4ge3ByaW50ICQzfScgIiRwcm9jZnMvY3B1aW5mbyIpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIHRha2UgdGhlIGZpcnN0IG9uZSB0byBmaWxsIHRo ZSBmcmllbmRseQo+IG5hbWUsIGRvIE5PVCBxdW90ZSB0aGUgdmFycyBiZWxvdwo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBzaGVsbGNoZWNrIGRpc2Fi bGU9U0MyMDg2Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGNwdV9hcmNoPSQoZWNobyAkY3B1X2FyY2hfbGlzdCB8IGF3ayAneyBwcmludAo+ICQxIH0nKQo+ ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfYXJjaD0k KGVjaG8gJGNwdV9hcmNoX2xpc3QgfCBAYXdrQCAnewo+IHByaW50ICQxIH0nKQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBzaGVsbGNoZWNrIGRpc2Fi bGU9U0MyMDg2Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGNwdV9wYXJ0PSQoZWNobyAkY3B1X3BhcnRfbGlzdCB8IGF3ayAneyBwcmludAo+ICQxIH0nKQo+ ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfcGFydD0k KGVjaG8gJGNwdV9wYXJ0X2xpc3QgfCBAYXdrQCAnewo+IHByaW50ICQxIH0nKQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgWyAiJGNwdV9hcmNoIiA9ICJB QXJjaDY0IiBdICYmIGNwdV9hcmNoPTgKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGNwdV9mcmllbmRseV9uYW1lPSJBUk0iCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC1uICIkY3B1X2FyY2giIF0gJiYKPiBj cHVfZnJpZW5kbHlfbmFtZT0iJGNwdV9mcmllbmRseV9uYW1lIHYkY3B1X2FyY2giCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC1uICIkY3B1X3BhcnQi IF0gJiYKPiBjcHVfZnJpZW5kbHlfbmFtZT0iJGNwdV9mcmllbmRseV9uYW1lIG1vZGVsICRjcHVf cGFydCIKPiArCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiBncmVwIC1xaSAn Q1BVCj4gaW1wbGVtZW50ZXJbWzpzcGFjZTpdXSo6W1s6c3BhY2U6XV0qMHg0MycgIiRwcm9jZnMv Y3B1aW5mbyI7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIEBncmVw QCAtcWkgJ0NQVQo+IGltcGxlbWVudGVyW1s6c3BhY2U6XV0qOltbOnNwYWNlOl1dKjB4NDMnICIk cHJvY2ZzL2NwdWluZm8iOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBjcHVfdmVuZG9yPSdDQVZJVU0nCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgZWxpZiBncmVwIC1xaSAnQ1BVCj4gaW1wbGVtZW50ZXJbWzpzcGFjZTpdXSo6W1s6 c3BhY2U6XV0qMHg3MCcgIiRwcm9jZnMvY3B1aW5mbyI7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBlbGlmIEBncmVwQCAtcWkgJ0NQVQo+IGltcGxlbWVudGVyW1s6c3BhY2U6 XV0qOltbOnNwYWNlOl1dKjB4NzAnICIkcHJvY2ZzL2NwdWluZm8iOyB0aGVuCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfdmVuZG9yPSdQSFlUSVVN Jwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ICsKPiArLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBjcHVfZmFtaWx5PSQowqAgZ3JlcCAnXmNwdSBmYW1pbHknICIkcHJv Y2ZzL2NwdWluZm8iIHwKPiBhd2sgJ3twcmludCAkNH0nIHwgZ3JlcCAtRSAnXlswLTldKyQnIHwg aGVhZCAtMSkKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfbW9kZWw9JCjCoMKg IGdyZXAgJ15tb2RlbCfCoMKgwqDCoMKgICIkcHJvY2ZzL2NwdWluZm8iIHwKPiBhd2sgJ3twcmlu dCAkM30nIHwgZ3JlcCAtRSAnXlswLTldKyQnIHwgaGVhZCAtMSkKPiArLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBjcHVfc3RlcHBpbmc9JChncmVwICdec3RlcHBpbmcnwqDCoCAiJHByb2Nm cy9jcHVpbmZvIiB8Cj4gYXdrICd7cHJpbnQgJDN9JyB8IGdyZXAgLUUgJ15bMC05XSskJyB8IGhl YWQgLTEpCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY3B1X3Vjb2RlPSQowqDCoCBn cmVwICdebWljcm9jb2RlJ8KgICIkcHJvY2ZzL2NwdWluZm8iIHwKPiBhd2sgJ3twcmludCAkM30n IHwgaGVhZCAtMSkKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfZmFtaWx5PSQo wqAgQGdyZXBAICdeY3B1IGZhbWlseScgIiRwcm9jZnMvY3B1aW5mbyIKPiB8IEBhd2tAICd7cHJp bnQgJDR9JyB8IEBncmVwQCAtRSAnXlswLTldKyQnIHwgQGhlYWRAIC0xKQo+ICsrwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGNwdV9tb2RlbD0kKMKgwqAgQGdyZXBAICdebW9kZWwnwqDCoMKg wqDCoCAiJHByb2Nmcy9jcHVpbmZvIgo+IHwgQGF3a0AgJ3twcmludCAkM30nIHwgQGdyZXBAIC1F ICdeWzAtOV0rJCcgfCBAaGVhZEAgLTEpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg Y3B1X3N0ZXBwaW5nPSQoQGdyZXBAICdec3RlcHBpbmcnwqDCoCAiJHByb2Nmcy9jcHVpbmZvIgo+ IHwgQGF3a0AgJ3twcmludCAkM30nIHwgQGdyZXBAIC1FICdeWzAtOV0rJCcgfCBAaGVhZEAgLTEp Cj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY3B1X3Vjb2RlPSQowqDCoCBAZ3JlcEAg J15taWNyb2NvZGUnwqAgIiRwcm9jZnMvY3B1aW5mbyIKPiB8IEBhd2tAICd7cHJpbnQgJDN9JyB8 IEBoZWFkQCAtMSkKPiArwqDCoMKgwqDCoMKgwqBlbHNlCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgY3B1X3ZlbmRvcj0kKCBkbWVzZyB8IGdyZXAgLWkgLW0xICdPcmlnaW49JyB8IGN1 dCAtZjIKPiAtdyB8IGN1dCAtZjIgLWQ9IHwgY3V0IC1mMiAtZFwiICkKPiArLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBjcHVfZmFtaWx5PSQoIGRtZXNnIHwgZ3JlcCAtaSAtbTEgJ0ZhbWls eT0nIHwgY3V0IC1mNAo+IC13IHwgY3V0IC1mMiAtZD0gKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGNwdV92ZW5kb3I9JCggQGRtZXNnQCB8IEBncmVwQCAtaSAtbTEgJ09yaWdpbj0n IHwKPiBAY3V0QCAtZjIgLXcgfCBAY3V0QCAtZjIgLWQ9IHwgQGN1dEAgLWYyIC1kXCIgKQo+ICsr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNwdV9mYW1pbHk9JCggQGRtZXNnQCB8IEBncmVw QCAtaSAtbTEgJ0ZhbWlseT0nIHwKPiBAY3V0QCAtZjQgLXcgfCBAY3V0QCAtZjIgLWQ9ICkKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY3B1X2ZhbWlseT0kKCggY3B1X2ZhbWlseSAp KQo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNwdV9tb2RlbD0kKCBkbWVzZyB8IGdy ZXAgLWkgLW0xICdNb2RlbD0nIHwgY3V0IC1mNSAtCj4gdyB8IGN1dCAtZjIgLWQ9ICkKPiArK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfbW9kZWw9JCggQGRtZXNnQCB8IEBncmVwQCAt aSAtbTEgJ01vZGVsPScgfCBAY3V0QAo+IC1mNSAtdyB8IEBjdXRAIC1mMiAtZD0gKQo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfbW9kZWw9JCgoIGNwdV9tb2RlbCApKQo+ICst wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNwdV9zdGVwcGluZz0kKCBkbWVzZyB8IGdyZXAg LWkgLW0xICdTdGVwcGluZz0nIHwgY3V0Cj4gLWY2IC13IHwgY3V0IC1mMiAtZD0gKQo+ICstwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNwdV9mcmllbmRseV9uYW1lPSQoc3lzY3RsIC1uIGh3 Lm1vZGVsIDI+L2Rldi9udWxsKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNwdV9z dGVwcGluZz0kKCBAZG1lc2dAIHwgQGdyZXBAIC1pIC1tMSAnU3RlcHBpbmc9JyB8Cj4gQGN1dEAg LWY2IC13IHwgQGN1dEAgLWYyIC1kPSApCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg Y3B1X2ZyaWVuZGx5X25hbWU9JChAc3lzY3RsQCAtbiBody5tb2RlbCAyPi9kZXYvbnVsbCkKPiAr wqDCoMKgwqDCoMKgwqBmaQo+ICsKPiArwqDCoMKgwqDCoMKgwqBpZiBbIC1uICIke1NNQ19NT0NL X0NQVV9GUklFTkRMWV9OQU1FOi19IiBdOyB0aGVuCj4gK0BAIC0xNjA5LDcgKzE2MDksNyBAQCBw YXJzZV9jcHVfZGV0YWlscygpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAjIGNhbGwgQ1BVSUQKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGNwdWNvbnRyb2wgLWkgMSAvZGV2L2NwdWN0bDAgPi9kZXYvbnVsbAo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyByZWFkIE1T Ugo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfdWNv ZGU9JChjcHVjb250cm9sIC1tIDB4OGIgL2Rldi9jcHVjdGwwIHwKPiBhd2sgJ3twcmludCAkM30n KQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfdWNv ZGU9JChjcHVjb250cm9sIC1tIDB4OGIgL2Rldi9jcHVjdGwwIHwKPiBAYXdrQCAne3ByaW50ICQz fScpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIGNv bnZlcnQgdG8gZGVjaW1hbAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgY3B1X3Vjb2RlPSQoKCBjcHVfdWNvZGUgKSkKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgY29udmVydCBiYWNrIHRvIGhleAo+ICtAQCAt MTYyOCw3ICsxNjI4LDcgQEAgcGFyc2VfY3B1X2RldGFpbHMoKQo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBtb2NrbWU9JChwcmludGYgIiViXG4lYiIgIiRtb2NrbWUiCj4gIlNNQ19N T0NLX0NQVV9VQ09ERT0nJGNwdV91Y29kZSciKQo+ICvCoMKgwqDCoMKgwqDCoGZpCj4gKwo+ICst wqDCoMKgwqDCoMKgZWNobyAiJGNwdV91Y29kZSIgfCBncmVwIC1xIF4weCAmJiBjcHVfdWNvZGU9 JCgoIGNwdV91Y29kZSApKQo+ICsrwqDCoMKgwqDCoMKgZWNobyAiJGNwdV91Y29kZSIgfCBAZ3Jl cEAgLXEgXjB4ICYmIGNwdV91Y29kZT0kKCggY3B1X3Vjb2RlCj4gKSkKPiArwqDCoMKgwqDCoMKg wqB1Y29kZV9mb3VuZD0kKHByaW50ZiAiZmFtaWx5IDB4JXggbW9kZWwgMHgleCBzdGVwcGluZyAw eCV4Cj4gdWNvZGUgMHgleCBjcHVpZCAweCV4IiAiJGNwdV9mYW1pbHkiICIkY3B1X21vZGVsIiAi JGNwdV9zdGVwcGluZyIKPiAiJGNwdV91Y29kZSIgIiRjcHVfY3B1aWQiKQo+ICsKPiArwqDCoMKg wqDCoMKgwqAjIGFsc28gZGVmaW5lIHRob3NlIHRoYXQgd2Ugd2lsbCBuZWVkIGluIG90aGVyIGZ1 bmNzCj4gK0BAIC0xNzI1LDggKzE3MjUsOCBAQCBpc19jcHVfc210X2VuYWJsZWQoKQo+ICsgewo+ ICvCoMKgwqDCoMKgwqDCoCMgU01UIC8gSHlwZXJUaHJlYWRpbmcgaXMgZW5hYmxlZCBpZiBzaWJs aW5ncyAhPSBjcHVjb3Jlcwo+ICvCoMKgwqDCoMKgwqDCoGlmIFsgLWUgIiRwcm9jZnMvY3B1aW5m byIgXTsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9zaWJsaW5ncz0kKGF3 ayAnL15zaWJsaW5ncy/CoCB7cHJpbnQgJDM7ZXhpdH0nCj4gIiRwcm9jZnMvY3B1aW5mbyIpCj4g Ky3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2NwdWNvcmVzPSQoYXdrICcvXmNwdSBjb3Jl cy8ge3ByaW50ICQ0O2V4aXR9Jwo+ICIkcHJvY2ZzL2NwdWluZm8iKQo+ICsrwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoF9zaWJsaW5ncz0kKEBhd2tAICcvXnNpYmxpbmdzL8KgIHtwcmludCAk MztleGl0fScKPiAiJHByb2Nmcy9jcHVpbmZvIikKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBfY3B1Y29yZXM9JChAYXdrQCAnL15jcHUgY29yZXMvIHtwcmludCAkNDtleGl0fScKPiAi JHByb2Nmcy9jcHVpbmZvIikKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAt biAiJF9zaWJsaW5ncyIgXSAmJiBbIC1uICIkX2NwdWNvcmVzIiBdOyB0aGVuCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICIkX3NpYmxpbmdzIiA9 ICIkX2NwdWNvcmVzIiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIDEKPiArQEAgLTE3NzQsMTAgKzE3 NzQsMTAgQEAgaXNfdWNvZGVfYmxhY2tsaXN0ZWQoKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAkSU5URUxfRkFNNl9TQU5EWUJSSURHRV9YLDB4MDYsMHg2MWLCoMKgIFwKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgJElOVEVMX0ZBTTZfU0FORFlCUklER0VfWCwweDA3 LDB4NzEyCj4gK8KgwqDCoMKgwqDCoMKgZG8KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBtb2RlbD0kKGVjaG8gIiR0dXBsZSIgfCBjdXQgLWQsIC1mMSkKPiArLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBzdGVwcGluZz0kKCggJChlY2hvICIkdHVwbGUiIHwgY3V0IC1kLCAtZjIp ICkpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbW9kZWw9JChlY2hvICIkdHVwbGUi IHwgQGN1dEAgLWQsIC1mMSkKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzdGVwcGlu Zz0kKCggJChlY2hvICIkdHVwbGUiIHwgQGN1dEAgLWQsIC1mMikgKSkKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAiJGNwdV9tb2RlbCIgPSAiJG1vZGVsIiBdICYmIFsgIiRj cHVfc3RlcHBpbmciID0KPiAiJHN0ZXBwaW5nIiBdOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHVjb2RlPSQoKCAkKGVjaG8gIiR0dXBsZSIgfCBj dXQgLWQsIC1mMykgKSkKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgdWNvZGU9JCgoICQoZWNobyAiJHR1cGxlIiB8IEBjdXRAIC1kLCAtZjMpICkpCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICIkY3B1X3Vj b2RlIiA9ICIkdWNvZGUiIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgImlzX3Vjb2RlX2JsYWNrbGlz dGVkOiB3ZSBoYXZlCj4gYSBtYXRjaCEgKCRjcHVfbW9kZWwvJGNwdV9zdGVwcGluZy8kY3B1X3Vj b2RlKSIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqByZXR1cm4gMAo+ICtAQCAtMTg2NSw3ICsxODY1LDcgQEAgaXNfeGVuX2Rv bTAoKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gMQo+ICvCoMKgwqDC oMKgwqDCoGZpCj4gKwo+ICstwqDCoMKgwqDCoMKgaWYgWyAtZSAiJHByb2Nmcy94ZW4vY2FwYWJp bGl0aWVzIiBdICYmIGdyZXAgLXEgImNvbnRyb2xfZCIKPiAiJHByb2Nmcy94ZW4vY2FwYWJpbGl0 aWVzIjsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgaWYgWyAtZSAiJHByb2Nmcy94ZW4vY2FwYWJpbGl0 aWVzIiBdICYmIEBncmVwQCAtcSAiY29udHJvbF9kIgo+ICIkcHJvY2ZzL3hlbi9jYXBhYmlsaXRp ZXMiOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAwCj4gK8Kg wqDCoMKgwqDCoMKgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4g MQo+ICtAQCAtMTg5MywxMyArMTg5MywxMyBAQCBpc194ZW5fZG9tVSgpCj4gKwo+ICsgaWYgWyAt ciAiJG1jZWRiX2NhY2hlIiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgIyB3ZSBoYXZlIGEgbG9j YWwgY2FjaGUgZmlsZSwgYnV0IGl0IG1pZ2h0IGJlIG9sZGVyIHRoYW4gdGhlCj4gYnVpbHRpbiB2 ZXJzaW9uIHdlIGhhdmUKPiArLcKgwqDCoMKgwqDCoGxvY2FsX2RidmVyc2lvbj0kKMKgIGF3ayAn L14jICUlJSBNQ0VEQiAvIHsgcHJpbnQgJDQgfScKPiAiJG1jZWRiX2NhY2hlIikKPiArK8KgwqDC oMKgwqDCoGxvY2FsX2RidmVyc2lvbj0kKMKgIEBhd2tAICcvXiMgJSUlIE1DRURCIC8geyBwcmlu dCAkNCB9Jwo+ICIkbWNlZGJfY2FjaGUiKQo+ICvCoMKgwqDCoMKgwqDCoG1jZWRiX3NvdXJjZT0i JG1jZWRiX2NhY2hlIgo+ICvCoMKgwqDCoMKgwqDCoG1jZWRiX2luZm89ImxvY2FsIGZpcm13YXJl cyBEQiAkbG9jYWxfZGJ2ZXJzaW9uIgo+ICsgZmkKPiArIHJlYWRfbWNlZGIoKQo+ICsgewo+ICst wqDCoMKgwqDCoMKgYXdrICd7IGlmIChERUxJTT09MSkgeyBwcmludCAkMiB9IH0gL14jICUlJSBN Q0VEQiAvIHsgREVMSU09MQo+IH0nICIkbWNlZGJfc291cmNlIgo+ICsrwqDCoMKgwqDCoMKgQGF3 a0AgJ3sgaWYgKERFTElNPT0xKSB7IHByaW50ICQyIH0gfSAvXiMgJSUlIE1DRURCIC8gewo+IERF TElNPTEgfScgIiRtY2VkYl9zb3VyY2UiCj4gKyB9Cj4gKwo+ICsgaXNfbGF0ZXN0X2tub3duX3Vj b2RlKCkKPiArQEAgLTE5MjAsMTAgKzE5MjAsMTAgQEAgaXNfbGF0ZXN0X2tub3duX3Vjb2RlKCkK PiArwqDCoMKgwqDCoMKgwqBlbHNlCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJl dHVybiAyCj4gK8KgwqDCoMKgwqDCoMKgZmkKPiArLcKgwqDCoMKgwqDCoGZvciB0dXBsZSBpbiAk KHJlYWRfbWNlZGIgfCBncmVwICIkKHByaW50Zgo+ICJeJGNwdV9icmFuZF9wcmVmaXgsMHglMDhY LCIgIiRjcHVfY3B1aWQiKSIpCj4gKyvCoMKgwqDCoMKgwqBmb3IgdHVwbGUgaW4gJChyZWFkX21j ZWRiIHwgQGdyZXBAICIkKHByaW50Zgo+ICJeJGNwdV9icmFuZF9wcmVmaXgsMHglMDhYLCIgIiRj cHVfY3B1aWQiKSIpCj4gK8KgwqDCoMKgwqDCoMKgZG8KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqB1Y29kZT0kKCjCoCAkKGVjaG8gIiR0dXBsZSIgfCBjdXQgLWQsIC1mMykgKSkKPiAr LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB1Y29kZV9kYXRlPSQoZWNobyAiJHR1cGxlIiB8 IGN1dCAtZCwgLWY0IHwgc2VkIC1yCj4gJ3M9KC4uLi4pKC4uKSguLik9XDEvXDIvXDM9JykKPiAr K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB1Y29kZT0kKCjCoCAkKGVjaG8gIiR0dXBsZSIg fCBAY3V0QCAtZCwgLWYzKSApKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHVjb2Rl X2RhdGU9JChlY2hvICIkdHVwbGUiIHwgQGN1dEAgLWQsIC1mNCB8IEBzZWRAIC1yCj4gJ3M9KC4u Li4pKC4uKSguLik9XDEvXDIvXDM9JykKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg X2RlYnVnICJpc19sYXRlc3Rfa25vd25fdWNvZGU6IHdpdGggY3B1aWQgJGNwdV9jcHVpZAo+IGhh cyB1Y29kZSAkY3B1X3Vjb2RlLCBsYXN0IGtub3duIGlzICR1Y29kZSBmcm9tICR1Y29kZV9kYXRl Igo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB1Y29kZV9sYXRlc3Q9JChwcmludGYg ImxhdGVzdCB2ZXJzaW9uIGlzIDB4JXggZGF0ZWQKPiAkdWNvZGVfZGF0ZSBhY2NvcmRpbmcgdG8g JG1jZWRiX2luZm8iICIkdWNvZGUiKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBp ZiBbICIkY3B1X3Vjb2RlIiAtZ2UgIiR1Y29kZSIgXTsgdGhlbgo+ICtAQCAtMTk0OCw3ICsxOTQ4 LDcgQEAgZ2V0X2NtZGxpbmUoKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrZXJu ZWxfY21kbGluZT0iJFNNQ19NT0NLX0NNRExJTkUiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoHJldHVybgo+ICvCoMKgwqDCoMKgwqDCoGVsc2UKPiArLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBrZXJuZWxfY21kbGluZT0kKGNhdCAiJHByb2Nmcy9jbWRsaW5lIikKPiArK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrZXJuZWxfY21kbGluZT0kKEBjYXRAICIkcHJvY2Zz L2NtZGxpbmUiKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBtb2NrbWU9JChwcmlu dGYgIiViXG4lYiIgIiRtb2NrbWUiCj4gIlNNQ19NT0NLX0NNRExJTkU9JyRrZXJuZWxfY21kbGlu ZSciKQo+ICvCoMKgwqDCoMKgwqDCoGZpCj4gKyB9Cj4gK0BAIC0xOTU2LDcgKzE5NTYsNyBAQCBn ZXRfY21kbGluZSgpCj4gKyAjIEVOVFJZUE9JTlQKPiArCj4gKyAjIHdlIGNhbid0IGRvIGFueXRo aW5nIHVzZWZ1bCB1bmRlciBXU0wKPiArLWlmIHVuYW1lIC1hIHwgZ3JlcCAtcUUgLS0gJy1NaWNy b3NvZnQgI1swLTldKy1NaWNyb3NvZnQgJzsgdGhlbgo+ICsraWYgQHVuYW1lQCAtYSB8IEBncmVw QCAtcUUgLS0gJy1NaWNyb3NvZnQgI1swLTldKy1NaWNyb3NvZnQgJzsgdGhlbgo+ICvCoMKgwqDC oMKgwqDCoF93YXJuICJUaGlzIHNjcmlwdCBkb2Vzbid0IHdvcmsgdW5kZXIgV2luZG93cyBTdWJz eXN0ZW0gZm9yCj4gTGludXgiCj4gK8KgwqDCoMKgwqDCoMKgX3dhcm4gIllvdSBzaG91bGQgdXNl IHRoZSBvZmZpY2lhbCBNaWNyb3NvZnQgdG9vbCBpbnN0ZWFkLiIKPiArwqDCoMKgwqDCoMKgwqBf d2FybiAiSXQgY2FuIGJlIGZvdW5kIHVuZGVyCj4gaHR0cHM6Ly9ha2EubXMvU3BlY3VsYXRpb25D b250cm9sUFMiCj4gK0BAIC0yMDA1LDE1ICsyMDA1LDE1IEBAIGZpCj4gKwo+ICsgIyBpZiB3ZSdy ZSB1bmRlciBhIEJTRCwgdHJ5IHRvIG1vdW50IGxpbnByb2NmcyBmb3IKPiAiJHByb2Nmcy9jcHVp bmZvIgo+ICsgcHJvY2ZzPS9wcm9jCj4gKy1pZiBlY2hvICIkb3MiIHwgZ3JlcCAtcSBCU0Q7IHRo ZW4KPiArK2lmIGVjaG8gIiRvcyIgfCBAZ3JlcEAgLXEgQlNEOyB0aGVuCj4gK8KgwqDCoMKgwqDC oMKgX2RlYnVnICJXZSdyZSB1bmRlciBCU0QsIGNoZWNrIGlmIHdlIGhhdmUgcHJvY2ZzIgo+ICst wqDCoMKgwqDCoMKgcHJvY2ZzPSQobW91bnQgfCBhd2sgJy9ebGlucHJvY2ZzLyB7IHByaW50ICQz OyBleGl0OyB9JykKPiArK8KgwqDCoMKgwqDCoHByb2Nmcz0kKEBtb3VudEAgfCBAYXdrQCAnL15s aW5wcm9jZnMvIHsgcHJpbnQgJDM7IGV4aXQ7IH0nKQo+ICvCoMKgwqDCoMKgwqDCoGlmIFsgLXog IiRwcm9jZnMiIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2RlYnVn ICJ3ZSBkb24ndCwgdHJ5IHRvIG1vdW50IGl0Igo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBwcm9jZnM9L3Byb2MKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgWyAtZCAv Y29tcGF0L2xpbnV4L3Byb2MgXSAmJgo+IHByb2Nmcz0vY29tcGF0L2xpbnV4L3Byb2MKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdGVzdCAtZCAkcHJvY2ZzIHx8IG1rZGlyICRwcm9j ZnMKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBtb3VudCAtdCBsaW5wcm9jZnMg bGlucHJvY2ZzICRwcm9jZnMgMj4vZGV2L251bGw7Cj4gdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGlmIEBtb3VudEAgLXQgbGlucHJvY2ZzIGxpbnByb2NmcyAkcHJvY2ZzCj4g Mj4vZGV2L251bGw7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoG1vdW50ZWRfcHJvY2ZzPTEKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAicHJvY2ZzIGp1c3QgbW91bnRlZCBhdCAkcHJvY2Zz Igo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbHNlCj4gK0BAIC0yMDQ1LDE0ICsy MDQ1LDE0IEBAIGZpCj4gKwo+ICsgaWYgWyAiJG9wdF9saXZlIiA9IDEgXTsgdGhlbgo+ICvCoMKg wqDCoMKgwqDCoCMgcm9vdCBjaGVjayAob25seSBmb3IgbGl2ZSBtb2RlLCBmb3Igb2ZmbGluZSBt b2RlLCB3ZQo+IGFscmVhZHkgY2hlY2tlZCBpZiB3ZSBjb3VsZCByZWFkIHRoZSBmaWxlcykKPiAr LcKgwqDCoMKgwqDCoGlmIFsgIiQoaWQgLXUpIiAtbmUgMCBdOyB0aGVuCj4gKyvCoMKgwqDCoMKg wqBpZiBbICIkKEBpZEAgLXUpIiAtbmUgMCBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoF93YXJuICJOb3RlIHRoYXQgeW91IHNob3VsZCBsYXVuY2ggdGhpcyBzY3JpcHQg d2l0aAo+IHJvb3QgcHJpdmlsZWdlcyB0byBnZXQgYWNjdXJhdGUgaW5mb3JtYXRpb24uIgo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfd2FybiAiV2UnbGwgcHJvY2VlZCBidXQgeW91 IG1pZ2h0IHNlZSBwZXJtaXNzaW9uCj4gZGVuaWVkIGVycm9ycy4iCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoF93YXJuICJUbyBydW4gaXQgYXMgcm9vdCwgeW91IGNhbiB0cnkgdGhl IGZvbGxvd2luZwo+IGNvbW1hbmQ6IHN1ZG8gJDAiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoF93YXJuCj4gK8KgwqDCoMKgwqDCoMKgZmkKPiArwqDCoMKgwqDCoMKgwqBfaW5mbyAi Q2hlY2tpbmcgZm9yIHZ1bG5lcmFiaWxpdGllcyBvbiBjdXJyZW50IHN5c3RlbSIKPiArLcKgwqDC oMKgwqDCoF9pbmZvICJLZXJuZWwgaXMgXDAzM1szNW0kb3MgJCh1bmFtZSAtcikgJCh1bmFtZSAt dikgJCh1bmFtZQo+IC1tKVwwMzNbMG0iCj4gKyvCoMKgwqDCoMKgwqBfaW5mbyAiS2VybmVsIGlz IFwwMzNbMzVtJG9zICQoQHVuYW1lQCAtcikgJChAdW5hbWVAIC12KQo+ICQoQHVuYW1lQCAtbSlc MDMzWzBtIgo+ICvCoMKgwqDCoMKgwqDCoF9pbmZvICJDUFUgaXMgXDAzM1szNW0kY3B1X2ZyaWVu ZGx5X25hbWVcMDMzWzBtIgo+ICsKPiArwqDCoMKgwqDCoMKgwqAjIHRyeSB0byBmaW5kIHRoZSBp bWFnZSBvZiB0aGUgY3VycmVudCBydW5uaW5nIGtlcm5lbAo+ICtAQCAtMjA2MCwxMiArMjA2MCwx MiBAQCBpZiBbICIkb3B0X2xpdmUiID0gMSBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCMgc3BlY2lmaWVkIGJ5IHVzZXIgb24gY21kbGluZSwgd2l0aCAtLWxpdmUsIGRv bid0Cj4gb3ZlcnJpZGUKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgOgo+ICvCoMKg wqDCoMKgwqDCoCMgZmlyc3QsIGxvb2sgZm9yIHRoZSBCT09UX0lNQUdFIGhpbnQgaW4gdGhlIGtl cm5lbCBjbWRsaW5lCj4gKy3CoMKgwqDCoMKgwqBlbGlmIGVjaG8gIiRrZXJuZWxfY21kbGluZSIg fCBncmVwIC1xICdCT09UX0lNQUdFPSc7IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBvcHRfa2VybmVsPSQoZWNobyAiJGtlcm5lbF9jbWRsaW5lIiB8IGdyZXAgLUVvCj4gJ0JP T1RfSU1BR0U9W14gXSsnIHwgY3V0IC1kPSAtZjIpCj4gKyvCoMKgwqDCoMKgwqBlbGlmIGVjaG8g IiRrZXJuZWxfY21kbGluZSIgfCBAZ3JlcEAgLXEgJ0JPT1RfSU1BR0U9JzsgdGhlbgo+ICsrwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG9wdF9rZXJuZWw9JChlY2hvICIka2VybmVsX2NtZGxp bmUiIHwgQGdyZXBAIC1Fbwo+ICdCT09UX0lNQUdFPVteIF0rJyB8IEBjdXRAIC1kPSAtZjIpCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAiZm91bmQgb3B0X2tlcm5lbD0k b3B0X2tlcm5lbCBpbgo+ICRwcm9jZnMvY21kbGluZSIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIyBpZiB0aGUgYm9vdCBwYXJ0aXRpb24gaXMgd2l0aGluIGEgYnRyZnMgc3Vidm9s dW1lLAo+IHN0cmlwIHRoZSBzdWJ2b2x1bWUgbmFtZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAjIGlmIC9ib290IGlzIGEgc2VwYXJhdGUgc3Vidm9sdW1lLCB0aGUgcmVtYWluZGVy IG9mCj4gdGhlIGNvZGUgaW4gdGhpcyBzZWN0aW9uIHNob3VsZCBoYW5kbGUgaXQKPiArLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBlY2hvICIkb3B0X2tlcm5lbCIgfCBncmVwIC1xICJe L0AiOyB0aGVuCj4gb3B0X2tlcm5lbD0kKGVjaG8gIiRvcHRfa2VybmVsIiB8IHNlZCAiczovQFte L10qOjoiKTsgZmkKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBlY2hvICIkb3B0 X2tlcm5lbCIgfCBAZ3JlcEAgLXEgIl4vQCI7IHRoZW4KPiBvcHRfa2VybmVsPSQoZWNobyAiJG9w dF9rZXJuZWwiIHwgQHNlZEAgInM6L0BbXi9dKjo6Iik7IGZpCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCMgaWYgd2UgaGF2ZSBhIGRlZGljYXRlZCAvYm9vdCBwYXJ0aXRpb24sIG91 cgo+IGJvb3Rsb2FkZXIgbWlnaHQgaGF2ZSBqdXN0IGNhbGxlZCBpdCAvCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCMgc28gdHJ5IHRvIHByZXBlbmQgL2Jvb3QgYW5kIHNlZSBpZiB3 ZSBmaW5kIGFueXRoaW5nCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgLWUgIi9i b290LyRvcHRfa2VybmVsIiBdICYmCj4gb3B0X2tlcm5lbD0iL2Jvb3QvJG9wdF9rZXJuZWwiCj4g K0BAIC0yMDc3LDcgKzIwNzcsNyBAQCBpZiBbICIkb3B0X2xpdmUiID0gMSBdOyB0aGVuCj4gK8Kg wqDCoMKgwqDCoMKgIyBpZiB3ZSBkaWRuJ3QgZmluZCBhIGtlcm5lbCwgZGVmYXVsdCB0byBndWVz c2luZwo+ICvCoMKgwqDCoMKgwqDCoGlmIFsgISAtZSAiJG9wdF9rZXJuZWwiIF07IHRoZW4KPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBGZWRvcmE6Cj4gKy3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgWyAtZSAiL2xpYi9tb2R1bGVzLyQodW5hbWUgLXIpL3ZtbGludXoiIF0g JiYKPiBvcHRfa2VybmVsPSIvbGliL21vZHVsZXMvJCh1bmFtZSAtcikvdm1saW51eiIKPiArK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC1lICIvbGliL21vZHVsZXMvJChAdW5hbWVAIC1y KS92bWxpbnV6IiBdICYmCj4gb3B0X2tlcm5lbD0iL2xpYi9tb2R1bGVzLyQoQHVuYW1lQCAtcikv dm1saW51eiIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBTbGFja3dhcmU6Cj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgLWUgIi9ib290L3ZtbGludXoiwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIF0gJiYKPiBvcHRfa2VybmVsPSIvYm9vdC92bWxpbnV6Igo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIEFyY2ggYWFyY2g2NDoKPiArQEAgLTIwOTEs MjQgKzIwOTEsMjQgQEAgaWYgWyAiJG9wdF9saXZlIiA9IDEgXTsgdGhlbgo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAjIHBpbmU2NAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBbIC1lICIvYm9vdC9waW5lNjQvSW1hZ2UiwqDCoMKgwqDCoMKgwqAgXSAmJgo+IG9wdF9r ZXJuZWw9Ii9ib290L3BpbmU2NC9JbWFnZSIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIyBnZW5lcmljOgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgLWUgIi9ib290 L3ZtbGludXotJCh1bmFtZSAtcikiIF0gJiYKPiBvcHRfa2VybmVsPSIvYm9vdC92bWxpbnV6LSQo dW5hbWUgLXIpIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgLWUgIi9ib290L2tl cm5lbC0kKCB1bmFtZSAtcikiIF0gJiYKPiBvcHRfa2VybmVsPSIvYm9vdC9rZXJuZWwtJCggdW5h bWUgLXIpIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgLWUgIi9ib290L2J6SW1h Z2UtJCh1bmFtZSAtcikiIF0gJiYKPiBvcHRfa2VybmVsPSIvYm9vdC9iekltYWdlLSQodW5hbWUg LXIpIgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgLWUgIi9ib290L3ZtbGludXot JChAdW5hbWVAIC1yKSIgXSAmJgo+IG9wdF9rZXJuZWw9Ii9ib290L3ZtbGludXotJChAdW5hbWVA IC1yKSIKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC1lICIvYm9vdC9rZXJuZWwt JCggQHVuYW1lQCAtcikiIF0gJiYKPiBvcHRfa2VybmVsPSIvYm9vdC9rZXJuZWwtJCggQHVuYW1l QCAtcikiCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgWyAtZSAiL2Jvb3QvYnpJbWFn ZS0kKEB1bmFtZUAgLXIpIiBdICYmCj4gb3B0X2tlcm5lbD0iL2Jvb3QvYnpJbWFnZS0kKEB1bmFt ZUAgLXIpIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIEdlbnRvbzoKPiArLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC1lICIvYm9vdC9rZXJuZWwtZ2Vua2VybmVsLSQo dW5hbWUgLW0pLSQodW5hbWUgLXIpIgo+IF0gJiYgb3B0X2tlcm5lbD0iL2Jvb3Qva2VybmVsLWdl bmtlcm5lbC0kKHVuYW1lIC1tKS0kKHVuYW1lIC1yKSIKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBbIC1lICIvYm9vdC9rZXJuZWwtZ2Vua2VybmVsLSQoQHVuYW1lQCAtbSktJChAdW5h bWVACj4gLXIpIiBdICYmIG9wdF9rZXJuZWw9Ii9ib290L2tlcm5lbC1nZW5rZXJuZWwtJChAdW5h bWVAIC1tKS0kKEB1bmFtZUAKPiAtcikiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCMgTml4T1M6Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgLWUgIi9ydW4vYm9v dGVkLXN5c3RlbS9rZXJuZWwiIF0gJiYKPiBvcHRfa2VybmVsPSIvcnVuL2Jvb3RlZC1zeXN0ZW0v a2VybmVsIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIEd1aXggU3lzdGVtOgo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC1lICIvcnVuL2Jvb3RlZC1zeXN0ZW0v a2VybmVsL2J6SW1hZ2UiIF0gJiYKPiBvcHRfa2VybmVsPSIvcnVuL2Jvb3RlZC1zeXN0ZW0va2Vy bmVsL2J6SW1hZ2UiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgc3lzdGVtZCBr ZXJuZWwtaW5zdGFsbDoKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC1lICIvZXRj L21hY2hpbmUtaWQiIF0gJiYgWyAtZSAiL2Jvb3QvJChjYXQKPiAvZXRjL21hY2hpbmUtaWQpLyQo dW5hbWUgLXIpL2xpbnV4IiBdICYmIG9wdF9rZXJuZWw9Ii9ib290LyQoY2F0Cj4gL2V0Yy9tYWNo aW5lLWlkKS8kKHVuYW1lIC1yKS9saW51eCIKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBbIC1lICIvZXRjL21hY2hpbmUtaWQiIF0gJiYgWyAtZSAiL2Jvb3QvJChAY2F0QAo+IC9ldGMv bWFjaGluZS1pZCkvJChAdW5hbWVAIC1yKS9saW51eCIgXSAmJiBvcHRfa2VybmVsPSIvYm9vdC8k KEBjYXRACj4gL2V0Yy9tYWNoaW5lLWlkKS8kKEB1bmFtZUAgLXIpL2xpbnV4Igo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIENsZWFyIExpbnV4Ogo+ICstwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHN0cl91bmFtZT0kKHVuYW1lIC1yKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoHN0cl91bmFtZT0kKEB1bmFtZUAgLXIpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGNsZWFyX2xpbnV4X2tlcm5lbD0iL2xpYi9rZXJuZWwvb3JnLmNsZWFybGludXgu JHtzdHJfCj4gdW5hbWUjIyoufS4ke3N0cl91bmFtZSUuKn0iCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoFsgLWUgIiRjbGVhcl9saW51eF9rZXJuZWwiIF0gJiYKPiBvcHRfa2VybmVs PSRjbGVhcl9saW51eF9rZXJuZWwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBD dXN0b20gQXJjaCBzZWVtcyB0byBoYXZlIHRoZSBrZXJuZWwgcGF0aCBpbiBpdHMKPiBjbWRsaW5l IGluIHRoZSBmb3JtICJcZGlyZWN0b3J5XGtlcm5lbGltYWdlIiwKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIyB3aXRoIGFjdHVhbCBcJ3MgaW5zdGVhZCBvZiAvJ3M6Cj4gKy3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY3VzdG9tX2FyY2hfa2VybmVsPSQoZWNobyAiJGtlcm5l bF9jbWRsaW5lIiB8IGdyZXAgLQo+IEVvICIoXnxccylcXFxcW1xcXFxhLXpBLVowLTlfLi1dKyIg fCB0ciAiXFxcXCIgIi8iIHwgdHIgLWQKPiAnWzpzcGFjZTpdJykKPiArK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBjdXN0b21fYXJjaF9rZXJuZWw9JChlY2hvICIka2VybmVsX2NtZGxpbmUi IHwgQGdyZXBACj4gLUVvICIoXnxccylcXFxcW1xcXFxhLXpBLVowLTlfLi1dKyIgfCBAdHJAICJc XFxcIiAiLyIgfCBAdHJAIC1kCj4gJ1s6c3BhY2U6XScpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGlmIFsgLW4gIiRjdXN0b21fYXJjaF9rZXJuZWwiIF0gJiYgWyAtZQo+ICIkY3Vz dG9tX2FyY2hfa2VybmVsIiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBvcHRfa2VybmVsPSIkY3VzdG9tX2FyY2hfa2VybmVsIgo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ICtAQCAtMjEyMiwxMiArMjEyMiwxMiBAQCBp ZiBbICIkb3B0X2xpdmUiID0gMSBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoDoKPiArwqDCoMKgwqDCoMKgwqBlbGlmIFsgLWUgIiRwcm9jZnMva2FsbHN5bXMiIF0gOyB0 aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG9wdF9tYXA9IiRwcm9jZnMva2Fs bHN5bXMiCj4gKy3CoMKgwqDCoMKgwqBlbGlmIFsgLWUgIi9saWIvbW9kdWxlcy8kKHVuYW1lIC1y KS9TeXN0ZW0ubWFwIiBdIDsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG9w dF9tYXA9Ii9saWIvbW9kdWxlcy8kKHVuYW1lIC1yKS9TeXN0ZW0ubWFwIgo+ICstwqDCoMKgwqDC oMKgZWxpZiBbIC1lICIvYm9vdC9TeXN0ZW0ubWFwLSQodW5hbWUgLXIpIiBdIDsgdGhlbgo+ICst wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG9wdF9tYXA9Ii9ib290L1N5c3RlbS5tYXAtJCh1 bmFtZSAtcikiCj4gKy3CoMKgwqDCoMKgwqBlbGlmIFsgLWUgIi9saWIva2VybmVsL1N5c3RlbS5t YXAtJCh1bmFtZSAtcikiIF07IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBv cHRfbWFwPSIvbGliL2tlcm5lbC9TeXN0ZW0ubWFwLSQodW5hbWUgLXIpIgo+ICsrwqDCoMKgwqDC oMKgZWxpZiBbIC1lICIvbGliL21vZHVsZXMvJChAdW5hbWVAIC1yKS9TeXN0ZW0ubWFwIiBdIDsg dGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG9wdF9tYXA9Ii9saWIvbW9kdWxl cy8kKEB1bmFtZUAgLXIpL1N5c3RlbS5tYXAiCj4gKyvCoMKgwqDCoMKgwqBlbGlmIFsgLWUgIi9i b290L1N5c3RlbS5tYXAtJChAdW5hbWVAIC1yKSIgXSA7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBvcHRfbWFwPSIvYm9vdC9TeXN0ZW0ubWFwLSQoQHVuYW1lQCAtcikiCj4g KyvCoMKgwqDCoMKgwqBlbGlmIFsgLWUgIi9saWIva2VybmVsL1N5c3RlbS5tYXAtJChAdW5hbWVA IC1yKSIgXTsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG9wdF9tYXA9Ii9s aWIva2VybmVsL1N5c3RlbS5tYXAtJChAdW5hbWVAIC1yKSIKPiArwqDCoMKgwqDCoMKgwqBmaQo+ ICsKPiArwqDCoMKgwqDCoMKgwqAjIGNvbmZpZwo+ICtAQCAtMjEzNSwxOCArMjEzNSwxOCBAQCBp ZiBbICIkb3B0X2xpdmUiID0gMSBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCMgc3BlY2lmaWVkIGJ5IHVzZXIgb24gY21kbGluZSwgd2l0aCAtLWxpdmUsIGRvbid0Cj4g b3ZlcnJpZGUKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgOgo+ICvCoMKgwqDCoMKg wqDCoGVsaWYgWyAtZSAiJHByb2Nmcy9jb25maWcuZ3oiIF0gOyB0aGVuCj4gKy3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgZHVtcGVkX2NvbmZpZz0iJChta3RlbXAgLXQgc21jLWNvbmZpZy1Y WFhYWFgpIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGd1bnppcCAtYyAiJHByb2Nm cy9jb25maWcuZ3oiID4gIiRkdW1wZWRfY29uZmlnIgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGR1bXBlZF9jb25maWc9IiQoQG1rdGVtcEAgLXQgc21jLWNvbmZpZy1YWFhYWFgpIgo+ ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoEBndW56aXBAIC1jICIkcHJvY2ZzL2NvbmZp Zy5neiIgPiAiJGR1bXBlZF9jb25maWciCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCMgZHVtcGVkX2NvbmZpZyB3aWxsIGJlIGRlbGV0ZWQgYXQgdGhlIGVuZCBvZiB0aGUKPiBzY3Jp cHQKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgb3B0X2NvbmZpZz0iJGR1bXBlZF9j b25maWciCj4gKy3CoMKgwqDCoMKgwqBlbGlmIFsgLWUgIi9saWIvbW9kdWxlcy8kKHVuYW1lIC1y KS9jb25maWciIF07IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBvcHRfY29u ZmlnPSIvbGliL21vZHVsZXMvJCh1bmFtZSAtcikvY29uZmlnIgo+ICstwqDCoMKgwqDCoMKgZWxp ZiBbIC1lICIvYm9vdC9jb25maWctJCh1bmFtZSAtcikiIF07IHRoZW4KPiArLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBvcHRfY29uZmlnPSIvYm9vdC9jb25maWctJCh1bmFtZSAtcikiCj4g Ky3CoMKgwqDCoMKgwqBlbGlmIFsgLWUgIi9ldGMva2VybmVscy9rZXJuZWwtY29uZmlnLSQodW5h bWUgLW0pLSQodW5hbWUgLQo+IHIpIiBdOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgb3B0X2NvbmZpZz0iL2V0Yy9rZXJuZWxzL2tlcm5lbC1jb25maWctJCh1bmFtZSAtbSkt Cj4gJCh1bmFtZSAtcikiCj4gKy3CoMKgwqDCoMKgwqBlbGlmIFsgLWUgIi9saWIva2VybmVsL2Nv bmZpZy0kKHVuYW1lIC1yKSIgXTsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oG9wdF9jb25maWc9Ii9saWIva2VybmVsL2NvbmZpZy0kKHVuYW1lIC1yKSIKPiArK8KgwqDCoMKg wqDCoGVsaWYgWyAtZSAiL2xpYi9tb2R1bGVzLyQoQHVuYW1lQCAtcikvY29uZmlnIiBdOyB0aGVu Cj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgb3B0X2NvbmZpZz0iL2xpYi9tb2R1bGVz LyQoQHVuYW1lQCAtcikvY29uZmlnIgo+ICsrwqDCoMKgwqDCoMKgZWxpZiBbIC1lICIvYm9vdC9j b25maWctJChAdW5hbWVAIC1yKSIgXTsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoG9wdF9jb25maWc9Ii9ib290L2NvbmZpZy0kKEB1bmFtZUAgLXIpIgo+ICsrwqDCoMKgwqDC oMKgZWxpZiBbIC1lICIvZXRjL2tlcm5lbHMva2VybmVsLWNvbmZpZy0kKEB1bmFtZUAgLW0pLSQo QHVuYW1lQAo+IC1yKSIgXTsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG9w dF9jb25maWc9Ii9ldGMva2VybmVscy9rZXJuZWwtY29uZmlnLSQoQHVuYW1lQCAtbSktCj4gJChA dW5hbWVAIC1yKSIKPiArK8KgwqDCoMKgwqDCoGVsaWYgWyAtZSAiL2xpYi9rZXJuZWwvY29uZmln LSQoQHVuYW1lQCAtcikiIF07IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBv cHRfY29uZmlnPSIvbGliL2tlcm5lbC9jb25maWctJChAdW5hbWVAIC1yKSIKPiArwqDCoMKgwqDC oMKgwqBmaQo+ICsgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoF9pbmZvICJDaGVja2luZyBmb3IgdnVs bmVyYWJpbGl0aWVzIGFnYWluc3Qgc3BlY2lmaWVkIGtlcm5lbCIKPiArQEAgLTIxNjEsNyArMjE2 MSw3IEBAIGVsc2UKPiArIGZpCj4gKwo+ICsgaWYgWyAiJG9zIiA9IExpbnV4IF07IHRoZW4KPiAr LcKgwqDCoMKgwqDCoGlmIFsgLW4gIiRvcHRfY29uZmlnIiBdICYmICEgZ3JlcCAtcSAnXkNPTkZJ R18nCj4gIiRvcHRfY29uZmlnIjsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgaWYgWyAtbiAiJG9wdF9j b25maWciIF0gJiYgISBAZ3JlcEAgLXEgJ15DT05GSUdfJwo+ICIkb3B0X2NvbmZpZyI7IHRoZW4K PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBnaXZlbiBmaWxlIGlzIGludmFsaWQh Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF93YXJuICJUaGUga2VybmVsIGNvbmZp ZyBmaWxlIHNlZW1zIGludmFsaWQsIHdhcwo+IGV4cGVjdGluZyBhIHBsYWluLXRleHQgZmlsZSwg aWdub3JpbmcgaXQhIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBvcHRfY29uZmln PScnCj4gK0BAIC0yMTg5LDcgKzIxODksNyBAQCBpZiBbICIkb3MiID0gTGludXggXTsgdGhlbgo+ ICsgZmkKPiArCj4gKyBpZiBbIC1lICIkb3B0X2tlcm5lbCIgXTsgdGhlbgo+ICstwqDCoMKgwqDC oMKgaWYgISBjb21tYW5kIC12ICIke29wdF9hcmNoX3ByZWZpeH1yZWFkZWxmIiA+L2Rldi9udWxs IDI+JjE7Cj4gdGhlbgo+ICsrwqDCoMKgwqDCoMKgaWYgISBjb21tYW5kIC12ICJAcmVhZGVsZkAi ID4vZGV2L251bGwgMj4mMTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBf ZGVidWcgInJlYWRlbGYgbm90IGZvdW5kIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBrZXJuZWxfZXJyPSJtaXNzaW5nICcke29wdF9hcmNoX3ByZWZpeH1yZWFkZWxmJyB0b29sLAo+ IHBsZWFzZSBpbnN0YWxsIGl0LCB1c3VhbGx5IGl0J3MgaW4gdGhlICdiaW51dGlscycgcGFja2Fn ZSIKPiArwqDCoMKgwqDCoMKgwqBlbGlmIFsgIiRvcHRfc3lzZnNfb25seSIgPSAxIF0gfHwgWyAi JG9wdF9od19vbmx5IiA9IDEgXTsKPiB0aGVuCj4gK0BAIC0yMjA3LDIwICsyMjA3LDIwIEBAIGVs c2UKPiArwqDCoMKgwqDCoMKgwqAjIHZhbmlsbGEga2VybmVscyBoYXZlIHdpdGggXkxpbnV4IHZl cnNpb24KPiArwqDCoMKgwqDCoMKgwqAjIGFsc28gdHJ5IGhhcmRlciB3aXRoIHNvbWUga2VybmVs cyAoc3VjaCBhcyBSZWQgSGF0KSB0aGF0Cj4gZG9uJ3QgaGF2ZSBeTGludXggdmVyc2lvbiBiZWZv cmUgdGhlaXIgdmVyc2lvbiBzdHJpbmcKPiArwqDCoMKgwqDCoMKgwqAjIGFuZCBjaGVjayBmb3Ig RnJlZUJTRAo+ICstwqDCoMKgwqDCoMKga2VybmVsX3ZlcnNpb249JCgiJHtvcHRfYXJjaF9wcmVm aXh9c3RyaW5ncyIgIiRrZXJuZWwiCj4gMj4vZGV2L251bGwgfCBncmVwIC1FIFwKPiArK8KgwqDC oMKgwqDCoGtlcm5lbF92ZXJzaW9uPSQoIkBzdHJpbmdzQCIgIiRrZXJuZWwiIDI+L2Rldi9udWxs IHwgQGdyZXBAIC0KPiBFIFwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLWUgJ15M aW51eCB2ZXJzaW9uICcgXAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAtZSAnXltb OmFsbnVtOl1dW15bOnNwYWNlOl1dKyBcKFteWzpzcGFjZTpdXStcKSAjWzAtCj4gOV0rIC4rICgx OXwyMClbMC05XVswLTldJCcgXAo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC1lICde RnJlZUJTRCBbMC05XScgfCBoZWFkIC0xKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oC1lICdeRnJlZUJTRCBbMC05XScgfCBAaGVhZEAgLTEpCj4gK8KgwqDCoMKgwqDCoMKgaWYgWyAt eiAiJGtlcm5lbF92ZXJzaW9uIiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCMgdHJ5IGV2ZW4gaGFyZGVyIHdpdGggc29tZSBrZXJuZWxzIChzdWNoIGFzIEFSTSkKPiB0 aGF0IHNwbGl0IHRoZSByZWxlYXNlICh1bmFtZSAtcikgYW5kIHZlcnNpb24gKHVuYW1lIC12KSBp biAyCj4gYWRqYWNlbnQgc3RyaW5ncwo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtl cm5lbF92ZXJzaW9uPSQoIiR7b3B0X2FyY2hfcHJlZml4fXN0cmluZ3MiCj4gIiRrZXJuZWwiIDI+ L2Rldi9udWxsIHwgZ3JlcCAtRSAtQjEgJ14jWzAtOV0rIC4rICgxOXwyMClbMC05XVswLTldJCcK PiB8IHRyICJcbiIgIiAiKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF92 ZXJzaW9uPSQoIkBzdHJpbmdzQCIgIiRrZXJuZWwiIDI+L2Rldi9udWxsIHwKPiBAZ3JlcEAgLUUg LUIxICdeI1swLTldKyAuKyAoMTl8MjApWzAtOV1bMC05XSQnIHwgQHRyQCAiXG4iICIgIikKPiAr wqDCoMKgwqDCoMKgwqBmaQo+ICvCoMKgwqDCoMKgwqDCoGlmIFsgLW4gIiRrZXJuZWxfdmVyc2lv biIgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIGluIGxpdmUgbW9k ZSwgY2hlY2sgaWYgdGhlIGltZyB3ZSBmb3VuZCBpcyB0aGUKPiBjb3JyZWN0IG9uZQo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICIkb3B0X2xpdmUiID0gMSBdOyB0aGVuCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfdmVyYm9zZSAi S2VybmVsIGltYWdlIGlzCj4gXDAzM1szNW0ka2VybmVsX3ZlcnNpb24iCj4gKy3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICEgZWNobyAiJGtlcm5lbF92ZXJz aW9uIiB8IGdyZXAgLXFGCj4gIiQodW5hbWUgLXIpIjsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX3dhcm4gIlBvc3Np YmxlIGRpc2NyZXBhbmN5IGJldHdlZW4KPiB5b3VyIHJ1bm5pbmcga2VybmVsICckKHVuYW1lIC1y KScgYW5kIHRoZSBpbWFnZSAnJGtlcm5lbF92ZXJzaW9uJyB3ZQo+IGZvdW5kICgkb3B0X2tlcm5l bCksIHJlc3VsdHMgbWlnaHQgYmUgaW5jb3JyZWN0Igo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAhIGVjaG8gIiRrZXJuZWxfdmVyc2lvbiIgfCBAZ3Jl cEAgLXFGCj4gIiQoQHVuYW1lQCAtcikiOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfd2FybiAiUG9zc2libGUgZGlz Y3JlcGFuY3kgYmV0d2Vlbgo+IHlvdXIgcnVubmluZyBrZXJuZWwgJyQoQHVuYW1lQCAtciknIGFu ZCB0aGUgaW1hZ2UgJyRrZXJuZWxfdmVyc2lvbicKPiB3ZSBmb3VuZCAoJG9wdF9rZXJuZWwpLCBy ZXN1bHRzIG1pZ2h0IGJlIGluY29ycmVjdCIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVs c2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9pbmZv ICJLZXJuZWwgaW1hZ2UgaXMKPiBcMDMzWzM1bSRrZXJuZWxfdmVyc2lvbiIKPiArQEAgLTIyNDgs MTEgKzIyNDgsMTEgQEAgc3lzX2ludGVyZmFjZV9jaGVjaygpCj4gK8KgwqDCoMKgwqDCoMKgaWYg WyAiJG9wdF9saXZlIiA9IDEgXSAmJiBbICIkb3B0X25vX3N5c2ZzIiA9IDAgXSAmJiBbIC1yCj4g IiRmaWxlIiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDoKPiArwqDC oMKgwqDCoMKgwqBlbHNlCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbW9ja21lPSQo cHJpbnRmICIlYlxuJWIiICIkbW9ja21lIgo+ICJTTUNfTU9DS19TWVNGU18kKGJhc2VuYW1lICIk ZmlsZSIpX1JFVD0xIikKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBtb2NrbWU9JChw cmludGYgIiViXG4lYiIgIiRtb2NrbWUiCj4gIlNNQ19NT0NLX1NZU0ZTXyQoQGJhc2VuYW1lQCAi JGZpbGUiKV9SRVQ9MSIpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAx Cj4gK8KgwqDCoMKgwqDCoMKgZmkKPiArCj4gKy3CoMKgwqDCoMKgwqBfbW9ja3Zhcm5hbWU9IlNN Q19NT0NLX1NZU0ZTXyQoYmFzZW5hbWUgIiRmaWxlIilfUkVUIgo+ICsrwqDCoMKgwqDCoMKgX21v Y2t2YXJuYW1lPSJTTUNfTU9DS19TWVNGU18kKEBiYXNlbmFtZUAgIiRmaWxlIilfUkVUIgo+ICvC oMKgwqDCoMKgwqDCoCMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjA4NixTQzEwODMKPiArwqDCoMKg wqDCoMKgwqBpZiBbIC1uICIkKGV2YWwgZWNobyBcJHskX21vY2t2YXJuYW1lOi19KSIgXTsgdGhl bgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgInN5c2ZzOiBNT0NLSU5H IGVuYWJsZWQgZm9yICRmaWxlIGZ1bmMgcmV0dXJucwo+ICQoZXZhbCBlY2hvIFwkJF9tb2NrdmFy bmFtZSkiCj4gK0BAIC0yMjYxLDE3ICsyMjYxLDE3IEBAIHN5c19pbnRlcmZhY2VfY2hlY2soKQo+ ICvCoMKgwqDCoMKgwqDCoGZpCj4gKwo+ICvCoMKgwqDCoMKgwqDCoFsgLW4gIiRyZWdleCIgXSB8 fCByZWdleD0nLionCj4gKy3CoMKgwqDCoMKgwqBfbW9ja3Zhcm5hbWU9IlNNQ19NT0NLX1NZU0ZT XyQoYmFzZW5hbWUgIiRmaWxlIikiCj4gKyvCoMKgwqDCoMKgwqBfbW9ja3Zhcm5hbWU9IlNNQ19N T0NLX1NZU0ZTXyQoQGJhc2VuYW1lQCAiJGZpbGUiKSIKPiArwqDCoMKgwqDCoMKgwqAjIHNoZWxs Y2hlY2sgZGlzYWJsZT1TQzIwODYsU0MxMDgzCj4gK8KgwqDCoMKgwqDCoMKgaWYgWyAtbiAiJChl dmFsIGVjaG8gXCR7JF9tb2NrdmFybmFtZTotfSkiIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZnVsbG1zZz0iJChldmFsIGVjaG8gXCQkX21vY2t2YXJuYW1lKSIKPiAr LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBtc2c9JChlY2hvICIkZnVsbG1zZyIgfCBncmVw IC1FbyAiJHJlZ2V4IikKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBtc2c9JChlY2hv ICIkZnVsbG1zZyIgfCBAZ3JlcEAgLUVvICIkcmVnZXgiKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBfZGVidWcgInN5c2ZzOiBNT0NLSU5HIGVuYWJsZWQgZm9yICRmaWxlLCB3aWxs IHJldHVybgo+ICRmdWxsbXNnIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBtb2Nr ZWQ9MQo+ICvCoMKgwqDCoMKgwqDCoGVsc2UKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBmdWxsbXNnPSQoY2F0ICIkZmlsZSIpCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg bXNnPSQoZ3JlcCAtRW8gIiRyZWdleCIgIiRmaWxlIikKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBtb2NrbWU9JChwcmludGYgIiViXG4lYiIgIiRtb2NrbWUiCj4gIlNNQ19NT0NLX1NZ U0ZTXyQoYmFzZW5hbWUgIiRmaWxlIik9JyRmdWxsbXNnJyIpCj4gKyvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgZnVsbG1zZz0kKEBjYXRAICIkZmlsZSIpCj4gKyvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgbXNnPSQoQGdyZXBAIC1FbyAiJHJlZ2V4IiAiJGZpbGUiKQo+ICsrwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1vY2ttZT0kKHByaW50ZiAiJWJcbiViIiAiJG1vY2ttZSIK PiAiU01DX01PQ0tfU1lTRlNfJChAYmFzZW5hbWVAICIkZmlsZSIpPSckZnVsbG1zZyciKQo+ICvC oMKgwqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgaWYgWyAiJG1vZGUiID0gc2lsZW50IF07 IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIDAKPiArQEAgLTIy ODAsMTUgKzIyODAsMTUgQEAgc3lzX2ludGVyZmFjZV9jaGVjaygpCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHJldHVybiAwCj4gK8KgwqDCoMKgwqDCoMKgZmkKPiArwqDCoMKgwqDC oMKgwqBfaW5mb19ub2wgIiogTWl0aWdhdGVkIGFjY29yZGluZyB0byB0aGUgL3N5cyBpbnRlcmZh Y2U6ICIKPiArLcKgwqDCoMKgwqDCoGlmIGVjaG8gIiRtc2ciIHwgZ3JlcCAtcWkgJ15ub3QgYWZm ZWN0ZWQnOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqBpZiBlY2hvICIkbXNnIiB8IEBncmVwQCAtcWkg J15ub3QgYWZmZWN0ZWQnOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMg Tm90IGFmZmVjdGVkCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0YXR1cz1PSwo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIGdyZWVuIFlFUyAiJGZ1bGxt c2ciCj4gKy3CoMKgwqDCoMKgwqBlbGlmIGVjaG8gIiRtc2ciIHwgZ3JlcCAtcUVpICdeKGt2bTog KT9taXRpZ2F0aW9uJzsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgZWxpZiBlY2hvICIkbXNnIiB8IEBn cmVwQCAtcUVpICdeKGt2bTogKT9taXRpZ2F0aW9uJzsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAjIE1pdGlnYXRpb246IFBUSQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBzdGF0dXM9T0sKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1 cyBncmVlbiBZRVMgIiRmdWxsbXNnIgo+ICstwqDCoMKgwqDCoMKgZWxpZiBlY2hvICIkbXNnIiB8 IGdyZXAgLXFpICdednVsbmVyYWJsZSc7IHRoZW4KPiArK8KgwqDCoMKgwqDCoGVsaWYgZWNobyAi JG1zZyIgfCBAZ3JlcEAgLXFpICdednVsbmVyYWJsZSc7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIyBWdWxuZXJhYmxlCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHN0YXR1cz1WVUxOCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMg eWVsbG93IE5PICIkZnVsbG1zZyIKPiArQEAgLTIzNzYsMjAgKzIzNzYsMjAgQEAgd3JpdGVfbXNy X29uZV9jb3JlKCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCMgcmV0PTQ6IG1zciBkb2Vzbid0IGV4aXN0LCByZXQ9MTI3Ogo+IG1zci5hbGxvd193cml0 ZXM9b2ZmCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBb ICIkcmV0IiA9IDEyNyBdICYmIF93cml0ZV9kZW5pZWQ9MQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAjIG9yIGZhbGxiYWNrIHRvIGRkIGlmIGl0IHN1cHBvcnRzIHNlZWtfYnl0ZXMs IHdlCj4gcHJlZmVyIGl0IG92ZXIgcGVybCBiZWNhdXNlIHdlIGNhbiB0ZWxsIHRoZSBkaWZmZXJl bmNlIGJldHdlZW4gRVBFUk0KPiBhbmQgRUlPCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgZWxpZiBkZCBpZj0vZGV2L251bGwgb2Y9L2Rldi9udWxsIGJzPTggY291bnQ9MQo+IHNlZWs9 IiRfbXNyX2RlYyIgb2ZsYWc9c2Vla19ieXRlcyAyPi9kZXYvbnVsbCAmJiBbICIke1NNQ19OT19E RDotfSIKPiAhPSAxIF07IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlm IEBkZEAgaWY9L2Rldi9udWxsIG9mPS9kZXYvbnVsbCBicz04IGNvdW50PTEKPiBzZWVrPSIkX21z cl9kZWMiIG9mbGFnPXNlZWtfYnl0ZXMgMj4vZGV2L251bGwgJiYgWyAiJHtTTUNfTk9fREQ6LX0i Cj4gIT0gMSBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBfZGVidWcgIndyaXRlX21zcjogdXNpbmcgZGQiCj4gKy3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRkIGlmPS9kZXYvemVybyBvZj0vZGV2L2NwdS8i JF9jb3JlIi9tc3IgYnM9OAo+IGNvdW50PTEgc2Vlaz0iJF9tc3JfZGVjIiBvZmxhZz1zZWVrX2J5 dGVzIDI+L2Rldi9udWxsOyByZXQ9JD8KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgQGRkQCBpZj0vZGV2L3plcm8gb2Y9L2Rldi9jcHUvIiRfY29yZSIvbXNy Cj4gYnM9OCBjb3VudD0xIHNlZWs9IiRfbXNyX2RlYyIgb2ZsYWc9c2Vla19ieXRlcyAyPi9kZXYv bnVsbDsgcmV0PSQ/Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAjIGlmIGl0IGZhaWxlZCwgaW5zcGVjdCBzdGRlcnJ0byBsb29rIGZvcgo+IEVQRVJNCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICIkcmV0 IiAhPSAwIF07IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGRkIGlmPS9kZXYvemVybwo+IG9mPS9kZXYvY3B1LyIk X2NvcmUiL21zciBicz04IGNvdW50PTEgc2Vlaz0iJF9tc3JfZGVjIgo+IG9mbGFnPXNlZWtfYnl0 ZXMgMj4mMSB8IGdyZXAgLXFGICdPcGVyYXRpb24gbm90IHBlcm1pdHRlZCc7IHRoZW4KPiArK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGlmIEBkZEAgaWY9L2Rldi96ZXJvCj4gb2Y9L2Rldi9jcHUvIiRfY29yZSIvbXNyIGJzPTggY291 bnQ9MSBzZWVrPSIkX21zcl9kZWMiCj4gb2ZsYWc9c2Vla19ieXRlcyAyPiYxIHwgQGdyZXBAIC1x RiAnT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQnOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oF93cml0ZV9kZW5pZWQ9MQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAj IG9yIGlmIHdlIGhhdmUgcGVybCwgdXNlIGl0LCBhbnkgNS54IHZlcnNpb24gd2lsbAo+IHdvcmsK PiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIGNvbW1hbmQgLXYgcGVybCA+L2Rl di9udWxsIDI+JjEgJiYgWwo+ICIke1NNQ19OT19QRVJMOi19IiAhPSAxIF07IHRoZW4KPiArK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIGNvbW1hbmQgLXYgQHBlcmxAID4vZGV2L251 bGwgMj4mMSAmJiBbCj4gIiR7U01DX05PX1BFUkw6LX0iICE9IDEgXTsgdGhlbgo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2RlYnVnICJ3cml0ZV9tc3I6 IHVzaW5nIHBlcmwiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqByZXQ9MQo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBwZXJsIC1lICJvcGVuKE0sJz4nLCcvZGV2L2NwdS8kX2NvcmUvbXNyJykKPiBhbmQgc2VlayhN LCRfbXNyX2RlYywwKSBhbmQgZXhpdChzeXN3cml0ZShNLHBhY2soJ0gxNicsMCkpKSI7IFsgJD8g LQo+IGVxIDggXSAmJiByZXQ9MAo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBAcGVybEAgLWUgIm9wZW4oTSwnPicsJy9kZXYvY3B1LyRfY29yZS9tc3InKQo+ IGFuZCBzZWVrKE0sJF9tc3JfZGVjLDApIGFuZCBleGl0KHN5c3dyaXRlKE0scGFjaygnSDE2Jyww KSkpIjsgWyAkPyAtCj4gZXEgOCBdICYmIHJldD0wCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoF9kZWJ1ZyAid3JpdGVfbXNyOiBnb3Qgbm8gd3Jtc3IsIHBlcmwgb3IKPiByZWNlbnQgZW5v dWdoIGRkISIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oG1vY2ttZT0kKHByaW50ZiAiJWJcbiViIiAiJG1vY2ttZSIKPiAiU01DX01PQ0tfV1JNU1JfJHtf bXNyfV9SRVQ9JFdSSVRFX01TUl9SRVRfRVJSIikKPiArQEAgLTI0MTEsMTMgKzI0MTEsMTMgQEAg d3JpdGVfbXNyX29uZV9jb3JlKCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBtc3JfbG9ja2VkX2Rvd249MQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHdy aXRlX21zcl9tc2c9InlvdXIga2VybmVsIGlzCj4gY29uZmlndXJlZCB0byBkZW55IHdyaXRlcyB0 byBNU1JzIGZyb20gdXNlciBzcGFjZSIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gJFdSSVRFX01TUl9SRVRfTE9D S0RPV04KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxp ZiBkbWVzZyB8IGdyZXAgLXFGICJtc3I6IERpcmVjdCBhY2Nlc3MgdG8KPiBNU1IiOyB0aGVuCj4g KyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgQGRtZXNn QCB8IEBncmVwQCAtcUYgIm1zcjogRGlyZWN0IGFjY2Vzcwo+IHRvIE1TUiI7IHRoZW4KPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBfZGVidWcgIndyaXRlX21zcjogbG9ja2VkIGRvd24ga2VybmVsCj4gZGV0ZWN0ZWQgKFJlZCBI YXQgLyBGZWRvcmEpIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1vY2ttZT0kKHByaW50ZiAiJWJcbiViIiAiJG1vY2ttZSIK PiAiU01DX01PQ0tfV1JNU1JfJHtfbXNyfV9SRVQ9JFdSSVRFX01TUl9SRVRfTE9DS0RPV04iKQo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoG1zcl9sb2NrZWRfZG93bj0xCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgd3JpdGVfbXNyX21zZz0ieW91ciBrZXJu ZWwgaXMgbG9ja2VkCj4gZG93biAoRmVkb3JhL1JlZCBIYXQpLCBwbGVhc2UgcmVib290IHdpdGhv dXQgc2VjdXJlIGJvb3QgYW5kIHJldHJ5Igo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAkV1JJVEVfTVNSX1JFVF9M T0NLRE9XTgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBl bGlmIGRtZXNnIHwgZ3JlcCAtcUYgInJhdyBNU1IgYWNjZXNzIGlzCj4gcmVzdHJpY3RlZCI7IHRo ZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiBA ZG1lc2dAIHwgQGdyZXBAIC1xRiAicmF3IE1TUiBhY2Nlc3MgaXMKPiByZXN0cmljdGVkIjsgdGhl bgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoF9kZWJ1ZyAid3JpdGVfbXNyOiBsb2NrZWQgZG93biBrZXJuZWwKPiBkZXRlY3Rl ZCAodmFuaWxsYSkiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgbW9ja21lPSQocHJpbnRmICIlYlxuJWIiICIkbW9ja21lIgo+ ICJTTUNfTU9DS19XUk1TUl8ke19tc3J9X1JFVD0kV1JJVEVfTVNSX1JFVF9MT0NLRE9XTiIpCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgbXNyX2xvY2tlZF9kb3duPTEKPiArQEAgLTI1MTYsOCArMjUxNiw4IEBAIHJlYWRfbXNy X29uZV9jb3JlKCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHJldHVybiAkUkVBRF9NU1JfUkVUX0tPCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgTVNSIDB4MTA6IDB4MDAw MDAzZTEgMHhiMTA2ZGRlZAo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9tc3JfaD0k KGVjaG8gIiRfbXNyIiB8IGF3ayAne3ByaW50ICQzfScpOwo+ICstwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoF9tc3JfbD0kKGVjaG8gIiRfbXNyIiB8IGF3ayAne3ByaW50ICQ0fScpOwo+ICsr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9tc3JfaD0kKGVjaG8gIiRfbXNyIiB8IEBhd2tA ICd7cHJpbnQgJDN9Jyk7Cj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX21zcl9sPSQo ZWNobyAiJF9tc3IiIHwgQGF3a0AgJ3twcmludCAkNH0nKTsKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgcmVhZF9tc3JfdmFsdWU9JCgoIF9tc3JfaCA8PCAzMiB8IF9tc3JfbCApKQo+ ICvCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBm b3IgTGludXgKPiArQEAgLTI1MjgsMTUgKzI1MjgsMTUgQEAgcmVhZF9tc3Jfb25lX2NvcmUoKQo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIGlmIHJkbXNyIGlzIGF2YWlsYWJsZSwg dXNlIGl0Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgY29tbWFuZCAtdiBy ZG1zciA+L2Rldi9udWxsIDI+JjEgJiYgWwo+ICIke1NNQ19OT19SRE1TUjotfSIgIT0gMSBdOyB0 aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVi dWcgInJlYWRfbXNyOiB1c2luZyByZG1zciBvbiAkX21zciIKPiArLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmVhZF9tc3JfdmFsdWU9JChyZG1zciAtciAkX21z cl9kZWMKPiAyPi9kZXYvbnVsbCB8IG9kIC10IHU4IC1BIG4pCj4gKyvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJlYWRfbXNyX3ZhbHVlPSQocmRtc3IgLXIgJF9t c3JfZGVjCj4gMj4vZGV2L251bGwgfCBAb2RAIC10IHU4IC1BIG4pCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCMgb3IgaWYgd2UgaGF2ZSBwZXJsLCB1c2UgaXQsIGFueSA1LnggdmVy c2lvbiB3aWxsCj4gd29yawo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgY29t bWFuZCAtdiBwZXJsID4vZGV2L251bGwgMj4mMSAmJiBbCj4gIiR7U01DX05PX1BFUkw6LX0iICE9 IDEgXTsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgY29tbWFuZCAt diBAcGVybEAgPi9kZXYvbnVsbCAyPiYxICYmIFsKPiAiJHtTTUNfTk9fUEVSTDotfSIgIT0gMSBd OyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBf ZGVidWcgInJlYWRfbXNyOiB1c2luZyBwZXJsIG9uICRfbXNyIgo+ICstwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZWFkX21zcl92YWx1ZT0kKHBlcmwgLWUKPiAi b3BlbihNLCc8JywnL2Rldi9jcHUvJF9jb3JlL21zcicpIGFuZCBzZWVrKE0sJF9tc3JfZGVjLDAp IGFuZAo+IHJlYWQoTSxcJF8sOCkgYW5kIHByaW50IiB8IG9kIC10IHU4IC1BIG4pCj4gKyvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJlYWRfbXNyX3ZhbHVlPSQo QHBlcmxAIC1lCj4gIm9wZW4oTSwnPCcsJy9kZXYvY3B1LyRfY29yZS9tc3InKSBhbmQgc2VlayhN LCRfbXNyX2RlYywwKSBhbmQKPiByZWFkKE0sXCRfLDgpIGFuZCBwcmludCIgfCBAb2RAIC10IHU4 IC1BIG4pCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgZmFsbGJhY2sgdG8gZGQg aWYgaXQgc3VwcG9ydHMgc2tpcF9ieXRlcwo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGVsaWYgZGQgaWY9L2Rldi9udWxsIG9mPS9kZXYvbnVsbCBicz04IGNvdW50PTEKPiBza2lwPSIk X21zcl9kZWMiIGlmbGFnPXNraXBfYnl0ZXMgMj4vZGV2L251bGw7IHRoZW4KPiArK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIEBkZEAgaWY9L2Rldi9udWxsIG9mPS9kZXYvbnVsbCBi cz04IGNvdW50PTEKPiBza2lwPSIkX21zcl9kZWMiIGlmbGFnPXNraXBfYnl0ZXMgMj4vZGV2L251 bGw7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oF9kZWJ1ZyAicmVhZF9tc3I6IHVzaW5nIGRkIG9uICRfbXNyIgo+ICstwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZWFkX21zcl92YWx1ZT0kKGRkIGlmPS9kZXYv Y3B1LyIkX2NvcmUiL21zcgo+IGJzPTggY291bnQ9MSBza2lwPSIkX21zcl9kZWMiIGlmbGFnPXNr aXBfYnl0ZXMgMj4vZGV2L251bGwgfCBvZCAtdCB1OAo+IC1BIG4pCj4gKyvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJlYWRfbXNyX3ZhbHVlPSQoQGRkQAo+IGlm PS9kZXYvY3B1LyIkX2NvcmUiL21zciBicz04IGNvdW50PTEgc2tpcD0iJF9tc3JfZGVjIgo+IGlm bGFnPXNraXBfYnl0ZXMgMj4vZGV2L251bGwgfCBAb2RAIC10IHU4IC1BIG4pCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAicmVhZF9tc3I6IGdvdCBubyByZG1zciwgcGVybCBv cgo+IHJlY2VudCBlbm91Z2ggZGQhIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgbW9ja21lPSQocHJpbnRmICIlYlxuJWIiICIkbW9ja21lIgo+ICJTTUNf TU9DS19SRE1TUl8ke19tc3J9X1JFVD0kUkVBRF9NU1JfUkVUX0VSUiIpCj4gK0BAIC0yNTYwLDcg KzI1NjAsNyBAQCBjaGVja19jcHUoKQo+ICsgewo+ICvCoMKgwqDCoMKgwqDCoF9pbmZvICJcMDMz WzE7MzRtSGFyZHdhcmUgY2hlY2tcMDMzWzBtIgo+ICsKPiArLcKgwqDCoMKgwqDCoGlmICEgdW5h bWUgLW0gfCBncmVwIC1xd0UgJ3g4Nl82NHxpWzMtNl04NnxhbWQ2NCc7IHRoZW4KPiArK8KgwqDC oMKgwqDCoGlmICEgQHVuYW1lQCAtbSB8IEBncmVwQCAtcXdFICd4ODZfNjR8aVszLTZdODZ8YW1k NjQnOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybgo+ICvCoMKg wqDCoMKgwqDCoGZpCj4gKwo+ICtAQCAtMzE3NiwxOSArMzE3NiwxOSBAQCBjaGVja19yZWRoYXRf Y2Fub25pY2FsX3NwZWN0cmUoKQo+ICvCoMKgwqDCoMKgwqDCoCMgaWYgd2Ugd2VyZSBhbHJlYWR5 IGNhbGxlZCwgZG9uJ3QgZG8gaXQgYWdhaW4KPiArwqDCoMKgwqDCoMKgwqBbIC1uICIke3JlZGhh dF9jYW5vbmljYWxfc3BlY3RyZTotfSIgXSAmJiByZXR1cm4KPiArCj4gKy3CoMKgwqDCoMKgwqBp ZiAhIGNvbW1hbmQgLXYgIiR7b3B0X2FyY2hfcHJlZml4fXN0cmluZ3MiID4vZGV2L251bGwgMj4m MTsKPiB0aGVuCj4gKyvCoMKgwqDCoMKgwqBpZiAhIGNvbW1hbmQgLXYgIkBzdHJpbmdzQCIgPi9k ZXYvbnVsbCAyPiYxOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJlZGhh dF9jYW5vbmljYWxfc3BlY3RyZT0tMQo+ICvCoMKgwqDCoMKgwqDCoGVsaWYgWyAtbiAiJGtlcm5l bF9lcnIiIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmVkaGF0X2Nh bm9uaWNhbF9zcGVjdHJlPS0yCj4gK8KgwqDCoMKgwqDCoMKgZWxzZQo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAjIFJlZCBIYXQgLyBVYnVudHUgc3BlY2lmaWMgdmFyaWFudDEgcGF0 Y2ggaXMKPiBkaWZmaWN1bHQgdG8gZGV0ZWN0LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAjIGxldCdzIHVzZSB0aGUgdHdvIHNhbWUgdHJpY2tzIHRoYW4gdGhlIG9mZmljaWFsIFJl ZAo+IEhhdCBkZXRlY3Rpb24gc2NyaXB0IHVzZXM6Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgaWYgIiR7b3B0X2FyY2hfcHJlZml4fXN0cmluZ3MiICIka2VybmVsIiB8IGdyZXAgLXF3 Cj4gbm9pYnJzICYmICIke29wdF9hcmNoX3ByZWZpeH1zdHJpbmdzIiAiJGtlcm5lbCIgfCBncmVw IC1xdyBub2licGI7Cj4gdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICJA c3RyaW5nc0AiICIka2VybmVsIiB8IEBncmVwQCAtcXcgbm9pYnJzICYmCj4gIkBzdHJpbmdzQCIg IiRrZXJuZWwiIHwgQGdyZXBAIC1xdyBub2licGI7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgMSkgZGV0ZWN0IHRoZWlyIHNwZWNpZmljIHZh cmlhbnQyIHBhdGNoLiBJZgo+IGl0J3MgcHJlc2VudCwgaXQgbWVhbnMKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgdGhhdCB0aGUgdmFyaWFudDEgcGF0 Y2ggaXMgYWxzbyBwcmVzZW50Cj4gKGJvdGggd2VyZSBtZXJnZWQgYXQgdGhlIHNhbWUgdGltZSkK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAi Zm91bmQgcmVkaGF0L2Nhbm9uaWNhbCB2ZXJzaW9uIG9mIHRoZQo+IHZhcmlhbnQyIHBhdGNoIChp bXBsaWVzIHZhcmlhbnQxKSIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoHJlZGhhdF9jYW5vbmljYWxfc3BlY3RyZT0xCj4gKy3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgZWxpZiAiJHtvcHRfYXJjaF9wcmVmaXh9c3RyaW5ncyIgIiRrZXJuZWwiIHwg Z3JlcCAtcQo+ICd4ODYvcHRpOic7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBlbGlmICJAc3RyaW5nc0AiICIka2VybmVsIiB8IEBncmVwQCAtcSAneDg2L3B0aTonOwo+IHRo ZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgMikg ZGV0ZWN0IHRoZWlyIHNwZWNpZmljIHZhcmlhbnQzIHBhdGNoLiBJZgo+IGl0J3MgcHJlc2VudCwg YnV0IHRoZSB2YXJpYW50Mgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIyBpcyBub3QsIGl0IG1lYW5zIHRoYXQgb25seSB2YXJpYW50MSBpcwo+IHByZXNl bnQgaW4gYWRkaXRpb24gdG8gdmFyaWFudDMKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAiZm91bmQgcmVkaGF0L2Nhbm9uaWNhbCB2ZXJzaW9u IG9mIHRoZQo+IHZhcmlhbnQzIHBhdGNoIChpbXBsaWVzIHZhcmlhbnQxIGJ1dCBub3QgdmFyaWFu dDIpIgo+ICtAQCAtMzIxMywxMyArMzIxMywxMyBAQCBjaGVja19oYXNfdm1tKCkKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBJZiB3ZSBmaW5kIG5vIGV2aWRlbmNlIHRoYXQgdGhp cyBpcyB0aGUgY2FzZSwKPiBhc3N1bWUgd2UncmUgbm90ICh0byBhdm9pZCBzY2FyaW5nIHVzZXJz KSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyB0aGlzIGNhbiBhbHdheXMgYmUg b3ZlcnJpZGRlbiB3aXRoIC0tdm1tIGluIGFueQo+IGNhc2UuCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGhhc192bW09MAo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlm IGNvbW1hbmQgLXYgcGdyZXAgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgaWYgY29tbWFuZCAtdiBAcGdyZXBAID4vZGV2L251bGwgMj4mMTsgdGhl bgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyByZW1v dmUgeGVuYnVzIGFuZCB4ZW53YXRjaCwgYWxzbyBwcmVzZW50Cj4gaW5zaWRlIGRvbVUKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgcmVtb3ZlIGxpYnZp cnRkIGFzIGl0IGNhbiBhbHNvIGJlIHVzZWQgdG8KPiBtYW5hZ2UgY29udGFpbmVycyBhbmQgbm90 IFZNcwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBm b3IgZWFjaCBiaW5hcnkgd2Ugd2FudCB0byBncmVwLCBnZXQgdGhlCj4gcGlkcwo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZm9yIF9iaW5hcnkgaW4gcWVt dSBrdm0geGVuc3RvcmVkIHhlbmNvbnNvbGVkCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBkbwo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZm9yIF9waWQgaW4gJChwZ3JlcCAteCAkX2Jp bmFyeSkKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGZvciBfcGlkIGluICQoQHBncmVwQCAteCAkX2JpbmFyeSkKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBk bwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIHJlc29sdmUgdGhlIGV4ZSBzeW1saW5rLCBpZgo+ IGl0IGRvZXNuJ3QgcmVzb2x2ZSB3aXRoIC1tLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIHdo aWNoIGRvZXNuJ3QgZXZlbiBuZWVkIHRoZQo+IGRlc3QgdG8gZXhpc3QsIGl0IG1lYW5zIHRoZSBz eW1saW5rCj4gK0BAIC0zMjM1LDcgKzMyMzUsNyBAQCBjaGVja19oYXNfdm1tKCkKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBpZ25vcmUgU0MyMDA5IGFzIGBwcyBheGAgaXMgYWN0dWFs bHkgdXNlZAo+IGFzIGEgZmFsbGJhY2sgaWYgYHBncmVwYCBpc24ndCBpbnN0YWxsZWQKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgc2hlbGxjaGVjayBk aXNhYmxlPVNDMjAwOQo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBpZiBjb21tYW5kIC12IHBzID4vZGV2bnVsbCAmJiBwcyBheCB8IGdyZXAgLQo+IHZ3IGdy ZXAgfCBncmVwIC1xIC1lICdcPHFlbXUnIC1lICcvcWVtdScgLWUgJzxca3ZtJyAtZSAnL2t2bScg LWUKPiAnL3hlbnN0b3JlZCcgLWUgJy94ZW5jb25zb2xlZCc7IHRoZW4KPiArK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgY29tbWFuZCAtdiBwcyA+L2Rldm51 bGwgJiYgcHMgYXggfCBAZ3JlcEAKPiAtdncgZ3JlcCB8IEBncmVwQCAtcSAtZSAnXDxxZW11JyAt ZSAnL3FlbXUnIC1lICc8XGt2bScgLWUgJy9rdm0nIC1lCj4gJy94ZW5zdG9yZWQnIC1lICcveGVu Y29uc29sZWQnOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFzX3ZtbT0xCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBmaQo+ICtAQCAtMzI2Nyw3ICszMjY3LDcgQEAgY2hlY2tfQ1ZFXzIwMTdfNTc1MygpCj4g K8KgwqDCoMKgwqDCoMKgX2luZm8gIlwwMzNbMTszNG0kY3ZlIGFrYSAnJChjdmUybmFtZSAiJGN2 ZSIpJ1wwMzNbMG0iCj4gK8KgwqDCoMKgwqDCoMKgaWYgWyAiJG9zIiA9IExpbnV4IF07IHRoZW4K PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY2hlY2tfQ1ZFXzIwMTdfNTc1M19saW51 eAo+ICstwqDCoMKgwqDCoMKgZWxpZiBlY2hvICIkb3MiIHwgZ3JlcCAtcSBCU0Q7IHRoZW4KPiAr K8KgwqDCoMKgwqDCoGVsaWYgZWNobyAiJG9zIiB8IEBncmVwQCAtcSBCU0Q7IHRoZW4KPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY2hlY2tfQ1ZFXzIwMTdfNTc1M19ic2QKPiArwqDC oMKgwqDCoMKgwqBlbHNlCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF93YXJuICJV bnN1cHBvcnRlZCBPUyAoJG9zKSIKPiArQEAgLTMzMTksMjAgKzMzMTksMjAgQEAgY2hlY2tfQ1ZF XzIwMTdfNTc1M19saW51eCgpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHYxX21h c2tfbm9zcGVjPScnCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLW4gIiRr ZXJuZWxfZXJyIiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBwc3RhdHVzIHllbGxvdyBVTktOT1dOICJjb3VsZG4ndCBjaGVjawo+ICgka2Vy bmVsX2VycikiCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiAhIGNvbW1hbmQg LXYgcGVybCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBlbGlmICEgY29tbWFuZCAtdiBAcGVybEAgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIHllbGxv dyBVTktOT1dOICJtaXNzaW5nICdwZXJsJwo+IGJpbmFyeSwgcGxlYXNlIGluc3RhbGwgaXQiCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcGVybCAtbmUKPiAnL1x4MGZceDgzLi4uLlx4NDhc eDE5XHhkMlx4NDhceDIxXHhkMC8gYW5kICRmb3VuZCsrOyBFTkQgewo+IGV4aXQoJGZvdW5kKSB9 JyAiJGtlcm5lbCI7IHJldD0kPwo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBAcGVybEAgLW5lCj4gJy9ceDBmXHg4My4uLi5ceDQ4XHgxOVx4ZDJceDQ4XHgy MVx4ZDAvIGFuZCAkZm91bmQrKzsgRU5EIHsKPiBleGl0KCRmb3VuZCkgfScgIiRrZXJuZWwiOyBy ZXQ9JD8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlm IFsgJHJldCAtZ3QgMCBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyBncmVlbiBZRVMgIiRyZXQgb2Nj dXJyZW5jZShzKQo+IGZvdW5kIG9mIHg4NiA2NCBiaXRzIGFycmF5X2luZGV4X21hc2tfbm9zcGVj KCkiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgdjFfbWFza19ub3NwZWM9Ing4NiA2NCBiaXRzCj4gYXJyYXlfaW5kZXhfbWFz a19ub3NwZWMiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBlbHNlCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBwZXJsIC1uZQo+ICcvXHgzYlx4ODIuLlx4MDBceDAwXHg3My5ceDE5XHhk Mlx4MjFceGQwLyBhbmQgJGZvdW5kKys7IEVORCB7Cj4gZXhpdCgkZm91bmQpIH0nICIka2VybmVs IjsgcmV0PSQ/Cj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBAcGVybEAgLW5lCj4gJy9ceDNiXHg4Mi4uXHgwMFx4MDBceDczLlx4 MTlceGQyXHgyMVx4ZDAvIGFuZCAkZm91bmQrKzsgRU5EIHsKPiBleGl0KCRmb3VuZCkgfScgIiRr ZXJuZWwiOyByZXQ9JD8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICRyZXQgLWd0IDAgXTsgdGhlbgo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBwc3RhdHVzIGdyZWVuIFlFUyAiJHJldAo+IG9jY3VycmVuY2UocykgZm91 bmQgb2YgeDg2IDMyIGJpdHMgYXJyYXlfaW5kZXhfbWFza19ub3NwZWMoKSIKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgdjFfbWFza19ub3NwZWM9Ing4NiAzMiBiaXRzCj4gYXJyYXlfaW5kZXhfbWFz a19ub3NwZWMiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgZWxzZQo+ICstCj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldD0kKCIk e29wdF9hcmNoX3ByZWZpeH1vYmpkdW0KPiBwIiAkb2JqZHVtcF9vcHRpb25zICIka2VybmVsIiB8 IGdyZXAgLXcgLWUgZjNhZjgwMTQgLWUgZTMyMGYwMTQgLUIyIHwKPiBncmVwIC1CMSAtdyBzYmMg fCBncmVwIC13IC1jIGNtcCkKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQ9JCgiQG9iamR1bXBA Igo+ICRvYmpkdW1wX29wdGlvbnMgIiRrZXJuZWwiIHwgQGdyZXBAIC13IC1lIGYzYWY4MDE0IC1l IGUzMjBmMDE0IC1CMiB8Cj4gQGdyZXBAIC1CMSAtdyBzYmMgfCBAZ3JlcEAgLXcgLWMgY21wKQo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICIkcmV0IiAtZ3QgMCBdOyB0aGVuCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIGdyZWVuIFlFUwo+ICIkcmV0 IG9jY3VycmVuY2UocykgZm91bmQgb2YgYXJtIDMyIGJpdHMgYXJyYXlfaW5kZXhfbWFza19ub3Nw ZWMoKSIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHYxX21hc2tfbm9z cGVjPSJhcm0KPiAzMiBiaXRzIGFycmF5X2luZGV4X21hc2tfbm9zcGVjIgo+ICtAQCAtMzM3Niwx MiArMzM3NiwxMiBAQCBjaGVja19DVkVfMjAxN181NzUzX2xpbnV4KCkKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgeWVsbG93IE5PCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgWyAtbiAiJGtlcm5lbF9lcnIiIF07IHRo ZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0 dXMgeWVsbG93IFVOS05PV04gImNvdWxkbid0IGNoZWNrCj4gKCRrZXJuZWxfZXJyKSIKPiArLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmICEgY29tbWFuZCAtdiBwZXJsID4vZGV2L251 bGwgMj4mMTsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgISBjb21t YW5kIC12IEBwZXJsQCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgeWVsbG93IFVOS05PV04gIm1pc3Np bmcgJ3BlcmwnCj4gYmluYXJ5LCBwbGVhc2UgaW5zdGFsbCBpdCIKPiArLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBlbGlmICEgY29tbWFuZCAtdiAiJHtvcHRfYXJjaF9wcmVmaXh9b2JqZHVt cCIKPiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBlbGlmICEgY29tbWFuZCAtdiAiQG9iamR1bXBAIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgeWVs bG93IFVOS05PV04gIm1pc3NpbmcKPiAnJHtvcHRfYXJjaF9wcmVmaXh9b2JqZHVtcCcgdG9vbCwg cGxlYXNlIGluc3RhbGwgaXQsIHVzdWFsbHkgaXQncyBpbgo+IHRoZSBiaW51dGlscyBwYWNrYWdl Igo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbHNlCj4gKy3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCIke29wdF9hcmNoX3ByZWZpeH1vYmpkdW1w IiAkb2JqZHVtcF9vcHRpb25zCj4gIiRrZXJuZWwiIHwgcGVybCAtbmUgJ3B1c2ggQHIsICRfOyAv XHMoaGludHxjc2RiKVxzLyAmJgo+ICRyWzBdPX4vXHNzdWJccysoeFxkKykvICYmICRyWzFdPX4v XHNiaWNccyskMSxccyskMSwvICYmCj4gJHJbMl09fi9cc2FuZFxzLyAmJiBleGl0KDkpOyBzaGlm dCBAciBpZiBAcj4zJzsgcmV0PSQ/Cj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCJAb2JqZHVtcEAiICRvYmpkdW1wX29wdGlvbnMgIiRrZXJuZWwiIHwKPiBA cGVybEAgLW5lICdwdXNoIEByLCAkXzsgL1xzKGhpbnR8Y3NkYilccy8gJiYgJHJbMF09fi9cc3N1 YlxzKyh4XGQrKS8KPiAmJiAkclsxXT1+L1xzYmljXHMrJDEsXHMrJDEsLyAmJiAkclsyXT1+L1xz YW5kXHMvICYmIGV4aXQoOSk7IHNoaWZ0Cj4gQHIgaWYgQHI+Myc7IHJldD0kPwo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAiJHJldCIgLWVxIDkg XTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgZ3JlZW4gWUVTICJtYXNrX25vc3BlYzY0Cj4gbWFjcm8g aXMgcHJlc2VudCBhbmQgdXNlZCIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB2MV9tYXNrX25vc3BlYz0iYXJtNjQgbWFza19u b3NwZWM2NCIKPiArQEAgLTM0MDMsMTIgKzM0MDMsMTIgQEAgY2hlY2tfQ1ZFXzIwMTdfNTc1M19s aW51eCgpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBw c3RhdHVzIHllbGxvdyBOTwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIFsg LW4gIiRrZXJuZWxfZXJyIiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIHllbGxvdyBVTktOT1dOICJjb3VsZG4ndCBjaGVjawo+ ICgka2VybmVsX2VycikiCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiAhIGNv bW1hbmQgLXYgcGVybCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBlbGlmICEgY29tbWFuZCAtdiBAcGVybEAgPi9kZXYvbnVsbCAyPiYxOyB0aGVu Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVz IHllbGxvdyBVTktOT1dOICJtaXNzaW5nICdwZXJsJwo+IGJpbmFyeSwgcGxlYXNlIGluc3RhbGwg aXQiCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiAhIGNvbW1hbmQgLXYgIiR7 b3B0X2FyY2hfcHJlZml4fW9iamR1bXAiCj4gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gKyvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiAhIGNvbW1hbmQgLXYgIkBvYmpkdW1wQCIgPi9k ZXYvbnVsbCAyPiYxOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBwc3RhdHVzIHllbGxvdyBVTktOT1dOICJtaXNzaW5nCj4gJyR7b3B0X2FyY2hf cHJlZml4fW9iamR1bXAnIHRvb2wsIHBsZWFzZSBpbnN0YWxsIGl0LCB1c3VhbGx5IGl0J3MgaW4K PiB0aGUgYmludXRpbHMgcGFja2FnZSIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg ZWxzZQo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAiJHtv cHRfYXJjaF9wcmVmaXh9b2JqZHVtcCIgLWQgIiRrZXJuZWwiIHwKPiBwZXJsIC1uZSAncHVzaCBA ciwgJF87IC9ccyhoaW50fGNzZGIpXHMvICYmCj4gJHJbMF09fi9cc21vdlxzKyh3XGQrKSxccyso d1xkKykvICYmCj4gJHJbMV09fi9cc2NtcFxzKyh4XGQrKSxccysoeFxkKykvICYmICRyWzJdPX4v XHNuZ2NccyskMiwvICYmIGV4aXQoOSk7Cj4gc2hpZnQgQHIgaWYgQHI+Myc7IHJldD0kPwo+ICsr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAiQG9iamR1bXBAIiAt ZCAiJGtlcm5lbCIgfCBAcGVybEAgLW5lICdwdXNoCj4gQHIsICRfOyAvXHMoaGludHxjc2RiKVxz LyAmJiAkclswXT1+L1xzbW92XHMrKHdcZCspLFxzKyh3XGQrKS8gJiYKPiAkclsxXT1+L1xzY21w XHMrKHhcZCspLFxzKyh4XGQrKS8gJiYgJHJbMl09fi9cc25nY1xzKyQyLC8gJiYgZXhpdCg5KTsK PiBzaGlmdCBAciBpZiBAcj4zJzsgcmV0PSQ/Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICIkcmV0IiAtZXEgOSBdOyB0aGVuCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0 YXR1cyBncmVlbiBZRVMgImFycmF5X2luZGV4X25vc3BlYwo+IG1hY3JvIGlzIHByZXNlbnQgYW5k IHVzZWQiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgdjFfbWFza19ub3NwZWM9ImFybTY0Cj4gYXJyYXlfaW5kZXhfbm9zcGVj Igo+ICtAQCAtMzQyNCw3ICszNDI0LDcgQEAgY2hlY2tfQ1ZFXzIwMTdfNTc1M19saW51eCgpCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbIC1uICIk a2VybmVsX2VyciIgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgeWVsbG93IFVOS05PV04gImNvdWxk bid0Cj4gY2hlY2sgKCRrZXJuZWxfZXJyKSIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICEgY29tbWFuZCAtdgo+ICIke29wdF9h cmNoX3ByZWZpeH1vYmpkdW1wIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiArK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICEgY29t bWFuZCAtdiAiQG9iamR1bXBAIgo+ID4vZGV2L251bGwgMj4mMTsgdGhlbgo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBwc3RhdHVzIHllbGxvdyBVTktOT1dOCj4gIm1pc3NpbmcgJyR7b3B0X2FyY2hf cHJlZml4fW9iamR1bXAnIHRvb2wsIHBsZWFzZSBpbnN0YWxsIGl0LCB1c3VhbGx5Cj4gaXQncyBp biB0aGUgYmludXRpbHMgcGFja2FnZSIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbHNlCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCMgaGVyZSB3ZSBkaXNhc3NlbWJsZSB0aGUKPiBrZXJuZWwgYW5kIGNvdW50IHRoZSBudW1i ZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdGhlIExGRU5DRSBvcGNvZGUKPiArQEAgLTM0MzQsNyArMzQz NCw3IEBAIGNoZWNrX0NWRV8yMDE3XzU3NTNfbGludXgoKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAjIHNvIGxldCdzIHB1c2ggdGhlIHRocmVzaG9sZAo+IHRvIDcwLgo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAjIHYwLjMzKzogbm93IG9ubHkgY291bnQKPiBsZmVuY2Ugb3Bjb2RlcyBhZnRlciBh IGp1bXAsIHdheSBsZXNzIGVycm9yLXByb25lCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgbm9u IHBhdGNoZWQga2VybmVsIGhhdmUKPiBiZXR3ZWVuIDAgYW5kIDIwIG1hdGNoZXMsIHBhdGNoZWQg b25lcyBoYXZlIGF0IGxlYXN0IDQwLTQ1Cj4gKy0KPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbmJfbGZl bmNlPSQoIiR7b3B0X2FyY2hfcHJlZml4fQo+IG9iamR1bXAiICRvYmpkdW1wX29wdGlvbnMgIiRr ZXJuZWwiIDI+L2Rldi9udWxsIHwgZ3JlcCAtdyAtQjEgbGZlbmNlCj4gfCBncmVwIC1Fd2MgJ2pt cHxqbmV8amUnKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG5iX2xmZW5jZT0kKCJAb2JqZHVtcEAi Cj4gJG9iamR1bXBfb3B0aW9ucyAiJGtlcm5lbCIgMj4vZGV2L251bGwgfCBAZ3JlcEAgLXcgLUIx IGxmZW5jZSB8Cj4gQGdyZXBAIC1Fd2MgJ2ptcHxqbmV8amUnKQo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBpZiBbICIkbmJfbGZlbmNlIiAtbHQgMzAgXTsKPiB0aGVuCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIHllbGxvdyBOTwo+ICJvbmx5ICRuYl9sZmVu Y2UganVtcC10aGVuLWxmZW5jZSBpbnN0cnVjdGlvbnMgZm91bmQsIHNob3VsZCBiZSA+PSAzMAo+ IChoZXVyaXN0aWMpIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbHNlCj4gK0BAIC0zNTA1LDcg KzM1MDUsNyBAQCBjaGVja19DVkVfMjAxN181NzE1KCkKPiArwqDCoMKgwqDCoMKgwqBfaW5mbyAi XDAzM1sxOzM0bSRjdmUgYWthICckKGN2ZTJuYW1lICIkY3ZlIiknXDAzM1swbSIKPiArwqDCoMKg wqDCoMKgwqBpZiBbICIkb3MiID0gTGludXggXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBjaGVja19DVkVfMjAxN181NzE1X2xpbnV4Cj4gKy3CoMKgwqDCoMKgwqBlbGlm IGVjaG8gIiRvcyIgfCBncmVwIC1xIEJTRDsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgZWxpZiBlY2hv ICIkb3MiIHwgQGdyZXBAIC1xIEJTRDsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBjaGVja19DVkVfMjAxN181NzE1X2JzZAo+ICvCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX3dhcm4gIlVuc3VwcG9ydGVkIE9TICgkb3MpIgo+ ICtAQCAtMzU0NywxMyArMzU0NywxMyBAQCBjaGVja19DVkVfMjAxN181NzE1X2xpbnV4KCkKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIwo+IC9wcm9jL3N5cy9rZXJuZWwvaWJyc19lbmFibGVkOiBP cGVuU1VTRSB0dW1ibGV3ZWVkCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHNwZWNleF9rbm9iX2Rp cj0kZGlyCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlicnNfc3VwcG9ydGVkPSIkZGlyL2licnNf ZW5hCj4gYmxlZCBleGlzdHMiCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWJyc19lbmFibGVkPSQo Y2F0Cj4gIiRkaXIvaWJyc19lbmFibGVkIiAyPi9kZXYvbnVsbCkKPiArK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBpYnJzX2VuYWJsZWQ9JChAY2F0QAo+ICIkZGlyL2licnNfZW5hYmxlZCIgMj4vZGV2L251 bGwpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAiaWJyczogZm91bmQKPiAkZGlyL2li cnNfZW5hYmxlZD0kaWJyc19lbmFibGVkIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIGlmIGli cnNfZW5hYmxlZCBpcyB0aGVyZSwKPiBpYnBiX2VuYWJsZWQgd2lsbCBiZSBpbiB0aGUgc2FtZSBk aXIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAtZSAiJGRpci9pYnBiX2VuYWJsZWQiCj4g XTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBpZiB0aGUg ZmlsZSBpcwo+IHRoZXJlLCB3ZSBoYXZlIElCUEIgY29tcGlsZWQtaW4gKHNlZSBub3RlIGFib3Zl IGZvciBJQlJTKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWJwYl9z dXBwb3J0ZWQ9IiRkaXIvCj4gaWJwYl9lbmFibGVkIGV4aXN0cyIKPiArLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgaWJwYl9lbmFibGVkPSQoY2F0Cj4gIiRkaXIvaWJwYl9lbmFi bGVkIiAyPi9kZXYvbnVsbCkKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg aWJwYl9lbmFibGVkPSQoQGNhdEAKPiAiJGRpci9pYnBiX2VuYWJsZWQiIDI+L2Rldi9udWxsKQo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2RlYnVnICJpYnBiOiBmb3Vu ZAo+ICRkaXIvaWJwYl9lbmFibGVkPSRpYnBiX2VuYWJsZWQiCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAi aWJwYjoKPiAkZGlyL2licGJfZW5hYmxlZCBmaWxlIGRvZXNuJ3QgZXhpc3QiCj4gK0BAIC0zNTY4 LDcgKzM1NjgsNyBAQCBjaGVja19DVkVfMjAxN181NzE1X2xpbnV4KCkKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgd2hpY2ggaW4gdGhhdCBjYXNlIG1l YW5zIGlicnMgaXMgc3VwcG9ydGVkCj4gKmFuZCogZW5hYmxlZCBmb3Iga2VybmVsICYgdXNlcgo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBhcyBwZXIg dGhlIGlicnMgcGF0Y2ggc2VyaWVzIHYzCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBpZiBbIC16ICIkaWJyc19zdXBwb3J0ZWQiIF07IHRoZW4KPiArLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGlmIGdyZXAgXmZsYWdzICIkcHJvY2ZzL2NwdWluZm8iIHwKPiBncmVwIC1xdyBzcGVjX2N0cmxf aWJyczsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgaWYgQGdyZXBAIF5mbGFncyAiJHByb2Nmcy9jcHVpbmZvIiB8Cj4g QGdyZXBAIC1xdyBzcGVjX2N0cmxfaWJyczsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBf ZGVidWcgImlicnM6IGZvdW5kCj4gc3BlY19jdHJsX2licnMgZmxhZyBpbiAkcHJvY2ZzL2NwdWlu Zm8iCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlicnNfc3VwcG9ydGVkPSJzcGVjX2N0cmxfaWJy Cj4gcyBmbGFnIGluICRwcm9jZnMvY3B1aW5mbyIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBl bmFibGVkPTIgLT4ga2VybmVsICYgdXNlcgo+ICtAQCAtMzU3OCwxMyArMzU3OCwxMyBAQCBjaGVj a19DVkVfMjAxN181NzE1X2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBpZiBbIC1uICIkZnVsbG1zZyIgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgd2hlbiBJQlBC IGlzIGVuYWJsZWQgb24gNC4xNSssIHdlCj4gY2FuIHNlZSBpdCBpbiBzeXNmcwo+ICstwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYg ZWNobyAiJGZ1bGxtc2ciIHwgZ3JlcCAtcSAnSUJQQic7Cj4gdGhlbgo+ICsrwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgZWNobyAi JGZ1bGxtc2ciIHwgQGdyZXBAIC1xCj4gJ0lCUEInOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoF9kZWJ1ZyAiaWJwYjogZm91bmQgZW5hYmxlZAo+IGluIHN5c2ZzIgo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBbIC16ICIkaWJwYl9zdXBwb3J0ZWQiIF0gJiYKPiBpYnBiX3N1cHBvcnRlZD0n SUJQQiBmb3VuZCBlbmFibGVkIGluIHN5c2ZzJwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbIC16 ICIkaWJwYl9lbmFibGVkIsKgwqAgXSAmJgo+IGlicGJfZW5hYmxlZD0xCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZmkKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAjIHdoZW4gSUJSU19GVyBpcyBlbmFibGVkIG9uIDQuMTUrLAo+IHdlIGNhbiBzZWUgaXQg aW4gc3lzZnMKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGlmIGVjaG8gIiRmdWxsbXNnIiB8IGdyZXAgLXEgJywKPiBJQlJTX0ZX JzsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgaWYgZWNobyAiJGZ1bGxtc2ciIHwgQGdyZXBAIC1xICcsCj4gSUJSU19G Vyc7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2RlYnVnICJpYnJzOiBmb3VuZCBJQlJT X0ZXCj4gaW4gc3lzZnMiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgLXogIiRpYnJzX3N1cHBv cnRlZCIgXSAmJgo+IGlicnNfc3VwcG9ydGVkPSdmb3VuZCBJQlJTX0ZXIGluIHN5c2ZzJwo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBpYnJzX2Z3X2VuYWJsZWQ9MQo+ICtAQCAtMzU5MiwxMyArMzU5 MiwxMyBAQCBjaGVja19DVkVfMjAxN181NzE1X2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIHdoZW4gSUJSUyBp cyBlbmFibGVkIG9uIDQuMTUrLCB3ZQo+IGNhbiBzZWUgaXQgaW4gc3lzZnMKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIG9u IGEgbW9yZSByZWNlbnQga2VybmVsLCBjbGFzc2ljCj4gIklCUlMiIGlzIG5vdCBldmVuIGxvbmdl ciBhbiBvcHRpb24sIGJlY2F1c2Ugb2YgdGhlIHBlcmZvcm1hbmNlCj4gaW1wYWN0Lgo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCMgb25seSAiRW5oYW5jZWQgSUJSUyIgaXMgYXZhaWxhYmxlCj4gKG9uIENQVXMgd2l0aCB0aGUg SUJSU19BTEwgZmxhZykKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGVjaG8gIiRmdWxsbXNnIiB8IGdyZXAgLXEgLWUKPiAn XDxJQlJTXD4nIC1lICdJbmRpcmVjdCBCcmFuY2ggUmVzdHJpY3RlZCBTcGVjdWxhdGlvbic7IHRo ZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGlmIGVjaG8gIiRmdWxsbXNnIiB8IEBncmVwQCAtcSAtZQo+ICdcPElCUlNcPicg LWUgJ0luZGlyZWN0IEJyYW5jaCBSZXN0cmljdGVkIFNwZWN1bGF0aW9uJzsgdGhlbgo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgImlicnM6IGZvdW5kIElCUlMgaW4KPiBzeXNmcyIKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgWyAteiAiJGlicnNfc3VwcG9ydGVkIiBdICYmCj4gaWJyc19z dXBwb3J0ZWQ9J2ZvdW5kIElCUlMgaW4gc3lzZnMnCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsg LXogIiRpYnJzX2VuYWJsZWQiwqDCoCBdICYmCj4gaWJyc19lbmFibGVkPTMKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCMgY2hlY2tpbmcgZm9yICdFbmhhbmNlZCBJQlJTJyBpbgo+IHN5c2ZzLCBlbmFibGVk IG9uIENQVXMgd2l0aCBJQlJTX0FMTAo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgZWNobyAiJGZ1bGxtc2ciIHwgZ3JlcCAt cSAtZQo+ICdFbmhhbmNlZCBJQlJTJzsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgZWNobyAiJGZ1bGxtc2ciIHwg QGdyZXBAIC1xIC1lCj4gJ0VuaGFuY2VkIElCUlMnOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoFsgLXogIiRpYnJzX3N1cHBvcnRlZCIgXSAmJgo+IGlicnNfc3VwcG9ydGVkPSdmb3VuZCBF bmhhbmNlZCBJQlJTIGluIHN5c2ZzJwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIDQgaXNuJ3Qg YWN0dWFsbHkgYSB2YWxpZAo+IHZhbHVlIG9mIHRoZSBub3cgZXh0aW5jdCAiaWJyc19lbmFibGVk IiBmbGFnIGZpbGUsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgdGhhdCBvbmx5IHdlbnQgZnJv bSAwIHRvIDMsCj4gc28gd2UgdXNlIDQgYXMgImVuaGFuY2VkIGlicnMgaXMgZW5hYmxlZCIKPiAr QEAgLTM2MTcsMTEgKzM2MTcsMTEgQEAgY2hlY2tfQ1ZFXzIwMTdfNTcxNV9saW51eCgpCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBpZiBbIC16ICIkaWJyc19zdXBwb3J0ZWQiIF0gJiYgWyAtbiAiJGtlcm5lbCIgXTsgdGhlbgo+ ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAhIGNvbW1h bmQgLXYgIiR7b3B0X2FyY2hfcHJlZml4fXN0cmluZ3MiCj4gPi9kZXYvbnVsbCAyPiYxOyB0aGVu Cj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICEgY29t bWFuZCAtdiAiQHN0cmluZ3NAIiA+L2Rldi9udWxsIDI+JjE7Cj4gdGhlbgo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDoKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBpYnJzX2Nhbl90ZWxsPTEKPiArLQo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlicnNfc3VwcG9ydGVkPSQoIiR7b3B0X2FyY2hf cHJlZml4fXN0cgo+IGluZ3MiICIka2VybmVsIiB8IGdyZXAgLUZ3IC1lICcsIElCUlNfRlcnIHwg aGVhZCAtMSkKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGlicnNfc3VwcG9ydGVkPSQoIkBzdHJpbmdzQCIKPiAiJGtlcm5lbCIg fCBAZ3JlcEAgLUZ3IC1lICcsIElCUlNfRlcnIHwgQGhlYWRAIC0xKQo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLW4g IiRpYnJzX3N1cHBvcnRlZCIgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcg ImlicnM6IGZvdW5kIGlicnMKPiBldmlkZW5jZSBpbiBrZXJuZWwgaW1hZ2UgKCRpYnJzX3N1cHBv cnRlZCkiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlicnNfc3VwcG9ydGVkPSJmb3VuZAo+ICck aWJyc19zdXBwb3J0ZWQnIGluIGtlcm5lbCBpbWFnZSIKPiArQEAgLTM2MzAsNyArMzYzMCw3IEBA IGNoZWNrX0NWRV8yMDE3XzU3MTVfbGludXgoKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBmaQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbIC16ICIkaWJyc19z dXBwb3J0ZWQiIF0gJiYgWyAtbiAiJG9wdF9tYXAiIF07Cj4gdGhlbgo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWJyc19jYW5fdGVsbD0xCj4gKy3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGdyZXAgLXEgc3BlY19j dHJsICIkb3B0X21hcCI7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgaWYgQGdyZXBAIC1xIHNwZWNfY3RybCAiJG9wdF9tYXAiOyB0aGVuCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaWJyc19zdXBwb3J0ZWQ9ImZvdW5kIHNwZWNfY3RybCBpbgo+IHN5bWJvbHMgZmlsZSIKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBfZGVidWcgImlicnM6IGZvdW5kICcqc3BlY19jdHJsKicKPiBzeW1ib2wgaW4gJG9wdF9t YXAiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ ICtAQCAtMzYzOCwxMSArMzYzOCwxMSBAQCBjaGVja19DVkVfMjAxN181NzE1X2xpbnV4KCkKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyByZWNlbnQgKDQuMTUpIHZhbmlsbGEga2Vy bmVscyBoYXZlIElCUEIgYnV0IG5vdAo+IElCUlMsIGFuZCB3aXRob3V0IHRoZSBkZWJ1Z2ZzIHR1 bmFibGVzIG9mIFJlZCBIYXQKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyB3ZSBj YW4gZGV0ZWN0IGl0IGRpcmVjdGx5IGluIHRoZSBpbWFnZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBpZiBbIC16ICIkaWJwYl9zdXBwb3J0ZWQiIF0gJiYgWyAtbiAiJGtlcm5lbCIg XTsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBp ZiAhIGNvbW1hbmQgLXYgIiR7b3B0X2FyY2hfcHJlZml4fXN0cmluZ3MiCj4gPi9kZXYvbnVsbCAy PiYxOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGlmICEgY29tbWFuZCAtdiAiQHN0cmluZ3NAIiA+L2Rldi9udWxsIDI+JjE7Cj4gdGhlbgo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoDoKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVs c2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBpYnBiX2Nhbl90ZWxsPTEKPiArLQo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlicGJfc3VwcG9ydGVkPSQoIiR7 b3B0X2FyY2hfcHJlZml4fXN0cgo+IGluZ3MiICIka2VybmVsIiB8IGdyZXAgLUZ3IC1lICdpYnBi JyAtZSAnLCBJQlBCJyB8IGhlYWQgLTEpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpYnBiX3N1cHBvcnRlZD0kKCJAc3RyaW5n c0AiCj4gIiRrZXJuZWwiIHwgQGdyZXBAIC1GdyAtZSAnaWJwYicgLWUgJywgSUJQQicgfCBAaGVh ZEAgLTEpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgaWYgWyAtbiAiJGlicGJfc3VwcG9ydGVkIiBdOyB0aGVuCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoF9kZWJ1ZyAiaWJwYjogZm91bmQgaWJwYgo+IGV2aWRlbmNlIGluIGtl cm5lbCBpbWFnZSAoJGlicGJfc3VwcG9ydGVkKSIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWJw Yl9zdXBwb3J0ZWQ9ImZvdW5kCj4gJyRpYnBiX3N1cHBvcnRlZCcgaW4ga2VybmVsIGltYWdlIgo+ ICtAQCAtMzY5MSw5ICszNjkxLDkgQEAgY2hlY2tfQ1ZFXzIwMTdfNTcxNV9saW51eCgpCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoDIpwqDCoMKgwqDCoMKgaWYgWwo+ICIkaWJyc19md19lbmFibGVk IiA9IDEgXTsgdGhlbiBwc3RhdHVzIGdyZWVuIFlFUyAiZm9yIGtlcm5lbCwgdXNlcgo+IHNwYWNl LCBhbmQgZmlybXdhcmUgY29kZSIgOyBlbHNlIHBzdGF0dXMgZ3JlZW4gWUVTICJmb3IgYm90aCBr ZXJuZWwKPiBhbmQgdXNlciBzcGFjZSI7IGZpOzsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgMynC oMKgwqDCoMKgwqBpZiBbCj4gIiRpYnJzX2Z3X2VuYWJsZWQiID0gMSBdOyB0aGVuIHBzdGF0dXMg Z3JlZW4gWUVTICJmb3Iga2VybmVsIGFuZAo+IGZpcm13YXJlIGNvZGUiOyBlbHNlIHBzdGF0dXMg Z3JlZW4gWUVTOyBmaTs7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDQpwqDCoMKgwqDCoMKgcHN0 YXR1cyBncmVlbiBZRVMKPiAiRW5oYW5jZWQgZmxhdm9yLCBwZXJmb3JtYW5jZSBpbXBhY3Qgd2ls bCBiZSBncmVhdGx5IHJlZHVjZWQiOzsKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAqKcKgwqDCoMKg wqDCoGlmIFsgIiRjcHVpZF9pYnJzIiAhPQo+ICdTUEVDX0NUUkwnIF0gJiYgWyAiJGNwdWlkX2li cnMiICE9ICdJQlJTX1NVUFBPUlQnIF0gJiYgWwo+ICIkY3B1aWRfc3BlY19jdHJsIiAhPSAtMSBd Owo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg dGhlbiBwc3RhdHVzCj4geWVsbG93IE5POyBfZGVidWcgImlicnM6IGtub3duIGNwdSBub3Qgc3Vw cG9ydGluZyBTUEVDLUNUUkwgb3IgSUJSUyI7Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGVsc2UKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAqKcKgwqDCoMKgwqDCoGlmIFsg IiRjcHVpZF9pYnJzIiAhPQo+ICdTUEVDX0NUUkwnIF0gJiYgWyAiJGNwdWlkX2licnMiICE9ICdJ QlJTX1NVUFBPUlQnIF0gJiYgWwo+ICIkY3B1aWRfc3BlY19jdHJsIiAhPSAtMSBdOwo+ICsrwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdGhlbiBwc3Rh dHVzCj4geWVsbG93IE5POyBfZGVidWcgImlicnM6IGtub3duIGNwdSBub3Qgc3VwcG9ydGluZyBT UEVDLUNUUkwgb3IgSUJSUyI7Cj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBwc3RhdHVzCj4geWVsbG93IFVOS05PV047IGZpOzsKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlc2FjCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ICtAQCAtMzc0NCw3 ICszNzQ0LDcgQEAgY2hlY2tfQ1ZFXzIwMTdfNTcxNV9saW51eCgpCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGJwX2hhcmRlbj0nJwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBpZiBbIC1yICIkb3B0X2NvbmZpZyIgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgYnBfaGFyZGVuX2Nhbl90ZWxsPTEKPiArLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgYnBfaGFyZGVuPSQoZ3JlcCAt dwo+ICdDT05GSUdfSEFSREVOX0JSQU5DSF9QUkVESUNUT1I9eScgIiRvcHRfY29uZmlnIikKPiAr K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgYnBfaGFyZGVuPSQo QGdyZXBAIC13Cj4gJ0NPTkZJR19IQVJERU5fQlJBTkNIX1BSRURJQ1RPUj15JyAiJG9wdF9jb25m aWciKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYg WyAtbiAiJGJwX2hhcmRlbiIgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgZ3JlZW4gWUVTCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgX2RlYnVnICJicF9oYXJkZW46IGZvdW5kICckYnBfaGFyZGVuJwo+IGluICRvcHRfY29uZmln Igo+ICtAQCAtMzc1Miw3ICszNzUyLDcgQEAgY2hlY2tfQ1ZFXzIwMTdfNTcxNV9saW51eCgpCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGlmIFsgLXogIiRicF9oYXJkZW4iIF0gJiYgWyAtbiAiJG9wdF9tYXAiIF07IHRo ZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJwX2hh cmRlbl9jYW5fdGVsbD0xCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGJwX2hhcmRlbj0kKGdyZXAgLXcgYnBfaGFyZGVuaW5nX2RhdGEKPiAiJG9wdF9tYXAi KQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBicF9oYXJk ZW49JChAZ3JlcEAgLXcgYnBfaGFyZGVuaW5nX2RhdGEKPiAiJG9wdF9tYXAiKQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAtbiAiJGJwX2hhcmRl biIgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgZ3JlZW4gWUVTCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2RlYnVnICJicF9o YXJkZW46IGZvdW5kICckYnBfaGFyZGVuJwo+IGluICRvcHRfbWFwIgo+ICtAQCAtMzc3MCwxMSAr Mzc3MCwxMSBAQCBjaGVja19DVkVfMjAxN181NzE1X2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIyBXZSBjaGVjayB0aGUgUkVUUE9MSU5FIGtlcm5lbCBvcHRpb25zCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHBvbGluZT0wCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLXIgIiRvcHRfY29uZmlnIiBdOyB0aGVuCj4gKy3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGdyZXAgLXEgJ15DT05G SUdfUkVUUE9MSU5FPXknCj4gIiRvcHRfY29uZmlnIjsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBAZ3JlcEAgLXEgJ15DT05GSUdfUkVUUE9M SU5FPXknCj4gIiRvcHRfY29uZmlnIjsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgZ3JlZW4gWUVTCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgcmV0cG9saW5lPTEKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwNDYKPiAr LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoF9kZWJ1ZyAncmV0cG9saW5lOiBmb3VuZCAnJChncmVwCj4gJ15DT05GSUdfUkVUUE9MSU5F JyAiJG9wdF9jb25maWciKSIgaW4gJG9wdF9jb25maWciCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgJ3JldHBvbGlu ZTogZm91bmQgJyQoQGdyZXBACj4gJ15DT05GSUdfUkVUUE9MSU5FJyAiJG9wdF9jb25maWciKSIg aW4gJG9wdF9jb25maWciCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBlbHNlCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyB5ZWxsb3cgTk8KPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gK0BAIC0zNzk1LDggKzM3OTUsOCBA QCBjaGVja19DVkVfMjAxN181NzE1X2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgc2luY2UgNS4xNS4yOCwgdGhpcyBpcyBub3cgIlJldHBv bGluZXMiIGFzCj4gdGhlIGltcGxlbWVudGF0aW9uIHdhcyBzd2l0Y2hlZCB0byBhIGdlbmVyaWMg b25lLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBz byB3ZSBsb29rIGZvciBib3RoICJyZXRwb2xpbmUiIGFuZAo+ICJyZXRwb2xpbmVzIgo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAiJG9wdF9saXZl IiA9IDEgXSAmJiBbIC1uICIkZnVsbG1zZyIgXTsKPiB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBlY2hvICIkZnVs bG1zZyIgfCBncmVwIC1xd2kgLWUKPiByZXRwb2xpbmUgLWUgcmV0cG9saW5lczsgdGhlbgo+ICst wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGlmIGVjaG8gIiRmdWxsbXNnIiB8IGdyZXAgLQo+IHF3aSBtaW5p bWFsOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBpZiBlY2hvICIkZnVsbG1zZyIgfCBAZ3JlcEAgLXF3aSAtZQo+IHJl dHBvbGluZSAtZSByZXRwb2xpbmVzOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgZWNo byAiJGZ1bGxtc2ciIHwgQGdyZXBAIC0KPiBxd2kgbWluaW1hbDsgdGhlbgo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0cG9saW5lX2NvbXBpbGVyPTAKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHBvbGluZV9jb21waWxlcl9yZQo+IGFz b249Imtlcm5lbCByZXBvcnRzIG1pbmltYWwgcmV0cG9saW5lIGNvbXBpbGF0aW9uIgo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBlbHNlCj4gK0BAIC0zODA2LDE5ICszODA2LDE5IEBAIGNoZWNrX0NW RV8yMDE3XzU3MTVfbGludXgoKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIFsgLW4gIiRvcHRfbWFwIiBdOyB0aGVuCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIyBsb29rIGZvciB0aGUgc3ltYm9sCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBncmVwIC1xdyBub3JldHBvbGluZV9z ZXR1cAo+ICIkb3B0X21hcCI7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIEBncmVwQCAtcXcgbm9yZXRwb2xpbmVf c2V0dXAKPiAiJG9wdF9tYXAiOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHBvbGlu ZV9jb21waWxlcj0xCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHBvbGluZV9jb21waWxlcl9y ZWFzb249Im5vCj4gcmV0cG9saW5lX3NldHVwIHN5bWJvbCBmb3VuZCBpbiBTeXN0ZW0ubWFwIgo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBlbGlmIFsgLW4gIiRrZXJuZWwiIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIGxvb2sgZm9yIHRoZSBzeW1i b2wKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGlmIGNvbW1hbmQgLXYgIiR7b3B0X2FyY2hfcHJlZml4fW5tIgo+ID4vZGV2L251 bGwgMj4mMTsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgY29tbWFuZCAtdiAiQG5tQCIgPi9kZXYvbnVsbCAyPiYx Owo+IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyB0aGUgcHJvcGVyIHdheTogdXNlIG5t IGFuZAo+IGxvb2sgZm9yIHRoZSBzeW1ib2wKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAiJHtv cHRfYXJjaF9wcmVmaXh9bm0iCj4gIiRrZXJuZWwiIDI+L2Rldi9udWxsIHwgZ3JlcCAtcXcgJ25v cmV0cG9saW5lX3NldHVwJzsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICJAbm1AIiAi JGtlcm5lbCIKPiAyPi9kZXYvbnVsbCB8IEBncmVwQCAtcXcgJ25vcmV0cG9saW5lX3NldHVwJzsg dGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0cG9saW5lX2Nv bXBpbGVyPTEKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHBvbGlu ZV9jb21waWxlcl9yZQo+IGFzb249Im5vcmV0cG9saW5lX3NldHVwIGZvdW5kIGluIGtlcm5lbCBz eW1ib2xzIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ICstwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiBncmVwIC1xIG5v cmV0cG9saW5lX3NldHVwCj4gIiRrZXJuZWwiOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIEBncmVwQCAtcSBu b3JldHBvbGluZV9zZXR1cAo+ICIka2VybmVsIjsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAjIGlmIHdlIGRvbid0IGhhdmUgbm0sCj4gbmV2ZXJtaW5kLCB0aGUgc3ltYm9sIG5hbWUgaXMg bG9uZyBlbm91Z2ggdG8gbm90IGhhdmUKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBhbnkgZmFs c2UgcG9zaXRpdmUgdXNpbmcKPiBnb29kIG9sZCBncmVwIGRpcmVjdGx5IG9uIHRoZSBiaW5hcnkK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0cG9saW5lX2NvbXBpbGVyPTEKPiArQEAgLTM4NDcs NyArMzg0Nyw3IEBAIGNoZWNrX0NWRV8yMDE3XzU3MTVfbGludXgoKQo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqByZXRwX2VuYWJsZWQ9LTEKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgaWYgWyAiJG9wdF9saXZlIiA9IDEgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAtZSAiJHNwZWNleF9rbm9iX2Rpci9y ZXRwX2VuYWJsZWQiIF07Cj4gdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0cF9lbmFibGVkPSQoY2F0Cj4gIiRzcGVj ZXhfa25vYl9kaXIvcmV0cF9lbmFibGVkIiAyPi9kZXYvbnVsbCkKPiArK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHBfZW5hYmxl ZD0kKEBjYXRACj4gIiRzcGVjZXhfa25vYl9kaXIvcmV0cF9lbmFibGVkIiAyPi9kZXYvbnVsbCkK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBfZGVidWcgInJldHBvbGluZTogZm91bmQKPiAkc3BlY2V4X2tub2JfZGlyL3JldHBf ZW5hYmxlZD0kcmV0cF9lbmFibGVkIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9pbmZvX25vbCAiwqDCoMKgICogUmV0cG9s aW5lIGlzCj4gZW5hYmxlZDogIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgIiRyZXRwX2VuYWJsZWQiID0gMSBdOyB0 aGVuCj4gK0BAIC0zODc3LDcgKzM4NzcsNyBAQCBjaGVja19DVkVfMjAxN181NzE1X2xpbnV4KCkK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJzYl9maWxs aW5nPTAKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlm IFsgIiRvcHRfbGl2ZSIgPSAxIF0gJiYgWyAiJG9wdF9ub19zeXNmcyIKPiAhPSAxIF07IHRoZW4K PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAjIGlmIHdlJ3JlIGxpdmUgYW5kIHdlIGFyZW4ndCBkZW5pZWQKPiBsb29raW5nIGlu dG8gL3N5cywgbGV0J3MgZG8gaXQKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGVjaG8gIiRtc2ciIHwgZ3JlcCAtcXcgUlNC OyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBpZiBlY2hvICIkbXNnIiB8IEBncmVwQCAtcXcgUlNCOyB0aGVuCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHJzYl9maWxsaW5nPTEKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg cHN0YXR1cyBncmVlbiBZRVMKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ICtAQCAtMzg4Niw3ICszODg2LDcgQEAgY2hl Y2tfQ1ZFXzIwMTdfNTcxNV9saW51eCgpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAtbiAiJGtlcm5lbF9lcnIiIF07 IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyB5ZWxsb3cgVU5LTk9XTgo+ICJj b3VsZG4ndCBjaGVjayAoJGtlcm5lbF9lcnIpIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBpZiBncmVwIC1xdyAtZSAnRmlsbGluZyBSU0IKPiBvbiBjb250ZXh0IHN3aXRjaCcg IiRrZXJuZWwiOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgQGdyZXBAIC1xdyAtZSAn RmlsbGluZyBSU0IKPiBvbiBjb250ZXh0IHN3aXRjaCcgIiRrZXJuZWwiOyB0aGVuCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByc2JfZmlsbGluZz0xCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIGdyZWVuIFlFUwo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBlbHNlCj4gK0BAIC00MDQ4LDcgKzQwNDgsNyBAQCBjaGVja19DVkVfMjAx N181NzE1X2JzZCgpCj4gKyB7Cj4gK8KgwqDCoMKgwqDCoMKgX2luZm/CoMKgwqDCoCAiKiBNaXRp Z2F0aW9uIDEiCj4gK8KgwqDCoMKgwqDCoMKgX2luZm9fbm9sICLCoCAqIEtlcm5lbCBzdXBwb3J0 cyBJQlJTOiAiCj4gKy3CoMKgwqDCoMKgwqBpYnJzX2Rpc2FibGVkPSQoc3lzY3RsIC1uIGh3Lmli cnNfZGlzYWJsZSAyPi9kZXYvbnVsbCkKPiArK8KgwqDCoMKgwqDCoGlicnNfZGlzYWJsZWQ9JChA c3lzY3RsQCAtbiBody5pYnJzX2Rpc2FibGUgMj4vZGV2L251bGwpCj4gK8KgwqDCoMKgwqDCoMKg aWYgWyAteiAiJGlicnNfZGlzYWJsZWQiIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgcHN0YXR1cyB5ZWxsb3cgTk8KPiArwqDCoMKgwqDCoMKgwqBlbHNlCj4gK0BAIC00 MDU2LDcgKzQwNTYsNyBAQCBjaGVja19DVkVfMjAxN181NzE1X2JzZCgpCj4gK8KgwqDCoMKgwqDC oMKgZmkKPiArCj4gK8KgwqDCoMKgwqDCoMKgX2luZm9fbm9sICLCoCAqIElCUlMgZW5hYmxlZCBh bmQgYWN0aXZlOiAiCj4gKy3CoMKgwqDCoMKgwqBpYnJzX2FjdGl2ZT0kKHN5c2N0bCAtbiBody5p YnJzX2FjdGl2ZSAyPi9kZXYvbnVsbCkKPiArK8KgwqDCoMKgwqDCoGlicnNfYWN0aXZlPSQoQHN5 c2N0bEAgLW4gaHcuaWJyc19hY3RpdmUgMj4vZGV2L251bGwpCj4gK8KgwqDCoMKgwqDCoMKgaWYg WyAiJGlicnNfYWN0aXZlIiA9IDEgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBwc3RhdHVzIGdyZWVuIFlFUwo+ICvCoMKgwqDCoMKgwqDCoGVsc2UKPiArQEAgLTQwNjks MTAgKzQwNjksMTAgQEAgY2hlY2tfQ1ZFXzIwMTdfNTcxNV9ic2QoKQo+ICvCoMKgwqDCoMKgwqDC oGlmIFsgLW4gIiRrZXJuZWxfZXJyIiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoHBzdGF0dXMgeWVsbG93IFVOS05PV04gImNvdWxkbid0IGNoZWNrICgka2VybmVsX2Vy cikiCj4gK8KgwqDCoMKgwqDCoMKgZWxzZQo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGlmICEgY29tbWFuZCAtdiAiJHtvcHRfYXJjaF9wcmVmaXh9cmVhZGVsZiIKPiA+L2Rldi9udWxs IDI+JjE7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAhIGNvbW1hbmQg LXYgIkByZWFkZWxmQCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIHllbGxvdyBVTktOT1dOICJtaXNz aW5nCj4gJyR7b3B0X2FyY2hfcHJlZml4fXJlYWRlbGYnIHRvb2wsIHBsZWFzZSBpbnN0YWxsIGl0 LCB1c3VhbGx5IGl0J3MgaW4KPiB0aGUgYmludXRpbHMgcGFja2FnZSIKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgZWxzZQo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBuYl90aHVua3M9JCgiJHtvcHRfYXJjaF9wcmVmaXh9cmVhZGVsZiIgLXMK PiAiJGtlcm5lbCIgfCBncmVwIC1jIC1lIF9fbGx2bV9yZXRwb2xpbmVfIC1lCj4gX19sbHZtX2V4 dGVybmFsX3JldHBvbGluZV8gLWUgX194ODZfaW5kaXJlY3RfdGh1bmtfKQo+ICsrwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBuYl90aHVua3M9JCgiQHJlYWRlbGZA IiAtcyAiJGtlcm5lbCIgfCBAZ3JlcEAKPiAtYyAtZSBfX2xsdm1fcmV0cG9saW5lXyAtZSBfX2xs dm1fZXh0ZXJuYWxfcmV0cG9saW5lXyAtZQo+IF9feDg2X2luZGlyZWN0X3RodW5rXykKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgIiRuYl90aHVu a3MiIC1ndCAwIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXRwb2xpbmU9MQo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgZ3Jl ZW4gWUVTICJmb3VuZCAkbmJfdGh1bmtzCj4gdGh1bmsocykiCj4gK0BAIC00MTEzLDcgKzQxMTMs NyBAQCBjaGVja19DVkVfMjAxN181NzE1X2JzZCgpCj4gKyBwdGlfcGVyZm9ybWFuY2VfY2hlY2so KQo+ICsgewo+ICvCoMKgwqDCoMKgwqDCoF9pbmZvX25vbCAiwqAgKiBSZWR1Y2VkIHBlcmZvcm1h bmNlIGltcGFjdCBvZiBQVEk6ICIKPiArLcKgwqDCoMKgwqDCoGlmIFsgLWUgIiRwcm9jZnMvY3B1 aW5mbyIgXSAmJiBncmVwIF5mbGFncyAiJHByb2Nmcy9jcHVpbmZvIgo+IHwgZ3JlcCAtcXcgcGNp ZDsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgaWYgWyAtZSAiJHByb2Nmcy9jcHVpbmZvIiBdICYmIEBn cmVwQCBeZmxhZ3MKPiAiJHByb2Nmcy9jcHVpbmZvIiB8IEBncmVwQCAtcXcgcGNpZDsgdGhlbgo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfcGNpZD0xCj4gK8KgwqDCoMKgwqDC oMKgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZWFkX2NwdWlkIDB4MSAw eDAgJEVDWCAxNyAxIDE7IHJldD0kPwo+ICtAQCAtNDEyMiw3ICs0MTIyLDcgQEAgcHRpX3BlcmZv cm1hbmNlX2NoZWNrKCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZmkKPiArwqDC oMKgwqDCoMKgwqBmaQo+ICsKPiArLcKgwqDCoMKgwqDCoGlmIFsgLWUgIiRwcm9jZnMvY3B1aW5m byIgXSAmJiBncmVwIF5mbGFncyAiJHByb2Nmcy9jcHVpbmZvIgo+IHwgZ3JlcCAtcXcgaW52cGNp ZDsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgaWYgWyAtZSAiJHByb2Nmcy9jcHVpbmZvIiBdICYmIEBn cmVwQCBeZmxhZ3MKPiAiJHByb2Nmcy9jcHVpbmZvIiB8IEBncmVwQCAtcXcgaW52cGNpZDsgdGhl bgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjcHVfaW52cGNpZD0xCj4gK8KgwqDC oMKgwqDCoMKgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZWFkX2NwdWlk IDB4NyAweDAgJEVCWCAxMCAxIDE7IHJldD0kPwo+ICtAQCAtNDE0Nyw3ICs0MTQ3LDcgQEAgY2hl Y2tfQ1ZFXzIwMTdfNTc1NCgpCj4gK8KgwqDCoMKgwqDCoMKgX2luZm8gIlwwMzNbMTszNG0kY3Zl IGFrYSAnJChjdmUybmFtZSAiJGN2ZSIpJ1wwMzNbMG0iCj4gK8KgwqDCoMKgwqDCoMKgaWYgWyAi JG9zIiA9IExpbnV4IF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY2hl Y2tfQ1ZFXzIwMTdfNTc1NF9saW51eAo+ICstwqDCoMKgwqDCoMKgZWxpZiBlY2hvICIkb3MiIHwg Z3JlcCAtcSBCU0Q7IHRoZW4KPiArK8KgwqDCoMKgwqDCoGVsaWYgZWNobyAiJG9zIiB8IEBncmVw QCAtcSBCU0Q7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY2hlY2tfQ1ZF XzIwMTdfNTc1NF9ic2QKPiArwqDCoMKgwqDCoMKgwqBlbHNlCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoF93YXJuICJVbnN1cHBvcnRlZCBPUyAoJG9zKSIKPiArQEAgLTQxNjksNyAr NDE2OSw3IEBAIGNoZWNrX0NWRV8yMDE3XzU3NTRfbGludXgoKQo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBrcHRpX2Nhbl90ZWxsPTAKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgaWYgWyAtbiAiJG9wdF9jb25maWciIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtwdGlfY2FuX3RlbGw9MQo+ICstwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrcHRpX3N1cHBvcnQ9JChncmVwIC13 IC1lCj4gQ09ORklHX1BBR0VfVEFCTEVfSVNPTEFUSU9OPXkgLWUgQ09ORklHX0tBSVNFUj15IC1l Cj4gQ09ORklHX1VOTUFQX0tFUk5FTF9BVF9FTDA9eSAiJG9wdF9jb25maWciKQo+ICsrwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrcHRpX3N1cHBvcnQ9JChAZ3Jl cEAgLXcgLWUKPiBDT05GSUdfUEFHRV9UQUJMRV9JU09MQVRJT049eSAtZSBDT05GSUdfS0FJU0VS PXkgLWUKPiBDT05GSUdfVU5NQVBfS0VSTkVMX0FUX0VMMD15ICIkb3B0X2NvbmZpZyIpCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbIC1uICIka3B0 aV9zdXBwb3J0IiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2RlYnVnICJrcHRpX3N1cHBvcnQ6IGZvdW5kIG9w dGlvbgo+ICcka3B0aV9zdXBwb3J0JyBpbiAkb3B0X2NvbmZpZyIKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gK0BAIC00MTc5LDcgKzQxNzksNyBA QCBjaGVja19DVkVfMjAxN181NzU0X2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgc28gd2UgdHJ5IHRvIGZpbmQgYW4gZXhwb3J0ZWQgc3lt Ym9sIHRoYXQKPiBpcyBwYXJ0IG9mIHRoZSBQVEkgcGF0Y2ggaW4gU3lzdGVtLm1hcAo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBwYXJzZV9rcHRpOiBh cm0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtwdGlf Y2FuX3RlbGw9MQo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBrcHRpX3N1cHBvcnQ9JChncmVwIC13IC1lIGtwdGlfZm9yY2VfZW5hYmxlZAo+IC1lIHBhcnNl X2twdGkgIiRvcHRfbWFwIikKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKga3B0aV9zdXBwb3J0PSQoQGdyZXBAIC13IC1lCj4ga3B0aV9mb3JjZV9lbmFibGVk IC1lIHBhcnNlX2twdGkgIiRvcHRfbWFwIikKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLW4gIiRrcHRpX3N1cHBvcnQiIF07IHRoZW4KPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBfZGVidWcgImtwdGlfc3VwcG9ydDogZm91bmQKPiAnJGtwdGlfc3VwcG9ydCcgaW4gJG9wdF9t YXAiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ ICtAQCAtNDE4OSwxMCArNDE4OSwxMCBAQCBjaGVja19DVkVfMjAxN181NzU0X2xpbnV4KCkKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgbm9wdGkgb3B0 aW9uIHRoYXQgaXMgcGFydCBvZiB0aGUgcGF0Y2gKPiAoa2VybmVsIGNvbW1hbmQgbGluZSBvcHRp b24pCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjICdr cHRpPSc6IGFybQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKga3B0aV9jYW5fdGVsbD0xCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGlmICEgY29tbWFuZCAtdiAiJHtvcHRfYXJjaF9wcmVmaXh9c3RyaW5ncyIKPiA+ L2Rldi9udWxsIDI+JjE7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgaWYgISBjb21tYW5kIC12ICJAc3RyaW5nc0AiID4vZGV2L251bGwgMj4mMTsK PiB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgcHN0YXR1cyB5ZWxsb3cgVU5LTk9XTiAibWlzc2luZwo+ICcke29wdF9h cmNoX3ByZWZpeH1zdHJpbmdzJyB0b29sLCBwbGVhc2UgaW5zdGFsbCBpdCwgdXN1YWxseSBpdCdz IGluCj4gdGhlIGJpbnV0aWxzIHBhY2thZ2UiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBlbHNlCj4gKy0KPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrcHRpX3N1cHBvcnQ9JCgiJHtvcHRf YXJjaF9wcmVmaXh9c3RyaW4KPiBncyIgIiRrZXJuZWwiIHwgZ3JlcCAtdyAtZSBub3B0aSAtZSBr cHRpPSkKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGtwdGlfc3VwcG9ydD0kKCJAc3RyaW5nc0AiICIka2VybmVsIgo+IHwgQGdy ZXBAIC13IC1lIG5vcHRpIC1lIGtwdGk9KQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLW4gIiRrcHRpX3N1cHBvcnQi IF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2RlYnVnICJrcHRpX3N1cHBvcnQ6IGZv dW5kCj4gJyRrcHRpX3N1cHBvcnQnIGluICRrZXJuZWwiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZmkKPiArQEAgLTQyMTks MjAgKzQyMTksMjAgQEAgY2hlY2tfQ1ZFXzIwMTdfNTc1NF9saW51eCgpCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBkbWVzZ19ncmVwPSIkZG1lc2dfZ3Jl cHx4ODYvcHRpOiBVbm1hcHBpbmcKPiBrZXJuZWwgd2hpbGUgaW4gdXNlcnNwYWNlIgo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBhYXJjaDY0Cj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBkbWVzZ19ncmVwPSIk ZG1lc2dfZ3JlcHxDUFUgZmVhdHVyZXM6Cj4gZGV0ZWN0ZWQoIGZlYXR1cmUpPzogS2VybmVsIHBh Z2UgdGFibGUgaXNvbGF0aW9uIFwoS1BUSVwpIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBncmVwIF5mbGFncyAiJHByb2Nmcy9jcHVpbmZvIiB8IGdy ZXAgLXF3Cj4gcHRpOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGlmIEBncmVwQCBeZmxhZ3MgIiRwcm9jZnMvY3B1aW5mbyIgfCBAZ3JlcEAgLQo+ IHF3IHB0aTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgdmFuaWxsYSBQVEkgcGF0Y2ggc2V0cyB0aGUgJ3B0aScK PiBmbGFnIGluIGNwdWluZm8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgImtwdGlfZW5hYmxlZDogZm91bmQgJ3B0 aScKPiBmbGFnIGluICRwcm9jZnMvY3B1aW5mbyIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrcHRpX2VuYWJsZWQ9MQo+ICst wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIGdyZXAgXmZs YWdzICIkcHJvY2ZzL2NwdWluZm8iIHwgZ3JlcCAtcXcKPiBrYWlzZXI7IHRoZW4KPiArK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiBAZ3JlcEAgXmZsYWdz ICIkcHJvY2ZzL2NwdWluZm8iIHwgQGdyZXBACj4gLXF3IGthaXNlcjsgdGhlbgo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMg a2VybmVsIGxpbmUgNC45IHNldHMgdGhlICdrYWlzZXInCj4gZmxhZyBpbiBjcHVpbmZvCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgX2RlYnVnICJrcHRpX2VuYWJsZWQ6IGZvdW5kICdrYWlzZXInCj4gZmxhZyBpbiAkcHJvY2Zz L2NwdWluZm8iCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKga3B0aV9lbmFibGVkPTEKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgWyAtZSAvc3lzL2tlcm5lbC9kZWJ1Zy94ODYv cHRpX2VuYWJsZWQKPiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBSZWQgSGF0IEJhY2twb3J0IGNyZWF0ZXMg YQo+IGRlZGljYXRlZCBmaWxlLCBzZWUgaHR0cHM6Ly9hY2Nlc3MucmVkaGF0LmNvbS9hcnRpY2xl cy8zMzExMzAxCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBrcHRpX2VuYWJsZWQ9JChjYXQKPiAvc3lzL2tlcm5lbC9kZWJ1Zy94 ODYvcHRpX2VuYWJsZWQgMj4vZGV2L251bGwpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrcHRpX2VuYWJsZWQ9JChAY2F0QAo+ IC9zeXMva2VybmVsL2RlYnVnL3g4Ni9wdGlfZW5hYmxlZCAyPi9kZXYvbnVsbCkKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBf ZGVidWcgImtwdGlfZW5hYmxlZDogZmlsZQo+IC9zeXMva2VybmVsL2RlYnVnL3g4Ni9wdGlfZW5h YmxlZCBleGlzdHMgYW5kIHNheXM6ICRrcHRpX2VuYWJsZWQiCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIGlzX3hlbl9kb20wOyB0aGVuCj4gKy3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBwdGlfeGVuX3B2X2RvbVU9JCh4bCBkbWVzZyB8IGdyZXAKPiAnWFBUSScgfCBncmVwICdEb21V IGVuYWJsZWQnIHwgaGVhZCAtMSkKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHB0aV94ZW5fcHZfZG9tVT0kKHhsIEBkbWVzZ0Ag fCBAZ3JlcEAKPiAnWFBUSScgfCBAZ3JlcEAgJ0RvbVUgZW5hYmxlZCcgfCBAaGVhZEAgLTEpCj4g Kwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoFsgLW4gIiRwdGlfeGVuX3B2X2RvbVUiIF0gJiYKPiBrcHRpX2VuYWJsZWQ9MQo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZmkKPiArQEAg LTQzMDcsNyArNDMwNyw3IEBAIGNoZWNrX0NWRV8yMDE3XzU3NTRfbGludXgoKQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlm IFsgLW4gIiRrcHRpX3N1cHBvcnQiIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYg WyAtZQo+ICIvc3lzL2tlcm5lbC9kZWJ1Zy94ODYvcHRpX2VuYWJsZWQiIF07IHRoZW4KPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGV4cGxhaW4gIllvdXIga2VybmVsCj4g c3VwcG9ydHMgUFRJIGJ1dCBpdCdzIGRpc2FibGVkLCB5b3UgY2FuIGVuYWJsZSBpdCB3aXRoIFxg ZWNobyAxID4KPiAvc3lzL2tlcm5lbC9kZWJ1Zy94ODYvcHRpX2VuYWJsZWRcYCIKPiArLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBlbGlmIGVjaG8gIiRrZXJuZWxfY21kbGluZSIgfAo+IGdyZXAgLXEgLXcg LWUgbm9wdGkgLWUgcHRpPW9mZjsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgZWNo byAiJGtlcm5lbF9jbWRsaW5lIiB8Cj4gQGdyZXBAIC1xIC13IC1lIG5vcHRpIC1lIHB0aT1vZmY7 IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGV4cGxhaW4gIllv dXIga2VybmVsCj4gc3VwcG9ydHMgUFRJIGJ1dCBpdCBoYXMgYmVlbiBkaXNhYmxlZCBvbiBjb21t YW5kLWxpbmUsIHJlbW92ZSB0aGUKPiBub3B0aSBvciBwdGk9b2ZmIG9wdGlvbiBmcm9tIHlvdXIg Ym9vdGxvYWRlciBjb25maWd1cmF0aW9uIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbHNlCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBleHBsYWluICJZb3VyIGtlcm5l bAo+IHN1cHBvcnRzIFBUSSBidXQgaXQgaGFzIGJlZW4gZGlzYWJsZWQsIGNoZWNrIFxgZG1lc2dc YCByaWdodCBhZnRlcgo+IGJvb3QgdG8gZmluZCBjbHVlcyB3aHkgdGhlIHN5c3RlbSBkaXNhYmxl ZCBpdCIKPiArQEAgLTQzNTgsNyArNDM1OCw3IEBAIGNoZWNrX0NWRV8yMDE3XzU3NTRfbGludXgo KQo+ICsgY2hlY2tfQ1ZFXzIwMTdfNTc1NF9ic2QoKQo+ICsgewo+ICvCoMKgwqDCoMKgwqDCoF9p bmZvX25vbCAiKiBLZXJuZWwgc3VwcG9ydHMgUGFnZSBUYWJsZSBJc29sYXRpb24gKFBUSSk6ICIK PiArLcKgwqDCoMKgwqDCoGtwdGlfZW5hYmxlZD0kKHN5c2N0bCAtbiB2bS5wbWFwLnB0aSAyPi9k ZXYvbnVsbCkKPiArK8KgwqDCoMKgwqDCoGtwdGlfZW5hYmxlZD0kKEBzeXNjdGxAIC1uIHZtLnBt YXAucHRpIDI+L2Rldi9udWxsKQo+ICvCoMKgwqDCoMKgwqDCoGlmIFsgLXogIiRrcHRpX2VuYWJs ZWQiIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyB5ZWxs b3cgTk8KPiArwqDCoMKgwqDCoMKgwqBlbHNlCj4gK0BAIC00NDI5LDcgKzQ0MjksNyBAQCBjaGVj a19DVkVfMjAxOF8zNjM5KCkKPiArwqDCoMKgwqDCoMKgwqBfaW5mbyAiXDAzM1sxOzM0bSRjdmUg YWthICckKGN2ZTJuYW1lICIkY3ZlIiknXDAzM1swbSIKPiArwqDCoMKgwqDCoMKgwqBpZiBbICIk b3MiID0gTGludXggXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjaGVj a19DVkVfMjAxOF8zNjM5X2xpbnV4Cj4gKy3CoMKgwqDCoMKgwqBlbGlmIGVjaG8gIiRvcyIgfCBn cmVwIC1xIEJTRDsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgZWxpZiBlY2hvICIkb3MiIHwgQGdyZXBA IC1xIEJTRDsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjaGVja19DVkVf MjAxOF8zNjM5X2JzZAo+ICvCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgX3dhcm4gIlVuc3VwcG9ydGVkIE9TICgkb3MpIgo+ICtAQCAtNDQ0OCwzMyAr NDQ0OCwzMyBAQCBjaGVja19DVkVfMjAxOF8zNjM5X2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqBp ZiBbICIkb3B0X3N5c2ZzX29ubHkiICE9IDEgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBfaW5mb19ub2wgIiogS2VybmVsIHN1cHBvcnRzIGRpc2FibGluZyBzcGVjdWxh dGl2ZQo+IHN0b3JlIGJ5cGFzcyAoU1NCKTogIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBpZiBbICIkb3B0X2xpdmUiID0gMSBdOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGdyZXAgLUVxICdTcGVjdWxhdGlvbi4/U3RvcmUu P0J5cGFzczonCj4gIiRwcm9jZnMvc2VsZi9zdGF0dXMiIDI+L2Rldi9udWxsOyB0aGVuCj4gKyvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIEBncmVwQCAtRXEg J1NwZWN1bGF0aW9uLj9TdG9yZS4/QnlwYXNzOicKPiAiJHByb2Nmcy9zZWxmL3N0YXR1cyIgMj4v ZGV2L251bGw7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrZXJuZWxfc3NiPSJmb3VuZCBpbgo+ICRwcm9jZnMvc2Vs Zi9zdGF0dXMiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgX2RlYnVnICJmb3VuZAo+IFNwZWN1bGF0aW9uLlN0b3JlLkJ5cGFz czogaW4gJHByb2Nmcy9zZWxmL3N0YXR1cyIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZp Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgYXJtNjQga2VybmVscyBjYW4gaGF2 ZSBjcHVfc2hvd19zcGVjX3N0b3JlX2J5cGFzcwo+IHdpdGggQVJNNjRfU1NCRCwgc28gZXhjbHVk ZSB0aGVtCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAteiAiJGtlcm5lbF9z c2IiIF0gJiYgWyAtbiAiJGtlcm5lbCIgXSAmJiAhIGdyZXAKPiAtcSAnYXJtNjRfc3lzXycgIiRr ZXJuZWwiOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGtlcm5lbF9zc2I9JCgiJHtvcHRfYXJjaF9wcmVmaXh9c3RyaW5ncyIKPiAiJGtlcm5lbCIg fCBncmVwIHNwZWNfc3RvcmVfYnlwYXNzIHwgaGVhZCAtbjEpOwo+ICsrwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGlmIFsgLXogIiRrZXJuZWxfc3NiIiBdICYmIFsgLW4gIiRrZXJuZWwiIF0g JiYgIQo+IEBncmVwQCAtcSAnYXJtNjRfc3lzXycgIiRrZXJuZWwiOyB0aGVuCj4gKyvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF9zc2I9JCgiQHN0cmlu Z3NAIiAiJGtlcm5lbCIgfCBAZ3JlcEAKPiBzcGVjX3N0b3JlX2J5cGFzcyB8IEBoZWFkQCAtbjEp Owo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgWyAtbiAi JGtlcm5lbF9zc2IiIF0gJiYga2VybmVsX3NzYj0iZm91bmQKPiAka2VybmVsX3NzYiBpbiBrZXJu ZWwiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCMgYXJtNjQga2VybmVscyBjYW4gaGF2ZSBjcHVfc2hvd19zcGVjX3N0 b3JlX2J5cGFzcwo+IHdpdGggQVJNNjRfU1NCRCwgc28gZXhjbHVkZSB0aGVtCj4gKy3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAteiAiJGtlcm5lbF9zc2IiIF0gJiYgWyAtbiAiJG9w dF9tYXAiIF0gJiYgIQo+IGdyZXAgLXEgJ2FybTY0X3N5c18nICIkb3B0X21hcCI7IHRoZW4KPiAr LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKga2VybmVsX3NzYj0k KGdyZXAgc3BlY19zdG9yZV9ieXBhc3MKPiAiJG9wdF9tYXAiIHwgYXdrICd7cHJpbnQgJDN9JyB8 IGhlYWQgLW4xKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLXogIiRrZXJu ZWxfc3NiIiBdICYmIFsgLW4gIiRvcHRfbWFwIiBdICYmICEKPiBAZ3JlcEAgLXEgJ2FybTY0X3N5 c18nICIkb3B0X21hcCI7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKga2VybmVsX3NzYj0kKEBncmVwQCBzcGVjX3N0b3JlX2J5cGFzcwo+ICIkb3B0 X21hcCIgfCBAYXdrQCAne3ByaW50ICQzfScgfCBAaGVhZEAgLW4xKQo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgWyAtbiAiJGtlcm5lbF9zc2IiIF0gJiYg a2VybmVsX3NzYj0iZm91bmQKPiAka2VybmVsX3NzYiBpbiBTeXN0ZW0ubWFwIgo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmaQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAjIGFybTY0IG9ubHk6Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLXog IiRrZXJuZWxfc3NiIiBdICYmIFsgLW4gIiRvcHRfbWFwIiBdOyB0aGVuCj4gKy3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF9zc2I9JChncmVwIC13IGNw dV9lbmFibGVfc3Nicwo+ICIkb3B0X21hcCIgfCBhd2sgJ3twcmludCAkM30nIHwgaGVhZCAtbjEp Cj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF9z c2I9JChAZ3JlcEAgLXcgY3B1X2VuYWJsZV9zc2JzCj4gIiRvcHRfbWFwIiB8IEBhd2tAICd7cHJp bnQgJDN9JyB8IEBoZWFkQCAtbjEpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBbIC1uICIka2VybmVsX3NzYiIgXSAmJiBrZXJuZWxfc3NiPSJmb3VuZAo+ ICRrZXJuZWxfc3NiIGluIFN5c3RlbS5tYXAiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLXogIiRrZXJuZWxf c3NiIiBdICYmIFsgLW4gIiRvcHRfY29uZmlnIiBdOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF9zc2I9JChncmVwIC13ICdDT05GSUdf QVJNNjRfU1NCRD15Jwo+ICIkb3B0X2NvbmZpZyIpCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF9zc2I9JChAZ3JlcEAgLXcgJ0NPTkZJR19BUk02 NF9TU0JEPXknCj4gIiRvcHRfY29uZmlnIikKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoFsgLW4gIiRrZXJuZWxfc3NiIiBdICYmCj4ga2VybmVsX3NzYj0i Q09ORklHX0FSTTY0X1NTQkQgZW5hYmxlZCBpbiBrY29uZmlnIgo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBmaQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbIC16 ICIka2VybmVsX3NzYiIgXSAmJiBbIC1uICIka2VybmVsIiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIHRoaXMgc3RyaW5nIG9ubHkgYXBw ZWFycyBpbiBrZXJuZWwgaWYKPiBDT05GSUdfQVJNNjRfU1NCRCBpcyBzZXQKPiArLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKga2VybmVsX3NzYj0kKGdyZXAgLXcg IlNwZWN1bGF0aXZlIFN0b3JlCj4gQnlwYXNzaW5nIFNhZmUgKFNTQlMpIiAiJGtlcm5lbCIpCj4g KyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF9zc2I9 JChAZ3JlcEAgLXcgIlNwZWN1bGF0aXZlIFN0b3JlCj4gQnlwYXNzaW5nIFNhZmUgKFNTQlMpIiAi JGtlcm5lbCIpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBbIC1uICIka2VybmVsX3NzYiIgXSAmJiBrZXJuZWxfc3NiPSJmb3VuZAo+ICdTcGVjdWxhdGl2 ZSBTdG9yZSBCeXBhc3NpbmcgU2FmZSAoU1NCUyknIGluIGtlcm5lbCIKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgZmkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyAv YXJtNjQgb25seQo+ICtAQCAtNDQ4OSwzMSArNDQ4OSwzMSBAQCBjaGVja19DVkVfMjAxOF8zNjM5 X2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAiJG9wdF9saXZl IiA9IDEgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIwo+IGh0dHBzOi8vZWxpeGlyLmJvb3RsaW4uY29tL2xpbnV4L3Y1LjAvc291cmNlL2Zz L3Byb2MvYXJyYXkuYyNMMzQwCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBfaW5mb19ub2wgIiogU1NCIG1pdGlnYXRpb24gaXMgZW5hYmxlZCBhbmQKPiBh Y3RpdmU6ICIKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg aWYgZ3JlcCAtRXEKPiAnU3BlY3VsYXRpb24uP1N0b3JlLj9CeXBhc3M6W1s6c3BhY2U6XV0rdGhy ZWFkJyAiJHByb2Nmcy9zZWxmL3N0YXR1cyIKPiAyPi9kZXYvbnVsbDsgdGhlbgo+ICsrwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBAZ3JlcEAgLUVxCj4gJ1Nw ZWN1bGF0aW9uLj9TdG9yZS4/QnlwYXNzOltbOnNwYWNlOl1dK3RocmVhZCcgIiRwcm9jZnMvc2Vs Zi9zdGF0dXMiCj4gMj4vZGV2L251bGw7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrZXJuZWxfc3NiZF9lbmFibGVk PTEKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBwc3RhdHVzIGdyZWVuIFlFUyAicGVyLXRocmVhZCB0aHJvdWdoCj4gcHJjdGwi Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgZ3Jl cCAtRXEKPiAnU3BlY3VsYXRpb24uP1N0b3JlLj9CeXBhc3M6W1s6c3BhY2U6XV0rZ2xvYmFsbHkg bWl0aWdhdGVkJwo+ICIkcHJvY2ZzL3NlbGYvc3RhdHVzIiAyPi9kZXYvbnVsbDsgdGhlbgo+ICsr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIEBncmVwQCAt RXEKPiAnU3BlY3VsYXRpb24uP1N0b3JlLj9CeXBhc3M6W1s6c3BhY2U6XV0rZ2xvYmFsbHkgbWl0 aWdhdGVkJwo+ICIkcHJvY2ZzL3NlbGYvc3RhdHVzIiAyPi9kZXYvbnVsbDsgdGhlbgo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGtlcm5lbF9zc2JkX2VuYWJsZWQ9Mgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgZ3JlZW4gWUVTICJnbG9iYWwi Cj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgZ3Jl cCAtRXEKPiAnU3BlY3VsYXRpb24uP1N0b3JlLj9CeXBhc3M6W1s6c3BhY2U6XV0rdnVsbmVyYWJs ZScKPiAiJHByb2Nmcy9zZWxmL3N0YXR1cyIgMj4vZGV2L251bGw7IHRoZW4KPiArK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiBAZ3JlcEAgLUVxCj4gJ1Nw ZWN1bGF0aW9uLj9TdG9yZS4/QnlwYXNzOltbOnNwYWNlOl1dK3Z1bG5lcmFibGUnCj4gIiRwcm9j ZnMvc2VsZi9zdGF0dXMiIDI+L2Rldi9udWxsOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKga2VybmVsX3NzYmRfZW5h YmxlZD0wCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgcHN0YXR1cyB5ZWxsb3cgTk8KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiBncmVwIC1FcQo+ICdTcGVjdWxhdGlvbi4/U3Rv cmUuP0J5cGFzczpbWzpzcGFjZTpdXStub3QgdnVsbmVyYWJsZScKPiAiJHByb2Nmcy9zZWxmL3N0 YXR1cyIgMj4vZGV2L251bGw7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZWxpZiBAZ3JlcEAgLUVxCj4gJ1NwZWN1bGF0aW9uLj9TdG9yZS4/Qnlw YXNzOltbOnNwYWNlOl1dK25vdCB2dWxuZXJhYmxlJwo+ICIkcHJvY2ZzL3NlbGYvc3RhdHVzIiAy Pi9kZXYvbnVsbDsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF9zc2JkX2VuYWJsZWQ9LTIKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBw c3RhdHVzIGJsdWUgTk8gIm5vdCB2dWxuZXJhYmxlIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIGdyZXAgLUVxCj4gJ1NwZWN1bGF0aW9uLj9TdG9y ZS4/QnlwYXNzOltbOnNwYWNlOl1dK3Vua25vd24nCj4gIiRwcm9jZnMvc2VsZi9zdGF0dXMiIDI+ L2Rldi9udWxsOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGVsaWYgQGdyZXBAIC1FcQo+ICdTcGVjdWxhdGlvbi4/U3RvcmUuP0J5cGFzczpbWzpz cGFjZTpdXSt1bmtub3duJwo+ICIkcHJvY2ZzL3NlbGYvc3RhdHVzIiAyPi9kZXYvbnVsbDsgdGhl bgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGtlcm5lbF9zc2JkX2VuYWJsZWQ9MAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgYmx1ZSBOTwo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxzZQo+ICst wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgcHN0YXR1cyBibHVlIFVOS05PV04gInVua25vd24gdmFsdWU6Cj4gJChncmVwIC1FICdTcGVj dWxhdGlvbi4/U3RvcmUuP0J5cGFzczonICIkcHJvY2ZzL3NlbGYvc3RhdHVzIgo+IDI+L2Rldi9u dWxsIHwgY3V0IC1kOiAtZjItKSIKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgYmx1ZSBVTktOT1dOICJ1bmtub3du IHZhbHVlOgo+ICQoQGdyZXBAIC1FICdTcGVjdWxhdGlvbi4/U3RvcmUuP0J5cGFzczonICIkcHJv Y2ZzL3NlbGYvc3RhdHVzIgo+IDI+L2Rldi9udWxsIHwgQGN1dEAgLWQ6IC1mMi0pIgo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZmkKPiArCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICIka2VybmVsX3Nz YmRfZW5hYmxlZCIgPSAxIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfaW5mb19ub2wgIiogU1NCIG1pdGlnYXRp b24gY3VycmVudGx5Cj4gYWN0aXZlIGZvciBzZWxlY3RlZCBwcm9jZXNzZXM6ICIKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAj IHNpbGVuY2UgZ3JlcCdzIHN0ZGVyciBoZXJlIHRvIGF2b2lkCj4gRU5PRU5UIGVycm9ycyBmcm9t IHByb2Nlc3NlcyB0aGF0IGhhdmUgZXhpdGVkIHNpbmNlIHRoZSBzaGVsbCdzCj4gZXhwYW5zaW9u IG9mIHRoZSAqCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBtaXRpZ2F0ZWRfcHJvY2Vzc2VzPSQoZmluZCAvcHJvYyAtCj4gbWlu ZGVwdGggMiAtbWF4ZGVwdGggMiAtdHlwZSBmIC1uYW1lIHN0YXR1cyAtcHJpbnQwIDI+L2Rldi9u dWxsIFwKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8IHhhcmdzIC1yMCBncmVwIC1FbAo+ICdTcGVj dWxhdGlvbi4/U3RvcmUuP0J5cGFzczpbWzpzcGFjZTpdXSt0aHJlYWQgKGZvcmNlICk/bWl0aWdh dGVkJwo+IDI+L2Rldi9udWxsIFwKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8IHNlZCBzL3N0YXR1 cy9leGUvIHwgeGFyZ3MgLQo+IHIgLW4xIHJlYWRsaW5rIC1mIDI+L2Rldi9udWxsIHwgeGFyZ3Mg LXIgLW4xIGJhc2VuYW1lIHwgc29ydCAtdSB8IHRyCj4gIlxuIiAiICIgfCBzZWQgJ3MvICQvLycp Cj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBtaXRpZ2F0ZWRfcHJvY2Vzc2VzPSQoQGZpbmRAIC9wcm9jIC0KPiBtaW5kZXB0aCAy IC1tYXhkZXB0aCAyIC10eXBlIGYgLW5hbWUgc3RhdHVzIC1wcmludDAgMj4vZGV2L251bGwgXAo+ ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoHwgQHhhcmdzQCAtcjAgQGdyZXBAIC1FbAo+ICdTcGVjdWxh dGlvbi4/U3RvcmUuP0J5cGFzczpbWzpzcGFjZTpdXSt0aHJlYWQgKGZvcmNlICk/bWl0aWdhdGVk Jwo+IDI+L2Rldi9udWxsIFwKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8IEBzZWRAIHMvc3RhdHVz L2V4ZS8gfAo+IEB4YXJnc0AgLXIgLW4xIHJlYWRsaW5rIC1mIDI+L2Rldi9udWxsIHwgQHhhcmdz QCAtciAtbjEgQGJhc2VuYW1lQCB8Cj4gQHNvcnRAIC11IHwgQHRyQCAiXG4iICIgIiB8IEBzZWRA ICdzLyAkLy8nKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLW4gIiRtaXRpZ2F0ZWRfcHJvY2Vzc2VzIiBdOwo+IHRo ZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyBncmVlbiBZRVMKPiAiJG1pdGlnYXRl ZF9wcm9jZXNzZXMiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxzZQo+ICtAQCAtNDU2NSw3ICs0NTY1LDcgQEAgY2hlY2tf Q1ZFXzIwMThfMzYzOV9saW51eCgpCj4gKyBjaGVja19DVkVfMjAxOF8zNjM5X2JzZCgpCj4gKyB7 Cj4gK8KgwqDCoMKgwqDCoMKgX2luZm9fbm9sICIqIEtlcm5lbCBzdXBwb3J0cyBzcGVjdWxhdGlv biBzdG9yZSBieXBhc3M6ICIKPiArLcKgwqDCoMKgwqDCoGlmIHN5c2N0bCBody5zcGVjX3N0b3Jl X2J5cGFzc19kaXNhYmxlID4vZGV2L251bGwgMj4mMTsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgaWYg QHN5c2N0bEAgaHcuc3BlY19zdG9yZV9ieXBhc3NfZGlzYWJsZSA+L2Rldi9udWxsIDI+JjE7Cj4g dGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrZXJuZWxfc3NiPTEKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyBncmVlbiBZRVMKPiArwqDCoMKgwqDC oMKgwqBlbHNlCj4gK0BAIC00NTc0LDcgKzQ1NzQsNyBAQCBjaGVja19DVkVfMjAxOF8zNjM5X2Jz ZCgpCj4gK8KgwqDCoMKgwqDCoMKgZmkKPiArCj4gK8KgwqDCoMKgwqDCoMKgX2luZm9fbm9sICIq IFNwZWN1bGF0aW9uIHN0b3JlIGJ5cGFzcyBpcyBhZG1pbmlzdHJhdGl2ZWx5Cj4gZW5hYmxlZDog Igo+ICstwqDCoMKgwqDCoMKgc3NiX2VuYWJsZWQ9JChzeXNjdGwgLW4gaHcuc3BlY19zdG9yZV9i eXBhc3NfZGlzYWJsZQo+IDI+L2Rldi9udWxsKQo+ICsrwqDCoMKgwqDCoMKgc3NiX2VuYWJsZWQ9 JChAc3lzY3RsQCAtbiBody5zcGVjX3N0b3JlX2J5cGFzc19kaXNhYmxlCj4gMj4vZGV2L251bGwp Cj4gK8KgwqDCoMKgwqDCoMKgX2RlYnVnICJody5zcGVjX3N0b3JlX2J5cGFzc19kaXNhYmxlPSRz c2JfZW5hYmxlZCIKPiArwqDCoMKgwqDCoMKgwqBjYXNlICIkc3NiX2VuYWJsZWQiIGluCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDApIHBzdGF0dXMgeWVsbG93IE5PICJkaXNhYmxl ZCI7Owo+ICtAQCAtNDU4NCw3ICs0NTg0LDcgQEAgY2hlY2tfQ1ZFXzIwMThfMzYzOV9ic2QoKQo+ ICvCoMKgwqDCoMKgwqDCoGVzYWMKPiArCj4gK8KgwqDCoMKgwqDCoMKgX2luZm9fbm9sICIqIFNw ZWN1bGF0aW9uIHN0b3JlIGJ5cGFzcyBpcyBjdXJyZW50bHkgYWN0aXZlOiAiCj4gKy3CoMKgwqDC oMKgwqBzc2JfYWN0aXZlPSQoc3lzY3RsIC1uIGh3LnNwZWNfc3RvcmVfYnlwYXNzX2Rpc2FibGVf YWN0aXZlCj4gMj4vZGV2L251bGwpCj4gKyvCoMKgwqDCoMKgwqBzc2JfYWN0aXZlPSQoQHN5c2N0 bEAgLW4gaHcuc3BlY19zdG9yZV9ieXBhc3NfZGlzYWJsZV9hY3RpdmUKPiAyPi9kZXYvbnVsbCkK PiArwqDCoMKgwqDCoMKgwqBfZGVidWcgImh3LnNwZWNfc3RvcmVfYnlwYXNzX2Rpc2FibGVfYWN0 aXZlPSRzc2JfYWN0aXZlIgo+ICvCoMKgwqDCoMKgwqDCoGNhc2UgIiRzc2JfYWN0aXZlIiBpbgo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAxKSBwc3RhdHVzIGdyZWVuIFlFUzs7Cj4g K0BAIC00NjU2LDcgKzQ2NTYsNyBAQCBjaGVja19DVkVfMjAxOF8zNjIwKCkKPiArwqDCoMKgwqDC oMKgwqBfaW5mbyAiXDAzM1sxOzM0bSRjdmUgYWthICckKGN2ZTJuYW1lICIkY3ZlIiknXDAzM1sw bSIKPiArwqDCoMKgwqDCoMKgwqBpZiBbICIkb3MiID0gTGludXggXTsgdGhlbgo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjaGVja19DVkVfMjAxOF8zNjIwX2xpbnV4Cj4gKy3CoMKg wqDCoMKgwqBlbGlmIGVjaG8gIiRvcyIgfCBncmVwIC1xIEJTRDsgdGhlbgo+ICsrwqDCoMKgwqDC oMKgZWxpZiBlY2hvICIkb3MiIHwgQGdyZXBAIC1xIEJTRDsgdGhlbgo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBjaGVja19DVkVfMjAxOF8zNjIwX2JzZAo+ICvCoMKgwqDCoMKgwqDC oGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX3dhcm4gIlVuc3VwcG9ydGVk IE9TICgkb3MpIgo+ICtAQCAtNDY3NCwxNCArNDY3NCwxNCBAQCBjaGVja19DVkVfMjAxOF8zNjIw X2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqBmaQo+ICvCoMKgwqDCoMKgwqDCoGlmIFsgIiRvcHRf c3lzZnNfb25seSIgIT0gMSBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oF9pbmZvX25vbCAiKiBLZXJuZWwgc3VwcG9ydHMgUFRFIGludmVyc2lvbjogIgo+ICstwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICEgY29tbWFuZCAtdiAiJHtvcHRfYXJjaF9wcmVmaXh9 c3RyaW5ncyIKPiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBpZiAhIGNvbW1hbmQgLXYgIkBzdHJpbmdzQCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVu Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVz IHllbGxvdyBVTktOT1dOICJtaXNzaW5nICdzdHJpbmdzJwo+IHRvb2wsIHBsZWFzZSBpbnN0YWxs IGl0Igo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHRl aW52X3N1cHBvcnRlZD0tMQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIFsg LW4gIiRrZXJuZWxfZXJyIiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIHllbGxvdyBVTktOT1dOICIka2VybmVsX2VyciIKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHB0ZWludl9zdXBw b3J0ZWQ9LTEKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxzZQo+ICstwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAiJHtvcHRfYXJjaF9wcmVm aXh9c3RyaW5ncyIgIiRrZXJuZWwiIHwKPiBncmVwIC1GcSAnUFRFIEludmVyc2lvbic7IHRoZW4K PiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgIkBzdHJp bmdzQCIgIiRrZXJuZWwiIHwgQGdyZXBAIC1GcSAnUFRFCj4gSW52ZXJzaW9uJzsgdGhlbgo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHBzdGF0dXMgZ3JlZW4gWUVTICJmb3VuZCBpbiBrZXJuZWwKPiBpbWFnZSIKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBf ZGVidWcgInB0ZWludjogZm91bmQgcHRlIGludmVyc2lvbgo+IGV2aWRlbmNlIGluIGtlcm5lbCBp bWFnZSIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBwdGVpbnZfc3VwcG9ydGVkPTEKPiArQEAgLTQ2OTQsNyArNDY5NCw3IEBA IGNoZWNrX0NWRV8yMDE4XzM2MjBfbGludXgoKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBfaW5mb19ub2wgIiogUFRFIGludmVyc2lvbiBlbmFibGVkIGFuZCBhY3RpdmU6ICIKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAiJG9wdF9saXZlIiA9IDEgXTsgdGhl bgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAt biAiJGZ1bGxtc2ciIF07IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGVjaG8gIiRmdWxsbXNnIiB8IGdyZXAgLXEK PiAnTWl0aWdhdGlvbjogUFRFIEludmVyc2lvbic7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGVjaG8gIiRmdWxs bXNnIiB8IEBncmVwQCAtcQo+ICdNaXRpZ2F0aW9uOiBQVEUgSW52ZXJzaW9uJzsgdGhlbgo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIGdyZWVuIFlFUwo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBwdGVpbnZfYWN0aXZlPTEKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbHNlCj4gK0BAIC00NzQyLDcgKzQ3NDIsNyBA QCBjaGVja19DVkVfMjAxOF8zNjIwX2JzZCgpCj4gK8KgwqDCoMKgwqDCoMKgZWxzZQo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBfZGVidWcgInZtbSBtb2R1bGUgYWxyZWFkeSBsb2Fk ZWQiCj4gK8KgwqDCoMKgwqDCoMKgZmkKPiArLcKgwqDCoMKgwqDCoGlmIHN5c2N0bCBody52bW0u dm14LmwxZF9mbHVzaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiArK8KgwqDCoMKgwqDCoGlmIEBz eXNjdGxAIGh3LnZtbS52bXgubDFkX2ZsdXNoID4vZGV2L251bGwgMj4mMTsgdGhlbgo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjCj4gaHR0cHM6Ly9zZWN1cml0eS5GcmVlQlNELm9y Zy9wYXRjaGVzL1NBLTE4OjA5L2wxdGYtMTEuMi5wYXRjaAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAjIHRoaXMgaXMgdmVyeSBkaWZmaWN1bHQgdG8gZGV0ZWN0IHRoYXQgdGhlIGtl cm5lbAo+IHJlc2VydmVkIHRoZSAwIHBhZ2UsIGJ1dCB0aGlzIGZpeAo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAjIGlzIHBhcnQgb2YgdGhlIGV4YWN0IHNhbWUgcGF0Y2ggdGhhbiB0 aGUgb3RoZXIgTDFURgo+IENWRSwgc28gd2UgZGV0ZWN0IGl0Cj4gK0BAIC00NzcyLDcgKzQ3NzIs NyBAQCBjaGVja19DVkVfMjAxOF8zNjQ2KCkKPiArwqDCoMKgwqDCoMKgwqBfaW5mbyAiXDAzM1sx OzM0bSRjdmUgYWthICckKGN2ZTJuYW1lICIkY3ZlIiknXDAzM1swbSIKPiArwqDCoMKgwqDCoMKg wqBpZiBbICIkb3MiID0gTGludXggXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBjaGVja19DVkVfMjAxOF8zNjQ2X2xpbnV4Cj4gKy3CoMKgwqDCoMKgwqBlbGlmIGVjaG8g IiRvcyIgfCBncmVwIC1xIEJTRDsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgZWxpZiBlY2hvICIkb3Mi IHwgQGdyZXBAIC1xIEJTRDsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBj aGVja19DVkVfMjAxOF8zNjQ2X2JzZAo+ICvCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgX3dhcm4gIlVuc3VwcG9ydGVkIE9TICgkb3MpIgo+ICtAQCAt NDc5OCw3ICs0Nzk4LDcgQEAgY2hlY2tfQ1ZFXzIwMThfMzY0Nl9saW51eCgpCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgIiRvcHRfbGl2ZSIgPSAxIF07IHRoZW4KPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICEgWyAtcgo+IC9z eXMvbW9kdWxlL2t2bV9pbnRlbC9wYXJhbWV0ZXJzL2VwdCBdOyB0aGVuCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1 cyBibHVlIE4vQSAidGhlIGt2bV9pbnRlbAo+IG1vZHVsZSBpcyBub3QgbG9hZGVkIgo+ICstwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIFsgIiQoY2F0Cj4g L3N5cy9tb2R1bGUva3ZtX2ludGVsL3BhcmFtZXRlcnMvZXB0KSIgPSBOIF07IHRoZW4KPiArK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiBbICIkKEBjYXRA Cj4gL3N5cy9tb2R1bGUva3ZtX2ludGVsL3BhcmFtZXRlcnMvZXB0KSIgPSBOIF07IHRoZW4KPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBwc3RhdHVzIGdyZWVuIFlFUwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVwdF9kaXNhYmxlZD0xCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbHNlCj4gK0BAIC00ODEwLDE1 ICs0ODEwLDE1IEBAIGNoZWNrX0NWRV8yMDE4XzM2NDZfbGludXgoKQo+ICsKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgX2luZm8gIiogTWl0aWdhdGlvbiAyIgo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBfaW5mb19ub2wgIsKgICogTDFEIGZsdXNoIGlzIHN1cHBvcnRl ZCBieSBrZXJuZWw6ICIKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICIkb3B0 X2xpdmUiID0gMSBdICYmIGdyZXAgLXF3IGZsdXNoX2wxZAo+ICIkcHJvY2ZzL2NwdWluZm8iOyB0 aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAiJG9wdF9saXZlIiA9IDEg XSAmJiBAZ3JlcEAgLXF3IGZsdXNoX2wxZAo+ICIkcHJvY2ZzL2NwdWluZm8iOyB0aGVuCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsMWRfa2VybmVsPSJm b3VuZCBmbHVzaF9sMWQgaW4KPiAkcHJvY2ZzL2NwdWluZm8iCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgLXog IiRsMWRfa2VybmVsIiBdOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGlmICEgY29tbWFuZCAtdiAiJHtvcHRfYXJjaF9wcmVmaXh9c3RyaW5ncyIK PiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgaWYgISBjb21tYW5kIC12ICJAc3RyaW5nc0AiID4vZGV2L251bGwgMj4m MTsKPiB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgbDFkX2tlcm5lbF9lcnI9Im1pc3NpbmcKPiAnJHtvcHRfYXJjaF9w cmVmaXh9c3RyaW5ncycgdG9vbCwgcGxlYXNlIGluc3RhbGwgaXQsIHVzdWFsbHkgaXQncyBpbgo+ IHRoZSBiaW51dGlscyBwYWNrYWdlIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZWxpZiBbIC1uICIka2VybmVsX2VyciIgXTsgdGhlbgo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGwx ZF9rZXJuZWxfZXJyPSIka2VybmVsX2VyciIKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgZWxpZiAiJHtvcHRfYXJjaF9wcmVmaXh9c3RyaW5ncyIgIiRrZXJu ZWwiIHwKPiBncmVwIC1xdyBmbHVzaF9sMWQ7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiAiQHN0cmluZ3NAIiAiJGtlcm5lbCIgfCBAZ3Jl cEAgLXF3Cj4gZmx1c2hfbDFkOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbDFkX2tlcm5lbD0nZm91bmQgZmx1c2hf bDFkIGluIGtlcm5lbAo+IGltYWdlJwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZmkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZmkKPiAr QEAgLTQ4MzksMjAgKzQ4MzksMjAgQEAgY2hlY2tfQ1ZFXzIwMThfMzY0Nl9saW51eCgpCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIyAkbDFkc3RhdHVzIGlzIG9uZSBvZgo+IChhdXRvfHZ1bG5lcmFibGV8Y29uZGl0aW9uYWwg Y2FjaGUgZmx1c2hlc3xjYWNoZSBmbHVzaGVzfEVQVAo+IGRpc2FibGVkfGZsdXNoIG5vdCBuZWNl c3NhcnkpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIyAkc210c3RhdHVzIGlzIG9uZSBvZgo+ICh2dWxuZXJhYmxlfGRpc2Fi bGVkKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCMgY2FuIGFsc28ganVzdCBiZSAiTm90IGFmZmVjdGVkIgo+ICstwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYg ZWNobyAiJGZ1bGxtc2ciIHwgZ3JlcCAtRXEgLWUgJ05vdAo+IGFmZmVjdGVkJyAtZSAnKFZNWDp8 TDFEKSAoRVBUIGRpc2FibGVkfHZ1bG5lcmFibGV8Zmx1c2ggbm90Cj4gbmVjZXNzYXJ5KSc7IHRo ZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGlmIGVjaG8gIiRmdWxsbXNnIiB8IEBncmVwQCAtRXEgLWUKPiAnTm90IGFmZmVj dGVkJyAtZSAnKFZNWDp8TDFEKSAoRVBUIGRpc2FibGVkfHZ1bG5lcmFibGV8Zmx1c2ggbm90Cj4g bmVjZXNzYXJ5KSc7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbDFkX21vZGU9MAo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIHllbGxvdyBOTwo+ICstwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiBlY2hvICIk ZnVsbG1zZyIgfCBncmVwIC1FcQo+ICcoVk1YOnxMMUQpIGNvbmRpdGlvbmFsIGNhY2hlIGZsdXNo ZXMnOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBlbGlmIGVjaG8gIiRmdWxsbXNnIiB8IEBncmVwQCAtRXEKPiAnKFZN WDp8TDFEKSBjb25kaXRpb25hbCBjYWNoZSBmbHVzaGVzJzsgdGhlbgo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBsMWRfbW9kZT0xCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgZ3JlZW4g WUVTCj4gImNvbmRpdGlvbmFsIGZsdXNoZXMiCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIGVjaG8gIiRmdWxsbXNnIiB8 IGdyZXAgLUVxCj4gJyhWTVg6fEwxRCkgY2FjaGUgZmx1c2hlcyc7IHRoZW4KPiArK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYg ZWNobyAiJGZ1bGxtc2ciIHwgQGdyZXBAIC1FcQo+ICcoVk1YOnxMMUQpIGNhY2hlIGZsdXNoZXMn OyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGwxZF9tb2RlPTIKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgcHN0YXR1cyBncmVlbiBZRVMKPiAidW5jb25kaXRpb25hbCBmbHVzaGVzIgo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgaXNfeGVuX2RvbTA7IHRoZW4KPiAr LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbDFkX3hlbl9oYXJkd2FyZT0kKHhs Cj4gZG1lc2cgfCBncmVwICdIYXJkd2FyZSBmZWF0dXJlczonIHwgZ3JlcCAnTDFEX0ZMVVNIJyB8 IGhlYWQgLTEpCj4gKy0KPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGwxZF94 ZW5faHlwZXJ2aXNvcj0kKHhsCj4gZG1lc2cgfCBncmVwICdYZW4gc2V0dGluZ3M6JyB8IGdyZXAg J0wxRF9GTFVTSCcgfCBoZWFkIC0xKQo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBsMWRfeGVuX3B2X2RvbVU9JCh4bAo+IGRtZXNnIHwgZ3JlcCAnUFYgTDFURiBzaGFkb3dp bmc6JyB8IGdyZXAgJ0RvbVUgZW5hYmxlZCcgfCBoZWFkIC0xKQo+ICsrwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBsMWRfeGVuX2hhcmR3YXJlPSQoeGwKPiBAZG1lc2dAIHwgQGdy ZXBAICdIYXJkd2FyZSBmZWF0dXJlczonIHwgQGdyZXBAICdMMURfRkxVU0gnIHwgQGhlYWRAIC0K PiAxKQo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsMWRfeGVuX2h5cGVy dmlzb3I9JCgKPiB4bCBAZG1lc2dAIHwgQGdyZXBAICdYZW4gc2V0dGluZ3M6JyB8IEBncmVwQCAn TDFEX0ZMVVNIJyB8IEBoZWFkQCAtMSkKPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgbDFkX3hlbl9wdl9kb21VPSQoeGwKPiBAZG1lc2dAIHwgQGdyZXBAICdQViBMMVRGIHNo YWRvd2luZzonIHwgQGdyZXBAICdEb21VIGVuYWJsZWQnIHwKPiBAaGVhZEAgLTEpCj4gKwo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAtbgo+ICIkbDFkX3hlbl9o YXJkd2FyZSIgXSAmJiBbIC1uICIkbDFkX3hlbl9oeXBlcnZpc29yIiBdICYmIFsgLW4KPiAiJGwx ZF94ZW5fcHZfZG9tVSIgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGwxZF9tb2RlPTUKPiArQEAgLTQ4ODMsNyArNDg4Myw3IEBA IGNoZWNrX0NWRV8yMDE4XzM2NDZfbGludXgoKQo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgX2luZm9fbm9sICLCoCAqIEhhcmR3YXJlLWJhY2tlZCBMMUQgZmx1c2ggc3VwcG9y dGVkOiAiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIFsgIiRvcHRfbGl2ZSIg PSAxIF07IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaWYgZ3JlcCAtcXcgZmx1c2hfbDFkICIkcHJvY2ZzL2NwdWluZm8iIHx8IFsKPiAtbiAiJGwx ZF94ZW5faGFyZHdhcmUiIF07IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgaWYgQGdyZXBAIC1xdyBmbHVzaF9sMWQgIiRwcm9jZnMvY3B1aW5mbyIg fHwKPiBbIC1uICIkbDFkX3hlbl9oYXJkd2FyZSIgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgZ3Jl ZW4gWUVTICJwZXJmb3JtYW5jZSBpbXBhY3QKPiBvZiB0aGUgbWl0aWdhdGlvbiB3aWxsIGJlIGdy ZWF0bHkgcmVkdWNlZCIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIGJsdWUgTk8gImZsdXNoIHdpbGwgYmUgZG9uZQo+ IGluIHNvZnR3YXJlLCB0aGlzIGlzIHNsb3dlciIKPiArQEAgLTQ5NTUsNyArNDk1NSw3IEBAIGNo ZWNrX0NWRV8yMDE4XzM2NDZfbGludXgoKQo+ICsgY2hlY2tfQ1ZFXzIwMThfMzY0Nl9ic2QoKQo+ ICsgewo+ICvCoMKgwqDCoMKgwqDCoF9pbmZvX25vbCAiKiBLZXJuZWwgc3VwcG9ydHMgTDFEIGZs dXNoaW5nOiAiCj4gKy3CoMKgwqDCoMKgwqBpZiBzeXNjdGwgaHcudm1tLnZteC5sMWRfZmx1c2gg Pi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqBpZiBAc3lzY3RsQCBody52bW0u dm14LmwxZF9mbHVzaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgcHN0YXR1cyBncmVlbiBZRVMKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKga2VybmVsX2wxZF9zdXBwb3J0ZWQ9MQo+ICvCoMKgwqDCoMKgwqDCoGVsc2UKPiArQEAg LTQ5NjQsNyArNDk2NCw3IEBAIGNoZWNrX0NWRV8yMDE4XzM2NDZfYnNkKCkKPiArwqDCoMKgwqDC oMKgwqBmaQo+ICsKPiArwqDCoMKgwqDCoMKgwqBfaW5mb19ub2wgIiogTDFEIGZsdXNoaW5nIGlz IGVuYWJsZWQ6ICIKPiArLcKgwqDCoMKgwqDCoGtlcm5lbF9sMWRfZW5hYmxlZD0kKHN5c2N0bCAt biBody52bW0udm14LmwxZF9mbHVzaAo+IDI+L2Rldi9udWxsKQo+ICsrwqDCoMKgwqDCoMKga2Vy bmVsX2wxZF9lbmFibGVkPSQoQHN5c2N0bEAgLW4gaHcudm1tLnZteC5sMWRfZmx1c2gKPiAyPi9k ZXYvbnVsbCkKPiArwqDCoMKgwqDCoMKgwqBjYXNlICIka2VybmVsX2wxZF9lbmFibGVkIiBpbgo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAwKSBwc3RhdHVzIHllbGxvdyBOTzs7Cj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDEpIHBzdGF0dXMgZ3JlZW4gWUVTOzsKPiAr QEAgLTUwMTgsNyArNTAxOCw3IEBAIGNoZWNrX0NWRV8yMDE4XzEyMTI3KCkKPiArICMjIyMjIyMj IyMjIyMjIyMjIyMKPiArICMgTURTVU0gU0VDVElPTgo+ICsKPiArLSMgTWljcm9hcmNoaXRlY3R1 cmFsIERhdGEgU2FtcGxpbmcgVW5jYWNoZWFibGUgTWVtb3J5Cj4gKysjIE1pY3JvYXJjaGl0ZWN0 dXJhbCBEYXRhIFNhbXBsaW5nIFVuY2FjaGVhYmxlIE1lbW9yeQo+ICsgY2hlY2tfQ1ZFXzIwMTlf MTEwOTEoKQo+ICsgewo+ICvCoMKgwqDCoMKgwqDCoGN2ZT0nQ1ZFLTIwMTktMTEwOTEnCj4gK0BA IC01MDMyLDcgKzUwMzIsNyBAQCBjaGVja19tZHMoKQo+ICvCoMKgwqDCoMKgwqDCoF9pbmZvICJc MDMzWzE7MzRtJGN2ZSBha2EgJyQoY3ZlMm5hbWUgIiRjdmUiKSdcMDMzWzBtIgo+ICvCoMKgwqDC oMKgwqDCoGlmIFsgIiRvcyIgPSBMaW51eCBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGNoZWNrX21kc19saW51eCAiJGN2ZSIKPiArLcKgwqDCoMKgwqDCoGVsaWYgZWNo byAiJG9zIiB8IGdyZXAgLXEgQlNEOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqBlbGlmIGVjaG8gIiRv cyIgfCBAZ3JlcEAgLXEgQlNEOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGNoZWNrX21kc19ic2QgIiRjdmUiCj4gK8KgwqDCoMKgwqDCoMKgZWxzZQo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBfd2FybiAiVW5zdXBwb3J0ZWQgT1MgKCRvcykiCj4gK0BAIC01 MDQzLDcgKzUwNDMsNyBAQCBjaGVja19tZHNfYnNkKCkKPiArIHsKPiArwqDCoMKgwqDCoMKgwqBf aW5mb19ub2wgIiogS2VybmVsIHN1cHBvcnRzIHVzaW5nIE1EX0NMRUFSIG1pdGlnYXRpb246ICIK PiArwqDCoMKgwqDCoMKgwqBpZiBbICIkb3B0X2xpdmUiID0gMSBdOyB0aGVuCj4gKy3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgc3lzY3RsIGh3Lm1kc19kaXNhYmxlID4vZGV2L251bGwg Mj4mMTsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIEBzeXNjdGxAIGh3 Lm1kc19kaXNhYmxlID4vZGV2L251bGwgMj4mMTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyBncmVlbiBZRVMKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF9tZF9jbGVhcj0xCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArQEAgLTUwNTEsNyArNTA1MSw3 IEBAIGNoZWNrX21kc19ic2QoKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKga2VybmVsX21kX2NsZWFyPTAKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgZmkKPiArwqDCoMKgwqDCoMKgwqBlbHNlCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgaWYgZ3JlcCAtRnEgaHcubWRzX2Rpc2FibGUgJG9wdF9rZXJuZWw7IHRoZW4KPiArK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBAZ3JlcEAgLUZxIGh3Lm1kc19kaXNhYmxlICRv cHRfa2VybmVsOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBwc3RhdHVzIGdyZWVuIFlFUwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKga2VybmVsX21kX2NsZWFyPTEKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgZWxzZQo+ICtAQCAtNTA2MSw4ICs1MDYxLDggQEAgY2hlY2tfbWRzX2JzZCgp Cj4gK8KgwqDCoMKgwqDCoMKgZmkKPiArCj4gK8KgwqDCoMKgwqDCoMKgX2luZm9fbm9sICIqIENQ VSBIeXBlci1UaHJlYWRpbmcgKFNNVCkgaXMgZGlzYWJsZWQ6ICIKPiArLcKgwqDCoMKgwqDCoGlm IHN5c2N0bCBtYWNoZGVwLmh5cGVydGhyZWFkaW5nX2FsbG93ZWQgPi9kZXYvbnVsbCAyPiYxOwo+ IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrZXJuZWxfc210X2FsbG93ZWQ9 JChzeXNjdGwgLW4KPiBtYWNoZGVwLmh5cGVydGhyZWFkaW5nX2FsbG93ZWQgMj4vZGV2L251bGwp Cj4gKyvCoMKgwqDCoMKgwqBpZiBAc3lzY3RsQCBtYWNoZGVwLmh5cGVydGhyZWFkaW5nX2FsbG93 ZWQgPi9kZXYvbnVsbCAyPiYxOwo+IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBrZXJuZWxfc210X2FsbG93ZWQ9JChAc3lzY3RsQCAtbgo+IG1hY2hkZXAuaHlwZXJ0aHJlYWRp bmdfYWxsb3dlZCAyPi9kZXYvbnVsbCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg aWYgWyAiJGtlcm5lbF9zbXRfYWxsb3dlZCIgPSAxIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgeWVsbG93IE5PCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArQEAgLTUwNzQsNyArNTA3NCw3IEBAIGNo ZWNrX21kc19ic2QoKQo+ICsKPiArwqDCoMKgwqDCoMKgwqBfaW5mb19ub2wgIiogS2VybmVsIG1p dGlnYXRpb24gaXMgZW5hYmxlZDogIgo+ICvCoMKgwqDCoMKgwqDCoGlmIFsgIiRrZXJuZWxfbWRf Y2xlYXIiID0gMSBdOyB0aGVuCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKga2VybmVs X21kc19lbmFibGVkPSQoc3lzY3RsIC1uIGh3Lm1kc19kaXNhYmxlCj4gMj4vZGV2L251bGwpCj4g KyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKga2VybmVsX21kc19lbmFibGVkPSQoQHN5c2N0 bEAgLW4gaHcubWRzX2Rpc2FibGUKPiAyPi9kZXYvbnVsbCkKPiArwqDCoMKgwqDCoMKgwqBlbHNl Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF9tZHNfZW5hYmxlZD0wCj4g K8KgwqDCoMKgwqDCoMKgZmkKPiArQEAgLTUwODgsNyArNTA4OCw3IEBAIGNoZWNrX21kc19ic2Qo KQo+ICsKPiArwqDCoMKgwqDCoMKgwqBfaW5mb19ub2wgIiogS2VybmVsIG1pdGlnYXRpb24gaXMg YWN0aXZlOiAiCj4gK8KgwqDCoMKgwqDCoMKgaWYgWyAiJGtlcm5lbF9tZF9jbGVhciIgPSAxIF07 IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrZXJuZWxfbWRzX3N0YXRlPSQo c3lzY3RsIC1uIGh3Lm1kc19kaXNhYmxlX3N0YXRlCj4gMj4vZGV2L251bGwpCj4gKyvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKga2VybmVsX21kc19zdGF0ZT0kKEBzeXNjdGxAIC1uIGh3Lm1k c19kaXNhYmxlX3N0YXRlCj4gMj4vZGV2L251bGwpCj4gK8KgwqDCoMKgwqDCoMKgZWxzZQo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrZXJuZWxfbWRzX3N0YXRlPWluYWN0aXZlCj4g K8KgwqDCoMKgwqDCoMKgZmkKPiArQEAgLTUxNDYsMTYgKzUxNDYsMTYgQEAgY2hlY2tfbWRzX2xp bnV4KCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2luZm9fbm9sICIqIEtlcm5l bCBzdXBwb3J0cyB1c2luZyBNRF9DTEVBUgo+IG1pdGlnYXRpb246ICIKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKga2VybmVsX21kX2NsZWFyPScnCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGtlcm5lbF9tZF9jbGVhcl9jYW5fdGVsbD0xCj4gKy3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgaWYgWyAiJG9wdF9saXZlIiA9IDEgXSAmJiBncmVwIF5mbGFncwo+ICIk cHJvY2ZzL2NwdWluZm8iIHwgZ3JlcCAtcXcgbWRfY2xlYXI7IHRoZW4KPiArK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBpZiBbICIkb3B0X2xpdmUiID0gMSBdICYmIEBncmVwQCBeZmxhZ3MK PiAiJHByb2Nmcy9jcHVpbmZvIiB8IEBncmVwQCAtcXcgbWRfY2xlYXI7IHRoZW4KPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5lbF9tZF9jbGVhcj0i bWRfY2xlYXIgZm91bmQgaW4KPiAkcHJvY2ZzL2NwdWluZm8iCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIGdyZWVuIFlFUyAiJGtlcm5lbF9t ZF9jbGVhciIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZmkKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAteiAiJGtlcm5lbF9tZF9jbGVhciIgXTsgdGhlbgo+ ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAhIGNvbW1h bmQgLXYgIiR7b3B0X2FyY2hfcHJlZml4fXN0cmluZ3MiCj4gPi9kZXYvbnVsbCAyPiYxOyB0aGVu Cj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICEgY29t bWFuZCAtdiAiQHN0cmluZ3NAIiA+L2Rldi9udWxsIDI+JjE7Cj4gdGhlbgo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtlcm5l bF9tZF9jbGVhcl9jYW5fdGVsbD0wCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBlbGlmIFsgLW4gIiRrZXJuZWxfZXJyIiBdOyB0aGVuCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKga2Vy bmVsX21kX2NsZWFyX2Nhbl90ZWxsPTAKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZWxpZiAiJHtvcHRfYXJjaF9wcmVmaXh9c3RyaW5ncyIgIiRrZXJuZWwi IHwKPiBncmVwIC1xICdDbGVhciBDUFUgYnVmZmVycyc7IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxpZiAiQHN0cmluZ3NAIiAiJGtlcm5lbCIg fCBAZ3JlcEAgLXEgJ0NsZWFyCj4gQ1BVIGJ1ZmZlcnMnOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2RlYnVnICJt ZF9jbGVhcjogZm91bmQgJ0NsZWFyIENQVQo+IGJ1ZmZlcnMnIHN0cmluZyBpbiBrZXJuZWwgaW1h Z2UiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKga2VybmVsX21kX2NsZWFyPSdmb3VuZCBtZF9jbGVhcgo+IGltcGxlbWVudGF0 aW9uIGV2aWRlbmNlIGluIGtlcm5lbCBpbWFnZScKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIGdyZWVuIFlFUyAi JGtlcm5lbF9tZF9jbGVhciIKPiArQEAgLTUxNzEsNyArNTE3MSw3IEBAIGNoZWNrX21kc19saW51 eCgpCj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICIkb3B0X2xpdmUi ID0gMSBdICYmIFsKPiAiJHN5c19pbnRlcmZhY2VfYXZhaWxhYmxlIiA9IDEgXTsgdGhlbgo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX2luZm9fbm9sICIq IEtlcm5lbCBtaXRpZ2F0aW9uIGlzIGVuYWJsZWQgYW5kCj4gYWN0aXZlOiAiCj4gKy3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGVjaG8gIiRmdWxsbXNnIiB8 IGdyZXAgLXFpIF5taXRpZ2F0aW9uOwo+IHRoZW4KPiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgZWNobyAiJGZ1bGxtc2ciIHwgQGdyZXBAIC1xaSBebWl0 aWdhdGlvbjsKPiB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbWRzX21pdGlnYXRlZD0xCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyBn cmVlbiBZRVMKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGVsc2UKPiArQEAgLTUxNzksNyArNTE3OSw3IEBAIGNoZWNrX21kc19saW51eCgpCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg cHN0YXR1cyB5ZWxsb3cgTk8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBfaW5mb19ub2wgIiogU01UIGlzIGVpdGhlciBtaXRpZ2F0ZWQgb3IKPiBkaXNhYmxlZDog Igo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBlY2hv ICIkZnVsbG1zZyIgfCBncmVwIC1FcSAnU01UCj4gKGRpc2FibGVkfG1pdGlnYXRlZCknOyB0aGVu Cj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIGVjaG8g IiRmdWxsbXNnIiB8IEBncmVwQCAtRXEgJ1NNVAo+IChkaXNhYmxlZHxtaXRpZ2F0ZWQpJzsgdGhl bgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoG1kc19zbXRfbWl0aWdhdGVkPTEKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIGdyZWVuIFlFUwo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxzZQo+ICtA QCAtNTI2NSw3ICs1MjY1LDcgQEAgY2hlY2tfQ1ZFXzIwMTlfMTExMzUoKQo+ICvCoMKgwqDCoMKg wqDCoF9pbmZvICJcMDMzWzE7MzRtJGN2ZSBha2EgJyQoY3ZlMm5hbWUgIiRjdmUiKSdcMDMzWzBt Igo+ICvCoMKgwqDCoMKgwqDCoGlmIFsgIiRvcyIgPSBMaW51eCBdOyB0aGVuCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNoZWNrX0NWRV8yMDE5XzExMTM1X2xpbnV4Cj4gKy3CoMKg wqDCoMKgwqBlbGlmIGVjaG8gIiRvcyIgfCBncmVwIC1xIEJTRDsgdGhlbgo+ICsrwqDCoMKgwqDC oMKgZWxpZiBlY2hvICIkb3MiIHwgQGdyZXBAIC1xIEJTRDsgdGhlbgo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBjaGVja19DVkVfMjAxOV8xMTEzNV9ic2QKPiArwqDCoMKgwqDCoMKg wqBlbHNlCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF93YXJuICJVbnN1cHBvcnRl ZCBPUyAoJG9zKSIKPiArQEAgLTUyODYsNyArNTI4Niw3IEBAIGNoZWNrX0NWRV8yMDE5XzExMTM1 X2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKga2VybmVsX3RhYT0nJwo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbIC1uICIka2VybmVsX2VyciIgXTsg dGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKga2Vy bmVsX3RhYV9lcnI9IiRrZXJuZWxfZXJyIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGVsaWYgZ3JlcCAtcSAndHN4X2FzeW5jX2Fib3J0JyAiJGtlcm5lbCI7IHRoZW4KPiArK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIEBncmVwQCAtcSAndHN4X2FzeW5jX2Fib3J0JyAi JGtlcm5lbCI7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGtlcm5lbF90YWE9ImZvdW5kIHRzeF9hc3luY19hYm9ydCBpbiBrZXJuZWwKPiBpbWFn ZSIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZmkKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgaWYgWyAtbiAiJGtlcm5lbF90YWEiIF07IHRoZW4KPiArQEAgLTUzMDAs NyArNTMwMCw3IEBAIGNoZWNrX0NWRV8yMDE5XzExMTM1X2xpbnV4KCkKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgX2luZm9fbm9sICIqIFRBQSBtaXRpZ2F0aW9uIGVuYWJsZWQgYW5k IGFjdGl2ZTogIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBbICIkb3B0X2xp dmUiID0gMSBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBpZiBbIC1uICIkZnVsbG1zZyIgXTsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgZWNobyAiJGZ1bGxt c2ciIHwgZ3JlcCAtcUUKPiAnXk1pdGlnYXRpb24nOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBlY2hvICIkZnVs bG1zZyIgfCBAZ3JlcEAgLXFFCj4gJ15NaXRpZ2F0aW9uJzsgdGhlbgo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBwc3RhdHVzIGdyZWVuIFlFUyAiJGZ1bGxtc2ciCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxzZQo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIHllbGxvdyBOTwo+ICtAQCAtNTMzNSw5ICs1MzM1LDkg QEAgY2hlY2tfQ1ZFXzIwMTlfMTExMzVfbGludXgoKQo+ICvCoMKgwqDCoMKgwqDCoGVsc2UKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAiJG9wdF9wYXJhbm9pZCIgPSAxIF07 IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMg aW4gcGFyYW5vaWQgbW9kZSwgVFNYIG9yIFNNVCBlbmFibGVkIGFyZQo+IG5vdCBPSywgZXZlbiBp ZiBUQUEgaXMgbWl0aWdhdGVkCj4gKy3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGlmICEgZWNobyAiJGZ1bGxtc2ciIHwgZ3JlcCAtcUYgJ1RTWAo+IGRpc2FibGVk JzsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBp ZiAhIGVjaG8gIiRmdWxsbXNnIiB8IEBncmVwQCAtcUYgJ1RTWAo+IGRpc2FibGVkJzsgdGhlbgo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoHB2dWxuc3RhdHVzICRjdmUgVlVMTiAiVFNYIG11c3QgYmUKPiBkaXNhYmxlZCBmb3Ig ZnVsbCBtaXRpZ2F0aW9uIgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBlbGlmIGVjaG8gIiRmdWxsbXNnIiB8IGdyZXAgLXFGICdTTVQKPiB2dWxuZXJhYmxl JzsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBl bGlmIGVjaG8gIiRmdWxsbXNnIiB8IEBncmVwQCAtcUYgJ1NNVAo+IHZ1bG5lcmFibGUnOyB0aGVu Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgcHZ1bG5zdGF0dXMgJGN2ZSBWVUxOICJTTVQKPiAoSHlwZXJUaHJlYWRpbmcpIG11 c3QgYmUgZGlzYWJsZWQgZm9yIGZ1bGwgbWl0aWdhdGlvbiIKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwdnVsbnN0YXR1cyAkY3Zl ICIkc3RhdHVzIiAiJG1zZyIKPiArQEAgLTUzNjcsNyArNTM2Nyw3IEBAIGNoZWNrX0NWRV8yMDE4 XzEyMjA3KCkKPiArwqDCoMKgwqDCoMKgwqBfaW5mbyAiXDAzM1sxOzM0bSRjdmUgYWthICckKGN2 ZTJuYW1lICIkY3ZlIiknXDAzM1swbSIKPiArwqDCoMKgwqDCoMKgwqBpZiBbICIkb3MiID0gTGlu dXggXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjaGVja19DVkVfMjAx OF8xMjIwN19saW51eAo+ICstwqDCoMKgwqDCoMKgZWxpZiBlY2hvICIkb3MiIHwgZ3JlcCAtcSBC U0Q7IHRoZW4KPiArK8KgwqDCoMKgwqDCoGVsaWYgZWNobyAiJG9zIiB8IEBncmVwQCAtcSBCU0Q7 IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY2hlY2tfQ1ZFXzIwMThfMTIy MDdfYnNkCj4gK8KgwqDCoMKgwqDCoMKgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBfd2FybiAiVW5zdXBwb3J0ZWQgT1MgKCRvcykiCj4gK0BAIC01MzkxLDcgKzUzOTEsNyBA QCBjaGVja19DVkVfMjAxOF8xMjIwN19saW51eCgpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGlmIFsgLW4gIiRrZXJuZWxfZXJyIiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrZXJuZWxfaXRsYm1oX2Vycj0iJGtlcm5lbF9l cnIiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgY29tbWl0IDUyMTk1MDVmY2Ji NjQwZTI3M2EwZDUxYzE5YzM4ZGUwMTAwZWM1YTkKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBlbGlmIGdyZXAgLXEgJ2l0bGJfbXVsdGloaXQnICIka2VybmVsIjsgdGhlbgo+ICsrwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsaWYgQGdyZXBAIC1xICdpdGxiX211bHRpaGl0JyAi JGtlcm5lbCI7IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGtlcm5lbF9pdGxibWg9ImZvdW5kIGl0bGJfbXVsdGloaXQgaW4ga2VybmVsCj4gaW1h Z2UiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZpCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGlmIFsgLW4gIiRrZXJuZWxfaXRsYm1oIiBdOyB0aGVuCj4gK0BAIC01 NDA1LDcgKzU0MDUsNyBAQCBjaGVja19DVkVfMjAxOF8xMjIwN19saW51eCgpCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9pbmZvX25vbCAiKiBpVExCIE11bHRpaGl0IG1pdGlnYXRp b24gZW5hYmxlZCBhbmQKPiBhY3RpdmU6ICIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaWYgWyAiJG9wdF9saXZlIiA9IDEgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAtbiAiJGZ1bGxtc2ciIF07IHRoZW4KPiArLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGlmIGVjaG8gIiRmdWxsbXNnIiB8IGdyZXAgLXFGCj4gJ01pdGlnYXRpb24nOyB0aGVuCj4gKyvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBpZiBlY2hvICIkZnVsbG1zZyIgfCBAZ3JlcEAgLXFGCj4gJ01pdGlnYXRpb24nOyB0aGVuCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgZ3JlZW4gWUVTICIkZnVsbG1zZyIKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBlbHNlCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBzdGF0dXMgeWVsbG93IE5PCj4gK0BAIC01 NDQ3LDcgKzU0NDcsNyBAQCBjaGVja19DVkVfMjAxOF8xMjIwN19saW51eCgpCj4gKyBjaGVja19D VkVfMjAxOF8xMjIwN19ic2QoKQo+ICsgewo+ICvCoMKgwqDCoMKgwqDCoF9pbmZvX25vbCAiKiBL ZXJuZWwgc3VwcG9ydHMgZGlzYWJsaW5nIHN1cGVycGFnZXMgZm9yCj4gZXhlY3V0YWJsZSBtYXBw aW5ncyB1bmRlciBFUFQ6ICIKPiArLcKgwqDCoMKgwqDCoGtlcm5lbF8ybV94X2VwdD0kKHN5c2N0 bCAtbiB2bS5wbWFwLmFsbG93XzJtX3hfZXB0Cj4gMj4vZGV2L251bGwpCj4gKyvCoMKgwqDCoMKg wqBrZXJuZWxfMm1feF9lcHQ9JChAc3lzY3RsQCAtbiB2bS5wbWFwLmFsbG93XzJtX3hfZXB0Cj4g Mj4vZGV2L251bGwpCj4gK8KgwqDCoMKgwqDCoMKgaWYgWyAteiAiJGtlcm5lbF8ybV94X2VwdCIg XTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwc3RhdHVzIHllbGxvdyBO Two+ICvCoMKgwqDCoMKgwqDCoGVsc2UKPiArQEAgLTU0ODQsNyArNTQ4NCw3IEBAIGNoZWNrX0NW RV8yMDIwXzA1NDMoKQo+ICvCoMKgwqDCoMKgwqDCoF9pbmZvICJcMDMzWzE7MzRtJGN2ZSBha2Eg JyQoY3ZlMm5hbWUgIiRjdmUiKSdcMDMzWzBtIgo+ICvCoMKgwqDCoMKgwqDCoGlmIFsgIiRvcyIg PSBMaW51eCBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNoZWNrX0NW RV8yMDIwXzA1NDNfbGludXgKPiArLcKgwqDCoMKgwqDCoGVsaWYgZWNobyAiJG9zIiB8IGdyZXAg LXEgQlNEOyB0aGVuCj4gKyvCoMKgwqDCoMKgwqBlbGlmIGVjaG8gIiRvcyIgfCBAZ3JlcEAgLXEg QlNEOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNoZWNrX0NWRV8yMDIw XzA1NDNfYnNkCj4gK8KgwqDCoMKgwqDCoMKgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBfd2FybiAiVW5zdXBwb3J0ZWQgT1MgKCRvcykiCj4gK0BAIC01NTA1LDcgKzU1MDUs NyBAQCBjaGVja19DVkVfMjAyMF8wNTQzX2xpbnV4KCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKga2VybmVsX3NyYmRzPScnCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGlmIFsgLW4gIiRrZXJuZWxfZXJyIiBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBrZXJuZWxfc3JiZHNfZXJyPSIka2VybmVsX2VyciIKPiAr LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIGdyZXAgLXEgJ0RlcGVuZGVudCBvbiBo eXBlcnZpc29yJyAiJGtlcm5lbCI7Cj4gdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGVsaWYgQGdyZXBAIC1xICdEZXBlbmRlbnQgb24gaHlwZXJ2aXNvcicgIiRrZXJuZWwiOwo+ IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGtl cm5lbF9zcmJkcz0iZm91bmQgU1JCRFMgaW1wbGVtZW50YXRpb24KPiBldmlkZW5jZSBpbiBrZXJu ZWwgaW1hZ2UuIFlvdXIga2VybmVsIGlzIHVwIHRvIGRhdGUgZm9yIFNSQkRTCj4gbWl0aWdhdGlv biIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZmkKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgaWYgWyAtbiAiJGtlcm5lbF9zcmJkcyIgXTsgdGhlbgo+ICtAQCAtNTUx OCw3ICs1NTE4LDcgQEAgY2hlY2tfQ1ZFXzIwMjBfMDU0M19saW51eCgpCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoF9pbmZvX25vbCAiKiBTUkJEUyBtaXRpZ2F0aW9uIGNvbnRyb2wg aXMgZW5hYmxlZCBhbmQKPiBhY3RpdmU6ICIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaWYgWyAiJG9wdF9saXZlIiA9IDEgXTsgdGhlbgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgWyAtbiAiJGZ1bGxtc2ciIF07IHRoZW4KPiArLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGlmIGVjaG8gIiRmdWxsbXNnIiB8IGdyZXAgLXFFCj4gJ15NaXRpZ2F0aW9uJzsgdGhlbgo+ICsr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaWYgZWNobyAiJGZ1bGxtc2ciIHwgQGdyZXBAIC1xRQo+ICdeTWl0aWdhdGlvbic7IHRoZW4K PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyBncmVlbiBZRVMgIiRmdWxsbXNnIgo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHN0YXR1cyB5ZWxsb3cgTk8KPiArQEAg LTU2MDgsOCArNTYwOCw4IEBAIGZpCj4gKyAjIG5vdyBydW4gdGhlIGNoZWNrcyB0aGUgdXNlciBh c2tlZCBmb3IKPiArIGZvciBjdmUgaW4gJHN1cHBvcnRlZF9jdmVfbGlzdAo+ICsgZG8KPiArLcKg wqDCoMKgwqDCoGlmIFsgIiRvcHRfY3ZlX2FsbCIgPSAxIF0gfHwgZWNobyAiJG9wdF9jdmVfbGlz dCIgfCBncmVwIC1xdwo+ICIkY3ZlIjsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGNoZWNrXyIkKGVjaG8gIiRjdmUiIHwgdHIgLSBfKSIKPiArK8KgwqDCoMKgwqDCoGlmIFsg IiRvcHRfY3ZlX2FsbCIgPSAxIF0gfHwgZWNobyAiJG9wdF9jdmVfbGlzdCIgfCBAZ3JlcEAgLQo+ IHF3ICIkY3ZlIjsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNoZWNrXyIk KGVjaG8gIiRjdmUiIHwgQHRyQCAtIF8pIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBfaW5mbwo+ICvCoMKgwqDCoMKgwqDCoGZpCj4gKyBkb25lCj4gK0BAIC01NjIzLDE3ICs1NjIz LDE3IEBAIGlmIFsgIiRiYWRfYWNjdXJhY3kiID0gMSBdOyB0aGVuCj4gK8KgwqDCoMKgwqDCoMKg X3dhcm4gIldlJ3JlIG1pc3Npbmcgc29tZSBrZXJuZWwgaW5mbyAoc2VlIC12KSwgYWNjdXJhY3kK PiBtaWdodCBiZSByZWR1Y2VkIgo+ICsgZmkKPiArCj4gKy1fdmFycz0kKHNldCB8IGdyZXAgLUV2 ICdeW0EtWl9bOnNwYWNlOl1dJyB8IGdyZXAgLXYgLUYgJ21vY2ttZT0nIHwKPiBzb3J0IHwgdHIg IlxuIiAnfCcpCj4gKytfdmFycz0kKHNldCB8IEBncmVwQCAtRXYgJ15bQS1aX1s6c3BhY2U6XV0n IHwgQGdyZXBAIC12IC1GCj4gJ21vY2ttZT0nIHwgQHNvcnRAIHwgQHRyQCAiXG4iICd8JykKPiAr IF9kZWJ1ZyAidmFyaWFibGVzIGF0IGVuZCBvZiBzY3JpcHQ6ICRfdmFycyIKPiArCj4gKyBpZiBb IC1uICIkbW9ja21lIiBdICYmIFsgIiRvcHRfbW9jayIgPSAxIF07IHRoZW4KPiArLcKgwqDCoMKg wqDCoGlmIGNvbW1hbmQgLXYgImd6aXAiID4vZGV2L251bGwgMj4mMTsgdGhlbgo+ICsrwqDCoMKg wqDCoMKgaWYgY29tbWFuZCAtdiAiQGd6aXBAIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIyBub3QgYSB1c2VsZXNzIHVzZSBvZiBjYXQ6IGd6 aXBwaW5nIGNwdWluZm8gZGlyZWN0bHkKPiBkb2Vzbid0IHdvcmsgd2VsbAo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMDIKPiArLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiBjb21tYW5kIC12ICJiYXNlNjQiID4vZGV2L251bGwg Mj4mMTsgdGhlbgo+ICstwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBtb2NrX2NwdWluZm89IiQoY2F0IC9wcm9jL2NwdWluZm8gfCBnemlwIC1jIHwKPiBiYXNlNjQg LXcwKSIKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIGNvbW1hbmQgLXYgInV1 ZW5jb2RlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgbW9ja19jcHVpbmZvPSIkKGNhdCAvcHJvYy9jcHVpbmZvIHwg Z3ppcCAtYyB8Cj4gdXVlbmNvZGUgLW0gLSB8IGdyZXAgLUZ2ICdiZWdpbi1iYXNlNjQnIHwgZ3Jl cCAtRnh2IC0tICc9PT09JyB8IHRyIC1kCj4gIlxuIikiCj4gKyvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgaWYgY29tbWFuZCAtdiAiQGJhc2U2NEAiID4vZGV2L251bGwgMj4mMTsgdGhlbgo+ ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBtb2NrX2NwdWlu Zm89IiQoQGNhdEAgL3Byb2MvY3B1aW5mbyB8IEBnemlwQAo+IC1jIHwgQGJhc2U2NEAgLXcwKSIK PiArK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbGlmIGNvbW1hbmQgLXYgIkB1dWVuY29k ZUAiID4vZGV2L251bGwgMj4mMTsgdGhlbgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBtb2NrX2NwdWluZm89IiQoQGNhdEAgL3Byb2MvY3B1aW5mbyB8IEBn emlwQAo+IC1jIHwgQHV1ZW5jb2RlQCAtbSAtIHwgQGdyZXBAIC1GdiAnYmVnaW4tYmFzZTY0JyB8 IEBncmVwQCAtRnh2IC0tCj4gJz09PT0nIHwgQHRyQCAtZCAiXG4iKSIKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgZmkKPiArwqDCoMKgwqDCoMKgwqBmaQo+ICvCoMKgwqDCoMKgwqDC oGlmIFsgLW4gIiRtb2NrX2NwdWluZm8iIF07IHRoZW4KPiArQEAgLTU2NDIsNyArNTY0Miw3IEBA IGlmIFsgLW4gIiRtb2NrbWUiIF0gJiYgWyAiJG9wdF9tb2NrIiA9IDEgXTsKPiB0aGVuCj4gK8Kg wqDCoMKgwqDCoMKgZmkKPiArwqDCoMKgwqDCoMKgwqBfaW5mbyAiIgo+ICvCoMKgwqDCoMKgwqDC oCMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjA0Ngo+ICstwqDCoMKgwqDCoMKgX3dhcm4gIlRvIG1v Y2sgdGhpcyBDUFUsIHNldCB0aG9zZSB2YXJzOiAiJChlY2hvICIkbW9ja21lIiB8Cj4gc29ydCAt dSkKPiArK8KgwqDCoMKgwqDCoF93YXJuICJUbyBtb2NrIHRoaXMgQ1BVLCBzZXQgdGhvc2UgdmFy czogIiQoZWNobyAiJG1vY2ttZSIgfAo+IEBzb3J0QCAtdSkKPiArIGZpCj4gKwo+ICsgaWYgWyAi JG9wdF9leHBsYWluIiA9IDAgXTsgdGhlbgo+ICstLQo+ICsyLjM4LjEKPiArCj4gZGlmZiAtLWdp dCBhL2dudS9wYWNrYWdlcy9wYXRjaGVzL3NwZWN0cmUtbWVsdGRvd24tY2hlY2tlci1zdXBwb3J0 LQo+IGd1aXgtc3lzdGVtLWtlcm5lbC5wYXRjaCBiL2dudS9wYWNrYWdlcy9wYXRjaGVzL3NwZWN0 cmUtbWVsdGRvd24tCj4gY2hlY2tlci1zdXBwb3J0LWd1aXgtc3lzdGVtLWtlcm5lbC5wYXRjaAo+ IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMC4uYWZlYzUyYjQxOAo+IC0t LSAvZGV2L251bGwKPiArKysgYi9nbnUvcGFja2FnZXMvcGF0Y2hlcy9zcGVjdHJlLW1lbHRkb3du LWNoZWNrZXItc3VwcG9ydC1ndWl4LQo+IHN5c3RlbS1rZXJuZWwucGF0Y2gKPiBAQCAtMCwwICsx LDI2IEBACj4gK0Zyb20gNWI3NTdkOTMwZWMwY2YxMDJiMDNmYjk4MTdkMTdlMDZjNzJlNzRiMyBN b24gU2VwIDE3IDAwOjAwOjAwCj4gMjAwMQo+ICtGcm9tOiBIaWx0b24gQ2hhaW4gPGhha29AdWx0 cmFyYXJlLnNwYWNlPgo+ICtEYXRlOiBTYXQsIDUgTm92IDIwMjIgMjM6MjI6MzEgKzA4MDAKPiAr U3ViamVjdDogW1BBVENIXSBBZGQgc3VwcG9ydCBmb3IgR3VpeCBTeXN0ZW0ga2VybmVsLgo+ICsK PiArLS0tCj4gKyBzcGVjdHJlLW1lbHRkb3duLWNoZWNrZXIuc2ggfCAyICsrCj4gKyAxIGZpbGUg Y2hhbmdlZCwgMiBpbnNlcnRpb25zKCspCj4gKwo+ICtkaWZmIC0tZ2l0IGEvc3BlY3RyZS1tZWx0 ZG93bi1jaGVja2VyLnNoIGIvc3BlY3RyZS1tZWx0ZG93bi0KPiBjaGVja2VyLnNoCj4gK2luZGV4 IDI0OGE0NDQuLjg1NWEwOTAgMTAwNzU1Cj4gKy0tLSBhL3NwZWN0cmUtbWVsdGRvd24tY2hlY2tl ci5zaAo+ICsrKysgYi9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXIuc2gKPiArQEAgLTIyNTEsNiAr MjI1MSw4IEBAIGlmIFsgIiRvcHRfbGl2ZSIgPSAxIF07IHRoZW4KPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgWyAtZSAiL2Jvb3Qva2VybmVsLWdlbmtlcm5lbC0kKHVuYW1lIC1tKS0k KHVuYW1lIC1yKSIKPiBdICYmIG9wdF9rZXJuZWw9Ii9ib290L2tlcm5lbC1nZW5rZXJuZWwtJCh1 bmFtZSAtbSktJCh1bmFtZSAtcikiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMg Tml4T1M6Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgLWUgIi9ydW4vYm9vdGVk LXN5c3RlbS9rZXJuZWwiIF0gJiYKPiBvcHRfa2VybmVsPSIvcnVuL2Jvb3RlZC1zeXN0ZW0va2Vy bmVsIgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCMgR3VpeCBTeXN0ZW06Cj4gKyvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgWyAtZSAiL3J1bi9ib290ZWQtc3lzdGVtL2tlcm5l bC9iekltYWdlIiBdICYmCj4gb3B0X2tlcm5lbD0iL3J1bi9ib290ZWQtc3lzdGVtL2tlcm5lbC9i ekltYWdlIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAjIHN5c3RlbWQga2VybmVs LWluc3RhbGw6Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFsgLWUgIi9ldGMvbWFj aGluZS1pZCIgXSAmJiBbIC1lICIvYm9vdC8kKGNhdAo+IC9ldGMvbWFjaGluZS1pZCkvJCh1bmFt ZSAtcikvbGludXgiIF0gJiYgb3B0X2tlcm5lbD0iL2Jvb3QvJChjYXQKPiAvZXRjL21hY2hpbmUt aWQpLyQodW5hbWUgLXIpL2xpbnV4Igo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAj IENsZWFyIExpbnV4Ogo+ICsKPiArYmFzZS1jb21taXQ6IGE2Yzk0M2QzOGYzMTVmMzM5Njk3ZWMy NmU3Mzc0YTA5Yjg4ZjIxODMKPiArLS0KPiArMi4zOC4wCj4gCj4gYmFzZS1jb21taXQ6IDI3NTdk ZTJlMmIyNzFkODdmNmY3MmJhNDE2MWMyMjI1ZmJkYzllNzgKPiAtLQo+IDIuMzguMQpDaGVlcnMK From unknown Sun Jun 22 11:49:37 2025 X-Loop: help-debbugs@gnu.org Subject: [bug#59053] [PATCH v5] gnu: Add spectre-meltdown-checker. Resent-From: Hilton Chain Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Sun, 13 Nov 2022 13:11:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 59053 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: moreinfo patch To: Liliana Marie Prikler Cc: 59053@debbugs.gnu.org Received: via spool by 59053-submit@debbugs.gnu.org id=B59053.166834500413298 (code B ref 59053); Sun, 13 Nov 2022 13:11:02 +0000 Received: (at 59053) by debbugs.gnu.org; 13 Nov 2022 13:10:04 +0000 Received: from localhost ([127.0.0.1]:50203 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ouCkN-0003SP-Lr for submit@debbugs.gnu.org; Sun, 13 Nov 2022 08:10:04 -0500 Received: from mail.boiledscript.com ([144.168.59.46]:34914) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ouCkJ-0003Rl-Mh for 59053@debbugs.gnu.org; Sun, 13 Nov 2022 08:10:02 -0500 Date: Sun, 13 Nov 2022 21:09:15 +0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ultrarare.space; s=dkim; t=1668344990; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=W4j+DRAaYnb65YshWZygk4lDETLC3OAHGOab+sTvaaY=; b=N0RsKvOA/nKM94Kr4/JQbaIfL41u8RmmZ+pN4zvuoo+WbOL1FWpnmRHOghkvXKA1bt45ev a4cDa4JbbxxxhxfSALeJwUTnNX5QpOXWx8S+z7ddBiA6AfSNiMEf3lFAVJgJZpTl5dALwa CIbNbuYFmkR5pARSmr7ABTujlGcBaSENfwG6eBooUgjVVYWvXYEIx1Yp9VoryN4tfSszO1 sG11qpvyTcc205LP9yiazMXf62tQJK5Og2TQlKyzC/aoavE4FDiPEX7usaBy6GmG99HdNg Bs+kNnMHYgvg+L+tpKWD6BLIcpzAjy1sL+9csPF5oPjefeEF3OU1M7HPmChzMQ== Message-ID: From: Hilton Chain In-Reply-To: <3e3c90ad73311a445a3b06c7c8afb42dcf0af1b1.camel@gmail.com> References: <62dbdc4784403cc138909884b50a399485a2451f.camel@gmail.com> <60647514a548fc2589c1816ca8fef94fa20a7b94.camel@gmail.com> <3e3c90ad73311a445a3b06c7c8afb42dcf0af1b1.camel@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 8bit X-Spamd-Bar: / Authentication-Results: mail.boiledscript.com; auth=pass smtp.mailfrom=hako@ultrarare.space X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/packages/linux.scm (spectre-meltdown-checker): New variable. * gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch: New file. * gnu/packages/patches/spectre-meltdown-checker-remove-builtin-firmware-database.patch: New file. * gnu/local.mk (dist_patch_DATA): Add patches. --- v4 -> v5: No more an extra patch for substitution. gnu/local.mk | 2 + gnu/packages/linux.scm | 130 ++++++++++ ...ker-remove-builtin-firmware-database.patch | 243 ++++++++++++++++++ ...n-checker-support-guix-system-kernel.patch | 26 ++ 4 files changed, 401 insertions(+) create mode 100644 gnu/packages/patches/spectre-meltdown-checker-remove-builtin-firmware-database.patch create mode 100644 gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch diff --git a/gnu/local.mk b/gnu/local.mk index e3e02314bb..1e85790983 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -1857,6 +1857,8 @@ dist_patch_DATA = \ %D%/packages/patches/syslinux-strip-gnu-property.patch \ %D%/packages/patches/snappy-add-O2-flag-in-CmakeLists.txt.patch \ %D%/packages/patches/snappy-add-inline-for-GCC.patch \ + %D%/packages/patches/spectre-meltdown-checker-remove-builtin-firmware-database.patch \ + %D%/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch \ %D%/packages/patches/sphinxbase-fix-doxygen.patch \ %D%/packages/patches/spice-vdagent-glib-2.68.patch \ %D%/packages/patches/sssd-optional-systemd.patch \ diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index fea33dfa0b..03b7ce46b0 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -9595,3 +9595,133 @@ (define-public edac-utils error detection and correction (EDAC).") (home-page "https://github.com/grondo/edac-utils") (license license:gpl2+))) + +(define-public spectre-meltdown-checker + (package + (name "spectre-meltdown-checker") + (version "0.45") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/speed47/spectre-meltdown-checker") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (patches + (search-patches + "spectre-meltdown-checker-remove-builtin-firmware-database.patch" + ;; https://github.com/speed47/spectre-meltdown-checker/pull/441 + "spectre-meltdown-checker-support-guix-system-kernel.patch")) + ;; Remove builtin firmware database. + (modules '((guix build utils))) + (snippet '(substitute* "spectre-meltdown-checker.sh" + (("^# [AI],.*") ""))) + (sha256 + (base32 + "1xx8h5791lhc2xw0dcbzjkklzvlxwxkjzh8di4g8divfy24fqsn8")))) + (build-system copy-build-system) + (arguments + (list + #:install-plan + #~'(("spectre-meltdown-checker.sh" "bin/spectre-meltdown-checker")) + #:phases + #~(modify-phases %standard-phases + (add-after 'unpack 'fixpath + (lambda* (#:key inputs #:allow-other-keys) + (define* (find-command inputs cmd #:optional (bin "bin") + #:key (prefix "") (suffix "")) + (string-append + prefix (search-input-file inputs (string-append bin "/" cmd)) + suffix)) + (substitute* "spectre-meltdown-checker.sh" + ;; ${opt_arch_prefix}CMD + (((string-append + "\\$\\{opt_arch_prefix\\}" + "\\<(nm|objdump|readelf|strings)\\>") all cmd) + (find-command inputs cmd)) + + ;; dd + (("(dd)( if=)" all cmd suffix) + (find-command inputs cmd #:suffix suffix)) + + ;; Commands safe to substitute directly. + (((string-append "\\<(" (string-join + (list "awk" + "basename" + "dirname" + "bunzip2" + "gunzip" + "gzip" + "lz4" + "lzop" + "modprobe" + "pgrep" + "rmmod" + "umount" + "unlzma" + "unxz" + "unzstd" + "uuencode") + "|") + ")\\>") all cmd) + (find-command inputs cmd)) + + ;; Search by suffix. + ;; CMD - + ;; CMD ^ + (((string-append "\\<(" (string-join + (list "base64" + "cut" + "grep" + "head" + "id" + "mount" + "mktemp" + "od" + "perl" + "rm" + "uname" + "xargs") + "|") + ")\\>( [-^])") all cmd suffix) + (find-command inputs cmd #:suffix suffix)) + ;; CMD | + (("(dmesg)( \\|)" all cmd suffix) + (find-command inputs cmd #:suffix suffix)) + + ;; Then prefix + ;; | CMD + (("(\\| )\\<(grep|sed|sort|stat|tr)\\>" all prefix cmd) + (find-command inputs cmd #:prefix prefix)) + ;; $(CMD + (("(\\$\\( *)(sysctl)" all prefix cmd) + (find-command inputs cmd "sbin" #:prefix prefix)) + (("(\\$\\()\\<(cat|find|grep|mount|nproc|stat|tr)\\>" all prefix cmd) + (find-command inputs cmd #:prefix prefix)) + ;; if CMD + (("(if )(sysctl)" all prefix cmd) + (find-command inputs cmd "sbin" #:prefix prefix)) + ;; command -v CMD + (("(command -v) \"*\\<(base64|nproc|perl|printf)\\>\"*" all prefix cmd) + (find-command inputs cmd #:prefix prefix)) + + ;; Cats are mysterious... + ;; cat < +Date: Sat, 12 Nov 2022 22:45:24 +0800 +Subject: [PATCH] Remove builtin firmware database. + +1. Remove downloading function. +2. Add option for supplying a local database. +--- + spectre-meltdown-checker.sh | 180 +++--------------------------------- + 1 file changed, 15 insertions(+), 165 deletions(-) + +diff --git a/spectre-meltdown-checker.sh b/spectre-meltdown-checker.sh +index 30f760c..ce46970 100755 +--- a/spectre-meltdown-checker.sh ++++ b/spectre-meltdown-checker.sh +@@ -22,8 +22,6 @@ exit_cleanup() + [ -n "${dumped_config:-}" ] && [ -f "$dumped_config" ] && rm -f "$dumped_config" + [ -n "${kerneltmp:-}" ] && [ -f "$kerneltmp" ] && rm -f "$kerneltmp" + [ -n "${kerneltmp2:-}" ] && [ -f "$kerneltmp2" ] && rm -f "$kerneltmp2" +- [ -n "${mcedb_tmp:-}" ] && [ -f "$mcedb_tmp" ] && rm -f "$mcedb_tmp" +- [ -n "${intel_tmp:-}" ] && [ -d "$intel_tmp" ] && rm -rf "$intel_tmp" + [ "${mounted_debugfs:-}" = 1 ] && umount /sys/kernel/debug 2>/dev/null + [ "${mounted_procfs:-}" = 1 ] && umount "$procfs" 2>/dev/null + [ "${insmod_cpuid:-}" = 1 ] && rmmod cpuid 2>/dev/null +@@ -93,9 +91,7 @@ show_usage() + --vmm [auto,yes,no] override the detection of the presence of a hypervisor, default: auto + --allow-msr-write allow probing for write-only MSRs, this might produce kernel logs or be blocked by your system + --cpu [#,all] interact with CPUID and MSR of CPU core number #, or all (default: CPU core 0) +- --update-fwdb update our local copy of the CPU microcodes versions database (using the awesome +- MCExtractor project and the Intel firmwares GitHub repository) +- --update-builtin-fwdb same as --update-fwdb but update builtin DB inside the script itself ++ --with-fwdb FILE supply the CPU microcodes versions database + --dump-mock-data used to mimick a CPU on an other system, mainly used to help debugging this script + + Return codes: +@@ -837,147 +833,6 @@ show_header() + _info + } + +-[ -z "$HOME" ] && HOME="$(getent passwd "$(whoami)" | cut -d: -f6)" +-mcedb_cache="$HOME/.mcedb" +-update_fwdb() +-{ +- show_header +- +- set -e +- +- if [ -r "$mcedb_cache" ]; then +- previous_dbversion=$(awk '/^# %%% MCEDB / { print $4 }' "$mcedb_cache") +- fi +- +- # first, download the MCE.db from the excellent platomav's MCExtractor project +- mcedb_tmp="$(mktemp -t smc-mcedb-XXXXXX)" +- mcedb_url='https://github.com/platomav/MCExtractor/raw/master/MCE.db' +- _info_nol "Fetching MCE.db from the MCExtractor project... " +- if command -v wget >/dev/null 2>&1; then +- wget -q "$mcedb_url" -O "$mcedb_tmp"; ret=$? +- elif command -v curl >/dev/null 2>&1; then +- curl -sL "$mcedb_url" -o "$mcedb_tmp"; ret=$? +- elif command -v fetch >/dev/null 2>&1; then +- fetch -q "$mcedb_url" -o "$mcedb_tmp"; ret=$? +- else +- echo ERROR "please install one of \`wget\`, \`curl\` of \`fetch\` programs" +- return 1 +- fi +- if [ "$ret" != 0 ]; then +- echo ERROR "error $ret while downloading MCE.db" +- return $ret +- fi +- echo DONE +- +- # second, get the Intel firmwares from GitHub +- intel_tmp="$(mktemp -d -t smc-intelfw-XXXXXX)" +- intel_url="https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files/archive/main.zip" +- _info_nol "Fetching Intel firmwares... " +- ## https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files.git +- if command -v wget >/dev/null 2>&1; then +- wget -q "$intel_url" -O "$intel_tmp/fw.zip"; ret=$? +- elif command -v curl >/dev/null 2>&1; then +- curl -sL "$intel_url" -o "$intel_tmp/fw.zip"; ret=$? +- elif command -v fetch >/dev/null 2>&1; then +- fetch -q "$intel_url" -o "$intel_tmp/fw.zip"; ret=$? +- else +- echo ERROR "please install one of \`wget\`, \`curl\` of \`fetch\` programs" +- return 1 +- fi +- if [ "$ret" != 0 ]; then +- echo ERROR "error $ret while downloading Intel firmwares" +- return $ret +- fi +- echo DONE +- +- # now extract MCEdb contents using sqlite +- _info_nol "Extracting MCEdb data... " +- if ! command -v sqlite3 >/dev/null 2>&1; then +- echo ERROR "please install the \`sqlite3\` program" +- return 1 +- fi +- mcedb_revision=$(sqlite3 "$mcedb_tmp" "select revision from MCE") +- if [ -z "$mcedb_revision" ]; then +- echo ERROR "downloaded file seems invalid" +- return 1 +- fi +- sqlite3 "$mcedb_tmp" "alter table Intel add column origin text" +- sqlite3 "$mcedb_tmp" "update Intel set origin='mce'" +- +- echo OK "MCExtractor database revision $mcedb_revision" +- +- # parse Intel firmwares to get their versions +- _info_nol "Integrating Intel firmwares data to db... " +- if ! command -v unzip >/dev/null 2>&1; then +- echo ERROR "please install the \`unzip\` program" +- return 1 +- fi +- ( cd "$intel_tmp" && unzip fw.zip >/dev/null; ) +- if ! [ -d "$intel_tmp/Intel-Linux-Processor-Microcode-Data-Files-main/intel-ucode" ]; then +- echo ERROR "expected the 'intel-ucode' folder in the downloaded zip file" +- return 1 +- fi +- +- if ! command -v iucode_tool >/dev/null 2>&1; then +- if ! command -v iucode-tool >/dev/null 2>&1; then +- echo ERROR "please install the \`iucode-tool\` program" +- return 1 +- else +- iucode_tool="iucode-tool" +- fi +- else +- iucode_tool="iucode_tool" +- fi +- # 079/001: sig 0x000106c2, pf_mask 0x01, 2009-04-10, rev 0x0217, size 5120 +- # 078/004: sig 0x000106ca, pf_mask 0x10, 2009-08-25, rev 0x0107, size 5120 +- $iucode_tool -l "$intel_tmp/Intel-Linux-Processor-Microcode-Data-Files-main/intel-ucode" | grep -wF sig | while read -r _line +- do +- _line=$( echo "$_line" | tr -d ',') +- _cpuid=$( echo "$_line" | awk '{print $3}') +- _cpuid=$(( _cpuid )) +- _cpuid=$(printf "0x%08X" "$_cpuid") +- _date=$( echo "$_line" | awk '{print $6}' | tr -d '-') +- _version=$(echo "$_line" | awk '{print $8}') +- _version=$(( _version )) +- _version=$(printf "0x%08X" "$_version") +- _sqlstm="$(printf "INSERT INTO Intel (origin,cpuid,version,yyyymmdd) VALUES (\"%s\",\"%s\",\"%s\",\"%s\");" "intel" "$(printf "%08X" "$_cpuid")" "$(printf "%08X" "$_version")" "$_date")" +- sqlite3 "$mcedb_tmp" "$_sqlstm" +- done +- _intel_timestamp=$(stat -c %Y "$intel_tmp/Intel-Linux-Processor-Microcode-Data-Files-main/license" 2>/dev/null) +- if [ -n "$_intel_timestamp" ]; then +- # use this date, it matches the last commit date +- _intel_latest_date=$(date +%Y%m%d -d @"$_intel_timestamp") +- else +- echo "Falling back to the latest microcode date" +- _intel_latest_date=$(sqlite3 "$mcedb_tmp" "SELECT yyyymmdd from Intel WHERE origin = 'intel' ORDER BY yyyymmdd DESC LIMIT 1;") +- fi +- echo DONE "(version $_intel_latest_date)" +- +- dbversion="$mcedb_revision+i$_intel_latest_date" +- +- if [ "$1" != builtin ] && [ -n "$previous_dbversion" ] && [ "$previous_dbversion" = "v$dbversion" ]; then +- echo "We already have this version locally, no update needed" +- return 0 +- fi +- +- _info_nol "Building local database... " +- { +- echo "# Spectre & Meltdown Checker"; +- echo "# %%% MCEDB v$dbversion"; +- sqlite3 "$mcedb_tmp" "SELECT '# I,0x'||t1.cpuid||',0x'||MAX(t1.version)||','||t1.yyyymmdd FROM Intel AS t1 LEFT OUTER JOIN Intel AS t2 ON t2.cpuid=t1.cpuid AND t2.yyyymmdd > t1.yyyymmdd WHERE t2.yyyymmdd IS NULL GROUP BY t1.cpuid ORDER BY t1.cpuid ASC;" | grep -v '^# .,0x00000000,'; +- sqlite3 "$mcedb_tmp" "SELECT '# A,0x'||t1.cpuid||',0x'||MAX(t1.version)||','||t1.yyyymmdd FROM AMD AS t1 LEFT OUTER JOIN AMD AS t2 ON t2.cpuid=t1.cpuid AND t2.yyyymmdd > t1.yyyymmdd WHERE t2.yyyymmdd IS NULL GROUP BY t1.cpuid ORDER BY t1.cpuid ASC;" | grep -v '^# .,0x00000000,'; +- } > "$mcedb_cache" +- echo DONE "(version $dbversion)" +- +- if [ "$1" = builtin ]; then +- newfile=$(mktemp -t smc-builtin-XXXXXX) +- awk '/^# %%% MCEDB / { exit }; { print }' "$0" > "$newfile" +- awk '{ if (NR>1) { print } }' "$mcedb_cache" >> "$newfile" +- cat "$newfile" > "$0" +- rm -f "$newfile" +- fi +-} +- + parse_opt_file() + { + # parse_opt_file option_name option_value +@@ -1067,12 +922,15 @@ while [ -n "${1:-}" ]; do + # deprecated, kept for compatibility + opt_explain=0 + shift +- elif [ "$1" = "--update-fwdb" ] || [ "$1" = "--update-mcedb" ]; then +- update_fwdb +- exit $? +- elif [ "$1" = "--update-builtin-fwdb" ] || [ "$1" = "--update-builtin-mcedb" ]; then +- update_fwdb builtin +- exit $? ++ elif [ "$1" = "--with-fwdb" ] || [ "$1" = "--with-mcedb" ]; then ++ opt_fwdb=$2 ++ if [ -f "$opt_fwdb" ]; then ++ mcedb_cache=$2 ++ else ++ echo "$0: error: --with-fwdb should be a file, got '$opt_fwdb'" >&2 ++ exit 255 ++ fi ++ shift 2 + elif [ "$1" = "--dump-mock-data" ]; then + opt_mock=1 + shift +@@ -2033,21 +1891,11 @@ is_xen_domU() + fi + } + +-builtin_dbversion=$(awk '/^# %%% MCEDB / { print $4 }' "$0") + if [ -r "$mcedb_cache" ]; then + # we have a local cache file, but it might be older than the builtin version we have + local_dbversion=$( awk '/^# %%% MCEDB / { print $4 }' "$mcedb_cache") +- # sort -V sorts by version number +- older_dbversion=$(printf "%b\n%b" "$local_dbversion" "$builtin_dbversion" | sort -V | head -n1) +- if [ "$older_dbversion" = "$builtin_dbversion" ]; then +- mcedb_source="$mcedb_cache" +- mcedb_info="local firmwares DB $local_dbversion" +- fi +-fi +-# if mcedb_source is not set, either we don't have a local cached db, or it is older than the builtin db +-if [ -z "${mcedb_source:-}" ]; then +- mcedb_source="$0" +- mcedb_info="builtin firmwares DB $builtin_dbversion" ++ mcedb_source="$mcedb_cache" ++ mcedb_info="local firmwares DB $local_dbversion" + fi + read_mcedb() + { +@@ -2063,7 +1911,9 @@ is_latest_known_ucode() + return 2 + fi + ucode_latest="latest microcode version for your CPU model is unknown" +- if is_intel; then ++ if [ -z "$mcedb_source" ]; then ++ return 2 ++ elif is_intel; then + cpu_brand_prefix=I + elif is_amd; then + cpu_brand_prefix=A +-- +2.38.1 + diff --git a/gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch b/gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch new file mode 100644 index 0000000000..afec52b418 --- /dev/null +++ b/gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch @@ -0,0 +1,26 @@ +From 5b757d930ec0cf102b03fb9817d17e06c72e74b3 Mon Sep 17 00:00:00 2001 +From: Hilton Chain +Date: Sat, 5 Nov 2022 23:22:31 +0800 +Subject: [PATCH] Add support for Guix System kernel. + +--- + spectre-meltdown-checker.sh | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/spectre-meltdown-checker.sh b/spectre-meltdown-checker.sh +index 248a444..855a090 100755 +--- a/spectre-meltdown-checker.sh ++++ b/spectre-meltdown-checker.sh +@@ -2251,6 +2251,8 @@ if [ "$opt_live" = 1 ]; then + [ -e "/boot/kernel-genkernel-$(uname -m)-$(uname -r)" ] && opt_kernel="/boot/kernel-genkernel-$(uname -m)-$(uname -r)" + # NixOS: + [ -e "/run/booted-system/kernel" ] && opt_kernel="/run/booted-system/kernel" ++ # Guix System: ++ [ -e "/run/booted-system/kernel/bzImage" ] && opt_kernel="/run/booted-system/kernel/bzImage" + # systemd kernel-install: + [ -e "/etc/machine-id" ] && [ -e "/boot/$(cat /etc/machine-id)/$(uname -r)/linux" ] && opt_kernel="/boot/$(cat /etc/machine-id)/$(uname -r)/linux" + # Clear Linux: + +base-commit: a6c943d38f315f339697ec26e7374a09b88f2183 +-- +2.38.0 base-commit: 80d10fa413cf43439f9ab94b6f69fe68811156da -- 2.38.1 From unknown Sun Jun 22 11:49:37 2025 MIME-Version: 1.0 X-Mailer: MIME-tools 5.505 (Entity 5.505) X-Loop: help-debbugs@gnu.org From: help-debbugs@gnu.org (GNU bug Tracking System) To: Hilton Chain Subject: bug#59053: closed (Re: [PATCH v5] gnu: Add spectre-meltdown-checker.) Message-ID: References: X-Gnu-PR-Message: they-closed 59053 X-Gnu-PR-Package: guix-patches X-Gnu-PR-Keywords: moreinfo patch Reply-To: 59053@debbugs.gnu.org Date: Sun, 13 Nov 2022 22:03:02 +0000 Content-Type: multipart/mixed; boundary="----------=_1668376982-13922-1" This is a multi-part message in MIME format... ------------=_1668376982-13922-1 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Your bug report #59053: [PATCH] gnu: Add spectre-meltdown-checker. which was filed against the guix-patches package, has been closed. The explanation is attached below, along with your original report. If you require more details, please reply to 59053@debbugs.gnu.org. --=20 59053: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D59053 GNU Bug Tracking System Contact help-debbugs@gnu.org with problems ------------=_1668376982-13922-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at 59053-done) by debbugs.gnu.org; 13 Nov 2022 22:02:18 +0000 Received: from localhost ([127.0.0.1]:48548 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ouL3R-0003ba-Qz for submit@debbugs.gnu.org; Sun, 13 Nov 2022 17:02:18 -0500 Received: from mail-ed1-f49.google.com ([209.85.208.49]:34608) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ouL3N-0003bJ-Lg for 59053-done@debbugs.gnu.org; Sun, 13 Nov 2022 17:02:17 -0500 Received: by mail-ed1-f49.google.com with SMTP id v27so14810711eda.1 for <59053-done@debbugs.gnu.org>; Sun, 13 Nov 2022 14:02:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:cc:to:from:subject:message-id:from:to:cc:subject :date:message-id:reply-to; bh=qjlppKQEkmD3BQ8sdxd/DfsbkOvL4TyXSsGlEO6elpU=; b=SyCJVFXJIPOmHC3Ecc0nooodH0JMtBplNVBiHJxaLFgSGQI3n2Krq6MTlm4DDsrVJb 1sYELn4rdbQDfaNRLMIl23FdTHgASdsamk35Vna5578gvOd78Lzmq0xTGDLeraoqqT3G SXF8GA8Hxg0dKdHd3fEKs/hjXN38MA1q/NSx7fxftXylBCNbqtIhGDrTalrUu7NL+i8K joKkBQni4lhOhVuY/oHID6xlID2sALrciJcH4ZAHv2cjAbOBsY6yVgt/1Vq+1zSat3zP k6r6FQ7WFdkPlky189z8NiqTdH5uf21ySAmM+lb3e7ViCZjNOscsCWx4J8uNCZJ3sYr3 NS8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:cc:to:from:subject:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=qjlppKQEkmD3BQ8sdxd/DfsbkOvL4TyXSsGlEO6elpU=; b=ywodOubzhl/vNiIcLU6TzDWBlBkRAcKXzZr64kYIgiKUF/ZRjoiGFl0MmWu5zgQjqT M3HRWrmZTNM4XFw5/BY9TIXV6IxiSovexAyVlVcke2vWCGxORXKRk6eEItVGRrkfTRhl s1Kt/Nf9MEWEolT3suz+H2ZCq/neF7RV2HgrE1jAlGyMkxECkRvI2BIMRItnI1SCFJjd NAeEJtHdfoFQWytufvqIx2qaijyBdIw4hG+g7j7w3JeMwyDnwraYDxuPy/oXzZltWVUy RPyx02uaYYFcV1fauV8B+yeIdwprwoKgN+W6y4iWkzwMxcgBA3d0rWC8r04+dlB65BLy Qb0w== X-Gm-Message-State: ANoB5pm9mP39s1fJOJMOR3q5nqVEP72YPxa6mpZzzuuXheXS1o4N7oBv 2jDMs7R21r6kYm4MbCz5Wbg= X-Google-Smtp-Source: AA0mqf7WUaxLQMuUr0aCmqrYAWVYzihRFV46gfB1w9kRMF84n+PpHpL/7wETv7Qc6ngL+bvyWVEJkA== X-Received: by 2002:a50:ef10:0:b0:461:ecca:e8a with SMTP id m16-20020a50ef10000000b00461ecca0e8amr9247019eds.139.1668376927797; Sun, 13 Nov 2022 14:02:07 -0800 (PST) Received: from lumine.fritz.box (85-127-52-93.dsl.dynamic.surfer.at. [85.127.52.93]) by smtp.gmail.com with ESMTPSA id y22-20020a056402171600b0046776f98d0csm2697774edu.79.2022.11.13.14.02.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Nov 2022 14:02:07 -0800 (PST) Message-ID: Subject: Re: [PATCH v5] gnu: Add spectre-meltdown-checker. From: Liliana Marie Prikler To: Hilton Chain Date: Sun, 13 Nov 2022 23:02:06 +0100 In-Reply-To: References: <62dbdc4784403cc138909884b50a399485a2451f.camel@gmail.com> <60647514a548fc2589c1816ca8fef94fa20a7b94.camel@gmail.com> <3e3c90ad73311a445a3b06c7c8afb42dcf0af1b1.camel@gmail.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 User-Agent: Evolution 3.46.0 MIME-Version: 1.0 X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 59053-done Cc: 59053-done@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) QW0gU29ubnRhZywgZGVtIDEzLjExLjIwMjIgdW0gMjE6MDkgKzA4MDAgc2NocmllYiBIaWx0b24g Q2hhaW46Cj4gKiBnbnUvcGFja2FnZXMvbGludXguc2NtIChzcGVjdHJlLW1lbHRkb3duLWNoZWNr ZXIpOiBOZXcgdmFyaWFibGUuCj4gKiBnbnUvcGFja2FnZXMvcGF0Y2hlcy9zcGVjdHJlLW1lbHRk b3duLWNoZWNrZXItc3VwcG9ydC1ndWl4LXN5c3RlbS0KPiBrZXJuZWwucGF0Y2g6Cj4gTmV3IGZp bGUuCj4gKiBnbnUvcGFja2FnZXMvcGF0Y2hlcy9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXItcmVt b3ZlLWJ1aWx0aW4tCj4gZmlybXdhcmUtZGF0YWJhc2UucGF0Y2g6Cj4gTmV3IGZpbGUuCj4gKiBn bnUvbG9jYWwubWsgKGRpc3RfcGF0Y2hfREFUQSk6IEFkZCBwYXRjaGVzLgpJIHJlbmFtZWQgdGhl IHBhdGNoZXMgZm9yIHRoZSBDaGFuZ2VMb2csIHNsaWdodGx5IHJld3JvdGUgdGhlaXIKZXhwbGFu YXRpb25zLCAuLi4KCj4gwqBnbnUvbG9jYWwubWvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqAgMiArCj4gwqBnbnUv cGFja2FnZXMvbGludXguc2NtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB8IDEzMCArKysrKysrKysrCj4gwqAuLi5rZXItcmVtb3ZlLWJ1aWx0aW4tZmlybXdh cmUtZGF0YWJhc2UucGF0Y2ggfCAyNDMKPiArKysrKysrKysrKysrKysrKysKPiDCoC4uLm4tY2hl Y2tlci1zdXBwb3J0LWd1aXgtc3lzdGVtLWtlcm5lbC5wYXRjaCB8wqAgMjYgKysKPiDCoDQgZmls ZXMgY2hhbmdlZCwgNDAxIGluc2VydGlvbnMoKykKPiDCoGNyZWF0ZSBtb2RlIDEwMDY0NCBnbnUv cGFja2FnZXMvcGF0Y2hlcy9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXItCj4gcmVtb3ZlLWJ1aWx0 aW4tZmlybXdhcmUtZGF0YWJhc2UucGF0Y2gKPiDCoGNyZWF0ZSBtb2RlIDEwMDY0NCBnbnUvcGFj a2FnZXMvcGF0Y2hlcy9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXItCj4gc3VwcG9ydC1ndWl4LXN5 c3RlbS1rZXJuZWwucGF0Y2gKPiAKPiBkaWZmIC0tZ2l0IGEvZ251L2xvY2FsLm1rIGIvZ251L2xv Y2FsLm1rCj4gaW5kZXggZTNlMDIzMTRiYi4uMWU4NTc5MDk4MyAxMDA2NDQKPiAtLS0gYS9nbnUv bG9jYWwubWsKPiArKysgYi9nbnUvbG9jYWwubWsKPiBAQCAtMTg1Nyw2ICsxODU3LDggQEAgZGlz dF9wYXRjaF9EQVRBCj4gPcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBcCj4gwqDCoCAlRCUvcGFj a2FnZXMvcGF0Y2hlcy9zeXNsaW51eC1zdHJpcC1nbnUtcHJvcGVydHkucGF0Y2jCoMKgwqDCoMKg wqDCoFwKPiDCoMKgICVEJS9wYWNrYWdlcy9wYXRjaGVzL3NuYXBweS1hZGQtTzItZmxhZy1pbi0K PiBDbWFrZUxpc3RzLnR4dC5wYXRjaMKgwqDCoMKgwqDCoFwKPiDCoMKgICVEJS9wYWNrYWdlcy9w YXRjaGVzL3NuYXBweS1hZGQtaW5saW5lLWZvci1HQ0MucGF0Y2jCoMKgwqDCoMKgwqDCoMKgwqBc Cj4gK8KgICVEJS9wYWNrYWdlcy9wYXRjaGVzL3NwZWN0cmUtbWVsdGRvd24tY2hlY2tlci1yZW1v dmUtYnVpbHRpbi0KPiBmaXJtd2FyZS1kYXRhYmFzZS5wYXRjaCBcCj4gK8KgICVEJS9wYWNrYWdl cy9wYXRjaGVzL3NwZWN0cmUtbWVsdGRvd24tY2hlY2tlci1zdXBwb3J0LWd1aXgtc3lzdGVtLQo+ IGtlcm5lbC5wYXRjaCBcCj4gwqDCoCAlRCUvcGFja2FnZXMvcGF0Y2hlcy9zcGhpbnhiYXNlLWZp eC1kb3h5Z2VuLnBhdGNowqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+IMKgwqAgJUQlL3BhY2th Z2VzL3BhdGNoZXMvc3BpY2UtdmRhZ2VudC1nbGliLTIuNjgucGF0Y2jCoMKgwqDCoMKgwqDCoMKg wqDCoMKgXAo+IMKgwqAgJUQlL3BhY2thZ2VzL3BhdGNoZXMvc3NzZC1vcHRpb25hbC1zeXN0ZW1k LnBhdGNowqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBcCj4gZGlmZiAtLWdpdCBhL2dudS9wYWNr YWdlcy9saW51eC5zY20gYi9nbnUvcGFja2FnZXMvbGludXguc2NtCj4gaW5kZXggZmVhMzNkZmEw Yi4uMDNiN2NlNDZiMCAxMDA2NDQKPiAtLS0gYS9nbnUvcGFja2FnZXMvbGludXguc2NtCj4gKysr IGIvZ251L3BhY2thZ2VzL2xpbnV4LnNjbQo+IEBAIC05NTk1LDMgKzk1OTUsMTMzIEBAIChkZWZp bmUtcHVibGljIGVkYWMtdXRpbHMKPiDCoGVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiAo RURBQykuIikKPiDCoMKgwqDCoCAoaG9tZS1wYWdlICJodHRwczovL2dpdGh1Yi5jb20vZ3JvbmRv L2VkYWMtdXRpbHMiKQo+IMKgwqDCoMKgIChsaWNlbnNlIGxpY2Vuc2U6Z3BsMispKSkKPiArCj4g KyhkZWZpbmUtcHVibGljIHNwZWN0cmUtbWVsdGRvd24tY2hlY2tlcgo+ICvCoCAocGFja2FnZQo+ ICvCoMKgwqAgKG5hbWUgInNwZWN0cmUtbWVsdGRvd24tY2hlY2tlciIpCj4gK8KgwqDCoCAodmVy c2lvbiAiMC40NSIpCj4gK8KgwqDCoCAoc291cmNlIChvcmlnaW4KPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgKG1ldGhvZCBnaXQtZmV0Y2gpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICh1cmkgKGdpdC1yZWZlcmVuY2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgKHVybAo+ICJodHRwczovL2dpdGh1Yi5jb20vc3BlZWQ0Ny9zcGVjdHJlLW1lbHRk b3duLWNoZWNrZXIiKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAo Y29tbWl0IChzdHJpbmctYXBwZW5kICJ2IiB2ZXJzaW9uKSkpKQo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCAoZmlsZS1uYW1lIChnaXQtZmlsZS1uYW1lIG5hbWUgdmVyc2lvbikpCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChwYXRjaGVzCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgKHNlYXJjaC1wYXRjaGVzCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCAic3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyLXJlbW92ZS1idWlsdGluLWZpcm13YXJlLQo+IGRh dGFiYXNlLnBhdGNoIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsKPiBodHRw czovL2dpdGh1Yi5jb20vc3BlZWQ0Ny9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXIvcHVsbC80NDEK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJzcGVjdHJlLW1lbHRkb3duLWNoZWNr ZXItc3VwcG9ydC1ndWl4LXN5c3RlbS0KPiBrZXJuZWwucGF0Y2giKSkKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgOzsgUmVtb3ZlIGJ1aWx0aW4gZmlybXdhcmUgZGF0YWJhc2UuCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChtb2R1bGVzICcoKGd1aXggYnVpbGQgdXRpbHMpKSkK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHNuaXBwZXQgJyhzdWJzdGl0dXRlKiAic3Bl Y3RyZS1tZWx0ZG93bi1jaGVja2VyLnNoIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoKCJeIyBbQUldLC4qIikgIiIpKSkKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgKHNoYTI1Ngo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IChiYXNlMzIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgCj4gIjF4eDhoNTc5MWxo YzJ4dzBkY2J6amtrbHp2bHh3eGtqemg4ZGk0ZzhkaXZmeTI0ZnFzbjgiKSkpKQo+ICvCoMKgwqAg KGJ1aWxkLXN5c3RlbSBjb3B5LWJ1aWxkLXN5c3RlbSkKPiArwqDCoMKgIChhcmd1bWVudHMKPiAr wqDCoMKgwqAgKGxpc3QKPiArwqDCoMKgwqDCoCAjOmluc3RhbGwtcGxhbgo+ICvCoMKgwqDCoMKg ICN+JygoInNwZWN0cmUtbWVsdGRvd24tY2hlY2tlci5zaCIgImJpbi9zcGVjdHJlLW1lbHRkb3du LQo+IGNoZWNrZXIiKSkKPiArwqDCoMKgwqDCoCAjOnBoYXNlcwo+ICvCoMKgwqDCoMKgICN+KG1v ZGlmeS1waGFzZXMgJXN0YW5kYXJkLXBoYXNlcwo+ICvCoMKgwqDCoMKgwqDCoMKgwqAgKGFkZC1h ZnRlciAndW5wYWNrICdmaXhwYXRoCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGxhbWJkYSog KCM6a2V5IGlucHV0cyAjOmFsbG93LW90aGVyLWtleXMpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIChkZWZpbmUqIChmaW5kLWNvbW1hbmQgaW5wdXRzIGNtZCAjOm9wdGlvbmFsIChiaW4K PiAiYmluIikKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICM6a2V5IChwcmVmaXggIiIpIChzdWZmaXggIiIp KQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHN0cmluZy1hcHBlbmQKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJlZml4IChzZWFyY2gtaW5wdXQtZmlsZSBp bnB1dHMgKHN0cmluZy1hcHBlbmQgYmluCj4gIi8iIGNtZCkpCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHN1ZmZpeCkpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChz dWJzdGl0dXRlKiAic3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyLnNoIgo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgOzsgJHtvcHRfYXJjaF9wcmVmaXh9Q01ECj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAoKChzdHJpbmctYXBwZW5kCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAiXFwkXFx7b3B0X2FyY2hfcHJlZml4XFx9Igo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIlxcPChubXxvYmpkdW1wfHJlYWRlbGZ8c3Ry aW5ncylcXD4iKSBhbGwgY21kKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAo ZmluZC1jb21tYW5kIGlucHV0cyBjbWQpKQo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIDs7IGRkCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoKCIoZGQpKCBp Zj0pIiBhbGwgY21kIHN1ZmZpeCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg KGZpbmQtY29tbWFuZCBpbnB1dHMgY21kICM6c3VmZml4IHN1ZmZpeCkpCj4gKwo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsgQ29tbWFuZHMgc2FmZSB0byBzdWJzdGl0dXRlIGRp cmVjdGx5Lgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKCgoc3RyaW5nLWFwcGVu ZCAiXFw8KCIgKHN0cmluZy1qb2luCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChsaXN0ICJh d2siCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJiYXNlbmFtZSIKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgImRpcm5hbWUiCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJidW56aXAyIgo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAiZ3VuemlwIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCAiZ3ppcCIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Imx6NCIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgImx6b3AiCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJtb2Rwcm9iZSIKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgInBncmVwIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCAicm1tb2QiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgICJ1bW91bnQiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJ1 bmx6bWEiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJ1bnh6Igo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAidW56c3RkIgo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAidXVlbmNvZGUiKQo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCAifCIpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIilcXD4iKSBhbGwgY21kKQpyZXBsYWNlZCB0aGVzZSAi Y2xldmVyIiB0cmlja3Mgd2l0aCBkdW1iZXIgb25lcywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgKGZpbmQtY29tbWFuZCBpbnB1dHMgY21kKSkKPiArCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCA7OyBTZWFyY2ggYnkgc3VmZml4Lgo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgOzsgQ01EIC0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIDs7IENNRCBeCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoKChzdHJpbmct YXBwZW5kICJcXDwoIiAoc3RyaW5nLWpvaW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGxp c3QgImJhc2U2NCIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgImN1dCIK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgImdyZXAiCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJoZWFkIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCAiaWQiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICJtb3VudCIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIm1rdGVt cCIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIm9kIgo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAicGVybCIKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgInJtIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCAidW5hbWUiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJ4YXJn cyIpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJ8IikKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAiKVxcPiggWy1e XSkiKSBhbGwgY21kIHN1ZmZpeCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg KGZpbmQtY29tbWFuZCBpbnB1dHMgY21kICM6c3VmZml4IHN1ZmZpeCkpCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCA7OyBDTUQgfAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgKCgiKGRtZXNnKSggXFx8KSIgYWxsIGNtZCBzdWZmaXgpCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIChmaW5kLWNvbW1hbmQgaW5wdXRzIGNtZCAjOnN1ZmZpeCBzdWZm aXgpKQo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDs7IFRoZW4gcHJlZml4 Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCA7OyB8IENNRAo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgKCgiKFxcfCApXFw8KGdyZXB8c2VkfHNvcnR8c3RhdHx0cilc XD4iIGFsbCBwcmVmaXgKPiBjbWQpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IChmaW5kLWNvbW1hbmQgaW5wdXRzIGNtZCAjOnByZWZpeCBwcmVmaXgpKQo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsgJChDTUQKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgICgoIihcXCRcXCggKikoc3lzY3RsKSIgYWxsIHByZWZpeCBjbWQpCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChmaW5kLWNvbW1hbmQgaW5wdXRzIGNtZCAic2JpbiIg IzpwcmVmaXggcHJlZml4KSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgCj4gKCgi KFxcJFxcKClcXDwoY2F0fGZpbmR8Z3JlcHxtb3VudHxucHJvY3xzdGF0fHRyKVxcPiIgYWxsIHBy ZWZpeCBjbWQpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChmaW5kLWNvbW1h bmQgaW5wdXRzIGNtZCAjOnByZWZpeCBwcmVmaXgpKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgOzsgaWYgQ01ECj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoKCIo aWYgKShzeXNjdGwpIiBhbGwgcHJlZml4IGNtZCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgKGZpbmQtY29tbWFuZCBpbnB1dHMgY21kICJzYmluIiAjOnByZWZpeCBwcmVmaXgp KQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsgY29tbWFuZCAtdiBDTUQKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICgoIihjb21tYW5kIC12KQo+IFwiKlxcPChi YXNlNjR8bnByb2N8cGVybHxwcmludGYpXFw+XCIqIiBhbGwgcHJlZml4IGNtZCkKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGZpbmQtY29tbWFuZCBpbnB1dHMgY21kICM6cHJl Zml4IHByZWZpeCkpCj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsgQ2F0 cyBhcmUgbXlzdGVyaW91cy4uLgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsg Y2F0IDw8RU9GCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoKCIoY2F0KSggPDxF T0YpIiBhbGwgY21kIHN1ZmZpeCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg KGZpbmQtY29tbWFuZCBpbnB1dHMgY21kICM6c3VmZml4IHN1ZmZpeCkpCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCA7OyBjYXQgIiQKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgICgoIihjYXQpKFwiXFwkKSIgYWxsIGNtZCBzdWZmaXgpCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIChmaW5kLWNvbW1hbmQgaW5wdXRzIGNtZCAjOnN1ZmZpeCBzdWZm aXgpKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsgJ2NhdCcKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICgoIignKShjYXQpKCcpIiBhbGwgcHJlZml4IGNtZCBz dWZmaXgpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChmaW5kLWNvbW1hbmQg aW5wdXRzIGNtZCAjOnByZWZpeCBwcmVmaXggIzpzdWZmaXgKPiBzdWZmaXgpKQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsgImNhdCIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgICgoIihcIikoY2F0KShcIikiIGFsbCBwcmVmaXggY21kIHN1ZmZpeCkKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGZpbmQtY29tbWFuZCBpbnB1dHMgY21kICM6 cHJlZml4IHByZWZpeCAjOnN1ZmZpeAo+IHN1ZmZpeCkpKSkpKSkpCj4gK8KgwqDCoCAoaW5wdXRz IChsaXN0IGttb2QgbHo0IGx6b3AgcGVybCBwcm9jcHMgc2hhcnV0aWxzIHV0aWwtbGludXgKPiB6 c3RkKSkKPiArwqDCoMKgIChob21lLXBhZ2UKPiAiaHR0cHM6Ly9naXRodWIuY29tL3NwZWVkNDcv c3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyIikKPiArwqDCoMKgIChzeW5vcHNpcyAiQ1BVIHZ1bG5l cmFiaWxpdHkgLyBtaXRpZ2F0aW9uIGNoZWNrZXIiKQo+ICvCoMKgwqAgKGRlc2NyaXB0aW9uCj4g K8KgwqDCoMKgICJUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYSBzaGVsbCBzY3JpcHQgdG8gYXNzZXNz IHlvdXIgc3lzdGVtJ3MKPiByZXNpbGllbmNlCj4gK2FnYWluc3QgdGhlIHNldmVyYWwgdHJhbnNp ZW50IGV4ZWN1dGlvbiBDVkVzIHRoYXQgd2VyZSBwdWJsaXNoZWQKPiBzaW5jZSBlYXJseQo+ICsy MDE4LCBhbmQgZ2l2ZSB5b3UgZ3VpZGFuY2UgYXMgdG8gaG93IHRvIG1pdGlnYXRlIHRoZW0uIikK PiArwqDCoMKgIChsaWNlbnNlIGxpY2Vuc2U6Z3BsMykpKQo+IGRpZmYgLS1naXQgYS9nbnUvcGFj a2FnZXMvcGF0Y2hlcy9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXItcmVtb3ZlLQo+IGJ1aWx0aW4t ZmlybXdhcmUtZGF0YWJhc2UucGF0Y2ggYi9nbnUvcGFja2FnZXMvcGF0Y2hlcy9zcGVjdHJlLQo+ IG1lbHRkb3duLWNoZWNrZXItcmVtb3ZlLWJ1aWx0aW4tZmlybXdhcmUtZGF0YWJhc2UucGF0Y2gK PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAwMDAuLjgwOTc2M2NmNGYKPiAt LS0gL2Rldi9udWxsCj4gKysrIGIvZ251L3BhY2thZ2VzL3BhdGNoZXMvc3BlY3RyZS1tZWx0ZG93 bi1jaGVja2VyLXJlbW92ZS1idWlsdGluLQo+IGZpcm13YXJlLWRhdGFiYXNlLnBhdGNoCj4gQEAg LTAsMCArMSwyNDMgQEAKPiArRnJvbSAzNDBiMDg3MzdlNTUyYzNjMTg2ODYzZDc2ZDEyMzgwOGQ4 NTNhMTU5IE1vbiBTZXAgMTcgMDA6MDA6MDAKPiAyMDAxCj4gK0Zyb206IEhpbHRvbiBDaGFpbiA8 aGFrb0B1bHRyYXJhcmUuc3BhY2U+Cj4gK0RhdGU6IFNhdCwgMTIgTm92IDIwMjIgMjI6NDU6MjQg KzA4MDAKPiArU3ViamVjdDogW1BBVENIXSBSZW1vdmUgYnVpbHRpbiBmaXJtd2FyZSBkYXRhYmFz ZS4KPiArCj4gKzEuIFJlbW92ZSBkb3dubG9hZGluZyBmdW5jdGlvbi4KPiArMi4gQWRkIG9wdGlv biBmb3Igc3VwcGx5aW5nIGEgbG9jYWwgZGF0YWJhc2UuCj4gKy0tLQo+ICsgc3BlY3RyZS1tZWx0 ZG93bi1jaGVja2VyLnNoIHwgMTgwICsrKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ IC0tLQo+ICsgMSBmaWxlIGNoYW5nZWQsIDE1IGluc2VydGlvbnMoKyksIDE2NSBkZWxldGlvbnMo LSkKPiArCj4gK2RpZmYgLS1naXQgYS9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXIuc2ggYi9zcGVj dHJlLW1lbHRkb3duLQo+IGNoZWNrZXIuc2gKPiAraW5kZXggMzBmNzYwYy4uY2U0Njk3MCAxMDA3 NTUKPiArLS0tIGEvc3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyLnNoCj4gKysrKyBiL3NwZWN0cmUt bWVsdGRvd24tY2hlY2tlci5zaAo+ICtAQCAtMjIsOCArMjIsNiBAQCBleGl0X2NsZWFudXAoKQo+ ICvCoMKgwqDCoMKgwqDCoFsgLW4gIiR7ZHVtcGVkX2NvbmZpZzotfSIgXSAmJiBbIC1mICIkZHVt cGVkX2NvbmZpZyIgXSAmJiBybQo+IC1mICIkZHVtcGVkX2NvbmZpZyIKPiArwqDCoMKgwqDCoMKg wqBbIC1uICIke2tlcm5lbHRtcDotfSLCoMKgwqDCoCBdICYmIFsgLWYgIiRrZXJuZWx0bXAiwqDC oMKgwqAgXSAmJiBybQo+IC1mICIka2VybmVsdG1wIgo+ICvCoMKgwqDCoMKgwqDCoFsgLW4gIiR7 a2VybmVsdG1wMjotfSLCoMKgwqAgXSAmJiBbIC1mICIka2VybmVsdG1wMiLCoMKgwqAgXSAmJiBy bQo+IC1mICIka2VybmVsdG1wMiIKPiArLcKgwqDCoMKgwqDCoFsgLW4gIiR7bWNlZGJfdG1wOi19 IsKgwqDCoMKgIF0gJiYgWyAtZiAiJG1jZWRiX3RtcCLCoMKgwqDCoCBdICYmIHJtCj4gLWYgIiRt Y2VkYl90bXAiCj4gKy3CoMKgwqDCoMKgwqBbIC1uICIke2ludGVsX3RtcDotfSLCoMKgwqDCoCBd ICYmIFsgLWQgIiRpbnRlbF90bXAiwqDCoMKgwqAgXSAmJiBybQo+IC1yZiAiJGludGVsX3RtcCIK PiArwqDCoMKgwqDCoMKgwqBbICIke21vdW50ZWRfZGVidWdmczotfSIgPSAxIF0gJiYgdW1vdW50 IC9zeXMva2VybmVsL2RlYnVnCj4gMj4vZGV2L251bGwKPiArwqDCoMKgwqDCoMKgwqBbICIke21v dW50ZWRfcHJvY2ZzOi19IsKgID0gMSBdICYmIHVtb3VudCAiJHByb2NmcyIKPiAyPi9kZXYvbnVs bAo+ICvCoMKgwqDCoMKgwqDCoFsgIiR7aW5zbW9kX2NwdWlkOi19IsKgwqDCoCA9IDEgXSAmJiBy bW1vZCBjcHVpZCAyPi9kZXYvbnVsbAo+ICtAQCAtOTMsOSArOTEsNyBAQCBzaG93X3VzYWdlKCkK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLS12bW0gW2F1dG8seWVzLG5vXcKgwqDC oMKgwqBvdmVycmlkZSB0aGUgZGV0ZWN0aW9uIG9mIHRoZQo+IHByZXNlbmNlIG9mIGEgaHlwZXJ2 aXNvciwgZGVmYXVsdDogYXV0bwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAtLWFs bG93LW1zci13cml0ZcKgwqDCoMKgwqDCoMKgYWxsb3cgcHJvYmluZyBmb3Igd3JpdGUtb25seQo+ IE1TUnMsIHRoaXMgbWlnaHQgcHJvZHVjZSBrZXJuZWwgbG9ncyBvciBiZSBibG9ja2VkIGJ5IHlv dXIgc3lzdGVtCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC0tY3B1IFsjLGFsbF3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgaW50ZXJhY3Qgd2l0aCBDUFVJRCBhbmQgTVNSCj4gb2YgQ1BV IGNvcmUgbnVtYmVyICMsIG9yIGFsbCAoZGVmYXVsdDogQ1BVIGNvcmUgMCkKPiArLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAtLXVwZGF0ZS1md2RiwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHVw ZGF0ZSBvdXIgbG9jYWwgY29weSBvZiB0aGUKPiBDUFUgbWljcm9jb2RlcyB2ZXJzaW9ucyBkYXRh YmFzZSAodXNpbmcgdGhlIGF3ZXNvbWUKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBNQ0V4dHJhY3Rv ciBwcm9qZWN0IGFuZCB0aGUKPiBJbnRlbCBmaXJtd2FyZXMgR2l0SHViIHJlcG9zaXRvcnkpCj4g Ky3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLS11cGRhdGUtYnVpbHRpbi1md2RiwqDCoMKg c2FtZSBhcyAtLXVwZGF0ZS1md2RiIGJ1dAo+IHVwZGF0ZSBidWlsdGluIERCIGluc2lkZSB0aGUg c2NyaXB0IGl0c2VsZgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC0td2l0aC1md2Ri IEZJTEXCoMKgwqDCoMKgwqDCoMKgc3VwcGx5IHRoZSBDUFUgbWljcm9jb2Rlcwo+IHZlcnNpb25z IGRhdGFiYXNlCmFuZCBhZGRlZCBhIG5vdGUgcmVnYXJkaW5nIHRoZSAobGFjayBvZikgZnJlZWRv bSBmb3IgcHJvcHJpZXRhcnkKbWljcm9jb2RlLgoKSSBhbHNvIGFkZGVkIHlvdXIgbmFtZSBhbmQg ZW1haWwgdG8gdGhlIGF1dGhvcnMgb2YgbGludXguc2NtLCBzaW5jZQp0aGlzIHdhcyBhIHZlcnkg bm9uLXRyaXZpYWwgcGFja2FnZS4KCkNoZWVycwo= ------------=_1668376982-13922-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at submit) by debbugs.gnu.org; 5 Nov 2022 15:58:13 +0000 Received: from localhost ([127.0.0.1]:57861 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1orLYf-0004k9-MP for submit@debbugs.gnu.org; Sat, 05 Nov 2022 11:58:13 -0400 Received: from lists.gnu.org ([209.51.188.17]:44182) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1orLYT-0004jZ-7n for submit@debbugs.gnu.org; Sat, 05 Nov 2022 11:58:08 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1orLYT-0005Mw-2E for guix-patches@gnu.org; Sat, 05 Nov 2022 11:57:57 -0400 Received: from mail.boiledscript.com ([144.168.59.46]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1orLYR-000512-8J for guix-patches@gnu.org; Sat, 05 Nov 2022 11:57:56 -0400 Date: Sat, 05 Nov 2022 23:57:31 +0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ultrarare.space; s=dkim; t=1667663870; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Ttl4L85m1+0yZ08LJcm7GzOCew1V1+q69FtD9JJH3/c=; b=WXXOI4CLHWaWqLKVc4UlLUHsp5f6co6wmX0ARhOULAMexXC+YvE1r0enpoFYjQ1dcxbguL YwSBeusTFIt4uTks/ra7PbMbIp+67Q5z3dI7uKXKBy2zvix4DJdGusagLVNffwqVLAMNGY Mu5bgCDDt64fNRaaYZyx+4ovIgMqd/5Tv2HllzM8f8C73ciPUx55uvKOjUfD3QpdYYDguU UH4T9KBkR7pQGBmlnKyGAH5mERj90TQjgYWs/W7DQ36NXxJjaw4lWiWEWI2CGdv9gA9x0g cc2RijIjrNW/KG66vQ/Zwu8PnotWhL4KOnS7hqVWwhs19xxd+izty1RA6wZwuA== Message-ID: From: Hilton Chain To: guix-patches@gnu.org Subject: [PATCH] gnu: Add spectre-meltdown-checker. MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 8bit X-Spamd-Bar: / Authentication-Results: mail.boiledscript.com; auth=pass smtp.mailfrom=hako@ultrarare.space Received-SPF: pass client-ip=144.168.59.46; envelope-from=hako@ultrarare.space; helo=mail.boiledscript.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.3 (--) * gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch: New file. * gnu/packages/linux.scm (spectre-meltdown-checker): New variable. * gnu/local.mk (dist_patch_DATA): Add it. --- gnu/local.mk | 1 + gnu/packages/linux.scm | 41 +++++++++++++++++++ ...n-checker-support-guix-system-kernel.patch | 26 ++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch diff --git a/gnu/local.mk b/gnu/local.mk index eb6ac3df58..88c1fa6278 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -1848,6 +1848,7 @@ dist_patch_DATA = \ %D%/packages/patches/syslinux-strip-gnu-property.patch \ %D%/packages/patches/snappy-add-O2-flag-in-CmakeLists.txt.patch \ %D%/packages/patches/snappy-add-inline-for-GCC.patch \ + %D%/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch \ %D%/packages/patches/sphinxbase-fix-doxygen.patch \ %D%/packages/patches/spice-vdagent-glib-2.68.patch \ %D%/packages/patches/sssd-optional-systemd.patch \ diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index cf11a7fc1b..db199869a7 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -9512,3 +9512,44 @@ (define-public tp-smapi-module @acronym{SMAPI, System Management Application Program Interface} and direct access to the embedded controller.") (license license:gpl2+))) + +(define-public spectre-meltdown-checker + (package + (name "spectre-meltdown-checker") + (version "0.45") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/speed47/spectre-meltdown-checker") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (patches + (search-patches + ;; https://github.com/speed47/spectre-meltdown-checker/pull/441 + "spectre-meltdown-checker-support-guix-system-kernel.patch")) + (sha256 + (base32 + "1xx8h5791lhc2xw0dcbzjkklzvlxwxkjzh8di4g8divfy24fqsn8")))) + (build-system copy-build-system) + (arguments + (list #:install-plan + #~'(("spectre-meltdown-checker.sh" "bin/spectre-meltdown-checker")) + #:phases + #~(modify-phases %standard-phases + (add-after 'unpack 'fixpath + (lambda* (#:key inputs #:allow-other-keys) + (substitute* "spectre-meltdown-checker.sh" + (("\\$\\{opt_arch_prefix\\}readelf") + (search-input-file inputs "/bin/readelf")) + (("perl") + (search-input-file inputs "/bin/perl")))))))) + (inputs (list binutils perl)) + (home-page "https://github.com/speed47/spectre-meltdown-checker") + (synopsis + "Spectre, Meltdown, Foreshadow, Fallout, RIDL, ZombieLoad vulnerability / +mitigation checker for Linux & BSD") + (description + "A shell script to assess your system's resilience against the several +transient execution CVEs that were published since early 2018, and give you +guidance as to how to mitigate them.") + (license license:gpl3))) diff --git a/gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch b/gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch new file mode 100644 index 0000000000..afec52b418 --- /dev/null +++ b/gnu/packages/patches/spectre-meltdown-checker-support-guix-system-kernel.patch @@ -0,0 +1,26 @@ +From 5b757d930ec0cf102b03fb9817d17e06c72e74b3 Mon Sep 17 00:00:00 2001 +From: Hilton Chain +Date: Sat, 5 Nov 2022 23:22:31 +0800 +Subject: [PATCH] Add support for Guix System kernel. + +--- + spectre-meltdown-checker.sh | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/spectre-meltdown-checker.sh b/spectre-meltdown-checker.sh +index 248a444..855a090 100755 +--- a/spectre-meltdown-checker.sh ++++ b/spectre-meltdown-checker.sh +@@ -2251,6 +2251,8 @@ if [ "$opt_live" = 1 ]; then + [ -e "/boot/kernel-genkernel-$(uname -m)-$(uname -r)" ] && opt_kernel="/boot/kernel-genkernel-$(uname -m)-$(uname -r)" + # NixOS: + [ -e "/run/booted-system/kernel" ] && opt_kernel="/run/booted-system/kernel" ++ # Guix System: ++ [ -e "/run/booted-system/kernel/bzImage" ] && opt_kernel="/run/booted-system/kernel/bzImage" + # systemd kernel-install: + [ -e "/etc/machine-id" ] && [ -e "/boot/$(cat /etc/machine-id)/$(uname -r)/linux" ] && opt_kernel="/boot/$(cat /etc/machine-id)/$(uname -r)/linux" + # Clear Linux: + +base-commit: a6c943d38f315f339697ec26e7374a09b88f2183 +-- +2.38.0 base-commit: 2211f50ec1ebcf5f880454b4133ac40e41abac21 -- 2.38.0 ------------=_1668376982-13922-1-- From unknown Sun Jun 22 11:49:37 2025 MIME-Version: 1.0 X-Mailer: MIME-tools 5.505 (Entity 5.505) X-Loop: help-debbugs@gnu.org From: help-debbugs@gnu.org (GNU bug Tracking System) To: phodina Subject: bug#49898: closed (Re: [PATCH v5] gnu: Add spectre-meltdown-checker.) Message-ID: References: X-Gnu-PR-Message: they-closed 49898 X-Gnu-PR-Package: guix-patches X-Gnu-PR-Keywords: moreinfo patch Reply-To: 49898@debbugs.gnu.org Date: Sun, 13 Nov 2022 22:03:02 +0000 Content-Type: multipart/mixed; boundary="----------=_1668376982-13922-3" This is a multi-part message in MIME format... ------------=_1668376982-13922-3 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Your bug report #59053: [PATCH] gnu: Add spectre-meltdown-checker. which was filed against the guix-patches package, has been closed. The explanation is attached below, along with your original report. If you require more details, please reply to 49898@debbugs.gnu.org. --=20 59053: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D59053 GNU Bug Tracking System Contact help-debbugs@gnu.org with problems ------------=_1668376982-13922-3 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at 59053-done) by debbugs.gnu.org; 13 Nov 2022 22:02:18 +0000 Received: from localhost ([127.0.0.1]:48548 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ouL3R-0003ba-Qz for submit@debbugs.gnu.org; Sun, 13 Nov 2022 17:02:18 -0500 Received: from mail-ed1-f49.google.com ([209.85.208.49]:34608) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ouL3N-0003bJ-Lg for 59053-done@debbugs.gnu.org; Sun, 13 Nov 2022 17:02:17 -0500 Received: by mail-ed1-f49.google.com with SMTP id v27so14810711eda.1 for <59053-done@debbugs.gnu.org>; Sun, 13 Nov 2022 14:02:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:cc:to:from:subject:message-id:from:to:cc:subject :date:message-id:reply-to; bh=qjlppKQEkmD3BQ8sdxd/DfsbkOvL4TyXSsGlEO6elpU=; b=SyCJVFXJIPOmHC3Ecc0nooodH0JMtBplNVBiHJxaLFgSGQI3n2Krq6MTlm4DDsrVJb 1sYELn4rdbQDfaNRLMIl23FdTHgASdsamk35Vna5578gvOd78Lzmq0xTGDLeraoqqT3G SXF8GA8Hxg0dKdHd3fEKs/hjXN38MA1q/NSx7fxftXylBCNbqtIhGDrTalrUu7NL+i8K joKkBQni4lhOhVuY/oHID6xlID2sALrciJcH4ZAHv2cjAbOBsY6yVgt/1Vq+1zSat3zP k6r6FQ7WFdkPlky189z8NiqTdH5uf21ySAmM+lb3e7ViCZjNOscsCWx4J8uNCZJ3sYr3 NS8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:cc:to:from:subject:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=qjlppKQEkmD3BQ8sdxd/DfsbkOvL4TyXSsGlEO6elpU=; b=ywodOubzhl/vNiIcLU6TzDWBlBkRAcKXzZr64kYIgiKUF/ZRjoiGFl0MmWu5zgQjqT M3HRWrmZTNM4XFw5/BY9TIXV6IxiSovexAyVlVcke2vWCGxORXKRk6eEItVGRrkfTRhl s1Kt/Nf9MEWEolT3suz+H2ZCq/neF7RV2HgrE1jAlGyMkxECkRvI2BIMRItnI1SCFJjd NAeEJtHdfoFQWytufvqIx2qaijyBdIw4hG+g7j7w3JeMwyDnwraYDxuPy/oXzZltWVUy RPyx02uaYYFcV1fauV8B+yeIdwprwoKgN+W6y4iWkzwMxcgBA3d0rWC8r04+dlB65BLy Qb0w== X-Gm-Message-State: ANoB5pm9mP39s1fJOJMOR3q5nqVEP72YPxa6mpZzzuuXheXS1o4N7oBv 2jDMs7R21r6kYm4MbCz5Wbg= X-Google-Smtp-Source: AA0mqf7WUaxLQMuUr0aCmqrYAWVYzihRFV46gfB1w9kRMF84n+PpHpL/7wETv7Qc6ngL+bvyWVEJkA== X-Received: by 2002:a50:ef10:0:b0:461:ecca:e8a with SMTP id m16-20020a50ef10000000b00461ecca0e8amr9247019eds.139.1668376927797; Sun, 13 Nov 2022 14:02:07 -0800 (PST) Received: from lumine.fritz.box (85-127-52-93.dsl.dynamic.surfer.at. [85.127.52.93]) by smtp.gmail.com with ESMTPSA id y22-20020a056402171600b0046776f98d0csm2697774edu.79.2022.11.13.14.02.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Nov 2022 14:02:07 -0800 (PST) Message-ID: Subject: Re: [PATCH v5] gnu: Add spectre-meltdown-checker. From: Liliana Marie Prikler To: Hilton Chain Date: Sun, 13 Nov 2022 23:02:06 +0100 In-Reply-To: References: <62dbdc4784403cc138909884b50a399485a2451f.camel@gmail.com> <60647514a548fc2589c1816ca8fef94fa20a7b94.camel@gmail.com> <3e3c90ad73311a445a3b06c7c8afb42dcf0af1b1.camel@gmail.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 User-Agent: Evolution 3.46.0 MIME-Version: 1.0 X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 59053-done Cc: 59053-done@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) QW0gU29ubnRhZywgZGVtIDEzLjExLjIwMjIgdW0gMjE6MDkgKzA4MDAgc2NocmllYiBIaWx0b24g Q2hhaW46Cj4gKiBnbnUvcGFja2FnZXMvbGludXguc2NtIChzcGVjdHJlLW1lbHRkb3duLWNoZWNr ZXIpOiBOZXcgdmFyaWFibGUuCj4gKiBnbnUvcGFja2FnZXMvcGF0Y2hlcy9zcGVjdHJlLW1lbHRk b3duLWNoZWNrZXItc3VwcG9ydC1ndWl4LXN5c3RlbS0KPiBrZXJuZWwucGF0Y2g6Cj4gTmV3IGZp bGUuCj4gKiBnbnUvcGFja2FnZXMvcGF0Y2hlcy9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXItcmVt b3ZlLWJ1aWx0aW4tCj4gZmlybXdhcmUtZGF0YWJhc2UucGF0Y2g6Cj4gTmV3IGZpbGUuCj4gKiBn bnUvbG9jYWwubWsgKGRpc3RfcGF0Y2hfREFUQSk6IEFkZCBwYXRjaGVzLgpJIHJlbmFtZWQgdGhl IHBhdGNoZXMgZm9yIHRoZSBDaGFuZ2VMb2csIHNsaWdodGx5IHJld3JvdGUgdGhlaXIKZXhwbGFu YXRpb25zLCAuLi4KCj4gwqBnbnUvbG9jYWwubWvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqAgMiArCj4gwqBnbnUv cGFja2FnZXMvbGludXguc2NtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB8IDEzMCArKysrKysrKysrCj4gwqAuLi5rZXItcmVtb3ZlLWJ1aWx0aW4tZmlybXdh cmUtZGF0YWJhc2UucGF0Y2ggfCAyNDMKPiArKysrKysrKysrKysrKysrKysKPiDCoC4uLm4tY2hl Y2tlci1zdXBwb3J0LWd1aXgtc3lzdGVtLWtlcm5lbC5wYXRjaCB8wqAgMjYgKysKPiDCoDQgZmls ZXMgY2hhbmdlZCwgNDAxIGluc2VydGlvbnMoKykKPiDCoGNyZWF0ZSBtb2RlIDEwMDY0NCBnbnUv cGFja2FnZXMvcGF0Y2hlcy9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXItCj4gcmVtb3ZlLWJ1aWx0 aW4tZmlybXdhcmUtZGF0YWJhc2UucGF0Y2gKPiDCoGNyZWF0ZSBtb2RlIDEwMDY0NCBnbnUvcGFj a2FnZXMvcGF0Y2hlcy9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXItCj4gc3VwcG9ydC1ndWl4LXN5 c3RlbS1rZXJuZWwucGF0Y2gKPiAKPiBkaWZmIC0tZ2l0IGEvZ251L2xvY2FsLm1rIGIvZ251L2xv Y2FsLm1rCj4gaW5kZXggZTNlMDIzMTRiYi4uMWU4NTc5MDk4MyAxMDA2NDQKPiAtLS0gYS9nbnUv bG9jYWwubWsKPiArKysgYi9nbnUvbG9jYWwubWsKPiBAQCAtMTg1Nyw2ICsxODU3LDggQEAgZGlz dF9wYXRjaF9EQVRBCj4gPcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBcCj4gwqDCoCAlRCUvcGFj a2FnZXMvcGF0Y2hlcy9zeXNsaW51eC1zdHJpcC1nbnUtcHJvcGVydHkucGF0Y2jCoMKgwqDCoMKg wqDCoFwKPiDCoMKgICVEJS9wYWNrYWdlcy9wYXRjaGVzL3NuYXBweS1hZGQtTzItZmxhZy1pbi0K PiBDbWFrZUxpc3RzLnR4dC5wYXRjaMKgwqDCoMKgwqDCoFwKPiDCoMKgICVEJS9wYWNrYWdlcy9w YXRjaGVzL3NuYXBweS1hZGQtaW5saW5lLWZvci1HQ0MucGF0Y2jCoMKgwqDCoMKgwqDCoMKgwqBc Cj4gK8KgICVEJS9wYWNrYWdlcy9wYXRjaGVzL3NwZWN0cmUtbWVsdGRvd24tY2hlY2tlci1yZW1v dmUtYnVpbHRpbi0KPiBmaXJtd2FyZS1kYXRhYmFzZS5wYXRjaCBcCj4gK8KgICVEJS9wYWNrYWdl cy9wYXRjaGVzL3NwZWN0cmUtbWVsdGRvd24tY2hlY2tlci1zdXBwb3J0LWd1aXgtc3lzdGVtLQo+ IGtlcm5lbC5wYXRjaCBcCj4gwqDCoCAlRCUvcGFja2FnZXMvcGF0Y2hlcy9zcGhpbnhiYXNlLWZp eC1kb3h5Z2VuLnBhdGNowqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+IMKgwqAgJUQlL3BhY2th Z2VzL3BhdGNoZXMvc3BpY2UtdmRhZ2VudC1nbGliLTIuNjgucGF0Y2jCoMKgwqDCoMKgwqDCoMKg wqDCoMKgXAo+IMKgwqAgJUQlL3BhY2thZ2VzL3BhdGNoZXMvc3NzZC1vcHRpb25hbC1zeXN0ZW1k LnBhdGNowqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBcCj4gZGlmZiAtLWdpdCBhL2dudS9wYWNr YWdlcy9saW51eC5zY20gYi9nbnUvcGFja2FnZXMvbGludXguc2NtCj4gaW5kZXggZmVhMzNkZmEw Yi4uMDNiN2NlNDZiMCAxMDA2NDQKPiAtLS0gYS9nbnUvcGFja2FnZXMvbGludXguc2NtCj4gKysr IGIvZ251L3BhY2thZ2VzL2xpbnV4LnNjbQo+IEBAIC05NTk1LDMgKzk1OTUsMTMzIEBAIChkZWZp bmUtcHVibGljIGVkYWMtdXRpbHMKPiDCoGVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiAo RURBQykuIikKPiDCoMKgwqDCoCAoaG9tZS1wYWdlICJodHRwczovL2dpdGh1Yi5jb20vZ3JvbmRv L2VkYWMtdXRpbHMiKQo+IMKgwqDCoMKgIChsaWNlbnNlIGxpY2Vuc2U6Z3BsMispKSkKPiArCj4g KyhkZWZpbmUtcHVibGljIHNwZWN0cmUtbWVsdGRvd24tY2hlY2tlcgo+ICvCoCAocGFja2FnZQo+ ICvCoMKgwqAgKG5hbWUgInNwZWN0cmUtbWVsdGRvd24tY2hlY2tlciIpCj4gK8KgwqDCoCAodmVy c2lvbiAiMC40NSIpCj4gK8KgwqDCoCAoc291cmNlIChvcmlnaW4KPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgKG1ldGhvZCBnaXQtZmV0Y2gpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICh1cmkgKGdpdC1yZWZlcmVuY2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgKHVybAo+ICJodHRwczovL2dpdGh1Yi5jb20vc3BlZWQ0Ny9zcGVjdHJlLW1lbHRk b3duLWNoZWNrZXIiKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAo Y29tbWl0IChzdHJpbmctYXBwZW5kICJ2IiB2ZXJzaW9uKSkpKQo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCAoZmlsZS1uYW1lIChnaXQtZmlsZS1uYW1lIG5hbWUgdmVyc2lvbikpCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChwYXRjaGVzCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgKHNlYXJjaC1wYXRjaGVzCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCAic3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyLXJlbW92ZS1idWlsdGluLWZpcm13YXJlLQo+IGRh dGFiYXNlLnBhdGNoIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsKPiBodHRw czovL2dpdGh1Yi5jb20vc3BlZWQ0Ny9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXIvcHVsbC80NDEK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJzcGVjdHJlLW1lbHRkb3duLWNoZWNr ZXItc3VwcG9ydC1ndWl4LXN5c3RlbS0KPiBrZXJuZWwucGF0Y2giKSkKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgOzsgUmVtb3ZlIGJ1aWx0aW4gZmlybXdhcmUgZGF0YWJhc2UuCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChtb2R1bGVzICcoKGd1aXggYnVpbGQgdXRpbHMpKSkK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHNuaXBwZXQgJyhzdWJzdGl0dXRlKiAic3Bl Y3RyZS1tZWx0ZG93bi1jaGVja2VyLnNoIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoKCJeIyBbQUldLC4qIikgIiIpKSkKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgKHNoYTI1Ngo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IChiYXNlMzIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgCj4gIjF4eDhoNTc5MWxo YzJ4dzBkY2J6amtrbHp2bHh3eGtqemg4ZGk0ZzhkaXZmeTI0ZnFzbjgiKSkpKQo+ICvCoMKgwqAg KGJ1aWxkLXN5c3RlbSBjb3B5LWJ1aWxkLXN5c3RlbSkKPiArwqDCoMKgIChhcmd1bWVudHMKPiAr wqDCoMKgwqAgKGxpc3QKPiArwqDCoMKgwqDCoCAjOmluc3RhbGwtcGxhbgo+ICvCoMKgwqDCoMKg ICN+JygoInNwZWN0cmUtbWVsdGRvd24tY2hlY2tlci5zaCIgImJpbi9zcGVjdHJlLW1lbHRkb3du LQo+IGNoZWNrZXIiKSkKPiArwqDCoMKgwqDCoCAjOnBoYXNlcwo+ICvCoMKgwqDCoMKgICN+KG1v ZGlmeS1waGFzZXMgJXN0YW5kYXJkLXBoYXNlcwo+ICvCoMKgwqDCoMKgwqDCoMKgwqAgKGFkZC1h ZnRlciAndW5wYWNrICdmaXhwYXRoCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGxhbWJkYSog KCM6a2V5IGlucHV0cyAjOmFsbG93LW90aGVyLWtleXMpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIChkZWZpbmUqIChmaW5kLWNvbW1hbmQgaW5wdXRzIGNtZCAjOm9wdGlvbmFsIChiaW4K PiAiYmluIikKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICM6a2V5IChwcmVmaXggIiIpIChzdWZmaXggIiIp KQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHN0cmluZy1hcHBlbmQKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJlZml4IChzZWFyY2gtaW5wdXQtZmlsZSBp bnB1dHMgKHN0cmluZy1hcHBlbmQgYmluCj4gIi8iIGNtZCkpCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHN1ZmZpeCkpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChz dWJzdGl0dXRlKiAic3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyLnNoIgo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgOzsgJHtvcHRfYXJjaF9wcmVmaXh9Q01ECj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAoKChzdHJpbmctYXBwZW5kCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAiXFwkXFx7b3B0X2FyY2hfcHJlZml4XFx9Igo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIlxcPChubXxvYmpkdW1wfHJlYWRlbGZ8c3Ry aW5ncylcXD4iKSBhbGwgY21kKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAo ZmluZC1jb21tYW5kIGlucHV0cyBjbWQpKQo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIDs7IGRkCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoKCIoZGQpKCBp Zj0pIiBhbGwgY21kIHN1ZmZpeCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg KGZpbmQtY29tbWFuZCBpbnB1dHMgY21kICM6c3VmZml4IHN1ZmZpeCkpCj4gKwo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsgQ29tbWFuZHMgc2FmZSB0byBzdWJzdGl0dXRlIGRp cmVjdGx5Lgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKCgoc3RyaW5nLWFwcGVu ZCAiXFw8KCIgKHN0cmluZy1qb2luCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChsaXN0ICJh d2siCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJiYXNlbmFtZSIKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgImRpcm5hbWUiCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJidW56aXAyIgo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAiZ3VuemlwIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCAiZ3ppcCIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Imx6NCIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgImx6b3AiCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJtb2Rwcm9iZSIKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgInBncmVwIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCAicm1tb2QiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgICJ1bW91bnQiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJ1 bmx6bWEiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJ1bnh6Igo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAidW56c3RkIgo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAidXVlbmNvZGUiKQo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCAifCIpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIilcXD4iKSBhbGwgY21kKQpyZXBsYWNlZCB0aGVzZSAi Y2xldmVyIiB0cmlja3Mgd2l0aCBkdW1iZXIgb25lcywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgKGZpbmQtY29tbWFuZCBpbnB1dHMgY21kKSkKPiArCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCA7OyBTZWFyY2ggYnkgc3VmZml4Lgo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgOzsgQ01EIC0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIDs7IENNRCBeCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoKChzdHJpbmct YXBwZW5kICJcXDwoIiAoc3RyaW5nLWpvaW4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGxp c3QgImJhc2U2NCIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgImN1dCIK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgImdyZXAiCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJoZWFkIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCAiaWQiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICJtb3VudCIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIm1rdGVt cCIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIm9kIgo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAicGVybCIKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgInJtIgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCAidW5hbWUiCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJ4YXJn cyIpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJ8IikKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAiKVxcPiggWy1e XSkiKSBhbGwgY21kIHN1ZmZpeCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg KGZpbmQtY29tbWFuZCBpbnB1dHMgY21kICM6c3VmZml4IHN1ZmZpeCkpCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCA7OyBDTUQgfAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgKCgiKGRtZXNnKSggXFx8KSIgYWxsIGNtZCBzdWZmaXgpCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIChmaW5kLWNvbW1hbmQgaW5wdXRzIGNtZCAjOnN1ZmZpeCBzdWZm aXgpKQo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDs7IFRoZW4gcHJlZml4 Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCA7OyB8IENNRAo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgKCgiKFxcfCApXFw8KGdyZXB8c2VkfHNvcnR8c3RhdHx0cilc XD4iIGFsbCBwcmVmaXgKPiBjbWQpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IChmaW5kLWNvbW1hbmQgaW5wdXRzIGNtZCAjOnByZWZpeCBwcmVmaXgpKQo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsgJChDTUQKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgICgoIihcXCRcXCggKikoc3lzY3RsKSIgYWxsIHByZWZpeCBjbWQpCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChmaW5kLWNvbW1hbmQgaW5wdXRzIGNtZCAic2JpbiIg IzpwcmVmaXggcHJlZml4KSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgCj4gKCgi KFxcJFxcKClcXDwoY2F0fGZpbmR8Z3JlcHxtb3VudHxucHJvY3xzdGF0fHRyKVxcPiIgYWxsIHBy ZWZpeCBjbWQpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChmaW5kLWNvbW1h bmQgaW5wdXRzIGNtZCAjOnByZWZpeCBwcmVmaXgpKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgOzsgaWYgQ01ECj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoKCIo aWYgKShzeXNjdGwpIiBhbGwgcHJlZml4IGNtZCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgKGZpbmQtY29tbWFuZCBpbnB1dHMgY21kICJzYmluIiAjOnByZWZpeCBwcmVmaXgp KQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsgY29tbWFuZCAtdiBDTUQKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICgoIihjb21tYW5kIC12KQo+IFwiKlxcPChi YXNlNjR8bnByb2N8cGVybHxwcmludGYpXFw+XCIqIiBhbGwgcHJlZml4IGNtZCkKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGZpbmQtY29tbWFuZCBpbnB1dHMgY21kICM6cHJl Zml4IHByZWZpeCkpCj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsgQ2F0 cyBhcmUgbXlzdGVyaW91cy4uLgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsg Y2F0IDw8RU9GCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoKCIoY2F0KSggPDxF T0YpIiBhbGwgY21kIHN1ZmZpeCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg KGZpbmQtY29tbWFuZCBpbnB1dHMgY21kICM6c3VmZml4IHN1ZmZpeCkpCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCA7OyBjYXQgIiQKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgICgoIihjYXQpKFwiXFwkKSIgYWxsIGNtZCBzdWZmaXgpCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIChmaW5kLWNvbW1hbmQgaW5wdXRzIGNtZCAjOnN1ZmZpeCBzdWZm aXgpKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsgJ2NhdCcKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICgoIignKShjYXQpKCcpIiBhbGwgcHJlZml4IGNtZCBz dWZmaXgpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChmaW5kLWNvbW1hbmQg aW5wdXRzIGNtZCAjOnByZWZpeCBwcmVmaXggIzpzdWZmaXgKPiBzdWZmaXgpKQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsgImNhdCIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgICgoIihcIikoY2F0KShcIikiIGFsbCBwcmVmaXggY21kIHN1ZmZpeCkKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGZpbmQtY29tbWFuZCBpbnB1dHMgY21kICM6 cHJlZml4IHByZWZpeCAjOnN1ZmZpeAo+IHN1ZmZpeCkpKSkpKSkpCj4gK8KgwqDCoCAoaW5wdXRz IChsaXN0IGttb2QgbHo0IGx6b3AgcGVybCBwcm9jcHMgc2hhcnV0aWxzIHV0aWwtbGludXgKPiB6 c3RkKSkKPiArwqDCoMKgIChob21lLXBhZ2UKPiAiaHR0cHM6Ly9naXRodWIuY29tL3NwZWVkNDcv c3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyIikKPiArwqDCoMKgIChzeW5vcHNpcyAiQ1BVIHZ1bG5l cmFiaWxpdHkgLyBtaXRpZ2F0aW9uIGNoZWNrZXIiKQo+ICvCoMKgwqAgKGRlc2NyaXB0aW9uCj4g K8KgwqDCoMKgICJUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYSBzaGVsbCBzY3JpcHQgdG8gYXNzZXNz IHlvdXIgc3lzdGVtJ3MKPiByZXNpbGllbmNlCj4gK2FnYWluc3QgdGhlIHNldmVyYWwgdHJhbnNp ZW50IGV4ZWN1dGlvbiBDVkVzIHRoYXQgd2VyZSBwdWJsaXNoZWQKPiBzaW5jZSBlYXJseQo+ICsy MDE4LCBhbmQgZ2l2ZSB5b3UgZ3VpZGFuY2UgYXMgdG8gaG93IHRvIG1pdGlnYXRlIHRoZW0uIikK PiArwqDCoMKgIChsaWNlbnNlIGxpY2Vuc2U6Z3BsMykpKQo+IGRpZmYgLS1naXQgYS9nbnUvcGFj a2FnZXMvcGF0Y2hlcy9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXItcmVtb3ZlLQo+IGJ1aWx0aW4t ZmlybXdhcmUtZGF0YWJhc2UucGF0Y2ggYi9nbnUvcGFja2FnZXMvcGF0Y2hlcy9zcGVjdHJlLQo+ IG1lbHRkb3duLWNoZWNrZXItcmVtb3ZlLWJ1aWx0aW4tZmlybXdhcmUtZGF0YWJhc2UucGF0Y2gK PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAwMDAuLjgwOTc2M2NmNGYKPiAt LS0gL2Rldi9udWxsCj4gKysrIGIvZ251L3BhY2thZ2VzL3BhdGNoZXMvc3BlY3RyZS1tZWx0ZG93 bi1jaGVja2VyLXJlbW92ZS1idWlsdGluLQo+IGZpcm13YXJlLWRhdGFiYXNlLnBhdGNoCj4gQEAg LTAsMCArMSwyNDMgQEAKPiArRnJvbSAzNDBiMDg3MzdlNTUyYzNjMTg2ODYzZDc2ZDEyMzgwOGQ4 NTNhMTU5IE1vbiBTZXAgMTcgMDA6MDA6MDAKPiAyMDAxCj4gK0Zyb206IEhpbHRvbiBDaGFpbiA8 aGFrb0B1bHRyYXJhcmUuc3BhY2U+Cj4gK0RhdGU6IFNhdCwgMTIgTm92IDIwMjIgMjI6NDU6MjQg KzA4MDAKPiArU3ViamVjdDogW1BBVENIXSBSZW1vdmUgYnVpbHRpbiBmaXJtd2FyZSBkYXRhYmFz ZS4KPiArCj4gKzEuIFJlbW92ZSBkb3dubG9hZGluZyBmdW5jdGlvbi4KPiArMi4gQWRkIG9wdGlv biBmb3Igc3VwcGx5aW5nIGEgbG9jYWwgZGF0YWJhc2UuCj4gKy0tLQo+ICsgc3BlY3RyZS1tZWx0 ZG93bi1jaGVja2VyLnNoIHwgMTgwICsrKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ IC0tLQo+ICsgMSBmaWxlIGNoYW5nZWQsIDE1IGluc2VydGlvbnMoKyksIDE2NSBkZWxldGlvbnMo LSkKPiArCj4gK2RpZmYgLS1naXQgYS9zcGVjdHJlLW1lbHRkb3duLWNoZWNrZXIuc2ggYi9zcGVj dHJlLW1lbHRkb3duLQo+IGNoZWNrZXIuc2gKPiAraW5kZXggMzBmNzYwYy4uY2U0Njk3MCAxMDA3 NTUKPiArLS0tIGEvc3BlY3RyZS1tZWx0ZG93bi1jaGVja2VyLnNoCj4gKysrKyBiL3NwZWN0cmUt bWVsdGRvd24tY2hlY2tlci5zaAo+ICtAQCAtMjIsOCArMjIsNiBAQCBleGl0X2NsZWFudXAoKQo+ ICvCoMKgwqDCoMKgwqDCoFsgLW4gIiR7ZHVtcGVkX2NvbmZpZzotfSIgXSAmJiBbIC1mICIkZHVt cGVkX2NvbmZpZyIgXSAmJiBybQo+IC1mICIkZHVtcGVkX2NvbmZpZyIKPiArwqDCoMKgwqDCoMKg wqBbIC1uICIke2tlcm5lbHRtcDotfSLCoMKgwqDCoCBdICYmIFsgLWYgIiRrZXJuZWx0bXAiwqDC oMKgwqAgXSAmJiBybQo+IC1mICIka2VybmVsdG1wIgo+ICvCoMKgwqDCoMKgwqDCoFsgLW4gIiR7 a2VybmVsdG1wMjotfSLCoMKgwqAgXSAmJiBbIC1mICIka2VybmVsdG1wMiLCoMKgwqAgXSAmJiBy bQo+IC1mICIka2VybmVsdG1wMiIKPiArLcKgwqDCoMKgwqDCoFsgLW4gIiR7bWNlZGJfdG1wOi19 IsKgwqDCoMKgIF0gJiYgWyAtZiAiJG1jZWRiX3RtcCLCoMKgwqDCoCBdICYmIHJtCj4gLWYgIiRt Y2VkYl90bXAiCj4gKy3CoMKgwqDCoMKgwqBbIC1uICIke2ludGVsX3RtcDotfSLCoMKgwqDCoCBd ICYmIFsgLWQgIiRpbnRlbF90bXAiwqDCoMKgwqAgXSAmJiBybQo+IC1yZiAiJGludGVsX3RtcCIK PiArwqDCoMKgwqDCoMKgwqBbICIke21vdW50ZWRfZGVidWdmczotfSIgPSAxIF0gJiYgdW1vdW50 IC9zeXMva2VybmVsL2RlYnVnCj4gMj4vZGV2L251bGwKPiArwqDCoMKgwqDCoMKgwqBbICIke21v dW50ZWRfcHJvY2ZzOi19IsKgID0gMSBdICYmIHVtb3VudCAiJHByb2NmcyIKPiAyPi9kZXYvbnVs bAo+ICvCoMKgwqDCoMKgwqDCoFsgIiR7aW5zbW9kX2NwdWlkOi19IsKgwqDCoCA9IDEgXSAmJiBy bW1vZCBjcHVpZCAyPi9kZXYvbnVsbAo+ICtAQCAtOTMsOSArOTEsNyBAQCBzaG93X3VzYWdlKCkK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLS12bW0gW2F1dG8seWVzLG5vXcKgwqDC oMKgwqBvdmVycmlkZSB0aGUgZGV0ZWN0aW9uIG9mIHRoZQo+IHByZXNlbmNlIG9mIGEgaHlwZXJ2 aXNvciwgZGVmYXVsdDogYXV0bwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAtLWFs bG93LW1zci13cml0ZcKgwqDCoMKgwqDCoMKgYWxsb3cgcHJvYmluZyBmb3Igd3JpdGUtb25seQo+ IE1TUnMsIHRoaXMgbWlnaHQgcHJvZHVjZSBrZXJuZWwgbG9ncyBvciBiZSBibG9ja2VkIGJ5IHlv dXIgc3lzdGVtCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC0tY3B1IFsjLGFsbF3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgaW50ZXJhY3Qgd2l0aCBDUFVJRCBhbmQgTVNSCj4gb2YgQ1BV IGNvcmUgbnVtYmVyICMsIG9yIGFsbCAoZGVmYXVsdDogQ1BVIGNvcmUgMCkKPiArLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAtLXVwZGF0ZS1md2RiwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHVw ZGF0ZSBvdXIgbG9jYWwgY29weSBvZiB0aGUKPiBDUFUgbWljcm9jb2RlcyB2ZXJzaW9ucyBkYXRh YmFzZSAodXNpbmcgdGhlIGF3ZXNvbWUKPiArLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBNQ0V4dHJhY3Rv ciBwcm9qZWN0IGFuZCB0aGUKPiBJbnRlbCBmaXJtd2FyZXMgR2l0SHViIHJlcG9zaXRvcnkpCj4g Ky3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLS11cGRhdGUtYnVpbHRpbi1md2RiwqDCoMKg c2FtZSBhcyAtLXVwZGF0ZS1md2RiIGJ1dAo+IHVwZGF0ZSBidWlsdGluIERCIGluc2lkZSB0aGUg c2NyaXB0IGl0c2VsZgo+ICsrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC0td2l0aC1md2Ri IEZJTEXCoMKgwqDCoMKgwqDCoMKgc3VwcGx5IHRoZSBDUFUgbWljcm9jb2Rlcwo+IHZlcnNpb25z IGRhdGFiYXNlCmFuZCBhZGRlZCBhIG5vdGUgcmVnYXJkaW5nIHRoZSAobGFjayBvZikgZnJlZWRv bSBmb3IgcHJvcHJpZXRhcnkKbWljcm9jb2RlLgoKSSBhbHNvIGFkZGVkIHlvdXIgbmFtZSBhbmQg ZW1haWwgdG8gdGhlIGF1dGhvcnMgb2YgbGludXguc2NtLCBzaW5jZQp0aGlzIHdhcyBhIHZlcnkg bm9uLXRyaXZpYWwgcGFja2FnZS4KCkNoZWVycwo= ------------=_1668376982-13922-3 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at submit) by debbugs.gnu.org; 5 Aug 2021 17:01:21 +0000 Received: from localhost ([127.0.0.1]:48288 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mBgkC-0004Mh-Pt for submit@debbugs.gnu.org; Thu, 05 Aug 2021 13:01:21 -0400 Received: from lists.gnu.org ([209.51.188.17]:41456) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mBgkA-0004Kp-Up for submit@debbugs.gnu.org; Thu, 05 Aug 2021 13:01:19 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46344) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mBgkA-0004l5-AJ for guix-patches@gnu.org; Thu, 05 Aug 2021 13:01:18 -0400 Received: from mail-4322.protonmail.ch ([185.70.43.22]:50499) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mBgk7-0002I6-Hj for guix-patches@gnu.org; Thu, 05 Aug 2021 13:01:17 -0400 Date: Thu, 05 Aug 2021 17:00:59 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com; s=protonmail; t=1628182863; bh=I/RZixkG47FDCqEzkt5y9+KIpbOoz3dBnxBZ07rWls0=; h=Date:To:From:Reply-To:Subject:From; b=xeL/+K1raZ4gb0AyslFHI8tczteWyXJCZIROtR7jjNUmJR3phYI7qi8SvcBP5AazJ ffjWs9WCDGgZwWmG9AJxkQhNlePbSesQqtfE+yKUH5esmuZUvwpu6ckPPkDHNj40Xq oD1J4SV0ybNb9ad4t15GCoG+9zgFCMl1DpKV9krg= To: "guix-patches@gnu.org" From: phodina Subject: [PATCH] gnu: Add spectre-meltdown-checker. Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-1.2 required=10.0 tests=ALL_TRUSTED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM shortcircuit=no autolearn=disabled version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on mailout.protonmail.ch Received-SPF: pass client-ip=185.70.43.22; envelope-from=phodina@protonmail.com; helo=mail-4322.protonmail.ch X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: phodina Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.3 (--) * gnu/packages/linux.scm (spectre-meltdown-checker): New variable. diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index 4ca2a386e1..f89f6f259e 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -53,6 +53,7 @@ ;;; Copyright =C2=A9 2020 pukkamustard ;;; Copyright =C2=A9 2021 B. Wilson ;;; Copyright =C2=A9 2021 Ivan Gankevich +;;; Copyright =C2=A9 2021 Petr Hodina ;;; ;;; This file is part of GNU Guix. ;;; @@ -148,6 +149,7 @@ #:use-module (guix build-system cmake) #:use-module (guix build-system gnu) #:use-module (guix build-system go) + #:use-module (guix build-system copy) #:use-module (guix build-system meson) #:use-module (guix build-system python) #:use-module (guix build-system trivial) @@ -7191,6 +7193,44 @@ interfaces in parallel environments.") (supported-systems '("i686-linux" "x86_64-linux")) (license (list license:bsd-2 license:gpl2)))) ;dual +(define-public spectre-meltdown-checker +(package + (name "spectre-meltdown-checker") + (version "v0.44") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/speed47/spectre-meltdown-checke= r") + (commit version))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "1b47wlc52jnp2d5c7kbqnxmlm4g3cfbv25q30llv5mlmzs6d7bam")))) + (build-system copy-build-system) + (inputs `(("util-linux" ,util-linux) + ("binutils" ,binutils))) + (synopsis "Spectre, Meltdown ... vulnerability/mitigation checker") + (description "A shell script to assess your system's resilience against +the several transient execution CVEs that were published since early 2018, +and give you guidance as to how to mitigate them. +@enumerate +@item Bounds Check Bypass +@item Branch Target Injection +@item Rogue Data Cache Load +@item Rogue System Register Read +@item Speculative Store Bypass +@item L1 Terminal Fault (SGX, OS, VMM) +@item Microarchitectural Store Buffer Data Sampling +@item Microarchitectural Fill Buffer Data Sampling +@item Microarchitectural Load Port Data Sampling +@item Microarchitectural Data Sampling Uncacheable Memory +@item TSX asynchronous abort +@item Machine Mheck Exception on Page Size Changes +@item Special Register Buffer Data Sampling +@end enumerate") + (home-page "https://github.com/speed47/spectre-meltdown-checker") + (license license:gpl3))) + (define-public snapscreenshot (package (name "snapscreenshot") -- 2.32.0 ------------=_1668376982-13922-3--