From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1EkzvY-0000GI-5z for qemu-devel@nongnu.org; Sat, 10 Dec 2005 03:17:56 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1EkzvU-0000F7-N8 for qemu-devel@nongnu.org; Sat, 10 Dec 2005 03:17:55 -0500 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1EkzvP-0000EX-PN for qemu-devel@nongnu.org; Sat, 10 Dec 2005 03:17:48 -0500 Received: from [66.249.82.193] (helo=xproxy.gmail.com) by monty-python.gnu.org with esmtp (Exim 4.34) id 1Ekzwk-0006Au-Az for qemu-devel@nongnu.org; Sat, 10 Dec 2005 03:19:10 -0500 Received: by xproxy.gmail.com with SMTP id i27so730946wxd for ; Sat, 10 Dec 2005 00:17:22 -0800 (PST) Message-ID: Date: Sat, 10 Dec 2005 09:17:22 +0100 From: andrzej zaborowski MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_11947_10453224.1134202642118" Subject: [Qemu-devel] qemu curses driver Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org ------=_Part_11947_10453224.1134202642118 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Hello qemu, I made this simple curses/ncurses interface for qemu. If anyone is interested in using it, I attach a patch, relative to CVS version from some two days ago. I think it is also safe to apply to the CVS, if you think this is a useful addition (which I think it is). I tried to make it rather portable, but I've only been able to test it on Linux and FreeBSD i386 (only ncurses) so I suppose it works on all unix, but I have no idea how ms windows would deal with it. There's a curses implementation for windows called PDcurses and it should be fine, but if the "configure" doesn't detect any curses library on the system, it will just compile without the curses driver, like if it wasn't there. About how it works: It adds a "-curses" command line switch which will suppress the SDL driver (just like "-nographics"). When qemu is running with "-curses" it displays everything in the current terminal, be it native console, linux framebuffer, xterm, or running over ssh, leaving the task of rendering characters to the terminal. This results in much less speed overhead compared to the SDL driver (this is important on my slow machine). This works as long as the virtual graphics adapter is in text-mode. When it switches to graphics, qemu displays something like "1024 x 768 Graphics mode" in the middle of the screen, until the virtual machine goes back to a text-mode. Similarly works the VGA Blank mode. The qemu consoles work just like with the SDL interface, except you switch them with Alt+Number instead of Ctrl+Alt+Number because ncurses doesn't detect Ctrl and Alt keys together. So usually the virtual machine screen is at Alt+1, the qemu console at Alt+2, serial console at Alt+3 and parallel console at Alt+4. Resizing the terminal (like when resizing the xterm window) is handled (at least with ncurses, this may not be implemented in other curses libraries). The virtual machine won't notice any resizing, only thing that changes is the portion of the screen displayed in the terminal. Normal text-mode character attributes are handled. I think these are the most important things to mention. Tell me if anything needs to be changed in the patch, then I will send corrected versions. I hope this is useful, greetings, Andrzej Zaborowski -- balrog 2oo5 Dear Outlook users: Please remove me from your address books http://www.newsforge.com/article.pl?sid=3D03/08/21/143258 ------=_Part_11947_10453224.1134202642118 Content-Type: application/octet-stream; name="qemu-curses-ui.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="qemu-curses-ui.patch" ZGlmZiAtTmF1ciBxZW11L01ha2VmaWxlLnRhcmdldCBxZW11LW5jdXJzZXMvTWFrZWZpbGUudGFy Z2V0Ci0tLSBxZW11L01ha2VmaWxlLnRhcmdldAkyMDA1LTEyLTA2IDIxOjQyOjE3LjAwMDAwMDAw MCArMDAwMAorKysgcWVtdS1uY3Vyc2VzL01ha2VmaWxlLnRhcmdldAkyMDA1LTEyLTA4IDE4OjU5 OjI0LjAwMDAwMDAwMCArMDAwMApAQCAtMzQxLDYgKzM0MSwxMSBAQAogaWZkZWYgQ09ORklHX1NE TAogVkxfT0JKUys9c2RsLm8KIGVuZGlmCitpZmRlZiBDT05GSUdfQ1VSU0VTCitpZmVxICgkKFRB UkdFVF9CQVNFX0FSQ0gpLCBpMzg2KQorVkxfT0JKUys9Y3Vyc2VzLm8KK2VuZGlmCitlbmRpZgog aWZkZWYgQ09ORklHX0NPQ09BCiBWTF9PQkpTKz1jb2NvYS5vCiBDT0NPQV9MSUJTPS1GL1N5c3Rl bS9MaWJyYXJ5L0ZyYW1ld29ya3MgLWZyYW1ld29yayBDb2NvYSAtZnJhbWV3b3JrIElPS2l0CkBA IC0zODMsNyArMzg4LDcgQEAKIGVuZGlmCiAKICQoUUVNVV9TWVNURU0pOiAkKFZMX09CSlMpIGxp YnFlbXUuYQotCSQoQ0MpICQoVkxfTERGTEFHUykgLW8gJEAgJF4gJChMSUJTKSAkKFNETF9MSUJT KSAkKENPQ09BX0xJQlMpICQoVkxfTElCUykKKwkkKENDKSAkKFZMX0xERkxBR1MpIC1vICRAICRe ICQoTElCUykgJChTRExfTElCUykgJChDT0NPQV9MSUJTKSAkKENVUlNFU19MSUJTKSAkKFZMX0xJ QlMpCiAKIGNvY29hLm86IGNvY29hLm0KIAkkKENDKSAkKENGTEFHUykgJChERUZJTkVTKSAtYyAt byAkQCAkPApAQCAtMzk0LDYgKzM5OSw5IEBACiBzZGxhdWRpby5vOiBzZGxhdWRpby5jCiAJJChD QykgJChDRkxBR1MpICQoREVGSU5FUykgJChTRExfQ0ZMQUdTKSAtYyAtbyAkQCAkPAogCitjdXJz ZXMubzogY3Vyc2VzLmMKKwkkKENDKSAkKENGTEFHUykgJChERUZJTkVTKSAkKENVUlNFU19DRkxB R1MpIC1jIC1vICRAICQ8CisKIGRlcGVuZDogJChTUkNTKQogCSQoQ0MpIC1NTSAkKENGTEFHUykg JChERUZJTkVTKSAkXiAxPi5kZXBlbmQKIApkaWZmIC1OYXVyIHFlbXUvY29uZmlndXJlIHFlbXUt bmN1cnNlcy9jb25maWd1cmUKLS0tIHFlbXUvY29uZmlndXJlCTIwMDUtMTItMDYgMjE6NDI6NTUu MDAwMDAwMDAwICswMDAwCisrKyBxZW11LW5jdXJzZXMvY29uZmlndXJlCTIwMDUtMTItMDggMTg6 NTk6MjQuMDAwMDAwMDAwICswMDAwCkBAIC0xODEsNiArMTgxLDggQEAKICAgOzsKICAgLS1lbmFi bGUtZHNvdW5kKSBkc291bmQ9InllcyIKICAgOzsKKyAgLS1kaXNhYmxlLWN1cnNlcykgY3Vyc2Vz PSJubyIKKyAgOzsKICAgLS1lbmFibGUtZm1vZCkgZm1vZD0ieWVzIgogICA7OwogICAtLWZtb2Qt bGliPSopIGZtb2RfbGliPSR7b3B0Iy0tZm1vZC1saWI9fQpAQCAtMzQ4LDYgKzM1MCwyNCBAQAog ZmkgIyBjcm9zcyBjb21waWxhdGlvbgogZmkgIyAteiAkc2RsCiAKKyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBjdXJzZXMgcHJvYmUKKworaWYgdGVzdCAteiAi JGN1cnNlcyIgOyB0aGVuCisKK2N1cnNlcz1ubworCitjYXQgPiAkVE1QQyA8PCBFT0YKKyNpbmNs dWRlIDxjdXJzZXMuaD4KK2ludCBtYWluKCB2b2lkICkgeyByZXR1cm4gY3Vyc2VzX3ZlcnNpb24g KCk7IH0KK0VPRgorCitpZiAkY2MgLW8gJFRNUEUgLWxjdXJzZXMgJFRNUEMgMj4gL2Rldi9udWxs IDsgdGhlbgorY3Vyc2VzPXllcworZmkKKworZmkgIyAteiAkY3Vyc2VzCisKIGlmIHRlc3QgeCIk MSIgPSB4Ii1oIiAtbyB4IiQxIiA9IHgiLS1oZWxwIiA7IHRoZW4KIGNhdCA8PCBFT0YKIApAQCAt NDY5LDYgKzQ4OSw3IEBACiBpZiB0ZXN0ICIkc2RsIiAhPSAibm8iIDsgdGhlbgogICAgIGVjaG8g IlNETCBzdGF0aWMgbGluayAgICRzZGxfc3RhdGljIgogZmkKK2VjaG8gImN1cnNlcyBzdXBwb3J0 ICAgICRjdXJzZXMiCiBlY2hvICJtaW5ndzMyIHN1cHBvcnQgICAkbWluZ3czMiIKIGVjaG8gIkFk bGliIHN1cHBvcnQgICAgICRhZGxpYiIKIGVjaG8gIkNvcmVBdWRpbyBzdXBwb3J0ICRjb3JlYXVk aW8iCkBAIC02ODAsNyArNzAxLDggQEAKICAgICAgICAgLWEgIiRzZGwiID0gIm5vIiAtYSAiJGNv Y29hIiA9ICJubyIgOyB0aGVuCiAgICAgZWNobyAiRVJST1I6IFFFTVUgcmVxdWlyZXMgU0RMIG9y IENvY29hIGZvciBncmFwaGljYWwgb3V0cHV0IgogICAgIGVjaG8gIlRvIGJ1aWxkIFFFTVUgd2l0 aCBncmFwaGljYWwgb3V0cHV0IGNvbmZpZ3VyZSB3aXRoIC0tZGlzYWJsZS1nZngtY2hlY2siCi0g ICAgZWNobyAiTm90ZSB0aGF0IHRoaXMgd2lsbCBkaXNhYmxlIGFsbCBvdXRwdXQgZnJvbSB0aGUg dmlydHVhbCBncmFwaGljcyBjYXJkLiIKKyAgICBlY2hvICJOb3RlIHRoYXQgdGhpcyB3aWxsIGRp c2FibGUgYWxsIG91dHB1dCBmcm9tIHRoZSB2aXJ0dWFsIGdyYXBoaWNzIGNhcmQiCisgICAgZWNo byAiZXhjZXB0IGZvciB0aGUgY3Vyc2VzIGludGVyZmFjZS4iCiAgICAgZXhpdCAxOwogZmkKIApA QCAtNzk4LDYgKzgyMCwxNSBAQAogICAgIGVjaG8gIkNPTkZJR19DT0NPQT15ZXMiID4+ICRjb25m aWdfbWFrCiBmaQogCitpZiB0ZXN0ICIkY3Vyc2VzIiA9ICJ5ZXMiIDsgdGhlbgorICAgIGlmIHRl c3QgIiR0YXJnZXRfY3B1IiA9ICJpMzg2IiA7IHRoZW4KKyAgICAgICAgZWNobyAiI2RlZmluZSBD T05GSUdfQ1VSU0VTIDEiID4+ICRjb25maWdfaAorICAgICAgICBlY2hvICJDT05GSUdfQ1VSU0VT PXllcyIgPj4gJGNvbmZpZ19tYWsKKyAgICAgICAgZWNobyAiQ1VSU0VTX0xJQlM9LWxjdXJzZXMi ID4+ICRjb25maWdfbWFrCisgICAgICAgIGVjaG8gIkNVUlNFU19DRkxBR1M9IiA+PiAkY29uZmln X21haworICAgIGZpCitmaQorCiBkb25lICMgZm9yIHRhcmdldCBpbiAkdGFyZ2V0cwogCiAjIGJ1 aWxkIHRyZWUgaW4gb2JqZWN0IGRpcmVjdG9yeSBpZiBzb3VyY2UgcGF0aCBpcyBkaWZmZXJlbnQg ZnJvbSBjdXJyZW50IG9uZQpkaWZmIC1OYXVyIHFlbXUvY29uc29sZS5jIHFlbXUtbmN1cnNlcy9j b25zb2xlLmMKLS0tIHFlbXUvY29uc29sZS5jCTIwMDQtMTAtMDkgMTc6MzI6NTguMDAwMDAwMDAw ICswMDAwCisrKyBxZW11LW5jdXJzZXMvY29uc29sZS5jCTIwMDUtMTItMDggMTg6NTk6MjQuMDAw MDAwMDAwICswMDAwCkBAIC0yMSw1MiArMjEsMTEgQEAKICAqIE9VVCBPRiBPUiBJTiBDT05ORUNU SU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KICAq IFRIRSBTT0ZUV0FSRS4KICAqLwotI2luY2x1ZGUgInZsLmgiCisjaW5jbHVkZSAiY29uc29sZS5o IgogCiAjZGVmaW5lIERFRkFVTFRfQkFDS1NDUk9MTCA1MTIKICNkZWZpbmUgTUFYX0NPTlNPTEVT IDEyCiAKLSNkZWZpbmUgUkdCQShyLCBnLCBiLCBhKSAoKChhKSA8PCAyNCkgfCAoKHIpIDw8IDE2 KSB8ICgoZykgPDwgOCkgfCAoYikpCi0jZGVmaW5lIFJHQihyLCBnLCBiKSBSR0JBKHIsIGcsIGIs IDB4ZmYpCi0KLXR5cGVkZWYgc3RydWN0IFRleHRDZWxsIHsKLSAgICB1aW50OF90IGNoOwotICAg IHVpbnQ4X3QgYmdjb2w6NDsKLSAgICB1aW50OF90IGZnY29sOjQ7Ci19IFRleHRDZWxsOwotCi0j ZGVmaW5lIE1BWF9FU0NfUEFSQU1TIDMKLQotZW51bSBUVFlTdGF0ZSB7Ci0gICAgVFRZX1NUQVRF X05PUk0sCi0gICAgVFRZX1NUQVRFX0VTQywKLSAgICBUVFlfU1RBVEVfQ1NJLAotfTsKLQotc3Ry dWN0IFRleHRDb25zb2xlIHsKLSAgICBpbnQgdGV4dF9jb25zb2xlOyAvKiB0cnVlIGlmIHRleHQg Y29uc29sZSAqLwotICAgIERpc3BsYXlTdGF0ZSAqZHM7Ci0gICAgaW50IGdfd2lkdGgsIGdfaGVp Z2h0OwotICAgIGludCB3aWR0aDsKLSAgICBpbnQgaGVpZ2h0OwotICAgIGludCB0b3RhbF9oZWln aHQ7Ci0gICAgaW50IGJhY2tzY3JvbGxfaGVpZ2h0OwotICAgIGludCBmZ2NvbDsKLSAgICBpbnQg Ymdjb2w7Ci0gICAgaW50IHgsIHk7Ci0gICAgaW50IHlfZGlzcGxheWVkOwotICAgIGludCB5X2Jh c2U7Ci0gICAgVGV4dENlbGwgKmNlbGxzOwotCi0gICAgZW51bSBUVFlTdGF0ZSBzdGF0ZTsKLSAg ICBpbnQgZXNjX3BhcmFtc1tNQVhfRVNDX1BBUkFNU107Ci0gICAgaW50IG5iX2VzY19wYXJhbXM7 Ci0KLSAgICAvKiBrYmQgcmVhZCBoYW5kbGVyICovCi0gICAgSU9SZWFkSGFuZGxlciAqZmRfcmVh ZDsKLSAgICB2b2lkICpmZF9vcGFxdWU7Ci19OwotCiBzdGF0aWMgVGV4dENvbnNvbGUgKmFjdGl2 ZV9jb25zb2xlOwogc3RhdGljIFRleHRDb25zb2xlICpjb25zb2xlc1tNQVhfQ09OU09MRVNdOwog c3RhdGljIGludCBuYl9jb25zb2xlcyA9IDA7CkBAIC03MjksMyArNjg4LDggQEAKIAogICAgIHJl dHVybiBjaHI7CiB9CisKK1RleHRDb25zb2xlICpnZXRfYWN0aXZlX2NvbnNvbGUoKQoreworICAg IHJldHVybiBhY3RpdmVfY29uc29sZTsKK30KZGlmZiAtTmF1ciBxZW11L2NvbnNvbGUuaCBxZW11 LW5jdXJzZXMvY29uc29sZS5oCi0tLSBxZW11L2NvbnNvbGUuaAkxOTcwLTAxLTAxIDAwOjAwOjAw LjAwMDAwMDAwMCArMDAwMAorKysgcWVtdS1uY3Vyc2VzL2NvbnNvbGUuaAkyMDA1LTEyLTA4IDE4 OjU5OjI0LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDcwIEBACisvKgorICogUUVNVSBncmFw aGljYWwgY29uc29sZSBkZWZpbml0aW9ucworICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRmFi cmljZSBCZWxsYXJkCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUg b2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29m dHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIp LCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVk aW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlm eSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisg KiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0 aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9s bG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5k IHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3Bp ZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBT T0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5E LCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRI RSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElD VUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBU SEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwg REFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBD T05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJ TiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElO R1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBDT05TT0xFX0gKKyNkZWZpbmUg Q09OU09MRV9ICisKKyNpbmNsdWRlICJ2bC5oIgorCisjZGVmaW5lIFJHQkEociwgZywgYiwgYSkg KCgoYSkgPDwgMjQpIHwgKChyKSA8PCAxNikgfCAoKGcpIDw8IDgpIHwgKGIpKQorI2RlZmluZSBS R0IociwgZywgYikgUkdCQShyLCBnLCBiLCAweGZmKQorCit0eXBlZGVmIHN0cnVjdCBUZXh0Q2Vs bCB7CisgICAgdWludDhfdCBjaDsKKyAgICB1aW50OF90IGJnY29sOjQ7CisgICAgdWludDhfdCBm Z2NvbDo0OworfSBUZXh0Q2VsbDsKKworI2RlZmluZSBNQVhfRVNDX1BBUkFNUyAzCisKK2VudW0g VFRZU3RhdGUgeworICAgIFRUWV9TVEFURV9OT1JNLAorICAgIFRUWV9TVEFURV9FU0MsCisgICAg VFRZX1NUQVRFX0NTSSwKK307CisKK3N0cnVjdCBUZXh0Q29uc29sZSB7CisgICAgaW50IHRleHRf Y29uc29sZTsgLyogdHJ1ZSBpZiB0ZXh0IGNvbnNvbGUgKi8KKyAgICBEaXNwbGF5U3RhdGUgKmRz OworICAgIGludCBnX3dpZHRoLCBnX2hlaWdodDsKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IGhl aWdodDsKKyAgICBpbnQgdG90YWxfaGVpZ2h0OworICAgIGludCBiYWNrc2Nyb2xsX2hlaWdodDsK KyAgICBpbnQgZmdjb2w7CisgICAgaW50IGJnY29sOworICAgIGludCB4LCB5OworICAgIGludCB5 X2Rpc3BsYXllZDsKKyAgICBpbnQgeV9iYXNlOworICAgIFRleHRDZWxsICpjZWxsczsKKworICAg IGVudW0gVFRZU3RhdGUgc3RhdGU7CisgICAgaW50IGVzY19wYXJhbXNbTUFYX0VTQ19QQVJBTVNd OworICAgIGludCBuYl9lc2NfcGFyYW1zOworCisgICAgLyoga2JkIHJlYWQgaGFuZGxlciAqLwor ICAgIElPUmVhZEhhbmRsZXIgKmZkX3JlYWQ7CisgICAgdm9pZCAqZmRfb3BhcXVlOworfTsKKwor I2VuZGlmIC8qIENPTlNPTEVfSCAqLwpkaWZmIC1OYXVyIHFlbXUvY3Vyc2VzLmMgcWVtdS1uY3Vy c2VzL2N1cnNlcy5jCi0tLSBxZW11L2N1cnNlcy5jCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAw MDAwICswMDAwCisrKyBxZW11LW5jdXJzZXMvY3Vyc2VzLmMJMjAwNS0xMi0xMCAwNToxMjozNC4w MDAwMDAwMDAgKzAwMDAKQEAgLTAsMCArMSwyNzcgQEAKKy8qCisgKiBRRU1VIGN1cnNlcy9uY3Vy c2VzIGRpc3BsYXkgZHJpdmVyCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNSBBbmRyemVqIFph Ym9yb3dza2kgPGJhbHJvZ0B6YWJvci5vcmc+CisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5 IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkK KyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAo dGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0 cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1 c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2Us IGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBl cnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3Vi amVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHly aWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQg aW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJl LgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJB TlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5P VCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVW RU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUg Rk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElO IEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwK KyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0Ug T1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgInZs LmgiCisjaW5jbHVkZSAiY29uc29sZS5oIgorCisjaW5jbHVkZSA8Y3Vyc2VzLmg+CisKKyNpZm5k ZWYgX1dJTjMyCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImN1cnNl c19rZXlzLmgiCisKK3N0YXRpYyBjaGFyIHNjcmVlblsxNjAgKiAxMDBdOworc3RhdGljIFdJTkRP VyAqc2NyZWVucGFkID0gTlVMTDsKK3N0YXRpYyBpbnQgd2lkdGgsIGhlaWdodDsKK3N0YXRpYyBp bnQgcHgsIHB5LCBzbWlueCwgc21pbnksIHNtYXh4LCBzbWF4eTsKKworc3RhdGljIHZvaWQgY3Vy c2VzX3VwZGF0ZShEaXNwbGF5U3RhdGUgKmRzLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkK K3sKKyAgICBpbnQgaSwgaiwgbXcsIG1oOworICAgIGNodHlwZSAqbGluZTsKKyAgICBUZXh0Q29u c29sZSAqczsKKworICAgIGlmIChpc19hY3RpdmVfY29uc29sZSh2Z2FfY29uc29sZSkpIHsKKyAg ICAgICAgbGluZSA9ICgoY2h0eXBlICopIHNjcmVlbikgKyB5ICogd2lkdGg7CisgICAgICAgIGZv ciAoaCArPSB5OyB5IDwgaDsgeSArKywgbGluZSArPSB3aWR0aCkKKyAgICAgICAgICAgIG12d2Fk ZGNobnN0cihzY3JlZW5wYWQsIHksIDAsIGxpbmUsIHdpZHRoKTsKKworICAgICAgICBwbm91dHJl ZnJlc2goc2NyZWVucGFkLCBweSwgcHgsIHNtaW55LCBzbWlueCwgc21heHkgLSAxLCBzbWF4eCAt IDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHMgPSBnZXRfYWN0aXZlX2NvbnNvbGUoKTsKKyAg ICAgICAgaWYgKCFzLT50ZXh0X2NvbnNvbGUpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAg ICAgbXcgPSBzLT53aWR0aDsKKyAgICAgICAgaWYgKG13ID4gQ09MUykKKyAgICAgICAgICAgIG13 ID0gQ09MUzsKKyAgICAgICAgbWggPSBzLT5oZWlnaHQ7CisgICAgICAgIGlmIChtaCA+IExJTkVT KQorICAgICAgICAgICAgbWggPSBMSU5FUzsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWg7 IGkgKyspCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbXc7IGogKyspCisgICAgICAgICAg ICAgICAgbXZhZGRjaChpLCBqLCBzLT5jZWxsc1sKKyAgICAgICAgICAgICAgICAgICAgICAgIChp ICsgcy0+eV9iYXNlICsgcy0+aGVpZ2h0IC0gbWgpICogcy0+d2lkdGggKyBqXS5jaCk7CisgICAg ICAgIG1vdmUocy0+eSArIG1oIC0gcy0+aGVpZ2h0LCBzLT54KTsKKyAgICAgICAgY3Vyc19zZXQo Mik7CisgICAgfQorICAgIHJlZnJlc2goKTsKK30KKworc3RhdGljIHZvaWQgY3Vyc2VzX2NhbGNf cGFkKCkKK3sKKyAgICBpZiAod2lkdGggPiBDT0xTKSB7CisgICAgICAgIHB4ID0gKHdpZHRoIC0g Q09MUykgLyAyOworICAgICAgICBzbWlueCA9IDA7CisgICAgICAgIHNtYXh4ID0gQ09MUzsKKyAg ICB9IGVsc2UgeworICAgICAgICBweCA9IDA7CisgICAgICAgIHNtaW54ID0gKENPTFMgLSB3aWR0 aCkgLyAyOworICAgICAgICBzbWF4eCA9IHNtaW54ICsgd2lkdGg7CisgICAgfQorCisgICAgaWYg KGhlaWdodCA+IExJTkVTKSB7CisgICAgICAgIHB5ID0gKGhlaWdodCAtIExJTkVTKSAvIDI7Cisg ICAgICAgIHNtaW55ID0gMDsKKyAgICAgICAgc21heHkgPSBMSU5FUzsKKyAgICB9IGVsc2Ugewor ICAgICAgICBweSA9IDA7CisgICAgICAgIHNtaW55ID0gKExJTkVTIC0gaGVpZ2h0KSAvIDI7Cisg ICAgICAgIHNtYXh5ID0gc21pbnkgKyBoZWlnaHQ7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBj dXJzZXNfcmVzaXplKERpc3BsYXlTdGF0ZSAqZHMsIGludCB3LCBpbnQgaCkKK3sKKyAgICBpZiAo dyA9PSB3aWR0aCAmJiBoID09IGhlaWdodCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKHNj cmVlbnBhZCkKKyAgICAgICAgZGVsd2luKHNjcmVlbnBhZCk7CisKKyAgICBjbGVhcigpOworICAg IHJlZnJlc2goKTsKKworICAgIHNjcmVlbnBhZCA9IG5ld3BhZChoLCB3KTsKKyAgICB3aWR0aCA9 IHc7CisgICAgaGVpZ2h0ID0gaDsKKworICAgIGN1cnNlc19jYWxjX3BhZCgpOworfQorCitzdGF0 aWMgdm9pZCBjdXJzZXNfY3Vyc29yX3Bvc2l0aW9uKERpc3BsYXlTdGF0ZSAqZHMsIGludCB4LCBp bnQgeSkKK3sKKyAgICBpZiAoeCA+PSAwKSB7CisgICAgICAgIHggPSBzbWlueCArIHggLSBweDsK KyAgICAgICAgeSA9IHNtaW55ICsgeSAtIHB5OworCisgICAgICAgIGlmICh4ID49IDAgJiYgeSA+ PSAwICYmIHggPCBDT0xTICYmIHkgPCBMSU5FUykgeworICAgICAgICAgICAgbW92ZSh5LCB4KTsK KyAgICAgICAgICAgIGN1cnNfc2V0KDEpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9 CisgICAgfQorCisgICAgY3Vyc19zZXQoMCk7Cit9CisKK3N0YXRpYyB2b2lkIGN1cnNlc19yZWZy ZXNoKERpc3BsYXlTdGF0ZSAqZHMpCit7CisgICAgaW50IGNociwgbmV4dGNociwga2V5c3ltLCBr ZXljb2RlOworCisgICAgaWYgKGlzX2FjdGl2ZV9jb25zb2xlKHZnYV9jb25zb2xlKSkgCisgICAg ICAgIHZnYV91cGRhdGVfdGV4dChzY3JlZW4sIGN1cnNlc19jdXJzb3JfcG9zaXRpb24pOworCisg ICAgbmV4dGNociA9IEVSUjsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICAvKiB3aGlsZSB0aGVy ZSBhcmUgYW55IHBlbmRpbmcga2V5IHN0cm9rZXMgdG8gcHJvY2VzcyAqLworICAgICAgICBpZiAo bmV4dGNociA9PSBFUlIpCisgICAgICAgICAgICBjaHIgPSBnZXRjaCgpOworICAgICAgICBlbHNl IHsKKyAgICAgICAgICAgIGNociA9IG5leHRjaHI7CisgICAgICAgICAgICBuZXh0Y2hyID0gRVJS OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNociA9PSBFUlIpCisgICAgICAgICAgICBicmVh azsKKworICAgICAgICAvKiB0ZXJtaW5hbCBzaXplIGNoYW5nZWQgKi8KKyAgICAgICAgaWYgKGNo ciA9PSBLRVlfUkVTSVpFKSB7CisgICAgICAgICAgICBjbGVhcigpOworICAgICAgICAgICAgcmVm cmVzaCgpOworICAgICAgICAgICAgY3Vyc2VzX2NhbGNfcGFkKCk7CisgICAgICAgICAgICBjdXJz ZXNfdXBkYXRlKGRzLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGNvbnRpbnVl OworICAgICAgICB9CisKKyAgICAgICAga2V5Y29kZSA9IGN1cnNlczJrZXljb2RlW2Nocl07Cisg ICAgICAgIGlmIChrZXljb2RlID09IC0xKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAg ICAgLyogYWx0IGtleSAqLworICAgICAgICBpZiAoa2V5Y29kZSA9PSAxKSB7CisgICAgICAgICAg ICBuZXh0Y2hyID0gZ2V0Y2goKTsKKworICAgICAgICAgICAgaWYgKG5leHRjaHIgIT0gRVJSKSB7 CisgICAgICAgICAgICAgICAga2V5Y29kZSA9IGN1cnNlczJrZXljb2RlW25leHRjaHJdOworICAg ICAgICAgICAgICAgIG5leHRjaHIgPSBFUlI7CisgICAgICAgICAgICAgICAgaWYgKGtleWNvZGUg PT0gLTEpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAg a2V5Y29kZSB8PSBBTFQ7CisKKyAgICAgICAgICAgICAgICAvKiBwcm9jZXNzIGtleXMgcmVzZXJ2 ZWQgZm9yIHFlbXUgKi8KKyAgICAgICAgICAgICAgICBpZiAoa2V5Y29kZSA+PSBRRU1VX0tFWV9D T05TT0xFMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAga2V5Y29kZSA8IFFFTVVfS0VZX0NP TlNPTEUwICsgOSkgeworICAgICAgICAgICAgICAgICAgICBlcmFzZSgpOworICAgICAgICAgICAg ICAgICAgICB3bm91dHJlZnJlc2goc3Rkc2NyKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc29s ZV9zZWxlY3Qoa2V5Y29kZSAtIFFFTVVfS0VZX0NPTlNPTEUwKTsKKworICAgICAgICAgICAgICAg ICAgICBpZiAoaXNfYWN0aXZlX2NvbnNvbGUodmdhX2NvbnNvbGUpKSAKKyAgICAgICAgICAgICAg ICAgICAgICAgIHZnYV9pbnZhbGlkYXRlX2Rpc3BsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAg ZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc2VzX3VwZGF0ZShkcywgMCwgMCwgd2lk dGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAg ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc19hY3RpdmVf Y29uc29sZSh2Z2FfY29uc29sZSkpIHsKKyAgICAgICAgICAgIC8qIHNpbmNlIHRlcm1pbmFscyBk b24ndCBrbm93IGFib3V0IGtleSBwcmVzcyBhbmQgcmVsZWFzZQorICAgICAgICAgICAgICogZXZl bnRzLCB3ZSBuZWVkIHRvIGVtaXQgYm90aCBmb3IgZWFjaCBrZXkgcmVjZWl2ZWQgKi8KKyAgICAg ICAgICAgIGlmIChrZXljb2RlICYgU0hJRlQpCisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXlj b2RlKFNISUZUX0NPREUpOworICAgICAgICAgICAgaWYgKGtleWNvZGUgJiBDVFJMKQorICAgICAg ICAgICAgICAgIGtiZF9wdXRfa2V5Y29kZShDVFJMX0NPREUpOworICAgICAgICAgICAgaWYgKGtl eWNvZGUgJiBBTFQpCisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXljb2RlKEFMVF9DT0RFKTsK KyAgICAgICAgICAgIGlmIChrZXljb2RlICYgR1JFWSkKKyAgICAgICAgICAgICAgICBrYmRfcHV0 X2tleWNvZGUoR1JFWV9DT0RFKTsKKyAgICAgICAgICAgIGtiZF9wdXRfa2V5Y29kZShrZXljb2Rl ICYgS0VZX01BU0spOworICAgICAgICAgICAgaWYgKGtleWNvZGUgJiBHUkVZKQorICAgICAgICAg ICAgICAgIGtiZF9wdXRfa2V5Y29kZShHUkVZX0NPREUpOworICAgICAgICAgICAga2JkX3B1dF9r ZXljb2RlKChrZXljb2RlICYgS0VZX01BU0spIHwgS0VZX1JFTEVBU0UpOworICAgICAgICAgICAg aWYgKGtleWNvZGUgJiBBTFQpCisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXljb2RlKEFMVF9D T0RFIHwgS0VZX1JFTEVBU0UpOworICAgICAgICAgICAgaWYgKGtleWNvZGUgJiBDVFJMKQorICAg ICAgICAgICAgICAgIGtiZF9wdXRfa2V5Y29kZShDVFJMX0NPREUgfCBLRVlfUkVMRUFTRSk7Cisg ICAgICAgICAgICBpZiAoa2V5Y29kZSAmIFNISUZUKQorICAgICAgICAgICAgICAgIGtiZF9wdXRf a2V5Y29kZShTSElGVF9DT0RFIHwgS0VZX1JFTEVBU0UpOworICAgICAgICB9IGVsc2UgeworICAg ICAgICAgICAga2V5c3ltID0gY3Vyc2VzMmtleXN5bVtjaHJdOworICAgICAgICAgICAgaWYgKGtl eXN5bSA9PSAtMSkKKyAgICAgICAgICAgICAgICBrZXlzeW0gPSBjaHI7CisKKyAgICAgICAgICAg IGtiZF9wdXRfa2V5c3ltKGtleXN5bSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2 b2lkIGN1cnNlc19jbGVhbnVwKHZvaWQpIAoreworICAgIGVuZHdpbigpOworfQorCitzdGF0aWMg dm9pZCBjdXJzZXNfc2V0dXAodm9pZCkKK3sKKyAgICBpbnQgaSwgY29sb3VyX2RlZmF1bHRbOF0g PSB7CisgICAgICAgIENPTE9SX0JMQUNLLCBDT0xPUl9CTFVFLCBDT0xPUl9HUkVFTiwgQ09MT1Jf Q1lBTiwKKyAgICAgICAgQ09MT1JfUkVELCBDT0xPUl9NQUdFTlRBLCBDT0xPUl9ZRUxMT1csIENP TE9SX1dISVRFLAorICAgIH07CisKKyAgICAvKiBpbnB1dCBhcyByYXcgYXMgcG9zc2libGUsIGxl dCBldmVyeXRoaW5nIGJlIGludGVycHJldGVkCisgICAgICogYnkgdGhlIGd1ZXN0IHN5c3RlbSAq LworICAgIGluaXRzY3IoKTsgbm9lY2hvKCk7IGludHJmbHVzaChzdGRzY3IsIEZBTFNFKTsKKyAg ICBub25sKCk7IGtleXBhZChzdGRzY3IsIFRSVUUpOyBzdGFydF9jb2xvcigpOworICAgIHJhdygp OyBzY3JvbGxvayhzdGRzY3IsIEZBTFNFKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSAr KykKKyAgICAgICAgaW5pdF9wYWlyKGksIGNvbG91cl9kZWZhdWx0W2kgJiA3XSwgY29sb3VyX2Rl ZmF1bHRbaSA+PiAzXSk7Cit9CisKK3ZvaWQgY3Vyc2VzX2Rpc3BsYXlfaW5pdChEaXNwbGF5U3Rh dGUgKmRzLCBpbnQgZnVsbF9zY3JlZW4pCit7CisgICAgLyogdGhlIHRlcm1pbmFsIGRlYWxzIHdp dGgga2V5Ym9hcmQgbGF5b3V0cyBzbyB3ZSBkb24ndCBuZWVkIHRvICovCisKKyNpZm5kZWYgX1dJ TjMyCisgICAgaWYgKCFpc2F0dHkoMSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJXZSBu ZWVkIGEgdGVybWluYWwgb3V0cHV0XG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisjZW5k aWYKKworICAgIGN1cnNlc19zZXR1cCgpOworCisjaWZuZGVmIF9XSU4zMgorICAgIHNpZ25hbChT SUdJTlQsIFNJR19ERkwpOworICAgIHNpZ25hbChTSUdRVUlULCBTSUdfREZMKTsKKyNlbmRpZgor CisgICAgZHMtPmRhdGEgPSBzY3JlZW47CisgICAgZHMtPmxpbmVzaXplID0gMDsKKyAgICBkcy0+ ZGVwdGggPSAwOworICAgIGRzLT53aWR0aCA9IDY0MDsKKyAgICBkcy0+aGVpZ2h0ID0gNDAwOwor ICAgIGRzLT5kcHlfdXBkYXRlID0gY3Vyc2VzX3VwZGF0ZTsKKyAgICBkcy0+ZHB5X3Jlc2l6ZSA9 IGN1cnNlc19yZXNpemU7CisgICAgZHMtPmRweV9yZWZyZXNoID0gY3Vyc2VzX3JlZnJlc2g7CisK KyAgICAvKiBTdGFuZGFyZCBWR0EgaW5pdGlhbCB0ZXh0IG1vZGUgZGltZW5zaW9ucyAqLworICAg IGN1cnNlc19yZXNpemUoZHMsIDgwLCAyNSk7CisKKyAgICBhdGV4aXQoY3Vyc2VzX2NsZWFudXAp OworfQorLyogdmltOiBzZXQgYWkgdHM9NCBzdz00IGV0OiAqLwpkaWZmIC1OYXVyIHFlbXUvY3Vy c2VzX2tleXMuaCBxZW11LW5jdXJzZXMvY3Vyc2VzX2tleXMuaAotLS0gcWVtdS9jdXJzZXNfa2V5 cy5oCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBxZW11LW5jdXJzZXMv Y3Vyc2VzX2tleXMuaAkyMDA1LTEyLTA4IDE5OjE2OjE5LjAwMDAwMDAwMCArMDAwMApAQCAtMCww ICsxLDI0MyBAQAorLyoKKyAqIEtleWNvZGUgYW5kIGtleXN5bXMgY29udmVyc2lvbiB0YWJsZXMg Zm9yIGN1cnNlcworICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQW5kcnplaiBaYWJvcm93c2tp IDxiYWxyb2dAemFib3Iub3JnPgorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVk LCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0 aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29m dHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24s IGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5 LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Ig c2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRv IHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8g dGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90 aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBh bGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisg KiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBB TlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRF RCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBB IFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFM TAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkg Q0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJ T04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQg T0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVS IERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNkZWZpbmUgS0VZX1JFTEVBU0Ug ICAgICAgICAxMjgKKyNkZWZpbmUgS0VZX01BU0sgICAgICAgICAgICAxMjcKKyNkZWZpbmUgU0hJ RlRfQ09ERSAgICAgICAgICA0MgorI2RlZmluZSBTSElGVCAgICAgICAgICAgICAgIDEyOAorI2Rl ZmluZSBHUkVZX0NPREUgICAgICAgICAgIDIyNAorI2RlZmluZSBHUkVZICAgICAgICAgICAgICAg IDI1NgorI2RlZmluZSBDVFJMX0NPREUgICAgICAgICAgIDI5CisjZGVmaW5lIENUUkwgICAgICAg ICAgICAgICAgNTEyCisjZGVmaW5lIENUUkxfQ09ERSAgICAgICAgICAgMjkKKyNkZWZpbmUgQ1RS TCAgICAgICAgICAgICAgICA1MTIKKyNkZWZpbmUgQUxUX0NPREUgICAgICAgICAgICA1NgorI2Rl ZmluZSBBTFQgICAgICAgICAgICAgICAgIDEwMjQKKworLyogY3Vyc2VzIHdvbid0IGRldGVjdCBh IEN0cmwgKyBBbHQgKyAxLCBzbyB1c2UgQWx0ICsgMSAqLworI2RlZmluZSBRRU1VX0tFWV9DT05T T0xFMCAgICgyIHwgQUxUKSAgIC8qIChjdXJzZXMya2V5Y29kZVsnMSddIHwgQUxUKSAqLworCisj ZGVmaW5lIENVUlNFU19LRVlTICAgICAgICAgS0VZX01BWCAgICAgLyogS0VZX01BWCBkZWZpbmVk IGluIDxjdXJzZXMuaD4gKi8KKworaW50IGN1cnNlczJrZXljb2RlW0NVUlNFU19LRVlTXSA9IHsK KyAgICBbMCAuLi4gKENVUlNFU19LRVlTIC0gMSldID0gLTEsCisKKyAgICBbMjddID0gMSwgLyog RXNjYXBlICovCisgICAgWycxJ10gPSAyLAorICAgIFsnMiddID0gMywKKyAgICBbJzMnXSA9IDQs CisgICAgWyc0J10gPSA1LAorICAgIFsnNSddID0gNiwKKyAgICBbJzYnXSA9IDcsCisgICAgWyc3 J10gPSA4LAorICAgIFsnOCddID0gOSwKKyAgICBbJzknXSA9IDEwLAorICAgIFsnMCddID0gMTEs CisgICAgWyctJ10gPSAxMiwKKyAgICBbJz0nXSA9IDEzLAorICAgIFsxMjddID0gMTQsIC8qIEJh Y2tzcGFjZSAqLworICAgIFsyNjNdID0gMTQsIC8qIEJhY2tzcGFjZSAqLworCisgICAgWydcdCdd ID0gMTUsIC8qIFRhYiAqLworICAgIFsncSddID0gMTYsCisgICAgWyd3J10gPSAxNywKKyAgICBb J2UnXSA9IDE4LAorICAgIFsnciddID0gMTksCisgICAgWyd0J10gPSAyMCwKKyAgICBbJ3knXSA9 IDIxLAorICAgIFsndSddID0gMjIsCisgICAgWydpJ10gPSAyMywKKyAgICBbJ28nXSA9IDI0LAor ICAgIFsncCddID0gMjUsCisgICAgWydbJ10gPSAyNiwKKyAgICBbJ10nXSA9IDI3LAorICAgIFsn XG4nXSA9IDI4LCAvKiBSZXR1cm4gKi8KKyAgICBbJ1xyJ10gPSAyOCwgLyogUmV0dXJuICovCisg ICAgWzM0M10gPSAyOCwgLyogUmV0dXJuICovCisKKyAgICBbJ2EnXSA9IDMwLAorICAgIFsncydd ID0gMzEsCisgICAgWydkJ10gPSAzMiwKKyAgICBbJ2YnXSA9IDMzLAorICAgIFsnZyddID0gMzQs CisgICAgWydoJ10gPSAzNSwKKyAgICBbJ2onXSA9IDM2LAorICAgIFsnayddID0gMzcsCisgICAg WydsJ10gPSAzOCwKKyAgICBbJzsnXSA9IDM5LAorICAgIFsnXCcnXSA9IDQwLCAvKiBTaW5nbGUg cXVvdGUgKi8KKyAgICBbJ2AnXSA9IDQxLAorICAgIFsnXFwnXSA9IDQzLCAvKiBCYWNrc2xhc2gg Ki8KKworICAgIFsneiddID0gNDQsCisgICAgWyd4J10gPSA0NSwKKyAgICBbJ2MnXSA9IDQ2LAor ICAgIFsndiddID0gNDcsCisgICAgWydiJ10gPSA0OCwKKyAgICBbJ24nXSA9IDQ5LAorICAgIFsn bSddID0gNTAsCisgICAgWycsJ10gPSA1MSwKKyAgICBbJy4nXSA9IDUyLAorICAgIFsnLyddID0g NTMsCisKKyAgICBbJyAnXSA9IDU3LAorCisgICAgWzI2NV0gPSA1OSwgLyogRnVuY3Rpb24gS2V5 IDEgKi8KKyAgICBbMjY2XSA9IDYwLCAvKiBGdW5jdGlvbiBLZXkgMiAqLworICAgIFsyNjddID0g NjEsIC8qIEZ1bmN0aW9uIEtleSAzICovCisgICAgWzI2OF0gPSA2MiwgLyogRnVuY3Rpb24gS2V5 IDQgKi8KKyAgICBbMjY5XSA9IDYzLCAvKiBGdW5jdGlvbiBLZXkgNSAqLworICAgIFsyNzBdID0g NjQsIC8qIEZ1bmN0aW9uIEtleSA2ICovCisgICAgWzI3MV0gPSA2NSwgLyogRnVuY3Rpb24gS2V5 IDcgKi8KKyAgICBbMjcyXSA9IDY2LCAvKiBGdW5jdGlvbiBLZXkgOCAqLworICAgIFsyNzNdID0g NjcsIC8qIEZ1bmN0aW9uIEtleSA5ICovCisgICAgWzI3NF0gPSA2OCwgLyogRnVuY3Rpb24gS2V5 IDEwICovCisgICAgWzI3NV0gPSA4NywgLyogRnVuY3Rpb24gS2V5IDExICovCisgICAgWzI3Nl0g PSA4OCwgLyogRnVuY3Rpb24gS2V5IDEyICovCisKKyAgICBbMjYyXSA9IDcxIHwgR1JFWSwgLyog SG9tZSAqLworICAgIFsyNTldID0gNzIgfCBHUkVZLCAvKiBVcCBBcnJvdyAqLworICAgIFszMzld ID0gNzMgfCBHUkVZLCAvKiBQYWdlIFVwICovCisgICAgWzI2MF0gPSA3NSB8IEdSRVksIC8qIExl ZnQgQXJyb3cgKi8KKyAgICBbMjYxXSA9IDc3IHwgR1JFWSwgLyogUmlnaHQgQXJyb3cgKi8KKyAg ICBbMzYwXSA9IDc5IHwgR1JFWSwgLyogRW5kICovCisgICAgWzI1OF0gPSA4MCB8IEdSRVksIC8q IERvd24gQXJyb3cgKi8KKyAgICBbMzM4XSA9IDgxIHwgR1JFWSwgLyogUGFnZSBEb3duICovCisg ICAgWzMzMV0gPSA4MiB8IEdSRVksIC8qIEluc2VydCAqLworICAgIFszMzBdID0gODMgfCBHUkVZ LCAvKiBEZWxldGUgKi8KKworICAgIFsnISddID0gMiB8IFNISUZULAorICAgIFsnQCddID0gMyB8 IFNISUZULAorICAgIFsnIyddID0gNCB8IFNISUZULAorICAgIFsnJCddID0gNSB8IFNISUZULAor ICAgIFsnJSddID0gNiB8IFNISUZULAorICAgIFsnXiddID0gNyB8IFNISUZULAorICAgIFsnJidd ID0gOCB8IFNISUZULAorICAgIFsnKiddID0gOSB8IFNISUZULAorICAgIFsnKCddID0gMTAgfCBT SElGVCwKKyAgICBbJyknXSA9IDExIHwgU0hJRlQsCisgICAgWydfJ10gPSAxMiB8IFNISUZULAor ICAgIFsnKyddID0gMTMgfCBTSElGVCwKKworICAgIFszNTNdID0gMTUgfCBTSElGVCwgLyogU2hp ZnQgKyBUYWIgKi8KKyAgICBbJ1EnXSA9IDE2IHwgU0hJRlQsCisgICAgWydXJ10gPSAxNyB8IFNI SUZULAorICAgIFsnRSddID0gMTggfCBTSElGVCwKKyAgICBbJ1InXSA9IDE5IHwgU0hJRlQsCisg ICAgWydUJ10gPSAyMCB8IFNISUZULAorICAgIFsnWSddID0gMjEgfCBTSElGVCwKKyAgICBbJ1Un XSA9IDIyIHwgU0hJRlQsCisgICAgWydJJ10gPSAyMyB8IFNISUZULAorICAgIFsnTyddID0gMjQg fCBTSElGVCwKKyAgICBbJ1AnXSA9IDI1IHwgU0hJRlQsCisgICAgWyd7J10gPSAyNiB8IFNISUZU LAorICAgIFsnfSddID0gMjcgfCBTSElGVCwKKworICAgIFsnQSddID0gMzAgfCBTSElGVCwKKyAg ICBbJ1MnXSA9IDMxIHwgU0hJRlQsCisgICAgWydEJ10gPSAzMiB8IFNISUZULAorICAgIFsnRidd ID0gMzMgfCBTSElGVCwKKyAgICBbJ0cnXSA9IDM0IHwgU0hJRlQsCisgICAgWydIJ10gPSAzNSB8 IFNISUZULAorICAgIFsnSiddID0gMzYgfCBTSElGVCwKKyAgICBbJ0snXSA9IDM3IHwgU0hJRlQs CisgICAgWydMJ10gPSAzOCB8IFNISUZULAorICAgIFsnOiddID0gMzkgfCBTSElGVCwKKyAgICBb JyInXSA9IDQwIHwgU0hJRlQsCisgICAgWyd+J10gPSA0MSB8IFNISUZULAorICAgIFsnfCddID0g NDMgfCBTSElGVCwKKworICAgIFsnWiddID0gNDQgfCBTSElGVCwKKyAgICBbJ1gnXSA9IDQ1IHwg U0hJRlQsCisgICAgWydDJ10gPSA0NiB8IFNISUZULAorICAgIFsnViddID0gNDcgfCBTSElGVCwK KyAgICBbJ0InXSA9IDQ4IHwgU0hJRlQsCisgICAgWydOJ10gPSA0OSB8IFNISUZULAorICAgIFsn TSddID0gNTAgfCBTSElGVCwKKyAgICBbJzwnXSA9IDUxIHwgU0hJRlQsCisgICAgWyc+J10gPSA1 MiB8IFNISUZULAorICAgIFsnPyddID0gNTMgfCBTSElGVCwKKworICAgIFsyNzddID0gNTkgfCBT SElGVCwgLyogU2hpZnQgKyBGdW5jdGlvbiBLZXkgMSAqLworICAgIFsyNzhdID0gNjAgfCBTSElG VCwgLyogU2hpZnQgKyBGdW5jdGlvbiBLZXkgMiAqLworICAgIFsyNzldID0gNjEgfCBTSElGVCwg LyogU2hpZnQgKyBGdW5jdGlvbiBLZXkgMyAqLworICAgIFsyODBdID0gNjIgfCBTSElGVCwgLyog U2hpZnQgKyBGdW5jdGlvbiBLZXkgNCAqLworICAgIFsyODFdID0gNjMgfCBTSElGVCwgLyogU2hp ZnQgKyBGdW5jdGlvbiBLZXkgNSAqLworICAgIFsyODJdID0gNjQgfCBTSElGVCwgLyogU2hpZnQg KyBGdW5jdGlvbiBLZXkgNiAqLworICAgIFsyODNdID0gNjUgfCBTSElGVCwgLyogU2hpZnQgKyBG dW5jdGlvbiBLZXkgNyAqLworICAgIFsyODRdID0gNjYgfCBTSElGVCwgLyogU2hpZnQgKyBGdW5j dGlvbiBLZXkgOCAqLworCisgICAgWzE3XSA9IDE2IHwgQ1RSTCwgLyogQ29udHJvbCArIHEgKi8K KyAgICBbMjNdID0gMTcgfCBDVFJMLCAvKiBDb250cm9sICsgdyAqLworICAgIFs1XSA9IDE4IHwg Q1RSTCwgLyogQ29udHJvbCArIGUgKi8KKyAgICBbMThdID0gMTkgfCBDVFJMLCAvKiBDb250cm9s ICsgciAqLworICAgIFsyMF0gPSAyMCB8IENUUkwsIC8qIENvbnRyb2wgKyB0ICovCisgICAgWzI1 XSA9IDIxIHwgQ1RSTCwgLyogQ29udHJvbCArIHkgKi8KKyAgICBbMjFdID0gMjIgfCBDVFJMLCAv KiBDb250cm9sICsgdSAqLworICAgIFs5XSA9IDIzIHwgQ1RSTCwgLyogQ29udHJvbCArIGkgKi8K KyAgICBbMTVdID0gMjQgfCBDVFJMLCAvKiBDb250cm9sICsgbyAqLworICAgIFsxNl0gPSAyNSB8 IENUUkwsIC8qIENvbnRyb2wgKyBwICovCisKKyAgICBbMV0gPSAzMCB8IENUUkwsIC8qIENvbnRy b2wgKyBhICovCisgICAgWzE5XSA9IDMxIHwgQ1RSTCwgLyogQ29udHJvbCArIHMgKi8KKyAgICBb NF0gPSAzMiB8IENUUkwsIC8qIENvbnRyb2wgKyBkICovCisgICAgWzZdID0gMzMgfCBDVFJMLCAv KiBDb250cm9sICsgZiAqLworICAgIFs3XSA9IDM0IHwgQ1RSTCwgLyogQ29udHJvbCArIGcgKi8K KyAgICBbOF0gPSAzNSB8IENUUkwsIC8qIENvbnRyb2wgKyBoICovCisgICAgWzEwXSA9IDM2IHwg Q1RSTCwgLyogQ29udHJvbCArIGogKi8KKyAgICBbMTFdID0gMzcgfCBDVFJMLCAvKiBDb250cm9s ICsgayAqLworICAgIFsxMl0gPSAzOCB8IENUUkwsIC8qIENvbnRyb2wgKyBsICovCisKKyAgICBb MjZdID0gNDQgfCBDVFJMLCAvKiBDb250cm9sICsgeiAqLworICAgIFsyNF0gPSA0NSB8IENUUkws IC8qIENvbnRyb2wgKyB4ICovCisgICAgWzNdID0gNDYgfCBDVFJMLCAvKiBDb250cm9sICsgYyAq LworICAgIFsyMl0gPSA0NyB8IENUUkwsIC8qIENvbnRyb2wgKyB2ICovCisgICAgWzJdID0gNDgg fCBDVFJMLCAvKiBDb250cm9sICsgYiAqLworICAgIFsxNF0gPSA0OSB8IENUUkwsIC8qIENvbnRy b2wgKyBuICovCisgICAgWzEzXSA9IDUwIHwgQ1RSTCwgLyogQ29udHJvbCArIG0gKi8KKworfTsK KworaW50IGN1cnNlczJrZXlzeW1bQ1VSU0VTX0tFWVNdID0geworICAgIFswIC4uLiAoQ1VSU0VT X0tFWVMgLSAxKV0gPSAtMSwKKworICAgIFsnXG4nXSA9ICdcbicsCisgICAgWydcciddID0gJ1xu JywKKworICAgIFsxMjddID0gUUVNVV9LRVlfQkFDS1NQQUNFLAorCisgICAgWzI1OF0gPSBRRU1V X0tFWV9ET1dOLAorICAgIFsyNTldID0gUUVNVV9LRVlfVVAsCisgICAgWzI2MF0gPSBRRU1VX0tF WV9MRUZULAorICAgIFsyNjFdID0gUUVNVV9LRVlfUklHSFQsCisgICAgWzI2Ml0gPSBRRU1VX0tF WV9IT01FLAorICAgIFsyNjNdID0gUUVNVV9LRVlfQkFDS1NQQUNFLAorCisgICAgWzMzMF0gPSBR RU1VX0tFWV9ERUxFVEUsCisgICAgWzMzOF0gPSBRRU1VX0tFWV9QQUdFRE9XTiwKKyAgICBbMzM5 XSA9IFFFTVVfS0VZX1BBR0VVUCwKKyAgICBbMzQzXSA9ICdcbicsCisgICAgWzM2MF0gPSBRRU1V X0tFWV9FTkQsCisKK307CisvKiB2aW06IHNldCBhaSB0cz00IHN3PTQgZXQ6ICovCmRpZmYgLU5h dXIgcWVtdS9ody92Z2EuYyBxZW11LW5jdXJzZXMvaHcvdmdhLmMKLS0tIHFlbXUvaHcvdmdhLmMJ MjAwNS0wNy0wMyAxNDowMDo1MS4wMDAwMDAwMDAgKzAwMDAKKysrIHFlbXUtbmN1cnNlcy9ody92 Z2EuYwkyMDA1LTEyLTA5IDAzOjU5OjQ1LjAwMDAwMDAwMCArMDAwMApAQCAtMTEwMCwxNCArMTEw MCwxNCBAQAogICAgICAgICBzLT5jdXJzb3JfZW5kID0gcy0+Y3JbMHhiXTsKICAgICB9CiAgICAg Y3Vyc29yX3B0ciA9IHMtPnZyYW1fcHRyICsgKHMtPnN0YXJ0X2FkZHIgKyBjdXJzb3Jfb2Zmc2V0 KSAqIDQ7Ci0gICAgCisKICAgICBkZXB0aF9pbmRleCA9IGdldF9kZXB0aF9pbmRleChzLT5kcy0+ ZGVwdGgpOwogICAgIGlmIChjdyA9PSAxNikKICAgICAgICAgdmdhX2RyYXdfZ2x5cGg4ID0gdmdh X2RyYXdfZ2x5cGgxNl90YWJsZVtkZXB0aF9pbmRleF07CiAgICAgZWxzZQogICAgICAgICB2Z2Ff ZHJhd19nbHlwaDggPSB2Z2FfZHJhd19nbHlwaDhfdGFibGVbZGVwdGhfaW5kZXhdOwogICAgIHZn YV9kcmF3X2dseXBoOSA9IHZnYV9kcmF3X2dseXBoOV90YWJsZVtkZXB0aF9pbmRleF07Ci0gICAg CisKICAgICBkZXN0ID0gcy0+ZHMtPmRhdGE7CiAgICAgbGluZXNpemUgPSBzLT5kcy0+bGluZXNp emU7CiAgICAgY2hfYXR0cl9wdHIgPSBzLT5sYXN0X2NoX2F0dHI7CkBAIC0xNTA1LDcgKzE1MDUs NyBAQAogICAgICAgICAgICAgcy0+cmdiX3RvX3BpeGVsID0gcmdiX3RvX3BpeGVsMzJfZHVwOwog ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgZnVsbF91 cGRhdGUgPSAwOwogICAgICAgICBpZiAoIShzLT5hcl9pbmRleCAmIDB4MjApKSB7CiAgICAgICAg ICAgICBncmFwaGljX21vZGUgPSBHTU9ERV9CTEFOSzsKQEAgLTE4ODAsMyArMTg4MCwxNjUgQEAK ICAgICB9CiAgICAgcy0+ZHMgPSBzYXZlZF9kczsKIH0KKworI2RlZmluZSBURVhUTU9ERV9YKHgp CSgoeCkgJSB3aWR0aCkKKyNkZWZpbmUgVEVYVE1PREVfWSh4KQkoKHgpIC8gd2lkdGgpCisjZGVm aW5lIFZNRU0yQ0hUWVBFKHYpICAoKHYgJiAweGZmMDAwN2ZmKSB8IFwKKyAgICAgICAgKCh2ICYg MHgwMDAwMDgwMCkgPDwgMTApIHwgKCh2ICYgMHgwMDAwNzAwMCkgPj4gMSkpCisvKiByZWxheSB0 ZXh0IHJlbmRlcmluZyB0byBnaXZlbiBmdW5jdGlvbnMgKGkuZSBjdXJzZXMgZHJpdmVyKQorICog aW5zdGVhZCBvZiBkb2luZyBmdWxsIHZnYV91cGRhdGVfZGlzcGxheSgpICovCit2b2lkIHZnYV91 cGRhdGVfdGV4dCh1aW50OF90ICpjaGFyZGF0YSwgdm9pZCAoKmRweV9jdXJzb3IpKERpc3BsYXlT dGF0ZSAqcywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHkpKQoreworICAgIFZH QVN0YXRlICpzID0gdmdhX3N0YXRlOworICAgIGludCBncmFwaGljX21vZGUsIGksIGN1cnNvcl9v ZmZzZXQsIGN1cnNvcl92aXNpYmxlOworICAgIGludCBjdywgY2hlaWdodCwgd2lkdGgsIGhlaWdo dCwgc2l6ZSwgY19taW4sIGNfbWF4OworICAgIHVpbnQzMl90ICpzcmMsICpkc3QsIHZhbDsKKyAg ICBjaGFyIG1zZ19idWZmZXJbODBdOworICAgIGludCBmdWxsX3VwZGF0ZTsKKyAgICBmdWxsX3Vw ZGF0ZSA9IDA7CisKKyAgICBpZiAoIShzLT5hcl9pbmRleCAmIDB4MjApKSB7CisgICAgICAgIGdy YXBoaWNfbW9kZSA9IEdNT0RFX0JMQU5LOworICAgIH0gZWxzZSB7CisgICAgICAgIGdyYXBoaWNf bW9kZSA9IHMtPmdyWzZdICYgMTsKKyAgICB9CisgICAgaWYgKGdyYXBoaWNfbW9kZSAhPSBzLT5n cmFwaGljX21vZGUpIHsKKyAgICAgICAgcy0+Z3JhcGhpY19tb2RlID0gZ3JhcGhpY19tb2RlOwor ICAgICAgICBmdWxsX3VwZGF0ZSA9IDE7CisgICAgfQorICAgIGlmIChzLT5sYXN0X3dpZHRoID09 IC0xKSB7CisgICAgICAgIHMtPmxhc3Rfd2lkdGggPSAwOworICAgICAgICBmdWxsX3VwZGF0ZSA9 IDE7CisgICAgfQorCisgICAgc3dpdGNoKGdyYXBoaWNfbW9kZSkgeworICAgIGNhc2UgR01PREVf VEVYVDoKKyAgICAgICAgLyogVE9ETzogdXBkYXRlIHBhbGV0dGUgKi8KKyAgICAgICAgZnVsbF91 cGRhdGUgfD0gdXBkYXRlX2Jhc2ljX3BhcmFtcyhzKTsKKyAgICAKKyAgICAgICAgLyogdG90YWwg d2lkdGggJiBoZWlnaHQgKi8KKyAgICAgICAgY2hlaWdodCA9IChzLT5jcls5XSAmIDB4MWYpICsg MTsKKyAgICAgICAgY3cgPSA4OworICAgICAgICBpZiAoIShzLT5zclsxXSAmIDB4MDEpKQorICAg ICAgICAgICAgY3cgPSA5OworICAgICAgICBpZiAocy0+c3JbMV0gJiAweDA4KQorICAgICAgICAg ICAgY3cgPSAxNjsgLyogTk9URTogbm8gMTggcGl4ZWwgd2lkZSAqLworICAgICAgICB3aWR0aCA9 IChzLT5jclsweDAxXSArIDEpOworICAgICAgICBpZiAocy0+Y3JbMHgwNl0gPT0gMTAwKSB7Cisg ICAgICAgICAgICAvKiB1Z2x5IGhhY2sgZm9yIENHQSAxNjB4MTAweDE2IC0gZXhwbGFpbiBtZSB0 aGUgbG9naWMgKi8KKyAgICAgICAgICAgIGhlaWdodCA9IDEwMDsKKyAgICAgICAgfSBlbHNlIHsK KyAgICAgICAgICAgIGhlaWdodCA9IHMtPmNyWzB4MTJdIHwgCisgICAgICAgICAgICAgICAgKChz LT5jclsweDA3XSAmIDB4MDIpIDw8IDcpIHwgCisgICAgICAgICAgICAgICAgKChzLT5jclsweDA3 XSAmIDB4NDApIDw8IDMpOworICAgICAgICAgICAgaGVpZ2h0ID0gKGhlaWdodCArIDEpIC8gY2hl aWdodDsKKyAgICAgICAgfQorCisgICAgICAgIHNpemUgPSAoaGVpZ2h0ICogd2lkdGgpOworICAg ICAgICBpZiAoc2l6ZSA+IENIX0FUVFJfU0laRSkgeworICAgICAgICAgICAgaWYgKCFmdWxsX3Vw ZGF0ZSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIHNwcmludGYobXNn X2J1ZmZlciwgIiVpIHggJWkgVGV4dCBtb2RlIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAg ICBicmVhazsKKyAgICAgICAgfQorICAgIAorICAgICAgICBpZiAod2lkdGggIT0gcy0+bGFzdF93 aWR0aCB8fCBoZWlnaHQgIT0gcy0+bGFzdF9oZWlnaHQgfHwKKyAgICAgICAgICAgIGN3ICE9IHMt Pmxhc3RfY3cgfHwgY2hlaWdodCAhPSBzLT5sYXN0X2NoKSB7CisgICAgICAgICAgICBzLT5sYXN0 X3Njcl93aWR0aCA9IHdpZHRoICogY3c7CisgICAgICAgICAgICBzLT5sYXN0X3Njcl9oZWlnaHQg PSBoZWlnaHQgKiBjaGVpZ2h0OworICAgICAgICAgICAgZHB5X3Jlc2l6ZShzLT5kcywgd2lkdGgs IGhlaWdodCk7CisgICAgICAgICAgICBzLT5sYXN0X3dpZHRoID0gd2lkdGg7CisgICAgICAgICAg ICBzLT5sYXN0X2hlaWdodCA9IGhlaWdodDsKKyAgICAgICAgICAgIHMtPmxhc3RfY2ggPSBjaGVp Z2h0OworICAgICAgICAgICAgcy0+bGFzdF9jdyA9IGN3OworICAgICAgICAgICAgZnVsbF91cGRh dGUgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLyogVXBkYXRlICJoYXJkd2FyZSIgY3Vyc29y ICovCisgICAgICAgIGN1cnNvcl9vZmZzZXQgPSAoKHMtPmNyWzB4MGVdIDw8IDgpIHwgcy0+Y3Jb MHgwZl0pIC0gcy0+c3RhcnRfYWRkcjsKKyAgICAgICAgaWYgKGN1cnNvcl9vZmZzZXQgIT0gcy0+ Y3Vyc29yX29mZnNldCB8fAorICAgICAgICAgICAgcy0+Y3JbMHhhXSAhPSBzLT5jdXJzb3Jfc3Rh cnQgfHwKKyAgICAgICAgICAgIHMtPmNyWzB4Yl0gIT0gcy0+Y3Vyc29yX2VuZCB8fCBmdWxsX3Vw ZGF0ZSkgeworICAgICAgICAgICAgY3Vyc29yX3Zpc2libGUgPSAhKHMtPmNyWzB4YV0gJiAweDIw KTsKKyAgICAgICAgICAgIGlmIChjdXJzb3JfdmlzaWJsZSAmJiBjdXJzb3Jfb2Zmc2V0IDwgc2l6 ZSAmJiBjdXJzb3Jfb2Zmc2V0ID49IDApCisgICAgICAgICAgICAgICAgZHB5X2N1cnNvcihzLT5k cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFWFRNT0RFX1goY3Vyc29yX29mZnNldCks CisgICAgICAgICAgICAgICAgICAgICAgICAgICBURVhUTU9ERV9ZKGN1cnNvcl9vZmZzZXQpKTsK KyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkcHlfY3Vyc29yKHMtPmRzLCAtMSwg LTEpOworICAgICAgICAgICAgcy0+Y3Vyc29yX29mZnNldCA9IGN1cnNvcl9vZmZzZXQ7CisgICAg ICAgICAgICBzLT5jdXJzb3Jfc3RhcnQgPSBzLT5jclsweGFdOworICAgICAgICAgICAgcy0+Y3Vy c29yX2VuZCA9IHMtPmNyWzB4Yl07CisgICAgICAgIH0KKworICAgICAgICBzcmMgPSAodWludDMy X3QgKikgcy0+dnJhbV9wdHIgKyBzLT5zdGFydF9hZGRyOworICAgICAgICBkc3QgPSAodWludDMy X3QgKikgY2hhcmRhdGE7CisKKyAgICAgICAgaWYgKGZ1bGxfdXBkYXRlKSB7CisgICAgICAgICAg ICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgc3JjICsrLCBkc3QgKyssIGkgKyspIHsKKyAgICAgICAg ICAgICAgICB2YWwgPSBWTUVNMkNIVFlQRSgqc3JjKTsKKyAgICAgICAgICAgICAgICAqZHN0ID0g dmFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkcHlfdXBkYXRlKHMtPmRzLCAwLCAw LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNfbWF4ID0g MDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IHNyYyArKywgZHN0ICsrLCBp ICsrKSB7CisgICAgICAgICAgICAgICAgdmFsID0gVk1FTTJDSFRZUEUoKnNyYyk7CisgICAgICAg ICAgICAgICAgaWYgKCpkc3QgIT0gdmFsKSB7CisgICAgICAgICAgICAgICAgICAgICpkc3QgPSB2 YWw7CisgICAgICAgICAgICAgICAgICAgIGNfbWF4ID0gaTsKKyAgICAgICAgICAgICAgICAgICAg YnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY19t aW4gPSBpOworICAgICAgICAgICAgZm9yICg7IGkgPCBzaXplOyBzcmMgKyssIGRzdCArKywgaSAr KykgeworICAgICAgICAgICAgICAgIHZhbCA9IFZNRU0yQ0hUWVBFKCpzcmMpOworICAgICAgICAg ICAgICAgIGlmICgqZHN0ICE9IHZhbCkgeworICAgICAgICAgICAgICAgICAgICAqZHN0ID0gdmFs OworICAgICAgICAgICAgICAgICAgICBjX21heCA9IGk7CisgICAgICAgICAgICAgICAgfQorICAg ICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY19taW4gPD0gY19tYXgpIHsKKyAgICAgICAg ICAgICAgICBpID0gVEVYVE1PREVfWShjX21pbik7CisgICAgICAgICAgICAgICAgZHB5X3VwZGF0 ZShzLT5kcywgMCwgaSwgd2lkdGgsIFRFWFRNT0RFX1koY19tYXgpIC0gaSArIDEpOworICAgICAg ICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgR01PREVfR1JB UEg6CisgICAgICAgIGlmICghZnVsbF91cGRhdGUpCisgICAgICAgICAgICByZXR1cm47CisKKyAg ICAgICAgcy0+Z2V0X3Jlc29sdXRpb24ocywgJndpZHRoLCAmaGVpZ2h0KTsKKyAgICAgICAgc3By aW50Zihtc2dfYnVmZmVyLCAiJWkgeCAlaSBHcmFwaGljIG1vZGUiLCB3aWR0aCwgaGVpZ2h0KTsK KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTU9ERV9CTEFOSzoKKyAgICBkZWZhdWx0OgorICAg ICAgICBpZiAoIWZ1bGxfdXBkYXRlKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHNw cmludGYobXNnX2J1ZmZlciwgIlZHQSBCbGFuayBtb2RlIik7CisgICAgICAgIGJyZWFrOworICAg IH0KKworICAgIC8qIERpc3BsYXkgYSBtZXNzYWdlICovCisgICAgZHB5X2N1cnNvcihzLT5kcywg LTEsIC0xKTsKKyAgICBkcHlfcmVzaXplKHMtPmRzLCA2MCwgMyk7CisgICAgbWVtc2V0KGNoYXJk YXRhLCAwLCA2MCAqIDMgKiA0KTsKKyAgICBzaXplID0gc3RybGVuKG1zZ19idWZmZXIpOworICAg IHdpZHRoID0gKDYwIC0gc2l6ZSkgLyAyOworICAgIGZvciAoaSA9IDA7IGkgPCA2MCAqIDMgKiA0 OyBpICs9IDQpCisgICAgICAgIGNoYXJkYXRhW2ldID0gJyAnOworICAgIGZvciAoaSA9IDA7IGkg PCBzaXplOyBpICsrKSB7CisgICAgICAgIGNoYXJkYXRhWyg2MCArIHdpZHRoICsgaSkgKiA0XSA9 IG1zZ19idWZmZXJbaV07CisgICAgICAgIGNoYXJkYXRhWyg2MCArIHdpZHRoICsgaSkgKiA0ICsg MV0gPSAweDAxOyAvKiBjb2xvdXIgKi8KKyAgICAgICAgY2hhcmRhdGFbKDYwICsgd2lkdGggKyBp KSAqIDQgKyAyXSA9IDB4MjA7IC8qIGNvbG91ciAqLworICAgIH0KKyAgICBkcHlfdXBkYXRlKHMt PmRzLCAwLCAwLCA2MCwgMyk7Cit9CisvKiB2aW06IHNldCBhaSB0cz00IHN3PTQgZXQ6ICovCmRp ZmYgLU5hdXIgcWVtdS92bC5jIHFlbXUtbmN1cnNlcy92bC5jCi0tLSBxZW11L3ZsLmMJMjAwNS0x Mi0wNSAyMDozMTo1Mi4wMDAwMDAwMDAgKzAwMDAKKysrIHFlbXUtbmN1cnNlcy92bC5jCTIwMDUt MTItMDggMTk6MDA6NTcuMDAwMDAwMDAwICswMDAwCkBAIC0xMTUsNiArMTE1LDcgQEAKIGludCBi aW9zX3NpemU7CiBzdGF0aWMgRGlzcGxheVN0YXRlIGRpc3BsYXlfc3RhdGU7CiBpbnQgbm9ncmFw aGljOworaW50IGN1cnNlczsKIGNvbnN0IGNoYXIqIGtleWJvYXJkX2xheW91dCA9IE5VTEw7CiBp bnQ2NF90IHRpY2tzX3Blcl9zZWM7CiBpbnQgYm9vdF9kZXZpY2UgPSAnYyc7CkBAIC0zODQwLDYg KzM4NDEsOSBAQAogICAgICAgICAgICAiLWhkYWNocyBjLGgsc1ssdF0gIGZvcmNlIGhhcmQgZGlz ayAwIHBoeXNpY2FsIGdlb21ldHJ5IGFuZCB0aGUgb3B0aW9uYWwgQklPU1xuIgogICAgICAgICAg ICAiICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uICh0PW5vbmUgb3IgbGJhKSAodXN1YWxseSBx ZW11IGNhbiBndWVzcyB0aGVtKVxuIgogICAgICAgICAgICAiLUwgcGF0aCAgICAgICAgIHNldCB0 aGUgZGlyZWN0b3J5IGZvciB0aGUgQklPUyBhbmQgVkdBIEJJT1NcbiIKKyNpZmRlZiBDT05GSUdf Q1VSU0VTCisgICAgICAgICAgICItY3Vyc2VzICAgICAgICAgdXNlIGEgY3Vyc2VzL25jdXJzZXMg aW50ZXJmYWNlIGluc3RlYWQgb2YgU0RMXG4iCisjZW5kaWYKICNpZmRlZiBVU0VfS1FFTVUKICAg ICAgICAgICAgIi1uby1rcWVtdSAgICAgICBkaXNhYmxlIEtRRU1VIGtlcm5lbCBtb2R1bGUgdXNh Z2VcbiIKICNlbmRpZgpAQCAtMzkzNCw2ICszOTM4LDcgQEAKICAgICBRRU1VX09QVElPTl91c2Is CiAgICAgUUVNVV9PUFRJT05fdXNiZGV2aWNlLAogICAgIFFFTVVfT1BUSU9OX3NtcCwKKyAgICBR RU1VX09QVElPTl9jdXJzZXMsCiB9OwogCiB0eXBlZGVmIHN0cnVjdCBRRU1VT3B0aW9uIHsKQEAg LTM5ODQsNiArMzk4OSw5IEBACiAgICAgeyAiaGRhY2hzIiwgSEFTX0FSRywgUUVNVV9PUFRJT05f aGRhY2hzIH0sCiAgICAgeyAiTCIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX0wgfSwKICAgICB7ICJu by1jb2RlLWNvcHkiLCAwLCBRRU1VX09QVElPTl9ub19jb2RlX2NvcHkgfSwKKyNpZmRlZiBDT05G SUdfQ1VSU0VTCisgICAgeyAiY3Vyc2VzIiwgMCwgUUVNVV9PUFRJT05fY3Vyc2VzIH0sCisjZW5k aWYKICNpZmRlZiBVU0VfS1FFTVUKICAgICB7ICJuby1rcWVtdSIsIDAsIFFFTVVfT1BUSU9OX25v X2txZW11IH0sCiAjZW5kaWYKQEAgLTQyMDIsNiArNDIxMCw3IEBACiAjZW5kaWYKICAgICBzbmFw c2hvdCA9IDA7CiAgICAgbm9ncmFwaGljID0gMDsKKyAgICBjdXJzZXMgPSAwOwogICAgIGtlcm5l bF9maWxlbmFtZSA9IE5VTEw7CiAgICAga2VybmVsX2NtZGxpbmUgPSAiIjsKICNpZmRlZiBUQVJH RVRfUFBDCkBAIC00MzM1LDcgKzQzNDQsMTYgQEAKICAgICAgICAgICAgICAgICBwc3RyY3B5KG1v bml0b3JfZGV2aWNlLCBzaXplb2YobW9uaXRvcl9kZXZpY2UpLCAic3RkaW8iKTsKICAgICAgICAg ICAgICAgICBwc3RyY3B5KHNlcmlhbF9kZXZpY2VzWzBdLCBzaXplb2Yoc2VyaWFsX2RldmljZXNb MF0pLCAic3RkaW8iKTsKICAgICAgICAgICAgICAgICBub2dyYXBoaWMgPSAxOworICAgICAgICAg ICAgICAgIGN1cnNlcyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgQ09ORklH X0NVUlNFUworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9jdXJzZXM6CisgICAgICAgICAg ICAgICAgcHN0cmNweShtb25pdG9yX2RldmljZSwgc2l6ZW9mKG1vbml0b3JfZGV2aWNlKSwgInZj Iik7CisgICAgICAgICAgICAgICAgcHN0cmNweShzZXJpYWxfZGV2aWNlc1swXSwgc2l6ZW9mKHNl cmlhbF9kZXZpY2VzWzBdKSwgInZjIik7CisgICAgICAgICAgICAgICAgY3Vyc2VzID0gMTsKKwkJ bm9ncmFwaGljID0gMDsKICAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgogICAgICAgICAg ICAgY2FzZSBRRU1VX09QVElPTl9rZXJuZWw6CiAgICAgICAgICAgICAgICAga2VybmVsX2ZpbGVu YW1lID0gb3B0YXJnOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNDcxNCw3ICs0NzMyLDEz IEBACiAgICAgLyogdGVybWluYWwgaW5pdCAqLwogICAgIGlmIChub2dyYXBoaWMpIHsKICAgICAg ICAgZHVtYl9kaXNwbGF5X2luaXQoZHMpOwotICAgIH0gZWxzZSB7CisgICAgfSBlbHNlCisjaWYg ZGVmaW5lZChDT05GSUdfQ1VSU0VTKQorICAgIGlmIChjdXJzZXMpIHsKKyAgICAgICAgY3Vyc2Vz X2Rpc3BsYXlfaW5pdChkcywgZnVsbF9zY3JlZW4pOworICAgIH0gZWxzZQorI2VuZGlmCisgICAg ewogI2lmIGRlZmluZWQoQ09ORklHX1NETCkKICAgICAgICAgc2RsX2Rpc3BsYXlfaW5pdChkcywg ZnVsbF9zY3JlZW4pOwogI2VsaWYgZGVmaW5lZChDT05GSUdfQ09DT0EpCkBAIC00NzI1LDcgKzQ3 NDksNyBAQAogICAgIH0KIAogICAgIHZnYV9jb25zb2xlID0gZ3JhcGhpY19jb25zb2xlX2luaXQo ZHMpOwotICAgIAorCiAgICAgbW9uaXRvcl9oZCA9IHFlbXVfY2hyX29wZW4obW9uaXRvcl9kZXZp Y2UpOwogICAgIGlmICghbW9uaXRvcl9oZCkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFl bXU6IGNvdWxkIG5vdCBvcGVuIG1vbml0b3IgZGV2aWNlICclcydcbiIsIG1vbml0b3JfZGV2aWNl KTsKZGlmZiAtTmF1ciBxZW11L3ZsLmggcWVtdS1uY3Vyc2VzL3ZsLmgKLS0tIHFlbXUvdmwuaAky MDA1LTEyLTA1IDIwOjMxOjUyLjAwMDAwMDAwMCArMDAwMAorKysgcWVtdS1uY3Vyc2VzL3ZsLmgJ MjAwNS0xMi0wOCAxODo1OToyNC4wMDAwMDAwMDAgKzAwMDAKQEAgLTI2NSw2ICsyNjUsNyBAQAog aW50IGlzX2FjdGl2ZV9jb25zb2xlKFRleHRDb25zb2xlICpzKTsKIENoYXJEcml2ZXJTdGF0ZSAq dGV4dF9jb25zb2xlX2luaXQoRGlzcGxheVN0YXRlICpkcyk7CiB2b2lkIGNvbnNvbGVfc2VsZWN0 KHVuc2lnbmVkIGludCBpbmRleCk7CitUZXh0Q29uc29sZSAqZ2V0X2FjdGl2ZV9jb25zb2xlKCk7 CiAKIC8qIHNlcmlhbCBwb3J0cyAqLwogCkBAIC02NTIsNiArNjUzLDggQEAKIHZvaWQgdmdhX3Vw ZGF0ZV9kaXNwbGF5KHZvaWQpOwogdm9pZCB2Z2FfaW52YWxpZGF0ZV9kaXNwbGF5KHZvaWQpOwog dm9pZCB2Z2Ffc2NyZWVuX2R1bXAoY29uc3QgY2hhciAqZmlsZW5hbWUpOwordm9pZCB2Z2FfdXBk YXRlX3RleHQodWludDhfdCAqY2hhcmRhdGEsIHZvaWQgKCpkcHlfY3Vyc29yKQorICAgICAgICAg ICAgICAgICAgICAgIChEaXNwbGF5U3RhdGUgKnMsIGludCB4LCBpbnQgeSkpOwogCiAvKiBjaXJy dXNfdmdhLmMgKi8KIHZvaWQgcGNpX2NpcnJ1c192Z2FfaW5pdChQQ0lCdXMgKmJ1cywgRGlzcGxh eVN0YXRlICpkcywgdWludDhfdCAqdmdhX3JhbV9iYXNlLCAKQEAgLTY2NSw2ICs2NjgsOSBAQAog LyogY29jb2EubSAqLwogdm9pZCBjb2NvYV9kaXNwbGF5X2luaXQoRGlzcGxheVN0YXRlICpkcywg aW50IGZ1bGxfc2NyZWVuKTsKIAorLyogY3Vyc2VzLmMgKi8KK3ZvaWQgY3Vyc2VzX2Rpc3BsYXlf aW5pdChEaXNwbGF5U3RhdGUgKmRzLCBpbnQgZnVsbF9zY3JlZW4pOworCiAvKiBpZGUuYyAqLwog I2RlZmluZSBNQVhfRElTS1MgNAogCg== ------=_Part_11947_10453224.1134202642118--