Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:75308 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 21765 invoked from network); 7 Jul 2014 13:53:22 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 7 Jul 2014 13:53:22 -0000 Authentication-Results: pb1.pair.com smtp.mail=mike.php.net@gmail.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=mike.php.net@gmail.com; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.217.176 as permitted sender) X-PHP-List-Original-Sender: mike.php.net@gmail.com X-Host-Fingerprint: 209.85.217.176 mail-lb0-f176.google.com Received: from [209.85.217.176] ([209.85.217.176:36834] helo=mail-lb0-f176.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 57/60-19233-056AAB35 for ; Mon, 07 Jul 2014 09:53:21 -0400 Received: by mail-lb0-f176.google.com with SMTP id w7so2857865lbi.21 for ; Mon, 07 Jul 2014 06:53:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:date:message-id:subject:from:to:content-type; bh=Exr1mBn9ZbTrc588lA5a+pwN9OM8N50E65HxbVNKNmE=; b=QEnbF7SBisEcAgYCDQHQEKECKnvrXoFvTqfZXRbXpbg37kXffIftZvvLBZmaQDPOHg 6+DxMapCpXp4Bjo8d/VcAALB0JKlKhPHaXMUvKl+RVDoDexvKd9r8sbCOt/GUfRq8JsE xfg4ixO2GM5AuzZYcfSG5b1cdelir2autPKktoCC7iXQcSjFTfDbYF0S616o35L9IVoF GwqCry8/uTHFdjKHXGdl/Tp477teXcxOGDu9tauJqh+KFk/8h4qwLfZ2oxhBCdvwj6xN Y5YUDJY4H3S0NCxcJpWAMUQqCCCq8Mwezzo9Rz06fpGROY6p/nouUKgcqmkOSJ5z6yNg KREA== MIME-Version: 1.0 X-Received: by 10.152.6.74 with SMTP id y10mr1458776lay.89.1404741197576; Mon, 07 Jul 2014 06:53:17 -0700 (PDT) Sender: mike.php.net@gmail.com Received: by 10.114.19.10 with HTTP; Mon, 7 Jul 2014 06:53:17 -0700 (PDT) Date: Mon, 7 Jul 2014 15:53:17 +0200 X-Google-Sender-Auth: bB-VBdyYReWBwKLIxIOUtvWixBI Message-ID: To: PHP Internals Content-Type: multipart/mixed; boundary=089e0149401a1553c304fd9acc87 Subject: Concurrency support for run-tests From: mike@php.net (Michael Wallner) --089e0149401a1553c304fd9acc87 Content-Type: multipart/alternative; boundary=089e0149401a1553ba04fd9acc85 --089e0149401a1553ba04fd9acc85 Content-Type: text/plain; charset=UTF-8 Hi! I also have a patch for run-tests sitting around for quite some time, which adds concurrent test execution support. I already fixed a lot of non re-entrant tests in the past, but there might still be quite some of them. Tests in ./Zend take 8 seconds instead of 30 on my box. Please find the hack attached. Thoughts, praises, death threats? -- Regards, Mike --089e0149401a1553ba04fd9acc85 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Hi!

I also have a patch for run-tests s= itting around for quite some time, which adds concurrent test execution sup= port. I already fixed a lot of non re-entrant tests in the past, but there = might still be quite some of them.

Tests in ./Zend take 8 seconds instead of 30 on my box.=

Please find the hack attached. Thoughts, praises,= death threats?

--
Regards,
Mike
--089e0149401a1553ba04fd9acc85-- --089e0149401a1553c304fd9acc87 Content-Type: text/plain; charset=US-ASCII; name="run-tests-parallel.txt" Content-Disposition: attachment; filename="run-tests-parallel.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hxbumfma0 ZGlmZiAtLWdpdCBhL3J1bi10ZXN0cy5waHAgYi9ydW4tdGVzdHMucGhwCmluZGV4IDFiNWJjZWMu LjhjNTMzNDAgMTAwNzU1Ci0tLSBhL3J1bi10ZXN0cy5waHAKKysrIGIvcnVuLXRlc3RzLnBocApA QCAtMTM2LDYgKzEzNiwxMyBAQCBpZiAoKHN1YnN0cihQSFBfT1MsIDAsIDMpID09ICJXSU4iKSAm JiBlbXB0eSgkZW52aXJvbm1lbnRbIlN5c3RlbVJvb3QiXSkpIHsKICAgJGVudmlyb25tZW50WyJT eXN0ZW1Sb290Il0gPSBnZXRlbnYoIlN5c3RlbVJvb3QiKTsKIH0KIAoraWYgKGlzX3JlYWRhYmxl KCIvcHJvYy9jcHVpbmZvIikpIHsKKwkkY29uY3VycmVuY3kgPSBtaW4oNjQsIG1heCgxLCBwcmVn X21hdGNoX2FsbCgiL15wcm9jZXNzb3IvbWkiLCBmaWxlX2dldF9jb250ZW50cygiL3Byb2MvY3B1 aW5mbyIpKSkpOworfSBlbHNlIHsKKwkkY29uY3VycmVuY3kgPSAyOworfQorJHByb2NzID0gYXJy YXkoKTsKKwogLy8gRG9uJ3QgZXZlciBndWVzcyBhdCB0aGUgUEhQIGV4ZWN1dGFibGUgbG9jYXRp b24uCiAvLyBSZXF1aXJlIHRoZSBleHBsaWNpdCBzcGVjaWZpY2F0aW9uLgogLy8gT3RoZXJ3aXNl IHdlIGNvdWxkIGVuZCB1cCB0ZXN0aW5nIHRoZSB3cm9uZyBmaWxlIQpAQCAtMjQ2LDcgKzI1Myw3 IEBAICRpbmlfb3ZlcndyaXRlcyA9IGFycmF5KAogCiBmdW5jdGlvbiB3cml0ZV9pbmZvcm1hdGlv bigkc2hvd19odG1sKQogewotCWdsb2JhbCAkY3dkLCAkcGhwLCAkcGhwX2NnaSwgJHBocF9pbmZv LCAkdXNlcl90ZXN0cywgJGluaV9vdmVyd3JpdGVzLCAkcGFzc19vcHRpb25zLCAkZXh0c190b190 ZXN0LCAkbGVha19jaGVjaywgJHZhbGdyaW5kX2hlYWRlcjsKKwlnbG9iYWwgJGN3ZCwgJHBocCwg JHBocF9jZ2ksICRwaHBfaW5mbywgJHVzZXJfdGVzdHMsICRpbmlfb3ZlcndyaXRlcywgJHBhc3Nf b3B0aW9ucywgJGV4dHNfdG9fdGVzdCwgJGxlYWtfY2hlY2ssICR2YWxncmluZF9oZWFkZXIsICRj b25jdXJyZW5jeTsKIAogCS8vIEdldCBpbmZvIGZyb20gcGhwCiAJJGluZm9fZmlsZSA9IF9fRElS X18gLiAnL3J1bi10ZXN0LWluZm8ucGhwJzsKQEAgLTMwNiw2ICszMTMsNyBAQCBFeHRyYSBkaXJz ICA6ICI7CiAJfQogCWVjaG8gIgogVkFMR1JJTkQgICAgOiAiIC4gKCRsZWFrX2NoZWNrID8gJHZh bGdyaW5kX2hlYWRlciA6ICdOb3QgdXNlZCcpIC4gIgorQ09OQ1VSUkVOQ1kgOiAiIC4gJGNvbmN1 cnJlbmN5IC4gIgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09CiAiOwogfQpAQCAtNjY0LDYgKzY3Miw5IEBAIGlmIChp c3NldCgkYXJnYykgJiYgJGFyZ2MgPiAxKSB7CiAJCQkJY2FzZSAnLS12ZXJzaW9uJzoKIAkJCQkJ ZWNobyAnJElkJCcgLiAiXG4iOwogCQkJCQlleGl0KDEpOworCQkJCWNhc2UgJy0tY29uY3VycmVu Y3knOgorCQkJCQkkY29uY3VycmVuY3kgPSBtaW4oNjQsIG1heCgxLCAkYXJndlsrKyRpXSkpOwor CQkJCQlicmVhazsKIAogCQkJCWRlZmF1bHQ6CiAJCQkJCWVjaG8gIklsbGVnYWwgc3dpdGNoICck c3dpdGNoJyBzcGVjaWZpZWQhXG4iOwpAQCAtMTA2Niw2ICsxMDc3LDkwIEBAIGZ1bmN0aW9uIGVy cm9yX3JlcG9ydCgkdGVzdG5hbWUsICRsb2duYW1lLCAkdGVzdGVkKQogCX0KIH0KIAorZnVuY3Rp b24gc3lzdGVtX2xvb3Bfb3Zlcl9wcm9jcygkdGltZW91dCkKK3sKKwlnbG9iYWwgJHByb2NzOwor CisJJHIgPSBhcnJheSgpOworCSR3ID0gbnVsbDsKKwkkZSA9IG51bGw7CisKKwkkZG9uZSA9IGFy cmF5KCk7CisJJHRhYmxlID0gYXJyYXkoKTsKKwlmb3JlYWNoICgkcHJvY3MgYXMgJiRwcm9jKSB7 CisJCSR0YWJsZVsoaW50KSAkcHJvY1sicGlwZXMiXVsxXV0gPSAmJHByb2M7CisJCSRyW10gPSAk cHJvY1sicGlwZXMiXVsxXTsKKwl9CisJCisJJHRzID0gbWljcm90aW1lKHRydWUpOworCSRuID0g QHN0cmVhbV9zZWxlY3QoJHIsICR3LCAkZSwgJHRpbWVvdXQpOworCSR0cyAtPSBtaWNyb3RpbWUo dHJ1ZSk7CisJCisJYXJyYXlfd2FsaygkcHJvY3MsIGZ1bmN0aW9uKCYkcHJvYykgdXNlICgkdHMp IHsKKwkJJHByb2NbInRpbWVvdXQiXSArPSAkdHM7CisJfSk7CisKKwlpZiAoJG4gPiAwKSB7CisJ CWZvcmVhY2ggKCRyIGFzICRwaXBlKSB7CisJCQkkcHJvYyA9ICYkdGFibGVbKGludCkgJHBpcGVd OworCQkJJGxpbmUgPSBmcmVhZCgkcGlwZSwgODE5Mik7CisJCQlpZiAoIXN0cmxlbigkbGluZSkp IHsKKwkJCQkvKiBFT0YgKi8KKwkJCQkkc3RhdCA9IHByb2NfZ2V0X3N0YXR1cygkcHJvY1sicHJv YyJdKTsKKwkJCQlpZiAoJHN0YXRbJ3NpZ25hbGVkJ10pIHsKKwkJCQkJJHByb2NbImRhdGEiXSAu PSAiXG5UZXJtc2lnPSIgLiAkc3RhdFsnc3RvcHNpZyddOworCQkJCX0KKwkJCQlwcm9jX2Nsb3Nl KCRwcm9jWyJwcm9jIl0pOworCQkJCXVuc2V0KCRwcm9jc1soaW50KSAkcHJvY1sicHJvYyJdXSk7 CisJCQkJJGRvbmVbXSA9ICRwcm9jOworCQkJfSBlbHNlIHsKKwkJCQkkcHJvY1siZGF0YSJdIC49 ICRsaW5lOworCQkJfQorCQl9CisJfQorCQorCWZvcmVhY2ggKCRwcm9jcyBhcyAkcHJvY19pZCA9 PiAmJHByb2NfYXIpIHsKKwkJaWYgKCRwcm9jX2FyWyJ0aW1lb3V0Il0gPCAwKSB7CisJCQkvKiB0 aW1lZCBvdXQgKi8KKwkJCSRwcm9jX2FyWyJkYXRhIl0gLj0gIlxuICoqIEVSUk9SOiBwcm9jZXNz IHRpbWVkIG91dCAqKlxuIjsKKwkJCXByb2NfdGVybWluYXRlKCRwcm9jX2lkLCA5KTsKKwkJCXVu c2V0KCRwcm9jc1skcHJvY19pZF0pOworCQkJJGRvbmVbXSA9ICRwcm9jX2FyOworCQl9CisJfQor CQorCWFycmF5X3dhbGsoJGRvbmUsIGZ1bmN0aW9uKCRwcm9jKSB7CisJCSRwcm9jWyJjYl9yZXN1 bHQiXSgkcHJvY1siY2JfZW5kX3Rlc3QiXSgkcHJvY1siZGF0YSJdKSk7CisJfSk7CisJCisJc2hv d190ZXN0X2FjdGl2ZShhcnJheV9tYXAoZnVuY3Rpb24oJHByb2MpIHsKKwkJcmV0dXJuICRwcm9j WyJ0ZXN0X2lkeCJdOworCX0sICRwcm9jcykpOworfQorCitmdW5jdGlvbiBzeXN0ZW1fd2l0aF9j YWxsYmFjaygkY29tbWFuZGxpbmUsICRlbnYsICRzdGRpbiwgJGNiX3Jlc3VsdCwgJGNiX2VuZF90 ZXN0KQoreworCWdsb2JhbCAkY3dkLCAkcHJvY3MsICRsZWFrX2NoZWNrLCAkdGVzdF9pZHg7CisJ CisJJHByb2MgPSBwcm9jX29wZW4oJGNvbW1hbmRsaW5lLCBhcnJheSgKKwkJMCA9PiBhcnJheSgn cGlwZScsICdyJyksCisJCTEgPT4gYXJyYXkoJ3BpcGUnLCAndycpLAorCQkyID0+IGFycmF5KCdw aXBlJywgJ3cnKQorCQkpLCAkcGlwZXMsICRjd2QsIChhcnJheSkgJGVudiwgYXJyYXkoJ3N1cHBy ZXNzX2Vycm9ycycgPT4gdHJ1ZSwgJ2JpbmFyeV9waXBlcycgPT4gdHJ1ZSkpOworCisJaWYgKCEk cHJvYykgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmICghaXNfbnVsbCgkc3RkaW4pKSB7CisJ CWZ3cml0ZSgkcGlwZXNbMF0sICRzdGRpbik7CisJfQorCWZjbG9zZSgkcGlwZXNbMF0pOworCQor CSRkYXRhID0gIiI7CisJJHRpbWVvdXQgPSAkbGVha19jaGVjayA/IDMwMCA6IChpc3NldCgkZW52 WydURVNUX1RJTUVPVVQnXSkgPyAkZW52WydURVNUX1RJTUVPVVQnXSA6IDYwKTsKKwkkcHJvY3Nb KGludCkgJHByb2NdID0gY29tcGFjdCgicHJvYyIsICJwaXBlcyIsICJ0aW1lb3V0IiwgImRhdGEi LCAiY2JfZW5kX3Rlc3QiLCAiY2JfcmVzdWx0IiwgInRlc3RfaWR4Iik7Cit9CisKIGZ1bmN0aW9u IHN5c3RlbV93aXRoX3RpbWVvdXQoJGNvbW1hbmRsaW5lLCAkZW52ID0gbnVsbCwgJHN0ZGluID0g bnVsbCkKIHsKIAlnbG9iYWwgJGxlYWtfY2hlY2ssICRjd2Q7CkBAIC0xMTMyLDcgKzEyMjcsNyBA QCBmdW5jdGlvbiBzeXN0ZW1fd2l0aF90aW1lb3V0KCRjb21tYW5kbGluZSwgJGVudiA9IG51bGws ICRzdGRpbiA9IG51bGwpCiAKIGZ1bmN0aW9uIHJ1bl9hbGxfdGVzdHMoJHRlc3RfZmlsZXMsICRl bnYsICRyZWRpcl90ZXN0ZWQgPSBudWxsKQogewotCWdsb2JhbCAkdGVzdF9yZXN1bHRzLCAkZmFp bGVkX3Rlc3RzX2ZpbGUsICRwaHAsICR0ZXN0X2NudCwgJHRlc3RfaWR4OworCWdsb2JhbCAkdGVz dF9yZXN1bHRzLCAkZmFpbGVkX3Rlc3RzX2ZpbGUsICRwaHAsICR0ZXN0X2NudCwgJHRlc3RfaWR4 LCAkY29uY3VycmVuY3ksICRwcm9jczsKIAogCWZvcmVhY2goJHRlc3RfZmlsZXMgYXMgJG5hbWUp IHsKIApAQCAtMTE0OCwxNCArMTI0MywyNiBAQCBmdW5jdGlvbiBydW5fYWxsX3Rlc3RzKCR0ZXN0 X2ZpbGVzLCAkZW52LCAkcmVkaXJfdGVzdGVkID0gbnVsbCkKIAkJCSRpbmRleCA9ICRuYW1lOwog CQl9CiAJCSR0ZXN0X2lkeCsrOwotCQkkcmVzdWx0ID0gcnVuX3Rlc3QoJHBocCwgJG5hbWUsICRl bnYpOwotCi0JCWlmICghaXNfYXJyYXkoJG5hbWUpICYmICRyZXN1bHQgIT0gJ1JFRElSJykgewot CQkJJHRlc3RfcmVzdWx0c1skaW5kZXhdID0gJHJlc3VsdDsKLQkJCWlmICgkZmFpbGVkX3Rlc3Rz X2ZpbGUgJiYgKCRyZXN1bHQgPT0gJ1hGQUlMRUQnIHx8ICRyZXN1bHQgPT0gJ0ZBSUxFRCcgfHwg JHJlc3VsdCA9PSAnV0FSTkVEJyB8fCAkcmVzdWx0ID09ICdMRUFLRUQnKSkgewotCQkJCWZ3cml0 ZSgkZmFpbGVkX3Rlc3RzX2ZpbGUsICIkaW5kZXhcbiIpOworCQkKKwkJaWYgKCRjb25jdXJyZW5j eSA8PSBjb3VudCgkcHJvY3MpKSB7CisJCQl3aGlsZSAoJGNvbmN1cnJlbmN5IDw9IGNvdW50KCRw cm9jcykpIHsKKwkJCQlzeXN0ZW1fbG9vcF9vdmVyX3Byb2NzKDEpOwogCQkJfQorCQl9IGVsc2Ug eworCQkJc3lzdGVtX2xvb3Bfb3Zlcl9wcm9jcygwKTsKIAkJfQorIAkJcnVuX3Rlc3QoJHBocCwg JG5hbWUsICRlbnYsIGZ1bmN0aW9uKCRyZXN1bHQpIHVzZSAoJiR0ZXN0X3Jlc3VsdHMsICRpbmRl eCwgJG5hbWUsICRmYWlsZWRfdGVzdHNfZmlsZSkgeworCQkJaWYgKCFpc19hcnJheSgkbmFtZSkg JiYgJHJlc3VsdCAhPSAnUkVESVInKSB7CisJCQkJJHRlc3RfcmVzdWx0c1skaW5kZXhdID0gJHJl c3VsdDsKKwkJCQlpZiAoJGZhaWxlZF90ZXN0c19maWxlICYmICgkcmVzdWx0ID09ICdYRkFJTEVE JyB8fCAkcmVzdWx0ID09ICdGQUlMRUQnIHx8ICRyZXN1bHQgPT0gJ1dBUk5FRCcgfHwgJHJlc3Vs dCA9PSAnTEVBS0VEJykpIHsKKwkJCQkJZndyaXRlKCRmYWlsZWRfdGVzdHNfZmlsZSwgIiRpbmRl eFxuIik7CisJCQkJfQorCQkJfQorCQl9KTsKKwl9CisJCisJd2hpbGUgKGNvdW50KCRwcm9jcykp IHsKKwkJc3lzdGVtX2xvb3Bfb3Zlcl9wcm9jcygxKTsKIAl9CiB9CiAKQEAgLTExNzgsMTMgKzEy ODUsMTUgQEAgZnVuY3Rpb24gc2hvd19maWxlX2Jsb2NrKCRmaWxlLCAkYmxvY2ssICRzZWN0aW9u ID0gbnVsbCkKIAl9CiB9CiAKKyR0ZXN0X21hcCA9IGFycmF5KCk7CisKIC8vCiAvLyAgUnVuIGFu IGluZGl2aWR1YWwgdGVzdCBjYXNlLgogLy8KLWZ1bmN0aW9uIHJ1bl90ZXN0KCRwaHAsICRmaWxl LCAkZW52KQorZnVuY3Rpb24gcnVuX3Rlc3QoJHBocCwgJGZpbGUsICRlbnYsICRjYikKIHsKIAln bG9iYWwgJGxvZ19mb3JtYXQsICRpbmZvX3BhcmFtcywgJGluaV9vdmVyd3JpdGVzLCAkY3dkLCAk UEhQX0ZBSUxFRF9URVNUUzsKLQlnbG9iYWwgJHBhc3Nfb3B0aW9ucywgJERFVEFJTEVELCAkSU5f UkVESVJFQ1QsICR0ZXN0X2NudCwgJHRlc3RfaWR4OworCWdsb2JhbCAkcGFzc19vcHRpb25zLCAk REVUQUlMRUQsICRJTl9SRURJUkVDVCwgJHRlc3RfY250LCAkdGVzdF9pZHgsICR0ZXN0X21hcDsK IAlnbG9iYWwgJGxlYWtfY2hlY2ssICR0ZW1wX3NvdXJjZSwgJHRlbXBfdGFyZ2V0LCAkY2ZnLCAk ZW52aXJvbm1lbnQ7CiAJZ2xvYmFsICRub19jbGVhbjsKIAlnbG9iYWwgJHZhbGdyaW5kX3ZlcnNp b247CkBAIC0xODExLDMyOSArMTkyMCwzMzQgQEAgQ09NTUFORCAkY21kCiAKIAlqdW5pdF9zdGFy dF90aW1lcigkc2hvcnRuYW1lKTsKIAotCSRvdXQgPSBzeXN0ZW1fd2l0aF90aW1lb3V0KCRjbWQs ICRlbnYsIGlzc2V0KCRzZWN0aW9uX3RleHRbJ1NURElOJ10pID8gJHNlY3Rpb25fdGV4dFsnU1RE SU4nXSA6IG51bGwpOworCXN5c3RlbV93aXRoX2NhbGxiYWNrKCRjbWQsICRlbnYsIGlzc2V0KCRz ZWN0aW9uX3RleHRbJ1NURElOJ10pID8gJHNlY3Rpb25fdGV4dFsnU1RESU4nXSA6IG51bGwsICRj YiwKKwkJZnVuY3Rpb24oJG91dCkgdXNlKCRwaHAsICYkb2xkX3BocCwgJGNtZCwgJGVudiwgJHNo b3J0bmFtZSwgJGluZm8sICRmaWxlLCAkdGVzdGVkLCAkdGVzdGVkX2ZpbGUsICRzZWN0aW9uX3Rl eHQsICRpbmlfb3ZlcndyaXRlcywgJG1lbWNoZWNrX2ZpbGVuYW1lLCAkcGFzc19vcHRpb25zLCAk dGVtcF9jbGVhbiwgJHRlc3RfY2xlYW4sICR0bXBfcG9zdCwgJHdhcm4sICR0ZW1wX2ZpbGVuYW1l cywgJGV4cF9maWxlbmFtZSwgJG91dHB1dF9maWxlbmFtZSwgJGRpZmZfZmlsZW5hbWUsICRzaF9m aWxlbmFtZSwgJGxvZ19maWxlbmFtZSwgJHRlc3RfZmlsZSwgJElOX1JFRElSRUNUKSB7CisJCQln bG9iYWwgJGNmZywgJGN3ZCwgJGxlYWtfY2hlY2ssICRub19jbGVhbiwgJGxvZ19mb3JtYXQsICRQ SFBfRkFJTEVEX1RFU1RTOwogCi0JanVuaXRfZmluaXNoX3RpbWVyKCRzaG9ydG5hbWUpOworCQkJ anVuaXRfZmluaXNoX3RpbWVyKCRzaG9ydG5hbWUpOwogCi0JaWYgKGFycmF5X2tleV9leGlzdHMo J0NMRUFOJywgJHNlY3Rpb25fdGV4dCkgJiYgKCEkbm9fY2xlYW4gfHwgJGNmZ1sna2VlcCddWydj bGVhbiddKSkgeworCQkJaWYgKGFycmF5X2tleV9leGlzdHMoJ0NMRUFOJywgJHNlY3Rpb25fdGV4 dCkgJiYgKCEkbm9fY2xlYW4gfHwgJGNmZ1sna2VlcCddWydjbGVhbiddKSkgewogCi0JCWlmICh0 cmltKCRzZWN0aW9uX3RleHRbJ0NMRUFOJ10pKSB7Ci0JCQlzaG93X2ZpbGVfYmxvY2soJ2NsZWFu JywgJHNlY3Rpb25fdGV4dFsnQ0xFQU4nXSk7Ci0JCQlzYXZlX3RleHQoJHRlc3RfY2xlYW4sIHRy aW0oJHNlY3Rpb25fdGV4dFsnQ0xFQU4nXSksICR0ZW1wX2NsZWFuKTsKKwkJCQlpZiAodHJpbSgk c2VjdGlvbl90ZXh0WydDTEVBTiddKSkgeworCQkJCQlzaG93X2ZpbGVfYmxvY2soJ2NsZWFuJywg JHNlY3Rpb25fdGV4dFsnQ0xFQU4nXSk7CisJCQkJCXNhdmVfdGV4dCgkdGVzdF9jbGVhbiwgdHJp bSgkc2VjdGlvbl90ZXh0WydDTEVBTiddKSwgJHRlbXBfY2xlYW4pOwogCi0JCQlpZiAoISRub19j bGVhbikgewotCQkJCSRjbGVhbl9wYXJhbXMgPSBhcnJheSgpOwotCQkJCXNldHRpbmdzMmFycmF5 KCRpbmlfb3ZlcndyaXRlcywgJGNsZWFuX3BhcmFtcyk7Ci0JCQkJc2V0dGluZ3MycGFyYW1zKCRj bGVhbl9wYXJhbXMpOwotCQkJCSRleHRyYSA9IHN1YnN0cihQSFBfT1MsIDAsIDMpICE9PSAiV0lO IiA/Ci0JCQkJCSJ1bnNldCBSRVFVRVNUX01FVEhPRDsgdW5zZXQgUVVFUllfU1RSSU5HOyB1bnNl dCBQQVRIX1RSQU5TTEFURUQ7IHVuc2V0IFNDUklQVF9GSUxFTkFNRTsgdW5zZXQgUkVRVUVTVF9N RVRIT0Q7IjogIiI7Ci0JCQkJc3lzdGVtX3dpdGhfdGltZW91dCgiJGV4dHJhICRwaHAgJHBhc3Nf b3B0aW9ucyAtcSAkY2xlYW5fcGFyYW1zIFwiJHRlc3RfY2xlYW5cIiIsICRlbnYpOwotCQkJfQor CQkJCQlpZiAoISRub19jbGVhbikgeworCQkJCQkJJGNsZWFuX3BhcmFtcyA9IGFycmF5KCk7CisJ CQkJCQlzZXR0aW5nczJhcnJheSgkaW5pX292ZXJ3cml0ZXMsICRjbGVhbl9wYXJhbXMpOworCQkJ CQkJc2V0dGluZ3MycGFyYW1zKCRjbGVhbl9wYXJhbXMpOworCQkJCQkJJGV4dHJhID0gc3Vic3Ry KFBIUF9PUywgMCwgMykgIT09ICJXSU4iID8KKwkJCQkJCQkidW5zZXQgUkVRVUVTVF9NRVRIT0Q7 IHVuc2V0IFFVRVJZX1NUUklORzsgdW5zZXQgUEFUSF9UUkFOU0xBVEVEOyB1bnNldCBTQ1JJUFRf RklMRU5BTUU7IHVuc2V0IFJFUVVFU1RfTUVUSE9EOyI6ICIiOworCQkJCQkJc3lzdGVtX3dpdGhf dGltZW91dCgiJGV4dHJhICRwaHAgJHBhc3Nfb3B0aW9ucyAtcSAkY2xlYW5fcGFyYW1zIFwiJHRl c3RfY2xlYW5cIiIsICRlbnYpOworCQkJCQl9CiAKLQkJCWlmICghJGNmZ1sna2VlcCddWydjbGVh biddKSB7Ci0JCQkJQHVubGluaygkdGVzdF9jbGVhbik7CisJCQkJCWlmICghJGNmZ1sna2VlcCdd WydjbGVhbiddKSB7CisJCQkJCQlAdW5saW5rKCR0ZXN0X2NsZWFuKTsKKwkJCQkJfQorCQkJCX0K IAkJCX0KLQkJfQotCX0KIAotCUB1bmxpbmsoJHRtcF9wb3N0KTsKKwkJCUB1bmxpbmsoJHRtcF9w b3N0KTsKIAotCSRsZWFrZWQgPSBmYWxzZTsKLQkkcGFzc2VkID0gZmFsc2U7CisJCQkkbGVha2Vk ID0gZmFsc2U7CisJCQkkcGFzc2VkID0gZmFsc2U7CiAKLQlpZiAoJGxlYWtfY2hlY2spIHsgLy8g bGVhayBjaGVjawotCQkkbGVha2VkID0gZmlsZXNpemUoJG1lbWNoZWNrX2ZpbGVuYW1lKSA+IDA7 CisJCQlpZiAoJGxlYWtfY2hlY2spIHsgLy8gbGVhayBjaGVjaworCQkJCSRsZWFrZWQgPSBmaWxl c2l6ZSgkbWVtY2hlY2tfZmlsZW5hbWUpID4gMDsKIAotCQlpZiAoISRsZWFrZWQpIHsKLQkJCUB1 bmxpbmsoJG1lbWNoZWNrX2ZpbGVuYW1lKTsKLQkJfQotCX0KKwkJCQlpZiAoISRsZWFrZWQpIHsK KwkJCQkJQHVubGluaygkbWVtY2hlY2tfZmlsZW5hbWUpOworCQkJCX0KKwkJCX0KIAotCS8vIERv ZXMgdGhlIG91dHB1dCBtYXRjaCB3aGF0IGlzIGV4cGVjdGVkPwotCSRvdXRwdXQgPSBwcmVnX3Jl cGxhY2UoIi9cclxuLyIsICJcbiIsIHRyaW0oJG91dCkpOworCQkJLy8gRG9lcyB0aGUgb3V0cHV0 IG1hdGNoIHdoYXQgaXMgZXhwZWN0ZWQ/CisJCQkkb3V0cHV0ID0gcHJlZ19yZXBsYWNlKCIvXHJc bi8iLCAiXG4iLCB0cmltKCRvdXQpKTsKIAotCS8qIHdoZW4gdXNpbmcgQ0dJLCBzdHJpcCB0aGUg aGVhZGVycyBmcm9tIHRoZSBvdXRwdXQgKi8KLQkkaGVhZGVycyA9ICIiOworCQkJLyogd2hlbiB1 c2luZyBDR0ksIHN0cmlwIHRoZSBoZWFkZXJzIGZyb20gdGhlIG91dHB1dCAqLworCQkJJGhlYWRl cnMgPSAiIjsKIAotCWlmIChpc3NldCgkb2xkX3BocCkgJiYgcHJlZ19tYXRjaCgiL14oLio/KVxy P1xuXHI/XG4oLiopL3MiLCAkb3V0LCAkbWF0Y2gpKSB7Ci0JCSRvdXRwdXQgPSB0cmltKCRtYXRj aFsyXSk7Ci0JCSRyaCA9IHByZWdfc3BsaXQoIi9bXG5ccl0rLyIsICRtYXRjaFsxXSk7Ci0JCSRo ZWFkZXJzID0gYXJyYXkoKTsKKwkJCWlmIChpc3NldCgkb2xkX3BocCkgJiYgcHJlZ19tYXRjaCgi L14oLio/KVxyP1xuXHI/XG4oLiopL3MiLCAkb3V0LCAkbWF0Y2gpKSB7CisJCQkJJG91dHB1dCA9 IHRyaW0oJG1hdGNoWzJdKTsKKwkJCQkkcmggPSBwcmVnX3NwbGl0KCIvW1xuXHJdKy8iLCAkbWF0 Y2hbMV0pOworCQkJCSRoZWFkZXJzID0gYXJyYXkoKTsKIAotCQlmb3JlYWNoICgkcmggYXMgJGxp bmUpIHsKLQkJCWlmIChzdHJwb3MoJGxpbmUsICc6JykgIT09IGZhbHNlKSB7Ci0JCQkJJGxpbmUg PSBleHBsb2RlKCc6JywgJGxpbmUsIDIpOwotCQkJCSRoZWFkZXJzW3RyaW0oJGxpbmVbMF0pXSA9 IHRyaW0oJGxpbmVbMV0pOworCQkJCWZvcmVhY2ggKCRyaCBhcyAkbGluZSkgeworCQkJCQlpZiAo c3RycG9zKCRsaW5lLCAnOicpICE9PSBmYWxzZSkgeworCQkJCQkJJGxpbmUgPSBleHBsb2RlKCc6 JywgJGxpbmUsIDIpOworCQkJCQkJJGhlYWRlcnNbdHJpbSgkbGluZVswXSldID0gdHJpbSgkbGlu ZVsxXSk7CisJCQkJCX0KKwkJCQl9CiAJCQl9Ci0JCX0KLQl9Ci0KLQkkZmFpbGVkX2hlYWRlcnMg PSBmYWxzZTsKIAotCWlmIChpc3NldCgkc2VjdGlvbl90ZXh0WydFWFBFQ1RIRUFERVJTJ10pKSB7 Ci0JCSR3YW50ID0gYXJyYXkoKTsKLQkJJHdhbnRlZF9oZWFkZXJzID0gYXJyYXkoKTsKLQkJJGxp bmVzID0gcHJlZ19zcGxpdCgiL1tcblxyXSsvIiwgJHNlY3Rpb25fdGV4dFsnRVhQRUNUSEVBREVS UyddKTsKKwkJCSRmYWlsZWRfaGVhZGVycyA9IGZhbHNlOwogCi0JCWZvcmVhY2goJGxpbmVzIGFz ICRsaW5lKSB7Ci0JCQlpZiAoc3RycG9zKCRsaW5lLCAnOicpICE9PSBmYWxzZSkgewotCQkJCSRs aW5lID0gZXhwbG9kZSgnOicsICRsaW5lLCAyKTsKLQkJCQkkd2FudFt0cmltKCRsaW5lWzBdKV0g PSB0cmltKCRsaW5lWzFdKTsKLQkJCQkkd2FudGVkX2hlYWRlcnNbXSA9IHRyaW0oJGxpbmVbMF0p IC4gJzogJyAuIHRyaW0oJGxpbmVbMV0pOwotCQkJfQotCQl9CisJCQlpZiAoaXNzZXQoJHNlY3Rp b25fdGV4dFsnRVhQRUNUSEVBREVSUyddKSkgeworCQkJCSR3YW50ID0gYXJyYXkoKTsKKwkJCQkk d2FudGVkX2hlYWRlcnMgPSBhcnJheSgpOworCQkJCSRsaW5lcyA9IHByZWdfc3BsaXQoIi9bXG5c cl0rLyIsICRzZWN0aW9uX3RleHRbJ0VYUEVDVEhFQURFUlMnXSk7CiAKLQkJJG9yZ19oZWFkZXJz ID0gJGhlYWRlcnM7Ci0JCSRoZWFkZXJzID0gYXJyYXkoKTsKLQkJJG91dHB1dF9oZWFkZXJzID0g YXJyYXkoKTsKKwkJCQlmb3JlYWNoKCRsaW5lcyBhcyAkbGluZSkgeworCQkJCQlpZiAoc3RycG9z KCRsaW5lLCAnOicpICE9PSBmYWxzZSkgeworCQkJCQkJJGxpbmUgPSBleHBsb2RlKCc6JywgJGxp bmUsIDIpOworCQkJCQkJJHdhbnRbdHJpbSgkbGluZVswXSldID0gdHJpbSgkbGluZVsxXSk7CisJ CQkJCQkkd2FudGVkX2hlYWRlcnNbXSA9IHRyaW0oJGxpbmVbMF0pIC4gJzogJyAuIHRyaW0oJGxp bmVbMV0pOworCQkJCQl9CisJCQkJfQogCi0JCWZvcmVhY2goJHdhbnQgYXMgJGsgPT4gJHYpIHsK KwkJCQkkb3JnX2hlYWRlcnMgPSAkaGVhZGVyczsKKwkJCQkkaGVhZGVycyA9IGFycmF5KCk7CisJ CQkJJG91dHB1dF9oZWFkZXJzID0gYXJyYXkoKTsKIAotCQkJaWYgKGlzc2V0KCRvcmdfaGVhZGVy c1ska10pKSB7Ci0JCQkJJGhlYWRlcnMgPSAkb3JnX2hlYWRlcnNbJGtdOwotCQkJCSRvdXRwdXRf aGVhZGVyc1tdID0gJGsgLiAnOiAnIC4gJG9yZ19oZWFkZXJzWyRrXTsKLQkJCX0KKwkJCQlmb3Jl YWNoKCR3YW50IGFzICRrID0+ICR2KSB7CiAKLQkJCWlmICghaXNzZXQoJG9yZ19oZWFkZXJzWyRr XSkgfHwgJG9yZ19oZWFkZXJzWyRrXSAhPSAkdikgewotCQkJCSRmYWlsZWRfaGVhZGVycyA9IHRy dWU7Ci0JCQl9Ci0JCX0KKwkJCQkJaWYgKGlzc2V0KCRvcmdfaGVhZGVyc1ska10pKSB7CisJCQkJ CQkkaGVhZGVycyA9ICRvcmdfaGVhZGVyc1ska107CisJCQkJCQkkb3V0cHV0X2hlYWRlcnNbXSA9 ICRrIC4gJzogJyAuICRvcmdfaGVhZGVyc1ska107CisJCQkJCX0KIAotCQlrc29ydCgkd2FudGVk X2hlYWRlcnMpOwotCQkkd2FudGVkX2hlYWRlcnMgPSBqb2luKCJcbiIsICR3YW50ZWRfaGVhZGVy cyk7Ci0JCWtzb3J0KCRvdXRwdXRfaGVhZGVycyk7Ci0JCSRvdXRwdXRfaGVhZGVycyA9IGpvaW4o IlxuIiwgJG91dHB1dF9oZWFkZXJzKTsKLQl9CisJCQkJCWlmICghaXNzZXQoJG9yZ19oZWFkZXJz WyRrXSkgfHwgJG9yZ19oZWFkZXJzWyRrXSAhPSAkdikgeworCQkJCQkJJGZhaWxlZF9oZWFkZXJz ID0gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KIAotCXNob3dfZmlsZV9ibG9jaygnb3V0JywgJG91dHB1 dCk7CisJCQkJa3NvcnQoJHdhbnRlZF9oZWFkZXJzKTsKKwkJCQkkd2FudGVkX2hlYWRlcnMgPSBq b2luKCJcbiIsICR3YW50ZWRfaGVhZGVycyk7CisJCQkJa3NvcnQoJG91dHB1dF9oZWFkZXJzKTsK KwkJCQkkb3V0cHV0X2hlYWRlcnMgPSBqb2luKCJcbiIsICRvdXRwdXRfaGVhZGVycyk7CisJCQl9 CiAKLQlpZiAoaXNzZXQoJHNlY3Rpb25fdGV4dFsnRVhQRUNURiddKSB8fCBpc3NldCgkc2VjdGlv bl90ZXh0WydFWFBFQ1RSRUdFWCddKSkgeworCQkJc2hvd19maWxlX2Jsb2NrKCdvdXQnLCAkb3V0 cHV0KTsKIAotCQlpZiAoaXNzZXQoJHNlY3Rpb25fdGV4dFsnRVhQRUNURiddKSkgewotCQkJJHdh bnRlZCA9IHRyaW0oJHNlY3Rpb25fdGV4dFsnRVhQRUNURiddKTsKLQkJfSBlbHNlIHsKLQkJCSR3 YW50ZWQgPSB0cmltKCRzZWN0aW9uX3RleHRbJ0VYUEVDVFJFR0VYJ10pOwotCQl9CisJCQlpZiAo aXNzZXQoJHNlY3Rpb25fdGV4dFsnRVhQRUNURiddKSB8fCBpc3NldCgkc2VjdGlvbl90ZXh0WydF WFBFQ1RSRUdFWCddKSkgewogCi0JCXNob3dfZmlsZV9ibG9jaygnZXhwJywgJHdhbnRlZCk7Ci0J CSR3YW50ZWRfcmUgPSBwcmVnX3JlcGxhY2UoJy9cclxuLycsICJcbiIsICR3YW50ZWQpOwotCi0J CWlmIChpc3NldCgkc2VjdGlvbl90ZXh0WydFWFBFQ1RGJ10pKSB7Ci0KLQkJCS8vIGRvIHByZWdf cXVvdGUsIGJ1dCBtaXNzIG91dCBhbnkgJXIgZGVsaW1pdGVkIHNlY3Rpb25zCi0JCQkkdGVtcCA9 ICIiOwotCQkJJHIgPSAiJXIiOwotCQkJJHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCSRsZW5ndGggPSBz dHJsZW4oJHdhbnRlZF9yZSk7Ci0JCQl3aGlsZSgkc3RhcnRPZmZzZXQgPCAkbGVuZ3RoKSB7Ci0J CQkJJHN0YXJ0ID0gc3RycG9zKCR3YW50ZWRfcmUsICRyLCAkc3RhcnRPZmZzZXQpOwotCQkJCWlm ICgkc3RhcnQgIT09IGZhbHNlKSB7Ci0JCQkJCS8vIHdlIGhhdmUgZm91bmQgYSBzdGFydCB0YWcK LQkJCQkJJGVuZCA9IHN0cnBvcygkd2FudGVkX3JlLCAkciwgJHN0YXJ0KzIpOwotCQkJCQlpZiAo JGVuZCA9PT0gZmFsc2UpIHsKLQkJCQkJCS8vIHVuYmFsYW5jZWQgdGFnLCBpZ25vcmUgaXQuCi0J CQkJCQkkZW5kID0gJHN0YXJ0ID0gJGxlbmd0aDsKLQkJCQkJfQorCQkJCWlmIChpc3NldCgkc2Vj dGlvbl90ZXh0WydFWFBFQ1RGJ10pKSB7CisJCQkJCSR3YW50ZWQgPSB0cmltKCRzZWN0aW9uX3Rl eHRbJ0VYUEVDVEYnXSk7CiAJCQkJfSBlbHNlIHsKLQkJCQkJLy8gbm8gbW9yZSAlciBzZWN0aW9u cwotCQkJCQkkc3RhcnQgPSAkZW5kID0gJGxlbmd0aDsKKwkJCQkJJHdhbnRlZCA9IHRyaW0oJHNl Y3Rpb25fdGV4dFsnRVhQRUNUUkVHRVgnXSk7CiAJCQkJfQotCQkJCS8vIHF1b3RlIGEgbm9uIHJl IHBvcnRpb24gb2YgdGhlIHN0cmluZwotCQkJCSR0ZW1wID0gJHRlbXAgLiBwcmVnX3F1b3RlKHN1 YnN0cigkd2FudGVkX3JlLCAkc3RhcnRPZmZzZXQsICgkc3RhcnQgLSAkc3RhcnRPZmZzZXQpKSwg ICcvJyk7Ci0JCQkJLy8gYWRkIHRoZSByZSB1bnF1b3RlZC4KLQkJCQlpZiAoJGVuZCA+ICRzdGFy dCkgewotCQkJCQkkdGVtcCA9ICR0ZW1wIC4gJygnIC4gc3Vic3RyKCR3YW50ZWRfcmUsICRzdGFy dCsyLCAoJGVuZCAtICRzdGFydC0yKSkuICcpJzsKLQkJCQl9Ci0JCQkJJHN0YXJ0T2Zmc2V0ID0g JGVuZCArIDI7Ci0JCQl9Ci0JCQkkd2FudGVkX3JlID0gJHRlbXA7CiAKLQkJCSR3YW50ZWRfcmUg PSBzdHJfcmVwbGFjZSgKLQkJCQlhcnJheSgnJWJpbmFyeV9zdHJpbmdfb3B0aW9uYWwlJyksCi0J CQkJJ3N0cmluZycsCi0JCQkJJHdhbnRlZF9yZQotCQkJKTsKLQkJCSR3YW50ZWRfcmUgPSBzdHJf cmVwbGFjZSgKLQkJCQlhcnJheSgnJXVuaWNvZGVfc3RyaW5nX29wdGlvbmFsJScpLAotCQkJCSdz dHJpbmcnLAotCQkJCSR3YW50ZWRfcmUKLQkJCSk7Ci0JCQkkd2FudGVkX3JlID0gc3RyX3JlcGxh Y2UoCi0JCQkJYXJyYXkoJyV1bmljb2RlXHxzdHJpbmclJywgJyVzdHJpbmdcfHVuaWNvZGUlJyks Ci0JCQkJJ3N0cmluZycsCi0JCQkJJHdhbnRlZF9yZQotCQkJKTsKLQkJCSR3YW50ZWRfcmUgPSBz dHJfcmVwbGFjZSgKLQkJCQlhcnJheSgnJXVcfGIlJywgJyViXHx1JScpLAotCQkJCScnLAotCQkJ CSR3YW50ZWRfcmUKLQkJCSk7Ci0JCQkvLyBTdGljayB0byBiYXNpY3MKLQkJCSR3YW50ZWRfcmUg PSBzdHJfcmVwbGFjZSgnJWUnLCAnXFwnIC4gRElSRUNUT1JZX1NFUEFSQVRPUiwgJHdhbnRlZF9y ZSk7Ci0JCQkkd2FudGVkX3JlID0gc3RyX3JlcGxhY2UoJyVzJywgJ1teXHJcbl0rJywgJHdhbnRl ZF9yZSk7Ci0JCQkkd2FudGVkX3JlID0gc3RyX3JlcGxhY2UoJyVTJywgJ1teXHJcbl0qJywgJHdh bnRlZF9yZSk7Ci0JCQkkd2FudGVkX3JlID0gc3RyX3JlcGxhY2UoJyVhJywgJy4rJywgJHdhbnRl ZF9yZSk7Ci0JCQkkd2FudGVkX3JlID0gc3RyX3JlcGxhY2UoJyVBJywgJy4qJywgJHdhbnRlZF9y ZSk7Ci0JCQkkd2FudGVkX3JlID0gc3RyX3JlcGxhY2UoJyV3JywgJ1xzKicsICR3YW50ZWRfcmUp OwotCQkJJHdhbnRlZF9yZSA9IHN0cl9yZXBsYWNlKCclaScsICdbKy1dP1xkKycsICR3YW50ZWRf cmUpOwotCQkJJHdhbnRlZF9yZSA9IHN0cl9yZXBsYWNlKCclZCcsICdcZCsnLCAkd2FudGVkX3Jl KTsKLQkJCSR3YW50ZWRfcmUgPSBzdHJfcmVwbGFjZSgnJXgnLCAnWzAtOWEtZkEtRl0rJywgJHdh bnRlZF9yZSk7Ci0JCQkkd2FudGVkX3JlID0gc3RyX3JlcGxhY2UoJyVmJywgJ1srLV0/XC4/XGQr XC4/XGQqKD86W0VlXVsrLV0/XGQrKT8nLCAkd2FudGVkX3JlKTsKLQkJCSR3YW50ZWRfcmUgPSBz dHJfcmVwbGFjZSgnJWMnLCAnLicsICR3YW50ZWRfcmUpOwotCQkJLy8gJWYgYWxsb3dzIHR3byBw b2ludHMgIi0uMC4wIiBidXQgdGhhdCBpcyB0aGUgYmVzdCAqc2ltcGxlKiBleHByZXNzaW9uCi0J CX0KLS8qIERFQlVHIFlPVVIgUkVHRVggSEVSRQotCQl2YXJfZHVtcCgkd2FudGVkX3JlKTsKLQkJ cHJpbnQoc3RyX3JlcGVhdCgnPScsIDgwKSAuICJcbiIpOwotCQl2YXJfZHVtcCgkb3V0cHV0KTsK LSovCi0JCWlmIChwcmVnX21hdGNoKCIvXiR3YW50ZWRfcmVcJC9zIiwgJG91dHB1dCkpIHsKLQkJ CSRwYXNzZWQgPSB0cnVlOwotCQkJaWYgKCEkY2ZnWydrZWVwJ11bJ3BocCddKSB7Ci0JCQkJQHVu bGluaygkdGVzdF9maWxlKTsKLQkJCX0KLQkJCWlmIChpc3NldCgkb2xkX3BocCkpIHsKLQkJCQkk cGhwID0gJG9sZF9waHA7Ci0JCQl9CisJCQkJc2hvd19maWxlX2Jsb2NrKCdleHAnLCAkd2FudGVk KTsKKwkJCQkkd2FudGVkX3JlID0gcHJlZ19yZXBsYWNlKCcvXHJcbi8nLCAiXG4iLCAkd2FudGVk KTsKKworCQkJCWlmIChpc3NldCgkc2VjdGlvbl90ZXh0WydFWFBFQ1RGJ10pKSB7CisKKwkJCQkJ Ly8gZG8gcHJlZ19xdW90ZSwgYnV0IG1pc3Mgb3V0IGFueSAlciBkZWxpbWl0ZWQgc2VjdGlvbnMK KwkJCQkJJHRlbXAgPSAiIjsKKwkJCQkJJHIgPSAiJXIiOworCQkJCQkkc3RhcnRPZmZzZXQgPSAw OworCQkJCQkkbGVuZ3RoID0gc3RybGVuKCR3YW50ZWRfcmUpOworCQkJCQl3aGlsZSgkc3RhcnRP ZmZzZXQgPCAkbGVuZ3RoKSB7CisJCQkJCQkkc3RhcnQgPSBzdHJwb3MoJHdhbnRlZF9yZSwgJHIs ICRzdGFydE9mZnNldCk7CisJCQkJCQlpZiAoJHN0YXJ0ICE9PSBmYWxzZSkgeworCQkJCQkJCS8v IHdlIGhhdmUgZm91bmQgYSBzdGFydCB0YWcKKwkJCQkJCQkkZW5kID0gc3RycG9zKCR3YW50ZWRf cmUsICRyLCAkc3RhcnQrMik7CisJCQkJCQkJaWYgKCRlbmQgPT09IGZhbHNlKSB7CisJCQkJCQkJ CS8vIHVuYmFsYW5jZWQgdGFnLCBpZ25vcmUgaXQuCisJCQkJCQkJCSRlbmQgPSAkc3RhcnQgPSAk bGVuZ3RoOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLy8gbm8gbW9yZSAlciBz ZWN0aW9ucworCQkJCQkJCSRzdGFydCA9ICRlbmQgPSAkbGVuZ3RoOworCQkJCQkJfQorCQkJCQkJ Ly8gcXVvdGUgYSBub24gcmUgcG9ydGlvbiBvZiB0aGUgc3RyaW5nCisJCQkJCQkkdGVtcCA9ICR0 ZW1wIC4gcHJlZ19xdW90ZShzdWJzdHIoJHdhbnRlZF9yZSwgJHN0YXJ0T2Zmc2V0LCAoJHN0YXJ0 IC0gJHN0YXJ0T2Zmc2V0KSksICAnLycpOworCQkJCQkJLy8gYWRkIHRoZSByZSB1bnF1b3RlZC4K KwkJCQkJCWlmICgkZW5kID4gJHN0YXJ0KSB7CisJCQkJCQkJJHRlbXAgPSAkdGVtcCAuICcoJyAu IHN1YnN0cigkd2FudGVkX3JlLCAkc3RhcnQrMiwgKCRlbmQgLSAkc3RhcnQtMikpLiAnKSc7CisJ CQkJCQl9CisJCQkJCQkkc3RhcnRPZmZzZXQgPSAkZW5kICsgMjsKKwkJCQkJfQorCQkJCQkkd2Fu dGVkX3JlID0gJHRlbXA7CisKKwkJCQkJJHdhbnRlZF9yZSA9IHN0cl9yZXBsYWNlKAorCQkJCQkJ YXJyYXkoJyViaW5hcnlfc3RyaW5nX29wdGlvbmFsJScpLAorCQkJCQkJJ3N0cmluZycsCisJCQkJ CQkkd2FudGVkX3JlCisJCQkJCSk7CisJCQkJCSR3YW50ZWRfcmUgPSBzdHJfcmVwbGFjZSgKKwkJ CQkJCWFycmF5KCcldW5pY29kZV9zdHJpbmdfb3B0aW9uYWwlJyksCisJCQkJCQknc3RyaW5nJywK KwkJCQkJCSR3YW50ZWRfcmUKKwkJCQkJKTsKKwkJCQkJJHdhbnRlZF9yZSA9IHN0cl9yZXBsYWNl KAorCQkJCQkJYXJyYXkoJyV1bmljb2RlXHxzdHJpbmclJywgJyVzdHJpbmdcfHVuaWNvZGUlJyks CisJCQkJCQknc3RyaW5nJywKKwkJCQkJCSR3YW50ZWRfcmUKKwkJCQkJKTsKKwkJCQkJJHdhbnRl ZF9yZSA9IHN0cl9yZXBsYWNlKAorCQkJCQkJYXJyYXkoJyV1XHxiJScsICclYlx8dSUnKSwKKwkJ CQkJCScnLAorCQkJCQkJJHdhbnRlZF9yZQorCQkJCQkpOworCQkJCQkvLyBTdGljayB0byBiYXNp Y3MKKwkJCQkJJHdhbnRlZF9yZSA9IHN0cl9yZXBsYWNlKCclZScsICdcXCcgLiBESVJFQ1RPUllf U0VQQVJBVE9SLCAkd2FudGVkX3JlKTsKKwkJCQkJJHdhbnRlZF9yZSA9IHN0cl9yZXBsYWNlKCcl cycsICdbXlxyXG5dKycsICR3YW50ZWRfcmUpOworCQkJCQkkd2FudGVkX3JlID0gc3RyX3JlcGxh Y2UoJyVTJywgJ1teXHJcbl0qJywgJHdhbnRlZF9yZSk7CisJCQkJCSR3YW50ZWRfcmUgPSBzdHJf cmVwbGFjZSgnJWEnLCAnLisnLCAkd2FudGVkX3JlKTsKKwkJCQkJJHdhbnRlZF9yZSA9IHN0cl9y ZXBsYWNlKCclQScsICcuKicsICR3YW50ZWRfcmUpOworCQkJCQkkd2FudGVkX3JlID0gc3RyX3Jl cGxhY2UoJyV3JywgJ1xzKicsICR3YW50ZWRfcmUpOworCQkJCQkkd2FudGVkX3JlID0gc3RyX3Jl cGxhY2UoJyVpJywgJ1srLV0/XGQrJywgJHdhbnRlZF9yZSk7CisJCQkJCSR3YW50ZWRfcmUgPSBz dHJfcmVwbGFjZSgnJWQnLCAnXGQrJywgJHdhbnRlZF9yZSk7CisJCQkJCSR3YW50ZWRfcmUgPSBz dHJfcmVwbGFjZSgnJXgnLCAnWzAtOWEtZkEtRl0rJywgJHdhbnRlZF9yZSk7CisJCQkJCSR3YW50 ZWRfcmUgPSBzdHJfcmVwbGFjZSgnJWYnLCAnWystXT9cLj9cZCtcLj9cZCooPzpbRWVdWystXT9c ZCspPycsICR3YW50ZWRfcmUpOworCQkJCQkkd2FudGVkX3JlID0gc3RyX3JlcGxhY2UoJyVjJywg Jy4nLCAkd2FudGVkX3JlKTsKKwkJCQkJLy8gJWYgYWxsb3dzIHR3byBwb2ludHMgIi0uMC4wIiBi dXQgdGhhdCBpcyB0aGUgYmVzdCAqc2ltcGxlKiBleHByZXNzaW9uCisJCQkJfQorCQkvKiBERUJV RyBZT1VSIFJFR0VYIEhFUkUKKwkJCQl2YXJfZHVtcCgkd2FudGVkX3JlKTsKKwkJCQlwcmludChz dHJfcmVwZWF0KCc9JywgODApIC4gIlxuIik7CisJCQkJdmFyX2R1bXAoJG91dHB1dCk7CisJCSov CisJCQkJaWYgKHByZWdfbWF0Y2goIi9eJHdhbnRlZF9yZVwkL3MiLCAkb3V0cHV0KSkgeworCQkJ CQkkcGFzc2VkID0gdHJ1ZTsKKwkJCQkJaWYgKCEkY2ZnWydrZWVwJ11bJ3BocCddKSB7CisJCQkJ CQlAdW5saW5rKCR0ZXN0X2ZpbGUpOworCQkJCQl9CisJCQkJCWlmIChpc3NldCgkb2xkX3BocCkp IHsKKwkJCQkJCSRwaHAgPSAkb2xkX3BocDsKKwkJCQkJfQogCi0JCQlpZiAoISRsZWFrZWQgJiYg ISRmYWlsZWRfaGVhZGVycykgewotCQkJCWlmIChpc3NldCgkc2VjdGlvbl90ZXh0WydYRkFJTCdd ICkpIHsKLQkJCQkJJHdhcm4gPSB0cnVlOwotCQkJCQkkaW5mbyA9ICIgKHdhcm46IFhGQUlMIHNl Y3Rpb24gYnV0IHRlc3QgcGFzc2VzKSI7Ci0JCQkJfWVsc2UgewotCQkJCQlzaG93X3Jlc3VsdCgi UEFTUyIsICR0ZXN0ZWQsICR0ZXN0ZWRfZmlsZSwgJycsICR0ZW1wX2ZpbGVuYW1lcyk7Ci0JCQkJ CWp1bml0X21hcmtfdGVzdF9hcygnUEFTUycsICRzaG9ydG5hbWUsICR0ZXN0ZWQpOwotCQkJCQly ZXR1cm4gJ1BBU1NFRCc7CisJCQkJCWlmICghJGxlYWtlZCAmJiAhJGZhaWxlZF9oZWFkZXJzKSB7 CisJCQkJCQlpZiAoaXNzZXQoJHNlY3Rpb25fdGV4dFsnWEZBSUwnXSApKSB7CisJCQkJCQkJJHdh cm4gPSB0cnVlOworCQkJCQkJCSRpbmZvID0gIiAod2FybjogWEZBSUwgc2VjdGlvbiBidXQgdGVz dCBwYXNzZXMpIjsKKwkJCQkJCX1lbHNlIHsKKwkJCQkJCQlzaG93X3Jlc3VsdCgiUEFTUyIsICR0 ZXN0ZWQsICR0ZXN0ZWRfZmlsZSwgJycsICR0ZW1wX2ZpbGVuYW1lcyk7CisJCQkJCQkJanVuaXRf bWFya190ZXN0X2FzKCdQQVNTJywgJHNob3J0bmFtZSwgJHRlc3RlZCk7CisJCQkJCQkJcmV0dXJu ICdQQVNTRUQnOworCQkJCQkJfQorCQkJCQl9CiAJCQkJfQotCQkJfQotCQl9CiAKLQl9IGVsc2Ug eworCQkJfSBlbHNlIHsKIAotCQkkd2FudGVkID0gdHJpbSgkc2VjdGlvbl90ZXh0WydFWFBFQ1Qn XSk7Ci0JCSR3YW50ZWQgPSBwcmVnX3JlcGxhY2UoJy9cclxuLycsIlxuIiwgJHdhbnRlZCk7Ci0J CXNob3dfZmlsZV9ibG9jaygnZXhwJywgJHdhbnRlZCk7CisJCQkJJHdhbnRlZCA9IHRyaW0oJHNl Y3Rpb25fdGV4dFsnRVhQRUNUJ10pOworCQkJCSR3YW50ZWQgPSBwcmVnX3JlcGxhY2UoJy9cclxu LycsIlxuIiwgJHdhbnRlZCk7CisJCQkJc2hvd19maWxlX2Jsb2NrKCdleHAnLCAkd2FudGVkKTsK IAotCQkvLyBjb21wYXJlIGFuZCBsZWF2ZSBvbiBzdWNjZXNzCi0JCWlmICghc3RyY21wKCRvdXRw dXQsICR3YW50ZWQpKSB7Ci0JCQkkcGFzc2VkID0gdHJ1ZTsKKwkJCQkvLyBjb21wYXJlIGFuZCBs ZWF2ZSBvbiBzdWNjZXNzCisJCQkJaWYgKCFzdHJjbXAoJG91dHB1dCwgJHdhbnRlZCkpIHsKKwkJ CQkJJHBhc3NlZCA9IHRydWU7CiAKLQkJCWlmICghJGNmZ1sna2VlcCddWydwaHAnXSkgewotCQkJ CUB1bmxpbmsoJHRlc3RfZmlsZSk7Ci0JCQl9CisJCQkJCWlmICghJGNmZ1sna2VlcCddWydwaHAn XSkgeworCQkJCQkJQHVubGluaygkdGVzdF9maWxlKTsKKwkJCQkJfQogCi0JCQlpZiAoaXNzZXQo JG9sZF9waHApKSB7Ci0JCQkJJHBocCA9ICRvbGRfcGhwOwotCQkJfQorCQkJCQlpZiAoaXNzZXQo JG9sZF9waHApKSB7CisJCQkJCQkkcGhwID0gJG9sZF9waHA7CisJCQkJCX0KIAotCQkJaWYgKCEk bGVha2VkICYmICEkZmFpbGVkX2hlYWRlcnMpIHsKLQkJCQlpZiAoaXNzZXQoJHNlY3Rpb25fdGV4 dFsnWEZBSUwnXSApKSB7Ci0JCQkJCSR3YXJuID0gdHJ1ZTsKLQkJCQkJJGluZm8gPSAiICh3YXJu OiBYRkFJTCBzZWN0aW9uIGJ1dCB0ZXN0IHBhc3NlcykiOwotCQkJCX1lbHNlIHsKLQkJCQkJc2hv d19yZXN1bHQoIlBBU1MiLCAkdGVzdGVkLCAkdGVzdGVkX2ZpbGUsICcnLCAkdGVtcF9maWxlbmFt ZXMpOwotCQkJCQlqdW5pdF9tYXJrX3Rlc3RfYXMoJ1BBU1MnLCAkc2hvcnRuYW1lLCAkdGVzdGVk KTsKLQkJCQkJcmV0dXJuICdQQVNTRUQnOworCQkJCQlpZiAoISRsZWFrZWQgJiYgISRmYWlsZWRf aGVhZGVycykgeworCQkJCQkJaWYgKGlzc2V0KCRzZWN0aW9uX3RleHRbJ1hGQUlMJ10gKSkgewor CQkJCQkJCSR3YXJuID0gdHJ1ZTsKKwkJCQkJCQkkaW5mbyA9ICIgKHdhcm46IFhGQUlMIHNlY3Rp b24gYnV0IHRlc3QgcGFzc2VzKSI7CisJCQkJCQl9ZWxzZSB7CisJCQkJCQkJc2hvd19yZXN1bHQo IlBBU1MiLCAkdGVzdGVkLCAkdGVzdGVkX2ZpbGUsICcnLCAkdGVtcF9maWxlbmFtZXMpOworCQkJ CQkJCWp1bml0X21hcmtfdGVzdF9hcygnUEFTUycsICRzaG9ydG5hbWUsICR0ZXN0ZWQpOworCQkJ CQkJCXJldHVybiAnUEFTU0VEJzsKKwkJCQkJCX0KKwkJCQkJfQogCQkJCX0KLQkJCX0KLQkJfQog Ci0JCSR3YW50ZWRfcmUgPSBudWxsOwotCX0KKwkJCQkkd2FudGVkX3JlID0gbnVsbDsKKwkJCX0K IAotCS8vIFRlc3QgZmFpbGVkIHNvIHdlIG5lZWQgdG8gcmVwb3J0IGRldGFpbHMuCi0JaWYgKCRm YWlsZWRfaGVhZGVycykgewotCQkkcGFzc2VkID0gZmFsc2U7Ci0JCSR3YW50ZWQgPSAkd2FudGVk X2hlYWRlcnMgLiAiXG4tLUhFQURFUlMtLVxuIiAuICR3YW50ZWQ7Ci0JCSRvdXRwdXQgPSAkb3V0 cHV0X2hlYWRlcnMgLiAiXG4tLUhFQURFUlMtLVxuIiAuICRvdXRwdXQ7CisJCQkvLyBUZXN0IGZh aWxlZCBzbyB3ZSBuZWVkIHRvIHJlcG9ydCBkZXRhaWxzLgorCQkJaWYgKCRmYWlsZWRfaGVhZGVy cykgeworCQkJCSRwYXNzZWQgPSBmYWxzZTsKKwkJCQkkd2FudGVkID0gJHdhbnRlZF9oZWFkZXJz IC4gIlxuLS1IRUFERVJTLS1cbiIgLiAkd2FudGVkOworCQkJCSRvdXRwdXQgPSAkb3V0cHV0X2hl YWRlcnMgLiAiXG4tLUhFQURFUlMtLVxuIiAuICRvdXRwdXQ7CiAKLQkJaWYgKGlzc2V0KCR3YW50 ZWRfcmUpKSB7Ci0JCQkkd2FudGVkX3JlID0gcHJlZ19xdW90ZSgkd2FudGVkX2hlYWRlcnMgLiAi XG4tLUhFQURFUlMtLVxuIiwgJy8nKSAuICR3YW50ZWRfcmU7Ci0JCX0KLQl9CisJCQkJaWYgKGlz c2V0KCR3YW50ZWRfcmUpKSB7CisJCQkJCSR3YW50ZWRfcmUgPSBwcmVnX3F1b3RlKCR3YW50ZWRf aGVhZGVycyAuICJcbi0tSEVBREVSUy0tXG4iLCAnLycpIC4gJHdhbnRlZF9yZTsKKwkJCQl9CisJ CQl9CiAKLQlpZiAoJGxlYWtlZCkgewotCQkkcmVzdHlwZVtdID0gJ0xFQUsnOwotCX0KKwkJCWlm ICgkbGVha2VkKSB7CisJCQkJJHJlc3R5cGVbXSA9ICdMRUFLJzsKKwkJCX0KIAotCWlmICgkd2Fy bikgewotCQkkcmVzdHlwZVtdID0gJ1dBUk4nOwotCX0KKwkJCWlmICgkd2FybikgeworCQkJCSRy ZXN0eXBlW10gPSAnV0FSTic7CisJCQl9CiAKLQlpZiAoISRwYXNzZWQpIHsKLQkJaWYgKGlzc2V0 KCRzZWN0aW9uX3RleHRbJ1hGQUlMJ10pKSB7Ci0JCQkkcmVzdHlwZVtdID0gJ1hGQUlMJzsKLQkJ CSRpbmZvID0gJyAgWEZBSUwgUkVBU09OOiAnIC4gcnRyaW0oJHNlY3Rpb25fdGV4dFsnWEZBSUwn XSk7Ci0JCX0gZWxzZSB7Ci0JCQkkcmVzdHlwZVtdID0gJ0ZBSUwnOwotCQl9Ci0JfQorCQkJaWYg KCEkcGFzc2VkKSB7CisJCQkJaWYgKGlzc2V0KCRzZWN0aW9uX3RleHRbJ1hGQUlMJ10pKSB7CisJ CQkJCSRyZXN0eXBlW10gPSAnWEZBSUwnOworCQkJCQkkaW5mbyA9ICcgIFhGQUlMIFJFQVNPTjog JyAuIHJ0cmltKCRzZWN0aW9uX3RleHRbJ1hGQUlMJ10pOworCQkJCX0gZWxzZSB7CisJCQkJCSRy ZXN0eXBlW10gPSAnRkFJTCc7CisJCQkJfQorCQkJfQogCi0JaWYgKCEkcGFzc2VkKSB7CisJCQlp ZiAoISRwYXNzZWQpIHsKIAotCQkvLyB3cml0ZSAuZXhwCi0JCWlmIChzdHJwb3MoJGxvZ19mb3Jt YXQsICdFJykgIT09IGZhbHNlICYmIGZpbGVfcHV0X2NvbnRlbnRzKCRleHBfZmlsZW5hbWUsICR3 YW50ZWQsIEZJTEVfQklOQVJZKSA9PT0gZmFsc2UpIHsKLQkJCWVycm9yKCJDYW5ub3QgY3JlYXRl IGV4cGVjdGVkIHRlc3Qgb3V0cHV0IC0gJGV4cF9maWxlbmFtZSIpOwotCQl9CisJCQkJLy8gd3Jp dGUgLmV4cAorCQkJCWlmIChzdHJwb3MoJGxvZ19mb3JtYXQsICdFJykgIT09IGZhbHNlICYmIGZp bGVfcHV0X2NvbnRlbnRzKCRleHBfZmlsZW5hbWUsICR3YW50ZWQsIEZJTEVfQklOQVJZKSA9PT0g ZmFsc2UpIHsKKwkJCQkJZXJyb3IoIkNhbm5vdCBjcmVhdGUgZXhwZWN0ZWQgdGVzdCBvdXRwdXQg LSAkZXhwX2ZpbGVuYW1lIik7CisJCQkJfQogCi0JCS8vIHdyaXRlIC5vdXQKLQkJaWYgKHN0cnBv cygkbG9nX2Zvcm1hdCwgJ08nKSAhPT0gZmFsc2UgJiYgZmlsZV9wdXRfY29udGVudHMoJG91dHB1 dF9maWxlbmFtZSwgJG91dHB1dCwgRklMRV9CSU5BUlkpID09PSBmYWxzZSkgewotCQkJZXJyb3Io IkNhbm5vdCBjcmVhdGUgdGVzdCBvdXRwdXQgLSAkb3V0cHV0X2ZpbGVuYW1lIik7Ci0JCX0KKwkJ CQkvLyB3cml0ZSAub3V0CisJCQkJaWYgKHN0cnBvcygkbG9nX2Zvcm1hdCwgJ08nKSAhPT0gZmFs c2UgJiYgZmlsZV9wdXRfY29udGVudHMoJG91dHB1dF9maWxlbmFtZSwgJG91dHB1dCwgRklMRV9C SU5BUlkpID09PSBmYWxzZSkgeworCQkJCQllcnJvcigiQ2Fubm90IGNyZWF0ZSB0ZXN0IG91dHB1 dCAtICRvdXRwdXRfZmlsZW5hbWUiKTsKKwkJCQl9CiAKLQkJLy8gd3JpdGUgLmRpZmYKLQkJJGRp ZmYgPSBnZW5lcmF0ZV9kaWZmKCR3YW50ZWQsICR3YW50ZWRfcmUsICRvdXRwdXQpOwotCQlpZiAo aXNfYXJyYXkoJElOX1JFRElSRUNUKSkgewotCQkJJGRpZmYgPSAiIyBvcmlnaW5hbCBzb3VyY2Ug ZmlsZTogJHNob3J0bmFtZVxuIiAuICRkaWZmOwotCQl9Ci0JCXNob3dfZmlsZV9ibG9jaygnZGlm ZicsICRkaWZmKTsKLQkJaWYgKHN0cnBvcygkbG9nX2Zvcm1hdCwgJ0QnKSAhPT0gZmFsc2UgJiYg ZmlsZV9wdXRfY29udGVudHMoJGRpZmZfZmlsZW5hbWUsICRkaWZmLCBGSUxFX0JJTkFSWSkgPT09 IGZhbHNlKSB7Ci0JCQllcnJvcigiQ2Fubm90IGNyZWF0ZSB0ZXN0IGRpZmYgLSAkZGlmZl9maWxl bmFtZSIpOwotCQl9CisJCQkJLy8gd3JpdGUgLmRpZmYKKwkJCQkkZGlmZiA9IGdlbmVyYXRlX2Rp ZmYoJHdhbnRlZCwgJHdhbnRlZF9yZSwgJG91dHB1dCk7CisJCQkJaWYgKGlzX2FycmF5KCRJTl9S RURJUkVDVCkpIHsKKwkJCQkJJGRpZmYgPSAiIyBvcmlnaW5hbCBzb3VyY2UgZmlsZTogJHNob3J0 bmFtZVxuIiAuICRkaWZmOworCQkJCX0KKwkJCQlzaG93X2ZpbGVfYmxvY2soJ2RpZmYnLCAkZGlm Zik7CisJCQkJaWYgKHN0cnBvcygkbG9nX2Zvcm1hdCwgJ0QnKSAhPT0gZmFsc2UgJiYgZmlsZV9w dXRfY29udGVudHMoJGRpZmZfZmlsZW5hbWUsICRkaWZmLCBGSUxFX0JJTkFSWSkgPT09IGZhbHNl KSB7CisJCQkJCWVycm9yKCJDYW5ub3QgY3JlYXRlIHRlc3QgZGlmZiAtICRkaWZmX2ZpbGVuYW1l Iik7CisJCQkJfQogCi0JCS8vIHdyaXRlIC5zaAotCQlpZiAoc3RycG9zKCRsb2dfZm9ybWF0LCAn UycpICE9PSBmYWxzZSAmJiBmaWxlX3B1dF9jb250ZW50cygkc2hfZmlsZW5hbWUsICIjIS9iaW4v c2gKKwkJCQkvLyB3cml0ZSAuc2gKKwkJCQlpZiAoc3RycG9zKCRsb2dfZm9ybWF0LCAnUycpICE9 PSBmYWxzZSAmJiBmaWxlX3B1dF9jb250ZW50cygkc2hfZmlsZW5hbWUsICIjIS9iaW4vc2gKIAog eyRjbWR9CiAiLCBGSUxFX0JJTkFSWSkgPT09IGZhbHNlKSB7Ci0JCQllcnJvcigiQ2Fubm90IGNy ZWF0ZSB0ZXN0IHNoZWxsIHNjcmlwdCAtICRzaF9maWxlbmFtZSIpOwotCQl9Ci0JCWNobW9kKCRz aF9maWxlbmFtZSwgMDc1NSk7CisJCQkJCWVycm9yKCJDYW5ub3QgY3JlYXRlIHRlc3Qgc2hlbGwg c2NyaXB0IC0gJHNoX2ZpbGVuYW1lIik7CisJCQkJfQorCQkJCWNobW9kKCRzaF9maWxlbmFtZSwg MDc1NSk7CiAKLQkJLy8gd3JpdGUgLmxvZwotCQlpZiAoc3RycG9zKCRsb2dfZm9ybWF0LCAnTCcp ICE9PSBmYWxzZSAmJiBmaWxlX3B1dF9jb250ZW50cygkbG9nX2ZpbGVuYW1lLCAiCisJCQkJLy8g d3JpdGUgLmxvZworCQkJCWlmIChzdHJwb3MoJGxvZ19mb3JtYXQsICdMJykgIT09IGZhbHNlICYm IGZpbGVfcHV0X2NvbnRlbnRzKCRsb2dfZmlsZW5hbWUsICIKIC0tLS0gRVhQRUNURUQgT1VUUFVU CiAkd2FudGVkCiAtLS0tIEFDVFVBTCBPVVRQVVQKICRvdXRwdXQKIC0tLS0gRkFJTEVECiAiLCBG SUxFX0JJTkFSWSkgPT09IGZhbHNlKSB7Ci0JCQllcnJvcigiQ2Fubm90IGNyZWF0ZSB0ZXN0IGxv ZyAtICRsb2dfZmlsZW5hbWUiKTsKLQkJCWVycm9yX3JlcG9ydCgkZmlsZSwgJGxvZ19maWxlbmFt ZSwgJHRlc3RlZCk7Ci0JCX0KLQl9CisJCQkJCWVycm9yKCJDYW5ub3QgY3JlYXRlIHRlc3QgbG9n IC0gJGxvZ19maWxlbmFtZSIpOworCQkJCQllcnJvcl9yZXBvcnQoJGZpbGUsICRsb2dfZmlsZW5h bWUsICR0ZXN0ZWQpOworCQkJCX0KKwkJCX0KIAotCXNob3dfcmVzdWx0KGltcGxvZGUoJyYnLCAk cmVzdHlwZSksICR0ZXN0ZWQsICR0ZXN0ZWRfZmlsZSwgJGluZm8sICR0ZW1wX2ZpbGVuYW1lcyk7 CisJCQlzaG93X3Jlc3VsdChpbXBsb2RlKCcmJywgJHJlc3R5cGUpLCAkdGVzdGVkLCAkdGVzdGVk X2ZpbGUsICRpbmZvLCAkdGVtcF9maWxlbmFtZXMpOwogCi0JZm9yZWFjaCAoJHJlc3R5cGUgYXMg JHR5cGUpIHsKLQkJJFBIUF9GQUlMRURfVEVTVFNbJHR5cGUuJ0VEJ11bXSA9IGFycmF5ICgKLQkJ CSduYW1lJyAgICAgID0+ICRmaWxlLAotCQkJJ3Rlc3RfbmFtZScgPT4gKGlzX2FycmF5KCRJTl9S RURJUkVDVCkgPyAkSU5fUkVESVJFQ1RbJ3ZpYSddIDogJycpIC4gJHRlc3RlZCAuICIgWyR0ZXN0 ZWRfZmlsZV0iLAotCQkJJ291dHB1dCcgICAgPT4gJG91dHB1dF9maWxlbmFtZSwKLQkJCSdkaWZm JyAgICAgID0+ICRkaWZmX2ZpbGVuYW1lLAotCQkJJ2luZm8nICAgICAgPT4gJGluZm8sCi0JCSk7 Ci0JfQorCQkJZm9yZWFjaCAoJHJlc3R5cGUgYXMgJHR5cGUpIHsKKwkJCQkkUEhQX0ZBSUxFRF9U RVNUU1skdHlwZS4nRUQnXVtdID0gYXJyYXkgKAorCQkJCQknbmFtZScgICAgICA9PiAkZmlsZSwK KwkJCQkJJ3Rlc3RfbmFtZScgPT4gKGlzX2FycmF5KCRJTl9SRURJUkVDVCkgPyAkSU5fUkVESVJF Q1RbJ3ZpYSddIDogJycpIC4gJHRlc3RlZCAuICIgWyR0ZXN0ZWRfZmlsZV0iLAorCQkJCQknb3V0 cHV0JyAgICA9PiAkb3V0cHV0X2ZpbGVuYW1lLAorCQkJCQknZGlmZicgICAgICA9PiAkZGlmZl9m aWxlbmFtZSwKKwkJCQkJJ2luZm8nICAgICAgPT4gJGluZm8sCisJCQkJKTsKKwkJCX0KIAotCWlm IChpc3NldCgkb2xkX3BocCkpIHsKLQkJJHBocCA9ICRvbGRfcGhwOwotCX0KLQkKLQkkZGlmZiA9 IGVtcHR5KCRkaWZmKSA/ICcnIDogcHJlZ19yZXBsYWNlKCcvXGUvJywgJzxlc2M+JywgJGRpZmYp OworCQkJaWYgKGlzc2V0KCRvbGRfcGhwKSkgeworCQkJCSRwaHAgPSAkb2xkX3BocDsKKwkJCX0K IAotCWp1bml0X21hcmtfdGVzdF9hcygkcmVzdHlwZSwgc3RyX3JlcGxhY2UoJGN3ZCAuICcvJywg JycsICR0ZXN0ZWRfZmlsZSksICR0ZXN0ZWQsIG51bGwsICRpbmZvLCAkZGlmZik7CisJCQkkZGlm ZiA9IGVtcHR5KCRkaWZmKSA/ICcnIDogcHJlZ19yZXBsYWNlKCcvXGUvJywgJzxlc2M+JywgJGRp ZmYpOworCQkJJGRpZmYgPSBlbXB0eSgkZGlmZikgPyAnJyA6ICI8IVtDREFUQVtcbiAiIC4gcHJl Z19yZXBsYWNlKCcvXGUvJywgJzxlc2M+JywgJGRpZmYpIC4gIlxuXV0+IjsKIAotCXJldHVybiAk cmVzdHlwZVswXSAuICdFRCc7CisJCQlqdW5pdF9tYXJrX3Rlc3RfYXMoJHJlc3R5cGUsIHN0cl9y ZXBsYWNlKCRjd2QgLiAnLycsICcnLCAkdGVzdGVkX2ZpbGUpLCAkdGVzdGVkLCBudWxsLCAkaW5m bywgJGRpZmYpOworCisJCQlyZXR1cm4gJHJlc3R5cGVbMF0gLiAnRUQnOworCQl9CisJKTsKIH0K IAogZnVuY3Rpb24gY29tcF9saW5lKCRsMSwgJGwyLCAkaXNfcmVnKQpAQCAtMjU1Niw4ICsyNjcw LDIwIEBAIGZ1bmN0aW9uIHNob3dfdGVzdCgkdGVzdF9pZHgsICRzaG9ydG5hbWUpCiB7CiAJZ2xv YmFsICR0ZXN0X2NudDsKIAlnbG9iYWwgJGxpbmVfbGVuZ3RoOworCWdsb2JhbCAkdGVzdF9tYXA7 CisJCisJJHRlc3RfbWFwWyRzaG9ydG5hbWVdID0gJHRlc3RfaWR4OworCisJJHN0ciA9IHNwcmlu dGYoIiU1ZCBURVNUICR0ZXN0X2lkeC8kdGVzdF9jbnQgWyRzaG9ydG5hbWVdXHIiLCAkdGVzdF9p ZHgpOworCSRsaW5lX2xlbmd0aCA9IHN0cmxlbigkc3RyKTsKKwllY2hvICRzdHI7CisJZmx1c2go KTsKK30KIAotCSRzdHIgPSAiVEVTVCAkdGVzdF9pZHgvJHRlc3RfY250IFskc2hvcnRuYW1lXVxy IjsKK2Z1bmN0aW9uIHNob3dfdGVzdF9hY3RpdmUoJGFjdGl2ZSkgeworCWdsb2JhbCAkdGVzdF9p ZHgsICR0ZXN0X2NudCwgJGxpbmVfbGVuZ3RoOworCQorCSRzdHIgPSBzcHJpbnRmKCJURVNUICVk LyVkIFtuby4gJXMgc3RpbGwgcnVubmluZ11cciIsICR0ZXN0X2lkeCwgJHRlc3RfY250LCBpbXBs b2RlKCIsICIsIChhcnJheSkgJGFjdGl2ZSkpOwogCSRsaW5lX2xlbmd0aCA9IHN0cmxlbigkc3Ry KTsKIAllY2hvICRzdHI7CiAJZmx1c2goKTsKQEAgLTI1NjYsMTQgKzI2OTIsMTUgQEAgZnVuY3Rp b24gc2hvd190ZXN0KCR0ZXN0X2lkeCwgJHNob3J0bmFtZSkKIGZ1bmN0aW9uIHNob3dfcmVzdWx0 KCRyZXN1bHQsICR0ZXN0ZWQsICR0ZXN0ZWRfZmlsZSwgJGV4dHJhID0gJycsICR0ZW1wX2ZpbGVu YW1lcyA9IG51bGwpCiB7CiAJZ2xvYmFsICRodG1sX291dHB1dCwgJGh0bWxfZmlsZSwgJHRlbXBf dGFyZ2V0LCAkdGVtcF91cmxiYXNlLCAkbGluZV9sZW5ndGgsICRTSE9XX09OTFlfR1JPVVBTOwor CWdsb2JhbCAkdGVzdF9pZHgsICR0ZXN0X21hcDsKIAogCWlmICghJFNIT1dfT05MWV9HUk9VUFMg fHwgaW5fYXJyYXkoJHJlc3VsdCwgJFNIT1dfT05MWV9HUk9VUFMpKSB7Ci0JCWVjaG8gIiRyZXN1 bHQgJHRlc3RlZCBbJHRlc3RlZF9maWxlXSAkZXh0cmFcbiI7CisJCWVjaG8gc3ByaW50ZigiJTVk ICRyZXN1bHQgJHRlc3RlZCBbJHRlc3RlZF9maWxlXSAkZXh0cmFcbiIsICR0ZXN0X21hcFskdGVz dGVkX2ZpbGVdKTsKIAl9IGVsc2UgewogCQkvLyBXcml0ZSBvdmVyIHRoZSBsYXN0IGxpbmUgdG8g YXZvaWQgcmFuZG9tIHRyYWlsaW5nIGNoYXJzIG9uIG5leHQgZWNobwogCQllY2hvIHN0cl9yZXBl YXQoIiAiLCAkbGluZV9sZW5ndGgpLCAiXHIiOwogCX0KLQorCQogCWlmICgkaHRtbF9vdXRwdXQp IHsKIAogCQlpZiAoaXNzZXQoJHRlbXBfZmlsZW5hbWVzWydmaWxlJ10pICYmIGZpbGVfZXhpc3Rz KCR0ZW1wX2ZpbGVuYW1lc1snZmlsZSddKSkgewo= --089e0149401a1553c304fd9acc87--