From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex Deucher Subject: [PATCH 21/51] drm/amd/powerplay: add Tonga dpm support (v3) Date: Thu, 12 Nov 2015 01:18:11 -0500 Message-ID: <1447309121-2480-22-git-send-email-alexander.deucher@amd.com> References: <1447309121-2480-1-git-send-email-alexander.deucher@amd.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-qg0-f66.google.com (mail-qg0-f66.google.com [209.85.192.66]) by gabe.freedesktop.org (Postfix) with ESMTPS id 511107A121 for ; Wed, 11 Nov 2015 22:19:14 -0800 (PST) Received: by qgcc31 with SMTP id c31so4517664qgc.3 for ; Wed, 11 Nov 2015 22:19:13 -0800 (PST) In-Reply-To: <1447309121-2480-1-git-send-email-alexander.deucher@amd.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org Cc: Eric Huang , Rex Zhu , yanyang1 List-Id: dri-devel@lists.freedesktop.org RnJvbTogeWFueWFuZzEgPHlvdW5nLnlhbmdAYW1kLmNvbT4KClRoaXMgaW1wbGVtZW50cyBEUE0g Zm9yIHRvbmdhLiAgRFBNIGhhbmRsZXMgZHluYW1pYwpjbG9jayBhbmQgdm9sdGFnZSBzY2FsaW5n LgoKdjI6IG1lcmdlIGFsbCB0aGUgcGF0Y2hlcyByZWxhdGVkIHdpdGggdG9uZ2EgZHBtCnYzOiBt ZXJnZSBkcG0gZm9yY2UgbGV2ZWwgZml4LCBjZ3MgZGlzcGxheSBmaXgsIHNwZWxsaW5nIGZpeAoK UmV2aWV3ZWQtYnk6IEFsZXggRGV1Y2hlciA8YWxleGFuZGVyLmRldWNoZXJAYW1kLmNvbT4KUmV2 aWV3ZWQtYnk6IEphbW15IFpob3UgPEphbW15Llpob3VAYW1kLmNvbT4KU2lnbmVkLW9mZi1ieTog eWFueWFuZzEgPHlvdW5nLnlhbmdAYW1kLmNvbT4KU2lnbmVkLW9mZi1ieTogUmV4IFpodSA8UmV4 LlpodUBhbWQuY29tPgpTaWduZWQtb2ZmLWJ5OiBFcmljIEh1YW5nIDxKaW5IdWlFcmljLkh1YW5n QGFtZC5jb20+Ci0tLQogZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvTWFrZWZpbGUgICAg ICAgICAgICAgfCAgICA1ICstCiBkcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21nci9N YWtlZmlsZSAgICAgICB8ICAgIDQgKy0KIGRyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2h3 bWdyL2h3bWdyLmMgICAgICAgIHwgICAxMCArCiBkcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxh eS9od21nci9od21ncl9wcHQuaCAgICB8ICAxMDUgKwogZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dl cnBsYXkvaHdtZ3IvcHBhdG9tY3RybC5jICAgfCAgNzA0ICsrKwogZHJpdmVycy9ncHUvZHJtL2Ft ZC9wb3dlcnBsYXkvaHdtZ3IvcHBhdG9tY3RybC5oICAgfCAgMjM3ICsKIGRyaXZlcnMvZ3B1L2Ry bS9hbWQvcG93ZXJwbGF5L2h3bWdyL3BwaW50ZXJydXB0LmggIHwgICA0MiArCiBkcml2ZXJzL2dw dS9kcm0vYW1kL3Bvd2VycGxheS9od21nci9wcHBjaWVsYW5lcy5jICB8ICAgNjQgKwogZHJpdmVy cy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvcHBwY2llbGFuZXMuaCAgfCAgIDMxICsKIC4u Li9kcm0vYW1kL3Bvd2VycGxheS9od21nci90b25nYV9keW5fZGVmYXVsdHMuaCAgIHwgIDEwNyAr CiBkcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21nci90b25nYV9od21nci5jICB8IDU3 MTQgKysrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2h3 bWdyL3RvbmdhX2h3bWdyLmggIHwgIDQyNyArKwogLi4uL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9o d21nci90b25nYV9wb3dlcnR1bmUuaCAgfCAgIDY2ICsKIC4uLi9ncHUvZHJtL2FtZC9wb3dlcnBs YXkvaHdtZ3IvdG9uZ2FfcHB0YWJsZS5oICAgIHwgIDQwNiArKwogLi4uL2FtZC9wb3dlcnBsYXkv aHdtZ3IvdG9uZ2FfcHJvY2Vzc3BwdGFibGVzLmMgICAgfCAxMTI5ICsrKysKIC4uLi9hbWQvcG93 ZXJwbGF5L2h3bWdyL3RvbmdhX3Byb2Nlc3NwcHRhYmxlcy5oICAgIHwgICAzNSArCiAuLi4vZ3B1 L2RybS9hbWQvcG93ZXJwbGF5L2luYy9oYXJkd2FyZW1hbmFnZXIuaCAgICB8ICAgMTggKy0KIGRy aXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2luYy9od21nci5oICAgICAgICAgIHwgICA5MCAr CiBkcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9pbmMvcHBfZGVidWcuaCAgICAgICB8ICAg IDIgKy0KIC4uLi9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaW5jL3NtdV91Y29kZV94ZmVyX3ZpLmgg IHwgIDEwMCArCiAyMCBmaWxlcyBjaGFuZ2VkLCA5Mjg0IGluc2VydGlvbnMoKyksIDEyIGRlbGV0 aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5 L2h3bWdyL2h3bWdyX3BwdC5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2Ft ZC9wb3dlcnBsYXkvaHdtZ3IvcHBhdG9tY3RybC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVy cy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvcHBhdG9tY3RybC5oCiBjcmVhdGUgbW9kZSAx MDA2NDQgZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvcHBpbnRlcnJ1cHQuaAog Y3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2h3bWdyL3Bw cGNpZWxhbmVzLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2Vy cGxheS9od21nci9wcHBjaWVsYW5lcy5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUv ZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvdG9uZ2FfZHluX2RlZmF1bHRzLmgKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21nci90b25nYV9od21nci5j CiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3Iv dG9uZ2FfaHdtZ3IuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9hbWQvcG93 ZXJwbGF5L2h3bWdyL3RvbmdhX3Bvd2VydHVuZS5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVy cy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvdG9uZ2FfcHB0YWJsZS5oCiBjcmVhdGUgbW9k ZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvdG9uZ2FfcHJvY2Vz c3BwdGFibGVzLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2Vy cGxheS9od21nci90b25nYV9wcm9jZXNzcHB0YWJsZXMuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IGRy aXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2luYy9zbXVfdWNvZGVfeGZlcl92aS5oCgpkaWZm IC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvTWFrZWZpbGUgYi9kcml2ZXJz L2dwdS9kcm0vYW1kL3Bvd2VycGxheS9NYWtlZmlsZQppbmRleCAwMjMxMDIxLi5lMTk1YmY1IDEw MDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9NYWtlZmlsZQorKysgYi9k cml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9NYWtlZmlsZQpAQCAtMiw3ICsyLDEwIEBACiBz dWJkaXItY2NmbGFncy15ICs9IC1JaW5jbHVkZS9kcm0gIFwKIAkJLUlkcml2ZXJzL2dwdS9kcm0v YW1kL3Bvd2VycGxheS9pbmMvICBcCiAJCS1JZHJpdmVycy9ncHUvZHJtL2FtZC9pbmNsdWRlL2Fz aWNfcmVnICBcCi0JCS1JZHJpdmVycy9ncHUvZHJtL2FtZC9pbmNsdWRlCisJCS1JZHJpdmVycy9n cHUvZHJtL2FtZC9pbmNsdWRlICBcCisJCS1JZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkv c211bWdyXAorCQktSWRyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2h3bWdyIFwKKwkJLUlk cml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9ldmVudG1ncgogCiBBTURfUFBfUEFUSCA9IC4u L3Bvd2VycGxheQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9o d21nci9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2h3bWdyL01ha2Vm aWxlCmluZGV4IDQ2Y2M0OTQuLmZkNzNkM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9h bWQvcG93ZXJwbGF5L2h3bWdyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvcG93 ZXJwbGF5L2h3bWdyL01ha2VmaWxlCkBAIC00LDcgKzQsOSBAQAogCiBIQVJEV0FSRV9NR1IgPSBo d21nci5vIHByb2Nlc3NwcHRhYmxlcy5vIGZ1bmN0aW9udGFibGVzLm8gXAogCSAgICAgICBoYXJk d2FyZW1hbmFnZXIubyBwcF9hY3BpLm8gY3pfaHdtZ3IubyBcCi0gICAgICAgICAgICAgICBjel9j bG9ja3Bvd2VyZ2F0aW5nLm8KKyAgICAgICAgICAgICAgIGN6X2Nsb2NrcG93ZXJnYXRpbmcubyBc CisJICAgICAgIHRvbmdhX3Byb2Nlc3NwcHRhYmxlcy5vIHBwYXRvbWN0cmwubyBcCisgICAgICAg ICAgICAgICB0b25nYV9od21nci5vIAlwcHBjaWVsYW5lcy5vCiAKIEFNRF9QUF9IV01HUiA9ICQo YWRkcHJlZml4ICQoQU1EX1BQX1BBVEgpL2h3bWdyLywkKEhBUkRXQVJFX01HUikpCiAKZGlmZiAt LWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2h3bWdyL2h3bWdyLmMgYi9kcml2 ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21nci9od21nci5jCmluZGV4IDVkMWJhOTAuLjQw N2IyZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2h3bWdyL2h3 bWdyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvaHdtZ3IuYwpA QCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgInBvd2VyX3N0YXRlLmgiCiAjaW5jbHVkZSAiaHdt Z3IuaCIKICNpbmNsdWRlICJjel9od21nci5oIgorI2luY2x1ZGUgInRvbmdhX2h3bWdyLmgiCiAK IGludCBod21ncl9pbml0KHN0cnVjdCBhbWRfcHBfaW5pdCAqcHBfaW5pdCwgc3RydWN0IHBwX2lu c3RhbmNlICpoYW5kbGUpCiB7CkBAIC01Myw2ICs1NCwxNSBAQCBpbnQgaHdtZ3JfaW5pdChzdHJ1 Y3QgYW1kX3BwX2luaXQgKnBwX2luaXQsIHN0cnVjdCBwcF9pbnN0YW5jZSAqaGFuZGxlKQogCWNh c2UgQU1EX0ZBTUlMWV9DWjoKIAkJY3pfaHdtZ3JfaW5pdChod21ncik7CiAJCWJyZWFrOworCWNh c2UgQU1EX0ZBTUlMWV9WSToKKwkJc3dpdGNoIChod21nci0+Y2hpcF9pZCkgeworCQljYXNlIENI SVBfVE9OR0E6CisJCQl0b25nYV9od21ncl9pbml0KGh3bWdyKTsKKwkJCWJyZWFrOworCQlkZWZh dWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0 dXJuIC1FSU5WQUw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBs YXkvaHdtZ3IvaHdtZ3JfcHB0LmggYi9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21n ci9od21ncl9wcHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWU2YzJk Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3Iv aHdtZ3JfcHB0LmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBBZHZh bmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3Jh bnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkg b2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUg IlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0 aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwg Y29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAq IGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29u cyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0 IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0 IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgor ICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisg KgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkg T0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJ TUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBG T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5U IFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxF IEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJ TiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBG Uk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNF IE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5k ZWYgUFBfSFdNR1JfUFBUX0gKKyNkZWZpbmUgUFBfSFdNR1JfUFBUX0gKKworI2luY2x1ZGUgImhh cmR3YXJlbWFuYWdlci5oIgorI2luY2x1ZGUgInNtdW1nci5oIgorI2luY2x1ZGUgImF0b20tdHlw ZXMuaCIKKworc3RydWN0IHBobV9wcHRfdjFfY2xvY2tfdm9sdGFnZV9kZXBlbmRlbmN5X3JlY29y ZCB7CisJdWludDMyX3QgY2xrOworCXVpbnQ4X3QgdmRkSW5kOworCXVpbnQxNl90IHZkZF9vZmZz ZXQ7CisJdWludDE2X3QgdmRkYzsKKwl1aW50MTZfdCB2ZGRnZng7CisJdWludDE2X3QgdmRkY2k7 CisJdWludDE2X3QgbXZkZDsKKwl1aW50OF90IHBoYXNlczsKKwl1aW50OF90IGNrc19lbmFibGU7 CisJdWludDhfdCBja3Nfdm9mZnNldDsKK307CisKK3R5cGVkZWYgc3RydWN0IHBobV9wcHRfdjFf Y2xvY2tfdm9sdGFnZV9kZXBlbmRlbmN5X3JlY29yZCBwaG1fcHB0X3YxX2Nsb2NrX3ZvbHRhZ2Vf ZGVwZW5kZW5jeV9yZWNvcmQ7CisKK3N0cnVjdCBwaG1fcHB0X3YxX2Nsb2NrX3ZvbHRhZ2VfZGVw ZW5kZW5jeV90YWJsZSB7CisJdWludDMyX3QgY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZW50cmllcy4gKi8KKwlwaG1fcHB0X3Yx X2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV9yZWNvcmQgZW50cmllc1sxXTsgICAgIC8qIER5bmFt aWNhbGx5IGFsbG9jYXRlIGNvdW50IGVudHJpZXMuICovCit9OworCit0eXBlZGVmIHN0cnVjdCBw aG1fcHB0X3YxX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZSBwaG1fcHB0X3YxX2Nsb2Nr X3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZTsKKworCisvKiBNdWx0aW1lZGlhIENsb2NrIFZvbHRh Z2UgRGVwZW5kZW5jeSByZWNvcmRzIGFuZCB0YWJsZSAqLworc3RydWN0IHBobV9wcHRfdjFfbW1f Y2xvY2tfdm9sdGFnZV9kZXBlbmRlbmN5X3JlY29yZCB7CisJdWludDMyX3QgIGRjbGs7ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVWRCBELWNsb2NrICov CisJdWludDMyX3QgIHZjbGs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIC8qIFVWRCBWLWNsb2NrICovCisJdWludDMyX3QgIGVjbGs7ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZDRSBjbG9jayAqLworCXVpbnQzMl90 ICBhY2xrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBB Q1AgY2xvY2sgKi8KKwl1aW50MzJfdCAgc2FtY2xvY2s7ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgLyogU0FNVSBjbG9jayAqLworCXVpbnQ4X3QJdmRkY0luZDsKKwl1 aW50MTZfdCB2ZGRnZnhfb2Zmc2V0OworCXVpbnQxNl90IHZkZGM7CisJdWludDE2X3QgdmRkZ2Z4 OworCXVpbnQ4X3QgcGhhc2VzOworfTsKK3R5cGVkZWYgc3RydWN0IHBobV9wcHRfdjFfbW1fY2xv Y2tfdm9sdGFnZV9kZXBlbmRlbmN5X3JlY29yZCBwaG1fcHB0X3YxX21tX2Nsb2NrX3ZvbHRhZ2Vf ZGVwZW5kZW5jeV9yZWNvcmQ7CisKK3N0cnVjdCBwaG1fcHB0X3YxX21tX2Nsb2NrX3ZvbHRhZ2Vf ZGVwZW5kZW5jeV90YWJsZSB7CisJdWludDMyX3QgY291bnQ7CQkJCQkJCQkJCQkJCS8qIE51bWJl ciBvZiBlbnRyaWVzLiAqLworCXBobV9wcHRfdjFfbW1fY2xvY2tfdm9sdGFnZV9kZXBlbmRlbmN5 X3JlY29yZCBlbnRyaWVzWzFdOwkJLyogRHluYW1pY2FsbHkgYWxsb2NhdGUgY291bnQgZW50cmll cy4gKi8KK307Cit0eXBlZGVmIHN0cnVjdCBwaG1fcHB0X3YxX21tX2Nsb2NrX3ZvbHRhZ2VfZGVw ZW5kZW5jeV90YWJsZSBwaG1fcHB0X3YxX21tX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJs ZTsKKworc3RydWN0IHBobV9wcHRfdjFfdm9sdGFnZV9sb29rdXBfcmVjb3JkIHsKKwl1aW50MTZf dCB1c19jYWxjdWxhdGVkOworCXVpbnQxNl90IHVzX3ZkZDsJCQkJCQkJCQkJCQkvKiBCYXNlIHZv bHRhZ2UgKi8KKwl1aW50MTZfdCB1c19jYWNfbG93OworCXVpbnQxNl90IHVzX2NhY19taWQ7CisJ dWludDE2X3QgdXNfY2FjX2hpZ2g7Cit9OwordHlwZWRlZiBzdHJ1Y3QgcGhtX3BwdF92MV92b2x0 YWdlX2xvb2t1cF9yZWNvcmQgcGhtX3BwdF92MV92b2x0YWdlX2xvb2t1cF9yZWNvcmQ7CisKK3N0 cnVjdCBwaG1fcHB0X3YxX3ZvbHRhZ2VfbG9va3VwX3RhYmxlIHsKKwl1aW50MzJfdCBjb3VudDsK KwlwaG1fcHB0X3YxX3ZvbHRhZ2VfbG9va3VwX3JlY29yZCBlbnRyaWVzWzFdOyAgICAvKiBEeW5h bWljYWxseSBhbGxvY2F0ZSBjb3VudCBlbnRyaWVzLiAqLworfTsKK3R5cGVkZWYgc3RydWN0IHBo bV9wcHRfdjFfdm9sdGFnZV9sb29rdXBfdGFibGUgcGhtX3BwdF92MV92b2x0YWdlX2xvb2t1cF90 YWJsZTsKKworLyogUENJRSByZWNvcmRzIGFuZCBUYWJsZSAqLworCitzdHJ1Y3QgcGhtX3BwdF92 MV9wY2llX3JlY29yZCB7CisJdWludDhfdCBnZW5fc3BlZWQ7CisJdWludDhfdCBsYW5lX3dpZHRo OworfTsKK3R5cGVkZWYgc3RydWN0IHBobV9wcHRfdjFfcGNpZV9yZWNvcmQgcGhtX3BwdF92MV9w Y2llX3JlY29yZDsKKworc3RydWN0IHBobV9wcHRfdjFfcGNpZV90YWJsZSB7CisJdWludDMyX3Qg Y291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1i ZXIgb2YgZW50cmllcy4gKi8KKwlwaG1fcHB0X3YxX3BjaWVfcmVjb3JkIGVudHJpZXNbMV07ICAg ICAgICAgICAgICAgICAgICAgICAgIC8qIER5bmFtaWNhbGx5IGFsbG9jYXRlIGNvdW50IGVudHJp ZXMuICovCit9OwordHlwZWRlZiBzdHJ1Y3QgcGhtX3BwdF92MV9wY2llX3RhYmxlIHBobV9wcHRf djFfcGNpZV90YWJsZTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9h bWQvcG93ZXJwbGF5L2h3bWdyL3BwYXRvbWN0cmwuYyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvcG93 ZXJwbGF5L2h3bWdyL3BwYXRvbWN0cmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwLi45YWYyZjU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dl cnBsYXkvaHdtZ3IvcHBhdG9tY3RybC5jCkBAIC0wLDAgKzEsNzA0IEBACisvKgorICogQ29weXJp Z2h0IDIwMTUgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24g aXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmlu ZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlv biBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0 aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJp Z2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1 YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8g cGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBk byBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFi b3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUg aW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhl IFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRI T1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJ TkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwK KyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQu ICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9S KFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJ VFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwK KyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdB UkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoK KyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4K KyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjaW5jbHVkZSAicHBhdG9tY3RybC5oIgorI2luY2x1 ZGUgImF0b21iaW9zLmgiCisjaW5jbHVkZSAiY2dzX2NvbW1vbi5oIgorI2luY2x1ZGUgInBwX2Rl YnVnLmgiCisjZGVmaW5lIE1FTV9JRF9NQVNLICAgICAgICAgICAweGZmMDAwMDAwCisjZGVmaW5l IE1FTV9JRF9TSElGVCAgICAgICAgICAyNAorI2RlZmluZSBDTE9DS19SQU5HRV9NQVNLICAgICAg MHgwMGZmZmZmZgorI2RlZmluZSBDTE9DS19SQU5HRV9TSElGVCAgICAgMAorI2RlZmluZSBMT1df TklCQkxFX01BU0sgICAgICAgMHhmCisjZGVmaW5lIERBVEFfRVFVX1BSRVYgICAgICAgICAwCisj ZGVmaW5lIERBVEFfRlJPTV9UQUJMRSAgICAgICA0CisKK3VuaW9uIHZvbHRhZ2Vfb2JqZWN0X2lu Zm8geworCXN0cnVjdCBfQVRPTV9WT0xUQUdFX09CSkVDVF9JTkZPIHYxOworCXN0cnVjdCBfQVRP TV9WT0xUQUdFX09CSkVDVF9JTkZPX1YyIHYyOworCXN0cnVjdCBfQVRPTV9WT0xUQUdFX09CSkVD VF9JTkZPX1YzXzEgdjM7Cit9OworCitzdGF0aWMgaW50IGF0b21jdHJsX3JldHJpZXZlX2FjX3Rp bWluZygKKwkJdWludDhfdCBpbmRleCwKKwkJQVRPTV9JTklUX1JFR19CTE9DSyAqcmVnX2Jsb2Nr LAorCQlwcF9hdG9tY3RybF9tY19yZWdfdGFibGUgKnRhYmxlKQoreworCXVpbnQzMl90IGksIGo7 CisJdWludDhfdCB0bWVtX2lkOworCUFUT01fTUVNT1JZX1NFVFRJTkdfREFUQV9CTE9DSyAqcmVn X2RhdGEgPSAoQVRPTV9NRU1PUllfU0VUVElOR19EQVRBX0JMT0NLICopCisJCSgodWludDhfdCAq KXJlZ19ibG9jayArICgyICogc2l6ZW9mKHVpbnQxNl90KSkgKyBsZTE2X3RvX2NwdShyZWdfYmxv Y2stPnVzUmVnSW5kZXhUYmxTaXplKSk7CisKKwl1aW50OF90IG51bV9yYW5nZXMgPSAwOworCisJ d2hpbGUgKCoodWludDMyX3QgKilyZWdfZGF0YSAhPSBFTkRfT0ZfUkVHX0RBVEFfQkxPQ0sgJiYK KwkJCW51bV9yYW5nZXMgPCBWQklPU19NQVhfQUNfVElNSU5HX0VOVFJJRVMpIHsKKwkJdG1lbV9p ZCA9ICh1aW50OF90KSgoKih1aW50MzJfdCAqKXJlZ19kYXRhICYgTUVNX0lEX01BU0spID4+IE1F TV9JRF9TSElGVCk7CisKKwkJaWYgKGluZGV4ID09IHRtZW1faWQpIHsKKwkJCXRhYmxlLT5tY19y ZWdfdGFibGVfZW50cnlbbnVtX3Jhbmdlc10ubWNsa19tYXggPQorCQkJCSh1aW50MzJfdCkoKCoo dWludDMyX3QgKilyZWdfZGF0YSAmIENMT0NLX1JBTkdFX01BU0spID4+CisJCQkJCQlDTE9DS19S QU5HRV9TSElGVCk7CisKKwkJCWZvciAoaSA9IDAsIGogPSAxOyBpIDwgdGFibGUtPmxhc3Q7IGkr KykgeworCQkJCWlmICgodGFibGUtPm1jX3JlZ19hZGRyZXNzW2ldLnVjX3ByZV9yZWdfZGF0YSAm CisJCQkJCQkJTE9XX05JQkJMRV9NQVNLKSA9PSBEQVRBX0ZST01fVEFCTEUpIHsKKwkJCQkJdGFi bGUtPm1jX3JlZ190YWJsZV9lbnRyeVtudW1fcmFuZ2VzXS5tY19kYXRhW2ldID0KKwkJCQkJCSh1 aW50MzJfdCkqKCh1aW50MzJfdCAqKXJlZ19kYXRhICsgaik7CisJCQkJCWorKzsKKwkJCQl9IGVs c2UgaWYgKCh0YWJsZS0+bWNfcmVnX2FkZHJlc3NbaV0udWNfcHJlX3JlZ19kYXRhICYKKwkJCQkJ CQlMT1dfTklCQkxFX01BU0spID09IERBVEFfRVFVX1BSRVYpIHsKKwkJCQkJdGFibGUtPm1jX3Jl Z190YWJsZV9lbnRyeVtudW1fcmFuZ2VzXS5tY19kYXRhW2ldID0KKwkJCQkJCXRhYmxlLT5tY19y ZWdfdGFibGVfZW50cnlbbnVtX3Jhbmdlc10ubWNfZGF0YVtpLTFdOworCQkJCX0KKwkJCX0KKwkJ CW51bV9yYW5nZXMrKzsKKwkJfQorCisJCXJlZ19kYXRhID0gKEFUT01fTUVNT1JZX1NFVFRJTkdf REFUQV9CTE9DSyAqKQorCQkJKCh1aW50OF90ICopcmVnX2RhdGEgKyBsZTE2X3RvX2NwdShyZWdf YmxvY2stPnVzUmVnRGF0YUJsa1NpemUpKSA7CisJfQorCisJUFBfQVNTRVJUX1dJVEhfQ09ERSgo Kih1aW50MzJfdCAqKXJlZ19kYXRhID09IEVORF9PRl9SRUdfREFUQV9CTE9DSyksCisJCQkiSW52 YWxpZCBWcmFtSW5mbyB0YWJsZS4iLCByZXR1cm4gLTEpOworCXRhYmxlLT5udW1fZW50cmllcyA9 IG51bV9yYW5nZXM7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBHZXQgbWVtb3J5IGNsb2Nr IEFDIHRpbWluZyByZWdpc3RlcnMgaW5kZXggZnJvbSBWQklPUyB0YWJsZQorICogVkJJT1Mgc2V0 IGVuZCBvZiBtZW1vcnkgY2xvY2sgQUMgdGltaW5nIHJlZ2lzdGVycyBieSB1Y1ByZVJlZ0RhdGFM ZW5ndGggYml0NiA9IDEKKyAqIEBwYXJhbSAgICByZWdfYmxvY2sgdGhlIGFkZHJlc3MgQVRPTV9J TklUX1JFR19CTE9DSworICogQHBhcmFtICAgIHRhYmxlIHRoZSBhZGRyZXNzIG9mIE1DUmVnVGFi bGUKKyAqIEByZXR1cm4gICBQUF9SZXN1bHRfT0sKKyAqLworc3RhdGljIGludCBhdG9tY3RybF9z ZXRfbWNfcmVnX2FkZHJlc3NfdGFibGUoCisJCUFUT01fSU5JVF9SRUdfQkxPQ0sgKnJlZ19ibG9j aywKKwkJcHBfYXRvbWN0cmxfbWNfcmVnX3RhYmxlICp0YWJsZSkKK3sKKwl1aW50OF90IGkgPSAw OworCXVpbnQ4X3QgbnVtX2VudHJpZXMgPSAodWludDhfdCkoKGxlMTZfdG9fY3B1KHJlZ19ibG9j ay0+dXNSZWdJbmRleFRibFNpemUpKQorCQkJLyBzaXplb2YoQVRPTV9JTklUX1JFR19JTkRFWF9G T1JNQVQpKTsKKwlBVE9NX0lOSVRfUkVHX0lOREVYX0ZPUk1BVCAqZm9ybWF0ID0gJnJlZ19ibG9j ay0+YXNSZWdJbmRleEJ1ZlswXTsKKworCW51bV9lbnRyaWVzLS07ICAgICAgICAvKiBzdWJ0cmFj dCAxIGRhdGEgZW5kIG1hcmsgZW50cnkgKi8KKworCVBQX0FTU0VSVF9XSVRIX0NPREUoKG51bV9l bnRyaWVzIDw9IFZCSU9TX01DX1JFR0lTVEVSX0FSUkFZX1NJWkUpLAorCQkJIkludmFsaWQgVnJh bUluZm8gdGFibGUuIiwgcmV0dXJuIC0xKTsKKworCS8qIHVjUHJlUmVnRGF0YUxlbmd0aCBiaXQ2 ID0gMSBpcyB0aGUgZW5kIG9mIG1lbW9yeSBjbG9jayBBQyB0aW1pbmcgcmVnaXN0ZXJzICovCisJ d2hpbGUgKCghKGZvcm1hdC0+dWNQcmVSZWdEYXRhTGVuZ3RoICYgQUNDRVNTX1BMQUNFSE9MREVS KSkgJiYKKwkJCShpIDwgbnVtX2VudHJpZXMpKSB7CisJCXRhYmxlLT5tY19yZWdfYWRkcmVzc1tp XS5zMSA9CisJCQkodWludDE2X3QpKGxlMTZfdG9fY3B1KGZvcm1hdC0+dXNSZWdJbmRleCkpOwor CQl0YWJsZS0+bWNfcmVnX2FkZHJlc3NbaV0udWNfcHJlX3JlZ19kYXRhID0KKwkJCWZvcm1hdC0+ dWNQcmVSZWdEYXRhTGVuZ3RoOworCisJCWkrKzsKKwkJZm9ybWF0ID0gKEFUT01fSU5JVF9SRUdf SU5ERVhfRk9STUFUICopCisJCQkoKHVpbnQ4X3QgKilmb3JtYXQgKyBzaXplb2YoQVRPTV9JTklU X1JFR19JTkRFWF9GT1JNQVQpKTsKKwl9CisKKwl0YWJsZS0+bGFzdCA9IGk7CisJcmV0dXJuIDA7 Cit9CisKKworaW50IGF0b21jdHJsX2luaXRpYWxpemVfbWNfcmVnX3RhYmxlKAorCQlzdHJ1Y3Qg cHBfaHdtZ3IgKmh3bWdyLAorCQl1aW50OF90IG1vZHVsZV9pbmRleCwKKwkJcHBfYXRvbWN0cmxf bWNfcmVnX3RhYmxlICp0YWJsZSkKK3sKKwlBVE9NX1ZSQU1fSU5GT19IRUFERVJfVjJfMSAqdnJh bV9pbmZvOworCUFUT01fSU5JVF9SRUdfQkxPQ0sgKnJlZ19ibG9jazsKKwlpbnQgcmVzdWx0ID0g MDsKKwl1OCBmcmV2LCBjcmV2OworCXUxNiBzaXplOworCisJdnJhbV9pbmZvID0gKEFUT01fVlJB TV9JTkZPX0hFQURFUl9WMl8xICopCisJCWNnc19hdG9tX2dldF9kYXRhX3RhYmxlKGh3bWdyLT5k ZXZpY2UsCisJCQkJR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoREFUQSwgVlJBTV9JbmZvKSwgJnNp emUsICZmcmV2LCAmY3Jldik7CisKKwlpZiAobW9kdWxlX2luZGV4ID49IHZyYW1faW5mby0+dWNO dW1PZlZSQU1Nb2R1bGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJbIHBvd2VycGxheSBdIEludmFs aWQgVnJhbUluZm8gdGFibGUuIik7CisJCXJlc3VsdCA9IC0xOworCX0gZWxzZSBpZiAodnJhbV9p bmZvLT5zSGVhZGVyLnVjVGFibGVGb3JtYXRSZXZpc2lvbiA8IDIpIHsKKwkJcHJpbnRrKEtFUk5f RVJSICJbIHBvd2VycGxheSBdIEludmFsaWQgVnJhbUluZm8gdGFibGUuIik7CisJCXJlc3VsdCA9 IC0xOworCX0KKworCWlmICgwID09IHJlc3VsdCkgeworCQlyZWdfYmxvY2sgPSAoQVRPTV9JTklU X1JFR19CTE9DSyAqKQorCQkJKCh1aW50OF90ICopdnJhbV9pbmZvICsgbGUxNl90b19jcHUodnJh bV9pbmZvLT51c01lbUNsa1BhdGNoVGJsT2Zmc2V0KSk7CisJCXJlc3VsdCA9IGF0b21jdHJsX3Nl dF9tY19yZWdfYWRkcmVzc190YWJsZShyZWdfYmxvY2ssIHRhYmxlKTsKKwl9CisKKwlpZiAoMCA9 PSByZXN1bHQpIHsKKwkJcmVzdWx0ID0gYXRvbWN0cmxfcmV0cmlldmVfYWNfdGltaW5nKG1vZHVs ZV9pbmRleCwKKwkJCQkJcmVnX2Jsb2NrLCB0YWJsZSk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsK K30KKworLyoqCisgKiBTZXQgRFJBTSB0aW1pbmdzIGJhc2VkIG9uIGVuZ2luZSBjbG9jayBhbmQg bWVtb3J5IGNsb2NrLgorICovCitpbnQgYXRvbWN0cmxfc2V0X2VuZ2luZV9kcmFtX3RpbWluZ3Nf cnY3NzAoCisJCXN0cnVjdCBwcF9od21nciAqaHdtZ3IsCisJCXVpbnQzMl90IGVuZ2luZV9jbG9j aywKKwkJdWludDMyX3QgbWVtb3J5X2Nsb2NrKQoreworCVNFVF9FTkdJTkVfQ0xPQ0tfUFNfQUxM T0NBVElPTiBlbmdpbmVfY2xvY2tfcGFyYW1ldGVyczsKKworCS8qIFRoZXkgYXJlIGJvdGggaW4g MTBLSHogVW5pdHMuICovCisJZW5naW5lX2Nsb2NrX3BhcmFtZXRlcnMudWxUYXJnZXRFbmdpbmVD bG9jayA9CisJCSh1aW50MzJfdCkgZW5naW5lX2Nsb2NrICYgU0VUX0NMT0NLX0ZSRVFfTUFTSzsK KwllbmdpbmVfY2xvY2tfcGFyYW1ldGVycy51bFRhcmdldEVuZ2luZUNsb2NrIHw9CisJCShDT01Q VVRFX0VOR0lORV9QTExfUEFSQU0gPDwgMjQpOworCisJLyogaW4gMTAga2h6IHVuaXRzLiovCisJ ZW5naW5lX2Nsb2NrX3BhcmFtZXRlcnMuc1Jlc2VydmVkLnVsQ2xvY2sgPQorCQkodWludDMyX3Qp IG1lbW9yeV9jbG9jayAmIFNFVF9DTE9DS19GUkVRX01BU0s7CisJcmV0dXJuIGNnc19hdG9tX2V4 ZWNfY21kX3RhYmxlKGh3bWdyLT5kZXZpY2UsCisJCQlHZXRJbmRleEludG9NYXN0ZXJUYWJsZShD T01NQU5ELCBEeW5hbWljTWVtb3J5U2V0dGluZ3MpLAorCQkJJmVuZ2luZV9jbG9ja19wYXJhbWV0 ZXJzKTsKK30KKworLyoqCisgKiBQcml2YXRlIEZ1bmN0aW9uIHRvIGdldCB0aGUgUG93ZXJQbGF5 IFRhYmxlIEFkZHJlc3MuCisgKiBXQVJOSU5HOiBUaGUgdGFibGVkIHJldHVybmVkIGJ5IHRoaXMg ZnVuY3Rpb24gaXMgaW4KKyAqIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBtZW1vcnkuCisgKiBUaGUg Y2FsbGVyIGhhcyB0byByZWxlYXNlIGlmIGJ5IGNhbGxpbmcga2ZyZWUuCisgKi8KK3N0YXRpYyBB VE9NX1ZPTFRBR0VfT0JKRUNUX0lORk8gKmdldF92b2x0YWdlX2luZm9fdGFibGUodm9pZCAqZGV2 aWNlKQoreworCWludCBpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKERBVEEsIFZvbHRh Z2VPYmplY3RJbmZvKTsKKwl1OCBmcmV2LCBjcmV2OworCXUxNiBzaXplOworCXVuaW9uIHZvbHRh Z2Vfb2JqZWN0X2luZm8gKnZvbHRhZ2VfaW5mbzsKKworCXZvbHRhZ2VfaW5mbyA9ICh1bmlvbiB2 b2x0YWdlX29iamVjdF9pbmZvICopCisJCWNnc19hdG9tX2dldF9kYXRhX3RhYmxlKGRldmljZSwg aW5kZXgsCisJCQkmc2l6ZSwgJmZyZXYsICZjcmV2KTsKKworCWlmICh2b2x0YWdlX2luZm8gIT0g TlVMTCkKKwkJcmV0dXJuIChBVE9NX1ZPTFRBR0VfT0JKRUNUX0lORk8gKikgJih2b2x0YWdlX2lu Zm8tPnYzKTsKKwllbHNlCisJCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgQVRPTV9W T0xUQUdFX09CSkVDVF9WMyAqYXRvbWN0cmxfbG9va3VwX3ZvbHRhZ2VfdHlwZV92MygKKwkJY29u c3QgQVRPTV9WT0xUQUdFX09CSkVDVF9JTkZPX1YzXzEgKiB2b2x0YWdlX29iamVjdF9pbmZvX3Rh YmxlLAorCQl1aW50OF90IHZvbHRhZ2VfdHlwZSwgdWludDhfdCB2b2x0YWdlX21vZGUpCit7CisJ dW5zaWduZWQgaW50IHNpemUgPSBsZTE2X3RvX2NwdSh2b2x0YWdlX29iamVjdF9pbmZvX3RhYmxl LT5zSGVhZGVyLnVzU3RydWN0dXJlU2l6ZSk7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IG9mZnNl dG9mKEFUT01fVk9MVEFHRV9PQkpFQ1RfSU5GT19WM18xLCBhc1ZvbHRhZ2VPYmpbMF0pOworCXVp bnQ4X3QgKnN0YXJ0ID0gKHVpbnQ4X3QgKil2b2x0YWdlX29iamVjdF9pbmZvX3RhYmxlOworCisJ d2hpbGUgKG9mZnNldCA8IHNpemUpIHsKKwkJY29uc3QgQVRPTV9WT0xUQUdFX09CSkVDVF9WMyAq dm9sdGFnZV9vYmplY3QgPQorCQkJKGNvbnN0IEFUT01fVk9MVEFHRV9PQkpFQ1RfVjMgKikoc3Rh cnQgKyBvZmZzZXQpOworCisJCWlmICh2b2x0YWdlX3R5cGUgPT0gdm9sdGFnZV9vYmplY3QtPmFz R3Bpb1ZvbHRhZ2VPYmouc0hlYWRlci51Y1ZvbHRhZ2VUeXBlICYmCisJCQl2b2x0YWdlX21vZGUg PT0gdm9sdGFnZV9vYmplY3QtPmFzR3Bpb1ZvbHRhZ2VPYmouc0hlYWRlci51Y1ZvbHRhZ2VNb2Rl KQorCQkJcmV0dXJuIHZvbHRhZ2Vfb2JqZWN0OworCisJCW9mZnNldCArPSBsZTE2X3RvX2NwdSh2 b2x0YWdlX29iamVjdC0+YXNHcGlvVm9sdGFnZU9iai5zSGVhZGVyLnVzU2l6ZSk7CisJfQorCisJ cmV0dXJuIE5VTEw7Cit9CisKKy8qKiBhdG9tY3RybF9nZXRfbWVtb3J5X3BsbF9kaXZpZGVyc19z aSgpLgorICoKKyAqIEBwYXJhbSBod21nciAgICAgICAgICAgICAgICAgaW5wdXQgcGFyYW1ldGVy OiBwb2ludGVyIHRvIEh3TWdyCisgKiBAcGFyYW0gY2xvY2tfdmFsdWUgICAgICAgICAgICAgaW5w dXQgcGFyYW1ldGVyOiBtZW1vcnkgY2xvY2sKKyAqIEBwYXJhbSBkaXZpZGVycyAgICAgICAgICAg ICAgICAgb3V0cHV0IHBhcmFtZXRlcjogbWVtb3J5IFBMTCBkaXZpZGVycworICogQHBhcmFtIHN0 cm9iZV9tb2RlICAgICAgICAgICAgaW5wdXQgcGFyYW1ldGVyOiAxIGZvciBzdHJvYmUgbW9kZSwg IDAgZm9yIHBlcmZvcm1hbmNlIG1vZGUKKyAqLworaW50IGF0b21jdHJsX2dldF9tZW1vcnlfcGxs X2RpdmlkZXJzX3NpKAorCQlzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLAorCQl1aW50MzJfdCBjbG9j a192YWx1ZSwKKwkJcHBfYXRvbWN0cmxfbWVtb3J5X2Nsb2NrX3BhcmFtICptcGxsX3BhcmFtLAor CQlib29sIHN0cm9iZV9tb2RlKQoreworCUNPTVBVVEVfTUVNT1JZX0NMT0NLX1BBUkFNX1BBUkFN RVRFUlNfVjJfMSBtcGxsX3BhcmFtZXRlcnM7CisJaW50IHJlc3VsdDsKKworCW1wbGxfcGFyYW1l dGVycy51bENsb2NrID0gKHVpbnQzMl90KSBjbG9ja192YWx1ZTsKKwltcGxsX3BhcmFtZXRlcnMu dWNJbnB1dEZsYWcgPSAodWludDhfdCkoKHN0cm9iZV9tb2RlKSA/IDEgOiAwKTsKKworCXJlc3Vs dCA9IGNnc19hdG9tX2V4ZWNfY21kX3RhYmxlCisJCShod21nci0+ZGV2aWNlLAorCQkgR2V0SW5k ZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgQ29tcHV0ZU1lbW9yeUNsb2NrUGFyYW0pLAorCQkg Jm1wbGxfcGFyYW1ldGVycyk7CisKKwlpZiAoMCA9PSByZXN1bHQpIHsKKwkJbXBsbF9wYXJhbS0+ bXBsbF9mYl9kaXZpZGVyLmNsa19mcmFjID0KKwkJCW1wbGxfcGFyYW1ldGVycy51bEZiRGl2LnVz RmJEaXZGcmFjOworCQltcGxsX3BhcmFtLT5tcGxsX2ZiX2RpdmlkZXIuY2xfa2YgPQorCQkJbXBs bF9wYXJhbWV0ZXJzLnVsRmJEaXYudXNGYkRpdjsKKwkJbXBsbF9wYXJhbS0+bXBsbF9wb3N0X2Rp dmlkZXIgPQorCQkJKHVpbnQzMl90KW1wbGxfcGFyYW1ldGVycy51Y1Bvc3REaXY7CisJCW1wbGxf cGFyYW0tPnZjb19tb2RlID0KKwkJCSh1aW50MzJfdCkobXBsbF9wYXJhbWV0ZXJzLnVjUGxsQ250 bEZsYWcgJgorCQkJCQlNUExMX0NOVExfRkxBR19WQ09fTU9ERV9NQVNLKTsKKwkJbXBsbF9wYXJh bS0+eWNsa19zZWwgPQorCQkJKHVpbnQzMl90KSgobXBsbF9wYXJhbWV0ZXJzLnVjUGxsQ250bEZs YWcgJgorCQkJCQkJTVBMTF9DTlRMX0ZMQUdfQllQQVNTX0RRX1BMTCkgPyAxIDogMCk7CisJCW1w bGxfcGFyYW0tPnFkciA9CisJCQkodWludDMyX3QpKChtcGxsX3BhcmFtZXRlcnMudWNQbGxDbnRs RmxhZyAmCisJCQkJCQlNUExMX0NOVExfRkxBR19RRFJfRU5BQkxFKSA/IDEgOiAwKTsKKwkJbXBs bF9wYXJhbS0+aGFsZl9yYXRlID0KKwkJCSh1aW50MzJfdCkoKG1wbGxfcGFyYW1ldGVycy51Y1Bs bENudGxGbGFnICYKKwkJCQkJCU1QTExfQ05UTF9GTEFHX0FEX0hBTEZfUkFURSkgPyAxIDogMCk7 CisJCW1wbGxfcGFyYW0tPmRsbF9zcGVlZCA9CisJCQkodWludDMyX3QpKG1wbGxfcGFyYW1ldGVy cy51Y0RsbFNwZWVkKTsKKwkJbXBsbF9wYXJhbS0+YndfY3RybCA9CisJCQkodWludDMyX3QpKG1w bGxfcGFyYW1ldGVycy51Y0JXQ250bCk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50 IGF0b21jdHJsX2dldF9lbmdpbmVfcGxsX2RpdmlkZXJzX3ZpKAorCQlzdHJ1Y3QgcHBfaHdtZ3Ig Kmh3bWdyLAorCQl1aW50MzJfdCBjbG9ja192YWx1ZSwKKwkJcHBfYXRvbWN0cmxfY2xvY2tfZGl2 aWRlcnNfdmkgKmRpdmlkZXJzKQoreworCUNPTVBVVEVfR1BVX0NMT0NLX09VVFBVVF9QQVJBTUVU RVJTX1YxXzYgcGxsX3BhdGFtZXRlcnM7CisJaW50IHJlc3VsdDsKKworCXBsbF9wYXRhbWV0ZXJz LnVsQ2xvY2sudWxDbG9jayA9IGNsb2NrX3ZhbHVlOworCXBsbF9wYXRhbWV0ZXJzLnVsQ2xvY2su dWNQb3N0RGl2ID0gQ09NUFVURV9HUFVDTEtfSU5QVVRfRkxBR19TQ0xLOworCisJcmVzdWx0ID0g Y2dzX2F0b21fZXhlY19jbWRfdGFibGUKKwkJKGh3bWdyLT5kZXZpY2UsCisJCSBHZXRJbmRleElu dG9NYXN0ZXJUYWJsZShDT01NQU5ELCBDb21wdXRlTWVtb3J5RW5naW5lUExMKSwKKwkJICZwbGxf cGF0YW1ldGVycyk7CisKKwlpZiAoMCA9PSByZXN1bHQpIHsKKwkJZGl2aWRlcnMtPnBsbF9wb3N0 X2RpdmlkZXIgPQorCQkJcGxsX3BhdGFtZXRlcnMudWxDbG9jay51Y1Bvc3REaXY7CisJCWRpdmlk ZXJzLT5yZWFsX2Nsb2NrID0KKwkJCXBsbF9wYXRhbWV0ZXJzLnVsQ2xvY2sudWxDbG9jazsKKwor CQlkaXZpZGVycy0+dWxfZmJfZGl2LnVsX2ZiX2Rpdl9mcmFjID0KKwkJCXBsbF9wYXRhbWV0ZXJz LnVsRmJEaXYudXNGYkRpdkZyYWM7CisJCWRpdmlkZXJzLT51bF9mYl9kaXYudWxfZmJfZGl2ID0K KwkJCXBsbF9wYXRhbWV0ZXJzLnVsRmJEaXYudXNGYkRpdjsKKworCQlkaXZpZGVycy0+dWNfcGxs X3JlZl9kaXYgPQorCQkJcGxsX3BhdGFtZXRlcnMudWNQbGxSZWZEaXY7CisJCWRpdmlkZXJzLT51 Y19wbGxfcG9zdF9kaXYgPQorCQkJcGxsX3BhdGFtZXRlcnMudWNQbGxQb3N0RGl2OworCQlkaXZp ZGVycy0+dWNfcGxsX2NudGxfZmxhZyA9CisJCQlwbGxfcGF0YW1ldGVycy51Y1BsbENudGxGbGFn OworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBhdG9tY3RybF9nZXRfZGZzX3BsbF9k aXZpZGVyc192aSgKKwkJc3RydWN0IHBwX2h3bWdyICpod21nciwKKwkJdWludDMyX3QgY2xvY2tf dmFsdWUsCisJCXBwX2F0b21jdHJsX2Nsb2NrX2RpdmlkZXJzX3ZpICpkaXZpZGVycykKK3sKKwlD T01QVVRFX0dQVV9DTE9DS19PVVRQVVRfUEFSQU1FVEVSU19WMV82IHBsbF9wYXRhbWV0ZXJzOwor CWludCByZXN1bHQ7CisKKwlwbGxfcGF0YW1ldGVycy51bENsb2NrLnVsQ2xvY2sgPSBjbG9ja192 YWx1ZTsKKwlwbGxfcGF0YW1ldGVycy51bENsb2NrLnVjUG9zdERpdiA9CisJCUNPTVBVVEVfR1BV Q0xLX0lOUFVUX0ZMQUdfREVGQVVMVF9HUFVDTEs7CisKKwlyZXN1bHQgPSBjZ3NfYXRvbV9leGVj X2NtZF90YWJsZQorCQkoaHdtZ3ItPmRldmljZSwKKwkJIEdldEluZGV4SW50b01hc3RlclRhYmxl KENPTU1BTkQsIENvbXB1dGVNZW1vcnlFbmdpbmVQTEwpLAorCQkgJnBsbF9wYXRhbWV0ZXJzKTsK KworCWlmICgwID09IHJlc3VsdCkgeworCQlkaXZpZGVycy0+cGxsX3Bvc3RfZGl2aWRlciA9CisJ CQlwbGxfcGF0YW1ldGVycy51bENsb2NrLnVjUG9zdERpdjsKKwkJZGl2aWRlcnMtPnJlYWxfY2xv Y2sgPQorCQkJcGxsX3BhdGFtZXRlcnMudWxDbG9jay51bENsb2NrOworCisJCWRpdmlkZXJzLT51 bF9mYl9kaXYudWxfZmJfZGl2X2ZyYWMgPQorCQkJcGxsX3BhdGFtZXRlcnMudWxGYkRpdi51c0Zi RGl2RnJhYzsKKwkJZGl2aWRlcnMtPnVsX2ZiX2Rpdi51bF9mYl9kaXYgPQorCQkJcGxsX3BhdGFt ZXRlcnMudWxGYkRpdi51c0ZiRGl2OworCisJCWRpdmlkZXJzLT51Y19wbGxfcmVmX2RpdiA9CisJ CQlwbGxfcGF0YW1ldGVycy51Y1BsbFJlZkRpdjsKKwkJZGl2aWRlcnMtPnVjX3BsbF9wb3N0X2Rp diA9CisJCQlwbGxfcGF0YW1ldGVycy51Y1BsbFBvc3REaXY7CisJCWRpdmlkZXJzLT51Y19wbGxf Y250bF9mbGFnID0KKwkJCXBsbF9wYXRhbWV0ZXJzLnVjUGxsQ250bEZsYWc7CisJfQorCisJcmV0 dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBHZXQgdGhlIHJlZmVyZW5jZSBjbG9jayBpbiAxMEtI egorICovCit1aW50MzJfdCBhdG9tY3RybF9nZXRfcmVmZXJlbmNlX2Nsb2NrKHN0cnVjdCBwcF9o d21nciAqaHdtZ3IpCit7CisJQVRPTV9GSVJNV0FSRV9JTkZPICpmd19pbmZvOworCXU4IGZyZXYs IGNyZXY7CisJdTE2IHNpemU7CisJdWludDMyX3QgY2xvY2s7CisKKwlmd19pbmZvID0gKEFUT01f RklSTVdBUkVfSU5GTyAqKQorCQljZ3NfYXRvbV9nZXRfZGF0YV90YWJsZShod21nci0+ZGV2aWNl LAorCQkJR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoREFUQSwgRmlybXdhcmVJbmZvKSwKKwkJCSZz aXplLCAmZnJldiwgJmNyZXYpOworCisJaWYgKGZ3X2luZm8gPT0gTlVMTCkKKwkJY2xvY2sgPSAy NzAwOworCWVsc2UKKwkJY2xvY2sgPSAodWludDMyX3QpKGxlMTZfdG9fY3B1KGZ3X2luZm8tPnVz UmVmZXJlbmNlQ2xvY2spKTsKKworCXJldHVybiBjbG9jazsKK30KKworLyoqCisgKiBSZXR1cm5z IDAgaWYgdGhlIGdpdmVuIHZvbHRhZ2UgdHlwZSBpcyBjb250cm9sbGVkIGJ5IEdQSU8gcGlucy4K KyAqIHZvbHRhZ2VfdHlwZSBpcyBvbmUgb2YgU0VUX1ZPTFRBR0VfVFlQRV9BU0lDX1ZEREMsCisg KiBTRVRfVk9MVEFHRV9UWVBFX0FTSUNfTVZEREMsIFNFVF9WT0xUQUdFX1RZUEVfQVNJQ19NVkRE US4KKyAqIHZvbHRhZ2VfbW9kZSBpcyBvbmUgb2YgQVRPTV9TRVRfVk9MVEFHRSwgQVRPTV9TRVRf Vk9MVEFHRV9QSEFTRQorICovCitib29sIGF0b21jdHJsX2lzX3ZvbHRhZ2VfY29udHJvbGVkX2J5 X2dwaW9fdjMoCisJCXN0cnVjdCBwcF9od21nciAqaHdtZ3IsCisJCXVpbnQ4X3Qgdm9sdGFnZV90 eXBlLAorCQl1aW50OF90IHZvbHRhZ2VfbW9kZSkKK3sKKwlBVE9NX1ZPTFRBR0VfT0JKRUNUX0lO Rk9fVjNfMSAqdm9sdGFnZV9pbmZvID0KKwkJKEFUT01fVk9MVEFHRV9PQkpFQ1RfSU5GT19WM18x ICopZ2V0X3ZvbHRhZ2VfaW5mb190YWJsZShod21nci0+ZGV2aWNlKTsKKwlib29sIHJldDsKKwor CVBQX0FTU0VSVF9XSVRIX0NPREUoKE5VTEwgIT0gdm9sdGFnZV9pbmZvKSwKKwkJCSJDb3VsZCBu b3QgZmluZCBWb2x0YWdlIFRhYmxlIGluIEJJT1MuIiwgcmV0dXJuIC0xOyk7CisKKwlyZXQgPSAo TlVMTCAhPSBhdG9tY3RybF9sb29rdXBfdm9sdGFnZV90eXBlX3YzCisJCQkodm9sdGFnZV9pbmZv LCB2b2x0YWdlX3R5cGUsIHZvbHRhZ2VfbW9kZSkpID8gMCA6IDE7CisKKwlyZXR1cm4gcmV0Owor fQorCitpbnQgYXRvbWN0cmxfZ2V0X3ZvbHRhZ2VfdGFibGVfdjMoCisJCXN0cnVjdCBwcF9od21n ciAqaHdtZ3IsCisJCXVpbnQ4X3Qgdm9sdGFnZV90eXBlLAorCQl1aW50OF90IHZvbHRhZ2VfbW9k ZSwKKwkJcHBfYXRvbWN0cmxfdm9sdGFnZV90YWJsZSAqdm9sdGFnZV90YWJsZSkKK3sKKwlBVE9N X1ZPTFRBR0VfT0JKRUNUX0lORk9fVjNfMSAqdm9sdGFnZV9pbmZvID0KKwkJKEFUT01fVk9MVEFH RV9PQkpFQ1RfSU5GT19WM18xICopZ2V0X3ZvbHRhZ2VfaW5mb190YWJsZShod21nci0+ZGV2aWNl KTsKKwljb25zdCBBVE9NX1ZPTFRBR0VfT0JKRUNUX1YzICp2b2x0YWdlX29iamVjdDsKKwl1bnNp Z25lZCBpbnQgaTsKKworCVBQX0FTU0VSVF9XSVRIX0NPREUoKE5VTEwgIT0gdm9sdGFnZV9pbmZv KSwKKwkJCSJDb3VsZCBub3QgZmluZCBWb2x0YWdlIFRhYmxlIGluIEJJT1MuIiwgcmV0dXJuIC0x Oyk7CisKKwl2b2x0YWdlX29iamVjdCA9IGF0b21jdHJsX2xvb2t1cF92b2x0YWdlX3R5cGVfdjMK KwkJKHZvbHRhZ2VfaW5mbywgdm9sdGFnZV90eXBlLCB2b2x0YWdlX21vZGUpOworCisJaWYgKHZv bHRhZ2Vfb2JqZWN0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCVBQX0FTU0VSVF9XSVRIX0NP REUoCisJCQkodm9sdGFnZV9vYmplY3QtPmFzR3Bpb1ZvbHRhZ2VPYmoudWNHcGlvRW50cnlOdW0g PD0KKwkJCVBQX0FUT01DVFJMX01BWF9WT0xUQUdFX0VOVFJJRVMpLAorCQkJIlRvbyBtYW55IHZv bHRhZ2UgZW50cmllcyEiLAorCQkJcmV0dXJuIC0xOworCQkJKTsKKworCWZvciAoaSA9IDA7IGkg PCB2b2x0YWdlX29iamVjdC0+YXNHcGlvVm9sdGFnZU9iai51Y0dwaW9FbnRyeU51bTsgaSsrKSB7 CisJCXZvbHRhZ2VfdGFibGUtPmVudHJpZXNbaV0udmFsdWUgPQorCQkJdm9sdGFnZV9vYmplY3Qt PmFzR3Bpb1ZvbHRhZ2VPYmouYXNWb2xHcGlvTHV0W2ldLnVzVm9sdGFnZVZhbHVlOworCQl2b2x0 YWdlX3RhYmxlLT5lbnRyaWVzW2ldLnNtaW9fbG93ID0KKwkJCXZvbHRhZ2Vfb2JqZWN0LT5hc0dw aW9Wb2x0YWdlT2JqLmFzVm9sR3Bpb0x1dFtpXS51bFZvbHRhZ2VJZDsKKwl9CisKKwl2b2x0YWdl X3RhYmxlLT5tYXNrX2xvdyAgICA9CisJCXZvbHRhZ2Vfb2JqZWN0LT5hc0dwaW9Wb2x0YWdlT2Jq LnVsR3Bpb01hc2tWYWw7CisJdm9sdGFnZV90YWJsZS0+Y291bnQgICAgICA9CisJCXZvbHRhZ2Vf b2JqZWN0LT5hc0dwaW9Wb2x0YWdlT2JqLnVjR3Bpb0VudHJ5TnVtOworCXZvbHRhZ2VfdGFibGUt PnBoYXNlX2RlbGF5ID0KKwkJdm9sdGFnZV9vYmplY3QtPmFzR3Bpb1ZvbHRhZ2VPYmoudWNQaGFz ZURlbGF5OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIGF0b21jdHJsX2xvb2t1cF9n cGlvX3BpbigKKwkJQVRPTV9HUElPX1BJTl9MVVQgKiBncGlvX2xvb2t1cF90YWJsZSwKKwkJY29u c3QgdWludDMyX3QgcGluSWQsCisJCXBwX2F0b21jdHJsX2dwaW9fcGluX2Fzc2lnbm1lbnQgKmdw aW9fcGluX2Fzc2lnbm1lbnQpCit7CisJdW5zaWduZWQgaW50IHNpemUgPSBsZTE2X3RvX2NwdShn cGlvX2xvb2t1cF90YWJsZS0+c0hlYWRlci51c1N0cnVjdHVyZVNpemUpOworCXVuc2lnbmVkIGlu dCBvZmZzZXQgPSBvZmZzZXRvZihBVE9NX0dQSU9fUElOX0xVVCwgYXNHUElPX1BpblswXSk7CisJ dWludDhfdCAqc3RhcnQgPSAodWludDhfdCAqKWdwaW9fbG9va3VwX3RhYmxlOworCisJd2hpbGUg KG9mZnNldCA8IHNpemUpIHsKKwkJY29uc3QgQVRPTV9HUElPX1BJTl9BU1NJR05NRU5UICpwaW5f YXNzaWdubWVudCA9CisJCQkoY29uc3QgQVRPTV9HUElPX1BJTl9BU1NJR05NRU5UICopKHN0YXJ0 ICsgb2Zmc2V0KTsKKworCQlpZiAocGluSWQgPT0gcGluX2Fzc2lnbm1lbnQtPnVjR1BJT19JRCkg eworCQkJZ3Bpb19waW5fYXNzaWdubWVudC0+dWNfZ3Bpb19waW5fYml0X3NoaWZ0ID0KKwkJCQlw aW5fYXNzaWdubWVudC0+dWNHcGlvUGluQml0U2hpZnQ7CisJCQlncGlvX3Bpbl9hc3NpZ25tZW50 LT51c19ncGlvX3Bpbl9haW5kZXggPQorCQkJCWxlMTZfdG9fY3B1KHBpbl9hc3NpZ25tZW50LT51 c0dwaW9QaW5fQUluZGV4KTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJb2Zmc2V0ICs9IG9mZnNl dG9mKEFUT01fR1BJT19QSU5fQVNTSUdOTUVOVCwgdWNHUElPX0lEKSArIDE7CisJfQorCisJcmV0 dXJuIDE7Cit9CisKKy8qKgorICogUHJpdmF0ZSBGdW5jdGlvbiB0byBnZXQgdGhlIFBvd2VyUGxh eSBUYWJsZSBBZGRyZXNzLgorICogV0FSTklORzogVGhlIHRhYmxlZCByZXR1cm5lZCBieSB0aGlz IGZ1bmN0aW9uIGlzIGluCisgKiBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbWVtb3J5LgorICogVGhl IGNhbGxlciBoYXMgdG8gcmVsZWFzZSBpZiBieSBjYWxsaW5nIGtmcmVlLgorICovCitzdGF0aWMg QVRPTV9HUElPX1BJTl9MVVQgKmdldF9ncGlvX2xvb2t1cF90YWJsZSh2b2lkICpkZXZpY2UpCit7 CisJdTggZnJldiwgY3JldjsKKwl1MTYgc2l6ZTsKKwl2b2lkICp0YWJsZV9hZGRyZXNzOworCisJ dGFibGVfYWRkcmVzcyA9IChBVE9NX0dQSU9fUElOX0xVVCAqKQorCQljZ3NfYXRvbV9nZXRfZGF0 YV90YWJsZShkZXZpY2UsCisJCQkJR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoREFUQSwgR1BJT19Q aW5fTFVUKSwKKwkJCQkmc2l6ZSwgJmZyZXYsICZjcmV2KTsKKworCVBQX0FTU0VSVF9XSVRIX0NP REUoKE5VTEwgIT0gdGFibGVfYWRkcmVzcyksCisJCQkiRXJyb3IgcmV0cmlldmluZyBCSU9TIFRh YmxlIEFkZHJlc3MhIiwgcmV0dXJuIE5VTEw7KTsKKworCXJldHVybiAoQVRPTV9HUElPX1BJTl9M VVQgKil0YWJsZV9hZGRyZXNzOworfQorCisvKioKKyAqIFJldHVybnMgMSBpZiB0aGUgZ2l2ZW4g cGluIGlkIGZpbmQgaW4gbG9va3VwIHRhYmxlLgorICovCitib29sIGF0b21jdHJsX2dldF9wcF9h c3NpZ25fcGluKAorCQlzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLAorCQljb25zdCB1aW50MzJfdCBw aW5JZCwKKwkJcHBfYXRvbWN0cmxfZ3Bpb19waW5fYXNzaWdubWVudCAqZ3Bpb19waW5fYXNzaWdu bWVudCkKK3sKKwlib29sIGJSZXQgPSAwOworCUFUT01fR1BJT19QSU5fTFVUICpncGlvX2xvb2t1 cF90YWJsZSA9CisJCWdldF9ncGlvX2xvb2t1cF90YWJsZShod21nci0+ZGV2aWNlKTsKKworCVBQ X0FTU0VSVF9XSVRIX0NPREUoKE5VTEwgIT0gZ3Bpb19sb29rdXBfdGFibGUpLAorCQkJIkNvdWxk IG5vdCBmaW5kIEdQSU8gbG9va3VwIFRhYmxlIGluIEJJT1MuIiwgcmV0dXJuIC0xKTsKKworCWJS ZXQgPSBhdG9tY3RybF9sb29rdXBfZ3Bpb19waW4oZ3Bpb19sb29rdXBfdGFibGUsIHBpbklkLAor CQlncGlvX3Bpbl9hc3NpZ25tZW50KTsKKworCXJldHVybiBiUmV0OworfQorCisvKiogYXRvbWN0 cmxfZ2V0X3ZvbHRhZ2VfZXZ2X29uX3NjbGsgZ2V0cyB2b2x0YWdlIHZpYSBjYWxsIHRvIEFUT00g Q09NTUFORCB0YWJsZS4KKyAqIEBwYXJhbSBod21nciAgICAgICAgICAgICAgIAlpbnB1dDogcG9p bnRlciB0byBod01hbmFnZXIKKyAqIEBwYXJhbSB2b2x0YWdlX3R5cGUgICAgICAgICAgICBpbnB1 dDogdHlwZSBvZiBFVlYgdm9sdGFnZSBWRERDIG9yIFZEREdGWAorICogQHBhcmFtIHNjbGsgICAg ICAgICAgICAgICAgICAgICAgICBpbnB1dDogaW4gMTBLaHogdW5pdC4gRFBNIHN0YXRlIFNDTEsg ZnJlcXVlbmN5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQl3aGljaCBp cyBkZWZpbmUgaW4gUFBUYWJsZSBTQ0xLL1ZEREMgZGVwZW5kZW5jZQorICoJCQkJdGFibGUgYXNz b2NpYXRlZCB3aXRoIHRoaXMgdmlydHVhbF92b2x0YWdlX0lkCisgKiBAcGFyYW0gdmlydHVhbF92 b2x0YWdlX0lkICAgICAgaW5wdXQ6IHZvbHRhZ2UgaWQgd2hpY2ggbWF0Y2ggcGVyIHZvbHRhZ2Ug RFBNIHN0YXRlOiAweGZmMDEsIDB4ZmYwMi4uIDB4ZmYwOAorICogQHBhcmFtIHZvbHRhZ2UJCSAg ICAgICBvdXRwdXQ6IHJlYWwgdm9sdGFnZSBsZXZlbCBpbiB1bml0IG9mIG12CisgKi8KK2ludCBh dG9tY3RybF9nZXRfdm9sdGFnZV9ldnZfb25fc2NsaygKKwkJc3RydWN0IHBwX2h3bWdyICpod21n ciwKKwkJdWludDhfdCB2b2x0YWdlX3R5cGUsCisJCXVpbnQzMl90IHNjbGssIHVpbnQxNl90IHZp cnR1YWxfdm9sdGFnZV9JZCwKKwkJdWludDE2X3QgKnZvbHRhZ2UpCit7CisJaW50IHJlc3VsdDsK KwlHRVRfVk9MVEFHRV9JTkZPX0lOUFVUX1BBUkFNRVRFUl9WMV8yIGdldF92b2x0YWdlX2luZm9f cGFyYW1fc3BhY2U7CisKKwlnZXRfdm9sdGFnZV9pbmZvX3BhcmFtX3NwYWNlLnVjVm9sdGFnZVR5 cGUgICA9CisJCXZvbHRhZ2VfdHlwZTsKKwlnZXRfdm9sdGFnZV9pbmZvX3BhcmFtX3NwYWNlLnVj Vm9sdGFnZU1vZGUgICA9CisJCUFUT01fR0VUX1ZPTFRBR0VfRVZWX1ZPTFRBR0U7CisJZ2V0X3Zv bHRhZ2VfaW5mb19wYXJhbV9zcGFjZS51c1ZvbHRhZ2VMZXZlbCAgPQorCQl2aXJ0dWFsX3ZvbHRh Z2VfSWQ7CisJZ2V0X3ZvbHRhZ2VfaW5mb19wYXJhbV9zcGFjZS51bFNDTEtGcmVxICAgICAgPQor CQlzY2xrOworCisJcmVzdWx0ID0gY2dzX2F0b21fZXhlY19jbWRfdGFibGUoaHdtZ3ItPmRldmlj ZSwKKwkJCUdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIEdldFZvbHRhZ2VJbmZvKSwK KwkJCSZnZXRfdm9sdGFnZV9pbmZvX3BhcmFtX3NwYWNlKTsKKworCWlmICgwICE9IHJlc3VsdCkK KwkJcmV0dXJuIHJlc3VsdDsKKworCSp2b2x0YWdlID0gKChHRVRfRVZWX1ZPTFRBR0VfSU5GT19P VVRQVVRfUEFSQU1FVEVSX1YxXzIgKikKKwkJCSgmZ2V0X3ZvbHRhZ2VfaW5mb19wYXJhbV9zcGFj ZSkpLT51c1ZvbHRhZ2VMZXZlbDsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogR2V0 IHRoZSBtcGxsIHJlZmVyZW5jZSBjbG9jayBpbiAxMEtIegorICovCit1aW50MzJfdCBhdG9tY3Ry bF9nZXRfbXBsbF9yZWZlcmVuY2VfY2xvY2soc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwlB VE9NX0NPTU1PTl9UQUJMRV9IRUFERVIgKmZ3X2luZm87CisJdWludDMyX3QgY2xvY2s7CisJdTgg ZnJldiwgY3JldjsKKwl1MTYgc2l6ZTsKKworCWZ3X2luZm8gPSAoQVRPTV9DT01NT05fVEFCTEVf SEVBREVSICopCisJCWNnc19hdG9tX2dldF9kYXRhX3RhYmxlKGh3bWdyLT5kZXZpY2UsCisJCQkJ R2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoREFUQSwgRmlybXdhcmVJbmZvKSwKKwkJCQkmc2l6ZSwg JmZyZXYsICZjcmV2KTsKKworCWlmIChmd19pbmZvID09IE5VTEwpCisJCWNsb2NrID0gMjcwMDsK KwllbHNlIHsKKwkJaWYgKChmd19pbmZvLT51Y1RhYmxlRm9ybWF0UmV2aXNpb24gPT0gMikgJiYK KwkJCShsZTE2X3RvX2NwdShmd19pbmZvLT51c1N0cnVjdHVyZVNpemUpID49IHNpemVvZihBVE9N X0ZJUk1XQVJFX0lORk9fVjJfMSkpKSB7CisJCQlBVE9NX0ZJUk1XQVJFX0lORk9fVjJfMSAqZndJ bmZvXzJfMSA9CisJCQkJKEFUT01fRklSTVdBUkVfSU5GT19WMl8xICopZndfaW5mbzsKKwkJCWNs b2NrID0gKHVpbnQzMl90KShsZTE2X3RvX2NwdShmd0luZm9fMl8xLT51c01lbW9yeVJlZmVyZW5j ZUNsb2NrKSk7CisJCX0gZWxzZSB7CisJCQlBVE9NX0ZJUk1XQVJFX0lORk8gKmZ3SW5mb18wXzAg PQorCQkJCShBVE9NX0ZJUk1XQVJFX0lORk8gKilmd19pbmZvOworCQkJY2xvY2sgPSAodWludDMy X3QpKGxlMTZfdG9fY3B1KGZ3SW5mb18wXzAtPnVzUmVmZXJlbmNlQ2xvY2spKTsKKwkJfQorCX0K KworCXJldHVybiBjbG9jazsKK30KKworLyoqCisgKiBHZXQgdGhlIGFzaWMgaW50ZXJuYWwgc3By ZWFkIHNwZWN0cnVtIHRhYmxlCisgKi8KK3N0YXRpYyBBVE9NX0FTSUNfSU5URVJOQUxfU1NfSU5G TyAqYXNpY19pbnRlcm5hbF9zc19nZXRfc3NfdGFibGUodm9pZCAqZGV2aWNlKQoreworCUFUT01f QVNJQ19JTlRFUk5BTF9TU19JTkZPICp0YWJsZSA9IE5VTEw7CisJdTggZnJldiwgY3JldjsKKwl1 MTYgc2l6ZTsKKworCXRhYmxlID0gKEFUT01fQVNJQ19JTlRFUk5BTF9TU19JTkZPICopCisJCWNn c19hdG9tX2dldF9kYXRhX3RhYmxlKGRldmljZSwKKwkJCUdldEluZGV4SW50b01hc3RlclRhYmxl KERBVEEsIEFTSUNfSW50ZXJuYWxTU19JbmZvKSwKKwkJCSZzaXplLCAmZnJldiwgJmNyZXYpOwor CisJcmV0dXJuIHRhYmxlOworfQorCisvKioKKyAqIEdldCB0aGUgYXNpYyBpbnRlcm5hbCBzcHJl YWQgc3BlY3RydW0gYXNzaWdubWVudAorICovCitzdGF0aWMgaW50IGFzaWNfaW50ZXJuYWxfc3Nf Z2V0X3NzX2FzaWdubWVudChzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLAorCQljb25zdCB1aW50OF90 IGNsb2NrU291cmNlLAorCQljb25zdCB1aW50MzJfdCBjbG9ja1NwZWVkLAorCQlwcF9hdG9tY3Ry bF9pbnRlcm5hbF9zc19pbmZvICpzc0VudHJ5KQoreworCUFUT01fQVNJQ19JTlRFUk5BTF9TU19J TkZPICp0YWJsZTsKKwlBVE9NX0FTSUNfU1NfQVNTSUdOTUVOVCAqc3NJbmZvOworCWludCBlbnRy eV9mb3VuZCA9IDA7CisKKwltZW1zZXQoc3NFbnRyeSwgMHgwMCwgc2l6ZW9mKHBwX2F0b21jdHJs X2ludGVybmFsX3NzX2luZm8pKTsKKworCXRhYmxlID0gYXNpY19pbnRlcm5hbF9zc19nZXRfc3Nf dGFibGUoaHdtZ3ItPmRldmljZSk7CisKKwlpZiAoTlVMTCA9PSB0YWJsZSkKKwkJcmV0dXJuIC0x OworCisJc3NJbmZvID0gJnRhYmxlLT5hc1NwcmVhZFNwZWN0cnVtWzBdOworCisJd2hpbGUgKCgo dWludDhfdCAqKXNzSW5mbyAtICh1aW50OF90ICopdGFibGUpIDwKKwkJbGUxNl90b19jcHUodGFi bGUtPnNIZWFkZXIudXNTdHJ1Y3R1cmVTaXplKSkgeworCQlpZiAoKGNsb2NrU291cmNlID09IHNz SW5mby0+dWNDbG9ja0luZGljYXRpb24pICYmCisJCQkoKHVpbnQzMl90KWNsb2NrU3BlZWQgPD0g bGUzMl90b19jcHUoc3NJbmZvLT51bFRhcmdldENsb2NrUmFuZ2UpKSkgeworCQkJZW50cnlfZm91 bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQlzc0luZm8gPSAoQVRPTV9BU0lDX1NTX0FTU0lH Tk1FTlQgKikoKHVpbnQ4X3QgKilzc0luZm8gKworCQkJCXNpemVvZihBVE9NX0FTSUNfU1NfQVNT SUdOTUVOVCkpOworCX0KKworCWlmIChlbnRyeV9mb3VuZCkgeworCQlzc0VudHJ5LT5zcGVlZF9z cGVjdHJ1bV9wZXJjZW50YWdlID0KKwkJCXNzSW5mby0+dXNTcHJlYWRTcGVjdHJ1bVBlcmNlbnRh Z2U7CisJCXNzRW50cnktPnNwZWVkX3NwZWN0cnVtX3JhdGUgPSBzc0luZm8tPnVzU3ByZWFkUmF0 ZUluS2h6OworCisJCWlmICgoKEdFVF9EQVRBX1RBQkxFX01BSk9SX1JFVklTSU9OKHRhYmxlKSA9 PSAyKSAmJgorCQkJKEdFVF9EQVRBX1RBQkxFX01JTk9SX1JFVklTSU9OKHRhYmxlKSA+PSAyKSkg fHwKKwkJCShHRVRfREFUQV9UQUJMRV9NQUpPUl9SRVZJU0lPTih0YWJsZSkgPT0gMykpIHsKKwkJ CXNzRW50cnktPnNwZWVkX3NwZWN0cnVtX3JhdGUgLz0gMTAwOworCQl9CisKKwkJc3dpdGNoIChz c0luZm8tPnVjU3ByZWFkU3BlY3RydW1Nb2RlKSB7CisJCWNhc2UgMDoKKwkJCXNzRW50cnktPnNw ZWVkX3NwZWN0cnVtX21vZGUgPQorCQkJCXBwX2F0b21jdHJsX3NwcmVhZF9zcGVjdHJ1bV9tb2Rl X2Rvd247CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJc3NFbnRyeS0+c3BlZWRfc3BlY3RydW1f bW9kZSA9CisJCQkJcHBfYXRvbWN0cmxfc3ByZWFkX3NwZWN0cnVtX21vZGVfY2VudGVyOworCQkJ YnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzc0VudHJ5LT5zcGVlZF9zcGVjdHJ1bV9tb2RlID0KKwkJ CQlwcF9hdG9tY3RybF9zcHJlYWRfc3BlY3RydW1fbW9kZV9kb3duOworCQkJYnJlYWs7CisJCX0K Kwl9CisKKwlyZXR1cm4gZW50cnlfZm91bmQgPyAwIDogMTsKK30KKworLyoqCisgKiBHZXQgdGhl IG1lbW9yeSBjbG9jayBzcHJlYWQgc3BlY3RydW0gaW5mbworICovCitpbnQgYXRvbWN0cmxfZ2V0 X21lbW9yeV9jbG9ja19zcHJlYWRfc3BlY3RydW0oCisJCXN0cnVjdCBwcF9od21nciAqaHdtZ3Is CisJCWNvbnN0IHVpbnQzMl90IG1lbW9yeV9jbG9jaywKKwkJcHBfYXRvbWN0cmxfaW50ZXJuYWxf c3NfaW5mbyAqc3NJbmZvKQoreworCXJldHVybiBhc2ljX2ludGVybmFsX3NzX2dldF9zc19hc2ln bm1lbnQoaHdtZ3IsCisJCQlBU0lDX0lOVEVSTkFMX01FTU9SWV9TUywgbWVtb3J5X2Nsb2NrLCBz c0luZm8pOworfQorLyoqCisgKiBHZXQgdGhlIGVuZ2luZSBjbG9jayBzcHJlYWQgc3BlY3RydW0g aW5mbworICovCitpbnQgYXRvbWN0cmxfZ2V0X2VuZ2luZV9jbG9ja19zcHJlYWRfc3BlY3RydW0o CisJCXN0cnVjdCBwcF9od21nciAqaHdtZ3IsCisJCWNvbnN0IHVpbnQzMl90IGVuZ2luZV9jbG9j aywKKwkJcHBfYXRvbWN0cmxfaW50ZXJuYWxfc3NfaW5mbyAqc3NJbmZvKQoreworCXJldHVybiBh c2ljX2ludGVybmFsX3NzX2dldF9zc19hc2lnbm1lbnQoaHdtZ3IsCisJCQlBU0lDX0lOVEVSTkFM X0VOR0lORV9TUywgZW5naW5lX2Nsb2NrLCBzc0luZm8pOworfQorCisKZGlmZiAtLWdpdCBhL2Ry aXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2h3bWdyL3BwYXRvbWN0cmwuaCBiL2RyaXZlcnMv Z3B1L2RybS9hbWQvcG93ZXJwbGF5L2h3bWdyL3BwYXRvbWN0cmwuaApuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwLi4yM2RhNDM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9n cHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvcHBhdG9tY3RybC5oCkBAIC0wLDAgKzEsMjM3IEBA CisvKgorICogQ29weXJpZ2h0IDIwMTUgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoK KyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkg cGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0 ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0 aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRh dGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gs IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNv ZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlz IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6 CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBu b3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwg cG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURF RCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJ TVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1F UkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBO T05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xE RVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisg KiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JU IE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04g V0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhF IFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIFBQX0FUT01WT0xUQUdFQ1RSTF9ICisjZGVm aW5lIFBQX0FUT01WT0xUQUdFQ1RSTF9ICisKKyNpbmNsdWRlICJod21nci5oIgorCisjZGVmaW5l IE1FTV9UWVBFX0dERFI1ICAweDUwCisjZGVmaW5lIE1FTV9UWVBFX0dERFI0ICAweDQwCisjZGVm aW5lIE1FTV9UWVBFX0dERFIzICAweDMwCisjZGVmaW5lIE1FTV9UWVBFX0REUjIgICAweDIwCisj ZGVmaW5lIE1FTV9UWVBFX0dERFIxICAweDEwCisjZGVmaW5lIE1FTV9UWVBFX0REUjMgICAweGIw CisjZGVmaW5lIE1FTV9UWVBFX01BU0sgICAweEYwCisKKworLyogQXMgcmV0dXJuZWQgZnJvbSBQ b3dlckNvbm5lY3RvckRldGVjdGlvblRhYmxlLiAqLworI2RlZmluZSBQUF9BVE9NX1BPV0VSX0JV REdFVF9ESVNBQkxFX09WRVJEUklWRSAgMHg4MAorI2RlZmluZSBQUF9BVE9NX1BPV0VSX0JVREdF VF9TSE9XX1dBUk5JTkcgICAgICAgMHg0MAorI2RlZmluZSBQUF9BVE9NX1BPV0VSX0JVREdFVF9T SE9XX1dBSVZFUiAgICAgICAgMHgyMAorI2RlZmluZSBQUF9BVE9NX1BPV0VSX1BPV0VSX0JVREdF VF9CRUhBVklPVVIgICAgMHgwRgorCisvKiBOZXcgZnVuY3Rpb25zIGZvciBFdmVyZ3JlZW4gYW5k IGJleW9uZC4gKi8KKyNkZWZpbmUgUFBfQVRPTUNUUkxfTUFYX1ZPTFRBR0VfRU5UUklFUyAzMgor CitzdHJ1Y3QgcHBfYXRvbWN0cmxfY2xvY2tfZGl2aWRlcnMgeworCXVpbnQzMl90IHBsbF9wb3N0 X2RpdmlkZXI7CisJdWludDMyX3QgcGxsX2ZlZWRiYWNrX2RpdmlkZXI7CisJdWludDMyX3QgcGxs X3JlZl9kaXZpZGVyOworCWJvb2wgIGVuYWJsZV9wb3N0X2RpdmlkZXI7Cit9OworCit0eXBlZGVm IHN0cnVjdCBwcF9hdG9tY3RybF9jbG9ja19kaXZpZGVycyBwcF9hdG9tY3RybF9jbG9ja19kaXZp ZGVyczsKKwordW5pb24gcHBfYXRvbWN0cmxfdGNpcGxsX2ZiX2RpdmlkZXIgeworCXN0cnVjdCB7 CisJCXVpbnQzMl90IHVsX2ZiX2Rpdl9mcmFjIDogMTQ7CisJCXVpbnQzMl90IHVsX2ZiX2RpdiA6 IDEyOworCQl1aW50MzJfdCB1bl91c2VkIDogNjsKKwl9OworCXVpbnQzMl90IHVsX2ZiX2Rpdmlk ZXI7Cit9OworCit0eXBlZGVmIHVuaW9uIHBwX2F0b21jdHJsX3RjaXBsbF9mYl9kaXZpZGVyIHBw X2F0b21jdHJsX3RjaXBsbF9mYl9kaXZpZGVyOworCitzdHJ1Y3QgcHBfYXRvbWN0cmxfY2xvY2tf ZGl2aWRlcnNfcnY3MzAgeworCXVpbnQzMl90IHBsbF9wb3N0X2RpdmlkZXI7CisJcHBfYXRvbWN0 cmxfdGNpcGxsX2ZiX2RpdmlkZXIgbXBsbF9mZWVkYmFja19kaXZpZGVyOworCXVpbnQzMl90IHBs bF9yZWZfZGl2aWRlcjsKKwlib29sICBlbmFibGVfcG9zdF9kaXZpZGVyOworCWJvb2wgIGVuYWJs ZV9kaXRoZW47CisJdWludDMyX3QgdmNvX21vZGU7Cit9OwordHlwZWRlZiBzdHJ1Y3QgcHBfYXRv bWN0cmxfY2xvY2tfZGl2aWRlcnNfcnY3MzAgcHBfYXRvbWN0cmxfY2xvY2tfZGl2aWRlcnNfcnY3 MzA7CisKKworc3RydWN0IHBwX2F0b21jdHJsX2Nsb2NrX2RpdmlkZXJzX2tvbmcgeworCXVpbnQz Ml90ICAgIHBsbF9wb3N0X2RpdmlkZXI7CisJdWludDMyX3QgICAgcmVhbF9jbG9jazsKK307Cit0 eXBlZGVmIHN0cnVjdCBwcF9hdG9tY3RybF9jbG9ja19kaXZpZGVyc19rb25nIHBwX2F0b21jdHJs X2Nsb2NrX2RpdmlkZXJzX2tvbmc7CisKK3N0cnVjdCBwcF9hdG9tY3RybF9jbG9ja19kaXZpZGVy c19jaSB7CisJdWludDMyX3QgICAgcGxsX3Bvc3RfZGl2aWRlcjsgICAgICAgICAgICAgICAvKiBw b3N0IGRpdmlkZXIgdmFsdWUgKi8KKwl1aW50MzJfdCAgICByZWFsX2Nsb2NrOworCXBwX2F0b21j dHJsX3RjaXBsbF9mYl9kaXZpZGVyICAgdWxfZmJfZGl2OyAgICAgICAgIC8qIE91dHB1dCBQYXJh bWV0ZXI6IFBMTCBGQiBkaXZpZGVyICovCisJdWludDhfdCAgIHVjX3BsbF9yZWZfZGl2OyAgICAg ICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgUGFyYW1ldGVyOiBQTEwgcmVmIGRpdmlkZXIgKi8K Kwl1aW50OF90ICAgdWNfcGxsX3Bvc3RfZGl2OyAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRw dXQgUGFyYW1ldGVyOiBQTEwgcG9zdCBkaXZpZGVyICovCisJdWludDhfdCAgIHVjX3BsbF9jbnRs X2ZsYWc7ICAgICAgICAgICAgICAgICAgICAvKk91dHB1dCBGbGFnczogY29udHJvbCBmbGFnICov Cit9OwordHlwZWRlZiBzdHJ1Y3QgcHBfYXRvbWN0cmxfY2xvY2tfZGl2aWRlcnNfY2kgcHBfYXRv bWN0cmxfY2xvY2tfZGl2aWRlcnNfY2k7CisKK3N0cnVjdCBwcF9hdG9tY3RybF9jbG9ja19kaXZp ZGVyc192aSB7CisJdWludDMyX3QgICAgcGxsX3Bvc3RfZGl2aWRlcjsgICAgICAgICAgICAgICAv KiBwb3N0IGRpdmlkZXIgdmFsdWUgKi8KKwl1aW50MzJfdCAgICByZWFsX2Nsb2NrOworCXBwX2F0 b21jdHJsX3RjaXBsbF9mYl9kaXZpZGVyICAgdWxfZmJfZGl2OyAgICAgICAgIC8qT3V0cHV0IFBh cmFtZXRlcjogUExMIEZCIGRpdmlkZXIgKi8KKwl1aW50OF90ICAgdWNfcGxsX3JlZl9kaXY7ICAg ICAgICAgICAgICAgICAgICAgIC8qT3V0cHV0IFBhcmFtZXRlcjogUExMIHJlZiBkaXZpZGVyICov CisJdWludDhfdCAgIHVjX3BsbF9wb3N0X2RpdjsgICAgICAgICAgICAgICAgICAgICAvKk91dHB1 dCBQYXJhbWV0ZXI6IFBMTCBwb3N0IGRpdmlkZXIgKi8KKwl1aW50OF90ICAgdWNfcGxsX2NudGxf ZmxhZzsgICAgICAgICAgICAgICAgICAgIC8qT3V0cHV0IEZsYWdzOiBjb250cm9sIGZsYWcgKi8K K307Cit0eXBlZGVmIHN0cnVjdCBwcF9hdG9tY3RybF9jbG9ja19kaXZpZGVyc192aSBwcF9hdG9t Y3RybF9jbG9ja19kaXZpZGVyc192aTsKKwordW5pb24gcHBfYXRvbWN0cmxfc19tcGxsX2ZiX2Rp dmlkZXIgeworCXN0cnVjdCB7CisJCXVpbnQzMl90IGNsX2tmIDogMTI7CisJCXVpbnQzMl90IGNs a19mcmFjIDogMTI7CisJCXVpbnQzMl90IHVuX3VzZWQgOiA4OworCX07CisJdWludDMyX3QgdWxf ZmJfZGl2aWRlcjsKK307Cit0eXBlZGVmIHVuaW9uIHBwX2F0b21jdHJsX3NfbXBsbF9mYl9kaXZp ZGVyIHBwX2F0b21jdHJsX3NfbXBsbF9mYl9kaXZpZGVyOworCitlbnVtIHBwX2F0b21jdHJsX3Nw cmVhZF9zcGVjdHJ1bV9tb2RlIHsKKwlwcF9hdG9tY3RybF9zcHJlYWRfc3BlY3RydW1fbW9kZV9k b3duID0gMCwKKwlwcF9hdG9tY3RybF9zcHJlYWRfc3BlY3RydW1fbW9kZV9jZW50ZXIKK307Cit0 eXBlZGVmIGVudW0gcHBfYXRvbWN0cmxfc3ByZWFkX3NwZWN0cnVtX21vZGUgcHBfYXRvbWN0cmxf c3ByZWFkX3NwZWN0cnVtX21vZGU7CisKK3N0cnVjdCBwcF9hdG9tY3RybF9tZW1vcnlfY2xvY2tf cGFyYW0geworCXBwX2F0b21jdHJsX3NfbXBsbF9mYl9kaXZpZGVyIG1wbGxfZmJfZGl2aWRlcjsK Kwl1aW50MzJfdCBtcGxsX3Bvc3RfZGl2aWRlcjsKKwl1aW50MzJfdCBid19jdHJsOworCXVpbnQz Ml90IGRsbF9zcGVlZDsKKwl1aW50MzJfdCB2Y29fbW9kZTsKKwl1aW50MzJfdCB5Y2xrX3NlbDsK Kwl1aW50MzJfdCBxZHI7CisJdWludDMyX3QgaGFsZl9yYXRlOworfTsKK3R5cGVkZWYgc3RydWN0 IHBwX2F0b21jdHJsX21lbW9yeV9jbG9ja19wYXJhbSBwcF9hdG9tY3RybF9tZW1vcnlfY2xvY2tf cGFyYW07CisKK3N0cnVjdCBwcF9hdG9tY3RybF9pbnRlcm5hbF9zc19pbmZvIHsKKwl1aW50MzJf dCBzcGVlZF9zcGVjdHJ1bV9wZXJjZW50YWdlOyAgICAgICAgICAgICAgICAgICAgICAvKiBpbiAx LzEwMCBwZXJjZW50YWdlICovCisJdWludDMyX3Qgc3BlZWRfc3BlY3RydW1fcmF0ZTsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgLyogaW4gS0h6ICovCisJcHBfYXRvbWN0cmxfc3ByZWFkX3Nw ZWN0cnVtX21vZGUgc3BlZWRfc3BlY3RydW1fbW9kZTsKK307Cit0eXBlZGVmIHN0cnVjdCBwcF9h dG9tY3RybF9pbnRlcm5hbF9zc19pbmZvIHBwX2F0b21jdHJsX2ludGVybmFsX3NzX2luZm87CisK KyNpZm5kZWYgTlVNQkVSX09GX00zQVJCX1BBUkFNUworI2RlZmluZSBOVU1CRVJfT0ZfTTNBUkJf UEFSQU1TIDMKKyNlbmRpZgorCisjaWZuZGVmIE5VTUJFUl9PRl9NM0FSQl9QQVJBTV9TRVRTCisj ZGVmaW5lIE5VTUJFUl9PRl9NM0FSQl9QQVJBTV9TRVRTIDEwCisjZW5kaWYKKworc3RydWN0IHBw X2F0b21jdHJsX2tvbmdfc3lzdGVtX2luZm8geworCXVpbnQzMl90CQkJdWxfYm9vdHVwX3VtYV9j bG9jazsgICAgICAgICAgLyogaW4gMTBrSHogdW5pdCAqLworCXVpbnQxNl90CQkJdXNfbWF4X25i X3ZvbHRhZ2U7ICAgICAgICAgICAgLyogaGlnaCBOQiB2b2x0YWdlLCBjYWxjdWxhdGVkIHVzaW5n IGN1cnJlbnQgVkRETkIgKEQyNEYyeERDKSBhbmQgVkRETkIgb2Zmc2V0IGZ1c2U7ICovCisJdWlu dDE2X3QJCQl1c19taW5fbmJfdm9sdGFnZTsgICAgICAgICAgICAvKiBsb3cgTkIgdm9sdGFnZSwg Y2FsY3VsYXRlZCB1c2luZyBjdXJyZW50IFZERE5CIChEMjRGMnhEQykgYW5kIFZERE5CIG9mZnNl dCBmdXNlOyAqLworCXVpbnQxNl90CQkJdXNfYm9vdHVwX25iX3ZvbHRhZ2U7ICAgICAgICAgLyog Ym9vdCB1cCBOQiB2b2x0YWdlICovCisJdWludDhfdAkJCXVjX2h0Y190bXBfbG10OyAgICAgICAg ICAgICAgIC8qIGJpdCBbMjI6MTZdIG9mIEQyNEYzeDY0IEhhcmR3YXJlIFRoZXJtYWwgQ29udHJv bCAoSFRDKSBSZWdpc3RlciwgbWF5IG5vdCBiZSBuZWVkZWQsIFRCRCAqLworCXVpbnQ4X3QJCQl1 Y190al9vZmZzZXQ7ICAgICAgICAgICAgICAgIC8qIGJpdCBbMjg6MjJdIG9mIEQyNEYzeEU0IFRo ZXJtdHJpcCBTdGF0dXMgUmVnaXN0ZXIsbWF5IG5vdCBiZSBuZWVkZWQsIFRCRCAqLworCS8qIDA6 IGRlZmF1bHQgMTogdXZkIDI6IGZzLTNkICovCisJdWludDMyX3QgICAgICAgICAgdWxfY3NyX20z X3NyYl9jbnRsW05VTUJFUl9PRl9NM0FSQl9QQVJBTV9TRVRTXVtOVU1CRVJfT0ZfTTNBUkJfUEFS QU1TXTsvKiBhcnJheXMgd2l0aCB2YWx1ZXMgZm9yIENTUiBNMyBhcmJpdGVyIGZvciBkZWZhdWx0 ICovCit9OwordHlwZWRlZiBzdHJ1Y3QgcHBfYXRvbWN0cmxfa29uZ19zeXN0ZW1faW5mbyBwcF9h dG9tY3RybF9rb25nX3N5c3RlbV9pbmZvOworCitzdHJ1Y3QgcHBfYXRvbWN0cmxfbWVtb3J5X2lu Zm8geworCXVpbnQ4X3QgbWVtb3J5X3ZlbmRvcjsKKwl1aW50OF90IG1lbW9yeV90eXBlOworfTsK K3R5cGVkZWYgc3RydWN0IHBwX2F0b21jdHJsX21lbW9yeV9pbmZvIHBwX2F0b21jdHJsX21lbW9y eV9pbmZvOworCisjZGVmaW5lIE1BWF9BQ19USU1JTkdfRU5UUklFUyAxNgorCitzdHJ1Y3QgcHBf YXRvbWN0cmxfbWVtb3J5X2Nsb2NrX3JhbmdlX3RhYmxlIHsKKwl1aW50OF90ICAgbnVtX2VudHJp ZXM7CisJdWludDhfdCAgIHJzdlszXTsKKworCXVpbnQzMl90IG1jbGtbTUFYX0FDX1RJTUlOR19F TlRSSUVTXTsKK307Cit0eXBlZGVmIHN0cnVjdCBwcF9hdG9tY3RybF9tZW1vcnlfY2xvY2tfcmFu Z2VfdGFibGUgcHBfYXRvbWN0cmxfbWVtb3J5X2Nsb2NrX3JhbmdlX3RhYmxlOworCitzdHJ1Y3Qg cHBfYXRvbWN0cmxfdm9sdGFnZV90YWJsZV9lbnRyeSB7CisJdWludDE2X3QgdmFsdWU7CisJdWlu dDMyX3Qgc21pb19sb3c7Cit9OworCit0eXBlZGVmIHN0cnVjdCBwcF9hdG9tY3RybF92b2x0YWdl X3RhYmxlX2VudHJ5IHBwX2F0b21jdHJsX3ZvbHRhZ2VfdGFibGVfZW50cnk7CisKK3N0cnVjdCBw cF9hdG9tY3RybF92b2x0YWdlX3RhYmxlIHsKKwl1aW50MzJfdCBjb3VudDsKKwl1aW50MzJfdCBt YXNrX2xvdzsKKwl1aW50MzJfdCBwaGFzZV9kZWxheTsgICAvKiBVc2VkIGZvciBBVE9NX0dQSU9f Vk9MVEFHRV9PQkpFQ1RfVjMgYW5kIGxhdGVyICovCisJcHBfYXRvbWN0cmxfdm9sdGFnZV90YWJs ZV9lbnRyeSBlbnRyaWVzW1BQX0FUT01DVFJMX01BWF9WT0xUQUdFX0VOVFJJRVNdOworfTsKKwor dHlwZWRlZiBzdHJ1Y3QgcHBfYXRvbWN0cmxfdm9sdGFnZV90YWJsZSBwcF9hdG9tY3RybF92b2x0 YWdlX3RhYmxlOworCisjZGVmaW5lIFZCSU9TX01DX1JFR0lTVEVSX0FSUkFZX1NJWkUgICAgICAg ICAgIDMyCisjZGVmaW5lIFZCSU9TX01BWF9BQ19USU1JTkdfRU5UUklFUyAgICAgICAgICAgIDIw CisKK3N0cnVjdCBwcF9hdG9tY3RybF9tY19yZWdfZW50cnkgeworCXVpbnQzMl90ICAgICAgICAg ICBtY2xrX21heDsKKwl1aW50MzJfdCBtY19kYXRhW1ZCSU9TX01DX1JFR0lTVEVSX0FSUkFZX1NJ WkVdOworfTsKK3R5cGVkZWYgc3RydWN0IHBwX2F0b21jdHJsX21jX3JlZ19lbnRyeSBwcF9hdG9t Y3RybF9tY19yZWdfZW50cnk7CisKK3N0cnVjdCBwcF9hdG9tY3RybF9tY19yZWdpc3Rlcl9hZGRy ZXNzIHsKKwl1aW50MTZfdCBzMTsKKwl1aW50OF90ICB1Y19wcmVfcmVnX2RhdGE7Cit9OworCit0 eXBlZGVmIHN0cnVjdCBwcF9hdG9tY3RybF9tY19yZWdpc3Rlcl9hZGRyZXNzIHBwX2F0b21jdHJs X21jX3JlZ2lzdGVyX2FkZHJlc3M7CisKK3N0cnVjdCBwcF9hdG9tY3RybF9tY19yZWdfdGFibGUg eworCXVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdDsgICAgICAgICAgICAgICAg ICAgIC8qIG51bWJlciBvZiByZWdpc3RlcnMgKi8KKwl1aW50OF90ICAgICAgICAgICAgICAgICAg ICAgICAgIG51bV9lbnRyaWVzOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgQUMgdGltaW5nIGVu dHJpZXMgKi8KKwlwcF9hdG9tY3RybF9tY19yZWdfZW50cnkgICAgICAgIG1jX3JlZ190YWJsZV9l bnRyeVtWQklPU19NQVhfQUNfVElNSU5HX0VOVFJJRVNdOworCXBwX2F0b21jdHJsX21jX3JlZ2lz dGVyX2FkZHJlc3MgbWNfcmVnX2FkZHJlc3NbVkJJT1NfTUNfUkVHSVNURVJfQVJSQVlfU0laRV07 Cit9OwordHlwZWRlZiBzdHJ1Y3QgcHBfYXRvbWN0cmxfbWNfcmVnX3RhYmxlIHBwX2F0b21jdHJs X21jX3JlZ190YWJsZTsKKworc3RydWN0IHBwX2F0b21jdHJsX2dwaW9fcGluX2Fzc2lnbm1lbnQg eworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgIHVzX2dwaW9fcGluX2FpbmRleDsKKwl1aW50 OF90ICAgICAgICAgICAgICAgICAgICB1Y19ncGlvX3Bpbl9iaXRfc2hpZnQ7Cit9OwordHlwZWRl ZiBzdHJ1Y3QgcHBfYXRvbWN0cmxfZ3Bpb19waW5fYXNzaWdubWVudCBwcF9hdG9tY3RybF9ncGlv X3Bpbl9hc3NpZ25tZW50OworCitleHRlcm4gYm9vbCBhdG9tY3RybF9nZXRfcHBfYXNzaWduX3Bp bihzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLCBjb25zdCB1aW50MzJfdCBwaW5JZCwgcHBfYXRvbWN0 cmxfZ3Bpb19waW5fYXNzaWdubWVudCAqZ3Bpb19waW5fYXNzaWdubWVudCk7CitleHRlcm4gaW50 IGF0b21jdHJsX2dldF92b2x0YWdlX2V2dl9vbl9zY2xrKHN0cnVjdCBwcF9od21nciAqaHdtZ3Is IHVpbnQ4X3Qgdm9sdGFnZV90eXBlLCB1aW50MzJfdCBzY2xrLCB1aW50MTZfdCB2aXJ0dWFsX3Zv bHRhZ2VfSWQsIHVpbnQxNl90ICp2b2x0YWdlKTsKK2V4dGVybiB1aW50MzJfdCBhdG9tY3RybF9n ZXRfbXBsbF9yZWZlcmVuY2VfY2xvY2soc3RydWN0IHBwX2h3bWdyICpod21ncik7CitleHRlcm4g aW50IGF0b21jdHJsX2dldF9tZW1vcnlfY2xvY2tfc3ByZWFkX3NwZWN0cnVtKHN0cnVjdCBwcF9o d21nciAqaHdtZ3IsIGNvbnN0IHVpbnQzMl90IG1lbW9yeV9jbG9jaywgcHBfYXRvbWN0cmxfaW50 ZXJuYWxfc3NfaW5mbyAqc3NJbmZvKTsKK2V4dGVybiBpbnQgYXRvbWN0cmxfZ2V0X2VuZ2luZV9j bG9ja19zcHJlYWRfc3BlY3RydW0oc3RydWN0IHBwX2h3bWdyICpod21nciwgY29uc3QgdWludDMy X3QgZW5naW5lX2Nsb2NrLCBwcF9hdG9tY3RybF9pbnRlcm5hbF9zc19pbmZvICpzc0luZm8pOwor ZXh0ZXJuIGludCBhdG9tY3RybF9pbml0aWFsaXplX21jX3JlZ190YWJsZShzdHJ1Y3QgcHBfaHdt Z3IgKmh3bWdyLCB1aW50OF90IG1vZHVsZV9pbmRleCwgcHBfYXRvbWN0cmxfbWNfcmVnX3RhYmxl ICp0YWJsZSk7CitleHRlcm4gaW50IGF0b21jdHJsX3NldF9lbmdpbmVfZHJhbV90aW1pbmdzX3J2 NzcwKHN0cnVjdCBwcF9od21nciAqaHdtZ3IsIHVpbnQzMl90IGVuZ2luZV9jbG9jaywgdWludDMy X3QgbWVtb3J5X2Nsb2NrKTsKK2V4dGVybiB1aW50MzJfdCBhdG9tY3RybF9nZXRfcmVmZXJlbmNl X2Nsb2NrKHN0cnVjdCBwcF9od21nciAqaHdtZ3IpOworZXh0ZXJuIGludCBhdG9tY3RybF9nZXRf bWVtb3J5X3BsbF9kaXZpZGVyc19zaShzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLCB1aW50MzJfdCBj bG9ja192YWx1ZSwgcHBfYXRvbWN0cmxfbWVtb3J5X2Nsb2NrX3BhcmFtICptcGxsX3BhcmFtLCBi b29sIHN0cm9iZV9tb2RlKTsKK2V4dGVybiBpbnQgYXRvbWN0cmxfZ2V0X2VuZ2luZV9wbGxfZGl2 aWRlcnNfdmkoc3RydWN0IHBwX2h3bWdyICpod21nciwgdWludDMyX3QgY2xvY2tfdmFsdWUsIHBw X2F0b21jdHJsX2Nsb2NrX2RpdmlkZXJzX3ZpICpkaXZpZGVycyk7CitleHRlcm4gaW50IGF0b21j dHJsX2dldF9kZnNfcGxsX2RpdmlkZXJzX3ZpKHN0cnVjdCBwcF9od21nciAqaHdtZ3IsIHVpbnQz Ml90IGNsb2NrX3ZhbHVlLCBwcF9hdG9tY3RybF9jbG9ja19kaXZpZGVyc192aSAqZGl2aWRlcnMp OworZXh0ZXJuIGJvb2wgYXRvbWN0cmxfaXNfdm9sdGFnZV9jb250cm9sZWRfYnlfZ3Bpb192Myhz dHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLCB1aW50OF90IHZvbHRhZ2VfdHlwZSwgdWludDhfdCB2b2x0 YWdlX21vZGUpOworZXh0ZXJuIGludCBhdG9tY3RybF9nZXRfdm9sdGFnZV90YWJsZV92MyhzdHJ1 Y3QgcHBfaHdtZ3IgKmh3bWdyLCB1aW50OF90IHZvbHRhZ2VfdHlwZSwgdWludDhfdCB2b2x0YWdl X21vZGUsIHBwX2F0b21jdHJsX3ZvbHRhZ2VfdGFibGUgKnZvbHRhZ2VfdGFibGUpOworCisKKyNl bmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21nci9w cGludGVycnVwdC5oIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvcHBpbnRl cnJ1cHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjY5YWMxCi0tLSAv ZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvcHBpbnRl cnJ1cHQuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgQWR2YW5jZWQg TWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQs IGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRo aXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0 d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwg aW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHks IG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQv b3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8g d2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0 aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3Rp Y2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFs bCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAq IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFO WSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVE IFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEg UEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFM TAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1Ig QU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4g QUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwg T1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgor ICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworI2lmbmRlZiBQUF9J TlRFUlJVUFRfSAorI2RlZmluZSBQUF9JTlRFUlJVUFRfSAorCisvKioKKyAqIFRoZSB0eXBlIG9m IHRoZSBpbnRlcnJ1cHQgY2FsbGJhY2sgZnVuY3Rpb25zIGluIFBvd2VyUGxheQorICovCit0eXBl ZGVmIHZvaWQgKCpwcF9pbnRlcnJ1cHRfY2FsbGJhY2spICh2b2lkICpjb250ZXh0LCB1aW50MzJf dCB1bF9jb250ZXh0X2RhdGEpOworCisvKioKKyAqIEV2ZW50IE1hbmFnZXIgYWN0aW9uIGNoYWlu IGxpc3QgaW5mb3JtYXRpb24KKyAqLworc3RydWN0IHBwX2ludGVycnVwdF9yZWdpc3RyYXRpb25f aW5mbyB7CisJcHBfaW50ZXJydXB0X2NhbGxiYWNrIGNhbGxiYWNrOyAgLyogUG9pbnRlciB0byBj YWxsYmFjayBmdW5jdGlvbiAqLworCXZvaWQgKmNvbnRleHQ7ICAgICAgICAgICAgICAgICAgLyog UG9pbnRlciB0byBjYWxsYmFjayBmdW5jdGlvbiBjb250ZXh0ICovCisJdWludDMyX3QgKmludGVy cnVwdF9lbmFibGVfaWQ7ICAgIC8qIFJlZ2lzdGVyZWQgaW50ZXJydXB0IGlkICovCit9OworCit0 eXBlZGVmIHN0cnVjdCBwcF9pbnRlcnJ1cHRfcmVnaXN0cmF0aW9uX2luZm8gcHBfaW50ZXJydXB0 X3JlZ2lzdHJhdGlvbl9pbmZvOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS9hbWQvcG93ZXJwbGF5L2h3bWdyL3BwcGNpZWxhbmVzLmMgYi9kcml2ZXJzL2dwdS9kcm0vYW1k L3Bvd2VycGxheS9od21nci9wcHBjaWVsYW5lcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAuLjE4NjQ5NmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1k L3Bvd2VycGxheS9od21nci9wcHBjaWVsYW5lcy5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBD b3B5cmlnaHQgMjAxNSBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogUGVybWlz c2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0 YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVu dGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2Fy ZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0 aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0 ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFu ZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVk IHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBU aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFs bCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBv ZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIs IFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElO Q0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM SVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdF TUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBB VVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJ QUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJX SVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBT T0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUu CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgImF0b20tdHlw ZXMuaCIKKyNpbmNsdWRlICJhdG9tYmlvcy5oIgorI2luY2x1ZGUgInBwcGNpZWxhbmVzLmgiCisK Ky8qKiBcZmlsZQorICogRnVuY3Rpb25zIHJlbGF0ZWQgdG8gUENJZSBsYW5lIGNoYW5nZXMuCisg Ki8KKworLyogRm9yIGNvbnZlcnRpbmcgZnJvbSBudW1iZXIgb2YgbGFuZXMgdG8gbGFuZSBiaXRz LiAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBwX3I2MDBfZW5jb2RlX2xhbmVzW10g PSB7CisJMCwgICAgICAgICAgLyogIDAgTm90IFN1cHBvcnRlZCAgKi8KKwkxLCAgICAgICAgICAv KiAgMSBMYW5lICAqLworCTIsICAgICAgICAgIC8qICAyIExhbmVzICAqLworCTAsICAgICAgICAg IC8qICAzIE5vdCBTdXBwb3J0ZWQgICovCisJMywgICAgICAgICAgLyogIDQgTGFuZXMgICovCisJ MCwgICAgICAgICAgLyogIDUgTm90IFN1cHBvcnRlZCAgKi8KKwkwLCAgICAgICAgICAvKiAgNiBO b3QgU3VwcG9ydGVkICAqLworCTAsICAgICAgICAgIC8qICA3IE5vdCBTdXBwb3J0ZWQgICovCisJ NCwgICAgICAgICAgLyogIDggTGFuZXMgICovCisJMCwgICAgICAgICAgLyogIDkgTm90IFN1cHBv cnRlZCAgKi8KKwkwLCAgICAgICAgICAvKiAxMCBOb3QgU3VwcG9ydGVkICAqLworCTAsICAgICAg ICAgIC8qIDExIE5vdCBTdXBwb3J0ZWQgICovCisJNSwgICAgICAgICAgLyogMTIgTGFuZXMgKE5v dCBhY3R1YWxseSBzdXBwb3J0ZWQpICAqLworCTAsICAgICAgICAgIC8qIDEzIE5vdCBTdXBwb3J0 ZWQgICovCisJMCwgICAgICAgICAgLyogMTQgTm90IFN1cHBvcnRlZCAgKi8KKwkwLCAgICAgICAg ICAvKiAxNSBOb3QgU3VwcG9ydGVkICAqLworCTYgICAgICAgICAgIC8qIDE2IExhbmVzICAqLwor fTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcHBfcjYwMF9kZWNvZGVkX2xhbmVzWzhd ID0geyAxNiwgMSwgMiwgNCwgOCwgMTIsIDE2LCB9OworCit1aW50OF90IGVuY29kZV9wY2llX2xh bmVfd2lkdGgodWludDMyX3QgbnVtX2xhbmVzKQoreworCXJldHVybiBwcF9yNjAwX2VuY29kZV9s YW5lc1tudW1fbGFuZXNdOworfQorCit1aW50OF90IGRlY29kZV9wY2llX2xhbmVfd2lkdGgodWlu dDMyX3QgbnVtX2xhbmVzKQoreworCXJldHVybiBwcF9yNjAwX2RlY29kZWRfbGFuZXNbbnVtX2xh bmVzXTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2h3bWdy L3BwcGNpZWxhbmVzLmggYi9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21nci9wcHBj aWVsYW5lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYjE2M2IKLS0t IC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21nci9wcHBj aWVsYW5lcy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBBZHZhbmNl ZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRl ZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2Yg dGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNv ZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9u LCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29w eSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFu ZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0 byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRv IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5v dGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICog YWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgor ICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0Yg QU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlU RUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1Ig QSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNI QUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZP UiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBB TiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9N LCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9S CisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYg UFBfUENJRUxBTkVTX0gKKyNkZWZpbmUgUFBfUENJRUxBTkVTX0gKKworZXh0ZXJuIHVpbnQ4X3Qg ZW5jb2RlX3BjaWVfbGFuZV93aWR0aCh1aW50MzJfdCBudW1fbGFuZXMpOworZXh0ZXJuIHVpbnQ4 X3QgZGVjb2RlX3BjaWVfbGFuZV93aWR0aCh1aW50MzJfdCBudW1fbGFuZXMpOworCisjZW5kaWYK KwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvdG9uZ2Ff ZHluX2RlZmF1bHRzLmggYi9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21nci90b25n YV9keW5fZGVmYXVsdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODBk NjlkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdt Z3IvdG9uZ2FfZHluX2RlZmF1bHRzLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmln aHQgMjAxNSBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBp cyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5n IGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9u IGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRo b3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmln aHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3Vi bGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBw ZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRv IHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJv dmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBp bmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUg U29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhP VVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElO RyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAor ICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4g IElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1Io UykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElU WSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAor ICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FS RSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgor ICovCisjaWZuZGVmIFRPTkdBX0RZTl9ERUZBVUxUU19ICisjZGVmaW5lIFRPTkdBX0RZTl9ERUZB VUxUU19ICisKKworLyoqIFxmaWxlCisgKiBWb2xjYW5pYyBJc2xhbmRzIER5bmFtaWMgZGVmYXVs dCBwYXJhbWV0ZXJzLgorICovCisKK2VudW0gVE9OR0FkcG1fVHJlbmREZXRlY3Rpb24geworCVRP TkdBZHBtX1RyZW5kRGV0ZWN0aW9uX0FVVE8sCisJVE9OR0FkcG1fVHJlbmREZXRlY3Rpb25fVVAs CisJVE9OR0FkcG1fVHJlbmREZXRlY3Rpb25fRE9XTgorfTsKK3R5cGVkZWYgZW51bSBUT05HQWRw bV9UcmVuZERldGVjdGlvbiBUT05HQWRwbV9UcmVuZERldGVjdGlvbjsKKworLyogQml0IHZlY3Rv ciByZXByZXNlbnRpbmcgc2FtZSBmaWVsZHMgYXMgaGFyZHdhcmUgcmVnaXN0ZXIuICovCisjZGVm aW5lIFBQVE9OR0FfVk9USU5HUklHSFRTQ0xJRU5UU19ERkxUMCAgICAgICAgICAgICAgMHgzRkZG QzEwMiAgLyogQ1BfR2Z4X2J1c3kgKi8KKy8qIEhEUF9idXN5ICovCisvKiBJSF9idXN5ICovCisv KiBEUk1fYnVzeSAqLworLyogRFJNRE1BX2J1c3kgKi8KKy8qIFVWRF9idXN5ICovCisvKiBWQ0Vf YnVzeSAqLworLyogQUNQX2J1c3kgKi8KKy8qIFNBTVVfYnVzeSAqLworLyogQVZQX2J1c3kgICov CisvKiBTRE1BIGVuYWJsZWQgKi8KKyNkZWZpbmUgUFBUT05HQV9WT1RJTkdSSUdIVFNDTElFTlRT X0RGTFQxICAgICAgICAgICAgICAweDAwMDQwMCAgLyogRkVfR2Z4X2J1c3kgIC0gSW50ZW5kZWQg Zm9yIHByaW1hcnkgdXNhZ2UuICAgUmVzdCBhcmUgZm9yIGZsZXhpYmlsaXR5LiAqLworLyogU0hf R2Z4X2J1c3kgKi8KKy8qIFJCX0dmeF9idXN5ICovCisvKiBWQ0VfYnVzeSAqLworCisjZGVmaW5l IFBQVE9OR0FfVk9USU5HUklHSFRTQ0xJRU5UU19ERkxUMiAgICAgICAgICAgICAgMHhDMDAwODAg IC8qIFNIX0dmeF9idXN5IC0gSW50ZW5kZWQgZm9yIHByaW1hcnkgdXNhZ2UuICAgUmVzdCBhcmUg Zm9yIGZsZXhpYmlsaXR5LiAqLworLyogRkVfR2Z4X2J1c3kgKi8KKy8qIFJCX0dmeF9idXN5ICov CisvKiBBQ1BfYnVzeSAqLworCisjZGVmaW5lIFBQVE9OR0FfVk9USU5HUklHSFRTQ0xJRU5UU19E RkxUMyAgICAgICAgICAgICAgMHhDMDAyMDAgIC8qIFJCX0dmeF9idXN5IC0gSW50ZW5kZWQgZm9y IHByaW1hcnkgdXNhZ2UuICAgUmVzdCBhcmUgZm9yIGZsZXhpYmlsaXR5LiAqLworLyogRkVfR2Z4 X2J1c3kgKi8KKy8qIFNIX0dmeF9idXN5ICovCisvKiBVVkRfYnVzeSAqLworCisjZGVmaW5lIFBQ VE9OR0FfVk9USU5HUklHSFRTQ0xJRU5UU19ERkxUNCAgICAgICAgICAgICAgMHhDMDE2ODAgIC8q IFVWRF9idXN5ICovCisvKiBWQ0VfYnVzeSAqLworLyogQUNQX2J1c3kgKi8KKy8qIFNBTVVfYnVz eSAqLworCisjZGVmaW5lIFBQVE9OR0FfVk9USU5HUklHSFRTQ0xJRU5UU19ERkxUNSAgICAgICAg ICAgICAgMHhDMDAwMzMgIC8qIEdGWCwgSERQLCBEUk1ETUEgKi8KKyNkZWZpbmUgUFBUT05HQV9W T1RJTkdSSUdIVFNDTElFTlRTX0RGTFQ2ICAgICAgICAgICAgICAweEMwMDAzMyAgLyogR0ZYLCBI RFAsIERSTURNQSAqLworI2RlZmluZSBQUFRPTkdBX1ZPVElOR1JJR0hUU0NMSUVOVFNfREZMVDcg ICAgICAgICAgICAgIDB4M0ZGRkMwMDAgIC8qIEdGWCwgSERQLCBEUk1ETUEgKi8KKworCisvKiB0 aGVybWFsIHByb3RlY3Rpb24gY291bnRlciAodW5pdHMpLiovCisjZGVmaW5lIFBQVE9OR0FfVEhF Uk1BTFBST1RFQ1RDT1VOVEVSX0RGTFQgICAgICAgICAgICAweDIwMCAvKiB+MTl1cyAqLworCisv KiBzdGF0aWMgc2NyZWVuIHRocmVzaG9sZCB1bml0ICovCisjZGVmaW5lIFBQVE9OR0FfU1RBVElD U0NSRUVOVEhSRVNIT0xEVU5JVF9ERkxUICAgICAgICAwCisKKy8qIHN0YXRpYyBzY3JlZW4gdGhy ZXNob2xkICovCisjZGVmaW5lIFBQVE9OR0FfU1RBVElDU0NSRUVOVEhSRVNIT0xEX0RGTFQgICAg ICAgICAgICAweDAwQzgKKworLyogZ2Z4IGlkbGUgY2xvY2sgc3RvcCB0aHJlc2hvbGQgKi8KKyNk ZWZpbmUgUFBUT05HQV9HRlhJRExFQ0xPQ0tTVE9QVEhSRVNIT0xEX0RGTFQgICAgICAgIDB4MjAw IC8qIH4xOXVzIHdpdGggc3RhdGljIHNjcmVlbiB0aHJlc2hvbGQgdW5pdCBvZiAwICovCisKKy8q IEZpeGVkIHJlZmVyZW5jZSBkaXZpZGVyIHRvIHVzZSB3aGVuIGJ1aWxkaW5nIGJhYnkgc3RlcHBp bmcgdGFibGVzLiAqLworI2RlZmluZSBQUFRPTkdBX1JFRkVSRU5DRURJVklERVJfREZMVCAgICAg ICAgICAgICAgICAgIDQKKworLyoKKyAqIFVMViB2b2x0YWdlIGNoYW5nZSBkZWxheSB0aW1lCisg KiBVc2VkIHRvIGJlIGRlbGF5X3ZyZWcgaW4gTi5JLiBzcGxpdCBmb3IgUy5JLgorICogVXNpbmcg Ti5JLiBkZWxheV92cmVnIHZhbHVlIGFzIGRlZmF1bHQKKyAqIFJlZmVyZW5jZUNsb2NrID0gMjcw MAorICogVm9sdGFnZVJlc3BvbnNlVGltZSA9IDEwMDAKKyAqIFZERENEZWxheVRpbWUgPSAoVm9s dGFnZVJlc3BvbnNlVGltZSAqIFJlZmVyZW5jZUNsb2NrKSAvIDE2MDAgPSAxNjg3CisgKi8KKwor I2RlZmluZSBQUFRPTkdBX1VMVlZPTFRBR0VDSEFOR0VERUxBWV9ERkxUICAgICAgICAgICAgIDE2 ODcKKworI2RlZmluZSBQUFRPTkdBX0NHVUxWUEFSQU1FVEVSX0RGTFQgICAgICAgICAgICAgICAg ICAgIDB4MDAwNDAwMzUKKyNkZWZpbmUgUFBUT05HQV9DR1VMVkNPTlRST0xfREZMVCAgICAgICAg ICAgICAgICAgICAgICAweDAwMDA3NDUwCisjZGVmaW5lIFBQVE9OR0FfVEFSR0VUQUNUSVZJVFlf REZMVCAgICAgICAgICAgICAgICAgICAgIDMwICAvKjMwJSAgKi8KKyNkZWZpbmUgUFBUT05HQV9N Q0xLX1RBUkdFVEFDVElWSVRZX0RGTFQgICAgICAgICAgICAgICAgMTAgIC8qMTAlICAqLworCisj ZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3Iv dG9uZ2FfaHdtZ3IuYyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2h3bWdyL3Rvbmdh X2h3bWdyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZlYjFhOAotLS0g L2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2h3bWdyL3Rvbmdh X2h3bWdyLmMKQEAgLTAsMCArMSw1NzE0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgQWR2YW5j ZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50 ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9m IHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJT b2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlv biwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNv cHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBh bmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMg dG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0 byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBu b3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAq IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoK KyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9G IEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1J VEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBT SEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBG T1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g QU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJP TSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBP UgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworI2luY2x1ZGUg PGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51 eC9mYi5oPgorI2luY2x1ZGUgImxpbnV4L2RlbGF5LmgiCisjaW5jbHVkZSAicHBfYWNwaS5oIgor I2luY2x1ZGUgImh3bWdyLmgiCisjaW5jbHVkZSA8YXRvbWJpb3MuaD4KKyNpbmNsdWRlICJ0b25n YV9od21nci5oIgorI2luY2x1ZGUgInBwdGFibGUuaCIKKyNpbmNsdWRlICJwcm9jZXNzcHB0YWJs ZXMuaCIKKyNpbmNsdWRlICJ0b25nYV9wcm9jZXNzcHB0YWJsZXMuaCIKKyNpbmNsdWRlICJ0b25n YV9wcHRhYmxlLmgiCisjaW5jbHVkZSAicHBfZGVidWcuaCIKKyNpbmNsdWRlICJ0b25nYV9wcHNt Yy5oIgorI2luY2x1ZGUgImNnc19jb21tb24uaCIKKyNpbmNsdWRlICJwcHBjaWVsYW5lcy5oIgor I2luY2x1ZGUgInRvbmdhX2R5bl9kZWZhdWx0cy5oIgorI2luY2x1ZGUgInNtdW1nci5oIgorI2lu Y2x1ZGUgInRvbmdhX3NtdW1nci5oIgorCisjaW5jbHVkZSAic211L3NtdV83XzFfMl9kLmgiCisj aW5jbHVkZSAic211L3NtdV83XzFfMl9zaF9tYXNrLmgiCisKKyNpbmNsdWRlICJnbWMvZ21jXzhf MV9kLmgiCisjaW5jbHVkZSAiZ21jL2dtY184XzFfc2hfbWFzay5oIgorCisjaW5jbHVkZSAiYmlm L2JpZl81XzBfZC5oIgorI2luY2x1ZGUgImJpZi9iaWZfNV8wX3NoX21hc2suaCIKKworI2RlZmlu ZSBNQ19DR19BUkJfRlJFUV9GMCAgICAgICAgICAgMHgwYQorI2RlZmluZSBNQ19DR19BUkJfRlJF UV9GMSAgICAgICAgICAgMHgwYgorI2RlZmluZSBNQ19DR19BUkJfRlJFUV9GMiAgICAgICAgICAg MHgwYworI2RlZmluZSBNQ19DR19BUkJfRlJFUV9GMyAgICAgICAgICAgMHgwZAorCisjZGVmaW5l IE1DX0NHX1NFUV9EUkFNQ09ORl9TMCAgICAgICAweDA1CisjZGVmaW5lIE1DX0NHX1NFUV9EUkFN Q09ORl9TMSAgICAgICAweDA2CisjZGVmaW5lIE1DX0NHX1NFUV9ZQ0xLX1NVU1BFTkQgICAgICAw eDA0CisjZGVmaW5lIE1DX0NHX1NFUV9ZQ0xLX1JFU1VNRSAgICAgICAweDBhCisKKyNkZWZpbmUg UENJRV9CVVNfQ0xLICAgICAgICAgICAgICAgIDEwMDAwCisjZGVmaW5lIFRDTEsgICAgICAgICAg ICAgICAgICAgICAgICAoUENJRV9CVVNfQ0xLIC8gMTApCisKKyNkZWZpbmUgU01DX1JBTV9FTkQg MHg0MDAwMAorI2RlZmluZSBTTUNfQ0dfSU5EX1NUQVJUICAgICAgICAgICAgMHhjMDAzMDAwMAor I2RlZmluZSBTTUNfQ0dfSU5EX0VORCAgICAgICAgICAgICAgMHhjMDA0MDAwMCAgLyogRmlyc3Qg Ynl0ZSBhZnRlciBTTUNfQ0dfSU5EKi8KKworI2RlZmluZSBWT0xUQUdFX1NDQUxFICAgICAgICAg ICAgICAgNAorI2RlZmluZSBWT0xUQUdFX1ZJRF9PRkZTRVRfU0NBTEUxICAgNjI1CisjZGVmaW5l IFZPTFRBR0VfVklEX09GRlNFVF9TQ0FMRTIgICAxMDAKKworI2RlZmluZSBWRERDX1ZERENJX0RF TFRBICAgICAgICAgICAgMjAwCisjZGVmaW5lIFZERENfVkRER0ZYX0RFTFRBICAgICAgICAgICAz MDAKKworI2RlZmluZSBNQ19TRVFfTUlTQzBfR0REUjVfU0hJRlQgMjgKKyNkZWZpbmUgTUNfU0VR X01JU0MwX0dERFI1X01BU0sgIDB4ZjAwMDAwMDAKKyNkZWZpbmUgTUNfU0VRX01JU0MwX0dERFI1 X1ZBTFVFIDUKKwordHlwZWRlZiB1aW50MzJfdCBQRUNJX1JlZ2lzdHJ5VmFsdWU7CisKKy8qIFsy LjUlLH4yLjUlXSBDbG9jayBzdHJldGNoZWQgaXMgbXVsdGlwbGUgb2YgMi41JSB2cyBub3QgYW5k IFtGbWluLCBGbWF4LCBMRE9fUkVGU0VMLCBVU0VfRk9SX0xPV19GUkVRXSAqLwordWludDE2X3Qg UFBfQ2xvY2tTdHJldGNoZXJMb29rdXBUYWJsZVsyXVs0XSA9IHsKKwl7NjAwLCAxMDUwLCAzLCAw fSwKKwl7NjAwLCAxMDUwLCA2LCAxfSB9OworCisvKiBbRkYsIFNTXSB0eXBlLCBbXSA0IHZvbHRh Z2UgcmFuZ2VzLCBhbmQgW0Zsb29yIEZyZXEsIEJvdW5kYXJ5IEZyZXEsIFZJRCBtaW4gLCBWSUQg bWF4XSAqLwordWludDMyX3QgUFBfQ2xvY2tTdHJldGNoZXJERFRUYWJsZVsyXVs0XVs0XSA9IHsK Kwl7IHsyNjUsIDUyOSwgMTIwLCAxMjh9LCB7MzI1LCA2NTAsIDk2LCAxMTl9LCB7NDMwLCA4NjAs IDMyLCA5NX0sIHswLCAwLCAwLCAzMX0gfSwKKwl7IHsyNzUsIDU1MCwgMTA0LCAxMTJ9LCB7MzE5 LCA2MzgsIDk2LCAxMDN9LCB7MzYwLCA3MjAsIDY0LCA5NX0sIHszODQsIDc2OCwgMzIsIDYzfSB9 IH07CisKKy8qIFtVc2VfRm9yX0xvd19mcmVxXSB2YWx1ZSwgWzAlLCA1JSwgMTAlLCA3LjE0JSwg MTQuMjglLCAyMCVdIChjb21pbmcgZnJvbSBQV1JfQ0tTX0NOVEwuc3RyZXRjaF9hbW91bnQgcmVn IHNwZWMpICovCit1aW50OF90IFBQX0Nsb2NrU3RyZXRjaEFtb3VudENvbnZlcnNpb25bMl1bNl0g PSB7CisJezAsIDEsIDMsIDIsIDQsIDV9LAorCXswLCAyLCA0LCA1LCA2LCA1fSB9OworCisvKiBW YWx1ZXMgZm9yIHRoZSBDR19USEVSTUFMX0NUUkw6OkRQTV9FVkVOVF9TUkMgZmllbGQuICovCitl bnVtIERQTV9FVkVOVF9TUkMgeworCURQTV9FVkVOVF9TUkNfQU5BTE9HID0gMCwgICAgICAgICAg ICAgICAvKiBJbnRlcm5hbCBhbmFsb2cgdHJpcCBwb2ludCAqLworCURQTV9FVkVOVF9TUkNfRVhU RVJOQUwgPSAxLCAgICAgICAgICAgICAvKiBFeHRlcm5hbCAoR1BJTyAxNykgc2lnbmFsICovCisJ RFBNX0VWRU5UX1NSQ19ESUdJVEFMID0gMiwgICAgICAgICAgICAgIC8qIEludGVybmFsIGRpZ2l0 YWwgdHJpcCBwb2ludCAoRElHX1RIRVJNX0RQTSkgKi8KKwlEUE1fRVZFTlRfU1JDX0FOQUxPR19P Ul9FWFRFUk5BTCA9IDMsICAgLyogSW50ZXJuYWwgYW5hbG9nIG9yIGV4dGVybmFsICovCisJRFBN X0VWRU5UX1NSQ19ESUdJVEFMX09SX0VYVEVSTkFMID0gNCAgIC8qIEludGVybmFsIGRpZ2l0YWwg b3IgZXh0ZXJuYWwgKi8KK307Cit0eXBlZGVmIGVudW0gRFBNX0VWRU5UX1NSQyBEUE1fRVZFTlRf U1JDOworCitlbnVtIERJU1BMQVlfR0FQIHsKKwlESVNQTEFZX0dBUF9WQkxBTktfT1JfV00gPSAw LCAgIC8qIFdhaXQgZm9yIHZibGFuayBvciBNQ0hHIHdhdGVybWFyay4gKi8KKwlESVNQTEFZX0dB UF9WQkxBTksgICAgICAgPSAxLCAgIC8qIFdhaXQgZm9yIHZibGFuay4gKi8KKwlESVNQTEFZX0dB UF9XQVRFUk1BUksgICAgPSAyLCAgIC8qIFdhaXQgZm9yIE1DSEcgd2F0ZXJtYXJrLiAoTm90ZSB0 aGF0IEhXIG1heSBkZWFzc2VydCBXTSBpbiBWQkkgZGVwZW5kaW5nIG9uIERDX1NUVVRURVJfQ05U TC4pICovCisJRElTUExBWV9HQVBfSUdOT1JFICAgICAgID0gMyAgICAvKiBEbyBub3Qgd2FpdC4g Ki8KK307Cit0eXBlZGVmIGVudW0gRElTUExBWV9HQVAgRElTUExBWV9HQVA7CisKK2NvbnN0IHVu c2lnbmVkIGxvbmcgUGh3VG9uZ2FfTWFnaWMgPSAodW5zaWduZWQgbG9uZykoUEhNX1ZJc2xhbmRz X01hZ2ljKTsKKworc3RydWN0IHRvbmdhX3Bvd2VyX3N0YXRlICpjYXN0X3Bod190b25nYV9wb3dl cl9zdGF0ZSgKKwkJCQkgIHN0cnVjdCBwcF9od19wb3dlcl9zdGF0ZSAqaHdfcHMpCit7CisJUFBf QVNTRVJUX1dJVEhfQ09ERSgoUGh3VG9uZ2FfTWFnaWMgPT0gaHdfcHMtPm1hZ2ljKSwKKwkJCQki SW52YWxpZCBQb3dlcnN0YXRlIFR5cGUhIiwKKwkJCQkgcmV0dXJuIE5VTEw7KTsKKworCXJldHVy biAoc3RydWN0IHRvbmdhX3Bvd2VyX3N0YXRlICopaHdfcHM7Cit9CisKK2NvbnN0IHN0cnVjdCB0 b25nYV9wb3dlcl9zdGF0ZSAqY2FzdF9jb25zdF9waHdfdG9uZ2FfcG93ZXJfc3RhdGUoCisJCQkJ IGNvbnN0IHN0cnVjdCBwcF9od19wb3dlcl9zdGF0ZSAqaHdfcHMpCit7CisJUFBfQVNTRVJUX1dJ VEhfQ09ERSgoUGh3VG9uZ2FfTWFnaWMgPT0gaHdfcHMtPm1hZ2ljKSwKKwkJCQkiSW52YWxpZCBQ b3dlcnN0YXRlIFR5cGUhIiwKKwkJCQkgcmV0dXJuIE5VTEw7KTsKKworCXJldHVybiAoY29uc3Qg c3RydWN0IHRvbmdhX3Bvd2VyX3N0YXRlICopaHdfcHM7Cit9CisKK2ludCB0b25nYV9hZGRfdm9s dGFnZShzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLAorCXBobV9wcHRfdjFfdm9sdGFnZV9sb29rdXBf dGFibGUgKmxvb2tfdXBfdGFibGUsCisJcGhtX3BwdF92MV92b2x0YWdlX2xvb2t1cF9yZWNvcmQg KnJlY29yZCkKK3sKKwl1aW50MzJfdCBpOworCVBQX0FTU0VSVF9XSVRIX0NPREUoKE5VTEwgIT0g bG9va191cF90YWJsZSksCisJCSJMb29rdXAgVGFibGUgZW1wdHkuIiwgcmV0dXJuIC0xOyk7CisJ UFBfQVNTRVJUX1dJVEhfQ09ERSgoMCAhPSBsb29rX3VwX3RhYmxlLT5jb3VudCksCisJCSJMb29r dXAgVGFibGUgZW1wdHkuIiwgcmV0dXJuIC0xOyk7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgoU01V NzJfTUFYX0xFVkVMU19WRERHRlggPj0gbG9va191cF90YWJsZS0+Y291bnQpLAorCQkiTG9va3Vw IFRhYmxlIGlzIGZ1bGwuIiwgcmV0dXJuIC0xOyk7CisKKwkvKiBUaGlzIGlzIHRvIGF2b2lkIGVu dGVyaW5nIGR1cGxpY2F0ZSBjYWxjdWxhdGVkIHJlY29yZHMuICovCisJZm9yIChpID0gMDsgaSA8 IGxvb2tfdXBfdGFibGUtPmNvdW50OyBpKyspIHsKKwkJaWYgKGxvb2tfdXBfdGFibGUtPmVudHJp ZXNbaV0udXNfdmRkID09IHJlY29yZC0+dXNfdmRkKSB7CisJCQlpZiAobG9va191cF90YWJsZS0+ ZW50cmllc1tpXS51c19jYWxjdWxhdGVkID09IDEpCisJCQkJcmV0dXJuIDA7CisJCQllbHNlCisJ CQkJYnJlYWs7CisJCX0KKwl9CisKKwlsb29rX3VwX3RhYmxlLT5lbnRyaWVzW2ldLnVzX2NhbGN1 bGF0ZWQgPSAxOworCWxvb2tfdXBfdGFibGUtPmVudHJpZXNbaV0udXNfdmRkID0gcmVjb3JkLT51 c192ZGQ7CisJbG9va191cF90YWJsZS0+ZW50cmllc1tpXS51c19jYWNfbG93ID0gcmVjb3JkLT51 c19jYWNfbG93OworCWxvb2tfdXBfdGFibGUtPmVudHJpZXNbaV0udXNfY2FjX21pZCA9IHJlY29y ZC0+dXNfY2FjX21pZDsKKwlsb29rX3VwX3RhYmxlLT5lbnRyaWVzW2ldLnVzX2NhY19oaWdoID0g cmVjb3JkLT51c19jYWNfaGlnaDsKKwkvKiBPbmx5IGluY3JlbWVudCB0aGUgY291bnQgd2hlbiB3 ZSdyZSBhcHBlbmRpbmcsIG5vdCByZXBsYWNpbmcgZHVwbGljYXRlIGVudHJ5LiAqLworCWlmIChp ID09IGxvb2tfdXBfdGFibGUtPmNvdW50KQorCQlsb29rX3VwX3RhYmxlLT5jb3VudCsrOworCisJ cmV0dXJuIDA7Cit9CisKK3VpbnQ4X3QgdG9uZ2FfZ2V0X3ZvbHRhZ2VfaWQocHBfYXRvbWN0cmxf dm9sdGFnZV90YWJsZSAqdm9sdGFnZV90YWJsZSwKKwkJdWludDMyX3Qgdm9sdGFnZSkKK3sKKwl1 aW50OF90IGNvdW50ID0gKHVpbnQ4X3QpICh2b2x0YWdlX3RhYmxlLT5jb3VudCk7CisJdWludDhf dCBpID0gMDsKKworCVBQX0FTU0VSVF9XSVRIX0NPREUoKE5VTEwgIT0gdm9sdGFnZV90YWJsZSks CisJCSJWb2x0YWdlIFRhYmxlIGVtcHR5LiIsIHJldHVybiAwOyk7CisJUFBfQVNTRVJUX1dJVEhf Q09ERSgoMCAhPSBjb3VudCksCisJCSJWb2x0YWdlIFRhYmxlIGVtcHR5LiIsIHJldHVybiAwOyk7 CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkvKiBmaW5kIGZpcnN0IHZvbHRh Z2UgYmlnZ2VyIHRoYW4gcmVxdWVzdGVkICovCisJCWlmICh2b2x0YWdlX3RhYmxlLT5lbnRyaWVz W2ldLnZhbHVlID49IHZvbHRhZ2UpCisJCQlyZXR1cm4gaTsKKwl9CisKKwkvKiB2b2x0YWdlIGlz IGJpZ2dlciB0aGFuIG1heCB2b2x0YWdlIGluIHRoZSB0YWJsZSAqLworCXJldHVybiBpIC0gMTsK K30KKworLyoqCisgKiBAYnJpZWYgUGh3VG9uZ2FfR2V0Vm9sdGFnZU9yZGVyCisgKiAgUmV0dXJu cyBpbmRleCBvZiByZXF1ZXN0ZWQgdm9sdGFnZSByZWNvcmQgaW4gbG9va3VwKHRhYmxlKQorICog QHBhcmFtIGh3bWdyIC0gcG9pbnRlciB0byBoYXJkd2FyZSBtYW5hZ2VyCisgKiBAcGFyYW0gbG9v a3VwVGFibGUgLSBsb29rdXAgbGlzdCB0byBzZWFyY2ggaW4KKyAqIEBwYXJhbSB2b2x0YWdlIC0g dm9sdGFnZSB0byBsb29rIGZvcgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MKKyAqLwordWludDhf dCB0b25nYV9nZXRfdm9sdGFnZV9pbmRleChwaG1fcHB0X3YxX3ZvbHRhZ2VfbG9va3VwX3RhYmxl ICpsb29rX3VwX3RhYmxlLAorCQl1aW50MTZfdCB2b2x0YWdlKQoreworCXVpbnQ4X3QgY291bnQg PSAodWludDhfdCkgKGxvb2tfdXBfdGFibGUtPmNvdW50KTsKKwl1aW50OF90IGk7CisKKwlQUF9B U1NFUlRfV0lUSF9DT0RFKChOVUxMICE9IGxvb2tfdXBfdGFibGUpLCAiTG9va3VwIFRhYmxlIGVt cHR5LiIsIHJldHVybiAwOyk7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCAhPSBjb3VudCksICJM b29rdXAgVGFibGUgZW1wdHkuIiwgcmV0dXJuIDA7KTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3Vu dDsgaSsrKSB7CisJCS8qIGZpbmQgZmlyc3Qgdm9sdGFnZSBlcXVhbCBvciBiaWdnZXIgdGhhbiBy ZXF1ZXN0ZWQgKi8KKwkJaWYgKGxvb2tfdXBfdGFibGUtPmVudHJpZXNbaV0udXNfdmRkID49IHZv bHRhZ2UpCisJCQlyZXR1cm4gaTsKKwl9CisKKwkvKiB2b2x0YWdlIGlzIGJpZ2dlciB0aGFuIG1h eCB2b2x0YWdlIGluIHRoZSB0YWJsZSAqLworCXJldHVybiBpLTE7Cit9CisKK2Jvb2wgdG9uZ2Ff aXNfZHBtX3J1bm5pbmcoc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwkvKgorCSAqIFdlIHJl dHVybiB0aGUgc3RhdHVzIG9mIFZvbHRhZ2UgQ29udHJvbCBpbnN0ZWFkIG9mIGNoZWNraW5nIFND TEsvTUNMSyBEUE0KKwkgKiBiZWNhdXNlIHdlIG1heSBoYXZlIHRlc3Qgc2NlbmFyaW9zIHRoYXQg bmVlZCB1cyBpbnRlbnRpb25seSBkaXNhYmxlIFNDTEsvTUNMSyBEUE0sCisJICogd2hlcmVhcyB2 b2x0YWdlIGNvbnRyb2wgaXMgYSBmdW5kZW1lbnRhbCBjaGFuZ2UgdGhhdCB3aWxsIG5vdCBiZSBk aXNhYmxlZAorCSAqLworCisJcmV0dXJuICgwID09IFBITV9SRUFEX1ZGUEZfSU5ESVJFQ1RfRklF TEQoaHdtZ3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywKKwkJCQkJRkVBVFVSRV9TVEFUVVMs IFZPTFRBR0VfQ09OVFJPTExFUl9PTikgPyAxIDogMCk7Cit9CisKKy8qKgorICogUmUtZ2VuZXJh dGUgdGhlIERQTSBsZXZlbCBtYXNrIHZhbHVlCisgKiBAcGFyYW0gICAgaHdtZ3IgICAgICB0aGUg YWRkcmVzcyBvZiB0aGUgaGFyZHdhcmUgbWFuYWdlcgorICovCitzdGF0aWMgdWludDMyX3QgdG9u Z2FfZ2V0X2RwbV9sZXZlbF9lbmFibGVfbWFza192YWx1ZSgKKwkJCXN0cnVjdCB0b25nYV9zaW5n bGVfZHBtX3RhYmxlICogZHBtX3RhYmxlKQoreworCXVpbnQzMl90IGk7CisJdWludDMyX3QgbWFz a192YWx1ZSA9IDA7CisKKwlmb3IgKGkgPSBkcG1fdGFibGUtPmNvdW50OyBpID4gMDsgaS0tKSB7 CisJCW1hc2tfdmFsdWUgPSBtYXNrX3ZhbHVlIDw8IDE7CisKKwkJaWYgKGRwbV90YWJsZS0+ZHBt X2xldmVsc1tpLTFdLmVuYWJsZWQpCisJCQltYXNrX3ZhbHVlIHw9IDB4MTsKKwkJZWxzZQorCQkJ bWFza192YWx1ZSAmPSAweEZGRkZGRkZFOworCX0KKwlyZXR1cm4gbWFza192YWx1ZTsKK30KKwor LyoqCisgKiBSZXRyaWV2ZSBEUE0gZGVmYXVsdCB2YWx1ZXMgZnJvbSByZWdpc3RyeSAoaWYgYXZh aWxhYmxlKQorICoKKyAqIEBwYXJhbSAgICBod21nciAgdGhlIGFkZHJlc3Mgb2YgdGhlIHBvd2Vy cGxheSBoYXJkd2FyZSBtYW5hZ2VyLgorICovCit2b2lkIHRvbmdhX2luaXRpYWxpemVfZHBtX2Rl ZmF1bHRzKHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJdG9uZ2FfaHdtZ3IgKmRhdGEgPSAo dG9uZ2FfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXBod190b25nYV91bHZfcGFybSAqdWx2 ID0gJihkYXRhLT51bHYpOworCXVpbnQzMl90IHRtcDsKKworCXVsdi0+Y2hfdWx2X3BhcmFtZXRl ciA9IFBQVE9OR0FfQ0dVTFZQQVJBTUVURVJfREZMVDsKKwlkYXRhLT52b3RpbmdfcmlnaHRzX2Ns aWVudHMwID0gUFBUT05HQV9WT1RJTkdSSUdIVFNDTElFTlRTX0RGTFQwOworCWRhdGEtPnZvdGlu Z19yaWdodHNfY2xpZW50czEgPSBQUFRPTkdBX1ZPVElOR1JJR0hUU0NMSUVOVFNfREZMVDE7CisJ ZGF0YS0+dm90aW5nX3JpZ2h0c19jbGllbnRzMiA9IFBQVE9OR0FfVk9USU5HUklHSFRTQ0xJRU5U U19ERkxUMjsKKwlkYXRhLT52b3RpbmdfcmlnaHRzX2NsaWVudHMzID0gUFBUT05HQV9WT1RJTkdS SUdIVFNDTElFTlRTX0RGTFQzOworCWRhdGEtPnZvdGluZ19yaWdodHNfY2xpZW50czQgPSBQUFRP TkdBX1ZPVElOR1JJR0hUU0NMSUVOVFNfREZMVDQ7CisJZGF0YS0+dm90aW5nX3JpZ2h0c19jbGll bnRzNSA9IFBQVE9OR0FfVk9USU5HUklHSFRTQ0xJRU5UU19ERkxUNTsKKwlkYXRhLT52b3Rpbmdf cmlnaHRzX2NsaWVudHM2ID0gUFBUT05HQV9WT1RJTkdSSUdIVFNDTElFTlRTX0RGTFQ2OworCWRh dGEtPnZvdGluZ19yaWdodHNfY2xpZW50czcgPSBQUFRPTkdBX1ZPVElOR1JJR0hUU0NMSUVOVFNf REZMVDc7CisKKwlkYXRhLT5zdGF0aWNfc2NyZWVuX3RocmVzaG9sZF91bml0ID0gUFBUT05HQV9T VEFUSUNTQ1JFRU5USFJFU0hPTERVTklUX0RGTFQ7CisJZGF0YS0+c3RhdGljX3NjcmVlbl90aHJl c2hvbGQgPSBQUFRPTkdBX1NUQVRJQ1NDUkVFTlRIUkVTSE9MRF9ERkxUOworCisJcGhtX2NhcF91 bnNldChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCVBITV9QbGF0 Zm9ybUNhcHNfQUJNKTsKKwlwaG1fY2FwX3NldChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5w bGF0Zm9ybUNhcHMsCisJCVBITV9QbGF0Zm9ybUNhcHNfTm9uQUJNU3VwcG9ydEluUFBMaWIpOwor CisJdG1wID0gMDsKKwlpZiAodG1wID09IDApCisJCXBobV9jYXBfc2V0KGh3bWdyLT5wbGF0Zm9y bV9kZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywKKwkJCVBITV9QbGF0Zm9ybUNhcHNfRHluYW1pY0FD VGltaW5nKTsKKworCXRtcCA9IDA7CisJaWYgKDAgIT0gdG1wKQorCQlwaG1fY2FwX3NldChod21n ci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCQlQSE1fUGxhdGZvcm1DYXBz X0Rpc2FibGVNZW1vcnlUcmFuc2l0aW9uKTsKKworCWRhdGEtPm1jbGtfc3Ryb2JlX21vZGVfdGhy ZXNob2xkID0gNDAwMDA7CisJZGF0YS0+bWNsa19zdHV0dGVyX21vZGVfdGhyZXNob2xkID0gMzAw MDA7CisJZGF0YS0+bWNsa19lZGNfZW5hYmxlX3RocmVzaG9sZCA9IDQwMDAwOworCWRhdGEtPm1j bGtfZWRjX3dyX2VuYWJsZV90aHJlc2hvbGQgPSA0MDAwMDsKKworCXRtcCA9IDA7CisJaWYgKHRt cCAhPSAwKQorCQlwaG1fY2FwX3NldChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9y bUNhcHMsCisJCQlQSE1fUGxhdGZvcm1DYXBzX0Rpc2FibGVNQ0xTKTsKKworCWRhdGEtPnBjaWVf Z2VuX3BlcmZvcm1hbmNlLm1heCA9IFBQX1BDSUVHZW4xOworCWRhdGEtPnBjaWVfZ2VuX3BlcmZv cm1hbmNlLm1pbiA9IFBQX1BDSUVHZW4zOworCWRhdGEtPnBjaWVfZ2VuX3Bvd2VyX3NhdmluZy5t YXggPSBQUF9QQ0lFR2VuMTsKKwlkYXRhLT5wY2llX2dlbl9wb3dlcl9zYXZpbmcubWluID0gUFBf UENJRUdlbjM7CisKKwlkYXRhLT5wY2llX2xhbmVfcGVyZm9ybWFuY2UubWF4ID0gMDsKKwlkYXRh LT5wY2llX2xhbmVfcGVyZm9ybWFuY2UubWluID0gMTY7CisJZGF0YS0+cGNpZV9sYW5lX3Bvd2Vy X3NhdmluZy5tYXggPSAwOworCWRhdGEtPnBjaWVfbGFuZV9wb3dlcl9zYXZpbmcubWluID0gMTY7 CisKKwl0bXAgPSAwOworCisJaWYgKHRtcCkKKwkJcGhtX2NhcF9zZXQoaHdtZ3ItPnBsYXRmb3Jt X2Rlc2NyaXB0b3IucGxhdGZvcm1DYXBzLAorCQkJUEhNX1BsYXRmb3JtQ2Fwc19TY2xrVGhyb3R0 bGVMb3dOb3RpZmljYXRpb24pOworCisJcGhtX2NhcF9zZXQoaHdtZ3ItPnBsYXRmb3JtX2Rlc2Ny aXB0b3IucGxhdGZvcm1DYXBzLAorCQlQSE1fUGxhdGZvcm1DYXBzX0R5bmFtaWNVVkRTdGF0ZSk7 CisKK30KKworaW50IHRvbmdhX3VwZGF0ZV9zY2xrX3RocmVzaG9sZChzdHJ1Y3QgcHBfaHdtZ3Ig Kmh3bWdyKQoreworCXRvbmdhX2h3bWdyICpkYXRhID0gKHRvbmdhX2h3bWdyICopKGh3bWdyLT5i YWNrZW5kKTsKKworCWludCByZXN1bHQgPSAwOworCXVpbnQzMl90IGxvd19zY2xrX2ludGVycnVw dF90aHJlc2hvbGQgPSAwOworCisJaWYgKHBobV9jYXBfZW5hYmxlZChod21nci0+cGxhdGZvcm1f ZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCQlQSE1fUGxhdGZvcm1DYXBzX1NjbGtUaHJvdHRs ZUxvd05vdGlmaWNhdGlvbikKKwkJJiYgKGh3bWdyLT5nZnhfYXJiaXRlci5zY2xrX3RocmVzaG9s ZCAhPSBkYXRhLT5sb3dfc2Nsa19pbnRlcnJ1cHRfdGhyZXNob2xkKSkgeworCQlkYXRhLT5sb3df c2Nsa19pbnRlcnJ1cHRfdGhyZXNob2xkID0gaHdtZ3ItPmdmeF9hcmJpdGVyLnNjbGtfdGhyZXNo b2xkOworCQlsb3dfc2Nsa19pbnRlcnJ1cHRfdGhyZXNob2xkID0gZGF0YS0+bG93X3NjbGtfaW50 ZXJydXB0X3RocmVzaG9sZDsKKworCQlDT05WRVJUX0ZST01fSE9TVF9UT19TTUNfVUwobG93X3Nj bGtfaW50ZXJydXB0X3RocmVzaG9sZCk7CisKKwkJcmVzdWx0ID0gdG9uZ2FfY29weV9ieXRlc190 b19zbWMoCisJCQkJaHdtZ3ItPnNtdW1nciwKKwkJCQlkYXRhLT5kcG1fdGFibGVfc3RhcnQgKyBv ZmZzZXRvZihTTVU3Ml9EaXNjcmV0ZV9EcG1UYWJsZSwKKwkJCQlMb3dTY2xrSW50ZXJydXB0VGhy ZXNob2xkKSwKKwkJCQkodWludDhfdCAqKSZsb3dfc2Nsa19pbnRlcnJ1cHRfdGhyZXNob2xkLAor CQkJCXNpemVvZih1aW50MzJfdCksCisJCQkJZGF0YS0+c3JhbV9lbmQKKwkJCQkpOworCX0KKwor CXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogRmluZCBTQ0xLIHZhbHVlIHRoYXQgaXMgYXNz b2NpYXRlZCB3aXRoIHNwZWNpZmllZCB2aXJ0dWFsX3ZvbHRhZ2VfSWQuCisgKgorICogQHBhcmFt ICAgIGh3bWdyICB0aGUgYWRkcmVzcyBvZiB0aGUgcG93ZXJwbGF5IGhhcmR3YXJlIG1hbmFnZXIu CisgKiBAcGFyYW0gICAgdmlydHVhbF92b2x0YWdlX0lkICB2b2x0YWdlSWQgdG8gbG9vayBmb3Iu CisgKiBAcGFyYW0gICAgc2NsayBvdXRwdXQgdmFsdWUgLgorICogQHJldHVybiAgIGFsd2F5cyAw IGlmIHN1Y2Nlc3MgYW5kIDIgaWYgYXNzb2NpYXRpb24gbm90IGZvdW5kCisgKi8KK3N0YXRpYyBp bnQgdG9uZ2FfZ2V0X3NjbGtfZm9yX3ZvbHRhZ2VfZXZ2KHN0cnVjdCBwcF9od21nciAqaHdtZ3Is CisJcGhtX3BwdF92MV92b2x0YWdlX2xvb2t1cF90YWJsZSAqbG9va3VwX3RhYmxlLAorCXVpbnQx Nl90IHZpcnR1YWxfdm9sdGFnZV9pZCwgdWludDMyX3QgKnNjbGspCit7CisJdWludDhfdCBlbnRy eUlkOworCXVpbnQ4X3Qgdm9sdGFnZUlkOworCXN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9u ICpwcHRhYmxlX2luZm8gPQorCQkJCQkoc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKiko aHdtZ3ItPnBwdGFibGUpOworCisJUFBfQVNTRVJUX1dJVEhfQ09ERShsb29rdXBfdGFibGUtPmNv dW50ICE9IDAsICJMb29rdXAgdGFibGUgaXMgZW1wdHkiLCByZXR1cm4gLTEpOworCisJLyogc2Vh cmNoIGZvciBsZWFrYWdlIHZvbHRhZ2UgSUQgMHhmZjAxIH4gMHhmZjA4IGFuZCBzY2tsICovCisJ Zm9yIChlbnRyeUlkID0gMDsgZW50cnlJZCA8IHBwdGFibGVfaW5mby0+dmRkX2RlcF9vbl9zY2xr LT5jb3VudDsgZW50cnlJZCsrKSB7CisJCXZvbHRhZ2VJZCA9IHBwdGFibGVfaW5mby0+dmRkX2Rl cF9vbl9zY2xrLT5lbnRyaWVzW2VudHJ5SWRdLnZkZEluZDsKKwkJaWYgKGxvb2t1cF90YWJsZS0+ ZW50cmllc1t2b2x0YWdlSWRdLnVzX3ZkZCA9PSB2aXJ0dWFsX3ZvbHRhZ2VfaWQpCisJCQlicmVh azsKKwl9CisKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKGVudHJ5SWQgPCBwcHRhYmxlX2luZm8tPnZk ZF9kZXBfb25fc2Nsay0+Y291bnQsCisJCQkiQ2FuJ3QgZmluZCByZXF1ZXN0ZWQgdm9sdGFnZSBp ZCBpbiB2ZGRfZGVwX29uX3NjbGsgdGFibGUhIiwKKwkJCXJldHVybiAtMTsKKwkJCSk7CisKKwkq c2NsayA9IHBwdGFibGVfaW5mby0+dmRkX2RlcF9vbl9zY2xrLT5lbnRyaWVzW2VudHJ5SWRdLmNs azsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIEdldCBMZWFrYWdlIFZEREMgYmFzZWQgb24g bGVha2FnZSBJRC4KKyAqCisgKiBAcGFyYW0gICAgaHdtZ3IgIHRoZSBhZGRyZXNzIG9mIHRoZSBw b3dlcnBsYXkgaGFyZHdhcmUgbWFuYWdlci4KKyAqIEByZXR1cm4gICAyIGlmIHZkZGdmeCByZXR1 cm5lZCBpcyBncmVhdGVyIHRoYW4gMlYgb3IgaWYgQklPUworICovCitpbnQgdG9uZ2FfZ2V0X2V2 dl92b2x0YWdlKHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJdG9uZ2FfaHdtZ3IgKmRhdGEg PSAodG9uZ2FfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXN0cnVjdCBwaG1fcHB0X3YxX2lu Zm9ybWF0aW9uICpwcHRhYmxlX2luZm8gPSAoc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24g KikoaHdtZ3ItPnBwdGFibGUpOworCXBobV9wcHRfdjFfY2xvY2tfdm9sdGFnZV9kZXBlbmRlbmN5 X3RhYmxlICpzY2xrX3RhYmxlID0gcHB0YWJsZV9pbmZvLT52ZGRfZGVwX29uX3NjbGs7CisJdWlu dDE2X3QgICAgdmlydHVhbF92b2x0YWdlX2lkOworCXVpbnQxNl90ICAgIHZkZGMgPSAwOworCXVp bnQxNl90ICAgIHZkZGdmeCA9IDA7CisJdWludDE2X3QgICAgaSwgajsKKwl1aW50MzJfdCAgc2Ns ayA9IDA7CisKKwkvKiByZXRyaWV2ZSB2b2x0YWdlIGZvciBsZWFrYWdlIElEICgweGZmMDEgKyBp KSAqLworCWZvciAoaSA9IDA7IGkgPCBUT05HQV9NQVhfTEVBS0FHRV9DT1VOVDsgaSsrKSB7CisJ CXZpcnR1YWxfdm9sdGFnZV9pZCA9IEFUT01fVklSVFVBTF9WT0xUQUdFX0lEMCArIGk7CisKKwkJ LyogaW4gc3BsaXQgbW9kZSB3ZSBzaG91bGQgaGF2ZSBvbmx5IHZkZGdmeCBFVlYgbGVha2FnZXMg Ki8KKwkJaWYgKGRhdGEtPnZkZF9nZnhfY29udHJvbCA9PSBUT05HQV9WT0xUQUdFX0NPTlRST0xf QllfU1ZJRDIpIHsKKwkJCWlmICgwID09IHRvbmdhX2dldF9zY2xrX2Zvcl92b2x0YWdlX2V2diho d21nciwKKwkJCQkJCXBwdGFibGVfaW5mby0+dmRkZ2Z4X2xvb2t1cF90YWJsZSwgdmlydHVhbF92 b2x0YWdlX2lkLCAmc2NsaykpIHsKKwkJCQlpZiAocGhtX2NhcF9lbmFibGVkKGh3bWdyLT5wbGF0 Zm9ybV9kZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywKKwkJCQkJCQlQSE1fUGxhdGZvcm1DYXBzX0Ns b2NrU3RyZXRjaGVyKSkgeworCQkJCQlmb3IgKGogPSAxOyBqIDwgc2Nsa190YWJsZS0+Y291bnQ7 IGorKykgeworCQkJCQkJaWYgKHNjbGtfdGFibGUtPmVudHJpZXNbal0uY2xrID09IHNjbGsgJiYK KwkJCQkJCQkJc2Nsa190YWJsZS0+ZW50cmllc1tqXS5ja3NfZW5hYmxlID09IDApIHsKKwkJCQkJ CQlzY2xrICs9IDUwMDA7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJ CQkJUFBfQVNTRVJUX1dJVEhfQ09ERSgwID09IGF0b21jdHJsX2dldF92b2x0YWdlX2V2dl9vbl9z Y2xrCisJCQkJCQkoaHdtZ3IsIFZPTFRBR0VfVFlQRV9WRERHRlgsIHNjbGssCisJCQkJCQkgdmly dHVhbF92b2x0YWdlX2lkLCAmdmRkZ2Z4KSwKKwkJCQkJCSJFcnJvciByZXRyaWV2aW5nIEVWViB2 b2x0YWdlIHZhbHVlISIsIGNvbnRpbnVlKTsKKworCQkJCS8qIG5lZWQgdG8gbWFrZSBzdXJlIHZk ZGdmeCBpcyBsZXNzIHRoYW4gMnYgb3IgZWxzZSwgaXQgY291bGQgYnVybiB0aGUgQVNJQy4gKi8K KwkJCQlQUF9BU1NFUlRfV0lUSF9DT0RFKCh2ZGRnZnggPCAyMDAwICYmIHZkZGdmeCAhPSAwKSwg IkludmFsaWQgVkRER0ZYIHZhbHVlISIsIHJldHVybiAtMSk7CisKKwkJCQkvKiB0aGUgdm9sdGFn ZSBzaG91bGQgbm90IGJlIHplcm8gbm9yIGVxdWFsIHRvIGxlYWthZ2UgSUQgKi8KKwkJCQlpZiAo dmRkZ2Z4ICE9IDAgJiYgdmRkZ2Z4ICE9IHZpcnR1YWxfdm9sdGFnZV9pZCkgeworCQkJCQlkYXRh LT52ZGRjZ2Z4X2xlYWthZ2UuYWN0dWFsX3ZvbHRhZ2VbZGF0YS0+dmRkY2dmeF9sZWFrYWdlLmNv dW50XSA9IHZkZGdmeDsKKwkJCQkJZGF0YS0+dmRkY2dmeF9sZWFrYWdlLmxlYWthZ2VfaWRbZGF0 YS0+dmRkY2dmeF9sZWFrYWdlLmNvdW50XSA9IHZpcnR1YWxfdm9sdGFnZV9pZDsKKwkJCQkJZGF0 YS0+dmRkY2dmeF9sZWFrYWdlLmNvdW50Kys7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJ LyogIGluIG1lcmdlZCBtb2RlIHdlIGhhdmUgb25seSB2ZGRjIEVWViBsZWFrYWdlcyAqLworCQkJ aWYgKDAgPT0gdG9uZ2FfZ2V0X3NjbGtfZm9yX3ZvbHRhZ2VfZXZ2KGh3bWdyLAorCQkJCQkJcHB0 YWJsZV9pbmZvLT52ZGRjX2xvb2t1cF90YWJsZSwKKwkJCQkJCXZpcnR1YWxfdm9sdGFnZV9pZCwg JnNjbGspKSB7CisJCQkJUFBfQVNTRVJUX1dJVEhfQ09ERSgwID09IGF0b21jdHJsX2dldF92b2x0 YWdlX2V2dl9vbl9zY2xrCisJCQkJCQkoaHdtZ3IsIFZPTFRBR0VfVFlQRV9WRERDLCBzY2xrLAor CQkJCQkJIHZpcnR1YWxfdm9sdGFnZV9pZCwgJnZkZGMpLAorCQkJCQkJIkVycm9yIHJldHJpZXZp bmcgRVZWIHZvbHRhZ2UgdmFsdWUhIiwgY29udGludWUpOworCisJCQkJLyogbmVlZCB0byBtYWtl IHN1cmUgdmRkYyBpcyBsZXNzIHRoYW4gMnYgb3IgZWxzZSwgaXQgY291bGQgYnVybiB0aGUgQVNJ Qy4gKi8KKwkJCQlpZiAodmRkYyA+IDIwMDApCisJCQkJCXByaW50ayhLRVJOX0VSUiAiWyBwb3dl cnBsYXkgXSBJbnZhbGlkIFZEREMgdmFsdWUhIFxuIik7CisKKwkJCQkvKiB0aGUgdm9sdGFnZSBz aG91bGQgbm90IGJlIHplcm8gbm9yIGVxdWFsIHRvIGxlYWthZ2UgSUQgKi8KKwkJCQlpZiAodmRk YyAhPSAwICYmIHZkZGMgIT0gdmlydHVhbF92b2x0YWdlX2lkKSB7CisJCQkJCWRhdGEtPnZkZGNf bGVha2FnZS5hY3R1YWxfdm9sdGFnZVtkYXRhLT52ZGRjX2xlYWthZ2UuY291bnRdID0gdmRkYzsK KwkJCQkJZGF0YS0+dmRkY19sZWFrYWdlLmxlYWthZ2VfaWRbZGF0YS0+dmRkY19sZWFrYWdlLmNv dW50XSA9IHZpcnR1YWxfdm9sdGFnZV9pZDsKKwkJCQkJZGF0YS0+dmRkY19sZWFrYWdlLmNvdW50 Kys7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCB0b25nYV9l bmFibGVfc2Nsa19tY2xrX2RwbShzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCXRvbmdhX2h3 bWdyICpkYXRhID0gKHRvbmdhX2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKworCS8qIGVuYWJs ZSBTQ0xLIGRwbSAqLworCWlmICgwID09IGRhdGEtPnNjbGtfZHBtX2tleV9kaXNhYmxlZCkgewor CQlQUF9BU1NFUlRfV0lUSF9DT0RFKAorCQkJCSgwID09IHNtdW1fc2VuZF9tc2dfdG9fc21jKGh3 bWdyLT5zbXVtZ3IsCisJCQkJCQkgICBQUFNNQ19NU0dfRFBNX0VuYWJsZSkpLAorCQkJCSJGYWls ZWQgdG8gZW5hYmxlIFNDTEsgRFBNIGR1cmluZyBEUE0gU3RhcnQgRnVuY3Rpb24hIiwKKwkJCQly ZXR1cm4gLTEpOworCX0KKworCS8qIGVuYWJsZSBNQ0xLIGRwbSAqLworCWlmICgwID09IGRhdGEt Pm1jbGtfZHBtX2tleV9kaXNhYmxlZCkgeworCQlQUF9BU1NFUlRfV0lUSF9DT0RFKAorCQkJCSgw ID09IHNtdW1fc2VuZF9tc2dfdG9fc21jKGh3bWdyLT5zbXVtZ3IsCisJCQkJCSAgICAgUFBTTUNf TVNHX01DTEtEUE1fRW5hYmxlKSksCisJCQkJIkZhaWxlZCB0byBlbmFibGUgTUNMSyBEUE0gZHVy aW5nIERQTSBTdGFydCBGdW5jdGlvbiEiLAorCQkJCXJldHVybiAtMSk7CisKKwkJUEhNX1dSSVRF X0ZJRUxEKGh3bWdyLT5kZXZpY2UsIE1DX1NFUV9DTlRMXzMsIENBQ19FTiwgMHgxKTsKKworCQlj Z3Nfd3JpdGVfaW5kX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19TTUMsCisJ CQlpeExDQUNfTUMwX0NOVEwsIDB4MDUpOy8qIENIMCwxIHJlYWQgKi8KKwkJY2dzX3dyaXRlX2lu ZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01DLAorCQkJaXhMQ0FDX01D MV9DTlRMLCAweDA1KTsvKiBDSDIsMyByZWFkICovCisJCWNnc193cml0ZV9pbmRfcmVnaXN0ZXIo aHdtZ3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywKKwkJCWl4TENBQ19DUExfQ05UTCwgMHgx MDAwMDUpOy8qUmVhZCAqLworCisJCXVkZWxheSgxMCk7CisKKwkJY2dzX3dyaXRlX2luZF9yZWdp c3Rlcihod21nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01DLAorCQkJaXhMQ0FDX01DMF9DTlRM LCAweDQwMDAwNSk7LyogQ0gwLDEgd3JpdGUgKi8KKwkJY2dzX3dyaXRlX2luZF9yZWdpc3Rlciho d21nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01DLAorCQkJaXhMQ0FDX01DMV9DTlRMLCAweDQw MDAwNSk7LyogQ0gyLDMgd3JpdGUgKi8KKwkJY2dzX3dyaXRlX2luZF9yZWdpc3Rlcihod21nci0+ ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01DLAorCQkJaXhMQ0FDX0NQTF9DTlRMLCAweDUwMDAwNSk7 Lyogd3JpdGUgKi8KKworCX0KKworCXJldHVybiAwOworfQorCitpbnQgdG9uZ2Ffc3RhcnRfZHBt KHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJdG9uZ2FfaHdtZ3IgKmRhdGEgPSAodG9uZ2Ff aHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCisJLyogZW5hYmxlIGdlbmVyYWwgcG93ZXIgbWFu YWdlbWVudCAqLworCVBITV9XUklURV9WRlBGX0lORElSRUNUX0ZJRUxEKGh3bWdyLT5kZXZpY2Us IENHU19JTkRfUkVHX19TTUMsIEdFTkVSQUxfUFdSTUdULCBHTE9CQUxfUFdSTUdUX0VOLCAxKTsK KwkvKiBlbmFibGUgc2NsayBkZWVwIHNsZWVwICovCisJUEhNX1dSSVRFX1ZGUEZfSU5ESVJFQ1Rf RklFTEQoaHdtZ3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywgU0NMS19QV1JNR1RfQ05UTCwg RFlOQU1JQ19QTV9FTiwgMSk7CisKKwkvKiBwcmVwYXJlIGZvciBQQ0lFIERQTSAqLworCWNnc193 cml0ZV9pbmRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywgZGF0YS0+ c29mdF9yZWdzX3N0YXJ0ICsKKwkJCW9mZnNldG9mKFNNVTcyX1NvZnRSZWdpc3RlcnMsIFZvbHRh Z2VDaGFuZ2VUaW1lb3V0KSwgMHgxMDAwKTsKKworCVBITV9XUklURV9JTkRJUkVDVF9GSUVMRCho d21nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19fUENJRSwgU1dSU1RfQ09NTUFORF8xLCBSRVNFVExD LCAweDApOworCisJUFBfQVNTRVJUX1dJVEhfQ09ERSgKKwkJCSgwID09IHNtdW1fc2VuZF9tc2df dG9fc21jKGh3bWdyLT5zbXVtZ3IsCisJCQkJCVBQU01DX01TR19Wb2x0YWdlX0NudGxfRW5hYmxl KSksCisJCQkiRmFpbGVkIHRvIGVuYWJsZSB2b2x0YWdlIERQTSBkdXJpbmcgRFBNIFN0YXJ0IEZ1 bmN0aW9uISIsCisJCQlyZXR1cm4gLTEpOworCisJaWYgKDAgIT0gdG9uZ2FfZW5hYmxlX3NjbGtf bWNsa19kcG0oaHdtZ3IpKSB7CisJCVBQX0FTU0VSVF9XSVRIX0NPREUoMCwgIkZhaWxlZCB0byBl bmFibGUgU2NsayBEUE0gYW5kIE1jbGsgRFBNISIsIHJldHVybiAtMSk7CisJfQorCisJLyogZW5h YmxlIFBDSUUgZHBtICovCisJaWYgKDAgPT0gZGF0YS0+cGNpZV9kcG1fa2V5X2Rpc2FibGVkKSB7 CisJCVBQX0FTU0VSVF9XSVRIX0NPREUoCisJCQkJKDAgPT0gc211bV9zZW5kX21zZ190b19zbWMo aHdtZ3ItPnNtdW1nciwKKwkJCQkJCVBQU01DX01TR19QQ0llRFBNX0VuYWJsZSkpLAorCQkJCSJG YWlsZWQgdG8gZW5hYmxlIHBjaWUgRFBNIGR1cmluZyBEUE0gU3RhcnQgRnVuY3Rpb24hIiwKKwkJ CQlyZXR1cm4gLTEKKwkJCQkpOworCX0KKworCWlmIChwaG1fY2FwX2VuYWJsZWQoaHdtZ3ItPnBs YXRmb3JtX2Rlc2NyaXB0b3IucGxhdGZvcm1DYXBzLAorCQkJCVBITV9QbGF0Zm9ybUNhcHNfRmFs Y29uX1F1aWNrVHJhbnNpdGlvbikpIHsKKwkJCQkgICBzbXVtX3NlbmRfbXNnX3RvX3NtYyhod21n ci0+c211bWdyLAorCQkJCSAgICBQUFNNQ19NU0dfRW5hYmxlQUNEQ0dQSU9JbnRlcnJ1cHQpOwor CX0KKworCXJldHVybiAwOworfQorCitpbnQgdG9uZ2FfZGlzYWJsZV9zY2xrX21jbGtfZHBtKHN0 cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJdG9uZ2FfaHdtZ3IgKmRhdGEgPSAodG9uZ2FfaHdt Z3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCisJLyogZGlzYWJsZSBTQ0xLIGRwbSAqLworCWlmICgw ID09IGRhdGEtPnNjbGtfZHBtX2tleV9kaXNhYmxlZCkgeworCQkvKiBDaGVja2luZyBpZiBEUE0g aXMgcnVubmluZy4gIElmIHdlIGRpc2NvdmVyIGhhbmcgYmVjYXVzZSBvZiB0aGlzLCB3ZSBzaG91 bGQgc2tpcCB0aGlzIG1lc3NhZ2UuKi8KKwkJUFBfQVNTRVJUX1dJVEhfQ09ERSgKKwkJCQkoMCA9 PSB0b25nYV9pc19kcG1fcnVubmluZyhod21ncikpLAorCQkJCSJUcnlpbmcgdG8gRGlzYWJsZSBT Q0xLIERQTSB3aGVuIERQTSBpcyBkaXNhYmxlZCIsCisJCQkJcmV0dXJuIC0xCisJCQkJKTsKKwor CQlQUF9BU1NFUlRfV0lUSF9DT0RFKAorCQkJCSgwID09IHNtdW1fc2VuZF9tc2dfdG9fc21jKGh3 bWdyLT5zbXVtZ3IsCisJCQkJCQkgIFBQU01DX01TR19EUE1fRGlzYWJsZSkpLAorCQkJCSJGYWls ZWQgdG8gZGlzYWJsZSBTQ0xLIERQTSBkdXJpbmcgRFBNIHN0b3AgRnVuY3Rpb24hIiwKKwkJCQly ZXR1cm4gLTEpOworCX0KKworCS8qIGRpc2FibGUgTUNMSyBkcG0gKi8KKwlpZiAoMCA9PSBkYXRh LT5tY2xrX2RwbV9rZXlfZGlzYWJsZWQpIHsKKwkJLyogQ2hlY2tpbmcgaWYgRFBNIGlzIHJ1bm5p bmcuICBJZiB3ZSBkaXNjb3ZlciBoYW5nIGJlY2F1c2Ugb2YgdGhpcywgd2Ugc2hvdWxkIHNraXAg dGhpcyBtZXNzYWdlLiAqLworCQlQUF9BU1NFUlRfV0lUSF9DT0RFKAorCQkJCSgwID09IHRvbmdh X2lzX2RwbV9ydW5uaW5nKGh3bWdyKSksCisJCQkJIlRyeWluZyB0byBEaXNhYmxlIE1DTEsgRFBN IHdoZW4gRFBNIGlzIGRpc2FibGVkIiwKKwkJCQlyZXR1cm4gLTEKKwkJCQkpOworCisJCVBQX0FT U0VSVF9XSVRIX0NPREUoCisJCQkJKDAgPT0gc211bV9zZW5kX21zZ190b19zbWMoaHdtZ3ItPnNt dW1nciwKKwkJCQkJICAgIFBQU01DX01TR19NQ0xLRFBNX0Rpc2FibGUpKSwKKwkJCQkiRmFpbGVk IHRvIERpc2FibGUgTUNMSyBEUE0gZHVyaW5nIERQTSBzdG9wIEZ1bmN0aW9uISIsCisJCQkJcmV0 dXJuIC0xKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHRvbmdhX3N0b3BfZHBtKHN0cnVj dCBwcF9od21nciAqaHdtZ3IpCit7CisJdG9uZ2FfaHdtZ3IgKmRhdGEgPSAodG9uZ2FfaHdtZ3Ig KikoaHdtZ3ItPmJhY2tlbmQpOworCisJUEhNX1dSSVRFX1ZGUEZfSU5ESVJFQ1RfRklFTEQoaHdt Z3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywgR0VORVJBTF9QV1JNR1QsIEdMT0JBTF9QV1JN R1RfRU4sIDApOworCS8qIGRpc2FibGUgc2NsayBkZWVwIHNsZWVwKi8KKwlQSE1fV1JJVEVfVkZQ Rl9JTkRJUkVDVF9GSUVMRChod21nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01DLCBTQ0xLX1BX Uk1HVF9DTlRMLCBEWU5BTUlDX1BNX0VOLCAwKTsKKworCS8qIGRpc2FibGUgUENJRSBkcG0gKi8K KwlpZiAoMCA9PSBkYXRhLT5wY2llX2RwbV9rZXlfZGlzYWJsZWQpIHsKKwkJLyogQ2hlY2tpbmcg aWYgRFBNIGlzIHJ1bm5pbmcuICBJZiB3ZSBkaXNjb3ZlciBoYW5nIGJlY2F1c2Ugb2YgdGhpcywg d2Ugc2hvdWxkIHNraXAgdGhpcyBtZXNzYWdlLiovCisJCVBQX0FTU0VSVF9XSVRIX0NPREUoCisJ CQkJKDAgPT0gdG9uZ2FfaXNfZHBtX3J1bm5pbmcoaHdtZ3IpKSwKKwkJCQkiVHJ5aW5nIHRvIERp c2FibGUgUENJRSBEUE0gd2hlbiBEUE0gaXMgZGlzYWJsZWQiLAorCQkJCXJldHVybiAtMQorCQkJ CSk7CisJCVBQX0FTU0VSVF9XSVRIX0NPREUoCisJCQkJKDAgPT0gc211bV9zZW5kX21zZ190b19z bWMoaHdtZ3ItPnNtdW1nciwKKwkJCQkJCVBQU01DX01TR19QQ0llRFBNX0Rpc2FibGUpKSwKKwkJ CQkiRmFpbGVkIHRvIGRpc2FibGUgcGNpZSBEUE0gZHVyaW5nIERQTSBzdG9wIEZ1bmN0aW9uISIs CisJCQkJcmV0dXJuIC0xKTsKKwl9CisKKwlpZiAoMCAhPSB0b25nYV9kaXNhYmxlX3NjbGtfbWNs a19kcG0oaHdtZ3IpKQorCQlQUF9BU1NFUlRfV0lUSF9DT0RFKDAsICJGYWlsZWQgdG8gZGlzYWJs ZSBTY2xrIERQTSBhbmQgTWNsayBEUE0hIiwgcmV0dXJuIC0xKTsKKworCS8qIENoZWNraW5nIGlm IERQTSBpcyBydW5uaW5nLiAgSWYgd2UgZGlzY292ZXIgaGFuZyBiZWNhdXNlIG9mIHRoaXMsIHdl IHNob3VsZCBza2lwIHRoaXMgbWVzc2FnZS4qLworCVBQX0FTU0VSVF9XSVRIX0NPREUoCisJCQko MCA9PSB0b25nYV9pc19kcG1fcnVubmluZyhod21ncikpLAorCQkJIlRyeWluZyB0byBEaXNhYmxl IFZvbHRhZ2UgQ05UTCB3aGVuIERQTSBpcyBkaXNhYmxlZCIsCisJCQlyZXR1cm4gLTEKKwkJCSk7 CisKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKAorCQkJKDAgPT0gc211bV9zZW5kX21zZ190b19zbWMo aHdtZ3ItPnNtdW1nciwKKwkJCQkJUFBTTUNfTVNHX1ZvbHRhZ2VfQ250bF9EaXNhYmxlKSksCisJ CQkiRmFpbGVkIHRvIGRpc2FibGUgdm9sdGFnZSBEUE0gZHVyaW5nIERQTSBzdG9wIEZ1bmN0aW9u ISIsCisJCQlyZXR1cm4gLTEpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB0b25nYV9lbmFibGVf c2Nsa19jb250cm9sKHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJUEhNX1dSSVRFX1ZGUEZf SU5ESVJFQ1RfRklFTEQoaHdtZ3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywgU0NMS19QV1JN R1RfQ05UTCwgU0NMS19QV1JNR1RfT0ZGLCAwKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAq IFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBTTUMgYW5kIHJldHVybiBhIHBhcmFtZXRlcgorICoKKyAq IEBwYXJhbSAgICBod21ncjogIHRoZSBhZGRyZXNzIG9mIHRoZSBwb3dlcnBsYXkgaGFyZHdhcmUg bWFuYWdlci4KKyAqIEBwYXJhbSAgICBtc2c6IHRoZSBtZXNzYWdlIHRvIHNlbmQuCisgKiBAcGFy YW0gICAgcGFyYW1ldGVyOiBwb2ludGVyIHRvIHRoZSByZWNlaXZlZCBwYXJhbWV0ZXIKKyAqIEBy ZXR1cm4gICBUaGUgcmVzcG9uc2UgdGhhdCBjYW1lIGZyb20gdGhlIFNNQy4KKyAqLworUFBTTUNf UmVzdWx0IHRvbmdhX3NlbmRfbXNnX3RvX3NtY19yZXR1cm5fcGFyYW1ldGVyKAorCQlzdHJ1Y3Qg cHBfaHdtZ3IgKmh3bWdyLAorCQlQUFNNQ19Nc2cgbXNnLAorCQl1aW50MzJfdCAqcGFyYW1ldGVy KQoreworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSBzbXVtX3NlbmRfbXNnX3RvX3NtYyhod21n ci0+c211bWdyLCBtc2cpOworCisJaWYgKCgwID09IHJlc3VsdCkgJiYgcGFyYW1ldGVyKSB7CisJ CSpwYXJhbWV0ZXIgPSBjZ3NfcmVhZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBtbVNNQ19NU0df QVJHXzApOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogZm9yY2UgRFBNIHBv d2VyIFN0YXRlCisgKgorICogQHBhcmFtICAgIGh3bWdyOiAgdGhlIGFkZHJlc3Mgb2YgdGhlIHBv d2VycGxheSBoYXJkd2FyZSBtYW5hZ2VyLgorICogQHBhcmFtICAgIG4gICAgIDogIERQTSBsZXZl bAorICogQHJldHVybiAgIFRoZSByZXNwb25zZSB0aGF0IGNhbWUgZnJvbSB0aGUgU01DLgorICov CitpbnQgdG9uZ2FfZHBtX2ZvcmNlX3N0YXRlKHN0cnVjdCBwcF9od21nciAqaHdtZ3IsIHVpbnQz Ml90IG4pCit7CisJdG9uZ2FfaHdtZ3IgKmRhdGEgPSAodG9uZ2FfaHdtZ3IgKikoaHdtZ3ItPmJh Y2tlbmQpOworCXVpbnQzMl90IGxldmVsX21hc2sgPSAxIDw8IG47CisKKwkvKiBDaGVja2luZyBp ZiBEUE0gaXMgcnVubmluZy4gIElmIHdlIGRpc2NvdmVyIGhhbmcgYmVjYXVzZSBvZiB0aGlzLCB3 ZSBzaG91bGQgc2tpcCB0aGlzIG1lc3NhZ2UuICovCisJUFBfQVNTRVJUX1dJVEhfQ09ERSgwID09 IHRvbmdhX2lzX2RwbV9ydW5uaW5nKGh3bWdyKSwKKwkJCSJUcnlpbmcgdG8gZm9yY2UgU0NMSyB3 aGVuIERQTSBpcyBkaXNhYmxlZCIsIHJldHVybiAtMTspOworCWlmICgwID09IGRhdGEtPnNjbGtf ZHBtX2tleV9kaXNhYmxlZCkKKwkJcmV0dXJuICgwID09IHNtdW1fc2VuZF9tc2dfdG9fc21jX3dp dGhfcGFyYW1ldGVyKAorCQkJCQkJCSAgICAgaHdtZ3ItPnNtdW1nciwKKwkJICAgICAoUFBTTUNf TXNnKShQUFNNQ19NU0dfU0NMS0RQTV9TZXRFbmFibGVkTWFzayksCisJCQkJCQkgICAgbGV2ZWxf bWFzaykgPyAwIDogMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmb3JjZSBEUE0gcG93 ZXIgU3RhdGUKKyAqCisgKiBAcGFyYW0gICAgaHdtZ3I6ICB0aGUgYWRkcmVzcyBvZiB0aGUgcG93 ZXJwbGF5IGhhcmR3YXJlIG1hbmFnZXIuCisgKiBAcGFyYW0gICAgbiAgICAgOiAgRFBNIGxldmVs CisgKiBAcmV0dXJuICAgVGhlIHJlc3BvbnNlIHRoYXQgY2FtZSBmcm9tIHRoZSBTTUMuCisgKi8K K2ludCB0b25nYV9kcG1fZm9yY2Vfc3RhdGVfbWNsayhzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLCB1 aW50MzJfdCBuKQoreworCXRvbmdhX2h3bWdyICpkYXRhID0gKHRvbmdhX2h3bWdyICopKGh3bWdy LT5iYWNrZW5kKTsKKwl1aW50MzJfdCBsZXZlbF9tYXNrID0gMSA8PCBuOworCisJLyogQ2hlY2tp bmcgaWYgRFBNIGlzIHJ1bm5pbmcuICBJZiB3ZSBkaXNjb3ZlciBoYW5nIGJlY2F1c2Ugb2YgdGhp cywgd2Ugc2hvdWxkIHNraXAgdGhpcyBtZXNzYWdlLiAqLworCVBQX0FTU0VSVF9XSVRIX0NPREUo MCA9PSB0b25nYV9pc19kcG1fcnVubmluZyhod21nciksCisJCQkiVHJ5aW5nIHRvIEZvcmNlIE1D TEsgd2hlbiBEUE0gaXMgZGlzYWJsZWQiLCByZXR1cm4gLTE7KTsKKwlpZiAoMCA9PSBkYXRhLT5t Y2xrX2RwbV9rZXlfZGlzYWJsZWQpCisJCXJldHVybiAoMCA9PSBzbXVtX3NlbmRfbXNnX3RvX3Nt Y193aXRoX3BhcmFtZXRlcigKKwkJCQkJCQkJaHdtZ3ItPnNtdW1nciwKKwkJCQkJCQkJKFBQU01D X01zZykoUFBTTUNfTVNHX01DTEtEUE1fU2V0RW5hYmxlZE1hc2spLAorCQkJCQkJCQlsZXZlbF9t YXNrKSA/IDAgOiAxKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGZvcmNlIERQTSBwb3dl ciBTdGF0ZQorICoKKyAqIEBwYXJhbSAgICBod21ncjogIHRoZSBhZGRyZXNzIG9mIHRoZSBwb3dl cnBsYXkgaGFyZHdhcmUgbWFuYWdlci4KKyAqIEBwYXJhbSAgICBuICAgICA6ICBEUE0gbGV2ZWwK KyAqIEByZXR1cm4gICBUaGUgcmVzcG9uc2UgdGhhdCBjYW1lIGZyb20gdGhlIFNNQy4KKyAqLwor aW50IHRvbmdhX2RwbV9mb3JjZV9zdGF0ZV9wY2llKHN0cnVjdCBwcF9od21nciAqaHdtZ3IsIHVp bnQzMl90IG4pCit7CisJdG9uZ2FfaHdtZ3IgKmRhdGEgPSAodG9uZ2FfaHdtZ3IgKikoaHdtZ3It PmJhY2tlbmQpOworCisJLyogQ2hlY2tpbmcgaWYgRFBNIGlzIHJ1bm5pbmcuICBJZiB3ZSBkaXNj b3ZlciBoYW5nIGJlY2F1c2Ugb2YgdGhpcywgd2Ugc2hvdWxkIHNraXAgdGhpcyBtZXNzYWdlLiov CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgwID09IHRvbmdhX2lzX2RwbV9ydW5uaW5nKGh3bWdyKSwK KwkJCSJUcnlpbmcgdG8gRm9yY2UgUENJRSBsZXZlbCB3aGVuIERQTSBpcyBkaXNhYmxlZCIsIHJl dHVybiAtMTspOworCWlmICgwID09IGRhdGEtPnBjaWVfZHBtX2tleV9kaXNhYmxlZCkKKwkJcmV0 dXJuICgwID09IHNtdW1fc2VuZF9tc2dfdG9fc21jX3dpdGhfcGFyYW1ldGVyKAorCQkJCQkJCSAg ICAgaHdtZ3ItPnNtdW1nciwKKwkJCSAgIChQUFNNQ19Nc2cpKFBQU01DX01TR19QQ0llRFBNX0Zv cmNlTGV2ZWwpLAorCQkJCQkJCQluKSA/IDAgOiAxKTsKKworCXJldHVybiAwOworfQorCisvKioK KyAqIFNldCB0aGUgaW5pdGlhbCBzdGF0ZSBieSBjYWxsaW5nIFNNQyB0byBzd2l0Y2ggdG8gdGhp cyBzdGF0ZSBkaXJlY3RseQorICoKKyAqIEBwYXJhbSAgICBod21nciAgdGhlIGFkZHJlc3Mgb2Yg dGhlIHBvd2VycGxheSBoYXJkd2FyZSBtYW5hZ2VyLgorICogQHJldHVybiAgIGFsd2F5cyAwCisg Ki8KK2ludCB0b25nYV9zZXRfYm9vdF9zdGF0ZShzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQorewor CS8qCisJKiBTTUMgb25seSBzdG9yZXMgb25lIHN0YXRlIHRoYXQgU1cgd2lsbCBhc2sgdG8gc3dp dGNoIHRvbywKKwkqIHNvIHdlIHN3aXRjaCB0aGUgdGhlIGp1c3QgdXBsb2FkZWQgb25lCisJKi8K KwlyZXR1cm4gKDAgPT0gdG9uZ2FfZGlzYWJsZV9zY2xrX21jbGtfZHBtKGh3bWdyKSkgPyAwIDog MTsKK30KKworLyoqCisgKiBHZXQgdGhlIGxvY2F0aW9uIG9mIHZhcmlvdXMgdGFibGVzIGluc2lk ZSB0aGUgRlcgaW1hZ2UuCisgKgorICogQHBhcmFtICAgIGh3bWdyICB0aGUgYWRkcmVzcyBvZiB0 aGUgcG93ZXJwbGF5IGhhcmR3YXJlIG1hbmFnZXIuCisgKiBAcmV0dXJuICAgYWx3YXlzIDAKKyAq LworaW50IHRvbmdhX3Byb2Nlc3NfZmlybXdhcmVfaGVhZGVyKHN0cnVjdCBwcF9od21nciAqaHdt Z3IpCit7CisJdG9uZ2FfaHdtZ3IgKmRhdGEgPSAodG9uZ2FfaHdtZ3IgKikoaHdtZ3ItPmJhY2tl bmQpOworCXN0cnVjdCB0b25nYV9zbXVtZ3IgKnRvbmdhX3NtdSA9IChzdHJ1Y3QgdG9uZ2Ffc211 bWdyICopKGh3bWdyLT5zbXVtZ3ItPmJhY2tlbmQpOworCisJdWludDMyX3QgdG1wOworCWludCBy ZXN1bHQ7CisJYm9vbCBlcnJvciA9IDA7CisKKwlyZXN1bHQgPSB0b25nYV9yZWFkX3NtY19zcmFt X2R3b3JkKGh3bWdyLT5zbXVtZ3IsCisJCQkJU01VNzJfRklSTVdBUkVfSEVBREVSX0xPQ0FUSU9O ICsKKwkJCQlvZmZzZXRvZihTTVU3Ml9GaXJtd2FyZV9IZWFkZXIsIERwbVRhYmxlKSwKKwkJCQkm dG1wLCBkYXRhLT5zcmFtX2VuZCk7CisKKwlpZiAoMCA9PSByZXN1bHQpIHsKKwkJZGF0YS0+ZHBt X3RhYmxlX3N0YXJ0ID0gdG1wOworCX0KKworCWVycm9yIHw9ICgwICE9IHJlc3VsdCk7CisKKwly ZXN1bHQgPSB0b25nYV9yZWFkX3NtY19zcmFtX2R3b3JkKGh3bWdyLT5zbXVtZ3IsCisJCQkJU01V NzJfRklSTVdBUkVfSEVBREVSX0xPQ0FUSU9OICsKKwkJCQlvZmZzZXRvZihTTVU3Ml9GaXJtd2Fy ZV9IZWFkZXIsIFNvZnRSZWdpc3RlcnMpLAorCQkJCSZ0bXAsIGRhdGEtPnNyYW1fZW5kKTsKKwor CWlmICgwID09IHJlc3VsdCkgeworCQlkYXRhLT5zb2Z0X3JlZ3Nfc3RhcnQgPSB0bXA7CisJCXRv bmdhX3NtdS0+dWxTb2Z0UmVnc1N0YXJ0ID0gdG1wOworCX0KKworCWVycm9yIHw9ICgwICE9IHJl c3VsdCk7CisKKworCXJlc3VsdCA9IHRvbmdhX3JlYWRfc21jX3NyYW1fZHdvcmQoaHdtZ3ItPnNt dW1nciwKKwkJCQlTTVU3Ml9GSVJNV0FSRV9IRUFERVJfTE9DQVRJT04gKworCQkJCW9mZnNldG9m KFNNVTcyX0Zpcm13YXJlX0hlYWRlciwgbWNSZWdpc3RlclRhYmxlKSwKKwkJCQkmdG1wLCBkYXRh LT5zcmFtX2VuZCk7CisKKwlpZiAoMCA9PSByZXN1bHQpIHsKKwkJZGF0YS0+bWNfcmVnX3RhYmxl X3N0YXJ0ID0gdG1wOworCX0KKworCXJlc3VsdCA9IHRvbmdhX3JlYWRfc21jX3NyYW1fZHdvcmQo aHdtZ3ItPnNtdW1nciwKKwkJCQlTTVU3Ml9GSVJNV0FSRV9IRUFERVJfTE9DQVRJT04gKworCQkJ CW9mZnNldG9mKFNNVTcyX0Zpcm13YXJlX0hlYWRlciwgRmFuVGFibGUpLAorCQkJCSZ0bXAsIGRh dGEtPnNyYW1fZW5kKTsKKworCWlmICgwID09IHJlc3VsdCkgeworCQlkYXRhLT5mYW5fdGFibGVf c3RhcnQgPSB0bXA7CisJfQorCisJZXJyb3IgfD0gKDAgIT0gcmVzdWx0KTsKKworCXJlc3VsdCA9 IHRvbmdhX3JlYWRfc21jX3NyYW1fZHdvcmQoaHdtZ3ItPnNtdW1nciwKKwkJCQlTTVU3Ml9GSVJN V0FSRV9IRUFERVJfTE9DQVRJT04gKworCQkJCW9mZnNldG9mKFNNVTcyX0Zpcm13YXJlX0hlYWRl ciwgbWNBcmJEcmFtVGltaW5nVGFibGUpLAorCQkJCSZ0bXAsIGRhdGEtPnNyYW1fZW5kKTsKKwor CWlmICgwID09IHJlc3VsdCkgeworCQlkYXRhLT5hcmJfdGFibGVfc3RhcnQgPSB0bXA7CisJfQor CisJZXJyb3IgfD0gKDAgIT0gcmVzdWx0KTsKKworCisJcmVzdWx0ID0gdG9uZ2FfcmVhZF9zbWNf c3JhbV9kd29yZChod21nci0+c211bWdyLAorCQkJCVNNVTcyX0ZJUk1XQVJFX0hFQURFUl9MT0NB VElPTiArCisJCQkJb2Zmc2V0b2YoU01VNzJfRmlybXdhcmVfSGVhZGVyLCBWZXJzaW9uKSwKKwkJ CQkmdG1wLCBkYXRhLT5zcmFtX2VuZCk7CisKKwlpZiAoMCA9PSByZXN1bHQpIHsKKwkJaHdtZ3It Pm1pY3JvY29kZV92ZXJzaW9uX2luZm8uU01DID0gdG1wOworCX0KKworCWVycm9yIHw9ICgwICE9 IHJlc3VsdCk7CisKKwlyZXR1cm4gZXJyb3IgPyAxIDogMDsKK30KKworLyoqCisgKiBSZWFkIGNs b2NrIHJlbGF0ZWQgcmVnaXN0ZXJzLgorICoKKyAqIEBwYXJhbSAgICBod21nciAgdGhlIGFkZHJl c3Mgb2YgdGhlIHBvd2VycGxheSBoYXJkd2FyZSBtYW5hZ2VyLgorICogQHJldHVybiAgIGFsd2F5 cyAwCisgKi8KK2ludCB0b25nYV9yZWFkX2Nsb2NrX3JlZ2lzdGVycyhzdHJ1Y3QgcHBfaHdtZ3Ig Kmh3bWdyKQoreworCXRvbmdhX2h3bWdyICpkYXRhID0gKHRvbmdhX2h3bWdyICopKGh3bWdyLT5i YWNrZW5kKTsKKworCWRhdGEtPmNsb2NrX3JlZ2lzdGVycy52Q0dfU1BMTF9GVU5DX0NOVEwgICAg ICAgICA9CisJCWNnc19yZWFkX2luZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBDR1NfSU5EX1JF R19fU01DLCBpeENHX1NQTExfRlVOQ19DTlRMKTsKKwlkYXRhLT5jbG9ja19yZWdpc3RlcnMudkNH X1NQTExfRlVOQ19DTlRMXzIgICAgICAgPQorCQljZ3NfcmVhZF9pbmRfcmVnaXN0ZXIoaHdtZ3It PmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywgaXhDR19TUExMX0ZVTkNfQ05UTF8yKTsKKwlkYXRh LT5jbG9ja19yZWdpc3RlcnMudkNHX1NQTExfRlVOQ19DTlRMXzMgICAgICAgPQorCQljZ3NfcmVh ZF9pbmRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywgaXhDR19TUExM X0ZVTkNfQ05UTF8zKTsKKwlkYXRhLT5jbG9ja19yZWdpc3RlcnMudkNHX1NQTExfRlVOQ19DTlRM XzQgICAgICAgPQorCQljZ3NfcmVhZF9pbmRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgQ0dTX0lO RF9SRUdfX1NNQywgaXhDR19TUExMX0ZVTkNfQ05UTF80KTsKKwlkYXRhLT5jbG9ja19yZWdpc3Rl cnMudkNHX1NQTExfU1BSRUFEX1NQRUNUUlVNICAgPQorCQljZ3NfcmVhZF9pbmRfcmVnaXN0ZXIo aHdtZ3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywgaXhDR19TUExMX1NQUkVBRF9TUEVDVFJV TSk7CisJZGF0YS0+Y2xvY2tfcmVnaXN0ZXJzLnZDR19TUExMX1NQUkVBRF9TUEVDVFJVTV8yID0K KwkJY2dzX3JlYWRfaW5kX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19TTUMs IGl4Q0dfU1BMTF9TUFJFQURfU1BFQ1RSVU1fMik7CisJZGF0YS0+Y2xvY2tfcmVnaXN0ZXJzLnZE TExfQ05UTCAgICAgICAgICAgICAgICAgID0KKwkJY2dzX3JlYWRfcmVnaXN0ZXIoaHdtZ3ItPmRl dmljZSwgbW1ETExfQ05UTCk7CisJZGF0YS0+Y2xvY2tfcmVnaXN0ZXJzLnZNQ0xLX1BXUk1HVF9D TlRMICAgICAgICAgID0KKwkJY2dzX3JlYWRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ0xL X1BXUk1HVF9DTlRMKTsKKwlkYXRhLT5jbG9ja19yZWdpc3RlcnMudk1QTExfQURfRlVOQ19DTlRM ICAgICAgICAgPQorCQljZ3NfcmVhZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBtbU1QTExfQURf RlVOQ19DTlRMKTsKKwlkYXRhLT5jbG9ja19yZWdpc3RlcnMudk1QTExfRFFfRlVOQ19DTlRMICAg ICAgICAgPQorCQljZ3NfcmVhZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBtbU1QTExfRFFfRlVO Q19DTlRMKTsKKwlkYXRhLT5jbG9ja19yZWdpc3RlcnMudk1QTExfRlVOQ19DTlRMICAgICAgICAg ICAgPQorCQljZ3NfcmVhZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBtbU1QTExfRlVOQ19DTlRM KTsKKwlkYXRhLT5jbG9ja19yZWdpc3RlcnMudk1QTExfRlVOQ19DTlRMXzEgICAgICAgICAgPQor CQljZ3NfcmVhZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBtbU1QTExfRlVOQ19DTlRMXzEpOwor CWRhdGEtPmNsb2NrX3JlZ2lzdGVycy52TVBMTF9GVU5DX0NOVExfMiAgICAgICAgICA9CisJCWNn c19yZWFkX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIG1tTVBMTF9GVU5DX0NOVExfMik7CisJZGF0 YS0+Y2xvY2tfcmVnaXN0ZXJzLnZNUExMX1NTMSAgICAgICAgICAgICAgICAgID0KKwkJY2dzX3Jl YWRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NUExMX1NTMSk7CisJZGF0YS0+Y2xvY2tfcmVn aXN0ZXJzLnZNUExMX1NTMiAgICAgICAgICAgICAgICAgID0KKwkJY2dzX3JlYWRfcmVnaXN0ZXIo aHdtZ3ItPmRldmljZSwgbW1NUExMX1NTMik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBG aW5kIG91dCBpZiBtZW1vcnkgaXMgR0REUjUuCisgKgorICogQHBhcmFtICAgIGh3bWdyICB0aGUg YWRkcmVzcyBvZiB0aGUgcG93ZXJwbGF5IGhhcmR3YXJlIG1hbmFnZXIuCisgKiBAcmV0dXJuICAg YWx3YXlzIDAKKyAqLworaW50IHRvbmdhX2dldF9tZW1vcnlfdHlwZShzdHJ1Y3QgcHBfaHdtZ3Ig Kmh3bWdyKQoreworCXRvbmdhX2h3bWdyICpkYXRhID0gKHRvbmdhX2h3bWdyICopKGh3bWdyLT5i YWNrZW5kKTsKKwl1aW50MzJfdCB0ZW1wOworCisJdGVtcCA9IGNnc19yZWFkX3JlZ2lzdGVyKGh3 bWdyLT5kZXZpY2UsIG1tTUNfU0VRX01JU0MwKTsKKworCWRhdGEtPmlzX21lbW9yeV9HRERSNSA9 IChNQ19TRVFfTUlTQzBfR0REUjVfVkFMVUUgPT0KKwkJCSgodGVtcCAmIE1DX1NFUV9NSVNDMF9H RERSNV9NQVNLKSA+PgorCQkJIE1DX1NFUV9NSVNDMF9HRERSNV9TSElGVCkpOworCisJcmV0dXJu IDA7Cit9CisKKy8qKgorICogRW5hYmxlcyBEeW5hbWljIFBvd2VyIE1hbmFnZW1lbnQgYnkgU01D CisgKgorICogQHBhcmFtICAgIGh3bWdyICB0aGUgYWRkcmVzcyBvZiB0aGUgcG93ZXJwbGF5IGhh cmR3YXJlIG1hbmFnZXIuCisgKiBAcmV0dXJuICAgYWx3YXlzIDAKKyAqLworaW50IHRvbmdhX2Vu YWJsZV9hY3BpX3Bvd2VyX21hbmFnZW1lbnQoc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwlQ SE1fV1JJVEVfVkZQRl9JTkRJUkVDVF9GSUVMRChod21nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19f U01DLCBHRU5FUkFMX1BXUk1HVCwgU1RBVElDX1BNX0VOLCAxKTsKKworCXJldHVybiAwOworfQor CisvKioKKyAqIEluaXRpYWxpemUgUG93ZXJHYXRpbmcgU3RhdGVzIGZvciBkaWZmZXJlbnQgZW5n aW5lcworICoKKyAqIEBwYXJhbSAgICBod21nciAgdGhlIGFkZHJlc3Mgb2YgdGhlIHBvd2VycGxh eSBoYXJkd2FyZSBtYW5hZ2VyLgorICogQHJldHVybiAgIGFsd2F5cyAwCisgKi8KK2ludCB0b25n YV9pbml0X3Bvd2VyX2dhdGVfc3RhdGUoc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwl0b25n YV9od21nciAqZGF0YSA9ICh0b25nYV9od21nciAqKShod21nci0+YmFja2VuZCk7CisKKwlkYXRh LT51dmRfcG93ZXJfZ2F0ZWQgPSAwOworCWRhdGEtPnZjZV9wb3dlcl9nYXRlZCA9IDA7CisJZGF0 YS0+c2FtdV9wb3dlcl9nYXRlZCA9IDA7CisJZGF0YS0+YWNwX3Bvd2VyX2dhdGVkID0gMDsKKwlk YXRhLT5wZ19hY3BfaW5pdCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBDaGVja3Mg aWYgRFBNIGlzIGVuYWJsZWQKKyAqCisgKiBAcGFyYW0gICAgaHdtZ3IgIHRoZSBhZGRyZXNzIG9m IHRoZSBwb3dlcnBsYXkgaGFyZHdhcmUgbWFuYWdlci4KKyAqIEByZXR1cm4gICBhbHdheXMgMAor ICovCitpbnQgdG9uZ2FfY2hlY2tfZm9yX2RwbV9ydW5uaW5nKHN0cnVjdCBwcF9od21nciAqaHdt Z3IpCit7CisJLyoKKwkgKiBXZSByZXR1cm4gdGhlIHN0YXR1cyBvZiBWb2x0YWdlIENvbnRyb2wg aW5zdGVhZCBvZiBjaGVja2luZyBTQ0xLL01DTEsgRFBNCisJICogYmVjYXVzZSB3ZSBtYXkgaGF2 ZSB0ZXN0IHNjZW5hcmlvcyB0aGF0IG5lZWQgdXMgaW50ZW50aW9ubHkgZGlzYWJsZSBTQ0xLL01D TEsgRFBNLAorCSAqIHdoZXJlYXMgdm9sdGFnZSBjb250cm9sIGlzIGEgZnVuZGVtZW50YWwgY2hh bmdlIHRoYXQgd2lsbCBub3QgYmUgZGlzYWJsZWQKKwkgKi8KKwlyZXR1cm4gKDAgPT0gdG9uZ2Ff aXNfZHBtX3J1bm5pbmcoaHdtZ3IpID8gMCA6IDEpOworfQorCisvKioKKyAqIENoZWNrcyBpZiBE UE0gaXMgc3RvcHBlZAorICoKKyAqIEBwYXJhbSAgICBod21nciAgdGhlIGFkZHJlc3Mgb2YgdGhl IHBvd2VycGxheSBoYXJkd2FyZSBtYW5hZ2VyLgorICogQHJldHVybiAgIGFsd2F5cyAwCisgKi8K K2ludCB0b25nYV9jaGVja19mb3JfZHBtX3N0b3BwZWQoc3RydWN0IHBwX2h3bWdyICpod21ncikK K3sKKwl0b25nYV9od21nciAqZGF0YSA9ICh0b25nYV9od21nciAqKShod21nci0+YmFja2VuZCk7 CisKKwlpZiAoMCAhPSB0b25nYV9pc19kcG1fcnVubmluZyhod21ncikpIHsKKwkJLyogSWYgSFcg VmlydHVhbGl6YXRpb24gaXMgZW5hYmxlZCwgZHBtX3RhYmxlX3N0YXJ0IHdpbGwgbm90IGhhdmUg YSB2YWxpZCB2YWx1ZSAqLworCQlpZiAoIWRhdGEtPmRwbV90YWJsZV9zdGFydCkgeworCQkJcmV0 dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBSZW1vdmUgcmVwZWF0 ZWQgdm9sdGFnZSB2YWx1ZXMgYW5kIGNyZWF0ZSB0YWJsZSB3aXRoIHVuaXF1ZSB2YWx1ZXMuCisg KgorICogQHBhcmFtICAgIGh3bWdyICB0aGUgYWRkcmVzcyBvZiB0aGUgcG93ZXJwbGF5IGhhcmR3 YXJlIG1hbmFnZXIuCisgKiBAcGFyYW0gICAgdm9sdGFnZV90YWJsZSAgdGhlIHBvaW50ZXIgdG8g Y2hhbmdpbmcgdm9sdGFnZSB0YWJsZQorICogQHJldHVybiAgICAxIGluIHN1Y2Nlc3MKKyAqLwor CitzdGF0aWMgaW50IHRvbmdhX3RyaW1fdm9sdGFnZV90YWJsZShzdHJ1Y3QgcHBfaHdtZ3IgKmh3 bWdyLAorCQkJcHBfYXRvbWN0cmxfdm9sdGFnZV90YWJsZSAqdm9sdGFnZV90YWJsZSkKK3sKKwl1 aW50MzJfdCB0YWJsZV9zaXplLCBpLCBqOworCXVpbnQxNl90IHZ2YWx1ZTsKKwlib29sIGJWb2x0 YWdlRm91bmQgPSAwOworCXBwX2F0b21jdHJsX3ZvbHRhZ2VfdGFibGUgKnRhYmxlOworCisJUFBf QVNTRVJUX1dJVEhfQ09ERSgoTlVMTCAhPSB2b2x0YWdlX3RhYmxlKSwgIlZvbHRhZ2UgVGFibGUg ZW1wdHkuIiwgcmV0dXJuIC0xOyk7CisJdGFibGVfc2l6ZSA9IHNpemVvZihwcF9hdG9tY3RybF92 b2x0YWdlX3RhYmxlKTsKKwl0YWJsZSA9IGt6YWxsb2ModGFibGVfc2l6ZSwgR0ZQX0tFUk5FTCk7 CisKKwlpZiAoTlVMTCA9PSB0YWJsZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQodGFi bGUsIDB4MDAsIHRhYmxlX3NpemUpOworCXRhYmxlLT5tYXNrX2xvdyA9IHZvbHRhZ2VfdGFibGUt Pm1hc2tfbG93OworCXRhYmxlLT5waGFzZV9kZWxheSA9IHZvbHRhZ2VfdGFibGUtPnBoYXNlX2Rl bGF5OworCisJZm9yIChpID0gMDsgaSA8IHZvbHRhZ2VfdGFibGUtPmNvdW50OyBpKyspIHsKKwkJ dnZhbHVlID0gdm9sdGFnZV90YWJsZS0+ZW50cmllc1tpXS52YWx1ZTsKKwkJYlZvbHRhZ2VGb3Vu ZCA9IDA7CisKKwkJZm9yIChqID0gMDsgaiA8IHRhYmxlLT5jb3VudDsgaisrKSB7CisJCQlpZiAo dnZhbHVlID09IHRhYmxlLT5lbnRyaWVzW2pdLnZhbHVlKSB7CisJCQkJYlZvbHRhZ2VGb3VuZCA9 IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIWJWb2x0YWdlRm91bmQpIHsKKwkJ CXRhYmxlLT5lbnRyaWVzW3RhYmxlLT5jb3VudF0udmFsdWUgPSB2dmFsdWU7CisJCQl0YWJsZS0+ ZW50cmllc1t0YWJsZS0+Y291bnRdLnNtaW9fbG93ID0KKwkJCQl2b2x0YWdlX3RhYmxlLT5lbnRy aWVzW2ldLnNtaW9fbG93OworCQkJdGFibGUtPmNvdW50Kys7CisJCX0KKwl9CisKKwltZW1jcHko dGFibGUsIHZvbHRhZ2VfdGFibGUsIHNpemVvZihwcF9hdG9tY3RybF92b2x0YWdlX3RhYmxlKSk7 CisKKwlrZnJlZSh0YWJsZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0b25nYV9n ZXRfc3ZpMl92ZGRfY2lfdm9sdGFnZV90YWJsZSgKKwkJc3RydWN0IHBwX2h3bWdyICpod21nciwK KwkJcGhtX3BwdF92MV9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUgKnZvbHRhZ2VfZGVw ZW5kZW5jeV90YWJsZSkKK3sKKwl1aW50MzJfdCBpOworCWludCByZXN1bHQ7CisJdG9uZ2FfaHdt Z3IgKmRhdGEgPSAodG9uZ2FfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXBwX2F0b21jdHJs X3ZvbHRhZ2VfdGFibGUgKnZkZGNpX3ZvbHRhZ2VfdGFibGUgPSAmKGRhdGEtPnZkZGNpX3ZvbHRh Z2VfdGFibGUpOworCisJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCAhPSB2b2x0YWdlX2RlcGVuZGVu Y3lfdGFibGUtPmNvdW50KSwKKwkJCSJWb2x0YWdlIERlcGVuZGVuY3kgVGFibGUgZW1wdHkuIiwg cmV0dXJuIC0xOyk7CisKKwl2ZGRjaV92b2x0YWdlX3RhYmxlLT5tYXNrX2xvdyA9IDA7CisJdmRk Y2lfdm9sdGFnZV90YWJsZS0+cGhhc2VfZGVsYXkgPSAwOworCXZkZGNpX3ZvbHRhZ2VfdGFibGUt PmNvdW50ID0gdm9sdGFnZV9kZXBlbmRlbmN5X3RhYmxlLT5jb3VudDsKKworCWZvciAoaSA9IDA7 IGkgPCB2b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUtPmNvdW50OyBpKyspIHsKKwkJdmRkY2lfdm9s dGFnZV90YWJsZS0+ZW50cmllc1tpXS52YWx1ZSA9CisJCQl2b2x0YWdlX2RlcGVuZGVuY3lfdGFi bGUtPmVudHJpZXNbaV0udmRkY2k7CisJCXZkZGNpX3ZvbHRhZ2VfdGFibGUtPmVudHJpZXNbaV0u c21pb19sb3cgPSAwOworCX0KKworCXJlc3VsdCA9IHRvbmdhX3RyaW1fdm9sdGFnZV90YWJsZSho d21nciwgdmRkY2lfdm9sdGFnZV90YWJsZSk7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSBy ZXN1bHQpLAorCQkJIkZhaWxlZCB0byB0cmltIFZERENJIHRhYmxlLiIsIHJldHVybiByZXN1bHQ7 KTsKKworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCB0b25nYV9nZXRfc3ZpMl92ZGRf dm9sdGFnZV90YWJsZSgKKwkJc3RydWN0IHBwX2h3bWdyICpod21nciwKKwkJcGhtX3BwdF92MV92 b2x0YWdlX2xvb2t1cF90YWJsZSAqbG9va191cF90YWJsZSwKKwkJcHBfYXRvbWN0cmxfdm9sdGFn ZV90YWJsZSAqdm9sdGFnZV90YWJsZSkKK3sKKwl1aW50OF90IGkgPSAwOworCisJUFBfQVNTRVJU X1dJVEhfQ09ERSgoMCAhPSBsb29rX3VwX3RhYmxlLT5jb3VudCksCisJCQkiVm9sdGFnZSBMb29r dXAgVGFibGUgZW1wdHkuIiwgcmV0dXJuIC0xOyk7CisKKwl2b2x0YWdlX3RhYmxlLT5tYXNrX2xv dyA9IDA7CisJdm9sdGFnZV90YWJsZS0+cGhhc2VfZGVsYXkgPSAwOworCisJdm9sdGFnZV90YWJs ZS0+Y291bnQgPSBsb29rX3VwX3RhYmxlLT5jb3VudDsKKworCWZvciAoaSA9IDA7IGkgPCB2b2x0 YWdlX3RhYmxlLT5jb3VudDsgaSsrKSB7CisJCXZvbHRhZ2VfdGFibGUtPmVudHJpZXNbaV0udmFs dWUgPSBsb29rX3VwX3RhYmxlLT5lbnRyaWVzW2ldLnVzX3ZkZDsKKwkJdm9sdGFnZV90YWJsZS0+ ZW50cmllc1tpXS5zbWlvX2xvdyA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAt LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBW b2x0YWdlIFRhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSWYgdGhlIHZvbHRhZ2UgdGFibGUg d291bGQgYmUgYmlnZ2VyIHRoYW4gd2hhdCB3aWxsIGZpdCBpbnRvIHRoZSBzdGF0ZSB0YWJsZSBv biB0aGUgU01DIGtlZXAgb25seSB0aGUgaGlnaGVyIGVudHJpZXMuCisgKi8KKworc3RhdGljIHZv aWQgdG9uZ2FfdHJpbV92b2x0YWdlX3RhYmxlX3RvX2ZpdF9zdGF0ZV90YWJsZSgKKwkJc3RydWN0 IHBwX2h3bWdyICpod21nciwKKwkJdWludDMyX3QgbWF4X3ZvbHRhZ2Vfc3RlcHMsCisJCXBwX2F0 b21jdHJsX3ZvbHRhZ2VfdGFibGUgKnZvbHRhZ2VfdGFibGUpCit7CisJdW5zaWduZWQgaW50IGks IGRpZmY7CisKKwlpZiAodm9sdGFnZV90YWJsZS0+Y291bnQgPD0gbWF4X3ZvbHRhZ2Vfc3RlcHMp IHsKKwkJcmV0dXJuOworCX0KKworCWRpZmYgPSB2b2x0YWdlX3RhYmxlLT5jb3VudCAtIG1heF92 b2x0YWdlX3N0ZXBzOworCisJZm9yIChpID0gMDsgaSA8IG1heF92b2x0YWdlX3N0ZXBzOyBpKysp IHsKKwkJdm9sdGFnZV90YWJsZS0+ZW50cmllc1tpXSA9IHZvbHRhZ2VfdGFibGUtPmVudHJpZXNb aSArIGRpZmZdOworCX0KKworCXZvbHRhZ2VfdGFibGUtPmNvdW50ID0gbWF4X3ZvbHRhZ2Vfc3Rl cHM7CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogQ3JlYXRlIFZvbHRhZ2UgVGFibGVzLgorICoK KyAqIEBwYXJhbSAgICBod21nciAgdGhlIGFkZHJlc3Mgb2YgdGhlIHBvd2VycGxheSBoYXJkd2Fy ZSBtYW5hZ2VyLgorICogQHJldHVybiAgIGFsd2F5cyAwCisgKi8KK2ludCB0b25nYV9jb25zdHJ1 Y3Rfdm9sdGFnZV90YWJsZXMoc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwl0b25nYV9od21n ciAqZGF0YSA9ICh0b25nYV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJc3RydWN0IHBobV9w cHRfdjFfaW5mb3JtYXRpb24gKnBwdGFibGVfaW5mbyA9IChzdHJ1Y3QgcGhtX3BwdF92MV9pbmZv cm1hdGlvbiAqKShod21nci0+cHB0YWJsZSk7CisJaW50IHJlc3VsdDsKKworCS8qIE1WREQgaGFz IG9ubHkgR1BJTyB2b2x0YWdlIGNvbnRyb2wgKi8KKwlpZiAoVE9OR0FfVk9MVEFHRV9DT05UUk9M X0JZX0dQSU8gPT0gZGF0YS0+bXZkZF9jb250cm9sKSB7CisJCXJlc3VsdCA9IGF0b21jdHJsX2dl dF92b2x0YWdlX3RhYmxlX3YzKGh3bWdyLAorCQkJCQlWT0xUQUdFX1RZUEVfTVZEREMsIFZPTFRB R0VfT0JKX0dQSU9fTFVULCAmKGRhdGEtPm12ZGRfdm9sdGFnZV90YWJsZSkpOworCQlQUF9BU1NF UlRfV0lUSF9DT0RFKCgwID09IHJlc3VsdCksCisJCQkiRmFpbGVkIHRvIHJldHJpZXZlIE1WREQg dGFibGUuIiwgcmV0dXJuIHJlc3VsdDspOworCX0KKworCWlmIChUT05HQV9WT0xUQUdFX0NPTlRS T0xfQllfR1BJTyA9PSBkYXRhLT52ZGRfY2lfY29udHJvbCkgeworCQkvKiBHUElPIHZvbHRhZ2Ug Ki8KKwkJcmVzdWx0ID0gYXRvbWN0cmxfZ2V0X3ZvbHRhZ2VfdGFibGVfdjMoaHdtZ3IsCisJCQkJ CVZPTFRBR0VfVFlQRV9WRERDSSwgVk9MVEFHRV9PQkpfR1BJT19MVVQsICYoZGF0YS0+dmRkY2lf dm9sdGFnZV90YWJsZSkpOworCQlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09IHJlc3VsdCksCisJ CQkiRmFpbGVkIHRvIHJldHJpZXZlIFZERENJIHRhYmxlLiIsIHJldHVybiByZXN1bHQ7KTsKKwl9 IGVsc2UgaWYgKFRPTkdBX1ZPTFRBR0VfQ09OVFJPTF9CWV9TVklEMiA9PSBkYXRhLT52ZGRfY2lf Y29udHJvbCkgeworCQkvKiBTVkkyIHZvbHRhZ2UgKi8KKwkJcmVzdWx0ID0gdG9uZ2FfZ2V0X3N2 aTJfdmRkX2NpX3ZvbHRhZ2VfdGFibGUoaHdtZ3IsCisJCQkJCXBwdGFibGVfaW5mby0+dmRkX2Rl cF9vbl9tY2xrKTsKKwkJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSByZXN1bHQpLAorCQkJIkZh aWxlZCB0byByZXRyaWV2ZSBTVkkyIFZERENJIHRhYmxlIGZyb20gZGVwZW5kYW5jeSB0YWJsZS4i LCByZXR1cm4gcmVzdWx0Oyk7CisJfQorCisJaWYgKFRPTkdBX1ZPTFRBR0VfQ09OVFJPTF9CWV9T VklEMiA9PSBkYXRhLT52ZGRfZ2Z4X2NvbnRyb2wpIHsKKwkJLyogVkRER0ZYIGhhcyBvbmx5IFNW STIgdm9sdGFnZSBjb250cm9sICovCisJCXJlc3VsdCA9IHRvbmdhX2dldF9zdmkyX3ZkZF92b2x0 YWdlX3RhYmxlKGh3bWdyLAorCQkJCQlwcHRhYmxlX2luZm8tPnZkZGdmeF9sb29rdXBfdGFibGUs ICYoZGF0YS0+dmRkZ2Z4X3ZvbHRhZ2VfdGFibGUpKTsKKwkJUFBfQVNTRVJUX1dJVEhfQ09ERSgo MCA9PSByZXN1bHQpLAorCQkJIkZhaWxlZCB0byByZXRyaWV2ZSBTVkkyIFZEREdGWCB0YWJsZSBm cm9tIGxvb2t1cCB0YWJsZS4iLCByZXR1cm4gcmVzdWx0Oyk7CisJfQorCisJaWYgKFRPTkdBX1ZP TFRBR0VfQ09OVFJPTF9CWV9TVklEMiA9PSBkYXRhLT52b2x0YWdlX2NvbnRyb2wpIHsKKwkJLyog VkREQyBoYXMgb25seSBTVkkyIHZvbHRhZ2UgY29udHJvbCAqLworCQlyZXN1bHQgPSB0b25nYV9n ZXRfc3ZpMl92ZGRfdm9sdGFnZV90YWJsZShod21nciwKKwkJCQkJcHB0YWJsZV9pbmZvLT52ZGRj X2xvb2t1cF90YWJsZSwgJihkYXRhLT52ZGRjX3ZvbHRhZ2VfdGFibGUpKTsKKwkJUFBfQVNTRVJU X1dJVEhfQ09ERSgoMCA9PSByZXN1bHQpLAorCQkJIkZhaWxlZCB0byByZXRyaWV2ZSBTVkkyIFZE REMgdGFibGUgZnJvbSBsb29rdXAgdGFibGUuIiwgcmV0dXJuIHJlc3VsdDspOworCX0KKworCVBQ X0FTU0VSVF9XSVRIX0NPREUoCisJCQkoZGF0YS0+dmRkY192b2x0YWdlX3RhYmxlLmNvdW50IDw9 IChTTVU3Ml9NQVhfTEVWRUxTX1ZEREMpKSwKKwkJCSJUb28gbWFueSB2b2x0YWdlIHZhbHVlcyBm b3IgVkREQy4gVHJpbW1pbmcgdG8gZml0IHN0YXRlIHRhYmxlLiIsCisJCQl0b25nYV90cmltX3Zv bHRhZ2VfdGFibGVfdG9fZml0X3N0YXRlX3RhYmxlKGh3bWdyLAorCQkJU01VNzJfTUFYX0xFVkVM U19WRERDLCAmKGRhdGEtPnZkZGNfdm9sdGFnZV90YWJsZSkpOworCQkJKTsKKworCVBQX0FTU0VS VF9XSVRIX0NPREUoCisJCQkoZGF0YS0+dmRkZ2Z4X3ZvbHRhZ2VfdGFibGUuY291bnQgPD0gKFNN VTcyX01BWF9MRVZFTFNfVkRER0ZYKSksCisJCQkiVG9vIG1hbnkgdm9sdGFnZSB2YWx1ZXMgZm9y IFZEREdGWC4gVHJpbW1pbmcgdG8gZml0IHN0YXRlIHRhYmxlLiIsCisJCQl0b25nYV90cmltX3Zv bHRhZ2VfdGFibGVfdG9fZml0X3N0YXRlX3RhYmxlKGh3bWdyLAorCQkJU01VNzJfTUFYX0xFVkVM U19WRERHRlgsICYoZGF0YS0+dmRkZ2Z4X3ZvbHRhZ2VfdGFibGUpKTsKKwkJCSk7CisKKwlQUF9B U1NFUlRfV0lUSF9DT0RFKAorCQkJKGRhdGEtPnZkZGNpX3ZvbHRhZ2VfdGFibGUuY291bnQgPD0g KFNNVTcyX01BWF9MRVZFTFNfVkREQ0kpKSwKKwkJCSJUb28gbWFueSB2b2x0YWdlIHZhbHVlcyBm b3IgVkREQ0kuIFRyaW1taW5nIHRvIGZpdCBzdGF0ZSB0YWJsZS4iLAorCQkJdG9uZ2FfdHJpbV92 b2x0YWdlX3RhYmxlX3RvX2ZpdF9zdGF0ZV90YWJsZShod21nciwKKwkJCVNNVTcyX01BWF9MRVZF TFNfVkREQ0ksICYoZGF0YS0+dmRkY2lfdm9sdGFnZV90YWJsZSkpOworCQkJKTsKKworCVBQX0FT U0VSVF9XSVRIX0NPREUoCisJCQkoZGF0YS0+bXZkZF92b2x0YWdlX3RhYmxlLmNvdW50IDw9IChT TVU3Ml9NQVhfTEVWRUxTX01WREQpKSwKKwkJCSJUb28gbWFueSB2b2x0YWdlIHZhbHVlcyBmb3Ig TVZERC4gVHJpbW1pbmcgdG8gZml0IHN0YXRlIHRhYmxlLiIsCisJCQl0b25nYV90cmltX3ZvbHRh Z2VfdGFibGVfdG9fZml0X3N0YXRlX3RhYmxlKGh3bWdyLAorCQkJU01VNzJfTUFYX0xFVkVMU19N VkRELCAmKGRhdGEtPm12ZGRfdm9sdGFnZV90YWJsZSkpOworCQkJKTsKKworCXJldHVybiAwOwor fQorCisvKioKKyAqIFZkZGMgdGFibGUgcHJlcGFyYXRpb24gZm9yIFNNQy4KKyAqCisgKiBAcGFy YW0gICAgaHdtZ3IgICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgaGFyZHdhcmUgbWFuYWdlcgorICog QHBhcmFtICAgIHRhYmxlICAgICB0aGUgU01DIERQTSB0YWJsZSBzdHJ1Y3R1cmUgdG8gYmUgcG9w dWxhdGVkCisgKiBAcmV0dXJuICAgYWx3YXlzIDAKKyAqLworc3RhdGljIGludCB0b25nYV9wb3B1 bGF0ZV9zbWNfdmRkY190YWJsZShzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLAorCQkJU01VNzJfRGlz Y3JldGVfRHBtVGFibGUgKnRhYmxlKQoreworCXVuc2lnbmVkIGludCBjb3VudDsKKwl0b25nYV9o d21nciAqZGF0YSA9ICh0b25nYV9od21nciAqKShod21nci0+YmFja2VuZCk7CisKKwlpZiAoVE9O R0FfVk9MVEFHRV9DT05UUk9MX0JZX1NWSUQyID09IGRhdGEtPnZvbHRhZ2VfY29udHJvbCkgewor CQl0YWJsZS0+VmRkY0xldmVsQ291bnQgPSBkYXRhLT52ZGRjX3ZvbHRhZ2VfdGFibGUuY291bnQ7 CisJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IHRhYmxlLT5WZGRjTGV2ZWxDb3VudDsgY291bnQr KykgeworCQkJdGFibGUtPlZkZGNUYWJsZVtjb3VudF0gPQorCQkJCVBQX0hPU1RfVE9fU01DX1VT KGRhdGEtPnZkZGNfdm9sdGFnZV90YWJsZS5lbnRyaWVzW2NvdW50XS52YWx1ZSAqIFZPTFRBR0Vf U0NBTEUpOworCQl9CisJCUNPTlZFUlRfRlJPTV9IT1NUX1RPX1NNQ19VTCh0YWJsZS0+VmRkY0xl dmVsQ291bnQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBWZGRHZnggdGFibGUgcHJl cGFyYXRpb24gZm9yIFNNQy4KKyAqCisgKiBAcGFyYW0gICAgaHdtZ3IgICAgICB0aGUgYWRkcmVz cyBvZiB0aGUgaGFyZHdhcmUgbWFuYWdlcgorICogQHBhcmFtICAgIHRhYmxlICAgICB0aGUgU01D IERQTSB0YWJsZSBzdHJ1Y3R1cmUgdG8gYmUgcG9wdWxhdGVkCisgKiBAcmV0dXJuICAgYWx3YXlz IDAKKyAqLworc3RhdGljIGludCB0b25nYV9wb3B1bGF0ZV9zbWNfdmRkX2dmeF90YWJsZShzdHJ1 Y3QgcHBfaHdtZ3IgKmh3bWdyLAorCQkJU01VNzJfRGlzY3JldGVfRHBtVGFibGUgKnRhYmxlKQor eworCXVuc2lnbmVkIGludCBjb3VudDsKKwl0b25nYV9od21nciAqZGF0YSA9ICh0b25nYV9od21n ciAqKShod21nci0+YmFja2VuZCk7CisKKwlpZiAoVE9OR0FfVk9MVEFHRV9DT05UUk9MX0JZX1NW SUQyID09IGRhdGEtPnZkZF9nZnhfY29udHJvbCkgeworCQl0YWJsZS0+VmRkR2Z4TGV2ZWxDb3Vu dCA9IGRhdGEtPnZkZGdmeF92b2x0YWdlX3RhYmxlLmNvdW50OworCQlmb3IgKGNvdW50ID0gMDsg Y291bnQgPCBkYXRhLT52ZGRnZnhfdm9sdGFnZV90YWJsZS5jb3VudDsgY291bnQrKykgeworCQkJ dGFibGUtPlZkZEdmeFRhYmxlW2NvdW50XSA9CisJCQkJUFBfSE9TVF9UT19TTUNfVVMoZGF0YS0+ dmRkZ2Z4X3ZvbHRhZ2VfdGFibGUuZW50cmllc1tjb3VudF0udmFsdWUgKiBWT0xUQUdFX1NDQUxF KTsKKwkJfQorCQlDT05WRVJUX0ZST01fSE9TVF9UT19TTUNfVUwodGFibGUtPlZkZEdmeExldmVs Q291bnQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBWZGRjaSB0YWJsZSBwcmVwYXJh dGlvbiBmb3IgU01DLgorICoKKyAqIEBwYXJhbSAgICAqaHdtZ3IgVGhlIGFkZHJlc3Mgb2YgdGhl IGhhcmR3YXJlIG1hbmFnZXIuCisgKiBAcGFyYW0gICAgKnRhYmxlIFRoZSBTTUMgRFBNIHRhYmxl IHN0cnVjdHVyZSB0byBiZSBwb3B1bGF0ZWQuCisgKiBAcmV0dXJuICAgMAorICovCitzdGF0aWMg aW50IHRvbmdhX3BvcHVsYXRlX3NtY192ZGRfY2lfdGFibGUoc3RydWN0IHBwX2h3bWdyICpod21n ciwKKwkJCVNNVTcyX0Rpc2NyZXRlX0RwbVRhYmxlICp0YWJsZSkKK3sKKwl0b25nYV9od21nciAq ZGF0YSA9ICh0b25nYV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJdWludDMyX3QgY291bnQ7 CisKKwl0YWJsZS0+VmRkY2lMZXZlbENvdW50ID0gZGF0YS0+dmRkY2lfdm9sdGFnZV90YWJsZS5j b3VudDsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCB0YWJsZS0+VmRkY2lMZXZlbENvdW50OyBj b3VudCsrKSB7CisJCWlmIChUT05HQV9WT0xUQUdFX0NPTlRST0xfQllfU1ZJRDIgPT0gZGF0YS0+ dmRkX2NpX2NvbnRyb2wpIHsKKwkJCXRhYmxlLT5WZGRjaVRhYmxlW2NvdW50XSA9CisJCQkJUFBf SE9TVF9UT19TTUNfVVMoZGF0YS0+dmRkY2lfdm9sdGFnZV90YWJsZS5lbnRyaWVzW2NvdW50XS52 YWx1ZSAqIFZPTFRBR0VfU0NBTEUpOworCQl9IGVsc2UgaWYgKFRPTkdBX1ZPTFRBR0VfQ09OVFJP TF9CWV9HUElPID09IGRhdGEtPnZkZF9jaV9jb250cm9sKSB7CisJCQl0YWJsZS0+U21pb1RhYmxl MS5QYXR0ZXJuW2NvdW50XS5Wb2x0YWdlID0KKwkJCQlQUF9IT1NUX1RPX1NNQ19VUyhkYXRhLT52 ZGRjaV92b2x0YWdlX3RhYmxlLmVudHJpZXNbY291bnRdLnZhbHVlICogVk9MVEFHRV9TQ0FMRSk7 CisJCQkvKiBJbmRleCBpbnRvIERwbVRhYmxlLlNtaW8uIERyaXZlIGJpdHMgZnJvbSBTbWlvIGVu dHJ5IHRvIGdldCB0aGlzIHZvbHRhZ2UgbGV2ZWwuICovCisJCQl0YWJsZS0+U21pb1RhYmxlMS5Q YXR0ZXJuW2NvdW50XS5TbWlvID0KKwkJCQkodWludDhfdCkgY291bnQ7CisJCQl0YWJsZS0+U21p b1tjb3VudF0gfD0KKwkJCQlkYXRhLT52ZGRjaV92b2x0YWdlX3RhYmxlLmVudHJpZXNbY291bnRd LnNtaW9fbG93OworCQkJdGFibGUtPlZkZGNpVGFibGVbY291bnRdID0KKwkJCQlQUF9IT1NUX1RP X1NNQ19VUyhkYXRhLT52ZGRjaV92b2x0YWdlX3RhYmxlLmVudHJpZXNbY291bnRdLnZhbHVlICog Vk9MVEFHRV9TQ0FMRSk7CisJCX0KKwl9CisKKwl0YWJsZS0+U21pb01hc2sxID0gZGF0YS0+dmRk Y2lfdm9sdGFnZV90YWJsZS5tYXNrX2xvdzsKKwlDT05WRVJUX0ZST01fSE9TVF9UT19TTUNfVUwo dGFibGUtPlZkZGNpTGV2ZWxDb3VudCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBNdmRk IHRhYmxlIHByZXBhcmF0aW9uIGZvciBTTUMuCisgKgorICogQHBhcmFtICAgICpod21nciBUaGUg YWRkcmVzcyBvZiB0aGUgaGFyZHdhcmUgbWFuYWdlci4KKyAqIEBwYXJhbSAgICAqdGFibGUgVGhl IFNNQyBEUE0gdGFibGUgc3RydWN0dXJlIHRvIGJlIHBvcHVsYXRlZC4KKyAqIEByZXR1cm4gICAw CisgKi8KK3N0YXRpYyBpbnQgdG9uZ2FfcG9wdWxhdGVfc21jX212ZGRfdGFibGUoc3RydWN0IHBw X2h3bWdyICpod21nciwKKwkJCVNNVTcyX0Rpc2NyZXRlX0RwbVRhYmxlICp0YWJsZSkKK3sKKwl0 b25nYV9od21nciAqZGF0YSA9ICh0b25nYV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJdWlu dDMyX3QgY291bnQ7CisKKwlpZiAoVE9OR0FfVk9MVEFHRV9DT05UUk9MX0JZX0dQSU8gPT0gZGF0 YS0+bXZkZF9jb250cm9sKSB7CisJCXRhYmxlLT5NdmRkTGV2ZWxDb3VudCA9IGRhdGEtPm12ZGRf dm9sdGFnZV90YWJsZS5jb3VudDsKKwkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgdGFibGUtPk12 ZGRMZXZlbENvdW50OyBjb3VudCsrKSB7CisJCQl0YWJsZS0+U21pb1RhYmxlMi5QYXR0ZXJuW2Nv dW50XS5Wb2x0YWdlID0KKwkJCQlQUF9IT1NUX1RPX1NNQ19VUyhkYXRhLT5tdmRkX3ZvbHRhZ2Vf dGFibGUuZW50cmllc1tjb3VudF0udmFsdWUgKiBWT0xUQUdFX1NDQUxFKTsKKwkJCS8qIEluZGV4 IGludG8gRHBtVGFibGUuU21pby4gRHJpdmUgYml0cyBmcm9tIFNtaW8gZW50cnkgdG8gZ2V0IHRo aXMgdm9sdGFnZSBsZXZlbC4qLworCQkJdGFibGUtPlNtaW9UYWJsZTIuUGF0dGVybltjb3VudF0u U21pbyA9CisJCQkJKHVpbnQ4X3QpIGNvdW50OworCQkJdGFibGUtPlNtaW9bY291bnRdIHw9CisJ CQkJZGF0YS0+bXZkZF92b2x0YWdlX3RhYmxlLmVudHJpZXNbY291bnRdLnNtaW9fbG93OworCQl9 CisJCXRhYmxlLT5TbWlvTWFzazIgPSBkYXRhLT52ZGRjaV92b2x0YWdlX3RhYmxlLm1hc2tfbG93 OworCisJCUNPTlZFUlRfRlJPTV9IT1NUX1RPX1NNQ19VTCh0YWJsZS0+TXZkZExldmVsQ291bnQp OworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIENvbnZlcnQgYSB2b2x0YWdlIHZhbHVl IGluIG12IHVuaXQgdG8gVklEIG51bWJlciByZXF1aXJlZCBieSBTTVUgZmlybXdhcmUKKyAqLwor c3RhdGljIHVpbnQ4X3QgY29udmVydF90b192aWQodWludDE2X3QgdmRkYykKK3sKKwlyZXR1cm4g KHVpbnQ4X3QpICgoNjIwMCAtICh2ZGRjICogVk9MVEFHRV9TQ0FMRSkpIC8gMjUpOworfQorCisK Ky8qKgorICogUHJlcGFyYXRpb24gb2YgdmRkYyBhbmQgdmRkZ2Z4IENBQyB0YWJsZXMgZm9yIFNN Qy4KKyAqCisgKiBAcGFyYW0gICAgaHdtZ3IgICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgaGFyZHdh cmUgbWFuYWdlcgorICogQHBhcmFtICAgIHRhYmxlICAgICB0aGUgU01DIERQTSB0YWJsZSBzdHJ1 Y3R1cmUgdG8gYmUgcG9wdWxhdGVkCisgKiBAcmV0dXJuICAgYWx3YXlzIDAKKyAqLworc3RhdGlj IGludCB0b25nYV9wb3B1bGF0ZV9jYWNfdGFibGVzKHN0cnVjdCBwcF9od21nciAqaHdtZ3IsCisJ CQlTTVU3Ml9EaXNjcmV0ZV9EcG1UYWJsZSAqdGFibGUpCit7CisJdWludDMyX3QgY291bnQ7CisJ dWludDhfdCBpbmRleDsKKwlpbnQgcmVzdWx0ID0gMDsKKwl0b25nYV9od21nciAqZGF0YSA9ICh0 b25nYV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJc3RydWN0IHBobV9wcHRfdjFfaW5mb3Jt YXRpb24gKnBwdGFibGVfaW5mbyA9IChzdHJ1Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqKSho d21nci0+cHB0YWJsZSk7CisJc3RydWN0IHBobV9wcHRfdjFfdm9sdGFnZV9sb29rdXBfdGFibGUg KnZkZGdmeF9sb29rdXBfdGFibGUgPSBwcHRhYmxlX2luZm8tPnZkZGdmeF9sb29rdXBfdGFibGU7 CisJc3RydWN0IHBobV9wcHRfdjFfdm9sdGFnZV9sb29rdXBfdGFibGUgKnZkZGNfbG9va3VwX3Rh YmxlID0gcHB0YWJsZV9pbmZvLT52ZGRjX2xvb2t1cF90YWJsZTsKKworCS8qIHBUYWJsZXMgaXMg YWxyZWFkeSBzd2FwcGVkLCBzbyBpbiBvcmRlciB0byB1c2UgdGhlIHZhbHVlIGZyb20gaXQsIHdl IG5lZWQgdG8gc3dhcCBpdCBiYWNrLiAqLworCXVpbnQzMl90IHZkZGNMZXZlbENvdW50ID0gUFBf U01DX1RPX0hPU1RfVUwodGFibGUtPlZkZGNMZXZlbENvdW50KTsKKwl1aW50MzJfdCB2ZGRnZnhM ZXZlbENvdW50ID0gUFBfU01DX1RPX0hPU1RfVUwodGFibGUtPlZkZEdmeExldmVsQ291bnQpOwor CisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgdmRkY0xldmVsQ291bnQ7IGNvdW50KyspIHsKKwkJ LyogV2UgYXJlIHBvcHVsYXRpbmcgdmRkYyBDQUMgZGF0YSB0byBCYXBtVmRkYyB0YWJsZSBpbiBz cGxpdCBhbmQgbWVyZ2VkIG1vZGUgKi8KKwkJaW5kZXggPSB0b25nYV9nZXRfdm9sdGFnZV9pbmRl eCh2ZGRjX2xvb2t1cF90YWJsZSwKKwkJCWRhdGEtPnZkZGNfdm9sdGFnZV90YWJsZS5lbnRyaWVz W2NvdW50XS52YWx1ZSk7CisJCXRhYmxlLT5CYXBtVmRkY1ZpZExvU2lkZFtjb3VudF0gPQorCQkJ Y29udmVydF90b192aWQodmRkY19sb29rdXBfdGFibGUtPmVudHJpZXNbaW5kZXhdLnVzX2NhY19s b3cpOworCQl0YWJsZS0+QmFwbVZkZGNWaWRIaVNpZGRbY291bnRdID0KKwkJCWNvbnZlcnRfdG9f dmlkKHZkZGNfbG9va3VwX3RhYmxlLT5lbnRyaWVzW2luZGV4XS51c19jYWNfbWlkKTsKKwkJdGFi bGUtPkJhcG1WZGRjVmlkSGlTaWRkMltjb3VudF0gPQorCQkJY29udmVydF90b192aWQodmRkY19s b29rdXBfdGFibGUtPmVudHJpZXNbaW5kZXhdLnVzX2NhY19oaWdoKTsKKwl9CisKKwlpZiAoKGRh dGEtPnZkZF9nZnhfY29udHJvbCA9PSBUT05HQV9WT0xUQUdFX0NPTlRST0xfQllfU1ZJRDIpKSB7 CisJCS8qIFdlIGFyZSBwb3B1bGF0aW5nIHZkZGdmeCBDQUMgZGF0YSB0byBCYXBtVmRkZ2Z4IHRh YmxlIGluIHNwbGl0IG1vZGUgKi8KKwkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgdmRkZ2Z4TGV2 ZWxDb3VudDsgY291bnQrKykgeworCQkJaW5kZXggPSB0b25nYV9nZXRfdm9sdGFnZV9pbmRleCh2 ZGRnZnhfbG9va3VwX3RhYmxlLAorCQkJCWRhdGEtPnZkZGdmeF92b2x0YWdlX3RhYmxlLmVudHJp ZXNbY291bnRdLnZhbHVlKTsKKwkJCXRhYmxlLT5CYXBtVmRkR2Z4VmlkTG9TaWRkW2NvdW50XSA9 CisJCQkJY29udmVydF90b192aWQodmRkZ2Z4X2xvb2t1cF90YWJsZS0+ZW50cmllc1tpbmRleF0u dXNfY2FjX2xvdyk7CisJCQl0YWJsZS0+QmFwbVZkZEdmeFZpZEhpU2lkZFtjb3VudF0gPQorCQkJ CWNvbnZlcnRfdG9fdmlkKHZkZGdmeF9sb29rdXBfdGFibGUtPmVudHJpZXNbaW5kZXhdLnVzX2Nh Y19taWQpOworCQkJdGFibGUtPkJhcG1WZGRHZnhWaWRIaVNpZGQyW2NvdW50XSA9CisJCQkJY29u dmVydF90b192aWQodmRkZ2Z4X2xvb2t1cF90YWJsZS0+ZW50cmllc1tpbmRleF0udXNfY2FjX2hp Z2gpOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgdmRkY0xldmVs Q291bnQ7IGNvdW50KyspIHsKKwkJCWluZGV4ID0gdG9uZ2FfZ2V0X3ZvbHRhZ2VfaW5kZXgodmRk Y19sb29rdXBfdGFibGUsCisJCQkJZGF0YS0+dmRkY192b2x0YWdlX3RhYmxlLmVudHJpZXNbY291 bnRdLnZhbHVlKTsKKwkJCXRhYmxlLT5CYXBtVmRkR2Z4VmlkTG9TaWRkW2NvdW50XSA9CisJCQkJ Y29udmVydF90b192aWQodmRkY19sb29rdXBfdGFibGUtPmVudHJpZXNbaW5kZXhdLnVzX2NhY19s b3cpOworCQkJdGFibGUtPkJhcG1WZGRHZnhWaWRIaVNpZGRbY291bnRdID0KKwkJCQljb252ZXJ0 X3RvX3ZpZCh2ZGRjX2xvb2t1cF90YWJsZS0+ZW50cmllc1tpbmRleF0udXNfY2FjX21pZCk7CisJ CQl0YWJsZS0+QmFwbVZkZEdmeFZpZEhpU2lkZDJbY291bnRdID0KKwkJCQljb252ZXJ0X3RvX3Zp ZCh2ZGRjX2xvb2t1cF90YWJsZS0+ZW50cmllc1tpbmRleF0udXNfY2FjX2hpZ2gpOworCQl9CisJ fQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioKKyAqIFByZXBhcmF0aW9uIG9mIHZvbHRh Z2UgdGFibGVzIGZvciBTTUMuCisgKgorICogQHBhcmFtICAgIGh3bWdyICAgICAgdGhlIGFkZHJl c3Mgb2YgdGhlIGhhcmR3YXJlIG1hbmFnZXIKKyAqIEBwYXJhbSAgICB0YWJsZSAgICAgdGhlIFNN QyBEUE0gdGFibGUgc3RydWN0dXJlIHRvIGJlIHBvcHVsYXRlZAorICogQHJldHVybiAgIGFsd2F5 cyAwCisgKi8KKworaW50IHRvbmdhX3BvcHVsYXRlX3NtY192b2x0YWdlX3RhYmxlcyhzdHJ1Y3Qg cHBfaHdtZ3IgKmh3bWdyLAorCVNNVTcyX0Rpc2NyZXRlX0RwbVRhYmxlICp0YWJsZSkKK3sKKwlp bnQgcmVzdWx0OworCisJcmVzdWx0ID0gdG9uZ2FfcG9wdWxhdGVfc21jX3ZkZGNfdGFibGUoaHdt Z3IsIHRhYmxlKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKDAgPT0gcmVzdWx0LAorCQkJImNhbiBu b3QgcG9wdWxhdGUgVkREQyB2b2x0YWdlIHRhYmxlIHRvIFNNQyIsIHJldHVybiAtMSk7CisKKwly ZXN1bHQgPSB0b25nYV9wb3B1bGF0ZV9zbWNfdmRkX2NpX3RhYmxlKGh3bWdyLCB0YWJsZSk7CisJ UFBfQVNTRVJUX1dJVEhfQ09ERSgwID09IHJlc3VsdCwKKwkJCSJjYW4gbm90IHBvcHVsYXRlIFZE RENJIHZvbHRhZ2UgdGFibGUgdG8gU01DIiwgcmV0dXJuIC0xKTsKKworCXJlc3VsdCA9IHRvbmdh X3BvcHVsYXRlX3NtY192ZGRfZ2Z4X3RhYmxlKGh3bWdyLCB0YWJsZSk7CisJUFBfQVNTRVJUX1dJ VEhfQ09ERSgwID09IHJlc3VsdCwKKwkJCSJjYW4gbm90IHBvcHVsYXRlIFZEREdGWCB2b2x0YWdl IHRhYmxlIHRvIFNNQyIsIHJldHVybiAtMSk7CisKKwlyZXN1bHQgPSB0b25nYV9wb3B1bGF0ZV9z bWNfbXZkZF90YWJsZShod21nciwgdGFibGUpOworCVBQX0FTU0VSVF9XSVRIX0NPREUoMCA9PSBy ZXN1bHQsCisJCQkiY2FuIG5vdCBwb3B1bGF0ZSBNVkREIHZvbHRhZ2UgdGFibGUgdG8gU01DIiwg cmV0dXJuIC0xKTsKKworCXJlc3VsdCA9IHRvbmdhX3BvcHVsYXRlX2NhY190YWJsZXMoaHdtZ3Is IHRhYmxlKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKDAgPT0gcmVzdWx0LAorCQkJImNhbiBub3Qg cG9wdWxhdGUgQ0FDIHZvbHRhZ2UgdGFibGVzIHRvIFNNQyIsIHJldHVybiAtMSk7CisKKwlyZXR1 cm4gMDsKK30KKworLyoqCisgKiBQb3B1bGF0ZXMgdGhlIFNNQyBWUkNvbmZpZyBmaWVsZCBpbiBE UE0gdGFibGUuCisgKgorICogQHBhcmFtICAgIGh3bWdyICAgICAgdGhlIGFkZHJlc3Mgb2YgdGhl IGhhcmR3YXJlIG1hbmFnZXIKKyAqIEBwYXJhbSAgICB0YWJsZSAgICAgdGhlIFNNQyBEUE0gdGFi bGUgc3RydWN0dXJlIHRvIGJlIHBvcHVsYXRlZAorICogQHJldHVybiAgIGFsd2F5cyAwCisgKi8K K3N0YXRpYyBpbnQgdG9uZ2FfcG9wdWxhdGVfdnJfY29uZmlnKHN0cnVjdCBwcF9od21nciAqaHdt Z3IsCisJCQlTTVU3Ml9EaXNjcmV0ZV9EcG1UYWJsZSAqdGFibGUpCit7CisJdG9uZ2FfaHdtZ3Ig KmRhdGEgPSAodG9uZ2FfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXVpbnQxNl90IGNvbmZp ZzsKKworCWlmIChUT05HQV9WT0xUQUdFX0NPTlRST0xfQllfU1ZJRDIgPT0gZGF0YS0+dmRkX2dm eF9jb250cm9sKSB7CisJCS8qICBTcGxpdHRlZCBtb2RlICovCisJCWNvbmZpZyA9IFZSX1NWSTJf UExBTkVfMTsKKwkJdGFibGUtPlZSQ29uZmlnIHw9IChjb25maWc8PFZSQ09ORl9WRERHRlhfU0hJ RlQpOworCisJCWlmIChUT05HQV9WT0xUQUdFX0NPTlRST0xfQllfU1ZJRDIgPT0gZGF0YS0+dm9s dGFnZV9jb250cm9sKSB7CisJCQljb25maWcgPSBWUl9TVkkyX1BMQU5FXzI7CisJCQl0YWJsZS0+ VlJDb25maWcgfD0gY29uZmlnOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSICJbIHBv d2VycGxheSBdIFZEREMgYW5kIFZEREdGWCBzaG91bGQgYmUgYm90aCBvbiBTVkkyIGNvbnRyb2wg aW4gc3BsaXR0ZWQgbW9kZSEgXG4iKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIE1lcmdlZCBtb2Rl ICAqLworCQljb25maWcgPSBWUl9NRVJHRURfV0lUSF9WRERDOworCQl0YWJsZS0+VlJDb25maWcg fD0gKGNvbmZpZzw8VlJDT05GX1ZEREdGWF9TSElGVCk7CisKKwkJLyogU2V0IFZkZGMgVm9sdGFn ZSBDb250cm9sbGVyICAqLworCQlpZiAoVE9OR0FfVk9MVEFHRV9DT05UUk9MX0JZX1NWSUQyID09 IGRhdGEtPnZvbHRhZ2VfY29udHJvbCkgeworCQkJY29uZmlnID0gVlJfU1ZJMl9QTEFORV8xOwor CQkJdGFibGUtPlZSQ29uZmlnIHw9IGNvbmZpZzsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJO X0VSUiAiWyBwb3dlcnBsYXkgXSBWRERDIHNob3VsZCBiZSBvbiBTVkkyIGNvbnRyb2wgaW4gbWVy Z2VkIG1vZGUhIFxuIik7CisJCX0KKwl9CisKKwkvKiBTZXQgVmRkY2kgVm9sdGFnZSBDb250cm9s bGVyICAqLworCWlmIChUT05HQV9WT0xUQUdFX0NPTlRST0xfQllfU1ZJRDIgPT0gZGF0YS0+dmRk X2NpX2NvbnRyb2wpIHsKKwkJY29uZmlnID0gVlJfU1ZJMl9QTEFORV8yOyAgLyogb25seSBpbiBt ZXJnZWQgbW9kZSAqLworCQl0YWJsZS0+VlJDb25maWcgfD0gKGNvbmZpZzw8VlJDT05GX1ZERENJ X1NISUZUKTsKKwl9IGVsc2UgaWYgKFRPTkdBX1ZPTFRBR0VfQ09OVFJPTF9CWV9HUElPID09IGRh dGEtPnZkZF9jaV9jb250cm9sKSB7CisJCWNvbmZpZyA9IFZSX1NNSU9fUEFUVEVSTl8xOworCQl0 YWJsZS0+VlJDb25maWcgfD0gKGNvbmZpZzw8VlJDT05GX1ZERENJX1NISUZUKTsKKwl9CisKKwkv KiBTZXQgTXZkZCBWb2x0YWdlIENvbnRyb2xsZXIgKi8KKwlpZiAoVE9OR0FfVk9MVEFHRV9DT05U Uk9MX0JZX0dQSU8gPT0gZGF0YS0+bXZkZF9jb250cm9sKSB7CisJCWNvbmZpZyA9IFZSX1NNSU9f UEFUVEVSTl8yOworCQl0YWJsZS0+VlJDb25maWcgfD0gKGNvbmZpZzw8VlJDT05GX01WRERfU0hJ RlQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRvbmdhX2dldF9kZXBlbmRl Y3lfdm9sdF9ieV9jbGsoc3RydWN0IHBwX2h3bWdyICpod21nciwKKwlwaG1fcHB0X3YxX2Nsb2Nr X3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZSAqYWxsb3dlZF9jbG9ja192b2x0YWdlX3RhYmxlLAor CXVpbnQzMl90IGNsb2NrLCBTTVVfVm9sdGFnZUxldmVsICp2b2x0YWdlLCB1aW50MzJfdCAqbXZk ZCkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl0b25nYV9od21nciAqZGF0YSA9ICh0b25nYV9od21n ciAqKShod21nci0+YmFja2VuZCk7CisJc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKnBw dGFibGVfaW5mbyA9IChzdHJ1Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqKShod21nci0+cHB0 YWJsZSk7CisKKwkvKiBjbG9jayAtIHZvbHRhZ2UgZGVwZW5kZW5jeSB0YWJsZSBpcyBlbXB0eSB0 YWJsZSAqLworCWlmIChhbGxvd2VkX2Nsb2NrX3ZvbHRhZ2VfdGFibGUtPmNvdW50ID09IDApCisJ CXJldHVybiAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBhbGxvd2VkX2Nsb2NrX3ZvbHRhZ2VfdGFi bGUtPmNvdW50OyBpKyspIHsKKwkJLyogZmluZCBmaXJzdCBzY2xrIGJpZ2dlciB0aGFuIHJlcXVl c3QgKi8KKwkJaWYgKGFsbG93ZWRfY2xvY2tfdm9sdGFnZV90YWJsZS0+ZW50cmllc1tpXS5jbGsg Pj0gY2xvY2spIHsKKwkJCXZvbHRhZ2UtPlZkZEdmeCA9IHRvbmdhX2dldF92b2x0YWdlX2luZGV4 KHBwdGFibGVfaW5mby0+dmRkZ2Z4X2xvb2t1cF90YWJsZSwKKwkJCQkJCQkJYWxsb3dlZF9jbG9j a192b2x0YWdlX3RhYmxlLT5lbnRyaWVzW2ldLnZkZGdmeCk7CisKKwkJCXZvbHRhZ2UtPlZkZGMg PSB0b25nYV9nZXRfdm9sdGFnZV9pbmRleChwcHRhYmxlX2luZm8tPnZkZGNfbG9va3VwX3RhYmxl LAorCQkJCQkJCQlhbGxvd2VkX2Nsb2NrX3ZvbHRhZ2VfdGFibGUtPmVudHJpZXNbaV0udmRkYyk7 CisKKwkJCWlmIChhbGxvd2VkX2Nsb2NrX3ZvbHRhZ2VfdGFibGUtPmVudHJpZXNbaV0udmRkY2kp IHsKKwkJCQl2b2x0YWdlLT5WZGRjaSA9IHRvbmdhX2dldF92b2x0YWdlX2lkKCZkYXRhLT52ZGRj aV92b2x0YWdlX3RhYmxlLAorCQkJCQkJCQkJYWxsb3dlZF9jbG9ja192b2x0YWdlX3RhYmxlLT5l bnRyaWVzW2ldLnZkZGNpKTsKKwkJCX0gZWxzZSB7CisJCQkJdm9sdGFnZS0+VmRkY2kgPSB0b25n YV9nZXRfdm9sdGFnZV9pZCgmZGF0YS0+dmRkY2lfdm9sdGFnZV90YWJsZSwKKwkJCQkJCQkJCWFs bG93ZWRfY2xvY2tfdm9sdGFnZV90YWJsZS0+ZW50cmllc1tpXS52ZGRjIC0gZGF0YS0+dmRkY192 ZGRjaV9kZWx0YSk7CisJCQl9CisKKwkJCWlmIChhbGxvd2VkX2Nsb2NrX3ZvbHRhZ2VfdGFibGUt PmVudHJpZXNbaV0ubXZkZCkgeworCQkJCSptdmRkID0gKHVpbnQzMl90KSBhbGxvd2VkX2Nsb2Nr X3ZvbHRhZ2VfdGFibGUtPmVudHJpZXNbaV0ubXZkZDsKKwkJCX0KKworCQkJdm9sdGFnZS0+UGhh c2VzID0gMTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogc2NsayBpcyBiaWdnZXIgdGhh biBtYXggc2NsayBpbiB0aGUgZGVwZW5kZW5jZSB0YWJsZSAqLworCXZvbHRhZ2UtPlZkZEdmeCA9 IHRvbmdhX2dldF92b2x0YWdlX2luZGV4KHBwdGFibGVfaW5mby0+dmRkZ2Z4X2xvb2t1cF90YWJs ZSwKKwkJYWxsb3dlZF9jbG9ja192b2x0YWdlX3RhYmxlLT5lbnRyaWVzW2ktMV0udmRkZ2Z4KTsK Kwl2b2x0YWdlLT5WZGRjID0gdG9uZ2FfZ2V0X3ZvbHRhZ2VfaW5kZXgocHB0YWJsZV9pbmZvLT52 ZGRjX2xvb2t1cF90YWJsZSwKKwkJYWxsb3dlZF9jbG9ja192b2x0YWdlX3RhYmxlLT5lbnRyaWVz W2ktMV0udmRkYyk7CisKKwlpZiAoYWxsb3dlZF9jbG9ja192b2x0YWdlX3RhYmxlLT5lbnRyaWVz W2ktMV0udmRkY2kpIHsKKwkJdm9sdGFnZS0+VmRkY2kgPSB0b25nYV9nZXRfdm9sdGFnZV9pZCgm ZGF0YS0+dmRkY2lfdm9sdGFnZV90YWJsZSwKKwkJCWFsbG93ZWRfY2xvY2tfdm9sdGFnZV90YWJs ZS0+ZW50cmllc1tpLTFdLnZkZGNpKTsKKwl9CisJaWYgKGFsbG93ZWRfY2xvY2tfdm9sdGFnZV90 YWJsZS0+ZW50cmllc1tpLTFdLm12ZGQpIHsKKwkJKm12ZGQgPSAodWludDMyX3QpIGFsbG93ZWRf Y2xvY2tfdm9sdGFnZV90YWJsZS0+ZW50cmllc1tpLTFdLm12ZGQ7CisJfQorCisJcmV0dXJuIDA7 Cit9CisKKy8qKgorICogQ2FsbCBTTUMgdG8gcmVzZXQgUzAvUzEgdG8gUzEgYW5kIFJlc2V0IFNN SU8gdG8gaW5pdGlhbCB2YWx1ZQorICoKKyAqIEBwYXJhbSAgICBod21nciAgdGhlIGFkZHJlc3Mg b2YgdGhlIHBvd2VycGxheSBoYXJkd2FyZSBtYW5hZ2VyLgorICogQHJldHVybiAgIGFsd2F5cyAw CisgKi8KK2ludCB0b25nYV9yZXNldF90b19kZWZhdWx0KHN0cnVjdCBwcF9od21nciAqaHdtZ3Ip Cit7CisJcmV0dXJuIChzbXVtX3NlbmRfbXNnX3RvX3NtYyhod21nci0+c211bWdyLCBQUFNNQ19N U0dfUmVzZXRUb0RlZmF1bHRzKSA9PSAwKSA/IDAgOiAxOworfQorCitpbnQgdG9uZ2FfcG9wdWxh dGVfbWVtb3J5X3RpbWluZ19wYXJhbWV0ZXJzKAorCQlzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLAor CQl1aW50MzJfdCBlbmdpbmVfY2xvY2ssCisJCXVpbnQzMl90IG1lbW9yeV9jbG9jaywKKwkJc3Ry dWN0IFNNVTcyX0Rpc2NyZXRlX01DQXJiRHJhbVRpbWluZ1RhYmxlRW50cnkgKmFyYl9yZWdzCisJ CSkKK3sKKwl1aW50MzJfdCBkcmFtVGltaW5nOworCXVpbnQzMl90IGRyYW1UaW1pbmcyOworCXVp bnQzMl90IGJ1cnN0VGltZTsKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gYXRvbWN0cmxfc2V0 X2VuZ2luZV9kcmFtX3RpbWluZ3NfcnY3NzAoaHdtZ3IsCisJCQkJZW5naW5lX2Nsb2NrLCBtZW1v cnlfY2xvY2spOworCisJUFBfQVNTRVJUX1dJVEhfQ09ERShyZXN1bHQgPT0gMCwKKwkJIkVycm9y IGNhbGxpbmcgVkJJT1MgdG8gc2V0IERSQU1fVElNSU5HLiIsIHJldHVybiByZXN1bHQpOworCisJ ZHJhbVRpbWluZyAgPSBjZ3NfcmVhZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBtbU1DX0FSQl9E UkFNX1RJTUlORyk7CisJZHJhbVRpbWluZzIgPSBjZ3NfcmVhZF9yZWdpc3Rlcihod21nci0+ZGV2 aWNlLCBtbU1DX0FSQl9EUkFNX1RJTUlORzIpOworCWJ1cnN0VGltZSA9IFBITV9SRUFEX0ZJRUxE KGh3bWdyLT5kZXZpY2UsIE1DX0FSQl9CVVJTVF9USU1FLCBTVEFURTApOworCisJYXJiX3JlZ3Mt Pk1jQXJiRHJhbVRpbWluZyAgPSBQUF9IT1NUX1RPX1NNQ19VTChkcmFtVGltaW5nKTsKKwlhcmJf cmVncy0+TWNBcmJEcmFtVGltaW5nMiA9IFBQX0hPU1RfVE9fU01DX1VMKGRyYW1UaW1pbmcyKTsK KwlhcmJfcmVncy0+TWNBcmJCdXJzdFRpbWUgPSAodWludDhfdClidXJzdFRpbWU7CisKKwlyZXR1 cm4gMDsKK30KKworLyoqCisgKiBTZXR1cCBwYXJhbWV0ZXJzIGZvciB0aGUgTUMgQVJCLgorICoK KyAqIEBwYXJhbSAgICBod21nciAgdGhlIGFkZHJlc3Mgb2YgdGhlIHBvd2VycGxheSBoYXJkd2Fy ZSBtYW5hZ2VyLgorICogQHJldHVybiAgIGFsd2F5cyAwCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRv IGJlIGNhbGxlZCBmcm9tIHRoZSBTZXRQb3dlclN0YXRlIHRhYmxlLgorICovCitpbnQgdG9uZ2Ff cHJvZ3JhbV9tZW1vcnlfdGltaW5nX3BhcmFtZXRlcnMoc3RydWN0IHBwX2h3bWdyICpod21ncikK K3sKKwl0b25nYV9od21nciAqZGF0YSA9ICh0b25nYV9od21nciAqKShod21nci0+YmFja2VuZCk7 CisJaW50IHJlc3VsdCA9IDA7CisJU01VNzJfRGlzY3JldGVfTUNBcmJEcmFtVGltaW5nVGFibGUg IGFyYl9yZWdzOworCXVpbnQzMl90IGksIGo7CisKKwltZW1zZXQoJmFyYl9yZWdzLCAweDAwLCBz aXplb2YoU01VNzJfRGlzY3JldGVfTUNBcmJEcmFtVGltaW5nVGFibGUpKTsKKworCWZvciAoaSA9 IDA7IGkgPCBkYXRhLT5kcG1fdGFibGUuc2Nsa190YWJsZS5jb3VudDsgaSsrKSB7CisJCWZvciAo aiA9IDA7IGogPCBkYXRhLT5kcG1fdGFibGUubWNsa190YWJsZS5jb3VudDsgaisrKSB7CisJCQly ZXN1bHQgPSB0b25nYV9wb3B1bGF0ZV9tZW1vcnlfdGltaW5nX3BhcmFtZXRlcnMKKwkJCQkoaHdt Z3IsIGRhdGEtPmRwbV90YWJsZS5zY2xrX3RhYmxlLmRwbV9sZXZlbHNbaV0udmFsdWUsCisJCQkJ IGRhdGEtPmRwbV90YWJsZS5tY2xrX3RhYmxlLmRwbV9sZXZlbHNbal0udmFsdWUsCisJCQkJICZh cmJfcmVncy5lbnRyaWVzW2ldW2pdKTsKKworCQkJaWYgKDAgIT0gcmVzdWx0KSB7CisJCQkJYnJl YWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoMCA9PSByZXN1bHQpIHsKKwkJcmVzdWx0ID0gdG9u Z2FfY29weV9ieXRlc190b19zbWMoCisJCQkJaHdtZ3ItPnNtdW1nciwKKwkJCQlkYXRhLT5hcmJf dGFibGVfc3RhcnQsCisJCQkJKHVpbnQ4X3QgKikmYXJiX3JlZ3MsCisJCQkJc2l6ZW9mKFNNVTcy X0Rpc2NyZXRlX01DQXJiRHJhbVRpbWluZ1RhYmxlKSwKKwkJCQlkYXRhLT5zcmFtX2VuZAorCQkJ CSk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCB0b25nYV9wb3B1bGF0 ZV9zbWNfbGlua19sZXZlbChzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLCBTTVU3Ml9EaXNjcmV0ZV9E cG1UYWJsZSAqdGFibGUpCit7CisJdG9uZ2FfaHdtZ3IgKmRhdGEgPSAodG9uZ2FfaHdtZ3IgKiko aHdtZ3ItPmJhY2tlbmQpOworCXN0cnVjdCB0b25nYV9kcG1fdGFibGUgKmRwbV90YWJsZSA9ICZk YXRhLT5kcG1fdGFibGU7CisJdWludDMyX3QgaTsKKworCS8qIEluZGV4IChkcG1fdGFibGUtPnBj aWVfc3BlZWRfdGFibGUuY291bnQpIGlzIHJlc2VydmVkIGZvciBQQ0lFIGJvb3QgbGV2ZWwuICov CisJZm9yIChpID0gMDsgaSA8PSBkcG1fdGFibGUtPnBjaWVfc3BlZWRfdGFibGUuY291bnQ7IGkr KykgeworCQl0YWJsZS0+TGlua0xldmVsW2ldLlBjaWVHZW5TcGVlZCAgPQorCQkJKHVpbnQ4X3Qp ZHBtX3RhYmxlLT5wY2llX3NwZWVkX3RhYmxlLmRwbV9sZXZlbHNbaV0udmFsdWU7CisJCXRhYmxl LT5MaW5rTGV2ZWxbaV0uUGNpZUxhbmVDb3VudCA9CisJCQkodWludDhfdCllbmNvZGVfcGNpZV9s YW5lX3dpZHRoKGRwbV90YWJsZS0+cGNpZV9zcGVlZF90YWJsZS5kcG1fbGV2ZWxzW2ldLnBhcmFt MSk7CisJCXRhYmxlLT5MaW5rTGV2ZWxbaV0uRW5hYmxlZEZvckFjdGl2aXR5ID0KKwkJCTE7CisJ CXRhYmxlLT5MaW5rTGV2ZWxbaV0uU1BDID0KKwkJCSh1aW50OF90KShkYXRhLT5wY2llX3NwY19j YXAgJiAweGZmKTsKKwkJdGFibGUtPkxpbmtMZXZlbFtpXS5Eb3duVGhyZXNob2xkID0KKwkJCVBQ X0hPU1RfVE9fU01DX1VMKDUpOworCQl0YWJsZS0+TGlua0xldmVsW2ldLlVwVGhyZXNob2xkID0K KwkJCVBQX0hPU1RfVE9fU01DX1VMKDMwKTsKKwl9CisKKwlkYXRhLT5zbWNfc3RhdGVfdGFibGUu TGlua0xldmVsQ291bnQgPQorCQkodWludDhfdClkcG1fdGFibGUtPnBjaWVfc3BlZWRfdGFibGUu Y291bnQ7CisJZGF0YS0+ZHBtX2xldmVsX2VuYWJsZV9tYXNrLnBjaWVfZHBtX2VuYWJsZV9tYXNr ID0KKwkJdG9uZ2FfZ2V0X2RwbV9sZXZlbF9lbmFibGVfbWFza192YWx1ZSgmZHBtX3RhYmxlLT5w Y2llX3NwZWVkX3RhYmxlKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdG9uZ2Ff cG9wdWxhdGVfc21jX3ZjZV9sZXZlbChzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLAorCQlTTVU3Ml9E aXNjcmV0ZV9EcG1UYWJsZSAqdGFibGUpCit7CisJaW50IHJlc3VsdCA9IDA7CisKKwl1aW50OF90 IGNvdW50OworCXBwX2F0b21jdHJsX2Nsb2NrX2RpdmlkZXJzX3ZpIGRpdmlkZXJzOworCXRvbmdh X2h3bWdyICpkYXRhID0gKHRvbmdhX2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKwlzdHJ1Y3Qg cGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqcHB0YWJsZV9pbmZvID0gKHN0cnVjdCBwaG1fcHB0X3Yx X2luZm9ybWF0aW9uICopKGh3bWdyLT5wcHRhYmxlKTsKKwlwaG1fcHB0X3YxX21tX2Nsb2NrX3Zv bHRhZ2VfZGVwZW5kZW5jeV90YWJsZSAqbW1fdGFibGUgPSBwcHRhYmxlX2luZm8tPm1tX2RlcF90 YWJsZTsKKworCXRhYmxlLT5WY2VMZXZlbENvdW50ID0gKHVpbnQ4X3QpIChtbV90YWJsZS0+Y291 bnQpOworCXRhYmxlLT5WY2VCb290TGV2ZWwgPSAwOworCisJZm9yIChjb3VudCA9IDA7IGNvdW50 IDwgdGFibGUtPlZjZUxldmVsQ291bnQ7IGNvdW50KyspIHsKKwkJdGFibGUtPlZjZUxldmVsW2Nv dW50XS5GcmVxdWVuY3kgPQorCQkJbW1fdGFibGUtPmVudHJpZXNbY291bnRdLmVjbGs7CisJCXRh YmxlLT5WY2VMZXZlbFtjb3VudF0uTWluVm9sdGFnZS5WZGRjID0KKwkJCXRvbmdhX2dldF92b2x0 YWdlX2luZGV4KHBwdGFibGVfaW5mby0+dmRkY19sb29rdXBfdGFibGUsCisJCQkJbW1fdGFibGUt PmVudHJpZXNbY291bnRdLnZkZGMpOworCQl0YWJsZS0+VmNlTGV2ZWxbY291bnRdLk1pblZvbHRh Z2UuVmRkR2Z4ID0KKwkJCShkYXRhLT52ZGRfZ2Z4X2NvbnRyb2wgPT0gVE9OR0FfVk9MVEFHRV9D T05UUk9MX0JZX1NWSUQyKSA/CisJCQl0b25nYV9nZXRfdm9sdGFnZV9pbmRleChwcHRhYmxlX2lu Zm8tPnZkZGdmeF9sb29rdXBfdGFibGUsCisJCQkJbW1fdGFibGUtPmVudHJpZXNbY291bnRdLnZk ZGdmeCkgOiAwOworCQl0YWJsZS0+VmNlTGV2ZWxbY291bnRdLk1pblZvbHRhZ2UuVmRkY2kgPQor CQkJdG9uZ2FfZ2V0X3ZvbHRhZ2VfaWQoJmRhdGEtPnZkZGNpX3ZvbHRhZ2VfdGFibGUsCisJCQkJ bW1fdGFibGUtPmVudHJpZXNbY291bnRdLnZkZGMgLSBkYXRhLT52ZGRjX3ZkZGNpX2RlbHRhKTsK KwkJdGFibGUtPlZjZUxldmVsW2NvdW50XS5NaW5Wb2x0YWdlLlBoYXNlcyA9IDE7CisKKwkJLyog cmV0cmlldmUgZGl2aWRlciB2YWx1ZSBmb3IgVkJJT1MgKi8KKwkJcmVzdWx0ID0gYXRvbWN0cmxf Z2V0X2Rmc19wbGxfZGl2aWRlcnNfdmkoaHdtZ3IsCisJCQkJCXRhYmxlLT5WY2VMZXZlbFtjb3Vu dF0uRnJlcXVlbmN5LCAmZGl2aWRlcnMpOworCQlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09IHJl c3VsdCksCisJCQkJImNhbiBub3QgZmluZCBkaXZpZGUgaWQgZm9yIFZDRSBlbmdpbmUgY2xvY2si LCByZXR1cm4gcmVzdWx0KTsKKworCQl0YWJsZS0+VmNlTGV2ZWxbY291bnRdLkRpdmlkZXIgICAg PSAodWludDhfdClkaXZpZGVycy5wbGxfcG9zdF9kaXZpZGVyOworCisJCUNPTlZFUlRfRlJPTV9I T1NUX1RPX1NNQ19VTCh0YWJsZS0+VmNlTGV2ZWxbY291bnRdLkZyZXF1ZW5jeSk7CisJfQorCisJ cmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCB0b25nYV9wb3B1bGF0ZV9zbWNfYWNwX2xl dmVsKHN0cnVjdCBwcF9od21nciAqaHdtZ3IsCisJCVNNVTcyX0Rpc2NyZXRlX0RwbVRhYmxlICp0 YWJsZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwl1aW50OF90IGNvdW50OworCXBwX2F0b21jdHJs X2Nsb2NrX2RpdmlkZXJzX3ZpIGRpdmlkZXJzOworCXRvbmdhX2h3bWdyICpkYXRhID0gKHRvbmdh X2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKwlzdHJ1Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlv biAqcHB0YWJsZV9pbmZvID0gKHN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICopKGh3bWdy LT5wcHRhYmxlKTsKKwlwaG1fcHB0X3YxX21tX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJs ZSAqbW1fdGFibGUgPSBwcHRhYmxlX2luZm8tPm1tX2RlcF90YWJsZTsKKworCXRhYmxlLT5BY3BM ZXZlbENvdW50ID0gKHVpbnQ4X3QpIChtbV90YWJsZS0+Y291bnQpOworCXRhYmxlLT5BY3BCb290 TGV2ZWwgPSAwOworCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgdGFibGUtPkFjcExldmVsQ291 bnQ7IGNvdW50KyspIHsKKwkJdGFibGUtPkFjcExldmVsW2NvdW50XS5GcmVxdWVuY3kgPQorCQkJ cHB0YWJsZV9pbmZvLT5tbV9kZXBfdGFibGUtPmVudHJpZXNbY291bnRdLmFjbGs7CisJCXRhYmxl LT5BY3BMZXZlbFtjb3VudF0uTWluVm9sdGFnZS5WZGRjID0KKwkJCXRvbmdhX2dldF92b2x0YWdl X2luZGV4KHBwdGFibGVfaW5mby0+dmRkY19sb29rdXBfdGFibGUsCisJCQltbV90YWJsZS0+ZW50 cmllc1tjb3VudF0udmRkYyk7CisJCXRhYmxlLT5BY3BMZXZlbFtjb3VudF0uTWluVm9sdGFnZS5W ZGRHZnggPQorCQkJKGRhdGEtPnZkZF9nZnhfY29udHJvbCA9PSBUT05HQV9WT0xUQUdFX0NPTlRS T0xfQllfU1ZJRDIpID8KKwkJCXRvbmdhX2dldF92b2x0YWdlX2luZGV4KHBwdGFibGVfaW5mby0+ dmRkZ2Z4X2xvb2t1cF90YWJsZSwKKwkJCQltbV90YWJsZS0+ZW50cmllc1tjb3VudF0udmRkZ2Z4 KSA6IDA7CisJCXRhYmxlLT5BY3BMZXZlbFtjb3VudF0uTWluVm9sdGFnZS5WZGRjaSA9CisJCQl0 b25nYV9nZXRfdm9sdGFnZV9pZCgmZGF0YS0+dmRkY2lfdm9sdGFnZV90YWJsZSwKKwkJCQltbV90 YWJsZS0+ZW50cmllc1tjb3VudF0udmRkYyAtIGRhdGEtPnZkZGNfdmRkY2lfZGVsdGEpOworCQl0 YWJsZS0+QWNwTGV2ZWxbY291bnRdLk1pblZvbHRhZ2UuUGhhc2VzID0gMTsKKworCQkvKiByZXRy aWV2ZSBkaXZpZGVyIHZhbHVlIGZvciBWQklPUyAqLworCQlyZXN1bHQgPSBhdG9tY3RybF9nZXRf ZGZzX3BsbF9kaXZpZGVyc192aShod21nciwKKwkJCXRhYmxlLT5BY3BMZXZlbFtjb3VudF0uRnJl cXVlbmN5LCAmZGl2aWRlcnMpOworCQlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09IHJlc3VsdCks CisJCQkiY2FuIG5vdCBmaW5kIGRpdmlkZSBpZCBmb3IgZW5naW5lIGNsb2NrIiwgcmV0dXJuIHJl c3VsdCk7CisKKwkJdGFibGUtPkFjcExldmVsW2NvdW50XS5EaXZpZGVyID0gKHVpbnQ4X3QpZGl2 aWRlcnMucGxsX3Bvc3RfZGl2aWRlcjsKKworCQlDT05WRVJUX0ZST01fSE9TVF9UT19TTUNfVUwo dGFibGUtPkFjcExldmVsW2NvdW50XS5GcmVxdWVuY3kpOworCX0KKworCXJldHVybiByZXN1bHQ7 Cit9CisKK3N0YXRpYyBpbnQgdG9uZ2FfcG9wdWxhdGVfc21jX3NhbXVfbGV2ZWwoc3RydWN0IHBw X2h3bWdyICpod21nciwKKwlTTVU3Ml9EaXNjcmV0ZV9EcG1UYWJsZSAqdGFibGUpCit7CisJaW50 IHJlc3VsdCA9IDA7CisJdWludDhfdCBjb3VudDsKKwlwcF9hdG9tY3RybF9jbG9ja19kaXZpZGVy c192aSBkaXZpZGVyczsKKwl0b25nYV9od21nciAqZGF0YSA9ICh0b25nYV9od21nciAqKShod21n ci0+YmFja2VuZCk7CisJc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKnBwdGFibGVfaW5m byA9IChzdHJ1Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqKShod21nci0+cHB0YWJsZSk7CisJ cGhtX3BwdF92MV9tbV9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUgKm1tX3RhYmxlID0g cHB0YWJsZV9pbmZvLT5tbV9kZXBfdGFibGU7CisKKwl0YWJsZS0+U2FtdUJvb3RMZXZlbCA9IDA7 CisJdGFibGUtPlNhbXVMZXZlbENvdW50ID0gKHVpbnQ4X3QpIChtbV90YWJsZS0+Y291bnQpOwor CisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgdGFibGUtPlNhbXVMZXZlbENvdW50OyBjb3VudCsr KSB7CisJCS8qIG5vdCBzdXJlIHdoZXRoZXIgd2UgbmVlZCBldmNsayBvciBub3QgKi8KKwkJdGFi bGUtPlNhbXVMZXZlbFtjb3VudF0uRnJlcXVlbmN5ID0KKwkJCXBwdGFibGVfaW5mby0+bW1fZGVw X3RhYmxlLT5lbnRyaWVzW2NvdW50XS5zYW1jbG9jazsKKwkJdGFibGUtPlNhbXVMZXZlbFtjb3Vu dF0uTWluVm9sdGFnZS5WZGRjID0KKwkJCXRvbmdhX2dldF92b2x0YWdlX2luZGV4KHBwdGFibGVf aW5mby0+dmRkY19sb29rdXBfdGFibGUsCisJCQkJbW1fdGFibGUtPmVudHJpZXNbY291bnRdLnZk ZGMpOworCQl0YWJsZS0+U2FtdUxldmVsW2NvdW50XS5NaW5Wb2x0YWdlLlZkZEdmeCA9CisJCQko ZGF0YS0+dmRkX2dmeF9jb250cm9sID09IFRPTkdBX1ZPTFRBR0VfQ09OVFJPTF9CWV9TVklEMikg PworCQkJdG9uZ2FfZ2V0X3ZvbHRhZ2VfaW5kZXgocHB0YWJsZV9pbmZvLT52ZGRnZnhfbG9va3Vw X3RhYmxlLAorCQkJCW1tX3RhYmxlLT5lbnRyaWVzW2NvdW50XS52ZGRnZngpIDogMDsKKwkJdGFi bGUtPlNhbXVMZXZlbFtjb3VudF0uTWluVm9sdGFnZS5WZGRjaSA9CisJCQl0b25nYV9nZXRfdm9s dGFnZV9pZCgmZGF0YS0+dmRkY2lfdm9sdGFnZV90YWJsZSwKKwkJCQltbV90YWJsZS0+ZW50cmll c1tjb3VudF0udmRkYyAtIGRhdGEtPnZkZGNfdmRkY2lfZGVsdGEpOworCQl0YWJsZS0+U2FtdUxl dmVsW2NvdW50XS5NaW5Wb2x0YWdlLlBoYXNlcyA9IDE7CisKKwkJLyogcmV0cmlldmUgZGl2aWRl ciB2YWx1ZSBmb3IgVkJJT1MgKi8KKwkJcmVzdWx0ID0gYXRvbWN0cmxfZ2V0X2Rmc19wbGxfZGl2 aWRlcnNfdmkoaHdtZ3IsCisJCQkJCXRhYmxlLT5TYW11TGV2ZWxbY291bnRdLkZyZXF1ZW5jeSwg JmRpdmlkZXJzKTsKKwkJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSByZXN1bHQpLAorCQkJImNh biBub3QgZmluZCBkaXZpZGUgaWQgZm9yIHNhbXUgY2xvY2siLCByZXR1cm4gcmVzdWx0KTsKKwor CQl0YWJsZS0+U2FtdUxldmVsW2NvdW50XS5EaXZpZGVyICAgICA9ICh1aW50OF90KWRpdmlkZXJz LnBsbF9wb3N0X2RpdmlkZXI7CisKKwkJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VMKHRhYmxl LT5TYW11TGV2ZWxbY291bnRdLkZyZXF1ZW5jeSk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30K KworLyoqCisgKiBQb3B1bGF0ZXMgdGhlIFNNQyBNQ0xLIHN0cnVjdHVyZSB1c2luZyB0aGUgcHJv dmlkZWQgbWVtb3J5IGNsb2NrCisgKgorICogQHBhcmFtICAgIGh3bWdyICAgICAgdGhlIGFkZHJl c3Mgb2YgdGhlIGhhcmR3YXJlIG1hbmFnZXIKKyAqIEBwYXJhbSAgICBtZW1vcnlfY2xvY2sgdGhl IG1lbW9yeSBjbG9jayB0byB1c2UgdG8gcG9wdWxhdGUgdGhlIHN0cnVjdHVyZQorICogQHBhcmFt ICAgIHNjbGsgICAgICAgIHRoZSBTTUMgU0NMSyBzdHJ1Y3R1cmUgdG8gYmUgcG9wdWxhdGVkCisg Ki8KK3N0YXRpYyBpbnQgdG9uZ2FfY2FsY3VsYXRlX21jbGtfcGFyYW1zKAorCQlzdHJ1Y3QgcHBf aHdtZ3IgKmh3bWdyLAorCQl1aW50MzJfdCBtZW1vcnlfY2xvY2ssCisJCVNNVTcyX0Rpc2NyZXRl X01lbW9yeUxldmVsICptY2xrLAorCQlib29sIHN0cm9iZV9tb2RlLAorCQlib29sIGRsbFN0YXRl T24KKwkJKQoreworCWNvbnN0IHRvbmdhX2h3bWdyICpkYXRhID0gKHRvbmdhX2h3bWdyICopKGh3 bWdyLT5iYWNrZW5kKTsKKwl1aW50MzJfdCAgZGxsX2NudGwgPSBkYXRhLT5jbG9ja19yZWdpc3Rl cnMudkRMTF9DTlRMOworCXVpbnQzMl90ICBtY2xrX3B3cm1ndF9jbnRsID0gZGF0YS0+Y2xvY2tf cmVnaXN0ZXJzLnZNQ0xLX1BXUk1HVF9DTlRMOworCXVpbnQzMl90ICBtcGxsX2FkX2Z1bmNfY250 bCA9IGRhdGEtPmNsb2NrX3JlZ2lzdGVycy52TVBMTF9BRF9GVU5DX0NOVEw7CisJdWludDMyX3Qg IG1wbGxfZHFfZnVuY19jbnRsID0gZGF0YS0+Y2xvY2tfcmVnaXN0ZXJzLnZNUExMX0RRX0ZVTkNf Q05UTDsKKwl1aW50MzJfdCAgbXBsbF9mdW5jX2NudGwgPSBkYXRhLT5jbG9ja19yZWdpc3RlcnMu dk1QTExfRlVOQ19DTlRMOworCXVpbnQzMl90ICBtcGxsX2Z1bmNfY250bF8xID0gZGF0YS0+Y2xv Y2tfcmVnaXN0ZXJzLnZNUExMX0ZVTkNfQ05UTF8xOworCXVpbnQzMl90ICBtcGxsX2Z1bmNfY250 bF8yID0gZGF0YS0+Y2xvY2tfcmVnaXN0ZXJzLnZNUExMX0ZVTkNfQ05UTF8yOworCXVpbnQzMl90 ICBtcGxsX3NzMSA9IGRhdGEtPmNsb2NrX3JlZ2lzdGVycy52TVBMTF9TUzE7CisJdWludDMyX3Qg IG1wbGxfc3MyID0gZGF0YS0+Y2xvY2tfcmVnaXN0ZXJzLnZNUExMX1NTMjsKKworCXBwX2F0b21j dHJsX21lbW9yeV9jbG9ja19wYXJhbSBtcGxsX3BhcmFtOworCWludCByZXN1bHQ7CisKKwlyZXN1 bHQgPSBhdG9tY3RybF9nZXRfbWVtb3J5X3BsbF9kaXZpZGVyc19zaShod21nciwKKwkJCQltZW1v cnlfY2xvY2ssICZtcGxsX3BhcmFtLCBzdHJvYmVfbW9kZSk7CisJUFBfQVNTRVJUX1dJVEhfQ09E RSgwID09IHJlc3VsdCwKKwkJIkVycm9yIHJldHJpZXZpbmcgTWVtb3J5IENsb2NrIFBhcmFtZXRl cnMgZnJvbSBWQklPUy4iLCByZXR1cm4gcmVzdWx0KTsKKworCS8qIE1QTExfRlVOQ19DTlRMIHNl dHVwKi8KKwltcGxsX2Z1bmNfY250bCAgICA9IFBITV9TRVRfRklFTEQobXBsbF9mdW5jX2NudGws IE1QTExfRlVOQ19DTlRMLCBCV0NUUkwsIG1wbGxfcGFyYW0uYndfY3RybCk7CisKKwkvKiBNUExM X0ZVTkNfQ05UTF8xIHNldHVwKi8KKwltcGxsX2Z1bmNfY250bF8xICA9IFBITV9TRVRfRklFTEQo bXBsbF9mdW5jX2NudGxfMSwKKwkJCQkJCQlNUExMX0ZVTkNfQ05UTF8xLCBDTEtGLCBtcGxsX3Bh cmFtLm1wbGxfZmJfZGl2aWRlci5jbF9rZik7CisJbXBsbF9mdW5jX2NudGxfMSAgPSBQSE1fU0VU X0ZJRUxEKG1wbGxfZnVuY19jbnRsXzEsCisJCQkJCQkJTVBMTF9GVU5DX0NOVExfMSwgQ0xLRlJB QywgbXBsbF9wYXJhbS5tcGxsX2ZiX2RpdmlkZXIuY2xrX2ZyYWMpOworCW1wbGxfZnVuY19jbnRs XzEgID0gUEhNX1NFVF9GSUVMRChtcGxsX2Z1bmNfY250bF8xLAorCQkJCQkJCU1QTExfRlVOQ19D TlRMXzEsIFZDT19NT0RFLCBtcGxsX3BhcmFtLnZjb19tb2RlKTsKKworCS8qIE1QTExfQURfRlVO Q19DTlRMIHNldHVwKi8KKwltcGxsX2FkX2Z1bmNfY250bCA9IFBITV9TRVRfRklFTEQobXBsbF9h ZF9mdW5jX2NudGwsCisJCQkJCQkJTVBMTF9BRF9GVU5DX0NOVEwsIFlDTEtfUE9TVF9ESVYsIG1w bGxfcGFyYW0ubXBsbF9wb3N0X2RpdmlkZXIpOworCisJaWYgKGRhdGEtPmlzX21lbW9yeV9HRERS NSkgeworCQkvKiBNUExMX0RRX0ZVTkNfQ05UTCBzZXR1cCovCisJCW1wbGxfZHFfZnVuY19jbnRs ICA9IFBITV9TRVRfRklFTEQobXBsbF9kcV9mdW5jX2NudGwsCisJCQkJCQkJCU1QTExfRFFfRlVO Q19DTlRMLCBZQ0xLX1NFTCwgbXBsbF9wYXJhbS55Y2xrX3NlbCk7CisJCW1wbGxfZHFfZnVuY19j bnRsICA9IFBITV9TRVRfRklFTEQobXBsbF9kcV9mdW5jX2NudGwsCisJCQkJCQkJCU1QTExfRFFf RlVOQ19DTlRMLCBZQ0xLX1BPU1RfRElWLCBtcGxsX3BhcmFtLm1wbGxfcG9zdF9kaXZpZGVyKTsK Kwl9CisKKwlpZiAocGhtX2NhcF9lbmFibGVkKGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLnBs YXRmb3JtQ2FwcywKKwkJCVBITV9QbGF0Zm9ybUNhcHNfTWVtb3J5U3ByZWFkU3BlY3RydW1TdXBw b3J0KSkgeworCQkvKgorCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJ CSBGcmVmID0gUmVmZXJlbmNlIEZyZXF1ZW5jeQorCQkgTkYgPSBGZWVkYmFjayBkaXZpZGVyIHJh dGlvCisJCSBOUiA9IFJlZmVyZW5jZSBkaXZpZGVyIHJhdGlvCisJCSBGbm9tID0gTm9taW5hbCBW Q08gb3V0cHV0IGZyZXF1ZW5jeSA9IEZyZWYgKiBORiAvIE5SCisJCSBGcyA9IFNwcmVhZGluZyBS YXRlCisJCSBEID0gUGVyY2VudGFnZSBkb3duLXNwcmVhZCAvIDIKKwkJIEZpbnQgPSBSZWZlcmVu Y2UgaW5wdXQgZnJlcXVlbmN5IHRvIFBGRCA9IEZyZWYgLyBOUgorCQkgTlMgPSBTcHJlYWRpbmcg cmF0ZSBkaXZpZGVyIHJhdGlvID0gaW50KEZpbnQgLyAoMiAqIEZzKSkKKwkJIENMS1MgPSBOUyAt IDEgPSBJU1NfU1RFUF9OVU1bMTE6MF0KKwkJIE5WID0gRCAqIEZzIC8gRm5vbSAqIDQgKiAoKEZu b20vRnJlZiAqIE5SKSBeIDIpCisJCSBDTEtWID0gNjU1MzYgKiBOViA9IElTU19TVEVQX1NJWkVb MjU6MF0KKwkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJICovCisJ CXBwX2F0b21jdHJsX2ludGVybmFsX3NzX2luZm8gc3NfaW5mbzsKKwkJdWludDMyX3QgZnJlcV9u b207CisJCXVpbnQzMl90IHRtcDsKKwkJdWludDMyX3QgcmVmZXJlbmNlX2Nsb2NrID0gYXRvbWN0 cmxfZ2V0X21wbGxfcmVmZXJlbmNlX2Nsb2NrKGh3bWdyKTsKKworCQkvKiBmb3IgR0REUjUgZm9y IGFsbCBtb2RlcyBhbmQgRERSMyAqLworCQlpZiAoMSA9PSBtcGxsX3BhcmFtLnFkcikKKwkJCWZy ZXFfbm9tID0gbWVtb3J5X2Nsb2NrICogNCAqICgxIDw8IG1wbGxfcGFyYW0ubXBsbF9wb3N0X2Rp dmlkZXIpOworCQllbHNlCisJCQlmcmVxX25vbSA9IG1lbW9yeV9jbG9jayAqIDIgKiAoMSA8PCBt cGxsX3BhcmFtLm1wbGxfcG9zdF9kaXZpZGVyKTsKKworCQkvKiB0bXAgPSAoZnJlcV9ub20gLyBy ZWZlcmVuY2VfY2xvY2sgKiByZWZlcmVuY2VfZGl2aWRlcikgXiAyICBOb3RlOiBTLkkuIHJlZmVy ZW5jZV9kaXZpZGVyID0gMSovCisJCXRtcCA9IChmcmVxX25vbSAvIHJlZmVyZW5jZV9jbG9jayk7 CisJCXRtcCA9IHRtcCAqIHRtcDsKKworCQlpZiAoMCA9PSBhdG9tY3RybF9nZXRfbWVtb3J5X2Ns b2NrX3NwcmVhZF9zcGVjdHJ1bShod21nciwgZnJlcV9ub20sICZzc19pbmZvKSkgeworCQkJLyog c3NfaW5mby5zcGVlZF9zcGVjdHJ1bV9wZXJjZW50YWdlIC0tIGluIHVuaXQgb2YgMC4wMSUgKi8K KwkJCS8qIHNzLkluZm8uc3BlZWRfc3BlY3RydW1fcmF0ZSAtLSBpbiB1bml0IG9mIGtoeiAqLwor CQkJLyogQ0xLUyA9IHJlZmVyZW5jZV9jbG9jayAvICgyICogc3BlZWRfc3BlY3RydW1fcmF0ZSAq IHJlZmVyZW5jZV9kaXZpZGVyKSAqIDEwICovCisJCQkvKiAgICAgPSByZWZlcmVuY2VfY2xvY2sg KiA1IC8gc3BlZWRfc3BlY3RydW1fcmF0ZSAqLworCQkJdWludDMyX3QgY2xrcyA9IHJlZmVyZW5j ZV9jbG9jayAqIDUgLyBzc19pbmZvLnNwZWVkX3NwZWN0cnVtX3JhdGU7CisKKwkJCS8qIENMS1Yg PSA2NTUzNiAqIHNwZWVkX3NwZWN0cnVtX3BlcmNlbnRhZ2UgLyAyICogc3ByZWFkU3BlY3J1bVJh dGUgLyBmcmVxX25vbSAqIDQgLyAxMDAwMDAgKiAoKGZyZXFfbm9tIC8gcmVmZXJlbmNlX2Nsb2Nr KSBeIDIpICovCisJCQkvKiAgICAgPSAxMzEgKiBzcGVlZF9zcGVjdHJ1bV9wZXJjZW50YWdlICog c3BlZWRfc3BlY3RydW1fcmF0ZSAvIDEwMCAqICgoZnJlcV9ub20gLyByZWZlcmVuY2VfY2xvY2sp IF4gMikgLyBmcmVxX25vbSAqLworCQkJdWludDMyX3QgY2xrdiA9CisJCQkJKHVpbnQzMl90KSgo KCgxMzEgKiBzc19pbmZvLnNwZWVkX3NwZWN0cnVtX3BlcmNlbnRhZ2UgKgorCQkJCQkJCXNzX2lu Zm8uc3BlZWRfc3BlY3RydW1fcmF0ZSkgLyAxMDApICogdG1wKSAvIGZyZXFfbm9tKTsKKworCQkJ bXBsbF9zczEgPSBQSE1fU0VUX0ZJRUxEKG1wbGxfc3MxLCBNUExMX1NTMSwgQ0xLViwgY2xrdik7 CisJCQltcGxsX3NzMiA9IFBITV9TRVRfRklFTEQobXBsbF9zczIsIE1QTExfU1MyLCBDTEtTLCBj bGtzKTsKKwkJfQorCX0KKworCS8qIE1DTEtfUFdSTUdUX0NOVEwgc2V0dXAgKi8KKwltY2xrX3B3 cm1ndF9jbnRsID0gUEhNX1NFVF9GSUVMRChtY2xrX3B3cm1ndF9jbnRsLAorCQlNQ0xLX1BXUk1H VF9DTlRMLCBETExfU1BFRUQsIG1wbGxfcGFyYW0uZGxsX3NwZWVkKTsKKwltY2xrX3B3cm1ndF9j bnRsID0gUEhNX1NFVF9GSUVMRChtY2xrX3B3cm1ndF9jbnRsLAorCQlNQ0xLX1BXUk1HVF9DTlRM LCBNUkRDSzBfUEROQiwgZGxsU3RhdGVPbik7CisJbWNsa19wd3JtZ3RfY250bCA9IFBITV9TRVRf RklFTEQobWNsa19wd3JtZ3RfY250bCwKKwkJTUNMS19QV1JNR1RfQ05UTCwgTVJEQ0sxX1BETkIs IGRsbFN0YXRlT24pOworCisKKwkvKiBTYXZlIHRoZSByZXN1bHQgZGF0YSB0byBvdXRwdXB0IG1l bW9yeSBsZXZlbCBzdHJ1Y3R1cmUgKi8KKwltY2xrLT5NY2xrRnJlcXVlbmN5ICAgPSBtZW1vcnlf Y2xvY2s7CisJbWNsay0+TXBsbEZ1bmNDbnRsICAgID0gbXBsbF9mdW5jX2NudGw7CisJbWNsay0+ TXBsbEZ1bmNDbnRsXzEgID0gbXBsbF9mdW5jX2NudGxfMTsKKwltY2xrLT5NcGxsRnVuY0NudGxf MiAgPSBtcGxsX2Z1bmNfY250bF8yOworCW1jbGstPk1wbGxBZEZ1bmNDbnRsICA9IG1wbGxfYWRf ZnVuY19jbnRsOworCW1jbGstPk1wbGxEcUZ1bmNDbnRsICA9IG1wbGxfZHFfZnVuY19jbnRsOwor CW1jbGstPk1jbGtQd3JtZ3RDbnRsICA9IG1jbGtfcHdybWd0X2NudGw7CisJbWNsay0+RGxsQ250 bCAgICAgICAgID0gZGxsX2NudGw7CisJbWNsay0+TXBsbFNzMSAgICAgICAgID0gbXBsbF9zczE7 CisJbWNsay0+TXBsbFNzMiAgICAgICAgID0gbXBsbF9zczI7CisKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIHVpbnQ4X3QgdG9uZ2FfZ2V0X21jbGtfZnJlcXVlbmN5X3JhdGlvKHVpbnQzMl90IG1l bW9yeV9jbG9jaywKKwkJYm9vbCBzdHJvYmVfbW9kZSkKK3sKKwl1aW50OF90IG1jX3BhcmFfaW5k ZXg7CisKKwlpZiAoc3Ryb2JlX21vZGUpIHsKKwkJaWYgKG1lbW9yeV9jbG9jayA8IDEyNTAwKSB7 CisJCQltY19wYXJhX2luZGV4ID0gMHgwMDsKKwkJfSBlbHNlIGlmIChtZW1vcnlfY2xvY2sgPiA0 NzUwMCkgeworCQkJbWNfcGFyYV9pbmRleCA9IDB4MGY7CisJCX0gZWxzZSB7CisJCQltY19wYXJh X2luZGV4ID0gKHVpbnQ4X3QpKChtZW1vcnlfY2xvY2sgLSAxMDAwMCkgLyAyNTAwKTsKKwkJfQor CX0gZWxzZSB7CisJCWlmIChtZW1vcnlfY2xvY2sgPCA2NTAwMCkgeworCQkJbWNfcGFyYV9pbmRl eCA9IDB4MDA7CisJCX0gZWxzZSBpZiAobWVtb3J5X2Nsb2NrID4gMTM1MDAwKSB7CisJCQltY19w YXJhX2luZGV4ID0gMHgwZjsKKwkJfSBlbHNlIHsKKwkJCW1jX3BhcmFfaW5kZXggPSAodWludDhf dCkoKG1lbW9yeV9jbG9jayAtIDYwMDAwKSAvIDUwMDApOworCQl9CisJfQorCisJcmV0dXJuIG1j X3BhcmFfaW5kZXg7Cit9CisKK3N0YXRpYyB1aW50OF90IHRvbmdhX2dldF9kZHIzX21jbGtfZnJl cXVlbmN5X3JhdGlvKHVpbnQzMl90IG1lbW9yeV9jbG9jaykKK3sKKwl1aW50OF90IG1jX3BhcmFf aW5kZXg7CisKKwlpZiAobWVtb3J5X2Nsb2NrIDwgMTAwMDApIHsKKwkJbWNfcGFyYV9pbmRleCA9 IDA7CisJfSBlbHNlIGlmIChtZW1vcnlfY2xvY2sgPj0gODAwMDApIHsKKwkJbWNfcGFyYV9pbmRl eCA9IDB4MGY7CisJfSBlbHNlIHsKKwkJbWNfcGFyYV9pbmRleCA9ICh1aW50OF90KSgobWVtb3J5 X2Nsb2NrIC0gMTAwMDApIC8gNTAwMCArIDEpOworCX0KKworCXJldHVybiBtY19wYXJhX2luZGV4 OworfQorCitzdGF0aWMgaW50IHRvbmdhX3BvcHVsYXRlX3NpbmdsZV9tZW1vcnlfbGV2ZWwoCisJ CXN0cnVjdCBwcF9od21nciAqaHdtZ3IsCisJCXVpbnQzMl90IG1lbW9yeV9jbG9jaywKKwkJU01V NzJfRGlzY3JldGVfTWVtb3J5TGV2ZWwgKm1lbW9yeV9sZXZlbAorCQkpCit7CisJdWludDMyX3Qg bWluTXZkZCA9IDA7CisJdG9uZ2FfaHdtZ3IgKmRhdGEgPSAodG9uZ2FfaHdtZ3IgKikoaHdtZ3It PmJhY2tlbmQpOworCXN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICpwcHRhYmxlX2luZm8g PSAoc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKikoaHdtZ3ItPnBwdGFibGUpOworCWlu dCByZXN1bHQgPSAwOworCWJvb2wgZGxsU3RhdGVPbjsKKwlzdHJ1Y3QgY2dzX2Rpc3BsYXlfaW5m byBpbmZvID0gezB9OworCisKKwlpZiAoTlVMTCAhPSBwcHRhYmxlX2luZm8tPnZkZF9kZXBfb25f bWNsaykgeworCQlyZXN1bHQgPSB0b25nYV9nZXRfZGVwZW5kZWN5X3ZvbHRfYnlfY2xrKGh3bWdy LAorCQkJcHB0YWJsZV9pbmZvLT52ZGRfZGVwX29uX21jbGssIG1lbW9yeV9jbG9jaywgJm1lbW9y eV9sZXZlbC0+TWluVm9sdGFnZSwgJm1pbk12ZGQpOworCQlQUF9BU1NFUlRfV0lUSF9DT0RFKCgw ID09IHJlc3VsdCksCisJCQkiY2FuIG5vdCBmaW5kIE1pblZkZGMgdm9sdGFnZSB2YWx1ZSBmcm9t IG1lbW9yeSBWRERDIHZvbHRhZ2UgZGVwZW5kZW5jeSB0YWJsZSIsIHJldHVybiByZXN1bHQpOwor CX0KKworCWlmIChkYXRhLT5tdmRkX2NvbnRyb2wgPT0gVE9OR0FfVk9MVEFHRV9DT05UUk9MX05P TkUpIHsKKwkJbWVtb3J5X2xldmVsLT5NaW5NdmRkID0gZGF0YS0+dmJpb3NfYm9vdF9zdGF0ZS5t dmRkX2Jvb3R1cF92YWx1ZTsKKwl9IGVsc2UgeworCQltZW1vcnlfbGV2ZWwtPk1pbk12ZGQgPSBt aW5NdmRkOworCX0KKwltZW1vcnlfbGV2ZWwtPkVuYWJsZWRGb3JUaHJvdHRsZSA9IDE7CisJbWVt b3J5X2xldmVsLT5FbmFibGVkRm9yQWN0aXZpdHkgPSAwOworCW1lbW9yeV9sZXZlbC0+VXBIeXN0 ID0gMDsKKwltZW1vcnlfbGV2ZWwtPkRvd25IeXN0ID0gMTAwOworCW1lbW9yeV9sZXZlbC0+Vm9s dGFnZURvd25IeXN0ID0gMDsKKworCS8qIEluZGljYXRlcyBtYXhpbXVtIGFjdGl2aXR5IGxldmVs IGZvciB0aGlzIHBlcmZvcm1hbmNlIGxldmVsLiovCisJbWVtb3J5X2xldmVsLT5BY3Rpdml0eUxl dmVsID0gKHVpbnQxNl90KWRhdGEtPm1jbGtfYWN0aXZpdHlfdGFyZ2V0OworCW1lbW9yeV9sZXZl bC0+U3R1dHRlckVuYWJsZSA9IDA7CisJbWVtb3J5X2xldmVsLT5TdHJvYmVFbmFibGUgPSAwOwor CW1lbW9yeV9sZXZlbC0+RWRjUmVhZEVuYWJsZSA9IDA7CisJbWVtb3J5X2xldmVsLT5FZGNXcml0 ZUVuYWJsZSA9IDA7CisJbWVtb3J5X2xldmVsLT5SdHRFbmFibGUgPSAwOworCisJLyogZGVmYXVs dCBzZXQgdG8gbG93IHdhdGVybWFyay4gSGlnaGVzdCBsZXZlbCB3aWxsIGJlIHNldCB0byBoaWdo IGxhdGVyLiovCisJbWVtb3J5X2xldmVsLT5EaXNwbGF5V2F0ZXJtYXJrID0gUFBTTUNfRElTUExB WV9XQVRFUk1BUktfTE9XOworCisJY2dzX2dldF9hY3RpdmVfZGlzcGxheXNfaW5mbyhod21nci0+ ZGV2aWNlLCAmaW5mbyk7CisJZGF0YS0+ZGlzcGxheV90aW1pbmcubnVtX2V4aXN0aW5nX2Rpc3Bs YXlzID0gaW5mby5kaXNwbGF5X2NvdW50OworCisJaWYgKChkYXRhLT5tY2xrX3N0dXR0ZXJfbW9k ZV90aHJlc2hvbGQgIT0gMCkgJiYKKwkJCShtZW1vcnlfY2xvY2sgPD0gZGF0YS0+bWNsa19zdHV0 dGVyX21vZGVfdGhyZXNob2xkKSAmJgorCQkJKGRhdGEtPmlzX3V2ZF9lbmFibGVkID09IDApCisj aWYgZGVmaW5lZChMSU5VWCkKKwkJCSYmIChQSE1fUkVBRF9GSUVMRChod21nci0+ZGV2aWNlLCBE UEdfUElQRV9TVFVUVEVSX0NPTlRST0wsIFNUVVRURVJfRU5BQkxFKSAmIDB4MSkKKwkJCSYmIChk YXRhLT5kaXNwbGF5X3RpbWluZy5udW1fZXhpc3RpbmdfZGlzcGxheXMgPD0gMikKKwkJCSYmIChk YXRhLT5kaXNwbGF5X3RpbWluZy5udW1fZXhpc3RpbmdfZGlzcGxheXMgIT0gMCkKKyNlbmRpZgor CSkKKwkJbWVtb3J5X2xldmVsLT5TdHV0dGVyRW5hYmxlID0gMTsKKworCS8qIGRlY2lkZSBzdHJv YmUgbW9kZSovCisJbWVtb3J5X2xldmVsLT5TdHJvYmVFbmFibGUgPSAoZGF0YS0+bWNsa19zdHJv YmVfbW9kZV90aHJlc2hvbGQgIT0gMCkgJiYKKwkJKG1lbW9yeV9jbG9jayA8PSBkYXRhLT5tY2xr X3N0cm9iZV9tb2RlX3RocmVzaG9sZCk7CisKKwkvKiBkZWNpZGUgRURDIG1vZGUgYW5kIG1lbW9y eSBjbG9jayByYXRpbyovCisJaWYgKGRhdGEtPmlzX21lbW9yeV9HRERSNSkgeworCQltZW1vcnlf bGV2ZWwtPlN0cm9iZVJhdGlvID0gdG9uZ2FfZ2V0X21jbGtfZnJlcXVlbmN5X3JhdGlvKG1lbW9y eV9jbG9jaywKKwkJCQkJbWVtb3J5X2xldmVsLT5TdHJvYmVFbmFibGUpOworCisJCWlmICgoZGF0 YS0+bWNsa19lZGNfZW5hYmxlX3RocmVzaG9sZCAhPSAwKSAmJgorCQkJCShtZW1vcnlfY2xvY2sg PiBkYXRhLT5tY2xrX2VkY19lbmFibGVfdGhyZXNob2xkKSkgeworCQkJbWVtb3J5X2xldmVsLT5F ZGNSZWFkRW5hYmxlID0gMTsKKwkJfQorCisJCWlmICgoZGF0YS0+bWNsa19lZGNfd3JfZW5hYmxl X3RocmVzaG9sZCAhPSAwKSAmJgorCQkJCShtZW1vcnlfY2xvY2sgPiBkYXRhLT5tY2xrX2VkY193 cl9lbmFibGVfdGhyZXNob2xkKSkgeworCQkJbWVtb3J5X2xldmVsLT5FZGNXcml0ZUVuYWJsZSA9 IDE7CisJCX0KKworCQlpZiAobWVtb3J5X2xldmVsLT5TdHJvYmVFbmFibGUpIHsKKwkJCWlmICh0 b25nYV9nZXRfbWNsa19mcmVxdWVuY3lfcmF0aW8obWVtb3J5X2Nsb2NrLCAxKSA+PQorCQkJCQko KGNnc19yZWFkX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIG1tTUNfU0VRX01JU0M3KSA+PiAxNikg JiAweGYpKSB7CisJCQkJZGxsU3RhdGVPbiA9ICgoY2dzX3JlYWRfcmVnaXN0ZXIoaHdtZ3ItPmRl dmljZSwgbW1NQ19TRVFfTUlTQzUpID4+IDEpICYgMHgxKSA/IDEgOiAwOworCQkJfSBlbHNlIHsK KwkJCQlkbGxTdGF0ZU9uID0gKChjZ3NfcmVhZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBtbU1D X1NFUV9NSVNDNikgPj4gMSkgJiAweDEpID8gMSA6IDA7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJ CWRsbFN0YXRlT24gPSBkYXRhLT5kbGxfZGVmYXVsZV9vbjsKKwkJfQorCX0gZWxzZSB7CisJCW1l bW9yeV9sZXZlbC0+U3Ryb2JlUmF0aW8gPQorCQkJdG9uZ2FfZ2V0X2RkcjNfbWNsa19mcmVxdWVu Y3lfcmF0aW8obWVtb3J5X2Nsb2NrKTsKKwkJZGxsU3RhdGVPbiA9ICgoY2dzX3JlYWRfcmVnaXN0 ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19TRVFfTUlTQzUpID4+IDEpICYgMHgxKSA/IDEgOiAwOwor CX0KKworCXJlc3VsdCA9IHRvbmdhX2NhbGN1bGF0ZV9tY2xrX3BhcmFtcyhod21nciwKKwkJbWVt b3J5X2Nsb2NrLCBtZW1vcnlfbGV2ZWwsIG1lbW9yeV9sZXZlbC0+U3Ryb2JlRW5hYmxlLCBkbGxT dGF0ZU9uKTsKKworCWlmICgwID09IHJlc3VsdCkgeworCQlDT05WRVJUX0ZST01fSE9TVF9UT19T TUNfVUwobWVtb3J5X2xldmVsLT5NaW5NdmRkKTsKKwkJLyogTUNMSyBmcmVxdWVuY3kgaW4gdW5p dHMgb2YgMTBLSHoqLworCQlDT05WRVJUX0ZST01fSE9TVF9UT19TTUNfVUwobWVtb3J5X2xldmVs LT5NY2xrRnJlcXVlbmN5KTsKKwkJLyogSW5kaWNhdGVzIG1heGltdW0gYWN0aXZpdHkgbGV2ZWwg Zm9yIHRoaXMgcGVyZm9ybWFuY2UgbGV2ZWwuKi8KKwkJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01D X1VTKG1lbW9yeV9sZXZlbC0+QWN0aXZpdHlMZXZlbCk7CisJCUNPTlZFUlRfRlJPTV9IT1NUX1RP X1NNQ19VTChtZW1vcnlfbGV2ZWwtPk1wbGxGdW5jQ250bCk7CisJCUNPTlZFUlRfRlJPTV9IT1NU X1RPX1NNQ19VTChtZW1vcnlfbGV2ZWwtPk1wbGxGdW5jQ250bF8xKTsKKwkJQ09OVkVSVF9GUk9N X0hPU1RfVE9fU01DX1VMKG1lbW9yeV9sZXZlbC0+TXBsbEZ1bmNDbnRsXzIpOworCQlDT05WRVJU X0ZST01fSE9TVF9UT19TTUNfVUwobWVtb3J5X2xldmVsLT5NcGxsQWRGdW5jQ250bCk7CisJCUNP TlZFUlRfRlJPTV9IT1NUX1RPX1NNQ19VTChtZW1vcnlfbGV2ZWwtPk1wbGxEcUZ1bmNDbnRsKTsK KwkJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VMKG1lbW9yeV9sZXZlbC0+TWNsa1B3cm1ndENu dGwpOworCQlDT05WRVJUX0ZST01fSE9TVF9UT19TTUNfVUwobWVtb3J5X2xldmVsLT5EbGxDbnRs KTsKKwkJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VMKG1lbW9yeV9sZXZlbC0+TXBsbFNzMSk7 CisJCUNPTlZFUlRfRlJPTV9IT1NUX1RPX1NNQ19VTChtZW1vcnlfbGV2ZWwtPk1wbGxTczIpOwor CX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUG9wdWxhdGVzIHRoZSBTTUMgTVZE RCBzdHJ1Y3R1cmUgdXNpbmcgdGhlIHByb3ZpZGVkIG1lbW9yeSBjbG9jay4KKyAqCisgKiBAcGFy YW0gICAgaHdtZ3IgICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgaGFyZHdhcmUgbWFuYWdlcgorICog QHBhcmFtICAgIG1jbGsgICAgICAgIHRoZSBNQ0xLIHZhbHVlIHRvIGJlIHVzZWQgaW4gdGhlIGRl Y2lzaW9uIGlmIE1WREQgc2hvdWxkIGJlIGhpZ2ggb3IgbG93LgorICogQHBhcmFtICAgIHZvbHRh Z2UgICAgIHRoZSBTTUMgVk9MVEFHRSBzdHJ1Y3R1cmUgdG8gYmUgcG9wdWxhdGVkCisgKi8KK2lu dCB0b25nYV9wb3B1bGF0ZV9tdmRkX3ZhbHVlKHN0cnVjdCBwcF9od21nciAqaHdtZ3IsIHVpbnQz Ml90IG1jbGssIFNNSU9fUGF0dGVybiAqc21pb19wYXR0ZXJuKQoreworCWNvbnN0IHRvbmdhX2h3 bWdyICpkYXRhID0gKHRvbmdhX2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKwlzdHJ1Y3QgcGht X3BwdF92MV9pbmZvcm1hdGlvbiAqcHB0YWJsZV9pbmZvID0gKHN0cnVjdCBwaG1fcHB0X3YxX2lu Zm9ybWF0aW9uICopKGh3bWdyLT5wcHRhYmxlKTsKKwl1aW50MzJfdCBpID0gMDsKKworCWlmIChU T05HQV9WT0xUQUdFX0NPTlRST0xfTk9ORSAhPSBkYXRhLT5tdmRkX2NvbnRyb2wpIHsKKwkJLyog ZmluZCBtdmRkIHZhbHVlIHdoaWNoIGNsb2NrIGlzIG1vcmUgdGhhbiByZXF1ZXN0ICovCisJCWZv ciAoaSA9IDA7IGkgPCBwcHRhYmxlX2luZm8tPnZkZF9kZXBfb25fbWNsay0+Y291bnQ7IGkrKykg eworCQkJaWYgKG1jbGsgPD0gcHB0YWJsZV9pbmZvLT52ZGRfZGVwX29uX21jbGstPmVudHJpZXNb aV0uY2xrKSB7CisJCQkJLyogQWx3YXlzIHJvdW5kIHRvIGhpZ2hlciB2b2x0YWdlLiAqLworCQkJ CXNtaW9fcGF0dGVybi0+Vm9sdGFnZSA9IGRhdGEtPm12ZGRfdm9sdGFnZV90YWJsZS5lbnRyaWVz W2ldLnZhbHVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJUFBfQVNTRVJUX1dJVEhfQ09E RShpIDwgcHB0YWJsZV9pbmZvLT52ZGRfZGVwX29uX21jbGstPmNvdW50LAorCQkJIk1WREQgVm9s dGFnZSBpcyBvdXRzaWRlIHRoZSBzdXBwb3J0ZWQgcmFuZ2UuIiwgcmV0dXJuIC0xKTsKKworCX0g ZWxzZSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50 IHRvbmdhX3BvcHVsYXRlX3Ntdl9hY3BpX2xldmVsKHN0cnVjdCBwcF9od21nciAqaHdtZ3IsCisJ U01VNzJfRGlzY3JldGVfRHBtVGFibGUgKnRhYmxlKQoreworCWludCByZXN1bHQgPSAwOworCWNv bnN0IHRvbmdhX2h3bWdyICpkYXRhID0gKHRvbmdhX2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsK KwlwcF9hdG9tY3RybF9jbG9ja19kaXZpZGVyc192aSBkaXZpZGVyczsKKwlTTUlPX1BhdHRlcm4g dm9sdGFnZV9sZXZlbDsKKwl1aW50MzJfdCBzcGxsX2Z1bmNfY250bCAgICA9IGRhdGEtPmNsb2Nr X3JlZ2lzdGVycy52Q0dfU1BMTF9GVU5DX0NOVEw7CisJdWludDMyX3Qgc3BsbF9mdW5jX2NudGxf MiAgPSBkYXRhLT5jbG9ja19yZWdpc3RlcnMudkNHX1NQTExfRlVOQ19DTlRMXzI7CisJdWludDMy X3QgZGxsX2NudGwgICAgICAgICAgPSBkYXRhLT5jbG9ja19yZWdpc3RlcnMudkRMTF9DTlRMOwor CXVpbnQzMl90IG1jbGtfcHdybWd0X2NudGwgID0gZGF0YS0+Y2xvY2tfcmVnaXN0ZXJzLnZNQ0xL X1BXUk1HVF9DTlRMOworCisJLyogVGhlIEFDUEkgc3RhdGUgc2hvdWxkIG5vdCBkbyBEUE0gb24g REMgKG9yIGV2ZXIpLiovCisJdGFibGUtPkFDUElMZXZlbC5GbGFncyAmPSB+UFBTTUNfU1dTVEFU RV9GTEFHX0RDOworCisJdGFibGUtPkFDUElMZXZlbC5NaW5Wb2x0YWdlID0gZGF0YS0+c21jX3N0 YXRlX3RhYmxlLkdyYXBoaWNzTGV2ZWxbMF0uTWluVm9sdGFnZTsKKworCS8qIGFzc2lnbiB6ZXJv IGZvciBub3cqLworCXRhYmxlLT5BQ1BJTGV2ZWwuU2Nsa0ZyZXF1ZW5jeSA9IGF0b21jdHJsX2dl dF9yZWZlcmVuY2VfY2xvY2soaHdtZ3IpOworCisJLyogZ2V0IHRoZSBlbmdpbmUgY2xvY2sgZGl2 aWRlcnMgZm9yIHRoaXMgY2xvY2sgdmFsdWUqLworCXJlc3VsdCA9IGF0b21jdHJsX2dldF9lbmdp bmVfcGxsX2RpdmlkZXJzX3ZpKGh3bWdyLAorCQl0YWJsZS0+QUNQSUxldmVsLlNjbGtGcmVxdWVu Y3ksICAmZGl2aWRlcnMpOworCisJUFBfQVNTRVJUX1dJVEhfQ09ERShyZXN1bHQgPT0gMCwKKwkJ IkVycm9yIHJldHJpZXZpbmcgRW5naW5lIENsb2NrIGRpdmlkZXJzIGZyb20gVkJJT1MuIiwgcmV0 dXJuIHJlc3VsdCk7CisKKwkvKiBkaXZpZGVyIElEIGZvciByZXF1aXJlZCBTQ0xLKi8KKwl0YWJs ZS0+QUNQSUxldmVsLlNjbGtEaWQgPSAodWludDhfdClkaXZpZGVycy5wbGxfcG9zdF9kaXZpZGVy OworCXRhYmxlLT5BQ1BJTGV2ZWwuRGlzcGxheVdhdGVybWFyayA9IFBQU01DX0RJU1BMQVlfV0FU RVJNQVJLX0xPVzsKKwl0YWJsZS0+QUNQSUxldmVsLkRlZXBTbGVlcERpdklkID0gMDsKKworCXNw bGxfZnVuY19jbnRsICAgICAgPSBQSE1fU0VUX0ZJRUxEKHNwbGxfZnVuY19jbnRsLAorCQkJCQkJ CUNHX1NQTExfRlVOQ19DTlRMLCAgIFNQTExfUFdST04sICAgICAwKTsKKwlzcGxsX2Z1bmNfY250 bCAgICAgID0gUEhNX1NFVF9GSUVMRChzcGxsX2Z1bmNfY250bCwKKwkJCQkJCQlDR19TUExMX0ZV TkNfQ05UTCwgICBTUExMX1JFU0VULCAgICAgMSk7CisJc3BsbF9mdW5jX2NudGxfMiAgICA9IFBI TV9TRVRfRklFTEQoc3BsbF9mdW5jX2NudGxfMiwKKwkJCQkJCQlDR19TUExMX0ZVTkNfQ05UTF8y LCBTQ0xLX01VWF9TRUwsICAgNCk7CisKKwl0YWJsZS0+QUNQSUxldmVsLkNnU3BsbEZ1bmNDbnRs ID0gc3BsbF9mdW5jX2NudGw7CisJdGFibGUtPkFDUElMZXZlbC5DZ1NwbGxGdW5jQ250bDIgPSBz cGxsX2Z1bmNfY250bF8yOworCXRhYmxlLT5BQ1BJTGV2ZWwuQ2dTcGxsRnVuY0NudGwzID0gZGF0 YS0+Y2xvY2tfcmVnaXN0ZXJzLnZDR19TUExMX0ZVTkNfQ05UTF8zOworCXRhYmxlLT5BQ1BJTGV2 ZWwuQ2dTcGxsRnVuY0NudGw0ID0gZGF0YS0+Y2xvY2tfcmVnaXN0ZXJzLnZDR19TUExMX0ZVTkNf Q05UTF80OworCXRhYmxlLT5BQ1BJTGV2ZWwuU3BsbFNwcmVhZFNwZWN0cnVtID0gZGF0YS0+Y2xv Y2tfcmVnaXN0ZXJzLnZDR19TUExMX1NQUkVBRF9TUEVDVFJVTTsKKwl0YWJsZS0+QUNQSUxldmVs LlNwbGxTcHJlYWRTcGVjdHJ1bTIgPSBkYXRhLT5jbG9ja19yZWdpc3RlcnMudkNHX1NQTExfU1BS RUFEX1NQRUNUUlVNXzI7CisJdGFibGUtPkFDUElMZXZlbC5DY1B3ckR5blJtID0gMDsKKwl0YWJs ZS0+QUNQSUxldmVsLkNjUHdyRHluUm0xID0gMDsKKworCisJLyogRm9yIHZhcmlvdXMgZmVhdHVy ZXMgdG8gYmUgZW5hYmxlZC9kaXNhYmxlZCB3aGlsZSB0aGlzIGxldmVsIGlzIGFjdGl2ZS4qLwor CUNPTlZFUlRfRlJPTV9IT1NUX1RPX1NNQ19VTCh0YWJsZS0+QUNQSUxldmVsLkZsYWdzKTsKKwkv KiBTQ0xLIGZyZXF1ZW5jeSBpbiB1bml0cyBvZiAxMEtIeiovCisJQ09OVkVSVF9GUk9NX0hPU1Rf VE9fU01DX1VMKHRhYmxlLT5BQ1BJTGV2ZWwuU2Nsa0ZyZXF1ZW5jeSk7CisJQ09OVkVSVF9GUk9N X0hPU1RfVE9fU01DX1VMKHRhYmxlLT5BQ1BJTGV2ZWwuQ2dTcGxsRnVuY0NudGwpOworCUNPTlZF UlRfRlJPTV9IT1NUX1RPX1NNQ19VTCh0YWJsZS0+QUNQSUxldmVsLkNnU3BsbEZ1bmNDbnRsMik7 CisJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VMKHRhYmxlLT5BQ1BJTGV2ZWwuQ2dTcGxsRnVu Y0NudGwzKTsKKwlDT05WRVJUX0ZST01fSE9TVF9UT19TTUNfVUwodGFibGUtPkFDUElMZXZlbC5D Z1NwbGxGdW5jQ250bDQpOworCUNPTlZFUlRfRlJPTV9IT1NUX1RPX1NNQ19VTCh0YWJsZS0+QUNQ SUxldmVsLlNwbGxTcHJlYWRTcGVjdHJ1bSk7CisJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VM KHRhYmxlLT5BQ1BJTGV2ZWwuU3BsbFNwcmVhZFNwZWN0cnVtMik7CisJQ09OVkVSVF9GUk9NX0hP U1RfVE9fU01DX1VMKHRhYmxlLT5BQ1BJTGV2ZWwuQ2NQd3JEeW5SbSk7CisJQ09OVkVSVF9GUk9N X0hPU1RfVE9fU01DX1VMKHRhYmxlLT5BQ1BJTGV2ZWwuQ2NQd3JEeW5SbTEpOworCisJLyogdGFi bGUtPk1lbW9yeUFDUElMZXZlbC5NaW5WZGRjUGhhc2VzID0gdGFibGUtPkFDUElMZXZlbC5NaW5W ZGRjUGhhc2VzOyovCisJdGFibGUtPk1lbW9yeUFDUElMZXZlbC5NaW5Wb2x0YWdlID0gZGF0YS0+ c21jX3N0YXRlX3RhYmxlLk1lbW9yeUxldmVsWzBdLk1pblZvbHRhZ2U7CisKKwkvKiAgQ09OVkVS VF9GUk9NX0hPU1RfVE9fU01DX1VMKHRhYmxlLT5NZW1vcnlBQ1BJTGV2ZWwuTWluVm9sdGFnZSk7 Ki8KKworCWlmICgwID09IHRvbmdhX3BvcHVsYXRlX212ZGRfdmFsdWUoaHdtZ3IsIDAsICZ2b2x0 YWdlX2xldmVsKSkKKwkJdGFibGUtPk1lbW9yeUFDUElMZXZlbC5NaW5NdmRkID0KKwkJCVBQX0hP U1RfVE9fU01DX1VMKHZvbHRhZ2VfbGV2ZWwuVm9sdGFnZSAqIFZPTFRBR0VfU0NBTEUpOworCWVs c2UKKwkJdGFibGUtPk1lbW9yeUFDUElMZXZlbC5NaW5NdmRkID0gMDsKKworCS8qIEZvcmNlIHJl c2V0IG9uIERMTCovCisJbWNsa19wd3JtZ3RfY250bCAgICA9IFBITV9TRVRfRklFTEQobWNsa19w d3JtZ3RfY250bCwKKwkJTUNMS19QV1JNR1RfQ05UTCwgTVJEQ0swX1JFU0VULCAweDEpOworCW1j bGtfcHdybWd0X2NudGwgICAgPSBQSE1fU0VUX0ZJRUxEKG1jbGtfcHdybWd0X2NudGwsCisJCU1D TEtfUFdSTUdUX0NOVEwsIE1SRENLMV9SRVNFVCwgMHgxKTsKKworCS8qIERpc2FibGUgRExMIGlu IEFDUElTdGF0ZSovCisJbWNsa19wd3JtZ3RfY250bCAgICA9IFBITV9TRVRfRklFTEQobWNsa19w d3JtZ3RfY250bCwKKwkJTUNMS19QV1JNR1RfQ05UTCwgTVJEQ0swX1BETkIsIDApOworCW1jbGtf cHdybWd0X2NudGwgICAgPSBQSE1fU0VUX0ZJRUxEKG1jbGtfcHdybWd0X2NudGwsCisJCU1DTEtf UFdSTUdUX0NOVEwsIE1SRENLMV9QRE5CLCAwKTsKKworCS8qIEVuYWJsZSBETEwgYnlwYXNzIHNp Z25hbCovCisJZGxsX2NudGwgICAgICAgICAgICA9IFBITV9TRVRfRklFTEQoZGxsX2NudGwsCisJ CURMTF9DTlRMLCBNUkRDSzBfQllQQVNTLCAwKTsKKwlkbGxfY250bCAgICAgICAgICAgID0gUEhN X1NFVF9GSUVMRChkbGxfY250bCwKKwkJRExMX0NOVEwsIE1SRENLMV9CWVBBU1MsIDApOworCisJ dGFibGUtPk1lbW9yeUFDUElMZXZlbC5EbGxDbnRsICAgICAgICAgICAgPQorCQlQUF9IT1NUX1RP X1NNQ19VTChkbGxfY250bCk7CisJdGFibGUtPk1lbW9yeUFDUElMZXZlbC5NY2xrUHdybWd0Q250 bCAgICAgPQorCQlQUF9IT1NUX1RPX1NNQ19VTChtY2xrX3B3cm1ndF9jbnRsKTsKKwl0YWJsZS0+ TWVtb3J5QUNQSUxldmVsLk1wbGxBZEZ1bmNDbnRsICAgICA9CisJCVBQX0hPU1RfVE9fU01DX1VM KGRhdGEtPmNsb2NrX3JlZ2lzdGVycy52TVBMTF9BRF9GVU5DX0NOVEwpOworCXRhYmxlLT5NZW1v cnlBQ1BJTGV2ZWwuTXBsbERxRnVuY0NudGwgICAgID0KKwkJUFBfSE9TVF9UT19TTUNfVUwoZGF0 YS0+Y2xvY2tfcmVnaXN0ZXJzLnZNUExMX0RRX0ZVTkNfQ05UTCk7CisJdGFibGUtPk1lbW9yeUFD UElMZXZlbC5NcGxsRnVuY0NudGwgICAgICAgPQorCQlQUF9IT1NUX1RPX1NNQ19VTChkYXRhLT5j bG9ja19yZWdpc3RlcnMudk1QTExfRlVOQ19DTlRMKTsKKwl0YWJsZS0+TWVtb3J5QUNQSUxldmVs Lk1wbGxGdW5jQ250bF8xICAgICA9CisJCVBQX0hPU1RfVE9fU01DX1VMKGRhdGEtPmNsb2NrX3Jl Z2lzdGVycy52TVBMTF9GVU5DX0NOVExfMSk7CisJdGFibGUtPk1lbW9yeUFDUElMZXZlbC5NcGxs RnVuY0NudGxfMiAgICAgPQorCQlQUF9IT1NUX1RPX1NNQ19VTChkYXRhLT5jbG9ja19yZWdpc3Rl cnMudk1QTExfRlVOQ19DTlRMXzIpOworCXRhYmxlLT5NZW1vcnlBQ1BJTGV2ZWwuTXBsbFNzMSAg ICAgICAgICAgID0KKwkJUFBfSE9TVF9UT19TTUNfVUwoZGF0YS0+Y2xvY2tfcmVnaXN0ZXJzLnZN UExMX1NTMSk7CisJdGFibGUtPk1lbW9yeUFDUElMZXZlbC5NcGxsU3MyICAgICAgICAgICAgPQor CQlQUF9IT1NUX1RPX1NNQ19VTChkYXRhLT5jbG9ja19yZWdpc3RlcnMudk1QTExfU1MyKTsKKwor CXRhYmxlLT5NZW1vcnlBQ1BJTGV2ZWwuRW5hYmxlZEZvclRocm90dGxlID0gMDsKKwl0YWJsZS0+ TWVtb3J5QUNQSUxldmVsLkVuYWJsZWRGb3JBY3Rpdml0eSA9IDA7CisJdGFibGUtPk1lbW9yeUFD UElMZXZlbC5VcEh5c3QgPSAwOworCXRhYmxlLT5NZW1vcnlBQ1BJTGV2ZWwuRG93bkh5c3QgPSAx MDA7CisJdGFibGUtPk1lbW9yeUFDUElMZXZlbC5Wb2x0YWdlRG93bkh5c3QgPSAwOworCS8qIElu ZGljYXRlcyBtYXhpbXVtIGFjdGl2aXR5IGxldmVsIGZvciB0aGlzIHBlcmZvcm1hbmNlIGxldmVs LiovCisJdGFibGUtPk1lbW9yeUFDUElMZXZlbC5BY3Rpdml0eUxldmVsID0gUFBfSE9TVF9UT19T TUNfVVMoKHVpbnQxNl90KWRhdGEtPm1jbGtfYWN0aXZpdHlfdGFyZ2V0KTsKKworCXRhYmxlLT5N ZW1vcnlBQ1BJTGV2ZWwuU3R1dHRlckVuYWJsZSA9IDA7CisJdGFibGUtPk1lbW9yeUFDUElMZXZl bC5TdHJvYmVFbmFibGUgPSAwOworCXRhYmxlLT5NZW1vcnlBQ1BJTGV2ZWwuRWRjUmVhZEVuYWJs ZSA9IDA7CisJdGFibGUtPk1lbW9yeUFDUElMZXZlbC5FZGNXcml0ZUVuYWJsZSA9IDA7CisJdGFi bGUtPk1lbW9yeUFDUElMZXZlbC5SdHRFbmFibGUgPSAwOworCisJcmV0dXJuIHJlc3VsdDsKK30K Kworc3RhdGljIGludCB0b25nYV9maW5kX2Jvb3RfbGV2ZWwoc3RydWN0IHRvbmdhX3NpbmdsZV9k cG1fdGFibGUgKnRhYmxlLCB1aW50MzJfdCB2YWx1ZSwgdWludDMyX3QgKmJvb3RfbGV2ZWwpCit7 CisJaW50IHJlc3VsdCA9IDA7CisJdWludDMyX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCB0YWJs ZS0+Y291bnQ7IGkrKykgeworCQlpZiAodmFsdWUgPT0gdGFibGUtPmRwbV9sZXZlbHNbaV0udmFs dWUpIHsKKwkJCSpib290X2xldmVsID0gaTsKKwkJCXJlc3VsdCA9IDA7CisJCX0KKwl9CisJcmV0 dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCB0b25nYV9wb3B1bGF0ZV9zbWNfYm9vdF9sZXZl bChzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLAorCQkJU01VNzJfRGlzY3JldGVfRHBtVGFibGUgKnRh YmxlKQoreworCWludCByZXN1bHQgPSAwOworCXRvbmdhX2h3bWdyICpkYXRhID0gKHRvbmdhX2h3 bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKworCXRhYmxlLT5HcmFwaGljc0Jvb3RMZXZlbCAgPSAw OyAgICAgICAgLyogMCA9PSBEUE1bMF0gKGxvdyksIGV0Yy4gKi8KKwl0YWJsZS0+TWVtb3J5Qm9v dExldmVsICAgID0gMDsgICAgICAgIC8qIDAgPT0gRFBNWzBdIChsb3cpLCBldGMuICovCisKKwkv KiBmaW5kIGJvb3QgbGV2ZWwgZnJvbSBkcG0gdGFibGUqLworCXJlc3VsdCA9IHRvbmdhX2ZpbmRf Ym9vdF9sZXZlbCgmKGRhdGEtPmRwbV90YWJsZS5zY2xrX3RhYmxlKSwKKwlkYXRhLT52Ymlvc19i b290X3N0YXRlLnNjbGtfYm9vdHVwX3ZhbHVlLAorCSh1aW50MzJfdCAqKSYoZGF0YS0+c21jX3N0 YXRlX3RhYmxlLkdyYXBoaWNzQm9vdExldmVsKSk7CisKKwlpZiAoMCAhPSByZXN1bHQpIHsKKwkJ ZGF0YS0+c21jX3N0YXRlX3RhYmxlLkdyYXBoaWNzQm9vdExldmVsID0gMDsKKwkJcHJpbnRrKEtF Uk5fRVJSICJbIHBvd2VycGxheSBdIFZCSU9TIGRpZCBub3QgZmluZCBib290IGVuZ2luZSBjbG9j ayB2YWx1ZSBcCisJCQlpbiBkZXBlbmRlbmN5IHRhYmxlLiBVc2luZyBHcmFwaGljcyBEUE0gbGV2 ZWwgMCEiKTsKKwkJcmVzdWx0ID0gMDsKKwl9CisKKwlyZXN1bHQgPSB0b25nYV9maW5kX2Jvb3Rf bGV2ZWwoJihkYXRhLT5kcG1fdGFibGUubWNsa190YWJsZSksCisJCWRhdGEtPnZiaW9zX2Jvb3Rf c3RhdGUubWNsa19ib290dXBfdmFsdWUsCisJCSh1aW50MzJfdCAqKSYoZGF0YS0+c21jX3N0YXRl X3RhYmxlLk1lbW9yeUJvb3RMZXZlbCkpOworCisJaWYgKDAgIT0gcmVzdWx0KSB7CisJCWRhdGEt PnNtY19zdGF0ZV90YWJsZS5NZW1vcnlCb290TGV2ZWwgPSAwOworCQlwcmludGsoS0VSTl9FUlIg IlsgcG93ZXJwbGF5IF0gVkJJT1MgZGlkIG5vdCBmaW5kIGJvb3QgZW5naW5lIGNsb2NrIHZhbHVl IFwKKwkJCWluIGRlcGVuZGVuY3kgdGFibGUuIFVzaW5nIE1lbW9yeSBEUE0gbGV2ZWwgMCEiKTsK KwkJcmVzdWx0ID0gMDsKKwl9CisKKwl0YWJsZS0+Qm9vdFZvbHRhZ2UuVmRkYyA9CisJCXRvbmdh X2dldF92b2x0YWdlX2lkKCYoZGF0YS0+dmRkY192b2x0YWdlX3RhYmxlKSwKKwkJCWRhdGEtPnZi aW9zX2Jvb3Rfc3RhdGUudmRkY19ib290dXBfdmFsdWUpOworCXRhYmxlLT5Cb290Vm9sdGFnZS5W ZGRHZnggPQorCQl0b25nYV9nZXRfdm9sdGFnZV9pZCgmKGRhdGEtPnZkZGdmeF92b2x0YWdlX3Rh YmxlKSwKKwkJCWRhdGEtPnZiaW9zX2Jvb3Rfc3RhdGUudmRkZ2Z4X2Jvb3R1cF92YWx1ZSk7CisJ dGFibGUtPkJvb3RWb2x0YWdlLlZkZGNpID0KKwkJdG9uZ2FfZ2V0X3ZvbHRhZ2VfaWQoJihkYXRh LT52ZGRjaV92b2x0YWdlX3RhYmxlKSwKKwkJCWRhdGEtPnZiaW9zX2Jvb3Rfc3RhdGUudmRkY2lf Ym9vdHVwX3ZhbHVlKTsKKwl0YWJsZS0+Qm9vdE1WZGQgPSBkYXRhLT52Ymlvc19ib290X3N0YXRl Lm12ZGRfYm9vdHVwX3ZhbHVlOworCisJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VTKHRhYmxl LT5Cb290TVZkZCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qKgorICogQ2FsY3VsYXRl cyB0aGUgU0NMSyBkaXZpZGVycyB1c2luZyB0aGUgcHJvdmlkZWQgZW5naW5lIGNsb2NrCisgKgor ICogQHBhcmFtICAgIGh3bWdyICAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIGhhcmR3YXJlIG1hbmFn ZXIKKyAqIEBwYXJhbSAgICBlbmdpbmVfY2xvY2sgdGhlIGVuZ2luZSBjbG9jayB0byB1c2UgdG8g cG9wdWxhdGUgdGhlIHN0cnVjdHVyZQorICogQHBhcmFtICAgIHNjbGsgICAgICAgIHRoZSBTTUMg U0NMSyBzdHJ1Y3R1cmUgdG8gYmUgcG9wdWxhdGVkCisgKi8KK2ludCB0b25nYV9jYWxjdWxhdGVf c2Nsa19wYXJhbXMoc3RydWN0IHBwX2h3bWdyICpod21nciwKKwkJdWludDMyX3QgZW5naW5lX2Ns b2NrLCBTTVU3Ml9EaXNjcmV0ZV9HcmFwaGljc0xldmVsICpzY2xrKQoreworCWNvbnN0IHRvbmdh X2h3bWdyICpkYXRhID0gKHRvbmdhX2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKwlwcF9hdG9t Y3RybF9jbG9ja19kaXZpZGVyc192aSBkaXZpZGVyczsKKwl1aW50MzJfdCBzcGxsX2Z1bmNfY250 bCAgICAgICAgICAgID0gZGF0YS0+Y2xvY2tfcmVnaXN0ZXJzLnZDR19TUExMX0ZVTkNfQ05UTDsK Kwl1aW50MzJfdCBzcGxsX2Z1bmNfY250bF8zICAgICAgICAgID0gZGF0YS0+Y2xvY2tfcmVnaXN0 ZXJzLnZDR19TUExMX0ZVTkNfQ05UTF8zOworCXVpbnQzMl90IHNwbGxfZnVuY19jbnRsXzQgICAg ICAgICAgPSBkYXRhLT5jbG9ja19yZWdpc3RlcnMudkNHX1NQTExfRlVOQ19DTlRMXzQ7CisJdWlu dDMyX3QgY2dfc3BsbF9zcHJlYWRfc3BlY3RydW0gICA9IGRhdGEtPmNsb2NrX3JlZ2lzdGVycy52 Q0dfU1BMTF9TUFJFQURfU1BFQ1RSVU07CisJdWludDMyX3QgY2dfc3BsbF9zcHJlYWRfc3BlY3Ry dW1fMiA9IGRhdGEtPmNsb2NrX3JlZ2lzdGVycy52Q0dfU1BMTF9TUFJFQURfU1BFQ1RSVU1fMjsK Kwl1aW50MzJfdCAgICByZWZlcmVuY2VfY2xvY2s7CisJdWludDMyX3QgcmVmZXJlbmNlX2Rpdmlk ZXI7CisJdWludDMyX3QgZmJkaXY7CisJaW50IHJlc3VsdDsKKworCS8qIGdldCB0aGUgZW5naW5l IGNsb2NrIGRpdmlkZXJzIGZvciB0aGlzIGNsb2NrIHZhbHVlKi8KKwlyZXN1bHQgPSBhdG9tY3Ry bF9nZXRfZW5naW5lX3BsbF9kaXZpZGVyc192aShod21nciwgZW5naW5lX2Nsb2NrLCAgJmRpdmlk ZXJzKTsKKworCVBQX0FTU0VSVF9XSVRIX0NPREUocmVzdWx0ID09IDAsCisJCSJFcnJvciByZXRy aWV2aW5nIEVuZ2luZSBDbG9jayBkaXZpZGVycyBmcm9tIFZCSU9TLiIsIHJldHVybiByZXN1bHQp OworCisJLyogVG8gZ2V0IEZCRElWIHdlIG5lZWQgdG8gbXVsdGlwbHkgdGhpcyBieSAxNjM4NCBh bmQgZGl2aWRlIGl0IGJ5IEZyZWYuKi8KKwlyZWZlcmVuY2VfY2xvY2sgPSBhdG9tY3RybF9nZXRf cmVmZXJlbmNlX2Nsb2NrKGh3bWdyKTsKKworCXJlZmVyZW5jZV9kaXZpZGVyID0gMSArIGRpdmlk ZXJzLnVjX3BsbF9yZWZfZGl2OworCisJLyogbG93IDE0IGJpdHMgaXMgZnJhY3Rpb24gYW5kIGhp Z2ggMTIgYml0cyBpcyBkaXZpZGVyKi8KKwlmYmRpdiA9IGRpdmlkZXJzLnVsX2ZiX2Rpdi51bF9m Yl9kaXZpZGVyICYgMHgzRkZGRkZGOworCisJLyogU1BMTF9GVU5DX0NOVEwgc2V0dXAqLworCXNw bGxfZnVuY19jbnRsID0gUEhNX1NFVF9GSUVMRChzcGxsX2Z1bmNfY250bCwKKwkJQ0dfU1BMTF9G VU5DX0NOVEwsIFNQTExfUkVGX0RJViwgZGl2aWRlcnMudWNfcGxsX3JlZl9kaXYpOworCXNwbGxf ZnVuY19jbnRsID0gUEhNX1NFVF9GSUVMRChzcGxsX2Z1bmNfY250bCwKKwkJQ0dfU1BMTF9GVU5D X0NOVEwsIFNQTExfUERJVl9BLCAgZGl2aWRlcnMudWNfcGxsX3Bvc3RfZGl2KTsKKworCS8qIFNQ TExfRlVOQ19DTlRMXzMgc2V0dXAqLworCXNwbGxfZnVuY19jbnRsXzMgPSBQSE1fU0VUX0ZJRUxE KHNwbGxfZnVuY19jbnRsXzMsCisJCUNHX1NQTExfRlVOQ19DTlRMXzMsIFNQTExfRkJfRElWLCBm YmRpdik7CisKKwkvKiBzZXQgdG8gdXNlIGZyYWN0aW9uYWwgYWNjdW11bGF0aW9uKi8KKwlzcGxs X2Z1bmNfY250bF8zID0gUEhNX1NFVF9GSUVMRChzcGxsX2Z1bmNfY250bF8zLAorCQlDR19TUExM X0ZVTkNfQ05UTF8zLCBTUExMX0RJVEhFTiwgMSk7CisKKwlpZiAocGhtX2NhcF9lbmFibGVkKGh3 bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywKKwkJCVBITV9QbGF0Zm9ybUNh cHNfRW5naW5lU3ByZWFkU3BlY3RydW1TdXBwb3J0KSkgeworCQlwcF9hdG9tY3RybF9pbnRlcm5h bF9zc19pbmZvIHNzX2luZm87CisKKwkJdWludDMyX3QgdmNvRnJlcSA9IGVuZ2luZV9jbG9jayAq IGRpdmlkZXJzLnVjX3BsbF9wb3N0X2RpdjsKKwkJaWYgKDAgPT0gYXRvbWN0cmxfZ2V0X2VuZ2lu ZV9jbG9ja19zcHJlYWRfc3BlY3RydW0oaHdtZ3IsIHZjb0ZyZXEsICZzc19pbmZvKSkgeworCQkJ LyoKKwkJCSogc3NfaW5mby5zcGVlZF9zcGVjdHJ1bV9wZXJjZW50YWdlIC0tIGluIHVuaXQgb2Yg MC4wMSUKKwkJCSogc3NfaW5mby5zcGVlZF9zcGVjdHJ1bV9yYXRlIC0tIGluIHVuaXQgb2Yga2h6 CisJCQkqLworCQkJLyogY2xrcyA9IHJlZmVyZW5jZV9jbG9jayAqIDEwIC8gKFJFRkRJViArIDEp IC8gc3BlZWRfc3BlY3RydW1fcmF0ZSAvIDIgKi8KKwkJCXVpbnQzMl90IGNsa1MgPSByZWZlcmVu Y2VfY2xvY2sgKiA1IC8gKHJlZmVyZW5jZV9kaXZpZGVyICogc3NfaW5mby5zcGVlZF9zcGVjdHJ1 bV9yYXRlKTsKKworCQkJLyogY2xrdiA9IDIgKiBEICogZmJkaXYgLyBOUyAqLworCQkJdWludDMy X3QgY2xrViA9IDQgKiBzc19pbmZvLnNwZWVkX3NwZWN0cnVtX3BlcmNlbnRhZ2UgKiBmYmRpdiAv IChjbGtTICogMTAwMDApOworCisJCQljZ19zcGxsX3NwcmVhZF9zcGVjdHJ1bSA9CisJCQkJUEhN X1NFVF9GSUVMRChjZ19zcGxsX3NwcmVhZF9zcGVjdHJ1bSwgQ0dfU1BMTF9TUFJFQURfU1BFQ1RS VU0sIENMS1MsIGNsa1MpOworCQkJY2dfc3BsbF9zcHJlYWRfc3BlY3RydW0gPQorCQkJCVBITV9T RVRfRklFTEQoY2dfc3BsbF9zcHJlYWRfc3BlY3RydW0sIENHX1NQTExfU1BSRUFEX1NQRUNUUlVN LCBTU0VOLCAxKTsKKwkJCWNnX3NwbGxfc3ByZWFkX3NwZWN0cnVtXzIgPQorCQkJCVBITV9TRVRf RklFTEQoY2dfc3BsbF9zcHJlYWRfc3BlY3RydW1fMiwgQ0dfU1BMTF9TUFJFQURfU1BFQ1RSVU1f MiwgQ0xLViwgY2xrVik7CisJCX0KKwl9CisKKwlzY2xrLT5TY2xrRnJlcXVlbmN5ICAgICAgICA9 IGVuZ2luZV9jbG9jazsKKwlzY2xrLT5DZ1NwbGxGdW5jQ250bDMgICAgICA9IHNwbGxfZnVuY19j bnRsXzM7CisJc2Nsay0+Q2dTcGxsRnVuY0NudGw0ICAgICAgPSBzcGxsX2Z1bmNfY250bF80Owor CXNjbGstPlNwbGxTcHJlYWRTcGVjdHJ1bSAgID0gY2dfc3BsbF9zcHJlYWRfc3BlY3RydW07CisJ c2Nsay0+U3BsbFNwcmVhZFNwZWN0cnVtMiAgPSBjZ19zcGxsX3NwcmVhZF9zcGVjdHJ1bV8yOwor CXNjbGstPlNjbGtEaWQgICAgICAgICAgICAgID0gKHVpbnQ4X3QpZGl2aWRlcnMucGxsX3Bvc3Rf ZGl2aWRlcjsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFBvcHVsYXRlcyBzaW5nbGUgU01D IFNDTEsgc3RydWN0dXJlIHVzaW5nIHRoZSBwcm92aWRlZCBlbmdpbmUgY2xvY2sKKyAqCisgKiBA cGFyYW0gICAgaHdtZ3IgICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgaGFyZHdhcmUgbWFuYWdlcgor ICogQHBhcmFtICAgIGVuZ2luZV9jbG9jayB0aGUgZW5naW5lIGNsb2NrIHRvIHVzZSB0byBwb3B1 bGF0ZSB0aGUgc3RydWN0dXJlCisgKiBAcGFyYW0gICAgc2NsayAgICAgICAgdGhlIFNNQyBTQ0xL IHN0cnVjdHVyZSB0byBiZSBwb3B1bGF0ZWQKKyAqLworc3RhdGljIGludCB0b25nYV9wb3B1bGF0 ZV9zaW5nbGVfZ3JhcGhpY19sZXZlbChzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLCB1aW50MzJfdCBl bmdpbmVfY2xvY2ssIHVpbnQxNl90IHNjbGtfYWN0aXZpdHlfbGV2ZWxfdGhyZXNob2xkLCBTTVU3 Ml9EaXNjcmV0ZV9HcmFwaGljc0xldmVsICpncmFwaGljX2xldmVsKQoreworCWludCByZXN1bHQ7 CisJdWludDMyX3QgdGhyZXNob2xkOworCXVpbnQzMl90IG12ZGQ7CisJdG9uZ2FfaHdtZ3IgKmRh dGEgPSAodG9uZ2FfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXN0cnVjdCBwaG1fcHB0X3Yx X2luZm9ybWF0aW9uICpwcHRhYmxlX2luZm8gPSAoc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRp b24gKikoaHdtZ3ItPnBwdGFibGUpOworCisJcmVzdWx0ID0gdG9uZ2FfY2FsY3VsYXRlX3NjbGtf cGFyYW1zKGh3bWdyLCBlbmdpbmVfY2xvY2ssIGdyYXBoaWNfbGV2ZWwpOworCisKKwkvKiBwb3B1 bGF0ZSBncmFwaGljcyBsZXZlbHMqLworCXJlc3VsdCA9IHRvbmdhX2dldF9kZXBlbmRlY3lfdm9s dF9ieV9jbGsoaHdtZ3IsCisJCXBwdGFibGVfaW5mby0+dmRkX2RlcF9vbl9zY2xrLCBlbmdpbmVf Y2xvY2ssCisJCSZncmFwaGljX2xldmVsLT5NaW5Wb2x0YWdlLCAmbXZkZCk7CisJUFBfQVNTRVJU X1dJVEhfQ09ERSgoMCA9PSByZXN1bHQpLAorCQkiY2FuIG5vdCBmaW5kIFZEREMgdm9sdGFnZSB2 YWx1ZSBmb3IgVkREQwlcCisJCWVuZ2luZSBjbG9jayBkZXBlbmRlbmN5IHRhYmxlIiwgcmV0dXJu IHJlc3VsdCk7CisKKwkvKiBTQ0xLIGZyZXF1ZW5jeSBpbiB1bml0cyBvZiAxMEtIeiovCisJZ3Jh cGhpY19sZXZlbC0+U2Nsa0ZyZXF1ZW5jeSA9IGVuZ2luZV9jbG9jazsKKworCS8qIEluZGljYXRl cyBtYXhpbXVtIGFjdGl2aXR5IGxldmVsIGZvciB0aGlzIHBlcmZvcm1hbmNlIGxldmVsLiA1MCUg Zm9yIG5vdyovCisJZ3JhcGhpY19sZXZlbC0+QWN0aXZpdHlMZXZlbCA9IHNjbGtfYWN0aXZpdHlf bGV2ZWxfdGhyZXNob2xkOworCisJZ3JhcGhpY19sZXZlbC0+Q2NQd3JEeW5SbSA9IDA7CisJZ3Jh cGhpY19sZXZlbC0+Q2NQd3JEeW5SbTEgPSAwOworCS8qIHRoaXMgbGV2ZWwgY2FuIGJlIHVzZWQg aWYgYWN0aXZpdHkgaXMgaGlnaCBlbm91Z2guKi8KKwlncmFwaGljX2xldmVsLT5FbmFibGVkRm9y QWN0aXZpdHkgPSAwOworCS8qIHRoaXMgbGV2ZWwgY2FuIGJlIHVzZWQgZm9yIHRocm90dGxpbmcu Ki8KKwlncmFwaGljX2xldmVsLT5FbmFibGVkRm9yVGhyb3R0bGUgPSAxOworCWdyYXBoaWNfbGV2 ZWwtPlVwSHlzdCA9IDA7CisJZ3JhcGhpY19sZXZlbC0+RG93bkh5c3QgPSAwOworCWdyYXBoaWNf bGV2ZWwtPlZvbHRhZ2VEb3duSHlzdCA9IDA7CisJZ3JhcGhpY19sZXZlbC0+UG93ZXJUaHJvdHRs ZSA9IDA7CisKKwl0aHJlc2hvbGQgPSBlbmdpbmVfY2xvY2sgKiBkYXRhLT5mYXN0X3dhdGVtYXJr X3RocmVzaG9sZCAvIDEwMDsKKy8qCisJKmdldCB0aGUgREFMIGNsb2NrLiBkbyBpdCBpbiBmdW50 dXJlLgorCVBFQ0lfR2V0TWluQ2xvY2tTZXR0aW5ncyhod21nci0+cGVjaSwgJm1pbkNsb2Nrcyk7 CisJZGF0YS0+ZGlzcGxheV90aW1pbmcubWluX2Nsb2NrX2luc3IgPSBtaW5DbG9ja3MuZW5naW5l Q2xvY2tJblNSOworCisJaWYgKHBobV9jYXBfZW5hYmxlZChod21nci0+cGxhdGZvcm1fZGVzY3Jp cHRvci5wbGF0Zm9ybUNhcHMsIFBITV9QbGF0Zm9ybUNhcHNfU2Nsa0RlZXBTbGVlcCkpCisJewor CQlncmFwaGljX2xldmVsLT5EZWVwU2xlZXBEaXZJZCA9IFBod1RvbmdhX0dldFNsZWVwRGl2aWRl cklkRnJvbUNsb2NrKGh3bWdyLCBlbmdpbmVfY2xvY2ssIG1pbkNsb2Nrcy5lbmdpbmVDbG9ja0lu U1IpOworCX0KKyovCisKKwkvKiBEZWZhdWx0IHRvIHNsb3csIGhpZ2hlc3QgRFBNIGxldmVsIHdp bGwgYmUgc2V0IHRvIFBQU01DX0RJU1BMQVlfV0FURVJNQVJLX0xPVyBsYXRlci4qLworCWdyYXBo aWNfbGV2ZWwtPkRpc3BsYXlXYXRlcm1hcmsgPSBQUFNNQ19ESVNQTEFZX1dBVEVSTUFSS19MT1c7 CisKKwlpZiAoMCA9PSByZXN1bHQpIHsKKwkJLyogQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VM KGdyYXBoaWNfbGV2ZWwtPk1pblZvbHRhZ2UpOyovCisJCS8qIENPTlZFUlRfRlJPTV9IT1NUX1RP X1NNQ19VTChncmFwaGljX2xldmVsLT5NaW5WZGRjUGhhc2VzKTsqLworCQlDT05WRVJUX0ZST01f SE9TVF9UT19TTUNfVUwoZ3JhcGhpY19sZXZlbC0+U2Nsa0ZyZXF1ZW5jeSk7CisJCUNPTlZFUlRf RlJPTV9IT1NUX1RPX1NNQ19VUyhncmFwaGljX2xldmVsLT5BY3Rpdml0eUxldmVsKTsKKwkJQ09O VkVSVF9GUk9NX0hPU1RfVE9fU01DX1VMKGdyYXBoaWNfbGV2ZWwtPkNnU3BsbEZ1bmNDbnRsMyk7 CisJCUNPTlZFUlRfRlJPTV9IT1NUX1RPX1NNQ19VTChncmFwaGljX2xldmVsLT5DZ1NwbGxGdW5j Q250bDQpOworCQlDT05WRVJUX0ZST01fSE9TVF9UT19TTUNfVUwoZ3JhcGhpY19sZXZlbC0+U3Bs bFNwcmVhZFNwZWN0cnVtKTsKKwkJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VMKGdyYXBoaWNf bGV2ZWwtPlNwbGxTcHJlYWRTcGVjdHJ1bTIpOworCQlDT05WRVJUX0ZST01fSE9TVF9UT19TTUNf VUwoZ3JhcGhpY19sZXZlbC0+Q2NQd3JEeW5SbSk7CisJCUNPTlZFUlRfRlJPTV9IT1NUX1RPX1NN Q19VTChncmFwaGljX2xldmVsLT5DY1B3ckR5blJtMSk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsK K30KKworLyoqCisgKiBQb3B1bGF0ZXMgYWxsIFNNQyBTQ0xLIGxldmVscycgc3RydWN0dXJlIGJh c2VkIG9uIHRoZSB0cmltbWVkIGFsbG93ZWQgZHBtIGVuZ2luZSBjbG9jayBzdGF0ZXMKKyAqCisg KiBAcGFyYW0gICAgaHdtZ3IgICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgaGFyZHdhcmUgbWFuYWdl cgorICovCitzdGF0aWMgaW50IHRvbmdhX3BvcHVsYXRlX2FsbF9ncmFwaGljX2xldmVscyhzdHJ1 Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCXRvbmdhX2h3bWdyICpkYXRhID0gKHRvbmdhX2h3bWdy ICopKGh3bWdyLT5iYWNrZW5kKTsKKwlzdHJ1Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqcHB0 YWJsZV9pbmZvID0gKHN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICopKGh3bWdyLT5wcHRh YmxlKTsKKwlzdHJ1Y3QgdG9uZ2FfZHBtX3RhYmxlICpkcG1fdGFibGUgPSAmZGF0YS0+ZHBtX3Rh YmxlOworCXBobV9wcHRfdjFfcGNpZV90YWJsZSAqcGNpZV90YWJsZSA9IHBwdGFibGVfaW5mby0+ cGNpZV90YWJsZTsKKwl1aW50OF90IHBjaWVfZW50cnlfY291bnQgPSAodWludDhfdCkgZGF0YS0+ ZHBtX3RhYmxlLnBjaWVfc3BlZWRfdGFibGUuY291bnQ7CisJaW50IHJlc3VsdCA9IDA7CisJdWlu dDMyX3QgbGV2ZWxfYXJyYXlfYWRyZXNzID0gZGF0YS0+ZHBtX3RhYmxlX3N0YXJ0ICsKKwkJb2Zm c2V0b2YoU01VNzJfRGlzY3JldGVfRHBtVGFibGUsIEdyYXBoaWNzTGV2ZWwpOworCXVpbnQzMl90 IGxldmVsX2FycmF5X3NpemUgPSBzaXplb2YoU01VNzJfRGlzY3JldGVfR3JhcGhpY3NMZXZlbCkg KgorCQlTTVU3Ml9NQVhfTEVWRUxTX0dSQVBISUNTOyAgIC8qIDY0IC0+IGxvbmc7IDMyIC0+IGlu dCovCisJU01VNzJfRGlzY3JldGVfR3JhcGhpY3NMZXZlbCAqbGV2ZWxzID0gZGF0YS0+c21jX3N0 YXRlX3RhYmxlLkdyYXBoaWNzTGV2ZWw7CisJdWludDMyX3QgaSwgbWF4RW50cnk7CisJdWludDhf dCBoaWdoZXN0X3BjaWVfbGV2ZWxfZW5hYmxlZCA9IDAsIGxvd2VzdF9wY2llX2xldmVsX2VuYWJs ZWQgPSAwLCBtaWRfcGNpZV9sZXZlbF9lbmFibGVkID0gMCwgY291bnQgPSAwOworCVBFQ0lfUmVn aXN0cnlWYWx1ZSByZWdfdmFsdWU7CisJbWVtc2V0KGxldmVscywgMHgwMCwgbGV2ZWxfYXJyYXlf c2l6ZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZHBtX3RhYmxlLT5zY2xrX3RhYmxlLmNvdW50OyBp KyspIHsKKwkJcmVzdWx0ID0gdG9uZ2FfcG9wdWxhdGVfc2luZ2xlX2dyYXBoaWNfbGV2ZWwoaHdt Z3IsCisJCQkJCWRwbV90YWJsZS0+c2Nsa190YWJsZS5kcG1fbGV2ZWxzW2ldLnZhbHVlLAorCQkJ CQkodWludDE2X3QpZGF0YS0+YWN0aXZpdHlfdGFyZ2V0W2ldLAorCQkJCQkmKGRhdGEtPnNtY19z dGF0ZV90YWJsZS5HcmFwaGljc0xldmVsW2ldKSk7CisKKwkJaWYgKDAgIT0gcmVzdWx0KQorCQkJ cmV0dXJuIHJlc3VsdDsKKworCQkvKiBNYWtpbmcgc3VyZSBvbmx5IERQTSBsZXZlbCAwLTEgaGF2 ZSBEZWVwIFNsZWVwIERpdiBJRCBwb3B1bGF0ZWQuICovCisJCWlmIChpID4gMSkKKwkJCWRhdGEt PnNtY19zdGF0ZV90YWJsZS5HcmFwaGljc0xldmVsW2ldLkRlZXBTbGVlcERpdklkID0gMDsKKwor CQlpZiAoMCA9PSBpKSB7CisJCQlyZWdfdmFsdWUgPSAwOworCQkJaWYgKHJlZ192YWx1ZSAhPSAw KQorCQkJCWRhdGEtPnNtY19zdGF0ZV90YWJsZS5HcmFwaGljc0xldmVsWzBdLlVwSHlzdCA9ICh1 aW50OF90KXJlZ192YWx1ZTsKKwkJfQorCisJCWlmICgxID09IGkpIHsKKwkJCXJlZ192YWx1ZSA9 IDA7CisJCQlpZiAocmVnX3ZhbHVlICE9IDApCisJCQkJZGF0YS0+c21jX3N0YXRlX3RhYmxlLkdy YXBoaWNzTGV2ZWxbMV0uVXBIeXN0ID0gKHVpbnQ4X3QpcmVnX3ZhbHVlOworCQl9CisJfQorCisJ LyogT25seSBlbmFibGUgbGV2ZWwgMCBmb3Igbm93LiAqLworCWRhdGEtPnNtY19zdGF0ZV90YWJs ZS5HcmFwaGljc0xldmVsWzBdLkVuYWJsZWRGb3JBY3Rpdml0eSA9IDE7CisKKwkvKiBzZXQgaGln aGVzdCBsZXZlbCB3YXRlcm1hcmsgdG8gaGlnaCAqLworCWlmIChkcG1fdGFibGUtPnNjbGtfdGFi bGUuY291bnQgPiAxKQorCQlkYXRhLT5zbWNfc3RhdGVfdGFibGUuR3JhcGhpY3NMZXZlbFtkcG1f dGFibGUtPnNjbGtfdGFibGUuY291bnQtMV0uRGlzcGxheVdhdGVybWFyayA9CisJCQlQUFNNQ19E SVNQTEFZX1dBVEVSTUFSS19ISUdIOworCisJZGF0YS0+c21jX3N0YXRlX3RhYmxlLkdyYXBoaWNz RHBtTGV2ZWxDb3VudCA9CisJCSh1aW50OF90KWRwbV90YWJsZS0+c2Nsa190YWJsZS5jb3VudDsK KwlkYXRhLT5kcG1fbGV2ZWxfZW5hYmxlX21hc2suc2Nsa19kcG1fZW5hYmxlX21hc2sgPQorCQl0 b25nYV9nZXRfZHBtX2xldmVsX2VuYWJsZV9tYXNrX3ZhbHVlKCZkcG1fdGFibGUtPnNjbGtfdGFi bGUpOworCisJaWYgKHBjaWVfdGFibGUgIT0gTlVMTCkgeworCQlQUF9BU1NFUlRfV0lUSF9DT0RF KChwY2llX2VudHJ5X2NvdW50ID49IDEpLAorCQkJIlRoZXJlIG11c3QgYmUgMSBvciBtb3JlIFBD SUUgbGV2ZWxzIGRlZmluZWQgaW4gUFBUYWJsZS4iLCByZXR1cm4gLTEpOworCQltYXhFbnRyeSA9 IHBjaWVfZW50cnlfY291bnQgLSAxOyAvKiBmb3IgaW5kZXhpbmcsIHdlIG5lZWQgdG8gZGVjcmVt ZW50IGJ5IDEuKi8KKwkJZm9yIChpID0gMDsgaSA8IGRwbV90YWJsZS0+c2Nsa190YWJsZS5jb3Vu dDsgaSsrKSB7CisJCQlkYXRhLT5zbWNfc3RhdGVfdGFibGUuR3JhcGhpY3NMZXZlbFtpXS5wY2ll RHBtTGV2ZWwgPQorCQkJCSh1aW50OF90KSAoKGkgPCBtYXhFbnRyeSkgPyBpIDogbWF4RW50cnkp OworCQl9CisJfSBlbHNlIHsKKwkJaWYgKDAgPT0gZGF0YS0+ZHBtX2xldmVsX2VuYWJsZV9tYXNr LnBjaWVfZHBtX2VuYWJsZV9tYXNrKQorCQkJcHJpbnRrKEtFUk5fRVJSICJbIHBvd2VycGxheSBd IFBjaWUgRHBtIEVuYWJsZW1hc2sgaXMgMCEiKTsKKworCQl3aGlsZSAoZGF0YS0+ZHBtX2xldmVs X2VuYWJsZV9tYXNrLnBjaWVfZHBtX2VuYWJsZV9tYXNrICYmCisJCQkJKChkYXRhLT5kcG1fbGV2 ZWxfZW5hYmxlX21hc2sucGNpZV9kcG1fZW5hYmxlX21hc2sgJgorCQkJCQkoMTw8KGhpZ2hlc3Rf cGNpZV9sZXZlbF9lbmFibGVkKzEpKSkgIT0gMCkpIHsKKwkJCWhpZ2hlc3RfcGNpZV9sZXZlbF9l bmFibGVkKys7CisJCX0KKworCQl3aGlsZSAoZGF0YS0+ZHBtX2xldmVsX2VuYWJsZV9tYXNrLnBj aWVfZHBtX2VuYWJsZV9tYXNrICYmCisJCQkJKChkYXRhLT5kcG1fbGV2ZWxfZW5hYmxlX21hc2su cGNpZV9kcG1fZW5hYmxlX21hc2sgJgorCQkJCQkoMTw8bG93ZXN0X3BjaWVfbGV2ZWxfZW5hYmxl ZCkpID09IDApKSB7CisJCQlsb3dlc3RfcGNpZV9sZXZlbF9lbmFibGVkKys7CisJCX0KKworCQl3 aGlsZSAoKGNvdW50IDwgaGlnaGVzdF9wY2llX2xldmVsX2VuYWJsZWQpICYmCisJCQkJKChkYXRh LT5kcG1fbGV2ZWxfZW5hYmxlX21hc2sucGNpZV9kcG1fZW5hYmxlX21hc2sgJgorCQkJCQkoMTw8 KGxvd2VzdF9wY2llX2xldmVsX2VuYWJsZWQrMStjb3VudCkpKSA9PSAwKSkgeworCQkJY291bnQr KzsKKwkJfQorCQltaWRfcGNpZV9sZXZlbF9lbmFibGVkID0gKGxvd2VzdF9wY2llX2xldmVsX2Vu YWJsZWQrMStjb3VudCkgPCBoaWdoZXN0X3BjaWVfbGV2ZWxfZW5hYmxlZCA/CisJCQkobG93ZXN0 X3BjaWVfbGV2ZWxfZW5hYmxlZCsxK2NvdW50KSA6IGhpZ2hlc3RfcGNpZV9sZXZlbF9lbmFibGVk OworCisKKwkJLyogc2V0IHBjaWVEcG1MZXZlbCB0byBoaWdoZXN0X3BjaWVfbGV2ZWxfZW5hYmxl ZCovCisJCWZvciAoaSA9IDI7IGkgPCBkcG1fdGFibGUtPnNjbGtfdGFibGUuY291bnQ7IGkrKykg eworCQkJZGF0YS0+c21jX3N0YXRlX3RhYmxlLkdyYXBoaWNzTGV2ZWxbaV0ucGNpZURwbUxldmVs ID0gaGlnaGVzdF9wY2llX2xldmVsX2VuYWJsZWQ7CisJCX0KKworCQkvKiBzZXQgcGNpZURwbUxl dmVsIHRvIGxvd2VzdF9wY2llX2xldmVsX2VuYWJsZWQqLworCQlkYXRhLT5zbWNfc3RhdGVfdGFi bGUuR3JhcGhpY3NMZXZlbFswXS5wY2llRHBtTGV2ZWwgPSBsb3dlc3RfcGNpZV9sZXZlbF9lbmFi bGVkOworCisJCS8qIHNldCBwY2llRHBtTGV2ZWwgdG8gbWlkX3BjaWVfbGV2ZWxfZW5hYmxlZCov CisJCWRhdGEtPnNtY19zdGF0ZV90YWJsZS5HcmFwaGljc0xldmVsWzFdLnBjaWVEcG1MZXZlbCA9 IG1pZF9wY2llX2xldmVsX2VuYWJsZWQ7CisJfQorCS8qIGxldmVsIGNvdW50IHdpbGwgc2VuZCB0 byBzbWMgb25jZSBhdCBpbml0IHNtYyB0YWJsZSBhbmQgbmV2ZXIgY2hhbmdlKi8KKwlyZXN1bHQg PSB0b25nYV9jb3B5X2J5dGVzX3RvX3NtYyhod21nci0+c211bWdyLCBsZXZlbF9hcnJheV9hZHJl c3MsICh1aW50OF90ICopbGV2ZWxzLCAodWludDMyX3QpbGV2ZWxfYXJyYXlfc2l6ZSwgZGF0YS0+ c3JhbV9lbmQpOworCisJaWYgKDAgIT0gcmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OworCisJcmV0 dXJuIDA7Cit9CisKKy8qKgorICogUG9wdWxhdGVzIGFsbCBTTUMgTUNMSyBsZXZlbHMnIHN0cnVj dHVyZSBiYXNlZCBvbiB0aGUgdHJpbW1lZCBhbGxvd2VkIGRwbSBtZW1vcnkgY2xvY2sgc3RhdGVz CisgKgorICogQHBhcmFtICAgIGh3bWdyICAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIGhhcmR3YXJl IG1hbmFnZXIKKyAqLworCitzdGF0aWMgaW50IHRvbmdhX3BvcHVsYXRlX2FsbF9tZW1vcnlfbGV2 ZWxzKHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJdG9uZ2FfaHdtZ3IgKmRhdGEgPSAodG9u Z2FfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXN0cnVjdCB0b25nYV9kcG1fdGFibGUgKmRw bV90YWJsZSA9ICZkYXRhLT5kcG1fdGFibGU7CisJaW50IHJlc3VsdDsKKwkvKiBwb3B1bGF0ZSBN Q0xLIGRwbSB0YWJsZSB0byBTTVU3ICovCisJdWludDMyX3QgbGV2ZWxfYXJyYXlfYWRyZXNzID0g ZGF0YS0+ZHBtX3RhYmxlX3N0YXJ0ICsgb2Zmc2V0b2YoU01VNzJfRGlzY3JldGVfRHBtVGFibGUs IE1lbW9yeUxldmVsKTsKKwl1aW50MzJfdCBsZXZlbF9hcnJheV9zaXplID0gc2l6ZW9mKFNNVTcy X0Rpc2NyZXRlX01lbW9yeUxldmVsKSAqIFNNVTcyX01BWF9MRVZFTFNfTUVNT1JZOworCVNNVTcy X0Rpc2NyZXRlX01lbW9yeUxldmVsICpsZXZlbHMgPSBkYXRhLT5zbWNfc3RhdGVfdGFibGUuTWVt b3J5TGV2ZWw7CisJdWludDMyX3QgaTsKKworCW1lbXNldChsZXZlbHMsIDB4MDAsIGxldmVsX2Fy cmF5X3NpemUpOworCisJZm9yIChpID0gMDsgaSA8IGRwbV90YWJsZS0+bWNsa190YWJsZS5jb3Vu dDsgaSsrKSB7CisJCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgIT0gZHBtX3RhYmxlLT5tY2xrX3Rh YmxlLmRwbV9sZXZlbHNbaV0udmFsdWUpLAorCQkJImNhbiBub3QgcG9wdWxhdGUgbWVtb3J5IGxl dmVsIGFzIG1lbW9yeSBjbG9jayBpcyB6ZXJvIiwgcmV0dXJuIC0xKTsKKwkJcmVzdWx0ID0gdG9u Z2FfcG9wdWxhdGVfc2luZ2xlX21lbW9yeV9sZXZlbChod21nciwgZHBtX3RhYmxlLT5tY2xrX3Rh YmxlLmRwbV9sZXZlbHNbaV0udmFsdWUsCisJCQkmKGRhdGEtPnNtY19zdGF0ZV90YWJsZS5NZW1v cnlMZXZlbFtpXSkpOworCQlpZiAoMCAhPSByZXN1bHQpIHsKKwkJCXJldHVybiByZXN1bHQ7CisJ CX0KKwl9CisKKwkvKiBPbmx5IGVuYWJsZSBsZXZlbCAwIGZvciBub3cuKi8KKwlkYXRhLT5zbWNf c3RhdGVfdGFibGUuTWVtb3J5TGV2ZWxbMF0uRW5hYmxlZEZvckFjdGl2aXR5ID0gMTsKKworCS8q CisJKiBpbiBvcmRlciB0byBwcmV2ZW50IE1DIGFjdGl2aXR5IGZyb20gc3R1dHRlciBtb2RlIHRv IHB1c2ggRFBNIHVwLgorCSogdGhlIFVWRCBjaGFuZ2UgY29tcGxlbWVudHMgdGhpcyBieSBwdXR0 aW5nIHRoZSBNQ0xLIGluIGEgaGlnaGVyIHN0YXRlCisJKiBieSBkZWZhdWx0IHN1Y2ggdGhhdCB3 ZSBhcmUgbm90IGVmZmVjdGVkIGJ5IHVwIHRocmVzaG9sZCBvciBhbmQgTUNMSyBEUE0gbGF0ZW5j eS4KKwkqLworCWRhdGEtPnNtY19zdGF0ZV90YWJsZS5NZW1vcnlMZXZlbFswXS5BY3Rpdml0eUxl dmVsID0gMHgxRjsKKwlDT05WRVJUX0ZST01fSE9TVF9UT19TTUNfVVMoZGF0YS0+c21jX3N0YXRl X3RhYmxlLk1lbW9yeUxldmVsWzBdLkFjdGl2aXR5TGV2ZWwpOworCisJZGF0YS0+c21jX3N0YXRl X3RhYmxlLk1lbW9yeURwbUxldmVsQ291bnQgPSAodWludDhfdClkcG1fdGFibGUtPm1jbGtfdGFi bGUuY291bnQ7CisJZGF0YS0+ZHBtX2xldmVsX2VuYWJsZV9tYXNrLm1jbGtfZHBtX2VuYWJsZV9t YXNrID0gdG9uZ2FfZ2V0X2RwbV9sZXZlbF9lbmFibGVfbWFza192YWx1ZSgmZHBtX3RhYmxlLT5t Y2xrX3RhYmxlKTsKKwkvKiBzZXQgaGlnaGVzdCBsZXZlbCB3YXRlcm1hcmsgdG8gaGlnaCovCisJ ZGF0YS0+c21jX3N0YXRlX3RhYmxlLk1lbW9yeUxldmVsW2RwbV90YWJsZS0+bWNsa190YWJsZS5j b3VudC0xXS5EaXNwbGF5V2F0ZXJtYXJrID0gUFBTTUNfRElTUExBWV9XQVRFUk1BUktfSElHSDsK KworCS8qIGxldmVsIGNvdW50IHdpbGwgc2VuZCB0byBzbWMgb25jZSBhdCBpbml0IHNtYyB0YWJs ZSBhbmQgbmV2ZXIgY2hhbmdlKi8KKwlyZXN1bHQgPSB0b25nYV9jb3B5X2J5dGVzX3RvX3NtYyho d21nci0+c211bWdyLAorCQlsZXZlbF9hcnJheV9hZHJlc3MsICh1aW50OF90ICopbGV2ZWxzLCAo dWludDMyX3QpbGV2ZWxfYXJyYXlfc2l6ZSwgZGF0YS0+c3JhbV9lbmQpOworCisJaWYgKDAgIT0g cmVzdWx0KSB7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVj dCBUT05HQV9ETExfU1BFRURfU0VUVElORyB7CisJdWludDE2X3QgICAgICAgICAgICBNaW47ICAg ICAgICAgICAgICAgICAgICAgICAgICAvKiBNaW5pbXVtIERhdGEgUmF0ZSovCisJdWludDE2X3Qg ICAgICAgICAgICBNYXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIERhdGEg UmF0ZSovCisJdWludDMyX3QgCQkJZGxsX3NwZWVkOyAgICAgICAgICAgICAgICAgICAgIC8qIFRo ZSBkZXNpcmVkIERMTF9TUEVFRCBzZXR0aW5nKi8KK307CisKK3N0YXRpYyBpbnQgdG9uZ2FfcG9w dWxhdGVfY2xvY2tfc3RyZXRjaGVyX2RhdGFfdGFibGUoc3RydWN0IHBwX2h3bWdyICpod21ncikK K3sKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLSBVTFYgcmVsYXRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworc3RhdGljIGludCB0b25nYV9yZXNldF9z aW5nbGVfZHBtX3RhYmxlKAorCXN0cnVjdCBwcF9od21nciAqaHdtZ3IsCisJc3RydWN0IHRvbmdh X3NpbmdsZV9kcG1fdGFibGUgKmRwbV90YWJsZSwKKwl1aW50MzJfdCBjb3VudCkKK3sKKwl1aW50 MzJfdCBpOworCWlmICghKGNvdW50IDw9IE1BWF9SRUdVTEFSX0RQTV9OVU1CRVIpKQorCQlwcmlu dGsoS0VSTl9FUlIgIlsgcG93ZXJwbGF5IF0gRmF0YWwgZXJyb3IsIGNhbiBub3Qgc2V0IHVwIHNp bmdsZSBEUE0gXAorCQkJdGFibGUgZW50cmllcyB0byBleGNlZWQgbWF4IG51bWJlciEgXG4iKTsK KworCWRwbV90YWJsZS0+Y291bnQgPSBjb3VudDsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFR1VM QVJfRFBNX05VTUJFUjsgaSsrKSB7CisJCWRwbV90YWJsZS0+ZHBtX2xldmVsc1tpXS5lbmFibGVk ID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdG9uZ2Ffc2V0dXBfcGNp ZV90YWJsZV9lbnRyeSgKKwlzdHJ1Y3QgdG9uZ2Ffc2luZ2xlX2RwbV90YWJsZSAqZHBtX3RhYmxl LAorCXVpbnQzMl90IGluZGV4LCB1aW50MzJfdCBwY2llX2dlbiwKKwl1aW50MzJfdCBwY2llX2xh bmVzKQoreworCWRwbV90YWJsZS0+ZHBtX2xldmVsc1tpbmRleF0udmFsdWUgPSBwY2llX2dlbjsK KwlkcG1fdGFibGUtPmRwbV9sZXZlbHNbaW5kZXhdLnBhcmFtMSA9IHBjaWVfbGFuZXM7CisJZHBt X3RhYmxlLT5kcG1fbGV2ZWxzW2luZGV4XS5lbmFibGVkID0gMTsKK30KKworYm9vbCBpc19wY2ll X2dlbjNfc3VwcG9ydGVkKHVpbnQzMl90IHBjaWVfbGlua19zcGVlZF9jYXApCit7CisJaWYgKHBj aWVfbGlua19zcGVlZF9jYXAgJiBDQUlMX1BDSUVfTElOS19TUEVFRF9TVVBQT1JUX0dFTjMpCisJ CXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK2Jvb2wgaXNfcGNpZV9nZW4yX3N1cHBvcnRl ZCh1aW50MzJfdCBwY2llX2xpbmtfc3BlZWRfY2FwKQoreworCWlmIChwY2llX2xpbmtfc3BlZWRf Y2FwICYgQ0FJTF9QQ0lFX0xJTktfU1BFRURfU1VQUE9SVF9HRU4yKQorCQlyZXR1cm4gMTsKKwor CXJldHVybiAwOworfQorCisvKiBHZXQgdGhlIG5ldyBQQ0lFIHNwZWVkIGdpdmVuIHRoZSBBU0lD IFBDSUUgQ2FwIGFuZCB0aGUgTmV3U3RhdGUncyByZXF1ZXN0ZWQgUENJRSBzcGVlZCovCit1aW50 MTZfdCBnZXRfcGNpZV9nZW5fc3VwcG9ydCh1aW50MzJfdCBwY2llX2xpbmtfc3BlZWRfY2FwLCB1 aW50MTZfdCBuc19wY2llX2dlbikKK3sKKwl1aW50MzJfdCBhc2ljX3BjaWVfbGlua19zcGVlZF9j YXAgPSAocGNpZV9saW5rX3NwZWVkX2NhcCAmCisJCUNBSUxfQVNJQ19QQ0lFX0xJTktfU1BFRURf U1VQUE9SVF9NQVNLKTsKKwl1aW50MzJfdCBzeXNfcGNpZV9saW5rX3NwZWVkX2NhcCAgPSAocGNp ZV9saW5rX3NwZWVkX2NhcCAmCisJCUNBSUxfUENJRV9MSU5LX1NQRUVEX1NVUFBPUlRfTUFTSyk7 CisKKwlzd2l0Y2ggKGFzaWNfcGNpZV9saW5rX3NwZWVkX2NhcCkgeworCWNhc2UgQ0FJTF9BU0lD X1BDSUVfTElOS19TUEVFRF9TVVBQT1JUX0dFTjE6CisJCXJldHVybiBQUF9QQ0lFR2VuMTsKKwor CWNhc2UgQ0FJTF9BU0lDX1BDSUVfTElOS19TUEVFRF9TVVBQT1JUX0dFTjI6CisJCXJldHVybiBQ UF9QQ0lFR2VuMjsKKworCWNhc2UgQ0FJTF9BU0lDX1BDSUVfTElOS19TUEVFRF9TVVBQT1JUX0dF TjM6CisJCXJldHVybiBQUF9QQ0lFR2VuMzsKKworCWRlZmF1bHQ6CisJCWlmIChpc19wY2llX2dl bjNfc3VwcG9ydGVkKHN5c19wY2llX2xpbmtfc3BlZWRfY2FwKSAmJgorCQkJKG5zX3BjaWVfZ2Vu ID09IFBQX1BDSUVHZW4zKSkgeworCQkJcmV0dXJuIFBQX1BDSUVHZW4zOworCQl9IGVsc2UgaWYg KGlzX3BjaWVfZ2VuMl9zdXBwb3J0ZWQoc3lzX3BjaWVfbGlua19zcGVlZF9jYXApICYmCisJCQko KG5zX3BjaWVfZ2VuID09IFBQX1BDSUVHZW4zKSB8fCAobnNfcGNpZV9nZW4gPT0gUFBfUENJRUdl bjIpKSkgeworCQkJcmV0dXJuIFBQX1BDSUVHZW4yOworCQl9CisJfQorCisJcmV0dXJuIFBQX1BD SUVHZW4xOworfQorCit1aW50MTZfdCBnZXRfcGNpZV9sYW5lX3N1cHBvcnQodWludDMyX3QgcGNp ZV9sYW5lX3dpZHRoX2NhcCwgdWludDE2X3QgbnNfcGNpZV9sYW5lcykKK3sKKwlpbnQgaSwgajsK Kwl1aW50MTZfdCBuZXdfcGNpZV9sYW5lcyA9IG5zX3BjaWVfbGFuZXM7CisJdWludDE2X3QgcGNp ZV9sYW5lc1s3XSA9IHsxLCAyLCA0LCA4LCAxMiwgMTYsIDMyfTsKKworCXN3aXRjaCAocGNpZV9s YW5lX3dpZHRoX2NhcCkgeworCWNhc2UgMDoKKwkJcHJpbnRrKEtFUk5fRVJSICJbIHBvd2VycGxh eSBdIE5vIHZhbGlkIFBDSUUgbGFuZSB3aWR0aCByZXBvcnRlZCBieSBDQUlMISIpOworCQlicmVh azsKKwljYXNlIENBSUxfUENJRV9MSU5LX1dJRFRIX1NVUFBPUlRfWDE6CisJCW5ld19wY2llX2xh bmVzID0gMTsKKwkJYnJlYWs7CisJY2FzZSBDQUlMX1BDSUVfTElOS19XSURUSF9TVVBQT1JUX1gy OgorCQluZXdfcGNpZV9sYW5lcyA9IDI7CisJCWJyZWFrOworCWNhc2UgQ0FJTF9QQ0lFX0xJTktf V0lEVEhfU1VQUE9SVF9YNDoKKwkJbmV3X3BjaWVfbGFuZXMgPSA0OworCQlicmVhazsKKwljYXNl IENBSUxfUENJRV9MSU5LX1dJRFRIX1NVUFBPUlRfWDg6CisJCW5ld19wY2llX2xhbmVzID0gODsK KwkJYnJlYWs7CisJY2FzZSBDQUlMX1BDSUVfTElOS19XSURUSF9TVVBQT1JUX1gxMjoKKwkJbmV3 X3BjaWVfbGFuZXMgPSAxMjsKKwkJYnJlYWs7CisJY2FzZSBDQUlMX1BDSUVfTElOS19XSURUSF9T VVBQT1JUX1gxNjoKKwkJbmV3X3BjaWVfbGFuZXMgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSBDQUlM X1BDSUVfTElOS19XSURUSF9TVVBQT1JUX1gzMjoKKwkJbmV3X3BjaWVfbGFuZXMgPSAzMjsKKwkJ YnJlYWs7CisJZGVmYXVsdDoKKwkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQkJaWYgKG5z X3BjaWVfbGFuZXMgPT0gcGNpZV9sYW5lc1tpXSkgeworCQkJCWlmIChwY2llX2xhbmVfd2lkdGhf Y2FwICYgKDB4MTAwMDAgPDwgaSkpIHsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIHsKKwkJCQkJ Zm9yIChqID0gaSAtIDE7IGogPj0gMDsgai0tKSB7CisJCQkJCQlpZiAocGNpZV9sYW5lX3dpZHRo X2NhcCAmICgweDEwMDAwIDw8IGopKSB7CisJCQkJCQkJbmV3X3BjaWVfbGFuZXMgPSBwY2llX2xh bmVzW2pdOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKGogPCAw KSB7CisJCQkJCQlmb3IgKGogPSBpICsgMTsgaiA8IDc7IGorKykgeworCQkJCQkJCWlmIChwY2ll X2xhbmVfd2lkdGhfY2FwICYgKDB4MTAwMDAgPDwgaikpIHsKKwkJCQkJCQkJbmV3X3BjaWVfbGFu ZXMgPSBwY2llX2xhbmVzW2pdOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJ CQkJCQlpZiAoaiA+IDcpCisJCQkJCQkJcHJpbnRrKEtFUk5fRVJSICJbIHBvd2VycGxheSBdIENh bm5vdCBmaW5kIGEgdmFsaWQgUENJRSBsYW5lIHdpZHRoISIpOworCQkJCQl9CisJCQkJfQorCQkJ CWJyZWFrOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiBuZXdfcGNpZV9sYW5l czsKK30KKworc3RhdGljIGludCB0b25nYV9zZXR1cF9kZWZhdWx0X3BjaWVfdGFibGVzKHN0cnVj dCBwcF9od21nciAqaHdtZ3IpCit7CisJdG9uZ2FfaHdtZ3IgKmRhdGEgPSAodG9uZ2FfaHdtZ3Ig KikoaHdtZ3ItPmJhY2tlbmQpOworCXN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICpwcHRh YmxlX2luZm8gPSAoc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKikoaHdtZ3ItPnBwdGFi bGUpOworCXBobV9wcHRfdjFfcGNpZV90YWJsZSAqcGNpZV90YWJsZSA9IHBwdGFibGVfaW5mby0+ cGNpZV90YWJsZTsKKwl1aW50MzJfdCBpLCBtYXhFbnRyeTsKKworCWlmIChkYXRhLT51c2VfcGNp ZV9wZXJmb3JtYW5jZV9sZXZlbHMgJiYgIWRhdGEtPnVzZV9wY2llX3Bvd2VyX3NhdmluZ19sZXZl bHMpIHsKKwkJZGF0YS0+cGNpZV9nZW5fcG93ZXJfc2F2aW5nID0gZGF0YS0+cGNpZV9nZW5fcGVy Zm9ybWFuY2U7CisJCWRhdGEtPnBjaWVfbGFuZV9wb3dlcl9zYXZpbmcgPSBkYXRhLT5wY2llX2xh bmVfcGVyZm9ybWFuY2U7CisJfSBlbHNlIGlmICghZGF0YS0+dXNlX3BjaWVfcGVyZm9ybWFuY2Vf bGV2ZWxzICYmIGRhdGEtPnVzZV9wY2llX3Bvd2VyX3NhdmluZ19sZXZlbHMpIHsKKwkJZGF0YS0+ cGNpZV9nZW5fcGVyZm9ybWFuY2UgPSBkYXRhLT5wY2llX2dlbl9wb3dlcl9zYXZpbmc7CisJCWRh dGEtPnBjaWVfbGFuZV9wZXJmb3JtYW5jZSA9IGRhdGEtPnBjaWVfbGFuZV9wb3dlcl9zYXZpbmc7 CisJfQorCisJdG9uZ2FfcmVzZXRfc2luZ2xlX2RwbV90YWJsZShod21nciwgJmRhdGEtPmRwbV90 YWJsZS5wY2llX3NwZWVkX3RhYmxlLCBTTVU3Ml9NQVhfTEVWRUxTX0xJTkspOworCisJaWYgKHBj aWVfdGFibGUgIT0gTlVMTCkgeworCQkvKgorCQkqIG1heEVudHJ5IGlzIHVzZWQgdG8gbWFrZSBz dXJlIHdlIHJlc2VydmUgb25lIFBDSUUgbGV2ZWwgZm9yIGJvb3QgbGV2ZWwgKGZpeCBmb3IgQStB IFBTUFAgaXNzdWUpLgorCQkqIElmIFBDSUUgdGFibGUgZnJvbSBQUFRhYmxlIGhhdmUgVUxWIGVu dHJ5ICsgOCBlbnRyaWVzLCB0aGVuIGlnbm9yZSB0aGUgbGFzdCBlbnRyeS4KKwkJKi8KKwkJbWF4 RW50cnkgPSAoU01VNzJfTUFYX0xFVkVMU19MSU5LIDwgcGNpZV90YWJsZS0+Y291bnQpID8KKwkJ CQkJCVNNVTcyX01BWF9MRVZFTFNfTElOSyA6IHBjaWVfdGFibGUtPmNvdW50OworCQlmb3IgKGkg PSAxOyBpIDwgbWF4RW50cnk7IGkrKykgeworCQkJdG9uZ2Ffc2V0dXBfcGNpZV90YWJsZV9lbnRy eSgmZGF0YS0+ZHBtX3RhYmxlLnBjaWVfc3BlZWRfdGFibGUsIGktMSwKKwkJCQlnZXRfcGNpZV9n ZW5fc3VwcG9ydChkYXRhLT5wY2llX2dlbl9jYXAsIHBjaWVfdGFibGUtPmVudHJpZXNbaV0uZ2Vu X3NwZWVkKSwKKwkJCQlnZXRfcGNpZV9sYW5lX3N1cHBvcnQoZGF0YS0+cGNpZV9sYW5lX2NhcCwg UFBfTWF4X1BDSUVMYW5lKSk7CisJCX0KKwkJZGF0YS0+ZHBtX3RhYmxlLnBjaWVfc3BlZWRfdGFi bGUuY291bnQgPSBtYXhFbnRyeSAtIDE7CisJfSBlbHNlIHsKKwkJLyogSGFyZGNvZGUgUGNpZSBU YWJsZSAqLworCQl0b25nYV9zZXR1cF9wY2llX3RhYmxlX2VudHJ5KCZkYXRhLT5kcG1fdGFibGUu cGNpZV9zcGVlZF90YWJsZSwgMCwKKwkJCWdldF9wY2llX2dlbl9zdXBwb3J0KGRhdGEtPnBjaWVf Z2VuX2NhcCwgUFBfTWluX1BDSUVHZW4pLAorCQkJZ2V0X3BjaWVfbGFuZV9zdXBwb3J0KGRhdGEt PnBjaWVfbGFuZV9jYXAsIFBQX01heF9QQ0lFTGFuZSkpOworCQl0b25nYV9zZXR1cF9wY2llX3Rh YmxlX2VudHJ5KCZkYXRhLT5kcG1fdGFibGUucGNpZV9zcGVlZF90YWJsZSwgMSwKKwkJCWdldF9w Y2llX2dlbl9zdXBwb3J0KGRhdGEtPnBjaWVfZ2VuX2NhcCwgUFBfTWluX1BDSUVHZW4pLAorCQkJ Z2V0X3BjaWVfbGFuZV9zdXBwb3J0KGRhdGEtPnBjaWVfbGFuZV9jYXAsIFBQX01heF9QQ0lFTGFu ZSkpOworCQl0b25nYV9zZXR1cF9wY2llX3RhYmxlX2VudHJ5KCZkYXRhLT5kcG1fdGFibGUucGNp ZV9zcGVlZF90YWJsZSwgMiwKKwkJCWdldF9wY2llX2dlbl9zdXBwb3J0KGRhdGEtPnBjaWVfZ2Vu X2NhcCwgUFBfTWF4X1BDSUVHZW4pLAorCQkJZ2V0X3BjaWVfbGFuZV9zdXBwb3J0KGRhdGEtPnBj aWVfbGFuZV9jYXAsIFBQX01heF9QQ0lFTGFuZSkpOworCQl0b25nYV9zZXR1cF9wY2llX3RhYmxl X2VudHJ5KCZkYXRhLT5kcG1fdGFibGUucGNpZV9zcGVlZF90YWJsZSwgMywKKwkJCWdldF9wY2ll X2dlbl9zdXBwb3J0KGRhdGEtPnBjaWVfZ2VuX2NhcCwgUFBfTWF4X1BDSUVHZW4pLAorCQkJZ2V0 X3BjaWVfbGFuZV9zdXBwb3J0KGRhdGEtPnBjaWVfbGFuZV9jYXAsIFBQX01heF9QQ0lFTGFuZSkp OworCQl0b25nYV9zZXR1cF9wY2llX3RhYmxlX2VudHJ5KCZkYXRhLT5kcG1fdGFibGUucGNpZV9z cGVlZF90YWJsZSwgNCwKKwkJCWdldF9wY2llX2dlbl9zdXBwb3J0KGRhdGEtPnBjaWVfZ2VuX2Nh cCwgUFBfTWF4X1BDSUVHZW4pLAorCQkJZ2V0X3BjaWVfbGFuZV9zdXBwb3J0KGRhdGEtPnBjaWVf bGFuZV9jYXAsIFBQX01heF9QQ0lFTGFuZSkpOworCQl0b25nYV9zZXR1cF9wY2llX3RhYmxlX2Vu dHJ5KCZkYXRhLT5kcG1fdGFibGUucGNpZV9zcGVlZF90YWJsZSwgNSwKKwkJCWdldF9wY2llX2dl bl9zdXBwb3J0KGRhdGEtPnBjaWVfZ2VuX2NhcCwgUFBfTWF4X1BDSUVHZW4pLAorCQkJZ2V0X3Bj aWVfbGFuZV9zdXBwb3J0KGRhdGEtPnBjaWVfbGFuZV9jYXAsIFBQX01heF9QQ0lFTGFuZSkpOwor CQlkYXRhLT5kcG1fdGFibGUucGNpZV9zcGVlZF90YWJsZS5jb3VudCA9IDY7CisJfQorCS8qIFBv cHVsYXRlIGxhc3QgbGV2ZWwgZm9yIGJvb3QgUENJRSBsZXZlbCwgYnV0IGRvIG5vdCBpbmNyZW1l bnQgY291bnQuICovCisJdG9uZ2Ffc2V0dXBfcGNpZV90YWJsZV9lbnRyeSgmZGF0YS0+ZHBtX3Rh YmxlLnBjaWVfc3BlZWRfdGFibGUsCisJCWRhdGEtPmRwbV90YWJsZS5wY2llX3NwZWVkX3RhYmxl LmNvdW50LAorCQlnZXRfcGNpZV9nZW5fc3VwcG9ydChkYXRhLT5wY2llX2dlbl9jYXAsIFBQX01p bl9QQ0lFR2VuKSwKKwkJZ2V0X3BjaWVfbGFuZV9zdXBwb3J0KGRhdGEtPnBjaWVfbGFuZV9jYXAs IFBQX01heF9QQ0lFTGFuZSkpOworCisJcmV0dXJuIDA7CisKK30KKworLyoKKyAqIFRoaXMgZnVu Y3Rpb24gaXMgdG8gaW5pdGFsaXplIGFsbCBEUE0gc3RhdGUgdGFibGVzIGZvciBTTVU3IGJhc2Vk IG9uIHRoZSBkZXBlbmRlbmN5IHRhYmxlLgorICogRHluYW1pYyBzdGF0ZSBwYXRjaGluZyBmdW5j dGlvbiB3aWxsIHRoZW4gdHJpbSB0aGVzZSBzdGF0ZSB0YWJsZXMgdG8gdGhlIGFsbG93ZWQgcmFu Z2UgYmFzZWQKKyAqIG9uIHRoZSBwb3dlciBwb2xpY3kgb3IgZXh0ZXJuYWwgY2xpZW50IHJlcXVl c3RzLCBzdWNoIGFzIFVWRCByZXF1ZXN0LCBldGMuCisgKi8KK3N0YXRpYyBpbnQgdG9uZ2Ffc2V0 dXBfZGVmYXVsdF9kcG1fdGFibGVzKHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJdG9uZ2Ff aHdtZ3IgKmRhdGEgPSAodG9uZ2FfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXN0cnVjdCBw aG1fcHB0X3YxX2luZm9ybWF0aW9uICpwcHRhYmxlX2luZm8gPSAoc3RydWN0IHBobV9wcHRfdjFf aW5mb3JtYXRpb24gKikoaHdtZ3ItPnBwdGFibGUpOworCXVpbnQzMl90IGk7CisKKwlwaG1fcHB0 X3YxX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZSAqYWxsb3dlZF92ZGRfc2Nsa190YWJs ZSA9CisJCXBwdGFibGVfaW5mby0+dmRkX2RlcF9vbl9zY2xrOworCXBobV9wcHRfdjFfY2xvY2tf dm9sdGFnZV9kZXBlbmRlbmN5X3RhYmxlICphbGxvd2VkX3ZkZF9tY2xrX3RhYmxlID0KKwkJcHB0 YWJsZV9pbmZvLT52ZGRfZGVwX29uX21jbGs7CisKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKGFsbG93 ZWRfdmRkX3NjbGtfdGFibGUgIT0gTlVMTCwKKwkJIlNDTEsgZGVwZW5kZW5jeSB0YWJsZSBpcyBt aXNzaW5nLiBUaGlzIHRhYmxlIGlzIG1hbmRhdG9yeSIsIHJldHVybiAtMSk7CisJUFBfQVNTRVJU X1dJVEhfQ09ERShhbGxvd2VkX3ZkZF9zY2xrX3RhYmxlLT5jb3VudCA+PSAxLAorCQkiU0NMSyBk ZXBlbmRlbmN5IHRhYmxlIGhhcyB0byBoYXZlIGlzIG1pc3NpbmcuIFRoaXMgdGFibGUgaXMgbWFu ZGF0b3J5IiwgcmV0dXJuIC0xKTsKKworCVBQX0FTU0VSVF9XSVRIX0NPREUoYWxsb3dlZF92ZGRf bWNsa190YWJsZSAhPSBOVUxMLAorCQkiTUNMSyBkZXBlbmRlbmN5IHRhYmxlIGlzIG1pc3Npbmcu IFRoaXMgdGFibGUgaXMgbWFuZGF0b3J5IiwgcmV0dXJuIC0xKTsKKwlQUF9BU1NFUlRfV0lUSF9D T0RFKGFsbG93ZWRfdmRkX21jbGtfdGFibGUtPmNvdW50ID49IDEsCisJCSJWTUNMSyBkZXBlbmRl bmN5IHRhYmxlIGhhcyB0byBoYXZlIGlzIG1pc3NpbmcuIFRoaXMgdGFibGUgaXMgbWFuZGF0b3J5 IiwgcmV0dXJuIC0xKTsKKworCS8qIGNsZWFyIHRoZSBzdGF0ZSB0YWJsZSB0byByZXNldCBldmVy eXRoaW5nIHRvIGRlZmF1bHQgKi8KKwltZW1zZXQoJihkYXRhLT5kcG1fdGFibGUpLCAweDAwLCBz aXplb2YoZGF0YS0+ZHBtX3RhYmxlKSk7CisJdG9uZ2FfcmVzZXRfc2luZ2xlX2RwbV90YWJsZSho d21nciwgJmRhdGEtPmRwbV90YWJsZS5zY2xrX3RhYmxlLCBTTVU3Ml9NQVhfTEVWRUxTX0dSQVBI SUNTKTsKKwl0b25nYV9yZXNldF9zaW5nbGVfZHBtX3RhYmxlKGh3bWdyLCAmZGF0YS0+ZHBtX3Rh YmxlLm1jbGtfdGFibGUsIFNNVTcyX01BWF9MRVZFTFNfTUVNT1JZKTsKKwkvKiB0b25nYV9yZXNl dF9zaW5nbGVfZHBtX3RhYmxlKGh3bWdyLCAmdG9uZ2FfaHdtZ3ItPmRwbV90YWJsZS5WZGRjVGFi bGUsIFNNVTcyX01BWF9MRVZFTFNfVkREQyk7ICovCisJLyogdG9uZ2FfcmVzZXRfc2luZ2xlX2Rw bV90YWJsZShod21nciwgJnRvbmdhX2h3bWdyLT5kcG1fdGFibGUudmRkX2dmeF90YWJsZSwgU01V NzJfTUFYX0xFVkVMU19WRERHRlgpOyovCisJLyogdG9uZ2FfcmVzZXRfc2luZ2xlX2RwbV90YWJs ZShod21nciwgJnRvbmdhX2h3bWdyLT5kcG1fdGFibGUudmRkX2NpX3RhYmxlLCBTTVU3Ml9NQVhf TEVWRUxTX1ZERENJKTsqLworCS8qIHRvbmdhX3Jlc2V0X3NpbmdsZV9kcG1fdGFibGUoaHdtZ3Is ICZ0b25nYV9od21nci0+ZHBtX3RhYmxlLm12ZGRfdGFibGUsIFNNVTcyX01BWF9MRVZFTFNfTVZE RCk7Ki8KKworCVBQX0FTU0VSVF9XSVRIX0NPREUoYWxsb3dlZF92ZGRfc2Nsa190YWJsZSAhPSBO VUxMLAorCQkiU0NMSyBkZXBlbmRlbmN5IHRhYmxlIGlzIG1pc3NpbmcuIFRoaXMgdGFibGUgaXMg bWFuZGF0b3J5IiwgcmV0dXJuIC0xKTsKKwkvKiBJbml0aWFsaXplIFNjbGsgRFBNIHRhYmxlIGJh c2VkIG9uIGFsbG93IFNjbGsgdmFsdWVzKi8KKwlkYXRhLT5kcG1fdGFibGUuc2Nsa190YWJsZS5j b3VudCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWxsb3dlZF92ZGRfc2Nsa190YWJsZS0+Y291 bnQ7IGkrKykgeworCQlpZiAoaSA9PSAwIHx8IGRhdGEtPmRwbV90YWJsZS5zY2xrX3RhYmxlLmRw bV9sZXZlbHNbZGF0YS0+ZHBtX3RhYmxlLnNjbGtfdGFibGUuY291bnQtMV0udmFsdWUgIT0KKwkJ CQlhbGxvd2VkX3ZkZF9zY2xrX3RhYmxlLT5lbnRyaWVzW2ldLmNsaykgeworCQkJZGF0YS0+ZHBt X3RhYmxlLnNjbGtfdGFibGUuZHBtX2xldmVsc1tkYXRhLT5kcG1fdGFibGUuc2Nsa190YWJsZS5j b3VudF0udmFsdWUgPQorCQkJCWFsbG93ZWRfdmRkX3NjbGtfdGFibGUtPmVudHJpZXNbaV0uY2xr OworCQkJZGF0YS0+ZHBtX3RhYmxlLnNjbGtfdGFibGUuZHBtX2xldmVsc1tkYXRhLT5kcG1fdGFi bGUuc2Nsa190YWJsZS5jb3VudF0uZW5hYmxlZCA9IDE7IC8qKGk9PTApID8gMSA6IDA7IHRvIGRv ICovCisJCQlkYXRhLT5kcG1fdGFibGUuc2Nsa190YWJsZS5jb3VudCsrOworCQl9CisJfQorCisJ UFBfQVNTRVJUX1dJVEhfQ09ERShhbGxvd2VkX3ZkZF9tY2xrX3RhYmxlICE9IE5VTEwsCisJCSJN Q0xLIGRlcGVuZGVuY3kgdGFibGUgaXMgbWlzc2luZy4gVGhpcyB0YWJsZSBpcyBtYW5kYXRvcnki LCByZXR1cm4gLTEpOworCS8qIEluaXRpYWxpemUgTWNsayBEUE0gdGFibGUgYmFzZWQgb24gYWxs b3cgTWNsayB2YWx1ZXMgKi8KKwlkYXRhLT5kcG1fdGFibGUubWNsa190YWJsZS5jb3VudCA9IDA7 CisJZm9yIChpID0gMDsgaSA8IGFsbG93ZWRfdmRkX21jbGtfdGFibGUtPmNvdW50OyBpKyspIHsK KwkJaWYgKGkgPT0gMCB8fCBkYXRhLT5kcG1fdGFibGUubWNsa190YWJsZS5kcG1fbGV2ZWxzW2Rh dGEtPmRwbV90YWJsZS5tY2xrX3RhYmxlLmNvdW50LTFdLnZhbHVlICE9CisJCQlhbGxvd2VkX3Zk ZF9tY2xrX3RhYmxlLT5lbnRyaWVzW2ldLmNsaykgeworCQkJZGF0YS0+ZHBtX3RhYmxlLm1jbGtf dGFibGUuZHBtX2xldmVsc1tkYXRhLT5kcG1fdGFibGUubWNsa190YWJsZS5jb3VudF0udmFsdWUg PQorCQkJCWFsbG93ZWRfdmRkX21jbGtfdGFibGUtPmVudHJpZXNbaV0uY2xrOworCQkJZGF0YS0+ ZHBtX3RhYmxlLm1jbGtfdGFibGUuZHBtX2xldmVsc1tkYXRhLT5kcG1fdGFibGUubWNsa190YWJs ZS5jb3VudF0uZW5hYmxlZCA9IDE7IC8qKGk9PTApID8gMSA6IDA7ICovCisJCQlkYXRhLT5kcG1f dGFibGUubWNsa190YWJsZS5jb3VudCsrOworCQl9CisJfQorCisJLyogSW5pdGlhbGl6ZSBWZGRj IERQTSB0YWJsZSBiYXNlZCBvbiBhbGxvdyBWZGRjIHZhbHVlcy4gIEFuZCBwb3B1bGF0ZSBjb3Jy ZXNwb25kaW5nIHN0ZCB2YWx1ZXMuICovCisJZm9yIChpID0gMDsgaSA8IGFsbG93ZWRfdmRkX3Nj bGtfdGFibGUtPmNvdW50OyBpKyspIHsKKwkJZGF0YS0+ZHBtX3RhYmxlLnZkZGNfdGFibGUuZHBt X2xldmVsc1tpXS52YWx1ZSA9IGFsbG93ZWRfdmRkX21jbGtfdGFibGUtPmVudHJpZXNbaV0udmRk YzsKKwkJLyogdG9uZ2FfaHdtZ3ItPmRwbV90YWJsZS5WZGRjVGFibGUuZHBtX2xldmVsc1tpXS5w YXJhbTEgPSBzdGRWb2x0YWdlVGFibGUtPmVudHJpZXNbaV0uTGVha2FnZTsgKi8KKwkJLyogcGFy YW0xIGlzIGZvciBjb3JyZXNwb25kaW5nIHN0ZCB2b2x0YWdlICovCisJCWRhdGEtPmRwbV90YWJs ZS52ZGRjX3RhYmxlLmRwbV9sZXZlbHNbaV0uZW5hYmxlZCA9IDE7CisJfQorCWRhdGEtPmRwbV90 YWJsZS52ZGRjX3RhYmxlLmNvdW50ID0gYWxsb3dlZF92ZGRfc2Nsa190YWJsZS0+Y291bnQ7CisK KwlpZiAoTlVMTCAhPSBhbGxvd2VkX3ZkZF9tY2xrX3RhYmxlKSB7CisJCS8qIEluaXRpYWxpemUg VmRkY2kgRFBNIHRhYmxlIGJhc2VkIG9uIGFsbG93IE1jbGsgdmFsdWVzICovCisJCWZvciAoaSA9 IDA7IGkgPCBhbGxvd2VkX3ZkZF9tY2xrX3RhYmxlLT5jb3VudDsgaSsrKSB7CisJCQlkYXRhLT5k cG1fdGFibGUudmRkX2NpX3RhYmxlLmRwbV9sZXZlbHNbaV0udmFsdWUgPSBhbGxvd2VkX3ZkZF9t Y2xrX3RhYmxlLT5lbnRyaWVzW2ldLnZkZGNpOworCQkJZGF0YS0+ZHBtX3RhYmxlLnZkZF9jaV90 YWJsZS5kcG1fbGV2ZWxzW2ldLmVuYWJsZWQgPSAxOworCQkJZGF0YS0+ZHBtX3RhYmxlLm12ZGRf dGFibGUuZHBtX2xldmVsc1tpXS52YWx1ZSA9IGFsbG93ZWRfdmRkX21jbGtfdGFibGUtPmVudHJp ZXNbaV0ubXZkZDsKKwkJCWRhdGEtPmRwbV90YWJsZS5tdmRkX3RhYmxlLmRwbV9sZXZlbHNbaV0u ZW5hYmxlZCA9IDE7CisJCX0KKwkJZGF0YS0+ZHBtX3RhYmxlLnZkZF9jaV90YWJsZS5jb3VudCA9 IGFsbG93ZWRfdmRkX21jbGtfdGFibGUtPmNvdW50OworCQlkYXRhLT5kcG1fdGFibGUubXZkZF90 YWJsZS5jb3VudCA9IGFsbG93ZWRfdmRkX21jbGtfdGFibGUtPmNvdW50OworCX0KKworCS8qIHNl dHVwIFBDSUUgZ2VuIHNwZWVkIGxldmVscyovCisJdG9uZ2Ffc2V0dXBfZGVmYXVsdF9wY2llX3Rh Ymxlcyhod21ncik7CisKKwkvKiBzYXZlIGEgY29weSBvZiB0aGUgZGVmYXVsdCBEUE0gdGFibGUq LworCW1lbWNweSgmKGRhdGEtPmdvbGRlbl9kcG1fdGFibGUpLCAmKGRhdGEtPmRwbV90YWJsZSks IHNpemVvZihzdHJ1Y3QgdG9uZ2FfZHBtX3RhYmxlKSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50 IHRvbmdhX3BvcHVsYXRlX3NtY19pbml0aWFsX3N0YXRlKHN0cnVjdCBwcF9od21nciAqaHdtZ3Is CisJCWNvbnN0IHN0cnVjdCB0b25nYV9wb3dlcl9zdGF0ZSAqYm9vdFN0YXRlKQoreworCXRvbmdh X2h3bWdyICpkYXRhID0gKHRvbmdhX2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKwlzdHJ1Y3Qg cGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqcHB0YWJsZV9pbmZvID0gKHN0cnVjdCBwaG1fcHB0X3Yx X2luZm9ybWF0aW9uICopKGh3bWdyLT5wcHRhYmxlKTsKKwl1aW50OF90IGNvdW50LCBsZXZlbDsK KworCWNvdW50ID0gKHVpbnQ4X3QpIChwcHRhYmxlX2luZm8tPnZkZF9kZXBfb25fc2Nsay0+Y291 bnQpOworCWZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IGNvdW50OyBsZXZlbCsrKSB7CisJCWlmIChw cHRhYmxlX2luZm8tPnZkZF9kZXBfb25fc2Nsay0+ZW50cmllc1tsZXZlbF0uY2xrID49CisJCQli b290U3RhdGUtPnBlcmZvcm1hbmNlX2xldmVsc1swXS5lbmdpbmVfY2xvY2spIHsKKwkJCWRhdGEt PnNtY19zdGF0ZV90YWJsZS5HcmFwaGljc0Jvb3RMZXZlbCA9IGxldmVsOworCQkJYnJlYWs7CisJ CX0KKwl9CisKKwljb3VudCA9ICh1aW50OF90KSAocHB0YWJsZV9pbmZvLT52ZGRfZGVwX29uX21j bGstPmNvdW50KTsKKwlmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBjb3VudDsgbGV2ZWwrKykgewor CQlpZiAocHB0YWJsZV9pbmZvLT52ZGRfZGVwX29uX21jbGstPmVudHJpZXNbbGV2ZWxdLmNsayA+ PQorCQkJYm9vdFN0YXRlLT5wZXJmb3JtYW5jZV9sZXZlbHNbMF0ubWVtb3J5X2Nsb2NrKSB7CisJ CQlkYXRhLT5zbWNfc3RhdGVfdGFibGUuTWVtb3J5Qm9vdExldmVsID0gbGV2ZWw7CisJCQlicmVh azsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIEluaXRpYWxpemVzIHRoZSBT TUMgdGFibGUgYW5kIHVwbG9hZHMgaXQKKyAqCisgKiBAcGFyYW0gICAgaHdtZ3IgIHRoZSBhZGRy ZXNzIG9mIHRoZSBwb3dlcnBsYXkgaGFyZHdhcmUgbWFuYWdlci4KKyAqIEBwYXJhbSAgICBwSW5w dXQgIHRoZSBwb2ludGVyIHRvIGlucHV0IGRhdGEgKFBvd2VyU3RhdGUpCisgKiBAcmV0dXJuICAg YWx3YXlzIDAKKyAqLworaW50IHRvbmdhX2luaXRfc21jX3RhYmxlKHN0cnVjdCBwcF9od21nciAq aHdtZ3IpCit7CisJaW50IHJlc3VsdDsKKwl0b25nYV9od21nciAqZGF0YSA9ICh0b25nYV9od21n ciAqKShod21nci0+YmFja2VuZCk7CisJc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKnBw dGFibGVfaW5mbyA9IChzdHJ1Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqKShod21nci0+cHB0 YWJsZSk7CisJU01VNzJfRGlzY3JldGVfRHBtVGFibGUgICp0YWJsZSA9ICYoZGF0YS0+c21jX3N0 YXRlX3RhYmxlKTsKKwljb25zdCBwaHdfdG9uZ2FfdWx2X3Bhcm0gKnVsdiA9ICYoZGF0YS0+dWx2 KTsKKwl1aW50OF90IGk7CisJUEVDSV9SZWdpc3RyeVZhbHVlIHJlZ192YWx1ZTsKKwlwcF9hdG9t Y3RybF9ncGlvX3Bpbl9hc3NpZ25tZW50IGdwaW9fcGluX2Fzc2lnbm1lbnQ7CisKKwlyZXN1bHQg PSB0b25nYV9zZXR1cF9kZWZhdWx0X2RwbV90YWJsZXMoaHdtZ3IpOworCVBQX0FTU0VSVF9XSVRI X0NPREUoMCA9PSByZXN1bHQsCisJCSJGYWlsZWQgdG8gc2V0dXAgZGVmYXVsdCBEUE0gdGFibGVz ISIsIHJldHVybiByZXN1bHQ7KTsKKwltZW1zZXQoJihkYXRhLT5zbWNfc3RhdGVfdGFibGUpLCAw eDAwLCBzaXplb2YoZGF0YS0+c21jX3N0YXRlX3RhYmxlKSk7CisJaWYgKFRPTkdBX1ZPTFRBR0Vf Q09OVFJPTF9OT05FICE9IGRhdGEtPnZvbHRhZ2VfY29udHJvbCkgeworCQl0b25nYV9wb3B1bGF0 ZV9zbWNfdm9sdGFnZV90YWJsZXMoaHdtZ3IsIHRhYmxlKTsKKwl9CisKKwlpZiAocGhtX2NhcF9l bmFibGVkKGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywKKwkJCVBITV9Q bGF0Zm9ybUNhcHNfQXV0b21hdGljRENUcmFuc2l0aW9uKSkgeworCQl0YWJsZS0+U3lzdGVtRmxh Z3MgfD0gUFBTTUNfU1lTVEVNRkxBR19HUElPX0RDOworCX0KKworCWlmIChwaG1fY2FwX2VuYWJs ZWQoaHdtZ3ItPnBsYXRmb3JtX2Rlc2NyaXB0b3IucGxhdGZvcm1DYXBzLAorCQkJUEhNX1BsYXRm b3JtQ2Fwc19TdGVwVmRkYykpIHsKKwkJdGFibGUtPlN5c3RlbUZsYWdzIHw9IFBQU01DX1NZU1RF TUZMQUdfU1RFUFZEREM7CisJfQorCisJaWYgKGRhdGEtPmlzX21lbW9yeV9HRERSNSkgeworCQl0 YWJsZS0+U3lzdGVtRmxhZ3MgfD0gUFBTTUNfU1lTVEVNRkxBR19HRERSNTsKKwl9CisKKwlpID0g UEhNX1JFQURfRklFTEQoaHdtZ3ItPmRldmljZSwgQ0NfTUNfTUFYX0NIQU5ORUwsIE5PT0ZDSEFO KTsKKworCWlmIChpID09IDEgfHwgaSA9PSAwKSB7CisJCXRhYmxlLT5TeXN0ZW1GbGFncyB8PSBQ UFNNQ19TWVNURU1GTEFHXzEyQ0hBTk5FTDsKKwl9CisKKwlpZiAodWx2LT51bHZfc3VwcG9ydGVk ICYmIHBwdGFibGVfaW5mby0+dXNfdWx2X3ZvbHRhZ2Vfb2Zmc2V0KSB7CisJCVBQX0FTU0VSVF9X SVRIX0NPREUoMCA9PSByZXN1bHQsCisJCQkiRmFpbGVkIHRvIGluaXRpYWxpemUgVUxWIHN0YXRl ISIsIHJldHVybiByZXN1bHQ7KTsKKworCQljZ3Nfd3JpdGVfaW5kX3JlZ2lzdGVyKGh3bWdyLT5k ZXZpY2UsIENHU19JTkRfUkVHX19TTUMsCisJCQlpeENHX1VMVl9QQVJBTUVURVIsIHVsdi0+Y2hf dWx2X3BhcmFtZXRlcik7CisJfQorCisJcmVzdWx0ID0gdG9uZ2FfcG9wdWxhdGVfc21jX2xpbmtf bGV2ZWwoaHdtZ3IsIHRhYmxlKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKDAgPT0gcmVzdWx0LAor CQkiRmFpbGVkIHRvIGluaXRpYWxpemUgTGluayBMZXZlbCEiLCByZXR1cm4gcmVzdWx0Oyk7CisK KwlyZXN1bHQgPSB0b25nYV9wb3B1bGF0ZV9hbGxfZ3JhcGhpY19sZXZlbHMoaHdtZ3IpOworCVBQ X0FTU0VSVF9XSVRIX0NPREUoMCA9PSByZXN1bHQsCisJCSJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBH cmFwaGljcyBMZXZlbCEiLCByZXR1cm4gcmVzdWx0Oyk7CisKKwlyZXN1bHQgPSB0b25nYV9wb3B1 bGF0ZV9hbGxfbWVtb3J5X2xldmVscyhod21ncik7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgwID09 IHJlc3VsdCwKKwkJIkZhaWxlZCB0byBpbml0aWFsaXplIE1lbW9yeSBMZXZlbCEiLCByZXR1cm4g cmVzdWx0Oyk7CisKKwlyZXN1bHQgPSB0b25nYV9wb3B1bGF0ZV9zbXZfYWNwaV9sZXZlbChod21n ciwgdGFibGUpOworCVBQX0FTU0VSVF9XSVRIX0NPREUoMCA9PSByZXN1bHQsCisJCSJGYWlsZWQg dG8gaW5pdGlhbGl6ZSBBQ1BJIExldmVsISIsIHJldHVybiByZXN1bHQ7KTsKKworCXJlc3VsdCA9 IHRvbmdhX3BvcHVsYXRlX3NtY192Y2VfbGV2ZWwoaHdtZ3IsIHRhYmxlKTsKKwlQUF9BU1NFUlRf V0lUSF9DT0RFKDAgPT0gcmVzdWx0LAorCQkiRmFpbGVkIHRvIGluaXRpYWxpemUgVkNFIExldmVs ISIsIHJldHVybiByZXN1bHQ7KTsKKworCXJlc3VsdCA9IHRvbmdhX3BvcHVsYXRlX3NtY19hY3Bf bGV2ZWwoaHdtZ3IsIHRhYmxlKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKDAgPT0gcmVzdWx0LAor CQkiRmFpbGVkIHRvIGluaXRpYWxpemUgQUNQIExldmVsISIsIHJldHVybiByZXN1bHQ7KTsKKwor CXJlc3VsdCA9IHRvbmdhX3BvcHVsYXRlX3NtY19zYW11X2xldmVsKGh3bWdyLCB0YWJsZSk7CisJ UFBfQVNTRVJUX1dJVEhfQ09ERSgwID09IHJlc3VsdCwKKwkJIkZhaWxlZCB0byBpbml0aWFsaXpl IFNBTVUgTGV2ZWwhIiwgcmV0dXJuIHJlc3VsdDspOworCisJLyogU2luY2Ugb25seSB0aGUgaW5p dGlhbCBzdGF0ZSBpcyBjb21wbGV0ZWx5IHNldCB1cCBhdCB0aGlzIHBvaW50ICh0aGUgb3RoZXIg c3RhdGVzIGFyZSBqdXN0IGNvcGllcyBvZiB0aGUgYm9vdCBzdGF0ZSkgd2Ugb25seSAqLworCS8q IG5lZWQgdG8gcG9wdWxhdGUgdGhlICBBUkIgc2V0dGluZ3MgZm9yIHRoZSBpbml0aWFsIHN0YXRl LiAqLworCXJlc3VsdCA9IHRvbmdhX3Byb2dyYW1fbWVtb3J5X3RpbWluZ19wYXJhbWV0ZXJzKGh3 bWdyKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKDAgPT0gcmVzdWx0LAorCQkiRmFpbGVkIHRvIFdy aXRlIEFSQiBzZXR0aW5ncyBmb3IgdGhlIGluaXRpYWwgc3RhdGUuIiwgcmV0dXJuIHJlc3VsdDsp OworCisJcmVzdWx0ID0gdG9uZ2FfcG9wdWxhdGVfc21jX2Jvb3RfbGV2ZWwoaHdtZ3IsIHRhYmxl KTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKDAgPT0gcmVzdWx0LAorCQkiRmFpbGVkIHRvIGluaXRp YWxpemUgQm9vdCBMZXZlbCEiLCByZXR1cm4gcmVzdWx0Oyk7CisKKwlpZiAocGhtX2NhcF9lbmFi bGVkKGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywKKwkJCVBITV9QbGF0 Zm9ybUNhcHNfQ2xvY2tTdHJldGNoZXIpKSB7CisJCXJlc3VsdCA9IHRvbmdhX3BvcHVsYXRlX2Ns b2NrX3N0cmV0Y2hlcl9kYXRhX3RhYmxlKGh3bWdyKTsKKwkJUFBfQVNTRVJUX1dJVEhfQ09ERSgw ID09IHJlc3VsdCwKKwkJCSJGYWlsZWQgdG8gcG9wdWxhdGUgQ2xvY2sgU3RyZXRjaGVyIERhdGEg VGFibGUhIiwgcmV0dXJuIHJlc3VsdDspOworCX0KKwl0YWJsZS0+R3JhcGhpY3NWb2x0YWdlQ2hh bmdlRW5hYmxlICA9IDE7CisJdGFibGUtPkdyYXBoaWNzVGhlcm1UaHJvdHRsZUVuYWJsZSAgPSAx OworCXRhYmxlLT5HcmFwaGljc0ludGVydmFsID0gMTsKKwl0YWJsZS0+Vm9sdGFnZUludGVydmFs ICA9IDE7CisJdGFibGUtPlRoZXJtYWxJbnRlcnZhbCAgPSAxOworCXRhYmxlLT5UZW1wZXJhdHVy ZUxpbWl0SGlnaCA9CisJCXBwdGFibGVfaW5mby0+Y2FjX2R0cF90YWJsZS0+dXNUYXJnZXRPcGVy YXRpbmdUZW1wICoKKwkJVE9OR0FfUTg4X0ZPUk1BVF9DT05WRVJTSU9OX1VOSVQ7CisJdGFibGUt PlRlbXBlcmF0dXJlTGltaXRMb3cgPQorCQkocHB0YWJsZV9pbmZvLT5jYWNfZHRwX3RhYmxlLT51 c1RhcmdldE9wZXJhdGluZ1RlbXAgLSAxKSAqCisJCVRPTkdBX1E4OF9GT1JNQVRfQ09OVkVSU0lP Tl9VTklUOworCXRhYmxlLT5NZW1vcnlWb2x0YWdlQ2hhbmdlRW5hYmxlICA9IDE7CisJdGFibGUt Pk1lbW9yeUludGVydmFsICA9IDE7CisJdGFibGUtPlZvbHRhZ2VSZXNwb25zZVRpbWUgID0gMDsK Kwl0YWJsZS0+UGhhc2VSZXNwb25zZVRpbWUgID0gMDsKKwl0YWJsZS0+TWVtb3J5VGhlcm1UaHJv dHRsZUVuYWJsZSAgPSAxOworCisJLyoKKwkqIENhaWwgcmVhZHMgY3VycmVudCBsaW5rIHN0YXR1 cyBhbmQgcmVwb3J0cyBpdCBhcyBjYXAgKHdlIGNhbm5vdCBjaGFuZ2UgdGhpcyBkdWUgdG8gc29t ZSBwcmV2aW91cyBpc3N1ZXMgd2UgaGFkKQorCSogU01DIGRyb3BzIHRoZSBsaW5rIHN0YXR1cyB0 byBsb3dlc3QgbGV2ZWwgYWZ0ZXIgZW5hYmxpbmcgRFBNIGJ5IFBvd2VyUGxheS4gQWZ0ZXIgcG5w IG9yIHRvZ2dsaW5nIENGLCBkcml2ZXIgZ2V0cyByZWxvYWRlZCBhZ2FpbgorCSogYnV0IHRoaXMg dGltZSBDYWlsIHJlYWRzIGN1cnJlbnQgbGluayBzdGF0dXMgd2hpY2ggd2FzIHNldCB0byBsb3cg YnkgU01DIGFuZCByZXBvcnRzIGl0IGFzIGNhcCB0byBwb3dlcnBsYXkKKwkqIFRvIGF2b2lkIGl0 LCB3ZSBzZXQgUENJZUJvb3RMaW5rTGV2ZWwgdG8gaGlnaGVzdCBkcG0gbGV2ZWwKKwkqLworCVBQ X0FTU0VSVF9XSVRIX0NPREUoKDEgPD0gZGF0YS0+ZHBtX3RhYmxlLnBjaWVfc3BlZWRfdGFibGUu Y291bnQpLAorCQkJIlRoZXJlIG11c3QgYmUgMSBvciBtb3JlIFBDSUUgbGV2ZWxzIGRlZmluZWQg aW4gUFBUYWJsZS4iLAorCQkJcmV0dXJuIC0xKTsKKworCXRhYmxlLT5QQ0llQm9vdExpbmtMZXZl bCA9ICh1aW50OF90KSAoZGF0YS0+ZHBtX3RhYmxlLnBjaWVfc3BlZWRfdGFibGUuY291bnQpOwor CisJdGFibGUtPlBDSWVHZW5JbnRlcnZhbCAgPSAxOworCisJcmVzdWx0ID0gdG9uZ2FfcG9wdWxh dGVfdnJfY29uZmlnKGh3bWdyLCB0YWJsZSk7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgwID09IHJl c3VsdCwKKwkJIkZhaWxlZCB0byBwb3B1bGF0ZSBWUkNvbmZpZyBzZXR0aW5nISIsIHJldHVybiBy ZXN1bHQpOworCisJdGFibGUtPlRoZXJtR3BpbyAgPSAxNzsKKwl0YWJsZS0+U2Nsa1N0ZXBTaXpl ID0gMHg0MDAwOworCisJcmVnX3ZhbHVlID0gMDsKKwlpZiAoKDAgPT0gcmVnX3ZhbHVlKSAmJgor CQkoMCA9PSBhdG9tY3RybF9nZXRfcHBfYXNzaWduX3Bpbihod21nciwKKwkJCVZERENfVlJIT1Rf R1BJT19QSU5JRCwgJmdwaW9fcGluX2Fzc2lnbm1lbnQpKSkgeworCQl0YWJsZS0+VlJIb3RHcGlv ID0gZ3Bpb19waW5fYXNzaWdubWVudC51Y19ncGlvX3Bpbl9iaXRfc2hpZnQ7CisJCXBobV9jYXBf c2V0KGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywKKwkJCVBITV9QbGF0 Zm9ybUNhcHNfUmVndWxhdG9ySG90KTsKKwl9IGVsc2UgeworCQl0YWJsZS0+VlJIb3RHcGlvID0g VE9OR0FfVU5VU0VEX0dQSU9fUElOOworCQlwaG1fY2FwX3Vuc2V0KGh3bWdyLT5wbGF0Zm9ybV9k ZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywKKwkJCVBITV9QbGF0Zm9ybUNhcHNfUmVndWxhdG9ySG90 KTsKKwl9CisKKwkvKiBBQ0RDIFN3aXRjaCBHUElPICovCisJcmVnX3ZhbHVlID0gMDsKKwlpZiAo KDAgPT0gcmVnX3ZhbHVlKSAmJgorCQkoMCA9PSBhdG9tY3RybF9nZXRfcHBfYXNzaWduX3Bpbiho d21nciwKKwkJCVBQX0FDX0RDX1NXSVRDSF9HUElPX1BJTklELCAmZ3Bpb19waW5fYXNzaWdubWVu dCkpKSB7CisJCXRhYmxlLT5BY0RjR3BpbyA9IGdwaW9fcGluX2Fzc2lnbm1lbnQudWNfZ3Bpb19w aW5fYml0X3NoaWZ0OworCQlwaG1fY2FwX3NldChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5w bGF0Zm9ybUNhcHMsCisJCQlQSE1fUGxhdGZvcm1DYXBzX0F1dG9tYXRpY0RDVHJhbnNpdGlvbik7 CisJfSBlbHNlIHsKKwkJdGFibGUtPkFjRGNHcGlvID0gVE9OR0FfVU5VU0VEX0dQSU9fUElOOwor CQlwaG1fY2FwX3Vuc2V0KGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywK KwkJCVBITV9QbGF0Zm9ybUNhcHNfQXV0b21hdGljRENUcmFuc2l0aW9uKTsKKwl9CisKKwlwaG1f Y2FwX3Vuc2V0KGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywKKwkJUEhN X1BsYXRmb3JtQ2Fwc19GYWxjb25fUXVpY2tUcmFuc2l0aW9uKTsKKworCXJlZ192YWx1ZSA9IDA7 CisJaWYgKDEgPT0gcmVnX3ZhbHVlKSB7CisJCXBobV9jYXBfdW5zZXQoaHdtZ3ItPnBsYXRmb3Jt X2Rlc2NyaXB0b3IucGxhdGZvcm1DYXBzLAorCQkJUEhNX1BsYXRmb3JtQ2Fwc19BdXRvbWF0aWNE Q1RyYW5zaXRpb24pOworCQlwaG1fY2FwX3NldChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5w bGF0Zm9ybUNhcHMsCisJCQlQSE1fUGxhdGZvcm1DYXBzX0ZhbGNvbl9RdWlja1RyYW5zaXRpb24p OworCX0KKworCXJlZ192YWx1ZSA9IDA7CisJaWYgKCgwID09IHJlZ192YWx1ZSkgJiYKKwkJKDAg PT0gYXRvbWN0cmxfZ2V0X3BwX2Fzc2lnbl9waW4oaHdtZ3IsCisJCQlUSEVSTUFMX0lOVF9PVVRQ VVRfR1BJT19QSU5JRCwgJmdwaW9fcGluX2Fzc2lnbm1lbnQpKSkgeworCQlwaG1fY2FwX3NldCho d21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCQlQSE1fUGxhdGZvcm1D YXBzX1RoZXJtYWxPdXRHUElPKTsKKworCQl0YWJsZS0+VGhlcm1PdXRHcGlvID0gZ3Bpb19waW5f YXNzaWdubWVudC51Y19ncGlvX3Bpbl9iaXRfc2hpZnQ7CisKKwkJdGFibGUtPlRoZXJtT3V0UG9s YXJpdHkgPQorCQkJKDAgPT0gKGNnc19yZWFkX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIG1tR1BJ T1BBRF9BKSAmCisJCQkoMSA8PCBncGlvX3Bpbl9hc3NpZ25tZW50LnVjX2dwaW9fcGluX2JpdF9z aGlmdCkpKSA/IDE6MDsKKworCQl0YWJsZS0+VGhlcm1PdXRNb2RlID0gU01VN19USEVSTV9PVVRf TU9ERV9USEVSTV9PTkxZOworCisJCS8qIGlmIHJlcXVpcmVkLCBjb21iaW5lIFZSSG90L1BDQyB3 aXRoIHRoZXJtYWwgb3V0IEdQSU8qLworCQlpZiAocGhtX2NhcF9lbmFibGVkKGh3bWdyLT5wbGF0 Zm9ybV9kZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywKKwkJCVBITV9QbGF0Zm9ybUNhcHNfUmVndWxh dG9ySG90KSAmJgorCQkJcGhtX2NhcF9lbmFibGVkKGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9y LnBsYXRmb3JtQ2FwcywKKwkJCVBITV9QbGF0Zm9ybUNhcHNfQ29tYmluZVBDQ1dpdGhUaGVybWFs U2lnbmFsKSl7CisJCQl0YWJsZS0+VGhlcm1PdXRNb2RlID0gU01VN19USEVSTV9PVVRfTU9ERV9U SEVSTV9WUkhPVDsKKwkJfQorCX0gZWxzZSB7CisJCXBobV9jYXBfdW5zZXQoaHdtZ3ItPnBsYXRm b3JtX2Rlc2NyaXB0b3IucGxhdGZvcm1DYXBzLAorCQkJUEhNX1BsYXRmb3JtQ2Fwc19UaGVybWFs T3V0R1BJTyk7CisKKwkJdGFibGUtPlRoZXJtT3V0R3BpbyA9IDE3OworCQl0YWJsZS0+VGhlcm1P dXRQb2xhcml0eSA9IDE7CisJCXRhYmxlLT5UaGVybU91dE1vZGUgPSBTTVU3X1RIRVJNX09VVF9N T0RFX0RJU0FCTEU7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFNNVTcyX01BWF9FTlRSSUVTX1NN SU87IGkrKykgeworCQl0YWJsZS0+U21pb1tpXSA9IFBQX0hPU1RfVE9fU01DX1VMKHRhYmxlLT5T bWlvW2ldKTsKKwl9CisJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VMKHRhYmxlLT5TeXN0ZW1G bGFncyk7CisJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VMKHRhYmxlLT5WUkNvbmZpZyk7CisJ Q09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VMKHRhYmxlLT5TbWlvTWFzazEpOworCUNPTlZFUlRf RlJPTV9IT1NUX1RPX1NNQ19VTCh0YWJsZS0+U21pb01hc2syKTsKKwlDT05WRVJUX0ZST01fSE9T VF9UT19TTUNfVUwodGFibGUtPlNjbGtTdGVwU2l6ZSk7CisJQ09OVkVSVF9GUk9NX0hPU1RfVE9f U01DX1VTKHRhYmxlLT5UZW1wZXJhdHVyZUxpbWl0SGlnaCk7CisJQ09OVkVSVF9GUk9NX0hPU1Rf VE9fU01DX1VTKHRhYmxlLT5UZW1wZXJhdHVyZUxpbWl0TG93KTsKKwlDT05WRVJUX0ZST01fSE9T VF9UT19TTUNfVVModGFibGUtPlZvbHRhZ2VSZXNwb25zZVRpbWUpOworCUNPTlZFUlRfRlJPTV9I T1NUX1RPX1NNQ19VUyh0YWJsZS0+UGhhc2VSZXNwb25zZVRpbWUpOworCisJLyogVXBsb2FkIGFs bCBkcG0gZGF0YSB0byBTTUMgbWVtb3J5LihkcG0gbGV2ZWwsIGRwbSBsZXZlbCBjb3VudCBldGMp ICovCisJcmVzdWx0ID0gdG9uZ2FfY29weV9ieXRlc190b19zbWMoaHdtZ3ItPnNtdW1nciwgZGF0 YS0+ZHBtX3RhYmxlX3N0YXJ0ICsKKwkJCQkJCQkJCQlvZmZzZXRvZihTTVU3Ml9EaXNjcmV0ZV9E cG1UYWJsZSwgU3lzdGVtRmxhZ3MpLAorCQkJCQkJCQkJCSh1aW50OF90ICopJih0YWJsZS0+U3lz dGVtRmxhZ3MpLAorCQkJCQkJCQkJCXNpemVvZihTTVU3Ml9EaXNjcmV0ZV9EcG1UYWJsZSktMyAq IHNpemVvZihTTVU3Ml9QSURDb250cm9sbGVyKSwKKwkJCQkJCQkJCQlkYXRhLT5zcmFtX2VuZCk7 CisKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKDAgPT0gcmVzdWx0LAorCQkiRmFpbGVkIHRvIHVwbG9h ZCBkcG0gZGF0YSB0byBTTUMgbWVtb3J5ISIsIHJldHVybiByZXN1bHQ7KTsKKworCXJldHVybiBy ZXN1bHQ7Cit9CisKKy8qIExvb2sgdXAgdGhlIHZvbHRhZ2VkIGJhc2VkIG9uIERBTCdzIHJlcXVl c3RlZCBsZXZlbC4gYW5kIHRoZW4gc2VuZCB0aGUgcmVxdWVzdGVkIFZEREMgdm9sdGFnZSB0byBT TUMqLworc3RhdGljIHZvaWQgdG9uZ2FfYXBwbHlfZGFsX21pbmltdW1fdm9sdGFnZV9yZXF1ZXN0 KHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJcmV0dXJuOworfQorCitpbnQgdG9uZ2FfdXBs b2FkX2RwbV9sZXZlbF9lbmFibGVfbWFzayhzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCVBQ U01DX1Jlc3VsdCByZXN1bHQ7CisJdG9uZ2FfaHdtZ3IgKmRhdGEgPSAodG9uZ2FfaHdtZ3IgKiko aHdtZ3ItPmJhY2tlbmQpOworCisJLyogQXBwbHkgbWluaW11bSB2b2x0YWdlIGJhc2VkIG9uIERB TCdzIHJlcXVlc3QgbGV2ZWwgKi8KKwl0b25nYV9hcHBseV9kYWxfbWluaW11bV92b2x0YWdlX3Jl cXVlc3QoaHdtZ3IpOworCisJaWYgKDAgPT0gZGF0YS0+c2Nsa19kcG1fa2V5X2Rpc2FibGVkKSB7 CisJCS8qIENoZWNraW5nIGlmIERQTSBpcyBydW5uaW5nLiAgSWYgd2UgZGlzY292ZXIgaGFuZyBi ZWNhdXNlIG9mIHRoaXMsIHdlIHNob3VsZCBza2lwIHRoaXMgbWVzc2FnZS4qLworCQlpZiAoMCAh PSB0b25nYV9pc19kcG1fcnVubmluZyhod21ncikpCisJCQlwcmludGsoS0VSTl9FUlIgIlsgcG93 ZXJwbGF5IF0gVHJ5aW5nIHRvIHNldCBFbmFibGUgTWFzayB3aGVuIERQTSBpcyBkaXNhYmxlZCBc biIpOworCisJCWlmICgwICE9IGRhdGEtPmRwbV9sZXZlbF9lbmFibGVfbWFzay5zY2xrX2RwbV9l bmFibGVfbWFzaykgeworCQkJcmVzdWx0ID0gc211bV9zZW5kX21zZ190b19zbWNfd2l0aF9wYXJh bWV0ZXIoCisJCQkJCQkJCWh3bWdyLT5zbXVtZ3IsCisJCQkJKFBQU01DX01zZylQUFNNQ19NU0df U0NMS0RQTV9TZXRFbmFibGVkTWFzaywKKwkJCQlkYXRhLT5kcG1fbGV2ZWxfZW5hYmxlX21hc2su c2Nsa19kcG1fZW5hYmxlX21hc2spOworCQkJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSByZXN1 bHQpLAorCQkJCSJTZXQgU2NsayBEcG0gZW5hYmxlIE1hc2sgZmFpbGVkIiwgcmV0dXJuIC0xKTsK KwkJfQorCX0KKworCWlmICgwID09IGRhdGEtPm1jbGtfZHBtX2tleV9kaXNhYmxlZCkgeworCQkv KiBDaGVja2luZyBpZiBEUE0gaXMgcnVubmluZy4gIElmIHdlIGRpc2NvdmVyIGhhbmcgYmVjYXVz ZSBvZiB0aGlzLCB3ZSBzaG91bGQgc2tpcCB0aGlzIG1lc3NhZ2UuKi8KKwkJaWYgKDAgIT0gdG9u Z2FfaXNfZHBtX3J1bm5pbmcoaHdtZ3IpKQorCQkJcHJpbnRrKEtFUk5fRVJSICJbIHBvd2VycGxh eSBdIFRyeWluZyB0byBzZXQgRW5hYmxlIE1hc2sgd2hlbiBEUE0gaXMgZGlzYWJsZWQgXG4iKTsK KworCQlpZiAoMCAhPSBkYXRhLT5kcG1fbGV2ZWxfZW5hYmxlX21hc2subWNsa19kcG1fZW5hYmxl X21hc2spIHsKKwkJCXJlc3VsdCA9IHNtdW1fc2VuZF9tc2dfdG9fc21jX3dpdGhfcGFyYW1ldGVy KAorCQkJCQkJCQlod21nci0+c211bWdyLAorCQkJCShQUFNNQ19Nc2cpUFBTTUNfTVNHX01DTEtE UE1fU2V0RW5hYmxlZE1hc2ssCisJCQkJZGF0YS0+ZHBtX2xldmVsX2VuYWJsZV9tYXNrLm1jbGtf ZHBtX2VuYWJsZV9tYXNrKTsKKwkJCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgPT0gcmVzdWx0KSwK KwkJCQkiU2V0IE1jbGsgRHBtIGVuYWJsZSBNYXNrIGZhaWxlZCIsIHJldHVybiAtMSk7CisJCX0K Kwl9CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgdG9uZ2FfZm9yY2VfZHBtX2hpZ2hlc3Qoc3Ry dWN0IHBwX2h3bWdyICpod21ncikKK3sKKwl1aW50MzJfdCBsZXZlbCwgdG1wOworCXRvbmdhX2h3 bWdyICpkYXRhID0gKHRvbmdhX2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKworCWlmICgwID09 IGRhdGEtPnBjaWVfZHBtX2tleV9kaXNhYmxlZCkgeworCQkvKiBQQ0lFICovCisJCWlmIChkYXRh LT5kcG1fbGV2ZWxfZW5hYmxlX21hc2sucGNpZV9kcG1fZW5hYmxlX21hc2sgIT0gMCkgeworCQkJ bGV2ZWwgPSAwOworCQkJdG1wID0gZGF0YS0+ZHBtX2xldmVsX2VuYWJsZV9tYXNrLnBjaWVfZHBt X2VuYWJsZV9tYXNrOworCQkJd2hpbGUgKHRtcCA+Pj0gMSkKKwkJCQlsZXZlbCsrIDsKKworCQkJ aWYgKDAgIT0gbGV2ZWwpIHsKKwkJCQlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09IHRvbmdhX2Rw bV9mb3JjZV9zdGF0ZV9wY2llKGh3bWdyLCBsZXZlbCkpLAorCQkJCQkiZm9yY2UgaGlnaGVzdCBw Y2llIGRwbSBzdGF0ZSBmYWlsZWQhIiwgcmV0dXJuIC0xKTsKKwkJCX0KKwkJfQorCX0KKworCWlm ICgwID09IGRhdGEtPnNjbGtfZHBtX2tleV9kaXNhYmxlZCkgeworCQkvKiBTQ0xLICovCisJCWlm IChkYXRhLT5kcG1fbGV2ZWxfZW5hYmxlX21hc2suc2Nsa19kcG1fZW5hYmxlX21hc2sgIT0gMCkg eworCQkJbGV2ZWwgPSAwOworCQkJdG1wID0gZGF0YS0+ZHBtX2xldmVsX2VuYWJsZV9tYXNrLnNj bGtfZHBtX2VuYWJsZV9tYXNrOworCQkJd2hpbGUgKHRtcCA+Pj0gMSkKKwkJCQlsZXZlbCsrIDsK KworCQkJaWYgKDAgIT0gbGV2ZWwpIHsKKwkJCQlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09IHRv bmdhX2RwbV9mb3JjZV9zdGF0ZShod21nciwgbGV2ZWwpKSwKKwkJCQkJImZvcmNlIGhpZ2hlc3Qg c2NsayBkcG0gc3RhdGUgZmFpbGVkISIsIHJldHVybiAtMSk7CisJCQkJaWYgKFBITV9SRUFEX1ZG UEZfSU5ESVJFQ1RfRklFTEQoaHdtZ3ItPmRldmljZSwKKwkJCQkJQ0dTX0lORF9SRUdfX1NNQywg VEFSR0VUX0FORF9DVVJSRU5UX1BST0ZJTEVfSU5ERVgsIENVUlJfU0NMS19JTkRFWCkgIT0gbGV2 ZWwpCisJCQkJCXByaW50ayhLRVJOX0VSUiAiWyBwb3dlcnBsYXkgXSBUYXJnZXRfYW5kX2N1cnJl bnRfUHJvZmlsZV9JbmRleC4gXAorCQkJCQkJQ3Vycl9TY2xrX0luZGV4IGRvZXMgbm90IG1hdGNo IHRoZSBsZXZlbCBcbiIpOworCisJCQl9CisJCX0KKwl9CisKKwlpZiAoMCA9PSBkYXRhLT5tY2xr X2RwbV9rZXlfZGlzYWJsZWQpIHsKKwkJLyogTUNMSyAqLworCQlpZiAoZGF0YS0+ZHBtX2xldmVs X2VuYWJsZV9tYXNrLm1jbGtfZHBtX2VuYWJsZV9tYXNrICE9IDApIHsKKwkJCWxldmVsID0gMDsK KwkJCXRtcCA9IGRhdGEtPmRwbV9sZXZlbF9lbmFibGVfbWFzay5tY2xrX2RwbV9lbmFibGVfbWFz azsKKwkJCXdoaWxlICh0bXAgPj49IDEpCisJCQkJbGV2ZWwrKyA7CisKKwkJCWlmICgwICE9IGxl dmVsKSB7CisJCQkJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSB0b25nYV9kcG1fZm9yY2Vfc3Rh dGVfbWNsayhod21nciwgbGV2ZWwpKSwKKwkJCQkJImZvcmNlIGhpZ2hlc3QgbWNsayBkcG0gc3Rh dGUgZmFpbGVkISIsIHJldHVybiAtMSk7CisJCQkJaWYgKFBITV9SRUFEX1ZGUEZfSU5ESVJFQ1Rf RklFTEQoaHdtZ3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywKKwkJCQkJVEFSR0VUX0FORF9D VVJSRU5UX1BST0ZJTEVfSU5ERVgsIENVUlJfTUNMS19JTkRFWCkgIT0gbGV2ZWwpCisJCQkJCXBy aW50ayhLRVJOX0VSUiAiWyBwb3dlcnBsYXkgXSBUYXJnZXRfYW5kX2N1cnJlbnRfUHJvZmlsZV9J bmRleC4gXAorCQkJCQkJQ3Vycl9TY2xrX0luZGV4IGRvZXMgbm90IG1hdGNoIHRoZSBsZXZlbCBc biIpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogRmluZCB0aGUg TUMgbWljcm9jb2RlIHZlcnNpb24gYW5kIHN0b3JlIGl0IGluIHRoZSBId01nciBzdHJ1Y3QKKyAq CisgKiBAcGFyYW0gICAgaHdtZ3IgIHRoZSBhZGRyZXNzIG9mIHRoZSBwb3dlcnBsYXkgaGFyZHdh cmUgbWFuYWdlci4KKyAqIEByZXR1cm4gICBhbHdheXMgMAorICovCitpbnQgdG9uZ2FfZ2V0X21j X21pY3JvY29kZV92ZXJzaW9uIChzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCWNnc193cml0 ZV9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBtbU1DX1NFUV9JT19ERUJVR19JTkRFWCwgMHg5Rik7 CisKKwlod21nci0+bWljcm9jb2RlX3ZlcnNpb25faW5mby5NQyA9IGNnc19yZWFkX3JlZ2lzdGVy KGh3bWdyLT5kZXZpY2UsIG1tTUNfU0VRX0lPX0RFQlVHX0RBVEEpOworCisJcmV0dXJuIDA7Cit9 CisKKy8qKgorICogSW5pdGlhbGl6ZSBEeW5hbWljIFN0YXRlIEFkanVzdG1lbnQgUnVsZSBTZXR0 aW5ncworICoKKyAqIEBwYXJhbSAgICBod21nciAgdGhlIGFkZHJlc3Mgb2YgdGhlIHBvd2VycGxh eSBoYXJkd2FyZSBtYW5hZ2VyLgorICovCitpbnQgdG9uZ2FfaW5pdGlhbGl6YV9keW5hbWljX3N0 YXRlX2FkanVzdG1lbnRfcnVsZV9zZXR0aW5ncyhzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQorewor CXVpbnQzMl90IHRhYmxlX3NpemU7CisJc3RydWN0IHBobV9jbG9ja192b2x0YWdlX2RlcGVuZGVu Y3lfdGFibGUgKnRhYmxlX2Nsa192bHQ7CisJc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24g KnBwdGFibGVfaW5mbyA9IChzdHJ1Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqKShod21nci0+ cHB0YWJsZSk7CisKKwlod21nci0+ZHluX3N0YXRlLm1jbGtfc2Nsa19yYXRpbyA9IDQ7CisJaHdt Z3ItPmR5bl9zdGF0ZS5zY2xrX21jbGtfZGVsdGEgPSAxNTAwMDsgICAgICAvKiAxNTAgTUh6ICov CisJaHdtZ3ItPmR5bl9zdGF0ZS52ZGRjX3ZkZGNpX2RlbHRhID0gMjAwOyAgICAgICAvKiAyMDBt ViAqLworCisJLyogaW5pdGlhbGl6ZSB2ZGRjX2RlcF9vbl9kYWxfcHdybCB0YWJsZSAqLworCXRh YmxlX3NpemUgPSBzaXplb2YodWludDMyX3QpICsgNCAqIHNpemVvZihzdHJ1Y3QgcGhtX2Nsb2Nr X3ZvbHRhZ2VfZGVwZW5kZW5jeV9yZWNvcmQpOworCXRhYmxlX2Nsa192bHQgPSAoc3RydWN0IHBo bV9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUgKilremFsbG9jKHRhYmxlX3NpemUsIEdG UF9LRVJORUwpOworCisJaWYgKE5VTEwgPT0gdGFibGVfY2xrX3ZsdCkgeworCQlwcmludGsoS0VS Tl9FUlIgIlsgcG93ZXJwbGF5IF0gQ2FuIG5vdCBhbGxvY2F0ZSBzcGFjZSBmb3IgdmRkY19kZXBf b25fZGFsX3B3cmwhIFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0gZWxzZSB7CisJCXRhYmxl X2Nsa192bHQtPmNvdW50ID0gNDsKKwkJdGFibGVfY2xrX3ZsdC0+ZW50cmllc1swXS5jbGsgPSBQ UF9EQUxfUE9XRVJMRVZFTF9VTFRSQUxPVzsKKwkJdGFibGVfY2xrX3ZsdC0+ZW50cmllc1swXS52 ID0gMDsKKwkJdGFibGVfY2xrX3ZsdC0+ZW50cmllc1sxXS5jbGsgPSBQUF9EQUxfUE9XRVJMRVZF TF9MT1c7CisJCXRhYmxlX2Nsa192bHQtPmVudHJpZXNbMV0udiA9IDcyMDsKKwkJdGFibGVfY2xr X3ZsdC0+ZW50cmllc1syXS5jbGsgPSBQUF9EQUxfUE9XRVJMRVZFTF9OT01JTkFMOworCQl0YWJs ZV9jbGtfdmx0LT5lbnRyaWVzWzJdLnYgPSA4MTA7CisJCXRhYmxlX2Nsa192bHQtPmVudHJpZXNb M10uY2xrID0gUFBfREFMX1BPV0VSTEVWRUxfUEVSRk9STUFOQ0U7CisJCXRhYmxlX2Nsa192bHQt PmVudHJpZXNbM10udiA9IDkwMDsKKwkJcHB0YWJsZV9pbmZvLT52ZGRjX2RlcF9vbl9kYWxfcHdy bCA9IHRhYmxlX2Nsa192bHQ7CisJCWh3bWdyLT5keW5fc3RhdGUudmRkY19kZXBfb25fZGFsX3B3 cmwgPSB0YWJsZV9jbGtfdmx0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRv bmdhX3NldF9wcml2YXRlX3Zhcl9iYXNlZF9vbl9wcHRhbGUoc3RydWN0IHBwX2h3bWdyICpod21n cikKK3sKKwl0b25nYV9od21nciAqZGF0YSA9ICh0b25nYV9od21nciAqKShod21nci0+YmFja2Vu ZCk7CisJc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKnBwdGFibGVfaW5mbyA9IChzdHJ1 Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqKShod21nci0+cHB0YWJsZSk7CisKKwlwaG1fcHB0 X3YxX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZSAqYWxsb3dlZF9zY2xrX3ZkZF90YWJs ZSA9CisJCXBwdGFibGVfaW5mby0+dmRkX2RlcF9vbl9zY2xrOworCXBobV9wcHRfdjFfY2xvY2tf dm9sdGFnZV9kZXBlbmRlbmN5X3RhYmxlICphbGxvd2VkX21jbGtfdmRkX3RhYmxlID0KKwkJcHB0 YWJsZV9pbmZvLT52ZGRfZGVwX29uX21jbGs7CisKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKGFsbG93 ZWRfc2Nsa192ZGRfdGFibGUgIT0gTlVMTCwKKwkJIlZERCBkZXBlbmRlbmN5IG9uIFNDTEsgdGFi bGUgaXMgbWlzc2luZy4gCVwKKwkJVGhpcyB0YWJsZSBpcyBtYW5kYXRvcnkiLCByZXR1cm4gLTEp OworCVBQX0FTU0VSVF9XSVRIX0NPREUoYWxsb3dlZF9zY2xrX3ZkZF90YWJsZS0+Y291bnQgPj0g MSwKKwkJIlZERCBkZXBlbmRlbmN5IG9uIFNDTEsgdGFibGUgaGFzIHRvIGhhdmUgaXMgbWlzc2lu Zy4gCVwKKwkJVGhpcyB0YWJsZSBpcyBtYW5kYXRvcnkiLCByZXR1cm4gLTEpOworCisJUFBfQVNT RVJUX1dJVEhfQ09ERShhbGxvd2VkX21jbGtfdmRkX3RhYmxlICE9IE5VTEwsCisJCSJWREQgZGVw ZW5kZW5jeSBvbiBNQ0xLIHRhYmxlIGlzIG1pc3NpbmcuIAlcCisJCVRoaXMgdGFibGUgaXMgbWFu ZGF0b3J5IiwgcmV0dXJuIC0xKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKGFsbG93ZWRfbWNsa192 ZGRfdGFibGUtPmNvdW50ID49IDEsCisJCSJWREQgZGVwZW5kZW5jeSBvbiBNQ0xLIHRhYmxlIGhh cyB0byBoYXZlIGlzIG1pc3NpbmcuCSBcCisJCVRoaXMgdGFibGUgaXMgbWFuZGF0b3J5IiwgcmV0 dXJuIC0xKTsKKworCWRhdGEtPm1pbl92ZGRjX2luX3BwX3RhYmxlID0gKHVpbnQxNl90KWFsbG93 ZWRfc2Nsa192ZGRfdGFibGUtPmVudHJpZXNbMF0udmRkYzsKKwlkYXRhLT5tYXhfdmRkY19pbl9w cF90YWJsZSA9ICh1aW50MTZfdClhbGxvd2VkX3NjbGtfdmRkX3RhYmxlLT5lbnRyaWVzW2FsbG93 ZWRfc2Nsa192ZGRfdGFibGUtPmNvdW50IC0gMV0udmRkYzsKKworCXBwdGFibGVfaW5mby0+bWF4 X2Nsb2NrX3ZvbHRhZ2Vfb25fYWMuc2NsayA9CisJCWFsbG93ZWRfc2Nsa192ZGRfdGFibGUtPmVu dHJpZXNbYWxsb3dlZF9zY2xrX3ZkZF90YWJsZS0+Y291bnQgLSAxXS5jbGs7CisJcHB0YWJsZV9p bmZvLT5tYXhfY2xvY2tfdm9sdGFnZV9vbl9hYy5tY2xrID0KKwkJYWxsb3dlZF9tY2xrX3ZkZF90 YWJsZS0+ZW50cmllc1thbGxvd2VkX21jbGtfdmRkX3RhYmxlLT5jb3VudCAtIDFdLmNsazsKKwlw cHRhYmxlX2luZm8tPm1heF9jbG9ja192b2x0YWdlX29uX2FjLnZkZGMgPQorCQlhbGxvd2VkX3Nj bGtfdmRkX3RhYmxlLT5lbnRyaWVzW2FsbG93ZWRfc2Nsa192ZGRfdGFibGUtPmNvdW50IC0gMV0u dmRkYzsKKwlwcHRhYmxlX2luZm8tPm1heF9jbG9ja192b2x0YWdlX29uX2FjLnZkZGNpID0KKwkJ YWxsb3dlZF9tY2xrX3ZkZF90YWJsZS0+ZW50cmllc1thbGxvd2VkX21jbGtfdmRkX3RhYmxlLT5j b3VudCAtIDFdLnZkZGNpOworCisJaHdtZ3ItPmR5bl9zdGF0ZS5tYXhfY2xvY2tfdm9sdGFnZV9v bl9hYy5zY2xrID0KKwkJcHB0YWJsZV9pbmZvLT5tYXhfY2xvY2tfdm9sdGFnZV9vbl9hYy5zY2xr OworCWh3bWdyLT5keW5fc3RhdGUubWF4X2Nsb2NrX3ZvbHRhZ2Vfb25fYWMubWNsayA9CisJCXBw dGFibGVfaW5mby0+bWF4X2Nsb2NrX3ZvbHRhZ2Vfb25fYWMubWNsazsKKwlod21nci0+ZHluX3N0 YXRlLm1heF9jbG9ja192b2x0YWdlX29uX2FjLnZkZGMgPQorCQlwcHRhYmxlX2luZm8tPm1heF9j bG9ja192b2x0YWdlX29uX2FjLnZkZGM7CisJaHdtZ3ItPmR5bl9zdGF0ZS5tYXhfY2xvY2tfdm9s dGFnZV9vbl9hYy52ZGRjaSA9CisJCXBwdGFibGVfaW5mby0+bWF4X2Nsb2NrX3ZvbHRhZ2Vfb25f YWMudmRkY2k7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHRvbmdhX3VuZm9yY2VfZHBtX2xldmVs cyhzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCXRvbmdhX2h3bWdyICpkYXRhID0gKHRvbmdh X2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKwlpbnQgcmVzdWx0ID0gMTsKKworCVBQX0FTU0VS VF9XSVRIX0NPREUgKDAgPT0gdG9uZ2FfaXNfZHBtX3J1bm5pbmcoaHdtZ3IpLAorCQkiVHJ5aW5n IHRvIFVuZm9yY2UgRFBNIHdoZW4gRFBNIGlzIGRpc2FibGVkLiBSZXR1cm5pbmcgd2l0aG91dCBz ZW5kaW5nIFNNQyBtZXNzYWdlLiIsCisJCQkJCQkJcmV0dXJuIHJlc3VsdCk7CisKKwlpZiAoMCA9 PSBkYXRhLT5wY2llX2RwbV9rZXlfZGlzYWJsZWQpIHsKKwkJUFBfQVNTRVJUX1dJVEhfQ09ERSgo MCA9PSBzbXVtX3NlbmRfbXNnX3RvX3NtYygKKwkJCQkJCQkgICAgIGh3bWdyLT5zbXVtZ3IsCisJ CQkJCVBQU01DX01TR19QQ0llRFBNX1VuRm9yY2VMZXZlbCkpLAorCQkJCQkgICAidW5mb3JjZSBw Y2llIGxldmVsIGZhaWxlZCEiLAorCQkJCQkJCQlyZXR1cm4gLTEpOworCX0KKworCXJlc3VsdCA9 IHRvbmdhX3VwbG9hZF9kcG1fbGV2ZWxfZW5hYmxlX21hc2soaHdtZ3IpOworCisJcmV0dXJuIHJl c3VsdDsKK30KKworc3RhdGljIHVpbnQzMl90IHRvbmdhX2dldF9sb3dlc3RfZW5hYmxlX2xldmVs KAorCQkJCXN0cnVjdCBwcF9od21nciAqaHdtZ3IsIHVpbnQzMl90IGxldmVsX21hc2spCit7CisJ dWludDMyX3QgbGV2ZWwgPSAwOworCisJd2hpbGUgKDAgPT0gKGxldmVsX21hc2sgJiAoMSA8PCBs ZXZlbCkpKQorCQlsZXZlbCsrOworCisJcmV0dXJuIGxldmVsOworfQorCitzdGF0aWMgaW50IHRv bmdhX2ZvcmNlX2RwbV9sb3dlc3Qoc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwl1aW50MzJf dCBsZXZlbCA9IDA7CisJdG9uZ2FfaHdtZ3IgKmRhdGEgPSAodG9uZ2FfaHdtZ3IgKikoaHdtZ3It PmJhY2tlbmQpOworCisJLyogZm9yIG5vdyBmb3JjZSBvbmx5IHNjbGsgKi8KKwlpZiAoMCAhPSBk YXRhLT5kcG1fbGV2ZWxfZW5hYmxlX21hc2suc2Nsa19kcG1fZW5hYmxlX21hc2spIHsKKwkJbGV2 ZWwgPSB0b25nYV9nZXRfbG93ZXN0X2VuYWJsZV9sZXZlbChod21nciwKKwkJCQkJZGF0YS0+ZHBt X2xldmVsX2VuYWJsZV9tYXNrLnNjbGtfZHBtX2VuYWJsZV9tYXNrKTsKKworCQlQUF9BU1NFUlRf V0lUSF9DT0RFKCgwID09IHRvbmdhX2RwbV9mb3JjZV9zdGF0ZShod21nciwgbGV2ZWwpKSwKKwkJ CSJmb3JjZSBzY2xrIGRwbSBzdGF0ZSBmYWlsZWQhIiwgcmV0dXJuIC0xKTsKKworCQlpZiAoUEhN X1JFQURfVkZQRl9JTkRJUkVDVF9GSUVMRChod21nci0+ZGV2aWNlLAorCQkJQ0dTX0lORF9SRUdf X1NNQywgVEFSR0VUX0FORF9DVVJSRU5UX1BST0ZJTEVfSU5ERVgsIENVUlJfU0NMS19JTkRFWCkg IT0gbGV2ZWwpCisJCQlwcmludGsoS0VSTl9FUlIgIlsgcG93ZXJwbGF5IF0gVGFyZ2V0X2FuZF9j dXJyZW50X1Byb2ZpbGVfSW5kZXguCVwKKwkJCQlDdXJyX1NjbGtfSW5kZXggZG9lcyBub3QgbWF0 Y2ggdGhlIGxldmVsIFxuIik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG9u Z2FfcGF0Y2hfdm9sdGFnZV9kZXBlbmRlbmN5X3RhYmxlc193aXRoX2xvb2t1cF90YWJsZShzdHJ1 Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCXVpbnQ4X3QgZW50cnlJZDsKKwl1aW50OF90IHZvbHRh Z2VJZDsKKwl0b25nYV9od21nciAqZGF0YSA9ICh0b25nYV9od21nciAqKShod21nci0+YmFja2Vu ZCk7CisJc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKnBwdGFibGVfaW5mbyA9IChzdHJ1 Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqKShod21nci0+cHB0YWJsZSk7CisKKwlwaG1fcHB0 X3YxX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZSAqc2Nsa190YWJsZSA9IHBwdGFibGVf aW5mby0+dmRkX2RlcF9vbl9zY2xrOworCXBobV9wcHRfdjFfY2xvY2tfdm9sdGFnZV9kZXBlbmRl bmN5X3RhYmxlICptY2xrX3RhYmxlID0gcHB0YWJsZV9pbmZvLT52ZGRfZGVwX29uX21jbGs7CisJ cGhtX3BwdF92MV9tbV9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUgKm1tX3RhYmxlID0g cHB0YWJsZV9pbmZvLT5tbV9kZXBfdGFibGU7CisKKwlpZiAoZGF0YS0+dmRkX2dmeF9jb250cm9s ID09IFRPTkdBX1ZPTFRBR0VfQ09OVFJPTF9CWV9TVklEMikgeworCQlmb3IgKGVudHJ5SWQgPSAw OyBlbnRyeUlkIDwgc2Nsa190YWJsZS0+Y291bnQ7ICsrZW50cnlJZCkgeworCQkJdm9sdGFnZUlk ID0gc2Nsa190YWJsZS0+ZW50cmllc1tlbnRyeUlkXS52ZGRJbmQ7CisJCQlzY2xrX3RhYmxlLT5l bnRyaWVzW2VudHJ5SWRdLnZkZGdmeCA9CisJCQkJcHB0YWJsZV9pbmZvLT52ZGRnZnhfbG9va3Vw X3RhYmxlLT5lbnRyaWVzW3ZvbHRhZ2VJZF0udXNfdmRkOworCQl9CisJfSBlbHNlIHsKKwkJZm9y IChlbnRyeUlkID0gMDsgZW50cnlJZCA8IHNjbGtfdGFibGUtPmNvdW50OyArK2VudHJ5SWQpIHsK KwkJCXZvbHRhZ2VJZCA9IHNjbGtfdGFibGUtPmVudHJpZXNbZW50cnlJZF0udmRkSW5kOworCQkJ c2Nsa190YWJsZS0+ZW50cmllc1tlbnRyeUlkXS52ZGRjID0KKwkJCQlwcHRhYmxlX2luZm8tPnZk ZGNfbG9va3VwX3RhYmxlLT5lbnRyaWVzW3ZvbHRhZ2VJZF0udXNfdmRkOworCQl9CisJfQorCisJ Zm9yIChlbnRyeUlkID0gMDsgZW50cnlJZCA8IG1jbGtfdGFibGUtPmNvdW50OyArK2VudHJ5SWQp IHsKKwkJdm9sdGFnZUlkID0gbWNsa190YWJsZS0+ZW50cmllc1tlbnRyeUlkXS52ZGRJbmQ7CisJ CW1jbGtfdGFibGUtPmVudHJpZXNbZW50cnlJZF0udmRkYyA9CisJCQlwcHRhYmxlX2luZm8tPnZk ZGNfbG9va3VwX3RhYmxlLT5lbnRyaWVzW3ZvbHRhZ2VJZF0udXNfdmRkOworCX0KKworCWZvciAo ZW50cnlJZCA9IDA7IGVudHJ5SWQgPCBtbV90YWJsZS0+Y291bnQ7ICsrZW50cnlJZCkgeworCQl2 b2x0YWdlSWQgPSBtbV90YWJsZS0+ZW50cmllc1tlbnRyeUlkXS52ZGRjSW5kOworCQltbV90YWJs ZS0+ZW50cmllc1tlbnRyeUlkXS52ZGRjID0KKwkJCXBwdGFibGVfaW5mby0+dmRkY19sb29rdXBf dGFibGUtPmVudHJpZXNbdm9sdGFnZUlkXS51c192ZGQ7CisJfQorCisJcmV0dXJuIDA7CisKK30K Kworc3RhdGljIGludCB0b25nYV9jYWxjX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZXMoc3RydWN0 IHBwX2h3bWdyICpod21ncikKK3sKKwl1aW50OF90IGVudHJ5SWQ7CisJcGhtX3BwdF92MV92b2x0 YWdlX2xvb2t1cF9yZWNvcmQgdl9yZWNvcmQ7CisJdG9uZ2FfaHdtZ3IgKmRhdGEgPSAodG9uZ2Ff aHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9u ICpwcHRhYmxlX2luZm8gPSAoc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKikoaHdtZ3It PnBwdGFibGUpOworCisJcGhtX3BwdF92MV9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUg KnNjbGtfdGFibGUgPSBwcHRhYmxlX2luZm8tPnZkZF9kZXBfb25fc2NsazsKKwlwaG1fcHB0X3Yx X2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZSAqbWNsa190YWJsZSA9IHBwdGFibGVfaW5m by0+dmRkX2RlcF9vbl9tY2xrOworCisJaWYgKGRhdGEtPnZkZF9nZnhfY29udHJvbCA9PSBUT05H QV9WT0xUQUdFX0NPTlRST0xfQllfU1ZJRDIpIHsKKwkJZm9yIChlbnRyeUlkID0gMDsgZW50cnlJ ZCA8IHNjbGtfdGFibGUtPmNvdW50OyArK2VudHJ5SWQpIHsKKwkJCWlmIChzY2xrX3RhYmxlLT5l bnRyaWVzW2VudHJ5SWRdLnZkZF9vZmZzZXQgJiAoMSA8PCAxNSkpCisJCQkJdl9yZWNvcmQudXNf dmRkID0gc2Nsa190YWJsZS0+ZW50cmllc1tlbnRyeUlkXS52ZGRnZnggKworCQkJCQlzY2xrX3Rh YmxlLT5lbnRyaWVzW2VudHJ5SWRdLnZkZF9vZmZzZXQgLSAweEZGRkY7CisJCQllbHNlCisJCQkJ dl9yZWNvcmQudXNfdmRkID0gc2Nsa190YWJsZS0+ZW50cmllc1tlbnRyeUlkXS52ZGRnZnggKwor CQkJCQlzY2xrX3RhYmxlLT5lbnRyaWVzW2VudHJ5SWRdLnZkZF9vZmZzZXQ7CisKKwkJCXNjbGtf dGFibGUtPmVudHJpZXNbZW50cnlJZF0udmRkYyA9CisJCQkJdl9yZWNvcmQudXNfY2FjX2xvdyA9 IHZfcmVjb3JkLnVzX2NhY19taWQgPQorCQkJCXZfcmVjb3JkLnVzX2NhY19oaWdoID0gdl9yZWNv cmQudXNfdmRkOworCisJCQl0b25nYV9hZGRfdm9sdGFnZShod21nciwgcHB0YWJsZV9pbmZvLT52 ZGRjX2xvb2t1cF90YWJsZSwgJnZfcmVjb3JkKTsKKwkJfQorCisJCWZvciAoZW50cnlJZCA9IDA7 IGVudHJ5SWQgPCBtY2xrX3RhYmxlLT5jb3VudDsgKytlbnRyeUlkKSB7CisJCQlpZiAobWNsa190 YWJsZS0+ZW50cmllc1tlbnRyeUlkXS52ZGRfb2Zmc2V0ICYgKDEgPDwgMTUpKQorCQkJCXZfcmVj b3JkLnVzX3ZkZCA9IG1jbGtfdGFibGUtPmVudHJpZXNbZW50cnlJZF0udmRkYyArCisJCQkJCW1j bGtfdGFibGUtPmVudHJpZXNbZW50cnlJZF0udmRkX29mZnNldCAtIDB4RkZGRjsKKwkJCWVsc2UK KwkJCQl2X3JlY29yZC51c192ZGQgPSBtY2xrX3RhYmxlLT5lbnRyaWVzW2VudHJ5SWRdLnZkZGMg KworCQkJCQltY2xrX3RhYmxlLT5lbnRyaWVzW2VudHJ5SWRdLnZkZF9vZmZzZXQ7CisKKwkJCW1j bGtfdGFibGUtPmVudHJpZXNbZW50cnlJZF0udmRkZ2Z4ID0gdl9yZWNvcmQudXNfY2FjX2xvdyA9 CisJCQkJdl9yZWNvcmQudXNfY2FjX21pZCA9IHZfcmVjb3JkLnVzX2NhY19oaWdoID0gdl9yZWNv cmQudXNfdmRkOworCQkJdG9uZ2FfYWRkX3ZvbHRhZ2UoaHdtZ3IsIHBwdGFibGVfaW5mby0+dmRk Z2Z4X2xvb2t1cF90YWJsZSwgJnZfcmVjb3JkKTsKKwkJfQorCX0KKworCXJldHVybiAwOworCit9 CisKK3N0YXRpYyBpbnQgdG9uZ2FfY2FsY19tbV92b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUoc3Ry dWN0IHBwX2h3bWdyICpod21ncikKK3sKKwl1aW50MzJfdCBlbnRyeUlkOworCXBobV9wcHRfdjFf dm9sdGFnZV9sb29rdXBfcmVjb3JkIHZfcmVjb3JkOworCXRvbmdhX2h3bWdyICpkYXRhID0gKHRv bmdhX2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKwlzdHJ1Y3QgcGhtX3BwdF92MV9pbmZvcm1h dGlvbiAqcHB0YWJsZV9pbmZvID0gKHN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICopKGh3 bWdyLT5wcHRhYmxlKTsKKwlwaG1fcHB0X3YxX21tX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90 YWJsZSAqbW1fdGFibGUgPSBwcHRhYmxlX2luZm8tPm1tX2RlcF90YWJsZTsKKworCWlmIChkYXRh LT52ZGRfZ2Z4X2NvbnRyb2wgPT0gVE9OR0FfVk9MVEFHRV9DT05UUk9MX0JZX1NWSUQyKSB7CisJ CWZvciAoZW50cnlJZCA9IDA7IGVudHJ5SWQgPCBtbV90YWJsZS0+Y291bnQ7IGVudHJ5SWQrKykg eworCQkJaWYgKG1tX3RhYmxlLT5lbnRyaWVzW2VudHJ5SWRdLnZkZGdmeF9vZmZzZXQgJiAoMSA8 PCAxNSkpCisJCQkJdl9yZWNvcmQudXNfdmRkID0gbW1fdGFibGUtPmVudHJpZXNbZW50cnlJZF0u dmRkYyArCisJCQkJCW1tX3RhYmxlLT5lbnRyaWVzW2VudHJ5SWRdLnZkZGdmeF9vZmZzZXQgLSAw eEZGRkY7CisJCQllbHNlCisJCQkJdl9yZWNvcmQudXNfdmRkID0gbW1fdGFibGUtPmVudHJpZXNb ZW50cnlJZF0udmRkYyArCisJCQkJCW1tX3RhYmxlLT5lbnRyaWVzW2VudHJ5SWRdLnZkZGdmeF9v ZmZzZXQ7CisKKwkJCS8qIEFkZCB0aGUgY2FsY3VsYXRlZCBWRERHRlggdG8gdGhlIFZEREdGWCBs b29rdXAgdGFibGUgKi8KKwkJCW1tX3RhYmxlLT5lbnRyaWVzW2VudHJ5SWRdLnZkZGdmeCA9IHZf cmVjb3JkLnVzX2NhY19sb3cgPQorCQkJCXZfcmVjb3JkLnVzX2NhY19taWQgPSB2X3JlY29yZC51 c19jYWNfaGlnaCA9IHZfcmVjb3JkLnVzX3ZkZDsKKwkJCXRvbmdhX2FkZF92b2x0YWdlKGh3bWdy LCBwcHRhYmxlX2luZm8tPnZkZGdmeF9sb29rdXBfdGFibGUsICZ2X3JlY29yZCk7CisJCX0KKwl9 CisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBDaGFuZ2UgdmlydHVhbCBsZWFrYWdlIHZvbHRh Z2UgdG8gYWN0dWFsIHZhbHVlLgorICoKKyAqIEBwYXJhbSAgICAgaHdtZ3IgIHRoZSBhZGRyZXNz IG9mIHRoZSBwb3dlcnBsYXkgaGFyZHdhcmUgbWFuYWdlci4KKyAqIEBwYXJhbSAgICAgcG9pbnRl ciB0byBjaGFuZ2luZyB2b2x0YWdlCisgKiBAcGFyYW0gICAgIHBvaW50ZXIgdG8gbGVha2FnZSB0 YWJsZQorICovCitzdGF0aWMgdm9pZCB0b25nYV9wYXRjaF93aXRoX3ZkZF9sZWFrYWdlKHN0cnVj dCBwcF9od21nciAqaHdtZ3IsCisJCXVpbnQxNl90ICp2b2x0YWdlLCBwaHdfdG9uZ2FfbGVha2Fn ZV92b2x0YWdlICpwTGVha2FnZVRhYmxlKQoreworCXVpbnQzMl90IGxlYWthZ2VfaW5kZXg7CisK KwkvKiBzZWFyY2ggZm9yIGxlYWthZ2Ugdm9sdGFnZSBJRCAweGZmMDEgfiAweGZmMDggKi8KKwlm b3IgKGxlYWthZ2VfaW5kZXggPSAwOyBsZWFrYWdlX2luZGV4IDwgcExlYWthZ2VUYWJsZS0+Y291 bnQ7IGxlYWthZ2VfaW5kZXgrKykgeworCQkvKiBpZiB0aGlzIHZvbHRhZ2UgbWF0Y2hlcyBhIGxl YWthZ2Ugdm9sdGFnZSBJRCAqLworCQkvKiBwYXRjaCB3aXRoIGFjdHVhbCBsZWFrYWdlIHZvbHRh Z2UgKi8KKwkJaWYgKHBMZWFrYWdlVGFibGUtPmxlYWthZ2VfaWRbbGVha2FnZV9pbmRleF0gPT0g KnZvbHRhZ2UpIHsKKwkJCSp2b2x0YWdlID0gcExlYWthZ2VUYWJsZS0+YWN0dWFsX3ZvbHRhZ2Vb bGVha2FnZV9pbmRleF07CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICgqdm9sdGFnZSA+IEFU T01fVklSVFVBTF9WT0xUQUdFX0lEMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJbIHBvd2VycGxheSBd IFZvbHRhZ2UgdmFsdWUgbG9va3MgbGlrZSBhIExlYWthZ2UgSUQgYnV0IGl0J3Mgbm90IHBhdGNo ZWQgXG4iKTsKK30KKworLyoqCisgKiBQYXRjaCB2b2x0YWdlIGxvb2t1cCB0YWJsZSBieSBFVlYg bGVha2FnZXMuCisgKgorICogQHBhcmFtICAgICBod21nciAgdGhlIGFkZHJlc3Mgb2YgdGhlIHBv d2VycGxheSBoYXJkd2FyZSBtYW5hZ2VyLgorICogQHBhcmFtICAgICBwb2ludGVyIHRvIHZvbHRh Z2UgbG9va3VwIHRhYmxlCisgKiBAcGFyYW0gICAgIHBvaW50ZXIgdG8gbGVha2FnZSB0YWJsZQor ICogQHJldHVybiAgICAgYWx3YXlzIDAKKyAqLworc3RhdGljIGludCB0b25nYV9wYXRjaF9sb29r dXBfdGFibGVfd2l0aF9sZWFrYWdlKHN0cnVjdCBwcF9od21nciAqaHdtZ3IsCisJCXBobV9wcHRf djFfdm9sdGFnZV9sb29rdXBfdGFibGUgKmxvb2t1cF90YWJsZSwKKwkJcGh3X3RvbmdhX2xlYWth Z2Vfdm9sdGFnZSAqcExlYWthZ2VUYWJsZSkKK3sKKwl1aW50MzJfdCBpOworCisJZm9yIChpID0g MDsgaSA8IGxvb2t1cF90YWJsZS0+Y291bnQ7IGkrKykgeworCQl0b25nYV9wYXRjaF93aXRoX3Zk ZF9sZWFrYWdlKGh3bWdyLAorCQkJJmxvb2t1cF90YWJsZS0+ZW50cmllc1tpXS51c192ZGQsIHBM ZWFrYWdlVGFibGUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRvbmdhX3Bh dGNoX2Nsb2NrX3ZvbHRhZ2VfbG9taXRzX3dpdGhfdmRkY19sZWFrYWdlKHN0cnVjdCBwcF9od21n ciAqaHdtZ3IsCisJCXBod190b25nYV9sZWFrYWdlX3ZvbHRhZ2UgKnBMZWFrYWdlVGFibGUsIHVp bnQxNl90ICpWZGRjKQoreworCXN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICpwcHRhYmxl X2luZm8gPSAoc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKikoaHdtZ3ItPnBwdGFibGUp OworCisJdG9uZ2FfcGF0Y2hfd2l0aF92ZGRfbGVha2FnZShod21nciwgKHVpbnQxNl90ICopVmRk YywgcExlYWthZ2VUYWJsZSk7CisJaHdtZ3ItPmR5bl9zdGF0ZS5tYXhfY2xvY2tfdm9sdGFnZV9v bl9kYy52ZGRjID0KKwkJcHB0YWJsZV9pbmZvLT5tYXhfY2xvY2tfdm9sdGFnZV9vbl9kYy52ZGRj OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG9uZ2FfcGF0Y2hfY2xvY2tfdm9sdGFn ZV9saW1pdHNfd2l0aF92ZGRnZnhfbGVha2FnZSgKKwkJc3RydWN0IHBwX2h3bWdyICpod21nciwg cGh3X3RvbmdhX2xlYWthZ2Vfdm9sdGFnZSAqcExlYWthZ2VUYWJsZSwKKwkJdWludDE2X3QgKlZk ZGdmeCkKK3sKKwl0b25nYV9wYXRjaF93aXRoX3ZkZF9sZWFrYWdlKGh3bWdyLCAodWludDE2X3Qg KilWZGRnZngsIHBMZWFrYWdlVGFibGUpOworCXJldHVybiAwOworfQorCitpbnQgdG9uZ2Ffc29y dF9sb29rdXBfdGFibGUoc3RydWN0IHBwX2h3bWdyICpod21nciwKKwkJcGhtX3BwdF92MV92b2x0 YWdlX2xvb2t1cF90YWJsZSAqbG9va3VwX3RhYmxlKQoreworCXVpbnQzMl90IHRhYmxlX3NpemUs IGksIGo7CisJcGhtX3BwdF92MV92b2x0YWdlX2xvb2t1cF9yZWNvcmQgdG1wX3ZvbHRhZ2VfbG9v a3VwX3JlY29yZDsKKwl0YWJsZV9zaXplID0gbG9va3VwX3RhYmxlLT5jb3VudDsKKworCVBQX0FT U0VSVF9XSVRIX0NPREUoMCAhPSBsb29rdXBfdGFibGUtPmNvdW50LAorCQkiTG9va3VwIHRhYmxl IGlzIGVtcHR5IiwgcmV0dXJuIC0xKTsKKworCS8qIFNvcnRpbmcgdm9sdGFnZXMgKi8KKwlmb3Ig KGkgPSAwOyBpIDwgdGFibGVfc2l6ZSAtIDE7IGkrKykgeworCQlmb3IgKGogPSBpICsgMTsgaiA+ IDA7IGotLSkgeworCQkJaWYgKGxvb2t1cF90YWJsZS0+ZW50cmllc1tqXS51c192ZGQgPCBsb29r dXBfdGFibGUtPmVudHJpZXNbai0xXS51c192ZGQpIHsKKwkJCQl0bXBfdm9sdGFnZV9sb29rdXBf cmVjb3JkID0gbG9va3VwX3RhYmxlLT5lbnRyaWVzW2otMV07CisJCQkJbG9va3VwX3RhYmxlLT5l bnRyaWVzW2otMV0gPSBsb29rdXBfdGFibGUtPmVudHJpZXNbal07CisJCQkJbG9va3VwX3RhYmxl LT5lbnRyaWVzW2pdID0gdG1wX3ZvbHRhZ2VfbG9va3VwX3JlY29yZDsKKwkJCX0KKwkJfQorCX0K KworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRvbmdhX2NvbXBsZXRlX2RlcGVuZGVuY3lf dGFibGVzKHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJaW50IHJlc3VsdCA9IDA7CisJaW50 IHRtcF9yZXN1bHQ7CisJdG9uZ2FfaHdtZ3IgKmRhdGEgPSAoc3RydWN0IHRvbmdhX2h3bWdyICop KGh3bWdyLT5iYWNrZW5kKTsKKwlzdHJ1Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqcHB0YWJs ZV9pbmZvID0gKHN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICopKGh3bWdyLT5wcHRhYmxl KTsKKworCWlmIChkYXRhLT52ZGRfZ2Z4X2NvbnRyb2wgPT0gVE9OR0FfVk9MVEFHRV9DT05UUk9M X0JZX1NWSUQyKSB7CisJCXRtcF9yZXN1bHQgPSB0b25nYV9wYXRjaF9sb29rdXBfdGFibGVfd2l0 aF9sZWFrYWdlKGh3bWdyLAorCQkJcHB0YWJsZV9pbmZvLT52ZGRnZnhfbG9va3VwX3RhYmxlLCAm KGRhdGEtPnZkZGNnZnhfbGVha2FnZSkpOworCQlpZiAodG1wX3Jlc3VsdCAhPSAwKQorCQkJcmVz dWx0ID0gdG1wX3Jlc3VsdDsKKworCQl0bXBfcmVzdWx0ID0gdG9uZ2FfcGF0Y2hfY2xvY2tfdm9s dGFnZV9saW1pdHNfd2l0aF92ZGRnZnhfbGVha2FnZShod21nciwKKwkJCSYoZGF0YS0+dmRkY2dm eF9sZWFrYWdlKSwgJnBwdGFibGVfaW5mby0+bWF4X2Nsb2NrX3ZvbHRhZ2Vfb25fZGMudmRkZ2Z4 KTsKKwkJaWYgKHRtcF9yZXN1bHQgIT0gMCkKKwkJCXJlc3VsdCA9IHRtcF9yZXN1bHQ7CisJfSBl bHNlIHsKKwkJdG1wX3Jlc3VsdCA9IHRvbmdhX3BhdGNoX2xvb2t1cF90YWJsZV93aXRoX2xlYWth Z2UoaHdtZ3IsCisJCQlwcHRhYmxlX2luZm8tPnZkZGNfbG9va3VwX3RhYmxlLCAmKGRhdGEtPnZk ZGNfbGVha2FnZSkpOworCQlpZiAodG1wX3Jlc3VsdCAhPSAwKQorCQkJcmVzdWx0ID0gdG1wX3Jl c3VsdDsKKworCQl0bXBfcmVzdWx0ID0gdG9uZ2FfcGF0Y2hfY2xvY2tfdm9sdGFnZV9sb21pdHNf d2l0aF92ZGRjX2xlYWthZ2UoaHdtZ3IsCisJCQkmKGRhdGEtPnZkZGNfbGVha2FnZSksICZwcHRh YmxlX2luZm8tPm1heF9jbG9ja192b2x0YWdlX29uX2RjLnZkZGMpOworCQlpZiAodG1wX3Jlc3Vs dCAhPSAwKQorCQkJcmVzdWx0ID0gdG1wX3Jlc3VsdDsKKwl9CisKKwl0bXBfcmVzdWx0ID0gdG9u Z2FfcGF0Y2hfdm9sdGFnZV9kZXBlbmRlbmN5X3RhYmxlc193aXRoX2xvb2t1cF90YWJsZShod21n cik7CisJaWYgKHRtcF9yZXN1bHQgIT0gMCkKKwkJcmVzdWx0ID0gdG1wX3Jlc3VsdDsKKworCXRt cF9yZXN1bHQgPSB0b25nYV9jYWxjX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZXMoaHdtZ3IpOwor CWlmICh0bXBfcmVzdWx0ICE9IDApCisJCXJlc3VsdCA9IHRtcF9yZXN1bHQ7CisKKwl0bXBfcmVz dWx0ID0gdG9uZ2FfY2FsY19tbV92b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUoaHdtZ3IpOworCWlm ICh0bXBfcmVzdWx0ICE9IDApCisJCXJlc3VsdCA9IHRtcF9yZXN1bHQ7CisKKwl0bXBfcmVzdWx0 ID0gdG9uZ2Ffc29ydF9sb29rdXBfdGFibGUoaHdtZ3IsIHBwdGFibGVfaW5mby0+dmRkZ2Z4X2xv b2t1cF90YWJsZSk7CisJaWYgKHRtcF9yZXN1bHQgIT0gMCkKKwkJcmVzdWx0ID0gdG1wX3Jlc3Vs dDsKKworCXRtcF9yZXN1bHQgPSB0b25nYV9zb3J0X2xvb2t1cF90YWJsZShod21nciwgcHB0YWJs ZV9pbmZvLT52ZGRjX2xvb2t1cF90YWJsZSk7CisJaWYgKHRtcF9yZXN1bHQgIT0gMCkKKwkJcmVz dWx0ID0gdG1wX3Jlc3VsdDsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCB0b25nYV9pbml0 X3NjbGtfdGhyZXNob2xkKHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJdG9uZ2FfaHdtZ3Ig KmRhdGEgPSAodG9uZ2FfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCWRhdGEtPmxvd19zY2xr X2ludGVycnVwdF90aHJlc2hvbGQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB0b25nYV9z ZXR1cF9hc2ljX3Rhc2soc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwlpbnQgdG1wX3Jlc3Vs dCwgcmVzdWx0ID0gMDsKKworCXRtcF9yZXN1bHQgPSB0b25nYV9yZWFkX2Nsb2NrX3JlZ2lzdGVy cyhod21ncik7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSB0bXBfcmVzdWx0KSwKKwkJIkZh aWxlZCB0byByZWFkIGNsb2NrIHJlZ2lzdGVycyEiLCByZXN1bHQgPSB0bXBfcmVzdWx0KTsKKwor CXRtcF9yZXN1bHQgPSB0b25nYV9nZXRfbWVtb3J5X3R5cGUoaHdtZ3IpOworCVBQX0FTU0VSVF9X SVRIX0NPREUoKDAgPT0gdG1wX3Jlc3VsdCksCisJCSJGYWlsZWQgdG8gZ2V0IG1lbW9yeSB0eXBl ISIsIHJlc3VsdCA9IHRtcF9yZXN1bHQpOworCisJdG1wX3Jlc3VsdCA9IHRvbmdhX2VuYWJsZV9h Y3BpX3Bvd2VyX21hbmFnZW1lbnQoaHdtZ3IpOworCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgPT0g dG1wX3Jlc3VsdCksCisJCSJGYWlsZWQgdG8gZW5hYmxlIEFDUEkgcG93ZXIgbWFuYWdlbWVudCEi LCByZXN1bHQgPSB0bXBfcmVzdWx0KTsKKworCXRtcF9yZXN1bHQgPSB0b25nYV9pbml0X3Bvd2Vy X2dhdGVfc3RhdGUoaHdtZ3IpOworCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgPT0gdG1wX3Jlc3Vs dCksCisJCSJGYWlsZWQgdG8gaW5pdCBwb3dlciBnYXRlIHN0YXRlISIsIHJlc3VsdCA9IHRtcF9y ZXN1bHQpOworCisJdG1wX3Jlc3VsdCA9IHRvbmdhX2dldF9tY19taWNyb2NvZGVfdmVyc2lvbiho d21ncik7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSB0bXBfcmVzdWx0KSwKKwkJIkZhaWxl ZCB0byBnZXQgTUMgbWljcm9jb2RlIHZlcnNpb24hIiwgcmVzdWx0ID0gdG1wX3Jlc3VsdCk7CisK Kwl0bXBfcmVzdWx0ID0gdG9uZ2FfaW5pdF9zY2xrX3RocmVzaG9sZChod21ncik7CisJUFBfQVNT RVJUX1dJVEhfQ09ERSgoMCA9PSB0bXBfcmVzdWx0KSwKKwkJIkZhaWxlZCB0byBpbml0IHNjbGsg dGhyZXNob2xkISIsIHJlc3VsdCA9IHRtcF9yZXN1bHQpOworCisJcmV0dXJuIHJlc3VsdDsKK30K KworLyoqCisgKiBFbmFibGUgdm9sdGFnZSBjb250cm9sCisgKgorICogQHBhcmFtICAgIGh3bWdy ICB0aGUgYWRkcmVzcyBvZiB0aGUgcG93ZXJwbGF5IGhhcmR3YXJlIG1hbmFnZXIuCisgKiBAcmV0 dXJuICAgYWx3YXlzIDAKKyAqLworaW50IHRvbmdhX2VuYWJsZV92b2x0YWdlX2NvbnRyb2woc3Ry dWN0IHBwX2h3bWdyICpod21ncikKK3sKKwkvKiBlbmFibGUgdm9sdGFnZSBjb250cm9sICovCisJ UEhNX1dSSVRFX1ZGUEZfSU5ESVJFQ1RfRklFTEQoaHdtZ3ItPmRldmljZSwgQ0dTX0lORF9SRUdf X1NNQywgR0VORVJBTF9QV1JNR1QsIFZPTFRfUFdSTUdUX0VOLCAxKTsKKworCXJldHVybiAwOwor fQorCisvKioKKyAqIENoZWNrcyBpZiB3ZSB3YW50IHRvIHN1cHBvcnQgdm9sdGFnZSBjb250cm9s CisgKgorICogQHBhcmFtICAgIGh3bWdyICB0aGUgYWRkcmVzcyBvZiB0aGUgcG93ZXJwbGF5IGhh cmR3YXJlIG1hbmFnZXIuCisgKi8KK2Jvb2wgY2ZfdG9uZ2Ffdm9sdGFnZV9jb250cm9sKGNvbnN0 IHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJY29uc3Qgc3RydWN0IHRvbmdhX2h3bWdyICpk YXRhID0gKHN0cnVjdCB0b25nYV9od21nciAqKShod21nci0+YmFja2VuZCk7CisKKwlyZXR1cm4o VE9OR0FfVk9MVEFHRV9DT05UUk9MX05PTkUgIT0gZGF0YS0+dm9sdGFnZV9jb250cm9sKTsKK30K KworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1NQy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0qLworCit1aW50OF90IHRvbmdhX2dldF9tZW1vcnlfbW9kaWxlX2luZGV4KHN0cnVjdCBw cF9od21nciAqaHdtZ3IpCit7CisJcmV0dXJuICh1aW50OF90KSAoMHhGRiAmIChjZ3NfcmVhZF9y ZWdpc3Rlcihod21nci0+ZGV2aWNlLCBtbUJJT1NfU0NSQVRDSF80KSA+PiAxNikpOworfQorCiti b29sIHRvbmdhX2NoZWNrX3MwX21jX3JlZ19pbmRleCh1aW50MTZfdCBpblJlZywgdWludDE2X3Qg Km91dFJlZykKK3sKKwlib29sIHJlc3VsdCA9IDE7CisKKwlzd2l0Y2ggKGluUmVnKSB7CisJY2Fz ZSAgbW1NQ19TRVFfUkFTX1RJTUlORzoKKwkJKm91dFJlZyA9IG1tTUNfU0VRX1JBU19USU1JTkdf TFA7CisJCWJyZWFrOworCisJY2FzZSAgbW1NQ19TRVFfRExMX1NUQlk6CisJCSpvdXRSZWcgPSBt bU1DX1NFUV9ETExfU1RCWV9MUDsKKwkJYnJlYWs7CisKKwljYXNlICBtbU1DX1NFUV9HNVBEWF9D TUQwOgorCQkqb3V0UmVnID0gbW1NQ19TRVFfRzVQRFhfQ01EMF9MUDsKKwkJYnJlYWs7CisKKwlj YXNlICBtbU1DX1NFUV9HNVBEWF9DTUQxOgorCQkqb3V0UmVnID0gbW1NQ19TRVFfRzVQRFhfQ01E MV9MUDsKKwkJYnJlYWs7CisKKwljYXNlICBtbU1DX1NFUV9HNVBEWF9DVFJMOgorCQkqb3V0UmVn ID0gbW1NQ19TRVFfRzVQRFhfQ1RSTF9MUDsKKwkJYnJlYWs7CisKKwljYXNlIG1tTUNfU0VRX0NB U19USU1JTkc6CisJCSpvdXRSZWcgPSBtbU1DX1NFUV9DQVNfVElNSU5HX0xQOworCQlicmVhazsK KworCWNhc2UgbW1NQ19TRVFfTUlTQ19USU1JTkc6CisJCSpvdXRSZWcgPSBtbU1DX1NFUV9NSVND X1RJTUlOR19MUDsKKwkJYnJlYWs7CisKKwljYXNlIG1tTUNfU0VRX01JU0NfVElNSU5HMjoKKwkJ Km91dFJlZyA9IG1tTUNfU0VRX01JU0NfVElNSU5HMl9MUDsKKwkJYnJlYWs7CisKKwljYXNlIG1t TUNfU0VRX1BNR19EVlNfQ01EOgorCQkqb3V0UmVnID0gbW1NQ19TRVFfUE1HX0RWU19DTURfTFA7 CisJCWJyZWFrOworCisJY2FzZSBtbU1DX1NFUV9QTUdfRFZTX0NUTDoKKwkJKm91dFJlZyA9IG1t TUNfU0VRX1BNR19EVlNfQ1RMX0xQOworCQlicmVhazsKKworCWNhc2UgbW1NQ19TRVFfUkRfQ1RM X0QwOgorCQkqb3V0UmVnID0gbW1NQ19TRVFfUkRfQ1RMX0QwX0xQOworCQlicmVhazsKKworCWNh c2UgbW1NQ19TRVFfUkRfQ1RMX0QxOgorCQkqb3V0UmVnID0gbW1NQ19TRVFfUkRfQ1RMX0QxX0xQ OworCQlicmVhazsKKworCWNhc2UgbW1NQ19TRVFfV1JfQ1RMX0QwOgorCQkqb3V0UmVnID0gbW1N Q19TRVFfV1JfQ1RMX0QwX0xQOworCQlicmVhazsKKworCWNhc2UgbW1NQ19TRVFfV1JfQ1RMX0Qx OgorCQkqb3V0UmVnID0gbW1NQ19TRVFfV1JfQ1RMX0QxX0xQOworCQlicmVhazsKKworCWNhc2Ug bW1NQ19QTUdfQ01EX0VNUlM6CisJCSpvdXRSZWcgPSBtbU1DX1NFUV9QTUdfQ01EX0VNUlNfTFA7 CisJCWJyZWFrOworCisJY2FzZSBtbU1DX1BNR19DTURfTVJTOgorCQkqb3V0UmVnID0gbW1NQ19T RVFfUE1HX0NNRF9NUlNfTFA7CisJCWJyZWFrOworCisJY2FzZSBtbU1DX1BNR19DTURfTVJTMToK KwkJKm91dFJlZyA9IG1tTUNfU0VRX1BNR19DTURfTVJTMV9MUDsKKwkJYnJlYWs7CisKKwljYXNl IG1tTUNfU0VRX1BNR19USU1JTkc6CisJCSpvdXRSZWcgPSBtbU1DX1NFUV9QTUdfVElNSU5HX0xQ OworCQlicmVhazsKKworCWNhc2UgbW1NQ19QTUdfQ01EX01SUzI6CisJCSpvdXRSZWcgPSBtbU1D X1NFUV9QTUdfQ01EX01SUzJfTFA7CisJCWJyZWFrOworCisJY2FzZSBtbU1DX1NFUV9XUl9DVExf MjoKKwkJKm91dFJlZyA9IG1tTUNfU0VRX1dSX0NUTF8yX0xQOworCQlicmVhazsKKworCWRlZmF1 bHQ6CisJCXJlc3VsdCA9IDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisK K2ludCB0b25nYV9zZXRfczBfbWNfcmVnX2luZGV4KHBod190b25nYV9tY19yZWdfdGFibGUgKnRh YmxlKQoreworCXVpbnQzMl90IGk7CisJdWludDE2X3QgYWRkcmVzczsKKworCWZvciAoaSA9IDA7 IGkgPCB0YWJsZS0+bGFzdDsgaSsrKSB7CisJCXRhYmxlLT5tY19yZWdfYWRkcmVzc1tpXS5zMCA9 CisJCQl0b25nYV9jaGVja19zMF9tY19yZWdfaW5kZXgodGFibGUtPm1jX3JlZ19hZGRyZXNzW2ld LnMxLCAmYWRkcmVzcykKKwkJCT8gYWRkcmVzcyA6IHRhYmxlLT5tY19yZWdfYWRkcmVzc1tpXS5z MTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCB0b25nYV9jb3B5X3ZiaW9zX3NtY19yZWdfdGFi bGUoY29uc3QgcHBfYXRvbWN0cmxfbWNfcmVnX3RhYmxlICp0YWJsZSwgcGh3X3RvbmdhX21jX3Jl Z190YWJsZSAqbmlfdGFibGUpCit7CisJdWludDhfdCBpLCBqOworCisJUFBfQVNTRVJUX1dJVEhf Q09ERSgodGFibGUtPmxhc3QgPD0gU01VNzJfRElTQ1JFVEVfTUNfUkVHSVNURVJfQVJSQVlfU0la RSksCisJCSJJbnZhbGlkIFZyYW1JbmZvIHRhYmxlLiIsIHJldHVybiAtMSk7CisJUFBfQVNTRVJU X1dJVEhfQ09ERSgodGFibGUtPm51bV9lbnRyaWVzIDw9IE1BWF9BQ19USU1JTkdfRU5UUklFUyks CisJCSJJbnZhbGlkIFZyYW1JbmZvIHRhYmxlLiIsIHJldHVybiAtMSk7CisKKwlmb3IgKGkgPSAw OyBpIDwgdGFibGUtPmxhc3Q7IGkrKykgeworCQluaV90YWJsZS0+bWNfcmVnX2FkZHJlc3NbaV0u czEgPSB0YWJsZS0+bWNfcmVnX2FkZHJlc3NbaV0uczE7CisJfQorCW5pX3RhYmxlLT5sYXN0ID0g dGFibGUtPmxhc3Q7CisKKwlmb3IgKGkgPSAwOyBpIDwgdGFibGUtPm51bV9lbnRyaWVzOyBpKysp IHsKKwkJbmlfdGFibGUtPm1jX3JlZ190YWJsZV9lbnRyeVtpXS5tY2xrX21heCA9CisJCQl0YWJs ZS0+bWNfcmVnX3RhYmxlX2VudHJ5W2ldLm1jbGtfbWF4OworCQlmb3IgKGogPSAwOyBqIDwgdGFi bGUtPmxhc3Q7IGorKykgeworCQkJbmlfdGFibGUtPm1jX3JlZ190YWJsZV9lbnRyeVtpXS5tY19k YXRhW2pdID0KKwkJCQl0YWJsZS0+bWNfcmVnX3RhYmxlX2VudHJ5W2ldLm1jX2RhdGFbal07CisJ CX0KKwl9CisJbmlfdGFibGUtPm51bV9lbnRyaWVzID0gdGFibGUtPm51bV9lbnRyaWVzOworCisJ cmV0dXJuIDA7Cit9CisKKy8qKgorICogVkJJT1Mgb21pdHMgc29tZSBpbmZvcm1hdGlvbiB0byBy ZWR1Y2Ugc2l6ZSwgd2UgbmVlZCB0byByZWNvdmVyIHRoZW0gaGVyZS4KKyAqIDEuICAgd2hlbiB3 ZSBzZWUgbW1NQ19TRVFfTUlTQzEsIGJpdFszMToxNl0gRU1SUzEsIG5lZWQgdG8gYmUgd3JpdGUg dG8gIG1tTUNfUE1HX0NNRF9FTVJTIC9fTFBbMTU6MF0uCisgKiAgICAgIEJpdFsxNTowXSBNUlMs IG5lZWQgdG8gYmUgdXBkYXRlIG1tTUNfUE1HX0NNRF9NUlMvX0xQWzE1OjBdCisgKiAyLiAgIHdo ZW4gd2Ugc2VlIG1tTUNfU0VRX1JFU0VSVkVfTSwgYml0WzE1OjBdIEVNUlMyLCBuZWVkIHRvIGJl IHdyaXRlIHRvIG1tTUNfUE1HX0NNRF9NUlMxL19MUFsxNTowXS4KKyAqIDMuICAgbmVlZCB0byBz ZXQgdGhlc2UgZGF0YSBmb3IgZWFjaCBjbG9jayByYW5nZQorICoKKyAqIEBwYXJhbSAgICBod21n ciB0aGUgYWRkcmVzcyBvZiB0aGUgcG93ZXJwbGF5IGhhcmR3YXJlIG1hbmFnZXIuCisgKiBAcGFy YW0gICAgdGFibGUgdGhlIGFkZHJlc3Mgb2YgTUNSZWdUYWJsZQorICogQHJldHVybiAgIGFsd2F5 cyAwCisgKi8KK2ludCB0b25nYV9zZXRfbWNfc3BlY2lhbF9yZWdpc3RlcnMoc3RydWN0IHBwX2h3 bWdyICpod21nciwgcGh3X3RvbmdhX21jX3JlZ190YWJsZSAqdGFibGUpCit7CisJdWludDhfdCBp LCBqLCBrOworCXVpbnQzMl90IHRlbXBfcmVnOworCWNvbnN0IHRvbmdhX2h3bWdyICpkYXRhID0g KHN0cnVjdCB0b25nYV9od21nciAqKShod21nci0+YmFja2VuZCk7CisKKwlmb3IgKGkgPSAwLCBq ID0gdGFibGUtPmxhc3Q7IGkgPCB0YWJsZS0+bGFzdDsgaSsrKSB7CisJCVBQX0FTU0VSVF9XSVRI X0NPREUoKGogPCBTTVU3Ml9ESVNDUkVURV9NQ19SRUdJU1RFUl9BUlJBWV9TSVpFKSwKKwkJCSJJ bnZhbGlkIFZyYW1JbmZvIHRhYmxlLiIsIHJldHVybiAtMSk7CisJCXN3aXRjaCAodGFibGUtPm1j X3JlZ19hZGRyZXNzW2ldLnMxKSB7CisJCS8qCisJCSogbW1NQ19TRVFfTUlTQzEsIGJpdFszMTox Nl0gRU1SUzEsIG5lZWQgdG8gYmUgd3JpdGUgdG8gIG1tTUNfUE1HX0NNRF9FTVJTIC9fTFBbMTU6 MF0uCisJCSogQml0WzE1OjBdIE1SUywgbmVlZCB0byBiZSB1cGRhdGUgbW1NQ19QTUdfQ01EX01S Uy9fTFBbMTU6MF0KKwkJKi8KKwkJY2FzZSBtbU1DX1NFUV9NSVNDMToKKwkJCXRlbXBfcmVnID0g Y2dzX3JlYWRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19QTUdfQ01EX0VNUlMpOworCQkJ dGFibGUtPm1jX3JlZ19hZGRyZXNzW2pdLnMxID0gbW1NQ19QTUdfQ01EX0VNUlM7CisJCQl0YWJs ZS0+bWNfcmVnX2FkZHJlc3Nbal0uczAgPSBtbU1DX1NFUV9QTUdfQ01EX0VNUlNfTFA7CisJCQlm b3IgKGsgPSAwOyBrIDwgdGFibGUtPm51bV9lbnRyaWVzOyBrKyspIHsKKwkJCQl0YWJsZS0+bWNf cmVnX3RhYmxlX2VudHJ5W2tdLm1jX2RhdGFbal0gPQorCQkJCQkoKHRlbXBfcmVnICYgMHhmZmZm MDAwMCkpIHwKKwkJCQkJKCh0YWJsZS0+bWNfcmVnX3RhYmxlX2VudHJ5W2tdLm1jX2RhdGFbaV0g JiAweGZmZmYwMDAwKSA+PiAxNik7CisJCQl9CisJCQlqKys7CisJCQlQUF9BU1NFUlRfV0lUSF9D T0RFKChqIDwgU01VNzJfRElTQ1JFVEVfTUNfUkVHSVNURVJfQVJSQVlfU0laRSksCisJCQkJIklu dmFsaWQgVnJhbUluZm8gdGFibGUuIiwgcmV0dXJuIC0xKTsKKworCQkJdGVtcF9yZWcgPSBjZ3Nf cmVhZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBtbU1DX1BNR19DTURfTVJTKTsKKwkJCXRhYmxl LT5tY19yZWdfYWRkcmVzc1tqXS5zMSA9IG1tTUNfUE1HX0NNRF9NUlM7CisJCQl0YWJsZS0+bWNf cmVnX2FkZHJlc3Nbal0uczAgPSBtbU1DX1NFUV9QTUdfQ01EX01SU19MUDsKKwkJCWZvciAoayA9 IDA7IGsgPCB0YWJsZS0+bnVtX2VudHJpZXM7IGsrKykgeworCQkJCXRhYmxlLT5tY19yZWdfdGFi bGVfZW50cnlba10ubWNfZGF0YVtqXSA9CisJCQkJCSh0ZW1wX3JlZyAmIDB4ZmZmZjAwMDApIHwK KwkJCQkJKHRhYmxlLT5tY19yZWdfdGFibGVfZW50cnlba10ubWNfZGF0YVtpXSAmIDB4MDAwMGZm ZmYpOworCisJCQkJaWYgKCFkYXRhLT5pc19tZW1vcnlfR0REUjUpIHsKKwkJCQkJdGFibGUtPm1j X3JlZ190YWJsZV9lbnRyeVtrXS5tY19kYXRhW2pdIHw9IDB4MTAwOworCQkJCX0KKwkJCX0KKwkJ CWorKzsKKwkJCVBQX0FTU0VSVF9XSVRIX0NPREUoKGogPD0gU01VNzJfRElTQ1JFVEVfTUNfUkVH SVNURVJfQVJSQVlfU0laRSksCisJCQkJIkludmFsaWQgVnJhbUluZm8gdGFibGUuIiwgcmV0dXJu IC0xKTsKKworCQkJaWYgKCFkYXRhLT5pc19tZW1vcnlfR0REUjUpIHsKKwkJCQl0YWJsZS0+bWNf cmVnX2FkZHJlc3Nbal0uczEgPSBtbU1DX1BNR19BVVRPX0NNRDsKKwkJCQl0YWJsZS0+bWNfcmVn X2FkZHJlc3Nbal0uczAgPSBtbU1DX1BNR19BVVRPX0NNRDsKKwkJCQlmb3IgKGsgPSAwOyBrIDwg dGFibGUtPm51bV9lbnRyaWVzOyBrKyspIHsKKwkJCQkJdGFibGUtPm1jX3JlZ190YWJsZV9lbnRy eVtrXS5tY19kYXRhW2pdID0KKwkJCQkJCSh0YWJsZS0+bWNfcmVnX3RhYmxlX2VudHJ5W2tdLm1j X2RhdGFbaV0gJiAweGZmZmYwMDAwKSA+PiAxNjsKKwkJCQl9CisJCQkJaisrOworCQkJCVBQX0FT U0VSVF9XSVRIX0NPREUoKGogPD0gU01VNzJfRElTQ1JFVEVfTUNfUkVHSVNURVJfQVJSQVlfU0la RSksCisJCQkJCSJJbnZhbGlkIFZyYW1JbmZvIHRhYmxlLiIsIHJldHVybiAtMSk7CisJCQl9CisK KwkJCWJyZWFrOworCisJCWNhc2UgbW1NQ19TRVFfUkVTRVJWRV9NOgorCQkJdGVtcF9yZWcgPSBj Z3NfcmVhZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBtbU1DX1BNR19DTURfTVJTMSk7CisJCQl0 YWJsZS0+bWNfcmVnX2FkZHJlc3Nbal0uczEgPSBtbU1DX1BNR19DTURfTVJTMTsKKwkJCXRhYmxl LT5tY19yZWdfYWRkcmVzc1tqXS5zMCA9IG1tTUNfU0VRX1BNR19DTURfTVJTMV9MUDsKKwkJCWZv ciAoayA9IDA7IGsgPCB0YWJsZS0+bnVtX2VudHJpZXM7IGsrKykgeworCQkJCXRhYmxlLT5tY19y ZWdfdGFibGVfZW50cnlba10ubWNfZGF0YVtqXSA9CisJCQkJCSh0ZW1wX3JlZyAmIDB4ZmZmZjAw MDApIHwKKwkJCQkJKHRhYmxlLT5tY19yZWdfdGFibGVfZW50cnlba10ubWNfZGF0YVtpXSAmIDB4 MDAwMGZmZmYpOworCQkJfQorCQkJaisrOworCQkJUFBfQVNTRVJUX1dJVEhfQ09ERSgoaiA8PSBT TVU3Ml9ESVNDUkVURV9NQ19SRUdJU1RFUl9BUlJBWV9TSVpFKSwKKwkJCQkiSW52YWxpZCBWcmFt SW5mbyB0YWJsZS4iLCByZXR1cm4gLTEpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJy ZWFrOworCQl9CisKKwl9CisKKwl0YWJsZS0+bGFzdCA9IGo7CisKKwlyZXR1cm4gMDsKK30KKwor aW50IHRvbmdhX3NldF92YWxpZF9mbGFnKHBod190b25nYV9tY19yZWdfdGFibGUgKnRhYmxlKQor eworCXVpbnQ4X3QgaSwgajsKKwlmb3IgKGkgPSAwOyBpIDwgdGFibGUtPmxhc3Q7IGkrKykgewor CQlmb3IgKGogPSAxOyBqIDwgdGFibGUtPm51bV9lbnRyaWVzOyBqKyspIHsKKwkJCWlmICh0YWJs ZS0+bWNfcmVnX3RhYmxlX2VudHJ5W2otMV0ubWNfZGF0YVtpXSAhPQorCQkJCXRhYmxlLT5tY19y ZWdfdGFibGVfZW50cnlbal0ubWNfZGF0YVtpXSkgeworCQkJCXRhYmxlLT52YWxpZGZsYWcgfD0g KDE8PGkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2lu dCB0b25nYV9pbml0aWFsaXplX21jX3JlZ190YWJsZShzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQor eworCWludCByZXN1bHQ7CisJdG9uZ2FfaHdtZ3IgKmRhdGEgPSAodG9uZ2FfaHdtZ3IgKikoaHdt Z3ItPmJhY2tlbmQpOworCXBwX2F0b21jdHJsX21jX3JlZ190YWJsZSAqdGFibGU7CisJcGh3X3Rv bmdhX21jX3JlZ190YWJsZSAqbmlfdGFibGUgPSAmZGF0YS0+dG9uZ2FfbWNfcmVnX3RhYmxlOwor CXVpbnQ4X3QgbW9kdWxlX2luZGV4ID0gdG9uZ2FfZ2V0X21lbW9yeV9tb2RpbGVfaW5kZXgoaHdt Z3IpOworCisJdGFibGUgPSBremFsbG9jKHNpemVvZihwcF9hdG9tY3RybF9tY19yZWdfdGFibGUp LCBHRlBfS0VSTkVMKTsKKworCWlmIChOVUxMID09IHRhYmxlKQorCQlyZXR1cm4gLTE7CisKKwkv KiBQcm9ncmFtIGFkZGl0aW9uYWwgTFAgcmVnaXN0ZXJzIHRoYXQgYXJlIG5vIGxvbmdlciBwcm9n cmFtbWVkIGJ5IFZCSU9TICovCisJY2dzX3dyaXRlX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIG1t TUNfU0VRX1JBU19USU1JTkdfTFAsIGNnc19yZWFkX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIG1t TUNfU0VRX1JBU19USU1JTkcpKTsKKwljZ3Nfd3JpdGVfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwg bW1NQ19TRVFfQ0FTX1RJTUlOR19MUCwgY2dzX3JlYWRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwg bW1NQ19TRVFfQ0FTX1RJTUlORykpOworCWNnc193cml0ZV9yZWdpc3Rlcihod21nci0+ZGV2aWNl LCBtbU1DX1NFUV9ETExfU1RCWV9MUCwgY2dzX3JlYWRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwg bW1NQ19TRVFfRExMX1NUQlkpKTsKKwljZ3Nfd3JpdGVfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwg bW1NQ19TRVFfRzVQRFhfQ01EMF9MUCwgY2dzX3JlYWRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwg bW1NQ19TRVFfRzVQRFhfQ01EMCkpOworCWNnc193cml0ZV9yZWdpc3Rlcihod21nci0+ZGV2aWNl LCBtbU1DX1NFUV9HNVBEWF9DTUQxX0xQLCBjZ3NfcmVhZF9yZWdpc3Rlcihod21nci0+ZGV2aWNl LCBtbU1DX1NFUV9HNVBEWF9DTUQxKSk7CisJY2dzX3dyaXRlX3JlZ2lzdGVyKGh3bWdyLT5kZXZp Y2UsIG1tTUNfU0VRX0c1UERYX0NUUkxfTFAsIGNnc19yZWFkX3JlZ2lzdGVyKGh3bWdyLT5kZXZp Y2UsIG1tTUNfU0VRX0c1UERYX0NUUkwpKTsKKwljZ3Nfd3JpdGVfcmVnaXN0ZXIoaHdtZ3ItPmRl dmljZSwgbW1NQ19TRVFfUE1HX0RWU19DTURfTFAsIGNnc19yZWFkX3JlZ2lzdGVyKGh3bWdyLT5k ZXZpY2UsIG1tTUNfU0VRX1BNR19EVlNfQ01EKSk7CisJY2dzX3dyaXRlX3JlZ2lzdGVyKGh3bWdy LT5kZXZpY2UsIG1tTUNfU0VRX1BNR19EVlNfQ1RMX0xQLCBjZ3NfcmVhZF9yZWdpc3Rlcihod21n ci0+ZGV2aWNlLCBtbU1DX1NFUV9QTUdfRFZTX0NUTCkpOworCWNnc193cml0ZV9yZWdpc3Rlciho d21nci0+ZGV2aWNlLCBtbU1DX1NFUV9NSVNDX1RJTUlOR19MUCwgY2dzX3JlYWRfcmVnaXN0ZXIo aHdtZ3ItPmRldmljZSwgbW1NQ19TRVFfTUlTQ19USU1JTkcpKTsKKwljZ3Nfd3JpdGVfcmVnaXN0 ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19TRVFfTUlTQ19USU1JTkcyX0xQLCBjZ3NfcmVhZF9yZWdp c3Rlcihod21nci0+ZGV2aWNlLCBtbU1DX1NFUV9NSVNDX1RJTUlORzIpKTsKKwljZ3Nfd3JpdGVf cmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19TRVFfUE1HX0NNRF9FTVJTX0xQLCBjZ3NfcmVh ZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBtbU1DX1BNR19DTURfRU1SUykpOworCWNnc193cml0 ZV9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBtbU1DX1NFUV9QTUdfQ01EX01SU19MUCwgY2dzX3Jl YWRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19QTUdfQ01EX01SUykpOworCWNnc193cml0 ZV9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBtbU1DX1NFUV9QTUdfQ01EX01SUzFfTFAsIGNnc19y ZWFkX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIG1tTUNfUE1HX0NNRF9NUlMxKSk7CisJY2dzX3dy aXRlX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIG1tTUNfU0VRX1dSX0NUTF9EMF9MUCwgY2dzX3Jl YWRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19TRVFfV1JfQ1RMX0QwKSk7CisJY2dzX3dy aXRlX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIG1tTUNfU0VRX1dSX0NUTF9EMV9MUCwgY2dzX3Jl YWRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19TRVFfV1JfQ1RMX0QxKSk7CisJY2dzX3dy aXRlX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIG1tTUNfU0VRX1JEX0NUTF9EMF9MUCwgY2dzX3Jl YWRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19TRVFfUkRfQ1RMX0QwKSk7CisJY2dzX3dy aXRlX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIG1tTUNfU0VRX1JEX0NUTF9EMV9MUCwgY2dzX3Jl YWRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19TRVFfUkRfQ1RMX0QxKSk7CisJY2dzX3dy aXRlX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIG1tTUNfU0VRX1BNR19USU1JTkdfTFAsIGNnc19y ZWFkX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIG1tTUNfU0VRX1BNR19USU1JTkcpKTsKKwljZ3Nf d3JpdGVfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19TRVFfUE1HX0NNRF9NUlMyX0xQLCBj Z3NfcmVhZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBtbU1DX1BNR19DTURfTVJTMikpOworCWNn c193cml0ZV9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBtbU1DX1NFUV9XUl9DVExfMl9MUCwgY2dz X3JlYWRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19TRVFfV1JfQ1RMXzIpKTsKKworCW1l bXNldCh0YWJsZSwgMHgwMCwgc2l6ZW9mKHBwX2F0b21jdHJsX21jX3JlZ190YWJsZSkpOworCisJ cmVzdWx0ID0gYXRvbWN0cmxfaW5pdGlhbGl6ZV9tY19yZWdfdGFibGUoaHdtZ3IsIG1vZHVsZV9p bmRleCwgdGFibGUpOworCisJaWYgKDAgPT0gcmVzdWx0KQorCQlyZXN1bHQgPSB0b25nYV9jb3B5 X3ZiaW9zX3NtY19yZWdfdGFibGUodGFibGUsIG5pX3RhYmxlKTsKKworCWlmICgwID09IHJlc3Vs dCkgeworCQl0b25nYV9zZXRfczBfbWNfcmVnX2luZGV4KG5pX3RhYmxlKTsKKwkJcmVzdWx0ID0g dG9uZ2Ffc2V0X21jX3NwZWNpYWxfcmVnaXN0ZXJzKGh3bWdyLCBuaV90YWJsZSk7CisJfQorCisJ aWYgKDAgPT0gcmVzdWx0KQorCQl0b25nYV9zZXRfdmFsaWRfZmxhZyhuaV90YWJsZSk7CisKKwlr ZnJlZSh0YWJsZSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyogQ29weSBvbmUgYXJiIHNl dHRpbmcgdG8gYW5vdGhlciBhbmQgdGhlbiBzd2l0Y2ggdGhlIGFjdGl2ZSBzZXQuCisqIGFyYkZy ZXFTcmMgYW5kIGFyYkZyZXFEZXN0IGlzIG9uZSBvZiB0aGUgTUNfQ0dfQVJCX0ZSRVFfRnggY29u c3RhbnRzLgorKi8KK2ludCB0b25nYV9jb3B5X2FuZF9zd2l0Y2hfYXJiX3NldHMoc3RydWN0IHBw X2h3bWdyICpod21nciwKKwkJdWludDMyX3QgYXJiRnJlcVNyYywgdWludDMyX3QgYXJiRnJlcURl c3QpCit7CisJdWludDMyX3QgbWNfYXJiX2RyYW1fdGltaW5nOworCXVpbnQzMl90IG1jX2FyYl9k cmFtX3RpbWluZzI7CisJdWludDMyX3QgYnVyc3RfdGltZTsKKwl1aW50MzJfdCBtY19jZ19jb25m aWc7CisKKwlzd2l0Y2ggKGFyYkZyZXFTcmMpIHsKKwljYXNlIE1DX0NHX0FSQl9GUkVRX0YwOgor CQltY19hcmJfZHJhbV90aW1pbmcgID0gY2dzX3JlYWRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwg bW1NQ19BUkJfRFJBTV9USU1JTkcpOworCQltY19hcmJfZHJhbV90aW1pbmcyID0gY2dzX3JlYWRf cmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19BUkJfRFJBTV9USU1JTkcyKTsKKwkJYnVyc3Rf dGltZSA9IFBITV9SRUFEX0ZJRUxEKGh3bWdyLT5kZXZpY2UsIE1DX0FSQl9CVVJTVF9USU1FLCBT VEFURTApOworCQlicmVhazsKKworCWNhc2UgTUNfQ0dfQVJCX0ZSRVFfRjE6CisJCW1jX2FyYl9k cmFtX3RpbWluZyAgPSBjZ3NfcmVhZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBtbU1DX0FSQl9E UkFNX1RJTUlOR18xKTsKKwkJbWNfYXJiX2RyYW1fdGltaW5nMiA9IGNnc19yZWFkX3JlZ2lzdGVy KGh3bWdyLT5kZXZpY2UsIG1tTUNfQVJCX0RSQU1fVElNSU5HMl8xKTsKKwkJYnVyc3RfdGltZSA9 IFBITV9SRUFEX0ZJRUxEKGh3bWdyLT5kZXZpY2UsIE1DX0FSQl9CVVJTVF9USU1FLCBTVEFURTEp OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9CisKKwlzd2l0Y2ggKGFy YkZyZXFEZXN0KSB7CisJY2FzZSBNQ19DR19BUkJfRlJFUV9GMDoKKwkJY2dzX3dyaXRlX3JlZ2lz dGVyKGh3bWdyLT5kZXZpY2UsIG1tTUNfQVJCX0RSQU1fVElNSU5HLCBtY19hcmJfZHJhbV90aW1p bmcpOworCQljZ3Nfd3JpdGVfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19BUkJfRFJBTV9U SU1JTkcyLCBtY19hcmJfZHJhbV90aW1pbmcyKTsKKwkJUEhNX1dSSVRFX0ZJRUxEKGh3bWdyLT5k ZXZpY2UsIE1DX0FSQl9CVVJTVF9USU1FLCBTVEFURTAsIGJ1cnN0X3RpbWUpOworCQlicmVhazsK KworCWNhc2UgTUNfQ0dfQVJCX0ZSRVFfRjE6CisJCWNnc193cml0ZV9yZWdpc3Rlcihod21nci0+ ZGV2aWNlLCBtbU1DX0FSQl9EUkFNX1RJTUlOR18xLCBtY19hcmJfZHJhbV90aW1pbmcpOworCQlj Z3Nfd3JpdGVfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19BUkJfRFJBTV9USU1JTkcyXzEs IG1jX2FyYl9kcmFtX3RpbWluZzIpOworCQlQSE1fV1JJVEVfRklFTEQoaHdtZ3ItPmRldmljZSwg TUNfQVJCX0JVUlNUX1RJTUUsIFNUQVRFMSwgYnVyc3RfdGltZSk7CisJCWJyZWFrOworCisJZGVm YXVsdDoKKwkJcmV0dXJuIC0xOworCX0KKworCW1jX2NnX2NvbmZpZyA9IGNnc19yZWFkX3JlZ2lz dGVyKGh3bWdyLT5kZXZpY2UsIG1tTUNfQ0dfQ09ORklHKTsKKwltY19jZ19jb25maWcgfD0gMHgw MDAwMDAwRjsKKwljZ3Nfd3JpdGVfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19DR19DT05G SUcsIG1jX2NnX2NvbmZpZyk7CisJUEhNX1dSSVRFX0ZJRUxEKGh3bWdyLT5kZXZpY2UsIE1DX0FS Ql9DRywgQ0dfQVJCX1JFUSwgYXJiRnJlcURlc3QpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgor ICogSW5pdGlhbCBzd2l0Y2ggZnJvbSBBUkIgRjAtPkYxCisgKgorICogQHBhcmFtICAgIGh3bWdy ICB0aGUgYWRkcmVzcyBvZiB0aGUgcG93ZXJwbGF5IGhhcmR3YXJlIG1hbmFnZXIuCisgKiBAcmV0 dXJuICAgYWx3YXlzIDAKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdG8gYmUgY2FsbGVkIGZyb20gdGhl IFNldFBvd2VyU3RhdGUgdGFibGUuCisgKi8KK2ludCB0b25nYV9pbml0aWFsX3N3aXRjaF9mcm9t X2FyYl9mMF90b19mMShzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCXJldHVybiB0b25nYV9j b3B5X2FuZF9zd2l0Y2hfYXJiX3NldHMoaHdtZ3IsIE1DX0NHX0FSQl9GUkVRX0YwLCBNQ19DR19B UkJfRlJFUV9GMSk7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgQVJCIERSQU0gdGltaW5n IHRhYmxlJ3MgaW5kZXggZmllbGQuCisgKgorICogQHBhcmFtICAgIGh3bWdyICB0aGUgYWRkcmVz cyBvZiB0aGUgcG93ZXJwbGF5IGhhcmR3YXJlIG1hbmFnZXIuCisgKiBAcmV0dXJuICAgYWx3YXlz IDAKKyAqLworaW50IHRvbmdhX2luaXRfYXJiX3RhYmxlX2luZGV4KHN0cnVjdCBwcF9od21nciAq aHdtZ3IpCit7CisJY29uc3QgdG9uZ2FfaHdtZ3IgKmRhdGEgPSAoc3RydWN0IHRvbmdhX2h3bWdy ICopKGh3bWdyLT5iYWNrZW5kKTsKKwl1aW50MzJfdCB0bXA7CisJaW50IHJlc3VsdDsKKworCS8q CisJKiBUaGlzIGlzIGEgcmVhZC1tb2RpZnktd3JpdGUgb24gdGhlIGZpcnN0IGJ5dGUgb2YgdGhl IEFSQiB0YWJsZS4KKwkqIFRoZSBmaXJzdCBieXRlIGluIHRoZSBTTVU3Ml9EaXNjcmV0ZV9NQ0Fy YkRyYW1UaW1pbmdUYWJsZSBzdHJ1Y3R1cmUgaXMgdGhlIGZpZWxkICdjdXJyZW50Jy4KKwkqIFRo aXMgc29sdXRpb24gaXMgdWdseSwgYnV0IHdlIG5ldmVyIHdyaXRlIHRoZSB3aG9sZSB0YWJsZSBv bmx5IGluZGl2aWR1YWwgZmllbGRzIGluIGl0LgorCSogSW4gcmVhbGl0eSB0aGlzIGZpZWxkIHNo b3VsZCBub3QgYmUgaW4gdGhhdCBzdHJ1Y3R1cmUgYnV0IGluIGEgc29mdCByZWdpc3Rlci4KKwkq LworCXJlc3VsdCA9IHRvbmdhX3JlYWRfc21jX3NyYW1fZHdvcmQoaHdtZ3ItPnNtdW1nciwKKwkJ CQlkYXRhLT5hcmJfdGFibGVfc3RhcnQsICZ0bXAsIGRhdGEtPnNyYW1fZW5kKTsKKworCWlmICgw ICE9IHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXRtcCAmPSAweDAwRkZGRkZGOworCXRt cCB8PSAoKHVpbnQzMl90KU1DX0NHX0FSQl9GUkVRX0YxKSA8PCAyNDsKKworCXJldHVybiB0b25n YV93cml0ZV9zbWNfc3JhbV9kd29yZChod21nci0+c211bWdyLAorCQkJZGF0YS0+YXJiX3RhYmxl X3N0YXJ0LCAgdG1wLCBkYXRhLT5zcmFtX2VuZCk7Cit9CisKK2ludCB0b25nYV9wb3B1bGF0ZV9t Y19yZWdfYWRkcmVzcyhzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLCBTTVU3Ml9EaXNjcmV0ZV9NQ1Jl Z2lzdGVycyAqbWNfcmVnX3RhYmxlKQoreworCWNvbnN0IHN0cnVjdCB0b25nYV9od21nciAqZGF0 YSA9IChzdHJ1Y3QgdG9uZ2FfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCisJdWludDMyX3Qg aSwgajsKKworCWZvciAoaSA9IDAsIGogPSAwOyBqIDwgZGF0YS0+dG9uZ2FfbWNfcmVnX3RhYmxl Lmxhc3Q7IGorKykgeworCQlpZiAoZGF0YS0+dG9uZ2FfbWNfcmVnX3RhYmxlLnZhbGlkZmxhZyAm IDE8PGopIHsKKwkJCVBQX0FTU0VSVF9XSVRIX0NPREUoaSA8IFNNVTcyX0RJU0NSRVRFX01DX1JF R0lTVEVSX0FSUkFZX1NJWkUsCisJCQkJIkluZGV4IG9mIG1jX3JlZ190YWJsZS0+YWRkcmVzc1td IGFycmF5IG91dCBvZiBib3VuZGFyeSIsIHJldHVybiAtMSk7CisJCQltY19yZWdfdGFibGUtPmFk ZHJlc3NbaV0uczAgPQorCQkJCVBQX0hPU1RfVE9fU01DX1VTKGRhdGEtPnRvbmdhX21jX3JlZ190 YWJsZS5tY19yZWdfYWRkcmVzc1tqXS5zMCk7CisJCQltY19yZWdfdGFibGUtPmFkZHJlc3NbaV0u czEgPQorCQkJCVBQX0hPU1RfVE9fU01DX1VTKGRhdGEtPnRvbmdhX21jX3JlZ190YWJsZS5tY19y ZWdfYWRkcmVzc1tqXS5zMSk7CisJCQlpKys7CisJCX0KKwl9CisKKwltY19yZWdfdGFibGUtPmxh c3QgPSAodWludDhfdClpOworCisJcmV0dXJuIDA7Cit9CisKKy8qY29udmVydCByZWdpc3RlciB2 YWx1ZXMgZnJvbSBkcml2ZXIgdG8gU01DIGZvcm1hdCAqLwordm9pZCB0b25nYV9jb252ZXJ0X21j X3JlZ2lzdGVycygKKwljb25zdCBwaHdfdG9uZ2FfbWNfcmVnX2VudHJ5ICogcEVudHJ5LAorCVNN VTcyX0Rpc2NyZXRlX01DUmVnaXN0ZXJTZXQgKnBEYXRhLAorCXVpbnQzMl90IG51bUVudHJpZXMs IHVpbnQzMl90IHZhbGlkZmxhZykKK3sKKwl1aW50MzJfdCBpLCBqOworCisJZm9yIChpID0gMCwg aiA9IDA7IGogPCBudW1FbnRyaWVzOyBqKyspIHsKKwkJaWYgKHZhbGlkZmxhZyAmIDE8PGopIHsK KwkJCXBEYXRhLT52YWx1ZVtpXSA9IFBQX0hPU1RfVE9fU01DX1VMKHBFbnRyeS0+bWNfZGF0YVtq XSk7CisJCQlpKys7CisJCX0KKwl9Cit9CisKKy8qIGZpbmQgdGhlIGVudHJ5IGluIHRoZSBtZW1v cnkgcmFuZ2UgdGFibGUsIHRoZW4gcG9wdWxhdGUgdGhlIHZhbHVlIHRvIFNNQydzIHRvbmdhX21j X3JlZ190YWJsZSAqLworaW50IHRvbmdhX2NvbnZlcnRfbWNfcmVnX3RhYmxlX2VudHJ5X3RvX3Nt YygKKwkJc3RydWN0IHBwX2h3bWdyICpod21nciwKKwkJY29uc3QgdWludDMyX3QgbWVtb3J5X2Ns b2NrLAorCQlTTVU3Ml9EaXNjcmV0ZV9NQ1JlZ2lzdGVyU2V0ICptY19yZWdfdGFibGVfZGF0YQor CQkpCit7CisJY29uc3QgdG9uZ2FfaHdtZ3IgKmRhdGEgPSAoc3RydWN0IHRvbmdhX2h3bWdyICop KGh3bWdyLT5iYWNrZW5kKTsKKwl1aW50MzJfdCBpID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBk YXRhLT50b25nYV9tY19yZWdfdGFibGUubnVtX2VudHJpZXM7IGkrKykgeworCQlpZiAobWVtb3J5 X2Nsb2NrIDw9CisJCQlkYXRhLT50b25nYV9tY19yZWdfdGFibGUubWNfcmVnX3RhYmxlX2VudHJ5 W2ldLm1jbGtfbWF4KSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICgoaSA9PSBkYXRhLT50 b25nYV9tY19yZWdfdGFibGUubnVtX2VudHJpZXMpICYmIChpID4gMCkpCisJCS0taTsKKworCXRv bmdhX2NvbnZlcnRfbWNfcmVnaXN0ZXJzKCZkYXRhLT50b25nYV9tY19yZWdfdGFibGUubWNfcmVn X3RhYmxlX2VudHJ5W2ldLAorCQltY19yZWdfdGFibGVfZGF0YSwgZGF0YS0+dG9uZ2FfbWNfcmVn X3RhYmxlLmxhc3QsIGRhdGEtPnRvbmdhX21jX3JlZ190YWJsZS52YWxpZGZsYWcpOworCisJcmV0 dXJuIDA7Cit9CisKK2ludCB0b25nYV9jb252ZXJ0X21jX3JlZ190YWJsZV90b19zbWMoc3RydWN0 IHBwX2h3bWdyICpod21nciwKKwkJU01VNzJfRGlzY3JldGVfTUNSZWdpc3RlcnMgKm1jX3JlZ190 YWJsZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwl0b25nYV9od21nciAqZGF0YSA9IChzdHJ1Y3Qg dG9uZ2FfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCWludCByZXM7CisJdWludDMyX3QgaTsK KworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5kcG1fdGFibGUubWNsa190YWJsZS5jb3VudDsgaSsr KSB7CisJCXJlcyA9IHRvbmdhX2NvbnZlcnRfbWNfcmVnX3RhYmxlX2VudHJ5X3RvX3NtYygKKwkJ CQlod21nciwKKwkJCQlkYXRhLT5kcG1fdGFibGUubWNsa190YWJsZS5kcG1fbGV2ZWxzW2ldLnZh bHVlLAorCQkJCSZtY19yZWdfdGFibGUtPmRhdGFbaV0KKwkJCQkpOworCisJCWlmICgwICE9IHJl cykKKwkJCXJlc3VsdCA9IHJlczsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgdG9u Z2FfcG9wdWxhdGVfaW5pdGlhbF9tY19yZWdfdGFibGUoc3RydWN0IHBwX2h3bWdyICpod21ncikK K3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCB0b25nYV9od21nciAqZGF0YSA9IChzdHJ1Y3QgdG9u Z2FfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCisJbWVtc2V0KCZkYXRhLT5tY19yZWdfdGFi bGUsIDB4MDAsIHNpemVvZihTTVU3Ml9EaXNjcmV0ZV9NQ1JlZ2lzdGVycykpOworCXJlc3VsdCA9 IHRvbmdhX3BvcHVsYXRlX21jX3JlZ19hZGRyZXNzKGh3bWdyLCAmKGRhdGEtPm1jX3JlZ190YWJs ZSkpOworCVBQX0FTU0VSVF9XSVRIX0NPREUoMCA9PSByZXN1bHQsCisJCSJGYWlsZWQgdG8gaW5p dGlhbGl6ZSBNQ1JlZ1RhYmxlIGZvciB0aGUgTUMgcmVnaXN0ZXIgYWRkcmVzc2VzISIsIHJldHVy biByZXN1bHQ7KTsKKworCXJlc3VsdCA9IHRvbmdhX2NvbnZlcnRfbWNfcmVnX3RhYmxlX3RvX3Nt Yyhod21nciwgJmRhdGEtPm1jX3JlZ190YWJsZSk7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgwID09 IHJlc3VsdCwKKwkJIkZhaWxlZCB0byBpbml0aWFsaXplIE1DUmVnVGFibGUgZm9yIGRyaXZlciBz dGF0ZSEiLCByZXR1cm4gcmVzdWx0Oyk7CisKKwlyZXR1cm4gdG9uZ2FfY29weV9ieXRlc190b19z bWMoaHdtZ3ItPnNtdW1nciwgZGF0YS0+bWNfcmVnX3RhYmxlX3N0YXJ0LAorCQkJKHVpbnQ4X3Qg KikmZGF0YS0+bWNfcmVnX3RhYmxlLCBzaXplb2YoU01VNzJfRGlzY3JldGVfTUNSZWdpc3RlcnMp LCBkYXRhLT5zcmFtX2VuZCk7Cit9CisKKy8qKgorICogUHJvZ3JhbXMgc3RhdGljIHNjcmVlZCBk ZXRlY3Rpb24gcGFyYW1ldGVycworICoKKyAqIEBwYXJhbSAgIGh3bWdyICB0aGUgYWRkcmVzcyBv ZiB0aGUgcG93ZXJwbGF5IGhhcmR3YXJlIG1hbmFnZXIuCisgKiBAcmV0dXJuICAgYWx3YXlzIDAK KyAqLworaW50IHRvbmdhX3Byb2dyYW1fc3RhdGljX3NjcmVlbl90aHJlc2hvbGRfcGFyYW1ldGVy cyhzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCXRvbmdhX2h3bWdyICpkYXRhID0gKHRvbmdh X2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKworCS8qIFNldCBzdGF0aWMgc2NyZWVuIHRocmVz aG9sZCB1bml0Ki8KKwlQSE1fV1JJVEVfVkZQRl9JTkRJUkVDVF9GSUVMRChod21nci0+ZGV2aWNl LAorCQlDR1NfSU5EX1JFR19fU01DLCBDR19TVEFUSUNfU0NSRUVOX1BBUkFNRVRFUiwgU1RBVElD X1NDUkVFTl9USFJFU0hPTERfVU5JVCwKKwkJZGF0YS0+c3RhdGljX3NjcmVlbl90aHJlc2hvbGRf dW5pdCk7CisJLyogU2V0IHN0YXRpYyBzY3JlZW4gdGhyZXNob2xkKi8KKwlQSE1fV1JJVEVfVkZQ Rl9JTkRJUkVDVF9GSUVMRChod21nci0+ZGV2aWNlLAorCQlDR1NfSU5EX1JFR19fU01DLCBDR19T VEFUSUNfU0NSRUVOX1BBUkFNRVRFUiwgU1RBVElDX1NDUkVFTl9USFJFU0hPTEQsCisJCWRhdGEt PnN0YXRpY19zY3JlZW5fdGhyZXNob2xkKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFNl dHVwIGRpc3BsYXkgZ2FwIGZvciBnbGl0Y2ggZnJlZSBtZW1vcnkgY2xvY2sgc3dpdGNoaW5nLgor ICoKKyAqIEBwYXJhbSAgICBod21nciAgdGhlIGFkZHJlc3Mgb2YgdGhlIHBvd2VycGxheSBoYXJk d2FyZSBtYW5hZ2VyLgorICogQHJldHVybiAgIGFsd2F5cyAwCisgKi8KK2ludCB0b25nYV9lbmFi bGVfZGlzcGxheV9nYXAoc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwl1aW50MzJfdCBkaXNw bGF5X2dhcCA9IGNnc19yZWFkX2luZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLAorCQkJCQkJCUNH U19JTkRfUkVHX19TTUMsIGl4Q0dfRElTUExBWV9HQVBfQ05UTCk7CisKKwlkaXNwbGF5X2dhcCA9 IFBITV9TRVRfRklFTEQoZGlzcGxheV9nYXAsCisJCQkJCUNHX0RJU1BMQVlfR0FQX0NOVEwsIERJ U1BfR0FQLCBESVNQTEFZX0dBUF9JR05PUkUpOworCisJZGlzcGxheV9nYXAgPSBQSE1fU0VUX0ZJ RUxEKGRpc3BsYXlfZ2FwLAorCQkJCQlDR19ESVNQTEFZX0dBUF9DTlRMLCBESVNQX0dBUF9NQ0hH LCBESVNQTEFZX0dBUF9WQkxBTkspOworCisJY2dzX3dyaXRlX2luZF9yZWdpc3Rlcihod21nci0+ ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01DLAorCQlpeENHX0RJU1BMQVlfR0FQX0NOVEwsIGRpc3Bs YXlfZ2FwKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFByb2dyYW1zIGFjdGl2aXR5IHN0 YXRlIHRyYW5zaXRpb24gdm90aW5nIGNsaWVudHMKKyAqCisgKiBAcGFyYW0gICAgaHdtZ3IgIHRo ZSBhZGRyZXNzIG9mIHRoZSBwb3dlcnBsYXkgaGFyZHdhcmUgbWFuYWdlci4KKyAqIEByZXR1cm4g ICBhbHdheXMgMAorICovCitpbnQgdG9uZ2FfcHJvZ3JhbV92b3RpbmdfY2xpZW50cyhzdHJ1Y3Qg cHBfaHdtZ3IgKmh3bWdyKQoreworCXRvbmdhX2h3bWdyICpkYXRhID0gKHRvbmdhX2h3bWdyICop KGh3bWdyLT5iYWNrZW5kKTsKKworCS8qIENsZWFyIHJlc2V0IGZvciB2b3RpbmcgY2xpZW50cyBi ZWZvcmUgZW5hYmxpbmcgRFBNICovCisJUEhNX1dSSVRFX1ZGUEZfSU5ESVJFQ1RfRklFTEQoaHdt Z3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywKKwkJU0NMS19QV1JNR1RfQ05UTCwgUkVTRVRf U0NMS19DTlQsIDApOworCVBITV9XUklURV9WRlBGX0lORElSRUNUX0ZJRUxEKGh3bWdyLT5kZXZp Y2UsIENHU19JTkRfUkVHX19TTUMsCisJCVNDTEtfUFdSTUdUX0NOVEwsIFJFU0VUX0JVU1lfQ05U LCAwKTsKKworCWNnc193cml0ZV9pbmRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgQ0dTX0lORF9S RUdfX1NNQywKKwkJaXhDR19GUkVRX1RSQU5fVk9USU5HXzAsIGRhdGEtPnZvdGluZ19yaWdodHNf Y2xpZW50czApOworCWNnc193cml0ZV9pbmRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgQ0dTX0lO RF9SRUdfX1NNQywKKwkJaXhDR19GUkVRX1RSQU5fVk9USU5HXzEsIGRhdGEtPnZvdGluZ19yaWdo dHNfY2xpZW50czEpOworCWNnc193cml0ZV9pbmRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgQ0dT X0lORF9SRUdfX1NNQywKKwkJaXhDR19GUkVRX1RSQU5fVk9USU5HXzIsIGRhdGEtPnZvdGluZ19y aWdodHNfY2xpZW50czIpOworCWNnc193cml0ZV9pbmRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwg Q0dTX0lORF9SRUdfX1NNQywKKwkJaXhDR19GUkVRX1RSQU5fVk9USU5HXzMsIGRhdGEtPnZvdGlu Z19yaWdodHNfY2xpZW50czMpOworCWNnc193cml0ZV9pbmRfcmVnaXN0ZXIoaHdtZ3ItPmRldmlj ZSwgQ0dTX0lORF9SRUdfX1NNQywKKwkJaXhDR19GUkVRX1RSQU5fVk9USU5HXzQsIGRhdGEtPnZv dGluZ19yaWdodHNfY2xpZW50czQpOworCWNnc193cml0ZV9pbmRfcmVnaXN0ZXIoaHdtZ3ItPmRl dmljZSwgQ0dTX0lORF9SRUdfX1NNQywKKwkJaXhDR19GUkVRX1RSQU5fVk9USU5HXzUsIGRhdGEt PnZvdGluZ19yaWdodHNfY2xpZW50czUpOworCWNnc193cml0ZV9pbmRfcmVnaXN0ZXIoaHdtZ3It PmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywKKwkJaXhDR19GUkVRX1RSQU5fVk9USU5HXzYsIGRh dGEtPnZvdGluZ19yaWdodHNfY2xpZW50czYpOworCWNnc193cml0ZV9pbmRfcmVnaXN0ZXIoaHdt Z3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywKKwkJaXhDR19GUkVRX1RSQU5fVk9USU5HXzcs IGRhdGEtPnZvdGluZ19yaWdodHNfY2xpZW50czcpOworCisJcmV0dXJuIDA7Cit9CisKKworaW50 IHRvbmdhX2VuYWJsZV9kcG1fdGFza3Moc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwlpbnQg dG1wX3Jlc3VsdCwgcmVzdWx0ID0gMDsKKworCXRtcF9yZXN1bHQgPSB0b25nYV9jaGVja19mb3Jf ZHBtX3N0b3BwZWQoaHdtZ3IpOworCisJaWYgKGNmX3RvbmdhX3ZvbHRhZ2VfY29udHJvbChod21n cikpIHsKKwkJdG1wX3Jlc3VsdCA9IHRvbmdhX2VuYWJsZV92b2x0YWdlX2NvbnRyb2woaHdtZ3Ip OworCQlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09IHRtcF9yZXN1bHQpLAorCQkJIkZhaWxlZCB0 byBlbmFibGUgdm9sdGFnZSBjb250cm9sISIsIHJlc3VsdCA9IHRtcF9yZXN1bHQpOworCisJCXRt cF9yZXN1bHQgPSB0b25nYV9jb25zdHJ1Y3Rfdm9sdGFnZV90YWJsZXMoaHdtZ3IpOworCQlQUF9B U1NFUlRfV0lUSF9DT0RFKCgwID09IHRtcF9yZXN1bHQpLAorCQkJIkZhaWxlZCB0byBjb250cnVj dCB2b2x0YWdlIHRhYmxlcyEiLCByZXN1bHQgPSB0bXBfcmVzdWx0KTsKKwl9CisKKwl0bXBfcmVz dWx0ID0gdG9uZ2FfaW5pdGlhbGl6ZV9tY19yZWdfdGFibGUoaHdtZ3IpOworCVBQX0FTU0VSVF9X SVRIX0NPREUoKDAgPT0gdG1wX3Jlc3VsdCksCisJCSJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBNQyBy ZWcgdGFibGUhIiwgcmVzdWx0ID0gdG1wX3Jlc3VsdCk7CisKKwl0bXBfcmVzdWx0ID0gdG9uZ2Ff cHJvZ3JhbV9zdGF0aWNfc2NyZWVuX3RocmVzaG9sZF9wYXJhbWV0ZXJzKGh3bWdyKTsKKwlQUF9B U1NFUlRfV0lUSF9DT0RFKCgwID09IHRtcF9yZXN1bHQpLAorCQkiRmFpbGVkIHRvIHByb2dyYW0g c3RhdGljIHNjcmVlbiB0aHJlc2hvbGQgcGFyYW1ldGVycyEiLCByZXN1bHQgPSB0bXBfcmVzdWx0 KTsKKworCXRtcF9yZXN1bHQgPSB0b25nYV9lbmFibGVfZGlzcGxheV9nYXAoaHdtZ3IpOworCVBQ X0FTU0VSVF9XSVRIX0NPREUoKDAgPT0gdG1wX3Jlc3VsdCksCisJCSJGYWlsZWQgdG8gZW5hYmxl IGRpc3BsYXkgZ2FwISIsIHJlc3VsdCA9IHRtcF9yZXN1bHQpOworCisJdG1wX3Jlc3VsdCA9IHRv bmdhX3Byb2dyYW1fdm90aW5nX2NsaWVudHMoaHdtZ3IpOworCVBQX0FTU0VSVF9XSVRIX0NPREUo KDAgPT0gdG1wX3Jlc3VsdCksCisJCSJGYWlsZWQgdG8gcHJvZ3JhbSB2b3RpbmcgY2xpZW50cyEi LCByZXN1bHQgPSB0bXBfcmVzdWx0KTsKKworCXRtcF9yZXN1bHQgPSB0b25nYV9wcm9jZXNzX2Zp cm13YXJlX2hlYWRlcihod21ncik7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSB0bXBfcmVz dWx0KSwKKwkJIkZhaWxlZCB0byBwcm9jZXNzIGZpcm13YXJlIGhlYWRlciEiLCByZXN1bHQgPSB0 bXBfcmVzdWx0KTsKKworCXRtcF9yZXN1bHQgPSB0b25nYV9pbml0aWFsX3N3aXRjaF9mcm9tX2Fy Yl9mMF90b19mMShod21ncik7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSB0bXBfcmVzdWx0 KSwKKwkJIkZhaWxlZCB0byBpbml0aWFsaXplIHN3aXRjaCBmcm9tIEFyYkYwIHRvIEYxISIsIHJl c3VsdCA9IHRtcF9yZXN1bHQpOworCisJdG1wX3Jlc3VsdCA9IHRvbmdhX2luaXRfc21jX3RhYmxl KGh3bWdyKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09IHRtcF9yZXN1bHQpLAorCQkiRmFp bGVkIHRvIGluaXRpYWxpemUgU01DIHRhYmxlISIsIHJlc3VsdCA9IHRtcF9yZXN1bHQpOworCisJ dG1wX3Jlc3VsdCA9IHRvbmdhX2luaXRfYXJiX3RhYmxlX2luZGV4KGh3bWdyKTsKKwlQUF9BU1NF UlRfV0lUSF9DT0RFKCgwID09IHRtcF9yZXN1bHQpLAorCQkiRmFpbGVkIHRvIGluaXRpYWxpemUg QVJCIHRhYmxlIGluZGV4ISIsIHJlc3VsdCA9IHRtcF9yZXN1bHQpOworCisJdG1wX3Jlc3VsdCA9 IHRvbmdhX3BvcHVsYXRlX2luaXRpYWxfbWNfcmVnX3RhYmxlKGh3bWdyKTsKKwlQUF9BU1NFUlRf V0lUSF9DT0RFKCgwID09IHRtcF9yZXN1bHQpLAorCQkiRmFpbGVkIHRvIHBvcHVsYXRlIGluaXRp YWxpemUgTUMgUmVnIHRhYmxlISIsIHJlc3VsdCA9IHRtcF9yZXN1bHQpOworCisJLyogZW5hYmxl IFNDTEsgY29udHJvbCAqLworCXRtcF9yZXN1bHQgPSB0b25nYV9lbmFibGVfc2Nsa19jb250cm9s KGh3bWdyKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09IHRtcF9yZXN1bHQpLAorCQkiRmFp bGVkIHRvIGVuYWJsZSBTQ0xLIGNvbnRyb2whIiwgcmVzdWx0ID0gdG1wX3Jlc3VsdCk7CisKKwkv KiBlbmFibGUgRFBNICovCisJdG1wX3Jlc3VsdCA9IHRvbmdhX3N0YXJ0X2RwbShod21ncik7CisJ UFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSB0bXBfcmVzdWx0KSwKKwkJIkZhaWxlZCB0byBzdGFy dCBEUE0hIiwgcmVzdWx0ID0gdG1wX3Jlc3VsdCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitp bnQgdG9uZ2FfZGlzYWJsZV9kcG1fdGFza3Moc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwlp bnQgdG1wX3Jlc3VsdCwgcmVzdWx0ID0gMDsKKworCXRtcF9yZXN1bHQgPSB0b25nYV9jaGVja19m b3JfZHBtX3J1bm5pbmcoaHdtZ3IpOworCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgPT0gdG1wX3Jl c3VsdCksCisJCSJTTUMgaXMgc3RpbGwgcnVubmluZyEiLCByZXR1cm4gMCk7CisKKwl0bXBfcmVz dWx0ID0gdG9uZ2Ffc3RvcF9kcG0oaHdtZ3IpOworCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgPT0g dG1wX3Jlc3VsdCksCisJCSJGYWlsZWQgdG8gc3RvcCBEUE0hIiwgcmVzdWx0ID0gdG1wX3Jlc3Vs dCk7CisKKwl0bXBfcmVzdWx0ID0gdG9uZ2FfcmVzZXRfdG9fZGVmYXVsdChod21ncik7CisJUFBf QVNTRVJUX1dJVEhfQ09ERSgoMCA9PSB0bXBfcmVzdWx0KSwKKwkJIkZhaWxlZCB0byByZXNldCB0 byBkZWZhdWx0ISIsIHJlc3VsdCA9IHRtcF9yZXN1bHQpOworCisJcmV0dXJuIHJlc3VsdDsKK30K KworaW50IHRvbmdhX3Jlc2V0X2FzaWNfdGFza3Moc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sK KwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gdG9uZ2Ffc2V0X2Jvb3Rfc3RhdGUoaHdtZ3IpOwor CWlmICgwICE9IHJlc3VsdCkKKwkJcHJpbnRrKEtFUk5fRVJSICJbIHBvd2VycGxheSBdIEZhaWxl ZCB0byByZXNldCBhc2ljIHZpYSBzZXQgYm9vdCBzdGF0ZSEgXG4iKTsKKworCXJldHVybiByZXN1 bHQ7Cit9CisKK2ludCB0b25nYV9od21ncl9iYWNrZW5kX2Zpbmkoc3RydWN0IHBwX2h3bWdyICpo d21ncikKK3sKKwlpZiAoTlVMTCAhPSBod21nci0+ZHluX3N0YXRlLnZkZGNfZGVwX29uX2RhbF9w d3JsKSB7CisJCWtmcmVlKGh3bWdyLT5keW5fc3RhdGUudmRkY19kZXBfb25fZGFsX3B3cmwpOwor CQlod21nci0+ZHluX3N0YXRlLnZkZGNfZGVwX29uX2RhbF9wd3JsID0gTlVMTDsKKwl9CisKKwlp ZiAoTlVMTCAhPSBod21nci0+YmFja2VuZCkgeworCQlrZnJlZShod21nci0+YmFja2VuZCk7CisJ CWh3bWdyLT5iYWNrZW5kID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBJ bml0aWFsaXplcyB0aGUgVm9sY2FuaWMgSXNsYW5kcyBIYXJkd2FyZSBNYW5hZ2VyCisgKgorICog QHBhcmFtICAgaHdtZ3IgdGhlIGFkZHJlc3Mgb2YgdGhlIHBvd2VycGxheSBoYXJkd2FyZSBtYW5h Z2VyLgorICogQHJldHVybiAgIDEgaWYgc3VjY2Vzczsgb3RoZXJ3aXNlIGFwcHJvcHJpYXRlIGVy cm9yIGNvZGUuCisgKi8KK2ludCB0b25nYV9od21ncl9iYWNrZW5kX2luaXQoc3RydWN0IHBwX2h3 bWdyICpod21ncikKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlTTVU3Ml9EaXNjcmV0ZV9EcG1UYWJs ZSAgKnRhYmxlID0gTlVMTDsKKwl0b25nYV9od21nciAqZGF0YSA9IChzdHJ1Y3QgdG9uZ2FfaHdt Z3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXBwX2F0b21jdHJsX2dwaW9fcGluX2Fzc2lnbm1lbnQg Z3Bpb19waW5fYXNzaWdubWVudDsKKwlzdHJ1Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqcHB0 YWJsZV9pbmZvID0gKHN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICopKGh3bWdyLT5wcHRh YmxlKTsKKwlwaHdfdG9uZ2FfdWx2X3Bhcm0gKnVsdjsKKworCVBQX0FTU0VSVF9XSVRIX0NPREUo KE5VTEwgIT0gaHdtZ3IpLAorCQkiSW52YWxpZCBQYXJhbWV0ZXIhIiwgcmV0dXJuIC0xOyk7CisK KwlkYXRhLT5kbGxfZGVmYXVsZV9vbiA9IDA7CisJZGF0YS0+c3JhbV9lbmQgPSBTTUNfUkFNX0VO RDsKKworCWRhdGEtPmFjdGl2aXR5X3RhcmdldFswXSA9IFBQVE9OR0FfVEFSR0VUQUNUSVZJVFlf REZMVDsKKwlkYXRhLT5hY3Rpdml0eV90YXJnZXRbMV0gPSBQUFRPTkdBX1RBUkdFVEFDVElWSVRZ X0RGTFQ7CisJZGF0YS0+YWN0aXZpdHlfdGFyZ2V0WzJdID0gUFBUT05HQV9UQVJHRVRBQ1RJVklU WV9ERkxUOworCWRhdGEtPmFjdGl2aXR5X3RhcmdldFszXSA9IFBQVE9OR0FfVEFSR0VUQUNUSVZJ VFlfREZMVDsKKwlkYXRhLT5hY3Rpdml0eV90YXJnZXRbNF0gPSBQUFRPTkdBX1RBUkdFVEFDVElW SVRZX0RGTFQ7CisJZGF0YS0+YWN0aXZpdHlfdGFyZ2V0WzVdID0gUFBUT05HQV9UQVJHRVRBQ1RJ VklUWV9ERkxUOworCWRhdGEtPmFjdGl2aXR5X3RhcmdldFs2XSA9IFBQVE9OR0FfVEFSR0VUQUNU SVZJVFlfREZMVDsKKwlkYXRhLT5hY3Rpdml0eV90YXJnZXRbN10gPSBQUFRPTkdBX1RBUkdFVEFD VElWSVRZX0RGTFQ7CisKKwlkYXRhLT52ZGRjX3ZkZGNpX2RlbHRhID0gVkREQ19WRERDSV9ERUxU QTsKKwlkYXRhLT52ZGRjX3ZkZGdmeF9kZWx0YSA9IFZERENfVkRER0ZYX0RFTFRBOworCWRhdGEt Pm1jbGtfYWN0aXZpdHlfdGFyZ2V0ID0gUFBUT05HQV9NQ0xLX1RBUkdFVEFDVElWSVRZX0RGTFQ7 CisKKwlwaG1fY2FwX3NldChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMs CisJCVBITV9QbGF0Zm9ybUNhcHNfRGlzYWJsZVZvbHRhZ2VJc2xhbmQpOworCisJZGF0YS0+c2Ns a19kcG1fa2V5X2Rpc2FibGVkID0gMDsKKwlkYXRhLT5tY2xrX2RwbV9rZXlfZGlzYWJsZWQgPSAw OworCWRhdGEtPnBjaWVfZHBtX2tleV9kaXNhYmxlZCA9IDA7CisJZGF0YS0+cGNjX21vbml0b3Jf ZW5hYmxlZCA9IDA7CisKKwlwaG1fY2FwX3NldChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5w bGF0Zm9ybUNhcHMsCisJCVBITV9QbGF0Zm9ybUNhcHNfVW5UYWJsZWRIYXJkd2FyZUludGVyZmFj ZSk7CisKKwlkYXRhLT5ncGlvX2RlYnVnID0gMDsKKwlkYXRhLT5lbmdpbmVfY2xvY2tfZGF0YSA9 IDA7CisJZGF0YS0+bWVtb3J5X2Nsb2NrX2RhdGEgPSAwOworCXBobV9jYXBfc2V0KGh3bWdyLT5w bGF0Zm9ybV9kZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywKKwkJUEhNX1BsYXRmb3JtQ2Fwc19EeW5h bWljUGF0Y2hQb3dlclN0YXRlKTsKKworCS8qIG5lZWQgdG8gc2V0IHZvbHRhZ2UgY29udHJvbCB0 eXBlcyBiZWZvcmUgRVZWIHBhdGNoaW5nKi8KKwlkYXRhLT52b2x0YWdlX2NvbnRyb2wgPSBUT05H QV9WT0xUQUdFX0NPTlRST0xfTk9ORTsKKwlkYXRhLT52ZGRfY2lfY29udHJvbCA9IFRPTkdBX1ZP TFRBR0VfQ09OVFJPTF9OT05FOworCWRhdGEtPnZkZF9nZnhfY29udHJvbCA9IFRPTkdBX1ZPTFRB R0VfQ09OVFJPTF9OT05FOworCWRhdGEtPm12ZGRfY29udHJvbCA9IFRPTkdBX1ZPTFRBR0VfQ09O VFJPTF9OT05FOworCisJaWYgKDAgPT0gYXRvbWN0cmxfaXNfdm9sdGFnZV9jb250cm9sZWRfYnlf Z3Bpb192Myhod21nciwKKwkJCQlWT0xUQUdFX1RZUEVfVkREQywgVk9MVEFHRV9PQkpfU1ZJRDIp KSB7CisJCWRhdGEtPnZvbHRhZ2VfY29udHJvbCA9IFRPTkdBX1ZPTFRBR0VfQ09OVFJPTF9CWV9T VklEMjsKKwl9CisKKwlpZiAocGhtX2NhcF9lbmFibGVkKGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlw dG9yLnBsYXRmb3JtQ2FwcywKKwkJCVBITV9QbGF0Zm9ybUNhcHNfQ29udHJvbFZEREdGWCkpIHsK KwkJaWYgKDAgPT0gYXRvbWN0cmxfaXNfdm9sdGFnZV9jb250cm9sZWRfYnlfZ3Bpb192Myhod21n ciwKKwkJCVZPTFRBR0VfVFlQRV9WRERHRlgsIFZPTFRBR0VfT0JKX1NWSUQyKSkgeworCQkJZGF0 YS0+dmRkX2dmeF9jb250cm9sID0gVE9OR0FfVk9MVEFHRV9DT05UUk9MX0JZX1NWSUQyOworCQl9 CisJfQorCisJaWYgKFRPTkdBX1ZPTFRBR0VfQ09OVFJPTF9OT05FID09IGRhdGEtPnZkZF9nZnhf Y29udHJvbCkgeworCQlwaG1fY2FwX3Vuc2V0KGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLnBs YXRmb3JtQ2FwcywKKwkJCVBITV9QbGF0Zm9ybUNhcHNfQ29udHJvbFZEREdGWCk7CisJfQorCisJ aWYgKHBobV9jYXBfZW5hYmxlZChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNh cHMsCisJCQlQSE1fUGxhdGZvcm1DYXBzX0VuYWJsZU1WRERDb250cm9sKSkgeworCQlpZiAoMCA9 PSBhdG9tY3RybF9pc192b2x0YWdlX2NvbnRyb2xlZF9ieV9ncGlvX3YzKGh3bWdyLAorCQkJCQlW T0xUQUdFX1RZUEVfTVZEREMsIFZPTFRBR0VfT0JKX0dQSU9fTFVUKSkgeworCQkJZGF0YS0+bXZk ZF9jb250cm9sID0gVE9OR0FfVk9MVEFHRV9DT05UUk9MX0JZX0dQSU87CisJCX0KKwl9CisKKwlp ZiAoVE9OR0FfVk9MVEFHRV9DT05UUk9MX05PTkUgPT0gZGF0YS0+bXZkZF9jb250cm9sKSB7CisJ CXBobV9jYXBfdW5zZXQoaHdtZ3ItPnBsYXRmb3JtX2Rlc2NyaXB0b3IucGxhdGZvcm1DYXBzLAor CQkJUEhNX1BsYXRmb3JtQ2Fwc19FbmFibGVNVkREQ29udHJvbCk7CisJfQorCisJaWYgKHBobV9j YXBfZW5hYmxlZChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCQlQ SE1fUGxhdGZvcm1DYXBzX0NvbnRyb2xWRERDSSkpIHsKKwkJaWYgKDAgPT0gYXRvbWN0cmxfaXNf dm9sdGFnZV9jb250cm9sZWRfYnlfZ3Bpb192Myhod21nciwKKwkJCQkJVk9MVEFHRV9UWVBFX1ZE RENJLCBWT0xUQUdFX09CSl9HUElPX0xVVCkpCisJCQlkYXRhLT52ZGRfY2lfY29udHJvbCA9IFRP TkdBX1ZPTFRBR0VfQ09OVFJPTF9CWV9HUElPOworCQllbHNlIGlmICgwID09IGF0b21jdHJsX2lz X3ZvbHRhZ2VfY29udHJvbGVkX2J5X2dwaW9fdjMoaHdtZ3IsCisJCQkJCQlWT0xUQUdFX1RZUEVf VkREQ0ksIFZPTFRBR0VfT0JKX1NWSUQyKSkKKwkJCWRhdGEtPnZkZF9jaV9jb250cm9sID0gVE9O R0FfVk9MVEFHRV9DT05UUk9MX0JZX1NWSUQyOworCX0KKworCWlmIChUT05HQV9WT0xUQUdFX0NP TlRST0xfTk9ORSA9PSBkYXRhLT52ZGRfY2lfY29udHJvbCkKKwkJcGhtX2NhcF91bnNldChod21n ci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCVBITV9QbGF0Zm9ybUNhcHNf Q29udHJvbFZERENJKTsKKworCXBobV9jYXBfc2V0KGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9y LnBsYXRmb3JtQ2FwcywKKwkJUEhNX1BsYXRmb3JtQ2Fwc19UYWJsZWxlc3NIYXJkd2FyZUludGVy ZmFjZSk7CisKKwlpZiAocHB0YWJsZV9pbmZvLT5jYWNfZHRwX3RhYmxlLT51c0Nsb2NrU3RyZXRj aEFtb3VudCAhPSAwKQorCQlwaG1fY2FwX3NldChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5w bGF0Zm9ybUNhcHMsCisJCQlQSE1fUGxhdGZvcm1DYXBzX0Nsb2NrU3RyZXRjaGVyKTsKKworCS8q IEluaXRpYWxpemVzIERQTSBkZWZhdWx0IHZhbHVlcyovCisJdG9uZ2FfaW5pdGlhbGl6ZV9kcG1f ZGVmYXVsdHMoaHdtZ3IpOworCisJLyogR2V0IGxlYWthZ2Ugdm9sdGFnZSBiYXNlZCBvbiBsZWFr YWdlIElELiovCisJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSB0b25nYV9nZXRfZXZ2X3ZvbHRh Z2UoaHdtZ3IpKSwKKwkJIkdldCBFVlYgVm9sdGFnZSBGYWlsZWQuICBBYm9ydCBEcml2ZXIgbG9h ZGluZyEiLCByZXR1cm4gLTEpOworCisJdG9uZ2FfY29tcGxldGVfZGVwZW5kZW5jeV90YWJsZXMo aHdtZ3IpOworCisJLyogUGFyc2UgcHB0YWJsZSBkYXRhIHJlYWQgZnJvbSBWQklPUyovCisJdG9u Z2Ffc2V0X3ByaXZhdGVfdmFyX2Jhc2VkX29uX3BwdGFsZShod21ncik7CisKKwkvKiBVTFYgU3Vw cG9ydCovCisJdWx2ID0gJihkYXRhLT51bHYpOworCXVsdi0+dWx2X3N1cHBvcnRlZCA9IDA7CisK KwkvKiBJbml0YWxpemUgRHluYW1pYyBTdGF0ZSBBZGp1c3RtZW50IFJ1bGUgU2V0dGluZ3MqLwor CXJlc3VsdCA9IHRvbmdhX2luaXRpYWxpemFfZHluYW1pY19zdGF0ZV9hZGp1c3RtZW50X3J1bGVf c2V0dGluZ3MoaHdtZ3IpOworCWRhdGEtPnV2ZF9lbmFibGVkID0gMDsKKworCXRhYmxlID0gJihk YXRhLT5zbWNfc3RhdGVfdGFibGUpOworCisJLyoKKwkqIGlmIHVjR1BJT19JRD1WRERDX1BDQ19H UElPX1BJTklEIGluIEdQSU9fTFVUYWJsZSwKKwkqIFBlYWsgQ3VycmVudCBDb250cm9sIGZlYXR1 cmUgaXMgZW5hYmxlZCBhbmQgd2Ugc2hvdWxkIHByb2dyYW0gUENDIEhXIHJlZ2lzdGVyCisJKi8K KwlpZiAoMCA9PSBhdG9tY3RybF9nZXRfcHBfYXNzaWduX3Bpbihod21nciwgVkREQ19QQ0NfR1BJ T19QSU5JRCwgJmdwaW9fcGluX2Fzc2lnbm1lbnQpKSB7CisJCXVpbnQzMl90IHRlbXBfcmVnID0g Y2dzX3JlYWRfaW5kX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsCisJCQkJCQkJCQkJQ0dTX0lORF9S RUdfX1NNQywgaXhDTkJfUFdSTUdUX0NOVEwpOworCisJCXN3aXRjaCAoZ3Bpb19waW5fYXNzaWdu bWVudC51Y19ncGlvX3Bpbl9iaXRfc2hpZnQpIHsKKwkJY2FzZSAwOgorCQkJdGVtcF9yZWcgPSBQ SE1fU0VUX0ZJRUxEKHRlbXBfcmVnLAorCQkJCUNOQl9QV1JNR1RfQ05UTCwgR05CX1NMT1dfTU9E RSwgMHgxKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQl0ZW1wX3JlZyA9IFBITV9TRVRfRklF TEQodGVtcF9yZWcsCisJCQkJQ05CX1BXUk1HVF9DTlRMLCBHTkJfU0xPV19NT0RFLCAweDIpOwor CQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXRlbXBfcmVnID0gUEhNX1NFVF9GSUVMRCh0ZW1wX3Jl ZywKKwkJCQlDTkJfUFdSTUdUX0NOVEwsIEdOQl9TTE9XLCAweDEpOworCQkJYnJlYWs7CisJCWNh c2UgMzoKKwkJCXRlbXBfcmVnID0gUEhNX1NFVF9GSUVMRCh0ZW1wX3JlZywKKwkJCQlDTkJfUFdS TUdUX0NOVEwsIEZPUkNFX05CX1BTMSwgMHgxKTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQl0 ZW1wX3JlZyA9IFBITV9TRVRfRklFTEQodGVtcF9yZWcsCisJCQkJQ05CX1BXUk1HVF9DTlRMLCBE UE1fRU5BQkxFRCwgMHgxKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5f RVJSICJbIHBvd2VycGxheSBdIEZhaWxlZCB0byBzZXR1cCBQQ0MgSFcgcmVnaXN0ZXIhCVwKKwkJ CQlXcm9uZyBHUElPIGFzc2lnbmVkIGZvciBWRERDX1BDQ19HUElPX1BJTklEISBcbiIpOworCQkJ YnJlYWs7CisJCX0KKwkJY2dzX3dyaXRlX2luZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBDR1Nf SU5EX1JFR19fU01DLAorCQkJaXhDTkJfUFdSTUdUX0NOVEwsIHRlbXBfcmVnKTsKKwl9CisKKwlw aG1fY2FwX3NldChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCVBI TV9QbGF0Zm9ybUNhcHNfRW5hYmxlU01VN1RoZXJtYWxNYW5hZ2VtZW50KTsKKwlwaG1fY2FwX3Nl dChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCVBITV9QbGF0Zm9y bUNhcHNfU01VNyk7CisKKwlkYXRhLT52ZGRjX3BoYXNlX3NoZWRfY29udHJvbCA9IDA7CisKKwlp ZiAoMCA9PSByZXN1bHQpIHsKKwkJZGF0YS0+aXNfdGx1X2VuYWJsZWQgPSAwOworCQlod21nci0+ cGxhdGZvcm1fZGVzY3JpcHRvci5oYXJkd2FyZUFjdGl2aXR5UGVyZm9ybWFuY2VMZXZlbHMgPQor CQkJVE9OR0FfTUFYX0hBUkRXQVJFX1BPV0VSTEVWRUxTOworCQlod21nci0+cGxhdGZvcm1fZGVz Y3JpcHRvci5oYXJkd2FyZVBlcmZvcm1hbmNlTGV2ZWxzID0gMjsKKwkJaHdtZ3ItPnBsYXRmb3Jt X2Rlc2NyaXB0b3IubWluaW11bUNsb2Nrc1JlZHVjdGlvblBlcmNlbnRhZ2UgID0gNTA7CisKKwkJ ZGF0YS0+cGNpZV9nZW5fY2FwID0gMHgzMDAwNzsKKwkJZGF0YS0+cGNpZV9sYW5lX2NhcCA9IDB4 MmYwMDAwOworCX0gZWxzZSB7CisJCS8qIElnbm9yZSByZXR1cm4gdmFsdWUgaW4gaGVyZSwgd2Ug YXJlIGNsZWFuaW5nIHVwIGEgbWVzcy4gKi8KKwkJdG9uZ2FfaHdtZ3JfYmFja2VuZF9maW5pKGh3 bWdyKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHRvbmdhX2ZvcmNl X2RwbV9sZXZlbChzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLAorCQllbnVtIGFtZF9kcG1fZm9yY2Vk X2xldmVsIGxldmVsKQoreworCWludCByZXQgPSAwOworCisJc3dpdGNoIChsZXZlbCkgeworCWNh c2UgQU1EX0RQTV9GT1JDRURfTEVWRUxfSElHSDoKKwkJcmV0ID0gdG9uZ2FfZm9yY2VfZHBtX2hp Z2hlc3QoaHdtZ3IpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJYnJlYWs7CisJY2Fz ZSBBTURfRFBNX0ZPUkNFRF9MRVZFTF9MT1c6CisJCXJldCA9IHRvbmdhX2ZvcmNlX2RwbV9sb3dl c3QoaHdtZ3IpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJYnJlYWs7CisJY2FzZSBB TURfRFBNX0ZPUkNFRF9MRVZFTF9BVVRPOgorCQlyZXQgPSB0b25nYV91bmZvcmNlX2RwbV9sZXZl bHMoaHdtZ3IpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJYnJlYWs7CisJZGVmYXVs dDoKKwkJYnJlYWs7CisJfQorCisJaHdtZ3ItPmRwbV9sZXZlbCA9IGxldmVsOworCXJldHVybiBy ZXQ7Cit9CisKK3N0YXRpYyBpbnQgdG9uZ2FfYXBwbHlfc3RhdGVfYWRqdXN0X3J1bGVzKHN0cnVj dCBwcF9od21nciAqaHdtZ3IsCisJCQkJc3RydWN0IHBwX3Bvd2VyX3N0YXRlICAqcHJlcXVlc3Rf cHMsCisJCQljb25zdCBzdHJ1Y3QgcHBfcG93ZXJfc3RhdGUgKnBjdXJyZW50X3BzKQoreworCXN0 cnVjdCB0b25nYV9wb3dlcl9zdGF0ZSAqdG9uZ2FfcHMgPQorCQkJCWNhc3RfcGh3X3RvbmdhX3Bv d2VyX3N0YXRlKCZwcmVxdWVzdF9wcy0+aGFyZHdhcmUpOworCisJdWludDMyX3Qgc2NsazsKKwl1 aW50MzJfdCBtY2xrOworCXN0cnVjdCBQUF9DbG9ja3MgbWluaW11bV9jbG9ja3MgPSB7MH07CisJ Ym9vbCBkaXNhYmxlX21jbGtfc3dpdGNoaW5nOworCWJvb2wgZGlzYWJsZV9tY2xrX3N3aXRjaGlu Z19mb3JfZnJhbWVfbG9jazsKKwlzdHJ1Y3QgY2dzX2Rpc3BsYXlfaW5mbyBpbmZvID0gezB9Owor CWNvbnN0IHN0cnVjdCBwaG1fY2xvY2tfYW5kX3ZvbHRhZ2VfbGltaXRzICptYXhfbGltaXRzOwor CXVpbnQzMl90IGk7CisJdG9uZ2FfaHdtZ3IgKmRhdGEgPSAoc3RydWN0IHRvbmdhX2h3bWdyICop KGh3bWdyLT5iYWNrZW5kKTsKKwlzdHJ1Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqcHB0YWJs ZV9pbmZvID0gKHN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICopKGh3bWdyLT5wcHRhYmxl KTsKKworCWludDMyX3QgY291bnQ7CisJaW50MzJfdCBzdGFibGVfcHN0YXRlX3NjbGsgPSAwLCBz dGFibGVfcHN0YXRlX21jbGsgPSAwOworCisJZGF0YS0+YmF0dGVyeV9zdGF0ZSA9IChQUF9TdGF0 ZVVJTGFiZWxfQmF0dGVyeSA9PSBwcmVxdWVzdF9wcy0+Y2xhc3NpZmljYXRpb24udWlfbGFiZWwp OworCisJUFBfQVNTRVJUX1dJVEhfQ09ERSh0b25nYV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxfY291 bnQgPT0gMiwKKwkJCQkgIlZJIHNob3VsZCBhbHdheXMgaGF2ZSAyIHBlcmZvcm1hbmNlIGxldmVs cyIsCisJCQkJICk7CisKKwltYXhfbGltaXRzID0gKFBQX1Bvd2VyU291cmNlX0FDID09IGh3bWdy LT5wb3dlcl9zb3VyY2UpID8KKwkJCSYoaHdtZ3ItPmR5bl9zdGF0ZS5tYXhfY2xvY2tfdm9sdGFn ZV9vbl9hYykgOgorCQkJJihod21nci0+ZHluX3N0YXRlLm1heF9jbG9ja192b2x0YWdlX29uX2Rj KTsKKworCWlmIChQUF9Qb3dlclNvdXJjZV9EQyA9PSBod21nci0+cG93ZXJfc291cmNlKSB7CisJ CWZvciAoaSA9IDA7IGkgPCB0b25nYV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxfY291bnQ7IGkrKykg eworCQkJaWYgKHRvbmdhX3BzLT5wZXJmb3JtYW5jZV9sZXZlbHNbaV0ubWVtb3J5X2Nsb2NrID4g bWF4X2xpbWl0cy0+bWNsaykKKwkJCQl0b25nYV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxzW2ldLm1l bW9yeV9jbG9jayA9IG1heF9saW1pdHMtPm1jbGs7CisJCQlpZiAodG9uZ2FfcHMtPnBlcmZvcm1h bmNlX2xldmVsc1tpXS5lbmdpbmVfY2xvY2sgPiBtYXhfbGltaXRzLT5zY2xrKQorCQkJCXRvbmdh X3BzLT5wZXJmb3JtYW5jZV9sZXZlbHNbaV0uZW5naW5lX2Nsb2NrID0gbWF4X2xpbWl0cy0+c2Ns azsKKwkJfQorCX0KKworCXRvbmdhX3BzLT52Y2VfY2xvY2tzLkVWQ0xLID0gaHdtZ3ItPnZjZV9h cmJpdGVyLmV2Y2xrOworCXRvbmdhX3BzLT52Y2VfY2xvY2tzLkVDQ0xLID0gaHdtZ3ItPnZjZV9h cmJpdGVyLmVjY2xrOworCisJdG9uZ2FfcHMtPmFjcF9jbGsgPSBod21nci0+YWNwX2FyYml0ZXIu YWNwY2xrOworCisJY2dzX2dldF9hY3RpdmVfZGlzcGxheXNfaW5mbyhod21nci0+ZGV2aWNlLCAm aW5mbyk7CisKKwkvKlRPIERPIHJlc3VsdCA9IFBITV9DaGVja1ZCbGFua1RpbWUoaHdtZ3IsICZ2 YmxhbmtUb29TaG9ydCk7Ki8KKworCS8qIFRPIERPIEdldE1pbkNsb2NrU2V0dGluZ3MoaHdtZ3It PnBQRUNJLCAmbWluaW11bV9jbG9ja3MpOyAqLworCisJaWYgKHBobV9jYXBfZW5hYmxlZChod21n ci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsIFBITV9QbGF0Zm9ybUNhcHNfU3Rh YmxlUFN0YXRlKSkgeworCisJCW1heF9saW1pdHMgPSAmKGh3bWdyLT5keW5fc3RhdGUubWF4X2Ns b2NrX3ZvbHRhZ2Vfb25fYWMpOworCQlzdGFibGVfcHN0YXRlX3NjbGsgPSAobWF4X2xpbWl0cy0+ c2NsayAqIDc1KSAvIDEwMDsKKworCQlmb3IgKGNvdW50ID0gcHB0YWJsZV9pbmZvLT52ZGRfZGVw X29uX3NjbGstPmNvdW50LTE7IGNvdW50ID49IDA7IGNvdW50LS0pIHsKKwkJCWlmIChzdGFibGVf cHN0YXRlX3NjbGsgPj0gcHB0YWJsZV9pbmZvLT52ZGRfZGVwX29uX3NjbGstPmVudHJpZXNbY291 bnRdLmNsaykgeworCQkJCXN0YWJsZV9wc3RhdGVfc2NsayA9IHBwdGFibGVfaW5mby0+dmRkX2Rl cF9vbl9zY2xrLT5lbnRyaWVzW2NvdW50XS5jbGs7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwor CQlpZiAoY291bnQgPCAwKQorCQkJc3RhYmxlX3BzdGF0ZV9zY2xrID0gcHB0YWJsZV9pbmZvLT52 ZGRfZGVwX29uX3NjbGstPmVudHJpZXNbMF0uY2xrOworCisJCXN0YWJsZV9wc3RhdGVfbWNsayA9 IG1heF9saW1pdHMtPm1jbGs7CisKKwkJbWluaW11bV9jbG9ja3MuZW5naW5lQ2xvY2sgPSBzdGFi bGVfcHN0YXRlX3NjbGs7CisJCW1pbmltdW1fY2xvY2tzLm1lbW9yeUNsb2NrID0gc3RhYmxlX3Bz dGF0ZV9tY2xrOworCX0KKworCWlmIChtaW5pbXVtX2Nsb2Nrcy5lbmdpbmVDbG9jayA8IGh3bWdy LT5nZnhfYXJiaXRlci5zY2xrKQorCQltaW5pbXVtX2Nsb2Nrcy5lbmdpbmVDbG9jayA9IGh3bWdy LT5nZnhfYXJiaXRlci5zY2xrOworCisJaWYgKG1pbmltdW1fY2xvY2tzLm1lbW9yeUNsb2NrIDwg aHdtZ3ItPmdmeF9hcmJpdGVyLm1jbGspCisJCW1pbmltdW1fY2xvY2tzLm1lbW9yeUNsb2NrID0g aHdtZ3ItPmdmeF9hcmJpdGVyLm1jbGs7CisKKwl0b25nYV9wcy0+c2Nsa190aHJlc2hvbGQgPSBo d21nci0+Z2Z4X2FyYml0ZXIuc2Nsa190aHJlc2hvbGQ7CisKKwlpZiAoMCAhPSBod21nci0+Z2Z4 X2FyYml0ZXIuc2Nsa19vdmVyX2RyaXZlKSB7CisJCVBQX0FTU0VSVF9XSVRIX0NPREUoKGh3bWdy LT5nZnhfYXJiaXRlci5zY2xrX292ZXJfZHJpdmUgPD0gaHdtZ3ItPnBsYXRmb3JtX2Rlc2NyaXB0 b3Iub3ZlcmRyaXZlTGltaXQuZW5naW5lQ2xvY2spLAorCQkJCQkiT3ZlcmRyaXZlIHNjbGsgZXhj ZWVkcyBsaW1pdCIsCisJCQkJCWh3bWdyLT5nZnhfYXJiaXRlci5zY2xrX292ZXJfZHJpdmUgPSBo d21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5vdmVyZHJpdmVMaW1pdC5lbmdpbmVDbG9jayk7CisK KwkJaWYgKGh3bWdyLT5nZnhfYXJiaXRlci5zY2xrX292ZXJfZHJpdmUgPj0gaHdtZ3ItPmdmeF9h cmJpdGVyLnNjbGspCisJCQl0b25nYV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxzWzFdLmVuZ2luZV9j bG9jayA9IGh3bWdyLT5nZnhfYXJiaXRlci5zY2xrX292ZXJfZHJpdmU7CisJfQorCisJaWYgKDAg IT0gaHdtZ3ItPmdmeF9hcmJpdGVyLm1jbGtfb3Zlcl9kcml2ZSkgeworCQlQUF9BU1NFUlRfV0lU SF9DT0RFKChod21nci0+Z2Z4X2FyYml0ZXIubWNsa19vdmVyX2RyaXZlIDw9IGh3bWdyLT5wbGF0 Zm9ybV9kZXNjcmlwdG9yLm92ZXJkcml2ZUxpbWl0Lm1lbW9yeUNsb2NrKSwKKwkJCSJPdmVyZHJp dmUgbWNsayBleGNlZWRzIGxpbWl0IiwKKwkJCWh3bWdyLT5nZnhfYXJiaXRlci5tY2xrX292ZXJf ZHJpdmUgPSBod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5vdmVyZHJpdmVMaW1pdC5tZW1vcnlD bG9jayk7CisKKwkJaWYgKGh3bWdyLT5nZnhfYXJiaXRlci5tY2xrX292ZXJfZHJpdmUgPj0gaHdt Z3ItPmdmeF9hcmJpdGVyLm1jbGspCisJCQl0b25nYV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxzWzFd Lm1lbW9yeV9jbG9jayA9IGh3bWdyLT5nZnhfYXJiaXRlci5tY2xrX292ZXJfZHJpdmU7CisJfQor CisJZGlzYWJsZV9tY2xrX3N3aXRjaGluZ19mb3JfZnJhbWVfbG9jayA9IHBobV9jYXBfZW5hYmxl ZCgKKwkJCQkgICAgaHdtZ3ItPnBsYXRmb3JtX2Rlc2NyaXB0b3IucGxhdGZvcm1DYXBzLAorCQkJ CSAgICBQSE1fUGxhdGZvcm1DYXBzX0Rpc2FibGVNY2xrU3dpdGNoaW5nRm9yRnJhbWVMb2NrKTsK KworCWRpc2FibGVfbWNsa19zd2l0Y2hpbmcgPSAoMSA8IGluZm8uZGlzcGxheV9jb3VudCkgfHwK KwkJCQkgICAgZGlzYWJsZV9tY2xrX3N3aXRjaGluZ19mb3JfZnJhbWVfbG9jazsKKworCXNjbGsg ID0gdG9uZ2FfcHMtPnBlcmZvcm1hbmNlX2xldmVsc1swXS5lbmdpbmVfY2xvY2s7CisJbWNsayAg PSB0b25nYV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxzWzBdLm1lbW9yeV9jbG9jazsKKworCWlmIChk aXNhYmxlX21jbGtfc3dpdGNoaW5nKQorCQltY2xrICA9IHRvbmdhX3BzLT5wZXJmb3JtYW5jZV9s ZXZlbHNbdG9uZ2FfcHMtPnBlcmZvcm1hbmNlX2xldmVsX2NvdW50IC0gMV0ubWVtb3J5X2Nsb2Nr OworCisJaWYgKHNjbGsgPCBtaW5pbXVtX2Nsb2Nrcy5lbmdpbmVDbG9jaykKKwkJc2NsayA9ICht aW5pbXVtX2Nsb2Nrcy5lbmdpbmVDbG9jayA+IG1heF9saW1pdHMtPnNjbGspID8gbWF4X2xpbWl0 cy0+c2NsayA6IG1pbmltdW1fY2xvY2tzLmVuZ2luZUNsb2NrOworCisJaWYgKG1jbGsgPCBtaW5p bXVtX2Nsb2Nrcy5tZW1vcnlDbG9jaykKKwkJbWNsayA9IChtaW5pbXVtX2Nsb2Nrcy5tZW1vcnlD bG9jayA+IG1heF9saW1pdHMtPm1jbGspID8gbWF4X2xpbWl0cy0+bWNsayA6IG1pbmltdW1fY2xv Y2tzLm1lbW9yeUNsb2NrOworCisJdG9uZ2FfcHMtPnBlcmZvcm1hbmNlX2xldmVsc1swXS5lbmdp bmVfY2xvY2sgPSBzY2xrOworCXRvbmdhX3BzLT5wZXJmb3JtYW5jZV9sZXZlbHNbMF0ubWVtb3J5 X2Nsb2NrID0gbWNsazsKKworCXRvbmdhX3BzLT5wZXJmb3JtYW5jZV9sZXZlbHNbMV0uZW5naW5l X2Nsb2NrID0KKwkJKHRvbmdhX3BzLT5wZXJmb3JtYW5jZV9sZXZlbHNbMV0uZW5naW5lX2Nsb2Nr ID49IHRvbmdhX3BzLT5wZXJmb3JtYW5jZV9sZXZlbHNbMF0uZW5naW5lX2Nsb2NrKSA/CisJCQkg ICAgICB0b25nYV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxzWzFdLmVuZ2luZV9jbG9jayA6CisJCQkg ICAgICB0b25nYV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxzWzBdLmVuZ2luZV9jbG9jazsKKworCWlm IChkaXNhYmxlX21jbGtfc3dpdGNoaW5nKSB7CisJCWlmIChtY2xrIDwgdG9uZ2FfcHMtPnBlcmZv cm1hbmNlX2xldmVsc1sxXS5tZW1vcnlfY2xvY2spCisJCQltY2xrID0gdG9uZ2FfcHMtPnBlcmZv cm1hbmNlX2xldmVsc1sxXS5tZW1vcnlfY2xvY2s7CisKKwkJdG9uZ2FfcHMtPnBlcmZvcm1hbmNl X2xldmVsc1swXS5tZW1vcnlfY2xvY2sgPSBtY2xrOworCQl0b25nYV9wcy0+cGVyZm9ybWFuY2Vf bGV2ZWxzWzFdLm1lbW9yeV9jbG9jayA9IG1jbGs7CisJfSBlbHNlIHsKKwkJaWYgKHRvbmdhX3Bz LT5wZXJmb3JtYW5jZV9sZXZlbHNbMV0ubWVtb3J5X2Nsb2NrIDwgdG9uZ2FfcHMtPnBlcmZvcm1h bmNlX2xldmVsc1swXS5tZW1vcnlfY2xvY2spCisJCQl0b25nYV9wcy0+cGVyZm9ybWFuY2VfbGV2 ZWxzWzFdLm1lbW9yeV9jbG9jayA9IHRvbmdhX3BzLT5wZXJmb3JtYW5jZV9sZXZlbHNbMF0ubWVt b3J5X2Nsb2NrOworCX0KKworCWlmIChwaG1fY2FwX2VuYWJsZWQoaHdtZ3ItPnBsYXRmb3JtX2Rl c2NyaXB0b3IucGxhdGZvcm1DYXBzLCBQSE1fUGxhdGZvcm1DYXBzX1N0YWJsZVBTdGF0ZSkpIHsK KwkJZm9yIChpPTA7IGkgPCB0b25nYV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxfY291bnQ7IGkrKykg eworCQkJdG9uZ2FfcHMtPnBlcmZvcm1hbmNlX2xldmVsc1tpXS5lbmdpbmVfY2xvY2sgPSBzdGFi bGVfcHN0YXRlX3NjbGs7CisJCQl0b25nYV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxzW2ldLm1lbW9y eV9jbG9jayA9IHN0YWJsZV9wc3RhdGVfbWNsazsKKwkJCXRvbmdhX3BzLT5wZXJmb3JtYW5jZV9s ZXZlbHNbaV0ucGNpZV9nZW4gPSBkYXRhLT5wY2llX2dlbl9wZXJmb3JtYW5jZS5tYXg7CisJCQl0 b25nYV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxzW2ldLnBjaWVfbGFuZSA9IGRhdGEtPnBjaWVfZ2Vu X3BlcmZvcm1hbmNlLm1heDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitpbnQgdG9uZ2Ff Z2V0X3Bvd2VyX3N0YXRlX3NpemUoc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwlyZXR1cm4g c2l6ZW9mKHN0cnVjdCB0b25nYV9wb3dlcl9zdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgdG9uZ2Ff ZHBtX2dldF9tY2xrKHN0cnVjdCBwcF9od21nciAqaHdtZ3IsIGJvb2wgbG93KQoreworCXN0cnVj dCBwcF9wb3dlcl9zdGF0ZSAgKnBzOworCXN0cnVjdCB0b25nYV9wb3dlcl9zdGF0ZSAgKnRvbmdh X3BzOworCisJaWYgKGh3bWdyID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJcHMgPSBo d21nci0+cmVxdWVzdF9wczsKKworCWlmIChwcyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsK KworCXRvbmdhX3BzID0gY2FzdF9waHdfdG9uZ2FfcG93ZXJfc3RhdGUoJnBzLT5oYXJkd2FyZSk7 CisKKwlpZiAobG93KQorCQlyZXR1cm4gdG9uZ2FfcHMtPnBlcmZvcm1hbmNlX2xldmVsc1swXS5t ZW1vcnlfY2xvY2s7CisJZWxzZQorCQlyZXR1cm4gdG9uZ2FfcHMtPnBlcmZvcm1hbmNlX2xldmVs c1t0b25nYV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxfY291bnQtMV0ubWVtb3J5X2Nsb2NrOworfQor CitzdGF0aWMgaW50IHRvbmdhX2RwbV9nZXRfc2NsayhzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLCBi b29sIGxvdykKK3sKKwlzdHJ1Y3QgcHBfcG93ZXJfc3RhdGUgICpwczsKKwlzdHJ1Y3QgdG9uZ2Ff cG93ZXJfc3RhdGUgICp0b25nYV9wczsKKworCWlmIChod21nciA9PSBOVUxMKQorCQlyZXR1cm4g LUVJTlZBTDsKKworCXBzID0gaHdtZ3ItPnJlcXVlc3RfcHM7CisKKwlpZiAocHMgPT0gTlVMTCkK KwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0b25nYV9wcyA9IGNhc3RfcGh3X3RvbmdhX3Bvd2VyX3N0 YXRlKCZwcy0+aGFyZHdhcmUpOworCisJaWYgKGxvdykKKwkJcmV0dXJuIHRvbmdhX3BzLT5wZXJm b3JtYW5jZV9sZXZlbHNbMF0uZW5naW5lX2Nsb2NrOworCWVsc2UKKwkJcmV0dXJuIHRvbmdhX3Bz LT5wZXJmb3JtYW5jZV9sZXZlbHNbdG9uZ2FfcHMtPnBlcmZvcm1hbmNlX2xldmVsX2NvdW50LTFd LmVuZ2luZV9jbG9jazsKK30KKworc3RhdGljIHVpbnQxNl90IHRvbmdhX2dldF9jdXJyZW50X3Bj aWVfc3BlZWQoCisJCQkJCQkgICBzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCXVpbnQzMl90 IHNwZWVkX2NudGwgPSAwOworCisJc3BlZWRfY250bCA9IGNnc19yZWFkX2luZF9yZWdpc3Rlciho d21nci0+ZGV2aWNlLAorCQkJCQkJICAgQ0dTX0lORF9SRUdfX1BDSUUsCisJCQkJCQkgICBpeFBD SUVfTENfU1BFRURfQ05UTCk7CisJcmV0dXJuKCh1aW50MTZfdClQSE1fR0VUX0ZJRUxEKHNwZWVk X2NudGwsCisJCQlQQ0lFX0xDX1NQRUVEX0NOVEwsIExDX0NVUlJFTlRfREFUQV9SQVRFKSk7Cit9 CisKK3N0YXRpYyBpbnQgdG9uZ2FfZ2V0X2N1cnJlbnRfcGNpZV9sYW5lX251bWJlcigKKwkJCQkJ CSAgIHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJdWludDMyX3QgbGlua193aWR0aDsKKwor CWxpbmtfd2lkdGggPSBQSE1fUkVBRF9JTkRJUkVDVF9GSUVMRChod21nci0+ZGV2aWNlLAorCQkJ CQkJCUNHU19JTkRfUkVHX19QQ0lFLAorCQkJCQkJICBQQ0lFX0xDX0xJTktfV0lEVEhfQ05UTCwK KwkJCQkJCQlMQ19MSU5LX1dJRFRIX1JEKTsKKworCVBQX0FTU0VSVF9XSVRIX0NPREUoKDcgPj0g bGlua193aWR0aCksCisJCQkiSW52YWxpZCBQQ0llIGxhbmUgd2lkdGghIiwgcmV0dXJuIDApOwor CisJcmV0dXJuIGRlY29kZV9wY2llX2xhbmVfd2lkdGgobGlua193aWR0aCk7Cit9CisKK3N0YXRp YyBpbnQgdG9uZ2FfZHBtX3BhdGNoX2Jvb3Rfc3RhdGUoc3RydWN0IHBwX2h3bWdyICpod21nciwK KwkJCQkJc3RydWN0IHBwX2h3X3Bvd2VyX3N0YXRlICpod19wcykKK3sKKwlzdHJ1Y3QgdG9uZ2Ff aHdtZ3IgKmRhdGEgPSAoc3RydWN0IHRvbmdhX2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKwlz dHJ1Y3QgdG9uZ2FfcG93ZXJfc3RhdGUgKnBzID0gKHN0cnVjdCB0b25nYV9wb3dlcl9zdGF0ZSAq KWh3X3BzOworCUFUT01fRklSTVdBUkVfSU5GT19WMl8yICpmd19pbmZvOworCXVpbnQxNl90IHNp emU7CisJdWludDhfdCBmcmV2LCBjcmV2OworCWludCBpbmRleCA9IEdldEluZGV4SW50b01hc3Rl clRhYmxlKERBVEEsIEZpcm13YXJlSW5mbyk7CisKKwkvKiBGaXJzdCByZXRyaWV2ZSB0aGUgQm9v dCBjbG9ja3MgYW5kIFZEREMgZnJvbSB0aGUgZmlybXdhcmUgaW5mbyB0YWJsZS4KKwkgKiBXZSBh c3N1bWUgaGVyZSB0aGF0IGZ3X2luZm8gaXMgdW5jaGFuZ2VkIGlmIHRoaXMgY2FsbCBmYWlscy4K KwkgKi8KKwlmd19pbmZvID0gKEFUT01fRklSTVdBUkVfSU5GT19WMl8yICopY2dzX2F0b21fZ2V0 X2RhdGFfdGFibGUoCisJCQlod21nci0+ZGV2aWNlLCBpbmRleCwKKwkJCSZzaXplLCAmZnJldiwg JmNyZXYpOworCWlmICghZndfaW5mbykKKwkJLyogRHVyaW5nIGEgdGVzdCwgdGhlcmUgaXMgbm8g ZmlybXdhcmUgaW5mbyB0YWJsZS4gKi8KKwkJcmV0dXJuIDA7CisKKwkvKiBQYXRjaCB0aGUgc3Rh dGUuICovCisJZGF0YS0+dmJpb3NfYm9vdF9zdGF0ZS5zY2xrX2Jvb3R1cF92YWx1ZSAgPSBsZTMy X3RvX2NwdShmd19pbmZvLT51bERlZmF1bHRFbmdpbmVDbG9jayk7CisJZGF0YS0+dmJpb3NfYm9v dF9zdGF0ZS5tY2xrX2Jvb3R1cF92YWx1ZSAgPSBsZTMyX3RvX2NwdShmd19pbmZvLT51bERlZmF1 bHRNZW1vcnlDbG9jayk7CisJZGF0YS0+dmJpb3NfYm9vdF9zdGF0ZS5tdmRkX2Jvb3R1cF92YWx1 ZSAgPSBsZTE2X3RvX2NwdShmd19pbmZvLT51c0Jvb3RVcE1WRERDVm9sdGFnZSk7CisJZGF0YS0+ dmJpb3NfYm9vdF9zdGF0ZS52ZGRjX2Jvb3R1cF92YWx1ZSAgPSBsZTE2X3RvX2NwdShmd19pbmZv LT51c0Jvb3RVcFZERENWb2x0YWdlKTsKKwlkYXRhLT52Ymlvc19ib290X3N0YXRlLnZkZGNpX2Jv b3R1cF92YWx1ZSA9IGxlMTZfdG9fY3B1KGZ3X2luZm8tPnVzQm9vdFVwVkREQ0lWb2x0YWdlKTsK KwlkYXRhLT52Ymlvc19ib290X3N0YXRlLnBjaWVfZ2VuX2Jvb3R1cF92YWx1ZSA9IHRvbmdhX2dl dF9jdXJyZW50X3BjaWVfc3BlZWQoaHdtZ3IpOworCWRhdGEtPnZiaW9zX2Jvb3Rfc3RhdGUucGNp ZV9sYW5lX2Jvb3R1cF92YWx1ZSA9CisJCQkodWludDE2X3QpdG9uZ2FfZ2V0X2N1cnJlbnRfcGNp ZV9sYW5lX251bWJlcihod21ncik7CisKKwkvKiBzZXQgYm9vdCBwb3dlciBzdGF0ZSAqLworCXBz LT5wZXJmb3JtYW5jZV9sZXZlbHNbMF0ubWVtb3J5X2Nsb2NrID0gZGF0YS0+dmJpb3NfYm9vdF9z dGF0ZS5tY2xrX2Jvb3R1cF92YWx1ZTsKKwlwcy0+cGVyZm9ybWFuY2VfbGV2ZWxzWzBdLmVuZ2lu ZV9jbG9jayA9IGRhdGEtPnZiaW9zX2Jvb3Rfc3RhdGUuc2Nsa19ib290dXBfdmFsdWU7CisJcHMt PnBlcmZvcm1hbmNlX2xldmVsc1swXS5wY2llX2dlbiA9IGRhdGEtPnZiaW9zX2Jvb3Rfc3RhdGUu cGNpZV9nZW5fYm9vdHVwX3ZhbHVlOworCXBzLT5wZXJmb3JtYW5jZV9sZXZlbHNbMF0ucGNpZV9s YW5lID0gZGF0YS0+dmJpb3NfYm9vdF9zdGF0ZS5wY2llX2xhbmVfYm9vdHVwX3ZhbHVlOworCisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG9uZ2FfZ2V0X3BwX3RhYmxlX2VudHJ5X2NhbGxi YWNrX2Z1bmMoc3RydWN0IHBwX2h3bWdyICpod21nciwKKwkJdm9pZCAqc3RhdGUsIHN0cnVjdCBw cF9wb3dlcl9zdGF0ZSAqcG93ZXJfc3RhdGUsCisJCXZvaWQgKnBwX3RhYmxlLCB1aW50MzJfdCBj bGFzc2lmaWNhdGlvbl9mbGFnKQoreworCXN0cnVjdCB0b25nYV9od21nciAqZGF0YSA9IChzdHJ1 Y3QgdG9uZ2FfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCisJc3RydWN0IHRvbmdhX3Bvd2Vy X3N0YXRlICAqdG9uZ2FfcHMgPQorCQkJKHN0cnVjdCB0b25nYV9wb3dlcl9zdGF0ZSAqKSgmKHBv d2VyX3N0YXRlLT5oYXJkd2FyZSkpOworCisJc3RydWN0IHRvbmdhX3BlcmZvcm1hbmNlX2xldmVs ICpwZXJmb3JtYW5jZV9sZXZlbDsKKworCUFUT01fVG9uZ2FfU3RhdGUgKnN0YXRlX2VudHJ5ID0g KEFUT01fVG9uZ2FfU3RhdGUgKilzdGF0ZTsKKworCUFUT01fVG9uZ2FfUE9XRVJQTEFZVEFCTEUg KnBvd2VycGxheV90YWJsZSA9CisJCQkoQVRPTV9Ub25nYV9QT1dFUlBMQVlUQUJMRSAqKXBwX3Rh YmxlOworCisJQVRPTV9Ub25nYV9TQ0xLX0RlcGVuZGVuY3lfVGFibGUgKnNjbGtfZGVwX3RhYmxl ID0KKwkJCShBVE9NX1RvbmdhX1NDTEtfRGVwZW5kZW5jeV9UYWJsZSAqKQorCQkJKCgodWludDY0 X3QpcG93ZXJwbGF5X3RhYmxlKSArCisJCQlsZTE2X3RvX2NwdShwb3dlcnBsYXlfdGFibGUtPnVz U2Nsa0RlcGVuZGVuY3lUYWJsZU9mZnNldCkpOworCisJQVRPTV9Ub25nYV9NQ0xLX0RlcGVuZGVu Y3lfVGFibGUgKm1jbGtfZGVwX3RhYmxlID0KKwkJCShBVE9NX1RvbmdhX01DTEtfRGVwZW5kZW5j eV9UYWJsZSAqKQorCQkJKCgodWludDY0X3QpcG93ZXJwbGF5X3RhYmxlKSArCisJCQlsZTE2X3Rv X2NwdShwb3dlcnBsYXlfdGFibGUtPnVzTWNsa0RlcGVuZGVuY3lUYWJsZU9mZnNldCkpOworCisJ LyogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG5vdCBpbml0aWFsaXplZCBoZXJlOiBpZCBvcmRl cmVkTGlzdCBhbGxTdGF0ZXNMaXN0ICovCisJcG93ZXJfc3RhdGUtPmNsYXNzaWZpY2F0aW9uLnVp X2xhYmVsID0KKwkJCShsZTE2X3RvX2NwdShzdGF0ZV9lbnRyeS0+dXNDbGFzc2lmaWNhdGlvbikg JgorCQkJQVRPTV9QUExJQl9DTEFTU0lGSUNBVElPTl9VSV9NQVNLKSA+PgorCQkJQVRPTV9QUExJ Ql9DTEFTU0lGSUNBVElPTl9VSV9TSElGVDsKKwlwb3dlcl9zdGF0ZS0+Y2xhc3NpZmljYXRpb24u ZmxhZ3MgPSBjbGFzc2lmaWNhdGlvbl9mbGFnOworCS8qIE5PVEU6IFRoZXJlIGlzIGEgY2xhc3Np ZmljYXRpb24yIGZsYWcgaW4gQklPUyB0aGF0IGlzIG5vdCBiZWluZyB1c2VkIHJpZ2h0IG5vdyAq LworCisJcG93ZXJfc3RhdGUtPmNsYXNzaWZpY2F0aW9uLnRlbXBvcmFyeV9zdGF0ZSA9IGZhbHNl OworCXBvd2VyX3N0YXRlLT5jbGFzc2lmaWNhdGlvbi50b19iZV9kZWxldGVkID0gZmFsc2U7CisK Kwlwb3dlcl9zdGF0ZS0+dmFsaWRhdGlvbi5kaXNhbGxvd09uREMgPQorCQkJKDAgIT0gKGxlMzJf dG9fY3B1KHN0YXRlX2VudHJ5LT51bENhcHNBbmRTZXR0aW5ncykgJiBBVE9NX1RvbmdhX0RJU0FM TE9XX09OX0RDKSk7CisKKwlwb3dlcl9zdGF0ZS0+cGNpZS5sYW5lcyA9IDA7CisKKwlwb3dlcl9z dGF0ZS0+ZGlzcGxheS5kaXNhYmxlRnJhbWVNb2R1bGF0aW9uID0gZmFsc2U7CisJcG93ZXJfc3Rh dGUtPmRpc3BsYXkubGltaXRSZWZyZXNocmF0ZSA9IGZhbHNlOworCXBvd2VyX3N0YXRlLT5kaXNw bGF5LmVuYWJsZVZhcmlCcmlnaHQgPQorCQkJKDAgIT0gKGxlMzJfdG9fY3B1KHN0YXRlX2VudHJ5 LT51bENhcHNBbmRTZXR0aW5ncykgJiBBVE9NX1RvbmdhX0VOQUJMRV9WQVJJQlJJR0hUKSk7CisK Kwlwb3dlcl9zdGF0ZS0+dmFsaWRhdGlvbi5zdXBwb3J0ZWRQb3dlckxldmVscyA9IDA7CisJcG93 ZXJfc3RhdGUtPnV2ZF9jbG9ja3MuVkNMSyA9IDA7CisJcG93ZXJfc3RhdGUtPnV2ZF9jbG9ja3Mu RENMSyA9IDA7CisJcG93ZXJfc3RhdGUtPnRlbXBlcmF0dXJlcy5taW4gPSAwOworCXBvd2VyX3N0 YXRlLT50ZW1wZXJhdHVyZXMubWF4ID0gMDsKKworCXBlcmZvcm1hbmNlX2xldmVsID0gJih0b25n YV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxzCisJCQlbdG9uZ2FfcHMtPnBlcmZvcm1hbmNlX2xldmVs X2NvdW50KytdKTsKKworCVBQX0FTU0VSVF9XSVRIX0NPREUoCisJCQkodG9uZ2FfcHMtPnBlcmZv cm1hbmNlX2xldmVsX2NvdW50IDwgU01VNzJfTUFYX0xFVkVMU19HUkFQSElDUyksCisJCQkiUGVy Zm9ybWFuY2UgbGV2ZWxzIGV4Y2VlZHMgU01DIGxpbWl0ISIsCisJCQlyZXR1cm4gLTEpOworCisJ UFBfQVNTRVJUX1dJVEhfQ09ERSgKKwkJCSh0b25nYV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxfY291 bnQgPD0KKwkJCQkJaHdtZ3ItPnBsYXRmb3JtX2Rlc2NyaXB0b3IuaGFyZHdhcmVBY3Rpdml0eVBl cmZvcm1hbmNlTGV2ZWxzKSwKKwkJCSJQZXJmb3JtYW5jZSBsZXZlbHMgZXhjZWVkcyBEcml2ZXIg bGltaXQhIiwKKwkJCXJldHVybiAtMSk7CisKKwkvKiBQZXJmb3JtYW5jZSBsZXZlbHMgYXJlIGFy cmFuZ2VkIGZyb20gbG93IHRvIGhpZ2guICovCisJcGVyZm9ybWFuY2VfbGV2ZWwtPm1lbW9yeV9j bG9jayA9CisJCQkJbGUzMl90b19jcHUobWNsa19kZXBfdGFibGUtPmVudHJpZXNbc3RhdGVfZW50 cnktPnVjTWVtb3J5Q2xvY2tJbmRleExvd10udWxNY2xrKTsKKworCXBlcmZvcm1hbmNlX2xldmVs LT5lbmdpbmVfY2xvY2sgPQorCQkJCWxlMzJfdG9fY3B1KHNjbGtfZGVwX3RhYmxlLT5lbnRyaWVz W3N0YXRlX2VudHJ5LT51Y0VuZ2luZUNsb2NrSW5kZXhMb3ddLnVsU2Nsayk7CisKKwlwZXJmb3Jt YW5jZV9sZXZlbC0+cGNpZV9nZW4gPSBnZXRfcGNpZV9nZW5fc3VwcG9ydCgKKwkJCQkJCQlkYXRh LT5wY2llX2dlbl9jYXAsCisJCQkJCSAgICAgc3RhdGVfZW50cnktPnVjUENJRUdlbkxvdyk7CisK KwlwZXJmb3JtYW5jZV9sZXZlbC0+cGNpZV9sYW5lID0gZ2V0X3BjaWVfbGFuZV9zdXBwb3J0KAor CQkJCQkJICAgIGRhdGEtPnBjaWVfbGFuZV9jYXAsCisJCQkJCSAgIHN0YXRlX2VudHJ5LT51Y1BD SUVMYW5lSGlnaCk7CisKKwlwZXJmb3JtYW5jZV9sZXZlbCA9CisJCQkmKHRvbmdhX3BzLT5wZXJm b3JtYW5jZV9sZXZlbHNbdG9uZ2FfcHMtPnBlcmZvcm1hbmNlX2xldmVsX2NvdW50KytdKTsKKwor CXBlcmZvcm1hbmNlX2xldmVsLT5tZW1vcnlfY2xvY2sgPQorCQkJCWxlMzJfdG9fY3B1KG1jbGtf ZGVwX3RhYmxlLT5lbnRyaWVzW3N0YXRlX2VudHJ5LT51Y01lbW9yeUNsb2NrSW5kZXhIaWdoXS51 bE1jbGspOworCisJcGVyZm9ybWFuY2VfbGV2ZWwtPmVuZ2luZV9jbG9jayA9CisJCQkJbGUzMl90 b19jcHUoc2Nsa19kZXBfdGFibGUtPmVudHJpZXNbc3RhdGVfZW50cnktPnVjRW5naW5lQ2xvY2tJ bmRleEhpZ2hdLnVsU2Nsayk7CisKKwlwZXJmb3JtYW5jZV9sZXZlbC0+cGNpZV9nZW4gPSBnZXRf cGNpZV9nZW5fc3VwcG9ydCgKKwkJCQkJCQlkYXRhLT5wY2llX2dlbl9jYXAsCisJCQkJCSAgICBz dGF0ZV9lbnRyeS0+dWNQQ0lFR2VuSGlnaCk7CisKKwlwZXJmb3JtYW5jZV9sZXZlbC0+cGNpZV9s YW5lID0gZ2V0X3BjaWVfbGFuZV9zdXBwb3J0KAorCQkJCQkJICAgIGRhdGEtPnBjaWVfbGFuZV9j YXAsCisJCQkJCSAgIHN0YXRlX2VudHJ5LT51Y1BDSUVMYW5lSGlnaCk7CisKKwlyZXR1cm4gMDsK K30KKworc3RhdGljIGludCB0b25nYV9nZXRfcHBfdGFibGVfZW50cnkoc3RydWN0IHBwX2h3bWdy ICpod21nciwKKwkJICAgIHVuc2lnbmVkIGxvbmcgZW50cnlfaW5kZXgsIHN0cnVjdCBwcF9wb3dl cl9zdGF0ZSAqcHMpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgdG9uZ2FfcG93ZXJfc3RhdGUg KnRvbmdhX3BzOworCXN0cnVjdCB0b25nYV9od21nciAqZGF0YSA9IChzdHJ1Y3QgdG9uZ2FfaHdt Z3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCisJc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24g KnRhYmxlX2luZm8gPQorCQkJKHN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICopKGh3bWdy LT5wcHRhYmxlKTsKKworCXN0cnVjdCBwaG1fcHB0X3YxX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5j eV90YWJsZSAqZGVwX21jbGtfdGFibGUgPQorCQkJCQkgICB0YWJsZV9pbmZvLT52ZGRfZGVwX29u X21jbGs7CisKKwlwcy0+aGFyZHdhcmUubWFnaWMgPSBQaHdUb25nYV9NYWdpYzsKKworCXRvbmdh X3BzID0gY2FzdF9waHdfdG9uZ2FfcG93ZXJfc3RhdGUoJihwcy0+aGFyZHdhcmUpKTsKKworCXJl c3VsdCA9IHRvbmdhX2dldF9wb3dlcnBsYXlfdGFibGVfZW50cnkoaHdtZ3IsIGVudHJ5X2luZGV4 LCBwcywKKwkJCXRvbmdhX2dldF9wcF90YWJsZV9lbnRyeV9jYWxsYmFja19mdW5jKTsKKworCS8q IFRoaXMgaXMgdGhlIGVhcmxpZXN0IHRpbWUgd2UgaGF2ZSBhbGwgdGhlIGRlcGVuZGVuY3kgdGFi bGUgYW5kIHRoZSBWQklPUyBib290IHN0YXRlCisJICogYXMgUFBfVGFibGVzX0dldFBvd2VyUGxh eVRhYmxlRW50cnkgcmV0cmlldmVzIHRoZSBWQklPUyBib290IHN0YXRlCisJICogaWYgdGhlcmUg aXMgb25seSBvbmUgVkREQ0kvTUNMSyBsZXZlbCwgY2hlY2sgaWYgaXQncyB0aGUgc2FtZSBhcyBW QklPUyBib290IHN0YXRlCisJICovCisJaWYgKGRlcF9tY2xrX3RhYmxlICE9IE5VTEwgJiYgZGVw X21jbGtfdGFibGUtPmNvdW50ID09IDEpIHsKKwkJaWYgKGRlcF9tY2xrX3RhYmxlLT5lbnRyaWVz WzBdLmNsayAhPQorCQkJCWRhdGEtPnZiaW9zX2Jvb3Rfc3RhdGUubWNsa19ib290dXBfdmFsdWUp CisJCQlwcmludGsoS0VSTl9FUlIgIlNpbmdsZSBNQ0xLIGVudHJ5IFZERENJL01DTEsgZGVwZW5k ZW5jeSB0YWJsZSAiCisJCQkJCSJkb2VzIG5vdCBtYXRjaCBWQklPUyBib290IE1DTEsgbGV2ZWwi KTsKKwkJaWYgKGRlcF9tY2xrX3RhYmxlLT5lbnRyaWVzWzBdLnZkZGNpICE9CisJCQkJZGF0YS0+ dmJpb3NfYm9vdF9zdGF0ZS52ZGRjaV9ib290dXBfdmFsdWUpCisJCQlwcmludGsoS0VSTl9FUlIg IlNpbmdsZSBWRERDSSBlbnRyeSBWRERDSS9NQ0xLIGRlcGVuZGVuY3kgdGFibGUgIgorCQkJCQki ZG9lcyBub3QgbWF0Y2ggVkJJT1MgYm9vdCBWRERDSSBsZXZlbCIpOworCX0KKworCS8qIHNldCBE QyBjb21wYXRpYmxlIGZsYWcgaWYgdGhpcyBzdGF0ZSBzdXBwb3J0cyBEQyAqLworCWlmICghcHMt PnZhbGlkYXRpb24uZGlzYWxsb3dPbkRDKQorCQl0b25nYV9wcy0+ZGNfY29tcGF0aWJsZSA9IHRy dWU7CisKKwlpZiAocHMtPmNsYXNzaWZpY2F0aW9uLmZsYWdzICYgUFBfU3RhdGVDbGFzc2lmaWNh dGlvbkZsYWdfQUNQSSkKKwkJZGF0YS0+YWNwaV9wY2llX2dlbiA9IHRvbmdhX3BzLT5wZXJmb3Jt YW5jZV9sZXZlbHNbMF0ucGNpZV9nZW47CisJZWxzZSBpZiAocHMtPmNsYXNzaWZpY2F0aW9uLmZs YWdzICYgUFBfU3RhdGVDbGFzc2lmaWNhdGlvbkZsYWdfQm9vdCkgeworCQlpZiAoZGF0YS0+YmFj b3MuYmVzdF9tYXRjaCA9PSAweGZmZmYpIHsKKwkJCS8qIEZvciBWLkkuIHVzZSBib290IHN0YXRl IGFzIGJhc2UgQkFDTyBzdGF0ZSAqLworCQkJZGF0YS0+YmFjb3MuYmVzdF9tYXRjaCA9IFBQX1N0 YXRlQ2xhc3NpZmljYXRpb25GbGFnX0Jvb3Q7CisJCQlkYXRhLT5iYWNvcy5wZXJmb3JtYW5jZV9s ZXZlbCA9IHRvbmdhX3BzLT5wZXJmb3JtYW5jZV9sZXZlbHNbMF07CisJCX0KKwl9CisKKwl0b25n YV9wcy0+dXZkX2Nsb2Nrcy5WQ0xLID0gcHMtPnV2ZF9jbG9ja3MuVkNMSzsKKwl0b25nYV9wcy0+ dXZkX2Nsb2Nrcy5EQ0xLID0gcHMtPnV2ZF9jbG9ja3MuRENMSzsKKworCWlmICghcmVzdWx0KSB7 CisJCXVpbnQzMl90IGk7CisKKwkJc3dpdGNoIChwcy0+Y2xhc3NpZmljYXRpb24udWlfbGFiZWwp IHsKKwkJY2FzZSBQUF9TdGF0ZVVJTGFiZWxfUGVyZm9ybWFuY2U6CisJCQlkYXRhLT51c2VfcGNp ZV9wZXJmb3JtYW5jZV9sZXZlbHMgPSB0cnVlOworCisJCQlmb3IgKGkgPSAwOyBpIDwgdG9uZ2Ff cHMtPnBlcmZvcm1hbmNlX2xldmVsX2NvdW50OyBpKyspIHsKKwkJCQlpZiAoZGF0YS0+cGNpZV9n ZW5fcGVyZm9ybWFuY2UubWF4IDwKKwkJCQkJCXRvbmdhX3BzLT5wZXJmb3JtYW5jZV9sZXZlbHNb aV0ucGNpZV9nZW4pCisJCQkJCWRhdGEtPnBjaWVfZ2VuX3BlcmZvcm1hbmNlLm1heCA9CisJCQkJ CQkJdG9uZ2FfcHMtPnBlcmZvcm1hbmNlX2xldmVsc1tpXS5wY2llX2dlbjsKKworCQkJCWlmIChk YXRhLT5wY2llX2dlbl9wZXJmb3JtYW5jZS5taW4gPgorCQkJCQkJdG9uZ2FfcHMtPnBlcmZvcm1h bmNlX2xldmVsc1tpXS5wY2llX2dlbikKKwkJCQkJZGF0YS0+cGNpZV9nZW5fcGVyZm9ybWFuY2Uu bWluID0KKwkJCQkJCQl0b25nYV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxzW2ldLnBjaWVfZ2VuOwor CisJCQkJaWYgKGRhdGEtPnBjaWVfbGFuZV9wZXJmb3JtYW5jZS5tYXggPAorCQkJCQkJdG9uZ2Ff cHMtPnBlcmZvcm1hbmNlX2xldmVsc1tpXS5wY2llX2xhbmUpCisJCQkJCWRhdGEtPnBjaWVfbGFu ZV9wZXJmb3JtYW5jZS5tYXggPQorCQkJCQkJCXRvbmdhX3BzLT5wZXJmb3JtYW5jZV9sZXZlbHNb aV0ucGNpZV9sYW5lOworCisJCQkJaWYgKGRhdGEtPnBjaWVfbGFuZV9wZXJmb3JtYW5jZS5taW4g PgorCQkJCQkJdG9uZ2FfcHMtPnBlcmZvcm1hbmNlX2xldmVsc1tpXS5wY2llX2xhbmUpCisJCQkJ CWRhdGEtPnBjaWVfbGFuZV9wZXJmb3JtYW5jZS5taW4gPQorCQkJCQkJCXRvbmdhX3BzLT5wZXJm b3JtYW5jZV9sZXZlbHNbaV0ucGNpZV9sYW5lOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUFBf U3RhdGVVSUxhYmVsX0JhdHRlcnk6CisJCQlkYXRhLT51c2VfcGNpZV9wb3dlcl9zYXZpbmdfbGV2 ZWxzID0gdHJ1ZTsKKworCQkJZm9yIChpID0gMDsgaSA8IHRvbmdhX3BzLT5wZXJmb3JtYW5jZV9s ZXZlbF9jb3VudDsgaSsrKSB7CisJCQkJaWYgKGRhdGEtPnBjaWVfZ2VuX3Bvd2VyX3NhdmluZy5t YXggPAorCQkJCQkJdG9uZ2FfcHMtPnBlcmZvcm1hbmNlX2xldmVsc1tpXS5wY2llX2dlbikKKwkJ CQkJZGF0YS0+cGNpZV9nZW5fcG93ZXJfc2F2aW5nLm1heCA9CisJCQkJCQkJdG9uZ2FfcHMtPnBl cmZvcm1hbmNlX2xldmVsc1tpXS5wY2llX2dlbjsKKworCQkJCWlmIChkYXRhLT5wY2llX2dlbl9w b3dlcl9zYXZpbmcubWluID4KKwkJCQkJCXRvbmdhX3BzLT5wZXJmb3JtYW5jZV9sZXZlbHNbaV0u cGNpZV9nZW4pCisJCQkJCWRhdGEtPnBjaWVfZ2VuX3Bvd2VyX3NhdmluZy5taW4gPQorCQkJCQkJ CXRvbmdhX3BzLT5wZXJmb3JtYW5jZV9sZXZlbHNbaV0ucGNpZV9nZW47CisKKwkJCQlpZiAoZGF0 YS0+cGNpZV9sYW5lX3Bvd2VyX3NhdmluZy5tYXggPAorCQkJCQkJdG9uZ2FfcHMtPnBlcmZvcm1h bmNlX2xldmVsc1tpXS5wY2llX2xhbmUpCisJCQkJCWRhdGEtPnBjaWVfbGFuZV9wb3dlcl9zYXZp bmcubWF4ID0KKwkJCQkJCQl0b25nYV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxzW2ldLnBjaWVfbGFu ZTsKKworCQkJCWlmIChkYXRhLT5wY2llX2xhbmVfcG93ZXJfc2F2aW5nLm1pbiA+CisJCQkJCQl0 b25nYV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxzW2ldLnBjaWVfbGFuZSkKKwkJCQkJZGF0YS0+cGNp ZV9sYW5lX3Bvd2VyX3NhdmluZy5taW4gPQorCQkJCQkJCXRvbmdhX3BzLT5wZXJmb3JtYW5jZV9s ZXZlbHNbaV0ucGNpZV9sYW5lOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVh azsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3RvbmdhX3ByaW50X2N1 cnJlbnRfcGVyZm9yY2VfbGV2ZWwoc3RydWN0IHBwX2h3bWdyICpod21nciwgc3RydWN0IHNlcV9m aWxlICptKQoreworCXVpbnQzMl90IHNjbGssIG1jbGs7CisKKwlzbXVtX3NlbmRfbXNnX3RvX3Nt Yyhod21nci0+c211bWdyLCAoUFBTTUNfTXNnKShQUFNNQ19NU0dfQVBJX0dldFNjbGtGcmVxdWVu Y3kpKTsKKworCXNjbGsgPSBjZ3NfcmVhZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBtbVNNQ19N U0dfQVJHXzApOworCisJc211bV9zZW5kX21zZ190b19zbWMoaHdtZ3ItPnNtdW1nciwgKFBQU01D X01zZykoUFBTTUNfTVNHX0FQSV9HZXRNY2xrRnJlcXVlbmN5KSk7CisKKwltY2xrID0gY2dzX3Jl YWRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1TTUNfTVNHX0FSR18wKTsKKwlzZXFfcHJpbnRm KG0sICJcbiBbICBtY2xrICBdOiAldSBNSHpcblxuIFsgIHNjbGsgIF06ICV1IE1IelxuIiwgbWNs ay8xMDAsIHNjbGsvMTAwKTsKK30KKworc3RhdGljIGludCB0b25nYV9maW5kX2RwbV9zdGF0ZXNf Y2xvY2tzX2luX2RwbV90YWJsZShzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLCBjb25zdCB2b2lkICpp bnB1dCkKK3sKKwljb25zdCBzdHJ1Y3QgcGhtX3NldF9wb3dlcl9zdGF0ZV9pbnB1dCAqc3RhdGVz ID0gKGNvbnN0IHN0cnVjdCBwaG1fc2V0X3Bvd2VyX3N0YXRlX2lucHV0ICopaW5wdXQ7CisJY29u c3Qgc3RydWN0IHRvbmdhX3Bvd2VyX3N0YXRlICp0b25nYV9wcyA9IGNhc3RfY29uc3RfcGh3X3Rv bmdhX3Bvd2VyX3N0YXRlKHN0YXRlcy0+cG5ld19zdGF0ZSk7CisJc3RydWN0IHRvbmdhX2h3bWdy ICpkYXRhID0gKHN0cnVjdCB0b25nYV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJc3RydWN0 IHRvbmdhX3NpbmdsZV9kcG1fdGFibGUgKnBzY2xrX3RhYmxlID0gJihkYXRhLT5kcG1fdGFibGUu c2Nsa190YWJsZSk7CisJdWludDMyX3Qgc2NsayA9IHRvbmdhX3BzLT5wZXJmb3JtYW5jZV9sZXZl bHNbdG9uZ2FfcHMtPnBlcmZvcm1hbmNlX2xldmVsX2NvdW50LTFdLmVuZ2luZV9jbG9jazsKKwlz dHJ1Y3QgdG9uZ2Ffc2luZ2xlX2RwbV90YWJsZSAqcG1jbGtfdGFibGUgPSAmKGRhdGEtPmRwbV90 YWJsZS5tY2xrX3RhYmxlKTsKKwl1aW50MzJfdCBtY2xrID0gdG9uZ2FfcHMtPnBlcmZvcm1hbmNl X2xldmVsc1t0b25nYV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxfY291bnQtMV0ubWVtb3J5X2Nsb2Nr OworCXN0cnVjdCBQUF9DbG9ja3MgbWluX2Nsb2NrcyA9IHswfTsKKwl1aW50MzJfdCBpOworCXN0 cnVjdCBjZ3NfZGlzcGxheV9pbmZvIGluZm8gPSB7MH07CisKKwlkYXRhLT5uZWVkX3VwZGF0ZV9z bXU3X2RwbV90YWJsZSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHNjbGtfdGFibGUtPmNvdW50 OyBpKyspIHsKKwkJaWYgKHNjbGsgPT0gcHNjbGtfdGFibGUtPmRwbV9sZXZlbHNbaV0udmFsdWUp CisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA+PSBwc2Nsa190YWJsZS0+Y291bnQpCisJCWRhdGEt Pm5lZWRfdXBkYXRlX3NtdTdfZHBtX3RhYmxlIHw9IERQTVRBQkxFX09EX1VQREFURV9TQ0xLOwor CWVsc2UgeworCS8qIFRPRE86IENoZWNrIFNDTEsgaW4gREFMJ3MgbWluaW11bSBjbG9ja3MgaW4g Y2FzZSBEZWVwU2xlZXAgZGl2aWRlciB1cGRhdGUgaXMgcmVxdWlyZWQuKi8KKwkJaWYoZGF0YS0+ ZGlzcGxheV90aW1pbmcubWluX2Nsb2NrX2luc3IgIT0gbWluX2Nsb2Nrcy5lbmdpbmVDbG9ja0lu U1IpCisJCQlkYXRhLT5uZWVkX3VwZGF0ZV9zbXU3X2RwbV90YWJsZSB8PSBEUE1UQUJMRV9VUERB VEVfU0NMSzsKKwl9CisKKwlmb3IgKGk9MDsgaSA8IHBtY2xrX3RhYmxlLT5jb3VudDsgaSsrKSB7 CisJCWlmIChtY2xrID09IHBtY2xrX3RhYmxlLT5kcG1fbGV2ZWxzW2ldLnZhbHVlKQorCQkJYnJl YWs7CisJfQorCisJaWYgKGkgPj0gcG1jbGtfdGFibGUtPmNvdW50KQorCQlkYXRhLT5uZWVkX3Vw ZGF0ZV9zbXU3X2RwbV90YWJsZSB8PSBEUE1UQUJMRV9PRF9VUERBVEVfTUNMSzsKKworCWNnc19n ZXRfYWN0aXZlX2Rpc3BsYXlzX2luZm8oaHdtZ3ItPmRldmljZSwgJmluZm8pOworCisJaWYgKGRh dGEtPmRpc3BsYXlfdGltaW5nLm51bV9leGlzdGluZ19kaXNwbGF5cyAhPSBpbmZvLmRpc3BsYXlf Y291bnQpCisJCWRhdGEtPm5lZWRfdXBkYXRlX3NtdTdfZHBtX3RhYmxlIHw9IERQTVRBQkxFX1VQ REFURV9NQ0xLOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50MTZfdCB0b25nYV9nZXRf bWF4aW11bV9saW5rX3NwZWVkKHN0cnVjdCBwcF9od21nciAqaHdtZ3IsIGNvbnN0IHN0cnVjdCB0 b25nYV9wb3dlcl9zdGF0ZSAqaHdfcHMpCit7CisJdWludDMyX3QgaTsKKwl1aW50MzJfdCBzY2xr LCBtYXhfc2NsayA9IDA7CisJc3RydWN0IHRvbmdhX2h3bWdyICpkYXRhID0gKHN0cnVjdCB0b25n YV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJc3RydWN0IHRvbmdhX2RwbV90YWJsZSAqcGRw bV90YWJsZSA9ICZkYXRhLT5kcG1fdGFibGU7CisKKwlmb3IgKGkgPSAwOyBpIDwgaHdfcHMtPnBl cmZvcm1hbmNlX2xldmVsX2NvdW50OyBpKyspIHsKKwkJc2NsayA9IGh3X3BzLT5wZXJmb3JtYW5j ZV9sZXZlbHNbaV0uZW5naW5lX2Nsb2NrOworCQlpZiAobWF4X3NjbGsgPCBzY2xrKQorCQkJbWF4 X3NjbGsgPSBzY2xrOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwZHBtX3RhYmxlLT5zY2xrX3Rh YmxlLmNvdW50OyBpKyspIHsKKwkJaWYgKHBkcG1fdGFibGUtPnNjbGtfdGFibGUuZHBtX2xldmVs c1tpXS52YWx1ZSA9PSBtYXhfc2NsaykKKwkJCXJldHVybiAodWludDE2X3QpICgoaSA+PSBwZHBt X3RhYmxlLT5wY2llX3NwZWVkX3RhYmxlLmNvdW50KSA/CisJCQkJCXBkcG1fdGFibGUtPnBjaWVf c3BlZWRfdGFibGUuZHBtX2xldmVsc1twZHBtX3RhYmxlLT5wY2llX3NwZWVkX3RhYmxlLmNvdW50 LTFdLnZhbHVlIDoKKwkJCQkJcGRwbV90YWJsZS0+cGNpZV9zcGVlZF90YWJsZS5kcG1fbGV2ZWxz W2ldLnZhbHVlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0b25nYV9yZXF1 ZXN0X2xpbmtfc3BlZWRfY2hhbmdlX2JlZm9yZV9zdGF0ZV9jaGFuZ2Uoc3RydWN0IHBwX2h3bWdy ICpod21nciwgY29uc3Qgdm9pZCAqaW5wdXQpCit7CisJY29uc3Qgc3RydWN0IHBobV9zZXRfcG93 ZXJfc3RhdGVfaW5wdXQgKnN0YXRlcyA9IChjb25zdCBzdHJ1Y3QgcGhtX3NldF9wb3dlcl9zdGF0 ZV9pbnB1dCAqKWlucHV0OworCXN0cnVjdCB0b25nYV9od21nciAqZGF0YSA9IChzdHJ1Y3QgdG9u Z2FfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCWNvbnN0IHN0cnVjdCB0b25nYV9wb3dlcl9z dGF0ZSAqdG9uZ2FfbnBzID0gY2FzdF9jb25zdF9waHdfdG9uZ2FfcG93ZXJfc3RhdGUoc3RhdGVz LT5wbmV3X3N0YXRlKTsKKwljb25zdCBzdHJ1Y3QgdG9uZ2FfcG93ZXJfc3RhdGUgKnRvbmdhX2Nw cyA9IGNhc3RfY29uc3RfcGh3X3RvbmdhX3Bvd2VyX3N0YXRlKHN0YXRlcy0+cGN1cnJlbnRfc3Rh dGUpOworCisJdWludDE2X3QgdGFyZ2V0X2xpbmtfc3BlZWQgPSB0b25nYV9nZXRfbWF4aW11bV9s aW5rX3NwZWVkKGh3bWdyLCB0b25nYV9ucHMpOworCXVpbnQxNl90IGN1cnJlbnRfbGlua19zcGVl ZDsKKworCWlmIChkYXRhLT5mb3JjZV9wY2llX2dlbiA9PSBQUF9QQ0lFR2VuSW52YWxpZCkKKwkJ Y3VycmVudF9saW5rX3NwZWVkID0gdG9uZ2FfZ2V0X21heGltdW1fbGlua19zcGVlZChod21nciwg dG9uZ2FfY3BzKTsKKwllbHNlCisJCWN1cnJlbnRfbGlua19zcGVlZCA9IGRhdGEtPmZvcmNlX3Bj aWVfZ2VuOworCisJZGF0YS0+Zm9yY2VfcGNpZV9nZW4gPSBQUF9QQ0lFR2VuSW52YWxpZDsKKwlk YXRhLT5wc3BwX25vdGlmeV9yZXF1aXJlZCA9IGZhbHNlOworCWlmICh0YXJnZXRfbGlua19zcGVl ZCA+IGN1cnJlbnRfbGlua19zcGVlZCkgeworCQlzd2l0Y2godGFyZ2V0X2xpbmtfc3BlZWQpIHsK KwkJY2FzZSBQUF9QQ0lFR2VuMzoKKwkJCWlmICgwID09IGFjcGlfcGNpZV9wZXJmX3JlcXVlc3Qo aHdtZ3ItPmRldmljZSwgUENJRV9QRVJGX1JFUV9HRU4zLCBmYWxzZSkpCisJCQkJYnJlYWs7CisJ CQlkYXRhLT5mb3JjZV9wY2llX2dlbiA9IFBQX1BDSUVHZW4yOworCQkJaWYgKGN1cnJlbnRfbGlu a19zcGVlZCA9PSBQUF9QQ0lFR2VuMikKKwkJCQlicmVhazsKKwkJY2FzZSBQUF9QQ0lFR2VuMjoK KwkJCWlmICgwID09IGFjcGlfcGNpZV9wZXJmX3JlcXVlc3QoaHdtZ3ItPmRldmljZSwgUENJRV9Q RVJGX1JFUV9HRU4yLCBmYWxzZSkpCisJCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkYXRhLT5m b3JjZV9wY2llX2dlbiA9IHRvbmdhX2dldF9jdXJyZW50X3BjaWVfc3BlZWQoaHdtZ3IpOworCQkJ YnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlpZiAodGFyZ2V0X2xpbmtfc3BlZWQgPCBjdXJyZW50 X2xpbmtfc3BlZWQpCisJCQlkYXRhLT5wc3BwX25vdGlmeV9yZXF1aXJlZCA9IHRydWU7CisJfQor CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG9uZ2FfZnJlZXplX3NjbGtfbWNsa19kcG0o c3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwlzdHJ1Y3QgdG9uZ2FfaHdtZ3IgKmRhdGEgPSAo c3RydWN0IHRvbmdhX2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKworCWlmICgwID09IGRhdGEt Pm5lZWRfdXBkYXRlX3NtdTdfZHBtX3RhYmxlKQorCQlyZXR1cm4gMDsKKworCWlmICgoMCA9PSBk YXRhLT5zY2xrX2RwbV9rZXlfZGlzYWJsZWQpICYmCisJCShkYXRhLT5uZWVkX3VwZGF0ZV9zbXU3 X2RwbV90YWJsZSAmCisJCShEUE1UQUJMRV9PRF9VUERBVEVfU0NMSyArIERQTVRBQkxFX1VQREFU RV9TQ0xLKSkpIHsKKwkJUFBfQVNTRVJUX1dJVEhfQ09ERSgKKwkJCXRydWUgPT0gdG9uZ2FfaXNf ZHBtX3J1bm5pbmcoaHdtZ3IpLAorCQkJIlRyeWluZyB0byBmcmVlemUgU0NMSyBEUE0gd2hlbiBE UE0gaXMgZGlzYWJsZWQiLAorCQkJKTsKKwkJUFBfQVNTRVJUX1dJVEhfQ09ERSgKKwkJCTAgPT0g c211bV9zZW5kX21zZ190b19zbWMoaHdtZ3ItPnNtdW1nciwKKwkJCQkJICBQUFNNQ19NU0dfU0NM S0RQTV9GcmVlemVMZXZlbCksCisJCQkiRmFpbGVkIHRvIGZyZWV6ZSBTQ0xLIERQTSBkdXJpbmcg RnJlZXplU2Nsa01jbGtEUE0gRnVuY3Rpb24hIiwKKwkJCXJldHVybiAtMSk7CisJfQorCisJaWYg KCgwID09IGRhdGEtPm1jbGtfZHBtX2tleV9kaXNhYmxlZCkgJiYKKwkJKGRhdGEtPm5lZWRfdXBk YXRlX3NtdTdfZHBtX3RhYmxlICYKKwkJIERQTVRBQkxFX09EX1VQREFURV9NQ0xLKSkgeworCQlQ UF9BU1NFUlRfV0lUSF9DT0RFKHRydWUgPT0gdG9uZ2FfaXNfZHBtX3J1bm5pbmcoaHdtZ3IpLAor CQkJIlRyeWluZyB0byBmcmVlemUgTUNMSyBEUE0gd2hlbiBEUE0gaXMgZGlzYWJsZWQiLAorCQkJ KTsKKwkJUFBfQVNTRVJUX1dJVEhfQ09ERSgKKwkJCTAgPT0gc211bV9zZW5kX21zZ190b19zbWMo aHdtZ3ItPnNtdW1nciwKKwkJCQkJCQlQUFNNQ19NU0dfTUNMS0RQTV9GcmVlemVMZXZlbCksCisJ CQkiRmFpbGVkIHRvIGZyZWV6ZSBNQ0xLIERQTSBkdXJpbmcgRnJlZXplU2Nsa01jbGtEUE0gRnVu Y3Rpb24hIiwKKwkJCXJldHVybiAtMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBp bnQgdG9uZ2FfcG9wdWxhdGVfYW5kX3VwbG9hZF9zY2xrX21jbGtfZHBtX2xldmVscyhzdHJ1Y3Qg cHBfaHdtZ3IgKmh3bWdyLCBjb25zdCB2b2lkICppbnB1dCkKK3sKKwlpbnQgcmVzdWx0ID0gMDsK KworCWNvbnN0IHN0cnVjdCBwaG1fc2V0X3Bvd2VyX3N0YXRlX2lucHV0ICpzdGF0ZXMgPSAoY29u c3Qgc3RydWN0IHBobV9zZXRfcG93ZXJfc3RhdGVfaW5wdXQgKilpbnB1dDsKKwljb25zdCBzdHJ1 Y3QgdG9uZ2FfcG93ZXJfc3RhdGUgKnRvbmdhX3BzID0gY2FzdF9jb25zdF9waHdfdG9uZ2FfcG93 ZXJfc3RhdGUoc3RhdGVzLT5wbmV3X3N0YXRlKTsKKwlzdHJ1Y3QgdG9uZ2FfaHdtZ3IgKmRhdGEg PSAoc3RydWN0IHRvbmdhX2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKwl1aW50MzJfdCBzY2xr ID0gdG9uZ2FfcHMtPnBlcmZvcm1hbmNlX2xldmVsc1t0b25nYV9wcy0+cGVyZm9ybWFuY2VfbGV2 ZWxfY291bnQtMV0uZW5naW5lX2Nsb2NrOworCXVpbnQzMl90IG1jbGsgPSB0b25nYV9wcy0+cGVy Zm9ybWFuY2VfbGV2ZWxzW3RvbmdhX3BzLT5wZXJmb3JtYW5jZV9sZXZlbF9jb3VudC0xXS5tZW1v cnlfY2xvY2s7CisJc3RydWN0IHRvbmdhX2RwbV90YWJsZSAqcGRwbV90YWJsZSA9ICZkYXRhLT5k cG1fdGFibGU7CisKKwlzdHJ1Y3QgdG9uZ2FfZHBtX3RhYmxlICpwZ29sZGVuX2RwbV90YWJsZSA9 ICZkYXRhLT5nb2xkZW5fZHBtX3RhYmxlOworCXVpbnQzMl90IGRwbV9jb3VudCwgY2xvY2tfcGVy Y2VudDsKKwl1aW50MzJfdCBpOworCisJaWYgKDAgPT0gZGF0YS0+bmVlZF91cGRhdGVfc211N19k cG1fdGFibGUpCisJCXJldHVybiAwOworCisJaWYgKGRhdGEtPm5lZWRfdXBkYXRlX3NtdTdfZHBt X3RhYmxlICYgRFBNVEFCTEVfT0RfVVBEQVRFX1NDTEspIHsKKwkJcGRwbV90YWJsZS0+c2Nsa190 YWJsZS5kcG1fbGV2ZWxzW3BkcG1fdGFibGUtPnNjbGtfdGFibGUuY291bnQtMV0udmFsdWUgPSBz Y2xrOworCisJCWlmIChwaG1fY2FwX2VuYWJsZWQoaHdtZ3ItPnBsYXRmb3JtX2Rlc2NyaXB0b3Iu cGxhdGZvcm1DYXBzLCBQSE1fUGxhdGZvcm1DYXBzX09ENlBsdXNpbkFDU3VwcG9ydCkgfHwKKwkJ ICAgIHBobV9jYXBfZW5hYmxlZChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNh cHMsIFBITV9QbGF0Zm9ybUNhcHNfT0Q2UGx1c2luRENTdXBwb3J0KSkgeworCQkvKiBOZWVkIHRv IGRvIGNhbGN1bGF0aW9uIGJhc2VkIG9uIHRoZSBnb2xkZW4gRFBNIHRhYmxlCisJCSAqIGFzIHRo ZSBIZWF0bWFwIEdQVSBDbG9jayBheGlzIGlzIGFsc28gYmFzZWQgb24gdGhlIGRlZmF1bHQgdmFs dWVzCisJCSAqLworCQkJUFBfQVNTRVJUX1dJVEhfQ09ERSgKKwkJCQkocGdvbGRlbl9kcG1fdGFi bGUtPnNjbGtfdGFibGUuZHBtX2xldmVsc1twZ29sZGVuX2RwbV90YWJsZS0+c2Nsa190YWJsZS5j b3VudC0xXS52YWx1ZSAhPSAwKSwKKwkJCQkiRGl2aWRlIGJ5IDAhIiwKKwkJCQlyZXR1cm4gLTEp OworCQkJZHBtX2NvdW50ID0gcGRwbV90YWJsZS0+c2Nsa190YWJsZS5jb3VudCA8IDIgPyAwIDog cGRwbV90YWJsZS0+c2Nsa190YWJsZS5jb3VudC0yOworCQkJZm9yIChpID0gZHBtX2NvdW50OyBp ID4gMTsgaS0tKSB7CisJCQkJaWYgKHNjbGsgPiBwZ29sZGVuX2RwbV90YWJsZS0+c2Nsa190YWJs ZS5kcG1fbGV2ZWxzW3Bnb2xkZW5fZHBtX3RhYmxlLT5zY2xrX3RhYmxlLmNvdW50LTFdLnZhbHVl KSB7CisJCQkJCWNsb2NrX3BlcmNlbnQgPSAoKHNjbGsgLSBwZ29sZGVuX2RwbV90YWJsZS0+c2Ns a190YWJsZS5kcG1fbGV2ZWxzW3Bnb2xkZW5fZHBtX3RhYmxlLT5zY2xrX3RhYmxlLmNvdW50LTFd LnZhbHVlKSoxMDApIC8KKwkJCQkJCQlwZ29sZGVuX2RwbV90YWJsZS0+c2Nsa190YWJsZS5kcG1f bGV2ZWxzW3Bnb2xkZW5fZHBtX3RhYmxlLT5zY2xrX3RhYmxlLmNvdW50LTFdLnZhbHVlOworCisJ CQkJCXBkcG1fdGFibGUtPnNjbGtfdGFibGUuZHBtX2xldmVsc1tpXS52YWx1ZSA9CisJCQkJCQkJ cGdvbGRlbl9kcG1fdGFibGUtPnNjbGtfdGFibGUuZHBtX2xldmVsc1tpXS52YWx1ZSArCisJCQkJ CQkJKHBnb2xkZW5fZHBtX3RhYmxlLT5zY2xrX3RhYmxlLmRwbV9sZXZlbHNbaV0udmFsdWUgKiBj bG9ja19wZXJjZW50KS8xMDA7CisKKwkJCQl9IGVsc2UgaWYgKHBnb2xkZW5fZHBtX3RhYmxlLT5z Y2xrX3RhYmxlLmRwbV9sZXZlbHNbcGRwbV90YWJsZS0+c2Nsa190YWJsZS5jb3VudC0xXS52YWx1 ZSA+IHNjbGspIHsKKwkJCQkJY2xvY2tfcGVyY2VudCA9ICgocGdvbGRlbl9kcG1fdGFibGUtPnNj bGtfdGFibGUuZHBtX2xldmVsc1twZ29sZGVuX2RwbV90YWJsZS0+c2Nsa190YWJsZS5jb3VudC0x XS52YWx1ZSAtIHNjbGspKjEwMCkgLworCQkJCQkJCQlwZ29sZGVuX2RwbV90YWJsZS0+c2Nsa190 YWJsZS5kcG1fbGV2ZWxzW3Bnb2xkZW5fZHBtX3RhYmxlLT5zY2xrX3RhYmxlLmNvdW50LTFdLnZh bHVlOworCisJCQkJCXBkcG1fdGFibGUtPnNjbGtfdGFibGUuZHBtX2xldmVsc1tpXS52YWx1ZSA9 CisJCQkJCQkJcGdvbGRlbl9kcG1fdGFibGUtPnNjbGtfdGFibGUuZHBtX2xldmVsc1tpXS52YWx1 ZSAtCisJCQkJCQkJKHBnb2xkZW5fZHBtX3RhYmxlLT5zY2xrX3RhYmxlLmRwbV9sZXZlbHNbaV0u dmFsdWUgKiBjbG9ja19wZXJjZW50KS8xMDA7CisJCQkJfSBlbHNlCisJCQkJCXBkcG1fdGFibGUt PnNjbGtfdGFibGUuZHBtX2xldmVsc1tpXS52YWx1ZSA9CisJCQkJCQkJcGdvbGRlbl9kcG1fdGFi bGUtPnNjbGtfdGFibGUuZHBtX2xldmVsc1tpXS52YWx1ZTsKKwkJCX0KKwkJfQorCX0KKworCWlm IChkYXRhLT5uZWVkX3VwZGF0ZV9zbXU3X2RwbV90YWJsZSAmIERQTVRBQkxFX09EX1VQREFURV9N Q0xLKSB7CisJCXBkcG1fdGFibGUtPm1jbGtfdGFibGUuZHBtX2xldmVsc1twZHBtX3RhYmxlLT5t Y2xrX3RhYmxlLmNvdW50LTFdLnZhbHVlID0gbWNsazsKKworCQlpZiAocGhtX2NhcF9lbmFibGVk KGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywgUEhNX1BsYXRmb3JtQ2Fw c19PRDZQbHVzaW5BQ1N1cHBvcnQpIHx8CisJCQlwaG1fY2FwX2VuYWJsZWQoaHdtZ3ItPnBsYXRm b3JtX2Rlc2NyaXB0b3IucGxhdGZvcm1DYXBzLCBQSE1fUGxhdGZvcm1DYXBzX09ENlBsdXNpbkRD U3VwcG9ydCkpIHsKKworCQkJUFBfQVNTRVJUX1dJVEhfQ09ERSgKKwkJCQkJKHBnb2xkZW5fZHBt X3RhYmxlLT5tY2xrX3RhYmxlLmRwbV9sZXZlbHNbcGdvbGRlbl9kcG1fdGFibGUtPm1jbGtfdGFi bGUuY291bnQtMV0udmFsdWUgIT0gMCksCisJCQkJCSJEaXZpZGUgYnkgMCEiLAorCQkJCQlyZXR1 cm4gLTEpOworCQkJZHBtX2NvdW50ID0gcGRwbV90YWJsZS0+bWNsa190YWJsZS5jb3VudCA8IDI/ IDAgOiBwZHBtX3RhYmxlLT5tY2xrX3RhYmxlLmNvdW50LTI7CisJCQlmb3IgKGkgPSBkcG1fY291 bnQ7IGkgPiAxOyBpLS0pIHsKKwkJCQlpZiAobWNsayA+IHBnb2xkZW5fZHBtX3RhYmxlLT5tY2xr X3RhYmxlLmRwbV9sZXZlbHNbcGdvbGRlbl9kcG1fdGFibGUtPm1jbGtfdGFibGUuY291bnQtMV0u dmFsdWUpIHsKKwkJCQkJCWNsb2NrX3BlcmNlbnQgPSAoKG1jbGsgLSBwZ29sZGVuX2RwbV90YWJs ZS0+bWNsa190YWJsZS5kcG1fbGV2ZWxzW3Bnb2xkZW5fZHBtX3RhYmxlLT5tY2xrX3RhYmxlLmNv dW50LTFdLnZhbHVlKSoxMDApIC8KKwkJCQkJCQkJICAgIHBnb2xkZW5fZHBtX3RhYmxlLT5tY2xr X3RhYmxlLmRwbV9sZXZlbHNbcGdvbGRlbl9kcG1fdGFibGUtPm1jbGtfdGFibGUuY291bnQtMV0u dmFsdWU7CisKKwkJCQkJCXBkcG1fdGFibGUtPm1jbGtfdGFibGUuZHBtX2xldmVsc1tpXS52YWx1 ZSA9CisJCQkJCQkJCQkJcGdvbGRlbl9kcG1fdGFibGUtPm1jbGtfdGFibGUuZHBtX2xldmVsc1tp XS52YWx1ZSArCisJCQkJCQkJCQkJKHBnb2xkZW5fZHBtX3RhYmxlLT5tY2xrX3RhYmxlLmRwbV9s ZXZlbHNbaV0udmFsdWUgKiBjbG9ja19wZXJjZW50KS8xMDA7CisKKwkJCQl9IGVsc2UgaWYgKHBn b2xkZW5fZHBtX3RhYmxlLT5tY2xrX3RhYmxlLmRwbV9sZXZlbHNbcGRwbV90YWJsZS0+bWNsa190 YWJsZS5jb3VudC0xXS52YWx1ZSA+IG1jbGspIHsKKwkJCQkJCWNsb2NrX3BlcmNlbnQgPSAoKHBn b2xkZW5fZHBtX3RhYmxlLT5tY2xrX3RhYmxlLmRwbV9sZXZlbHNbcGdvbGRlbl9kcG1fdGFibGUt Pm1jbGtfdGFibGUuY291bnQtMV0udmFsdWUgLSBtY2xrKSoxMDApIC8KKwkJCQkJCQkJICAgIHBn b2xkZW5fZHBtX3RhYmxlLT5tY2xrX3RhYmxlLmRwbV9sZXZlbHNbcGdvbGRlbl9kcG1fdGFibGUt Pm1jbGtfdGFibGUuY291bnQtMV0udmFsdWU7CisKKwkJCQkJCXBkcG1fdGFibGUtPm1jbGtfdGFi bGUuZHBtX2xldmVsc1tpXS52YWx1ZSA9CisJCQkJCQkJCQlwZ29sZGVuX2RwbV90YWJsZS0+bWNs a190YWJsZS5kcG1fbGV2ZWxzW2ldLnZhbHVlIC0KKwkJCQkJCQkJCShwZ29sZGVuX2RwbV90YWJs ZS0+bWNsa190YWJsZS5kcG1fbGV2ZWxzW2ldLnZhbHVlICogY2xvY2tfcGVyY2VudCkvMTAwOwor CQkJCX0gZWxzZQorCQkJCQlwZHBtX3RhYmxlLT5tY2xrX3RhYmxlLmRwbV9sZXZlbHNbaV0udmFs dWUgPSBwZ29sZGVuX2RwbV90YWJsZS0+bWNsa190YWJsZS5kcG1fbGV2ZWxzW2ldLnZhbHVlOwor CQkJfQorCQl9CisJfQorCisJaWYgKGRhdGEtPm5lZWRfdXBkYXRlX3NtdTdfZHBtX3RhYmxlICYg KERQTVRBQkxFX09EX1VQREFURV9TQ0xLICsgRFBNVEFCTEVfVVBEQVRFX1NDTEspKSB7CisJCXJl c3VsdCA9IHRvbmdhX3BvcHVsYXRlX2FsbF9tZW1vcnlfbGV2ZWxzKGh3bWdyKTsKKwkJUFBfQVNT RVJUX1dJVEhfQ09ERSgoMCA9PSByZXN1bHQpLAorCQkJIkZhaWxlZCB0byBwb3B1bGF0ZSBTQ0xL IGR1cmluZyBQb3B1bGF0ZU5ld0RQTUNsb2Nrc1N0YXRlcyBGdW5jdGlvbiEiLAorCQkJcmV0dXJu IHJlc3VsdCk7CisJfQorCisJaWYgKGRhdGEtPm5lZWRfdXBkYXRlX3NtdTdfZHBtX3RhYmxlICYg KERQTVRBQkxFX09EX1VQREFURV9NQ0xLICsgRFBNVEFCTEVfVVBEQVRFX01DTEspKSB7CisJCS8q cG9wdWxhdGUgTUNMSyBkcG0gdGFibGUgdG8gU01VNyAqLworCQlyZXN1bHQgPSB0b25nYV9wb3B1 bGF0ZV9hbGxfbWVtb3J5X2xldmVscyhod21ncik7CisJCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAg PT0gcmVzdWx0KSwKKwkJCQkiRmFpbGVkIHRvIHBvcHVsYXRlIE1DTEsgZHVyaW5nIFBvcHVsYXRl TmV3RFBNQ2xvY2tzU3RhdGVzIEZ1bmN0aW9uISIsCisJCQkJcmV0dXJuIHJlc3VsdCk7CisJfQor CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljCWludCB0b25nYV90cmltX3NpbmdsZV9kcG1f c3RhdGVzKHN0cnVjdCBwcF9od21nciAqaHdtZ3IsCisJCQkgIHN0cnVjdCB0b25nYV9zaW5nbGVf ZHBtX3RhYmxlICogcGRwbV90YWJsZSwKKwkJCSAgICAgdWludDMyX3QgbG93X2xpbWl0LCB1aW50 MzJfdCBoaWdoX2xpbWl0KQoreworCXVpbnQzMl90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGRw bV90YWJsZS0+Y291bnQ7IGkrKykgeworCQlpZiAoKHBkcG1fdGFibGUtPmRwbV9sZXZlbHNbaV0u dmFsdWUgPCBsb3dfbGltaXQpIHx8CisJCSAgICAocGRwbV90YWJsZS0+ZHBtX2xldmVsc1tpXS52 YWx1ZSA+IGhpZ2hfbGltaXQpKQorCQkJcGRwbV90YWJsZS0+ZHBtX2xldmVsc1tpXS5lbmFibGVk ID0gZmFsc2U7CisJCWVsc2UKKwkJCXBkcG1fdGFibGUtPmRwbV9sZXZlbHNbaV0uZW5hYmxlZCA9 IHRydWU7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRvbmdhX3RyaW1fZHBtX3N0 YXRlcyhzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLCBjb25zdCBzdHJ1Y3QgdG9uZ2FfcG93ZXJfc3Rh dGUgKmh3X3N0YXRlKQoreworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCB0b25nYV9od21nciAq ZGF0YSA9IChzdHJ1Y3QgdG9uZ2FfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXVpbnQzMl90 IGhpZ2hfbGltaXRfY291bnQ7CisKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKChod19zdGF0ZS0+cGVy Zm9ybWFuY2VfbGV2ZWxfY291bnQgPj0gMSksCisJCQkJInBvd2VyIHN0YXRlIGRpZCBub3QgaGF2 ZSBhbnkgcGVyZm9ybWFuY2UgbGV2ZWwiLAorCQkJCSByZXR1cm4gLTEpOworCisJaGlnaF9saW1p dF9jb3VudCA9ICgxID09IGh3X3N0YXRlLT5wZXJmb3JtYW5jZV9sZXZlbF9jb3VudCkgPyAwOiAx OworCisJdG9uZ2FfdHJpbV9zaW5nbGVfZHBtX3N0YXRlcyhod21nciwKKwkJCQkJJihkYXRhLT5k cG1fdGFibGUuc2Nsa190YWJsZSksCisJCQkJCWh3X3N0YXRlLT5wZXJmb3JtYW5jZV9sZXZlbHNb MF0uZW5naW5lX2Nsb2NrLAorCQkJCQlod19zdGF0ZS0+cGVyZm9ybWFuY2VfbGV2ZWxzW2hpZ2hf bGltaXRfY291bnRdLmVuZ2luZV9jbG9jayk7CisKKwl0b25nYV90cmltX3NpbmdsZV9kcG1fc3Rh dGVzKGh3bWdyLAorCQkJCQkJJihkYXRhLT5kcG1fdGFibGUubWNsa190YWJsZSksCisJCQkJCQlo d19zdGF0ZS0+cGVyZm9ybWFuY2VfbGV2ZWxzWzBdLm1lbW9yeV9jbG9jaywKKwkJCQkJCWh3X3N0 YXRlLT5wZXJmb3JtYW5jZV9sZXZlbHNbaGlnaF9saW1pdF9jb3VudF0ubWVtb3J5X2Nsb2NrKTsK KworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgdG9uZ2FfZ2VuZXJhdGVfZHBtX2xl dmVsX2VuYWJsZV9tYXNrKHN0cnVjdCBwcF9od21nciAqaHdtZ3IsIGNvbnN0IHZvaWQgKmlucHV0 KQoreworCWludCByZXN1bHQ7CisJY29uc3Qgc3RydWN0IHBobV9zZXRfcG93ZXJfc3RhdGVfaW5w dXQgKnN0YXRlcyA9IChjb25zdCBzdHJ1Y3QgcGhtX3NldF9wb3dlcl9zdGF0ZV9pbnB1dCAqKWlu cHV0OworCXN0cnVjdCB0b25nYV9od21nciAqZGF0YSA9IChzdHJ1Y3QgdG9uZ2FfaHdtZ3IgKiko aHdtZ3ItPmJhY2tlbmQpOworCWNvbnN0IHN0cnVjdCB0b25nYV9wb3dlcl9zdGF0ZSAqdG9uZ2Ff cHMgPSBjYXN0X2NvbnN0X3Bod190b25nYV9wb3dlcl9zdGF0ZShzdGF0ZXMtPnBuZXdfc3RhdGUp OworCisKKwlyZXN1bHQgPSB0b25nYV90cmltX2RwbV9zdGF0ZXMoaHdtZ3IsIHRvbmdhX3BzKTsK KwlpZiAoMCAhPSByZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwlkYXRhLT5kcG1fbGV2ZWxf ZW5hYmxlX21hc2suc2Nsa19kcG1fZW5hYmxlX21hc2sgPSB0b25nYV9nZXRfZHBtX2xldmVsX2Vu YWJsZV9tYXNrX3ZhbHVlKCZkYXRhLT5kcG1fdGFibGUuc2Nsa190YWJsZSk7CisJZGF0YS0+ZHBt X2xldmVsX2VuYWJsZV9tYXNrLm1jbGtfZHBtX2VuYWJsZV9tYXNrID0gdG9uZ2FfZ2V0X2RwbV9s ZXZlbF9lbmFibGVfbWFza192YWx1ZSgmZGF0YS0+ZHBtX3RhYmxlLm1jbGtfdGFibGUpOworCWRh dGEtPmxhc3RfbWNsa19kcG1fZW5hYmxlX21hc2sgPSBkYXRhLT5kcG1fbGV2ZWxfZW5hYmxlX21h c2subWNsa19kcG1fZW5hYmxlX21hc2s7CisJaWYgKGRhdGEtPnV2ZF9lbmFibGVkKQorCQlkYXRh LT5kcG1fbGV2ZWxfZW5hYmxlX21hc2subWNsa19kcG1fZW5hYmxlX21hc2sgJj0gMHhGRkZGRkZG RTsKKworCWRhdGEtPmRwbV9sZXZlbF9lbmFibGVfbWFzay5wY2llX2RwbV9lbmFibGVfbWFzayA9 IHRvbmdhX2dldF9kcG1fbGV2ZWxfZW5hYmxlX21hc2tfdmFsdWUoJmRhdGEtPmRwbV90YWJsZS5w Y2llX3NwZWVkX3RhYmxlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRvbmdhX2Vu YWJsZV9kaXNhYmxlX3ZjZV9kcG0oc3RydWN0IHBwX2h3bWdyICpod21nciwgYm9vbCBlbmFibGUp Cit7CisJcmV0dXJuIHNtdW1fc2VuZF9tc2dfdG9fc21jKGh3bWdyLT5zbXVtZ3IsIGVuYWJsZT8K KwkJCQkgIChQUFNNQ19Nc2cpUFBTTUNfTVNHX1ZDRURQTV9FbmFibGUgOgorCQkJCSAgKFBQU01D X01zZylQUFNNQ19NU0dfVkNFRFBNX0Rpc2FibGUpOworfQorCitzdGF0aWMgaW50IHRvbmdhX3Vw ZGF0ZV92Y2VfZHBtKHN0cnVjdCBwcF9od21nciAqaHdtZ3IsIGNvbnN0IHZvaWQgKmlucHV0KQor eworCWNvbnN0IHN0cnVjdCBwaG1fc2V0X3Bvd2VyX3N0YXRlX2lucHV0ICpzdGF0ZXMgPSAoY29u c3Qgc3RydWN0IHBobV9zZXRfcG93ZXJfc3RhdGVfaW5wdXQgKilpbnB1dDsKKwlzdHJ1Y3QgdG9u Z2FfaHdtZ3IgKmRhdGEgPSAoc3RydWN0IHRvbmdhX2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsK Kwljb25zdCBzdHJ1Y3QgdG9uZ2FfcG93ZXJfc3RhdGUgKnRvbmdhX25wcyA9IGNhc3RfY29uc3Rf cGh3X3RvbmdhX3Bvd2VyX3N0YXRlKHN0YXRlcy0+cG5ld19zdGF0ZSk7CisJY29uc3Qgc3RydWN0 IHRvbmdhX3Bvd2VyX3N0YXRlICp0b25nYV9jcHMgPSBjYXN0X2NvbnN0X3Bod190b25nYV9wb3dl cl9zdGF0ZShzdGF0ZXMtPnBjdXJyZW50X3N0YXRlKTsKKworCXVpbnQzMl90IG1tX2Jvb3RfbGV2 ZWxfb2Zmc2V0LCBtbV9ib290X2xldmVsX3ZhbHVlOworCXN0cnVjdCBwaG1fcHB0X3YxX2luZm9y bWF0aW9uICpwcHRhYmxlX2luZm8gPSAoc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKiko aHdtZ3ItPnBwdGFibGUpOworCisJaWYodG9uZ2FfbnBzLT52Y2VfY2xvY2tzLkVWQ0xLID4wICYm CisJKHRvbmdhX2NwcyA9PSBOVUxMIHx8IHRvbmdhX2Nwcy0+dmNlX2Nsb2Nrcy5FVkNMSyA9PSAw KSkgeworCQlkYXRhLT5zbWNfc3RhdGVfdGFibGUuVmNlQm9vdExldmVsID0gKHVpbnQ4X3QpIChw cHRhYmxlX2luZm8tPm1tX2RlcF90YWJsZS0+Y291bnQgLSAxKTsKKworCQltbV9ib290X2xldmVs X29mZnNldCA9IGRhdGEtPmRwbV90YWJsZV9zdGFydCArIG9mZnNldG9mKFNNVTcyX0Rpc2NyZXRl X0RwbVRhYmxlLCBWY2VCb290TGV2ZWwpOworCQltbV9ib290X2xldmVsX29mZnNldCAvPSA0Owor CQltbV9ib290X2xldmVsX29mZnNldCAqPSA0OworCQltbV9ib290X2xldmVsX3ZhbHVlID0gY2dz X3JlYWRfaW5kX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19TTUMsIG1tX2Jv b3RfbGV2ZWxfb2Zmc2V0KTsKKwkJbW1fYm9vdF9sZXZlbF92YWx1ZSAmPSAweEZGMDBGRkZGOwor CQltbV9ib290X2xldmVsX3ZhbHVlIHw9IGRhdGEtPnNtY19zdGF0ZV90YWJsZS5WY2VCb290TGV2 ZWwgPDwgMTY7CisJCWNnc193cml0ZV9pbmRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgQ0dTX0lO RF9SRUdfX1NNQywgbW1fYm9vdF9sZXZlbF9vZmZzZXQsIG1tX2Jvb3RfbGV2ZWxfdmFsdWUpOwor CisJCWlmIChwaG1fY2FwX2VuYWJsZWQoaHdtZ3ItPnBsYXRmb3JtX2Rlc2NyaXB0b3IucGxhdGZv cm1DYXBzLCBQSE1fUGxhdGZvcm1DYXBzX1N0YWJsZVBTdGF0ZSkpIHsKKwkJCQlzbXVtX3NlbmRf bXNnX3RvX3NtY193aXRoX3BhcmFtZXRlcigKKwkJCQkJCQkgICBod21nci0+c211bWdyLAorCQkJ KFBQU01DX01zZykoUFBTTUNfTVNHX1ZDRURQTV9TZXRFbmFibGVkTWFzayksCisJCQkodWludDMy X3QpMSA8PCBkYXRhLT5zbWNfc3RhdGVfdGFibGUuVmNlQm9vdExldmVsKTsKKworCQkJdG9uZ2Ff ZW5hYmxlX2Rpc2FibGVfdmNlX2RwbShod21nciwgdHJ1ZSk7CisJCX0gZWxzZSBpZiAodG9uZ2Ff bnBzLT52Y2VfY2xvY2tzLkVWQ0xLID09IDAgJiYgdG9uZ2FfY3BzICE9IE5VTEwgJiYgdG9uZ2Ff Y3BzLT52Y2VfY2xvY2tzLkVWQ0xLID4gMCkKKwkJCXRvbmdhX2VuYWJsZV9kaXNhYmxlX3ZjZV9k cG0oaHdtZ3IsIGZhbHNlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0b25n YV91cGRhdGVfYW5kX3VwbG9hZF9tY19yZWdfdGFibGUoc3RydWN0IHBwX2h3bWdyICpod21ncikK K3sKKwlzdHJ1Y3QgdG9uZ2FfaHdtZ3IgKmRhdGEgPSAoc3RydWN0IHRvbmdhX2h3bWdyICopKGh3 bWdyLT5iYWNrZW5kKTsKKworCXVpbnQzMl90IGFkZHJlc3M7CisJaW50MzJfdCByZXN1bHQ7CisK KwlpZiAoMCA9PSAoZGF0YS0+bmVlZF91cGRhdGVfc211N19kcG1fdGFibGUgJiBEUE1UQUJMRV9P RF9VUERBVEVfTUNMSykpCisJCXJldHVybiAwOworCisKKwltZW1zZXQoJmRhdGEtPm1jX3JlZ190 YWJsZSwgMCwgc2l6ZW9mKFNNVTcyX0Rpc2NyZXRlX01DUmVnaXN0ZXJzKSk7CisKKwlyZXN1bHQg PSB0b25nYV9jb252ZXJ0X21jX3JlZ190YWJsZV90b19zbWMoaHdtZ3IsICYoZGF0YS0+bWNfcmVn X3RhYmxlKSk7CisKKwlpZihyZXN1bHQgIT0gMCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCisJYWRk cmVzcyA9IGRhdGEtPm1jX3JlZ190YWJsZV9zdGFydCArICh1aW50MzJfdClvZmZzZXRvZihTTVU3 Ml9EaXNjcmV0ZV9NQ1JlZ2lzdGVycywgZGF0YVswXSk7CisKKwlyZXR1cm4gIHRvbmdhX2NvcHlf Ynl0ZXNfdG9fc21jKGh3bWdyLT5zbXVtZ3IsIGFkZHJlc3MsCisJCQkJICh1aW50OF90ICopJmRh dGEtPm1jX3JlZ190YWJsZS5kYXRhWzBdLAorCQkJCXNpemVvZihTTVU3Ml9EaXNjcmV0ZV9NQ1Jl Z2lzdGVyU2V0KSAqIGRhdGEtPmRwbV90YWJsZS5tY2xrX3RhYmxlLmNvdW50LAorCQkJCWRhdGEt PnNyYW1fZW5kKTsKK30KKworc3RhdGljIGludCB0b25nYV9wcm9ncmFtX21lbW9yeV90aW1pbmdf cGFyYW1ldGVyc19jb25kaXRpb25hbGx5KHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJc3Ry dWN0IHRvbmdhX2h3bWdyICpkYXRhID0gKHN0cnVjdCB0b25nYV9od21nciAqKShod21nci0+YmFj a2VuZCk7CisKKwlpZiAoZGF0YS0+bmVlZF91cGRhdGVfc211N19kcG1fdGFibGUgJgorCQkoRFBN VEFCTEVfT0RfVVBEQVRFX1NDTEsgKyBEUE1UQUJMRV9PRF9VUERBVEVfTUNMSykpCisJCXJldHVy biB0b25nYV9wcm9ncmFtX21lbW9yeV90aW1pbmdfcGFyYW1ldGVycyhod21ncik7CisKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIGludCB0b25nYV91bmZyZWV6ZV9zY2xrX21jbGtfZHBtKHN0cnVj dCBwcF9od21nciAqaHdtZ3IpCit7CisJc3RydWN0IHRvbmdhX2h3bWdyICpkYXRhID0gKHN0cnVj dCB0b25nYV9od21nciAqKShod21nci0+YmFja2VuZCk7CisKKwlpZiAoMCA9PSBkYXRhLT5uZWVk X3VwZGF0ZV9zbXU3X2RwbV90YWJsZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKDAgPT0gZGF0YS0+ c2Nsa19kcG1fa2V5X2Rpc2FibGVkKSAmJgorCQkoZGF0YS0+bmVlZF91cGRhdGVfc211N19kcG1f dGFibGUgJgorCQkoRFBNVEFCTEVfT0RfVVBEQVRFX1NDTEsgKyBEUE1UQUJMRV9VUERBVEVfU0NM SykpKSB7CisKKwkJUFBfQVNTRVJUX1dJVEhfQ09ERSh0cnVlID09IHRvbmdhX2lzX2RwbV9ydW5u aW5nKGh3bWdyKSwKKwkJCSJUcnlpbmcgdG8gVW5mcmVlemUgU0NMSyBEUE0gd2hlbiBEUE0gaXMg ZGlzYWJsZWQiLAorCQkJKTsKKwkJUFBfQVNTRVJUX1dJVEhfQ09ERSgKKwkJCSAwID09IHNtdW1f c2VuZF9tc2dfdG9fc21jKGh3bWdyLT5zbXVtZ3IsCisJCQkJCSBQUFNNQ19NU0dfU0NMS0RQTV9V bmZyZWV6ZUxldmVsKSwKKwkJCSJGYWlsZWQgdG8gdW5mcmVlemUgU0NMSyBEUE0gZHVyaW5nIFVu RnJlZXplU2Nsa01jbGtEUE0gRnVuY3Rpb24hIiwKKwkJCXJldHVybiAtMSk7CisJfQorCisJaWYg KCgwID09IGRhdGEtPm1jbGtfZHBtX2tleV9kaXNhYmxlZCkgJiYKKwkJKGRhdGEtPm5lZWRfdXBk YXRlX3NtdTdfZHBtX3RhYmxlICYgRFBNVEFCTEVfT0RfVVBEQVRFX01DTEspKSB7CisKKwkJUFBf QVNTRVJUX1dJVEhfQ09ERSgKKwkJCQl0cnVlID09IHRvbmdhX2lzX2RwbV9ydW5uaW5nKGh3bWdy KSwKKwkJCQkiVHJ5aW5nIHRvIFVuZnJlZXplIE1DTEsgRFBNIHdoZW4gRFBNIGlzIGRpc2FibGVk IiwKKwkJCQkpOworCQlQUF9BU1NFUlRfV0lUSF9DT0RFKAorCQkJIDAgPT0gc211bV9zZW5kX21z Z190b19zbWMoaHdtZ3ItPnNtdW1nciwKKwkJCQkJIFBQU01DX01TR19TQ0xLRFBNX1VuZnJlZXpl TGV2ZWwpLAorCQkgICAgIkZhaWxlZCB0byB1bmZyZWV6ZSBNQ0xLIERQTSBkdXJpbmcgVW5GcmVl emVTY2xrTWNsa0RQTSBGdW5jdGlvbiEiLAorCQkgICAgcmV0dXJuIC0xKTsKKwl9CisKKwlkYXRh LT5uZWVkX3VwZGF0ZV9zbXU3X2RwbV90YWJsZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3Rh dGljIGludCB0b25nYV9ub3RpZnlfbGlua19zcGVlZF9jaGFuZ2VfYWZ0ZXJfc3RhdGVfY2hhbmdl KHN0cnVjdCBwcF9od21nciAqaHdtZ3IsIGNvbnN0IHZvaWQgKmlucHV0KQoreworCWNvbnN0IHN0 cnVjdCBwaG1fc2V0X3Bvd2VyX3N0YXRlX2lucHV0ICpzdGF0ZXMgPSAoY29uc3Qgc3RydWN0IHBo bV9zZXRfcG93ZXJfc3RhdGVfaW5wdXQgKilpbnB1dDsKKwlzdHJ1Y3QgdG9uZ2FfaHdtZ3IgKmRh dGEgPSAoc3RydWN0IHRvbmdhX2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKwljb25zdCBzdHJ1 Y3QgdG9uZ2FfcG93ZXJfc3RhdGUgKnRvbmdhX3BzID0gY2FzdF9jb25zdF9waHdfdG9uZ2FfcG93 ZXJfc3RhdGUoc3RhdGVzLT5wbmV3X3N0YXRlKTsKKwl1aW50MTZfdCB0YXJnZXRfbGlua19zcGVl ZCA9IHRvbmdhX2dldF9tYXhpbXVtX2xpbmtfc3BlZWQoaHdtZ3IsIHRvbmdhX3BzKTsKKwl1aW50 OF90ICByZXF1ZXN0OworCisJaWYgKGRhdGEtPnBzcHBfbm90aWZ5X3JlcXVpcmVkICB8fAorCSAg ICBkYXRhLT5wY2llX3BlcmZvcm1hbmNlX3JlcXVlc3QpIHsKKwkJaWYgKHRhcmdldF9saW5rX3Nw ZWVkID09IFBQX1BDSUVHZW4zKQorCQkJcmVxdWVzdCA9IFBDSUVfUEVSRl9SRVFfR0VOMzsKKwkJ ZWxzZSBpZiAodGFyZ2V0X2xpbmtfc3BlZWQgPT0gUFBfUENJRUdlbjIpCisJCQlyZXF1ZXN0ID0g UENJRV9QRVJGX1JFUV9HRU4yOworCQllbHNlCisJCQlyZXF1ZXN0ID0gUENJRV9QRVJGX1JFUV9H RU4xOworCisJCWlmKHJlcXVlc3QgPT0gUENJRV9QRVJGX1JFUV9HRU4xICYmIHRvbmdhX2dldF9j dXJyZW50X3BjaWVfc3BlZWQoaHdtZ3IpID4gMCkgeworCQkJZGF0YS0+cGNpZV9wZXJmb3JtYW5j ZV9yZXF1ZXN0ID0gZmFsc2U7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICgwICE9IGFjcGlf cGNpZV9wZXJmX3JlcXVlc3QoaHdtZ3ItPmRldmljZSwgcmVxdWVzdCwgZmFsc2UpKSB7CisJCQlp ZiAoUFBfUENJRUdlbjIgPT0gdGFyZ2V0X2xpbmtfc3BlZWQpCisJCQkJcHJpbnRrKCJQU1BQIHJl cXVlc3QgdG8gc3dpdGNoIHRvIEdlbjIgZnJvbSBHZW4zIEZhaWxlZCEiKTsKKwkJCWVsc2UKKwkJ CQlwcmludGsoIlBTUFAgcmVxdWVzdCB0byBzd2l0Y2ggdG8gR2VuMSBmcm9tIEdlbjIgRmFpbGVk ISIpOworCQl9CisJfQorCisJZGF0YS0+cGNpZV9wZXJmb3JtYW5jZV9yZXF1ZXN0ID0gZmFsc2U7 CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG9uZ2Ffc2V0X3Bvd2VyX3N0YXRlX3Rhc2tz KHN0cnVjdCBwcF9od21nciAqaHdtZ3IsIGNvbnN0IHZvaWQgKmlucHV0KQoreworCWludCB0bXBf cmVzdWx0LCByZXN1bHQgPSAwOworCisJdG1wX3Jlc3VsdCA9IHRvbmdhX2ZpbmRfZHBtX3N0YXRl c19jbG9ja3NfaW5fZHBtX3RhYmxlKGh3bWdyLCBpbnB1dCk7CisJUFBfQVNTRVJUX1dJVEhfQ09E RSgoMCA9PSB0bXBfcmVzdWx0KSwgIkZhaWxlZCB0byBmaW5kIERQTSBzdGF0ZXMgY2xvY2tzIGlu IERQTSB0YWJsZSEiLCByZXN1bHQgPSB0bXBfcmVzdWx0KTsKKworCWlmIChwaG1fY2FwX2VuYWJs ZWQoaHdtZ3ItPnBsYXRmb3JtX2Rlc2NyaXB0b3IucGxhdGZvcm1DYXBzLCBQSE1fUGxhdGZvcm1D YXBzX1BDSUVQZXJmb3JtYW5jZVJlcXVlc3QpKSB7CisJCXRtcF9yZXN1bHQgPSB0b25nYV9yZXF1 ZXN0X2xpbmtfc3BlZWRfY2hhbmdlX2JlZm9yZV9zdGF0ZV9jaGFuZ2UoaHdtZ3IsIGlucHV0KTsK KwkJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSB0bXBfcmVzdWx0KSwgIkZhaWxlZCB0byByZXF1 ZXN0IGxpbmsgc3BlZWQgY2hhbmdlIGJlZm9yZSBzdGF0ZSBjaGFuZ2UhIiwgcmVzdWx0ID0gdG1w X3Jlc3VsdCk7CisJfQorCisJdG1wX3Jlc3VsdCA9IHRvbmdhX2ZyZWV6ZV9zY2xrX21jbGtfZHBt KGh3bWdyKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09IHRtcF9yZXN1bHQpLCAiRmFpbGVk IHRvIGZyZWV6ZSBTQ0xLIE1DTEsgRFBNISIsIHJlc3VsdCA9IHRtcF9yZXN1bHQpOworCisJdG1w X3Jlc3VsdCA9IHRvbmdhX3BvcHVsYXRlX2FuZF91cGxvYWRfc2Nsa19tY2xrX2RwbV9sZXZlbHMo aHdtZ3IsIGlucHV0KTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09IHRtcF9yZXN1bHQpLCAi RmFpbGVkIHRvIHBvcHVsYXRlIGFuZCB1cGxvYWQgU0NMSyBNQ0xLIERQTSBsZXZlbHMhIiwgcmVz dWx0ID0gdG1wX3Jlc3VsdCk7CisKKwl0bXBfcmVzdWx0ID0gdG9uZ2FfZ2VuZXJhdGVfZHBtX2xl dmVsX2VuYWJsZV9tYXNrKGh3bWdyLCBpbnB1dCk7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9 PSB0bXBfcmVzdWx0KSwgIkZhaWxlZCB0byBnZW5lcmF0ZSBEUE0gbGV2ZWwgZW5hYmxlZCBtYXNr ISIsIHJlc3VsdCA9IHRtcF9yZXN1bHQpOworCisJdG1wX3Jlc3VsdCA9IHRvbmdhX3VwZGF0ZV92 Y2VfZHBtKGh3bWdyLCBpbnB1dCk7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSB0bXBfcmVz dWx0KSwgIkZhaWxlZCB0byB1cGRhdGUgVkNFIERQTSEiLCByZXN1bHQgPSB0bXBfcmVzdWx0KTsK KworCXRtcF9yZXN1bHQgPSB0b25nYV91cGRhdGVfc2Nsa190aHJlc2hvbGQoaHdtZ3IpOworCVBQ X0FTU0VSVF9XSVRIX0NPREUoKDAgPT0gdG1wX3Jlc3VsdCksICJGYWlsZWQgdG8gdXBkYXRlIFND TEsgdGhyZXNob2xkISIsIHJlc3VsdCA9IHRtcF9yZXN1bHQpOworCisJdG1wX3Jlc3VsdCA9IHRv bmdhX3VwZGF0ZV9hbmRfdXBsb2FkX21jX3JlZ190YWJsZShod21ncik7CisJUFBfQVNTRVJUX1dJ VEhfQ09ERSgoMCA9PSB0bXBfcmVzdWx0KSwgIkZhaWxlZCB0byB1cGxvYWQgTUMgcmVnIHRhYmxl ISIsIHJlc3VsdCA9IHRtcF9yZXN1bHQpOworCisJdG1wX3Jlc3VsdCA9IHRvbmdhX3Byb2dyYW1f bWVtb3J5X3RpbWluZ19wYXJhbWV0ZXJzX2NvbmRpdGlvbmFsbHkoaHdtZ3IpOworCVBQX0FTU0VS VF9XSVRIX0NPREUoKDAgPT0gdG1wX3Jlc3VsdCksICJGYWlsZWQgdG8gcHJvZ3JhbSBtZW1vcnkg dGltaW5nIHBhcmFtZXRlcnMhIiwgcmVzdWx0ID0gdG1wX3Jlc3VsdCk7CisKKwl0bXBfcmVzdWx0 ID0gdG9uZ2FfdW5mcmVlemVfc2Nsa19tY2xrX2RwbShod21ncik7CisJUFBfQVNTRVJUX1dJVEhf Q09ERSgoMCA9PSB0bXBfcmVzdWx0KSwgIkZhaWxlZCB0byB1bmZyZWV6ZSBTQ0xLIE1DTEsgRFBN ISIsIHJlc3VsdCA9IHRtcF9yZXN1bHQpOworCisJdG1wX3Jlc3VsdCA9IHRvbmdhX3VwbG9hZF9k cG1fbGV2ZWxfZW5hYmxlX21hc2soaHdtZ3IpOworCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgPT0g dG1wX3Jlc3VsdCksICJGYWlsZWQgdG8gdXBsb2FkIERQTSBsZXZlbCBlbmFibGVkIG1hc2shIiwg cmVzdWx0ID0gdG1wX3Jlc3VsdCk7CisKKwlpZiAocGhtX2NhcF9lbmFibGVkKGh3bWdyLT5wbGF0 Zm9ybV9kZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywgUEhNX1BsYXRmb3JtQ2Fwc19QQ0lFUGVyZm9y bWFuY2VSZXF1ZXN0KSkgeworCQl0bXBfcmVzdWx0ID0gdG9uZ2Ffbm90aWZ5X2xpbmtfc3BlZWRf Y2hhbmdlX2FmdGVyX3N0YXRlX2NoYW5nZShod21nciwgaW5wdXQpOworCQlQUF9BU1NFUlRfV0lU SF9DT0RFKCgwID09IHRtcF9yZXN1bHQpLCAiRmFpbGVkIHRvIG5vdGlmeSBsaW5rIHNwZWVkIGNo YW5nZSBhZnRlciBzdGF0ZSBjaGFuZ2UhIiwgcmVzdWx0ID0gdG1wX3Jlc3VsdCk7CisJfQorCisJ cmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwcF9od21ncl9mdW5jIHRv bmdhX2h3bWdyX2Z1bmNzID0geworCS5iYWNrZW5kX2luaXQgPSAmdG9uZ2FfaHdtZ3JfYmFja2Vu ZF9pbml0LAorCS5iYWNrZW5kX2ZpbmkgPSAmdG9uZ2FfaHdtZ3JfYmFja2VuZF9maW5pLAorCS5h c2ljX3NldHVwID0gJnRvbmdhX3NldHVwX2FzaWNfdGFzaywKKwkuZHluYW1pY19zdGF0ZV9tYW5h Z2VtZW50X2VuYWJsZSA9ICZ0b25nYV9lbmFibGVfZHBtX3Rhc2tzLAorCS5hcHBseV9zdGF0ZV9h ZGp1c3RfcnVsZXMgPSB0b25nYV9hcHBseV9zdGF0ZV9hZGp1c3RfcnVsZXMsCisJLmZvcmNlX2Rw bV9sZXZlbCA9ICZ0b25nYV9mb3JjZV9kcG1fbGV2ZWwsCisJLnBvd2VyX3N0YXRlX3NldCA9IHRv bmdhX3NldF9wb3dlcl9zdGF0ZV90YXNrcywKKwkuZ2V0X3Bvd2VyX3N0YXRlX3NpemUgPSB0b25n YV9nZXRfcG93ZXJfc3RhdGVfc2l6ZSwKKwkuZ2V0X21jbGsgPSB0b25nYV9kcG1fZ2V0X21jbGss CisJLmdldF9zY2xrID0gdG9uZ2FfZHBtX2dldF9zY2xrLAorCS5wYXRjaF9ib290X3N0YXRlID0g dG9uZ2FfZHBtX3BhdGNoX2Jvb3Rfc3RhdGUsCisJLmdldF9wcF90YWJsZV9lbnRyeSA9IHRvbmdh X2dldF9wcF90YWJsZV9lbnRyeSwKKwkuZ2V0X251bV9vZl9wcF90YWJsZV9lbnRyaWVzID0gdG9u Z2FfZ2V0X251bWJlcl9vZl9wb3dlcnBsYXlfdGFibGVfZW50cmllcywKKwkucHJpbnRfY3VycmVu dF9wZXJmb3JjZV9sZXZlbCA9IHRvbmdhX3ByaW50X2N1cnJlbnRfcGVyZm9yY2VfbGV2ZWwsCit9 OworCitpbnQgdG9uZ2FfaHdtZ3JfaW5pdChzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCXRv bmdhX2h3bWdyICAqZGF0YTsKKworCWRhdGEgPSBremFsbG9jIChzaXplb2YodG9uZ2FfaHdtZ3Ip LCBHRlBfS0VSTkVMKTsKKwlpZiAoZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlt ZW1zZXQoZGF0YSwgMHgwMCwgc2l6ZW9mKHRvbmdhX2h3bWdyKSk7CisKKwlod21nci0+YmFja2Vu ZCA9IGRhdGE7CisJaHdtZ3ItPmh3bWdyX2Z1bmMgPSAmdG9uZ2FfaHdtZ3JfZnVuY3M7CisJaHdt Z3ItPnBwdGFibGVfZnVuYyA9ICZ0b25nYV9wcHRhYmxlX2Z1bmNzOworCisJcmV0dXJuIDA7Cit9 CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2h3bWdyL3Rvbmdh X2h3bWdyLmggYi9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21nci90b25nYV9od21n ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMDc3MDYKLS0tIC9kZXYv bnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21nci90b25nYV9od21n ci5oCkBAIC0wLDAgKzEsNDI3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgQWR2YW5jZWQgTWlj cm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZy ZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMg c29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2Fy ZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5j bHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1v ZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Ig c2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hv bSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUg Zm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2Ug YW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBj b3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRI RSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBL SU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRP IFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFS VElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAor ICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5Z IENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNU SU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VU IE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICog T1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworI2lmbmRlZiBUT05HQV9I V01HUl9ICisjZGVmaW5lIFRPTkdBX0hXTUdSX0gKKworI2luY2x1ZGUgImh3bWdyLmgiCisjaW5j bHVkZSAic211NzJfZGlzY3JldGUuaCIKKyNpbmNsdWRlICJwcGF0b21jdHJsLmgiCisjaW5jbHVk ZSAicHBpbnRlcnJ1cHQuaCIKKyNpbmNsdWRlICJ0b25nYV9wb3dlcnR1bmUuaCIKKworI2RlZmlu ZSBUT05HQV9NQVhfSEFSRFdBUkVfUE9XRVJMRVZFTFMgMgorI2RlZmluZSBUT05HQV9EWU5DTEtf TlVNQkVSX09GX1RSRU5EX0NPRUZGSUNJRU5UUyAxNQorCitzdHJ1Y3QgdG9uZ2FfcGVyZm9ybWFu Y2VfbGV2ZWwgeworCXVpbnQzMl90CW1lbW9yeV9jbG9jazsKKwl1aW50MzJfdAllbmdpbmVfY2xv Y2s7CisJdWludDE2X3QgICAgcGNpZV9nZW47CisJdWludDE2X3QgICAgcGNpZV9sYW5lOworfTsK Kworc3RydWN0IF9waHdfdG9uZ2FfYmFjb3MgeworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAg ICAgICAgICBiZXN0X21hdGNoOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICBi YWNvX2ZsYWdzOworCXN0cnVjdCB0b25nYV9wZXJmb3JtYW5jZV9sZXZlbAkJICBwZXJmb3JtYW5j ZV9sZXZlbDsKK307Cit0eXBlZGVmIHN0cnVjdCBfcGh3X3RvbmdhX2JhY29zIHBod190b25nYV9i YWNvczsKKworc3RydWN0IF9waHdfdG9uZ2FfdXZkX2Nsb2NrcyB7CisJdWludDMyX3QgICBWQ0xL OworCXVpbnQzMl90ICAgRENMSzsKK307CisKK3R5cGVkZWYgc3RydWN0IF9waHdfdG9uZ2FfdXZk X2Nsb2NrcyBwaHdfdG9uZ2FfdXZkX2Nsb2NrczsKKworc3RydWN0IF9waHdfdG9uZ2FfdmNlX2Ns b2NrcyB7CisJdWludDMyX3QgICBFVkNMSzsKKwl1aW50MzJfdCAgIEVDQ0xLOworfTsKKwordHlw ZWRlZiBzdHJ1Y3QgX3Bod190b25nYV92Y2VfY2xvY2tzIHBod190b25nYV92Y2VfY2xvY2tzOwor CitzdHJ1Y3QgdG9uZ2FfcG93ZXJfc3RhdGUgeworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAg ICBtYWdpYzsKKwlwaHdfdG9uZ2FfdXZkX2Nsb2NrcyAgICAgICAgdXZkX2Nsb2NrczsKKwlwaHdf dG9uZ2FfdmNlX2Nsb2NrcyAgICAgICAgdmNlX2Nsb2NrczsKKwl1aW50MzJfdCAgICAgICAgICAg ICAgICAgICAgc2FtX2NsazsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgYWNwX2NsazsK Kwl1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWFuY2VfbGV2ZWxfY291bnQ7CisJ Ym9vbCAgICAgICAgICAgICAgICAgICAgICAgIGRjX2NvbXBhdGlibGU7CisJdWludDMyX3QgICAg ICAgICAgICAgICAgICAgIHNjbGtfdGhyZXNob2xkOworCXN0cnVjdCB0b25nYV9wZXJmb3JtYW5j ZV9sZXZlbCBwZXJmb3JtYW5jZV9sZXZlbHNbVE9OR0FfTUFYX0hBUkRXQVJFX1BPV0VSTEVWRUxT XTsKK307CisKK3N0cnVjdCBfcGh3X3RvbmdhX2RwbV9sZXZlbCB7CisJYm9vbCAgCQllbmFibGVk OworCXVpbnQzMl90ICAgIHZhbHVlOworCXVpbnQzMl90ICAgIHBhcmFtMTsKK307Cit0eXBlZGVm IHN0cnVjdCBfcGh3X3RvbmdhX2RwbV9sZXZlbCBwaHdfdG9uZ2FfZHBtX2xldmVsOworCisjZGVm aW5lIFRPTkdBX01BWF9ERUVQU0xFRVBfRElWSURFUl9JRCA1CisjZGVmaW5lIE1BWF9SRUdVTEFS X0RQTV9OVU1CRVIgOAorI2RlZmluZSBUT05HQV9NSU5JTVVNX0VOR0lORV9DTE9DSyAyNTAwCisK K3N0cnVjdCB0b25nYV9zaW5nbGVfZHBtX3RhYmxlIHsKKwl1aW50MzJfdCBjb3VudDsKKwlwaHdf dG9uZ2FfZHBtX2xldmVsIGRwbV9sZXZlbHNbTUFYX1JFR1VMQVJfRFBNX05VTUJFUl07Cit9Owor CitzdHJ1Y3QgdG9uZ2FfZHBtX3RhYmxlIHsKKwlzdHJ1Y3QgdG9uZ2Ffc2luZ2xlX2RwbV90YWJs ZSAgc2Nsa190YWJsZTsKKwlzdHJ1Y3QgdG9uZ2Ffc2luZ2xlX2RwbV90YWJsZSAgbWNsa190YWJs ZTsKKwlzdHJ1Y3QgdG9uZ2Ffc2luZ2xlX2RwbV90YWJsZSAgcGNpZV9zcGVlZF90YWJsZTsKKwlz dHJ1Y3QgdG9uZ2Ffc2luZ2xlX2RwbV90YWJsZSAgdmRkY190YWJsZTsKKwlzdHJ1Y3QgdG9uZ2Ff c2luZ2xlX2RwbV90YWJsZSAgdmRkX2dmeF90YWJsZTsKKwlzdHJ1Y3QgdG9uZ2Ffc2luZ2xlX2Rw bV90YWJsZSAgdmRkX2NpX3RhYmxlOworCXN0cnVjdCB0b25nYV9zaW5nbGVfZHBtX3RhYmxlICBt dmRkX3RhYmxlOworfTsKK3R5cGVkZWYgc3RydWN0IF9waHdfdG9uZ2FfZHBtX3RhYmxlIHBod190 b25nYV9kcG1fdGFibGU7CisKKworc3RydWN0IF9waHdfdG9uZ2FfY2xvY2tfcmVnaXNpdGVycyB7 CisJdWludDMyX3QgIHZDR19TUExMX0ZVTkNfQ05UTDsKKwl1aW50MzJfdCAgdkNHX1NQTExfRlVO Q19DTlRMXzI7CisJdWludDMyX3QgIHZDR19TUExMX0ZVTkNfQ05UTF8zOworCXVpbnQzMl90ICB2 Q0dfU1BMTF9GVU5DX0NOVExfNDsKKwl1aW50MzJfdCAgdkNHX1NQTExfU1BSRUFEX1NQRUNUUlVN OworCXVpbnQzMl90ICB2Q0dfU1BMTF9TUFJFQURfU1BFQ1RSVU1fMjsKKwl1aW50MzJfdCAgdkRM TF9DTlRMOworCXVpbnQzMl90ICB2TUNMS19QV1JNR1RfQ05UTDsKKwl1aW50MzJfdCAgdk1QTExf QURfRlVOQ19DTlRMOworCXVpbnQzMl90ICB2TVBMTF9EUV9GVU5DX0NOVEw7CisJdWludDMyX3Qg IHZNUExMX0ZVTkNfQ05UTDsKKwl1aW50MzJfdCAgdk1QTExfRlVOQ19DTlRMXzE7CisJdWludDMy X3QgIHZNUExMX0ZVTkNfQ05UTF8yOworCXVpbnQzMl90ICB2TVBMTF9TUzE7CisJdWludDMyX3Qg IHZNUExMX1NTMjsKK307Cit0eXBlZGVmIHN0cnVjdCBfcGh3X3RvbmdhX2Nsb2NrX3JlZ2lzaXRl cnMgcGh3X3RvbmdhX2Nsb2NrX3JlZ2lzdGVyczsKKworc3RydWN0IF9waHdfdG9uZ2Ffdm9sdGFn ZV9zbWlvX3JlZ2lzdGVycyB7CisJdWludDMyX3QgdnMwX3ZpZF9sb3dlcl9zbWlvX2NudGw7Cit9 OwordHlwZWRlZiBzdHJ1Y3QgX3Bod190b25nYV92b2x0YWdlX3NtaW9fcmVnaXN0ZXJzIHBod190 b25nYV92b2x0YWdlX3NtaW9fcmVnaXN0ZXJzOworCisKK3N0cnVjdCBfcGh3X3RvbmdhX21jX3Jl Z19lbnRyeSB7CisJdWludDMyX3QgbWNsa19tYXg7CisJdWludDMyX3QgbWNfZGF0YVtTTVU3Ml9E SVNDUkVURV9NQ19SRUdJU1RFUl9BUlJBWV9TSVpFXTsKK307Cit0eXBlZGVmIHN0cnVjdCBfcGh3 X3RvbmdhX21jX3JlZ19lbnRyeSBwaHdfdG9uZ2FfbWNfcmVnX2VudHJ5OworCitzdHJ1Y3QgX3Bo d190b25nYV9tY19yZWdfdGFibGUgeworCXVpbnQ4X3QgICBsYXN0OyAgICAgICAgICAgICAgIC8q IG51bWJlciBvZiByZWdpc3RlcnMqLworCXVpbnQ4X3QgICBudW1fZW50cmllczsgICAgICAgIC8q IG51bWJlciBvZiBlbnRyaWVzIGluIG1jX3JlZ190YWJsZV9lbnRyeSB1c2VkKi8KKwl1aW50MTZf dCAgdmFsaWRmbGFnOyAgICAgICAgICAvKiBpbmRpY2F0ZSB0aGUgY29ycmVzcG9uZGluZyByZWdp c3RlciBpcyB2YWxpZCBvciBub3QuIDE6IHZhbGlkLCAwOiBpbnZhbGlkLiBiaXQwLT5hZGRyZXNz WzBdLCBiaXQxLT5hZGRyZXNzWzFdLCBldGMuKi8KKwlwaHdfdG9uZ2FfbWNfcmVnX2VudHJ5ICAg IG1jX3JlZ190YWJsZV9lbnRyeVtNQVhfQUNfVElNSU5HX0VOVFJJRVNdOworCVNNVTcyX0Rpc2Ny ZXRlX01DUmVnaXN0ZXJBZGRyZXNzIG1jX3JlZ19hZGRyZXNzW1NNVTcyX0RJU0NSRVRFX01DX1JF R0lTVEVSX0FSUkFZX1NJWkVdOworfTsKK3R5cGVkZWYgc3RydWN0IF9waHdfdG9uZ2FfbWNfcmVn X3RhYmxlIHBod190b25nYV9tY19yZWdfdGFibGU7CisKKyNkZWZpbmUgRElTQUJMRV9NQ19MT0FE TUlDUk9DT0RFICAgMQorI2RlZmluZSBESVNBQkxFX01DX0NGR1BST0dSQU1NSU5HICAyCisKKy8q VWx0cmEgTG93IFZvbHRhZ2UgcGFyYW1ldGVyIHN0cnVjdHVyZSAqLworc3RydWN0IF9waHdfdG9u Z2FfdWx2X3Bhcm17CisJYm9vbAl1bHZfc3VwcG9ydGVkOworCXVpbnQzMl90ICAgY2hfdWx2X3Bh cmFtZXRlcjsKKwl1aW50MzJfdCAgIHVsdl92b2x0X2NoYW5nZV9kZWxheTsKKwlzdHJ1Y3QgdG9u Z2FfcGVyZm9ybWFuY2VfbGV2ZWwgICB1bHZfcG93ZXJfbGV2ZWw7Cit9OwordHlwZWRlZiBzdHJ1 Y3QgX3Bod190b25nYV91bHZfcGFybSBwaHdfdG9uZ2FfdWx2X3Bhcm07CisKKyNkZWZpbmUgVE9O R0FfTUFYX0xFQUtBR0VfQ09VTlQgIDgKKworc3RydWN0IF9waHdfdG9uZ2FfbGVha2FnZV92b2x0 YWdlIHsKKwl1aW50MTZfdCAgY291bnQ7CisJdWludDE2X3QgIGxlYWthZ2VfaWRbVE9OR0FfTUFY X0xFQUtBR0VfQ09VTlRdOworCXVpbnQxNl90ICBhY3R1YWxfdm9sdGFnZVtUT05HQV9NQVhfTEVB S0FHRV9DT1VOVF07Cit9OwordHlwZWRlZiBzdHJ1Y3QgX3Bod190b25nYV9sZWFrYWdlX3ZvbHRh Z2UgcGh3X3RvbmdhX2xlYWthZ2Vfdm9sdGFnZTsKKworc3RydWN0IF9waHdfdG9uZ2FfZGlzcGxh eV90aW1pbmcgeworCXVpbnQzMl90IG1pbl9jbG9ja19pbnNyOworCXVpbnQzMl90IG51bV9leGlz dGluZ19kaXNwbGF5czsKK307Cit0eXBlZGVmIHN0cnVjdCBfcGh3X3RvbmdhX2Rpc3BsYXlfdGlt aW5nIHBod190b25nYV9kaXNwbGF5X3RpbWluZzsKKworc3RydWN0IF9waHdfdG9uZ2FfZHBtbGV2 ZWxfZW5hYmxlX21hc2sgeworCXVpbnQzMl90IHV2ZF9kcG1fZW5hYmxlX21hc2s7CisJdWludDMy X3QgdmNlX2RwbV9lbmFibGVfbWFzazsKKwl1aW50MzJfdCBhY3BfZHBtX2VuYWJsZV9tYXNrOwor CXVpbnQzMl90IHNhbXVfZHBtX2VuYWJsZV9tYXNrOworCXVpbnQzMl90IHNjbGtfZHBtX2VuYWJs ZV9tYXNrOworCXVpbnQzMl90IG1jbGtfZHBtX2VuYWJsZV9tYXNrOworCXVpbnQzMl90IHBjaWVf ZHBtX2VuYWJsZV9tYXNrOworfTsKK3R5cGVkZWYgc3RydWN0IF9waHdfdG9uZ2FfZHBtbGV2ZWxf ZW5hYmxlX21hc2sgcGh3X3RvbmdhX2RwbWxldmVsX2VuYWJsZV9tYXNrOworCitzdHJ1Y3QgX3Bo d190b25nYV9wY2llX3BlcmZfcmFuZ2UgeworCXVpbnQxNl90IG1heDsKKwl1aW50MTZfdCBtaW47 Cit9OwordHlwZWRlZiBzdHJ1Y3QgX3Bod190b25nYV9wY2llX3BlcmZfcmFuZ2UgcGh3X3Rvbmdh X3BjaWVfcGVyZl9yYW5nZTsKKworc3RydWN0IF9waHdfdG9uZ2FfdmJpb3NfYm9vdF9zdGF0ZSB7 CisJdWludDE2X3QJCQkJCW12ZGRfYm9vdHVwX3ZhbHVlOworCXVpbnQxNl90CQkJCQl2ZGRjX2Jv b3R1cF92YWx1ZTsKKwl1aW50MTZfdAkJCQkJdmRkY2lfYm9vdHVwX3ZhbHVlOworCXVpbnQxNl90 CQkJCQl2ZGRnZnhfYm9vdHVwX3ZhbHVlOworCXVpbnQzMl90CQkJCQlzY2xrX2Jvb3R1cF92YWx1 ZTsKKwl1aW50MzJfdAkJCQkJbWNsa19ib290dXBfdmFsdWU7CisJdWludDE2X3QJCQkJCXBjaWVf Z2VuX2Jvb3R1cF92YWx1ZTsKKwl1aW50MTZfdAkJCQkJcGNpZV9sYW5lX2Jvb3R1cF92YWx1ZTsK K307Cit0eXBlZGVmIHN0cnVjdCBfcGh3X3RvbmdhX3ZiaW9zX2Jvb3Rfc3RhdGUgcGh3X3Rvbmdh X3ZiaW9zX2Jvb3Rfc3RhdGU7CisKKyNkZWZpbmUgRFBNVEFCTEVfT0RfVVBEQVRFX1NDTEsgICAg IDB4MDAwMDAwMDEKKyNkZWZpbmUgRFBNVEFCTEVfT0RfVVBEQVRFX01DTEsgICAgIDB4MDAwMDAw MDIKKyNkZWZpbmUgRFBNVEFCTEVfVVBEQVRFX1NDTEsgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZp bmUgRFBNVEFCTEVfVVBEQVRFX01DTEsgICAgICAgIDB4MDAwMDAwMDgKKworLyogV2UgbmVlZCB0 byByZXZpZXcgd2hpY2ggZmllbGRzIGFyZSBuZWVkZWQuICovCisvKiBUaGlzIGlzIG1vc3RseSBh IGNvcHkgb2YgdGhlIFJWN3h4L0V2ZXJncmVlbiBzdHJ1Y3R1cmUgd2hpY2ggaXMgY2xvc2UsIGJ1 dCBub3QgaWRlbnRpY2FsIHRvIHRoZSBOLklzbGFuZHMgb25lLiAqLworc3RydWN0IHRvbmdhX2h3 bWdyIHsKKwlzdHJ1Y3QgdG9uZ2FfZHBtX3RhYmxlICAgICAgICAgICAgICAgZHBtX3RhYmxlOwor CXN0cnVjdCB0b25nYV9kcG1fdGFibGUgICAgICAgICAgICAgICBnb2xkZW5fZHBtX3RhYmxlOwor CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3RpbmdfcmlnaHRzX2NsaWVu dHMwOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgdm90aW5nX3JpZ2h0c19j bGllbnRzMTsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvdGluZ19yaWdo dHNfY2xpZW50czI7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3Rpbmdf cmlnaHRzX2NsaWVudHMzOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgdm90 aW5nX3JpZ2h0c19jbGllbnRzNDsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAg IHZvdGluZ19yaWdodHNfY2xpZW50czU7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAg ICAgICB2b3RpbmdfcmlnaHRzX2NsaWVudHM2OworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAg ICAgICAgICAgdm90aW5nX3JpZ2h0c19jbGllbnRzNzsKKwl1aW50MzJfdCAgICAgICAgICAgICAg ICAgICAgICAgICAgIHN0YXRpY19zY3JlZW5fdGhyZXNob2xkX3VuaXQ7CisJdWludDMyX3QgICAg ICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfc2NyZWVuX3RocmVzaG9sZDsKKwl1aW50MzJf dCAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHRhZ2VfY29udHJvbDsKKwl1aW50MzJfdCAg ICAgICAgICAgICAgICAgICAgICAgICAgIHZkZF9nZnhfY29udHJvbDsKKworCXVpbnQzMl90ICAg ICAgICAgICAgICAgICAgICAgICAgICAgdmRkY192ZGRjaV9kZWx0YTsKKwl1aW50MzJfdCAgICAg ICAgICAgICAgICAgICAgICAgICAgIHZkZGNfdmRkZ2Z4X2RlbHRhOworCisJcHBfaW50ZXJydXB0 X3JlZ2lzdHJhdGlvbl9pbmZvICAgIGludGVybmFsX2hpZ2hfdGhlcm1hbF9pbnRlcnJ1cHRfaW5m bzsKKwlwcF9pbnRlcnJ1cHRfcmVnaXN0cmF0aW9uX2luZm8gICAgaW50ZXJuYWxfbG93X3RoZXJt YWxfaW50ZXJydXB0X2luZm87CisJcHBfaW50ZXJydXB0X3JlZ2lzdHJhdGlvbl9pbmZvICAgIHNt Y190b19ob3N0X2ludGVycnVwdF9pbmZvOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAg ICAgICBhY3RpdmVfYXV0b190aHJvdHRsZV9zb3VyY2VzOworCisJcHBfaW50ZXJydXB0X3JlZ2lz dHJhdGlvbl9pbmZvICAgIGV4dGVybmFsX3Rocm90dGxlX2ludGVycnVwdDsKKwlwcF9pbnRlcnJ1 cHRfY2FsbGJhY2sgICAgICAgICAgICAgZXh0ZXJuYWxfdGhyb3R0bGVfY2FsbGJhY2s7CisJdm9p ZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4dGVybmFsX3Rocm90dGxlX2NvbnRleHQ7 CisKKwlwcF9pbnRlcnJ1cHRfcmVnaXN0cmF0aW9uX2luZm8gICAgY3RmX2ludGVycnVwdF9pbmZv OworCXBwX2ludGVycnVwdF9jYWxsYmFjayAgICAgICAgICAgICBjdGZfY2FsbGJhY2s7CisJdm9p ZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmN0Zl9jb250ZXh0OworCisJcGh3X3Rvbmdh X2Nsb2NrX3JlZ2lzdGVycyAgICAgIAkgIGNsb2NrX3JlZ2lzdGVyczsKKwlwaHdfdG9uZ2Ffdm9s dGFnZV9zbWlvX3JlZ2lzdGVycyAgdm9sdGFnZV9zbWlvX3JlZ2lzdGVyczsKKworCWJvb2wgICAg ICAgICAgICAgICAgICAgICAgICAgCWlzX21lbW9yeV9HRERSNTsKKwl1aW50MTZfdCAgICAgICAg ICAgICAgICAgICAgICAgICAgYWNwaV92ZGRjOworCWJvb2wgICAgICAgICAgICAgICAgICAgICAg ICAgCXBzcHBfbm90aWZ5X3JlcXVpcmVkOyAgICAgICAgLyogRmxhZyB0byBpbmRpY2F0ZSBpZiBQ U1BQIG5vdGlmaWNhdGlvbiB0byBTQklPUyBpcyByZXF1aXJlZCAqLworCXVpbnQxNl90ICAgICAg ICAgICAgICAgICAgICAgICAgICBmb3JjZV9wY2llX2dlbjsgICAgICAgICAgICAvKiBUaGUgZm9y Y2VkIFBDSS1FIHNwZWVkIGlmIG5vdCAweGZmZmYgKi8KKwl1aW50MTZfdCAgICAgICAgICAgICAg ICAgICAgICAgICAgYWNwaV9wY2llX2dlbjsgICAgICAgICAgICAgLyogVGhlIFBDSS1FIHNwZWVk IGF0IEFDUEkgdGltZSAqLworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNp ZV9nZW5fY2FwOyAgICAgICAgICAgICAvKiBUaGUgUENJLUUgc3BlZWQgY2FwYWJpbGl0aWVzIGJp dG1hcCBmcm9tIENBSUwgKi8KKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHBj aWVfbGFuZV9jYXA7ICAgICAgICAgICAgLyogVGhlIFBDSS1FIGxhbmUgY2FwYWJpbGl0aWVzIGJp dG1hcCBmcm9tIENBSUwgKi8KKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHBj aWVfc3BjX2NhcDsgICAgICAgICAgICAgLyogU3ltYm9sIFBlciBDbG9jayBDYXBhYmlsaXRpZXMg ZnJvbSByZWdpc3RyeSAqLworCXBod190b25nYV9sZWFrYWdlX3ZvbHRhZ2UgICAgICAgCXZkZGNf bGVha2FnZTsgICAgICAgICAgICAvKiBUaGUgTGVha2FnZSBWRERDIHN1cHBvcnRlZCAoYmFzZWQg b24gbGVha2FnZSBJRCkuKi8KKwlwaHdfdG9uZ2FfbGVha2FnZV92b2x0YWdlICAgICAgIAl2ZGRj Z2Z4X2xlYWthZ2U7ICAgICAgICAgLyogVGhlIExlYWthZ2UgVkREQyBzdXBwb3J0ZWQgKGJhc2Vk IG9uIGxlYWthZ2UgSUQpLiAqLworCXBod190b25nYV9sZWFrYWdlX3ZvbHRhZ2UgICAgICAgCXZk ZGNpX2xlYWthZ2U7ICAgICAgICAgICAvKiBUaGUgTGVha2FnZSBWRERDSSBzdXBwb3J0ZWQgKGJh c2VkIG9uIGxlYWthZ2UgSUQpLiAqLworCisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAg ICAgICBtdmRkX2NvbnRyb2w7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICB2 ZGRjX21hc2tfbG93OworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZkZF9t YXNrX2xvdzsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3ZkZGNfaW5f cHBfdGFibGU7ICAgICAgICAvKiB0aGUgbWF4aW11bSBWRERDIHZhbHVlIGluIHRoZSBwb3dlcnBs YXkgdGFibGUqLworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fdmRkY19p bl9wcF90YWJsZTsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3ZkZGNp X2luX3BwX3RhYmxlOyAgICAgICAvKiB0aGUgbWF4aW11bSBWRERDSSB2YWx1ZSBpbiB0aGUgcG93 ZXJwbGF5IHRhYmxlICovCisJdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl92 ZGRjaV9pbl9wcF90YWJsZTsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1j bGtfc3Ryb2JlX21vZGVfdGhyZXNob2xkOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAg ICAgICAgbWNsa19zdHV0dGVyX21vZGVfdGhyZXNob2xkOworCXVpbnQzMl90ICAgICAgICAgICAg ICAgICAgICAgICAgICAgbWNsa19lZGNfZW5hYmxlX3RocmVzaG9sZDsKKwl1aW50MzJfdCAgICAg ICAgICAgICAgICAgICAgICAgICAgIG1jbGtfZWRjX3dyX2VuYWJsZV90aHJlc2hvbGQ7CisJYm9v bCAgICAgICAgICAgICAgICAgICAgICAgICAJaXNfdXZkX2VuYWJsZWQ7CisJYm9vbCAgICAgICAg ICAgICAgICAgICAgICAgICAJaXNfeGRtYV9lbmFibGVkOworCXBod190b25nYV92Ymlvc19ib290 X3N0YXRlICAgICAgdmJpb3NfYm9vdF9zdGF0ZTsKKworCWJvb2wgICAgICAgICAgICAgICAgICAg ICAgICAgYmF0dGVyeV9zdGF0ZTsKKwlib29sICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3Rs dV9lbmFibGVkOworCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgcGNpZV9wZXJmb3JtYW5j ZV9yZXF1ZXN0OworCisJLyogLS0tLS0tLS0tLS0tLS0gU01DIFNSQU0gQWRkcmVzcyBvZiBmaXJt d2FyZSBoZWFkZXIgdGFibGVzIC0tLS0tLS0tLS0tLS0tLS0qLworCXVpbnQzMl90ICAgICAgICAg ICAgICAgICAgICAgICAgICAgc3JhbV9lbmQ7ICAgICAgICAgICAgICAgICAvKiBUaGUgZmlyc3Qg YWRkcmVzcyBhZnRlciB0aGUgU01DIFNSQU0uICovCisJdWludDMyX3QgICAgICAgICAgICAgICAg ICAgICAgICAgICBkcG1fdGFibGVfc3RhcnQ7ICAgICAgICAgIC8qIFRoZSBzdGFydCBvZiB0aGUg ZHBtIHRhYmxlIGluIHRoZSBTTUMgU1JBTS4gKi8KKwl1aW50MzJfdCAgICAgICAgICAgICAgICAg ICAgICAgICAgIHNvZnRfcmVnc19zdGFydDsgICAgICAgICAgLyogVGhlIHN0YXJ0IG9mIHRoZSBz b2Z0IHJlZ2lzdGVycyBpbiB0aGUgU01DIFNSQU0uICovCisJdWludDMyX3QgICAgICAgICAgICAg ICAgICAgICAgICAgICBtY19yZWdfdGFibGVfc3RhcnQ7ICAgICAgIC8qIFRoZSBzdGFydCBvZiB0 aGUgbWMgcmVnaXN0ZXIgdGFibGUgaW4gdGhlIFNNQyBTUkFNLiAqLworCXVpbnQzMl90ICAgICAg ICAgICAgICAgICAgICAgICAgICAgZmFuX3RhYmxlX3N0YXJ0OyAgICAgICAgICAvKiBUaGUgc3Rh cnQgb2YgdGhlIGZhbiB0YWJsZSBpbiB0aGUgU01DIFNSQU0uICovCisJdWludDMyX3QgICAgICAg ICAgICAgICAgICAgICAgICAgICBhcmJfdGFibGVfc3RhcnQ7ICAgICAgICAgIC8qIFRoZSBzdGFy dCBvZiB0aGUgQVJCIHNldHRpbmcgdGFibGUgaW4gdGhlIFNNQyBTUkFNLiAqLworCVNNVTcyX0Rp c2NyZXRlX0RwbVRhYmxlICAgICAgICAgc21jX3N0YXRlX3RhYmxlOyAgICAgICAgICAgICAvKiBU aGUgY2FyYm9uIGNvcHkgb2YgdGhlIFNNQyBzdGF0ZSB0YWJsZS4gKi8KKwlTTVU3Ml9EaXNjcmV0 ZV9NQ1JlZ2lzdGVycyAgICAgIG1jX3JlZ190YWJsZTsKKwlTTVU3Ml9EaXNjcmV0ZV9VbHYgICAg ICAgICAgICAgIHVsdl9zZXR0aW5nOyAgICAgICAgICAgICAgICAgLyogVGhlIGNhcmJvbiBjb3B5 IG9mIFVMViBzZXR0aW5nLiAqLworCS8qIC0tLS0tLS0tLS0tLS0tIFN0dWZmIG9yaWdpbmFsbHkg Y29taW5nIGZyb20gRXZlcmdyZWVuIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlwaHdfdG9uZ2Ff bWNfcmVnX3RhYmxlCQkJdG9uZ2FfbWNfcmVnX3RhYmxlOworCXVpbnQzMl90ICAgICAgICAgICAg ICAgICAgICAgICAgIHZkZF9jaV9jb250cm9sOworCXBwX2F0b21jdHJsX3ZvbHRhZ2VfdGFibGUg ICAgICAgIHZkZGNfdm9sdGFnZV90YWJsZTsKKwlwcF9hdG9tY3RybF92b2x0YWdlX3RhYmxlICAg ICAgICB2ZGRjaV92b2x0YWdlX3RhYmxlOworCXBwX2F0b21jdHJsX3ZvbHRhZ2VfdGFibGUgICAg ICAgIHZkZGdmeF92b2x0YWdlX3RhYmxlOworCXBwX2F0b21jdHJsX3ZvbHRhZ2VfdGFibGUgICAg ICAgIG12ZGRfdm9sdGFnZV90YWJsZTsKKworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAg ICAgICAgbWdjZ19jZ3R0X2xvY2FsMjsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAg ICAgIG1nY2dfY2d0dF9sb2NhbDM7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAg ICBncGlvX2RlYnVnOworCXVpbnQzMl90CQkJCQkJCW1jX21pY3JvX2NvZGVfZmVhdHVyZTsKKwl1 aW50MzJfdAkJCQkJCQloaWdoZXN0X21jbGs7CisJdWludDE2X3QgICAgICAgICAgICAgICAgICAg ICAgICAgIGFjcGlfdmRkX2NpOworCXVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgICAgICBt dmRkX2hpZ2hfaW5kZXg7CisJdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG12ZGRf bG93X2luZGV4OworCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgZGxsX2RlZmF1bGVfb247 CisJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZV9yZXF1ZXN0X3JlZ2lz dGVyZWQ7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLSBMb3cgUG93ZXIgRmVhdHVyZXMgLS0tLS0t LS0tLS0tLS0tLS0tLS0tKi8KKwlwaHdfdG9uZ2FfYmFjb3MJCQkJCWJhY29zOworCXBod190b25n YV91bHZfcGFybSAgICAgICAgICAgICAgdWx2OworCS8qIC0tLS0tLS0tLS0tLS0tLS0tIENBQyBT dHVmZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXVpbnQzMl90CQkJCQljYWNfdGFibGVfc3Rh cnQ7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICBjYWNfY29uZmlndXJhdGlvbl9yZXF1 aXJlZDsgICAgLyogVFJVRSBpZiBQUF9DQUNDb25maWd1cmF0aW9uUmVxdWlyZWQgPT0gMSAqLwor CWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyX2NhbGN1bGF0ZV9jYWNfbGVha2Fn ZTsgIC8qIFRSVUUgaWYgUFBfRHJpdmVyQ2FsY3VsYXRlQ0FDTGVha2FnZSA9PSAxICovCisJYm9v bCAgICAgICAgICAgICAgICAgICAgICAgICBjYWNfZW5hYmxlZDsKKwkvKiAtLS0tLS0tLS0tLS0t LS0tLSBEUE0yIFBhcmFtZXRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwl1aW50MzJfdAkJ CQkJcG93ZXJfY29udGFpbm1lbnRfZmVhdHVyZXM7CisJYm9vbCAgICAgICAgICAgICAgICAgICAg ICAgICBlbmFibGVfYmFwbV9mZWF0dXJlOworCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAg ZW5hYmxlX3RkY19saW1pdF9mZWF0dXJlOworCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAg ZW5hYmxlX3BrZ19wd3JfdHJhY2tpbmdfZmVhdHVyZTsKKwlib29sICAgICAgICAgICAgICAgICAg ICAgICAgIGRpc2FibGVfdXZkX3Bvd2VyX3R1bmVfZmVhdHVyZTsKKwlwaHdfdG9uZ2FfcHRfZGVm YXVsdHMgICAgICAgICAgICpwb3dlcl90dW5lX2RlZmF1bHRzOworCVNNVTcyX0Rpc2NyZXRlX1Bt RnVzZXMgICAgICAgICAgIHBvd2VyX3R1bmVfdGFibGU7CisJdWludDMyX3QgICAgICAgICAgICAg ICAgICAgICAgICAgICB1bF9kdGVfdGpfb2Zmc2V0OyAgICAgICAgICAgICAvKiBGdWRnZSBmYWN0 b3IgaW4gRFBNIHRhYmxlIHRvIGNvcnJlY3QgSFcgRFRFIGVycm9ycyAqLworCXVpbnQzMl90ICAg ICAgICAgICAgICAgICAgICAgICAgICAgZmFzdF93YXRlbWFya190aHJlc2hvbGQ7ICAgICAgLyog dXNlIGZhc3Qgd2F0ZXJtYXJrIGlmIGNsb2NrIGlzIGVxdWFsIG9yIGFib3ZlIHRoaXMuIEluIHBl cmNlbnRhZ2Ugb2YgdGhlIHRhcmdldCBoaWdoIHNjbGsuICovCisKKwkvKiAtLS0tLS0tLS0tLS0t LS0tLSBQaGFzZSBTaGVkZGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWJvb2wgICAgICAg ICAgICAgICAgICAgICAgICAgdmRkY19waGFzZV9zaGVkX2NvbnRyb2w7CisJLyogLS0tLS0tLS0t LS0tLS0tLS0tLS0tIERJL0RUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlwaHdfdG9u Z2FfZGlzcGxheV90aW1pbmcgICAgICAgZGlzcGxheV90aW1pbmc7CisJLyogLS0tLS0tLS0tIFJl YWRSZWdpc3RyeSBkYXRhIGZvciBtZW1vcnkgYW5kIGVuZ2luZSBjbG9jayBtYXJnaW5zIC0tLS0g Ki8KKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZV9jbG9ja19kYXRh OworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X2Nsb2NrX2RhdGE7 CisJLyogLS0tLS0tLS0gVGhlcm1hbCBUZW1wZXJhdHVyZSBTZXR0aW5nIC0tLS0tLS0tLS0tLS0t Ki8KKwlwaHdfdG9uZ2FfZHBtbGV2ZWxfZW5hYmxlX21hc2sgICAgIGRwbV9sZXZlbF9lbmFibGVf bWFzazsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfdXBkYXRlX3Nt dTdfZHBtX3RhYmxlOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nsa19k cG1fa2V5X2Rpc2FibGVkOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbWNs a19kcG1fa2V5X2Rpc2FibGVkOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAg cGNpZV9kcG1fa2V5X2Rpc2FibGVkOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAg ICAgbWluX2VuZ2luZV9jbG9ja3M7IC8qIHVzZWQgdG8gc3RvcmUgdGhlIHByZXZpb3VzIGRhbCBt aW4gc2Nsb2NrICovCisJcGh3X3RvbmdhX3BjaWVfcGVyZl9yYW5nZSAgICAgICBwY2llX2dlbl9w ZXJmb3JtYW5jZTsKKwlwaHdfdG9uZ2FfcGNpZV9wZXJmX3JhbmdlICAgICAgIHBjaWVfbGFuZV9w ZXJmb3JtYW5jZTsKKwlwaHdfdG9uZ2FfcGNpZV9wZXJmX3JhbmdlICAgICAgIHBjaWVfZ2VuX3Bv d2VyX3NhdmluZzsKKwlwaHdfdG9uZ2FfcGNpZV9wZXJmX3JhbmdlICAgICAgIHBjaWVfbGFuZV9w b3dlcl9zYXZpbmc7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfcGNpZV9w ZXJmb3JtYW5jZV9sZXZlbHM7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vf cGNpZV9wb3dlcl9zYXZpbmdfbGV2ZWxzOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAg ICAgICAgYWN0aXZpdHlfdGFyZ2V0W1NNVTcyX01BWF9MRVZFTFNfR1JBUEhJQ1NdOyAvKiBwZXJj ZW50YWdlIHZhbHVlIGZyb20gMC0xMDAsIGRlZmF1bHQgNTAgKi8KKwl1aW50MzJfdCAgICAgICAg ICAgICAgICAgICAgICAgICAgIG1jbGtfYWN0aXZpdHlfdGFyZ2V0OworCXVpbnQzMl90ICAgICAg ICAgICAgICAgICAgICAgICAgICAgbG93X3NjbGtfaW50ZXJydXB0X3RocmVzaG9sZDsKKwl1aW50 MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfbWNsa19kcG1fZW5hYmxlX21hc2s7 CisJYm9vbAkJCQkJCQkJdXZkX2VuYWJsZWQ7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAg ICAgICAgICBwY2NfbW9uaXRvcl9lbmFibGVkOworCisJLyogLS0tLS0tLS0tIFBvd2VyIEdhdGlu ZyBTdGF0ZXMgLS0tLS0tLS0tLS0tKi8KKwlib29sICAgICAgICAgICAgICAgICAgICAgICAgICAg dXZkX3Bvd2VyX2dhdGVkOyAgLyogMTogZ2F0ZWQsIDA6bm90IGdhdGVkICovCisJYm9vbCAgICAg ICAgICAgICAgICAgICAgICAgICAgIHZjZV9wb3dlcl9nYXRlZDsgIC8qIDE6IGdhdGVkLCAwOm5v dCBnYXRlZCAqLworCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW11X3Bvd2VyX2dh dGVkOyAvKiAxOiBnYXRlZCwgMDpub3QgZ2F0ZWQgKi8KKwlib29sICAgICAgICAgICAgICAgICAg ICAgICAgICAgYWNwX3Bvd2VyX2dhdGVkOyAgLyogMTogZ2F0ZWQsIDA6bm90IGdhdGVkICovCisJ Ym9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2FjcF9pbml0OworCit9OworCit0eXBl ZGVmIHN0cnVjdCB0b25nYV9od21nciB0b25nYV9od21ncjsKKworI2RlZmluZSBUT05HQV9EUE0y X05FQVJfVERQX0RFQyAgICAgICAgICAxMAorI2RlZmluZSBUT05HQV9EUE0yX0FCT1ZFX1NBRkVf SU5DICAgICAgICA1CisjZGVmaW5lIFRPTkdBX0RQTTJfQkVMT1dfU0FGRV9JTkMgICAgICAgIDIw CisKKyNkZWZpbmUgVE9OR0FfRFBNMl9MVEFfV0lORE9XX1NJWkUgICAgICAgNyAgLyogTG9nMiBv ZiB0aGUgTFRBIHdpbmRvdyBzaXplIChsMm51bVdpbl9URFApLiBFZy4gSWYgTFRBIHdpbmRvd3Mg c2l6ZSBpcyAxMjgsIHRoZW4gdGhpcyB2YWx1ZSBzaG91bGQgYmUgTG9nMigxMjgpID0gNy4gKi8K KworI2RlZmluZSBUT05HQV9EUE0yX0xUU19UUlVOQ0FURSAgICAgICAgICAwCisKKyNkZWZpbmUg VE9OR0FfRFBNMl9URFBfU0FGRV9MSU1JVF9QRVJDRU5UICAgICAgICAgICAgODAgIC8qIE1heGlt dW0gMTAwICovCisKKyNkZWZpbmUgVE9OR0FfRFBNMl9NQVhQU19QRVJDRU5UX0ggICAgICAgICAg ICAgICAgICAgOTAgIC8qIE1heGltdW0gMHhGRiAqLworI2RlZmluZSBUT05HQV9EUE0yX01BWFBT X1BFUkNFTlRfTSAgICAgICAgICAgICAgICAgICA5MCAgLyogTWF4aW11bSAweEZGICovCisKKyNk ZWZpbmUgVE9OR0FfRFBNMl9QV1JFRkZJQ0lFTkNZUkFUSU9fTUFSR0lOICAgICAgICAgNTAKKwor I2RlZmluZSBUT05HQV9EUE0yX1NRX1JBTVBfTUFYX1BPV0VSICAgICAgICAgICAgICAgICAweDNG RkYKKyNkZWZpbmUgVE9OR0FfRFBNMl9TUV9SQU1QX01JTl9QT1dFUiAgICAgICAgICAgICAgICAg MHgxMgorI2RlZmluZSBUT05HQV9EUE0yX1NRX1JBTVBfTUFYX1BPV0VSX0RFTFRBICAgICAgICAg ICAweDE1CisjZGVmaW5lIFRPTkdBX0RQTTJfU1FfUkFNUF9TSE9SVF9URVJNX0lOVEVSVkFMX1NJ WkUgIDB4MUUKKyNkZWZpbmUgVE9OR0FfRFBNMl9TUV9SQU1QX0xPTkdfVEVSTV9JTlRFUlZBTF9S QVRJTyAgMHhGCisKKyNkZWZpbmUgVE9OR0FfVk9MVEFHRV9DT05UUk9MX05PTkUgICAgICAgICAg ICAgICAgICAgMHgwCisjZGVmaW5lIFRPTkdBX1ZPTFRBR0VfQ09OVFJPTF9CWV9HUElPICAgICAg ICAgICAgICAgIDB4MQorI2RlZmluZSBUT05HQV9WT0xUQUdFX0NPTlRST0xfQllfU1ZJRDIgICAg ICAgICAgICAgICAweDIKKyNkZWZpbmUgVE9OR0FfVk9MVEFHRV9DT05UUk9MX01FUkdFRCAgICAg ICAgICAgICAgICAgMHgzCisKKyNkZWZpbmUgVE9OR0FfUTg4X0ZPUk1BVF9DT05WRVJTSU9OX1VO SVQgICAgICAgICAgICAgMjU2IC8qVG8gY29udmVydCB0byBROC44IGZvcm1hdCBmb3IgZmlybXdh cmUgKi8KKworI2RlZmluZSBUT05HQV9VTlVTRURfR1BJT19QSU4gICAgICAgICAgICAgICAgICAg ICAgICAweDdGCisKKy8qIEZvbGxvd2luZyBmbGFncyBzaG93cyBQQ0llIGxpbmsgc3BlZWQgc3Vw cG9ydGVkIGluIGRyaXZlciB3aGljaCBhcmUgZGVjaWRlZCBieSBjaGlwc2V0IGFuZCBBU0lDICov CisjZGVmaW5lIENBSUxfUENJRV9MSU5LX1NQRUVEX1NVUFBPUlRfR0VOMSAgICAgICAgMHgwMDAx MDAwMAorI2RlZmluZSBDQUlMX1BDSUVfTElOS19TUEVFRF9TVVBQT1JUX0dFTjIgICAgICAgIDB4 MDAwMjAwMDAKKyNkZWZpbmUgQ0FJTF9QQ0lFX0xJTktfU1BFRURfU1VQUE9SVF9HRU4zICAgICAg ICAweDAwMDQwMDAwCisjZGVmaW5lIENBSUxfUENJRV9MSU5LX1NQRUVEX1NVUFBPUlRfTUFTSyAg ICAgICAgMHhGRkZGMDAwMAorI2RlZmluZSBDQUlMX1BDSUVfTElOS19TUEVFRF9TVVBQT1JUX1NI SUZUICAgICAgIDE2CisKKy8qIEZvbGxvd2luZyBmbGFncyBzaG93cyBQQ0llIGxpbmsgc3BlZWQg c3VwcG9ydGVkIGJ5IEFTSUMgSC9XLiovCisjZGVmaW5lIENBSUxfQVNJQ19QQ0lFX0xJTktfU1BF RURfU1VQUE9SVF9HRU4xICAgMHgwMDAwMDAwMQorI2RlZmluZSBDQUlMX0FTSUNfUENJRV9MSU5L X1NQRUVEX1NVUFBPUlRfR0VOMiAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQ0FJTF9BU0lDX1BDSUVf TElOS19TUEVFRF9TVVBQT1JUX0dFTjMgICAweDAwMDAwMDA0CisjZGVmaW5lIENBSUxfQVNJQ19Q Q0lFX0xJTktfU1BFRURfU1VQUE9SVF9NQVNLICAgMHgwMDAwRkZGRgorI2RlZmluZSBDQUlMX0FT SUNfUENJRV9MSU5LX1NQRUVEX1NVUFBPUlRfU0hJRlQgIDAKKworLyogRm9sbG93aW5nIGZsYWdz IHNob3dzIFBDSWUgbGFuZSB3aWR0aCBzd2l0Y2ggc3VwcG9ydGVkIGluIGRyaXZlciB3aGljaCBh cmUgZGVjaWRlZCBieSBjaGlwc2V0IGFuZCBBU0lDICovCisjZGVmaW5lIENBSUxfUENJRV9MSU5L X1dJRFRIX1NVUFBPUlRfWDEgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBDQUlMX1BDSUVf TElOS19XSURUSF9TVVBQT1JUX1gyICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgQ0FJTF9Q Q0lFX0xJTktfV0lEVEhfU1VQUE9SVF9YNCAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIENB SUxfUENJRV9MSU5LX1dJRFRIX1NVUFBPUlRfWDggICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmlu ZSBDQUlMX1BDSUVfTElOS19XSURUSF9TVVBQT1JUX1gxMiAgICAgICAgIDB4MDAxMDAwMDAKKyNk ZWZpbmUgQ0FJTF9QQ0lFX0xJTktfV0lEVEhfU1VQUE9SVF9YMTYgICAgICAgICAweDAwMjAwMDAw CisjZGVmaW5lIENBSUxfUENJRV9MSU5LX1dJRFRIX1NVUFBPUlRfWDMyICAgICAgICAgMHgwMDQw MDAwMAorI2RlZmluZSBDQUlMX1BDSUVfTElOS19XSURUSF9TVVBQT1JUX1NISUZUICAgICAgIDE2 CisKKyNkZWZpbmUgUFBfSE9TVF9UT19TTUNfVUwoWCkgY3B1X3RvX2JlMzIoWCkKKyNkZWZpbmUg UFBfU01DX1RPX0hPU1RfVUwoWCkgYmUzMl90b19jcHUoWCkKKworI2RlZmluZSBQUF9IT1NUX1RP X1NNQ19VUyhYKSBjcHVfdG9fYmUxNihYKQorI2RlZmluZSBQUF9TTUNfVE9fSE9TVF9VUyhYKSBi ZTE2X3RvX2NwdShYKQorCisjZGVmaW5lIENPTlZFUlRfRlJPTV9IT1NUX1RPX1NNQ19VTChYKSAo KFgpID0gUFBfSE9TVF9UT19TTUNfVUwoWCkpCisjZGVmaW5lIENPTlZFUlRfRlJPTV9TTUNfVE9f SE9TVF9VTChYKSAoKFgpID0gUFBfU01DX1RPX0hPU1RfVUwoWCkpCisKKyNkZWZpbmUgQ09OVkVS VF9GUk9NX0hPU1RfVE9fU01DX1VTKFgpICgoWCkgPSBQUF9IT1NUX1RPX1NNQ19VUyhYKSkKKwor aW50IHRvbmdhX2h3bWdyX2luaXQoc3RydWN0IHBwX2h3bWdyICpod21ncik7CisKKyNlbmRpZgor CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21nci90b25nYV9w b3dlcnR1bmUuaCBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2h3bWdyL3RvbmdhX3Bv d2VydHVuZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNjY3MGIKLS0t IC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21nci90b25n YV9wb3dlcnR1bmUuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgQWR2 YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdy YW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5 IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhl ICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmlj dGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2Us IGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisg KiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNv bnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVj dCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdo dCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4K KyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgor ICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZ IE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBM SU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1Mg Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVO VCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJM RSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIg SU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcg RlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVT RSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZu ZGVmIFRPTkdBX1BPV0VSVFVORV9ICisjZGVmaW5lIFRPTkdBX1BPV0VSVFVORV9ICisKK2VudW0g X3Bod190b25nYV9wdGNfY29uZmlnX3JlZ190eXBlIHsKKwlUT05HQV9DT05GSUdSRUdfTU1SID0g MCwKKwlUT05HQV9DT05GSUdSRUdfU01DX0lORCwKKwlUT05HQV9DT05GSUdSRUdfRElEVF9JTkQs CisJVE9OR0FfQ09ORklHUkVHX0NBQ0hFLAorCisJVE9OR0FfQ09ORklHUkVHX01BWAorfTsKK3R5 cGVkZWYgZW51bSBfcGh3X3RvbmdhX3B0Y19jb25maWdfcmVnX3R5cGUgcGh3X3RvbmdhX3B0Y19j b25maWdfcmVnX3R5cGU7CisKKy8qIFBvd2VyQ29udGFpbm1lbnQgRmVhdHVyZXMgKi8KKyNkZWZp bmUgUE9XRVJDT05UQUlOTUVOVF9GRUFUVVJFX0JBUE0gICAgICAgICAgICAweDAwMDAwMDAxCisj ZGVmaW5lIFBPV0VSQ09OVEFJTk1FTlRfRkVBVFVSRV9URENMaW1pdCAgICAgICAgMHgwMDAwMDAw MgorI2RlZmluZSBQT1dFUkNPTlRBSU5NRU5UX0ZFQVRVUkVfUGtnUHdyTGltaXQgICAgIDB4MDAw MDAwMDQKKworc3RydWN0IF9waHdfdG9uZ2FfcHRfY29uZmlnX3JlZyB7CisJdWludDMyX3QgICAg ICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQ7CisJdWludDMyX3QgICAgICAgICAgICAgICAg ICAgICAgICAgICBNYXNrOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hp ZnQ7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZTsKKwlwaHdfdG9u Z2FfcHRjX2NvbmZpZ19yZWdfdHlwZSAgICAgVHlwZTsKK307Cit0eXBlZGVmIHN0cnVjdCBfcGh3 X3RvbmdhX3B0X2NvbmZpZ19yZWcgcGh3X3RvbmdhX3B0X2NvbmZpZ19yZWc7CisKK3N0cnVjdCBf cGh3X3RvbmdhX3B0X2RlZmF1bHRzIHsKKwl1aW50OF90ICAgc3ZpX2xvYWRfbGluZV9lbjsKKwl1 aW50OF90ICAgc3ZpX2xvYWRfbGluZV92ZGRDOworCXVpbnQ4X3QgICB0ZGNfdmRkY190aHJvdHRs ZV9yZWxlYXNlX2xpbWl0X3BlcmM7CisJdWludDhfdCAgIHRkY19tYXd0OworCXVpbnQ4X3QgICB0 ZGNfd2F0ZXJmYWxsX2N0bDsKKwl1aW50OF90ICAgZHRlX2FtYmllbnRfdGVtcF9iYXNlOworCXVp bnQzMl90ICBkaXNwbGF5X2NhYzsKKwl1aW50MzJfdCAgYmFtcF90ZW1wX2dyYWRpZW50OworCXVp bnQxNl90ICBiYXBtdGlfcltTTVU3Ml9EVEVfSVRFUkFUSU9OUyAqIFNNVTcyX0RURV9TT1VSQ0VT ICogU01VNzJfRFRFX1NJTktTXTsKKwl1aW50MTZfdCAgYmFwbXRpX3JjW1NNVTcyX0RURV9JVEVS QVRJT05TICogU01VNzJfRFRFX1NPVVJDRVMgKiBTTVU3Ml9EVEVfU0lOS1NdOworfTsKK3R5cGVk ZWYgc3RydWN0IF9waHdfdG9uZ2FfcHRfZGVmYXVsdHMgcGh3X3RvbmdhX3B0X2RlZmF1bHRzOwor CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdt Z3IvdG9uZ2FfcHB0YWJsZS5oIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3Iv dG9uZ2FfcHB0YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNDQ1 NmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21n ci90b25nYV9wcHRhYmxlLmgKQEAgLTAsMCArMSw0MDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAx NSBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJl YnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAq IGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVz ICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJl c3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRv IHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5z ZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQg cGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBz dWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29w eXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRl ZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdh cmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FS UkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQg Tk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklU TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5P IEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUg TElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hF VEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJ U0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBU SEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisK KyNpZm5kZWYgVE9OR0FfUFBUQUJMRV9ICisjZGVmaW5lIFRPTkdBX1BQVEFCTEVfSAorCisvKiog XGZpbGUKKyAqIFRoaXMgaXMgYSBQb3dlclBsYXkgdGFibGUgaGVhZGVyIGZpbGUKKyAqLworI3By YWdtYSBwYWNrKHB1c2gsIDEpCisKKyNpbmNsdWRlICJod21nci5oIgorCisjZGVmaW5lIEFUT01f VE9OR0FfUFBfRkFOUEFSQU1FVEVSU19UQUNIT01FVEVSX1BVTFNFU19QRVJfUkVWT0xVVElPTl9N QVNLIDB4MGYKKyNkZWZpbmUgQVRPTV9UT05HQV9QUF9GQU5QQVJBTUVURVJTX05PRkFOICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MCAgICAvKiBObyBmYW4gaXMgY29ubmVjdGVk IHRvIHRoaXMgY29udHJvbGxlci4gKi8KKworI2RlZmluZSBBVE9NX1RPTkdBX1BQX1RIRVJNQUxD T05UUk9MTEVSX05PTkUgICAgICAwCisjZGVmaW5lIEFUT01fVE9OR0FfUFBfVEhFUk1BTENPTlRS T0xMRVJfTE05NjE2MyAgIDE3CisjZGVmaW5lIEFUT01fVE9OR0FfUFBfVEhFUk1BTENPTlRST0xM RVJfVE9OR0EgICAgIDIxCisjZGVmaW5lIEFUT01fVE9OR0FfUFBfVEhFUk1BTENPTlRST0xMRVJf RklKSSAgICAgIDIyCisKKy8qCisgKiBUaGVybWFsIGNvbnRyb2xsZXIgJ2NvbWJvIHR5cGUnIHRv IHVzZSBhbiBleHRlcm5hbCBjb250cm9sbGVyIGZvciBGYW4gY29udHJvbCBhbmQgYW4gaW50ZXJu YWwgY29udHJvbGxlciBmb3IgdGhlcm1hbC4KKyAqIFdlIHByb2JhYmx5IHNob3VsZCByZXNlcnZl IHRoZSBiaXQgMHg4MCBmb3IgdGhpcyB1c2UuCisgKiBUbyBrZWVwIHRoZSBudW1iZXIgb2YgdGhl c2UgdHlwZXMgbG93IHdlIHNob3VsZCBhbHNvIHVzZSB0aGUgc2FtZSBjb2RlIGZvciBhbGwgQVNJ Q3MgKGkuZS4gZG8gbm90IGRpc3Rpbmd1aXNoIFJWNnh4IGFuZCBSVjd4eCBJbnRlcm5hbCBoZXJl KS4KKyAqIFRoZSBkcml2ZXIgY2FuIHBpY2sgdGhlIGNvcnJlY3QgaW50ZXJuYWwgY29udHJvbGxl ciBiYXNlZCBvbiB0aGUgQVNJQy4KKyAqLworCisjZGVmaW5lIEFUT01fVE9OR0FfUFBfVEhFUk1B TENPTlRST0xMRVJfQURUNzQ3M19XSVRIX0lOVEVSTkFMICAgMHg4OSAgICAvKiBBRFQ3NDczIEZh biBDb250cm9sICsgSW50ZXJuYWwgVGhlcm1hbCBDb250cm9sbGVyICovCisjZGVmaW5lIEFUT01f VE9OR0FfUFBfVEhFUk1BTENPTlRST0xMRVJfRU1DMjEwM19XSVRIX0lOVEVSTkFMICAgMHg4RCAg ICAvKiBFTUMyMTAzIEZhbiBDb250cm9sICsgSW50ZXJuYWwgVGhlcm1hbCBDb250cm9sbGVyICov CisKKy8qLyogQVRPTV9UT05HQV9QT1dFUlBMQVlUQUJMRTo6dWxQbGF0Zm9ybUNhcHMgKi8KKyNk ZWZpbmUgQVRPTV9UT05HQV9QUF9QTEFURk9STV9DQVBfVkRER0ZYX0NPTlRST0wgICAgICAgICAg ICAgIDB4MSAgICAgICAgICAgIC8qIFRoaXMgY2FwIGluZGljYXRlcyB3aGV0aGVyIHZkZGdmeCB3 aWxsIGJlIGEgc2VwYXJhdGVkIHBvd2VyIHJhaWwuICovCisjZGVmaW5lIEFUT01fVE9OR0FfUFBf UExBVEZPUk1fQ0FQX1BPV0VSUExBWSAgICAgICAgICAgICAgICAgICAweDIgICAgICAgICAgICAv KiBUaGlzIGNhcCBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGEgbW9iaWxlIHBhcnQgYW5kIEND QyBuZWVkIHRvIHNob3cgUG93ZXJwbGF5IHBhZ2UuICovCisjZGVmaW5lIEFUT01fVE9OR0FfUFBf UExBVEZPUk1fQ0FQX1NCSU9TUE9XRVJTT1VSQ0UgICAgICAgICAgICAweDQgICAgICAgICAgICAv KiBUaGlzIGNhcCBpbmRpY2F0ZXMgd2hldGhlciBwb3dlciBzb3VyY2Ugbm90aWZpY2FpdG9uIGlz IGRvbmUgYnkgU0JJT1MgZGlyZWN0bHkuICovCisjZGVmaW5lIEFUT01fVE9OR0FfUFBfUExBVEZP Uk1fQ0FQX0RJU0FCTEVfVk9MVEFHRV9JU0xBTkQgICAgICAweDggICAgICAgICAgICAvKiBFbmFi bGUgdGhlIG9wdGlvbiB0byBvdmVyd3JpdGUgdm9sdGFnZSBpc2xhbmQgZmVhdHVyZSB0byBiZSBk aXNhYmxlZCwgcmVnYXJkbGVzcyBvZiBWZGRHZnggcG93ZXIgcmFpbCBzdXBwb3J0LiAqLworI2Rl ZmluZSBfX19fUkVUSVJFMTZfX19fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEw CisjZGVmaW5lIEFUT01fVE9OR0FfUFBfUExBVEZPUk1fQ0FQX0hBUkRXQVJFREMgICAgICAgICAg ICAgICAgIDB4MjAgICAgICAgICAgICAvKiBUaGlzIGNhcCBpbmRpY2F0ZXMgd2hldGhlciBwb3dl ciBzb3VyY2Ugbm90aWZpY2FpdG9uIGlzIGRvbmUgYnkgR1BJTyBkaXJlY3RseS4gKi8KKyNkZWZp bmUgX19fX1JFVElSRTY0X19fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MAor I2RlZmluZSBfX19fUkVUSVJFMTI4X19fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAw eDgwCisjZGVmaW5lIF9fX19SRVRJUkUyNTZfX19fICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgMHgxMDAKKyNkZWZpbmUgX19fX1JFVElSRTUxMl9fX18gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAweDIwMAorI2RlZmluZSBfX19fUkVUSVJFMTAyNF9fX18gICAgICAgICAgICAgICAg ICAgICAgICAgICAgIDB4NDAwCisjZGVmaW5lIF9fX19SRVRJUkUyMDQ4X19fXyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgMHg4MDAKKyNkZWZpbmUgQVRPTV9UT05HQV9QUF9QTEFURk9STV9D QVBfTVZERF9DT05UUk9MICAgICAgICAgICAgIDB4MTAwMCAgICAgICAgICAgIC8qIFRoaXMgY2Fw IGluZGljYXRlcyBkeW5hbWljIE1WREQgaXMgcmVxdWlyZWQuIFVuY2hlY2sgdG8gZGlzYWJsZSBp dC4gKi8KKyNkZWZpbmUgX19fX1JFVElSRTIwMDBfX19fICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDB4MjAwMAorI2RlZmluZSBfX19fUkVUSVJFNDAwMF9fX18gICAgICAgICAgICAgICAgICAg ICAgICAgICAgMHg0MDAwCisjZGVmaW5lIEFUT01fVE9OR0FfUFBfUExBVEZPUk1fQ0FQX1ZERENJ X0NPTlRST0wgICAgICAgICAgICAweDgwMDAgICAgICAgICAgICAvKiBUaGlzIGNhcCBpbmRpY2F0 ZXMgZHluYW1pYyBWRERDSSBpcyByZXF1aXJlZC4gVW5jaGVjayB0byBkaXNhYmxlIGl0LiAqLwor I2RlZmluZSBfX19fUkVUSVJFMTAwMDBfX19fICAgICAgICAgICAgICAgICAgICAgICAgICAweDEw MDAwCisjZGVmaW5lIEFUT01fVE9OR0FfUFBfUExBVEZPUk1fQ0FQX0JBQ08gICAgICAgICAgICAg ICAgICAgIDB4MjAwMDAgICAgICAgICAgICAvKiBFbmFibGUgdG8gaW5kaWNhdGUgdGhlIGRyaXZl ciBzdXBwb3J0cyBCQUNPIHN0YXRlLiAqLworCisjZGVmaW5lIEFUT01fVE9OR0FfUFBfUExBVEZP Uk1fQ0FQX09VVFBVVF9USEVSTUFMMkdQSU8xNyAgICAgICAgIDB4MTAwMDAwICAgICAvKiBFbmFi bGUgdG8gaW5kaWNhdGUgdGhlIGRyaXZlciBzdXBwb3J0cyB0aGVybWFsMkdQSU8xNy4gKi8KKyNk ZWZpbmUgQVRPTV9UT05HQV9QUF9QTEFURk9STV9DT01CSU5FX1BDQ19XSVRIX1RIRVJNQUxfU0lH TkFMICAweDEwMDAwMDAgICAgIC8qIEVuYWJsZSB0byBpbmRpY2F0ZSBpZiB0aGVybWFsIGFuZCBQ Q0MgYXJlIHNoYXJpbmcgdGhlIHNhbWUgR1BJTyAqLworI2RlZmluZSBBVE9NX1RPTkdBX1BMQVRG T1JNX0xPQURfUE9TVF9QUk9EVUNUSU9OX0ZJUk1XQVJFICAgICAgIDB4MjAwMDAwMAorCisvKiBB VE9NX1BQTElCX05PTkNMT0NLX0lORk86OnVzQ2xhc3NpZmljYXRpb24gKi8KKyNkZWZpbmUgQVRP TV9QUExJQl9DTEFTU0lGSUNBVElPTl9VSV9NQVNLICAgICAgICAgICAgICAgMHgwMDA3CisjZGVm aW5lIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fVUlfU0hJRlQgICAgICAgICAgICAgIDAKKyNk ZWZpbmUgQVRPTV9QUExJQl9DTEFTU0lGSUNBVElPTl9VSV9OT05FICAgICAgICAgICAgICAgMAor I2RlZmluZSBBVE9NX1BQTElCX0NMQVNTSUZJQ0FUSU9OX1VJX0JBVFRFUlkgICAgICAgICAgICAx CisjZGVmaW5lIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fVUlfQkFMQU5DRUQgICAgICAgICAg IDMKKyNkZWZpbmUgQVRPTV9QUExJQl9DTEFTU0lGSUNBVElPTl9VSV9QRVJGT1JNQU5DRSAgICAg ICAgNQorLyogMiwgNCwgNiwgNyBhcmUgcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBBVE9NX1BQTElC X0NMQVNTSUZJQ0FUSU9OX0JPT1QgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgQVRP TV9QUExJQl9DTEFTU0lGSUNBVElPTl9USEVSTUFMICAgICAgICAgICAgICAgMHgwMDEwCisjZGVm aW5lIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fTElNSVRFRFBPV0VSU09VUkNFICAgIDB4MDAy MAorI2RlZmluZSBBVE9NX1BQTElCX0NMQVNTSUZJQ0FUSU9OX1JFU1QgICAgICAgICAgICAgICAg ICAweDAwNDAKKyNkZWZpbmUgQVRPTV9QUExJQl9DTEFTU0lGSUNBVElPTl9GT1JDRUQgICAgICAg ICAgICAgICAgMHgwMDgwCisjZGVmaW5lIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fQUNQSSAg ICAgICAgICAgICAgICAgIDB4MTAwMAorCisvKiBBVE9NX1BQTElCX05PTkNMT0NLX0lORk86OnVz Q2xhc3NpZmljYXRpb24yICovCisjZGVmaW5lIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT04yX0xJ TUlURURQT1dFUlNPVVJDRV8yIDB4MDAwMQorCisjZGVmaW5lIEFUT01fVG9uZ2FfRElTQUxMT1df T05fREMgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgQVRPTV9Ub25n YV9FTkFCTEVfVkFSSUJSSUdIVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAorCisjZGVm aW5lIEFUT01fVG9uZ2FfVEFCTEVfUkVWSVNJT05fVE9OR0EgICAgICAgICAgICAgICAgIDcKKwor dHlwZWRlZiBzdHJ1Y3QgX0FUT01fVG9uZ2FfUE9XRVJQTEFZVEFCTEUgeworCUFUT01fQ09NTU9O X1RBQkxFX0hFQURFUiBzSGVhZGVyOworCisJVUNIQVIgIHVjVGFibGVSZXZpc2lvbjsKKwlVU0hP UlQgdXNUYWJsZVNpemU7CQkJCQkJLyp0aGUgc2l6ZSBvZiBoZWFkZXIgc3RydWN0dXJlICovCisK KwlVTE9ORwl1bEdvbGRlblBQSUQ7CisJVUxPTkcJdWxHb2xkZW5SZXZpc2lvbjsKKwlVU0hPUlQJ dXNGb3JtYXRJRDsKKworCVVTSE9SVAl1c1ZvbHRhZ2VUaW1lOwkJCQkJIC8qaW4gbWljcm9zZWNv bmRzICovCisJVUxPTkcJdWxQbGF0Zm9ybUNhcHM7CQkJCQkgIC8qU2VlIEFUT01fVG9uZ2FfQ0FQ U18qICovCisKKwlVTE9ORwl1bE1heE9ERW5naW5lQ2xvY2s7IAkJCSAgIC8qRm9yIE92ZXJkcml2 ZS4gICovCisJVUxPTkcJdWxNYXhPRE1lbW9yeUNsb2NrOyAJCQkgICAvKkZvciBPdmVyZHJpdmUu ICovCisKKwlVU0hPUlQJdXNQb3dlckNvbnRyb2xMaW1pdDsKKwlVU0hPUlQJdXNVbHZWb2x0YWdl T2Zmc2V0OwkJCQkgIC8qaW4gbXYgdW5pdHMgKi8KKworCVVTSE9SVAl1c1N0YXRlQXJyYXlPZmZz ZXQ7CQkJCSAgLypwb2ludHMgdG8gQVRPTV9Ub25nYV9TdGF0ZV9BcnJheSAqLworCVVTSE9SVAl1 c0ZhblRhYmxlT2Zmc2V0OwkJCQkgIC8qcG9pbnRzIHRvIEFUT01fVG9uZ2FfRmFuX1RhYmxlICov CisJVVNIT1JUCXVzVGhlcm1hbENvbnRyb2xsZXJPZmZzZXQ7CQkgICAvKnBvaW50cyB0byBBVE9N X1RvbmdhX1RoZXJtYWxfQ29udHJvbGxlciAqLworCVVTSE9SVAl1c1Jlc2VydjsJCQkJCQkgICAv KkN1c3RvbVRoZXJtYWxQb2xpY3kgcmVtb3ZlZCBmb3IgVG9uZ2EuIEtlZXAgdGhpcyBmaWxlZCBh cyByZXNlcnZlZC4gKi8KKworCVVTSE9SVAl1c01jbGtEZXBlbmRlbmN5VGFibGVPZmZzZXQ7CSAg IC8qcG9pbnRzIHRvIEFUT01fVG9uZ2FfTUNMS19EZXBlbmRlbmN5X1RhYmxlICovCisJVVNIT1JU CXVzU2Nsa0RlcGVuZGVuY3lUYWJsZU9mZnNldDsJICAgLypwb2ludHMgdG8gQVRPTV9Ub25nYV9T Q0xLX0RlcGVuZGVuY3lfVGFibGUgKi8KKwlVU0hPUlQJdXNWZGRjTG9va3VwVGFibGVPZmZzZXQ7 CQkgICAvKnBvaW50cyB0byBBVE9NX1RvbmdhX1ZvbHRhZ2VfTG9va3VwX1RhYmxlICovCisJVVNI T1JUCXVzVmRkZ2Z4TG9va3VwVGFibGVPZmZzZXQ7IAkJLypwb2ludHMgdG8gQVRPTV9Ub25nYV9W b2x0YWdlX0xvb2t1cF9UYWJsZSAqLworCisJVVNIT1JUCXVzTU1EZXBlbmRlbmN5VGFibGVPZmZz ZXQ7CQkgIC8qcG9pbnRzIHRvIEFUT01fVG9uZ2FfTU1fRGVwZW5kZW5jeV9UYWJsZSAqLworCisJ VVNIT1JUCXVzVkNFU3RhdGVUYWJsZU9mZnNldDsJCQkgICAvKnBvaW50cyB0byBBVE9NX1Rvbmdh X1ZDRV9TdGF0ZV9UYWJsZTsgKi8KKworCVVTSE9SVAl1c1BQTVRhYmxlT2Zmc2V0OwkJCQkgIC8q cG9pbnRzIHRvIEFUT01fVG9uZ2FfUFBNX1RhYmxlICovCisJVVNIT1JUCXVzUG93ZXJUdW5lVGFi bGVPZmZzZXQ7CQkJICAvKnBvaW50cyB0byBBVE9NX1Bvd2VyVHVuZV9UYWJsZSAqLworCisJVVNI T1JUCXVzSGFyZExpbWl0VGFibGVPZmZzZXQ7IAkJICAgLypwb2ludHMgdG8gQVRPTV9Ub25nYV9I YXJkX0xpbWl0X1RhYmxlICovCisKKwlVU0hPUlQJdXNQQ0lFVGFibGVPZmZzZXQ7CQkJCSAgLypw b2ludHMgdG8gQVRPTV9Ub25nYV9QQ0lFX1RhYmxlICovCisKKwlVU0hPUlQJdXNHUElPVGFibGVP ZmZzZXQ7CQkJCSAgLypwb2ludHMgdG8gQVRPTV9Ub25nYV9HUElPX1RhYmxlICovCisKKwlVU0hP UlQJdXNSZXNlcnZlZFs2XTsJCQkJCSAgIC8qVE9ETzogbW9kaWZ5IHJlc2VydmVkIHNpemUgdG8g Zml0IHN0cnVjdHVyZSBhbGlnbmluZyAqLworfSBBVE9NX1RvbmdhX1BPV0VSUExBWVRBQkxFOwor Cit0eXBlZGVmIHN0cnVjdCBfQVRPTV9Ub25nYV9TdGF0ZSB7CisJVUNIQVIgIHVjRW5naW5lQ2xv Y2tJbmRleEhpZ2g7CisJVUNIQVIgIHVjRW5naW5lQ2xvY2tJbmRleExvdzsKKworCVVDSEFSICB1 Y01lbW9yeUNsb2NrSW5kZXhIaWdoOworCVVDSEFSICB1Y01lbW9yeUNsb2NrSW5kZXhMb3c7CisK KwlVQ0hBUiAgdWNQQ0lFR2VuTG93OworCVVDSEFSICB1Y1BDSUVHZW5IaWdoOworCisJVUNIQVIg IHVjUENJRUxhbmVMb3c7CisJVUNIQVIgIHVjUENJRUxhbmVIaWdoOworCisJVVNIT1JUIHVzQ2xh c3NpZmljYXRpb247CisJVUxPTkcgdWxDYXBzQW5kU2V0dGluZ3M7CisJVVNIT1JUIHVzQ2xhc3Np ZmljYXRpb24yOworCVVDSEFSICB1Y1VudXNlZFs0XTsKK30gQVRPTV9Ub25nYV9TdGF0ZTsKKwor dHlwZWRlZiBzdHJ1Y3QgX0FUT01fVG9uZ2FfU3RhdGVfQXJyYXkgeworCVVDSEFSIHVjUmV2SWQ7 CisJVUNIQVIgdWNOdW1FbnRyaWVzOwkJLyogTnVtYmVyIG9mIGVudHJpZXMuICovCisJQVRPTV9U b25nYV9TdGF0ZSBzdGF0ZXNbMV07CS8qIER5bmFtaWNhbGx5IGFsbG9jYXRlIGVudHJpZXMuICov Cit9IEFUT01fVG9uZ2FfU3RhdGVfQXJyYXk7CisKK3R5cGVkZWYgc3RydWN0IF9BVE9NX1Rvbmdh X01DTEtfRGVwZW5kZW5jeV9SZWNvcmQgeworCVVDSEFSICB1Y1ZkZGNJbmQ7CS8qIFZkZGMgdm9s dGFnZSAqLworCVVTSE9SVCB1c1ZkZGNpOworCVVTSE9SVCB1c1ZkZGdmeE9mZnNldDsJLyogT2Zm c2V0IHJlbGF0aXZlIHRvIFZkZGMgdm9sdGFnZSAqLworCVVTSE9SVCB1c012ZGQ7CisJVUxPTkcg dWxNY2xrOworCVVTSE9SVCB1c1Jlc2VydmVkOworfSBBVE9NX1RvbmdhX01DTEtfRGVwZW5kZW5j eV9SZWNvcmQ7CisKK3R5cGVkZWYgc3RydWN0IF9BVE9NX1RvbmdhX01DTEtfRGVwZW5kZW5jeV9U YWJsZSB7CisJVUNIQVIgdWNSZXZJZDsKKwlVQ0hBUiB1Y051bUVudHJpZXM7IAkJCQkJCQkJCQkv KiBOdW1iZXIgb2YgZW50cmllcy4gKi8KKwlBVE9NX1RvbmdhX01DTEtfRGVwZW5kZW5jeV9SZWNv cmQgZW50cmllc1sxXTsJCQkJLyogRHluYW1pY2FsbHkgYWxsb2NhdGUgZW50cmllcy4gKi8KK30g QVRPTV9Ub25nYV9NQ0xLX0RlcGVuZGVuY3lfVGFibGU7CisKK3R5cGVkZWYgc3RydWN0IF9BVE9N X1RvbmdhX1NDTEtfRGVwZW5kZW5jeV9SZWNvcmQgeworCVVDSEFSICB1Y1ZkZEluZDsJCQkJCQkJ CQkJCS8qIEJhc2Ugdm9sdGFnZSAqLworCVVTSE9SVCB1c1ZkZGNPZmZzZXQ7CQkJCQkJCQkJCS8q IE9mZnNldCByZWxhdGl2ZSB0byBiYXNlIHZvbHRhZ2UgKi8KKwlVTE9ORyB1bFNjbGs7CisJVVNI T1JUIHVzRWRjQ3VycmVudDsKKwlVQ0hBUiAgdWNSZWxpYWJpbGl0eVRlbXBlcmF0dXJlOworCVVD SEFSICB1Y0NLU1ZPZmZzZXRhbmREaXNhYmxlOwkJCQkJCQkgIC8qIEJpdHMgMH42OiBWb2x0YWdl IG9mZnNldCBmb3IgQ0tTLCBCaXQgNzogRGlzYWJsZS9lbmFibGUgZm9yIHRoZSBTQ0xLIGxldmVs LiAqLworfSBBVE9NX1RvbmdhX1NDTEtfRGVwZW5kZW5jeV9SZWNvcmQ7CisKK3R5cGVkZWYgc3Ry dWN0IF9BVE9NX1RvbmdhX1NDTEtfRGVwZW5kZW5jeV9UYWJsZSB7CisJVUNIQVIgdWNSZXZJZDsK KwlVQ0hBUiB1Y051bUVudHJpZXM7IAkJCQkJCQkJCQkvKiBOdW1iZXIgb2YgZW50cmllcy4gKi8K KwlBVE9NX1RvbmdhX1NDTEtfRGVwZW5kZW5jeV9SZWNvcmQgZW50cmllc1sxXTsJCQkJIC8qIER5 bmFtaWNhbGx5IGFsbG9jYXRlIGVudHJpZXMuICovCit9IEFUT01fVG9uZ2FfU0NMS19EZXBlbmRl bmN5X1RhYmxlOworCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9Ub25nYV9QQ0lFX1JlY29yZCB7CisJ VUNIQVIgdWNQQ0lFR2VuU3BlZWQ7CisJVUNIQVIgdXNQQ0lFTGFuZVdpZHRoOworCVVDSEFSIHVj UmVzZXJ2ZWRbMl07Cit9IEFUT01fVG9uZ2FfUENJRV9SZWNvcmQ7CisKK3R5cGVkZWYgc3RydWN0 IF9BVE9NX1RvbmdhX1BDSUVfVGFibGUgeworCVVDSEFSIHVjUmV2SWQ7CisJVUNIQVIgdWNOdW1F bnRyaWVzOyAJCQkJCQkJCQkJLyogTnVtYmVyIG9mIGVudHJpZXMuICovCisJQVRPTV9Ub25nYV9Q Q0lFX1JlY29yZCBlbnRyaWVzWzFdOwkJCQkJCQkvKiBEeW5hbWljYWxseSBhbGxvY2F0ZSBlbnRy aWVzLiAqLworfSBBVE9NX1RvbmdhX1BDSUVfVGFibGU7CisKK3R5cGVkZWYgc3RydWN0IF9BVE9N X1RvbmdhX01NX0RlcGVuZGVuY3lfUmVjb3JkIHsKKwlVQ0hBUiAgIHVjVmRkY0luZDsJCQkJCQkJ CQkJCSAvKiBWRERDIHZvbHRhZ2UgKi8KKwlVU0hPUlQgIHVzVmRkZ2Z4T2Zmc2V0OwkJCQkJCQkJ CSAgLyogT2Zmc2V0IHJlbGF0aXZlIHRvIFZEREMgdm9sdGFnZSAqLworCVVMT05HICB1bERDbGs7 CQkJCQkJCQkJCQkJLyogVVZEIEQtY2xvY2sgKi8KKwlVTE9ORyAgdWxWQ2xrOwkJCQkJCQkJCQkJ CS8qIFVWRCBWLWNsb2NrICovCisJVUxPTkcgIHVsRUNsazsJCQkJCQkJCQkJCQkvKiBWQ0UgY2xv Y2sgKi8KKwlVTE9ORyAgdWxBQ2xrOwkJCQkJCQkJCQkJCS8qIEFDUCBjbG9jayAqLworCVVMT05H ICB1bFNBTVVDbGs7CQkJCQkJCQkJCQkvKiBTQU1VIGNsb2NrICovCit9IEFUT01fVG9uZ2FfTU1f RGVwZW5kZW5jeV9SZWNvcmQ7CisKK3R5cGVkZWYgc3RydWN0IF9BVE9NX1RvbmdhX01NX0RlcGVu ZGVuY3lfVGFibGUgeworCVVDSEFSIHVjUmV2SWQ7CisJVUNIQVIgdWNOdW1FbnRyaWVzOyAJCQkJ CQkJCQkJLyogTnVtYmVyIG9mIGVudHJpZXMuICovCisJQVRPTV9Ub25nYV9NTV9EZXBlbmRlbmN5 X1JlY29yZCBlbnRyaWVzWzFdOyAJCQkgICAvKiBEeW5hbWljYWxseSBhbGxvY2F0ZSBlbnRyaWVz LiAqLworfSBBVE9NX1RvbmdhX01NX0RlcGVuZGVuY3lfVGFibGU7CisKK3R5cGVkZWYgc3RydWN0 IF9BVE9NX1RvbmdhX1ZvbHRhZ2VfTG9va3VwX1JlY29yZCB7CisJVVNIT1JUIHVzVmRkOwkJCQkJ CQkJCQkJICAgLyogQmFzZSB2b2x0YWdlICovCisJVVNIT1JUIHVzQ0FDTG93OworCVVTSE9SVCB1 c0NBQ01pZDsKKwlVU0hPUlQgdXNDQUNIaWdoOworfSBBVE9NX1RvbmdhX1ZvbHRhZ2VfTG9va3Vw X1JlY29yZDsKKwordHlwZWRlZiBzdHJ1Y3QgX0FUT01fVG9uZ2FfVm9sdGFnZV9Mb29rdXBfVGFi bGUgeworCVVDSEFSIHVjUmV2SWQ7CisJVUNIQVIgdWNOdW1FbnRyaWVzOyAJCQkJCQkJCQkJLyog TnVtYmVyIG9mIGVudHJpZXMuICovCisJQVRPTV9Ub25nYV9Wb2x0YWdlX0xvb2t1cF9SZWNvcmQg ZW50cmllc1sxXTsJCQkJLyogRHluYW1pY2FsbHkgYWxsb2NhdGUgZW50cmllcy4gKi8KK30gQVRP TV9Ub25nYV9Wb2x0YWdlX0xvb2t1cF9UYWJsZTsKKwordHlwZWRlZiBzdHJ1Y3QgX0FUT01fVG9u Z2FfRmFuX1RhYmxlIHsKKwlVQ0hBUiAgIHVjUmV2SWQ7CQkJCQkJIC8qIENoYW5nZSB0aGlzIGlm IHRoZSB0YWJsZSBmb3JtYXQgY2hhbmdlcyBvciB2ZXJzaW9uIGNoYW5nZXMgc28gdGhhdCB0aGUg b3RoZXIgZmllbGRzIGFyZSBub3QgdGhlIHNhbWUuICovCisJVUNIQVIgICB1Y1RIeXN0OwkJCQkJ CSAvKiBUZW1wZXJhdHVyZSBoeXN0ZXJlc2lzLiBJbnRlZ2VyLiAqLworCVVTSE9SVCAgdXNUTWlu OyAJCQkJCQkgLyogVGhlIHRlbXBlcmF0dXJlLCBpbiAwLjAxIGNlbnRpZ3JhZGVzLCBiZWxvdyB3 aGljaCB3ZSBqdXN0IHJ1biBhdCBhIG1pbmltYWwgUFdNLiAqLworCVVTSE9SVCAgdXNUTWVkOyAJ CQkJCQkgLyogVGhlIG1pZGRsZSB0ZW1wZXJhdHVyZSB3aGVyZSB3ZSBjaGFuZ2Ugc2xvcGVzLiAq LworCVVTSE9SVCAgdXNUSGlnaDsJCQkJCQkgLyogVGhlIGhpZ2ggcG9pbnQgYWJvdmUgVE1lZCBm b3IgYWRqdXN0aW5nIHRoZSBzZWNvbmQgc2xvcGUuICovCisJVVNIT1JUICB1c1BXTU1pbjsJCQkJ CQkgLyogVGhlIG1pbmltdW0gUFdNIHZhbHVlIGluIHBlcmNlbnQgKDAuMDElIGluY3JlbWVudHMp LiAqLworCVVTSE9SVCAgdXNQV01NZWQ7CQkJCQkJIC8qIFRoZSBQV00gdmFsdWUgKGluIHBlcmNl bnQpIGF0IFRNZWQuICovCisJVVNIT1JUICB1c1BXTUhpZ2g7CQkJCQkJIC8qIFRoZSBQV00gdmFs dWUgYXQgVEhpZ2guICovCisJVVNIT1JUICB1c1RNYXg7IAkJCQkJCSAvKiBUaGUgbWF4IHRlbXBl cmF0dXJlICovCisJVUNIQVIgICB1Y0ZhbkNvbnRyb2xNb2RlOwkJCQkgIC8qIExlZ2FjeSBvciBG dXp6eSBGYW4gbW9kZSAqLworCVVTSE9SVCAgdXNGYW5QV01NYXg7CQkJCQkgIC8qIE1heGltdW0g YWxsb3dlZCBmYW4gcG93ZXIgaW4gcGVyY2VudCAqLworCVVTSE9SVCAgdXNGYW5PdXRwdXRTZW5z aXRpdml0eTsJCSAgLyogU2Vuc2l0aXZpdHkgb2YgZmFuIHJlYWN0aW9uIHRvIHRlbWVwYXR1cmUg Y2hhbmdlcyAqLworCVVTSE9SVCAgdXNGYW5SUE1NYXg7CQkJCQkgIC8qIFRoZSBkZWZhdWx0IHZh bHVlIGluIFJQTSAqLworCVVMT05HICB1bE1pbkZhblNDTEtBY291c3RpY0xpbWl0OwkgICAvKiBN aW5pbXVtIEZhbiBDb250cm9sbGVyIFNDTEsgRnJlcXVlbmN5IEFjb3VzdGljIExpbWl0LiAqLwor CVVDSEFSICAgdWNUYXJnZXRUZW1wZXJhdHVyZTsJCQkgLyogQWR2YW5jZWQgZmFuIGNvbnRyb2xs ZXIgdGFyZ2V0IHRlbXBlcmF0dXJlLiAqLworCVVDSEFSICAgdWNNaW5pbXVtUFdNTGltaXQ7IAkJ CSAgLyogVGhlIG1pbmltdW0gUFdNIHRoYXQgdGhlIGFkdmFuY2VkIGZhbiBjb250cm9sbGVyIGNh biBzZXQuCVRoaXMgc2hvdWxkIGJlIHNldCB0byB0aGUgaGlnaGVzdCBQV00gdGhhdCB3aWxsIHJ1 biB0aGUgZmFuIGF0IGl0cyBsb3dlc3QgUlBNLiAqLworCVVTSE9SVCAgdXNSZXNlcnZlZDsKK30g QVRPTV9Ub25nYV9GYW5fVGFibGU7CisKK3R5cGVkZWYgc3RydWN0IF9BVE9NX0ZpamlfRmFuX1Rh YmxlIHsKKwlVQ0hBUiAgIHVjUmV2SWQ7CQkJCQkJIC8qIENoYW5nZSB0aGlzIGlmIHRoZSB0YWJs ZSBmb3JtYXQgY2hhbmdlcyBvciB2ZXJzaW9uIGNoYW5nZXMgc28gdGhhdCB0aGUgb3RoZXIgZmll bGRzIGFyZSBub3QgdGhlIHNhbWUuICovCisJVUNIQVIgICB1Y1RIeXN0OwkJCQkJCSAvKiBUZW1w ZXJhdHVyZSBoeXN0ZXJlc2lzLiBJbnRlZ2VyLiAqLworCVVTSE9SVCAgdXNUTWluOyAJCQkJCQkg LyogVGhlIHRlbXBlcmF0dXJlLCBpbiAwLjAxIGNlbnRpZ3JhZGVzLCBiZWxvdyB3aGljaCB3ZSBq dXN0IHJ1biBhdCBhIG1pbmltYWwgUFdNLiAqLworCVVTSE9SVCAgdXNUTWVkOyAJCQkJCQkgLyog VGhlIG1pZGRsZSB0ZW1wZXJhdHVyZSB3aGVyZSB3ZSBjaGFuZ2Ugc2xvcGVzLiAqLworCVVTSE9S VCAgdXNUSGlnaDsJCQkJCQkgLyogVGhlIGhpZ2ggcG9pbnQgYWJvdmUgVE1lZCBmb3IgYWRqdXN0 aW5nIHRoZSBzZWNvbmQgc2xvcGUuICovCisJVVNIT1JUICB1c1BXTU1pbjsJCQkJCQkgLyogVGhl IG1pbmltdW0gUFdNIHZhbHVlIGluIHBlcmNlbnQgKDAuMDElIGluY3JlbWVudHMpLiAqLworCVVT SE9SVCAgdXNQV01NZWQ7CQkJCQkJIC8qIFRoZSBQV00gdmFsdWUgKGluIHBlcmNlbnQpIGF0IFRN ZWQuICovCisJVVNIT1JUICB1c1BXTUhpZ2g7CQkJCQkJIC8qIFRoZSBQV00gdmFsdWUgYXQgVEhp Z2guICovCisJVVNIT1JUICB1c1RNYXg7IAkJCQkJCSAvKiBUaGUgbWF4IHRlbXBlcmF0dXJlICov CisJVUNIQVIgICB1Y0ZhbkNvbnRyb2xNb2RlOwkJCQkgIC8qIExlZ2FjeSBvciBGdXp6eSBGYW4g bW9kZSAqLworCVVTSE9SVCAgdXNGYW5QV01NYXg7CQkJCQkgIC8qIE1heGltdW0gYWxsb3dlZCBm YW4gcG93ZXIgaW4gcGVyY2VudCAqLworCVVTSE9SVCAgdXNGYW5PdXRwdXRTZW5zaXRpdml0eTsJ CSAgLyogU2Vuc2l0aXZpdHkgb2YgZmFuIHJlYWN0aW9uIHRvIHRlbWVwYXR1cmUgY2hhbmdlcyAq LworCVVTSE9SVCAgdXNGYW5SUE1NYXg7CQkJCQkgIC8qIFRoZSBkZWZhdWx0IHZhbHVlIGluIFJQ TSAqLworCVVMT05HICB1bE1pbkZhblNDTEtBY291c3RpY0xpbWl0OwkJLyogTWluaW11bSBGYW4g Q29udHJvbGxlciBTQ0xLIEZyZXF1ZW5jeSBBY291c3RpYyBMaW1pdC4gKi8KKwlVQ0hBUiAgIHVj VGFyZ2V0VGVtcGVyYXR1cmU7CQkJIC8qIEFkdmFuY2VkIGZhbiBjb250cm9sbGVyIHRhcmdldCB0 ZW1wZXJhdHVyZS4gKi8KKwlVQ0hBUiAgIHVjTWluaW11bVBXTUxpbWl0OyAJCQkgIC8qIFRoZSBt aW5pbXVtIFBXTSB0aGF0IHRoZSBhZHZhbmNlZCBmYW4gY29udHJvbGxlciBjYW4gc2V0LglUaGlz IHNob3VsZCBiZSBzZXQgdG8gdGhlIGhpZ2hlc3QgUFdNIHRoYXQgd2lsbCBydW4gdGhlIGZhbiBh dCBpdHMgbG93ZXN0IFJQTS4gKi8KKwlVU0hPUlQgIHVzRmFuR2FpbkVkZ2U7CisJVVNIT1JUICB1 c0ZhbkdhaW5Ib3RzcG90OworCVVTSE9SVCAgdXNGYW5HYWluTGlxdWlkOworCVVTSE9SVCAgdXNG YW5HYWluVnJWZGRjOworCVVTSE9SVCAgdXNGYW5HYWluVnJNdmRkOworCVVTSE9SVCAgdXNGYW5H YWluUGx4OworCVVTSE9SVCAgdXNGYW5HYWluSGJtOworCVVTSE9SVCAgdXNSZXNlcnZlZDsKK30g QVRPTV9GaWppX0Zhbl9UYWJsZTsKKwordHlwZWRlZiBzdHJ1Y3QgX0FUT01fVG9uZ2FfVGhlcm1h bF9Db250cm9sbGVyIHsKKwlVQ0hBUiB1Y1JldklkOworCVVDSEFSIHVjVHlwZTsJCSAgIC8qIG9u ZSBvZiBBVE9NX1RPTkdBX1BQX1RIRVJNQUxDT05UUk9MTEVSXyogKi8KKwlVQ0hBUiB1Y0kyY0xp bmU7CQkvKiBhcyBpbnRlcnByZXRlZCBieSBEQUwgSTJDICovCisJVUNIQVIgdWNJMmNBZGRyZXNz OworCVVDSEFSIHVjRmFuUGFyYW1ldGVyczsJLyogRmFuIENvbnRyb2wgUGFyYW1ldGVycy4gKi8K KwlVQ0hBUiB1Y0Zhbk1pblJQTTsgCSAvKiBGYW4gTWluaW11bSBSUE0gKGh1bmRyZWRzKSAtLSBm b3IgZGlzcGxheSBwdXJwb3NlcyBvbmx5LiAqLworCVVDSEFSIHVjRmFuTWF4UlBNOyAJIC8qIEZh biBNYXhpbXVtIFJQTSAoaHVuZHJlZHMpIC0tIGZvciBkaXNwbGF5IHB1cnBvc2VzIG9ubHkuICov CisJVUNIQVIgdWNSZXNlcnZlZDsKKwlVQ0hBUiB1Y0ZsYWdzOwkJICAgLyogdG8gYmUgZGVmaW5l ZCAqLworfSBBVE9NX1RvbmdhX1RoZXJtYWxfQ29udHJvbGxlcjsKKwordHlwZWRlZiBzdHJ1Y3Qg X0FUT01fVG9uZ2FfVkNFX1N0YXRlX1JlY29yZCB7CisJVUNIQVIgIHVjVkNFQ2xvY2tJbmRleDsJ LyppbmRleCBpbnRvIHVzVkNFRGVwZW5kZW5jeVRhYmxlT2Zmc2V0IG9mICdBVE9NX1RvbmdhX01N X0RlcGVuZGVuY3lfVGFibGUnIHR5cGUgKi8KKwlVQ0hBUiAgdWNGbGFnOwkJLyogMiBiaXRzIGlu ZGljYXRlcyBtZW1vcnkgcC1zdGF0ZXMgKi8KKwlVQ0hBUiAgdWNTQ0xLSW5kZXg7CQkvKmluZGV4 IGludG8gQVRPTV9Ub25nYV9TQ0xLX0RlcGVuZGVuY3lfVGFibGUgKi8KKwlVQ0hBUiAgdWNNQ0xL SW5kZXg7CQkvKmluZGV4IGludG8gQVRPTV9Ub25nYV9NQ0xLX0RlcGVuZGVuY3lfVGFibGUgKi8K K30gQVRPTV9Ub25nYV9WQ0VfU3RhdGVfUmVjb3JkOworCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9U b25nYV9WQ0VfU3RhdGVfVGFibGUgeworCVVDSEFSIHVjUmV2SWQ7CisJVUNIQVIgdWNOdW1FbnRy aWVzOworCUFUT01fVG9uZ2FfVkNFX1N0YXRlX1JlY29yZCBlbnRyaWVzWzFdOworfSBBVE9NX1Rv bmdhX1ZDRV9TdGF0ZV9UYWJsZTsKKwordHlwZWRlZiBzdHJ1Y3QgX0FUT01fVG9uZ2FfUG93ZXJU dW5lX1RhYmxlIHsKKwlVQ0hBUiAgdWNSZXZJZDsKKwlVU0hPUlQgdXNURFA7CisJVVNIT1JUIHVz Q29uZmlndXJhYmxlVERQOworCVVTSE9SVCB1c1REQzsKKwlVU0hPUlQgdXNCYXR0ZXJ5UG93ZXJM aW1pdDsKKwlVU0hPUlQgdXNTbWFsbFBvd2VyTGltaXQ7CisJVVNIT1JUIHVzTG93Q0FDTGVha2Fn ZTsKKwlVU0hPUlQgdXNIaWdoQ0FDTGVha2FnZTsKKwlVU0hPUlQgdXNNYXhpbXVtUG93ZXJEZWxp dmVyeUxpbWl0OworCVVTSE9SVCB1c1RqTWF4OworCVVTSE9SVCB1c1Bvd2VyVHVuZURhdGFTZXRJ RDsKKwlVU0hPUlQgdXNFRENMaW1pdDsKKwlVU0hPUlQgdXNTb2Z0d2FyZVNodXRkb3duVGVtcDsK KwlVU0hPUlQgdXNDbG9ja1N0cmV0Y2hBbW91bnQ7CisJVVNIT1JUIHVzUmVzZXJ2ZVsyXTsKK30g QVRPTV9Ub25nYV9Qb3dlclR1bmVfVGFibGU7CisKK3R5cGVkZWYgc3RydWN0IF9BVE9NX0Zpamlf UG93ZXJUdW5lX1RhYmxlIHsKKwlVQ0hBUiAgdWNSZXZJZDsKKwlVU0hPUlQgdXNURFA7CisJVVNI T1JUIHVzQ29uZmlndXJhYmxlVERQOworCVVTSE9SVCB1c1REQzsKKwlVU0hPUlQgdXNCYXR0ZXJ5 UG93ZXJMaW1pdDsKKwlVU0hPUlQgdXNTbWFsbFBvd2VyTGltaXQ7CisJVVNIT1JUIHVzTG93Q0FD TGVha2FnZTsKKwlVU0hPUlQgdXNIaWdoQ0FDTGVha2FnZTsKKwlVU0hPUlQgdXNNYXhpbXVtUG93 ZXJEZWxpdmVyeUxpbWl0OworCVVTSE9SVCB1c1RqTWF4OyAgLyogRm9yIEZpamksIHRoaXMgaXMg YWxzbyB1c1RlbXBlcmF0dXJlTGltaXRFZGdlOyAqLworCVVTSE9SVCB1c1Bvd2VyVHVuZURhdGFT ZXRJRDsKKwlVU0hPUlQgdXNFRENMaW1pdDsKKwlVU0hPUlQgdXNTb2Z0d2FyZVNodXRkb3duVGVt cDsKKwlVU0hPUlQgdXNDbG9ja1N0cmV0Y2hBbW91bnQ7CisJVVNIT1JUIHVzVGVtcGVyYXR1cmVM aW1pdEhvdHNwb3Q7ICAvKlRoZSBmb2xsb3dpbmcgYXJlIGFkZGVkIGZvciBGaWppICovCisJVVNI T1JUIHVzVGVtcGVyYXR1cmVMaW1pdExpcXVpZDE7CisJVVNIT1JUIHVzVGVtcGVyYXR1cmVMaW1p dExpcXVpZDI7CisJVVNIT1JUIHVzVGVtcGVyYXR1cmVMaW1pdFZyVmRkYzsKKwlVU0hPUlQgdXNU ZW1wZXJhdHVyZUxpbWl0VnJNdmRkOworCVVTSE9SVCB1c1RlbXBlcmF0dXJlTGltaXRQbHg7CisJ VUNIQVIgIHVjTGlxdWlkMV9JMkNfYWRkcmVzczsgIC8qTGlxdWlkICovCisJVUNIQVIgIHVjTGlx dWlkMl9JMkNfYWRkcmVzczsKKwlVQ0hBUiAgdWNMaXF1aWRfSTJDX0xpbmU7CisJVUNIQVIgIHVj VnJfSTJDX2FkZHJlc3M7CS8qVlIgKi8KKwlVQ0hBUiAgdWNWcl9JMkNfTGluZTsKKwlVQ0hBUiAg dWNQbHhfSTJDX2FkZHJlc3M7ICAvKlBMWCAqLworCVVDSEFSICB1Y1BseF9JMkNfTGluZTsKKwlV U0hPUlQgdXNSZXNlcnZlZDsKK30gQVRPTV9GaWppX1Bvd2VyVHVuZV9UYWJsZTsKKworI2RlZmlu ZSBBVE9NX1BQTV9BX0EgICAgMQorI2RlZmluZSBBVE9NX1BQTV9BX0kgICAgMgordHlwZWRlZiBz dHJ1Y3QgX0FUT01fVG9uZ2FfUFBNX1RhYmxlIHsKKwlVQ0hBUiAgIHVjUmV2SWQ7CisJVUNIQVIg ICB1Y1BwbURlc2lnbjsJCSAgLypBK0kgb3IgQStBICovCisJVVNIT1JUICB1c0NwdUNvcmVOdW1i ZXI7CisJVUxPTkcgIHVsUGxhdGZvcm1URFA7CisJVUxPTkcgIHVsU21hbGxBQ1BsYXRmb3JtVERQ OworCVVMT05HICB1bFBsYXRmb3JtVERDOworCVVMT05HICB1bFNtYWxsQUNQbGF0Zm9ybVREQzsK KwlVTE9ORyAgdWxBcHVURFA7CisJVUxPTkcgIHVsREdwdVREUDsKKwlVTE9ORyAgdWxER3B1VWx2 UG93ZXI7CisJVUxPTkcgIHVsVGptYXg7Cit9IEFUT01fVG9uZ2FfUFBNX1RhYmxlOworCit0eXBl ZGVmIHN0cnVjdCBfQVRPTV9Ub25nYV9IYXJkX0xpbWl0X1JlY29yZCB7CisJVUxPTkcgIHVsU0NM S0xpbWl0OworCVVMT05HICB1bE1DTEtMaW1pdDsKKwlVU0hPUlQgIHVzVmRkY0xpbWl0OworCVVT SE9SVCAgdXNWZGRjaUxpbWl0OworCVVTSE9SVCAgdXNWZGRnZnhMaW1pdDsKK30gQVRPTV9Ub25n YV9IYXJkX0xpbWl0X1JlY29yZDsKKwordHlwZWRlZiBzdHJ1Y3QgX0FUT01fVG9uZ2FfSGFyZF9M aW1pdF9UYWJsZSB7CisJVUNIQVIgdWNSZXZJZDsKKwlVQ0hBUiB1Y051bUVudHJpZXM7CisJQVRP TV9Ub25nYV9IYXJkX0xpbWl0X1JlY29yZCBlbnRyaWVzWzFdOworfSBBVE9NX1RvbmdhX0hhcmRf TGltaXRfVGFibGU7CisKK3R5cGVkZWYgc3RydWN0IF9BVE9NX1RvbmdhX0dQSU9fVGFibGUgewor CVVDSEFSICB1Y1JldklkOworCVVDSEFSICB1Y1ZSSG90VHJpZ2dlcmVkU2Nsa0RwbUluZGV4OwkJ LyogSWYgVlJIb3Qgc2lnbmFsIGlzIHRyaWdnZXJlZCBTQ0xLIHdpbGwgYmUgbGltaXRlZCB0byB0 aGlzIERQTSBsZXZlbCAqLworCVVDSEFSICB1Y1Jlc2VydmVbNV07Cit9IEFUT01fVG9uZ2FfR1BJ T19UYWJsZTsKKwordHlwZWRlZiBzdHJ1Y3QgX1BQVGFibGVfR2VuZXJpY19TdWJUYWJsZV9IZWFk ZXIgeworCVVDSEFSICB1Y1JldklkOworfSBQUFRhYmxlX0dlbmVyaWNfU3ViVGFibGVfSGVhZGVy OworCisKKyNwcmFnbWEgcGFjayhwb3ApCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21nci90b25nYV9wcm9jZXNzcHB0YWJsZXMuYyBiL2Ry aXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2h3bWdyL3RvbmdhX3Byb2Nlc3NwcHRhYmxlcy5j Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYjAzYTAKLS0tIC9kZXYvbnVs bAorKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21nci90b25nYV9wcm9jZXNz cHB0YWJsZXMuYwpAQCAtMCwwICsxLDExMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBBZHZh bmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3Jh bnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkg b2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUg IlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0 aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwg Y29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAq IGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29u cyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0 IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0 IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgor ICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisg KgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkg T0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJ TUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBG T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5U IFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxF IEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJ TiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBG Uk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNF IE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisjaW5jbHVk ZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxp bnV4L2ZiLmg+CisKKyNpbmNsdWRlICJ0b25nYV9wcm9jZXNzcHB0YWJsZXMuaCIKKyNpbmNsdWRl ICJwcGF0b21jdHJsLmgiCisjaW5jbHVkZSAiYXRvbWJpb3MuaCIKKyNpbmNsdWRlICJwcF9kZWJ1 Zy5oIgorI2luY2x1ZGUgImh3bWdyLmgiCisjaW5jbHVkZSAiY2dzX2NvbW1vbi5oIgorI2luY2x1 ZGUgInRvbmdhX3BwdGFibGUuaCIKKworLyoqCisgKiBQcml2YXRlIEZ1bmN0aW9uIHVzZWQgZHVy aW5nIGluaXRpYWxpemF0aW9uLgorICogQHBhcmFtIGh3bWdyIFBvaW50ZXIgdG8gdGhlIGhhcmR3 YXJlIG1hbmFnZXIuCisgKiBAcGFyYW0gc2V0SXQgQSBmbGFnIGluZGljYXRpb24gaWYgdGhlIGNh cGFiaWxpdHkgc2hvdWxkIGJlIHNldCAoVFJVRSkgb3IgcmVzZXQgKEZBTFNFKS4KKyAqIEBwYXJh bSBjYXAgV2hpY2ggY2FwYWJpbGl0eSB0byBzZXQvcmVzZXQuCisgKi8KK3N0YXRpYyB2b2lkIHNl dF9od19jYXAoc3RydWN0IHBwX2h3bWdyICpod21nciwgYm9vbCBzZXRJdCwgZW51bSBwaG1fcGxh dGZvcm1fY2FwcyBjYXApCit7CisJaWYgKHNldEl0KQorCQlwaG1fY2FwX3NldChod21nci0+cGxh dGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsIGNhcCk7CisJZWxzZQorCQlwaG1fY2FwX3Vu c2V0KGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywgY2FwKTsKK30KKwor CisvKioKKyAqIFByaXZhdGUgRnVuY3Rpb24gdXNlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisg KiBAcGFyYW0gaHdtZ3IgUG9pbnRlciB0byB0aGUgaGFyZHdhcmUgbWFuYWdlci4KKyAqIEBwYXJh bSBwb3dlcnBsYXlfY2FwcyB0aGUgYml0IGFycmF5IChmcm9tIEJJT1MpIG9mIGNhcGFiaWxpdHkg Yml0cy4KKyAqIEBleGNlcHRpb24gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHJl dHVybnMgMS4KKyAqLworc3RhdGljIGludCBzZXRfcGxhdGZvcm1fY2FwcyhzdHJ1Y3QgcHBfaHdt Z3IgKmh3bWdyLCB1aW50MzJfdCBwb3dlcnBsYXlfY2FwcykKK3sKKwlQUF9BU1NFUlRfV0lUSF9D T0RFKCh+cG93ZXJwbGF5X2NhcHMgJiBfX19fUkVUSVJFMTZfX19fKSwKKwkJIkFUT01fUFBfUExB VEZPUk1fQ0FQX0FTUE1fTDEgaXMgbm90IHN1cHBvcnRlZCEiLCBjb250aW51ZSk7CisJUFBfQVNT RVJUX1dJVEhfQ09ERSgofnBvd2VycGxheV9jYXBzICYgX19fX1JFVElSRTY0X19fXyksCisJCSJB VE9NX1BQX1BMQVRGT1JNX0NBUF9HRU1JTklQUklNQVJZIGlzIG5vdCBzdXBwb3J0ZWQhIiwgY29u dGludWUpOworCVBQX0FTU0VSVF9XSVRIX0NPREUoKH5wb3dlcnBsYXlfY2FwcyAmIF9fX19SRVRJ UkU1MTJfX19fKSwKKwkJIkFUT01fUFBfUExBVEZPUk1fQ0FQX1NJREVQT1JUQ09OVFJPTCBpcyBu b3Qgc3VwcG9ydGVkISIsIGNvbnRpbnVlKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKCh+cG93ZXJw bGF5X2NhcHMgJiBfX19fUkVUSVJFMTAyNF9fX18pLAorCQkiQVRPTV9QUF9QTEFURk9STV9DQVBf VFVSTk9GRlBMTF9BU1BNTDEgaXMgbm90IHN1cHBvcnRlZCEiLCBjb250aW51ZSk7CisJUFBfQVNT RVJUX1dJVEhfQ09ERSgofnBvd2VycGxheV9jYXBzICYgX19fX1JFVElSRTIwNDhfX19fKSwKKwkJ IkFUT01fUFBfUExBVEZPUk1fQ0FQX0hUTElOS0NPTlRST0wgaXMgbm90IHN1cHBvcnRlZCEiLCBj b250aW51ZSk7CisKKwlzZXRfaHdfY2FwKAorCQkJaHdtZ3IsCisJCQkwICE9IChwb3dlcnBsYXlf Y2FwcyAmIEFUT01fVE9OR0FfUFBfUExBVEZPUk1fQ0FQX1BPV0VSUExBWSksCisJCQlQSE1fUGxh dGZvcm1DYXBzX1Bvd2VyUGxheVN1cHBvcnQKKwkJICApOworCisJc2V0X2h3X2NhcCgKKwkJCWh3 bWdyLAorCQkJMCAhPSAocG93ZXJwbGF5X2NhcHMgJiBBVE9NX1RPTkdBX1BQX1BMQVRGT1JNX0NB UF9TQklPU1BPV0VSU09VUkNFKSwKKwkJCVBITV9QbGF0Zm9ybUNhcHNfQmlvc1Bvd2VyU291cmNl Q29udHJvbAorCQkgICk7CisKKwlzZXRfaHdfY2FwKAorCQkJaHdtZ3IsCisJCQkwICE9IChwb3dl cnBsYXlfY2FwcyAmIEFUT01fVE9OR0FfUFBfUExBVEZPUk1fQ0FQX0hBUkRXQVJFREMpLAorCQkJ UEhNX1BsYXRmb3JtQ2Fwc19BdXRvbWF0aWNEQ1RyYW5zaXRpb24KKwkJICApOworCisJc2V0X2h3 X2NhcCgKKwkJCWh3bWdyLAorCQkJMCAhPSAocG93ZXJwbGF5X2NhcHMgJiBBVE9NX1RPTkdBX1BQ X1BMQVRGT1JNX0NBUF9NVkREX0NPTlRST0wpLAorCQkJUEhNX1BsYXRmb3JtQ2Fwc19FbmFibGVN VkREQ29udHJvbAorCQkgICk7CisKKwlzZXRfaHdfY2FwKAorCQkJaHdtZ3IsCisJCQkwICE9IChw b3dlcnBsYXlfY2FwcyAmIEFUT01fVE9OR0FfUFBfUExBVEZPUk1fQ0FQX1ZERENJX0NPTlRST0wp LAorCQkJUEhNX1BsYXRmb3JtQ2Fwc19Db250cm9sVkREQ0kKKwkJICApOworCisJc2V0X2h3X2Nh cCgKKwkJCWh3bWdyLAorCQkJMCAhPSAocG93ZXJwbGF5X2NhcHMgJiBBVE9NX1RPTkdBX1BQX1BM QVRGT1JNX0NBUF9WRERHRlhfQ09OVFJPTCksCisJCQlQSE1fUGxhdGZvcm1DYXBzX0NvbnRyb2xW RERHRlgKKwkJICApOworCisJc2V0X2h3X2NhcCgKKwkJCWh3bWdyLAorCQkJMCAhPSAocG93ZXJw bGF5X2NhcHMgJiBBVE9NX1RPTkdBX1BQX1BMQVRGT1JNX0NBUF9CQUNPKSwKKwkJCVBITV9QbGF0 Zm9ybUNhcHNfQkFDTworCQkgICk7CisKKwlzZXRfaHdfY2FwKAorCQkJaHdtZ3IsCisJCQkwICE9 IChwb3dlcnBsYXlfY2FwcyAmIEFUT01fVE9OR0FfUFBfUExBVEZPUk1fQ0FQX0RJU0FCTEVfVk9M VEFHRV9JU0xBTkQpLAorCQkJUEhNX1BsYXRmb3JtQ2Fwc19EaXNhYmxlVm9sdGFnZUlzbGFuZAor CQkgICk7CisKKwlzZXRfaHdfY2FwKAorCQkJaHdtZ3IsCisJCQkwICE9IChwb3dlcnBsYXlfY2Fw cyAmIEFUT01fVE9OR0FfUFBfUExBVEZPUk1fQ09NQklORV9QQ0NfV0lUSF9USEVSTUFMX1NJR05B TCksCisJCQlQSE1fUGxhdGZvcm1DYXBzX0NvbWJpbmVQQ0NXaXRoVGhlcm1hbFNpZ25hbAorCQkg ICk7CisKKwlzZXRfaHdfY2FwKAorCQkJaHdtZ3IsCisJCQkwICE9IChwb3dlcnBsYXlfY2FwcyAm IEFUT01fVE9OR0FfUExBVEZPUk1fTE9BRF9QT1NUX1BST0RVQ1RJT05fRklSTVdBUkUpLAorCQkJ UEhNX1BsYXRmb3JtQ2Fwc19Mb2FkUG9zdFByb2R1Y3Rpb25GaXJtd2FyZQorCQkgICk7CisKKwly ZXR1cm4gMDsKK30KKworLyoqCisgKiBQcml2YXRlIEZ1bmN0aW9uIHRvIGdldCB0aGUgUG93ZXJQ bGF5IFRhYmxlIEFkZHJlc3MuCisgKi8KK2NvbnN0IHZvaWQgKmdldF9wb3dlcnBsYXlfdGFibGUo c3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwlpbnQgaW5kZXggPSBHZXRJbmRleEludG9NYXN0 ZXJUYWJsZShEQVRBLCBQb3dlclBsYXlJbmZvKTsKKworCXUxNiBzaXplOworCXU4IGZyZXYsIGNy ZXY7CisJdm9pZCAqdGFibGVfYWRkcmVzczsKKworCXRhYmxlX2FkZHJlc3MgPSAoQVRPTV9Ub25n YV9QT1dFUlBMQVlUQUJMRSAqKQorCQljZ3NfYXRvbV9nZXRfZGF0YV90YWJsZShod21nci0+ZGV2 aWNlLCBpbmRleCwgJnNpemUsICZmcmV2LCAmY3Jldik7CisKKwlod21nci0+c29mdF9wcF90YWJs ZSA9IHRhYmxlX2FkZHJlc3M7CS8qQ2FjaGUgdGhlIHJlc3VsdCBpbiBSQU0uKi8KKworCXJldHVy biB0YWJsZV9hZGRyZXNzOworfQorCitzdGF0aWMgaW50IGdldF92ZGRjX2xvb2t1cF90YWJsZSgK KwkJc3RydWN0IHBwX2h3bWdyCSpod21nciwKKwkJcGhtX3BwdF92MV92b2x0YWdlX2xvb2t1cF90 YWJsZQkqKmxvb2t1cF90YWJsZSwKKwkJY29uc3QgQVRPTV9Ub25nYV9Wb2x0YWdlX0xvb2t1cF9U YWJsZQkqdmRkY19sb29rdXBfcHBfdGFibGVzLAorCQl1aW50MzJfdAltYXhfbGV2ZWxzCisJCSkK K3sKKwl1aW50MzJfdCB0YWJsZV9zaXplLCBpOworCXBobV9wcHRfdjFfdm9sdGFnZV9sb29rdXBf dGFibGUgKnRhYmxlOworCisJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCAhPSB2ZGRjX2xvb2t1cF9w cF90YWJsZXMtPnVjTnVtRW50cmllcyksCisJCSJJbnZhbGlkIENBQyBMZWFrYWdlIFBvd2VyUGxh eSBUYWJsZSEiLCByZXR1cm4gMSk7CisKKwl0YWJsZV9zaXplID0gc2l6ZW9mKHVpbnQzMl90KSAr CisJCXNpemVvZihwaG1fcHB0X3YxX3ZvbHRhZ2VfbG9va3VwX3JlY29yZCkgKiBtYXhfbGV2ZWxz OworCisJdGFibGUgPSAocGhtX3BwdF92MV92b2x0YWdlX2xvb2t1cF90YWJsZSAqKQorCQlremFs bG9jKHRhYmxlX3NpemUsIEdGUF9LRVJORUwpOworCisJaWYgKE5VTEwgPT0gdGFibGUpCisJCXJl dHVybiAtMTsKKworCW1lbXNldCh0YWJsZSwgMHgwMCwgdGFibGVfc2l6ZSk7CisKKwl0YWJsZS0+ Y291bnQgPSB2ZGRjX2xvb2t1cF9wcF90YWJsZXMtPnVjTnVtRW50cmllczsKKworCWZvciAoaSA9 IDA7IGkgPCB2ZGRjX2xvb2t1cF9wcF90YWJsZXMtPnVjTnVtRW50cmllczsgaSsrKSB7CisJCXRh YmxlLT5lbnRyaWVzW2ldLnVzX2NhbGN1bGF0ZWQgPSAwOworCQl0YWJsZS0+ZW50cmllc1tpXS51 c192ZGQgPQorCQkJdmRkY19sb29rdXBfcHBfdGFibGVzLT5lbnRyaWVzW2ldLnVzVmRkOworCQl0 YWJsZS0+ZW50cmllc1tpXS51c19jYWNfbG93ID0KKwkJCXZkZGNfbG9va3VwX3BwX3RhYmxlcy0+ ZW50cmllc1tpXS51c0NBQ0xvdzsKKwkJdGFibGUtPmVudHJpZXNbaV0udXNfY2FjX21pZCA9CisJ CQl2ZGRjX2xvb2t1cF9wcF90YWJsZXMtPmVudHJpZXNbaV0udXNDQUNNaWQ7CisJCXRhYmxlLT5l bnRyaWVzW2ldLnVzX2NhY19oaWdoID0KKwkJCXZkZGNfbG9va3VwX3BwX3RhYmxlcy0+ZW50cmll c1tpXS51c0NBQ0hpZ2g7CisJfQorCisJKmxvb2t1cF90YWJsZSA9IHRhYmxlOworCisJcmV0dXJu IDA7Cit9CisKKy8qKgorICogUHJpdmF0ZSBGdW5jdGlvbiB1c2VkIGR1cmluZyBpbml0aWFsaXph dGlvbi4KKyAqIEluaXRpYWxpemUgUGxhdGZvcm0gUG93ZXIgTWFuYWdlbWVudCBQYXJhbWV0ZXIg dGFibGUKKyAqIEBwYXJhbSBod21nciBQb2ludGVyIHRvIHRoZSBoYXJkd2FyZSBtYW5hZ2VyLgor ICogQHBhcmFtIGF0b21fcHBtX3RhYmxlIFBvaW50ZXIgdG8gUFBNIHRhYmxlIGluIFZCSU9TCisg Ki8KK3N0YXRpYyBpbnQgZ2V0X3BsYXRmb3JtX3Bvd2VyX21hbmFnZW1lbnRfdGFibGUoCisJCXN0 cnVjdCBwcF9od21nciAqaHdtZ3IsCisJCUFUT01fVG9uZ2FfUFBNX1RhYmxlICphdG9tX3BwbV90 YWJsZSkKK3sKKwlzdHJ1Y3QgcGhtX3BwbV90YWJsZSAqcHRyID0ga3phbGxvYyhzaXplb2YoQVRP TV9Ub25nYV9QUE1fVGFibGUpLCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgcGhtX3BwdF92MV9pbmZv cm1hdGlvbiAqcHBfdGFibGVfaW5mb3JtYXRpb24gPQorCQkoc3RydWN0IHBobV9wcHRfdjFfaW5m b3JtYXRpb24gKikoaHdtZ3ItPnBwdGFibGUpOworCisJaWYgKE5VTEwgPT0gcHRyKQorCQlyZXR1 cm4gLTE7CisKKwlwdHItPnBwbV9kZXNpZ24KKwkJPSBhdG9tX3BwbV90YWJsZS0+dWNQcG1EZXNp Z247CisJcHRyLT5jcHVfY29yZV9udW1iZXIKKwkJPSBhdG9tX3BwbV90YWJsZS0+dXNDcHVDb3Jl TnVtYmVyOworCXB0ci0+cGxhdGZvcm1fdGRwCisJCT0gYXRvbV9wcG1fdGFibGUtPnVsUGxhdGZv cm1URFA7CisJcHRyLT5zbWFsbF9hY19wbGF0Zm9ybV90ZHAKKwkJPSBhdG9tX3BwbV90YWJsZS0+ dWxTbWFsbEFDUGxhdGZvcm1URFA7CisJcHRyLT5wbGF0Zm9ybV90ZGMKKwkJPSBhdG9tX3BwbV90 YWJsZS0+dWxQbGF0Zm9ybVREQzsKKwlwdHItPnNtYWxsX2FjX3BsYXRmb3JtX3RkYworCQk9IGF0 b21fcHBtX3RhYmxlLT51bFNtYWxsQUNQbGF0Zm9ybVREQzsKKwlwdHItPmFwdV90ZHAKKwkJPSBh dG9tX3BwbV90YWJsZS0+dWxBcHVURFA7CisJcHRyLT5kZ3B1X3RkcAorCQk9IGF0b21fcHBtX3Rh YmxlLT51bERHcHVURFA7CisJcHRyLT5kZ3B1X3Vsdl9wb3dlcgorCQk9IGF0b21fcHBtX3RhYmxl LT51bERHcHVVbHZQb3dlcjsKKwlwdHItPnRqX21heAorCQk9IGF0b21fcHBtX3RhYmxlLT51bFRq bWF4OworCisJcHBfdGFibGVfaW5mb3JtYXRpb24tPnBwbV9wYXJhbWV0ZXJfdGFibGUgPSBwdHI7 CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBQcml2YXRlIEZ1bmN0aW9uIHVzZWQgZHVyaW5n IGluaXRpYWxpemF0aW9uLgorICogSW5pdGlhbGl6ZSBURFAgbGltaXRzIGZvciBEUE0yCisgKiBA cGFyYW0gaHdtZ3IgUG9pbnRlciB0byB0aGUgaGFyZHdhcmUgbWFuYWdlci4KKyAqIEBwYXJhbSBw b3dlcnBsYXlfdGFibGUgUG9pbnRlciB0byB0aGUgUG93ZXJQbGF5IFRhYmxlLgorICovCitzdGF0 aWMgaW50IGluaXRfZHBtXzJfcGFyYW1ldGVycygKKwkJc3RydWN0IHBwX2h3bWdyICpod21nciwK KwkJY29uc3QgQVRPTV9Ub25nYV9QT1dFUlBMQVlUQUJMRSAqcG93ZXJwbGF5X3RhYmxlCisJCSkK K3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqcHBf dGFibGVfaW5mb3JtYXRpb24gPSAoc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKikoaHdt Z3ItPnBwdGFibGUpOworCUFUT01fVG9uZ2FfUFBNX1RhYmxlICphdG9tX3BwbV90YWJsZTsKKwl1 aW50MzJfdCBkaXNhYmxlX3BwbSA9IDA7CisJdWludDMyX3QgZGlzYWJsZV9wb3dlcl9jb250cm9s ID0gMDsKKworCXBwX3RhYmxlX2luZm9ybWF0aW9uLT51c191bHZfdm9sdGFnZV9vZmZzZXQgPQor CQlsZTE2X3RvX2NwdShwb3dlcnBsYXlfdGFibGUtPnVzVWx2Vm9sdGFnZU9mZnNldCk7CisKKwlw cF90YWJsZV9pbmZvcm1hdGlvbi0+cHBtX3BhcmFtZXRlcl90YWJsZSA9IE5VTEw7CisJcHBfdGFi bGVfaW5mb3JtYXRpb24tPnZkZGNfbG9va3VwX3RhYmxlID0gTlVMTDsKKwlwcF90YWJsZV9pbmZv cm1hdGlvbi0+dmRkZ2Z4X2xvb2t1cF90YWJsZSA9IE5VTEw7CisJLyogVERQIGxpbWl0cyAqLwor CWh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLlREUE9ETGltaXQgPQorCQlsZTE2X3RvX2NwdShw b3dlcnBsYXlfdGFibGUtPnVzUG93ZXJDb250cm9sTGltaXQpOworCWh3bWdyLT5wbGF0Zm9ybV9k ZXNjcmlwdG9yLlREUEFkanVzdG1lbnQgPSAwOworCWh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9y LlZpZEFkanVzdG1lbnQgPSAwOworCWh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLlZpZEFkanVz dG1lbnRQb2xhcml0eSA9IDA7CisJaHdtZ3ItPnBsYXRmb3JtX2Rlc2NyaXB0b3IuVmlkTWluTGlt aXQgPSAwOworCWh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLlZpZE1heExpbWl0ID0gMTUwMDAw MDsKKwlod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5WaWRTdGVwID0gNjI1MDsKKworCWRpc2Fi bGVfcG93ZXJfY29udHJvbCA9IDA7CisJaWYgKDAgPT0gZGlzYWJsZV9wb3dlcl9jb250cm9sKSB7 CisJCS8qIGVuYWJsZSBURFAgb3ZlcmRyaXZlIChQb3dlckNvbnRyb2wpIGZlYXR1cmUgYXMgd2Vs bCBpZiBzdXBwb3J0ZWQgKi8KKwkJaWYgKGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLlREUE9E TGltaXQgIT0gMCkKKwkJCXBobV9jYXBfc2V0KGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLnBs YXRmb3JtQ2FwcywKKwkJCVBITV9QbGF0Zm9ybUNhcHNfUG93ZXJDb250cm9sKTsKKwl9CisKKwlp ZiAoMCAhPSBwb3dlcnBsYXlfdGFibGUtPnVzVmRkY0xvb2t1cFRhYmxlT2Zmc2V0KSB7CisJCWNv bnN0IEFUT01fVG9uZ2FfVm9sdGFnZV9Mb29rdXBfVGFibGUgKnBWZGRjQ0FDVGFibGUgPQorCQkJ KEFUT01fVG9uZ2FfVm9sdGFnZV9Mb29rdXBfVGFibGUgKikoKCh1bnNpZ25lZCBsb25nKXBvd2Vy cGxheV90YWJsZSkgKworCQkJbGUxNl90b19jcHUocG93ZXJwbGF5X3RhYmxlLT51c1ZkZGNMb29r dXBUYWJsZU9mZnNldCkpOworCisJCXJlc3VsdCA9IGdldF92ZGRjX2xvb2t1cF90YWJsZShod21n ciwKKwkJCSZwcF90YWJsZV9pbmZvcm1hdGlvbi0+dmRkY19sb29rdXBfdGFibGUsIHBWZGRjQ0FD VGFibGUsIDE2KTsKKwl9CisKKwlpZiAoMCAhPSBwb3dlcnBsYXlfdGFibGUtPnVzVmRkZ2Z4TG9v a3VwVGFibGVPZmZzZXQpIHsKKwkJY29uc3QgQVRPTV9Ub25nYV9Wb2x0YWdlX0xvb2t1cF9UYWJs ZSAqcFZkZGdmeENBQ1RhYmxlID0KKwkJCShBVE9NX1RvbmdhX1ZvbHRhZ2VfTG9va3VwX1RhYmxl ICopKCgodW5zaWduZWQgbG9uZylwb3dlcnBsYXlfdGFibGUpICsKKwkJCWxlMTZfdG9fY3B1KHBv d2VycGxheV90YWJsZS0+dXNWZGRnZnhMb29rdXBUYWJsZU9mZnNldCkpOworCisJCXJlc3VsdCA9 IGdldF92ZGRjX2xvb2t1cF90YWJsZShod21nciwKKwkJCSZwcF90YWJsZV9pbmZvcm1hdGlvbi0+ dmRkZ2Z4X2xvb2t1cF90YWJsZSwgcFZkZGdmeENBQ1RhYmxlLCAxNik7CisJfQorCisJZGlzYWJs ZV9wcG0gPSAwOworCWlmICgwID09IGRpc2FibGVfcHBtKSB7CisJCWF0b21fcHBtX3RhYmxlID0g KEFUT01fVG9uZ2FfUFBNX1RhYmxlICopCisJCQkoKCh1bnNpZ25lZCBsb25nKXBvd2VycGxheV90 YWJsZSkgKyBsZTE2X3RvX2NwdShwb3dlcnBsYXlfdGFibGUtPnVzUFBNVGFibGVPZmZzZXQpKTsK KworCQlpZiAoMCAhPSBwb3dlcnBsYXlfdGFibGUtPnVzUFBNVGFibGVPZmZzZXQpIHsKKwkJCWlm ICgxID09IGdldF9wbGF0Zm9ybV9wb3dlcl9tYW5hZ2VtZW50X3RhYmxlKGh3bWdyLCBhdG9tX3Bw bV90YWJsZSkpIHsKKwkJCQlwaG1fY2FwX3NldChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5w bGF0Zm9ybUNhcHMsCisJCQkJCVBITV9QbGF0Zm9ybUNhcHNfRW5hYmxlUGxhdGZvcm1Qb3dlck1h bmFnZW1lbnQpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGlj IGludCBnZXRfdmFsaWRfY2xrKAorCQlzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLAorCQlzdHJ1Y3Qg cGhtX2Nsb2NrX2FycmF5ICoqY2xrX3RhYmxlLAorCQljb25zdCBwaG1fcHB0X3YxX2Nsb2NrX3Zv bHRhZ2VfZGVwZW5kZW5jeV90YWJsZSAgKiBjbGtfdm9sdF9wcF90YWJsZQorCQkpCit7CisJdWlu dDMyX3QgdGFibGVfc2l6ZSwgaTsKKwlzdHJ1Y3QgcGhtX2Nsb2NrX2FycmF5ICp0YWJsZTsKKwor CVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgIT0gY2xrX3ZvbHRfcHBfdGFibGUtPmNvdW50KSwKKwkJ IkludmFsaWQgUG93ZXJQbGF5IFRhYmxlISIsIHJldHVybiAtMSk7CisKKwl0YWJsZV9zaXplID0g c2l6ZW9mKHVpbnQzMl90KSArCisJCXNpemVvZih1aW50MzJfdCkgKiBjbGtfdm9sdF9wcF90YWJs ZS0+Y291bnQ7CisKKwl0YWJsZSA9IChzdHJ1Y3QgcGhtX2Nsb2NrX2FycmF5ICopa3phbGxvYyh0 YWJsZV9zaXplLCBHRlBfS0VSTkVMKTsKKworCWlmIChOVUxMID09IHRhYmxlKQorCQlyZXR1cm4g LTE7CisKKwltZW1zZXQodGFibGUsIDB4MDAsIHRhYmxlX3NpemUpOworCisJdGFibGUtPmNvdW50 ID0gKHVpbnQzMl90KWNsa192b2x0X3BwX3RhYmxlLT5jb3VudDsKKworCWZvciAoaSA9IDA7IGkg PCB0YWJsZS0+Y291bnQ7IGkrKykKKwkJdGFibGUtPnZhbHVlc1tpXSA9ICh1aW50MzJfdCljbGtf dm9sdF9wcF90YWJsZS0+ZW50cmllc1tpXS5jbGs7CisKKwkqY2xrX3RhYmxlID0gdGFibGU7CisK KwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfaGFyZF9saW1pdHMoCisJCXN0cnVjdCBw cF9od21nciAqaHdtZ3IsCisJCXN0cnVjdCBwaG1fY2xvY2tfYW5kX3ZvbHRhZ2VfbGltaXRzICps aW1pdHMsCisJCWNvbnN0IEFUT01fVG9uZ2FfSGFyZF9MaW1pdF9UYWJsZSAqIGxpbWl0YWJsZQor CQkpCit7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCAhPSBsaW1pdGFibGUtPnVjTnVtRW50cmll cyksICJJbnZhbGlkIFBvd2VyUGxheSBUYWJsZSEiLCByZXR1cm4gLTEpOworCisJLyogY3VycmVu dGx5IHdlIGFsd2F5cyB0YWtlIGVudHJpZXNbMF0gcGFyYW1ldGVycyAqLworCWxpbWl0cy0+c2Ns ayA9ICh1aW50MzJfdClsaW1pdGFibGUtPmVudHJpZXNbMF0udWxTQ0xLTGltaXQ7CisJbGltaXRz LT5tY2xrID0gKHVpbnQzMl90KWxpbWl0YWJsZS0+ZW50cmllc1swXS51bE1DTEtMaW1pdDsKKwls aW1pdHMtPnZkZGMgPSAodWludDE2X3QpbGltaXRhYmxlLT5lbnRyaWVzWzBdLnVzVmRkY0xpbWl0 OworCWxpbWl0cy0+dmRkY2kgPSAodWludDE2X3QpbGltaXRhYmxlLT5lbnRyaWVzWzBdLnVzVmRk Y2lMaW1pdDsKKwlsaW1pdHMtPnZkZGdmeCA9ICh1aW50MTZfdClsaW1pdGFibGUtPmVudHJpZXNb MF0udXNWZGRnZnhMaW1pdDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9tY2xr X3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZSgKKwkJc3RydWN0IHBwX2h3bWdyICpod21nciwKKwkJ cGhtX3BwdF92MV9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUgKipwcF90b25nYV9tY2xr X2RlcF90YWJsZSwKKwkJY29uc3QgQVRPTV9Ub25nYV9NQ0xLX0RlcGVuZGVuY3lfVGFibGUgKiBt Y2xrX2RlcF90YWJsZQorCQkpCit7CisJdWludDMyX3QgdGFibGVfc2l6ZSwgaTsKKwlwaG1fcHB0 X3YxX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZSAqbWNsa190YWJsZTsKKworCVBQX0FT U0VSVF9XSVRIX0NPREUoKDAgIT0gbWNsa19kZXBfdGFibGUtPnVjTnVtRW50cmllcyksCisJCSJJ bnZhbGlkIFBvd2VyUGxheSBUYWJsZSEiLCByZXR1cm4gLTEpOworCisJdGFibGVfc2l6ZSA9IHNp emVvZih1aW50MzJfdCkgKyBzaXplb2YocGhtX3BwdF92MV9jbG9ja192b2x0YWdlX2RlcGVuZGVu Y3lfcmVjb3JkKQorCQkqIG1jbGtfZGVwX3RhYmxlLT51Y051bUVudHJpZXM7CisKKwltY2xrX3Rh YmxlID0gKHBobV9wcHRfdjFfY2xvY2tfdm9sdGFnZV9kZXBlbmRlbmN5X3RhYmxlICopCisJCWt6 YWxsb2ModGFibGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoTlVMTCA9PSBtY2xrX3RhYmxl KQorCQlyZXR1cm4gLTE7CisKKwltZW1zZXQobWNsa190YWJsZSwgMHgwMCwgdGFibGVfc2l6ZSk7 CisKKwltY2xrX3RhYmxlLT5jb3VudCA9ICh1aW50MzJfdCltY2xrX2RlcF90YWJsZS0+dWNOdW1F bnRyaWVzOworCisJZm9yIChpID0gMDsgaSA8IG1jbGtfZGVwX3RhYmxlLT51Y051bUVudHJpZXM7 IGkrKykgeworCQltY2xrX3RhYmxlLT5lbnRyaWVzW2ldLnZkZEluZCA9CisJCQltY2xrX2RlcF90 YWJsZS0+ZW50cmllc1tpXS51Y1ZkZGNJbmQ7CisJCW1jbGtfdGFibGUtPmVudHJpZXNbaV0udmRk X29mZnNldCA9CisJCQltY2xrX2RlcF90YWJsZS0+ZW50cmllc1tpXS51c1ZkZGdmeE9mZnNldDsK KwkJbWNsa190YWJsZS0+ZW50cmllc1tpXS52ZGRjaSA9CisJCQltY2xrX2RlcF90YWJsZS0+ZW50 cmllc1tpXS51c1ZkZGNpOworCQltY2xrX3RhYmxlLT5lbnRyaWVzW2ldLm12ZGQgPQorCQkJbWNs a19kZXBfdGFibGUtPmVudHJpZXNbaV0udXNNdmRkOworCQltY2xrX3RhYmxlLT5lbnRyaWVzW2ld LmNsayA9CisJCQltY2xrX2RlcF90YWJsZS0+ZW50cmllc1tpXS51bE1jbGs7CisJfQorCisJKnBw X3RvbmdhX21jbGtfZGVwX3RhYmxlID0gbWNsa190YWJsZTsKKworCXJldHVybiAwOworfQorCitz dGF0aWMgaW50IGdldF9zY2xrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZSgKKwkJc3RydWN0IHBw X2h3bWdyICpod21nciwKKwkJcGhtX3BwdF92MV9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFi bGUgKipwcF90b25nYV9zY2xrX2RlcF90YWJsZSwKKwkJY29uc3QgQVRPTV9Ub25nYV9TQ0xLX0Rl cGVuZGVuY3lfVGFibGUgKiBzY2xrX2RlcF90YWJsZQorCQkpCit7CisJdWludDMyX3QgdGFibGVf c2l6ZSwgaTsKKwlwaG1fcHB0X3YxX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZSAqc2Ns a190YWJsZTsKKworCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgIT0gc2Nsa19kZXBfdGFibGUtPnVj TnVtRW50cmllcyksCisJCSJJbnZhbGlkIFBvd2VyUGxheSBUYWJsZSEiLCByZXR1cm4gLTEpOwor CisJdGFibGVfc2l6ZSA9IHNpemVvZih1aW50MzJfdCkgKyBzaXplb2YocGhtX3BwdF92MV9jbG9j a192b2x0YWdlX2RlcGVuZGVuY3lfcmVjb3JkKQorCQkqIHNjbGtfZGVwX3RhYmxlLT51Y051bUVu dHJpZXM7CisKKwlzY2xrX3RhYmxlID0gKHBobV9wcHRfdjFfY2xvY2tfdm9sdGFnZV9kZXBlbmRl bmN5X3RhYmxlICopCisJCWt6YWxsb2ModGFibGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAo TlVMTCA9PSBzY2xrX3RhYmxlKQorCQlyZXR1cm4gLTE7CisKKwltZW1zZXQoc2Nsa190YWJsZSwg MHgwMCwgdGFibGVfc2l6ZSk7CisKKwlzY2xrX3RhYmxlLT5jb3VudCA9ICh1aW50MzJfdClzY2xr X2RlcF90YWJsZS0+dWNOdW1FbnRyaWVzOworCisJZm9yIChpID0gMDsgaSA8IHNjbGtfZGVwX3Rh YmxlLT51Y051bUVudHJpZXM7IGkrKykgeworCQlzY2xrX3RhYmxlLT5lbnRyaWVzW2ldLnZkZElu ZCA9CisJCQlzY2xrX2RlcF90YWJsZS0+ZW50cmllc1tpXS51Y1ZkZEluZDsKKwkJc2Nsa190YWJs ZS0+ZW50cmllc1tpXS52ZGRfb2Zmc2V0ID0KKwkJCXNjbGtfZGVwX3RhYmxlLT5lbnRyaWVzW2ld LnVzVmRkY09mZnNldDsKKwkJc2Nsa190YWJsZS0+ZW50cmllc1tpXS5jbGsgPQorCQkJc2Nsa19k ZXBfdGFibGUtPmVudHJpZXNbaV0udWxTY2xrOworCQlzY2xrX3RhYmxlLT5lbnRyaWVzW2ldLmNr c19lbmFibGUgPQorCQkJKCgoc2Nsa19kZXBfdGFibGUtPmVudHJpZXNbaV0udWNDS1NWT2Zmc2V0 YW5kRGlzYWJsZSAmIDB4ODApID4+IDcpID09IDApID8gMSA6IDA7CisJCXNjbGtfdGFibGUtPmVu dHJpZXNbaV0uY2tzX3ZvZmZzZXQgPQorCQkJKHNjbGtfZGVwX3RhYmxlLT5lbnRyaWVzW2ldLnVj Q0tTVk9mZnNldGFuZERpc2FibGUgJiAweDdGKTsKKwl9CisKKwkqcHBfdG9uZ2Ffc2Nsa19kZXBf dGFibGUgPSBzY2xrX3RhYmxlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3Bj aWVfdGFibGUoCisJCXN0cnVjdCBwcF9od21nciAqaHdtZ3IsCisJCXBobV9wcHRfdjFfcGNpZV90 YWJsZSAqKnBwX3RvbmdhX3BjaWVfdGFibGUsCisJCWNvbnN0IEFUT01fVG9uZ2FfUENJRV9UYWJs ZSAqIGF0b21fcGNpZV90YWJsZQorCQkpCit7CisJdWludDMyX3QgdGFibGVfc2l6ZSwgaSwgcGNp ZV9jb3VudDsKKwlwaG1fcHB0X3YxX3BjaWVfdGFibGUgKnBjaWVfdGFibGU7CisJc3RydWN0IHBo bV9wcHRfdjFfaW5mb3JtYXRpb24gKnBwX3RhYmxlX2luZm9ybWF0aW9uID0KKwkJKHN0cnVjdCBw aG1fcHB0X3YxX2luZm9ybWF0aW9uICopKGh3bWdyLT5wcHRhYmxlKTsKKwlQUF9BU1NFUlRfV0lU SF9DT0RFKCgwICE9IGF0b21fcGNpZV90YWJsZS0+dWNOdW1FbnRyaWVzKSwKKwkJIkludmFsaWQg UG93ZXJQbGF5IFRhYmxlISIsIHJldHVybiAtMSk7CisKKwl0YWJsZV9zaXplID0gc2l6ZW9mKHVp bnQzMl90KSArCisJCXNpemVvZihwaG1fcHB0X3YxX3BjaWVfcmVjb3JkKSAqIGF0b21fcGNpZV90 YWJsZS0+dWNOdW1FbnRyaWVzOworCisJcGNpZV90YWJsZSA9IChwaG1fcHB0X3YxX3BjaWVfdGFi bGUgKilremFsbG9jKHRhYmxlX3NpemUsIEdGUF9LRVJORUwpOworCisJaWYgKE5VTEwgPT0gcGNp ZV90YWJsZSkKKwkJcmV0dXJuIC0xOworCisJbWVtc2V0KHBjaWVfdGFibGUsIDB4MDAsIHRhYmxl X3NpemUpOworCisJLyoKKwkqIE1ha2Ugc3VyZSB0aGUgbnVtYmVyIG9mIHBjaWUgZW50cmllcyBh cmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHNjbGsgZHBtIGxldmVscy4KKwkqIFNpbmNlIGZpcnN0 IFBDSUUgZW50cnkgaXMgZm9yIFVMViwgI3BjaWUgaGFzIHRvIGJlIDw9IFNjbGtMZXZlbCArIDEu CisJKi8KKwlwY2llX2NvdW50ID0gKHBwX3RhYmxlX2luZm9ybWF0aW9uLT52ZGRfZGVwX29uX3Nj bGstPmNvdW50KSArIDE7CisJaWYgKCh1aW50MzJfdClhdG9tX3BjaWVfdGFibGUtPnVjTnVtRW50 cmllcyA8PSBwY2llX2NvdW50KQorCQlwY2llX2NvdW50ID0gKHVpbnQzMl90KWF0b21fcGNpZV90 YWJsZS0+dWNOdW1FbnRyaWVzOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJbIHBvd2VycGxh eSBdIE51bWJlciBvZiBQY2llIEVudHJpZXMgZXhjZWVkIHRoZSBudW1iZXIgb2YgU0NMSyBEcG0g TGV2ZWxzISBcCisJCURpc3JlZ2FyZGluZyB0aGUgZXhjZXNzIGVudHJpZXMuLi4gXG4iKTsKKwor CXBjaWVfdGFibGUtPmNvdW50ID0gcGNpZV9jb3VudDsKKworCWZvciAoaSA9IDA7IGkgPCBwY2ll X2NvdW50OyBpKyspIHsKKwkJcGNpZV90YWJsZS0+ZW50cmllc1tpXS5nZW5fc3BlZWQgPQorCQkJ YXRvbV9wY2llX3RhYmxlLT5lbnRyaWVzW2ldLnVjUENJRUdlblNwZWVkOworCQlwY2llX3RhYmxl LT5lbnRyaWVzW2ldLmxhbmVfd2lkdGggPQorCQkJYXRvbV9wY2llX3RhYmxlLT5lbnRyaWVzW2ld LnVzUENJRUxhbmVXaWR0aDsKKwl9CisKKwkqcHBfdG9uZ2FfcGNpZV90YWJsZSA9IHBjaWVfdGFi bGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfY2FjX3RkcF90YWJsZSgKKwkJ c3RydWN0IHBwX2h3bWdyICpod21nciwKKwkJc3RydWN0IHBobV9jYWNfdGRwX3RhYmxlICoqY2Fj X3RkcF90YWJsZSwKKwkJY29uc3QgUFBUYWJsZV9HZW5lcmljX1N1YlRhYmxlX0hlYWRlciAqIHRh YmxlCisJCSkKK3sKKwl1aW50MzJfdCB0YWJsZV9zaXplOworCXN0cnVjdCBwaG1fY2FjX3RkcF90 YWJsZSAqdGRwX3RhYmxlOworCisJdGFibGVfc2l6ZSA9IHNpemVvZih1aW50MzJfdCkgKyBzaXpl b2Yoc3RydWN0IHBobV9jYWNfdGRwX3RhYmxlKTsKKwl0ZHBfdGFibGUgPSBremFsbG9jKHRhYmxl X3NpemUsIEdGUF9LRVJORUwpOworCisJaWYgKE5VTEwgPT0gdGRwX3RhYmxlKQorCQlyZXR1cm4g LTE7CisKKwltZW1zZXQodGRwX3RhYmxlLCAweDAwLCB0YWJsZV9zaXplKTsKKworCWh3bWdyLT5k eW5fc3RhdGUuY2FjX2R0cF90YWJsZSA9IGt6YWxsb2ModGFibGVfc2l6ZSwgR0ZQX0tFUk5FTCk7 CisKKwlpZiAoTlVMTCA9PSBod21nci0+ZHluX3N0YXRlLmNhY19kdHBfdGFibGUpCisJCXJldHVy biAtMTsKKworCW1lbXNldChod21nci0+ZHluX3N0YXRlLmNhY19kdHBfdGFibGUsIDB4MDAsIHRh YmxlX3NpemUpOworCisJaWYgKHRhYmxlLT51Y1JldklkIDwgMykgeworCQljb25zdCBBVE9NX1Rv bmdhX1Bvd2VyVHVuZV9UYWJsZSAqdG9uZ2FfdGFibGUgPQorCQkJKEFUT01fVG9uZ2FfUG93ZXJU dW5lX1RhYmxlICopdGFibGU7CisJCXRkcF90YWJsZS0+dXNURFAgPSB0b25nYV90YWJsZS0+dXNU RFA7CisJCXRkcF90YWJsZS0+dXNDb25maWd1cmFibGVURFAgPQorCQkJdG9uZ2FfdGFibGUtPnVz Q29uZmlndXJhYmxlVERQOworCQl0ZHBfdGFibGUtPnVzVERDID0gdG9uZ2FfdGFibGUtPnVzVERD OworCQl0ZHBfdGFibGUtPnVzQmF0dGVyeVBvd2VyTGltaXQgPQorCQkJdG9uZ2FfdGFibGUtPnVz QmF0dGVyeVBvd2VyTGltaXQ7CisJCXRkcF90YWJsZS0+dXNTbWFsbFBvd2VyTGltaXQgPQorCQkJ dG9uZ2FfdGFibGUtPnVzU21hbGxQb3dlckxpbWl0OworCQl0ZHBfdGFibGUtPnVzTG93Q0FDTGVh a2FnZSA9CisJCQl0b25nYV90YWJsZS0+dXNMb3dDQUNMZWFrYWdlOworCQl0ZHBfdGFibGUtPnVz SGlnaENBQ0xlYWthZ2UgPQorCQkJdG9uZ2FfdGFibGUtPnVzSGlnaENBQ0xlYWthZ2U7CisJCXRk cF90YWJsZS0+dXNNYXhpbXVtUG93ZXJEZWxpdmVyeUxpbWl0ID0KKwkJCXRvbmdhX3RhYmxlLT51 c01heGltdW1Qb3dlckRlbGl2ZXJ5TGltaXQ7CisJCXRkcF90YWJsZS0+dXNEZWZhdWx0VGFyZ2V0 T3BlcmF0aW5nVGVtcCA9CisJCQl0b25nYV90YWJsZS0+dXNUak1heDsKKwkJdGRwX3RhYmxlLT51 c1RhcmdldE9wZXJhdGluZ1RlbXAgPQorCQkJdG9uZ2FfdGFibGUtPnVzVGpNYXg7IC8qU2V0IHRo ZSBpbml0aWFsIHRlbXAgdG8gdGhlIHNhbWUgYXMgZGVmYXVsdCAqLworCQl0ZHBfdGFibGUtPnVz UG93ZXJUdW5lRGF0YVNldElEID0KKwkJCXRvbmdhX3RhYmxlLT51c1Bvd2VyVHVuZURhdGFTZXRJ RDsKKwkJdGRwX3RhYmxlLT51c1NvZnR3YXJlU2h1dGRvd25UZW1wID0KKwkJCXRvbmdhX3RhYmxl LT51c1NvZnR3YXJlU2h1dGRvd25UZW1wOworCQl0ZHBfdGFibGUtPnVzQ2xvY2tTdHJldGNoQW1v dW50ID0KKwkJCXRvbmdhX3RhYmxlLT51c0Nsb2NrU3RyZXRjaEFtb3VudDsKKwl9IGVsc2UgeyAg IC8qIEZpamkgYW5kIG5ld2VyICovCisJCWNvbnN0IEFUT01fRmlqaV9Qb3dlclR1bmVfVGFibGUg KmZpaml0YWJsZSA9CisJCQkoQVRPTV9GaWppX1Bvd2VyVHVuZV9UYWJsZSAqKXRhYmxlOworCQl0 ZHBfdGFibGUtPnVzVERQID0gZmlqaXRhYmxlLT51c1REUDsKKwkJdGRwX3RhYmxlLT51c0NvbmZp Z3VyYWJsZVREUCA9IGZpaml0YWJsZS0+dXNDb25maWd1cmFibGVURFA7CisJCXRkcF90YWJsZS0+ dXNUREMgPSBmaWppdGFibGUtPnVzVERDOworCQl0ZHBfdGFibGUtPnVzQmF0dGVyeVBvd2VyTGlt aXQgPSBmaWppdGFibGUtPnVzQmF0dGVyeVBvd2VyTGltaXQ7CisJCXRkcF90YWJsZS0+dXNTbWFs bFBvd2VyTGltaXQgPSBmaWppdGFibGUtPnVzU21hbGxQb3dlckxpbWl0OworCQl0ZHBfdGFibGUt PnVzTG93Q0FDTGVha2FnZSA9IGZpaml0YWJsZS0+dXNMb3dDQUNMZWFrYWdlOworCQl0ZHBfdGFi bGUtPnVzSGlnaENBQ0xlYWthZ2UgPSBmaWppdGFibGUtPnVzSGlnaENBQ0xlYWthZ2U7CisJCXRk cF90YWJsZS0+dXNNYXhpbXVtUG93ZXJEZWxpdmVyeUxpbWl0ID0KKwkJCWZpaml0YWJsZS0+dXNN YXhpbXVtUG93ZXJEZWxpdmVyeUxpbWl0OworCQl0ZHBfdGFibGUtPnVzRGVmYXVsdFRhcmdldE9w ZXJhdGluZ1RlbXAgPQorCQkJZmlqaXRhYmxlLT51c1RqTWF4OworCQl0ZHBfdGFibGUtPnVzVGFy Z2V0T3BlcmF0aW5nVGVtcCA9CisJCQlmaWppdGFibGUtPnVzVGpNYXg7IC8qU2V0IHRoZSBpbml0 aWFsIHRlbXAgdG8gdGhlIHNhbWUgYXMgZGVmYXVsdCAqLworCQl0ZHBfdGFibGUtPnVzUG93ZXJU dW5lRGF0YVNldElEID0KKwkJCWZpaml0YWJsZS0+dXNQb3dlclR1bmVEYXRhU2V0SUQ7CisJCXRk cF90YWJsZS0+dXNTb2Z0d2FyZVNodXRkb3duVGVtcCA9CisJCQlmaWppdGFibGUtPnVzU29mdHdh cmVTaHV0ZG93blRlbXA7CisJCXRkcF90YWJsZS0+dXNDbG9ja1N0cmV0Y2hBbW91bnQgPQorCQkJ ZmlqaXRhYmxlLT51c0Nsb2NrU3RyZXRjaEFtb3VudDsKKwkJdGRwX3RhYmxlLT51c1RlbXBlcmF0 dXJlTGltaXRIb3RzcG90ID0KKwkJCWZpaml0YWJsZS0+dXNUZW1wZXJhdHVyZUxpbWl0SG90c3Bv dDsKKwkJdGRwX3RhYmxlLT51c1RlbXBlcmF0dXJlTGltaXRMaXF1aWQxID0KKwkJCWZpaml0YWJs ZS0+dXNUZW1wZXJhdHVyZUxpbWl0TGlxdWlkMTsKKwkJdGRwX3RhYmxlLT51c1RlbXBlcmF0dXJl TGltaXRMaXF1aWQyID0KKwkJCWZpaml0YWJsZS0+dXNUZW1wZXJhdHVyZUxpbWl0TGlxdWlkMjsK KwkJdGRwX3RhYmxlLT51c1RlbXBlcmF0dXJlTGltaXRWclZkZGMgPQorCQkJZmlqaXRhYmxlLT51 c1RlbXBlcmF0dXJlTGltaXRWclZkZGM7CisJCXRkcF90YWJsZS0+dXNUZW1wZXJhdHVyZUxpbWl0 VnJNdmRkID0KKwkJCWZpaml0YWJsZS0+dXNUZW1wZXJhdHVyZUxpbWl0VnJNdmRkOworCQl0ZHBf dGFibGUtPnVzVGVtcGVyYXR1cmVMaW1pdFBseCA9CisJCQlmaWppdGFibGUtPnVzVGVtcGVyYXR1 cmVMaW1pdFBseDsKKwkJdGRwX3RhYmxlLT51Y0xpcXVpZDFfSTJDX2FkZHJlc3MgPQorCQkJZmlq aXRhYmxlLT51Y0xpcXVpZDFfSTJDX2FkZHJlc3M7CisJCXRkcF90YWJsZS0+dWNMaXF1aWQyX0ky Q19hZGRyZXNzID0KKwkJCWZpaml0YWJsZS0+dWNMaXF1aWQyX0kyQ19hZGRyZXNzOworCQl0ZHBf dGFibGUtPnVjTGlxdWlkX0kyQ19MaW5lID0KKwkJCWZpaml0YWJsZS0+dWNMaXF1aWRfSTJDX0xp bmU7CisJCXRkcF90YWJsZS0+dWNWcl9JMkNfYWRkcmVzcyA9IGZpaml0YWJsZS0+dWNWcl9JMkNf YWRkcmVzczsKKwkJdGRwX3RhYmxlLT51Y1ZyX0kyQ19MaW5lID0gZmlqaXRhYmxlLT51Y1ZyX0ky Q19MaW5lOworCQl0ZHBfdGFibGUtPnVjUGx4X0kyQ19hZGRyZXNzID0gZmlqaXRhYmxlLT51Y1Bs eF9JMkNfYWRkcmVzczsKKwkJdGRwX3RhYmxlLT51Y1BseF9JMkNfTGluZSA9IGZpaml0YWJsZS0+ dWNQbHhfSTJDX0xpbmU7CisJfQorCisJKmNhY190ZHBfdGFibGUgPSB0ZHBfdGFibGU7CisKKwly ZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfbW1fY2xvY2tfdm9sdGFnZV90YWJsZSgKKwkJ c3RydWN0IHBwX2h3bWdyICpod21nciwKKwkJcGhtX3BwdF92MV9tbV9jbG9ja192b2x0YWdlX2Rl cGVuZGVuY3lfdGFibGUgKip0b25nYV9tbV90YWJsZSwKKwkJY29uc3QgQVRPTV9Ub25nYV9NTV9E ZXBlbmRlbmN5X1RhYmxlICogbW1fZGVwZW5kZW5jeV90YWJsZQorCQkpCit7CisJdWludDMyX3Qg dGFibGVfc2l6ZSwgaTsKKwljb25zdCBBVE9NX1RvbmdhX01NX0RlcGVuZGVuY3lfUmVjb3JkICpt bV9kZXBlbmRlbmN5X3JlY29yZDsKKwlwaG1fcHB0X3YxX21tX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5k ZW5jeV90YWJsZSAqbW1fdGFibGU7CisKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwICE9IG1tX2Rl cGVuZGVuY3lfdGFibGUtPnVjTnVtRW50cmllcyksCisJCSJJbnZhbGlkIFBvd2VyUGxheSBUYWJs ZSEiLCByZXR1cm4gLTEpOworCXRhYmxlX3NpemUgPSBzaXplb2YodWludDMyX3QpICsKKwkJc2l6 ZW9mKHBobV9wcHRfdjFfbW1fY2xvY2tfdm9sdGFnZV9kZXBlbmRlbmN5X3JlY29yZCkKKwkJKiBt bV9kZXBlbmRlbmN5X3RhYmxlLT51Y051bUVudHJpZXM7CisJbW1fdGFibGUgPSAocGhtX3BwdF92 MV9tbV9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUgKikKKwkJa3phbGxvYyh0YWJsZV9z aXplLCBHRlBfS0VSTkVMKTsKKworCWlmIChOVUxMID09IG1tX3RhYmxlKQorCQlyZXR1cm4gLTE7 CisKKwltZW1zZXQobW1fdGFibGUsIDB4MDAsIHRhYmxlX3NpemUpOworCisJbW1fdGFibGUtPmNv dW50ID0gbW1fZGVwZW5kZW5jeV90YWJsZS0+dWNOdW1FbnRyaWVzOworCisJZm9yIChpID0gMDsg aSA8IG1tX2RlcGVuZGVuY3lfdGFibGUtPnVjTnVtRW50cmllczsgaSsrKSB7CisJCW1tX2RlcGVu ZGVuY3lfcmVjb3JkID0gJm1tX2RlcGVuZGVuY3lfdGFibGUtPmVudHJpZXNbaV07CisJCW1tX3Rh YmxlLT5lbnRyaWVzW2ldLnZkZGNJbmQgPSBtbV9kZXBlbmRlbmN5X3JlY29yZC0+dWNWZGRjSW5k OworCQltbV90YWJsZS0+ZW50cmllc1tpXS52ZGRnZnhfb2Zmc2V0ID0gbW1fZGVwZW5kZW5jeV9y ZWNvcmQtPnVzVmRkZ2Z4T2Zmc2V0OworCQltbV90YWJsZS0+ZW50cmllc1tpXS5hY2xrID0gbW1f ZGVwZW5kZW5jeV9yZWNvcmQtPnVsQUNsazsKKwkJbW1fdGFibGUtPmVudHJpZXNbaV0uc2FtY2xv Y2sgPSBtbV9kZXBlbmRlbmN5X3JlY29yZC0+dWxTQU1VQ2xrOworCQltbV90YWJsZS0+ZW50cmll c1tpXS5lY2xrID0gbW1fZGVwZW5kZW5jeV9yZWNvcmQtPnVsRUNsazsKKwkJbW1fdGFibGUtPmVu dHJpZXNbaV0udmNsayA9IG1tX2RlcGVuZGVuY3lfcmVjb3JkLT51bFZDbGs7CisJCW1tX3RhYmxl LT5lbnRyaWVzW2ldLmRjbGsgPSBtbV9kZXBlbmRlbmN5X3JlY29yZC0+dWxEQ2xrOworCX0KKwor CSp0b25nYV9tbV90YWJsZSA9IG1tX3RhYmxlOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICog UHJpdmF0ZSBGdW5jdGlvbiB1c2VkIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAqIEluaXRpYWxp emUgY2xvY2sgdm9sdGFnZSBkZXBlbmRlbmN5CisgKiBAcGFyYW0gaHdtZ3IgUG9pbnRlciB0byB0 aGUgaGFyZHdhcmUgbWFuYWdlci4KKyAqIEBwYXJhbSBwb3dlcnBsYXlfdGFibGUgUG9pbnRlciB0 byB0aGUgUG93ZXJQbGF5IFRhYmxlLgorICovCitzdGF0aWMgaW50IGluaXRfY2xvY2tfdm9sdGFn ZV9kZXBlbmRlbmN5KAorCQlzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLAorCQljb25zdCBBVE9NX1Rv bmdhX1BPV0VSUExBWVRBQkxFICpwb3dlcnBsYXlfdGFibGUKKwkJKQoreworCWludCByZXN1bHQg PSAwOworCXN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICpwcF90YWJsZV9pbmZvcm1hdGlv biA9CisJCShzdHJ1Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqKShod21nci0+cHB0YWJsZSk7 CisKKwljb25zdCBBVE9NX1RvbmdhX01NX0RlcGVuZGVuY3lfVGFibGUgKm1tX2RlcGVuZGVuY3lf dGFibGUgPQorCQkoY29uc3QgQVRPTV9Ub25nYV9NTV9EZXBlbmRlbmN5X1RhYmxlICopKCgodW5z aWduZWQgbG9uZykgcG93ZXJwbGF5X3RhYmxlKSArCisJCWxlMTZfdG9fY3B1KHBvd2VycGxheV90 YWJsZS0+dXNNTURlcGVuZGVuY3lUYWJsZU9mZnNldCkpOworCWNvbnN0IFBQVGFibGVfR2VuZXJp Y19TdWJUYWJsZV9IZWFkZXIgKnBQb3dlclR1bmVUYWJsZSA9CisJCShjb25zdCBQUFRhYmxlX0dl bmVyaWNfU3ViVGFibGVfSGVhZGVyICopKCgodW5zaWduZWQgbG9uZykgcG93ZXJwbGF5X3RhYmxl KSArCisJCWxlMTZfdG9fY3B1KHBvd2VycGxheV90YWJsZS0+dXNQb3dlclR1bmVUYWJsZU9mZnNl dCkpOworCWNvbnN0IEFUT01fVG9uZ2FfTUNMS19EZXBlbmRlbmN5X1RhYmxlICptY2xrX2RlcF90 YWJsZSA9CisJCShjb25zdCBBVE9NX1RvbmdhX01DTEtfRGVwZW5kZW5jeV9UYWJsZSAqKSgoKHVu c2lnbmVkIGxvbmcpIHBvd2VycGxheV90YWJsZSkgKworCQlsZTE2X3RvX2NwdShwb3dlcnBsYXlf dGFibGUtPnVzTWNsa0RlcGVuZGVuY3lUYWJsZU9mZnNldCkpOworCWNvbnN0IEFUT01fVG9uZ2Ff U0NMS19EZXBlbmRlbmN5X1RhYmxlICpzY2xrX2RlcF90YWJsZSA9CisJCShjb25zdCBBVE9NX1Rv bmdhX1NDTEtfRGVwZW5kZW5jeV9UYWJsZSAqKSgoKHVuc2lnbmVkIGxvbmcpIHBvd2VycGxheV90 YWJsZSkgKworCQlsZTE2X3RvX2NwdShwb3dlcnBsYXlfdGFibGUtPnVzU2Nsa0RlcGVuZGVuY3lU YWJsZU9mZnNldCkpOworCWNvbnN0IEFUT01fVG9uZ2FfSGFyZF9MaW1pdF9UYWJsZSAqcEhhcmRM aW1pdHMgPQorCQkoY29uc3QgQVRPTV9Ub25nYV9IYXJkX0xpbWl0X1RhYmxlICopKCgodW5zaWdu ZWQgbG9uZykgcG93ZXJwbGF5X3RhYmxlKSArCisJCWxlMTZfdG9fY3B1KHBvd2VycGxheV90YWJs ZS0+dXNIYXJkTGltaXRUYWJsZU9mZnNldCkpOworCWNvbnN0IEFUT01fVG9uZ2FfUENJRV9UYWJs ZSAqcGNpZV90YWJsZSA9CisJCShjb25zdCBBVE9NX1RvbmdhX1BDSUVfVGFibGUgKikoKCh1bnNp Z25lZCBsb25nKSBwb3dlcnBsYXlfdGFibGUpICsKKwkJbGUxNl90b19jcHUocG93ZXJwbGF5X3Rh YmxlLT51c1BDSUVUYWJsZU9mZnNldCkpOworCisJcHBfdGFibGVfaW5mb3JtYXRpb24tPnZkZF9k ZXBfb25fc2NsayA9IE5VTEw7CisJcHBfdGFibGVfaW5mb3JtYXRpb24tPnZkZF9kZXBfb25fbWNs ayA9IE5VTEw7CisJcHBfdGFibGVfaW5mb3JtYXRpb24tPm1tX2RlcF90YWJsZSA9IE5VTEw7CisJ cHBfdGFibGVfaW5mb3JtYXRpb24tPnBjaWVfdGFibGUgPSBOVUxMOworCisJaWYgKHBvd2VycGxh eV90YWJsZS0+dXNNTURlcGVuZGVuY3lUYWJsZU9mZnNldCAhPSAwKQorCQlyZXN1bHQgPSBnZXRf bW1fY2xvY2tfdm9sdGFnZV90YWJsZShod21nciwKKwkJJnBwX3RhYmxlX2luZm9ybWF0aW9uLT5t bV9kZXBfdGFibGUsIG1tX2RlcGVuZGVuY3lfdGFibGUpOworCisJaWYgKHJlc3VsdCA9PSAwICYm IHBvd2VycGxheV90YWJsZS0+dXNQb3dlclR1bmVUYWJsZU9mZnNldCAhPSAwKQorCQlyZXN1bHQg PSBnZXRfY2FjX3RkcF90YWJsZShod21nciwKKwkJJnBwX3RhYmxlX2luZm9ybWF0aW9uLT5jYWNf ZHRwX3RhYmxlLCBwUG93ZXJUdW5lVGFibGUpOworCisJaWYgKHJlc3VsdCA9PSAwICYmIHBvd2Vy cGxheV90YWJsZS0+dXNTY2xrRGVwZW5kZW5jeVRhYmxlT2Zmc2V0ICE9IDApCisJCXJlc3VsdCA9 IGdldF9zY2xrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZShod21nciwKKwkJJnBwX3RhYmxlX2lu Zm9ybWF0aW9uLT52ZGRfZGVwX29uX3NjbGssIHNjbGtfZGVwX3RhYmxlKTsKKworCWlmIChyZXN1 bHQgPT0gMCAmJiBwb3dlcnBsYXlfdGFibGUtPnVzTWNsa0RlcGVuZGVuY3lUYWJsZU9mZnNldCAh PSAwKQorCQlyZXN1bHQgPSBnZXRfbWNsa192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUoaHdtZ3Is CisJCSZwcF90YWJsZV9pbmZvcm1hdGlvbi0+dmRkX2RlcF9vbl9tY2xrLCBtY2xrX2RlcF90YWJs ZSk7CisKKwlpZiAocmVzdWx0ID09IDAgJiYgcG93ZXJwbGF5X3RhYmxlLT51c1BDSUVUYWJsZU9m ZnNldCAhPSAwKQorCQlyZXN1bHQgPSBnZXRfcGNpZV90YWJsZShod21nciwKKwkJJnBwX3RhYmxl X2luZm9ybWF0aW9uLT5wY2llX3RhYmxlLCBwY2llX3RhYmxlKTsKKworCWlmIChyZXN1bHQgPT0g MCAmJiBwb3dlcnBsYXlfdGFibGUtPnVzSGFyZExpbWl0VGFibGVPZmZzZXQgIT0gMCkKKwkJcmVz dWx0ID0gZ2V0X2hhcmRfbGltaXRzKGh3bWdyLAorCQkmcHBfdGFibGVfaW5mb3JtYXRpb24tPm1h eF9jbG9ja192b2x0YWdlX29uX2RjLCBwSGFyZExpbWl0cyk7CisKKwlod21nci0+ZHluX3N0YXRl Lm1heF9jbG9ja192b2x0YWdlX29uX2RjLnNjbGsgPQorCQlwcF90YWJsZV9pbmZvcm1hdGlvbi0+ bWF4X2Nsb2NrX3ZvbHRhZ2Vfb25fZGMuc2NsazsKKwlod21nci0+ZHluX3N0YXRlLm1heF9jbG9j a192b2x0YWdlX29uX2RjLm1jbGsgPQorCQlwcF90YWJsZV9pbmZvcm1hdGlvbi0+bWF4X2Nsb2Nr X3ZvbHRhZ2Vfb25fZGMubWNsazsKKwlod21nci0+ZHluX3N0YXRlLm1heF9jbG9ja192b2x0YWdl X29uX2RjLnZkZGMgPQorCQlwcF90YWJsZV9pbmZvcm1hdGlvbi0+bWF4X2Nsb2NrX3ZvbHRhZ2Vf b25fZGMudmRkYzsKKwlod21nci0+ZHluX3N0YXRlLm1heF9jbG9ja192b2x0YWdlX29uX2RjLnZk ZGNpID0KKwkJcHBfdGFibGVfaW5mb3JtYXRpb24tPm1heF9jbG9ja192b2x0YWdlX29uX2RjLnZk ZGNpOworCisJaWYgKHJlc3VsdCA9PSAwICYmIChOVUxMICE9IHBwX3RhYmxlX2luZm9ybWF0aW9u LT52ZGRfZGVwX29uX21jbGspCisJCSYmICgwICE9IHBwX3RhYmxlX2luZm9ybWF0aW9uLT52ZGRf ZGVwX29uX21jbGstPmNvdW50KSkKKwkJcmVzdWx0ID0gZ2V0X3ZhbGlkX2Nsayhod21nciwgJnBw X3RhYmxlX2luZm9ybWF0aW9uLT52YWxpZF9tY2xrX3ZhbHVlcywKKwkJcHBfdGFibGVfaW5mb3Jt YXRpb24tPnZkZF9kZXBfb25fbWNsayk7CisKKwlpZiAocmVzdWx0ID09IDAgJiYgKE5VTEwgIT0g cHBfdGFibGVfaW5mb3JtYXRpb24tPnZkZF9kZXBfb25fc2NsaykKKwkJJiYgKDAgIT0gcHBfdGFi bGVfaW5mb3JtYXRpb24tPnZkZF9kZXBfb25fc2Nsay0+Y291bnQpKQorCQlyZXN1bHQgPSBnZXRf dmFsaWRfY2xrKGh3bWdyLCAmcHBfdGFibGVfaW5mb3JtYXRpb24tPnZhbGlkX3NjbGtfdmFsdWVz LAorCQlwcF90YWJsZV9pbmZvcm1hdGlvbi0+dmRkX2RlcF9vbl9zY2xrKTsKKworCXJldHVybiBy ZXN1bHQ7Cit9CisKKy8qKiBSZXRyaWV2ZXMgdGhlIChzaWduZWQpIE92ZXJkcml2ZSBsaW1pdHMg ZnJvbSBWQklPUy4KKyAqIFRoZSBtYXggZW5naW5lIGNsb2NrLCBtZW1vcnkgY2xvY2sgYW5kIG1h eCB0ZW1wZXJhdHVyZSBjb21lIGZyb20gdGhlIGZpcm13YXJlIGluZm8gdGFibGUuCisgKgorICog VGhlIGluZm9ybWF0aW9uIGlzIHBsYWNlZCBpbnRvIHRoZSBwbGF0Zm9ybSBkZXNjcmlwdG9yLgor ICoKKyAqIEBwYXJhbSBod21nciBzb3VyY2Ugb2YgdGhlIFZCSU9TIHRhYmxlIGFuZCBvd25lciBv ZiB0aGUgcGxhdGZvcm0gZGVzY3JpcHRvciB0byBiZSB1cGRhdGVkLgorICogQHBhcmFtIHBvd2Vy cGxheV90YWJsZSB0aGUgYWRkcmVzcyBvZiB0aGUgUG93ZXJQbGF5IHRhYmxlLgorICoKKyAqIEBy ZXR1cm4gMSBhcyBsb25nIGFzIHRoZSBmaXJtd2FyZSBpbmZvIHRhYmxlIHdhcyBwcmVzZW50IGFu ZCBvZiBhIHN1cHBvcnRlZCB2ZXJzaW9uLgorICovCitzdGF0aWMgaW50IGluaXRfb3Zlcl9kcml2 ZV9saW1pdHMoCisJCXN0cnVjdCBwcF9od21nciAqaHdtZ3IsCisJCWNvbnN0IEFUT01fVG9uZ2Ff UE9XRVJQTEFZVEFCTEUgKnBvd2VycGxheV90YWJsZSkKK3sKKwlod21nci0+cGxhdGZvcm1fZGVz Y3JpcHRvci5vdmVyZHJpdmVMaW1pdC5lbmdpbmVDbG9jayA9CisJCWxlMTZfdG9fY3B1KHBvd2Vy cGxheV90YWJsZS0+dWxNYXhPREVuZ2luZUNsb2NrKTsKKwlod21nci0+cGxhdGZvcm1fZGVzY3Jp cHRvci5vdmVyZHJpdmVMaW1pdC5tZW1vcnlDbG9jayA9CisJCWxlMTZfdG9fY3B1KHBvd2VycGxh eV90YWJsZS0+dWxNYXhPRE1lbW9yeUNsb2NrKTsKKworCWh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlw dG9yLm1pbk92ZXJkcml2ZVZEREMgPSAwOworCWh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLm1h eE92ZXJkcml2ZVZEREMgPSAwOworCWh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLm92ZXJkcml2 ZVZERENTdGVwID0gMDsKKworCWlmIChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5vdmVyZHJp dmVMaW1pdC5lbmdpbmVDbG9jayA+IDAgXAorCQkmJiBod21nci0+cGxhdGZvcm1fZGVzY3JpcHRv ci5vdmVyZHJpdmVMaW1pdC5tZW1vcnlDbG9jayA+IDApIHsKKwkJcGhtX2NhcF9zZXQoaHdtZ3It PnBsYXRmb3JtX2Rlc2NyaXB0b3IucGxhdGZvcm1DYXBzLAorCQkJUEhNX1BsYXRmb3JtQ2Fwc19B Q092ZXJkcml2ZVN1cHBvcnQpOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIFByaXZh dGUgRnVuY3Rpb24gdXNlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgKiBJbnNwZWN0IHRoZSBQ b3dlclBsYXkgdGFibGUgZm9yIG9idmlvdXMgc2lnbnMgb2YgY29ycnVwdGlvbi4KKyAqIEBwYXJh bSBod21nciBQb2ludGVyIHRvIHRoZSBoYXJkd2FyZSBtYW5hZ2VyLgorICogQHBhcmFtIHBvd2Vy cGxheV90YWJsZSBQb2ludGVyIHRvIHRoZSBQb3dlclBsYXkgVGFibGUuCisgKiBAZXhjZXB0aW9u IFRoaXMgaW1wbGVtZW50YXRpb24gYWx3YXlzIHJldHVybnMgMS4KKyAqLworc3RhdGljIGludCBp bml0X3RoZXJtYWxfY29udHJvbGxlcigKKwkJc3RydWN0IHBwX2h3bWdyICpod21nciwKKwkJY29u c3QgQVRPTV9Ub25nYV9QT1dFUlBMQVlUQUJMRSAqcG93ZXJwbGF5X3RhYmxlCisJCSkKK3sKKwlj b25zdCBQUFRhYmxlX0dlbmVyaWNfU3ViVGFibGVfSGVhZGVyICpmYW5fdGFibGU7CisJQVRPTV9U b25nYV9UaGVybWFsX0NvbnRyb2xsZXIgKnRoZXJtYWxfY29udHJvbGxlcjsKKworCXRoZXJtYWxf Y29udHJvbGxlciA9IChBVE9NX1RvbmdhX1RoZXJtYWxfQ29udHJvbGxlciAqKQorCQkoKCh1bnNp Z25lZCBsb25nKXBvd2VycGxheV90YWJsZSkgKworCQlsZTE2X3RvX2NwdShwb3dlcnBsYXlfdGFi bGUtPnVzVGhlcm1hbENvbnRyb2xsZXJPZmZzZXQpKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKCgw ICE9IHBvd2VycGxheV90YWJsZS0+dXNUaGVybWFsQ29udHJvbGxlck9mZnNldCksCisJCSJUaGVy bWFsIGNvbnRyb2xsZXIgdGFibGUgbm90IHNldCEiLCByZXR1cm4gLTEpOworCisJaHdtZ3ItPnRo ZXJtYWxfY29udHJvbGxlci51Y1R5cGUgPSB0aGVybWFsX2NvbnRyb2xsZXItPnVjVHlwZTsKKwlo d21nci0+dGhlcm1hbF9jb250cm9sbGVyLnVjSTJjTGluZSA9IHRoZXJtYWxfY29udHJvbGxlci0+ dWNJMmNMaW5lOworCWh3bWdyLT50aGVybWFsX2NvbnRyb2xsZXIudWNJMmNBZGRyZXNzID0gdGhl cm1hbF9jb250cm9sbGVyLT51Y0kyY0FkZHJlc3M7CisKKwlod21nci0+dGhlcm1hbF9jb250cm9s bGVyLmZhbkluZm8uYk5vRmFuID0KKwkJKDAgIT0gKHRoZXJtYWxfY29udHJvbGxlci0+dWNGYW5Q YXJhbWV0ZXJzICYgQVRPTV9UT05HQV9QUF9GQU5QQVJBTUVURVJTX05PRkFOKSk7CisKKwlod21n ci0+dGhlcm1hbF9jb250cm9sbGVyLmZhbkluZm8udWNUYWNob21ldGVyUHVsc2VzUGVyUmV2b2x1 dGlvbiA9CisJCXRoZXJtYWxfY29udHJvbGxlci0+dWNGYW5QYXJhbWV0ZXJzICYKKwkJQVRPTV9U T05HQV9QUF9GQU5QQVJBTUVURVJTX1RBQ0hPTUVURVJfUFVMU0VTX1BFUl9SRVZPTFVUSU9OX01B U0s7CisKKwlod21nci0+dGhlcm1hbF9jb250cm9sbGVyLmZhbkluZm8udWxNaW5SUE0KKwkJPSB0 aGVybWFsX2NvbnRyb2xsZXItPnVjRmFuTWluUlBNICogMTAwVUw7CisJaHdtZ3ItPnRoZXJtYWxf Y29udHJvbGxlci5mYW5JbmZvLnVsTWF4UlBNCisJCT0gdGhlcm1hbF9jb250cm9sbGVyLT51Y0Zh bk1heFJQTSAqIDEwMFVMOworCisJc2V0X2h3X2NhcCgKKwkJCWh3bWdyLAorCQkJQVRPTV9UT05H QV9QUF9USEVSTUFMQ09OVFJPTExFUl9OT05FICE9IGh3bWdyLT50aGVybWFsX2NvbnRyb2xsZXIu dWNUeXBlLAorCQkJUEhNX1BsYXRmb3JtQ2Fwc19UaGVybWFsQ29udHJvbGxlcgorCQkgICk7CisK KwlpZiAoMCA9PSBwb3dlcnBsYXlfdGFibGUtPnVzRmFuVGFibGVPZmZzZXQpCisJCXJldHVybiAt MTsKKworCWZhbl90YWJsZSA9IChjb25zdCBQUFRhYmxlX0dlbmVyaWNfU3ViVGFibGVfSGVhZGVy ICopCisJCSgoKHVuc2lnbmVkIGxvbmcpcG93ZXJwbGF5X3RhYmxlKSArCisJCWxlMTZfdG9fY3B1 KHBvd2VycGxheV90YWJsZS0+dXNGYW5UYWJsZU9mZnNldCkpOworCisJUFBfQVNTRVJUX1dJVEhf Q09ERSgoMCAhPSBwb3dlcnBsYXlfdGFibGUtPnVzRmFuVGFibGVPZmZzZXQpLAorCQkiRmFuIHRh YmxlIG5vdCBzZXQhIiwgcmV0dXJuIC0xKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwIDwgZmFu X3RhYmxlLT51Y1JldklkKSwKKwkJIlVuc3VwcG9ydGVkIGZhbiB0YWJsZSBmb3JtYXQhIiwgcmV0 dXJuIC0xKTsKKworCWh3bWdyLT50aGVybWFsX2NvbnRyb2xsZXIuYWR2YW5jZUZhbkNvbnRyb2xQ YXJhbWV0ZXJzLnVsQ3ljbGVEZWxheQorCQk9IDEwMDAwMDsKKwlwaG1fY2FwX3NldChod21nci0+ cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCVBITV9QbGF0Zm9ybUNhcHNfTWlj cm9jb2RlRmFuQ29udHJvbCk7CisKKwlpZiAoZmFuX3RhYmxlLT51Y1JldklkIDwgOCkgeworCQlj b25zdCBBVE9NX1RvbmdhX0Zhbl9UYWJsZSAqdG9uZ2FfZmFuX3RhYmxlID0KKwkJCShBVE9NX1Rv bmdhX0Zhbl9UYWJsZSAqKWZhbl90YWJsZTsKKwkJaHdtZ3ItPnRoZXJtYWxfY29udHJvbGxlci5h ZHZhbmNlRmFuQ29udHJvbFBhcmFtZXRlcnMudWNUSHlzdAorCQkJPSB0b25nYV9mYW5fdGFibGUt PnVjVEh5c3Q7CisJCWh3bWdyLT50aGVybWFsX2NvbnRyb2xsZXIuYWR2YW5jZUZhbkNvbnRyb2xQ YXJhbWV0ZXJzLnVzVE1pbgorCQkJPSB0b25nYV9mYW5fdGFibGUtPnVzVE1pbjsKKwkJaHdtZ3It PnRoZXJtYWxfY29udHJvbGxlci5hZHZhbmNlRmFuQ29udHJvbFBhcmFtZXRlcnMudXNUTWVkCisJ CQk9IHRvbmdhX2Zhbl90YWJsZS0+dXNUTWVkOworCQlod21nci0+dGhlcm1hbF9jb250cm9sbGVy LmFkdmFuY2VGYW5Db250cm9sUGFyYW1ldGVycy51c1RIaWdoCisJCQk9IHRvbmdhX2Zhbl90YWJs ZS0+dXNUSGlnaDsKKwkJaHdtZ3ItPnRoZXJtYWxfY29udHJvbGxlci5hZHZhbmNlRmFuQ29udHJv bFBhcmFtZXRlcnMudXNQV01NaW4KKwkJCT0gdG9uZ2FfZmFuX3RhYmxlLT51c1BXTU1pbjsKKwkJ aHdtZ3ItPnRoZXJtYWxfY29udHJvbGxlci5hZHZhbmNlRmFuQ29udHJvbFBhcmFtZXRlcnMudXNQ V01NZWQKKwkJCT0gdG9uZ2FfZmFuX3RhYmxlLT51c1BXTU1lZDsKKwkJaHdtZ3ItPnRoZXJtYWxf Y29udHJvbGxlci5hZHZhbmNlRmFuQ29udHJvbFBhcmFtZXRlcnMudXNQV01IaWdoCisJCQk9IHRv bmdhX2Zhbl90YWJsZS0+dXNQV01IaWdoOworCQlod21nci0+dGhlcm1hbF9jb250cm9sbGVyLmFk dmFuY2VGYW5Db250cm9sUGFyYW1ldGVycy51c1RNYXgKKwkJCT0gMTA5MDA7ICAgICAgICAgICAg ICAgICAgLyogaGFyZCBjb2RlZCAqLworCQlod21nci0+dGhlcm1hbF9jb250cm9sbGVyLmFkdmFu Y2VGYW5Db250cm9sUGFyYW1ldGVycy51c1RNYXgKKwkJCT0gdG9uZ2FfZmFuX3RhYmxlLT51c1RN YXg7CisJCWh3bWdyLT50aGVybWFsX2NvbnRyb2xsZXIuYWR2YW5jZUZhbkNvbnRyb2xQYXJhbWV0 ZXJzLnVjRmFuQ29udHJvbE1vZGUKKwkJCT0gdG9uZ2FfZmFuX3RhYmxlLT51Y0ZhbkNvbnRyb2xN b2RlOworCQlod21nci0+dGhlcm1hbF9jb250cm9sbGVyLmFkdmFuY2VGYW5Db250cm9sUGFyYW1l dGVycy51c0RlZmF1bHRNYXhGYW5QV00KKwkJCT0gdG9uZ2FfZmFuX3RhYmxlLT51c0ZhblBXTU1h eDsKKwkJaHdtZ3ItPnRoZXJtYWxfY29udHJvbGxlci5hZHZhbmNlRmFuQ29udHJvbFBhcmFtZXRl cnMudXNEZWZhdWx0RmFuT3V0cHV0U2Vuc2l0aXZpdHkKKwkJCT0gNDgzNjsKKwkJaHdtZ3ItPnRo ZXJtYWxfY29udHJvbGxlci5hZHZhbmNlRmFuQ29udHJvbFBhcmFtZXRlcnMudXNGYW5PdXRwdXRT ZW5zaXRpdml0eQorCQkJPSB0b25nYV9mYW5fdGFibGUtPnVzRmFuT3V0cHV0U2Vuc2l0aXZpdHk7 CisJCWh3bWdyLT50aGVybWFsX2NvbnRyb2xsZXIuYWR2YW5jZUZhbkNvbnRyb2xQYXJhbWV0ZXJz LnVzRGVmYXVsdE1heEZhblJQTQorCQkJPSB0b25nYV9mYW5fdGFibGUtPnVzRmFuUlBNTWF4Owor CQlod21nci0+dGhlcm1hbF9jb250cm9sbGVyLmFkdmFuY2VGYW5Db250cm9sUGFyYW1ldGVycy51 bE1pbkZhblNDTEtBY291c3RpY0xpbWl0CisJCQk9ICh0b25nYV9mYW5fdGFibGUtPnVsTWluRmFu U0NMS0Fjb3VzdGljTGltaXQgLyAxMDApOyAvKiBQUFRhYmxlIHN0b3JlcyBpdCBpbiAxMEtoeiB1 bml0IGZvciAyIGRlY2ltYWwgcGxhY2VzLiAgU01DIHdhbnRzIE1Iei4gKi8KKwkJaHdtZ3ItPnRo ZXJtYWxfY29udHJvbGxlci5hZHZhbmNlRmFuQ29udHJvbFBhcmFtZXRlcnMudWNUYXJnZXRUZW1w ZXJhdHVyZQorCQkJPSB0b25nYV9mYW5fdGFibGUtPnVjVGFyZ2V0VGVtcGVyYXR1cmU7CisJCWh3 bWdyLT50aGVybWFsX2NvbnRyb2xsZXIuYWR2YW5jZUZhbkNvbnRyb2xQYXJhbWV0ZXJzLnVjTWlu aW11bVBXTUxpbWl0CisJCQk9IHRvbmdhX2Zhbl90YWJsZS0+dWNNaW5pbXVtUFdNTGltaXQ7CisJ fSBlbHNlIHsKKwkJY29uc3QgQVRPTV9GaWppX0Zhbl9UYWJsZSAqZmlqaV9mYW5fdGFibGUgPQor CQkJKEFUT01fRmlqaV9GYW5fVGFibGUgKilmYW5fdGFibGU7CisJCWh3bWdyLT50aGVybWFsX2Nv bnRyb2xsZXIuYWR2YW5jZUZhbkNvbnRyb2xQYXJhbWV0ZXJzLnVjVEh5c3QKKwkJCT0gZmlqaV9m YW5fdGFibGUtPnVjVEh5c3Q7CisJCWh3bWdyLT50aGVybWFsX2NvbnRyb2xsZXIuYWR2YW5jZUZh bkNvbnRyb2xQYXJhbWV0ZXJzLnVzVE1pbgorCQkJPSBmaWppX2Zhbl90YWJsZS0+dXNUTWluOwor CQlod21nci0+dGhlcm1hbF9jb250cm9sbGVyLmFkdmFuY2VGYW5Db250cm9sUGFyYW1ldGVycy51 c1RNZWQKKwkJCT0gZmlqaV9mYW5fdGFibGUtPnVzVE1lZDsKKwkJaHdtZ3ItPnRoZXJtYWxfY29u dHJvbGxlci5hZHZhbmNlRmFuQ29udHJvbFBhcmFtZXRlcnMudXNUSGlnaAorCQkJPSBmaWppX2Zh bl90YWJsZS0+dXNUSGlnaDsKKwkJaHdtZ3ItPnRoZXJtYWxfY29udHJvbGxlci5hZHZhbmNlRmFu Q29udHJvbFBhcmFtZXRlcnMudXNQV01NaW4KKwkJCT0gZmlqaV9mYW5fdGFibGUtPnVzUFdNTWlu OworCQlod21nci0+dGhlcm1hbF9jb250cm9sbGVyLmFkdmFuY2VGYW5Db250cm9sUGFyYW1ldGVy cy51c1BXTU1lZAorCQkJPSBmaWppX2Zhbl90YWJsZS0+dXNQV01NZWQ7CisJCWh3bWdyLT50aGVy bWFsX2NvbnRyb2xsZXIuYWR2YW5jZUZhbkNvbnRyb2xQYXJhbWV0ZXJzLnVzUFdNSGlnaAorCQkJ PSBmaWppX2Zhbl90YWJsZS0+dXNQV01IaWdoOworCQlod21nci0+dGhlcm1hbF9jb250cm9sbGVy LmFkdmFuY2VGYW5Db250cm9sUGFyYW1ldGVycy51c1RNYXgKKwkJCT0gZmlqaV9mYW5fdGFibGUt PnVzVE1heDsKKwkJaHdtZ3ItPnRoZXJtYWxfY29udHJvbGxlci5hZHZhbmNlRmFuQ29udHJvbFBh cmFtZXRlcnMudWNGYW5Db250cm9sTW9kZQorCQkJPSBmaWppX2Zhbl90YWJsZS0+dWNGYW5Db250 cm9sTW9kZTsKKwkJaHdtZ3ItPnRoZXJtYWxfY29udHJvbGxlci5hZHZhbmNlRmFuQ29udHJvbFBh cmFtZXRlcnMudXNEZWZhdWx0TWF4RmFuUFdNCisJCQk9IGZpamlfZmFuX3RhYmxlLT51c0ZhblBX TU1heDsKKwkJaHdtZ3ItPnRoZXJtYWxfY29udHJvbGxlci5hZHZhbmNlRmFuQ29udHJvbFBhcmFt ZXRlcnMudXNEZWZhdWx0RmFuT3V0cHV0U2Vuc2l0aXZpdHkKKwkJCT0gNDgzNjsKKwkJaHdtZ3It PnRoZXJtYWxfY29udHJvbGxlci5hZHZhbmNlRmFuQ29udHJvbFBhcmFtZXRlcnMudXNGYW5PdXRw dXRTZW5zaXRpdml0eQorCQkJPSBmaWppX2Zhbl90YWJsZS0+dXNGYW5PdXRwdXRTZW5zaXRpdml0 eTsKKwkJaHdtZ3ItPnRoZXJtYWxfY29udHJvbGxlci5hZHZhbmNlRmFuQ29udHJvbFBhcmFtZXRl cnMudXNEZWZhdWx0TWF4RmFuUlBNCisJCQk9IGZpamlfZmFuX3RhYmxlLT51c0ZhblJQTU1heDsK KwkJaHdtZ3ItPnRoZXJtYWxfY29udHJvbGxlci5hZHZhbmNlRmFuQ29udHJvbFBhcmFtZXRlcnMu dWxNaW5GYW5TQ0xLQWNvdXN0aWNMaW1pdAorCQkJPSAoZmlqaV9mYW5fdGFibGUtPnVsTWluRmFu U0NMS0Fjb3VzdGljTGltaXQgLyAxMDApOyAvKiBQUFRhYmxlIHN0b3JlcyBpdCBpbiAxMEtoeiB1 bml0IGZvciAyIGRlY2ltYWwgcGxhY2VzLiAgU01DIHdhbnRzIE1Iei4gKi8KKwkJaHdtZ3ItPnRo ZXJtYWxfY29udHJvbGxlci5hZHZhbmNlRmFuQ29udHJvbFBhcmFtZXRlcnMudWNUYXJnZXRUZW1w ZXJhdHVyZQorCQkJPSBmaWppX2Zhbl90YWJsZS0+dWNUYXJnZXRUZW1wZXJhdHVyZTsKKwkJaHdt Z3ItPnRoZXJtYWxfY29udHJvbGxlci5hZHZhbmNlRmFuQ29udHJvbFBhcmFtZXRlcnMudWNNaW5p bXVtUFdNTGltaXQKKwkJCT0gZmlqaV9mYW5fdGFibGUtPnVjTWluaW11bVBXTUxpbWl0OworCisJ CWh3bWdyLT50aGVybWFsX2NvbnRyb2xsZXIuYWR2YW5jZUZhbkNvbnRyb2xQYXJhbWV0ZXJzLnVz RmFuR2FpbkVkZ2UKKwkJCT0gZmlqaV9mYW5fdGFibGUtPnVzRmFuR2FpbkVkZ2U7CisJCWh3bWdy LT50aGVybWFsX2NvbnRyb2xsZXIuYWR2YW5jZUZhbkNvbnRyb2xQYXJhbWV0ZXJzLnVzRmFuR2Fp bkhvdHNwb3QKKwkJCT0gZmlqaV9mYW5fdGFibGUtPnVzRmFuR2FpbkhvdHNwb3Q7CisJCWh3bWdy LT50aGVybWFsX2NvbnRyb2xsZXIuYWR2YW5jZUZhbkNvbnRyb2xQYXJhbWV0ZXJzLnVzRmFuR2Fp bkxpcXVpZAorCQkJPSBmaWppX2Zhbl90YWJsZS0+dXNGYW5HYWluTGlxdWlkOworCQlod21nci0+ dGhlcm1hbF9jb250cm9sbGVyLmFkdmFuY2VGYW5Db250cm9sUGFyYW1ldGVycy51c0ZhbkdhaW5W clZkZGMKKwkJCT0gZmlqaV9mYW5fdGFibGUtPnVzRmFuR2FpblZyVmRkYzsKKwkJaHdtZ3ItPnRo ZXJtYWxfY29udHJvbGxlci5hZHZhbmNlRmFuQ29udHJvbFBhcmFtZXRlcnMudXNGYW5HYWluVnJN dmRkCisJCQk9IGZpamlfZmFuX3RhYmxlLT51c0ZhbkdhaW5Wck12ZGQ7CisJCWh3bWdyLT50aGVy bWFsX2NvbnRyb2xsZXIuYWR2YW5jZUZhbkNvbnRyb2xQYXJhbWV0ZXJzLnVzRmFuR2FpblBseAor CQkJPSBmaWppX2Zhbl90YWJsZS0+dXNGYW5HYWluUGx4OworCQlod21nci0+dGhlcm1hbF9jb250 cm9sbGVyLmFkdmFuY2VGYW5Db250cm9sUGFyYW1ldGVycy51c0ZhbkdhaW5IYm0KKwkJCT0gZmlq aV9mYW5fdGFibGUtPnVzRmFuR2FpbkhibTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisg KiBQcml2YXRlIEZ1bmN0aW9uIHVzZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICogSW5zcGVj dCB0aGUgUG93ZXJQbGF5IHRhYmxlIGZvciBvYnZpb3VzIHNpZ25zIG9mIGNvcnJ1cHRpb24uCisg KiBAcGFyYW0gaHdtZ3IgUG9pbnRlciB0byB0aGUgaGFyZHdhcmUgbWFuYWdlci4KKyAqIEBwYXJh bSBwb3dlcnBsYXlfdGFibGUgUG9pbnRlciB0byB0aGUgUG93ZXJQbGF5IFRhYmxlLgorICogQGV4 Y2VwdGlvbiAyIGlmIHRoZSBwb3dlcnBsYXkgdGFibGUgaXMgaW5jb3JyZWN0LgorICovCitzdGF0 aWMgaW50IGNoZWNrX3Bvd2VycGxheV90YWJsZXMoCisJCXN0cnVjdCBwcF9od21nciAqaHdtZ3Is CisJCWNvbnN0IEFUT01fVG9uZ2FfUE9XRVJQTEFZVEFCTEUgKnBvd2VycGxheV90YWJsZQorCQkp Cit7CisJY29uc3QgQVRPTV9Ub25nYV9TdGF0ZV9BcnJheSAqc3RhdGVfYXJyYXlzOworCisJc3Rh dGVfYXJyYXlzID0gKEFUT01fVG9uZ2FfU3RhdGVfQXJyYXkgKikoKCh1bnNpZ25lZCBsb25nKXBv d2VycGxheV90YWJsZSkgKworCQlsZTE2X3RvX2NwdShwb3dlcnBsYXlfdGFibGUtPnVzU3RhdGVB cnJheU9mZnNldCkpOworCisJUFBfQVNTRVJUX1dJVEhfQ09ERSgoQVRPTV9Ub25nYV9UQUJMRV9S RVZJU0lPTl9UT05HQSA8PQorCQlwb3dlcnBsYXlfdGFibGUtPnNIZWFkZXIudWNUYWJsZUZvcm1h dFJldmlzaW9uKSwKKwkJIlVuc3VwcG9ydGVkIFBQVGFibGUgZm9ybWF0ISIsIHJldHVybiAtMSk7 CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCAhPSBwb3dlcnBsYXlfdGFibGUtPnVzU3RhdGVBcnJh eU9mZnNldCksCisJCSJTdGF0ZSB0YWJsZSBpcyBub3Qgc2V0ISIsIHJldHVybiAtMSk7CisJUFBf QVNTRVJUX1dJVEhfQ09ERSgoMCA8IHBvd2VycGxheV90YWJsZS0+c0hlYWRlci51c1N0cnVjdHVy ZVNpemUpLAorCQkiSW52YWxpZCBQb3dlclBsYXkgVGFibGUhIiwgcmV0dXJuIC0xKTsKKwlQUF9B U1NFUlRfV0lUSF9DT0RFKCgwIDwgc3RhdGVfYXJyYXlzLT51Y051bUVudHJpZXMpLAorCQkiSW52 YWxpZCBQb3dlclBsYXkgVGFibGUhIiwgcmV0dXJuIC0xKTsKKworCXJldHVybiAwOworfQorCitp bnQgdG9uZ2FfcHBfdGFibGVzX2luaXRpYWxpemUoc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sK KwlpbnQgcmVzdWx0ID0gMDsKKwljb25zdCBBVE9NX1RvbmdhX1BPV0VSUExBWVRBQkxFICpwb3dl cnBsYXlfdGFibGU7CisKKwlod21nci0+cHB0YWJsZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBw aG1fcHB0X3YxX2luZm9ybWF0aW9uKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoTlVMTCA9PSBod21n ci0+cHB0YWJsZSkKKwkJcmV0dXJuIC0xOworCisJbWVtc2V0KGh3bWdyLT5wcHRhYmxlLCAweDAw LCBzaXplb2Yoc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24pKTsKKworCXBvd2VycGxheV90 YWJsZSA9IGdldF9wb3dlcnBsYXlfdGFibGUoaHdtZ3IpOworCisJUFBfQVNTRVJUX1dJVEhfQ09E RSgoTlVMTCAhPSBwb3dlcnBsYXlfdGFibGUpLAorCQkiTWlzc2luZyBQb3dlclBsYXkgVGFibGUh IiwgcmV0dXJuIC0xKTsKKworCXJlc3VsdCA9IGNoZWNrX3Bvd2VycGxheV90YWJsZXMoaHdtZ3Is IHBvd2VycGxheV90YWJsZSk7CisKKwlpZiAoMCA9PSByZXN1bHQpCisJCXJlc3VsdCA9IHNldF9w bGF0Zm9ybV9jYXBzKGh3bWdyLAorCQkJbGUzMl90b19jcHUocG93ZXJwbGF5X3RhYmxlLT51bFBs YXRmb3JtQ2FwcykpOworCisJaWYgKDAgPT0gcmVzdWx0KQorCQlyZXN1bHQgPSBpbml0X3RoZXJt YWxfY29udHJvbGxlcihod21nciwgcG93ZXJwbGF5X3RhYmxlKTsKKworCWlmICgwID09IHJlc3Vs dCkKKwkJcmVzdWx0ID0gaW5pdF9vdmVyX2RyaXZlX2xpbWl0cyhod21nciwgcG93ZXJwbGF5X3Rh YmxlKTsKKworCWlmICgwID09IHJlc3VsdCkKKwkJcmVzdWx0ID0gaW5pdF9jbG9ja192b2x0YWdl X2RlcGVuZGVuY3koaHdtZ3IsIHBvd2VycGxheV90YWJsZSk7CisKKwlpZiAoMCA9PSByZXN1bHQp CisJCXJlc3VsdCA9IGluaXRfZHBtXzJfcGFyYW1ldGVycyhod21nciwgcG93ZXJwbGF5X3RhYmxl KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCB0b25nYV9wcF90YWJsZXNfdW5pbml0aWFs aXplKHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0 IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKnBwX3RhYmxlX2luZm9ybWF0aW9uID0KKwkJKHN0cnVj dCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICopKGh3bWdyLT5wcHRhYmxlKTsKKworCWlmIChOVUxM ICE9IGh3bWdyLT5zb2Z0X3BwX3RhYmxlKSB7CisJCWtmcmVlKGh3bWdyLT5zb2Z0X3BwX3RhYmxl KTsKKwkJaHdtZ3ItPnNvZnRfcHBfdGFibGUgPSBOVUxMOworCX0KKworCWlmIChOVUxMICE9IHBw X3RhYmxlX2luZm9ybWF0aW9uLT52ZGRfZGVwX29uX3NjbGspCisJCXBwX3RhYmxlX2luZm9ybWF0 aW9uLT52ZGRfZGVwX29uX3NjbGsgPSBOVUxMOworCisJaWYgKE5VTEwgIT0gcHBfdGFibGVfaW5m b3JtYXRpb24tPnZkZF9kZXBfb25fbWNsaykKKwkJcHBfdGFibGVfaW5mb3JtYXRpb24tPnZkZF9k ZXBfb25fbWNsayA9IE5VTEw7CisKKwlpZiAoTlVMTCAhPSBwcF90YWJsZV9pbmZvcm1hdGlvbi0+ dmFsaWRfbWNsa192YWx1ZXMpCisJCXBwX3RhYmxlX2luZm9ybWF0aW9uLT52YWxpZF9tY2xrX3Zh bHVlcyA9IE5VTEw7CisKKwlpZiAoTlVMTCAhPSBwcF90YWJsZV9pbmZvcm1hdGlvbi0+dmFsaWRf c2Nsa192YWx1ZXMpCisJCXBwX3RhYmxlX2luZm9ybWF0aW9uLT52YWxpZF9zY2xrX3ZhbHVlcyA9 IE5VTEw7CisKKwlpZiAoTlVMTCAhPSBwcF90YWJsZV9pbmZvcm1hdGlvbi0+dmRkY19sb29rdXBf dGFibGUpCisJCXBwX3RhYmxlX2luZm9ybWF0aW9uLT52ZGRjX2xvb2t1cF90YWJsZSA9IE5VTEw7 CisKKwlpZiAoTlVMTCAhPSBwcF90YWJsZV9pbmZvcm1hdGlvbi0+dmRkZ2Z4X2xvb2t1cF90YWJs ZSkKKwkJcHBfdGFibGVfaW5mb3JtYXRpb24tPnZkZGdmeF9sb29rdXBfdGFibGUgPSBOVUxMOwor CisJaWYgKE5VTEwgIT0gcHBfdGFibGVfaW5mb3JtYXRpb24tPm1tX2RlcF90YWJsZSkKKwkJcHBf dGFibGVfaW5mb3JtYXRpb24tPm1tX2RlcF90YWJsZSA9IE5VTEw7CisKKwlpZiAoTlVMTCAhPSBw cF90YWJsZV9pbmZvcm1hdGlvbi0+Y2FjX2R0cF90YWJsZSkKKwkJcHBfdGFibGVfaW5mb3JtYXRp b24tPmNhY19kdHBfdGFibGUgPSBOVUxMOworCisJaWYgKE5VTEwgIT0gaHdtZ3ItPmR5bl9zdGF0 ZS5jYWNfZHRwX3RhYmxlKQorCQlod21nci0+ZHluX3N0YXRlLmNhY19kdHBfdGFibGUgPSBOVUxM OworCisJaWYgKE5VTEwgIT0gcHBfdGFibGVfaW5mb3JtYXRpb24tPnBwbV9wYXJhbWV0ZXJfdGFi bGUpCisJCXBwX3RhYmxlX2luZm9ybWF0aW9uLT5wcG1fcGFyYW1ldGVyX3RhYmxlID0gTlVMTDsK KworCWlmIChOVUxMICE9IHBwX3RhYmxlX2luZm9ybWF0aW9uLT5wY2llX3RhYmxlKQorCQlwcF90 YWJsZV9pbmZvcm1hdGlvbi0+cGNpZV90YWJsZSA9IE5VTEw7CisKKwlpZiAoTlVMTCAhPSBod21n ci0+cHB0YWJsZSkgeworCQlrZnJlZShod21nci0+cHB0YWJsZSk7CisJCWh3bWdyLT5wcHRhYmxl ID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitjb25zdCBzdHJ1Y3QgcHBfdGFi bGVfZnVuYyB0b25nYV9wcHRhYmxlX2Z1bmNzID0geworCS5wcHRhYmxlX2luaXQgPSB0b25nYV9w cF90YWJsZXNfaW5pdGlhbGl6ZSwKKwkucHB0YWJsZV9maW5pID0gdG9uZ2FfcHBfdGFibGVzX3Vu aW5pdGlhbGl6ZSwKK307CisKK2ludCB0b25nYV9nZXRfbnVtYmVyX29mX3Bvd2VycGxheV90YWJs ZV9lbnRyaWVzKHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJY29uc3QgQVRPTV9Ub25nYV9T dGF0ZV9BcnJheSAqIHN0YXRlX2FycmF5czsKKwljb25zdCBBVE9NX1RvbmdhX1BPV0VSUExBWVRB QkxFICpwcF90YWJsZSA9IGdldF9wb3dlcnBsYXlfdGFibGUoaHdtZ3IpOworCisJUFBfQVNTRVJU X1dJVEhfQ09ERSgoTlVMTCAhPSBwcF90YWJsZSksCisJCQkiTWlzc2luZyBQb3dlclBsYXkgVGFi bGUhIiwgcmV0dXJuIC0xKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKChwcF90YWJsZS0+c0hlYWRl ci51Y1RhYmxlRm9ybWF0UmV2aXNpb24gPj0KKwkJCUFUT01fVG9uZ2FfVEFCTEVfUkVWSVNJT05f VE9OR0EpLAorCQkJIkluY29ycmVjdCBQb3dlclBsYXkgdGFibGUgcmV2aXNpb24hIiwgcmV0dXJu IC0xKTsKKworCXN0YXRlX2FycmF5cyA9IChBVE9NX1RvbmdhX1N0YXRlX0FycmF5ICopKCgodW5z aWduZWQgbG9uZylwcF90YWJsZSkgKworCQkJbGUxNl90b19jcHUocHBfdGFibGUtPnVzU3RhdGVB cnJheU9mZnNldCkpOworCisJcmV0dXJuICh1aW50MzJfdCkoc3RhdGVfYXJyYXlzLT51Y051bUVu dHJpZXMpOworfQorCisvKioKKyogUHJpdmF0ZSBmdW5jdGlvbiB0byBjb252ZXJ0IGZsYWdzIHN0 b3JlZCBpbiB0aGUgQklPUyB0byBzb2Z0d2FyZSBmbGFncyBpbiBQb3dlclBsYXkuCisqLworc3Rh dGljIHVpbnQzMl90IG1ha2VfY2xhc3NpZmljYXRpb25fZmxhZ3Moc3RydWN0IHBwX2h3bWdyICpo d21nciwKKwkJdWludDE2X3QgY2xhc3NpZmljYXRpb24sIHVpbnQxNl90IGNsYXNzaWZpY2F0aW9u MikKK3sKKwl1aW50MzJfdCByZXN1bHQgPSAwOworCisJaWYgKGNsYXNzaWZpY2F0aW9uICYgQVRP TV9QUExJQl9DTEFTU0lGSUNBVElPTl9CT09UKQorCQlyZXN1bHQgfD0gUFBfU3RhdGVDbGFzc2lm aWNhdGlvbkZsYWdfQm9vdDsKKworCWlmIChjbGFzc2lmaWNhdGlvbiAmIEFUT01fUFBMSUJfQ0xB U1NJRklDQVRJT05fVEhFUk1BTCkKKwkJcmVzdWx0IHw9IFBQX1N0YXRlQ2xhc3NpZmljYXRpb25G bGFnX1RoZXJtYWw7CisKKwlpZiAoY2xhc3NpZmljYXRpb24gJiBBVE9NX1BQTElCX0NMQVNTSUZJ Q0FUSU9OX0xJTUlURURQT1dFUlNPVVJDRSkKKwkJcmVzdWx0IHw9IFBQX1N0YXRlQ2xhc3NpZmlj YXRpb25GbGFnX0xpbWl0ZWRQb3dlclNvdXJjZTsKKworCWlmIChjbGFzc2lmaWNhdGlvbiAmIEFU T01fUFBMSUJfQ0xBU1NJRklDQVRJT05fUkVTVCkKKwkJcmVzdWx0IHw9IFBQX1N0YXRlQ2xhc3Np ZmljYXRpb25GbGFnX1Jlc3Q7CisKKwlpZiAoY2xhc3NpZmljYXRpb24gJiBBVE9NX1BQTElCX0NM QVNTSUZJQ0FUSU9OX0ZPUkNFRCkKKwkJcmVzdWx0IHw9IFBQX1N0YXRlQ2xhc3NpZmljYXRpb25G bGFnX0ZvcmNlZDsKKworCWlmIChjbGFzc2lmaWNhdGlvbiAmIEFUT01fUFBMSUJfQ0xBU1NJRklD QVRJT05fQUNQSSkKKwkJcmVzdWx0IHw9IFBQX1N0YXRlQ2xhc3NpZmljYXRpb25GbGFnX0FDUEk7 CisKKwlpZiAoY2xhc3NpZmljYXRpb24yICYgQVRPTV9QUExJQl9DTEFTU0lGSUNBVElPTjJfTElN SVRFRFBPV0VSU09VUkNFXzIpCisJCXJlc3VsdCB8PSBQUF9TdGF0ZUNsYXNzaWZpY2F0aW9uRmxh Z19MaW1pdGVkUG93ZXJTb3VyY2VfMjsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorKiBD cmVhdGUgYSBQb3dlciBTdGF0ZSBvdXQgb2YgYW4gZW50cnkgaW4gdGhlIFBvd2VyUGxheSB0YWJs ZS4KKyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGhhcmR3YXJlIGJhY2stZW5kLgor KiBAcGFyYW0gaHdtZ3IgUG9pbnRlciB0byB0aGUgaGFyZHdhcmUgbWFuYWdlci4KKyogQHBhcmFt IGVudHJ5X2luZGV4IFRoZSBpbmRleCBvZiB0aGUgZW50cnkgdG8gYmUgZXh0cmFjdGVkIGZyb20g dGhlIHRhYmxlLgorKiBAcGFyYW0gcG93ZXJfc3RhdGUgVGhlIGFkZHJlc3Mgb2YgdGhlIFBvd2Vy U3RhdGUgaW5zdGFuY2UgYmVpbmcgY3JlYXRlZC4KKyogQHJldHVybiAtMSBpZiB0aGUgZW50cnkg Y2Fubm90IGJlIHJldHJpZXZlZC4KKyovCitpbnQgdG9uZ2FfZ2V0X3Bvd2VycGxheV90YWJsZV9l bnRyeShzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLAorCQl1aW50MzJfdCBlbnRyeV9pbmRleCwgc3Ry dWN0IHBwX3Bvd2VyX3N0YXRlICpwb3dlcl9zdGF0ZSwKKwkJaW50ICgqY2FsbF9iYWNrX2Z1bmMp KHN0cnVjdCBwcF9od21nciAqLCB2b2lkICosCisJCQkJc3RydWN0IHBwX3Bvd2VyX3N0YXRlICos IHZvaWQgKiwgdWludDMyX3QpKQoreworCWludCByZXN1bHQgPSAwOworCWNvbnN0IEFUT01fVG9u Z2FfU3RhdGVfQXJyYXkgKiBzdGF0ZV9hcnJheXM7CisJY29uc3QgQVRPTV9Ub25nYV9TdGF0ZSAq c3RhdGVfZW50cnk7CisJY29uc3QgQVRPTV9Ub25nYV9QT1dFUlBMQVlUQUJMRSAqcHBfdGFibGUg PSBnZXRfcG93ZXJwbGF5X3RhYmxlKGh3bWdyKTsKKworCVBQX0FTU0VSVF9XSVRIX0NPREUoKE5V TEwgIT0gcHBfdGFibGUpLCAiTWlzc2luZyBQb3dlclBsYXkgVGFibGUhIiwgcmV0dXJuIC0xOyk7 CisJcG93ZXJfc3RhdGUtPmNsYXNzaWZpY2F0aW9uLmJpb3NfaW5kZXggPSBlbnRyeV9pbmRleDsK KworCWlmIChwcF90YWJsZS0+c0hlYWRlci51Y1RhYmxlRm9ybWF0UmV2aXNpb24gPj0KKwkJCUFU T01fVG9uZ2FfVEFCTEVfUkVWSVNJT05fVE9OR0EpIHsKKwkJc3RhdGVfYXJyYXlzID0gKEFUT01f VG9uZ2FfU3RhdGVfQXJyYXkgKikoKCh1bnNpZ25lZCBsb25nKXBwX3RhYmxlKSArCisJCQkJbGUx Nl90b19jcHUocHBfdGFibGUtPnVzU3RhdGVBcnJheU9mZnNldCkpOworCisJCVBQX0FTU0VSVF9X SVRIX0NPREUoKDAgPCBwcF90YWJsZS0+dXNTdGF0ZUFycmF5T2Zmc2V0KSwKKwkJCQkiSW52YWxp ZCBQb3dlclBsYXkgVGFibGUgU3RhdGUgQXJyYXkgT2Zmc2V0LiIsIHJldHVybiAtMSk7CisJCVBQ X0FTU0VSVF9XSVRIX0NPREUoKDAgPCBzdGF0ZV9hcnJheXMtPnVjTnVtRW50cmllcyksCisJCQkJ IkludmFsaWQgUG93ZXJQbGF5IFRhYmxlIFN0YXRlIEFycmF5LiIsIHJldHVybiAtMSk7CisJCVBQ X0FTU0VSVF9XSVRIX0NPREUoKGVudHJ5X2luZGV4IDw9IHN0YXRlX2FycmF5cy0+dWNOdW1FbnRy aWVzKSwKKwkJCQkiSW52YWxpZCBQb3dlclBsYXkgVGFibGUgU3RhdGUgQXJyYXkgRW50cnkuIiwg cmV0dXJuIC0xKTsKKworCQlzdGF0ZV9lbnRyeSA9ICYoc3RhdGVfYXJyYXlzLT5zdGF0ZXNbZW50 cnlfaW5kZXhdKTsKKworCQlyZXN1bHQgPSBjYWxsX2JhY2tfZnVuYyhod21nciwgKHZvaWQgKilz dGF0ZV9lbnRyeSwgcG93ZXJfc3RhdGUsCisJCQkJKHZvaWQgKilwcF90YWJsZSwKKwkJCQltYWtl X2NsYXNzaWZpY2F0aW9uX2ZsYWdzKGh3bWdyLAorCQkJCQlsZTE2X3RvX2NwdShzdGF0ZV9lbnRy eS0+dXNDbGFzc2lmaWNhdGlvbiksCisJCQkJCWxlMTZfdG9fY3B1KHN0YXRlX2VudHJ5LT51c0Ns YXNzaWZpY2F0aW9uMikpKTsKKwl9CisKKwlpZiAoIXJlc3VsdCAmJiAocG93ZXJfc3RhdGUtPmNs YXNzaWZpY2F0aW9uLmZsYWdzICYKKwkJCVBQX1N0YXRlQ2xhc3NpZmljYXRpb25GbGFnX0Jvb3Qp KQorCQlyZXN1bHQgPSBod21nci0+aHdtZ3JfZnVuYy0+cGF0Y2hfYm9vdF9zdGF0ZShod21nciwg Jihwb3dlcl9zdGF0ZS0+aGFyZHdhcmUpKTsKKworCXJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21nci90b25nYV9wcm9jZXNzcHB0 YWJsZXMuaCBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2h3bWdyL3RvbmdhX3Byb2Nl c3NwcHRhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNGI4ODgK LS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21nci90 b25nYV9wcm9jZXNzcHB0YWJsZXMuaApAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0 IDIwMTUgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMg aGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBh CisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBm aWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91 dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0 cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1Ymxp Y2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVy bWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBz bywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3Zl IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5j bHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNv ZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VU IFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcg QlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAq IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJ TiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMp IEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFks IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAq IEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUg T1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAq LworI2lmbmRlZiBUT05HQV9QUk9DRVNTUFBUQUJMRVNfSAorI2RlZmluZSBUT05HQV9QUk9DRVNT UFBUQUJMRVNfSAorCisjaW5jbHVkZSAiaHdtZ3IuaCIKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBw cF90YWJsZV9mdW5jIHRvbmdhX3BwdGFibGVfZnVuY3M7CitleHRlcm4gaW50IHRvbmdhX2dldF9u dW1iZXJfb2ZfcG93ZXJwbGF5X3RhYmxlX2VudHJpZXMoc3RydWN0IHBwX2h3bWdyICpod21ncik7 CitleHRlcm4gaW50IHRvbmdhX2dldF9wb3dlcnBsYXlfdGFibGVfZW50cnkoc3RydWN0IHBwX2h3 bWdyICpod21nciwgdWludDMyX3QgZW50cnlfaW5kZXgsCisJCXN0cnVjdCBwcF9wb3dlcl9zdGF0 ZSAqcG93ZXJfc3RhdGUsIGludCAoKmNhbGxfYmFja19mdW5jKShzdHJ1Y3QgcHBfaHdtZ3IgKiwg dm9pZCAqLAorCQkJCXN0cnVjdCBwcF9wb3dlcl9zdGF0ZSAqLCB2b2lkICosIHVpbnQzMl90KSk7 CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9p bmMvaGFyZHdhcmVtYW5hZ2VyLmggYi9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9pbmMv aGFyZHdhcmVtYW5hZ2VyLmgKaW5kZXggYTY5YjM3OS4uOTc5NWI5YSAxMDA2NDQKLS0tIGEvZHJp dmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaW5jL2hhcmR3YXJlbWFuYWdlci5oCisrKyBiL2Ry aXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2luYy9oYXJkd2FyZW1hbmFnZXIuaApAQCAtMjE5 LDEyICsyMTksMTIgQEAgZW51bSBQSE1fUGVyZm9ybWFuY2VMZXZlbERlc2lnbmF0aW9uIHsKIHR5 cGVkZWYgZW51bSBQSE1fUGVyZm9ybWFuY2VMZXZlbERlc2lnbmF0aW9uIFBITV9QZXJmb3JtYW5j ZUxldmVsRGVzaWduYXRpb247CiAKIHN0cnVjdCBQSE1fUGVyZm9ybWFuY2VMZXZlbCB7Ci0JdWlu dDMyX3QgICAgY29yZUNsb2NrOwotCXVpbnQzMl90ICAgIG1lbW9yeV9jbG9jazsKLQl1aW50MzJf dCAgdmRkYzsKLQl1aW50MzJfdCAgdmRkY2k7Ci0JdWludDMyX3QgICAgbm9uTG9jYWxNZW1vcnlG cmVxOwotCXVpbnQzMl90IG5vbkxvY2FsTWVtb3J5V2lkdGg7CisgICAgdWludDMyX3QgICAgY29y ZUNsb2NrOworICAgIHVpbnQzMl90ICAgIG1lbW9yeV9jbG9jazsKKyAgICB1aW50MzJfdCAgdmRk YzsKKyAgICB1aW50MzJfdCAgdmRkY2k7CisgICAgdWludDMyX3QgICAgbm9uTG9jYWxNZW1vcnlG cmVxOworICAgIHVpbnQzMl90IG5vbkxvY2FsTWVtb3J5V2lkdGg7CiB9OwogCiB0eXBlZGVmIHN0 cnVjdCBQSE1fUGVyZm9ybWFuY2VMZXZlbCBQSE1fUGVyZm9ybWFuY2VMZXZlbDsKQEAgLTI1MSw5 ICsyNTEsOSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgcGhtX2NhcF9lbmFibGVkKGNvbnN0IHVpbnQz Ml90ICpjYXBzLCBlbnVtIHBobV9wbGF0Zm9ybV9jYXBzCiAKICNkZWZpbmUgUFBfUENJRUdlbklu dmFsaWQgIDB4ZmZmZgogZW51bSBQUF9QQ0lFR2VuIHsKLQlQUF9QQ0lFR2VuMSA9IDAsICAgICAg ICAgICAgICAgIC8qIFBDSUUgMS4wIC0gVHJhbnNmZXIgcmF0ZSBvZiAyLjUgR1QvcyAqLwotCVBQ X1BDSUVHZW4yLCAgICAgICAgICAgICAgICAgICAgLypQQ0lFIDIuMCAtIFRyYW5zZmVyIHJhdGUg b2YgNS4wIEdUL3MgKi8KLQlQUF9QQ0lFR2VuMyAgICAgICAgICAgICAgICAgICAgIC8qUENJRSAz LjAgLSBUcmFuc2ZlciByYXRlIG9mIDguMCBHVC9zICovCisgICAgUFBfUENJRUdlbjEgPSAwLCAg ICAgICAgICAgICAgICAvKiBQQ0lFIDEuMCAtIFRyYW5zZmVyIHJhdGUgb2YgMi41IEdUL3MgKi8K KyAgICBQUF9QQ0lFR2VuMiwgICAgICAgICAgICAgICAgICAgIC8qUENJRSAyLjAgLSBUcmFuc2Zl ciByYXRlIG9mIDUuMCBHVC9zICovCisgICAgUFBfUENJRUdlbjMgICAgICAgICAgICAgICAgICAg ICAvKlBDSUUgMy4wIC0gVHJhbnNmZXIgcmF0ZSBvZiA4LjAgR1QvcyAqLwogfTsKIAogdHlwZWRl ZiBlbnVtIFBQX1BDSUVHZW4gUFBfUENJRUdlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS9hbWQvcG93ZXJwbGF5L2luYy9od21nci5oIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBs YXkvaW5jL2h3bWdyLmgKaW5kZXggMThiNWFiMS4uY2E1MTNhMSAxMDA2NDQKLS0tIGEvZHJpdmVy cy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaW5jL2h3bWdyLmgKKysrIGIvZHJpdmVycy9ncHUvZHJt L2FtZC9wb3dlcnBsYXkvaW5jL2h3bWdyLmgKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlICJw cF9pbnN0YW5jZS5oIgogI2luY2x1ZGUgImhhcmR3YXJlbWFuYWdlci5oIgogI2luY2x1ZGUgInBw X3Bvd2VyX3NvdXJjZS5oIgorI2luY2x1ZGUgImh3bWdyX3BwdC5oIgogCiBzdHJ1Y3QgcHBfaW5z dGFuY2U7CiBzdHJ1Y3QgcHBfaHdtZ3I7CkBAIC00MDAsNyArNDAxLDI0IEBAIHN0cnVjdCBwaG1f Y2xvY2tfYW5kX3ZvbHRhZ2VfbGltaXRzIHsKIAl1aW50MTZfdCB2ZGRnZng7CiB9OwogCisvKiBT dHJ1Y3R1cmUgdG8gaG9sZCBQUFRhYmxlIGluZm9ybWF0aW9uICovCiAKK3N0cnVjdCBwaG1fcHB0 X3YxX2luZm9ybWF0aW9uIHsKKwlzdHJ1Y3QgcGhtX3BwdF92MV9jbG9ja192b2x0YWdlX2RlcGVu ZGVuY3lfdGFibGUgKnZkZF9kZXBfb25fc2NsazsKKwlzdHJ1Y3QgcGhtX3BwdF92MV9jbG9ja192 b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUgKnZkZF9kZXBfb25fbWNsazsKKwlzdHJ1Y3QgcGhtX2Ns b2NrX2FycmF5ICp2YWxpZF9zY2xrX3ZhbHVlczsKKwlzdHJ1Y3QgcGhtX2Nsb2NrX2FycmF5ICp2 YWxpZF9tY2xrX3ZhbHVlczsKKwlzdHJ1Y3QgcGhtX2Nsb2NrX2FuZF92b2x0YWdlX2xpbWl0cyBt YXhfY2xvY2tfdm9sdGFnZV9vbl9kYzsKKwlzdHJ1Y3QgcGhtX2Nsb2NrX2FuZF92b2x0YWdlX2xp bWl0cyBtYXhfY2xvY2tfdm9sdGFnZV9vbl9hYzsKKwlzdHJ1Y3QgcGhtX2Nsb2NrX3ZvbHRhZ2Vf ZGVwZW5kZW5jeV90YWJsZSAqdmRkY19kZXBfb25fZGFsX3B3cmw7CisJc3RydWN0IHBobV9wcG1f dGFibGUgKnBwbV9wYXJhbWV0ZXJfdGFibGU7CisJc3RydWN0IHBobV9jYWNfdGRwX3RhYmxlICpj YWNfZHRwX3RhYmxlOworCXN0cnVjdCBwaG1fcHB0X3YxX21tX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5k ZW5jeV90YWJsZSAqbW1fZGVwX3RhYmxlOworCXN0cnVjdCBwaG1fcHB0X3YxX3ZvbHRhZ2VfbG9v a3VwX3RhYmxlICp2ZGRjX2xvb2t1cF90YWJsZTsKKwlzdHJ1Y3QgcGhtX3BwdF92MV92b2x0YWdl X2xvb2t1cF90YWJsZSAqdmRkZ2Z4X2xvb2t1cF90YWJsZTsKKwlzdHJ1Y3QgcGhtX3BwdF92MV9w Y2llX3RhYmxlICpwY2llX3RhYmxlOworCXVpbnQxNl90IHVzX3Vsdl92b2x0YWdlX29mZnNldDsK K307CiAKIHN0cnVjdCBwaG1fZHluYW1pY19zdGF0ZV9pbmZvIHsKIAlzdHJ1Y3QgcGhtX2Nsb2Nr X3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZSAqdmRkY19kZXBlbmRlbmN5X29uX3NjbGs7CkBAIC00 MzQsNiArNDUyLDcwIEBAIHN0cnVjdCBwaG1fZHluYW1pY19zdGF0ZV9pbmZvIHsKIAlzdHJ1Y3Qg cGhtX3ZxX2J1ZGdldGluZ190YWJsZQkJICAJCSAgKnZxX2J1ZGdldGluZ190YWJsZTsKIH07CiAK K3N0cnVjdCBwcF9mYW5faW5mbyB7CisJYm9vbCBiTm9GYW47CisJdWludDhfdCAgIHVjVGFjaG9t ZXRlclB1bHNlc1BlclJldm9sdXRpb247CisJdWludDMyX3QgICB1bE1pblJQTTsKKwl1aW50MzJf dCAgIHVsTWF4UlBNOworfTsKKworc3RydWN0IHBwX2FkdmFuY2VfZmFuX2NvbnRyb2xfcGFyYW1l dGVycyB7CisJdWludDE2X3QgIHVzVE1pbjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRo ZSB0ZW1wZXJhdHVyZSwgaW4gMC4wMSBjZW50aWdyYWRlcywgYmVsb3cgd2hpY2ggd2UganVzdCBy dW4gYXQgYSBtaW5pbWFsIFBXTS4gKi8KKwl1aW50MTZfdCAgdXNUTWVkOyAgICAgICAgICAgICAg ICAgICAgICAgICAgLyogVGhlIG1pZGRsZSB0ZW1wZXJhdHVyZSB3aGVyZSB3ZSBjaGFuZ2Ugc2xv cGVzLiAqLworCXVpbnQxNl90ICB1c1RIaWdoOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBU aGUgaGlnaCB0ZW1wZXJhdHVyZSBmb3Igc2V0dGluZyB0aGUgc2Vjb25kIHNsb3BlLiAqLworCXVp bnQxNl90ICB1c1BXTU1pbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgbWluaW11bSBQ V00gdmFsdWUgaW4gcGVyY2VudCAoMC4wMSUgaW5jcmVtZW50cykuICovCisJdWludDE2X3QgIHVz UFdNTWVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBQV00gdmFsdWUgKGluIHBlcmNl bnQpIGF0IFRNZWQuICovCisJdWludDE2X3QgIHVzUFdNSGlnaDsgICAgICAgICAgICAgICAgICAg ICAgIC8qIFRoZSBQV00gdmFsdWUgYXQgVEhpZ2guICovCisJdWludDhfdCAgIHVjVEh5c3Q7ICAg ICAgICAgICAgICAgICAgICAgICAgIC8qIFRlbXBlcmF0dXJlIGh5c3RlcmVzaXMuIEludGVnZXIu ICovCisJdWludDMyX3QgICB1bEN5Y2xlRGVsYXk7ICAgICAgICAgICAgICAgICAgIC8qIFRoZSB0 aW1lIGJldHdlZW4gdHdvIGludm9jYXRpb25zIG9mIHRoZSBmYW4gY29udHJvbCByb3V0aW5lIGlu IG1pY3Jvc2Vjb25kcy4gKi8KKwl1aW50MTZfdCAgdXNUTWF4OyAgICAgICAgICAgICAgICAgICAg ICAgICAgLyogVGhlIG1heCB0ZW1wZXJhdHVyZSAqLworCXVpbnQ4X3QgICB1Y0ZhbkNvbnRyb2xN b2RlOworCXVpbnQxNl90ICB1c0ZhblBXTU1pbkxpbWl0OworCXVpbnQxNl90ICB1c0ZhblBXTU1h eExpbWl0OworCXVpbnQxNl90ICB1c0ZhblBXTVN0ZXA7CisJdWludDE2X3QgIHVzRGVmYXVsdE1h eEZhblBXTTsKKwl1aW50MTZfdCAgdXNGYW5PdXRwdXRTZW5zaXRpdml0eTsKKwl1aW50MTZfdCAg dXNEZWZhdWx0RmFuT3V0cHV0U2Vuc2l0aXZpdHk7CisJdWludDE2X3QgIHVzTWF4RmFuUFdNOyAg ICAgICAgICAgICAgICAgICAgIC8qIFRoZSBtYXggRmFuIFBXTSB2YWx1ZSBmb3IgRnV6enkgRmFu IENvbnRyb2wgZmVhdHVyZSAqLworCXVpbnQxNl90ICB1c0ZhblJQTU1pbkxpbWl0OyAgICAgICAg ICAgICAgICAvKiBNaW5pbXVtIGxpbWl0IHJhbmdlIGluIHBlcmNlbnRhZ2UsIG5lZWQgdG8gY2Fs Y3VsYXRlIGJhc2VkIG9uIG1pblJQTS9NYXhScG0gKi8KKwl1aW50MTZfdCAgdXNGYW5SUE1NYXhM aW1pdDsgICAgICAgICAgICAgICAgLyogTWF4aW11bSBsaW1pdCByYW5nZSBpbiBwZXJjZW50YWdl LCB1c3VhbGx5IHNldCB0byAxMDAlIGJ5IGRlZmF1bHQgKi8KKwl1aW50MTZfdCAgdXNGYW5SUE1T dGVwOyAgICAgICAgICAgICAgICAgICAgLyogU3RlcCBpbmNyZW1lbnRzL2RlY2VyZW1lbnRzLCBp biBwZXJjZW50ICovCisJdWludDE2X3QgIHVzRGVmYXVsdE1heEZhblJQTTsgICAgICAgICAgICAg IC8qIFRoZSBtYXggRmFuIFJQTSB2YWx1ZSBmb3IgRnV6enkgRmFuIENvbnRyb2wgZmVhdHVyZSwg ZGVmYXVsdCBmcm9tIFBQVGFibGUgKi8KKwl1aW50MTZfdCAgdXNNYXhGYW5SUE07ICAgICAgICAg ICAgICAgICAgICAgLyogVGhlIG1heCBGYW4gUlBNIHZhbHVlIGZvciBGdXp6eSBGYW4gQ29udHJv bCBmZWF0dXJlLCB1c2VyIGRlZmluZWQgKi8KKwl1aW50MTZfdCAgdXNGYW5DdXJyZW50TG93OyAg ICAgICAgICAgICAgICAgLyogTG93IGN1cnJlbnQgKi8KKwl1aW50MTZfdCAgdXNGYW5DdXJyZW50 SGlnaDsgICAgICAgICAgICAgICAgLyogSGlnaCBjdXJyZW50ICovCisJdWludDE2X3QgIHVzRmFu UlBNTG93OyAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBSUE0gKi8KKwl1aW50MTZfdCAgdXNG YW5SUE1IaWdoOyAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBSUE0gKi8KKwl1aW50MzJfdCAg IHVsTWluRmFuU0NMS0Fjb3VzdGljTGltaXQ7ICAgICAgLyogTWluaW11bSBGYW4gQ29udHJvbGxl ciBTQ0xLIEZyZXF1ZW5jeSBBY291c3RpYyBMaW1pdC4gKi8KKwl1aW50OF90ICAgdWNUYXJnZXRU ZW1wZXJhdHVyZTsgICAgICAgICAgICAgLyogQWR2YW5jZWQgZmFuIGNvbnRyb2xsZXIgdGFyZ2V0 IHRlbXBlcmF0dXJlLiAqLworCXVpbnQ4X3QgICB1Y01pbmltdW1QV01MaW1pdDsgICAgICAgICAg ICAgICAvKiBUaGUgbWluaW11bSBQV00gdGhhdCB0aGUgYWR2YW5jZWQgZmFuIGNvbnRyb2xsZXIg Y2FuIHNldC4gIFRoaXMgc2hvdWxkIGJlIHNldCB0byB0aGUgaGlnaGVzdCBQV00gdGhhdCB3aWxs IHJ1biB0aGUgZmFuIGF0IGl0cyBsb3dlc3QgUlBNLiAqLworCXVpbnQxNl90ICB1c0ZhbkdhaW5F ZGdlOyAgICAgICAgICAgICAgICAgICAvKiBUaGUgZm9sbG93aW5nIGlzIGFkZGVkIGZvciBGaWpp ICovCisJdWludDE2X3QgIHVzRmFuR2FpbkhvdHNwb3Q7CisJdWludDE2X3QgIHVzRmFuR2Fpbkxp cXVpZDsKKwl1aW50MTZfdCAgdXNGYW5HYWluVnJWZGRjOworCXVpbnQxNl90ICB1c0ZhbkdhaW5W ck12ZGQ7CisJdWludDE2X3QgIHVzRmFuR2FpblBseDsKKwl1aW50MTZfdCAgdXNGYW5HYWluSGJt OworfTsKKworc3RydWN0IHBwX3RoZXJtYWxfY29udHJvbGxlcl9pbmZvIHsKKwl1aW50OF90IHVj VHlwZTsKKwl1aW50OF90IHVjSTJjTGluZTsKKwl1aW50OF90IHVjSTJjQWRkcmVzczsKKwlzdHJ1 Y3QgcHBfZmFuX2luZm8gZmFuSW5mbzsKKwlzdHJ1Y3QgcHBfYWR2YW5jZV9mYW5fY29udHJvbF9w YXJhbWV0ZXJzIGFkdmFuY2VGYW5Db250cm9sUGFyYW1ldGVyczsKK307CisKK3N0cnVjdCBwaG1f bWljcm9jb2RlX3ZlcnNpb25faW5mbyB7CisJdWludDMyX3QgU01DOworCXVpbnQzMl90IERNQ1U7 CisJdWludDMyX3QgTUM7CisJdWludDMyX3QgTkI7Cit9OworCisvKioKKyAqIFRoZSBtYWluIGhh cmR3YXJlIG1hbmFnZXIgc3RydWN0dXJlLgorICovCiBzdHJ1Y3QgcHBfaHdtZ3IgewogCXVpbnQz Ml90IGNoaXBfZmFtaWx5OwogCXVpbnQzMl90IGNoaXBfaWQ7CkBAIC00NjYsNiArNTQ4LDggQEAg c3RydWN0IHBwX2h3bWdyIHsKIAlzdHJ1Y3QgcHBfcG93ZXJfc3RhdGUgICAgKnBzOwogICAgICAg ICBlbnVtIHBwX3Bvd2VyX3NvdXJjZSAgcG93ZXJfc291cmNlOwogCXVpbnQzMl90IG51bV9wczsK KwlzdHJ1Y3QgcHBfdGhlcm1hbF9jb250cm9sbGVyX2luZm8gdGhlcm1hbF9jb250cm9sbGVyOwor CXN0cnVjdCBwaG1fbWljcm9jb2RlX3ZlcnNpb25faW5mbyBtaWNyb2NvZGVfdmVyc2lvbl9pbmZv OwogCXVpbnQzMl90IHBzX3NpemU7CiAJc3RydWN0IHBwX3Bvd2VyX3N0YXRlICAgICpjdXJyZW50 X3BzOwogCXN0cnVjdCBwcF9wb3dlcl9zdGF0ZSAgICAqcmVxdWVzdF9wczsKQEAgLTQ4Nyw3ICs1 NzEsMTMgQEAgZXh0ZXJuIGludCBwaG1fd2FpdF9vbl9yZWdpc3RlcihzdHJ1Y3QgcHBfaHdtZ3Ig Kmh3bWdyLCB1aW50MzJfdCBpbmRleCwKIGV4dGVybiBpbnQgcGhtX3dhaXRfZm9yX3JlZ2lzdGVy X3VuZXF1YWwoc3RydWN0IHBwX2h3bWdyICpod21nciwKIAkJCQl1aW50MzJfdCBpbmRleCwgdWlu dDMyX3QgdmFsdWUsIHVpbnQzMl90IG1hc2spOwogCitleHRlcm4gdWludDMyX3QgcGhtX3JlYWRf aW5kaXJlY3RfcmVnaXN0ZXIoc3RydWN0IHBwX2h3bWdyICpod21nciwKKwkJdWludDMyX3QgaW5k aXJlY3RfcG9ydCwgdWludDMyX3QgaW5kZXgpOwogCitleHRlcm4gdm9pZCBwaG1fd3JpdGVfaW5k aXJlY3RfcmVnaXN0ZXIoc3RydWN0IHBwX2h3bWdyICpod21nciwKKwkJdWludDMyX3QgaW5kaXJl Y3RfcG9ydCwKKwkJdWludDMyX3QgaW5kZXgsCisJCXVpbnQzMl90IHZhbHVlKTsKIAogZXh0ZXJu IHZvaWQgcGhtX3dhaXRfb25faW5kaXJlY3RfcmVnaXN0ZXIoc3RydWN0IHBwX2h3bWdyICpod21n ciwKIAkJCQl1aW50MzJfdCBpbmRpcmVjdF9wb3J0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUv ZHJtL2FtZC9wb3dlcnBsYXkvaW5jL3BwX2RlYnVnLmggYi9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bv d2VycGxheS9pbmMvcHBfZGVidWcuaAppbmRleCA2NWVmNTQ3Li4zZGYzZGVkIDEwMDY0NAotLS0g YS9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9pbmMvcHBfZGVidWcuaAorKysgYi9kcml2 ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9pbmMvcHBfZGVidWcuaApAQCAtMzEsNyArMzEsNyBA QAogI2RlZmluZSBQUF9BU1NFUlRfV0lUSF9DT0RFKGNvbmQsIG1zZywgY29kZSkJXAogCWRvIHsJ CQkJCVwKIAkJaWYgKCEoY29uZCkpIHsJCQlcCi0JCQlwcmludGsobXNnKTsJXAorCQkJcHJpbnRr KCIlc1xuIiwgbXNnKTsJXAogCQkJY29kZTsJCQlcCiAJCX0JCQkJXAogCX0gd2hpbGUgKDApCmRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9pbmMvc211X3Vjb2RlX3hm ZXJfdmkuaCBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2luYy9zbXVfdWNvZGVfeGZl cl92aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNGE4MWUKLS0tIC9k ZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9pbmMvc211X3Vjb2Rl X3hmZXJfdmkuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IEFkdmFu Y2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFu dGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBv ZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAi U29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rp b24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBj b3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICog YW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25z IHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3Qg dG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQg bm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisg KiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAq CisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBP RiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElN SVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZP UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQg U0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUg Rk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElO IEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZS T00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0Ug T1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRl ZiBTTVVfVUNPREVfWEZFUl9WSV9ICisjZGVmaW5lIFNNVV9VQ09ERV9YRkVSX1ZJX0gKKworI2Rl ZmluZSBTTVVfRFJBTURhdGFfVE9DX1ZFUlNJT04gIDEKKyNkZWZpbmUgTUFYX0lIX1JFR0lTVEVS X0NPVU5UICAgICA2NTUzNQorI2RlZmluZSBTTVVfRElHRVNUX1NJWkVfQllURVMgICAgIDIwCisj ZGVmaW5lIFNNVV9GQl9TSVpFX0JZVEVTICAgICAgICAgMTA0ODU3NgorI2RlZmluZSBTTVVfTUFY X0VOVFJJRVMgICAgICAgICAgIDEyCisKKyNkZWZpbmUgVUNPREVfSURfU01VICAgICAgICAgICAg ICAwCisjZGVmaW5lIFVDT0RFX0lEX1NETUEwICAgICAgICAgICAgMQorI2RlZmluZSBVQ09ERV9J RF9TRE1BMSAgICAgICAgICAgIDIKKyNkZWZpbmUgVUNPREVfSURfQ1BfQ0UgICAgICAgICAgICAz CisjZGVmaW5lIFVDT0RFX0lEX0NQX1BGUCAgICAgICAgICAgNAorI2RlZmluZSBVQ09ERV9JRF9D UF9NRSAgICAgICAgICAgIDUKKyNkZWZpbmUgVUNPREVfSURfQ1BfTUVDICAgICAgICAgICA2Cisj ZGVmaW5lIFVDT0RFX0lEX0NQX01FQ19KVDEgICAgICAgNworI2RlZmluZSBVQ09ERV9JRF9DUF9N RUNfSlQyICAgICAgIDgKKyNkZWZpbmUgVUNPREVfSURfR01DT05fUkVORyAgICAgICA5CisjZGVm aW5lIFVDT0RFX0lEX1JMQ19HICAgICAgICAgICAgMTAKKyNkZWZpbmUgVUNPREVfSURfSUhfUkVH X1JFU1RPUkUgICAxMQorI2RlZmluZSBVQ09ERV9JRF9WQklPUyAgICAgICAgICAgIDEyCisjZGVm aW5lIFVDT0RFX0lEX01JU0NfTUVUQURBVEEgICAgMTMKKyNkZWZpbmUgVUNPREVfSURfUkxDX1ND UkFUQ0ggICAgICAzMgorI2RlZmluZSBVQ09ERV9JRF9STENfU1JNX0FSQU0gICAgIDMzCisjZGVm aW5lIFVDT0RFX0lEX1JMQ19TUk1fRFJBTSAgICAgMzQKKyNkZWZpbmUgVUNPREVfSURfTUVDX1NU T1JBR0UgICAgICAzNQorI2RlZmluZSBVQ09ERV9JRF9WQklPU19QQVJBTUVURVJTIDM2CisjZGVm aW5lIFVDT0RFX01FVEFfREFUQSAgICAgICAgICAgMHhGRgorCisjZGVmaW5lIFVDT0RFX0lEX1NN VV9NQVNLICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgVUNPREVfSURfU0RNQTBfTUFT SyAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBVQ09ERV9JRF9TRE1BMV9NQVNLICAgICAg ICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFVDT0RFX0lEX0NQX0NFX01BU0sgICAgICAgICAgIDB4 MDAwMDAwMDgKKyNkZWZpbmUgVUNPREVfSURfQ1BfUEZQX01BU0sgICAgICAgICAgMHgwMDAwMDAx MAorI2RlZmluZSBVQ09ERV9JRF9DUF9NRV9NQVNLICAgICAgICAgICAweDAwMDAwMDIwCisjZGVm aW5lIFVDT0RFX0lEX0NQX01FQ19NQVNLICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgVUNP REVfSURfQ1BfTUVDX0pUMV9NQVNLICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBVQ09ERV9JRF9D UF9NRUNfSlQyX01BU0sgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIFVDT0RFX0lEX0dNQ09OX1JF TkdfTUFTSyAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgVUNPREVfSURfUkxDX0dfTUFTSyAgICAg ICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBVQ09ERV9JRF9JSF9SRUdfUkVTVE9SRV9NQVNLICAw eDAwMDAwODAwCisjZGVmaW5lIFVDT0RFX0lEX1ZCSU9TX01BU0sgICAgICAgICAgIDB4MDAwMDEw MDAKKworI2RlZmluZSBVQ09ERV9GTEFHX1VOSEFMVF9NQVNLICAgMHgxCisKK3N0cnVjdCBTTVVf RW50cnkgeworI2lmbmRlZiBfX0JJR19FTkRJQU4KKwl1aW50MTZfdCBpZDsKKwl1aW50MTZfdCB2 ZXJzaW9uOworCXVpbnQzMl90IGltYWdlX2FkZHJfaGlnaDsKKwl1aW50MzJfdCBpbWFnZV9hZGRy X2xvdzsKKwl1aW50MzJfdCBtZXRhX2RhdGFfYWRkcl9oaWdoOworCXVpbnQzMl90IG1ldGFfZGF0 YV9hZGRyX2xvdzsKKwl1aW50MzJfdCBkYXRhX3NpemVfYnl0ZTsKKwl1aW50MTZfdCBmbGFnczsK Kwl1aW50MTZfdCBudW1fcmVnaXN0ZXJfZW50cmllczsKKyNlbHNlCisJdWludDE2X3QgdmVyc2lv bjsKKwl1aW50MTZfdCBpZDsKKwl1aW50MzJfdCBpbWFnZV9hZGRyX2hpZ2g7CisJdWludDMyX3Qg aW1hZ2VfYWRkcl9sb3c7CisJdWludDMyX3QgbWV0YV9kYXRhX2FkZHJfaGlnaDsKKwl1aW50MzJf dCBtZXRhX2RhdGFfYWRkcl9sb3c7CisJdWludDMyX3QgZGF0YV9zaXplX2J5dGU7CisJdWludDE2 X3QgbnVtX3JlZ2lzdGVyX2VudHJpZXM7CisJdWludDE2X3QgZmxhZ3M7CisjZW5kaWYKK307CisK K3N0cnVjdCBTTVVfRFJBTURhdGFfVE9DIHsKKwl1aW50MzJfdCBzdHJ1Y3R1cmVfdmVyc2lvbjsK Kwl1aW50MzJfdCBudW1fZW50cmllczsKKwlzdHJ1Y3QgU01VX0VudHJ5IGVudHJ5W1NNVV9NQVhf RU5UUklFU107Cit9OworCisjZW5kaWYKLS0gCjEuOC4zLjEKCl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRl dmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21h aWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==