From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 38487 invoked by alias); 20 Jul 2019 17:51:07 -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 38479 invoked by uid 89); 20 Jul 2019 17:51:07 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-14.8 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.1 spammy=expressing, c.so, cso, effort X-HELO: relay1.mentorg.com Reply-To: From: Chung-Lin Tang Subject: [PATCH 1/2][RFC] #17645, fix slow DSO sorting behavior in dynamic loader To: GNU C Library Message-ID: Date: Sat, 20 Jul 2019 17:51:00 -0000 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------247ED106C26F78D022B10156" X-SW-Source: 2019-07/txt/msg00472.txt.bz2 --------------247ED106C26F78D022B10156 Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit Content-length: 2719 Hi, this patch is our attempt at resolving the slow shared object sorting situation in #17645, #15310, and some effort at #15311. I realize this is pretty unsuitable timing to be submitting a patch of such nature now (probably way too late to be included into 2.30), but still sending now anyways as this will probably need quite some discussion before being approved. Prior attempts at solving this slow sorting behavior appeared to have failed due to inadequate proposed testing, therefore cannot convince reviewers to touch what seems to be perceived as a sensitive and easy to break part of ld.so. Therefore the first part of this patch is not a change to the dynamic loader code proper, but a testing framework for constructing DSO sorting tests. It consists of a new Python script 'dso-ordering-test.py' that serves to generate both testcase source files and the needed Makefile fragments from a short description string, for example: a->b->c->d // four objects linked one after another a->[bc]->d;b->c // a depends on b and c, which both depend on d, // b depends on c (b,c linked to object a in fixed order) a->b->c;{+a;%a;-a} // a, b, c serially dependent, main program uses // dlopen/dlsym/dlclose on object a a->b->c;{}!->[abc] // a, b, c serially dependent; multiple tests generated // to test all permutations of a, b, c ordering linked // to main program (Above is just a short description of what the script can do, more documentation is in the script comments.) and, a patch to glibc/elf/Makefile which uses this script to add a few DSO sorting testcases. The description string notation and output form of the generated testcases is short enough that both the test descriptions and expected outcomes can all directly be specified in the Makefile. In terms of the tests I added using this script, I am not completely sure they are (together with existing tests) adequate to prove algorithmic integrity in face of any ld.so code changes, but the script should provide a solid tool to further improve on coverage. Also welcome suggestions if the current features are still lacking in expressing some case of shared object relations, or if the documentation still feels unclear. Thanks, Chung-Lin 2019-07-20 Chung-Lin Tang [BZ #17645] [BZ #15311] [BZ #15310] * elf/Makefile (test_dso_ordering): New make function. (tst-dso-ordering[123456789]): Define new DSO sorting tests. (tst-bz15311): Testcase from #15311. * scripts/dso-ordering-test.py: New script. --------------247ED106C26F78D022B10156 Content-Type: text/plain; charset="UTF-8"; x-mac-type=0; x-mac-creator=0; name="dlsort-01-tests.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="dlsort-01-tests.patch" Content-length: 32831 ZGlmZiAtLWdpdCBhL2VsZi9NYWtlZmlsZSBiL2VsZi9NYWtlZmlsZQppbmRl eCBhM2VlZmQxYjFmLi4xYzRlOTQxMTU0IDEwMDY0NAotLS0gYS9lbGYvTWFr ZWZpbGUKKysrIGIvZWxmL01ha2VmaWxlCkBAIC0zODMsNiArMzgzLDQ4IEBA IHRlc3RzLXNwZWNpYWwgKz0gJChvYmpwZngpb3JkZXItY21wLm91dCAkKG9i anBmeCl0c3QtYXJyYXkxLWNtcC5vdXQgXAogCQkgJChvYmpwZngpdHN0LXVu dXNlZC1kZXAtY21wLm91dAogZW5kaWYKIAorIyBEU08gc29ydGluZyB0ZXN0 czoKKyMgVGhlIGRzby1vcmRlcmluZy10ZXN0LnB5IHNjcmlwdCBnZW5lcmF0 ZXMgdGVzdGNhc2Ugc291cmNlIGZpbGVzIGluICQob2JqcGZ4KSwKKyMgYW5k IG91dHB1dHMgTWFrZWZpbGUgZnJhZ21lbnRzIGZvciB1c2UgaGVyZS4gSG93 ZXZlciBiZWNhdXNlIG5vcm1hbCBvdXRwdXQKKyMgZnJvbSAkKHNoZWxsIC4u KSBoYXMgbmV3bGluZXMgY2hhbmdlZCBpbnRvIHNwYWNlcywgd2UgaGF2ZSB0 byBzYXZlIGl0IHRvIGEKKyMgdGVtcG9yYXJ5IGZpbGUgYW5kIHRoZW4gaW5j bHVkZSBpdC4gV2Ugd3JhcCB0aGlzIGVudGlyZSB0ZXN0Y2FzZSBjb25zdHJ1 Y3Rpb24KKyMgaW50byBhIGZ1bmN0aW9uIGhlcmUgdG8gbWFrZSB0aGluZ3Mg bW9yZSBjb252ZW5pZW50LgorZGVmaW5lIHRlc3RfZHNvX29yZGVyaW5nCisk KHNoZWxsICQoUFlUSE9OKSAkKC4uKXNjcmlwdHMvZHNvLW9yZGVyaW5nLXRl c3QucHkgXAorCSQoMikgJCgxKSAkKG9ianBmeCkgPiAkKG9ianBmeCkkKDEp LnRtcC1tYWtlZmlsZSkKKyQoc2hlbGwgZWNobyAkKDMpID4gJChvYmpwZngp JCgxKS5leHApCitpbmNsdWRlICQob2JqcGZ4KSQoMSkudG1wLW1ha2VmaWxl CitlbmRlZgorCisjIEluZGl2aWR1YWwgRFNPIHNvcnRpbmcgdGVzdHMuIFRo ZSB0ZXN0IGRlc2NyaXB0aW9uIGFuZCBleHBlY3RlZCBvdXRwdXQgZm9yCisj IGVhY2ggdGVzdCBpcyBzcGVjaWZpZWQgZGlyZWN0bHkgaGVyZS4gU2VlIHRo ZSBzb3VyY2Ugb2YgZHNvLW9yZGVyaW5nLXRlc3QucHkKKyMgZm9yIGRvY3Vt ZW50YXRpb24gb24gdGhpcy4KKyMgTm90ZSB0aGF0IHdlIG5lZWQgdG8gY3Jl YXRlIHRoZSAkKG9ianBmeCkgZGlyZWN0b3J5IGhlcmUgaW1tZWRpYXRlbHkg dG8gaG9sZAorIyB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcyBhbmQgTWFr ZWZpbGUgZnJhZ21lbnRzLgorJChzaGVsbCBta2RpciAtcCAkKG9ianBmeCkp CiskKGV2YWwgJChjYWxsIHRlc3RfZHNvX29yZGVyaW5nLHRzdC1kc28tb3Jk ZXJpbmcxLCdhLT5iLT5jJywnY2Jhe31hYmMnKSkKKyQoZXZhbCAkKGNhbGwg dGVzdF9kc29fb3JkZXJpbmcsdHN0LWRzby1vcmRlcmluZzIsXAorCSdhLT5i LT5bY2RdLT5lJywnZWRjYmF7fWFiY2RlJykpCiskKGV2YWwgJChjYWxsIHRl c3RfZHNvX29yZGVyaW5nLHRzdC1kc28tb3JkZXJpbmczLFwKKwknYS0+W2Jj XS0+W2RlZl0tPltnaF0tPmknLCdpaGdmZWRjYmF7fWFiY2RlZmdoaScpKQor JChldmFsICQoY2FsbCB0ZXN0X2Rzb19vcmRlcmluZyx0c3QtZHNvLW9yZGVy aW5nNCxcCisJJ2EtPmItPltkZV07YS0+Yy0+ZC0+ZScsJ2VkY2Jhe31hYmNk ZScpKQorJChldmFsICQoY2FsbCB0ZXN0X2Rzb19vcmRlcmluZyx0c3QtZHNv LW9yZGVyaW5nNSxcCisJJ2EtPltiY10tPmQ7Yi0+YycsJ2RjYmF7fWFiY2Qn KSkKKyQoZXZhbCAkKGNhbGwgdGVzdF9kc29fb3JkZXJpbmcsdHN0LWRzby1v cmRlcmluZzYsXAorCSdhLT5bYmNkZV0tPmYnLCdmZWRjYmF7fWFiY2RlZicp KQorJChldmFsICQoY2FsbCB0ZXN0X2Rzb19vcmRlcmluZyx0c3QtZHNvLW9y ZGVyaW5nNyxcCisJJ2EtPltiY107Yi0+W2NkZV07ZS0+ZicsJ2ZlZGNiYXt9 YWJjZGVmJykpCiskKGV2YWwgJChjYWxsIHRlc3RfZHNvX29yZGVyaW5nLHRz dC1kc28tb3JkZXJpbmc4LFwKKwknYS0+Yi0+Yz0+YTt7fS0+W2JhXScsJ2Ni YXt9YWJjJykpCiskKGV2YWwgJChjYWxsIHRlc3RfZHNvX29yZGVyaW5nLHRz dC1kc28tb3JkZXJpbmc5LFwKKwknYS0+Yi0+Yy0+ZC0+ZTt7fSEtPlthYmNk ZV0nLCdlZGNiYXt9YWJjZGUnKSkKKworIyBGcm9tIEJaICMxNTMxMQorJChl dmFsICQoY2FsbCB0ZXN0X2Rzb19vcmRlcmluZyx0c3QtYnoxNTMxMSxcCisn eythOytlOytmOytnOytkOyVkOy1kOy1nOy1mOy1lOy1hfTthLT5iLT5jLT5k O2Q9PltiYV07Yz0+YTtiPT5lPT5hO2M9PmY9PmI7ZD0+Zz0+YycsXAorJ3sr YVtkY2JhXTsrZVtlXTsrZltmXTsrZ1tnXTsrZFtdOzxkPGI8ZTxhPj4+PGE+ PGc8YzxhPjxmPGI8ZTxhPj4+Pj4+PjstZFtdOy1nW107LWZbXTstZVtdOy1h W2dmYWJjZGVdO30nKSkKKwogY2hlY2stYWJpOiAkKG9ianBmeCljaGVjay1h YmktbGQub3V0CiB0ZXN0cy1zcGVjaWFsICs9ICQob2JqcGZ4KWNoZWNrLWFi aS1sZC5vdXQKIHVwZGF0ZS1hYmk6IHVwZGF0ZS1hYmktbGQKZGlmZiAtLWdp dCBhL3NjcmlwdHMvZHNvLW9yZGVyaW5nLXRlc3QucHkgYi9zY3JpcHRzL2Rz by1vcmRlcmluZy10ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwMDAuLmNmNmY0MzUyMGYKLS0tIC9kZXYvbnVsbAorKysgYi9z Y3JpcHRzL2Rzby1vcmRlcmluZy10ZXN0LnB5CkBAIC0wLDAgKzEsNTU2IEBA CisjIS91c3IvYmluL3B5dGhvbjMKKyMgR2VuZXJhdGUgdGVzdGNhc2UgZmls ZXMgYW5kIE1ha2VmaWxlIGZyYWdtZW50cyBmb3IgRFNPIHNvcnRpbmcgdGVz dAorIyBDb3B5cmlnaHQgKEMpIDIwMTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uLCBJbmMuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBM aWJyYXJ5LgorIworIyBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3 YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5 IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFs IFB1YmxpYworIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyMgdmVyc2lvbiAyLjEgb2Yg dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl cnNpb24uCisjCisjIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBX SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk IHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIExlc3Nl ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisj CisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhbG9uZyB3aXRo IHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHNlZQorIyA8aHR0cDovL3d3 dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyIiIkdlbmVyYXRlIHRlc3RjYXNl IGZpbGVzIGFuZCBNYWtlZmlsZSBmcmFnbWVudHMgZm9yIERTTyBzb3J0aW5n IHRlc3QKKworVGhpcyBzY3JpcHQgdGFrZXMgYSBzZW1pY29sb24tc2VwYXJh dGVkIGRlc2NyaXB0aW9uIHN0cmluZywgYW5kIGdlbmVyYXRlcworYSB0ZXN0 Y2FzZSwgaW5jbHVkaW5nIG1haW4gcHJvZ3JhbSBhbmQgYXNzb2NpYXRlZCBt b2R1bGVzLCBhbmQgTWFrZWZpbGUKK2ZyYWdtZW50cyBmb3IgaW5jbHVkaW5n IGludG8gZWxmL01ha2VmaWxlLgorCitUaGlzIGlzIGludGVuZGVkIHRvIHNw ZWVkIHVwIGNvbXBsZXggZHluYW1pYyBsaW5rZXIgdGVzdGNhc2UgY29uc3Ry dWN0aW9uLAordGhlcmVmb3JlIGZlYXR1cmVzIGFyZSBsYXJnZWx5IG1lY2hh bmljYWwgaW4gbmF0dXJlOyBpbmNvbnNpc3RlbmNpZXMgb3IKK2Vycm9ycyBt YXkgb2NjdXIgaWYgaW5wdXQgY2FzZSB3YXMgaXRzZWxmIGVycm9yb25vdXMg b3IgaGF2ZQordW5mb3Jlc2VlbiBpbnRlcmFjdGlvbnMuCisKK09uIHRoZSBk ZXNjcmlwdGlvbiBsYW5ndWFnZSB1c2VkLCBhcyBhbiBleGFtcGxlIGRlc2Ny aXB0aW9uIHN0cmluZzoKKworICBhLT5iIS0+W2NkZWZdO2M9Pmc9Pmg7eytj OyVjOy1jfS0+YQorCitFYWNoIHNpbmdsZSBhbHBoYWJldCBjaGFyYWN0ZXIg cmVwcmVzZW50cyBhIHNoYXJlZCBvYmplY3QgbW9kdWxlIChjdXJyZW50bHkK K1thLXpBLVowLTldIGFyZSBhbGxvd2VkLCBjYXNlLXNlbnNpdGl2ZSkKK0Fs bCBzdWNoIHNoYXJlZCBvYmplY3RzIGhhdmUgYSBjb25zdHJ1Y3Rvci9kZXN0 cnVjdG9yIGdlbmVyYXRlZCBmb3IgdGhlbQordGhhdCBlbWl0cyBpdHMgc2lu Z2xlIGNoYXJhY3RlciBuYW1lIGJ5IHB1dGNoYXIoKS4KKworVGhlIC0+IG9w ZXJhdG9yIHNwZWNpZmllcyBhIGxpbmsgdGltZSBkZXBlbmRlbmN5LCB0aGVz ZSBjYW4gYmUgY2hhaW5lZCBmb3IKK2NvbnZlbmllbmNlIChlLmcuIGEtPmIt PmMtPmQpLgorCitUaGUgPT4gb3BlcmF0b3IgY3JlYXRlcyBhIGNhbGwtcmVm ZXJlbmNlLCBlLmcuIGZvciBhPT5iLCBhbiBmbl9hKCkgZnVuY3Rpb24KK2lz IGNyZWF0ZWQgaW5zaWRlIG1vZHVsZSAnYScsIHdoaWNoIGNhbGxzIGZuX2Io KSBpbiBtb2R1bGUgJ2InLgorVGhlc2UgbW9kdWxlIGZ1bmN0aW9ucyBlbWl0 ICc8bmFtZT4nIG91dHB1dCBpbiBuZXN0ZWQgZm9ybSwKK2UuZy4gYT0+YiBl bWl0cyAnPGE8Yj4+JworCitTcXVhcmUgYnJhY2tldHMgW10gaW4gdGhlIGRl c2NyaXB0aW9uIHNwZWNpZmllcyBtdWx0aXBsZSBvYmplY3RzOworZS5nLiBh LT5bYmNkXS0+ZSBpcyBlcXVpdmFsZW50IHRvIGEtPmItPmU7YS0+Yy0+ZTth LT5kLT5lCisKK0Ege30gY29uc3RydWN0IHNwZWNpZmllcyB0aGUgbWFpbiB0 ZXN0IHByb2dyYW0sIGFuZCBpdHMgbGluayBkZXBlbmRlbmNpZXMKK2FyZSBh bHNvIHNwZWNpZmllZCB1c2luZyAtPi4gSW5zaWRlIHt9LCBhIGZldyA7LXNl cGVyYXRlZCBjb25zdHJ1Y3RzIGFyZQorYWxsb3dlZDoKKyAgICAgICAgICth ICAgTG9hZHMgbW9kdWxlIGEgdXNpbmcgZGxvcGVuKFJUTERfTEFaWXxSVExE X0dMT0JBTCkKKyAgICAgICAgIDphICAgTG9hZHMgbW9kdWxlIGEgdXNpbmcg ZGxvcGVuKFJUTERfTEFaWSkKKyAgICAgICAgICVhICAgVXNlIGRsc3ltKCkg dG8gbG9hZCBhbmQgY2FsbCBmbl9hKCkKKyAgICAgICAgIEBhICAgQ2FsbHMg Zm5fYSgpIGRpcmVjdGx5LgorICAgICAgICAgLWEgICBVbmxvYWRzIG1vZHVs ZSBhIHVzaW5nIGRsY2xvc2UoKQorCitUaGUgZ2VuZXJhdGVkIG1haW4gcHJv Z3JhbSBvdXRwdXRzICd7JyAnfScgd2l0aCBhbGwgb3V0cHV0IGZyb20gYWJv dmUKK2NvbnN0cnVjdHMgaW4gYmV0d2Vlbi4gVGhlIG90aGVyIG91dHB1dCBi ZWZvcmUvYWZ0ZXIge30gYXJlIHRoZSBvcmRlcmVkCitjb25zdHJ1Y3Rvci9k ZXN0cnVjdG9yIG91dHB1dC4KKworSWYgbm8ge30gY29uc3RydWN0IGlzIHBy ZXNlbnQsIGEgZGVmYXVsdCBlbXB0eSBtYWluIHByb2dyYW0gaXMgbGlua2Vk CithZ2FpbnN0IGFsbCBvYmplY3RzIHdoaWNoIGhhdmUgbm8gZGVwZW5kZW5j eSBsaW5rZWQgdG8gaXQuIGUuZy4gZm9yCisnW2FiXS0+YztkLT5lJywgdGhl IGRlZmF1bHQgbWFpbiBwcm9ncmFtIGlzIGVxdWl2YWxlbnQgdG8gJ3t9LT5b YWJkXScKKworVGhlICchJyBvcGVyYXRvciBhZnRlciBvYmplY3QgbmFtZXMg dHVybnMgb24gcGVybXV0YXRpb24gb2YgaXRzCitkZXBlbmRlbmNpZXMsIGUu Zy4gd2hpbGUgYS0+W2JjZF0gb25seSBnZW5lcmF0ZXMgb25lIHNldCBvZiBv YmplY3RzLAord2l0aCAnYS5zbycgYnVpbHQgd2l0aCBhIGxpbmsgbGluZSBv ZiAiYi5zbyBjLnNvIGQuc28iLCBmb3IgYSEtPltiY2RdCitwZXJtdXRhdGlv bnMgb2YgYSdzIGRlcGVuZGVuY2llcyBjcmVhdGVzIG11bHRpcGxlIHRlc3Rj YXNlcyB3aXRoCitkaWZmZXJlbnQgbGluayBsaW5lIG9yZGVyczogImIuc28g Yy5zbyBkLnNvIiwgImMuc28gYi5zbyBkLnNvIiwKKyJiLnNvIGQuc28gYy5z byIsIGV0Yy4gTm90ZSB0aGF0IGZvciBhIDx0ZXN0LW5hbWU+IHNwZWNpZmll ZCBvbgordGhlIHNjcmlwdCBjb21tYW5kLWxpbmUsIG11bHRpcGxlIDx0ZXN0 LW5hbWVfMT4sIDx0ZXN0LW5hbWVfMj4sIGV0Yy4KK3Rlc3RzIHdpbGwgYmUg Z2VuZXJhdGVkIChlLmcuIGZvciBhIS0+W2JjXSEtPltkZV0sIGVpZ2h0IHRl c3RzIHdpdGgKK2RpZmZlcmVudCBsaW5rIG9yZGVycyBmb3IgYSwgYiwgYW5k IGMgd2lsbCBiZSBnZW5lcmF0ZWQpCisKKyIiIgorCitpbXBvcnQgcmUKK2lt cG9ydCBvcworaW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBhcmdwYXJzZQor ZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKK2ltcG9ydCBp dGVydG9vbHMKKworIyBCVUlMRF9HQ0MgaXMgb25seSB1c2VkIHVuZGVyIHRo ZSAtLWJ1aWxkIG9wdGlvbiwKKyMgd2hpY2ggYnVpbGRzIHRoZSBnZW5lcmF0 ZWQgdGVzdGNhc2UsIGluY2x1ZGluZyBEU09zIHVzaW5nIEJVSUxEX0dDQy4K KyMgTWFpbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLCBlc3BlY2lhbGx5IGRl YnVnZ2luZyBvZiB0aGlzIHNjcmlwdCwKKyMgYW5kIGNhbiBiZSBjaGFuZ2Vk IGhlcmUgdG8gYW5vdGhlciB0b29sY2hhaW4gcGF0aCBpZiBuZWVkZWQuCiti dWlsZF9nY2MgPSAiZ2NjIgorCitwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVu dFBhcnNlcigpCitwYXJzZXIuYWRkX2FyZ3VtZW50KCJkZXNjcmlwdGlvbiIs CisgICAgICAgICAgICAgICAgICAgIGhlbHA9IkRlc2NyaXB0aW9uIHN0cmlu ZyBvZiBEU08gZGVwZW5kZW5jeSB0ZXN0IHRvIGJlICIKKyAgICAgICAgICAg ICAgICAgICAgImdlbmVyYXRlZCAoc2VlIHNjcmlwdCBzb3VyY2UgZm9yIGRv Y3VtZW50YXRpb24gb2YgIgorICAgICAgICAgICAgICAgICAgICAiZGVzY3Jp cHRpb24gbGFuZ3VhZ2UpIikKK3BhcnNlci5hZGRfYXJndW1lbnQoInRlc3Rf bmFtZSIsIGhlbHA9IklkZW50aWZpZXIgZm9yIHRlc3RjYXNlIGJlaW5nICIK KyAgICAgICAgICAgICAgICAgICAgImdlbmVyYXRlZCIpCitwYXJzZXIuYWRk X2FyZ3VtZW50KCJvYmpwZngiLAorICAgICAgICAgICAgICAgICAgICBoZWxw PSJQYXRoIHRvIHBsYWNlIGdlbmVyYXRlZCBmaWxlcywgZGVmYXVsdHMgdG8g IgorICAgICAgICAgICAgICAgICAgICAiY3VycmVudCBkaXJlY3RvcnkgaWYg bm9uZSBzcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICAgICBuYXJncz0i PyIsIGRlZmF1bHQ9Ii4vIikKK3BhcnNlci5hZGRfYXJndW1lbnQoIi0tYnVp bGQiLCBoZWxwPSJBZnRlciBDIHRlc3RjYXNlIGdlbmVyYXRlZCwgYnVpbGQg aXQgIgorICAgICAgICAgICAgICAgICAgICAidXNpbmcgZ2NjIChmb3IgbWFu dWFsIHRlc3RpbmcgcHVycG9zZXMpIiwKKyAgICAgICAgICAgICAgICAgICAg YWN0aW9uPSJzdG9yZV90cnVlIikKK3BhcnNlci5hZGRfYXJndW1lbnQoIi0t ZGVidWctb3V0cHV0IiwgaGVscD0iUHJpbnRzIHNvbWUgaW50ZXJuYWwgZGF0 YSAiCisgICAgICAgICAgICAgICAgICAgICJzdHJ1Y3R1cmVzOyB1c2VkIGZv ciBkZWJ1Z2dpbmcgb2YgdGhpcyBzY3JpcHQiLAorICAgICAgICAgICAgICAg ICAgICBhY3Rpb249InN0b3JlX3RydWUiKQorY21kbGluZWFyZ3MgPSBwYXJz ZXIucGFyc2VfYXJncygpCitiYXNlX3Rlc3RfbmFtZSA9IGNtZGxpbmVhcmdz LnRlc3RfbmFtZQordGVzdF9uYW1lID0gY21kbGluZWFyZ3MudGVzdF9uYW1l CitvYmpwZnggPSBjbWRsaW5lYXJncy5vYmpwZngKKworb2JqX2RlcHMgPSBP cmRlcmVkRGljdCgpCitvYmpfY2FsbHJlZnMgPSBPcmRlcmVkRGljdCgpCisK K2FsbF9vYmpzID0gW10KK2N1cnJfb2JqcyA9IFtdCisKK29ial9kZXBfcGVy bXV0YXRpb25zID0gT3JkZXJlZERpY3QoKQorCisjIEFkZCAnb2JqZWN0IC0+ IFtvYmplY3QsIG9iamVjdCwgLi4uXScgcmVsYXRpb25zIHRvIENVUlJfTUFQ CitkZWYgYWRkX2RlcHMgKHNyY19vYmpzLCBkc3Rfb2JqcywgY3Vycl9tYXAp OgorICAgIGZvciBzcmMgaW4gc3JjX29ianM6CisgICAgICAgIGZvciBkc3Qg aW4gZHN0X29ianM6CisgICAgICAgICAgICBpZiBub3Qgc3JjIGluIGN1cnJf bWFwOgorICAgICAgICAgICAgICAgIGN1cnJfbWFwW3NyY10gPSBbXQorICAg ICAgICAgICAgaWYgbm90IGRzdCBpbiBjdXJyX21hcFtzcmNdOgorICAgICAg ICAgICAgICAgIGN1cnJfbWFwW3NyY10uYXBwZW5kIChkc3QpCisKKyMgRm9y IGluc2lkZSB0aGUge30gY29uc3RydWN0CittYWluX3Byb2dyYW0gPSBbXQor bWFpbl9wcm9ncmFtX25lZWRzX2xkbCA9IEZhbHNlCittYWluX3Byb2dyYW1f ZGVmYXVsdF9kZXBzID0gVHJ1ZQorZGVmIHByb2Nlc3NfbWFpbl9wcm9ncmFt IChtYWlucHJvZ19zdHIpOgorICAgIGdsb2JhbCBtYWluX3Byb2dyYW0KKyAg ICBnbG9iYWwgbWFpbl9wcm9ncmFtX25lZWRzX2xkbAorICAgIGdsb2JhbCBt YWluX3Byb2dyYW1fZGVmYXVsdF9kZXBzCisgICAgaWYgbWFpbnByb2dfc3Ry OgorICAgICAgICBtYWluX3Byb2dyYW0gPSBtYWlucHJvZ19zdHIuc3BsaXQg KCc7JykKKyAgICBmb3IgcyBpbiBtYWluX3Byb2dyYW06CisgICAgICAgIG0g PSByZS5tYXRjaCAociJeKFsrXC0lOl0pKFswLTlhLXpBLVpdKykkIiwgcykK KyAgICAgICAgaWYgbm90IG06IHByaW50ICgiJyVzJyIgJSAocykpCisgICAg ICAgIGFzc2VydCAobSkKKyAgICAgICAgIyBEZXRlcm1pbmVkIHRoZSBtYWlu IHByb2dyYW0gbmVlZHMgbGliZGwKKyAgICAgICAgbWFpbl9wcm9ncmFtX25l ZWRzX2xkbCA9IFRydWUKKyAgICAgICAgaWYgbGVuKG0uZ3JvdXAoMikpID4g MToKKyAgICAgICAgICAgIHByaW50ICgiRXJyb3I6IG9ubHkgc2luZ2xlIGNo YXJhY3RlciBvYmplY3QgbmFtZXMgYWxsb3dlZCwgIgorICAgICAgICAgICAg ICAgICAgICsgIiclcycgaXMgaW52YWxpZCIgJSAobS5ncm91cCgxKSkpCisg ICAgICAgICAgICBleGl0IC0xCisgICAgICAgIG9iaiA9IG0uZ3JvdXAoMikK KyAgICAgICAgaWYgbm90IG9iaiBpbiBhbGxfb2JqczoKKyAgICAgICAgICAg IGFsbF9vYmpzLmFwcGVuZCAob2JqKQorICAgICAgICBpZiBtLmdyb3VwKDEp ID09ICclJyBvciBtLmdyb3VwKDEpID09ICdAJzoKKyAgICAgICAgICAgIGFk ZF9kZXBzIChbJyMnXSwgW29ial0sIG9ial9jYWxscmVmcykKKyAgICAjIFdl IGhhdmUgYSBtYWluIHByb2dyYW0gc3BlY2lmaWVkLCB0dXJuIHRoaXMgb2Zm CisgICAgbWFpbl9wcm9ncmFtX2RlZmF1bHRfZGVwcyA9IEZhbHNlCisKKyMg TGV4ZXIgZm9yIHRva2VucwordG9rZW5zcGVjID0gWyAoIk9CSiIsICAgICAg ciIoWzAtOWEtekEtWl0rKSIpLAorICAgICAgICAgICAgICAoIkRFUCIsICAg ICAgciItPiIpLAorICAgICAgICAgICAgICAoIkNBTExSRUYiLCAgciI9PiIp LAorICAgICAgICAgICAgICAoIk9CSlNFVCIsICAgciJcWyhbMC05YS16QS1a XSspXF0iKSwKKyAgICAgICAgICAgICAgKCJQUk9HIiwgICAgIHIieyhbMC05 YS16QS1aOys6XC0lXSopfSIpLAorICAgICAgICAgICAgICAoIlBFUk1VVEUi LCAgciIhIiksCisgICAgICAgICAgICAgICgiU0VNSUNPTCIsICByIjsiKSwK KyAgICAgICAgICAgICAgKCJFUlJPUiIsICAgIHIiLiIpIF0KK3Rva19yZSA9 ICd8Jy5qb2luKCcoP1A8JXM+JXMpJyAlIHBhaXIgZm9yIHBhaXIgaW4gdG9r ZW5zcGVjKQorCisjIFN0YXRlIHVzZWQgd2hlbiBwYXJzaW5nIGRlcGVuZGVu Y2llcworaW5fZGVwID0gRmFsc2UKK2luX2NhbGxyZWYgPSBGYWxzZQorZGVm IGNsZWFyX2RlcF9zdGF0ZSAoKToKKyAgICBnbG9iYWwgaW5fZGVwLCBpbl9j YWxscmVmCisgICAgaW5fZGVwID0gaW5fY2FsbHJlZiA9IEZhbHNlCisKKyMg TWFpbiBwYXJzZXIKK2ZvciBtIGluIHJlLmZpbmRpdGVyKHRva19yZSwgY21k bGluZWFyZ3MuZGVzY3JpcHRpb24pOgorICAgIGtpbmQgPSBtLmxhc3Rncm91 cAorICAgIHZhbHVlID0gbS5ncm91cCAoKQorICAgIGlmIGtpbmQgPT0gIk9C SiI6CisgICAgICAgIGlmIGxlbiAodmFsdWUpID4gMToKKyAgICAgICAgICAg IHByaW50ICgiRXJyb3I6IG9ubHkgc2luZ2xlIGNoYXJhY3RlciBvYmplY3Qg bmFtZXMgYWxsb3dlZCwgIgorICAgICAgICAgICAgICAgICAgICsgIiclcycg aXMgaW52YWxpZCIgJSAodmFsdWUpKQorICAgICAgICAgICAgZXhpdCAoLTEp CisgICAgICAgIGlmIGluX2RlcDoKKyAgICAgICAgICAgIGFkZF9kZXBzIChj dXJyX29ianMsIFt2YWx1ZV0sIG9ial9kZXBzKQorICAgICAgICBlbGlmIGlu X2NhbGxyZWY6CisgICAgICAgICAgICBhZGRfZGVwcyAoY3Vycl9vYmpzLCBb dmFsdWVdLCBvYmpfY2FsbHJlZnMpCisgICAgICAgIGNsZWFyX2RlcF9zdGF0 ZSAoKQorICAgICAgICBjdXJyX29ianMgPSBbdmFsdWVdCisgICAgICAgIGlm IG5vdCB2YWx1ZSBpbiBhbGxfb2JqczoKKyAgICAgICAgICAgIGFsbF9vYmpz LmFwcGVuZCAodmFsdWUpCisKKyAgICBlbGlmIGtpbmQgPT0gIk9CSlNFVCI6 CisgICAgICAgIG9ianNldCA9IHZhbHVlWzE6bGVuKHZhbHVlKS0xXQorICAg ICAgICBpZiBpbl9kZXA6CisgICAgICAgICAgICBhZGRfZGVwcyAoY3Vycl9v YmpzLCBsaXN0IChvYmpzZXQpLCBvYmpfZGVwcykKKyAgICAgICAgZWxpZiBp bl9jYWxscmVmOgorICAgICAgICAgICAgYWRkX2RlcHMgKGN1cnJfb2Jqcywg bGlzdCAob2Jqc2V0KSwgb2JqX2NhbGxyZWZzKQorICAgICAgICBjbGVhcl9k ZXBfc3RhdGUgKCkKKyAgICAgICAgY3Vycl9vYmpzID0gbGlzdCAob2Jqc2V0 KQorICAgICAgICBmb3IgbyBpbiBsaXN0IChvYmpzZXQpOgorICAgICAgICAg ICAgaWYgbm90IG8gaW4gYWxsX29ianM6CisgICAgICAgICAgICAgICAgYWxs X29ianMuYXBwZW5kIChvKQorCisgICAgZWxpZiBraW5kID09ICJQRVJNVVRF IjoKKyAgICAgICAgaWYgaW5fZGVwIG9yIGluX2NhbGxyZWY6CisgICAgICAg ICAgICBwcmludCAoIkVycm9yOiBzeW50YXggZXJyb3IsIHBlcm11dGUgb3Bl cmF0aW9uIGludmFsaWQgaGVyZSIpCisgICAgICAgICAgICBleGl0IC0xCisg ICAgICAgIGlmIG5vdCBjdXJyX29ianM6CisgICAgICAgICAgICBwcmludCAo IkVycm9yOiBzeW50YXggZXJyb3IsIG5vIG9iamVjdHMgdG8gcGVybXV0ZSBo ZXJlIikKKyAgICAgICAgICAgIGV4aXQgLTEKKyAgICAgICAgZm9yIG9iaiBp biBjdXJyX29ianM6CisgICAgICAgICAgICBpZiBub3Qgb2JqIGluIG9ial9k ZXBfcGVybXV0YXRpb25zOgorICAgICAgICAgICAgICAgICMgU2lnbmFsIHRo aXMgb2JqZWN0IGhhcyBwZXJtdXRhdGVkIGRlcGVuZGVuY2llcworICAgICAg ICAgICAgICAgIG9ial9kZXBfcGVybXV0YXRpb25zW29ial0gPSBbXQorCisg ICAgZWxpZiBraW5kID09ICJQUk9HIjoKKyAgICAgICAgaWYgbWFpbl9wcm9n cmFtOgorICAgICAgICAgICAgcHJpbnQgKCJFcnJvcjogY2Fubm90IGhhdmUg bW9yZSB0aGFuIG9uZSBtYWluIHByb2dyYW0iKQorICAgICAgICAgICAgZXhp dCAoLTEpCisgICAgICAgIGlmIGluX2RlcDoKKyAgICAgICAgICAgIHByaW50 ICgiRXJyb3I6IG9iamVjdHMgY2Fubm90IGhhdmUgZGVwZW5kZW5jeSBvbiBt YWluIHByb2dyYW0iKQorICAgICAgICAgICAgZXhpdCAoLTEpCisgICAgICAg IGlmIGluX2NhbGxyZWY6CisgICAgICAgICAgICBhZGRfZGVwcyAoY3Vycl9v YmpzLCBbIiMiXSwgb2JqX2NhbGxyZWZzKQorICAgICAgICBwcm9jZXNzX21h aW5fcHJvZ3JhbSAodmFsdWVbMTpsZW4odmFsdWUpLTFdKQorICAgICAgICBj bGVhcl9kZXBfc3RhdGUgKCkKKyAgICAgICAgY3Vycl9vYmpzID0gWyIjIl0K KworICAgIGVsaWYga2luZCA9PSAiREVQIjoKKyAgICAgICAgaWYgaW5fZGVw IG9yIGluX2NhbGxyZWY6CisgICAgICAgICAgICBwcmludCAoIkVycm9yOiBz eW50YXggZXJyb3IsIG11bHRpcGxlIGNvbnRpZ3VvdXMgLT4sPT4gb3BlcmF0 aW9ucyIpCisgICAgICAgICAgICBleGl0IC0xCisgICAgICAgIGluX2RlcCA9 IFRydWUKKworICAgIGVsaWYga2luZCA9PSAiQ0FMTFJFRiI6CisgICAgICAg IGlmIGluX2RlcCBvciBpbl9jYWxscmVmOgorICAgICAgICAgICAgcHJpbnQg KCJFcnJvcjogc3ludGF4IGVycm9yLCBtdWx0aXBsZSBjb250aWd1b3VzIC0+ LD0+IG9wZXJhdGlvbnMiKQorICAgICAgICAgICAgZXhpdCAtMQorICAgICAg ICBpbl9jYWxscmVmID0gVHJ1ZQorICAgICAgICAKKyAgICBlbGlmIGtpbmQg PT0gIlNFTUlDT0wiOgorICAgICAgICBjdXJyX29ianMgPSBbXQorICAgICAg ICBjbGVhcl9kZXBfc3RhdGUgKCkKKworICAgIGVsc2U6CisgICAgICAgIHBy aW50ICgiRXJyb3I6IHVua25vd24gdG9rZW4gJyVzJyIgJSAodmFsdWUpKQor ICAgICAgICBleGl0ICgtMSkKKworZGVmIGZpbmRfb2Jqc19ub3RfZGVwZW5k ZWRfb24gKCk6CisgICAgZ2xvYmFsIGFsbF9vYmpzLCBvYmpfZGVwcworICAg IG9ianNfbm90X2RlcGVuZGVkX29uID0gW10KKyAgICBmb3Igb2JqIGluIGFs bF9vYmpzOgorICAgICAgICBza2lwID0gRmFsc2UKKyAgICAgICAgZm9yIHIg aW4gb2JqX2RlcHMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG9iaiBpbiBy WzFdOgorICAgICAgICAgICAgICAgIHNraXAgPSBUcnVlCisgICAgICAgICAg ICAgICAgYnJlYWsKKyAgICAgICAgaWYgbm90IHNraXA6CisgICAgICAgICAg ICBvYmpzX25vdF9kZXBlbmRlZF9vbi5hcHBlbmQgKG9iaikKKyAgICByZXR1 cm4gb2Jqc19ub3RfZGVwZW5kZWRfb24KKyAgICAgICAgCisjIElmIG5vIG1h aW4gcHJvZ3JhbSB3YXMgc3BlY2lmaWVkIGluIGRlcGVuZGVuY3kgZGVzY3Jp cHRpb24sIG1ha2UgYQorIyBkZWZhdWx0IG1haW4gcHJvZ3JhbSB3aXRoIGRl cHMgcG9pbnRpbmcgdG8gYWxsIERTT3Mgd2hpY2ggYXJlIG5vdAorIyBkZXBl bmRlZCBieSBhbm90aGVyIERTTy4KK2lmIG1haW5fcHJvZ3JhbV9kZWZhdWx0 X2RlcHM6CisgICAgbWFpbl9kZXBzID0gZmluZF9vYmpzX25vdF9kZXBlbmRl ZF9vbiAoKQorICAgICMgbWFpbl9kZXBzID0gW10KKyAgICAjIGZvciBvIGlu IGFsbF9vYmpzOgorICAgICMgICAgIHNraXAgPSBGYWxzZQorICAgICMgICAg IGZvciByIGluIG9ial9kZXBzLml0ZW1zKCk6CisgICAgIyAgICAgICAgIGlm IG8gaW4gclsxXToKKyAgICAjICAgICAgICAgICAgIHNraXAgPSBUcnVlCisg ICAgIyAgICAgICAgICAgICBicmVhaworICAgICMgICAgIGlmIHNraXA6Cisg ICAgIyAgICAgICAgIGNvbnRpbnVlCisgICAgIyAgICAgbWFpbl9kZXBzLmFw cGVuZCAobykKKyAgICBhZGRfZGVwcyAoWyIjIl0sIG1haW5fZGVwcywgb2Jq X2RlcHMpICAgIAorICAgICAgICAKKyMgRGVidWcgb3V0cHV0CitpZiBjbWRs aW5lYXJncy5kZWJ1Z19vdXRwdXQ6CisgICAgcHJpbnQgKCJBbGwgb2JqZWN0 czogJXMiICUgKGFsbF9vYmpzKSkKKyAgICBwcmludCAoIi0tLSBTdGF0aWMg bGluayBkZXBlbmRlbmNpZXMgLS0tIikKKyAgICBmb3IgciBpbiBvYmpfZGVw cy5pdGVtcygpOgorICAgICAgICBwcmludCAoIiVzIC0+ICVzIiAlIChyWzBd LCByWzFdKSkKKyAgICBwcmludCAoIi0tLSBPYmplY3RzIHdob3NlIGRlcGVu ZGVuY2llcyBhcmUgdG8gYmUgcGVybXV0YXRlZCAtLS0iKQorICAgIGZvciBy IGluIG9ial9kZXBfcGVybXV0YXRpb25zLml0ZW1zKCk6CisgICAgICAgIHBy aW50ICgiJXMiICUgKHJbMF0pKQorICAgICNwcmludCAob2JqX2RlcF9wZXJt dXRhdGlvbnMpCisgICAgcHJpbnQgKCItLS0gQ2FsbCByZWZlcmVuY2UgZGVw ZW5kZW5jaWVzIC0tLSIpCisgICAgZm9yIHIgaW4gb2JqX2NhbGxyZWZzLml0 ZW1zKCk6CisgICAgICAgIHByaW50ICgiJXMgPT4gJXMiICUgKHJbMF0sIHJb MV0pKQorICAgIHByaW50ICgiLS0tIG1haW4gcHJvZ3JhbSAtLS0iKQorICAg IHByaW50IChtYWluX3Byb2dyYW0pCisKKyMgTWFpbiB0ZXN0Y2FzZSBwcm9j ZXNzaW5nIHJvdXRpbmUsIGRvZXMgTWFrZWZpbGUgZnJhZ21lbnQgZ2VuZXJh dGlvbiwKKyMgdGVzdGNhc2Ugc291cmNlIGdlbmVyYXRpb24sIGFuZCBpZiAt LWJ1aWxkIHNwZWNpZmllZCBidWlsZHMgdGVzdGNhc2UuCitkZWYgcHJvY2Vz c190ZXN0Y2FzZSAodGVzdF9uYW1lKToKKyAgICBnbG9iYWwgb2JqcGZ4LCBh bGxfb2Jqcywgb2JqX2RlcHMsIG9ial9jYWxscmVmcworICAgIGdsb2JhbCBi YXNlX3Rlc3RfbmFtZSwgbWFpbl9wcm9ncmFtLCBtYWluX3Byb2dyYW1fbmVl ZHNfbGRsCisKKyAgICAjIFByaW50IG91dCBuZWVkZWQgTWFrZWZpbGUgZnJh Z21lbnRzIGZvciB1c2UgaW4gZ2xpYmMvZWxmL01ha2VmaWxlLgorICAgICNp ZiBtYWtlZmlsZToKKyAgICBwcmludCAoImlmZXEgKHllcywkKGJ1aWxkLXNo YXJlZCkpIikKKyAgICB0ID0gIiIKKyAgICBmb3IgbyBpbiBhbGxfb2JqczoK KyAgICAgICAgdCArPSAiICIgKyB0ZXN0X25hbWUgKyAiLSIgKyBvCisgICAg cHJpbnQgKCJtb2R1bGVzLW5hbWVzICs9JXMiICUgKHQpKQorICAgIHByaW50 ICgidGVzdHMgKz0gJXMiICUgKHRlc3RfbmFtZSkpCisKKyAgICAjIFByaW50 IGRpcmVjdCBsaW5rIGRlcGVuZGVuY2llcyBmb3IgZWFjaCBEU08KKyAgICBm b3Igb2JqIGluIGFsbF9vYmpzOgorICAgICAgICBpZiBvYmogaW4gb2JqX2Rl cHM6CisgICAgICAgICAgICBkc28gPSB0ZXN0X25hbWUgKyAiLSIgKyBvYmog KyAiLnNvIgorICAgICAgICAgICAgZGVwc3RyID0gIiIKKyAgICAgICAgICAg IGZvciBkZXAgaW4gb2JqX2RlcHNbb2JqXToKKyAgICAgICAgICAgICAgICBk ZXBzdHIgKz0gIiAkKG9ianBmeCkiICsgdGVzdF9uYW1lICsgIi0iICsgZGVw ICsgIi5zbyIKKyAgICAgICAgICAgIHByaW50ICgiJChvYmpwZngpJXM6JXMi ICUgKGRzbywgZGVwc3RyKSkKKworICAgICMgUHJpbnQgTERGTEFHUy0qIGFu ZCAqLW5vLXotZGVmcworICAgIGZvciBvIGluIGFsbF9vYmpzOgorICAgICAg ICBkc28gPSB0ZXN0X25hbWUgKyAiLSIgKyBvICsgIi5zbyIKKyAgICAgICAg cHJpbnQgKCJMREZMQUdTLSVzID0gJChuby1hcy1uZWVkZWQpIiAlIChkc28p KQorICAgICAgICBpZiBvIGluIG9ial9jYWxscmVmczoKKyAgICAgICAgICAg IHByaW50ICgiJXMtbm8tei1kZWZzID0geWVzIiAlIChkc28pKQorCisgICAg IyBQcmludCBkZXBlbmRlbmNpZXMgZm9yIG1haW4gdGVzdCBwcm9ncmFtCisg ICAgZGVwc3RyID0gIiIKKyAgICBpZiAnIycgaW4gb2JqX2RlcHM6CisgICAg ICAgIGZvciBvIGluIG9ial9kZXBzWycjJ106CisgICAgICAgICAgICBkZXBz dHIgKz0gIiAkKG9ianBmeCkiICsgdGVzdF9uYW1lICsgIi0iICsgbyArICIu c28iCisgICAgaWYgbWFpbl9wcm9ncmFtX25lZWRzX2xkbDoKKyAgICAgICAg ZGVwc3RyICs9ICIgJChsaWJkbCkiCisgICAgcHJpbnQgKCIkKG9ianBmeCkl czolcyIgJSAodGVzdF9uYW1lLCBkZXBzdHIpKQorICAgIHByaW50ICgiTERG TEFHUy0lcyA9ICQobm8tYXMtbmVlZGVkKSIgJSAodGVzdF9uYW1lKSkKKwor ICAgIG5vdF9kZXBlbmRlZF9vYmpzID0gZmluZF9vYmpzX25vdF9kZXBlbmRl ZF9vbiAoKQorICAgIGlmIG5vdF9kZXBlbmRlZF9vYmpzOgorICAgICAgICBk ZXBzdHIgPSAiIgorICAgICAgICBmb3IgZGVwIGluIG5vdF9kZXBlbmRlZF9v YmpzOgorICAgICAgICAgICAgZGVwc3RyICs9ICIgJChvYmpwZngpIiArIHRl c3RfbmFtZSArICItIiArIGRlcCArICIuc28iCisgICAgICAgIHByaW50ICgi JChvYmpwZngpJXMub3V0OiVzIiAlICh0ZXN0X25hbWUsIGRlcHN0cikpCisg ICAgCisgICAgIyBOb3RlIHRoaXMgaXMgY29tcGFyZWQgd2l0aCB0aGUgImJh c2UiIDx0ZXN0X25hbWU+LmV4cCwgbm90CisgICAgIyA8dGVzdF9uYW1lPl88 Tj4gd2l0aCBwZXJtdXRhdGlvbiBpbmRleAorICAgIHByaW50ICgiJChvYmpw ZngpJXMtY21wLm91dDogJChvYmpwZngpJXMuZXhwICQob2JqcGZ4KSVzLm91 dCIKKyAgICAgICAgICAgJSAodGVzdF9uYW1lLCBiYXNlX3Rlc3RfbmFtZSwg dGVzdF9uYW1lKSkKKyAgICBwcmludCAoIlx0ZGlmZiAtd3UgJF4gPiAkQDsg JChldmFsdWF0ZS10ZXN0KSIpCisgICAgcHJpbnQgKCJlbmRpZiIpCisgICAg cHJpbnQgKCJpZmVxICgkKHJ1bi1idWlsdC10ZXN0cykseWVzKSIpCisgICAg cHJpbnQgKCJ0ZXN0cy1zcGVjaWFsICs9ICQob2JqcGZ4KSVzLWNtcC5vdXQi ICUgKHRlc3RfbmFtZSkpCisgICAgcHJpbnQgKCJlbmRpZiIpCisKKyAgICAj IEdlbmVyYXRlIEMgZmlsZXMgYWNjb3JkaW5nIHRvIGRlcGVuZGVuY3kgYW5k IGNhbGxpbmcgcmVsYXRpb25zIGZyb20KKyAgICAjIGRlc2NyaXB0aW9uIHN0 cmluZy4KKyAgICBmb3Igb2JqIGluIGFsbF9vYmpzOgorICAgICAgICBzcmNf bmFtZSA9IHRlc3RfbmFtZSArICItIiArIG9iaiArICIuYyIKKyAgICAgICAg ZiA9IG9wZW4gKG9ianBmeCArIHNyY19uYW1lLCAidyIpCisgICAgICAgIGlm IG9iaiBpbiBvYmpfY2FsbHJlZnM6CisgICAgICAgICAgICBjYWxsZWRfb2Jq cyA9IG9ial9jYWxscmVmc1tvYmpdCisgICAgICAgICAgICBmb3IgY2FsbGVl IGluIGNhbGxlZF9vYmpzOgorICAgICAgICAgICAgICAgIGYud3JpdGUgKCJl eHRlcm4gdm9pZCBmbl8lcyAodm9pZCk7XG4iICUgKGNhbGxlZSkpCisgICAg ICAgIGYud3JpdGUgKCJleHRlcm4gaW50IHB1dGNoYXIoaW50KTtcbiIpCisg ICAgICAgIGYud3JpdGUgKCJzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChj b25zdHJ1Y3RvcikpICIgKworICAgICAgICAgICAgICAgICAiaW5pdCh2b2lk KXtwdXRjaGFyKCclcycpO31cbiIgJSAob2JqKSkKKyAgICAgICAgZi53cml0 ZSAoInN0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKGRlc3RydWN0b3IpKSAi ICsKKyAgICAgICAgICAgICAgICAgImZpbmkodm9pZCl7cHV0Y2hhcignJXMn KTt9XG4iICUgKG9iaikpCisgICAgICAgIGlmIG9iaiBpbiBvYmpfY2FsbHJl ZnM6CisgICAgICAgICAgICBjYWxsZWRfb2JqcyA9IG9ial9jYWxscmVmc1tv YmpdCisgICAgICAgICAgICBmLndyaXRlICgidm9pZCBmbl8lcyAodm9pZCkg e1xuIiAlIChvYmopKQorICAgICAgICAgICAgZi53cml0ZSAoIiAgcHV0Y2hh ciAoJzwnKTtcbiIpOworICAgICAgICAgICAgZi53cml0ZSAoIiAgcHV0Y2hh ciAoJyVzJyk7XG4iICUgKG9iaikpOworICAgICAgICAgICAgZm9yIGNhbGxl ZSBpbiBjYWxsZWRfb2JqczoKKyAgICAgICAgICAgICAgICBmLndyaXRlICgi ICBmbl8lcyAoKTtcbiIgJSAoY2FsbGVlKSkKKyAgICAgICAgICAgIGYud3Jp dGUgKCIgIHB1dGNoYXIgKCc+Jyk7XG4iKTsKKyAgICAgICAgICAgIGYud3Jp dGUgKCJ9XG4iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIGNh bGxyZWYgaW4gb2JqX2NhbGxyZWZzLml0ZW1zKCk6CisgICAgICAgICAgICAg ICAgaWYgb2JqIGluIGNhbGxyZWZbMV06CisgICAgICAgICAgICAgICAgICAg IGYud3JpdGUgKCJ2b2lkIGZuXyVzICh2b2lkKSB7XG4iICUgKG9iaikpCisg ICAgICAgICAgICAgICAgICAgIGYud3JpdGUgKCIgIHB1dGNoYXIgKCc8Jyk7 XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZSAoIiAgcHV0Y2hh ciAoJyVzJyk7XG4iICUgKG9iaikpOworICAgICAgICAgICAgICAgICAgICBm LndyaXRlICgiICBwdXRjaGFyICgnPicpO1xuIik7CisgICAgICAgICAgICAg ICAgICAgIGYud3JpdGUgKCJ9XG4iKQorICAgICAgICAgICAgICAgICAgICBi cmVhaworICAgICAgICBmLmNsb3NlICgpCisKKyAgICAjIE9wZW4gQyBmaWxl IGZvciB3cml0aW5nCisgICAgZiA9IG9wZW4gKG9ianBmeCArIHRlc3RfbmFt ZSArICIuYyIsICJ3IikKKworICAgICMgaWYgdGhlcmUgYXJlIHNvbWUgb3Bl cmF0aW9ucyBpbiBtYWluKCksIGl0IG1lYW5zIHdlIG5lZWQgLWxkbAorICAg IGlmIG1haW5fcHJvZ3JhbV9uZWVkc19sZGw6CisgICAgICAgIGYud3JpdGUg KCIjaW5jbHVkZSA8ZGxmY24uaD5cbiIpCisgICAgZi53cml0ZSAoIiNpbmNs dWRlIDxzdGRpby5oPlxuIikKKyAgICBmLndyaXRlICgiI2luY2x1ZGUgPHN0 ZGxpYi5oPlxuIikKKyAgICBmb3IgcyBpbiBtYWluX3Byb2dyYW06CisgICAg ICAgIGlmIHNbMF0gPT0gJ0AnOgorICAgICAgICAgICAgZi53cml0ZSAoImV4 dGVybiB2b2lkIGZuXyVzICh2b2lkKTtcbiIsIHNbMV0pOworICAgIGYud3Jp dGUgKCJpbnQgbWFpbiAodm9pZCkge1xuIikKKyAgICBmLndyaXRlICgiICBw dXRjaGFyKCd7Jyk7XG4iKQorCisgICAgIyBIZWxwZXIgcm91dGluZSBmb3Ig c2FuaXR5IGNoZWNrIGNvZGUKKyAgICBkZWYgcHV0X2ZhaWxfY2hlY2sgKGZh aWxfY29uZCwgYWN0aW9uX2Rlc2MpOgorICAgICAgICBmLndyaXRlICgnICBp ZiAoJXMpIHsgcHJpbnRmICgiXFxuJXMgZmFpbGVkOiAlJXNcXG4iLCAnCisg ICAgICAgICAgICAgICAgICdkbGVycm9yICgpKTsgZXhpdCAoMSk7fVxuJyAl IChmYWlsX2NvbmQsIGFjdGlvbl9kZXNjKSkKKyAgICBpID0gMAorICAgIHdo aWxlIGkgPCBsZW4obWFpbl9wcm9ncmFtKToKKyAgICAgICAgcyA9IG1haW5f cHJvZ3JhbVtpXQorICAgICAgICBvYmogPSBzW2xlbihzKS0xXQorICAgICAg ICBkc28gPSB0ZXN0X25hbWUgKyAiLSIgKyBvYmoKKyAgICAgICAgaWYgc1sw XSA9PSAnKycgb3Igc1swXSA9PSAnOic6CisgICAgICAgICAgICBpZiBzWzBd ID09ICcrJzoKKyAgICAgICAgICAgICAgICBkbG9wZW5fZmxhZ3MgPSAiUlRM RF9MQVpZfFJUTERfR0xPQkFMIgorICAgICAgICAgICAgICAgIGYud3JpdGUg KCIgIHB1dGNoYXIoJysnKTtcbiIpOworICAgICAgICAgICAgZWxzZToKKyAg ICAgICAgICAgICAgICBkbG9wZW5fZmxhZ3MgPSAiUlRMRF9MQVpZIgorICAg ICAgICAgICAgICAgIGYud3JpdGUgKCIgIHB1dGNoYXIoJzonKTtcbiIpOwor ICAgICAgICAgICAgZi53cml0ZSAoIiAgcHV0Y2hhcignJXMnKTtcbiIgJSAo b2JqKSk7CisgICAgICAgICAgICBmLndyaXRlICgiICBwdXRjaGFyKCdbJyk7 XG4iKTsKKyAgICAgICAgICAgIGYud3JpdGUgKCcgIHZvaWQgKiVzID0gZGxv cGVuICgiJXMuc28iLCAlcyk7XG4nCisgICAgICAgICAgICAgICAgICAgICAl IChvYmosIGRzbywgZGxvcGVuX2ZsYWdzKSkKKyAgICAgICAgICAgIHB1dF9m YWlsX2NoZWNrICgiISVzIiAlIChvYmopLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICIlcy5zbyBkbG9wZW4iICUgKGRzbykpCisgICAgICAgICAg ICBmLndyaXRlICgiICBwdXRjaGFyKCddJyk7XG4iKTsKKyAgICAgICAgZWxp ZiBzWzBdID09ICctJzoKKyAgICAgICAgICAgIGYud3JpdGUgKCIgIHB1dGNo YXIoJy0nKTtcbiIpOworICAgICAgICAgICAgZi53cml0ZSAoIiAgcHV0Y2hh cignJXMnKTtcbiIgJSAob2JqKSk7CisgICAgICAgICAgICBmLndyaXRlICgi ICBwdXRjaGFyKCdbJyk7XG4iKTsKKyAgICAgICAgICAgIHB1dF9mYWlsX2No ZWNrICgiZGxjbG9zZSAoJXMpICE9IDAiICUgKG9iaiksCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIiVzLnNvIGRsY2xvc2UiICUgKGRzbykpCisg ICAgICAgICAgICBmLndyaXRlICgiICBwdXRjaGFyKCddJyk7XG4iKTsKKyAg ICAgICAgZWxpZiBzWzBdID09ICclJzoKKyAgICAgICAgICAgIGYud3JpdGUg KCcgIHZvaWQgKCpmbl8lcykodm9pZCkgPSBkbHN5bSAoJXMsICJmbl8lcyIp O1xuJworICAgICAgICAgICAgICAgICAgICAgJSAob2JqLCBvYmosIG9iaikp CisgICAgICAgICAgICBwdXRfZmFpbF9jaGVjayAoIiFmbl8lcyIgJSAob2Jq KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGxzeW0oZm5fJXMp IGZyb20gJXMuc28iICUgKG9iaiwgZHNvKSkKKyAgICAgICAgICAgIGYud3Jp dGUgKCIgIGZuXyVzICgpO1xuIiAlIChvYmopKQorICAgICAgICBlbGlmIHNb MF0gPT0gJ0AnOgorICAgICAgICAgICAgZi53cml0ZSAoIiAgZm5fJXMgKCk7 XG4iICUgKG9iaikpCisgICAgICAgIGYud3JpdGUgKCIgIHB1dGNoYXIoJzsn KTtcbiIpOworICAgICAgICBpICs9IDEKKyAgICBmLndyaXRlICgiICBwdXRj aGFyKCd9Jyk7XG4iKQorICAgIGYud3JpdGUgKCIgIHJldHVybiAwO1xuIikK KyAgICBmLndyaXRlICgifVxuIikKKyAgICBmLmNsb3NlICgpCisKKyAgICAj IEhlbHBlciByb3V0aW5lIHRvIHJ1biBhIHNoZWxsIGNvbW1hbmQsIGZvciBy dW5uaW5nIEdDQyBiZWxvdworICAgIGRlZiBydW5fY21kIChhcmdzKToKKyAg ICAgICAgaWYgY21kbGluZWFyZ3MuZGVidWdfb3V0cHV0OgorICAgICAgICAg ICAgcHJpbnQgKHN0ci5qb2luICgnICcsIGFyZ3MpKQorICAgICAgICBwID0g c3VicHJvY2Vzcy5Qb3BlbiAoYXJncykKKyAgICAgICAgcC53YWl0ICgpCisg ICAgICAgIGlmIHAucmV0dXJuY29kZSAhPSAwOgorICAgICAgICAgICAgcHJp bnQgKCJFcnJvciBydW5uaW5nOiAlcyIgJSAoc3RyLmpvaW4gKCcgJywgYXJn cykpKQorICAgICAgICAgICAgZXhpdCAtMQorCisgICAgIyBEZXB0aC1maXJz dCB0cmF2ZXJzYWwsIGV4ZWN1dGluZyBGTihPQkopIGluIHBvc3Qtb3JkZXIK KyAgICBvYmpfdmlzaXRlZCA9IHt9CisgICAgZGVmIGRmcyAob2JqLCBmbik6 CisgICAgICAgIGlmIG9iaiBpbiBvYmpfdmlzaXRlZDoKKyAgICAgICAgICAg IHJldHVybgorICAgICAgICBvYmpfdmlzaXRlZFtvYmpdID0gVHJ1ZQorICAg ICAgICBpZiBvYmogaW4gb2JqX2RlcHM6CisgICAgICAgICAgICBmb3IgZGVw IGluIG9ial9kZXBzW29ial06CisgICAgICAgICAgICAgICAgZGZzIChkZXAs IGZuKQorICAgICAgICBmbiAob2JqKQorCisgICAgIyBGdW5jdGlvbiB0byBj cmVhdGUgPHRlc3RfbmFtZT4tPG9iaj4uc28KKyAgICBkZWYgYnVpbGRfZHNv IChvYmopOgorICAgICAgICBvYmpfbmFtZSA9IHRlc3RfbmFtZSArICItIiAr IG9iaiArICIub3MiCisgICAgICAgIGRzb19uYW1lID0gdGVzdF9uYW1lICsg Ii0iICsgb2JqICsgIi5zbyIKKyAgICAgICAgZGVwcyA9IFtdCisgICAgICAg IGlmIG9iaiBpbiBvYmpfZGVwczoKKyAgICAgICAgICAgIGRlcHMgPSBvYmpf ZGVwc1tvYmpdCisgICAgICAgIGRzb19kZXBzID0gbWFwIChsYW1iZGEgZDog b2JqcGZ4ICsgdGVzdF9uYW1lICsgIi0iICsgZCArICIuc28iLCBkZXBzKQor ICAgICAgICBjbWQgPSAoW2J1aWxkX2djYywgIi1zaGFyZWQiLCAiLW8iLCBv YmpwZnggKyBkc29fbmFtZSwKKyAgICAgICAgICAgICAgICBvYmpwZnggKyBv YmpfbmFtZSwgIi1XbCwtLW5vLWFzLW5lZWRlZCJdICsgbGlzdChkc29fZGVw cykpCisgICAgICAgIHJ1bl9jbWQgKGNtZCkKKworICAgICMgLS1idWlsZCBv cHRpb24gcHJvY2Vzc2luZzogYnVpbGQgZ2VuZXJhdGVkIHNvdXJjZXMgdXNp bmcgJ2J1aWxkX2djYycKKyAgICBpZiBjbWRsaW5lYXJncy5idWlsZDoKKyAg ICAgICAgIyBDb21waWxlIGluZGl2aWR1YWwgLm9zIGZpbGVzCisgICAgICAg IGZvciBvYmogaW4gYWxsX29ianM6CisgICAgICAgICAgICBzcmNfbmFtZSA9 IHRlc3RfbmFtZSArICItIiArIG9iaiArICIuYyIKKyAgICAgICAgICAgIG9i al9uYW1lID0gdGVzdF9uYW1lICsgIi0iICsgb2JqICsgIi5vcyIKKyAgICAg ICAgICAgIHJ1bl9jbWQgKFtidWlsZF9nY2MsICItYyIsICItZlBJQyIsIG9i anBmeCArIHNyY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICItbyIs IG9ianBmeCArIG9ial9uYW1lXSkKKworICAgICAgICAjIEJ1aWxkIGFsbCBE U09zLCB0aGlzIG5lZWRzIHRvIGJlIGluIHRvcG9sb2dpY2FsIGRlcGVuZGVu Y3kgb3JkZXIsCisgICAgICAgICMgb3IgbGluayB3aWxsIGZhaWwKKyAgICAg ICAgZm9yIG9iaiBpbiBhbGxfb2JqczoKKyAgICAgICAgICAgIGRmcyAob2Jq LCBidWlsZF9kc28pCisKKyAgICAgICAgIyBCdWlsZCBtYWluIHByb2dyYW0K KyAgICAgICAgZGVwcyA9IFtdCisgICAgICAgIGlmICcjJyBpbiBvYmpfZGVw czoKKyAgICAgICAgICAgIGRlcHMgPSBvYmpfZGVwc1snIyddCisgICAgICAg IG1haW5fZGVwcyA9IG1hcCAobGFtYmRhIGQ6IG9ianBmeCArIHRlc3RfbmFt ZSArICItIiArIGQgKyAiLnNvIiwgZGVwcykKKyAgICAgICAgY21kID0gKFti dWlsZF9nY2MsICItV2wsLS1uby1hcy1uZWVkZWQiLCAiLW8iLCBvYmpwZngg KyB0ZXN0X25hbWUsCisgICAgICAgICAgICAgICAgb2JqcGZ4ICsgdGVzdF9u YW1lICsgIi5jIiwgIi1MJXMiICUgKG9zLmdldGN3ZCAoKSksCisgICAgICAg ICAgICAgICAgIi1XbCwtcnBhdGgtbGluaz0lcyIgJSAob3MuZ2V0Y3dkICgp KV0KKyAgICAgICAgICAgICAgICsgbGlzdCAobWFpbl9kZXBzKSkKKyAgICAg ICAgaWYgbWFpbl9wcm9ncmFtX25lZWRzX2xkbDoKKyAgICAgICAgICAgIGNt ZCArPSBbIi1sZGwiXQorICAgICAgICBydW5fY21kIChjbWQpCisKKyMgQ2hl Y2sgaWYgd2UgbmVlZCB0byBlbnVtZXJhdGUgcGVybXV0YXRpb25zIG9mIGRl cGVuZGVuY2llcworbmVlZF9wZXJtdXRhdGlvbl9wcm9jZXNzaW5nID0gRmFs c2UgICAgICAgCitpZiBvYmpfZGVwX3Blcm11dGF0aW9uczoKKyAgICAjIEFk anVzdCBvYmpfZGVwX3Blcm11dGF0aW9ucyBpbnRvIG1hcCBvZiBvYmplY3Qg LT4gZGVwZW5kZW5jeSBwZXJtdXRhdGlvbnMKKyAgICBmb3IgciBpbiBvYmpf ZGVwX3Blcm11dGF0aW9ucy5pdGVtcygpOgorICAgICAgICBvYmogPSByWzBd CisgICAgICAgIGlmIG9iaiBpbiBvYmpfZGVwcyBhbmQgbGVuKG9ial9kZXBz W29ial0pID4gMToKKyAgICAgICAgICAgIGRlcHMgPSBvYmpfZGVwc1tvYmpd CisgICAgICAgICAgICBvYmpfZGVwX3Blcm11dGF0aW9uc1tvYmpdID0gbGlz dCAoaXRlcnRvb2xzLnBlcm11dGF0aW9ucyAoZGVwcykpCisgICAgICAgICAg ICBuZWVkX3Blcm11dGF0aW9uX3Byb2Nlc3NpbmcgPSBUcnVlCisKK3Rlc3Rf c3ViaW5kZXggPSAxCitjdXJyX3Blcm1zID0gW10KK2RlZiBlbnVtX3Blcm11 dGF0aW9ucyAocGVybV9saXN0KToKKyAgICBnbG9iYWwgdGVzdF9uYW1lLCBv YmpfZGVwcywgdGVzdF9zdWJpbmRleCwgY3Vycl9wZXJtcworICAgIGlmIGxl bihwZXJtX2xpc3QpID49IDE6CisgICAgICAgIGN1cnIgPSBwZXJtX2xpc3Rb MF0KKyAgICAgICAgb2JqID0gY3VyclswXQorICAgICAgICBwZXJtcyA9IGN1 cnJbMV0KKyAgICAgICAgaWYgbm90IHBlcm1zOgorICAgICAgICAgICAgIyBU aGlzIG1heSBiZSBhbiBlbXB0eSBsaXN0IGlmIG5vIG11bHRpcGxlIGRlcGVu ZGVuY2llcyB0byBwZXJtdXRlCisgICAgICAgICAgICAjIHdlcmUgZm91bmQs IHNraXAgdG8gbmV4dCBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgIGVudW1f cGVybXV0YXRpb25zIChwZXJtX2xpc3RbMTpdKQorICAgICAgICBlbHNlOgor ICAgICAgICAgICAgZm9yIGRlcHMgaW4gcGVybXM6CisgICAgICAgICAgICAg ICAgb2JqX2RlcHNbb2JqXSA9IGRlcHMKKyAgICAgICAgICAgICAgICBwZXJt c3RyID0gIiIgaWYgb2JqID09ICIjIiBlbHNlIG9iaiArICJfIgorICAgICAg ICAgICAgICAgIHBlcm1zdHIgKz0gc3RyLmpvaW4gKCcnLCBkZXBzKQorICAg ICAgICAgICAgICAgIGN1cnJfcGVybXMuYXBwZW5kIChwZXJtc3RyKSAKKyAg ICAgICAgICAgICAgICBlbnVtX3Blcm11dGF0aW9ucyAocGVybV9saXN0WzE6 XSkKKyAgICAgICAgICAgICAgICBjdXJyX3Blcm1zID0gY3Vycl9wZXJtc1sw OmxlbihjdXJyX3Blcm1zKS0xXQorICAgIGVsc2U6CisgICAgICAgICMgb2Jq X2RlcHMgaXMgbm93IGluc3RhbnRpYXRlZCB3aXRoIG9uZSBkZXBlbmRlbmN5 IG9yZGVyIHBlcm11dGF0aW9uCisgICAgICAgICMgKGFjcm9zcyBhbGwgb2Jq ZWN0cyB0aGF0IGhhdmUgbXVsdGlwbGUgcGVybXV0YXRpb25zKQorICAgICAg ICAjIE5vdyBwcm9jZXNzIGEgdGVzdGNhc2UKKyAgICAgICAgI2lmIG5vdCBv cy5wYXRoLmV4aXN0cyAob2JqcGZ4ICsgYmFzZV90ZXN0X25hbWUrICItcGVy bXV0YXRpb25zLyIpOgorICAgICAgICAjICAgIG9zLm1rZGlyIChvYmpwZngg KyBiYXNlX3Rlc3RfbmFtZSsgIi1wZXJtdXRhdGlvbnMvIikKKyAgICAgICAg cHJvY2Vzc190ZXN0Y2FzZSAoYmFzZV90ZXN0X25hbWUgKyAiXyIgKyBzdHIg KHRlc3Rfc3ViaW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICsg Ii0iICsgc3RyLmpvaW4gKCctJywgY3Vycl9wZXJtcykpCisgICAgICAgIHRl c3Rfc3ViaW5kZXggKz0gMQorCitpZiBuZWVkX3Blcm11dGF0aW9uX3Byb2Nl c3Npbmc6CisgICAgZW51bV9wZXJtdXRhdGlvbnMgKGxpc3QgKG9ial9kZXBf cGVybXV0YXRpb25zLml0ZW1zKCkpKQorZWxzZToKKyAgICAjIFdlIGhhdmUg bm8gcGVybXV0YXRpb25zIHRvIGVudW1lcmF0ZSwganVzdCBwcm9jZXNzIHRl c3RjYXNlIG5vcm1hbGx5CisgICAgcHJvY2Vzc190ZXN0Y2FzZSAodGVzdF9u YW1lKQorCg== --------------247ED106C26F78D022B10156--