From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1TasQH-0000gA-VC for mharc-grub-devel@gnu.org; Tue, 20 Nov 2012 13:19:49 -0500 Received: from eggs.gnu.org ([208.118.235.92]:55025) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TasQC-0000g3-FH for grub-devel@gnu.org; Tue, 20 Nov 2012 13:19:48 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TasQ6-0001wm-AQ for grub-devel@gnu.org; Tue, 20 Nov 2012 13:19:44 -0500 Received: from service87.mimecast.com ([91.220.42.44]:56030) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TasQ5-0001w9-6e for grub-devel@gnu.org; Tue, 20 Nov 2012 13:19:38 -0500 Received: from cam-owa2.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.21]) by service87.mimecast.com; Tue, 20 Nov 2012 18:19:33 +0000 Received: from e200687 ([10.1.255.212]) by cam-owa2.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Tue, 20 Nov 2012 18:19:32 +0000 From: "Leif Lindholm" To: Subject: [RFCv2] GRUB port for ARMv7-A U-Boot Date: Tue, 20 Nov 2012 18:19:31 -0000 Message-ID: <000001cdc74b$96245310$c26cf930$@lindholm@arm.com> MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: Ac3HS5XMUe6bF6PFTBeE2DGu0UNf5A== Content-Language: en-gb X-OriginalArrivalTime: 20 Nov 2012 18:19:32.0170 (UTC) FILETIME=[964CC2A0:01CDC74B] X-MC-Unique: 112112018193305001 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0001_01CDC74B.96245310" X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 91.220.42.44 X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 20 Nov 2012 18:19:48 -0000 This is a multi-part message in MIME format. ------=_NextPart_000_0001_01CDC74B.96245310 Content-Type: text/plain; charset=WINDOWS-1252 Content-Transfer-Encoding: quoted-printable This is an updated patch for enabling support for running under ARMv7-A U-Boot, based on some of Colin's feedback during UDS. This is somewhat better tested from a usage-standpoint, having added necessary support to commands like grub-install. The version contained in this patch is also available as revision 4613 from lp:~leif-lindholm/linaro-grub/arm-uboot. Basic build and usage documentation is being kept at https://wiki.linaro.org/LEG/Kernel/GRUB Third-party code ---------------- I have rewritten the U-Boot glue layer in as much of a clean-room way as can be done with a fairly trivial piece of code that you've already read through a lot. This also gets rid of the special crc32 code. The api_public.h header (GPLv2+, (c) Rafal Jaworowski) is still included. The standalone "libgcc" helper implementation remains - there is no safe workaround for the __clear_cache() issue, and requiring a parallel embedded toolchain specifically for building GRUB does not make sense. Nevertheless, all of the included code is (c) FSF. libfdt (see below). FDT --- I did look into reusing the openfirmware code for device-tree handling, but found no actual handling code in there. All actual scanning and manipulation is performed through callbacks into openfirmware (using IEEE1275_CALL_ENTRY_FN()). So now I have tried instead to import libfdt the way gcrypt and Unicode is imported. It generates a grub-core/Makefile.libfdt.def exporting a library which is for now used only by the Linux loader. Other ----- The hack of calling uboot-mkimage from within grub-mkimage is now gone - this is done more correctly by grub-install instead. grub-install uses the UUID "trick" to make Grub find its modules now, alleviating the need for special U-Boot environment variables. Limitations ----------- - Dynamic linker implemented only for ARMv7-A Thumb instruction set. - Currently runs uncached, with MMU off. - No support for ATAG parsing or rewriting, only supports device tree as a means of passing information to the Linux kernel. (If an ATAG list is passed from U-Boot, it can be passed on unmodified, but the "linux" command will not pass on command line parameters.) - Currently a statically linked kernel, requires RAM at 0x08000000. - No write support for block devices. Not provided by U-Boot. Missing ------- Still, the testbench support and qemu configurations for grub-shell and its dependents. grub-mkrescue Potential future developments ----------------------------- - Implement networking support. - Make GRUB kernel a fully relocateable ELF. - Implement chainloader. - Enable caches/MMU. Comments welcome. ------=_NextPart_000_0001_01CDC74B.96245310 Content-Transfer-Encoding: base64 Content-Type: application/octet-stream; name="armv7-uboot-v2.patch" Content-Disposition: attachment; filename="armv7-uboot-v2.patch" ZGlmZiAtcHVyTiB0cnVuay9hdXRvZ2VuLnNoIGFybS11Ym9vdC9hdXRvZ2VuLnNoCi0tLSB0cnVu ay9hdXRvZ2VuLnNoCTIwMTItMTEtMjAgMTY6MjE6NDQuODYzMDMyMDAwICswMDAwCisrKyBhcm0t dWJvb3QvYXV0b2dlbi5zaAkyMDEyLTExLTIwIDE2OjI2OjU0Ljk1MDkyMDAwMCArMDAwMApAQCAt MTQsNiArMTQsOSBAQCBweXRob24gdXRpbC9pbXBvcnRfdW5pY29kZS5weSB1bmljb2RlL1VuCiBl Y2hvICJJbXBvcnRpbmcgbGliZ2NyeXB0Li4uIgogcHl0aG9uIHV0aWwvaW1wb3J0X2djcnkucHkg Z3J1Yi1jb3JlL2xpYi9saWJnY3J5cHQvIGdydWItY29yZQogCitlY2hvICJJbXBvcnRpbmcgbGli ZmR0Li4uIgorcHl0aG9uIHV0aWwvaW1wb3J0X2xpYmZkdC5weSBncnViLWNvcmUvbGliL2R0Yy8g Z3J1Yi1jb3JlCisKIGVjaG8gIkNyZWF0aW5nIE1ha2VmaWxlLnRwbC4uLiIKIHB5dGhvbiBnZW50 cGwucHkgfCBzZWQgLWUgJy9eJC97TjsvXlxuJC9EO30nID4gTWFrZWZpbGUudHBsCiAKQEAgLTI3 LDcgKzMwLDcgQEAgaWYgWyAieCR7R1JVQl9DT05UUklCfSIgIT0geCBdOyB0aGVuCiBmaQogCiBV VElMX0RFRlM9J01ha2VmaWxlLnV0aWwuZGVmIE1ha2VmaWxlLnV0aWxnY3J5LmRlZicKLUNPUkVf REVGUz0nZ3J1Yi1jb3JlL01ha2VmaWxlLmNvcmUuZGVmIGdydWItY29yZS9NYWtlZmlsZS5nY3J5 LmRlZicKK0NPUkVfREVGUz0nZ3J1Yi1jb3JlL01ha2VmaWxlLmNvcmUuZGVmIGdydWItY29yZS9N YWtlZmlsZS5nY3J5LmRlZiBncnViLWNvcmUvTWFrZWZpbGUubGliZmR0LmRlZicKIAogZm9yIGV4 dHJhIGluIGNvbnRyaWIvKi9NYWtlZmlsZS51dGlsLmRlZjsgZG8KICAgaWYgdGVzdCAtZSAiJGV4 dHJhIjsgdGhlbgpkaWZmIC1wdXJOIHRydW5rLy5ienJpZ25vcmUgYXJtLXVib290Ly5ienJpZ25v cmUKLS0tIHRydW5rLy5ienJpZ25vcmUJMjAxMi0xMS0yMCAxNjoyMTo0NC44NjMwMzIwMDAgKzAw MDAKKysrIGFybS11Ym9vdC8uYnpyaWdub3JlCTIwMTItMTEtMjAgMTY6MjY6NTQuOTUwOTIwMDAw ICswMDAwCkBAIC0xMjgsNiArMTI4LDcgQEAgZGVwY29tcAogbWRhdGUtc2gKIHRleGluZm8udGV4 CiBncnViLWNvcmUvbGliL2xpYmdjcnlwdC1ncnViCitncnViLWNvcmUvbGliL2R0Yy1ncnViCiAq Ki8uZGVwcwogKiovLmRlcHMtdXRpbAogKiovLmRlcHMtY29yZQpAQCAtMTM2LDYgKzEzNyw3IEBA IE1ha2VmaWxlLnV0aWwuYW0KIGNvbnRyaWIKIGdydWItY29yZS9NYWtlZmlsZS5jb3JlLmFtCiBn cnViLWNvcmUvTWFrZWZpbGUuZ2NyeS5kZWYKK2dydWItY29yZS9NYWtlZmlsZS5saWJmZHQuZGVm CiBncnViLWNvcmUvY29udHJpYgogZ3J1Yi1jb3JlL2dkYl9ncnViCiBncnViLWNvcmUvZ2VubW9k LnNoCmRpZmYgLXB1ck4gdHJ1bmsvY29uZi9NYWtlZmlsZS5jb21tb24gYXJtLXVib290L2NvbmYv TWFrZWZpbGUuY29tbW9uCi0tLSB0cnVuay9jb25mL01ha2VmaWxlLmNvbW1vbgkyMDEyLTExLTIw IDE2OjIxOjQ0Ljg2MzAzMjAwMCArMDAwMAorKysgYXJtLXVib290L2NvbmYvTWFrZWZpbGUuY29t bW9uCTIwMTItMTEtMjAgMTY6MjY6NTQuOTUwOTIwMDAwICswMDAwCkBAIC0zNyw2ICszNywxMiBA QCBpZiBDT05EX3NwYXJjNjRfaWVlZTEyNzUKICAgQ0ZMQUdTX1BMQVRGT1JNICs9IC1tbm8tYXBw LXJlZ3MKICAgTERGTEFHU19QTEFURk9STSA9IC1XbCwtbWVsZjY0X3NwYXJjIC1tbm8tcmVsYXgK IGVuZGlmCitpZiBDT05EX2FybQorIyBJbWFnZSBlbnRyeSBwb2ludCBhbHdheXMgaW4gQVJNIChB MzIpIHN0YXRlIC0gZW5zdXJlIHByb3BlciBmdW5jdGlvbmFsaXR5IGlmCisjIHRoZSByZXN0IGlz IGJ1aWx0IGZvciB0aGUgVGh1bWIgKFQzMikgc3RhdGUuCisgIENGTEFHU19QTEFURk9STSArPSAt bXRodW1iLWludGVyd29yayAtbW5vLXVuYWxpZ25lZC1hY2Nlc3MKKyAgQ0NBU0ZMQUdTX1BMQVRG T1JNID0gLVdhLC1taW1wbGljaXQtaXQ9dGh1bWIKK2VuZGlmCiAKICMgT3RoZXIgb3B0aW9ucwog CkBAIC01OCw2ICs2NCw3IEBAIGlmICEgQ09ORF9pMzg2X2NvcmVib290CiBpZiAhIENPTkRfaTM4 Nl9tdWx0aWJvb3QKIGlmICEgQ09ORF9pMzg2X2llZWUxMjc1CiBpZiAhIENPTkRfeDg2XzY0X2Vm aQoraWYgISBDT05EX2FybQogTERBRERfS0VSTkVMICs9IC1sZ2NjCiBlbmRpZgogZW5kaWYKQEAg LTY2LDkgKzczLDE0IEBAIGVuZGlmCiBlbmRpZgogZW5kaWYKIGVuZGlmCitlbmRpZgogCiBDRkxB R1NfS0VSTkVMID0gJChDRkxBR1NfQ1BVKSAkKENGTEFHU19QTEFURk9STSkgLWZmcmVlc3RhbmRp bmcKK2lmICEgQ09ORF9hcm0KIExERkxBR1NfS0VSTkVMID0gJChMREZMQUdTX0NQVSkgJChMREZM QUdTX1BMQVRGT1JNKSAtbm9zdGRsaWIgJChUQVJHRVRfTERGTEFHU19PTERNQUdJQykgLXN0YXRp Yy1saWJnY2MKK2Vsc2UKK0xERkxBR1NfS0VSTkVMID0gJChMREZMQUdTX0NQVSkgJChMREZMQUdT X1BMQVRGT1JNKSAtbm9zdGRsaWIgJChUQVJHRVRfTERGTEFHU19PTERNQUdJQykKK2VuZGlmCiBD UFBGTEFHU19LRVJORUwgPSAkKENQUEZMQUdTX0NQVSkgJChDUFBGTEFHU19QTEFURk9STSkKIEND QVNGTEFHU19LRVJORUwgPSAkKENDQVNGTEFHU19DUFUpICQoQ0NBU0ZMQUdTX1BMQVRGT1JNKQog aWYgQ09ORF9DWUdXSU4KQEAgLTEwOCw2ICsxMjAsOCBAQCBDUFBGTEFHU19HQ1JZID0gLUkkKHRv cF9zcmNkaXIpL2dydWItY29yCiBDRkxBR1NfR05VTElCID0gLVduby11bmRlZiAtV25vLXNpZ24t Y29tcGFyZSAtV25vLXVudXNlZCAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVduby1yZWR1bmRhbnQt ZGVjbHMgLVduby11bnJlYWNoYWJsZS1jb2RlIC1Xbm8tY29udmVyc2lvbiAtV25vLW9sZC1zdHls ZS1kZWZpbml0aW9uIC1Xbm8tdW5zYWZlLWxvb3Atb3B0aW1pemF0aW9ucwogQ1BQRkxBR1NfR05V TElCID0gLUkkKHRvcF9idWlsZGRpcikvZ3J1Yi1jb3JlL2dudWxpYiAtSSQodG9wX3NyY2Rpcikv Z3J1Yi1jb3JlL2dudWxpYgogCitDUFBGTEFHU19MSUJGRFQgPSAtSSQodG9wX3NyY2RpcikvZ3J1 Yi1jb3JlL2xpYi9kdGMtZ3J1Yi9saWJmZHQKKwogQ0ZMQUdTX1BPU0lYID0gLWZuby1idWlsdGlu CiBDUFBGTEFHU19QT1NJWCA9IC1JJCh0b3Bfc3JjZGlyKS9ncnViLWNvcmUvbGliL3Bvc2l4X3dy YXAKIApkaWZmIC1wdXJOIHRydW5rL2NvbmZpZ3VyZS5hYyBhcm0tdWJvb3QvY29uZmlndXJlLmFj Ci0tLSB0cnVuay9jb25maWd1cmUuYWMJMjAxMi0xMS0yMCAxNjoyMTo0NC44NjMwMzIwMDAgKzAw MDAKKysrIGFybS11Ym9vdC9jb25maWd1cmUuYWMJMjAxMi0xMS0yMCAxNjoyNjo1NC45NTA5MjAw MDAgKzAwMDAKQEAgLTc5LDYgKzc5LDkgQEAgY2FzZSAiJHRhcmdldF9jcHUiIGluCiAgICAgICAg ICAgICAgICAgdGFyZ2V0X2NwdT1taXBzOwogCQltYWNoaW5lX0NQUEZMQUdTPSIkbWFjaGluZV9D UFBGTEFHUyAtREdSVUJfQ1BVX01JUFM9MSI7CiAJCTs7CisgIGFybSopCisJCXRhcmdldF9jcHU9 YXJtOworCQk7OwogZXNhYwogCiAjIFNwZWNpZnkgdGhlIHBsYXRmb3JtIChzdWNoIGFzIGZpcm13 YXJlKS4KQEAgLTk5LDYgKzEwMiw3IEBAIGlmIHRlc3QgIngkd2l0aF9wbGF0Zm9ybSIgPSB4OyB0 aGVuCiAgICAgbWlwc2VsLSopIHBsYXRmb3JtPWxvb25nc29uIDs7CiAgICAgbWlwcy0qKSBwbGF0 Zm9ybT1hcmMgOzsKICAgICBpYTY0LSopIHBsYXRmb3JtPWVmaSA7OworICAgIGFybS0qKSBwbGF0 Zm9ybT11Ym9vdCA7OwogICAgICopIEFDX01TR19FUlJPUihbdW5zdXBwb3J0ZWQgQ1BVOiAiJHRh cmdldF9jcHUiXSkgOzsKICAgZXNhYwogZWxzZQpAQCAtMTMzLDYgKzEzNyw3IEBAIGNhc2UgIiR0 YXJnZXRfY3B1Ii0iJHBsYXRmb3JtIiBpbgogICBtaXBzZWwteWVlbG9vbmcpIHBsYXRmb3JtPWxv b25nc29uIDs7CiAgIG1pcHNlbC1mdWxvb25nKSBwbGF0Zm9ybT1sb29uZ3NvbiA7OwogICBtaXBz ZWwtbG9vbmdzb24pIDs7CisgIGFybS11Ym9vdCkgcGxhdGZvcm09dWJvb3QgOzsKICAgKi1lbXUp IDs7CiAgICopIEFDX01TR19FUlJPUihbcGxhdGZvcm0gIiRwbGF0Zm9ybSIgaXMgbm90IHN1cHBv cnRlZCBmb3IgdGFyZ2V0IENQVSAiJHRhcmdldF9jcHUiXSkgOzsKIGVzYWMKQEAgLTE2NCw2ICsx NjksNyBAQCBjYXNlICIkcGxhdGZvcm0iIGluCiAgIG11bHRpYm9vdCkJbWFjaGluZV9DUFBGTEFH Uz0iJG1hY2hpbmVfQ1BQRkxBR1MgLURHUlVCX01BQ0hJTkVfTVVMVElCT09UPTEiIDs7CiAgIGVm aSkJCW1hY2hpbmVfQ1BQRkxBR1M9IiRtYWNoaW5lX0NQUEZMQUdTIC1ER1JVQl9NQUNISU5FX0VG ST0xIiA7OwogICBpZWVlMTI3NSkJbWFjaGluZV9DUFBGTEFHUz0iJG1hY2hpbmVfQ1BQRkxBR1Mg LURHUlVCX01BQ0hJTkVfSUVFRTEyNzU9MSIgOzsKKyAgdWJvb3QpCW1hY2hpbmVfQ1BQRkxBR1M9 IiRtYWNoaW5lX0NQUEZMQUdTIC1ER1JVQl9NQUNISU5FX1VCT09UPTEiIDs7CiAgIHFlbXUpCQlt YWNoaW5lX0NQUEZMQUdTPSIkbWFjaGluZV9DUFBGTEFHUyAtREdSVUJfTUFDSElORV9RRU1VPTEi IDs7CiAgIHBjKQkJbWFjaGluZV9DUFBGTEFHUz0iJG1hY2hpbmVfQ1BQRkxBR1MgLURHUlVCX01B Q0hJTkVfUENCSU9TPTEiIDs7CiAgIGVtdSkJCW1hY2hpbmVfQ1BQRkxBR1M9IiRtYWNoaW5lX0NQ UEZMQUdTIC1ER1JVQl9NQUNISU5FX0VNVT0xIiA7OwpAQCAtMTcyLDYgKzE3OCw3IEBAIGNhc2Ug IiRwbGF0Zm9ybSIgaW4KICAgYXJjKQltYWNoaW5lX0NQUEZMQUdTPSIkbWFjaGluZV9DUFBGTEFH UyAtREdSVUJfTUFDSElORV9BUkM9MSIgOzsKIGVzYWMKIGNhc2UgIiR0YXJnZXRfY3B1IiBpbgor ICBhcm0pICAgICAgCW1hY2hpbmVfQ1BQRkxBR1M9IiRtYWNoaW5lX0NQUEZMQUdTIC1ER1JVQl9N QUNISU5FX0FSTT0xIiA7OwogICBtaXBzIHxtaXBzZWwpICAgICAgCW1hY2hpbmVfQ1BQRkxBR1M9 IiRtYWNoaW5lX0NQUEZMQUdTIC1ER1JVQl9NQUNISU5FX01JUFM9MSIgOzsKICAgc3BhcmM2NCkg ICAgICBtYWNoaW5lX0NQUEZMQUdTPSIkbWFjaGluZV9DUFBGTEFHUyAtREdSVUJfTUFDSElORV9T UEFSQzY0PTEiIDs7CiBlc2FjCkBAIC02NjksNyArNjc2LDggQEAgZWxzZQogQ0ZMQUdTPSIkVEFS R0VUX0NGTEFHUyAtbm9zdGRsaWIgLVdsLC0tZGVmc3ltLF9fX21haW49MHg4MTAwIC1Xbm8tZXJy b3IiCiBmaQogQ1BQRkxBR1M9IiRUQVJHRVRfQ1BQRkxBR1MiCi1pZiB0ZXN0IHgkdGFyZ2V0X2Nw dSA9IHhpMzg2IHx8IHRlc3QgeCR0YXJnZXRfY3B1ID0geHg4Nl82NCA7IHRoZW4KKworaWYgdGVz dCB4JHRhcmdldF9jcHUgPSB4aTM4NiB8fCB0ZXN0IHgkdGFyZ2V0X2NwdSA9IHh4ODZfNjQgfHwg dGVzdCB4JHRhcmdldF9jcHUgPSB4YXJtIDsgdGhlbgogTElCUz0KIGVsc2UKIExJQlM9LWxnY2MK QEAgLTExMTYsNiArMTEyNCw4IEBAIEFNX0NPTkRJVElPTkFMKFtDT05EX3Bvd2VycGNfaWVlZTEy NzVdLAogQU1fQ09ORElUSU9OQUwoW0NPTkRfbWlwc10sIFt0ZXN0IHgkdGFyZ2V0X2NwdSA9IHht aXBzIC1vIHgkdGFyZ2V0X2NwdSA9IHhtaXBzZWxdKQogQU1fQ09ORElUSU9OQUwoW0NPTkRfbWlw c2VsXSwgW3Rlc3QgeCR0YXJnZXRfY3B1ID0geG1pcHNlbF0pCiBBTV9DT05ESVRJT05BTChbQ09O RF9taXBzZWJdLCBbdGVzdCB4JHRhcmdldF9jcHUgPSB4bWlwc10pCitBTV9DT05ESVRJT05BTChb Q09ORF9hcm1dLCBbdGVzdCB4JHRhcmdldF9jcHUgPSB4YXJtIF0pCitBTV9DT05ESVRJT05BTChb Q09ORF9hcm1fdWJvb3RdLCBbdGVzdCB4JHRhcmdldF9jcHUgPSB4YXJtIC1hIHgkcGxhdGZvcm0g PSB4dWJvb3RdKQogCiBBTV9DT05ESVRJT05BTChbQ09ORF9IT1NUX0hVUkRdLCBbdGVzdCB4JGhv c3Rfa2VybmVsID0geGh1cmRdKQogQU1fQ09ORElUSU9OQUwoW0NPTkRfSE9TVF9MSU5VWF0sIFt0 ZXN0IHgkaG9zdF9rZXJuZWwgPSB4bGludXhdKQpkaWZmIC1wdXJOIHRydW5rL2dlbnRwbC5weSBh cm0tdWJvb3QvZ2VudHBsLnB5Ci0tLSB0cnVuay9nZW50cGwucHkJMjAxMi0xMS0yMCAxNjoyMTo0 NC44NjMwMzIwMDAgKzAwMDAKKysrIGFybS11Ym9vdC9nZW50cGwucHkJMjAxMi0xMS0yMCAxNjoy Njo1NC45NTA5MjAwMDAgKzAwMDAKQEAgLTIzLDcgKzIzLDcgQEAgR1JVQl9QTEFURk9STVMgPSBb ICJlbXUiLCAiaTM4Nl9wYyIsICJpMwogICAgICAgICAgICAgICAgICAgICJpMzg2X211bHRpYm9v dCIsICJpMzg2X2llZWUxMjc1IiwgIng4Nl82NF9lZmkiLAogICAgICAgICAgICAgICAgICAgICJt aXBzX2xvb25nc29uIiwgInNwYXJjNjRfaWVlZTEyNzUiLAogICAgICAgICAgICAgICAgICAgICJw b3dlcnBjX2llZWUxMjc1IiwgIm1pcHNfYXJjIiwgImlhNjRfZWZpIiwKLSAgICAgICAgICAgICAg ICAgICAibWlwc19xZW11X21pcHMiIF0KKyAgICAgICAgICAgICAgICAgICAibWlwc19xZW11X21p cHMiLCAiYXJtX3Vib290IiBdCiAKIEdST1VQUyA9IHt9CiAKQEAgLTM2LDEwICszNiwxMiBAQCBH Uk9VUFNbIng4NiJdICAgICAgPSBHUk9VUFNbImkzODYiXSArIEdSCiBHUk9VUFNbIm1pcHMiXSAg ICAgPSBbICJtaXBzX2xvb25nc29uIiwgIm1pcHNfcWVtdV9taXBzIiwgIm1pcHNfYXJjIiBdCiBH Uk9VUFNbInNwYXJjNjQiXSAgPSBbICJzcGFyYzY0X2llZWUxMjc1IiBdCiBHUk9VUFNbInBvd2Vy cGMiXSAgPSBbICJwb3dlcnBjX2llZWUxMjc1IiBdCitHUk9VUFNbImFybSJdICAgICAgPSBbICJh cm1fdWJvb3QiIF0KIAogIyBHcm91cHMgYmFzZWQgb24gZmlybXdhcmUKIEdST1VQU1siZWZpIl0g ID0gWyAiaTM4Nl9lZmkiLCAieDg2XzY0X2VmaSIsICJpYTY0X2VmaSIgXQogR1JPVVBTWyJpZWVl MTI3NSJdICAgPSBbICJpMzg2X2llZWUxMjc1IiwgInNwYXJjNjRfaWVlZTEyNzUiLCAicG93ZXJw Y19pZWVlMTI3NSIgXQorR1JPVVBTWyJ1Ym9vdCJdID0gWyAiYXJtX3Vib290IiBdCiAKICMgZW11 IGlzIGEgc3BlY2lhbCBjYXNlIHNvIG1hbnkgY29yZSBmdW5jdGlvbmFsaXR5IGlzbid0IG5lZWRl ZCBvbiB0aGlzIHBsYXRmb3JtCiBHUk9VUFNbIm5vZW11Il0gICA9IEdSVUJfUExBVEZPUk1TWzpd OyBHUk9VUFNbIm5vZW11Il0ucmVtb3ZlKCJlbXUiKQpAQCAtNTcsMTAgKzU5LDEzIEBAIEdST1VQ U1sidmlkZW9tb2R1bGVzIl0gICA9IEdSVUJfUExBVEZPUk0KIGZvciBpIGluIEdST1VQU1sidmlk ZW9pbmtlcm5lbCJdOiBHUk9VUFNbInZpZGVvbW9kdWxlcyJdLnJlbW92ZShpKQogCiAjIFNpbWls YXIgZm9yIHRlcm1pbmZvCi1HUk9VUFNbInRlcm1pbmZvaW5rZXJuZWwiXSA9IFsibWlwc19sb29u Z3NvbiIsICJtaXBzX2FyYyIsICJtaXBzX3FlbXVfbWlwcyIgXSArIEdST1VQU1siaWVlZTEyNzUi XTsKK0dST1VQU1sidGVybWluZm9pbmtlcm5lbCJdID0gWyJtaXBzX2xvb25nc29uIiwgIm1pcHNf YXJjIiwgIm1pcHNfcWVtdV9taXBzIiBdICsgR1JPVVBTWyJpZWVlMTI3NSJdICsgR1JPVVBTWyJ1 Ym9vdCJdOwogR1JPVVBTWyJ0ZXJtaW5mb21vZHVsZSJdICAgPSBHUlVCX1BMQVRGT1JNU1s6XTsK IGZvciBpIGluIEdST1VQU1sidGVybWluZm9pbmtlcm5lbCJdOiBHUk9VUFNbInRlcm1pbmZvbW9k dWxlIl0ucmVtb3ZlKGkpCiAKKyMgRmxhdHRlbmVkIERldmljZSBUcmVlcyAoRkRUKQorR1JPVVBT WyJmZHQiXSA9IFsgImFybV91Ym9vdCIgXQorCiAjIE1pc2NlbGFuZW91cyBncm91cHMgc2NoZWR1 bGRlZCB0byBkaXNhcHBlYXIgaW4gZnV0dXJlCiBHUk9VUFNbImkzODZfY29yZWJvb3RfbXVsdGli b290X3FlbXUiXSA9IFsiaTM4Nl9jb3JlYm9vdCIsICJpMzg2X211bHRpYm9vdCIsICJpMzg2X3Fl bXUiXQogR1JPVVBTWyJub3BjIl0gPSBHUlVCX1BMQVRGT1JNU1s6XTsgR1JPVVBTWyJub3BjIl0u cmVtb3ZlKCJpMzg2X3BjIikKZGlmZiAtcHVyTiB0cnVuay9ncnViLWNvcmUvZGlzay91Ym9vdC91 Ym9vdGRpc2suYyBhcm0tdWJvb3QvZ3J1Yi1jb3JlL2Rpc2svdWJvb3QvdWJvb3RkaXNrLmMKLS0t IHRydW5rL2dydWItY29yZS9kaXNrL3Vib290L3Vib290ZGlzay5jCTE5NzAtMDEtMDEgMDE6MDA6 MDAuMDAwMDAwMDAwICswMTAwCisrKyBhcm0tdWJvb3QvZ3J1Yi1jb3JlL2Rpc2svdWJvb3QvdWJv b3RkaXNrLmMJMjAxMi0xMS0yMCAxNjoyNjo1NC45NTA5MjAwMDAgKzAwMDAKQEAgLTAsMCArMSwz NDUgQEAKKy8qIHVib290ZGlzay5jIC0gZGlzayBzdWJzeXN0ZW0gc3VwcG9ydCBmb3IgVS1Cb290 IHBsYXRmb3JtcyAqLworLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVy CisgKiAgQ29weXJpZ2h0IChDKSAyMDEyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4K KyAqCisgKiAgR1JVQiBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh bmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3Vy IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIEdSVUIgaXMgZGlzdHJpYnV0ZWQg aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkg V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNI QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUK KyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq ICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZQorICogIGFsb25nIHdpdGggR1JVQi4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3 LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8Z3J1Yi9kaXNrLmg+CisjaW5j bHVkZSA8Z3J1Yi9lcnIuaD4KKyNpbmNsdWRlIDxncnViL21pc2MuaD4KKyNpbmNsdWRlIDxncnVi L21tLmg+CisjaW5jbHVkZSA8Z3J1Yi9wYXJ0aXRpb24uaD4KKyNpbmNsdWRlIDxncnViL3Rlcm0u aD4KKyNpbmNsdWRlIDxncnViL3R5cGVzLmg+CisjaW5jbHVkZSA8Z3J1Yi91Ym9vdC9kaXNrLmg+ CisjaW5jbHVkZSA8Z3J1Yi91Ym9vdC91Ym9vdC5oPgorCitzdGF0aWMgc3RydWN0IHVib290ZGlz a19kYXRhICpmZF9kZXZpY2VzOworc3RhdGljIHN0cnVjdCB1Ym9vdGRpc2tfZGF0YSAqaGRfZGV2 aWNlczsKK3N0YXRpYyBzdHJ1Y3QgdWJvb3RkaXNrX2RhdGEgKmNkX2RldmljZXM7CisKKy8qCisg KiBncnViX3Vib290ZGlza19yZWdpc3RlcigpOgorICogICBDYWxsZWQgZm9yIGVhY2ggZGlzayBk ZXZpY2UgZW51bWVyYXRlZCBhcyBwYXJ0IG9mIFUtQm9vdCBpbml0aWFsaXphdGlvbgorICogICBj b2RlLgorICovCitncnViX2Vycl90CitncnViX3Vib290ZGlza19yZWdpc3RlciAoc3RydWN0IGRl dmljZV9pbmZvICpuZXdkZXYsIGludCBoYW5kbGUpCit7CisgIHN0cnVjdCB1Ym9vdGRpc2tfZGF0 YSAqZDsKKyAgZW51bSBkaXNrdHlwZSB0eXBlOworCisjZGVmaW5lIFNUT1JfVFlQRSh4KSAoKHgp ICYgMHgwZmYwKQorICBzd2l0Y2ggKFNUT1JfVFlQRSAobmV3ZGV2LT50eXBlKSkKKyAgICB7Cisg ICAgY2FzZSBEVF9TVE9SX0lERToKKyAgICBjYXNlIERUX1NUT1JfU0FUQToKKyAgICAgIC8qIGhk ICovCisgICAgICB0eXBlID0gaGQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIERUX1NUT1JfTU1D OgorICAgIGNhc2UgRFRfU1RPUl9VU0I6CisgICAgICAvKiBmZCAqLworICAgICAgdHlwZSA9IGZk OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBHUlVCX0VSUl9CQURf REVWSUNFOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGQgPSAoc3RydWN0IHVib290ZGlza19k YXRhICopIGdydWJfbWFsbG9jIChzaXplb2YgKHN0cnVjdCB1Ym9vdGRpc2tfZGF0YSkpOworICBp ZiAoIWQpCisgICAgcmV0dXJuIEdSVUJfRVJSX09VVF9PRl9NRU1PUlk7CisgIGQtPmhhbmRsZSA9 IGhhbmRsZTsKKyAgZC0+Y29va2llID0gbmV3ZGV2LT5jb29raWU7CisgIGQtPm9wZW5jb3VudCA9 IDA7CisKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIGNkOgorICAgICAgZ3J1Yl9k cHJpbnRmICgidWJvb3RkaXNrIiwgInJlZ2lzdGVyaW5nIGNkIGRldmljZVxuIik7CisgICAgICBk LT5uZXh0ID0gY2RfZGV2aWNlczsKKyAgICAgIGNkX2RldmljZXMgPSBkOworCisgICAgICBicmVh azsKKyAgICBjYXNlIGZkOgorICAgICAgZ3J1Yl9kcHJpbnRmICgidWJvb3RkaXNrIiwgInJlZ2lz dGVyaW5nIGZkIGRldmljZVxuIik7CisgICAgICBkLT5uZXh0ID0gZmRfZGV2aWNlczsKKyAgICAg IGZkX2RldmljZXMgPSBkOworCisgICAgICBicmVhazsKKyAgICBjYXNlIGhkOgorICAgICAgZ3J1 Yl9kcHJpbnRmICgidWJvb3RkaXNrIiwgInJlZ2lzdGVyaW5nIGhkIGRldmljZVxuIik7CisgICAg ICBkLT5uZXh0ID0gaGRfZGV2aWNlczsKKyAgICAgIGhkX2RldmljZXMgPSBkOworCisgICAgICBi cmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ3J1Yl9mcmVlIChkKTsKKyAgICAgIHJldHVybiBH UlVCX0VSUl9CQURfREVWSUNFOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyoKKyAqIHVi b290X2Rpc2tfaXRlcmF0ZSgpOgorICogICBJdGFyYXRvciBvdmVyIGVudW1lcmF0ZWQgZGlzayBk ZXZpY2VzLgorICovCitzdGF0aWMgaW50Cit1Ym9vdF9kaXNrX2l0ZXJhdGUgKGludCAoKmhvb2sp IChjb25zdCBjaGFyICpuYW1lKSwgZ3J1Yl9kaXNrX3B1bGxfdCBwdWxsKQoreworICBzdHJ1Y3Qg dWJvb3RkaXNrX2RhdGEgKmQ7CisgIGNoYXIgYnVmWzE2XTsKKyAgaW50IGNvdW50OworCisgIHN3 aXRjaCAocHVsbCkKKyAgICB7CisgICAgY2FzZSBHUlVCX0RJU0tfUFVMTF9OT05FOgorICAgICAg LyogImhkIiAtIGJ1aWx0LWluIG1hc3Mtc3RvcmFnZSAqLworICAgICAgZm9yIChkID0gaGRfZGV2 aWNlcywgY291bnQgPSAwOyBkOyBkID0gZC0+bmV4dCwgY291bnQrKykKKwl7CisJICBncnViX3Nu cHJpbnRmIChidWYsIHNpemVvZiAoYnVmKSAtIDEsICJoZCVkIiwgY291bnQpOworCSAgZ3J1Yl9k cHJpbnRmICgidWJvb3RkaXNrIiwgIml0ZXJhdGluZyAlc1xuIiwgYnVmKTsKKwkgIGlmIChob29r IChidWYpKQorCSAgICByZXR1cm4gMTsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdSVUJf RElTS19QVUxMX1JFTU9WQUJMRToKKyAgICAgIC8qICJmbG9wcHkiIC0gcmVtb3ZhYmxlIG1hc3Mg c3RvcmFnZSAqLworICAgICAgZm9yIChkID0gZmRfZGV2aWNlcywgY291bnQgPSAwOyBkOyBkID0g ZC0+bmV4dCwgY291bnQrKykKKwl7CisJICBncnViX3NucHJpbnRmIChidWYsIHNpemVvZiAoYnVm KSAtIDEsICJmZCVkIiwgY291bnQpOworCSAgZ3J1Yl9kcHJpbnRmICgidWJvb3RkaXNrIiwgIml0 ZXJhdGluZyAlc1xuIiwgYnVmKTsKKwkgIGlmIChob29rIChidWYpKQorCSAgICByZXR1cm4gMTsK Kwl9CisKKyAgICAgIC8qICJjZHJvbSIgLSByZW1vdmVhYmxlIHJlYWQtb25seSBzdG9yYWdlICov CisgICAgICBmb3IgKGQgPSBjZF9kZXZpY2VzLCBjb3VudCA9IDA7IGQ7IGQgPSBkLT5uZXh0LCBj b3VudCsrKQorCXsKKwkgIGdydWJfc25wcmludGYgKGJ1Ziwgc2l6ZW9mIChidWYpIC0gMSwgImNk JWQiLCBjb3VudCk7CisJICBncnViX2RwcmludGYgKCJ1Ym9vdGRpc2siLCAiaXRlcmF0aW5nICVz XG4iLCBidWYpOworCSAgaWYgKGhvb2sgKGJ1ZikpCisJICAgIHJldHVybiAxOworCX0KKyAgICAg IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJu IDA7Cit9CisKKy8qIEhlbHBlciBmdW5jdGlvbiBmb3IgdWJvb3RfZGlza19vcGVuLiAqLworc3Rh dGljIHN0cnVjdCB1Ym9vdGRpc2tfZGF0YSAqCitnZXRfZGV2aWNlIChzdHJ1Y3QgdWJvb3RkaXNr X2RhdGEgKmRldmljZXMsIGludCBudW0pCit7CisgIHN0cnVjdCB1Ym9vdGRpc2tfZGF0YSAqZDsK KworICBmb3IgKGQgPSBkZXZpY2VzOyBkICYmIG51bTsgZCA9IGQtPm5leHQsIG51bS0tKQorICAg IDsKKworICBpZiAobnVtID09IDApCisgICAgcmV0dXJuIGQ7CisKKyAgcmV0dXJuIE5VTEw7Cit9 CisKKy8qCisgKiB1Ym9vdF9kaXNrX29wZW4oKToKKyAqICAgT3BlbnMgYSBkaXNrIGRldmljZSBh bHJlYWR5IGVudW1lcmF0ZWQuCisgKi8KK3N0YXRpYyBncnViX2Vycl90Cit1Ym9vdF9kaXNrX29w ZW4gKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBncnViX2Rpc2sgKmRpc2spCit7CisgIHN0cnVj dCB1Ym9vdGRpc2tfZGF0YSAqZDsKKyAgc3RydWN0IGRldmljZV9pbmZvICpkZXZpbmZvOworICBp bnQgbnVtOworICBpbnQgcmV0dmFsOworCisgIGdydWJfZHByaW50ZiAoInVib290ZGlzayIsICJP cGVuaW5nICclcydcbiIsIG5hbWUpOworCisgIG51bSA9IGdydWJfc3RydG91bCAobmFtZSArIDIs IDAsIDEwKTsKKyAgaWYgKGdydWJfZXJybm8gIT0gR1JVQl9FUlJfTk9ORSkKKyAgICB7CisgICAg ICBncnViX2RwcmludGYgKCJ1Ym9vdGRpc2siLCAiT3BlbmluZyAnJXMnIGZhaWxlZCwgaW52YWxp ZCBudW1iZXJcbiIsCisJCSAgICBuYW1lKTsKKyAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAg aWYgKG5hbWVbMV0gIT0gJ2QnKQorICAgIHsKKyAgICAgIGdydWJfZHByaW50ZiAoInVib290ZGlz ayIsICJPcGVuaW5nICclcycgZmFpbGVkLCBpbnZhbGlkIG5hbWVcbiIsIG5hbWUpOworICAgICAg Z290byBmYWlsOworICAgIH0KKworICBzd2l0Y2ggKG5hbWVbMF0pCisgICAgeworICAgIGNhc2Ug J2YnOgorICAgICAgZCA9IGdldF9kZXZpY2UgKGZkX2RldmljZXMsIG51bSk7CisgICAgICBicmVh azsKKyAgICBjYXNlICdjJzoKKyAgICAgIGQgPSBnZXRfZGV2aWNlIChjZF9kZXZpY2VzLCBudW0p OworICAgICAgYnJlYWs7CisgICAgY2FzZSAnaCc6CisgICAgICBkID0gZ2V0X2RldmljZSAoaGRf ZGV2aWNlcywgbnVtKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnb3RvIGZh aWw7CisgICAgfQorCisgIGlmICghZCkKKyAgICBnb3RvIGZhaWw7CisKKyAgLyoKKyAgICogU3Vi c3lzdGVtcyBtYXkgY2FsbCBvcGVuIG9uIHRoZSBzYW1lIGRldmljZSByZWN1cnNpdmVseSAtIGJ1 dCBVLUJvb3QKKyAgICogZG9lcyBub3QgZGVhbCB3aXRoIHRoaXMuIFNvIHNpbXBseSBrZWVwIHRy YWNrIG9mIG51bWJlciBvZiBjYWxscyBhbmQKKyAgICogcmV0dXJuIHN1Y2Nlc3MgaWYgYWxyZWFk eSBvcGVuLgorICAgKi8KKyAgaWYgKGQtPm9wZW5jb3VudCA+IDApCisgICAgeworICAgICAgZ3J1 Yl9kcHJpbnRmICgidWJvb3RkaXNrIiwgIiglcykgYWxyZWFkeSBvcGVuXG4iLCBkaXNrLT5uYW1l KTsKKyAgICAgIGQtPm9wZW5jb3VudCsrOworICAgICAgcmV0dmFsID0gMDsKKyAgICB9CisgIGVs c2UKKyAgICB7CisgICAgICByZXR2YWwgPSB1Ym9vdF9kZXZfb3BlbiAoZC0+aGFuZGxlKTsKKyAg ICAgIGlmIChyZXR2YWwgIT0gMCkKKwlnb3RvIGZhaWw7CisgICAgICBkLT5vcGVuY291bnQgPSAx OworICAgIH0KKworICBncnViX2RwcmludGYgKCJ1Ym9vdGRpc2siLCAiY29va2llOiAweCUwOHhc biIsIChncnViX2FkZHJfdCkgZC0+Y29va2llKTsKKyAgZGlzay0+aWQgPSAoZ3J1Yl9hZGRyX3Qp IGQtPmNvb2tpZTsKKworICAvKiBEZXZpY2UgaGFzIHByZXZpb3VzbHkgYmVlbiBlbnVtZXJhdGVk LCBzbyB0aGlzIHNob3VsZCBuZXZlciBmYWlsICovCisgIGlmICgoZGV2aW5mbyA9IHVib290X2Rl dl9nZXQgKGQtPmhhbmRsZSkpID09IE5VTEwpCisgICAgZ290byBmYWlsOworCisgIGQtPmJsb2Nr X3NpemUgPSBkZXZpbmZvLT5kaV9zdG9yLmJsb2NrX3NpemU7CisgIGlmIChkLT5ibG9ja19zaXpl ID09IDApCisgICAgeworICAgICAgZ3J1Yl9wcmludGYgKCIlczogbm8gYmxvY2sgc2l6ZSFcbiIs IF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gR1JVQl9FUlJfSU87CisgICAgfQorCisgIGZv ciAoZGlzay0+bG9nX3NlY3Rvcl9zaXplID0gMDsKKyAgICAgICAoMVUgPDwgZGlzay0+bG9nX3Nl Y3Rvcl9zaXplKSA8IGQtPmJsb2NrX3NpemU7CisgICAgICAgZGlzay0+bG9nX3NlY3Rvcl9zaXpl KyspOworCisgIGdydWJfZHByaW50ZiAoInVib290ZGlzayIsICIoJXMpIGJsb2Nrc2l6ZT0lZCwg bG9nX3NlY3Rvcl9zaXplPSVkXG4iLAorCQlkaXNrLT5uYW1lLCBkLT5ibG9ja19zaXplLCBkaXNr LT5sb2dfc2VjdG9yX3NpemUpOworCisgIGRpc2stPnRvdGFsX3NlY3RvcnMgPSBHUlVCX0RJU0tf U0laRV9VTktOT1dOOworICBkaXNrLT5kYXRhID0gZDsKKworICByZXR1cm4gR1JVQl9FUlJfTk9O RTsKKworZmFpbDoKKyAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX1VOS05PV05fREVWSUNF LCAibm8gc3VjaCBkZXZpY2UiKTsKK30KKworc3RhdGljIHZvaWQKK3Vib290X2Rpc2tfY2xvc2Ug KHN0cnVjdCBncnViX2Rpc2sgKmRpc2spCit7CisgIHN0cnVjdCB1Ym9vdGRpc2tfZGF0YSAqZDsK KyAgaW50IHJldHZhbDsKKworICBkID0gZGlzay0+ZGF0YTsKKworICAvKgorICAgKiBJbiBtaXJy b3Igb2Ygb3BlbiBmdW5jdGlvbiwga2VlcCB0cmFjayBvZiBudW1iZXIgb2YgY2FsbHMgdG8gY2xv c2UgYW5kCisgICAqIHNlbmQgb24gdG8gVS1Cb290IG9ubHkgd2hlbiBvcGVuY291bnQgd291bGQg ZGVjcmVhc2UgdG8gMC4KKyAgICovCisgIGlmIChkLT5vcGVuY291bnQgPiAxKQorICAgIHsKKyAg ICAgIGdydWJfZHByaW50ZiAoInVib290ZGlzayIsICJDbG9zZWQgKCVzKVxuIiwgZGlzay0+bmFt ZSk7CisKKyAgICAgIGQtPm9wZW5jb3VudC0tOworICAgIH0KKyAgZWxzZSBpZiAoZC0+b3BlbmNv dW50ID09IDEpCisgICAgeworICAgICAgcmV0dmFsID0gdWJvb3RfZGV2X2Nsb3NlIChkLT5oYW5k bGUpOworICAgICAgZC0+b3BlbmNvdW50LS07CisgICAgICBncnViX2RwcmludGYgKCJ1Ym9vdGRp c2siLCAiY2xvc2VkICVzICglZClcbiIsIGRpc2stPm5hbWUsIHJldHZhbCk7CisgICAgfQorICBl bHNlCisgICAgeworICAgICAgZ3J1Yl9kcHJpbnRmICgidWJvb3RkaXNrIiwgImRldmljZSAlcyBu b3Qgb3BlbiFcbiIsIGRpc2stPm5hbWUpOworICAgIH0KK30KKworLyoKKyAqIHVib290X2Rpc2tf cmVhZCgpOgorICogICBDYWxsZWQgZnJvbSB3aXRoaW4gZGlzayBzdWJzeXN0ZW0gdG8gcmVhZCBh IHNlcXVlbmNlIG9mIGJsb2NrcyBpbnRvIHRoZQorICogICBkaXNrIGNhY2hlLiBNYXBzIGRpcmVj dGx5IG9uIHRvcCBvZiBVLUJvb3QgQVBJLCBvbmx5IHdyYXAgaW4gc29tZSBlcnJvcgorICogICBo YW5kbGluZy4KKyAqLworc3RhdGljIGdydWJfZXJyX3QKK3Vib290X2Rpc2tfcmVhZCAoc3RydWN0 IGdydWJfZGlzayAqZGlzaywKKwkJIGdydWJfZGlza19hZGRyX3Qgb2Zmc2V0LCBncnViX3NpemVf dCBudW1ibG9ja3MsIGNoYXIgKmJ1ZikKK3sKKyAgc3RydWN0IHVib290ZGlza19kYXRhICpkOwor ICBsYmFzaXplX3QgcmVhbF9zaXplOworICBpbnQgcmV0dmFsOworCisgIGQgPSBkaXNrLT5kYXRh OworCisgIHJldHZhbCA9IHVib290X2Rldl9yZWFkIChkLT5oYW5kbGUsIGJ1ZiwgbnVtYmxvY2tz LCBvZmZzZXQsICZyZWFsX3NpemUpOworICBncnViX2RwcmludGYgKCJ1Ym9vdGRpc2siLAorCQki cmV0dmFsPSVkLCBudW1ibG9ja3M9JWQsIHJlYWxfc2l6ZT0lbGx1LCBzZWN0b3I9JWxsdVxuIiwK KwkJcmV0dmFsLCBudW1ibG9ja3MsIChncnViX3VpbnQ2NF90KSByZWFsX3NpemUsCisJCShncnVi X3VpbnQ2NF90KSBvZmZzZXQpOworICBpZiAocmV0dmFsICE9IDApCisgICAgcmV0dXJuIGdydWJf ZXJyb3IgKEdSVUJfRVJSX0lPLCAiVS1Cb290IGRpc2sgcmVhZCBlcnJvciIpOworCisgIHJldHVy biBHUlVCX0VSUl9OT05FOworfQorCitzdGF0aWMgZ3J1Yl9lcnJfdAordWJvb3RfZGlza193cml0 ZSAoc3RydWN0IGdydWJfZGlzayAqZGlzayBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCSAg Z3J1Yl9kaXNrX2FkZHJfdCBzZWN0b3IgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkgIGdy dWJfc2l6ZV90IHNpemUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkgIGNvbnN0IGNoYXIg KmJ1ZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIGdydWJfZHByaW50ZiAoInVib290 ZGlzayIsICJhdHRlbXB0IHRvIHdyaXRlXG4iKTsKKyAgcmV0dXJuIEdSVUJfRVJSX05PVF9JTVBM RU1FTlRFRF9ZRVQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3J1Yl9kaXNrX2RldiBncnViX3Vib290 ZGlza19kZXYgPSB7CisgIC5uYW1lID0gInVib290ZGlzayIsCisgIC5pZCA9IEdSVUJfRElTS19E RVZJQ0VfVUJPT1RESVNLX0lELAorICAuaXRlcmF0ZSA9IHVib290X2Rpc2tfaXRlcmF0ZSwKKyAg Lm9wZW4gPSB1Ym9vdF9kaXNrX29wZW4sCisgIC5jbG9zZSA9IHVib290X2Rpc2tfY2xvc2UsCisg IC5yZWFkID0gdWJvb3RfZGlza19yZWFkLAorICAud3JpdGUgPSB1Ym9vdF9kaXNrX3dyaXRlLAor ICAubmV4dCA9IDAKK307CisKK3ZvaWQKK2dydWJfdWJvb3RkaXNrX2luaXQgKHZvaWQpCit7Cisg IGdydWJfZGlza19kZXZfcmVnaXN0ZXIgKCZncnViX3Vib290ZGlza19kZXYpOworfQorCit2b2lk CitncnViX3Vib290ZGlza19maW5pICh2b2lkKQoreworICBncnViX2Rpc2tfZGV2X3VucmVnaXN0 ZXIgKCZncnViX3Vib290ZGlza19kZXYpOworfQpkaWZmIC1wdXJOIHRydW5rL2dydWItY29yZS9r ZXJuL2FybS9kbC5jIGFybS11Ym9vdC9ncnViLWNvcmUva2Vybi9hcm0vZGwuYwotLS0gdHJ1bmsv Z3J1Yi1jb3JlL2tlcm4vYXJtL2RsLmMJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAx MDAKKysrIGFybS11Ym9vdC9ncnViLWNvcmUva2Vybi9hcm0vZGwuYwkyMDEyLTExLTIwIDE2OjI2 OjU0Ljk1MDkyMDAwMCArMDAwMApAQCAtMCwwICsxLDMyNyBAQAorLyogZGwuYyAtIGFyY2gtZGVw ZW5kZW50IHBhcnQgb2YgbG9hZGFibGUgbW9kdWxlIHN1cHBvcnQgKi8KKy8qCisgKiAgR1JVQiAg LS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMjAxMiAgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIEdSVUIgaXMgZnJlZSBzb2Z0d2Fy ZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5 CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0 aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgor ICoKKyAqICBHUlVCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1 c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt cGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg Y29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIEdS VUIuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKwor I2luY2x1ZGUgPGdydWIvZGwuaD4KKyNpbmNsdWRlIDxncnViL2VsZi5oPgorI2luY2x1ZGUgPGdy dWIvbWlzYy5oPgorI2luY2x1ZGUgPGdydWIvZXJyLmg+CisjaW5jbHVkZSA8Z3J1Yi9tbS5oPgor I2luY2x1ZGUgPGdydWIvaTE4bi5oPgorCisjaWYgIWRlZmluZWQoX190aHVtYjJfXykKKyNlcnJv ciAiUmVsb2NhdGlvbnMgbm90IGltcGxlbWVudGVkIGZvciBBMzIgKCJBUk0iKSBpbnN0cnVjdGlv biBzZXQgeWV0ISIKKyNlbmRpZgorCisjaWZkZWYgRExfREVCVUcKK3N0YXRpYyBjb25zdCBjaGFy ICpzeW1zdHJ0YWI7CisKKy8qCisgKiBUaGlzIGlzIGEgYml0IG9mIGEgaGFjaywgc2V0dGluZyB0 aGUgc3ltc3RydGFiIHBvaW50ZXIgdG8gdGhlIGxhc3QgU1RSVEFCCisgKiBzZWN0aW9uIGluIHRo ZSBtb2R1bGUgKHdoaWNoIGlzIHdoZXJlIHN5bWJvbCBuYW1lcyBhcmUgaW4gdGhlIG9iamVjdHMg SSd2ZQorICogaW5zcGVjdGVkIG1hbnVhbGx5KS4gCisgKi8KK3N0YXRpYyB2b2lkCitzZXRfc3lt c3RydGFiIChFbGZfRWhkciAqIGUpCit7CisgIGludCBpOworICBFbGZfU2hkciAqczsKKworICBz eW1zdHJ0YWIgPSBOVUxMOworCisgIGZvciAoaSA9IDAsIHMgPSAoRWxmX1NoZHIgKikgKChncnVi X3VpbnQzMl90KSBlICsgZS0+ZV9zaG9mZik7CisgICAgICAgaSA8IGUtPmVfc2hudW07CisgICAg ICAgaSsrLCBzID0gKEVsZl9TaGRyICopICgoZ3J1Yl91aW50MzJfdCkgcyArIGUtPmVfc2hlbnRz aXplKSkKKyAgICBpZiAocy0+c2hfdHlwZSA9PSBTSFRfU1RSVEFCKQorICAgICAgc3ltc3RydGFi ID0gKHZvaWQgKikgKChncnViX2FkZHJfdCkgZSArIHMtPnNoX29mZnNldCk7Cit9CisKK3N0YXRp YyBjb25zdCBjaGFyICoKK2dldF9zeW1ib2xuYW1lIChFbGZfU3ltICogc3ltKQoreworICBjb25z dCBjaGFyICpzeW1ib2xuYW1lID0gc3ltc3RydGFiICsgc3ltLT5zdF9uYW1lOworCisgIHJldHVy biAoKnN5bWJvbG5hbWUgPyBzeW1ib2xuYW1lIDogTlVMTCk7Cit9CisjZW5kaWYgLyogRExfREVC VUcgKi8KKworCisvKgorICogU2ltcGxlIHJlbG9jYXRpb24gb2YgMzItYml0IHZhbHVlIChpbiBs aXRlcmFsIHBvb2wpCisgKi8KK3N0YXRpYyBncnViX2Vycl90CityZWxvY19hYnMzMiAoRWxmX1dv cmQgKiBhZGRyLCBFbGZfU3ltICogc3ltKQoreworI2lmZGVmIERMX0RFQlVHCisgIGdydWJfcHJp bnRmICgiJXM6IEFCUzMyIEAgMHglMDh4IC0+ICVzIEAgMHglMDh4XG4iLAorCSAgICAgICBfX0ZV TkNUSU9OX18sIChncnViX2FkZHJfdCkgYWRkciwKKwkgICAgICAgZ2V0X3N5bWJvbG5hbWUgKHN5 bSksIHN5bS0+c3RfdmFsdWUpOworI2VuZGlmCisKKyAgKmFkZHIgKz0gc3ltLT5zdF92YWx1ZTsK KworICByZXR1cm4gR1JVQl9FUlJfTk9ORTsKK30KKworLyoKKyAqIFJfQVJNX1RITV9DQUxML1RI TV9KVU1QMjQKKyAqCisgKiBEZWFscyB3aXRoIHJlbG9jYXRpb24gb2YgVGh1bWIgKFQzMikgaW5z dHJ1Y3Rpb24gc2V0IHJlbGF0aXZlIGJyYW5jaGVzCisgKiBCLlcsIEJMIGFuZCBCTFgKKyAqCisg KiAzMi1iaXQgVGh1bWIgaW5zdHJ1Y3Rpb25zIGNhbiBiZSAxNi1iaXQgYWxpZ25lZCwgYW5kIGFy ZSBmZXRjaGVkCisgKiBsaXR0bGUtZW5kaWFuLCByZXF1aXJpbmcgc29tZSBhZGRpdGlvbmFsIGZp ZGRsaW5nLgorICovCitzdGF0aWMgZ3J1Yl9lcnJfdAorcmVsb2NfdGhtX2NhbGwgKGdydWJfdWlu dDE2X3QgKiBhZGRyLCBFbGZfU3ltICogc3ltKQoreworICBncnViX2ludDMyX3Qgb2Zmc2V0LCBv ZmZzZXRfbG93LCBvZmZzZXRfaGlnaDsKKyAgZ3J1Yl91aW50MzJfdCBzaWduLCBqMSwgajIsIGlz X2JseDsKKyAgZ3J1Yl91aW50MzJfdCBpbnN3b3JkLCBpbnNtYXNrOworCisgIC8qIEV4dHJhY3Qg aW5zdHJ1Y3Rpb24gd29yZCBpbiBhbGlnbm1lbnQtc2FmZSBtYW5uZXIgKi8KKyAgaW5zd29yZCA9 ICgqYWRkciA8PCAxNikgfCAqKGFkZHIgKyAxKTsKKyAgaW5zbWFzayA9IDB4ZjgwMGQwMDA7CisK KyAgLyogQi5XL0JMIG9yIEJMWD8gQWZmZWN0cyByYW5nZSBhbmQgZXhwZWN0ZWQgdGFyZ2V0IHN0 YXRlICovCisgIGlmICgoKGluc3dvcmQgPj4gMTIpICYgMHhkKSA9PSAweGMpCisgICAgaXNfYmx4 ID0gMTsKKyAgZWxzZQorICAgIGlzX2JseCA9IDA7CisKKyAgb2Zmc2V0X2xvdyA9IC0xNjc3NzIx NjsKKyAgb2Zmc2V0X2hpZ2ggPSBpc19ibHggPyAxNjc3NzIxMiA6IDE2Nzc3MjE0OworCisjaWZk ZWYgRExfREVCVUcKKyAgZ3J1Yl9wcmludGYgKCIlczogJXMgQCAweCUwOHggLT4gJXMgQCAweCUw OHhcbiIsCisJICAgICAgIF9fRlVOQ1RJT05fXywgaXNfYmx4ID8gIkJMWCIgOiAiQihMKSIsCisJ ICAgICAgIChncnViX2FkZHJfdCkgYWRkciwgZ2V0X3N5bWJvbG5hbWUgKHN5bSksIHN5bS0+c3Rf dmFsdWUpOworI2VuZGlmCisKKyAgLyogRXh0cmFjdCBiaXRmaWVsZHMgZnJvbSBpbnN0cnVjdGlv biB3b3JkcyAqLworICBzaWduID0gKGluc3dvcmQgPj4gMjYpICYgMTsKKyAgajEgPSAoaW5zd29y ZCA+PiAxMykgJiAxOworICBqMiA9IChpbnN3b3JkID4+IDExKSAmIDE7CisgIG9mZnNldCA9IChz aWduIDw8IDI0KSB8ICgofihqMSBeIHNpZ24pICYgMSkgPDwgMjMpIHwKKyAgICAoKH4oajIgXiBz aWduKSAmIDEpIDw8IDIyKSB8CisgICAgKChpbnN3b3JkICYgMHgwM2ZmMDAwMCkgPj4gNCkgfCAo KGluc3dvcmQgJiAweDAwMDAwN2ZmKSA8PCAxKTsKKworICAvKiBTaWduIGFkanVzdCBhbmQgY2Fs Y3VsYXRlIG9mZnNldCAqLworICBpZiAob2Zmc2V0ICYgMHgwMTAwMDAwMCkKKyAgICBvZmZzZXQg LT0gMHgwMjAwMDAwMDsKKyAgb2Zmc2V0ICs9IHN5bS0+c3RfdmFsdWUgLSAoZ3J1Yl91aW50MzJf dCkgYWRkcjsKKworICBpZiAoKG9mZnNldCA8IG9mZnNldF9sb3cpIHx8IChvZmZzZXQgPiBvZmZz ZXRfaGlnaCkpCisgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX09VVF9PRl9SQU5HRSwK KwkJICAgICAgIE5fKCJvZmZzZXQgJWQgKDB4JTA4eCkgaXMgb3V0IG9mIHJhbmdlIiksCisJCSAg ICAgICBvZmZzZXQsIG9mZnNldCk7CisKKyAgLyogSWYgQkxYLCB0YXJnZXQgc3ltYm9sIG11c3Qg YmUgQVJNICh0YXJnZXQgYWRkcmVzcyBMU0IgPT0gMCkgKi8KKyAgaWYgKGlzX2JseCAmJiAob2Zm c2V0ICYgMSkpCisgICAgcmV0dXJuIGdydWJfZXJyb3IKKyAgICAgIChHUlVCX0VSUl9CVUcsIE5f KCJSZWxvY2F0aW9uIHRhcmdldGluZyB3cm9uZyBleGVjdXRpb24gc3RhdGUiKSk7CisKKyAgLyog UmVhc3NlbWJsZSBpbnN0cnVjdGlvbiB3b3JkICovCisgIHNpZ24gPSAob2Zmc2V0ID4+IDI0KSAm IDE7CisgIGoxID0gc2lnbiBeICh+KG9mZnNldCA+PiAyMykgJiAxKTsKKyAgajIgPSBzaWduIF4g KH4ob2Zmc2V0ID4+IDIyKSAmIDEpOworICBpbnN3b3JkID0gKGluc3dvcmQgJiBpbnNtYXNrKSB8 CisgICAgKHNpZ24gPDwgMjYpIHwKKyAgICAoKChvZmZzZXQgPj4gMTIpICYgMHgwM2ZmKSA8PCAx NikgfAorICAgIChqMSA8PCAxMykgfCAoajIgPDwgMTEpIHwgKChvZmZzZXQgPj4gMSkgJiAweDA3 ZmYpOworCisgIC8qIFdyaXRlIGluc3RydWN0aW9uIHdvcmQgYmFjayBpbiBhbGlnbm1lbnQtc2Fm ZSBtYW5uZXIgKi8KKyAgKihncnViX3VpbnQxNl90ICopIGFkZHIgPSAoaW5zd29yZCA+PiAxNikg JiAweGZmZmY7CisgICooZ3J1Yl91aW50MTZfdCAqKSAoYWRkciArIDEpID0gaW5zd29yZCAmIDB4 ZmZmZjsKKworICByZXR1cm4gR1JVQl9FUlJfTk9ORTsKK30KKworLyoKKyAqIGZpbmRfc2VnbWVu dCgpOiBmaW5kcyBhIG1vZHVsZSBzZWdtZW50IG1hdGNoaW5nIHNoX2luZm8KKyAqLworc3RhdGlj IGdydWJfZGxfc2VnbWVudF90CitmaW5kX3NlZ21lbnQgKGdydWJfZGxfc2VnbWVudF90IHNlZywg RWxmMzJfV29yZCBzaF9pbmZvKQoreworICBmb3IgKDsgc2VnOyBzZWcgPSBzZWctPm5leHQpCisg ICAgaWYgKHNlZy0+c2VjdGlvbiA9PSBzaF9pbmZvKQorICAgICAgcmV0dXJuIHNlZzsKKworICBy ZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIGRvX3JlbG9jYXRpb25zKCk6CisgKiAgIEl0ZXJhdGUg b3ZlciBhbGwgcmVsb2NhdGlvbnMgaW4gc2VjdGlvbiwgY2FsbGluZyBhcHByb3ByaWF0ZSBmdW5j dGlvbnMKKyAqICAgZm9yIHBhdGNoaW5nLgorICovCitzdGF0aWMgZ3J1Yl9lcnJfdAorZG9fcmVs b2NhdGlvbnMgKEVsZl9TaGRyICogcmVsaGRyLCBFbGZfRWhkciAqIGUsIGdydWJfZGxfdCBtb2Qp Cit7CisgIGdydWJfZGxfc2VnbWVudF90IHNlZzsKKyAgRWxmX1JlbCAqcmVsOworICBFbGZfU3lt ICpzeW07CisgIGludCBpLCBlbnRudW07CisKKyAgZW50bnVtID0gcmVsaGRyLT5zaF9zaXplIC8g c2l6ZW9mIChFbGZfUmVsKTsKKworICAvKiBGaW5kIHRoZSB0YXJnZXQgc2VnbWVudCBmb3IgdGhp cyByZWxvY2F0aW9uIHNlY3Rpb24uICovCisgIHNlZyA9IGZpbmRfc2VnbWVudCAobW9kLT5zZWdt ZW50LCByZWxoZHItPnNoX2luZm8pOworICBpZiAoIXNlZykKKyAgICByZXR1cm4gZ3J1Yl9lcnJv ciAoR1JVQl9FUlJfRU9GLCBOXygicmVsb2NhdGlvbiBzZWdtZW50IG5vdCBmb3VuZCIpKTsKKwor ICByZWwgPSAoRWxmX1JlbCAqKSAoKGdydWJfYWRkcl90KSBlICsgcmVsaGRyLT5zaF9vZmZzZXQp OworCisgIC8qIFN0ZXAgdGhyb3VnaCBhbGwgcmVsb2NhdGlvbnMgKi8KKyAgZm9yIChpID0gMCwg c3ltID0gbW9kLT5zeW10YWI7IGkgPCBlbnRudW07IGkrKykKKyAgICB7CisgICAgICBFbGZfV29y ZCAqYWRkcjsKKyAgICAgIGludCByZWxzeW0sIHJlbHR5cGU7CisgICAgICBncnViX2Vycl90IHJl dHZhbDsKKworICAgICAgaWYgKHNlZy0+c2l6ZSA8IHJlbFtpXS5yX29mZnNldCkKKwlyZXR1cm4g Z3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX01PRFVMRSwKKwkJCSAgICJyZWxvYyBvZmZzZXQgaXMg b3V0IG9mIHRoZSBzZWdtZW50Iik7CisgICAgICByZWxzeW0gPSBFTEZfUl9TWU0gKHJlbFtpXS5y X2luZm8pOworICAgICAgcmVsdHlwZSA9IEVMRl9SX1RZUEUgKHJlbFtpXS5yX2luZm8pOworICAg ICAgYWRkciA9IChFbGZfV29yZCAqKSAoKGdydWJfYWRkcl90KSBzZWctPmFkZHIgKyByZWxbaV0u cl9vZmZzZXQpOworCisgICAgICBzd2l0Y2ggKHJlbHR5cGUpCisJeworCWNhc2UgUl9BUk1fQUJT MzI6CisJICB7CisJICAgIC8qIERhdGEgd2lsbCBiZSBuYXR1cmFsbHkgYWxpZ25lZCAqLworCSAg ICByZXR2YWwgPSByZWxvY19hYnMzMiAoYWRkciwgJnN5bVtyZWxzeW1dKTsKKwkgICAgaWYgKHJl dHZhbCAhPSBHUlVCX0VSUl9OT05FKQorCSAgICAgIHJldHVybiByZXR2YWw7CisJICB9CisJICBi cmVhazsKKwljYXNlIFJfQVJNX1RITV9DQUxMOgorCWNhc2UgUl9BUk1fVEhNX0pVTVAyNDoKKwkg IHsKKwkgICAgLyogVGh1bWIgaW5zdHJ1Y3Rpb25zIGNhbiBiZSAxNi1iaXQgYWxpZ25lZCAqLwor CSAgICByZXR2YWwgPSByZWxvY190aG1fY2FsbCAoKGdydWJfdWludDE2X3QgKikgYWRkciwgJnN5 bVtyZWxzeW1dKTsKKwkgICAgaWYgKHJldHZhbCAhPSBHUlVCX0VSUl9OT05FKQorCSAgICAgIHJl dHVybiByZXR2YWw7CisJICB9CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgcmV0dXJuIGdydWJf ZXJyb3IgKEdSVUJfRVJSX05PVF9JTVBMRU1FTlRFRF9ZRVQsCisJCQkgICAgIE5fKCJyZWxvY2F0 aW9uIDB4JXggaXMgbm90IGltcGxlbWVudGVkIHlldCIpLAorCQkJICAgICByZWx0eXBlKTsKKwl9 CisgICAgfQorCisgIHJldHVybiBHUlVCX0VSUl9OT05FOworfQorCisKKy8qCisgKiBDaGVjayBp ZiBFSERSIGlzIGEgdmFsaWQgRUxGIGhlYWRlci4KKyAqLworZ3J1Yl9lcnJfdAorZ3J1Yl9hcmNo X2RsX2NoZWNrX2hlYWRlciAodm9pZCAqZWhkcikKK3sKKyAgRWxmX0VoZHIgKmUgPSBlaGRyOwor CisgIC8qIENoZWNrIHRoZSBtYWdpYyBudW1iZXJzLiAgKi8KKyAgaWYgKGUtPmVfaWRlbnRbRUlf Q0xBU1NdICE9IEVMRkNMQVNTMzIKKyAgICAgIHx8IGUtPmVfaWRlbnRbRUlfREFUQV0gIT0gRUxG REFUQTJMU0IgfHwgZS0+ZV9tYWNoaW5lICE9IEVNX0FSTSkKKyAgICByZXR1cm4gZ3J1Yl9lcnJv ciAoR1JVQl9FUlJfQkFEX09TLAorCQkgICAgICAgTl8oImludmFsaWQgYXJjaC1kZXBlbmRlbnQg RUxGIG1hZ2ljIikpOworCisgIHJldHVybiBHUlVCX0VSUl9OT05FOworfQorCisvKgorICogVmVy aWZ5IHRoYXQgcHJvdmlkZWQgRUxGIGhlYWRlciBjb250YWlucyByZWZlcmVuY2UgdG8gYSBzeW1i b2wgdGFibGUKKyAqLworc3RhdGljIGludAoraGFzX3N5bXRhYiAoRWxmX0VoZHIgKiBlKQorewor ICBpbnQgaTsKKyAgRWxmX1NoZHIgKnM7CisKKyAgZm9yIChpID0gMCwgcyA9IChFbGZfU2hkciAq KSAoKGdydWJfdWludDMyX3QpIGUgKyBlLT5lX3Nob2ZmKTsKKyAgICAgICBpIDwgZS0+ZV9zaG51 bTsKKyAgICAgICBpKyssIHMgPSAoRWxmX1NoZHIgKikgKChncnViX3VpbnQzMl90KSBzICsgZS0+ ZV9zaGVudHNpemUpKQorICAgIGlmIChzLT5zaF90eXBlID09IFNIVF9TWU1UQUIpCisgICAgICBy ZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKworLyoKKyAqIGdydWJfYXJjaF9kbF9yZWxvY2F0 ZV9zeW1ib2xzKCk6CisgKiAgIE9ubHkgZXh0ZXJuYWxseSB2aXNpYmxlIGZ1bmN0aW9uIGluIHRo aXMgZmlsZS4KKyAqICAgTG9jYXRlcyB0aGUgcmVsb2NhdGlvbnMgc2VjdGlvbiBvZiB0aGUgRUxG IG9iamVjdCwgYW5kIGNhbGxzCisgKiAgIGRvX3JlbG9jYXRpb25zKCkgdG8gZGVhbCB3aXRoIGl0 LgorICovCitncnViX2Vycl90CitncnViX2FyY2hfZGxfcmVsb2NhdGVfc3ltYm9scyAoZ3J1Yl9k bF90IG1vZCwgdm9pZCAqZWhkcikKK3sKKyAgRWxmX0VoZHIgKmUgPSBlaGRyOworICBFbGZfU2hk ciAqczsKKyAgdW5zaWduZWQgaTsKKworICBpZiAoIWhhc19zeW10YWIgKGUpKQorICAgIHJldHVy biBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfTU9EVUxFLCBOXygibm8gc3ltYm9sIHRhYmxlIikp OworCisjaWZkZWYgRExfREVCVUcKKyAgc2V0X3N5bXN0cnRhYiAoZSk7CisjZW5kaWYKKworI2Rl ZmluZSBGSVJTVF9TSERSKHgpICgoRWxmX1NoZHIgKikgKChncnViX2FkZHJfdCkoeCkgKyAoeCkt PmVfc2hvZmYpKQorI2RlZmluZSBORVhUX1NIRFIoeCwgeSkgKChFbGZfU2hkciAqKSAoKGdydWJf YWRkcl90KSh5KSArICh4KS0+ZV9zaGVudHNpemUpKQorCisgIGZvciAoaSA9IDAsIHMgPSBGSVJT VF9TSERSIChlKTsgaSA8IGUtPmVfc2hudW07IGkrKywgcyA9IE5FWFRfU0hEUiAoZSwgcykpCisg ICAgeworICAgICAgZ3J1Yl9lcnJfdCByZXQ7CisKKyAgICAgIHN3aXRjaCAocy0+c2hfdHlwZSkK Kwl7CisJY2FzZSBTSFRfUkVMOgorCSAgeworCSAgICAvKiBSZWxvY2F0aW9ucywgbm8gYWRkZW5k cyAqLworCSAgICByZXQgPSBkb19yZWxvY2F0aW9ucyAocywgZSwgbW9kKTsKKwkgICAgaWYgKHJl dCAhPSBHUlVCX0VSUl9OT05FKQorCSAgICAgIHJldHVybiByZXQ7CisJICB9CisJICBicmVhazsK KwljYXNlIFNIVF9OVUxMOgorCWNhc2UgU0hUX1BST0dCSVRTOgorCWNhc2UgU0hUX1NZTVRBQjoK KwljYXNlIFNIVF9TVFJUQUI6CisJY2FzZSBTSFRfTk9CSVRTOgorCWNhc2UgU0hUX0FSTV9BVFRS SUJVVEVTOgorCSAgYnJlYWs7CisJY2FzZSBTSFRfUkVMQToKKwlkZWZhdWx0OgorCSAgeworCSAg ICBncnViX3ByaW50ZiAoInVuaGFuZGxlZCBzZWN0aW9uX3R5cGU6ICVkICgweCUwOHgpXG4iLAor CQkJIHMtPnNoX3R5cGUsIHMtPnNoX3R5cGUpOworCSAgICByZXR1cm4gR1JVQl9FUlJfTk9UX0lN UExFTUVOVEVEX1lFVDsKKwkgIH07CisJfQorICAgIH0KKworI3VuZGVmIEZJUlNUX1NIRFIKKyN1 bmRlZiBORVhUX1NIRFIKKworICByZXR1cm4gR1JVQl9FUlJfTk9ORTsKK30KZGlmZiAtcHVyTiB0 cnVuay9ncnViLWNvcmUva2Vybi9hcm0vdWJvb3Qvc3RhcnR1cC5TIGFybS11Ym9vdC9ncnViLWNv cmUva2Vybi9hcm0vdWJvb3Qvc3RhcnR1cC5TCi0tLSB0cnVuay9ncnViLWNvcmUva2Vybi9hcm0v dWJvb3Qvc3RhcnR1cC5TCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCisrKyBh cm0tdWJvb3QvZ3J1Yi1jb3JlL2tlcm4vYXJtL3Vib290L3N0YXJ0dXAuUwkyMDEyLTExLTIwIDE2 OjI2OjU0Ljk1MDkyMDAwMCArMDAwMApAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqICBHUlVCICAt LSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAyMDEyICBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgR1JVQiBpcyBmcmVlIHNvZnR3YXJl OiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhl IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkK KyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRo ZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisg KgorICogIEdSVUIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz ZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w bGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj b3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggR1JV Qi4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisj aW5jbHVkZSA8Z3J1Yi9vZmZzZXRzLmg+CisjaW5jbHVkZSA8Z3J1Yi9zeW1ib2wuaD4KKyNpbmNs dWRlIDxncnViL21hY2hpbmUva2VybmVsLmg+CisKKy8qCisgKiBHUlVCIGlzIGNhbGxlZCBmcm9t IFUtQm9vdCBhcyBhIExpbnV4IEtlcm5lbCB0eXBlIGltYWdlLCB3aGljaAorICogbWVhbnMgYW1v bmcgb3RoZXIgdGhpbmdzIHRoYXQgaXQgYWx3YXlzIGVudGVycyBpbiBBUk0gc3RhdGUuCisgKgor ICoKKyAqIE92ZXJ2aWV3IG9mIEdSVUIgaW1hZ2UgbGF5b3V0OgorICoKKyAqIF9zdGFydDoKKyAq ICAgICAgICAgICAgICBFbnRyeSBwb2ludCAoMSBBUk0gYnJhbmNoIGluc3RydWN0aW9uLCB0byAi Y29kZXN0YXJ0IikKKyAqIGdydWJfdG90YWxfbW9kdWxlX3NpemU6CisgKiAgICAgICAgICAgICAg RGF0YSBmaWVsZDogU2l6ZSBvZiBpbmNsdWRlZCBtb2R1bGUgYmxvYgorICogICAgICAgICAgICAg ICh3aGVuIGdlbmVyYXRlZCBieSBncnViLW1raW1hZ2UpCisgKiBjb2Rlc3RhcnQ6CisgKiAgICAg ICAgICAgICAgUmVtYWluZGVyIG9mIHN0YXRpY2FsbHktbGlua2VkIGV4ZWN1dGFibGUgY29kZSBh bmQgZGF0YS4KKyAqIF9fYnNzX3N0YXJ0OgorICogICAgICAgICAgICAgIFN0YXJ0IG9mIGluY2x1 ZGVkIG1vZHVsZSBibG9iLgorICogICAgICAgICAgICAgIEFsc28gd2hlcmUgZ2xvYmFsL3N0YXRp YyB2YXJpYWJsZXMgYXJlIGxvY2F0ZWQuCisgKiBfZW5kOgorICogICAgICAgICAgICAgIEVuZCBv ZiBic3MgcmVnaW9uIChidXQgbm90IG5lY2Vzc2FyaWx5IG1vZHVsZSBibG9iKS4KKyAqIDxvdmVy Zmxvdz46CisgKiAgICAgICAgICAgICAgQW55IHBhcnQgb2YgdGhlIG1vZHVsZSBibG9iIHRoYXQg ZXh0ZW5kcyBiZXlvbmQgX2VuZC4KKyAqIDxtb2R1bGVzPjoKKyAqICAgICAgICAgICAgICBMb2Fk YWJsZSBtb2R1bGVzLCBwb3N0IHJlbG9jYXRpb24uCisgKiA8c3RhY2s+OiAgICAgCisgKiA8aGVh cD46CisgKi8KKwkKKwkudGV4dAorCS5hcm0KK0ZVTkNUSU9OKF9zdGFydCkKKwliCWNvZGVzdGFy dAorCQorCUAgU2l6ZSBvZiBmaW5hbCBpbWFnZSBpbnRlZ3JhdGVkIG1vZHVsZSBibG9iIC0gc2V0 IGJ5IGdydWItbWtpbWFnZQorCS4gPSBfc3RhcnQgKyBHUlVCX0tFUk5FTF9NQUNISU5FX1RPVEFM X01PRFVMRV9TSVpFCitWQVJJQUJMRShncnViX3RvdGFsX21vZHVsZV9zaXplKQorCS5sb25nIAkw CisKK0ZVTkNUSU9OKGNvZGVzdGFydCkKKwlAIFN0b3JlIGNvbnRleHQ6IE1hY2hpbmUgSUQsIGF0 YWdzL2R0YiwgLi4uCisJQCBVLUJvb3QgQVBJIHNpZ25hdHVyZSBpcyBzdG9yZWQgb24gdGhlIFUt Qm9vdCBoZWFwCisJQCBTdGFjayBwb2ludGVyIHVzZWQgYXMgc3RhcnQgYWRkcmVzcyBmb3Igc2ln bmF0dXJlIHByb2JpbmcKKwltb3YJcjEyLCBzcAorCWxkcglzcCwgPWVudHJ5X3N0YXRlCisJcHVz aAl7cjQtcjEyLGxyfQlAIHN0b3JlIFUtQm9vdCBjb250ZXh0IChzcCBpbiByMTIpCisKKwlAIFB1 dCBrZXJuZWwgcGFyYW1ldGVycyBhc2lkZSB1bnRpbCB3ZSBjYW4gc3RvcmUgdGhlbSAoZnVydGhl ciBkb3duKQorCW1vdglyNCwgcjEJCUAgbWFjaGluZSB0eXBlCisJbW92CXI1LCByMgkJQCBib290 IGRhdGEKKworCUAgTW9kdWxlcyBoYXZlIGJlZW4gc3RvcmVkIGFzIGEgYmxvYiBpbiBCU1MsCisJ QCB0aGV5IG5lZWQgdG8gYmUgbWFudWFsbHkgcmVsb2NhdGVkIHRvIF9lbmQgb3IKKwlAIChfX2Jz c19zdGFydCArIGdydWJfdG90YWxfbW9kdWxlX3NpemUpLCB3aGljaGV2ZXIgZ3JlYXRlci4KKwls ZHIJcjAsID1FWFRfQyhfX2Jzc19zdGFydCkJCUAgc3JjCisJbGRyCXIxLCA9RVhUX0MoX2VuZCkJ CUAgZHN0ID0gRW5kIG9mIEJTUworCWxkcglyMiwgZ3J1Yl90b3RhbF9tb2R1bGVfc2l6ZQlAIGJs b2Igc2l6ZQorCWFkZAlyMywgcjAsIHIyCQkJQCBibG9iIGVuZAorCWNtcAlyMSwgcjMJCQkJQCBf ZW5kIDwgYmxvYiBlbmQ/CisJbW92bHQJcjEsIHIzCQkJCUAgZHN0ID0gYmxvYiBlbmQgKyBibG9i IHNpemUKKwkKKzE6CWxkcglyMywgW3IwXSwgIzQgCQkJQCByMyA9ICpzcmMrKyAKKwlzdHIJcjMs IFtyMV0sICM0CQkJQCAqZHN0KysgPSByMyAKKwlzdWJzCXIyLCAjNAkJCQlAIHJlbWFpbmluZyAt PSA0CisJYm5lCTFiCQkJCUAgd2hpbGUgcmVtYWluaW5nICE9IDAKKwkKKwlAIFNldCB1cCBhIG5l dyBzdGFjaywgYmV5b25kIHRoZSBlbmQgb2YgY29waWVkIG1vZHVsZXMuCisJbGRyCXIzLCA9R1JV Ql9LRVJORUxfTUFDSElORV9TVEFDS19TSVpFCisJYWRkCXIzLCByMSwgcjMJQCBQbGFjZSBzdGFj ayBiZXlvbmQgZW5kIG9mIG1vZHVsZXMKKwlhbmQJc3AsIHIzLCAjfjB4NwlAIEVuc3VyZSA4LWJ5 dGUgYWxpZ25tZW50CisKKwlAIFNpbmNlIHdlIF9hcmVfIHRoZSBDIHJ1bi10aW1lLCB3ZSBuZWVk IHRvIG1hbnVhbGx5IHplcm8gdGhlIEJTUworCUAgcmVnaW9uIGJlZm9yZSBjb250aW51aW5nCisJ bGRyCXIwLCA9RVhUX0MoX19ic3Nfc3RhcnQpCisJbGRyCXIxLCA9RVhUX0MoX2VuZCkKKwltb3YJ cjIsICMwCisxOglzdHIJcjIsIFtyMF0sICM0CisJY21wCXIwLCByMQorCWJuZQkxYgorCisJQCBH bG9iYWwgdmFyaWFibGVzIG5vdyBhY2Nlc3NpYmxlIC0gc3RvcmUga2VybmVsIHBhcmFtZXRlcnMg aW4gbWVtb3J5CisJbGRyICAgICByMTIsID1FWFRfQyh1Ym9vdF9tYWNoaW5lX3R5cGUpCisJc3Ry ICAgICByNCwgW3IxMl0KKwlsZHIgICAgIHIxMiwgPUVYVF9DKHVib290X2Jvb3RfZGF0YSkKKwlz dHIgICAgIHI1LCBbcjEyXQorCQorCWIJZ3J1Yl9tYWluCisKKwkvKgorCSAqIHVib290X3N5c2Nh bGwoKToKKwkgKiAgIFRoaXMgZnVuY3Rpb24gaXMgZWZmZWN0aXZlbHkgYSB2ZW5lZXIsIHNvIGl0 IGNhbm5vdAorCSAqICAgbW9kaWZ5IHRoZSBzdGFjayBvciBjb3JydXB0IGFueSByZWdpc3RlcnMg b3RoZXIgdGhhbgorCSAqICAgcjEyIChpcCkuIEZ1cnRoZXJtb3JlIGl0IG5lZWRzIHRvIHJlc3Rv cmUgcjggZm9yCisJICogICBVLUJvb3QgKEdsb2JhbCBEYXRhIFBvaW50ZXIpIGFuZCBwcmVzZXJ2 ZSBpdCBmb3IgR3J1Yi4KKwkgKi8KK0ZVTkNUSU9OKHVib290X3N5c2NhbGwpCisJbGRyCWlwLCA9 dHJhbnNpdGlvbl9zcGFjZQorCXN0bQlpcCwge3I4LCBscn0KKwlsZHIJaXAsID1nZF9iYWNrdXAK KwlsZHIJcjgsIFtpcF0KKwlsZHIJaXAsID11Ym9vdF9zeXNjYWxsX3B0cgorCW1vdglsciwgcGMK KwlsZHIJcGMsIFtpcF0KKwlsZHIJaXAsID1nZF9iYWNrdXAKKwlzdHIJcjgsIFtpcF0KKwlsZHIJ aXAsID10cmFuc2l0aW9uX3NwYWNlCisJbGRtCWlwLCB7cjgsIGxyfQorCWJ4CWxyCisJCitGVU5D VElPTih1Ym9vdF9yZXR1cm4pCisJbGRyCXNwLCA9ZW50cnlfc3RhdGVfZW5kCisJcG9wCXtyNC1y MTIsIGxyfQorCW1vdglzcCwgcjEyCisJYngJbHIKKworCQorCS5kYXRhCisJLmFsaWduCTMJQCA4 LWJ5dGUgYWxpZ25tZW50IGZvciBzdGFjaworQCBVLWJvb3QgY29udGV4dCBzdGFjayBzcGFjZQor ZW50cnlfc3RhdGVfZW5kOgkKKwkubG9uZwkwCUAgcjQKKwkubG9uZwkwCUAgcjUKKwkubG9uZwkw CUAgcjYKKwkubG9uZwkwCUAgcjcKK2dkX2JhY2t1cDoJCisJLmxvbmcJMAlAIHI4IC0gVS1Cb290 IGdsb2JhbCBkYXRhIHBvaW50ZXIKKwkubG9uZwkwCUAgcjkKKwkubG9uZwkwCUAgcjEwCisJLmxv bmcJMAlAIHIxMQorVkFSSUFCTEUodWJvb3Rfc2VhcmNoX2hpbnQpQCBVLUJvb3Qgc3RhY2sgcG9p bnRlciAtIAorCS5sb25nCTAJQCBhbHNvIEFQSSBzaWduYXR1cmUgYWRkcmVzcyBoaW50LgorCS5s b25nCTAJQCBscgorZW50cnlfc3RhdGU6CQlAIGJhY2t1cCBmb3IgVS1Cb290IGNvbnRleHQKKwor QCBHUlVCIGNvbnRleHQgc3RhY2sgc3BhY2UKK3RyYW5zaXRpb25fc3BhY2U6CQorCS5sb25nCTAJ QCByOAorCS5sb25nCTAJQCBscgorCitWQVJJQUJMRSh1Ym9vdF9zeXNjYWxsX3B0cikKKwkubG9u ZwkwCUAKKworCS5lbmQKZGlmZiAtcHVyTiB0cnVuay9ncnViLWNvcmUva2Vybi9tYWluLmMgYXJt LXVib290L2dydWItY29yZS9rZXJuL21haW4uYwotLS0gdHJ1bmsvZ3J1Yi1jb3JlL2tlcm4vbWFp bi5jCTIwMTItMTEtMjAgMTY6MjE6NDQuODYzMDMyMDAwICswMDAwCisrKyBhcm0tdWJvb3QvZ3J1 Yi1jb3JlL2tlcm4vbWFpbi5jCTIwMTItMTEtMjAgMTY6MjY6NTQuOTUwOTIwMDAwICswMDAwCkBA IC0zMCw4ICszMCwxMCBAQAogI2luY2x1ZGUgPGdydWIvcmVhZGVyLmg+CiAjaW5jbHVkZSA8Z3J1 Yi9wYXJzZXIuaD4KIAotLyogVGhpcyBpcyBhY3R1YWx5IHBsYXRmb3JtLWluZGVwZW5kYW50IGJ1 dCB1c2VkIG9ubHkgb24gbG9vbmdzb24gYW5kIHNwYXJjLiAgKi8KLSNpZiBkZWZpbmVkIChHUlVC X01BQ0hJTkVfTUlQU19MT09OR1NPTikgfHwgZGVmaW5lZCAoR1JVQl9NQUNISU5FX01JUFNfUUVN VV9NSVBTKSB8fCBkZWZpbmVkIChHUlVCX01BQ0hJTkVfU1BBUkM2NCkKKy8qIFRoaXMgaXMgYWN0 dWFseSBwbGF0Zm9ybS1pbmRlcGVuZGFudCBidXQgdXNlZCBvbmx5IG9uIHNvbWUgcGxhdGZvcm1z LiAgKi8KKyNpZiBkZWZpbmVkIChHUlVCX01BQ0hJTkVfTUlQU19MT09OR1NPTikgfHwgXAorICBk ZWZpbmVkIChHUlVCX01BQ0hJTkVfTUlQU19RRU1VX01JUFMpIHx8IGRlZmluZWQgKEdSVUJfTUFD SElORV9TUEFSQzY0KSB8fCBcCisgIGRlZmluZWQgKEdSVUJfTUFDSElORV9BUk0pCiBncnViX2Fk ZHJfdAogZ3J1Yl9tb2R1bGVzX2dldF9lbmQgKHZvaWQpCiB7CmRpZmYgLXB1ck4gdHJ1bmsvZ3J1 Yi1jb3JlL2tlcm4vdWJvb3QvaHcuYyBhcm0tdWJvb3QvZ3J1Yi1jb3JlL2tlcm4vdWJvb3QvaHcu YwotLS0gdHJ1bmsvZ3J1Yi1jb3JlL2tlcm4vdWJvb3QvaHcuYwkxOTcwLTAxLTAxIDAxOjAwOjAw LjAwMDAwMDAwMCArMDEwMAorKysgYXJtLXVib290L2dydWItY29yZS9rZXJuL3Vib290L2h3LmMJ MjAxMi0xMS0yMCAxNjoyNjo1NC45NTA5MjAwMDAgKzAwMDAKQEAgLTAsMCArMSwxMTEgQEAKKy8q IGh3LmMgLSBVLUJvb3QgaGFyZHdhcmUgZGlzY292ZXJ5ICovCisvKgorICogIEdSVUIgIC0tICBH UmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTIgIEZyZWUgU29m dHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBHUlVCIGlzIGZyZWUgc29mdHdhcmU6IHlv dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVy bXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICog IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExp Y2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg KiAgR1JVQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs LAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk IHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD VUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv ciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCBHUlVCLiAg SWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNs dWRlIDxncnViL2tlcm5lbC5oPgorI2luY2x1ZGUgPGdydWIvbWVtb3J5Lmg+CisjaW5jbHVkZSA8 Z3J1Yi9taXNjLmg+CisjaW5jbHVkZSA8Z3J1Yi9tbS5oPgorI2luY2x1ZGUgPGdydWIvb2Zmc2V0 cy5oPgorI2luY2x1ZGUgPGdydWIvbWFjaGluZS9rZXJuZWwuaD4KKyNpbmNsdWRlIDxncnViL3Vi b290L2Rpc2suaD4KKyNpbmNsdWRlIDxncnViL3Vib290L3Vib290Lmg+CisKK2dydWJfYWRkcl90 IHN0YXJ0X29mX3JhbTsKKworLyoKKyAqIGdydWJfdWJvb3RfcHJvYmVfbWVtb3J5KCk6CisgKiAg IFF1ZXJpZXMgVS1Cb290IGZvciBhdmFpbGFibGUgbWVtb3J5IHJlZ2lvbnMuCisgKgorICogICBT ZXRzIHVwIGhlYXAgbmVhciB0aGUgaW1hZ2UgaW4gbWVtb3J5IGFuZCBzZXRzIHVwICJzdGFydF9v Zl9yYW0iLgorICovCit2b2lkCitncnViX3Vib290X21tX2luaXQgKHZvaWQpCit7CisgIHN0cnVj dCBzeXNfaW5mbyAqc2kgPSB1Ym9vdF9nZXRfc3lzX2luZm8gKCk7CisKKyAgZ3J1Yl9tbV9pbml0 X3JlZ2lvbiAoKHZvaWQgKikgKGdydWJfbW9kdWxlc19nZXRfZW5kICgpCisJCQkJICsgR1JVQl9L RVJORUxfTUFDSElORV9TVEFDS19TSVpFKSwKKwkJICAgICAgIEdSVUJfS0VSTkVMX01BQ0hJTkVf SEVBUF9TSVpFKTsKKworICBpZiAoc2kgJiYgKHNpLT5tcl9ubyAhPSAwKSkKKyAgICB7CisgICAg ICBpbnQgaTsKKyAgICAgIHN0YXJ0X29mX3JhbSA9IEdSVUJfVUlOVF9NQVg7CisKKyAgICAgIGZv ciAoaSA9IDA7IGkgPCBzaS0+bXJfbm87IGkrKykKKwlpZiAoKHNpLT5tcltpXS5mbGFncyAmIE1S X0FUVFJfTUFTSykgPT0gTVJfQVRUUl9EUkFNKQorCSAgaWYgKHNpLT5tcltpXS5zdGFydCA8IHN0 YXJ0X29mX3JhbSkKKwkgICAgc3RhcnRfb2ZfcmFtID0gc2ktPm1yW2ldLnN0YXJ0OworICAgIH0K K30KKworLyoKKyAqIGdydWJfdWJvb3RfcHJvYmVfaGFyZHdhcmUoKToKKyAqICAgCisgKi8KK2dy dWJfZXJyX3QKK2dydWJfdWJvb3RfcHJvYmVfaGFyZHdhcmUgKHZvaWQpCit7CisgIGludCBkZXZj b3VudCwgaTsKKworICBkZXZjb3VudCA9IHVib290X2Rldl9lbnVtICgpOworICBncnViX2Rwcmlu dGYgKCJpbml0IiwgIiVkIGRldmljZXMgZm91bmRcbiIsIGRldmNvdW50KTsKKworICBmb3IgKGkg PSAwOyBpIDwgZGV2Y291bnQ7IGkrKykKKyAgICB7CisgICAgICBzdHJ1Y3QgZGV2aWNlX2luZm8g KmRldmluZm8gPSB1Ym9vdF9kZXZfZ2V0IChpKTsKKworICAgICAgZ3J1Yl9kcHJpbnRmICgiaW5p dCIsICJkZXZpY2UgaGFuZGxlOiAlZFxuIiwgaSk7CisgICAgICBncnViX2RwcmludGYgKCJpbml0 IiwgIiAgY29va2llXHQ9IDB4JTA4eFxuIiwKKwkJICAgIChncnViX3VpbnQzMl90KSBkZXZpbmZv LT5jb29raWUpOworCisgICAgICBpZiAoZGV2aW5mby0+dHlwZSAmIERFVl9UWVBfU1RPUikKKwl7 CisJICBncnViX2RwcmludGYgKCJpbml0IiwgIiAgdHlwZVx0XHQ9IERJU0tcbiIpOworCSAgZ3J1 Yl91Ym9vdGRpc2tfcmVnaXN0ZXIgKGRldmluZm8sIGkpOworCX0KKyAgICAgIGVsc2UgaWYgKGRl dmluZm8tPnR5cGUgJiBERVZfVFlQX05FVCkKKwl7CisJICBncnViX2RwcmludGYgKCJpbml0Iiwg IiAgdHlwZVx0XHQ9IE5FVCAobm90IHN1cHBvcnRlZCB5ZXQpXG4iKTsKKwl9CisgICAgICBlbHNl CisJeworCSAgZ3J1Yl9kcHJpbnRmICgiaW5pdCIsICIlczogdW5rbm93biBkZXZpY2UgdHlwZSIs IF9fRlVOQ1RJT05fXyk7CisJfQorICAgIH0KKworICByZXR1cm4gR1JVQl9FUlJfTk9ORTsKK30K KworZ3J1Yl9lcnJfdAorZ3J1Yl9tYWNoaW5lX21tYXBfaXRlcmF0ZSAoZ3J1Yl9tZW1vcnlfaG9v a190IGhvb2spCit7CisgIGludCBpOworICBzdHJ1Y3Qgc3lzX2luZm8gKnNpID0gdWJvb3RfZ2V0 X3N5c19pbmZvICgpOworCisgIGlmICghc2kgfHwgKHNpLT5tcl9ubyA8IDEpKQorICAgIHJldHVy biBHUlVCX0VSUl9CVUc7CisKKyAgLyogSXRlcmF0ZSBhbmQgY2FsbCBgaG9vaycuICAqLworICBm b3IgKGkgPSAwOyBpIDwgc2ktPm1yX25vOyBpKyspCisgICAgaWYgKChzaS0+bXJbaV0uZmxhZ3Mg JiBNUl9BVFRSX01BU0spID09IE1SX0FUVFJfRFJBTSkKKyAgICAgIGhvb2sgKHNpLT5tcltpXS5z dGFydCwgc2ktPm1yW2ldLnNpemUsIEdSVUJfTUVNT1JZX0FWQUlMQUJMRSk7CisKKyAgcmV0dXJu IEdSVUJfRVJSX05PTkU7Cit9CmRpZmYgLXB1ck4gdHJ1bmsvZ3J1Yi1jb3JlL2tlcm4vdWJvb3Qv aW5pdC5jIGFybS11Ym9vdC9ncnViLWNvcmUva2Vybi91Ym9vdC9pbml0LmMKLS0tIHRydW5rL2dy dWItY29yZS9rZXJuL3Vib290L2luaXQuYwkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCAr MDEwMAorKysgYXJtLXVib290L2dydWItY29yZS9rZXJuL3Vib290L2luaXQuYwkyMDEyLTExLTIw IDE2OjI2OjU0Ljk1MDkyMDAwMCArMDAwMApAQCAtMCwwICsxLDE2OSBAQAorLyogaW5pdC5jIC0g Z2VuZXJpYyBVLUJvb3QgaW5pdGlhbGl6YXRpb24gYW5kIGZpbmFsaXphdGlvbiAqLworLyoKKyAq ICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAy MDEyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgR1JVQiBpcyBmcmVl IHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQg dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJs aXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lv biAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl cnNpb24uCisgKgorICogIEdSVUIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3 aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVj ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25n IHdpdGggR1JVQi4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4K KyAqLworCisKKyNpbmNsdWRlIDxncnViL2Vudi5oPgorI2luY2x1ZGUgPGdydWIva2VybmVsLmg+ CisjaW5jbHVkZSA8Z3J1Yi9taXNjLmg+CisjaW5jbHVkZSA8Z3J1Yi9tbS5oPgorI2luY2x1ZGUg PGdydWIvdGVybS5oPgorI2luY2x1ZGUgPGdydWIvdGltZS5oPgorI2luY2x1ZGUgPGdydWIvbWFj aGluZS9rZXJuZWwuaD4KKyNpbmNsdWRlIDxncnViL3Vib290L2NvbnNvbGUuaD4KKyNpbmNsdWRl IDxncnViL3Vib290L2Rpc2suaD4KKyNpbmNsdWRlIDxncnViL3Vib290L3Vib290Lmg+CisKK2V4 dGVybiBjaGFyIF9fYnNzX3N0YXJ0W107CitleHRlcm4gY2hhciBfZW5kW107CitleHRlcm4gZ3J1 Yl9zaXplX3QgZ3J1Yl90b3RhbF9tb2R1bGVfc2l6ZTsKK2V4dGVybiBpbnQgKCp1Ym9vdF9zeXNj YWxsX3B0cikgKGludCwgaW50ICosIC4uLik7CisKK2dydWJfYWRkcl90IGdydWJfbW9kYmFzZTsK KworZ3J1Yl91aW50MzJfdCB1Ym9vdF9tYWNoaW5lX3R5cGU7CitncnViX2FkZHJfdCB1Ym9vdF9i b290X2RhdGE7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWVyX3N0YXJ0OworCit2b2lkCitn cnViX2V4aXQgKHZvaWQpCit7CisgIHVib290X3JldHVybiAoMCk7Cit9CisKK2dydWJfdWludDMy X3QKK3Vib290X2dldF9tYWNoaW5lX3R5cGUgKHZvaWQpCit7CisgIHJldHVybiB1Ym9vdF9tYWNo aW5lX3R5cGU7Cit9CisKK2dydWJfYWRkcl90Cit1Ym9vdF9nZXRfYm9vdF9kYXRhICh2b2lkKQor eworICByZXR1cm4gdWJvb3RfYm9vdF9kYXRhOworfQorCitzdGF0aWMgZ3J1Yl91aW50NjRfdAor dWJvb3RfdGltZXJfbXMgKHZvaWQpCit7CisgIHJldHVybiAoZ3J1Yl91aW50NjRfdCkgdWJvb3Rf Z2V0X3RpbWVyICh0aW1lcl9zdGFydCk7Cit9CisKK3ZvaWQKK2dydWJfbWFjaGluZV9pbml0ICh2 b2lkKQoreworICBncnViX2FkZHJfdCBlbmQ7CisgIGludCB2ZXI7CisKKyAgLyogRmlyc3Qgb2Yg YWxsIC0gZXN0YWJsaXNoIGNvbm5lY3Rpb24gd2l0aCBVLUJvb3QgKi8KKyAgdmVyID0gdWJvb3Rf YXBpX2luaXQgKCk7CisgIGlmICghdmVyKQorICAgIHsKKyAgICAgIC8qIERvbid0IGV2ZW4gaGF2 ZSBhIGNvbnNvbGUgdG8gbG9nIGVycm9ycyB0by4uLiAqLworICAgICAgZ3J1Yl9leGl0ICgpOwor ICAgIH0KKyAgZWxzZSBpZiAodmVyID4gQVBJX1NJR19WRVJTSU9OKQorICAgIHsKKyAgICAgIC8q IFRyeSB0byBwcmludCBhbiBlcnJvciBtZXNzYWdlICovCisgICAgICB1Ym9vdF9wdXRzICgiaW52 YWxpZCBVLUJvb3QgQVBJIHZlcnNpb25cbiIpOworICAgIH0KKworICAvKgorICAgKiBNb2R1bGVz IHdlcmUgcmVsb2NhdGVkIHRvIF9lbmQsIG9yIF9fYnNzX3N0YXJ0ICsgZ3J1Yl90b3RhbF9tb2R1 bGVfc2l6ZSwKKyAgICogd2hpY2hldmVyIGdyZWF0ZXIuCisgICAqLworICBlbmQgPSAoZ3J1Yl9h ZGRyX3QpIF9fYnNzX3N0YXJ0ICsgZ3J1Yl90b3RhbF9tb2R1bGVfc2l6ZTsKKyAgaWYgKGVuZCA8 IChncnViX2FkZHJfdCkgX2VuZCkKKyAgICBlbmQgPSAoZ3J1Yl9hZGRyX3QpIF9lbmQ7CisgIGdy dWJfbW9kYmFzZSA9IGVuZDsKKworICAvKiBJbml0aWFsaXplIHRoZSBjb25zb2xlIHNvIHRoYXQg R1JVQiBjYW4gZGlzcGxheSBtZXNzYWdlcy4gICovCisgIGdydWJfY29uc29sZV9pbml0X2Vhcmx5 ICgpOworCisgIGdydWJfZHByaW50ZiAoImluaXQiLCAiX19ic3Nfc3RhcnQ6IDB4JTA4eCwgZW5k OiAweCUwOHgsIF9lbmQ6IDB4JTA4eFxuIiwKKwkJKGdydWJfYWRkcl90KSBfX2Jzc19zdGFydCwK KwkJKGdydWJfYWRkcl90KSBfX2Jzc19zdGFydCArIGdydWJfdG90YWxfbW9kdWxlX3NpemUsCisJ CShncnViX2FkZHJfdCkgX2VuZCk7CisgIGdydWJfZHByaW50ZiAoImluaXQiLCAiZ3J1Yl9tb2Ri YXNlOiAlcFxuIiwgKHZvaWQgKikgZ3J1Yl9tb2RiYXNlKTsKKyAgZ3J1Yl9kcHJpbnRmICgiaW5p dCIsICJncnViX21vZHVsZXNfZ2V0X2VuZCgpOiAlcFxuIiwKKwkJKHZvaWQgKikgZ3J1Yl9tb2R1 bGVzX2dldF9lbmQgKCkpOworCisgIC8qIEVudW1lcmF0ZSBtZW1vcnkgYW5kIGluaXRpYWxpemUg dGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN5c3RlbS4gKi8KKyAgZ3J1Yl91Ym9vdF9tbV9pbml0ICgp OworCisgIC8qIEluaXRpYWxpc2UgZnVsbCB0ZXJtaW5mbyBzdXBwb3J0ICovCisgIGdydWJfY29u c29sZV9pbml0X2xhdGVseSAoKTsKKworICAvKiBFbnVtZXJhdGUgdWJvb3QgZGV2aWNlcyAqLwor ICBncnViX3Vib290X3Byb2JlX2hhcmR3YXJlICgpOworCisgIC8qIEluaXRpYWxpc2UgdGltZXIg Ki8KKyAgdGltZXJfc3RhcnQgPSB1Ym9vdF9nZXRfdGltZXIgKDApOworICBncnViX2luc3RhbGxf Z2V0X3RpbWVfbXMgKHVib290X3RpbWVyX21zKTsKKworICAvKiBJbml0aWFsaXplICAqLworICBn cnViX3Vib290ZGlza19pbml0ICgpOworfQorCisKK3ZvaWQKK2dydWJfbWFjaGluZV9maW5pICh2 b2lkKQoreworfQorCisvKgorICogZ3J1Yl9tYWNoaW5lX2dldF9ib290bG9jYXRpb24oKToKKyAq ICAgQ2FsbGVkIGZyb20ga2Vybi9tYWluLmMsIHdoaWNoIGV4cGVjdHMgYSBkZXZpY2UgbmFtZSAo bWludXMgcGFyZW50aGVzZXMpCisgKiAgIGFuZCBhIGZpbGVzeXN0ZW0gcGF0aCBiYWNrLCBpZiBh bnkgYXJlIGtub3duLgorICogICBBbnkgcmV0dXJuZWQgdmFsdWVzIG11c3QgYmUgcG9pbnRlcnMg dG8gZHluYW1pY2FsbHkgYWxsb2NhdGVkIHN0cmluZ3MuCisgKi8KK3ZvaWQKK2dydWJfbWFjaGlu ZV9nZXRfYm9vdGxvY2F0aW9uIChjaGFyICoqZGV2aWNlLCBjaGFyICoqcGF0aCkKK3sKKyAgY2hh ciAqdG1wOworCisgIHRtcCA9IHVib290X2Vudl9nZXQgKCJncnViX2Jvb3RkZXYiKTsKKyAgaWYg KHRtcCkKKyAgICB7CisgICAgICAqZGV2aWNlID0gZ3J1Yl9tYWxsb2MgKGdydWJfc3RybGVuICh0 bXApICsgMSk7CisgICAgICBpZiAoKmRldmljZSA9PSBOVUxMKQorCXJldHVybjsKKyAgICAgIGdy dWJfc3RybmNweSAoKmRldmljZSwgdG1wLCBncnViX3N0cmxlbiAodG1wKSArIDEpOworICAgIH0K KyAgZWxzZQorICAgICpkZXZpY2UgPSBOVUxMOworCisgIHRtcCA9IHVib290X2Vudl9nZXQgKCJn cnViX2Jvb3RwYXRoIik7CisgIGlmICh0bXApCisgICAgeworICAgICAgKnBhdGggPSBncnViX21h bGxvYyAoZ3J1Yl9zdHJsZW4gKHRtcCkgKyAxKTsKKyAgICAgIGlmICgqcGF0aCA9PSBOVUxMKQor CXJldHVybjsKKyAgICAgIGdydWJfc3RybmNweSAoKnBhdGgsIHRtcCwgZ3J1Yl9zdHJsZW4gKHRt cCkgKyAxKTsKKyAgICB9CisgIGVsc2UKKyAgICAqcGF0aCA9IE5VTEw7Cit9CisKK3ZvaWQKK2dy dWJfdWJvb3RfZmluaSAodm9pZCkKK3sKKyAgZ3J1Yl91Ym9vdGRpc2tfZmluaSAoKTsKKyAgZ3J1 Yl9jb25zb2xlX2ZpbmkgKCk7Cit9CmRpZmYgLXB1ck4gdHJ1bmsvZ3J1Yi1jb3JlL2tlcm4vdWJv b3QvdWJvb3QuYyBhcm0tdWJvb3QvZ3J1Yi1jb3JlL2tlcm4vdWJvb3QvdWJvb3QuYwotLS0gdHJ1 bmsvZ3J1Yi1jb3JlL2tlcm4vdWJvb3QvdWJvb3QuYwkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAw MDAwMCArMDEwMAorKysgYXJtLXVib290L2dydWItY29yZS9rZXJuL3Vib290L3Vib290LmMJMjAx Mi0xMS0yMCAxNjoyNjo1NC45NTA5MjAwMDAgKzAwMDAKQEAgLTAsMCArMSwzNjMgQEAKKy8qCisg KiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykg MjAxMiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIEdSVUIgaXMgZnJl ZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0 IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVi bGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNp b24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2 ZXJzaW9uLgorICoKKyAqICBHUlVCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg d2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2 ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJl Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9u ZyB3aXRoIEdSVUIuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4u CisgKi8KKworI2luY2x1ZGUgPGdydWIvbWlzYy5oPgorI2luY2x1ZGUgPGdydWIvbW0uaD4KKyNp bmNsdWRlIDxncnViL3Vib290L3Vib290Lmg+CisKKy8qCisgKiBUaGUgbWFpbiBzeXNjYWxsIGVu dHJ5IHBvaW50IGlzIG5vdCByZWVudHJhbnQsIG9ubHkgb25lIGNhbGwgaXMKKyAqIHNlcnZpY2Vk IHVudGlsIGZpbmlzaGVkLgorICoKKyAqIGludCBzeXNjYWxsKGludCBjYWxsLCBpbnQgKnJldHZh bCwgLi4uKQorICogZS5nLiBzeXNjYWxsKDEsIGludCAqLCB1X2ludDMyX3QsIHVfaW50MzJfdCwg dV9pbnQzMl90LCB1X2ludDMyX3QpOworICoKKyAqIGNhbGw6CXN5c2NhbGwgbnVtYmVyCisgKgor ICogcmV0dmFsOglwb2ludHMgdG8gdGhlIHJldHVybiB2YWx1ZSBwbGFjZWhvbGRlciwgdGhpcyBp cyB0aGUgcGxhY2UgdGhlCisgKgkJc3lzY2FsbCBwdXRzIGl0cyByZXR1cm4gdmFsdWUsIGlmIE5V TEwgdGhlIGNhbGxlciBkb2VzIG5vdAorICoJCWV4cGVjdCBhIHJldHVybiB2YWx1ZQorICoKKyAq IC4uLgkJc3lzY2FsbCBhcmd1bWVudHMgKHZhcmlhYmxlIG51bWJlcikKKyAqCisgKiByZXR1cm5z OgkwIGlmIHRoZSBjYWxsIG5vdCBmb3VuZCwgMSBpZiBzZXJ2aWNlZAorICovCisKK2V4dGVybiBp bnQgKCp1Ym9vdF9zeXNjYWxsX3B0cikgKGludCwgaW50ICosIC4uLik7CitleHRlcm4gaW50IHVi b290X3N5c2NhbGwgKGludCwgaW50ICosIC4uLik7CitleHRlcm4gZ3J1Yl9hZGRyX3QgdWJvb3Rf c2VhcmNoX2hpbnQ7CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX2luZm8gdWJvb3Rfc3lzX2luZm87Citz dGF0aWMgc3RydWN0IG1lbV9yZWdpb24gdWJvb3RfbWVtX2luZm9bNV07CitzdGF0aWMgc3RydWN0 IGRldmljZV9pbmZvIHVib290X2RldmljZXNbNl07CitzdGF0aWMgaW50IG51bV9kZXZpY2VzOwor CitpbnQKK3Vib290X2FwaV9pbml0ICh2b2lkKQoreworICBzdHJ1Y3QgYXBpX3NpZ25hdHVyZSAq c3RhcnQsICplbmQ7CisgIHN0cnVjdCBhcGlfc2lnbmF0dXJlICpwOworCisgIGlmICh1Ym9vdF9z ZWFyY2hfaGludCkKKyAgICB7CisgICAgICAvKiBFeHRlbmRlZCBzZWFyY2ggcmFuZ2UgdG8gd29y ayBhcm91bmQgVHJpbSBTbGljZSBVLUJvb3QgaXNzdWUgKi8KKyAgICAgIHN0YXJ0ID0gKHN0cnVj dCBhcGlfc2lnbmF0dXJlICopICgodWJvb3Rfc2VhcmNoX2hpbnQgJiB+MHgwMDBmZmZmZikKKwkJ CQkJLSAweDAwNTAwMDAwKTsKKyAgICAgIGVuZCA9CisJKHN0cnVjdCBhcGlfc2lnbmF0dXJlICop ICgoZ3J1Yl9hZGRyX3QpIHN0YXJ0ICsgVUJPT1RfQVBJX1NFQVJDSF9MRU4gLQorCQkJCSAgQVBJ X1NJR19NQUdMRU4gKyAweDAwNTAwMDAwKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBz dGFydCA9IDA7CisgICAgICBlbmQgPSAoc3RydWN0IGFwaV9zaWduYXR1cmUgKikgKDI1NiAqIDEw MjQgKiAxMDI0KTsKKyAgICB9CisKKyAgLyogU3RydWN0dXJlIGFsaWdubWVudCBpcyAoYXQgbGVh c3QpIDggYnl0ZXMgKi8KKyAgZm9yIChwID0gc3RhcnQ7IHAgPCBlbmQ7IHAgPSAodm9pZCAqKSAo KGdydWJfYWRkcl90KSBwICsgOCkpCisgICAgeworICAgICAgaWYgKGdydWJfbWVtY21wICgmKHAt Pm1hZ2ljKSwgQVBJX1NJR19NQUdJQywgQVBJX1NJR19NQUdMRU4pID09IDApCisJeworCSAgdWJv b3Rfc3lzY2FsbF9wdHIgPSBwLT5zeXNjYWxsOworCSAgcmV0dXJuIHAtPnZlcnNpb247CisJfQor ICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogQWxsIGZ1bmN0aW9ucyBiZWxvdyBhcmUgd3Jh cHBlcnMgYXJvdW5kIHRoZSB1Ym9vdF9zeXNjYWxsKCkgZnVuY3Rpb24gKi8KKworLyoKKyAqIGlu dCBBUElfZ2V0YyhpbnQgKmMpCisgKi8KK2ludAordWJvb3RfZ2V0YyAodm9pZCkKK3sKKyAgaW50 IGM7CisgIGlmICghdWJvb3Rfc3lzY2FsbCAoQVBJX0dFVEMsIE5VTEwsICZjKSkKKyAgICByZXR1 cm4gLTE7CisKKyAgcmV0dXJuIGM7Cit9CisKKy8qCisgKiBpbnQgQVBJX3RzdGMoaW50ICpjKQor ICovCitpbnQKK3Vib290X3RzdGMgKHZvaWQpCit7CisgIGludCBjOworICBpZiAoIXVib290X3N5 c2NhbGwgKEFQSV9UU1RDLCBOVUxMLCAmYykpCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiBj OworfQorCisvKgorICogaW50IEFQSV9wdXRjKGNoYXIgKmNoKQorICovCit2b2lkCit1Ym9vdF9w dXRjIChpbnQgYykKK3sKKyAgdWJvb3Rfc3lzY2FsbCAoQVBJX1BVVEMsIE5VTEwsICZjKTsKK30K KworLyoKKyAqIGludCBBUElfcHV0cyhjb25zdCBjaGFyICpzKQorICovCit2b2lkCit1Ym9vdF9w dXRzIChjb25zdCBjaGFyICpzKQoreworICB1Ym9vdF9zeXNjYWxsIChBUElfUFVUUywgTlVMTCwg cyk7Cit9CisKKy8qCisgKiBpbnQgQVBJX3Jlc2V0KHZvaWQpCisgKi8KK3ZvaWQKK3Vib290X3Jl c2V0ICh2b2lkKQoreworICB1Ym9vdF9zeXNjYWxsIChBUElfUkVTRVQsIE5VTEwsIDApOworfQor CisvKgorICogaW50IEFQSV9nZXRfc3lzX2luZm8oc3RydWN0IHN5c19pbmZvICpzaSkKKyAqCisg KiBmaWxsIG91dCB0aGUgc3lzX2luZm8gc3RydWN0IGNvbnRhaW5pbmcgc2VsZWN0ZWQgcGFyYW1l dGVycyBhYm91dCB0aGUKKyAqIG1hY2hpbmUKKyAqLworc3RydWN0IHN5c19pbmZvICoKK3Vib290 X2dldF9zeXNfaW5mbyAodm9pZCkKK3sKKyAgaW50IHJldHZhbDsKKworICBncnViX21lbXNldCAo JnVib290X3N5c19pbmZvLCAwLCBzaXplb2YgKHVib290X3N5c19pbmZvKSk7CisgIGdydWJfbWVt c2V0ICgmdWJvb3RfbWVtX2luZm8sIDAsIHNpemVvZiAodWJvb3RfbWVtX2luZm8pKTsKKyAgdWJv b3Rfc3lzX2luZm8ubXIgPSB1Ym9vdF9tZW1faW5mbzsKKyAgdWJvb3Rfc3lzX2luZm8ubXJfbm8g PSBzaXplb2YgKHVib290X21lbV9pbmZvKSAvIHNpemVvZiAoc3RydWN0IG1lbV9yZWdpb24pOwor CisgIGlmICh1Ym9vdF9zeXNjYWxsIChBUElfR0VUX1NZU19JTkZPLCAmcmV0dmFsLCAmdWJvb3Rf c3lzX2luZm8pKQorICAgIGlmIChyZXR2YWwgPT0gMCkKKyAgICAgIHJldHVybiAmdWJvb3Rfc3lz X2luZm87CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBpbnQgQVBJX3VkZWxheSh1bnNp Z25lZCBsb25nICp1ZGVsYXkpCisgKi8KK3ZvaWQKK3Vib290X3VkZWxheSAoZ3J1Yl91aW50MzJf dCB1c2VjKQoreworICB1Ym9vdF9zeXNjYWxsIChBUElfVURFTEFZLCBOVUxMLCAmdXNlYyk7Cit9 CisKKy8qCisgKiBpbnQgQVBJX2dldF90aW1lcih1bnNpZ25lZCBsb25nICpjdXJyZW50LCB1bnNp Z25lZCBsb25nICpiYXNlKQorICovCitncnViX3VpbnQzMl90Cit1Ym9vdF9nZXRfdGltZXIgKGdy dWJfdWludDMyX3QgYmFzZSkKK3sKKyAgZ3J1Yl91aW50MzJfdCBjdXJyZW50OworCisgIGlmICgh dWJvb3Rfc3lzY2FsbCAoQVBJX0dFVF9USU1FUiwgTlVMTCwgJmN1cnJlbnQsICZiYXNlKSkKKyAg ICByZXR1cm4gMDsKKworICByZXR1cm4gY3VycmVudDsKK30KKworLyoKKyAqIGludCBBUElfZGV2 X2VudW0oc3RydWN0IGRldmljZV9pbmZvICopCisgKgorICovCitpbnQKK3Vib290X2Rldl9lbnVt ICh2b2lkKQoreworICBpbnQgbWF4OworCisgIGdydWJfbWVtc2V0ICgmdWJvb3RfZGV2aWNlcywg MCwgc2l6ZW9mICh1Ym9vdF9kZXZpY2VzKSk7CisgIG1heCA9IHNpemVvZiAodWJvb3RfZGV2aWNl cykgLyBzaXplb2YgKHN0cnVjdCBkZXZpY2VfaW5mbyk7CisKKyAgLyoKKyAgICogVGhlIEFQSV9E RVZfRU5VTSBjYWxsIHN0YXJ0cyBhIGZyZXNoIGVudW1lcmF0aW9uIHdoZW4gcGFzc2VkIGEKKyAg ICogc3RydWN0IGRldmljZV9pbmZvIHdpdGggYSBOVUxMIGNvb2tpZSwgYW5kIHRoZW4gZGVwZW5k cyBvbiBoYXZpbmcKKyAgICogdGhlIHByZXZvaXVzbHkgZW51bWVyYXRlZCBkZXZpY2UgY29va2ll ICJzZWVkZWQiIGludG8gdGhlIHRhcmdldAorICAgKiBzdHJ1Y3R1cmUuCisgICAqLworICBpZiAo IXVib290X3N5c2NhbGwgKEFQSV9ERVZfRU5VTSwgTlVMTCwgJnVib290X2RldmljZXMpCisgICAg ICB8fCB1Ym9vdF9kZXZpY2VzWzBdLmNvb2tpZSA9PSBOVUxMKQorICAgIHJldHVybiAwOworCisg IGZvciAobnVtX2RldmljZXMgPSAxOyBudW1fZGV2aWNlcyA8IG1heDsgbnVtX2RldmljZXMrKykK KyAgICB7CisgICAgICB1Ym9vdF9kZXZpY2VzW251bV9kZXZpY2VzXS5jb29raWUgPQorCXVib290 X2RldmljZXNbbnVtX2RldmljZXMgLSAxXS5jb29raWU7CisgICAgICBpZiAoIXVib290X3N5c2Nh bGwgKEFQSV9ERVZfRU5VTSwgTlVMTCwgJnVib290X2RldmljZXNbbnVtX2RldmljZXNdKSkKKwly ZXR1cm4gMDsKKworICAgICAgLyogV2hlbiBubyBtb3JlIGRldmljZXMgdG8gZW51bWVyYXRlLCB0 YXJnZXQgY29va2llIHNldCB0byBOVUxMICovCisgICAgICBpZiAodWJvb3RfZGV2aWNlc1tudW1f ZGV2aWNlc10uY29va2llID09IE5VTEwpCisJYnJlYWs7CisgICAgfQorCisgIHJldHVybiBudW1f ZGV2aWNlczsKK30KKworI2RlZmluZSBWQUxJRF9ERVYoeCkgKCgoeCkgPCBudW1fZGV2aWNlcykg JiYgKCh4KSA+PSAwKSkKKyNkZWZpbmUgT1BFTl9ERVYoeCkgKFZBTElEX0RFVih4KSAmJiAodWJv b3RfZGV2aWNlc1soeCldLnN0YXRlID09IERFVl9TVEFfT1BFTikpCisKK3N0cnVjdCBkZXZpY2Vf aW5mbyAqCit1Ym9vdF9kZXZfZ2V0IChpbnQgaGFuZGxlKQoreworICBpZiAoVkFMSURfREVWICho YW5kbGUpKQorICAgIHJldHVybiAmdWJvb3RfZGV2aWNlc1toYW5kbGVdOworCisgIHJldHVybiBO VUxMOworfQorCisKKy8qCisgKiBpbnQgQVBJX2Rldl9vcGVuKHN0cnVjdCBkZXZpY2VfaW5mbyAq KQorICovCitpbnQKK3Vib290X2Rldl9vcGVuIChpbnQgaGFuZGxlKQoreworICBzdHJ1Y3QgZGV2 aWNlX2luZm8gKmRldjsKKyAgaW50IHJldHZhbDsKKworICBpZiAoIVZBTElEX0RFViAoaGFuZGxl KSkKKyAgICByZXR1cm4gLTE7CisKKyAgZGV2ID0gJnVib290X2RldmljZXNbaGFuZGxlXTsKKwor ICBpZiAoIXVib290X3N5c2NhbGwgKEFQSV9ERVZfT1BFTiwgJnJldHZhbCwgZGV2KSkKKyAgICBy ZXR1cm4gLTE7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIGludCBBUElfZGV2X2Ns b3NlKHN0cnVjdCBkZXZpY2VfaW5mbyAqKQorICovCitpbnQKK3Vib290X2Rldl9jbG9zZSAoaW50 IGhhbmRsZSkKK3sKKyAgc3RydWN0IGRldmljZV9pbmZvICpkZXY7CisgIGludCByZXR2YWw7CisK KyAgaWYgKCFWQUxJRF9ERVYgKGhhbmRsZSkpCisgICAgcmV0dXJuIC0xOworCisgIGRldiA9ICZ1 Ym9vdF9kZXZpY2VzW2hhbmRsZV07CisKKyAgaWYgKCF1Ym9vdF9zeXNjYWxsIChBUElfREVWX0NM T1NFLCAmcmV0dmFsLCBkZXYpKQorICAgIHJldHVybiAtMTsKKworICByZXR1cm4gcmV0dmFsOwor fQorCisKKy8qCisgKiBpbnQgQVBJX2Rldl9yZWFkKHN0cnVjdCBkZXZpY2VfaW5mbyAqZGksIHZv aWQgKmJ1ZiwJc2l6ZV90ICpsZW4sCisgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcg KnN0YXJ0LCBzaXplX3QgKmFjdF9sZW4pCisgKi8KK2ludAordWJvb3RfZGV2X3JlYWQgKGludCBo YW5kbGUsIHZvaWQgKmJ1ZiwgbGJhc2l6ZV90IGJsb2NrcywKKwkJbGJhc3RhcnRfdCBzdGFydCwg bGJhc2l6ZV90ICogcmVhbF9ibG9ja3MpCit7CisgIHN0cnVjdCBkZXZpY2VfaW5mbyAqZGV2Owor ICBpbnQgcmV0dmFsOworCisgIGlmICghT1BFTl9ERVYgKGhhbmRsZSkpCisgICAgcmV0dXJuIC0x OworCisgIGRldiA9ICZ1Ym9vdF9kZXZpY2VzW2hhbmRsZV07CisKKyAgaWYgKCF1Ym9vdF9zeXNj YWxsIChBUElfREVWX1JFQUQsICZyZXR2YWwsIGRldiwgYnVmLAorCQkgICAgICAmYmxvY2tzLCAm c3RhcnQsIHJlYWxfYmxvY2tzKSkKKyAgICByZXR1cm4gLTE7CisKKyAgcmV0dXJuIHJldHZhbDsK K30KKworLyoKKyAqIGludCBBUElfZGV2X3JlYWQoc3RydWN0IGRldmljZV9pbmZvICpkaSwgdm9p ZCAqYnVmLAorICogICAgICAgICAgICAgICAgICBzaXplX3QgKmxlbiwgc2l6ZV90ICphY3RfbGVu KQorICovCitpbnQKK3Vib290X2Rldl9yZWN2IChpbnQgaGFuZGxlLCB2b2lkICpidWYsIGludCBz aXplLCBpbnQgKnJlYWxfc2l6ZSkKK3sKKyAgc3RydWN0IGRldmljZV9pbmZvICpkZXY7CisgIGlu dCByZXR2YWw7CisKKyAgaWYgKCFPUEVOX0RFViAoaGFuZGxlKSkKKyAgICByZXR1cm4gLTE7CisK KyAgZGV2ID0gJnVib290X2RldmljZXNbaGFuZGxlXTsKKyAgaWYgKCF1Ym9vdF9zeXNjYWxsIChB UElfREVWX1JFQUQsICZyZXR2YWwsIGRldiwgYnVmLCAmc2l6ZSwgcmVhbF9zaXplKSkKKyAgICBy ZXR1cm4gLTE7CisKKyAgcmV0dXJuIHJldHZhbDsKKworfQorCisvKgorICogTm90aWNlOiB0aGlz IGlzIGZvciBzZW5kaW5nIG5ldHdvcmsgcGFja2V0cyBvbmx5LCBhcyBVLUJvb3QgZG9lcyBub3QK KyAqIHN1cHBvcnQgd3JpdGluZyB0byBzdG9yYWdlIGF0IHRoZSBtb21lbnQgKDEyLjIwMDcpCisg KgorICogaW50IEFQSV9kZXZfd3JpdGUoc3RydWN0IGRldmljZV9pbmZvICpkaSwgdm9pZCAqYnVm LAlpbnQgKmxlbikKKyAqLworaW50Cit1Ym9vdF9kZXZfc2VuZCAoaW50IGhhbmRsZSwgdm9pZCAq YnVmLCBpbnQgc2l6ZSkKK3sKKyAgc3RydWN0IGRldmljZV9pbmZvICpkZXY7CisgIGludCByZXR2 YWw7CisKKyAgaWYgKCFPUEVOX0RFViAoaGFuZGxlKSkKKyAgICByZXR1cm4gLTE7CisKKyAgZGV2 ID0gJnVib290X2RldmljZXNbaGFuZGxlXTsKKyAgaWYgKCF1Ym9vdF9zeXNjYWxsIChBUElfREVW X1dSSVRFLCAmcmV0dmFsLCBkZXYsIGJ1ZiwgJnNpemUpKQorICAgIHJldHVybiAtMTsKKworICBy ZXR1cm4gcmV0dmFsOworfQorCisvKgorICogaW50IEFQSV9lbnZfZ2V0KGNvbnN0IGNoYXIgKm5h bWUsIGNoYXIgKip2YWx1ZSkKKyAqLworY2hhciAqCit1Ym9vdF9lbnZfZ2V0IChjb25zdCBjaGFy ICpuYW1lKQoreworICBjaGFyICp2YWx1ZTsKKworICBpZiAoIXVib290X3N5c2NhbGwgKEFQSV9F TlZfR0VULCBOVUxMLCBuYW1lLCAmdmFsdWUpKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVy biB2YWx1ZTsKK30KKworLyoKKyAqIGludCBBUElfZW52X3NldChjb25zdCBjaGFyICpuYW1lLCBj b25zdCBjaGFyICp2YWx1ZSkKKyAqLwordm9pZAordWJvb3RfZW52X3NldCAoY29uc3QgY2hhciAq bmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIHVib290X3N5c2NhbGwgKEFQSV9FTlZfU0VU LCBOVUxMLCBuYW1lLCB2YWx1ZSk7Cit9CmRpZmYgLXB1ck4gdHJ1bmsvZ3J1Yi1jb3JlL2xpYi9h cm0vbGliZ2NjLlMgYXJtLXVib290L2dydWItY29yZS9saWIvYXJtL2xpYmdjYy5TCi0tLSB0cnVu ay9ncnViLWNvcmUvbGliL2FybS9saWJnY2MuUwkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAw MCArMDEwMAorKysgYXJtLXVib290L2dydWItY29yZS9saWIvYXJtL2xpYmdjYy5TCTIwMTItMTEt MjAgMTY6MjY6NTQuOTUwOTIwMDAwICswMDAwCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogIEdS VUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTIg IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBHUlVCIGlzIGZyZWUgc29m dHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRl ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hl ZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMg b2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv bi4KKyAqCisgKiAgR1JVQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg YmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl ZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0 aCBHUlVCLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICov CisKKyNpbmNsdWRlIDxncnViL3N5bWJvbC5oPgorI2luY2x1ZGUgPGdydWIvZGwuaD4KKworCS5m aWxlCSJsaWJnY2MuUyIKKwkuc3ludGF4CXVuaWZpZWQKKyNpZiAhZGVmaW5lZCAoX190aHVtYjJf XykKKwkuYXJtCisjZGVmaW5lIEFSTSh4Li4uKQl4CisjZGVmaW5lIFRIVU1CKHguLi4pCisjZWxz ZQorCS50aHVtYgorI2RlZmluZSBUSFVNQih4Li4uKQl4CisjZGVmaW5lIEFSTSh4Li4uKQorI2Vu ZGlmCisKKwkKKyNpZmRlZiBfX0FSTUVCX18KKyNkZWZpbmUgYWwgcjEKKyNkZWZpbmUgYWggcjAK KyNlbHNlCisjZGVmaW5lIGFsIHIwCisjZGVmaW5lIGFoIHIxCisjZW5kaWYKKworR1JVQl9NT0Rf TElDRU5TRSAiR1BMdjMrIgorCisvKgorICogIGhlbHBlciBmdW5jdGlvbnMgLSBfX2FlYWJpKiB3 aXRoIG1hY3JvcyBpbXBvcnRlZCBmcm9tIExpbnV4IGtlcm5lbDoKKyAqICAgIGxpbnV4L2FyY2gv YXJtL2xpYi9saWIxZnVuY3MuUworICogICAgbGludXgvYXJjaC9hcm0vbGliL2FzaGxkaTMuUwor ICogICAgbGludXgvYXJjaC9hcm0vbGliL2FzaHJkaTMuUworICogICAgbGludXgvYXJjaC9hcm0v bGliL2xzaHJkaTMuUworICovCisKKy8qCisgKiBUYWtlbiBmcm9tIGxpbnV4L2FyY2gvYXJtL2xp Yi9saWIxZnVuY3MuUworICogUmV0YWluaW5nIG9ubHkgQVJNdjUrIGNvZGUgcGF0aHMKKyAqLwor Lm1hY3JvIEFSTV9ESVZfQk9EWSBkaXZpZGVuZCwgZGl2aXNvciwgcmVzdWx0LCBjdXJiaXQKKyAg ICAgICAgY2x6ICAgICBcY3VyYml0LCBcZGl2aXNvcgorICAgICAgICBjbHogICAgIFxyZXN1bHQs IFxkaXZpZGVuZAorICAgICAgICBzdWIgICAgIFxyZXN1bHQsIFxjdXJiaXQsIFxyZXN1bHQKKyAg ICAgICAgbW92ICAgICBcY3VyYml0LCAjMQorICAgICAgICBtb3YgICAgIFxkaXZpc29yLCBcZGl2 aXNvciwgbHNsIFxyZXN1bHQKKyAgICAgICAgbW92ICAgICBcY3VyYml0LCBcY3VyYml0LCBsc2wg XHJlc3VsdAorICAgICAgICBtb3YgICAgIFxyZXN1bHQsICMwCisKKyAgICAgICAgQCBEaXZpc2lv biBsb29wCisxOiAgICAgIGNtcCAgICAgXGRpdmlkZW5kLCBcZGl2aXNvcgorICAgICAgICBzdWJo cyAgIFxkaXZpZGVuZCwgXGRpdmlkZW5kLCBcZGl2aXNvcgorICAgICAgICBvcnJocyAgIFxyZXN1 bHQsICAgXHJlc3VsdCwgICBcY3VyYml0CisgICAgICAgIGNtcCAgICAgXGRpdmlkZW5kLCBcZGl2 aXNvciwgIGxzciAjMQorICAgICAgICBzdWJocyAgIFxkaXZpZGVuZCwgXGRpdmlkZW5kLCBcZGl2 aXNvciwgbHNyICMxCisgICAgICAgIG9ycmhzICAgXHJlc3VsdCwgICBccmVzdWx0LCAgIFxjdXJi aXQsICBsc3IgIzEKKyAgICAgICAgY21wICAgICBcZGl2aWRlbmQsIFxkaXZpc29yLCAgbHNyICMy CisgICAgICAgIHN1YmhzICAgXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yLCBsc3IgIzIK KyAgICAgICAgb3JyaHMgICBccmVzdWx0LCAgIFxyZXN1bHQsICAgXGN1cmJpdCwgIGxzciAjMgor ICAgICAgICBjbXAgICAgIFxkaXZpZGVuZCwgXGRpdmlzb3IsICBsc3IgIzMKKyAgICAgICAgc3Vi aHMgICBcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IsIGxzciAjMworICAgICAgICBvcnJo cyAgIFxyZXN1bHQsICAgXHJlc3VsdCwgICBcY3VyYml0LCAgbHNyICMzCisgICAgICAgIGNtcCAg ICAgXGRpdmlkZW5kLCAjMCAgICAgICAgICAgICAgICAgICBAIEVhcmx5IHRlcm1pbmF0aW9uPwor ICAgICAgICBtb3ZuZXMgIFxjdXJiaXQsICAgXGN1cmJpdCwgIGxzciAjNCAgICAgQCBObywgYW55 IG1vcmUgYml0cyB0byBkbz8KKyAgICAgICAgbW92bmUgICBcZGl2aXNvciwgIFxkaXZpc29yLCBs c3IgIzQKKyAgICAgICAgYm5lICAgICAxYgorCisuZW5kbQorCisubWFjcm8gQVJNX0RJVjJfT1JE RVIgZGl2aXNvciwgb3JkZXIKKyAgICAgICAgY2x6ICAgICBcb3JkZXIsIFxkaXZpc29yCisgICAg ICAgIHJzYiAgICAgXG9yZGVyLCBcb3JkZXIsICMzMQorLmVuZG0KKworLm1hY3JvIEFSTV9NT0Rf Qk9EWSBkaXZpZGVuZCwgZGl2aXNvciwgb3JkZXIsIHNwYXJlCisgICAgICAgIGNseiAgICAgXG9y ZGVyLCBcZGl2aXNvcgorICAgICAgICBjbHogICAgIFxzcGFyZSwgXGRpdmlkZW5kCisgICAgICAg IHN1YiAgICAgXG9yZGVyLCBcb3JkZXIsIFxzcGFyZQorICAgICAgICBtb3YgICAgIFxkaXZpc29y LCBcZGl2aXNvciwgbHNsIFxvcmRlcgorICAgICAgICBAIFBlcmZvcm0gYWxsIG5lZWRlZCBzdWJz dHJhY3Rpb25zIHRvIGtlZXAgb25seSB0aGUgcmVtaW5kZXIuCisgICAgICAgIEAgRG8gY29tcGFy aXNvbnMgaW4gYmF0Y2ggb2YgNCBmaXJzdC4KKyAgICAgICAgc3VicyAgICBcb3JkZXIsIFxvcmRl ciwgIzMgICAgICAgICAgICAgIEAgeWVzLCAzIGlzIGludGVuZGVkIGhlcmUKKyAgICAgICAgYmx0 ICAgICAyZgorCisxOiAgICAgIGNtcCAgICAgXGRpdmlkZW5kLCBcZGl2aXNvcgorICAgICAgICBz dWJocyAgIFxkaXZpZGVuZCwgXGRpdmlkZW5kLCBcZGl2aXNvcgorICAgICAgICBjbXAgICAgIFxk aXZpZGVuZCwgXGRpdmlzb3IsICBsc3IgIzEKKyAgICAgICAgc3ViaHMgICBcZGl2aWRlbmQsIFxk aXZpZGVuZCwgXGRpdmlzb3IsIGxzciAjMQorICAgICAgICBjbXAgICAgIFxkaXZpZGVuZCwgXGRp dmlzb3IsICBsc3IgIzIKKyAgICAgICAgc3ViaHMgICBcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRp dmlzb3IsIGxzciAjMgorICAgICAgICBjbXAgICAgIFxkaXZpZGVuZCwgXGRpdmlzb3IsICBsc3Ig IzMKKyAgICAgICAgc3ViaHMgICBcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IsIGxzciAj MworICAgICAgICBjbXAgICAgIFxkaXZpZGVuZCwgIzEKKyAgICAgICAgbW92ICAgICBcZGl2aXNv ciwgXGRpdmlzb3IsIGxzciAjNAorICAgICAgICBzdWJnZXMgIFxvcmRlciwgXG9yZGVyLCAjNAor ICAgICAgICBiZ2UgICAgIDFiCisKKyAgICAgICAgdHN0ICAgICBcb3JkZXIsICMzCisgICAgICAg IHRlcW5lICAgXGRpdmlkZW5kLCAjMAorICAgICAgICBiZXEgICAgIDVmCisKKyAgICAgICAgQCBF aXRoZXIgMSwgMiBvciAzIGNvbXBhcmlzb24vc3Vic3RyYWN0aW9ucyBhcmUgbGVmdC4KKzI6ICAg ICAgY21uICAgICBcb3JkZXIsICMyCisgICAgICAgIGJsdCAgICAgNGYKKyAgICAgICAgYmVxICAg ICAzZgorICAgICAgICBjbXAgICAgIFxkaXZpZGVuZCwgXGRpdmlzb3IKKyAgICAgICAgc3ViaHMg ICBcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IKKyAgICAgICAgbW92ICAgICBcZGl2aXNv ciwgIFxkaXZpc29yLCAgbHNyICMxCiszOiAgICAgIGNtcCAgICAgXGRpdmlkZW5kLCBcZGl2aXNv cgorICAgICAgICBzdWJocyAgIFxkaXZpZGVuZCwgXGRpdmlkZW5kLCBcZGl2aXNvcgorICAgICAg ICBtb3YgICAgIFxkaXZpc29yLCAgXGRpdmlzb3IsICBsc3IgIzEKKzQ6ICAgICAgY21wICAgICBc ZGl2aWRlbmQsIFxkaXZpc29yCisgICAgICAgIHN1YmhzICAgXGRpdmlkZW5kLCBcZGl2aWRlbmQs IFxkaXZpc29yCis1OgorLmVuZG0KKworCS50ZXh0CitGVU5DVElPTihfX2FlYWJpX3VpZGl2KQor ICAgICAgIHN1YnMgICAgcjIsIHIxLCAjMQorICAgICAgICBtb3ZlcSAgIHBjLCBscgorICAgICAg ICBiY2MgICAgIExkaXYwCisgICAgICAgIGNtcCAgICAgcjAsIHIxCisgICAgICAgIGJscyAgICAg MTFmCisgICAgICAgIHRzdCAgICAgcjEsIHIyCisgICAgICAgIGJlcSAgICAgMTJmCisKKyAgICAg ICAgQVJNX0RJVl9CT0RZIHIwLCByMSwgcjIsIHIzCisKKyAgICAgICAgbW92ICAgICByMCwgcjIK KyAgICAgICAgbW92ICAgICBwYywgbHIKKworMTE6ICAgICBtb3ZlcSAgIHIwLCAjMQorICAgICAg ICBtb3ZuZSAgIHIwLCAjMAorCWJ4CWxyCisKKzEyOiAgICAgQVJNX0RJVjJfT1JERVIgcjEsIHIy CisKKyAgICAgICAgbW92ICAgICByMCwgcjAsIGxzciByMgorCWJ4CWxyCisKK0ZVTkNUSU9OKF9f YWVhYmlfaWRpdikKKyAgICAgICAgY21wICAgICByMSwgIzAKKyAgICAgICAgZW9yICAgICBpcCwg cjAsIHIxICAgICAgICAgICAgICAgICAgICAgIEAgc2F2ZSB0aGUgc2lnbiBvZiB0aGUgcmVzdWx0 LgorICAgICAgICBiZXEgICAgIExkaXYwCisgICAgICAgIHJzYm1pICAgcjEsIHIxLCAjMCAgICAg ICAgICAgICAgICAgICAgICBAIGxvb3BzIGJlbG93IHVzZSB1bnNpZ25lZC4KKyAgICAgICAgc3Vi cyAgICByMiwgcjEsICMxICAgICAgICAgICAgICAgICAgICAgIEAgZGl2aXNpb24gYnkgMSBvciAt MSA/CisgICAgICAgIGJlcSAgICAgMTBmCisgICAgICAgIG1vdnMgICAgcjMsIHIwCisgICAgICAg IHJzYm1pICAgcjMsIHIwLCAjMCAgICAgICAgICAgICAgICAgICAgICBAIHBvc2l0aXZlIGRpdmlk ZW5kIHZhbHVlCisgICAgICAgIGNtcCAgICAgcjMsIHIxCisgICAgICAgIGJscyAgICAgMTFmCisg ICAgICAgIHRzdCAgICAgcjEsIHIyICAgICAgICAgICAgICAgICAgICAgICAgICBAIGRpdmlzb3Ig aXMgcG93ZXIgb2YgMiA/CisgICAgICAgIGJlcSAgICAgMTJmCisKKyAgICAgICAgQVJNX0RJVl9C T0RZIHIzLCByMSwgcjAsIHIyCisKKyAgICAgICAgY21wICAgICBpcCwgIzAKKyAgICAgICAgcnNi bWkgICByMCwgcjAsICMwCisJYngJbHIKKworMTA6ICAgICB0ZXEgICAgIGlwLCByMCAgICAgICAg ICAgICAgICAgICAgICAgICAgQCBzYW1lIHNpZ24gPworICAgICAgICByc2JtaSAgIHIwLCByMCwg IzAKKwlieAlscgorCisxMTogICAgIG1vdmxvICAgcjAsICMwCisgICAgICAgIG1vdmVxICAgcjAs IGlwLCBhc3IgIzMxCisgICAgICAgIG9ycmVxICAgcjAsIHIwLCAjMQorCWJ4CWxyCisKKzEyOiAg ICAgQVJNX0RJVjJfT1JERVIgcjEsIHIyCisKKyAgICAgICAgY21wICAgICBpcCwgIzAKKyAgICAg ICAgbW92ICAgICByMCwgcjMsIGxzciByMgorICAgICAgICByc2JtaSAgIHIwLCByMCwgIzAKKwli eAlscgorCitGVU5DVElPTihfX2FlYWJpX3VpZGl2bW9kKQorICAgICAgICBzdG1mZCAgIHNwISwg e3IwLCByMSwgaXAsIGxyfQorICAgICAgICBibCAgICAgIF9fYWVhYmlfdWlkaXYKKyAgICAgICAg bGRtZmQgICBzcCEsIHtyMSwgcjIsIGlwLCBscn0KKyAgICAgICAgbXVsICAgICByMywgcjAsIHIy CisgICAgICAgIHN1YiAgICAgcjEsIHIxLCByMworCWJ4CWxyCisKK0ZVTkNUSU9OKF9fYWVhYmlf aWRpdm1vZCkKKyAgICAgICAgc3RtZmQgICBzcCEsIHtyMCwgcjEsIGlwLCBscn0KKyAgICAgICAg YmwgICAgICBfX2FlYWJpX2lkaXYKKyAgICAgICAgbGRtZmQgICBzcCEsIHtyMSwgcjIsIGlwLCBs cn0KKyAgICAgICAgbXVsICAgICByMywgcjAsIHIyCisgICAgICAgIHN1YiAgICAgcjEsIHIxLCBy MworCWJ4CWxyCisKK0AgKERvbid0KSBoYW5kbGUgZGl2aXNpb24gYnkgMAorRlVOQ1RJT04oTGRp djApCisJcHVzaAl7cjQsIGxyfQorICAgICAgICBtb3YgICAgIHIwLCAjMCAgICAgICAgICAgICAg ICAgIEAgQWJvdXQgYXMgd3JvbmcgYXMgaXQgY291bGQgYmUuCisJcG9wCXtyNCwgcGN9CisKKwor LyoKKyAqIEZyb20gbGludXgvYXJjaC9hcm0vbGliLz9zaCozLlMKKyAqLworRlVOQ1RJT04oX19h ZWFiaV9sYXNyKQorICAgICAgICBzdWJzICAgIHIzLCByMiwgIzMyCisgICAgICAgIHJzYiAgICAg aXAsIHIyLCAjMzIKKyAgICAgICAgbW92bWkgICBhbCwgYWwsIGxzciByMgorICAgICAgICBtb3Zw bCAgIGFsLCBhaCwgYXNyIHIzCisgQVJNKCAgIG9ycm1pICAgYWwsIGFsLCBhaCwgbHNsIGlwICAg ICAgKQorIFRIVU1CKCBsc2xtaSAgIHIzLCBhaCwgaXAgICAgICAgICAgICAgICkKKyBUSFVNQigg b3JybWkgICBhbCwgYWwsIHIzICAgICAgICAgICAgICApCisgICAgICAgIG1vdiAgICAgYWgsIGFo LCBhc3IgcjIKKwlieAlscgorCitGVU5DVElPTihfX2FlYWJpX2xsc2wpCisgICAgICAgIHN1YnMg ICAgcjMsIHIyLCAjMzIKKyAgICAgICAgcnNiICAgICBpcCwgcjIsICMzMgorICAgICAgICBtb3Zt aSAgIGFoLCBhaCwgbHNsIHIyCisgICAgICAgIG1vdnBsICAgYWgsIGFsLCBsc2wgcjMKKyBBUk0o ICAgb3JybWkgICBhaCwgYWgsIGFsLCBsc3IgaXAgICAgICApCisgVEhVTUIoIGxzcm1pICAgcjMs IGFsLCBpcCAgICAgICAgICAgICAgKQorIFRIVU1CKCBvcnJtaSAgIGFoLCBhaCwgcjMgICAgICAg ICAgICAgICkKKyAgICAgICAgbW92ICAgICBhbCwgYWwsIGxzbCByMgorCWJ4CWxyCisKK0ZVTkNU SU9OKF9fYWVhYmlfbGxzcikKKyAgICAgICAgc3VicyAgICByMywgcjIsICMzMgorICAgICAgICBy c2IgICAgIGlwLCByMiwgIzMyCisgICAgICAgIG1vdm1pICAgYWwsIGFsLCBsc3IgcjIKKyAgICAg ICAgbW92cGwgICBhbCwgYWgsIGxzciByMworIEFSTSggICBvcnJtaSAgIGFsLCBhbCwgYWgsIGxz bCBpcCAgICAgICkKKyBUSFVNQiggbHNsbWkgICByMywgYWgsIGlwICAgICAgICAgICAgICApCisg VEhVTUIoIG9ycm1pICAgYWwsIGFsLCByMyAgICAgICAgICAgICAgKQorICAgICAgICBtb3YgICAg IGFoLCBhaCwgbHNyIHIyCisJYngJbHIKKworCisvKgorICogU2ltcGxlIGNhY2hlIG1haW50ZW5h bmNlIGZ1bmN0aW9ucworICovCisKK0AgcjAgLSAqYmVnIChpbmNsdXNpdmUpCitAIHIxIC0gKmVu ZCAoZXhjbHVzaXZlKQkKK2NsZWFuX2RjYWNoZV9yYW5nZToKKwlARENDTVZBVQorMToJY21wCXIw LCByMQorCWJnZQkyZgorCW1jcglwMTUsIDAsIHIwLCBjNywgYzExLCAxCisJYWRkCXIwLCByMCwg IzMyIEAgYXNzdW1lIDMyLWJ5dGUgY2FjaGUgbGluZQorMjoJZHNiCisJYngJbHIKKworQCByMCAt ICpiZWcgKGluY2x1c2l2ZSkKK0AgcjEgLSAqZW5kIChleGNsdXNpdmUpCQoraW52YWxpZGF0ZV9p Y2FjaGVfcmFuZ2U6CisJQElDSU1WQVUKKzE6CWNtcAlyMCwgcjEKKwliZ2UJMmYKKwltY3IJcDE1 LCAwLCByMCwgYzcsIGM1LCAxCisJQEJQSU1WQQorCW1jcglwMTUsIDAsIHIwLCBjNywJYzUsIDcK KwlhZGQJcjAsIHIwLCAjMzIgQCBhc3N1bWUgMzItYnl0ZSBjYWNoZSBsaW5lCisJYgkxYgorCWRz YgorMjoJaXNiCisJYngJbHIKKwkKK0B2b2lkIF9fY2xlYXJfY2FjaGUoY2hhciAqYmVnLCBjaGFy ICplbmQpOworRlVOQ1RJT04oX19jbGVhcl9jYWNoZSkKKwlwdXNoCXtyNC1yNiwgbHJ9CisJbW92 CXI0LCByMAorCW1vdglyNSwgcjEKKwlibAljbGVhbl9kY2FjaGVfcmFuZ2UKKwltb3YJcjAsIHI0 CisJbW92CXIxLCByNQorCWJsCWludmFsaWRhdGVfaWNhY2hlX3JhbmdlCisJcG9wCXtyNC1yNiwg cGN9CisKK0B2b2lkIGdydWJfYXJjaF9zeW5jX2NhY2hlcyAodm9pZCAqYWRkcmVzcywgZ3J1Yl9z aXplX3QgbGVuKQorRlVOQ1RJT04oZ3J1Yl9hcmNoX3N5bmNfY2FjaGVzKQorCWFkZAlyMSwgcjAs IHIxCisJYglfX2NsZWFyX2NhY2hlCisKKwkuZW5kCmRpZmYgLXB1ck4gdHJ1bmsvZ3J1Yi1jb3Jl L2xpYi9hcm0vc2V0am1wLlMgYXJtLXVib290L2dydWItY29yZS9saWIvYXJtL3NldGptcC5TCi0t LSB0cnVuay9ncnViLWNvcmUvbGliL2FybS9zZXRqbXAuUwkxOTcwLTAxLTAxIDAxOjAwOjAwLjAw MDAwMDAwMCArMDEwMAorKysgYXJtLXVib290L2dydWItY29yZS9saWIvYXJtL3NldGptcC5TCTIw MTItMTEtMjAgMTY6MjY6NTQuOTUwOTIwMDAwICswMDAwCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisg KiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykg MjAxMiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIEdSVUIgaXMgZnJl ZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0 IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVi bGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNp b24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2 ZXJzaW9uLgorICoKKyAqICBHUlVCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg d2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2 ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJl Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9u ZyB3aXRoIEdSVUIuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4u CisgKi8KKworI2luY2x1ZGUgPGdydWIvc3ltYm9sLmg+CisjaW5jbHVkZSA8Z3J1Yi9kbC5oPgor CisJLmZpbGUJInNldGptcC5TIgorCS5zeW50YXgJdW5pZmllZAorI2lmICFkZWZpbmVkIChfX3Ro dW1iMl9fKQorCS5hcm0KKyNkZWZpbmUgQVJNKHguLi4pCXgKKyNkZWZpbmUgVEhVTUIoeC4uLikK KyNlbHNlCisJLnRodW1iCisjZGVmaW5lIFRIVU1CKHguLi4pCXgKKyNkZWZpbmUgQVJNKHguLi4p CisjZW5kaWYKKworR1JVQl9NT0RfTElDRU5TRSAiR1BMdjMrIgorCisJLnRleHQKKworLyoKKyAq IGludCBncnViX3NldGptcCAoZ3J1Yl9qbXBfYnVmIGVudikKKyAqLworRlVOQ1RJT04oZ3J1Yl9z ZXRqbXApCisgVEhVTUIoCW1vdglpcCwgc3AJCQkpCisgVEhVTUIoCXN0bQlyMCwgeyByNC1yMTEs IGlwLCBsciB9CSkKKyBBUk0oCXN0bQlyMCwgeyByNC1yMTEsIHNwLCBsciB9CSkKKwltb3YJcjAs ICMwCisJYngJbHIKKworLyoKKyAqIGludCBncnViX2xvbmdqbXAgKGdydWJfam1wX2J1ZiBlbnYs IGludCB2YWwpCisgKi8KK0ZVTkNUSU9OKGdydWJfbG9uZ2ptcCkKKyBUSFVNQigJbGRtCXIwLCB7 IHI0LXIxMSwgaXAsIGxyIH0JKQorIFRIVU1CKAltb3YJc3AsIGlwCQkJKQorIEFSTSgJbGRtCXIw LCB7IHI0LXIxMSwgc3AsIGxyIH0JKQorCW1vdnMJcjAsIHIxCisJbW92ZXEJcjAsICMxCisJYngJ bHIKZGlmZiAtcHVyTiB0cnVuay9ncnViLWNvcmUvbGliL2R0Yy9saWJmZHQvZmR0LmMgYXJtLXVi b290L2dydWItY29yZS9saWIvZHRjL2xpYmZkdC9mZHQuYwotLS0gdHJ1bmsvZ3J1Yi1jb3JlL2xp Yi9kdGMvbGliZmR0L2ZkdC5jCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCisr KyBhcm0tdWJvb3QvZ3J1Yi1jb3JlL2xpYi9kdGMvbGliZmR0L2ZkdC5jCTIwMTItMTEtMjAgMTY6 MjY6NTQuOTUwOTIwMDAwICswMDAwCkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogbGliZmR0IC0g RmxhdCBEZXZpY2UgVHJlZSBtYW5pcHVsYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwNiBEYXZp ZCBHaWJzb24sIElCTSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBsaWJmZHQgaXMgZHVhbCBsaWNlbnNl ZDogeW91IGNhbiB1c2UgaXQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdQTCwg b3IgdGhlIEJTRCBsaWNlbnNlLCBhdCB5b3VyIG9wdGlvbi4KKyAqCisgKiAgYSkgVGhpcyBsaWJy YXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICog ICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiAgICAgTGljZW5zZSwgb3IgKGF0IHlvdXIg b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBsaWJyYXJ5IGlzIGRp c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0 IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg b2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV UlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v cmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMg bGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgIFNvZnR3YXJlIEZvdW5k YXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAorICogICAg IE1BIDAyMTEwLTEzMDEgVVNBCisgKgorICogQWx0ZXJuYXRpdmVseSwKKyAqCisgKiAgYikgUmVk aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgor ICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg dGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgMS4g UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICog ICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg Zm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqICAgICAyLiBSZWRpc3RyaWJ1dGlv bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29w eXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcK KyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt YXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor ICogICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJT IEFORAorICogICAgIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM SUVEIFdBUlJBTlRJRVMsCisgKiAgICAgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogICAgIERJU0NMQUlNRUQuIElOIE5P IEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqICAgICBDT05UUklCVVRPUlMg QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqICAgICBT UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC VVQKKyAqICAgICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E UyBPUiBTRVJWSUNFUzsKKyAqICAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig QlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogICAgIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogICAgIENPTlRSQUNULCBTVFJJQ1Qg TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorICogICAgIE9USEVS V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs CisgKiAgICAgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH RS4KKyAqLworI2luY2x1ZGUgImxpYmZkdF9lbnYuaCIKKworI2luY2x1ZGUgPGZkdC5oPgorI2lu Y2x1ZGUgPGxpYmZkdC5oPgorCisjaW5jbHVkZSAibGliZmR0X2ludGVybmFsLmgiCisKK2ludCBm ZHRfY2hlY2tfaGVhZGVyKGNvbnN0IHZvaWQgKmZkdCkKK3sKKwlpZiAoZmR0X21hZ2ljKGZkdCkg PT0gRkRUX01BR0lDKSB7CisJCS8qIENvbXBsZXRlIHRyZWUgKi8KKwkJaWYgKGZkdF92ZXJzaW9u KGZkdCkgPCBGRFRfRklSU1RfU1VQUE9SVEVEX1ZFUlNJT04pCisJCQlyZXR1cm4gLUZEVF9FUlJf QkFEVkVSU0lPTjsKKwkJaWYgKGZkdF9sYXN0X2NvbXBfdmVyc2lvbihmZHQpID4gRkRUX0xBU1Rf U1VQUE9SVEVEX1ZFUlNJT04pCisJCQlyZXR1cm4gLUZEVF9FUlJfQkFEVkVSU0lPTjsKKwl9IGVs c2UgaWYgKGZkdF9tYWdpYyhmZHQpID09IEZEVF9TV19NQUdJQykgeworCQkvKiBVbmZpbmlzaGVk IHNlcXVlbnRpYWwtd3JpdGUgYmxvYiAqLworCQlpZiAoZmR0X3NpemVfZHRfc3RydWN0KGZkdCkg PT0gMCkKKwkJCXJldHVybiAtRkRUX0VSUl9CQURTVEFURTsKKwl9IGVsc2UgeworCQlyZXR1cm4g LUZEVF9FUlJfQkFETUFHSUM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IHZvaWQgKmZk dF9vZmZzZXRfcHRyKGNvbnN0IHZvaWQgKmZkdCwgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGxl bikKK3sKKwljb25zdCBjaGFyICpwOworCisJaWYgKGZkdF92ZXJzaW9uKGZkdCkgPj0gMHgxMSkK KwkJaWYgKCgob2Zmc2V0ICsgbGVuKSA8IG9mZnNldCkKKwkJICAgIHx8ICgob2Zmc2V0ICsgbGVu KSA+IGZkdF9zaXplX2R0X3N0cnVjdChmZHQpKSkKKwkJCXJldHVybiBOVUxMOworCisJcCA9IF9m ZHRfb2Zmc2V0X3B0cihmZHQsIG9mZnNldCk7CisKKwlpZiAocCArIGxlbiA8IHApCisJCXJldHVy biBOVUxMOworCXJldHVybiBwOworfQorCit1aW50MzJfdCBmZHRfbmV4dF90YWcoY29uc3Qgdm9p ZCAqZmR0LCBpbnQgc3RhcnRvZmZzZXQsIGludCAqbmV4dG9mZnNldCkKK3sKKwljb25zdCB1aW50 MzJfdCAqdGFncCwgKmxlbnA7CisJdWludDMyX3QgdGFnOworCWludCBvZmZzZXQgPSBzdGFydG9m ZnNldDsKKwljb25zdCBjaGFyICpwOworCisJKm5leHRvZmZzZXQgPSAtRkRUX0VSUl9UUlVOQ0FU RUQ7CisJdGFncCA9IGZkdF9vZmZzZXRfcHRyKGZkdCwgb2Zmc2V0LCBGRFRfVEFHU0laRSk7CisJ aWYgKCF0YWdwKQorCQlyZXR1cm4gRkRUX0VORDsgLyogcHJlbWF0dXJlIGVuZCAqLworCXRhZyA9 IGZkdDMyX3RvX2NwdSgqdGFncCk7CisJb2Zmc2V0ICs9IEZEVF9UQUdTSVpFOworCisJKm5leHRv ZmZzZXQgPSAtRkRUX0VSUl9CQURTVFJVQ1RVUkU7CisJc3dpdGNoICh0YWcpIHsKKwljYXNlIEZE VF9CRUdJTl9OT0RFOgorCQkvKiBza2lwIG5hbWUgKi8KKwkJZG8geworCQkJcCA9IGZkdF9vZmZz ZXRfcHRyKGZkdCwgb2Zmc2V0KyssIDEpOworCQl9IHdoaWxlIChwICYmICgqcCAhPSAnXDAnKSk7 CisJCWlmICghcCkKKwkJCXJldHVybiBGRFRfRU5EOyAvKiBwcmVtYXR1cmUgZW5kICovCisJCWJy ZWFrOworCisJY2FzZSBGRFRfUFJPUDoKKwkJbGVucCA9IGZkdF9vZmZzZXRfcHRyKGZkdCwgb2Zm c2V0LCBzaXplb2YoKmxlbnApKTsKKwkJaWYgKCFsZW5wKQorCQkJcmV0dXJuIEZEVF9FTkQ7IC8q IHByZW1hdHVyZSBlbmQgKi8KKwkJLyogc2tpcC1uYW1lIG9mZnNldCwgbGVuZ3RoIGFuZCB2YWx1 ZSAqLworCQlvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBmZHRfcHJvcGVydHkpIC0gRkRUX1RBR1NJ WkUKKwkJCSsgZmR0MzJfdG9fY3B1KCpsZW5wKTsKKwkJYnJlYWs7CisKKwljYXNlIEZEVF9FTkQ6 CisJY2FzZSBGRFRfRU5EX05PREU6CisJY2FzZSBGRFRfTk9QOgorCQlicmVhazsKKworCWRlZmF1 bHQ6CisJCXJldHVybiBGRFRfRU5EOworCX0KKworCWlmICghZmR0X29mZnNldF9wdHIoZmR0LCBz dGFydG9mZnNldCwgb2Zmc2V0IC0gc3RhcnRvZmZzZXQpKQorCQlyZXR1cm4gRkRUX0VORDsgLyog cHJlbWF0dXJlIGVuZCAqLworCisJKm5leHRvZmZzZXQgPSBGRFRfVEFHQUxJR04ob2Zmc2V0KTsK KwlyZXR1cm4gdGFnOworfQorCitpbnQgX2ZkdF9jaGVja19ub2RlX29mZnNldChjb25zdCB2b2lk ICpmZHQsIGludCBvZmZzZXQpCit7CisJaWYgKChvZmZzZXQgPCAwKSB8fCAob2Zmc2V0ICUgRkRU X1RBR1NJWkUpCisJICAgIHx8IChmZHRfbmV4dF90YWcoZmR0LCBvZmZzZXQsICZvZmZzZXQpICE9 IEZEVF9CRUdJTl9OT0RFKSkKKwkJcmV0dXJuIC1GRFRfRVJSX0JBRE9GRlNFVDsKKworCXJldHVy biBvZmZzZXQ7Cit9CisKK2ludCBfZmR0X2NoZWNrX3Byb3Bfb2Zmc2V0KGNvbnN0IHZvaWQgKmZk dCwgaW50IG9mZnNldCkKK3sKKwlpZiAoKG9mZnNldCA8IDApIHx8IChvZmZzZXQgJSBGRFRfVEFH U0laRSkKKwkgICAgfHwgKGZkdF9uZXh0X3RhZyhmZHQsIG9mZnNldCwgJm9mZnNldCkgIT0gRkRU X1BST1ApKQorCQlyZXR1cm4gLUZEVF9FUlJfQkFET0ZGU0VUOworCisJcmV0dXJuIG9mZnNldDsK K30KKworaW50IGZkdF9uZXh0X25vZGUoY29uc3Qgdm9pZCAqZmR0LCBpbnQgb2Zmc2V0LCBpbnQg KmRlcHRoKQoreworCWludCBuZXh0b2Zmc2V0ID0gMDsKKwl1aW50MzJfdCB0YWc7CisKKwlpZiAo b2Zmc2V0ID49IDApCisJCWlmICgobmV4dG9mZnNldCA9IF9mZHRfY2hlY2tfbm9kZV9vZmZzZXQo ZmR0LCBvZmZzZXQpKSA8IDApCisJCQlyZXR1cm4gbmV4dG9mZnNldDsKKworCWRvIHsKKwkJb2Zm c2V0ID0gbmV4dG9mZnNldDsKKwkJdGFnID0gZmR0X25leHRfdGFnKGZkdCwgb2Zmc2V0LCAmbmV4 dG9mZnNldCk7CisKKwkJc3dpdGNoICh0YWcpIHsKKwkJY2FzZSBGRFRfUFJPUDoKKwkJY2FzZSBG RFRfTk9QOgorCQkJYnJlYWs7CisKKwkJY2FzZSBGRFRfQkVHSU5fTk9ERToKKwkJCWlmIChkZXB0 aCkKKwkJCQkoKmRlcHRoKSsrOworCQkJYnJlYWs7CisKKwkJY2FzZSBGRFRfRU5EX05PREU6CisJ CQlpZiAoZGVwdGggJiYgKCgtLSgqZGVwdGgpKSA8IDApKQorCQkJCXJldHVybiBuZXh0b2Zmc2V0 OworCQkJYnJlYWs7CisKKwkJY2FzZSBGRFRfRU5EOgorCQkJaWYgKChuZXh0b2Zmc2V0ID49IDAp CisJCQkgICAgfHwgKChuZXh0b2Zmc2V0ID09IC1GRFRfRVJSX1RSVU5DQVRFRCkgJiYgIWRlcHRo KSkKKwkJCQlyZXR1cm4gLUZEVF9FUlJfTk9URk9VTkQ7CisJCQllbHNlCisJCQkJcmV0dXJuIG5l eHRvZmZzZXQ7CisJCX0KKwl9IHdoaWxlICh0YWcgIT0gRkRUX0JFR0lOX05PREUpOworCisJcmV0 dXJuIG9mZnNldDsKK30KKworY29uc3QgY2hhciAqX2ZkdF9maW5kX3N0cmluZyhjb25zdCBjaGFy ICpzdHJ0YWIsIGludCB0YWJzaXplLCBjb25zdCBjaGFyICpzKQoreworCWludCBsZW4gPSBzdHJs ZW4ocykgKyAxOworCWNvbnN0IGNoYXIgKmxhc3QgPSBzdHJ0YWIgKyB0YWJzaXplIC0gbGVuOwor CWNvbnN0IGNoYXIgKnA7CisKKwlmb3IgKHAgPSBzdHJ0YWI7IHAgPD0gbGFzdDsgcCsrKQorCQlp ZiAobWVtY21wKHAsIHMsIGxlbikgPT0gMCkKKwkJCXJldHVybiBwOworCXJldHVybiBOVUxMOwor fQorCitpbnQgZmR0X21vdmUoY29uc3Qgdm9pZCAqZmR0LCB2b2lkICpidWYsIGludCBidWZzaXpl KQoreworCUZEVF9DSEVDS19IRUFERVIoZmR0KTsKKworCWlmIChmZHRfdG90YWxzaXplKGZkdCkg PiBidWZzaXplKQorCQlyZXR1cm4gLUZEVF9FUlJfTk9TUEFDRTsKKworCW1lbW1vdmUoYnVmLCBm ZHQsIGZkdF90b3RhbHNpemUoZmR0KSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLXB1ck4gdHJ1bmsv Z3J1Yi1jb3JlL2xpYi9kdGMvbGliZmR0L2ZkdC5oIGFybS11Ym9vdC9ncnViLWNvcmUvbGliL2R0 Yy9saWJmZHQvZmR0LmgKLS0tIHRydW5rL2dydWItY29yZS9saWIvZHRjL2xpYmZkdC9mZHQuaAkx OTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMAorKysgYXJtLXVib290L2dydWItY29y ZS9saWIvZHRjL2xpYmZkdC9mZHQuaAkyMDEyLTExLTIwIDE2OjI2OjU0Ljk1MDkyMDAwMCArMDAw MApAQCAtMCwwICsxLDYwIEBACisjaWZuZGVmIF9GRFRfSAorI2RlZmluZSBfRkRUX0gKKworI2lm bmRlZiBfX0FTU0VNQkxZX18KKworc3RydWN0IGZkdF9oZWFkZXIgeworCXVpbnQzMl90IG1hZ2lj OwkJCSAvKiBtYWdpYyB3b3JkIEZEVF9NQUdJQyAqLworCXVpbnQzMl90IHRvdGFsc2l6ZTsJCSAv KiB0b3RhbCBzaXplIG9mIERUIGJsb2NrICovCisJdWludDMyX3Qgb2ZmX2R0X3N0cnVjdDsJCSAv KiBvZmZzZXQgdG8gc3RydWN0dXJlICovCisJdWludDMyX3Qgb2ZmX2R0X3N0cmluZ3M7CSAvKiBv ZmZzZXQgdG8gc3RyaW5ncyAqLworCXVpbnQzMl90IG9mZl9tZW1fcnN2bWFwOwkgLyogb2Zmc2V0 IHRvIG1lbW9yeSByZXNlcnZlIG1hcCAqLworCXVpbnQzMl90IHZlcnNpb247CQkgLyogZm9ybWF0 IHZlcnNpb24gKi8KKwl1aW50MzJfdCBsYXN0X2NvbXBfdmVyc2lvbjsJIC8qIGxhc3QgY29tcGF0 aWJsZSB2ZXJzaW9uICovCisKKwkvKiB2ZXJzaW9uIDIgZmllbGRzIGJlbG93ICovCisJdWludDMy X3QgYm9vdF9jcHVpZF9waHlzOwkgLyogV2hpY2ggcGh5c2ljYWwgQ1BVIGlkIHdlJ3JlCisJCQkJ CSAgICBib290aW5nIG9uICovCisJLyogdmVyc2lvbiAzIGZpZWxkcyBiZWxvdyAqLworCXVpbnQz Ml90IHNpemVfZHRfc3RyaW5nczsJIC8qIHNpemUgb2YgdGhlIHN0cmluZ3MgYmxvY2sgKi8KKwor CS8qIHZlcnNpb24gMTcgZmllbGRzIGJlbG93ICovCisJdWludDMyX3Qgc2l6ZV9kdF9zdHJ1Y3Q7 CSAvKiBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgYmxvY2sgKi8KK307CisKK3N0cnVjdCBmZHRfcmVz ZXJ2ZV9lbnRyeSB7CisJdWludDY0X3QgYWRkcmVzczsKKwl1aW50NjRfdCBzaXplOworfTsKKwor c3RydWN0IGZkdF9ub2RlX2hlYWRlciB7CisJdWludDMyX3QgdGFnOworCWNoYXIgbmFtZVswXTsK K307CisKK3N0cnVjdCBmZHRfcHJvcGVydHkgeworCXVpbnQzMl90IHRhZzsKKwl1aW50MzJfdCBs ZW47CisJdWludDMyX3QgbmFtZW9mZjsKKwljaGFyIGRhdGFbMF07Cit9OworCisjZW5kaWYgLyog IV9fQVNTRU1CTFkgKi8KKworI2RlZmluZSBGRFRfTUFHSUMJMHhkMDBkZmVlZAkvKiA0OiB2ZXJz aW9uLCA0OiB0b3RhbCBzaXplICovCisjZGVmaW5lIEZEVF9UQUdTSVpFCXNpemVvZih1aW50MzJf dCkKKworI2RlZmluZSBGRFRfQkVHSU5fTk9ERQkweDEJCS8qIFN0YXJ0IG5vZGU6IGZ1bGwgbmFt ZSAqLworI2RlZmluZSBGRFRfRU5EX05PREUJMHgyCQkvKiBFbmQgbm9kZSAqLworI2RlZmluZSBG RFRfUFJPUAkweDMJCS8qIFByb3BlcnR5OiBuYW1lIG9mZiwKKwkJCQkJICAgc2l6ZSwgY29udGVu dCAqLworI2RlZmluZSBGRFRfTk9QCQkweDQJCS8qIG5vcCAqLworI2RlZmluZSBGRFRfRU5ECQkw eDkKKworI2RlZmluZSBGRFRfVjFfU0laRQkoNypzaXplb2YodWludDMyX3QpKQorI2RlZmluZSBG RFRfVjJfU0laRQkoRkRUX1YxX1NJWkUgKyBzaXplb2YodWludDMyX3QpKQorI2RlZmluZSBGRFRf VjNfU0laRQkoRkRUX1YyX1NJWkUgKyBzaXplb2YodWludDMyX3QpKQorI2RlZmluZSBGRFRfVjE2 X1NJWkUJRkRUX1YzX1NJWkUKKyNkZWZpbmUgRkRUX1YxN19TSVpFCShGRFRfVjE2X1NJWkUgKyBz aXplb2YodWludDMyX3QpKQorCisjZW5kaWYgLyogX0ZEVF9IICovCmRpZmYgLXB1ck4gdHJ1bmsv Z3J1Yi1jb3JlL2xpYi9kdGMvbGliZmR0L2ZkdF9yby5jIGFybS11Ym9vdC9ncnViLWNvcmUvbGli L2R0Yy9saWJmZHQvZmR0X3JvLmMKLS0tIHRydW5rL2dydWItY29yZS9saWIvZHRjL2xpYmZkdC9m ZHRfcm8uYwkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMAorKysgYXJtLXVib290 L2dydWItY29yZS9saWIvZHRjL2xpYmZkdC9mZHRfcm8uYwkyMDEyLTExLTIwIDE2OjI2OjU0Ljk1 MDkyMDAwMCArMDAwMApAQCAtMCwwICsxLDU3NCBAQAorLyoKKyAqIGxpYmZkdCAtIEZsYXQgRGV2 aWNlIFRyZWUgbWFuaXB1bGF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRGF2aWQgR2lic29u LCBJQk0gQ29ycG9yYXRpb24uCisgKgorICogbGliZmR0IGlzIGR1YWwgbGljZW5zZWQ6IHlvdSBj YW4gdXNlIGl0IGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBHUEwsIG9yIHRoZSBC U0QgbGljZW5zZSwgYXQgeW91ciBvcHRpb24uCisgKgorICogIGEpIFRoaXMgbGlicmFyeSBpcyBm cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2Rp ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBh cworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo ZXIgdmVyc2lvbiAyIG9mIHRoZQorICogICAgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg YW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRl ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VU IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAg ICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg U2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp bHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYworICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7 IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJ bmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKKyAqICAgICBNQSAwMjEx MC0xMzAxIFVTQQorICoKKyAqIEFsdGVybmF0aXZlbHksCisgKgorICogIGIpIFJlZGlzdHJpYnV0 aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3 aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs b3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgIDEuIFJlZGlzdHJp YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBj b3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu ZworICogICAgICAgIGRpc2NsYWltZXIuCisgKiAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJp bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBu b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAg ICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz CisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqICAgICBU SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKKyAq ICAgICBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS QU5USUVTLAorICogICAgIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElF RCBXQVJSQU5USUVTIE9GCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqICAgICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT SEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiAgICAgQ09OVFJJQlVUT1JTIEJFIExJQUJM RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiAgICAgU1BFQ0lBTCwg RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAg ICAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS VklDRVM7CisgKiAgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT IElOVEVSUlVQVElPTikKKyAqICAgICBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqICAgICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU WSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKKyAqICAgICBPVEhFUldJU0UpIEFS SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAorICogICAg IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K KyNpbmNsdWRlICJsaWJmZHRfZW52LmgiCisKKyNpbmNsdWRlIDxmZHQuaD4KKyNpbmNsdWRlIDxs aWJmZHQuaD4KKworI2luY2x1ZGUgImxpYmZkdF9pbnRlcm5hbC5oIgorCitzdGF0aWMgaW50IF9m ZHRfbm9kZW5hbWVfZXEoY29uc3Qgdm9pZCAqZmR0LCBpbnQgb2Zmc2V0LAorCQkJICAgIGNvbnN0 IGNoYXIgKnMsIGludCBsZW4pCit7CisJY29uc3QgY2hhciAqcCA9IGZkdF9vZmZzZXRfcHRyKGZk dCwgb2Zmc2V0ICsgRkRUX1RBR1NJWkUsIGxlbisxKTsKKworCWlmICghIHApCisJCS8qIHNob3J0 IG1hdGNoICovCisJCXJldHVybiAwOworCisJaWYgKG1lbWNtcChwLCBzLCBsZW4pICE9IDApCisJ CXJldHVybiAwOworCisJaWYgKHBbbGVuXSA9PSAnXDAnKQorCQlyZXR1cm4gMTsKKwllbHNlIGlm ICghbWVtY2hyKHMsICdAJywgbGVuKSAmJiAocFtsZW5dID09ICdAJykpCisJCXJldHVybiAxOwor CWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK2NvbnN0IGNoYXIgKmZkdF9zdHJpbmcoY29uc3Qgdm9p ZCAqZmR0LCBpbnQgc3Ryb2Zmc2V0KQoreworCXJldHVybiAoY29uc3QgY2hhciAqKWZkdCArIGZk dF9vZmZfZHRfc3RyaW5ncyhmZHQpICsgc3Ryb2Zmc2V0OworfQorCitzdGF0aWMgaW50IF9mZHRf c3RyaW5nX2VxKGNvbnN0IHZvaWQgKmZkdCwgaW50IHN0cm9mZnNldCwKKwkJCSAgY29uc3QgY2hh ciAqcywgaW50IGxlbikKK3sKKwljb25zdCBjaGFyICpwID0gZmR0X3N0cmluZyhmZHQsIHN0cm9m ZnNldCk7CisKKwlyZXR1cm4gKHN0cmxlbihwKSA9PSBsZW4pICYmIChtZW1jbXAocCwgcywgbGVu KSA9PSAwKTsKK30KKworaW50IGZkdF9nZXRfbWVtX3Jzdihjb25zdCB2b2lkICpmZHQsIGludCBu LCB1aW50NjRfdCAqYWRkcmVzcywgdWludDY0X3QgKnNpemUpCit7CisJRkRUX0NIRUNLX0hFQURF UihmZHQpOworCSphZGRyZXNzID0gZmR0NjRfdG9fY3B1KF9mZHRfbWVtX3JzdihmZHQsIG4pLT5h ZGRyZXNzKTsKKwkqc2l6ZSA9IGZkdDY0X3RvX2NwdShfZmR0X21lbV9yc3YoZmR0LCBuKS0+c2l6 ZSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBmZHRfbnVtX21lbV9yc3YoY29uc3Qgdm9pZCAqZmR0 KQoreworCWludCBpID0gMDsKKworCXdoaWxlIChmZHQ2NF90b19jcHUoX2ZkdF9tZW1fcnN2KGZk dCwgaSktPnNpemUpICE9IDApCisJCWkrKzsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBf bmV4dHByb3AoY29uc3Qgdm9pZCAqZmR0LCBpbnQgb2Zmc2V0KQoreworCXVpbnQzMl90IHRhZzsK KwlpbnQgbmV4dG9mZnNldDsKKworCWRvIHsKKwkJdGFnID0gZmR0X25leHRfdGFnKGZkdCwgb2Zm c2V0LCAmbmV4dG9mZnNldCk7CisKKwkJc3dpdGNoICh0YWcpIHsKKwkJY2FzZSBGRFRfRU5EOgor CQkJaWYgKG5leHRvZmZzZXQgPj0gMCkKKwkJCQlyZXR1cm4gLUZEVF9FUlJfQkFEU1RSVUNUVVJF OworCQkJZWxzZQorCQkJCXJldHVybiBuZXh0b2Zmc2V0OworCisJCWNhc2UgRkRUX1BST1A6CisJ CQlyZXR1cm4gb2Zmc2V0OworCQl9CisJCW9mZnNldCA9IG5leHRvZmZzZXQ7CisJfSB3aGlsZSAo dGFnID09IEZEVF9OT1ApOworCisJcmV0dXJuIC1GRFRfRVJSX05PVEZPVU5EOworfQorCitpbnQg ZmR0X3N1Ym5vZGVfb2Zmc2V0X25hbWVsZW4oY29uc3Qgdm9pZCAqZmR0LCBpbnQgb2Zmc2V0LAor CQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQoreworCWludCBkZXB0aDsK KworCUZEVF9DSEVDS19IRUFERVIoZmR0KTsKKworCWZvciAoZGVwdGggPSAwOworCSAgICAgKG9m ZnNldCA+PSAwKSAmJiAoZGVwdGggPj0gMCk7CisJICAgICBvZmZzZXQgPSBmZHRfbmV4dF9ub2Rl KGZkdCwgb2Zmc2V0LCAmZGVwdGgpKQorCQlpZiAoKGRlcHRoID09IDEpCisJCSAgICAmJiBfZmR0 X25vZGVuYW1lX2VxKGZkdCwgb2Zmc2V0LCBuYW1lLCBuYW1lbGVuKSkKKwkJCXJldHVybiBvZmZz ZXQ7CisKKwlpZiAoZGVwdGggPCAwKQorCQlyZXR1cm4gLUZEVF9FUlJfTk9URk9VTkQ7CisJcmV0 dXJuIG9mZnNldDsgLyogZXJyb3IgKi8KK30KKworaW50IGZkdF9zdWJub2RlX29mZnNldChjb25z dCB2b2lkICpmZHQsIGludCBwYXJlbnRvZmZzZXQsCisJCSAgICAgICBjb25zdCBjaGFyICpuYW1l KQoreworCXJldHVybiBmZHRfc3Vibm9kZV9vZmZzZXRfbmFtZWxlbihmZHQsIHBhcmVudG9mZnNl dCwgbmFtZSwgc3RybGVuKG5hbWUpKTsKK30KKworaW50IGZkdF9wYXRoX29mZnNldChjb25zdCB2 b2lkICpmZHQsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJY29uc3QgY2hhciAqZW5kID0gcGF0aCAr IHN0cmxlbihwYXRoKTsKKwljb25zdCBjaGFyICpwID0gcGF0aDsKKwlpbnQgb2Zmc2V0ID0gMDsK KworCUZEVF9DSEVDS19IRUFERVIoZmR0KTsKKworCS8qIHNlZSBpZiB3ZSBoYXZlIGFuIGFsaWFz ICovCisJaWYgKCpwYXRoICE9ICcvJykgeworCQljb25zdCBjaGFyICpxID0gc3RyY2hyKHBhdGgs ICcvJyk7CisKKwkJaWYgKCFxKQorCQkJcSA9IGVuZDsKKworCQlwID0gZmR0X2dldF9hbGlhc19u YW1lbGVuKGZkdCwgcCwgcSAtIHApOworCQlpZiAoIXApCisJCQlyZXR1cm4gLUZEVF9FUlJfQkFE UEFUSDsKKwkJb2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0KGZkdCwgcCk7CisKKwkJcCA9IHE7CisJ fQorCisJd2hpbGUgKCpwKSB7CisJCWNvbnN0IGNoYXIgKnE7CisKKwkJd2hpbGUgKCpwID09ICcv JykKKwkJCXArKzsKKwkJaWYgKCEgKnApCisJCQlyZXR1cm4gb2Zmc2V0OworCQlxID0gc3RyY2hy KHAsICcvJyk7CisJCWlmICghIHEpCisJCQlxID0gZW5kOworCisJCW9mZnNldCA9IGZkdF9zdWJu b2RlX29mZnNldF9uYW1lbGVuKGZkdCwgb2Zmc2V0LCBwLCBxLXApOworCQlpZiAob2Zmc2V0IDwg MCkKKwkJCXJldHVybiBvZmZzZXQ7CisKKwkJcCA9IHE7CisJfQorCisJcmV0dXJuIG9mZnNldDsK K30KKworY29uc3QgY2hhciAqZmR0X2dldF9uYW1lKGNvbnN0IHZvaWQgKmZkdCwgaW50IG5vZGVv ZmZzZXQsIGludCAqbGVuKQoreworCWNvbnN0IHN0cnVjdCBmZHRfbm9kZV9oZWFkZXIgKm5oID0g X2ZkdF9vZmZzZXRfcHRyKGZkdCwgbm9kZW9mZnNldCk7CisJaW50IGVycjsKKworCWlmICgoKGVy ciA9IGZkdF9jaGVja19oZWFkZXIoZmR0KSkgIT0gMCkKKwkgICAgfHwgKChlcnIgPSBfZmR0X2No ZWNrX25vZGVfb2Zmc2V0KGZkdCwgbm9kZW9mZnNldCkpIDwgMCkpCisJCQlnb3RvIGZhaWw7CisK KwlpZiAobGVuKQorCQkqbGVuID0gc3RybGVuKG5oLT5uYW1lKTsKKworCXJldHVybiBuaC0+bmFt ZTsKKworIGZhaWw6CisJaWYgKGxlbikKKwkJKmxlbiA9IGVycjsKKwlyZXR1cm4gTlVMTDsKK30K KworaW50IGZkdF9maXJzdF9wcm9wZXJ0eV9vZmZzZXQoY29uc3Qgdm9pZCAqZmR0LCBpbnQgbm9k ZW9mZnNldCkKK3sKKwlpbnQgb2Zmc2V0OworCisJaWYgKChvZmZzZXQgPSBfZmR0X2NoZWNrX25v ZGVfb2Zmc2V0KGZkdCwgbm9kZW9mZnNldCkpIDwgMCkKKwkJcmV0dXJuIG9mZnNldDsKKworCXJl dHVybiBfbmV4dHByb3AoZmR0LCBvZmZzZXQpOworfQorCitpbnQgZmR0X25leHRfcHJvcGVydHlf b2Zmc2V0KGNvbnN0IHZvaWQgKmZkdCwgaW50IG9mZnNldCkKK3sKKwlpZiAoKG9mZnNldCA9IF9m ZHRfY2hlY2tfcHJvcF9vZmZzZXQoZmR0LCBvZmZzZXQpKSA8IDApCisJCXJldHVybiBvZmZzZXQ7 CisKKwlyZXR1cm4gX25leHRwcm9wKGZkdCwgb2Zmc2V0KTsKK30KKworY29uc3Qgc3RydWN0IGZk dF9wcm9wZXJ0eSAqZmR0X2dldF9wcm9wZXJ0eV9ieV9vZmZzZXQoY29uc3Qgdm9pZCAqZmR0LAor CQkJCQkJICAgICAgaW50IG9mZnNldCwKKwkJCQkJCSAgICAgIGludCAqbGVucCkKK3sKKwlpbnQg ZXJyOworCWNvbnN0IHN0cnVjdCBmZHRfcHJvcGVydHkgKnByb3A7CisKKwlpZiAoKGVyciA9IF9m ZHRfY2hlY2tfcHJvcF9vZmZzZXQoZmR0LCBvZmZzZXQpKSA8IDApIHsKKwkJaWYgKGxlbnApCisJ CQkqbGVucCA9IGVycjsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcHJvcCA9IF9mZHRfb2Zmc2V0 X3B0cihmZHQsIG9mZnNldCk7CisKKwlpZiAobGVucCkKKwkJKmxlbnAgPSBmZHQzMl90b19jcHUo cHJvcC0+bGVuKTsKKworCXJldHVybiBwcm9wOworfQorCitjb25zdCBzdHJ1Y3QgZmR0X3Byb3Bl cnR5ICpmZHRfZ2V0X3Byb3BlcnR5X25hbWVsZW4oY29uc3Qgdm9pZCAqZmR0LAorCQkJCQkJICAg IGludCBvZmZzZXQsCisJCQkJCQkgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJCSAgICBpbnQg bmFtZWxlbiwgaW50ICpsZW5wKQoreworCWZvciAob2Zmc2V0ID0gZmR0X2ZpcnN0X3Byb3BlcnR5 X29mZnNldChmZHQsIG9mZnNldCk7CisJICAgICAob2Zmc2V0ID49IDApOworCSAgICAgKG9mZnNl dCA9IGZkdF9uZXh0X3Byb3BlcnR5X29mZnNldChmZHQsIG9mZnNldCkpKSB7CisJCWNvbnN0IHN0 cnVjdCBmZHRfcHJvcGVydHkgKnByb3A7CisKKwkJaWYgKCEocHJvcCA9IGZkdF9nZXRfcHJvcGVy dHlfYnlfb2Zmc2V0KGZkdCwgb2Zmc2V0LCBsZW5wKSkpIHsKKwkJCW9mZnNldCA9IC1GRFRfRVJS X0lOVEVSTkFMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKF9mZHRfc3RyaW5nX2VxKGZkdCwgZmR0 MzJfdG9fY3B1KHByb3AtPm5hbWVvZmYpLAorCQkJCSAgIG5hbWUsIG5hbWVsZW4pKQorCQkJcmV0 dXJuIHByb3A7CisJfQorCisJaWYgKGxlbnApCisJCSpsZW5wID0gb2Zmc2V0OworCXJldHVybiBO VUxMOworfQorCitjb25zdCBzdHJ1Y3QgZmR0X3Byb3BlcnR5ICpmZHRfZ2V0X3Byb3BlcnR5KGNv bnN0IHZvaWQgKmZkdCwKKwkJCQkJICAgIGludCBub2Rlb2Zmc2V0LAorCQkJCQkgICAgY29uc3Qg Y2hhciAqbmFtZSwgaW50ICpsZW5wKQoreworCXJldHVybiBmZHRfZ2V0X3Byb3BlcnR5X25hbWVs ZW4oZmR0LCBub2Rlb2Zmc2V0LCBuYW1lLAorCQkJCQlzdHJsZW4obmFtZSksIGxlbnApOworfQor Citjb25zdCB2b2lkICpmZHRfZ2V0cHJvcF9uYW1lbGVuKGNvbnN0IHZvaWQgKmZkdCwgaW50IG5v ZGVvZmZzZXQsCisJCQkJY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGludCAqbGVucCkK K3sKKwljb25zdCBzdHJ1Y3QgZmR0X3Byb3BlcnR5ICpwcm9wOworCisJcHJvcCA9IGZkdF9nZXRf cHJvcGVydHlfbmFtZWxlbihmZHQsIG5vZGVvZmZzZXQsIG5hbWUsIG5hbWVsZW4sIGxlbnApOwor CWlmICghIHByb3ApCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIHByb3AtPmRhdGE7Cit9CisK K2NvbnN0IHZvaWQgKmZkdF9nZXRwcm9wX2J5X29mZnNldChjb25zdCB2b2lkICpmZHQsIGludCBv ZmZzZXQsCisJCQkJICBjb25zdCBjaGFyICoqbmFtZXAsIGludCAqbGVucCkKK3sKKwljb25zdCBz dHJ1Y3QgZmR0X3Byb3BlcnR5ICpwcm9wOworCisJcHJvcCA9IGZkdF9nZXRfcHJvcGVydHlfYnlf b2Zmc2V0KGZkdCwgb2Zmc2V0LCBsZW5wKTsKKwlpZiAoIXByb3ApCisJCXJldHVybiBOVUxMOwor CWlmIChuYW1lcCkKKwkJKm5hbWVwID0gZmR0X3N0cmluZyhmZHQsIGZkdDMyX3RvX2NwdShwcm9w LT5uYW1lb2ZmKSk7CisJcmV0dXJuIHByb3AtPmRhdGE7Cit9CisKK2NvbnN0IHZvaWQgKmZkdF9n ZXRwcm9wKGNvbnN0IHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsCisJCQljb25zdCBjaGFyICpu YW1lLCBpbnQgKmxlbnApCit7CisJcmV0dXJuIGZkdF9nZXRwcm9wX25hbWVsZW4oZmR0LCBub2Rl b2Zmc2V0LCBuYW1lLCBzdHJsZW4obmFtZSksIGxlbnApOworfQorCit1aW50MzJfdCBmZHRfZ2V0 X3BoYW5kbGUoY29uc3Qgdm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCkKK3sKKwljb25zdCB1aW50 MzJfdCAqcGhwOworCWludCBsZW47CisKKwkvKiBGSVhNRTogVGhpcyBpcyBhIGJpdCBzdWItb3B0 aW1hbCwgc2luY2Ugd2UgcG90ZW50aWFsbHkgc2NhbgorCSAqIG92ZXIgYWxsIHRoZSBwcm9wZXJ0 aWVzIHR3aWNlLiAqLworCXBocCA9IGZkdF9nZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgInBoYW5k bGUiLCAmbGVuKTsKKwlpZiAoIXBocCB8fCAobGVuICE9IHNpemVvZigqcGhwKSkpIHsKKwkJcGhw ID0gZmR0X2dldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCAibGludXgscGhhbmRsZSIsICZsZW4pOwor CQlpZiAoIXBocCB8fCAobGVuICE9IHNpemVvZigqcGhwKSkpCisJCQlyZXR1cm4gMDsKKwl9CisK KwlyZXR1cm4gZmR0MzJfdG9fY3B1KCpwaHApOworfQorCitjb25zdCBjaGFyICpmZHRfZ2V0X2Fs aWFzX25hbWVsZW4oY29uc3Qgdm9pZCAqZmR0LAorCQkJCSAgY29uc3QgY2hhciAqbmFtZSwgaW50 IG5hbWVsZW4pCit7CisJaW50IGFsaWFzb2Zmc2V0OworCisJYWxpYXNvZmZzZXQgPSBmZHRfcGF0 aF9vZmZzZXQoZmR0LCAiL2FsaWFzZXMiKTsKKwlpZiAoYWxpYXNvZmZzZXQgPCAwKQorCQlyZXR1 cm4gTlVMTDsKKworCXJldHVybiBmZHRfZ2V0cHJvcF9uYW1lbGVuKGZkdCwgYWxpYXNvZmZzZXQs IG5hbWUsIG5hbWVsZW4sIE5VTEwpOworfQorCitjb25zdCBjaGFyICpmZHRfZ2V0X2FsaWFzKGNv bnN0IHZvaWQgKmZkdCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gZmR0X2dldF9hbGlh c19uYW1lbGVuKGZkdCwgbmFtZSwgc3RybGVuKG5hbWUpKTsKK30KKworaW50IGZkdF9nZXRfcGF0 aChjb25zdCB2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LCBjaGFyICpidWYsIGludCBidWZsZW4p Cit7CisJaW50IHBkZXB0aCA9IDAsIHAgPSAwOworCWludCBvZmZzZXQsIGRlcHRoLCBuYW1lbGVu OworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwlGRFRfQ0hFQ0tfSEVBREVSKGZkdCk7CisKKwlpZiAo YnVmbGVuIDwgMikKKwkJcmV0dXJuIC1GRFRfRVJSX05PU1BBQ0U7CisKKwlmb3IgKG9mZnNldCA9 IDAsIGRlcHRoID0gMDsKKwkgICAgIChvZmZzZXQgPj0gMCkgJiYgKG9mZnNldCA8PSBub2Rlb2Zm c2V0KTsKKwkgICAgIG9mZnNldCA9IGZkdF9uZXh0X25vZGUoZmR0LCBvZmZzZXQsICZkZXB0aCkp IHsKKwkJd2hpbGUgKHBkZXB0aCA+IGRlcHRoKSB7CisJCQlkbyB7CisJCQkJcC0tOworCQkJfSB3 aGlsZSAoYnVmW3AtMV0gIT0gJy8nKTsKKwkJCXBkZXB0aC0tOworCQl9CisKKwkJaWYgKHBkZXB0 aCA+PSBkZXB0aCkgeworCQkJbmFtZSA9IGZkdF9nZXRfbmFtZShmZHQsIG9mZnNldCwgJm5hbWVs ZW4pOworCQkJaWYgKCFuYW1lKQorCQkJCXJldHVybiBuYW1lbGVuOworCQkJaWYgKChwICsgbmFt ZWxlbiArIDEpIDw9IGJ1ZmxlbikgeworCQkJCW1lbWNweShidWYgKyBwLCBuYW1lLCBuYW1lbGVu KTsKKwkJCQlwICs9IG5hbWVsZW47CisJCQkJYnVmW3ArK10gPSAnLyc7CisJCQkJcGRlcHRoKys7 CisJCQl9CisJCX0KKworCQlpZiAob2Zmc2V0ID09IG5vZGVvZmZzZXQpIHsKKwkJCWlmIChwZGVw dGggPCAoZGVwdGggKyAxKSkKKwkJCQlyZXR1cm4gLUZEVF9FUlJfTk9TUEFDRTsKKworCQkJaWYg KHAgPiAxKSAvKiBzcGVjaWFsIGNhc2Ugc28gdGhhdCByb290IHBhdGggaXMgIi8iLCBub3QgIiIg Ki8KKwkJCQlwLS07CisJCQlidWZbcF0gPSAnXDAnOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisK KwlpZiAoKG9mZnNldCA9PSAtRkRUX0VSUl9OT1RGT1VORCkgfHwgKG9mZnNldCA+PSAwKSkKKwkJ cmV0dXJuIC1GRFRfRVJSX0JBRE9GRlNFVDsKKwllbHNlIGlmIChvZmZzZXQgPT0gLUZEVF9FUlJf QkFET0ZGU0VUKQorCQlyZXR1cm4gLUZEVF9FUlJfQkFEU1RSVUNUVVJFOworCisJcmV0dXJuIG9m ZnNldDsgLyogZXJyb3IgZnJvbSBmZHRfbmV4dF9ub2RlKCkgKi8KK30KKworaW50IGZkdF9zdXBl cm5vZGVfYXRkZXB0aF9vZmZzZXQoY29uc3Qgdm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCwKKwkJ CQkgaW50IHN1cGVybm9kZWRlcHRoLCBpbnQgKm5vZGVkZXB0aCkKK3sKKwlpbnQgb2Zmc2V0LCBk ZXB0aDsKKwlpbnQgc3VwZXJub2Rlb2Zmc2V0ID0gLUZEVF9FUlJfSU5URVJOQUw7CisKKwlGRFRf Q0hFQ0tfSEVBREVSKGZkdCk7CisKKwlpZiAoc3VwZXJub2RlZGVwdGggPCAwKQorCQlyZXR1cm4g LUZEVF9FUlJfTk9URk9VTkQ7CisKKwlmb3IgKG9mZnNldCA9IDAsIGRlcHRoID0gMDsKKwkgICAg IChvZmZzZXQgPj0gMCkgJiYgKG9mZnNldCA8PSBub2Rlb2Zmc2V0KTsKKwkgICAgIG9mZnNldCA9 IGZkdF9uZXh0X25vZGUoZmR0LCBvZmZzZXQsICZkZXB0aCkpIHsKKwkJaWYgKGRlcHRoID09IHN1 cGVybm9kZWRlcHRoKQorCQkJc3VwZXJub2Rlb2Zmc2V0ID0gb2Zmc2V0OworCisJCWlmIChvZmZz ZXQgPT0gbm9kZW9mZnNldCkgeworCQkJaWYgKG5vZGVkZXB0aCkKKwkJCQkqbm9kZWRlcHRoID0g ZGVwdGg7CisKKwkJCWlmIChzdXBlcm5vZGVkZXB0aCA+IGRlcHRoKQorCQkJCXJldHVybiAtRkRU X0VSUl9OT1RGT1VORDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gc3VwZXJub2Rlb2Zmc2V0OworCQl9 CisJfQorCisJaWYgKChvZmZzZXQgPT0gLUZEVF9FUlJfTk9URk9VTkQpIHx8IChvZmZzZXQgPj0g MCkpCisJCXJldHVybiAtRkRUX0VSUl9CQURPRkZTRVQ7CisJZWxzZSBpZiAob2Zmc2V0ID09IC1G RFRfRVJSX0JBRE9GRlNFVCkKKwkJcmV0dXJuIC1GRFRfRVJSX0JBRFNUUlVDVFVSRTsKKworCXJl dHVybiBvZmZzZXQ7IC8qIGVycm9yIGZyb20gZmR0X25leHRfbm9kZSgpICovCit9CisKK2ludCBm ZHRfbm9kZV9kZXB0aChjb25zdCB2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0KQoreworCWludCBu b2RlZGVwdGg7CisJaW50IGVycjsKKworCWVyciA9IGZkdF9zdXBlcm5vZGVfYXRkZXB0aF9vZmZz ZXQoZmR0LCBub2Rlb2Zmc2V0LCAwLCAmbm9kZWRlcHRoKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4g KGVyciA8IDApID8gZXJyIDogLUZEVF9FUlJfSU5URVJOQUw7CisJcmV0dXJuIG5vZGVkZXB0aDsK K30KKworaW50IGZkdF9wYXJlbnRfb2Zmc2V0KGNvbnN0IHZvaWQgKmZkdCwgaW50IG5vZGVvZmZz ZXQpCit7CisJaW50IG5vZGVkZXB0aCA9IGZkdF9ub2RlX2RlcHRoKGZkdCwgbm9kZW9mZnNldCk7 CisKKwlpZiAobm9kZWRlcHRoIDwgMCkKKwkJcmV0dXJuIG5vZGVkZXB0aDsKKwlyZXR1cm4gZmR0 X3N1cGVybm9kZV9hdGRlcHRoX29mZnNldChmZHQsIG5vZGVvZmZzZXQsCisJCQkJCSAgICBub2Rl ZGVwdGggLSAxLCBOVUxMKTsKK30KKworaW50IGZkdF9ub2RlX29mZnNldF9ieV9wcm9wX3ZhbHVl KGNvbnN0IHZvaWQgKmZkdCwgaW50IHN0YXJ0b2Zmc2V0LAorCQkJCSAgY29uc3QgY2hhciAqcHJv cG5hbWUsCisJCQkJICBjb25zdCB2b2lkICpwcm9wdmFsLCBpbnQgcHJvcGxlbikKK3sKKwlpbnQg b2Zmc2V0OworCWNvbnN0IHZvaWQgKnZhbDsKKwlpbnQgbGVuOworCisJRkRUX0NIRUNLX0hFQURF UihmZHQpOworCisJLyogRklYTUU6IFRoZSBhbGdvcml0aG0gaGVyZSBpcyBwcmV0dHkgaG9ycmli bGU6IHdlIHNjYW4gZWFjaAorCSAqIHByb3BlcnR5IG9mIGEgbm9kZSBpbiBmZHRfZ2V0cHJvcCgp LCB0aGVuIGlmIHRoYXQgZGlkbid0CisJICogZmluZCB3aGF0IHdlIHdhbnQsIHdlIHNjYW4gb3Zl ciB0aGVtIGFnYWluIG1ha2luZyBvdXIgd2F5CisJICogdG8gdGhlIG5leHQgbm9kZS4gIFN0aWxs IGl0J3MgdGhlIGVhc2llc3QgdG8gaW1wbGVtZW50CisJICogYXBwcm9hY2g7IHBlcmZvcm1hbmNl IGNhbiBjb21lIGxhdGVyLiAqLworCWZvciAob2Zmc2V0ID0gZmR0X25leHRfbm9kZShmZHQsIHN0 YXJ0b2Zmc2V0LCBOVUxMKTsKKwkgICAgIG9mZnNldCA+PSAwOworCSAgICAgb2Zmc2V0ID0gZmR0 X25leHRfbm9kZShmZHQsIG9mZnNldCwgTlVMTCkpIHsKKwkJdmFsID0gZmR0X2dldHByb3AoZmR0 LCBvZmZzZXQsIHByb3BuYW1lLCAmbGVuKTsKKwkJaWYgKHZhbCAmJiAobGVuID09IHByb3BsZW4p CisJCSAgICAmJiAobWVtY21wKHZhbCwgcHJvcHZhbCwgbGVuKSA9PSAwKSkKKwkJCXJldHVybiBv ZmZzZXQ7CisJfQorCisJcmV0dXJuIG9mZnNldDsgLyogZXJyb3IgZnJvbSBmZHRfbmV4dF9ub2Rl KCkgKi8KK30KKworaW50IGZkdF9ub2RlX29mZnNldF9ieV9waGFuZGxlKGNvbnN0IHZvaWQgKmZk dCwgdWludDMyX3QgcGhhbmRsZSkKK3sKKwlpbnQgb2Zmc2V0OworCisJaWYgKChwaGFuZGxlID09 IDApIHx8IChwaGFuZGxlID09IC0xKSkKKwkJcmV0dXJuIC1GRFRfRVJSX0JBRFBIQU5ETEU7CisK KwlGRFRfQ0hFQ0tfSEVBREVSKGZkdCk7CisKKwkvKiBGSVhNRTogVGhlIGFsZ29yaXRobSBoZXJl IGlzIHByZXR0eSBob3JyaWJsZTogd2UKKwkgKiBwb3RlbnRpYWxseSBzY2FuIGVhY2ggcHJvcGVy dHkgb2YgYSBub2RlIGluCisJICogZmR0X2dldF9waGFuZGxlKCksIHRoZW4gaWYgdGhhdCBkaWRu J3QgZmluZCB3aGF0CisJICogd2Ugd2FudCwgd2Ugc2NhbiBvdmVyIHRoZW0gYWdhaW4gbWFraW5n IG91ciB3YXkgdG8gdGhlIG5leHQKKwkgKiBub2RlLiAgU3RpbGwgaXQncyB0aGUgZWFzaWVzdCB0 byBpbXBsZW1lbnQgYXBwcm9hY2g7CisJICogcGVyZm9ybWFuY2UgY2FuIGNvbWUgbGF0ZXIuICov CisJZm9yIChvZmZzZXQgPSBmZHRfbmV4dF9ub2RlKGZkdCwgLTEsIE5VTEwpOworCSAgICAgb2Zm c2V0ID49IDA7CisJICAgICBvZmZzZXQgPSBmZHRfbmV4dF9ub2RlKGZkdCwgb2Zmc2V0LCBOVUxM KSkgeworCQlpZiAoZmR0X2dldF9waGFuZGxlKGZkdCwgb2Zmc2V0KSA9PSBwaGFuZGxlKQorCQkJ cmV0dXJuIG9mZnNldDsKKwl9CisKKwlyZXR1cm4gb2Zmc2V0OyAvKiBlcnJvciBmcm9tIGZkdF9u ZXh0X25vZGUoKSAqLworfQorCitzdGF0aWMgaW50IF9mZHRfc3RyaW5nbGlzdF9jb250YWlucyhj b25zdCBjaGFyICpzdHJsaXN0LCBpbnQgbGlzdGxlbiwKKwkJCQkgICAgY29uc3QgY2hhciAqc3Ry KQoreworCWludCBsZW4gPSBzdHJsZW4oc3RyKTsKKwljb25zdCBjaGFyICpwOworCisJd2hpbGUg KGxpc3RsZW4gPj0gbGVuKSB7CisJCWlmIChtZW1jbXAoc3RyLCBzdHJsaXN0LCBsZW4rMSkgPT0g MCkKKwkJCXJldHVybiAxOworCQlwID0gbWVtY2hyKHN0cmxpc3QsICdcMCcsIGxpc3RsZW4pOwor CQlpZiAoIXApCisJCQlyZXR1cm4gMDsgLyogbWFsZm9ybWVkIHN0cmxpc3QuLiAqLworCQlsaXN0 bGVuIC09IChwLXN0cmxpc3QpICsgMTsKKwkJc3RybGlzdCA9IHAgKyAxOworCX0KKwlyZXR1cm4g MDsKK30KKworaW50IGZkdF9ub2RlX2NoZWNrX2NvbXBhdGlibGUoY29uc3Qgdm9pZCAqZmR0LCBp bnQgbm9kZW9mZnNldCwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKmNvbXBhdGlibGUpCit7CisJY29u c3Qgdm9pZCAqcHJvcDsKKwlpbnQgbGVuOworCisJcHJvcCA9IGZkdF9nZXRwcm9wKGZkdCwgbm9k ZW9mZnNldCwgImNvbXBhdGlibGUiLCAmbGVuKTsKKwlpZiAoIXByb3ApCisJCXJldHVybiBsZW47 CisJaWYgKF9mZHRfc3RyaW5nbGlzdF9jb250YWlucyhwcm9wLCBsZW4sIGNvbXBhdGlibGUpKQor CQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAxOworfQorCitpbnQgZmR0X25vZGVfb2Zmc2V0 X2J5X2NvbXBhdGlibGUoY29uc3Qgdm9pZCAqZmR0LCBpbnQgc3RhcnRvZmZzZXQsCisJCQkJICBj b25zdCBjaGFyICpjb21wYXRpYmxlKQoreworCWludCBvZmZzZXQsIGVycjsKKworCUZEVF9DSEVD S19IRUFERVIoZmR0KTsKKworCS8qIEZJWE1FOiBUaGUgYWxnb3JpdGhtIGhlcmUgaXMgcHJldHR5 IGhvcnJpYmxlOiB3ZSBzY2FuIGVhY2gKKwkgKiBwcm9wZXJ0eSBvZiBhIG5vZGUgaW4gZmR0X25v ZGVfY2hlY2tfY29tcGF0aWJsZSgpLCB0aGVuIGlmCisJICogdGhhdCBkaWRuJ3QgZmluZCB3aGF0 IHdlIHdhbnQsIHdlIHNjYW4gb3ZlciB0aGVtIGFnYWluCisJICogbWFraW5nIG91ciB3YXkgdG8g dGhlIG5leHQgbm9kZS4gIFN0aWxsIGl0J3MgdGhlIGVhc2llc3QgdG8KKwkgKiBpbXBsZW1lbnQg YXBwcm9hY2g7IHBlcmZvcm1hbmNlIGNhbiBjb21lIGxhdGVyLiAqLworCWZvciAob2Zmc2V0ID0g ZmR0X25leHRfbm9kZShmZHQsIHN0YXJ0b2Zmc2V0LCBOVUxMKTsKKwkgICAgIG9mZnNldCA+PSAw OworCSAgICAgb2Zmc2V0ID0gZmR0X25leHRfbm9kZShmZHQsIG9mZnNldCwgTlVMTCkpIHsKKwkJ ZXJyID0gZmR0X25vZGVfY2hlY2tfY29tcGF0aWJsZShmZHQsIG9mZnNldCwgY29tcGF0aWJsZSk7 CisJCWlmICgoZXJyIDwgMCkgJiYgKGVyciAhPSAtRkRUX0VSUl9OT1RGT1VORCkpCisJCQlyZXR1 cm4gZXJyOworCQllbHNlIGlmIChlcnIgPT0gMCkKKwkJCXJldHVybiBvZmZzZXQ7CisJfQorCisJ cmV0dXJuIG9mZnNldDsgLyogZXJyb3IgZnJvbSBmZHRfbmV4dF9ub2RlKCkgKi8KK30KZGlmZiAt cHVyTiB0cnVuay9ncnViLWNvcmUvbGliL2R0Yy9saWJmZHQvZmR0X3J3LmMgYXJtLXVib290L2dy dWItY29yZS9saWIvZHRjL2xpYmZkdC9mZHRfcncuYwotLS0gdHJ1bmsvZ3J1Yi1jb3JlL2xpYi9k dGMvbGliZmR0L2ZkdF9ydy5jCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCisr KyBhcm0tdWJvb3QvZ3J1Yi1jb3JlL2xpYi9kdGMvbGliZmR0L2ZkdF9ydy5jCTIwMTItMTEtMjAg MTY6MjY6NTQuOTUwOTIwMDAwICswMDAwCkBAIC0wLDAgKzEsNDY1IEBACisvKgorICogbGliZmR0 IC0gRmxhdCBEZXZpY2UgVHJlZSBtYW5pcHVsYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwNiBE YXZpZCBHaWJzb24sIElCTSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBsaWJmZHQgaXMgZHVhbCBsaWNl bnNlZDogeW91IGNhbiB1c2UgaXQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdQ TCwgb3IgdGhlIEJTRCBsaWNlbnNlLCBhdCB5b3VyIG9wdGlvbi4KKyAqCisgKiAgYSkgVGhpcyBs aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgor ICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k YXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiAgICAgTGljZW5zZSwgb3IgKGF0IHlv dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBsaWJyYXJ5IGlz IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAg YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu dHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS IFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y IG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w eSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRo aXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgIFNvZnR3YXJlIEZv dW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAorICog ICAgIE1BIDAyMTEwLTEzMDEgVVNBCisgKgorICogQWx0ZXJuYXRpdmVseSwKKyAqCisgKiAgYikg UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv cgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo YXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAg MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQor ICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0 aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqICAgICAyLiBSZWRpc3RyaWJ1 dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAg Y29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp bmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl ciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg KgorICogICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xE RVJTIEFORAorICogICAgIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJ TVBMSUVEIFdBUlJBTlRJRVMsCisgKiAgICAgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogICAgIERJU0NMQUlNRUQuIElO IE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqICAgICBDT05UUklCVVRP UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqICAg ICBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H LCBCVVQKKyAqICAgICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH T09EUyBPUiBTRVJWSUNFUzsKKyAqICAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogICAgIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogICAgIENPTlRSQUNULCBTVFJJ Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorICogICAgIE9U SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdB UkUsCisgKiAgICAgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB TUFHRS4KKyAqLworI2luY2x1ZGUgImxpYmZkdF9lbnYuaCIKKworI2luY2x1ZGUgPGZkdC5oPgor I2luY2x1ZGUgPGxpYmZkdC5oPgorCisjaW5jbHVkZSAibGliZmR0X2ludGVybmFsLmgiCisKK3N0 YXRpYyBpbnQgX2ZkdF9ibG9ja3NfbWlzb3JkZXJlZChjb25zdCB2b2lkICpmZHQsCisJCQkgICAg ICBpbnQgbWVtX3Jzdl9zaXplLCBpbnQgc3RydWN0X3NpemUpCit7CisJcmV0dXJuIChmZHRfb2Zm X21lbV9yc3ZtYXAoZmR0KSA8IEZEVF9BTElHTihzaXplb2Yoc3RydWN0IGZkdF9oZWFkZXIpLCA4 KSkKKwkJfHwgKGZkdF9vZmZfZHRfc3RydWN0KGZkdCkgPAorCQkgICAgKGZkdF9vZmZfbWVtX3Jz dm1hcChmZHQpICsgbWVtX3Jzdl9zaXplKSkKKwkJfHwgKGZkdF9vZmZfZHRfc3RyaW5ncyhmZHQp IDwKKwkJICAgIChmZHRfb2ZmX2R0X3N0cnVjdChmZHQpICsgc3RydWN0X3NpemUpKQorCQl8fCAo ZmR0X3RvdGFsc2l6ZShmZHQpIDwKKwkJICAgIChmZHRfb2ZmX2R0X3N0cmluZ3MoZmR0KSArIGZk dF9zaXplX2R0X3N0cmluZ3MoZmR0KSkpOworfQorCitzdGF0aWMgaW50IF9mZHRfcndfY2hlY2tf aGVhZGVyKHZvaWQgKmZkdCkKK3sKKwlGRFRfQ0hFQ0tfSEVBREVSKGZkdCk7CisKKwlpZiAoZmR0 X3ZlcnNpb24oZmR0KSA8IDE3KQorCQlyZXR1cm4gLUZEVF9FUlJfQkFEVkVSU0lPTjsKKwlpZiAo X2ZkdF9ibG9ja3NfbWlzb3JkZXJlZChmZHQsIHNpemVvZihzdHJ1Y3QgZmR0X3Jlc2VydmVfZW50 cnkpLAorCQkJCSAgIGZkdF9zaXplX2R0X3N0cnVjdChmZHQpKSkKKwkJcmV0dXJuIC1GRFRfRVJS X0JBRExBWU9VVDsKKwlpZiAoZmR0X3ZlcnNpb24oZmR0KSA+IDE3KQorCQlmZHRfc2V0X3ZlcnNp b24oZmR0LCAxNyk7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBGRFRfUldfQ0hFQ0tfSEVB REVSKGZkdCkgXAorCXsgXAorCQlpbnQgZXJyOyBcCisJCWlmICgoZXJyID0gX2ZkdF9yd19jaGVj a19oZWFkZXIoZmR0KSkgIT0gMCkgXAorCQkJcmV0dXJuIGVycjsgXAorCX0KKworc3RhdGljIGlu bGluZSBpbnQgX2ZkdF9kYXRhX3NpemUodm9pZCAqZmR0KQoreworCXJldHVybiBmZHRfb2ZmX2R0 X3N0cmluZ3MoZmR0KSArIGZkdF9zaXplX2R0X3N0cmluZ3MoZmR0KTsKK30KKworc3RhdGljIGlu dCBfZmR0X3NwbGljZSh2b2lkICpmZHQsIHZvaWQgKnNwbGljZXBvaW50LCBpbnQgb2xkbGVuLCBp bnQgbmV3bGVuKQoreworCWNoYXIgKnAgPSBzcGxpY2Vwb2ludDsKKwljaGFyICplbmQgPSAoY2hh ciAqKWZkdCArIF9mZHRfZGF0YV9zaXplKGZkdCk7CisKKwlpZiAoKChwICsgb2xkbGVuKSA8IHAp IHx8ICgocCArIG9sZGxlbikgPiBlbmQpKQorCQlyZXR1cm4gLUZEVF9FUlJfQkFET0ZGU0VUOwor CWlmICgoZW5kIC0gb2xkbGVuICsgbmV3bGVuKSA+ICgoY2hhciAqKWZkdCArIGZkdF90b3RhbHNp emUoZmR0KSkpCisJCXJldHVybiAtRkRUX0VSUl9OT1NQQUNFOworCW1lbW1vdmUocCArIG5ld2xl biwgcCArIG9sZGxlbiwgZW5kIC0gcCAtIG9sZGxlbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyBpbnQgX2ZkdF9zcGxpY2VfbWVtX3Jzdih2b2lkICpmZHQsIHN0cnVjdCBmZHRfcmVzZXJ2ZV9l bnRyeSAqcCwKKwkJCSAgICAgICBpbnQgb2xkbiwgaW50IG5ld24pCit7CisJaW50IGRlbHRhID0g KG5ld24gLSBvbGRuKSAqIHNpemVvZigqcCk7CisJaW50IGVycjsKKwllcnIgPSBfZmR0X3NwbGlj ZShmZHQsIHAsIG9sZG4gKiBzaXplb2YoKnApLCBuZXduICogc2l6ZW9mKCpwKSk7CisJaWYgKGVy cikKKwkJcmV0dXJuIGVycjsKKwlmZHRfc2V0X29mZl9kdF9zdHJ1Y3QoZmR0LCBmZHRfb2ZmX2R0 X3N0cnVjdChmZHQpICsgZGVsdGEpOworCWZkdF9zZXRfb2ZmX2R0X3N0cmluZ3MoZmR0LCBmZHRf b2ZmX2R0X3N0cmluZ3MoZmR0KSArIGRlbHRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlu dCBfZmR0X3NwbGljZV9zdHJ1Y3Qodm9pZCAqZmR0LCB2b2lkICpwLAorCQkJICAgICAgaW50IG9s ZGxlbiwgaW50IG5ld2xlbikKK3sKKwlpbnQgZGVsdGEgPSBuZXdsZW4gLSBvbGRsZW47CisJaW50 IGVycjsKKworCWlmICgoZXJyID0gX2ZkdF9zcGxpY2UoZmR0LCBwLCBvbGRsZW4sIG5ld2xlbikp KQorCQlyZXR1cm4gZXJyOworCisJZmR0X3NldF9zaXplX2R0X3N0cnVjdChmZHQsIGZkdF9zaXpl X2R0X3N0cnVjdChmZHQpICsgZGVsdGEpOworCWZkdF9zZXRfb2ZmX2R0X3N0cmluZ3MoZmR0LCBm ZHRfb2ZmX2R0X3N0cmluZ3MoZmR0KSArIGRlbHRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj IGludCBfZmR0X3NwbGljZV9zdHJpbmcodm9pZCAqZmR0LCBpbnQgbmV3bGVuKQoreworCXZvaWQg KnAgPSAoY2hhciAqKWZkdAorCQkrIGZkdF9vZmZfZHRfc3RyaW5ncyhmZHQpICsgZmR0X3NpemVf ZHRfc3RyaW5ncyhmZHQpOworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IF9mZHRfc3BsaWNlKGZk dCwgcCwgMCwgbmV3bGVuKSkpCisJCXJldHVybiBlcnI7CisKKwlmZHRfc2V0X3NpemVfZHRfc3Ry aW5ncyhmZHQsIGZkdF9zaXplX2R0X3N0cmluZ3MoZmR0KSArIG5ld2xlbik7CisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBpbnQgX2ZkdF9maW5kX2FkZF9zdHJpbmcodm9pZCAqZmR0LCBjb25zdCBj aGFyICpzKQoreworCWNoYXIgKnN0cnRhYiA9IChjaGFyICopZmR0ICsgZmR0X29mZl9kdF9zdHJp bmdzKGZkdCk7CisJY29uc3QgY2hhciAqcDsKKwljaGFyICpuZXc7CisJaW50IGxlbiA9IHN0cmxl bihzKSArIDE7CisJaW50IGVycjsKKworCXAgPSBfZmR0X2ZpbmRfc3RyaW5nKHN0cnRhYiwgZmR0 X3NpemVfZHRfc3RyaW5ncyhmZHQpLCBzKTsKKwlpZiAocCkKKwkJLyogZm91bmQgaXQgKi8KKwkJ cmV0dXJuIChwIC0gc3RydGFiKTsKKworCW5ldyA9IHN0cnRhYiArIGZkdF9zaXplX2R0X3N0cmlu Z3MoZmR0KTsKKwllcnIgPSBfZmR0X3NwbGljZV9zdHJpbmcoZmR0LCBsZW4pOworCWlmIChlcnIp CisJCXJldHVybiBlcnI7CisKKwltZW1jcHkobmV3LCBzLCBsZW4pOworCXJldHVybiAobmV3IC0g c3RydGFiKTsKK30KKworaW50IGZkdF9hZGRfbWVtX3Jzdih2b2lkICpmZHQsIHVpbnQ2NF90IGFk ZHJlc3MsIHVpbnQ2NF90IHNpemUpCit7CisJc3RydWN0IGZkdF9yZXNlcnZlX2VudHJ5ICpyZTsK KwlpbnQgZXJyOworCisJRkRUX1JXX0NIRUNLX0hFQURFUihmZHQpOworCisJcmUgPSBfZmR0X21l bV9yc3ZfdyhmZHQsIGZkdF9udW1fbWVtX3JzdihmZHQpKTsKKwllcnIgPSBfZmR0X3NwbGljZV9t ZW1fcnN2KGZkdCwgcmUsIDAsIDEpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZS0+ YWRkcmVzcyA9IGNwdV90b19mZHQ2NChhZGRyZXNzKTsKKwlyZS0+c2l6ZSA9IGNwdV90b19mZHQ2 NChzaXplKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGZkdF9kZWxfbWVtX3Jzdih2b2lkICpmZHQs IGludCBuKQoreworCXN0cnVjdCBmZHRfcmVzZXJ2ZV9lbnRyeSAqcmUgPSBfZmR0X21lbV9yc3Zf dyhmZHQsIG4pOworCWludCBlcnI7CisKKwlGRFRfUldfQ0hFQ0tfSEVBREVSKGZkdCk7CisKKwlp ZiAobiA+PSBmZHRfbnVtX21lbV9yc3YoZmR0KSkKKwkJcmV0dXJuIC1GRFRfRVJSX05PVEZPVU5E OworCisJZXJyID0gX2ZkdF9zcGxpY2VfbWVtX3JzdihmZHQsIHJlLCAxLCAwKTsKKwlpZiAoZXJy KQorCQlyZXR1cm4gZXJyOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9mZHRfcmVzaXpl X3Byb3BlcnR5KHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUsCisJ CQkJaW50IGxlbiwgc3RydWN0IGZkdF9wcm9wZXJ0eSAqKnByb3ApCit7CisJaW50IG9sZGxlbjsK KwlpbnQgZXJyOworCisJKnByb3AgPSBmZHRfZ2V0X3Byb3BlcnR5X3coZmR0LCBub2Rlb2Zmc2V0 LCBuYW1lLCAmb2xkbGVuKTsKKwlpZiAoISAoKnByb3ApKQorCQlyZXR1cm4gb2xkbGVuOworCisJ aWYgKChlcnIgPSBfZmR0X3NwbGljZV9zdHJ1Y3QoZmR0LCAoKnByb3ApLT5kYXRhLCBGRFRfVEFH QUxJR04ob2xkbGVuKSwKKwkJCQkgICAgICBGRFRfVEFHQUxJR04obGVuKSkpKQorCQlyZXR1cm4g ZXJyOworCisJKCpwcm9wKS0+bGVuID0gY3B1X3RvX2ZkdDMyKGxlbik7CisJcmV0dXJuIDA7Cit9 CisKK3N0YXRpYyBpbnQgX2ZkdF9hZGRfcHJvcGVydHkodm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNl dCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgaW50IGxlbiwgc3RydWN0IGZkdF9wcm9wZXJ0 eSAqKnByb3ApCit7CisJaW50IHByb3BsZW47CisJaW50IG5leHRvZmZzZXQ7CisJaW50IG5hbWVz dHJvZmY7CisJaW50IGVycjsKKworCWlmICgobmV4dG9mZnNldCA9IF9mZHRfY2hlY2tfbm9kZV9v ZmZzZXQoZmR0LCBub2Rlb2Zmc2V0KSkgPCAwKQorCQlyZXR1cm4gbmV4dG9mZnNldDsKKworCW5h bWVzdHJvZmYgPSBfZmR0X2ZpbmRfYWRkX3N0cmluZyhmZHQsIG5hbWUpOworCWlmIChuYW1lc3Ry b2ZmIDwgMCkKKwkJcmV0dXJuIG5hbWVzdHJvZmY7CisKKwkqcHJvcCA9IF9mZHRfb2Zmc2V0X3B0 cl93KGZkdCwgbmV4dG9mZnNldCk7CisJcHJvcGxlbiA9IHNpemVvZigqKnByb3ApICsgRkRUX1RB R0FMSUdOKGxlbik7CisKKwllcnIgPSBfZmR0X3NwbGljZV9zdHJ1Y3QoZmR0LCAqcHJvcCwgMCwg cHJvcGxlbik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCSgqcHJvcCktPnRhZyA9IGNw dV90b19mZHQzMihGRFRfUFJPUCk7CisJKCpwcm9wKS0+bmFtZW9mZiA9IGNwdV90b19mZHQzMihu YW1lc3Ryb2ZmKTsKKwkoKnByb3ApLT5sZW4gPSBjcHVfdG9fZmR0MzIobGVuKTsKKwlyZXR1cm4g MDsKK30KKworaW50IGZkdF9zZXRfbmFtZSh2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LCBjb25z dCBjaGFyICpuYW1lKQoreworCWNoYXIgKm5hbWVwOworCWludCBvbGRsZW4sIG5ld2xlbjsKKwlp bnQgZXJyOworCisJRkRUX1JXX0NIRUNLX0hFQURFUihmZHQpOworCisJbmFtZXAgPSAoY2hhciAq KSh1aW50cHRyX3QpZmR0X2dldF9uYW1lKGZkdCwgbm9kZW9mZnNldCwgJm9sZGxlbik7CisJaWYg KCFuYW1lcCkKKwkJcmV0dXJuIG9sZGxlbjsKKworCW5ld2xlbiA9IHN0cmxlbihuYW1lKTsKKwor CWVyciA9IF9mZHRfc3BsaWNlX3N0cnVjdChmZHQsIG5hbWVwLCBGRFRfVEFHQUxJR04ob2xkbGVu KzEpLAorCQkJCSBGRFRfVEFHQUxJR04obmV3bGVuKzEpKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4g ZXJyOworCisJbWVtY3B5KG5hbWVwLCBuYW1lLCBuZXdsZW4rMSk7CisJcmV0dXJuIDA7Cit9CisK K2ludCBmZHRfc2V0cHJvcCh2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBjaGFyICpu YW1lLAorCQljb25zdCB2b2lkICp2YWwsIGludCBsZW4pCit7CisJc3RydWN0IGZkdF9wcm9wZXJ0 eSAqcHJvcDsKKwlpbnQgZXJyOworCisJRkRUX1JXX0NIRUNLX0hFQURFUihmZHQpOworCisJZXJy ID0gX2ZkdF9yZXNpemVfcHJvcGVydHkoZmR0LCBub2Rlb2Zmc2V0LCBuYW1lLCBsZW4sICZwcm9w KTsKKwlpZiAoZXJyID09IC1GRFRfRVJSX05PVEZPVU5EKQorCQllcnIgPSBfZmR0X2FkZF9wcm9w ZXJ0eShmZHQsIG5vZGVvZmZzZXQsIG5hbWUsIGxlbiwgJnByb3ApOworCWlmIChlcnIpCisJCXJl dHVybiBlcnI7CisKKwltZW1jcHkocHJvcC0+ZGF0YSwgdmFsLCBsZW4pOworCXJldHVybiAwOwor fQorCitpbnQgZmR0X2RlbHByb3Aodm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCwgY29uc3QgY2hh ciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZmR0X3Byb3BlcnR5ICpwcm9wOworCWludCBsZW4sIHByb3Bs ZW47CisKKwlGRFRfUldfQ0hFQ0tfSEVBREVSKGZkdCk7CisKKwlwcm9wID0gZmR0X2dldF9wcm9w ZXJ0eV93KGZkdCwgbm9kZW9mZnNldCwgbmFtZSwgJmxlbik7CisJaWYgKCEgcHJvcCkKKwkJcmV0 dXJuIGxlbjsKKworCXByb3BsZW4gPSBzaXplb2YoKnByb3ApICsgRkRUX1RBR0FMSUdOKGxlbik7 CisJcmV0dXJuIF9mZHRfc3BsaWNlX3N0cnVjdChmZHQsIHByb3AsIHByb3BsZW4sIDApOworfQor CitpbnQgZmR0X2FkZF9zdWJub2RlX25hbWVsZW4odm9pZCAqZmR0LCBpbnQgcGFyZW50b2Zmc2V0 LAorCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQoreworCXN0cnVjdCBmZHRf bm9kZV9oZWFkZXIgKm5oOworCWludCBvZmZzZXQsIG5leHRvZmZzZXQ7CisJaW50IG5vZGVsZW47 CisJaW50IGVycjsKKwl1aW50MzJfdCB0YWc7CisJdWludDMyX3QgKmVuZHRhZzsKKworCUZEVF9S V19DSEVDS19IRUFERVIoZmR0KTsKKworCW9mZnNldCA9IGZkdF9zdWJub2RlX29mZnNldF9uYW1l bGVuKGZkdCwgcGFyZW50b2Zmc2V0LCBuYW1lLCBuYW1lbGVuKTsKKwlpZiAob2Zmc2V0ID49IDAp CisJCXJldHVybiAtRkRUX0VSUl9FWElTVFM7CisJZWxzZSBpZiAob2Zmc2V0ICE9IC1GRFRfRVJS X05PVEZPVU5EKQorCQlyZXR1cm4gb2Zmc2V0OworCisJLyogVHJ5IHRvIHBsYWNlIHRoZSBuZXcg bm9kZSBhZnRlciB0aGUgcGFyZW50J3MgcHJvcGVydGllcyAqLworCWZkdF9uZXh0X3RhZyhmZHQs IHBhcmVudG9mZnNldCwgJm5leHRvZmZzZXQpOyAvKiBza2lwIHRoZSBCRUdJTl9OT0RFICovCisJ ZG8geworCQlvZmZzZXQgPSBuZXh0b2Zmc2V0OworCQl0YWcgPSBmZHRfbmV4dF90YWcoZmR0LCBv ZmZzZXQsICZuZXh0b2Zmc2V0KTsKKwl9IHdoaWxlICgodGFnID09IEZEVF9QUk9QKSB8fCAodGFn ID09IEZEVF9OT1ApKTsKKworCW5oID0gX2ZkdF9vZmZzZXRfcHRyX3coZmR0LCBvZmZzZXQpOwor CW5vZGVsZW4gPSBzaXplb2YoKm5oKSArIEZEVF9UQUdBTElHTihuYW1lbGVuKzEpICsgRkRUX1RB R1NJWkU7CisKKwllcnIgPSBfZmR0X3NwbGljZV9zdHJ1Y3QoZmR0LCBuaCwgMCwgbm9kZWxlbik7 CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW5oLT50YWcgPSBjcHVfdG9fZmR0MzIoRkRU X0JFR0lOX05PREUpOworCW1lbXNldChuaC0+bmFtZSwgMCwgRkRUX1RBR0FMSUdOKG5hbWVsZW4r MSkpOworCW1lbWNweShuaC0+bmFtZSwgbmFtZSwgbmFtZWxlbik7CisJZW5kdGFnID0gKHVpbnQz Ml90ICopKChjaGFyICopbmggKyBub2RlbGVuIC0gRkRUX1RBR1NJWkUpOworCSplbmR0YWcgPSBj cHVfdG9fZmR0MzIoRkRUX0VORF9OT0RFKTsKKworCXJldHVybiBvZmZzZXQ7Cit9CisKK2ludCBm ZHRfYWRkX3N1Ym5vZGUodm9pZCAqZmR0LCBpbnQgcGFyZW50b2Zmc2V0LCBjb25zdCBjaGFyICpu YW1lKQoreworCXJldHVybiBmZHRfYWRkX3N1Ym5vZGVfbmFtZWxlbihmZHQsIHBhcmVudG9mZnNl dCwgbmFtZSwgc3RybGVuKG5hbWUpKTsKK30KKworaW50IGZkdF9kZWxfbm9kZSh2b2lkICpmZHQs IGludCBub2Rlb2Zmc2V0KQoreworCWludCBlbmRvZmZzZXQ7CisKKwlGRFRfUldfQ0hFQ0tfSEVB REVSKGZkdCk7CisKKwllbmRvZmZzZXQgPSBfZmR0X25vZGVfZW5kX29mZnNldChmZHQsIG5vZGVv ZmZzZXQpOworCWlmIChlbmRvZmZzZXQgPCAwKQorCQlyZXR1cm4gZW5kb2Zmc2V0OworCisJcmV0 dXJuIF9mZHRfc3BsaWNlX3N0cnVjdChmZHQsIF9mZHRfb2Zmc2V0X3B0cl93KGZkdCwgbm9kZW9m ZnNldCksCisJCQkJICBlbmRvZmZzZXQgLSBub2Rlb2Zmc2V0LCAwKTsKK30KKworc3RhdGljIHZv aWQgX2ZkdF9wYWNrYmxvY2tzKGNvbnN0IGNoYXIgKm9sZCwgY2hhciAqbmV3LAorCQkJICAgIGlu dCBtZW1fcnN2X3NpemUsIGludCBzdHJ1Y3Rfc2l6ZSkKK3sKKwlpbnQgbWVtX3Jzdl9vZmYsIHN0 cnVjdF9vZmYsIHN0cmluZ3Nfb2ZmOworCisJbWVtX3Jzdl9vZmYgPSBGRFRfQUxJR04oc2l6ZW9m KHN0cnVjdCBmZHRfaGVhZGVyKSwgOCk7CisJc3RydWN0X29mZiA9IG1lbV9yc3Zfb2ZmICsgbWVt X3Jzdl9zaXplOworCXN0cmluZ3Nfb2ZmID0gc3RydWN0X29mZiArIHN0cnVjdF9zaXplOworCisJ bWVtbW92ZShuZXcgKyBtZW1fcnN2X29mZiwgb2xkICsgZmR0X29mZl9tZW1fcnN2bWFwKG9sZCks IG1lbV9yc3Zfc2l6ZSk7CisJZmR0X3NldF9vZmZfbWVtX3Jzdm1hcChuZXcsIG1lbV9yc3Zfb2Zm KTsKKworCW1lbW1vdmUobmV3ICsgc3RydWN0X29mZiwgb2xkICsgZmR0X29mZl9kdF9zdHJ1Y3Qo b2xkKSwgc3RydWN0X3NpemUpOworCWZkdF9zZXRfb2ZmX2R0X3N0cnVjdChuZXcsIHN0cnVjdF9v ZmYpOworCWZkdF9zZXRfc2l6ZV9kdF9zdHJ1Y3QobmV3LCBzdHJ1Y3Rfc2l6ZSk7CisKKwltZW1t b3ZlKG5ldyArIHN0cmluZ3Nfb2ZmLCBvbGQgKyBmZHRfb2ZmX2R0X3N0cmluZ3Mob2xkKSwKKwkJ ZmR0X3NpemVfZHRfc3RyaW5ncyhvbGQpKTsKKwlmZHRfc2V0X29mZl9kdF9zdHJpbmdzKG5ldywg c3RyaW5nc19vZmYpOworCWZkdF9zZXRfc2l6ZV9kdF9zdHJpbmdzKG5ldywgZmR0X3NpemVfZHRf c3RyaW5ncyhvbGQpKTsKK30KKworaW50IGZkdF9vcGVuX2ludG8oY29uc3Qgdm9pZCAqZmR0LCB2 b2lkICpidWYsIGludCBidWZzaXplKQoreworCWludCBlcnI7CisJaW50IG1lbV9yc3Zfc2l6ZSwg c3RydWN0X3NpemU7CisJaW50IG5ld3NpemU7CisJY29uc3QgY2hhciAqZmR0c3RhcnQgPSBmZHQ7 CisJY29uc3QgY2hhciAqZmR0ZW5kID0gZmR0c3RhcnQgKyBmZHRfdG90YWxzaXplKGZkdCk7CisJ Y2hhciAqdG1wOworCisJRkRUX0NIRUNLX0hFQURFUihmZHQpOworCisJbWVtX3Jzdl9zaXplID0g KGZkdF9udW1fbWVtX3JzdihmZHQpKzEpCisJCSogc2l6ZW9mKHN0cnVjdCBmZHRfcmVzZXJ2ZV9l bnRyeSk7CisKKwlpZiAoZmR0X3ZlcnNpb24oZmR0KSA+PSAxNykgeworCQlzdHJ1Y3Rfc2l6ZSA9 IGZkdF9zaXplX2R0X3N0cnVjdChmZHQpOworCX0gZWxzZSB7CisJCXN0cnVjdF9zaXplID0gMDsK KwkJd2hpbGUgKGZkdF9uZXh0X3RhZyhmZHQsIHN0cnVjdF9zaXplLCAmc3RydWN0X3NpemUpICE9 IEZEVF9FTkQpCisJCQk7CisJCWlmIChzdHJ1Y3Rfc2l6ZSA8IDApCisJCQlyZXR1cm4gc3RydWN0 X3NpemU7CisJfQorCisJaWYgKCFfZmR0X2Jsb2Nrc19taXNvcmRlcmVkKGZkdCwgbWVtX3Jzdl9z aXplLCBzdHJ1Y3Rfc2l6ZSkpIHsKKwkJLyogbm8gZnVydGhlciB3b3JrIG5lY2Vzc2FyeSAqLwor CQllcnIgPSBmZHRfbW92ZShmZHQsIGJ1ZiwgYnVmc2l6ZSk7CisJCWlmIChlcnIpCisJCQlyZXR1 cm4gZXJyOworCQlmZHRfc2V0X3ZlcnNpb24oYnVmLCAxNyk7CisJCWZkdF9zZXRfc2l6ZV9kdF9z dHJ1Y3QoYnVmLCBzdHJ1Y3Rfc2l6ZSk7CisJCWZkdF9zZXRfdG90YWxzaXplKGJ1ZiwgYnVmc2l6 ZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIE5lZWQgdG8gcmVvcmRlciAqLworCW5ld3NpemUg PSBGRFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBmZHRfaGVhZGVyKSwgOCkgKyBtZW1fcnN2X3NpemUK KwkJKyBzdHJ1Y3Rfc2l6ZSArIGZkdF9zaXplX2R0X3N0cmluZ3MoZmR0KTsKKworCWlmIChidWZz aXplIDwgbmV3c2l6ZSkKKwkJcmV0dXJuIC1GRFRfRVJSX05PU1BBQ0U7CisKKwkvKiBGaXJzdCBh dHRlbXB0IHRvIGJ1aWxkIGNvbnZlcnRlZCB0cmVlIGF0IGJlZ2lubmluZyBvZiBidWZmZXIgKi8K Kwl0bXAgPSBidWY7CisJLyogQnV0IGlmIHRoYXQgb3ZlcmxhcHMgd2l0aCB0aGUgb2xkIHRyZWUu Li4gKi8KKwlpZiAoKCh0bXAgKyBuZXdzaXplKSA+IGZkdHN0YXJ0KSAmJiAodG1wIDwgZmR0ZW5k KSkgeworCQkvKiBUcnkgcmlnaHQgYWZ0ZXIgdGhlIG9sZCB0cmVlIGluc3RlYWQgKi8KKwkJdG1w ID0gKGNoYXIgKikodWludHB0cl90KWZkdGVuZDsKKwkJaWYgKCh0bXAgKyBuZXdzaXplKSA+ICgo Y2hhciAqKWJ1ZiArIGJ1ZnNpemUpKQorCQkJcmV0dXJuIC1GRFRfRVJSX05PU1BBQ0U7CisJfQor CisJX2ZkdF9wYWNrYmxvY2tzKGZkdCwgdG1wLCBtZW1fcnN2X3NpemUsIHN0cnVjdF9zaXplKTsK KwltZW1tb3ZlKGJ1ZiwgdG1wLCBuZXdzaXplKTsKKworCWZkdF9zZXRfbWFnaWMoYnVmLCBGRFRf TUFHSUMpOworCWZkdF9zZXRfdG90YWxzaXplKGJ1ZiwgYnVmc2l6ZSk7CisJZmR0X3NldF92ZXJz aW9uKGJ1ZiwgMTcpOworCWZkdF9zZXRfbGFzdF9jb21wX3ZlcnNpb24oYnVmLCAxNik7CisJZmR0 X3NldF9ib290X2NwdWlkX3BoeXMoYnVmLCBmZHRfYm9vdF9jcHVpZF9waHlzKGZkdCkpOworCisJ cmV0dXJuIDA7Cit9CisKK2ludCBmZHRfcGFjayh2b2lkICpmZHQpCit7CisJaW50IG1lbV9yc3Zf c2l6ZTsKKworCUZEVF9SV19DSEVDS19IRUFERVIoZmR0KTsKKworCW1lbV9yc3Zfc2l6ZSA9IChm ZHRfbnVtX21lbV9yc3YoZmR0KSsxKQorCQkqIHNpemVvZihzdHJ1Y3QgZmR0X3Jlc2VydmVfZW50 cnkpOworCV9mZHRfcGFja2Jsb2NrcyhmZHQsIGZkdCwgbWVtX3Jzdl9zaXplLCBmZHRfc2l6ZV9k dF9zdHJ1Y3QoZmR0KSk7CisJZmR0X3NldF90b3RhbHNpemUoZmR0LCBfZmR0X2RhdGFfc2l6ZShm ZHQpKTsKKworCXJldHVybiAwOworfQpkaWZmIC1wdXJOIHRydW5rL2dydWItY29yZS9saWIvZHRj L2xpYmZkdC9mZHRfc3RyZXJyb3IuYyBhcm0tdWJvb3QvZ3J1Yi1jb3JlL2xpYi9kdGMvbGliZmR0 L2ZkdF9zdHJlcnJvci5jCi0tLSB0cnVuay9ncnViLWNvcmUvbGliL2R0Yy9saWJmZHQvZmR0X3N0 cmVycm9yLmMJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysrIGFybS11Ym9v dC9ncnViLWNvcmUvbGliL2R0Yy9saWJmZHQvZmR0X3N0cmVycm9yLmMJMjAxMi0xMS0yMCAxNjoy Njo1NC45NTA5MjAwMDAgKzAwMDAKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIGxpYmZkdCAtIEZs YXQgRGV2aWNlIFRyZWUgbWFuaXB1bGF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRGF2aWQg R2lic29uLCBJQk0gQ29ycG9yYXRpb24uCisgKgorICogbGliZmR0IGlzIGR1YWwgbGljZW5zZWQ6 IHlvdSBjYW4gdXNlIGl0IGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBHUEwsIG9y IHRoZSBCU0QgbGljZW5zZSwgYXQgeW91ciBvcHRpb24uCisgKgorICogIGEpIFRoaXMgbGlicmFy eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAg ICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u OyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogICAgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0 cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBX SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m CisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl IGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxp YnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0 aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKKyAqICAgICBN QSAwMjExMC0xMzAxIFVTQQorICoKKyAqIEFsdGVybmF0aXZlbHksCisgKgorICogIGIpIFJlZGlz dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAq ICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo ZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgIDEuIFJl ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAg ICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv bGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKiAgICAgMi4gUmVkaXN0cmlidXRpb25z IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHly aWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisg KiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0 ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq ICAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBB TkQKKyAqICAgICBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF RCBXQVJSQU5USUVTLAorICogICAgIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUg SU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqICAgICBESVNDTEFJTUVELiBJTiBOTyBF VkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiAgICAgQ09OVFJJQlVUT1JTIEJF IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiAgICAgU1BF Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU CisgKiAgICAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg T1IgU0VSVklDRVM7CisgKiAgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV U0lORVNTIElOVEVSUlVQVElPTikKKyAqICAgICBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqICAgICBDT05UUkFDVCwgU1RSSUNUIExJ QUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKKyAqICAgICBPVEhFUldJ U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAor ICogICAgIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu CisgKi8KKyNpbmNsdWRlICJsaWJmZHRfZW52LmgiCisKKyNpbmNsdWRlIDxmZHQuaD4KKyNpbmNs dWRlIDxsaWJmZHQuaD4KKworI2luY2x1ZGUgImxpYmZkdF9pbnRlcm5hbC5oIgorCitzdHJ1Y3Qg ZmR0X2VycnRhYmVudCB7CisJY29uc3QgY2hhciAqc3RyOworfTsKKworI2RlZmluZSBGRFRfRVJS VEFCRU5UKHZhbCkgXAorCVsodmFsKV0gPSB7IC5zdHIgPSAjdmFsLCB9CisKK3N0YXRpYyBzdHJ1 Y3QgZmR0X2VycnRhYmVudCBmZHRfZXJydGFibGVbXSA9IHsKKwlGRFRfRVJSVEFCRU5UKEZEVF9F UlJfTk9URk9VTkQpLAorCUZEVF9FUlJUQUJFTlQoRkRUX0VSUl9FWElTVFMpLAorCUZEVF9FUlJU QUJFTlQoRkRUX0VSUl9OT1NQQUNFKSwKKworCUZEVF9FUlJUQUJFTlQoRkRUX0VSUl9CQURPRkZT RVQpLAorCUZEVF9FUlJUQUJFTlQoRkRUX0VSUl9CQURQQVRIKSwKKwlGRFRfRVJSVEFCRU5UKEZE VF9FUlJfQkFEU1RBVEUpLAorCisJRkRUX0VSUlRBQkVOVChGRFRfRVJSX1RSVU5DQVRFRCksCisJ RkRUX0VSUlRBQkVOVChGRFRfRVJSX0JBRE1BR0lDKSwKKwlGRFRfRVJSVEFCRU5UKEZEVF9FUlJf QkFEVkVSU0lPTiksCisJRkRUX0VSUlRBQkVOVChGRFRfRVJSX0JBRFNUUlVDVFVSRSksCisJRkRU X0VSUlRBQkVOVChGRFRfRVJSX0JBRExBWU9VVCksCit9OworI2RlZmluZSBGRFRfRVJSVEFCU0la RQkoc2l6ZW9mKGZkdF9lcnJ0YWJsZSkgLyBzaXplb2YoZmR0X2VycnRhYmxlWzBdKSkKKworY29u c3QgY2hhciAqZmR0X3N0cmVycm9yKGludCBlcnJ2YWwpCit7CisJaWYgKGVycnZhbCA+IDApCisJ CXJldHVybiAiPHZhbGlkIG9mZnNldC9sZW5ndGg+IjsKKwllbHNlIGlmIChlcnJ2YWwgPT0gMCkK KwkJcmV0dXJuICI8bm8gZXJyb3I+IjsKKwllbHNlIGlmIChlcnJ2YWwgPiAtRkRUX0VSUlRBQlNJ WkUpIHsKKwkJY29uc3QgY2hhciAqcyA9IGZkdF9lcnJ0YWJsZVstZXJydmFsXS5zdHI7CisKKwkJ aWYgKHMpCisJCQlyZXR1cm4gczsKKwl9CisKKwlyZXR1cm4gIjx1bmtub3duIGVycm9yPiI7Cit9 CmRpZmYgLXB1ck4gdHJ1bmsvZ3J1Yi1jb3JlL2xpYi9kdGMvbGliZmR0L2ZkdF9zdy5jIGFybS11 Ym9vdC9ncnViLWNvcmUvbGliL2R0Yy9saWJmZHQvZmR0X3N3LmMKLS0tIHRydW5rL2dydWItY29y ZS9saWIvZHRjL2xpYmZkdC9mZHRfc3cuYwkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCAr MDEwMAorKysgYXJtLXVib290L2dydWItY29yZS9saWIvZHRjL2xpYmZkdC9mZHRfc3cuYwkyMDEy LTExLTIwIDE2OjI2OjU0Ljk1MDkyMDAwMCArMDAwMApAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAq IGxpYmZkdCAtIEZsYXQgRGV2aWNlIFRyZWUgbWFuaXB1bGF0aW9uCisgKiBDb3B5cmlnaHQgKEMp IDIwMDYgRGF2aWQgR2lic29uLCBJQk0gQ29ycG9yYXRpb24uCisgKgorICogbGliZmR0IGlzIGR1 YWwgbGljZW5zZWQ6IHlvdSBjYW4gdXNlIGl0IGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAq IHRoZSBHUEwsIG9yIHRoZSBCU0QgbGljZW5zZSwgYXQgeW91ciBvcHRpb24uCisgKgorICogIGEp IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh bmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy ZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogICAgIExpY2Vuc2UsIG9y IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgbGli cmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAor ICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk IHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl ZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgIExpY2Vuc2UgYWxvbmcg d2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICBTb2Z0 d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3Rv biwKKyAqICAgICBNQSAwMjExMC0xMzAxIFVTQQorICoKKyAqIEFsdGVybmF0aXZlbHksCisgKgor ICogIGIpIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs IHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92 aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgor ICogICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg YWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u cyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKiAgICAgMi4gUmVk aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICog ICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg Zm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQv b3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0 aW9uLgorICoKKyAqICAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklH SFQgSE9MREVSUyBBTkQKKyAqICAgICBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJF U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogICAgIElOQ0xVRElORywgQlVUIE5PVCBMSU1J VEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZ IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqICAgICBESVNDTEFJ TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiAgICAgQ09O VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws CisgKiAgICAgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO Q0xVRElORywgQlVUCisgKiAgICAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNU SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiAgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqICAgICBIT1dFVkVSIENBVVNFRCBB TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqICAgICBDT05UUkFD VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKKyAq ICAgICBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElT IFNPRlRXQVJFLAorICogICAgIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg U1VDSCBEQU1BR0UuCisgKi8KKyNpbmNsdWRlICJsaWJmZHRfZW52LmgiCisKKyNpbmNsdWRlIDxm ZHQuaD4KKyNpbmNsdWRlIDxsaWJmZHQuaD4KKworI2luY2x1ZGUgImxpYmZkdF9pbnRlcm5hbC5o IgorCitzdGF0aWMgaW50IF9mZHRfc3dfY2hlY2tfaGVhZGVyKHZvaWQgKmZkdCkKK3sKKwlpZiAo ZmR0X21hZ2ljKGZkdCkgIT0gRkRUX1NXX01BR0lDKQorCQlyZXR1cm4gLUZEVF9FUlJfQkFETUFH SUM7CisJLyogRklYTUU6IHNob3VsZCBjaGVjayBtb3JlIGRldGFpbHMgYWJvdXQgdGhlIGhlYWRl ciBzdGF0ZSAqLworCXJldHVybiAwOworfQorCisjZGVmaW5lIEZEVF9TV19DSEVDS19IRUFERVIo ZmR0KSBcCisJeyBcCisJCWludCBlcnI7IFwKKwkJaWYgKChlcnIgPSBfZmR0X3N3X2NoZWNrX2hl YWRlcihmZHQpKSAhPSAwKSBcCisJCQlyZXR1cm4gZXJyOyBcCisJfQorCitzdGF0aWMgdm9pZCAq X2ZkdF9ncmFiX3NwYWNlKHZvaWQgKmZkdCwgc2l6ZV90IGxlbikKK3sKKwlpbnQgb2Zmc2V0ID0g ZmR0X3NpemVfZHRfc3RydWN0KGZkdCk7CisJaW50IHNwYWNlbGVmdDsKKworCXNwYWNlbGVmdCA9 IGZkdF90b3RhbHNpemUoZmR0KSAtIGZkdF9vZmZfZHRfc3RydWN0KGZkdCkKKwkJLSBmZHRfc2l6 ZV9kdF9zdHJpbmdzKGZkdCk7CisKKwlpZiAoKG9mZnNldCArIGxlbiA8IG9mZnNldCkgfHwgKG9m ZnNldCArIGxlbiA+IHNwYWNlbGVmdCkpCisJCXJldHVybiBOVUxMOworCisJZmR0X3NldF9zaXpl X2R0X3N0cnVjdChmZHQsIG9mZnNldCArIGxlbik7CisJcmV0dXJuIF9mZHRfb2Zmc2V0X3B0cl93 KGZkdCwgb2Zmc2V0KTsKK30KKworaW50IGZkdF9jcmVhdGUodm9pZCAqYnVmLCBpbnQgYnVmc2l6 ZSkKK3sKKwl2b2lkICpmZHQgPSBidWY7CisKKwlpZiAoYnVmc2l6ZSA8IHNpemVvZihzdHJ1Y3Qg ZmR0X2hlYWRlcikpCisJCXJldHVybiAtRkRUX0VSUl9OT1NQQUNFOworCisJbWVtc2V0KGJ1Ziwg MCwgYnVmc2l6ZSk7CisKKwlmZHRfc2V0X21hZ2ljKGZkdCwgRkRUX1NXX01BR0lDKTsKKwlmZHRf c2V0X3ZlcnNpb24oZmR0LCBGRFRfTEFTVF9TVVBQT1JURURfVkVSU0lPTik7CisJZmR0X3NldF9s YXN0X2NvbXBfdmVyc2lvbihmZHQsIEZEVF9GSVJTVF9TVVBQT1JURURfVkVSU0lPTik7CisJZmR0 X3NldF90b3RhbHNpemUoZmR0LCAgYnVmc2l6ZSk7CisKKwlmZHRfc2V0X29mZl9tZW1fcnN2bWFw KGZkdCwgRkRUX0FMSUdOKHNpemVvZihzdHJ1Y3QgZmR0X2hlYWRlciksCisJCQkJCSAgICAgIHNp emVvZihzdHJ1Y3QgZmR0X3Jlc2VydmVfZW50cnkpKSk7CisJZmR0X3NldF9vZmZfZHRfc3RydWN0 KGZkdCwgZmR0X29mZl9tZW1fcnN2bWFwKGZkdCkpOworCWZkdF9zZXRfb2ZmX2R0X3N0cmluZ3Mo ZmR0LCBidWZzaXplKTsKKworCXJldHVybiAwOworfQorCitpbnQgZmR0X2FkZF9yZXNlcnZlbWFw X2VudHJ5KHZvaWQgKmZkdCwgdWludDY0X3QgYWRkciwgdWludDY0X3Qgc2l6ZSkKK3sKKwlzdHJ1 Y3QgZmR0X3Jlc2VydmVfZW50cnkgKnJlOworCWludCBvZmZzZXQ7CisKKwlGRFRfU1dfQ0hFQ0tf SEVBREVSKGZkdCk7CisKKwlpZiAoZmR0X3NpemVfZHRfc3RydWN0KGZkdCkpCisJCXJldHVybiAt RkRUX0VSUl9CQURTVEFURTsKKworCW9mZnNldCA9IGZkdF9vZmZfZHRfc3RydWN0KGZkdCk7CisJ aWYgKChvZmZzZXQgKyBzaXplb2YoKnJlKSkgPiBmZHRfdG90YWxzaXplKGZkdCkpCisJCXJldHVy biAtRkRUX0VSUl9OT1NQQUNFOworCisJcmUgPSAoc3RydWN0IGZkdF9yZXNlcnZlX2VudHJ5ICop KChjaGFyICopZmR0ICsgb2Zmc2V0KTsKKwlyZS0+YWRkcmVzcyA9IGNwdV90b19mZHQ2NChhZGRy KTsKKwlyZS0+c2l6ZSA9IGNwdV90b19mZHQ2NChzaXplKTsKKworCWZkdF9zZXRfb2ZmX2R0X3N0 cnVjdChmZHQsIG9mZnNldCArIHNpemVvZigqcmUpKTsKKworCXJldHVybiAwOworfQorCitpbnQg ZmR0X2ZpbmlzaF9yZXNlcnZlbWFwKHZvaWQgKmZkdCkKK3sKKwlyZXR1cm4gZmR0X2FkZF9yZXNl cnZlbWFwX2VudHJ5KGZkdCwgMCwgMCk7Cit9CisKK2ludCBmZHRfYmVnaW5fbm9kZSh2b2lkICpm ZHQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGZkdF9ub2RlX2hlYWRlciAqbmg7CisJ aW50IG5hbWVsZW4gPSBzdHJsZW4obmFtZSkgKyAxOworCisJRkRUX1NXX0NIRUNLX0hFQURFUihm ZHQpOworCisJbmggPSBfZmR0X2dyYWJfc3BhY2UoZmR0LCBzaXplb2YoKm5oKSArIEZEVF9UQUdB TElHTihuYW1lbGVuKSk7CisJaWYgKCEgbmgpCisJCXJldHVybiAtRkRUX0VSUl9OT1NQQUNFOwor CisJbmgtPnRhZyA9IGNwdV90b19mZHQzMihGRFRfQkVHSU5fTk9ERSk7CisJbWVtY3B5KG5oLT5u YW1lLCBuYW1lLCBuYW1lbGVuKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGZkdF9lbmRfbm9kZSh2 b2lkICpmZHQpCit7CisJdWludDMyX3QgKmVuOworCisJRkRUX1NXX0NIRUNLX0hFQURFUihmZHQp OworCisJZW4gPSBfZmR0X2dyYWJfc3BhY2UoZmR0LCBGRFRfVEFHU0laRSk7CisJaWYgKCEgZW4p CisJCXJldHVybiAtRkRUX0VSUl9OT1NQQUNFOworCisJKmVuID0gY3B1X3RvX2ZkdDMyKEZEVF9F TkRfTk9ERSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2ZkdF9maW5kX2FkZF9zdHJp bmcodm9pZCAqZmR0LCBjb25zdCBjaGFyICpzKQoreworCWNoYXIgKnN0cnRhYiA9IChjaGFyICop ZmR0ICsgZmR0X3RvdGFsc2l6ZShmZHQpOworCWNvbnN0IGNoYXIgKnA7CisJaW50IHN0cnRhYnNp emUgPSBmZHRfc2l6ZV9kdF9zdHJpbmdzKGZkdCk7CisJaW50IGxlbiA9IHN0cmxlbihzKSArIDE7 CisJaW50IHN0cnVjdF90b3AsIG9mZnNldDsKKworCXAgPSBfZmR0X2ZpbmRfc3RyaW5nKHN0cnRh YiAtIHN0cnRhYnNpemUsIHN0cnRhYnNpemUsIHMpOworCWlmIChwKQorCQlyZXR1cm4gcCAtIHN0 cnRhYjsKKworCS8qIEFkZCBpdCAqLworCW9mZnNldCA9IC1zdHJ0YWJzaXplIC0gbGVuOworCXN0 cnVjdF90b3AgPSBmZHRfb2ZmX2R0X3N0cnVjdChmZHQpICsgZmR0X3NpemVfZHRfc3RydWN0KGZk dCk7CisJaWYgKGZkdF90b3RhbHNpemUoZmR0KSArIG9mZnNldCA8IHN0cnVjdF90b3ApCisJCXJl dHVybiAwOyAvKiBubyBtb3JlIHJvb20gOiggKi8KKworCW1lbWNweShzdHJ0YWIgKyBvZmZzZXQs IHMsIGxlbik7CisJZmR0X3NldF9zaXplX2R0X3N0cmluZ3MoZmR0LCBzdHJ0YWJzaXplICsgbGVu KTsKKwlyZXR1cm4gb2Zmc2V0OworfQorCitpbnQgZmR0X3Byb3BlcnR5KHZvaWQgKmZkdCwgY29u c3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsLCBpbnQgbGVuKQoreworCXN0cnVjdCBmZHRf cHJvcGVydHkgKnByb3A7CisJaW50IG5hbWVvZmY7CisKKwlGRFRfU1dfQ0hFQ0tfSEVBREVSKGZk dCk7CisKKwluYW1lb2ZmID0gX2ZkdF9maW5kX2FkZF9zdHJpbmcoZmR0LCBuYW1lKTsKKwlpZiAo bmFtZW9mZiA9PSAwKQorCQlyZXR1cm4gLUZEVF9FUlJfTk9TUEFDRTsKKworCXByb3AgPSBfZmR0 X2dyYWJfc3BhY2UoZmR0LCBzaXplb2YoKnByb3ApICsgRkRUX1RBR0FMSUdOKGxlbikpOworCWlm ICghIHByb3ApCisJCXJldHVybiAtRkRUX0VSUl9OT1NQQUNFOworCisJcHJvcC0+dGFnID0gY3B1 X3RvX2ZkdDMyKEZEVF9QUk9QKTsKKwlwcm9wLT5uYW1lb2ZmID0gY3B1X3RvX2ZkdDMyKG5hbWVv ZmYpOworCXByb3AtPmxlbiA9IGNwdV90b19mZHQzMihsZW4pOworCW1lbWNweShwcm9wLT5kYXRh LCB2YWwsIGxlbik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBmZHRfZmluaXNoKHZvaWQgKmZkdCkK K3sKKwljaGFyICpwID0gKGNoYXIgKilmZHQ7CisJdWludDMyX3QgKmVuZDsKKwlpbnQgb2xkc3Ry b2Zmc2V0LCBuZXdzdHJvZmZzZXQ7CisJdWludDMyX3QgdGFnOworCWludCBvZmZzZXQsIG5leHRv ZmZzZXQ7CisKKwlGRFRfU1dfQ0hFQ0tfSEVBREVSKGZkdCk7CisKKwkvKiBBZGQgdGVybWluYXRv ciAqLworCWVuZCA9IF9mZHRfZ3JhYl9zcGFjZShmZHQsIHNpemVvZigqZW5kKSk7CisJaWYgKCEg ZW5kKQorCQlyZXR1cm4gLUZEVF9FUlJfTk9TUEFDRTsKKwkqZW5kID0gY3B1X3RvX2ZkdDMyKEZE VF9FTkQpOworCisJLyogUmVsb2NhdGUgdGhlIHN0cmluZyB0YWJsZSAqLworCW9sZHN0cm9mZnNl dCA9IGZkdF90b3RhbHNpemUoZmR0KSAtIGZkdF9zaXplX2R0X3N0cmluZ3MoZmR0KTsKKwluZXdz dHJvZmZzZXQgPSBmZHRfb2ZmX2R0X3N0cnVjdChmZHQpICsgZmR0X3NpemVfZHRfc3RydWN0KGZk dCk7CisJbWVtbW92ZShwICsgbmV3c3Ryb2Zmc2V0LCBwICsgb2xkc3Ryb2Zmc2V0LCBmZHRfc2l6 ZV9kdF9zdHJpbmdzKGZkdCkpOworCWZkdF9zZXRfb2ZmX2R0X3N0cmluZ3MoZmR0LCBuZXdzdHJv ZmZzZXQpOworCisJLyogV2FsayB0aGUgc3RydWN0dXJlLCBjb3JyZWN0aW5nIHN0cmluZyBvZmZz ZXRzICovCisJb2Zmc2V0ID0gMDsKKwl3aGlsZSAoKHRhZyA9IGZkdF9uZXh0X3RhZyhmZHQsIG9m ZnNldCwgJm5leHRvZmZzZXQpKSAhPSBGRFRfRU5EKSB7CisJCWlmICh0YWcgPT0gRkRUX1BST1Ap IHsKKwkJCXN0cnVjdCBmZHRfcHJvcGVydHkgKnByb3AgPQorCQkJCV9mZHRfb2Zmc2V0X3B0cl93 KGZkdCwgb2Zmc2V0KTsKKwkJCWludCBuYW1lb2ZmOworCisJCQluYW1lb2ZmID0gZmR0MzJfdG9f Y3B1KHByb3AtPm5hbWVvZmYpOworCQkJbmFtZW9mZiArPSBmZHRfc2l6ZV9kdF9zdHJpbmdzKGZk dCk7CisJCQlwcm9wLT5uYW1lb2ZmID0gY3B1X3RvX2ZkdDMyKG5hbWVvZmYpOworCQl9CisJCW9m ZnNldCA9IG5leHRvZmZzZXQ7CisJfQorCWlmIChuZXh0b2Zmc2V0IDwgMCkKKwkJcmV0dXJuIG5l eHRvZmZzZXQ7CisKKwkvKiBGaW5hbGx5LCBhZGp1c3QgdGhlIGhlYWRlciAqLworCWZkdF9zZXRf dG90YWxzaXplKGZkdCwgbmV3c3Ryb2Zmc2V0ICsgZmR0X3NpemVfZHRfc3RyaW5ncyhmZHQpKTsK KwlmZHRfc2V0X21hZ2ljKGZkdCwgRkRUX01BR0lDKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtcHVy TiB0cnVuay9ncnViLWNvcmUvbGliL2R0Yy9saWJmZHQvZmR0X3dpcC5jIGFybS11Ym9vdC9ncnVi LWNvcmUvbGliL2R0Yy9saWJmZHQvZmR0X3dpcC5jCi0tLSB0cnVuay9ncnViLWNvcmUvbGliL2R0 Yy9saWJmZHQvZmR0X3dpcC5jCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCisr KyBhcm0tdWJvb3QvZ3J1Yi1jb3JlL2xpYi9kdGMvbGliZmR0L2ZkdF93aXAuYwkyMDEyLTExLTIw IDE2OjI2OjU0Ljk1MDkyMDAwMCArMDAwMApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIGxpYmZk dCAtIEZsYXQgRGV2aWNlIFRyZWUgbWFuaXB1bGF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYg RGF2aWQgR2lic29uLCBJQk0gQ29ycG9yYXRpb24uCisgKgorICogbGliZmR0IGlzIGR1YWwgbGlj ZW5zZWQ6IHlvdSBjYW4gdXNlIGl0IGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBH UEwsIG9yIHRoZSBCU0QgbGljZW5zZSwgYXQgeW91ciBvcHRpb24uCisgKgorICogIGEpIFRoaXMg bGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IK KyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogICAgIExpY2Vuc2UsIG9yIChhdCB5 b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgbGlicmFyeSBp cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAg IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh bnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB UiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv ciBtb3JlIGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv cHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0 aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICBTb2Z0d2FyZSBG b3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKKyAq ICAgICBNQSAwMjExMC0xMzAxIFVTQQorICoKKyAqIEFsdGVybmF0aXZlbHksCisgKgorICogIGIp IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg b3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0 aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAg IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUK KyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg dGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKiAgICAgMi4gUmVkaXN0cmli dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAg IGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93 aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro ZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor ICoKKyAqICAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9M REVSUyBBTkQKKyAqICAgICBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1Ig SU1QTElFRCBXQVJSQU5USUVTLAorICogICAgIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP LCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIEFORCBG SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqICAgICBESVNDTEFJTUVELiBJ TiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiAgICAgQ09OVFJJQlVU T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiAg ICAgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO RywgQlVUCisgKiAgICAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg R09PRFMgT1IgU0VSVklDRVM7CisgKiAgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7 IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqICAgICBIT1dFVkVSIENBVVNFRCBBTkQgT04g QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqICAgICBDT05UUkFDVCwgU1RS SUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKKyAqICAgICBP VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRX QVJFLAorICogICAgIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE QU1BR0UuCisgKi8KKyNpbmNsdWRlICJsaWJmZHRfZW52LmgiCisKKyNpbmNsdWRlIDxmZHQuaD4K KyNpbmNsdWRlIDxsaWJmZHQuaD4KKworI2luY2x1ZGUgImxpYmZkdF9pbnRlcm5hbC5oIgorCitp bnQgZmR0X3NldHByb3BfaW5wbGFjZSh2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBj aGFyICpuYW1lLAorCQkJY29uc3Qgdm9pZCAqdmFsLCBpbnQgbGVuKQoreworCXZvaWQgKnByb3B2 YWw7CisJaW50IHByb3BsZW47CisKKwlwcm9wdmFsID0gZmR0X2dldHByb3BfdyhmZHQsIG5vZGVv ZmZzZXQsIG5hbWUsICZwcm9wbGVuKTsKKwlpZiAoISBwcm9wdmFsKQorCQlyZXR1cm4gcHJvcGxl bjsKKworCWlmIChwcm9wbGVuICE9IGxlbikKKwkJcmV0dXJuIC1GRFRfRVJSX05PU1BBQ0U7CisK KwltZW1jcHkocHJvcHZhbCwgdmFsLCBsZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9p ZCBfZmR0X25vcF9yZWdpb24odm9pZCAqc3RhcnQsIGludCBsZW4pCit7CisJdWludDMyX3QgKnA7 CisKKwlmb3IgKHAgPSBzdGFydDsgKGNoYXIgKilwIDwgKChjaGFyICopc3RhcnQgKyBsZW4pOyBw KyspCisJCSpwID0gY3B1X3RvX2ZkdDMyKEZEVF9OT1ApOworfQorCitpbnQgZmR0X25vcF9wcm9w ZXJ0eSh2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0 cnVjdCBmZHRfcHJvcGVydHkgKnByb3A7CisJaW50IGxlbjsKKworCXByb3AgPSBmZHRfZ2V0X3By b3BlcnR5X3coZmR0LCBub2Rlb2Zmc2V0LCBuYW1lLCAmbGVuKTsKKwlpZiAoISBwcm9wKQorCQly ZXR1cm4gbGVuOworCisJX2ZkdF9ub3BfcmVnaW9uKHByb3AsIGxlbiArIHNpemVvZigqcHJvcCkp OworCisJcmV0dXJuIDA7Cit9CisKK2ludCBfZmR0X25vZGVfZW5kX29mZnNldCh2b2lkICpmZHQs IGludCBvZmZzZXQpCit7CisJaW50IGRlcHRoID0gMDsKKworCXdoaWxlICgob2Zmc2V0ID49IDAp ICYmIChkZXB0aCA+PSAwKSkKKwkJb2Zmc2V0ID0gZmR0X25leHRfbm9kZShmZHQsIG9mZnNldCwg JmRlcHRoKTsKKworCXJldHVybiBvZmZzZXQ7Cit9CisKK2ludCBmZHRfbm9wX25vZGUodm9pZCAq ZmR0LCBpbnQgbm9kZW9mZnNldCkKK3sKKwlpbnQgZW5kb2Zmc2V0OworCisJZW5kb2Zmc2V0ID0g X2ZkdF9ub2RlX2VuZF9vZmZzZXQoZmR0LCBub2Rlb2Zmc2V0KTsKKwlpZiAoZW5kb2Zmc2V0IDwg MCkKKwkJcmV0dXJuIGVuZG9mZnNldDsKKworCV9mZHRfbm9wX3JlZ2lvbihmZHRfb2Zmc2V0X3B0 cl93KGZkdCwgbm9kZW9mZnNldCwgMCksCisJCQllbmRvZmZzZXQgLSBub2Rlb2Zmc2V0KTsKKwly ZXR1cm4gMDsKK30KZGlmZiAtcHVyTiB0cnVuay9ncnViLWNvcmUvbGliL2R0Yy9saWJmZHQvbGli ZmR0X2Vudi5oIGFybS11Ym9vdC9ncnViLWNvcmUvbGliL2R0Yy9saWJmZHQvbGliZmR0X2Vudi5o Ci0tLSB0cnVuay9ncnViLWNvcmUvbGliL2R0Yy9saWJmZHQvbGliZmR0X2Vudi5oCTE5NzAtMDEt MDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCisrKyBhcm0tdWJvb3QvZ3J1Yi1jb3JlL2xpYi9k dGMvbGliZmR0L2xpYmZkdF9lbnYuaAkyMDEyLTExLTIwIDE2OjI2OjU0Ljk1MDkyMDAwMCArMDAw MApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIF9MSUJGRFRfRU5WX0gKKyNkZWZpbmUgX0xJQkZE VF9FTlZfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5j bHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgX0IobikJKCh1bnNpZ25lZCBsb25nIGxvbmcpKCh1 aW50OF90ICopJngpW25dKQorc3RhdGljIGlubGluZSB1aW50MzJfdCBmZHQzMl90b19jcHUodWlu dDMyX3QgeCkKK3sKKwlyZXR1cm4gKF9CKDApIDw8IDI0KSB8IChfQigxKSA8PCAxNikgfCAoX0Io MikgPDwgOCkgfCBfQigzKTsKK30KKyNkZWZpbmUgY3B1X3RvX2ZkdDMyKHgpIGZkdDMyX3RvX2Nw dSh4KQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGZkdDY0X3RvX2NwdSh1aW50NjRfdCB4KQor eworCXJldHVybiAoX0IoMCkgPDwgNTYpIHwgKF9CKDEpIDw8IDQ4KSB8IChfQigyKSA8PCA0MCkg fCAoX0IoMykgPDwgMzIpCisJCXwgKF9CKDQpIDw8IDI0KSB8IChfQig1KSA8PCAxNikgfCAoX0Io NikgPDwgOCkgfCBfQig3KTsKK30KKyNkZWZpbmUgY3B1X3RvX2ZkdDY0KHgpIGZkdDY0X3RvX2Nw dSh4KQorI3VuZGVmIF9CCisKKyNlbmRpZiAvKiBfTElCRkRUX0VOVl9IICovCmRpZmYgLXB1ck4g dHJ1bmsvZ3J1Yi1jb3JlL2xpYi9kdGMvbGliZmR0L2xpYmZkdC5oIGFybS11Ym9vdC9ncnViLWNv cmUvbGliL2R0Yy9saWJmZHQvbGliZmR0LmgKLS0tIHRydW5rL2dydWItY29yZS9saWIvZHRjL2xp YmZkdC9saWJmZHQuaAkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMAorKysgYXJt LXVib290L2dydWItY29yZS9saWIvZHRjL2xpYmZkdC9saWJmZHQuaAkyMDEyLTExLTIwIDE2OjI2 OjU0Ljk1MDkyMDAwMCArMDAwMApAQCAtMCwwICsxLDEyMzUgQEAKKyNpZm5kZWYgX0xJQkZEVF9I CisjZGVmaW5lIF9MSUJGRFRfSAorLyoKKyAqIGxpYmZkdCAtIEZsYXQgRGV2aWNlIFRyZWUgbWFu aXB1bGF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRGF2aWQgR2lic29uLCBJQk0gQ29ycG9y YXRpb24uCisgKgorICogbGliZmR0IGlzIGR1YWwgbGljZW5zZWQ6IHlvdSBjYW4gdXNlIGl0IGVp dGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBHUEwsIG9yIHRoZSBCU0QgbGljZW5zZSwg YXQgeW91ciBvcHRpb24uCisgKgorICogIGEpIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1 Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAy IG9mIHRoZQorICogICAgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl cnNpb24uCisgKgorICogICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRB QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICog ICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICog ICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYworICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3Jp dGUgdG8gdGhlIEZyZWUKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFu a2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKKyAqICAgICBNQSAwMjExMC0xMzAxIFVTQQor ICoKKyAqIEFsdGVybmF0aXZlbHksCisgKgorICogIGIpIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlm aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAg ICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90 aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAg IGRpc2NsYWltZXIuCisgKiAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11 c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMg bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1l ciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAg cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqICAgICBUSElTIFNPRlRXQVJF IElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKKyAqICAgICBDT05UUklC VVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICog ICAgIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVT IE9GCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg UFVSUE9TRSBBUkUKKyAqICAgICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09Q WVJJR0hUIE9XTkVSIE9SCisgKiAgICAgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiAgICAgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgICAgTk9UIExJTUlU RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiAg ICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP TikKKyAqICAgICBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks IFdIRVRIRVIgSU4KKyAqICAgICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAo SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKKyAqICAgICBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z IFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAorICogICAgIEVWRU4gSUYgQURW SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUg PGxpYmZkdF9lbnYuaD4KKyNpbmNsdWRlIDxmZHQuaD4KKworI2RlZmluZSBGRFRfRklSU1RfU1VQ UE9SVEVEX1ZFUlNJT04JMHgxMAorI2RlZmluZSBGRFRfTEFTVF9TVVBQT1JURURfVkVSU0lPTgkw eDExCisKKy8qIEVycm9yIGNvZGVzOiBpbmZvcm1hdGl2ZSBlcnJvciBjb2RlcyAqLworI2RlZmlu ZSBGRFRfRVJSX05PVEZPVU5ECTEKKwkvKiBGRFRfRVJSX05PVEZPVU5EOiBUaGUgcmVxdWVzdGVk IG5vZGUgb3IgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QgKi8KKyNkZWZpbmUgRkRUX0VSUl9FWElT VFMJCTIKKwkvKiBGRFRfRVJSX0VYSVNUUzogQXR0ZW1wZWQgdG8gY3JlYXRlIGEgbm9kZSBvciBw cm9wZXJ0eSB3aGljaAorCSAqIGFscmVhZHkgZXhpc3RzICovCisjZGVmaW5lIEZEVF9FUlJfTk9T UEFDRQkJMworCS8qIEZEVF9FUlJfTk9TUEFDRTogT3BlcmF0aW9uIG5lZWRlZCB0byBleHBhbmQg dGhlIGRldmljZQorCSAqIHRyZWUsIGJ1dCBpdHMgYnVmZmVyIGRpZCBub3QgaGF2ZSBzdWZmaWNp ZW50IHNwYWNlIHRvCisJICogY29udGFpbiB0aGUgZXhwYW5kZWQgdHJlZS4gVXNlIGZkdF9vcGVu X2ludG8oKSB0byBtb3ZlIHRoZQorCSAqIGRldmljZSB0cmVlIHRvIGEgYnVmZmVyIHdpdGggbW9y ZSBzcGFjZS4gKi8KKworLyogRXJyb3IgY29kZXM6IGNvZGVzIGZvciBiYWQgcGFyYW1ldGVycyAq LworI2RlZmluZSBGRFRfRVJSX0JBRE9GRlNFVAk0CisJLyogRkRUX0VSUl9CQURPRkZTRVQ6IEZ1 bmN0aW9uIHdhcyBwYXNzZWQgYSBzdHJ1Y3R1cmUgYmxvY2sKKwkgKiBvZmZzZXQgd2hpY2ggaXMg b3V0LW9mLWJvdW5kcywgb3Igd2hpY2ggcG9pbnRzIHRvIGFuCisJICogdW5zdWl0YWJsZSBwYXJ0 IG9mIHRoZSBzdHJ1Y3R1cmUgZm9yIHRoZSBvcGVyYXRpb24uICovCisjZGVmaW5lIEZEVF9FUlJf QkFEUEFUSAkJNQorCS8qIEZEVF9FUlJfQkFEUEFUSDogRnVuY3Rpb24gd2FzIHBhc3NlZCBhIGJh ZGx5IGZvcm1hdHRlZCBwYXRoCisJICogKGUuZy4gbWlzc2luZyBhIGxlYWRpbmcgLyBmb3IgYSBm dW5jdGlvbiB3aGljaCByZXF1aXJlcyBhbgorCSAqIGFic29sdXRlIHBhdGgpICovCisjZGVmaW5l IEZEVF9FUlJfQkFEUEhBTkRMRQk2CisJLyogRkRUX0VSUl9CQURQSEFORExFOiBGdW5jdGlvbiB3 YXMgcGFzc2VkIGFuIGludmFsaWQgcGhhbmRsZQorCSAqIHZhbHVlLiAgcGhhbmRsZSB2YWx1ZXMg b2YgMCBhbmQgLTEgYXJlIG5vdCBwZXJtaXR0ZWQuICovCisjZGVmaW5lIEZEVF9FUlJfQkFEU1RB VEUJNworCS8qIEZEVF9FUlJfQkFEU1RBVEU6IEZ1bmN0aW9uIHdhcyBwYXNzZWQgYW4gaW5jb21w bGV0ZSBkZXZpY2UKKwkgKiB0cmVlIGNyZWF0ZWQgYnkgdGhlIHNlcXVlbnRpYWwtd3JpdGUgZnVu Y3Rpb25zLCB3aGljaCBpcworCSAqIG5vdCBzdWZmaWNpZW50bHkgY29tcGxldGUgZm9yIHRoZSBy ZXF1ZXN0ZWQgb3BlcmF0aW9uLiAqLworCisvKiBFcnJvciBjb2RlczogY29kZXMgZm9yIGJhZCBk ZXZpY2UgdHJlZSBibG9icyAqLworI2RlZmluZSBGRFRfRVJSX1RSVU5DQVRFRAk4CisJLyogRkRU X0VSUl9UUlVOQ0FURUQ6IFN0cnVjdHVyZSBibG9jayBvZiB0aGUgZ2l2ZW4gZGV2aWNlIHRyZWUK KwkgKiBlbmRzIHdpdGhvdXQgYW4gRkRUX0VORCB0YWcuICovCisjZGVmaW5lIEZEVF9FUlJfQkFE TUFHSUMJOQorCS8qIEZEVF9FUlJfQkFETUFHSUM6IEdpdmVuICJkZXZpY2UgdHJlZSIgYXBwZWFy cyBub3QgdG8gYmUgYQorCSAqIGRldmljZSB0cmVlIGF0IGFsbCAtIGl0IGlzIG1pc3NpbmcgdGhl IGZsYXR0ZW5lZCBkZXZpY2UKKwkgKiB0cmVlIG1hZ2ljIG51bWJlci4gKi8KKyNkZWZpbmUgRkRU X0VSUl9CQURWRVJTSU9OCTEwCisJLyogRkRUX0VSUl9CQURWRVJTSU9OOiBHaXZlbiBkZXZpY2Ug dHJlZSBoYXMgYSB2ZXJzaW9uIHdoaWNoCisJICogY2FuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcmVx dWVzdGVkIG9wZXJhdGlvbi4gIEZvcgorCSAqIHJlYWQtd3JpdGUgZnVuY3Rpb25zLCB0aGlzIG1h eSBtZWFuIHRoYXQgZmR0X29wZW5faW50bygpIGlzCisJICogcmVxdWlyZWQgdG8gY29udmVydCB0 aGUgdHJlZSB0byB0aGUgZXhwZWN0ZWQgdmVyc2lvbi4gKi8KKyNkZWZpbmUgRkRUX0VSUl9CQURT VFJVQ1RVUkUJMTEKKwkvKiBGRFRfRVJSX0JBRFNUUlVDVFVSRTogR2l2ZW4gZGV2aWNlIHRyZWUg aGFzIGEgY29ycnVwdAorCSAqIHN0cnVjdHVyZSBibG9jayBvciBvdGhlciBzZXJpb3VzIGVycm9y IChlLmcuIG1pc25lc3RlZAorCSAqIG5vZGVzLCBvciBzdWJub2RlcyBwcmVjZWRpbmcgcHJvcGVy dGllcykuICovCisjZGVmaW5lIEZEVF9FUlJfQkFETEFZT1VUCTEyCisJLyogRkRUX0VSUl9CQURM QVlPVVQ6IEZvciByZWFkLXdyaXRlIGZ1bmN0aW9ucywgdGhlIGdpdmVuCisJICogZGV2aWNlIHRy ZWUgaGFzIGl0J3Mgc3ViLWJsb2NrcyBpbiBhbiBvcmRlciB0aGF0IHRoZQorCSAqIGZ1bmN0aW9u IGNhbid0IGhhbmRsZSAobWVtb3J5IHJlc2VydmUgbWFwLCB0aGVuIHN0cnVjdHVyZSwKKwkgKiB0 aGVuIHN0cmluZ3MpLiAgVXNlIGZkdF9vcGVuX2ludG8oKSB0byByZW9yZ2FuaXplIHRoZSB0cmVl CisJICogaW50byBhIGZvcm0gc3VpdGFibGUgZm9yIHRoZSByZWFkLXdyaXRlIG9wZXJhdGlvbnMu ICovCisKKy8qICJDYW4ndCBoYXBwZW4iIGVycm9yIGluZGljYXRpbmcgYSBidWcgaW4gbGliZmR0 ICovCisjZGVmaW5lIEZEVF9FUlJfSU5URVJOQUwJMTMKKwkvKiBGRFRfRVJSX0lOVEVSTkFMOiBs aWJmZHQgaGFzIGZhaWxlZCBhbiBpbnRlcm5hbCBhc3NlcnRpb24uCisJICogU2hvdWxkIG5ldmVy IGJlIHJldHVybmVkLCBpZiBpdCBpcywgaXQgaW5kaWNhdGVzIGEgYnVnIGluCisJICogbGliZmR0 IGl0c2VsZi4gKi8KKworI2RlZmluZSBGRFRfRVJSX01BWAkJMTMKKworLyoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov CisvKiBMb3ctbGV2ZWwgZnVuY3Rpb25zICh5b3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0aGVzZSkg ICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjb25zdCB2b2lkICpmZHRfb2Zm c2V0X3B0cihjb25zdCB2b2lkICpmZHQsIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBjaGVja2xl bik7CitzdGF0aWMgaW5saW5lIHZvaWQgKmZkdF9vZmZzZXRfcHRyX3codm9pZCAqZmR0LCBpbnQg b2Zmc2V0LCBpbnQgY2hlY2tsZW4pCit7CisJcmV0dXJuICh2b2lkICopKHVpbnRwdHJfdClmZHRf b2Zmc2V0X3B0cihmZHQsIG9mZnNldCwgY2hlY2tsZW4pOworfQorCit1aW50MzJfdCBmZHRfbmV4 dF90YWcoY29uc3Qgdm9pZCAqZmR0LCBpbnQgb2Zmc2V0LCBpbnQgKm5leHRvZmZzZXQpOworCisv KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKi8KKy8qIFRyYXZlcnNhbCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBm ZHRfbmV4dF9ub2RlKGNvbnN0IHZvaWQgKmZkdCwgaW50IG9mZnNldCwgaW50ICpkZXB0aCk7CisK Ky8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqLworLyogR2VuZXJhbCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2Rl ZmluZSBmZHRfZ2V0X2hlYWRlcihmZHQsIGZpZWxkKSBcCisJKGZkdDMyX3RvX2NwdSgoKGNvbnN0 IHN0cnVjdCBmZHRfaGVhZGVyICopKGZkdCkpLT5maWVsZCkpCisjZGVmaW5lIGZkdF9tYWdpYyhm ZHQpIAkJCShmZHRfZ2V0X2hlYWRlcihmZHQsIG1hZ2ljKSkKKyNkZWZpbmUgZmR0X3RvdGFsc2l6 ZShmZHQpCQkoZmR0X2dldF9oZWFkZXIoZmR0LCB0b3RhbHNpemUpKQorI2RlZmluZSBmZHRfb2Zm X2R0X3N0cnVjdChmZHQpCQkoZmR0X2dldF9oZWFkZXIoZmR0LCBvZmZfZHRfc3RydWN0KSkKKyNk ZWZpbmUgZmR0X29mZl9kdF9zdHJpbmdzKGZkdCkJCShmZHRfZ2V0X2hlYWRlcihmZHQsIG9mZl9k dF9zdHJpbmdzKSkKKyNkZWZpbmUgZmR0X29mZl9tZW1fcnN2bWFwKGZkdCkJCShmZHRfZ2V0X2hl YWRlcihmZHQsIG9mZl9tZW1fcnN2bWFwKSkKKyNkZWZpbmUgZmR0X3ZlcnNpb24oZmR0KQkJKGZk dF9nZXRfaGVhZGVyKGZkdCwgdmVyc2lvbikpCisjZGVmaW5lIGZkdF9sYXN0X2NvbXBfdmVyc2lv bihmZHQpIAkoZmR0X2dldF9oZWFkZXIoZmR0LCBsYXN0X2NvbXBfdmVyc2lvbikpCisjZGVmaW5l IGZkdF9ib290X2NwdWlkX3BoeXMoZmR0KSAJKGZkdF9nZXRfaGVhZGVyKGZkdCwgYm9vdF9jcHVp ZF9waHlzKSkKKyNkZWZpbmUgZmR0X3NpemVfZHRfc3RyaW5ncyhmZHQpIAkoZmR0X2dldF9oZWFk ZXIoZmR0LCBzaXplX2R0X3N0cmluZ3MpKQorI2RlZmluZSBmZHRfc2l6ZV9kdF9zdHJ1Y3QoZmR0 KQkJKGZkdF9nZXRfaGVhZGVyKGZkdCwgc2l6ZV9kdF9zdHJ1Y3QpKQorCisjZGVmaW5lIF9fZmR0 X3NldF9oZHIobmFtZSkgXAorCXN0YXRpYyBpbmxpbmUgdm9pZCBmZHRfc2V0XyMjbmFtZSh2b2lk ICpmZHQsIHVpbnQzMl90IHZhbCkgXAorCXsgXAorCQlzdHJ1Y3QgZmR0X2hlYWRlciAqZmR0aCA9 IChzdHJ1Y3QgZmR0X2hlYWRlciopZmR0OyBcCisJCWZkdGgtPm5hbWUgPSBjcHVfdG9fZmR0MzIo dmFsKTsgXAorCX0KK19fZmR0X3NldF9oZHIobWFnaWMpOworX19mZHRfc2V0X2hkcih0b3RhbHNp emUpOworX19mZHRfc2V0X2hkcihvZmZfZHRfc3RydWN0KTsKK19fZmR0X3NldF9oZHIob2ZmX2R0 X3N0cmluZ3MpOworX19mZHRfc2V0X2hkcihvZmZfbWVtX3Jzdm1hcCk7CitfX2ZkdF9zZXRfaGRy KHZlcnNpb24pOworX19mZHRfc2V0X2hkcihsYXN0X2NvbXBfdmVyc2lvbik7CitfX2ZkdF9zZXRf aGRyKGJvb3RfY3B1aWRfcGh5cyk7CitfX2ZkdF9zZXRfaGRyKHNpemVfZHRfc3RyaW5ncyk7Citf X2ZkdF9zZXRfaGRyKHNpemVfZHRfc3RydWN0KTsKKyN1bmRlZiBfX2ZkdF9zZXRfaGRyCisKKy8q KgorICogZmR0X2NoZWNrX2hlYWRlciAtIHNhbml0eSBjaGVjayBhIGRldmljZSB0cmVlIG9yIHBv c3NpYmxlIGRldmljZSB0cmVlCisgKiBAZmR0OiBwb2ludGVyIHRvIGRhdGEgd2hpY2ggbWlnaHQg YmUgYSBmbGF0dGVuZWQgZGV2aWNlIHRyZWUKKyAqCisgKiBmZHRfY2hlY2tfaGVhZGVyKCkgY2hl Y2tzIHRoYXQgdGhlIGdpdmVuIGJ1ZmZlciBjb250YWlucyB3aGF0CisgKiBhcHBlYXJzIHRvIGJl IGEgZmxhdHRlbmVkIGRldmljZSB0cmVlIHdpdGggc2FuZSBpbmZvcm1hdGlvbiBpbiBpdHMKKyAq IGhlYWRlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIGlmIHRoZSBidWZmZXIgYXBwZWFy cyB0byBjb250YWluIGEgdmFsaWQgZGV2aWNlIHRyZWUKKyAqICAgICAtRkRUX0VSUl9CQURNQUdJ QywKKyAqICAgICAtRkRUX0VSUl9CQURWRVJTSU9OLAorICogICAgIC1GRFRfRVJSX0JBRFNUQVRF LCBzdGFuZGFyZCBtZWFuaW5ncywgYXMgYWJvdmUKKyAqLworaW50IGZkdF9jaGVja19oZWFkZXIo Y29uc3Qgdm9pZCAqZmR0KTsKKworLyoqCisgKiBmZHRfbW92ZSAtIG1vdmUgYSBkZXZpY2UgdHJl ZSBhcm91bmQgaW4gbWVtb3J5CisgKiBAZmR0OiBwb2ludGVyIHRvIHRoZSBkZXZpY2UgdHJlZSB0 byBtb3ZlCisgKiBAYnVmOiBwb2ludGVyIHRvIG1lbW9yeSB3aGVyZSB0aGUgZGV2aWNlIGlzIHRv IGJlIG1vdmVkCisgKiBAYnVmc2l6ZTogc2l6ZSBvZiB0aGUgbWVtb3J5IHNwYWNlIGF0IGJ1Zgor ICoKKyAqIGZkdF9tb3ZlKCkgcmVsb2NhdGVzLCBpZiBwb3NzaWJsZSwgdGhlIGRldmljZSB0cmVl IGJsb2IgbG9jYXRlZCBhdAorICogZmR0IHRvIHRoZSBidWZmZXIgYXQgYnVmIG9mIHNpemUgYnVm c2l6ZS4gIFRoZSBidWZmZXIgbWF5IG92ZXJsYXAKKyAqIHdpdGggdGhlIGV4aXN0aW5nIGRldmlj ZSB0cmVlIGJsb2IgYXQgZmR0LiAgVGhlcmVmb3JlLAorICogICAgIGZkdF9tb3ZlKGZkdCwgZmR0 LCBmZHRfdG90YWxzaXplKGZkdCkpCisgKiBzaG91bGQgYWx3YXlzIHN1Y2NlZWQuCisgKgorICog cmV0dXJuczoKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgLUZEVF9FUlJfTk9TUEFDRSwg YnVmc2l6ZSBpcyBpbnN1ZmZpY2llbnQgdG8gY29udGFpbiB0aGUgZGV2aWNlIHRyZWUKKyAqICAg ICAtRkRUX0VSUl9CQURNQUdJQywKKyAqICAgICAtRkRUX0VSUl9CQURWRVJTSU9OLAorICogICAg IC1GRFRfRVJSX0JBRFNUQVRFLCBzdGFuZGFyZCBtZWFuaW5ncworICovCitpbnQgZmR0X21vdmUo Y29uc3Qgdm9pZCAqZmR0LCB2b2lkICpidWYsIGludCBidWZzaXplKTsKKworLyoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KiovCisvKiBSZWFkLW9ubHkgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIGZkdF9zdHJp bmcgLSByZXRyaWV2ZSBhIHN0cmluZyBmcm9tIHRoZSBzdHJpbmdzIGJsb2NrIG9mIGEgZGV2aWNl IHRyZWUKKyAqIEBmZHQ6IHBvaW50ZXIgdG8gdGhlIGRldmljZSB0cmVlIGJsb2IKKyAqIEBzdHJv ZmZzZXQ6IG9mZnNldCBvZiB0aGUgc3RyaW5nIHdpdGhpbiB0aGUgc3RyaW5ncyBibG9jayAobmF0 aXZlIGVuZGlhbikKKyAqCisgKiBmZHRfc3RyaW5nKCkgcmV0cmlldmVzIGEgcG9pbnRlciB0byBh IHNpbmdsZSBzdHJpbmcgZnJvbSB0aGUKKyAqIHN0cmluZ3MgYmxvY2sgb2YgdGhlIGRldmljZSB0 cmVlIGJsb2IgYXQgZmR0LgorICoKKyAqIHJldHVybnM6CisgKiAgICAgYSBwb2ludGVyIHRvIHRo ZSBzdHJpbmcsIG9uIHN1Y2Nlc3MKKyAqICAgICBOVUxMLCBpZiBzdHJvZmZzZXQgaXMgb3V0IG9m IGJvdW5kcworICovCitjb25zdCBjaGFyICpmZHRfc3RyaW5nKGNvbnN0IHZvaWQgKmZkdCwgaW50 IHN0cm9mZnNldCk7CisKKy8qKgorICogZmR0X251bV9tZW1fcnN2IC0gcmV0cmlldmUgdGhlIG51 bWJlciBvZiBtZW1vcnkgcmVzZXJ2ZSBtYXAgZW50cmllcworICogQGZkdDogcG9pbnRlciB0byB0 aGUgZGV2aWNlIHRyZWUgYmxvYgorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVz IGluIHRoZSBkZXZpY2UgdHJlZSBibG9iJ3MgbWVtb3J5CisgKiByZXNlcnZhdGlvbiBtYXAuICBU aGlzIGRvZXMgbm90IGluY2x1ZGUgdGhlIHRlcm1pbmF0aW5nIDAsMCBlbnRyeQorICogb3IgYW55 IG90aGVyICgwLDApIGVudHJpZXMgcmVzZXJ2ZWQgZm9yIGV4cGFuc2lvbi4KKyAqCisgKiByZXR1 cm5zOgorICogICAgIHRoZSBudW1iZXIgb2YgZW50cmllcworICovCitpbnQgZmR0X251bV9tZW1f cnN2KGNvbnN0IHZvaWQgKmZkdCk7CisKKy8qKgorICogZmR0X2dldF9tZW1fcnN2IC0gcmV0cmll dmUgb25lIG1lbW9yeSByZXNlcnZlIG1hcCBlbnRyeQorICogQGZkdDogcG9pbnRlciB0byB0aGUg ZGV2aWNlIHRyZWUgYmxvYgorICogQGFkZHJlc3MsIEBzaXplOiBwb2ludGVycyB0byA2NC1iaXQg dmFyaWFibGVzCisgKgorICogT24gc3VjY2VzcywgKmFkZHJlc3MgYW5kICpzaXplIHdpbGwgY29u dGFpbiB0aGUgYWRkcmVzcyBhbmQgc2l6ZSBvZgorICogdGhlIG4tdGggcmVzZXJ2ZSBtYXAgZW50 cnkgZnJvbSB0aGUgZGV2aWNlIHRyZWUgYmxvYiwgaW4KKyAqIG5hdGl2ZS1lbmRpYW4gZm9ybWF0 LgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC1GRFRfRVJS X0JBRE1BR0lDLAorICogICAgIC1GRFRfRVJSX0JBRFZFUlNJT04sCisgKiAgICAgLUZEVF9FUlJf QkFEU1RBVEUsIHN0YW5kYXJkIG1lYW5pbmdzCisgKi8KK2ludCBmZHRfZ2V0X21lbV9yc3YoY29u c3Qgdm9pZCAqZmR0LCBpbnQgbiwgdWludDY0X3QgKmFkZHJlc3MsIHVpbnQ2NF90ICpzaXplKTsK KworLyoqCisgKiBmZHRfc3Vibm9kZV9vZmZzZXRfbmFtZWxlbiAtIGZpbmQgYSBzdWJub2RlIGJh c2VkIG9uIHN1YnN0cmluZworICogQGZkdDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHRyZWUgYmxv YgorICogQHBhcmVudG9mZnNldDogc3RydWN0dXJlIGJsb2NrIG9mZnNldCBvZiBhIG5vZGUKKyAq IEBuYW1lOiBuYW1lIG9mIHRoZSBzdWJub2RlIHRvIGxvY2F0ZQorICogQG5hbWVsZW46IG51bWJl ciBvZiBjaGFyYWN0ZXJzIG9mIG5hbWUgdG8gY29uc2lkZXIKKyAqCisgKiBJZGVudGljYWwgdG8g ZmR0X3N1Ym5vZGVfb2Zmc2V0KCksIGJ1dCBvbmx5IGV4YW1pbmUgdGhlIGZpcnN0CisgKiBuYW1l bGVuIGNoYXJhY3RlcnMgb2YgbmFtZSBmb3IgbWF0Y2hpbmcgdGhlIHN1Ym5vZGUgbmFtZS4gIFRo aXMgaXMKKyAqIHVzZWZ1bCBmb3IgZmluZGluZyBzdWJub2RlcyBiYXNlZCBvbiBhIHBvcnRpb24g b2YgYSBsYXJnZXIgc3RyaW5nLAorICogc3VjaCBhcyBhIGZ1bGwgcGF0aC4KKyAqLworaW50IGZk dF9zdWJub2RlX29mZnNldF9uYW1lbGVuKGNvbnN0IHZvaWQgKmZkdCwgaW50IHBhcmVudG9mZnNl dCwKKwkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbik7CisvKioKKyAqIGZk dF9zdWJub2RlX29mZnNldCAtIGZpbmQgYSBzdWJub2RlIG9mIGEgZ2l2ZW4gbm9kZQorICogQGZk dDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHRyZWUgYmxvYgorICogQHBhcmVudG9mZnNldDogc3Ry dWN0dXJlIGJsb2NrIG9mZnNldCBvZiBhIG5vZGUKKyAqIEBuYW1lOiBuYW1lIG9mIHRoZSBzdWJu b2RlIHRvIGxvY2F0ZQorICoKKyAqIGZkdF9zdWJub2RlX29mZnNldCgpIGZpbmRzIGEgc3Vibm9k ZSBvZiB0aGUgbm9kZSBhdCBzdHJ1Y3R1cmUgYmxvY2sKKyAqIG9mZnNldCBwYXJlbnRvZmZzZXQg d2l0aCB0aGUgZ2l2ZW4gbmFtZS4gIG5hbWUgbWF5IGluY2x1ZGUgYSB1bml0CisgKiBhZGRyZXNz LCBpbiB3aGljaCBjYXNlIGZkdF9zdWJub2RlX29mZnNldCgpIHdpbGwgZmluZCB0aGUgc3Vibm9k ZQorICogd2l0aCB0aGF0IHVuaXQgYWRkcmVzcywgb3IgdGhlIHVuaXQgYWRkcmVzcyBtYXkgYmUg b21pdHRlZCwgaW4KKyAqIHdoaWNoIGNhc2UgZmR0X3N1Ym5vZGVfb2Zmc2V0KCkgd2lsbCBmaW5k IGFuIGFyYml0cmFyeSBzdWJub2RlCisgKiB3aG9zZSBuYW1lIGV4Y2x1ZGluZyB1bml0IGFkZHJl c3MgbWF0Y2hlcyB0aGUgZ2l2ZW4gbmFtZS4KKyAqCisgKiByZXR1cm5zOgorICoJc3RydWN0dXJl IGJsb2NrIG9mZnNldCBvZiB0aGUgcmVxdWVzdGVkIHN1Ym5vZGUgKD49MCksIG9uIHN1Y2Nlc3MK KyAqCS1GRFRfRVJSX05PVEZPVU5ELCBpZiB0aGUgcmVxdWVzdGVkIHN1Ym5vZGUgZG9lcyBub3Qg ZXhpc3QKKyAqCS1GRFRfRVJSX0JBRE9GRlNFVCwgaWYgcGFyZW50b2Zmc2V0IGRpZCBub3QgcG9p bnQgdG8gYW4gRkRUX0JFR0lOX05PREUgdGFnCisgKiAgICAgIC1GRFRfRVJSX0JBRE1BR0lDLAor ICoJLUZEVF9FUlJfQkFEVkVSU0lPTiwKKyAqCS1GRFRfRVJSX0JBRFNUQVRFLAorICoJLUZEVF9F UlJfQkFEU1RSVUNUVVJFLAorICoJLUZEVF9FUlJfVFJVTkNBVEVELCBzdGFuZGFyZCBtZWFuaW5n cy4KKyAqLworaW50IGZkdF9zdWJub2RlX29mZnNldChjb25zdCB2b2lkICpmZHQsIGludCBwYXJl bnRvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUpOworCisvKioKKyAqIGZkdF9wYXRoX29mZnNldCAt IGZpbmQgYSB0cmVlIG5vZGUgYnkgaXRzIGZ1bGwgcGF0aAorICogQGZkdDogcG9pbnRlciB0byB0 aGUgZGV2aWNlIHRyZWUgYmxvYgorICogQHBhdGg6IGZ1bGwgcGF0aCBvZiB0aGUgbm9kZSB0byBs b2NhdGUKKyAqCisgKiBmZHRfcGF0aF9vZmZzZXQoKSBmaW5kcyBhIG5vZGUgb2YgYSBnaXZlbiBw YXRoIGluIHRoZSBkZXZpY2UgdHJlZS4KKyAqIEVhY2ggcGF0aCBjb21wb25lbnQgbWF5IG9taXQg dGhlIHVuaXQgYWRkcmVzcyBwb3J0aW9uLCBidXQgdGhlCisgKiByZXN1bHRzIG9mIHRoaXMgYXJl IHVuZGVmaW5lZCBpZiBhbnkgc3VjaCBwYXRoIGNvbXBvbmVudCBpcworICogYW1iaWd1b3VzICh0 aGF0IGlzIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBub2RlcyBhdCB0aGUgcmVsZXZhbnQKKyAqIGxl dmVsIG1hdGNoaW5nIHRoZSBnaXZlbiBjb21wb25lbnQsIGRpZmZlcmVudGlhdGVkIG9ubHkgYnkg dW5pdAorICogYWRkcmVzcykuCisgKgorICogcmV0dXJuczoKKyAqCXN0cnVjdHVyZSBibG9jayBv ZmZzZXQgb2YgdGhlIG5vZGUgd2l0aCB0aGUgcmVxdWVzdGVkIHBhdGggKD49MCksIG9uIHN1Y2Nl c3MKKyAqCS1GRFRfRVJSX0JBRFBBVEgsIGdpdmVuIHBhdGggZG9lcyBub3QgYmVnaW4gd2l0aCAn Lycgb3IgaXMgaW52YWxpZAorICoJLUZEVF9FUlJfTk9URk9VTkQsIGlmIHRoZSByZXF1ZXN0ZWQg bm9kZSBkb2VzIG5vdCBleGlzdAorICogICAgICAtRkRUX0VSUl9CQURNQUdJQywKKyAqCS1GRFRf RVJSX0JBRFZFUlNJT04sCisgKgktRkRUX0VSUl9CQURTVEFURSwKKyAqCS1GRFRfRVJSX0JBRFNU UlVDVFVSRSwKKyAqCS1GRFRfRVJSX1RSVU5DQVRFRCwgc3RhbmRhcmQgbWVhbmluZ3MuCisgKi8K K2ludCBmZHRfcGF0aF9vZmZzZXQoY29uc3Qgdm9pZCAqZmR0LCBjb25zdCBjaGFyICpwYXRoKTsK KworLyoqCisgKiBmZHRfZ2V0X25hbWUgLSByZXRyaWV2ZSB0aGUgbmFtZSBvZiBhIGdpdmVuIG5v ZGUKKyAqIEBmZHQ6IHBvaW50ZXIgdG8gdGhlIGRldmljZSB0cmVlIGJsb2IKKyAqIEBub2Rlb2Zm c2V0OiBzdHJ1Y3R1cmUgYmxvY2sgb2Zmc2V0IG9mIHRoZSBzdGFydGluZyBub2RlCisgKiBAbGVu cDogcG9pbnRlciB0byBhbiBpbnRlZ2VyIHZhcmlhYmxlICh3aWxsIGJlIG92ZXJ3cml0dGVuKSBv ciBOVUxMCisgKgorICogZmR0X2dldF9uYW1lKCkgcmV0cmlldmVzIHRoZSBuYW1lIChpbmNsdWRp bmcgdW5pdCBhZGRyZXNzKSBvZiB0aGUKKyAqIGRldmljZSB0cmVlIG5vZGUgYXQgc3RydWN0dXJl IGJsb2NrIG9mZnNldCBub2Rlb2Zmc2V0LiAgSWYgbGVucCBpcworICogbm9uLU5VTEwsIHRoZSBs ZW5ndGggb2YgdGhpcyBuYW1lIGlzIGFsc28gcmV0dXJuZWQsIGluIHRoZSBpbnRlZ2VyCisgKiBw b2ludGVkIHRvIGJ5IGxlbnAuCisgKgorICogcmV0dXJuczoKKyAqCXBvaW50ZXIgdG8gdGhlIG5v ZGUncyBuYW1lLCBvbiBzdWNjZXNzCisgKgkJSWYgbGVucCBpcyBub24tTlVMTCwgKmxlbnAgY29u dGFpbnMgdGhlIGxlbmd0aCBvZiB0aGF0IG5hbWUgKD49MCkKKyAqCU5VTEwsIG9uIGVycm9yCisg KgkJaWYgbGVucCBpcyBub24tTlVMTCAqbGVucCBjb250YWlucyBhbiBlcnJvciBjb2RlICg8MCk6 CisgKgkJLUZEVF9FUlJfQkFET0ZGU0VULCBub2Rlb2Zmc2V0IGRpZCBub3QgcG9pbnQgdG8gRkRU X0JFR0lOX05PREUgdGFnCisgKgkJLUZEVF9FUlJfQkFETUFHSUMsCisgKgkJLUZEVF9FUlJfQkFE VkVSU0lPTiwKKyAqCQktRkRUX0VSUl9CQURTVEFURSwgc3RhbmRhcmQgbWVhbmluZ3MKKyAqLwor Y29uc3QgY2hhciAqZmR0X2dldF9uYW1lKGNvbnN0IHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQs IGludCAqbGVucCk7CisKKy8qKgorICogZmR0X2ZpcnN0X3Byb3BlcnR5X29mZnNldCAtIGZpbmQg dGhlIG9mZnNldCBvZiBhIG5vZGUncyBmaXJzdCBwcm9wZXJ0eQorICogQGZkdDogcG9pbnRlciB0 byB0aGUgZGV2aWNlIHRyZWUgYmxvYgorICogQG5vZGVvZmZzZXQ6IHN0cnVjdHVyZSBibG9jayBv ZmZzZXQgb2YgYSBub2RlCisgKgorICogZmR0X2ZpcnN0X3Byb3BlcnR5X29mZnNldCgpIGZpbmRz IHRoZSBmaXJzdCBwcm9wZXJ0eSBvZiB0aGUgbm9kZSBhdAorICogdGhlIGdpdmVuIHN0cnVjdHVy ZSBibG9jayBvZmZzZXQuCisgKgorICogcmV0dXJuczoKKyAqCXN0cnVjdHVyZSBibG9jayBvZmZz ZXQgb2YgdGhlIHByb3BlcnR5ICg+PTApLCBvbiBzdWNjZXNzCisgKgktRkRUX0VSUl9OT1RGT1VO RCwgaWYgdGhlIHJlcXVlc3RlZCBub2RlIGhhcyBubyBwcm9wZXJ0aWVzCisgKgktRkRUX0VSUl9C QURPRkZTRVQsIGlmIG5vZGVvZmZzZXQgZGlkIG5vdCBwb2ludCB0byBhbiBGRFRfQkVHSU5fTk9E RSB0YWcKKyAqICAgICAgLUZEVF9FUlJfQkFETUFHSUMsCisgKgktRkRUX0VSUl9CQURWRVJTSU9O LAorICoJLUZEVF9FUlJfQkFEU1RBVEUsCisgKgktRkRUX0VSUl9CQURTVFJVQ1RVUkUsCisgKgkt RkRUX0VSUl9UUlVOQ0FURUQsIHN0YW5kYXJkIG1lYW5pbmdzLgorICovCitpbnQgZmR0X2ZpcnN0 X3Byb3BlcnR5X29mZnNldChjb25zdCB2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0KTsKKworLyoq CisgKiBmZHRfbmV4dF9wcm9wZXJ0eV9vZmZzZXQgLSBzdGVwIHRocm91Z2ggYSBub2RlJ3MgcHJv cGVydGllcworICogQGZkdDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHRyZWUgYmxvYgorICogQG9m ZnNldDogc3RydWN0dXJlIGJsb2NrIG9mZnNldCBvZiBhIHByb3BlcnR5CisgKgorICogZmR0X25l eHRfcHJvcGVydHlfb2Zmc2V0KCkgZmluZHMgdGhlIHByb3BlcnR5IGltbWVkaWF0ZWx5IGFmdGVy IHRoZQorICogb25lIGF0IHRoZSBnaXZlbiBzdHJ1Y3R1cmUgYmxvY2sgb2Zmc2V0LiAgVGhpcyB3 aWxsIGJlIGEgcHJvcGVydHkKKyAqIG9mIHRoZSBzYW1lIG5vZGUgYXMgdGhlIGdpdmVuIHByb3Bl cnR5LgorICoKKyAqIHJldHVybnM6CisgKglzdHJ1Y3R1cmUgYmxvY2sgb2Zmc2V0IG9mIHRoZSBu ZXh0IHByb3BlcnR5ICg+PTApLCBvbiBzdWNjZXNzCisgKgktRkRUX0VSUl9OT1RGT1VORCwgaWYg dGhlIGdpdmVuIHByb3BlcnR5IGlzIHRoZSBsYXN0IGluIGl0cyBub2RlCisgKgktRkRUX0VSUl9C QURPRkZTRVQsIGlmIG5vZGVvZmZzZXQgZGlkIG5vdCBwb2ludCB0byBhbiBGRFRfUFJPUCB0YWcK KyAqICAgICAgLUZEVF9FUlJfQkFETUFHSUMsCisgKgktRkRUX0VSUl9CQURWRVJTSU9OLAorICoJ LUZEVF9FUlJfQkFEU1RBVEUsCisgKgktRkRUX0VSUl9CQURTVFJVQ1RVUkUsCisgKgktRkRUX0VS Ul9UUlVOQ0FURUQsIHN0YW5kYXJkIG1lYW5pbmdzLgorICovCitpbnQgZmR0X25leHRfcHJvcGVy dHlfb2Zmc2V0KGNvbnN0IHZvaWQgKmZkdCwgaW50IG9mZnNldCk7CisKKy8qKgorICogZmR0X2dl dF9wcm9wZXJ0eV9ieV9vZmZzZXQgLSByZXRyaWV2ZSB0aGUgcHJvcGVydHkgYXQgYSBnaXZlbiBv ZmZzZXQKKyAqIEBmZHQ6IHBvaW50ZXIgdG8gdGhlIGRldmljZSB0cmVlIGJsb2IKKyAqIEBvZmZz ZXQ6IG9mZnNldCBvZiB0aGUgcHJvcGVydHkgdG8gcmV0cmlldmUKKyAqIEBsZW5wOiBwb2ludGVy IHRvIGFuIGludGVnZXIgdmFyaWFibGUgKHdpbGwgYmUgb3ZlcndyaXR0ZW4pIG9yIE5VTEwKKyAq CisgKiBmZHRfZ2V0X3Byb3BlcnR5X2J5X29mZnNldCgpIHJldHJpZXZlcyBhIHBvaW50ZXIgdG8g dGhlCisgKiBmZHRfcHJvcGVydHkgc3RydWN0dXJlIHdpdGhpbiB0aGUgZGV2aWNlIHRyZWUgYmxv YiBhdCB0aGUgZ2l2ZW4KKyAqIG9mZnNldC4gIElmIGxlbnAgaXMgbm9uLU5VTEwsIHRoZSBsZW5n dGggb2YgdGhlIHByb3BlcnR5IHZhbHVlIGlzCisgKiBhbHNvIHJldHVybmVkLCBpbiB0aGUgaW50 ZWdlciBwb2ludGVkIHRvIGJ5IGxlbnAuCisgKgorICogcmV0dXJuczoKKyAqCXBvaW50ZXIgdG8g dGhlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIHByb3BlcnR5CisgKgkJaWYgbGVucCBpcyBu b24tTlVMTCwgKmxlbnAgY29udGFpbnMgdGhlIGxlbmd0aCBvZiB0aGUgcHJvcGVydHkKKyAqCQl2 YWx1ZSAoPj0wKQorICoJTlVMTCwgb24gZXJyb3IKKyAqCQlpZiBsZW5wIGlzIG5vbi1OVUxMLCAq bGVucCBjb250YWlucyBhbiBlcnJvciBjb2RlICg8MCk6CisgKgkJLUZEVF9FUlJfQkFET0ZGU0VU LCBub2Rlb2Zmc2V0IGRpZCBub3QgcG9pbnQgdG8gRkRUX1BST1AgdGFnCisgKgkJLUZEVF9FUlJf QkFETUFHSUMsCisgKgkJLUZEVF9FUlJfQkFEVkVSU0lPTiwKKyAqCQktRkRUX0VSUl9CQURTVEFU RSwKKyAqCQktRkRUX0VSUl9CQURTVFJVQ1RVUkUsCisgKgkJLUZEVF9FUlJfVFJVTkNBVEVELCBz dGFuZGFyZCBtZWFuaW5ncworICovCitjb25zdCBzdHJ1Y3QgZmR0X3Byb3BlcnR5ICpmZHRfZ2V0 X3Byb3BlcnR5X2J5X29mZnNldChjb25zdCB2b2lkICpmZHQsCisJCQkJCQkgICAgICBpbnQgb2Zm c2V0LAorCQkJCQkJICAgICAgaW50ICpsZW5wKTsKKworLyoqCisgKiBmZHRfZ2V0X3Byb3BlcnR5 X25hbWVsZW4gLSBmaW5kIGEgcHJvcGVydHkgYmFzZWQgb24gc3Vic3RyaW5nCisgKiBAZmR0OiBw b2ludGVyIHRvIHRoZSBkZXZpY2UgdHJlZSBibG9iCisgKiBAbm9kZW9mZnNldDogb2Zmc2V0IG9m IHRoZSBub2RlIHdob3NlIHByb3BlcnR5IHRvIGZpbmQKKyAqIEBuYW1lOiBuYW1lIG9mIHRoZSBw cm9wZXJ0eSB0byBmaW5kCisgKiBAbmFtZWxlbjogbnVtYmVyIG9mIGNoYXJhY3RlcnMgb2YgbmFt ZSB0byBjb25zaWRlcgorICogQGxlbnA6IHBvaW50ZXIgdG8gYW4gaW50ZWdlciB2YXJpYWJsZSAo d2lsbCBiZSBvdmVyd3JpdHRlbikgb3IgTlVMTAorICoKKyAqIElkZW50aWNhbCB0byBmZHRfZ2V0 X3Byb3BlcnR5X25hbWVsZW4oKSwgYnV0IG9ubHkgZXhhbWluZSB0aGUgZmlyc3QKKyAqIG5hbWVs ZW4gY2hhcmFjdGVycyBvZiBuYW1lIGZvciBtYXRjaGluZyB0aGUgcHJvcGVydHkgbmFtZS4KKyAq LworY29uc3Qgc3RydWN0IGZkdF9wcm9wZXJ0eSAqZmR0X2dldF9wcm9wZXJ0eV9uYW1lbGVuKGNv bnN0IHZvaWQgKmZkdCwKKwkJCQkJCSAgICBpbnQgbm9kZW9mZnNldCwKKwkJCQkJCSAgICBjb25z dCBjaGFyICpuYW1lLAorCQkJCQkJICAgIGludCBuYW1lbGVuLCBpbnQgKmxlbnApOworCisvKioK KyAqIGZkdF9nZXRfcHJvcGVydHkgLSBmaW5kIGEgZ2l2ZW4gcHJvcGVydHkgaW4gYSBnaXZlbiBu b2RlCisgKiBAZmR0OiBwb2ludGVyIHRvIHRoZSBkZXZpY2UgdHJlZSBibG9iCisgKiBAbm9kZW9m ZnNldDogb2Zmc2V0IG9mIHRoZSBub2RlIHdob3NlIHByb3BlcnR5IHRvIGZpbmQKKyAqIEBuYW1l OiBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBmaW5kCisgKiBAbGVucDogcG9pbnRlciB0byBhbiBp bnRlZ2VyIHZhcmlhYmxlICh3aWxsIGJlIG92ZXJ3cml0dGVuKSBvciBOVUxMCisgKgorICogZmR0 X2dldF9wcm9wZXJ0eSgpIHJldHJpZXZlcyBhIHBvaW50ZXIgdG8gdGhlIGZkdF9wcm9wZXJ0eQor ICogc3RydWN0dXJlIHdpdGhpbiB0aGUgZGV2aWNlIHRyZWUgYmxvYiBjb3JyZXNwb25kaW5nIHRv IHRoZSBwcm9wZXJ0eQorICogbmFtZWQgJ25hbWUnIG9mIHRoZSBub2RlIGF0IG9mZnNldCBub2Rl b2Zmc2V0LiAgSWYgbGVucCBpcworICogbm9uLU5VTEwsIHRoZSBsZW5ndGggb2YgdGhlIHByb3Bl cnR5IHZhbHVlIGlzIGFsc28gcmV0dXJuZWQsIGluIHRoZQorICogaW50ZWdlciBwb2ludGVkIHRv IGJ5IGxlbnAuCisgKgorICogcmV0dXJuczoKKyAqCXBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSBy ZXByZXNlbnRpbmcgdGhlIHByb3BlcnR5CisgKgkJaWYgbGVucCBpcyBub24tTlVMTCwgKmxlbnAg Y29udGFpbnMgdGhlIGxlbmd0aCBvZiB0aGUgcHJvcGVydHkKKyAqCQl2YWx1ZSAoPj0wKQorICoJ TlVMTCwgb24gZXJyb3IKKyAqCQlpZiBsZW5wIGlzIG5vbi1OVUxMLCAqbGVucCBjb250YWlucyBh biBlcnJvciBjb2RlICg8MCk6CisgKgkJLUZEVF9FUlJfTk9URk9VTkQsIG5vZGUgZG9lcyBub3Qg aGF2ZSBuYW1lZCBwcm9wZXJ0eQorICoJCS1GRFRfRVJSX0JBRE9GRlNFVCwgbm9kZW9mZnNldCBk aWQgbm90IHBvaW50IHRvIEZEVF9CRUdJTl9OT0RFIHRhZworICoJCS1GRFRfRVJSX0JBRE1BR0lD LAorICoJCS1GRFRfRVJSX0JBRFZFUlNJT04sCisgKgkJLUZEVF9FUlJfQkFEU1RBVEUsCisgKgkJ LUZEVF9FUlJfQkFEU1RSVUNUVVJFLAorICoJCS1GRFRfRVJSX1RSVU5DQVRFRCwgc3RhbmRhcmQg bWVhbmluZ3MKKyAqLworY29uc3Qgc3RydWN0IGZkdF9wcm9wZXJ0eSAqZmR0X2dldF9wcm9wZXJ0 eShjb25zdCB2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LAorCQkJCQkgICAgY29uc3QgY2hhciAq bmFtZSwgaW50ICpsZW5wKTsKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGZkdF9wcm9wZXJ0eSAqZmR0 X2dldF9wcm9wZXJ0eV93KHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsCisJCQkJCQkgICAgICBj b25zdCBjaGFyICpuYW1lLAorCQkJCQkJICAgICAgaW50ICpsZW5wKQoreworCXJldHVybiAoc3Ry dWN0IGZkdF9wcm9wZXJ0eSAqKSh1aW50cHRyX3QpCisJCWZkdF9nZXRfcHJvcGVydHkoZmR0LCBu b2Rlb2Zmc2V0LCBuYW1lLCBsZW5wKTsKK30KKworLyoqCisgKiBmZHRfZ2V0cHJvcF9ieV9vZmZz ZXQgLSByZXRyaWV2ZSB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSBhdCBhIGdpdmVuIG9mZnNldAor ICogQGZkdDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHRyZWUgYmxvYgorICogQGZmc2V0OiBvZmZz ZXQgb2YgdGhlIHByb3BlcnR5IHRvIHJlYWQKKyAqIEBuYW1lcDogcG9pbnRlciB0byBhIHN0cmlu ZyB2YXJpYWJsZSAod2lsbCBiZSBvdmVyd3JpdHRlbikgb3IgTlVMTAorICogQGxlbnA6IHBvaW50 ZXIgdG8gYW4gaW50ZWdlciB2YXJpYWJsZSAod2lsbCBiZSBvdmVyd3JpdHRlbikgb3IgTlVMTAor ICoKKyAqIGZkdF9nZXRwcm9wX2J5X29mZnNldCgpIHJldHJpZXZlcyBhIHBvaW50ZXIgdG8gdGhl IHZhbHVlIG9mIHRoZQorICogcHJvcGVydHkgYXQgc3RydWN0dXJlIGJsb2NrIG9mZnNldCAnb2Zm c2V0JyAodGhpcyB3aWxsIGJlIGEgcG9pbnRlcgorICogdG8gd2l0aGluIHRoZSBkZXZpY2UgYmxv YiBpdHNlbGYsIG5vdCBhIGNvcHkgb2YgdGhlIHZhbHVlKS4gIElmCisgKiBsZW5wIGlzIG5vbi1O VUxMLCB0aGUgbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBhbHNvCisgKiByZXR1cm5l ZCwgaW4gdGhlIGludGVnZXIgcG9pbnRlZCB0byBieSBsZW5wLiAgSWYgbmFtZXAgaXMgbm9uLU5V TEwsCisgKiB0aGUgcHJvcGVydHkncyBuYW1uZSB3aWxsIGFsc28gYmUgcmV0dXJuZWQgaW4gdGhl IGNoYXIgKiBwb2ludGVkIHRvCisgKiBieSBuYW1lcCAodGhpcyB3aWxsIGJlIGEgcG9pbnRlciB0 byB3aXRoaW4gdGhlIGRldmljZSB0cmVlJ3Mgc3RyaW5nCisgKiBibG9jaywgbm90IGEgbmV3IGNv cHkgb2YgdGhlIG5hbWUpLgorICoKKyAqIHJldHVybnM6CisgKglwb2ludGVyIHRvIHRoZSBwcm9w ZXJ0eSdzIHZhbHVlCisgKgkJaWYgbGVucCBpcyBub24tTlVMTCwgKmxlbnAgY29udGFpbnMgdGhl IGxlbmd0aCBvZiB0aGUgcHJvcGVydHkKKyAqCQl2YWx1ZSAoPj0wKQorICoJCWlmIG5hbWVwIGlz IG5vbi1OVUxMICpuYW1lcCBjb250aWFpbnMgYSBwb2ludGVyIHRvIHRoZSBwcm9wZXJ0eQorICoJ CW5hbWUuCisgKglOVUxMLCBvbiBlcnJvcgorICoJCWlmIGxlbnAgaXMgbm9uLU5VTEwsICpsZW5w IGNvbnRhaW5zIGFuIGVycm9yIGNvZGUgKDwwKToKKyAqCQktRkRUX0VSUl9CQURPRkZTRVQsIG5v ZGVvZmZzZXQgZGlkIG5vdCBwb2ludCB0byBGRFRfUFJPUCB0YWcKKyAqCQktRkRUX0VSUl9CQURN QUdJQywKKyAqCQktRkRUX0VSUl9CQURWRVJTSU9OLAorICoJCS1GRFRfRVJSX0JBRFNUQVRFLAor ICoJCS1GRFRfRVJSX0JBRFNUUlVDVFVSRSwKKyAqCQktRkRUX0VSUl9UUlVOQ0FURUQsIHN0YW5k YXJkIG1lYW5pbmdzCisgKi8KK2NvbnN0IHZvaWQgKmZkdF9nZXRwcm9wX2J5X29mZnNldChjb25z dCB2b2lkICpmZHQsIGludCBvZmZzZXQsCisJCQkJICBjb25zdCBjaGFyICoqbmFtZXAsIGludCAq bGVucCk7CisKKy8qKgorICogZmR0X2dldHByb3BfbmFtZWxlbiAtIGdldCBwcm9wZXJ0eSB2YWx1 ZSBiYXNlZCBvbiBzdWJzdHJpbmcKKyAqIEBmZHQ6IHBvaW50ZXIgdG8gdGhlIGRldmljZSB0cmVl IGJsb2IKKyAqIEBub2Rlb2Zmc2V0OiBvZmZzZXQgb2YgdGhlIG5vZGUgd2hvc2UgcHJvcGVydHkg dG8gZmluZAorICogQG5hbWU6IG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGZpbmQKKyAqIEBuYW1l bGVuOiBudW1iZXIgb2YgY2hhcmFjdGVycyBvZiBuYW1lIHRvIGNvbnNpZGVyCisgKiBAbGVucDog cG9pbnRlciB0byBhbiBpbnRlZ2VyIHZhcmlhYmxlICh3aWxsIGJlIG92ZXJ3cml0dGVuKSBvciBO VUxMCisgKgorICogSWRlbnRpY2FsIHRvIGZkdF9nZXRwcm9wKCksIGJ1dCBvbmx5IGV4YW1pbmUg dGhlIGZpcnN0IG5hbWVsZW4KKyAqIGNoYXJhY3RlcnMgb2YgbmFtZSBmb3IgbWF0Y2hpbmcgdGhl IHByb3BlcnR5IG5hbWUuCisgKi8KK2NvbnN0IHZvaWQgKmZkdF9nZXRwcm9wX25hbWVsZW4oY29u c3Qgdm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCwKKwkJCQljb25zdCBjaGFyICpuYW1lLCBpbnQg bmFtZWxlbiwgaW50ICpsZW5wKTsKKworLyoqCisgKiBmZHRfZ2V0cHJvcCAtIHJldHJpZXZlIHRo ZSB2YWx1ZSBvZiBhIGdpdmVuIHByb3BlcnR5CisgKiBAZmR0OiBwb2ludGVyIHRvIHRoZSBkZXZp Y2UgdHJlZSBibG9iCisgKiBAbm9kZW9mZnNldDogb2Zmc2V0IG9mIHRoZSBub2RlIHdob3NlIHBy b3BlcnR5IHRvIGZpbmQKKyAqIEBuYW1lOiBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBmaW5kCisg KiBAbGVucDogcG9pbnRlciB0byBhbiBpbnRlZ2VyIHZhcmlhYmxlICh3aWxsIGJlIG92ZXJ3cml0 dGVuKSBvciBOVUxMCisgKgorICogZmR0X2dldHByb3AoKSByZXRyaWV2ZXMgYSBwb2ludGVyIHRv IHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKKyAqIG5hbWVkICduYW1lJyBvZiB0aGUgbm9kZSBh dCBvZmZzZXQgbm9kZW9mZnNldCAodGhpcyB3aWxsIGJlIGEKKyAqIHBvaW50ZXIgdG8gd2l0aGlu IHRoZSBkZXZpY2UgYmxvYiBpdHNlbGYsIG5vdCBhIGNvcHkgb2YgdGhlIHZhbHVlKS4KKyAqIElm IGxlbnAgaXMgbm9uLU5VTEwsIHRoZSBsZW5ndGggb2YgdGhlIHByb3BlcnR5IHZhbHVlIGlzIGFs c28KKyAqIHJldHVybmVkLCBpbiB0aGUgaW50ZWdlciBwb2ludGVkIHRvIGJ5IGxlbnAuCisgKgor ICogcmV0dXJuczoKKyAqCXBvaW50ZXIgdG8gdGhlIHByb3BlcnR5J3MgdmFsdWUKKyAqCQlpZiBs ZW5wIGlzIG5vbi1OVUxMLCAqbGVucCBjb250YWlucyB0aGUgbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0 eQorICoJCXZhbHVlICg+PTApCisgKglOVUxMLCBvbiBlcnJvcgorICoJCWlmIGxlbnAgaXMgbm9u LU5VTEwsICpsZW5wIGNvbnRhaW5zIGFuIGVycm9yIGNvZGUgKDwwKToKKyAqCQktRkRUX0VSUl9O T1RGT1VORCwgbm9kZSBkb2VzIG5vdCBoYXZlIG5hbWVkIHByb3BlcnR5CisgKgkJLUZEVF9FUlJf QkFET0ZGU0VULCBub2Rlb2Zmc2V0IGRpZCBub3QgcG9pbnQgdG8gRkRUX0JFR0lOX05PREUgdGFn CisgKgkJLUZEVF9FUlJfQkFETUFHSUMsCisgKgkJLUZEVF9FUlJfQkFEVkVSU0lPTiwKKyAqCQkt RkRUX0VSUl9CQURTVEFURSwKKyAqCQktRkRUX0VSUl9CQURTVFJVQ1RVUkUsCisgKgkJLUZEVF9F UlJfVFJVTkNBVEVELCBzdGFuZGFyZCBtZWFuaW5ncworICovCitjb25zdCB2b2lkICpmZHRfZ2V0 cHJvcChjb25zdCB2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LAorCQkJY29uc3QgY2hhciAqbmFt ZSwgaW50ICpsZW5wKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCAqZmR0X2dldHByb3Bfdyh2b2lkICpm ZHQsIGludCBub2Rlb2Zmc2V0LAorCQkJCSAgY29uc3QgY2hhciAqbmFtZSwgaW50ICpsZW5wKQor eworCXJldHVybiAodm9pZCAqKSh1aW50cHRyX3QpZmR0X2dldHByb3AoZmR0LCBub2Rlb2Zmc2V0 LCBuYW1lLCBsZW5wKTsKK30KKworLyoqCisgKiBmZHRfZ2V0X3BoYW5kbGUgLSByZXRyaWV2ZSB0 aGUgcGhhbmRsZSBvZiBhIGdpdmVuIG5vZGUKKyAqIEBmZHQ6IHBvaW50ZXIgdG8gdGhlIGRldmlj ZSB0cmVlIGJsb2IKKyAqIEBub2Rlb2Zmc2V0OiBzdHJ1Y3R1cmUgYmxvY2sgb2Zmc2V0IG9mIHRo ZSBub2RlCisgKgorICogZmR0X2dldF9waGFuZGxlKCkgcmV0cmlldmVzIHRoZSBwaGFuZGxlIG9m IHRoZSBkZXZpY2UgdHJlZSBub2RlIGF0CisgKiBzdHJ1Y3R1cmUgYmxvY2sgb2Zmc2V0IG5vZGVv ZmZzZXQuCisgKgorICogcmV0dXJuczoKKyAqCXRoZSBwaGFuZGxlIG9mIHRoZSBub2RlIGF0IG5v ZGVvZmZzZXQsIG9uIHN1Y2Nlc3MgKCE9IDAsICE9IC0xKQorICoJMCwgaWYgdGhlIG5vZGUgaGFz IG5vIHBoYW5kbGUsIG9yIGFub3RoZXIgZXJyb3Igb2NjdXJzCisgKi8KK3VpbnQzMl90IGZkdF9n ZXRfcGhhbmRsZShjb25zdCB2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0KTsKKworLyoqCisgKiBm ZHRfZ2V0X2FsaWFzX25hbWVsZW4gLSBnZXQgYWxpYXMgYmFzZWQgb24gc3Vic3RyaW5nCisgKiBA ZmR0OiBwb2ludGVyIHRvIHRoZSBkZXZpY2UgdHJlZSBibG9iCisgKiBAbmFtZTogbmFtZSBvZiB0 aGUgYWxpYXMgdGggbG9vayB1cAorICogQG5hbWVsZW46IG51bWJlciBvZiBjaGFyYWN0ZXJzIG9m IG5hbWUgdG8gY29uc2lkZXIKKyAqCisgKiBJZGVudGljYWwgdG8gZmR0X2dldF9hbGlhcygpLCBi dXQgb25seSBleGFtaW5lIHRoZSBmaXJzdCBuYW1lbGVuCisgKiBjaGFyYWN0ZXJzIG9mIG5hbWUg Zm9yIG1hdGNoaW5nIHRoZSBhbGlhcyBuYW1lLgorICovCitjb25zdCBjaGFyICpmZHRfZ2V0X2Fs aWFzX25hbWVsZW4oY29uc3Qgdm9pZCAqZmR0LAorCQkJCSAgY29uc3QgY2hhciAqbmFtZSwgaW50 IG5hbWVsZW4pOworCisvKioKKyAqIGZkdF9nZXRfYWxpYXMgLSByZXRyZWl2ZSB0aGUgcGF0aCBy ZWZlcmVuY2VkIGJ5IGEgZ2l2ZW4gYWxpYXMKKyAqIEBmZHQ6IHBvaW50ZXIgdG8gdGhlIGRldmlj ZSB0cmVlIGJsb2IKKyAqIEBuYW1lOiBuYW1lIG9mIHRoZSBhbGlhcyB0aCBsb29rIHVwCisgKgor ICogZmR0X2dldF9hbGlhcygpIHJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSBnaXZlbiBhbGlhcy4g IFRoYXQgaXMsIHRoZQorICogdmFsdWUgb2YgdGhlIHByb3BlcnR5IG5hbWVkICduYW1lJyBpbiB0 aGUgbm9kZSAvYWxpYXNlcy4KKyAqCisgKiByZXR1cm5zOgorICoJYSBwb2ludGVyIHRvIHRoZSBl eHBhbnNpb24gb2YgdGhlIGFsaWFzIG5hbWVkICduYW1lJywgb2YgaXQgZXhpc3RzCisgKglOVUxM LCBpZiB0aGUgZ2l2ZW4gYWxpYXMgb3IgdGhlIC9hbGlhc2VzIG5vZGUgZG9lcyBub3QgZXhpc3QK KyAqLworY29uc3QgY2hhciAqZmR0X2dldF9hbGlhcyhjb25zdCB2b2lkICpmZHQsIGNvbnN0IGNo YXIgKm5hbWUpOworCisvKioKKyAqIGZkdF9nZXRfcGF0aCAtIGRldGVybWluZSB0aGUgZnVsbCBw YXRoIG9mIGEgbm9kZQorICogQGZkdDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHRyZWUgYmxvYgor ICogQG5vZGVvZmZzZXQ6IG9mZnNldCBvZiB0aGUgbm9kZSB3aG9zZSBwYXRoIHRvIGZpbmQKKyAq IEBidWY6IGNoYXJhY3RlciBidWZmZXIgdG8gY29udGFpbiB0aGUgcmV0dXJuZWQgcGF0aCAod2ls bCBiZSBvdmVyd3JpdHRlbikKKyAqIEBidWZsZW46IHNpemUgb2YgdGhlIGNoYXJhY3RlciBidWZm ZXIgYXQgYnVmCisgKgorICogZmR0X2dldF9wYXRoKCkgY29tcHV0ZXMgdGhlIGZ1bGwgcGF0aCBv ZiB0aGUgbm9kZSBhdCBvZmZzZXQKKyAqIG5vZGVvZmZzZXQsIGFuZCByZWNvcmRzIHRoYXQgcGF0 aCBpbiB0aGUgYnVmZmVyIGF0IGJ1Zi4KKyAqCisgKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIGV4 cGVuc2l2ZSwgYXMgaXQgbXVzdCBzY2FuIHRoZSBkZXZpY2UgdHJlZQorICogc3RydWN0dXJlIGZy b20gdGhlIHN0YXJ0IHRvIG5vZGVvZmZzZXQuCisgKgorICogcmV0dXJuczoKKyAqCTAsIG9uIHN1 Y2Nlc3MKKyAqCQlidWYgY29udGFpbnMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIG5vZGUgYXQK KyAqCQlub2Rlb2Zmc2V0LCBhcyBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZy4KKyAqIAktRkRUX0VS Ul9CQURPRkZTRVQsIG5vZGVvZmZzZXQgZG9lcyBub3QgcmVmZXIgdG8gYSBCRUdJTl9OT0RFIHRh ZworICoJLUZEVF9FUlJfTk9TUEFDRSwgdGhlIHBhdGggb2YgdGhlIGdpdmVuIG5vZGUgaXMgbG9u Z2VyIHRoYW4gKGJ1ZnNpemUtMSkKKyAqCQljaGFyYWN0ZXJzIGFuZCB3aWxsIG5vdCBmaXQgaW4g dGhlIGdpdmVuIGJ1ZmZlci4KKyAqCS1GRFRfRVJSX0JBRE1BR0lDLAorICoJLUZEVF9FUlJfQkFE VkVSU0lPTiwKKyAqCS1GRFRfRVJSX0JBRFNUQVRFLAorICoJLUZEVF9FUlJfQkFEU1RSVUNUVVJF LCBzdGFuZGFyZCBtZWFuaW5ncworICovCitpbnQgZmR0X2dldF9wYXRoKGNvbnN0IHZvaWQgKmZk dCwgaW50IG5vZGVvZmZzZXQsIGNoYXIgKmJ1ZiwgaW50IGJ1Zmxlbik7CisKKy8qKgorICogZmR0 X3N1cGVybm9kZV9hdGRlcHRoX29mZnNldCAtIGZpbmQgYSBzcGVjaWZpYyBhbmNlc3RvciBvZiBh IG5vZGUKKyAqIEBmZHQ6IHBvaW50ZXIgdG8gdGhlIGRldmljZSB0cmVlIGJsb2IKKyAqIEBub2Rl b2Zmc2V0OiBvZmZzZXQgb2YgdGhlIG5vZGUgd2hvc2UgcGFyZW50IHRvIGZpbmQKKyAqIEBzdXBl cm5vZGVkZXB0aDogZGVwdGggb2YgdGhlIGFuY2VzdG9yIHRvIGZpbmQKKyAqIEBub2RlZGVwdGg6 IHBvaW50ZXIgdG8gYW4gaW50ZWdlciB2YXJpYWJsZSAod2lsbCBiZSBvdmVyd3JpdHRlbikgb3Ig TlVMTAorICoKKyAqIGZkdF9zdXBlcm5vZGVfYXRkZXB0aF9vZmZzZXQoKSBmaW5kcyBhbiBhbmNl c3RvciBvZiB0aGUgZ2l2ZW4gbm9kZQorICogYXQgYSBzcGVjaWZpYyBkZXB0aCBmcm9tIHRoZSBy b290ICh3aGVyZSB0aGUgcm9vdCBpdHNlbGYgaGFzIGRlcHRoCisgKiAwLCBpdHMgaW1tZWRpYXRl IHN1Ym5vZGVzIGRlcHRoIDEgYW5kIHNvIGZvcnRoKS4gIFNvCisgKglmZHRfc3VwZXJub2RlX2F0 ZGVwdGhfb2Zmc2V0KGZkdCwgbm9kZW9mZnNldCwgMCwgTlVMTCk7CisgKiB3aWxsIGFsd2F5cyBy ZXR1cm4gMCwgdGhlIG9mZnNldCBvZiB0aGUgcm9vdCBub2RlLiAgSWYgdGhlIG5vZGUgYXQKKyAq IG5vZGVvZmZzZXQgaGFzIGRlcHRoIEQsIHRoZW46CisgKglmZHRfc3VwZXJub2RlX2F0ZGVwdGhf b2Zmc2V0KGZkdCwgbm9kZW9mZnNldCwgRCwgTlVMTCk7CisgKiB3aWxsIHJldHVybiBub2Rlb2Zm c2V0IGl0c2VsZi4KKyAqCisgKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIGV4cGVuc2l2ZSwgYXMg aXQgbXVzdCBzY2FuIHRoZSBkZXZpY2UgdHJlZQorICogc3RydWN0dXJlIGZyb20gdGhlIHN0YXJ0 IHRvIG5vZGVvZmZzZXQuCisgKgorICogcmV0dXJuczoKKworICoJc3RydWN0dXJlIGJsb2NrIG9m ZnNldCBvZiB0aGUgbm9kZSBhdCBub2RlIG9mZnNldCdzIGFuY2VzdG9yCisgKgkJb2YgZGVwdGgg c3VwZXJub2RlZGVwdGggKD49MCksIG9uIHN1Y2Nlc3MKKyAqIAktRkRUX0VSUl9CQURPRkZTRVQs IG5vZGVvZmZzZXQgZG9lcyBub3QgcmVmZXIgdG8gYSBCRUdJTl9OT0RFIHRhZworKgktRkRUX0VS Ul9OT1RGT1VORCwgc3VwZXJub2RlZGVwdGggd2FzIGdyZWF0ZXIgdGhhbiB0aGUgZGVwdGggb2Yg bm9kZW9mZnNldAorICoJLUZEVF9FUlJfQkFETUFHSUMsCisgKgktRkRUX0VSUl9CQURWRVJTSU9O LAorICoJLUZEVF9FUlJfQkFEU1RBVEUsCisgKgktRkRUX0VSUl9CQURTVFJVQ1RVUkUsIHN0YW5k YXJkIG1lYW5pbmdzCisgKi8KK2ludCBmZHRfc3VwZXJub2RlX2F0ZGVwdGhfb2Zmc2V0KGNvbnN0 IHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsCisJCQkJIGludCBzdXBlcm5vZGVkZXB0aCwgaW50 ICpub2RlZGVwdGgpOworCisvKioKKyAqIGZkdF9ub2RlX2RlcHRoIC0gZmluZCB0aGUgZGVwdGgg b2YgYSBnaXZlbiBub2RlCisgKiBAZmR0OiBwb2ludGVyIHRvIHRoZSBkZXZpY2UgdHJlZSBibG9i CisgKiBAbm9kZW9mZnNldDogb2Zmc2V0IG9mIHRoZSBub2RlIHdob3NlIHBhcmVudCB0byBmaW5k CisgKgorICogZmR0X25vZGVfZGVwdGgoKSBmaW5kcyB0aGUgZGVwdGggb2YgYSBnaXZlbiBub2Rl LiAgVGhlIHJvb3Qgbm9kZQorICogaGFzIGRlcHRoIDAsIGl0cyBpbW1lZGlhdGUgc3Vibm9kZXMg ZGVwdGggMSBhbmQgc28gZm9ydGguCisgKgorICogTk9URTogVGhpcyBmdW5jdGlvbiBpcyBleHBl bnNpdmUsIGFzIGl0IG11c3Qgc2NhbiB0aGUgZGV2aWNlIHRyZWUKKyAqIHN0cnVjdHVyZSBmcm9t IHRoZSBzdGFydCB0byBub2Rlb2Zmc2V0LgorICoKKyAqIHJldHVybnM6CisgKglkZXB0aCBvZiB0 aGUgbm9kZSBhdCBub2Rlb2Zmc2V0ICg+PTApLCBvbiBzdWNjZXNzCisgKiAJLUZEVF9FUlJfQkFE T0ZGU0VULCBub2Rlb2Zmc2V0IGRvZXMgbm90IHJlZmVyIHRvIGEgQkVHSU5fTk9ERSB0YWcKKyAq CS1GRFRfRVJSX0JBRE1BR0lDLAorICoJLUZEVF9FUlJfQkFEVkVSU0lPTiwKKyAqCS1GRFRfRVJS X0JBRFNUQVRFLAorICoJLUZEVF9FUlJfQkFEU1RSVUNUVVJFLCBzdGFuZGFyZCBtZWFuaW5ncwor ICovCitpbnQgZmR0X25vZGVfZGVwdGgoY29uc3Qgdm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCk7 CisKKy8qKgorICogZmR0X3BhcmVudF9vZmZzZXQgLSBmaW5kIHRoZSBwYXJlbnQgb2YgYSBnaXZl biBub2RlCisgKiBAZmR0OiBwb2ludGVyIHRvIHRoZSBkZXZpY2UgdHJlZSBibG9iCisgKiBAbm9k ZW9mZnNldDogb2Zmc2V0IG9mIHRoZSBub2RlIHdob3NlIHBhcmVudCB0byBmaW5kCisgKgorICog ZmR0X3BhcmVudF9vZmZzZXQoKSBsb2NhdGVzIHRoZSBwYXJlbnQgbm9kZSBvZiBhIGdpdmVuIG5v ZGUgKHRoYXQKKyAqIGlzLCBpdCBmaW5kcyB0aGUgb2Zmc2V0IG9mIHRoZSBub2RlIHdoaWNoIGNv bnRhaW5zIHRoZSBub2RlIGF0CisgKiBub2Rlb2Zmc2V0IGFzIGEgc3Vibm9kZSkuCisgKgorICog Tk9URTogVGhpcyBmdW5jdGlvbiBpcyBleHBlbnNpdmUsIGFzIGl0IG11c3Qgc2NhbiB0aGUgZGV2 aWNlIHRyZWUKKyAqIHN0cnVjdHVyZSBmcm9tIHRoZSBzdGFydCB0byBub2Rlb2Zmc2V0LCAqdHdp Y2UqLgorICoKKyAqIHJldHVybnM6CisgKglzdHJ1Y3R1cmUgYmxvY2sgb2Zmc2V0IG9mIHRoZSBw YXJlbnQgb2YgdGhlIG5vZGUgYXQgbm9kZW9mZnNldAorICoJCSg+PTApLCBvbiBzdWNjZXNzCisg KiAJLUZEVF9FUlJfQkFET0ZGU0VULCBub2Rlb2Zmc2V0IGRvZXMgbm90IHJlZmVyIHRvIGEgQkVH SU5fTk9ERSB0YWcKKyAqCS1GRFRfRVJSX0JBRE1BR0lDLAorICoJLUZEVF9FUlJfQkFEVkVSU0lP TiwKKyAqCS1GRFRfRVJSX0JBRFNUQVRFLAorICoJLUZEVF9FUlJfQkFEU1RSVUNUVVJFLCBzdGFu ZGFyZCBtZWFuaW5ncworICovCitpbnQgZmR0X3BhcmVudF9vZmZzZXQoY29uc3Qgdm9pZCAqZmR0 LCBpbnQgbm9kZW9mZnNldCk7CisKKy8qKgorICogZmR0X25vZGVfb2Zmc2V0X2J5X3Byb3BfdmFs dWUgLSBmaW5kIG5vZGVzIHdpdGggYSBnaXZlbiBwcm9wZXJ0eSB2YWx1ZQorICogQGZkdDogcG9p bnRlciB0byB0aGUgZGV2aWNlIHRyZWUgYmxvYgorICogQHN0YXJ0b2Zmc2V0OiBvbmx5IGZpbmQg bm9kZXMgYWZ0ZXIgdGhpcyBvZmZzZXQKKyAqIEBwcm9wbmFtZTogcHJvcGVydHkgbmFtZSB0byBj aGVjaworICogQHByb3B2YWw6IHByb3BlcnR5IHZhbHVlIHRvIHNlYXJjaCBmb3IKKyAqIEBwcm9w bGVuOiBsZW5ndGggb2YgdGhlIHZhbHVlIGluIHByb3B2YWwKKyAqCisgKiBmZHRfbm9kZV9vZmZz ZXRfYnlfcHJvcF92YWx1ZSgpIHJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QKKyAqIG5v ZGUgYWZ0ZXIgc3RhcnRvZmZzZXQsIHdoaWNoIGhhcyBhIHByb3BlcnR5IG5hbWVkIHByb3BuYW1l IHdob3NlCisgKiB2YWx1ZSBpcyBvZiBsZW5ndGggcHJvcGxlbiBhbmQgaGFzIHZhbHVlIGVxdWFs IHRvIHByb3B2YWw7IG9yIGlmCisgKiBzdGFydG9mZnNldCBpcyAtMSwgdGhlIHZlcnkgZmlyc3Qg c3VjaCBub2RlIGluIHRoZSB0cmVlLgorICoKKyAqIFRvIGl0ZXJhdGUgdGhyb3VnaCBhbGwgbm9k ZXMgbWF0Y2hpbmcgdGhlIGNyaXRlcmlvbiwgdGhlIGZvbGxvd2luZworICogaWRpb20gY2FuIGJl IHVzZWQ6CisgKglvZmZzZXQgPSBmZHRfbm9kZV9vZmZzZXRfYnlfcHJvcF92YWx1ZShmZHQsIC0x LCBwcm9wbmFtZSwKKyAqCQkJCQkgICAgICAgcHJvcHZhbCwgcHJvcGxlbik7CisgKgl3aGlsZSAo b2Zmc2V0ICE9IC1GRFRfRVJSX05PVEZPVU5EKSB7CisgKgkJLy8gb3RoZXIgY29kZSBoZXJlCisg KgkJb2Zmc2V0ID0gZmR0X25vZGVfb2Zmc2V0X2J5X3Byb3BfdmFsdWUoZmR0LCBvZmZzZXQsIHBy b3BuYW1lLAorICoJCQkJCQkgICAgICAgcHJvcHZhbCwgcHJvcGxlbik7CisgKgl9CisgKgorICog Tm90ZSB0aGUgLTEgaW4gdGhlIGZpcnN0IGNhbGwgdG8gdGhlIGZ1bmN0aW9uLCBpZiAwIGlzIHVz ZWQgaGVyZQorICogaW5zdGVhZCwgdGhlIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgbG9jYXRlIHRoZSBy b290IG5vZGUsIGV2ZW4gaWYgaXQKKyAqIG1hdGNoZXMgdGhlIGNyaXRlcmlvbi4KKyAqCisgKiBy ZXR1cm5zOgorICoJc3RydWN0dXJlIGJsb2NrIG9mZnNldCBvZiB0aGUgbG9jYXRlZCBub2RlICg+ PSAwLCA+c3RhcnRvZmZzZXQpLAorICoJCSBvbiBzdWNjZXNzCisgKgktRkRUX0VSUl9OT1RGT1VO RCwgbm8gbm9kZSBtYXRjaGluZyB0aGUgY3JpdGVyaW9uIGV4aXN0cyBpbiB0aGUKKyAqCQl0cmVl IGFmdGVyIHN0YXJ0b2Zmc2V0CisgKiAJLUZEVF9FUlJfQkFET0ZGU0VULCBub2Rlb2Zmc2V0IGRv ZXMgbm90IHJlZmVyIHRvIGEgQkVHSU5fTk9ERSB0YWcKKyAqCS1GRFRfRVJSX0JBRE1BR0lDLAor ICoJLUZEVF9FUlJfQkFEVkVSU0lPTiwKKyAqCS1GRFRfRVJSX0JBRFNUQVRFLAorICoJLUZEVF9F UlJfQkFEU1RSVUNUVVJFLCBzdGFuZGFyZCBtZWFuaW5ncworICovCitpbnQgZmR0X25vZGVfb2Zm c2V0X2J5X3Byb3BfdmFsdWUoY29uc3Qgdm9pZCAqZmR0LCBpbnQgc3RhcnRvZmZzZXQsCisJCQkJ ICBjb25zdCBjaGFyICpwcm9wbmFtZSwKKwkJCQkgIGNvbnN0IHZvaWQgKnByb3B2YWwsIGludCBw cm9wbGVuKTsKKworLyoqCisgKiBmZHRfbm9kZV9vZmZzZXRfYnlfcGhhbmRsZSAtIGZpbmQgdGhl IG5vZGUgd2l0aCBhIGdpdmVuIHBoYW5kbGUKKyAqIEBmZHQ6IHBvaW50ZXIgdG8gdGhlIGRldmlj ZSB0cmVlIGJsb2IKKyAqIEBwaGFuZGxlOiBwaGFuZGxlIHZhbHVlCisgKgorICogZmR0X25vZGVf b2Zmc2V0X2J5X3BoYW5kbGUoKSByZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIG5vZGUKKyAqIHdo aWNoIGhhcyB0aGUgZ2l2ZW4gcGhhbmRsZSB2YWx1ZS4gIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBv bmUgbm9kZQorICogaW4gdGhlIHRyZWUgd2l0aCB0aGUgZ2l2ZW4gcGhhbmRsZSAoYW4gaW52YWxp ZCB0cmVlKSwgcmVzdWx0cyBhcmUKKyAqIHVuZGVmaW5lZC4KKyAqCisgKiByZXR1cm5zOgorICoJ c3RydWN0dXJlIGJsb2NrIG9mZnNldCBvZiB0aGUgbG9jYXRlZCBub2RlICg+PSAwKSwgb24gc3Vj Y2VzcworICoJLUZEVF9FUlJfTk9URk9VTkQsIG5vIG5vZGUgd2l0aCB0aGF0IHBoYW5kbGUgZXhp c3RzCisgKgktRkRUX0VSUl9CQURQSEFORExFLCBnaXZlbiBwaGFuZGxlIHZhbHVlIHdhcyBpbnZh bGlkICgwIG9yIC0xKQorICoJLUZEVF9FUlJfQkFETUFHSUMsCisgKgktRkRUX0VSUl9CQURWRVJT SU9OLAorICoJLUZEVF9FUlJfQkFEU1RBVEUsCisgKgktRkRUX0VSUl9CQURTVFJVQ1RVUkUsIHN0 YW5kYXJkIG1lYW5pbmdzCisgKi8KK2ludCBmZHRfbm9kZV9vZmZzZXRfYnlfcGhhbmRsZShjb25z dCB2b2lkICpmZHQsIHVpbnQzMl90IHBoYW5kbGUpOworCisvKioKKyAqIGZkdF9ub2RlX2NoZWNr X2NvbXBhdGlibGU6IGNoZWNrIGEgbm9kZSdzIGNvbXBhdGlibGUgcHJvcGVydHkKKyAqIEBmZHQ6 IHBvaW50ZXIgdG8gdGhlIGRldmljZSB0cmVlIGJsb2IKKyAqIEBub2Rlb2Zmc2V0OiBvZmZzZXQg b2YgYSB0cmVlIG5vZGUKKyAqIEBjb21wYXRpYmxlOiBzdHJpbmcgdG8gbWF0Y2ggYWdhaW5zdAor ICoKKyAqCisgKiBmZHRfbm9kZV9jaGVja19jb21wYXRpYmxlKCkgcmV0dXJucyAwIGlmIHRoZSBn aXZlbiBub2RlIGNvbnRhaW5zIGEKKyAqICdjb21wYXRpYmxlJyBwcm9wZXJ0eSB3aXRoIHRoZSBn aXZlbiBzdHJpbmcgYXMgb25lIG9mIGl0cyBlbGVtZW50cywKKyAqIGl0IHJldHVybnMgbm9uLXpl cm8gb3RoZXJ3aXNlLCBvciBvbiBlcnJvci4KKyAqCisgKiByZXR1cm5zOgorICoJMCwgaWYgdGhl IG5vZGUgaGFzIGEgJ2NvbXBhdGlibGUnIHByb3BlcnR5IGxpc3RpbmcgdGhlIGdpdmVuIHN0cmlu ZworICoJMSwgaWYgdGhlIG5vZGUgaGFzIGEgJ2NvbXBhdGlibGUnIHByb3BlcnR5LCBidXQgaXQg ZG9lcyBub3QgbGlzdAorICoJCXRoZSBnaXZlbiBzdHJpbmcKKyAqCS1GRFRfRVJSX05PVEZPVU5E LCBpZiB0aGUgZ2l2ZW4gbm9kZSBoYXMgbm8gJ2NvbXBhdGlibGUnIHByb3BlcnR5CisgKiAJLUZE VF9FUlJfQkFET0ZGU0VULCBpZiBub2Rlb2Zmc2V0IGRvZXMgbm90IHJlZmVyIHRvIGEgQkVHSU5f Tk9ERSB0YWcKKyAqCS1GRFRfRVJSX0JBRE1BR0lDLAorICoJLUZEVF9FUlJfQkFEVkVSU0lPTiwK KyAqCS1GRFRfRVJSX0JBRFNUQVRFLAorICoJLUZEVF9FUlJfQkFEU1RSVUNUVVJFLCBzdGFuZGFy ZCBtZWFuaW5ncworICovCitpbnQgZmR0X25vZGVfY2hlY2tfY29tcGF0aWJsZShjb25zdCB2b2lk ICpmZHQsIGludCBub2Rlb2Zmc2V0LAorCQkJICAgICAgY29uc3QgY2hhciAqY29tcGF0aWJsZSk7 CisKKy8qKgorICogZmR0X25vZGVfb2Zmc2V0X2J5X2NvbXBhdGlibGUgLSBmaW5kIG5vZGVzIHdp dGggYSBnaXZlbiAnY29tcGF0aWJsZScgdmFsdWUKKyAqIEBmZHQ6IHBvaW50ZXIgdG8gdGhlIGRl dmljZSB0cmVlIGJsb2IKKyAqIEBzdGFydG9mZnNldDogb25seSBmaW5kIG5vZGVzIGFmdGVyIHRo aXMgb2Zmc2V0CisgKiBAY29tcGF0aWJsZTogJ2NvbXBhdGlibGUnIHN0cmluZyB0byBtYXRjaCBh Z2FpbnN0CisgKgorICogZmR0X25vZGVfb2Zmc2V0X2J5X2NvbXBhdGlibGUoKSByZXR1cm5zIHRo ZSBvZmZzZXQgb2YgdGhlIGZpcnN0CisgKiBub2RlIGFmdGVyIHN0YXJ0b2Zmc2V0LCB3aGljaCBo YXMgYSAnY29tcGF0aWJsZScgcHJvcGVydHkgd2hpY2gKKyAqIGxpc3RzIHRoZSBnaXZlbiBjb21w YXRpYmxlIHN0cmluZzsgb3IgaWYgc3RhcnRvZmZzZXQgaXMgLTEsIHRoZQorICogdmVyeSBmaXJz dCBzdWNoIG5vZGUgaW4gdGhlIHRyZWUuCisgKgorICogVG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCBu b2RlcyBtYXRjaGluZyB0aGUgY3JpdGVyaW9uLCB0aGUgZm9sbG93aW5nCisgKiBpZGlvbSBjYW4g YmUgdXNlZDoKKyAqCW9mZnNldCA9IGZkdF9ub2RlX29mZnNldF9ieV9jb21wYXRpYmxlKGZkdCwg LTEsIGNvbXBhdGlibGUpOworICoJd2hpbGUgKG9mZnNldCAhPSAtRkRUX0VSUl9OT1RGT1VORCkg eworICoJCS8vIG90aGVyIGNvZGUgaGVyZQorICoJCW9mZnNldCA9IGZkdF9ub2RlX29mZnNldF9i eV9jb21wYXRpYmxlKGZkdCwgb2Zmc2V0LCBjb21wYXRpYmxlKTsKKyAqCX0KKyAqCisgKiBOb3Rl IHRoZSAtMSBpbiB0aGUgZmlyc3QgY2FsbCB0byB0aGUgZnVuY3Rpb24sIGlmIDAgaXMgdXNlZCBo ZXJlCisgKiBpbnN0ZWFkLCB0aGUgZnVuY3Rpb24gd2lsbCBuZXZlciBsb2NhdGUgdGhlIHJvb3Qg bm9kZSwgZXZlbiBpZiBpdAorICogbWF0Y2hlcyB0aGUgY3JpdGVyaW9uLgorICoKKyAqIHJldHVy bnM6CisgKglzdHJ1Y3R1cmUgYmxvY2sgb2Zmc2V0IG9mIHRoZSBsb2NhdGVkIG5vZGUgKD49IDAs ID5zdGFydG9mZnNldCksCisgKgkJIG9uIHN1Y2Nlc3MKKyAqCS1GRFRfRVJSX05PVEZPVU5ELCBu byBub2RlIG1hdGNoaW5nIHRoZSBjcml0ZXJpb24gZXhpc3RzIGluIHRoZQorICoJCXRyZWUgYWZ0 ZXIgc3RhcnRvZmZzZXQKKyAqIAktRkRUX0VSUl9CQURPRkZTRVQsIG5vZGVvZmZzZXQgZG9lcyBu b3QgcmVmZXIgdG8gYSBCRUdJTl9OT0RFIHRhZworICoJLUZEVF9FUlJfQkFETUFHSUMsCisgKgkt RkRUX0VSUl9CQURWRVJTSU9OLAorICoJLUZEVF9FUlJfQkFEU1RBVEUsCisgKgktRkRUX0VSUl9C QURTVFJVQ1RVUkUsIHN0YW5kYXJkIG1lYW5pbmdzCisgKi8KK2ludCBmZHRfbm9kZV9vZmZzZXRf YnlfY29tcGF0aWJsZShjb25zdCB2b2lkICpmZHQsIGludCBzdGFydG9mZnNldCwKKwkJCQkgIGNv bnN0IGNoYXIgKmNvbXBhdGlibGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFdyaXRlLWluLXBs YWNlIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAq LworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKiovCisKKy8qKgorICogZmR0X3NldHByb3BfaW5wbGFjZSAtIGNoYW5n ZSBhIHByb3BlcnR5J3MgdmFsdWUsIGJ1dCBub3QgaXRzIHNpemUKKyAqIEBmZHQ6IHBvaW50ZXIg dG8gdGhlIGRldmljZSB0cmVlIGJsb2IKKyAqIEBub2Rlb2Zmc2V0OiBvZmZzZXQgb2YgdGhlIG5v ZGUgd2hvc2UgcHJvcGVydHkgdG8gY2hhbmdlCisgKiBAbmFtZTogbmFtZSBvZiB0aGUgcHJvcGVy dHkgdG8gY2hhbmdlCisgKiBAdmFsOiBwb2ludGVyIHRvIGRhdGEgdG8gcmVwbGFjZSB0aGUgcHJv cGVydHkgdmFsdWUgd2l0aAorICogQGxlbjogbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZQor ICoKKyAqIGZkdF9zZXRwcm9wX2lucGxhY2UoKSByZXBsYWNlcyB0aGUgdmFsdWUgb2YgYSBnaXZl biBwcm9wZXJ0eSB3aXRoCisgKiB0aGUgZGF0YSBpbiB2YWwsIG9mIGxlbmd0aCBsZW4uICBUaGlz IGZ1bmN0aW9uIGNhbm5vdCBjaGFuZ2UgdGhlCisgKiBzaXplIG9mIGEgcHJvcGVydHksIGFuZCBz byB3aWxsIG9ubHkgd29yayBpZiBsZW4gaXMgZXF1YWwgdG8gdGhlCisgKiBjdXJyZW50IGxlbmd0 aCBvZiB0aGUgcHJvcGVydHkuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsdGVyIG9ubHkg dGhlIGJ5dGVzIGluIHRoZSBibG9iIHdoaWNoIGNvbnRhaW4KKyAqIHRoZSBnaXZlbiBwcm9wZXJ0 eSB2YWx1ZSwgYW5kIHdpbGwgbm90IGFsdGVyIG9yIG1vdmUgYW55IG90aGVyIHBhcnQKKyAqIG9m IHRoZSB0cmVlLgorICoKKyAqIHJldHVybnM6CisgKgkwLCBvbiBzdWNjZXNzCisgKgktRkRUX0VS Ul9OT1NQQUNFLCBpZiBsZW4gaXMgbm90IGVxdWFsIHRvIHRoZSBwcm9wZXJ0eSdzIGN1cnJlbnQg bGVuZ3RoCisgKgktRkRUX0VSUl9OT1RGT1VORCwgbm9kZSBkb2VzIG5vdCBoYXZlIHRoZSBuYW1l ZCBwcm9wZXJ0eQorICoJLUZEVF9FUlJfQkFET0ZGU0VULCBub2Rlb2Zmc2V0IGRpZCBub3QgcG9p bnQgdG8gRkRUX0JFR0lOX05PREUgdGFnCisgKgktRkRUX0VSUl9CQURNQUdJQywKKyAqCS1GRFRf RVJSX0JBRFZFUlNJT04sCisgKgktRkRUX0VSUl9CQURTVEFURSwKKyAqCS1GRFRfRVJSX0JBRFNU UlVDVFVSRSwKKyAqCS1GRFRfRVJSX1RSVU5DQVRFRCwgc3RhbmRhcmQgbWVhbmluZ3MKKyAqLwor aW50IGZkdF9zZXRwcm9wX2lucGxhY2Uodm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCwgY29uc3Qg Y2hhciAqbmFtZSwKKwkJCWNvbnN0IHZvaWQgKnZhbCwgaW50IGxlbik7CisKKy8qKgorICogZmR0 X3NldHByb3BfaW5wbGFjZV9jZWxsIC0gY2hhbmdlIHRoZSB2YWx1ZSBvZiBhIHNpbmdsZS1jZWxs IHByb3BlcnR5CisgKiBAZmR0OiBwb2ludGVyIHRvIHRoZSBkZXZpY2UgdHJlZSBibG9iCisgKiBA bm9kZW9mZnNldDogb2Zmc2V0IG9mIHRoZSBub2RlIHdob3NlIHByb3BlcnR5IHRvIGNoYW5nZQor ICogQG5hbWU6IG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNoYW5nZQorICogQHZhbDogY2VsbCAo MzItYml0IGludGVnZXIpIHZhbHVlIHRvIHJlcGxhY2UgdGhlIHByb3BlcnR5IHdpdGgKKyAqCisg KiBmZHRfc2V0cHJvcF9pbnBsYWNlX2NlbGwoKSByZXBsYWNlcyB0aGUgdmFsdWUgb2YgYSBnaXZl biBwcm9wZXJ0eQorICogd2l0aCB0aGUgMzItYml0IGludGVnZXIgY2VsbCB2YWx1ZSBpbiB2YWws IGNvbnZlcnRpbmcgdmFsIHRvCisgKiBiaWctZW5kaWFuIGlmIG5lY2Vzc2FyeS4gIFRoaXMgZnVu Y3Rpb24gY2Fubm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhCisgKiBwcm9wZXJ0eSwgYW5kIHNvIHdp bGwgb25seSB3b3JrIGlmIHRoZSBwcm9wZXJ0eSBhbHJlYWR5IGV4aXN0cyBhbmQKKyAqIGhhcyBs ZW5ndGggNC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWx0ZXIgb25seSB0aGUgYnl0ZXMg aW4gdGhlIGJsb2Igd2hpY2ggY29udGFpbgorICogdGhlIGdpdmVuIHByb3BlcnR5IHZhbHVlLCBh bmQgd2lsbCBub3QgYWx0ZXIgb3IgbW92ZSBhbnkgb3RoZXIgcGFydAorICogb2YgdGhlIHRyZWUu CisgKgorICogcmV0dXJuczoKKyAqCTAsIG9uIHN1Y2Nlc3MKKyAqCS1GRFRfRVJSX05PU1BBQ0Us IGlmIHRoZSBwcm9wZXJ0eSdzIGxlbmd0aCBpcyBub3QgZXF1YWwgdG8gNAorICAqCS1GRFRfRVJS X05PVEZPVU5ELCBub2RlIGRvZXMgbm90IGhhdmUgdGhlIG5hbWVkIHByb3BlcnR5CisgKgktRkRU X0VSUl9CQURPRkZTRVQsIG5vZGVvZmZzZXQgZGlkIG5vdCBwb2ludCB0byBGRFRfQkVHSU5fTk9E RSB0YWcKKyAqCS1GRFRfRVJSX0JBRE1BR0lDLAorICoJLUZEVF9FUlJfQkFEVkVSU0lPTiwKKyAq CS1GRFRfRVJSX0JBRFNUQVRFLAorICoJLUZEVF9FUlJfQkFEU1RSVUNUVVJFLAorICoJLUZEVF9F UlJfVFJVTkNBVEVELCBzdGFuZGFyZCBtZWFuaW5ncworICovCitzdGF0aWMgaW5saW5lIGludCBm ZHRfc2V0cHJvcF9pbnBsYWNlX2NlbGwodm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCwKKwkJCQkJ ICAgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgdmFsKQoreworCXZhbCA9IGNwdV90b19mZHQz Mih2YWwpOworCXJldHVybiBmZHRfc2V0cHJvcF9pbnBsYWNlKGZkdCwgbm9kZW9mZnNldCwgbmFt ZSwgJnZhbCwgc2l6ZW9mKHZhbCkpOworfQorCisvKioKKyAqIGZkdF9ub3BfcHJvcGVydHkgLSBy ZXBsYWNlIGEgcHJvcGVydHkgd2l0aCBub3AgdGFncworICogQGZkdDogcG9pbnRlciB0byB0aGUg ZGV2aWNlIHRyZWUgYmxvYgorICogQG5vZGVvZmZzZXQ6IG9mZnNldCBvZiB0aGUgbm9kZSB3aG9z ZSBwcm9wZXJ0eSB0byBub3AKKyAqIEBuYW1lOiBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBub3AK KyAqCisgKiBmZHRfbm9wX3Byb3BlcnR5KCkgd2lsbCByZXBsYWNlIGEgZ2l2ZW4gcHJvcGVydHkn cyByZXByZXNlbnRhdGlvbgorICogaW4gdGhlIGJsb2Igd2l0aCBGRFRfTk9QIHRhZ3MsIGVmZmVj dGl2ZWx5IHJlbW92aW5nIGl0IGZyb20gdGhlCisgKiB0cmVlLgorICoKKyAqIFRoaXMgZnVuY3Rp b24gd2lsbCBhbHRlciBvbmx5IHRoZSBieXRlcyBpbiB0aGUgYmxvYiB3aGljaCBjb250YWluCisg KiB0aGUgcHJvcGVydHksIGFuZCB3aWxsIG5vdCBhbHRlciBvciBtb3ZlIGFueSBvdGhlciBwYXJ0 IG9mIHRoZQorICogdHJlZS4KKyAqCisgKiByZXR1cm5zOgorICoJMCwgb24gc3VjY2VzcworICoJ LUZEVF9FUlJfTk9URk9VTkQsIG5vZGUgZG9lcyBub3QgaGF2ZSB0aGUgbmFtZWQgcHJvcGVydHkK KyAqCS1GRFRfRVJSX0JBRE9GRlNFVCwgbm9kZW9mZnNldCBkaWQgbm90IHBvaW50IHRvIEZEVF9C RUdJTl9OT0RFIHRhZworICoJLUZEVF9FUlJfQkFETUFHSUMsCisgKgktRkRUX0VSUl9CQURWRVJT SU9OLAorICoJLUZEVF9FUlJfQkFEU1RBVEUsCisgKgktRkRUX0VSUl9CQURTVFJVQ1RVUkUsCisg KgktRkRUX0VSUl9UUlVOQ0FURUQsIHN0YW5kYXJkIG1lYW5pbmdzCisgKi8KK2ludCBmZHRfbm9w X3Byb3BlcnR5KHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUpOwor CisvKioKKyAqIGZkdF9ub3Bfbm9kZSAtIHJlcGxhY2UgYSBub2RlIChzdWJ0cmVlKSB3aXRoIG5v cCB0YWdzCisgKiBAZmR0OiBwb2ludGVyIHRvIHRoZSBkZXZpY2UgdHJlZSBibG9iCisgKiBAbm9k ZW9mZnNldDogb2Zmc2V0IG9mIHRoZSBub2RlIHRvIG5vcAorICoKKyAqIGZkdF9ub3Bfbm9kZSgp IHdpbGwgcmVwbGFjZSBhIGdpdmVuIG5vZGUncyByZXByZXNlbnRhdGlvbiBpbiB0aGUKKyAqIGJs b2IsIGluY2x1ZGluZyBhbGwgaXRzIHN1Ym5vZGVzLCBpZiBhbnksIHdpdGggRkRUX05PUCB0YWdz LAorICogZWZmZWN0aXZlbHkgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgdHJlZS4KKyAqCisgKiBUaGlz IGZ1bmN0aW9uIHdpbGwgYWx0ZXIgb25seSB0aGUgYnl0ZXMgaW4gdGhlIGJsb2Igd2hpY2ggY29u dGFpbgorICogdGhlIG5vZGUgYW5kIGl0cyBwcm9wZXJ0aWVzIGFuZCBzdWJub2RlcywgYW5kIHdp bGwgbm90IGFsdGVyIG9yCisgKiBtb3ZlIGFueSBvdGhlciBwYXJ0IG9mIHRoZSB0cmVlLgorICoK KyAqIHJldHVybnM6CisgKgkwLCBvbiBzdWNjZXNzCisgKgktRkRUX0VSUl9CQURPRkZTRVQsIG5v ZGVvZmZzZXQgZGlkIG5vdCBwb2ludCB0byBGRFRfQkVHSU5fTk9ERSB0YWcKKyAqCS1GRFRfRVJS X0JBRE1BR0lDLAorICoJLUZEVF9FUlJfQkFEVkVSU0lPTiwKKyAqCS1GRFRfRVJSX0JBRFNUQVRF LAorICoJLUZEVF9FUlJfQkFEU1RSVUNUVVJFLAorICoJLUZEVF9FUlJfVFJVTkNBVEVELCBzdGFu ZGFyZCBtZWFuaW5ncworICovCitpbnQgZmR0X25vcF9ub2RlKHZvaWQgKmZkdCwgaW50IG5vZGVv ZmZzZXQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNlcXVlbnRpYWwgd3JpdGUgZnVuY3Rpb25z ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KiovCisKK2ludCBmZHRfY3JlYXRlKHZvaWQgKmJ1ZiwgaW50IGJ1ZnNpemUpOworaW50IGZkdF9h ZGRfcmVzZXJ2ZW1hcF9lbnRyeSh2b2lkICpmZHQsIHVpbnQ2NF90IGFkZHIsIHVpbnQ2NF90IHNp emUpOworaW50IGZkdF9maW5pc2hfcmVzZXJ2ZW1hcCh2b2lkICpmZHQpOworaW50IGZkdF9iZWdp bl9ub2RlKHZvaWQgKmZkdCwgY29uc3QgY2hhciAqbmFtZSk7CitpbnQgZmR0X3Byb3BlcnR5KHZv aWQgKmZkdCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsLCBpbnQgbGVuKTsKK3N0 YXRpYyBpbmxpbmUgaW50IGZkdF9wcm9wZXJ0eV9jZWxsKHZvaWQgKmZkdCwgY29uc3QgY2hhciAq bmFtZSwgdWludDMyX3QgdmFsKQoreworCXZhbCA9IGNwdV90b19mZHQzMih2YWwpOworCXJldHVy biBmZHRfcHJvcGVydHkoZmR0LCBuYW1lLCAmdmFsLCBzaXplb2YodmFsKSk7Cit9CisjZGVmaW5l IGZkdF9wcm9wZXJ0eV9zdHJpbmcoZmR0LCBuYW1lLCBzdHIpIFwKKwlmZHRfcHJvcGVydHkoZmR0 LCBuYW1lLCBzdHIsIHN0cmxlbihzdHIpKzEpCitpbnQgZmR0X2VuZF9ub2RlKHZvaWQgKmZkdCk7 CitpbnQgZmR0X2ZpbmlzaCh2b2lkICpmZHQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJlYWQt d3JpdGUgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBmZHRfb3Blbl9pbnRvKGNvbnN0IHZvaWQg KmZkdCwgdm9pZCAqYnVmLCBpbnQgYnVmc2l6ZSk7CitpbnQgZmR0X3BhY2sodm9pZCAqZmR0KTsK KworLyoqCisgKiBmZHRfYWRkX21lbV9yc3YgLSBhZGQgb25lIG1lbW9yeSByZXNlcnZlIG1hcCBl bnRyeQorICogQGZkdDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHRyZWUgYmxvYgorICogQGFkZHJl c3MsIEBzaXplOiA2NC1iaXQgdmFsdWVzIChuYXRpdmUgZW5kaWFuKQorICoKKyAqIEFkZHMgYSBy ZXNlcnZlIG1hcCBlbnRyeSB0byB0aGUgZ2l2ZW4gYmxvYiByZXNlcnZpbmcgYSByZWdpb24gYXQK KyAqIGFkZHJlc3MgYWRkcmVzcyBvZiBsZW5ndGggc2l6ZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9u IHdpbGwgaW5zZXJ0IGRhdGEgaW50byB0aGUgcmVzZXJ2ZSBtYXAgYW5kIHdpbGwKKyAqIHRoZXJl Zm9yZSBjaGFuZ2UgdGhlIGluZGV4ZXMgb2Ygc29tZSBlbnRyaWVzIGluIHRoZSB0YWJsZS4KKyAq CisgKiByZXR1cm5zOgorICoJMCwgb24gc3VjY2VzcworICoJLUZEVF9FUlJfTk9TUEFDRSwgdGhl cmUgaXMgaW5zdWZmaWNpZW50IGZyZWUgc3BhY2UgaW4gdGhlIGJsb2IgdG8KKyAqCQljb250YWlu IHRoZSBuZXcgcmVzZXJ2YXRpb24gZW50cnkKKyAqCS1GRFRfRVJSX0JBRE1BR0lDLAorICoJLUZE VF9FUlJfQkFEVkVSU0lPTiwKKyAqCS1GRFRfRVJSX0JBRFNUQVRFLAorICoJLUZEVF9FUlJfQkFE U1RSVUNUVVJFLAorICoJLUZEVF9FUlJfQkFETEFZT1VULAorICoJLUZEVF9FUlJfVFJVTkNBVEVE LCBzdGFuZGFyZCBtZWFuaW5ncworICovCitpbnQgZmR0X2FkZF9tZW1fcnN2KHZvaWQgKmZkdCwg dWludDY0X3QgYWRkcmVzcywgdWludDY0X3Qgc2l6ZSk7CisKKy8qKgorICogZmR0X2RlbF9tZW1f cnN2IC0gcmVtb3ZlIGEgbWVtb3J5IHJlc2VydmUgbWFwIGVudHJ5CisgKiBAZmR0OiBwb2ludGVy IHRvIHRoZSBkZXZpY2UgdHJlZSBibG9iCisgKiBAbjogZW50cnkgdG8gcmVtb3ZlCisgKgorICog ZmR0X2RlbF9tZW1fcnN2KCkgcmVtb3ZlcyB0aGUgbi10aCBtZW1vcnkgcmVzZXJ2ZSBtYXAgZW50 cnkgZnJvbQorICogdGhlIGJsb2IuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGRlbGV0ZSBk YXRhIGZyb20gdGhlIHJlc2VydmF0aW9uIHRhYmxlIGFuZCB3aWxsCisgKiB0aGVyZWZvcmUgY2hh bmdlIHRoZSBpbmRleGVzIG9mIHNvbWUgZW50cmllcyBpbiB0aGUgdGFibGUuCisgKgorICogcmV0 dXJuczoKKyAqCTAsIG9uIHN1Y2Nlc3MKKyAqCS1GRFRfRVJSX05PVEZPVU5ELCB0aGVyZSBpcyBu byBlbnRyeSBvZiB0aGUgZ2l2ZW4gaW5kZXggKGkuZS4gdGhlcmUKKyAqCQlhcmUgbGVzcyB0aGFu IG4rMSByZXNlcnZlIG1hcCBlbnRyaWVzKQorICoJLUZEVF9FUlJfQkFETUFHSUMsCisgKgktRkRU X0VSUl9CQURWRVJTSU9OLAorICoJLUZEVF9FUlJfQkFEU1RBVEUsCisgKgktRkRUX0VSUl9CQURT VFJVQ1RVUkUsCisgKgktRkRUX0VSUl9CQURMQVlPVVQsCisgKgktRkRUX0VSUl9UUlVOQ0FURUQs IHN0YW5kYXJkIG1lYW5pbmdzCisgKi8KK2ludCBmZHRfZGVsX21lbV9yc3Yodm9pZCAqZmR0LCBp bnQgbik7CisKKy8qKgorICogZmR0X3NldF9uYW1lIC0gY2hhbmdlIHRoZSBuYW1lIG9mIGEgZ2l2 ZW4gbm9kZQorICogQGZkdDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHRyZWUgYmxvYgorICogQG5v ZGVvZmZzZXQ6IHN0cnVjdHVyZSBibG9jayBvZmZzZXQgb2YgYSBub2RlCisgKiBAbmFtZTogbmFt ZSB0byBnaXZlIHRoZSBub2RlCisgKgorICogZmR0X3NldF9uYW1lKCkgcmVwbGFjZXMgdGhlIG5h bWUgKGluY2x1ZGluZyB1bml0IGFkZHJlc3MsIGlmIGFueSkKKyAqIG9mIHRoZSBnaXZlbiBub2Rl IHdpdGggdGhlIGdpdmVuIHN0cmluZy4gIE5PVEU6IHRoaXMgZnVuY3Rpb24gY2FuJ3QKKyAqIGVm ZmljaWVudGx5IGNoZWNrIGlmIHRoZSBuZXcgbmFtZSBpcyB1bmlxdWUgYW1vbmdzdCB0aGUgZ2l2 ZW4KKyAqIG5vZGUncyBzaWJsaW5nczsgcmVzdWx0cyBhcmUgdW5kZWZpbmVkIGlmIHRoaXMgZnVu Y3Rpb24gaXMgaW52b2tlZAorICogd2l0aCBhIG5hbWUgZXF1YWwgdG8gb25lIG9mIHRoZSBnaXZl biBub2RlJ3Mgc2libGluZ3MuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgaW5zZXJ0IG9yIGRl bGV0ZSBkYXRhIGZyb20gdGhlIGJsb2IsIGFuZCB3aWxsCisgKiB0aGVyZWZvcmUgY2hhbmdlIHRo ZSBvZmZzZXRzIG9mIHNvbWUgZXhpc3Rpbmcgbm9kZXMuCisgKgorICogcmV0dXJuczoKKyAqCTAs IG9uIHN1Y2Nlc3MKKyAqCS1GRFRfRVJSX05PU1BBQ0UsIHRoZXJlIGlzIGluc3VmZmljaWVudCBm cmVlIHNwYWNlIGluIHRoZSBibG9iCisgKgkJdG8gY29udGFpbiB0aGUgbmV3IG5hbWUKKyAqCS1G RFRfRVJSX0JBRE9GRlNFVCwgbm9kZW9mZnNldCBkaWQgbm90IHBvaW50IHRvIEZEVF9CRUdJTl9O T0RFIHRhZworICoJLUZEVF9FUlJfQkFETUFHSUMsCisgKgktRkRUX0VSUl9CQURWRVJTSU9OLAor ICoJLUZEVF9FUlJfQkFEU1RBVEUsIHN0YW5kYXJkIG1lYW5pbmdzCisgKi8KK2ludCBmZHRfc2V0 X25hbWUodm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCwgY29uc3QgY2hhciAqbmFtZSk7CisKKy8q KgorICogZmR0X3NldHByb3AgLSBjcmVhdGUgb3IgY2hhbmdlIGEgcHJvcGVydHkKKyAqIEBmZHQ6 IHBvaW50ZXIgdG8gdGhlIGRldmljZSB0cmVlIGJsb2IKKyAqIEBub2Rlb2Zmc2V0OiBvZmZzZXQg b2YgdGhlIG5vZGUgd2hvc2UgcHJvcGVydHkgdG8gY2hhbmdlCisgKiBAbmFtZTogbmFtZSBvZiB0 aGUgcHJvcGVydHkgdG8gY2hhbmdlCisgKiBAdmFsOiBwb2ludGVyIHRvIGRhdGEgdG8gc2V0IHRo ZSBwcm9wZXJ0eSB2YWx1ZSB0bworICogQGxlbjogbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSB2YWx1 ZQorICoKKyAqIGZkdF9zZXRwcm9wKCkgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIG5hbWVkIHByb3Bl cnR5IGluIHRoZSBnaXZlbgorICogbm9kZSB0byB0aGUgZ2l2ZW4gdmFsdWUgYW5kIGxlbmd0aCwg Y3JlYXRpbmcgdGhlIHByb3BlcnR5IGlmIGl0CisgKiBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0Lgor ICoKKyAqIFRoaXMgZnVuY3Rpb24gbWF5IGluc2VydCBvciBkZWxldGUgZGF0YSBmcm9tIHRoZSBi bG9iLCBhbmQgd2lsbAorICogdGhlcmVmb3JlIGNoYW5nZSB0aGUgb2Zmc2V0cyBvZiBzb21lIGV4 aXN0aW5nIG5vZGVzLgorICoKKyAqIHJldHVybnM6CisgKgkwLCBvbiBzdWNjZXNzCisgKgktRkRU X0VSUl9OT1NQQUNFLCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgZnJlZSBzcGFjZSBpbiB0aGUgYmxv YiB0bworICoJCWNvbnRhaW4gdGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZQorICoJLUZEVF9FUlJfQkFE T0ZGU0VULCBub2Rlb2Zmc2V0IGRpZCBub3QgcG9pbnQgdG8gRkRUX0JFR0lOX05PREUgdGFnCisg KgktRkRUX0VSUl9CQURMQVlPVVQsCisgKgktRkRUX0VSUl9CQURNQUdJQywKKyAqCS1GRFRfRVJS X0JBRFZFUlNJT04sCisgKgktRkRUX0VSUl9CQURTVEFURSwKKyAqCS1GRFRfRVJSX0JBRFNUUlVD VFVSRSwKKyAqCS1GRFRfRVJSX0JBRExBWU9VVCwKKyAqCS1GRFRfRVJSX1RSVU5DQVRFRCwgc3Rh bmRhcmQgbWVhbmluZ3MKKyAqLworaW50IGZkdF9zZXRwcm9wKHZvaWQgKmZkdCwgaW50IG5vZGVv ZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUsCisJCWNvbnN0IHZvaWQgKnZhbCwgaW50IGxlbik7CisK Ky8qKgorICogZmR0X3NldHByb3BfY2VsbCAtIHNldCBhIHByb3BlcnR5IHRvIGEgc2luZ2xlIGNl bGwgdmFsdWUKKyAqIEBmZHQ6IHBvaW50ZXIgdG8gdGhlIGRldmljZSB0cmVlIGJsb2IKKyAqIEBu b2Rlb2Zmc2V0OiBvZmZzZXQgb2YgdGhlIG5vZGUgd2hvc2UgcHJvcGVydHkgdG8gY2hhbmdlCisg KiBAbmFtZTogbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY2hhbmdlCisgKiBAdmFsOiAzMi1iaXQg aW50ZWdlciB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IChuYXRpdmUgZW5kaWFuKQorICoKKyAqIGZk dF9zZXRwcm9wX2NlbGwoKSBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJvcGVydHkgaW4g dGhlCisgKiBnaXZlbiBub2RlIHRvIHRoZSBnaXZlbiBjZWxsIHZhbHVlIChjb252ZXJ0aW5nIHRv IGJpZy1lbmRpYW4gaWYKKyAqIG5lY2Vzc2FyeSksIG9yIGNyZWF0ZXMgYSBuZXcgcHJvcGVydHkg d2l0aCB0aGF0IHZhbHVlIGlmIGl0IGRvZXMKKyAqIG5vdCBhbHJlYWR5IGV4aXN0LgorICoKKyAq IFRoaXMgZnVuY3Rpb24gbWF5IGluc2VydCBvciBkZWxldGUgZGF0YSBmcm9tIHRoZSBibG9iLCBh bmQgd2lsbAorICogdGhlcmVmb3JlIGNoYW5nZSB0aGUgb2Zmc2V0cyBvZiBzb21lIGV4aXN0aW5n IG5vZGVzLgorICoKKyAqIHJldHVybnM6CisgKgkwLCBvbiBzdWNjZXNzCisgKgktRkRUX0VSUl9O T1NQQUNFLCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgZnJlZSBzcGFjZSBpbiB0aGUgYmxvYiB0bwor ICoJCWNvbnRhaW4gdGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZQorICoJLUZEVF9FUlJfQkFET0ZGU0VU LCBub2Rlb2Zmc2V0IGRpZCBub3QgcG9pbnQgdG8gRkRUX0JFR0lOX05PREUgdGFnCisgKgktRkRU X0VSUl9CQURMQVlPVVQsCisgKgktRkRUX0VSUl9CQURNQUdJQywKKyAqCS1GRFRfRVJSX0JBRFZF UlNJT04sCisgKgktRkRUX0VSUl9CQURTVEFURSwKKyAqCS1GRFRfRVJSX0JBRFNUUlVDVFVSRSwK KyAqCS1GRFRfRVJSX0JBRExBWU9VVCwKKyAqCS1GRFRfRVJSX1RSVU5DQVRFRCwgc3RhbmRhcmQg bWVhbmluZ3MKKyAqLworc3RhdGljIGlubGluZSBpbnQgZmR0X3NldHByb3BfY2VsbCh2b2lkICpm ZHQsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgIHVpbnQzMl90IHZh bCkKK3sKKwl2YWwgPSBjcHVfdG9fZmR0MzIodmFsKTsKKwlyZXR1cm4gZmR0X3NldHByb3AoZmR0 LCBub2Rlb2Zmc2V0LCBuYW1lLCAmdmFsLCBzaXplb2YodmFsKSk7Cit9CisKKy8qKgorICogZmR0 X3NldHByb3Bfc3RyaW5nIC0gc2V0IGEgcHJvcGVydHkgdG8gYSBzdHJpbmcgdmFsdWUKKyAqIEBm ZHQ6IHBvaW50ZXIgdG8gdGhlIGRldmljZSB0cmVlIGJsb2IKKyAqIEBub2Rlb2Zmc2V0OiBvZmZz ZXQgb2YgdGhlIG5vZGUgd2hvc2UgcHJvcGVydHkgdG8gY2hhbmdlCisgKiBAbmFtZTogbmFtZSBv ZiB0aGUgcHJvcGVydHkgdG8gY2hhbmdlCisgKiBAc3RyOiBzdHJpbmcgdmFsdWUgZm9yIHRoZSBw cm9wZXJ0eQorICoKKyAqIGZkdF9zZXRwcm9wX3N0cmluZygpIHNldHMgdGhlIHZhbHVlIG9mIHRo ZSBuYW1lZCBwcm9wZXJ0eSBpbiB0aGUKKyAqIGdpdmVuIG5vZGUgdG8gdGhlIGdpdmVuIHN0cmlu ZyB2YWx1ZSAodXNpbmcgdGhlIGxlbmd0aCBvZiB0aGUKKyAqIHN0cmluZyB0byBkZXRlcm1pbmUg dGhlIG5ldyBsZW5ndGggb2YgdGhlIHByb3BlcnR5KSwgb3IgY3JlYXRlcyBhCisgKiBuZXcgcHJv cGVydHkgd2l0aCB0aGF0IHZhbHVlIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCisgKgor ICogVGhpcyBmdW5jdGlvbiBtYXkgaW5zZXJ0IG9yIGRlbGV0ZSBkYXRhIGZyb20gdGhlIGJsb2Is IGFuZCB3aWxsCisgKiB0aGVyZWZvcmUgY2hhbmdlIHRoZSBvZmZzZXRzIG9mIHNvbWUgZXhpc3Rp bmcgbm9kZXMuCisgKgorICogcmV0dXJuczoKKyAqCTAsIG9uIHN1Y2Nlc3MKKyAqCS1GRFRfRVJS X05PU1BBQ0UsIHRoZXJlIGlzIGluc3VmZmljaWVudCBmcmVlIHNwYWNlIGluIHRoZSBibG9iIHRv CisgKgkJY29udGFpbiB0aGUgbmV3IHByb3BlcnR5IHZhbHVlCisgKgktRkRUX0VSUl9CQURPRkZT RVQsIG5vZGVvZmZzZXQgZGlkIG5vdCBwb2ludCB0byBGRFRfQkVHSU5fTk9ERSB0YWcKKyAqCS1G RFRfRVJSX0JBRExBWU9VVCwKKyAqCS1GRFRfRVJSX0JBRE1BR0lDLAorICoJLUZEVF9FUlJfQkFE VkVSU0lPTiwKKyAqCS1GRFRfRVJSX0JBRFNUQVRFLAorICoJLUZEVF9FUlJfQkFEU1RSVUNUVVJF LAorICoJLUZEVF9FUlJfQkFETEFZT1VULAorICoJLUZEVF9FUlJfVFJVTkNBVEVELCBzdGFuZGFy ZCBtZWFuaW5ncworICovCisjZGVmaW5lIGZkdF9zZXRwcm9wX3N0cmluZyhmZHQsIG5vZGVvZmZz ZXQsIG5hbWUsIHN0cikgXAorCWZkdF9zZXRwcm9wKChmZHQpLCAobm9kZW9mZnNldCksIChuYW1l KSwgKHN0ciksIHN0cmxlbihzdHIpKzEpCisKKy8qKgorICogZmR0X2RlbHByb3AgLSBkZWxldGUg YSBwcm9wZXJ0eQorICogQGZkdDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHRyZWUgYmxvYgorICog QG5vZGVvZmZzZXQ6IG9mZnNldCBvZiB0aGUgbm9kZSB3aG9zZSBwcm9wZXJ0eSB0byBub3AKKyAq IEBuYW1lOiBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBub3AKKyAqCisgKiBmZHRfZGVsX3Byb3Bl cnR5KCkgd2lsbCBkZWxldGUgdGhlIGdpdmVuIHByb3BlcnR5LgorICoKKyAqIFRoaXMgZnVuY3Rp b24gd2lsbCBkZWxldGUgZGF0YSBmcm9tIHRoZSBibG9iLCBhbmQgd2lsbCB0aGVyZWZvcmUKKyAq IGNoYW5nZSB0aGUgb2Zmc2V0cyBvZiBzb21lIGV4aXN0aW5nIG5vZGVzLgorICoKKyAqIHJldHVy bnM6CisgKgkwLCBvbiBzdWNjZXNzCisgKgktRkRUX0VSUl9OT1RGT1VORCwgbm9kZSBkb2VzIG5v dCBoYXZlIHRoZSBuYW1lZCBwcm9wZXJ0eQorICoJLUZEVF9FUlJfQkFET0ZGU0VULCBub2Rlb2Zm c2V0IGRpZCBub3QgcG9pbnQgdG8gRkRUX0JFR0lOX05PREUgdGFnCisgKgktRkRUX0VSUl9CQURM QVlPVVQsCisgKgktRkRUX0VSUl9CQURNQUdJQywKKyAqCS1GRFRfRVJSX0JBRFZFUlNJT04sCisg KgktRkRUX0VSUl9CQURTVEFURSwKKyAqCS1GRFRfRVJSX0JBRFNUUlVDVFVSRSwKKyAqCS1GRFRf RVJSX1RSVU5DQVRFRCwgc3RhbmRhcmQgbWVhbmluZ3MKKyAqLworaW50IGZkdF9kZWxwcm9wKHZv aWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUpOworCisvKioKKyAqIGZk dF9hZGRfc3Vibm9kZV9uYW1lbGVuIC0gY3JlYXRlcyBhIG5ldyBub2RlIGJhc2VkIG9uIHN1YnN0 cmluZworICogQGZkdDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHRyZWUgYmxvYgorICogQHBhcmVu dG9mZnNldDogc3RydWN0dXJlIGJsb2NrIG9mZnNldCBvZiBhIG5vZGUKKyAqIEBuYW1lOiBuYW1l IG9mIHRoZSBzdWJub2RlIHRvIGxvY2F0ZQorICogQG5hbWVsZW46IG51bWJlciBvZiBjaGFyYWN0 ZXJzIG9mIG5hbWUgdG8gY29uc2lkZXIKKyAqCisgKiBJZGVudGljYWwgdG8gZmR0X2FkZF9zdWJu b2RlKCksIGJ1dCB1c2Ugb25seSB0aGUgZmlyc3QgbmFtZWxlbgorICogY2hhcmFjdGVycyBvZiBu YW1lIGFzIHRoZSBuYW1lIG9mIHRoZSBuZXcgbm9kZS4gIFRoaXMgaXMgdXNlZnVsIGZvcgorICog Y3JlYXRpbmcgc3Vibm9kZXMgYmFzZWQgb24gYSBwb3J0aW9uIG9mIGEgbGFyZ2VyIHN0cmluZywg c3VjaCBhcyBhCisgKiBmdWxsIHBhdGguCisgKi8KK2ludCBmZHRfYWRkX3N1Ym5vZGVfbmFtZWxl bih2b2lkICpmZHQsIGludCBwYXJlbnRvZmZzZXQsCisJCQkgICAgY29uc3QgY2hhciAqbmFtZSwg aW50IG5hbWVsZW4pOworCisvKioKKyAqIGZkdF9hZGRfc3Vibm9kZSAtIGNyZWF0ZXMgYSBuZXcg bm9kZQorICogQGZkdDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHRyZWUgYmxvYgorICogQHBhcmVu dG9mZnNldDogc3RydWN0dXJlIGJsb2NrIG9mZnNldCBvZiBhIG5vZGUKKyAqIEBuYW1lOiBuYW1l IG9mIHRoZSBzdWJub2RlIHRvIGxvY2F0ZQorICoKKyAqIGZkdF9hZGRfc3Vibm9kZSgpIGNyZWF0 ZXMgYSBuZXcgbm9kZSBhcyBhIHN1Ym5vZGUgb2YgdGhlIG5vZGUgYXQKKyAqIHN0cnVjdHVyZSBi bG9jayBvZmZzZXQgcGFyZW50b2Zmc2V0LCB3aXRoIHRoZSBnaXZlbiBuYW1lICh3aGljaAorICog c2hvdWxkIGluY2x1ZGUgdGhlIHVuaXQgYWRkcmVzcywgaWYgYW55KS4KKyAqCisgKiBUaGlzIGZ1 bmN0aW9uIHdpbGwgaW5zZXJ0IGRhdGEgaW50byB0aGUgYmxvYiwgYW5kIHdpbGwgdGhlcmVmb3Jl CisgKiBjaGFuZ2UgdGhlIG9mZnNldHMgb2Ygc29tZSBleGlzdGluZyBub2Rlcy4KKworICogcmV0 dXJuczoKKyAqCXN0cnVjdHVyZSBibG9jayBvZmZzZXQgb2YgdGhlIGNyZWF0ZWQgbm9kZWVxdWVz dGVkIHN1Ym5vZGUgKD49MCksIG9uIHN1Y2Nlc3MKKyAqCS1GRFRfRVJSX05PVEZPVU5ELCBpZiB0 aGUgcmVxdWVzdGVkIHN1Ym5vZGUgZG9lcyBub3QgZXhpc3QKKyAqCS1GRFRfRVJSX0JBRE9GRlNF VCwgaWYgcGFyZW50b2Zmc2V0IGRpZCBub3QgcG9pbnQgdG8gYW4gRkRUX0JFR0lOX05PREUgdGFn CisgKgktRkRUX0VSUl9FWElTVFMsIGlmIHRoZSBub2RlIGF0IHBhcmVudG9mZnNldCBhbHJlYWR5 IGhhcyBhIHN1Ym5vZGUgb2YKKyAqCQl0aGUgZ2l2ZW4gbmFtZQorICoJLUZEVF9FUlJfTk9TUEFD RSwgaWYgdGhlcmUgaXMgaW5zdWZmaWNpZW50IGZyZWUgc3BhY2UgaW4gdGhlCisgKgkJYmxvYiB0 byBjb250YWluIHRoZSBuZXcgbm9kZQorICoJLUZEVF9FUlJfTk9TUEFDRQorICoJLUZEVF9FUlJf QkFETEFZT1VUCisgKiAgICAgIC1GRFRfRVJSX0JBRE1BR0lDLAorICoJLUZEVF9FUlJfQkFEVkVS U0lPTiwKKyAqCS1GRFRfRVJSX0JBRFNUQVRFLAorICoJLUZEVF9FUlJfQkFEU1RSVUNUVVJFLAor ICoJLUZEVF9FUlJfVFJVTkNBVEVELCBzdGFuZGFyZCBtZWFuaW5ncy4KKyAqLworaW50IGZkdF9h ZGRfc3Vibm9kZSh2b2lkICpmZHQsIGludCBwYXJlbnRvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUp OworCisvKioKKyAqIGZkdF9kZWxfbm9kZSAtIGRlbGV0ZSBhIG5vZGUgKHN1YnRyZWUpCisgKiBA ZmR0OiBwb2ludGVyIHRvIHRoZSBkZXZpY2UgdHJlZSBibG9iCisgKiBAbm9kZW9mZnNldDogb2Zm c2V0IG9mIHRoZSBub2RlIHRvIG5vcAorICoKKyAqIGZkdF9kZWxfbm9kZSgpIHdpbGwgcmVtb3Zl IHRoZSBnaXZlbiBub2RlLCBpbmNsdWRpbmcgYWxsIGl0cworICogc3Vibm9kZXMgaWYgYW55LCBm cm9tIHRoZSBibG9iLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkZWxldGUgZGF0YSBmcm9t IHRoZSBibG9iLCBhbmQgd2lsbCB0aGVyZWZvcmUKKyAqIGNoYW5nZSB0aGUgb2Zmc2V0cyBvZiBz b21lIGV4aXN0aW5nIG5vZGVzLgorICoKKyAqIHJldHVybnM6CisgKgkwLCBvbiBzdWNjZXNzCisg KgktRkRUX0VSUl9CQURPRkZTRVQsIG5vZGVvZmZzZXQgZGlkIG5vdCBwb2ludCB0byBGRFRfQkVH SU5fTk9ERSB0YWcKKyAqCS1GRFRfRVJSX0JBRExBWU9VVCwKKyAqCS1GRFRfRVJSX0JBRE1BR0lD LAorICoJLUZEVF9FUlJfQkFEVkVSU0lPTiwKKyAqCS1GRFRfRVJSX0JBRFNUQVRFLAorICoJLUZE VF9FUlJfQkFEU1RSVUNUVVJFLAorICoJLUZEVF9FUlJfVFJVTkNBVEVELCBzdGFuZGFyZCBtZWFu aW5ncworICovCitpbnQgZmR0X2RlbF9ub2RlKHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQpOwor CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKi8KKy8qIERlYnVnZ2luZyAvIGluZm9ybWF0aW9uYWwgZnVuY3Rpb25z ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2Nv bnN0IGNoYXIgKmZkdF9zdHJlcnJvcihpbnQgZXJydmFsKTsKKworI2VuZGlmIC8qIF9MSUJGRFRf SCAqLwpkaWZmIC1wdXJOIHRydW5rL2dydWItY29yZS9saWIvZHRjL2xpYmZkdC9saWJmZHRfaW50 ZXJuYWwuaCBhcm0tdWJvb3QvZ3J1Yi1jb3JlL2xpYi9kdGMvbGliZmR0L2xpYmZkdF9pbnRlcm5h bC5oCi0tLSB0cnVuay9ncnViLWNvcmUvbGliL2R0Yy9saWJmZHQvbGliZmR0X2ludGVybmFsLmgJ MTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysrIGFybS11Ym9vdC9ncnViLWNv cmUvbGliL2R0Yy9saWJmZHQvbGliZmR0X2ludGVybmFsLmgJMjAxMi0xMS0yMCAxNjoyNjo1NC45 NTA5MjAwMDAgKzAwMDAKQEAgLTAsMCArMSw5NSBAQAorI2lmbmRlZiBfTElCRkRUX0lOVEVSTkFM X0gKKyNkZWZpbmUgX0xJQkZEVF9JTlRFUk5BTF9ICisvKgorICogbGliZmR0IC0gRmxhdCBEZXZp Y2UgVHJlZSBtYW5pcHVsYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwNiBEYXZpZCBHaWJzb24s IElCTSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBsaWJmZHQgaXMgZHVhbCBsaWNlbnNlZDogeW91IGNh biB1c2UgaXQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdQTCwgb3IgdGhlIEJT RCBsaWNlbnNlLCBhdCB5b3VyIG9wdGlvbi4KKyAqCisgKiAgYSkgVGhpcyBsaWJyYXJ5IGlzIGZy ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlm eSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFz CisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl ciB2ZXJzaW9uIDIgb2YgdGhlCisgKiAgICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBh bnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQg QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAg ICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT ZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls cy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsg aWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIElu Yy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAorICogICAgIE1BIDAyMTEw LTEzMDEgVVNBCisgKgorICogQWx0ZXJuYXRpdmVseSwKKyAqCisgKiAgYikgUmVkaXN0cmlidXRp b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdp dGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv d2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgMS4gUmVkaXN0cmli dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNv cHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n CisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5v dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAg ICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMK KyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogICAgIFRI SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAorICog ICAgIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB TlRJRVMsCisgKiAgICAgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE IFdBUlJBTlRJRVMgT0YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg UEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogICAgIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI QUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqICAgICBDT05UUklCVVRPUlMgQkUgTElBQkxF IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqICAgICBTUEVDSUFMLCBF WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICAg ICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW SUNFUzsKKyAqICAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg SU5URVJSVVBUSU9OKQorICogICAgIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G IExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogICAgIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorICogICAgIE9USEVSV0lTRSkgQVJJ U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsCisgKiAgICAg RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor I2luY2x1ZGUgPGZkdC5oPgorCisjZGVmaW5lIEZEVF9BTElHTih4LCBhKQkJKCgoeCkgKyAoYSkg LSAxKSAmIH4oKGEpIC0gMSkpCisjZGVmaW5lIEZEVF9UQUdBTElHTih4KQkJKEZEVF9BTElHTigo eCksIEZEVF9UQUdTSVpFKSkKKworI2RlZmluZSBGRFRfQ0hFQ0tfSEVBREVSKGZkdCkgXAorCXsg XAorCQlpbnQgZXJyOyBcCisJCWlmICgoZXJyID0gZmR0X2NoZWNrX2hlYWRlcihmZHQpKSAhPSAw KSBcCisJCQlyZXR1cm4gZXJyOyBcCisJfQorCitpbnQgX2ZkdF9jaGVja19ub2RlX29mZnNldChj b25zdCB2b2lkICpmZHQsIGludCBvZmZzZXQpOworaW50IF9mZHRfY2hlY2tfcHJvcF9vZmZzZXQo Y29uc3Qgdm9pZCAqZmR0LCBpbnQgb2Zmc2V0KTsKK2NvbnN0IGNoYXIgKl9mZHRfZmluZF9zdHJp bmcoY29uc3QgY2hhciAqc3RydGFiLCBpbnQgdGFic2l6ZSwgY29uc3QgY2hhciAqcyk7CitpbnQg X2ZkdF9ub2RlX2VuZF9vZmZzZXQodm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCk7CisKK3N0YXRp YyBpbmxpbmUgY29uc3Qgdm9pZCAqX2ZkdF9vZmZzZXRfcHRyKGNvbnN0IHZvaWQgKmZkdCwgaW50 IG9mZnNldCkKK3sKKwlyZXR1cm4gKGNvbnN0IGNoYXIgKilmZHQgKyBmZHRfb2ZmX2R0X3N0cnVj dChmZHQpICsgb2Zmc2V0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKl9mZHRfb2Zmc2V0X3B0 cl93KHZvaWQgKmZkdCwgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gKHZvaWQgKikodWludHB0cl90 KV9mZHRfb2Zmc2V0X3B0cihmZHQsIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3Qg c3RydWN0IGZkdF9yZXNlcnZlX2VudHJ5ICpfZmR0X21lbV9yc3YoY29uc3Qgdm9pZCAqZmR0LCBp bnQgbikKK3sKKwljb25zdCBzdHJ1Y3QgZmR0X3Jlc2VydmVfZW50cnkgKnJzdl90YWJsZSA9CisJ CShjb25zdCBzdHJ1Y3QgZmR0X3Jlc2VydmVfZW50cnkgKikKKwkJKChjb25zdCBjaGFyICopZmR0 ICsgZmR0X29mZl9tZW1fcnN2bWFwKGZkdCkpOworCisJcmV0dXJuIHJzdl90YWJsZSArIG47Cit9 CitzdGF0aWMgaW5saW5lIHN0cnVjdCBmZHRfcmVzZXJ2ZV9lbnRyeSAqX2ZkdF9tZW1fcnN2X3co dm9pZCAqZmR0LCBpbnQgbikKK3sKKwlyZXR1cm4gKHZvaWQgKikodWludHB0cl90KV9mZHRfbWVt X3JzdihmZHQsIG4pOworfQorCisjZGVmaW5lIEZEVF9TV19NQUdJQwkJKH5GRFRfTUFHSUMpCisK KyNlbmRpZiAvKiBfTElCRkRUX0lOVEVSTkFMX0ggKi8KZGlmZiAtcHVyTiB0cnVuay9ncnViLWNv cmUvbGliL2R0Yy9saWJmZHQvTWFrZWZpbGUubGliZmR0IGFybS11Ym9vdC9ncnViLWNvcmUvbGli L2R0Yy9saWJmZHQvTWFrZWZpbGUubGliZmR0Ci0tLSB0cnVuay9ncnViLWNvcmUvbGliL2R0Yy9s aWJmZHQvTWFrZWZpbGUubGliZmR0CTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAw CisrKyBhcm0tdWJvb3QvZ3J1Yi1jb3JlL2xpYi9kdGMvbGliZmR0L01ha2VmaWxlLmxpYmZkdAky MDEyLTExLTIwIDE2OjI2OjU0Ljk1MDkyMDAwMCArMDAwMApAQCAtMCwwICsxLDEwIEBACisjIE1h a2VmaWxlLmxpYmZkdAorIworIyBUaGlzIGlzIG5vdCBhIGNvbXBsZXRlIE1ha2VmaWxlIG9mIGl0 c2VsZi4gIEluc3RlYWQsIGl0IGlzIGRlc2lnbmVkIHRvCisjIGJlIGVhc2lseSBlbWJlZGRhYmxl IGludG8gb3RoZXIgc3lzdGVtcyBvZiBNYWtlZmlsZXMuCisjCitMSUJGRFRfc29uYW1lID0gbGli ZmR0LiQoU0hBUkVETElCX0VYVCkuMQorTElCRkRUX0lOQ0xVREVTID0gZmR0LmggbGliZmR0LmgK K0xJQkZEVF9WRVJTSU9OID0gdmVyc2lvbi5sZHMKK0xJQkZEVF9TUkNTID0gZmR0LmMgZmR0X3Jv LmMgZmR0X3dpcC5jIGZkdF9zdy5jIGZkdF9ydy5jIGZkdF9zdHJlcnJvci5jCitMSUJGRFRfT0JK UyA9ICQoTElCRkRUX1NSQ1M6JS5jPSUubykKZGlmZiAtcHVyTiB0cnVuay9ncnViLWNvcmUvbGli L2R0Yy9saWJmZHQvVE9ETyBhcm0tdWJvb3QvZ3J1Yi1jb3JlL2xpYi9kdGMvbGliZmR0L1RPRE8K LS0tIHRydW5rL2dydWItY29yZS9saWIvZHRjL2xpYmZkdC9UT0RPCTE5NzAtMDEtMDEgMDE6MDA6 MDAuMDAwMDAwMDAwICswMTAwCisrKyBhcm0tdWJvb3QvZ3J1Yi1jb3JlL2xpYi9kdGMvbGliZmR0 L1RPRE8JMjAxMi0xMS0yMCAxNjoyNjo1NC45NTA5MjAwMDAgKzAwMDAKQEAgLTAsMCArMSwzIEBA CistIFRyZWUgdHJhdmVyc2FsIGZ1bmN0aW9ucworLSBHcmFmdCBmdW5jdGlvbgorLSBDb21wbGV0 ZSBsaWJmZHQuaCBkb2N1bWVudGluZyBjb21tZW50cwpkaWZmIC1wdXJOIHRydW5rL2dydWItY29y ZS9saWIvZHRjL2xpYmZkdC92ZXJzaW9uLmxkcyBhcm0tdWJvb3QvZ3J1Yi1jb3JlL2xpYi9kdGMv bGliZmR0L3ZlcnNpb24ubGRzCi0tLSB0cnVuay9ncnViLWNvcmUvbGliL2R0Yy9saWJmZHQvdmVy c2lvbi5sZHMJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysrIGFybS11Ym9v dC9ncnViLWNvcmUvbGliL2R0Yy9saWJmZHQvdmVyc2lvbi5sZHMJMjAxMi0xMS0yMCAxNjoyNjo1 NC45NTA5MjAwMDAgKzAwMDAKQEAgLTAsMCArMSw1NCBAQAorTElCRkRUXzEuMiB7CisJZ2xvYmFs OgorCQlmZHRfbmV4dF9ub2RlOworCQlmZHRfY2hlY2tfaGVhZGVyOworCQlmZHRfbW92ZTsKKwkJ ZmR0X3N0cmluZzsKKwkJZmR0X251bV9tZW1fcnN2OworCQlmZHRfZ2V0X21lbV9yc3Y7CisJCWZk dF9zdWJub2RlX29mZnNldF9uYW1lbGVuOworCQlmZHRfc3Vibm9kZV9vZmZzZXQ7CisJCWZkdF9w YXRoX29mZnNldDsKKwkJZmR0X2dldF9uYW1lOworCQlmZHRfZ2V0X3Byb3BlcnR5X25hbWVsZW47 CisJCWZkdF9nZXRfcHJvcGVydHk7CisJCWZkdF9nZXRwcm9wX25hbWVsZW47CisJCWZkdF9nZXRw cm9wOworCQlmZHRfZ2V0X3BoYW5kbGU7CisJCWZkdF9nZXRfYWxpYXNfbmFtZWxlbjsKKwkJZmR0 X2dldF9hbGlhczsKKwkJZmR0X2dldF9wYXRoOworCQlmZHRfc3VwZXJub2RlX2F0ZGVwdGhfb2Zm c2V0OworCQlmZHRfbm9kZV9kZXB0aDsKKwkJZmR0X3BhcmVudF9vZmZzZXQ7CisJCWZkdF9ub2Rl X29mZnNldF9ieV9wcm9wX3ZhbHVlOworCQlmZHRfbm9kZV9vZmZzZXRfYnlfcGhhbmRsZTsKKwkJ ZmR0X25vZGVfY2hlY2tfY29tcGF0aWJsZTsKKwkJZmR0X25vZGVfb2Zmc2V0X2J5X2NvbXBhdGli bGU7CisJCWZkdF9zZXRwcm9wX2lucGxhY2U7CisJCWZkdF9ub3BfcHJvcGVydHk7CisJCWZkdF9u b3Bfbm9kZTsKKwkJZmR0X2NyZWF0ZTsKKwkJZmR0X2FkZF9yZXNlcnZlbWFwX2VudHJ5OworCQlm ZHRfZmluaXNoX3Jlc2VydmVtYXA7CisJCWZkdF9iZWdpbl9ub2RlOworCQlmZHRfcHJvcGVydHk7 CisJCWZkdF9lbmRfbm9kZTsKKwkJZmR0X2ZpbmlzaDsKKwkJZmR0X29wZW5faW50bzsKKwkJZmR0 X3BhY2s7CisJCWZkdF9hZGRfbWVtX3JzdjsKKwkJZmR0X2RlbF9tZW1fcnN2OworCQlmZHRfc2V0 X25hbWU7CisJCWZkdF9zZXRwcm9wOworCQlmZHRfZGVscHJvcDsKKwkJZmR0X2FkZF9zdWJub2Rl X25hbWVsZW47CisJCWZkdF9hZGRfc3Vibm9kZTsKKwkJZmR0X2RlbF9ub2RlOworCQlmZHRfc3Ry ZXJyb3I7CisJCWZkdF9vZmZzZXRfcHRyOworCQlmZHRfbmV4dF90YWc7CisKKwlsb2NhbDoKKwkJ KjsKK307CmRpZmYgLXB1ck4gdHJ1bmsvZ3J1Yi1jb3JlL2xpYi9kdGMvbGliZmR0LWdydWIuZGlm ZiBhcm0tdWJvb3QvZ3J1Yi1jb3JlL2xpYi9kdGMvbGliZmR0LWdydWIuZGlmZgotLS0gdHJ1bmsv Z3J1Yi1jb3JlL2xpYi9kdGMvbGliZmR0LWdydWIuZGlmZgkxOTcwLTAxLTAxIDAxOjAwOjAwLjAw MDAwMDAwMCArMDEwMAorKysgYXJtLXVib290L2dydWItY29yZS9saWIvZHRjL2xpYmZkdC1ncnVi LmRpZmYJMjAxMi0xMS0yMCAxNjoyNjo1NC45NTA5MjAwMDAgKzAwMDAKQEAgLTAsMCArMSw2MyBA QAorZGlmZiAtcHVyTiBsaWJmZHQub3JpZy9mZHRfcncuYyBsaWJmZHQvZmR0X3J3LmMKKy0tLSBs aWJmZHQub3JpZy9mZHRfcncuYwkyMDExLTA1LTA4IDIwOjQ1OjM5LjAwMDAwMDAwMCArMDEwMAor KysrIGxpYmZkdC9mZHRfcncuYwkyMDEyLTEwLTE5IDE1OjMzOjExLjA4NTUyMzE4NSArMDEwMAor QEAgLTg4LDkgKzg4LDkgQEAgc3RhdGljIGludCBfZmR0X3J3X2NoZWNrX2hlYWRlcih2b2lkICpm ZAorIAorICNkZWZpbmUgRkRUX1JXX0NIRUNLX0hFQURFUihmZHQpIFwKKyAJeyBcCistCQlpbnQg ZXJyOyBcCistCQlpZiAoKGVyciA9IF9mZHRfcndfY2hlY2tfaGVhZGVyKGZkdCkpICE9IDApIFwK Ky0JCQlyZXR1cm4gZXJyOyBcCisrCQlpbnQgbWFjcm9fZXJyOyBcCisrCQlpZiAoKG1hY3JvX2Vy ciA9IF9mZHRfcndfY2hlY2tfaGVhZGVyKGZkdCkpICE9IDApIFwKKysJCQlyZXR1cm4gbWFjcm9f ZXJyOyBcCisgCX0KKyAKKyBzdGF0aWMgaW5saW5lIGludCBfZmR0X2RhdGFfc2l6ZSh2b2lkICpm ZHQpCitkaWZmIC1wdXJOIGxpYmZkdC5vcmlnL2xpYmZkdF9lbnYuaCBsaWJmZHQvbGliZmR0X2Vu di5oCistLS0gbGliZmR0Lm9yaWcvbGliZmR0X2Vudi5oCTIwMTEtMDUtMDggMjA6NDU6MzkuMDAw MDAwMDAwICswMTAwCisrKysgbGliZmR0L2xpYmZkdF9lbnYuaAkyMDEyLTEwLTE5IDE2OjEzOjE5 LjA1MTM0NDE3MyArMDEwMAorQEAgLTQsOSArNCwyNyBAQAorICNpZm5kZWYgX0xJQkZEVF9FTlZf SAorICNkZWZpbmUgX0xJQkZEVF9FTlZfSAorIAorKyNpZm5kZWYgR1JVQl9NQUNISU5FCisrLyog VXNlZCB3aGVuIGJ1aWxkaW5nIGZvciBhbiBBTlNJIEMgcGxhdGZvcm0gKi8KKyAjaW5jbHVkZSA8 c3RkZGVmLmg+CisgI2luY2x1ZGUgPHN0ZGludC5oPgorICNpbmNsdWRlIDxzdHJpbmcuaD4KKysj ZWxzZQorKy8qIEFjaGlldmluZyB0aGUgY2FtZSBmb3IgR1JVQiAqLworKyNpbmNsdWRlIDxncnVi L21pc2MuaD4KKysjaW5jbHVkZSA8Z3J1Yi9tbS5oPgorKyNpbmNsdWRlIDxncnViL3R5cGVzLmg+ CisrdHlwZWRlZiBncnViX3NpemVfdCBzaXplX3Q7CisrdHlwZWRlZiBncnViX3VpbnQ4X3QgdWlu dDhfdDsKKyt0eXBlZGVmIGdydWJfdWludDMyX3QgdWludDMyX3Q7CisrdHlwZWRlZiBncnViX3Vp bnQ2NF90IHVpbnQ2NF90OworK3R5cGVkZWYgZ3J1Yl9hZGRyX3QgdWludHB0cl90OworKyNkZWZp bmUgbWVtY2hyIGdydWJfbWVtY2hyCisrI2RlZmluZSBzdHJsZW4gZ3J1Yl9zdHJsZW4KKysjZGVm aW5lIHN0cmNociBncnViX3N0cmNocgorKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAi LVdjYXN0LWFsaWduIgorKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdzaWduLWNv bXBhcmUiCisrI2VuZGlmCisgCisgI2RlZmluZSBfQihuKQkoKHVuc2lnbmVkIGxvbmcgbG9uZyko KHVpbnQ4X3QgKikmeClbbl0pCisgc3RhdGljIGlubGluZSB1aW50MzJfdCBmZHQzMl90b19jcHUo dWludDMyX3QgeCkKK2RpZmYgLXB1ck4gbGliZmR0Lm9yaWcvbGliZmR0X2ludGVybmFsLmggbGli ZmR0L2xpYmZkdF9pbnRlcm5hbC5oCistLS0gbGliZmR0Lm9yaWcvbGliZmR0X2ludGVybmFsLmgJ MjAxMS0wNS0wOCAyMDo0NTozOS4wMDAwMDAwMDAgKzAxMDAKKysrKyBsaWJmZHQvbGliZmR0X2lu dGVybmFsLmgJMjAxMi0xMC0xOSAxNTozMzoxMS4xMDU1MjQ3MzEgKzAxMDAKK0BAIC02MCw5ICs2 MCw5IEBACisgCisgI2RlZmluZSBGRFRfQ0hFQ0tfSEVBREVSKGZkdCkgXAorIAl7IFwKKy0JCWlu dCBlcnI7IFwKKy0JCWlmICgoZXJyID0gZmR0X2NoZWNrX2hlYWRlcihmZHQpKSAhPSAwKSBcCist CQkJcmV0dXJuIGVycjsgXAorKwkJaW50IG1hY3JvX2VycjsgXAorKwkJaWYgKChtYWNyb19lcnIg PSBmZHRfY2hlY2tfaGVhZGVyKGZkdCkpICE9IDApIFwKKysJCQlyZXR1cm4gbWFjcm9fZXJyOyBc CisgCX0KKyAKKyBpbnQgX2ZkdF9jaGVja19ub2RlX29mZnNldChjb25zdCB2b2lkICpmZHQsIGlu dCBvZmZzZXQpOwpkaWZmIC1wdXJOIHRydW5rL2dydWItY29yZS9saWIvc2V0am1wLlMgYXJtLXVi b290L2dydWItY29yZS9saWIvc2V0am1wLlMKLS0tIHRydW5rL2dydWItY29yZS9saWIvc2V0am1w LlMJMjAxMi0xMS0yMCAxNjoyMTo0NC44NjMwMzIwMDAgKzAwMDAKKysrIGFybS11Ym9vdC9ncnVi LWNvcmUvbGliL3NldGptcC5TCTIwMTItMTEtMjAgMTY6MjY6NTQuOTUwOTIwMDAwICswMDAwCkBA IC0xMSw2ICsxMSw4IEBACiAjZWxpZiBkZWZpbmVkKF9faWE2NF9fKQogI2luY2x1ZGUgIi4vaWE2 NC9zZXRqbXAuUyIKICNpbmNsdWRlICIuL2lhNjQvbG9uZ2ptcC5TIgorI2VsaWYgZGVmaW5lZChf X2FybV9fKQorI2luY2x1ZGUgIi4vYXJtL3NldGptcC5TIgogI2Vsc2UKICNlcnJvciAiVW5rbm93 biB0YXJnZXQgY3B1IHR5cGUiCiAjZW5kaWYKZGlmZiAtcHVyTiB0cnVuay9ncnViLWNvcmUvbGli L3Vib290L2RhdGV0aW1lLmMgYXJtLXVib290L2dydWItY29yZS9saWIvdWJvb3QvZGF0ZXRpbWUu YwotLS0gdHJ1bmsvZ3J1Yi1jb3JlL2xpYi91Ym9vdC9kYXRldGltZS5jCTE5NzAtMDEtMDEgMDE6 MDA6MDAuMDAwMDAwMDAwICswMTAwCisrKyBhcm0tdWJvb3QvZ3J1Yi1jb3JlL2xpYi91Ym9vdC9k YXRldGltZS5jCTIwMTItMTEtMjAgMTY6MjY6NTQuOTUwOTIwMDAwICswMDAwCkBAIC0wLDAgKzEs NDEgQEAKKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENv cHlyaWdodCAoQykgMjAxMiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICog IEdSVUIgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1v ZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg ZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24p IGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBHUlVCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJ VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNo b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UKKyAqICBhbG9uZyB3aXRoIEdSVUIuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3Jn L2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGdydWIvdHlwZXMuaD4KKyNpbmNsdWRlIDxn cnViL3N5bWJvbC5oPgorI2luY2x1ZGUgPGdydWIvdWJvb3QvdWJvb3QuaD4KKyNpbmNsdWRlIDxn cnViL2RhdGV0aW1lLmg+CisjaW5jbHVkZSA8Z3J1Yi9kbC5oPgorCitHUlVCX01PRF9MSUNFTlNF ICgiR1BMdjMrIik7CisKKy8qIE5vIHNpbXBsZSBwbGF0Zm9ybS1pbmRlcGVuZGVudCBSVEMgYWNj ZXNzIGV4aXN0cyBpbiBVLUJvb3QuICovCisKK2dydWJfZXJyX3QKK2dydWJfZ2V0X2RhdGV0aW1l IChzdHJ1Y3QgZ3J1Yl9kYXRldGltZSAqZGF0ZXRpbWUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkp KQoreworICByZXR1cm4gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfSU5WQUxJRF9DT01NQU5ELAorCQkg ICAgICJjYW5cJ3QgZ2V0IGRhdGV0aW1lIHVzaW5nIFUtQm9vdCIpOworfQorCitncnViX2Vycl90 CitncnViX3NldF9kYXRldGltZSAoc3RydWN0IGdydWJfZGF0ZXRpbWUgKiBkYXRldGltZSBfX2F0 dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9J TlZBTElEX0NPTU1BTkQsCisJCSAgICAgImNhblwndCBzZXQgZGF0ZXRpbWUgdXNpbmcgVS1Cb290 Iik7Cit9CmRpZmYgLXB1ck4gdHJ1bmsvZ3J1Yi1jb3JlL2xpYi91Ym9vdC9oYWx0LmMgYXJtLXVi b290L2dydWItY29yZS9saWIvdWJvb3QvaGFsdC5jCi0tLSB0cnVuay9ncnViLWNvcmUvbGliL3Vi b290L2hhbHQuYwkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMAorKysgYXJtLXVi b290L2dydWItY29yZS9saWIvdWJvb3QvaGFsdC5jCTIwMTItMTEtMjAgMTY6MjY6NTQuOTUwOTIw MDAwICswMDAwCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZp ZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMjAxMiAgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uLCBJbmMuCisgKgorICogIEdSVUIgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRp c3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUg U29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IK KyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBHUlVCIGlz IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0 IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg b2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP U0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0 YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIEdSVUIuICBJZiBub3QsIHNl ZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGdydWIv bWlzYy5oPgorI2luY2x1ZGUgPGdydWIvbW0uaD4KKyNpbmNsdWRlIDxncnViL2tlcm5lbC5oPgor Cit2b2lkCitncnViX2hhbHQgKHZvaWQpCit7CisgIGdydWJfbWFjaGluZV9maW5pICgpOworCisg IC8qIEp1c3Qgc3RvcCBoZXJlICovCisKKyAgd2hpbGUgKDEpOworfQpkaWZmIC1wdXJOIHRydW5r L2dydWItY29yZS9saWIvdWJvb3QvcmVib290LmMgYXJtLXVib290L2dydWItY29yZS9saWIvdWJv b3QvcmVib290LmMKLS0tIHRydW5rL2dydWItY29yZS9saWIvdWJvb3QvcmVib290LmMJMTk3MC0w MS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysrIGFybS11Ym9vdC9ncnViLWNvcmUvbGli L3Vib290L3JlYm9vdC5jCTIwMTItMTEtMjAgMTY6MjY6NTQuOTUwOTIwMDAwICswMDAwCkBAIC0w LDAgKzEsMzAgQEAKKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgor ICogIENvcHlyaWdodCAoQykgMjAxMiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisg KgorICogIEdSVUIgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k L29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh dGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBv cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBHUlVCIGlzIGRpc3RyaWJ1dGVkIGlu IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdB UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFO VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisg KiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAg WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIEdSVUIuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5n bnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGdydWIva2VybmVsLmg+CisjaW5j bHVkZSA8Z3J1Yi9taXNjLmg+CisjaW5jbHVkZSA8Z3J1Yi91Ym9vdC91Ym9vdC5oPgorCit2b2lk CitncnViX3JlYm9vdCAodm9pZCkKK3sKKyAgZ3J1Yl9tYWNoaW5lX2ZpbmkgKCk7CisKKyAgdWJv b3RfcmVzZXQgKCk7CisgIHdoaWxlICgxKTsKK30KZGlmZiAtcHVyTiB0cnVuay9ncnViLWNvcmUv bG9hZGVyL2FybS91Ym9vdC9saW51eC5jIGFybS11Ym9vdC9ncnViLWNvcmUvbG9hZGVyL2FybS91 Ym9vdC9saW51eC5jCi0tLSB0cnVuay9ncnViLWNvcmUvbG9hZGVyL2FybS91Ym9vdC9saW51eC5j CTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCisrKyBhcm0tdWJvb3QvZ3J1Yi1j b3JlL2xvYWRlci9hcm0vdWJvb3QvbGludXguYwkyMDEyLTExLTIwIDE2OjI2OjU0Ljk1MDkyMDAw MCArMDAwMApAQCAtMCwwICsxLDM3OSBAQAorLyogbGludXguYyAtIGJvb3QgTGludXggKi8KKy8q CisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAo QykgMjAxMiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIEdSVUIgaXMg ZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICog IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMg cHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZl cnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl ciB2ZXJzaW9uLgorICoKKyAqICBHUlVCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg aXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklU TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZl IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBh bG9uZyB3aXRoIEdSVUIuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2Vz Lz4uCisgKi8KKworI2luY2x1ZGUgPGdydWIvZGwuaD4KKyNpbmNsdWRlIDxncnViL2ZpbGUuaD4K KyNpbmNsdWRlIDxncnViL2xvYWRlci5oPgorI2luY2x1ZGUgPGdydWIvbW0uaD4KKyNpbmNsdWRl IDxncnViL21pc2MuaD4KKyNpbmNsdWRlIDxncnViL2NvbW1hbmQuaD4KKyNpbmNsdWRlIDxncnVi L2NhY2hlLmg+CisjaW5jbHVkZSA8Z3J1Yi9jcHUvbGludXguaD4KKyNpbmNsdWRlIDxncnViL2xp Yi9jbWRsaW5lLmg+CisjaW5jbHVkZSA8Z3J1Yi91Ym9vdC91Ym9vdC5oPgorCisjaW5jbHVkZSA8 bGliZmR0Lmg+CisKK0dSVUJfTU9EX0xJQ0VOU0UgKCJHUEx2MysiKTsKKworc3RhdGljIGdydWJf ZGxfdCBteV9tb2Q7CisKK3N0YXRpYyBncnViX2FkZHJfdCBpbml0cmRfc3RhcnQ7CitzdGF0aWMg Z3J1Yl9zaXplX3QgaW5pdHJkX2VuZDsKKworc3RhdGljIGdydWJfYWRkcl90IGxpbnV4X2FkZHI7 CitzdGF0aWMgZ3J1Yl9zaXplX3QgbGludXhfc2l6ZTsKKworc3RhdGljIGNoYXIgKmxpbnV4X2Fy Z3M7CisKK3N0YXRpYyBncnViX2FkZHJfdCBmaXJtd2FyZV9ib290X2RhdGE7CitzdGF0aWMgZ3J1 Yl9hZGRyX3QgYm9vdF9kYXRhOworc3RhdGljIGdydWJfdWludDMyX3QgbWFjaGluZV90eXBlOwor CisvKgorICogbGludXhfcHJlcGFyZV9mZHQoKToKKyAqICAgUHJlcGFyZXMgYSBsb2FkZWQgRkRU IGZvciBiZWluZyBwYXNzZWQgdG8gTGludXguCisgKiAgIE1lcmdlcyBpbiBjb21tYW5kIGxpbmUg cGFyYW1ldGVycyBhbmQgc2V0cyB1cCBpbml0cmQgYWRkcmVzc2VzLgorICovCitzdGF0aWMgZ3J1 Yl9lcnJfdAorbGludXhfcHJlcGFyZV9mZHQgKHZvaWQpCit7CisgIGludCBub2RlOworICBpbnQg cmV0dmFsOworICBpbnQgdG1wX3NpemU7CisgIHZvaWQgKnRtcF9mZHQ7CisKKyAgdG1wX3NpemUg PSBmZHRfdG90YWxzaXplICgodm9pZCAqKSBib290X2RhdGEpICsgRkRUX0FERElUSU9OQUxfRU5U UklFU19TSVpFOworICB0bXBfZmR0ID0gZ3J1Yl9tYWxsb2MgKHRtcF9zaXplKTsKKyAgaWYgKCF0 bXBfZmR0KQorICAgIHJldHVybiBHUlVCX0VSUl9PVVRfT0ZfTUVNT1JZOworCisgIGZkdF9vcGVu X2ludG8gKCh2b2lkICopIGJvb3RfZGF0YSwgdG1wX2ZkdCwgdG1wX3NpemUpOworCisgIC8qIEZp bmQgb3IgY3JlYXRlICcvY2hvc2VuJyBub2RlICovCisgIG5vZGUgPSBmZHRfc3Vibm9kZV9vZmZz ZXQgKHRtcF9mZHQsIDAsICJjaG9zZW4iKTsKKyAgaWYgKG5vZGUgPCAwKQorICAgIHsKKyAgICAg IGdydWJfcHJpbnRmICgiTm8gJ2Nob3Nlbicgbm9kZSBpbiBGRFQgLSBjcmVhdGluZy5cbiIpOwor ICAgICAgbm9kZSA9IGZkdF9hZGRfc3Vibm9kZSAodG1wX2ZkdCwgMCwgImNob3NlbiIpOworICAg ICAgaWYgKG5vZGUgPCAwKQorCWdvdG8gZmFpbHVyZTsKKyAgICB9CisKKyAgZ3J1Yl9wcmludGYg KCJsaW51eF9hcmdzOiAnJXMnXG4iLCBsaW51eF9hcmdzKTsKKworICAvKiBHZW5lcmF0ZSBhbmQg c2V0IGNvbW1hbmQgbGluZSAqLworICByZXR2YWwgPSBmZHRfc2V0cHJvcCAodG1wX2ZkdCwgbm9k ZSwgImJvb3RhcmdzIiwgbGludXhfYXJncywKKwkJCWdydWJfc3RybGVuIChsaW51eF9hcmdzKSAr IDEpOworICBpZiAocmV0dmFsKQorICAgIGdvdG8gZmFpbHVyZTsKKworICBpZiAoaW5pdHJkX3N0 YXJ0ICYmIGluaXRyZF9lbmQpCisgICAgeworICAgICAgLyoKKyAgICAgICAqIFdlJ3JlIHVzaW5n IHBoeXNpY2FsIGFkZHJlc3Nlcywgc28gZXZlbiBpZiB3ZSBoYXZlIExQQUUsIHdlJ3JlCisgICAg ICAgKiByZXN0cmljdGVkIHRvIGEgMzItYml0IGFkZHJlc3Mgc3BhY2UuCisgICAgICAgKi8KKyAg ICAgIGdydWJfdWludDMyX3QgZmR0X2luaXRyZF9zdGFydCA9IGNwdV90b19mZHQzMiAoaW5pdHJk X3N0YXJ0KTsKKyAgICAgIGdydWJfdWludDMyX3QgZmR0X2luaXRyZF9lbmQgPSBjcHVfdG9fZmR0 MzIgKGluaXRyZF9lbmQpOworCisgICAgICBncnViX2RwcmludGYgKCJsb2FkZXIiLCAiSW5pdHJk IEAgMHglMDh4LTB4JTA4eFxuIiwKKwkJICAgIGluaXRyZF9zdGFydCwgaW5pdHJkX2VuZCk7CisK KyAgICAgIHJldHZhbCA9IGZkdF9zZXRwcm9wICh0bXBfZmR0LCBub2RlLCAibGludXgsaW5pdHJk LXN0YXJ0IiwKKwkJCSAgICAmZmR0X2luaXRyZF9zdGFydCwgc2l6ZW9mIChmZHRfaW5pdHJkX3N0 YXJ0KSk7CisgICAgICBpZiAocmV0dmFsKQorCWdvdG8gZmFpbHVyZTsKKyAgICAgIHJldHZhbCA9 IGZkdF9zZXRwcm9wICh0bXBfZmR0LCBub2RlLCAibGludXgsaW5pdHJkLWVuZCIsCisJCQkgICAg JmZkdF9pbml0cmRfZW5kLCBzaXplb2YgKGZkdF9pbml0cmRfZW5kKSk7CisgICAgICBpZiAocmV0 dmFsKQorCWdvdG8gZmFpbHVyZTsKKyAgICB9CisKKyAgLyogQ29weSB1cGRhdGVkIEZEVCB0byBp dHMgbGF1bmNoIGxvY2F0aW9uICovCisgIGZkdF9tb3ZlICh0bXBfZmR0LCAodm9pZCAqKSBib290 X2RhdGEsIGZkdF90b3RhbHNpemUgKHRtcF9mZHQpKTsKKyAgZ3J1Yl9mcmVlICh0bXBfZmR0KTsK KyAgZmR0X3BhY2sgKCh2b2lkICopIGJvb3RfZGF0YSk7CisKKyAgZ3J1Yl9kcHJpbnRmICgibG9h ZGVyIiwgIkZEVCB1cGRhdGVkIGZvciBMaW51eCBib290XG4iKTsKKworICByZXR1cm4gR1JVQl9F UlJfTk9ORTsKKworZmFpbHVyZToKKyAgZ3J1Yl9mcmVlICh0bXBfZmR0KTsKKyAgcmV0dXJuIEdS VUJfRVJSX0JBRF9BUkdVTUVOVDsKK30KKworc3RhdGljIGdydWJfZXJyX3QKK2xpbnV4X2Jvb3Qg KHZvaWQpCit7CisgIGtlcm5lbF9lbnRyeV90IGxpbnV4bWFpbjsKKworICBncnViX2FyY2hfc3lu Y19jYWNoZXMgKCh2b2lkICopIGxpbnV4X2FkZHIsIGxpbnV4X3NpemUpOworCisgIGdydWJfZHBy aW50ZiAoImxvYWRlciIsICJLZXJuZWwgYXQ6IDB4JXhcbiIsIGxpbnV4X2FkZHIpOworCisgIGlm ICghYm9vdF9kYXRhKQorICAgIHsKKyAgICAgIGlmIChmaXJtd2FyZV9ib290X2RhdGEpCisJewor CSAgZ3J1Yl9wcmludGYgKCJVc2luZyBmaXJtd2FyZS1zdXBwbGllZCBib290IGRhdGEgQCAweCUw OHhcbiIsCisJCSAgICAgICBmaXJtd2FyZV9ib290X2RhdGEpOworCSAgYm9vdF9kYXRhID0gZmly bXdhcmVfYm9vdF9kYXRhOworCX0KKyAgICAgIGVsc2UKKwl7CisJICByZXR1cm4gR1JVQl9FUlJf RklMRV9OT1RfRk9VTkQ7CisJfQorICAgIH0KKworICBncnViX2RwcmludGYgKCJsb2FkZXIiLCAi Qm9vdCBkYXRhIGF0OiAweCV4XG4iLCBib290X2RhdGEpOworCisgIGlmIChmZHQzMl90b19jcHUg KCooZ3J1Yl91aW50MzJfdCAqKSAoYm9vdF9kYXRhKSkgPT0gRkRUX01BR0lDKQorICAgIHsKKyAg ICAgIGdydWJfZHByaW50ZiAoImxvYWRlciIsICJGRFQgQCAweCUwOHhcbiIsIChncnViX2FkZHJf dCkgYm9vdF9kYXRhKTsKKyAgICAgIGlmIChsaW51eF9wcmVwYXJlX2ZkdCAoKSAhPSBHUlVCX0VS Ul9OT05FKQorCXsKKwkgIGdydWJfZHByaW50ZiAoImxvYWRlciIsICJsaW51eF9wcmVwYXJlX2Zk dCgpIGZhaWxlZFxuIik7CisJICByZXR1cm4gR1JVQl9FUlJfRklMRV9OT1RfRk9VTkQ7CisJfQor ICAgIH0KKworICBncnViX2RwcmludGYgKCJsb2FkZXIiLCAiSnVtcGluZyB0byBMaW51eC4uLlxu Iik7CisKKyAgLyogQm9vdCB0aGUga2VybmVsLgorICAgKiAgIEFyZ3VtZW50cyB0byBrZXJuZWw6 CisgICAqICAgICByMCAtIDAKKyAgICogICAgIHIxIC0gbWFjaGluZSB0eXBlIChwYXNzZWQgZnJv bSBVLUJvb3QpCisgICAqICAgICByMiAtIGFkZHJlc3Mgb2YgRFRCIG9yIEFUQUcgbGlzdAorICAg Ki8KKyAgbGludXhtYWluID0gKGtlcm5lbF9lbnRyeV90KSBsaW51eF9hZGRyOworICBsaW51eG1h aW4gKDAsIG1hY2hpbmVfdHlwZSwgKHZvaWQgKikgYm9vdF9kYXRhKTsKKworICByZXR1cm4gR1JV Ql9FUlJfTk9ORTsKK30KKworLyoKKyAqIE9ubHkgc3VwcG9ydCB6SW1hZ2UsIHNvIG5vIHJlbG9j YXRpb25zIG5lY2Vzc2FyeQorICovCitzdGF0aWMgZ3J1Yl9lcnJfdAorbGludXhfbG9hZCAoY29u c3QgY2hhciAqZmlsZW5hbWUpCit7CisgIGdydWJfZmlsZV90IGZpbGU7CisgIGludCBzaXplOwor CisgIGZpbGUgPSBncnViX2ZpbGVfb3BlbiAoZmlsZW5hbWUpOworICBpZiAoIWZpbGUpCisgICAg cmV0dXJuIEdSVUJfRVJSX0ZJTEVfTk9UX0ZPVU5EOworCisgIHNpemUgPSBncnViX2ZpbGVfc2l6 ZSAoZmlsZSk7CisgIGlmIChzaXplID09IDApCisgICAgcmV0dXJuIEdSVUJfRVJSX0ZJTEVfUkVB RF9FUlJPUjsKKworICBsaW51eF9hZGRyID0gTElOVVhfQUREUkVTUzsKKyAgZ3J1Yl9kcHJpbnRm ICgibG9hZGVyIiwgIkxvYWRpbmcgTGludXggdG8gMHglMDh4XG4iLAorCQkoZ3J1Yl9hZGRyX3Qp IGxpbnV4X2FkZHIpOworCisgIGlmIChncnViX2ZpbGVfcmVhZCAoZmlsZSwgKHZvaWQgKikgbGlu dXhfYWRkciwgc2l6ZSkgIT0gc2l6ZSkKKyAgICB7CisgICAgICBncnViX3ByaW50ZiAoIktlcm5l bCByZWFkIGZhaWxlZCFcbiIpOworICAgICAgcmV0dXJuIEdSVUJfRVJSX0ZJTEVfUkVBRF9FUlJP UjsKKyAgICB9CisKKyAgaWYgKCooZ3J1Yl91aW50MzJfdCAqKSAobGludXhfYWRkciArIExJTlVY X1pJTUFHRV9PRkZTRVQpCisgICAgICAhPSBMSU5VWF9aSU1BR0VfTUFHSUMpCisgICAgeworICAg ICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9GSUxFX1RZUEUsIE5fKCJpbnZhbGlk IHpJbWFnZSIpKTsKKyAgICB9CisKKyAgbGludXhfc2l6ZSA9IHNpemU7CisKKyAgcmV0dXJuIEdS VUJfRVJSX05PTkU7Cit9CisKK3N0YXRpYyBncnViX2Vycl90CitsaW51eF91bmxvYWQgKHZvaWQp Cit7CisgIGdydWJfZGxfdW5yZWYgKG15X21vZCk7CisKKyAgZ3J1Yl9mcmVlIChsaW51eF9hcmdz KTsKKyAgbGludXhfYXJncyA9IE5VTEw7CisKKyAgaW5pdHJkX3N0YXJ0ID0gaW5pdHJkX2VuZCA9 IDA7CisKKyAgcmV0dXJuIEdSVUJfRVJSX05PTkU7Cit9CisKK3N0YXRpYyBncnViX2Vycl90Citn cnViX2NtZF9saW51eCAoZ3J1Yl9jb21tYW5kX3QgY21kIF9fYXR0cmlidXRlX18gKCh1bnVzZWQp KSwKKwkJaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IHNpemUsIHJldHZhbDsKKyAg Z3J1Yl9maWxlX3QgZmlsZTsKKyAgZ3J1Yl9kbF9yZWYgKG15X21vZCk7CisKKyAgaWYgKGFyZ2Mg PT0gMCkKKyAgICByZXR1cm4gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX0FSR1VNRU5ULCBOXygi ZmlsZW5hbWUgZXhwZWN0ZWQiKSk7CisKKyAgZmlsZSA9IGdydWJfZmlsZV9vcGVuIChhcmd2WzBd KTsKKyAgaWYgKCFmaWxlKQorICAgIGdvdG8gZmFpbDsKKworICByZXR2YWwgPSBsaW51eF9sb2Fk IChhcmd2WzBdKTsKKyAgZ3J1Yl9maWxlX2Nsb3NlIChmaWxlKTsKKyAgaWYgKHJldHZhbCAhPSBH UlVCX0VSUl9OT05FKQorICAgIGdvdG8gZmFpbDsKKworICBncnViX2xvYWRlcl9zZXQgKGxpbnV4 X2Jvb3QsIGxpbnV4X3VubG9hZCwgMSk7CisKKyAgc2l6ZSA9IGdydWJfbG9hZGVyX2NtZGxpbmVf c2l6ZSAoYXJnYywgYXJndik7CisgIGxpbnV4X2FyZ3MgPSBncnViX21hbGxvYyAoc2l6ZSArIHNp emVvZiAoTElOVVhfSU1BR0UpKTsKKyAgaWYgKCFsaW51eF9hcmdzKQorICAgIGdvdG8gZmFpbDsK KworICAvKiBDcmVhdGUga2VybmVsIGNvbW1hbmQgbGluZS4gICovCisgIGdydWJfbWVtY3B5IChs aW51eF9hcmdzLCBMSU5VWF9JTUFHRSwgc2l6ZW9mIChMSU5VWF9JTUFHRSkpOworICBncnViX2Ny ZWF0ZV9sb2FkZXJfY21kbGluZSAoYXJnYywgYXJndiwKKwkJCSAgICAgIGxpbnV4X2FyZ3MgKyBz aXplb2YgKExJTlVYX0lNQUdFKSAtIDEsIHNpemUpOworCisgIHJldHVybiBHUlVCX0VSUl9OT05F OworCitmYWlsOgorICBncnViX2RsX3VucmVmIChteV9tb2QpOworICByZXR1cm4gZ3J1Yl9lcnJu bzsKK30KKworc3RhdGljIGdydWJfZXJyX3QKK2dydWJfY21kX2luaXRyZCAoZ3J1Yl9jb21tYW5k X3QgY21kIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJIGludCBhcmdjLCBjaGFyICphcmd2 W10pCit7CisgIGdydWJfZmlsZV90IGZpbGU7CisgIGludCBzaXplOworCisgIGlmIChhcmdjID09 IDApCisgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9BUkdVTUVOVCwgTl8oImZp bGVuYW1lIGV4cGVjdGVkIikpOworCisgIGZpbGUgPSBncnViX2ZpbGVfb3BlbiAoYXJndlswXSk7 CisgIGlmICghZmlsZSkKKyAgICByZXR1cm4gZ3J1Yl9lcnJubzsKKworICBzaXplID0gZ3J1Yl9m aWxlX3NpemUgKGZpbGUpOworICBpZiAoc2l6ZSA9PSAwKQorICAgIGdvdG8gZmFpbDsKKworICBp bml0cmRfc3RhcnQgPSBMSU5VWF9JTklUUkRfQUREUkVTUzsKKyAgZ3J1Yl9kcHJpbnRmICgibG9h ZGVyIiwgIkxvYWRpbmcgaW5pdHJkIHRvIDB4JTA4eFxuIiwKKwkJKGdydWJfYWRkcl90KSBpbml0 cmRfc3RhcnQpOworCisgIGlmIChncnViX2ZpbGVfcmVhZCAoZmlsZSwgKHZvaWQgKikgaW5pdHJk X3N0YXJ0LCBzaXplKSAhPSBzaXplKQorICAgIGdvdG8gZmFpbDsKKworICBpbml0cmRfZW5kID0g aW5pdHJkX3N0YXJ0ICsgc2l6ZTsKKworICByZXR1cm4gR1JVQl9FUlJfTk9ORTsKKworZmFpbDoK KyAgZ3J1Yl9maWxlX2Nsb3NlIChmaWxlKTsKKworICByZXR1cm4gZ3J1Yl9lcnJubzsKK30KKwor c3RhdGljIHZvaWQgKgorbG9hZF9kdGIgKGNvbnN0IGNoYXIgKnBhdGgpCit7CisgIGdydWJfZmls ZV90IGR0YjsKKyAgaW50IHNpemU7CisgIHZvaWQgKmZkdCA9IE5VTEw7CisKKyAgZHRiID0gZ3J1 Yl9maWxlX29wZW4gKHBhdGgpOworICBpZiAoIWR0YikKKyAgICByZXR1cm4gTlVMTDsKKworICBz aXplID0gZ3J1Yl9maWxlX3NpemUgKGR0Yik7CisgIGlmIChzaXplID09IDApCisgICAgZ290byBv dXQ7CisKKyAgZmR0ID0gZ3J1Yl9tYWxsb2MgKHNpemUpOworICBpZiAoIWZkdCkKKyAgICBnb3Rv IG91dDsKKworICBpZiAoZ3J1Yl9maWxlX3JlYWQgKGR0YiwgZmR0LCBzaXplKSAhPSBzaXplKQor ICAgIHsKKyAgICAgIGdydWJfZnJlZSAoZmR0KTsKKyAgICAgIGZkdCA9IE5VTEw7CisgICAgICBn b3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGZkdF9jaGVja19oZWFkZXIgKGZkdCkgIT0gMCkKKyAg ICB7CisgICAgICBncnViX2ZyZWUgKGZkdCk7CisgICAgICBmZHQgPSBOVUxMOworICAgIH0KKwor b3V0OgorICBncnViX2ZpbGVfY2xvc2UgKGR0Yik7CisKKyAgcmV0dXJuIGZkdDsKK30KKworc3Rh dGljIGdydWJfZXJyX3QKK2dydWJfY21kX2RldmljZXRyZWUgKGdydWJfY29tbWFuZF90IGNtZCBf X2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCSAgICAgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkK K3sKKyAgdm9pZCAqYmxvYjsKKworICBpZiAoYXJnYyAhPSAxKQorICAgIHJldHVybiBncnViX2Vy cm9yIChHUlVCX0VSUl9CQURfQVJHVU1FTlQsIE5fKCJmaWxlbmFtZSBleHBlY3RlZCIpKTsKKwor ICBibG9iID0gbG9hZF9kdGIgKGFyZ3ZbMF0pOworICBpZiAoIWJsb2IpCisgICAgcmV0dXJuIEdS VUJfRVJSX0ZJTEVfTk9UX0ZPVU5EOworCisgIGJvb3RfZGF0YSA9IExJTlVYX0ZEVF9BRERSRVNT OworICBncnViX2RwcmludGYgKCJsb2FkZXIiLCAiTG9hZGluZyBkZXZpY2UgdHJlZSB0byAweCUw OHhcbiIsCisJCShncnViX2FkZHJfdCkgYm9vdF9kYXRhKTsKKyAgZmR0X21vdmUgKGJsb2IsICh2 b2lkICopIGJvb3RfZGF0YSwgZmR0X3RvdGFsc2l6ZSAoYmxvYikpOworICBncnViX2ZyZWUgKGJs b2IpOworCisgIHJldHVybiBHUlVCX0VSUl9OT05FOworfQorCitzdGF0aWMgZ3J1Yl9jb21tYW5k X3QgY21kX2xpbnV4LCBjbWRfaW5pdHJkLCBjbWRfZGV2aWNldHJlZTsKKworR1JVQl9NT0RfSU5J VCAobGludXgpCit7CisgIGNtZF9saW51eCA9IGdydWJfcmVnaXN0ZXJfY29tbWFuZCAoImxpbnV4 IiwgZ3J1Yl9jbWRfbGludXgsCisJCQkJICAgICAwLCBOXygiTG9hZCBMaW51eC4iKSk7CisgIGNt ZF9pbml0cmQgPSBncnViX3JlZ2lzdGVyX2NvbW1hbmQgKCJpbml0cmQiLCBncnViX2NtZF9pbml0 cmQsCisJCQkJICAgICAgMCwgTl8oIkxvYWQgaW5pdHJkLiIpKTsKKyAgY21kX2RldmljZXRyZWUg PSBncnViX3JlZ2lzdGVyX2NvbW1hbmQgKCJkZXZpY2V0cmVlIiwgZ3J1Yl9jbWRfZGV2aWNldHJl ZSwKKwkJCQkJICAwLCBOXygiTG9hZCBEVEIgZmlsZS4iKSk7CisgIG15X21vZCA9IG1vZDsKKyAg ZmlybXdhcmVfYm9vdF9kYXRhID0gdWJvb3RfZ2V0X2Jvb3RfZGF0YSAoKTsKKworICBib290X2Rh dGEgPSAoZ3J1Yl9hZGRyX3QpIE5VTEw7CisgIG1hY2hpbmVfdHlwZSA9IHVib290X2dldF9tYWNo aW5lX3R5cGUgKCk7Cit9CisKK0dSVUJfTU9EX0ZJTkkgKGxpbnV4KQoreworICBncnViX3VucmVn aXN0ZXJfY29tbWFuZCAoY21kX2xpbnV4KTsKKyAgZ3J1Yl91bnJlZ2lzdGVyX2NvbW1hbmQgKGNt ZF9pbml0cmQpOworICBncnViX3VucmVnaXN0ZXJfY29tbWFuZCAoY21kX2RldmljZXRyZWUpOwor fQpkaWZmIC1wdXJOIHRydW5rL2dydWItY29yZS9NYWtlZmlsZS5hbSBhcm0tdWJvb3QvZ3J1Yi1j b3JlL01ha2VmaWxlLmFtCi0tLSB0cnVuay9ncnViLWNvcmUvTWFrZWZpbGUuYW0JMjAxMi0xMS0y MCAxNjoyMTo0NC44NjMwMzIwMDAgKzAwMDAKKysrIGFybS11Ym9vdC9ncnViLWNvcmUvTWFrZWZp bGUuYW0JMjAxMi0xMS0yMCAxNjoyNjo1NC45NTA5MjAwMDAgKzAwMDAKQEAgLTE0Myw2ICsxNDMs MTEgQEAgS0VSTkVMX0hFQURFUl9GSUxFUyArPSAkKHRvcF9zcmNkaXIpL2luYwogS0VSTkVMX0hF QURFUl9GSUxFUyArPSAkKHRvcF9zcmNkaXIpL2luY2x1ZGUvZ3J1Yi9lZmkvZGlzay5oCiBlbmRp ZgogCitpZiBDT05EX2FybV91Ym9vdAorS0VSTkVMX0hFQURFUl9GSUxFUyArPSAkKHRvcF9zcmNk aXIpL2luY2x1ZGUvZ3J1Yi91Ym9vdC91Ym9vdC5oCitLRVJORUxfSEVBREVSX0ZJTEVTICs9ICQo dG9wX3NyY2RpcikvaW5jbHVkZS9ncnViL3Vib290L2Rpc2suaAorZW5kaWYKKwogaWYgQ09ORF9t aXBzCiBLRVJORUxfSEVBREVSX0ZJTEVTICs9ICQodG9wX2J1aWxkZGlyKS9pbmNsdWRlL2dydWIv Y3B1L2tlcm5lbC5oCiBlbmRpZgpkaWZmIC1wdXJOIHRydW5rL2dydWItY29yZS9NYWtlZmlsZS5j b3JlLmRlZiBhcm0tdWJvb3QvZ3J1Yi1jb3JlL01ha2VmaWxlLmNvcmUuZGVmCi0tLSB0cnVuay9n cnViLWNvcmUvTWFrZWZpbGUuY29yZS5kZWYJMjAxMi0xMS0yMCAxNjoyMTo0NC44NjMwMzIwMDAg KzAwMDAKKysrIGFybS11Ym9vdC9ncnViLWNvcmUvTWFrZWZpbGUuY29yZS5kZWYJMjAxMi0xMS0y MCAxNjoyNjo1NC45NTA5MjAwMDAgKzAwMDAKQEAgLTY3LDYgKzY3LDkgQEAga2VybmVsID0gewog ICBlbXVfY2ZsYWdzID0gJyQoQ0ZMQUdTX0dOVUxJQiknOwogICBlbXVfY3BwZmxhZ3MgPSAnJChD UFBGTEFHU19HTlVMSUIpJzsKIAorICBhcm1fdWJvb3RfbGRmbGFncyAgICAgICA9ICctV2wsLVR0 ZXh0PTB4MDgwMDAwMDAnOworICBhcm1fdWJvb3Rfc3RyaXBmbGFncyAgICA9ICctLXN0cmlwLXVu bmVlZGVkIC1LIHN0YXJ0IC1SIC5ub3RlIC1SIC5jb21tZW50IC1SIC5ub3RlLmdudS5nb2xkLXZl cnNpb24nOworCiAgIGkzODZfcGNfc3RhcnR1cCA9IGtlcm4vaTM4Ni9wYy9zdGFydHVwLlM7CiAg IGkzODZfZWZpX3N0YXJ0dXAgPSBrZXJuL2kzODYvZWZpL3N0YXJ0dXAuUzsKICAgeDg2XzY0X2Vm aV9zdGFydHVwID0ga2Vybi94ODZfNjQvZWZpL3N0YXJ0dXAuUzsKQEAgLTc3LDYgKzgwLDcgQEAg a2VybmVsID0gewogICBtaXBzX3N0YXJ0dXAgPSBrZXJuL21pcHMvc3RhcnR1cC5TOwogICBzcGFy YzY0X2llZWUxMjc1X3N0YXJ0dXAgPSBrZXJuL3NwYXJjNjQvaWVlZTEyNzUvY3J0MC5TOwogICBw b3dlcnBjX2llZWUxMjc1X3N0YXJ0dXAgPSBrZXJuL3Bvd2VycGMvaWVlZTEyNzUvc3RhcnR1cC5T OworICBhcm1fdWJvb3Rfc3RhcnR1cCA9IGtlcm4vYXJtL3Vib290L3N0YXJ0dXAuUzsKIAogICBj b21tb24gPSBrZXJuL2NvbW1hbmQuYzsKICAgY29tbW9uID0ga2Vybi9jb3JlY21kLmM7CkBAIC0x OTksNiArMjAzLDE1IEBAIGtlcm5lbCA9IHsKICAgc3BhcmM2NF9pZWVlMTI3NSA9IGtlcm4vc3Bh cmM2NC9kbC5jOwogICBzcGFyYzY0X2llZWUxMjc1ID0ga2Vybi9zcGFyYzY0L2llZWUxMjc1L2ll ZWUxMjc1LmM7CiAKKyAgdWJvb3QgPSBkaXNrL3Vib290L3Vib290ZGlzay5jOworICB1Ym9vdCA9 IGtlcm4vdWJvb3QvdWJvb3QuYzsKKyAgdWJvb3QgPSBrZXJuL3Vib290L2luaXQuYzsKKyAgdWJv b3QgPSBrZXJuL3Vib290L2h3LmM7CisgIHVib290ID0gdGVybS91Ym9vdC9jb25zb2xlLmM7CisK KyAgYXJtID0ga2Vybi9hcm0vZGwuYzsKKyAgYXJtID0gbGliL2FybS9saWJnY2MuUzsKKwogICBl bXUgPSBkaXNrL2hvc3QuYzsKICAgZW11ID0gZ251bGliL3Byb2duYW1lLmM7CiAgIGVtdSA9IGdu dWxpYi9lcnJvci5jOwpAQCAtNTk1LDYgKzYwOCw4IEBAIG1vZHVsZSA9IHsKIG1vZHVsZSA9IHsK ICAgbmFtZSA9IGNhdDsKICAgY29tbW9uID0gY29tbWFuZHMvY2F0LmM7CisgIGFybSA9IGxpYi9h cmcuYzsKKyAgYXJtID0gY29tbWFuZHMvZXh0Y21kLmM7CiB9OwogCiBtb2R1bGUgPSB7CkBAIC02 NjUsNiArNjgwLDcgQEAgbW9kdWxlID0gewogICBlZmkgPSBsaWIvZWZpL2hhbHQuYzsKICAgaWVl ZTEyNzUgPSBsaWIvaWVlZTEyNzUvaGFsdC5jOwogICBlbXUgPSBsaWIvZW11L2hhbHQuYzsKKyAg dWJvb3QgPSBsaWIvdWJvb3QvaGFsdC5jOwogfTsKIAogbW9kdWxlID0gewpAQCAtNjc4LDYgKzY5 NCw3IEBAIG1vZHVsZSA9IHsKICAgbWlwc19hcmMgPSBsaWIvbWlwcy9hcmMvcmVib290LmM7CiAg IG1pcHNfbG9vbmdzb24gPSBsaWIvbWlwcy9sb29uZ3Nvbi9yZWJvb3QuYzsKICAgbWlwc19xZW11 X21pcHMgPSBsaWIvbWlwcy9xZW11X21pcHMvcmVib290LmM7CisgIHVib290ID0gbGliL3Vib290 L3JlYm9vdC5jOwogICBjb21tb24gPSBjb21tYW5kcy9yZWJvb3QuYzsKIH07CiAKQEAgLTEzMDAs NiArMTMxNyw3IEBAIG1vZHVsZSA9IHsKICAgbmFtZSA9IGRhdGV0aW1lOwogICBjbW9zID0gbGli L2Ntb3NfZGF0ZXRpbWUuYzsKICAgZWZpID0gbGliL2VmaS9kYXRldGltZS5jOworICB1Ym9vdCA9 IGxpYi91Ym9vdC9kYXRldGltZS5jOwogICBzcGFyYzY0X2llZWUxMjc1ID0gbGliL2llZWUxMjc1 L2RhdGV0aW1lLmM7CiAgIHBvd2VycGNfaWVlZTEyNzUgPSBsaWIvaWVlZTEyNzUvZGF0ZXRpbWUu YzsKICAgc3BhcmM2NF9pZWVlMTI3NSA9IGxpYi9pZWVlMTI3NS9jbW9zLmM7CkBAIC0xMzE5LDYg KzEzMzcsNyBAQCBtb2R1bGUgPSB7CiAgIGV4dHJhX2Rpc3QgPSBsaWIvcG93ZXJwYy9zZXRqbXAu UzsKICAgZXh0cmFfZGlzdCA9IGxpYi9pYTY0L3NldGptcC5TOwogICBleHRyYV9kaXN0ID0gbGli L2lhNjQvbG9uZ2ptcC5TOworICBleHRyYV9kaXN0ID0gbGliL2FybS9zZXRqbXAuUzsKIH07CiAK IG1vZHVsZSA9IHsKQEAgLTEzOTcsOCArMTQxNiwxMiBAQCBtb2R1bGUgPSB7CiAgIHBvd2VycGNf aWVlZTEyNzUgPSBsb2FkZXIvcG93ZXJwYy9pZWVlMTI3NS9saW51eC5jOwogICBzcGFyYzY0X2ll ZWUxMjc1ID0gbG9hZGVyL3NwYXJjNjQvaWVlZTEyNzUvbGludXguYzsKICAgaWE2NF9lZmkgPSBs b2FkZXIvaWE2NC9lZmkvbGludXguYzsKKyAgYXJtX3Vib290ID0gbG9hZGVyL2FybS91Ym9vdC9s aW51eC5jOwogICBjb21tb24gPSBsaWIvY21kbGluZS5jOwogICBlbmFibGUgPSBub2VtdTsKKwor ICBmZHRfY3BwZmxhZ3MgPSAnJChDUFBGTEFHU19MSUJGRFQpJzsKKyAgZmR0X2xkYWRkID0gbGli ZmR0bGliLmE7CiB9OwogCiBtb2R1bGUgPSB7CmRpZmYgLXB1ck4gdHJ1bmsvZ3J1Yi1jb3JlL3Rl cm0vdGVybWluZm8uYyBhcm0tdWJvb3QvZ3J1Yi1jb3JlL3Rlcm0vdGVybWluZm8uYwotLS0gdHJ1 bmsvZ3J1Yi1jb3JlL3Rlcm0vdGVybWluZm8uYwkyMDEyLTExLTIwIDE2OjIxOjQ0Ljg2MzAzMjAw MCArMDAwMAorKysgYXJtLXVib290L2dydWItY29yZS90ZXJtL3Rlcm1pbmZvLmMJMjAxMi0xMS0y MCAxNjoyNjo1NC45NTA5MjAwMDAgKzAwMDAKQEAgLTc0Niw3ICs3NDYsOSBAQCBncnViX2NtZF90 ZXJtaW5mbyAoZ3J1Yl9leHRjbWRfY29udGV4dF90CiAKIHN0YXRpYyBncnViX2V4dGNtZF90IGNt ZDsKIAotI2lmIGRlZmluZWQgKEdSVUJfTUFDSElORV9JRUVFMTI3NSkgfHwgZGVmaW5lZCAoR1JV Ql9NQUNISU5FX01JUFNfTE9PTkdTT04pIHx8IGRlZmluZWQgKEdSVUJfTUFDSElORV9NSVBTX1FF TVVfTUlQUykgfHwgZGVmaW5lZCAoR1JVQl9NQUNISU5FX0FSQykKKyNpZiBkZWZpbmVkIChHUlVC X01BQ0hJTkVfSUVFRTEyNzUpIHx8IGRlZmluZWQgKEdSVUJfTUFDSElORV9NSVBTX0xPT05HU09O KSB8fCBcCisgIGRlZmluZWQgKEdSVUJfTUFDSElORV9NSVBTX1FFTVVfTUlQUykgfHwgZGVmaW5l ZCAoR1JVQl9NQUNISU5FX0FSQykgfHwgXAorICBkZWZpbmVkIChHUlVCX01BQ0hJTkVfVUJPT1Qp CiB2b2lkIGdydWJfdGVybWluZm9faW5pdCAodm9pZCkKICNlbHNlCiBHUlVCX01PRF9JTklUKHRl cm1pbmZvKQpkaWZmIC1wdXJOIHRydW5rL2dydWItY29yZS90ZXJtL3Vib290L2NvbnNvbGUuYyBh cm0tdWJvb3QvZ3J1Yi1jb3JlL3Rlcm0vdWJvb3QvY29uc29sZS5jCi0tLSB0cnVuay9ncnViLWNv cmUvdGVybS91Ym9vdC9jb25zb2xlLmMJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAx MDAKKysrIGFybS11Ym9vdC9ncnViLWNvcmUvdGVybS91Ym9vdC9jb25zb2xlLmMJMjAxMi0xMS0y MCAxNjoyNjo1NC45NTA5MjAwMDAgKzAwMDAKQEAgLTAsMCArMSwxNDMgQEAKKy8qIGNvbnNvbGUu YyAtIGNvbnNvbGUgaW50ZXJmYWNlIGxheWVyIGZvciBVLUJvb3QgcGxhdGZvcm1zICovCisvKgor ICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMp IDIwMTIgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBHUlVCIGlzIGZy ZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBp dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1 Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJz aW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg dmVyc2lvbi4KKyAqCisgKiAgR1JVQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0 IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSBy ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxv bmcgd2l0aCBHUlVCLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+ LgorICovCisKKyNpbmNsdWRlIDxncnViL3Rlcm0uaD4KKyNpbmNsdWRlIDxncnViL21pc2MuaD4K KyNpbmNsdWRlIDxncnViL3R5cGVzLmg+CisjaW5jbHVkZSA8Z3J1Yi9lcnIuaD4KKyNpbmNsdWRl IDxncnViL3Rlcm1pbmZvLmg+CisjaW5jbHVkZSA8Z3J1Yi91Ym9vdC91Ym9vdC5oPgorI2luY2x1 ZGUgPGdydWIvdWJvb3QvY29uc29sZS5oPgorCitzdGF0aWMgdm9pZAorcHV0IChzdHJ1Y3QgZ3J1 Yl90ZXJtX291dHB1dCAqdGVybSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIGNvbnN0IGludCBj KQoreworICB1Ym9vdF9wdXRjIChjKTsKK30KKworc3RhdGljIGludAorcmVhZGtleSAoc3RydWN0 IGdydWJfdGVybV9pbnB1dCAqdGVybSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIGlm ICh1Ym9vdF90c3RjICgpID4gMCkKKyAgICByZXR1cm4gdWJvb3RfZ2V0YyAoKTsKKworICByZXR1 cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkCit1Ym9vdF9jb25zb2xlX3NldGN1cnNvciAoc3RydWN0 IGdydWJfdGVybV9vdXRwdXQgKnRlcm0KKwkJCSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIGlu dCBvbgorCQkJIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgZ3J1Yl90ZXJtaW5mb19z ZXRjdXJzb3IgKHRlcm0sIG9uKTsKK30KKworc3RhdGljIGdydWJfZXJyX3QKK3Vib290X2NvbnNv bGVfaW5pdF9pbnB1dCAoc3RydWN0IGdydWJfdGVybV9pbnB1dCAqdGVybSkKK3sKKyAgcmV0dXJu IGdydWJfdGVybWluZm9faW5wdXRfaW5pdCAodGVybSk7Cit9CisKK2V4dGVybiBzdHJ1Y3QgZ3J1 Yl90ZXJtaW5mb19vdXRwdXRfc3RhdGUgdWJvb3RfY29uc29sZV90ZXJtaW5mb19vdXRwdXQ7CisK K3N0YXRpYyB2b2lkCit1Ym9vdF9jb25zb2xlX2RpbWVuc2lvbnMgKHZvaWQpCit7CisgIC8qIFVz ZSBhIHNtYWxsIGNvbnNvbGUgYnkgZGVmYXVsdC4gICovCisgIGlmICghdWJvb3RfY29uc29sZV90 ZXJtaW5mb19vdXRwdXQud2lkdGgpCisgICAgdWJvb3RfY29uc29sZV90ZXJtaW5mb19vdXRwdXQu d2lkdGggPSA4MDsKKyAgaWYgKCF1Ym9vdF9jb25zb2xlX3Rlcm1pbmZvX291dHB1dC5oZWlnaHQp CisgICAgdWJvb3RfY29uc29sZV90ZXJtaW5mb19vdXRwdXQuaGVpZ2h0ID0gMjQ7Cit9CisKK3N0 YXRpYyBncnViX2Vycl90Cit1Ym9vdF9jb25zb2xlX2luaXRfb3V0cHV0IChzdHJ1Y3QgZ3J1Yl90 ZXJtX291dHB1dCAqdGVybSkKK3sKKyAgdWJvb3RfY29uc29sZV9kaW1lbnNpb25zICgpOworCisg IGdydWJfdGVybWluZm9fb3V0cHV0X2luaXQgKHRlcm0pOworCisgIHJldHVybiAwOworfQorCitz dHJ1Y3QgZ3J1Yl90ZXJtaW5mb19pbnB1dF9zdGF0ZSB1Ym9vdF9jb25zb2xlX3Rlcm1pbmZvX2lu cHV0ID0geworICAucmVhZGtleSA9IHJlYWRrZXkKK307CisKK3N0cnVjdCBncnViX3Rlcm1pbmZv X291dHB1dF9zdGF0ZSB1Ym9vdF9jb25zb2xlX3Rlcm1pbmZvX291dHB1dCA9IHsKKyAgLnB1dCA9 IHB1dCwKKyAgLndpZHRoID0gODAsCisgIC5oZWlnaHQgPSAyNAorfTsKKworc3RhdGljIHN0cnVj dCBncnViX3Rlcm1faW5wdXQgdWJvb3RfY29uc29sZV90ZXJtX2lucHV0ID0geworICAubmFtZSA9 ICJjb25zb2xlIiwKKyAgLmluaXQgPSB1Ym9vdF9jb25zb2xlX2luaXRfaW5wdXQsCisgIC5nZXRr ZXkgPSBncnViX3Rlcm1pbmZvX2dldGtleSwKKyAgLmRhdGEgPSAmdWJvb3RfY29uc29sZV90ZXJt aW5mb19pbnB1dAorfTsKKworc3RhdGljIHN0cnVjdCBncnViX3Rlcm1fb3V0cHV0IHVib290X2Nv bnNvbGVfdGVybV9vdXRwdXQgPSB7CisgIC5uYW1lID0gImNvbnNvbGUiLAorICAuaW5pdCA9IHVi b290X2NvbnNvbGVfaW5pdF9vdXRwdXQsCisgIC5wdXRjaGFyID0gZ3J1Yl90ZXJtaW5mb19wdXRj aGFyLAorICAuZ2V0d2ggPSBncnViX3Rlcm1pbmZvX2dldHdoLAorICAuZ2V0eHkgPSBncnViX3Rl cm1pbmZvX2dldHh5LAorICAuZ290b3h5ID0gZ3J1Yl90ZXJtaW5mb19nb3RveHksCisgIC5jbHMg PSBncnViX3Rlcm1pbmZvX2NscywKKyAgLnNldGNvbG9yc3RhdGUgPSBncnViX3Rlcm1pbmZvX3Nl dGNvbG9yc3RhdGUsCisgIC5zZXRjdXJzb3IgPSB1Ym9vdF9jb25zb2xlX3NldGN1cnNvciwKKyAg LmZsYWdzID0gR1JVQl9URVJNX0NPREVfVFlQRV9BU0NJSSwKKyAgLmRhdGEgPSAmdWJvb3RfY29u c29sZV90ZXJtaW5mb19vdXRwdXQsCisgIC5ub3JtYWxfY29sb3IgPSBHUlVCX1RFUk1fREVGQVVM VF9OT1JNQUxfQ09MT1IsCisgIC5oaWdobGlnaHRfY29sb3IgPSBHUlVCX1RFUk1fREVGQVVMVF9I SUdITElHSFRfQ09MT1IsCit9OworCit2b2lkCitncnViX2NvbnNvbGVfaW5pdF9lYXJseSAodm9p ZCkKK3sKKyAgZ3J1Yl90ZXJtX3JlZ2lzdGVyX2lucHV0ICgiY29uc29sZSIsICZ1Ym9vdF9jb25z b2xlX3Rlcm1faW5wdXQpOworICBncnViX3Rlcm1fcmVnaXN0ZXJfb3V0cHV0ICgiY29uc29sZSIs ICZ1Ym9vdF9jb25zb2xlX3Rlcm1fb3V0cHV0KTsKK30KKworCisvKgorICogZ3J1Yl9jb25zb2xl X2luaXRfbGF0ZWx5KCk6CisgKiAgIEluaXRpYWxpemVzIHRlcm1pbmZvIGZvcm1hdHRpbmcgYnkg cmVnaXN0ZXJpbmcgdGVybWluYWwgdHlwZS4KKyAqICAgQ2FsbGVkIGFmdGVyIGhlYXAgaGFzIGJl ZW4gY29uZmlndXJlZC4KKyAqICAgCisgKi8KK3ZvaWQKK2dydWJfY29uc29sZV9pbml0X2xhdGVs eSAodm9pZCkKK3sKKyAgY29uc3QgY2hhciAqdHlwZTsKKworICAvKiBTZWUgaWYgZXhwbGljaXRs eSBzZXQgYnkgVS1Cb290IGVudmlyb25tZW50ICovCisgIHR5cGUgPSB1Ym9vdF9lbnZfZ2V0ICgi Z3J1Yl90ZXJtIik7CisgIGlmICghdHlwZSkKKyAgICB0eXBlID0gInZ0MTAwIjsKKworICBncnVi X3Rlcm1pbmZvX2luaXQgKCk7CisgIGdydWJfdGVybWluZm9fb3V0cHV0X3JlZ2lzdGVyICgmdWJv b3RfY29uc29sZV90ZXJtX291dHB1dCwgdHlwZSk7Cit9CisKK3ZvaWQKK2dydWJfY29uc29sZV9m aW5pICh2b2lkKQoreworfQpkaWZmIC1wdXJOIHRydW5rL2luY2x1ZGUvZ3J1Yi9hcm0vbGludXgu aCBhcm0tdWJvb3QvaW5jbHVkZS9ncnViL2FybS9saW51eC5oCi0tLSB0cnVuay9pbmNsdWRlL2dy dWIvYXJtL2xpbnV4LmgJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysrIGFy bS11Ym9vdC9pbmNsdWRlL2dydWIvYXJtL2xpbnV4LmgJMjAxMi0xMS0yMCAxNjoyNjo1NC45NTA5 MjAwMDAgKzAwMDAKQEAgLTAsMCArMSwzNCBAQAorLyogbGludXguaCAtIEFSTSBsaW51eCBzcGVj aWZpYyBkZWZpbml0aW9ucyAqLworLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290 bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAyMDEyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24s IEluYy4KKyAqCisgKiAgR1JVQiBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0 ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2Fy ZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChh dCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIEdSVUIgaXMgZGlzdHJp YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9V VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICog IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl ZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgor ICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggR1JVQi4gIElmIG5vdCwgc2VlIDxodHRw Oi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIEdSVUJfTElOVVhfQ1BV X0hFQURFUgorI2RlZmluZSBHUlVCX0xJTlVYX0NQVV9IRUFERVIgMQorCisjZGVmaW5lIExJTlVY X1pJTUFHRV9PRkZTRVQgMHgyNAorI2RlZmluZSBMSU5VWF9aSU1BR0VfTUFHSUMgIDB4MDE2ZjI4 MTgKKworI2RlZmluZSBMSU5VWF9BRERSRVNTICAgICAgICAoc3RhcnRfb2ZfcmFtICsgMHg4MDAw KQorI2RlZmluZSBMSU5VWF9JTklUUkRfQUREUkVTUyAoc3RhcnRfb2ZfcmFtICsgMHgwMjAwMDAw MCkKKyNkZWZpbmUgTElOVVhfRkRUX0FERFJFU1MgICAgKExJTlVYX0lOSVRSRF9BRERSRVNTIC0g MHgxMDAwMCkKKworI2RlZmluZSBGRFRfQURESVRJT05BTF9FTlRSSUVTX1NJWkUJMHgzMDAKKwor dHlwZWRlZiB2b2lkICgqa2VybmVsX2VudHJ5X3QpIChpbnQsIHVuc2lnbmVkIGxvbmcsIHZvaWQg Kik7CisKKyNlbmRpZiAvKiAhIEdSVUJfTElOVVhfQ1BVX0hFQURFUiAqLwpkaWZmIC1wdXJOIHRy dW5rL2luY2x1ZGUvZ3J1Yi9hcm0vdGltZS5oIGFybS11Ym9vdC9pbmNsdWRlL2dydWIvYXJtL3Rp bWUuaAotLS0gdHJ1bmsvaW5jbHVkZS9ncnViL2FybS90aW1lLmgJMTk3MC0wMS0wMSAwMTowMDow MC4wMDAwMDAwMDAgKzAxMDAKKysrIGFybS11Ym9vdC9pbmNsdWRlL2dydWIvYXJtL3RpbWUuaAky MDEyLTExLTIwIDE2OjI2OjU0Ljk1MDkyMDAwMCArMDAwMApAQCAtMCwwICsxLDI5IEBACisvKgor ICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMp IDIwMTIgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBHUlVCIGlzIGZy ZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBp dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1 Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJz aW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg dmVyc2lvbi4KKyAqCisgKiAgR1JVQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0 IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSBy ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxv bmcgd2l0aCBHUlVCLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+ LgorICovCisKKyNpZm5kZWYgS0VSTkVMX0NQVV9USU1FX0hFQURFUgorI2RlZmluZSBLRVJORUxf Q1BVX1RJTUVfSEVBREVSCTEKKworc3RhdGljIF9faW5saW5lIHZvaWQKK2dydWJfY3B1X2lkbGUg KHZvaWQpCit7CisgIC8qIEZJWE1FOiB0aGlzIGNhbid0IHdvcmsgdW50aWwgd2UgaGFuZGxlIGlu dGVycnVwdHMuICAqLworLyogIF9fYXNtX18gX192b2xhdGlsZV9fICgid2ZpIik7ICovCit9CisK KyNlbmRpZiAvKiAhIEtFUk5FTF9DUFVfVElNRV9IRUFERVIgKi8KZGlmZiAtcHVyTiB0cnVuay9p bmNsdWRlL2dydWIvYXJtL3R5cGVzLmggYXJtLXVib290L2luY2x1ZGUvZ3J1Yi9hcm0vdHlwZXMu aAotLS0gdHJ1bmsvaW5jbHVkZS9ncnViL2FybS90eXBlcy5oCTE5NzAtMDEtMDEgMDE6MDA6MDAu MDAwMDAwMDAwICswMTAwCisrKyBhcm0tdWJvb3QvaW5jbHVkZS9ncnViL2FybS90eXBlcy5oCTIw MTItMTEtMjAgMTY6MjY6NTQuOTUwOTIwMDAwICswMDAwCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisg KiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykg MjAxMiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIEdSVUIgaXMgZnJl ZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0 IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVi bGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNp b24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2 ZXJzaW9uLgorICoKKyAqICBHUlVCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg d2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2 ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJl Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9u ZyB3aXRoIEdSVUIuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4u CisgKi8KKworI2lmbmRlZiBHUlVCX1RZUEVTX0NQVV9IRUFERVIKKyNkZWZpbmUgR1JVQl9UWVBF U19DUFVfSEVBREVSCTEKKworLyogVGhlIHNpemUgb2Ygdm9pZCAqLiAgKi8KKyNkZWZpbmUgR1JV Ql9UQVJHRVRfU0laRU9GX1ZPSURfUAk0CisKKy8qIFRoZSBzaXplIG9mIGxvbmcuICAqLworI2Rl ZmluZSBHUlVCX1RBUkdFVF9TSVpFT0ZfTE9ORwkJNAorCisvKiBjdXJyZW50bHkgb25seSBzdXBw b3J0IGxpdHRsZS1lbmRpYW4uICAqLworI3VuZGVmIEdSVUJfVEFSR0VUX1dPUkRTX0JJR0VORElB TgorCisvKiBVbmFsaWduZWQgYWNjZXNzZXMgb25seSBzdXBwb3J0ZWQgaWYgTU1VIGVuYWJsZWQg Ki8KKy8vI2RlZmluZSBHUlVCX0hBVkVfVU5BTElHTkVEX0FDQ0VTUyAxCisKKyNlbmRpZiAvKiAh IEdSVUJfVFlQRVNfQ1BVX0hFQURFUiAqLwpkaWZmIC1wdXJOIHRydW5rL2luY2x1ZGUvZ3J1Yi9h cm0vdWJvb3Qva2VybmVsLmggYXJtLXVib290L2luY2x1ZGUvZ3J1Yi9hcm0vdWJvb3Qva2VybmVs LmgKLS0tIHRydW5rL2luY2x1ZGUvZ3J1Yi9hcm0vdWJvb3Qva2VybmVsLmgJMTk3MC0wMS0wMSAw MTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysrIGFybS11Ym9vdC9pbmNsdWRlL2dydWIvYXJtL3Vi b290L2tlcm5lbC5oCTIwMTItMTEtMjAgMTY6MjY6NTQuOTUwOTIwMDAwICswMDAwCkBAIC0wLDAg KzEsMzIgQEAKKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICog IENvcHlyaWdodCAoQykgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisg KiAgR1JVQiBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Ig bW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u LCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlv bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIEdSVUIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFO VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJ TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ug c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZQorICogIGFsb25nIHdpdGggR1JVQi4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5v cmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIEdSVUJfS0VSTkVMX01BQ0hJTkVfSEVBREVS CisjZGVmaW5lIEdSVUJfS0VSTkVMX01BQ0hJTkVfSEVBREVSCTEKKworI2lmbmRlZiBBU01fRklM RQorCisjaW5jbHVkZSA8Z3J1Yi9zeW1ib2wuaD4KKyNpbmNsdWRlIDxncnViL3R5cGVzLmg+CisK KyNlbmRpZiAvKiAhIEFTTV9GSUxFICovCisKKyNkZWZpbmUgR1JVQl9LRVJORUxfTUFDSElORV9T VEFDS19TSVpFIDB4NDAwMDAKKyNkZWZpbmUgR1JVQl9LRVJORUxfTUFDSElORV9IRUFQX1NJWkUg IChncnViX3NpemVfdCkgKDIgKiAxMDI0ICogMTAyNCkKKworI2VuZGlmIC8qICEgR1JVQl9LRVJO RUxfTUFDSElORV9IRUFERVIgKi8KZGlmZiAtcHVyTiB0cnVuay9pbmNsdWRlL2dydWIvZGlzay5o IGFybS11Ym9vdC9pbmNsdWRlL2dydWIvZGlzay5oCi0tLSB0cnVuay9pbmNsdWRlL2dydWIvZGlz ay5oCTIwMTItMTEtMjAgMTY6MjE6NDQuODYzMDMyMDAwICswMDAwCisrKyBhcm0tdWJvb3QvaW5j bHVkZS9ncnViL2Rpc2suaAkyMDEyLTExLTIwIDE3OjA4OjI0LjM5NjQ2MDc3MSArMDAwMApAQCAt NDEsNiArNDEsNyBAQCBlbnVtIGdydWJfZGlza19kZXZfaWQKICAgICBHUlVCX0RJU0tfREVWSUNF X0NSWVBUT0RJU0tfSUQsCiAgICAgR1JVQl9ESVNLX0RFVklDRV9BUkNESVNLX0lELAogICAgIEdS VUJfRElTS19ERVZJQ0VfSE9TVERJU0tfSUQsCisgICAgR1JVQl9ESVNLX0RFVklDRV9VQk9PVERJ U0tfSUQsCiAgIH07CiAKIHN0cnVjdCBncnViX2Rpc2s7CmRpZmYgLXB1ck4gdHJ1bmsvaW5jbHVk ZS9ncnViL2VsZi5oIGFybS11Ym9vdC9pbmNsdWRlL2dydWIvZWxmLmgKLS0tIHRydW5rL2luY2x1 ZGUvZ3J1Yi9lbGYuaAkyMDEyLTExLTIwIDE2OjIxOjQ0Ljg2MzAzMjAwMCArMDAwMAorKysgYXJt LXVib290L2luY2x1ZGUvZ3J1Yi9lbGYuaAkyMDEyLTExLTIwIDE2OjI2OjU0Ljk1MDkyMDAwMCAr MDAwMApAQCAtMTQ1LDYgKzE0NSw3IEBAIHR5cGVkZWYgc3RydWN0CiAjZGVmaW5lIEVMRk9TQUJJ X1RSVTY0CQkxMAkvKiBDb21wYXEgVFJVNjQgVU5JWC4gICovCiAjZGVmaW5lIEVMRk9TQUJJX01P REVTVE8JMTEJLyogTm92ZWxsIE1vZGVzdG8uICAqLwogI2RlZmluZSBFTEZPU0FCSV9PUEVOQlNE CTEyCS8qIE9wZW5CU0QuICAqLworI2RlZmluZSBFTEZPU0FCSV9BUk1fQUVBQkkJNjQJLyogQVJN IEVBQkkgKi8KICNkZWZpbmUgRUxGT1NBQklfQVJNCQk5NwkvKiBBUk0gKi8KICNkZWZpbmUgRUxG T1NBQklfU1RBTkRBTE9ORQkyNTUJLyogU3RhbmRhbG9uZSAoZW1iZWRkZWQpIGFwcGxpY2F0aW9u ICovCiAKQEAgLTIwMDUsMTUgKzIwMDYsMTggQEAgdHlwZWRlZiBFbGYzMl9BZGRyIEVsZjMyX0Nv bmZsaWN0OwogLyogQVJNIHNwZWNpZmljIGRlY2xhcmF0aW9ucyAqLwogCiAvKiBQcm9jZXNzb3Ig c3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotI2Rl ZmluZSBFRl9BUk1fUkVMRVhFQyAgICAgMHgwMQotI2RlZmluZSBFRl9BUk1fSEFTRU5UUlkgICAg MHgwMgotI2RlZmluZSBFRl9BUk1fSU5URVJXT1JLICAgMHgwNAotI2RlZmluZSBFRl9BUk1fQVBD U18yNiAgICAgMHgwOAotI2RlZmluZSBFRl9BUk1fQVBDU19GTE9BVCAgMHgxMAotI2RlZmluZSBF Rl9BUk1fUElDICAgICAgICAgMHgyMAotI2RlZmluZSBFRl9BUk1fQUxJR044ICAgICAgMHg0MAkJ LyogOC1iaXQgc3RydWN0dXJlIGFsaWdubWVudCBpcyBpbiB1c2UgKi8KLSNkZWZpbmUgRUZfQVJN X05FV19BQkkgICAgIDB4ODAKLSNkZWZpbmUgRUZfQVJNX09MRF9BQkkgICAgIDB4MTAwCisjZGVm aW5lIEVGX0FSTV9SRUxFWEVDICAgICAJMHgwMQorI2RlZmluZSBFRl9BUk1fSEFTRU5UUlkgICAg CTB4MDIKKyNkZWZpbmUgRUZfQVJNX0lOVEVSV09SSyAgIAkweDA0CisjZGVmaW5lIEVGX0FSTV9B UENTXzI2ICAgICAJMHgwOAorI2RlZmluZSBFRl9BUk1fQVBDU19GTE9BVCAgCTB4MTAKKyNkZWZp bmUgRUZfQVJNX1BJQyAgICAgICAgIAkweDIwCisjZGVmaW5lIEVGX0FSTV9BTElHTjggICAgICAJ MHg0MCAvKiA4LWJpdCBzdHJ1Y3R1cmUgYWxpZ25tZW50IGlzIGluIHVzZSAqLworI2RlZmluZSBF Rl9BUk1fTkVXX0FCSSAgICAgCTB4ODAKKyNkZWZpbmUgRUZfQVJNX09MRF9BQkkgICAgIAkweDEw MAorI2RlZmluZSBFRl9BUk1fU09GVF9GTE9BVAkweDIwMAorI2RlZmluZSBFRl9BUk1fVkZQX0ZM T0FUCTB4NDAwCisjZGVmaW5lIEVGX0FSTV9NQVZFUklDS19GTE9BVAkweDgwMAogCiAvKiBPdGhl ciBjb25zdGFudHMgZGVmaW5lZCBpbiB0aGUgQVJNIEVMRiBzcGVjLiB2ZXJzaW9uIEItMDEuICAq LwogLyogTkIuIFRoZXNlIGNvbmZsaWN0IHdpdGggdmFsdWVzIGRlZmluZWQgYWJvdmUuICAqLwpA QCAtMjAyMiwxMyArMjAyNiwyMSBAQCB0eXBlZGVmIEVsZjMyX0FkZHIgRWxmMzJfQ29uZmxpY3Q7 CiAjZGVmaW5lIEVGX0FSTV9NQVBTWU1TRklSU1QJMHgxMAogI2RlZmluZSBFRl9BUk1fRUFCSU1B U0sJCTBYRkYwMDAwMDAKIAorLyogQ29uc3RhbnRzIGRlZmluZWQgaW4gQUFFTEYuICAqLworI2Rl ZmluZSBFRl9BUk1fQkU4CSAgICAweDAwODAwMDAwCisjZGVmaW5lIEVGX0FSTV9MRTgJICAgIDB4 MDA0MDAwMDAKKwogI2RlZmluZSBFRl9BUk1fRUFCSV9WRVJTSU9OKGZsYWdzKSAoKGZsYWdzKSAm IEVGX0FSTV9FQUJJTUFTSykKICNkZWZpbmUgRUZfQVJNX0VBQklfVU5LTk9XTiAgMHgwMDAwMDAw MAogI2RlZmluZSBFRl9BUk1fRUFCSV9WRVIxICAgICAweDAxMDAwMDAwCiAjZGVmaW5lIEVGX0FS TV9FQUJJX1ZFUjIgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgRUZfQVJNX0VBQklfVkVSMyAgICAg MHgwMzAwMDAwMAorI2RlZmluZSBFRl9BUk1fRUFCSV9WRVI0ICAgICAweDA0MDAwMDAwCisjZGVm aW5lIEVGX0FSTV9FQUJJX1ZFUjUgICAgIDB4MDUwMDAwMDAKIAogLyogQWRkaXRpb25hbCBzeW1i b2wgdHlwZXMgZm9yIFRodW1iICovCi0jZGVmaW5lIFNUVF9BUk1fVEZVTkMgICAgICAweGQKKyNk ZWZpbmUgU1RUX0FSTV9URlVOQwkgICAgIFNUVF9MT1BST0MgLyogQSBUaHVtYiBmdW5jdGlvbi4g ICovCisjZGVmaW5lIFNUVF9BUk1fMTZCSVQJICAgICBTVFRfSElQUk9DIC8qIEEgVGh1bWIgbGFi ZWwuICAqLwogCiAvKiBBUk0tc3BlY2lmaWMgdmFsdWVzIGZvciBzaF9mbGFncyAqLwogI2RlZmlu ZSBTSEZfQVJNX0VOVFJZU0VDVCAgMHgxMDAwMDAwMCAgIC8qIFNlY3Rpb24gY29udGFpbnMgYW4g ZW50cnkgcG9pbnQgKi8KQEAgLTIwMzgsNiArMjA1MCwxNyBAQCB0eXBlZGVmIEVsZjMyX0FkZHIg RWxmMzJfQ29uZmxpY3Q7CiAvKiBBUk0tc3BlY2lmaWMgcHJvZ3JhbSBoZWFkZXIgZmxhZ3MgKi8K ICNkZWZpbmUgUEZfQVJNX1NCICAgICAgICAgIDB4MTAwMDAwMDAgICAvKiBTZWdtZW50IGNvbnRh aW5zIHRoZSBsb2NhdGlvbgogCQkJCQkgICBhZGRyZXNzZWQgYnkgdGhlIHN0YXRpYyBiYXNlICov CisjZGVmaW5lIFBGX0FSTV9QSQkgICAweDIwMDAwMDAwICAgLyogUG9zaXRpb24taW5kZXBlbmRl bnQgc2VnbWVudC4gICovCisjZGVmaW5lIFBGX0FSTV9BQlMJICAgMHg0MDAwMDAwMCAgIC8qIEFi c29sdXRlIHNlZ21lbnQuICAqLworCisvKiBQcm9jZXNzb3Igc3BlY2lmaWMgdmFsdWVzIGZvciB0 aGUgUGhkciBwX3R5cGUgZmllbGQuICAqLworI2RlZmluZSBQVF9BUk1fRVhJRFgJCShQVF9MT1BS T0MgKyAxKQkvKiBBUk0gdW53aW5kIHNlZ21lbnQuICAqLworCisvKiBQcm9jZXNzb3Igc3BlY2lm aWMgdmFsdWVzIGZvciB0aGUgU2hkciBzaF90eXBlIGZpZWxkLiAgKi8KKyNkZWZpbmUgU0hUX0FS TV9FWElEWAkJKFNIVF9MT1BST0MgKyAxKSAvKiBBUk0gdW53aW5kIHNlY3Rpb24uICAqLworI2Rl ZmluZSBTSFRfQVJNX1BSRUVNUFRNQVAJKFNIVF9MT1BST0MgKyAyKSAvKiBQcmVlbXB0aW9uIGRl dGFpbHMuICAqLworI2RlZmluZSBTSFRfQVJNX0FUVFJJQlVURVMJKFNIVF9MT1BST0MgKyAzKSAv KiBBUk0gYXR0cmlidXRlcyBzZWN0aW9uLiAgKi8KKwogCiAvKiBBUk0gcmVsb2NzLiAgKi8KICNk ZWZpbmUgUl9BUk1fTk9ORQkJMAkvKiBObyByZWxvYyAqLwpAQCAtMjA1MCw3ICsyMDczLDcgQEAg dHlwZWRlZiBFbGYzMl9BZGRyIEVsZjMyX0NvbmZsaWN0OwogI2RlZmluZSBSX0FSTV9USE1fQUJT NQkJNwogI2RlZmluZSBSX0FSTV9BQlM4CQk4CS8qIERpcmVjdCA4IGJpdCAqLwogI2RlZmluZSBS X0FSTV9TQlJFTDMyCQk5Ci0jZGVmaW5lIFJfQVJNX1RITV9QQzIyCQkxMAorI2RlZmluZSBSX0FS TV9USE1fQ0FMTAkJMTAKICNkZWZpbmUgUl9BUk1fVEhNX1BDOAkJMTEKICNkZWZpbmUgUl9BUk1f QU1QX1ZDQUxMOQkxMgogI2RlZmluZSBSX0FSTV9TV0kyNAkJMTMKQEAgLTIwNjUsMTYgKzIwODgs MzYgQEAgdHlwZWRlZiBFbGYzMl9BZGRyIEVsZjMyX0NvbmZsaWN0OwogI2RlZmluZSBSX0FSTV9H T1RQQwkJMjUJLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KICNkZWZpbmUg Ul9BUk1fR09UMzIJCTI2CS8qIDMyIGJpdCBHT1QgZW50cnkgKi8KICNkZWZpbmUgUl9BUk1fUExU MzIJCTI3CS8qIDMyIGJpdCBQTFQgYWRkcmVzcyAqLworI2RlZmluZSBSX0FSTV9DQUxMCQkyOAor I2RlZmluZSBSX0FSTV9KVU1QMjQJCTI5CisjZGVmaW5lIFJfQVJNX1RITV9KVU1QMjQJMzAKKyNk ZWZpbmUgUl9BUk1fQkFTRV9BQlMJCTMxCiAjZGVmaW5lIFJfQVJNX0FMVV9QQ1JFTF83XzAJMzIK ICNkZWZpbmUgUl9BUk1fQUxVX1BDUkVMXzE1XzgJMzMKICNkZWZpbmUgUl9BUk1fQUxVX1BDUkVM XzIzXzE1CTM0CiAjZGVmaW5lIFJfQVJNX0xEUl9TQlJFTF8xMV8wCTM1CiAjZGVmaW5lIFJfQVJN X0FMVV9TQlJFTF8xOV8xMgkzNgogI2RlZmluZSBSX0FSTV9BTFVfU0JSRUxfMjdfMjAJMzcKKyNk ZWZpbmUgUl9BUk1fVExTX0dPVERFU0MJOTAKKyNkZWZpbmUgUl9BUk1fVExTX0NBTEwJCTkxCisj ZGVmaW5lIFJfQVJNX1RMU19ERVNDU0VRCTkyCisjZGVmaW5lIFJfQVJNX1RITV9UTFNfQ0FMTAk5 MwogI2RlZmluZSBSX0FSTV9HTlVfVlRFTlRSWQkxMDAKICNkZWZpbmUgUl9BUk1fR05VX1ZUSU5I RVJJVAkxMDEKICNkZWZpbmUgUl9BUk1fVEhNX1BDMTEJCTEwMgkvKiB0aHVtYiB1bmNvbmRpdGlv bmFsIGJyYW5jaCAqLwogI2RlZmluZSBSX0FSTV9USE1fUEM5CQkxMDMJLyogdGh1bWIgY29uZGl0 aW9uYWwgYnJhbmNoICovCisjZGVmaW5lIFJfQVJNX1RMU19HRDMyCQkxMDQJLyogUEMtcmVsIDMy IGJpdCBmb3IgZ2xvYmFsIGR5bmFtaWMKKwkJCQkJICAgdGhyZWFkIGxvY2FsIGRhdGEgKi8KKyNk ZWZpbmUgUl9BUk1fVExTX0xETTMyCQkxMDUJLyogUEMtcmVsIDMyIGJpdCBmb3IgbG9jYWwgZHlu YW1pYworCQkJCQkgICB0aHJlYWQgbG9jYWwgZGF0YSAqLworI2RlZmluZSBSX0FSTV9UTFNfTERP MzIJCTEwNgkvKiAzMiBiaXQgb2Zmc2V0IHJlbGF0aXZlIHRvIFRMUworCQkJCQkgICBibG9jayAq LworI2RlZmluZSBSX0FSTV9UTFNfSUUzMgkJMTA3CS8qIFBDLXJlbCAzMiBiaXQgZm9yIEdPVCBl bnRyeSBvZgorCQkJCQkgICBzdGF0aWMgVExTIGJsb2NrIG9mZnNldCAqLworI2RlZmluZSBSX0FS TV9UTFNfTEUzMgkJMTA4CS8qIDMyIGJpdCBvZmZzZXQgcmVsYXRpdmUgdG8gc3RhdGljCisJCQkJ CSAgIFRMUyBibG9jayAqLworI2RlZmluZQlSX0FSTV9USE1fVExTX0RFU0NTRVEJMTI5CisjZGVm aW5lIFJfQVJNX0lSRUxBVElWRQkJMTYwCiAjZGVmaW5lIFJfQVJNX1JYUEMyNQkJMjQ5CiAjZGVm aW5lIFJfQVJNX1JTQlJFTDMyCQkyNTAKICNkZWZpbmUgUl9BUk1fVEhNX1JQQzIyCQkyNTEKZGlm ZiAtcHVyTiB0cnVuay9pbmNsdWRlL2dydWIvbGliZ2NjLmggYXJtLXVib290L2luY2x1ZGUvZ3J1 Yi9saWJnY2MuaAotLS0gdHJ1bmsvaW5jbHVkZS9ncnViL2xpYmdjYy5oCTIwMTItMTEtMjAgMTY6 MjE6NDQuODYzMDMyMDAwICswMDAwCisrKyBhcm0tdWJvb3QvaW5jbHVkZS9ncnViL2xpYmdjYy5o CTIwMTItMTEtMjAgMTc6MTE6NTUuMDQyOTI4MjU5ICswMDAwCkBAIC0xMjAsMyArMTIwLDE0IEBA IHZvaWQgRVhQT1JUX0ZVTkMgKF9zYXZlZ3ByXzI5KSAodm9pZCk7CiB2b2lkIEVYUE9SVF9GVU5D IChfc2F2ZWdwcl8zMCkgKHZvaWQpOwogdm9pZCBFWFBPUlRfRlVOQyAoX3NhdmVncHJfMzEpICh2 b2lkKTsKICNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19hcm1fXykKK3ZvaWQgRVhQT1JUX0ZVTkMg KF9fYWVhYmlfaWRpdikgKHZvaWQpOwordm9pZCBFWFBPUlRfRlVOQyAoX19hZWFiaV9pZGl2bW9k KSAodm9pZCk7Cit2b2lkIEVYUE9SVF9GVU5DIChfX2FlYWJpX2xhc3IpICh2b2lkKTsKK3ZvaWQg RVhQT1JUX0ZVTkMgKF9fYWVhYmlfbGxzbCkgKHZvaWQpOwordm9pZCBFWFBPUlRfRlVOQyAoX19h ZWFiaV9sbHNyKSAodm9pZCk7Cit2b2lkIEVYUE9SVF9GVU5DIChfX2FlYWJpX3VpZGl2KSAodm9p ZCk7Cit2b2lkIEVYUE9SVF9GVU5DIChfX2FlYWJpX3VpZGl2bW9kKSAodm9pZCk7Cit2b2lkIEVY UE9SVF9GVU5DIChfX2NsZWFyX2NhY2hlKSAodm9pZCAqLCB2b2lkICopOworI2VuZGlmCmRpZmYg LXB1ck4gdHJ1bmsvaW5jbHVkZS9ncnViL29mZnNldHMuaCBhcm0tdWJvb3QvaW5jbHVkZS9ncnVi L29mZnNldHMuaAotLS0gdHJ1bmsvaW5jbHVkZS9ncnViL29mZnNldHMuaAkyMDEyLTExLTIwIDE2 OjIxOjQ0Ljg2MzAzMjAwMCArMDAwMAorKysgYXJtLXVib290L2luY2x1ZGUvZ3J1Yi9vZmZzZXRz LmgJMjAxMi0xMS0yMCAxNjoyNjo1NC45NTA5MjAwMDAgKzAwMDAKQEAgLTEwMiw2ICsxMDIsNyBA QAogI2RlZmluZSBHUlVCX0tFUk5FTF9JMzg2X0lFRUUxMjc1X01PRF9HQVAgMHgwCiAjZGVmaW5l IEdSVUJfS0VSTkVMX0kzODZfQ09SRUJPT1RfTU9EX0dBUCAweDAKICNkZWZpbmUgR1JVQl9LRVJO RUxfU1BBUkM2NF9JRUVFMTI3NV9NT0RfR0FQIDB4MAorI2RlZmluZSBHUlVCX0tFUk5FTF9BUk1f VUJPT1RfTU9EX0dBUCAweDAKIAogI2RlZmluZSBHUlVCX0tFUk5FTF9QT1dFUlBDX0lFRUUxMjc1 X01PRF9BTElHTiAweDEwMDAKICNkZWZpbmUgR1JVQl9LRVJORUxfU1BBUkM2NF9JRUVFMTI3NV9N T0RfQUxJR04gMHgxCkBAIC0xMTAsNiArMTExLDEwIEBACiAjZGVmaW5lIEdSVUJfS0VSTkVMX01J UFNfQVJDX01PRF9BTElHTiAweDEKICNkZWZpbmUgR1JVQl9LRVJORUxfTUlQU19RRU1VX01JUFNf TU9EX0FMSUdOIDB4MQogCisjZGVmaW5lIEdSVUJfS0VSTkVMX0FSTV9VQk9PVF9NT0RfQUxJR04g CTB4MQorI2RlZmluZSBHUlVCX0tFUk5FTF9BUk1fVUJPT1RfVE9UQUxfTU9EVUxFX1NJWkUJMHg0 CisjZGVmaW5lIEdSVUJfS0VSTkVMX0FSTV9VQk9PVF9MSU5LX0FERFIJCTB4MDgwMDAwMDAKKwog LyogTWluaW1hbCBnYXAgYmV0d2VlbiBfZW5kIGFuZCB0aGUgc3RhcnQgb2YgdGhlIG1vZHVsZXMu ICBJdCdzIGEgaGFjawogICAgZm9yIFBvd2VyTWFjIHRvIHByZXZlbnQgIkNMQUlNIGZhaWxlZCIg ZXJyb3IuICBUaGUgcmVhbCBmaXggaXMgdG8KICAgIHJld3JpdGUgZ3J1Yi1ta2ltYWdlIHRvIGdl bmVyYXRlIHZhbGlkIEVMRiBmaWxlcy4gICovCmRpZmYgLXB1ck4gdHJ1bmsvaW5jbHVkZS9ncnVi L3N5bWJvbC5oIGFybS11Ym9vdC9pbmNsdWRlL2dydWIvc3ltYm9sLmgKLS0tIHRydW5rL2luY2x1 ZGUvZ3J1Yi9zeW1ib2wuaAkyMDEyLTExLTIwIDE2OjIxOjQ0Ljg2MzAzMjAwMCArMDAwMAorKysg YXJtLXVib290L2luY2x1ZGUvZ3J1Yi9zeW1ib2wuaAkyMDEyLTExLTIwIDE2OjI2OjU0Ljk1MDky MDAwMCArMDAwMApAQCAtMjksMTIgKzI5LDE2IEBACiAKICNpZiBIQVZFX0FTTV9VU0NPUkUKICNp ZmRlZiBBU01fRklMRQotIyBkZWZpbmUgRVhUX0Moc3ltKQlfICMjIHN5bQorI2lmbmRlZiAoX19h cm1fXykKKyNkZWZpbmUgRVhUX0Moc3ltKQlfICMjIHN5bQogI2Vsc2UKLSMgZGVmaW5lIEVYVF9D KHN5bSkJIl8iIHN5bQorI2RlZmluZSBFWFRfQyhzeW0pCSUgIyMgc3ltCiAjZW5kaWYKICNlbHNl Ci0jIGRlZmluZSBFWFRfQyhzeW0pCXN5bQorI2RlZmluZSBFWFRfQyhzeW0pCSJfIiBzeW0KKyNl bmRpZgorI2Vsc2UKKyNkZWZpbmUgRVhUX0Moc3ltKQlzeW0KICNlbmRpZgogCiAjaWYgZGVmaW5l ZCAoX19BUFBMRV9fKQpAQCAtNTIsOCArNTYsOCBAQAogCiAvKiBNYXJrIGFuIGV4cG9ydGVkIHN5 bWJvbC4gICovCiAjaWZuZGVmIEdSVUJfU1lNQk9MX0dFTkVSQVRPUgotIyBkZWZpbmUgRVhQT1JU X0ZVTkMoeCkJeAotIyBkZWZpbmUgRVhQT1JUX1ZBUih4KQl4CisjZGVmaW5lIEVYUE9SVF9GVU5D KHgpCXgKKyNkZWZpbmUgRVhQT1JUX1ZBUih4KQl4CiAjZW5kaWYgLyogISBHUlVCX1NZTUJPTF9H RU5FUkFUT1IgKi8KIAogI2VuZGlmIC8qICEgR1JVQl9TWU1CT0xfSEVBREVSICovCmRpZmYgLXB1 ck4gdHJ1bmsvaW5jbHVkZS9ncnViL3Vib290L2FwaV9wdWJsaWMuaCBhcm0tdWJvb3QvaW5jbHVk ZS9ncnViL3Vib290L2FwaV9wdWJsaWMuaAotLS0gdHJ1bmsvaW5jbHVkZS9ncnViL3Vib290L2Fw aV9wdWJsaWMuaAkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMAorKysgYXJtLXVi b290L2luY2x1ZGUvZ3J1Yi91Ym9vdC9hcGlfcHVibGljLmgJMjAxMi0xMS0yMCAxNjoyNjo1NC45 NTA5MjAwMDAgKzAwMDAKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIw MDctMjAwOCBTZW1paGFsZgorICoKKyAqIFdyaXR0ZW4gYnk6IFJhZmFsIEphd29yb3dza2kgPHJh akBzZW1paGFsZi5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQ7IHlvdSBj YW4gdXNlIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogZWl0aGVyIHRoZSBHUEwsIG9yIHRoZSBC U0QgbGljZW5zZSwgYXQgeW91ciBvcHRpb24uCisgKgorICogSS4gR1BMOgorICoKKyAqIFRoaXMg ZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAq IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0 aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55 IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7 IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZ IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxk IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQor ICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29m dHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBC b3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEFsdGVybmF0aXZlbHksCisgKgor ICogSUkuIEJTRCBsaWNlbnNlOgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291 cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP VklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFO WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4g Tk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBG T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg T1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NT IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICog SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO IENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJ R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNF IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YK KyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX0FQSV9QVUJMSUNfSF8KKyNkZWZpbmUg X0FQSV9QVUJMSUNfSF8KKworI2RlZmluZSBBUElfRUlOVkFMCQkxCS8qIGludmFsaWQgYXJndW1l bnQocykgICovCisjZGVmaW5lIEFQSV9FTk9ERVYJCTIJLyogbm8gZGV2aWNlICAgICAgICAgICAg Ki8KKyNkZWZpbmUgQVBJX0VOT01FTQkJMwkvKiBubyBtZW1vcnkgICAgICAgICAgICAqLworI2Rl ZmluZSBBUElfRUJVU1kJCTQJLyogYnVzeSwgb2NjdXBpZWQgZXRjLiAgKi8KKyNkZWZpbmUgQVBJ X0VJTwkJCTUJLyogSS9PIGVycm9yICAgICAgICAgICAgKi8KKyNkZWZpbmUgQVBJX0VTWVNDCQk2 CS8qIHN5c2NhbGwgZXJyb3IgICAgICAgICovCisKK3R5cGVkZWYgaW50ICgqc2NwX3QpIChpbnQs IGludCAqLCAuLi4pOworCit0eXBlZGVmIGdydWJfdWludDE2X3QgdWludDE2X3Q7Cit0eXBlZGVm IGdydWJfdWludDMyX3QgdWludDMyX3Q7CisKKyNkZWZpbmUgQVBJX1NJR19WRVJTSU9OCTEKKyNk ZWZpbmUgQVBJX1NJR19NQUdJQwkiVUJvb3RBUEkiCisjZGVmaW5lIEFQSV9TSUdfTUFHTEVOCTgK Kworc3RydWN0IGFwaV9zaWduYXR1cmUKK3sKKyAgY2hhciBtYWdpY1tBUElfU0lHX01BR0xFTl07 CS8qIG1hZ2ljIHN0cmluZyAqLworICB1aW50MTZfdCB2ZXJzaW9uOwkJLyogQVBJIHZlcnNpb24g Ki8KKyAgdWludDMyX3QgY2hlY2tzdW07CQkvKiBjaGVja3N1bSBvZiB0aGlzIHNpZyBzdHJ1Y3Qg Ki8KKyAgc2NwX3Qgc3lzY2FsbDsJCS8qIGVudHJ5IHBvaW50IHRvIHRoZSBBUEkgKi8KK307CisK K2VudW0KK3sKKyAgQVBJX1JTVkQgPSAwLAorICBBUElfR0VUQywKKyAgQVBJX1BVVEMsCisgIEFQ SV9UU1RDLAorICBBUElfUFVUUywKKyAgQVBJX1JFU0VULAorICBBUElfR0VUX1NZU19JTkZPLAor ICBBUElfVURFTEFZLAorICBBUElfR0VUX1RJTUVSLAorICBBUElfREVWX0VOVU0sCisgIEFQSV9E RVZfT1BFTiwKKyAgQVBJX0RFVl9DTE9TRSwKKyAgQVBJX0RFVl9SRUFELAorICBBUElfREVWX1dS SVRFLAorICBBUElfRU5WX0VOVU0sCisgIEFQSV9FTlZfR0VULAorICBBUElfRU5WX1NFVCwKKyAg QVBJX0RJU1BMQVlfR0VUX0lORk8sCisgIEFQSV9ESVNQTEFZX0RSQVdfQklUTUFQLAorICBBUElf RElTUExBWV9DTEVBUiwKKyAgQVBJX01BWENBTEwKK307CisKKyNkZWZpbmUgTVJfQVRUUl9GTEFT SAkweDAwMDEKKyNkZWZpbmUgTVJfQVRUUl9EUkFNCTB4MDAwMgorI2RlZmluZSBNUl9BVFRSX1NS QU0JMHgwMDAzCisjZGVmaW5lIE1SX0FUVFJfTUFTSwkweDAwMGYKKworc3RydWN0IG1lbV9yZWdp b24KK3sKKyAgdW5zaWduZWQgbG9uZyBzdGFydDsKKyAgdW5zaWduZWQgbG9uZyBzaXplOworICBp bnQgZmxhZ3M7Cit9OworCitzdHJ1Y3Qgc3lzX2luZm8KK3sKKyAgdW5zaWduZWQgbG9uZyBjbGtf YnVzOworICB1bnNpZ25lZCBsb25nIGNsa19jcHU7CisgIHVuc2lnbmVkIGxvbmcgYmFyOworICBz dHJ1Y3QgbWVtX3JlZ2lvbiAqbXI7CisgIGludCBtcl9ubzsJCQkvKiBudW1iZXIgb2YgbWVtb3J5 IHJlZ2lvbnMgKi8KK307CisKKyN1bmRlZiBDT05GSUdfU1lTXzY0QklUX0xCQQorI2lmZGVmIENP TkZJR19TWVNfNjRCSVRfTEJBCit0eXBlZGVmIHVfaW50NjRfdCBsYmFzaXplX3Q7CisjZWxzZQor dHlwZWRlZiB1bnNpZ25lZCBsb25nIGxiYXNpemVfdDsKKyNlbmRpZgordHlwZWRlZiB1bnNpZ25l ZCBsb25nIGxiYXN0YXJ0X3Q7CisKKyNkZWZpbmUgREVWX1RZUF9OT05FCTB4MDAwMAorI2RlZmlu ZSBERVZfVFlQX05FVAkweDAwMDEKKworI2RlZmluZSBERVZfVFlQX1NUT1IJMHgwMDAyCisjZGVm aW5lIERUX1NUT1JfSURFCTB4MDAxMAorI2RlZmluZSBEVF9TVE9SX1NDU0kJMHgwMDIwCisjZGVm aW5lIERUX1NUT1JfVVNCCTB4MDA0MAorI2RlZmluZSBEVF9TVE9SX01NQwkweDAwODAKKyNkZWZp bmUgRFRfU1RPUl9TQVRBCTB4MDEwMAorCisjZGVmaW5lIERFVl9TVEFfQ0xPU0VECTB4MDAwMAkv KiBpbnZhbGlkLCBjbG9zZWQgKi8KKyNkZWZpbmUgREVWX1NUQV9PUEVOCTB4MDAwMQkvKiBvcGVu IGkuZS4gYWN0aXZlICovCisKK3N0cnVjdCBkZXZpY2VfaW5mbworeworICBpbnQgdHlwZTsKKyAg dm9pZCAqY29va2llOworCisgIHVuaW9uCisgIHsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICBs YmFzaXplX3QgYmxvY2tfY291bnQ7CS8qIG5vIG9mIGJsb2NrcyAqLworICAgICAgdW5zaWduZWQg bG9uZyBibG9ja19zaXplOwkvKiBzaXplIG9mIG9uZSBibG9jayAqLworICAgIH0gc3RvcmFnZTsK KworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaHdhZGRyWzZdOworICAg IH0gbmV0OworICB9IGluZm87CisjZGVmaW5lIGRpX3N0b3IgaW5mby5zdG9yYWdlCisjZGVmaW5l IGRpX25ldCBpbmZvLm5ldAorCisgIGludCBzdGF0ZTsKK307CisKKyNkZWZpbmUgRElTUExBWV9U WVBFX0xDRAkweDAwMDEKKyNkZWZpbmUgRElTUExBWV9UWVBFX1ZJREVPCTB4MDAwMgorCitzdHJ1 Y3QgZGlzcGxheV9pbmZvCit7CisgIGludCB0eXBlOworICAvKiBzY3JlZW4gc2l6ZSBpbiBwaXhl bHMgKi8KKyAgaW50IHBpeGVsX3dpZHRoOworICBpbnQgcGl4ZWxfaGVpZ2h0OworICAvKiBzY3Jl ZW4gc2l6ZSBpbiByb3dzIGFuZCBjb2x1bW5zIG9mIHRleHQgKi8KKyAgaW50IHNjcmVlbl9yb3dz OworICBpbnQgc2NyZWVuX2NvbHM7Cit9OworCisjZW5kaWYgLyogX0FQSV9QVUJMSUNfSF8gKi8K ZGlmZiAtcHVyTiB0cnVuay9pbmNsdWRlL2dydWIvdWJvb3QvY29uc29sZS5oIGFybS11Ym9vdC9p bmNsdWRlL2dydWIvdWJvb3QvY29uc29sZS5oCi0tLSB0cnVuay9pbmNsdWRlL2dydWIvdWJvb3Qv Y29uc29sZS5oCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCisrKyBhcm0tdWJv b3QvaW5jbHVkZS9ncnViL3Vib290L2NvbnNvbGUuaAkyMDEyLTExLTIwIDE2OjI2OjU0Ljk1MDky MDAwMCArMDAwMApAQCAtMCwwICsxLDI5IEBACisvKgorICogIEdSVUIgIC0tICBHUmFuZCBVbmlm aWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTIgIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbiwgSW5jLgorICoKKyAqICBHUlVCIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVk aXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9y CisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgR1JVQiBp cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1 dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5 IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl dGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCBHUlVCLiAgSWYgbm90LCBz ZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgR1JVQl9D T05TT0xFX01BQ0hJTkVfSEVBREVSCisjZGVmaW5lIEdSVUJfQ09OU09MRV9NQUNISU5FX0hFQURF UiAxCisKKy8qIEluaXRpYWxpemUgdGhlIGNvbnNvbGUgc3lzdGVtLiAgKi8KK3ZvaWQgZ3J1Yl9j b25zb2xlX2luaXRfZWFybHkgKHZvaWQpOwordm9pZCBncnViX2NvbnNvbGVfaW5pdF9sYXRlbHkg KHZvaWQpOworCisvKiBFeGl0IHRoZSBjb25zb2xlIHN5c3RlbS4gICovCit2b2lkIGdydWJfY29u c29sZV9maW5pICh2b2lkKTsKKworI2VuZGlmIC8qICEgR1JVQl9DT05TT0xFX01BQ0hJTkVfSEVB REVSICovCmRpZmYgLXB1ck4gdHJ1bmsvaW5jbHVkZS9ncnViL3Vib290L2Rpc2suaCBhcm0tdWJv b3QvaW5jbHVkZS9ncnViL3Vib290L2Rpc2suaAotLS0gdHJ1bmsvaW5jbHVkZS9ncnViL3Vib290 L2Rpc2suaAkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMAorKysgYXJtLXVib290 L2luY2x1ZGUvZ3J1Yi91Ym9vdC9kaXNrLmgJMjAxMi0xMS0yMCAxNjoyNjo1NC45NTA5MjAwMDAg KzAwMDAKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBC b290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAyMDEyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b24sIEluYy4KKyAqCisgKiAgR1JVQiBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJp YnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICog IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIEdSVUIgaXMgZGlz dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lU SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor ICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g IFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz LgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggR1JVQi4gIElmIG5vdCwgc2VlIDxo dHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIEdSVUJfVUJPT1Rf RElTS19IRUFERVIKKyNkZWZpbmUgR1JVQl9VQk9PVF9ESVNLX0hFQURFUgkxCisKKyNpbmNsdWRl IDxncnViL3N5bWJvbC5oPgorI2luY2x1ZGUgPGdydWIvZGlzay5oPgorI2luY2x1ZGUgPGdydWIv dWJvb3QvdWJvb3QuaD4KKwordm9pZCBncnViX3Vib290ZGlza19pbml0ICh2b2lkKTsKK3ZvaWQg Z3J1Yl91Ym9vdGRpc2tfZmluaSAodm9pZCk7CisKK2VudW0gZGlza3R5cGUKK3sgY2QsIGZkLCBo ZCB9OworCitzdHJ1Y3QgdWJvb3RkaXNrX2RhdGEKK3sKKyAgc3RydWN0IHVib290ZGlza19kYXRh ICpuZXh0OworICB2b2lkICpjb29raWU7CisgIGludCBoYW5kbGU7CisgIGludCBvcGVuY291bnQ7 CisgIGVudW0gZGlza3R5cGUgdHlwZTsKKyAgZ3J1Yl91aW50MzJfdCBibG9ja19zaXplOworfTsK KworZ3J1Yl9lcnJfdCBncnViX3Vib290ZGlza19yZWdpc3RlciAoc3RydWN0IGRldmljZV9pbmZv ICpuZXdkZXYsIGludCBoYW5kbGUpOworCisjZW5kaWYgLyogISBHUlVCX1VCT09UX0RJU0tfSEVB REVSICovCmRpZmYgLXB1ck4gdHJ1bmsvaW5jbHVkZS9ncnViL3Vib290L3Vib290LmggYXJtLXVi b290L2luY2x1ZGUvZ3J1Yi91Ym9vdC91Ym9vdC5oCi0tLSB0cnVuay9pbmNsdWRlL2dydWIvdWJv b3QvdWJvb3QuaAkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMAorKysgYXJtLXVi b290L2luY2x1ZGUvZ3J1Yi91Ym9vdC91Ym9vdC5oCTIwMTItMTEtMjAgMTY6MjY6NTQuOTUwOTIw MDAwICswMDAwCkBAIC0wLDAgKzEsMTQ4IEBACisvKiB1Ym9vdC5oIC0gZGVjbGFyZSB2YXJpYWJs ZXMgYW5kIGZ1bmN0aW9ucyBmb3IgVS1Cb290IHN1cHBvcnQgKi8KKy8qCisgKiAgR1JVQiAgLS0g IEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMjAxMiBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgR1JVQiBpcyBmcmVlIHNvZnR3YXJlOiB5 b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRl cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAq ICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBM aWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgor ICogIEdSVUIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1 bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll ZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm b3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5 IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggR1JVQi4g IElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZu ZGVmIEdSVUJfVUJPT1RfVUJPT1RfSEVBREVSCisjZGVmaW5lIEdSVUJfVUJPT1RfVUJPT1RfSEVB REVSCTEKKworI2luY2x1ZGUgPGdydWIvdHlwZXMuaD4KKyNpbmNsdWRlIDxncnViL2RsLmg+CisK Ky8qIEZ1bmN0aW9ucy4gICovCit2b2lkIGdydWJfdWJvb3RfbW1faW5pdCAodm9pZCk7Cit2b2lk IGdydWJfdWJvb3RfaW5pdCAodm9pZCk7Cit2b2lkIGdydWJfdWJvb3RfZmluaSAodm9pZCk7CisK K3ZvaWQgdWJvb3RfcmV0dXJuIChpbnQpIF9fYXR0cmlidXRlX18gKChub3JldHVybikpOworCitn cnViX2Vycl90IGdydWJfdWJvb3RfcHJvYmVfaGFyZHdhcmUgKHZvaWQpOworCitleHRlcm4gZ3J1 Yl9hZGRyX3QgRVhQT1JUX1ZBUiAoc3RhcnRfb2ZfcmFtKTsKKworZ3J1Yl91aW50MzJfdCBFWFBP UlRfRlVOQyAodWJvb3RfZ2V0X21hY2hpbmVfdHlwZSkgKHZvaWQpOworZ3J1Yl9hZGRyX3QgRVhQ T1JUX0ZVTkMgKHVib290X2dldF9ib290X2RhdGEpICh2b2lkKTsKKworCisvKgorICogVGhlIFUt Qm9vdCBBUEkgb3BlcmF0ZXMgdGhyb3VnaCBhICJzeXNjYWxsIiBpbnRlcmZhY2UsIGNvbnNpc3Rp bmcgb2YgYW4KKyAqIGVudHJ5IHBvaW50IGFkZHJlc3MgYW5kIGEgc2V0IG9mIHN5c2NhbGwgbnVt YmVycy4gVGhlIGxvY2F0aW9uIG9mIHRoaXMKKyAqIGVudHJ5IHBvaW50IGlzIGRlc2NyaWJlZCBp biBhIHN0cnVjdHVyZSBhbGxvY2F0ZWQgb24gdGhlIFUtQm9vdCBoZWFwLgorICogV2Ugc2NhbiB0 aHJvdWdoIGEgZGVmaW5lZCByZWdpb24gYXJvdW5kIHRoZSBoaW50IGFkZHJlc3MgcGFzc2VkIHRv IHVzCisgKiBmcm9tIFUtQm9vdC4KKyAqLworI2luY2x1ZGUgPGdydWIvdWJvb3QvYXBpX3B1Ymxp Yy5oPgorCisjZGVmaW5lIFVCT09UX0FQSV9TRUFSQ0hfTEVOICgzICogMTAyNCAqIDEwMjQpCitp bnQgdWJvb3RfYXBpX2luaXQgKHZvaWQpOworCisvKiBBbGwgZnVuY3Rpb25zIGJlbG93IGFyZSB3 cmFwcGVycyBhcm91bmQgdGhlIHVib290X3N5c2NhbGwoKSBmdW5jdGlvbiAqLworCisvKgorICog aW50IEFQSV9nZXRjKGludCAqYykKKyAqLworaW50IHVib290X2dldGMgKHZvaWQpOworCisvKgor ICogaW50IEFQSV90c3RjKGludCAqYykKKyAqLworaW50IHVib290X3RzdGMgKHZvaWQpOworCisv KgorICogaW50IEFQSV9wdXRjKGNoYXIgKmNoKQorICovCit2b2lkIHVib290X3B1dGMgKGludCBj KTsKKworLyoKKyAqIGludCBBUElfcHV0cyhjb25zdCBjaGFyICpzKQorICovCit2b2lkIHVib290 X3B1dHMgKGNvbnN0IGNoYXIgKnMpOworCisvKgorICogaW50IEFQSV9yZXNldCh2b2lkKQorICov Cit2b2lkIEVYUE9SVF9GVU5DICh1Ym9vdF9yZXNldCkgKHZvaWQpOworCisvKgorICogaW50IEFQ SV9nZXRfc3lzX2luZm8oc3RydWN0IHN5c19pbmZvICpzaSkKKyAqCisgKiBmaWxsIG91dCB0aGUg c3lzX2luZm8gc3RydWN0IGNvbnRhaW5pbmcgc2VsZWN0ZWQgcGFyYW1ldGVycyBhYm91dCB0aGUK KyAqIG1hY2hpbmUKKyAqLworc3RydWN0IHN5c19pbmZvICp1Ym9vdF9nZXRfc3lzX2luZm8gKHZv aWQpOworCisvKgorICogaW50IEFQSV91ZGVsYXkodW5zaWduZWQgbG9uZyAqdWRlbGF5KQorICov Cit2b2lkIHVib290X3VkZWxheSAoZ3J1Yl91aW50MzJfdCB1c2VjKTsKKworLyoKKyAqIGludCBB UElfZ2V0X3RpbWVyKHVuc2lnbmVkIGxvbmcgKmN1cnJlbnQsIHVuc2lnbmVkIGxvbmcgKmJhc2Up CisgKi8KK2dydWJfdWludDMyX3QgdWJvb3RfZ2V0X3RpbWVyIChncnViX3VpbnQzMl90IGJhc2Up OworCisvKgorICogaW50IEFQSV9kZXZfZW51bShzdHJ1Y3QgZGV2aWNlX2luZm8gKikKKyAqLwor aW50IHVib290X2Rldl9lbnVtICh2b2lkKTsKKworc3RydWN0IGRldmljZV9pbmZvICp1Ym9vdF9k ZXZfZ2V0IChpbnQgaGFuZGxlKTsKKworLyoKKyAqIGludCBBUElfZGV2X29wZW4oc3RydWN0IGRl dmljZV9pbmZvICopCisgKi8KK2ludCB1Ym9vdF9kZXZfb3BlbiAoaW50IGhhbmRsZSk7CisKKy8q CisgKiBpbnQgQVBJX2Rldl9jbG9zZShzdHJ1Y3QgZGV2aWNlX2luZm8gKikKKyAqLworaW50IHVi b290X2Rldl9jbG9zZSAoaW50IGhhbmRsZSk7CisKKy8qCisgKiBOb3RpY2U6IHRoaXMgaXMgZm9y IHNlbmRpbmcgbmV0d29yayBwYWNrZXRzIG9ubHksIGFzIFUtQm9vdCBkb2VzIG5vdAorICogc3Vw cG9ydCB3cml0aW5nIHRvIHN0b3JhZ2UgYXQgdGhlIG1vbWVudCAoMTIuMjAwNykKKyAqCisgKiBp bnQgQVBJX2Rldl93cml0ZShzdHJ1Y3QgZGV2aWNlX2luZm8gKmRpLCB2b2lkICpidWYsCWludCAq bGVuKQorICovCitpbnQgdWJvb3RfZGV2X3dyaXRlIChpbnQgaGFuZGxlLCB2b2lkICpidWYsIGlu dCAqbGVuKTsKKworLyoKKyAqIGludCBBUElfZGV2X3JlYWQoCisgKglzdHJ1Y3QgZGV2aWNlX2lu Zm8gKmRpLAorICoJdm9pZCAqYnVmLAorICoJc2l6ZV90ICpsZW4sCisgKgl1bnNpZ25lZCBsb25n ICpzdGFydAorICoJc2l6ZV90ICphY3RfbGVuCisgKiApCisgKi8KK2ludCB1Ym9vdF9kZXZfcmVh ZCAoaW50IGhhbmRsZSwgdm9pZCAqYnVmLCBsYmFzaXplX3QgYmxvY2tzLAorCQkgICAgbGJhc3Rh cnRfdCBzdGFydCwgbGJhc2l6ZV90ICogcmVhbF9ibG9ja3MpOworCitpbnQgdWJvb3RfZGV2X3Jl Y3YgKGludCBoYW5kbGUsIHZvaWQgKmJ1ZiwgaW50IHNpemUsIGludCAqcmVhbF9zaXplKTsKK2lu dCB1Ym9vdF9kZXZfc2VuZCAoaW50IGhhbmRsZSwgdm9pZCAqYnVmLCBpbnQgc2l6ZSk7CisKKy8q CisgKiBpbnQgQVBJX2Vudl9nZXQoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqKnZhbHVlKQorICov CitjaGFyICp1Ym9vdF9lbnZfZ2V0IChjb25zdCBjaGFyICpuYW1lKTsKKworLyoKKyAqIGludCBB UElfZW52X3NldChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKKyAqLwordm9p ZCB1Ym9vdF9lbnZfc2V0IChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSk7CisK KyNlbmRpZiAvKiAhIEdSVUJfVUJPT1RfVUJPT1RfSEVBREVSICovCmRpZmYgLXB1ck4gdHJ1bmsv TWFrZWZpbGUudXRpbC5kZWYgYXJtLXVib290L01ha2VmaWxlLnV0aWwuZGVmCi0tLSB0cnVuay9N YWtlZmlsZS51dGlsLmRlZgkyMDEyLTExLTIwIDE2OjIxOjQ0Ljg2MzAzMjAwMCArMDAwMAorKysg YXJtLXVib290L01ha2VmaWxlLnV0aWwuZGVmCTIwMTItMTEtMjAgMTY6MjY6NTQuOTUwOTIwMDAw ICswMDAwCkBAIC00NjksNiArNDY5LDcgQEAgc2NyaXB0ID0gewogICBlbmFibGUgPSBtaXBzX2xv b25nc29uOwogICBlbmFibGUgPSBpYTY0X2VmaTsKICAgZW5hYmxlID0gcG93ZXJwY19pZWVlMTI3 NTsKKyAgZW5hYmxlID0gYXJtX3Vib290OwogfTsKIAogc2NyaXB0ID0gewpkaWZmIC1wdXJOIHRy dW5rL3V0aWwvZ3J1Yi1pbnN0YWxsLmluIGFybS11Ym9vdC91dGlsL2dydWItaW5zdGFsbC5pbgot LS0gdHJ1bmsvdXRpbC9ncnViLWluc3RhbGwuaW4JMjAxMi0xMS0yMCAxNjoyMTo0NC44NjMwMzIw MDAgKzAwMDAKKysrIGFybS11Ym9vdC91dGlsL2dydWItaW5zdGFsbC5pbgkyMDEyLTExLTIwIDE2 OjI2OjU0Ljk1MDkyMDAwMCArMDAwMApAQCAtMzIxLDYgKzMyMSw4IEBAIGlmIFsgeCRzb3VyY2Vf ZGlyID0geCBdOyB0aGVuCiAJCSAgICB0YXJnZXQ9aTM4Ni1wYwogCQlmaQogCQk7OworCSAgICB4 ImFybSIqKQorCQl0YXJnZXQ9ImFybS11Ym9vdCI7OwogCSAgICAqKQogCQlnZXR0ZXh0ICJVbmFi bGUgdG8gZGV0ZXJtaW5lIHlvdXIgcGxhdGZvcm0uIFVzZSAtLXRhcmdldC4iIDsKIAkJZWNobwk7 OwpAQCAtMzQwLDcgKzM0Miw3IEBAIGlmIFsgIiR7Z3J1Yl9tb2RpbmZvX3RhcmdldF9jcHV9LSR7 Z3J1Yl8KICAgICBpZiBbIHgkZGlza19tb2R1bGUgPSB4dW5zcGVjaWZpZWQgXTsgdGhlbgogCWRp c2tfbW9kdWxlPWJpb3NkaXNrCiAgICAgZmkKLWVsaWYgWyAiJHtncnViX21vZGluZm9fcGxhdGZv cm19IiA9ICJpZWVlMTI3NSIgXSB8fCBbICIke2dydWJfbW9kaW5mb19wbGF0Zm9ybX0iID0gImVm aSIgXSB8fCBbICIke2dydWJfbW9kaW5mb19wbGF0Zm9ybX0iID0gImFyYyIgXSA7IHRoZW4KK2Vs aWYgWyAiJHtncnViX21vZGluZm9fcGxhdGZvcm19IiA9ICJpZWVlMTI3NSIgXSB8fCBbICIke2dy dWJfbW9kaW5mb19wbGF0Zm9ybX0iID0gImVmaSIgXSB8fCBbICIke2dydWJfbW9kaW5mb19wbGF0 Zm9ybX0iID0gImFyYyIgXSB8fCBbICIke2dydWJfbW9kaW5mb19wbGF0Zm9ybX0iID0gInVib290 IiBdIDsgdGhlbgogICAgIGRpc2tfbW9kdWxlPQogZWxzZQogICAgIGRpc2tfbW9kdWxlPW5hdGl2 ZQpAQCAtODU4LDYgKzg2MCwxNCBAQCBlbGlmIFsgeCIkZ3J1Yl9tb2RpbmZvX3BsYXRmb3JtIiA9 IHhlZmkKIAkJLUwgIiRib290bG9hZGVyX2lkIiAtbCAiXFxFRklcXCRlZmlfZGlzdHJpYnV0b3Jc XCRlZmlfZmlsZSIKIAlmaQogICAgIGZpCitlbGlmIFsgeCIke2dydWJfbW9kaW5mb190YXJnZXRf Y3B1fS0ke2dydWJfbW9kaW5mb19wbGF0Zm9ybX0iID0geGFybS11Ym9vdCBdOyB0aGVuCisgICAg Z3J1Yl9pbWduYW1lPSIke2dydWJkaXJ9LyR7Z3J1Yl9tb2RpbmZvX3RhcmdldF9jcHV9LSRncnVi X21vZGluZm9fcGxhdGZvcm0vY29yZS4ke2ltZ2V4dH0iCisgICAgcmF3X2ltZ25hbWU9IiR7dWJv b3RfaW1nbmFtZX0ucmF3IgorICAgIG12ICIkZ3J1Yl9pbWduYW1lIiAiJHJhd19pbWduYW1lIgor ICAgIG1raW1hZ2UgLVQga2VybmVsIC1BIEFSTSAtTyBMaW51eCAtYSAweDA4MDAwMDAwIC1lIDB4 MDgwMDAwMDAgLUMgbm9uZSAtZCAiJHJhd19pbWduYW1lIiAiJGdydWJfaW1nbmFtZSIKKyAgICBp ZiBbICQ/IC1lcSAwIF07IHRoZW4KKwlybSAtZiAiJHJhd19pbWduYW1lIgorICAgIGZpCiBlbHNl CiAgICAgZ2V0dGV4dCAiV0FSTklORzogbm8gcGxhdGZvcm0tc3BlY2lmaWMgaW5zdGFsbCB3YXMg cGVyZm9ybWVkIiAxPiYyCiAgICAgZWNobyAxPiYyCmRpZmYgLXB1ck4gdHJ1bmsvdXRpbC9ncnVi LW1raW1hZ2UuYyBhcm0tdWJvb3QvdXRpbC9ncnViLW1raW1hZ2UuYwotLS0gdHJ1bmsvdXRpbC9n cnViLW1raW1hZ2UuYwkyMDEyLTExLTIwIDE2OjIxOjQ0Ljg2MzAzMjAwMCArMDAwMAorKysgYXJt LXVib290L3V0aWwvZ3J1Yi1ta2ltYWdlLmMJMjAxMi0xMS0yMCAxNjoyNjo1NC45NTA5MjAwMDAg KzAwMDAKQEAgLTY5LDcgKzY5LDcgQEAgc3RydWN0IGltYWdlX3RhcmdldF9kZXNjCiAgICAgSU1B R0VfU1BBUkM2NF9BT1VULCBJTUFHRV9TUEFSQzY0X1JBVywgSU1BR0VfSTM4Nl9JRUVFMTI3NSwK ICAgICBJTUFHRV9MT09OR1NPTl9FTEYsIElNQUdFX1FFTVUsIElNQUdFX1BQQywgSU1BR0VfWUVF TE9PTkdfRkxBU0gsCiAgICAgSU1BR0VfRlVMT09ORzJGX0ZMQVNILCBJTUFHRV9JMzg2X1BDX1BY RSwgSU1BR0VfTUlQU19BUkMsCi0gICAgSU1BR0VfUUVNVV9NSVBTX0ZMQVNICisgICAgSU1BR0Vf UUVNVV9NSVBTX0ZMQVNILCBJTUFHRV9VQk9PVCwKICAgfSBpZDsKICAgZW51bQogICAgIHsKQEAg LTQ1Myw2ICs0NTMsMjUgQEAgc3RydWN0IGltYWdlX3RhcmdldF9kZXNjIGltYWdlX3RhcmdldHNb XQogICAgICAgLmxpbmtfYWxpZ24gPSBHUlVCX0tFUk5FTF9NSVBTX1FFTVVfTUlQU19MSU5LX0FM SUdOLAogICAgICAgLmRlZmF1bHRfY29tcHJlc3Npb24gPSBDT01QUkVTU0lPTl9OT05FCiAgICAg fSwKKyAgICB7CisgICAgICAuZGlybmFtZSA9ICJhcm0tdWJvb3QiLAorICAgICAgLm5hbWVzID0g eyAiYXJtLXVib290IiwgTlVMTCB9LAorICAgICAgLnZvaWRwX3NpemVvZiA9IDQsCisgICAgICAu YmlnZW5kaWFuID0gMCwKKyAgICAgIC5pZCA9IElNQUdFX1VCT09ULCAKKyAgICAgIC5mbGFncyA9 IFBMQVRGT1JNX0ZMQUdTX05PTkUsCisgICAgICAudG90YWxfbW9kdWxlX3NpemUgPSBHUlVCX0tF Uk5FTF9BUk1fVUJPT1RfVE9UQUxfTU9EVUxFX1NJWkUsCisgICAgICAuZGVjb21wcmVzc29yX2Nv bXByZXNzZWRfc2l6ZSA9IFRBUkdFVF9OT19GSUVMRCwKKyAgICAgIC5kZWNvbXByZXNzb3JfdW5j b21wcmVzc2VkX3NpemUgPSBUQVJHRVRfTk9fRklFTEQsCisgICAgICAuZGVjb21wcmVzc29yX3Vu Y29tcHJlc3NlZF9hZGRyID0gVEFSR0VUX05PX0ZJRUxELAorICAgICAgLnNlY3Rpb25fYWxpZ24g PSAxLAorICAgICAgLnZhZGRyX29mZnNldCA9IDAsCisgICAgICAubGlua19hZGRyID0gR1JVQl9L RVJORUxfQVJNX1VCT09UX0xJTktfQUREUiwKKyAgICAgIC5lbGZfdGFyZ2V0ID0gRU1fQVJNLAor ICAgICAgLm1vZF9nYXAgPSBHUlVCX0tFUk5FTF9BUk1fVUJPT1RfTU9EX0dBUCwKKyAgICAgIC5t b2RfYWxpZ24gPSBHUlVCX0tFUk5FTF9BUk1fVUJPT1RfTU9EX0FMSUdOLAorICAgICAgLmxpbmtf YWxpZ24gPSA0CisgICAgfSwKICAgfTsKIAogI2RlZmluZSBncnViX3RhcmdldF90b19ob3N0MzIo eCkgKGdydWJfdGFyZ2V0X3RvX2hvc3QzMl9yZWFsIChpbWFnZV90YXJnZXQsICh4KSkpCkBAIC0x NjI2LDYgKzE2NDUsOSBAQCBnZW5lcmF0ZV9pbWFnZSAoY29uc3QgY2hhciAqZGlyLCBjb25zdCBj CiAJY29yZV9zaXplID0gcHJvZ3JhbV9zaXplICsgaGVhZGVyX3NpemUgKyBmb290ZXJfc2l6ZTsK ICAgICAgIH0KICAgICAgIGJyZWFrOworICAgIGNhc2UgSU1BR0VfVUJPT1Q6CisgICAgICAvKiBS YXcgaW1hZ2UsIGhlYWRlciBhZGRlZCBieSBncnViLWluc3RhbGwgKi8KKyAgICAgIGJyZWFrOwog ICAgIH0KIAogICBncnViX3V0aWxfd3JpdGVfaW1hZ2UgKGNvcmVfaW1nLCBjb3JlX3NpemUsIG91 dCwgb3V0bmFtZSk7CkBAIC0xODYyLDcgKzE4ODQsNiBAQCBtYWluIChpbnQgYXJnYywgY2hhciAq YXJndltdKQogICAgICAgaWYgKCEgZnApCiAJZ3J1Yl91dGlsX2Vycm9yIChfKCJjYW5ub3Qgb3Bl biBgJXMnOiAlcyIpLCBhcmd1bWVudHMub3V0cHV0LAogCQkJIHN0cmVycm9yIChlcnJubykpOwot ICAgICAgZnJlZSAoYXJndW1lbnRzLm91dHB1dCk7CiAgICAgfQogCiAgIGlmICghYXJndW1lbnRz LmRpcikKQEAgLTE4ODksNSArMTkxMCw4IEBAIG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10p CiAgIGlmIChhcmd1bWVudHMuZGlyKQogICAgIGZyZWUgKGFyZ3VtZW50cy5kaXIpOwogCisgIGlm IChhcmd1bWVudHMub3V0cHV0KQorICAgIGZyZWUgKGFyZ3VtZW50cy5vdXRwdXQpOworCiAgIHJl dHVybiAwOwogfQpkaWZmIC1wdXJOIHRydW5rL3V0aWwvaW1wb3J0X2xpYmZkdC5weSBhcm0tdWJv b3QvdXRpbC9pbXBvcnRfbGliZmR0LnB5Ci0tLSB0cnVuay91dGlsL2ltcG9ydF9saWJmZHQucHkJ MTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysrIGFybS11Ym9vdC91dGlsL2lt cG9ydF9saWJmZHQucHkJMjAxMi0xMS0yMCAxNjoyNjo1NC45NTA5MjAwMDAgKzAwMDAKQEAgLTAs MCArMSwxMDMgQEAKKyMqCisjKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgor IyogIENvcHlyaWdodCAoQykgMjAxMiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisj KgorIyogIEdSVUIgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k L29yIG1vZGlmeQorIyogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh dGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyMqICAoYXQgeW91ciBv cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyoKKyMqICBHUlVCIGlzIGRpc3RyaWJ1dGVkIGlu IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjKiAgYnV0IFdJVEhPVVQgQU5ZIFdB UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMqICBNRVJDSEFO VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisj KiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMqCisjKiAg WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UKKyMqICBhbG9uZyB3aXRoIEdSVUIuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5n bnUub3JnL2xpY2Vuc2VzLz4uCisjKgorCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCBv cworaW1wb3J0IGNvZGVjcworaW1wb3J0IGRhdGV0aW1lCisKK2lmIGxlbiAoc3lzLmFyZ3YpIDwg MzoKKyAgICBwcmludCAoIlVzYWdlOiAlcyBTT1VSQ0UgREVTVElOQVRJT04iICUgc3lzLmFyZ3Zb MF0pCisgICAgZXhpdCAoMCkKK2R0Y2RpciA9IHN5cy5hcmd2WzFdCitpbmRpciA9IG9zLnBhdGgu am9pbiAoZHRjZGlyLCAibGliZmR0LyIpCitvdXRkaXIgPSBvcy5wYXRoLmpvaW4gKHN5cy5hcmd2 WzJdLCAibGliL2R0Yy1ncnViL2xpYmZkdC8iKQordHJ5OgorICAgIG9zLm1ha2VkaXJzIChvdXRk aXIpCitleGNlcHQ6CisgICAgcHJpbnQgKCJXQVJOSU5HOiAlcyBhbHJlYWR5IGV4aXN0cyIgJSBv dXRkaXIpCisKK2NvbmYgPSBjb2RlY3Mub3BlbiAob3MucGF0aC5qb2luICgiZ3J1Yi1jb3JlLyIs ICJNYWtlZmlsZS5saWJmZHQuZGVmIiksICJ3IiwgInV0Zi04IikKK2NvbmYud3JpdGUgKCJBdXRv R2VuIGRlZmluaXRpb25zIE1ha2VmaWxlLnRwbDtcblxuIikKK2NvbmYud3JpdGUgKCJsaWJyYXJ5 ID0ge1xuIikKK2NvbmYud3JpdGUgKCIgIG5hbWUgPSBsaWJmZHRsaWIuYTtcbiIpCitjb25mLndy aXRlICgiICBjb21tb24gPSBsaWIvZHRjLWdydWIvbGliZmR0L2ZkdC5jO1xuIikKK2NvbmYud3Jp dGUgKCIgIGNvbW1vbiA9IGxpYi9kdGMtZ3J1Yi9saWJmZHQvZmR0X3JvLmM7XG4iKQorY29uZi53 cml0ZSAoIiAgY29tbW9uID0gbGliL2R0Yy1ncnViL2xpYmZkdC9mZHRfcncuYztcbiIpCitjb25m LndyaXRlICgiICBjb21tb24gPSBsaWIvZHRjLWdydWIvbGliZmR0L2ZkdF9zdHJlcnJvci5jO1xu IikKK2NvbmYud3JpdGUgKCIgIGNvbW1vbiA9IGxpYi9kdGMtZ3J1Yi9saWJmZHQvZmR0X3N3LmM7 XG4iKQorY29uZi53cml0ZSAoIiAgY29tbW9uID0gbGliL2R0Yy1ncnViL2xpYmZkdC9mZHRfd2lw LmM7XG4iKQorY29uZi53cml0ZSAoIiAgY3BwZmxhZ3MgPSAnJChDUFBGTEFHU19MSUJGRFQpJztc biIpCitjb25mLndyaXRlICgiXG4iKQorY29uZi53cml0ZSAoIiAgZW5hYmxlID0gZmR0O1xuIikK K2NvbmYud3JpdGUgKCJ9O1xuIikKKworY29uZi5jbG9zZSAoKTsKKworCitsaWJmZHRfZmlsZXMg PSBzb3J0ZWQgKG9zLmxpc3RkaXIgKGluZGlyKSkKK2NobG9nID0gIiIKKworZm9yIGxpYmZkdF9m aWxlIGluIGxpYmZkdF9maWxlczoKKyAgICBpbmZpbGUgPSBvcy5wYXRoLmpvaW4gKGluZGlyLCAo bGliZmR0X2ZpbGUpKQorICAgIG91dGZpbGUgPSBvcy5wYXRoLmpvaW4gKG91dGRpciwgKGxpYmZk dF9maWxlKSkKKworICAgIGlmIG5vdCByZS5tYXRjaCAoIi4qXC5bY2hdJCIsIGxpYmZkdF9maWxl KToKKyAgICAgICAgY2hsb2cgPSAiJXMJKiAlczogUmVtb3ZlZFxuIiAlIChjaGxvZywgbGliZmR0 X2ZpbGUpCisgICAgICAgIGNvbnRpbnVlCisKKyMgICAgcHJpbnQgKCJmaWxlOiAlcywgaW5maWxl OiAlcywgb3V0ZmlsZTogJXMiICUgKGxpYmZkdF9maWxlLCBpbmZpbGUsIG91dGZpbGUpKQorCisg ICAgZiA9IGNvZGVjcy5vcGVuIChpbmZpbGUsICJyIiwgInV0Zi04IikKKyAgICBmdyA9IGNvZGVj cy5vcGVuIChvdXRmaWxlLCAidyIsICJ1dGYtOCIpCisKKyAgICBsaW5lbm8gPSAxCisKKyAgICBm dy53cml0ZSAoIi8qIFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBpbXBvcnRlZCB3aXRoIFxu IikKKyAgICBmdy53cml0ZSAoIiAgIGltcG9ydF9saWJmZHQucHkuIFBsZWFzZSBkb24ndCBtb2Rp ZnkgaXQgKi9cbiIpCisgICAgZncud3JpdGUgKCIjaW5jbHVkZSA8Z3J1Yi9kbC5oPlxuIikKKwor ICAgICMgbGliZmR0IGlzIGR1YWwtbGljZW5zZWQ6IEJTRCBvciBHUEx2MisKKyAgICBpZiByZS5t YXRjaCAoIi4qXC5jJCIsIGxpYmZkdF9maWxlKToKKyAgICAgICAgZncud3JpdGUgKCJHUlVCX01P RF9MSUNFTlNFIChcIkdQTHYyK1wiKTtcbiIpCisKKyAgICBsaW5lcyA9IGYucmVhZGxpbmVzKCkK KworICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICBmdy53cml0ZSAobGluZSkKKyAgICAg ICAgCisgICAgZi5jbG9zZSAoKQorICAgIGZ3LmNsb3NlICgpCisKK3BhdGNoZmlsZSA9IG9zLnBh dGguam9pbiAoZHRjZGlyLCAibGliZmR0LWdydWIuZGlmZiIpCisjcHJpbnQgIlBhdGNoZmlsZTog JXNcbiIgJSBwYXRjaGZpbGUKK3JldCA9IG9zLnN5c3RlbSgicGF0Y2ggLWQgJXMgLXAxIDwgJXMi ICUgKG91dGRpciwgcGF0Y2hmaWxlKSkKK2lmIHJldDoKKyAgICBjaGxvZyA9ICIlcwkqIEFwcGxp ZWQgR3J1YiBidWlsZCBwYXRjaFxuIiAlIGNobG9nCisKKworZHQgPSBkYXRldGltZS5kYXRlLnRv ZGF5ICgpCitmdyA9IGNvZGVjcy5vcGVuIChvcy5wYXRoLmpvaW4gKG91dGRpciwgIkltcG9ydExv ZyIpLCAidyIsICJ1dGYtOCIpCitmdy53cml0ZSAoIiUwNGQtJTAyZC0lMDJkICBBdXRvbWF0aWMg aW1wb3J0IHRvb2xcbiIgJSBcCisgICAgICAgICAgKGR0LnllYXIsZHQubW9udGgsIGR0LmRheSkp Citmdy53cml0ZSAoIlxuIikKK2Z3LndyaXRlICgiCUltcG9ydGVkIGxpYmZkdCB0byBHUlVCXG4i KQorZncud3JpdGUgKCJcbiIpCitmdy53cml0ZSAoY2hsb2cpCitmdy5jbG9zZSAoKQo= ------=_NextPart_000_0001_01CDC74B.96245310--