Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wyY0w-003SzV-0h for pgsql-hackers@arkaria.postgresql.org; Mon, 24 Aug 2026 16:59:14 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wyY0u-003W2D-34 for pgsql-hackers@arkaria.postgresql.org; Mon, 24 Aug 2026 16:59:12 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wyY0u-003W23-18 for pgsql-hackers@lists.postgresql.org; Mon, 24 Aug 2026 16:59:12 +0000 Received: from fhigh-a7-smtp.messagingengine.com ([103.168.172.158]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1wyY0r-00000002DDn-3ReU for pgsql-hackers@lists.postgresql.org; Mon, 24 Aug 2026 16:59:11 +0000 Received: from phl-compute-02.internal (phl-compute-02.internal [10.202.2.42]) by mailfhigh.phl.internal (Postfix) with ESMTP id 246881400086 for ; Mon, 24 Aug 2026 12:59:08 -0400 (EDT) Received: from phl-imap-02 ([10.202.2.81]) by phl-compute-02.internal (MEProxy); Mon, 24 Aug 2026 12:59:08 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=burd.me; h=cc :content-type:content-type:date:date:from:from:in-reply-to :message-id:mime-version:reply-to:subject:subject:to:to; s=fm3; t=1787590748; x=1787677148; bh=EI5UJPJLm4V0g1P4c4dOI93gjCPmDynD ju5TCtAOS4U=; b=J20Pf2fgX1uWy1LniSuKMwHgxK9+l5qdNkKEJNcZm/h5KCa5 wsjCRoTjzWR2Dhf07rcHuVqxNzUgjUsxcw87ljjmMG5MRB/up2jTR7VjbUrJw2YX cHcVKSmDy8Wk10VA8b/JXHi3g5whyAiF2jNloQVxcjlsL70bPaVIuGw7PZSSpNkk 2xcXPbzE4kzJZz949FnRDAhew2uHGgwDbN5ncPERKCOouoMUMqzzJrvjK+55SIPf z7sxe3EHvMPZafUbWhwub4pIo8aLRr2hH1JYyGsivPA+0qkAfHqik0VDZg12wajk TYXnhSAfImeW1Gf39VI022n1AxVJVGQ0yoQpkw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:message-id :mime-version:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1787590748; x= 1787677148; bh=EI5UJPJLm4V0g1P4c4dOI93gjCPmDynDju5TCtAOS4U=; b=i zO0J5gAd/FSf8E1ztqr3fXwjSca3DD3GycB7hqcIkt3e1qfrK3E6ZOFtJBBv+fMA 2ZFM3evr8I7lbi2t+EtF9mx0rtBPtSNNpDRGmEo+49+uj9sRzUlZvnzQtUnNVNcK OCB1NiHfXMsaSJUl4Z4ofVFZUMPpxLA783pf+I80vsmw1/Mk8xrEzuFtyZVl6z7T q5OSf30ZzhMU+y/raxr6BgatHQRYcrmx0ADYfcuiK5UAu83Tystalj5eNoTh1JBV FftPeE8awIT8pdEF+ZwHVz2PB9mohKsQLG8PGgzFUySdZS4gRWnrFEWVIwLWew+F WgUL7HUEHYcIXeILoEBuA== X-ME-Sender: X-ME-Proxy-Cause: dmFkZTEN+ozkqVgPb+tuU7Esa/aFd08A5aP2vHabrYI3eCgTSDxljY2GG35OYcf9QZ9vx8 MycrkAAIVWwKt3Q/f5dQRHjNFXsHYwxaH47OjguEKMIqHxGJza8oBKSLkLO1bZoP33SCUl yFJC58Ov8IS5EtUJ0mlrUeZyTzaYuDHIdZbjDsv51Gh7rorfoptMkPoscPg0oVPPpTl543 1RQ5aGcTyyiAfkMXwXEpXfh24Ok67U7JajfQsDnmVmlZ0V1DFc6Gg23Ph7C8sGPQDMfmyS sR56c1MXvp6ayj9oOCpSI7nUauXhGhImofJveClcdHbCR2GY5F3P8KKN7qqQZQxDbdlJIi igSWDQMIiDVEXgr+En3OrHe/IdenE1aNKTlv2K5TQmGq75jf6fDDiUvYHOWkyXdF9O+/gp hialEIMU86TioJ0HTXjpugP6DewMC/dJfwBjE5jdCRmX0OwcAOEFaHECeHLS7VT5DtrIf+ Jxapy8yr4OqmWqbSkLQDMzIAvMME4VBtSCMA+vYQSzA9SzFDthqLEr7iklHSVEOINUCc+3 7pZMRKQSluvSZ+7SSd9SOkF3ZgIh93mQ9F3Uu5nEtmhOA/XKYOpYt2/36ReCC37GJzluIl s4l6bHPHoTbClOx4mkFIJHZHsuipKtiRAzyKavGViUjyEedD/4VEiH8iVtNA X-ME-Proxy: Feedback-ID: i675e48f3:Fastmail Received: by mailuser.phl.internal (Postfix, from userid 501) id EC09B700065; Mon, 24 Aug 2026 12:59:07 -0400 (EDT) X-Mailer: MessagingEngine.com Webmail Interface MIME-Version: 1.0 Date: Mon, 24 Aug 2026 12:58:47 -0400 From: "Greg Burd" To: "PostgreSQL Hackers" Message-Id: Subject: Add a Nix flake Content-Type: multipart/mixed; boundary=c71de65f0610876e6febb11e1b2b762f9419c6dd List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --c71de65f0610876e6febb11e1b2b762f9419c6dd Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hackers, I'd like to propose adding a flake.nix at the repository root. Attached is a first cut. This is not another build system. It doesn't touch configure, Meson, or = the Makefiles, it wires up what we already have. A flake is a small, declara= tive manifest that tells Nix how to fetch our build dependencies and drop a developer into a shell where ./configure && make or meson setup just works, with bison, flex, perl, the optional libraries, and the docs toolchain all present and pinned to compatible versions. nix develop giv= es you that shell; nix build produces a server. The reason to carry it in-tree: Nix users are a growing segment of the PostgreSQL developer base across Linux, macOS, and increasingly the BSDs= and even illumos. Today each of them keeps a private flake to hack on Postgr= es, I have one, and I know I'm not alone. These private copies drift, disagree= on which features to enable, and have to be re-derived every time someone n= ew wants to contribute from a Nix machine. A single blessed flake in the tr= ee gives everyone the same reproducible starting point and one place to kee= p it current, the same argument that motivates the .editorconfig and CI files= we already ship. The flake exposes a toggle for every optional feature configure and Meson support, both build systems, and platform-appropriate defaults (io_uring, libnuma, systemd, PAM on Linux; Bonjour on macOS), so it's a starting po= int, not a policy so flip anything with an override. One deliberate omission: there is no flake.lock. A lock file pins the ex= act nixpkgs revision, which is the right call for an application that wants a frozen environment, but wrong for us. We don't want to freeze contributo= rs to one snapshot of the dependency universe, and we don't want a lock file to become one more thing that goes stale in the tree and needs bumping. Lea= ving it out means the flake tracks whatever nixpkgs the developer already run= s, which is exactly the behavior a build-from-source developer wants. Anyon= e who needs reproducibility can generate a lock locally; the tree stays clean. It's meant to sit at the root next to configure, not in a subdirectory, = so that a fresh checkout is immediately usable with nix develop. To use it you'll need to be in a Nix environment. This means a Nix-base= d OS like NixOS or the macOS/Windows layers that bring in the Nix environment. Start by reading the https://nixos.org/learn/ information. With a flake you can start a "developer shell" (a "dev shell") which wil= l have all the dependencies required to build and run Postgres, no installing A= ll The Things (TM) if you buy into this model you have a predictable environmen= t, a shell with developer tools prepared and present always at hand when need= ed. So, first start the dev(eloper) shell: ``` nix develop # then, meson (the default direction): meson setup build && ninja -C build # or classic autoconf: ./configure && make -j ``` You don't have to enter the dev shell, you could instead build a server: ``` nix build # default: meson, all features for your p= latform ./result/bin/postgres --version ``` The presets: ``` nix build .#postgresql-debug # cassert + debug syms + injection poi= nts nix build .#postgresql-minimal # no optional libs =E2=80=94 fastest c= ompile nix build .#postgresql-autoconf # configure/make instead of meson ``` Flip any single feature (26 toggles) without a preset: ``` nix build --expr '(builtins.getFlake (toString ./.)).packages.x86_64-lin= ux.postgresql.override { llvmSupport =3D true; cassert =3D true; }' ``` Run without installing: ``` nix run . -- --version # runs postgres (mainProgram is psql, so:) nix run .#postgresql -- --version ``` There are many other things we could add into the flake such as cross-compilation, but to start off this should suffice. I hope this ge= nerates interest and constructive debate. I'll say upfront, I'm not a Nix maste= r, just a user and I find it invaluable. I'm sure I'm not alone. Feedback welcome. best. -greg --c71de65f0610876e6febb11e1b2b762f9419c6dd Content-Disposition: attachment; filename*0="v1-0001-Add-a-Nix-flake-for-reproducible-builds-and-dev-s.pat"; filename*1="ch" Content-Type: text/x-patch; name="=?UTF-8?Q?v1-0001-Add-a-Nix-flake-for-reproducible-builds-and-dev-s.patc?= =?UTF-8?Q?h?=" Content-Transfer-Encoding: base64 RnJvbSAwY2ViMTU4YTljNjEwYTAxN2ExY2Y1Mjk4YjU4ZDQ2OWNmMGQ3NjQ2IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBHcmVnIEJ1cmQgPGdyZWdAYnVyZC5tZT4KRGF0ZTog TW9uLCAyNCBBdWcgMjAyNiAxMjo1MzoxMiAtMDQwMApTdWJqZWN0OiBbUEFUQ0ggdjFdIEFk ZCBhIE5peCBmbGFrZSBmb3IgcmVwcm9kdWNpYmxlIGJ1aWxkcyBhbmQgZGV2IHNoZWxscwoK UHJvdmlkZSBhIGZsYWtlLm5peCBhdCB0aGUgcmVwb3NpdG9yeSByb290IHNvIGNvbnRyaWJ1 dG9ycyBvbiBOaXgtYmFzZWQKc3lzdGVtcyAoTGludXgsIG1hY09TLCBhbmQgaW5jcmVhc2lu Z2x5IEJTRCBhbmQgaWxsdW1vcykgZ2V0IGEgc2luZ2xlLAppbi10cmVlIHN0YXJ0aW5nIHBv aW50IGluc3RlYWQgb2YgbWFpbnRhaW5pbmcgcHJpdmF0ZSwgZHJpZnRpbmcgY29waWVzLgoK SXQgZG9lc24ndCBhZGQgYSBidWlsZCBzeXN0ZW06IGBuaXggZGV2ZWxvcGAgZHJvcHMgeW91 IGludG8gYSBzaGVsbCB3aXRoCmJpc29uLCBmbGV4LCBwZXJsLCB0aGUgb3B0aW9uYWwgbGli cmFyaWVzLCBhbmQgdGhlIGRvY3MgdG9vbGNoYWluIG9uIFBBVEgsCndoZXJlIGBtZXNvbiBz ZXR1cGAgKHRoZSBkZWZhdWx0KSBvciBgLi9jb25maWd1cmVgIGp1c3Qgd29ya3M7IGBuaXgg YnVpbGRgCnByb2R1Y2VzIGEgc2VydmVyLgoKRXZlcnkgb3B0aW9uYWwgY29uZmlndXJlL01l c29uIGZlYXR1cmUgaXMgYSBib29sZWFuIHRvZ2dsZSB3aXRoCnBsYXRmb3JtLWFwcHJvcHJp YXRlIGRlZmF1bHRzIChpb191cmluZywgbGlibnVtYSwgc3lzdGVtZCwgUEFNIG9uIExpbnV4 OwpCb25qb3VyIG9uIG1hY09TKSwgc28gaXQgaXMgYSBzdGFydGluZyBwb2ludCwgbm90IGEg cG9saWN5LiBQcmVzZXRzIGNvdmVyCmRlYnVnLCBtaW5pbWFsLCBhbmQgYXV0b2NvbmYgYnVp bGRzLgoKTm8gZmxha2UubG9jayBpcyBjb21taXR0ZWQgb24gcHVycG9zZTogcGlubmluZyBu aXhwa2dzIHdvdWxkIGZyZWV6ZQpjb250cmlidXRvcnMgdG8gb25lIGRlcGVuZGVuY3kgc25h cHNob3QgYW5kIGFkZCBhIGZpbGUgdGhhdCBnb2VzIHN0YWxlIGluCnRoZSB0cmVlLiBUaGUg Zmxha2UgaW5zdGVhZCB0cmFja3Mgd2hhdGV2ZXIgbml4cGtncyB0aGUgZGV2ZWxvcGVyIGFs cmVhZHkKcnVuczsgYW55b25lIG5lZWRpbmcgcmVwcm9kdWNpYmlsaXR5IGNhbiBnZW5lcmF0 ZSBhIGxvY2sgbG9jYWxseS4KLS0tCiBmbGFrZS5uaXggfCAyNjEgKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAxIGZpbGUgY2hhbmdl ZCwgMjYxIGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBmbGFrZS5uaXgKCmRp ZmYgLS1naXQgYS9mbGFrZS5uaXggYi9mbGFrZS5uaXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMDAwMDAuLmFiMzc2ZGY0YTc2Ci0tLSAvZGV2L251bGwKKysrIGIvZmxh a2Uubml4CkBAIC0wLDAgKzEsMjYxIEBACit7CisgIGRlc2NyaXB0aW9uID0gIlBvc3RncmVT UUwsIGJ1aWx0IGZyb20gdGhpcyBzb3VyY2UgdHJlZSI7CisKKyAgaW5wdXRzLm5peHBrZ3Mu dXJsID0gImdpdGh1YjpOaXhPUy9uaXhwa2dzL25peG9zLXVuc3RhYmxlIjsKKworICBvdXRw dXRzID0KKyAgICB7IHNlbGYsIG5peHBrZ3MgfToKKyAgICBsZXQKKyAgICAgIHN5c3RlbXMg PSBbCisgICAgICAgICJ4ODZfNjQtbGludXgiCisgICAgICAgICJhYXJjaDY0LWxpbnV4Igor ICAgICAgICAieDg2XzY0LWRhcndpbiIKKyAgICAgICAgImFhcmNoNjQtZGFyd2luIgorICAg ICAgXTsKKyAgICAgIGZvckFsbFN5c3RlbXMgPSBmOiBuaXhwa2dzLmxpYi5nZW5BdHRycyBz eXN0ZW1zIChzeXN0ZW06IGYgbml4cGtncy5sZWdhY3lQYWNrYWdlcy4ke3N5c3RlbX0pOwor CisgICAgICAjIEEgc2luZ2xlIGJ1aWxkZXIgY292ZXJpbmcgZXZlcnkgb3B0aW9uYWwgZmVh dHVyZSAuL2NvbmZpZ3VyZSBhbmQKKyAgICAgICMgbWVzb24gZXhwb3NlLiBFYWNoIGZlYXR1 cmUgaXMgYSBib29sZWFuIHRvZ2dsZSB3aXJlZCB0byBpdHMKKyAgICAgICMgYnVpbGRJbnB1 dCArIGZsYWc7IGZsaXAgYW55IG9mIHRoZW0gdmlhIC5vdmVycmlkZSB7IC4uLiB9LgorICAg ICAgIyBQbGF0Zm9ybS1zcGVjaWZpYyBmZWF0dXJlcyBkZWZhdWx0IHRvIHRoZWlyIGF2YWls YWJpbGl0eS4KKyAgICAgIHBvc3RncmVzcWxGb3IgPQorICAgICAgICBwa2dzOgorICAgICAg ICBsZXQKKyAgICAgICAgICBpbmhlcml0IChwa2dzKSBsaWIgc3RkZW52OworICAgICAgICAg IG9uTGludXggPSBzdGRlbnYuaG9zdFBsYXRmb3JtLmlzTGludXg7CisgICAgICAgICAgb25E YXJ3aW4gPSBzdGRlbnYuaG9zdFBsYXRmb3JtLmlzRGFyd2luOworICAgICAgICBpbgorICAg ICAgICBsaWIubWFrZU92ZXJyaWRhYmxlICgKKyAgICAgICAgICB7CisgICAgICAgICAgICAj IEJ1aWxkIHN5c3RlbTogIm1lc29uIiAobmluamEpIG9yICJhdXRvY29uZiIgKGNvbmZpZ3Vy ZS9tYWtlKS4KKyAgICAgICAgICAgICMgTWVzb24gaXMgdGhlIGRlZmF1bHQ7IGl0IGlzIHRo ZSBwcm9qZWN0J3MgZXZlbnR1YWwgc29sZSBidWlsZCBzeXN0ZW0uCisgICAgICAgICAgICBi dWlsZFN5c3RlbSA/ICJtZXNvbiIsCisKKyAgICAgICAgICAgICMgT3B0aW9uYWwgbGlicmFy eSBmZWF0dXJlcyAoYnVpbGRJbnB1dCArIGZsYWcpLgorICAgICAgICAgICAgaWN1U3VwcG9y dCA/IHRydWUsCisgICAgICAgICAgICByZWFkbGluZVN1cHBvcnQgPyB0cnVlLAorICAgICAg ICAgICAgemxpYlN1cHBvcnQgPyB0cnVlLAorICAgICAgICAgICAgb3BlbnNzbFN1cHBvcnQg PyB0cnVlLAorICAgICAgICAgICAgbGlieG1sU3VwcG9ydCA/IHRydWUsCisgICAgICAgICAg ICBsaWJ4c2x0U3VwcG9ydCA/IHRydWUsCisgICAgICAgICAgICBsejRTdXBwb3J0ID8gdHJ1 ZSwKKyAgICAgICAgICAgIHpzdGRTdXBwb3J0ID8gdHJ1ZSwKKyAgICAgICAgICAgIHV1aWRT dXBwb3J0ID8gdHJ1ZSwKKyAgICAgICAgICAgIGN1cmxTdXBwb3J0ID8gdHJ1ZSwKKworICAg ICAgICAgICAgIyBQcm9jZWR1cmFsIGxhbmd1YWdlcy4KKyAgICAgICAgICAgIHBlcmxTdXBw b3J0ID8gdHJ1ZSwKKyAgICAgICAgICAgIHB5dGhvblN1cHBvcnQgPyB0cnVlLAorICAgICAg ICAgICAgdGNsU3VwcG9ydCA/IHRydWUsCisKKyAgICAgICAgICAgICMgUGxhdGZvcm0tZ2F0 ZWQgZmVhdHVyZXMuCisgICAgICAgICAgICBzeXN0ZW1kU3VwcG9ydCA/IG9uTGludXgsCisg ICAgICAgICAgICBzZWxpbnV4U3VwcG9ydCA/IGZhbHNlLAorICAgICAgICAgICAgbGlidXJp bmdTdXBwb3J0ID8gb25MaW51eCwKKyAgICAgICAgICAgIG51bWFTdXBwb3J0ID8gb25MaW51 eCwKKyAgICAgICAgICAgIGdzc1N1cHBvcnQgPyB0cnVlLAorICAgICAgICAgICAgbGRhcFN1 cHBvcnQgPyBmYWxzZSwKKyAgICAgICAgICAgIHBhbVN1cHBvcnQgPyBvbkxpbnV4LAorICAg ICAgICAgICAgYm9uam91clN1cHBvcnQgPyBvbkRhcndpbiwKKyAgICAgICAgICAgIGxsdm1T dXBwb3J0ID8gZmFsc2UsCisKKyAgICAgICAgICAgICMgRGV2ZWxvcGVyIC8gYnVpbGQtc2hh cGUgdG9nZ2xlcyAobm8gZXh0cmEgZGVwcykuCisgICAgICAgICAgICBjYXNzZXJ0ID8gZmFs c2UsCisgICAgICAgICAgICBkZWJ1Z1N5bWJvbHMgPyBmYWxzZSwKKyAgICAgICAgICAgIHRh cFRlc3RzID8gdHJ1ZSwKKyAgICAgICAgICAgIGluamVjdGlvblBvaW50cyA/IGZhbHNlLAor CisgICAgICAgICAgICAjIERvY3VtZW50YXRpb24gYnVpbGQgKFNHTUwvRG9jQm9vayB0b29s Y2hhaW4pLgorICAgICAgICAgICAgZG9jcyA/IGZhbHNlLAorICAgICAgICAgIH06CisgICAg ICAgICAgbGV0CisgICAgICAgICAgICB1c2VNZXNvbiA9IGJ1aWxkU3lzdGVtID09ICJtZXNv biI7CisKKyAgICAgICAgICAgICMgZmVhdHVyZSAtPiB7IGZsYWcgPSBjb25maWd1cmUgYXJn OyBkZXAgPSBidWlsZElucHV0IG9yIG51bGw7IH0KKyAgICAgICAgICAgIGZlYXR1cmVGbGFn ID0gY29uZDogZmxhZzogbGliLm9wdGlvbmFsIGNvbmQgZmxhZzsKKyAgICAgICAgICAgIGZl YXR1cmVEZXAgPSBjb25kOiBkZXA6IGxpYi5vcHRpb25hbCBjb25kIGRlcDsKKworICAgICAg ICAgICAgY29uZmlndXJlRmVhdHVyZXMgPSBsaWIuZmxhdHRlbiBbCisgICAgICAgICAgICAg IChmZWF0dXJlRmxhZyBpY3VTdXBwb3J0ICItLXdpdGgtaWN1IikKKyAgICAgICAgICAgICAg KGZlYXR1cmVGbGFnICghaWN1U3VwcG9ydCkgIi0td2l0aG91dC1pY3UiKQorICAgICAgICAg ICAgICAoZmVhdHVyZUZsYWcgKCFyZWFkbGluZVN1cHBvcnQpICItLXdpdGhvdXQtcmVhZGxp bmUiKQorICAgICAgICAgICAgICAoZmVhdHVyZUZsYWcgKCF6bGliU3VwcG9ydCkgIi0td2l0 aG91dC16bGliIikKKyAgICAgICAgICAgICAgKGZlYXR1cmVGbGFnIG9wZW5zc2xTdXBwb3J0 ICItLXdpdGgtc3NsPW9wZW5zc2wiKQorICAgICAgICAgICAgICAoZmVhdHVyZUZsYWcgbGli eG1sU3VwcG9ydCAiLS13aXRoLWxpYnhtbCIpCisgICAgICAgICAgICAgIChmZWF0dXJlRmxh ZyBsaWJ4c2x0U3VwcG9ydCAiLS13aXRoLWxpYnhzbHQiKQorICAgICAgICAgICAgICAoZmVh dHVyZUZsYWcgbHo0U3VwcG9ydCAiLS13aXRoLWx6NCIpCisgICAgICAgICAgICAgIChmZWF0 dXJlRmxhZyB6c3RkU3VwcG9ydCAiLS13aXRoLXpzdGQiKQorICAgICAgICAgICAgICAoZmVh dHVyZUZsYWcgdXVpZFN1cHBvcnQgIi0td2l0aC11dWlkPWUyZnMiKQorICAgICAgICAgICAg ICAoZmVhdHVyZUZsYWcgY3VybFN1cHBvcnQgIi0td2l0aC1saWJjdXJsIikKKyAgICAgICAg ICAgICAgKGZlYXR1cmVGbGFnIHBlcmxTdXBwb3J0ICItLXdpdGgtcGVybCIpCisgICAgICAg ICAgICAgIChmZWF0dXJlRmxhZyBweXRob25TdXBwb3J0ICItLXdpdGgtcHl0aG9uIikKKyAg ICAgICAgICAgICAgKGZlYXR1cmVGbGFnIHRjbFN1cHBvcnQgIi0td2l0aC10Y2wiKQorICAg ICAgICAgICAgICAoZmVhdHVyZUZsYWcgc3lzdGVtZFN1cHBvcnQgIi0td2l0aC1zeXN0ZW1k IikKKyAgICAgICAgICAgICAgKGZlYXR1cmVGbGFnIHNlbGludXhTdXBwb3J0ICItLXdpdGgt c2VsaW51eCIpCisgICAgICAgICAgICAgIChmZWF0dXJlRmxhZyBsaWJ1cmluZ1N1cHBvcnQg Ii0td2l0aC1saWJ1cmluZyIpCisgICAgICAgICAgICAgIChmZWF0dXJlRmxhZyBudW1hU3Vw cG9ydCAiLS13aXRoLWxpYm51bWEiKQorICAgICAgICAgICAgICAoZmVhdHVyZUZsYWcgZ3Nz U3VwcG9ydCAiLS13aXRoLWdzc2FwaSIpCisgICAgICAgICAgICAgIChmZWF0dXJlRmxhZyBs ZGFwU3VwcG9ydCAiLS13aXRoLWxkYXAiKQorICAgICAgICAgICAgICAoZmVhdHVyZUZsYWcg cGFtU3VwcG9ydCAiLS13aXRoLXBhbSIpCisgICAgICAgICAgICAgIChmZWF0dXJlRmxhZyBi b25qb3VyU3VwcG9ydCAiLS13aXRoLWJvbmpvdXIiKQorICAgICAgICAgICAgICAoZmVhdHVy ZUZsYWcgbGx2bVN1cHBvcnQgIi0td2l0aC1sbHZtIikKKyAgICAgICAgICAgICAgKGZlYXR1 cmVGbGFnIGNhc3NlcnQgIi0tZW5hYmxlLWNhc3NlcnQiKQorICAgICAgICAgICAgICAoZmVh dHVyZUZsYWcgZGVidWdTeW1ib2xzICItLWVuYWJsZS1kZWJ1ZyIpCisgICAgICAgICAgICAg IChmZWF0dXJlRmxhZyB0YXBUZXN0cyAiLS1lbmFibGUtdGFwLXRlc3RzIikKKyAgICAgICAg ICAgICAgKGZlYXR1cmVGbGFnIGluamVjdGlvblBvaW50cyAiLS1lbmFibGUtaW5qZWN0aW9u LXBvaW50cyIpCisgICAgICAgICAgICBdOworCisgICAgICAgICAgICAjIG1lc29uIHVzZXMg LURmZWF0dXJlPWVuYWJsZWQvZGlzYWJsZWQgaW5zdGVhZCBvZiAtLXdpdGgtKi4KKyAgICAg ICAgICAgIG1lc29uRmVhdHVyZXMgPSBsaWIuZmxhdHRlbiBbCisgICAgICAgICAgICAgIFsg Ii1EaWN1PSR7aWYgaWN1U3VwcG9ydCB0aGVuICJlbmFibGVkIiBlbHNlICJkaXNhYmxlZCJ9 IiBdCisgICAgICAgICAgICAgIFsgIi1EcmVhZGxpbmU9JHtpZiByZWFkbGluZVN1cHBvcnQg dGhlbiAiZW5hYmxlZCIgZWxzZSAiZGlzYWJsZWQifSIgXQorICAgICAgICAgICAgICBbICIt RHpsaWI9JHtpZiB6bGliU3VwcG9ydCB0aGVuICJlbmFibGVkIiBlbHNlICJkaXNhYmxlZCJ9 IiBdCisgICAgICAgICAgICAgIFsgIi1Ec3NsPSR7aWYgb3BlbnNzbFN1cHBvcnQgdGhlbiAi b3BlbnNzbCIgZWxzZSAibm9uZSJ9IiBdCisgICAgICAgICAgICAgIFsgIi1EbGlieG1sPSR7 aWYgbGlieG1sU3VwcG9ydCB0aGVuICJlbmFibGVkIiBlbHNlICJkaXNhYmxlZCJ9IiBdCisg ICAgICAgICAgICAgIFsgIi1EbGlieHNsdD0ke2lmIGxpYnhzbHRTdXBwb3J0IHRoZW4gImVu YWJsZWQiIGVsc2UgImRpc2FibGVkIn0iIF0KKyAgICAgICAgICAgICAgWyAiLURsejQ9JHtp ZiBsejRTdXBwb3J0IHRoZW4gImVuYWJsZWQiIGVsc2UgImRpc2FibGVkIn0iIF0KKyAgICAg ICAgICAgICAgWyAiLUR6c3RkPSR7aWYgenN0ZFN1cHBvcnQgdGhlbiAiZW5hYmxlZCIgZWxz ZSAiZGlzYWJsZWQifSIgXQorICAgICAgICAgICAgICBbICItRHV1aWQ9JHtpZiB1dWlkU3Vw cG9ydCB0aGVuICJlMmZzIiBlbHNlICJub25lIn0iIF0KKyAgICAgICAgICAgICAgWyAiLURs aWJjdXJsPSR7aWYgY3VybFN1cHBvcnQgdGhlbiAiZW5hYmxlZCIgZWxzZSAiZGlzYWJsZWQi fSIgXQorICAgICAgICAgICAgICBbICItRHBscGVybD0ke2lmIHBlcmxTdXBwb3J0IHRoZW4g ImVuYWJsZWQiIGVsc2UgImRpc2FibGVkIn0iIF0KKyAgICAgICAgICAgICAgWyAiLURwbHB5 dGhvbj0ke2lmIHB5dGhvblN1cHBvcnQgdGhlbiAiZW5hYmxlZCIgZWxzZSAiZGlzYWJsZWQi fSIgXQorICAgICAgICAgICAgICBbICItRHBsdGNsPSR7aWYgdGNsU3VwcG9ydCB0aGVuICJl bmFibGVkIiBlbHNlICJkaXNhYmxlZCJ9IiBdCisgICAgICAgICAgICAgIFsgIi1Ec3lzdGVt ZD0ke2lmIHN5c3RlbWRTdXBwb3J0IHRoZW4gImVuYWJsZWQiIGVsc2UgImRpc2FibGVkIn0i IF0KKyAgICAgICAgICAgICAgWyAiLURzZWxpbnV4PSR7aWYgc2VsaW51eFN1cHBvcnQgdGhl biAiZW5hYmxlZCIgZWxzZSAiZGlzYWJsZWQifSIgXQorICAgICAgICAgICAgICBbICItRGxp YnVyaW5nPSR7aWYgbGlidXJpbmdTdXBwb3J0IHRoZW4gImVuYWJsZWQiIGVsc2UgImRpc2Fi bGVkIn0iIF0KKyAgICAgICAgICAgICAgWyAiLURsaWJudW1hPSR7aWYgbnVtYVN1cHBvcnQg dGhlbiAiZW5hYmxlZCIgZWxzZSAiZGlzYWJsZWQifSIgXQorICAgICAgICAgICAgICBbICIt RGdzc2FwaT0ke2lmIGdzc1N1cHBvcnQgdGhlbiAiZW5hYmxlZCIgZWxzZSAiZGlzYWJsZWQi fSIgXQorICAgICAgICAgICAgICBbICItRGxkYXA9JHtpZiBsZGFwU3VwcG9ydCB0aGVuICJl bmFibGVkIiBlbHNlICJkaXNhYmxlZCJ9IiBdCisgICAgICAgICAgICAgIFsgIi1EcGFtPSR7 aWYgcGFtU3VwcG9ydCB0aGVuICJlbmFibGVkIiBlbHNlICJkaXNhYmxlZCJ9IiBdCisgICAg ICAgICAgICAgIFsgIi1EYm9uam91cj0ke2lmIGJvbmpvdXJTdXBwb3J0IHRoZW4gImVuYWJs ZWQiIGVsc2UgImRpc2FibGVkIn0iIF0KKyAgICAgICAgICAgICAgWyAiLURsbHZtPSR7aWYg bGx2bVN1cHBvcnQgdGhlbiAiZW5hYmxlZCIgZWxzZSAiZGlzYWJsZWQifSIgXQorICAgICAg ICAgICAgICBbICItRGNhc3NlcnQ9JHtsaWIuYm9vbFRvU3RyaW5nIGNhc3NlcnR9IiBdCisg ICAgICAgICAgICAgIFsgIi1EdGFwX3Rlc3RzPSR7aWYgdGFwVGVzdHMgdGhlbiAiZW5hYmxl ZCIgZWxzZSAiZGlzYWJsZWQifSIgXQorICAgICAgICAgICAgICBbICItRGluamVjdGlvbl9w b2ludHM9JHtsaWIuYm9vbFRvU3RyaW5nIGluamVjdGlvblBvaW50c30iIF0KKyAgICAgICAg ICAgIF07CisKKyAgICAgICAgICAgIGJ1aWxkSW5wdXRzID0gbGliLmZsYXR0ZW4gKHdpdGgg cGtnczsgWworICAgICAgICAgICAgICAoZmVhdHVyZURlcCBpY3VTdXBwb3J0IGljdSkKKyAg ICAgICAgICAgICAgKGZlYXR1cmVEZXAgcmVhZGxpbmVTdXBwb3J0IHJlYWRsaW5lKQorICAg ICAgICAgICAgICAoZmVhdHVyZURlcCB6bGliU3VwcG9ydCB6bGliKQorICAgICAgICAgICAg ICAoZmVhdHVyZURlcCBvcGVuc3NsU3VwcG9ydCBvcGVuc3NsKQorICAgICAgICAgICAgICAo ZmVhdHVyZURlcCBsaWJ4bWxTdXBwb3J0IGxpYnhtbDIpCisgICAgICAgICAgICAgIChmZWF0 dXJlRGVwIGxpYnhzbHRTdXBwb3J0IGxpYnhzbHQpCisgICAgICAgICAgICAgIChmZWF0dXJl RGVwIGx6NFN1cHBvcnQgbHo0KQorICAgICAgICAgICAgICAoZmVhdHVyZURlcCB6c3RkU3Vw cG9ydCB6c3RkKQorICAgICAgICAgICAgICAoZmVhdHVyZURlcCB1dWlkU3VwcG9ydCBsaWJ1 dWlkKQorICAgICAgICAgICAgICAoZmVhdHVyZURlcCBjdXJsU3VwcG9ydCBjdXJsKQorICAg ICAgICAgICAgICAoZmVhdHVyZURlcCBwZXJsU3VwcG9ydCBwZXJsKQorICAgICAgICAgICAg ICAoZmVhdHVyZURlcCBweXRob25TdXBwb3J0IHB5dGhvbjMpCisgICAgICAgICAgICAgIChm ZWF0dXJlRGVwIHRjbFN1cHBvcnQgdGNsKQorICAgICAgICAgICAgICAoZmVhdHVyZURlcCBz eXN0ZW1kU3VwcG9ydCBzeXN0ZW1kTGlicykKKyAgICAgICAgICAgICAgKGZlYXR1cmVEZXAg c2VsaW51eFN1cHBvcnQgbGlic2VsaW51eCkKKyAgICAgICAgICAgICAgKGZlYXR1cmVEZXAg bGlidXJpbmdTdXBwb3J0IGxpYnVyaW5nKQorICAgICAgICAgICAgICAoZmVhdHVyZURlcCBu dW1hU3VwcG9ydCBudW1hY3RsKQorICAgICAgICAgICAgICAoZmVhdHVyZURlcCBnc3NTdXBw b3J0IGxpYmtyYjUpCisgICAgICAgICAgICAgIChmZWF0dXJlRGVwIGxkYXBTdXBwb3J0IG9w ZW5sZGFwKQorICAgICAgICAgICAgICAoZmVhdHVyZURlcCBwYW1TdXBwb3J0IGxpbnV4LXBh bSkKKyAgICAgICAgICAgICAgKGZlYXR1cmVEZXAgbGx2bVN1cHBvcnQgbGx2bVBhY2thZ2Vz Lmxsdm0pCisgICAgICAgICAgICBdKTsKKyAgICAgICAgICBpbgorICAgICAgICAgIHN0ZGVu di5ta0Rlcml2YXRpb24geworICAgICAgICAgICAgcG5hbWUgPSAicG9zdGdyZXNxbCI7Cisg ICAgICAgICAgICB2ZXJzaW9uID0gIjIwZGV2ZWwiOworICAgICAgICAgICAgc3JjID0gc2Vs ZjsKKworICAgICAgICAgICAgc3RyaWN0RGVwcyA9IHRydWU7CisKKyAgICAgICAgICAgIG5h dGl2ZUJ1aWxkSW5wdXRzID0gbGliLmZsYXR0ZW4gKHdpdGggcGtnczsgWworICAgICAgICAg ICAgICBiaXNvbgorICAgICAgICAgICAgICBmbGV4CisgICAgICAgICAgICAgIHBlcmwKKyAg ICAgICAgICAgICAgcGtnLWNvbmZpZworICAgICAgICAgICAgICAoZmVhdHVyZURlcCB1c2VN ZXNvbiBtZXNvbikKKyAgICAgICAgICAgICAgKGZlYXR1cmVEZXAgdXNlTWVzb24gbmluamEp CisgICAgICAgICAgICAgIChmZWF0dXJlRGVwIGxsdm1TdXBwb3J0IGxsdm1QYWNrYWdlcy5s bHZtLmRldikKKyAgICAgICAgICAgICAgKGZlYXR1cmVEZXAgZG9jcyBkb2Nib29rLXhzbC1u b25zKQorICAgICAgICAgICAgICAoZmVhdHVyZURlcCBkb2NzIGRvY2Jvb2tfeG1sX2R0ZF80 NSkKKyAgICAgICAgICAgICAgKGZlYXR1cmVEZXAgZG9jcyBsaWJ4c2x0KQorICAgICAgICAg ICAgXSk7CisKKyAgICAgICAgICAgIGluaGVyaXQgYnVpbGRJbnB1dHM7CisKKyAgICAgICAg ICAgICMgLS0tLSBhdXRvY29uZiBwYXRoIC0tLS0KKyAgICAgICAgICAgIGNvbmZpZ3VyZUZs YWdzID0gbGliLm9wdGlvbmFscyAoIXVzZU1lc29uKSBjb25maWd1cmVGZWF0dXJlczsKKwor ICAgICAgICAgICAgIyAtLS0tIG1lc29uIHBhdGggLS0tLQorICAgICAgICAgICAgbWVzb25C dWlsZFR5cGUgPSAicmVsZWFzZSI7CisgICAgICAgICAgICBtZXNvbkZsYWdzID0gbGliLm9w dGlvbmFscyB1c2VNZXNvbiBtZXNvbkZlYXR1cmVzOworICAgICAgICAgICAgZG9udFVzZU1l c29uQ29uZmlndXJlID0gIXVzZU1lc29uOworICAgICAgICAgICAgbWVzb25BdXRvRmVhdHVy ZXMgPSAiZGlzYWJsZWQiOworCisgICAgICAgICAgICBlbmFibGVQYXJhbGxlbEJ1aWxkaW5n ID0gdHJ1ZTsKKyAgICAgICAgICAgIGRvQ2hlY2sgPSB0YXBUZXN0czsKKworICAgICAgICAg ICAgbWV0YSA9IHdpdGggbGliOyB7CisgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIk9i amVjdC1yZWxhdGlvbmFsIGRhdGFiYXNlIG1hbmFnZW1lbnQgc3lzdGVtLCBidWlsdCBmcm9t IHNvdXJjZSI7CisgICAgICAgICAgICAgIGhvbWVwYWdlID0gImh0dHBzOi8vd3d3LnBvc3Rn cmVzcWwub3JnLyI7CisgICAgICAgICAgICAgIGxpY2Vuc2UgPSBsaWNlbnNlcy5wb3N0Z3Jl c3FsOworICAgICAgICAgICAgICBwbGF0Zm9ybXMgPSBwbGF0Zm9ybXMudW5peDsKKyAgICAg ICAgICAgICAgbWFpblByb2dyYW0gPSAicHNxbCI7CisgICAgICAgICAgICB9OworICAgICAg ICAgIH0KKyAgICAgICAgKQorICAgICAgICB7IH07CisgICAgaW4KKyAgICB7CisgICAgICBw YWNrYWdlcyA9IGZvckFsbFN5c3RlbXMgKHBrZ3M6IHJlYyB7CisgICAgICAgIHBvc3RncmVz cWwgPSBwb3N0Z3Jlc3FsRm9yIHBrZ3M7CisgICAgICAgICMgQ29tbW9uIHByZXNldHMgYnVp bHQgb24gdG9wIG9mIHRoZSBmdWxseS1wYXJhbWV0ZXJpemVkIGRlZmF1bHQuCisgICAgICAg IHBvc3RncmVzcWwtYXV0b2NvbmYgPSBwb3N0Z3Jlc3FsLm92ZXJyaWRlIHsgYnVpbGRTeXN0 ZW0gPSAiYXV0b2NvbmYiOyB9OworICAgICAgICBwb3N0Z3Jlc3FsLWRlYnVnID0gcG9zdGdy ZXNxbC5vdmVycmlkZSB7CisgICAgICAgICAgY2Fzc2VydCA9IHRydWU7CisgICAgICAgICAg ZGVidWdTeW1ib2xzID0gdHJ1ZTsKKyAgICAgICAgICBpbmplY3Rpb25Qb2ludHMgPSB0cnVl OworICAgICAgICB9OworICAgICAgICBwb3N0Z3Jlc3FsLW1pbmltYWwgPSBwb3N0Z3Jlc3Fs Lm92ZXJyaWRlIHsKKyAgICAgICAgICBpY3VTdXBwb3J0ID0gZmFsc2U7CisgICAgICAgICAg cmVhZGxpbmVTdXBwb3J0ID0gZmFsc2U7CisgICAgICAgICAgemxpYlN1cHBvcnQgPSBmYWxz ZTsKKyAgICAgICAgICBvcGVuc3NsU3VwcG9ydCA9IGZhbHNlOworICAgICAgICAgIGxpYnht bFN1cHBvcnQgPSBmYWxzZTsKKyAgICAgICAgICBsaWJ4c2x0U3VwcG9ydCA9IGZhbHNlOwor ICAgICAgICAgIGx6NFN1cHBvcnQgPSBmYWxzZTsKKyAgICAgICAgICB6c3RkU3VwcG9ydCA9 IGZhbHNlOworICAgICAgICAgIHV1aWRTdXBwb3J0ID0gZmFsc2U7CisgICAgICAgICAgY3Vy bFN1cHBvcnQgPSBmYWxzZTsKKyAgICAgICAgICBwZXJsU3VwcG9ydCA9IGZhbHNlOworICAg ICAgICAgIHB5dGhvblN1cHBvcnQgPSBmYWxzZTsKKyAgICAgICAgICB0Y2xTdXBwb3J0ID0g ZmFsc2U7CisgICAgICAgICAgc3lzdGVtZFN1cHBvcnQgPSBmYWxzZTsKKyAgICAgICAgICBs aWJ1cmluZ1N1cHBvcnQgPSBmYWxzZTsKKyAgICAgICAgICBudW1hU3VwcG9ydCA9IGZhbHNl OworICAgICAgICAgIGdzc1N1cHBvcnQgPSBmYWxzZTsKKyAgICAgICAgICBwYW1TdXBwb3J0 ID0gZmFsc2U7CisgICAgICAgIH07CisgICAgICAgIGRlZmF1bHQgPSBwb3N0Z3Jlc3FsOwor ICAgICAgfSk7CisKKyAgICAgICMgYG5peCBkZXZlbG9wYDogZnVsbCB0b29sY2hhaW4gZm9y IGNvbmZpZ3VyZS9tYWtlLCBtZXNvbiwgZG9jcywKKyAgICAgICMgVEFQIHRlc3RzLCBhbmQg YWxsIHRocmVlIFBMcyDigJQgcmVnYXJkbGVzcyBvZiB3aGljaCBmZWF0dXJlcyBhCisgICAg ICAjIGdpdmVuIGJ1aWxkIGVuYWJsZXMuCisgICAgICBkZXZTaGVsbHMgPSBmb3JBbGxTeXN0 ZW1zIChwa2dzOiB7CisgICAgICAgIGRlZmF1bHQgPSBwa2dzLm1rU2hlbGwgeworICAgICAg ICAgIGlucHV0c0Zyb20gPSBbIHNlbGYucGFja2FnZXMuJHtwa2dzLnN0ZGVudi5ob3N0UGxh dGZvcm0uc3lzdGVtfS5wb3N0Z3Jlc3FsIF07CisgICAgICAgICAgcGFja2FnZXMgPSB3aXRo IHBrZ3M7IFsKKyAgICAgICAgICAgIGNjYWNoZQorICAgICAgICAgICAgZG9jYm9va194bWxf ZHRkXzQ1CisgICAgICAgICAgICBkb2Nib29rLXhzbC1ub25zCisgICAgICAgICAgICBsaWJ4 c2x0CisgICAgICAgICAgICBtZXNvbgorICAgICAgICAgICAgbmluamEKKyAgICAgICAgICAg IHBlcmwKKyAgICAgICAgICAgIHB5dGhvbjMKKyAgICAgICAgICAgIHRjbAorICAgICAgICAg IF07CisgICAgICAgIH07CisgICAgICB9KTsKKworICAgICAgZm9ybWF0dGVyID0gZm9yQWxs U3lzdGVtcyAocGtnczogcGtncy5uaXhmbXQpOworICAgIH07Cit9Ci0tIAoyLjU0LjAKCg== --c71de65f0610876e6febb11e1b2b762f9419c6dd--