From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1E4HFp-00045L-Ry for mharc-grub-devel@gnu.org; Sun, 14 Aug 2005 08:06:18 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1E4HFl-00043m-Ij for grub-devel@gnu.org; Sun, 14 Aug 2005 08:06:13 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1E4HCE-00035S-Md for grub-devel@gnu.org; Sun, 14 Aug 2005 08:02:39 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1E4HCB-0002qw-7b for grub-devel@gnu.org; Sun, 14 Aug 2005 08:02:31 -0400 Received: from [194.251.242.243] (helo=fep18.inet.fi) by monty-python.gnu.org with esmtp (Exim 4.34) id 1E4HHp-0001kY-3m for grub-devel@gnu.org; Sun, 14 Aug 2005 08:08:21 -0400 Received: from [80.222.166.89] by fep18.inet.fi with ESMTP id <20050814115247.TIHM14797.fep18.inet.fi@[80.222.166.89]> for ; Sun, 14 Aug 2005 14:52:47 +0300 Message-ID: <42FF3097.7030904@nic.fi> Date: Sun, 14 Aug 2005 14:52:55 +0300 From: =?UTF-8?B?VmVzYSBKw6TDpHNrZWzDpGluZW4=?= User-Agent: Thunderbird 1.0+ (Windows/20050809) MIME-Version: 1.0 To: The development of GRUB 2 X-Enigmail-Version: 0.92.0.0 Content-Type: multipart/mixed; boundary="------------090603010205080905090603" Subject: vesafb terminal for testing. X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 14 Aug 2005 12:06:14 -0000 This is a multi-part message in MIME format. --------------090603010205080905090603 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hi, I have attached patch here that adds simple terminal that uses VESA BIOS Extension 2.0+ for rendering terminal. It is not meant to be included as is in GRUB 2, but I would hope that people would test it, so I could try to improve it for greater compatibility (even though I have tried to follow the standards, there might be some glitches between implementations). This terminal driver is based on vga terminal module and contains some common code from there, though many parts has been rewritten. When testing this patch, make sure that you have latest CVS version of GRUB 2. There are couple of things that I do not like in this patch. First one is that there should be common virtual terminal for all arch's and then separate graphics drivers that will do the actual drawing. In this patch this is all implemented in one module and it is not as pretty as it could be. Second one is that this patch uses VGA BIOS fonts to draw characters and it might cause some problems in some cards. Third one is that there are some testing functionality (vbe_test, vbe_list_modes) in same module, what would be best place to move those? Now how to get started on testing: - insmod vesafb - Use vbe_list_modes to find mode number (eg. 0x111) that you want to use. - set vbe_mode varible ('set vbe_mode=0x111') To test mode: - vbe_test To use it in terminal: - insmod terminal - terminal vesafb Thanks, Vesa Jääskeläinen --------------090603010205080905090603 Content-Type: text/plain; name="grub2-term-vesafb.diff" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="grub2-term-vesafb.diff" SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3Zzcm9vdC9ncnVi L2dydWIyL0NoYW5nZUxvZyx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS4xNDkKZGlmZiAtdSAt cjEuMTQ5IENoYW5nZUxvZwotLS0gQ2hhbmdlTG9nCTE0IEF1ZyAyMDA1IDExOjA0OjEyIC0w MDAwCTEuMTQ5CisrKyBDaGFuZ2VMb2cJMTQgQXVnIDIwMDUgMTE6MzE6NTEgLTAwMDAKQEAg LTEsNSArMSwxMyBAQAogMjAwNS0wOC0xNCAgVmVzYSBKYWFza2VsYWluZW4gIDxjaGFhY0Bu aWMuZmk+CiAKKwkqIERJU1RMSVNUOiBBZGRlZCB0ZXJtL2kzODYvcGMvdmVzYWZiLmMKKwkq IHRlcm0vaTM4Ni9wYy92ZXNhZmI6IE5ldyBmaWxlLgorCSogY29uZi9pMzg2LXBjLnJtayAo cGtnZGF0YV9NT0RVTEVTKTogQWRkZWQgdmVzYWZiLm1vZC4KKwkodmVzYWZiX21vZF9TT1VS Q0VTKTogQWRkZWQuCisJKHZlc2FmYl9tb2RfQ0ZMQUdTKTogTGlrZXdpc2UuCisKKzIwMDUt MDgtMTQgIFZlc2EgSmFhc2tlbGFpbmVuICA8Y2hhYWNAbmljLmZpPgorCiAJKiBESVNUTElT VDogQWRkZWQgaW5jbHVkZS9ncnViL2kzODYvcGMvdmJlLmguCiAKIDIwMDUtMDgtMTMgIFlv c2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KSW5kZXg6IERJU1RMSVNUCj09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KUkNTIGZpbGU6IC9jdnNyb290L2dydWIvZ3J1YjIvRElTVExJU1Qsdgpy ZXRyaWV2aW5nIHJldmlzaW9uIDEuOQpkaWZmIC11IC1yMS45IERJU1RMSVNUCi0tLSBESVNU TElTVAkxNCBBdWcgMjAwNSAxMTowNDoxMiAtMDAwMAkxLjkKKysrIERJU1RMSVNUCTE0IEF1 ZyAyMDA1IDExOjMxOjUxIC0wMDAwCkBAIC0xNjMsNiArMTYzLDcgQEAKIHBhcnRtYXAvcGMu YwogcGFydG1hcC9zdW4uYwogdGVybS9pMzg2L3BjL2NvbnNvbGUuYwordGVybS9pMzg2L3Bj L3Zlc2FmYi5jCiB0ZXJtL2kzODYvcGMvdmdhLmMKIHRlcm0vaWVlZTEyNzUvb2Zjb25zb2xl LmMKIHV0aWwvaTM4Ni9wYy9iaW9zZGlzay5jCkluZGV4OiBjb25mL2kzODYtcGMucm1rCj09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KUkNTIGZpbGU6IC9jdnNyb290L2dydWIvZ3J1YjIvY29uZi9pMzg2LXBj LnJtayx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS4zOQpkaWZmIC11IC1yMS4zOSBpMzg2LXBj LnJtawotLS0gY29uZi9pMzg2LXBjLnJtawkxMiBBdWcgMjAwNSAxOTo1MzozMiAtMDAwMAkx LjM5CisrKyBjb25mL2kzODYtcGMucm1rCTE0IEF1ZyAyMDA1IDExOjMxOjU2IC0wMDAwCkBA IC0xMTEsNyArMTExLDcgQEAKIAlmb250Lm1vZCBfbXVsdGlib290Lm1vZCBscy5tb2QgYm9v dC5tb2QgY21wLm1vZCBjYXQubW9kCQlcCiAJdGVybWluYWwubW9kIGZzaGVscC5tb2QgY2hh aW4ubW9kIG11bHRpYm9vdC5tb2QgYW1pZ2EubW9kCVwKIAlhcHBsZS5tb2QgcGMubW9kIHN1 bi5tb2QgbG9vcGJhY2subW9kIHJlYm9vdC5tb2QgaGFsdC5tb2QJXAotCWhlbHAubW9kIGRl ZmF1bHQubW9kIHRpbWVvdXQubW9kIGNvbmZpZ2ZpbGUubW9kCisJaGVscC5tb2QgZGVmYXVs dC5tb2QgdGltZW91dC5tb2QgY29uZmlnZmlsZS5tb2QgdmVzYWZiLm1vZAogCiAjIEZvciBf Y2hhaW4ubW9kLgogX2NoYWluX21vZF9TT1VSQ0VTID0gbG9hZGVyL2kzODYvcGMvY2hhaW5s b2FkZXIuYwpAQCAtMjUxLDMgKzI1MSw3IEBACiAjIEZvciBjb25maWdmaWxlLm1vZAogY29u ZmlnZmlsZV9tb2RfU09VUkNFUyA9IGNvbW1hbmRzL2NvbmZpZ2ZpbGUuYwogY29uZmlnZmls ZV9tb2RfQ0ZMQUdTID0gJChDT01NT05fQ0ZMQUdTKQorCisjIEZvciB2ZXNhZmIubW9kLgor dmVzYWZiX21vZF9TT1VSQ0VTID0gdGVybS9pMzg2L3BjL3Zlc2FmYi5jCit2ZXNhZmJfbW9k X0NGTEFHUyA9ICQoQ09NTU9OX0NGTEFHUykKSW5kZXg6IHRlcm0vaTM4Ni9wYy92ZXNhZmIu Ywo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09ClJDUyBmaWxlOiB0ZXJtL2kzODYvcGMvdmVzYWZiLmMKZGlmZiAt TiB0ZXJtL2kzODYvcGMvdmVzYWZiLmMKLS0tIC9kZXYvbnVsbAkxIEphbiAxOTcwIDAwOjAw OjAwIC0wMDAwCisrKyB0ZXJtL2kzODYvcGMvdmVzYWZiLmMJMTQgQXVnIDIwMDUgMTE6MzE6 NTYgLTAwMDAKQEAgLTAsMCArMSwxMTY5IEBACisvKgorICogIEdSVUIgIC0tICBHUmFuZCBV bmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgIEZyZWUgU29mdHdh cmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0 d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVu ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVi bGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBs YXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4g dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkg V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1F UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl ZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz LgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBp ZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5j LiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lu Y2x1ZGUgPGdydWIvbWFjaGluZS9tZW1vcnkuaD4KKyNpbmNsdWRlIDxncnViL21hY2hpbmUv dmdhLmg+CisjaW5jbHVkZSA8Z3J1Yi9tYWNoaW5lL3ZiZS5oPgorI2luY2x1ZGUgPGdydWIv bWFjaGluZS9jb25zb2xlLmg+CisjaW5jbHVkZSA8Z3J1Yi90ZXJtLmg+CisjaW5jbHVkZSA8 Z3J1Yi90eXBlcy5oPgorI2luY2x1ZGUgPGdydWIvZGwuaD4KKyNpbmNsdWRlIDxncnViL21p c2MuaD4KKyNpbmNsdWRlIDxncnViL25vcm1hbC5oPgorI2luY2x1ZGUgPGdydWIvZm9udC5o PgorI2luY2x1ZGUgPGdydWIvYXJnLmg+CisjaW5jbHVkZSA8Z3J1Yi9tbS5oPgorI2luY2x1 ZGUgPGdydWIvZW52Lmg+CisKKyNkZWZpbmUgREVGQVVMVF9WQkVfTU9ERSAgICAweDEwMQor I2RlZmluZSBERUZBVUxUX0NIQVJfV0lEVEggIDgKKyNkZWZpbmUgREVGQVVMVF9DSEFSX0hF SUdIVCAxNgorCisjZGVmaW5lIERFRkFVTFRfRkdfQ09MT1IgICAgMHhhCisjZGVmaW5lIERF RkFVTFRfQkdfQ09MT1IgICAgMHgwCisKK3N0cnVjdCBncnViX2NvbG9yZWRfY2hhcgorewor ICAvKiBBbiBVbmljb2RlIGNvZGVwb2ludC4gICovCisgIGdydWJfdWludDMyX3QgY29kZTsK KworICAvKiBDb2xvciBpbmRleGVzLiAgKi8KKyAgdW5zaWduZWQgY2hhciBmZ19jb2xvcjsK KyAgdW5zaWduZWQgY2hhciBiZ19jb2xvcjsKKworICAvKiBUaGUgd2lkdGggb2YgdGhpcyBj aGFyYWN0ZXIgbWludXMgb25lLiAgKi8KKyAgdW5zaWduZWQgY2hhciB3aWR0aDsKKworICAv KiBUaGUgY29sdW1uIGluZGV4IG9mIHRoaXMgY2hhcmFjdGVyLiAgKi8KKyAgdW5zaWduZWQg Y2hhciBpbmRleDsKK307CisKK3N0cnVjdCBncnViX3ZpcnR1YWxfc2NyZWVuCit7CisgIC8q IERpbWVuc2lvbnMgb2YgdGhlIHZpcnVhbCBzY3JlZW4uICAqLworICBncnViX3VpbnQzMl90 IHdpZHRoOworICBncnViX3VpbnQzMl90IGhlaWdodDsKKworICAvKiBPZmZzZXQgaW4gdGhl IGRpc3BsYXkuICAqLworICBncnViX3VpbnQzMl90IG9mZnNldF94OworICBncnViX3VpbnQz Ml90IG9mZnNldF95OworCisgIC8qIFRUWSBDaGFyYWN0ZXIgc2l6ZXMuICAqLworICBncnVi X3VpbnQzMl90IGNoYXJfd2lkdGg7CisgIGdydWJfdWludDMyX3QgY2hhcl9oZWlnaHQ7CisK KyAgLyogVmlydHVhbCBzY3JlZW4gVFRZIHNpemUuICAqLworICBncnViX3VpbnQzMl90IGNv bHVtbnM7CisgIGdydWJfdWludDMyX3Qgcm93czsKKworICAvKiBDdXJyZW50IGN1cnNvciBk ZXRhaWxzLiAgKi8KKyAgZ3J1Yl91aW50MzJfdCBjdXJzb3JfeDsKKyAgZ3J1Yl91aW50MzJf dCBjdXJzb3JfeTsKKyAgZ3J1Yl91aW50OF90IGN1cnNvcl9zdGF0ZTsKKyAgZ3J1Yl91aW50 OF90IGZnX2NvbG9yOworICBncnViX3VpbnQ4X3QgYmdfY29sb3I7CisKKyAgLyogVGV4dCBi dWZmZXIgZm9yIHZpcnVhbCBzY3JlZW4uIENvbnRhaW5zIChjb2x1bW5zICogcm93cykgbnVt YmVyCisgICAgIG9mIGVudHJpZXMuICAqLworICBzdHJ1Y3QgZ3J1Yl9jb2xvcmVkX2NoYXIg KnRleHRfYnVmZmVyOworfTsKKworLyogU3BlY2lmeSAic3RhbmRhcmQiIFZHQSBwYWxldHRl LCBzb21lIHZpZGVvIGNhcmRzIG1heQorICAgbmVlZCB0aGlzIGFuZCB0aGlzIHdpbGwgYWxz byBiZSB1c2VkIHdoZW4gdXNpbmcgUkdCIG1vZGVzLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgZ3J1 Yl92YmVfcGFsZXR0ZV9kYXRhIHZnYV9jb2xvcnNbMTZdID0KKyAgeworICAgIC8vIHtCLCBH LCBSLCBBfQorICAgIHsweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLy8gMCA9IGJsYWNrCisg ICAgezB4QTgsIDB4MDAsIDB4MDAsIDB4MDB9LCAvLyAxID0gYmx1ZQorICAgIHsweDAwLCAw eEE4LCAweDAwLCAweDAwfSwgLy8gMiA9IGdyZWVuCisgICAgezB4QTgsIDB4QTgsIDB4MDAs IDB4MDB9LCAvLyAzID0gY3lhbgorICAgIHsweDAwLCAweDAwLCAweEE4LCAweDAwfSwgLy8g NCA9IHJlZAorICAgIHsweEE4LCAweDAwLCAweEE4LCAweDAwfSwgLy8gNSA9IG1hZ2VudGEK KyAgICB7MHgwMCwgMHg1NCwgMHhBOCwgMHgwMH0sIC8vIDYgPSBicm93bgorICAgIHsweEE4 LCAweEE4LCAweEE4LCAweDAwfSwgLy8gNyA9IGxpZ3RoIGdyYXkKKworICAgIHsweDU0LCAw eDU0LCAweDU0LCAweDAwfSwgLy8gOCA9IGRhcmsgZ3JheQorICAgIHsweEZFLCAweDU0LCAw eDU0LCAweDAwfSwgLy8gOSA9IGJyaWdodCBibHVlCisgICAgezB4NTQsIDB4RkUsIDB4NTQs IDB4MDB9LCAvLyAxMCA9IGJyaWdodCBncmVlbgorICAgIHsweEZFLCAweEZFLCAweDU0LCAw eDAwfSwgLy8gMTEgPSBicmlnaHQgY3lhbgorICAgIHsweDU0LCAweDU0LCAweEZFLCAweDAw fSwgLy8gMTIgPSBicmlnaHQgcmVkCisgICAgezB4RkUsIDB4NTQsIDB4RkUsIDB4MDB9LCAv LyAxMyA9IGJyaWdodCBtYWdlbnRhCisgICAgezB4NTQsIDB4RkUsIDB4RkUsIDB4MDB9LCAv LyAxNCA9IHllbGxvdworICAgIHsweEZFLCAweEZFLCAweEZFLCAweDAwfSAgLy8gMTUgPSB3 aGl0ZQorICB9OworCisvKiBNYWtlIHNldXJlIHRleHQgYnVmZmVyIGlzIG5vdCBtYXJrZWQg YXMgYWxsb2NhdGVkLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgZ3J1Yl92aXJ0dWFsX3NjcmVlbiB2 aXJ0dWFsX3NjcmVlbiA9CisgIHsKKyAgICAudGV4dF9idWZmZXIgPSAwCisgIH07CisKK3N0 YXRpYyBncnViX2RsX3QgbXlfbW9kOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnZnYV9mb250 ID0gMDsKKworc3RhdGljIGludCB2YmVfZGV0ZWN0ZWQgPSAwOworc3RhdGljIGludCBpbmRl eF9jb2xvcl9tb2RlID0gMDsKKworc3RhdGljIHN0cnVjdCBncnViX3ZiZV9pbmZvX2Jsb2Nr IGNvbnRyb2xsZXJfaW5mbzsKK3N0YXRpYyBzdHJ1Y3QgZ3J1Yl92YmVfbW9kZV9pbmZvX2Js b2NrIGFjdGl2ZV9tb2RlX2luZm87CisKK3N0YXRpYyBncnViX3VpbnQzMl90IG9sZF9tb2Rl ID0gMDsKK3N0YXRpYyBncnViX3VpbnQzMl90IGFjdGl2ZV9tb2RlID0gMDsKKworc3RhdGlj IGdydWJfdWludDhfdCAqZnJhbWVidWZmZXIgPSAwOworc3RhdGljIGdydWJfdWludDMyX3Qg Ynl0ZXNfcGVyX3NjYW5fbGluZSA9IDA7CisKKy8vIHByb3RvdHlwZXMgZm9yIGhlbHBlciBm dW5jdGlvbnMKK3N0YXRpYyBncnViX2Vycl90IGdydWJfdmVzYWZiX3Byb2JlICh2b2lkKTsK K3N0YXRpYyBncnViX2Vycl90IGdydWJfdmVzYWZiX3NldF9tb2RlIChncnViX3VpbnQzMl90 IG1vZGUpOworc3RhdGljIGdydWJfZXJyX3QgZ3J1Yl92ZXNhZmJfZ2V0X21vZGUgKGdydWJf dWludDMyX3QgKm1vZGUpOworc3RhdGljIGdydWJfZXJyX3QgZ3J1Yl92ZXNhZmJfZ2V0X21v ZGVfaW5mbyAoZ3J1Yl91aW50MzJfdCBtb2RlLCBzdHJ1Y3QgZ3J1Yl92YmVfbW9kZV9pbmZv X2Jsb2NrICptb2RlX2luZm8pOworCitzdGF0aWMgZ3J1Yl9lcnJfdAorZ3J1Yl92ZXNhZmJf cHJvYmUgKHZvaWQpCit7CisgIHN0cnVjdCBncnViX3ZiZV9pbmZvX2Jsb2NrICp2YmVfaWI7 CisgIGdydWJfdWludDMyX3QgcmM7CisKKyAgLyogRG8gbm90IHByb2JlIG1vcmUgdGhhbiBv bmUgdGltZS4gICovCisgIGlmICh2YmVfZGV0ZWN0ZWQgIT0gMCkKKyAgICB7CisgICAgICBy ZXR1cm4gR1JVQl9FUlJfTk9ORTsKKyAgICB9CisKKyAgLyogQ2xlYXIgb2xkIGNvcHkgb2Yg Y29udHJvbGxlciBpbmZvIGJsb2NrLiAgKi8KKyAgZ3J1Yl9tZW1zZXQgKCZjb250cm9sbGVy X2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgZ3J1Yl92YmVfaW5mb19ibG9jaykpOworCisgIC8q IE1hcmsgVkVTQSBCSU9TIGV4dGVuc2lvbiBhcyB1bmRldGVjdGVkLiAgKi8KKyAgdmJlX2Rl dGVjdGVkID0gMDsKKworICAvKiBVc2UgbG93IG1lbW9yeSBzY3JhdGNoIGFyZWEgYXMgdGVt cG9yYXJ5IHN0b3JhZ2UgZm9yIFZFU0EgQklPUyBjYWxsLiAgKi8KKyAgdmJlX2liID0gKHN0 cnVjdCBncnViX3ZiZV9pbmZvX2Jsb2NrICopIEdSVUJfTUVNT1JZX01BQ0hJTkVfU0NSQVRD SF9BRERSOworCisgIC8qIFByZXBhcmUgaW5mbyBibG9jay4gICovCisgIGdydWJfbWVtc2V0 ICh2YmVfaWIsIDAsIHNpemVvZihzdHJ1Y3QgZ3J1Yl92YmVfaW5mb19ibG9jaykpOworCisg IHZiZV9pYi0+c2lnbmF0dXJlWzBdID0gJ1YnOworICB2YmVfaWItPnNpZ25hdHVyZVsxXSA9 ICdCJzsKKyAgdmJlX2liLT5zaWduYXR1cmVbMl0gPSAnRSc7CisgIHZiZV9pYi0+c2lnbmF0 dXJlWzNdID0gJzInOworCisgIC8qIFRyeSB0byBnZXQgY29udHJvbGxlciBpbmZvIGJsb2Nr LiAgKi8KKyAgcmMgPSBncnViX3ZiZV9nZXRfY29udHJvbGxlcl9pbmZvICh2YmVfaWIpOwor ICBpZiAocmMgIT0gMHgwMDRGKQorICAgIHsKKyAgICAgIHJldHVybiBHUlVCX0VSUl9CQURf REVWSUNFOworICAgIH0KKworICAvKiBDb3B5IGl0IGZvciBsYXRlciB1c2FnZS4gICovCisg IGdydWJfbWVtY3B5ICgmY29udHJvbGxlcl9pbmZvLAorCSAgICAgICB2YmVfaWIsCisJICAg ICAgIHNpemVvZihzdHJ1Y3QgZ3J1Yl92YmVfaW5mb19ibG9jaykpOworCisgIC8qIE1hcmsg VkVTQSBCSU9TIGV4dGVuc2lvbiBhcyBkZXRlY3RlZC4gICovCisgIHZiZV9kZXRlY3RlZCA9 IDE7CisKKyAgcmV0dXJuIEdSVUJfRVJSX05PTkU7Cit9CisKK3N0YXRpYyBncnViX2Vycl90 CitncnViX3Zlc2FmYl9zZXRfbW9kZSAoZ3J1Yl91aW50MzJfdCBtb2RlKQoreworICBncnVi X3VpbnQzMl90IHJjOworCisgIC8qIElmIGdydWJfdmVzYWZiX3Byb2JlIGhhcyBub3QgYmVl biBjYWxsZWQgb3Igbm8gVkJFLCBhYm9ydC4gICovCisgIGlmICh2YmVfZGV0ZWN0ZWQgPT0g MCkKKyAgICB7CisgICAgICByZXR1cm4gR1JVQl9FUlJfQkFEX0RFVklDRTsKKyAgICB9CisK KyAgLyogVHJ5IHRvIGdldCBtb2RlIGluZm8uICAqLworICByYyA9IGdydWJfdmVzYWZiX2dl dF9tb2RlX2luZm8gKG1vZGUsICZhY3RpdmVfbW9kZV9pbmZvKTsKKyAgaWYgKHJjICE9IEdS VUJfRVJSX05PTkUpCisgICAgeworICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAvKiBG b3IgYWxsIFZFU0EgQklPUyBtb2RlcywgZm9yY2UgbGluZWFyIGZyYW1lIGJ1ZmZlci4gICov CisgIGlmIChtb2RlID49IDB4MTAwKQorICAgIHsKKyAgICAgIC8qIFdlIG9ubHkgd2FudCBs aW5lYXIgZnJhbWUgYnVmZmVyIG1vZGVzLiAgKi8KKyAgICAgIG1vZGUgfD0gMSA8PCAxNDsK KworICAgICAgLyogRGV0ZXJtaW5lIGZyYW1lIGJ1ZmZlciBwaXhlbCBmb3JtYXQuICAqLwor ICAgICAgc3dpdGNoKGFjdGl2ZV9tb2RlX2luZm8ubWVtb3J5X21vZGVsKQorCXsKKwljYXNl IDB4MDQ6CisJICBpbmRleF9jb2xvcl9tb2RlID0gMTsKKwkgIGJyZWFrOworCisJY2FzZSAw eDA2OgorCSAgaW5kZXhfY29sb3JfbW9kZSA9IDA7CisJICBicmVhazsKKworCWRlZmF1bHQ6 CisJICByZXR1cm4gR1JVQl9FUlJfQkFEX0RFVklDRTsKKwl9CisgICAgfQorCisgIC8qIFRy eSB0byBzZXQgdmlkZW8gbW9kZS4gICovCisgIHJjID0gZ3J1Yl92YmVfc2V0X21vZGUgKG1v ZGUsIDApOworICBpZiAocmMgIT0gMHgwMDRGKQorICAgIHsKKyAgICAgIHJldHVybiBHUlVC X0VSUl9CQURfREVWSUNFOworICAgIH0KKworICAvKiBTYXZlIGluZm9ybWF0aW9uIGZvciBs YXRlciB1c2FnZS4gICovCisgIGFjdGl2ZV9tb2RlID0gbW9kZTsKKworICBpZiAobW9kZSA8 IDB4MTAwKQorICAgIHsKKyAgICAgIC8qIElmIHRoaXMgaXMgbm90IGEgVkVTQSBtb2RlLCBn dWVzcyBhZGRyZXNzLiAgKi8KKyAgICAgIGZyYW1lYnVmZmVyID0gKGdydWJfdWludDhfdCAq KTB4QTAwMDA7CisgICAgICBpbmRleF9jb2xvcl9tb2RlID0gMTsKKyAgICB9CisgIGVsc2UK KyAgICB7CisgICAgICBmcmFtZWJ1ZmZlciA9IChncnViX3VpbnQ4X3QgKilhY3RpdmVfbW9k ZV9pbmZvLnBoeXNfYmFzZV9hZGRyOworCisgICAgICBpZiAoY29udHJvbGxlcl9pbmZvLnZl cnNpb24gPj0gMHgzMDApCisJeworCSAgYnl0ZXNfcGVyX3NjYW5fbGluZSA9IGFjdGl2ZV9t b2RlX2luZm8ubGluX2J5dGVzX3Blcl9zY2FuX2xpbmU7CisJfQorICAgICAgZWxzZQorCXsK KwkgIGJ5dGVzX3Blcl9zY2FuX2xpbmUgPSBhY3RpdmVfbW9kZV9pbmZvLmJ5dGVzX3Blcl9z Y2FuX2xpbmU7CisJfQorICAgIH0KKworICByZXR1cm4gR1JVQl9FUlJfTk9ORTsKK30KKwor c3RhdGljIGdydWJfZXJyX3QKK2dydWJfdmVzYWZiX2dldF9tb2RlIChncnViX3VpbnQzMl90 ICptb2RlKQoreworICBncnViX3VpbnQzMl90IHJjOworCisgIC8qIElmIGdydWJfdmVzYWZi X3Byb2JlIGhhcyBub3QgYmVlbiBjYWxsZWQgb3Igbm8gVkJFLCBhYm9ydC4gICovCisgIGlm ICh2YmVfZGV0ZWN0ZWQgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gR1JVQl9FUlJfQkFE X0RFVklDRTsKKyAgICB9CisKKyAgLyogVHJ5IHRvIHF1ZXJ5IGN1cnJlbnQgbW9kZSBmcm9t IFZFU0EgQklPUy4gICovCisgIHJjID0gZ3J1Yl92YmVfZ2V0X21vZGUgKG1vZGUpOworICBp ZiAocmMgIT0gMHgwMDRGKQorICAgIHsKKyAgICAgIHJldHVybiBHUlVCX0VSUl9CQURfREVW SUNFOworICAgIH0KKworICByZXR1cm4gR1JVQl9FUlJfTk9ORTsKK30KKworc3RhdGljIGdy dWJfZXJyX3QKK2dydWJfdmVzYWZiX2dldF9tb2RlX2luZm8gKGdydWJfdWludDMyX3QgbW9k ZSwgc3RydWN0IGdydWJfdmJlX21vZGVfaW5mb19ibG9jayAqbW9kZV9pbmZvKQoreworICBz dHJ1Y3QgZ3J1Yl92YmVfbW9kZV9pbmZvX2Jsb2NrICptaV90bXAgPSAoc3RydWN0IGdydWJf dmJlX21vZGVfaW5mb19ibG9jayAqKSBHUlVCX01FTU9SWV9NQUNISU5FX1NDUkFUQ0hfQURE UjsKKyAgZ3J1Yl91aW50MzJfdCByYzsKKworICAvKiBJZiBncnViX3Zlc2FmYl9wcm9iZSBo YXMgbm90IGJlZW4gY2FsbGVkIG9yIG5vIFZCRSwgYWJvcnQuICAqLworICBpZiAodmJlX2Rl dGVjdGVkID09IDApCisgICAgeworICAgICAgcmV0dXJuIEdSVUJfRVJSX0JBRF9ERVZJQ0U7 CisgICAgfQorCisgIC8qIElmIG1vZGUgaXMgbm90IFZFU0EgbW9kZSwgc2tpcCBtb2RlIGlu Zm8gcXVlcnkuICAqLworICBpZiAobW9kZSA+PSAweDEwMCkKKyAgICB7CisgICAgICAvKiBU cnkgdG8gZ2V0IG1vZGUgaW5mbyBmcm9tIFZFU0EgQklPUy4gICovCisgICAgICByYyA9IGdy dWJfdmJlX2dldF9tb2RlX2luZm8gKG1vZGUsIG1pX3RtcCk7CisgICAgICBpZiAocmMgIT0g MHgwMDRGKQorCXsKKwkgIHJldHVybiBHUlVCX0VSUl9CQURfREVWSUNFOworCX0KKworICAg ICAgLyogTWFrZSBjb3B5IG9mIG1vZGUgaW5mbyBibG9jay4gICovCisgICAgICBncnViX21l bWNweSAobW9kZV9pbmZvLAorCQkgICBtaV90bXAsCisJCSAgIHNpemVvZihzdHJ1Y3QgZ3J1 Yl92YmVfbW9kZV9pbmZvX2Jsb2NrKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAg LyogSnVzdCBjbGVhciBtb2RlIGluZm8gYmxvY2sgaWYgaXQgaXNuJ3QgYSBWRVNBIG1vZGUu ICAqLworICAgICAgZ3J1Yl9tZW1zZXQgKG1vZGVfaW5mbywKKwkJICAgMCwKKwkJICAgc2l6 ZW9mKHN0cnVjdCBncnViX3ZiZV9tb2RlX2luZm9fYmxvY2spKTsKKyAgICB9CisKKyAgcmV0 dXJuIEdSVUJfRVJSX05PTkU7Cit9CisKK3N0YXRpYyB2b2lkCitncnViX3Zlc2FmYl9zZXRf cGl4ZWxfcmdiIChncnViX3VpbnQzMl90IHgsIGdydWJfdWludDMyX3QgeSwgZ3J1Yl91aW50 OF90IHJlZCwgZ3J1Yl91aW50OF90IGdyZWVuLCBncnViX3VpbnQ4X3QgYmx1ZSkKK3sKKyAg Z3J1Yl91aW50MzJfdCB2YWx1ZTsKKworICBpZiAoeCA+PSBhY3RpdmVfbW9kZV9pbmZvLnhf cmVzb2x1dGlvbikKKyAgICByZXR1cm47CisKKyAgaWYgKHkgPj0gYWN0aXZlX21vZGVfaW5m by55X3Jlc29sdXRpb24pCisgICAgcmV0dXJuOworCisgIGlmIChjb250cm9sbGVyX2luZm8u dmVyc2lvbiA+PSAweDMwMCkKKyAgICB7CisgICAgICByZWQgPj49IDggLSBhY3RpdmVfbW9k ZV9pbmZvLmxpbl9yZWRfbWFza19zaXplOworICAgICAgZ3JlZW4gPj49IDggLSBhY3RpdmVf bW9kZV9pbmZvLmxpbl9ncmVlbl9tYXNrX3NpemU7CisgICAgICBibHVlID4+PSA4IC0gYWN0 aXZlX21vZGVfaW5mby5saW5fYmx1ZV9tYXNrX3NpemU7CisKKyAgICAgIHZhbHVlID0gcmVk IDw8IGFjdGl2ZV9tb2RlX2luZm8ubGluX3JlZF9maWVsZF9wb3NpdGlvbjsKKyAgICAgIHZh bHVlIHw9IGdyZWVuIDw8IGFjdGl2ZV9tb2RlX2luZm8ubGluX2dyZWVuX2ZpZWxkX3Bvc2l0 aW9uOworICAgICAgdmFsdWUgfD0gYmx1ZSA8PCBhY3RpdmVfbW9kZV9pbmZvLmxpbl9ibHVl X2ZpZWxkX3Bvc2l0aW9uOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJlZCA+Pj0g OCAtIGFjdGl2ZV9tb2RlX2luZm8ucmVkX21hc2tfc2l6ZTsKKyAgICAgIGdyZWVuID4+PSA4 IC0gYWN0aXZlX21vZGVfaW5mby5ncmVlbl9tYXNrX3NpemU7CisgICAgICBibHVlID4+PSA4 IC0gYWN0aXZlX21vZGVfaW5mby5ibHVlX21hc2tfc2l6ZTsKKworICAgICAgdmFsdWUgPSBy ZWQgPDwgYWN0aXZlX21vZGVfaW5mby5yZWRfZmllbGRfcG9zaXRpb247CisgICAgICB2YWx1 ZSB8PSBncmVlbiA8PCBhY3RpdmVfbW9kZV9pbmZvLmdyZWVuX2ZpZWxkX3Bvc2l0aW9uOwor ICAgICAgdmFsdWUgfD0gYmx1ZSA8PCBhY3RpdmVfbW9kZV9pbmZvLmJsdWVfZmllbGRfcG9z aXRpb247CisgICAgfQorCisgIGlmIChhY3RpdmVfbW9kZV9pbmZvLmJpdHNfcGVyX3BpeGVs ID09IDMyKQorICAgIHsKKyAgICAgIGdydWJfdWludDMyX3QgKnB0ciA9IChncnViX3VpbnQz Ml90ICopKGZyYW1lYnVmZmVyICsgeSAqIGJ5dGVzX3Blcl9zY2FuX2xpbmUgKyB4ICogNCk7 CisKKyAgICAgICpwdHIgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKGFjdGl2ZV9tb2Rl X2luZm8uYml0c19wZXJfcGl4ZWwgPT0gMjQpCisgICAgeworICAgICAgZ3J1Yl91aW50OF90 ICpwdHIgPSAoZ3J1Yl91aW50OF90ICopKGZyYW1lYnVmZmVyICsgeSAqIGJ5dGVzX3Blcl9z Y2FuX2xpbmUgKyB4ICogMyk7CisgICAgICBncnViX3VpbnQ4X3QgKnB0cjIgPSAoZ3J1Yl91 aW50OF90ICopJnZhbHVlOworCisgICAgICBwdHJbMF0gPSBwdHIyWzBdOworICAgICAgcHRy WzFdID0gcHRyMlsxXTsKKyAgICAgIHB0clsyXSA9IHB0cjJbMl07CisgICAgfQorICBlbHNl IGlmICgoYWN0aXZlX21vZGVfaW5mby5iaXRzX3Blcl9waXhlbCA9PSAxNikgfHwKKwkgICAo YWN0aXZlX21vZGVfaW5mby5iaXRzX3Blcl9waXhlbCA9PSAxNSkpCisgICAgeworICAgICAg Z3J1Yl91aW50MTZfdCAqcHRyID0gKGdydWJfdWludDE2X3QgKikoZnJhbWVidWZmZXIgKyB5 ICogYnl0ZXNfcGVyX3NjYW5fbGluZSArIHggKiAyKTsKKworICAgICAgKnB0ciA9IChncnVi X3VpbnQxNl90KSh2YWx1ZSAmIDB4RkZGRik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAor Z3J1Yl92ZXNhZmJfc2V0X3BpeGVsX2luZGV4KGdydWJfdWludDMyX3QgeCwgZ3J1Yl91aW50 MzJfdCB5LCBncnViX3VpbnQ4X3QgY29sb3IpCit7CisgIGlmICh4ID49IGFjdGl2ZV9tb2Rl X2luZm8ueF9yZXNvbHV0aW9uKQorICAgIHJldHVybjsKKworICBpZiAoeSA+PSBhY3RpdmVf bW9kZV9pbmZvLnlfcmVzb2x1dGlvbikKKyAgICByZXR1cm47CisKKyAgaWYgKGluZGV4X2Nv bG9yX21vZGUgPT0gMSkKKyAgICB7CisgICAgICBncnViX3VpbnQ4X3QgKnB0ciA9IChncnVi X3VpbnQ4X3QgKikoZnJhbWVidWZmZXIgKyB5ICogYnl0ZXNfcGVyX3NjYW5fbGluZSArIHgp OworCisgICAgICAqcHRyID0gY29sb3I7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAg Y29sb3IgJj0gMHgwRjsKKworICAgICAgaWYgKGNvbG9yIDwgMTYpCisJeworCSAgZ3J1Yl92 ZXNhZmJfc2V0X3BpeGVsX3JnYiAoeCwKKwkJCQkgICAgIHksCisJCQkJICAgICB2Z2FfY29s b3JzW2NvbG9yXS5yZWQsCisJCQkJICAgICB2Z2FfY29sb3JzW2NvbG9yXS5ncmVlbiwKKwkJ CQkgICAgIHZnYV9jb2xvcnNbY29sb3JdLmJsdWUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJ ICBncnViX3Zlc2FmYl9zZXRfcGl4ZWxfcmdiICh4LAorCQkJCSAgICAgeSwKKwkJCQkgICAg IDAsCisJCQkJICAgICAwLAorCQkJCSAgICAgMHhGRik7CisJfQorICB9Cit9CisKK3N0YXRp YyB2b2lkCitncnViX3ZpcnR1YWxfc2NyZWVuX2ZyZWUgKHZvaWQpCit7CisgIC8qIElmIHZp cnR1YWwgc2NyZWVuIGhhcyBiZWVuIGFsbG9jYXRlZCwgZnJlZSBpdC4gICovCisgIGlmICh2 aXJ0dWFsX3NjcmVlbi50ZXh0X2J1ZmZlciAhPSAwKQorICAgIHsKKyAgICAgIGdydWJfZnJl ZSAodmlydHVhbF9zY3JlZW4udGV4dF9idWZmZXIpOworICAgIH0KKworICAvKiBSZXNldCB2 aXJ0dWFsIHNjcmVlbiBkYXRhLiAgKi8KKyAgZ3J1Yl9tZW1zZXQgKCZ2aXJ0dWFsX3NjcmVl biwgMCwgc2l6ZW9mKHZpcnR1YWxfc2NyZWVuKSk7Cit9CisKK3N0YXRpYyBncnViX2Vycl90 CitncnViX3ZpcnR1YWxfc2NyZWVuX3NldHVwIChncnViX3VpbnQzMl90IHdpZHRoLAorCQkJ ICAgZ3J1Yl91aW50MzJfdCBoZWlnaHQpCit7CisgIC8qIEZyZWUgb2xkIHZpcnR1YWwgc2Ny ZWVuLiAgKi8KKyAgZ3J1Yl92aXJ0dWFsX3NjcmVlbl9mcmVlICgpOworCisgIC8qIEluaXRp YWxpemUgd2l0aCBkZWZhdWx0IGRhdGEuICAqLworICB2aXJ0dWFsX3NjcmVlbi53aWR0aCA9 IHdpZHRoOworICB2aXJ0dWFsX3NjcmVlbi5oZWlnaHQgPSBoZWlnaHQ7CisgIHZpcnR1YWxf c2NyZWVuLm9mZnNldF94ID0gMDsKKyAgdmlydHVhbF9zY3JlZW4ub2Zmc2V0X3kgPSAwOwor ICB2aXJ0dWFsX3NjcmVlbi5jaGFyX3dpZHRoID0gREVGQVVMVF9DSEFSX1dJRFRIOworICB2 aXJ0dWFsX3NjcmVlbi5jaGFyX2hlaWdodCA9IERFRkFVTFRfQ0hBUl9IRUlHSFQ7CisgIHZp cnR1YWxfc2NyZWVuLmN1cnNvcl94ID0gMDsKKyAgdmlydHVhbF9zY3JlZW4uY3Vyc29yX3kg PSAwOworICB2aXJ0dWFsX3NjcmVlbi5jdXJzb3Jfc3RhdGUgPSAxOworICB2aXJ0dWFsX3Nj cmVlbi5mZ19jb2xvciA9IERFRkFVTFRfRkdfQ09MT1I7CisgIHZpcnR1YWxfc2NyZWVuLmJn X2NvbG9yID0gREVGQVVMVF9CR19DT0xPUjsKKworICAvKiBDYWxjdWxhdGUgc2l6ZSBvZiB0 ZXh0IGJ1ZmZlci4gICovCisgIHZpcnR1YWxfc2NyZWVuLmNvbHVtbnMgPSB2aXJ0dWFsX3Nj cmVlbi53aWR0aCAvIHZpcnR1YWxfc2NyZWVuLmNoYXJfd2lkdGg7CisgIHZpcnR1YWxfc2Ny ZWVuLnJvd3MgPSB2aXJ0dWFsX3NjcmVlbi5oZWlnaHQgLyB2aXJ0dWFsX3NjcmVlbi5jaGFy X2hlaWdodDsKKworICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRleHQgYnVmZmVyLiAgKi8K KyAgdmlydHVhbF9zY3JlZW4udGV4dF9idWZmZXIgPQorICAgIChzdHJ1Y3QgZ3J1Yl9jb2xv cmVkX2NoYXIgKilncnViX21hbGxvYyAodmlydHVhbF9zY3JlZW4uY29sdW1ucyAqCisJCQkJ CSAgICAgdmlydHVhbF9zY3JlZW4ucm93cyAqCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBn cnViX2NvbG9yZWRfY2hhcikpOworICBpZiAodmlydHVhbF9zY3JlZW4udGV4dF9idWZmZXIg PT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gR1JVQl9FUlJfT1VUX09GX01FTU9SWTsKKyAg ICB9CisKKyAgcmV0dXJuIEdSVUJfRVJSX05PTkU7Cit9CisKK3N0YXRpYyBncnViX2Vycl90 CitncnViX3Zlc2FmYl9pbml0ICh2b2lkKQoreworICBncnViX3VpbnQzMl90IHJjOworICBn cnViX3VpbnQzMl90IHVzZV9tb2RlID0gREVGQVVMVF9WQkVfTU9ERTsKKyAgY2hhciAqbW9k ZXZhcjsKKworICAvKiBVc2UgZm9udHMgZnJvbSBWR0EgYmlvcy4gICovCisgIHZnYV9mb250 ID0gZ3J1Yl92Z2FfZ2V0X2ZvbnQgKCk7CisKKyAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBWRVNB IEJJT1MgaW5zdGFsbGVkLiAgKi8KKyAgcmMgPSBncnViX3Zlc2FmYl9wcm9iZSAoKTsKKyAg aWYgKHJjICE9IEdSVUJfRVJSX05PTkUpCisgICAgeworICAgICAgcmV0dXJuIHJjOworICAg IH0KKworICAvKiBDaGVjayBleGlzdGVuY2Ugb2YgdmJlX21vZGUgZW52aXJvbm1lbnQgdmFy aWFibGUuICAqLworICBtb2RldmFyID0gZ3J1Yl9lbnZfZ2V0ICgidmJlX21vZGUiKTsKKwor ICBpZiAobW9kZXZhciAhPSAwKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUg PSAwOworCisgICAgICBpZiAoKGdydWJfc3RybmNtcCAobW9kZXZhciwgIjB4IiwgMikgPT0g MCkgfHwKKwkgIChncnViX3N0cm5jbXAgKG1vZGV2YXIsICIwWCIsIDIpID09IDApKQorCXsK KwkgIC8qIENvbnZlcnQgSEVYIG1vZGUgbnVtYmVyLiAgKi8KKwkgIHZhbHVlID0gZ3J1Yl9z dHJ0b3VsIChtb2RldmFyICsgMiwgMCwgMTYpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAv KiBDb252ZXJ0IERFQyBtb2RlIG51bWJlci4gICovCisJICB2YWx1ZSA9IGdydWJfc3RydG91 bCAobW9kZXZhciwgMCwgMTApOworCX0KKworICAgICAgaWYgKHZhbHVlICE9IDApCisJewor CSAgdXNlX21vZGUgPSB2YWx1ZTsKKwl9CisgICAgfQorCisgIC8qIFN0b3JlIGluaXRpYWwg dmlkZW8gbW9kZS4gICovCisgIHJjID0gZ3J1Yl92ZXNhZmJfZ2V0X21vZGUgKCZvbGRfbW9k ZSk7CisKKyAgLyogU2V0dXAgZGVzaXJlZCBncmFwaGljcyBtb2RlLiAgKi8KKyAgcmMgPSBn cnViX3Zlc2FmYl9zZXRfbW9kZSAodXNlX21vZGUpOworICBpZiAocmMgIT0gR1JVQl9FUlJf Tk9ORSkKKyAgICB7CisgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgIC8qIENyZWF0ZSB2 aXJ0dWFsIHNjcmVlbi4gICovCisgIHJjID0gZ3J1Yl92aXJ0dWFsX3NjcmVlbl9zZXR1cCAo YWN0aXZlX21vZGVfaW5mby54X3Jlc29sdXRpb24sCisJCQkJICBhY3RpdmVfbW9kZV9pbmZv LnlfcmVzb2x1dGlvbik7CisgIGlmIChyYyAhPSBHUlVCX0VSUl9OT05FKQorICAgIHsKKyAg ICAgIGdydWJfdmVzYWZiX3NldF9tb2RlIChvbGRfbW9kZSk7CisgICAgICByZXR1cm4gcmM7 CisgICAgfQorCisgIC8qIE1ha2Ugc3VyZSBmcmFtZSBidWZmZXIgaXMgYmxhY2suICAqLwor ICBncnViX21lbXNldCAoZnJhbWVidWZmZXIsCisJICAgICAgIDAsCisJICAgICAgIGJ5dGVz X3Blcl9zY2FuX2xpbmUgKiBhY3RpdmVfbW9kZV9pbmZvLnlfcmVzb2x1dGlvbik7CisKKyAg cmV0dXJuIEdSVUJfRVJSX05PTkU7Cit9CisKK3N0YXRpYyBncnViX2Vycl90CitncnViX3Zl c2FmYl9maW5pICh2b2lkKQoreworICBncnViX3ZpcnR1YWxfc2NyZWVuX2ZyZWUgKCk7CisK KyAgZ3J1Yl92ZXNhZmJfc2V0X21vZGUgKG9sZF9tb2RlKTsKKworICByZXR1cm4gR1JVQl9F UlJfTk9ORTsKK30KKworc3RhdGljIGludAorZ3J1Yl92aXJ0dWFsX3NjcmVlbl9nZXRfZ2x5 cGggKGdydWJfdWludDMyX3QgY29kZSwKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyIGJpdG1h cFszMl0sCisJCQkgICAgICAgdW5zaWduZWQgKndpZHRoKQoreworICBpZiAoY29kZSA+IDB4 N2YpCisgICAgeworICAgICAgLyogTWFwIHNvbWUgdW5pY29kZSBjaGFyYWN0ZXJzIHRvIHRo ZSBWR0EgZm9udCwgaWYgcG9zc2libGUuICAqLworICAgICAgc3dpdGNoIChjb2RlKQorCXsK KwljYXNlIDB4MjE5MDoJLyogbGVmdCBhcnJvdyAqLworCSAgY29kZSA9IDB4MWI7CisJICBi cmVhazsKKwljYXNlIDB4MjE5MToJLyogdXAgYXJyb3cgKi8KKwkgIGNvZGUgPSAweDE4Owor CSAgYnJlYWs7CisJY2FzZSAweDIxOTI6CS8qIHJpZ2h0IGFycm93ICovCisJICBjb2RlID0g MHgxYTsKKwkgIGJyZWFrOworCWNhc2UgMHgyMTkzOgkvKiBkb3duIGFycm93ICovCisJICBj b2RlID0gMHgxOTsKKwkgIGJyZWFrOworCWNhc2UgMHgyNTAxOgkvKiBob3Jpem9udGFsIGxp bmUgKi8KKwkgIGNvZGUgPSAweGM0OworCSAgYnJlYWs7CisJY2FzZSAweDI1MDM6CS8qIHZl cnRpY2FsIGxpbmUgKi8KKwkgIGNvZGUgPSAweGIzOworCSAgYnJlYWs7CisJY2FzZSAweDI1 MEY6CS8qIHVwcGVyLWxlZnQgY29ybmVyICovCisJICBjb2RlID0gMHhkYTsKKwkgIGJyZWFr OworCWNhc2UgMHgyNTEzOgkvKiB1cHBlci1yaWdodCBjb3JuZXIgKi8KKwkgIGNvZGUgPSAw eGJmOworCSAgYnJlYWs7CisJY2FzZSAweDI1MTc6CS8qIGxvd2VyLWxlZnQgY29ybmVyICov CisJICBjb2RlID0gMHhjMDsKKwkgIGJyZWFrOworCWNhc2UgMHgyNTFCOgkvKiBsb3dlci1y aWdodCBjb3JuZXIgKi8KKwkgIGNvZGUgPSAweGQ5OworCSAgYnJlYWs7CisKKwlkZWZhdWx0 OgorCSAgcmV0dXJuIGdydWJfZm9udF9nZXRfZ2x5cGggKGNvZGUsIGJpdG1hcCwgd2lkdGgp OworCX0KKyAgICB9CisKKyAgaWYgKGJpdG1hcCkKKyAgICBncnViX21lbWNweSAoYml0bWFw LAorCQkgdmdhX2ZvbnQgKyBjb2RlICogdmlydHVhbF9zY3JlZW4uY2hhcl9oZWlnaHQsCisJ CSB2aXJ0dWFsX3NjcmVlbi5jaGFyX2hlaWdodCk7CisgICp3aWR0aCA9IDE7CisgIHJldHVy biAxOworfQorCitzdGF0aWMgdm9pZAorZ3J1Yl92aXJ0dWFsX3NjcmVlbl9pbnZhbGlkYXRl X2NoYXIgKHN0cnVjdCBncnViX2NvbG9yZWRfY2hhciAqcCkKK3sKKyAgcC0+Y29kZSA9IDB4 RkZGRjsKKyAgCisgIGlmIChwLT53aWR0aCkKKyAgICB7CisgICAgICBzdHJ1Y3QgZ3J1Yl9j b2xvcmVkX2NoYXIgKnE7CisKKyAgICAgIGZvciAocSA9IHAgKyAxOyBxIDw9IHAgKyBwLT53 aWR0aDsgcSsrKQorCXsKKwkgIHEtPmNvZGUgPSAweEZGRkY7CisJICBxLT53aWR0aCA9IDA7 CisJICBxLT5pbmRleCA9IDA7CisJfQorICAgIH0KKworICBwLT53aWR0aCA9IDA7Cit9CisK K3N0YXRpYyB2b2lkCit3cml0ZV9jaGFyICh2b2lkKQoreworICBzdHJ1Y3QgZ3J1Yl9jb2xv cmVkX2NoYXIgKnA7CisgIHVuc2lnbmVkIGNoYXIgYml0bWFwWzMyXTsKKyAgdW5zaWduZWQg d2lkdGg7CisKKyAgcCA9ICh2aXJ0dWFsX3NjcmVlbi50ZXh0X2J1ZmZlciArCisgICAgICAg dmlydHVhbF9zY3JlZW4uY3Vyc29yX3ggKworICAgICAgICh2aXJ0dWFsX3NjcmVlbi5jdXJz b3JfeSAqIHZpcnR1YWxfc2NyZWVuLmNvbHVtbnMpKTsKKworICBwIC09IHAtPmluZGV4Owor CisgIGlmICghIGdydWJfdmlydHVhbF9zY3JlZW5fZ2V0X2dseXBoIChwLT5jb2RlLCBiaXRt YXAsICZ3aWR0aCkpCisgICAgeworICAgICAgZ3J1Yl92aXJ0dWFsX3NjcmVlbl9pbnZhbGlk YXRlX2NoYXIgKHApOworICAgICAgd2lkdGggPSAwOworICAgIH0KKworICB1bnNpZ25lZCB5 OworICB1bnNpZ25lZCBvZmZzZXQ7CisKKyAgZm9yICh5ID0gMCwgb2Zmc2V0ID0gMDsKKyAg ICAgICB5IDwgdmlydHVhbF9zY3JlZW4uY2hhcl9oZWlnaHQ7CisgICAgICAgeSsrLCBvZmZz ZXQrKykKKyAgICB7CisgICAgICB1bnNpZ25lZCBpOworCisgICAgICBmb3IgKGkgPSAwOwor CSAgIChpIDwgd2lkdGggKiB2aXJ0dWFsX3NjcmVlbi5jaGFyX3dpZHRoKSAmJiAob2Zmc2V0 IDwgMzIpOworCSAgIGkrKykKKwl7CisJICB1bnNpZ25lZCBjaGFyIGNvbG9yOworCisJICBp ZiAoYml0bWFwW29mZnNldF0gJiAoMTw8KDgtaSkpKQorCSAgICB7CisJICAgICAgY29sb3Ig PSBwLT5mZ19jb2xvcjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgY29sb3Ig PSBwLT5iZ19jb2xvcjsKKwkgICAgfQorCisJICBncnViX3Zlc2FmYl9zZXRfcGl4ZWxfaW5k ZXgoaSArICh2aXJ0dWFsX3NjcmVlbi5jdXJzb3JfeCAqIHZpcnR1YWxfc2NyZWVuLmNoYXJf d2lkdGgpLAorCQkJCSAgICAgIHkgKyAodmlydHVhbF9zY3JlZW4uY3Vyc29yX3kgKiB2aXJ0 dWFsX3NjcmVlbi5jaGFyX2hlaWdodCksCisJCQkJICAgICAgY29sb3IpOworCX0KKyAgICB9 Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZV9jdXJzb3IgKHZvaWQpCit7CisgIGdydWJfdWlu dDMyX3QgeDsKKyAgZ3J1Yl91aW50MzJfdCB5OworCisgIGZvciAoeSA9ICgodmlydHVhbF9z Y3JlZW4uY3Vyc29yX3kgKyAxKSAqIHZpcnR1YWxfc2NyZWVuLmNoYXJfaGVpZ2h0KSAtIDM7 CisgICAgICAgeSA8ICgodmlydHVhbF9zY3JlZW4uY3Vyc29yX3kgKyAxKSAqIHZpcnR1YWxf c2NyZWVuLmNoYXJfaGVpZ2h0KSAtIDE7CisgICAgICAgeSsrKQorICAgIHsKKyAgICAgIGZv ciAoeCA9IHZpcnR1YWxfc2NyZWVuLmN1cnNvcl94ICogdmlydHVhbF9zY3JlZW4uY2hhcl93 aWR0aDsKKwkgICB4IDwgKHZpcnR1YWxfc2NyZWVuLmN1cnNvcl94ICsgMSkgKiB2aXJ0dWFs X3NjcmVlbi5jaGFyX3dpZHRoOworCSAgIHgrKykKKwl7CisJICBncnViX3Zlc2FmYl9zZXRf cGl4ZWxfaW5kZXgoeCwgeSwgMTApOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitz Y3JvbGxfdXAgKHZvaWQpCit7CisgIGdydWJfdWludDMyX3QgaTsKKworICAvKiBTY3JvbGwg dGV4dCBidWZmZXIgd2l0aCBvbmUgbGluZSB0byB1cC4gICovCisgIGdydWJfbWVtbW92ZSAo dmlydHVhbF9zY3JlZW4udGV4dF9idWZmZXIsCisJCXZpcnR1YWxfc2NyZWVuLnRleHRfYnVm ZmVyICsgdmlydHVhbF9zY3JlZW4uY29sdW1ucywKKwkJc2l6ZW9mIChzdHJ1Y3QgZ3J1Yl9j b2xvcmVkX2NoYXIpICoKKwkJdmlydHVhbF9zY3JlZW4uY29sdW1ucyAqCisJCSh2aXJ0dWFs X3NjcmVlbi5yb3dzIC0gMSkpOworCisgIC8qIENsZWFyIGxhc3QgbGluZSBpbiB0ZXh0IGJ1 ZmZlci4gICovCisgIGZvciAoaSA9IHZpcnR1YWxfc2NyZWVuLmNvbHVtbnMgKiAodmlydHVh bF9zY3JlZW4ucm93cyAtIDEpOworICAgICAgIGkgPCB2aXJ0dWFsX3NjcmVlbi5jb2x1bW5z ICogdmlydHVhbF9zY3JlZW4ucm93czsKKyAgICAgICBpKyspCisgICAgeworICAgICAgdmly dHVhbF9zY3JlZW4udGV4dF9idWZmZXJbaV0uY29kZSA9ICcgJzsKKyAgICAgIHZpcnR1YWxf c2NyZWVuLnRleHRfYnVmZmVyW2ldLmZnX2NvbG9yID0gMDsKKyAgICAgIHZpcnR1YWxfc2Ny ZWVuLnRleHRfYnVmZmVyW2ldLmJnX2NvbG9yID0gMDsKKyAgICAgIHZpcnR1YWxfc2NyZWVu LnRleHRfYnVmZmVyW2ldLndpZHRoID0gMDsKKyAgICAgIHZpcnR1YWxfc2NyZWVuLnRleHRf YnVmZmVyW2ldLmluZGV4ID0gMDsKKyAgICB9CisKKyAgLyogU2Nyb2xsIGZyYW1idWZmZXIg d2l0aCBvbmUgbGluZSB0byB1cC4gICovCisgIGdydWJfbWVtbW92ZSAoZnJhbWVidWZmZXIs CisJCWZyYW1lYnVmZmVyICsgYnl0ZXNfcGVyX3NjYW5fbGluZSAqIHZpcnR1YWxfc2NyZWVu LmNoYXJfaGVpZ2h0LAorCQlieXRlc19wZXJfc2Nhbl9saW5lICoKKwkJKGFjdGl2ZV9tb2Rl X2luZm8ueV9yZXNvbHV0aW9uIC0gdmlydHVhbF9zY3JlZW4uY2hhcl9oZWlnaHQpKTsKKwor ICAvKiBDbGVhciBsYXN0IGxpbmUgaW4gZnJhbWVidWZmZXIuICAqLworICBncnViX21lbXNl dCAoZnJhbWVidWZmZXIgKworCSAgICAgICAoYnl0ZXNfcGVyX3NjYW5fbGluZSAqCisJCShh Y3RpdmVfbW9kZV9pbmZvLnlfcmVzb2x1dGlvbiAtIHZpcnR1YWxfc2NyZWVuLmNoYXJfaGVp Z2h0KSksCisJICAgICAgIDAsCisJICAgICAgIGJ5dGVzX3Blcl9zY2FuX2xpbmUgKiB2aXJ0 dWFsX3NjcmVlbi5jaGFyX2hlaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkCitncnViX3Zlc2Fm Yl9wdXRjaGFyIChncnViX3VpbnQzMl90IGMpCit7CisgIGlmIChjID09ICdcYScpCisgICAg LyogRklYTUUgKi8KKyAgICByZXR1cm47CisKKyAgaWYgKGMgPT0gJ1xiJyB8fCBjID09ICdc bicgfHwgYyA9PSAnXHInKQorICAgIHsKKyAgICAgIC8qIEVyYXNlIGN1cnJlbnQgY3Vyc29y LCBpZiBhbnkuICAqLworICAgICAgaWYgKHZpcnR1YWxfc2NyZWVuLmN1cnNvcl9zdGF0ZSkK Kwl3cml0ZV9jaGFyICgpOworICAKKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSAnXGIn OgorCSAgaWYgKHZpcnR1YWxfc2NyZWVuLmN1cnNvcl94ID4gMCkKKwkgICAgdmlydHVhbF9z Y3JlZW4uY3Vyc29yX3gtLTsKKwkgIGJyZWFrOworCSAgCisJY2FzZSAnXG4nOgorCSAgaWYg KHZpcnR1YWxfc2NyZWVuLmN1cnNvcl95ID49IHZpcnR1YWxfc2NyZWVuLnJvd3MgLSAxKQor CSAgICBzY3JvbGxfdXAgKCk7CisJICBlbHNlCisJICAgIHZpcnR1YWxfc2NyZWVuLmN1cnNv cl95Kys7CisJICBicmVhazsKKwkgIAorCWNhc2UgJ1xyJzoKKwkgIHZpcnR1YWxfc2NyZWVu LmN1cnNvcl94ID0gMDsKKwkgIGJyZWFrOworCX0KKworICAgICAgaWYgKHZpcnR1YWxfc2Ny ZWVuLmN1cnNvcl9zdGF0ZSkKKwl3cml0ZV9jdXJzb3IgKCk7CisgICAgfQorICBlbHNlCisg ICAgeworICAgICAgdW5zaWduZWQgd2lkdGg7CisgICAgICBzdHJ1Y3QgZ3J1Yl9jb2xvcmVk X2NoYXIgKnA7CisgICAgICAKKyAgICAgIGdydWJfdmlydHVhbF9zY3JlZW5fZ2V0X2dseXBo IChjLCAwLCAmd2lkdGgpOworCisgICAgICBpZiAodmlydHVhbF9zY3JlZW4uY3Vyc29yX3gg KyB3aWR0aCA+IHZpcnR1YWxfc2NyZWVuLmNvbHVtbnMpCisJZ3J1Yl9wdXRjaGFyICgnXG4n KTsKKworICAgICAgcCA9IHZpcnR1YWxfc2NyZWVuLnRleHRfYnVmZmVyICsKKwl2aXJ0dWFs X3NjcmVlbi5jdXJzb3JfeCArCisJdmlydHVhbF9zY3JlZW4uY3Vyc29yX3kgKiB2aXJ0dWFs X3NjcmVlbi5jb2x1bW5zOworICAgICAgcC0+Y29kZSA9IGM7CisgICAgICBwLT5mZ19jb2xv ciA9IHZpcnR1YWxfc2NyZWVuLmZnX2NvbG9yOworICAgICAgcC0+YmdfY29sb3IgPSB2aXJ0 dWFsX3NjcmVlbi5iZ19jb2xvcjsKKyAgICAgIHAtPndpZHRoID0gd2lkdGggLSAxOworICAg ICAgcC0+aW5kZXggPSAwOworCisgICAgICBpZiAod2lkdGggPiAxKQorCXsKKwkgIHVuc2ln bmVkIGk7CisKKwkgIGZvciAoaSA9IDE7IGkgPCB3aWR0aDsgaSsrKQorCSAgICB7CisJICAg ICAgcFtpXS5jb2RlID0gJyAnOworCSAgICAgIHBbaV0ud2lkdGggPSB3aWR0aCAtIDE7CisJ ICAgICAgcFtpXS5pbmRleCA9IGk7CisJICAgIH0KKwl9CisJICAKKyAgICAgIHdyaXRlX2No YXIgKCk7CisgIAorICAgICAgdmlydHVhbF9zY3JlZW4uY3Vyc29yX3ggKz0gd2lkdGg7Cisg ICAgICBpZiAodmlydHVhbF9zY3JlZW4uY3Vyc29yX3ggPj0gdmlydHVhbF9zY3JlZW4uY29s dW1ucykKKwl7CisJICB2aXJ0dWFsX3NjcmVlbi5jdXJzb3JfeCA9IDA7CisJICAKKwkgIGlm ICh2aXJ0dWFsX3NjcmVlbi5jdXJzb3JfeSA+PSB2aXJ0dWFsX3NjcmVlbi5yb3dzIC0gMSkK KwkgICAgc2Nyb2xsX3VwICgpOworCSAgZWxzZQorCSAgICB2aXJ0dWFsX3NjcmVlbi5jdXJz b3JfeSsrOworCX0KKworICAgICAgaWYgKHZpcnR1YWxfc2NyZWVuLmN1cnNvcl9zdGF0ZSkK Kwl3cml0ZV9jdXJzb3IgKCk7CisgICAgfQorfQorCitzdGF0aWMgZ3J1Yl91aW50MTZfdAor Z3J1Yl92aXJ0dWFsX3NjcmVlbl9nZXR3aCAodm9pZCkKK3sKKyAgcmV0dXJuICh2aXJ0dWFs X3NjcmVlbi5jb2x1bW5zIDw8IDgpIHwgdmlydHVhbF9zY3JlZW4ucm93czsKK30KKworc3Rh dGljIGdydWJfdWludDE2X3QKK2dydWJfdmlydHVhbF9zY3JlZW5fZ2V0eHkgKHZvaWQpCit7 CisgIHJldHVybiAoKHZpcnR1YWxfc2NyZWVuLmN1cnNvcl94IDw8IDgpIHwgdmlydHVhbF9z Y3JlZW4uY3Vyc29yX3kpOworfQorCitzdGF0aWMgdm9pZAorZ3J1Yl92ZXNhZmJfZ290b3h5 IChncnViX3VpbnQ4X3QgeCwgZ3J1Yl91aW50OF90IHkpCit7CisgIGlmICh4ID49IHZpcnR1 YWxfc2NyZWVuLmNvbHVtbnMgfHwgeSA+PSB2aXJ0dWFsX3NjcmVlbi5yb3dzKQorICAgIHsK KyAgICAgIGdydWJfZXJyb3IgKEdSVUJfRVJSX09VVF9PRl9SQU5HRSwgImludmFsaWQgcG9p bnQgKCV1LCV1KSIsCisJCSAgKHVuc2lnbmVkKSB4LCAodW5zaWduZWQpIHkpOworICAgICAg cmV0dXJuOworICAgIH0KKworICBpZiAodmlydHVhbF9zY3JlZW4uY3Vyc29yX3N0YXRlKQor ICAgIHdyaXRlX2NoYXIgKCk7CisKKyAgdmlydHVhbF9zY3JlZW4uY3Vyc29yX3ggPSB4Owor ICB2aXJ0dWFsX3NjcmVlbi5jdXJzb3JfeSA9IHk7CisKKyAgaWYgKHZpcnR1YWxfc2NyZWVu LmN1cnNvcl9zdGF0ZSkKKyAgICB3cml0ZV9jdXJzb3IgKCk7Cit9CisKK3N0YXRpYyB2b2lk CitncnViX3ZpcnR1YWxfc2NyZWVuX2NscyAodm9pZCkKK3sKKyAgZ3J1Yl91aW50MzJfdCBp OworCisgIGZvciAoaSA9IDA7IGkgPCB2aXJ0dWFsX3NjcmVlbi5jb2x1bW5zICogdmlydHVh bF9zY3JlZW4ucm93czsgaSsrKQorICAgIHsKKyAgICAgIHZpcnR1YWxfc2NyZWVuLnRleHRf YnVmZmVyW2ldLmNvZGUgPSAnICc7CisgICAgICB2aXJ0dWFsX3NjcmVlbi50ZXh0X2J1ZmZl cltpXS5mZ19jb2xvciA9IDA7CisgICAgICB2aXJ0dWFsX3NjcmVlbi50ZXh0X2J1ZmZlcltp XS5iZ19jb2xvciA9IDA7CisgICAgICB2aXJ0dWFsX3NjcmVlbi50ZXh0X2J1ZmZlcltpXS53 aWR0aCA9IDA7CisgICAgICB2aXJ0dWFsX3NjcmVlbi50ZXh0X2J1ZmZlcltpXS5pbmRleCA9 IDA7CisgICAgfQorCisgIHZpcnR1YWxfc2NyZWVuLmN1cnNvcl94ID0gdmlydHVhbF9zY3Jl ZW4uY3Vyc29yX3kgPSAwOworfQorCitzdGF0aWMgdm9pZAorZ3J1Yl92ZXNhZmJfY2xzICh2 b2lkKQoreworICBncnViX3ZpcnR1YWxfc2NyZWVuX2NscyAoKTsKKworICBncnViX21lbXNl dCAoZnJhbWVidWZmZXIsCisgICAgICAgICAgICAgICAwLCAKKwkgICAgICAgYWN0aXZlX21v ZGVfaW5mby55X3Jlc29sdXRpb24gKiBieXRlc19wZXJfc2Nhbl9saW5lKTsKK30KKworc3Rh dGljIHZvaWQKK2dydWJfdmlydHVhbF9zY3JlZW5fc2V0Y29sb3JzdGF0ZSAoZ3J1Yl90ZXJt X2NvbG9yX3N0YXRlIHN0YXRlKQoreworICBzd2l0Y2ggKHN0YXRlKQorICAgIHsKKyAgICBj YXNlIEdSVUJfVEVSTV9DT0xPUl9TVEFOREFSRDoKKyAgICBjYXNlIEdSVUJfVEVSTV9DT0xP Ul9OT1JNQUw6CisgICAgICB2aXJ0dWFsX3NjcmVlbi5mZ19jb2xvciA9IERFRkFVTFRfRkdf Q09MT1I7CisgICAgICB2aXJ0dWFsX3NjcmVlbi5iZ19jb2xvciA9IERFRkFVTFRfQkdfQ09M T1I7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdSVUJfVEVSTV9DT0xPUl9ISUdITElHSFQ6 CisgICAgICB2aXJ0dWFsX3NjcmVlbi5mZ19jb2xvciA9IERFRkFVTFRfQkdfQ09MT1I7Cisg ICAgICB2aXJ0dWFsX3NjcmVlbi5iZ19jb2xvciA9IERFRkFVTFRfRkdfQ09MT1I7CisgICAg ICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0 aWMgdm9pZAorZ3J1Yl92aXJ0dWFsX3NjcmVlbl9zZXRjb2xvciAoZ3J1Yl91aW50OF90IG5v cm1hbF9jb2xvciBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCQkgICAgICBncnViX3Vp bnQ4X3QgaGlnaGxpZ2h0X2NvbG9yIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAg LyogRklYTUUgKi8KK30KKworc3RhdGljIHZvaWQKK2dydWJfdmVzYWZiX3NldGN1cnNvciAo aW50IG9uKQoreworICBpZiAodmlydHVhbF9zY3JlZW4uY3Vyc29yX3N0YXRlICE9IG9uKQor ICAgIHsKKyAgICAgIGlmICh2aXJ0dWFsX3NjcmVlbi5jdXJzb3Jfc3RhdGUpCisJd3JpdGVf Y2hhciAoKTsKKyAgICAgIGVsc2UKKwl3cml0ZV9jdXJzb3IgKCk7CisKKyAgICAgIHZpcnR1 YWxfc2NyZWVuLmN1cnNvcl9zdGF0ZSA9IG9uOworICAgIH0KK30KKworc3RhdGljIHZvaWQK KypyZWFsMnBtKGdydWJfdmJlX2ZhcnB0cl90IHB0cikKK3sKKyAgcmV0dXJuICh2b2lkICop KCgoKHVuc2lnbmVkIGxvbmcpcHRyICYgMHhGRkZGMDAwMCkgPj4gMTJVTCkgKworCQkgICgo dW5zaWduZWQgbG9uZylwdHIgJiAweDAwMDBGRkZGKSk7Cit9CisKK3N0YXRpYyBncnViX2Vy cl90CitncnViX2NtZF92YmVfbGlzdF9tb2RlcyhzdHJ1Y3QgZ3J1Yl9hcmdfbGlzdCAqc3Rh dGUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJaW50IGFyZ2MgX19hdHRyaWJ1dGVf XyAoKHVudXNlZCkpLAorCQkJY2hhciAqKmFyZ3MgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkp KQoreworICBncnViX3VpbnQzMl90IHJjOworICBncnViX3VpbnQxNl90ICpzcHRyOworCisg IGdydWJfcHJpbnRmICgiTGlzdCBvZiBjb21wYXRpYmxlIHZpZGVvIG1vZGVzOlxuIik7CisK KyAgcmMgPSBncnViX3Zlc2FmYl9wcm9iZSAoKTsKKworICBpZiAocmMgIT0gR1JVQl9FUlJf Tk9ORSkKKyAgICB7CisgICAgICBncnViX3ByaW50ZiAoIlZFU0EgQklPUyBFeHRlbnNpb24g bm90IGRldGVjdGVkIVxuIik7CisgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgIHNwdHIg PSByZWFsMnBtIChjb250cm9sbGVyX2luZm8udmlkZW9fbW9kZV9wdHIpOworCisgIHN0cnVj dCBncnViX3ZiZV9tb2RlX2luZm9fYmxvY2sgbW9kZV9pbmZvOworCisgIGZvciAoOypzcHRy ICE9IDB4RkZGRjsgc3B0cisrKQorICAgIHsKKyAgICAgIGludCB2YWxpZF9tb2RlID0gMTsK KworICAgICAgcmMgPSBncnViX3Zlc2FmYl9nZXRfbW9kZV9pbmZvICgqc3B0ciwgJm1vZGVf aW5mbyk7CisgICAgICBpZiAocmMgIT0gR1JVQl9FUlJfTk9ORSkgY29udGludWU7CisKKyAg ICAgIGlmICgobW9kZV9pbmZvLm1vZGVfYXR0cmlidXRlcyAmIDB4MDgwKSA9PSAwKQorCXsK KwkgIC8vIHdlIHN1cHBvcnQgb25seSBsaW5lYXIgZnJhbWUgYnVmZmVyIG1vZGVzCisJICBj b250aW51ZTsKKwl9CisKKyAgICAgIGlmICgobW9kZV9pbmZvLm1vZGVfYXR0cmlidXRlcyAm IDB4MDEwKSA9PSAwKQorCXsKKwkgIC8vIHdlIGFsbG93IG9ubHkgZ3JhcGhpYyBtb2Rlcwor CSAgY29udGludWU7CisJfQorCisgICAgICBzd2l0Y2gobW9kZV9pbmZvLm1lbW9yeV9tb2Rl bCkKKwl7CisJY2FzZSAweDA0OgorCWNhc2UgMHgwNjoKKwkgIGJyZWFrOworCisJZGVmYXVs dDoKKwkgIHZhbGlkX21vZGUgPSAwOworCSAgYnJlYWs7CisJfQorCisgICAgICBpZiAodmFs aWRfbW9kZSA9PSAwKSBjb250aW51ZTsKKworICAgICAgZ3J1Yl9wcmludGYgKCIweCUwM3g6 ICVkIHggJWQgeCAlZCBicHBcbiIsCisgICAgICAgICAgICAgICAgICAgKnNwdHIsCisgICAg ICAgICAgICAgICAgICAgbW9kZV9pbmZvLnhfcmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAg ICAgICBtb2RlX2luZm8ueV9yZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgIG1vZGVf aW5mby5iaXRzX3Blcl9waXhlbCk7CisgICAgfQorCisgIGNoYXIgKm1vZGV2YXI7CisKKyAg Ly8gQ2hlY2sgZXhpc3RlbmNlIG9mIHZiZV9tb2RlIGVudmlyb25tZW50IHZhcmlhYmxlCisg IG1vZGV2YXIgPSBncnViX2Vudl9nZXQgKCJ2YmVfbW9kZSIpOworCisgIGdydWJfdWludDMy X3QgdXNlX21vZGUgPSBERUZBVUxUX1ZCRV9NT0RFOworCisgIGlmIChtb2RldmFyICE9IDAp CisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSA9IDA7CisKKyAgICAgIGlmICgo Z3J1Yl9zdHJuY21wIChtb2RldmFyLCAiMHgiLCAyKSA9PSAwKSB8fAorCSAgKGdydWJfc3Ry bmNtcCAobW9kZXZhciwgIjBYIiwgMikgPT0gMCkpCisJeworCSAgLy8gaGV4IHZlcnNpb24K KwkgIHZhbHVlID0gZ3J1Yl9zdHJ0b3VsIChtb2RldmFyKzIsIDAsIDE2KTsKKwl9CisgICAg ICBlbHNlCisJeworCSAgLy8gZGVjIHZlcnNpb24KKwkgIHZhbHVlID0gZ3J1Yl9zdHJ0b3Vs IChtb2RldmFyLCAwLCAxMCk7CisJfQorCisgICAgICBpZiAodmFsdWUgIT0gMCkKKwl7CisJ ICB1c2VfbW9kZSA9IHZhbHVlOworCX0KKyAgICB9CisKKyAgZ3J1Yl9wcmludGYgKCJDb25m aWd1cmVkIFZCRSBtb2RlICh2YmVfbW9kZSkgPSAweCUwM3hcbiIsIHVzZV9tb2RlKTsKKwor ICByZXR1cm4gMDsKK30KKworc3RhdGljIGdydWJfZXJyX3QKK2dydWJfY21kX3ZiZV90ZXN0 KHN0cnVjdCBncnViX2FyZ19saXN0ICpzdGF0ZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSks CisJCSAgaW50IGFyZ2MgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkgIGNoYXIgKiph cmdzIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgZ3J1Yl91aW50MzJfdCByYzsK KyAgZ3J1Yl91aW50MTZfdCAqc3B0cjsKKyAgY2hhciAqbW9kZXZhcjsKKyAgc3RydWN0IGdy dWJfdmJlX21vZGVfaW5mb19ibG9jayBtb2RlX2luZm87CisgIGdydWJfdWludDMyX3QgdXNl X21vZGUgPSBERUZBVUxUX1ZCRV9NT0RFOworICB1bnNpZ25lZCBjaGFyICpwdHI7CisgIGlu dCBpOworCisgIGdydWJfcHJpbnRmICgiUHJvYmluZyBmb3IgVkVTQSBCSU9TIEV4dGVuc2lv biAuLi4gIik7CisKKyAgLy8gQ2hlY2sgaWYgVkVTQSBCSU9TIGV4aXN0cworICByYyA9IGdy dWJfdmVzYWZiX3Byb2JlKCk7CisgIGlmIChyYyAhPSBHUlVCX0VSUl9OT05FKQorICAgIHsK KyAgICAgIGdydWJfcHJpbnRmICgibm90IGZvdW5kIVxuIik7CisgICAgICByZXR1cm4gcmM7 CisgICAgfQorICBncnViX3ByaW50ZiAoImZvdW5kIVxuIik7CisKKyAgLy8gZHVtcCBvdXQg Y29udHJvbGxlciBpbmZvcm1hdGlvbgorICBncnViX3ByaW50ZiAoInZiZSBzaWduYXR1cmUg PSAlYyVjJWMlY1xuIiwKKwkgICAgICAgY29udHJvbGxlcl9pbmZvLnNpZ25hdHVyZVswXSwK KwkgICAgICAgY29udHJvbGxlcl9pbmZvLnNpZ25hdHVyZVsxXSwKKwkgICAgICAgY29udHJv bGxlcl9pbmZvLnNpZ25hdHVyZVsyXSwKKwkgICAgICAgY29udHJvbGxlcl9pbmZvLnNpZ25h dHVyZVszXSk7CisKKyAgZ3J1Yl9wcmludGYgKCJ2YmUgdmVyID0gJWQuJWRcbiIsCisJICAg ICAgIGNvbnRyb2xsZXJfaW5mby52ZXJzaW9uID4+IDgsCisJICAgICAgIGNvbnRyb2xsZXJf aW5mby52ZXJzaW9uICYgMHhGRik7CisgIGdydWJfcHJpbnRmICgib2VtIHN0cmluZyBwdHIg PSAlMDh4XG4iLAorCSAgICAgICBjb250cm9sbGVyX2luZm8ub2VtX3N0cmluZ19wdHIpOwor ICBncnViX3ByaW50ZiAoInRvdGFsIG1lbW9yeSA9ICVkXG4iLAorCSAgICAgICBjb250cm9s bGVyX2luZm8udG90YWxfbWVtb3J5KTsKKworICBzcHRyID0gcmVhbDJwbShjb250cm9sbGVy X2luZm8udmlkZW9fbW9kZV9wdHIpOworCisgIHJjID0gZ3J1Yl92ZXNhZmJfZ2V0X21vZGUo Jm9sZF9tb2RlKTsKKyAgZ3J1Yl9wcmludGYgKCJnZXQgbW9kZSByYyA9ICUwNHhcbiIsIHJj KTsKKworICBpZiAocmMgPT0gR1JVQl9FUlJfTk9ORSkKKyAgICB7CisgICAgICBncnViX3By aW50ZiAoIm9sZCBtb2RlID0gJTA0eFxuIiwgb2xkX21vZGUpOworICAgIH0KKworICAvLyBD aGVjayBleGlzdGVuY2Ugb2YgdmJlX21vZGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgbW9k ZXZhciA9IGdydWJfZW52X2dldCAoInZiZV9tb2RlIik7CisgIGlmIChtb2RldmFyICE9IDAp CisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSA9IDA7CisKKyAgICAgIGlmICgo Z3J1Yl9zdHJuY21wIChtb2RldmFyLCAiMHgiLCAyKSA9PSAwKSB8fAorCSAgKGdydWJfc3Ry bmNtcCAobW9kZXZhciwgIjBYIiwgMikgPT0gMCkpCisJeworCSAgLy8gaGV4IHZlcnNpb24K KwkgIHZhbHVlID0gZ3J1Yl9zdHJ0b3VsIChtb2RldmFyKzIsIDAsIDE2KTsKKwl9CisgICAg ICBlbHNlCisJeworCSAgLy8gZGVjIHZlcnNpb24KKwkgIHZhbHVlID0gZ3J1Yl9zdHJ0b3Vs IChtb2RldmFyLCAwLCAxMCk7CisJfQorCisgICAgICBpZiAodmFsdWUgIT0gMCkKKwl7CisJ ICB1c2VfbW9kZSA9IHZhbHVlOworCX0KKyAgICB9CisKKyAgcmMgPSBncnViX3Zlc2FmYl9n ZXRfbW9kZV9pbmZvICh1c2VfbW9kZSwgJm1vZGVfaW5mbyk7CisKKyAgZ3J1Yl9wcmludGYg KCJtb2RlOiAweCUwM3hcbiIsCisgICAgICAgICAgICAgICB1c2VfbW9kZSk7CisgIGdydWJf cHJpbnRmICgid2lkdGggOiAlZFxuIiwKKyAgICAgICAgICAgICAgIG1vZGVfaW5mby54X3Jl c29sdXRpb24pOworICBncnViX3ByaW50ZiAoImhlaWdodDogJWRcbiIsCisgICAgICAgICAg ICAgICBtb2RlX2luZm8ueV9yZXNvbHV0aW9uKTsKKyAgZ3J1Yl9wcmludGYgKCJtZW1vcnkg bW9kZWw6ICUwMnhcbiIsCisgICAgICAgICAgICAgICBtb2RlX2luZm8ubWVtb3J5X21vZGVs KTsKKyAgZ3J1Yl9wcmludGYgKCJieXRlcy9zY2FubGluZTogJWRcbiIsCisgICAgICAgICAg ICAgICBtb2RlX2luZm8uYnl0ZXNfcGVyX3NjYW5fbGluZSk7CisgIGdydWJfcHJpbnRmICgi Ynl0ZXMvc2NhbmxpbmUgKGxpbik6ICVkXG4iLAorICAgICAgICAgICAgICAgbW9kZV9pbmZv Lmxpbl9ieXRlc19wZXJfc2Nhbl9saW5lKTsKKyAgZ3J1Yl9wcmludGYgKCJiYXNlIGFkZHJl c3M6ICUwOHhcbiIsCisgICAgICAgICAgICAgICBtb2RlX2luZm8ucGh5c19iYXNlX2FkZHIp OworICBncnViX3ByaW50ZiAoInJlZCBtYXNrL3BvczogJWQvJWRcbiIsCisgICAgICAgICAg ICAgICBtb2RlX2luZm8ucmVkX21hc2tfc2l6ZSwKKyAgICAgICAgICAgICAgIG1vZGVfaW5m by5yZWRfZmllbGRfcG9zaXRpb24pOworICBncnViX3ByaW50ZiAoImdyZWVuIG1hc2svcG9z OiAlZC8lZFxuIiwKKyAgICAgICAgICAgICAgIG1vZGVfaW5mby5ncmVlbl9tYXNrX3NpemUs CisgICAgICAgICAgICAgICBtb2RlX2luZm8uZ3JlZW5fZmllbGRfcG9zaXRpb24pOworICBn cnViX3ByaW50ZiAoImJsdWUgbWFzay9wb3M6ICVkLyVkXG4iLAorICAgICAgICAgICAgICAg bW9kZV9pbmZvLmJsdWVfbWFza19zaXplLAorICAgICAgICAgICAgICAgbW9kZV9pbmZvLmJs dWVfZmllbGRfcG9zaXRpb24pOworCisgIGdydWJfZ2V0a2V5ICgpOworCisgIC8vIHNldHVw IGdmeCBtb2RlCisgIHJjID0gZ3J1Yl92ZXNhZmJfc2V0X21vZGUgKHVzZV9tb2RlKTsKKwor ICByYyA9IGdydWJfdmJlX3NldF9wYWxldHRlX2RhdGEgKDE2LCAwLCB2Z2FfY29sb3JzKTsK KworICBwdHIgPSBmcmFtZWJ1ZmZlcjsKKworICBmb3IgKGkgPSAwOyBpIDwgMjU2ICogMjU2 OyBpKyspCisgICAgeworICAgICAgcHRyW2ldID0gaSAmIDB4MEY7CisgICAgfQorCisgIGZv ciAoaSA9IDA7IGkgPCAxMDA7IGkrKykKKyAgICB7CisgICAgICBwdHJbYWN0aXZlX21vZGVf aW5mby5ieXRlc19wZXJfc2Nhbl9saW5lICogNTAgKyBpXSA9IDB4MEY7CisgICAgfQorCisg IGdydWJfbWVtc2V0IChwdHIgKyBieXRlc19wZXJfc2Nhbl9saW5lICogNTEsIDB4ZmYsIGJ5 dGVzX3Blcl9zY2FuX2xpbmUpOworCisgIGdydWJfZ2V0a2V5ICgpOworCisgIGdydWJfdmVz YWZiX3NldF9tb2RlIChvbGRfbW9kZSk7CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBz dHJ1Y3QgZ3J1Yl90ZXJtIGdydWJfdmVzYWZiX3Rlcm0gPQorICB7CisgICAgLm5hbWUgPSAi dmVzYWZiIiwKKyAgICAuaW5pdCA9IGdydWJfdmVzYWZiX2luaXQsCisgICAgLmZpbmkgPSBn cnViX3Zlc2FmYl9maW5pLAorICAgIC5wdXRjaGFyID0gZ3J1Yl92ZXNhZmJfcHV0Y2hhciwK KyAgICAuY2hlY2trZXkgPSBncnViX2NvbnNvbGVfY2hlY2trZXksCisgICAgLmdldGtleSA9 IGdydWJfY29uc29sZV9nZXRrZXksCisgICAgLmdldHdoID0gZ3J1Yl92aXJ0dWFsX3NjcmVl bl9nZXR3aCwKKyAgICAuZ2V0eHkgPSBncnViX3ZpcnR1YWxfc2NyZWVuX2dldHh5LAorICAg IC5nb3RveHkgPSBncnViX3Zlc2FmYl9nb3RveHksCisgICAgLmNscyA9IGdydWJfdmVzYWZi X2NscywKKyAgICAuc2V0Y29sb3JzdGF0ZSA9IGdydWJfdmlydHVhbF9zY3JlZW5fc2V0Y29s b3JzdGF0ZSwKKyAgICAuc2V0Y29sb3IgPSBncnViX3ZpcnR1YWxfc2NyZWVuX3NldGNvbG9y LAorICAgIC5zZXRjdXJzb3IgPSBncnViX3Zlc2FmYl9zZXRjdXJzb3IsCisgICAgLmZsYWdz ID0gMCwKKyAgICAubmV4dCA9IDAKKyAgfTsKKworR1JVQl9NT0RfSU5JVAoreworICBteV9t b2QgPSBtb2Q7CisgIGdydWJfdGVybV9yZWdpc3RlciAoJmdydWJfdmVzYWZiX3Rlcm0pOwor ICAKKyAgZ3J1Yl9yZWdpc3Rlcl9jb21tYW5kICgidmJlX2xpc3RfbW9kZXMiLCBncnViX2Nt ZF92YmVfbGlzdF9tb2RlcywgR1JVQl9DT01NQU5EX0ZMQUdfQk9USCwKKyAgICAgICAgICAg ICAgICAgICAgICAgICAidmJlX2xpc3RfbW9kZXMiLCAiTGlzdCdzIGNvbXBhdGlibGUgVkVT QSBCSU9TIGV4dGVuc2lvbiBtb2Rlcy4iLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAg ICAKKyAgZ3J1Yl9yZWdpc3Rlcl9jb21tYW5kICgidmJlX3Rlc3QiLCBncnViX2NtZF92YmVf dGVzdCwgR1JVQl9DT01NQU5EX0ZMQUdfQk9USCwKKyAgICAgICAgICAgICAgICAgICAgICAg ICAidmJlX3Rlc3QiLCAiVGVzdCBWQkUiLCAwKTsgIAorfQorCitHUlVCX01PRF9GSU5JCit7 CisgIGdydWJfdW5yZWdpc3Rlcl9jb21tYW5kICgidmJlX3Rlc3QiKTsKKyAgZ3J1Yl91bnJl Z2lzdGVyX2NvbW1hbmQgKCJ2YmVfbGlzdF9tb2RlcyIpOworICBncnViX3Rlcm1fdW5yZWdp c3RlciAoJmdydWJfdmVzYWZiX3Rlcm0pOworfQo= --------------090603010205080905090603--