From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ronald Rojas Subject: [PATCH RFC 59/59] tools/xenlight: Create interface for xenlight info Date: Wed, 28 Dec 2016 20:14:52 -0500 Message-ID: <1482974092-15891-59-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 Cc: Ronald Rojas List-Id: xen-devel@lists.xenproject.org Q3JlYXRlIGludGVyZmFjZSB0byBpbnRlcmFjdCB3aXRoIGxpYnhsX3ZlcmlvbnNfaW5mbwphbmQg bGlieGxfcGh5c2luZm8uIEFsc28gaW50cm9kdWNlIHByb3BlciBlcnJvcgpoYW5kbGluZy4KClNp Z25lZC1vZmYtYnk6IFJvbmFsZCBSb2phcyA8cm9ubGFkcmVkQGdtYWlsLmNvbT4KLS0tCiB0b29s cy9nb2xhbmcveGVubGlnaHQvbGlieGwuZ28gICAgfCAgNzIwIC0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCiB0b29scy9nb2xhbmcveGVubGlnaHQveGVubGlnaHQuZ28gfCAxMDAwICsrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDIgZmlsZXMgY2hhbmdlZCwgMTAwMCBpbnNl cnRpb25zKCspLCA3MjAgZGVsZXRpb25zKC0pCiBkZWxldGUgbW9kZSAxMDA2NDQgdG9vbHMvZ29s YW5nL3hlbmxpZ2h0L2xpYnhsLmdvCiBjcmVhdGUgbW9kZSAxMDA2NDQgdG9vbHMvZ29sYW5nL3hl bmxpZ2h0L3hlbmxpZ2h0LmdvCgpkaWZmIC0tZ2l0IGEvdG9vbHMvZ29sYW5nL3hlbmxpZ2h0L2xp YnhsLmdvIGIvdG9vbHMvZ29sYW5nL3hlbmxpZ2h0L2xpYnhsLmdvCmRlbGV0ZWQgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCBhYTVjMDFjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2dvbGFuZy94ZW5saWdo dC9saWJ4bC5nbworKysgL2Rldi9udWxsCkBAIC0xLDcyMCArMCwwIEBACi0vKgotICogQ29weXJp Z2h0IChDKSAyMDE2IEdlb3JnZSBXLiBEdW5sYXAsIENpdHJpeCBTeXN0ZW1zIFVLIEx0ZAotICoK LSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp dCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZQotICogTGljZW5zZSBvbmx5LgotICoKLSAqIFRoaXMg cHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs LCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg d2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt b3JlIGRldGFpbHMuCi0gKiAKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3Jh bTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5j LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAt MTMwMSwgVVNBLgotICovCi1wYWNrYWdlIG1haW4KLQotLyoKLSNjZ28gTERGTEFHUzogLWx4ZW5s aWdodCAtbHlhamxfcyAtbHhlbmdudHRhYiAtbHhlbnN0b3JlIC1seGVuZ3Vlc3QgLWx4ZW50b29s bG9nIC1seGVuZXZ0Y2huIC1seGVuY3RybCAtbGJsa3RhcGN0bCAtbHhlbmZvcmVpZ25tZW1vcnkg LWx4ZW5jYWxsIC1seiAtbHV1aWQgLWx1dGlsCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVk ZSA8bGlieGwuaD4KLSovCi1pbXBvcnQgIkMiCi0KLS8qCi0gKiBPdGhlciBmbGFncyB0aGF0IG1h eSBiZSBuZWVkZWQgYXQgc29tZSBwb2ludDogCi0gKiAgLWxubC1yb3V0ZS0zIC1sbmwtMwotICoK LSAqIFRvIGdldCBiYWNrIHRvIHNpbXBsZSBkeW5hbWljIGxpbmtpbmc6Ci0jY2dvIExERkxBR1M6 IC1seGVubGlnaHQgLWx5YWpsCi0qLwotCi1pbXBvcnQgKAotCSJ1bnNhZmUiCi0JImZtdCIKLQki dGltZSIKLSkKLQotLyoKLSAqIFR5cGVzOiBCdWlsdGlucwotICovCi0KLXR5cGUgRG9taWQgdWlu dDMyCi0KLXR5cGUgTWVtS0IgdWludDY0Ci0KLS8vIHR5cGVkZWYgc3RydWN0IHsKLS8vICAgICB1 aW50MzJfdCBzaXplOyAgICAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgaW4gbWFwICovCi0vLyAg ICAgdWludDhfdCAqbWFwOwotLy8gfSBsaWJ4bF9iaXRtYXA7Ci0KLS8vIEltcGxlbWVudCB0aGUg R28gYml0bWFwIHR5cGUgc3VjaCB0aGF0IHRoZSB1bmRlcmx5aW5nIGRhdGEgY2FuCi0vLyBlYXNp bHkgYmUgY29waWVkIGluIGFuZCBvdXQuICBOQiB0aGF0IHdlIHN0aWxsIGhhdmUgdG8gZG8gY29w aWVzCi0vLyBib3RoIGRpcmVjdGlvbnMsIGJlY2F1c2UgY2dvIHJ1bnRpbWUgcmVzdHJpY3Rpb25z IGZvcmJpZCBwYXNzaW5nIHRvCi0vLyBhIEMgZnVuY3Rpb24gYSBwb2ludGVyIHRvIGEgR28tYWxs b2NhdGVkIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBhCi0vLyBwb2ludGVyLgotdHlwZSBCaXRt YXAgc3RydWN0IHsKLQliaXRtYXAgW11DLnVpbnQ4X3QKLX0KLQotdHlwZSBDb250ZXh0IHN0cnVj dCB7Ci0JY3R4ICpDLmxpYnhsX2N0eAotfQotCi10eXBlIFV1aWQgQy5saWJ4bF91dWlkCi0KLS8q Ci0gKiBUeXBlczogSURMCi0gKiAKLSAqIEZJWE1FOiBHZW5lcmF0ZSB0aGVzZSBhdXRvbWF0aWNh bGx5IGZyb20gdGhlIElETAotICovCi10eXBlIERvbWluZm8gc3RydWN0IHsKLQlVdWlkICAgICAg ICAgICAgICBVdWlkCi0JRG9taWQgICAgICAgICAgICAgRG9taWQKLQlSdW5uaW5nICAgICAgICAg ICBib29sCi0JQmxvY2tlZCAgICAgICAgICAgYm9vbAotCVBhdXNlZCAgICAgICAgICAgIGJvb2wK LQlTaHV0ZG93biAgICAgICAgICBib29sCi0JRHlpbmcgICAgICAgICAgICAgYm9vbAotCU5ldmVy X3N0b3AgICAgICAgIGJvb2wKLQkKLQlTaHV0ZG93bl9yZWFzb24gICBpbnQzMiAvLyBGSVhNRSBz aHV0ZG93bl9yZWFzb24gZW51bWVyYXRpb24KLQlPdXRzdGFuZGluZ19tZW1rYiBNZW1LQgotCUN1 cnJlbnRfbWVta2IgICAgIE1lbUtCCi0JU2hhcmVkX21lbWtiICAgICAgTWVtS0IKLQlQYWdlZF9t ZW1rYiAgICAgICBNZW1LQgotCU1heF9tZW1rYiAgICAgICAgIE1lbUtCCi0JQ3B1X3RpbWUgICAg ICAgICAgdGltZS5EdXJhdGlvbgotCVZjcHVfbWF4X2lkICAgICAgIHVpbnQzMgotCVZjcHVfb25s aW5lICAgICAgIHVpbnQzMgotCUNwdXBvb2wgICAgICAgICAgIHVpbnQzMgotCURvbWFpbl90eXBl ICAgICAgIGludDMyIC8vRklYTUUgbGlieGxfZG9tYWluX3R5cGUgZW51bWVyYXRpb24KLQotfQot Ci0vLyAjIENvbnNpc3RlbnQgd2l0aCB2YWx1ZXMgZGVmaW5lZCBpbiBkb21jdGwuaAotLy8gIyBF eGNlcHQgdW5rbm93biB3aGljaCB3ZSBoYXZlIG1hZGUgdXAKLS8vIGxpYnhsX3NjaGVkdWxlciA9 IEVudW1lcmF0aW9uKCJzY2hlZHVsZXIiLCBbCi0vLyAgICAgKDAsICJ1bmtub3duIiksCi0vLyAg ICAgKDQsICJzZWRmIiksCi0vLyAgICAgKDUsICJjcmVkaXQiKSwKLS8vICAgICAoNiwgImNyZWRp dDIiKSwKLS8vICAgICAoNywgImFyaW5jNjUzIiksCi0vLyAgICAgKDgsICJydGRzIiksCi0vLyAg ICAgXSkKLXR5cGUgU2NoZWR1bGVyIGludAotdmFyICgKLQlTY2hlZHVsZXJVbmtub3duICBTY2hl ZHVsZXIgPSBDLkxJQlhMX1NDSEVEVUxFUl9VTktOT1dOCi0JU2NoZWR1bGVyU2VkZiAgICAgU2No ZWR1bGVyID0gQy5MSUJYTF9TQ0hFRFVMRVJfU0VERgotCVNjaGVkdWxlckNyZWRpdCAgIFNjaGVk dWxlciA9IEMuTElCWExfU0NIRURVTEVSX0NSRURJVAotCVNjaGVkdWxlckNyZWRpdDIgIFNjaGVk dWxlciA9IEMuTElCWExfU0NIRURVTEVSX0NSRURJVDIKLQlTY2hlZHVsZXJBcmluYzY1MyBTY2hl ZHVsZXIgPSBDLkxJQlhMX1NDSEVEVUxFUl9BUklOQzY1MwotCVNjaGVkdWxlclJURFMgICAgIFNj aGVkdWxlciA9IEMuTElCWExfU0NIRURVTEVSX1JURFMKLSkKLQotLy8gbGlieGxfY3B1cG9vbGlu Zm8gPSBTdHJ1Y3QoImNwdXBvb2xpbmZvIiwgWwotLy8gICAgICgicG9vbGlkIiwgICAgICB1aW50 MzIpLAotLy8gICAgICgicG9vbF9uYW1lIiwgICBzdHJpbmcpLAotLy8gICAgICgic2NoZWQiLCAg ICAgICBsaWJ4bF9zY2hlZHVsZXIpLAotLy8gICAgICgibl9kb20iLCAgICAgICB1aW50MzIpLAot Ly8gICAgICgiY3B1bWFwIiwgICAgICBsaWJ4bF9iaXRtYXApCi0vLyAgICAgXSwgZGlyPURJUl9P VVQpCi0KLXR5cGUgQ3B1cG9vbEluZm8gc3RydWN0IHsKLQlQb29saWQgdWludDMyCi0JUG9vbE5h bWUgc3RyaW5nCi0JU2NoZWR1bGVyIFNjaGVkdWxlcgotCURvbWFpbkNvdW50IGludAotCUNwdW1h cCBCaXRtYXAKLX0KLQotLyoKLSAqIENvbnRleHQKLSAqLwotdmFyIEN0eCBDb250ZXh0Ci0KLWZ1 bmMgKEN0eCAqQ29udGV4dCkgSXNPcGVuKCkgYm9vbCB7Ci0JcmV0dXJuIEN0eC5jdHggIT0gbmls Ci19Ci0KLWZ1bmMgKEN0eCAqQ29udGV4dCkgT3BlbigpIChlcnIgZXJyb3IpIHsKLQlpZiBDdHgu Y3R4ICE9IG5pbCB7Ci0JCXJldHVybgotCX0KLQkKLQlyZXQgOj0gQy5saWJ4bF9jdHhfYWxsb2Mo dW5zYWZlLlBvaW50ZXIoJkN0eC5jdHgpLCBDLkxJQlhMX1ZFUlNJT04sIDAsIG5pbCkKLQotCWlm IHJldCAhPSAwIHsKLQkJZXJyID0gZm10LkVycm9yZigiQWxsb2NhdGluZyBsaWJ4bCBjb250ZXh0 OiAlZCIsIHJldCkKLQl9Ci0JcmV0dXJuCi19Ci0KLWZ1bmMgKEN0eCAqQ29udGV4dCkgQ2xvc2Uo KSAoZXJyIGVycm9yKSB7Ci0JcmV0IDo9IEMubGlieGxfY3R4X2ZyZWUodW5zYWZlLlBvaW50ZXIo Q3R4LmN0eCkpCi0JQ3R4LmN0eCA9IG5pbAotCi0JaWYgcmV0ICE9IDAgewotCQllcnIgPSBmbXQu RXJyb3JmKCJGcmVlaW5nIGxpYnhsIGNvbnRleHQ6ICVkIiwgcmV0KQotCX0KLQlyZXR1cm4KLX0K LQotZnVuYyAoQ3R4ICpDb250ZXh0KSBDaGVja09wZW4oKSAoZXJyIGVycm9yKSB7Ci0JaWYgQ3R4 LmN0eCA9PSBuaWwgewotCQllcnIgPSBmbXQuRXJyb3JmKCJDb250ZXh0IG5vdCBvcGVuZWQiKQot CX0KLQlyZXR1cm4KLX0KLQotZnVuYyAoQ3R4ICpDb250ZXh0KSBEb21haW5JbmZvKElkIERvbWlk KSAoZGkgKkRvbWluZm8sIGVyciBlcnJvcikgewotCWVyciA9IEN0eC5DaGVja09wZW4oKQotCWlm IGVyciAhPSBuaWwgewotCQlyZXR1cm4KLQl9Ci0KLQl2YXIgY2RpIEMubGlieGxfZG9taW5mbwot Ci0JcmV0IDo9IEMubGlieGxfZG9tYWluX2luZm8oQ3R4LmN0eCwgdW5zYWZlLlBvaW50ZXIoJmNk aSksIEMudWludDMyX3QoSWQpKQotCi0JLy8gRklYTUU6IElzRG9tYWluTm90UHJlc2VudEVycm9y Ci0JaWYgcmV0ICE9IDAgewotCQllcnIgPSBmbXQuRXJyb3JmKCJsaWJ4bF9kb21haW5faW5mbyBm YWlsZWQ6ICVkIiwgcmV0KQotCQlyZXR1cm4KLQl9Ci0KLQkvLyBXZSBjb3VsZCBjb25zaWRlciBo YXZpbmcgdGhpcyBib2lsZXJwbGF0ZSBnZW5lcmF0ZWQgYnkgdGhlCi0JLy8gaWRsLCBpbiBhIGZ1 bmN0aW9uIGxpa2UgdGhpczoKLQkvLwotCS8vIGRpID0gdHJhbnNsYXRlQ2RvbWFpbmluZm9Ub0dv RG9tYWluaW5mbyhjZGkpCi0JZGkgPSAmRG9taW5mb3t9Ci0JZGkuVXVpZCA9IFV1aWQoY2RpLnV1 aWQpCi0JZGkuRG9taWQgPSBEb21pZChjZGkuZG9taWQpCi0JZGkuUnVubmluZyA9IGJvb2woY2Rp LnJ1bm5pbmcpCi0JZGkuQmxvY2tlZCA9IGJvb2woY2RpLmJsb2NrZWQpCi0JZGkuUGF1c2VkID0g Ym9vbChjZGkucGF1c2VkKQotCWRpLlNodXRkb3duID0gYm9vbChjZGkuc2h1dGRvd24pCi0JZGku RHlpbmcgPSBib29sKGNkaS5keWluZykKLQlkaS5OZXZlcl9zdG9wID0gYm9vbChjZGkubmV2ZXJf c3RvcCkKLQlkaS5TaHV0ZG93bl9yZWFzb24gPSBpbnQzMihjZGkuc2h1dGRvd25fcmVhc29uKQot CWRpLk91dHN0YW5kaW5nX21lbWtiID0gTWVtS0IoY2RpLm91dHN0YW5kaW5nX21lbWtiKQotCWRp LkN1cnJlbnRfbWVta2IgPSBNZW1LQihjZGkuY3VycmVudF9tZW1rYikKLQlkaS5TaGFyZWRfbWVt a2IgPSBNZW1LQihjZGkuc2hhcmVkX21lbWtiKQotCWRpLlBhZ2VkX21lbWtiID0gTWVtS0IoY2Rp LnBhZ2VkX21lbWtiKQotCWRpLk1heF9tZW1rYiA9IE1lbUtCKGNkaS5tYXhfbWVta2IpCi0JZGku Q3B1X3RpbWUgPSB0aW1lLkR1cmF0aW9uKGNkaS5jcHVfdGltZSkKLQlkaS5WY3B1X21heF9pZCA9 IHVpbnQzMihjZGkudmNwdV9tYXhfaWQpCi0JZGkuVmNwdV9vbmxpbmUgPSB1aW50MzIoY2RpLnZj cHVfb25saW5lKQotCWRpLkNwdXBvb2wgPSB1aW50MzIoY2RpLmNwdXBvb2wpCi0JZGkuRG9tYWlu X3R5cGUgPSBpbnQzMihjZGkuZG9tYWluX3R5cGUpCi0KLQlyZXR1cm4KLX0KLQotZnVuYyAoQ3R4 ICpDb250ZXh0KSBEb21haW5VbnBhdXNlKElkIERvbWlkKSAoZXJyIGVycm9yKSB7Ci0JZXJyID0g Q3R4LkNoZWNrT3BlbigpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCXJldHVybgotCX0KLQotCXJldCA6 PSBDLmxpYnhsX2RvbWFpbl91bnBhdXNlKEN0eC5jdHgsIEMudWludDMyX3QoSWQpKQotCi0JaWYg cmV0ICE9IDAgewotCQllcnIgPSBmbXQuRXJyb3JmKCJsaWJ4bF9kb21haW5fdW5wYXVzZSBmYWls ZWQ6ICVkIiwgcmV0KQotCX0KLQlyZXR1cm4KLX0KLQotLyoKLSAqIEJpdG1hcCBvcGVyYXRpb25z Ci0gKi8KLQotLy8gUmV0dXJuIGEgR28gYml0bWFwIHdoaWNoIGlzIGEgY29weSBvZiB0aGUgcmVm ZXJyZWQgQyBiaXRtYXAuCi1mdW5jIGJpdG1hcENUb0dvKGNibSBDLmxpYnhsX2JpdG1hcCkgKGdi bSBCaXRtYXApIHsKLQkvLyBBbGxvYyBhIEdvIHNsaWNlIGZvciB0aGUgYnl0ZXMKLQlzaXplIDo9 IGludChjYm0uc2l6ZSkKLQlnYm0uYml0bWFwID0gbWFrZShbXUMudWludDhfdCwgc2l6ZSkKLQot CS8vIE1ha2UgYSBzbGljZSBwb2ludGluZyB0byB0aGUgQyBhcnJheQotCW1hcHNsaWNlIDo9ICgq WzEgPDwgMzBdQy51aW50OF90KSh1bnNhZmUuUG9pbnRlcihjYm0uX21hcCkpWzpzaXplOnNpemVd Ci0KLQkvLyBBbmQgY29weSB0aGUgQyBhcnJheSBpbnRvIHRoZSBHbyBhcnJheQotCWNvcHkoZ2Jt LmJpdG1hcCwgbWFwc2xpY2UpCi0KLQlyZXR1cm4KLX0KLQotLy8gTXVzdCBiZSBDLmxpYnhsX2Jp dG1hcF9kaXNwb3NlJ2Qgb2YgYWZ0ZXJ3YXJkcwotZnVuYyBiaXRtYXBHb3RvQyhnYm0gQml0bWFw KSAoY2JtIEMubGlieGxfYml0bWFwKSB7Ci0JQy5saWJ4bF9iaXRtYXBfaW5pdCgmY2JtKQotCi0J c2l6ZSA6PSBsZW4oZ2JtLmJpdG1hcCkKLQljYm0uX21hcCA9ICgqQy51aW50OF90KShDLm1hbGxv YyhDLnNpemVfdChzaXplKSkpCi0JY2JtLnNpemUgPSBDLnVpbnQzMl90KHNpemUpCi0JaWYgY2Jt Ll9tYXAgPT0gbmlsIHsKLQkJcGFuaWMoIkMuY2FsbG9jIGZhaWxlZCEiKQotCX0KLQotCS8vIE1h a2UgYSBzbGljZSBwb2ludGluZyB0byB0aGUgQyBhcnJheQotCW1hcHNsaWNlIDo9ICgqWzEgPDwg MzBdQy51aW50OF90KSh1bnNhZmUuUG9pbnRlcihjYm0uX21hcCkpWzpzaXplOnNpemVdCi0KLQkv LyBBbmQgY29weSB0aGUgR28gYXJyYXkgaW50byB0aGUgQyBhcnJheQotCWNvcHkobWFwc2xpY2Us IGdibS5iaXRtYXApCi0KLQlyZXR1cm4KLX0KLQotZnVuYyAoYm0gKkJpdG1hcCkgVGVzdChiaXQg aW50KSAoYm9vbCkgewotCXViaXQgOj0gdWludChiaXQpCi0JaWYgKGJpdCA+IGJtLk1heCgpIHx8 IGJtLmJpdG1hcCA9PSBuaWwpIHsKLQkJcmV0dXJuIGZhbHNlCi0JfQotCQotCXJldHVybiAoYm0u Yml0bWFwW2JpdCAvIDhdICYgKDEgPDwgKHViaXQgJiA3KSkpICE9IDAKLX0KLQotZnVuYyAoYm0g KkJpdG1hcCkgU2V0KGJpdCBpbnQpIHsKLQlpYml0IDo9IGJpdCAvIDg7Ci0JaWYgKGliaXQgKyAx ID4gbGVuKGJtLmJpdG1hcCkpIHsKLQkJYm0uYml0bWFwID0gYXBwZW5kKGJtLmJpdG1hcCwgbWFr ZShbXUMudWludDhfdCwgaWJpdCsxLWxlbihibS5iaXRtYXApKS4uLikKLQl9Ci0JCi0JYm0uYml0 bWFwW2liaXRdIHw9IDEgPDwgKHVpbnQoYml0KSAmIDcpCi19Ci0KLWZ1bmMgKGJtICpCaXRtYXAp IFNldFJhbmdlKHN0YXJ0IGludCwgZW5kIGludCkgewotCWZvciBpIDo9IHN0YXJ0OyBpIDw9IGVu ZDsgaSsrIHsKLQkJYm0uU2V0KGkpCi0JfQotfQotCi1mdW5jIChibSAqQml0bWFwKSBDbGVhcihi aXQgaW50KSB7Ci0JdWJpdCA6PSB1aW50KGJpdCkKLQlpZiAoYml0ID4gYm0uTWF4KCkgfHwgYm0u Yml0bWFwID09IG5pbCkgewotCQlyZXR1cm4KLQl9Ci0JCi0JYm0uYml0bWFwW2JpdCAvIDhdICY9 IF4oMSA8PCAodWJpdCAmIDcpKQotfQotCi1mdW5jIChibSAqQml0bWFwKSBDbGVhclJhbmdlKHN0 YXJ0IGludCwgZW5kIGludCkgewotCWZvciBpIDo9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrIHsKLQkJ Ym0uQ2xlYXIoaSkKLQl9Ci19Ci0KLWZ1bmMgKGJtICpCaXRtYXApIE1heCgpIChpbnQpIHsKLQly ZXR1cm4gbGVuKGJtLmJpdG1hcCkgKiA4IC0gMQotfQotCi1mdW5jIChibSAqQml0bWFwKSBJc0Vt cHR5KCkgKGJvb2wpIHsKLQlmb3IgaTo9MDsgaTxsZW4oYm0uYml0bWFwKTsgaSsrIHsKLQkJaWYg Ym0uYml0bWFwW2ldICE9IDAgewotCQkJcmV0dXJuIGZhbHNlCi0JCX0KLQl9Ci0JcmV0dXJuIHRy dWUKLX0KLQotZnVuYyAoYSBCaXRtYXApIEFuZChiIEJpdG1hcCkgKGMgQml0bWFwKSB7Ci0JdmFy IG1heCwgbWluIGludAotCWlmIGxlbihhLmJpdG1hcCkgPiBsZW4oYi5iaXRtYXApIHsKLQkJbWF4 ID0gbGVuKGEuYml0bWFwKQotCQltaW4gPSBsZW4oYi5iaXRtYXApCi0JfSBlbHNlIHsKLQkJbWF4 ID0gbGVuKGIuYml0bWFwKQotCQltaW4gPSBsZW4oYS5iaXRtYXApCi0JfQotCWMuYml0bWFwID0g bWFrZShbXUMudWludDhfdCwgbWF4KQotCi0JZm9yIGkgOj0gMDsgaSA8IG1pbjsgaSsrIHsKLQkJ Yy5iaXRtYXBbaV0gPSBhLmJpdG1hcFtpXSAmIGIuYml0bWFwW2ldCi0JfQotCXJldHVybgotfQot Ci1mdW5jIChibSBCaXRtYXApIFN0cmluZygpIChzIHN0cmluZykgewotCWxhc3RPbmxpbmUgOj0g ZmFsc2UKLQljcmFuZ2UgOj0gZmFsc2UKLQlwcmludGVkIDo9IGZhbHNlCi0JdmFyIGkgaW50Ci0J Ly8vIC0teC14eHh4eC14IC0+IDIsNC04LDEwCi0JLy8vIC0teC14eHh4eHh4IC0+IDIsNC0xMAot CWZvciBpID0gMDsgaSA8PSBibS5NYXgoKTsgaSsrIHsKLQkJaWYgYm0uVGVzdChpKSB7Ci0JCQlp ZiAhbGFzdE9ubGluZSB7Ci0JCQkJLy8gU3dpdGNoaW5nIG9mZmxpbmUgLT4gb25saW5lLCBwcmlu dCB0aGlzIGNwdQotCQkJCWlmIHByaW50ZWQgewotCQkJCQlzICs9ICIsIgotCQkJCX0KLQkJCQlz ICs9IGZtdC5TcHJpbnRmKCIlZCIsIGkpCi0JCQkJcHJpbnRlZCA9IHRydWUKLQkJCX0gZWxzZSBp ZiAhY3JhbmdlIHsKLQkJCQkvLyBsYXN0IHdhcyBvbmxpbmUsIGJ1dCB3ZSdyZSBub3QgaW4gYSBy YW5nZTsgcHJpbnQgLQotCQkJCWNyYW5nZSA9IHRydWUKLQkJCQlzICs9ICItIgotCQkJfSBlbHNl IHsKLQkJCQkvLyBsYXN0IHdhcyBvbmxpbmUsIHdlJ3JlIGluIGEgcmFuZ2UsICBub3RoaW5nIGVs c2UgdG8gZG8KLQkJCX0KLQkJCWxhc3RPbmxpbmUgPSB0cnVlCi0JCX0gZWxzZSB7Ci0JCQlpZiBs YXN0T25saW5lIHsKLQkJCQkvLyBTd2l0Y2hpbmcgb25saW5lLT5vZmZsaW5lOyBkbyB3ZSBuZWVk IHRvIGVuZCBhIHJhbmdlPwotCQkJCWlmIGNyYW5nZSB7Ci0JCQkJCXMgKz0gZm10LlNwcmludGYo IiVkIiwgaS0xKQotCQkJCX0KLQkJCX0KLQkJCWxhc3RPbmxpbmUgPSBmYWxzZQotCQkJY3Jhbmdl ID0gZmFsc2UKLQkJfQotCX0KLQlpZiBsYXN0T25saW5lIHsKLQkJLy8gU3dpdGNoaW5nIG9ubGlu ZS0+b2ZmbGluZTsgZG8gd2UgbmVlZCB0byBlbmQgYSByYW5nZT8KLQkJaWYgY3JhbmdlIHsKLQkJ CXMgKz0gZm10LlNwcmludGYoIiVkIiwgaS0xKQotCQl9Ci0JfQotCi0JcmV0dXJuCi19Ci0KLS8v IGNvbnN0IGNoYXIgKmxpYnhsX3NjaGVkdWxlcl90b19zdHJpbmcobGlieGxfc2NoZWR1bGVyIHAp OwotZnVuYyAocyBTY2hlZHVsZXIpIFN0cmluZygpIChzdHJpbmcpIHsKLQljcyA6PSBDLmxpYnhs X3NjaGVkdWxlcl90b19zdHJpbmcoQy5saWJ4bF9zY2hlZHVsZXIocykpCi0JLy8gTm8gbmVlZCB0 byBmcmVlIGNvbnN0IHJldHVybiB2YWx1ZQotCi0JcmV0dXJuIEMuR29TdHJpbmcoY3MpCi19Ci0K LS8vIGludCBsaWJ4bF9zY2hlZHVsZXJfZnJvbV9zdHJpbmcoY29uc3QgY2hhciAqcywgbGlieGxf c2NoZWR1bGVyICplKTsKLWZ1bmMgKHMgKlNjaGVkdWxlcikgRnJvbVN0cmluZyhnc3RyIHN0cmlu ZykgKGVyciBlcnJvcikgewotCWNzdHIgOj0gQy5DU3RyaW5nKGdzdHIpCi0JZGVmZXIgQy5mcmVl KHVuc2FmZS5Qb2ludGVyKGNzdHIpKQotCi0JdmFyIGNzIEMubGlieGxfc2NoZWR1bGVyCi0JcmV0 IDo9IEMubGlieGxfc2NoZWR1bGVyX2Zyb21fc3RyaW5nKGNzdHIsICZjcykKLQlpZiByZXQgIT0g MCB7Ci0JCWVyciA9IGZtdC5FcnJvcmYoImxpYnhsX3NjaGVkdWxlcl9mcm9tX3N0cmluZzogJWRc biIsIHJldCkKLQkJcmV0dXJuCi0JfQotCi0JKnMgPSBTY2hlZHVsZXIoY3MpCi0JcmV0dXJuCi19 Ci0KLWZ1bmMgdHJhbnNsYXRlQ3B1cG9vbEluZm9DVG9HbyhjY2kgQy5saWJ4bF9jcHVwb29saW5m bykgKGdjaSBDcHVwb29sSW5mbykgewotCWdjaS5Qb29saWQgPSB1aW50MzIoY2NpLnBvb2xpZCkK LQlnY2kuUG9vbE5hbWUgPSBDLkdvU3RyaW5nKGNjaS5wb29sX25hbWUpCi0JZ2NpLlNjaGVkdWxl ciA9IFNjaGVkdWxlcihjY2kuc2NoZWQpCi0JZ2NpLkRvbWFpbkNvdW50ID0gaW50KGNjaS5uX2Rv bSkKLQlnY2kuQ3B1bWFwID0gYml0bWFwQ1RvR28oY2NpLmNwdW1hcCkKLQotCXJldHVybgotfQot Ci1mdW5jIFNjaGVkdWxlckZyb21TdHJpbmcobmFtZSBzdHJpbmcpIChzIFNjaGVkdWxlciwgZXJy IGVycm9yKSB7Ci0JY25hbWUgOj0gQy5DU3RyaW5nKG5hbWUpCi0JZGVmZXIgQy5mcmVlKHVuc2Fm ZS5Qb2ludGVyKGNuYW1lKSkKLQotCXZhciBjcyBDLmxpYnhsX3NjaGVkdWxlcgotCi0JcmV0IDo9 IEMubGlieGxfc2NoZWR1bGVyX2Zyb21fc3RyaW5nKGNuYW1lLCAmY3MpCi0JaWYgcmV0ICE9IDAg ewotCQllcnIgPSBmbXQuRXJyb3JmKCJsaWJ4bF9zY2hlZHVsZXJfZnJvbV9zdHJpbmcgZmFpbGVk OiAlZCIsIHJldCkKLQkJcmV0dXJuCi0JfQotCi0JcyA9IFNjaGVkdWxlcihjcykKLQotCXJldHVy bgotfQotCi0vLyBsaWJ4bF9jcHVwb29saW5mbyAqIGxpYnhsX2xpc3RfY3B1cG9vbChsaWJ4bF9j dHgqLCBpbnQgKm5iX3Bvb2xfb3V0KTsKLS8vIHZvaWQgbGlieGxfY3B1cG9vbGluZm9fbGlzdF9m cmVlKGxpYnhsX2NwdXBvb2xpbmZvICpsaXN0LCBpbnQgbmJfcG9vbCk7Ci1mdW5jIChDdHggKkNv bnRleHQpIExpc3RDcHVwb29sKCkgKGxpc3QgW11DcHVwb29sSW5mbykgewotCWVyciA6PSBDdHgu Q2hlY2tPcGVuKCkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuCi0JfQotCi0JdmFyIG5iUG9v bCBDLmludAotCi0JY19jcHVwb29sX2xpc3QgOj0gQy5saWJ4bF9saXN0X2NwdXBvb2woQ3R4LmN0 eCwgJm5iUG9vbCkKLQotCWRlZmVyIEMubGlieGxfY3B1cG9vbGluZm9fbGlzdF9mcmVlKGNfY3B1 cG9vbF9saXN0LCBuYlBvb2wpCi0KLQlpZiBpbnQobmJQb29sKSA9PSAwIHsKLQkJcmV0dXJuCi0J fQotCi0JLy8gTWFnaWMKLQljcHVwb29sTGlzdFNsaWNlIDo9ICgqWzEgPDwgMzBdQy5saWJ4bF9j cHVwb29saW5mbykodW5zYWZlLlBvaW50ZXIoY19jcHVwb29sX2xpc3QpKVs6bmJQb29sOm5iUG9v bF0KLQotCWZvciBpIDo9IHJhbmdlIGNwdXBvb2xMaXN0U2xpY2UgewotCQlpbmZvIDo9IHRyYW5z bGF0ZUNwdXBvb2xJbmZvQ1RvR28oY3B1cG9vbExpc3RTbGljZVtpXSkKLQkJCi0JCWxpc3QgPSBh cHBlbmQobGlzdCwgaW5mbykKLQl9Ci0KLQlyZXR1cm4KLX0KLQotLy8gaW50IGxpYnhsX2NwdXBv b2xfaW5mbyhsaWJ4bF9jdHggKmN0eCwgbGlieGxfY3B1cG9vbGluZm8gKmluZm8sIHVpbnQzMl90 IHBvb2xpZCk7Ci1mdW5jIChDdHggKkNvbnRleHQpIENwdXBvb2xJbmZvKFBvb2xpZCB1aW50MzIp IChwb29sIENwdXBvb2xJbmZvKSB7Ci0JZXJyIDo9IEN0eC5DaGVja09wZW4oKQotCWlmIGVyciAh PSBuaWwgewotCQlyZXR1cm4KLQl9Ci0KLQl2YXIgY19jcHVwb29sIEMubGlieGxfY3B1cG9vbGlu Zm8KLQkKLQlyZXQgOj0gQy5saWJ4bF9jcHVwb29sX2luZm8oQ3R4LmN0eCwgJmNfY3B1cG9vbCwg Qy51aW50MzJfdChQb29saWQpKQotCWlmIHJldCAhPSAwIHsKLQkJZXJyID0gZm10LkVycm9yZigi bGlieGxfY3B1cG9vbF9pbmZvIGZhaWxlZDogJWQiLCByZXQpCi0JCXJldHVybgotCX0KLQlkZWZl ciBDLmxpYnhsX2NwdXBvb2xpbmZvX2Rpc3Bvc2UoJmNfY3B1cG9vbCkKLQotCXBvb2wgPSB0cmFu c2xhdGVDcHVwb29sSW5mb0NUb0dvKGNfY3B1cG9vbCkKLQotCXJldHVybgotfQotCi0KLQotLy8g aW50IGxpYnhsX2NwdXBvb2xfY3JlYXRlKGxpYnhsX2N0eCAqY3R4LCBjb25zdCBjaGFyICpuYW1l LAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnhsX3NjaGVkdWxlciBzY2hlZCwKLS8v ICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJ4bF9iaXRtYXAgY3B1bWFwLCBsaWJ4bF91dWlk ICp1dWlkLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwb29saWQpOwot Ly8gRklYTUU6IHV1aWQKLS8vIEZJWE1FOiBTZXR0aW5nIHBvb2xpZAotZnVuYyAoQ3R4ICpDb250 ZXh0KSBDcHVwb29sQ3JlYXRlKE5hbWUgc3RyaW5nLCBTY2hlZHVsZXIgU2NoZWR1bGVyLCBDcHVt YXAgQml0bWFwKSAoZXJyIGVycm9yLCBQb29saWQgdWludDMyKSB7Ci0JZXJyID0gQ3R4LkNoZWNr T3BlbigpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCXJldHVybgotCX0KLQotCXBvb2xpZCA6PSBDLnVp bnQzMl90KDApCi0JbmFtZSA6PSBDLkNTdHJpbmcoTmFtZSkKLQlkZWZlciBDLmZyZWUodW5zYWZl LlBvaW50ZXIobmFtZSkpCi0JCi0JLy8gRm9yIG5vdywganVzdCBkbyB3aGF0IHhsIGRvZXMsIGFu ZCBtYWtlIGEgbmV3IHV1aWQgZXZlcnkgdGltZSB3ZSBjcmVhdGUgdGhlIHBvb2wKLQl2YXIgdXVp ZCBDLmxpYnhsX3V1aWQKLQlDLmxpYnhsX3V1aWRfZ2VuZXJhdGUoJnV1aWQpCi0KLQljYm0gOj0g Yml0bWFwR290b0MoQ3B1bWFwKQotCWRlZmVyIEMubGlieGxfYml0bWFwX2Rpc3Bvc2UoJmNibSkK LQkKLQlyZXQgOj0gQy5saWJ4bF9jcHVwb29sX2NyZWF0ZShDdHguY3R4LCBuYW1lLCBDLmxpYnhs X3NjaGVkdWxlcihTY2hlZHVsZXIpLAotCQljYm0sICZ1dWlkLCAmcG9vbGlkKQotCS8vIEZJWE1F OiBQcm9wZXIgZXJyb3IKLQlpZiByZXQgIT0gMCB7Ci0JCWVyciA9IGZtdC5FcnJvcmYoImxpYnhs X2NwdXBvb2xfY3JlYXRlIGZhaWxlZDogJWQiLCByZXQpCi0JCXJldHVybgotCX0KLQotCVBvb2xp ZCA9IHVpbnQzMihwb29saWQpCi0JCi0JcmV0dXJuCi19Ci0KLS8vIGludCBsaWJ4bF9jcHVwb29s X2Rlc3Ryb3kobGlieGxfY3R4ICpjdHgsIHVpbnQzMl90IHBvb2xpZCk7Ci1mdW5jIChDdHggKkNv bnRleHQpIENwdXBvb2xEZXN0cm95KFBvb2xpZCB1aW50MzIpIChlcnIgZXJyb3IpIHsKLQllcnIg PSBDdHguQ2hlY2tPcGVuKCkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuCi0JfQotCi0JcmV0 IDo9IEMubGlieGxfY3B1cG9vbF9kZXN0cm95KEN0eC5jdHgsIEMudWludDMyX3QoUG9vbGlkKSkK LQkvLyBGSVhNRTogUHJvcGVyIGVycm9yCi0JaWYgcmV0ICE9IDAgewotCQllcnIgPSBmbXQuRXJy b3JmKCJsaWJ4bF9jcHVwb29sX2Rlc3Ryb3kgZmFpbGVkOiAlZCIsIHJldCkKLQkJcmV0dXJuCi0J fQotCi0JcmV0dXJuCi19Ci0KLS8vIGludCBsaWJ4bF9jcHVwb29sX2NwdWFkZChsaWJ4bF9jdHgg KmN0eCwgdWludDMyX3QgcG9vbGlkLCBpbnQgY3B1KTsKLWZ1bmMgKEN0eCAqQ29udGV4dCkgQ3B1 cG9vbENwdWFkZChQb29saWQgdWludDMyLCBDcHUgaW50KSAoZXJyIGVycm9yKSB7Ci0JZXJyID0g Q3R4LkNoZWNrT3BlbigpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCXJldHVybgotCX0KLQotCXJldCA6 PSBDLmxpYnhsX2NwdXBvb2xfY3B1YWRkKEN0eC5jdHgsIEMudWludDMyX3QoUG9vbGlkKSwgQy5p bnQoQ3B1KSkKLQkvLyBGSVhNRTogUHJvcGVyIGVycm9yCi0JaWYgcmV0ICE9IDAgewotCQllcnIg PSBmbXQuRXJyb3JmKCJsaWJ4bF9jcHVwb29sX2NwdWFkZCBmYWlsZWQ6ICVkIiwgcmV0KQotCQly ZXR1cm4KLQl9Ci0KLQlyZXR1cm4KLX0KLQotLy8gaW50IGxpYnhsX2NwdXBvb2xfY3B1YWRkX2Nw dW1hcChsaWJ4bF9jdHggKmN0eCwgdWludDMyX3QgcG9vbGlkLAotLy8gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBjb25zdCBsaWJ4bF9iaXRtYXAgKmNwdW1hcCk7Ci1mdW5jIChDdHgg KkNvbnRleHQpIENwdXBvb2xDcHVhZGRDcHVtYXAoUG9vbGlkIHVpbnQzMiwgQ3B1bWFwIEJpdG1h cCkgKGVyciBlcnJvcikgewotCWVyciA9IEN0eC5DaGVja09wZW4oKQotCWlmIGVyciAhPSBuaWwg ewotCQlyZXR1cm4KLQl9Ci0KLQljYm0gOj0gYml0bWFwR290b0MoQ3B1bWFwKQotCWRlZmVyIEMu bGlieGxfYml0bWFwX2Rpc3Bvc2UoJmNibSkKLQkKLQlyZXQgOj0gQy5saWJ4bF9jcHVwb29sX2Nw dWFkZF9jcHVtYXAoQ3R4LmN0eCwgQy51aW50MzJfdChQb29saWQpLCAmY2JtKQotCS8vIEZJWE1F OiBQcm9wZXIgZXJyb3IKLQlpZiByZXQgIT0gMCB7Ci0JCWVyciA9IGZtdC5FcnJvcmYoImxpYnhs X2NwdXBvb2xfY3B1YWRkX2NwdW1hcCBmYWlsZWQ6ICVkIiwgcmV0KQotCQlyZXR1cm4KLQl9Ci0K LQlyZXR1cm4KLX0KLQotLy8gaW50IGxpYnhsX2NwdXBvb2xfY3B1cmVtb3ZlKGxpYnhsX2N0eCAq Y3R4LCB1aW50MzJfdCBwb29saWQsIGludCBjcHUpOwotZnVuYyAoQ3R4ICpDb250ZXh0KSBDcHVw b29sQ3B1cmVtb3ZlKFBvb2xpZCB1aW50MzIsIENwdSBpbnQpIChlcnIgZXJyb3IpIHsKLQllcnIg PSBDdHguQ2hlY2tPcGVuKCkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuCi0JfQotCi0JcmV0 IDo9IEMubGlieGxfY3B1cG9vbF9jcHVyZW1vdmUoQ3R4LmN0eCwgQy51aW50MzJfdChQb29saWQp LCBDLmludChDcHUpKQotCS8vIEZJWE1FOiBQcm9wZXIgZXJyb3IKLQlpZiByZXQgIT0gMCB7Ci0J CWVyciA9IGZtdC5FcnJvcmYoImxpYnhsX2NwdXBvb2xfY3B1cmVtb3ZlIGZhaWxlZDogJWQiLCBy ZXQpCi0JCXJldHVybgotCX0KLQotCXJldHVybgotfQotCi0vLyBpbnQgbGlieGxfY3B1cG9vbF9j cHVyZW1vdmVfY3B1bWFwKGxpYnhsX2N0eCAqY3R4LCB1aW50MzJfdCBwb29saWQsCi0vLyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpYnhsX2JpdG1hcCAqY3B1bWFw KTsKLWZ1bmMgKEN0eCAqQ29udGV4dCkgQ3B1cG9vbENwdXJlbW92ZUNwdW1hcChQb29saWQgdWlu dDMyLCBDcHVtYXAgQml0bWFwKSAoZXJyIGVycm9yKSB7Ci0JZXJyID0gQ3R4LkNoZWNrT3Blbigp Ci0JaWYgZXJyICE9IG5pbCB7Ci0JCXJldHVybgotCX0KLQotCWNibSA6PSBiaXRtYXBHb3RvQyhD cHVtYXApCi0JZGVmZXIgQy5saWJ4bF9iaXRtYXBfZGlzcG9zZSgmY2JtKQotCQotCXJldCA6PSBD LmxpYnhsX2NwdXBvb2xfY3B1cmVtb3ZlX2NwdW1hcChDdHguY3R4LCBDLnVpbnQzMl90KFBvb2xp ZCksICZjYm0pCi0JLy8gRklYTUU6IFByb3BlciBlcnJvcgotCWlmIHJldCAhPSAwIHsKLQkJZXJy ID0gZm10LkVycm9yZigibGlieGxfY3B1cG9vbF9jcHVyZW1vdmVfY3B1bWFwIGZhaWxlZDogJWQi LCByZXQpCi0JCXJldHVybgotCX0KLQotCXJldHVybgotfQotCi0vLyBpbnQgbGlieGxfY3B1cG9v bF9yZW5hbWUobGlieGxfY3R4ICpjdHgsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IHBvb2xp ZCk7Ci0vLyBpbnQgbGlieGxfY3B1cG9vbF9jcHVhZGRfbm9kZShsaWJ4bF9jdHggKmN0eCwgdWlu dDMyX3QgcG9vbGlkLCBpbnQgbm9kZSwgaW50ICpjcHVzKTsKLS8vIGludCBsaWJ4bF9jcHVwb29s X2NwdXJlbW92ZV9ub2RlKGxpYnhsX2N0eCAqY3R4LCB1aW50MzJfdCBwb29saWQsIGludCBub2Rl LCBpbnQgKmNwdXMpOwotLy8gaW50IGxpYnhsX2NwdXBvb2xfbW92ZWRvbWFpbihsaWJ4bF9jdHgg KmN0eCwgdWludDMyX3QgcG9vbGlkLCB1aW50MzJfdCBkb21pZCk7Ci0KLS8vCi0vLyBVdGlsaXR5 IGZ1bmN0aW9ucwotLy8KLWZ1bmMgKEN0eCAqQ29udGV4dCkgQ3B1cG9vbEZpbmRCeU5hbWUobmFt ZSBzdHJpbmcpIChpbmZvIENwdXBvb2xJbmZvLCBmb3VuZCBib29sKSB7Ci0JcGxpc3QgOj0gQ3R4 Lkxpc3RDcHVwb29sKCkKLQotCWZvciBpIDo9IHJhbmdlIHBsaXN0IHsKLQkJaWYgcGxpc3RbaV0u UG9vbE5hbWUgPT0gbmFtZSB7Ci0JCQlmb3VuZCA9IHRydWUKLQkJCWluZm8gPSBwbGlzdFtpXQot CQkJcmV0dXJuCi0JCX0KLQl9Ci0JcmV0dXJuCi19Ci0KLWZ1bmMgKEN0eCAqQ29udGV4dCkgQ3B1 cG9vbE1ha2VGcmVlKENwdW1hcCBCaXRtYXApIChlcnIgZXJyb3IpIHsKLQlwbGlzdCA6PSBDdHgu TGlzdENwdXBvb2woKQotCi0JZm9yIGkgOj0gcmFuZ2UgcGxpc3QgewotCQl2YXIgSW50ZXJzZWN0 aW9uIEJpdG1hcAotCQlJbnRlcnNlY3Rpb24gPSBDcHVtYXAuQW5kKHBsaXN0W2ldLkNwdW1hcCkK LQkJaWYgISBJbnRlcnNlY3Rpb24uSXNFbXB0eSgpIHsKLQkJCWVyciA9IEN0eC5DcHVwb29sQ3B1 cmVtb3ZlQ3B1bWFwKHBsaXN0W2ldLlBvb2xpZCwgSW50ZXJzZWN0aW9uKQotCQkJaWYgZXJyICE9 IG5pbCB7Ci0JCQkJcmV0dXJuCi0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuCi19Ci0KLWZ1bmMgWGxU ZXN0KEFyZ3MgW11zdHJpbmcpIHsKLQl2YXIgQ3B1bWFwIEJpdG1hcAotCi0JQ3B1bWFwLlNldCgy KQotCUNwdW1hcC5TZXRSYW5nZSg0LCA4KQotCUNwdW1hcC5TZXQoMTApCi0KLQlmbXQuUHJpbnRm KCJDcHVtYXA6ICV2XG4iLCBDcHVtYXApCi0KLQlDcHVtYXAuU2V0KDkpCi0KLQlmbXQuUHJpbnRm KCJDcHVtYXA6ICV2XG4iLCBDcHVtYXApCi0KLQl2YXIgQ3R4IENvbnRleHQKLQotCWVyciA6PSBD dHguT3BlbigpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCWZtdC5QcmludGYoIk9wZW5pbmcgY29udGV4 dDogJXZcbiIsIGVycikKLQkJcmV0dXJuCi0JfQotCi0JcG9vbCwgZm91bmQgOj0gQ3R4LkNwdXBv b2xGaW5kQnlOYW1lKCJzY2hlZGJlbmNoIikKLQotCWlmIGZvdW5kIHsKLQkJZm10LlByaW50Zigi Rm91bmQgc2NoZWRiZW5jaCwgZGVzdHJveWluZ1xuIikKLQotCQllcnIgPSBDdHguQ3B1cG9vbERl c3Ryb3kocG9vbC5Qb29saWQpCi0JCWlmIGVyciAhPSBuaWwgewotCQkJZm10LlByaW50ZigiQ291 bGRuJ3QgZGVzdHJveSBwb29sOiAldlxuIiwgZXJyKQotCQkJcmV0dXJuCi0JCX0KLQotCQlmbXQu UHJpbnRmKCJSZXR1cm5pbmcgY3B1cyB0byBwb29sIDAgZm9yIGZ1blxuIikKLQkJZXJyID0gQ3R4 LkNwdXBvb2xDcHVhZGRDcHVtYXAoMCwgcG9vbC5DcHVtYXApCi0JCWlmIGVyciAhPSBuaWwgewot CQkJZm10LlByaW50ZigiQ291bGRuJ3QgYWRkIGNwdXMgdG8gZG9tYWluIDA6ICV2XG4iLCBlcnIp Ci0JCQlyZXR1cm4KLQkJfQotCX0KLQotCUNwdW1hcCA9IEJpdG1hcHt9Ci0KLQlDcHVtYXAuU2V0 UmFuZ2UoMTIsIDE1KQotCi0JZm10LlByaW50ZigiRnJlZWluZyBjcHVzXG4iKQotCWVyciA9IEN0 eC5DcHVwb29sTWFrZUZyZWUoQ3B1bWFwKQotCWlmIGVyciAhPSBuaWwgewotCQlmbXQuUHJpbnRm KCJDb3VsZG4ndCBmcmVlIGNwdXM6ICV2XG4iLCBlcnIpCi0JCXJldHVybgotCX0KLQotCi0JZm10 LlByaW50ZigiQ3JlYXRpbmcgbmV3IHBvb2xcbiIpCi0KLQllcnIsIFBvb2xpZCA6PSBDdHguQ3B1 cG9vbENyZWF0ZSgic2NoZWRiZW5jaCIsIFNjaGVkdWxlckNyZWRpdCwgQ3B1bWFwKQotCWlmIGVy ciAhPSBuaWwgewotCQlmbXQuUHJpbnRmKCJFcnJvciBjcmVhdGluZyBjcHVwb29sOiAldlxuIiwg ZXJyKQotCX0gZWxzZSB7Ci0JCWZtdC5QcmludGYoIlBvb2wgaWQ6ICVkXG4iLCBQb29saWQpCi0J fQotCi0JcG9vbCA9IEN0eC5DcHVwb29sSW5mbygwKQotCWZtdC5QcmludGYoIkNwdXBvb2wgMCBp bmZvOiAldlxuIiwgcG9vbCkKLQkKLQlDdHguQ2xvc2UoKQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMv Z29sYW5nL3hlbmxpZ2h0L3hlbmxpZ2h0LmdvIGIvdG9vbHMvZ29sYW5nL3hlbmxpZ2h0L3hlbmxp Z2h0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZWI2ZjgKLS0tIC9k ZXYvbnVsbAorKysgYi90b29scy9nb2xhbmcveGVubGlnaHQveGVubGlnaHQuZ28KQEAgLTAsMCAr MSwxMDAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEdlb3JnZSBXLiBEdW5sYXAsIENp dHJpeCBTeXN0ZW1zIFVLIEx0ZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUg dGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQg YnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZQorICogTGlj ZW5zZSBvbmx5LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3 aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBo YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAq IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3 YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29y LCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KK3BhY2thZ2UgeGVubGlnaHQK KworLyoKKyNjZ28gTERGTEFHUzogLWx4ZW5saWdodCAtbHlhamwKKyNpbmNsdWRlIDxzdGRsaWIu aD4KKyNpbmNsdWRlIDxsaWJ4bC5oPgorKi8KK2ltcG9ydCAiQyIKKworLyoKKyAqIE90aGVyIGZs YWdzIHRoYXQgbWF5IGJlIG5lZWRlZCBhdCBzb21lIHBvaW50OgorICogIC1sbmwtcm91dGUtMyAt bG5sLTMKKyNjZ28gTERGTEFHUzogLWx4ZW5saWdodCAtbHlhamxfcyAtbHhlbmdudHRhYiAtbHhl bnN0b3JlIC1seGVuZ3Vlc3QgLWx4ZW50b29sbG9nIC1seGVuZXZ0Y2huIC1seGVuY3RybCAtbGJs a3RhcGN0bCAtbHhlbmZvcmVpZ25tZW1vcnkgLWx4ZW5jYWxsIC1seiAtbHV1aWQgLWx1dGlsCisg KgorICogVG8gZ2V0IGJhY2sgdG8gc2ltcGxlIGR5bmFtaWMgbGlua2luZzoKKyovCisKK2ltcG9y dCAoCisJImZtdCIKKwkidGltZSIKKwkidW5zYWZlIgorKQorCisvKgorICogRXJyb3JzCisgKi8K K2NvbnN0ICgKKwlFcnJvck5vbnNwZWNpZmljICAgICAgICAgICAgICAgICAgPSBpbnQoQy5FUlJP Ul9OT05TUEVDSUZJQykKKwlFcnJvclZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgPSBpbnQo Qy5FUlJPUl9WRVJTSU9OKQorCUVycm9yRmFpbCAgICAgICAgICAgICAgICAgICAgICAgICA9IGlu dChDLkVSUk9SX0ZBSUwpCisJRXJyb3JOaSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaW50 KEMuRVJST1JfTkkpCisJRXJyb3JOb21lbSAgICAgICAgICAgICAgICAgICAgICAgID0gaW50KEMu RVJST1JfTk9NRU0pCisJRXJyb3JJbnZhbCAgICAgICAgICAgICAgICAgICAgICAgID0gaW50KEMu RVJST1JfSU5WQUwpCisJRXJyb3JCYWRmYWlsICAgICAgICAgICAgICAgICAgICAgID0gaW50KEMu RVJST1JfQkFERkFJTCkKKwlFcnJvckd1ZXN0VGltZWRvdXQgICAgICAgICAgICAgICAgPSBpbnQo Qy5FUlJPUl9HVUVTVF9USU1FRE9VVCkKKwlFcnJvclRpbWVkb3V0ICAgICAgICAgICAgICAgICAg ICAgPSBpbnQoQy5FUlJPUl9USU1FRE9VVCkKKwlFcnJvck5vcGFyYXZpcnQgICAgICAgICAgICAg ICAgICAgPSBpbnQoQy5FUlJPUl9OT1BBUkFWSVJUKQorCUVycm9yTm90UmVhZHkgICAgICAgICAg ICAgICAgICAgICA9IGludChDLkVSUk9SX05PVF9SRUFEWSkKKwlFcnJvck9zZXZlbnRSZWdGYWls ICAgICAgICAgICAgICAgPSBpbnQoQy5FUlJPUl9PU0VWRU5UX1JFR19GQUlMKQorCUVycm9yQnVm ZmVyZnVsbCAgICAgICAgICAgICAgICAgICA9IGludChDLkVSUk9SX0JVRkZFUkZVTEwpCisJRXJy b3JVbmtub3duQ2hpbGQgICAgICAgICAgICAgICAgID0gaW50KEMuRVJST1JfVU5LTk9XTl9DSElM RCkKKwlFcnJvckxvY2tGYWlsICAgICAgICAgICAgICAgICAgICAgPSBpbnQoQy5FUlJPUl9MT0NL X0ZBSUwpCisJRXJyb3JKc29uQ29uZmlnRW1wdHkgICAgICAgICAgICAgID0gaW50KEMuRVJST1Jf SlNPTl9DT05GSUdfRU1QVFkpCisJRXJyb3JEZXZpY2VFeGlzdHMgICAgICAgICAgICAgICAgID0g aW50KEMuRVJST1JfREVWSUNFX0VYSVNUUykKKwlFcnJvckNoZWNrcG9pbnREZXZvcHNEb2VzTm90 TWF0Y2ggPSBpbnQoQy5FUlJPUl9DSEVDS1BPSU5UX0RFVk9QU19ET0VTX05PVF9NQVRDSCkKKwlF cnJvckNoZWNrcG9pbnREZXZpY2VOb3RTdXBwb3J0ZWQgPSBpbnQoQy5FUlJPUl9DSEVDS1BPSU5U X0RFVklDRV9OT1RfU1VQUE9SVEVEKQorCUVycm9yVm51bWFDb25maWdJbnZhbGlkICAgICAgICAg ICA9IGludChDLkVSUk9SX1ZOVU1BX0NPTkZJR19JTlZBTElEKQorCUVycm9yRG9tYWluTm90Zm91 bmQgICAgICAgICAgICAgICA9IGludChDLkVSUk9SX0RPTUFJTl9OT1RGT1VORCkKKwlFcnJvckFi b3J0ZWQgICAgICAgICAgICAgICAgICAgICAgPSBpbnQoQy5FUlJPUl9BQk9SVEVEKQorCUVycm9y Tm90Zm91bmQgICAgICAgICAgICAgICAgICAgICA9IGludChDLkVSUk9SX05PVEZPVU5EKQorCUVy cm9yRG9tYWluRGVzdHJveWVkICAgICAgICAgICAgICA9IGludChDLkVSUk9SX0RPTUFJTl9ERVNU Uk9ZRUQpCisJRXJyb3JGZWF0dXJlUmVtb3ZlZCAgICAgICAgICAgICAgID0gaW50KEMuRVJST1Jf RkVBVFVSRV9SRU1PVkVEKQorKQorCisvKgorICogVHlwZXM6IEJ1aWx0aW5zCisgKi8KKwordHlw ZSBEb21pZCB1aW50MzIKKwordHlwZSBNZW1LQiB1aW50NjQKKwordHlwZSBId2NhcCBzdHJ1Y3Qg eworCUh3Y2FwIFtdQy51aW50MzJfdAorfQorCisvLyB0eXBlZGVmIHN0cnVjdCB7CisvLyAgICAg dWludDMyX3Qgc2l6ZTsgICAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIGluIG1hcCAqLworLy8g ICAgIHVpbnQ4X3QgKm1hcDsKKy8vIH0gbGlieGxfYml0bWFwOworCisvLyBJbXBsZW1lbnQgdGhl IEdvIGJpdG1hcCB0eXBlIHN1Y2ggdGhhdCB0aGUgdW5kZXJseWluZyBkYXRhIGNhbgorLy8gZWFz aWx5IGJlIGNvcGllZCBpbiBhbmQgb3V0LiAgTkIgdGhhdCB3ZSBzdGlsbCBoYXZlIHRvIGRvIGNv cGllcworLy8gYm90aCBkaXJlY3Rpb25zLCBiZWNhdXNlIGNnbyBydW50aW1lIHJlc3RyaWN0aW9u cyBmb3JiaWQgcGFzc2luZyB0bworLy8gYSBDIGZ1bmN0aW9uIGEgcG9pbnRlciB0byBhIEdvLWFs bG9jYXRlZCBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgYQorLy8gcG9pbnRlci4KK3R5cGUgQml0 bWFwIHN0cnVjdCB7CisJYml0bWFwIFtdQy51aW50OF90Cit9CisKK3R5cGUgQ29udGV4dCBzdHJ1 Y3QgeworCWN0eCAqQy5saWJ4bF9jdHgKK30KKwordHlwZSBVdWlkIEMubGlieGxfdXVpZAorCisv KgorICogVHlwZXM6IElETAorICoKKyAqIEZJWE1FOiBHZW5lcmF0ZSB0aGVzZSBhdXRvbWF0aWNh bGx5IGZyb20gdGhlIElETAorICovCit0eXBlIERvbWluZm8gc3RydWN0IHsKKwlVdWlkICAgICAg IFV1aWQKKwlEb21pZCAgICAgIERvbWlkCisJUnVubmluZyAgICBib29sCisJQmxvY2tlZCAgICBi b29sCisJUGF1c2VkICAgICBib29sCisJU2h1dGRvd24gICBib29sCisJRHlpbmcgICAgICBib29s CisJTmV2ZXJfc3RvcCBib29sCisKKwlTaHV0ZG93bl9yZWFzb24gICBpbnQzMiAvLyBGSVhNRSBz aHV0ZG93bl9yZWFzb24gZW51bWVyYXRpb24KKwlPdXRzdGFuZGluZ19tZW1rYiBNZW1LQgorCUN1 cnJlbnRfbWVta2IgICAgIE1lbUtCCisJU2hhcmVkX21lbWtiICAgICAgTWVtS0IKKwlQYWdlZF9t ZW1rYiAgICAgICBNZW1LQgorCU1heF9tZW1rYiAgICAgICAgIE1lbUtCCisJQ3B1X3RpbWUgICAg ICAgICAgdGltZS5EdXJhdGlvbgorCVZjcHVfbWF4X2lkICAgICAgIHVpbnQzMgorCVZjcHVfb25s aW5lICAgICAgIHVpbnQzMgorCUNwdXBvb2wgICAgICAgICAgIHVpbnQzMgorCURvbWFpbl90eXBl ICAgICAgIGludDMyIC8vRklYTUUgbGlieGxfZG9tYWluX3R5cGUgZW51bWVyYXRpb24KKworfQor Cit0eXBlIFBoeXNpbmZvIHN0cnVjdCB7CisJVGhyZWFkc19wZXJfY29yZSB1aW50MzIKKwlDb3Jl c19wZXJfc29ja2V0IHVpbnQzMgorCisJTWF4X2NwdV9pZCB1aW50MzIKKwlOcl9jcHVzICAgIHVp bnQzMgorCUNwdV9raHogICAgdWludDMyCisKKwlUb3RhbF9wYWdlcyAgICAgICAgIHVpbnQ2NAor CUZyZWVfcGFnZXMgICAgICAgICAgdWludDY0CisJU2NydWJfcGFnZXMgICAgICAgICB1aW50NjQK KwlPdXRzdGFuZGluZ19wYWdlcyAgIHVpbnQ2NAorCVNoYXJpbmdfZnJlZWRfcGFnZXMgdWludDY0 CisJU2hhcmluZ191c2VkX2ZyYW1lcyB1aW50NjQKKworCU5yX25vZGVzIHVpbnQzMgorCUh3X2Nh cCAgIEh3Y2FwCisKKwlDYXBfaHZtICAgICAgICAgIGJvb2wKKwlDYXBfaHZtX2RpcmVjdGlvIGJv b2wKK30KKwordHlwZSBWZXJzaW9uSW5mbyBzdHJ1Y3QgeworCVhlbl92ZXJzaW9uX21ham9yIGlu dAorCVhlbl92ZXJzaW9uX21pbm9yIGludAorCVhlbl92ZXJzaW9uX2V4dHJhIHN0cmluZworCUNv bXBpbGVyICAgICAgICAgIHN0cmluZworCUNvbXBpbGVfYnkgICAgICAgIHN0cmluZworCUNvbXBp bGVfZG9tYWluICAgIHN0cmluZworCUNvbXBpbGVfZGF0ZSAgICAgIHN0cmluZworCUNhcGFiaWxp dGllcyAgICAgIHN0cmluZworCUNoYW5nZXNldCAgICAgICAgIHN0cmluZworCVZpcnRfc3RhcnQg ICAgICAgIHVpbnQ2NAorCVBhZ2VzaXplICAgICAgICAgIGludAorCUNvbW1hbmRsaW5lICAgICAg IHN0cmluZworCUJ1aWxkX2lkICAgICAgICAgIHN0cmluZworfQorCisvLyAjIENvbnNpc3RlbnQg d2l0aCB2YWx1ZXMgZGVmaW5lZCBpbiBkb21jdGwuaAorLy8gIyBFeGNlcHQgdW5rbm93biB3aGlj aCB3ZSBoYXZlIG1hZGUgdXAKKy8vIGxpYnhsX3NjaGVkdWxlciA9IEVudW1lcmF0aW9uKCJzY2hl ZHVsZXIiLCBbCisvLyAgICAgKDAsICJ1bmtub3duIiksCisvLyAgICAgKDQsICJzZWRmIiksCisv LyAgICAgKDUsICJjcmVkaXQiKSwKKy8vICAgICAoNiwgImNyZWRpdDIiKSwKKy8vICAgICAoNywg ImFyaW5jNjUzIiksCisvLyAgICAgKDgsICJydGRzIiksCisvLyAgICAgXSkKK3R5cGUgU2NoZWR1 bGVyIGludAorCit2YXIgKAorCVNjaGVkdWxlclVua25vd24gIFNjaGVkdWxlciA9IEMuTElCWExf U0NIRURVTEVSX1VOS05PV04KKwlTY2hlZHVsZXJTZWRmICAgICBTY2hlZHVsZXIgPSBDLkxJQlhM X1NDSEVEVUxFUl9TRURGCisJU2NoZWR1bGVyQ3JlZGl0ICAgU2NoZWR1bGVyID0gQy5MSUJYTF9T Q0hFRFVMRVJfQ1JFRElUCisJU2NoZWR1bGVyQ3JlZGl0MiAgU2NoZWR1bGVyID0gQy5MSUJYTF9T Q0hFRFVMRVJfQ1JFRElUMgorCVNjaGVkdWxlckFyaW5jNjUzIFNjaGVkdWxlciA9IEMuTElCWExf U0NIRURVTEVSX0FSSU5DNjUzCisJU2NoZWR1bGVyUlREUyAgICAgU2NoZWR1bGVyID0gQy5MSUJY TF9TQ0hFRFVMRVJfUlREUworKQorCisvLyBsaWJ4bF9jcHVwb29saW5mbyA9IFN0cnVjdCgiY3B1 cG9vbGluZm8iLCBbCisvLyAgICAgKCJwb29saWQiLCAgICAgIHVpbnQzMiksCisvLyAgICAgKCJw b29sX25hbWUiLCAgIHN0cmluZyksCisvLyAgICAgKCJzY2hlZCIsICAgICAgIGxpYnhsX3NjaGVk dWxlciksCisvLyAgICAgKCJuX2RvbSIsICAgICAgIHVpbnQzMiksCisvLyAgICAgKCJjcHVtYXAi LCAgICAgIGxpYnhsX2JpdG1hcCkKKy8vICAgICBdLCBkaXI9RElSX09VVCkKKwordHlwZSBDcHVw b29sSW5mbyBzdHJ1Y3QgeworCVBvb2xpZCAgICAgIHVpbnQzMgorCVBvb2xOYW1lICAgIHN0cmlu ZworCVNjaGVkdWxlciAgIFNjaGVkdWxlcgorCURvbWFpbkNvdW50IGludAorCUNwdW1hcCAgICAg IEJpdG1hcAorfQorCisvKgorICogQ29udGV4dAorICovCit2YXIgQ3R4IENvbnRleHQKKworZnVu YyAoQ3R4ICpDb250ZXh0KSBJc09wZW4oKSBib29sIHsKKwlyZXR1cm4gQ3R4LmN0eCAhPSBuaWwK K30KKworZnVuYyAoQ3R4ICpDb250ZXh0KSBPcGVuKCkgKGVyciBlcnJvcikgeworCWlmIEN0eC5j dHggIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCisJcmV0IDo9IEMubGlieGxfY3R4X2FsbG9jKHVu c2FmZS5Qb2ludGVyKCZDdHguY3R4KSwgQy5MSUJYTF9WRVJTSU9OLCAwLCBuaWwpCisKKwlpZiBy ZXQgIT0gMCB7CisJCS8vRklYTUU6IHByb3BlciBlcnJvcgorCQllcnIgPSBjcmVhdGVFcnJvcigi QWxsb2NhdGluZyBsaWJ4bCBjb250ZXh0OiAiLCByZXQpCisJfQorCXJldHVybgorfQorCitmdW5j IChDdHggKkNvbnRleHQpIENsb3NlKCkgKGVyciBlcnJvcikgeworCXJldCA6PSBDLmxpYnhsX2N0 eF9mcmVlKHVuc2FmZS5Qb2ludGVyKEN0eC5jdHgpKQorCUN0eC5jdHggPSBuaWwKKworCWlmIHJl dCAhPSAwIHsKKwkJLy9GSVhNRTogcHJvcGVyIGVycm9yCisJCWVyciA9IGNyZWF0ZUVycm9yKCJG cmVlaW5nIGxpYnhsIGNvbnRleHQ6ICIsIHJldCkKKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKEN0 eCAqQ29udGV4dCkgQ2hlY2tPcGVuKCkgKGVyciBlcnJvcikgeworCWlmIEN0eC5jdHggPT0gbmls IHsKKwkJZXJyID0gZm10LkVycm9yZigiQ29udGV4dCBub3Qgb3BlbmVkIikKKwl9CisJcmV0dXJu Cit9CisKK2Z1bmMgKEN0eCAqQ29udGV4dCkgRG9tYWluSW5mbyhJZCBEb21pZCkgKGRpICpEb21p bmZvLCBlcnIgZXJyb3IpIHsKKwllcnIgPSBDdHguQ2hlY2tPcGVuKCkKKwlpZiBlcnIgIT0gbmls IHsKKwkJcmV0dXJuCisJfQorCisJdmFyIGNkaSBDLmxpYnhsX2RvbWluZm8KKworCXJldCA6PSBD LmxpYnhsX2RvbWFpbl9pbmZvKEN0eC5jdHgsIHVuc2FmZS5Qb2ludGVyKCZjZGkpLCBDLnVpbnQz Ml90KElkKSkKKworCS8vIEZJWE1FOiBwcm9wZXIgZXJyb3IKKwlpZiByZXQgIT0gMCB7CisJCWVy ciA9IGNyZWF0ZUVycm9yKCJsaWJ4bF9kb21haW5faW5mbyBmYWlsZWQ6ICIsIHJldCkKKwkJcmV0 dXJuCisJfQorCisJLy8gV2UgY291bGQgY29uc2lkZXIgaGF2aW5nIHRoaXMgYm9pbGVycGxhdGUg Z2VuZXJhdGVkIGJ5IHRoZQorCS8vIGlkbCwgaW4gYSBmdW5jdGlvbiBsaWtlIHRoaXM6CisJLy8K KwkvLyBkaSA9IHRyYW5zbGF0ZUNkb21haW5pbmZvVG9Hb0RvbWFpbmluZm8oY2RpKQorCWRpID0g JkRvbWluZm97fQorCWRpLlV1aWQgPSBVdWlkKGNkaS51dWlkKQorCWRpLkRvbWlkID0gRG9taWQo Y2RpLmRvbWlkKQorCWRpLlJ1bm5pbmcgPSBib29sKGNkaS5ydW5uaW5nKQorCWRpLkJsb2NrZWQg PSBib29sKGNkaS5ibG9ja2VkKQorCWRpLlBhdXNlZCA9IGJvb2woY2RpLnBhdXNlZCkKKwlkaS5T aHV0ZG93biA9IGJvb2woY2RpLnNodXRkb3duKQorCWRpLkR5aW5nID0gYm9vbChjZGkuZHlpbmcp CisJZGkuTmV2ZXJfc3RvcCA9IGJvb2woY2RpLm5ldmVyX3N0b3ApCisJZGkuU2h1dGRvd25fcmVh c29uID0gaW50MzIoY2RpLnNodXRkb3duX3JlYXNvbikKKwlkaS5PdXRzdGFuZGluZ19tZW1rYiA9 IE1lbUtCKGNkaS5vdXRzdGFuZGluZ19tZW1rYikKKwlkaS5DdXJyZW50X21lbWtiID0gTWVtS0Io Y2RpLmN1cnJlbnRfbWVta2IpCisJZGkuU2hhcmVkX21lbWtiID0gTWVtS0IoY2RpLnNoYXJlZF9t ZW1rYikKKwlkaS5QYWdlZF9tZW1rYiA9IE1lbUtCKGNkaS5wYWdlZF9tZW1rYikKKwlkaS5NYXhf bWVta2IgPSBNZW1LQihjZGkubWF4X21lbWtiKQorCWRpLkNwdV90aW1lID0gdGltZS5EdXJhdGlv bihjZGkuY3B1X3RpbWUpCisJZGkuVmNwdV9tYXhfaWQgPSB1aW50MzIoY2RpLnZjcHVfbWF4X2lk KQorCWRpLlZjcHVfb25saW5lID0gdWludDMyKGNkaS52Y3B1X29ubGluZSkKKwlkaS5DcHVwb29s ID0gdWludDMyKGNkaS5jcHVwb29sKQorCWRpLkRvbWFpbl90eXBlID0gaW50MzIoY2RpLmRvbWFp bl90eXBlKQorCisJcmV0dXJuCit9CisKK2Z1bmMgKEN0eCAqQ29udGV4dCkgRG9tYWluVW5wYXVz ZShJZCBEb21pZCkgKGVyciBlcnJvcikgeworCWVyciA9IEN0eC5DaGVja09wZW4oKQorCWlmIGVy ciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisKKwlyZXQgOj0gQy5saWJ4bF9kb21haW5fdW5wYXVz ZShDdHguY3R4LCBDLnVpbnQzMl90KElkKSkKKworCWlmIHJldCAhPSAwIHsKKwkJLy9GSVhNRTog cHJvcGVyIGVycm9yCisJCWVyciA9IGNyZWF0ZUVycm9yKCJsaWJ4bF9kb21haW5fdW5wYXVzZSBm YWlsZWQ6ICIsIHJldCkKKwl9CisJcmV0dXJuCit9CisKKy8qCisgKiBCaXRtYXAgb3BlcmF0aW9u cworICovCisKKy8vIFJldHVybiBhIEdvIGJpdG1hcCB3aGljaCBpcyBhIGNvcHkgb2YgdGhlIHJl ZmVycmVkIEMgYml0bWFwLgorZnVuYyBiaXRtYXBDVG9HbyhjYm0gQy5saWJ4bF9iaXRtYXApIChn Ym0gQml0bWFwKSB7CisJLy8gQWxsb2MgYSBHbyBzbGljZSBmb3IgdGhlIGJ5dGVzCisJc2l6ZSA6 PSBpbnQoY2JtLnNpemUpCisJZ2JtLmJpdG1hcCA9IG1ha2UoW11DLnVpbnQ4X3QsIHNpemUpCisK KwkvLyBNYWtlIGEgc2xpY2UgcG9pbnRpbmcgdG8gdGhlIEMgYXJyYXkKKwltYXBzbGljZSA6PSAo KlsxIDw8IDMwXUMudWludDhfdCkodW5zYWZlLlBvaW50ZXIoY2JtLl9tYXApKVs6c2l6ZTpzaXpl XQorCisJLy8gQW5kIGNvcHkgdGhlIEMgYXJyYXkgaW50byB0aGUgR28gYXJyYXkKKwljb3B5KGdi bS5iaXRtYXAsIG1hcHNsaWNlKQorCisJcmV0dXJuCit9CisKKy8vIE11c3QgYmUgQy5saWJ4bF9i aXRtYXBfZGlzcG9zZSdkIG9mIGFmdGVyd2FyZHMKK2Z1bmMgYml0bWFwR290b0MoZ2JtIEJpdG1h cCkgKGNibSBDLmxpYnhsX2JpdG1hcCkgeworCUMubGlieGxfYml0bWFwX2luaXQoJmNibSkKKwor CXNpemUgOj0gbGVuKGdibS5iaXRtYXApCisJY2JtLl9tYXAgPSAoKkMudWludDhfdCkoQy5tYWxs b2MoQy5zaXplX3Qoc2l6ZSkpKQorCWNibS5zaXplID0gQy51aW50MzJfdChzaXplKQorCWlmIGNi bS5fbWFwID09IG5pbCB7CisJCXBhbmljKCJDLmNhbGxvYyBmYWlsZWQhIikKKwl9CisKKwkvLyBN YWtlIGEgc2xpY2UgcG9pbnRpbmcgdG8gdGhlIEMgYXJyYXkKKwltYXBzbGljZSA6PSAoKlsxIDw8 IDMwXUMudWludDhfdCkodW5zYWZlLlBvaW50ZXIoY2JtLl9tYXApKVs6c2l6ZTpzaXplXQorCisJ Ly8gQW5kIGNvcHkgdGhlIEdvIGFycmF5IGludG8gdGhlIEMgYXJyYXkKKwljb3B5KG1hcHNsaWNl LCBnYm0uYml0bWFwKQorCisJcmV0dXJuCit9CisKK2Z1bmMgKGJtICpCaXRtYXApIFRlc3QoYml0 IGludCkgYm9vbCB7CisJdWJpdCA6PSB1aW50KGJpdCkKKwlpZiBiaXQgPiBibS5NYXgoKSB8fCBi bS5iaXRtYXAgPT0gbmlsIHsKKwkJcmV0dXJuIGZhbHNlCisJfQorCisJcmV0dXJuIChibS5iaXRt YXBbYml0LzhdICYgKDEgPDwgKHViaXQgJiA3KSkpICE9IDAKK30KKworZnVuYyAoYm0gKkJpdG1h cCkgU2V0KGJpdCBpbnQpIHsKKwlpYml0IDo9IGJpdCAvIDgKKwlpZiBpYml0KzEgPiBsZW4oYm0u Yml0bWFwKSB7CisJCWJtLmJpdG1hcCA9IGFwcGVuZChibS5iaXRtYXAsIG1ha2UoW11DLnVpbnQ4 X3QsIGliaXQrMS1sZW4oYm0uYml0bWFwKSkuLi4pCisJfQorCisJYm0uYml0bWFwW2liaXRdIHw9 IDEgPDwgKHVpbnQoYml0KSAmIDcpCit9CisKK2Z1bmMgKGJtICpCaXRtYXApIFNldFJhbmdlKHN0 YXJ0IGludCwgZW5kIGludCkgeworCWZvciBpIDo9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrIHsKKwkJ Ym0uU2V0KGkpCisJfQorfQorCitmdW5jIChibSAqQml0bWFwKSBDbGVhcihiaXQgaW50KSB7CisJ dWJpdCA6PSB1aW50KGJpdCkKKwlpZiBiaXQgPiBibS5NYXgoKSB8fCBibS5iaXRtYXAgPT0gbmls IHsKKwkJcmV0dXJuCisJfQorCisJYm0uYml0bWFwW2JpdC84XSAmPSBeKDEgPDwgKHViaXQgJiA3 KSkKK30KKworZnVuYyAoYm0gKkJpdG1hcCkgQ2xlYXJSYW5nZShzdGFydCBpbnQsIGVuZCBpbnQp IHsKKwlmb3IgaSA6PSBzdGFydDsgaSA8PSBlbmQ7IGkrKyB7CisJCWJtLkNsZWFyKGkpCisJfQor fQorCitmdW5jIChibSAqQml0bWFwKSBNYXgoKSBpbnQgeworCXJldHVybiBsZW4oYm0uYml0bWFw KSo4IC0gMQorfQorCitmdW5jIChibSAqQml0bWFwKSBJc0VtcHR5KCkgYm9vbCB7CisJZm9yIGkg Oj0gMDsgaSA8IGxlbihibS5iaXRtYXApOyBpKysgeworCQlpZiBibS5iaXRtYXBbaV0gIT0gMCB7 CisJCQlyZXR1cm4gZmFsc2UKKwkJfQorCX0KKwlyZXR1cm4gdHJ1ZQorfQorCitmdW5jIChhIEJp dG1hcCkgQW5kKGIgQml0bWFwKSAoYyBCaXRtYXApIHsKKwl2YXIgbWF4LCBtaW4gaW50CisJaWYg bGVuKGEuYml0bWFwKSA+IGxlbihiLmJpdG1hcCkgeworCQltYXggPSBsZW4oYS5iaXRtYXApCisJ CW1pbiA9IGxlbihiLmJpdG1hcCkKKwl9IGVsc2UgeworCQltYXggPSBsZW4oYi5iaXRtYXApCisJ CW1pbiA9IGxlbihhLmJpdG1hcCkKKwl9CisJYy5iaXRtYXAgPSBtYWtlKFtdQy51aW50OF90LCBt YXgpCisKKwlmb3IgaSA6PSAwOyBpIDwgbWluOyBpKysgeworCQljLmJpdG1hcFtpXSA9IGEuYml0 bWFwW2ldICYgYi5iaXRtYXBbaV0KKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKGJtIEJpdG1hcCkg U3RyaW5nKCkgKHMgc3RyaW5nKSB7CisJbGFzdE9ubGluZSA6PSBmYWxzZQorCWNyYW5nZSA6PSBm YWxzZQorCXByaW50ZWQgOj0gZmFsc2UKKwl2YXIgaSBpbnQKKwkvLy8gLS14LXh4eHh4LXggLT4g Miw0LTgsMTAKKwkvLy8gLS14LXh4eHh4eHggLT4gMiw0LTEwCisJZm9yIGkgPSAwOyBpIDw9IGJt Lk1heCgpOyBpKysgeworCQlpZiBibS5UZXN0KGkpIHsKKwkJCWlmICFsYXN0T25saW5lIHsKKwkJ CQkvLyBTd2l0Y2hpbmcgb2ZmbGluZSAtPiBvbmxpbmUsIHByaW50IHRoaXMgY3B1CisJCQkJaWYg cHJpbnRlZCB7CisJCQkJCXMgKz0gIiwiCisJCQkJfQorCQkJCXMgKz0gZm10LlNwcmludGYoIiVk IiwgaSkKKwkJCQlwcmludGVkID0gdHJ1ZQorCQkJfSBlbHNlIGlmICFjcmFuZ2UgeworCQkJCS8v IGxhc3Qgd2FzIG9ubGluZSwgYnV0IHdlJ3JlIG5vdCBpbiBhIHJhbmdlOyBwcmludCAtCisJCQkJ Y3JhbmdlID0gdHJ1ZQorCQkJCXMgKz0gIi0iCisJCQl9IGVsc2UgeworCQkJCS8vIGxhc3Qgd2Fz IG9ubGluZSwgd2UncmUgaW4gYSByYW5nZSwgIG5vdGhpbmcgZWxzZSB0byBkbworCQkJfQorCQkJ bGFzdE9ubGluZSA9IHRydWUKKwkJfSBlbHNlIHsKKwkJCWlmIGxhc3RPbmxpbmUgeworCQkJCS8v IFN3aXRjaGluZyBvbmxpbmUtPm9mZmxpbmU7IGRvIHdlIG5lZWQgdG8gZW5kIGEgcmFuZ2U/CisJ CQkJaWYgY3JhbmdlIHsKKwkJCQkJcyArPSBmbXQuU3ByaW50ZigiJWQiLCBpLTEpCisJCQkJfQor CQkJfQorCQkJbGFzdE9ubGluZSA9IGZhbHNlCisJCQljcmFuZ2UgPSBmYWxzZQorCQl9CisJfQor CWlmIGxhc3RPbmxpbmUgeworCQkvLyBTd2l0Y2hpbmcgb25saW5lLT5vZmZsaW5lOyBkbyB3ZSBu ZWVkIHRvIGVuZCBhIHJhbmdlPworCQlpZiBjcmFuZ2UgeworCQkJcyArPSBmbXQuU3ByaW50Zigi JWQiLCBpLTEpCisJCX0KKwl9CisKKwlyZXR1cm4KK30KKworLy8gY29uc3QgY2hhciAqbGlieGxf c2NoZWR1bGVyX3RvX3N0cmluZyhsaWJ4bF9zY2hlZHVsZXIgcCk7CitmdW5jIChzIFNjaGVkdWxl cikgU3RyaW5nKCkgc3RyaW5nIHsKKwljcyA6PSBDLmxpYnhsX3NjaGVkdWxlcl90b19zdHJpbmco Qy5saWJ4bF9zY2hlZHVsZXIocykpCisJLy8gTm8gbmVlZCB0byBmcmVlIGNvbnN0IHJldHVybiB2 YWx1ZQorCisJcmV0dXJuIEMuR29TdHJpbmcoY3MpCit9CisKKy8vIGludCBsaWJ4bF9zY2hlZHVs ZXJfZnJvbV9zdHJpbmcoY29uc3QgY2hhciAqcywgbGlieGxfc2NoZWR1bGVyICplKTsKK2Z1bmMg KHMgKlNjaGVkdWxlcikgRnJvbVN0cmluZyhnc3RyIHN0cmluZykgKGVyciBlcnJvcikgeworCWNz dHIgOj0gQy5DU3RyaW5nKGdzdHIpCisJZGVmZXIgQy5mcmVlKHVuc2FmZS5Qb2ludGVyKGNzdHIp KQorCisJdmFyIGNzIEMubGlieGxfc2NoZWR1bGVyCisJcmV0IDo9IEMubGlieGxfc2NoZWR1bGVy X2Zyb21fc3RyaW5nKGNzdHIsICZjcykKKwlpZiByZXQgIT0gMCB7CisJCS8vRklYTUU6IHByb3Bl ciBlcnJvcgorCQllcnIgPSBjcmVhdGVFcnJvcigibGlieGxfc2NoZWR1bGVyX2Zyb21fc3RyaW5n OiAiLCByZXQpCisJCXJldHVybgorCX0KKworCSpzID0gU2NoZWR1bGVyKGNzKQorCXJldHVybgor fQorCitmdW5jIHRyYW5zbGF0ZUNwdXBvb2xJbmZvQ1RvR28oY2NpIEMubGlieGxfY3B1cG9vbGlu Zm8pIChnY2kgQ3B1cG9vbEluZm8pIHsKKwlnY2kuUG9vbGlkID0gdWludDMyKGNjaS5wb29saWQp CisJZ2NpLlBvb2xOYW1lID0gQy5Hb1N0cmluZyhjY2kucG9vbF9uYW1lKQorCWdjaS5TY2hlZHVs ZXIgPSBTY2hlZHVsZXIoY2NpLnNjaGVkKQorCWdjaS5Eb21haW5Db3VudCA9IGludChjY2kubl9k b20pCisJZ2NpLkNwdW1hcCA9IGJpdG1hcENUb0dvKGNjaS5jcHVtYXApCisKKwlyZXR1cm4KK30K KworZnVuYyBTY2hlZHVsZXJGcm9tU3RyaW5nKG5hbWUgc3RyaW5nKSAocyBTY2hlZHVsZXIsIGVy ciBlcnJvcikgeworCWNuYW1lIDo9IEMuQ1N0cmluZyhuYW1lKQorCWRlZmVyIEMuZnJlZSh1bnNh ZmUuUG9pbnRlcihjbmFtZSkpCisKKwl2YXIgY3MgQy5saWJ4bF9zY2hlZHVsZXIKKworCXJldCA6 PSBDLmxpYnhsX3NjaGVkdWxlcl9mcm9tX3N0cmluZyhjbmFtZSwgJmNzKQorCWlmIHJldCAhPSAw IHsKKwkJLy9GSVhNRTogcHJvcGVyIGVycm9yCisJCWVyciA9IGNyZWF0ZUVycm9yKCJsaWJ4bF9z Y2hlZHVsZXJfZnJvbV9zdHJpbmcgZmFpbGVkOiAiLCByZXQpCisJCXJldHVybgorCX0KKworCXMg PSBTY2hlZHVsZXIoY3MpCisKKwlyZXR1cm4KK30KKworLy8gbGlieGxfY3B1cG9vbGluZm8gKiBs aWJ4bF9saXN0X2NwdXBvb2wobGlieGxfY3R4KiwgaW50ICpuYl9wb29sX291dCk7CisvLyB2b2lk IGxpYnhsX2NwdXBvb2xpbmZvX2xpc3RfZnJlZShsaWJ4bF9jcHVwb29saW5mbyAqbGlzdCwgaW50 IG5iX3Bvb2wpOworZnVuYyAoQ3R4ICpDb250ZXh0KSBMaXN0Q3B1cG9vbCgpIChsaXN0IFtdQ3B1 cG9vbEluZm8pIHsKKwllcnIgOj0gQ3R4LkNoZWNrT3BlbigpCisJaWYgZXJyICE9IG5pbCB7CisJ CXJldHVybgorCX0KKworCXZhciBuYlBvb2wgQy5pbnQKKworCWNfY3B1cG9vbF9saXN0IDo9IEMu bGlieGxfbGlzdF9jcHVwb29sKEN0eC5jdHgsICZuYlBvb2wpCisKKwlkZWZlciBDLmxpYnhsX2Nw dXBvb2xpbmZvX2xpc3RfZnJlZShjX2NwdXBvb2xfbGlzdCwgbmJQb29sKQorCisJaWYgaW50KG5i UG9vbCkgPT0gMCB7CisJCXJldHVybgorCX0KKworCS8vIE1hZ2ljCisJY3B1cG9vbExpc3RTbGlj ZSA6PSAoKlsxIDw8IDMwXUMubGlieGxfY3B1cG9vbGluZm8pKHVuc2FmZS5Qb2ludGVyKGNfY3B1 cG9vbF9saXN0KSlbOm5iUG9vbDpuYlBvb2xdCisKKwlmb3IgaSA6PSByYW5nZSBjcHVwb29sTGlz dFNsaWNlIHsKKwkJaW5mbyA6PSB0cmFuc2xhdGVDcHVwb29sSW5mb0NUb0dvKGNwdXBvb2xMaXN0 U2xpY2VbaV0pCisKKwkJbGlzdCA9IGFwcGVuZChsaXN0LCBpbmZvKQorCX0KKworCXJldHVybgor fQorCisvLyBpbnQgbGlieGxfY3B1cG9vbF9pbmZvKGxpYnhsX2N0eCAqY3R4LCBsaWJ4bF9jcHVw b29saW5mbyAqaW5mbywgdWludDMyX3QgcG9vbGlkKTsKK2Z1bmMgKEN0eCAqQ29udGV4dCkgQ3B1 cG9vbEluZm8oUG9vbGlkIHVpbnQzMikgKHBvb2wgQ3B1cG9vbEluZm8pIHsKKwllcnIgOj0gQ3R4 LkNoZWNrT3BlbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCXZhciBjX2Nw dXBvb2wgQy5saWJ4bF9jcHVwb29saW5mbworCisJcmV0IDo9IEMubGlieGxfY3B1cG9vbF9pbmZv KEN0eC5jdHgsICZjX2NwdXBvb2wsIEMudWludDMyX3QoUG9vbGlkKSkKKwkvL0ZJWE1FOiBwcm9w ZXIgZXJyb3IKKwlpZiByZXQgIT0gMCB7CisJCWVyciA9IGNyZWF0ZUVycm9yKCJsaWJ4bF9jcHVw b29sX2luZm8gZmFpbGVkOiAiLCByZXQpCisJCXJldHVybgorCX0KKwlkZWZlciBDLmxpYnhsX2Nw dXBvb2xpbmZvX2Rpc3Bvc2UoJmNfY3B1cG9vbCkKKworCXBvb2wgPSB0cmFuc2xhdGVDcHVwb29s SW5mb0NUb0dvKGNfY3B1cG9vbCkKKworCXJldHVybgorfQorCisvLyBpbnQgbGlieGxfY3B1cG9v bF9jcmVhdGUobGlieGxfY3R4ICpjdHgsIGNvbnN0IGNoYXIgKm5hbWUsCisvLyAgICAgICAgICAg ICAgICAgICAgICAgICAgbGlieGxfc2NoZWR1bGVyIHNjaGVkLAorLy8gICAgICAgICAgICAgICAg ICAgICAgICAgIGxpYnhsX2JpdG1hcCBjcHVtYXAsIGxpYnhsX3V1aWQgKnV1aWQsCisvLyAgICAg ICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBvb2xpZCk7CisvLyBGSVhNRTogdXVpZAor Ly8gRklYTUU6IFNldHRpbmcgcG9vbGlkCitmdW5jIChDdHggKkNvbnRleHQpIENwdXBvb2xDcmVh dGUoTmFtZSBzdHJpbmcsIFNjaGVkdWxlciBTY2hlZHVsZXIsIENwdW1hcCBCaXRtYXApIChlcnIg ZXJyb3IsIFBvb2xpZCB1aW50MzIpIHsKKwllcnIgPSBDdHguQ2hlY2tPcGVuKCkKKwlpZiBlcnIg IT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCisJcG9vbGlkIDo9IEMudWludDMyX3QoMCkKKwluYW1l IDo9IEMuQ1N0cmluZyhOYW1lKQorCWRlZmVyIEMuZnJlZSh1bnNhZmUuUG9pbnRlcihuYW1lKSkK KworCS8vIEZvciBub3csIGp1c3QgZG8gd2hhdCB4bCBkb2VzLCBhbmQgbWFrZSBhIG5ldyB1dWlk IGV2ZXJ5IHRpbWUgd2UgY3JlYXRlIHRoZSBwb29sCisJdmFyIHV1aWQgQy5saWJ4bF91dWlkCisJ Qy5saWJ4bF91dWlkX2dlbmVyYXRlKCZ1dWlkKQorCisJY2JtIDo9IGJpdG1hcEdvdG9DKENwdW1h cCkKKwlkZWZlciBDLmxpYnhsX2JpdG1hcF9kaXNwb3NlKCZjYm0pCisKKwlyZXQgOj0gQy5saWJ4 bF9jcHVwb29sX2NyZWF0ZShDdHguY3R4LCBuYW1lLCBDLmxpYnhsX3NjaGVkdWxlcihTY2hlZHVs ZXIpLAorCQljYm0sICZ1dWlkLCAmcG9vbGlkKQorCS8vIEZJWE1FOiBQcm9wZXIgZXJyb3IKKwlp ZiByZXQgIT0gMCB7CisJCWVyciA9IGNyZWF0ZUVycm9yKCJsaWJ4bF9jcHVwb29sX2NyZWF0ZSBm YWlsZWQ6ICIsIHJldCkKKwkJcmV0dXJuCisJfQorCisJUG9vbGlkID0gdWludDMyKHBvb2xpZCkK KworCXJldHVybgorfQorCisvLyBpbnQgbGlieGxfY3B1cG9vbF9kZXN0cm95KGxpYnhsX2N0eCAq Y3R4LCB1aW50MzJfdCBwb29saWQpOworZnVuYyAoQ3R4ICpDb250ZXh0KSBDcHVwb29sRGVzdHJv eShQb29saWQgdWludDMyKSAoZXJyIGVycm9yKSB7CisJZXJyID0gQ3R4LkNoZWNrT3BlbigpCisJ aWYgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCXJldCA6PSBDLmxpYnhsX2NwdXBvb2xf ZGVzdHJveShDdHguY3R4LCBDLnVpbnQzMl90KFBvb2xpZCkpCisJLy8gRklYTUU6IFByb3BlciBl cnJvcgorCWlmIHJldCAhPSAwIHsKKwkJZXJyID0gY3JlYXRlRXJyb3IoImxpYnhsX2NwdXBvb2xf ZGVzdHJveSBmYWlsZWQ6ICIsIHJldCkKKwkJcmV0dXJuCisJfQorCisJcmV0dXJuCit9CisKKy8v IGludCBsaWJ4bF9jcHVwb29sX2NwdWFkZChsaWJ4bF9jdHggKmN0eCwgdWludDMyX3QgcG9vbGlk LCBpbnQgY3B1KTsKK2Z1bmMgKEN0eCAqQ29udGV4dCkgQ3B1cG9vbENwdWFkZChQb29saWQgdWlu dDMyLCBDcHUgaW50KSAoZXJyIGVycm9yKSB7CisJZXJyID0gQ3R4LkNoZWNrT3BlbigpCisJaWYg ZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCXJldCA6PSBDLmxpYnhsX2NwdXBvb2xfY3B1 YWRkKEN0eC5jdHgsIEMudWludDMyX3QoUG9vbGlkKSwgQy5pbnQoQ3B1KSkKKwkvLyBGSVhNRTog UHJvcGVyIGVycm9yCisJaWYgcmV0ICE9IDAgeworCQllcnIgPSBjcmVhdGVFcnJvcigibGlieGxf Y3B1cG9vbF9jcHVhZGQgZmFpbGVkOiAiLCByZXQpCisJCXJldHVybgorCX0KKworCXJldHVybgor fQorCisvLyBpbnQgbGlieGxfY3B1cG9vbF9jcHVhZGRfY3B1bWFwKGxpYnhsX2N0eCAqY3R4LCB1 aW50MzJfdCBwb29saWQsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0 IGxpYnhsX2JpdG1hcCAqY3B1bWFwKTsKK2Z1bmMgKEN0eCAqQ29udGV4dCkgQ3B1cG9vbENwdWFk ZENwdW1hcChQb29saWQgdWludDMyLCBDcHVtYXAgQml0bWFwKSAoZXJyIGVycm9yKSB7CisJZXJy ID0gQ3R4LkNoZWNrT3BlbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCWNi bSA6PSBiaXRtYXBHb3RvQyhDcHVtYXApCisJZGVmZXIgQy5saWJ4bF9iaXRtYXBfZGlzcG9zZSgm Y2JtKQorCisJcmV0IDo9IEMubGlieGxfY3B1cG9vbF9jcHVhZGRfY3B1bWFwKEN0eC5jdHgsIEMu dWludDMyX3QoUG9vbGlkKSwgJmNibSkKKwkvLyBGSVhNRTogUHJvcGVyIGVycm9yCisJaWYgcmV0 ICE9IDAgeworCQllcnIgPSBjcmVhdGVFcnJvcigibGlieGxfY3B1cG9vbF9jcHVhZGRfY3B1bWFw IGZhaWxlZDogIiwgcmV0KQorCQlyZXR1cm4KKwl9CisKKwlyZXR1cm4KK30KKworLy8gaW50IGxp YnhsX2NwdXBvb2xfY3B1cmVtb3ZlKGxpYnhsX2N0eCAqY3R4LCB1aW50MzJfdCBwb29saWQsIGlu dCBjcHUpOworZnVuYyAoQ3R4ICpDb250ZXh0KSBDcHVwb29sQ3B1cmVtb3ZlKFBvb2xpZCB1aW50 MzIsIENwdSBpbnQpIChlcnIgZXJyb3IpIHsKKwllcnIgPSBDdHguQ2hlY2tPcGVuKCkKKwlpZiBl cnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCisJcmV0IDo9IEMubGlieGxfY3B1cG9vbF9jcHVy ZW1vdmUoQ3R4LmN0eCwgQy51aW50MzJfdChQb29saWQpLCBDLmludChDcHUpKQorCS8vIEZJWE1F OiBQcm9wZXIgZXJyb3IKKwlpZiByZXQgIT0gMCB7CisJCWVyciA9IGNyZWF0ZUVycm9yKCJsaWJ4 bF9jcHVwb29sX2NwdXJlbW92ZSBmYWlsZWQ6ICIsIHJldCkKKwkJcmV0dXJuCisJfQorCisJcmV0 dXJuCit9CisKKy8vIGludCBsaWJ4bF9jcHVwb29sX2NwdXJlbW92ZV9jcHVtYXAobGlieGxfY3R4 ICpjdHgsIHVpbnQzMl90IHBvb2xpZCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgY29uc3QgbGlieGxfYml0bWFwICpjcHVtYXApOworZnVuYyAoQ3R4ICpDb250ZXh0KSBD cHVwb29sQ3B1cmVtb3ZlQ3B1bWFwKFBvb2xpZCB1aW50MzIsIENwdW1hcCBCaXRtYXApIChlcnIg ZXJyb3IpIHsKKwllcnIgPSBDdHguQ2hlY2tPcGVuKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0 dXJuCisJfQorCisJY2JtIDo9IGJpdG1hcEdvdG9DKENwdW1hcCkKKwlkZWZlciBDLmxpYnhsX2Jp dG1hcF9kaXNwb3NlKCZjYm0pCisKKwlyZXQgOj0gQy5saWJ4bF9jcHVwb29sX2NwdXJlbW92ZV9j cHVtYXAoQ3R4LmN0eCwgQy51aW50MzJfdChQb29saWQpLCAmY2JtKQorCS8vIEZJWE1FOiBQcm9w ZXIgZXJyb3IKKwlpZiByZXQgIT0gMCB7CisJCWVyciA9IGNyZWF0ZUVycm9yKCJsaWJ4bF9jcHVw b29sX2NwdXJlbW92ZV9jcHVtYXAgZmFpbGVkOiAiLCByZXQpCisJCXJldHVybgorCX0KKworCXJl dHVybgorfQorCisvLyBpbnQgbGlieGxfY3B1cG9vbF9yZW5hbWUobGlieGxfY3R4ICpjdHgsIGNv bnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IHBvb2xpZCk7CisvLyBpbnQgbGlieGxfY3B1cG9vbF9j cHVhZGRfbm9kZShsaWJ4bF9jdHggKmN0eCwgdWludDMyX3QgcG9vbGlkLCBpbnQgbm9kZSwgaW50 ICpjcHVzKTsKKy8vIGludCBsaWJ4bF9jcHVwb29sX2NwdXJlbW92ZV9ub2RlKGxpYnhsX2N0eCAq Y3R4LCB1aW50MzJfdCBwb29saWQsIGludCBub2RlLCBpbnQgKmNwdXMpOworLy8gaW50IGxpYnhs X2NwdXBvb2xfbW92ZWRvbWFpbihsaWJ4bF9jdHggKmN0eCwgdWludDMyX3QgcG9vbGlkLCB1aW50 MzJfdCBkb21pZCk7CisKKy8vCisvLyBVdGlsaXR5IGZ1bmN0aW9ucworLy8KK2Z1bmMgKEN0eCAq Q29udGV4dCkgQ3B1cG9vbEZpbmRCeU5hbWUobmFtZSBzdHJpbmcpIChpbmZvIENwdXBvb2xJbmZv LCBmb3VuZCBib29sKSB7CisJcGxpc3QgOj0gQ3R4Lkxpc3RDcHVwb29sKCkKKworCWZvciBpIDo9 IHJhbmdlIHBsaXN0IHsKKwkJaWYgcGxpc3RbaV0uUG9vbE5hbWUgPT0gbmFtZSB7CisJCQlmb3Vu ZCA9IHRydWUKKwkJCWluZm8gPSBwbGlzdFtpXQorCQkJcmV0dXJuCisJCX0KKwl9CisJcmV0dXJu Cit9CisKK2Z1bmMgKEN0eCAqQ29udGV4dCkgQ3B1cG9vbE1ha2VGcmVlKENwdW1hcCBCaXRtYXAp IChlcnIgZXJyb3IpIHsKKwlwbGlzdCA6PSBDdHguTGlzdENwdXBvb2woKQorCisJZm9yIGkgOj0g cmFuZ2UgcGxpc3QgeworCQl2YXIgSW50ZXJzZWN0aW9uIEJpdG1hcAorCQlJbnRlcnNlY3Rpb24g PSBDcHVtYXAuQW5kKHBsaXN0W2ldLkNwdW1hcCkKKwkJaWYgIUludGVyc2VjdGlvbi5Jc0VtcHR5 KCkgeworCQkJZXJyID0gQ3R4LkNwdXBvb2xDcHVyZW1vdmVDcHVtYXAocGxpc3RbaV0uUG9vbGlk LCBJbnRlcnNlY3Rpb24pCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4KKwkJCX0KKwkJ fQorCX0KKwlyZXR1cm4KK30KKworZnVuYyBYbFRlc3QoQXJncyBbXXN0cmluZykgeworCXZhciBD cHVtYXAgQml0bWFwCisKKwlDcHVtYXAuU2V0KDIpCisJQ3B1bWFwLlNldFJhbmdlKDQsIDgpCisJ Q3B1bWFwLlNldCgxMCkKKworCWZtdC5QcmludGYoIkNwdW1hcDogJXZcbiIsIENwdW1hcCkKKwor CUNwdW1hcC5TZXQoOSkKKworCWZtdC5QcmludGYoIkNwdW1hcDogJXZcbiIsIENwdW1hcCkKKwor CXZhciBDdHggQ29udGV4dAorCisJZXJyIDo9IEN0eC5PcGVuKCkKKwlpZiBlcnIgIT0gbmlsIHsK KwkJZm10LlByaW50ZigiT3BlbmluZyBjb250ZXh0OiAldlxuIiwgZXJyKQorCQlyZXR1cm4KKwl9 CisKKwlwb29sLCBmb3VuZCA6PSBDdHguQ3B1cG9vbEZpbmRCeU5hbWUoInNjaGVkYmVuY2giKQor CisJaWYgZm91bmQgeworCQlmbXQuUHJpbnRmKCJGb3VuZCBzY2hlZGJlbmNoLCBkZXN0cm95aW5n XG4iKQorCisJCWVyciA9IEN0eC5DcHVwb29sRGVzdHJveShwb29sLlBvb2xpZCkKKwkJaWYgZXJy ICE9IG5pbCB7CisJCQlmbXQuUHJpbnRmKCJDb3VsZG4ndCBkZXN0cm95IHBvb2w6ICV2XG4iLCBl cnIpCisJCQlyZXR1cm4KKwkJfQorCisJCWZtdC5QcmludGYoIlJldHVybmluZyBjcHVzIHRvIHBv b2wgMCBmb3IgZnVuXG4iKQorCQllcnIgPSBDdHguQ3B1cG9vbENwdWFkZENwdW1hcCgwLCBwb29s LkNwdW1hcCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlmbXQuUHJpbnRmKCJDb3VsZG4ndCBhZGQg Y3B1cyB0byBkb21haW4gMDogJXZcbiIsIGVycikKKwkJCXJldHVybgorCQl9CisJfQorCisJQ3B1 bWFwID0gQml0bWFwe30KKworCUNwdW1hcC5TZXRSYW5nZSgxMiwgMTUpCisKKwlmbXQuUHJpbnRm KCJGcmVlaW5nIGNwdXNcbiIpCisJZXJyID0gQ3R4LkNwdXBvb2xNYWtlRnJlZShDcHVtYXApCisJ aWYgZXJyICE9IG5pbCB7CisJCWZtdC5QcmludGYoIkNvdWxkbid0IGZyZWUgY3B1czogJXZcbiIs IGVycikKKwkJcmV0dXJuCisJfQorCisJZm10LlByaW50ZigiQ3JlYXRpbmcgbmV3IHBvb2xcbiIp CisKKwllcnIsIFBvb2xpZCA6PSBDdHguQ3B1cG9vbENyZWF0ZSgic2NoZWRiZW5jaCIsIFNjaGVk dWxlckNyZWRpdCwgQ3B1bWFwKQorCWlmIGVyciAhPSBuaWwgeworCQlmbXQuUHJpbnRmKCJFcnJv ciBjcmVhdGluZyBjcHVwb29sOiAldlxuIiwgZXJyKQorCX0gZWxzZSB7CisJCWZtdC5QcmludGYo IlBvb2wgaWQ6ICVkXG4iLCBQb29saWQpCisJfQorCisJcG9vbCA9IEN0eC5DcHVwb29sSW5mbygw KQorCWZtdC5QcmludGYoIkNwdXBvb2wgMCBpbmZvOiAldlxuIiwgcG9vbCkKKworCUN0eC5DbG9z ZSgpCit9CisKKy8vaW50IGxpYnhsX2dldF9tYXhfY3B1cyhsaWJ4bF9jdHggKmN0eCk7CitmdW5j IChDdHggKkNvbnRleHQpIEdldE1heENwdXMoKSAobWF4Q3B1cyBpbnQsIGVyciBlcnJvcikgewor CWVyciA9IEN0eC5DaGVja09wZW4oKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisK KwlyZXQgOj0gQy5saWJ4bF9nZXRfbWF4X2NwdXMoQ3R4LmN0eCkKKwkvL0ZJWE1FOiBwcm9wZXIg ZXJyb3IKKwlpZiByZXQgPCAwIHsKKwkJZXJyID0gY3JlYXRlRXJyb3IoImxpYnhsX2dldF9tYXhf Y3B1cyBmYWlsZWQ6ICIsIHJldCkKKwkJcmV0dXJuCisJfQorCW1heENwdXMgPSBpbnQocmV0KQor CXJldHVybgorfQorCisvL2ludCBsaWJ4bF9nZXRfb25saW5lX2NwdXMobGlieGxfY3R4ICpjdHgp OworZnVuYyAoQ3R4ICpDb250ZXh0KSBHZXRPbmxpbmVDcHVzKCkgKG9uQ3B1cyBpbnQsIGVyciBl cnJvcikgeworCWVyciA9IEN0eC5DaGVja09wZW4oKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1 cm4KKwl9CisKKwlyZXQgOj0gQy5saWJ4bF9nZXRfb25saW5lX2NwdXMoQ3R4LmN0eCkKKwkvL0ZJ WE1FOiBwcm9wZXIgZXJyb3IKKwlpZiByZXQgPCAwIHsKKwkJZXJyID0gY3JlYXRlRXJyb3IoImxp YnhsX2dldF9vbmxpbmVfY3B1cyBmYWlsZWQ6ICIsIHJldCkKKwkJcmV0dXJuCisJfQorCW9uQ3B1 cyA9IGludChyZXQpCisJcmV0dXJuCit9CisKKy8vaW50IGxpYnhsX2dldF9tYXhfbm9kZXMobGli eGxfY3R4ICpjdHgpOworZnVuYyAoQ3R4ICpDb250ZXh0KSBHZXRNYXhOb2RlcygpIChtYXhOb2Rl cyBpbnQsIGVyciBlcnJvcikgeworCWVyciA9IEN0eC5DaGVja09wZW4oKQorCWlmIGVyciAhPSBu aWwgeworCQlyZXR1cm4KKwl9CisJcmV0IDo9IEMubGlieGxfZ2V0X21heF9ub2RlcyhDdHguY3R4 KQorCS8vRklYTUU6IHByb3BlciBlcnJvcgorCWlmIHJldCA8IDAgeworCQllcnIgPSBjcmVhdGVF cnJvcigibGlieGxfZ2V0X21heF9ub2RlcyBmYWlsZWQ6ICIsIHJldCkKKwkJcmV0dXJuCisJfQor CW1heE5vZGVzID0gaW50KHJldCkKKwlyZXR1cm4KK30KKworLy9pbnQgbGlieGxfZ2V0X2ZyZWVf bWVtb3J5KGxpYnhsX2N0eCAqY3R4LCB1aW50NjRfdCAqbWVta2IpOworZnVuYyAoQ3R4ICpDb250 ZXh0KSBHZXRGcmVlTWVtb3J5KCkgKG1lbWtiIHVpbnQ2NCwgZXJyIGVycm9yKSB7CisJZXJyID0g Q3R4LkNoZWNrT3BlbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwl2YXIgY21l bSBDLnVpbnQ2NF90CisJcmV0IDo9IEMubGlieGxfZ2V0X2ZyZWVfbWVtb3J5KEN0eC5jdHgsICZj bWVtKQorCisJaWYgcmV0IDwgMCB7CisJCWVyciA9IGNyZWF0ZUVycm9yKCJsaWJ4bF9nZXRfZnJl ZV9tZW1vcnkgZmFpbGVkOiAiLCByZXQpCisJCXJldHVybgorCX0KKworCW1lbWtiID0gdWludDY0 KHJldCkKKwlyZXR1cm4KKworfQorCisvL2ludCBsaWJ4bF9nZXRfcGh5c2luZm8obGlieGxfY3R4 ICpjdHgsIGxpYnhsX3BoeXNpbmZvICpwaHlzaW5mbykKK2Z1bmMgKEN0eCAqQ29udGV4dCkgR2V0 UGh5c2luZm8oKSAocGh5c2luZm8gKlBoeXNpbmZvLCBlcnIgZXJyb3IpIHsKKwllcnIgPSBDdHgu Q2hlY2tPcGVuKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCXZhciBjcGh5cyBD LmxpYnhsX3BoeXNpbmZvCisKKwlyZXQgOj0gQy5saWJ4bF9nZXRfcGh5c2luZm8oQ3R4LmN0eCwg JmNwaHlzKQorCisJLy9GSVhNRTogcHJvcGVyIGVycm9yCisJaWYgcmV0IDwgMCB7CisJCWVyciA9 IGNyZWF0ZUVycm9yKCJsaWJ4bF9nZXRfcGh5c2luZm8gZmFpbGVkOiAiLCByZXQpCisJCXJldHVy bgorCX0KKwlwaHlzaW5mbyA9ICZQaHlzaW5mb3t9CisJcGh5c2luZm8uVGhyZWFkc19wZXJfY29y ZSA9IHVpbnQzMihjcGh5cy50aHJlYWRzX3Blcl9jb3JlKQorCXBoeXNpbmZvLkNvcmVzX3Blcl9z b2NrZXQgPSB1aW50MzIoY3BoeXMuY29yZXNfcGVyX3NvY2tldCkKKwlwaHlzaW5mby5NYXhfY3B1 X2lkID0gdWludDMyKGNwaHlzLm1heF9jcHVfaWQpCisJcGh5c2luZm8uTnJfY3B1cyA9IHVpbnQz MihjcGh5cy5ucl9jcHVzKQorCXBoeXNpbmZvLkNwdV9raHogPSB1aW50MzIoY3BoeXMuY3B1X2to eikKKwlwaHlzaW5mby5Ub3RhbF9wYWdlcyA9IHVpbnQ2NChjcGh5cy50b3RhbF9wYWdlcykKKwlw aHlzaW5mby5GcmVlX3BhZ2VzID0gdWludDY0KGNwaHlzLmZyZWVfcGFnZXMpCisJcGh5c2luZm8u U2NydWJfcGFnZXMgPSB1aW50NjQoY3BoeXMuc2NydWJfcGFnZXMpCisJcGh5c2luZm8uT3V0c3Rh bmRpbmdfcGFnZXMgPSB1aW50NjQoY3BoeXMuc2NydWJfcGFnZXMpCisJcGh5c2luZm8uU2hhcmlu Z19mcmVlZF9wYWdlcyA9IHVpbnQ2NChjcGh5cy5zaGFyaW5nX2ZyZWVkX3BhZ2VzKQorCXBoeXNp bmZvLlNoYXJpbmdfdXNlZF9mcmFtZXMgPSB1aW50NjQoY3BoeXMuc2hhcmluZ191c2VkX2ZyYW1l cykKKwlwaHlzaW5mby5Ocl9ub2RlcyA9IHVpbnQzMihjcGh5cy5ucl9ub2RlcykKKwlwaHlzaW5m by5Id19jYXAgPSBod2NhcENUb0dvKGNwaHlzLmh3X2NhcCkKKwlwaHlzaW5mby5DYXBfaHZtID0g Ym9vbChjcGh5cy5jYXBfaHZtKQorCXBoeXNpbmZvLkNhcF9odm1fZGlyZWN0aW8gPSBib29sKGNw aHlzLmNhcF9odm1fZGlyZWN0aW8pCisKKwlyZXR1cm4KK30KKworLy9jb25zdCBsaWJ4bF92ZXJz aW9uX2luZm8qIGxpYnhsX2dldF92ZXJzaW9uX2luZm8obGlieGxfY3R4ICpjdHgpOworZnVuYyAo Q3R4ICpDb250ZXh0KSBHZXRWZXJzaW9uSW5mbygpIChpbmZvICpWZXJzaW9uSW5mbywgZXJyIGVy cm9yKSB7CisJZXJyID0gQ3R4LkNoZWNrT3BlbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVy bgorCX0KKworCXZhciBjaW5mbyAqQy5saWJ4bF92ZXJzaW9uX2luZm8KKworCWNpbmZvID0gQy5s aWJ4bF9nZXRfdmVyc2lvbl9pbmZvKEN0eC5jdHgpCisKKwlpbmZvID0gJlZlcnNpb25JbmZve30K KwlpbmZvLlhlbl92ZXJzaW9uX21ham9yID0gaW50KGNpbmZvLnhlbl92ZXJzaW9uX21ham9yKQor CWluZm8uWGVuX3ZlcnNpb25fbWlub3IgPSBpbnQoY2luZm8ueGVuX3ZlcnNpb25fbWlub3IpCisJ aW5mby5YZW5fdmVyc2lvbl9leHRyYSA9IEMuR29TdHJpbmcoY2luZm8ueGVuX3ZlcnNpb25fZXh0 cmEpCisJaW5mby5Db21waWxlciA9IEMuR29TdHJpbmcoY2luZm8uY29tcGlsZXIpCisJaW5mby5D b21waWxlX2J5ID0gQy5Hb1N0cmluZyhjaW5mby5jb21waWxlX2J5KQorCWluZm8uQ29tcGlsZV9k b21haW4gPSBDLkdvU3RyaW5nKGNpbmZvLmNvbXBpbGVfZG9tYWluKQorCWluZm8uQ29tcGlsZV9k YXRlID0gQy5Hb1N0cmluZyhjaW5mby5jb21waWxlX2RhdGUpCisJaW5mby5DYXBhYmlsaXRpZXMg PSBDLkdvU3RyaW5nKGNpbmZvLmNhcGFiaWxpdGllcykKKwlpbmZvLkNoYW5nZXNldCA9IEMuR29T dHJpbmcoY2luZm8uY2hhbmdlc2V0KQorCWluZm8uVmlydF9zdGFydCA9IHVpbnQ2NChjaW5mby52 aXJ0X3N0YXJ0KQorCWluZm8uUGFnZXNpemUgPSBpbnQoY2luZm8ucGFnZXNpemUpCisKKwlyZXR1 cm4KK30KK2Z1bmMgaHdjYXBDVG9HbyhjaHdjYXAgQy5saWJ4bF9od2NhcCkgKGdod2NhcCBId2Nh cCkgeworCS8vIEFsbG9jIGEgR28gc2xpY2UgZm9yIHRoZSBieXRlcworCXNpemUgOj0gOAorCWdo d2NhcC5Id2NhcCA9IG1ha2UoW11DLnVpbnQzMl90LCBzaXplKQorCisJLy8gTWFrZSBhIHNsaWNl IHBvaW50aW5nIHRvIHRoZSBDIGFycmF5CisJbWFwc2xpY2UgOj0gKCpbMSA8PCAzMF1DLnVpbnQz Ml90KSh1bnNhZmUuUG9pbnRlcigmY2h3Y2FwWzBdKSlbOnNpemU6c2l6ZV0KKworCS8vIEFuZCBj b3B5IHRoZSBDIGFycmF5IGludG8gdGhlIEdvIGFycmF5CisJY29weShnaHdjYXAuSHdjYXAsIG1h cHNsaWNlKQorCisJcmV0dXJuCit9CisKK2Z1bmMgY3JlYXRlRXJyb3IobWV0aG9kIHN0cmluZywg Y2Vyck51bSBDLmludCkgKGVyciBlcnJvcikgeworCW1ldGhvZCArPSAiICVzIgorCWVyck51bSA6 PSBpbnQoY2Vyck51bSkKKwlzd2l0Y2ggZXJyTnVtIHsKKwljYXNlIEVycm9yTm9uc3BlY2lmaWM6 CisJCWVyciA9IGZtdC5FcnJvcmYobWV0aG9kLCAiRVJST1JfTk9OU1BFQ0lGSUMiKQorCWNhc2Ug RXJyb3JWZXJzaW9uOgorCQllcnIgPSBmbXQuRXJyb3JmKG1ldGhvZCwgIkVSUk9SX1ZFUlNJT04i KQorCWNhc2UgRXJyb3JGYWlsOgorCQllcnIgPSBmbXQuRXJyb3JmKG1ldGhvZCwgIkVSUk9SX0ZB SUwiKQorCWNhc2UgRXJyb3JOaToKKwkJZXJyID0gZm10LkVycm9yZihtZXRob2QsICJFUlJPUl9O SSIpCisJY2FzZSBFcnJvck5vbWVtOgorCQllcnIgPSBmbXQuRXJyb3JmKG1ldGhvZCwgIkVSUk9S X05PTUVNIikKKwljYXNlIEVycm9ySW52YWw6CisJCWVyciA9IGZtdC5FcnJvcmYobWV0aG9kLCAi RVJST1JfSU5WQUwiKQorCWNhc2UgRXJyb3JCYWRmYWlsOgorCQllcnIgPSBmbXQuRXJyb3JmKG1l dGhvZCwgIkVSUk9SX0JBREZBSUwiKQorCWNhc2UgRXJyb3JHdWVzdFRpbWVkb3V0OgorCQllcnIg PSBmbXQuRXJyb3JmKG1ldGhvZCwgIkVSUk9SX0dVRVNUX1RJTUVET1VUIikKKwljYXNlIEVycm9y Tm9wYXJhdmlydDoKKwkJZXJyID0gZm10LkVycm9yZihtZXRob2QsICJFUlJPUl9OT1BBUkFWSVJU IikKKwljYXNlIEVycm9yTm90UmVhZHk6CisJCWVyciA9IGZtdC5FcnJvcmYobWV0aG9kLCAiRVJS T1JfTk9UX1JFQURZIikKKwljYXNlIEVycm9yT3NldmVudFJlZ0ZhaWw6CisJCWVyciA9IGZtdC5F cnJvcmYobWV0aG9kLCAiRVJST1JfT1NFVkVOVF9SRUdfRkFJTCIpCisJY2FzZSBFcnJvckJ1ZmZl cmZ1bGw6CisJCWVyciA9IGZtdC5FcnJvcmYobWV0aG9kLCAiRVJST1JfQlVGRkVSRlVMTCIpCisJ Y2FzZSBFcnJvclVua25vd25DaGlsZDoKKwkJZXJyID0gZm10LkVycm9yZihtZXRob2QsICJFUlJP Ul9VTktOT1dOX0NISUxEIikKKwljYXNlIEVycm9yTG9ja0ZhaWw6CisJCWVyciA9IGZtdC5FcnJv cmYobWV0aG9kLCAiRVJST1JfTE9DS19GQUlMIikKKwljYXNlIEVycm9ySnNvbkNvbmZpZ0VtcHR5 OgorCQllcnIgPSBmbXQuRXJyb3JmKG1ldGhvZCwgIkVSUk9SX0pTT05fQ09ORklHX0VNUFRZIikK KwljYXNlIEVycm9yRGV2aWNlRXhpc3RzOgorCQllcnIgPSBmbXQuRXJyb3JmKG1ldGhvZCwgIkVS Uk9SX0RFVklDRV9FWElTVFMiKQorCWNhc2UgRXJyb3JDaGVja3BvaW50RGV2b3BzRG9lc05vdE1h dGNoOgorCQllcnIgPSBmbXQuRXJyb3JmKG1ldGhvZCwgIkVSUk9SX0NIRUNLUE9JTlRfREVWT1BT X0RPRVNfTk9UX01BVENIIikKKwljYXNlIEVycm9yQ2hlY2twb2ludERldmljZU5vdFN1cHBvcnRl ZDoKKwkJZXJyID0gZm10LkVycm9yZihtZXRob2QsICJFUlJPUl9DSEVDS1BPSU5UX0RFVklDRV9O T1RfU1VQUE9SVEVEIikKKwljYXNlIEVycm9yVm51bWFDb25maWdJbnZhbGlkOgorCQllcnIgPSBm bXQuRXJyb3JmKG1ldGhvZCwgIkVSUk9SX1ZOVU1BX0NPTkZJR19JTlZBTElEIikKKwljYXNlIEVy cm9yRG9tYWluTm90Zm91bmQ6CisJCWVyciA9IGZtdC5FcnJvcmYobWV0aG9kLCAiRVJST1JfRE9N QUlOX05PVEZPVU5EIikKKwljYXNlIEVycm9yQWJvcnRlZDoKKwkJZXJyID0gZm10LkVycm9yZiht ZXRob2QsICJFUlJPUl9BQk9SVEVEIikKKwljYXNlIEVycm9yTm90Zm91bmQ6CisJCWVyciA9IGZt dC5FcnJvcmYobWV0aG9kLCAiRVJST1JfTk9URk9VTkQiKQorCWNhc2UgRXJyb3JEb21haW5EZXN0 cm95ZWQ6CisJCWVyciA9IGZtdC5FcnJvcmYobWV0aG9kLCAiRVJST1JfRE9NQUlOX0RFU1RST1lF RCIpCisJY2FzZSBFcnJvckZlYXR1cmVSZW1vdmVkOgorCQllcnIgPSBmbXQuRXJyb3JmKG1ldGhv ZCwgIkVSUk9SX0ZFQVRVUkVfUkVNT1ZFRCIpCisJZGVmYXVsdDoKKwkJZXJyID0gZm10LkVycm9y ZihtZXRob2QsICJlcnJvciBub3QgZm91bmQiKQorCX0KKwlyZXR1cm4KKworfQotLSAKMi43LjQK CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpYZW4tZGV2 ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW4ub3JnCmh0dHBzOi8vbGlzdHMueGVu Lm9yZy94ZW4tZGV2ZWwK