From MAILER-DAEMON Tue Dec 01 02:19:03 2009 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1NFN0p-0005u5-Dc for mharc-elyxer-users@gnu.org; Tue, 01 Dec 2009 02:19:03 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NFN0n-0005tr-L8 for elyxer-users@nongnu.org; Tue, 01 Dec 2009 02:19:01 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NFN0i-0005tO-HR for elyxer-users@nongnu.org; Tue, 01 Dec 2009 02:19:00 -0500 Received: from [199.232.76.173] (port=58078 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NFN0i-0005tE-Dr for elyxer-users@nongnu.org; Tue, 01 Dec 2009 02:18:56 -0500 Received: from mail-bw0-f212.google.com ([209.85.218.212]:34306) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NFN0i-00047L-7L for elyxer-users@nongnu.org; Tue, 01 Dec 2009 02:18:56 -0500 Received: by bwz4 with SMTP id 4so3316511bwz.2 for ; Mon, 30 Nov 2009 23:18:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:received:in-reply-to :references:date:x-google-sender-auth:message-id:subject:from:to :content-type; bh=dLhfk3JYmL0U2fjde5oG7BJ9TFqKDU/Bqkin8KaPh1g=; b=VXzQAK5Ew7Ogl48RZ5liE2PylVtjla3DwYnuW5//ozxIqB7dcC2frlj7S7D9gVjZO7 KsmdSUACK2NxVlQtzVy4vQz4ODr3732gsJjLnXgbuq7YsblCXdP1E0ZAHx6uAQSUB3nB 4D7jXfCkTCenIGy1+fP7xLpghy1UEk9IeGQdo= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:content-type; b=pXr2Qve+ahPpE0PrDN8yuyclW3n6CsgNCyRNSj8N+4NryZ5PzFpZgM8WW/lifOZAYP U8O7R0Z0NSftb2E6/dwjzpuKj1z9MrnRtN7mnUzab/hZlBYCQo/cduSU+yidvkRZnGYU F0SpPjaavFKPaKaNZUEpmAnLnvtBZB4bazoiY= MIME-Version: 1.0 Sender: alejandrofer@gmail.com Received: by 10.204.34.88 with SMTP id k24mr2825909bkd.209.1259651934579; Mon, 30 Nov 2009 23:18:54 -0800 (PST) In-Reply-To: <2110ee000911221228g133ef8e1h3dbe12cf55996afa@mail.gmail.com> References: <20091122175424.GE1752@marvin.home.hoaxter.de> <2110ee000911221142x3ab9952cx4270cbb008f6cdeb@mail.gmail.com> <20091122200508.GB17343@marvin.home.hoaxter.de> <2110ee000911221228g133ef8e1h3dbe12cf55996afa@mail.gmail.com> Date: Tue, 1 Dec 2009 08:18:54 +0100 X-Google-Sender-Auth: f79324e3eebb1e4d Message-ID: <2110ee000911302318l4b078e93k3edba6c16586beb1@mail.gmail.com> Subject: Re: [eLyXer-users] Excluding the build directory from the tarball? From: Alex Fernandez To: eLyXer users Content-Type: text/plain; charset=ISO-8859-1 X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) X-BeenThere: elyxer-users@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: eLyXer users List-Id: eLyXer users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 01 Dec 2009 07:19:01 -0000 Hi Sven, Is everything working fine now wrt the build directory? Just out of curiosity, how long does it take you to generate the Debian package? I would be glad to help reduce it to the max, I'm a big fan of automation! :D My own eLyXer packages take about a minute with _no_ manual actions whatsoever, apart from entering the signature for the packages: the version is generated, packaged and uploaded to the servers with the create-version script. If there is anything else I can do, just let me know. Alex. From MAILER-DAEMON Tue Dec 01 03:41:40 2009 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1NFOIm-00042Z-KG for mharc-elyxer-users@gnu.org; Tue, 01 Dec 2009 03:41:40 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NFOIl-00041U-Gj for elyxer-users@nongnu.org; Tue, 01 Dec 2009 03:41:39 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NFOIh-0003wB-I7 for elyxer-users@nongnu.org; Tue, 01 Dec 2009 03:41:39 -0500 Received: from [199.232.76.173] (port=40028 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NFOIh-0003w1-Ed for elyxer-users@nongnu.org; Tue, 01 Dec 2009 03:41:35 -0500 Received: from smtp6.netcologne.de ([194.8.194.26]:34373) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NFOIh-000373-26 for elyxer-users@nongnu.org; Tue, 01 Dec 2009 03:41:35 -0500 Received: from arthur.hx.lan (xdsl-87-78-170-143.netcologne.de [87.78.170.143]) by smtp6.netcologne.de (Postfix) with ESMTP id 5BE7A2A0D8B for ; Tue, 1 Dec 2009 09:41:29 +0100 (CET) Received: from colin.hx.lan (colinvpn.hx.lan [192.168.22.5]) by arthur.hx.lan (Postfix) with SMTP id 9658E34682 for ; Tue, 1 Dec 2009 09:41:28 +0100 (CET) Received: (nullmailer pid 28095 invoked by uid 1000); Tue, 01 Dec 2009 07:53:15 -0000 Date: Tue, 1 Dec 2009 08:53:15 +0100 From: Sven Hoexter To: elyxer-users@nongnu.org Subject: Re: [eLyXer-users] Excluding the build directory from the tarball? Message-ID: <20091201075313.GA17395@colin.hx.lan> References: <20091122175424.GE1752@marvin.home.hoaxter.de> <2110ee000911221142x3ab9952cx4270cbb008f6cdeb@mail.gmail.com> <20091122200508.GB17343@marvin.home.hoaxter.de> <2110ee000911221228g133ef8e1h3dbe12cf55996afa@mail.gmail.com> <2110ee000911302318l4b078e93k3edba6c16586beb1@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <2110ee000911302318l4b078e93k3edba6c16586beb1@mail.gmail.com> User-Agent: Mutt/1.5.18 (2008-05-17) X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) X-BeenThere: elyxer-users@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: eLyXer users List-Id: eLyXer users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 01 Dec 2009 08:41:39 -0000 On Tue, Dec 01, 2009 at 08:18:54AM +0100, Alex Fernandez wrote: Hi Alex, > Is everything working fine now wrt the build directory? Works nice and straight forward now. Thanks. > Just out of > curiosity, how long does it take you to generate the Debian package? I > would be glad to help reduce it to the max, I'm a big fan of > automation! :D My own eLyXer packages take about a minute with _no_ > manual actions whatsoever, apart from entering the signature for the > packages: the version is generated, packaged and uploaded to the > servers with the create-version script. With all the helper tools (mainly git-buildpackage) it's relatively easy though not fully automated. a) Download the new source and verify it. gpg --verify elyer-0.x.tar.gz.asc b) Import the new upstream source. git-import-orig elyxer-0.x.tar.gz git commit --tags c) emacs debian/changelog and add some notes about the new release etc. If needed commit changes like manpage updates etc. d) Build the source package from git git-buildpackage --git-pristine-tar -us -uc -rfakeroot -S -d e) Build the source package in pbuilder sudo pbuilder elyxer_0.x.dsc f) Check the build package: lintian -iIv *.changes, dpkg --contents *.deb maybe debdiff against prior packages, install the package, remove the package, upgrade from prior version etc. You'd might guess it that's the most time consuming step in the process. -> Fix any problems and repeat. g) Sign and upload the build (debsign *.changes, dput ftp-master *.changes) h) debcommit -a -r to commit the release to the repo. There is definetly space for improvements (better usage of debuild und integration with pbuilder). The 'time consuming' part is still the testing. All in all you can do it in about 20min. > If there is anything else I can do, just let me know. Currently everything is fine from my perspective. Cheers, Sven -- If God passed a mic to me to speak I'd say stay in bed, world Sleep in peace [The Cardigans - 03:45: No sleep] From MAILER-DAEMON Wed Dec 02 18:47:50 2009 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1NFyvG-000235-7D for mharc-elyxer-users@gnu.org; Wed, 02 Dec 2009 18:47:50 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NFyvE-00020y-Dn for elyxer-users@nongnu.org; Wed, 02 Dec 2009 18:47:48 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NFyv9-0001vd-CY for elyxer-users@nongnu.org; Wed, 02 Dec 2009 18:47:47 -0500 Received: from [199.232.76.173] (port=34497 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NFyv9-0001vU-7B for elyxer-users@nongnu.org; Wed, 02 Dec 2009 18:47:43 -0500 Received: from mail-bw0-f212.google.com ([209.85.218.212]:58382) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NFyv8-0003WT-NU for elyxer-users@nongnu.org; Wed, 02 Dec 2009 18:47:43 -0500 Received: by bwz4 with SMTP id 4so714905bwz.2 for ; Wed, 02 Dec 2009 15:47:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:received:in-reply-to :references:date:x-google-sender-auth:message-id:subject:from:to :content-type; bh=bWHIHZmGxbtFNbi1+GLSByJlfmxYLgdrIkrY8kLTYdw=; b=kRzcGGK7zBQYXykQwQiSIgq6pSQuiB9LbC/367sYrF896lfCbdLa8g31eAi+bdoR5H mBpbqLXiREHtJs9rHTfoqvIaD0CV90P3VfGazWi9Vs1Y7MtkcX4K2dpXGxNU4TvLPs// UJsJicF6G+1NozT16n/jJCTrfnj+vN1lAL/ws= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:content-type; b=IJUzU0v1Tnx3Gfh36J2VchPKuA4K7qofGnZdud20zaN3p9ZY5l6eFbgV1+dwkpJ8ZD dYTb6KCtcbKL6El6Y+AXazt3WfPcb93IJYunTiJucUysQV4f+pxArfJtnBowzzJVlkel BKVX45ctnKro8G4ybOY7SA7yZvmXThm8v0Gbs= MIME-Version: 1.0 Sender: alejandrofer@gmail.com Received: by 10.204.25.152 with SMTP id z24mr863276bkb.44.1259797661080; Wed, 02 Dec 2009 15:47:41 -0800 (PST) In-Reply-To: <20091201075313.GA17395@colin.hx.lan> References: <20091122175424.GE1752@marvin.home.hoaxter.de> <2110ee000911221142x3ab9952cx4270cbb008f6cdeb@mail.gmail.com> <20091122200508.GB17343@marvin.home.hoaxter.de> <2110ee000911221228g133ef8e1h3dbe12cf55996afa@mail.gmail.com> <2110ee000911302318l4b078e93k3edba6c16586beb1@mail.gmail.com> <20091201075313.GA17395@colin.hx.lan> Date: Thu, 3 Dec 2009 00:47:41 +0100 X-Google-Sender-Auth: d5f09eaade2af77b Message-ID: <2110ee000912021547r3e932956y96b49a8a7d77fd3@mail.gmail.com> Subject: Re: [eLyXer-users] Excluding the build directory from the tarball? From: Alex Fernandez To: eLyXer users Content-Type: text/plain; charset=ISO-8859-1 X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) X-BeenThere: elyxer-users@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: eLyXer users List-Id: eLyXer users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 02 Dec 2009 23:47:48 -0000 On Tue, Dec 1, 2009 at 8:53 AM, Sven Hoexter wrote: > With all the helper tools (mainly git-buildpackage) it's relatively easy > though not fully automated. [snip] > There is definetly space for improvements (better usage of debuild und > integration with pbuilder). The 'time consuming' part is still the testing. > All in all you can do it in about 20min. Fascinating. Since you are happy with the distribution now, let it rest until you find any further issues. Thanks, Alex. From MAILER-DAEMON Wed Dec 02 19:50:16 2009 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1NFztf-0005oZ-U5 for mharc-elyxer-users@gnu.org; Wed, 02 Dec 2009 19:50:15 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NFztf-0005nw-7a for elyxer-users@nongnu.org; Wed, 02 Dec 2009 19:50:15 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NFzta-0005hm-DF for elyxer-users@nongnu.org; Wed, 02 Dec 2009 19:50:14 -0500 Received: from [199.232.76.173] (port=33026 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NFzta-0005ha-9Y for elyxer-users@nongnu.org; Wed, 02 Dec 2009 19:50:10 -0500 Received: from mail-bw0-f212.google.com ([209.85.218.212]:33116) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NFztZ-0002DB-T6 for elyxer-users@nongnu.org; Wed, 02 Dec 2009 19:50:10 -0500 Received: by bwz4 with SMTP id 4so742859bwz.2 for ; Wed, 02 Dec 2009 16:50:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:received:date :x-google-sender-auth:message-id:subject:from:to:content-type :content-transfer-encoding; bh=AxUe+cSe6V/lO9yUb9jQAPbWJAjBKaJDqllIzkbbfg8=; b=hDLbaE2mAQq7qdrOm5ZYa2DbvEP7z2GHHrV5W8qZfR5BrgY3MiXSYO2tyHAr8NwjE2 iNR6qx9Nkg0J8G7jhrvqtPki/uhvWEnCB/rwXg9M9Fvd3yvEd585VxlZnWzBDv1x4b8u XD7sc8A6rnXaX923vGGgbJOtnxZbjfxoYdWCk= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:date:x-google-sender-auth:message-id:subject :from:to:content-type:content-transfer-encoding; b=b/fE+fisFT5tjDlCvS0ZFYbMpE+uqXX0VyHaWXGmj49xpwKsSFjRs8A6HbUxG1c74C /0cNjH3rNJ92NGcwTTLpF4ciq34sNlMicr70YKbQZ4vR6eS0NtDfbWOZyRY08Xsg/OK7 T+InksGyDUZJH7B13rr/2rQ/10THBLD4xsAw4= MIME-Version: 1.0 Sender: alejandrofer@gmail.com Received: by 10.204.8.155 with SMTP id h27mr911257bkh.55.1259801405816; Wed, 02 Dec 2009 16:50:05 -0800 (PST) Date: Thu, 3 Dec 2009 01:50:05 +0100 X-Google-Sender-Auth: 9bbaf0053508d7f1 Message-ID: <2110ee000912021650q77fc1ddh5a9c9cf08df750ae@mail.gmail.com> From: Alex Fernandez To: "The main list to talk about eLyXer: features, announcements, requests" , =?ISO-8859-1?Q?Uwe_St=F6hr?= Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) Cc: Subject: [eLyXer-users] eLyXer 0.38 released X-BeenThere: elyxer-users@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: eLyXer users List-Id: eLyXer users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 03 Dec 2009 00:50:15 -0000 Hi folks, Version 0.38 of eLyXer has been published. This version basically contains a lot of fixes (thanks to Uwe St=F6hr and his relentless testing), and a new look: smaller font sizes all around. Changes include: --- =96 Resized all logos in the documentation. =96 Solved bug in paragraph indentation that indented all formula spans and elements. =96 Solved a couple of bugs in image scaling: wraps with images, images in figures. =96 Solved bug in TOC generation: article-class documents had their TOC depth off-by-one. =96 Solved bug with listings inserted in documents using LyX 1.6, and improved their looks. =96 Slight font size reduction on Firefox, and huge reduction on some other proprietary browsers. Now global font size specification is done using percents. =96 New commands: \gtrless: \gtrless, \complement: \complement, \measuredangle: \measuredangle, \sphericalangle: \sphericalangle, \nmid: \nmid, \circeq: \circeq, \lessgtr: \lessgtr, \nparallel: \nparallel. --- Complete changelog: =A0http://www.nongnu.org/elyxer/changelog.html Download from nongnu.org mirrors: =A0https://savannah.nongnu.org/files/?group=3Delyxer If the new version has not hit your favorite mirror yet: =A0http://download.savannah.gnu.org/releases-noredirect/elyxer/ Thanks, Alex Fern=E1ndez. From MAILER-DAEMON Thu Dec 03 13:01:47 2009 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1NGFzv-0000hr-Cg for mharc-elyxer-users@gnu.org; Thu, 03 Dec 2009 13:01:47 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NGFzt-0000ft-OU for elyxer-users@nongnu.org; Thu, 03 Dec 2009 13:01:45 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NGFzo-0000XG-1Y for elyxer-users@nongnu.org; Thu, 03 Dec 2009 13:01:45 -0500 Received: from [199.232.76.173] (port=45422 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NGFzn-0000X3-R3 for elyxer-users@nongnu.org; Thu, 03 Dec 2009 13:01:39 -0500 Received: from smtp5.netcologne.de ([194.8.194.25]:47486) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NGFzn-0000rM-BX for elyxer-users@nongnu.org; Thu, 03 Dec 2009 13:01:39 -0500 Received: from arthur.hx.lan (xdsl-87-78-173-189.netcologne.de [87.78.173.189]) by smtp5.netcologne.de (Postfix) with ESMTP id 7BC2931C302 for ; Thu, 3 Dec 2009 19:01:36 +0100 (CET) Received: from marvin.hx.lan (marvin.hx.lan [192.168.88.99]) by arthur.hx.lan (Postfix) with SMTP id B45C734673 for ; Thu, 3 Dec 2009 19:01:34 +0100 (CET) Received: by marvin.hx.lan (sSMTP sendmail emulation); Thu, 03 Dec 2009 19:01:35 +0100 Date: Thu, 3 Dec 2009 19:01:35 +0100 From: Sven Hoexter To: elyxer-users@nongnu.org Subject: Re: [eLyXer-users] Excluding the build directory from the tarball? Message-ID: <20091203180135.GA1737@marvin.hx.lan> References: <20091122175424.GE1752@marvin.home.hoaxter.de> <2110ee000911221142x3ab9952cx4270cbb008f6cdeb@mail.gmail.com> <20091122200508.GB17343@marvin.home.hoaxter.de> <2110ee000911221228g133ef8e1h3dbe12cf55996afa@mail.gmail.com> <2110ee000911302318l4b078e93k3edba6c16586beb1@mail.gmail.com> <20091201075313.GA17395@colin.hx.lan> <2110ee000912021547r3e932956y96b49a8a7d77fd3@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <2110ee000912021547r3e932956y96b49a8a7d77fd3@mail.gmail.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) X-BeenThere: elyxer-users@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: eLyXer users List-Id: eLyXer users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 03 Dec 2009 18:01:46 -0000 On Thu, Dec 03, 2009 at 12:47:41AM +0100, Alex Fernandez wrote: > On Tue, Dec 1, 2009 at 8:53 AM, Sven Hoexter wrote: Hi, > > There is definetly space for improvements (better usage of debuild und > > integration with pbuilder). The 'time consuming' part is still the testing. > > All in all you can do it in about 20min. > > Fascinating. Since you are happy with the distribution now, let it > rest until you find any further issues. Out of interest I had a look at the clock while preparing 0.38-1. It took me 18 minutes with two pbuilder builds (had to fix a typo in the changelog, git rebase with the ability to squash commits is amazing) to prepare the package and upload it. Two more minutes to add the right tag by hand (I tried to be faster than I should've been, my fault). So the 20min seem to be a good guess for a release with minimal changes. Sven -- If God passed a mic to me to speak I'd say stay in bed, world Sleep in peace [The Cardigans - 03:45: No sleep] From MAILER-DAEMON Sun Dec 13 17:19:18 2009 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1NJwmc-0003mP-Bn for mharc-elyxer-users@gnu.org; Sun, 13 Dec 2009 17:19:18 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NJup5-0006xP-0V for elyxer-users@nongnu.org; Sun, 13 Dec 2009 15:13:43 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NJup0-0006u9-5T for elyxer-users@nongnu.org; Sun, 13 Dec 2009 15:13:42 -0500 Received: from [199.232.76.173] (port=34239 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NJuoz-0006u3-Vz for elyxer-users@nongnu.org; Sun, 13 Dec 2009 15:13:38 -0500 Received: from cc-mserv4.uoregon.edu ([128.223.142.129]:43664 helo=smtp.uoregon.edu) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1NJuoz-0004Xy-HE for elyxer-users@nongnu.org; Sun, 13 Dec 2009 15:13:37 -0500 Received: from [10.0.1.5] (c-71-193-176-57.hsd1.wa.comcast.net [71.193.176.57]) (authenticated bits=0) by smtp.uoregon.edu (8.14.3/8.14.3) with ESMTP id nBDKDXPc015384 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NOT) for ; Sun, 13 Dec 2009 12:13:34 -0800 Message-Id: <7F3179F5-A8FA-4ADD-8147-7C5881942723@uoregon.edu> From: =?ISO-8859-1?Q?Jens_N=F6ckel?= To: elyxer-users@nongnu.org Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Mime-Version: 1.0 (Apple Message framework v936) Date: Sun, 13 Dec 2009 12:13:33 -0800 X-Mailer: Apple Mail (2.936) X-Proofpoint-Virus-Version: vendor=fsecure engine=1.12.8161:2.4.5, 1.2.40, 4.0.166 definitions=2009-12-13_06:2009-12-12, 2009-12-13, 2009-12-13 signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 ipscore=0 phishscore=0 bulkscore=0 adultscore=0 classifier=spam adjust=-45 reason=mlx engine=5.0.0-0908210000 definitions=main-0912130169 X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 3) X-Mailman-Approved-At: Sun, 13 Dec 2009 17:19:16 -0500 Subject: [eLyXer-users] brackets with \left. X-BeenThere: elyxer-users@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: eLyXer users List-Id: eLyXer users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 13 Dec 2009 20:13:43 -0000 Hi, first of all thanks for making elyxer availble - I've installed it on my Mac for HTML generation from LyX and it's really promising, with great progress in a very short time. The reason I'm writing is that elyxer gives wrong HTML output for brackets such as \left. something \right) where I use the \left. to balance the right bracket with an invisible delimiter. In the HTML output the left delimiter appears as a dot because the \left tab is recognized as a "onefunction" and immediately translated by inserting the symbol that follows. I've looked a little at the code and see a Bracket class, but if I understand correctly it seems to be used only by the pair [ and ], and it also doesn't leave a trace in the HTML output (i.e., there is no surrounding in the formula corresponding to the extent of the bracketed content). But I'm still trying to learn the logic of the code, so correct me if I'm wrong... Ultimately I think the \left and \right tokens should count as bracket delimiters, and some way of handling the invisible bracket for \left. or \right. is needed. Right now I can fix this by post-processing the HTML do remove the . But I'm thinking that the Bracket class is probably the place where this could be fixed. Cheers, Jens From MAILER-DAEMON Sun Dec 13 17:47:01 2009 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1NJxDR-0000Ow-Ju for mharc-elyxer-users@gnu.org; Sun, 13 Dec 2009 17:47:01 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NJxDP-0000O6-Rr for elyxer-users@nongnu.org; Sun, 13 Dec 2009 17:46:59 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NJxDL-0000Lu-FW for elyxer-users@nongnu.org; Sun, 13 Dec 2009 17:46:59 -0500 Received: from [199.232.76.173] (port=49245 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NJxDL-0000Lp-5F for elyxer-users@nongnu.org; Sun, 13 Dec 2009 17:46:55 -0500 Received: from mail-bw0-f212.google.com ([209.85.218.212]:36093) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NJxDK-00071L-Nk for elyxer-users@nongnu.org; Sun, 13 Dec 2009 17:46:54 -0500 Received: by bwz4 with SMTP id 4so1674900bwz.2 for ; Sun, 13 Dec 2009 14:46:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:received:in-reply-to :references:date:x-google-sender-auth:message-id:subject:from:to :content-type:content-transfer-encoding; bh=Ztjb1K3cyvv856oplYgNkWq40KVaq8z6aV1cdA+9rrA=; b=MASfEuI0QEIiwgeJwdBTBQ/0QNaSD5uHyTVq1xAc7M340MaGUY5R3Se4u49AOY/eZ7 UiTCwbQytyTpBTRsww3f0kvzIMbpzJg5C0uT3FHYBYL0wwgRoPS2Nn7PryqKmJuAUaYx dR1ngpGoy5y6JLaY3sKZWKpCKvdDbMdnYy4eQ= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:content-type :content-transfer-encoding; b=OJ0Gb8YSGf0Stgq3MhyDwzvg+QPxBz8Z54uB4iXrmfruoSjFSv0WD6iaAF3/m6cCqe 0w17gLLou+h/1ePKEed7tct9h6IW3BPuIabsWORfFnEzLocYQfSKnObjk7tGyy6oJiuc JlTopiJKhxMPv0CgGRt1fUTXHhpotR8Ma8nsY= MIME-Version: 1.0 Sender: alejandrofer@gmail.com Received: by 10.204.36.209 with SMTP id u17mr770177bkd.166.1260744413181; Sun, 13 Dec 2009 14:46:53 -0800 (PST) In-Reply-To: <7F3179F5-A8FA-4ADD-8147-7C5881942723@uoregon.edu> References: <7F3179F5-A8FA-4ADD-8147-7C5881942723@uoregon.edu> Date: Sun, 13 Dec 2009 23:46:53 +0100 X-Google-Sender-Auth: ce6ceddcd0e676d1 Message-ID: <2110ee000912131446x205e9a5dq362215c52cb17c88@mail.gmail.com> Subject: Re: [eLyXer-users] brackets with \left. From: Alex Fernandez To: eLyXer users Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) X-BeenThere: elyxer-users@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: eLyXer users List-Id: eLyXer users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 13 Dec 2009 22:47:00 -0000 Hi Jens, On Sun, Dec 13, 2009 at 9:13 PM, Jens N=F6ckel wrote: > The reason I'm writing is that elyxer gives wrong HTML output for bracket= s > such as > \left. something \right) > where I use the \left. to balance the right bracket with an invisible > delimiter. In the HTML output the left delimiter appears as a dot because > the \left tab is recognized as a "onefunction" and immediately translated= by > inserting the symbol that follows. That is just a result of my ignorance of how \left and \right work; without knowing any better I just did the minimal work that produced acceptable results for the LyX Math manual. What are they supposed to do? Why is the dot invisible in \left.? Why the need to balance a \right with a \left? > I've looked a little at the code and see a Bracket class, but if I > understand correctly it seems to be used only by the pair [ and ], and it > also doesn't leave a trace in the HTML output (i.e., there is no surround= ing > in the formula corresponding to the extent of the bracketed conten= t). > But I'm still trying to learn the logic of the code, so correct me if I'm > wrong... Ultimately I think the \left and \right tokens should count as > bracket delimiters, and some way of handling the invisible bracket for > \left. or \right. is needed. Actually, the Bracket class is just for {} brackets; there is a SquareBracket to read [] brackets. Right now none of them have anything to do with reading \left and \right commands. A different solution should perhaps be found. > Right now I can fix this by post-processing the HTML do remove the > . > But I'm thinking that the Bracket class is probably the place where this > could be fixed. Maybe not the Bracket class, but a command is surely the way to go. Just be sure to download the source code (not the coalesced everything-in-one-big-file elyxer.py) if you want to actually follow the code, it is nicely organized in packages: http://www.nongnu.org/elyxer/devguide.html and then run eLyXer directly from the source code: instead of $ elyxer.py input.lyx output.html run it as $ src/principal.py input.lyx output.html I have added an explanation to the developer guide. Thanks, Alex. From MAILER-DAEMON Mon Dec 14 01:54:43 2009 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1NK4pP-0002mR-4d for mharc-elyxer-users@gnu.org; Mon, 14 Dec 2009 01:54:43 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NK4pM-0002kl-Hz for elyxer-users@nongnu.org; Mon, 14 Dec 2009 01:54:40 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NK4pH-0002jm-Ay for elyxer-users@nongnu.org; Mon, 14 Dec 2009 01:54:39 -0500 Received: from [199.232.76.173] (port=39892 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NK4pH-0002jd-2w for elyxer-users@nongnu.org; Mon, 14 Dec 2009 01:54:35 -0500 Received: from cc-mserv1.uoregon.edu ([128.223.142.126]:59040 helo=smtp.uoregon.edu) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1NK4pG-00085F-N9 for elyxer-users@nongnu.org; Mon, 14 Dec 2009 01:54:35 -0500 Received: from [10.0.1.5] (c-71-193-176-57.hsd1.wa.comcast.net [71.193.176.57]) (authenticated bits=0) by smtp.uoregon.edu (8.14.3/8.14.3) with ESMTP id nBE6sUf1020188 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NOT) for ; Sun, 13 Dec 2009 22:54:31 -0800 Message-Id: From: =?ISO-8859-1?Q?Jens_N=F6ckel?= To: eLyXer users In-Reply-To: <2110ee000912131446x205e9a5dq362215c52cb17c88@mail.gmail.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed; delsp=yes Content-Transfer-Encoding: quoted-printable Mime-Version: 1.0 (Apple Message framework v936) Subject: Re: [eLyXer-users] brackets with \left. Date: Sun, 13 Dec 2009 22:54:29 -0800 References: <7F3179F5-A8FA-4ADD-8147-7C5881942723@uoregon.edu> <2110ee000912131446x205e9a5dq362215c52cb17c88@mail.gmail.com> X-Mailer: Apple Mail (2.936) X-Proofpoint-Virus-Version: vendor=fsecure engine=1.12.8161:2.4.5, 1.2.40, 4.0.166 definitions=2009-12-14_03:2009-12-12, 2009-12-14, 2009-12-14 signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 ipscore=0 phishscore=0 bulkscore=0 adultscore=0 classifier=spam adjust=-45 reason=mlx engine=5.0.0-0908210000 definitions=main-0912130350 X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 3) X-BeenThere: elyxer-users@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: eLyXer users List-Id: eLyXer users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Dec 2009 06:54:41 -0000 Hi Alex, OK - I've checked out the current version and will look at it some more. In the meantime, here is what the \left. is supposed to be for: It allows all brackets to be written in pairs of opening and closing =20 type, thus defining an enclosed content. When matching pairs of =20 brackets are used on a single line, there is no problem defining the =20 enclosed content, but there are situations where you want to define an =20= enclosed content while only having a bracket at one end of it. Then =20 you use an invisible bracket, represented by \right. or \left. An important case where this is needed is when the enclosed content =20 spans several lines of (say) an eqnarray. The opening bracket - e.g. =20 \left{ - is on one line, and the closing \right} on another. LaTeX =20 won't be happy unless there is a \right. at the end of the first line =20= and a \left. at the beginning of the last. The reason for using =20 \left{ in the first place (instead of a plain brace "{" ) is to get a =20= bracket whose vertical height is automatically scaled to match the =20 content (possibly modified by an additional phantom height). See =20 section 18.1.4 (Multiline Brackets) in the LyX Help doc Math.lyx. The current version of elyxer doesn't seem to have any vertical size =20 adjustment of brackets to match, say, enclosed fractions in vertical =20 height. So the \left. and \right. constructs really serve no purpose =20 here, and one could simply throw them away for now. Cheers, Jens On Dec 13, 2009, at 2:46 PM, Alex Fernandez wrote: > Hi Jens, > > On Sun, Dec 13, 2009 at 9:13 PM, Jens N=F6ckel =20= > wrote: >> The reason I'm writing is that elyxer gives wrong HTML output for =20 >> brackets >> such as >> \left. something \right) >> where I use the \left. to balance the right bracket with an invisible >> delimiter. In the HTML output the left delimiter appears as a dot =20 >> because >> the \left tab is recognized as a "onefunction" and immediately =20 >> translated by >> inserting the symbol that follows. > > That is just a result of my ignorance of how \left and \right work; > without knowing any better I just did the minimal work that produced > acceptable results for the LyX Math manual. > > What are they supposed to do? Why is the dot invisible in \left.? Why > the need to balance a \right with a \left? > >> I've looked a little at the code and see a Bracket class, but if I >> understand correctly it seems to be used only by the pair [ and ], =20= >> and it >> also doesn't leave a trace in the HTML output (i.e., there is no =20 >> surrounding >> in the formula corresponding to the extent of the bracketed =20= >> content). >> But I'm still trying to learn the logic of the code, so correct me =20= >> if I'm >> wrong... Ultimately I think the \left and \right tokens should =20 >> count as >> bracket delimiters, and some way of handling the invisible bracket =20= >> for >> \left. or \right. is needed. > > Actually, the Bracket class is just for {} brackets; there is a > SquareBracket to read [] brackets. Right now none of them have > anything to do with reading \left and \right commands. A different > solution should perhaps be found. > >> Right now I can fix this by post-processing the HTML do remove the >> . >> But I'm thinking that the Bracket class is probably the place where =20= >> this >> could be fixed. > > Maybe not the Bracket class, but a command is surely the way to go. > Just be sure to download the source code (not the coalesced > everything-in-one-big-file elyxer.py) if you want to actually follow > the code, it is nicely organized in packages: > http://www.nongnu.org/elyxer/devguide.html > and then run eLyXer directly from the source code: instead of > $ elyxer.py input.lyx output.html > run it as > $ src/principal.py input.lyx output.html > I have added an explanation to the developer guide. > > Thanks, > > Alex. > > From MAILER-DAEMON Tue Dec 15 18:47:09 2009 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1NKh6j-0007dt-4D for mharc-elyxer-users@gnu.org; Tue, 15 Dec 2009 18:47:09 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NKh0t-0000QG-OG for elyxer-users@nongnu.org; Tue, 15 Dec 2009 18:41:07 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NKh0m-0000M8-Kx for elyxer-users@nongnu.org; Tue, 15 Dec 2009 18:41:07 -0500 Received: from [199.232.76.173] (port=54988 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NKh0m-0000M3-D2 for elyxer-users@nongnu.org; Tue, 15 Dec 2009 18:41:00 -0500 Received: from mail-bw0-f212.google.com ([209.85.218.212]:64735) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NKh0j-0004nZ-Da for elyxer-users@nongnu.org; Tue, 15 Dec 2009 18:41:00 -0500 Received: by bwz4 with SMTP id 4so380643bwz.2 for ; Tue, 15 Dec 2009 15:40:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:received:in-reply-to :references:date:x-google-sender-auth:message-id:subject:from:to :content-type; bh=AFrzvRmdnhbbSfw8nrHW8lwPR4M5gM6c3/eKhmk3X8k=; b=Ukhn/Y16OKwm/0boFjNY6CzsJfSesQDQjFn/MEYPWMLUINCZKWATJCuL+y9NIoSkqv p4LBOGdi99Z1EbKv9SXQolWalpLKXf5SZl5xmnTtar1JpkCg+pocw0Sm5Nu9K6TYILg6 AeFTiksmopzsq+jAXQjCGO3hJm4tKkEgfoqKU= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:content-type; b=QaJwXCz9WvmnHMcWm5nRkm0fRKA2d4fAWekOIzSHLGSMPT4syJaelDRI5LCKC4vV0E hF6dMIcdmn4JCJqEIxT3+qQ9A7DUujGHu8Zd0qLbO2jrgDmMgVpHdBb7Z2YkUIlnQr0V +VD0xrBzWIiRkAgbP+mSQVx+dT40jekg4/6qw= MIME-Version: 1.0 Sender: alejandrofer@gmail.com Received: by 10.204.155.81 with SMTP id r17mr119308bkw.98.1260920455391; Tue, 15 Dec 2009 15:40:55 -0800 (PST) In-Reply-To: References: <7F3179F5-A8FA-4ADD-8147-7C5881942723@uoregon.edu> <2110ee000912131446x205e9a5dq362215c52cb17c88@mail.gmail.com> Date: Wed, 16 Dec 2009 00:40:55 +0100 X-Google-Sender-Auth: 23d25cd1e5b5158b Message-ID: <2110ee000912151540g4bad7141se744f646e578f891@mail.gmail.com> Subject: Re: [eLyXer-users] brackets with \left. From: Alex Fernandez To: eLyXer users Content-Type: multipart/mixed; boundary=0015175ce1e0d57a66047acceb9e X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) X-Mailman-Approved-At: Tue, 15 Dec 2009 18:47:07 -0500 X-BeenThere: elyxer-users@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: eLyXer users List-Id: eLyXer users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 15 Dec 2009 23:41:08 -0000 --0015175ce1e0d57a66047acceb9e Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Hi Jens, Thanks for the explanation. On Mon, Dec 14, 2009 at 7:54 AM, Jens N=F6ckel wrote: > The current version of elyxer doesn't seem to have any vertical size > adjustment of brackets to match, say, enclosed fractions in vertical heig= ht. > So the \left. and \right. constructs really serve no purpose here, and on= e > could simply throw them away for now. Good idea. I implemented it, please find attached a prerelease version of elyxer.py. If you use it in place of your version, does it do what you expect it to do? By the way, can I add your name to the list at http://www.nongnu.org/elyxer/ as a tester? I really appreciate the work you people do. Alex. --0015175ce1e0d57a66047acceb9e Content-Type: text/x-python; charset=UTF-8; name="elyxer.py" Content-Disposition: attachment; filename="elyxer.py" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g39bgoti0 IyEgL3Vzci9iaW4vZW52IHB5dGhvbgojIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIyAgIGVMeVhl ciAtLSBjb252ZXJ0IEx5WCBzb3VyY2UgZmlsZXMgdG8gSFRNTCBvdXRwdXQuCiMKIyAgIENvcHly aWdodCAoQykgMjAwOSBBbGV4IEZlcm7DoW5kZXoKIwojICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUg c29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyAgIGl0IHVu ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlz aGVkIGJ5CiMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAz IG9mIHRoZSBMaWNlbnNlLCBvcgojICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv bi4KIwojICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg d2lsbCBiZSB1c2VmdWwsCiMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojICAgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk IGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyAgIGFsb25nIHdpdGgg dGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+ LgoKIyAtLWVuZC0tCiMgQWxleCAyMDA5MDMwOAojIGVMeVhlciBtYWluIHNjcmlwdAojIGh0dHA6 Ly93d3cubm9uZ251Lm9yZy9lbHl4ZXIvCgoKaW1wb3J0IHN5cwppbXBvcnQgb3MucGF0aAoKCgoK aW1wb3J0IG9zLnBhdGgKCgoKaW1wb3J0IHN5cwppbXBvcnQgY29kZWNzCgoKCmltcG9ydCBzeXMK CmNsYXNzIFRyYWNlKG9iamVjdCk6CiAgIkEgdHJhY2luZyBjbGFzcyIKCiAgZGVidWdtb2RlID0g RmFsc2UKICBxdWlldG1vZGUgPSBGYWxzZQogIHNob3dsaW5lc21vZGUgPSBGYWxzZQoKICBwcmVm aXggPSBOb25lCgogIGRlZiBkZWJ1ZyhjbHMsIG1lc3NhZ2UpOgogICAgIlNob3cgYSBkZWJ1ZyBt ZXNzYWdlIgogICAgaWYgbm90IFRyYWNlLmRlYnVnbW9kZSBvciBUcmFjZS5xdWlldG1vZGU6CiAg ICAgIHJldHVybgogICAgVHJhY2Uuc2hvdyhtZXNzYWdlLCBzeXMuc3Rkb3V0KQoKICBkZWYgbWVz c2FnZShjbHMsIG1lc3NhZ2UpOgogICAgIlNob3cgYSB0cmFjZSBtZXNzYWdlIgogICAgaWYgVHJh Y2UucXVpZXRtb2RlOgogICAgICByZXR1cm4KICAgIGlmIFRyYWNlLnByZWZpeCBhbmQgVHJhY2Uu c2hvd2xpbmVzbW9kZToKICAgICAgbWVzc2FnZSA9IFRyYWNlLnByZWZpeCArIG1lc3NhZ2UKICAg IFRyYWNlLnNob3cobWVzc2FnZSwgc3lzLnN0ZG91dCkKCiAgZGVmIGVycm9yKGNscywgbWVzc2Fn ZSk6CiAgICAiU2hvdyBhbiBlcnJvciBtZXNzYWdlIgogICAgaWYgVHJhY2UucHJlZml4IGFuZCBU cmFjZS5zaG93bGluZXNtb2RlOgogICAgICBtZXNzYWdlID0gVHJhY2UucHJlZml4ICsgbWVzc2Fn ZQogICAgVHJhY2Uuc2hvdyhtZXNzYWdlLCBzeXMuc3RkZXJyKQoKICBkZWYgZmF0YWwoY2xzLCBt ZXNzYWdlKToKICAgICJTaG93IGFuIGVycm9yIG1lc3NhZ2UgYW5kIHRlcm1pbmF0ZSIKICAgIFRy YWNlLmVycm9yKCdGQVRBTDogJyArIG1lc3NhZ2UpCiAgICBleGl0KC0xKQoKICBkZWYgc2hvdyhj bHMsIG1lc3NhZ2UsIGNoYW5uZWwpOgogICAgIlNob3cgYSBtZXNzYWdlIG91dCBvZiBhIGNoYW5u ZWwiCiAgICBtZXNzYWdlID0gbWVzc2FnZS5lbmNvZGUoJ3V0Zi04JykKICAgIGNoYW5uZWwud3Jp dGUobWVzc2FnZSArICdcbicpCgogIGRlYnVnID0gY2xhc3NtZXRob2QoZGVidWcpCiAgbWVzc2Fn ZSA9IGNsYXNzbWV0aG9kKG1lc3NhZ2UpCiAgZXJyb3IgPSBjbGFzc21ldGhvZChlcnJvcikKICBm YXRhbCA9IGNsYXNzbWV0aG9kKGZhdGFsKQogIHNob3cgPSBjbGFzc21ldGhvZChzaG93KQoKCgpj bGFzcyBMaW5lUmVhZGVyKG9iamVjdCk6CiAgIlJlYWRzIGEgZmlsZSBsaW5lIGJ5IGxpbmUiCgog IGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSk6CiAgICBpZiBpc2luc3RhbmNlKGZpbGVuYW1l LCBmaWxlKToKICAgICAgc2VsZi5maWxlID0gZmlsZW5hbWUKICAgIGVsc2U6CiAgICAgIHNlbGYu ZmlsZSA9IGNvZGVjcy5vcGVuKGZpbGVuYW1lLCAnclUnLCAidXRmLTgiKQogICAgc2VsZi5saW5l bnVtYmVyID0gMQogICAgc2VsZi5sYXN0bGluZSA9IE5vbmUKICAgIHNlbGYuY3VycmVudCA9IE5v bmUKICAgIHNlbGYubXVzdHJlYWQgPSBUcnVlCiAgICBzZWxmLmRlcGxldGVkID0gRmFsc2UKCiAg ZGVmIHNldHN0YXJ0KHNlbGYsIGZpcnN0bGluZSk6CiAgICAiU2V0IHRoZSBmaXJzdCBsaW5lIHRv IHJlYWQuIgogICAgZm9yIGkgaW4gcmFuZ2UoZmlyc3RsaW5lKToKICAgICAgc2VsZi5maWxlLnJl YWRsaW5lKCkKICAgIHNlbGYubGluZW51bWJlciA9IGZpcnN0bGluZQoKICBkZWYgc2V0ZW5kKHNl bGYsIGxhc3RsaW5lKToKICAgICJTZXQgdGhlIGxhc3QgbGluZSB0byByZWFkLiIKICAgIHNlbGYu bGFzdGxpbmUgPSBsYXN0bGluZQoKICBkZWYgY3VycmVudGxpbmUoc2VsZik6CiAgICAiR2V0IHRo ZSBjdXJyZW50IGxpbmUiCiAgICBpZiBzZWxmLm11c3RyZWFkOgogICAgICBzZWxmLnJlYWRsaW5l KCkKICAgIHJldHVybiBzZWxmLmN1cnJlbnQKCiAgZGVmIG5leHRsaW5lKHNlbGYpOgogICAgIkdv IHRvIG5leHQgbGluZSIKICAgIGlmIHNlbGYuZGVwbGV0ZWQ6CiAgICAgIFRyYWNlLmZhdGFsKCdS ZWFkIGJleW9uZCBmaWxlIGVuZCcpCiAgICBzZWxmLm11c3RyZWFkID0gVHJ1ZQoKICBkZWYgcmVh ZGxpbmUoc2VsZik6CiAgICAiUmVhZCBhIGxpbmUgZnJvbSBmaWxlIgogICAgc2VsZi5jdXJyZW50 ID0gc2VsZi5maWxlLnJlYWRsaW5lKCkKICAgIGlmIHNlbGYuZmlsZSA9PSBzeXMuc3RkaW46CiAg ICAgIHNlbGYuY3VycmVudCA9IHNlbGYuY3VycmVudC5kZWNvZGUoJ3V0Zi04JykKICAgIGlmIGxl bihzZWxmLmN1cnJlbnQpID09IDA6CiAgICAgIHNlbGYuZGVwbGV0ZWQgPSBUcnVlCiAgICBzZWxm LmN1cnJlbnQgPSBzZWxmLmN1cnJlbnQucnN0cmlwKCdcblxyJykKICAgIHNlbGYubGluZW51bWJl ciArPSAxCiAgICBzZWxmLm11c3RyZWFkID0gRmFsc2UKICAgIFRyYWNlLnByZWZpeCA9ICdMaW5l ICcgKyB1bmljb2RlKHNlbGYubGluZW51bWJlcikgKyAnOiAnCiAgICBpZiBzZWxmLmxpbmVudW1i ZXIgJSAxMDAwID09IDA6CiAgICAgIFRyYWNlLm1lc3NhZ2UoJ1BhcnNpbmcnKQoKICBkZWYgZmlu aXNoZWQoc2VsZik6CiAgICAiRmluZCBvdXQgaWYgdGhlIGZpbGUgaXMgZmluaXNoZWQiCiAgICBp ZiBzZWxmLmxhc3RsaW5lIGFuZCBzZWxmLmxpbmVudW1iZXIgPT0gc2VsZi5sYXN0bGluZToKICAg ICAgcmV0dXJuIFRydWUKICAgIGlmIHNlbGYubXVzdHJlYWQ6CiAgICAgIHNlbGYucmVhZGxpbmUo KQogICAgcmV0dXJuIHNlbGYuZGVwbGV0ZWQKCiAgZGVmIGNsb3NlKHNlbGYpOgogICAgc2VsZi5m aWxlLmNsb3NlKCkKCmNsYXNzIExpbmVXcml0ZXIob2JqZWN0KToKICAiV3JpdGVzIGEgZmlsZSBh cyBhIHNlcmllcyBvZiBsaXN0cyIKCiAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lKToKICAg IGlmIGlzaW5zdGFuY2UoZmlsZW5hbWUsIGZpbGUpOgogICAgICBzZWxmLmZpbGUgPSBmaWxlbmFt ZQogICAgICBzZWxmLmZpbGVuYW1lID0gTm9uZQogICAgZWxzZToKICAgICAgc2VsZi5maWxlID0g Y29kZWNzLm9wZW4oZmlsZW5hbWUsICd3JywgInV0Zi04IikKICAgICAgc2VsZi5maWxlbmFtZSA9 IGZpbGVuYW1lCgogIGRlZiB3cml0ZShzZWxmLCBzdHJpbmdzKToKICAgICJXcml0ZSBhIGxpc3Qg b2Ygc3RyaW5ncyIKICAgIGZvciBzdHJpbmcgaW4gc3RyaW5nczoKICAgICAgaWYgbm90IGlzaW5z dGFuY2Uoc3RyaW5nLCBiYXNlc3RyaW5nKToKICAgICAgICBUcmFjZS5lcnJvcignTm90IGEgc3Ry aW5nOiAnICsgdW5pY29kZShzdHJpbmcpICsgJyBpbiAnICsgdW5pY29kZShzdHJpbmdzKSkKICAg ICAgICByZXR1cm4KICAgICAgc2VsZi53cml0ZXN0cmluZyhzdHJpbmcpCgogIGRlZiB3cml0ZXN0 cmluZyhzZWxmLCBzdHJpbmcpOgogICAgIldyaXRlIGEgc3RyaW5nIgogICAgaWYgc2VsZi5maWxl ID09IHN5cy5zdGRvdXQ6CiAgICAgIHN0cmluZyA9IHN0cmluZy5lbmNvZGUoJ3V0Zi04JykKICAg IHNlbGYuZmlsZS53cml0ZShzdHJpbmcpCgogIGRlZiB3cml0ZWxpbmUoc2VsZiwgbGluZSk6CiAg ICAiV3JpdGUgYSBsaW5lIHRvIGZpbGUiCiAgICBzZWxmLndyaXRlc3RyaW5nKGxpbmUgKyAnXG4n KQoKICBkZWYgY2xvc2Uoc2VsZik6CiAgICBzZWxmLmZpbGUuY2xvc2UoKQoKCgoKaW1wb3J0IGNv ZGVjcwppbXBvcnQgb3MucGF0aAoKCgppbXBvcnQgY29kZWNzCgoKY2xhc3MgQmliU3R5bGVzQ29u ZmlnKG9iamVjdCk6CiAgIkNvbmZpZ3VyYXRpb24gY2xhc3MgZnJvbSBjb25maWcgZmlsZSIKCiAg YXV0aG9yZGF0ZTIgPSB7CiAgICAgIAogICAgICB1J0BhcnRpY2xlJzp1JyRhdXRob3IuICR5ZWFy LiAkdGl0bGUuIDxpPiRqb3VybmFsPC9pPiwgPGI+JHZvbHVtZTwvYj4oJG51bWJlciksICRwYWdl cy4nLCAKICAgICAgdSdAYm9vayc6dSckYXV0aG9yLiAkeWVhci4gPGk+JHRpdGxlPC9pPi4gJHB1 Ymxpc2hlci4nLCAKICAgICAgdSdkZWZhdWx0Jzp1JyRhdXRob3IuICR5ZWFyLiA8aT4kdGl0bGU8 L2k+LiAkcHVibGlzaGVyLicsIAogICAgICB9CgogIGRlZmF1bHQgPSB7CiAgICAgIHUnQGFydGlj bGUnOnUnJGF1dGhvciwg4oCcJHRpdGxl4oCdLCA8aT4kam91cm5hbDwvaT4sIHBwLiAkcGFnZXMs ICR5ZWFyLicsIAogICAgICB1J0Bib29rJzp1JyRhdXRob3IsIDxpPiR0aXRsZTwvaT4uICRwdWJs aXNoZXIsICR5ZWFyLicsIAogICAgICB1J0Bib29rbGV0Jzp1JyRhdXRob3IsIDxpPiR0aXRsZTwv aT4uICRwdWJsaXNoZXIsICR5ZWFyLicsIAogICAgICB1J0Bjb25mZXJlbmNlJzp1JyRhdXRob3Is IOKAnCR0aXRsZeKAnSwgPGk+JGpvdXJuYWw8L2k+LCBwcC4gJHBhZ2VzLCAkeWVhci4nLCAKICAg ICAgdSdAaW5ib29rJzp1JyRhdXRob3IsIDxpPiR0aXRsZTwvaT4uICRwdWJsaXNoZXIsICR5ZWFy LicsIAogICAgICB1J0BpbmNvbGxlY3Rpb24nOnUnJGF1dGhvciwgPGk+JHRpdGxlPC9pPi4gJHB1 Ymxpc2hlciwgJHllYXIuJywgCiAgICAgIHUnQGlucHJvY2VlZGluZ3MnOnUnJGF1dGhvciwg4oCc JHRpdGxl4oCdLCA8aT4kam91cm5hbDwvaT4sIHBwLiAkcGFnZXMsICR5ZWFyLicsIAogICAgICB1 J0BtYW51YWwnOnUnJGF1dGhvciwgPGk+JHRpdGxlPC9pPi4gJHB1Ymxpc2hlciwgJHllYXIuJywg CiAgICAgIHUnQG1hc3RlcnN0aGVzaXMnOnUnJGF1dGhvciwgPGk+JHRpdGxlPC9pPi4gJHB1Ymxp c2hlciwgJHllYXIuJywgCiAgICAgIHUnQG1pc2MnOnUnJGF1dGhvciwgPGk+JHRpdGxlPC9pPi4g JHB1Ymxpc2hlciwgJHllYXIuJywgCiAgICAgIHUnQHBoZHRoZXNpcyc6dSckYXV0aG9yLCA8aT4k dGl0bGU8L2k+LiAkcHVibGlzaGVyLCAkeWVhci4nLCAKICAgICAgdSdAcHJvY2VlZGluZ3MnOnUn JGF1dGhvciwg4oCcJHRpdGxl4oCdLCA8aT4kam91cm5hbDwvaT4sIHBwLiAkcGFnZXMsICR5ZWFy LicsIAogICAgICB1J0B0ZWNocmVwb3J0Jzp1JyRhdXRob3IsIDxpPiR0aXRsZTwvaT4sICR5ZWFy LicsIAogICAgICB1J0B1bnB1Ymxpc2hlZCc6dSckYXV0aG9yLCDigJwkdGl0bGXigJ0sIDxpPiRq b3VybmFsPC9pPiwgJHllYXIuJywgCiAgICAgIHUnZGVmYXVsdCc6dSckYXV0aG9yLCA8aT4kdGl0 bGU8L2k+LiAkcHVibGlzaGVyLCAkeWVhci4nLCAKICAgICAgfQoKICBpZWVldHIgPSB7CiAgICAg IAogICAgICB1J0BhcnRpY2xlJzp1JyRhdXRob3IsIOKAnCR0aXRsZeKAnSwgPGk+JGpvdXJuYWw8 L2k+LCB2b2wuICR2b2x1bWUsIG5vLiAkbnVtYmVyLCBwcC4gJHBhZ2VzLCAkeWVhci4nLCAKICAg ICAgdSdAYm9vayc6dSckYXV0aG9yLCA8aT4kdGl0bGU8L2k+LiAkcHVibGlzaGVyLCAkeWVhci4n LCAKICAgICAgfQoKICBwbGFpbiA9IHsKICAgICAgCiAgICAgIHUnQGFydGljbGUnOnUnJGF1dGhv ci4gJHRpdGxlLiA8aT4kam91cm5hbDwvaT4sICR2b2x1bWVuKCRudW1iZXIpOiRwYWdlcywgJHll YXIuJywgCiAgICAgIHUnQGJvb2snOnUnJGF1dGhvci4gPGk+JHRpdGxlPC9pPi4gJHB1Ymxpc2hl ciwgJG1vbnRoICR5ZWFyLicsIAogICAgICB1J2RlZmF1bHQnOnUnJGF1dGhvci4gPGk+JHRpdGxl PC9pPi4gJHB1Ymxpc2hlciwgJHllYXIuJywgCiAgICAgIH0KCmNsYXNzIENvbnRhaW5lckNvbmZp ZyhvYmplY3QpOgogICJDb25maWd1cmF0aW9uIGNsYXNzIGZyb20gY29uZmlnIGZpbGUiCgogIGVu ZGluZ3MgPSB7CiAgICAgIHUnQWxpZ24nOnUnXFxlbmRfbGF5b3V0JywgdSdCYXJyZWRUZXh0Jzp1 J1xcYmFyJywgCiAgICAgIHUnQm9sZFRleHQnOnUnXFxzZXJpZXMnLCB1J0NlbGwnOnUnPC9jZWxs JywgdSdDb2xvclRleHQnOnUnXFxjb2xvcicsIAogICAgICB1J0VtcGhhdGljVGV4dCc6dSdcXGVt cGgnLCB1J0hmaWxsJzp1J1xcaGZpbGwnLCB1J0luc2V0Jzp1J1xcZW5kX2luc2V0JywgCiAgICAg IHUnTGF5b3V0Jzp1J1xcZW5kX2xheW91dCcsIHUnTHlYRm9vdGVyJzp1J1xcZW5kX2RvY3VtZW50 JywgCiAgICAgIHUnTHlYSGVhZGVyJzp1J1xcZW5kX2hlYWRlcicsIHUnUm93Jzp1Jzwvcm93Jywg dSdTaGFwZWRUZXh0Jzp1J1xcc2hhcGUnLCAKICAgICAgdSdTaXplVGV4dCc6dSdcXHNpemUnLCB1 J1RleHRGYW1pbHknOnUnXFxmYW1pbHknLCAKICAgICAgdSdWZXJzYWxpdGFzVGV4dCc6dSdcXG5v dW4nLCAKICAgICAgfQoKICBzdGFydGVuZGluZ3MgPSB7CiAgICAgIHUnXFxiZWdpbl9kZWVwZXIn OnUnXFxlbmRfZGVlcGVyJywgdSdcXGJlZ2luX2luc2V0Jzp1J1xcZW5kX2luc2V0JywgCiAgICAg IHUnXFxiZWdpbl9sYXlvdXQnOnUnXFxlbmRfbGF5b3V0JywgCiAgICAgIH0KCiAgc3RhcnRzID0g ewogICAgICB1Jyc6dSdTdHJpbmdDb250YWluZXInLCB1JyNMeVgnOnUnQmxhY2tCb3gnLCB1Jzwv bHl4dGFidWxhcic6dSdCbGFja0JveCcsIAogICAgICB1JzxjZWxsJzp1J0NlbGwnLCB1Jzxjb2x1 bW4nOnUnQ29sdW1uJywgdSc8cm93Jzp1J1JvdycsIAogICAgICB1J1xcYWxpZ24nOnUnQWxpZ24n LCB1J1xcYmFyJzp1J0JhcnJlZFRleHQnLCAKICAgICAgdSdcXGJhciBkZWZhdWx0Jzp1J0JsYWNr Qm94JywgdSdcXGJhciBubyc6dSdCbGFja0JveCcsIAogICAgICB1J1xcYmVnaW5fYm9keSc6dSdC bGFja0JveCcsIHUnXFxiZWdpbl9kZWVwZXInOnUnRGVlcGVyTGlzdCcsIAogICAgICB1J1xcYmVn aW5fZG9jdW1lbnQnOnUnQmxhY2tCb3gnLCB1J1xcYmVnaW5faGVhZGVyJzp1J0x5WEhlYWRlcics IAogICAgICB1J1xcYmVnaW5faW5zZXQnOnUnSW5zZXQnLCB1J1xcYmVnaW5faW5zZXQgQm94Jzp1 J0JveEluc2V0JywgCiAgICAgIHUnXFxiZWdpbl9pbnNldCBCcmFuY2gnOnUnQnJhbmNoJywgdSdc XGJlZ2luX2luc2V0IENhcHRpb24nOnUnQ2FwdGlvbicsIAogICAgICB1J1xcYmVnaW5faW5zZXQg Q29tbWFuZEluc2V0IGJpYml0ZW0nOnUnQmlibGlvRW50cnknLCAKICAgICAgdSdcXGJlZ2luX2lu c2V0IENvbW1hbmRJbnNldCBiaWJ0ZXgnOnUnQmliVGVYJywgCiAgICAgIHUnXFxiZWdpbl9pbnNl dCBDb21tYW5kSW5zZXQgY2l0YXRpb24nOnUnQmlibGlvQ2l0ZScsIAogICAgICB1J1xcYmVnaW5f aW5zZXQgQ29tbWFuZEluc2V0IGhyZWYnOnUnVVJMJywgCiAgICAgIHUnXFxiZWdpbl9pbnNldCBD b21tYW5kSW5zZXQgaW5jbHVkZSc6dSdJbmNsdWRlSW5zZXQnLCAKICAgICAgdSdcXGJlZ2luX2lu c2V0IENvbW1hbmRJbnNldCBpbmRleF9wcmludCc6dSdQcmludEluZGV4JywgCiAgICAgIHUnXFxi ZWdpbl9pbnNldCBDb21tYW5kSW5zZXQgbGFiZWwnOnUnTGFiZWwnLCAKICAgICAgdSdcXGJlZ2lu X2luc2V0IENvbW1hbmRJbnNldCBub21lbmNsX3ByaW50Jzp1J1ByaW50Tm9tZW5jbGF0dXJlJywg CiAgICAgIHUnXFxiZWdpbl9pbnNldCBDb21tYW5kSW5zZXQgbm9tZW5jbGF0dXJlJzp1J05vbWVu Y2xhdHVyZUVudHJ5JywgCiAgICAgIHUnXFxiZWdpbl9pbnNldCBDb21tYW5kSW5zZXQgcmVmJzp1 J1JlZmVyZW5jZScsIAogICAgICB1J1xcYmVnaW5faW5zZXQgQ29tbWFuZEluc2V0IHRvYyc6dSdU YWJsZU9mQ29udGVudHMnLCAKICAgICAgdSdcXGJlZ2luX2luc2V0IEVSVCc6dSdFUlQnLCAKICAg ICAgdSdcXGJlZ2luX2luc2V0IEZsZXggQ2hhclN0eWxlOkNvZGUnOnUnRmxleENvZGUnLCAKICAg ICAgdSdcXGJlZ2luX2luc2V0IEZsZXggVVJMJzp1J0ZsZXhVUkwnLCB1J1xcYmVnaW5faW5zZXQg RmxvYXQnOnUnRmxvYXQnLCAKICAgICAgdSdcXGJlZ2luX2luc2V0IEZsb2F0TGlzdCc6dSdMaXN0 T2YnLCB1J1xcYmVnaW5faW5zZXQgRm9vdCc6dSdGb290bm90ZScsIAogICAgICB1J1xcYmVnaW5f aW5zZXQgRm9ybXVsYSc6dSdGb3JtdWxhJywgdSdcXGJlZ2luX2luc2V0IEdyYXBoaWNzJzp1J0lt YWdlJywgCiAgICAgIHUnXFxiZWdpbl9pbnNldCBJbmRleCc6dSdJbmRleEVudHJ5JywgdSdcXGJl Z2luX2luc2V0IEluZm8nOnUnSW5mb0luc2V0JywgCiAgICAgIHUnXFxiZWdpbl9pbnNldCBMYXRl eENvbW1hbmQgYmliaXRlbSc6dSdCaWJsaW9FbnRyeScsIAogICAgICB1J1xcYmVnaW5faW5zZXQg TGF0ZXhDb21tYW5kIGJpYnRleCc6dSdCaWJUZVgnLCAKICAgICAgdSdcXGJlZ2luX2luc2V0IExh dGV4Q29tbWFuZCBjaXRlJzp1J0JpYmxpb0NpdGUnLCAKICAgICAgdSdcXGJlZ2luX2luc2V0IExh dGV4Q29tbWFuZCBjaXRlYWx0Jzp1J0JpYmxpb0NpdGUnLCAKICAgICAgdSdcXGJlZ2luX2luc2V0 IExhdGV4Q29tbWFuZCBjaXRlcCc6dSdCaWJsaW9DaXRlJywgCiAgICAgIHUnXFxiZWdpbl9pbnNl dCBMYXRleENvbW1hbmQgY2l0ZXQnOnUnQmlibGlvQ2l0ZScsIAogICAgICB1J1xcYmVnaW5faW5z ZXQgTGF0ZXhDb21tYW5kIGh0bWx1cmwnOnUnVVJMJywgCiAgICAgIHUnXFxiZWdpbl9pbnNldCBM YXRleENvbW1hbmQgaW5kZXgnOnUnSW5kZXhFbnRyeScsIAogICAgICB1J1xcYmVnaW5faW5zZXQg TGF0ZXhDb21tYW5kIGxhYmVsJzp1J0xhYmVsJywgCiAgICAgIHUnXFxiZWdpbl9pbnNldCBMYXRl eENvbW1hbmQgbm9tZW5jbGF0dXJlJzp1J05vbWVuY2xhdHVyZUVudHJ5JywgCiAgICAgIHUnXFxi ZWdpbl9pbnNldCBMYXRleENvbW1hbmQgcHJldHR5cmVmJzp1J1JlZmVyZW5jZScsIAogICAgICB1 J1xcYmVnaW5faW5zZXQgTGF0ZXhDb21tYW5kIHByaW50aW5kZXgnOnUnUHJpbnRJbmRleCcsIAog ICAgICB1J1xcYmVnaW5faW5zZXQgTGF0ZXhDb21tYW5kIHByaW50bm9tZW5jbGF0dXJlJzp1J1By aW50Tm9tZW5jbGF0dXJlJywgCiAgICAgIHUnXFxiZWdpbl9pbnNldCBMYXRleENvbW1hbmQgcmVm Jzp1J1JlZmVyZW5jZScsIAogICAgICB1J1xcYmVnaW5faW5zZXQgTGF0ZXhDb21tYW5kIHRhYmxl b2Zjb250ZW50cyc6dSdUYWJsZU9mQ29udGVudHMnLCAKICAgICAgdSdcXGJlZ2luX2luc2V0IExh dGV4Q29tbWFuZCB1cmwnOnUnVVJMJywgCiAgICAgIHUnXFxiZWdpbl9pbnNldCBMYXRleENvbW1h bmQgdnJlZic6dSdSZWZlcmVuY2UnLCAKICAgICAgdSdcXGJlZ2luX2luc2V0IE1hcmdpbmFsJzp1 J0Zvb3Rub3RlJywgCiAgICAgIHUnXFxiZWdpbl9pbnNldCBOZXdsaW5lJzp1J05ld2xpbmVJbnNl dCcsIHUnXFxiZWdpbl9pbnNldCBOb3RlJzp1J05vdGUnLCAKICAgICAgdSdcXGJlZ2luX2luc2V0 IE9wdEFyZyc6dSdTaG9ydFRpdGxlJywgCiAgICAgIHUnXFxiZWdpbl9pbnNldCBRdW90ZXMnOnUn UXVvdGVDb250YWluZXInLCAKICAgICAgdSdcXGJlZ2luX2luc2V0IFRhYnVsYXInOnUnVGFibGUn LCB1J1xcYmVnaW5faW5zZXQgVGV4dCc6dSdJbnNldFRleHQnLCAKICAgICAgdSdcXGJlZ2luX2lu c2V0IFdyYXAnOnUnV3JhcCcsIHUnXFxiZWdpbl9pbnNldCBsaXN0aW5ncyc6dSdMaXN0aW5nJywg CiAgICAgIHUnXFxiZWdpbl9pbnNldCBzcGFjZSc6dSdTcGFjZScsIHUnXFxiZWdpbl9sYXlvdXQn OnUnTGF5b3V0JywgCiAgICAgIHUnXFxiZWdpbl9sYXlvdXQgQWJzdHJhY3QnOnUnQWJzdHJhY3Qn LCAKICAgICAgdSdcXGJlZ2luX2xheW91dCBBdXRob3InOnUnQXV0aG9yJywgCiAgICAgIHUnXFxi ZWdpbl9sYXlvdXQgQmlibGlvZ3JhcGh5Jzp1J0JpYmxpb2dyYXBoeScsIAogICAgICB1J1xcYmVn aW5fbGF5b3V0IERlc2NyaXB0aW9uJzp1J0Rlc2NyaXB0aW9uJywgCiAgICAgIHUnXFxiZWdpbl9s YXlvdXQgRW51bWVyYXRlJzp1J0xpc3RJdGVtJywgCiAgICAgIHUnXFxiZWdpbl9sYXlvdXQgSXRl bWl6ZSc6dSdMaXN0SXRlbScsIHUnXFxiZWdpbl9sYXlvdXQgTGlzdCc6dSdMaXN0JywgCiAgICAg IHUnXFxiZWdpbl9sYXlvdXQgUGxhaW4nOnUnUGxhaW5MYXlvdXQnLCAKICAgICAgdSdcXGJlZ2lu X2xheW91dCBTdGFuZGFyZCc6dSdTdGFuZGFyZExheW91dCcsIAogICAgICB1J1xcYmVnaW5fbGF5 b3V0IFRpdGxlJzp1J1RpdGxlJywgdSdcXGNvbG9yJzp1J0NvbG9yVGV4dCcsIAogICAgICB1J1xc Y29sb3IgaW5oZXJpdCc6dSdCbGFja0JveCcsIHUnXFxjb2xvciBub25lJzp1J0JsYWNrQm94Jywg CiAgICAgIHUnXFxlbXBoIGRlZmF1bHQnOnUnQmxhY2tCb3gnLCB1J1xcZW1waCBvZmYnOnUnQmxh Y2tCb3gnLCAKICAgICAgdSdcXGVtcGggb24nOnUnRW1waGF0aWNUZXh0JywgdSdcXGVuZF9ib2R5 Jzp1J0x5WEZvb3RlcicsIAogICAgICB1J1xcZmFtaWx5Jzp1J1RleHRGYW1pbHknLCB1J1xcZmFt aWx5IGRlZmF1bHQnOnUnQmxhY2tCb3gnLCAKICAgICAgdSdcXGZhbWlseSByb21hbic6dSdCbGFj a0JveCcsIHUnXFxoZmlsbCc6dSdIZmlsbCcsIAogICAgICB1J1xcbGFiZWx3aWR0aHN0cmluZyc6 dSdCbGFja0JveCcsIHUnXFxsYW5nJzp1J0xhbmdMaW5lJywgCiAgICAgIHUnXFxsZW5ndGgnOnUn QmxhY2tCb3gnLCB1J1xcbHl4Zm9ybWF0Jzp1J0x5WEZvcm1hdCcsIAogICAgICB1J1xcbHl4bGlu ZSc6dSdMeVhMaW5lJywgdSdcXG5ld2xpbmUnOnUnTmV3bGluZScsIAogICAgICB1J1xcbmV3cGFn ZSc6dSdOZXdQYWdlJywgdSdcXG5vaW5kZW50Jzp1J0JsYWNrQm94JywgCiAgICAgIHUnXFxub3Vu IGRlZmF1bHQnOnUnQmxhY2tCb3gnLCB1J1xcbm91biBvZmYnOnUnQmxhY2tCb3gnLCAKICAgICAg dSdcXG5vdW4gb24nOnUnVmVyc2FsaXRhc1RleHQnLCB1J1xccGFyYWdyYXBoX3NwYWNpbmcnOnUn QmxhY2tCb3gnLCAKICAgICAgdSdcXHNlcmllcyBib2xkJzp1J0JvbGRUZXh0JywgdSdcXHNlcmll cyBkZWZhdWx0Jzp1J0JsYWNrQm94JywgCiAgICAgIHUnXFxzZXJpZXMgbWVkaXVtJzp1J0JsYWNr Qm94JywgdSdcXHNoYXBlJzp1J1NoYXBlZFRleHQnLCAKICAgICAgdSdcXHNoYXBlIGRlZmF1bHQn OnUnQmxhY2tCb3gnLCB1J1xcc2hhcGUgdXAnOnUnQmxhY2tCb3gnLCAKICAgICAgdSdcXHNpemUn OnUnU2l6ZVRleHQnLCB1J1xcc2l6ZSBub3JtYWwnOnUnQmxhY2tCb3gnLCAKICAgICAgdSdcXHN0 YXJ0X29mX2FwcGVuZGl4Jzp1J0FwcGVuZGl4JywgCiAgICAgIH0KCiAgc3RyaW5nID0gewogICAg ICB1J3N0YXJ0Y29tbWFuZCc6dSdcXCcsIAogICAgICB9CgogIHRhYmxlID0gewogICAgICB1J2hl YWRlcnMnOlt1JzxseXh0YWJ1bGFyJyx1JzxmZWF0dXJlcycsXSwgCiAgICAgIH0KCmNsYXNzIEVz Y2FwZUNvbmZpZyhvYmplY3QpOgogICJDb25maWd1cmF0aW9uIGNsYXNzIGZyb20gY29uZmlnIGZp bGUiCgogIGNoYXJzID0gewogICAgICB1J1xuJzp1JycsIHUnIC0tICc6dScg4oCUICcsIHUnXCcn OnUn4oCZJywgdSdgJzp1J+KAmCcsIAogICAgICB9CgogIGNvbW1hbmRzID0gewogICAgICB1J1xc SW5zZXRTcGFjZSBcXHNwYWNle30nOnUnJm5ic3A7JywgdSdcXEluc2V0U3BhY2UgXFx0aGluc3Bh Y2V7fSc6dSfigIknLCAKICAgICAgdSdcXEluc2V0U3BhY2Ugfic6dScmbmJzcDsnLCB1J1xcU3Bl Y2lhbENoYXIgXFwtJzp1JycsIAogICAgICB1J1xcU3BlY2lhbENoYXIgXFxALic6dScuJywgdSdc XFNwZWNpYWxDaGFyIFxcbGRvdHN7fSc6dSfigKYnLCAKICAgICAgdSdcXFNwZWNpYWxDaGFyIFxc bWVudXNlcGFyYXRvcic6dScmbmJzcDvilrcmbmJzcDsnLCAKICAgICAgdSdcXFNwZWNpYWxDaGFy IFxcbm9icmVha2Rhc2gtJzp1Jy0nLCB1J1xcU3BlY2lhbENoYXIgXFxzbGFzaHt9Jzp1Jy8nLCAK ICAgICAgdSdcXFNwZWNpYWxDaGFyIFxcdGV4dGNvbXB3b3JkbWFya3t9Jzp1JycsIHUnXFxiYWNr c2xhc2gnOnUnXFwnLCAKICAgICAgfQoKICBlbnRpdGllcyA9IHsKICAgICAgdScmJzp1JyZhbXA7 JywgdSc8Jzp1JyZsdDsnLCB1Jz4nOnUnJmd0OycsIAogICAgICB9CgogIGh0bWwgPSB7CiAgICAg IHUnLz4nOnUnPicsIAogICAgICB9CgogIG5vbnVuaWNvZGUgPSB7CiAgICAgIHUn4oGfJzp1J+KA hScsIAogICAgICB9CgpjbGFzcyBGaWxlQ29uZmlnKG9iamVjdCk6CiAgIkNvbmZpZ3VyYXRpb24g Y2xhc3MgZnJvbSBjb25maWcgZmlsZSIKCiAgcGFyc2luZyA9IHsKICAgICAgdSdlbmNvZGluZ3Mn Olt1J3V0Zi04Jyx1J0NwMTI1MicsXSwgCiAgICAgIH0KCmNsYXNzIEZvb3Rub3RlQ29uZmlnKG9i amVjdCk6CiAgIkNvbmZpZ3VyYXRpb24gY2xhc3MgZnJvbSBjb25maWcgZmlsZSIKCiAgY29uc3Rh bnRzID0gewogICAgICB1J3Bvc3Rmcm9tJzp1J10gJywgdSdwb3N0dG8nOnUn4oaSXSAnLCB1J3By ZWZyb20nOnUnW+KGkicsIHUncHJldG8nOnUnIFsnLCAKICAgICAgfQoKY2xhc3MgRm9ybXVsYUNv bmZpZyhvYmplY3QpOgogICJDb25maWd1cmF0aW9uIGNsYXNzIGZyb20gY29uZmlnIGZpbGUiCgog IGFscGhhY29tbWFuZHMgPSB7CiAgICAgIHUnXFxBQSc6dSfDhScsIHUnXFxBRSc6dSfDhicsIHUn XFxEZWx0YSc6dSfOlCcsIHUnXFxHYW1tYSc6dSfOkycsIAogICAgICB1J1xcTCc6dSfFgScsIHUn XFxMYW1iZGEnOnUnzpsnLCB1J1xcTyc6dSfDmCcsIHUnXFxPRSc6dSfFkicsIAogICAgICB1J1xc T21lZ2EnOnUnzqknLCB1J1xcUGhpJzp1J86mJywgdSdcXFBpJzp1J86gJywgdSdcXFBzaSc6dSfO qCcsIAogICAgICB1J1xcU2lnbWEnOnUnzqMnLCB1J1xcVGhldGEnOnUnzpgnLCB1J1xcVXBzaWxv bic6dSfOpScsIHUnXFxYaSc6dSfOnicsIAogICAgICB1J1xcYWEnOnUnw6UnLCB1J1xcYWUnOnUn w6YnLCB1J1xcYWxwaGEnOnUnzrEnLCB1J1xcYmV0YSc6dSfOsicsIAogICAgICB1J1xcZGVsdGEn OnUnzrQnLCB1J1xcZXBzaWxvbic6dSfPtScsIHUnXFxldGEnOnUnzrcnLCB1J1xcZ2FtbWEnOnUn zrMnLCAKICAgICAgdSdcXGlvdGEnOnUnzrknLCB1J1xca2FwcGEnOnUnzronLCB1J1xcbCc6dSfF gicsIHUnXFxsYW1iZGEnOnUnzrsnLCAKICAgICAgdSdcXG11Jzp1J868JywgdSdcXG51Jzp1J869 JywgdSdcXG8nOnUnw7gnLCB1J1xcb2UnOnUnxZMnLCB1J1xcb21lZ2EnOnUnz4knLCAKICAgICAg dSdcXHBoaSc6dSfPhicsIHUnXFxwaSc6dSfPgCcsIHUnXFxwc2knOnUnz4gnLCB1J1xccmhvJzp1 J8+BJywgCiAgICAgIHUnXFxzaWdtYSc6dSfPgycsIHUnXFxzcyc6dSfDnycsIHUnXFx0YXUnOnUn z4QnLCB1J1xcdGhldGEnOnUnzrgnLCAKICAgICAgdSdcXHVwc2lsb24nOnUnz4UnLCB1J1xcdmFy ZXBzaWxvbic6dSfOtScsIHUnXFx2YXJrYXBwYSc6dSfPsCcsIAogICAgICB1J1xcdmFycGhpJzp1 J8+GJywgdSdcXHZhcnBpJzp1J8+WJywgdSdcXHZhcnJobyc6dSfPsScsIHUnXFx2YXJzaWdtYSc6 dSfPgicsIAogICAgICB1J1xcdmFydGhldGEnOnUnz5EnLCB1J1xceGknOnUnzr4nLCB1J1xcemV0 YSc6dSfOticsIAogICAgICB9CgogIGFycmF5ID0gewogICAgICB1J2JlZ2luJzp1J1xcYmVnaW4n LCB1J2NlbGxzZXBhcmF0b3InOnUnJicsIHUnZW5kJzp1J1xcZW5kJywgCiAgICAgIHUncm93c2Vw YXJhdG9yJzp1J1xcXFwnLCAKICAgICAgfQoKICBjb21tYW5kcyA9IHsKICAgICAgdSdcXCEnOnUn JywgdSdcXCQnOnUnJCcsIHUnXFwlJzp1JyUnLCB1J1xcLCc6dScgJywgdSdcXDonOnUn4oGfJywg CiAgICAgIHUnXFw7Jzp1J+KAhCcsIHUnXFxCb3gnOnUn4pahJywgdSdcXENJUkNMRSc6dSfil48n LCB1J1xcQ2hlY2tlZEJveCc6dSfimJEnLCAKICAgICAgdSdcXENpcmNsZSc6dSfil4snLCB1J1xc RGlhbW9uZCc6dSfil4cnLCB1J1xcRG93bmFycm93Jzp1J+KHkycsIHUnXFxJbSc6dSfihJEnLCAK ICAgICAgdSdcXEpvaW4nOnUn4qidJywgdSdcXExFRlRDSVJDTEUnOnUn4peWJywgdSdcXExFRlRj aXJjbGUnOnUn4peQJywgCiAgICAgIHUnXFxMZWZ0YXJyb3cnOnUn4oeQJywgdSdcXExlZnRyaWdo dGFycm93Jzp1J+KBn+KHlOKBnycsIHUnXFxMb25nbGVmdGFycm93Jzp1J+KfuCcsIAogICAgICB1 J1xcTG9uZ2xlZnRyaWdodGFycm93Jzp1J+KfuicsIHUnXFxMb25ncmlnaHRhcnJvdyc6dSfin7kn LCB1J1xcUCc6dSfCticsIAogICAgICB1J1xcUHInOnUnUHInLCB1J1xcUklHSFRDSVJDTEUnOnUn 4peXJywgdSdcXFJJR0hUY2lyY2xlJzp1J+KXkScsIAogICAgICB1J1xcUmUnOnUn4oScJywgdSdc XFJpZ2h0YXJyb3cnOnUn4oGf4oeS4oGfJywgdSdcXFMnOnUnwqcnLCB1J1xcU3F1YXJlJzp1J+KY kCcsIAogICAgICB1J1xcVXBhcnJvdyc6dSfih5EnLCB1J1xcVXBkb3duYXJyb3cnOnUn4oeVJywg dSdcXFZlcnQnOnUn4oilJywgdSdcXFhCb3gnOnUn4piSJywgCiAgICAgIHUnXFxcXCc6dSc8YnIv PicsIHUnXFxfJzp1J18nLCB1J1xcYWxlcGgnOnUn4oS1JywgdSdcXGFtYWxnJzp1J+KIkCcsIAog ICAgICB1J1xcYW5nbGUnOnUn4oigJywgdSdcXGFwcHJveCc6dSfigZ/iiYjigZ8nLCB1J1xcYXF1 YXJpdXMnOnUn4pmSJywgCiAgICAgIHUnXFxhcmNjb3MnOnUnYXJjY29zJywgdSdcXGFyY3Npbic6 dSdhcmNzaW4nLCB1J1xcYXJjdGFuJzp1J2FyY3RhbicsIAogICAgICB1J1xcYXJnJzp1J2FyZycs IHUnXFxhcmllcyc6dSfimYgnLCB1J1xcYXN0Jzp1J+KIlycsIHUnXFxhc3ltcCc6dSfiiY0nLCAK ICAgICAgdSdcXGJhY2twcmltZSc6dSfigLUnLCB1J1xcYmFja3NsYXNoJzp1J1xcJywgdSdcXGJl dGgnOnUn4oS2JywgCiAgICAgIHUnXFxiaWdjYXAnOnUn4oipJywgdSdcXGJpZ2NpcmMnOnUn4peL JywgdSdcXGJpZ2N1cCc6dSfiiKonLCB1J1xcYmlnb2RvdCc6dSfiipknLCAKICAgICAgdSdcXGJp Z29wbHVzJzp1J+KKlScsIHUnXFxiaWdvdGltZXMnOnUn4oqXJywgdSdcXGJpZ3NxY3VwJzp1J+KK lCcsIAogICAgICB1J1xcYmlnc3Rhcic6dSfimIUnLCB1J1xcYmlndHJpYW5nbGVkb3duJzp1J+KW vScsIHUnXFxiaWd0cmlhbmdsZXVwJzp1J+KWsycsIAogICAgICB1J1xcYmlndXBsdXMnOnUn4oqO JywgdSdcXGJpZ3ZlZSc6dSfiiKgnLCB1J1xcYmlnd2VkZ2UnOnUn4oinJywgCiAgICAgIHUnXFxi bGFja2xvemVuZ2UnOnUn4qerJywgdSdcXGJsYWNrc21pbGV5Jzp1J+KYuycsIHUnXFxibGFja3Ry aWFuZ2xlJzp1J+KWsicsIAogICAgICB1J1xcYmxhY2t0cmlhbmdsZWRvd24nOnUn4pa8JywgdSdc XGJsYWNrdHJpYW5nbGVyaWdodCc6dSfilrYnLCB1J1xcYm90Jzp1J+KKpScsIAogICAgICB1J1xc Ym93dGllJzp1J+KLiCcsIHUnXFxib3gnOnUn4parJywgdSdcXGJ1bGxldCc6dSfigKInLCB1J1xc Y2FuY2VyJzp1J+KZiycsIAogICAgICB1J1xcY2FwJzp1J+KIqScsIHUnXFxjYXByaWNvcm51cyc6 dSfimZEnLCB1J1xcY2RvdCc6dSfii4UnLCB1J1xcY2RvdHMnOnUn4ouvJywgCiAgICAgIHUnXFxj ZW50ZXJkb3QnOnUn4oiZJywgdSdcXGNoZWNrbWFyayc6dSfinJMnLCB1J1xcY2hpJzp1J8+HJywg dSdcXGNpcmMnOnUn4peLJywgCiAgICAgIHUnXFxjaXJjZXEnOnUn4omXJywgdSdcXGNpcmNsZWRS Jzp1J8KuJywgdSdcXGNsdWJzdWl0Jzp1J+KZoycsIAogICAgICB1J1xcY29tcGxlbWVudCc6dSfi iIEnLCB1J1xcY29uZyc6dSfiiYUnLCB1J1xcY29wcm9kJzp1J+KIkCcsIAogICAgICB1J1xcY29w eXJpZ2h0Jzp1J8KpJywgdSdcXGNvcyc6dSdjb3MnLCB1J1xcY29zaCc6dSdjb3NoJywgdSdcXGNv dCc6dSdjb3QnLCAKICAgICAgdSdcXGNvdGgnOnUnY290aCcsIHUnXFxjc2MnOnUnY3NjJywgdSdc XGN1cCc6dSfiiKonLCB1J1xcZGFnJzp1J+KAoCcsIAogICAgICB1J1xcZGFnZ2VyJzp1J+KAoCcs IHUnXFxkYWxldGgnOnUn4oS4JywgdSdcXGRhc2hyaWdodGFycm93Jzp1J+KBn+KHouKBnycsIAog ICAgICB1J1xcZGFzaHYnOnUn4oqjJywgdSdcXGRkYWcnOnUn4oChJywgdSdcXGRkYWdnZXInOnUn 4oChJywgdSdcXGRkb3RzJzp1J+KLsScsIAogICAgICB1J1xcZGVnJzp1J2RlZycsIHUnXFxkZXQn OnUnZGV0JywgdSdcXGRpYW1vbmQnOnUn4peHJywgCiAgICAgIHUnXFxkaWFtb25kc3VpdCc6dSfi maYnLCB1J1xcZGltJzp1J2RpbScsIHUnXFxkaXNwbGF5c3R5bGUnOnUnJywgCiAgICAgIHUnXFxk aXYnOnUnw7cnLCB1J1xcZG90ZXEnOnUn4omQJywgdSdcXGRvdHMnOnUn4oCmJywgdSdcXGRvd25h cnJvdyc6dSfihpMnLCAKICAgICAgdSdcXGVhcnRoJzp1J+KZgScsIHUnXFxlbGwnOnUn4oSTJywg dSdcXGVtcHR5c2V0Jzp1J+KIhScsIHUnXFxlcXVpdic6dSfigZ/iiaHigZ8nLCAKICAgICAgdSdc XGV1cm8nOnUn4oKsJywgdSdcXGV4aXN0cyc6dSfiiIMnLCB1J1xcZXhwJzp1J2V4cCcsIHUnXFxm ZW1hbGUnOnUn4pmAJywgCiAgICAgIHUnXFxmbGF0Jzp1J+KZrScsIHUnXFxmb3JhbGwnOnUn4oiA JywgdSdcXGZyb3duJzp1J+KMoicsIHUnXFxmcm93bmllJzp1J+KYuScsIAogICAgICB1J1xcZ2Nk Jzp1J2djZCcsIHUnXFxnZSc6dSfigZ/iiaXigZ8nLCB1J1xcZ2VtaW5pJzp1J+KZiicsIHUnXFxn ZXEnOnUn4oGf4oml4oGfJywgCiAgICAgIHUnXFxnZXEpJzp1J+KJpScsIHUnXFxnZXRzJzp1J+KG kCcsIHUnXFxnZyc6dSfiiasnLCB1J1xcZ2ltZWwnOnUn4oS3JywgCiAgICAgIHUnXFxndHJsZXNz Jzp1J+KJtycsIHUnXFxoYmFyJzp1J+KEjycsIHUnXFxoZWFydHN1aXQnOnUn4pmlJywgCiAgICAg IHUnXFxoZmlsbCc6dSc8c3BhbiBjbGFzcz0iaGZpbGwiPiA8L3NwYW4+JywgdSdcXGhvbSc6dSdo b20nLCAKICAgICAgdSdcXGhvb2tsZWZ0YXJyb3cnOnUn4oapJywgdSdcXGhvb2tyaWdodGFycm93 Jzp1J+KGqicsIHUnXFxoc2xhc2gnOnUn4oSPJywgCiAgICAgIHUnXFxpbWF0aCc6dSfEsScsIHUn XFxpbXBsaWVzJzp1J+KBn+KBn+KHkuKBn+KBnycsIHUnXFxpbic6dSfigZ/iiIjigZ8nLCB1J1xc aW5mJzp1J2luZicsIAogICAgICB1J1xcaW5mdHknOnUn4oieJywgdSdcXGludCc6dSc8c3BhbiBj bGFzcz0iYmlnc3ltYm9sIj7iiKs8L3NwYW4+JywgCiAgICAgIHUnXFxpbnRvcCc6dSc8c3BhbiBj bGFzcz0iYmlnc3ltYm9sIj7iiKs8L3NwYW4+JywgdSdcXGludm5lZyc6dSfijJAnLCAKICAgICAg dSdcXGptYXRoJzp1J8i3JywgdSdcXGp1cGl0ZXInOnUn4pmDJywgdSdcXGtlcic6dSdrZXInLCB1 J1xcbGFuZCc6dSfiiKcnLCAKICAgICAgdSdcXGxhbmdsZSc6dSfin6gnLCB1J1xcbGJyYWNlJzp1 J3snLCB1J1xcbGJyYWNlKSc6dSd7JywgdSdcXGxicmFjayc6dSdbJywgCiAgICAgIHUnXFxsY2Vp bCc6dSfijIgnLCB1J1xcbGRvdHMnOnUn4oCmJywgdSdcXGxlJzp1J+KJpCcsIHUnXFxsZWFkc3Rv Jzp1J+KHnScsIAogICAgICB1J1xcbGVmdGFycm93Jzp1J+KBn+KGkOKBnycsIHUnXFxsZWZ0YXJy b3cpJzp1J+KGkCcsIHUnXFxsZWZ0aGFycG9vbmRvd24nOnUn4oa9JywgCiAgICAgIHUnXFxsZWZ0 aGFycG9vbnVwJzp1J+KGvCcsIHUnXFxsZWZ0bW9vbic6dSfimL4nLCB1J1xcbGVmdHJpZ2h0YXJy b3cnOnUn4oaUJywgCiAgICAgIHUnXFxsZW8nOnUn4pmMJywgdSdcXGxlcSc6dSfigZ/iiaTigZ8n LCB1J1xcbGVxKSc6dSfiiaQnLCB1J1xcbGVzc2d0cic6dSfiibYnLCAKICAgICAgdSdcXGxmbG9v cic6dSfijIonLCB1J1xcbGcnOnUnbGcnLCB1J1xcbGhkJzp1J+KKsicsIHUnXFxsaWJyYSc6dSfi mY4nLCAKICAgICAgdSdcXGxpbSc6dSdsaW0nLCB1J1xcbGltaW5mJzp1J2xpbWluZicsIHUnXFxs aW1zdXAnOnUnbGltc3VwJywgCiAgICAgIHUnXFxsbCc6dSfiiaonLCB1J1xcbG4nOnUnbG4nLCB1 J1xcbG5vdCc6dSfCrCcsIHUnXFxsb2cnOnUnbG9nJywgCiAgICAgIHUnXFxsb25nbGVmdGFycm93 Jzp1J+KftScsIHUnXFxsb25nbGVmdHJpZ2h0YXJyb3cnOnUn4p+3JywgCiAgICAgIHUnXFxsb25n bWFwc3RvJzp1J+KfvCcsIHUnXFxsb25ncmlnaHRhcnJvdyc6dSfin7YnLCB1J1xcbG9yJzp1J+KI qCcsIAogICAgICB1J1xcbG96ZW5nZSc6dSfil4onLCB1J1xcbHl4bG9jayc6dScnLCB1J1xcbWFs ZSc6dSfimYInLCB1J1xcbWFsdGVzZSc6dSfinKAnLCAKICAgICAgdSdcXG1hcHN0byc6dSfihqYn LCB1J1xcbWF0aGNpcmN1bWZsZXgnOnUnXicsIHUnXFxtYXgnOnUnbWF4JywgCiAgICAgIHUnXFxt ZWFzdXJlZGFuZ2xlJzp1J+KIoScsIHUnXFxtZXJjdXJ5Jzp1J+KYvycsIHUnXFxtaG8nOnUn4oSn JywgdSdcXG1pZCc6dSfiiKMnLCAKICAgICAgdSdcXG1pbic6dSdtaW4nLCB1J1xcbW9kZWxzJzp1 J+KKqCcsIHUnXFxtcCc6dSfiiJMnLCB1J1xcbmFibGEnOnUn4oiHJywgCiAgICAgIHUnXFxuYXR1 cmFsJzp1J+KZricsIHUnXFxuZSc6dSfigZ/iiaDigZ8nLCB1J1xcbmVhcnJvdyc6dSfihpcnLCB1 J1xcbmVnJzp1J8KsJywgCiAgICAgIHUnXFxuZWcpJzp1J8KsJywgdSdcXG5lcHR1bmUnOnUn4pmG JywgdSdcXG5lcSc6dSfigZ/iiaDigZ8nLCB1J1xcbmV4aXN0cyc6dSfiiIQnLCAKICAgICAgdSdc XG5pJzp1J+KIiycsIHUnXFxuaSknOnUn4oiLJywgdSdcXG5taWQnOnUn4oikJywgdSdcXG5vbnVt YmVyJzp1JycsIAogICAgICB1J1xcbm90Jzp1J8KsJywgdSdcXG5vdDwnOnUn4omuJywgdSdcXG5v dD0nOnUn4omgJywgdSdcXG5vdD4nOnUn4omvJywgCiAgICAgIHUnXFxub3RcXGluJzp1J+KBn+KI ieKBnycsIHUnXFxub3Rpbic6dSfiiIknLCB1J1xcbnBhcmFsbGVsJzp1J+KIpicsIAogICAgICB1 J1xcbndhcnJvdyc6dSfihpYnLCB1J1xcb2RvdCc6dSfiipknLCB1J1xcb2ludCc6dSfiiK4nLCB1 J1xcb21pbnVzJzp1J+KKlicsIAogICAgICB1J1xcb3BsdXMnOnUn4oqVJywgdSdcXG9zbGFzaCc6 dSfiipgnLCB1J1xcb3RpbWVzJzp1J+KKlycsIHUnXFxvd25zJzp1J+KIiycsIAogICAgICB1J1xc cGFyYWxsZWwnOnUn4oilJywgdSdcXHBhcnRpYWwnOnUn4oiCJywgdSdcXHBlcnAnOnUn4oqlJywg dSdcXHBpc2Nlcyc6dSfimZMnLCAKICAgICAgdSdcXHBsdXRvJzp1J+KZhycsIHUnXFxwbSc6dSfC sScsIHUnXFxwb3VuZHMnOnUnwqMnLCB1J1xccHJlYyc6dSfiibonLCAKICAgICAgdSdcXHByZWNl cSc6dSfiibwnLCB1J1xccHJpbWUnOnUn4oCyJywgCiAgICAgIHUnXFxwcm9kJzp1JzxzcGFuIGNs YXNzPSJiaWdzeW1ib2wiPuKIjzwvc3Bhbj4nLCB1J1xccHJvbXB0byc6dSfiiJ0nLCAKICAgICAg dSdcXHByb3B0byc6dSfigZ/iiJ3igZ8nLCB1J1xccXF1YWQnOnUnICAnLCB1J1xccXVhZCc6dScg JywgCiAgICAgIHUnXFxxdWFydGVybm90ZSc6dSfimaknLCB1J1xccmFuZ2xlJzp1J+KfqScsIHUn XFxyYnJhY2UnOnUnfScsIAogICAgICB1J1xccmJyYWNlKSc6dSd9JywgdSdcXHJicmFjayc6dSdd JywgdSdcXHJjZWlsJzp1J+KMiScsIHUnXFxyZmxvb3InOnUn4oyLJywgCiAgICAgIHUnXFxyaGQn OnUn4oqzJywgdSdcXHJpZ2h0YXJyb3cnOnUn4oGf4oaS4oGfJywgdSdcXHJpZ2h0YXJyb3cpJzp1 J+KGkicsIAogICAgICB1J1xccmlnaHRoYXJwb29uZG93bic6dSfih4EnLCB1J1xccmlnaHRoYXJw b29udXAnOnUn4oeAJywgCiAgICAgIHUnXFxyaWdodGhhcnBvb29uZG93bic6dSfih4EnLCB1J1xc cmlnaHRoYXJwb29vbnVwJzp1J+KHgCcsIAogICAgICB1J1xccmlnaHRsZWZ0aGFycG9vbnMnOnUn 4oeMJywgdSdcXHJpZ2h0bW9vbic6dSfimL0nLCAKICAgICAgdSdcXHJpZ2h0c3F1aWdhcnJvdyc6 dSfigZ/ih53igZ8nLCB1J1xcc2FnaXR0YXJpdXMnOnUn4pmQJywgdSdcXHNhdHVybic6dSfimYQn LCAKICAgICAgdSdcXHNjb3JwaW8nOnUn4pmPJywgdSdcXHNjcmlwdHNjcmlwdHN0eWxlJzp1Jycs IHUnXFxzY3JpcHRzdHlsZSc6dScnLCAKICAgICAgdSdcXHNlYXJyb3cnOnUn4oaYJywgdSdcXHNl Yyc6dSdzZWMnLCB1J1xcc2V0bWludXMnOnUn4oiWJywgdSdcXHNoYXJwJzp1J+KZrycsIAogICAg ICB1J1xcc2ltJzp1J+KBn37igZ8nLCB1J1xcc2ltZXEnOnUn4omDJywgdSdcXHNpbic6dSdzaW4n LCB1J1xcc2luaCc6dSdzaW5oJywgCiAgICAgIHUnXFxzbGFzaCc6dSfiiJUnLCB1J1xcc21pbGUn OnUn4oyjJywgdSdcXHNtaWxleSc6dSfimLonLCB1J1xcc3BhZGVzdWl0Jzp1J+KZoCcsIAogICAg ICB1J1xcc3BoZXJpY2FsYW5nbGUnOnUn4oiiJywgdSdcXHNxY2FwJzp1J+KKkycsIHUnXFxzcWN1 cCc6dSfiipQnLCAKICAgICAgdSdcXHNxc3Vic2V0Jzp1J+KKjycsIHUnXFxzcXN1YnNldGVxJzp1 J+KKkScsIHUnXFxzcXN1cHNldCc6dSfiipAnLCAKICAgICAgdSdcXHNxc3Vwc2V0ZXEnOnUn4oqS JywgdSdcXHNxdWFyZSc6dSfilqEnLCB1J1xcc3Rhcic6dSfii4YnLCAKICAgICAgdSdcXHN1YnNl dCc6dSfigZ/iioLigZ8nLCB1J1xcc3Vic2V0ZXEnOnUn4oqGJywgdSdcXHN1Y2MnOnUn4om7Jywg dSdcXHN1Y2NlcSc6dSfiib0nLCAKICAgICAgdSdcXHN1bSc6dSc8c3BhbiBjbGFzcz0iYmlnc3lt Ym9sIj7iiJE8L3NwYW4+JywgdSdcXHN1bic6dSfimLwnLCAKICAgICAgdSdcXHN1cCc6dSdzdXAn LCB1J1xcc3Vwc2V0Jzp1J+KBn+KKg+KBnycsIHUnXFxzdXBzZXRlcSc6dSfiiocnLCB1J1xcc3Vy ZCc6dSfiiJonLCAKICAgICAgdSdcXHN3YXJyb3cnOnUn4oaZJywgdSdcXHRhbic6dSd0YW4nLCB1 J1xcdGFuaCc6dSd0YW5oJywgdSdcXHRhdXJ1cyc6dSfimYknLCAKICAgICAgdSdcXHRleHRiYWNr c2xhc2gnOnUnXFwnLCB1J1xcdGV4dHN0eWxlJzp1JycsIHUnXFx0aW1lcyc6dSfigZ/Dl+KBnycs IAogICAgICB1J1xcdG8nOnUn4oaSJywgdSdcXHRvcCc6dSfiiqQnLCB1J1xcdHJpYW5nbGUnOnUn 4pazJywgdSdcXHRyaWFuZ2xlbGVmdCc6dSfiirInLCAKICAgICAgdSdcXHRyaWFuZ2xlcmlnaHQn OnUn4pa3JywgdSdcXHR3b25vdGVzJzp1J+KZqycsIHUnXFx1bmxoZCc6dSfiirQnLCAKICAgICAg dSdcXHVucmhkJzp1J+KKtScsIHUnXFx1bnJobCc6dSfiirUnLCB1J1xcdXBhcnJvdyc6dSfihpEn LCAKICAgICAgdSdcXHVwZG93bmFycm93Jzp1J+KGlScsIHUnXFx1cGx1cyc6dSfiio4nLCB1J1xc dXJhbnVzJzp1J+KZhScsIAogICAgICB1J1xcdmFyY2x1YnN1aXQnOnUn4pmnJywgdSdcXHZhcmRp YW1vbmRzdWl0Jzp1J+KZpicsIHUnXFx2YXJoZWFydHN1aXQnOnUn4pmlJywgCiAgICAgIHUnXFx2 YXJub3RoaW5nJzp1J+KIhScsIHUnXFx2YXJzcGFkZXN1aXQnOnUn4pmkJywgdSdcXHZkYXNoJzp1 J+KKoicsIAogICAgICB1J1xcdmRvdHMnOnUn4ouuJywgdSdcXHZlZSc6dSfiiKgnLCB1J1xcdmVl KSc6dSfiiKgnLCB1J1xcdmVydCc6dSfiiKMnLCAKICAgICAgdSdcXHZpcmdvJzp1J+KZjScsIHUn XFx3ZWRnZSc6dSfiiKcnLCB1J1xcd2VkZ2UpJzp1J+KIpycsIHUnXFx3cCc6dSfihJgnLCAKICAg ICAgdSdcXHdyJzp1J+KJgCcsIHUnXFx5ZW4nOnUnwqUnLCB1J1xceyc6dSd7JywgdSdcXHwnOnUn 4oilJywgdSdcXH0nOnUnfScsIAogICAgICB9CgogIGRlY29yYXRpbmdmdW5jdGlvbnMgPSB7CiAg ICAgIHUnXFxhY3V0ZSc6dSfCtCcsIHUnXFxhY3V0ZXtBfSc6dSfDgScsIHUnXFxhY3V0ZXtDfSc6 dSfEhicsIAogICAgICB1J1xcYWN1dGV7RX0nOnUnw4knLCB1J1xcYWN1dGV7R30nOnUnx7QnLCB1 J1xcYWN1dGV7SX0nOnUnw40nLCAKICAgICAgdSdcXGFjdXRle0t9Jzp1J+G4sCcsIHUnXFxhY3V0 ZXtMfSc6dSfEuScsIHUnXFxhY3V0ZXtNfSc6dSfhuL4nLCAKICAgICAgdSdcXGFjdXRle059Jzp1 J8WDJywgdSdcXGFjdXRle099Jzp1J8OTJywgdSdcXGFjdXRle1B9Jzp1J+G5lCcsIAogICAgICB1 J1xcYWN1dGV7Un0nOnUnxZQnLCB1J1xcYWN1dGV7U30nOnUnxZonLCB1J1xcYWN1dGV7VX0nOnUn w5onLCAKICAgICAgdSdcXGFjdXRle1d9Jzp1J+G6gicsIHUnXFxhY3V0ZXtZfSc6dSfDnScsIHUn XFxhY3V0ZXtafSc6dSfFuScsIAogICAgICB1J1xcYWN1dGV7YX0nOnUnw6EnLCB1J1xcYWN1dGV7 Y30nOnUnxIcnLCB1J1xcYWN1dGV7ZX0nOnUnw6knLCAKICAgICAgdSdcXGFjdXRle2d9Jzp1J8e1 JywgdSdcXGFjdXRle2l9Jzp1J8OtJywgdSdcXGFjdXRle2t9Jzp1J+G4sScsIAogICAgICB1J1xc YWN1dGV7bH0nOnUnxLonLCB1J1xcYWN1dGV7bX0nOnUn4bi/JywgdSdcXGFjdXRle259Jzp1J8WE JywgCiAgICAgIHUnXFxhY3V0ZXtvfSc6dSfDsycsIHUnXFxhY3V0ZXtwfSc6dSfhuZUnLCB1J1xc YWN1dGV7cn0nOnUnxZUnLCAKICAgICAgdSdcXGFjdXRle3N9Jzp1J8WbJywgdSdcXGFjdXRle3V9 Jzp1J8O6JywgdSdcXGFjdXRle3d9Jzp1J+G6gycsIAogICAgICB1J1xcYWN1dGV7eX0nOnUnw70n LCB1J1xcYWN1dGV7en0nOnUnxbonLCB1J1xcYmFye0F9Jzp1J8SAJywgCiAgICAgIHUnXFxiYXJ7 RX0nOnUnxJInLCB1J1xcYmFye0l9Jzp1J8SqJywgdSdcXGJhcntPfSc6dSfFjCcsIHUnXFxiYXJ7 VX0nOnUnxaonLCAKICAgICAgdSdcXGJhcntZfSc6dSfIsicsIHUnXFxiYXJ7YX0nOnUnxIEnLCB1 J1xcYmFye2V9Jzp1J8STJywgdSdcXGJhcntvfSc6dSfFjScsIAogICAgICB1J1xcYmFye3V9Jzp1 J8WrJywgdSdcXGJhcnt5fSc6dSfIsycsIHUnXFxicmV2ZSc6dSfLmCcsIHUnXFxicmV2ZXtBfSc6 dSfEgicsIAogICAgICB1J1xcYnJldmV7RX0nOnUnxJQnLCB1J1xcYnJldmV7R30nOnUnxJ4nLCB1 J1xcYnJldmV7SX0nOnUnxKwnLCAKICAgICAgdSdcXGJyZXZle099Jzp1J8WOJywgdSdcXGJyZXZl e1V9Jzp1J8WsJywgdSdcXGJyZXZle2F9Jzp1J8SDJywgCiAgICAgIHUnXFxicmV2ZXtlfSc6dSfE lScsIHUnXFxicmV2ZXtnfSc6dSfEnycsIHUnXFxicmV2ZXtvfSc6dSfFjycsIAogICAgICB1J1xc YnJldmV7dX0nOnUnxa0nLCB1J1xcYyc6dSfCuCcsIHUnXFxjaGVjayc6dSfLhycsIHUnXFxjaGVj a3tBfSc6dSfHjScsIAogICAgICB1J1xcY2hlY2t7Q30nOnUnxIwnLCB1J1xcY2hlY2t7RH0nOnUn xI4nLCB1J1xcY2hlY2t7RX0nOnUnxJonLCAKICAgICAgdSdcXGNoZWNre0d9Jzp1J8emJywgdSdc XGNoZWNre0h9Jzp1J8ieJywgdSdcXGNoZWNre0l9Jzp1J8ePJywgCiAgICAgIHUnXFxjaGVja3tL fSc6dSfHqCcsIHUnXFxjaGVja3tOfSc6dSfFhycsIHUnXFxjaGVja3tPfSc6dSfHkScsIAogICAg ICB1J1xcY2hlY2t7Un0nOnUnxZgnLCB1J1xcY2hlY2t7U30nOnUnxaAnLCB1J1xcY2hlY2t7VH0n OnUnxaQnLCAKICAgICAgdSdcXGNoZWNre1V9Jzp1J8eTJywgdSdcXGNoZWNre1p9Jzp1J8W9Jywg dSdcXGNoZWNre2F9Jzp1J8eOJywgCiAgICAgIHUnXFxjaGVja3tjfSc6dSfEjScsIHUnXFxjaGVj a3tkfSc6dSfEjycsIHUnXFxjaGVja3tlfSc6dSfEmycsIAogICAgICB1J1xcY2hlY2t7Z30nOnUn x6cnLCB1J1xcY2hlY2t7aH0nOnUnyJ8nLCB1J1xcY2hlY2t7a30nOnUnx6knLCAKICAgICAgdSdc XGNoZWNre259Jzp1J8WIJywgdSdcXGNoZWNre299Jzp1J8eSJywgdSdcXGNoZWNre3J9Jzp1J8WZ JywgCiAgICAgIHUnXFxjaGVja3tzfSc6dSfFoScsIHUnXFxjaGVja3t1fSc6dSfHlCcsIHUnXFxj aGVja3t6fSc6dSfFvicsIAogICAgICB1J1xcY3tDfSc6dSfDhycsIHUnXFxje0R9Jzp1J+G4kCcs IHUnXFxje0V9Jzp1J8ioJywgdSdcXGN7R30nOnUnxKInLCAKICAgICAgdSdcXGN7SH0nOnUn4bio JywgdSdcXGN7S30nOnUnxLYnLCB1J1xcY3tMfSc6dSfEuycsIHUnXFxje059Jzp1J8WFJywgCiAg ICAgIHUnXFxje1J9Jzp1J8WWJywgdSdcXGN7U30nOnUnxZ4nLCB1J1xcY3tUfSc6dSfFoicsIHUn XFxje2N9Jzp1J8OnJywgCiAgICAgIHUnXFxje2R9Jzp1J+G4kScsIHUnXFxje2V9Jzp1J8ipJywg dSdcXGN7aH0nOnUn4bipJywgdSdcXGN7a30nOnUnxLcnLCAKICAgICAgdSdcXGN7bH0nOnUnxLwn LCB1J1xcY3tufSc6dSfFhicsIHUnXFxje3J9Jzp1J8WXJywgdSdcXGN7c30nOnUnxZ8nLCAKICAg ICAgdSdcXGN7dH0nOnUnxaMnLCB1J1xcZGFjdXRle099Jzp1J8WQJywgdSdcXGRhY3V0ZXtVfSc6 dSfFsCcsIAogICAgICB1J1xcZGFjdXRle299Jzp1J8WRJywgdSdcXGRhY3V0ZXt1fSc6dSfFsScs IHUnXFxkZG90Jzp1J8KoJywgCiAgICAgIHUnXFxkZG90e0F9Jzp1J8OEJywgdSdcXGRkb3R7RX0n OnUnw4snLCB1J1xcZGRvdHtIfSc6dSfhuKYnLCAKICAgICAgdSdcXGRkb3R7SX0nOnUnw48nLCB1 J1xcZGRvdHtPfSc6dSfDlicsIHUnXFxkZG90e1V9Jzp1J8OcJywgCiAgICAgIHUnXFxkZG90e1d9 Jzp1J+G6hCcsIHUnXFxkZG90e1h9Jzp1J+G6jCcsIHUnXFxkZG90e1l9Jzp1J8W4JywgCiAgICAg IHUnXFxkZG90e2F9Jzp1J8OkJywgdSdcXGRkb3R7ZX0nOnUnw6snLCB1J1xcZGRvdHtofSc6dSfh uKcnLCAKICAgICAgdSdcXGRkb3R7b30nOnUnw7YnLCB1J1xcZGRvdHt0fSc6dSfhupcnLCB1J1xc ZGRvdHt1fSc6dSfDvCcsIAogICAgICB1J1xcZGRvdHt3fSc6dSfhuoUnLCB1J1xcZGRvdHt4fSc6 dSfhuo0nLCB1J1xcZGRvdHt5fSc6dSfDvycsIAogICAgICB1J1xcZGdyYXZle0F9Jzp1J8iAJywg dSdcXGRncmF2ZXtFfSc6dSfIhCcsIHUnXFxkZ3JhdmV7SX0nOnUnyIgnLCAKICAgICAgdSdcXGRn cmF2ZXtPfSc6dSfIjCcsIHUnXFxkZ3JhdmV7Un0nOnUnyJAnLCB1J1xcZGdyYXZle1V9Jzp1J8iU JywgCiAgICAgIHUnXFxkZ3JhdmV7YX0nOnUnyIEnLCB1J1xcZGdyYXZle2V9Jzp1J8iFJywgdSdc XGRncmF2ZXtvfSc6dSfIjScsIAogICAgICB1J1xcZGdyYXZle3J9Jzp1J8iRJywgdSdcXGRncmF2 ZXt1fSc6dSfIlScsIHUnXFxkb3QnOnUny5knLCAKICAgICAgdSdcXGRvdHtBfSc6dSfIpicsIHUn XFxkb3R7Qn0nOnUn4biCJywgdSdcXGRvdHtDfSc6dSfEiicsIHUnXFxkb3R7RH0nOnUn4biKJywg CiAgICAgIHUnXFxkb3R7RX0nOnUnxJYnLCB1J1xcZG90e0Z9Jzp1J+G4nicsIHUnXFxkb3R7R30n OnUnxKAnLCB1J1xcZG90e0h9Jzp1J+G4oicsIAogICAgICB1J1xcZG90e0l9Jzp1J8SwJywgdSdc XGRvdHtNfSc6dSfhuYAnLCB1J1xcZG90e059Jzp1J+G5hCcsIHUnXFxkb3R7T30nOnUnyK4nLCAK ICAgICAgdSdcXGRvdHtQfSc6dSfhuZYnLCB1J1xcZG90e1J9Jzp1J+G5mCcsIHUnXFxkb3R7U30n OnUn4bmgJywgdSdcXGRvdHtUfSc6dSfhuaonLCAKICAgICAgdSdcXGRvdHtXfSc6dSfhuoYnLCB1 J1xcZG90e1h9Jzp1J+G6iicsIHUnXFxkb3R7WX0nOnUn4bqOJywgdSdcXGRvdHtafSc6dSfFuycs IAogICAgICB1J1xcZG90e2F9Jzp1J8inJywgdSdcXGRvdHtifSc6dSfhuIMnLCB1J1xcZG90e2N9 Jzp1J8SLJywgdSdcXGRvdHtkfSc6dSfhuIsnLCAKICAgICAgdSdcXGRvdHtlfSc6dSfElycsIHUn XFxkb3R7Zn0nOnUn4bifJywgdSdcXGRvdHtnfSc6dSfEoScsIHUnXFxkb3R7aH0nOnUn4bijJywg CiAgICAgIHUnXFxkb3R7bX0nOnUn4bmBJywgdSdcXGRvdHtufSc6dSfhuYUnLCB1J1xcZG90e299 Jzp1J8ivJywgdSdcXGRvdHtwfSc6dSfhuZcnLCAKICAgICAgdSdcXGRvdHtyfSc6dSfhuZknLCB1 J1xcZG90e3N9Jzp1J+G5oScsIHUnXFxkb3R7dH0nOnUn4bmrJywgdSdcXGRvdHt3fSc6dSfhuocn LCAKICAgICAgdSdcXGRvdHt4fSc6dSfhuosnLCB1J1xcZG90e3l9Jzp1J+G6jycsIHUnXFxkb3R7 en0nOnUnxbwnLCB1J1xcZ3JhdmUnOnUnYCcsIAogICAgICB1J1xcZ3JhdmV7QX0nOnUnw4AnLCB1 J1xcZ3JhdmV7RX0nOnUnw4gnLCB1J1xcZ3JhdmV7SX0nOnUnw4wnLCAKICAgICAgdSdcXGdyYXZl e059Jzp1J8e4JywgdSdcXGdyYXZle099Jzp1J8OSJywgdSdcXGdyYXZle1V9Jzp1J8OZJywgCiAg ICAgIHUnXFxncmF2ZXtXfSc6dSfhuoAnLCB1J1xcZ3JhdmV7WX0nOnUn4buyJywgdSdcXGdyYXZl e2F9Jzp1J8OgJywgCiAgICAgIHUnXFxncmF2ZXtlfSc6dSfDqCcsIHUnXFxncmF2ZXtufSc6dSfH uScsIHUnXFxncmF2ZXtvfSc6dSfDsicsIAogICAgICB1J1xcZ3JhdmV7dX0nOnUnw7knLCB1J1xc Z3JhdmV7d30nOnUn4bqBJywgdSdcXGdyYXZle3l9Jzp1J+G7sycsIAogICAgICB1J1xcaGF0Jzp1 J14nLCB1J1xcaGF0e0F9Jzp1J8OCJywgdSdcXGhhdHtDfSc6dSfEiCcsIHUnXFxoYXR7RX0nOnUn w4onLCAKICAgICAgdSdcXGhhdHtHfSc6dSfEnCcsIHUnXFxoYXR7SH0nOnUnxKQnLCB1J1xcaGF0 e0l9Jzp1J8OOJywgdSdcXGhhdHtKfSc6dSfEtCcsIAogICAgICB1J1xcaGF0e099Jzp1J8OUJywg dSdcXGhhdHtTfSc6dSfFnCcsIHUnXFxoYXR7VX0nOnUnw5snLCB1J1xcaGF0e1d9Jzp1J8W0Jywg CiAgICAgIHUnXFxoYXR7WX0nOnUnxbYnLCB1J1xcaGF0e1p9Jzp1J+G6kCcsIHUnXFxoYXR7YX0n OnUnw6InLCB1J1xcaGF0e2N9Jzp1J8SJJywgCiAgICAgIHUnXFxoYXR7ZX0nOnUnw6onLCB1J1xc aGF0e2d9Jzp1J8SdJywgdSdcXGhhdHtofSc6dSfEpScsIHUnXFxoYXR7b30nOnUnw7QnLCAKICAg ICAgdSdcXGhhdHtzfSc6dSfFnScsIHUnXFxoYXR7dX0nOnUnw7snLCB1J1xcaGF0e3d9Jzp1J8W1 JywgdSdcXGhhdHt5fSc6dSfFtycsIAogICAgICB1J1xcaGF0e3p9Jzp1J+G6kScsIHUnXFxtYXRo cmluZyc6dSfCsCcsIHUnXFxvZ29uZWt7QX0nOnUnxIQnLCAKICAgICAgdSdcXG9nb25la3tFfSc6 dSfEmCcsIHUnXFxvZ29uZWt7SX0nOnUnxK4nLCB1J1xcb2dvbmVre099Jzp1J8eqJywgCiAgICAg IHUnXFxvZ29uZWt7VX0nOnUnxbInLCB1J1xcb2dvbmVre2F9Jzp1J8SFJywgdSdcXG9nb25la3tl fSc6dSfEmScsIAogICAgICB1J1xcb2dvbmVre2l9Jzp1J8SvJywgdSdcXG9nb25la3tvfSc6dSfH qycsIHUnXFxvZ29uZWt7dX0nOnUnxbMnLCAKICAgICAgdSdcXG92ZXJsZWZ0YXJyb3cnOnUn4p+1 JywgdSdcXG92ZXJyaWdodGFycm93Jzp1J+KfticsIHUnXFxyY2Fwe0F9Jzp1J8iCJywgCiAgICAg IHUnXFxyY2Fwe0V9Jzp1J8iGJywgdSdcXHJjYXB7SX0nOnUnyIonLCB1J1xccmNhcHtPfSc6dSfI jicsIAogICAgICB1J1xccmNhcHtSfSc6dSfIkicsIHUnXFxyY2Fwe1V9Jzp1J8iWJywgdSdcXHJj YXB7YX0nOnUnyIMnLCAKICAgICAgdSdcXHJjYXB7ZX0nOnUnyIcnLCB1J1xccmNhcHtvfSc6dSfI jycsIHUnXFxyY2Fwe3J9Jzp1J8iTJywgCiAgICAgIHUnXFxyY2Fwe3V9Jzp1J8iXJywgdSdcXHNs YXNoZWR7T30nOnUnw5gnLCB1J1xcc2xhc2hlZHtvfSc6dSfDuCcsIAogICAgICB1J1xcc3ViZG90 e0F9Jzp1J+G6oCcsIHUnXFxzdWJkb3R7Qn0nOnUn4biEJywgdSdcXHN1YmRvdHtEfSc6dSfhuIwn LCAKICAgICAgdSdcXHN1YmRvdHtFfSc6dSfhurgnLCB1J1xcc3ViZG90e0h9Jzp1J+G4pCcsIHUn XFxzdWJkb3R7SX0nOnUn4buKJywgCiAgICAgIHUnXFxzdWJkb3R7S30nOnUn4biyJywgdSdcXHN1 YmRvdHtMfSc6dSfhuLYnLCB1J1xcc3ViZG90e019Jzp1J+G5gicsIAogICAgICB1J1xcc3ViZG90 e059Jzp1J+G5hicsIHUnXFxzdWJkb3R7T30nOnUn4buMJywgdSdcXHN1YmRvdHtSfSc6dSfhuZon LCAKICAgICAgdSdcXHN1YmRvdHtTfSc6dSfhuaInLCB1J1xcc3ViZG90e1R9Jzp1J+G5rCcsIHUn XFxzdWJkb3R7VX0nOnUn4bukJywgCiAgICAgIHUnXFxzdWJkb3R7Vn0nOnUn4bm+JywgdSdcXHN1 YmRvdHtXfSc6dSfhuognLCB1J1xcc3ViZG90e1l9Jzp1J+G7tCcsIAogICAgICB1J1xcc3ViZG90 e1p9Jzp1J+G6kicsIHUnXFxzdWJkb3R7YX0nOnUn4bqhJywgdSdcXHN1YmRvdHtifSc6dSfhuIUn LCAKICAgICAgdSdcXHN1YmRvdHtkfSc6dSfhuI0nLCB1J1xcc3ViZG90e2V9Jzp1J+G6uScsIHUn XFxzdWJkb3R7aH0nOnUn4bilJywgCiAgICAgIHUnXFxzdWJkb3R7aX0nOnUn4buLJywgdSdcXHN1 YmRvdHtrfSc6dSfhuLMnLCB1J1xcc3ViZG90e2x9Jzp1J+G4tycsIAogICAgICB1J1xcc3ViZG90 e219Jzp1J+G5gycsIHUnXFxzdWJkb3R7bn0nOnUn4bmHJywgdSdcXHN1YmRvdHtvfSc6dSfhu40n LCAKICAgICAgdSdcXHN1YmRvdHtyfSc6dSfhuZsnLCB1J1xcc3ViZG90e3N9Jzp1J+G5oycsIHUn XFxzdWJkb3R7dH0nOnUn4bmtJywgCiAgICAgIHUnXFxzdWJkb3R7dX0nOnUn4bulJywgdSdcXHN1 YmRvdHt2fSc6dSfhub8nLCB1J1xcc3ViZG90e3d9Jzp1J+G6iScsIAogICAgICB1J1xcc3ViZG90 e3l9Jzp1J+G7tScsIHUnXFxzdWJkb3R7en0nOnUn4bqTJywgdSdcXHN1YmhhdHtEfSc6dSfhuJIn LCAKICAgICAgdSdcXHN1YmhhdHtFfSc6dSfhuJgnLCB1J1xcc3ViaGF0e0x9Jzp1J+G4vCcsIHUn XFxzdWJoYXR7Tn0nOnUn4bmKJywgCiAgICAgIHUnXFxzdWJoYXR7VH0nOnUn4bmwJywgdSdcXHN1 YmhhdHtVfSc6dSfhubYnLCB1J1xcc3ViaGF0e2R9Jzp1J+G4kycsIAogICAgICB1J1xcc3ViaGF0 e2V9Jzp1J+G4mScsIHUnXFxzdWJoYXR7bH0nOnUn4bi9JywgdSdcXHN1YmhhdHtufSc6dSfhuYsn LCAKICAgICAgdSdcXHN1YmhhdHt0fSc6dSfhubEnLCB1J1xcc3ViaGF0e3V9Jzp1J+G5tycsIHUn XFxzdWJyaW5ne0F9Jzp1J+G4gCcsIAogICAgICB1J1xcc3VicmluZ3thfSc6dSfhuIEnLCB1J1xc c3VidGlsZGV7RX0nOnUn4biaJywgdSdcXHN1YnRpbGRle0l9Jzp1J+G4rCcsIAogICAgICB1J1xc c3VidGlsZGV7VX0nOnUn4bm0JywgdSdcXHN1YnRpbGRle2V9Jzp1J+G4mycsIHUnXFxzdWJ0aWxk ZXtpfSc6dSfhuK0nLCAKICAgICAgdSdcXHN1YnRpbGRle3V9Jzp1J+G5tScsIHUnXFx0aWxkZSc6 dSfLnCcsIHUnXFx0aWxkZXtBfSc6dSfDgycsIAogICAgICB1J1xcdGlsZGV7RX0nOnUn4bq8Jywg dSdcXHRpbGRle0l9Jzp1J8SoJywgdSdcXHRpbGRle059Jzp1J8ORJywgCiAgICAgIHUnXFx0aWxk ZXtPfSc6dSfDlScsIHUnXFx0aWxkZXtVfSc6dSfFqCcsIHUnXFx0aWxkZXtWfSc6dSfhubwnLCAK ICAgICAgdSdcXHRpbGRle1l9Jzp1J+G7uCcsIHUnXFx0aWxkZXthfSc6dSfDoycsIHUnXFx0aWxk ZXtlfSc6dSfhur0nLCAKICAgICAgdSdcXHRpbGRle259Jzp1J8OxJywgdSdcXHRpbGRle299Jzp1 J8O1JywgdSdcXHRpbGRle3V9Jzp1J8WpJywgCiAgICAgIHUnXFx0aWxkZXt2fSc6dSfhub0nLCB1 J1xcdGlsZGV7eX0nOnUn4bu5JywgdSdcXHZlYyc6dSfihpInLCAKICAgICAgfQoKICBlbmRpbmdz ID0gewogICAgICB1J2JyYWNrZXQnOnUnfScsIHUnY29tcGxleCc6dSdcXF0nLCB1J2VuZGFmdGVy Jzp1J30nLCAKICAgICAgdSdlbmRiZWZvcmUnOnUnXFxlbmR7JywgdSdzcXVhcmVicmFja2V0Jzp1 J10nLCAKICAgICAgfQoKICBmb250ZnVuY3Rpb25zID0gewogICAgICB1J1xcYm9sZHN5bWJvbCc6 dSdiJywgdSdcXG1hdGhiYic6dSdzcGFuIGNsYXNzPSJibGFja2JvYXJkIicsIAogICAgICB1J1xc bWF0aGJie0F9Jzp1J/CdlLgnLCB1J1xcbWF0aGJie0J9Jzp1J/CdlLknLCB1J1xcbWF0aGJie0N9 Jzp1J+KEgicsIAogICAgICB1J1xcbWF0aGJie0R9Jzp1J/CdlLsnLCB1J1xcbWF0aGJie0V9Jzp1 J/CdlLwnLCB1J1xcbWF0aGJie0Z9Jzp1J/CdlL0nLCAKICAgICAgdSdcXG1hdGhiYntHfSc6dSfw nZS+JywgdSdcXG1hdGhiYntIfSc6dSfihI0nLCB1J1xcbWF0aGJie0p9Jzp1J/CdlYEnLCAKICAg ICAgdSdcXG1hdGhiYntLfSc6dSfwnZWCJywgdSdcXG1hdGhiYntMfSc6dSfwnZWDJywgdSdcXG1h dGhiYntOfSc6dSfihJUnLCAKICAgICAgdSdcXG1hdGhiYntPfSc6dSfwnZWGJywgdSdcXG1hdGhi YntQfSc6dSfihJknLCB1J1xcbWF0aGJie1F9Jzp1J+KEmicsIAogICAgICB1J1xcbWF0aGJie1J9 Jzp1J+KEnScsIHUnXFxtYXRoYmJ7U30nOnUn8J2ViicsIHUnXFxtYXRoYmJ7VH0nOnUn8J2Viycs IAogICAgICB1J1xcbWF0aGJie1d9Jzp1J/CdlY4nLCB1J1xcbWF0aGJie1p9Jzp1J+KEpCcsIHUn XFxtYXRoYmYnOnUnYicsIAogICAgICB1J1xcbWF0aGNhbCc6dSdzcGFuIGNsYXNzPSJzY3JpcHQi JywgCiAgICAgIHUnXFxtYXRoZnJhayc6dSdzcGFuIGNsYXNzPSJmcmFrdHVyIicsIHUnXFxtYXRo ZnJha3tDfSc6dSfihK0nLCAKICAgICAgdSdcXG1hdGhmcmFre0Z9Jzp1J/CdlIknLCB1J1xcbWF0 aGZyYWt7SH0nOnUn4oSMJywgdSdcXG1hdGhmcmFre0l9Jzp1J+KEkScsIAogICAgICB1J1xcbWF0 aGZyYWt7Un0nOnUn4oScJywgdSdcXG1hdGhmcmFre1p9Jzp1J+KEqCcsIHUnXFxtYXRoaXQnOnUn aScsIAogICAgICB1J1xcbWF0aHJpbmd7QX0nOnUnw4UnLCB1J1xcbWF0aHJpbmd7VX0nOnUnxa4n LCB1J1xcbWF0aHJpbmd7YX0nOnUnw6UnLCAKICAgICAgdSdcXG1hdGhyaW5ne3V9Jzp1J8WvJywg dSdcXG1hdGhyaW5ne3d9Jzp1J+G6mCcsIHUnXFxtYXRocmluZ3t5fSc6dSfhupknLCAKICAgICAg dSdcXG1hdGhybSc6dSdzcGFuIGNsYXNzPSJtYXRocm0iJywgdSdcXG1hdGhzY3InOnUnc3BhbiBj bGFzcz0ic2NyaXB0IicsIAogICAgICB1J1xcbWF0aHNjcntCfSc6dSfihKwnLCB1J1xcbWF0aHNj cntFfSc6dSfihLAnLCB1J1xcbWF0aHNjcntGfSc6dSfihLEnLCAKICAgICAgdSdcXG1hdGhzY3J7 SH0nOnUn4oSLJywgdSdcXG1hdGhzY3J7SX0nOnUn4oSQJywgdSdcXG1hdGhzY3J7TH0nOnUn4oSS JywgCiAgICAgIHUnXFxtYXRoc2Nye019Jzp1J+KEsycsIHUnXFxtYXRoc2Nye1J9Jzp1J+KEmycs IAogICAgICB1J1xcbWF0aHNmJzp1J3NwYW4gY2xhc3M9Im1hdGhzZiInLCB1J1xcbWF0aHR0Jzp1 J3R0JywgCiAgICAgIH0KCiAgaHlicmlkZnVuY3Rpb25zID0gewogICAgICAKICAgICAgdSdcXGJp bm9tJzpbdSd7JDF9eyQyfScsdSdmM3sofWYwe2YxeyQxfWYyeyQyfX1mM3spfScsdSdzcGFuIGNs YXNzPSJiaW5vbSInLHUnc3BhbiBjbGFzcz0idXBiaW5vbSInLHUnc3BhbiBjbGFzcz0iZG93bmJp bm9tIicsdSdzcGFuIGNsYXNzPSJiaWdzeW1ib2wiJyxdLCAKICAgICAgdSdcXGNmcmFjJzpbdSdb JHBdeyQxfXskMn0nLHUnZjB7ZjF7JDF9ZjJ7JDJ9fScsdSdzcGFuIGNsYXNzPSJmdWxsZnJhY3Rp b24iJyx1J3NwYW4gY2xhc3M9Im51bWVyYXRvciRwIicsdSdzcGFuIGNsYXNzPSJkZW5vbWluYXRv ciInLF0sIAogICAgICB1J1xcZGJpbm9tJzpbdSd7JDF9eyQyfScsdSdmM3sofWYwe2YxeyQxfWYy eyQyfX1mM3spfScsdSdzcGFuIGNsYXNzPSJmdWxsYmlub20iJyx1J3NwYW4gY2xhc3M9InVwYmlu b20iJyx1J3NwYW4gY2xhc3M9ImRvd25iaW5vbSInLHUnc3BhbiBjbGFzcz0iYmlnc3ltYm9sIics XSwgCiAgICAgIHUnXFxkZnJhYyc6W3UneyQxfXskMn0nLHUnZjB7ZjF7JDF9ZjJ7JDJ9fScsdSdz cGFuIGNsYXNzPSJmdWxsZnJhY3Rpb24iJyx1J3NwYW4gY2xhc3M9Im51bWVyYXRvciInLHUnc3Bh biBjbGFzcz0iZGVub21pbmF0b3IiJyxdLCAKICAgICAgdSdcXGZyYWMnOlt1J3skMX17JDJ9Jyx1 J2Ywe2YxeyQxfWYyeyQyfX0nLHUnc3BhbiBjbGFzcz0iZnJhY3Rpb24iJyx1J3NwYW4gY2xhc3M9 Im51bWVyYXRvciInLHUnc3BhbiBjbGFzcz0iZGVub21pbmF0b3IiJyxdLCAKICAgICAgdSdcXGhz cGFjZSc6W3UneyRwfScsdSdmMHsgfScsdSdzcGFuIGNsYXNzPSJoc3BhY2UiIHN0eWxlPSJ3aWR0 aDogJHA7IicsXSwgCiAgICAgIHUnXFxsZWZ0cm9vdCc6W3UneyRwfScsdSdmMHsgfScsdSdzcGFu IGNsYXNzPSJsZWZ0cm9vdCIgc3R5bGU9IndpZHRoOiAkcDtweCInLF0sIAogICAgICB1J1xcbmlj ZWZyYWMnOlt1J3skMX17JDJ9Jyx1J2Ywe2YxeyQxfeKBhGYyeyQyfX0nLHUnc3BhbiBjbGFzcz0i ZnJhY3Rpb24iJyx1J3N1cCBjbGFzcz0ibnVtZXJhdG9yIicsdSdzdWIgY2xhc3M9ImRlbm9taW5h dG9yIicsXSwgCiAgICAgIHUnXFxyYWlzZWJveCc6W3UneyRwfXskMX0nLHUnZjB7JDF9Jyx1J3Nw YW4gY2xhc3M9InJhaXNlYm94IiBzdHlsZT0idmVydGljYWwtYWxpZ246ICRwOyInLF0sIAogICAg ICB1J1xcc3FydCc6W3UnWyQwXXskMX0nLHUnZjF7JDB9ZjB7ZjJ74oiafWYzeyQxfX0nLHUnc3Bh biBjbGFzcz0ic3FydCInLHUnc3VwJyx1J3NwYW4gY2xhc3M9InJhZGljYWwiJyx1J3NwYW4gY2xh c3M9InJvb3QiJyxdLCAKICAgICAgdSdcXHRiaW5vbSc6W3UneyQxfXskMn0nLHUnZjN7KH1mMHtm MXskMX1mMnskMn19ZjN7KX0nLHUnc3BhbiBjbGFzcz0iZnVsbGJpbm9tIicsdSdzcGFuIGNsYXNz PSJ1cGJpbm9tIicsdSdzcGFuIGNsYXNzPSJkb3duYmlub20iJyx1J3NwYW4gY2xhc3M9ImJpZ3N5 bWJvbCInLF0sIAogICAgICB1J1xcdW5pdCc6W3UnWyQwXXskMX0nLHUnJDBmMHskMS5mb250fScs dSdzcGFuIGNsYXNzPSJ1bml0IicsXSwgCiAgICAgIHUnXFx1bml0ZnJhYyc6W3UnWyQwXXskMX17 JDJ9Jyx1JyQwZjB7ZjF7JDEuZm9udH3igYRmMnskMi5mb250fX0nLHUnc3BhbiBjbGFzcz0iZnJh Y3Rpb24iJyx1J3N1cCBjbGFzcz0idW5pdCInLHUnc3ViIGNsYXNzPSJ1bml0IicsXSwgCiAgICAg IHUnXFx1cHJvb3QnOlt1J3skcH0nLHUnZjB7IH0nLHUnc3BhbiBjbGFzcz0idXByb290IiBzdHls ZT0id2lkdGg6ICRwO3B4IicsXSwgCiAgICAgIHUnXFx2c3BhY2UnOlt1J3skcH0nLHUnZjB7IH0n LHUnc3BhbiBjbGFzcz0idnNwYWNlIiBzdHlsZT0iaGVpZ2h0OiAkcDsiJyxdLCAKICAgICAgfQoK ICBsYWJlbGZ1bmN0aW9ucyA9IHsKICAgICAgdSdcXGxhYmVsJzp1J2EgbmFtZT0iIyInLCAKICAg ICAgfQoKICBsaW1pdHMgPSB7CiAgICAgIHUnY29tbWFuZHMnOlt1J1xcc3VtJyx1J1xcaW50Jyx1 J1xcaW50b3AnLF0sIHUnb3BlcmFuZHMnOlt1J14nLHUnXycsXSwgCiAgICAgIH0KCiAgbW9kaWZp ZWQgPSB7CiAgICAgIHUnXG4nOnUnJywgdScgJzp1JycsIHUnJic6dScJJywgdSdcJyc6dSfigJkn LCB1JysnOnUn4oGfK+KBnycsIHUnLCc6dScs4oGfJywgCiAgICAgIHUnLSc6dSfigZ/iiJLigZ8n LCB1Jy8nOnUn4oGf4oGE4oGfJywgdSc8Jzp1J+KBnyZsdDvigZ8nLCB1Jz0nOnUn4oGfPeKBnycs IHUnPic6dSfigZ8mZ3Q74oGfJywgCiAgICAgIHUnQCc6dScnLCB1J34nOnUnJywgCiAgICAgIH0K CiAgb25lZnVuY3Rpb25zID0gewogICAgICB1J1xcQmlnJzp1J3NwYW4gY2xhc3M9ImJpZ3N5bWJv bCInLCB1J1xcQmlnZyc6dSdzcGFuIGNsYXNzPSJodWdlc3ltYm9sIicsIAogICAgICB1J1xcYmFy Jzp1J3NwYW4gY2xhc3M9ImJhciInLCB1J1xcYmVnaW57YXJyYXl9Jzp1J3NwYW4gY2xhc3M9ImFy cmF5ZGVmIicsIAogICAgICB1J1xcYmlnJzp1J3NwYW4gY2xhc3M9InN5bWJvbCInLCB1J1xcYmln Zyc6dSdzcGFuIGNsYXNzPSJsYXJnZXN5bWJvbCInLCAKICAgICAgdSdcXGJpZ2wnOnUnc3BhbiBj bGFzcz0iYmlnc3ltYm9sIicsIHUnXFxiaWdyJzp1J3NwYW4gY2xhc3M9ImJpZ3N5bWJvbCInLCAK ICAgICAgdSdcXGhwaGFudG9tJzp1J3NwYW4gY2xhc3M9InBoYW50b20iJywgdSdcXGxlZnQnOnUn c3BhbiBjbGFzcz0ic3ltYm9sIicsIAogICAgICB1J1xcbGVmdC4nOnUnJywgdSdcXG1pZGRsZSc6 dSdzcGFuIGNsYXNzPSJzeW1ib2wiJywgCiAgICAgIHUnXFxvdmVybGluZSc6dSdzcGFuIGNsYXNz PSJvdmVybGluZSInLCAKICAgICAgdSdcXHBoYW50b20nOnUnc3BhbiBjbGFzcz0icGhhbnRvbSIn LCB1J1xccmlnaHQnOnUnc3BhbiBjbGFzcz0ic3ltYm9sIicsIAogICAgICB1J1xccmlnaHQuJzp1 JycsIHUnXFx1bmRlcmxpbmUnOnUndScsIAogICAgICB1J1xcdnBoYW50b20nOnUnc3BhbiBjbGFz cz0icGhhbnRvbSInLCAKICAgICAgfQoKICBzdGFydHMgPSB7CiAgICAgIHUnYmVnaW5hZnRlcic6 dSd9JywgdSdiZWdpbmJlZm9yZSc6dSdcXGJlZ2lueycsIHUnYnJhY2tldCc6dSd7JywgCiAgICAg IHUnY29tbWFuZCc6dSdcXCcsIHUnY29tcGxleCc6dSdcXFsnLCB1J3NpbXBsZSc6dSckJywgCiAg ICAgIHUnc3F1YXJlYnJhY2tldCc6dSdbJywgdSd1bm51bWJlcmVkJzp1JyonLCAKICAgICAgfQoK ICBzeW1ib2xmdW5jdGlvbnMgPSB7CiAgICAgIHUnXic6dSdzdXAnLCB1J18nOnUnc3ViJywgCiAg ICAgIH0KCiAgdGV4dGZ1bmN0aW9ucyA9IHsKICAgICAgdSdcXG1ib3gnOnUnc3BhbiBjbGFzcz0i bWJveCInLCB1J1xcdGV4dCc6dSdzcGFuIGNsYXNzPSJ0ZXh0IicsIAogICAgICB1J1xcdGV4dGJm Jzp1J2InLCB1J1xcdGV4dGlwYSc6dSdzcGFuIGNsYXNzPSJ0ZXh0aXBhIicsIHUnXFx0ZXh0aXQn OnUnaScsIAogICAgICB1J1xcdGV4dHJtJzp1J3NwYW4gY2xhc3M9Im1hdGhybSInLCAKICAgICAg dSdcXHRleHRzYyc6dSdzcGFuIGNsYXNzPSJ2ZXJzYWxpdGFzIicsIAogICAgICB1J1xcdGV4dHNm Jzp1J3NwYW4gY2xhc3M9Im1hdGhzZiInLCB1J1xcdGV4dHNsJzp1J2knLCB1J1xcdGV4dHR0Jzp1 J3R0JywgCiAgICAgIH0KCiAgdW5tb2RpZmllZCA9IHsKICAgICAgCiAgICAgIHUnY2hhcmFjdGVy cyc6W3UnLicsdScqJyx1J+KCrCcsdScoJyx1JyknLHUnWycsdSddJyx1JzonLHUnwrcnLHUnIScs dSc7Jyx1J3wnLHUnwqcnLHUnIicsXSwgCiAgICAgIH0KCmNsYXNzIEdlbmVyYWxDb25maWcob2Jq ZWN0KToKICAiQ29uZmlndXJhdGlvbiBjbGFzcyBmcm9tIGNvbmZpZyBmaWxlIgoKICB2ZXJzaW9u ID0gewogICAgICB1J2RhdGUnOnUnMjAwOS0xMi0xNicsIHUnbHl4Zm9ybWF0Jzp1JzM0NScsIHUn bnVtYmVyJzp1JzAuMzknLCAKICAgICAgfQoKY2xhc3MgSGVhZGVyQ29uZmlnKG9iamVjdCk6CiAg IkNvbmZpZ3VyYXRpb24gY2xhc3MgZnJvbSBjb25maWcgZmlsZSIKCiAgcGFyYW1ldGVycyA9IHsK ICAgICAgdSdicmFuY2gnOnUnXFxicmFuY2gnLCB1J2RvY3VtZW50Y2xhc3MnOnUnXFx0ZXh0Y2xh c3MnLCAKICAgICAgdSdlbmRicmFuY2gnOnUnXFxlbmRfYnJhbmNoJywgCiAgICAgIHUncGFyYWdy YXBoc2VwYXJhdGlvbic6dSdcXHBhcmFncmFwaF9zZXBhcmF0aW9uJywgCiAgICAgIHUncGRmdGl0 bGUnOnUnXFxwZGZfdGl0bGUnLCB1J3NlY251bWRlcHRoJzp1J1xcc2VjbnVtZGVwdGgnLCAKICAg ICAgdSd0b2NkZXB0aCc6dSdcXHRvY2RlcHRoJywgCiAgICAgIH0KCiAgc3R5bGVzID0gewogICAg ICAKICAgICAgdSdhcnRpY2xlJzpbdSdhcnRpY2xlJyx1J2Fhc3RleCcsdSdhYXBhcGVyJyx1J2Fj bXNpZ2dyYXBoJyx1J3NpZ3BsYW5jb25mJyx1J2FjaGVtc28nLHUnYW1zYXJ0Jyx1J2FwYScsdSdh cmFiLWFydGljbGUnLHUnYXJtZW5pYW4tYXJ0aWNsZScsdSdhcnRpY2xlLWJlYW1lcicsdSdjaGVz cycsdSdkdGsnLHUnZWxzYXJ0aWNsZScsdSdoZWItYXJ0aWNsZScsdSdJRUVFdHJhbicsdSdpb3Bh cnQnLHUna2x1d2VyJyx1J3NjcmFydGljbGUtYmVhbWVyJyx1J3NjcmFydGNsJyx1J2V4dGFydGlj bGUnLHUncGFwZXInLHUnbXdhcnQnLHUncmV2dGV4NCcsdSdzcGllJyx1J3N2Z2xvYmFsMycsdSds dHVnYm9hdCcsdSdhZ3UtZHRkJyx1J2pncmdhJyx1J2FndW1zJyx1J2VudGNzJyx1J2VncycsdSdp am1wYycsdSdpam1wZCcsdSdzaW5nbGVjb2wtbmV3Jyx1J2RvdWJsZWNvbC1uZXcnLHUnaXNwcnMn LHUndGFydGljbGUnLHUnanNhcnRpY2xlJyx1J2phcnRpY2xlJyx1J2pzcycsdSdsaXRlcmF0ZS1h cnRpY2xlJyx1J3NpYW1sdGV4Jyx1J2NsMmVtdWx0Jyx1J2xsbmNzJyx1J3N2Z2xvYmFsJyx1J3N2 am9nJyx1J3N2cHJvYnRoJyxdLCAKICAgICAgfQoKY2xhc3MgSW1hZ2VDb25maWcob2JqZWN0KToK ICAiQ29uZmlndXJhdGlvbiBjbGFzcyBmcm9tIGNvbmZpZyBmaWxlIgoKICBmb3JtYXRzID0gewog ICAgICB1J2RlZmF1bHQnOnUnLnBuZycsIHUncmFzdGVyJzpbdScucG5nJyx1Jy5qcGcnLF0sIAog ICAgICB1J3ZlY3Rvcic6W3UnLnN2ZycsdScuZXBzJyxdLCAKICAgICAgfQoKICBzaXplID0gewog ICAgICB1J2lnbm9yZWR0ZXh0cyc6W3UnY29sJyx1J3RleHQnLHUnbGluZScsdSdwYWdlJyx1J3Ro ZWlnaHQnLHUncGhlaWdodCcsXSwgCiAgICAgIH0KCmNsYXNzIE51bWJlcmluZ0NvbmZpZyhvYmpl Y3QpOgogICJDb25maWd1cmF0aW9uIGNsYXNzIGZyb20gY29uZmlnIGZpbGUiCgogIGxheW91dHMg PSB7CiAgICAgIAogICAgICB1J29yZGVyZWQnOlt1J0NoYXB0ZXInLHUnU2VjdGlvbicsdSdTdWJz ZWN0aW9uJyx1J1N1YnN1YnNlY3Rpb24nLHUnUGFyYWdyYXBoJyxdLCAKICAgICAgdSd1bmlxdWUn Olt1J1BhcnQnLHUnQm9vaycsXSwgCiAgICAgIH0KCmNsYXNzIFN0eWxlQ29uZmlnKG9iamVjdCk6 CiAgIkNvbmZpZ3VyYXRpb24gY2xhc3MgZnJvbSBjb25maWcgZmlsZSIKCiAgcXVvdGVzID0gewog ICAgICB1J2FsZCc6dSfCuycsIHUnYWxzJzp1J+KAuicsIHUnYXJkJzp1J8KrJywgdSdhcnMnOnUn 4oC5JywgdSdlbGQnOnUn4oCcJywgCiAgICAgIHUnZWxzJzp1J+KAmCcsIHUnZXJkJzp1J+KAnScs IHUnZXJzJzp1J+KAmScsIHUnZmxkJzp1J8KrJywgdSdmbHMnOnUn4oC5JywgCiAgICAgIHUnZnJk Jzp1J8K7JywgdSdmcnMnOnUn4oC6JywgdSdnbGQnOnUn4oCeJywgdSdnbHMnOnUn4oCaJywgdSdn cmQnOnUn4oCcJywgCiAgICAgIHUnZ3JzJzp1J+KAmCcsIHUncGxkJzp1J+KAnicsIHUncGxzJzp1 J+KAmicsIHUncHJkJzp1J+KAnScsIHUncHJzJzp1J+KAmScsIAogICAgICB1J3NsZCc6dSfigJ0n LCB1J3NyZCc6dSfigJ0nLCAKICAgICAgfQoKICBzcGFjZXMgPSB7CiAgICAgIHUnXFxlbnNraXB7 fSc6dSfigIInLCB1J1xcaGZpbGx7fSc6dSc8c3BhbiBjbGFzcz0iaGZpbGwiPiA8L3NwYW4+Jywg CiAgICAgIHUnXFxoc3BhY2Uqe1xcZmlsbH0nOnUn4oCDJywgdSdcXGhzcGFjZSp7fSc6dScnLCB1 J1xcaHNwYWNle30nOnUn4oCDJywgCiAgICAgIHUnXFxuZWd0aGluc3BhY2V7fSc6dScnLCB1J1xc cXF1YWR7fSc6dSfigIPigIMnLCB1J1xccXVhZHt9Jzp1J+KAgycsIAogICAgICB1J1xcc3BhY2V7 fSc6dScmbmJzcDsnLCB1J1xcdGhpbnNwYWNle30nOnUn4oCJJywgdSd+Jzp1JyZuYnNwOycsIAog ICAgICB9CgpjbGFzcyBUYWdDb25maWcob2JqZWN0KToKICAiQ29uZmlndXJhdGlvbiBjbGFzcyBm cm9tIGNvbmZpZyBmaWxlIgoKICBiYXJyZWQgPSB7CiAgICAgIHUndW5kZXInOnUndScsIAogICAg ICB9CgogIGJveGVzID0gewogICAgICB1J0ZyYW1lZCc6dSdkaXYgY2xhc3M9ImZyYW1lZCInLCB1 J0ZyYW1lbGVzcyc6dSdkaXYgY2xhc3M9ImZyYW1lbGVzcyInLCAKICAgICAgfQoKICBmYW1pbHkg PSB7CiAgICAgIHUnc2Fucyc6dSdzcGFuIGNsYXNzPSJzYW5zIicsIHUndHlwZXdyaXRlcic6dSd0 dCcsIAogICAgICB9CgogIGxheW91dHMgPSB7CiAgICAgIHUnQ2VudGVyJzp1J2RpdicsIHUnQ2hh cHRlcic6dSdoPycsIHUnRGF0ZSc6dSdoMicsIHUnTHlYLUNvZGUnOnUncHJlJywgCiAgICAgIHUn UGFyYWdyYXBoJzp1J2RpdicsIHUnUGFydCc6dSdoMScsIHUnUXVvdGF0aW9uJzp1J2Jsb2NrcXVv dGUnLCAKICAgICAgdSdRdW90ZSc6dSdibG9ja3F1b3RlJywgdSdTZWN0aW9uJzp1J2g/JywgdSdT dWJzZWN0aW9uJzp1J2g/JywgCiAgICAgIHUnU3Vic3Vic2VjdGlvbic6dSdoPycsIAogICAgICB9 CgogIGxpc3RpdGVtcyA9IHsKICAgICAgdSdFbnVtZXJhdGUnOnUnb2wnLCB1J0l0ZW1pemUnOnUn dWwnLCAKICAgICAgfQoKICBub3RlcyA9IHsKICAgICAgdSdDb21tZW50Jzp1JycsIHUnR3JleWVk b3V0Jzp1J3NwYW4gY2xhc3M9ImdyZXllZG91dCInLCB1J05vdGUnOnUnJywgCiAgICAgIH0KCiAg c2hhcGVkID0gewogICAgICB1J2l0YWxpYyc6dSdpJywgdSdzbGFudGVkJzp1J2knLCB1J3NtYWxs Y2Fwcyc6dSdzcGFuIGNsYXNzPSJ2ZXJzYWxpdGFzIicsIAogICAgICB9CgpjbGFzcyBUcmFuc2xh dGlvbkNvbmZpZyhvYmplY3QpOgogICJDb25maWd1cmF0aW9uIGNsYXNzIGZyb20gY29uZmlnIGZp bGUiCgogIGNvbnN0YW50cyA9IHsKICAgICAgdSdCb29rJzp1J0Jvb2snLCB1J0NoYXB0ZXInOnUn Q2hhcHRlcicsIHUnUGFyYWdyYXBoJzp1J1BhcmFncmFwaCcsIAogICAgICB1J1BhcnQnOnUnUGFy dCcsIHUnU2VjdGlvbic6dSdTZWN0aW9uJywgdSdTdWJzZWN0aW9uJzp1J1N1YnNlY3Rpb24nLCAK ICAgICAgdSdTdWJzdWJzZWN0aW9uJzp1J1N1YnN1YnNlY3Rpb24nLCB1J2Fic3RyYWN0Jzp1J0Fi c3RyYWN0JywgCiAgICAgIHUnYmlibGlvZ3JhcGh5Jzp1J0JpYmxpb2dyYXBoeScsIHUnZmlndXJl Jzp1J2ZpZ3VyZScsIHUnaW5kZXgnOnUnSW5kZXgnLCAKICAgICAgdSdub21lbmNsYXR1cmUnOnUn Tm9tZW5jbGF0dXJlJywgdSd0b2MnOnUnVGFibGUgb2YgQ29udGVudHMnLCAKICAgICAgfQoKICBm bG9hdHMgPSB7CiAgICAgIHUnYWxnb3JpdGhtJzp1J0xpc3RpbmcgJywgdSdmaWd1cmUnOnUnRmln dXJlICcsIHUnbGlzdGluZyc6dSdMaXN0aW5nICcsIAogICAgICB1J3RhYmxlJzp1J1RhYmxlICcs IHUndGFibGVhdSc6dSdUYWJsZWF1ICcsIAogICAgICB9CgogIGxpc3RzID0gewogICAgICB1J2Fs Z29yaXRobSc6dSdMaXN0IG9mIExpc3RpbmdzJywgdSdmaWd1cmUnOnUnTGlzdCBvZiBGaWd1cmVz JywgCiAgICAgIHUndGFibGUnOnUnTGlzdCBvZiBUYWJsZXMnLCB1J3RhYmxlYXUnOnUnTGlzdCBv ZiBUYWJsZWF1eCcsIAogICAgICB9CgoKCmNsYXNzIENvbW1hbmRMaW5lUGFyc2VyKG9iamVjdCk6 CiAgIkEgcGFyc2VyIGZvciBydW50aW1lIG9wdGlvbnMiCgogIGRlZiBfX2luaXRfXyhzZWxmLCBv cHRpb25zKToKICAgIHNlbGYub3B0aW9ucyA9IG9wdGlvbnMKCiAgZGVmIHBhcnNlb3B0aW9ucyhz ZWxmLCBhcmdzKToKICAgICJQYXJzZSBjb21tYW5kIGxpbmUgb3B0aW9ucyIKICAgIGlmIGxlbihh cmdzKSA9PSAwOgogICAgICByZXR1cm4gTm9uZQogICAgd2hpbGUgbGVuKGFyZ3MpID4gMCBhbmQg YXJnc1swXS5zdGFydHN3aXRoKCctLScpOgogICAgICBrZXksIHZhbHVlID0gc2VsZi5yZWFkb3B0 aW9uKGFyZ3MpCiAgICAgIGlmIG5vdCBrZXk6CiAgICAgICAgcmV0dXJuICdPcHRpb24gJyArIHZh bHVlICsgJyBub3QgcmVjb2duaXplZCcKICAgICAgaWYgbm90IHZhbHVlOgogICAgICAgIHJldHVy biAnT3B0aW9uICcgKyBrZXkgKyAnIG5lZWRzIGEgdmFsdWUnCiAgICAgIHNldGF0dHIoc2VsZi5v cHRpb25zLCBrZXksIHZhbHVlKQogICAgcmV0dXJuIE5vbmUKCiAgZGVmIHJlYWRvcHRpb24oc2Vs ZiwgYXJncyk6CiAgICAiUmVhZCB0aGUga2V5IGFuZCB2YWx1ZSBmb3IgYW4gb3B0aW9uIgogICAg YXJnID0gYXJnc1swXVsyOl0KICAgIGRlbCBhcmdzWzBdCiAgICBpZiAnPScgaW4gYXJnOgogICAg ICByZXR1cm4gc2VsZi5yZWFkZXF1YWxzKGFyZywgYXJncykKICAgIGtleSA9IGFyZwogICAgaWYg bm90IGhhc2F0dHIoc2VsZi5vcHRpb25zLCBrZXkpOgogICAgICByZXR1cm4gTm9uZSwga2V5CiAg ICBjdXJyZW50ID0gZ2V0YXR0cihzZWxmLm9wdGlvbnMsIGtleSkKICAgIGlmIGN1cnJlbnQuX19j bGFzc19fID09IGJvb2w6CiAgICAgIHJldHVybiBrZXksIFRydWUKICAgICMgcmVhZCB2YWx1ZQog ICAgaWYgbGVuKGFyZ3MpID09IDA6CiAgICAgIHJldHVybiBrZXksIE5vbmUKICAgIGlmIGFyZ3Nb MF0uc3RhcnRzd2l0aCgnIicpOgogICAgICBpbml0aWFsID0gYXJnc1swXQogICAgICBkZWwgYXJn c1swXQogICAgICByZXR1cm4ga2V5LCBzZWxmLnJlYWRxdW90ZWQoYXJncywgaW5pdGlhbCkKICAg IHZhbHVlID0gYXJnc1swXQogICAgZGVsIGFyZ3NbMF0KICAgIHJldHVybiBrZXksIHZhbHVlCgog IGRlZiByZWFkcXVvdGVkKHNlbGYsIGFyZ3MsIGluaXRpYWwpOgogICAgIlJlYWQgYSB2YWx1ZSBi ZXR3ZWVuIHF1b3RlcyIKICAgIHZhbHVlID0gaW5pdGlhbFsxOl0KICAgIHdoaWxlIGxlbihhcmdz KSA+IDAgYW5kIG5vdCBhcmdzWzBdLmVuZHN3aXRoKCciJykgYW5kIG5vdCBhcmdzWzBdLnN0YXJ0 c3dpdGgoJy0tJyk6CiAgICAgIHZhbHVlICs9ICcgJyArIGFyZ3NbMF0KICAgICAgZGVsIGFyZ3Nb MF0KICAgIGlmIGxlbihhcmdzKSA9PSAwIG9yIGFyZ3NbMF0uc3RhcnRzd2l0aCgnLS0nKToKICAg ICAgcmV0dXJuIE5vbmUKICAgIHZhbHVlICs9ICcgJyArIGFyZ3NbMDotMV0KICAgIHJldHVybiB2 YWx1ZQoKICBkZWYgcmVhZGVxdWFscyhzZWxmLCBhcmcsIGFyZ3MpOgogICAgIlJlYWQgYSB2YWx1 ZSB3aXRoIGVxdWFscyIKICAgIHNwbGl0ID0gYXJnLnNwbGl0KCc9JywgMSkKICAgIGtleSA9IHNw bGl0WzBdCiAgICB2YWx1ZSA9IHNwbGl0WzFdCiAgICBpZiBub3QgdmFsdWUuc3RhcnRzd2l0aCgn IicpOgogICAgICByZXR1cm4ga2V5LCB2YWx1ZQogICAgcmV0dXJuIGtleSwgc2VsZi5yZWFkcXVv dGVkKGFyZ3MsIHZhbHVlKQoKCgpjbGFzcyBPcHRpb25zKG9iamVjdCk6CiAgIkEgc2V0IG9mIHJ1 bnRpbWUgb3B0aW9ucyIKCiAgaW5zdGFuY2UgPSBOb25lCgogIG5vY29weSA9IEZhbHNlCiAgZGVi dWcgPSBGYWxzZQogIHF1aWV0ID0gRmFsc2UKICB2ZXJzaW9uID0gRmFsc2UKICBoYXJkdmVyc2lv biA9IEZhbHNlCiAgdmVyc2lvbmRhdGUgPSBGYWxzZQogIGh0bWwgPSBGYWxzZQogIGhlbHAgPSBG YWxzZQogIHNob3dsaW5lcyA9IFRydWUKICB1bmljb2RlID0gRmFsc2UKICBjc3MgPSAnaHR0cDov L3d3dy5ub25nbnUub3JnL2VseXhlci9seXguY3NzJwogIHRpdGxlID0gTm9uZQogIGRpcmVjdG9y eSA9IE5vbmUKICBkZXN0ZGlyZWN0b3J5ID0gTm9uZQogIHRvYyA9IEZhbHNlCiAgdG9jdGFyZ2V0 ID0gJycKICBmb3JjZWZvcm1hdCA9IE5vbmUKICBseXhmb3JtYXQgPSBGYWxzZQogIHRhcmdldCA9 IE5vbmUKICBzcGxpdHBhcnQgPSBOb25lCiAgbWVtb3J5ID0gVHJ1ZQogIGxvd21lbSA9IEZhbHNl CgogIGJyYW5jaGVzID0gZGljdCgpCgogIGRlZiBfX2luaXRfXyhzZWxmKToKICAgIHNlbGYuaW52 b2tlZGFzID0gTm9uZQoKICBkZWYgcGFyc2VvcHRpb25zKHNlbGYsIGFyZ3MpOgogICAgIlBhcnNl IGNvbW1hbmQgbGluZSBvcHRpb25zIgogICAgc2VsZi5pbnZva2VkYXMgPSBvcy5wYXRoLmJhc2Vu YW1lKGFyZ3NbMF0pCiAgICBkZWwgYXJnc1swXQogICAgcGFyc2VyID0gQ29tbWFuZExpbmVQYXJz ZXIoT3B0aW9ucykKICAgIHJlc3VsdCA9IHBhcnNlci5wYXJzZW9wdGlvbnMoYXJncykKICAgIGlm IHJlc3VsdDoKICAgICAgVHJhY2UuZXJyb3IocmVzdWx0KQogICAgICBzZWxmLnVzYWdlKCkKICAg IGlmIE9wdGlvbnMuaGVscDoKICAgICAgc2VsZi51c2FnZSgpCiAgICBpZiBPcHRpb25zLnZlcnNp b246CiAgICAgIHNlbGYuc2hvd3ZlcnNpb24oKQogICAgaWYgT3B0aW9ucy5oYXJkdmVyc2lvbjoK ICAgICAgc2VsZi5zaG93aGFyZHZlcnNpb24oKQogICAgaWYgT3B0aW9ucy52ZXJzaW9uZGF0ZToK ICAgICAgc2VsZi5zaG93dmVyc2lvbmRhdGUoKQogICAgaWYgT3B0aW9ucy5seXhmb3JtYXQ6CiAg ICAgIHNlbGYuc2hvd2x5eGZvcm1hdCgpCiAgICBpZiBPcHRpb25zLnNwbGl0cGFydDoKICAgICAg dHJ5OgogICAgICAgIE9wdGlvbnMuc3BsaXRwYXJ0ID0gaW50KE9wdGlvbnMuc3BsaXRwYXJ0KQog ICAgICAgIGlmIE9wdGlvbnMuc3BsaXRwYXJ0IDw9IDA6CiAgICAgICAgICBUcmFjZS5lcnJvcign LS1zcGxpdHBhcnQgcmVxdWlyZXMgYSBudW1iZXIgYmlnZ2VyIHRoYW4gemVybycpCiAgICAgICAg ICBzZWxmLnVzYWdlKCkKICAgICAgZXhjZXB0OgogICAgICAgIFRyYWNlLmVycm9yKCctLXNwbGl0 cGFydCBuZWVkcyBhIG51bWVyaWMgYXJndW1lbnQsIG5vdCAnICsgT3B0aW9ucy5zcGxpdHBhcnQp CiAgICAgICAgc2VsZi51c2FnZSgpCiAgICBpZiBPcHRpb25zLmxvd21lbSBvciBPcHRpb25zLnRv YzoKICAgICAgT3B0aW9ucy5tZW1vcnkgPSBGYWxzZQogICAgIyBzZXQgaW4gVHJhY2UgaWYgbmVj ZXNzYXJ5CiAgICBmb3IgcGFyYW0gaW4gZGlyKE9wdGlvbnMpOgogICAgICBpZiBoYXNhdHRyKFRy YWNlLCBwYXJhbSArICdtb2RlJyk6CiAgICAgICAgc2V0YXR0cihUcmFjZSwgcGFyYW0gKyAnbW9k ZScsIGdldGF0dHIoc2VsZiwgcGFyYW0pKQoKICBkZWYgdXNhZ2Uoc2VsZik6CiAgICAiU2hvdyBj b3JyZWN0IHVzYWdlIgogICAgVHJhY2UuZXJyb3IoJ1VzYWdlOiAnICsgc2VsZi5pbnZva2VkYXMg KyAnIFtvcHRpb25zXSBbZmlsZWluXSBbZmlsZW91dF0nKQogICAgVHJhY2UuZXJyb3IoJ0NvbnZl cnQgTHlYIGlucHV0IGZpbGUgImZpbGVpbiIgdG8gSFRNTCBmaWxlICJmaWxlb3V0Ii4nKQogICAg VHJhY2UuZXJyb3IoJ0lmIGZpbGVpbiAob3IgZmlsZW91dCkgaXMgbm90IGdpdmVuIHVzZSBzdGFu ZGFyZCBpbnB1dCAob3Igb3V0cHV0KS4nKQogICAgc2VsZi5zaG93b3B0aW9ucygpCgogIGRlZiBz aG93b3B0aW9ucyhzZWxmKToKICAgICJTaG93IGFsbCBwb3NzaWJsZSBvcHRpb25zIgogICAgVHJh Y2UuZXJyb3IoJyAgVmFsaWQgb3B0aW9uczonKQogICAgVHJhY2UuZXJyb3IoJyAgICAtLW5vY29w eTogICAgICAgICAgICAgICBkaXNhYmxlcyB0aGUgY29weXJpZ2h0IG5vdGljZSBhdCB0aGUgYm90 dG9tJykKICAgIFRyYWNlLmVycm9yKCcgICAgLS1xdWlldDogICAgICAgICAgICAgICAgZGlzYWJs ZXMgYWxsIHJ1bnRpbWUgbWVzc2FnZXMnKQogICAgVHJhY2UuZXJyb3IoJyAgICAtLWRlYnVnOiAg ICAgICAgICAgICAgICBlbmFibGUgZGVidWdnaW5nIG1lc3NhZ2VzIChmb3IgZGV2ZWxvcGVycykn KQogICAgVHJhY2UuZXJyb3IoJyAgICAtLXRpdGxlICJ0aXRsZSI6ICAgICAgICBzZXQgdGhlIGdl bmVyYXRlZCBwYWdlIHRpdGxlJykKICAgIFRyYWNlLmVycm9yKCcgICAgLS1kaXJlY3RvcnkgImlt Z19kaXIiOiAgbG9vayBmb3IgaW1hZ2VzIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5JykKICAg IFRyYWNlLmVycm9yKCcgICAgLS1kZXN0ZGlyZWN0b3J5ICJkZXN0IjogcHV0IGNvbnZlcnRlZCBp bWFnZXMgaW50byB0aGlzIGRpcmVjdG9yeScpCiAgICBUcmFjZS5lcnJvcignICAgIC0tY3NzICJm aWxlLmNzcyI6ICAgICAgIHVzZSBhIGN1c3RvbSBDU1MgZmlsZScpCiAgICBUcmFjZS5lcnJvcign ICAgIC0tdmVyc2lvbjogICAgICAgICAgICAgIHNob3cgdmVyc2lvbiBudW1iZXIgYW5kIHJlbGVh c2UgZGF0ZScpCiAgICBUcmFjZS5lcnJvcignICAgIC0taHRtbDogICAgICAgICAgICAgICAgIG91 dHB1dCBIVE1MIDQuMCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IFhIVE1MJykKICAgIFRyYWNlLmVy cm9yKCcgICAgLS11bmljb2RlOiAgICAgICAgICAgICAgZnVsbCBVbmljb2RlIG91dHB1dCcpCiAg ICBUcmFjZS5lcnJvcignICAgIC0tZm9yY2Vmb3JtYXQgIi5leHQiOiAgIGZvcmNlIGltYWdlIG91 dHB1dCBmb3JtYXQnKQogICAgVHJhY2UuZXJyb3IoJyAgICAtLWx5eGZvcm1hdDogICAgICAgICAg ICByZXR1cm4gdGhlIGhpZ2hlc3QgTHlYIHZlcnNpb24gdGhhdCBjYW4gYmUnKQogICAgVHJhY2Uu ZXJyb3IoJyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQnKQogICAgVHJhY2Uu ZXJyb3IoJyAgICAtLXRvYzogICAgICAgICAgICAgICAgICBjcmVhdGUgYSB0YWJsZSBvZiBjb250 ZW50cycpCiAgICBUcmFjZS5lcnJvcignICAgIC0tdGFyZ2V0ICJmcmFtZSI6ICAgICAgIG1ha2Ug YWxsIGxpbmtzIHBvaW50IHRvIHRoZSBnaXZlbiBmcmFtZScpCiAgICBUcmFjZS5lcnJvcignICAg IC0tbG93bWVtOiAgICAgICAgICAgICAgIGRvIHRoZSBjb252ZXJzaW9uIG9uIHRoZSBmbHkgKGNv bnNlcnZlIG1lbW9yeSknKQogICAgZXhpdCgpCgogIGRlZiBzaG93dmVyc2lvbihzZWxmKToKICAg ICJSZXR1cm4gdGhlIGN1cnJlbnQgZUx5WGVyIHZlcnNpb24gc3RyaW5nIgogICAgc3RyaW5nID0g J2VMeVhlciB2ZXJzaW9uICcgKyBHZW5lcmFsQ29uZmlnLnZlcnNpb25bJ251bWJlciddCiAgICBz dHJpbmcgKz0gJyAoJyArIEdlbmVyYWxDb25maWcudmVyc2lvblsnZGF0ZSddICsgJyknCiAgICBU cmFjZS5lcnJvcihzdHJpbmcpCiAgICBleGl0KCkKCiAgZGVmIHNob3doYXJkdmVyc2lvbihzZWxm KToKICAgICJSZXR1cm4ganVzdCB0aGUgdmVyc2lvbiBzdHJpbmciCiAgICBUcmFjZS5tZXNzYWdl KEdlbmVyYWxDb25maWcudmVyc2lvblsnbnVtYmVyJ10pCiAgICBleGl0KCkKCiAgZGVmIHNob3d2 ZXJzaW9uZGF0ZShzZWxmKToKICAgICJSZXR1cm4ganVzdCB0aGUgdmVyc2lvbiBkdGUiCiAgICBU cmFjZS5tZXNzYWdlKEdlbmVyYWxDb25maWcudmVyc2lvblsnZGF0ZSddKQogICAgZXhpdCgpCgog IGRlZiBzaG93bHl4Zm9ybWF0KHNlbGYpOgogICAgIlJldHVybiBqdXN0IHRoZSBseXhmb3JtYXQg cGFyYW1ldGVyIgogICAgVHJhY2UubWVzc2FnZShHZW5lcmFsQ29uZmlnLnZlcnNpb25bJ2x5eGZv cm1hdCddKQogICAgZXhpdCgpCgpjbGFzcyBCcmFuY2hPcHRpb25zKG9iamVjdCk6CiAgIkEgc2V0 IG9mIG9wdGlvbnMgZm9yIGEgYnJhbmNoIgoKICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAg ICBzZWxmLm5hbWUgPSBuYW1lCiAgICBzZWxmLm9wdGlvbnMgPSB7J2NvbG9yJzonI2ZmZmZmZid9 CgogIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAiU2V0IGEgYnJhbmNoIG9wdGlvbiIK ICAgIGlmIG5vdCBrZXkuc3RhcnRzd2l0aChDb250YWluZXJDb25maWcuc3RyaW5nWydzdGFydGNv bW1hbmQnXSk6CiAgICAgIFRyYWNlLmVycm9yKCdJbnZhbGlkIGJyYW5jaCBvcHRpb24gJyArIGtl eSkKICAgICAgcmV0dXJuCiAgICBrZXkgPSBrZXkucmVwbGFjZShDb250YWluZXJDb25maWcuc3Ry aW5nWydzdGFydGNvbW1hbmQnXSwgJycpCiAgICBzZWxmLm9wdGlvbnNba2V5XSA9IHZhbHVlCgog IGRlZiBpc3NlbGVjdGVkKHNlbGYpOgogICAgIlJldHVybiBpZiB0aGUgYnJhbmNoIGlzIHNlbGVj dGVkIgogICAgaWYgbm90ICdzZWxlY3RlZCcgaW4gc2VsZi5vcHRpb25zOgogICAgICByZXR1cm4g RmFsc2UKICAgIHJldHVybiBzZWxmLm9wdGlvbnNbJ3NlbGVjdGVkJ10gPT0gJzEnCgogIGRlZiBf X3VuaWNvZGVfXyhzZWxmKToKICAgICJTdHJpbmcgcmVwcmVzZW50YXRpb24iCiAgICByZXR1cm4g J29wdGlvbnMgZm9yICcgKyBzZWxmLm5hbWUgKyAnOiAnICsgdW5pY29kZShzZWxmLm9wdGlvbnMp CgoKCgoKCgppbXBvcnQgY29kZWNzCgoKY2xhc3MgUGFyc2VyKG9iamVjdCk6CiAgIkEgZ2VuZXJp YyBwYXJzZXIiCgogIGRlZiBfX2luaXRfXyhzZWxmKToKICAgIHNlbGYuYmVnaW4gPSAwCiAgICBz ZWxmLnBhcmFtZXRlcnMgPSBkaWN0KCkKCiAgZGVmIHBhcnNlaGVhZGVyKHNlbGYsIHJlYWRlcik6 CiAgICAiUGFyc2UgdGhlIGhlYWRlciIKICAgIGhlYWRlciA9IHJlYWRlci5jdXJyZW50bGluZSgp LnNwbGl0KCkKICAgIHJlYWRlci5uZXh0bGluZSgpCiAgICBzZWxmLmJlZ2luID0gcmVhZGVyLmxp bmVudW1iZXIKICAgIHJldHVybiBoZWFkZXIKCiAgZGVmIHBhcnNlcGFyYW1ldGVyKHNlbGYsIHJl YWRlcik6CiAgICAiUGFyc2UgYSBwYXJhbWV0ZXIiCiAgICBpZiByZWFkZXIuY3VycmVudGxpbmUo KS5zdHJpcCgpLnN0YXJ0c3dpdGgoJzwnKToKICAgICAga2V5LCB2YWx1ZSA9IHNlbGYucGFyc2V4 bWwocmVhZGVyKQogICAgICBzZWxmLnBhcmFtZXRlcnNba2V5XSA9IHZhbHVlCiAgICAgIHJldHVy bgogICAgc3BsaXQgPSByZWFkZXIuY3VycmVudGxpbmUoKS5zdHJpcCgpLnNwbGl0KCcgJywgMSkK ICAgIHJlYWRlci5uZXh0bGluZSgpCiAgICBpZiBsZW4oc3BsaXQpID09IDA6CiAgICAgIHJldHVy bgogICAga2V5ID0gc3BsaXRbMF0KICAgIGlmIGxlbihzcGxpdCkgPT0gMToKICAgICAgc2VsZi5w YXJhbWV0ZXJzW2tleV0gPSBUcnVlCiAgICAgIHJldHVybgogICAgaWYgbm90ICciJyBpbiBzcGxp dFsxXToKICAgICAgc2VsZi5wYXJhbWV0ZXJzW2tleV0gPSBzcGxpdFsxXS5zdHJpcCgpCiAgICAg IHJldHVybgogICAgZG91Ymxlc3BsaXQgPSBzcGxpdFsxXS5zcGxpdCgnIicpCiAgICBzZWxmLnBh cmFtZXRlcnNba2V5XSA9IGRvdWJsZXNwbGl0WzFdCgogIGRlZiBwYXJzZXhtbChzZWxmLCByZWFk ZXIpOgogICAgIlBhcnNlIGEgcGFyYW1ldGVyIGluIHhtbCBmb3JtOiA8cGFyYW0gYXR0cjE9dmFs dWUuLi4+IgogICAgc3RyaXAgPSByZWFkZXIuY3VycmVudGxpbmUoKS5zdHJpcCgpCiAgICByZWFk ZXIubmV4dGxpbmUoKQogICAgaWYgbm90IHN0cmlwLmVuZHN3aXRoKCc+Jyk6CiAgICAgIFRyYWNl LmVycm9yKCdYTUwgcGFyYW1ldGVyICcgKyBzdHJpcCArICcgc2hvdWxkIGJlIDwuLi4+JykKICAg IHNwbGl0ID0gc3RyaXBbMTotMV0uc3BsaXQoKQogICAgaWYgbGVuKHNwbGl0KSA9PSAwOgogICAg ICBUcmFjZS5lcnJvcignRW1wdHkgWE1MIHBhcmFtZXRlciA8PicpCiAgICAgIHJldHVybiBOb25l LCBOb25lCiAgICBrZXkgPSBzcGxpdFswXQogICAgZGVsIHNwbGl0WzBdCiAgICBpZiBsZW4oc3Bs aXQpID09IDA6CiAgICAgIHJldHVybiBrZXksIGRpY3QoKQogICAgYXR0cnMgPSBkaWN0KCkKICAg IGZvciBhdHRyIGluIHNwbGl0OgogICAgICBpZiBub3QgJz0nIGluIGF0dHI6CiAgICAgICAgVHJh Y2UuZXJyb3IoJ0Vycm9uZW91cyBhdHRyaWJ1dGUgJyArIGF0dHIpCiAgICAgICAgYXR0ciArPSAn PSIwIicKICAgICAgcGFydHMgPSBhdHRyLnNwbGl0KCc9JykKICAgICAgYXR0cmtleSA9IHBhcnRz WzBdCiAgICAgIHZhbHVlID0gcGFydHNbMV0uc3BsaXQoJyInKVsxXQogICAgICBhdHRyc1thdHRy a2V5XSA9IHZhbHVlCiAgICByZXR1cm4ga2V5LCBhdHRycwoKICBkZWYgcGFyc2VlbmRpbmcoc2Vs ZiwgcmVhZGVyLCBwcm9jZXNzKToKICAgICJQYXJzZSB1bnRpbCB0aGUgY3VycmVudCBlbmRpbmcg aXMgZm91bmQiCiAgICB3aGlsZSBub3QgcmVhZGVyLmN1cnJlbnRsaW5lKCkuc3RhcnRzd2l0aChz ZWxmLmVuZGluZyk6CiAgICAgIHByb2Nlc3MoKQoKICBkZWYgcGFyc2Vjb250YWluZXIoc2VsZiwg cmVhZGVyLCBjb250ZW50cyk6CiAgICBjb250YWluZXIgPSBzZWxmLmZhY3RvcnkuY3JlYXRlY29u dGFpbmVyKHJlYWRlcikKICAgIGlmIGNvbnRhaW5lcjoKICAgICAgY29udGFpbmVyLnBhcmVudCA9 IHNlbGYucGFyZW50CiAgICAgIGNvbnRlbnRzLmFwcGVuZChjb250YWluZXIpCgogIGRlZiBfX3Vu aWNvZGVfXyhzZWxmKToKICAgICJSZXR1cm4gYSBkZXNjcmlwdGlvbiIKICAgIHJldHVybiBzZWxm Ll9fY2xhc3NfXy5fX25hbWVfXyArICcgKCcgKyB1bmljb2RlKHNlbGYuYmVnaW4pICsgJyknCgpj bGFzcyBMb25lQ29tbWFuZChQYXJzZXIpOgogICJBIHBhcnNlciBmb3IganVzdCBvbmUgY29tbWFu ZCBsaW5lIgoKICBkZWYgcGFyc2Uoc2VsZixyZWFkZXIpOgogICAgIlJlYWQgbm90aGluZyIKICAg IHJldHVybiBbXQoKY2xhc3MgVGV4dFBhcnNlcihQYXJzZXIpOgogICJBIHBhcnNlciBmb3IgYSBj b21tYW5kIGFuZCBhIGJpdCBvZiB0ZXh0IgoKICBzdGFjayA9IFtdCgogIGRlZiBfX2luaXRfXyhz ZWxmLCBlbmRpbmcpOgogICAgUGFyc2VyLl9faW5pdF9fKHNlbGYpCiAgICBzZWxmLmVuZGluZyA9 IGVuZGluZwogICAgc2VsZi5lbmRpbmdzID0gW10KCiAgZGVmIHBhcnNlKHNlbGYsIHJlYWRlcik6 CiAgICAiUGFyc2UgbGluZXMgYXMgbG9uZyBhcyB0aGV5IGFyZSB0ZXh0IgogICAgVGV4dFBhcnNl ci5zdGFjay5hcHBlbmQoc2VsZi5lbmRpbmcpCiAgICBzZWxmLmVuZGluZ3MgPSBUZXh0UGFyc2Vy LnN0YWNrICsgW0NvbnRhaW5lckNvbmZpZy5lbmRpbmdzWydMYXlvdXQnXSwKICAgICAgICBDb250 YWluZXJDb25maWcuZW5kaW5nc1snSW5zZXQnXSwgc2VsZi5lbmRpbmddCiAgICBjb250ZW50cyA9 IFtdCiAgICB3aGlsZSBub3Qgc2VsZi5pc2VuZGluZyhyZWFkZXIpOgogICAgICBzZWxmLnBhcnNl Y29udGFpbmVyKHJlYWRlciwgY29udGVudHMpCiAgICByZXR1cm4gY29udGVudHMKCiAgZGVmIGlz ZW5kaW5nKHNlbGYsIHJlYWRlcik6CiAgICAiQ2hlY2sgaWYgdGV4dCBpcyBlbmRpbmciCiAgICBj dXJyZW50ID0gcmVhZGVyLmN1cnJlbnRsaW5lKCkuc3BsaXQoKQogICAgaWYgbGVuKGN1cnJlbnQp ID09IDA6CiAgICAgIHJldHVybiBGYWxzZQogICAgaWYgY3VycmVudFswXSBpbiBzZWxmLmVuZGlu Z3M6CiAgICAgIGlmIGN1cnJlbnRbMF0gaW4gVGV4dFBhcnNlci5zdGFjazoKICAgICAgICBUZXh0 UGFyc2VyLnN0YWNrLnJlbW92ZShjdXJyZW50WzBdKQogICAgICBlbHNlOgogICAgICAgIFRleHRQ YXJzZXIuc3RhY2sgPSBbXQogICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIEZhbHNlCgpjbGFz cyBFeGNsdWRpbmdQYXJzZXIoUGFyc2VyKToKICAiQSBwYXJzZXIgdGhhdCBleGNsdWRlcyB0aGUg ZmluYWwgbGluZSIKCiAgZGVmIHBhcnNlKHNlbGYsIHJlYWRlcik6CiAgICAiUGFyc2UgZXZlcnl0 aGluZyB1cCB0byAoYW5kIGV4Y2x1ZGluZykgdGhlIGZpbmFsIGxpbmUiCiAgICBjb250ZW50cyA9 IFtdCiAgICBzZWxmLnBhcnNlZW5kaW5nKHJlYWRlciwgbGFtYmRhOiBzZWxmLnBhcnNlY29udGFp bmVyKHJlYWRlciwgY29udGVudHMpKQogICAgcmV0dXJuIGNvbnRlbnRzCgpjbGFzcyBCb3VuZGVk UGFyc2VyKEV4Y2x1ZGluZ1BhcnNlcik6CiAgIkEgcGFyc2VyIGJvdW5kIGJ5IGEgZmluYWwgbGlu ZSIKCiAgZGVmIHBhcnNlKHNlbGYsIHJlYWRlcik6CiAgICAiUGFyc2UgZXZlcnl0aGluZywgaW5j bHVkaW5nIHRoZSBmaW5hbCBsaW5lIgogICAgY29udGVudHMgPSBFeGNsdWRpbmdQYXJzZXIucGFy c2Uoc2VsZiwgcmVhZGVyKQogICAgIyBza2lwIGxhc3QgbGluZQogICAgcmVhZGVyLm5leHRsaW5l KCkKICAgIHJldHVybiBjb250ZW50cwoKY2xhc3MgQm91bmRlZER1bW15KFBhcnNlcik6CiAgIkEg Ym91bmQgcGFyc2VyIHRoYXQgaWdub3JlcyBldmVyeXRoaW5nIgoKICBkZWYgcGFyc2Uoc2VsZiwg cmVhZGVyKToKICAgICJQYXJzZSB0aGUgY29udGVudHMgb2YgdGhlIGNvbnRhaW5lciIKICAgIHNl bGYucGFyc2VlbmRpbmcocmVhZGVyLCBsYW1iZGE6IHJlYWRlci5uZXh0bGluZSgpKQogICAgIyBz a2lwIGxhc3QgbGluZQogICAgcmVhZGVyLm5leHRsaW5lKCkKICAgIHJldHVybiBbXQoKY2xhc3Mg U3RyaW5nUGFyc2VyKFBhcnNlcik6CiAgIlBhcnNlcyBqdXN0IGEgc3RyaW5nIgoKICBkZWYgcGFy c2VoZWFkZXIoc2VsZiwgcmVhZGVyKToKICAgICJEbyBub3RoaW5nLCBqdXN0IHRha2Ugbm90ZSIK ICAgIHNlbGYuYmVnaW4gPSByZWFkZXIubGluZW51bWJlciArIDEKICAgIHJldHVybiBbXQoKICBk ZWYgcGFyc2Uoc2VsZiwgcmVhZGVyKToKICAgICJQYXJzZSBhIHNpbmdsZSBsaW5lIgogICAgY29u dGVudHMgPSBbcmVhZGVyLmN1cnJlbnRsaW5lKCldCiAgICByZWFkZXIubmV4dGxpbmUoKQogICAg cmV0dXJuIGNvbnRlbnRzCgpjbGFzcyBJbnNldFBhcnNlcihCb3VuZGVkUGFyc2VyKToKICAiUGFy c2VzIGEgTHlYIGluc2V0IgoKICBkZWYgcGFyc2Uoc2VsZiwgcmVhZGVyKToKICAgICJQYXJzZSBp bnNldCBwYXJhbWV0ZXJzIGludG8gYSBkaWN0aW9uYXJ5IgogICAgc3RhcnRjb21tYW5kID0gQ29u dGFpbmVyQ29uZmlnLnN0cmluZ1snc3RhcnRjb21tYW5kJ10KICAgIHdoaWxlIHJlYWRlci5jdXJy ZW50bGluZSgpICE9ICcnIGFuZCBub3QgcmVhZGVyLmN1cnJlbnRsaW5lKCkuc3RhcnRzd2l0aChz dGFydGNvbW1hbmQpOgogICAgICBzZWxmLnBhcnNlcGFyYW1ldGVyKHJlYWRlcikKICAgIHJldHVy biBCb3VuZGVkUGFyc2VyLnBhcnNlKHNlbGYsIHJlYWRlcikKCmNsYXNzIEhlYWRlclBhcnNlcihQ YXJzZXIpOgogICJQYXJzZXMgdGhlIEx5WCBoZWFkZXIiCgogIGRlZiBwYXJzZShzZWxmLCByZWFk ZXIpOgogICAgIlBhcnNlIGhlYWRlciBwYXJhbWV0ZXJzIGludG8gYSBkaWN0aW9uYXJ5IgogICAg c2VsZi5wYXJzZWVuZGluZyhyZWFkZXIsIGxhbWJkYTogc2VsZi5wYXJzZWxpbmUocmVhZGVyKSkK ICAgICMgc2tpcCBsYXN0IGxpbmUKICAgIHJlYWRlci5uZXh0bGluZSgpCiAgICByZXR1cm4gW10K CiAgZGVmIHBhcnNlbGluZShzZWxmLCByZWFkZXIpOgogICAgIlBhcnNlIGEgc2luZ2xlIGxpbmUg YXMgYSBwYXJhbWV0ZXIgb3IgYXMgYSBzdGFydCIKICAgIGxpbmUgPSByZWFkZXIuY3VycmVudGxp bmUoKQogICAgaWYgbGluZS5zdGFydHN3aXRoKEhlYWRlckNvbmZpZy5wYXJhbWV0ZXJzWydicmFu Y2gnXSk6CiAgICAgIHNlbGYucGFyc2VicmFuY2gocmVhZGVyKQogICAgICByZXR1cm4KICAgICMg bm8gbWF0Y2gKICAgIHNlbGYucGFyc2VwYXJhbWV0ZXIocmVhZGVyKQoKICBkZWYgcGFyc2VicmFu Y2goc2VsZiwgcmVhZGVyKToKICAgIGJyYW5jaCA9IHJlYWRlci5jdXJyZW50bGluZSgpLnNwbGl0 KClbMV0KICAgIHJlYWRlci5uZXh0bGluZSgpCiAgICBzdWJwYXJzZXIgPSBIZWFkZXJQYXJzZXIo KS5jb21wbGV0ZShIZWFkZXJDb25maWcucGFyYW1ldGVyc1snZW5kYnJhbmNoJ10pCiAgICBzdWJw YXJzZXIucGFyc2UocmVhZGVyKQogICAgb3B0aW9ucyA9IEJyYW5jaE9wdGlvbnMoYnJhbmNoKQog ICAgZm9yIGtleSBpbiBzdWJwYXJzZXIucGFyYW1ldGVyczoKICAgICAgb3B0aW9ucy5zZXQoa2V5 LCBzdWJwYXJzZXIucGFyYW1ldGVyc1trZXldKQogICAgT3B0aW9ucy5icmFuY2hlc1ticmFuY2hd ID0gb3B0aW9ucwoKICBkZWYgY29tcGxldGUoc2VsZiwgZW5kaW5nKToKICAgIHNlbGYuZW5kaW5n ID0gZW5kaW5nCiAgICByZXR1cm4gc2VsZgoKCgoKaW1wb3J0IGNvZGVjcwppbXBvcnQgZGF0ZXRp bWUKCgpjbGFzcyBFbXB0eU91dHB1dChvYmplY3QpOgogICJUaGUgb3V0cHV0IGZvciBzb21lIGNv bnRhaW5lciIKCiAgZGVmIGdldGh0bWwoc2VsZiwgY29udGFpbmVyKToKICAgICJSZXR1cm4gZW1w dHkgSFRNTCBjb2RlIgogICAgcmV0dXJuIFtdCgpjbGFzcyBGaXhlZE91dHB1dChvYmplY3QpOgog ICJGaXhlZCBvdXRwdXQiCgogIGRlZiBnZXRodG1sKHNlbGYsIGNvbnRhaW5lcik6CiAgICAiUmV0 dXJuIGNvbnN0YW50IEhUTUwgY29kZSIKICAgIHJldHVybiBjb250YWluZXIuaHRtbAoKY2xhc3Mg Q29udGVudHNPdXRwdXQob2JqZWN0KToKICAiT3V0cHV0cyB0aGUgY29udGVudHMgY29udmVydGVk IHRvIEhUTUwiCgogIGRlZiBnZXRodG1sKHNlbGYsIGNvbnRhaW5lcik6CiAgICAiUmV0dXJuIHRo ZSBIVE1MIGNvZGUiCiAgICBodG1sID0gW10KICAgIGlmIGNvbnRhaW5lci5jb250ZW50cyA9PSBO b25lOgogICAgICByZXR1cm4gaHRtbAogICAgZm9yIGVsZW1lbnQgaW4gY29udGFpbmVyLmNvbnRl bnRzOgogICAgICBpZiBub3QgaGFzYXR0cihlbGVtZW50LCAnZ2V0aHRtbCcpOgogICAgICAgIFRy YWNlLmVycm9yKCdObyBodG1sIGluICcgKyBlbGVtZW50Ll9fY2xhc3NfXy5fX25hbWVfXyArICc6 ICcgKyB1bmljb2RlKGVsZW1lbnQpKQogICAgICAgIHJldHVybiBodG1sCiAgICAgIGh0bWwgKz0g ZWxlbWVudC5nZXRodG1sKCkKICAgIHJldHVybiBodG1sCgpjbGFzcyBUYWdnZWRPdXRwdXQoQ29u dGVudHNPdXRwdXQpOgogICJPdXRwdXRzIGFuIEhUTUwgdGFnIHN1cnJvdW5kaW5nIHRoZSBjb250 ZW50cyIKCiAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgc2VsZi5icmVha2xpbmVzID0gRmFsc2UK CiAgZGVmIHNldHRhZyhzZWxmLCB0YWcsIGJyZWFrbGluZXM9RmFsc2UpOgogICAgIlNldCB0aGUg dmFsdWUgZm9yIHRoZSB0YWciCiAgICBzZWxmLnRhZyA9IHRhZwogICAgc2VsZi5icmVha2xpbmVz ID0gYnJlYWtsaW5lcwogICAgcmV0dXJuIHNlbGYKCiAgZGVmIHNldGJyZWFrbGluZXMoc2VsZiwg YnJlYWtsaW5lcyk6CiAgICAiU2V0IHRoZSB2YWx1ZSBmb3IgYnJlYWtsaW5lcyIKICAgIHNlbGYu YnJlYWtsaW5lcyA9IGJyZWFrbGluZXMKICAgIHJldHVybiBzZWxmCgogIGRlZiBnZXRodG1sKHNl bGYsIGNvbnRhaW5lcik6CiAgICAiUmV0dXJuIHRoZSBIVE1MIGNvZGUiCiAgICBodG1sID0gW3Nl bGYuZ2V0b3Blbihjb250YWluZXIpXQogICAgaHRtbCArPSBDb250ZW50c091dHB1dC5nZXRodG1s KHNlbGYsIGNvbnRhaW5lcikKICAgIGh0bWwuYXBwZW5kKHNlbGYuZ2V0Y2xvc2UoY29udGFpbmVy KSkKICAgIHJldHVybiBodG1sCgogIGRlZiBnZXRvcGVuKHNlbGYsIGNvbnRhaW5lcik6CiAgICAi R2V0IG9wZW5pbmcgbGluZSIKICAgIGlmIHNlbGYudGFnID09ICcnOgogICAgICByZXR1cm4gJycK ICAgIG9wZW4gPSAnPCcgKyBzZWxmLnRhZyArICc+JwogICAgaWYgc2VsZi5icmVha2xpbmVzOgog ICAgICByZXR1cm4gJ1xuJyArIG9wZW4gKyAnXG4nCiAgICByZXR1cm4gb3BlbgoKICBkZWYgZ2V0 Y2xvc2Uoc2VsZiwgY29udGFpbmVyKToKICAgICJHZXQgY2xvc2luZyBsaW5lIgogICAgaWYgc2Vs Zi50YWcgPT0gJyc6CiAgICAgIHJldHVybiAnJwogICAgY2xvc2UgPSAnPC8nICsgc2VsZi50YWcu c3BsaXQoKVswXSArICc+JwogICAgaWYgc2VsZi5icmVha2xpbmVzOgogICAgICByZXR1cm4gJ1xu JyArIGNsb3NlCiAgICByZXR1cm4gY2xvc2UKCmNsYXNzIFN0cmluZ091dHB1dChvYmplY3QpOgog ICJSZXR1cm5zIGEgYmFyZSBzdHJpbmcgYXMgb3V0cHV0IgoKICBkZWYgZ2V0aHRtbChzZWxmLCBj b250YWluZXIpOgogICAgIlJldHVybiBhIGJhcmUgc3RyaW5nIgogICAgcmV0dXJuIFtjb250YWlu ZXIuc3RyaW5nXQoKY2xhc3MgSGVhZGVyT3V0cHV0KG9iamVjdCk6CiAgIlJldHVybnMgdGhlIEhU TUwgaGVhZGVycyIKCiAgZGVmIGdldGh0bWwoc2VsZiwgY29udGFpbmVyKToKICAgICJSZXR1cm4g YSBjb25zdGFudCBoZWFkZXIiCiAgICBpZiBub3QgT3B0aW9ucy5odG1sOgogICAgICBodG1sID0g W3UnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz5cbiddCiAgICAgIGh0bWwu YXBwZW5kKHUnPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJh bnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRy YW5zaXRpb25hbC5kdGQiPlxuJykKICAgICAgaHRtbC5hcHBlbmQodSc8aHRtbCB4bWxucz0iaHR0 cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+XG4nKQog ICAgZWxzZToKICAgICAgaHRtbCA9IFt1JzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9E VEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1s NC9sb29zZS5kdGQiPlxuJ10KICAgICAgaHRtbC5hcHBlbmQodSc8aHRtbCBsYW5nPSJlbiI+XG4n KQogICAgaHRtbC5hcHBlbmQodSc8aGVhZD5cbicpCiAgICBodG1sLmFwcGVuZCh1JzxtZXRhIGh0 dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04 Ii8+XG4nKQogICAgaHRtbC5hcHBlbmQodSc8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9 Imh0dHA6Ly93d3cubm9uZ251Lm9yZy9lbHl4ZXIvIi8+XG4nKQogICAgaHRtbC5hcHBlbmQodSc8 bWV0YSBuYW1lPSJjcmVhdGUtZGF0ZSIgY29udGVudD0iJyArIGRhdGV0aW1lLmRhdGUudG9kYXko KS5pc29mb3JtYXQoKSArICciLz5cbicpCiAgICBodG1sLmFwcGVuZCh1JzxsaW5rIHJlbD0ic3R5 bGVzaGVldCIgaHJlZj0iJyArIE9wdGlvbnMuY3NzICsgJyIgdHlwZT0idGV4dC9jc3MiIG1lZGlh PSJzY3JlZW4iLz5cbicpCiAgICBodG1sICs9IFRpdGxlT3V0cHV0KCkuZ2V0aHRtbChjb250YWlu ZXIpCiAgICBodG1sLmFwcGVuZCgnPC9oZWFkPlxuJykKICAgIGh0bWwuYXBwZW5kKCc8Ym9keT5c bicpCiAgICBodG1sLmFwcGVuZCgnPGRpdiBpZD0iZ2xvYmFsV3JhcHBlciI+XG4nKQogICAgcmV0 dXJuIGh0bWwKCmNsYXNzIFRpdGxlT3V0cHV0KG9iamVjdCk6CiAgIlJldHVybiB0aGUgSFRNTCB0 aXRsZSB0YWciCgogIHBkZnRpdGxlID0gTm9uZQogIHRpdGxlID0gTm9uZQoKICBkZWYgZ2V0aHRt bChzZWxmLCBjb250YWluZXIpOgogICAgIlJldHVybiB0aGUgdGl0bGUgdGFnIgogICAgcmV0dXJu IFsnPHRpdGxlPicgKyBzZWxmLmdldHRpdGxlKCkgKyAnPC90aXRsZT5cbiddCgogIGRlZiBnZXR0 aXRsZShzZWxmKToKICAgICJSZXR1cm4gdGhlIGNvcnJlY3QgdGl0bGUgZnJvbSB0aGUgb3B0aW9u IG9yIHRoZSBQREYgdGl0bGUiCiAgICBpZiBPcHRpb25zLnRpdGxlOgogICAgICByZXR1cm4gT3B0 aW9ucy50aXRsZQogICAgaWYgVGl0bGVPdXRwdXQudGl0bGU6CiAgICAgIHJldHVybiBUaXRsZU91 dHB1dC50aXRsZQogICAgaWYgVGl0bGVPdXRwdXQucGRmdGl0bGU6CiAgICAgIHJldHVybiBUaXRs ZU91dHB1dC5wZGZ0aXRsZQogICAgcmV0dXJuICdDb252ZXJ0ZWQgZG9jdW1lbnQnCgpjbGFzcyBG b290ZXJPdXRwdXQob2JqZWN0KToKICAiUmV0dXJuIHRoZSBIVE1MIGNvZGUgZm9yIHRoZSBmb290 ZXIiCgogIGF1dGhvciA9IE5vbmUKCiAgZGVmIGdldGh0bWwoc2VsZiwgY29udGFpbmVyKToKICAg ICJGb290ZXIgSFRNTCIKICAgIGh0bWwgPSBbXQogICAgaHRtbC5hcHBlbmQoJ1xuXG4nKQogICAg aWYgRm9vdGVyT3V0cHV0LmF1dGhvciBhbmQgbm90IE9wdGlvbnMubm9jb3B5OgogICAgICBodG1s LmFwcGVuZCgnPGhyLz5cbicpCiAgICAgIHllYXIgPSBkYXRldGltZS5kYXRlLnRvZGF5KCkueWVh cgogICAgICBodG1sLmFwcGVuZCgnPHA+Q29weXJpZ2h0IChDKSAnICsgdW5pY29kZSh5ZWFyKSAr ICcgJyArIEZvb3Rlck91dHB1dC5hdXRob3IKICAgICAgICAgICsgJzwvcD5cbicpCiAgICBodG1s LmFwcGVuZCgnPC9kaXY+XG4nKQogICAgaHRtbC5hcHBlbmQoJzwvYm9keT5cbicpCiAgICBodG1s LmFwcGVuZCgnPC9odG1sPlxuJykKICAgIHJldHVybiBodG1sCgoKCgoKCgoKCmNsYXNzIENvbnRh aW5lcihvYmplY3QpOgogICJBIGNvbnRhaW5lciBmb3IgdGV4dCBhbmQgb2JqZWN0cyBpbiBhIGx5 eCBmaWxlIgoKICBkZWYgX19pbml0X18oc2VsZik6CiAgICBzZWxmLmNvbnRlbnRzID0gbGlzdCgp CgogIGRlZiBwcm9jZXNzKHNlbGYpOgogICAgIlByb2Nlc3MgY29udGVudHMiCiAgICBwYXNzCgog IGRlZiBnZXRodG1sKHNlbGYpOgogICAgIkdldCB0aGUgcmVzdWx0aW5nIEhUTUwiCiAgICBodG1s ID0gc2VsZi5vdXRwdXQuZ2V0aHRtbChzZWxmKQogICAgaWYgaXNpbnN0YW5jZShodG1sLCBiYXNl c3RyaW5nKToKICAgICAgVHJhY2UuZXJyb3IoJ1JhdyBzdHJpbmcgJyArIGh0bWwpCiAgICAgIGh0 bWwgPSBbaHRtbF0KICAgIGlmIE9wdGlvbnMuaHRtbDoKICAgICAgc2VsZi5lc2NhcGVhbGwoaHRt bCwgRXNjYXBlQ29uZmlnLmh0bWwpCiAgICBpZiBub3QgT3B0aW9ucy51bmljb2RlOgogICAgICBz ZWxmLmVzY2FwZWFsbChodG1sLCBFc2NhcGVDb25maWcubm9udW5pY29kZSkKICAgIHJldHVybiBo dG1sCgogIGRlZiBlc2NhcGVhbGwoc2VsZiwgbGluZXMsIHJlcGxhY2VtZW50cyk6CiAgICAiRXNj YXBlIGFsbCBsaW5lcyBpbiBhbiBhcnJheSB3aXRoIHRoZSByZXBsYWNlbWVudHMiCiAgICBmb3Ig aW5kZXgsIGxpbmUgaW4gZW51bWVyYXRlKGxpbmVzKToKICAgICAgbGluZXNbaW5kZXhdID0gc2Vs Zi5lc2NhcGUobGluZSwgcmVwbGFjZW1lbnRzKQoKICBkZWYgZXNjYXBlKHNlbGYsIGxpbmUsIHJl cGxhY2VtZW50cyA9IEVzY2FwZUNvbmZpZy5lbnRpdGllcyk6CiAgICAiRXNjYXBlIGEgbGluZSB3 aXRoIHJlcGxhY2VtZW50cyBmcm9tIGEgbWFwIgogICAgcGllY2VzID0gcmVwbGFjZW1lbnRzLmtl eXMoKQogICAgIyBkbyB0aGVtIGluIG9yZGVyCiAgICBwaWVjZXMuc29ydCgpCiAgICBmb3IgcGll Y2UgaW4gcGllY2VzOgogICAgICBpZiBwaWVjZSBpbiBsaW5lOgogICAgICAgIGxpbmUgPSBsaW5l LnJlcGxhY2UocGllY2UsIHJlcGxhY2VtZW50c1twaWVjZV0pCiAgICByZXR1cm4gbGluZQoKICBk ZWYgc2VhcmNoYWxsKHNlbGYsIHR5cGUpOgogICAgIlNlYXJjaCBmb3IgYWxsIGVtYmVkZGVkIGNv bnRhaW5lcnMgb2YgYSBnaXZlbiB0eXBlIgogICAgbGlzdCA9IFtdCiAgICBzZWxmLnNlYXJjaHBy b2Nlc3ModHlwZSwgbGFtYmRhIGNvbnRhaW5lcjogbGlzdC5hcHBlbmQoY29udGFpbmVyKSkKICAg IHJldHVybiBsaXN0CgogIGRlZiBzZWFyY2hyZW1vdmUoc2VsZiwgdHlwZSk6CiAgICAiU2VhcmNo IGZvciBhbGwgY29udGFpbmVycyBvZiBhIHR5cGUgYW5kIHJlbW92ZSB0aGVtIgogICAgbGlzdCA9 IFtdCiAgICBzZWxmLnNlYXJjaHByb2Nlc3ModHlwZSwgbGFtYmRhIGNvbnRhaW5lcjogc2VsZi5h cHBlbmRyZW1vdmUobGlzdCwgY29udGFpbmVyKSkKICAgIHJldHVybiBsaXN0CgogIGRlZiBhcHBl bmRyZW1vdmUoc2VsZiwgbGlzdCwgY29udGFpbmVyKToKICAgICJBcHBlbmQgdG8gYSBsaXN0IGFu ZCByZW1vdmUgZnJvbSBvd24gY29udGVudHMiCiAgICBsaXN0LmFwcGVuZChjb250YWluZXIpCiAg ICBjb250YWluZXIucGFyZW50LmNvbnRlbnRzLnJlbW92ZShjb250YWluZXIpCgogIGRlZiBzZWFy Y2hwcm9jZXNzKHNlbGYsIHR5cGUsIHByb2Nlc3MpOgogICAgIlNlYXJjaCBmb3IgZWxlbWVudHMg b2YgYSBnaXZlbiB0eXBlIGFuZCBwcm9jZXNzIHRoZW0iCiAgICBzZWxmLmxvY2F0ZXByb2Nlc3Mo bGFtYmRhIGNvbnRhaW5lcjogaXNpbnN0YW5jZShjb250YWluZXIsIHR5cGUpLCBwcm9jZXNzKQoK ICBkZWYgbG9jYXRlcHJvY2VzcyhzZWxmLCBsb2NhdGUsIHByb2Nlc3MpOgogICAgIlNlYXJjaCBm b3IgYWxsIGVtYmVkZGVkIGNvbnRhaW5lcnMgYW5kIHByb2Nlc3MgdGhlbSIKICAgIGZvciBjb250 YWluZXIgaW4gc2VsZi5jb250ZW50czoKICAgICAgY29udGFpbmVyLmxvY2F0ZXByb2Nlc3MobG9j YXRlLCBwcm9jZXNzKQogICAgICBpZiBsb2NhdGUoY29udGFpbmVyKToKICAgICAgICBwcm9jZXNz KGNvbnRhaW5lcikKCiAgZGVmIGV4dHJhY3R0ZXh0KHNlbGYpOgogICAgIlNlYXJjaCBmb3IgYWxs IHRoZSBzdHJpbmdzIGFuZCBleHRyYWN0IHRoZSB0ZXh0IHRoZXkgY29udGFpbiIKICAgIHRleHQg PSAnJwogICAgc3RyaW5ncyA9IHNlbGYuc2VhcmNoYWxsKFN0cmluZ0NvbnRhaW5lcikKICAgIGZv ciBzdHJpbmcgaW4gc3RyaW5nczoKICAgICAgdGV4dCArPSBzdHJpbmcuc3RyaW5nCiAgICByZXR1 cm4gdGV4dAoKICBkZWYgZ3JvdXAoc2VsZiwgaW5kZXgsIGdyb3VwLCBpc2luZ3JvdXApOgogICAg Ikdyb3VwIHNvbWUgYWRqb2luaW5nIGVsZW1lbnRzIGludG8gYSBncm91cCIKICAgIGlmIGluZGV4 ID49IGxlbihzZWxmLmNvbnRlbnRzKToKICAgICAgcmV0dXJuCiAgICBpZiBoYXNhdHRyKHNlbGYu Y29udGVudHNbaW5kZXhdLCAnZ3JvdXBlZCcpOgogICAgICByZXR1cm4KICAgIHdoaWxlIGluZGV4 IDwgbGVuKHNlbGYuY29udGVudHMpIGFuZCBpc2luZ3JvdXAoc2VsZi5jb250ZW50c1tpbmRleF0p OgogICAgICBzZWxmLmNvbnRlbnRzW2luZGV4XS5ncm91cGVkID0gVHJ1ZQogICAgICBncm91cC5j b250ZW50cy5hcHBlbmQoc2VsZi5jb250ZW50c1tpbmRleF0pCiAgICAgIHNlbGYuY29udGVudHMu cG9wKGluZGV4KQogICAgc2VsZi5jb250ZW50cy5pbnNlcnQoaW5kZXgsIGdyb3VwKQoKICBkZWYg cmVtb3ZlKHNlbGYsIGluZGV4KToKICAgICJSZW1vdmUgYSBjb250YWluZXIgYnV0IGxlYXZlIGl0 cyBjb250ZW50cyIKICAgIGNvbnRhaW5lciA9IHNlbGYuY29udGVudHNbaW5kZXhdCiAgICBzZWxm LmNvbnRlbnRzLnBvcChpbmRleCkKICAgIHdoaWxlIGxlbihjb250YWluZXIuY29udGVudHMpID4g MDoKICAgICAgc2VsZi5jb250ZW50cy5pbnNlcnQoaW5kZXgsIGNvbnRhaW5lci5jb250ZW50cy5w b3AoKSkKCiAgZGVmIGRlYnVnKHNlbGYsIGxldmVsID0gMCk6CiAgICAiU2hvdyB0aGUgY29udGVu dHMgaW4gZGVidWcgbW9kZSIKICAgIGlmIG5vdCBUcmFjZS5kZWJ1Z21vZGU6CiAgICAgIHJldHVy bgogICAgVHJhY2UuZGVidWcoJyAgJyAqIGxldmVsICsgdW5pY29kZShzZWxmKSkKICAgIGZvciBl bGVtZW50IGluIHNlbGYuY29udGVudHM6CiAgICAgIGVsZW1lbnQuZGVidWcobGV2ZWwgKyAxKQoK ICBkZWYgcGFyc2Vsc3RwYXJhbXMoc2VsZik6CiAgICAiUGFyc2UgYSBtdWx0aXBsZSBwYXJhbWV0 ZXIgbHN0cGFyYW1zLiIKICAgIGlmIG5vdCAnbHN0cGFyYW1zJyBpbiBzZWxmLnBhcmFtZXRlcnM6 CiAgICAgIHJldHVybgogICAgcGFyYW1saXN0ID0gc2VsZi5wYXJhbWV0ZXJzWydsc3RwYXJhbXMn XS5zcGxpdCgnLCcpCiAgICBmb3IgcGFyYW0gaW4gcGFyYW1saXN0OgogICAgICBpZiBub3QgJz0n IGluIHBhcmFtOgogICAgICAgIFRyYWNlLmVycm9yKCdJbnZhbGlkIGxpc3RpbmcgcGFyYW1ldGVy ICcgKyBwYXJhbSkKICAgICAgZWxzZToKICAgICAgICBrZXksIHZhbHVlID0gcGFyYW0uc3BsaXQo Jz0nLCAxKQogICAgICAgIHNlbGYucGFyYW1ldGVyc1trZXldID0gdmFsdWUKCiAgZGVmIHRyZWUo c2VsZiwgbGV2ZWwgPSAwKToKICAgICJTaG93IGluIGEgdHJlZSIKICAgIFRyYWNlLmRlYnVnKCIg ICIgKiBsZXZlbCArIHVuaWNvZGUoc2VsZikpCiAgICBmb3IgY29udGFpbmVyIGluIHNlbGYuY29u dGVudHM6CiAgICAgIGNvbnRhaW5lci50cmVlKGxldmVsICsgMSkKCiAgZGVmIF9fdW5pY29kZV9f KHNlbGYpOgogICAgIkdldCBhIGRlc2NyaXB0aW9uIgogICAgaWYgbm90IGhhc2F0dHIoc2VsZiwg J2JlZ2luJyk6CiAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXwogICAgcmV0dXJu IHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgJ0AnICsgdW5pY29kZShzZWxmLmJlZ2luKQoKY2xh c3MgQmxhY2tCb3goQ29udGFpbmVyKToKICAiQSBjb250YWluZXIgdGhhdCBkb2VzIG5vdCBvdXRw dXQgYW55dGhpbmciCgogIGRlZiBfX2luaXRfXyhzZWxmKToKICAgIHNlbGYucGFyc2VyID0gTG9u ZUNvbW1hbmQoKQogICAgc2VsZi5vdXRwdXQgPSBFbXB0eU91dHB1dCgpCiAgICBzZWxmLmNvbnRl bnRzID0gW10KCmNsYXNzIEx5WEZvcm1hdChCbGFja0JveCk6CiAgIlJlYWQgdGhlIGx5eGZvcm1h dCBjb21tYW5kIgoKICBkZWYgcHJvY2VzcyhzZWxmKToKICAgICJTaG93IHdhcm5pbmcgaWYgdmVy c2lvbiA8IDI3NiIKICAgIHZlcnNpb24gPSBpbnQoc2VsZi5oZWFkZXJbMV0pCiAgICBpZiB2ZXJz aW9uIDwgMjc2OgogICAgICBUcmFjZS5lcnJvcignV2FybmluZzogdW5zdXBwb3J0ZWQgZm9ybWF0 IHZlcnNpb24gJyArIHN0cih2ZXJzaW9uKSkKCmNsYXNzIFN0cmluZ0NvbnRhaW5lcihDb250YWlu ZXIpOgogICJBIGNvbnRhaW5lciBmb3IgYSBzaW5nbGUgc3RyaW5nIgoKICBkZWYgX19pbml0X18o c2VsZik6CiAgICBzZWxmLnBhcnNlciA9IFN0cmluZ1BhcnNlcigpCiAgICBzZWxmLm91dHB1dCA9 IFN0cmluZ091dHB1dCgpCiAgICBzZWxmLnN0cmluZyA9ICcnCgogIGRlZiBwcm9jZXNzKHNlbGYp OgogICAgIlJlcGxhY2Ugc3BlY2lhbCBjaGFycyBmcm9tIHRoZSBjb250ZW50cy4iCiAgICBzZWxm LnN0cmluZyA9IHNlbGYucmVwbGFjZXNwZWNpYWwoc2VsZi5jb250ZW50c1swXSkKICAgIHNlbGYu Y29udGVudHMgPSBbXQoKICBkZWYgcmVwbGFjZXNwZWNpYWwoc2VsZiwgbGluZSk6CiAgICAiUmVw bGFjZSBhbGwgc3BlY2lhbCBjaGFycyBmcm9tIGEgbGluZSIKICAgIHJlcGxhY2VkID0gc2VsZi5l c2NhcGUobGluZSwgRXNjYXBlQ29uZmlnLmVudGl0aWVzKQogICAgcmVwbGFjZWQgPSBzZWxmLmNo YW5nZWxpbmUocmVwbGFjZWQpCiAgICBpZiBDb250YWluZXJDb25maWcuc3RyaW5nWydzdGFydGNv bW1hbmQnXSBpbiByZXBsYWNlZCBhbmQgbGVuKHJlcGxhY2VkKSA+IDE6CiAgICAgICMgdW5wcm9j ZXNzZWQgY29tbWFuZHMKICAgICAgbWVzc2FnZSA9ICdVbmtub3duIGNvbW1hbmQgYXQgJyArIHVu aWNvZGUoc2VsZi5wYXJzZXIuYmVnaW4pICsgJzogJwogICAgICBUcmFjZS5lcnJvcihtZXNzYWdl ICsgcmVwbGFjZWQuc3RyaXAoKSkKICAgIHJldHVybiByZXBsYWNlZAoKICBkZWYgY2hhbmdlbGlu ZShzZWxmLCBsaW5lKToKICAgIGxpbmUgPSBzZWxmLmVzY2FwZShsaW5lLCBFc2NhcGVDb25maWcu Y2hhcnMpCiAgICBpZiBub3QgQ29udGFpbmVyQ29uZmlnLnN0cmluZ1snc3RhcnRjb21tYW5kJ10g aW4gbGluZToKICAgICAgcmV0dXJuIGxpbmUKICAgIGxpbmUgPSBzZWxmLmVzY2FwZShsaW5lLCBF c2NhcGVDb25maWcuY29tbWFuZHMpCiAgICByZXR1cm4gbGluZQogIAogIGRlZiBfX3VuaWNvZGVf XyhzZWxmKToKICAgIHJlc3VsdCA9ICdTdHJpbmdDb250YWluZXJAJyArIHVuaWNvZGUoc2VsZi5i ZWdpbikKICAgIHJldHVybiByZXN1bHQgKyAnICgnICsgc2VsZi5zdHJpbmcuc3RyaXAoKVs6MTVd ICsgJy4uLiknCgpjbGFzcyBDb25zdGFudChTdHJpbmdDb250YWluZXIpOgogICJBIGNvbnN0YW50 IHN0cmluZyIKCiAgZGVmIF9faW5pdF9fKHNlbGYsIHRleHQpOgogICAgc2VsZi5jb250ZW50cyA9 IFtdCiAgICBzZWxmLnN0cmluZyA9IHRleHQKICAgIHNlbGYub3V0cHV0ID0gU3RyaW5nT3V0cHV0 KCkKCiAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgogICAgcmV0dXJuICdDb25zdGFudDogJyArIHNl bGYuc3RyaW5nCgpjbGFzcyBUYWdnZWRUZXh0KENvbnRhaW5lcik6CiAgIlRleHQgaW5zaWRlIGEg dGFnIgoKICBkZWYgX19pbml0X18oc2VsZik6CiAgICBlbmRpbmcgPSBOb25lCiAgICBpZiBzZWxm Ll9fY2xhc3NfXy5fX25hbWVfXyBpbiBDb250YWluZXJDb25maWcuZW5kaW5nczoKICAgICAgZW5k aW5nID0gQ29udGFpbmVyQ29uZmlnLmVuZGluZ3Nbc2VsZi5fX2NsYXNzX18uX19uYW1lX19dCiAg ICBzZWxmLnBhcnNlciA9IFRleHRQYXJzZXIoZW5kaW5nKQogICAgc2VsZi5vdXRwdXQgPSBUYWdn ZWRPdXRwdXQoKQoKICBkZWYgY29tcGxldGUoc2VsZiwgY29udGVudHMsIHRhZywgYnJlYWtsaW5l cz1GYWxzZSk6CiAgICAiQ29tcGxldGUgdGhlIHRhZ2dlZCB0ZXh0IGFuZCByZXR1cm4gaXQiCiAg ICBzZWxmLmNvbnRlbnRzID0gY29udGVudHMKICAgIHNlbGYub3V0cHV0LnRhZyA9IHRhZwogICAg c2VsZi5vdXRwdXQuYnJlYWtsaW5lcyA9IGJyZWFrbGluZXMKICAgIHJldHVybiBzZWxmCgogIGRl ZiBjb25zdGFudChzZWxmLCB0ZXh0LCB0YWcsIGJyZWFrbGluZXM9RmFsc2UpOgogICAgIkNvbXBs ZXRlIHRoZSB0YWdnZWQgdGV4dCB3aXRoIGEgY29uc3RhbnQiCiAgICBjb25zdGFudCA9IENvbnN0 YW50KHRleHQpCiAgICByZXR1cm4gc2VsZi5jb21wbGV0ZShbY29uc3RhbnRdLCB0YWcsIGJyZWFr bGluZXMpCgogIGRlZiBfX3VuaWNvZGVfXyhzZWxmKToKICAgIHJldHVybiAnVGFnZ2VkIDwnICsg c2VsZi5vdXRwdXQudGFnICsgJz4nCgoKCmNsYXNzIFF1b3RlQ29udGFpbmVyKENvbnRhaW5lcik6 CiAgIkEgY29udGFpbmVyIGZvciBhIHByZXR0eSBxdW90ZSIKCiAgZGVmIF9faW5pdF9fKHNlbGYp OgogICAgc2VsZi5wYXJzZXIgPSBCb3VuZGVkUGFyc2VyKCkKICAgIHNlbGYub3V0cHV0ID0gRml4 ZWRPdXRwdXQoKQoKICBkZWYgcHJvY2VzcyhzZWxmKToKICAgICJQcm9jZXNzIGNvbnRlbnRzIgog ICAgc2VsZi50eXBlID0gc2VsZi5oZWFkZXJbMl0KICAgIGlmIG5vdCBzZWxmLnR5cGUgaW4gU3R5 bGVDb25maWcucXVvdGVzOgogICAgICBUcmFjZS5lcnJvcignUXVvdGUgdHlwZSAnICsgc2VsZi50 eXBlICsgJyBub3QgZm91bmQnKQogICAgICBzZWxmLmh0bWwgPSBbJyInXQogICAgICByZXR1cm4K ICAgIHNlbGYuaHRtbCA9IFtTdHlsZUNvbmZpZy5xdW90ZXNbc2VsZi50eXBlXV0KCmNsYXNzIEx5 WExpbmUoQ29udGFpbmVyKToKICAiQSBMeXggbGluZSIKCiAgZGVmIF9faW5pdF9fKHNlbGYpOgog ICAgc2VsZi5wYXJzZXIgPSBMb25lQ29tbWFuZCgpCiAgICBzZWxmLm91dHB1dCA9IEZpeGVkT3V0 cHV0KCkKCiAgZGVmIHByb2Nlc3Moc2VsZik6CiAgICBzZWxmLmh0bWwgPSBbJzxociBjbGFzcz0i bGluZSIgLz4nXQoKY2xhc3MgRW1waGF0aWNUZXh0KFRhZ2dlZFRleHQpOgogICJUZXh0IHdpdGgg ZW1waGF0aWMgbW9kZSIKCiAgZGVmIHByb2Nlc3Moc2VsZik6CiAgICBzZWxmLm91dHB1dC50YWcg PSAnaScKCmNsYXNzIFNoYXBlZFRleHQoVGFnZ2VkVGV4dCk6CiAgIlRleHQgc2hhcGVkIChpdGFs aWMsIHNsYW50ZWQpIgoKICBkZWYgcHJvY2VzcyhzZWxmKToKICAgIHNlbGYudHlwZSA9IHNlbGYu aGVhZGVyWzFdCiAgICBpZiBub3Qgc2VsZi50eXBlIGluIFRhZ0NvbmZpZy5zaGFwZWQ6CiAgICAg IFRyYWNlLmVycm9yKCdVbnJlY29nbml6ZWQgc2hhcGUgJyArIHNlbGYuaGVhZGVyWzFdKQogICAg ICBzZWxmLm91dHB1dC50YWcgPSAnc3BhbicKICAgICAgcmV0dXJuCiAgICBzZWxmLm91dHB1dC50 YWcgPSBUYWdDb25maWcuc2hhcGVkW3NlbGYudHlwZV0KCmNsYXNzIFZlcnNhbGl0YXNUZXh0KFRh Z2dlZFRleHQpOgogICJUZXh0IGluIHZlcnNhbGl0YXMiCgogIGRlZiBwcm9jZXNzKHNlbGYpOgog ICAgc2VsZi5vdXRwdXQudGFnID0gJ3NwYW4gY2xhc3M9InZlcnNhbGl0YXMiJwoKY2xhc3MgQ29s b3JUZXh0KFRhZ2dlZFRleHQpOgogICJDb2xvcmVkIHRleHQiCgogIGRlZiBwcm9jZXNzKHNlbGYp OgogICAgc2VsZi5jb2xvciA9IHNlbGYuaGVhZGVyWzFdCiAgICBzZWxmLm91dHB1dC50YWcgPSAn c3BhbiBjbGFzcz0iJyArIHNlbGYuY29sb3IgKyAnIicKCmNsYXNzIFNpemVUZXh0KFRhZ2dlZFRl eHQpOgogICJTaXplZCB0ZXh0IgoKICBkZWYgcHJvY2VzcyhzZWxmKToKICAgIHNlbGYuc2l6ZSA9 IHNlbGYuaGVhZGVyWzFdCiAgICBzZWxmLm91dHB1dC50YWcgPSAnc3BhbiBjbGFzcz0iJyArIHNl bGYuc2l6ZSArICciJwoKY2xhc3MgQm9sZFRleHQoVGFnZ2VkVGV4dCk6CiAgIkJvbGQgdGV4dCIK CiAgZGVmIHByb2Nlc3Moc2VsZik6CiAgICBzZWxmLm91dHB1dC50YWcgPSAnYicKCmNsYXNzIFRl eHRGYW1pbHkoVGFnZ2VkVGV4dCk6CiAgIkEgYml0IG9mIHRleHQgZnJvbSBhIGRpZmZlcmVudCBm YW1pbHkiCgogIGRlZiBwcm9jZXNzKHNlbGYpOgogICAgIlBhcnNlIHRoZSB0eXBlIG9mIGZhbWls eSIKICAgIHNlbGYudHlwZSA9IHNlbGYuaGVhZGVyWzFdCiAgICBpZiBub3Qgc2VsZi50eXBlIGlu IFRhZ0NvbmZpZy5mYW1pbHk6CiAgICAgIFRyYWNlLmVycm9yKCdVbnJlY29nbml6ZWQgZmFtaWx5 ICcgKyB0eXBlKQogICAgICBzZWxmLm91dHB1dC50YWcgPSAnc3BhbicKICAgICAgcmV0dXJuCiAg ICBzZWxmLm91dHB1dC50YWcgPSBUYWdDb25maWcuZmFtaWx5W3NlbGYudHlwZV0KCmNsYXNzIEhm aWxsKFRhZ2dlZFRleHQpOgogICJIb3Jpem9udGFsbCBmaWxsIgoKICBkZWYgcHJvY2VzcyhzZWxm KToKICAgIFRyYWNlLmRlYnVnKCdoZmlsbCcpCiAgICBzZWxmLm91dHB1dC50YWcgPSAnc3BhbiBj bGFzcz0iaGZpbGwiJwoKY2xhc3MgQmFycmVkVGV4dChUYWdnZWRUZXh0KToKICAiVGV4dCB3aXRo IGEgYmFyIHNvbWV3aGVyZSIKCiAgZGVmIHByb2Nlc3Moc2VsZik6CiAgICAiUGFyc2UgdGhlIHR5 cGUgb2YgYmFyIgogICAgc2VsZi50eXBlID0gc2VsZi5oZWFkZXJbMV0KICAgIGlmIG5vdCBzZWxm LnR5cGUgaW4gVGFnQ29uZmlnLmJhcnJlZDoKICAgICAgVHJhY2UuZXJyb3IoJ1Vua25vd24gYmFy IHR5cGUgJyArIHNlbGYudHlwZSkKICAgICAgc2VsZi5vdXRwdXQudGFnID0gJ3NwYW4nCiAgICAg IHJldHVybgogICAgc2VsZi5vdXRwdXQudGFnID0gVGFnQ29uZmlnLmJhcnJlZFtzZWxmLnR5cGVd CgpjbGFzcyBMYW5nTGluZShDb250YWluZXIpOgogICJBIGxpbmUgd2l0aCBsYW5ndWFnZSBpbmZv cm1hdGlvbiIKCiAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgc2VsZi5wYXJzZXIgPSBMb25lQ29t bWFuZCgpCiAgICBzZWxmLm91dHB1dCA9IEVtcHR5T3V0cHV0KCkKCiAgZGVmIHByb2Nlc3Moc2Vs Zik6CiAgICBzZWxmLmxhbmcgPSBzZWxmLmhlYWRlclsxXQoKY2xhc3MgU3BhY2UoQ29udGFpbmVy KToKICAiQSBzcGFjZSBvZiBzZXZlcmFsIHR5cGVzIgoKICBkZWYgX19pbml0X18oc2VsZik6CiAg ICBzZWxmLnBhcnNlciA9IEluc2V0UGFyc2VyKCkKICAgIHNlbGYub3V0cHV0ID0gRml4ZWRPdXRw dXQoKQogIAogIGRlZiBwcm9jZXNzKHNlbGYpOgogICAgc2VsZi50eXBlID0gc2VsZi5oZWFkZXJb Ml0KICAgIGlmIHNlbGYudHlwZSBub3QgaW4gU3R5bGVDb25maWcuc3BhY2VzOgogICAgICBUcmFj ZS5lcnJvcignVW5rbm93biBzcGFjZSB0eXBlICcgKyBzZWxmLnR5cGUpCiAgICAgIHNlbGYuaHRt bCA9IFsnICddCiAgICAgIHJldHVybgogICAgc2VsZi5odG1sID0gW1N0eWxlQ29uZmlnLnNwYWNl c1tzZWxmLnR5cGVdXQoKCgoKCgoKCgoKY2xhc3MgTnVtYmVyR2VuZXJhdG9yKG9iamVjdCk6CiAg IkEgbnVtYmVyIGdlbmVyYXRvciBmb3IgdW5pcXVlIHNlcXVlbmNlcyBhbmQgaGllcmFyY2hpY2Fs IHN0cnVjdHVyZXMiCgogIGxldHRlcnMgPSAnLUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJwoK ICBpbnN0YW5jZSA9IE5vbmUKICBzdGFydGluZ2xldmVsID0gMAogIG1heGRlcHRoID0gMTAKCiAg dW5pcXVlID0gTnVtYmVyaW5nQ29uZmlnLmxheW91dHNbJ3VuaXF1ZSddCiAgb3JkZXJlZCA9IE51 bWJlcmluZ0NvbmZpZy5sYXlvdXRzWydvcmRlcmVkJ10KCiAgZGVmIF9faW5pdF9fKHNlbGYpOgog ICAgc2VsZi5udW1iZXIgPSBbXQogICAgc2VsZi51bmlxdWVzID0gZGljdCgpCiAgICBzZWxmLmNo YXB0ZXJlZCA9IGRpY3QoKQoKICBkZWYgZ2VuZXJhdGV1bmlxdWUoc2VsZiwgdHlwZSk6CiAgICAi R2VuZXJhdGUgdW5pcXVlIG51bWJlcmluZzogYSBudW1iZXIgdG8gcGxhY2UgaW4gdGhlIHRpdGxl IGJ1dCBub3QgdG8gIgogICAgImFwcGVuZCB0byBvdGhlcnMuIEV4YW1wbGVzOiBQYXJ0IDEsIEJv b2sgMy4iCiAgICBpZiBub3QgdHlwZSBpbiBzZWxmLnVuaXF1ZXM6CiAgICAgIHNlbGYudW5pcXVl c1t0eXBlXSA9IDAKICAgIHNlbGYudW5pcXVlc1t0eXBlXSA9IHNlbGYuaW5jcmVhc2Uoc2VsZi51 bmlxdWVzW3R5cGVdKQogICAgcmV0dXJuIHVuaWNvZGUoc2VsZi51bmlxdWVzW3R5cGVdKQoKICBk ZWYgZ2VuZXJhdGVvcmRlcmVkKHNlbGYsIHR5cGUpOgogICAgIkdlbmVyYXRlIG9yZGVyZWQgbnVt YmVyaW5nOiBhIG51bWJlciB0byB1c2UgYW5kIHBvc3NpYmx5IGNvbmNhdGVuYXRlICIKICAgICJ3 aXRoIG90aGVycy4gRXhhbXBsZTogQ2hhcHRlciAxLCBTZWN0aW9uIDEuNS4iCiAgICBsZXZlbCA9 IHNlbGYuZ2V0bGV2ZWwodHlwZSkKICAgIGlmIGxldmVsID09IDA6CiAgICAgIFRyYWNlLmVycm9y KCdJbXBvc3NpYmxlIGxldmVsIDAgZm9yICcgKyB0eXBlKQogICAgICByZXR1cm4gJy4nCiAgICBp ZiBsZXZlbCA+IE51bWJlckdlbmVyYXRvci5tYXhkZXB0aDoKICAgICAgcmV0dXJuICcnCiAgICBp ZiBsZW4oc2VsZi5udW1iZXIpID49IGxldmVsOgogICAgICBzZWxmLm51bWJlciA9IHNlbGYubnVt YmVyWzpsZXZlbF0KICAgIGVsc2U6CiAgICAgIHdoaWxlIGxlbihzZWxmLm51bWJlcikgPCBsZXZl bDoKICAgICAgICBzZWxmLm51bWJlci5hcHBlbmQoMCkKICAgIHNlbGYubnVtYmVyW2xldmVsIC0g MV0gPSBzZWxmLmluY3JlYXNlKHNlbGYubnVtYmVyW2xldmVsIC0gMV0pCiAgICByZXR1cm4gc2Vs Zi5kb3RzZXBhcmF0ZWQoc2VsZi5udW1iZXIpCgogIGRlZiBnZW5lcmF0ZWNoYXB0ZXJlZChzZWxm LCB0eXBlKToKICAgICJHZW5lcmF0ZSBhIG51bWJlciB3aGljaCBnb2VzIHdpdGggZmlyc3QtbGV2 ZWwgbnVtYmVycyAoY2hhcHRlcnMpLiAiCiAgICAiRm9yIHRoZSBhcnRpY2xlIGNsYXNzZXMgYSB1 bmlxdWUgbnVtYmVyIGlzIGdlbmVyYXRlZC4iCiAgICBpZiBOdW1iZXJHZW5lcmF0b3Iuc3RhcnRp bmdsZXZlbCA+IDA6CiAgICAgIHJldHVybiBzZWxmLmdlbmVyYXRldW5pcXVlKHR5cGUpCiAgICBp ZiBsZW4oc2VsZi5udW1iZXIpID09IDA6CiAgICAgIGNoYXB0ZXIgPSAwCiAgICBlbHNlOgogICAg ICBjaGFwdGVyID0gc2VsZi5udW1iZXJbMF0KICAgIGlmIG5vdCB0eXBlIGluIHNlbGYuY2hhcHRl cmVkIG9yIHNlbGYuY2hhcHRlcmVkW3R5cGVdWzBdICE9IGNoYXB0ZXI6CiAgICAgIHNlbGYuY2hh cHRlcmVkW3R5cGVdID0gW2NoYXB0ZXIsIDBdCiAgICBjaGFwdGVyZWQgPSBzZWxmLmNoYXB0ZXJl ZFt0eXBlXQogICAgY2hhcHRlcmVkWzFdID0gc2VsZi5pbmNyZWFzZShjaGFwdGVyZWRbMV0pCiAg ICBzZWxmLmNoYXB0ZXJlZFt0eXBlXSA9IGNoYXB0ZXJlZAogICAgcmV0dXJuIHNlbGYuZG90c2Vw YXJhdGVkKGNoYXB0ZXJlZCkKCiAgZGVmIGdldGxldmVsKHNlbGYsIHR5cGUpOgogICAgIkdldCB0 aGUgbGV2ZWwgdGhhdCBjb3JyZXNwb25kcyB0byBhIHR5cGUuIgogICAgbGV2ZWwgPSBOdW1iZXJH ZW5lcmF0b3Iub3JkZXJlZC5pbmRleChzZWxmLmRlYXN0ZXJpc2sodHlwZSkpICsgMQogICAgcmV0 dXJuIGxldmVsIC0gTnVtYmVyR2VuZXJhdG9yLnN0YXJ0aW5nbGV2ZWwKCiAgZGVmIGlzdW5pcXVl KHNlbGYsIGNvbnRhaW5lcik6CiAgICAiRmluZCBvdXQgaWYgYSBjb250YWluZXIgcmVxdWlyZXMg dW5pcXVlIG51bWJlcmluZy4iCiAgICByZXR1cm4gY29udGFpbmVyLnR5cGUgaW4gTnVtYmVyR2Vu ZXJhdG9yLnVuaXF1ZQoKICBkZWYgaXNpbm9yZGVyZWQoc2VsZiwgY29udGFpbmVyKToKICAgICJG aW5kIG91dCBpZiBhIGNvbnRhaW5lciBpcyBvcmRlcmVkIG9yIHVub3JkZXJlZC4iCiAgICByZXR1 cm4gc2VsZi5kZWFzdGVyaXNrKGNvbnRhaW5lci50eXBlKSBpbiBOdW1iZXJHZW5lcmF0b3Iub3Jk ZXJlZAogIAogIGRlZiBpc29yZGVyZWQoc2VsZiwgY29udGFpbmVyKToKICAgICJGaW5kIG91dCBp ZiBhIGNvbnRhaW5lciByZXF1aXJlcyBvcmRlcmVkIG51bWJlcmluZy4iCiAgICByZXR1cm4gY29u dGFpbmVyLnR5cGUgaW4gTnVtYmVyR2VuZXJhdG9yLm9yZGVyZWQKCiAgZGVmIGlzdW5vcmRlcmVk KHNlbGYsIGNvbnRhaW5lcik6CiAgICAiRmluZCBvdXQgaWYgYSBjb250YWluZXIgZG9lcyBub3Qg aGF2ZSBhIG51bWJlci4iCiAgICBpZiBub3QgJyonIGluIGNvbnRhaW5lci50eXBlOgogICAgICBy ZXR1cm4gRmFsc2UKICAgIHJldHVybiBzZWxmLmlzaW5vcmRlcmVkKGNvbnRhaW5lcikKCiAgZGVm IGluY3JlYXNlKHNlbGYsIG51bWJlcik6CiAgICAiSW5jcmVhc2UgdGhlIG51bWJlciAob3IgbGV0 dGVyKSIKICAgIGlmIG5vdCBpc2luc3RhbmNlKG51bWJlciwgc3RyKToKICAgICAgcmV0dXJuIG51 bWJlciArIDEKICAgIGlmIG5vdCBudW1iZXIgaW4gTnVtYmVyR2VuZXJhdG9yLmxldHRlcnM6CiAg ICAgIFRyYWNlLmVycm9yKCdVbmtub3duIGxldHRlciBudW1lcmF0aW9uICcgKyBudW1iZXIpCiAg ICAgIHJldHVybiAwCiAgICBpbmRleCA9IE51bWJlckdlbmVyYXRvci5sZXR0ZXJzLmluZGV4KG51 bWJlcikgKyAxCiAgICByZXR1cm4gTnVtYmVyR2VuZXJhdG9yLmxldHRlcnNbaW5kZXggJSBsZW4o TnVtYmVyR2VuZXJhdG9yLmxldHRlcnMpXQoKICBkZWYgZG90c2VwYXJhdGVkKHNlbGYsIG51bWJl cik6CiAgICAiR2V0IHRoZSBudW1iZXIgc2VwYXJhdGVkIGJ5IGRvdHM6IDEuMS4zIgogICAgZG90 c2VwID0gJycKICAgIGlmIGxlbihudW1iZXIpID09IDA6CiAgICAgIFRyYWNlLmVycm9yKCdFbXB0 eSBudW1iZXInKQogICAgICByZXR1cm4gJy4nCiAgICBmb3IgcGllY2UgaW4gbnVtYmVyOgogICAg ICBkb3RzZXAgKz0gJy4nICsgdW5pY29kZShwaWVjZSkKICAgIHJldHVybiBkb3RzZXBbMTpdCgog IGRlZiBkZWFzdGVyaXNrKHNlbGYsIHR5cGUpOgogICAgIkdldCB0aGUgdHlwZSB3aXRob3V0IHRo ZSBhc3RlcmlzayBmb3IgdW5vcmRlcmVkIHR5cGVzLiIKICAgIHJldHVybiB0eXBlLnJlcGxhY2Uo JyonLCAnJykKCk51bWJlckdlbmVyYXRvci5pbnN0YW5jZSA9IE51bWJlckdlbmVyYXRvcigpCgpj bGFzcyBMYXlvdXROdW1iZXJlcihvYmplY3QpOgogICJOdW1iZXIgYSBsYXlvdXQgd2l0aCB0aGUg cmVsZXZhbnQgYXR0cmlidXRlcy4iCgogIGluc3RhbmNlID0gTm9uZQoKICBkZWYgX19pbml0X18o c2VsZik6CiAgICBzZWxmLmdlbmVyYXRvciA9IE51bWJlckdlbmVyYXRvci5pbnN0YW5jZQoKICBk ZWYgaXNudW1iZXJlZChzZWxmLCBjb250YWluZXIpOgogICAgIkZpbmQgb3V0IGlmIGEgY29udGFp bmVyIHJlcXVpcmVzIG51bWJlcmluZyBhdCBhbGwuIgogICAgcmV0dXJuIHNlbGYuZ2VuZXJhdG9y LmRlYXN0ZXJpc2soY29udGFpbmVyLnR5cGUpIFwKICAgICAgICBpbiBOdW1iZXJHZW5lcmF0b3Iu dW5pcXVlICsgTnVtYmVyR2VuZXJhdG9yLm9yZGVyZWQKCiAgZGVmIG51bWJlcihzZWxmLCBsYXlv dXQpOgogICAgIlNldCBhbGwgYXR0cmlidXRlczogbnVtYmVyLCBlbnRyeSwgbGV2ZWwuLi4iCiAg ICBpZiBzZWxmLmdlbmVyYXRvci5pc3VuaXF1ZShsYXlvdXQpOgogICAgICBsYXlvdXQubnVtYmVy ID0gc2VsZi5nZW5lcmF0b3IuZ2VuZXJhdGV1bmlxdWUobGF5b3V0LnR5cGUpCiAgICAgIGxheW91 dC5lbnRyeSA9IFRyYW5zbGF0aW9uQ29uZmlnLmNvbnN0YW50c1tsYXlvdXQudHlwZV0gKyAnICcg KyBsYXlvdXQubnVtYmVyCiAgICAgIGxheW91dC5wYXJ0a2V5ID0gJ3RvYy0nICsgbGF5b3V0LnR5 cGUgKyAnLScgKyBsYXlvdXQubnVtYmVyCiAgICAgIGxheW91dC5hbmNob3J0ZXh0ID0gbGF5b3V0 LmVudHJ5ICsgJy4nCiAgICAgIGxheW91dC5sZXZlbCA9IDAKICAgICAgcmV0dXJuCiAgICBpZiBu b3Qgc2VsZi5nZW5lcmF0b3IuaXNpbm9yZGVyZWQobGF5b3V0KToKICAgICAgVHJhY2UuZXJyb3Io J1RyeWluZyB0byBudW1iZXIgd3JvbmcgJyArIHVuaWNvZGUobGF5b3V0KSkKICAgICAgcmV0dXJu CiAgICAjIG9yZGVyZWQgb3IgdW5vcmRlcmVkCiAgICBpZiBzZWxmLmdlbmVyYXRvci5pc29yZGVy ZWQobGF5b3V0KToKICAgICAgbGF5b3V0Lm51bWJlciA9IHNlbGYuZ2VuZXJhdG9yLmdlbmVyYXRl b3JkZXJlZChsYXlvdXQudHlwZSkKICAgIGVsaWYgc2VsZi5nZW5lcmF0b3IuaXN1bm9yZGVyZWQo bGF5b3V0KToKICAgICAgbGF5b3V0Lm51bWJlciA9ICcnCiAgICBudW1iZXIgPSBsYXlvdXQubnVt YmVyCiAgICBpZiBudW1iZXIgPT0gJyc6CiAgICAgICMgb3JkZXJlZCBidXQgYmlnZ2VyIHRoYW4g bWF4ZGVwdGggbnVtYmVyZWQgb3IgdW5vcmRlcmVkCiAgICAgIG51bWJlciA9IHNlbGYuZ2VuZXJh dG9yLmdlbmVyYXRldW5pcXVlKGxheW91dC50eXBlKQogICAgbGF5b3V0LnBhcnRrZXkgPSAndG9j LScgKyBsYXlvdXQudHlwZSArICctJyArIG51bWJlcgogICAgdHlwZSA9IHNlbGYuZ2VuZXJhdG9y LmRlYXN0ZXJpc2sobGF5b3V0LnR5cGUpCiAgICBsYXlvdXQuYW5jaG9ydGV4dCA9IGxheW91dC5u dW1iZXIKICAgIGxheW91dC5lbnRyeSA9IFRyYW5zbGF0aW9uQ29uZmlnLmNvbnN0YW50c1t0eXBl XQogICAgaWYgbGF5b3V0Lm51bWJlciAhPSAnJzoKICAgICAgbGF5b3V0LmVudHJ5ICs9ICcgJyAr IGxheW91dC5udW1iZXIKICAgIGxheW91dC5sZXZlbCA9IHNlbGYuZ2VuZXJhdG9yLmdldGxldmVs KHR5cGUpCiAgICBsYXlvdXQub3V0cHV0LnRhZyA9IGxheW91dC5vdXRwdXQudGFnLnJlcGxhY2Uo Jz8nLCB1bmljb2RlKGxheW91dC5sZXZlbCkpCgogIGRlZiBtb2RpZnlsYXlvdXQoc2VsZiwgbGF5 b3V0LCB0eXBlKToKICAgICJNb2RpZnkgYSBsYXlvdXQgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB0 eXBlLiIKCkxheW91dE51bWJlcmVyLmluc3RhbmNlID0gTGF5b3V0TnVtYmVyZXIoKQoKCgpjbGFz cyBMaW5rKENvbnRhaW5lcik6CiAgIkEgbGluayB0byBhbm90aGVyIHBhcnQgb2YgdGhlIGRvY3Vt ZW50IgoKICBkZWYgX19pbml0X18oc2VsZik6CiAgICBDb250YWluZXIuX19pbml0X18oc2VsZikK ICAgIHNlbGYucGFyc2VyID0gSW5zZXRQYXJzZXIoKQogICAgc2VsZi5vdXRwdXQgPSBMaW5rT3V0 cHV0KCkKICAgIHNlbGYuYW5jaG9yID0gTm9uZQogICAgc2VsZi51cmwgPSBOb25lCiAgICBzZWxm LnR5cGUgPSBOb25lCiAgICBzZWxmLnBhZ2UgPSBOb25lCiAgICBzZWxmLnRhcmdldCA9IE5vbmUK ICAgIHNlbGYuZGVzdGluYXRpb24gPSBOb25lCiAgICBpZiBPcHRpb25zLnRhcmdldDoKICAgICAg c2VsZi50YXJnZXQgPSBPcHRpb25zLnRhcmdldAoKICBkZWYgY29tcGxldGUoc2VsZiwgdGV4dCwg YW5jaG9yID0gTm9uZSwgdXJsID0gTm9uZSwgdHlwZSA9IE5vbmUpOgogICAgIkNvbXBsZXRlIHRo ZSBsaW5rLiIKICAgIHNlbGYuY29udGVudHMgPSBbQ29uc3RhbnQodGV4dCldCiAgICBpZiBhbmNo b3I6CiAgICAgIHNlbGYuYW5jaG9yID0gYW5jaG9yCiAgICBpZiB1cmw6CiAgICAgIHNlbGYudXJs ID0gdXJsCiAgICBpZiB0eXBlOgogICAgICBzZWxmLnR5cGUgPSB0eXBlCiAgICByZXR1cm4gc2Vs ZgoKICBkZWYgY29tcHV0ZWRlc3RpbmF0aW9uKHNlbGYpOgogICAgIlVzZSB0aGUgZGVzdGluYXRp b24gbGluayB0byBmaWxsIGluIHRoZSBkZXN0aW5hdGlvbiBVUkwuIgogICAgaWYgbm90IHNlbGYu ZGVzdGluYXRpb246CiAgICAgIHJldHVybgogICAgaWYgbm90IHNlbGYuZGVzdGluYXRpb24uYW5j aG9yOgogICAgICBUcmFjZS5lcnJvcignTWlzc2luZyBhbmNob3IgaW4gbGluayBkZXN0aW5hdGlv biAnICsgdW5pY29kZShzZWxmLmRlc3RpbmF0aW9uKSkKICAgICAgcmV0dXJuCiAgICBzZWxmLnVy bCA9ICcjJyArIHNlbGYuZGVzdGluYXRpb24uYW5jaG9yCiAgICBpZiBzZWxmLmRlc3RpbmF0aW9u LnBhZ2U6CiAgICAgIHNlbGYudXJsID0gc2VsZi5kZXN0aW5hdGlvbi5wYWdlICsgc2VsZi51cmwK CiAgZGVmIHNldG11dHVhbGRlc3RpbmF0aW9uKHNlbGYsIGRlc3RpbmF0aW9uKToKICAgICJTZXQg YW5vdGhlciBsaW5rIGFzIGRlc3RpbmF0aW9uLCBhbmQgc2V0IGl0cyBkZXN0aW5hdGlvbiB0byB0 aGlzIG9uZS4iCiAgICBzZWxmLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb24KICAgIGRlc3RpbmF0 aW9uLmRlc3RpbmF0aW9uID0gc2VsZgoKY2xhc3MgTGlzdEluc2V0KENvbnRhaW5lcik6CiAgIkFu IGluc2V0IHdpdGggYSBsaXN0LCBub3JtYWxseSBtYWRlIG9mIGxpbmtzLiIKCiAgZGVmIF9faW5p dF9fKHNlbGYpOgogICAgc2VsZi5wYXJzZXIgPSBJbnNldFBhcnNlcigpCiAgICBzZWxmLm91dHB1 dCA9IENvbnRlbnRzT3V0cHV0KCkKCiAgZGVmIHNvcnRkaWN0aW9uYXJ5KHNlbGYsIGRpY3Rpb25h cnkpOgogICAgIlNvcnQgYWxsIGVudHJpZXMgaW4gdGhlIGRpY3Rpb25hcnkiCiAgICBrZXlzID0g ZGljdGlvbmFyeS5rZXlzKCkKICAgICMgc29ydCBieSBuYW1lCiAgICBrZXlzLnNvcnQoKQogICAg cmV0dXJuIGtleXMKCmNsYXNzIExpc3RPZihMaXN0SW5zZXQpOgogICJBIGxpc3Qgb2YgZW50aXRp ZXMgKGZpZ3VyZXMsIHRhYmxlcywgYWxnb3JpdGhtcykiCgogIGRlZiBwcm9jZXNzKHNlbGYpOgog ICAgIlBhcnNlIHRoZSBoZWFkZXIgYW5kIGdldCB0aGUgdHlwZSIKICAgIHNlbGYudHlwZSA9IHNl bGYuaGVhZGVyWzJdCiAgICB0ZXh0ID0gVHJhbnNsYXRpb25Db25maWcubGlzdHNbc2VsZi50eXBl XQogICAgc2VsZi5jb250ZW50cyA9IFtUYWdnZWRUZXh0KCkuY29uc3RhbnQodGV4dCwgJ2RpdiBj bGFzcz0idG9jaGVhZGVyIicsIFRydWUpXQoKY2xhc3MgVGFibGVPZkNvbnRlbnRzKExpc3RJbnNl dCk6CiAgIlRhYmxlIG9mIGNvbnRlbnRzIgoKICBkZWYgcHJvY2VzcyhzZWxmKToKICAgICJQYXJz ZSB0aGUgaGVhZGVyIGFuZCBnZXQgdGhlIHR5cGUiCiAgICB0ZXh0ID0gVHJhbnNsYXRpb25Db25m aWcuY29uc3RhbnRzWyd0b2MnXQogICAgc2VsZi5jb250ZW50cyA9IFtUYWdnZWRUZXh0KCkuY29u c3RhbnQodGV4dCwgJ2RpdiBjbGFzcz0idG9jaGVhZGVyIicsIFRydWUpXQoKY2xhc3MgSW5kZXhF bnRyeShMaW5rKToKICAiQW4gZW50cnkgaW4gdGhlIGFscGhhYmV0aWNhbCBpbmRleCIKCiAgZW50 cmllcyA9IGRpY3QoKQogIGFycm93cyA9IGRpY3QoKQoKICBuYW1lc2NhcGVzID0geychJzonJywg J3wnOicsICcsICcgICc6JyAnfQogIGtleWVzY2FwZXMgPSB7JyAnOictJywgJy0tJzonLScsICcs JzonJ30KCiAgZGVmIHByb2Nlc3Moc2VsZik6CiAgICAiUHV0IGVudHJ5IGluIGluZGV4IgogICAg aWYgJ25hbWUnIGluIHNlbGYucGFyYW1ldGVyczoKICAgICAgbmFtZSA9IHNlbGYucGFyYW1ldGVy c1snbmFtZSddLnN0cmlwKCkKICAgIGVsc2U6CiAgICAgIG5hbWUgPSBzZWxmLmV4dHJhY3R0ZXh0 KCkKICAgIHNlbGYubmFtZSA9IHNlbGYuZXNjYXBlKG5hbWUsIEluZGV4RW50cnkubmFtZXNjYXBl cykKICAgIGtleSA9IHNlbGYuZXNjYXBlKHNlbGYubmFtZSwgSW5kZXhFbnRyeS5rZXllc2NhcGVz KQogICAgaWYgbm90IGtleSBpbiBJbmRleEVudHJ5LmVudHJpZXM6CiAgICAgICMgbm8gZW50cnkg eWV0OyBjcmVhdGUKICAgICAgZW50cnkgPSBMaW5rKCkuY29tcGxldGUobmFtZSwgJ2luZGV4LScg KyBrZXksIE5vbmUsICdwcmludGluZGV4JykKICAgICAgZW50cnkubmFtZSA9IG5hbWUKICAgICAg SW5kZXhFbnRyeS5lbnRyaWVzW2tleV0gPSBlbnRyeQogICAgaWYgbm90IGtleSBpbiBJbmRleEVu dHJ5LmFycm93czoKICAgICAgIyBubyBhcnJvd3MgeWV0OyBjcmVhdGUgbGlzdAogICAgICBJbmRl eEVudHJ5LmFycm93c1trZXldID0gW10KICAgIHNlbGYuaW5kZXggPSBsZW4oSW5kZXhFbnRyeS5h cnJvd3Nba2V5XSkKICAgIHNlbGYuY29tcGxldGUodSfihpMnLCAnZW50cnktJyArIGtleSArICct JyArIHVuaWNvZGUoc2VsZi5pbmRleCkpCiAgICBzZWxmLmRlc3RpbmF0aW9uID0gSW5kZXhFbnRy eS5lbnRyaWVzW2tleV0KICAgIGFycm93ID0gTGluaygpLmNvbXBsZXRlKHUn4oaRJywgJ2luZGV4 LScgKyBrZXkpCiAgICBhcnJvdy5kZXN0aW5hdGlvbiA9IHNlbGYKICAgIEluZGV4RW50cnkuYXJy b3dzW2tleV0uYXBwZW5kKGFycm93KQoKY2xhc3MgUHJpbnRJbmRleChMaXN0SW5zZXQpOgogICJD b21tYW5kIHRvIHByaW50IGFuIGluZGV4IgoKICBkZWYgcHJvY2VzcyhzZWxmKToKICAgICJDcmVh dGUgdGhlIGFscGhhYmV0aWMgaW5kZXgiCiAgICBpbmRleCA9IFRyYW5zbGF0aW9uQ29uZmlnLmNv bnN0YW50c1snaW5kZXgnXQogICAgc2VsZi5jb250ZW50cyA9IFtUYWdnZWRUZXh0KCkuY29uc3Rh bnQoaW5kZXgsICdoMSBjbGFzcz0iaW5kZXgiJyksCiAgICAgICAgQ29uc3RhbnQoJ1xuJyldCiAg ICBmb3Iga2V5IGluIHNlbGYuc29ydGRpY3Rpb25hcnkoSW5kZXhFbnRyeS5lbnRyaWVzKToKICAg ICAgZW50cnkgPSBJbmRleEVudHJ5LmVudHJpZXNba2V5XQogICAgICBlbnRyeXRleHQgPSBbSW5k ZXhFbnRyeS5lbnRyaWVzW2tleV0sIENvbnN0YW50KCc6ICcpXQogICAgICBjb250ZW50cyA9IFtU YWdnZWRUZXh0KCkuY29tcGxldGUoZW50cnl0ZXh0LCAnaScpXQogICAgICBjb250ZW50cyArPSBz ZWxmLmV4dHJhY3RhcnJvd3Moa2V5KQogICAgICBzZWxmLmNvbnRlbnRzLmFwcGVuZChUYWdnZWRU ZXh0KCkuY29tcGxldGUoY29udGVudHMsICdwIGNsYXNzPSJwcmludGluZGV4IicsCiAgICAgICAg ICBUcnVlKSkKCiAgZGVmIGV4dHJhY3RhcnJvd3Moc2VsZiwga2V5KToKICAgICJFeHRyYWN0IGFs bCBhcnJvd3MgKGxpbmtzIHRvIHRoZSBvcmlnaW5hbCByZWZlcmVuY2UpIGZvciBhIGtleS4iCiAg ICBhcnJvd3MgPSBbXQogICAgZm9yIGFycm93IGluIEluZGV4RW50cnkuYXJyb3dzW2tleV06CiAg ICAgIGFycm93cyArPSBbYXJyb3csIENvbnN0YW50KHUnLCBcbicpXQogICAgcmV0dXJuIGFycm93 c1s6LTFdCgpjbGFzcyBOb21lbmNsYXR1cmVFbnRyeShMaW5rKToKICAiQW4gZW50cnkgb2YgTHlY IG5vbWVuY2xhdHVyZSIKCiAgZW50cmllcyA9IGRpY3QoKQoKICBkZWYgcHJvY2VzcyhzZWxmKToK ICAgICJQdXQgZW50cnkgaW4gaW5kZXgiCiAgICBzeW1ib2wgPSBzZWxmLnBhcmFtZXRlcnNbJ3N5 bWJvbCddCiAgICBkZXNjcmlwdGlvbiA9IHNlbGYucGFyYW1ldGVyc1snZGVzY3JpcHRpb24nXQog ICAga2V5ID0gc3ltYm9sLnJlcGxhY2UoJyAnLCAnLScpLmxvd2VyKCkKICAgIGlmIGtleSBpbiBO b21lbmNsYXR1cmVFbnRyeS5lbnRyaWVzOgogICAgICBUcmFjZS5lcnJvcignRHVwbGljYXRlZCBu b21lbmNsYXR1cmUgZW50cnkgJyArIGtleSkKICAgIHNlbGYuY29tcGxldGUodSfihpMnLCAnbm9t ZW50LScgKyBrZXkpCiAgICBlbnRyeSA9IExpbmsoKS5jb21wbGV0ZSh1J+KGkScsICdub20tJyAr IGtleSkKICAgIGVudHJ5LnN5bWJvbCA9IHN5bWJvbAogICAgZW50cnkuZGVzY3JpcHRpb24gPSBk ZXNjcmlwdGlvbgogICAgc2VsZi5zZXRtdXR1YWxkZXN0aW5hdGlvbihlbnRyeSkKICAgIE5vbWVu Y2xhdHVyZUVudHJ5LmVudHJpZXNba2V5XSA9IGVudHJ5CgpjbGFzcyBQcmludE5vbWVuY2xhdHVy ZShMaXN0SW5zZXQpOgogICJQcmludCBhbGwgbm9tZW5jbGF0dXJlIGVudHJpZXMiCgogIGRlZiBw cm9jZXNzKHNlbGYpOgogICAgbm9tZW5jbGF0dXJlID0gVHJhbnNsYXRpb25Db25maWcuY29uc3Rh bnRzWydub21lbmNsYXR1cmUnXQogICAgc2VsZi5jb250ZW50cyA9IFtUYWdnZWRUZXh0KCkuY29u c3RhbnQobm9tZW5jbGF0dXJlLAogICAgICAnaDEgY2xhc3M9Im5vbWVuY2xhdHVyZSInKV0KICAg IGZvciBrZXkgaW4gc2VsZi5zb3J0ZGljdGlvbmFyeShOb21lbmNsYXR1cmVFbnRyeS5lbnRyaWVz KToKICAgICAgZW50cnkgPSBOb21lbmNsYXR1cmVFbnRyeS5lbnRyaWVzW2tleV0KICAgICAgY29u dGVudHMgPSBbZW50cnksIENvbnN0YW50KGVudHJ5LnN5bWJvbCArIHUn4oCDJyArIGVudHJ5LmRl c2NyaXB0aW9uKV0KICAgICAgdGV4dCA9IFRhZ2dlZFRleHQoKS5jb21wbGV0ZShjb250ZW50cywg J2RpdiBjbGFzcz0iTm9tZW5jbGF0ZWQiJywgVHJ1ZSkKICAgICAgc2VsZi5jb250ZW50cy5hcHBl bmQodGV4dCkKCmNsYXNzIFVSTChMaW5rKToKICAiQSBjbGlja2FibGUgVVJMIgoKICBkZWYgcHJv Y2VzcyhzZWxmKToKICAgICJSZWFkIFVSTCBmcm9tIHBhcmFtZXRlcnMiCiAgICBuYW1lID0gc2Vs Zi5lc2NhcGUoc2VsZi5wYXJhbWV0ZXJzWyd0YXJnZXQnXSkKICAgIGlmICd0eXBlJyBpbiBzZWxm LnBhcmFtZXRlcnM6CiAgICAgIHNlbGYudXJsID0gc2VsZi5lc2NhcGUoc2VsZi5wYXJhbWV0ZXJz Wyd0eXBlJ10pICsgbmFtZQogICAgZWxzZToKICAgICAgc2VsZi51cmwgPSBuYW1lCiAgICBpZiAn bmFtZScgaW4gc2VsZi5wYXJhbWV0ZXJzOgogICAgICBuYW1lID0gc2VsZi5wYXJhbWV0ZXJzWydu YW1lJ10KICAgIHNlbGYuY29udGVudHMgPSBbQ29uc3RhbnQobmFtZSldCgpjbGFzcyBGbGV4VVJM KFVSTCk6CiAgIkEgZmxleGlibGUgVVJMIgoKICBkZWYgcHJvY2VzcyhzZWxmKToKICAgICJSZWFk IFVSTCBmcm9tIGNvbnRlbnRzIgogICAgc2VsZi51cmwgPSBzZWxmLmV4dHJhY3R0ZXh0KCkKCmNs YXNzIExpbmtPdXRwdXQob2JqZWN0KToKICAiQSBsaW5rIHBvaW50aW5nIHRvIHNvbWUgZGVzdGlu YXRpb24iCiAgIk9yIGFuIGFuY2hvciAoZGVzdGluYXRpb24pIgoKICBkZWYgZ2V0aHRtbChzZWxm LCBsaW5rKToKICAgICJHZXQgdGhlIEhUTUwgY29kZSBmb3IgdGhlIGxpbmsiCiAgICB0eXBlID0g bGluay5fX2NsYXNzX18uX19uYW1lX18KICAgIGlmIGxpbmsudHlwZToKICAgICAgdHlwZSA9IGxp bmsudHlwZQogICAgdGFnID0gJ2EgY2xhc3M9IicgKyB0eXBlICsgJyInCiAgICBpZiBsaW5rLmFu Y2hvcjoKICAgICAgdGFnICs9ICcgbmFtZT0iJyArIGxpbmsuYW5jaG9yICsgJyInCiAgICBpZiBs aW5rLmRlc3RpbmF0aW9uOgogICAgICBsaW5rLmNvbXB1dGVkZXN0aW5hdGlvbigpCiAgICBpZiBs aW5rLnVybDoKICAgICAgdGFnICs9ICcgaHJlZj0iJyArIGxpbmsudXJsICsgJyInCiAgICBpZiBs aW5rLnRhcmdldDoKICAgICAgdGFnICs9ICcgdGFyZ2V0PSInICsgbGluay50YXJnZXQgKyAnIicK ICAgIHRleHQgPSBUYWdnZWRUZXh0KCkuY29tcGxldGUobGluay5jb250ZW50cywgdGFnKQogICAg cmV0dXJuIHRleHQuZ2V0aHRtbCgpCgoKCgoKCmNsYXNzIExhYmVsKExpbmspOgogICJBIGxhYmVs IHRvIGJlIHJlZmVyZW5jZWQiCgogIG5hbWVzID0gZGljdCgpCgogIGRlZiBwcm9jZXNzKHNlbGYp OgogICAgIlByb2Nlc3MgYSBsYWJlbCBjb250YWluZXIuIgogICAga2V5ID0gc2VsZi5wYXJhbWV0 ZXJzWyduYW1lJ10KICAgIHNlbGYuY3JlYXRlKCcgJywga2V5KQoKICBkZWYgY3JlYXRlKHNlbGYs IHRleHQsIGtleSwgdHlwZSA9ICdMYWJlbCcpOgogICAgIkNyZWF0ZSB0aGUgbGFiZWwgZm9yIGEg Z2l2ZW4ga2V5LiIKICAgIHNlbGYua2V5ID0ga2V5CiAgICBzZWxmLmNvbXBsZXRlKHRleHQsIGFu Y2hvciA9IGtleSwgdHlwZSA9IHR5cGUpCiAgICBMYWJlbC5uYW1lc1trZXldID0gc2VsZgogICAg aWYga2V5IGluIFJlZmVyZW5jZS5yZWZlcmVuY2VzOgogICAgICBmb3IgcmVmZXJlbmNlIGluIFJl ZmVyZW5jZS5yZWZlcmVuY2VzW2tleV06CiAgICAgICAgcmVmZXJlbmNlLmRlc3RpbmF0aW9uID0g c2VsZgogICAgcmV0dXJuIHNlbGYKCiAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgogICAgIlJldHVy biBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbi4iCiAgICByZXR1cm4gJ0xhYmVsICcgKyBzZWxm LmtleQoKY2xhc3MgUmVmZXJlbmNlKExpbmspOgogICJBIHJlZmVyZW5jZSB0byBhIGxhYmVsIgoK ICByZWZlcmVuY2VzID0gZGljdCgpCgogIGRlZiBwcm9jZXNzKHNlbGYpOgogICAgIlJlYWQgdGhl IHJlZmVyZW5jZSBhbmQgc2V0IHRoZSBhcnJvdy4iCiAgICBzZWxmLmtleSA9IHNlbGYucGFyYW1l dGVyc1sncmVmZXJlbmNlJ10KICAgIGlmIHNlbGYua2V5IGluIExhYmVsLm5hbWVzOgogICAgICBk aXJlY3Rpb24gPSB1J+KGkScKICAgICAgbGFiZWwgPSBMYWJlbC5uYW1lc1tzZWxmLmtleV0KICAg IGVsc2U6CiAgICAgIGRpcmVjdGlvbiA9IHUn4oaTJwogICAgICBsYWJlbCA9IExhYmVsKCkuY29t cGxldGUoJyAnLCBzZWxmLmtleSwgJ3ByZXJlZicpCiAgICBzZWxmLmRlc3RpbmF0aW9uID0gbGFi ZWwKICAgIHNlbGYuY29udGVudHMgPSBbQ29uc3RhbnQoZGlyZWN0aW9uKV0KICAgIGlmIG5vdCBz ZWxmLmtleSBpbiBSZWZlcmVuY2UucmVmZXJlbmNlczoKICAgICAgUmVmZXJlbmNlLnJlZmVyZW5j ZXNbc2VsZi5rZXldID0gW10KICAgIFJlZmVyZW5jZS5yZWZlcmVuY2VzW3NlbGYua2V5XS5hcHBl bmQoc2VsZikKCiAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgogICAgIlJldHVybiBhIHByaW50YWJs ZSByZXByZXNlbnRhdGlvbi4iCiAgICByZXR1cm4gJ1JlZmVyZW5jZSAnICsgc2VsZi5rZXkKCgoK CgoKCgoKCgoKY2xhc3MgTHlYSGVhZGVyKENvbnRhaW5lcik6CiAgIlJlYWRzIHRoZSBoZWFkZXIs IG91dHB1dHMgdGhlIEhUTUwgaGVhZGVyIgoKICBpbmRlbnRzdGFuZGFyZCA9IEZhbHNlCiAgdG9j ZGVwdGggPSAxMAoKICBkZWYgX19pbml0X18oc2VsZik6CiAgICBzZWxmLmNvbnRlbnRzID0gW10K ICAgIHNlbGYucGFyc2VyID0gSGVhZGVyUGFyc2VyKCkKICAgIHNlbGYub3V0cHV0ID0gSGVhZGVy T3V0cHV0KCkKCiAgZGVmIHByb2Nlc3Moc2VsZik6CiAgICAiRmluZCBwZGYgdGl0bGUiCiAgICBU aXRsZU91dHB1dC5wZGZ0aXRsZSA9IHNlbGYuZ2V0cGFyYW1ldGVyKCdwZGZ0aXRsZScpCiAgICBp ZiBzZWxmLmdldHBhcmFtZXRlcignZG9jdW1lbnRjbGFzcycpIGluIEhlYWRlckNvbmZpZy5zdHls ZXNbJ2FydGljbGUnXToKICAgICAgTnVtYmVyR2VuZXJhdG9yLnN0YXJ0aW5nbGV2ZWwgPSAxCiAg ICBpZiBzZWxmLmdldHBhcmFtZXRlcigncGFyYWdyYXBoc2VwYXJhdGlvbicpID09ICdpbmRlbnQn OgogICAgICBMeVhIZWFkZXIuaW5kZW50c3RhbmRhcmQgPSBUcnVlCiAgICBMeVhIZWFkZXIudG9j ZGVwdGggPSBzZWxmLmdldGxldmVsKCd0b2NkZXB0aCcpCiAgICBOdW1iZXJHZW5lcmF0b3IubWF4 ZGVwdGggPSBzZWxmLmdldGxldmVsKCdzZWNudW1kZXB0aCcpCgogIGRlZiBnZXRwYXJhbWV0ZXIo c2VsZiwgY29uZmlncGFyYW0pOgogICAgIkdldCBhIHBhcmFtZXRlciBjb25maWd1cmVkIGluIEhl YWRlckNvbmZpZy4iCiAgICBrZXkgPSBIZWFkZXJDb25maWcucGFyYW1ldGVyc1tjb25maWdwYXJh bV0KICAgIGlmIG5vdCBrZXkgaW4gc2VsZi5wYXJhbWV0ZXJzOgogICAgICByZXR1cm4gTm9uZQog ICAgcmV0dXJuIHNlbGYucGFyYW1ldGVyc1trZXldCgogIGRlZiBnZXRsZXZlbChzZWxmLCBjb25m aWdwYXJhbSk6CiAgICAiR2V0IGEgbGV2ZWwgcmVhZCBhcyBhIHBhcmFtZXRlciBmcm9tIEhlYWRl ckNvbmZpZy4iCiAgICB2YWx1ZSA9IGludChzZWxmLmdldHBhcmFtZXRlcihjb25maWdwYXJhbSkp CiAgICBpZiBOdW1iZXJHZW5lcmF0b3Iuc3RhcnRpbmdsZXZlbCA9PSAxOgogICAgICByZXR1cm4g dmFsdWUKICAgIHJldHVybiB2YWx1ZSArIDEKCmNsYXNzIEx5WEZvb3RlcihDb250YWluZXIpOgog ICJSZWFkcyB0aGUgZm9vdGVyLCBvdXRwdXRzIHRoZSBIVE1MIGZvb3RlciIKCiAgZGVmIF9faW5p dF9fKHNlbGYpOgogICAgc2VsZi5jb250ZW50cyA9IFtdCiAgICBzZWxmLnBhcnNlciA9IEJvdW5k ZWREdW1teSgpCiAgICBzZWxmLm91dHB1dCA9IEZvb3Rlck91dHB1dCgpCgpjbGFzcyBBbGlnbihD b250YWluZXIpOgogICJCaXQgb2YgYWxpZ25lZCB0ZXh0IgoKICBkZWYgX19pbml0X18oc2VsZik6 CiAgICBzZWxmLnBhcnNlciA9IEV4Y2x1ZGluZ1BhcnNlcigpCiAgICBzZWxmLm91dHB1dCA9IFRh Z2dlZE91dHB1dCgpLnNldGJyZWFrbGluZXMoVHJ1ZSkKCiAgZGVmIHByb2Nlc3Moc2VsZik6CiAg ICBzZWxmLm91dHB1dC50YWcgPSAnZGl2IGNsYXNzPSInICsgc2VsZi5oZWFkZXJbMV0gKyAnIicK CmNsYXNzIE5ld2xpbmUoQ29udGFpbmVyKToKICAiQSBuZXdsaW5lIgoKICBkZWYgX19pbml0X18o c2VsZik6CiAgICBzZWxmLnBhcnNlciA9IExvbmVDb21tYW5kKCkKICAgIHNlbGYub3V0cHV0ID0g Rml4ZWRPdXRwdXQoKQoKICBkZWYgcHJvY2VzcyhzZWxmKToKICAgICJQcm9jZXNzIGNvbnRlbnRz IgogICAgc2VsZi5odG1sID0gWyc8YnIvPlxuJ10KCmNsYXNzIE5ld1BhZ2UoTmV3bGluZSk6CiAg IkEgbmV3IHBhZ2UiCgogIGRlZiBwcm9jZXNzKHNlbGYpOgogICAgIlByb2Nlc3MgY29udGVudHMi CiAgICBzZWxmLmh0bWwgPSBbJzxwPjxici8+XG48L3A+XG4nXQoKY2xhc3MgQXBwZW5kaXgoQ29u dGFpbmVyKToKICAiQW4gYXBwZW5kaXggdG8gdGhlIG1haW4gZG9jdW1lbnQiCgogIGRlZiBfX2lu aXRfXyhzZWxmKToKICAgIHNlbGYucGFyc2VyID0gTG9uZUNvbW1hbmQoKQogICAgc2VsZi5vdXRw dXQgPSBFbXB0eU91dHB1dCgpCgpjbGFzcyBMaXN0SXRlbShDb250YWluZXIpOgogICJBbiBlbGVt ZW50IGluIGEgbGlzdCIKCiAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgIk91dHB1dCBzaG91bGQg YmUgZW1wdHkgdW50aWwgdGhlIHBvc3Rwcm9jZXNzb3IgY2FuIGdyb3VwIGl0ZW1zIgogICAgc2Vs Zi5jb250ZW50cyA9IGxpc3QoKQogICAgc2VsZi5wYXJzZXIgPSBCb3VuZGVkUGFyc2VyKCkKICAg IHNlbGYub3V0cHV0ID0gRW1wdHlPdXRwdXQoKQoKICBkZWYgcHJvY2VzcyhzZWxmKToKICAgICJT ZXQgdGhlIGNvcnJlY3QgdHlwZSBhbmQgY29udGVudHMuIgogICAgc2VsZi50eXBlID0gc2VsZi5o ZWFkZXJbMV0KICAgIHRhZyA9IFRhZ2dlZFRleHQoKS5jb21wbGV0ZShzZWxmLmNvbnRlbnRzLCAn bGknLCBUcnVlKQogICAgc2VsZi5jb250ZW50cyA9IFt0YWddCgogIGRlZiBfX3VuaWNvZGVfXyhz ZWxmKToKICAgIHJldHVybiBzZWxmLnR5cGUgKyAnIGl0ZW0gQCAnICsgdW5pY29kZShzZWxmLmJl Z2luKQoKY2xhc3MgRGVlcGVyTGlzdChDb250YWluZXIpOgogICJBIG5lc3RlZCBsaXN0IgoKICBk ZWYgX19pbml0X18oc2VsZik6CiAgICAiT3V0cHV0IHNob3VsZCBiZSBlbXB0eSB1bnRpbCB0aGUg cG9zdHByb2Nlc3NvciBjYW4gZ3JvdXAgaXRlbXMiCiAgICBzZWxmLnBhcnNlciA9IEJvdW5kZWRQ YXJzZXIoKQogICAgc2VsZi5vdXRwdXQgPSBFbXB0eU91dHB1dCgpCgogIGRlZiBwcm9jZXNzKHNl bGYpOgogICAgIkNyZWF0ZSB0aGUgZGVlcGVyIGxpc3QiCiAgICBpZiBsZW4oc2VsZi5jb250ZW50 cykgPT0gMDoKICAgICAgVHJhY2UuZXJyb3IoJ0VtcHR5IGRlZXBlciBsaXN0JykKICAgICAgcmV0 dXJuCgogIGRlZiBfX3VuaWNvZGVfXyhzZWxmKToKICAgIHJlc3VsdCA9ICdkZWVwZXIgbGlzdCBA ICcgKyB1bmljb2RlKHNlbGYuYmVnaW4pICsgJzogWycKICAgIGZvciBlbGVtZW50IGluIHNlbGYu Y29udGVudHM6CiAgICAgIHJlc3VsdCArPSB1bmljb2RlKGVsZW1lbnQpICsgJywgJwogICAgcmV0 dXJuIHJlc3VsdFs6LTJdICsgJ10nCgpjbGFzcyBFUlQoQ29udGFpbmVyKToKICAiRXZpbCBSZWQg VGV4dCIKCiAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgc2VsZi5wYXJzZXIgPSBJbnNldFBhcnNl cigpCiAgICBzZWxmLm91dHB1dCA9IEVtcHR5T3V0cHV0KCkKCgoKCgoKY2xhc3MgTGF5b3V0KENv bnRhaW5lcik6CiAgIkEgbGF5b3V0IChibG9jayBvZiB0ZXh0KSBpbnNpZGUgYSBseXggZmlsZSIK CiAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgc2VsZi5jb250ZW50cyA9IGxpc3QoKQogICAgc2Vs Zi5wYXJzZXIgPSBCb3VuZGVkUGFyc2VyKCkKICAgIHNlbGYub3V0cHV0ID0gVGFnZ2VkT3V0cHV0 KCkuc2V0YnJlYWtsaW5lcyhUcnVlKQoKICBkZWYgcHJvY2VzcyhzZWxmKToKICAgIHNlbGYudHlw ZSA9IHNlbGYuaGVhZGVyWzFdCiAgICBpZiBzZWxmLnR5cGUgaW4gVGFnQ29uZmlnLmxheW91dHM6 CiAgICAgIHNlbGYub3V0cHV0LnRhZyA9IFRhZ0NvbmZpZy5sYXlvdXRzW3NlbGYudHlwZV0gKyAn IGNsYXNzPSInICsgc2VsZi50eXBlICsgJyInCiAgICBlbGlmIHNlbGYudHlwZS5yZXBsYWNlKCcq JywgJycpIGluIFRhZ0NvbmZpZy5sYXlvdXRzOgogICAgICBzZWxmLm91dHB1dC50YWcgPSBUYWdD b25maWcubGF5b3V0c1tzZWxmLnR5cGUucmVwbGFjZSgnKicsICcnKV0gKyAnIGNsYXNzPSInICsg IHNlbGYudHlwZS5yZXBsYWNlKCcqJywgJy0nKSArICciJwogICAgZWxzZToKICAgICAgc2VsZi5v dXRwdXQudGFnID0gJ2RpdiBjbGFzcz0iJyArIHNlbGYudHlwZSArICciJwoKICBkZWYgX191bmlj b2RlX18oc2VsZik6CiAgICByZXR1cm4gJ0xheW91dCBvZiB0eXBlICcgKyBzZWxmLnR5cGUKCmNs YXNzIFN0YW5kYXJkTGF5b3V0KExheW91dCk6CiAgIkEgc3RhbmRhcmQgbGF5b3V0IC0tIGNhbiBi ZSBhIHRydWUgZGl2IG9yIG5vdGhpbmcgYXQgYWxsIgoKICBpbmRlbnRhdGlvbiA9IEZhbHNlCgog IGRlZiBwcm9jZXNzKHNlbGYpOgogICAgc2VsZi50eXBlID0gJ3N0YW5kYXJkJwogICAgc2VsZi5v dXRwdXQgPSBDb250ZW50c091dHB1dCgpCgogIGRlZiBjb21wbGV0ZShzZWxmLCBjb250ZW50cyk6 CiAgICAiU2V0IHRoZSBjb250ZW50cyBhbmQgcmV0dXJuIGl0LiIKICAgIHNlbGYucHJvY2Vzcygp CiAgICBzZWxmLmNvbnRlbnRzID0gY29udGVudHMKICAgIHJldHVybiBzZWxmCgpjbGFzcyBUaXRs ZShMYXlvdXQpOgogICJUaGUgdGl0bGUgb2YgdGhlIHdob2xlIGRvY3VtZW50IgoKICBkZWYgcHJv Y2VzcyhzZWxmKToKICAgIHNlbGYudHlwZSA9ICd0aXRsZScKICAgIHNlbGYub3V0cHV0LnRhZyA9 ICdoMSBjbGFzcz0idGl0bGUiJwogICAgc2VsZi50aXRsZSA9IHNlbGYuZXh0cmFjdHRleHQoKQog ICAgVGl0bGVPdXRwdXQudGl0bGUgPSBzZWxmLnRpdGxlCiAgICBUcmFjZS5tZXNzYWdlKCdUaXRs ZTogJyArIHNlbGYudGl0bGUpCgpjbGFzcyBBdXRob3IoTGF5b3V0KToKICAiVGhlIGRvY3VtZW50 IGF1dGhvciIKCiAgZGVmIHByb2Nlc3Moc2VsZik6CiAgICBzZWxmLnR5cGUgPSAnYXV0aG9yJwog ICAgc2VsZi5vdXRwdXQudGFnID0gJ2gyIGNsYXNzPSJhdXRob3IiJwogICAgc3RyaW5ncyA9IHNl bGYuc2VhcmNoYWxsKFN0cmluZ0NvbnRhaW5lcikKICAgIGlmIGxlbihzdHJpbmdzKSA+IDA6CiAg ICAgIEZvb3Rlck91dHB1dC5hdXRob3IgPSBzdHJpbmdzWzBdLnN0cmluZwogICAgICBUcmFjZS5k ZWJ1ZygnQXV0aG9yOiAnICsgRm9vdGVyT3V0cHV0LmF1dGhvcikKCmNsYXNzIEFic3RyYWN0KExh eW91dCk6CiAgIkEgcGFwZXIgYWJzdHJhY3QiCgogIGRlZiBwcm9jZXNzKHNlbGYpOgogICAgc2Vs Zi50eXBlID0gJ2Fic3RyYWN0JwogICAgc2VsZi5vdXRwdXQudGFnID0gJ2RpdiBjbGFzcz0iYWJz dHJhY3QiJwogICAgbWVzc2FnZSA9IFRyYW5zbGF0aW9uQ29uZmlnLmNvbnN0YW50c1snYWJzdHJh Y3QnXQogICAgdGFnZ2VkID0gVGFnZ2VkVGV4dCgpLmNvbnN0YW50KG1lc3NhZ2UsICdwIGNsYXNz PSJhYnN0cmFjdC1tZXNzYWdlIicsIFRydWUpCiAgICBzZWxmLmNvbnRlbnRzLmluc2VydCgwLCB0 YWdnZWQpCgpjbGFzcyBGaXJzdFdvcmRlcihMYXlvdXQpOgogICJBIGxheW91dCB3aGVyZSB0aGUg Zmlyc3Qgd29yZCBpcyBleHRyYWN0ZWQiCgogIGRlZiBleHRyYWN0Zmlyc3R3b3JkKHNlbGYsIGNv bnRlbnRzKToKICAgICJFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIGFzIGEgbGlzdCIKICAgIGZpcnN0 LCBmb3VuZCA9IHNlbGYuZXh0cmFjdGZpcnN0dHVwbGUoY29udGVudHMpCiAgICByZXR1cm4gZmly c3QKCiAgZGVmIGV4dHJhY3RmaXJzdHR1cGxlKHNlbGYsIGNvbnRlbnRzKToKICAgICJFeHRyYWN0 IHRoZSBmaXJzdCB3b3JkIGFzIGEgdHVwbGUiCiAgICBmaXJzdGNvbnRlbnRzID0gW10KICAgIGlu ZGV4ID0gMAogICAgd2hpbGUgaW5kZXggPCBsZW4oY29udGVudHMpOgogICAgICBmaXJzdCwgZm91 bmQgPSBzZWxmLmV4dHJhY3RmaXJzdGNvbnRhaW5lcihjb250ZW50c1tpbmRleF0pCiAgICAgIGlm IGZpcnN0OgogICAgICAgIGZpcnN0Y29udGVudHMgKz0gZmlyc3QKICAgICAgaWYgZm91bmQ6CiAg ICAgICAgcmV0dXJuIGZpcnN0Y29udGVudHMsIFRydWUKICAgICAgZWxzZToKICAgICAgICBkZWwg Y29udGVudHNbaW5kZXhdCiAgICByZXR1cm4gZmlyc3Rjb250ZW50cywgRmFsc2UKCiAgZGVmIGV4 dHJhY3RmaXJzdGNvbnRhaW5lcihzZWxmLCBjb250YWluZXIpOgogICAgIkV4dHJhY3QgdGhlIGZp cnN0IHdvcmQgZnJvbSBhIHN0cmluZyBjb250YWluZXIiCiAgICBpZiBpc2luc3RhbmNlKGNvbnRh aW5lciwgU3RyaW5nQ29udGFpbmVyKToKICAgICAgcmV0dXJuIHNlbGYuZXh0cmFjdGZpcnN0c3Ry aW5nKGNvbnRhaW5lcikKICAgIGlmIGlzaW5zdGFuY2UoY29udGFpbmVyLCBFUlQpOgogICAgICBy ZXR1cm4gW2NvbnRhaW5lcl0sIEZhbHNlCiAgICBpZiBsZW4oY29udGFpbmVyLmNvbnRlbnRzKSA9 PSAwOgogICAgICAjIGVtcHR5IGNvbnRhaW5lcgogICAgICByZXR1cm4gW2NvbnRhaW5lcl0sIEZh bHNlCiAgICBmaXJzdCwgZm91bmQgPSBzZWxmLmV4dHJhY3RmaXJzdHR1cGxlKGNvbnRhaW5lci5j b250ZW50cykKICAgIGlmIGlzaW5zdGFuY2UoY29udGFpbmVyLCBUYWdnZWRUZXh0KSBhbmQgaGFz YXR0cihjb250YWluZXIsICd0YWcnKToKICAgICAgbmV3dGFnID0gVGFnZ2VkVGV4dCgpLmNvbXBs ZXRlKGZpcnN0LCBjb250YWluZXIudGFnKQogICAgICByZXR1cm4gW25ld3RhZ10sIGZvdW5kCiAg ICByZXR1cm4gZmlyc3QsIGZvdW5kCgogIGRlZiBleHRyYWN0Zmlyc3RzdHJpbmcoc2VsZiwgY29u dGFpbmVyKToKICAgICJFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIGZyb20gYSBzdHJpbmcgY29udGFp bmVyIgogICAgc3RyaW5nID0gY29udGFpbmVyLnN0cmluZwogICAgaWYgbm90ICcgJyBpbiBzdHJp bmc6CiAgICAgIHJldHVybiBbY29udGFpbmVyXSwgRmFsc2UKICAgIHNwbGl0ID0gc3RyaW5nLnNw bGl0KCcgJywgMSkKICAgIGNvbnRhaW5lci5zdHJpbmcgPSBzcGxpdFsxXQogICAgcmV0dXJuIFtD b25zdGFudChzcGxpdFswXSldLCBUcnVlCgpjbGFzcyBEZXNjcmlwdGlvbihGaXJzdFdvcmRlcik6 CiAgIkEgZGVzY3JpcHRpb24gbGF5b3V0IgoKICBkZWYgcHJvY2VzcyhzZWxmKToKICAgICJTZXQg dGhlIGZpcnN0IHdvcmQgdG8gYm9sZCIKICAgIHNlbGYudHlwZSA9ICdEZXNjcmlwdGlvbicKICAg IHNlbGYub3V0cHV0LnRhZyA9ICdkaXYgY2xhc3M9IkRlc2NyaXB0aW9uIicKICAgIGZpcnN0d29y ZCA9IHNlbGYuZXh0cmFjdGZpcnN0d29yZChzZWxmLmNvbnRlbnRzKQogICAgaWYgbm90IGZpcnN0 d29yZDoKICAgICAgcmV0dXJuCiAgICBmaXJzdHdvcmQuYXBwZW5kKENvbnN0YW50KHUn4oCDJykp CiAgICB0YWcgPSAnc3BhbiBjbGFzcz0iRGVzY3JpcHRpb24tZW50cnkiJwogICAgc2VsZi5jb250 ZW50cy5pbnNlcnQoMCwgVGFnZ2VkVGV4dCgpLmNvbXBsZXRlKGZpcnN0d29yZCwgdGFnKSkKCmNs YXNzIExpc3QoRmlyc3RXb3JkZXIpOgogICJBIGxpc3QgbGF5b3V0IgoKICBkZWYgcHJvY2Vzcyhz ZWxmKToKICAgICJTZXQgdGhlIGZpcnN0IHdvcmQgdG8gYm9sZCIKICAgIHNlbGYudHlwZSA9ICdM aXN0JwogICAgc2VsZi5vdXRwdXQudGFnID0gJ2RpdiBjbGFzcz0iTGlzdCInCiAgICBmaXJzdHdv cmQgPSBzZWxmLmV4dHJhY3RmaXJzdHdvcmQoc2VsZi5jb250ZW50cykKICAgIGlmIG5vdCBmaXJz dHdvcmQ6CiAgICAgIHJldHVybgogICAgdGFnID0gJ3NwYW4gY2xhc3M9Ikxpc3QtZW50cnkiJwog ICAgc2VsZi5jb250ZW50cy5pbnNlcnQoMCwgVGFnZ2VkVGV4dCgpLmNvbXBsZXRlKGZpcnN0d29y ZCwgdGFnKSkKCmNsYXNzIFBsYWluTGF5b3V0KExheW91dCk6CiAgIkEgcGxhaW4gbGF5b3V0IgoK ICBkZWYgcHJvY2VzcyhzZWxmKToKICAgICJPdXRwdXQganVzdCBhcyBjb250ZW50cy4iCiAgICBz ZWxmLm91dHB1dCA9IENvbnRlbnRzT3V0cHV0KCkKICAgIHNlbGYudHlwZSA9ICdQbGFpbicKCgoK CgoKY2xhc3MgSW5zZXRUZXh0KENvbnRhaW5lcik6CiAgIkFuIGluc2V0IG9mIHRleHQgaW4gYSBs eXggZmlsZSIKCiAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgc2VsZi5wYXJzZXIgPSBCb3VuZGVk UGFyc2VyKCkKICAgIHNlbGYub3V0cHV0ID0gQ29udGVudHNPdXRwdXQoKQoKY2xhc3MgSW5zZXQo Q29udGFpbmVyKToKICAiQSBnZW5lcmljIGluc2V0IGluIGEgTHlYIGRvY3VtZW50IgoKICBkZWYg X19pbml0X18oc2VsZik6CiAgICBzZWxmLmNvbnRlbnRzID0gbGlzdCgpCiAgICBzZWxmLnBhcnNl ciA9IEluc2V0UGFyc2VyKCkKICAgIHNlbGYub3V0cHV0ID0gVGFnZ2VkT3V0cHV0KCkuc2V0YnJl YWtsaW5lcyhUcnVlKQoKICBkZWYgcHJvY2VzcyhzZWxmKToKICAgIHNlbGYudHlwZSA9IHNlbGYu aGVhZGVyWzFdCiAgICBzZWxmLm91dHB1dC50YWcgPSAnc3BhbiBjbGFzcz0iJyArIHNlbGYudHlw ZSArICciJwoKICBkZWYgX191bmljb2RlX18oc2VsZik6CiAgICByZXR1cm4gJ0luc2V0IG9mIHR5 cGUgJyArIHNlbGYudHlwZQoKY2xhc3MgTmV3bGluZUluc2V0KE5ld2xpbmUpOgogICJBIG5ld2xp bmUgb3IgbGluZSBicmVhayBpbiBhbiBpbnNldCIKCiAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAg c2VsZi5wYXJzZXIgPSBJbnNldFBhcnNlcigpCiAgICBzZWxmLm91dHB1dCA9IEZpeGVkT3V0cHV0 KCkKCmNsYXNzIEJyYW5jaChDb250YWluZXIpOgogICJBIGJyYW5jaCB3aXRoaW4gYSBMeVggZG9j dW1lbnQiCgogIGRlZiBfX2luaXRfXyhzZWxmKToKICAgIHNlbGYucGFyc2VyID0gSW5zZXRQYXJz ZXIoKQogICAgc2VsZi5vdXRwdXQgPSBUYWdnZWRPdXRwdXQoKS5zZXR0YWcoJ3NwYW4gY2xhc3M9 ImJyYW5jaCInLCBUcnVlKQoKICBkZWYgcHJvY2VzcyhzZWxmKToKICAgICJEaXNhYmxlIGluYWN0 aXZlIGJyYW5jaGVzIgogICAgc2VsZi5icmFuY2ggPSBzZWxmLmhlYWRlclsyXQogICAgaWYgbm90 IHNlbGYuaXNhY3RpdmUoKToKICAgICAgVHJhY2UuZGVidWcoJ0JyYW5jaCAnICsgc2VsZi5icmFu Y2ggKyAnIG5vdCBhY3RpdmUnKQogICAgICBzZWxmLm91dHB1dCA9IEVtcHR5T3V0cHV0KCkKCiAg ZGVmIGlzYWN0aXZlKHNlbGYpOgogICAgIkNoZWNrIGlmIHRoZSBicmFuY2ggaXMgYWN0aXZlIgog ICAgaWYgbm90IHNlbGYuYnJhbmNoIGluIE9wdGlvbnMuYnJhbmNoZXM6CiAgICAgIFRyYWNlLmVy cm9yKCdJbnZhbGlkIGJyYW5jaCAnICsgc2VsZi5icmFuY2gpCiAgICAgIHJldHVybiBUcnVlCiAg ICBicmFuY2ggPSBPcHRpb25zLmJyYW5jaGVzW3NlbGYuYnJhbmNoXQogICAgcmV0dXJuIGJyYW5j aC5pc3NlbGVjdGVkKCkKCmNsYXNzIFNob3J0VGl0bGUoQ29udGFpbmVyKToKICAiQSBzaG9ydCB0 aXRsZSB0byBkaXNwbGF5IChhbHdheXMgaGlkZGVuKSIKCiAgZGVmIF9faW5pdF9fKHNlbGYpOgog ICAgc2VsZi5wYXJzZXIgPSBJbnNldFBhcnNlcigpCiAgICBzZWxmLm91dHB1dCA9IEVtcHR5T3V0 cHV0KCkKCmNsYXNzIEZvb3Rub3RlKENvbnRhaW5lcik6CiAgIkEgZm9vdG5vdGUgdG8gdGhlIG1h aW4gdGV4dCIKCiAgb3JkZXIgPSAwCiAgbGlzdCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZ WicKCiAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgc2VsZi5wYXJzZXIgPSBJbnNldFBhcnNlcigp CiAgICBzZWxmLm91dHB1dCA9IENvbnRlbnRzT3V0cHV0KCkKCiAgZGVmIHByb2Nlc3Moc2VsZik6 CiAgICAiQWRkIGEgbGV0dGVyIGZvciB0aGUgb3JkZXIsIHJvdGF0aW5nIgogICAgbGV0dGVyID0g Rm9vdG5vdGUubGlzdFtGb290bm90ZS5vcmRlciAlIGxlbihGb290bm90ZS5saXN0KV0KICAgIHNw YW4gPSAnc3BhbiBjbGFzcz0iRm9vdE1hcmtlciInCiAgICBwcmUgPSBGb290bm90ZUNvbmZpZy5j b25zdGFudHNbJ3ByZWZyb20nXQogICAgcG9zdCA9IEZvb3Rub3RlQ29uZmlnLmNvbnN0YW50c1sn cG9zdGZyb20nXQogICAgZnJvbWZvb3QgPSBUYWdnZWRUZXh0KCkuY29uc3RhbnQocHJlICsgbGV0 dGVyICsgcG9zdCwgc3BhbikKICAgIHNlbGYuY29udGVudHMuaW5zZXJ0KDAsIGZyb21mb290KQog ICAgdGFnID0gVGFnZ2VkVGV4dCgpLmNvbXBsZXRlKHNlbGYuY29udGVudHMsICdzcGFuIGNsYXNz PSJGb290IicsIFRydWUpCiAgICBwcmUgPSBGb290bm90ZUNvbmZpZy5jb25zdGFudHNbJ3ByZXRv J10KICAgIHBvc3QgPSBGb290bm90ZUNvbmZpZy5jb25zdGFudHNbJ3Bvc3R0byddCiAgICB0b2Zv b3QgPSBUYWdnZWRUZXh0KCkuY29uc3RhbnQocHJlICsgbGV0dGVyICsgcG9zdCwgc3BhbikKICAg IHNlbGYuY29udGVudHMgPSBbdG9mb290LCB0YWddCiAgICBGb290bm90ZS5vcmRlciArPSAxCgpj bGFzcyBOb3RlKENvbnRhaW5lcik6CiAgIkEgTHlYIG5vdGUgb2Ygc2V2ZXJhbCB0eXBlcyIKCiAg ZGVmIF9faW5pdF9fKHNlbGYpOgogICAgc2VsZi5wYXJzZXIgPSBJbnNldFBhcnNlcigpCiAgICBz ZWxmLm91dHB1dCA9IEVtcHR5T3V0cHV0KCkKCiAgZGVmIHByb2Nlc3Moc2VsZik6CiAgICAiSGlk ZSBub3RlIGFuZCBjb21tZW50LCBkaW0gZ3JleWVkIG91dCIKICAgIHNlbGYudHlwZSA9IHNlbGYu aGVhZGVyWzJdCiAgICBpZiBUYWdDb25maWcubm90ZXNbc2VsZi50eXBlXSA9PSAnJzoKICAgICAg cmV0dXJuCiAgICBzZWxmLm91dHB1dCA9IFRhZ2dlZE91dHB1dCgpLnNldHRhZyhUYWdDb25maWcu bm90ZXNbc2VsZi50eXBlXSwgVHJ1ZSkKCmNsYXNzIEZsZXhDb2RlKENvbnRhaW5lcik6CiAgIkEg Yml0IG9mIGluc2V0IGNvZGUiCgogIGRlZiBfX2luaXRfXyhzZWxmKToKICAgIHNlbGYucGFyc2Vy ID0gSW5zZXRQYXJzZXIoKQogICAgc2VsZi5vdXRwdXQgPSBUYWdnZWRPdXRwdXQoKS5zZXR0YWco J3NwYW4gY2xhc3M9ImNvZGUiJywgVHJ1ZSkKCmNsYXNzIEluZm9JbnNldChDb250YWluZXIpOgog ICJBIEx5WCBJbmZvIGluc2V0IgoKICBkZWYgX19pbml0X18oc2VsZik6CiAgICBzZWxmLnBhcnNl ciA9IEluc2V0UGFyc2VyKCkKICAgIHNlbGYub3V0cHV0ID0gVGFnZ2VkT3V0cHV0KCkuc2V0dGFn KCdzcGFuIGNsYXNzPSJJbmZvIicsIEZhbHNlKQoKICBkZWYgcHJvY2VzcyhzZWxmKToKICAgICJT ZXQgdGhlIHNob3J0Y3V0IGFzIHRleHQiCiAgICBzZWxmLnR5cGUgPSBzZWxmLnBhcmFtZXRlcnNb J3R5cGUnXQogICAgc2VsZi5jb250ZW50cyA9IFtDb25zdGFudChzZWxmLnBhcmFtZXRlcnNbJ2Fy ZyddKV0KCmNsYXNzIEJveEluc2V0KENvbnRhaW5lcik6CiAgIkEgYm94IGluc2V0IgoKICBkZWYg X19pbml0X18oc2VsZik6CiAgICBzZWxmLnBhcnNlciA9IEluc2V0UGFyc2VyKCkKICAgIHNlbGYu b3V0cHV0ID0gVGFnZ2VkT3V0cHV0KCkuc2V0dGFnKCdkaXYnLCBUcnVlKQoKICBkZWYgcHJvY2Vz cyhzZWxmKToKICAgICJTZXQgdGhlIGNvcnJlY3QgdGFnIgogICAgc2VsZi50eXBlID0gc2VsZi5o ZWFkZXJbMl0KICAgIGlmIG5vdCBzZWxmLnR5cGUgaW4gVGFnQ29uZmlnLmJveGVzOgogICAgICBU cmFjZS5lcnJvcignVWtub3duIGJveCB0eXBlICcgKyBzZWxmLnR5cGUpCiAgICAgIHJldHVybgog ICAgc2VsZi5vdXRwdXQuc2V0dGFnKFRhZ0NvbmZpZy5ib3hlc1tzZWxmLnR5cGVdLCBUcnVlKQoK Y2xhc3MgSW5jbHVkZUluc2V0KENvbnRhaW5lcik6CiAgIkEgY2hpbGQgZG9jdW1lbnQgaW5jbHVk ZWQgd2l0aGluIGFub3RoZXIuIgoKICAjIHRoZSBjb252ZXJ0ZXIgZmFjdG9yeSB3aWxsIGJlIHNl dCBpbiBjb252ZXJ0ZXIucHkKICBjb252ZXJ0ZXJmYWN0b3J5ID0gTm9uZQoKICBkZWYgX19pbml0 X18oc2VsZik6CiAgICBzZWxmLnBhcnNlciA9IEluc2V0UGFyc2VyKCkKICAgIHNlbGYub3V0cHV0 ID0gQ29udGVudHNPdXRwdXQoKQoKICBkZWYgcHJvY2VzcyhzZWxmKToKICAgICJJbmNsdWRlIHRo ZSBwcm92aWRlZCBjaGlsZCBkb2N1bWVudCIKICAgIHNlbGYuZmlsZW5hbWUgPSBzZWxmLnBhcmFt ZXRlcnNbJ2ZpbGVuYW1lJ10KICAgIFRyYWNlLmRlYnVnKCdDaGlsZCBkb2N1bWVudDogJyArIHNl bGYuZmlsZW5hbWUpCiAgICBpZiAnbHN0cGFyYW1zJyBpbiBzZWxmLnBhcmFtZXRlcnM6CiAgICAg IHNlbGYucGFyc2Vsc3RwYXJhbXMoKQogICAgY29udmVydGVyID0gSW5jbHVkZUluc2V0LmNvbnZl cnRlcmZhY3RvcnkuY3JlYXRlKHNlbGYpCiAgICBjb252ZXJ0ZXIuY29udmVydCgpCiAgICBzZWxm LmNvbnRlbnRzID0gY29udmVydGVyLmdldGNvbnRlbnRzKCkKCgoKY2xhc3MgUG9zdExheW91dChv YmplY3QpOgogICJOdW1lcmF0ZSBhbiBpbmRleGVkIGxheW91dCIKCiAgcHJvY2Vzc2VkY2xhc3Mg PSBMYXlvdXQKCiAgZGVmIHBvc3Rwcm9jZXNzKHNlbGYsIGxhc3QsIGxheW91dCwgbmV4dCk6CiAg ICAiR2VuZXJhdGUgYSBudW1iZXIgYW5kIHBsYWNlIGl0IGJlZm9yZSB0aGUgdGV4dCIKICAgIGlm IG5vdCBMYXlvdXROdW1iZXJlci5pbnN0YW5jZS5pc251bWJlcmVkKGxheW91dCk6CiAgICAgIHJl dHVybiBsYXlvdXQKICAgIGlmIHNlbGYuY29udGFpbnNhcHBlbmRpeChsYXlvdXQpOgogICAgICBz ZWxmLmFjdGl2YXRlYXBwZW5kaXgoKQogICAgTGF5b3V0TnVtYmVyZXIuaW5zdGFuY2UubnVtYmVy KGxheW91dCkKICAgIGxhYmVsID0gTGFiZWwoKS5jcmVhdGUobGF5b3V0LmFuY2hvcnRleHQsIGxh eW91dC5wYXJ0a2V5LCB0eXBlPSd0b2MnKQogICAgbGF5b3V0LmNvbnRlbnRzLmluc2VydCgwLCBs YWJlbCkKICAgIGlmIGxheW91dC5udW1iZXIgIT0gJyc6CiAgICAgIGxheW91dC5jb250ZW50cy5p bnNlcnQoMSwgQ29uc3RhbnQodSfigIMnKSkKICAgIHJldHVybiBsYXlvdXQKCiAgZGVmIG1vZGlm eWxheW91dChzZWxmLCBsYXlvdXQsIHR5cGUpOgogICAgIk1vZGlmeSBhIGxheW91dCBhY2NvcmRp bmcgdG8gdGhlIGdpdmVuIHR5cGUuIgogICAgbGF5b3V0LmxldmVsID0gTnVtYmVyR2VuZXJhdG9y Lmluc3RhbmNlLmdldGxldmVsKHR5cGUpCiAgICBsYXlvdXQub3V0cHV0LnRhZyA9IGxheW91dC5v dXRwdXQudGFnLnJlcGxhY2UoJz8nLCB1bmljb2RlKGxheW91dC5sZXZlbCkpCgogIGRlZiBjb250 YWluc2FwcGVuZGl4KHNlbGYsIGxheW91dCk6CiAgICAiRmluZCBvdXQgaWYgdGhlcmUgaXMgYW4g YXBwZW5kaXggc29tZXdoZXJlIGluIHRoZSBsYXlvdXQiCiAgICBmb3IgZWxlbWVudCBpbiBsYXlv dXQuY29udGVudHM6CiAgICAgIGlmIGlzaW5zdGFuY2UoZWxlbWVudCwgQXBwZW5kaXgpOgogICAg ICAgIHJldHVybiBUcnVlCiAgICByZXR1cm4gRmFsc2UKCiAgZGVmIGFjdGl2YXRlYXBwZW5kaXgo c2VsZik6CiAgICAiQ2hhbmdlIGZpcnN0IG51bWJlciB0byBsZXR0ZXIsIGFuZCBjaGFwdGVyIHRv IGFwcGVuZGl4IgogICAgTnVtYmVyR2VuZXJhdG9yLmluc3RhbmNlLm51bWJlciA9IFsnLSddCgpj bGFzcyBQb3N0U3RhbmRhcmQob2JqZWN0KToKICAiQ29udmVydCBhbnkgc3RhbmRhcmQgc3BhbnMg aW4gcm9vdCB0byBkaXZzIgoKICBwcm9jZXNzZWRjbGFzcyA9IFN0YW5kYXJkTGF5b3V0CgogIGRl ZiBwb3N0cHJvY2VzcyhzZWxmLCBsYXN0LCBzdGFuZGFyZCwgbmV4dCk6CiAgICAiU3dpdGNoIHRv IGRpdiIKICAgIHR5cGUgPSAnU3RhbmRhcmQnCiAgICBpZiBMeVhIZWFkZXIuaW5kZW50c3RhbmRh cmQ6CiAgICAgIGlmIGlzaW5zdGFuY2UobGFzdCwgU3RhbmRhcmRMYXlvdXQpOgogICAgICAgIHR5 cGUgPSAnSW5kZW50ZWQnCiAgICAgIGVsc2U6CiAgICAgICAgdHlwZSA9ICdVbmluZGVudGVkJwog ICAgc3RhbmRhcmQub3V0cHV0ID0gVGFnZ2VkT3V0cHV0KCkuc2V0dGFnKCdkaXYgY2xhc3M9Iicg KyB0eXBlICsgJyInLCBUcnVlKQogICAgcmV0dXJuIHN0YW5kYXJkCgpjbGFzcyBQb3N0cHJvY2Vz c29yKG9iamVjdCk6CiAgIlBvc3Rwcm9jZXNzIGEgY29udGFpbmVyIGtlZXBpbmcgc29tZSBjb250 ZXh0IgoKICBzdGFnZXMgPSBbUG9zdExheW91dCwgUG9zdFN0YW5kYXJkXQoKICBkZWYgX19pbml0 X18oc2VsZik6CiAgICBzZWxmLnN0YWdlcyA9IFN0YWdlRGljdChQb3N0cHJvY2Vzc29yLnN0YWdl cywgc2VsZikKICAgIHNlbGYuY3VycmVudCA9IE5vbmUKICAgIHNlbGYubGFzdCA9IE5vbmUKCiAg ZGVmIHBvc3Rwcm9jZXNzKHNlbGYsIG5leHQpOgogICAgIlBvc3Rwcm9jZXNzIHRoZSByb290IGNv bnRhaW5lciBhbmQgaXRzIGNvbnRlbnRzIgogICAgc2VsZi5wb3N0cmVjdXJzaXZlKHNlbGYuY3Vy cmVudCkKICAgIHJlc3VsdCA9IHNlbGYucG9zdGN1cnJlbnQobmV4dCkKICAgIHNlbGYubGFzdCA9 IHNlbGYuY3VycmVudAogICAgc2VsZi5jdXJyZW50ID0gbmV4dAogICAgcmV0dXJuIHJlc3VsdAoK ICBkZWYgcG9zdHJlY3Vyc2l2ZShzZWxmLCBjb250YWluZXIpOgogICAgIlBvc3Rwcm9jZXNzIHRo ZSBjb250YWluZXIgY29udGVudHMgcmVjdXJzaXZlbHkiCiAgICBpZiBub3QgaGFzYXR0cihjb250 YWluZXIsICdjb250ZW50cycpOgogICAgICByZXR1cm4KICAgIGlmIGxlbihjb250YWluZXIuY29u dGVudHMpID09IDA6CiAgICAgIHJldHVybgogICAgcG9zdHByb2Nlc3NvciA9IFBvc3Rwcm9jZXNz b3IoKQogICAgY29udGVudHMgPSBbXQogICAgZm9yIGVsZW1lbnQgaW4gY29udGFpbmVyLmNvbnRl bnRzOgogICAgICBwb3N0ID0gcG9zdHByb2Nlc3Nvci5wb3N0cHJvY2VzcyhlbGVtZW50KQogICAg ICBpZiBwb3N0OgogICAgICAgIGNvbnRlbnRzLmFwcGVuZChwb3N0KQogICAgIyB0d28gcm91bmRz IHRvIGVtcHR5IHRoZSBwaXBlbGluZQogICAgZm9yIGkgaW4gcmFuZ2UoMik6CiAgICAgIHBvc3Qg PSBwb3N0cHJvY2Vzc29yLnBvc3Rwcm9jZXNzKE5vbmUpCiAgICAgIGlmIHBvc3Q6CiAgICAgICAg Y29udGVudHMuYXBwZW5kKHBvc3QpCiAgICBjb250YWluZXIuY29udGVudHMgPSBjb250ZW50cwoK ICBkZWYgcG9zdGN1cnJlbnQoc2VsZiwgbmV4dCk6CiAgICAiUG9zdHByb2Nlc3MgdGhlIGN1cnJl bnQgZWxlbWVudCB0YWtpbmcgaW50byBhY2NvdW50IG5leHQgYW5kIGxhc3QuIgogICAgc3RhZ2Ug PSBzZWxmLnN0YWdlcy5nZXRzdGFnZShzZWxmLmN1cnJlbnQpCiAgICBpZiBub3Qgc3RhZ2U6CiAg ICAgIHJldHVybiBzZWxmLmN1cnJlbnQKICAgIHJldHVybiBzdGFnZS5wb3N0cHJvY2VzcyhzZWxm Lmxhc3QsIHNlbGYuY3VycmVudCwgbmV4dCkKCmNsYXNzIFN0YWdlRGljdChvYmplY3QpOgogICJB IGRpY3Rpb25hcnkgb2Ygc3RhZ2VzIGNvcnJlc3BvbmRpbmcgdG8gY2xhc3NlcyIKCiAgZGVmIF9f aW5pdF9fKHNlbGYsIGNsYXNzZXMsIHBvc3Rwcm9jZXNzb3IpOgogICAgIkluc3RhbnRpYXRlIGFu IGVsZW1lbnQgZnJvbSBlYWNoIGNsYXNzIGFuZCBzdG9yZSBhcyBhIGRpY3Rpb25hcnkiCiAgICBp bnN0YW5jZXMgPSBzZWxmLmluc3RhbnRpYXRlKGNsYXNzZXMsIHBvc3Rwcm9jZXNzb3IpCiAgICBz ZWxmLnN0YWdlZGljdCA9IGRpY3QoWyh4LnByb2Nlc3NlZGNsYXNzLCB4KSBmb3IgeCBpbiBpbnN0 YW5jZXNdKQoKICBkZWYgaW5zdGFudGlhdGUoc2VsZiwgY2xhc3NlcywgcG9zdHByb2Nlc3Nvcik6 CiAgICAiSW5zdGFudGlhdGUgYW4gZWxlbWVudCBmcm9tIGVhY2ggY2xhc3MiCiAgICBzdGFnZXMg PSBbeC5fX25ld19fKHgpIGZvciB4IGluIGNsYXNzZXNdCiAgICBmb3IgZWxlbWVudCBpbiBzdGFn ZXM6CiAgICAgIGVsZW1lbnQuX19pbml0X18oKQogICAgICBlbGVtZW50LnBvc3Rwcm9jZXNzb3Ig PSBwb3N0cHJvY2Vzc29yCiAgICByZXR1cm4gc3RhZ2VzCgogIGRlZiBnZXRzdGFnZShzZWxmLCBl bGVtZW50KToKICAgICJHZXQgdGhlIHN0YWdlIGZvciBhIGdpdmVuIGVsZW1lbnQsIGlmIHRoZSB0 eXBlIGlzIGluIHRoZSBkaWN0IgogICAgaWYgbm90IGVsZW1lbnQuX19jbGFzc19fIGluIHNlbGYu c3RhZ2VkaWN0OgogICAgICByZXR1cm4gTm9uZQogICAgcmV0dXJuIHNlbGYuc3RhZ2VkaWN0W2Vs ZW1lbnQuX19jbGFzc19fXQoKCgpjbGFzcyBCaWJsaW9DaXRlKENvbnRhaW5lcik6CiAgIkNpdGUg b2YgYSBiaWJsaW9ncmFwaHkgZW50cnkiCgogIGNpdGVzID0gZGljdCgpCiAgZ2VuZXJhdG9yID0g TnVtYmVyR2VuZXJhdG9yKCkKCiAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgc2VsZi5wYXJzZXIg PSBJbnNldFBhcnNlcigpCiAgICBzZWxmLm91dHB1dCA9IFRhZ2dlZE91dHB1dCgpLnNldHRhZygn c3VwJykKICAgIHNlbGYuY29udGVudHMgPSBbXQogICAgc2VsZi5lbnRyaWVzID0gW10KCiAgZGVm IHByb2Nlc3Moc2VsZik6CiAgICAiQWRkIGEgY2l0ZSB0byBldmVyeSBlbnRyeSIKICAgIGtleXMg PSBzZWxmLnBhcmFtZXRlcnNbJ2tleSddLnNwbGl0KCcsJykKICAgIGZvciBrZXkgaW4ga2V5czoK ICAgICAgbnVtYmVyID0gTnVtYmVyR2VuZXJhdG9yLmluc3RhbmNlLmdlbmVyYXRldW5pcXVlKCdi aWJsaW9jaXRlJykKICAgICAgZW50cnkgPSBzZWxmLmNyZWF0ZWVudHJ5KGtleSwgbnVtYmVyKQog ICAgICBjaXRlID0gTGluaygpLmNvbXBsZXRlKG51bWJlciwgJ2NpdGUtJyArIG51bWJlciwgdHlw ZT0nYmlibGlvY2l0ZScpCiAgICAgIGNpdGUuc2V0bXV0dWFsZGVzdGluYXRpb24oZW50cnkpCiAg ICAgIHNlbGYuY29udGVudHMgKz0gW2NpdGUsIENvbnN0YW50KCcsJyldCiAgICAgIGlmIG5vdCBr ZXkgaW4gQmlibGlvQ2l0ZS5jaXRlczoKICAgICAgICBCaWJsaW9DaXRlLmNpdGVzW2tleV0gPSBb XQogICAgICBCaWJsaW9DaXRlLmNpdGVzW2tleV0uYXBwZW5kKGNpdGUpCiAgICBpZiBsZW4oa2V5 cykgPiAwOgogICAgICAjIHJlbW92ZSB0cmFpbGluZyAsCiAgICAgIHNlbGYuY29udGVudHMucG9w KCkKCiAgZGVmIGNyZWF0ZWVudHJ5KHNlbGYsIGtleSwgbnVtYmVyKToKICAgICJDcmVhdGUgdGhl IGVudHJ5IHdpdGggdGhlIGdpdmVuIGtleSBhbmQgbnVtYmVyLiIKICAgIGVudHJ5ID0gTGluaygp LmNvbXBsZXRlKG51bWJlciwgJ2JpYmxpby0nICsgbnVtYmVyLCB0eXBlPSdiaWJsaW9lbnRyeScp CiAgICBpZiBub3Qga2V5IGluIEJpYmxpb0VudHJ5LmVudHJpZXM6CiAgICAgIEJpYmxpb0VudHJ5 LmVudHJpZXNba2V5XSA9IFtdCiAgICBCaWJsaW9FbnRyeS5lbnRyaWVzW2tleV0uYXBwZW5kKGVu dHJ5KQogICAgcmV0dXJuIGVudHJ5CgpjbGFzcyBCaWJsaW9ncmFwaHkoQ29udGFpbmVyKToKICAi QSBiaWJsaW9ncmFwaHkgbGF5b3V0IGNvbnRhaW5pbmcgYW4gZW50cnkiCgogIGRlZiBfX2luaXRf XyhzZWxmKToKICAgIHNlbGYucGFyc2VyID0gQm91bmRlZFBhcnNlcigpCiAgICBzZWxmLm91dHB1 dCA9IFRhZ2dlZE91dHB1dCgpLnNldHRhZygncCBjbGFzcz0iYmlibGlvIicsIFRydWUpCgpjbGFz cyBCaWJsaW9FbnRyeShDb250YWluZXIpOgogICJBIGJpYmxpb2dyYXBoeSBlbnRyeSIKCiAgZW50 cmllcyA9IGRpY3QoKQoKICBkZWYgX19pbml0X18oc2VsZik6CiAgICBzZWxmLnBhcnNlciA9IElu c2V0UGFyc2VyKCkKICAgIHNlbGYub3V0cHV0ID0gVGFnZ2VkT3V0cHV0KCkuc2V0dGFnKCdzcGFu IGNsYXNzPSJlbnRyeSInKQoKICBkZWYgcHJvY2VzcyhzZWxmKToKICAgICJQcm9jZXNzIHRoZSBj aXRlcyBmb3IgdGhlIGVudHJ5J3Mga2V5IgogICAgc2VsZi5wcm9jZXNzY2l0ZXMoc2VsZi5wYXJh bWV0ZXJzWydrZXknXSkKCiAgZGVmIHByb2Nlc3NjaXRlcyhzZWxmLCBrZXkpOgogICAgIkdldCBh bGwgdGhlIGNpdGVzIG9mIHRoZSBlbnRyeSIKICAgIHNlbGYua2V5ID0ga2V5CiAgICBpZiBub3Qg a2V5IGluIEJpYmxpb0VudHJ5LmVudHJpZXM6CiAgICAgIHNlbGYuY29udGVudHMuYXBwZW5kKENv bnN0YW50KCdbLV0gJykpCiAgICAgIHJldHVybgogICAgZW50cmllcyA9IEJpYmxpb0VudHJ5LmVu dHJpZXNba2V5XQogICAgc2VsZi5jb250ZW50cyA9IFtDb25zdGFudCgnWycpXQogICAgZm9yIGVu dHJ5IGluIGVudHJpZXM6CiAgICAgIHNlbGYuY29udGVudHMuYXBwZW5kKGVudHJ5KQogICAgICBz ZWxmLmNvbnRlbnRzLmFwcGVuZChDb25zdGFudCgnLCcpKQogICAgc2VsZi5jb250ZW50cy5wb3Ao LTEpCiAgICBzZWxmLmNvbnRlbnRzLmFwcGVuZChDb25zdGFudCgnXSAnKSkKCmNsYXNzIFBvc3RC aWJsaW8ob2JqZWN0KToKICAiSW5zZXJ0IGEgQmlibGlvZ3JhcGh5IGxlZ2VuZCBiZWZvcmUgdGhl IGZpcnN0IGl0ZW0iCgogIHByb2Nlc3NlZGNsYXNzID0gQmlibGlvZ3JhcGh5CgogIGRlZiBwb3N0 cHJvY2VzcyhzZWxmLCBsYXN0LCBlbGVtZW50LCBuZXh0KToKICAgICJJZiB3ZSBoYXZlIHRoZSBm aXJzdCBiaWJsaW9ncmFwaHkgaW5zZXJ0IGEgdGFnIgogICAgaWYgaXNpbnN0YW5jZShsYXN0LCBC aWJsaW9ncmFwaHkpOgogICAgICByZXR1cm4gZWxlbWVudAogICAgYmlibGlvZ3JhcGh5ID0gVHJh bnNsYXRpb25Db25maWcuY29uc3RhbnRzWydiaWJsaW9ncmFwaHknXQogICAgaGVhZGVyID0gVGFn Z2VkVGV4dCgpLmNvbnN0YW50KGJpYmxpb2dyYXBoeSwgJ2gxIGNsYXNzPSJiaWJsaW8iJykKICAg IGxheW91dCA9IFN0YW5kYXJkTGF5b3V0KCkuY29tcGxldGUoW2hlYWRlciwgZWxlbWVudF0pCiAg ICByZXR1cm4gbGF5b3V0CgpQb3N0cHJvY2Vzc29yLnN0YWdlcy5hcHBlbmQoUG9zdEJpYmxpbykK CgoKCmltcG9ydCBzeXMKCgoKCgpjbGFzcyBDbG9uZXIob2JqZWN0KToKICAiQW4gb2JqZWN0IHVz ZWQgdG8gY2xvbmUgb3RoZXIgb2JqZWN0cy4iCgogIGRlZiBjbG9uZShjbHMsIG9yaWdpbmFsKToK ICAgICJSZXR1cm4gYW4gZXhhY3QgY29weSBvZiBhbiBvYmplY3QuIgogICAgIlRoZSBvcmlnaW5h bCBvYmplY3QgbXVzdCBoYXZlIGFuIGVtcHR5IGNvbnN0cnVjdG9yLiIKICAgIHR5cGUgPSBvcmln aW5hbC5fX2NsYXNzX18KICAgIGNsb25lID0gdHlwZS5fX25ld19fKHR5cGUpCiAgICBjbG9uZS5f X2luaXRfXygpCiAgICByZXR1cm4gY2xvbmUKCiAgY2xvbmUgPSBjbGFzc21ldGhvZChjbG9uZSkK CgoKCmltcG9ydCBzeXMKCgoKaW1wb3J0IHN5cwoKCmNsYXNzIFBvc2l0aW9uKG9iamVjdCk6CiAg IkEgcG9zaXRpb24gaW4gYSB0ZXh0IHRvIHBhcnNlIgoKICBkZWYgX19pbml0X18oc2VsZiwgdGV4 dCk6CiAgICBzZWxmLnRleHQgPSB0ZXh0CiAgICBzZWxmLnBvcyA9IDAKICAgIHNlbGYuZW5kaW5n bGlzdCA9IEVuZGluZ0xpc3QoKQoKICBkZWYgc2tpcChzZWxmLCBzdHJpbmcpOgogICAgIlNraXAg YSBzdHJpbmciCiAgICBzZWxmLnBvcyArPSBsZW4oc3RyaW5nKQoKICBkZWYgcmVtYWluaW5nKHNl bGYpOgogICAgIlJldHVybiB0aGUgdGV4dCByZW1haW5pbmcgZm9yIHBhcnNpbmciCiAgICByZXR1 cm4gc2VsZi50ZXh0W3NlbGYucG9zOl0KCiAgZGVmIGZpbmlzaGVkKHNlbGYpOgogICAgIkZpbmQg b3V0IGlmIHRoZSBjdXJyZW50IGZvcm11bGEgaGFzIGZpbmlzaGVkIgogICAgaWYgc2VsZi5pc291 dCgpOgogICAgICBzZWxmLmVuZGluZ2xpc3QuY2hlY2twZW5kaW5nKCkKICAgICAgcmV0dXJuIFRy dWUKICAgIHJldHVybiBzZWxmLmVuZGluZ2xpc3QuY2hlY2tpbihzZWxmKQoKICBkZWYgaXNvdXQo c2VsZik6CiAgICAiRmluZCBvdXQgaWYgd2UgYXJlIG91dCBvZiB0aGUgZm9ybXVsYSB5ZXQiCiAg ICByZXR1cm4gc2VsZi5wb3MgPj0gbGVuKHNlbGYudGV4dCkKCiAgZGVmIGN1cnJlbnQoc2VsZik6 CiAgICAiUmV0dXJuIHRoZSBjdXJyZW50IGNoYXJhY3RlciIKICAgIGlmIHNlbGYuaXNvdXQoKToK ICAgICAgVHJhY2UuZXJyb3IoJ091dCBvZiB0aGUgZm9ybXVsYScpCiAgICAgIHJldHVybiAnJwog ICAgcmV0dXJuIHNlbGYudGV4dFtzZWxmLnBvc10KCiAgZGVmIGN1cnJlbnRza2lwKHNlbGYpOgog ICAgIlJldHVybiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgYW5kIHNraXAgaXQuIgogICAgY3VycmVu dCA9IHNlbGYuY3VycmVudCgpCiAgICBzZWxmLnNraXAoY3VycmVudCkKICAgIHJldHVybiBjdXJy ZW50CgogIGRlZiBjaGVja2ZvcihzZWxmLCBzdHJpbmcpOgogICAgIkNoZWNrIGZvciBhIHN0cmlu ZyBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24iCiAgICBpZiBzZWxmLnBvcyArIGxlbihzdHJpbmcpID4g bGVuKHNlbGYudGV4dCk6CiAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuIHNlbGYudGV4dFtz ZWxmLnBvcyA6IHNlbGYucG9zICsgbGVuKHN0cmluZyldID09IHN0cmluZwoKICBkZWYgY2hlY2tz a2lwKHNlbGYsIHN0cmluZyk6CiAgICAiQ2hlY2sgZm9yIGEgc3RyaW5nIGF0IHRoZSBnaXZlbiBw b3NpdGlvbjsgaWYgdGhlcmUsIHNraXAgaXQiCiAgICBpZiBub3Qgc2VsZi5jaGVja2ZvcihzdHJp bmcpOgogICAgICByZXR1cm4gRmFsc2UKICAgIHNlbGYuc2tpcChzdHJpbmcpCiAgICByZXR1cm4g VHJ1ZQoKICBkZWYgZ2xvYihzZWxmLCBjdXJyZW50Y2hlY2spOgogICAgIkdsb2IgYSBiaXQgb2Yg dGV4dCB0aGF0IHNhdGlzZmllcyBhIGNoZWNrIgogICAgZ2xvYiA9ICcnCiAgICB3aGlsZSBub3Qg c2VsZi5maW5pc2hlZCgpIGFuZCBjdXJyZW50Y2hlY2soc2VsZi5jdXJyZW50KCkpOgogICAgICBn bG9iICs9IHNlbGYuY3VycmVudCgpCiAgICAgIHNlbGYuc2tpcChzZWxmLmN1cnJlbnQoKSkKICAg IHJldHVybiBnbG9iCgogIGRlZiBnbG9iYWxwaGEoc2VsZik6CiAgICAiR2xvYiBhIGJpdCBvZiBh bHBoYSB0ZXh0IgogICAgcmV0dXJuIHNlbGYuZ2xvYihsYW1iZGEgY3VycmVudDogY3VycmVudC5p c2FscGhhKCkpCgogIGRlZiBza2lwc3BhY2Uoc2VsZik6CiAgICAiU2tpcCBhbGwgd2hpdGVzcGFj ZSBhdCBjdXJyZW50IHBvc2l0aW9uIgogICAgcmV0dXJuIHNlbGYuZ2xvYihsYW1iZGEgY3VycmVu dDogY3VycmVudC5pc3NwYWNlKCkpCgogIGRlZiBnbG9iaW5jbHVkaW5nKHNlbGYsIG1hZ2ljY2hh cik6CiAgICAiR2xvYiBhIGJpdCBvZiB0ZXh0IHVwIHRvIChpbmNsdWRpbmcpIHRoZSBtYWdpYyBj aGFyLiIKICAgIGdsb2IgPSBzZWxmLmdsb2IobGFtYmRhIGN1cnJlbnQ6IGN1cnJlbnQgIT0gbWFn aWNjaGFyKSArIG1hZ2ljY2hhcgogICAgc2VsZi5za2lwKG1hZ2ljY2hhcikKICAgIHJldHVybiBn bG9iCgogIGRlZiBnbG9iZXhjbHVkaW5nKHNlbGYsIG1hZ2ljY2hhcik6CiAgICAiR2xvYiBhIGJp dCBvZiB0ZXh0IHVwIHVudGlsIChleGNsdWRpbmcpIHRoZSBtYWdpYyBjaGFyLiIKICAgIHJldHVy biBzZWxmLmdsb2IobGFtYmRhIGN1cnJlbnQ6IGN1cnJlbnQgIT0gbWFnaWNjaGFyKQoKICBkZWYg cHVzaGVuZGluZyhzZWxmLCBlbmRpbmcsIG9wdGlvbmFsID0gRmFsc2UpOgogICAgIlB1c2ggYSBu ZXcgZW5kaW5nIHRvIHRoZSBib3R0b20iCiAgICBzZWxmLmVuZGluZ2xpc3QuYWRkKGVuZGluZywg b3B0aW9uYWwpCgogIGRlZiBwb3BlbmRpbmcoc2VsZiwgZXhwZWN0ZWQgPSBOb25lKToKICAgICJQ b3AgdGhlIGVuZGluZyBmb3VuZCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiIKICAgIGVuZGluZyA9 IHNlbGYuZW5kaW5nbGlzdC5wb3Aoc2VsZikKICAgIGlmIGV4cGVjdGVkIGFuZCBleHBlY3RlZCAh PSBlbmRpbmc6CiAgICAgIFRyYWNlLmVycm9yKCdFeHBlY3RlZCBlbmRpbmcgJyArIGV4cGVjdGVk ICsgJywgZ290ICcgKyBlbmRpbmcpCiAgICBzZWxmLnNraXAoZW5kaW5nKQogICAgcmV0dXJuIGVu ZGluZwoKY2xhc3MgRW5kaW5nTGlzdChvYmplY3QpOgogICJBIGxpc3Qgb2YgcG9zaXRpb24gZW5k aW5ncyIKCiAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgc2VsZi5lbmRpbmdzID0gW10KCiAgZGVm IGFkZChzZWxmLCBlbmRpbmcsIG9wdGlvbmFsKToKICAgICJBZGQgYSBuZXcgZW5kaW5nIHRvIHRo ZSBsaXN0IgogICAgc2VsZi5lbmRpbmdzLmFwcGVuZChQb3NpdGlvbkVuZGluZyhlbmRpbmcsIG9w dGlvbmFsKSkKCiAgZGVmIGNoZWNraW4oc2VsZiwgcG9zKToKICAgICJTZWFyY2ggZm9yIGFuIGVu ZGluZyIKICAgIGlmIHNlbGYuZmluZGVuZGluZyhwb3MpOgogICAgICByZXR1cm4gVHJ1ZQogICAg cmV0dXJuIEZhbHNlCgogIGRlZiBwb3Aoc2VsZiwgcG9zKToKICAgICJSZW1vdmUgdGhlIGVuZGlu ZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiIKICAgIGVuZGluZyA9IHNlbGYuZmluZGVuZGluZyhw b3MpCiAgICBpZiBub3QgZW5kaW5nOgogICAgICBUcmFjZS5lcnJvcignTm8gZW5kaW5nIGF0ICcg KyBwb3MuY3VycmVudCgpKQogICAgICByZXR1cm4gJycKICAgIGZvciBlYWNoIGluIHJldmVyc2Vk KHNlbGYuZW5kaW5ncyk6CiAgICAgIHNlbGYuZW5kaW5ncy5yZW1vdmUoZWFjaCkKICAgICAgaWYg ZWFjaCA9PSBlbmRpbmc6CiAgICAgICAgcmV0dXJuIGVhY2guZW5kaW5nCiAgICAgIGVsaWYgbm90 IGVhY2gub3B0aW9uYWw6CiAgICAgICAgVHJhY2UuZXJyb3IoJ1JlbW92ZWQgbm9uLW9wdGlvbmFs IGVuZGluZyAnICsgZWFjaCkKICAgIFRyYWNlLmVycm9yKCdObyBlbmRpbmdzIGxlZnQnKQogICAg cmV0dXJuICcnCgogIGRlZiBmaW5kZW5kaW5nKHNlbGYsIHBvcyk6CiAgICAiRmluZCB0aGUgZW5k aW5nIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIgogICAgaWYgbGVuKHNlbGYuZW5kaW5ncykgPT0g MDoKICAgICAgcmV0dXJuIE5vbmUKICAgIGZvciBpbmRleCwgZW5kaW5nIGluIGVudW1lcmF0ZShy ZXZlcnNlZChzZWxmLmVuZGluZ3MpKToKICAgICAgaWYgZW5kaW5nLmNoZWNraW4ocG9zKToKICAg ICAgICByZXR1cm4gZW5kaW5nCiAgICAgIGlmIG5vdCBlbmRpbmcub3B0aW9uYWw6CiAgICAgICAg cmV0dXJuIE5vbmUKICAgIHJldHVybiBOb25lCgogIGRlZiBjaGVja3BlbmRpbmcoc2VsZik6CiAg ICAiQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBwZW5kaW5nIGVuZGluZ3MiCiAgICBpZiBsZW4oc2Vs Zi5lbmRpbmdzKSAhPSAwOgogICAgICBUcmFjZS5lcnJvcignUGVuZGluZyAnICsgdW5pY29kZShz ZWxmKSArICcgbGVmdCBvcGVuJykKCiAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgogICAgIlByaW50 YWJsZSByZXByZXNlbnRhdGlvbiIKICAgIHN0cmluZyA9ICdlbmRpbmdzIFsnCiAgICBmb3IgZW5k aW5nIGluIHNlbGYuZW5kaW5nczoKICAgICAgc3RyaW5nICs9IHVuaWNvZGUoZW5kaW5nKSArICcs JwogICAgaWYgbGVuKHNlbGYuZW5kaW5ncykgPiAwOgogICAgICBzdHJpbmcgPSBzdHJpbmdbOi0x XQogICAgcmV0dXJuIHN0cmluZyArICddJwoKY2xhc3MgUG9zaXRpb25FbmRpbmcob2JqZWN0KToK ICAiQW4gZW5kaW5nIGZvciBhIHBhcnNpbmcgcG9zaXRpb24iCgogIGRlZiBfX2luaXRfXyhzZWxm LCBlbmRpbmcsIG9wdGlvbmFsKToKICAgIHNlbGYuZW5kaW5nID0gZW5kaW5nCiAgICBzZWxmLm9w dGlvbmFsID0gb3B0aW9uYWwKCiAgZGVmIGNoZWNraW4oc2VsZiwgcG9zKToKICAgICJDaGVjayBm b3IgdGhlIGVuZGluZyIKICAgIHJldHVybiBwb3MuY2hlY2tmb3Ioc2VsZi5lbmRpbmcpCgogIGRl ZiBfX3VuaWNvZGVfXyhzZWxmKToKICAgICJQcmludGFibGUgcmVwcmVzZW50YXRpb24iCiAgICBz dHJpbmcgPSAnRW5kaW5nICcgKyBzZWxmLmVuZGluZwogICAgaWYgc2VsZi5vcHRpb25hbDoKICAg ICAgc3RyaW5nICs9ICcgKG9wdGlvbmFsKScKICAgIHJldHVybiBzdHJpbmcKCgoKY2xhc3MgRm9y bXVsYVBhcnNlcihQYXJzZXIpOgogICJQYXJzZXMgYSBmb3JtdWxhIgoKICBkZWYgcGFyc2VoZWFk ZXIoc2VsZiwgcmVhZGVyKToKICAgICJTZWUgaWYgdGhlIGZvcm11bGEgaXMgaW5saW5lZCIKICAg IHNlbGYuYmVnaW4gPSByZWFkZXIubGluZW51bWJlciArIDEKICAgIGlmIHJlYWRlci5jdXJyZW50 bGluZSgpLmZpbmQoRm9ybXVsYUNvbmZpZy5zdGFydHNbJ3NpbXBsZSddKSA+IDA6CiAgICAgIHJl dHVybiBbJ2lubGluZSddCiAgICBpZiByZWFkZXIuY3VycmVudGxpbmUoKS5maW5kKEZvcm11bGFD b25maWcuc3RhcnRzWydjb21wbGV4J10pID4gMDoKICAgICAgcmV0dXJuIFsnYmxvY2snXQogICAg aWYgcmVhZGVyLmN1cnJlbnRsaW5lKCkuZmluZChGb3JtdWxhQ29uZmlnLnN0YXJ0c1sndW5udW1i ZXJlZCddKSA+IDA6CiAgICAgIHJldHVybiBbJ2Jsb2NrJ10KICAgIHJldHVybiBbJ251bWJlcmVk J10KICAKICBkZWYgcGFyc2Uoc2VsZiwgcmVhZGVyKToKICAgICJQYXJzZSB0aGUgZm9ybXVsYSB1 bnRpbCB0aGUgZW5kIgogICAgZm9ybXVsYSA9IHNlbGYucGFyc2Vmb3JtdWxhKHJlYWRlcikKICAg IHdoaWxlIG5vdCByZWFkZXIuY3VycmVudGxpbmUoKS5zdGFydHN3aXRoKHNlbGYuZW5kaW5nKToK ICAgICAgc3RyaXBwZWQgPSByZWFkZXIuY3VycmVudGxpbmUoKS5zdHJpcCgpCiAgICAgIGlmIGxl bihzdHJpcHBlZCkgPiAwOgogICAgICAgIFRyYWNlLmVycm9yKCdVbnBhcnNlZCBmb3JtdWxhIGxp bmUgJyArIHN0cmlwcGVkKQogICAgICByZWFkZXIubmV4dGxpbmUoKQogICAgcmVhZGVyLm5leHRs aW5lKCkKICAgIHJldHVybiBbZm9ybXVsYV0KCiAgZGVmIHBhcnNlZm9ybXVsYShzZWxmLCByZWFk ZXIpOgogICAgIlBhcnNlIHRoZSBmb3JtdWxhIGNvbnRlbnRzIgogICAgc2ltcGxlID0gRm9ybXVs YUNvbmZpZy5zdGFydHNbJ3NpbXBsZSddCiAgICBpZiBzaW1wbGUgaW4gcmVhZGVyLmN1cnJlbnRs aW5lKCk6CiAgICAgIHJlc3QgPSByZWFkZXIuY3VycmVudGxpbmUoKS5zcGxpdChzaW1wbGUsIDEp WzFdCiAgICAgIGlmIHNpbXBsZSBpbiByZXN0OgogICAgICAgICMgZm9ybXVsYSBpcyAkLi4uJAog ICAgICAgIHJldHVybiBzZWxmLnBhcnNlc2luZ2xlbGluZXIocmVhZGVyLCBzaW1wbGUsIHNpbXBs ZSkKICAgICAgIyBmb3JtdWxhIGlzIG11bHRpbGluZSAkLi4uJAogICAgICByZXR1cm4gc2VsZi5w YXJzZW11bHRpbGluZXIocmVhZGVyLCBzaW1wbGUsIHNpbXBsZSkKICAgIGlmIEZvcm11bGFDb25m aWcuc3RhcnRzWydjb21wbGV4J10gaW4gcmVhZGVyLmN1cnJlbnRsaW5lKCk6CiAgICAgICMgZm9y bXVsYSBvZiB0aGUgZm9ybSBcWy4uLlxdCiAgICAgIHJldHVybiBzZWxmLnBhcnNlbXVsdGlsaW5l cihyZWFkZXIsIEZvcm11bGFDb25maWcuc3RhcnRzWydjb21wbGV4J10sCiAgICAgICAgICBGb3Jt dWxhQ29uZmlnLmVuZGluZ3NbJ2NvbXBsZXgnXSkKICAgIGJlZ2luYmVmb3JlID0gRm9ybXVsYUNv bmZpZy5zdGFydHNbJ2JlZ2luYmVmb3JlJ10KICAgIGJlZ2luYWZ0ZXIgPSBGb3JtdWxhQ29uZmln LnN0YXJ0c1snYmVnaW5hZnRlciddCiAgICBpZiBiZWdpbmJlZm9yZSBpbiByZWFkZXIuY3VycmVu dGxpbmUoKToKICAgICAgaWYgcmVhZGVyLmN1cnJlbnRsaW5lKCkuc3RyaXAoKS5lbmRzd2l0aChi ZWdpbmFmdGVyKToKICAgICAgICBjdXJyZW50ID0gcmVhZGVyLmN1cnJlbnRsaW5lKCkuc3RyaXAo KQogICAgICAgIGVuZHNwbGl0ID0gY3VycmVudC5zcGxpdChiZWdpbmJlZm9yZSlbMV0uc3BsaXQo YmVnaW5hZnRlcikKICAgICAgICBzdGFydHBpZWNlID0gYmVnaW5iZWZvcmUgKyBlbmRzcGxpdFsw XSArIGJlZ2luYWZ0ZXIKICAgICAgICBlbmRiZWZvcmUgPSBGb3JtdWxhQ29uZmlnLmVuZGluZ3Nb J2VuZGJlZm9yZSddCiAgICAgICAgZW5kYWZ0ZXIgPSBGb3JtdWxhQ29uZmlnLmVuZGluZ3NbJ2Vu ZGFmdGVyJ10KICAgICAgICBlbmRwaWVjZSA9IGVuZGJlZm9yZSArIGVuZHNwbGl0WzBdICsgZW5k YWZ0ZXIKICAgICAgICByZXR1cm4gc3RhcnRwaWVjZSArIHNlbGYucGFyc2VtdWx0aWxpbmVyKHJl YWRlciwgc3RhcnRwaWVjZSwgZW5kcGllY2UpICsgZW5kcGllY2UKICAgICAgVHJhY2UuZXJyb3Io J01pc3NpbmcgJyArIGJlZ2luYWZ0ZXIgKyAnIGluICcgKyByZWFkZXIuY3VycmVudGxpbmUoKSkK ICAgICAgcmV0dXJuICcnCiAgICBiZWdpbmNvbW1hbmQgPSBGb3JtdWxhQ29uZmlnLnN0YXJ0c1sn Y29tbWFuZCddCiAgICBiZWdpbmJyYWNrZXQgPSBGb3JtdWxhQ29uZmlnLnN0YXJ0c1snYnJhY2tl dCddCiAgICBpZiBiZWdpbmNvbW1hbmQgaW4gcmVhZGVyLmN1cnJlbnRsaW5lKCkgYW5kIGJlZ2lu YnJhY2tldCBpbiByZWFkZXIuY3VycmVudGxpbmUoKToKICAgICAgZW5kYnJhY2tldCA9IEZvcm11 bGFDb25maWcuZW5kaW5nc1snYnJhY2tldCddCiAgICAgIHJldHVybiBzZWxmLnBhcnNlbXVsdGls aW5lcihyZWFkZXIsIGJlZ2luYnJhY2tldCwgZW5kYnJhY2tldCkKICAgIFRyYWNlLmVycm9yKCdG b3JtdWxhIGJlZ2lubmluZyAnICsgcmVhZGVyLmN1cnJlbnRsaW5lKCkgKyAnIGlzIHVua25vd24n KQogICAgcmV0dXJuICcnCgogIGRlZiBwYXJzZXNpbmdsZWxpbmVyKHNlbGYsIHJlYWRlciwgc3Rh cnQsIGVuZGluZyk6CiAgICAiUGFyc2UgYSBmb3JtdWxhIGluIG9uZSBsaW5lIgogICAgbGluZSA9 IHJlYWRlci5jdXJyZW50bGluZSgpLnN0cmlwKCkKICAgIGlmIG5vdCBzdGFydCBpbiBsaW5lOgog ICAgICBUcmFjZS5lcnJvcignTGluZSAnICsgbGluZSArICcgZG9lcyBub3QgY29udGFpbiBmb3Jt dWxhIHN0YXJ0ICcgKyBzdGFydCkKICAgICAgcmV0dXJuICcnCiAgICBpZiBub3QgbGluZS5lbmRz d2l0aChlbmRpbmcpOgogICAgICBUcmFjZS5lcnJvcignRm9ybXVsYSAnICsgbGluZSArICcgZG9l cyBub3QgZW5kIHdpdGggJyArIGVuZGluZykKICAgICAgcmV0dXJuICcnCiAgICBpbmRleCA9IGxp bmUuaW5kZXgoc3RhcnQpCiAgICByZXN0ID0gbGluZVtpbmRleCArIGxlbihzdGFydCk6LWxlbihl bmRpbmcpXQogICAgcmVhZGVyLm5leHRsaW5lKCkKICAgIHJldHVybiByZXN0CgogIGRlZiBwYXJz ZW11bHRpbGluZXIoc2VsZiwgcmVhZGVyLCBzdGFydCwgZW5kaW5nKToKICAgICJQYXJzZSBhIGZv cm11bGEgaW4gbXVsdGlwbGUgbGluZXMiCiAgICBmb3JtdWxhID0gJycKICAgIGxpbmUgPSByZWFk ZXIuY3VycmVudGxpbmUoKQogICAgaWYgbm90IHN0YXJ0IGluIGxpbmU6CiAgICAgIFRyYWNlLmVy cm9yKCdMaW5lICcgKyBsaW5lLnN0cmlwKCkgKyAnIGRvZXMgbm90IGNvbnRhaW4gZm9ybXVsYSBz dGFydCAnICsgc3RhcnQpCiAgICAgIHJldHVybiAnJwogICAgaW5kZXggPSBsaW5lLmluZGV4KHN0 YXJ0KQogICAgbGluZSA9IGxpbmVbaW5kZXggKyBsZW4oc3RhcnQpOl0uc3RyaXAoKQogICAgd2hp bGUgbm90IGxpbmUuZW5kc3dpdGgoZW5kaW5nKToKICAgICAgZm9ybXVsYSArPSBsaW5lCiAgICAg IHJlYWRlci5uZXh0bGluZSgpCiAgICAgIGxpbmUgPSByZWFkZXIuY3VycmVudGxpbmUoKQogICAg Zm9ybXVsYSArPSBsaW5lWzotbGVuKGVuZGluZyldCiAgICByZWFkZXIubmV4dGxpbmUoKQogICAg cmV0dXJuIGZvcm11bGEKCgoKY2xhc3MgRm9ybXVsYShDb250YWluZXIpOgogICJBIExhVGVYIGZv cm11bGEiCgogIGRlZiBfX2luaXRfXyhzZWxmKToKICAgIHNlbGYucGFyc2VyID0gRm9ybXVsYVBh cnNlcigpCiAgICBzZWxmLm91dHB1dCA9IFRhZ2dlZE91dHB1dCgpLnNldHRhZygnc3BhbiBjbGFz cz0iZm9ybXVsYSInKQoKICBkZWYgcHJvY2VzcyhzZWxmKToKICAgICJDb252ZXJ0IHRoZSBmb3Jt dWxhIHRvIHRhZ3MiCiAgICBwb3MgPSBQb3NpdGlvbihzZWxmLmNvbnRlbnRzWzBdKQogICAgd2hv bGUgPSBXaG9sZUZvcm11bGEoKQogICAgaWYgbm90IHdob2xlLmRldGVjdChwb3MpOgogICAgICBU cmFjZS5lcnJvcignVW5rbm93biBmb3JtdWxhIGF0OiAnICsgcG9zLnJlbWFpbmluZygpKQogICAg ICBjb25zdGFudCA9IFRhZ2dlZEJpdCgpLmNvbnN0YW50KHBvcy5yZW1haW5pbmcoKSwgJ3NwYW4g Y2xhc3M9InVua25vd24iJykKICAgICAgc2VsZi5jb250ZW50cyA9IFtjb25zdGFudF0KICAgICAg cmV0dXJuCiAgICB3aG9sZS5wYXJzZWJpdChwb3MpCiAgICB3aG9sZS5wcm9jZXNzKCkKICAgIHNl bGYuY29udGVudHMgPSBbd2hvbGVdCiAgICB3aG9sZS5wYXJlbnQgPSBzZWxmCiAgICBpZiBzZWxm LmhlYWRlclswXSAhPSAnaW5saW5lJzoKICAgICAgc2VsZi5vdXRwdXQuc2V0dGFnKCdkaXYgY2xh c3M9ImZvcm11bGEiJywgVHJ1ZSkKCmNsYXNzIEZvcm11bGFCaXQoQ29udGFpbmVyKToKICAiQSBi aXQgb2YgYSBmb3JtdWxhIgoKICBkZWYgX19pbml0X18oc2VsZik6CiAgICAjIHR5cGUgY2FuIGJl ICdhbHBoYScsICdudW1iZXInLCAnZm9udCcKICAgIHNlbGYudHlwZSA9IE5vbmUKICAgIHNlbGYu b3JpZ2luYWwgPSAnJwogICAgc2VsZi5jb250ZW50cyA9IFtdCiAgICBzZWxmLm91dHB1dCA9IENv bnRlbnRzT3V0cHV0KCkKCiAgZGVmIGFkZChzZWxmLCBiaXQpOgogICAgIkFkZCBhbnkga2luZCBv ZiBmb3JtdWxhIGJpdCBhbHJlYWR5IHByb2Nlc3NlZCIKICAgIHNlbGYuY29udGVudHMuYXBwZW5k KGJpdCkKICAgIHNlbGYub3JpZ2luYWwgKz0gYml0Lm9yaWdpbmFsCiAgICBiaXQucGFyZW50ID0g c2VsZgoKICBkZWYgc2tpcG9yaWdpbmFsKHNlbGYsIHN0cmluZywgcG9zKToKICAgICJTa2lwIGEg c3RyaW5nIGFuZCBhZGQgaXQgdG8gdGhlIG9yaWdpbmFsIGZvcm11bGEiCiAgICBzZWxmLm9yaWdp bmFsICs9IHN0cmluZwogICAgaWYgbm90IHBvcy5jaGVja3NraXAoc3RyaW5nKToKICAgICAgVHJh Y2UuZXJyb3IoJ1N0cmluZyAnICsgc3RyaW5nICsgJyBub3QgYXQgJyArIHBvcy5yZW1haW5pbmco KSkKCiAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgogICAgIkdldCBhIHN0cmluZyByZXByZXNlbnRh dGlvbiIKICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyArICcgcmVhZCBpbiAnICsg c2VsZi5vcmlnaW5hbAoKY2xhc3MgVGFnZ2VkQml0KEZvcm11bGFCaXQpOgogICJBIHRhZ2dlZCBz dHJpbmcgaW4gYSBmb3JtdWxhIgoKICBkZWYgY29uc3RhbnQoc2VsZiwgY29uc3RhbnQsIHRhZyk6 CiAgICAiU2V0IHRoZSBjb25zdGFudCBhbmQgdGhlIHRhZyIKICAgIHNlbGYub3V0cHV0ID0gVGFn Z2VkT3V0cHV0KCkuc2V0dGFnKHRhZykKICAgIHNlbGYuYWRkKEZvcm11bGFDb25zdGFudChjb25z dGFudCkpCiAgICByZXR1cm4gc2VsZgoKICBkZWYgY29tcGxldGUoc2VsZiwgY29udGVudHMsIHRh Zyk6CiAgICAiU2V0IHRoZSBjb25zdGFudCBhbmQgdGhlIHRhZyIKICAgIHNlbGYuY29udGVudHMg PSBjb250ZW50cwogICAgc2VsZi5vdXRwdXQgPSBUYWdnZWRPdXRwdXQoKS5zZXR0YWcodGFnKQog ICAgcmV0dXJuIHNlbGYKCmNsYXNzIEZvcm11bGFDb25zdGFudChGb3JtdWxhQml0KToKICAiQSBj b25zdGFudCBzdHJpbmcgaW4gYSBmb3JtdWxhIgoKICBkZWYgX19pbml0X18oc2VsZiwgc3RyaW5n KToKICAgICJTZXQgdGhlIGNvbnN0YW50IHN0cmluZyIKICAgIEZvcm11bGFCaXQuX19pbml0X18o c2VsZikKICAgIHNlbGYub3JpZ2luYWwgPSBzdHJpbmcKICAgIHNlbGYub3V0cHV0ID0gRml4ZWRP dXRwdXQoKQogICAgc2VsZi5odG1sID0gW3N0cmluZ10KCmNsYXNzIFdob2xlRm9ybXVsYShGb3Jt dWxhQml0KToKICAiUGFyc2UgYSB3aG9sZSBmb3JtdWxhIgoKICBkZWYgX19pbml0X18oc2VsZik6 CiAgICBGb3JtdWxhQml0Ll9faW5pdF9fKHNlbGYpCiAgICBzZWxmLmZhY3RvcnkgPSBGb3JtdWxh RmFjdG9yeSgpCgogIGRlZiBkZXRlY3Qoc2VsZiwgcG9zKToKICAgICJDaGVjayBpbiB0aGUgZmFj dG9yeSIKICAgIHJldHVybiBzZWxmLmZhY3RvcnkuZGV0ZWN0Yml0KHBvcykKCiAgZGVmIHBhcnNl Yml0KHNlbGYsIHBvcyk6CiAgICAiUGFyc2Ugd2l0aCBhbnkgZm9ybXVsYSBiaXQiCiAgICB3aGls ZSBzZWxmLmZhY3RvcnkuZGV0ZWN0Yml0KHBvcyk6CiAgICAgIGJpdCA9IHNlbGYuZmFjdG9yeS5w YXJzZWJpdChwb3MpCiAgICAgICNUcmFjZS5kZWJ1ZyhiaXQub3JpZ2luYWwgKyAnIC0+ICcgKyB1 bmljb2RlKGJpdC5nZXRodG1sKCkpKQogICAgICBzZWxmLmFkZChiaXQpCgogIGRlZiBwcm9jZXNz KHNlbGYpOgogICAgIlByb2Nlc3MgdGhlIHdob2xlIGZvcm11bGEiCiAgICBmb3IgaW5kZXgsIGJp dCBpbiBlbnVtZXJhdGUoc2VsZi5jb250ZW50cyk6CiAgICAgIGJpdC5wcm9jZXNzKCkKICAgICAg IyBubyB1bml0cyBwcm9jZXNzaW5nCiAgICAgIGNvbnRpbnVlCiAgICAgIGlmIGJpdC50eXBlID09 ICdhbHBoYSc6CiAgICAgICAgIyBtYWtlIHZhcmlhYmxlCiAgICAgICAgc2VsZi5jb250ZW50c1tp bmRleF0gPSBUYWdnZWRCaXQoKS5jb21wbGV0ZShbYml0XSwgJ2knKQogICAgICBlbGlmIGJpdC50 eXBlID09ICdmb250JyBhbmQgaW5kZXggPiAwOgogICAgICAgIGxhc3QgPSBzZWxmLmNvbnRlbnRz W2luZGV4IC0gMV0KICAgICAgICBpZiBsYXN0LnR5cGUgPT0gJ251bWJlcic6CiAgICAgICAgICAj c2VwYXJhdGUKICAgICAgICAgIGxhc3QuY29udGVudHMuYXBwZW5kKEZvcm11bGFDb25zdGFudCh1 J+KBnycpKQoKY2xhc3MgRm9ybXVsYUZhY3Rvcnkob2JqZWN0KToKICAiQ29uc3RydWN0IGJpdHMg b2YgZm9ybXVsYSIKCiAgIyBiaXRzIHdpbGwgYmUgYXBwZW5kZWQgbGF0ZXIKICBiaXRzID0gW10K CiAgZGVmIGRldGVjdGJpdChzZWxmLCBwb3MpOgogICAgIkRldGVjdCBpZiB0aGVyZSBpcyBhIG5l eHQgYml0IgogICAgaWYgcG9zLmZpbmlzaGVkKCk6CiAgICAgIHJldHVybiBGYWxzZQogICAgZm9y IGJpdCBpbiBGb3JtdWxhRmFjdG9yeS5iaXRzOgogICAgICBpZiBiaXQuZGV0ZWN0KHBvcyk6CiAg ICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBGYWxzZQoKICBkZWYgcGFyc2ViaXQoc2VsZiwg cG9zKToKICAgICJQYXJzZSBqdXN0IG9uZSBmb3JtdWxhIGJpdC4iCiAgICBmb3IgYml0IGluIEZv cm11bGFGYWN0b3J5LmJpdHM6CiAgICAgIGlmIGJpdC5kZXRlY3QocG9zKToKICAgICAgICAjIGdl dCBhIGZyZXNoIGJpdCBhbmQgcGFyc2UgaXQKICAgICAgICBuZXdiaXQgPSBDbG9uZXIuY2xvbmUo Yml0KQogICAgICAgIG5ld2JpdC5mYWN0b3J5ID0gc2VsZgogICAgICAgIHJldHVybmVkYml0ID0g bmV3Yml0LnBhcnNlYml0KHBvcykKICAgICAgICBpZiByZXR1cm5lZGJpdDoKICAgICAgICAgIHJl dHVybiByZXR1cm5lZGJpdAogICAgICAgIHJldHVybiBuZXdiaXQKICAgIFRyYWNlLmVycm9yKCdV bnJlY29nbml6ZWQgZm9ybXVsYSBhdCAnICsgcG9zLnJlbWFpbmluZygpKQogICAgcmV0dXJuIEZv cm11bGFDb25zdGFudChwb3MuY3VycmVudHNraXAoKSkKCgoKCmltcG9ydCBzeXMKCgoKaW1wb3J0 IHN5cwoKCmNsYXNzIFJhd1RleHQoRm9ybXVsYUJpdCk6CiAgIkEgYml0IG9mIHRleHQgaW5zaWRl IGEgZm9ybXVsYSIKCiAgZGVmIGRldGVjdChzZWxmLCBwb3MpOgogICAgIkRldGVjdCBhIGJpdCBv ZiByYXcgdGV4dCIKICAgIHJldHVybiBwb3MuY3VycmVudCgpLmlzYWxwaGEoKQoKICBkZWYgcGFy c2ViaXQoc2VsZiwgcG9zKToKICAgICJQYXJzZSBhbHBoYWJldGljIHRleHQiCiAgICBhbHBoYSA9 IHBvcy5nbG9iYWxwaGEoKQogICAgc2VsZi5hZGQoRm9ybXVsYUNvbnN0YW50KGFscGhhKSkKICAg IHNlbGYudHlwZSA9ICdhbHBoYScKCmNsYXNzIEZvcm11bGFTeW1ib2woRm9ybXVsYUJpdCk6CiAg IkEgc3ltYm9sIGluc2lkZSBhIGZvcm11bGEiCgogIG1vZGlmaWVkID0gRm9ybXVsYUNvbmZpZy5t b2RpZmllZAogIHVubW9kaWZpZWQgPSBGb3JtdWxhQ29uZmlnLnVubW9kaWZpZWRbJ2NoYXJhY3Rl cnMnXQoKICBkZWYgZGV0ZWN0KHNlbGYsIHBvcyk6CiAgICAiRGV0ZWN0IGEgc3ltYm9sIgogICAg aWYgcG9zLmN1cnJlbnQoKSBpbiBGb3JtdWxhU3ltYm9sLnVubW9kaWZpZWQ6CiAgICAgIHJldHVy biBUcnVlCiAgICBpZiBwb3MuY3VycmVudCgpIGluIEZvcm11bGFTeW1ib2wubW9kaWZpZWQ6CiAg ICAgIHJldHVybiBUcnVlCiAgICByZXR1cm4gRmFsc2UKCiAgZGVmIHBhcnNlYml0KHNlbGYsIHBv cyk6CiAgICAiUGFyc2UgdGhlIHN5bWJvbCIKICAgIGlmIHBvcy5jdXJyZW50KCkgaW4gRm9ybXVs YVN5bWJvbC51bm1vZGlmaWVkOgogICAgICBzZWxmLmFkZHN5bWJvbChwb3MuY3VycmVudCgpLCBw b3MpCiAgICAgIHJldHVybgogICAgaWYgcG9zLmN1cnJlbnQoKSBpbiBGb3JtdWxhU3ltYm9sLm1v ZGlmaWVkOgogICAgICBzZWxmLmFkZHN5bWJvbChGb3JtdWxhU3ltYm9sLm1vZGlmaWVkW3Bvcy5j dXJyZW50KCldLCBwb3MpCiAgICAgIHJldHVybgogICAgVHJhY2UuZXJyb3IoJ1N5bWJvbCAnICsg cG9zLmN1cnJlbnQoKSArICcgbm90IGZvdW5kJykKCiAgZGVmIGFkZHN5bWJvbChzZWxmLCBzeW1i b2wsIHBvcyk6CiAgICAiQWRkIGEgc3ltYm9sIgogICAgc2VsZi5za2lwb3JpZ2luYWwocG9zLmN1 cnJlbnQoKSwgcG9zKQogICAgc2VsZi5jb250ZW50cy5hcHBlbmQoRm9ybXVsYUNvbnN0YW50KHN5 bWJvbCkpCgpjbGFzcyBOdW1iZXIoRm9ybXVsYUJpdCk6CiAgIkEgc3RyaW5nIG9mIGRpZ2l0cyBp biBhIGZvcm11bGEiCgogIGRlZiBkZXRlY3Qoc2VsZiwgcG9zKToKICAgICJEZXRlY3QgYSBkaWdp dCIKICAgIHJldHVybiBwb3MuY3VycmVudCgpLmlzZGlnaXQoKQoKICBkZWYgcGFyc2ViaXQoc2Vs ZiwgcG9zKToKICAgICJQYXJzZSBhIGJ1bmNoIG9mIGRpZ2l0cyIKICAgIGRpZ2l0cyA9IHBvcy5n bG9iKGxhbWJkYSBjdXJyZW50OiBjdXJyZW50LmlzZGlnaXQoKSkKICAgIHNlbGYuYWRkKEZvcm11 bGFDb25zdGFudChkaWdpdHMpKQogICAgc2VsZi50eXBlID0gJ251bWJlcicKCmNsYXNzIEJyYWNr ZXQoRm9ybXVsYUJpdCk6CiAgIkEge30gYnJhY2tldCBpbnNpZGUgYSBmb3JtdWxhIgoKICBzdGFy dCA9IEZvcm11bGFDb25maWcuc3RhcnRzWydicmFja2V0J10KICBlbmRpbmcgPSBGb3JtdWxhQ29u ZmlnLmVuZGluZ3NbJ2JyYWNrZXQnXQoKICBkZWYgX19pbml0X18oc2VsZik6CiAgICAiQ3JlYXRl IGEgKHBvc3NpYmx5IGxpdGVyYWwpIG5ldyBicmFja2V0IgogICAgRm9ybXVsYUJpdC5fX2luaXRf XyhzZWxmKQogICAgc2VsZi5pbm5lciA9IE5vbmUKCiAgZGVmIGRldGVjdChzZWxmLCBwb3MpOgog ICAgIkRldGVjdCB0aGUgc3RhcnQgb2YgYSBicmFja2V0IgogICAgcmV0dXJuIHBvcy5jaGVja2Zv cihzZWxmLnN0YXJ0KQoKICBkZWYgcGFyc2ViaXQoc2VsZiwgcG9zKToKICAgICJQYXJzZSB0aGUg YnJhY2tldCIKICAgIHNlbGYucGFyc2Vjb21wbGV0ZShwb3MsIHNlbGYuaW5uZXJmb3JtdWxhKQog ICAgcmV0dXJuIHNlbGYKCiAgZGVmIHBhcnNldGV4dChzZWxmLCBwb3MpOgogICAgIlBhcnNlIGEg dGV4dCBicmFja2V0IgogICAgc2VsZi5wYXJzZWNvbXBsZXRlKHBvcywgc2VsZi5pbm5lcnRleHQp CiAgICByZXR1cm4gc2VsZgoKICBkZWYgcGFyc2VsaXRlcmFsKHNlbGYsIHBvcyk6CiAgICAiUGFy c2UgYSBsaXRlcmFsIGJyYWNrZXQiCiAgICBzZWxmLnBhcnNlY29tcGxldGUocG9zLCBzZWxmLmlu bmVybGl0ZXJhbCkKICAgIHJldHVybiBzZWxmCgogIGRlZiBwYXJzZWNvbXBsZXRlKHNlbGYsIHBv cywgaW5uZXJwYXJzZXIpOgogICAgIlBhcnNlIHRoZSBzdGFydCBhbmQgZW5kIG1hcmtzIgogICAg aWYgbm90IHBvcy5jaGVja2ZvcihzZWxmLnN0YXJ0KToKICAgICAgVHJhY2UuZXJyb3IoJ0JyYWNr ZXQgc2hvdWxkIHN0YXJ0IHdpdGggJyArIHNlbGYuc3RhcnQgKyAnIGF0ICcgKyBwb3MucmVtYWlu aW5nKCkpCiAgICAgIHJldHVybgogICAgc2VsZi5za2lwb3JpZ2luYWwoc2VsZi5zdGFydCwgcG9z KQogICAgcG9zLnB1c2hlbmRpbmcoc2VsZi5lbmRpbmcpCiAgICBpbm5lcnBhcnNlcihwb3MpCiAg ICBzZWxmLm9yaWdpbmFsICs9IHBvcy5wb3BlbmRpbmcoc2VsZi5lbmRpbmcpCgogIGRlZiBpbm5l cmZvcm11bGEoc2VsZiwgcG9zKToKICAgICJQYXJzZSBhIHdob2xlIGZvcm11bGEgaW5zaWRlIHRo ZSBicmFja2V0IgogICAgc2VsZi5pbm5lciA9IFdob2xlRm9ybXVsYSgpCiAgICBpZiBzZWxmLmlu bmVyLmRldGVjdChwb3MpOgogICAgICBzZWxmLmlubmVyLnBhcnNlYml0KHBvcykKICAgICAgc2Vs Zi5hZGQoc2VsZi5pbm5lcikKICAgICAgcmV0dXJuCiAgICBpZiBwb3MuZmluaXNoZWQoKToKICAg ICAgcmV0dXJuCiAgICBpZiBwb3MuY3VycmVudCgpICE9IHNlbGYuZW5kaW5nOgogICAgICBUcmFj ZS5lcnJvcignTm8gZm9ybXVsYSBpbiBicmFja2V0IGF0ICcgKyBwb3MucmVtYWluaW5nKCkpCiAg ICByZXR1cm4KCiAgZGVmIGlubmVydGV4dChzZWxmLCBwb3MpOgogICAgIlBhcnNlIHNvbWUgdGV4 dCBpbnNpZGUgdGhlIGJyYWNrZXQsIGZvbGxvd2luZyB0ZXh0dWFsIHJ1bGVzLiIKICAgIGZhY3Rv cnkgPSBGb3JtdWxhRmFjdG9yeSgpCiAgICB3aGlsZSBub3QgcG9zLmZpbmlzaGVkKCk6CiAgICAg IGlmIHBvcy5jdXJyZW50KCkgPT0gRm9ybXVsYUNvbmZpZy5zdGFydHNbJ2NvbW1hbmQnXToKICAg ICAgICBiaXQgPSBmYWN0b3J5LnBhcnNlYml0KHBvcykKICAgICAgICBwb3MuY2hlY2tza2lwKCcg JykKICAgICAgZWxzZToKICAgICAgICBiaXQgPSBGb3JtdWxhQ29uc3RhbnQocG9zLmN1cnJlbnRz a2lwKCkpCiAgICAgIHNlbGYuYWRkKGJpdCkKCiAgZGVmIGlubmVybGl0ZXJhbChzZWxmLCBwb3Mp OgogICAgIlBhcnNlIGEgbGl0ZXJhbCBpbnNpZGUgdGhlIGJyYWNrZXQsIHdoaWNoIGNhbm5vdCBn ZW5lcmF0ZSBodG1sIgogICAgc2VsZi5saXRlcmFsID0gcG9zLmdsb2JleGNsdWRpbmcoc2VsZi5l bmRpbmcpCiAgICBzZWxmLm9yaWdpbmFsICs9IHNlbGYubGl0ZXJhbAoKICBkZWYgcHJvY2Vzcyhz ZWxmKToKICAgICJQcm9jZXNzIHRoZSBicmFja2V0IgogICAgaWYgc2VsZi5pbm5lcjoKICAgICAg c2VsZi5pbm5lci5wcm9jZXNzKCkKCmNsYXNzIFNxdWFyZUJyYWNrZXQoQnJhY2tldCk6CiAgIkEg W10gYnJhY2tldCBpbnNpZGUgYSBmb3JtdWxhIgoKICBzdGFydCA9IEZvcm11bGFDb25maWcuc3Rh cnRzWydzcXVhcmVicmFja2V0J10KICBlbmRpbmcgPSBGb3JtdWxhQ29uZmlnLmVuZGluZ3NbJ3Nx dWFyZWJyYWNrZXQnXQoKRm9ybXVsYUZhY3RvcnkuYml0cyArPSBbIEZvcm11bGFTeW1ib2woKSwg UmF3VGV4dCgpLCBOdW1iZXIoKSwgQnJhY2tldCgpIF0KCgoKY2xhc3MgRm9ybXVsYUNvbW1hbmQo Rm9ybXVsYUJpdCk6CiAgIkEgTGFUZVggY29tbWFuZCBpbnNpZGUgYSBmb3JtdWxhIgoKICBjb21t YW5kYml0cyA9IFtdCgogIGRlZiBkZXRlY3Qoc2VsZiwgcG9zKToKICAgICJGaW5kIHRoZSBjdXJy ZW50IGNvbW1hbmQiCiAgICByZXR1cm4gcG9zLmNoZWNrZm9yKEZvcm11bGFDb25maWcuc3RhcnRz Wydjb21tYW5kJ10pCgogIGRlZiBwYXJzZWJpdChzZWxmLCBwb3MpOgogICAgIlBhcnNlIHRoZSBj b21tYW5kIgogICAgY29tbWFuZCA9IHNlbGYuZXh0cmFjdGNvbW1hbmQocG9zKQogICAgZm9yIGJp dCBpbiBGb3JtdWxhQ29tbWFuZC5jb21tYW5kYml0czoKICAgICAgaWYgYml0LnJlY29nbml6ZShj b21tYW5kKToKICAgICAgICBuZXdiaXQgPSBDbG9uZXIuY2xvbmUoYml0KQogICAgICAgIG5ld2Jp dC5mYWN0b3J5ID0gc2VsZi5mYWN0b3J5CiAgICAgICAgbmV3Yml0LnNldGNvbW1hbmQoY29tbWFu ZCkKICAgICAgICBuZXdiaXQucGFyc2ViaXQocG9zKQogICAgICAgIHNlbGYuYWRkKG5ld2JpdCkK ICAgICAgICByZXR1cm4gbmV3Yml0CiAgICBUcmFjZS5lcnJvcignVW5rbm93biBjb21tYW5kICcg KyBjb21tYW5kKQogICAgc2VsZi5vdXRwdXQgPSBUYWdnZWRPdXRwdXQoKS5zZXR0YWcoJ3NwYW4g Y2xhc3M9InVua25vd24iJykKICAgIHNlbGYuYWRkKEZvcm11bGFDb25zdGFudChjb21tYW5kKSkK CiAgZGVmIGV4dHJhY3Rjb21tYW5kKHNlbGYsIHBvcyk6CiAgICAiRXh0cmFjdCB0aGUgY29tbWFu ZCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIgogICAgc3RhcnQgPSBGb3JtdWxhQ29uZmlnLnN0 YXJ0c1snY29tbWFuZCddCiAgICBpZiBub3QgcG9zLmNoZWNrc2tpcChzdGFydCk6CiAgICAgIFRy YWNlLmVycm9yKCdNaXNzaW5nIGNvbW1hbmQgc3RhcnQgJyArIHN0YXJ0KQogICAgICByZXR1cm4K ICAgIGlmIHBvcy5jdXJyZW50KCkuaXNhbHBoYSgpOgogICAgICAjIGFscGhhIGNvbW1hbmQKICAg ICAgcmV0dXJuIHN0YXJ0ICsgcG9zLmdsb2JhbHBoYSgpCiAgICAjIHN5bWJvbCBjb21tYW5kCiAg ICByZXR1cm4gc3RhcnQgKyBwb3MuY3VycmVudHNraXAoKQoKICBkZWYgcHJvY2VzcyhzZWxmKToK ICAgICJQcm9jZXNzIHRoZSBpbnRlcm5hbHMiCiAgICBmb3IgYml0IGluIHNlbGYuY29udGVudHM6 CiAgICAgIGJpdC5wcm9jZXNzKCkKCmNsYXNzIENvbW1hbmRCaXQoRm9ybXVsYUNvbW1hbmQpOgog ICJBIGZvcm11bGEgYml0IHRoYXQgaW5jbHVkZXMgYSBjb21tYW5kIgoKICBkZWYgcmVjb2duaXpl KHNlbGYsIGNvbW1hbmQpOgogICAgIlJlY29nbml6ZSB0aGUgY29tbWFuZCBhcyBvd24iCiAgICBy ZXR1cm4gY29tbWFuZCBpbiBzZWxmLmNvbW1hbmRtYXAKCiAgZGVmIHNldGNvbW1hbmQoc2VsZiwg Y29tbWFuZCk6CiAgICAiU2V0IHRoZSBjb21tYW5kIGluIHRoZSBiaXQiCiAgICBzZWxmLmNvbW1h bmQgPSBjb21tYW5kCiAgICBzZWxmLm9yaWdpbmFsICs9IGNvbW1hbmQKICAgIHNlbGYudHJhbnNs YXRlZCA9IHNlbGYuY29tbWFuZG1hcFtzZWxmLmNvbW1hbmRdCiAKICBkZWYgcGFyc2VwYXJhbWV0 ZXIoc2VsZiwgcG9zKToKICAgICJQYXJzZSBhIHBhcmFtZXRlciBhdCB0aGUgY3VycmVudCBwb3Np dGlvbiIKICAgIGlmIG5vdCBzZWxmLmZhY3RvcnkuZGV0ZWN0Yml0KHBvcyk6CiAgICAgIFRyYWNl LmVycm9yKCdObyBwYXJhbWV0ZXIgZm91bmQgYXQ6ICcgKyBwb3MucmVtYWluaW5nKCkpCiAgICAg IHJldHVybgogICAgcGFyYW1ldGVyID0gc2VsZi5mYWN0b3J5LnBhcnNlYml0KHBvcykKICAgIHNl bGYuYWRkKHBhcmFtZXRlcikKICAgIHJldHVybiBwYXJhbWV0ZXIKCiAgZGVmIHBhcnNlc3F1YXJl KHNlbGYsIHBvcyk6CiAgICAiUGFyc2UgYSBzcXVhcmUgYnJhY2tldCIKICAgIGJyYWNrZXQgPSBT cXVhcmVCcmFja2V0KCkKICAgIGlmIG5vdCBicmFja2V0LmRldGVjdChwb3MpOgogICAgICByZXR1 cm4gTm9uZQogICAgYnJhY2tldC5wYXJzZWJpdChwb3MpCiAgICBzZWxmLmFkZChicmFja2V0KQog ICAgcmV0dXJuIGJyYWNrZXQKCmNsYXNzIEVtcHR5Q29tbWFuZChDb21tYW5kQml0KToKICAiQW4g ZW1wdHkgY29tbWFuZCAod2l0aG91dCBwYXJhbWV0ZXJzKSIKCiAgY29tbWFuZG1hcCA9IEZvcm11 bGFDb25maWcuY29tbWFuZHMKCiAgZGVmIHBhcnNlYml0KHNlbGYsIHBvcyk6CiAgICAiUGFyc2Ug YSBjb21tYW5kIHdpdGhvdXQgcGFyYW1ldGVycyIKICAgIHNlbGYuY29udGVudHMgPSBbRm9ybXVs YUNvbnN0YW50KHNlbGYudHJhbnNsYXRlZCldCgpjbGFzcyBBbHBoYUNvbW1hbmQoRW1wdHlDb21t YW5kKToKICAiQSBjb21tYW5kIHdpdGhvdXQgcGFyYW10ZXJzIHdob3NlIHJlc3VsdCBpcyBhbHBo YWJldGljYWwiCgogIGNvbW1hbmRtYXAgPSBGb3JtdWxhQ29uZmlnLmFscGhhY29tbWFuZHMKCiAg ZGVmIHBhcnNlYml0KHNlbGYsIHBvcyk6CiAgICAiUGFyc2UgdGhlIGNvbW1hbmQgYW5kIHNldCB0 eXBlIHRvIGFscGhhIgogICAgRW1wdHlDb21tYW5kLnBhcnNlYml0KHNlbGYsIHBvcykKICAgIHNl bGYudHlwZSA9ICdhbHBoYScKCmNsYXNzIE9uZVBhcmFtRnVuY3Rpb24oQ29tbWFuZEJpdCk6CiAg IkEgZnVuY3Rpb24gb2Ygb25lIHBhcmFtZXRlciIKCiAgY29tbWFuZG1hcCA9IEZvcm11bGFDb25m aWcub25lZnVuY3Rpb25zCgogIGRlZiBwYXJzZWJpdChzZWxmLCBwb3MpOgogICAgIlBhcnNlIGEg ZnVuY3Rpb24gd2l0aCBvbmUgcGFyYW1ldGVyIgogICAgc2VsZi5vdXRwdXQgPSBUYWdnZWRPdXRw dXQoKS5zZXR0YWcoc2VsZi50cmFuc2xhdGVkKQogICAgc2VsZi5wYXJzZXBhcmFtZXRlcihwb3Mp CiAgICBzZWxmLnNpbXBsaWZ5aWZwb3NzaWJsZSgpCgogIGRlZiBzaW1wbGlmeWlmcG9zc2libGUo c2VsZik6CiAgICAiVHJ5IHRvIHNpbXBsaWZ5IHRvIGEgc2luZ2xlIGNoYXJhY3Rlci4iCiAgICBU cmFjZS5kZWJ1ZygnT3JpZ2luYWw6ICcgKyBzZWxmLm9yaWdpbmFsKQogICAgaWYgc2VsZi5vcmln aW5hbCBpbiBzZWxmLmNvbW1hbmRtYXA6CiAgICAgIHNlbGYub3V0cHV0ID0gRml4ZWRPdXRwdXQo KQogICAgICBzZWxmLmh0bWwgPSBbc2VsZi5jb21tYW5kbWFwW3NlbGYub3JpZ2luYWxdXQogICAg ICBUcmFjZS5kZWJ1ZygnU2ltcGxpZmllZDogJyArIHNlbGYuY29tbWFuZG1hcFtzZWxmLm9yaWdp bmFsXSkKCmNsYXNzIFN5bWJvbEZ1bmN0aW9uKENvbW1hbmRCaXQpOgogICJGaW5kIGEgZnVuY3Rp b24gd2hpY2ggaXMgcmVwcmVzZW50ZWQgYnkgYSBzeW1ib2wgKGxpa2UgXyBvciBeKSIKCiAgY29t bWFuZG1hcCA9IEZvcm11bGFDb25maWcuc3ltYm9sZnVuY3Rpb25zCgogIGRlZiBkZXRlY3Qoc2Vs ZiwgcG9zKToKICAgICJGaW5kIHRoZSBzeW1ib2wiCiAgICByZXR1cm4gcG9zLmN1cnJlbnQoKSBp biBTeW1ib2xGdW5jdGlvbi5jb21tYW5kbWFwCgogIGRlZiBwYXJzZWJpdChzZWxmLCBwb3MpOgog ICAgIlBhcnNlIHRoZSBzeW1ib2wiCiAgICBzZWxmLnNldGNvbW1hbmQocG9zLmN1cnJlbnQoKSkK ICAgIHBvcy5za2lwKHNlbGYuY29tbWFuZCkKICAgIHNlbGYub3V0cHV0ID0gVGFnZ2VkT3V0cHV0 KCkuc2V0dGFnKHNlbGYudHJhbnNsYXRlZCkKICAgIHNlbGYucGFyc2VwYXJhbWV0ZXIocG9zKQoK Y2xhc3MgVGV4dEZ1bmN0aW9uKENvbW1hbmRCaXQpOgogICJBIGZ1bmN0aW9uIHdoZXJlIHBhcmFt ZXRlcnMgYXJlIHJlYWQgYXMgdGV4dC4iCgogIGNvbW1hbmRtYXAgPSBGb3JtdWxhQ29uZmlnLnRl eHRmdW5jdGlvbnMKCiAgZGVmIHBhcnNlYml0KHNlbGYsIHBvcyk6CiAgICAiUGFyc2UgYSB0ZXh0 IHBhcmFtZXRlciIKICAgIHNlbGYub3V0cHV0ID0gVGFnZ2VkT3V0cHV0KCkuc2V0dGFnKHNlbGYu dHJhbnNsYXRlZCkKICAgIGJyYWNrZXQgPSBCcmFja2V0KCkucGFyc2V0ZXh0KHBvcykKICAgIHNl bGYuYWRkKGJyYWNrZXQpCgogIGRlZiBwcm9jZXNzKHNlbGYpOgogICAgIlNldCB0aGUgdHlwZSB0 byBmb250IgogICAgc2VsZi50eXBlID0gJ2ZvbnQnCgpjbGFzcyBMYWJlbEZ1bmN0aW9uKENvbW1h bmRCaXQpOgogICJBIGZ1bmN0aW9uIHRoYXQgYWN0cyBhcyBhIGxhYmVsIgoKICBjb21tYW5kbWFw ID0gRm9ybXVsYUNvbmZpZy5sYWJlbGZ1bmN0aW9ucwoKICBkZWYgcGFyc2ViaXQoc2VsZiwgcG9z KToKICAgICJQYXJzZSBhIGxpdGVyYWwgcGFyYW1ldGVyIgogICAgc2VsZi5rZXkgPSBCcmFja2V0 KCkucGFyc2VsaXRlcmFsKHBvcykubGl0ZXJhbAoKICBkZWYgcHJvY2VzcyhzZWxmKToKICAgICJB ZGQgYW4gYW5jaG9yIHdpdGggdGhlIGxhYmVsIGNvbnRlbnRzLiIKICAgIHNlbGYudHlwZSA9ICdm b250JwogICAgc2VsZi5sYWJlbCA9IExhYmVsKCkuY3JlYXRlKCcgJywgc2VsZi5rZXksIHR5cGUg PSAnZXFudW1iZXInKQogICAgc2VsZi5jb250ZW50cyA9IFtzZWxmLmxhYmVsXQogICAgIyBzdG9y ZSBhcyBhIExhYmVsIHNvIHdlIGtub3cgaXQncyBiZWVuIHNlZW4KICAgIExhYmVsLm5hbWVzW3Nl bGYua2V5XSA9IHNlbGYubGFiZWwKCmNsYXNzIEZvbnRGdW5jdGlvbihPbmVQYXJhbUZ1bmN0aW9u KToKICAiQSBmdW5jdGlvbiBvZiBvbmUgcGFyYW1ldGVyIHRoYXQgY2hhbmdlcyB0aGUgZm9udCIK CiAgY29tbWFuZG1hcCA9IEZvcm11bGFDb25maWcuZm9udGZ1bmN0aW9ucwoKICBkZWYgcHJvY2Vz cyhzZWxmKToKICAgICJTaW1wbGlmeSBpZiBwb3NzaWJsZSB1c2luZyBhIHNpbmdsZSBjaGFyYWN0 ZXIuIgogICAgc2VsZi50eXBlID0gJ2ZvbnQnCiAgICBzZWxmLnNpbXBsaWZ5aWZwb3NzaWJsZSgp CgpjbGFzcyBEZWNvcmF0aW5nRnVuY3Rpb24oT25lUGFyYW1GdW5jdGlvbik6CiAgIkEgZnVuY3Rp b24gdGhhdCBkZWNvcmF0ZXMgc29tZSBiaXQgb2YgdGV4dCIKCiAgY29tbWFuZG1hcCA9IEZvcm11 bGFDb25maWcuZGVjb3JhdGluZ2Z1bmN0aW9ucwoKICBkZWYgcGFyc2ViaXQoc2VsZiwgcG9zKToK ICAgICJQYXJzZSBhIGRlY29yYXRpbmcgZnVuY3Rpb24iCiAgICBzZWxmLm91dHB1dCA9IFRhZ2dl ZE91dHB1dCgpLnNldHRhZygnc3BhbiBjbGFzcz0id2l0aHN5bWJvbCInKQogICAgc2VsZi50eXBl ID0gJ2FscGhhJwogICAgc3ltYm9sID0gc2VsZi50cmFuc2xhdGVkCiAgICB0YWdnZWQgPSBUYWdn ZWRCaXQoKS5jb25zdGFudChzeW1ib2wsICdzcGFuIGNsYXNzPSJzeW1ib2xvdmVyIicpCiAgICBz ZWxmLmNvbnRlbnRzLmFwcGVuZCh0YWdnZWQpCiAgICBwYXJhbWV0ZXIgPSBzZWxmLnBhcnNlcGFy YW1ldGVyKHBvcykKICAgIHBhcmFtZXRlci5vdXRwdXQgPSBUYWdnZWRPdXRwdXQoKS5zZXR0YWco J3NwYW4gY2xhc3M9InVuZGVyc3ltYm9sIicpCiAgICBzZWxmLnNpbXBsaWZ5aWZwb3NzaWJsZSgp CgpGb3JtdWxhRmFjdG9yeS5iaXRzICs9IFtGb3JtdWxhQ29tbWFuZCgpLCBTeW1ib2xGdW5jdGlv bigpXQpGb3JtdWxhQ29tbWFuZC5jb21tYW5kYml0cyA9IFsKICAgIEVtcHR5Q29tbWFuZCgpLCBB bHBoYUNvbW1hbmQoKSwgT25lUGFyYW1GdW5jdGlvbigpLCBEZWNvcmF0aW5nRnVuY3Rpb24oKSwK ICAgIEZvbnRGdW5jdGlvbigpLCBMYWJlbEZ1bmN0aW9uKCksIFRleHRGdW5jdGlvbigpLAogICAg XQoKCgoKaW1wb3J0IHN5cwoKCmNsYXNzIEh5YnJpZEZ1bmN0aW9uKENvbW1hbmRCaXQpOgogICJS ZWFkIGEgZnVuY3Rpb24gd2l0aCB0d28gcGFyYW1ldGVyczogW10gYW5kIHt9IgogICJUaGUgW10g cGFyYW1ldGVyIGlzIG9wdGlvbmFsIgoKICBjb21tYW5kbWFwID0gRm9ybXVsYUNvbmZpZy5oeWJy aWRmdW5jdGlvbnMKICBwYXJhbWJyYWNrZXRzID0gWygnWycsICddJyksICgneycsICd9JyldCgog IGRlZiBwYXJzZWJpdChzZWxmLCBwb3MpOgogICAgIlBhcnNlIGEgZnVuY3Rpb24gd2l0aCBbXSBh bmQge30gcGFyYW1ldGVycyIKICAgIHJlYWR0ZW1wbGF0ZSA9IHNlbGYudHJhbnNsYXRlZFswXQog ICAgd3JpdGV0ZW1wbGF0ZSA9IHNlbGYudHJhbnNsYXRlZFsxXQogICAgcGFyYW1zID0gc2VsZi5y ZWFkcGFyYW1zKHJlYWR0ZW1wbGF0ZSwgcG9zKQogICAgc2VsZi5jb250ZW50cyA9IHNlbGYud3Jp dGVwYXJhbXMocGFyYW1zLCB3cml0ZXRlbXBsYXRlKQoKICBkZWYgcmVhZHBhcmFtcyhzZWxmLCBy ZWFkdGVtcGxhdGUsIHBvcyk6CiAgICAiUmVhZCB0aGUgcGFyYW1zIGFjY29yZGluZyB0byB0aGUg dGVtcGxhdGUuIgogICAgcGFyYW1zID0gZGljdCgpCiAgICBmb3IgcGFyYW1kZWYgaW4gc2VsZi5w YXJhbWRlZnMocmVhZHRlbXBsYXRlKToKICAgICAgaWYgcGFyYW1kZWYuc3RhcnRzd2l0aCgnWycp OgogICAgICAgIHZhbHVlID0gc2VsZi5wYXJzZXNxdWFyZShwb3MpCiAgICAgIGVsaWYgcGFyYW1k ZWYuc3RhcnRzd2l0aCgneycpOgogICAgICAgIHZhbHVlID0gc2VsZi5wYXJzZXBhcmFtZXRlcihw b3MpCiAgICAgIGVsc2U6CiAgICAgICAgVHJhY2UuZXJyb3IoJ0ludmFsaWQgcGFyYW1ldGVyIGRl ZmluaXRpb24gJyArIHBhcmFtZGVmKQogICAgICAgIHZhbHVlID0gTm9uZQogICAgICBwYXJhbXNb cGFyYW1kZWZbMTotMV1dID0gdmFsdWUKICAgIHJldHVybiBwYXJhbXMKCiAgZGVmIHBhcmFtZGVm cyhzZWxmLCByZWFkdGVtcGxhdGUpOgogICAgIlJlYWQgZWFjaCBwYXJhbSBkZWZpbml0aW9uIGlu IHRoZSB0ZW1wbGF0ZSIKICAgIHBvcyA9IFBvc2l0aW9uKHJlYWR0ZW1wbGF0ZSkKICAgIHdoaWxl IG5vdCBwb3MuZmluaXNoZWQoKToKICAgICAgcGFyYW1kZWYgPSBzZWxmLnJlYWRwYXJhbWRlZihw b3MpCiAgICAgIGlmIHBhcmFtZGVmOgogICAgICAgIGlmIGxlbihwYXJhbWRlZikgIT0gNDoKICAg ICAgICAgIFRyYWNlLmVycm9yKCdQYXJhbWV0ZXIgZGVmaW5pdGlvbiAnICsgcGFyYW1kZWYgKyAn IGhhcyB3cm9uZyBsZW5ndGgnKQogICAgICAgIGVsc2U6CiAgICAgICAgICB5aWVsZCBwYXJhbWRl ZgoKICBkZWYgcmVhZHBhcmFtZGVmKHNlbGYsIHBvcyk6CiAgICAiUmVhZCBhIHNpbmdsZSBwYXJh bWV0ZXIgZGVmaW5pdGlvbjogWyQwXSwgeyR4fS4uLiIKICAgIGZvciAob3BlbmluZywgY2xvc2lu ZykgaW4gSHlicmlkRnVuY3Rpb24ucGFyYW1icmFja2V0czoKICAgICAgaWYgcG9zLmNoZWNrc2tp cChvcGVuaW5nKToKICAgICAgICBpZiBub3QgcG9zLmNoZWNrZm9yKCckJyk6CiAgICAgICAgICBU cmFjZS5lcnJvcignV3JvbmcgcGFyYW1ldGVyIG5hbWUgJyArIHBvcy5jdXJyZW50KCkpCiAgICAg ICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBvcGVuaW5nICsgcG9zLmdsb2JpbmNsdWRp bmcoY2xvc2luZykKICAgIFRyYWNlLmVycm9yKCdXcm9uZyBjaGFyYWN0ZXIgaW4gcGFyYW1ldGVy IHRlbXBsYXRlJyArIHBvcy5jdXJyZW50c2tpcCgpKQogICAgcmV0dXJuIE5vbmUKCiAgZGVmIHdy aXRlcGFyYW1zKHNlbGYsIHBhcmFtcywgd3JpdGV0ZW1wbGF0ZSk6CiAgICAiV3JpdGUgYWxsIHBh cmFtcyBhY2NvcmRpbmcgdG8gdGhlIHRlbXBsYXRlIgogICAgcmV0dXJuIHNlbGYud3JpdGVwb3Mo cGFyYW1zLCBQb3NpdGlvbih3cml0ZXRlbXBsYXRlKSkKCiAgZGVmIHdyaXRlcG9zKHNlbGYsIHBh cmFtcywgcG9zKToKICAgICJXcml0ZSBhbGwgcGFyYW1zIGFzIHJlYWQgaW4gdGhlIHBhcnNlIHBv c2l0aW9uLiIKICAgIHJlc3VsdCA9IFtdCiAgICB3aGlsZSBub3QgcG9zLmZpbmlzaGVkKCk6CiAg ICAgIGlmIHBvcy5jaGVja3NraXAoJyQnKToKICAgICAgICBwYXJhbSA9IHNlbGYud3JpdGVwYXJh bShwYXJhbXMsIHBvcykKICAgICAgICBpZiBwYXJhbToKICAgICAgICAgIHJlc3VsdC5hcHBlbmQo cGFyYW0pCiAgICAgIGVsaWYgcG9zLmNoZWNrc2tpcCgnZicpOgogICAgICAgIGZ1bmN0aW9uID0g c2VsZi53cml0ZWZ1bmN0aW9uKHBhcmFtcywgcG9zKQogICAgICAgIGlmIGZ1bmN0aW9uOgogICAg ICAgICAgcmVzdWx0LmFwcGVuZChmdW5jdGlvbikKICAgICAgZWxzZToKICAgICAgICByZXN1bHQu YXBwZW5kKEZvcm11bGFDb25zdGFudChwb3MuY3VycmVudHNraXAoKSkpCiAgICByZXR1cm4gcmVz dWx0CgogIGRlZiB3cml0ZXBhcmFtKHNlbGYsIHBhcmFtcywgcG9zKToKICAgICJXcml0ZSBhIHNp bmdsZSBwYXJhbSBvZiB0aGUgZm9ybSAkMCwgJHguLi4iCiAgICBuYW1lID0gJyQnICsgcG9zLmN1 cnJlbnRza2lwKCkKICAgIGlmIG5vdCBuYW1lIGluIHBhcmFtczoKICAgICAgVHJhY2UuZXJyb3Io J1Vua25vd24gcGFyYW1ldGVyICcgKyBuYW1lKQogICAgICByZXR1cm4gTm9uZQogICAgaWYgbm90 IHBhcmFtc1tuYW1lXToKICAgICAgcmV0dXJuIE5vbmUKICAgIGlmIHBvcy5jaGVja3NraXAoJy4n KToKICAgICAgcGFyYW1zW25hbWVdLnR5cGUgPSBwb3MuZ2xvYmFscGhhKCkKICAgIHJldHVybiBw YXJhbXNbbmFtZV0KCiAgZGVmIHdyaXRlZnVuY3Rpb24oc2VsZiwgcGFyYW1zLCBwb3MpOgogICAg IldyaXRlIGEgc2luZ2xlIGZ1bmN0aW9uIGYwLC4uLixmbi4iCiAgICB0YWcgPSBzZWxmLnJlYWR0 YWcocGFyYW1zLCBwb3MpCiAgICBpZiBub3QgdGFnOgogICAgICByZXR1cm4gTm9uZQogICAgaWYg bm90IHBvcy5jaGVja3NraXAoJ3snKToKICAgICAgVHJhY2UuZXJyb3IoJ0Z1bmN0aW9uIHNob3Vs ZCBiZSBkZWZpbmVkIGluIHt9JykKICAgICAgcmV0dXJuIE5vbmUKICAgIHBvcy5wdXNoZW5kaW5n KCd9JykKICAgIGNvbnRlbnRzID0gc2VsZi53cml0ZXBvcyhwYXJhbXMsIHBvcykKICAgIHBvcy5w b3BlbmRpbmcoKQogICAgaWYgbGVuKGNvbnRlbnRzKSA9PSAwOgogICAgICByZXR1cm4gTm9uZQog ICAgZnVuY3Rpb24gPSBUYWdnZWRCaXQoKS5jb21wbGV0ZShjb250ZW50cywgdGFnKQogICAgZnVu Y3Rpb24udHlwZSA9IE5vbmUKICAgIHJldHVybiBmdW5jdGlvbgoKICBkZWYgcmVhZHRhZyhzZWxm LCBwYXJhbXMsIHBvcyk6CiAgICAiR2V0IHRoZSB0YWcgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2 ZW4gaW5kZXguIERvZXMgcGFyYW1ldGVyIHN1YnN0aXR1dGlvbi4iCiAgICBpZiBub3QgcG9zLmN1 cnJlbnQoKS5pc2RpZ2l0KCk6CiAgICAgIFRyYWNlLmVycm9yKCdGdW5jdGlvbiBzaG91bGQgYmUg ZjAsLi4uLGY5OiBmJyArIHBvcy5jdXJyZW50KCkpCiAgICAgIHJldHVybiBOb25lCiAgICBpbmRl eCA9IGludChwb3MuY3VycmVudHNraXAoKSkKICAgIGlmIDIgKyBpbmRleCA+IGxlbihzZWxmLnRy YW5zbGF0ZWQpOgogICAgICBUcmFjZS5lcnJvcignRnVuY3Rpb24gZicgKyB1bmljb2RlKGluZGV4 KSArICcgaXMgbm90IGRlZmluZWQnKQogICAgICByZXR1cm4gTm9uZQogICAgdGFnID0gc2VsZi50 cmFuc2xhdGVkWzIgKyBpbmRleF0KICAgIGlmIG5vdCAnJCcgaW4gdGFnOgogICAgICByZXR1cm4g dGFnCiAgICBmb3IgbmFtZSBpbiBwYXJhbXM6CiAgICAgIGlmIG5hbWUgaW4gdGFnOgogICAgICAg IGlmIHBhcmFtc1tuYW1lXToKICAgICAgICAgIHZhbHVlID0gcGFyYW1zW25hbWVdLm9yaWdpbmFs WzE6LTFdCiAgICAgICAgZWxzZToKICAgICAgICAgIHZhbHVlID0gJycKICAgICAgICB0YWcgPSB0 YWcucmVwbGFjZShuYW1lLCB2YWx1ZSkKICAgIHJldHVybiB0YWcKCkZvcm11bGFDb21tYW5kLmNv bW1hbmRiaXRzICs9IFsKICAgIEh5YnJpZEZ1bmN0aW9uKCksCiAgICBdCgoKCgoKCgoKCmNsYXNz IFRhYmxlUGFyc2VyKEJvdW5kZWRQYXJzZXIpOgogICJQYXJzZSB0aGUgd2hvbGUgdGFibGUiCgog IGhlYWRlcnMgPSBDb250YWluZXJDb25maWcudGFibGVbJ2hlYWRlcnMnXQoKICBkZWYgX19pbml0 X18oc2VsZik6CiAgICBCb3VuZGVkUGFyc2VyLl9faW5pdF9fKHNlbGYpCiAgICBzZWxmLmNvbHVt bnMgPSBsaXN0KCkKCiAgZGVmIHBhcnNlaGVhZGVyKHNlbGYsIHJlYWRlcik6CiAgICAiUGFyc2Ug dGFibGUgaGVhZGVycyIKICAgIHJlYWRlci5uZXh0bGluZSgpCiAgICB3aGlsZSBzZWxmLnN0YXJ0 c3dpdGhoZWFkZXIocmVhZGVyKToKICAgICAgc2VsZi5wYXJzZXBhcmFtZXRlcihyZWFkZXIpCiAg ICByZXR1cm4gW10KCiAgZGVmIHN0YXJ0c3dpdGhoZWFkZXIoc2VsZiwgcmVhZGVyKToKICAgICJD aGVjayBpZiB0aGUgY3VycmVudCBsaW5lIHN0YXJ0cyB3aXRoIGEgaGVhZGVyIGxpbmUiCiAgICBm b3Igc3RhcnQgaW4gVGFibGVQYXJzZXIuaGVhZGVyczoKICAgICAgaWYgcmVhZGVyLmN1cnJlbnRs aW5lKCkuc3RyaXAoKS5zdGFydHN3aXRoKHN0YXJ0KToKICAgICAgICByZXR1cm4gVHJ1ZQogICAg cmV0dXJuIEZhbHNlCgpjbGFzcyBUYWJsZVBhcnRQYXJzZXIoQm91bmRlZFBhcnNlcik6CiAgIlBh cnNlIGEgdGFibGUgcGFydCAocm93IG9yIGNlbGwpIgoKICBkZWYgcGFyc2VoZWFkZXIoc2VsZiwg cmVhZGVyKToKICAgICJQYXJzZSB0aGUgaGVhZGVyIgogICAgdGFibGVrZXksIHBhcmFtZXRlcnMg PSBzZWxmLnBhcnNleG1sKHJlYWRlcikKICAgIHNlbGYucGFyYW1ldGVycyA9IHBhcmFtZXRlcnMK ICAgIHJldHVybiBsaXN0KCkKCmNsYXNzIENvbHVtblBhcnNlcihMb25lQ29tbWFuZCk6CiAgIlBh cnNlIGNvbHVtbiBwcm9wZXJ0aWVzIgoKICBkZWYgcGFyc2VoZWFkZXIoc2VsZiwgcmVhZGVyKToK ICAgICJQYXJzZSB0aGUgY29sdW1uIGRlZmluaXRpb24iCiAgICBrZXksIHBhcmFtZXRlcnMgPSBz ZWxmLnBhcnNleG1sKHJlYWRlcikKICAgIHNlbGYucGFyYW1ldGVycyA9IHBhcmFtZXRlcnMKICAg IHJldHVybiBbXQoKCgpjbGFzcyBUYWJsZShDb250YWluZXIpOgogICJBIGx5eCB0YWJsZSIKCiAg ZGVmIF9faW5pdF9fKHNlbGYpOgogICAgc2VsZi5wYXJzZXIgPSBUYWJsZVBhcnNlcigpCiAgICBz ZWxmLm91dHB1dCA9IFRhZ2dlZE91dHB1dCgpLnNldHRhZygndGFibGUnLCBUcnVlKQogICAgc2Vs Zi5jb2x1bW5zID0gW10KCiAgZGVmIHByb2Nlc3Moc2VsZik6CiAgICAiU2V0IHRoZSBjb2x1bW5z IG9uIGV2ZXJ5IHJvdyIKICAgIGluZGV4ID0gMAogICAgd2hpbGUgaW5kZXggPCBsZW4oc2VsZi5j b250ZW50cyk6CiAgICAgIGVsZW1lbnQgPSBzZWxmLmNvbnRlbnRzW2luZGV4XQogICAgICBpZiBp c2luc3RhbmNlKGVsZW1lbnQsIENvbHVtbik6CiAgICAgICAgc2VsZi5jb2x1bW5zLmFwcGVuZChl bGVtZW50KQogICAgICAgIGRlbCBzZWxmLmNvbnRlbnRzW2luZGV4XQogICAgICBlbGlmIGlzaW5z dGFuY2UoZWxlbWVudCwgQmxhY2tCb3gpOgogICAgICAgIGRlbCBzZWxmLmNvbnRlbnRzW2luZGV4 XQogICAgICBlbGlmIGlzaW5zdGFuY2UoZWxlbWVudCwgUm93KToKICAgICAgICBlbGVtZW50LnNl dGNvbHVtbnMoc2VsZi5jb2x1bW5zKQogICAgICAgIGluZGV4ICs9IDEKICAgICAgZWxzZToKICAg ICAgICBUcmFjZS5lcnJvcignVW5rbm93biBlbGVtZW50IHR5cGUgJyArIGVsZW1lbnQuX19jbGFz c19fLl9fbmFtZV9fICsKICAgICAgICAgICAgJyBpbiB0YWJsZTogJyArIHVuaWNvZGUoZWxlbWVu dC5jb250ZW50c1swXSkpCiAgICAgICAgaW5kZXggKz0gMQoKY2xhc3MgUm93KENvbnRhaW5lcik6 CiAgIkEgcm93IGluIGEgdGFibGUiCgogIGRlZiBfX2luaXRfXyhzZWxmKToKICAgIHNlbGYucGFy c2VyID0gVGFibGVQYXJ0UGFyc2VyKCkKICAgIHNlbGYub3V0cHV0ID0gVGFnZ2VkT3V0cHV0KCku c2V0dGFnKCd0cicsIFRydWUpCiAgICBzZWxmLmNvbHVtbnMgPSBsaXN0KCkKCiAgZGVmIHNldGNv bHVtbnMoc2VsZiwgY29sdW1ucyk6CiAgICAiUHJvY2VzcyBhbGlnbm1lbnRzIGZvciBldmVyeSBj b2x1bW4iCiAgICBpZiBsZW4oY29sdW1ucykgIT0gbGVuKHNlbGYuY29udGVudHMpOgogICAgICBU cmFjZS5lcnJvcignQ29sdW1uczogJyArIHVuaWNvZGUobGVuKGNvbHVtbnMpKSArICcsIGNlbGxz OiAnICsgdW5pY29kZShsZW4oc2VsZi5jb250ZW50cykpKQogICAgICByZXR1cm4KICAgIGZvciBp bmRleCwgY2VsbCBpbiBlbnVtZXJhdGUoc2VsZi5jb250ZW50cyk6CiAgICAgIGNvbHVtbnNbaW5k ZXhdLnNldChjZWxsKQoKY2xhc3MgQ29sdW1uKENvbnRhaW5lcik6CiAgIkEgY29sdW1uIGRlZmlu aXRpb24gaW4gYSB0YWJsZSIKCiAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgc2VsZi5wYXJzZXIg PSBDb2x1bW5QYXJzZXIoKQogICAgc2VsZi5vdXRwdXQgPSBFbXB0eU91dHB1dCgpCgogIGRlZiBz ZXQoc2VsZiwgY2VsbCk6CiAgICAiU2V0IGFsaWdubWVudHMgaW4gdGhlIGNvcnJlc3BvbmRpbmcg Y2VsbCIKICAgIGFsaWdubWVudCA9IHNlbGYucGFyYW1ldGVyc1snYWxpZ25tZW50J10KICAgIGlm IGFsaWdubWVudCA9PSAnYmxvY2snOgogICAgICBhbGlnbm1lbnQgPSAnanVzdGlmeScKICAgIGNl bGwuc2V0YXR0cmlidXRlKCdhbGlnbicsIGFsaWdubWVudCkKICAgIHZhbGlnbm1lbnQgPSBzZWxm LnBhcmFtZXRlcnNbJ3ZhbGlnbm1lbnQnXQogICAgY2VsbC5zZXRhdHRyaWJ1dGUoJ3ZhbGlnbics IHZhbGlnbm1lbnQpCgpjbGFzcyBDZWxsKENvbnRhaW5lcik6CiAgIkEgY2VsbCBpbiBhIHRhYmxl IgoKICBkZWYgX19pbml0X18oc2VsZik6CiAgICBzZWxmLnBhcnNlciA9IFRhYmxlUGFydFBhcnNl cigpCiAgICBzZWxmLm91dHB1dCA9IFRhZ2dlZE91dHB1dCgpLnNldHRhZygndGQnLCBUcnVlKQoK ICBkZWYgc2V0bXVsdGljb2x1bW4oc2VsZiwgc3Bhbik6CiAgICAiU2V0IHRoZSBjZWxsIGFzIG11 bHRpY29sdW1uIgogICAgc2VsZi5zZXRhdHRyaWJ1dGUoJ2NvbHNwYW4nLCBzcGFuKQoKICBkZWYg c2V0YXR0cmlidXRlKHNlbGYsIGF0dHJpYnV0ZSwgdmFsdWUpOgogICAgIlNldCBhIGNlbGwgYXR0 cmlidXRlIGluIHRoZSB0YWciCiAgICBzZWxmLm91dHB1dC50YWcgKz0gJyAnICsgYXR0cmlidXRl ICsgJz0iJyArIHVuaWNvZGUodmFsdWUpICsgJyInCgoKCgppbXBvcnQgc3RydWN0CmltcG9ydCBz eXMKaW1wb3J0IG9zCgoKCmltcG9ydCBvcwppbXBvcnQgb3MucGF0aAppbXBvcnQgY29kZWNzCgoK Y2xhc3MgUGF0aChvYmplY3QpOgogICJSZXByZXNlbnRzIGEgZ2VuZXJpYyBwYXRoIgoKICBkZWYg ZXhpc3RzKHNlbGYpOgogICAgIkNoZWNrIGlmIHRoZSBmaWxlIGV4aXN0cyIKICAgIHJldHVybiBv cy5wYXRoLmV4aXN0cyhzZWxmLnBhdGgpCgogIGRlZiBvcGVuKHNlbGYpOgogICAgIk9wZW4gdGhl IGZpbGUgYXMgcmVhZG9ubHkgYmluYXJ5IgogICAgcmV0dXJuIGNvZGVjcy5vcGVuKHNlbGYucGF0 aCwgJ3JiJykKCiAgZGVmIGdldG10aW1lKHNlbGYpOgogICAgIlJldHVybiBsYXN0IG1vZGlmaWNh dGlvbiB0aW1lIgogICAgcmV0dXJuIG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5wYXRoKQoKICBkZWYg aGFzZXh0cyhzZWxmLCBleHRzKToKICAgICJDaGVjayBpZiB0aGUgZmlsZSBoYXMgb25lIG9mIHRo ZSBnaXZlbiBleHRlbnNpb25zLiIKICAgIGZvciBleHQgaW4gZXh0czoKICAgICAgaWYgc2VsZi5o YXNleHQoZXh0KToKICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIEZhbHNlCgogIGRlZiBo YXNleHQoc2VsZiwgZXh0KToKICAgICJDaGVjayBpZiB0aGUgZmlsZSBoYXMgdGhlIGdpdmVuIGV4 dGVuc2lvbiIKICAgIGJhc2UsIG9sZGV4dCA9IG9zLnBhdGguc3BsaXRleHQoc2VsZi5wYXRoKQog ICAgcmV0dXJuIG9sZGV4dCA9PSBleHQKCiAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgogICAgIlJl dHVybiBhIHVuaWNvZGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIgogICAgcmV0dXJuIHNlbGYucGF0 aAoKICBkZWYgX19lcV9fKHNlbGYsIHBhdGgpOgogICAgIkNvbXBhcmUgdG8gYW5vdGhlciBwYXRo IgogICAgaWYgbm90IGhhc2F0dHIocGF0aCwgJ3BhdGgnKToKICAgICAgcmV0dXJuIEZhbHNlCiAg ICByZXR1cm4gc2VsZi5wYXRoID09IHBhdGgucGF0aAoKY2xhc3MgSW5wdXRQYXRoKFBhdGgpOgog ICJSZXByZXNlbnRzIGFuIGlucHV0IGZpbGUiCgogIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwpOgog ICAgIkNyZWF0ZSB0aGUgaW5wdXQgcGF0aCBiYXNlZCBvbiB1cmwiCiAgICBzZWxmLnVybCA9IHVy bAogICAgc2VsZi5wYXRoID0gdXJsCiAgICBpZiBub3Qgb3MucGF0aC5pc2Ficyh1cmwpOgogICAg ICBzZWxmLnBhdGggPSBvcy5wYXRoLmpvaW4oT3B0aW9ucy5kaXJlY3RvcnksIHVybCkKCmNsYXNz IE91dHB1dFBhdGgoUGF0aCk6CiAgIlJlcHJlc2VudHMgYW4gb3V0cHV0IGZpbGUiCgogIGRlZiBf X2luaXRfXyhzZWxmLCBpbnB1dHBhdGgpOgogICAgIkNyZWF0ZSB0aGUgb3V0cHV0IHBhdGggYmFz ZWQgb24gYW4gaW5wdXQgcGF0aCIKICAgIHNlbGYudXJsID0gaW5wdXRwYXRoLnVybAogICAgaWYg b3MucGF0aC5pc2FicyhzZWxmLnVybCk6CiAgICAgIHNlbGYudXJsID0gb3MucGF0aC5iYXNlbmFt ZShzZWxmLnVybCkKICAgIHNlbGYucGF0aCA9IG9zLnBhdGguam9pbihPcHRpb25zLmRlc3RkaXJl Y3RvcnksIHNlbGYudXJsKQogIAogIGRlZiBjaGFuZ2VleHQoc2VsZiwgZXh0KToKICAgICJDaGFu Z2UgZXh0ZW5zaW9uIHRvIHRoZSBnaXZlbiBvbmUiCiAgICBiYXNlLCBvbGRleHQgPSBvcy5wYXRo LnNwbGl0ZXh0KHNlbGYucGF0aCkKICAgIHNlbGYucGF0aCA9IGJhc2UgKyBleHQKICAgIGJhc2Us IG9sZGV4dCA9IG9zLnBhdGguc3BsaXRleHQoc2VsZi51cmwpCiAgICBzZWxmLnVybCA9IGJhc2Ug KyBleHQKCiAgZGVmIGV4aXN0cyhzZWxmKToKICAgICJDaGVjayBpZiB0aGUgZmlsZSBleGlzdHMi CiAgICByZXR1cm4gb3MucGF0aC5leGlzdHMoc2VsZi5wYXRoKQoKICBkZWYgY3JlYXRlZGlycyhz ZWxmKToKICAgICJDcmVhdGUgYW55IGludGVybWVkaWF0ZSBkaXJlY3RvcmllcyB0aGF0IGRvbid0 IGV4aXN0IgogICAgZGlyID0gb3MucGF0aC5kaXJuYW1lKHNlbGYucGF0aCkKICAgIGlmIGxlbihk aXIpID4gMCBhbmQgbm90IG9zLnBhdGguZXhpc3RzKGRpcik6CiAgICAgIG9zLm1ha2VkaXJzKGRp cikKCiAgZGVmIHJlbW92ZWJhY2tkaXJzKHNlbGYpOgogICAgIlJlbW92ZSBhbnkgb2NjdXJyZW5j ZXMgb2YgLi4vIChvciAuLlwgb24gV2luZG93cykiCiAgICBzZWxmLnBhdGggPSBvcy5wYXRoLm5v cm1wYXRoKHNlbGYucGF0aCkKICAgIGJhY2tkaXIgPSAnLi4nICsgb3MucGF0aC5zZXAKICAgIHdo aWxlIHNlbGYucGF0aC5zdGFydHN3aXRoKGJhY2tkaXIpOgogICAgICBUcmFjZS5kZWJ1ZygnQmFj a2RpciBpbjogJyArIHNlbGYucGF0aCkKICAgICAgc2VsZi5wYXRoID0gc2VsZi5wYXRoW2xlbihi YWNrZGlyKTpdCiAgICB3aGlsZSBzZWxmLnVybC5zdGFydHN3aXRoKCcuLi8nKToKICAgICAgVHJh Y2UuZGVidWcoJ0JhY2tkaXIgaW46ICcgKyBzZWxmLnVybCkKICAgICAgc2VsZi51cmwgPSBzZWxm LnVybFtsZW4oJy4uLycpOl0KCgoKY2xhc3MgSW1hZ2UoQ29udGFpbmVyKToKICAiQW4gZW1iZWRk ZWQgaW1hZ2UiCgogIGlnbm9yZWR0ZXh0cyA9IEltYWdlQ29uZmlnLnNpemVbJ2lnbm9yZWR0ZXh0 cyddCiAgdmVjdG9yZm9ybWF0cyA9IEltYWdlQ29uZmlnLmZvcm1hdHNbJ3ZlY3RvciddCiAgcmFz dGVyZm9ybWF0cyA9IEltYWdlQ29uZmlnLmZvcm1hdHNbJ3Jhc3RlciddCiAgZGVmYXVsdGZvcm1h dCA9IEltYWdlQ29uZmlnLmZvcm1hdHNbJ2RlZmF1bHQnXQoKICBkZWYgX19pbml0X18oc2VsZik6 CiAgICBzZWxmLnBhcnNlciA9IEluc2V0UGFyc2VyKCkKICAgIHNlbGYub3V0cHV0ID0gSW1hZ2VP dXRwdXQoKQogICAgc2VsZi50eXBlID0gJ2VtYmVkZGVkJwogICAgc2VsZi53aWR0aCA9IE5vbmUK ICAgIHNlbGYuaGVpZ2h0ID0gTm9uZQogICAgc2VsZi5tYXh3aWR0aCA9IE5vbmUKICAgIHNlbGYu bWF4aGVpZ2h0ID0gTm9uZQogICAgc2VsZi5zY2FsZSA9IE5vbmUKCiAgZGVmIHByb2Nlc3Moc2Vs Zik6CiAgICAiUGxhY2UgdGhlIHVybCwgY29udmVydCB0aGUgaW1hZ2UgaWYgbmVjZXNzYXJ5LiIK ICAgIHNlbGYub3JpZ2luID0gSW5wdXRQYXRoKHNlbGYucGFyYW1ldGVyc1snZmlsZW5hbWUnXSkK ICAgIGlmIG5vdCBzZWxmLm9yaWdpbi5leGlzdHMoKToKICAgICAgVHJhY2UuZXJyb3IoJ0ltYWdl ICcgKyB1bmljb2RlKHNlbGYub3JpZ2luKSArICcgbm90IGZvdW5kJykKICAgICAgcmV0dXJuCiAg ICBzZWxmLmRlc3RpbmF0aW9uID0gc2VsZi5nZXRkZXN0aW5hdGlvbihzZWxmLm9yaWdpbikKICAg IHNlbGYuc2V0c2NhbGUoKQogICAgSW1hZ2VDb252ZXJ0ZXIuaW5zdGFuY2UuY29udmVydChzZWxm KQogICAgc2VsZi5zZXRzaXplKCkKCiAgZGVmIGdldGRlc3RpbmF0aW9uKHNlbGYsIG9yaWdpbik6 CiAgICAiQ29udmVydCBvcmlnaW4gcGF0aCB0byBkZXN0aW5hdGlvbiBwYXRoLiIKICAgICJDaGFu Z2VzIGV4dGVuc2lvbiBvZiBkZXN0aW5hdGlvbiB0byBvdXRwdXQgaW1hZ2UgZm9ybWF0LiIKICAg IGRlc3RpbmF0aW9uID0gT3V0cHV0UGF0aChvcmlnaW4pCiAgICBmb3JjZWZvcm1hdCA9ICcuanBn JwogICAgZm9yY2VkZXN0ID0gSW1hZ2UuZGVmYXVsdGZvcm1hdAogICAgaWYgT3B0aW9ucy5mb3Jj ZWZvcm1hdDoKICAgICAgZm9yY2Vmb3JtYXQgPSBPcHRpb25zLmZvcmNlZm9ybWF0CiAgICAgIGZv cmNlZGVzdCA9IE9wdGlvbnMuZm9yY2Vmb3JtYXQKICAgIGlmIG5vdCBkZXN0aW5hdGlvbi5oYXNl eHQoZm9yY2Vmb3JtYXQpOgogICAgICBkZXN0aW5hdGlvbi5jaGFuZ2VleHQoZm9yY2VkZXN0KQog ICAgZGVzdGluYXRpb24ucmVtb3ZlYmFja2RpcnMoKQogICAgcmV0dXJuIGRlc3RpbmF0aW9uCgog IGRlZiBzZXRzY2FsZShzZWxmKToKICAgICJTZXQgdGhlIHNjYWxlIGF0dHJpYnV0ZSBpZiBwcmVz ZW50LiIKICAgIHNlbGYuc2V0aWZwYXJhbSgnc2NhbGUnKQoKICBkZWYgc2V0c2l6ZShzZWxmKToK ICAgICJTZXQgdGhlIHNpemUgYXR0cmlidXRlcyB3aWR0aCBhbmQgaGVpZ2h0LiIKICAgIGltYWdl ZmlsZSA9IEltYWdlRmlsZShzZWxmLmRlc3RpbmF0aW9uKQogICAgd2lkdGgsIGhlaWdodCA9IGlt YWdlZmlsZS5nZXRkaW1lbnNpb25zKCkKICAgIGlmIHdpZHRoOgogICAgICBzZWxmLm1heHdpZHRo ID0gdW5pY29kZSh3aWR0aCkgKyAncHgnCiAgICAgIGlmIHNlbGYuc2NhbGU6CiAgICAgICAgc2Vs Zi53aWR0aCA9IHNlbGYuc2NhbGV2YWx1ZSh3aWR0aCkKICAgIGlmIGhlaWdodDoKICAgICAgc2Vs Zi5tYXhoZWlnaHQgPSB1bmljb2RlKGhlaWdodCkgKyAncHgnCiAgICAgIGlmIHNlbGYuc2NhbGU6 CiAgICAgICAgc2VsZi5oZWlnaHQgPSBzZWxmLnNjYWxldmFsdWUoaGVpZ2h0KQogICAgc2VsZi5z ZXRpZnBhcmFtKCd3aWR0aCcpCiAgICBzZWxmLnNldGlmcGFyYW0oJ2hlaWdodCcpCgogIGRlZiBz ZXRpZnBhcmFtKHNlbGYsIG5hbWUpOgogICAgIlNldCB0aGUgdmFsdWUgaW4gdGhlIGNvbnRhaW5l ciBpZiBpdCBleGlzdHMgYXMgYSBwYXJhbS4iCiAgICBpZiBub3QgbmFtZSBpbiBzZWxmLnBhcmFt ZXRlcnM6CiAgICAgIHJldHVybgogICAgdmFsdWUgPSB1bmljb2RlKHNlbGYucGFyYW1ldGVyc1tu YW1lXSkKICAgIGZvciBpZ25vcmVkIGluIEltYWdlLmlnbm9yZWR0ZXh0czoKICAgICAgaWYgaWdu b3JlZCBpbiB2YWx1ZToKICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoaWdub3JlZCwgJycp CiAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIHZhbHVlKQoKICBkZWYgc2NhbGV2YWx1ZShzZWxmLCB2 YWx1ZSk6CiAgICAiU2NhbGUgdGhlIHZhbHVlIGFjY29yZGluZyB0byB0aGUgaW1hZ2Ugc2NhbGUg YW5kIHJldHVybiBpdCBhcyB1bmljb2RlLiIKICAgIHNjYWxlZCA9IHZhbHVlICogaW50KHNlbGYu c2NhbGUpIC8gMTAwCiAgICByZXR1cm4gdW5pY29kZShpbnQoc2NhbGVkKSkgKyAncHgnCgpjbGFz cyBJbWFnZUNvbnZlcnRlcihvYmplY3QpOgogICJBIGNvbnZlcnRlciBmcm9tIG9uZSBpbWFnZSBm aWxlIHRvIGFub3RoZXIuIgoKICBhY3RpdmUgPSBUcnVlCiAgaW5zdGFuY2UgPSBOb25lCgogIGRl ZiBjb252ZXJ0KHNlbGYsIGltYWdlKToKICAgICJDb252ZXJ0IGFuIGltYWdlIHRvIFBORyIKICAg IGlmIG5vdCBJbWFnZUNvbnZlcnRlci5hY3RpdmU6CiAgICAgIHJldHVybgogICAgaWYgaW1hZ2Uu b3JpZ2luLnVybCA9PSBpbWFnZS5kZXN0aW5hdGlvbi51cmw6CiAgICAgIHJldHVybgogICAgaWYg aW1hZ2UuZGVzdGluYXRpb24uZXhpc3RzKCk6CiAgICAgIGlmIGltYWdlLm9yaWdpbi5nZXRtdGlt ZSgpIDw9IGltYWdlLmRlc3RpbmF0aW9uLmdldG10aW1lKCk6CiAgICAgICAgIyBmaWxlIGhhcyBu b3QgY2hhbmdlZDsgZG8gbm90IGNvbnZlcnQKICAgICAgICByZXR1cm4KICAgIGltYWdlLmRlc3Rp bmF0aW9uLmNyZWF0ZWRpcnMoKQogICAgY29tbWFuZCA9ICdjb252ZXJ0ICcKICAgIHBhcmFtcyA9 IHNlbGYuZ2V0cGFyYW1zKGltYWdlKQogICAgZm9yIHBhcmFtIGluIHBhcmFtczoKICAgICAgY29t bWFuZCArPSAnLScgKyBwYXJhbSArICcgJyArIHVuaWNvZGUocGFyYW1zW3BhcmFtXSkgKyAnICcK ICAgIGNvbW1hbmQgKz0gJyInICsgdW5pY29kZShpbWFnZS5vcmlnaW4pICsgJyIgIicKICAgIGNv bW1hbmQgKz0gdW5pY29kZShpbWFnZS5kZXN0aW5hdGlvbikgKyAnIicKICAgIHRyeToKICAgICAg VHJhY2UuZGVidWcoJ0ltYWdlTWFnaWNrIENvbW1hbmQ6ICInICsgY29tbWFuZCArICciJykKICAg ICAgcmVzdWx0ID0gb3Muc3lzdGVtKGNvbW1hbmQuZW5jb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5j b2RpbmcoKSkpCiAgICAgIGlmIHJlc3VsdCAhPSAwOgogICAgICAgIFRyYWNlLmVycm9yKCdJbWFn ZU1hZ2ljayBub3QgaW5zdGFsbGVkOyBpbWFnZXMgd2lsbCBub3QgYmUgcHJvY2Vzc2VkJykKICAg ICAgICBJbWFnZUNvbnZlcnRlci5hY3RpdmUgPSBGYWxzZQogICAgICAgIHJldHVybgogICAgICBU cmFjZS5tZXNzYWdlKCdDb252ZXJ0ZWQgJyArIHVuaWNvZGUoaW1hZ2Uub3JpZ2luKSArICcgdG8g JyArCiAgICAgICAgICB1bmljb2RlKGltYWdlLmRlc3RpbmF0aW9uKSkKICAgIGV4Y2VwdCBPU0Vy cm9yLCBleGNlcHRpb246CiAgICAgIFRyYWNlLmVycm9yKCdFcnJvciB3aGlsZSBjb252ZXJ0aW5n IGltYWdlICcgKyB1bmljb2RlKGltYWdlLm9yaWdpbikKICAgICAgICAgICsgJzogJyArIHVuaWNv ZGUoZXhjZXB0aW9uKSkKCiAgZGVmIGdldHBhcmFtcyhzZWxmLCBpbWFnZSk6CiAgICAiR2V0IHRo ZSBwYXJhbWV0ZXJzIGZvciBJbWFnZU1hZ2ljayBjb252ZXJzaW9uIgogICAgcGFyYW1zID0gZGlj dCgpCiAgICBpZiBpbWFnZS5vcmlnaW4uaGFzZXh0cyhJbWFnZS52ZWN0b3Jmb3JtYXRzKToKICAg ICAgc2NhbGUgPSAxMDAKICAgICAgaWYgaW1hZ2Uuc2NhbGU6CiAgICAgICAgc2NhbGUgPSBpbWFn ZS5zY2FsZQogICAgICAgICMgZGVzY2FsZQogICAgICAgIGltYWdlLnNjYWxlID0gTm9uZQogICAg ICBwYXJhbXNbJ2RlbnNpdHknXSA9IHNjYWxlCiAgICBlbGlmIGltYWdlLm9yaWdpbi5oYXNleHQo Jy5wZGYnKToKICAgICAgcGFyYW1zWydkZWZpbmUnXSA9ICdwZGY6dXNlLWNyb3Bib3g9dHJ1ZScK ICAgIHJldHVybiBwYXJhbXMKCkltYWdlQ29udmVydGVyLmluc3RhbmNlID0gSW1hZ2VDb252ZXJ0 ZXIoKQoKY2xhc3MgSW1hZ2VGaWxlKG9iamVjdCk6CiAgIkEgZmlsZSBjb3JyZXNwb25kaW5nIHRv IGFuIGltYWdlIChKUEcgb3IgUE5HKSIKCiAgZGltZW5zaW9ucyA9IGRpY3QoKQoKICBkZWYgX19p bml0X18oc2VsZiwgcGF0aCk6CiAgICAiQ3JlYXRlIHRoZSBmaWxlIGJhc2VkIG9uIGl0cyBwYXRo IgogICAgc2VsZi5wYXRoID0gcGF0aAoKICBkZWYgZ2V0ZGltZW5zaW9ucyhzZWxmKToKICAgICJH ZXQgdGhlIGRpbWVuc2lvbnMgb2YgYSBKUEcgb3IgUE5HIGltYWdlIgogICAgaWYgbm90IHNlbGYu cGF0aC5leGlzdHMoKToKICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKICAgIGlmIHVuaWNvZGUoc2Vs Zi5wYXRoKSBpbiBJbWFnZUZpbGUuZGltZW5zaW9uczoKICAgICAgcmV0dXJuIEltYWdlRmlsZS5k aW1lbnNpb25zW3VuaWNvZGUoc2VsZi5wYXRoKV0KICAgIGRpbWVuc2lvbnMgPSAoTm9uZSwgTm9u ZSkKICAgIGlmIHNlbGYucGF0aC5oYXNleHQoJy5wbmcnKToKICAgICAgZGltZW5zaW9ucyA9IHNl bGYuZ2V0cG5nZGltZW5zaW9ucygpCiAgICBlbGlmIHNlbGYucGF0aC5oYXNleHQoJy5qcGcnKToK ICAgICAgZGltZW5zaW9ucyA9IHNlbGYuZ2V0anBnZGltZW5zaW9ucygpCiAgICBJbWFnZUZpbGUu ZGltZW5zaW9uc1t1bmljb2RlKHNlbGYucGF0aCldID0gZGltZW5zaW9ucwogICAgcmV0dXJuIGRp bWVuc2lvbnMKCiAgZGVmIGdldHBuZ2RpbWVuc2lvbnMoc2VsZik6CiAgICAiR2V0IHRoZSBkaW1l bnNpb25zIG9mIGEgUE5HIGltYWdlIgogICAgcG5nZmlsZSA9IHNlbGYucGF0aC5vcGVuKCkKICAg IHBuZ2ZpbGUuc2VlaygxNikKICAgIHdpZHRoID0gc2VsZi5yZWFkbG9uZyhwbmdmaWxlKQogICAg aGVpZ2h0ID0gc2VsZi5yZWFkbG9uZyhwbmdmaWxlKQogICAgcG5nZmlsZS5jbG9zZSgpCiAgICBy ZXR1cm4gKHdpZHRoLCBoZWlnaHQpCgogIGRlZiBnZXRqcGdkaW1lbnNpb25zKHNlbGYpOgogICAg IkdldCB0aGUgZGltZW5zaW9ucyBvZiBhIEpQRUcgaW1hZ2UiCiAgICBqcGdmaWxlID0gc2VsZi5w YXRoLm9wZW4oKQogICAgc3RhcnQgPSBzZWxmLnJlYWR3b3JkKGpwZ2ZpbGUpCiAgICBpZiBzdGFy dCAhPSBpbnQoJ2ZmZDgnLCAxNik6CiAgICAgIFRyYWNlLmVycm9yKHVuaWNvZGUoc2VsZi5wYXRo KSArICcgbm90IGEgSlBFRyBmaWxlJykKICAgICAgcmV0dXJuIChOb25lLCBOb25lKQogICAgc2Vs Zi5za2lwaGVhZGVycyhqcGdmaWxlLCBbJ2ZmYzAnLCAnZmZjMiddKQogICAgc2VsZi5zZWVrKGpw Z2ZpbGUsIDMpCiAgICBoZWlnaHQgPSBzZWxmLnJlYWR3b3JkKGpwZ2ZpbGUpCiAgICB3aWR0aCA9 IHNlbGYucmVhZHdvcmQoanBnZmlsZSkKICAgIGpwZ2ZpbGUuY2xvc2UoKQogICAgcmV0dXJuICh3 aWR0aCwgaGVpZ2h0KQoKICBkZWYgc2tpcGhlYWRlcnMoc2VsZiwgZmlsZSwgaGV4dmFsdWVzKToK ICAgICJTa2lwIEpQRUcgaGVhZGVycyB1bnRpbCBvbmUgb2YgdGhlIHBhcmFtZXRlciBoZWFkZXJz IGlzIGZvdW5kIgogICAgaGVhZGVydmFsdWVzID0gW2ludCh2YWx1ZSwgMTYpIGZvciB2YWx1ZSBp biBoZXh2YWx1ZXNdCiAgICBoZWFkZXIgPSBzZWxmLnJlYWR3b3JkKGZpbGUpCiAgICBzYWZldHlj b3VudGVyID0gMAogICAgd2hpbGUgaGVhZGVyIG5vdCBpbiBoZWFkZXJ2YWx1ZXMgYW5kIHNhZmV0 eWNvdW50ZXIgPCAzMDoKICAgICAgbGVuZ3RoID0gc2VsZi5yZWFkd29yZChmaWxlKQogICAgICBp ZiBsZW5ndGggPT0gMDoKICAgICAgICBUcmFjZS5lcnJvcignRW5kIG9mIGZpbGUgJyArIGZpbGUu bmFtZSkKICAgICAgICByZXR1cm4KICAgICAgc2VsZi5zZWVrKGZpbGUsIGxlbmd0aCAtIDIpCiAg ICAgIGhlYWRlciA9IHNlbGYucmVhZHdvcmQoZmlsZSkKICAgICAgc2FmZXR5Y291bnRlciArPSAx CgogIGRlZiByZWFkbG9uZyhzZWxmLCBmaWxlKToKICAgICJSZWFkIGEgbG9uZyAoMzItYml0KSB2 YWx1ZSBmcm9tIGZpbGUiCiAgICByZXR1cm4gc2VsZi5yZWFkZm9ybWF0KGZpbGUsICc+TCcsIDQp CgogIGRlZiByZWFkd29yZChzZWxmLCBmaWxlKToKICAgICJSZWFkIGEgMTYtYml0IHZhbHVlIGZy b20gZmlsZSIKICAgIHJldHVybiBzZWxmLnJlYWRmb3JtYXQoZmlsZSwgJz5IJywgMikKCiAgZGVm IHJlYWRmb3JtYXQoc2VsZiwgZmlsZSwgZm9ybWF0LCBieXRlcyk6CiAgICAiUmVhZCBhbnkgZm9y bWF0IGZyb20gZmlsZSIKICAgIHJlYWQgPSBmaWxlLnJlYWQoYnl0ZXMpCiAgICBpZiByZWFkID09 ICcnOgogICAgICBUcmFjZS5lcnJvcignRU9GIHJlYWNoZWQnKQogICAgICByZXR1cm4gMAogICAg dHVwbGUgPSBzdHJ1Y3QudW5wYWNrKGZvcm1hdCwgcmVhZCkKICAgIHJldHVybiB0dXBsZVswXQoK ICBkZWYgc2VlayhzZWxmLCBmaWxlLCBieXRlcyk6CiAgICAiU2VlayBmb3J3YXJkLCBqdXN0IGJ5 IHJlYWRpbmcgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyIKICAgIGZpbGUucmVhZChieXRlcykK CmNsYXNzIEltYWdlT3V0cHV0KG9iamVjdCk6CiAgIlJldHVybnMgYW4gaW1hZ2UgaW4gdGhlIG91 dHB1dCIKCiAgZmlndXJlID0gVHJhbnNsYXRpb25Db25maWcuY29uc3RhbnRzWydmaWd1cmUnXQoK ICBkZWYgZ2V0aHRtbChzZWxmLCBjb250YWluZXIpOgogICAgIkdldCB0aGUgSFRNTCBvdXRwdXQg b2YgdGhlIGltYWdlIGFzIGEgbGlzdCIKICAgIGh0bWwgPSBbJzxpbWcgY2xhc3M9IicgKyBjb250 YWluZXIudHlwZSArICciJ10KICAgIGlmIGNvbnRhaW5lci5vcmlnaW4uZXhpc3RzKCk6CiAgICAg IGh0bWwuYXBwZW5kKCcgc3JjPSInICsgY29udGFpbmVyLmRlc3RpbmF0aW9uLnVybCArCiAgICAg ICAgICAnIiBhbHQ9IicgKyBJbWFnZU91dHB1dC5maWd1cmUgKyAnICcgKyBjb250YWluZXIuZGVz dGluYXRpb24udXJsICsgJyInKQogICAgICBodG1sLmFwcGVuZCgnIHN0eWxlPSInKQogICAgICBp ZiBjb250YWluZXIud2lkdGg6CiAgICAgICAgaHRtbC5hcHBlbmQoJ3dpZHRoOiAnICsgY29udGFp bmVyLndpZHRoICsgJzsgJykKICAgICAgaWYgY29udGFpbmVyLm1heHdpZHRoOgogICAgICAgIGh0 bWwuYXBwZW5kKCdtYXgtd2lkdGg6ICcgKyBjb250YWluZXIubWF4d2lkdGggKyAnOyAnKQogICAg ICBpZiBjb250YWluZXIuaGVpZ2h0OgogICAgICAgIGh0bWwuYXBwZW5kKCdoZWlnaHQ6ICcgKyBj b250YWluZXIuaGVpZ2h0ICsgJzsgJykKICAgICAgaWYgY29udGFpbmVyLm1heGhlaWdodDoKICAg ICAgICBodG1sLmFwcGVuZCgnbWF4LWhlaWdodDogJyArIGNvbnRhaW5lci5tYXhoZWlnaHQgKyAn OyAnKQogICAgICBodG1sLmFwcGVuZCgnIicpCiAgICBlbHNlOgogICAgICBodG1sLmFwcGVuZCgn IHNyYz0iJyArIGNvbnRhaW5lci5vcmlnaW4udXJsICsgJyInKQogICAgaHRtbC5hcHBlbmQoJy8+ XG4nKQogICAgcmV0dXJuIGh0bWwKCgoKCgoKY2xhc3MgRmxvYXQoQ29udGFpbmVyKToKICAiQSBm bG9hdGluZyBpbnNldCIKCiAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgc2VsZi5wYXJzZXIgPSBJ bnNldFBhcnNlcigpCiAgICBzZWxmLm91dHB1dCA9IFRhZ2dlZE91dHB1dCgpLnNldHRhZygnZGl2 IGNsYXNzPSJmbG9hdCInLCBUcnVlKQogICAgc2VsZi5wYXJlbnRmbG9hdCA9IE5vbmUKICAgIHNl bGYuY2hpbGRyZW4gPSBbXQogICAgc2VsZi5udW1iZXIgPSBOb25lCgogIGRlZiBwcm9jZXNzKHNl bGYpOgogICAgIkdldCB0aGUgZmxvYXQgdHlwZS4iCiAgICBzZWxmLnR5cGUgPSBzZWxmLmhlYWRl clsyXQogICAgc2VsZi5wcm9jZXNzZmxvYXRzKCkKICAgIHNlbGYucHJvY2Vzc3RhZ3MoKQoKICBk ZWYgcHJvY2Vzc3RhZ3Moc2VsZik6CiAgICAiUHJvY2VzcyB0aGUgSFRNTCB0YWdzLiIKICAgIGVt YmVkZGVkdGFnID0gc2VsZi5nZXRlbWJlZGRlZHRhZygpCiAgICB3aWRlbmluZ3RhZyA9IHNlbGYu Z2V0d2lkZW5pbmd0YWcoKQogICAgc2VsZi5lbWJlZChlbWJlZGRlZHRhZyArIHdpZGVuaW5ndGFn KQoKICBkZWYgcHJvY2Vzc2Zsb2F0cyhzZWxmKToKICAgICJQcm9jZXNzIGFsbCBmbG9hdHMgY29u dGFpbmVkIGluc2lkZS4iCiAgICBmbG9hdHMgPSBzZWxmLnNlYXJjaGFsbChGbG9hdCkKICAgIGZv ciBmbG9hdCBpbiBmbG9hdHM6CiAgICAgIGZsb2F0Lm91dHB1dC50YWcgPSBmbG9hdC5vdXRwdXQu dGFnLnJlcGxhY2UoJ2RpdicsICdzcGFuJykKICAgICAgZmxvYXQucGFyZW50ZmxvYXQgPSBzZWxm CiAgICAgIHNlbGYuY2hpbGRyZW4uYXBwZW5kKGZsb2F0KQoKICBkZWYgZ2V0ZW1iZWRkZWR0YWco c2VsZik6CiAgICAiR2V0IHRoZSB0YWcgZm9yIHRoZSBlbWJlZGRlZCBvYmplY3QuIgogICAgZmxv YXRzID0gc2VsZi5zZWFyY2hhbGwoRmxvYXQpCiAgICBpZiBsZW4oZmxvYXRzKSA+IDA6CiAgICAg IHJldHVybiAnZGl2IGNsYXNzPSJtdWx0aScgKyBzZWxmLnR5cGUgKyAnIicKICAgIHJldHVybiAn ZGl2IGNsYXNzPSInICsgc2VsZi50eXBlICsgJyInCgogIGRlZiBnZXR3aWRlbmluZ3RhZyhzZWxm KToKICAgICJHZXQgdGhlIHRhZyB0byBzZXQgZmxvYXQgd2lkdGgsIGlmIHByZXNlbnQuIgogICAg aW1hZ2VzID0gc2VsZi5zZWFyY2hhbGwoSW1hZ2UpCiAgICBpZiBsZW4oaW1hZ2VzKSAhPSAxOgog ICAgICByZXR1cm4gJycKICAgIGltYWdlID0gaW1hZ2VzWzBdCiAgICBpZiBub3QgaW1hZ2Uud2lk dGg6CiAgICAgIHJldHVybiAnJwogICAgaWYgbm90ICclJyBpbiBpbWFnZS53aWR0aDoKICAgICAg cmV0dXJuICcnCiAgICBpbWFnZS50eXBlID0gJ2ZpZ3VyZScKICAgIHdpZHRoID0gaW1hZ2Uud2lk dGgKICAgIGltYWdlLndpZHRoID0gTm9uZQogICAgcmV0dXJuICcgc3R5bGU9Im1heC13aWR0aDog JyArIHdpZHRoICsgJzsiJwoKICBkZWYgZW1iZWQoc2VsZiwgdGFnKToKICAgICJFbWJlZCB0aGUg d2hvbGUgY29udGVudHMgaW4gYSBkaXYiCiAgICB0YWdnZWQgPSBUYWdnZWRUZXh0KCkuY29tcGxl dGUoc2VsZi5jb250ZW50cywgdGFnLCBUcnVlKQogICAgc2VsZi5jb250ZW50cyA9IFt0YWdnZWRd CgogIGRlZiBzZWFyY2hpbnNpZGUoc2VsZiwgY29udGVudHMsIHR5cGUpOgogICAgIlNlYXJjaCBm b3IgYSBnaXZlbiB0eXBlIGluIHRoZSBjb250ZW50cyIKICAgIGxpc3QgPSBbXQogICAgZm9yIGVs ZW1lbnQgaW4gY29udGVudHM6CiAgICAgIGxpc3QgKz0gc2VsZi5zZWFyY2hpbmVsZW1lbnQoZWxl bWVudCwgdHlwZSkKICAgIHJldHVybiBsaXN0CgogIGRlZiBzZWFyY2hpbmVsZW1lbnQoc2VsZiwg ZWxlbWVudCwgdHlwZSk6CiAgICAiU2VhcmNoIGZvciBhIGdpdmVuIHR5cGUgb3V0c2lkZSBmbG9h dHMiCiAgICBpZiBpc2luc3RhbmNlKGVsZW1lbnQsIEZsb2F0KToKICAgICAgcmV0dXJuIFtdCiAg ICBpZiBpc2luc3RhbmNlKGVsZW1lbnQsIHR5cGUpOgogICAgICByZXR1cm4gW2VsZW1lbnRdCiAg ICByZXR1cm4gc2VsZi5zZWFyY2hpbnNpZGUoZWxlbWVudC5jb250ZW50cywgdHlwZSkKCiAgZGVm IF9fdW5pY29kZV9fKHNlbGYpOgogICAgIlJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlv biIKICAgIHJldHVybiAnRmxvYXRpbmcgaW5zZXQgb2YgdHlwZSAnICsgc2VsZi50eXBlCgpjbGFz cyBXcmFwKEZsb2F0KToKICAiQSB3cmFwcGVkIChmbG9hdGluZykgZmxvYXQiCgogIGRlZiBwcm9j ZXNzdGFncyhzZWxmKToKICAgICJBZGQgdGhlIHdpZGVuaW5nIHRhZyB0byB0aGUgcGFyZW50IHRh Zy4iCiAgICBlbWJlZGRlZHRhZyA9IHNlbGYuZ2V0ZW1iZWRkZWR0YWcoKQogICAgc2VsZi5lbWJl ZChlbWJlZGRlZHRhZykKICAgIHBsYWNlbWVudCA9IHNlbGYucGFyYW1ldGVyc1sncGxhY2VtZW50 J10KICAgIHdpZGVuaW5ndGFnID0gc2VsZi5nZXR3aWRlbmluZ3RhZygpCiAgICBzZWxmLm91dHB1 dC50YWcgPSAnZGl2IGNsYXNzPSJ3cmFwLScgKyBwbGFjZW1lbnQgKyAnIicgKyB3aWRlbmluZ3Rh ZwoKY2xhc3MgQ2FwdGlvbihDb250YWluZXIpOgogICJBIGNhcHRpb24gZm9yIGEgZmlndXJlIG9y IGEgdGFibGUiCgogIGRlZiBfX2luaXRfXyhzZWxmKToKICAgIHNlbGYucGFyc2VyID0gSW5zZXRQ YXJzZXIoKQogICAgc2VsZi5vdXRwdXQgPSBUYWdnZWRPdXRwdXQoKS5zZXR0YWcoJ2RpdiBjbGFz cz0iY2FwdGlvbiInLCBUcnVlKQoKY2xhc3MgTGlzdGluZyhGbG9hdCk6CiAgIkEgY29kZSBsaXN0 aW5nIgoKICBkZWYgX19pbml0X18oc2VsZik6CiAgICBGbG9hdC5fX2luaXRfXyhzZWxmKQogICAg c2VsZi5udW1iZXJlZCA9IE5vbmUKICAgIHNlbGYuY291bnRlciA9IDAKCiAgZGVmIHByb2Nlc3Mo c2VsZik6CiAgICAiUmVtb3ZlIGFsbCBsYXlvdXRzIgogICAgc2VsZi5wYXJzZWxzdHBhcmFtcygp CiAgICBzZWxmLnR5cGUgPSAnbGlzdGluZycKICAgIGNhcHRpb25zID0gc2VsZi5zZWFyY2hyZW1v dmUoQ2FwdGlvbikKICAgIG5ld2NvbnRlbnRzID0gW10KICAgIGZvciBjb250YWluZXIgaW4gc2Vs Zi5jb250ZW50czoKICAgICAgbmV3Y29udGVudHMgKz0gc2VsZi5leHRyYWN0KGNvbnRhaW5lcikK ICAgIHRhZ2dlZCA9IFRhZ2dlZFRleHQoKS5jb21wbGV0ZShuZXdjb250ZW50cywgJ2NvZGUgY2xh c3M9Imxpc3RpbmciJywgRmFsc2UpCiAgICBzZWxmLmNvbnRlbnRzID0gW1RhZ2dlZFRleHQoKS5j b21wbGV0ZShjYXB0aW9ucyArIFt0YWdnZWRdLAogICAgICAnZGl2IGNsYXNzPSJsaXN0aW5nIics IFRydWUpXQoKICBkZWYgcHJvY2Vzc3BhcmFtcyhzZWxmKToKICAgICJQcm9jZXNzIGxpc3Rpbmcg cGFyYW1ldGVyZXMuIgogICAgc2VsZi5wYXJzZWxzdHBhcmFtcygpCiAgICBpZiBub3QgJ251bWJl cnMnIGluIHNlbGYucGFyYW1ldGVyczoKICAgICAgcmV0dXJuCiAgICBzZWxmLm51bWJlcmVkID0g c2VsZi5wYXJhbWV0ZXJzWydudW1iZXJzJ10KCiAgZGVmIGV4dHJhY3Qoc2VsZiwgY29udGFpbmVy KToKICAgICJFeHRyYWN0IHRoZSBjb250YWluZXIncyBjb250ZW50cyBhbmQgcmV0dXJuIHRoZW0i CiAgICBpZiBpc2luc3RhbmNlKGNvbnRhaW5lciwgU3RyaW5nQ29udGFpbmVyKToKICAgICAgcmV0 dXJuIHNlbGYubW9kaWZ5c3RyaW5nKGNvbnRhaW5lcikKICAgIGlmIGlzaW5zdGFuY2UoY29udGFp bmVyLCBTdGFuZGFyZExheW91dCk6CiAgICAgIHJldHVybiBzZWxmLm1vZGlmeWxheW91dChjb250 YWluZXIpCiAgICBpZiBpc2luc3RhbmNlKGNvbnRhaW5lciwgUGxhaW5MYXlvdXQpOgogICAgICBy ZXR1cm4gc2VsZi5tb2RpZnlsYXlvdXQoY29udGFpbmVyKQogICAgVHJhY2UuZXJyb3IoJ1VuZXhw ZWN0ZWQgY29udGFpbmVyICcgKyBjb250YWluZXIuX19jbGFzc19fLl9fbmFtZV9fICsKICAgICAg ICAnIGluIGxpc3RpbmcnKQogICAgY29udGFpbmVyLnRyZWUoKQogICAgcmV0dXJuIFtdCgogIGRl ZiBtb2RpZnlzdHJpbmcoc2VsZiwgc3RyaW5nKToKICAgICJNb2RpZnkgYSBsaXN0aW5nIHN0cmlu ZyIKICAgIGlmIHN0cmluZy5zdHJpbmcgPT0gJyc6CiAgICAgIHN0cmluZy5zdHJpbmcgPSB1J+KA iycKICAgIHJldHVybiBzZWxmLm1vZGlmeWNvbnRhaW5lcihzdHJpbmcpCgogIGRlZiBtb2RpZnls YXlvdXQoc2VsZiwgbGF5b3V0KToKICAgICJNb2RpZnkgYSBzdGFuZGFyZCBsYXlvdXQiCiAgICBp ZiBsZW4obGF5b3V0LmNvbnRlbnRzKSA9PSAwOgogICAgICBsYXlvdXQuY29udGVudHMgPSBbQ29u c3RhbnQodSfigIsnKV0KICAgIHJldHVybiBzZWxmLm1vZGlmeWNvbnRhaW5lcihsYXlvdXQpCgog IGRlZiBtb2RpZnljb250YWluZXIoc2VsZiwgY29udGFpbmVyKToKICAgICJNb2RpZnkgYSBsaXN0 aW5nIGNvbnRhaW5lciIKICAgIGNvbnRlbnRzID0gW2NvbnRhaW5lciwgQ29uc3RhbnQoJ1xuJyld CiAgICBpZiBzZWxmLm51bWJlcmVkOgogICAgICBzZWxmLmNvdW50ZXIgKz0gMQogICAgICB0YWcg PSAnc3BhbiBjbGFzcz0ibnVtYmVyLScgKyBzZWxmLm51bWJlcmVkICsgJyInCiAgICAgIGNvbnRl bnRzLmluc2VydCgwLCBUYWdnZWRUZXh0KCkuY29uc3RhbnQodW5pY29kZShzZWxmLmNvdW50ZXIp LCB0YWcpKQogICAgcmV0dXJuIGNvbnRlbnRzCgpjbGFzcyBQb3N0RmxvYXQob2JqZWN0KToKICAi UG9zdHByb2Nlc3MgYSBmbG9hdDogbnVtYmVyIGl0IGFuZCBtb3ZlIHRoZSBsYWJlbCIKCiAgcHJv Y2Vzc2VkY2xhc3MgPSBGbG9hdAoKICBkZWYgcG9zdHByb2Nlc3Moc2VsZiwgbGFzdCwgZmxvYXQs IG5leHQpOgogICAgIk1vdmUgdGhlIGxhYmVsIHRvIHRoZSB0b3AgYW5kIG51bWJlciB0aGUgY2Fw dGlvbiIKICAgIGNhcHRpb25zID0gZmxvYXQuc2VhcmNoaW5zaWRlKGZsb2F0LmNvbnRlbnRzLCBD YXB0aW9uKQogICAgZm9yIGNhcHRpb24gaW4gY2FwdGlvbnM6CiAgICAgIHNlbGYucG9zdGxhYmVs cyhmbG9hdCwgY2FwdGlvbikKICAgICAgc2VsZi5wb3N0bnVtYmVyKGNhcHRpb24sIGZsb2F0KQog ICAgcmV0dXJuIGZsb2F0CgogIGRlZiBwb3N0bGFiZWxzKHNlbGYsIGZsb2F0LCBjYXB0aW9uKToK ICAgICJTZWFyY2ggZm9yIGxhYmVscyBhbmQgbW92ZSB0aGVtIHRvIHRoZSB0b3AiCiAgICBsYWJl bHMgPSBjYXB0aW9uLnNlYXJjaHJlbW92ZShMYWJlbCkKICAgIGlmIGxlbihsYWJlbHMpID09IDA6 CiAgICAgIHJldHVybgogICAgZmxvYXQuY29udGVudHMgPSBsYWJlbHMgKyBmbG9hdC5jb250ZW50 cwoKICBkZWYgcG9zdG51bWJlcihzZWxmLCBjYXB0aW9uLCBmbG9hdCk6CiAgICAiTnVtYmVyIHRo ZSBjYXB0aW9uIgogICAgc2VsZi5udW1iZXJmbG9hdChmbG9hdCkKICAgIGNhcHRpb24uY29udGVu dHMuaW5zZXJ0KDAsIENvbnN0YW50KGZsb2F0LmVudHJ5ICsgdSfigIMnKSkKCiAgZGVmIG51bWJl cmZsb2F0KHNlbGYsIGZsb2F0KToKICAgICJOdW1iZXIgYSBmbG9hdCBpZiBpdCBpc24ndCBudW1i ZXJlZCIKICAgIGlmIGZsb2F0Lm51bWJlcjoKICAgICAgcmV0dXJuCiAgICBpZiBmbG9hdC5wYXJl bnRmbG9hdDoKICAgICAgc2VsZi5udW1iZXJmbG9hdChmbG9hdC5wYXJlbnRmbG9hdCkKICAgICAg aW5kZXggPSBmbG9hdC5wYXJlbnRmbG9hdC5jaGlsZHJlbi5pbmRleChmbG9hdCkKICAgICAgZmxv YXQubnVtYmVyID0gTnVtYmVyR2VuZXJhdG9yLmxldHRlcnNbaW5kZXggKyAxXS5sb3dlcigpCiAg ICAgIGZsb2F0LmVudHJ5ID0gJygnICsgZmxvYXQubnVtYmVyICsgJyknCiAgICBlbHNlOgogICAg ICBmbG9hdC5udW1iZXIgPSBOdW1iZXJHZW5lcmF0b3IuaW5zdGFuY2UuZ2VuZXJhdGVjaGFwdGVy ZWQoZmxvYXQudHlwZSkKICAgICAgZmxvYXQuZW50cnkgPSBUcmFuc2xhdGlvbkNvbmZpZy5mbG9h dHNbZmxvYXQudHlwZV0gKyBmbG9hdC5udW1iZXIKCmNsYXNzIFBvc3RXcmFwKFBvc3RGbG9hdCk6 CiAgIkZvciBhIHdyYXA6IGV4YWN0bHkgbGlrZSBhIGZsb2F0IgoKICBwcm9jZXNzZWRjbGFzcyA9 IFdyYXAKCmNsYXNzIFBvc3RMaXN0aW5nKFBvc3RGbG9hdCk6CiAgIkZvciBhIGxpc3Rpbmc6IGV4 YWN0bHkgbGlrZSBhIGZsb2F0IgoKICBwcm9jZXNzZWRjbGFzcyA9IExpc3RpbmcKClBvc3Rwcm9j ZXNzb3Iuc3RhZ2VzICs9IFtQb3N0RmxvYXQsIFBvc3RXcmFwLCBQb3N0TGlzdGluZ10KCgoKCmlt cG9ydCBzeXMKCgpjbGFzcyBGb3JtdWxhRXF1YXRpb24oQ29tbWFuZEJpdCk6CiAgIkEgc2ltcGxl IG51bWJlcmVkIGVxdWF0aW9uLiIKCiAgcGllY2UgPSAnZXF1YXRpb24nCgogIGRlZiBwYXJzZWJp dChzZWxmLCBwb3MpOgogICAgIlBhcnNlIHRoZSBhcnJheSIKICAgIHNlbGYub3V0cHV0ID0gQ29u dGVudHNPdXRwdXQoKQogICAgaW5uZXIgPSBXaG9sZUZvcm11bGEoKQogICAgaW5uZXIucGFyc2Vi aXQocG9zKQogICAgc2VsZi5hZGQoaW5uZXIpCgpjbGFzcyBGb3JtdWxhQ2VsbChGb3JtdWxhQ29t bWFuZCk6CiAgIkFuIGFycmF5IGNlbGwgaW5zaWRlIGEgcm93IgoKICBkZWYgX19pbml0X18oc2Vs ZiwgYWxpZ25tZW50KToKICAgIEZvcm11bGFDb21tYW5kLl9faW5pdF9fKHNlbGYpCiAgICBzZWxm LmFsaWdubWVudCA9IGFsaWdubWVudAogICAgc2VsZi5vdXRwdXQgPSBUYWdnZWRPdXRwdXQoKS5z ZXR0YWcoJ3RkIGNsYXNzPSJmb3JtdWxhLScgKyBhbGlnbm1lbnQgKyciJywgVHJ1ZSkKCiAgZGVm IHBhcnNlYml0KHNlbGYsIHBvcyk6CiAgICBmb3JtdWxhID0gV2hvbGVGb3JtdWxhKCkKICAgIGlm IG5vdCBmb3JtdWxhLmRldGVjdChwb3MpOgogICAgICBUcmFjZS5lcnJvcignVW5leHBlY3RlZCBl bmQgb2YgYXJyYXkgY2VsbCBhdCAnICsgcG9zLnJlbWFpbmluZygpKQogICAgICBwb3Muc2tpcChw b3MuY3VycmVudCgpKQogICAgICByZXR1cm4KICAgIGZvcm11bGEucGFyc2ViaXQocG9zKQogICAg c2VsZi5hZGQoZm9ybXVsYSkKCmNsYXNzIEZvcm11bGFSb3coRm9ybXVsYUNvbW1hbmQpOgogICJB biBhcnJheSByb3cgaW5zaWRlIGFuIGFycmF5IgoKICBjZWxsc2VwYXJhdG9yID0gRm9ybXVsYUNv bmZpZy5hcnJheVsnY2VsbHNlcGFyYXRvciddCgogIGRlZiBfX2luaXRfXyhzZWxmLCBhbGlnbm1l bnRzKToKICAgIEZvcm11bGFDb21tYW5kLl9faW5pdF9fKHNlbGYpCiAgICBzZWxmLmFsaWdubWVu dHMgPSBhbGlnbm1lbnRzCiAgICBzZWxmLm91dHB1dCA9IFRhZ2dlZE91dHB1dCgpLnNldHRhZygn dHInLCBUcnVlKQoKICBkZWYgcGFyc2ViaXQoc2VsZiwgcG9zKToKICAgICJQYXJzZSBhIHdob2xl IHJvdyIKICAgIGluZGV4ID0gMAogICAgcG9zLnB1c2hlbmRpbmcoRm9ybXVsYVJvdy5jZWxsc2Vw YXJhdG9yLCBvcHRpb25hbD1UcnVlKQogICAgd2hpbGUgbm90IHBvcy5maW5pc2hlZCgpOgogICAg ICBhbGlnbm1lbnQgPSBzZWxmLmFsaWdubWVudHNbaW5kZXggJSBsZW4oc2VsZi5hbGlnbm1lbnRz KV0KICAgICAgY2VsbCA9IEZvcm11bGFDZWxsKGFsaWdubWVudCkKICAgICAgY2VsbC5wYXJzZWJp dChwb3MpCiAgICAgIHNlbGYuYWRkKGNlbGwpCiAgICAgIGluZGV4ICs9IDEKICAgICAgcG9zLmNo ZWNrc2tpcChGb3JtdWxhUm93LmNlbGxzZXBhcmF0b3IpCiAgICByZXR1cm4KICAgIGZvciBjZWxs IGluIHNlbGYuaXRlcmF0ZWNlbGxzKHBvcyk6CiAgICAgIGNlbGwucGFyc2ViaXQocG9zKQogICAg ICBzZWxmLmFkZChjZWxsKQoKICBkZWYgaXRlcmF0ZWNlbGxzKHNlbGYsIHBvcyk6CiAgICAiSXRl cmF0ZSBvdmVyIGFsbCBjZWxscywgZmluaXNoIHdoZW4gY291bnQgZW5kcyIKICAgIGZvciBpbmRl eCwgYWxpZ25tZW50IGluIGVudW1lcmF0ZShzZWxmLmFsaWdubWVudHMpOgogICAgICBpZiBzZWxm LmFueWJ1dGxhc3QoaW5kZXgpOgogICAgICAgIHBvcy5wdXNoZW5kaW5nKGNlbGxzZXBhcmF0b3Ip CiAgICAgIHlpZWxkIEZvcm11bGFDZWxsKGFsaWdubWVudCkKICAgICAgaWYgc2VsZi5hbnlidXRs YXN0KGluZGV4KToKICAgICAgICBpZiBub3QgcG9zLmNoZWNrZm9yKGNlbGxzZXBhcmF0b3IpOgog ICAgICAgICAgVHJhY2UuZXJyb3IoJ05vIGNlbGwgc2VwYXJhdG9yICcgKyBjZWxsc2VwYXJhdG9y KQogICAgICAgIGVsc2U6CiAgICAgICAgICBzZWxmLm9yaWdpbmFsICs9IHBvcy5wb3BlbmRpbmco Y2VsbHNlcGFyYXRvcikKCiAgZGVmIGFueWJ1dGxhc3Qoc2VsZiwgaW5kZXgpOgogICAgIlJldHVy biB0cnVlIGZvciBhbGwgY2VsbHMgYnV0IHRoZSBsYXN0IgogICAgcmV0dXJuIGluZGV4IDwgbGVu KHNlbGYuYWxpZ25tZW50cykgLSAxCgpjbGFzcyBFbnZpcm9ubWVudChDb21tYW5kQml0KToKICAi QSBcXGJlZ2lue30uLi5cXGVuZCBlbnZpcm9ubWVudCB3aXRoIHJvd3MgYW5kIGNlbGxzLiIKCiAg ZGVmIHBhcnNlYml0KHNlbGYsIHBvcyk6CiAgICAiUGFyc2UgdGhlIHdob2xlIGVudmlyb25tZW50 LiIKICAgIHNlbGYub3V0cHV0ID0gVGFnZ2VkT3V0cHV0KCkuc2V0dGFnKCd0YWJsZSBjbGFzcz0i JyArIHNlbGYucGllY2UgKwogICAgICAgICciJywgVHJ1ZSkKICAgIHNlbGYuYWxpZ25tZW50cyA9 IFsnbCddCiAgICBzZWxmLnBhcnNlcm93cyhwb3MpCgogIGRlZiBwYXJzZXJvd3Moc2VsZiwgcG9z KToKICAgICJQYXJzZSBhbGwgcm93cywgZmluaXNoIHdoZW4gbm8gbW9yZSByb3cgZW5kcyIKICAg IGZvciByb3cgaW4gc2VsZi5pdGVyYXRlcm93cyhwb3MpOgogICAgICByb3cucGFyc2ViaXQocG9z KQogICAgICBzZWxmLmFkZChyb3cpCgogIGRlZiBpdGVyYXRlcm93cyhzZWxmLCBwb3MpOgogICAg Ikl0ZXJhdGUgb3ZlciBhbGwgcm93cywgZW5kIHdoZW4gbm8gbW9yZSByb3cgZW5kcyIKICAgIHJv d3NlcGFyYXRvciA9IEZvcm11bGFDb25maWcuYXJyYXlbJ3Jvd3NlcGFyYXRvciddCiAgICB3aGls ZSBUcnVlOgogICAgICBwb3MucHVzaGVuZGluZyhyb3dzZXBhcmF0b3IsIFRydWUpCiAgICAgIHlp ZWxkIEZvcm11bGFSb3coc2VsZi5hbGlnbm1lbnRzKQogICAgICBpZiBwb3MuY2hlY2tmb3Iocm93 c2VwYXJhdG9yKToKICAgICAgICBzZWxmLm9yaWdpbmFsICs9IHBvcy5wb3BlbmRpbmcocm93c2Vw YXJhdG9yKQogICAgICBlbHNlOgogICAgICAgIHJldHVybgoKY2xhc3MgRm9ybXVsYUFycmF5KEVu dmlyb25tZW50KToKICAiQW4gYXJyYXkgd2l0aGluIGEgZm9ybXVsYSIKCiAgcGllY2UgPSAnYXJy YXknCgogIGRlZiBwYXJzZWJpdChzZWxmLCBwb3MpOgogICAgIlBhcnNlIHRoZSBhcnJheSIKICAg IHNlbGYub3V0cHV0ID0gVGFnZ2VkT3V0cHV0KCkuc2V0dGFnKCd0YWJsZSBjbGFzcz0iZm9ybXVs YSInLCBUcnVlKQogICAgc2VsZi5wYXJzZWFsaWdubWVudHMocG9zKQogICAgc2VsZi5wYXJzZXJv d3MocG9zKQoKICBkZWYgcGFyc2VhbGlnbm1lbnRzKHNlbGYsIHBvcyk6CiAgICAiUGFyc2UgdGhl IGRpZmZlcmVudCBhbGlnbm1lbnRzIgogICAgIyB2ZXJ0aWNhbAogICAgc2VsZi52YWxpZ24gPSAn YycKICAgIHZicmFja2V0ID0gU3F1YXJlQnJhY2tldCgpCiAgICBpZiB2YnJhY2tldC5kZXRlY3Qo cG9zKToKICAgICAgdmJyYWNrZXQucGFyc2VsaXRlcmFsKHBvcykKICAgICAgc2VsZi52YWxpZ24g PSB2YnJhY2tldC5saXRlcmFsCiAgICAgIHNlbGYuYWRkKHZicmFja2V0KQogICAgIyBob3Jpem9u dGFsCiAgICBicmFja2V0ID0gQnJhY2tldCgpLnBhcnNlbGl0ZXJhbChwb3MpCiAgICBzZWxmLmFk ZChicmFja2V0KQogICAgc2VsZi5hbGlnbm1lbnRzID0gW10KICAgIGZvciBsIGluIGJyYWNrZXQu bGl0ZXJhbDoKICAgICAgc2VsZi5hbGlnbm1lbnRzLmFwcGVuZChsKQoKY2xhc3MgRm9ybXVsYUNh c2VzKEVudmlyb25tZW50KToKICAiQSBjYXNlcyBzdGF0ZW1lbnQiCgogIHBpZWNlID0gJ2Nhc2Vz JwoKICBkZWYgcGFyc2ViaXQoc2VsZiwgcG9zKToKICAgICJQYXJzZSB0aGUgY2FzZXMiCiAgICBz ZWxmLm91dHB1dCA9IFRhZ2dlZE91dHB1dCgpLnNldHRhZygndGFibGUgY2xhc3M9ImNhc2VzIics IFRydWUpCiAgICBzZWxmLmFsaWdubWVudHMgPSBbJ2wnLCAnbCddCiAgICBzZWxmLnBhcnNlcm93 cyhwb3MpCgpjbGFzcyBGb3JtdWxhQWxpZ24oRW52aXJvbm1lbnQpOgogICJBIG51bWJlciBvZiBh bGlnbmVkIGZvcm11bGFlIgoKICBwaWVjZSA9ICdhbGlnbicKCiAgZGVmIHBhcnNlYml0KHNlbGYs IHBvcyk6CiAgICAiUGFyc2UgdGhlIGFsaWduZWQgYml0cyIKICAgIHNlbGYub3V0cHV0ID0gVGFn Z2VkT3V0cHV0KCkuc2V0dGFnKCd0YWJsZSBjbGFzcz0iYWxpZ24iJywgVHJ1ZSkKICAgIHNlbGYu YWxpZ25tZW50cyA9IFsnciddCiAgICBzZWxmLnBhcnNlcm93cyhwb3MpCgpjbGFzcyBCZWdpbkNv bW1hbmQoQ29tbWFuZEJpdCk6CiAgIkEgXFxiZWdpbnt9Li4uXGVuZCBjb21tYW5kIGFuZCB3aGF0 IGl0IGVudGFpbHMgKGFycmF5LCBjYXNlcywgYWxpZ25lZCkiCgogIGNvbW1hbmRtYXAgPSB7Rm9y bXVsYUNvbmZpZy5hcnJheVsnYmVnaW4nXTonJ30KCiAgaW5uZXJiaXRzID0gW0Zvcm11bGFFcXVh dGlvbigpLCBGb3JtdWxhQXJyYXkoKSwgRm9ybXVsYUNhc2VzKCksIEZvcm11bGFBbGlnbigpXQoK ICBkZWYgcGFyc2ViaXQoc2VsZiwgcG9zKToKICAgICJQYXJzZSB0aGUgYmVnaW4gY29tbWFuZCIK ICAgIGJyYWNrZXQgPSBCcmFja2V0KCkucGFyc2VsaXRlcmFsKHBvcykKICAgIHNlbGYub3JpZ2lu YWwgKz0gYnJhY2tldC5saXRlcmFsCiAgICBiaXQgPSBzZWxmLmZpbmRiaXQoYnJhY2tldC5saXRl cmFsKQogICAgZW5kaW5nID0gRm9ybXVsYUNvbmZpZy5hcnJheVsnZW5kJ10gKyAneycgKyBicmFj a2V0LmxpdGVyYWwgKyAnfScKICAgIHBvcy5wdXNoZW5kaW5nKGVuZGluZykKICAgIGJpdC5wYXJz ZWJpdChwb3MpCiAgICBzZWxmLmFkZChiaXQpCiAgICBzZWxmLm9yaWdpbmFsICs9IHBvcy5wb3Bl bmRpbmcoZW5kaW5nKQoKICBkZWYgZmluZGJpdChzZWxmLCBwaWVjZSk6CiAgICAiRmluZCB0aGUg Y29tbWFuZCBiaXQgY29ycmVzcG9uZGluZyB0byB0aGUgXFxiZWdpbntwaWVjZX0iCiAgICBmb3Ig Yml0IGluIEJlZ2luQ29tbWFuZC5pbm5lcmJpdHM6CiAgICAgIGlmIGJpdC5waWVjZSA9PSBwaWVj ZSBvciBiaXQucGllY2UgKyAnKicgPT0gcGllY2U6CiAgICAgICAgbmV3Yml0ID0gQ2xvbmVyLmNs b25lKGJpdCkKICAgICAgICByZXR1cm4gbmV3Yml0CiAgICBiaXQgPSBFbnZpcm9ubWVudCgpCiAg ICBiaXQucGllY2UgPSBwaWVjZQogICAgcmV0dXJuIGJpdAoKRm9ybXVsYUNvbW1hbmQuY29tbWFu ZGJpdHMgKz0gW0JlZ2luQ29tbWFuZCgpXQoKCgoKCgoKaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1w b3J0IGNvZGVjcwoKCmNsYXNzIEJ1bGtGaWxlKG9iamVjdCk6CiAgIkEgZmlsZSB0byB0cmVhdCBp biBidWxrIgoKICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUpOgogICAgc2VsZi5maWxlbmFt ZSA9IGZpbGVuYW1lCiAgICBzZWxmLnRlbXAgPSBzZWxmLmZpbGVuYW1lICsgJy50ZW1wJwoKICBk ZWYgcmVhZGFsbChzZWxmKToKICAgICJSZWFkIHRoZSB3aG9sZSBmaWxlIgogICAgZm9yIGVuY29k aW5nIGluIEZpbGVDb25maWcucGFyc2luZ1snZW5jb2RpbmdzJ106CiAgICAgIHRyeToKICAgICAg ICByZXR1cm4gc2VsZi5yZWFkY29kZWMoZW5jb2RpbmcpCiAgICAgIGV4Y2VwdCBVbmljb2RlRGVj b2RlRXJyb3I6CiAgICAgICAgcGFzcwogICAgVHJhY2UuZXJyb3IoJ05vIHN1aXRhYmxlIGVuY29k aW5nIGZvciAnICsgc2VsZi5maWxlbmFtZSkKICAgIHJldHVybiBbXQoKICBkZWYgcmVhZGNvZGVj KHNlbGYsIGVuY29kaW5nKToKICAgICJSZWFkIHRoZSB3aG9sZSBmaWxlIHdpdGggdGhlIGdpdmVu IGVuY29kaW5nIgogICAgZmlsZWluID0gY29kZWNzLm9wZW4oc2VsZi5maWxlbmFtZSwgJ3InLCBl bmNvZGluZykKICAgIGxpbmVzID0gZmlsZWluLnJlYWRsaW5lcygpCiAgICBmaWxlaW4uY2xvc2Uo KQogICAgcmV0dXJuIGxpbmVzCgogIGRlZiBnZXRmaWxlcyhzZWxmKToKICAgICJHZXQgcmVhZGVy IGFuZCB3cml0ZXIgZm9yIGEgZmlsZSBuYW1lIgogICAgcmVhZGVyID0gTGluZVJlYWRlcihzZWxm LmZpbGVuYW1lKQogICAgd3JpdGVyID0gTGluZVdyaXRlcihzZWxmLnRlbXApCiAgICByZXR1cm4g cmVhZGVyLCB3cml0ZXIKCiAgZGVmIHN3YXB0ZW1wKHNlbGYpOgogICAgIlN3YXAgdGhlIHRlbXAg ZmlsZSBmb3IgdGhlIG9yaWdpbmFsIgogICAgb3MuY2htb2Qoc2VsZi50ZW1wLCBvcy5zdGF0KHNl bGYuZmlsZW5hbWUpLnN0X21vZGUpCiAgICBvcy5yZW5hbWUoc2VsZi50ZW1wLCBzZWxmLmZpbGVu YW1lKQoKICBkZWYgX191bmljb2RlX18oc2VsZik6CiAgICAiR2V0IHRoZSB1bmljb2RlIHJlcHJl c2VudGF0aW9uIgogICAgcmV0dXJuICdmaWxlICcgKyBzZWxmLmZpbGVuYW1lCgoKCmNsYXNzIEJp YlRlWChDb250YWluZXIpOgogICJTaG93IGEgQmliVGVYIGJpYmxpb2dyYXBoeSBhbmQgYWxsIHJl ZmVyZW5jZWQgZW50cmllcyIKCiAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgc2VsZi5wYXJzZXIg PSBJbnNldFBhcnNlcigpCiAgICBzZWxmLm91dHB1dCA9IENvbnRlbnRzT3V0cHV0KCkKCiAgZGVm IHByb2Nlc3Moc2VsZik6CiAgICAiUmVhZCBhbGwgYmlidGV4IGZpbGVzIGFuZCBwcm9jZXNzIHRo ZW0iCiAgICBzZWxmLmVudHJpZXMgPSBbXQogICAgYmlibGlvZ3JhcGh5ID0gVHJhbnNsYXRpb25D b25maWcuY29uc3RhbnRzWydiaWJsaW9ncmFwaHknXQogICAgdGFnID0gVGFnZ2VkVGV4dCgpLmNv bnN0YW50KGJpYmxpb2dyYXBoeSwgJ2gxIGNsYXNzPSJiaWJsaW8iJykKICAgIHNlbGYuY29udGVu dHMuYXBwZW5kKHRhZykKICAgIGZpbGVzID0gc2VsZi5wYXJhbWV0ZXJzWydiaWJmaWxlcyddLnNw bGl0KCcsJykKICAgIGZvciBmaWxlIGluIGZpbGVzOgogICAgICBiaWJmaWxlID0gQmliRmlsZShm aWxlKQogICAgICBiaWJmaWxlLnBhcnNlKCkKICAgICAgc2VsZi5lbnRyaWVzICs9IGJpYmZpbGUu ZW50cmllcwogICAgICBUcmFjZS5tZXNzYWdlKCdQYXJzZWQgJyArIHVuaWNvZGUoYmliZmlsZSkp CiAgICBzZWxmLmVudHJpZXMuc29ydChrZXkgPSB1bmljb2RlKQogICAgc2VsZi5hcHBseXN0eWxl KCkKCiAgZGVmIGFwcGx5c3R5bGUoc2VsZik6CiAgICAiUmVhZCB0aGUgc3R5bGUgYW5kIGFwcGx5 IGl0IHRvIGFsbCBlbnRyaWVzIgogICAgc3R5bGUgPSBzZWxmLnJlYWRzdHlsZSgpCiAgICBmb3Ig ZW50cnkgaW4gc2VsZi5lbnRyaWVzOgogICAgICBlbnRyeS50ZW1wbGF0ZSA9IHN0eWxlWydkZWZh dWx0J10KICAgICAgaWYgZW50cnkudHlwZSBpbiBzdHlsZToKICAgICAgICBlbnRyeS50ZW1wbGF0 ZSA9IHN0eWxlW2VudHJ5LnR5cGVdCiAgICAgIGVudHJ5LnByb2Nlc3MoKQogICAgICBzZWxmLmNv bnRlbnRzLmFwcGVuZChlbnRyeSkKCiAgZGVmIHJlYWRzdHlsZShzZWxmKToKICAgICJSZWFkIHRo ZSBzdHlsZSBmcm9tIHRoZSBiaWJsaW9ncmFwaHkgb3B0aW9ucyIKICAgIG9wdGlvbnMgPSBzZWxm LnBhcmFtZXRlcnNbJ29wdGlvbnMnXS5zcGxpdCgnLCcpCiAgICBmb3Igb3B0aW9uIGluIG9wdGlv bnM6CiAgICAgIGlmIGhhc2F0dHIoQmliU3R5bGVzQ29uZmlnLCBvcHRpb24pOgogICAgICAgIHJl dHVybiBnZXRhdHRyKEJpYlN0eWxlc0NvbmZpZywgb3B0aW9uKQogICAgcmV0dXJuIEJpYlN0eWxl c0NvbmZpZy5kZWZhdWx0CgpjbGFzcyBCaWJGaWxlKG9iamVjdCk6CiAgIkEgQmliVGVYIGZpbGUi CgogIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSk6CiAgICAiQ3JlYXRlIHRoZSBCaWJUZVgg ZmlsZSIKICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZSArICcuYmliJwogICAgc2VsZi5hZGRl ZCA9IDAKICAgIHNlbGYuaWdub3JlZCA9IDAKICAgIHNlbGYuZW50cmllcyA9IFtdCgogIGRlZiBw YXJzZShzZWxmKToKICAgICJQYXJzZSB0aGUgQmliVGVYIGZpbGUiCiAgICBiaWJwYXRoID0gSW5w dXRQYXRoKHNlbGYuZmlsZW5hbWUpCiAgICBiaWJmaWxlID0gQnVsa0ZpbGUoYmlicGF0aC5wYXRo KQogICAgcGFyc2VkID0gbGlzdCgpCiAgICBmb3IgbGluZSBpbiBiaWJmaWxlLnJlYWRhbGwoKToK ICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICBpZiBub3QgbGluZS5zdGFydHN3aXRoKCcl JykgYW5kIG5vdCBsaW5lID09ICcnOgogICAgICAgIHBhcnNlZC5hcHBlbmQobGluZSkKICAgIHNl bGYucGFyc2VlbnRyaWVzKCdcbicuam9pbihwYXJzZWQpKQoKICBkZWYgcGFyc2VlbnRyaWVzKHNl bGYsIHRleHQpOgogICAgIkV4dHJhY3QgYWxsIHRoZSBlbnRyaWVzIGluIGEgcGllY2Ugb2YgdGV4 dCIKICAgIHBvcyA9IFBvc2l0aW9uKHRleHQpCiAgICBwb3Muc2tpcHNwYWNlKCkKICAgIHdoaWxl IG5vdCBwb3MuZmluaXNoZWQoKToKICAgICAgc2VsZi5wYXJzZWVudHJ5KHBvcykKCiAgZGVmIHBh cnNlZW50cnkoc2VsZiwgcG9zKToKICAgICJQYXJzZSBhIHNpbmdsZSBlbnRyeSIKICAgIGZvciBl bnRyeSBpbiBFbnRyeS5lbnRyaWVzOgogICAgICBpZiBlbnRyeS5kZXRlY3QocG9zKToKICAgICAg ICBuZXdlbnRyeSA9IENsb25lci5jbG9uZShlbnRyeSkKICAgICAgICBuZXdlbnRyeS5wYXJzZShw b3MpCiAgICAgICAgaWYgbmV3ZW50cnkuaXNyZWZlcmVuY2VkKCk6CiAgICAgICAgICBzZWxmLmVu dHJpZXMuYXBwZW5kKG5ld2VudHJ5KQogICAgICAgICAgc2VsZi5hZGRlZCArPSAxCiAgICAgICAg ZWxzZToKICAgICAgICAgIHNlbGYuaWdub3JlZCArPSAxCiAgICAgICAgcmV0dXJuCiAgICAjIFNr aXAgdGhlIHdob2xlIGxpbmUsIGFuZCBzaG93IGl0IGFzIGFuIGVycm9yCiAgICBwb3MuY2hlY2tz a2lwKCdcbicpCiAgICBFbnRyeS5lbnRyaWVzWzBdLmxpbmVlcnJvcignVW5pZGVudGlmaWVkIGVu dHJ5JywgcG9zKQoKICBkZWYgX191bmljb2RlX18oc2VsZik6CiAgICAiU3RyaW5nIHJlcHJlc2Vu dGF0aW9uIgogICAgc3RyaW5nID0gc2VsZi5maWxlbmFtZSArICc6ICcgKyB1bmljb2RlKHNlbGYu YWRkZWQpICsgJyBlbnRyaWVzIGFkZGVkLCAnCiAgICBzdHJpbmcgKz0gdW5pY29kZShzZWxmLmln bm9yZWQpICsgJyBlbnRyaWVzIGlnbm9yZWQnCiAgICByZXR1cm4gc3RyaW5nCgpjbGFzcyBFbnRy eShDb250YWluZXIpOgogICJBbiBlbnRyeSBpbiBhIEJpYlRlWCBmaWxlIgoKICBlbnRyaWVzID0g W10KICBzdHJ1Y3R1cmUgPSBbJ3snLCAnLCcsICc9JywgJyInXQogIHF1b3RlcyA9IFsneycsICci JywgJyMnXQoKICBkZWYgX19pbml0X18oc2VsZik6CiAgICBzZWxmLmtleSA9IE5vbmUKICAgIHNl bGYudGFncyA9IGRpY3QoKQogICAgc2VsZi5vdXRwdXQgPSBUYWdnZWRPdXRwdXQoKS5zZXR0YWco J3AgY2xhc3M9ImJpYmxpbyInKQoKICBkZWYgcGFyc2Uoc2VsZiwgcG9zKToKICAgICJQYXJzZSB0 aGUgZW50cnkgYmV0d2VlbiB7fSIKICAgIHNlbGYudHlwZSA9IHNlbGYucGFyc2VwaWVjZShwb3Ms IEVudHJ5LnN0cnVjdHVyZSkKICAgIHBvcy5za2lwc3BhY2UoKQogICAgaWYgbm90IHBvcy5jaGVj a3NraXAoJ3snKToKICAgICAgc2VsZi5saW5lZXJyb3IoJ0VudHJ5IHNob3VsZCBzdGFydCB3aXRo IHsnLCBwb3MpCiAgICAgIHJldHVybgogICAgcG9zLnB1c2hlbmRpbmcoJ30nKQogICAgc2VsZi5w YXJzZXRhZ3MocG9zKQogICAgcG9zLnBvcGVuZGluZygnfScpCiAgICBwb3Muc2tpcHNwYWNlKCkK CiAgZGVmIHBhcnNldGFncyhzZWxmLCBwb3MpOgogICAgIlBhcnNlIGFsbCB0YWdzIGluIHRoZSBl bnRyeSIKICAgIHBvcy5za2lwc3BhY2UoKQogICAgd2hpbGUgbm90IHBvcy5maW5pc2hlZCgpOgog ICAgICBpZiBwb3MuY2hlY2tza2lwKCd7Jyk6CiAgICAgICAgc2VsZi5saW5lZXJyb3IoJ1VubWF0 Y2hlZCB7JywgcG9zKQogICAgICAgIHJldHVybgogICAgICBzZWxmLnBhcnNldGFnKHBvcykKICAK ICBkZWYgcGFyc2V0YWcoc2VsZiwgcG9zKToKICAgIHBpZWNlID0gc2VsZi5wYXJzZXBpZWNlKHBv cywgRW50cnkuc3RydWN0dXJlKQogICAgaWYgcG9zLmNoZWNrc2tpcCgnLCcpOgogICAgICBzZWxm LmtleSA9IHBpZWNlCiAgICAgIHJldHVybgogICAgaWYgcG9zLmNoZWNrc2tpcCgnPScpOgogICAg ICBwaWVjZSA9IHBpZWNlLmxvd2VyKCkuc3RyaXAoKQogICAgICBwb3Muc2tpcHNwYWNlKCkKICAg ICAgdmFsdWUgPSBzZWxmLnBhcnNldmFsdWUocG9zKQogICAgICBzZWxmLnRhZ3NbcGllY2VdID0g dmFsdWUKICAgICAgcG9zLnNraXBzcGFjZSgpCiAgICAgIGlmIG5vdCBwb3MuZmluaXNoZWQoKSBh bmQgbm90IHBvcy5jaGVja3NraXAoJywnKToKICAgICAgICBzZWxmLmxpbmVlcnJvcignTWlzc2lu ZyAsIGluIEJpYlRlWCB0YWcnLCBwb3MpCiAgICAgIHJldHVybgoKICBkZWYgcGFyc2V2YWx1ZShz ZWxmLCBwb3MpOgogICAgIlBhcnNlIHRoZSB2YWx1ZSBmb3IgYSB0YWciCiAgICBwb3Muc2tpcHNw YWNlKCkKICAgIGlmIHBvcy5jaGVja2ZvcignLCcpOgogICAgICBzZWxmLmxpbmVlcnJvcignVW5l eHBlY3RlZCAsJywgcG9zKQogICAgICByZXR1cm4gJycKICAgIGlmIHBvcy5jaGVja2Zvcigneycp OgogICAgICByZXR1cm4gc2VsZi5wYXJzZWJyYWNrZXQocG9zKQogICAgZWxpZiBwb3MuY2hlY2tm b3IoJyInKToKICAgICAgcmV0dXJuIHNlbGYucGFyc2VxdW90ZWQocG9zKQogICAgZWxzZToKICAg ICAgcmV0dXJuIHNlbGYucGFyc2VwaWVjZShwb3MsIEVudHJ5LnN0cnVjdHVyZSkKCiAgZGVmIHBh cnNlYnJhY2tldChzZWxmLCBwb3MpOgogICAgIlBhcnNlIGEge30gYnJhY2tldCIKICAgIGlmIG5v dCBwb3MuY2hlY2tza2lwKCd7Jyk6CiAgICAgIHNlbGYubGluZWVycm9yKCdNaXNzaW5nIG9wZW5p bmcgeyBpbiBicmFja2V0JywgcG9zKQogICAgICByZXR1cm4gJycKICAgIHBvcy5wdXNoZW5kaW5n KCd9JykKICAgIGJyYWNrZXQgPSBzZWxmLnBhcnNlcmVjdXJzaXZlKHBvcykKICAgIHBvcy5wb3Bl bmRpbmcoJ30nKQogICAgcmV0dXJuIGJyYWNrZXQKCiAgZGVmIHBhcnNlcXVvdGVkKHNlbGYsIHBv cyk6CiAgICAiUGFyc2UgYSBwaWVjZSBvZiBxdW90ZWQgdGV4dCIKICAgIGlmIG5vdCBwb3MuY2hl Y2tza2lwKCciJyk6CiAgICAgIHNlbGYubGluZWVycm9yKCdNaXNzaW5nIG9wZW5pbmcgIiBpbiBx dW90ZScsIHBvcykKICAgICAgcmV0dXJuCiAgICBwb3MucHVzaGVuZGluZygnIicsIFRydWUpCiAg ICBxdW90ZWQgPSBzZWxmLnBhcnNlcmVjdXJzaXZlKHBvcykKICAgIHBvcy5wb3BlbmRpbmcoJyIn KQogICAgcG9zLnNraXBzcGFjZSgpCiAgICBpZiBwb3MuY2hlY2tza2lwKCcjJyk6CiAgICAgIHBv cy5za2lwc3BhY2UoKQogICAgICBxdW90ZWQgKz0gc2VsZi5wYXJzZXF1b3RlZChwb3MpCiAgICBy ZXR1cm4gcXVvdGVkCgogIGRlZiBwYXJzZXJlY3Vyc2l2ZShzZWxmLCBwb3MpOgogICAgIlBhcnNl IGJyYWNrZXRzIG9yIHF1b3RlcyByZWN1cnNpdmVseSIKICAgIHBpZWNlID0gJycKICAgIHdoaWxl IG5vdCBwb3MuZmluaXNoZWQoKToKICAgICAgcGllY2UgKz0gc2VsZi5wYXJzZXBpZWNlKHBvcywg RW50cnkucXVvdGVzKQogICAgICBpZiBub3QgcG9zLmZpbmlzaGVkKCk6CiAgICAgICAgaWYgcG9z LmNoZWNrZm9yKCd7Jyk6CiAgICAgICAgICBwaWVjZSArPSBzZWxmLnBhcnNlYnJhY2tldChwb3Mp CiAgICAgICAgZWxpZiBwb3MuY2hlY2tmb3IoJyInKToKICAgICAgICAgIHBpZWNlICs9IHNlbGYu cGFyc2VxdW90ZWQocG9zKQogICAgICAgIGVsc2U6CiAgICAgICAgICBzZWxmLmxpbmVlcnJvcign TWlzc2luZyBvcGVuaW5nIHsgb3IgIicsIHBvcykKICAgICAgICAgIHJldHVybiBwaWVjZQogICAg cmV0dXJuIHBpZWNlCgogIGRlZiBwYXJzZXBpZWNlKHNlbGYsIHBvcywgdW5kZXNpcmVkKToKICAg ICJQYXJzZSBhIHBpZWNlIG5vdCBzdHJ1Y3R1cmUiCiAgICByZXR1cm4gcG9zLmdsb2IobGFtYmRh IGN1cnJlbnQ6IG5vdCBjdXJyZW50IGluIHVuZGVzaXJlZCkKCiAgZGVmIGxpbmVlcnJvcihzZWxm LCBtZXNzYWdlLCBwb3MpOgogICAgIlNob3cgYW4gZXJyb3IgbWVzc2FnZSBmb3IgYSBsaW5lLiIK ICAgIHRvbGluZSA9IHBvcy5nbG9iZXhjbHVkaW5nKCdcbicpCiAgICBwb3MuY2hlY2tza2lwKCdc bicpCiAgICBUcmFjZS5lcnJvcihtZXNzYWdlICsgJzogJyArIHRvbGluZSkKCmNsYXNzIFNwZWNp YWxFbnRyeShFbnRyeSk6CiAgIkEgc3BlY2lhbCBlbnRyeSIKCiAgdHlwZXMgPSBbJ0BTVFJJTkcn LCAnQFBSRUFNQkxFJywgJ0BDT01NRU5UJ10KCiAgZGVmIGRldGVjdChzZWxmLCBwb3MpOgogICAg IkRldGVjdCB0aGUgc3BlY2lhbCBlbnRyeSIKICAgIGZvciB0eXBlIGluIFNwZWNpYWxFbnRyeS50 eXBlczoKICAgICAgaWYgcG9zLmNoZWNrZm9yKHR5cGUpOgogICAgICAgIHJldHVybiBUcnVlCiAg ICByZXR1cm4gRmFsc2UKCiAgZGVmIGlzcmVmZXJlbmNlZChzZWxmKToKICAgICJBIHNwZWNpYWwg ZW50cnkgaXMgbmV2ZXIgcmVmZXJlbmNlZCIKICAgIHJldHVybiBGYWxzZQoKICBkZWYgX191bmlj b2RlX18oc2VsZik6CiAgICAiUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIgogICAgcmV0 dXJuIHNlbGYudHlwZQoKY2xhc3MgUHViRW50cnkoRW50cnkpOgogICJBIHB1YmxpY2F0aW9uIGVu dHJ5IgoKICBkZWYgZGV0ZWN0KHNlbGYsIHBvcyk6CiAgICAiRGV0ZWN0IGEgcHVibGljYXRpb24g ZW50cnkiCiAgICByZXR1cm4gcG9zLmNoZWNrZm9yKCdAJykKCiAgZGVmIGlzcmVmZXJlbmNlZChz ZWxmKToKICAgICJDaGVjayBpZiB0aGUgZW50cnkgaXMgcmVmZXJlbmNlZCIKICAgIGlmIG5vdCBz ZWxmLmtleToKICAgICAgcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gc2VsZi5rZXkgaW4gQmlibGlv RW50cnkuZW50cmllcwoKICBkZWYgcHJvY2VzcyhzZWxmKToKICAgICJQcm9jZXNzIHRoZSBlbnRy eSIKICAgIGJpYmxpbyA9IEJpYmxpb0VudHJ5KCkKICAgIGJpYmxpby5wcm9jZXNzY2l0ZXMoc2Vs Zi5rZXkpCiAgICBzZWxmLmNvbnRlbnRzID0gW2JpYmxpbywgQ29uc3RhbnQoJyAnKV0KICAgIHNl bGYuY29udGVudHMuYXBwZW5kKHNlbGYuZ2V0Y29udGVudHMoKSkKCiAgZGVmIGdldGNvbnRlbnRz KHNlbGYpOgogICAgIkdldCB0aGUgY29udGVudHMgYXMgYSBjb25zdGFudCIKICAgIGNvbnRlbnRz ID0gc2VsZi50ZW1wbGF0ZQogICAgd2hpbGUgY29udGVudHMuZmluZCgnJCcpID49IDA6CiAgICAg IHRhZyA9IHNlbGYuZXh0cmFjdHRhZyhjb250ZW50cykKICAgICAgdmFsdWUgPSBzZWxmLmdldHRh Zyh0YWcpCiAgICAgIGNvbnRlbnRzID0gY29udGVudHMucmVwbGFjZSgnJCcgKyB0YWcsIHZhbHVl KQogICAgcmV0dXJuIENvbnN0YW50KGNvbnRlbnRzKQoKICBkZWYgZXh0cmFjdHRhZyhzZWxmLCBz dHJpbmcpOgogICAgIkV4dHJhY3QgdGhlIGZpcnN0IHRhZyBpbiB0aGUgZm9ybSAkdGFnIgogICAg cG9zID0gUG9zaXRpb24oc3RyaW5nKQogICAgcG9zLmdsb2JleGNsdWRpbmcoJyQnKQogICAgcG9z LnNraXAoJyQnKQogICAgcmV0dXJuIHBvcy5nbG9iYWxwaGEoKQoKICBkZWYgX191bmljb2RlX18o c2VsZik6CiAgICAiUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIgogICAgc3RyaW5nID0g JycKICAgIGF1dGhvciA9IHNlbGYuZ2V0dGFnKCdhdXRob3InKQogICAgaWYgYXV0aG9yOgogICAg ICBzdHJpbmcgKz0gYXV0aG9yICsgJzogJwogICAgdGl0bGUgPSBzZWxmLmdldHRhZygndGl0bGUn KQogICAgaWYgdGl0bGU6CiAgICAgIHN0cmluZyArPSAnIicgKyB0aXRsZSArICciJwogICAgcmV0 dXJuIHN0cmluZwoKICBkZWYgZ2V0dGFnKHNlbGYsIGtleSk6CiAgICAiR2V0IGEgdGFnIHdpdGgg dGhlIGdpdmVuIGtleSIKICAgIGlmIG5vdCBrZXkgaW4gc2VsZi50YWdzOgogICAgICByZXR1cm4g JycKICAgIHJldHVybiBzZWxmLnRhZ3Nba2V5XQoKRW50cnkuZW50cmllcyArPSBbU3BlY2lhbEVu dHJ5KCksIFB1YkVudHJ5KCldCgoKCmNsYXNzIENvbnRhaW5lckZhY3Rvcnkob2JqZWN0KToKICAi Q3JlYXRlcyBjb250YWluZXJzIGRlcGVuZGluZyBvbiB0aGUgZmlyc3QgbGluZSIKCiAgZGVmIF9f aW5pdF9fKHNlbGYpOgogICAgIlJlYWQgdGFibGUgdGhhdCBjb252ZXJ0IHN0YXJ0IGxpbmVzIHRv IGNvbnRhaW5lcnMiCiAgICB0eXBlcyA9IGRpY3QoKQogICAgZm9yIHN0YXJ0LCB0eXBlbmFtZSBp biBDb250YWluZXJDb25maWcuc3RhcnRzLml0ZXJpdGVtcygpOgogICAgICB0eXBlc1tzdGFydF0g PSBnbG9iYWxzKClbdHlwZW5hbWVdCiAgICBzZWxmLnRyZWUgPSBQYXJzZVRyZWUodHlwZXMpCgog IGRlZiBjcmVhdGVjb250YWluZXIoc2VsZiwgcmVhZGVyKToKICAgICJQYXJzZSBhIHNpbmdsZSBj b250YWluZXIuIgogICAgI1RyYWNlLmRlYnVnKCdwcm9jZXNzaW5nICInICsgcmVhZGVyLmN1cnJl bnRsaW5lKCkuc3RyaXAoKSArICciJykKICAgIGlmIHJlYWRlci5jdXJyZW50bGluZSgpID09ICcn OgogICAgICByZWFkZXIubmV4dGxpbmUoKQogICAgICByZXR1cm4gTm9uZQogICAgdHlwZSA9IHNl bGYudHJlZS5maW5kKHJlYWRlcikKICAgIGNvbnRhaW5lciA9IHR5cGUuX19uZXdfXyh0eXBlKQog ICAgY29udGFpbmVyLl9faW5pdF9fKCkKICAgIGNvbnRhaW5lci5zdGFydCA9IHJlYWRlci5jdXJy ZW50bGluZSgpLnN0cmlwKCkKICAgIHNlbGYucGFyc2UoY29udGFpbmVyLCByZWFkZXIpCiAgICBy ZXR1cm4gY29udGFpbmVyCgogIGRlZiBwYXJzZShzZWxmLCBjb250YWluZXIsIHJlYWRlcik6CiAg ICAiUGFyc2UgYSBjb250YWluZXIiCiAgICBwYXJzZXIgPSBjb250YWluZXIucGFyc2VyCiAgICBw YXJzZXIucGFyZW50ID0gY29udGFpbmVyCiAgICBwYXJzZXIuZW5kaW5nID0gc2VsZi5nZXRlbmRp bmcoY29udGFpbmVyKQogICAgcGFyc2VyLmZhY3RvcnkgPSBzZWxmCiAgICBjb250YWluZXIuaGVh ZGVyID0gcGFyc2VyLnBhcnNlaGVhZGVyKHJlYWRlcikKICAgIGNvbnRhaW5lci5iZWdpbiA9IHBh cnNlci5iZWdpbgogICAgY29udGFpbmVyLmNvbnRlbnRzID0gcGFyc2VyLnBhcnNlKHJlYWRlcikK ICAgIGNvbnRhaW5lci5wYXJhbWV0ZXJzID0gcGFyc2VyLnBhcmFtZXRlcnMKICAgIGNvbnRhaW5l ci5wcm9jZXNzKCkKICAgIGNvbnRhaW5lci5wYXJzZXIgPSBOb25lCgogIGRlZiBnZXRlbmRpbmco c2VsZiwgY29udGFpbmVyKToKICAgICJHZXQgdGhlIGVuZGluZyBmb3IgYSBjb250YWluZXIiCiAg ICBzcGxpdCA9IGNvbnRhaW5lci5zdGFydC5zcGxpdCgpCiAgICBpZiBsZW4oc3BsaXQpID09IDA6 CiAgICAgIHJldHVybiBOb25lCiAgICBzdGFydCA9IHNwbGl0WzBdCiAgICBpZiBzdGFydCBpbiBD b250YWluZXJDb25maWcuc3RhcnRlbmRpbmdzOgogICAgICByZXR1cm4gQ29udGFpbmVyQ29uZmln LnN0YXJ0ZW5kaW5nc1tzdGFydF0KICAgIGNsYXNzbmFtZSA9IGNvbnRhaW5lci5fX2NsYXNzX18u X19uYW1lX18KICAgIGlmIGNsYXNzbmFtZSBpbiBDb250YWluZXJDb25maWcuZW5kaW5nczoKICAg ICAgcmV0dXJuIENvbnRhaW5lckNvbmZpZy5lbmRpbmdzW2NsYXNzbmFtZV0KICAgIGlmIGhhc2F0 dHIoY29udGFpbmVyLCAnZW5kaW5nJyk6CiAgICAgIFRyYWNlLmVycm9yKCdQZW5kaW5nIGVuZGlu ZyBpbiAnICsgY29udGFpbmVyLl9fY2xhc3NfXy5fX25hbWVfXykKICAgICAgcmV0dXJuIGNvbnRh aW5lci5lbmRpbmcKICAgIHJldHVybiBOb25lCgpjbGFzcyBQYXJzZVRyZWUob2JqZWN0KToKICAi QSBwYXJzaW5nIHRyZWUiCgogIGRlZmF1bHQgPSAnfn5kZWZhdWx0fn4nCgogIGRlZiBfX2luaXRf XyhzZWxmLCB0eXBlcyk6CiAgICAiQ3JlYXRlIHRoZSBwYXJzZSB0cmVlIgogICAgc2VsZi5yb290 ID0gZGljdCgpCiAgICBmb3Igc3RhcnQsIHR5cGUgaW4gdHlwZXMuaXRlcml0ZW1zKCk6CiAgICAg IHNlbGYuYWRkc3RhcnQodHlwZSwgc3RhcnQpCgogIGRlZiBhZGRzdGFydChzZWxmLCB0eXBlLCBz dGFydCk6CiAgICAiQWRkIGEgc3RhcnQgcGllY2UgdG8gdGhlIHRyZWUiCiAgICB0cmVlID0gc2Vs Zi5yb290CiAgICBmb3IgcGllY2UgaW4gc3RhcnQuc3BsaXQoKToKICAgICAgaWYgbm90IHBpZWNl IGluIHRyZWU6CiAgICAgICAgdHJlZVtwaWVjZV0gPSBkaWN0KCkKICAgICAgdHJlZSA9IHRyZWVb cGllY2VdCiAgICBpZiBQYXJzZVRyZWUuZGVmYXVsdCBpbiB0cmVlOgogICAgICBUcmFjZS5lcnJv cignU3RhcnQgJyArIHN0YXJ0ICsgJyBkdXBsaWNhdGVkJykKICAgIHRyZWVbUGFyc2VUcmVlLmRl ZmF1bHRdID0gdHlwZQoKICBkZWYgZmluZChzZWxmLCByZWFkZXIpOgogICAgIkZpbmQgdGhlIGN1 cnJlbnQgc2VudGVuY2UgaW4gdGhlIHRyZWUiCiAgICBicmFuY2hlcyA9IFtzZWxmLnJvb3RdCiAg ICBmb3IgcGllY2UgaW4gcmVhZGVyLmN1cnJlbnRsaW5lKCkuc3BsaXQoKToKICAgICAgY3VycmVu dCA9IGJyYW5jaGVzWy0xXQogICAgICBwaWVjZSA9IHBpZWNlLnJzdHJpcCgnPicpCiAgICAgIGlm IHBpZWNlIGluIGN1cnJlbnQ6CiAgICAgICAgYnJhbmNoZXMuYXBwZW5kKGN1cnJlbnRbcGllY2Vd KQogICAgd2hpbGUgbm90IFBhcnNlVHJlZS5kZWZhdWx0IGluIGJyYW5jaGVzWy0xXToKICAgICAg VHJhY2UuZXJyb3IoJ0xpbmUgJyArIHJlYWRlci5jdXJyZW50bGluZSgpLnN0cmlwKCkgKyAnIG5v dCBmb3VuZCcpCiAgICAgIGJyYW5jaGVzLnBvcCgpCiAgICBsYXN0ID0gYnJhbmNoZXNbLTFdCiAg ICByZXR1cm4gbGFzdFtQYXJzZVRyZWUuZGVmYXVsdF0KCgoKCgoKCmNsYXNzIFRPQ0VudHJ5KENv bnRhaW5lcik6CiAgIkEgY29udGFpbmVyIGZvciBhIFRPQyBlbnRyeS4iCgogIGNvcGllZCA9IFtT dHJpbmdDb250YWluZXIsIENvbnN0YW50LCBTcGFjZV0KICBhbGxvd2VkID0gWwogICAgICBUZXh0 RmFtaWx5LCBFbXBoYXRpY1RleHQsIFZlcnNhbGl0YXNUZXh0LCBCYXJyZWRUZXh0LAogICAgICBT aXplVGV4dCwgQ29sb3JUZXh0LCBMYW5nTGluZSwgRm9ybXVsYQogICAgICBdCgogIGRlZiBoZWFk ZXIoc2VsZiwgY29udGFpbmVyKToKICAgICJDcmVhdGUgYSBUT0MgZW50cnkgZm9yIGhlYWRlciBh bmQgZm9vdGVyICgwIGRlcHRoKS4iCiAgICBzZWxmLmRlcHRoID0gMAogICAgc2VsZi5vdXRwdXQg PSBFbXB0eU91dHB1dCgpCiAgICByZXR1cm4gc2VsZgoKICBkZWYgY3JlYXRlKHNlbGYsIGNvbnRh aW5lcik6CiAgICAiQ3JlYXRlIHRoZSBUT0MgZW50cnkgZm9yIGEgY29udGFpbmVyLCBjb25zaXN0 aW5nIG9mIGEgc2luZ2xlIGxpbmsuIgogICAgc2VsZi5lbnRyeSA9IGNvbnRhaW5lci5lbnRyeQog ICAgc2VsZi5icmFuY2hlcyA9IFtdCiAgICB0ZXh0ID0gY29udGFpbmVyLmVudHJ5ICsgJzonCiAg ICBsYWJlbHMgPSBjb250YWluZXIuc2VhcmNoYWxsKExhYmVsKQogICAgaWYgbGVuKGxhYmVscykg PT0gMCBvciBPcHRpb25zLnRvYzoKICAgICAgdXJsID0gT3B0aW9ucy50b2N0YXJnZXQgKyAnI3Rv Yy0nICsgY29udGFpbmVyLnR5cGUgKyAnLScgKyBjb250YWluZXIubnVtYmVyCiAgICAgIGxpbmsg PSBMaW5rKCkuY29tcGxldGUodGV4dCwgdXJsPXVybCkKICAgIGVsc2U6CiAgICAgIGxhYmVsID0g bGFiZWxzWzBdCiAgICAgIGxpbmsgPSBMaW5rKCkuY29tcGxldGUodGV4dCkKICAgICAgbGluay5k ZXN0aW5hdGlvbiA9IGxhYmVsCiAgICBzZWxmLmNvbnRlbnRzID0gW2xpbmtdCiAgICBpZiBjb250 YWluZXIubnVtYmVyID09ICcnOgogICAgICBsaW5rLmNvbnRlbnRzLmFwcGVuZChDb25zdGFudCh1 J+KAgycpKQogICAgbGluay5jb250ZW50cyArPSBzZWxmLmdldHRpdGxlY29udGVudHMoY29udGFp bmVyKQogICAgc2VsZi5vdXRwdXQgPSBUYWdnZWRPdXRwdXQoKS5zZXR0YWcoJ2RpdiBjbGFzcz0i dG9jIicsIFRydWUpCiAgICBzZWxmLmRlcHRoID0gY29udGFpbmVyLmxldmVsCiAgICBzZWxmLnBh cnRrZXkgPSBjb250YWluZXIucGFydGtleQogICAgcmV0dXJuIHNlbGYKCiAgZGVmIGdldHRpdGxl Y29udGVudHMoc2VsZiwgY29udGFpbmVyKToKICAgICJHZXQgdGhlIHRpdGxlIG9mIHRoZSBjb250 YWluZXIuIgogICAgc2hvcnR0aXRsZXMgPSBjb250YWluZXIuc2VhcmNoYWxsKFNob3J0VGl0bGUp CiAgICBpZiBsZW4oc2hvcnR0aXRsZXMpID4gMDoKICAgICAgY29udGVudHMgPSBbQ29uc3RhbnQo dSfigIMnKV0KICAgICAgZm9yIHNob3J0dGl0bGUgaW4gc2hvcnR0aXRsZXM6CiAgICAgICAgY29u dGVudHMgKz0gc2hvcnR0aXRsZS5jb250ZW50cwogICAgICByZXR1cm4gY29udGVudHMKICAgIHJl dHVybiBzZWxmLnNhZmVjbG9uZShjb250YWluZXIpLmNvbnRlbnRzCgogIGRlZiBzYWZlY2xvbmUo c2VsZiwgY29udGFpbmVyKToKICAgICJSZXR1cm4gYSBuZXcgY29udGFpbmVyIHdpdGggY29udGVu dHMgb25seSBpbiBhIHNhZmUgbGlzdCwgcmVjdXJzaXZlbHkuIgogICAgY2xvbmUgPSBDbG9uZXIu Y2xvbmUoY29udGFpbmVyKQogICAgY2xvbmUub3V0cHV0ID0gY29udGFpbmVyLm91dHB1dAogICAg Y2xvbmUuY29udGVudHMgPSBbXQogICAgZm9yIGVsZW1lbnQgaW4gY29udGFpbmVyLmNvbnRlbnRz OgogICAgICBpZiBlbGVtZW50Ll9fY2xhc3NfXyBpbiBUT0NFbnRyeS5jb3BpZWQ6CiAgICAgICAg Y2xvbmUuY29udGVudHMuYXBwZW5kKGVsZW1lbnQpCiAgICAgIGVsaWYgZWxlbWVudC5fX2NsYXNz X18gaW4gVE9DRW50cnkuYWxsb3dlZDoKICAgICAgICBjbG9uZS5jb250ZW50cy5hcHBlbmQoc2Vs Zi5zYWZlY2xvbmUoZWxlbWVudCkpCiAgICByZXR1cm4gY2xvbmUKCiAgZGVmIF9fdW5pY29kZV9f KHNlbGYpOgogICAgIlJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbi4iCiAgICByZXR1 cm4gJ1RPQyBlbnRyeTogJyArIHNlbGYuZW50cnkKCmNsYXNzIEluZGVudGVyKG9iamVjdCk6CiAg Ik1hbmFnZXMgYW5kIHdyaXRlcyBpbmRlbnRhdGlvbiBmb3IgdGhlIFRPQy4iCgogIGRlZiBfX2lu aXRfXyhzZWxmKToKICAgIHNlbGYuZGVwdGggPSAwCgogIGRlZiBnZXRpbmRlbnQoc2VsZiwgZGVw dGgpOgogICAgaW5kZW50ID0gJycKICAgIGlmIGRlcHRoID4gc2VsZi5kZXB0aDoKICAgICAgaW5k ZW50ID0gc2VsZi5vcGVuaW5kZW50KGRlcHRoIC0gc2VsZi5kZXB0aCkKICAgIGVsaWYgZGVwdGgg PCBzZWxmLmRlcHRoOgogICAgICBpbmRlbnQgPSBzZWxmLmNsb3NlaW5kZW50KHNlbGYuZGVwdGgg LSBkZXB0aCkKICAgIHNlbGYuZGVwdGggPSBkZXB0aAogICAgcmV0dXJuIENvbnN0YW50KGluZGVu dCkKCiAgZGVmIG9wZW5pbmRlbnQoc2VsZiwgdGltZXMpOgogICAgIk9wZW4gdGhlIGluZGVudGlu ZyBkaXYgYSBmZXcgdGltZXMuIgogICAgaW5kZW50ID0gJycKICAgIGZvciBpIGluIHJhbmdlKHRp bWVzKToKICAgICAgaW5kZW50ICs9ICc8ZGl2IGNsYXNzPSJ0b2NpbmRlbnQiPlxuJwogICAgcmV0 dXJuIGluZGVudAoKICBkZWYgY2xvc2VpbmRlbnQoc2VsZiwgdGltZXMpOgogICAgIkNsb3NlIHRo ZSBpbmRlbnRpbmcgZGl2IGEgZmV3IHRpbWVzLiIKICAgIGluZGVudCA9ICcnCiAgICBmb3IgaSBp biByYW5nZSh0aW1lcyk6CiAgICAgIGluZGVudCArPSAnPC9kaXY+XG4nCiAgICByZXR1cm4gaW5k ZW50CgpjbGFzcyBUT0NUcmVlKG9iamVjdCk6CiAgIkEgdHJlZSB0aGF0IGNvbnRhaW5zIHRoZSBm dWxsIFRPQy4iCgogIGRlZiBfX2luaXRfXyhzZWxmKToKICAgIHNlbGYudHJlZSA9IFtdCiAgICBz ZWxmLmJyYW5jaGVzID0gW10KCiAgZGVmIHN0b3JlKHNlbGYsIGVudHJ5KToKICAgICJQbGFjZSB0 aGUgZW50cnkgaW4gYSB0cmVlIG9mIGVudHJpZXMuIgogICAgd2hpbGUgbGVuKHNlbGYudHJlZSkg PCBlbnRyeS5kZXB0aDoKICAgICAgc2VsZi50cmVlLmFwcGVuZChOb25lKQogICAgaWYgbGVuKHNl bGYudHJlZSkgPiBlbnRyeS5kZXB0aDoKICAgICAgc2VsZi50cmVlID0gc2VsZi50cmVlWzplbnRy eS5kZXB0aF0KICAgIHN0ZW0gPSBzZWxmLmZpbmRzdGVtKCkKICAgIGlmIGxlbihzZWxmLnRyZWUp ID09IDA6CiAgICAgIHNlbGYuYnJhbmNoZXMuYXBwZW5kKGVudHJ5KQogICAgc2VsZi50cmVlLmFw cGVuZChlbnRyeSkKICAgIGlmIHN0ZW06CiAgICAgIGVudHJ5LnN0ZW0gPSBzdGVtCiAgICAgIHN0 ZW0uYnJhbmNoZXMuYXBwZW5kKGVudHJ5KQoKICBkZWYgZmluZHN0ZW0oc2VsZik6CiAgICAiRmlu ZCB0aGUgc3RlbSB3aGVyZSBvdXIgbmV4dCBlbGVtZW50IHdpbGwgYmUgaW5zZXJ0ZWQuIgogICAg Zm9yIGVsZW1lbnQgaW4gcmV2ZXJzZWQoc2VsZi50cmVlKToKICAgICAgaWYgZWxlbWVudDoKICAg ICAgICByZXR1cm4gZWxlbWVudAogICAgcmV0dXJuIE5vbmUKCmNsYXNzIFRPQ0NvbnZlcnRlcihv YmplY3QpOgogICJBIGNvbnZlcnRlciBmcm9tIGNvbnRhaW5lcnMgdG8gVE9DIGVudHJpZXMuIgoK ICBjYWNoZSA9IGRpY3QoKQogIHRyZWUgPSBUT0NUcmVlKCkKCiAgZGVmIF9faW5pdF9fKHNlbGYp OgogICAgc2VsZi5pbmRlbnRlciA9IEluZGVudGVyKCkKCiAgZGVmIHRyYW5zbGF0ZShzZWxmLCBj b250YWluZXIpOgogICAgIlRyYW5zbGF0ZSBhIGNvbnRhaW5lciB0byBUT0MgZW50cnkgKyBpbmRl bnRhdGlvbi4iCiAgICBlbnRyeSA9IHNlbGYuY29udmVydChjb250YWluZXIpCiAgICBpZiBub3Qg ZW50cnk6CiAgICAgIHJldHVybiBbXQogICAgaW5kZW50ID0gc2VsZi5pbmRlbnRlci5nZXRpbmRl bnQoZW50cnkuZGVwdGgpCiAgICByZXR1cm4gW2luZGVudCwgZW50cnldCgogIGRlZiBjb252ZXJ0 KHNlbGYsIGNvbnRhaW5lcik6CiAgICAiQ29udmVydCBhIGNvbnRhaW5lciB0byBhIFRPQyBlbnRy eS4iCiAgICBpZiBjb250YWluZXIuX19jbGFzc19fIGluIFtMeVhIZWFkZXIsIEx5WEZvb3Rlcl06 CiAgICAgIHJldHVybiBUT0NFbnRyeSgpLmhlYWRlcihjb250YWluZXIpCiAgICBpZiBub3QgaGFz YXR0cihjb250YWluZXIsICdwYXJ0a2V5Jyk6CiAgICAgIHJldHVybiBOb25lCiAgICBpZiBjb250 YWluZXIucGFydGtleSBpbiBzZWxmLmNhY2hlOgogICAgICByZXR1cm4gVE9DQ29udmVydGVyLmNh Y2hlW2NvbnRhaW5lci5wYXJ0a2V5XQogICAgaWYgY29udGFpbmVyLmxldmVsID4gTHlYSGVhZGVy LnRvY2RlcHRoOgogICAgICByZXR1cm4gTm9uZQogICAgZW50cnkgPSBUT0NFbnRyeSgpLmNyZWF0 ZShjb250YWluZXIpCiAgICBUT0NDb252ZXJ0ZXIuY2FjaGVbY29udGFpbmVyLnBhcnRrZXldID0g ZW50cnkKICAgIFRPQ0NvbnZlcnRlci50cmVlLnN0b3JlKGVudHJ5KQogICAgcmV0dXJuIGVudHJ5 CgoKCgoKaW1wb3J0IG9zLnBhdGgKCgpjbGFzcyBCYXNrZXQob2JqZWN0KToKICAiQSBiYXNrZXQg dG8gcGxhY2UgYSBzZXQgb2YgY29udGFpbmVycy4gQ2FuIHdyaXRlIHRoZW0sIHN0b3JlIHRoZW0u Li4iCgogIGRlZiBzZXR3cml0ZXIoc2VsZiwgd3JpdGVyKToKICAgIHNlbGYud3JpdGVyID0gd3Jp dGVyCiAgICByZXR1cm4gc2VsZgoKY2xhc3MgV3JpdGVyQmFza2V0KEJhc2tldCk6CiAgIkEgd3Jp dGVyIG9mIGNvbnRhaW5lcnMuIEp1c3Qgd3JpdGVzIHRoZW0gb3V0IHRvIGEgd3JpdGVyLiIKCiAg ZGVmIHdyaXRlKHNlbGYsIGNvbnRhaW5lcik6CiAgICAiV3JpdGUgYSBjb250YWluZXIgdG8gdGhl IGxpbmUgd3JpdGVyLiIKICAgIHNlbGYud3JpdGVyLndyaXRlKGNvbnRhaW5lci5nZXRodG1sKCkp CgogIGRlZiBmaW5pc2goc2VsZik6CiAgICAiTWFyayBhcyBmaW5pc2hlZC4iCiAgICBzZWxmLndy aXRlci5jbG9zZSgpCgpjbGFzcyBLZWVwZXJCYXNrZXQoQmFza2V0KToKICAiS2VlcHMgYWxsIGNv bnRhaW5lcnMgc3RvcmVkLiIKCiAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgc2VsZi5jb250ZW50 cyA9IFtdCgogIGRlZiB3cml0ZShzZWxmLCBjb250YWluZXIpOgogICAgIktlZXAgdGhlIGNvbnRh aW5lci4iCiAgICBzZWxmLmNvbnRlbnRzLmFwcGVuZChjb250YWluZXIpCgogIGRlZiBmaW5pc2go c2VsZik6CiAgICAiRmluaXNoIHRoZSBiYXNrZXQgYnkgZmx1c2hpbmcgdG8gZGlzay4iCiAgICBz ZWxmLmZsdXNoKCkKCiAgZGVmIGZsdXNoKHNlbGYpOgogICAgIkZsdXNoIHRoZSBjb250ZW50cyB0 byB0aGUgd3JpdGVyLiIKICAgIGZvciBjb250YWluZXIgaW4gc2VsZi5jb250ZW50czoKICAgICAg c2VsZi53cml0ZXIud3JpdGUoY29udGFpbmVyLmdldGh0bWwoKSkKCmNsYXNzIFRPQ0Jhc2tldChC YXNrZXQpOgogICJBIGJhc2tldCB0byBwbGFjZSB0aGUgVE9DIG9mIGEgZG9jdW1lbnQuIgoKICBk ZWYgX19pbml0X18oc2VsZik6CiAgICBzZWxmLmNvbnZlcnRlciA9IFRPQ0NvbnZlcnRlcigpCgog IGRlZiBzZXR3cml0ZXIoc2VsZiwgd3JpdGVyKToKICAgIEJhc2tldC5zZXR3cml0ZXIoc2VsZiwg d3JpdGVyKQogICAgT3B0aW9ucy5ub2NvcHkgPSBUcnVlCiAgICBzZWxmLndyaXRlci53cml0ZShM eVhIZWFkZXIoKS5nZXRodG1sKCkpCiAgICByZXR1cm4gc2VsZgoKICBkZWYgd3JpdGUoc2VsZiwg Y29udGFpbmVyKToKICAgICJXcml0ZSB0aGUgdGFibGUgb2YgY29udGVudHMgZm9yIGEgY29udGFp bmVyLiIKICAgIGVudHJpZXMgPSBzZWxmLmNvbnZlcnRlci50cmFuc2xhdGUoY29udGFpbmVyKQog ICAgZm9yIGVudHJ5IGluIGVudHJpZXM6CiAgICAgIHNlbGYud3JpdGVyLndyaXRlKGVudHJ5Lmdl dGh0bWwoKSkKCiAgZGVmIGZpbmlzaChzZWxmKToKICAgICJNYXJrIGFzIGZpbmlzaGVkLiIKICAg IHNlbGYud3JpdGVyLndyaXRlKEx5WEZvb3RlcigpLmdldGh0bWwoKSkKCgoKCgoKCmNsYXNzIElu dGVncmFsUHJvY2Vzc29yKG9iamVjdCk6CiAgIkEgcHJvY2Vzc29yIGZvciBhbiBpbnRlZ3JhbCBk b2N1bWVudC4iCgogIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICJDcmVhdGUgdGhlIHByb2Nlc3Nv ciBmb3IgdGhlIGludGVncmFsIGNvbnRlbnRzLiIKICAgIHNlbGYuc3RvcmFnZSA9IFtdCgogIGRl ZiBsb2NhdGUoc2VsZiwgY29udGFpbmVyKToKICAgICJMb2NhdGUgb25seSBjb250YWluZXJzIG9m IHRoZSBwcm9jZXNzZWQgdHlwZS4iCiAgICByZXR1cm4gaXNpbnN0YW5jZShjb250YWluZXIsIHNl bGYucHJvY2Vzc2VkdHlwZSkKCiAgZGVmIHN0b3JlKHNlbGYsIGNvbnRhaW5lcik6CiAgICAiU3Rv cmUgYSBuZXcgY29udGFpbmVyLiIKICAgIHNlbGYuc3RvcmFnZS5hcHBlbmQoY29udGFpbmVyKQoK ICBkZWYgcHJvY2VzcyhzZWxmKToKICAgICJQcm9jZXNzIHRoZSB3aG9sZSBzdG9yYWdlLiIKICAg IGZvciBjb250YWluZXIgaW4gc2VsZi5zdG9yYWdlOgogICAgICBzZWxmLnByb2Nlc3NlYWNoKGNv bnRhaW5lcikKCmNsYXNzIEludGVncmFsTGF5b3V0KEludGVncmFsUHJvY2Vzc29yKToKICAiQSBw cm9jZXNzb3IgZm9yIGxheW91dHMgdGhhdCB3aWxsIGFwcGVhciBpbiB0aGUgVE9DLiIKCiAgcHJv Y2Vzc2VkdHlwZSA9IExheW91dAogIHRvY2VudHJpZXMgPSBbXQoKICBkZWYgcHJvY2Vzc2VhY2go c2VsZiwgbGF5b3V0KToKICAgICJLZWVwIG9ubHkgbGF5b3V0cyB0aGF0IGhhdmUgYW4gZW50cnku IgogICAgaWYgbm90IGhhc2F0dHIobGF5b3V0LCAnZW50cnknKToKICAgICAgcmV0dXJuCiAgICBJ bnRlZ3JhbExheW91dC50b2NlbnRyaWVzLmFwcGVuZChsYXlvdXQpCgpjbGFzcyBJbnRlZ3JhbFRP QyhJbnRlZ3JhbFByb2Nlc3Nvcik6CiAgIkEgcHJvY2Vzc29yIGZvciBhbiBpbnRlZ3JhbCBUT0Mu IgoKICBwcm9jZXNzZWR0eXBlID0gVGFibGVPZkNvbnRlbnRzCgogIGRlZiBwcm9jZXNzZWFjaChz ZWxmLCB0b2MpOgogICAgIkZpbGwgaW4gYSBUYWJsZSBvZiBDb250ZW50cy4iCiAgICB0b2Mub3V0 cHV0ID0gVGFnZ2VkT3V0cHV0KCkuc2V0dGFnKCdkaXYgY2xhc3M9ImZ1bGx0b2MiJywgVHJ1ZSkK ICAgIGNvbnZlcnRlciA9IFRPQ0NvbnZlcnRlcigpCiAgICBmb3IgY29udGFpbmVyIGluIEludGVn cmFsTGF5b3V0LnRvY2VudHJpZXM6CiAgICAgIHRvYy5jb250ZW50cyArPSBjb252ZXJ0ZXIudHJh bnNsYXRlKGNvbnRhaW5lcikKICAgICMgZmluaXNoIG9mZiB3aXRoIHRoZSBmb290ZXIgdG8gYWxp Z24gaW5kZW50cwogICAgdG9jLmNvbnRlbnRzICs9IGNvbnZlcnRlci50cmFuc2xhdGUoTHlYRm9v dGVyKCkpCgogIGRlZiB3cml0ZXRvdG9jKHNlbGYsIGVudHJpZXMsIHRvYyk6CiAgICAiV3JpdGUg c29tZSBlbnRyaWVzIHRvIHRoZSBUT0MuIgogICAgZm9yIGVudHJ5IGluIGVudHJpZXM6CiAgICAg IHRvYy5jb250ZW50cy5hcHBlbmQoZW50cnkpCgpjbGFzcyBJbnRlZ3JhbEJpYmxpb0VudHJ5KElu dGVncmFsUHJvY2Vzc29yKToKICAiQSBwcm9jZXNzb3IgZm9yIGFuIGludGVncmFsIGJpYmxpb2dy YXBoeSBlbnRyeS4iCgogIHByb2Nlc3NlZHR5cGUgPSBCaWJsaW9FbnRyeQoKICBkZWYgcHJvY2Vz c2VhY2goc2VsZiwgZW50cnkpOgogICAgIlByb2Nlc3MgZWFjaCBlbnRyeS4iCiAgICBudW1iZXIg PSBOdW1iZXJHZW5lcmF0b3IuaW5zdGFuY2UuZ2VuZXJhdGV1bmlxdWUoJ2ludGVncmFsYmliJykK ICAgIGxpbmsgPSBMaW5rKCkuY29tcGxldGUobnVtYmVyLCAnYmlibGlvLScgKyBudW1iZXIsIHR5 cGU9J2JpYmxpb2VudHJ5JykKICAgIGVudHJ5LmNvbnRlbnRzID0gW0NvbnN0YW50KCdbJyksIGxp bmssIENvbnN0YW50KCddICcpXQogICAgaWYgZW50cnkua2V5IGluIEJpYmxpb0NpdGUuY2l0ZXM6 CiAgICAgIGZvciBjaXRlIGluIEJpYmxpb0NpdGUuY2l0ZXNbZW50cnkua2V5XToKICAgICAgICBj aXRlLmNvbXBsZXRlKG51bWJlciwgYW5jaG9yID0gJ2NpdGUtJyArIG51bWJlcikKICAgICAgICBj aXRlLmRlc3RpbmF0aW9uID0gbGluawoKY2xhc3MgSW50ZWdyYWxGbG9hdChJbnRlZ3JhbFByb2Nl c3Nvcik6CiAgIlN0b3JlIGFsbCBmbG9hdHMgaW4gdGhlIGRvY3VtZW50IGJ5IHR5cGUuIgoKICBw cm9jZXNzZWR0eXBlID0gRmxvYXQKICBieXR5cGUgPSBkaWN0KCkKCiAgZGVmIHByb2Nlc3NlYWNo KHNlbGYsIGZsb2F0KToKICAgICJTdG9yZSBlYWNoIGZsb2F0IGJ5IHR5cGUuIgogICAgaWYgbm90 IGZsb2F0LnR5cGUgaW4gSW50ZWdyYWxGbG9hdC5ieXR5cGU6CiAgICAgIEludGVncmFsRmxvYXQu Ynl0eXBlW2Zsb2F0LnR5cGVdID0gW10KICAgIEludGVncmFsRmxvYXQuYnl0eXBlW2Zsb2F0LnR5 cGVdLmFwcGVuZChmbG9hdCkKCmNsYXNzIEludGVncmFsTGlzdE9mKEludGVncmFsUHJvY2Vzc29y KToKICAiQSBwcm9jZXNzb3IgZm9yIGFuIGludGVncmFsIGxpc3Qgb2YgZmxvYXRzLiIKCiAgcHJv Y2Vzc2VkdHlwZSA9IExpc3RPZgoKICBkZWYgcHJvY2Vzc2VhY2goc2VsZiwgbGlzdG9mKToKICAg ICJGaWxsIGluIGEgbGlzdCBvZiBmbG9hdHMuIgogICAgbGlzdG9mLm91dHB1dCA9IFRhZ2dlZE91 dHB1dCgpLnNldHRhZygnZGl2IGNsYXNzPSJmdWxsdG9jIicsIFRydWUpCiAgICBpZiBub3QgbGlz dG9mLnR5cGUgaW4gSW50ZWdyYWxGbG9hdC5ieXR5cGU6CiAgICAgIFRyYWNlLm1lc3NhZ2UoJ05v IGZsb2F0cyBvZiB0eXBlICcgKyBsaXN0b2YudHlwZSkKICAgICAgcmV0dXJuCiAgICBmb3IgZmxv YXQgaW4gSW50ZWdyYWxGbG9hdC5ieXR5cGVbbGlzdG9mLnR5cGVdOgogICAgICBlbnRyeSA9IHNl bGYucHJvY2Vzc2Zsb2F0KGZsb2F0KQogICAgICBpZiBlbnRyeToKICAgICAgICBsaXN0b2YuY29u dGVudHMuYXBwZW5kKGVudHJ5KQoKICBkZWYgcHJvY2Vzc2Zsb2F0KHNlbGYsIGZsb2F0KToKICAg ICJHZXQgYW4gZW50cnkgZm9yIHRoZSBsaXN0IG9mIGZsb2F0cy4iCiAgICBpZiBmbG9hdC5wYXJl bnRmbG9hdDoKICAgICAgcmV0dXJuIE5vbmUKICAgIGxpbmsgPSBzZWxmLmNyZWF0ZWxpbmsoZmxv YXQpCiAgICBpZiBub3QgbGluazoKICAgICAgcmV0dXJuIE5vbmUKICAgIHJldHVybiBUYWdnZWRU ZXh0KCkuY29tcGxldGUoW2xpbmtdLCAnZGl2IGNsYXNzPSJ0b2MiJywgVHJ1ZSkKCiAgZGVmIGNy ZWF0ZWxpbmsoc2VsZiwgZmxvYXQpOgogICAgIkNyZWF0ZSB0aGUgbGluayB0byB0aGUgZmxvYXQg bGFiZWwuIgogICAgY2FwdGlvbnMgPSBmbG9hdC5zZWFyY2hpbnNpZGUoZmxvYXQuY29udGVudHMs IENhcHRpb24pCiAgICBpZiBsZW4oY2FwdGlvbnMpID09IDA6CiAgICAgIHJldHVybiBOb25lCiAg ICBsYWJlbHMgPSBmbG9hdC5zZWFyY2hpbnNpZGUoZmxvYXQuY29udGVudHMsIExhYmVsKQogICAg aWYgbGVuKGxhYmVscykgPiAwOgogICAgICBsYWJlbCA9IGxhYmVsc1swXQogICAgZWxzZToKICAg ICAgbGFiZWwgPSBMYWJlbCgpLmNyZWF0ZSgnICcsIGZsb2F0LmVudHJ5LnJlcGxhY2UoJyAnLCAn LScpKQogICAgICBmbG9hdC5jb250ZW50cy5pbnNlcnQoMCwgbGFiZWwpCiAgICAgIGxhYmVscy5h cHBlbmQobGFiZWwpCiAgICBpZiBsZW4obGFiZWxzKSA+IDE6CiAgICAgIFRyYWNlLmVycm9yKCdN b3JlIHRoYW4gb25lIGxhYmVsIGluICcgKyBmbG9hdC5lbnRyeSkKICAgIGxpbmsgPSBMaW5rKCku Y29tcGxldGUoZmxvYXQuZW50cnkgKyB1JzrigIMnKQogICAgZm9yIGNhcHRpb24gaW4gY2FwdGlv bnM6CiAgICAgIGxpbmsuY29udGVudHMgKz0gY2FwdGlvbi5jb250ZW50c1sxOl0KICAgIGxpbmsu ZGVzdGluYXRpb24gPSBsYWJlbAogICAgcmV0dXJuIGxpbmsKCmNsYXNzIEludGVncmFsUmVmZXJl bmNlKEludGVncmFsUHJvY2Vzc29yKToKICAiQSBwcm9jZXNzb3IgZm9yIGEgcmVmZXJlbmNlIHRv IGEgbGFiZWwuIgoKICBwcm9jZXNzZWR0eXBlID0gUmVmZXJlbmNlCgogIGRlZiBwcm9jZXNzZWFj aChzZWxmLCByZWZlcmVuY2UpOgogICAgIkV4dHJhY3QgdGhlIHRleHQgb2YgdGhlIG9yaWdpbmFs IGxhYmVsLiIKICAgIHRleHQgPSBzZWxmLmV4dHJhY3R0ZXh0KHJlZmVyZW5jZS5kZXN0aW5hdGlv bikKICAgIGlmIHRleHQ6CiAgICAgIHJlZmVyZW5jZS5jb250ZW50cy5pbnNlcnQoMCwgQ29uc3Rh bnQodGV4dCkpCgogIGRlZiBleHRyYWN0dGV4dChzZWxmLCBjb250YWluZXIpOgogICAgIkV4dHJh Y3QgdGhlIGZpbmFsIHRleHQgZm9yIHRoZSBsYWJlbC4iCiAgICB3aGlsZSBub3QgaGFzYXR0cihj b250YWluZXIsICdudW1iZXInKToKICAgICAgaWYgbm90IGhhc2F0dHIoY29udGFpbmVyLCAncGFy ZW50Jyk6CiAgICAgICAgIyBubyBudW1iZXI7IGxhYmVsIG11c3QgYmUgaW4gc29tZSB1bm51bWJl cmVkIGVsZW1lbnQKICAgICAgICByZXR1cm4gTm9uZQogICAgICBjb250YWluZXIgPSBjb250YWlu ZXIucGFyZW50CiAgICByZXR1cm4gY29udGFpbmVyLm51bWJlcgoKY2xhc3MgTWVtb3J5QmFza2V0 KEtlZXBlckJhc2tldCk6CiAgIkEgYmFza2V0IHdoaWNoIHN0b3JlcyBldmVyeXRoaW5nIGluIG1l bW9yeSwgcHJvY2Vzc2VzIGl0IGFuZCB3cml0ZXMgaXQuIgoKICBkZWYgX19pbml0X18oc2VsZik6 CiAgICAiQ3JlYXRlIGFsbCBwcm9jZXNzb3JzIGluIG9uZSBnby4iCiAgICBLZWVwZXJCYXNrZXQu X19pbml0X18oc2VsZikKICAgIHNlbGYucHJvY2Vzc29ycyA9IFsKICAgICAgICBJbnRlZ3JhbExh eW91dCgpLCBJbnRlZ3JhbFRPQygpLCBJbnRlZ3JhbEJpYmxpb0VudHJ5KCksCiAgICAgICAgSW50 ZWdyYWxGbG9hdCgpLCBJbnRlZ3JhbExpc3RPZigpLCBJbnRlZ3JhbFJlZmVyZW5jZSgpCiAgICAg ICAgXQoKICBkZWYgZmluaXNoKHNlbGYpOgogICAgIlByb2Nlc3MgZXZlcnl0aGluZyB3aGljaCBj YW5ub3QgYmUgZG9uZSBpbiBvbmUgcGFzcyBhbmQgd3JpdGUgdG8gZGlzay4iCiAgICBzZWxmLnBy b2Nlc3MoKQogICAgc2VsZi5mbHVzaCgpCgogIGRlZiBwcm9jZXNzKHNlbGYpOgogICAgIlByb2Nl c3MgZXZlcnl0aGluZyB3aXRoIHRoZSBpbnRlZ3JhbCBwcm9jZXNzb3JzLiIKICAgIHNlbGYuc2Vh cmNoaW50ZWdyYWwoKQogICAgZm9yIHByb2Nlc3NvciBpbiBzZWxmLnByb2Nlc3NvcnM6CiAgICAg IHByb2Nlc3Nvci5wcm9jZXNzKCkKCiAgZGVmIHNlYXJjaGludGVncmFsKHNlbGYpOgogICAgIlNl YXJjaCBmb3IgYWxsIGNvbnRhaW5lcnMgZm9yIGFsbCBpbnRlZ3JhbCBwcm9jZXNzb3JzLiIKICAg IGZvciBjb250YWluZXIgaW4gc2VsZi5jb250ZW50czoKICAgICAgIyBjb250YWluZXIudHJlZSgp CiAgICAgIGlmIHNlbGYuaW50ZWdyYWxsb2NhdGUoY29udGFpbmVyKToKICAgICAgICBzZWxmLmlu dGVncmFsc3RvcmUoY29udGFpbmVyKQogICAgICBjb250YWluZXIubG9jYXRlcHJvY2VzcyhzZWxm LmludGVncmFsbG9jYXRlLCBzZWxmLmludGVncmFsc3RvcmUpCgogIGRlZiBpbnRlZ3JhbGxvY2F0 ZShzZWxmLCBjb250YWluZXIpOgogICAgIkxvY2F0ZSBhbGwgaW50ZWdyYWxzLiIKICAgIGZvciBw cm9jZXNzb3IgaW4gc2VsZi5wcm9jZXNzb3JzOgogICAgICBpZiBwcm9jZXNzb3IubG9jYXRlKGNv bnRhaW5lcik6CiAgICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBGYWxzZQoKICBkZWYgaW50 ZWdyYWxzdG9yZShzZWxmLCBjb250YWluZXIpOgogICAgIlN0b3JlIGEgY29udGFpbmVyIGluIG9u ZSBvciBtb3JlIHByb2Nlc3NvcnMuIgogICAgZm9yIHByb2Nlc3NvciBpbiBzZWxmLnByb2Nlc3Nv cnM6CiAgICAgIGlmIHByb2Nlc3Nvci5sb2NhdGUoY29udGFpbmVyKToKICAgICAgICBwcm9jZXNz b3Iuc3RvcmUoY29udGFpbmVyKQoKY2xhc3MgSW50ZWdyYWxMaW5rKEludGVncmFsUHJvY2Vzc29y KToKICAiSW50ZWdyYWwgbGluayBwcm9jZXNzaW5nIGZvciBtdWx0aS1wYWdlIG91dHB1dC4iCgog IHByb2Nlc3NlZHR5cGUgPSBMaW5rCgogIGRlZiBwcm9jZXNzZWFjaChzZWxmLCBsaW5rKToKICAg ICJQcm9jZXNzIGVhY2ggbGluayBhbmQgYWRkIHRoZSBjdXJyZW50IHBhZ2UuIgogICAgbGluay5w YWdlID0gc2VsZi5wYWdlCgpjbGFzcyBTcGxpdHRpbmdCYXNrZXQoQmFza2V0KToKICAiQSBiYXNr ZXQgdXNlZCB0byBzcGxpdCB0aGUgb3V0cHV0IGluIGRpZmZlcmVudCBmaWxlcy4iCgogIGJhc2tl dHMgPSBbXQoKICBkZWYgc2V0d3JpdGVyKHNlbGYsIHdyaXRlcik6CiAgICBpZiBub3QgaGFzYXR0 cih3cml0ZXIsICdmaWxlbmFtZScpIG9yIG5vdCB3cml0ZXIuZmlsZW5hbWU6CiAgICAgIFRyYWNl LmVycm9yKCdDYW5ub3QgdXNlIHN0YW5kYXJkIG91dHB1dCBmb3Igc3BsaXQgb3V0cHV0OyAnICsK ICAgICAgICAgICdwbGVhc2Ugc3VwcGx5IGFuIG91dHB1dCBmaWxlbmFtZS4nKQogICAgICBleGl0 KCkKICAgIHNlbGYud3JpdGVyID0gd3JpdGVyCiAgICBzZWxmLmJhc2UsIHNlbGYuZXh0ZW5zaW9u ID0gb3MucGF0aC5zcGxpdGV4dCh3cml0ZXIuZmlsZW5hbWUpCiAgICBzZWxmLmNvbnZlcnRlciA9 IFRPQ0NvbnZlcnRlcigpCiAgICBzZWxmLmJhc2tldCA9IE1lbW9yeUJhc2tldCgpCiAgICByZXR1 cm4gc2VsZgoKICBkZWYgd3JpdGUoc2VsZiwgY29udGFpbmVyKToKICAgICJXcml0ZSBhIGNvbnRh aW5lciwgcG9zc2libHkgc3BsaXR0aW5nIHRoZSBmaWxlLiIKICAgIHNlbGYuYmFza2V0LndyaXRl KGNvbnRhaW5lcikKCiAgZGVmIGZpbmlzaChzZWxmKToKICAgICJQcm9jZXNzIHRoZSB3aG9sZSBi YXNrZXQsIGNyZWF0ZSBwYWdlIGJhc2tldHMgYW5kIGZsdXNoIGFsbCBvZiB0aGVtLiIKICAgIHNl bGYuYmFza2V0LnByb2Nlc3MoKQogICAgYmFza2V0ID0gc2VsZi5hZGRiYXNrZXQoc2VsZi53cml0 ZXIpCiAgICBmb3IgY29udGFpbmVyIGluIHNlbGYuYmFza2V0LmNvbnRlbnRzOgogICAgICBpZiBz ZWxmLm11c3RzcGxpdChjb250YWluZXIpOgogICAgICAgIGZpbGVuYW1lID0gc2VsZi5nZXRmaWxl bmFtZShjb250YWluZXIpCiAgICAgICAgVHJhY2UuZGVidWcoJ05ldyBwYWdlICcgKyBmaWxlbmFt ZSkKICAgICAgICBiYXNrZXQud3JpdGUoTHlYRm9vdGVyKCkpCiAgICAgICAgYmFza2V0ID0gc2Vs Zi5hZGRiYXNrZXQoTGluZVdyaXRlcihmaWxlbmFtZSkpCiAgICAgICAgYmFza2V0LndyaXRlKEx5 WEhlYWRlcigpKQogICAgICBiYXNrZXQud3JpdGUoY29udGFpbmVyKQogICAgZm9yIGJhc2tldCBp biBzZWxmLmJhc2tldHM6CiAgICAgIGJhc2tldC5wcm9jZXNzKCkKICAgIGZvciBiYXNrZXQgaW4g c2VsZi5iYXNrZXRzOgogICAgICBiYXNrZXQuZmx1c2goKQoKICBkZWYgYWRkYmFza2V0KHNlbGYs IHdyaXRlcik6CiAgICAiQWRkIGEgbmV3IGJhc2tldC4iCiAgICBiYXNrZXQgPSBNZW1vcnlCYXNr ZXQoKQogICAgYmFza2V0LnNldHdyaXRlcih3cml0ZXIpCiAgICBzZWxmLmJhc2tldHMuYXBwZW5k KGJhc2tldCkKICAgICMgc2V0IHRoZSBwYWdlIG5hbWUgZXZlcnl3aGVyZQogICAgYmFza2V0LnBh Z2UgPSB3cml0ZXIuZmlsZW5hbWUKICAgIGludGVncmFsbGluayA9IEludGVncmFsTGluaygpCiAg ICBpbnRlZ3JhbGxpbmsucGFnZSA9IG9zLnBhdGguYmFzZW5hbWUoYmFza2V0LnBhZ2UpCiAgICBi YXNrZXQucHJvY2Vzc29ycyA9IFtpbnRlZ3JhbGxpbmtdCiAgICByZXR1cm4gYmFza2V0CgogIGRl ZiBtdXN0c3BsaXQoc2VsZiwgY29udGFpbmVyKToKICAgICJGaW5kIG91dCBpZiB0aGUgb3B1dHB1 dCBmaWxlIGhhcyB0byBiZSBzcGxpdCBhdCB0aGlzIGVudHJ5LiIKICAgIGlmIHNlbGYuc3BsaXRh bG9uZShjb250YWluZXIpOgogICAgICByZXR1cm4gVHJ1ZQogICAgaWYgbm90IGhhc2F0dHIoY29u dGFpbmVyLCAnZW50cnknKToKICAgICAgcmV0dXJuIEZhbHNlCiAgICBlbnRyeSA9IHNlbGYuY29u dmVydGVyLmNvbnZlcnQoY29udGFpbmVyKQogICAgaWYgbm90IGVudHJ5OgogICAgICByZXR1cm4g RmFsc2UKICAgIGlmIGhhc2F0dHIoZW50cnksICdzcGxpdCcpOgogICAgICByZXR1cm4gVHJ1ZQog ICAgcmV0dXJuIGVudHJ5LmRlcHRoIDw9IE9wdGlvbnMuc3BsaXRwYXJ0CgogIGRlZiBzcGxpdGFs b25lKHNlbGYsIGNvbnRhaW5lcik6CiAgICAiRmluZCBvdXQgaWYgdGhlIGNvbnRhaW5lciBtdXN0 IGJlIHNwbGl0IGluIGl0cyBvd24gcGFnZS4iCiAgICBmb3VuZCA9IFtdCiAgICBjb250YWluZXIu bG9jYXRlcHJvY2VzcygKICAgICAgICBsYW1iZGEgY29udGFpbmVyOiBjb250YWluZXIuX19jbGFz c19fIGluIFtQcmludE5vbWVuY2xhdHVyZSwgUHJpbnRJbmRleF0sCiAgICAgICAgbGFtYmRhIGNv bnRhaW5lcjogZm91bmQuYXBwZW5kKGNvbnRhaW5lci5fX2NsYXNzX18uX19uYW1lX18pKQogICAg aWYgbm90IGZvdW5kOgogICAgICByZXR1cm4gRmFsc2UKICAgIGNvbnRhaW5lci5kZXB0aCA9IDAK ICAgIGNvbnRhaW5lci5zcGxpdCA9IGZvdW5kWzBdLmxvd2VyKCkucmVwbGFjZSgncHJpbnQnLCAn JykKICAgIHJldHVybiBUcnVlCgogIGRlZiBnZXRmaWxlbmFtZShzZWxmLCBjb250YWluZXIpOgog ICAgIkdldCB0aGUgbmV3IGZpbGUgbmFtZSBmb3IgYSBnaXZlbiBjb250YWluZXIuIgogICAgaWYg aGFzYXR0cihjb250YWluZXIsICdzcGxpdCcpOgogICAgICBwYXJ0bmFtZSA9ICctJyArIGNvbnRh aW5lci5zcGxpdAogICAgZWxzZToKICAgICAgZW50cnkgPSBzZWxmLmNvbnZlcnRlci5jb252ZXJ0 KGNvbnRhaW5lcikKICAgICAgaWYgZW50cnkuZGVwdGggPT0gT3B0aW9ucy5zcGxpdHBhcnQ6CiAg ICAgICAgcGFydG5hbWUgPSAnLScgKyBjb250YWluZXIubnVtYmVyCiAgICAgIGVsc2U6CiAgICAg ICAgcGFydG5hbWUgPSAnLScgKyBjb250YWluZXIudHlwZSArICctJyArIGNvbnRhaW5lci5udW1i ZXIKICAgIHJldHVybiBzZWxmLmJhc2UgKyBwYXJ0bmFtZSArIHNlbGYuZXh0ZW5zaW9uCgoKCgoK CmNsYXNzIFBlbmRpbmdMaXN0KG9iamVjdCk6CiAgIkEgcGVuZGluZyBsaXN0IgoKICBkZWYgX19p bml0X18oc2VsZik6CiAgICBzZWxmLmNvbnRlbnRzID0gW10KICAgIHNlbGYudHlwZSA9IE5vbmUK CiAgZGVmIGFkZGl0ZW0oc2VsZiwgaXRlbSk6CiAgICAiQWRkIGEgbGlzdCBpdGVtIgogICAgc2Vs Zi5jb250ZW50cyArPSBpdGVtLmNvbnRlbnRzCiAgICBpZiBub3Qgc2VsZi50eXBlOgogICAgICBz ZWxmLnR5cGUgPSBpdGVtLnR5cGUKCiAgZGVmIGFkZGRlZXBlcihzZWxmLCBkZWVwZXIpOgogICAg IkFkZCBhIGRlZXBlciBsaXN0IGl0ZW0iCiAgICBpZiBzZWxmLmVtcHR5KCk6CiAgICAgIHNlbGYu aW5zZXJ0ZmFrZSgpCiAgICBpdGVtID0gc2VsZi5jb250ZW50c1stMV0KICAgIHNlbGYuY29udGVu dHNbLTFdLmNvbnRlbnRzICs9IGRlZXBlci5jb250ZW50cwoKICBkZWYgZ2VuZXJhdGUoc2VsZik6 CiAgICAiR2V0IHRoZSByZXN1bHRpbmcgbGlzdCIKICAgIGlmIG5vdCBzZWxmLnR5cGU6CiAgICAg IHRhZyA9ICd1bCcKICAgIGVsc2U6CiAgICAgIHRhZyA9IFRhZ0NvbmZpZy5saXN0aXRlbXNbc2Vs Zi50eXBlXQogICAgdGV4dCA9IFRhZ2dlZFRleHQoKS5jb21wbGV0ZShzZWxmLmNvbnRlbnRzLCB0 YWcsIFRydWUpCiAgICBzZWxmLl9faW5pdF9fKCkKICAgIHJldHVybiB0ZXh0CgogIGRlZiBpc2R1 ZXdpdGhpdGVtKHNlbGYsIGl0ZW0pOgogICAgIkRlY2lkZSB3aGV0aGVyIHRoZSBwZW5kaW5nIGxp c3QgbXVzdCBiZSBnZW5lcmF0ZWQgYmVmb3JlIHRoZSBnaXZlbiBpdGVtIgogICAgaWYgbm90IHNl bGYudHlwZToKICAgICAgcmV0dXJuIEZhbHNlCiAgICBpZiBzZWxmLnR5cGUgIT0gaXRlbS50eXBl OgogICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIEZhbHNlCgogIGRlZiBpc2R1ZXdpdGhuZXh0 KHNlbGYsIG5leHQpOgogICAgIkFwcGxpZXMgb25seSBpZiB0aGUgbGlzdCBpcyBmaW5pc2hlZCB3 aXRoIG5leHQgaXRlbS4iCiAgICBpZiBub3QgbmV4dDoKICAgICAgcmV0dXJuIFRydWUKICAgIGlm IG5vdCBpc2luc3RhbmNlKG5leHQsIExpc3RJdGVtKSBhbmQgbm90IGlzaW5zdGFuY2UobmV4dCwg RGVlcGVyTGlzdCk6CiAgICAgIHJldHVybiBUcnVlCiAgICByZXR1cm4gRmFsc2UKCiAgZGVmIGVt cHR5KHNlbGYpOgogICAgcmV0dXJuIGxlbihzZWxmLmNvbnRlbnRzKSA9PSAwCgogIGRlZiBpbnNl cnRmYWtlKHNlbGYpOgogICAgIkluc2VydCBhIGZha2UgaXRlbSIKICAgIGl0ZW0gPSBUYWdnZWRU ZXh0KCkuY29uc3RhbnQoJycsICdsaSBjbGFzcz0ibmVzdGVkIicsIFRydWUpCiAgICBzZWxmLmNv bnRlbnRzID0gW2l0ZW1dCiAgICBzZWxmLnR5cGUgPSAnSXRlbWl6ZScKCiAgZGVmIF9fdW5pY29k ZV9fKHNlbGYpOgogICAgcmVzdWx0ID0gJ3BlbmRpbmcgJyArIHVuaWNvZGUoc2VsZi50eXBlKSAr ICc6IFsnCiAgICBmb3IgZWxlbWVudCBpbiBzZWxmLmNvbnRlbnRzOgogICAgICByZXN1bHQgKz0g dW5pY29kZShlbGVtZW50KSArICcsICcKICAgIGlmIGxlbihzZWxmLmNvbnRlbnRzKSA+IDA6CiAg ICAgIHJlc3VsdCA9IHJlc3VsdFs6LTJdCiAgICByZXR1cm4gcmVzdWx0ICsgJ10nCgpjbGFzcyBQ b3N0TGlzdEl0ZW0ob2JqZWN0KToKICAiUG9zdHByb2Nlc3MgYSBsaXN0IGl0ZW0iCgogIHByb2Nl c3NlZGNsYXNzID0gTGlzdEl0ZW0KCiAgZGVmIHBvc3Rwcm9jZXNzKHNlbGYsIGxhc3QsIGl0ZW0s IG5leHQpOgogICAgIkFkZCB0aGUgaXRlbSB0byBwZW5kaW5nIGFuZCByZXR1cm4gYW4gZW1wdHkg aXRlbSIKICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYucG9zdHByb2Nlc3NvciwgJ2xpc3QnKToKICAg ICAgc2VsZi5wb3N0cHJvY2Vzc29yLmxpc3QgPSBQZW5kaW5nTGlzdCgpCiAgICBzZWxmLnBvc3Rw cm9jZXNzb3IubGlzdC5hZGRpdGVtKGl0ZW0pCiAgICBpZiBzZWxmLnBvc3Rwcm9jZXNzb3IubGlz dC5pc2R1ZXdpdGhuZXh0KG5leHQpOgogICAgICByZXR1cm4gc2VsZi5wb3N0cHJvY2Vzc29yLmxp c3QuZ2VuZXJhdGUoKQogICAgaWYgaXNpbnN0YW5jZShuZXh0LCBMaXN0SXRlbSkgYW5kIHNlbGYu cG9zdHByb2Nlc3Nvci5saXN0LmlzZHVld2l0aGl0ZW0obmV4dCk6CiAgICAgIHJldHVybiBzZWxm LnBvc3Rwcm9jZXNzb3IubGlzdC5nZW5lcmF0ZSgpCiAgICByZXR1cm4gQmxhY2tCb3goKQoKY2xh c3MgUG9zdERlZXBlckxpc3Qob2JqZWN0KToKICAiUG9zdHByb2Nlc3MgYSBkZWVwZXIgbGlzdCIK CiAgcHJvY2Vzc2VkY2xhc3MgPSBEZWVwZXJMaXN0CgogIGRlZiBwb3N0cHJvY2VzcyhzZWxmLCBs YXN0LCBkZWVwZXIsIG5leHQpOgogICAgIkFwcGVuZCB0byB0aGUgbGlzdCBpbiB0aGUgcG9zdHBy b2Nlc3NvciIKICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYucG9zdHByb2Nlc3NvciwgJ2xpc3QnKToK ICAgICAgc2VsZi5wb3N0cHJvY2Vzc29yLmxpc3QgPSBQZW5kaW5nTGlzdCgpCiAgICBzZWxmLnBv c3Rwcm9jZXNzb3IubGlzdC5hZGRkZWVwZXIoZGVlcGVyKQogICAgaWYgc2VsZi5wb3N0cHJvY2Vz c29yLmxpc3QuaXNkdWV3aXRobmV4dChuZXh0KToKICAgICAgcmV0dXJuIHNlbGYucG9zdHByb2Nl c3Nvci5saXN0LmdlbmVyYXRlKCkKICAgIHJldHVybiBCbGFja0JveCgpCgpQb3N0cHJvY2Vzc29y LnN0YWdlcyArPSBbUG9zdExpc3RJdGVtLCBQb3N0RGVlcGVyTGlzdF0KCgoKCgoKY2xhc3MgUG9z dFRhYmxlKG9iamVjdCk6CiAgIlBvc3Rwcm9jZXNzIGEgdGFibGUiCgogIHByb2Nlc3NlZGNsYXNz ID0gVGFibGUKCiAgZGVmIHBvc3Rwcm9jZXNzKHNlbGYsIGxhc3QsIHRhYmxlLCBuZXh0KToKICAg ICJQb3N0cHJvY2VzcyBhIHRhYmxlOiBsb25nIHRhYmxlLCBtdWx0aWNvbHVtbiByb3dzIgogICAg c2VsZi5sb25ndGFibGUodGFibGUpCiAgICBmb3Igcm93IGluIHRhYmxlLmNvbnRlbnRzOgogICAg ICBpbmRleCA9IDAKICAgICAgd2hpbGUgaW5kZXggPCBsZW4ocm93LmNvbnRlbnRzKToKICAgICAg ICBzZWxmLmNoZWNrbXVsdGljb2x1bW4ocm93LCBpbmRleCkKICAgICAgICBpbmRleCArPSAxCiAg ICByZXR1cm4gdGFibGUKCiAgZGVmIGxvbmd0YWJsZShzZWxmLCB0YWJsZSk6CiAgICAiUG9zdHBy b2Nlc3MgYSBsb25nIHRhYmxlLCByZW1vdmluZyB1bndhbnRlZCByb3dzIgogICAgaWYgbm90ICdm ZWF0dXJlcycgaW4gdGFibGUucGFyYW1ldGVyczoKICAgICAgcmV0dXJuCiAgICBmZWF0dXJlcyA9 IHRhYmxlLnBhcmFtZXRlcnNbJ2ZlYXR1cmVzJ10KICAgIGlmIG5vdCAnaXNsb25ndGFibGUnIGlu IGZlYXR1cmVzOgogICAgICByZXR1cm4KICAgIGlmIGZlYXR1cmVzWydpc2xvbmd0YWJsZSddICE9 ICd0cnVlJzoKICAgICAgcmV0dXJuCiAgICBpZiBzZWxmLmhhc3Jvdyh0YWJsZSwgJ2VuZGZpcnN0 aGVhZCcpOgogICAgICBzZWxmLnJlbW92ZXJvd3ModGFibGUsICdlbmRoZWFkJykKICAgIGlmIHNl bGYuaGFzcm93KHRhYmxlLCAnZW5kbGFzdGZvb3QnKToKICAgICAgc2VsZi5yZW1vdmVyb3dzKHRh YmxlLCAnZW5kZm9vdCcpCgogIGRlZiBoYXNyb3coc2VsZiwgdGFibGUsIGF0dHJuYW1lKToKICAg ICJGaW5kIG91dCBpZiB0aGUgdGFibGUgaGFzIGEgcm93IG9mIGZpcnN0IGhlYWRzIgogICAgZm9y IHJvdyBpbiB0YWJsZS5jb250ZW50czoKICAgICAgaWYgYXR0cm5hbWUgaW4gcm93LnBhcmFtZXRl cnM6CiAgICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBGYWxzZQoKICBkZWYgcmVtb3Zlcm93 cyhzZWxmLCB0YWJsZSwgYXR0cm5hbWUpOgogICAgIlJlbW92ZSB0aGUgaGVhZCByb3dzLCBzaW5j ZSB0aGUgdGFibGUgaGFzIGZpcnN0IGhlYWQgcm93cy4iCiAgICBmb3Igcm93IGluIHRhYmxlLmNv bnRlbnRzOgogICAgICBpZiBhdHRybmFtZSBpbiByb3cucGFyYW1ldGVyczoKICAgICAgICByb3cu b3V0cHV0ID0gRW1wdHlPdXRwdXQoKQoKICBkZWYgY2hlY2ttdWx0aWNvbHVtbihzZWxmLCByb3cs IGluZGV4KToKICAgICJQcm9jZXNzIGEgbXVsdGljb2x1bW4gYXR0cmlidXRlIgogICAgY2VsbCA9 IHJvdy5jb250ZW50c1tpbmRleF0KICAgIGlmIG5vdCBoYXNhdHRyKGNlbGwsICdwYXJhbWV0ZXJz Jykgb3Igbm90ICdtdWx0aWNvbHVtbicgaW4gY2VsbC5wYXJhbWV0ZXJzOgogICAgICByZXR1cm4K ICAgIG1jID0gY2VsbC5wYXJhbWV0ZXJzWydtdWx0aWNvbHVtbiddCiAgICBpZiBtYyAhPSAnMSc6 CiAgICAgIFRyYWNlLmVycm9yKCdVbnByb2Nlc3NlZCBtdWx0aWNvbHVtbj0nICsgdW5pY29kZSht dWx0aWNvbHVtbikgKwogICAgICAgICAgJyBjZWxsICcgKyB1bmljb2RlKGNlbGwpKQogICAgICBy ZXR1cm4KICAgIHRvdGFsID0gMQogICAgaW5kZXggKz0gMQogICAgd2hpbGUgc2VsZi5jaGVja2Jv dW5kcyhyb3csIGluZGV4KToKICAgICAgZGVsIHJvdy5jb250ZW50c1tpbmRleF0KICAgICAgdG90 YWwgKz0gMQogICAgY2VsbC5zZXRtdWx0aWNvbHVtbih0b3RhbCkKCiAgZGVmIGNoZWNrYm91bmRz KHNlbGYsIHJvdywgaW5kZXgpOgogICAgIkNoZWNrIGlmIHRoZSBpbmRleCBpcyB3aXRoaW4gYm91 bmRzIGZvciB0aGUgcm93IgogICAgaWYgaW5kZXggPj0gbGVuKHJvdy5jb250ZW50cyk6CiAgICAg IHJldHVybiBGYWxzZQogICAgaWYgbm90ICdtdWx0aWNvbHVtbicgaW4gcm93LmNvbnRlbnRzW2lu ZGV4XS5wYXJhbWV0ZXJzOgogICAgICByZXR1cm4gRmFsc2UKICAgIGlmIHJvdy5jb250ZW50c1tp bmRleF0ucGFyYW1ldGVyc1snbXVsdGljb2x1bW4nXSAhPSAnMic6CiAgICAgIHJldHVybiBGYWxz ZQogICAgcmV0dXJuIFRydWUKClBvc3Rwcm9jZXNzb3Iuc3RhZ2VzLmFwcGVuZChQb3N0VGFibGUp CgoKCgoKCmNsYXNzIFBvc3RGb3JtdWxhKG9iamVjdCk6CiAgIlBvc3Rwcm9jZXNzIGEgZm9ybXVs YSIKCiAgcHJvY2Vzc2VkY2xhc3MgPSBGb3JtdWxhCgogIGRlZiBwb3N0cHJvY2VzcyhzZWxmLCBs YXN0LCBmb3JtdWxhLCBuZXh0KToKICAgICJQb3N0cHJvY2VzcyBhbnkgZm9ybXVsYWUiCiAgICBz ZWxmLnBvc3RudW1iZXJpbmcoZm9ybXVsYSkKICAgIHNlbGYucG9zdGNvbnRlbnRzKGZvcm11bGEu Y29udGVudHMpCiAgICBzZWxmLnBvc3R0cmF2ZXJzZShmb3JtdWxhKQogICAgcmV0dXJuIGZvcm11 bGEKCiAgZGVmIHBvc3RudW1iZXJpbmcoc2VsZiwgZm9ybXVsYSk6CiAgICAiQ2hlY2sgaWYgaXQn cyBhIG51bWJlcmVkIGVxdWF0aW9uLCBpbnNlcnQgbnVtYmVyLiIKICAgIGlmIGZvcm11bGEuaGVh ZGVyWzBdICE9ICdudW1iZXJlZCc6CiAgICAgIHJldHVybgogICAgZm9ybXVsYS5udW1iZXIgPSBO dW1iZXJHZW5lcmF0b3IuaW5zdGFuY2UuZ2VuZXJhdGVjaGFwdGVyZWQoJ2Zvcm11bGEnKQogICAg Zm9ybXVsYS5lbnRyeSA9ICcoJyArIGZvcm11bGEubnVtYmVyICsgJyknCiAgICBmdW5jdGlvbnMg PSBmb3JtdWxhLnNlYXJjaHJlbW92ZShMYWJlbEZ1bmN0aW9uKQogICAgaWYgbGVuKGZ1bmN0aW9u cykgPiAxOgogICAgICBUcmFjZS5lcnJvcignTW9yZSB0aGFuIG9uZSBsYWJlbCBpbiAnICsgdW5p Y29kZShmb3JtdWxhKSkKICAgICAgcmV0dXJuCiAgICBpZiBsZW4oZnVuY3Rpb25zKSA9PSAwOgog ICAgICBsYWJlbCA9IExhYmVsKCkKICAgICAgbGFiZWwuY3JlYXRlKGZvcm11bGEuZW50cnkgKyAn ICcsICdlcS0nICsgZm9ybXVsYS5udW1iZXIsIHR5cGU9ImVxbnVtYmVyIikKICAgIGVsc2U6CiAg ICAgIGxhYmVsID0gZnVuY3Rpb25zWzBdLmxhYmVsCiAgICAgIGxhYmVsLmNvbXBsZXRlKGZvcm11 bGEuZW50cnkgKyAnICcpCiAgICBsYWJlbC5wYXJlbnQgPSBmb3JtdWxhCiAgICBmb3JtdWxhLmNv bnRlbnRzLmluc2VydCgwLCBsYWJlbCkKCiAgZGVmIHBvc3Rjb250ZW50cyhzZWxmLCBjb250ZW50 cyk6CiAgICAiU2VhcmNoIGZvciBzdW0gb3IgaW50ZWdyYWwiCiAgICBmb3IgaW5kZXgsIGJpdCBp biBlbnVtZXJhdGUoY29udGVudHMpOgogICAgICBzZWxmLmNoZWNrbGltaXRlZChjb250ZW50cywg aW5kZXgpCiAgICAgIGlmIGlzaW5zdGFuY2UoYml0LCBGb3JtdWxhQml0KToKICAgICAgICBzZWxm LnBvc3Rjb250ZW50cyhiaXQuY29udGVudHMpCgogIGRlZiBjaGVja2xpbWl0ZWQoc2VsZiwgY29u dGVudHMsIGluZGV4KToKICAgICJDaGVjayBmb3IgYSBjb21tYW5kIHdpdGggbGltaXRzIgogICAg Yml0ID0gY29udGVudHNbaW5kZXhdCiAgICBpZiBub3QgaXNpbnN0YW5jZShiaXQsIEVtcHR5Q29t bWFuZCk6CiAgICAgIHJldHVybgogICAgaWYgbm90IGJpdC5jb21tYW5kIGluIEZvcm11bGFDb25m aWcubGltaXRzWydjb21tYW5kcyddOgogICAgICByZXR1cm4KICAgIGxpbWl0cyA9IHNlbGYuZmlu ZGxpbWl0cyhjb250ZW50cywgaW5kZXggKyAxKQogICAgbGltaXRzLnJldmVyc2UoKQogICAgaWYg bGVuKGxpbWl0cykgPT0gMDoKICAgICAgcmV0dXJuCiAgICB0YWdnZWQgPSBUYWdnZWRCaXQoKS5j b21wbGV0ZShsaW1pdHMsICdzcGFuIGNsYXNzPSJsaW1pdHMiJykKICAgIGNvbnRlbnRzLmluc2Vy dChpbmRleCArIDEsIHRhZ2dlZCkKCiAgZGVmIGZpbmRsaW1pdHMoc2VsZiwgY29udGVudHMsIGlu ZGV4KToKICAgICJGaW5kIHRoZSBsaW1pdHMgZm9yIHRoZSBjb21tYW5kIgogICAgbGltaXRzID0g W10KICAgIHdoaWxlIGluZGV4IDwgbGVuKGNvbnRlbnRzKToKICAgICAgaWYgbm90IHNlbGYuY2hl Y2tsaW1pdHMoY29udGVudHMsIGluZGV4KToKICAgICAgICByZXR1cm4gbGltaXRzCiAgICAgIGxp bWl0cy5hcHBlbmQoY29udGVudHNbaW5kZXhdKQogICAgICBkZWwgY29udGVudHNbaW5kZXhdCiAg ICByZXR1cm4gbGltaXRzCgogIGRlZiBjaGVja2xpbWl0cyhzZWxmLCBjb250ZW50cywgaW5kZXgp OgogICAgIkNoZWNrIGZvciBhIGNvbW1hbmQgbWFraW5nIHRoZSBsaW1pdHMiCiAgICBiaXQgPSBj b250ZW50c1tpbmRleF0KICAgIGlmIG5vdCBpc2luc3RhbmNlKGJpdCwgU3ltYm9sRnVuY3Rpb24p OgogICAgICByZXR1cm4gRmFsc2UKICAgIGlmIG5vdCBiaXQuY29tbWFuZCBpbiBGb3JtdWxhQ29u ZmlnLmxpbWl0c1snb3BlcmFuZHMnXToKICAgICAgcmV0dXJuIEZhbHNlCiAgICBiaXQub3V0cHV0 LnRhZyArPSAnIGNsYXNzPSJiaWdzeW1ib2wiJwogICAgcmV0dXJuIFRydWUKCiAgZGVmIHBvc3R0 cmF2ZXJzZShzZWxmLCBmb3JtdWxhKToKICAgICJUcmF2ZXJzZSBvdmVyIHRoZSBjb250ZW50cyB0 byBhbHRlciB2YXJpYWJsZXMgYW5kIHNwYWNlIHVuaXRzLiIKICAgIGZsYXQgPSBzZWxmLmZsYXR0 ZW4oZm9ybXVsYSkKICAgIGxhc3QgPSBOb25lCiAgICBmb3IgYml0LCBjb250ZW50cyBpbiBzZWxm LnRyYXZlcnNlKGZsYXQpOgogICAgICBpZiBiaXQudHlwZSA9PSAnYWxwaGEnOgogICAgICAgIHNl bGYuaXRhbGljaXplKGJpdCwgY29udGVudHMpCiAgICAgIGVsaWYgYml0LnR5cGUgPT0gJ2ZvbnQn IGFuZCBsYXN0IGFuZCBsYXN0LnR5cGUgPT0gJ251bWJlcic6CiAgICAgICAgYml0LmNvbnRlbnRz Lmluc2VydCgwLCBGb3JtdWxhQ29uc3RhbnQodSfigZ8nKSkKICAgICAgICAjIGxhc3QuY29udGVu dHMuYXBwZW5kKEZvcm11bGFDb25zdGFudCh1J+KBnycpKQogICAgICBsYXN0ID0gYml0CgogIGRl ZiBmbGF0dGVuKHNlbGYsIGJpdCk6CiAgICAiUmV0dXJuIGFsbCBiaXRzIGFzIGEgc2luZ2xlIGxp c3Qgb2YgKGJpdCwgbGlzdCkgcGFpcnMuIgogICAgZmxhdCA9IFtdCiAgICBmb3IgZWxlbWVudCBp biBiaXQuY29udGVudHM6CiAgICAgIGlmIGVsZW1lbnQudHlwZToKICAgICAgICBmbGF0LmFwcGVu ZCgoZWxlbWVudCwgYml0LmNvbnRlbnRzKSkKICAgICAgZWxpZiBpc2luc3RhbmNlKGVsZW1lbnQs IEZvcm11bGFCaXQpOgogICAgICAgIGZsYXQgKz0gc2VsZi5mbGF0dGVuKGVsZW1lbnQpCiAgICBy ZXR1cm4gZmxhdAoKICBkZWYgdHJhdmVyc2Uoc2VsZiwgZmxhdHRlbmVkKToKICAgICJUcmF2ZXJz ZSBlYWNoIChiaXQsIGxpc3QpIHBhaXJzIG9mIHRoZSBmb3JtdWxhLiIKICAgIGZvciBlbGVtZW50 IGluIGZsYXR0ZW5lZDoKICAgICAgeWllbGQgZWxlbWVudAoKICBkZWYgaXRhbGljaXplKHNlbGYs IGJpdCwgY29udGVudHMpOgogICAgIkl0YWxpY2l6ZSB0aGUgZ2l2ZW4gYml0IG9mIHRleHQuIgog ICAgaW5kZXggPSBjb250ZW50cy5pbmRleChiaXQpCiAgICBjb250ZW50c1tpbmRleF0gPSBUYWdn ZWRCaXQoKS5jb21wbGV0ZShbYml0XSwgJ2knKQoKUG9zdHByb2Nlc3Nvci5zdGFnZXMuYXBwZW5k KFBvc3RGb3JtdWxhKQoKCgpjbGFzcyBlTHlYZXJDb252ZXJ0ZXIob2JqZWN0KToKICAiQ29udmVy dGVyIGZvciBhIGRvY3VtZW50IGluIGEgbHl4IGZpbGUuIFBsYWNlcyBhbGwgb3V0cHV0IGluIGEg Z2l2ZW4gYmFza2V0LiIKCiAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgc2VsZi5maWx0ZXJpbmcg PSBGYWxzZQoKICBkZWYgc2V0aW8oc2VsZiwgaW9wYXJzZXIpOgogICAgIlNldCB0aGUgSW5PdXRQ YXJzZXIiCiAgICBzZWxmLnJlYWRlciA9IGlvcGFyc2VyLmdldHJlYWRlcigpCiAgICBzZWxmLmJh c2tldCA9IHNlbGYuZ2V0YmFza2V0KCkKICAgIHNlbGYuYmFza2V0LnNldHdyaXRlcihpb3BhcnNl ci5nZXR3cml0ZXIoKSkKICAgIHJldHVybiBzZWxmCgogIGRlZiBnZXRiYXNrZXQoc2VsZik6CiAg ICAiR2V0IHRoZSBhcHByb3ByaWF0ZSBiYXNrZXQgZm9yIHRoZSBjdXJyZW50IG9wdGlvbnMuIgog ICAgaWYgT3B0aW9ucy50b2M6CiAgICAgIHJldHVybiBUT0NCYXNrZXQoKQogICAgaWYgT3B0aW9u cy5zcGxpdHBhcnQ6CiAgICAgIHJldHVybiBTcGxpdHRpbmdCYXNrZXQoKQogICAgaWYgT3B0aW9u cy5tZW1vcnk6CiAgICAgIHJldHVybiBNZW1vcnlCYXNrZXQoKQogICAgcmV0dXJuIFdyaXRlckJh c2tldCgpCgogIGRlZiBlbWJlZChzZWxmLCByZWFkZXIpOgogICAgIkVtYmVkIHRoZSByZXN1bHRz IGZyb20gYSByZWFkZXIgaW50byBhIG1lbW9yeSBiYXNrZXQuIgogICAgIkhlYWRlciBhbmQgZm9v dGVyIGFyZSBpZ25vcmVkLiBVc2VmdWwgZm9yIGVtYmVkZGluZyBvbmUgZG9jdW1lbnQgaW5zaWRl IGFub3RoZXIuIgogICAgc2VsZi5maWx0ZXJpbmcgPSBUcnVlCiAgICBzZWxmLnJlYWRlciA9IHJl YWRlcgogICAgc2VsZi5iYXNrZXQgPSBNZW1vcnlCYXNrZXQoKQogICAgc2VsZi53cml0ZXIgPSBO dWxsV3JpdGVyKCkKICAgIHJldHVybiBzZWxmCgogIGRlZiBjb252ZXJ0KHNlbGYpOgogICAgIlBl cmZvcm0gdGhlIGNvbnZlcnNpb24gZm9yIHRoZSBkb2N1bWVudCIKICAgIHRyeToKICAgICAgc2Vs Zi5wcm9jZXNzY29udGVudHMoKQogICAgZXhjZXB0IChFeGNlcHRpb24pOgogICAgICBUcmFjZS5l cnJvcignQ29udmVyc2lvbiBmYWlsZWQgYXQgJyArIHNlbGYucmVhZGVyLmN1cnJlbnRsaW5lKCkp CiAgICAgIHJhaXNlCgogIGRlZiBwcm9jZXNzY29udGVudHMoc2VsZik6CiAgICAiUGFyc2UgdGhl IGNvbnRlbnRzIGFuZCB3cml0ZSBpdCBieSBjb250YWluZXJzIgogICAgZmFjdG9yeSA9IENvbnRh aW5lckZhY3RvcnkoKQogICAgc2VsZi5wb3N0cHJvYyA9IFBvc3Rwcm9jZXNzb3IoKQogICAgd2hp bGUgbm90IHNlbGYucmVhZGVyLmZpbmlzaGVkKCk6CiAgICAgIGNvbnRhaW5lciA9IGZhY3Rvcnku Y3JlYXRlY29udGFpbmVyKHNlbGYucmVhZGVyKQogICAgICBpZiBjb250YWluZXIgYW5kIG5vdCBz ZWxmLmZpbHRlcmVkKGNvbnRhaW5lcik6CiAgICAgICAgcmVzdWx0ID0gc2VsZi5wb3N0cHJvYy5w b3N0cHJvY2Vzcyhjb250YWluZXIpCiAgICAgICAgaWYgcmVzdWx0OgogICAgICAgICAgc2VsZi5i YXNrZXQud3JpdGUocmVzdWx0KQogICAgIyBsYXN0IHJvdW5kOiBjbGVhciB0aGUgcGlwZWxpbmUK ICAgIHJlc3VsdCA9IHNlbGYucG9zdHByb2MucG9zdHByb2Nlc3MoTm9uZSkKICAgIGlmIHJlc3Vs dDoKICAgICAgc2VsZi5iYXNrZXQud3JpdGUocmVzdWx0KQogICAgaWYgbm90IHNlbGYuZmlsdGVy aW5nOgogICAgICBzZWxmLmJhc2tldC5maW5pc2goKQoKICBkZWYgZmlsdGVyZWQoc2VsZiwgY29u dGFpbmVyKToKICAgICJGaW5kIG91dCBpZiB0aGUgY29udGFpbmVyIGlzIGEgaGVhZGVyIG9yIGZv b3RlciBhbmQgbXVzdCBiZSBmaWx0ZXJlZC4iCiAgICBpZiBub3Qgc2VsZi5maWx0ZXJpbmc6CiAg ICAgIHJldHVybiBGYWxzZQogICAgaWYgY29udGFpbmVyLl9fY2xhc3NfXyBpbiBbTHlYSGVhZGVy LCBMeVhGb290ZXJdOgogICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIEZhbHNlCgogIGRlZiBn ZXRjb250ZW50cyhzZWxmKToKICAgICJSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBiYXNrZXQu IgogICAgcmV0dXJuIHNlbGYuYmFza2V0LmNvbnRlbnRzCgogIGRlZiBfX3VuaWNvZGVfXyhzZWxm KToKICAgICJQcmludGFibGUgcmVwcmVzZW50YXRpb24uIgogICAgc3RyaW5nID0gJ0NvbnZlcnRl ciB3aXRoIGZpbHRlcmluZyAnICsgdW5pY29kZShzZWxmLmZpbHRlcmluZykKICAgIHN0cmluZyAr PSAnIGFuZCBiYXNrZXQgJyArIHVuaWNvZGUoc2VsZi5iYXNrZXQpCiAgICByZXR1cm4gc3RyaW5n CgpjbGFzcyBJbk91dFBhcnNlcihvYmplY3QpOgogICJQYXJzZSBpbiBhbmQgb3V0IGFyZ3VtZW50 cyIKCiAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgc2VsZi5maWxlaW4gPSBzeXMuc3RkaW4KICAg IHNlbGYuZmlsZW91dCA9IHN5cy5zdGRvdXQKCiAgZGVmIHBhcnNlKHNlbGYsIGFyZ3MpOgogICAg IlBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMiCiAgICBzZWxmLmZpbGVpbiA9IHN5cy5zdGRp bgogICAgc2VsZi5maWxlb3V0ID0gc3lzLnN0ZG91dAogICAgaWYgbGVuKGFyZ3MpIDwgMjoKICAg ICAgVHJhY2UucXVpZXRtb2RlID0gVHJ1ZQogICAgaWYgbGVuKGFyZ3MpID4gMDoKICAgICAgc2Vs Zi5maWxlaW4gPSBhcmdzWzBdCiAgICAgIGRlbCBhcmdzWzBdCiAgICAgIHNlbGYucmVhZGRpcihz ZWxmLmZpbGVpbiwgJ2RpcmVjdG9yeScpCiAgICBlbHNlOgogICAgICBPcHRpb25zLmRpcmVjdG9y eSA9ICcuJwogICAgaWYgbGVuKGFyZ3MpID4gMDoKICAgICAgc2VsZi5maWxlb3V0ID0gYXJnc1sw XQogICAgICBkZWwgYXJnc1swXQogICAgICBzZWxmLnJlYWRkaXIoc2VsZi5maWxlb3V0LCAnZGVz dGRpcmVjdG9yeScpCiAgICBlbHNlOgogICAgICBPcHRpb25zLmRlc3RkaXJlY3RvcnkgPSAnLicK ICAgIGlmIGxlbihhcmdzKSA+IDA6CiAgICAgIHJhaXNlIEV4Y2VwdGlvbignVW51c2VkIGFyZ3Vt ZW50czogJyArIHVuaWNvZGUoYXJncykpCiAgICByZXR1cm4gc2VsZgoKICBkZWYgZ2V0cmVhZGVy KHNlbGYpOgogICAgIkdldCB0aGUgcmVzdWx0aW5nIHJlYWRlci4iCiAgICByZXR1cm4gTGluZVJl YWRlcihzZWxmLmZpbGVpbikKCiAgZGVmIGdldHdyaXRlcihzZWxmKToKICAgICJHZXQgdGhlIHJl c3VsdGluZyB3cml0ZXIuIgogICAgcmV0dXJuIExpbmVXcml0ZXIoc2VsZi5maWxlb3V0KQoKICBk ZWYgcmVhZGRpcihzZWxmLCBmaWxlbmFtZSwgZGlyb3B0aW9uKToKICAgICJSZWFkIHRoZSBjdXJy ZW50IGRpcmVjdG9yeSBpZiBuZWVkZWQiCiAgICBpZiBnZXRhdHRyKE9wdGlvbnMsIGRpcm9wdGlv bikgIT0gTm9uZToKICAgICAgcmV0dXJuCiAgICBzZXRhdHRyKE9wdGlvbnMsIGRpcm9wdGlvbiwg b3MucGF0aC5kaXJuYW1lKGZpbGVuYW1lKSkKICAgIGlmIGdldGF0dHIoT3B0aW9ucywgZGlyb3B0 aW9uKSA9PSAnJzoKICAgICAgc2V0YXR0cihPcHRpb25zLCBkaXJvcHRpb24sICcuJykKCmNsYXNz IE51bGxXcml0ZXIob2JqZWN0KToKICAiQSB3cml0ZXIgdGhhdCBnb2VzIG5vd2hlcmUuIgoKICBk ZWYgd3JpdGUoc2VsZiwgbGlzdCk6CiAgICAiRG8gbm90aGluZy4iCiAgICBwYXNzCgpjbGFzcyBD b252ZXJ0ZXJGYWN0b3J5KG9iamVjdCk6CiAgIkNyZWF0ZSBhIGNvbnZlcnRlciBmaXQgZm9yIGNv bnZlcnRpbmcgYSBmaWxlbmFtZSBhbmQgZW1iZWRkaW5nIHRoZSByZXN1bHQuIgoKICBkZWYgY3Jl YXRlKHNlbGYsIGNvbnRhaW5lcik6CiAgICAiQ3JlYXRlIGEgY29udmVydGVyIGZvciBhIGdpdmVu IGNvbnRhaW5lciwgd2l0aCBmaWxlbmFtZSIKICAgICIgYW5kIHBvc3NpYmx5IG90aGVyIHBhcmFt ZXRlcnMuIgogICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oT3B0aW9ucy5kaXJlY3RvcnksIGNv bnRhaW5lci5maWxlbmFtZSkKICAgIHJlYWRlciA9IExpbmVSZWFkZXIoZnVsbG5hbWUpCiAgICBp ZiAnZmlyc3RsaW5lJyBpbiBjb250YWluZXIucGFyYW1ldGVyczoKICAgICAgcmVhZGVyLnNldHN0 YXJ0KGludChjb250YWluZXIucGFyYW1ldGVyc1snZmlyc3RsaW5lJ10pKQogICAgaWYgJ2xhc3Rs aW5lJyBpbiBjb250YWluZXIucGFyYW1ldGVyczoKICAgICAgcmVhZGVyLnNldGVuZChpbnQoY29u dGFpbmVyLnBhcmFtZXRlcnNbJ2xhc3RsaW5lJ10pKQogICAgcmV0dXJuIGVMeVhlckNvbnZlcnRl cigpLmVtYmVkKHJlYWRlcikKCkluY2x1ZGVJbnNldC5jb252ZXJ0ZXJmYWN0b3J5ID0gQ29udmVy dGVyRmFjdG9yeSgpCgoKCmRlZiBjb252ZXJ0ZG9jKGFyZ3MpOgogICJSZWFkIGEgd2hvbGUgZG9j dW1lbnQgYW5kIHdyaXRlIGl0IgogIE9wdGlvbnMoKS5wYXJzZW9wdGlvbnMoYXJncykKICBpb3Bh cnNlciA9IEluT3V0UGFyc2VyKCkucGFyc2UoYXJncykKICBjb252ZXJ0ZXIgPSBlTHlYZXJDb252 ZXJ0ZXIoKS5zZXRpbyhpb3BhcnNlcikKICBjb252ZXJ0ZXIuY29udmVydCgpCgpkZWYgbWFpbigp OgogICJNYWluIGZ1bmN0aW9uLCBjYWxsZWQgaWYgaW52b2tlZCBmcm9tIHRoZSBjb21tYW5kIGxp bmUiCiAgY29udmVydGRvYyhsaXN0KHN5cy5hcmd2KSkKCmlmIF9fbmFtZV9fID09ICdfX21haW5f Xyc6CiAgbWFpbigpCgo= --0015175ce1e0d57a66047acceb9e-- From MAILER-DAEMON Thu Dec 17 03:16:29 2009 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1NLBXB-0001pO-7a for mharc-elyxer-users@gnu.org; Thu, 17 Dec 2009 03:16:29 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NLBX9-0001nr-I7 for elyxer-users@nongnu.org; Thu, 17 Dec 2009 03:16:27 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NLBX3-0001mA-BK for elyxer-users@nongnu.org; Thu, 17 Dec 2009 03:16:25 -0500 Received: from [199.232.76.173] (port=55504 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NLBX3-0001m1-3S for elyxer-users@nongnu.org; Thu, 17 Dec 2009 03:16:21 -0500 Received: from cc-mserv3.uoregon.edu ([128.223.142.128]:54639 helo=smtp.uoregon.edu) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1NLBX2-0005Og-LM for elyxer-users@nongnu.org; Thu, 17 Dec 2009 03:16:20 -0500 Received: from [10.0.1.5] (c-71-193-176-57.hsd1.wa.comcast.net [71.193.176.57]) (authenticated bits=0) by smtp.uoregon.edu (8.14.3/8.14.3) with ESMTP id nBH8GFIF014679 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NOT) for ; Thu, 17 Dec 2009 00:16:17 -0800 Content-Type: text/plain; charset=iso-8859-1 Mime-Version: 1.0 (Apple Message framework v1077) Subject: Re: [eLyXer-users] brackets with \left. From: =?iso-8859-1?Q?Jens_N=F6ckel?= In-Reply-To: <2110ee000912151540g4bad7141se744f646e578f891@mail.gmail.com> Date: Thu, 17 Dec 2009 00:16:15 -0800 Content-Transfer-Encoding: quoted-printable Message-Id: References: <7F3179F5-A8FA-4ADD-8147-7C5881942723@uoregon.edu> <2110ee000912131446x205e9a5dq362215c52cb17c88@mail.gmail.com> <2110ee000912151540g4bad7141se744f646e578f891@mail.gmail.com> To: eLyXer users X-Mailer: Apple Mail (2.1077) X-Proofpoint-Virus-Version: vendor=fsecure engine=1.12.8161:2.4.5, 1.2.40, 4.0.166 definitions=2009-12-17_02:2009-12-12, 2009-12-17, 2009-12-17 signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 ipscore=0 phishscore=0 bulkscore=0 adultscore=0 classifier=spam adjust=-45 reason=mlx engine=5.0.0-0908210000 definitions=main-0912170002 X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 3) X-BeenThere: elyxer-users@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: eLyXer users List-Id: eLyXer users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 17 Dec 2009 08:16:28 -0000 Hi Alex, yes - the \left. and \right. are now ignored. Just for fun I tried a = different replacement by adding the following in "onefunctions": u'\\left.':u'', u'\\right.':u'' That way, one would still have the invisible brackets marked by unused = spans in the HTML output, and this could be used for later = postprocessing. I'm not saying this needs to be in elyxer right now - = I'm only experimenting to see what elyxer lets me do. Perhaps vertical = scaling of brackets could be simulated by using the = display:inline-block; style on a span that encloses the bracketed = content (I see you already use that for fractions). I guess it will = require Javascript to get the height of the enclosing box and scale = brackets before/after that box to match that height. Well, that sounds = like a lot of work, and in fact more like a case for MathML... but one = can dream, right? As for the tester honors, feel free to count me in. I'll keep using = elyxer in various different situations in the future. Cheers, Jens On Dec 15, 2009, at 3:40 PM, Alex Fernandez wrote: > Hi Jens, >=20 > Thanks for the explanation. >=20 > On Mon, Dec 14, 2009 at 7:54 AM, Jens N=F6ckel = wrote: >> The current version of elyxer doesn't seem to have any vertical size >> adjustment of brackets to match, say, enclosed fractions in vertical = height. >> So the \left. and \right. constructs really serve no purpose here, = and one >> could simply throw them away for now. >=20 > Good idea. I implemented it, please find attached a prerelease version > of elyxer.py. If you use it in place of your version, does it do what > you expect it to do? >=20 > By the way, can I add your name to the list at > http://www.nongnu.org/elyxer/ > as a tester? I really appreciate the work you people do. >=20 > Alex. > Jens U. N=F6ckel Associate Professor Department of Physics University of Oregon http://www.uoregon.edu/~noeckel/ From MAILER-DAEMON Sat Dec 19 07:06:30 2009 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1NLy4s-0002Xk-9C for mharc-elyxer-users@gnu.org; Sat, 19 Dec 2009 07:06:30 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NLy4q-0002XX-T2 for elyxer-users@nongnu.org; Sat, 19 Dec 2009 07:06:28 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NLy4l-0002Wi-FI for elyxer-users@nongnu.org; Sat, 19 Dec 2009 07:06:27 -0500 Received: from [199.232.76.173] (port=49083 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NLy4l-0002Wf-AE for elyxer-users@nongnu.org; Sat, 19 Dec 2009 07:06:23 -0500 Received: from mail-bw0-f212.google.com ([209.85.218.212]:53507) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NLy4k-0004yz-SR for elyxer-users@nongnu.org; Sat, 19 Dec 2009 07:06:23 -0500 Received: by bwz4 with SMTP id 4so2684573bwz.2 for ; Sat, 19 Dec 2009 04:06:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:received:in-reply-to :references:date:x-google-sender-auth:message-id:subject:from:to :content-type:content-transfer-encoding; bh=CD6eSGx1QXe4ya6/HdCdncFvZ4wN08oZNNX2XT8eL9Y=; b=Sn951OnWCsXp3B6U1suaV5a1HudL+Cxf11iaWSFkqUQeYOSaonbzLsw7t13vtv5AIQ NLwOp74nxHjROTV+MwbOvZZ3A3KoDyfnwYwXaVV6EGlMS+N+sMo/YAThp3/G8b1UI5MT draoW6M+nHmEFWTSMZ3tR9vmvdkkqaW34rHZo= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:content-type :content-transfer-encoding; b=upmJsVBKGCx+pFu0d0l0lJ3F4YiGet03kZ2zIUnlSsft1romjb0/RFSxdcdBy24mE5 8PgRa8vFzpisbZ3q+1b1v4AKzpZS6FpTi5MEC873xosVp4FlZb2IJKQVz2FB6Rvv5Og4 /5W07ELiedTtOU1FmsovpQxSXwVkEF0PtC0xY= MIME-Version: 1.0 Sender: alejandrofer@gmail.com Received: by 10.204.148.71 with SMTP id o7mr3084141bkv.144.1261224380850; Sat, 19 Dec 2009 04:06:20 -0800 (PST) In-Reply-To: References: <7F3179F5-A8FA-4ADD-8147-7C5881942723@uoregon.edu> <2110ee000912131446x205e9a5dq362215c52cb17c88@mail.gmail.com> <2110ee000912151540g4bad7141se744f646e578f891@mail.gmail.com> Date: Sat, 19 Dec 2009 13:06:20 +0100 X-Google-Sender-Auth: 1f9bcf95ad5a6ba3 Message-ID: <2110ee000912190406s1edefde3sb9d65f9db0140d2@mail.gmail.com> Subject: Re: [eLyXer-users] brackets with \left. From: Alex Fernandez To: eLyXer users Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) X-BeenThere: elyxer-users@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: eLyXer users List-Id: eLyXer users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 19 Dec 2009 12:06:29 -0000 Hi Jens, On Thu, Dec 17, 2009 at 9:16 AM, Jens N=F6ckel wrote: > yes - the \left. and \right. are now ignored. Just for fun I tried a diff= erent replacement by adding the following in "onefunctions": > u'\\left.':u'', > u'\\right.':u'' > That way, one would still have the invisible brackets marked by unused sp= ans in the HTML output, and this could be used for later postprocessing. Good idea, added to the code (even if the spans do nothing right now). > I'm not saying this needs to be in elyxer right now - I'm only experiment= ing to see what elyxer lets me do. Perhaps vertical scaling of brackets cou= ld be simulated by using the display:inline-block; style on a span that enc= loses the bracketed content (I see you already use that for fractions). I g= uess it will require Javascript to get the height of the enclosing box and = scale brackets before/after that box to match that height. Well, that sound= s like a lot of work, and in fact more like a case for MathML... but one ca= n dream, right? Using Javascript is an interesting idea, e.g. for brackets (right now I am not able to scale them using CSS). As to MathML, I am not opposed to it in the least, but don't know enough about it to do a good implementation. I will add it to the roadmap in the dev guide for Q2 2010: http://www.nongnu.org/elyxer/devguide.html > As for the tester honors, feel free to count me in. I'll keep using elyxe= r in various different situations in the future. Done! I will hopefully release 0.39 during the weekend. Please report any further issues, they are fun to solve! Thanks, Alex. From MAILER-DAEMON Sat Dec 19 16:01:37 2009 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1NM6Qj-0004tZ-Hi for mharc-elyxer-users@gnu.org; Sat, 19 Dec 2009 16:01:37 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NM5gx-0004EX-1b for elyxer-users@nongnu.org; Sat, 19 Dec 2009 15:14:19 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NM5gv-0004EL-KJ for elyxer-users@nongnu.org; Sat, 19 Dec 2009 15:14:17 -0500 Received: from [199.232.76.173] (port=51673 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NM5gv-0004EI-EP for elyxer-users@nongnu.org; Sat, 19 Dec 2009 15:14:17 -0500 Received: from fg-out-1718.google.com ([72.14.220.157]:19983) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NM5gu-00051a-Nu for elyxer-users@nongnu.org; Sat, 19 Dec 2009 15:14:17 -0500 Received: by fg-out-1718.google.com with SMTP id e12so910920fga.10 for ; Sat, 19 Dec 2009 12:14:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :from:date:message-id:subject:to:content-type :content-transfer-encoding; bh=n/juqlYb+QBCOcqYygGHO1SgmQMPsFY8z54DYp+KnW0=; b=Kt6ABBaEadISvdy811Xxol4D1DhWPX4dgYhD3yqlcVBqZtwkQq4XLx/8/i/6gAePUi S9FozKAUe/ZWX2jQBzIASRn8A8EvJ++hd0+HRQw2j/BOUxZGpBAqm3g6EJct+Zp4HYKX HqwziCn5cgomC2tsKHERsRDNqTjAg2JdTAnfY= DomainKey-Signature: a=rsa-sha1; c=nofws; d=googlemail.com; s=gamma; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :content-type:content-transfer-encoding; b=uC1VJ+uF6SpV82WL9AV3z8NRVYZBOx+DGMZSrYps3KCKCtS1ciWpDqjL4f5Q0nku6F u+TKGDdSNTfZnDbmxajFoe/lWnl+r1IyVcp+ubVza7Y8wFoRmtOjn1nuH/D/2KADShYH 5svPzIoQD6LUJK6JTRryOs511WdHnHPSOvtWI= MIME-Version: 1.0 Received: by 10.239.186.71 with SMTP id f7mr20809hbh.210.1261253655091; Sat, 19 Dec 2009 12:14:15 -0800 (PST) In-Reply-To: <7F3179F5-A8FA-4ADD-8147-7C5881942723@uoregon.edu> References: <7F3179F5-A8FA-4ADD-8147-7C5881942723@uoregon.edu> From: Ken Date: Sat, 19 Dec 2009 20:13:55 +0000 Message-ID: <569dd48b0912191213n67affd6dkb870665f09068b8a@mail.gmail.com> Subject: Re: [eLyXer-users] brackets with \left. To: eLyXer users Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) X-Mailman-Approved-At: Sat, 19 Dec 2009 16:01:36 -0500 X-BeenThere: elyxer-users@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: eLyXer users List-Id: eLyXer users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 19 Dec 2009 20:14:19 -0000 Hi Alex, Is there an easy way for be to obtain the latest version without git? I am a Windows user and usually a TortoiseSVN user and don't know how to use git. Is it possible to download the script from a webpage? Thanks, Ken 2009/12/13 Jens N=F6ckel : > Hi, > first of all thanks for making elyxer availble - I've installed it on my = Mac > for HTML generation from LyX and it's really promising, with great progre= ss > in a very short time. > > The reason I'm writing is that elyxer gives wrong HTML output for bracket= s > such as > \left. something \right) > where I use the \left. to balance the right bracket with an invisible > delimiter. In the HTML output the left delimiter appears as a dot because > the \left tab is recognized as a "onefunction" and immediately translated= by > inserting the symbol that follows. > > I've looked a little at the code and see a Bracket class, but if I > understand correctly it seems to be used only by the pair [ and ], and it > also doesn't leave a trace in the HTML output (i.e., there is no surround= ing > in the formula corresponding to the extent of the bracketed conten= t). > But I'm still trying to learn the logic of the code, so correct me if I'm > wrong... Ultimately I think the \left and \right tokens should count as > bracket delimiters, and some way of handling the invisible bracket for > \left. or \right. is needed. > > Right now I can fix this by post-processing the HTML do remove the > . > But I'm thinking that the Bracket class is probably the place where this > could be fixed. > > Cheers, > Jens > > > > From MAILER-DAEMON Sat Dec 19 17:16:50 2009 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1NM7bW-0005Nn-5p for mharc-elyxer-users@gnu.org; Sat, 19 Dec 2009 17:16:50 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NM7bU-0005NN-5s for elyxer-users@nongnu.org; Sat, 19 Dec 2009 17:16:48 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NM7bO-0005EI-VS for elyxer-users@nongnu.org; Sat, 19 Dec 2009 17:16:47 -0500 Received: from [199.232.76.173] (port=47298 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NM7bO-0005Dp-QB for elyxer-users@nongnu.org; Sat, 19 Dec 2009 17:16:42 -0500 Received: from mail-bw0-f212.google.com ([209.85.218.212]:49228) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NM7bO-0005ko-EA for elyxer-users@nongnu.org; Sat, 19 Dec 2009 17:16:42 -0500 Received: by bwz4 with SMTP id 4so2867709bwz.2 for ; Sat, 19 Dec 2009 14:16:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:received:date :x-google-sender-auth:message-id:subject:from:to:content-type :content-transfer-encoding; bh=dJe/kqOtSUz4Sox6xIVedtDfAXle0UGdqhRzxGNuUow=; b=rk4C/pENGfFu8fQQjm/Lqd2chU1PyaFVc5jdemFh+pvPRN/FMQAbJ9UHEfRzsES/1K xDDy7uSgoNQW2PiAKtBLlxoDrpYVGAR2hUMMfSFer/UZwQlR9AFXIWsPfL+Pz4fBVmuv tBBwqZi4rCSUR6lWczs0YIkWgCrHgiy7b6960= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:date:x-google-sender-auth:message-id:subject :from:to:content-type:content-transfer-encoding; b=DiAqQI7VILZcD+wsKjYhrCmdGp6w4UUHq3WaKui0XwEQ0BCqezi3p4CokzyCWSMay/ pRKine1Dk82XEUREP4ir89RSJeUzfu6+xCShrkVzSLzhC89dR/Qv+p6P0hCsyEKYoQk3 vquZ+YiFbzRMpBQpXmi9UHy/hu+nbmt1rrbLw= MIME-Version: 1.0 Sender: alejandrofer@gmail.com Received: by 10.204.175.83 with SMTP id w19mr3506821bkz.24.1261261000771; Sat, 19 Dec 2009 14:16:40 -0800 (PST) Date: Sat, 19 Dec 2009 23:16:40 +0100 X-Google-Sender-Auth: 9c70ce140a0017c5 Message-ID: <2110ee000912191416n1392334ap5f6d9ef711280ff5@mail.gmail.com> Subject: Getting eLyXer (was Re: [eLyXer-users] brackets with \left.) From: Alex Fernandez To: eLyXer users Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) X-BeenThere: elyxer-users@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: eLyXer users List-Id: eLyXer users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 19 Dec 2009 22:16:48 -0000 Hi Ken, On Sat, Dec 19, 2009 at 9:13 PM, Ken wrote: > Hi Alex, > Is there an easy way for be to obtain the latest version without git? > I am a Windows user and usually a TortoiseSVN user and don't know how > to use git. =A0Is it possible to download the script from a webpage? There is a full copy of the source code in the src/ folder of the distribut= ion: https://savannah.nongnu.org/files/?group=3Delyxer But if you want the latest latest, you need to use git. There are ways to use git on Windows, e.g.: http://nathanj.github.com/gitguide/tour.html then you can just download the latest version from Savannah: git clone git://git.savannah.nongnu.org/elyxer.git Just a note: to generate the latest version of the executable script the included "make" will not work on Windows, but its first lines should work alright: # create executable cd src ./exportconfig.py py ./coalesce.py principal.py > ../elyxer.py Otherwise you have to wait for the next release, which hopefully will be this weekend! Alex. From MAILER-DAEMON Sun Dec 20 18:10:23 2009 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1NMUut-0002JC-LN for mharc-elyxer-users@gnu.org; Sun, 20 Dec 2009 18:10:23 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NMUus-0002J7-O7 for elyxer-users@nongnu.org; Sun, 20 Dec 2009 18:10:22 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NMUuo-0002Id-19 for elyxer-users@nongnu.org; Sun, 20 Dec 2009 18:10:22 -0500 Received: from [199.232.76.173] (port=49478 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NMUun-0002Ia-UK for elyxer-users@nongnu.org; Sun, 20 Dec 2009 18:10:17 -0500 Received: from mail-bw0-f212.google.com ([209.85.218.212]:50016) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NMUun-0006Pj-IN for elyxer-users@nongnu.org; Sun, 20 Dec 2009 18:10:17 -0500 Received: by bwz4 with SMTP id 4so3211662bwz.2 for ; Sun, 20 Dec 2009 15:10:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:received:date :x-google-sender-auth:message-id:subject:from:to:content-type :content-transfer-encoding; bh=tZ7KF6D5hZQ+gz3NXKMHPSlD499yPxVUQCGB3r9K0RI=; b=lqA7U6VpCndfKJDK3dOIRkzl03cxLKqU63GVAS2neXRNJn78+YmoFR0wLaWgS8pWiW 1O+/rhllByCO0pZnE/qMasHrQt0BoX9RlbVf3QDAziBfrCad3UCo51f3/CYfFPATENga loHElGEwNOb5ACKHRRO5zxR7UCwo9CcF1oODA= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:date:x-google-sender-auth:message-id:subject :from:to:content-type:content-transfer-encoding; b=UVWhDPgI5IUs3CglxKXTUzgd0I0wWYQ07x1vgktRUVuFBAFIpFJvZRraufEf/02+i8 DTHAjoBRoL001Swm9QnuK5OkqgvNIVgKdPpX1aK/fRar0GtTXRo4/DP78lalpb4Vzn8M c4EcZoVXA43NzGe1cFoKzFEt6gEC7HoHDa1eU= MIME-Version: 1.0 Sender: alejandrofer@gmail.com Received: by 10.204.160.86 with SMTP id m22mr4362270bkx.82.1261350615753; Sun, 20 Dec 2009 15:10:15 -0800 (PST) Date: Mon, 21 Dec 2009 00:10:15 +0100 X-Google-Sender-Auth: 769729515a0f2345 Message-ID: <2110ee000912201510m5f371c38s8babe96a941727fd@mail.gmail.com> From: Alex Fernandez To: "The main list to talk about eLyXer: features, announcements, requests" , =?ISO-8859-1?Q?Uwe_St=F6hr?= , Ripoll Olivier , Ken , noeckel@uoregon.edu Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) Cc: Subject: [eLyXer-users] eLyXer 0.39 released X-BeenThere: elyxer-users@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: eLyXer users List-Id: eLyXer users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 20 Dec 2009 23:10:22 -0000 Hi folks, Version 0.39 of eLyXer has just been released. This version contains a lot of improvements in BibTeX file parsing, and some math novelties such as binomial coefficients and variable commands. There is also a healthy dose of bug fixes. Changes include: --- =96 Avoid oversized images on IE6. =96 Solved several crashes with the LyX documentation (thanks, Uwe!). =96 Created script to lorem-ipsumize texts, found in src/loremipsumize.py. =96 Solved some issues with BibTeX parsing; now it should work with most real-world files (thanks, Ken!). Also improved error reporting and implemented a new way of line-by-line parsing from file, activated with --lowmem. =96 Support for binomial coefficients: \binom{A}{B}. Ignore commands \leftroot, \uproot. Generic support for variable commands in math mode. =96 Support for omitted aligned brackets: \left.right\right) (thanks, Jens!= ). =96 Solved bug with image conversion from directories (thanks, Olivier!). --- Complete changelog: =A0http://www.nongnu.org/elyxer/changelog.html Download from nongnu.org mirrors: =A0https://savannah.nongnu.org/files/?group=3Delyxer If the new version has not hit your favorite mirror yet: =A0http://download.savannah.gnu.org/releases-noredirect/elyxer/ Thanks, Alex Fern=E1ndez. From MAILER-DAEMON Wed Dec 30 08:18:35 2009 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1NPyRf-0000OJ-4W for mharc-elyxer-users@gnu.org; Wed, 30 Dec 2009 08:18:35 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NPyRc-0000Na-CG for elyxer-users@nongnu.org; Wed, 30 Dec 2009 08:18:32 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NPyRX-0000N0-Uh for elyxer-users@nongnu.org; Wed, 30 Dec 2009 08:18:32 -0500 Received: from [199.232.76.173] (port=51898 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NPyRX-0000Mp-KC for elyxer-users@nongnu.org; Wed, 30 Dec 2009 08:18:27 -0500 Received: from mail-bw0-f212.google.com ([209.85.218.212]:54027) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NPyRX-0005T1-E4 for elyxer-users@nongnu.org; Wed, 30 Dec 2009 08:18:27 -0500 Received: by bwz4 with SMTP id 4so7594569bwz.2 for ; Wed, 30 Dec 2009 05:18:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:received:in-reply-to :references:date:x-google-sender-auth:message-id:subject:from:to :content-type:content-transfer-encoding; bh=99c6HleRF4c+zvgkNpO9BbGm1lPs6Nq+MA8BAZthMNI=; b=ummpPQ7tz081t+yyzZbiNj28lT2WosDiEJclEOvdm5H4u7TUFcBYsD+L9eiB+LuC4C +qQAw2U/YGhCe3iaobSN44vOivscW/f0EEo++6r6o8VglM3MUGj+X3C6H7PToAAsiCaZ RAk3Bd1KkvbXkrhC80dfSDbbK8ldQ45pE5ZEs= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:content-type :content-transfer-encoding; b=tKjvVcPrXTsss6DUje+46JFjJTeqUvo8d7RvHc4WDHzV3bq+oqhYiYxXG50JOG3UpQ N3upopS+2KGCc2SbuIdBT4wniSALs+HlxYBWy/pGUMcJNpBYoxu0ZUbXZmXqcy8iKnTv HWPEKb/Yj0XaCoYclGR+J6LmvvKHtxREr6/Xg= MIME-Version: 1.0 Sender: alejandrofer@gmail.com Received: by 10.204.0.69 with SMTP id 5mr5577298bka.173.1262179106303; Wed, 30 Dec 2009 05:18:26 -0800 (PST) In-Reply-To: <2110ee000912300144y11c16781p4123d67354c426b4@mail.gmail.com> References: <2110ee000912290746x322e4626ub53cf4e2a01aa6b6@mail.gmail.com> <2110ee000912290946m25facca5i37be517dd586aef@mail.gmail.com> <2110ee000912300144y11c16781p4123d67354c426b4@mail.gmail.com> Date: Wed, 30 Dec 2009 14:18:26 +0100 X-Google-Sender-Auth: 88a09a001ac74747 Message-ID: <2110ee000912300518y2f05abf0s223248952d872149@mail.gmail.com> From: Alex Fernandez To: "The main list to talk about eLyXer: features, announcements, requests" , lyx-users@lists.lyx.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) Cc: Subject: [eLyXer-users] Re: "python -m elyxer" question X-BeenThere: elyxer-users@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: eLyXer users List-Id: eLyXer users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 30 Dec 2009 13:18:32 -0000 On Tue, Dec 29, 2009 at 8:02 PM, Joachim Osnabryg wrote: > Few problems are remaining: Most of these problems should not be difficult to solve. It would be very helpful if you sent me a sample that showed all of them, since there are too many esoteric LyX options. You can also send any samples privately as before, and they will be treated with the utmost confidentiality. A new option is the loremipsumizer: a Python script to remove any private information. Just place it in the same directory as your document, give it permissions as an executable file and run: =A0% ./loremipsumize.py mydoc.lyx loremipsum.lyx It generates a new version of the file retaining all format information, but replacing any string of three or more words with "lorem ipsum". The script loremipsumize.py is distributed along with eLyXer on the root directory. I tried to attach it here but lyx-users did not like it. > But I didn't want to go into these issues en details, in the moment, but > give an enthused first echo. After further experimenting I'll come back > more precisely, perhaps better on your Elyxer-users mailing list. Perfect, that way messages are archived for reference. > Thank you for your work on it, the bygone year! My most sincere thanks to all eLyXer users for presenting me with such interesting challenges, and a happy new year to all! Alex.