From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ronald Rojas Subject: [PATCH RFC 15/59] controller: Move "running" code to a separate file Date: Wed, 28 Dec 2016 20:14:08 -0500 Message-ID: <1482974092-15891-15-git-send-email-ronladred@gmail.com> References: <1482974092-15891-1-git-send-email-ronladred@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1482974092-15891-1-git-send-email-ronladred@gmail.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: xen-devel , Ian Jackson , Wei Liu , George Dunlap , George Dunlap List-Id: xen-devel@lists.xenproject.org RnJvbTogR2VvcmdlIER1bmxhcCA8Z2VvcmdlLmR1bmxhcEBjaXRyaXguY29tPgoKU2lnbmVkLW9m Zi1ieTogR2VvcmdlIER1bmxhcCA8Z2VvcmdlLmR1bmxhcEBjaXRyaXguY29tPgotLS0KIE1ha2Vm aWxlICAgICB8ICAgMiArLQogYmVuY2htYXJrLmdvIHwgMTUzIC0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBydW4uZ28gICAgICAgfCAxNzggKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDMg ZmlsZXMgY2hhbmdlZCwgMTc5IGluc2VydGlvbnMoKyksIDE1NCBkZWxldGlvbnMoLSkKIGNyZWF0 ZSBtb2RlIDEwMDY0NCBydW4uZ28KCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmlu ZGV4IDdhMzNjZmIuLjJlMDZmODcgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxl CkBAIC00LDcgKzQsNyBAQCBCSU5BTEwgPSAkKEJJTikKIC5QSE9OWTogYWxsCiBhbGw6ICQoQklO KQogCi1zY2hlZGJlbmNoOiBtYWluLmdvIHByb2Nlc3N3b3JrZXIuZ28geGVud29ya2VyLmdvIGJl bmNobWFyay5nbworc2NoZWRiZW5jaDogbWFpbi5nbyBwcm9jZXNzd29ya2VyLmdvIHhlbndvcmtl ci5nbyBiZW5jaG1hcmsuZ28gcnVuLmdvCiAJZ28gYnVpbGQgLW8gJEAgJF4KIAogLlBIT05ZOiBj bGVhbgpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrLmdvIGIvYmVuY2htYXJrLmdvCmluZGV4IDQzNTRh NDcuLjJlMDNmZTUgMTAwNjQ0Ci0tLSBhL2JlbmNobWFyay5nbworKysgYi9iZW5jaG1hcmsuZ28K QEAgLTIxLDggKzIxLDYgQEAgcGFja2FnZSBtYWluCiBpbXBvcnQgKAogCSJmbXQiCiAJIm9zIgot CSJvcy9zaWduYWwiCi0JInRpbWUiCiAJImlvL2lvdXRpbCIKIAkiZW5jb2RpbmcvanNvbiIKICkK QEAgLTcxLDExICs2OSw2IEBAIGNvbnN0ICgKIAlTRUMgPSBNU0VDICogMTAwMAogKQogCi10eXBl IFdvcmtlclN0YXRlIHN0cnVjdCB7Ci0JdyBXb3JrZXIKLQlMYXN0UmVwb3J0IFdvcmtlclJlcG9y dAotfQotCiBmdW5jIFRocm91Z2hwdXQobHQgaW50LCBsbSBpbnQsIHQgaW50LCBtIGludCkgKHRw dXQgZmxvYXQ2NCkgewogCXRpbWUgOj0gZmxvYXQ2NCh0IC0gbHQpIC8gU0VDCiAJbW9wcyA6PSBt IC0gbG0KQEAgLTg0LDgwICs3Nyw2IEBAIGZ1bmMgVGhyb3VnaHB1dChsdCBpbnQsIGxtIGludCwg dCBpbnQsIG0gaW50KSAodHB1dCBmbG9hdDY0KSB7CiAJcmV0dXJuCiB9CiAKLWZ1bmMgUmVwb3J0 KHdzICpXb3JrZXJTdGF0ZSwgciBXb3JrZXJSZXBvcnQpIHsKLQkvL2ZtdC5QcmludGxuKHIpCi0K LQlsciA6PSB3cy5MYXN0UmVwb3J0Ci0KLQlpZiAobHIuTm93ID4gMCkgewotCQl0aW1lIDo9IGZs b2F0NjQoci5Ob3cgLSBsci5Ob3cpIC8gU0VDCi0JCW1vcHMgOj0gci5Nb3BzIC0gbHIuTW9wcwot Ci0JCXRwdXQgOj0gVGhyb3VnaHB1dChsci5Ob3csIGxyLk1vcHMsIHIuTm93LCByLk1vcHMpCi0J CQotCQlmbXQuUHJpbnRmKCIldiBUaW1lOiAlMi4zZiBNb3BzOiAlZCBUcHV0OiAlNC4yZlxuIiwg ci5JZCwgdGltZSwgbW9wcywgdHB1dCk7Ci0JfQotCi0Jd3MuTGFzdFJlcG9ydCA9IHIKLX0KLQot dHlwZSBXb3JrZXJMaXN0IG1hcFtXb3JrZXJJZF0qV29ya2VyU3RhdGUKLQotZnVuYyAod3MgKldv cmtlckxpc3QpIFN0YXJ0KHJlcG9ydCBjaGFuIFdvcmtlclJlcG9ydCwgZG9uZSBjaGFuIGJvb2wp IChpIGludCkgewotCWkgPSAwCi0JZm9yIGogOj0gcmFuZ2UgKndzIHsKLQkJZ28gKCp3cylbal0u dy5Qcm9jZXNzKHJlcG9ydCwgZG9uZSkKLQkJaSsrCi0JfQotCXJldHVybgotfQotCi1mdW5jICh3 cyAqV29ya2VyTGlzdCkgU3RvcCgpIHsKLQlmb3IgaSA6PSByYW5nZSAqd3MgewotCQkoKndzKVtp XS53LlNodXRkb3duKCkKLQl9Ci19Ci0KLWNvbnN0ICgKLQlXb3JrZXJQcm9jZXNzID0gaW90YQot CVdvcmtlclhlbiA9IGlvdGEKLSkKLQotZnVuYyBOZXdXb3JrZXJMaXN0KHdvcmtlcnMgW11Xb3Jr ZXJTZXQsIHdvcmtlclR5cGUgaW50KSAod2wgV29ya2VyTGlzdCwgZXJyIGVycm9yKSB7Ci0Jd2wg PSBXb3JrZXJMaXN0KG1ha2UobWFwW1dvcmtlcklkXSpXb3JrZXJTdGF0ZSkpCi0KLQlmb3Igd3Np IDo9IHJhbmdlIHdvcmtlcnMgewotCQlmb3IgaSA6PSAwOyBpIDwgd29ya2Vyc1t3c2ldLkNvdW50 OyBpID0gaSsxIHsKLQkJCUlkIDo9IFdvcmtlcklke1NldDp3c2ksSWQ6aX0KLQotCQkJd3MgOj0g d2xbSWRdCi0KLQkJCWlmIHdzICE9IG5pbCB7Ci0JCQkJcGFuaWMoIkR1cGxpY2F0ZSB3b3JrZXIg Zm9yIGlkISIpCi0JCQl9Ci0JCQkKLQkJCXdzID0gJldvcmtlclN0YXRle30KLQkJCQotCQkJc3dp dGNoIHdvcmtlclR5cGUgewotCQkJY2FzZSBXb3JrZXJQcm9jZXNzOgotCQkJCXdzLncgPSAmUHJv Y2Vzc1dvcmtlcnt9Ci0JCQljYXNlIFdvcmtlclhlbjoKLQkJCQl3cy53ID0gJlhlbldvcmtlcnt9 Ci0JCQlkZWZhdWx0OgotCQkJCWVyciA9IGZtdC5FcnJvcmYoIlVua25vd24gdHlwZTogJWQiLCB3 b3JrZXJUeXBlKQotCQkJCXJldHVybgotCQkJfQotCQkJCi0JCQl3cy53LlNldElkKElkKQotCQkK LQkJCXdzLncuSW5pdCh3b3JrZXJzW3dzaV0uUGFyYW1zKQotCi0JCQl3bFtJZF0gPSB3cwotCQl9 Ci0JfQotCXJldHVybgotfQotCiB0eXBlIEJlbmNobWFya1J1bkRhdGEgc3RydWN0IHsKIAlSYXcg W11Xb3JrZXJSZXBvcnQgICAgICAgYGpzb246IixvbWl0ZW1wdHkiYAogCVN1bW1hcnkgbWFwW1dv cmtlcklkXSpXb3JrZXJTdW1tYXJ5ICBganNvbjoiLG9taXRlbXB0eSJgCkBAIC0xNzEsNTkgKzkw LDYgQEAgdHlwZSBCZW5jaG1hcmtSdW4gc3RydWN0IHsKIAlSZXN1bHRzIEJlbmNobWFya1J1bkRh dGEgCiB9CiAKLWZ1bmMgKHJ1biAqQmVuY2htYXJrUnVuKSBSdW4oKSAoZXJyIGVycm9yKSB7Ci0J V29ya2VycywgZXJyIDo9IE5ld1dvcmtlckxpc3QocnVuLldvcmtlcnMsIFdvcmtlclhlbikKLQlp ZiBlcnIgIT0gbmlsIHsKLQkJZm10LlByaW50bG4oIkVycm9yIGNyZWF0aW5nIHdvcmtlcnM6ICV2 IiwgZXJyKQotCQlyZXR1cm4KLQl9Ci0JCi0JcmVwb3J0IDo9IG1ha2UoY2hhbiBXb3JrZXJSZXBv cnQpCi0JZG9uZSA6PSBtYWtlKGNoYW4gYm9vbCkKLQlzaWduYWxzIDo9IG1ha2UoY2hhbiBvcy5T aWduYWwsIDEpCi0KLQlzaWduYWwuTm90aWZ5KHNpZ25hbHMsIG9zLkludGVycnVwdCkKLQkKLQlp IDo9IFdvcmtlcnMuU3RhcnQocmVwb3J0LCBkb25lKQotCi0JLy8gRklYTUU6Ci0JLy8gMS4gTWFr ZSBhIHplcm8gdGltZW91dCBtZWFuICJuZXZlciIKLQkvLyAyLiBNYWtlIHRoZSBzaWduYWxzIC8g dGltZW91dCB0aGluZyBhIGJpdCBtb3JlIHJhdGlvbmFsOyBzaWduYWwgdGhlbiB0aW1lb3V0IHNo b3VsZG4ndCBoYXJkIGtpbGwKLQl0aW1lb3V0IDo9IHRpbWUuQWZ0ZXIodGltZS5EdXJhdGlvbihy dW4uUnVudGltZVNlY29uZHMpICogdGltZS5TZWNvbmQpOwotCXN0b3BwZWQgOj0gZmFsc2UKLQlm b3IgaSA+IDAgewotCQlzZWxlY3QgewotCQljYXNlIHIgOj0gPC1yZXBvcnQ6Ci0JCQlydW4uUmVz dWx0cy5SYXcgPSBhcHBlbmQocnVuLlJlc3VsdHMuUmF3LCByKQotCQkJUmVwb3J0KFdvcmtlcnNb ci5JZF0sIHIpCi0JCWNhc2UgPC1kb25lOgotCQkJaS0tOwotCQkJZm10LlByaW50bG4oaSwgIndv cmtlcnMgbGVmdCIpOwotCQljYXNlIDwtdGltZW91dDoKLQkJCWlmICEgc3RvcHBlZCB7Ci0JCQkJ V29ya2Vycy5TdG9wKCkKLQkJCQlzdG9wcGVkID0gdHJ1ZQotCQkJCXJ1bi5Db21wbGV0ZWQgPSB0 cnVlCi0JCQl9Ci0JCWNhc2UgPC1zaWduYWxzOgotCQkJaWYgISBzdG9wcGVkIHsKLQkJCQlmbXQu UHJpbnRsbigiU0lHSU5UIHJlY2VpZXZlZCwgc2h1dHRpbmcgZG93biB3b3JrZXJzIikKLQkJCQlX b3JrZXJzLlN0b3AoKQotCQkJCXN0b3BwZWQgPSB0cnVlCi0JCQkJaWYgcnVuLlJ1bnRpbWVTZWNv bmRzID09IDAgewotCQkJCQlydW4uQ29tcGxldGVkID0gdHJ1ZQotCQkJCX0KLQkJCQllcnIgPSBm bXQuRXJyb3JmKCJJbnRlcnJ1cHRlZCIpCi0JCQl9IGVsc2UgewotCQkJCWVyciA9IGZtdC5FcnJv cmYoIkludGVycnVwdGVkIikKLQkJCQlmbXQuUHJpbnRsbigiU0lHSU5UIHJlY2VpdmVkIGFmdGVy IHN0b3AsIGV4aXRpbmcgd2l0aG91dCBjbGVhbmluZyB1cCIpCi0JCQkJcmV0dXJuCi0JCQl9Ci0J CX0KLQl9Ci0JcmV0dXJuCi19Ci0KIGZ1bmMgKHJ1biAqQmVuY2htYXJrUnVuKSBjaGVja1N1bW1h cnkoKSAoZG9uZSBib29sLCBlcnIgZXJyb3IpIHsKIAlpZiBydW4uUmVzdWx0cy5TdW1tYXJ5ICE9 IG5pbCB7CiAJCWRvbmUgPSB0cnVlCkBAIC0zMjgsMjUgKzE5NCw2IEBAIHR5cGUgQmVuY2htYXJr UGxhbiBzdHJ1Y3QgewogCVJ1bnMgW11CZW5jaG1hcmtSdW4KIH0KIAotZnVuYyAocGxhbiAqQmVu Y2htYXJrUGxhbikgUnVuKCkgKGVyciBlcnJvcikgewotCWZvciBpIDo9IHJhbmdlIHBsYW4uUnVu cyB7Ci0JCWlmICEgcGxhbi5SdW5zW2ldLkNvbXBsZXRlZCB7Ci0JCQlmbXQuUHJpbnRmKCJSdW5u aW5nIHRlc3QgWyVkXSAlc1xuIiwgaSwgcGxhbi5SdW5zW2ldLkxhYmVsKQotCQkJZXJyID0gcGxh bi5SdW5zW2ldLlJ1bigpCi0JCQlpZiBlcnIgIT0gbmlsIHsKLQkJCQlyZXR1cm4KLQkJCX0KLQkJ fQotCQlmbXQuUHJpbnRmKCJUZXN0IFslZF0gJXMgY29tcGxldGVkXG4iLCBpLCBwbGFuLlJ1bnNb aV0uTGFiZWwpCi0JCWVyciA9IHBsYW4uU2F2ZSgpCi0JCWlmIGVyciAhPSBuaWwgewotCQkJZm10 LlByaW50bG4oIkVycm9yIHNhdmluZzogIiwgZXJyKQotCQkJcmV0dXJuCi0JCX0KLQl9Ci0JcmV0 dXJuCi19Ci0KIGZ1bmMgTG9hZEJlbmNobWFyayhmaWxlbmFtZSBzdHJpbmcpIChwbGFuIEJlbmNo bWFya1BsYW4sIGVyciBlcnJvcikgewogCXBsYW4uZmlsZW5hbWUgPSBmaWxlbmFtZQogCQpkaWZm IC0tZ2l0IGEvcnVuLmdvIGIvcnVuLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAuLjdiNWVmMGEKLS0tIC9kZXYvbnVsbAorKysgYi9ydW4uZ28KQEAgLTAsMCArMSwxNzggQEAK Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgR2VvcmdlIFcuIER1bmxhcCwgQ2l0cml4IFN5c3Rl bXMgVUsgTHRkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g cmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5z ZSBvbmx5LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0 aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBG SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2 ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBh bG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2Fy ZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwg Qm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCitwYWNrYWdlIG1haW4KKworaW1w b3J0ICgKKwkiZm10IgorCSJvcyIKKwkib3Mvc2lnbmFsIgorCSJ0aW1lIgorKQorCit0eXBlIFdv cmtlclN0YXRlIHN0cnVjdCB7CisJdyBXb3JrZXIKKwlMYXN0UmVwb3J0IFdvcmtlclJlcG9ydAor fQorCitmdW5jIFJlcG9ydCh3cyAqV29ya2VyU3RhdGUsIHIgV29ya2VyUmVwb3J0KSB7CisJLy9m bXQuUHJpbnRsbihyKQorCisJbHIgOj0gd3MuTGFzdFJlcG9ydAorCisJaWYgKGxyLk5vdyA+IDAp IHsKKwkJdGltZSA6PSBmbG9hdDY0KHIuTm93IC0gbHIuTm93KSAvIFNFQworCQltb3BzIDo9IHIu TW9wcyAtIGxyLk1vcHMKKworCQl0cHV0IDo9IFRocm91Z2hwdXQobHIuTm93LCBsci5Nb3BzLCBy Lk5vdywgci5Nb3BzKQorCQkKKwkJZm10LlByaW50ZigiJXYgVGltZTogJTIuM2YgTW9wczogJWQg VHB1dDogJTQuMmZcbiIsIHIuSWQsIHRpbWUsIG1vcHMsIHRwdXQpOworCX0KKworCXdzLkxhc3RS ZXBvcnQgPSByCit9CisKK3R5cGUgV29ya2VyTGlzdCBtYXBbV29ya2VySWRdKldvcmtlclN0YXRl CisKK2Z1bmMgKHdzICpXb3JrZXJMaXN0KSBTdGFydChyZXBvcnQgY2hhbiBXb3JrZXJSZXBvcnQs IGRvbmUgY2hhbiBib29sKSAoaSBpbnQpIHsKKwlpID0gMAorCWZvciBqIDo9IHJhbmdlICp3cyB7 CisJCWdvICgqd3MpW2pdLncuUHJvY2VzcyhyZXBvcnQsIGRvbmUpCisJCWkrKworCX0KKwlyZXR1 cm4KK30KKworZnVuYyAod3MgKldvcmtlckxpc3QpIFN0b3AoKSB7CisJZm9yIGkgOj0gcmFuZ2Ug KndzIHsKKwkJKCp3cylbaV0udy5TaHV0ZG93bigpCisJfQorfQorCitjb25zdCAoCisJV29ya2Vy UHJvY2VzcyA9IGlvdGEKKwlXb3JrZXJYZW4gPSBpb3RhCispCisKK2Z1bmMgTmV3V29ya2VyTGlz dChXb3JrZXJTZXRzIFtdV29ya2VyU2V0LCB3b3JrZXJUeXBlIGludCkgKHdsIFdvcmtlckxpc3Qs IGVyciBlcnJvcikgeworCXdsID0gV29ya2VyTGlzdChtYWtlKG1hcFtXb3JrZXJJZF0qV29ya2Vy U3RhdGUpKQorCisJZm9yIHdzaSA6PSByYW5nZSBXb3JrZXJTZXRzIHsKKwkJZm9yIGkgOj0gMDsg aSA8IFdvcmtlclNldHNbd3NpXS5Db3VudDsgaSA9IGkrMSB7CisJCQlJZCA6PSBXb3JrZXJJZHtT ZXQ6d3NpLElkOml9CisKKwkJCXdzIDo9IHdsW0lkXQorCisJCQlpZiB3cyAhPSBuaWwgeworCQkJ CXBhbmljKCJEdXBsaWNhdGUgd29ya2VyIGZvciBpZCEiKQorCQkJfQorCQkJCisJCQl3cyA9ICZX b3JrZXJTdGF0ZXt9CisJCQkKKwkJCXN3aXRjaCB3b3JrZXJUeXBlIHsKKwkJCWNhc2UgV29ya2Vy UHJvY2VzczoKKwkJCQl3cy53ID0gJlByb2Nlc3NXb3JrZXJ7fQorCQkJY2FzZSBXb3JrZXJYZW46 CisJCQkJd3MudyA9ICZYZW5Xb3JrZXJ7fQorCQkJZGVmYXVsdDoKKwkJCQllcnIgPSBmbXQuRXJy b3JmKCJVbmtub3duIHR5cGU6ICVkIiwgd29ya2VyVHlwZSkKKwkJCQlyZXR1cm4KKwkJCX0KKwkJ CQorCQkJd3Mudy5TZXRJZChJZCkKKwkJCisJCQl3cy53LkluaXQoV29ya2VyU2V0c1t3c2ldLlBh cmFtcykKKworCQkJd2xbSWRdID0gd3MKKwkJfQorCX0KKwlyZXR1cm4KK30KKworZnVuYyAocnVu ICpCZW5jaG1hcmtSdW4pIFJ1bigpIChlcnIgZXJyb3IpIHsKKwlXb3JrZXJzLCBlcnIgOj0gTmV3 V29ya2VyTGlzdChydW4uV29ya2VycywgV29ya2VyWGVuKQorCWlmIGVyciAhPSBuaWwgeworCQlm bXQuUHJpbnRsbigiRXJyb3IgY3JlYXRpbmcgd29ya2VyczogJXYiLCBlcnIpCisJCXJldHVybgor CX0KKwkKKwlyZXBvcnQgOj0gbWFrZShjaGFuIFdvcmtlclJlcG9ydCkKKwlkb25lIDo9IG1ha2Uo Y2hhbiBib29sKQorCXNpZ25hbHMgOj0gbWFrZShjaGFuIG9zLlNpZ25hbCwgMSkKKworCXNpZ25h bC5Ob3RpZnkoc2lnbmFscywgb3MuSW50ZXJydXB0KQorCQorCWkgOj0gV29ya2Vycy5TdGFydChy ZXBvcnQsIGRvbmUpCisKKwkvLyBGSVhNRToKKwkvLyAxLiBNYWtlIGEgemVybyB0aW1lb3V0IG1l YW4gIm5ldmVyIgorCS8vIDIuIE1ha2UgdGhlIHNpZ25hbHMgLyB0aW1lb3V0IHRoaW5nIGEgYml0 IG1vcmUgcmF0aW9uYWw7IHNpZ25hbCB0aGVuIHRpbWVvdXQgc2hvdWxkbid0IGhhcmQga2lsbAor CXRpbWVvdXQgOj0gdGltZS5BZnRlcih0aW1lLkR1cmF0aW9uKHJ1bi5SdW50aW1lU2Vjb25kcykg KiB0aW1lLlNlY29uZCk7CisJc3RvcHBlZCA6PSBmYWxzZQorCWZvciBpID4gMCB7CisJCXNlbGVj dCB7CisJCWNhc2UgciA6PSA8LXJlcG9ydDoKKwkJCXJ1bi5SZXN1bHRzLlJhdyA9IGFwcGVuZChy dW4uUmVzdWx0cy5SYXcsIHIpCisJCQlSZXBvcnQoV29ya2Vyc1tyLklkXSwgcikKKwkJY2FzZSA8 LWRvbmU6CisJCQlpLS07CisJCQlmbXQuUHJpbnRsbihpLCAid29ya2VycyBsZWZ0Iik7CisJCWNh c2UgPC10aW1lb3V0OgorCQkJaWYgISBzdG9wcGVkIHsKKwkJCQlXb3JrZXJzLlN0b3AoKQorCQkJ CXN0b3BwZWQgPSB0cnVlCisJCQkJcnVuLkNvbXBsZXRlZCA9IHRydWUKKwkJCX0KKwkJY2FzZSA8 LXNpZ25hbHM6CisJCQlpZiAhIHN0b3BwZWQgeworCQkJCWZtdC5QcmludGxuKCJTSUdJTlQgcmVj ZWlldmVkLCBzaHV0dGluZyBkb3duIHdvcmtlcnMiKQorCQkJCVdvcmtlcnMuU3RvcCgpCisJCQkJ c3RvcHBlZCA9IHRydWUKKwkJCQlpZiBydW4uUnVudGltZVNlY29uZHMgPT0gMCB7CisJCQkJCXJ1 bi5Db21wbGV0ZWQgPSB0cnVlCisJCQkJfQorCQkJCWVyciA9IGZtdC5FcnJvcmYoIkludGVycnVw dGVkIikKKwkJCX0gZWxzZSB7CisJCQkJZXJyID0gZm10LkVycm9yZigiSW50ZXJydXB0ZWQiKQor CQkJCWZtdC5QcmludGxuKCJTSUdJTlQgcmVjZWl2ZWQgYWZ0ZXIgc3RvcCwgZXhpdGluZyB3aXRo b3V0IGNsZWFuaW5nIHVwIikKKwkJCQlyZXR1cm4KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4KK30K KworZnVuYyAocGxhbiAqQmVuY2htYXJrUGxhbikgUnVuKCkgKGVyciBlcnJvcikgeworCWZvciBp IDo9IHJhbmdlIHBsYW4uUnVucyB7CisJCWlmICEgcGxhbi5SdW5zW2ldLkNvbXBsZXRlZCB7CisJ CQlmbXQuUHJpbnRmKCJSdW5uaW5nIHRlc3QgWyVkXSAlc1xuIiwgaSwgcGxhbi5SdW5zW2ldLkxh YmVsKQorCQkJZXJyID0gcGxhbi5SdW5zW2ldLlJ1bigpCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJ CQlyZXR1cm4KKwkJCX0KKwkJfQorCQlmbXQuUHJpbnRmKCJUZXN0IFslZF0gJXMgY29tcGxldGVk XG4iLCBpLCBwbGFuLlJ1bnNbaV0uTGFiZWwpCisJCWVyciA9IHBsYW4uU2F2ZSgpCisJCWlmIGVy ciAhPSBuaWwgeworCQkJZm10LlByaW50bG4oIkVycm9yIHNhdmluZzogIiwgZXJyKQorCQkJcmV0 dXJuCisJCX0KKwl9CisJcmV0dXJuCit9CisKLS0gCjIuNy40CgoKX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApYZW4t ZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwczovL2xpc3RzLnhlbi5vcmcveGVuLWRldmVsCg==