From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 64552 invoked by alias); 3 Nov 2016 00:37:40 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 64540 invoked by uid 89); 3 Nov 2016 00:37:40 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_NONE,SPF_PASS,URIBL_RED autolearn=ham version=3.3.2 spammy=sk:build_c, python3, mpc, mature X-HELO: relay1.mentorg.com Date: Thu, 03 Nov 2016 00:37:00 -0000 From: Joseph Myers To: Subject: RFC: script to build many glibc configurations Message-ID: User-Agent: Alpine 2.20 (DEB 67 2015-01-07) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="-1152306461-1977529222-1478133440=:23365" X-ClientProxiedBy: svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) To svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) X-SW-Source: 2016-11/txt/msg00095.txt.bz2 ---1152306461-1977529222-1478133440=:23365 Content-Type: text/plain; charset="US-ASCII" Content-length: 4034 Attached is a first version of a Python (3.5 or later) script to build many different configurations of glibc, including building the required cross compilers first. The idea is that when it's more mature it would go in the glibc source tree as a rough sort of equivalent to GCC's contrib/config-list.mk. It's not intended to change any patch testing requirements, although some people may wish to use it for high-risk patches such as adding warning options (and it can also be used to test building, including compiling tests, for an individual configuration, if e.g. you wish to do such a compilation test of a patch for an architecture it touches). The present version only tests a limited number of glibc configurations, to illustrate its features. I intend to expand it to cover most or all of the ABI variants in and it would be desirable to cover enough other variants e.g. for CPUs using different sysdeps directories to test building each piece of code in glibc at least once. You call the script as build-many-glibcs.py /some/where thing-to-do where /some/where is a working directory for the script. It will create and use subdirectories build, install, logs therein. It expects a subdirectory src to already exist; it should contain directories binutils, gcc, glibc, gmp, linux, mpc, mpfr with the sources of those components (all except glibc can be symlinks to sources elsewhere). thing-to-do is one of host-libraries, compilers, glibcs. So you run, in that order: build-many-glibcs.py /some/where host-libraries build-many-glibcs.py /some/where compilers build-many-glibcs.py /some/where glibcs host-libraries is run once and then those libraries are used for all the compilers. compilers can be run once and then used many times for testing different glibc versions (so a bot only needs to update glibc and rerun the glibcs task, if using stable GCC / binutils; if testing the latest versions of the whole toolchain together including mainline GCC, it would probably want to update everything and rerun both compilers and glibcs). You can also name particular variants after "compilers" or "glibcs" to build just those variants (the possible variants are hardcoded in the script). Any comments? Possible improvements I have in mind include: covering more variants, hopefully all or nearly all ABIs; support for creating / updating the src directory (with a choice of component versions) so that doesn't need to be done manually; optionally leaving build directories around, or leaving them around for failed builds (right now they are always cleaned up); saving content of .out files for failed glibc tests, and the full content of tests.sum, before cleaning up; allowing the set of configurations to depend on the GCC version; optionally looping over architecture-independent glibc variants of CFLAGS and configure options as well, for every glibc configuration listed (e.g. -Os). Testing with this version depends on my patches and to avoid problems running glibc tests. GCC versions before 4.9 are not expected to work (the code uses --with-glibc-version to get the bootstrap GCC appropriately configured). With GCC 5 branch, the ColdFire build falls over with an ICE building libgcc while the other builds successfully build the compilers (some of them have glibc test failures I'll investigate once I've set up saving of logs of failed tests). On a 2.6 GHz Haswell-based Xeon (16 cores, 32 with HT) the build took about 17 minutes for the compilers (note that building the compilers includes building a subset of glibcs so that shared libgcc and libstdc++ can then be built) and 12 for the glibcs after the compilers. However, there probably aren't yet enough variants for parallelism to be optimally exploited; I expect that with more variants more parallelism will also be used. -- Joseph S. Myers joseph@codesourcery.com ---1152306461-1977529222-1478133440=:23365 Content-Type: text/x-python; name="build-many-glibcs.py" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename="build-many-glibcs.py" Content-length: 42424 IyEvdXNyL2Jpbi9weXRob24zDQojIEJ1aWxkIG1hbnkgY29uZmlndXJhdGlv bnMgb2YgZ2xpYmMuDQojIENvcHlyaWdodCAoQykgMjAxNiBGcmVlIFNvZnR3 YXJlIEZvdW5kYXRpb24sIEluYy4NCiMgVGhpcyBmaWxlIGlzIHBhcnQgb2Yg dGhlIEdOVSBDIExpYnJhcnkuDQojDQojIFRoZSBHTlUgQyBMaWJyYXJ5IGlz IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v cg0KIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVz c2VyIEdlbmVyYWwgUHVibGljDQojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5 IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcg0KIyB2ZXJz aW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBh bnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhlIEdOVSBDIExpYnJhcnkgaXMg ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1 bCwNCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g dGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMgTUVSQ0hBTlRBQklMSVRZIG9y IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH TlUNCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg ZGV0YWlscy4NCiMNCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w eSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYw0KIyBMaWNlbnNl IGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgc2VlDQoj IDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4NCg0KIiIiQnVpbGQg bWFueSBjb25maWd1cmF0aW9ucyBvZiBnbGliYy4NCg0KVGhpcyBzY3JpcHQg dGFrZXMgYXMgYXJndW1lbnRzIGEgZGlyZWN0b3J5IG5hbWUgKGNvbnRhaW5p bmcgYSBzcmMNCnN1YmRpcmVjdG9yeSB3aXRoIHNvdXJjZXMgb2YgdGhlIHJl bGV2YW50IHRvb2xjaGFpbiBjb21wb25lbnRzKSBhbmQgYQ0KZGVzY3JpcHRp b24gb2Ygd2hhdCB0byBkbzogJ2hvc3QtbGlicmFyaWVzJywgdG8gYnVpbGQg bGlicmFyaWVzDQpyZXF1aXJlZCBieSB0aGUgdG9vbGNoYWluLCAnY29tcGls ZXJzJywgdG8gYnVpbGQgY3Jvc3MtY29tcGlsZXJzIGZvcg0KdmFyaW91cyBj b25maWd1cmF0aW9ucywgb3IgJ2dsaWJjcycsIHRvIGJ1aWxkIGdsaWJjIGZv ciB2YXJpb3VzDQpjb25maWd1cmF0aW9ucyBhbmQgcnVuIHRoZSBjb21waWxh dGlvbiBwYXJ0cyBvZiB0aGUgdGVzdHN1aXRlLg0KU3Vic2VxdWVudCBhcmd1 bWVudHMgbmFtZSBjb25maWd1cmF0aW9ucyBmb3Igd2hpY2ggY29tcGlsZXJz IG9yIGdsaWJjDQphcmUgdG8gYmUgYnVpbHQuDQoiIiINCg0KaW1wb3J0IGFy Z3BhcnNlDQppbXBvcnQgb3MNCmltcG9ydCBvcy5wYXRoDQppbXBvcnQgcmUN CmltcG9ydCBzaHV0aWwNCmltcG9ydCBzdGF0DQppbXBvcnQgc3VicHJvY2Vz cw0KaW1wb3J0IHN5cw0KDQoNCmNsYXNzIENvbnRleHQ6DQoNCiAgICAiIiJU aGUgZ2xvYmFsIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCBidWlsZHMgaW4gYSBn aXZlbiBkaXJlY3RvcnkuIiIiDQoNCiAgICBkZWYgX19pbml0X18oc2VsZiwg dG9wZGlyLCBwYXJhbGxlbGlzbSk6DQogICAgICAgICIiIkluaXRpYWxpemUg dGhlIGNvbnRleHQuIiIiDQogICAgICAgIHNlbGYudG9wZGlyID0gdG9wZGly DQogICAgICAgIHNlbGYucGFyYWxsZWxpc20gPSBwYXJhbGxlbGlzbQ0KICAg ICAgICBzZWxmLnNyY2RpciA9IG9zLnBhdGguam9pbih0b3BkaXIsICdzcmMn KQ0KICAgICAgICBzZWxmLmluc3RhbGxkaXIgPSBvcy5wYXRoLmpvaW4odG9w ZGlyLCAnaW5zdGFsbCcpDQogICAgICAgIHNlbGYuaG9zdF9saWJyYXJpZXNf aW5zdGFsbGRpciA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxkaXIsDQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAnaG9zdC1saWJyYXJpZXMnKQ0KICAgICAgICBzZWxmLmJ1aWxk ZGlyID0gb3MucGF0aC5qb2luKHRvcGRpciwgJ2J1aWxkJykNCiAgICAgICAg c2VsZi5sb2dzZGlyID0gb3MucGF0aC5qb2luKHRvcGRpciwgJ2xvZ3MnKQ0K ICAgICAgICBzZWxmLm1ha2VmaWxlID0gb3MucGF0aC5qb2luKHNlbGYuYnVp bGRkaXIsICdNYWtlZmlsZScpDQogICAgICAgIHNlbGYud3JhcHBlciA9IG9z LnBhdGguam9pbihzZWxmLmJ1aWxkZGlyLCAnd3JhcHBlcicpDQogICAgICAg IHNlbGYuYnVpbGRfdHJpcGxldCA9IHNlbGYuZ2V0X2J1aWxkX3RyaXBsZXQo KQ0KICAgICAgICBzZWxmLmdsaWJjX3ZlcnNpb24gPSBzZWxmLmdldF9nbGli Y192ZXJzaW9uKCkNCiAgICAgICAgc2VsZi5jb25maWdzID0ge30NCiAgICAg ICAgc2VsZi5nbGliY19jb25maWdzID0ge30NCiAgICAgICAgc2VsZi5tYWtl ZmlsZV9waWVjZXMgPSBbJy5QSE9OWTogYWxsXG4nXQ0KICAgICAgICBzZWxm LmFkZF9hbGxfY29uZmlncygpDQoNCiAgICBkZWYgZ2V0X2J1aWxkX3RyaXBs ZXQoc2VsZik6DQogICAgICAgICIiIkRldGVybWluZSB0aGUgYnVpbGQgdHJp cGxldCB3aXRoIGNvbmZpZy5ndWVzcy4iIiINCiAgICAgICAgY29uZmlnX2d1 ZXNzID0gb3MucGF0aC5qb2luKHNlbGYuY29tcG9uZW50X3NyY2RpcignZ2Nj JyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29u ZmlnLmd1ZXNzJykNCiAgICAgICAgY2dfb3V0ID0gc3VicHJvY2Vzcy5ydW4o W2NvbmZpZ19ndWVzc10sIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsDQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrPVRydWUsIHVuaXZl cnNhbF9uZXdsaW5lcz1UcnVlKS5zdGRvdXQNCiAgICAgICAgcmV0dXJuIGNn X291dC5yc3RyaXAoKQ0KDQogICAgZGVmIGdldF9nbGliY192ZXJzaW9uKHNl bGYpOg0KICAgICAgICAiIiJEZXRlcm1pbmUgdGhlIGdsaWJjIHZlcnNpb24g bnVtYmVyIChtYWpvci5taW5vcikuIiIiDQogICAgICAgIHZlcnNpb25faCA9 IG9zLnBhdGguam9pbihzZWxmLmNvbXBvbmVudF9zcmNkaXIoJ2dsaWJjJyks ICd2ZXJzaW9uLmgnKQ0KICAgICAgICB3aXRoIG9wZW4odmVyc2lvbl9oLCAn cicpIGFzIGY6DQogICAgICAgICAgICBsaW5lcyA9IGYucmVhZGxpbmVzKCkN CiAgICAgICAgc3RhcnR0ZXh0ID0gJyNkZWZpbmUgVkVSU0lPTiAiJw0KICAg ICAgICBmb3IgbCBpbiBsaW5lczoNCiAgICAgICAgICAgIGlmIGwuc3RhcnRz d2l0aChzdGFydHRleHQpOg0KICAgICAgICAgICAgICAgIGwgPSBsW2xlbihz dGFydHRleHQpOl0NCiAgICAgICAgICAgICAgICBsID0gbC5yc3RyaXAoJyJc bicpDQogICAgICAgICAgICAgICAgbSA9IHJlLmZ1bGxtYXRjaCgnKFswLTld KylcLihbMC05XSspWy4wLTldKicsIGwpDQogICAgICAgICAgICAgICAgcmV0 dXJuICclcy4lcycgJSBtLmdyb3VwKDEsIDIpDQogICAgICAgIHByaW50KCdl cnJvcjogY291bGQgbm90IGRldGVybWluZSBnbGliYyB2ZXJzaW9uJykNCiAg ICAgICAgZXhpdCgxKQ0KDQogICAgZGVmIGFkZF9hbGxfY29uZmlncyhzZWxm KToNCiAgICAgICAgIiIiQWRkIGFsbCBrbm93biBnbGliYyBidWlsZCBjb25m aWd1cmF0aW9ucy4iIiINCiAgICAgICAgc2VsZi5hZGRfY29uZmlnKGFyY2g9 J2FybScsDQogICAgICAgICAgICAgICAgICAgICAgICBvc19uYW1lPSdsaW51 eC1nbnVlYWJpJykNCiAgICAgICAgc2VsZi5hZGRfY29uZmlnKGFyY2g9J202 OGsnLA0KICAgICAgICAgICAgICAgICAgICAgICAgb3NfbmFtZT0nbGludXgt Z251JykNCiAgICAgICAgc2VsZi5hZGRfY29uZmlnKGFyY2g9J202OGsnLA0K ICAgICAgICAgICAgICAgICAgICAgICAgb3NfbmFtZT0nbGludXgtZ251JywN CiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9J2NvbGRmaXJlJywN CiAgICAgICAgICAgICAgICAgICAgICAgIGdjY19jZmc9WyctLXdpdGgtYXJj aD1jZiddKQ0KICAgICAgICBzZWxmLmFkZF9jb25maWcoYXJjaD0neDg2XzY0 JywNCiAgICAgICAgICAgICAgICAgICAgICAgIG9zX25hbWU9J2xpbnV4LWdu dScsDQogICAgICAgICAgICAgICAgICAgICAgICBnY2NfY2ZnPVsnLS13aXRo LW11bHRpbGliLWxpc3Q9bTY0LG0zMixteDMyJ10sDQogICAgICAgICAgICAg ICAgICAgICAgICBnbGliY3M9W3t9LA0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB7J3ZhcmlhbnQnOiAneDMyJywgJ2Njb3B0cyc6ICctbXgz Mid9LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2FyY2gn OiAnaTY4NicsICdjY29wdHMnOiAnLW0zMiAtbWFyY2g9aTY4Nid9XSwNCiAg ICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2dsaWJjcz1beyd2YXJpYW50 JzogJ2Rpc2FibGUtbXVsdGktYXJjaCcsDQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAnY2ZnJzogWyctLWRpc2FibGUtbXVsdGkt YXJjaCddfSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgeyd2YXJpYW50JzogJ2Rpc2FibGUtbXVsdGktYXJjaCcsDQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJjaCc6ICdpNjg2 JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdj Y29wdHMnOiAnLW0zMiAtbWFyY2g9aTY4NicsDQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAnY2ZnJzogWyctLWRpc2FibGUtbXVs dGktYXJjaCddfSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgeydhcmNoJzogJ2k0ODYnLA0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgJ2Njb3B0cyc6ICctbTMyIC1tYXJjaD1pNDg2 J31dKQ0KDQogICAgZGVmIGFkZF9jb25maWcoc2VsZiwgKiphcmdzKToNCiAg ICAgICAgIiIiQWRkIGFuIGluZGl2aWR1YWwgYnVpbGQgY29uZmlndXJhdGlv bi4iIiINCiAgICAgICAgY2ZnID0gQ29uZmlnKHNlbGYsICoqYXJncykNCiAg ICAgICAgaWYgY2ZnLm5hbWUgaW4gc2VsZi5jb25maWdzOg0KICAgICAgICAg ICAgcHJpbnQoJ2Vycm9yOiBkdXBsaWNhdGUgY29uZmlnICVzJyAlIGNmZy5u YW1lKQ0KICAgICAgICAgICAgZXhpdCgxKQ0KICAgICAgICBzZWxmLmNvbmZp Z3NbY2ZnLm5hbWVdID0gY2ZnDQogICAgICAgIGZvciBjIGluIGNmZy5hbGxf Z2xpYmNzOg0KICAgICAgICAgICAgaWYgYy5uYW1lIGluIHNlbGYuZ2xpYmNf Y29uZmlnczoNCiAgICAgICAgICAgICAgICBwcmludCgnZXJyb3I6IGR1cGxp Y2F0ZSBnbGliYyBjb25maWcgJXMnICUgYy5uYW1lKQ0KICAgICAgICAgICAg ICAgIGV4aXQoMSkNCiAgICAgICAgICAgIHNlbGYuZ2xpYmNfY29uZmlnc1tj Lm5hbWVdID0gYw0KDQogICAgZGVmIGNvbXBvbmVudF9zcmNkaXIoc2VsZiwg Y29tcG9uZW50KToNCiAgICAgICAgIiIiUmV0dXJuIHRoZSBzb3VyY2UgZGly ZWN0b3J5IGZvciBhIGdpdmVuIGNvbXBvbmVudCwgZS5nLiBnY2MuIiIiDQog ICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5zcmNkaXIsIGNvbXBv bmVudCkNCg0KICAgIGRlZiBjb21wb25lbnRfYnVpbGRkaXIoc2VsZiwgYWN0 aW9uLCBjb25maWcsIGNvbXBvbmVudCwgc3ViY29uZmlnPU5vbmUpOg0KICAg ICAgICAiIiJSZXR1cm4gdGhlIGRpcmVjdG9yeSB0byB1c2UgZm9yIGEgYnVp bGQuIiIiDQogICAgICAgIGlmIGNvbmZpZyBpcyBOb25lOg0KICAgICAgICAg ICAgIyBIb3N0IGxpYnJhcmllcy4NCiAgICAgICAgICAgIGFzc2VydCBzdWJj b25maWcgaXMgTm9uZQ0KICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9p bihzZWxmLmJ1aWxkZGlyLCBhY3Rpb24sIGNvbXBvbmVudCkNCiAgICAgICAg aWYgc3ViY29uZmlnIGlzIE5vbmU6DQogICAgICAgICAgICByZXR1cm4gb3Mu cGF0aC5qb2luKHNlbGYuYnVpbGRkaXIsIGFjdGlvbiwgY29uZmlnLCBjb21w b25lbnQpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICAjIGdsaWJjIGJ1 aWxkIGFzIHBhcnQgb2YgY29tcGlsZXIgYnVpbGQuDQogICAgICAgICAgICBy ZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuYnVpbGRkaXIsIGFjdGlvbiwgY29u ZmlnLCBjb21wb25lbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHN1YmNvbmZpZykNCg0KICAgIGRlZiBjb21waWxlcl9pbnN0YWxsZGly KHNlbGYsIGNvbmZpZyk6DQogICAgICAgICIiIlJldHVybiB0aGUgZGlyZWN0 b3J5IGluIHdoaWNoIHRvIGluc3RhbGwgYSBjb21waWxlci4iIiINCiAgICAg ICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxkaXIsICdjb21w aWxlcnMnLCBjb25maWcpDQoNCiAgICBkZWYgY29tcGlsZXJfYmluZGlyKHNl bGYsIGNvbmZpZyk6DQogICAgICAgICIiIlJldHVybiB0aGUgZGlyZWN0b3J5 IGluIHdoaWNoIHRvIGZpbmQgY29tcGlsZXIgYmluYXJpZXMuIiIiDQogICAg ICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5jb21waWxlcl9pbnN0YWxs ZGlyKGNvbmZpZyksICdiaW4nKQ0KDQogICAgZGVmIGNvbXBpbGVyX3N5c3Jv b3Qoc2VsZiwgY29uZmlnKToNCiAgICAgICAgIiIiUmV0dXJuIHRoZSBzeXNy b290IGRpcmVjdG9yeSBmb3IgYSBjb21waWxlci4iIiINCiAgICAgICAgcmV0 dXJuIG9zLnBhdGguam9pbihzZWxmLmNvbXBpbGVyX2luc3RhbGxkaXIoY29u ZmlnKSwgJ3N5c3Jvb3QnKQ0KDQogICAgZGVmIGdsaWJjX2luc3RhbGxkaXIo c2VsZiwgY29uZmlnKToNCiAgICAgICAgIiIiUmV0dXJuIHRoZSBkaXJlY3Rv cnkgaW4gd2hpY2ggdG8gaW5zdGFsbCBnbGliYy4iIiINCiAgICAgICAgcmV0 dXJuIG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxkaXIsICdnbGliY3MnLCBj b25maWcpDQoNCiAgICBkZWYgcnVuX2J1aWxkcyhzZWxmLCBhY3Rpb24sIGNv bmZpZ3MpOg0KICAgICAgICAiIiJSdW4gdGhlIHJlcXVlc3RlZCBidWlsZHMu IiIiDQogICAgICAgIGlmIGFjdGlvbiA9PSAnaG9zdC1saWJyYXJpZXMnOg0K ICAgICAgICAgICAgaWYgY29uZmlnczoNCiAgICAgICAgICAgICAgICBwcmlu dCgnZXJyb3I6IGNvbmZpZ3VyYXRpb25zIHNwZWNpZmllZCBmb3IgaG9zdC1s aWJyYXJpZXMnKQ0KICAgICAgICAgICAgICAgIGV4aXQoMSkNCiAgICAgICAg ICAgIHNlbGYuYnVpbGRfaG9zdF9saWJyYXJpZXMoKQ0KICAgICAgICBlbGlm IGFjdGlvbiA9PSAnY29tcGlsZXJzJzoNCiAgICAgICAgICAgIHNlbGYuYnVp bGRfY29tcGlsZXJzKGNvbmZpZ3MpDQogICAgICAgIGVsc2U6DQogICAgICAg ICAgICBzZWxmLmJ1aWxkX2dsaWJjcyhjb25maWdzKQ0KICAgICAgICBzZWxm LndyaXRlX2ZpbGVzKCkNCiAgICAgICAgc2VsZi5kb19idWlsZCgpDQoNCiAg ICBAc3RhdGljbWV0aG9kDQogICAgZGVmIHJlbW92ZV9kaXJzKCphcmdzKToN CiAgICAgICAgIiIiUmVtb3ZlIGRpcmVjdG9yaWVzIGFuZCB0aGVpciBjb250 ZW50cyBpZiB0aGV5IGV4aXN0LiIiIg0KICAgICAgICBmb3IgZGlyIGluIGFy Z3M6DQogICAgICAgICAgICBzaHV0aWwucm10cmVlKGRpciwgaWdub3JlX2Vy cm9ycz1UcnVlKQ0KDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiByZW1v dmVfcmVjcmVhdGVfZGlycygqYXJncyk6DQogICAgICAgICIiIlJlbW92ZSBk aXJlY3RvcmllcyBpZiB0aGV5IGV4aXN0LCBhbmQgY3JlYXRlIHRoZW0gYXMg ZW1wdHkuIiIiDQogICAgICAgIENvbnRleHQucmVtb3ZlX2RpcnMoKmFyZ3Mp DQogICAgICAgIGZvciBkaXIgaW4gYXJnczoNCiAgICAgICAgICAgIG9zLm1h a2VkaXJzKGRpciwgZXhpc3Rfb2s9VHJ1ZSkNCg0KICAgIGRlZiBhZGRfbWFr ZWZpbGVfY21kbGlzdChzZWxmLCB0YXJnZXQsIGNtZGxpc3QsIGxvZ3NkaXIp Og0KICAgICAgICAiIiJBZGQgbWFrZWZpbGUgdGV4dCBmb3IgYSBsaXN0IG9m IGNvbW1hbmRzLiIiIg0KICAgICAgICBjb21tYW5kcyA9IGNtZGxpc3QubWFr ZWZpbGVfY29tbWFuZHMoc2VsZi53cmFwcGVyLCBsb2dzZGlyKQ0KICAgICAg ICBzZWxmLm1ha2VmaWxlX3BpZWNlcy5hcHBlbmQoJ2FsbDogJXNcbi5QSE9O WTogJXNcbiVzOlxuJXNcbicgJQ0KICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKHRhcmdldCwgdGFyZ2V0LCB0YXJnZXQsIGNvbW1hbmRz KSkNCg0KICAgIGRlZiB3cml0ZV9maWxlcyhzZWxmKToNCiAgICAgICAgIiIi V3JpdGUgb3V0IHRoZSBNYWtlZmlsZSBhbmQgd3JhcHBlciBzY3JpcHQuIiIi DQogICAgICAgIG1mdGV4dCA9ICcnLmpvaW4oc2VsZi5tYWtlZmlsZV9waWVj ZXMpDQogICAgICAgIHdpdGggb3BlbihzZWxmLm1ha2VmaWxlLCAndycpIGFz IGY6DQogICAgICAgICAgICBmLndyaXRlKG1mdGV4dCkNCiAgICAgICAgd3Jh cHBlcl90ZXh0ID0gKA0KICAgICAgICAgICAgJyMhL2Jpbi9zaFxuJw0KICAg ICAgICAgICAgJ3ByZXZfYmFzZT0kMVxuJw0KICAgICAgICAgICAgJ3RoaXNf YmFzZT0kMlxuJw0KICAgICAgICAgICAgJ2Rlc2M9JDNcbicNCiAgICAgICAg ICAgICdkaXI9JDRcbicNCiAgICAgICAgICAgICdwYXRoPSQ1XG4nDQogICAg ICAgICAgICAnc2hpZnQgNVxuJw0KICAgICAgICAgICAgJ3ByZXZfc3RhdHVz PSRwcmV2X2Jhc2Utc3RhdHVzLnR4dFxuJw0KICAgICAgICAgICAgJ3RoaXNf c3RhdHVzPSR0aGlzX2Jhc2Utc3RhdHVzLnR4dFxuJw0KICAgICAgICAgICAg J3RoaXNfbG9nPSR0aGlzX2Jhc2UtbG9nLnR4dFxuJw0KICAgICAgICAgICAg J2RhdGUgPiAiJHRoaXNfbG9nIlxuJw0KICAgICAgICAgICAgJ2VjaG8gPj4g IiR0aGlzX2xvZyJcbicNCiAgICAgICAgICAgICdlY2hvICJEZXNjcmlwdGlv bjogJGRlc2MiID4+ICIkdGhpc19sb2ciXG4nDQogICAgICAgICAgICAnZWNo byAiQ29tbWFuZDogJCoiID4+ICIkdGhpc19sb2ciXG4nDQogICAgICAgICAg ICAnZWNobyAiRGlyZWN0b3J5OiAkZGlyIiA+PiAiJHRoaXNfbG9nIlxuJw0K ICAgICAgICAgICAgJ2VjaG8gIlBhdGggYWRkaXRpb246ICRwYXRoIiA+PiAi JHRoaXNfbG9nIlxuJw0KICAgICAgICAgICAgJ2VjaG8gPj4gIiR0aGlzX2xv ZyJcbicNCiAgICAgICAgICAgICdyZWNvcmRfc3RhdHVzICgpXG4nDQogICAg ICAgICAgICAne1xuJw0KICAgICAgICAgICAgJyAgZWNobyA+PiAiJHRoaXNf bG9nIlxuJw0KICAgICAgICAgICAgJyAgZWNobyAiJDE6ICRkZXNjIiA+ICIk dGhpc19zdGF0dXMiXG4nDQogICAgICAgICAgICAnICBlY2hvICIkMTogJGRl c2MiID4+ICIkdGhpc19sb2ciXG4nDQogICAgICAgICAgICAnICBlY2hvID4+ ICIkdGhpc19sb2ciXG4nDQogICAgICAgICAgICAnICBkYXRlID4+ICIkdGhp c19sb2ciXG4nDQogICAgICAgICAgICAnICBlY2hvICIkMTogJGRlc2MiXG4n DQogICAgICAgICAgICAnICBleGl0IDBcbicNCiAgICAgICAgICAgICd9XG4n DQogICAgICAgICAgICAnY2hlY2tfZXJyb3IgKClcbicNCiAgICAgICAgICAg ICd7XG4nDQogICAgICAgICAgICAnICBpZiBbICIkMSIgIT0gIjAiIF07IHRo ZW5cbicNCiAgICAgICAgICAgICcgICAgcmVjb3JkX3N0YXR1cyBGQUlMXG4n DQogICAgICAgICAgICAnICBmaVxuJw0KICAgICAgICAgICAgJ31cbicNCiAg ICAgICAgICAgICdpZiBbICIkcHJldl9iYXNlIiBdICYmICEgZ3JlcCAtcSAi XlBBU1MiICIkcHJldl9zdGF0dXMiOyB0aGVuXG4nDQogICAgICAgICAgICAn ICAgIHJlY29yZF9zdGF0dXMgVU5SRVNPTFZFRFxuJw0KICAgICAgICAgICAg J2ZpXG4nDQogICAgICAgICAgICAnaWYgWyAiJGRpciIgXTsgdGhlblxuJw0K ICAgICAgICAgICAgJyAgY2QgIiRkaXIiXG4nDQogICAgICAgICAgICAnICBj aGVja19lcnJvciAiJD8iXG4nDQogICAgICAgICAgICAnZmlcbicNCiAgICAg ICAgICAgICdpZiBbICIkcGF0aCIgXTsgdGhlblxuJw0KICAgICAgICAgICAg JyAgUEFUSD0kcGF0aDokUEFUSFxuJw0KICAgICAgICAgICAgJ2ZpXG4nDQog ICAgICAgICAgICAnIiRAIiA8IC9kZXYvbnVsbCA+PiAiJHRoaXNfbG9nIiAy PiYxXG4nDQogICAgICAgICAgICAnY2hlY2tfZXJyb3IgIiQ/IlxuJw0KICAg ICAgICAgICAgJ3JlY29yZF9zdGF0dXMgUEFTU1xuJykNCiAgICAgICAgd2l0 aCBvcGVuKHNlbGYud3JhcHBlciwgJ3cnKSBhcyBmOg0KICAgICAgICAgICAg Zi53cml0ZSh3cmFwcGVyX3RleHQpDQogICAgICAgIG9zLmNobW9kKHNlbGYu d3JhcHBlciwNCiAgICAgICAgICAgICAgICAgKHN0YXQuU19JUldYVXxzdGF0 LlNfSVJHUlB8c3RhdC5TX0lYR1JQfA0KICAgICAgICAgICAgICAgICAgc3Rh dC5TX0lST1RIfHN0YXQuU19JWE9USCkpDQoNCiAgICBkZWYgZG9fYnVpbGQo c2VsZik6DQogICAgICAgICIiIkRvIHRoZSBhY3R1YWwgYnVpbGQuIiIiDQog ICAgICAgIGNtZCA9IFsnbWFrZScsICctaiVkJyAlIHNlbGYucGFyYWxsZWxp c20sICctQycsIHNlbGYuYnVpbGRkaXJdDQogICAgICAgIHN1YnByb2Nlc3Mu cnVuKGNtZCwgY2hlY2s9VHJ1ZSkNCg0KICAgIGRlZiBidWlsZF9ob3N0X2xp YnJhcmllcyhzZWxmKToNCiAgICAgICAgIiIiQnVpbGQgdGhlIGhvc3QgbGli cmFyaWVzLiIiIg0KICAgICAgICBpbnN0YWxsZGlyID0gc2VsZi5ob3N0X2xp YnJhcmllc19pbnN0YWxsZGlyDQogICAgICAgIGJ1aWxkZGlyID0gb3MucGF0 aC5qb2luKHNlbGYuYnVpbGRkaXIsICdob3N0LWxpYnJhcmllcycpDQogICAg ICAgIGxvZ3NkaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5sb2dzZGlyLCAnaG9z dC1saWJyYXJpZXMnKQ0KICAgICAgICBzZWxmLnJlbW92ZV9yZWNyZWF0ZV9k aXJzKGluc3RhbGxkaXIsIGJ1aWxkZGlyLCBsb2dzZGlyKQ0KICAgICAgICBj bWRsaXN0ID0gQ29tbWFuZExpc3QoJ2hvc3QtbGlicmFyaWVzJykNCiAgICAg ICAgc2VsZi5idWlsZF9ob3N0X2xpYnJhcnkoY21kbGlzdCwgJ2dtcCcpDQog ICAgICAgIHNlbGYuYnVpbGRfaG9zdF9saWJyYXJ5KGNtZGxpc3QsICdtcGZy JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyctLXdpdGgt Z21wPSVzJyAlIGluc3RhbGxkaXJdKQ0KICAgICAgICBzZWxmLmJ1aWxkX2hv c3RfbGlicmFyeShjbWRsaXN0LCAnbXBjJywNCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgWyctLXdpdGgtZ21wPSVzJyAlIGluc3RhbGxkaXIs DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLXdpdGgtbXBm cj0lcycgJSBpbnN0YWxsZGlyXSkNCiAgICAgICAgY21kbGlzdC5hZGRfY29t bWFuZCgnZG9uZScsIFsndG91Y2gnLCBvcy5wYXRoLmpvaW4oaW5zdGFsbGRp ciwgJ29rJyldKQ0KICAgICAgICBzZWxmLmFkZF9tYWtlZmlsZV9jbWRsaXN0 KCdob3N0LWxpYnJhcmllcycsIGNtZGxpc3QsIGxvZ3NkaXIpDQoNCiAgICBk ZWYgYnVpbGRfaG9zdF9saWJyYXJ5KHNlbGYsIGNtZGxpc3QsIGxpYiwgZXh0 cmFfb3B0cz1Ob25lKToNCiAgICAgICAgIiIiQnVpbGQgb25lIGhvc3QgbGli cmFyeS4iIiINCiAgICAgICAgc3JjZGlyID0gc2VsZi5jb21wb25lbnRfc3Jj ZGlyKGxpYikNCiAgICAgICAgYnVpbGRkaXIgPSBzZWxmLmNvbXBvbmVudF9i dWlsZGRpcignaG9zdC1saWJyYXJpZXMnLCBOb25lLCBsaWIpDQogICAgICAg IGluc3RhbGxkaXIgPSBzZWxmLmhvc3RfbGlicmFyaWVzX2luc3RhbGxkaXIN CiAgICAgICAgY21kbGlzdC5wdXNoX3N1YmRlc2MobGliKQ0KICAgICAgICBj bWRsaXN0LmNyZWF0ZV91c2VfZGlyKGJ1aWxkZGlyKQ0KICAgICAgICBjZmdf Y21kID0gW29zLnBhdGguam9pbihzcmNkaXIsICdjb25maWd1cmUnKSwNCiAg ICAgICAgICAgICAgICAgICAnLS1wcmVmaXg9JXMnICUgaW5zdGFsbGRpciwN CiAgICAgICAgICAgICAgICAgICAnLS1kaXNhYmxlLXNoYXJlZCddDQogICAg ICAgIGlmIGV4dHJhX29wdHM6DQogICAgICAgICAgICBjZmdfY21kLmV4dGVu ZCAoZXh0cmFfb3B0cykNCiAgICAgICAgY21kbGlzdC5hZGRfY29tbWFuZCgn Y29uZmlndXJlJywgY2ZnX2NtZCkNCiAgICAgICAgY21kbGlzdC5hZGRfY29t bWFuZCgnYnVpbGQnLCBbJ21ha2UnXSkNCiAgICAgICAgY21kbGlzdC5hZGRf Y29tbWFuZCgnY2hlY2snLCBbJ21ha2UnLCAnY2hlY2snXSkNCiAgICAgICAg Y21kbGlzdC5hZGRfY29tbWFuZCgnaW5zdGFsbCcsIFsnbWFrZScsICdpbnN0 YWxsJ10pDQogICAgICAgIGNtZGxpc3QuY2xlYW51cF9kaXIoKQ0KICAgICAg ICBjbWRsaXN0LnBvcF9zdWJkZXNjKCkNCg0KICAgIGRlZiBidWlsZF9jb21w aWxlcnMoc2VsZiwgY29uZmlncyk6DQogICAgICAgICIiIkJ1aWxkIHRoZSBj b21waWxlcnMuIiIiDQogICAgICAgIGlmIG5vdCBjb25maWdzOg0KICAgICAg ICAgICAgc2VsZi5yZW1vdmVfZGlycyhvcy5wYXRoLmpvaW4oc2VsZi5idWls ZGRpciwgJ2NvbXBpbGVycycpKQ0KICAgICAgICAgICAgc2VsZi5yZW1vdmVf ZGlycyhvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsZGlyLCAnY29tcGlsZXJz JykpDQogICAgICAgICAgICBzZWxmLnJlbW92ZV9kaXJzKG9zLnBhdGguam9p bihzZWxmLmxvZ3NkaXIsICdjb21waWxlcnMnKSkNCiAgICAgICAgICAgIGNv bmZpZ3MgPSBzb3J0ZWQoc2VsZi5jb25maWdzLmtleXMoKSkNCiAgICAgICAg Zm9yIGMgaW4gY29uZmlnczoNCiAgICAgICAgICAgIHNlbGYuY29uZmlnc1tj XS5idWlsZCgpDQoNCiAgICBkZWYgYnVpbGRfZ2xpYmNzKHNlbGYsIGNvbmZp Z3MpOg0KICAgICAgICAiIiJCdWlsZCB0aGUgZ2xpYmNzLiIiIg0KICAgICAg ICBpZiBub3QgY29uZmlnczoNCiAgICAgICAgICAgIHNlbGYucmVtb3ZlX2Rp cnMob3MucGF0aC5qb2luKHNlbGYuYnVpbGRkaXIsICdnbGliY3MnKSkNCiAg ICAgICAgICAgIHNlbGYucmVtb3ZlX2RpcnMob3MucGF0aC5qb2luKHNlbGYu aW5zdGFsbGRpciwgJ2dsaWJjcycpKQ0KICAgICAgICAgICAgc2VsZi5yZW1v dmVfZGlycyhvcy5wYXRoLmpvaW4oc2VsZi5sb2dzZGlyLCAnZ2xpYmNzJykp DQogICAgICAgICAgICBjb25maWdzID0gc29ydGVkKHNlbGYuZ2xpYmNfY29u Zmlncy5rZXlzKCkpDQogICAgICAgIGZvciBjIGluIGNvbmZpZ3M6DQogICAg ICAgICAgICBzZWxmLmdsaWJjX2NvbmZpZ3NbY10uYnVpbGQoKQ0KDQoNCmNs YXNzIENvbmZpZzoNCg0KICAgICIiIkEgY29uZmlndXJhdGlvbiBmb3IgYnVp bGRpbmcgYSBjb21waWxlciBhbmQgYXNzb2NpYXRlZCBsaWJyYXJpZXMuIiIi DQoNCiAgICBkZWYgX19pbml0X18oc2VsZiwgY3R4LCBhcmNoLCBvc19uYW1l LCB2YXJpYW50PU5vbmUsIGdjY19jZmc9Tm9uZSwNCiAgICAgICAgICAgICAg ICAgZ2xpYmNzPU5vbmUsIGV4dHJhX2dsaWJjcz1Ob25lKToNCiAgICAgICAg IiIiSW5pdGlhbGl6ZSBhIENvbmZpZyBvYmplY3QuIiIiDQogICAgICAgIHNl bGYuY3R4ID0gY3R4DQogICAgICAgIHNlbGYuYXJjaCA9IGFyY2gNCiAgICAg ICAgc2VsZi5vcyA9IG9zX25hbWUNCiAgICAgICAgc2VsZi52YXJpYW50ID0g dmFyaWFudA0KICAgICAgICBpZiB2YXJpYW50IGlzIE5vbmU6DQogICAgICAg ICAgICBzZWxmLm5hbWUgPSAnJXMtJXMnICUgKGFyY2gsIG9zX25hbWUpDQog ICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm5hbWUgPSAnJXMtJXMt JXMnICUgKGFyY2gsIG9zX25hbWUsIHZhcmlhbnQpDQogICAgICAgIHNlbGYu dHJpcGxldCA9ICclcy1nbGliYy0lcycgJSAoYXJjaCwgb3NfbmFtZSkNCiAg ICAgICAgaWYgZ2NjX2NmZyBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5n Y2NfY2ZnID0gW10NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYu Z2NjX2NmZyA9IGdjY19jZmcNCiAgICAgICAgaWYgZ2xpYmNzIGlzIE5vbmU6 DQogICAgICAgICAgICBnbGliY3MgPSBbeyd2YXJpYW50JzogdmFyaWFudH1d DQogICAgICAgIGlmIGV4dHJhX2dsaWJjcyBpcyBOb25lOg0KICAgICAgICAg ICAgZXh0cmFfZ2xpYmNzID0gW10NCiAgICAgICAgZ2xpYmNzID0gW0dsaWJj KHNlbGYsICoqZykgZm9yIGcgaW4gZ2xpYmNzXQ0KICAgICAgICBleHRyYV9n bGliY3MgPSBbR2xpYmMoc2VsZiwgKipnKSBmb3IgZyBpbiBleHRyYV9nbGli Y3NdDQogICAgICAgIHNlbGYuYWxsX2dsaWJjcyA9IGdsaWJjcyArIGV4dHJh X2dsaWJjcw0KICAgICAgICBzZWxmLmNvbXBpbGVyX2dsaWJjcyA9IGdsaWJj cw0KICAgICAgICBzZWxmLmluc3RhbGxkaXIgPSBjdHguY29tcGlsZXJfaW5z dGFsbGRpcihzZWxmLm5hbWUpDQogICAgICAgIHNlbGYuYmluZGlyID0gY3R4 LmNvbXBpbGVyX2JpbmRpcihzZWxmLm5hbWUpDQogICAgICAgIHNlbGYuc3lz cm9vdCA9IGN0eC5jb21waWxlcl9zeXNyb290KHNlbGYubmFtZSkNCiAgICAg ICAgc2VsZi5idWlsZGRpciA9IG9zLnBhdGguam9pbihjdHguYnVpbGRkaXIs ICdjb21waWxlcnMnLCBzZWxmLm5hbWUpDQogICAgICAgIHNlbGYubG9nc2Rp ciA9IG9zLnBhdGguam9pbihjdHgubG9nc2RpciwgJ2NvbXBpbGVycycsIHNl bGYubmFtZSkNCg0KICAgIGRlZiBjb21wb25lbnRfYnVpbGRkaXIoc2VsZiwg Y29tcG9uZW50KToNCiAgICAgICAgIiIiUmV0dXJuIHRoZSBkaXJlY3Rvcnkg dG8gdXNlIGZvciBhIChub24tZ2xpYmMpIGJ1aWxkLiIiIg0KICAgICAgICBy ZXR1cm4gc2VsZi5jdHguY29tcG9uZW50X2J1aWxkZGlyKCdjb21waWxlcnMn LCBzZWxmLm5hbWUsIGNvbXBvbmVudCkNCg0KICAgIGRlZiBidWlsZChzZWxm KToNCiAgICAgICAgIiIiR2VuZXJhdGUgY29tbWFuZHMgdG8gYnVpbGQgdGhp cyBjb21waWxlci4iIiINCiAgICAgICAgc2VsZi5jdHgucmVtb3ZlX3JlY3Jl YXRlX2RpcnMoc2VsZi5pbnN0YWxsZGlyLCBzZWxmLmJ1aWxkZGlyLA0KICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ3Nk aXIpDQogICAgICAgIGNtZGxpc3QgPSBDb21tYW5kTGlzdCgnY29tcGlsZXJz LSVzJyAlIHNlbGYubmFtZSkNCiAgICAgICAgY21kbGlzdC5hZGRfY29tbWFu ZCgnY2hlY2staG9zdC1saWJyYXJpZXMnLA0KICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFsndGVzdCcsICctZicsDQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLmN0eC5ob3N0X2xpYnJhcmll c19pbnN0YWxsZGlyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgJ29rJyldKQ0KICAgICAgICBjbWRsaXN0LnVzZV9wYXRo KHNlbGYuYmluZGlyKQ0KICAgICAgICBzZWxmLmJ1aWxkX2Nyb3NzX3Rvb2wo Y21kbGlzdCwgJ2JpbnV0aWxzJywgJ2JpbnV0aWxzJywNCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFsnLS1kaXNhYmxlLWdkYicsDQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgJy0tZGlzYWJsZS1saWJkZWNudW1i ZXInLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLWRpc2Fi bGUtcmVhZGxpbmUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICctLWRpc2FibGUtc2ltJ10pDQogICAgICAgIGlmIHNlbGYub3Muc3RhcnRz d2l0aCgnbGludXgnKToNCiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9saW51 eF9oZWFkZXJzKGNtZGxpc3QpDQogICAgICAgIHNlbGYuYnVpbGRfZ2NjKGNt ZGxpc3QsIFRydWUpDQogICAgICAgIGZvciBnIGluIHNlbGYuY29tcGlsZXJf Z2xpYmNzOg0KICAgICAgICAgICAgY21kbGlzdC5wdXNoX3N1YmRlc2MoJ2ds aWJjJykNCiAgICAgICAgICAgIGNtZGxpc3QucHVzaF9zdWJkZXNjKGcubmFt ZSkNCiAgICAgICAgICAgIGcuYnVpbGRfZ2xpYmMoY21kbGlzdCwgVHJ1ZSkN CiAgICAgICAgICAgIGNtZGxpc3QucG9wX3N1YmRlc2MoKQ0KICAgICAgICAg ICAgY21kbGlzdC5wb3Bfc3ViZGVzYygpDQogICAgICAgIHNlbGYuYnVpbGRf Z2NjKGNtZGxpc3QsIEZhbHNlKQ0KICAgICAgICBjbWRsaXN0LmFkZF9jb21t YW5kKCdkb25lJywgWyd0b3VjaCcsDQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbGRpciwg J29rJyldKQ0KICAgICAgICBzZWxmLmN0eC5hZGRfbWFrZWZpbGVfY21kbGlz dCgnY29tcGlsZXJzLSVzJyAlIHNlbGYubmFtZSwgY21kbGlzdCwNCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dzZGly KQ0KDQogICAgZGVmIGJ1aWxkX2Nyb3NzX3Rvb2woc2VsZiwgY21kbGlzdCwg dG9vbF9zcmMsIHRvb2xfYnVpbGQsIGV4dHJhX29wdHM9Tm9uZSk6DQogICAg ICAgICIiIkJ1aWxkIG9uZSBjcm9zcyB0b29sLiIiIg0KICAgICAgICBzcmNk aXIgPSBzZWxmLmN0eC5jb21wb25lbnRfc3JjZGlyKHRvb2xfc3JjKQ0KICAg ICAgICBidWlsZGRpciA9IHNlbGYuY29tcG9uZW50X2J1aWxkZGlyKHRvb2xf YnVpbGQpDQogICAgICAgIGNtZGxpc3QucHVzaF9zdWJkZXNjKHRvb2xfYnVp bGQpDQogICAgICAgIGNtZGxpc3QuY3JlYXRlX3VzZV9kaXIoYnVpbGRkaXIp DQogICAgICAgIGNmZ19jbWQgPSBbb3MucGF0aC5qb2luKHNyY2RpciwgJ2Nv bmZpZ3VyZScpLA0KICAgICAgICAgICAgICAgICAgICctLXByZWZpeD0lcycg JSBzZWxmLmluc3RhbGxkaXIsDQogICAgICAgICAgICAgICAgICAgJy0tYnVp bGQ9JXMnICUgc2VsZi5jdHguYnVpbGRfdHJpcGxldCwNCiAgICAgICAgICAg ICAgICAgICAnLS1ob3N0PSVzJyAlIHNlbGYuY3R4LmJ1aWxkX3RyaXBsZXQs DQogICAgICAgICAgICAgICAgICAgJy0tdGFyZ2V0PSVzJyAlIHNlbGYudHJp cGxldCwNCiAgICAgICAgICAgICAgICAgICAnLS13aXRoLXN5c3Jvb3Q9JXMn ICUgc2VsZi5zeXNyb290XQ0KICAgICAgICBpZiBleHRyYV9vcHRzOg0KICAg ICAgICAgICAgY2ZnX2NtZC5leHRlbmQoZXh0cmFfb3B0cykNCiAgICAgICAg Y21kbGlzdC5hZGRfY29tbWFuZCgnY29uZmlndXJlJywgY2ZnX2NtZCkNCiAg ICAgICAgY21kbGlzdC5hZGRfY29tbWFuZCgnYnVpbGQnLCBbJ21ha2UnXSkN CiAgICAgICAgY21kbGlzdC5hZGRfY29tbWFuZCgnaW5zdGFsbCcsIFsnbWFr ZScsICdpbnN0YWxsJ10pDQogICAgICAgIGNtZGxpc3QuY2xlYW51cF9kaXIo KQ0KICAgICAgICBjbWRsaXN0LnBvcF9zdWJkZXNjKCkNCg0KICAgIGRlZiBp bnN0YWxsX2xpbnV4X2hlYWRlcnMoc2VsZiwgY21kbGlzdCk6DQogICAgICAg ICIiIkluc3RhbGwgTGludXgga2VybmVsIGhlYWRlcnMuIiIiDQogICAgICAg IGFyY2hfbWFwID0geydhcm0nOiAnYXJtJywNCiAgICAgICAgICAgICAgICAg ICAgJ202OGsnOiAnbTY4aycsDQogICAgICAgICAgICAgICAgICAgICd4ODZf NjQnOiAneDg2J30NCiAgICAgICAgbGludXhfYXJjaCA9IE5vbmUNCiAgICAg ICAgZm9yIGsgaW4gYXJjaF9tYXA6DQogICAgICAgICAgICBpZiBzZWxmLmFy Y2guc3RhcnRzd2l0aChrKToNCiAgICAgICAgICAgICAgICBsaW51eF9hcmNo ID0gaw0KICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgIGFzc2VydCBs aW51eF9hcmNoIGlzIG5vdCBOb25lDQogICAgICAgIHNyY2RpciA9IHNlbGYu Y3R4LmNvbXBvbmVudF9zcmNkaXIoJ2xpbnV4JykNCiAgICAgICAgYnVpbGRk aXIgPSBzZWxmLmNvbXBvbmVudF9idWlsZGRpcignbGludXgnKQ0KICAgICAg ICBoZWFkZXJzX2RpciA9IG9zLnBhdGguam9pbihzZWxmLnN5c3Jvb3QsICd1 c3InKQ0KICAgICAgICBjbWRsaXN0LnB1c2hfc3ViZGVzYygnbGludXgnKQ0K ICAgICAgICBjbWRsaXN0LmNyZWF0ZV91c2VfZGlyKGJ1aWxkZGlyKQ0KICAg ICAgICBjbWRsaXN0LmFkZF9jb21tYW5kKCdpbnN0YWxsLWhlYWRlcnMnLA0K ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnbWFrZScsICctQycsIHNy Y2RpciwgJ089JXMnICUgYnVpbGRkaXIsDQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICdBUkNIPSVzJyAlIGxpbnV4X2FyY2gsDQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICdJTlNUQUxMX0hEUl9QQVRIPSVzJyAlIGhl YWRlcnNfZGlyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGVh ZGVyc19pbnN0YWxsJ10pDQogICAgICAgIGNtZGxpc3QuY2xlYW51cF9kaXIo KQ0KICAgICAgICBjbWRsaXN0LnBvcF9zdWJkZXNjKCkNCg0KICAgIGRlZiBi dWlsZF9nY2Moc2VsZiwgY21kbGlzdCwgYm9vdHN0cmFwKToNCiAgICAgICAg IiIiQnVpbGQgR0NDLiIiIg0KICAgICAgICAjIGxpYnNhbml0aXplciBjb21t b25seSBicmVha3MgYmVjYXVzZSBvZiBnbGliYyBoZWFkZXINCiAgICAgICAg IyBjaGFuZ2VzLCBvciBvbiB1bnVzdWFsIHRhcmdldHMuICBsaWJzc3AgaXMg b2YgbGl0dGxlDQogICAgICAgICMgcmVsZXZhbmNlIHdpdGggZ2xpYmMncyBv d24gc3RhY2sgY2hlY2tpbmcgc3VwcG9ydC4NCiAgICAgICAgY2ZnX29wdHMg PSBsaXN0KHNlbGYuZ2NjX2NmZykNCiAgICAgICAgY2ZnX29wdHMgKz0gWyct LWRpc2FibGUtbGlic2FuaXRpemVyJywgJy0tZGlzYWJsZS1saWJzc3AnXQ0K ICAgICAgICBpZiBib290c3RyYXA6DQogICAgICAgICAgICB0b29sX2J1aWxk ID0gJ2djYy1maXJzdCcNCiAgICAgICAgICAgICMgQnVpbGRpbmcgYSBzdGF0 aWMtb25seSwgQy1vbmx5IGNvbXBpbGVyIHRoYXQgaXMNCiAgICAgICAgICAg ICMgc3VmZmljaWVudCB0byBidWlsZCBnbGliYy4gIFZhcmlvdXMgbGlicmFy aWVzIGFuZA0KICAgICAgICAgICAgIyBmZWF0dXJlcyB0aGF0IG1heSByZXF1 aXJlIGxpYmMgaGVhZGVycyBtdXN0IGJlIGRpc2FibGVkLg0KICAgICAgICAg ICAgIyBXaGVuIGNvbmZpZ3VyaW5nIHdpdGggYSBzeXNyb290LCAtLXdpdGgt bmV3bGliIGlzDQogICAgICAgICAgICAjIHJlcXVpcmVkIHRvIGRlZmluZSBp bmhpYml0X2xpYmMgKHRvIHN0b3Agc29tZSBwYXJ0cyBvZg0KICAgICAgICAg ICAgIyBsaWJnY2MgaW5jbHVkaW5nIGxpYmMgaGVhZGVycyk7IC0td2l0aG91 dC1oZWFkZXJzIGlzIG5vdA0KICAgICAgICAgICAgIyBzdWZmaWNpZW50Lg0K ICAgICAgICAgICAgY2ZnX29wdHMgKz0gWyctLWVuYWJsZS1sYW5ndWFnZXM9 YycsICctLWRpc2FibGUtc2hhcmVkJywNCiAgICAgICAgICAgICAgICAgICAg ICAgICAnLS1kaXNhYmxlLXRocmVhZHMnLA0KICAgICAgICAgICAgICAgICAg ICAgICAgICctLWRpc2FibGUtbGliYXRvbWljJywNCiAgICAgICAgICAgICAg ICAgICAgICAgICAnLS1kaXNhYmxlLWRlY2ltYWwtZmxvYXQnLA0KICAgICAg ICAgICAgICAgICAgICAgICAgICctLWRpc2FibGUtbGliZmZpJywNCiAgICAg ICAgICAgICAgICAgICAgICAgICAnLS1kaXNhYmxlLWxpYmdvbXAnLA0KICAg ICAgICAgICAgICAgICAgICAgICAgICctLWRpc2FibGUtbGliaXRtJywNCiAg ICAgICAgICAgICAgICAgICAgICAgICAnLS1kaXNhYmxlLWxpYm1weCcsDQog ICAgICAgICAgICAgICAgICAgICAgICAgJy0tZGlzYWJsZS1saWJxdWFkbWF0 aCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgJy0td2l0aG91dC1oZWFk ZXJzJywgJy0td2l0aC1uZXdsaWInLA0KICAgICAgICAgICAgICAgICAgICAg ICAgICctLXdpdGgtZ2xpYmMtdmVyc2lvbj0lcycgJSBzZWxmLmN0eC5nbGli Y192ZXJzaW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgXQ0KICAgICAg ICBlbHNlOg0KICAgICAgICAgICAgdG9vbF9idWlsZCA9ICdnY2MnDQogICAg ICAgICAgICBjZmdfb3B0cyArPSBbJy0tZW5hYmxlLWxhbmd1YWdlcz1jLGMr KycsICctLWVuYWJsZS1zaGFyZWQnLA0KICAgICAgICAgICAgICAgICAgICAg ICAgICctLWVuYWJsZS10aHJlYWRzJ10NCiAgICAgICAgc2VsZi5idWlsZF9j cm9zc190b29sKGNtZGxpc3QsICdnY2MnLCB0b29sX2J1aWxkLCBjZmdfb3B0 cykNCg0KDQpjbGFzcyBHbGliYzoNCg0KICAgICIiIkEgY29uZmlndXJhdGlv biBmb3IgYnVpbGRpbmcgZ2xpYmMuIiIiDQoNCiAgICBkZWYgX19pbml0X18o c2VsZiwgY29tcGlsZXIsIGFyY2g9Tm9uZSwgb3NfbmFtZT1Ob25lLCB2YXJp YW50PU5vbmUsDQogICAgICAgICAgICAgICAgIGNmZz1Ob25lLCBjY29wdHM9 Tm9uZSk6DQogICAgICAgICIiIkluaXRpYWxpemUgYSBHbGliYyBvYmplY3Qu IiIiDQogICAgICAgIHNlbGYuY3R4ID0gY29tcGlsZXIuY3R4DQogICAgICAg IHNlbGYuY29tcGlsZXIgPSBjb21waWxlcg0KICAgICAgICBpZiBhcmNoIGlz IE5vbmU6DQogICAgICAgICAgICBzZWxmLmFyY2ggPSBjb21waWxlci5hcmNo DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLmFyY2ggPSBhcmNo DQogICAgICAgIGlmIG9zX25hbWUgaXMgTm9uZToNCiAgICAgICAgICAgIHNl bGYub3MgPSBjb21waWxlci5vcw0KICAgICAgICBlbHNlOg0KICAgICAgICAg ICAgc2VsZi5vcyA9IG9zX25hbWUNCiAgICAgICAgc2VsZi52YXJpYW50ID0g dmFyaWFudA0KICAgICAgICBpZiB2YXJpYW50IGlzIE5vbmU6DQogICAgICAg ICAgICBzZWxmLm5hbWUgPSAnJXMtJXMnICUgKHNlbGYuYXJjaCwgc2VsZi5v cykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYubmFtZSA9ICcl cy0lcy0lcycgJSAoc2VsZi5hcmNoLCBzZWxmLm9zLCB2YXJpYW50KQ0KICAg ICAgICBzZWxmLnRyaXBsZXQgPSAnJXMtZ2xpYmMtJXMnICUgKHNlbGYuYXJj aCwgc2VsZi5vcykNCiAgICAgICAgaWYgY2ZnIGlzIE5vbmU6DQogICAgICAg ICAgICBzZWxmLmNmZyA9IFtdDQogICAgICAgIGVsc2U6DQogICAgICAgICAg ICBzZWxmLmNmZyA9IGNmZw0KICAgICAgICBzZWxmLmNjb3B0cyA9IGNjb3B0 cw0KDQogICAgZGVmIHRvb2xfbmFtZShzZWxmLCB0b29sKToNCiAgICAgICAg IiIiUmV0dXJuIHRoZSBuYW1lIG9mIGEgY3Jvc3MtY29tcGlsYXRpb24gdG9v bC4iIiINCiAgICAgICAgY3Rvb2wgPSAnJXMtJXMnICUgKHNlbGYuY29tcGls ZXIudHJpcGxldCwgdG9vbCkNCiAgICAgICAgaWYgc2VsZi5jY29wdHMgYW5k ICh0b29sID09ICdnY2MnIG9yIHRvb2wgPT0gJ2crKycpOg0KICAgICAgICAg ICAgY3Rvb2wgPSAnJXMgJXMnICUgKGN0b29sLCBzZWxmLmNjb3B0cykNCiAg ICAgICAgcmV0dXJuIGN0b29sDQoNCiAgICBkZWYgYnVpbGQoc2VsZik6DQog ICAgICAgICIiIkdlbmVyYXRlIGNvbW1hbmRzIHRvIGJ1aWxkIHRoaXMgZ2xp YmMuIiIiDQogICAgICAgIGJ1aWxkZGlyID0gc2VsZi5jdHguY29tcG9uZW50 X2J1aWxkZGlyKCdnbGliY3MnLCBzZWxmLm5hbWUsICdnbGliYycpDQogICAg ICAgIGluc3RhbGxkaXIgPSBzZWxmLmN0eC5nbGliY19pbnN0YWxsZGlyKHNl bGYubmFtZSkNCiAgICAgICAgbG9nc2RpciA9IG9zLnBhdGguam9pbihzZWxm LmN0eC5sb2dzZGlyLCAnZ2xpYmNzJywgc2VsZi5uYW1lKQ0KICAgICAgICBz ZWxmLmN0eC5yZW1vdmVfcmVjcmVhdGVfZGlycyhpbnN0YWxsZGlyLCBidWls ZGRpciwgbG9nc2RpcikNCiAgICAgICAgY21kbGlzdCA9IENvbW1hbmRMaXN0 KCdnbGliY3MtJXMnICUgc2VsZi5uYW1lKQ0KICAgICAgICBjbWRsaXN0LmFk ZF9jb21tYW5kKCdjaGVjay1jb21waWxlcnMnLA0KICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFsndGVzdCcsICctZicsDQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLmNvbXBpbGVyLmluc3Rh bGxkaXIsICdvaycpXSkNCiAgICAgICAgY21kbGlzdC51c2VfcGF0aChzZWxm LmNvbXBpbGVyLmJpbmRpcikNCiAgICAgICAgc2VsZi5idWlsZF9nbGliYyhj bWRsaXN0LCBGYWxzZSkNCiAgICAgICAgc2VsZi5jdHguYWRkX21ha2VmaWxl X2NtZGxpc3QoJ2dsaWJjcy0lcycgJSBzZWxmLm5hbWUsIGNtZGxpc3QsDQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ3NkaXIp DQoNCiAgICBkZWYgYnVpbGRfZ2xpYmMoc2VsZiwgY21kbGlzdCwgZm9yX2Nv bXBpbGVyKToNCiAgICAgICAgIiIiR2VuZXJhdGUgY29tbWFuZHMgdG8gYnVp bGQgdGhpcyBnbGliYywgZWl0aGVyIGFzIHBhcnQgb2YgYSBjb21waWxlcg0K ICAgICAgICBidWlsZCBvciB3aXRoIHRoZSBib290c3RyYXBwZWQgY29tcGls ZXIgKGFuZCBpbiB0aGUgbGF0dGVyIGNhc2UsIHJ1bg0KICAgICAgICB0ZXN0 cyBhcyB3ZWxsKS4iIiINCiAgICAgICAgc3JjZGlyID0gc2VsZi5jdHguY29t cG9uZW50X3NyY2RpcignZ2xpYmMnKQ0KICAgICAgICBpZiBmb3JfY29tcGls ZXI6DQogICAgICAgICAgICBidWlsZGRpciA9IHNlbGYuY3R4LmNvbXBvbmVu dF9idWlsZGRpcignY29tcGlsZXJzJywNCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29tcGlsZXIu bmFtZSwgJ2dsaWJjJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmFtZSkNCiAgICAgICAgICAg IGluc3RhbGxkaXIgPSBzZWxmLmNvbXBpbGVyLnN5c3Jvb3QNCiAgICAgICAg ICAgIHNyY2Rpcl9jb3B5ID0gc2VsZi5jdHguY29tcG9uZW50X2J1aWxkZGly KCdjb21waWxlcnMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb21waWxlci5uYW1lLA0K ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgJ2dsaWJjLXNyYycsDQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5hbWUpDQog ICAgICAgIGVsc2U6DQogICAgICAgICAgICBidWlsZGRpciA9IHNlbGYuY3R4 LmNvbXBvbmVudF9idWlsZGRpcignZ2xpYmNzJywgc2VsZi5uYW1lLA0KICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgJ2dsaWJjJykNCiAgICAgICAgICAgIGluc3RhbGxkaXIgPSBzZWxmLmN0 eC5nbGliY19pbnN0YWxsZGlyKHNlbGYubmFtZSkNCiAgICAgICAgICAgIHNy Y2Rpcl9jb3B5ID0gc2VsZi5jdHguY29tcG9uZW50X2J1aWxkZGlyKCdnbGli Y3MnLCBzZWxmLm5hbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2xpYmMtc3JjJykNCiAgICAg ICAgY21kbGlzdC5jcmVhdGVfdXNlX2RpcihidWlsZGRpcikNCiAgICAgICAg IyBnbGliYyBidWlsZHMgd3JpdGUgaW50byB0aGUgc291cmNlIGRpcmVjdG9y eSwgYW5kIGV2ZW4gaWYNCiAgICAgICAgIyBub3QgaW50ZW50aW9uYWxseSB0 aGVyZSBpcyBhIHJpc2sgb2YgYnVncyB0aGF0IGludm9sdmUNCiAgICAgICAg IyB3cml0aW5nIGludG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5LiAgVG8gYXZv aWQgcG9zc2libGUNCiAgICAgICAgIyBjb25jdXJyZW5jeSBpc3N1ZXMsIGNv cHkgdGhlIHNvdXJjZSBkaXJlY3RvcnkuDQogICAgICAgIGNtZGxpc3QuY3Jl YXRlX2NvcHlfZGlyKHNyY2Rpciwgc3JjZGlyX2NvcHkpDQogICAgICAgIGNm Z19jbWQgPSBbb3MucGF0aC5qb2luKHNyY2Rpcl9jb3B5LCAnY29uZmlndXJl JyksDQogICAgICAgICAgICAgICAgICAgJy0tcHJlZml4PS91c3InLA0KICAg ICAgICAgICAgICAgICAgICctLWVuYWJsZS1hZGQtb25zJywNCiAgICAgICAg ICAgICAgICAgICAnLS1idWlsZD0lcycgJSBzZWxmLmN0eC5idWlsZF90cmlw bGV0LA0KICAgICAgICAgICAgICAgICAgICctLWhvc3Q9JXMnICUgc2VsZi50 cmlwbGV0LA0KICAgICAgICAgICAgICAgICAgICdDQz0lcycgJSBzZWxmLnRv b2xfbmFtZSgnZ2NjJyksDQogICAgICAgICAgICAgICAgICAgJ0NYWD0lcycg JSBzZWxmLnRvb2xfbmFtZSgnZysrJyksDQogICAgICAgICAgICAgICAgICAg J0FSPSVzJyAlIHNlbGYudG9vbF9uYW1lKCdhcicpLA0KICAgICAgICAgICAg ICAgICAgICdBUz0lcycgJSBzZWxmLnRvb2xfbmFtZSgnYXMnKSwNCiAgICAg ICAgICAgICAgICAgICAnTEQ9JXMnICUgc2VsZi50b29sX25hbWUoJ2xkJyks DQogICAgICAgICAgICAgICAgICAgJ05NPSVzJyAlIHNlbGYudG9vbF9uYW1l KCdubScpLA0KICAgICAgICAgICAgICAgICAgICdPQkpDT1BZPSVzJyAlIHNl bGYudG9vbF9uYW1lKCdvYmpjb3B5JyksDQogICAgICAgICAgICAgICAgICAg J09CSkRVTVA9JXMnICUgc2VsZi50b29sX25hbWUoJ29iamR1bXAnKSwNCiAg ICAgICAgICAgICAgICAgICAnUkFOTElCPSVzJyAlIHNlbGYudG9vbF9uYW1l KCdyYW5saWInKSwNCiAgICAgICAgICAgICAgICAgICAnUkVBREVMRj0lcycg JSBzZWxmLnRvb2xfbmFtZSgncmVhZGVsZicpLA0KICAgICAgICAgICAgICAg ICAgICdTVFJJUD0lcycgJSBzZWxmLnRvb2xfbmFtZSgnc3RyaXAnKV0NCiAg ICAgICAgY2ZnX2NtZCArPSBzZWxmLmNmZw0KICAgICAgICBjbWRsaXN0LmFk ZF9jb21tYW5kKCdjb25maWd1cmUnLCBjZmdfY21kKQ0KICAgICAgICBjbWRs aXN0LmFkZF9jb21tYW5kKCdidWlsZCcsIFsnbWFrZSddKQ0KICAgICAgICBj bWRsaXN0LmFkZF9jb21tYW5kKCdpbnN0YWxsJywgWydtYWtlJywgJ2luc3Rh bGwnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICdpbnN0YWxsX3Jvb3Q9JXMnICUgaW5zdGFsbGRpcl0pDQogICAgICAgIGlm IG5vdCBmb3JfY29tcGlsZXI6DQogICAgICAgICAgICBjbWRsaXN0LmFkZF9j b21tYW5kKCdjaGVjaycsIFsnbWFrZScsICdjaGVjayddKQ0KICAgICAgICBj bWRsaXN0LmNsZWFudXBfZGlyKCdjbGVhbnVwLXNyYycsIHNyY2Rpcl9jb3B5 KQ0KICAgICAgICBjbWRsaXN0LmNsZWFudXBfZGlyKCkNCg0KDQpjbGFzcyBD b21tYW5kOg0KDQogICAgIiIiQSBjb21tYW5kIHJ1biBpbiB0aGUgYnVpbGQg cHJvY2Vzcy4iIiINCg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZXNjLCBu dW0sIGRpciwgcGF0aCwgY29tbWFuZCwgYWx3YXlzX3J1bj1GYWxzZSk6DQog ICAgICAgICIiIkluaXRpYWxpemUgYSBDb21tYW5kIG9iamVjdC4iIiINCiAg ICAgICAgc2VsZi5kaXIgPSBkaXINCiAgICAgICAgc2VsZi5wYXRoID0gcGF0 aA0KICAgICAgICBzZWxmLmRlc2MgPSBkZXNjDQogICAgICAgIHRyYW5zID0g c3RyLm1ha2V0cmFucyh7JyAnOiAnLSd9KQ0KICAgICAgICBzZWxmLmxvZ2Jh c2UgPSAnJTAzZC0lcycgJSAobnVtLCBkZXNjLnRyYW5zbGF0ZSh0cmFucykp DQogICAgICAgIHNlbGYuY29tbWFuZCA9IGNvbW1hbmQNCiAgICAgICAgc2Vs Zi5hbHdheXNfcnVuID0gYWx3YXlzX3J1bg0KDQogICAgQHN0YXRpY21ldGhv ZA0KICAgIGRlZiBzaGVsbF9tYWtlX3F1b3RlX3N0cmluZyhzKToNCiAgICAg ICAgIiIiR2l2ZW4gYSBzdHJpbmcgbm90IGNvbnRhaW5pbmcgYSBuZXdsaW5l LCBxdW90ZSBpdCBmb3IgdXNlIGJ5IHRoZQ0KICAgICAgICBzaGVsbCBhbmQg bWFrZS4iIiINCiAgICAgICAgYXNzZXJ0ICdcbicgbm90IGluIHMNCiAgICAg ICAgaWYgcmUuZnVsbG1hdGNoKCdbXSssLi8wLTlAQS1aX2Etei1dKycsIHMp Og0KICAgICAgICAgICAgcmV0dXJuIHMNCiAgICAgICAgc3RyYW5zID0gc3Ry Lm1ha2V0cmFucyh7IiciOiAiJ1xcJycifSkNCiAgICAgICAgcyA9ICInJXMn IiAlIHMudHJhbnNsYXRlKHN0cmFucykNCiAgICAgICAgbXRyYW5zID0gc3Ry Lm1ha2V0cmFucyh7JyQnOiAnJCQnfSkNCiAgICAgICAgcmV0dXJuIHMudHJh bnNsYXRlKG10cmFucykNCg0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYg c2hlbGxfbWFrZV9xdW90ZV9saXN0KGwsIHRyYW5zbGF0ZV9tYWtlKToNCiAg ICAgICAgIiIiR2l2ZW4gYSBsaXN0IG9mIHN0cmluZ3Mgbm90IGNvbnRhaW5p bmcgbmV3bGluZXMsIHF1b3RlIHRoZW0gZm9yIHVzZQ0KICAgICAgICBieSB0 aGUgc2hlbGwgYW5kIG1ha2UsIHJldHVybmluZyBhIHNpbmdsZSBzdHJpbmcu ICBJZiB0cmFuc2xhdGVfbWFrZQ0KICAgICAgICBpcyB0cnVlIGFuZCB0aGUg Zmlyc3Qgc3RyaW5nIGlzICdtYWtlJywgY2hhbmdlIGl0IHRvICQoTUFLRSku IiIiDQogICAgICAgIGwgPSBbQ29tbWFuZC5zaGVsbF9tYWtlX3F1b3RlX3N0 cmluZyhzKSBmb3IgcyBpbiBsXQ0KICAgICAgICBpZiB0cmFuc2xhdGVfbWFr ZSBhbmQgbFswXSA9PSAnbWFrZSc6DQogICAgICAgICAgICBsWzBdID0gJyQo TUFLRSknDQogICAgICAgIHJldHVybiAnICcuam9pbihsKQ0KDQogICAgZGVm IHNoZWxsX21ha2VfcXVvdGUoc2VsZik6DQogICAgICAgICIiIlJldHVybiB0 aGlzIGNvbW1hbmQgcXVvdGVkIGZvciB0aGUgc2hlbGwgYW5kIG1ha2UuIiIi DQogICAgICAgIHJldHVybiBzZWxmLnNoZWxsX21ha2VfcXVvdGVfbGlzdChz ZWxmLmNvbW1hbmQsIFRydWUpDQoNCg0KY2xhc3MgQ29tbWFuZExpc3Q6DQoN CiAgICAiIiJBIGxpc3Qgb2YgY29tbWFuZHMgcnVuIGluIHRoZSBidWlsZCBw cm9jZXNzLiIiIg0KDQogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRlc2MpOg0K ICAgICAgICAiIiJJbml0aWFsaXplIGEgQ29tbWFuZExpc3Qgb2JqZWN0LiIi Ig0KICAgICAgICBzZWxmLmNtZGxpc3QgPSBbXQ0KICAgICAgICBzZWxmLmRp ciA9IE5vbmUNCiAgICAgICAgc2VsZi5wYXRoID0gTm9uZQ0KICAgICAgICBz ZWxmLmRlc2MgPSBbZGVzY10NCg0KICAgIGRlZiBkZXNjX3R4dChzZWxmLCBk ZXNjKToNCiAgICAgICAgIiIiUmV0dXJuIHRoZSBkZXNjcmlwdGlvbiB0byB1 c2UgZm9yIGEgY29tbWFuZC4iIiINCiAgICAgICAgcmV0dXJuICclcyAlcycg JSAoJyAnLmpvaW4oc2VsZi5kZXNjKSwgZGVzYykNCg0KICAgIGRlZiB1c2Vf ZGlyKHNlbGYsIGRpcik6DQogICAgICAgICIiIlNldCB0aGUgZGVmYXVsdCBk aXJlY3RvcnkgZm9yIHN1YnNlcXVlbnQgY29tbWFuZHMuIiIiDQogICAgICAg IHNlbGYuZGlyID0gZGlyDQoNCiAgICBkZWYgdXNlX3BhdGgoc2VsZiwgcGF0 aCk6DQogICAgICAgICIiIlNldCBhIGRpcmVjdG9yeSB0byBiZSBwcmVwZW5k ZWQgdG8gdGhlIFBBVEggZm9yIHN1YnNlcXVlbnQNCiAgICAgICAgY29tbWFu ZHMuIiIiDQogICAgICAgIHNlbGYucGF0aCA9IHBhdGgNCg0KICAgIGRlZiBw dXNoX3N1YmRlc2Moc2VsZiwgc3ViZGVzYyk6DQogICAgICAgICIiIlNldCB0 aGUgZGVmYXVsdCBzdWJkZXNjcmlwdGlvbiBmb3Igc3Vic2VxdWVudCBjb21t YW5kcyAoZS5nLiwgdGhlDQogICAgICAgIG5hbWUgb2YgYSBjb21wb25lbnQg YmVpbmcgYnVpbHQsIHdpdGhpbiB0aGUgc2VyaWVzIG9mIGNvbW1hbmRzDQog ICAgICAgIGJ1aWxkaW5nIGl0KS4iIiINCiAgICAgICAgc2VsZi5kZXNjLmFw cGVuZChzdWJkZXNjKQ0KDQogICAgZGVmIHBvcF9zdWJkZXNjKHNlbGYpOg0K ICAgICAgICAiIiJQb3AgYSBzdWJkZXNjcmlwdGlvbiBmcm9tIHRoZSBsaXN0 IG9mIGRlc2NyaXB0aW9ucy4iIiINCiAgICAgICAgc2VsZi5kZXNjLnBvcCgp DQoNCiAgICBkZWYgY3JlYXRlX3VzZV9kaXIoc2VsZiwgZGlyKToNCiAgICAg ICAgIiIiUmVtb3ZlIGFuZCByZWNyZWF0ZSBhIGRpcmVjdG9yeSBhbmQgdXNl IGl0IGZvciBzdWJzZXF1ZW50DQogICAgICAgIGNvbW1hbmRzLiIiIg0KICAg ICAgICBzZWxmLmFkZF9jb21tYW5kX2Rpcigncm0nLCBOb25lLCBbJ3JtJywg Jy1yZicsIGRpcl0pDQogICAgICAgIHNlbGYuYWRkX2NvbW1hbmRfZGlyKCdt a2RpcicsIE5vbmUsIFsnbWtkaXInLCAnLXAnLCBkaXJdKQ0KICAgICAgICBz ZWxmLnVzZV9kaXIoZGlyKQ0KDQogICAgZGVmIGNyZWF0ZV9jb3B5X2Rpcihz ZWxmLCBzcmMsIGRlc3QpOg0KICAgICAgICAiIiJSZW1vdmUgYSBkaXJlY3Rv cnkgYW5kIHJlY3JlYXRlIGl0IGFzIGEgY29weSBmcm9tIHRoZSBnaXZlbg0K ICAgICAgICBzb3VyY2UuIiIiDQogICAgICAgIHNlbGYuYWRkX2NvbW1hbmRf ZGlyKCdjb3B5LXJtJywgTm9uZSwgWydybScsICctcmYnLCBkZXN0XSkNCiAg ICAgICAgcGFyZW50ID0gb3MucGF0aC5kaXJuYW1lKGRlc3QpDQogICAgICAg IHNlbGYuYWRkX2NvbW1hbmRfZGlyKCdjb3B5LW1rZGlyJywgTm9uZSwgWydt a2RpcicsICctcCcsIHBhcmVudF0pDQogICAgICAgIHNlbGYuYWRkX2NvbW1h bmRfZGlyKCdjb3B5JywgTm9uZSwgWydjcCcsICctYScsIHNyYywgZGVzdF0p DQoNCiAgICBkZWYgYWRkX2NvbW1hbmRfZGlyKHNlbGYsIGRlc2MsIGRpciwg Y29tbWFuZCwgYWx3YXlzX3J1bj1GYWxzZSk6DQogICAgICAgICIiIkFkZCBh IGNvbW1hbmQgdG8gcnVuIGluIGEgZ2l2ZW4gZGlyZWN0b3J5LiIiIg0KICAg ICAgICBjbWQgPSBDb21tYW5kKHNlbGYuZGVzY190eHQoZGVzYyksIGxlbihz ZWxmLmNtZGxpc3QpLCBkaXIsIHNlbGYucGF0aCwNCiAgICAgICAgICAgICAg ICAgICAgICBjb21tYW5kLCBhbHdheXNfcnVuKQ0KICAgICAgICBzZWxmLmNt ZGxpc3QuYXBwZW5kKGNtZCkNCg0KICAgIGRlZiBhZGRfY29tbWFuZChzZWxm LCBkZXNjLCBjb21tYW5kLCBhbHdheXNfcnVuPUZhbHNlKToNCiAgICAgICAg IiIiQWRkIGEgY29tbWFuZCB0byBydW4gaW4gdGhlIGRlZmF1bHQgZGlyZWN0 b3J5LiIiIg0KICAgICAgICBjbWQgPSBDb21tYW5kKHNlbGYuZGVzY190eHQo ZGVzYyksIGxlbihzZWxmLmNtZGxpc3QpLCBzZWxmLmRpciwNCiAgICAgICAg ICAgICAgICAgICAgICBzZWxmLnBhdGgsIGNvbW1hbmQsIGFsd2F5c19ydW4p DQogICAgICAgIHNlbGYuY21kbGlzdC5hcHBlbmQoY21kKQ0KDQogICAgZGVm IGNsZWFudXBfZGlyKHNlbGYsIGRlc2M9J2NsZWFudXAnLCBkaXI9Tm9uZSk6 DQogICAgICAgICIiIkNsZWFuIHVwIGEgYnVpbGQgZGlyZWN0b3J5LiAgSWYg bm8gZGlyZWN0b3J5IGlzIHNwZWNpZmllZCwgdGhlDQogICAgICAgIGRlZmF1 bHQgZGlyZWN0b3J5IGlzIGNsZWFuZWQgdXAgYW5kIGNlYXNlcyB0byBiZSB0 aGUgZGVmYXVsdA0KICAgICAgICBkaXJlY3RvcnkuIiIiDQogICAgICAgIGlm IGRpciBpcyBOb25lOg0KICAgICAgICAgICAgZGlyID0gc2VsZi5kaXINCiAg ICAgICAgICAgIHNlbGYudXNlX2RpcihOb25lKQ0KICAgICAgICBzZWxmLmFk ZF9jb21tYW5kX2RpcihkZXNjLCBOb25lLCBbJ3JtJywgJy1yZicsIGRpcl0s DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsd2F5c19ydW49VHJ1 ZSkNCg0KICAgIGRlZiBtYWtlZmlsZV9jb21tYW5kcyhzZWxmLCB3cmFwcGVy LCBsb2dzZGlyKToNCiAgICAgICAgIiIiUmV0dXJuIHRoZSBzZXF1ZW5jZSBv ZiBjb21tYW5kcyBpbiB0aGUgZm9ybSBvZiB0ZXh0IGZvciBhIE1ha2VmaWxl Lg0KICAgICAgICBUaGUgZ2l2ZW4gd3JhcHBlciBzY3JpcHQgdGFrZXMgYXJn dW1lbnRzOiBiYXNlIG9mIGxvZ3MgZm9yDQogICAgICAgIHByZXZpb3VzIGNv bW1hbmQsIG9yIGVtcHR5OyBiYXNlIG9mIGxvZ3MgZm9yIHRoaXMgY29tbWFu ZDsNCiAgICAgICAgZGVzY3JpcHRpb247IGRpcmVjdG9yeTsgUEFUSCBhZGRp dGlvbjsgdGhlIGNvbW1hbmQgaXRzZWxmLiIiIg0KICAgICAgICAjIHByZXZf YmFzZSBpcyB0aGUgYmFzZSBvZiB0aGUgbmFtZSBmb3IgbG9ncyBvZiB0aGUg cHJldmlvdXMNCiAgICAgICAgIyBjb21tYW5kIHRoYXQgaXMgbm90IGFsd2F5 cy1ydW4gKHRoYXQgaXMsIGEgYnVpbGQgY29tbWFuZCwNCiAgICAgICAgIyB3 aG9zZSBmYWlsdXJlIHNob3VsZCBzdG9wIHN1YnNlcXVlbnQgYnVpbGQgY29t bWFuZHMgZnJvbQ0KICAgICAgICAjIGJlaW5nIHJ1biwgYXMgb3Bwb3NlZCB0 byBhIGNsZWFudXAgY29tbWFuZCwgd2hpY2ggaXMgcnVuDQogICAgICAgICMg ZXZlbiBpZiBwcmV2aW91cyBjb21tYW5kcyBmYWlsZWQpLg0KICAgICAgICBw cmV2X2Jhc2UgPSAnJw0KICAgICAgICBjbWRzID0gW10NCiAgICAgICAgZm9y IGMgaW4gc2VsZi5jbWRsaXN0Og0KICAgICAgICAgICAgY3R4dCA9IGMuc2hl bGxfbWFrZV9xdW90ZSgpDQogICAgICAgICAgICBpZiBwcmV2X2Jhc2UgYW5k IG5vdCBjLmFsd2F5c19ydW46DQogICAgICAgICAgICAgICAgcHJldl9sb2cg PSBvcy5wYXRoLmpvaW4obG9nc2RpciwgcHJldl9iYXNlKQ0KICAgICAgICAg ICAgZWxzZToNCiAgICAgICAgICAgICAgICBwcmV2X2xvZyA9ICcnDQogICAg ICAgICAgICB0aGlzX2xvZyA9IG9zLnBhdGguam9pbihsb2dzZGlyLCBjLmxv Z2Jhc2UpDQogICAgICAgICAgICBpZiBub3QgYy5hbHdheXNfcnVuOg0KICAg ICAgICAgICAgICAgIHByZXZfYmFzZSA9IGMubG9nYmFzZQ0KICAgICAgICAg ICAgaWYgYy5kaXIgaXMgTm9uZToNCiAgICAgICAgICAgICAgICBkaXIgPSAn Jw0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBkaXIgPSBj LmRpcg0KICAgICAgICAgICAgaWYgYy5wYXRoIGlzIE5vbmU6DQogICAgICAg ICAgICAgICAgcGF0aCA9ICcnDQogICAgICAgICAgICBlbHNlOg0KICAgICAg ICAgICAgICAgIHBhdGggPSBjLnBhdGgNCiAgICAgICAgICAgIHByZWxpbXMg PSBbd3JhcHBlciwgcHJldl9sb2csIHRoaXNfbG9nLCBjLmRlc2MsIGRpciwg cGF0aF0NCiAgICAgICAgICAgIHByZWxpbV90eHQgPSBDb21tYW5kLnNoZWxs X21ha2VfcXVvdGVfbGlzdChwcmVsaW1zLCBGYWxzZSkNCiAgICAgICAgICAg IGNtZHMuYXBwZW5kKCdcdEAlcyAlcycgJSAocHJlbGltX3R4dCwgY3R4dCkp DQogICAgICAgIHJldHVybiAnXG4nLmpvaW4oY21kcykNCg0KDQpkZWYgZ2V0 X3BhcnNlcigpOg0KICAgICIiIlJldHVybiBhbiBhcmd1bWVudCBwYXJzZXIg Zm9yIHRoaXMgbW9kdWxlLiIiIg0KICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFy Z3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPV9fZG9jX18pDQogICAgcGFyc2Vy LmFkZF9hcmd1bWVudCgnLWonLCBkZXN0PSdwYXJhbGxlbGlzbScsDQogICAg ICAgICAgICAgICAgICAgICAgICBoZWxwPSdSdW4gdGhpcyBudW1iZXIgb2Yg am9icyBpbiBwYXJhbGxlbCcsDQogICAgICAgICAgICAgICAgICAgICAgICB0 eXBlPWludCwgZGVmYXVsdD1vcy5jcHVfY291bnQoKSkNCiAgICBwYXJzZXIu YWRkX2FyZ3VtZW50KCd0b3BkaXInLA0KICAgICAgICAgICAgICAgICAgICAg ICAgaGVscD0nVG9wbGV2ZWwgd29ya2luZyBkaXJlY3RvcnknKQ0KICAgIHBh cnNlci5hZGRfYXJndW1lbnQoJ2FjdGlvbicsDQogICAgICAgICAgICAgICAg ICAgICAgICBoZWxwPSdXaGF0IHRvIGRvJywNCiAgICAgICAgICAgICAgICAg ICAgICAgIGNob2ljZXM9KCdob3N0LWxpYnJhcmllcycsICdjb21waWxlcnMn LCAnZ2xpYmNzJykpDQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnY29uZmln cycsDQogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdDb25maWd1cmF0 aW9ucyB0byBidWlsZCcsDQogICAgICAgICAgICAgICAgICAgICAgICBuYXJn cz0nKicpDQogICAgcmV0dXJuIHBhcnNlcg0KDQoNCmRlZiBtYWluKGFyZ3Yp Og0KICAgICIiIlRoZSBtYWluIGVudHJ5IHBvaW50LiIiIg0KICAgIHBhcnNl ciA9IGdldF9wYXJzZXIoKQ0KICAgIG9wdHMgPSBwYXJzZXIucGFyc2VfYXJn cyhhcmd2KQ0KICAgIHRvcGRpciA9IG9zLnBhdGguYWJzcGF0aChvcHRzLnRv cGRpcikNCiAgICBjdHggPSBDb250ZXh0KHRvcGRpciwgb3B0cy5wYXJhbGxl bGlzbSkNCiAgICBjdHgucnVuX2J1aWxkcyhvcHRzLmFjdGlvbiwgb3B0cy5j b25maWdzKQ0KDQoNCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6DQogICAg bWFpbihzeXMuYXJndlsxOl0pDQo= ---1152306461-1977529222-1478133440=:23365--