From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex Deucher Subject: [PATCH 25/51] drm/amd/powerplay: add Fiji DPM support. Date: Thu, 12 Nov 2015 01:18:15 -0500 Message-ID: <1447309121-2480-26-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-f46.google.com (mail-qg0-f46.google.com [209.85.192.46]) by gabe.freedesktop.org (Postfix) with ESMTPS id BFF207A082 for ; Wed, 11 Nov 2015 22:19:17 -0800 (PST) Received: by qgad10 with SMTP id d10so40912104qga.3 for ; Wed, 11 Nov 2015 22:19:17 -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 List-Id: dri-devel@lists.freedesktop.org RnJvbTogRXJpYyBIdWFuZyA8SmluSHVpRXJpYy5IdWFuZ0BhbWQuY29tPgoKVGhpcyBlbmFibGVk IERQTSBzdXBwb3J0IGZvciBGaWppLiAgRFBNIGlzIGR5bmFtaWMKY2xvY2sgYW5kIHZvbHRhZ2Ug c2NhbGluZy4KCnYyOiByZW5hbWUgZmlqaV9od21ncl9lYXJseV9pbml0IHRvIGZpamlfaHdtZ3Jf aW5pdAp2MzogKGFnZCkgZm9sZCBpbiBlbmRpYW4gZml4LCBhZGRpdGlvbmFsIGZ1bmN0aW9uIGFk ZGl0aW9uCgpSZXZpZXdlZC1ieTogQWxleCBEZXVjaGVyIDxhbGV4YW5kZXIuZGV1Y2hlckBhbWQu Y29tPgpTaWduZWQtb2ZmLWJ5OiBFcmljIEh1YW5nIDxKaW5IdWlFcmljLkh1YW5nQGFtZC5jb20+ Ci0tLQogZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvTWFrZWZpbGUgICAgICAg fCAgICAzICstCiAuLi4vZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvZmlqaV9keW5fZGVmYXVsdHMu aCAgICB8ICAxMDUgKwogZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvZmlqaV9o d21nci5jICAgfCA0NzI4ICsrKysrKysrKysrKysrKysrKysrCiBkcml2ZXJzL2dwdS9kcm0vYW1k L3Bvd2VycGxheS9od21nci9maWppX2h3bWdyLmggICB8ICAzNTYgKysKIC4uLi9ncHUvZHJtL2Ft ZC9wb3dlcnBsYXkvaHdtZ3IvZmlqaV9wb3dlcnR1bmUuYyAgIHwgIDU1MyArKysKIC4uLi9ncHUv ZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvZmlqaV9wb3dlcnR1bmUuaCAgIHwgICA2NiArCiBkcml2 ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21nci9od21nci5jICAgICAgICB8ICAgIDUgKwog NyBmaWxlcyBjaGFuZ2VkLCA1ODE1IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkKIGNyZWF0 ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21nci9maWppX2R5 bl9kZWZhdWx0cy5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dl cnBsYXkvaHdtZ3IvZmlqaV9od21nci5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUv ZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvZmlqaV9od21nci5oCiBjcmVhdGUgbW9kZSAxMDA2NDQg ZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvZmlqaV9wb3dlcnR1bmUuYwogY3Jl YXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2h3bWdyL2Zpamlf cG93ZXJ0dW5lLmgKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9o d21nci9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2h3bWdyL01ha2Vm aWxlCmluZGV4IGZkNzNkM2MuLmM3OGUzOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9h bWQvcG93ZXJwbGF5L2h3bWdyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvcG93 ZXJwbGF5L2h3bWdyL01ha2VmaWxlCkBAIC02LDcgKzYsOCBAQCBIQVJEV0FSRV9NR1IgPSBod21n ci5vIHByb2Nlc3NwcHRhYmxlcy5vIGZ1bmN0aW9udGFibGVzLm8gXAogCSAgICAgICBoYXJkd2Fy ZW1hbmFnZXIubyBwcF9hY3BpLm8gY3pfaHdtZ3IubyBcCiAgICAgICAgICAgICAgICBjel9jbG9j a3Bvd2VyZ2F0aW5nLm8gXAogCSAgICAgICB0b25nYV9wcm9jZXNzcHB0YWJsZXMubyBwcGF0b21j dHJsLm8gXAotICAgICAgICAgICAgICAgdG9uZ2FfaHdtZ3IubyAJcHBwY2llbGFuZXMubworICAg ICAgICAgICAgICAgdG9uZ2FfaHdtZ3IubyAJcHBwY2llbGFuZXMubyBcCisgICAgICAgICAgICAg ICBmaWppX3Bvd2VydHVuZS5vIGZpamlfaHdtZ3IubwogCiBBTURfUFBfSFdNR1IgPSAkKGFkZHBy ZWZpeCAkKEFNRF9QUF9QQVRIKS9od21nci8sJChIQVJEV0FSRV9NR1IpKQogCmRpZmYgLS1naXQg YS9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21nci9maWppX2R5bl9kZWZhdWx0cy5o IGIvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvZmlqaV9keW5fZGVmYXVsdHMu aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmQ0M2U4Ci0tLSAvZGV2L251 bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvZmlqaV9keW5fZGVm YXVsdHMuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IEFkdmFuY2Vk IE1pY3JvIERldmljZXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVk LCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0 aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29m dHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24s IGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5 LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5k L29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRv IHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8g dGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90 aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBh bGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisg KiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBB TlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRF RCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBB IFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hB TEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9S IEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFO IEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00s IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IK KyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBG SUpJX0RZTl9ERUZBVUxUU19ICisjZGVmaW5lIEZJSklfRFlOX0RFRkFVTFRTX0gKKworLyoqIFxm aWxlCisqIFZvbGNhbmljIElzbGFuZHMgRHluYW1pYyBkZWZhdWx0IHBhcmFtZXRlcnMuCisqLwor CitlbnVtIEZJSklkcG1fVHJlbmREZXRlY3Rpb24KK3sKKyAgICBGSUpJQWRwbV9UcmVuZERldGVj dGlvbl9BVVRPLAorICAgIEZJSklBZHBtX1RyZW5kRGV0ZWN0aW9uX1VQLAorICAgIEZJSklBZHBt X1RyZW5kRGV0ZWN0aW9uX0RPV04KK307Cit0eXBlZGVmIGVudW0gRklKSWRwbV9UcmVuZERldGVj dGlvbiBGSUpJZHBtX1RyZW5kRGV0ZWN0aW9uOworCisvKiBXZSBuZWVkIHRvIGZpbGwgaW4gdGhl IGRlZmF1bHQgdmFsdWVzISEhISEhISEhISEhISEhISEhISEhISEgKi8KKworLyogQml0IHZlY3Rv ciByZXByZXNlbnRpbmcgc2FtZSBmaWVsZHMgYXMgaGFyZHdhcmUgcmVnaXN0ZXIuICovCisjZGVm aW5lIFBQRklKSV9WT1RJTkdSSUdIVFNDTElFTlRTX0RGTFQwICAgIDB4M0ZGRkMxMDIgIC8qIENQ X0dmeF9idXN5ID8/Pz8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICogSERQX2J1c3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSUhfYnVzeQorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBVVkRfYnVzeQorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBWQ0Vf YnVzeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKiBBQ1BfYnVzeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgKiBTQU1VX2J1c3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU0RNQSBlbmFibGVkICovCisjZGVmaW5l IFBQRklKSV9WT1RJTkdSSUdIVFNDTElFTlRTX0RGTFQxICAgIDB4MDAwNDAwICAvKiBGRV9HZnhf YnVzeSAgLSBJbnRlbmRlZCBmb3IgcHJpbWFyeSB1c2FnZS4gICBSZXN0IGFyZSBmb3IgZmxleGli aWxpdHkuID8/Pz8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAqIFNIX0dmeF9idXN5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKiBSQl9HZnhfYnVzeQorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVkNFX2J1c3kgKi8KKworI2Rl ZmluZSBQUEZJSklfVk9USU5HUklHSFRTQ0xJRU5UU19ERkxUMiAgICAweEMwMDA4MCAgLyogU0hf R2Z4X2J1c3kgLSBJbnRlbmRlZCBmb3IgcHJpbWFyeSB1c2FnZS4gICBSZXN0IGFyZSBmb3IgZmxl eGliaWxpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKiBGRV9HZnhfYnVzeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICogUkJfR2Z4X2J1c3kKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEFDUF9idXN5ICovCisKKyNkZWZp bmUgUFBGSUpJX1ZPVElOR1JJR0hUU0NMSUVOVFNfREZMVDMgICAgMHhDMDAyMDAgIC8qIFJCX0dm eF9idXN5IC0gSW50ZW5kZWQgZm9yIHByaW1hcnkgdXNhZ2UuICAgUmVzdCBhcmUgZm9yIGZsZXhp YmlsaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICogRkVfR2Z4X2J1c3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAqIFNIX0dmeF9idXN5CisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBVVkRfYnVzeSAqLworCisjZGVmaW5l IFBQRklKSV9WT1RJTkdSSUdIVFNDTElFTlRTX0RGTFQ0ICAgIDB4QzAxNjgwICAvKiBVVkRfYnVz eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICogVkNFX2J1c3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAqIEFDUF9idXN5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKiBTQU1VX2J1c3kgKi8KKworI2RlZmluZSBQUEZJSklfVk9U SU5HUklHSFRTQ0xJRU5UU19ERkxUNSAgICAweEMwMDAzMyAgLyogR0ZYLCBIRFAgKi8KKyNkZWZp bmUgUFBGSUpJX1ZPVElOR1JJR0hUU0NMSUVOVFNfREZMVDYgICAgMHhDMDAwMzMgIC8qIEdGWCwg SERQICovCisjZGVmaW5lIFBQRklKSV9WT1RJTkdSSUdIVFNDTElFTlRTX0RGTFQ3ICAgIDB4M0ZG RkMwMDAgIC8qIEdGWCwgSERQICovCisKKworLyogdGhlcm1hbCBwcm90ZWN0aW9uIGNvdW50ZXIg KHVuaXRzKS4gKi8KKyNkZWZpbmUgUFBGSUpJX1RIRVJNQUxQUk9URUNUQ09VTlRFUl9ERkxUICAg ICAgICAgICAgMHgyMDAgLyogfjE5dXMgKi8KKworLyogc3RhdGljIHNjcmVlbiB0aHJlc2hvbGQg dW5pdCAqLworI2RlZmluZSBQUEZJSklfU1RBVElDU0NSRUVOVEhSRVNIT0xEVU5JVF9ERkxUICAg IDAKKworLyogc3RhdGljIHNjcmVlbiB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgUFBGSUpJX1NUQVRJ Q1NDUkVFTlRIUkVTSE9MRF9ERkxUICAgICAgICAweDAwQzgKKworLyogZ2Z4IGlkbGUgY2xvY2sg c3RvcCB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgUFBGSUpJX0dGWElETEVDTE9DS1NUT1BUSFJFU0hP TERfREZMVCAgICAgICAgMHgyMDAgLyogfjE5dXMgd2l0aCBzdGF0aWMgc2NyZWVuIHRocmVzaG9s ZCB1bml0IG9mIDAgKi8KKworLyogRml4ZWQgcmVmZXJlbmNlIGRpdmlkZXIgdG8gdXNlIHdoZW4g YnVpbGRpbmcgYmFieSBzdGVwcGluZyB0YWJsZXMuICovCisjZGVmaW5lIFBQRklKSV9SRUZFUkVO Q0VESVZJREVSX0RGTFQgICAgICAgICAgICAgICAgICA0CisKKy8qIFVMViB2b2x0YWdlIGNoYW5n ZSBkZWxheSB0aW1lCisgKiBVc2VkIHRvIGJlIGRlbGF5X3ZyZWcgaW4gTi5JLiBzcGxpdCBmb3Ig Uy5JLgorICogVXNpbmcgTi5JLiBkZWxheV92cmVnIHZhbHVlIGFzIGRlZmF1bHQKKyAqIFJlZmVy ZW5jZUNsb2NrID0gMjcwMAorICogVm9sdGFnZVJlc3BvbnNlVGltZSA9IDEwMDAKKyAqIFZERENE ZWxheVRpbWUgPSAoVm9sdGFnZVJlc3BvbnNlVGltZSAqIFJlZmVyZW5jZUNsb2NrKSAvIDE2MDAg PSAxNjg3CisgKi8KKyNkZWZpbmUgUFBGSUpJX1VMVlZPTFRBR0VDSEFOR0VERUxBWV9ERkxUICAg ICAgICAgICAgIDE2ODcKKworI2RlZmluZSBQUEZJSklfQ0dVTFZQQVJBTUVURVJfREZMVAkJCTB4 MDAwNDAwMzUKKyNkZWZpbmUgUFBGSUpJX0NHVUxWQ09OVFJPTF9ERkxUCQkJMHgwMDAwNzQ1MAor I2RlZmluZSBQUEZJSklfVEFSR0VUQUNUSVZJVFlfREZMVAkJCTMwIC8qIDMwJSovCisjZGVmaW5l IFBQRklKSV9NQ0xLX1RBUkdFVEFDVElWSVRZX0RGTFQJCTEwIC8qIDEwJSAqLworCisjZW5kaWYK KwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvZmlqaV9o d21nci5jIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvZmlqaV9od21nci5j Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NTc4NzgKLS0tIC9kZXYvbnVs bAorKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21nci9maWppX2h3bWdyLmMK QEAgLTAsMCArMSw0NzI4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgQWR2YW5jZWQgTWljcm8g RGV2aWNlcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUg b2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29m dHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIp LAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVk aW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlm eSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2Vs bCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0 aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9s bG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5k IHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3Bp ZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBT T0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5E LCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRI RSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElD VUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICog VEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENM QUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9O IE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9G IE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RI RVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L21v ZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgor I2luY2x1ZGUgImxpbnV4L2RlbGF5LmgiCisKKyNpbmNsdWRlICJod21nci5oIgorI2luY2x1ZGUg ImZpamlfc211bWdyLmgiCisjaW5jbHVkZSAiYXRvbWJpb3MuaCIKKyNpbmNsdWRlICJoYXJkd2Fy ZW1hbmFnZXIuaCIKKyNpbmNsdWRlICJwcGF0b21jdHJsLmgiCisjaW5jbHVkZSAiYXRvbWJpb3Mu aCIKKyNpbmNsdWRlICJjZ3NfY29tbW9uLmgiCisjaW5jbHVkZSAiZmlqaV9keW5fZGVmYXVsdHMu aCIKKyNpbmNsdWRlICJmaWppX3Bvd2VydHVuZS5oIgorI2luY2x1ZGUgInNtdTczLmgiCisjaW5j bHVkZSAic211L3NtdV83XzFfM19kLmgiCisjaW5jbHVkZSAic211L3NtdV83XzFfM19zaF9tYXNr LmgiCisjaW5jbHVkZSAiZ21jL2dtY184XzFfZC5oIgorI2luY2x1ZGUgImdtYy9nbWNfOF8xX3No X21hc2suaCIKKyNpbmNsdWRlICJiaWYvYmlmXzVfMF9kLmgiCisjaW5jbHVkZSAiYmlmL2JpZl81 XzBfc2hfbWFzay5oIgorI2luY2x1ZGUgImRjZS9kY2VfMTBfMF9kLmgiCisjaW5jbHVkZSAiZGNl L2RjZV8xMF8wX3NoX21hc2suaCIKKyNpbmNsdWRlICJwcHBjaWVsYW5lcy5oIgorI2luY2x1ZGUg ImZpamlfaHdtZ3IuaCIKKyNpbmNsdWRlICJ0b25nYV9wcm9jZXNzcHB0YWJsZXMuaCIKKyNpbmNs dWRlICJ0b25nYV9wcHRhYmxlLmgiCisjaW5jbHVkZSAicHBfZGVidWcuaCIKKyNpbmNsdWRlICJw cF9hY3BpLmgiCisKKyNkZWZpbmUgVk9MVEFHRV9TQ0FMRQk0CisjZGVmaW5lIFNNQ19SQU1fRU5E CQkweDQwMDAwCisjZGVmaW5lIFZERENfVkREQ0lfREVMVEEJMzAwCisKKyNkZWZpbmUgTUNfU0VR X01JU0MwX0dERFI1X1NISUZUIDI4CisjZGVmaW5lIE1DX1NFUV9NSVNDMF9HRERSNV9NQVNLICAw eGYwMDAwMDAwCisjZGVmaW5lIE1DX1NFUV9NSVNDMF9HRERSNV9WQUxVRSA1CisKKyNkZWZpbmUg TUNfQ0dfQVJCX0ZSRVFfRjAgICAgICAgICAgIDB4MGEgLyogYm9vdC11cCBkZWZhdWx0ICovCisj ZGVmaW5lIE1DX0NHX0FSQl9GUkVRX0YxICAgICAgICAgICAweDBiCisjZGVmaW5lIE1DX0NHX0FS Ql9GUkVRX0YyICAgICAgICAgICAweDBjCisjZGVmaW5lIE1DX0NHX0FSQl9GUkVRX0YzICAgICAg ICAgICAweDBkCisKKy8qIEZyb20gc21jX3JlZy5oICovCisjZGVmaW5lIFNNQ19DR19JTkRfU1RB UlQgICAgICAgICAgICAweGMwMDMwMDAwCisjZGVmaW5lIFNNQ19DR19JTkRfRU5EICAgICAgICAg ICAgICAweGMwMDQwMDAwICAvKiBGaXJzdCBieXRlIGFmdGVyIFNNQ19DR19JTkQgKi8KKworI2Rl ZmluZSBWT0xUQUdFX1NDQUxFICAgICAgICAgICAgICAgNAorI2RlZmluZSBWT0xUQUdFX1ZJRF9P RkZTRVRfU0NBTEUxICAgNjI1CisjZGVmaW5lIFZPTFRBR0VfVklEX09GRlNFVF9TQ0FMRTIgICAx MDAKKworI2RlZmluZSBWRERDX1ZERENJX0RFTFRBICAgICAgICAgICAgMzAwCisKKyNkZWZpbmUg aXhTV1JTVF9DT01NQU5EXzEgICAgICAgICAgIDB4MTQwMDEwMworI2RlZmluZSBNQ19TRVFfQ05U TF9fQ0FDX0VOX01BU0sgICAgMHg0MDAwMDAwMAorCisvKiogVmFsdWVzIGZvciB0aGUgQ0dfVEhF Uk1BTF9DVFJMOjpEUE1fRVZFTlRfU1JDIGZpZWxkLiAqLworZW51bSBEUE1fRVZFTlRfU1JDIHsK KyAgICBEUE1fRVZFTlRfU1JDX0FOQUxPRyA9IDAsICAgICAgICAgICAgICAgLyogSW50ZXJuYWwg YW5hbG9nIHRyaXAgcG9pbnQgKi8KKyAgICBEUE1fRVZFTlRfU1JDX0VYVEVSTkFMID0gMSwgICAg ICAgICAgICAgLyogRXh0ZXJuYWwgKEdQSU8gMTcpIHNpZ25hbCAqLworICAgIERQTV9FVkVOVF9T UkNfRElHSVRBTCA9IDIsICAgICAgICAgICAgICAvKiBJbnRlcm5hbCBkaWdpdGFsIHRyaXAgcG9p bnQgKERJR19USEVSTV9EUE0pICovCisgICAgRFBNX0VWRU5UX1NSQ19BTkFMT0dfT1JfRVhURVJO QUwgPSAzLCAgIC8qIEludGVybmFsIGFuYWxvZyBvciBleHRlcm5hbCAqLworICAgIERQTV9FVkVO VF9TUkNfRElHSVRBTF9PUl9FWFRFUk5BTCA9IDQgICAvKiBJbnRlcm5hbCBkaWdpdGFsIG9yIGV4 dGVybmFsICovCit9OworCitlbnVtIERJU1BMQVlfR0FQIHsKKwlESVNQTEFZX0dBUF9WQkxBTktf T1JfV00gPSAwLCAgIC8qIFdhaXQgZm9yIHZibGFuayBvciBNQ0hHIHdhdGVybWFyay4gKi8KKwlE SVNQTEFZX0dBUF9WQkxBTksgICAgICAgPSAxLCAgIC8qIFdhaXQgZm9yIHZibGFuay4gKi8KKwlE SVNQTEFZX0dBUF9XQVRFUk1BUksgICAgPSAyLCAgIC8qIFdhaXQgZm9yIE1DSEcgd2F0ZXJtYXJr LiAqLworCURJU1BMQVlfR0FQX0lHTk9SRSAgICAgICA9IDMgICAgLyogRG8gbm90IHdhaXQuICov Cit9OworCisvKiBbMi41JSx+Mi41JV0gQ2xvY2sgc3RyZXRjaGVkIGlzIG11bHRpcGxlIG9mIDIu NSUgdnMKKyAqIG5vdCBhbmQgW0ZtaW4sIEZtYXgsIExET19SRUZTRUwsIFVTRV9GT1JfTE9XX0ZS RVFdCisgKi8KK3VpbnQxNl90IGZpamlfY2xvY2tfc3RyZXRjaGVyX2xvb2t1cF90YWJsZVsyXVs0 XSA9IHsgezYwMCwgMTA1MCwgMywgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB7NjAwLCAxMDUwLCA2LCAxfSB9OworCisvKiBbRkYsIFNTXSB0eXBl LCBbXSA0IHZvbHRhZ2UgcmFuZ2VzLCBhbmQKKyAqIFtGbG9vciBGcmVxLCBCb3VuZGFyeSBGcmVx LCBWSUQgbWluICwgVklEIG1heF0KKyAqLwordWludDMyX3QgZmlqaV9jbG9ja19zdHJldGNoZXJf ZGR0X3RhYmxlWzJdWzRdWzRdID0KK3sgeyB7MjY1LCA1MjksIDEyMCwgMTI4fSwgezMyNSwgNjUw LCA5NiwgMTE5fSwgezQzMCwgODYwLCAzMiwgOTV9LCB7MCwgMCwgMCwgMzF9IH0sCisgIHsgezI3 NSwgNTUwLCAxMDQsIDExMn0sIHszMTksIDYzOCwgOTYsIDEwM30sIHszNjAsIDcyMCwgNjQsIDk1 fSwgezM4NCwgNzY4LCAzMiwgNjN9IH0gfTsKKworLyogW1VzZV9Gb3JfTG93X2ZyZXFdIHZhbHVl LCBbMCUsIDUlLCAxMCUsIDcuMTQlLCAxNC4yOCUsIDIwJV0KKyAqIChjb21pbmcgZnJvbSBQV1Jf Q0tTX0NOVEwuc3RyZXRjaF9hbW91bnQgcmVnIHNwZWMpCisgKi8KK3VpbnQ4X3QgZmlqaV9jbG9j a19zdHJldGNoX2Ftb3VudF9jb252ZXJzaW9uWzJdWzZdID0geyB7MCwgMSwgMywgMiwgNCwgNX0s CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAy LCA0LCA1LCA2LCA1fSB9OworCitjb25zdCB1bnNpZ25lZCBsb25nIFBod0ZpamlfTWFnaWMgPSAo dW5zaWduZWQgbG9uZykoUEhNX1ZJc2xhbmRzX01hZ2ljKTsKKworc3RydWN0IGZpamlfcG93ZXJf c3RhdGUgKmNhc3RfcGh3X2ZpamlfcG93ZXJfc3RhdGUoCisJCQkJICBzdHJ1Y3QgcHBfaHdfcG93 ZXJfc3RhdGUgKmh3X3BzKQoreworCVBQX0FTU0VSVF9XSVRIX0NPREUoKFBod0ZpamlfTWFnaWMg PT0gaHdfcHMtPm1hZ2ljKSwKKwkJCQkiSW52YWxpZCBQb3dlcnN0YXRlIFR5cGUhIiwKKwkJCQkg cmV0dXJuIE5VTEw7KTsKKworCXJldHVybiAoc3RydWN0IGZpamlfcG93ZXJfc3RhdGUgKilod19w czsKK30KKworY29uc3Qgc3RydWN0IGZpamlfcG93ZXJfc3RhdGUgKmNhc3RfY29uc3RfcGh3X2Zp amlfcG93ZXJfc3RhdGUoCisJCQkJIGNvbnN0IHN0cnVjdCBwcF9od19wb3dlcl9zdGF0ZSAqaHdf cHMpCit7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgoUGh3RmlqaV9NYWdpYyA9PSBod19wcy0+bWFn aWMpLAorCQkJCSJJbnZhbGlkIFBvd2Vyc3RhdGUgVHlwZSEiLAorCQkJCSByZXR1cm4gTlVMTDsp OworCisJcmV0dXJuIChjb25zdCBzdHJ1Y3QgZmlqaV9wb3dlcl9zdGF0ZSAqKWh3X3BzOworfQor CitzdGF0aWMgYm9vbCBmaWppX2lzX2RwbV9ydW5uaW5nKHN0cnVjdCBwcF9od21nciAqaHdtZ3Ip Cit7CisJcmV0dXJuICgxID09IFBITV9SRUFEX0lORElSRUNUX0ZJRUxEKGh3bWdyLT5kZXZpY2Us CisJCQlDR1NfSU5EX1JFR19fU01DLCBGRUFUVVJFX1NUQVRVUywgVk9MVEFHRV9DT05UUk9MTEVS X09OKSkKKwkJCT8gdHJ1ZSA6IGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBmaWppX2luaXRfZHBt X2RlZmF1bHRzKHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJc3RydWN0IGZpamlfaHdtZ3Ig KmRhdGEgPSAoc3RydWN0IGZpamlfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXN0cnVjdCBm aWppX3Vsdl9wYXJtICp1bHYgPSAmZGF0YS0+dWx2OworCisJdWx2LT5jZ191bHZfcGFyYW1ldGVy ID0gUFBGSUpJX0NHVUxWUEFSQU1FVEVSX0RGTFQ7CisJZGF0YS0+dm90aW5nX3JpZ2h0c19jbGll bnRzMCA9IFBQRklKSV9WT1RJTkdSSUdIVFNDTElFTlRTX0RGTFQwOworCWRhdGEtPnZvdGluZ19y aWdodHNfY2xpZW50czEgPSBQUEZJSklfVk9USU5HUklHSFRTQ0xJRU5UU19ERkxUMTsKKwlkYXRh LT52b3RpbmdfcmlnaHRzX2NsaWVudHMyID0gUFBGSUpJX1ZPVElOR1JJR0hUU0NMSUVOVFNfREZM VDI7CisJZGF0YS0+dm90aW5nX3JpZ2h0c19jbGllbnRzMyA9IFBQRklKSV9WT1RJTkdSSUdIVFND TElFTlRTX0RGTFQzOworCWRhdGEtPnZvdGluZ19yaWdodHNfY2xpZW50czQgPSBQUEZJSklfVk9U SU5HUklHSFRTQ0xJRU5UU19ERkxUNDsKKwlkYXRhLT52b3RpbmdfcmlnaHRzX2NsaWVudHM1ID0g UFBGSUpJX1ZPVElOR1JJR0hUU0NMSUVOVFNfREZMVDU7CisJZGF0YS0+dm90aW5nX3JpZ2h0c19j bGllbnRzNiA9IFBQRklKSV9WT1RJTkdSSUdIVFNDTElFTlRTX0RGTFQ2OworCWRhdGEtPnZvdGlu Z19yaWdodHNfY2xpZW50czcgPSBQUEZJSklfVk9USU5HUklHSFRTQ0xJRU5UU19ERkxUNzsKKwor CWRhdGEtPnN0YXRpY19zY3JlZW5fdGhyZXNob2xkX3VuaXQgPQorCQkJUFBGSUpJX1NUQVRJQ1ND UkVFTlRIUkVTSE9MRFVOSVRfREZMVDsKKwlkYXRhLT5zdGF0aWNfc2NyZWVuX3RocmVzaG9sZCA9 CisJCQlQUEZJSklfU1RBVElDU0NSRUVOVEhSRVNIT0xEX0RGTFQ7CisKKwkvKiBVbnNldCBBQk0g Y2FwIGFzIGl0IG1vdmVkIHRvIERBTC4KKwkgKiBBZGQgUEhNX1BsYXRmb3JtQ2Fwc19Ob25BQk1T dXBwb3J0SW5QUExpYgorCSAqIGZvciByZS1kaXJlY3QgQUJNIHJlbGF0ZWQgcmVxdWVzdCB0byBE QUwKKwkgKi8KKwlwaG1fY2FwX3Vuc2V0KGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLnBsYXRm b3JtQ2FwcywKKwkJCVBITV9QbGF0Zm9ybUNhcHNfQUJNKTsKKwlwaG1fY2FwX3NldChod21nci0+ cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCQlQSE1fUGxhdGZvcm1DYXBzX05v bkFCTVN1cHBvcnRJblBQTGliKTsKKworCXBobV9jYXBfc2V0KGh3bWdyLT5wbGF0Zm9ybV9kZXNj cmlwdG9yLnBsYXRmb3JtQ2FwcywKKwkJCVBITV9QbGF0Zm9ybUNhcHNfRHluYW1pY0FDVGltaW5n KTsKKworCWZpamlfaW5pdGlhbGl6ZV9wb3dlcl90dW5lX2RlZmF1bHRzKGh3bWdyKTsKKworCWRh dGEtPm1jbGtfc3R1dHRlcl9tb2RlX3RocmVzaG9sZCA9IDYwMDAwOworCWRhdGEtPnBjaWVfZ2Vu X3BlcmZvcm1hbmNlLm1heCA9IFBQX1BDSUVHZW4xOworCWRhdGEtPnBjaWVfZ2VuX3BlcmZvcm1h bmNlLm1pbiA9IFBQX1BDSUVHZW4zOworCWRhdGEtPnBjaWVfZ2VuX3Bvd2VyX3NhdmluZy5tYXgg PSBQUF9QQ0lFR2VuMTsKKwlkYXRhLT5wY2llX2dlbl9wb3dlcl9zYXZpbmcubWluID0gUFBfUENJ RUdlbjM7CisJZGF0YS0+cGNpZV9sYW5lX3BlcmZvcm1hbmNlLm1heCA9IDA7CisJZGF0YS0+cGNp ZV9sYW5lX3BlcmZvcm1hbmNlLm1pbiA9IDE2OworCWRhdGEtPnBjaWVfbGFuZV9wb3dlcl9zYXZp bmcubWF4ID0gMDsKKwlkYXRhLT5wY2llX2xhbmVfcG93ZXJfc2F2aW5nLm1pbiA9IDE2OworCisJ cGhtX2NhcF9zZXQoaHdtZ3ItPnBsYXRmb3JtX2Rlc2NyaXB0b3IucGxhdGZvcm1DYXBzLAorCQkJ UEhNX1BsYXRmb3JtQ2Fwc19EeW5hbWljVVZEU3RhdGUpOworfQorCitzdGF0aWMgaW50IGZpamlf Z2V0X3NjbGtfZm9yX3ZvbHRhZ2VfZXZ2KHN0cnVjdCBwcF9od21nciAqaHdtZ3IsCisJcGhtX3Bw dF92MV92b2x0YWdlX2xvb2t1cF90YWJsZSAqbG9va3VwX3RhYmxlLAorCXVpbnQxNl90IHZpcnR1 YWxfdm9sdGFnZV9pZCwgaW50MzJfdCAqc2NsaykKK3sKKwl1aW50OF90IGVudHJ5SWQ7CisJdWlu dDhfdCB2b2x0YWdlSWQ7CisJc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKnRhYmxlX2lu Zm8gPQorCQkJKHN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICopKGh3bWdyLT5wcHRhYmxl KTsKKworCVBQX0FTU0VSVF9XSVRIX0NPREUobG9va3VwX3RhYmxlLT5jb3VudCAhPSAwLCAiTG9v a3VwIHRhYmxlIGlzIGVtcHR5IiwgcmV0dXJuIC1FSU5WQUwpOworCisJLyogc2VhcmNoIGZvciBs ZWFrYWdlIHZvbHRhZ2UgSUQgMHhmZjAxIH4gMHhmZjA4IGFuZCBzY2tsICovCisJZm9yIChlbnRy eUlkID0gMDsgZW50cnlJZCA8IHRhYmxlX2luZm8tPnZkZF9kZXBfb25fc2Nsay0+Y291bnQ7IGVu dHJ5SWQrKykgeworCQl2b2x0YWdlSWQgPSB0YWJsZV9pbmZvLT52ZGRfZGVwX29uX3NjbGstPmVu dHJpZXNbZW50cnlJZF0udmRkSW5kOworCQlpZiAobG9va3VwX3RhYmxlLT5lbnRyaWVzW3ZvbHRh Z2VJZF0udXNfdmRkID09IHZpcnR1YWxfdm9sdGFnZV9pZCkKKwkJCWJyZWFrOworCX0KKworCVBQ X0FTU0VSVF9XSVRIX0NPREUoZW50cnlJZCA8IHRhYmxlX2luZm8tPnZkZF9kZXBfb25fc2Nsay0+ Y291bnQsCisJCQkiQ2FuJ3QgZmluZCByZXF1ZXN0ZWQgdm9sdGFnZSBpZCBpbiB2ZGRfZGVwX29u X3NjbGsgdGFibGUhIiwKKwkJCXJldHVybiAtRUlOVkFMOworCQkJKTsKKworCSpzY2xrID0gdGFi bGVfaW5mby0+dmRkX2RlcF9vbl9zY2xrLT5lbnRyaWVzW2VudHJ5SWRdLmNsazsKKworCXJldHVy biAwOworfQorCisvKioKKyogR2V0IExlYWthZ2UgVkREQyBiYXNlZCBvbiBsZWFrYWdlIElELgor KgorKiBAcGFyYW0gICAgaHdtZ3IgIHRoZSBhZGRyZXNzIG9mIHRoZSBwb3dlcnBsYXkgaGFyZHdh cmUgbWFuYWdlci4KKyogQHJldHVybiAgIGFsd2F5cyAwCisqLworc3RhdGljIGludCBmaWppX2dl dF9ldnZfdm9sdGFnZXMoc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwlzdHJ1Y3QgZmlqaV9o d21nciAqZGF0YSA9IChzdHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJdWlu dDE2X3QgICAgdnZfaWQ7CisJdWludDE2X3QgICAgdmRkYyA9IDA7CisJdWludDE2X3QgICAgZXZ2 X2RlZmF1bHQgPSAxMTUwOworCXVpbnQxNl90ICAgIGksIGo7CisJdWludDMyX3QgIHNjbGsgPSAw OworCXN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICp0YWJsZV9pbmZvID0KKwkJCShzdHJ1 Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqKWh3bWdyLT5wcHRhYmxlOworCXN0cnVjdCBwaG1f cHB0X3YxX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZSAqc2Nsa190YWJsZSA9CisJCQl0 YWJsZV9pbmZvLT52ZGRfZGVwX29uX3NjbGs7CisJaW50IHJlc3VsdDsKKworCWZvciAoaSA9IDA7 IGkgPCBGSUpJX01BWF9MRUFLQUdFX0NPVU5UOyBpKyspIHsKKwkJdnZfaWQgPSBBVE9NX1ZJUlRV QUxfVk9MVEFHRV9JRDAgKyBpOworCQlpZiAoIWZpamlfZ2V0X3NjbGtfZm9yX3ZvbHRhZ2VfZXZ2 KGh3bWdyLAorCQkJCXRhYmxlX2luZm8tPnZkZGNfbG9va3VwX3RhYmxlLCB2dl9pZCwgJnNjbGsp KSB7CisJCQlpZiAocGhtX2NhcF9lbmFibGVkKGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLnBs YXRmb3JtQ2FwcywKKwkJCQkJUEhNX1BsYXRmb3JtQ2Fwc19DbG9ja1N0cmV0Y2hlcikpIHsKKwkJ CQlmb3IgKGogPSAxOyBqIDwgc2Nsa190YWJsZS0+Y291bnQ7IGorKykgeworCQkJCQlpZiAoc2Ns a190YWJsZS0+ZW50cmllc1tqXS5jbGsgPT0gc2NsayAmJgorCQkJCQkJCXNjbGtfdGFibGUtPmVu dHJpZXNbal0uY2tzX2VuYWJsZSA9PSAwKSB7CisJCQkJCQlzY2xrICs9IDUwMDA7CisJCQkJCQli cmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKHBobV9jYXBfZW5hYmxlZChod21n ci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCQkJCVBITV9QbGF0Zm9ybUNh cHNfRW5hYmxlRHJpdmVyRVZWKSkKKwkJCQlyZXN1bHQgPSBhdG9tY3RybF9jYWxjdWxhdGVfdm9s dGFnZV9ldnZfb25fc2Nsayhod21nciwKKwkJCQkJCVZPTFRBR0VfVFlQRV9WRERDLCBzY2xrLCB2 dl9pZCwgJnZkZGMsIGksIHRydWUpOworCQkJZWxzZQorCQkJCXJlc3VsdCA9IC1FSU5WQUw7CisK KwkJCWlmIChyZXN1bHQpCisJCQkJcmVzdWx0ID0gYXRvbWN0cmxfZ2V0X3ZvbHRhZ2VfZXZ2X29u X3NjbGsoaHdtZ3IsCisJCQkJCQlWT0xUQUdFX1RZUEVfVkREQywgc2Nsayx2dl9pZCwgJnZkZGMp OworCisJCQkvKiBuZWVkIHRvIG1ha2Ugc3VyZSB2ZGRjIGlzIGxlc3MgdGhhbiAydiBvciBlbHNl LCBpdCBjb3VsZCBidXJuIHRoZSBBU0lDLiAqLworCQkJUFBfQVNTRVJUX1dJVEhfQ09ERSgodmRk YyA8IDIwMDApLAorCQkJCQkiSW52YWxpZCBWRERDIHZhbHVlLCBncmVhdGVyIHRoYW4gMnYhIiwg cmVzdWx0ID0gLUVJTlZBTDspOworCisJCQlpZiAocmVzdWx0KQorCQkJCS8qIDEuMTVWIGlzIHRo ZSBkZWZhdWx0IHNhZmUgdmFsdWUgZm9yIEZpamkgKi8KKwkJCQl2ZGRjID0gZXZ2X2RlZmF1bHQ7 CisKKwkJCS8qIHRoZSB2b2x0YWdlIHNob3VsZCBub3QgYmUgemVybyBub3IgZXF1YWwgdG8gbGVh a2FnZSBJRCAqLworCQkJaWYgKHZkZGMgIT0gMCAmJiB2ZGRjICE9IHZ2X2lkKSB7CisJCQkJZGF0 YS0+dmRkY19sZWFrYWdlLmFjdHVhbF92b2x0YWdlCisJCQkJW2RhdGEtPnZkZGNfbGVha2FnZS5j b3VudF0gPSB2ZGRjOworCQkJCWRhdGEtPnZkZGNfbGVha2FnZS5sZWFrYWdlX2lkCisJCQkJW2Rh dGEtPnZkZGNfbGVha2FnZS5jb3VudF0gPSB2dl9pZDsKKwkJCQlkYXRhLT52ZGRjX2xlYWthZ2Uu Y291bnQrKzsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBDaGFuZ2Ug dmlydHVhbCBsZWFrYWdlIHZvbHRhZ2UgdG8gYWN0dWFsIHZhbHVlLgorICoKKyAqIEBwYXJhbSAg ICAgaHdtZ3IgIHRoZSBhZGRyZXNzIG9mIHRoZSBwb3dlcnBsYXkgaGFyZHdhcmUgbWFuYWdlci4K KyAqIEBwYXJhbSAgICAgcG9pbnRlciB0byBjaGFuZ2luZyB2b2x0YWdlCisgKiBAcGFyYW0gICAg IHBvaW50ZXIgdG8gbGVha2FnZSB0YWJsZQorICovCitzdGF0aWMgdm9pZCBmaWppX3BhdGNoX3dp dGhfdmRkX2xlYWthZ2Uoc3RydWN0IHBwX2h3bWdyICpod21nciwKKwkJdWludDE2X3QgKnZvbHRh Z2UsIHN0cnVjdCBmaWppX2xlYWthZ2Vfdm9sdGFnZSAqbGVha2FnZV90YWJsZSkKK3sKKwl1aW50 MzJfdCBpbmRleDsKKworCS8qIHNlYXJjaCBmb3IgbGVha2FnZSB2b2x0YWdlIElEIDB4ZmYwMSB+ IDB4ZmYwOCAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGxlYWthZ2VfdGFibGUtPmNvdW50 OyBpbmRleCsrKSB7CisJCS8qIGlmIHRoaXMgdm9sdGFnZSBtYXRjaGVzIGEgbGVha2FnZSB2b2x0 YWdlIElEICovCisJCS8qIHBhdGNoIHdpdGggYWN0dWFsIGxlYWthZ2Ugdm9sdGFnZSAqLworCQlp ZiAobGVha2FnZV90YWJsZS0+bGVha2FnZV9pZFtpbmRleF0gPT0gKnZvbHRhZ2UpIHsKKwkJCSp2 b2x0YWdlID0gbGVha2FnZV90YWJsZS0+YWN0dWFsX3ZvbHRhZ2VbaW5kZXhdOworCQkJYnJlYWs7 CisJCX0KKwl9CisKKwlpZiAoKnZvbHRhZ2UgPiBBVE9NX1ZJUlRVQUxfVk9MVEFHRV9JRDApCisJ CXByaW50ayhLRVJOX0VSUiAiVm9sdGFnZSB2YWx1ZSBsb29rcyBsaWtlIGEgTGVha2FnZSBJRCBi dXQgaXQncyBub3QgcGF0Y2hlZCBcbiIpOworfQorCisvKioKKyogUGF0Y2ggdm9sdGFnZSBsb29r dXAgdGFibGUgYnkgRVZWIGxlYWthZ2VzLgorKgorKiBAcGFyYW0gICAgIGh3bWdyICB0aGUgYWRk cmVzcyBvZiB0aGUgcG93ZXJwbGF5IGhhcmR3YXJlIG1hbmFnZXIuCisqIEBwYXJhbSAgICAgcG9p bnRlciB0byB2b2x0YWdlIGxvb2t1cCB0YWJsZQorKiBAcGFyYW0gICAgIHBvaW50ZXIgdG8gbGVh a2FnZSB0YWJsZQorKiBAcmV0dXJuICAgICBhbHdheXMgMAorKi8KK3N0YXRpYyBpbnQgZmlqaV9w YXRjaF9sb29rdXBfdGFibGVfd2l0aF9sZWFrYWdlKHN0cnVjdCBwcF9od21nciAqaHdtZ3IsCisJ CXBobV9wcHRfdjFfdm9sdGFnZV9sb29rdXBfdGFibGUgKmxvb2t1cF90YWJsZSwKKwkJc3RydWN0 IGZpamlfbGVha2FnZV92b2x0YWdlICpsZWFrYWdlX3RhYmxlKQoreworCXVpbnQzMl90IGk7CisK Kwlmb3IgKGkgPSAwOyBpIDwgbG9va3VwX3RhYmxlLT5jb3VudDsgaSsrKQorCQlmaWppX3BhdGNo X3dpdGhfdmRkX2xlYWthZ2UoaHdtZ3IsCisJCQkJJmxvb2t1cF90YWJsZS0+ZW50cmllc1tpXS51 c192ZGQsIGxlYWthZ2VfdGFibGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlq aV9wYXRjaF9jbG9ja192b2x0YWdlX2xpbWl0c193aXRoX3ZkZGNfbGVha2FnZSgKKwkJc3RydWN0 IHBwX2h3bWdyICpod21nciwgc3RydWN0IGZpamlfbGVha2FnZV92b2x0YWdlICpsZWFrYWdlX3Rh YmxlLAorCQl1aW50MTZfdCAqdmRkYykKK3sKKwlzdHJ1Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlv biAqdGFibGVfaW5mbyA9CisJCQkoc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKikoaHdt Z3ItPnBwdGFibGUpOworCWZpamlfcGF0Y2hfd2l0aF92ZGRfbGVha2FnZShod21nciwgKHVpbnQx Nl90ICopdmRkYywgbGVha2FnZV90YWJsZSk7CisJaHdtZ3ItPmR5bl9zdGF0ZS5tYXhfY2xvY2tf dm9sdGFnZV9vbl9kYy52ZGRjID0KKwkJCXRhYmxlX2luZm8tPm1heF9jbG9ja192b2x0YWdlX29u X2RjLnZkZGM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlqaV9wYXRjaF92b2x0YWdl X2RlcGVuZGVuY3lfdGFibGVzX3dpdGhfbG9va3VwX3RhYmxlKAorCQlzdHJ1Y3QgcHBfaHdtZ3Ig Kmh3bWdyKQoreworCXVpbnQ4X3QgZW50cnlJZDsKKwl1aW50OF90IHZvbHRhZ2VJZDsKKwlzdHJ1 Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqdGFibGVfaW5mbyA9CisJCQkoc3RydWN0IHBobV9w cHRfdjFfaW5mb3JtYXRpb24gKikoaHdtZ3ItPnBwdGFibGUpOworCisJc3RydWN0IHBobV9wcHRf djFfY2xvY2tfdm9sdGFnZV9kZXBlbmRlbmN5X3RhYmxlICpzY2xrX3RhYmxlID0KKwkJCXRhYmxl X2luZm8tPnZkZF9kZXBfb25fc2NsazsKKwlzdHJ1Y3QgcGhtX3BwdF92MV9jbG9ja192b2x0YWdl X2RlcGVuZGVuY3lfdGFibGUgKm1jbGtfdGFibGUgPQorCQkJdGFibGVfaW5mby0+dmRkX2RlcF9v bl9tY2xrOworCXN0cnVjdCBwaG1fcHB0X3YxX21tX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90 YWJsZSAqbW1fdGFibGUgPQorCQkJdGFibGVfaW5mby0+bW1fZGVwX3RhYmxlOworCisJZm9yIChl bnRyeUlkID0gMDsgZW50cnlJZCA8IHNjbGtfdGFibGUtPmNvdW50OyArK2VudHJ5SWQpIHsKKwkJ dm9sdGFnZUlkID0gc2Nsa190YWJsZS0+ZW50cmllc1tlbnRyeUlkXS52ZGRJbmQ7CisJCXNjbGtf dGFibGUtPmVudHJpZXNbZW50cnlJZF0udmRkYyA9CisJCQkJdGFibGVfaW5mby0+dmRkY19sb29r dXBfdGFibGUtPmVudHJpZXNbdm9sdGFnZUlkXS51c192ZGQ7CisJfQorCisJZm9yIChlbnRyeUlk ID0gMDsgZW50cnlJZCA8IG1jbGtfdGFibGUtPmNvdW50OyArK2VudHJ5SWQpIHsKKwkJdm9sdGFn ZUlkID0gbWNsa190YWJsZS0+ZW50cmllc1tlbnRyeUlkXS52ZGRJbmQ7CisJCW1jbGtfdGFibGUt PmVudHJpZXNbZW50cnlJZF0udmRkYyA9CisJCQl0YWJsZV9pbmZvLT52ZGRjX2xvb2t1cF90YWJs ZS0+ZW50cmllc1t2b2x0YWdlSWRdLnVzX3ZkZDsKKwl9CisKKwlmb3IgKGVudHJ5SWQgPSAwOyBl bnRyeUlkIDwgbW1fdGFibGUtPmNvdW50OyArK2VudHJ5SWQpIHsKKwkJdm9sdGFnZUlkID0gbW1f dGFibGUtPmVudHJpZXNbZW50cnlJZF0udmRkY0luZDsKKwkJbW1fdGFibGUtPmVudHJpZXNbZW50 cnlJZF0udmRkYyA9CisJCQl0YWJsZV9pbmZvLT52ZGRjX2xvb2t1cF90YWJsZS0+ZW50cmllc1t2 b2x0YWdlSWRdLnVzX3ZkZDsKKwl9CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IGZp amlfY2FsY192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGVzKHN0cnVjdCBwcF9od21nciAqaHdtZ3Ip Cit7CisJLyogTmVlZCB0byBkZXRlcm1pbmUgaWYgd2UgbmVlZCBjYWxjdWxhdGVkIHZvbHRhZ2Uu ICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlqaV9jYWxjX21tX3ZvbHRhZ2VfZGVw ZW5kZW5jeV90YWJsZShzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCS8qIE5lZWQgdG8gZGV0 ZXJtaW5lIGlmIHdlIG5lZWQgY2FsY3VsYXRlZCB2b2x0YWdlIGZyb20gbW0gdGFibGUuICovCisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlqaV9zb3J0X2xvb2t1cF90YWJsZShzdHJ1Y3Qg cHBfaHdtZ3IgKmh3bWdyLAorCQlzdHJ1Y3QgcGhtX3BwdF92MV92b2x0YWdlX2xvb2t1cF90YWJs ZSAqbG9va3VwX3RhYmxlKQoreworCXVpbnQzMl90IHRhYmxlX3NpemUsIGksIGo7CisJc3RydWN0 IHBobV9wcHRfdjFfdm9sdGFnZV9sb29rdXBfcmVjb3JkIHRtcF92b2x0YWdlX2xvb2t1cF9yZWNv cmQ7CisJdGFibGVfc2l6ZSA9IGxvb2t1cF90YWJsZS0+Y291bnQ7CisKKwlQUF9BU1NFUlRfV0lU SF9DT0RFKDAgIT0gbG9va3VwX3RhYmxlLT5jb3VudCwKKwkJIkxvb2t1cCB0YWJsZSBpcyBlbXB0 eSIsIHJldHVybiAtRUlOVkFMKTsKKworCS8qIFNvcnRpbmcgdm9sdGFnZXMgKi8KKwlmb3IgKGkg PSAwOyBpIDwgdGFibGVfc2l6ZSAtIDE7IGkrKykgeworCQlmb3IgKGogPSBpICsgMTsgaiA+IDA7 IGotLSkgeworCQkJaWYgKGxvb2t1cF90YWJsZS0+ZW50cmllc1tqXS51c192ZGQgPAorCQkJCQls b29rdXBfdGFibGUtPmVudHJpZXNbaiAtIDFdLnVzX3ZkZCkgeworCQkJCXRtcF92b2x0YWdlX2xv b2t1cF9yZWNvcmQgPSBsb29rdXBfdGFibGUtPmVudHJpZXNbaiAtIDFdOworCQkJCWxvb2t1cF90 YWJsZS0+ZW50cmllc1tqIC0gMV0gPSBsb29rdXBfdGFibGUtPmVudHJpZXNbal07CisJCQkJbG9v a3VwX3RhYmxlLT5lbnRyaWVzW2pdID0gdG1wX3ZvbHRhZ2VfbG9va3VwX3JlY29yZDsKKwkJCX0K KwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpamlfY29tcGxldGVfZGVw ZW5kZW5jeV90YWJsZXMoc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwlpbnQgcmVzdWx0ID0g MDsKKwlpbnQgdG1wX3Jlc3VsdDsKKwlzdHJ1Y3QgZmlqaV9od21nciAqZGF0YSA9IChzdHJ1Y3Qg ZmlqaV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJc3RydWN0IHBobV9wcHRfdjFfaW5mb3Jt YXRpb24gKnRhYmxlX2luZm8gPQorCQkJKHN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICop KGh3bWdyLT5wcHRhYmxlKTsKKworCXRtcF9yZXN1bHQgPSBmaWppX3BhdGNoX2xvb2t1cF90YWJs ZV93aXRoX2xlYWthZ2UoaHdtZ3IsCisJCQl0YWJsZV9pbmZvLT52ZGRjX2xvb2t1cF90YWJsZSwg JihkYXRhLT52ZGRjX2xlYWthZ2UpKTsKKwlpZiAodG1wX3Jlc3VsdCkKKwkJcmVzdWx0ID0gdG1w X3Jlc3VsdDsKKworCXRtcF9yZXN1bHQgPSBmaWppX3BhdGNoX2Nsb2NrX3ZvbHRhZ2VfbGltaXRz X3dpdGhfdmRkY19sZWFrYWdlKGh3bWdyLAorCQkJJihkYXRhLT52ZGRjX2xlYWthZ2UpLCAmdGFi bGVfaW5mby0+bWF4X2Nsb2NrX3ZvbHRhZ2Vfb25fZGMudmRkYyk7CisJaWYgKHRtcF9yZXN1bHQp CisJCXJlc3VsdCA9IHRtcF9yZXN1bHQ7CisKKwl0bXBfcmVzdWx0ID0gZmlqaV9wYXRjaF92b2x0 YWdlX2RlcGVuZGVuY3lfdGFibGVzX3dpdGhfbG9va3VwX3RhYmxlKGh3bWdyKTsKKwlpZiAodG1w X3Jlc3VsdCkKKwkJcmVzdWx0ID0gdG1wX3Jlc3VsdDsKKworCXRtcF9yZXN1bHQgPSBmaWppX2Nh bGNfdm9sdGFnZV9kZXBlbmRlbmN5X3RhYmxlcyhod21ncik7CisJaWYgKHRtcF9yZXN1bHQpCisJ CXJlc3VsdCA9IHRtcF9yZXN1bHQ7CisKKwl0bXBfcmVzdWx0ID0gZmlqaV9jYWxjX21tX3ZvbHRh Z2VfZGVwZW5kZW5jeV90YWJsZShod21ncik7CisJaWYgKHRtcF9yZXN1bHQpCisJCXJlc3VsdCA9 IHRtcF9yZXN1bHQ7CisKKwl0bXBfcmVzdWx0ID0gZmlqaV9zb3J0X2xvb2t1cF90YWJsZShod21n ciwgdGFibGVfaW5mby0+dmRkY19sb29rdXBfdGFibGUpOworCWlmKHRtcF9yZXN1bHQpCisJCXJl c3VsdCA9IHRtcF9yZXN1bHQ7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGZp amlfc2V0X3ByaXZhdGVfZGF0YV9iYXNlZF9vbl9wcHRhYmxlKHN0cnVjdCBwcF9od21nciAqaHdt Z3IpCit7CisJc3RydWN0IGZpamlfaHdtZ3IgKmRhdGEgPSAoc3RydWN0IGZpamlfaHdtZ3IgKiko aHdtZ3ItPmJhY2tlbmQpOworCXN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICp0YWJsZV9p bmZvID0KKwkJCShzdHJ1Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqKShod21nci0+cHB0YWJs ZSk7CisKKwlzdHJ1Y3QgcGhtX3BwdF92MV9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUg KmFsbG93ZWRfc2Nsa192ZGRfdGFibGUgPQorCQkJdGFibGVfaW5mby0+dmRkX2RlcF9vbl9zY2xr OworCXN0cnVjdCBwaG1fcHB0X3YxX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZSAqYWxs b3dlZF9tY2xrX3ZkZF90YWJsZSA9CisJCQl0YWJsZV9pbmZvLT52ZGRfZGVwX29uX21jbGs7CisK KwlQUF9BU1NFUlRfV0lUSF9DT0RFKGFsbG93ZWRfc2Nsa192ZGRfdGFibGUgIT0gTlVMTCwKKwkJ IlZERCBkZXBlbmRlbmN5IG9uIFNDTEsgdGFibGUgaXMgbWlzc2luZy4gCVwKKwkJVGhpcyB0YWJs ZSBpcyBtYW5kYXRvcnkiLCByZXR1cm4gLUVJTlZBTCk7CisJUFBfQVNTRVJUX1dJVEhfQ09ERShh bGxvd2VkX3NjbGtfdmRkX3RhYmxlLT5jb3VudCA+PSAxLAorCQkiVkREIGRlcGVuZGVuY3kgb24g U0NMSyB0YWJsZSBoYXMgdG8gaGF2ZSBpcyBtaXNzaW5nLiAJXAorCQlUaGlzIHRhYmxlIGlzIG1h bmRhdG9yeSIsIHJldHVybiAtRUlOVkFMKTsKKworCVBQX0FTU0VSVF9XSVRIX0NPREUoYWxsb3dl ZF9tY2xrX3ZkZF90YWJsZSAhPSBOVUxMLAorCQkiVkREIGRlcGVuZGVuY3kgb24gTUNMSyB0YWJs ZSBpcyBtaXNzaW5nLiAJXAorCQlUaGlzIHRhYmxlIGlzIG1hbmRhdG9yeSIsIHJldHVybiAtRUlO VkFMKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKGFsbG93ZWRfbWNsa192ZGRfdGFibGUtPmNvdW50 ID49IDEsCisJCSJWREQgZGVwZW5kZW5jeSBvbiBNQ0xLIHRhYmxlIGhhcyB0byBoYXZlIGlzIG1p c3NpbmcuCSBcCisJCVRoaXMgdGFibGUgaXMgbWFuZGF0b3J5IiwgcmV0dXJuIC1FSU5WQUwpOwor CisJZGF0YS0+bWluX3ZkZGNfaW5fcHB0YWJsZSA9ICh1aW50MTZfdClhbGxvd2VkX3NjbGtfdmRk X3RhYmxlLT5lbnRyaWVzWzBdLnZkZGM7CisJZGF0YS0+bWF4X3ZkZGNfaW5fcHB0YWJsZSA9CSh1 aW50MTZfdClhbGxvd2VkX3NjbGtfdmRkX3RhYmxlLT4KKwkJCWVudHJpZXNbYWxsb3dlZF9zY2xr X3ZkZF90YWJsZS0+Y291bnQgLSAxXS52ZGRjOworCisJdGFibGVfaW5mby0+bWF4X2Nsb2NrX3Zv bHRhZ2Vfb25fYWMuc2NsayA9CisJCWFsbG93ZWRfc2Nsa192ZGRfdGFibGUtPmVudHJpZXNbYWxs b3dlZF9zY2xrX3ZkZF90YWJsZS0+Y291bnQgLSAxXS5jbGs7CisJdGFibGVfaW5mby0+bWF4X2Ns b2NrX3ZvbHRhZ2Vfb25fYWMubWNsayA9CisJCWFsbG93ZWRfbWNsa192ZGRfdGFibGUtPmVudHJp ZXNbYWxsb3dlZF9tY2xrX3ZkZF90YWJsZS0+Y291bnQgLSAxXS5jbGs7CisJdGFibGVfaW5mby0+ bWF4X2Nsb2NrX3ZvbHRhZ2Vfb25fYWMudmRkYyA9CisJCWFsbG93ZWRfc2Nsa192ZGRfdGFibGUt PmVudHJpZXNbYWxsb3dlZF9zY2xrX3ZkZF90YWJsZS0+Y291bnQgLSAxXS52ZGRjOworCXRhYmxl X2luZm8tPm1heF9jbG9ja192b2x0YWdlX29uX2FjLnZkZGNpID0KKwkJYWxsb3dlZF9tY2xrX3Zk ZF90YWJsZS0+ZW50cmllc1thbGxvd2VkX21jbGtfdmRkX3RhYmxlLT5jb3VudCAtIDFdLnZkZGNp OworCisJaHdtZ3ItPmR5bl9zdGF0ZS5tYXhfY2xvY2tfdm9sdGFnZV9vbl9hYy5zY2xrID0KKwkJ dGFibGVfaW5mby0+bWF4X2Nsb2NrX3ZvbHRhZ2Vfb25fYWMuc2NsazsKKwlod21nci0+ZHluX3N0 YXRlLm1heF9jbG9ja192b2x0YWdlX29uX2FjLm1jbGsgPQorCQl0YWJsZV9pbmZvLT5tYXhfY2xv Y2tfdm9sdGFnZV9vbl9hYy5tY2xrOworCWh3bWdyLT5keW5fc3RhdGUubWF4X2Nsb2NrX3ZvbHRh Z2Vfb25fYWMudmRkYyA9CisJCXRhYmxlX2luZm8tPm1heF9jbG9ja192b2x0YWdlX29uX2FjLnZk ZGM7CisJaHdtZ3ItPmR5bl9zdGF0ZS5tYXhfY2xvY2tfdm9sdGFnZV9vbl9hYy52ZGRjaSA9CisJ CXRhYmxlX2luZm8tPm1heF9jbG9ja192b2x0YWdlX29uX2FjLnZkZGNpOworCisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyB1aW50MTZfdCBmaWppX2dldF9jdXJyZW50X3BjaWVfc3BlZWQoc3RydWN0 IHBwX2h3bWdyICpod21ncikKK3sKKwl1aW50MzJfdCBzcGVlZENudGwgPSAwOworCisJLyogbW1Q Q0lFX1BPUlRfSU5ERVggcmVuYW1lIGFzIG1tUENJRV9JTkRFWCAqLworCXNwZWVkQ250bCA9IGNn c19yZWFkX2luZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19fUENJRSwKKwkJ CWl4UENJRV9MQ19TUEVFRF9DTlRMKTsKKwlyZXR1cm4oKHVpbnQxNl90KVBITV9HRVRfRklFTEQo c3BlZWRDbnRsLAorCQkJUENJRV9MQ19TUEVFRF9DTlRMLCBMQ19DVVJSRU5UX0RBVEFfUkFURSkp OworfQorCitzdGF0aWMgaW50IGZpamlfZ2V0X2N1cnJlbnRfcGNpZV9sYW5lX251bWJlcihzdHJ1 Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCXVpbnQzMl90IGxpbmtfd2lkdGg7CisKKwkvKiBtbVBD SUVfUE9SVF9JTkRFWCByZW5hbWUgYXMgbW1QQ0lFX0lOREVYICovCisJbGlua193aWR0aCA9IFBI TV9SRUFEX0lORElSRUNUX0ZJRUxEKGh3bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19QQ0lFLAor CQkJUENJRV9MQ19MSU5LX1dJRFRIX0NOVEwsIExDX0xJTktfV0lEVEhfUkQpOworCisJUFBfQVNT RVJUX1dJVEhfQ09ERSgoNyA+PSBsaW5rX3dpZHRoKSwKKwkJCSJJbnZhbGlkIFBDSWUgbGFuZSB3 aWR0aCEiLCByZXR1cm4gMCk7CisKKwlyZXR1cm4gZGVjb2RlX3BjaWVfbGFuZV93aWR0aChsaW5r X3dpZHRoKTsKK30KKworLyoqIFBhdGNoIHRoZSBCb290IFN0YXRlIHRvIG1hdGNoIFZCSU9TIGJv b3QgY2xvY2tzIGFuZCB2b2x0YWdlLgorKgorKiBAcGFyYW0gaHdtZ3IgUG9pbnRlciB0byB0aGUg aGFyZHdhcmUgbWFuYWdlci4KKyogQHBhcmFtIHBQb3dlclN0YXRlIFRoZSBhZGRyZXNzIG9mIHRo ZSBQb3dlclN0YXRlIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQuCisqCisqLworc3RhdGljIGludCBm aWppX3BhdGNoX2Jvb3Rfc3RhdGUoc3RydWN0IHBwX2h3bWdyICpod21nciwKKwkJc3RydWN0IHBw X2h3X3Bvd2VyX3N0YXRlICpod19wcykKK3sKKwlzdHJ1Y3QgZmlqaV9od21nciAqZGF0YSA9IChz dHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJc3RydWN0IGZpamlfcG93ZXJf c3RhdGUgKnBzID0gKHN0cnVjdCBmaWppX3Bvd2VyX3N0YXRlICopaHdfcHM7CisJQVRPTV9GSVJN V0FSRV9JTkZPX1YyXzIgKmZ3X2luZm87CisJdWludDE2X3Qgc2l6ZTsKKwl1aW50OF90IGZyZXYs IGNyZXY7CisJaW50IGluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoREFUQSwgRmlybXdh cmVJbmZvKTsKKworCS8qIEZpcnN0IHJldHJpZXZlIHRoZSBCb290IGNsb2NrcyBhbmQgVkREQyBm cm9tIHRoZSBmaXJtd2FyZSBpbmZvIHRhYmxlLgorCSAqIFdlIGFzc3VtZSBoZXJlIHRoYXQgZndf aW5mbyBpcyB1bmNoYW5nZWQgaWYgdGhpcyBjYWxsIGZhaWxzLgorCSAqLworCWZ3X2luZm8gPSAo QVRPTV9GSVJNV0FSRV9JTkZPX1YyXzIgKiljZ3NfYXRvbV9nZXRfZGF0YV90YWJsZSgKKwkJCWh3 bWdyLT5kZXZpY2UsIGluZGV4LAorCQkJJnNpemUsICZmcmV2LCAmY3Jldik7CisJaWYgKCFmd19p bmZvKQorCQkvKiBEdXJpbmcgYSB0ZXN0LCB0aGVyZSBpcyBubyBmaXJtd2FyZSBpbmZvIHRhYmxl LiAqLworCQlyZXR1cm4gMDsKKworCS8qIFBhdGNoIHRoZSBzdGF0ZS4gKi8KKwlkYXRhLT52Ymlv c19ib290X3N0YXRlLnNjbGtfYm9vdHVwX3ZhbHVlID0KKwkJCWxlMzJfdG9fY3B1KGZ3X2luZm8t PnVsRGVmYXVsdEVuZ2luZUNsb2NrKTsKKwlkYXRhLT52Ymlvc19ib290X3N0YXRlLm1jbGtfYm9v dHVwX3ZhbHVlID0KKwkJCWxlMzJfdG9fY3B1KGZ3X2luZm8tPnVsRGVmYXVsdE1lbW9yeUNsb2Nr KTsKKwlkYXRhLT52Ymlvc19ib290X3N0YXRlLm12ZGRfYm9vdHVwX3ZhbHVlID0KKwkJCWxlMTZf dG9fY3B1KGZ3X2luZm8tPnVzQm9vdFVwTVZERENWb2x0YWdlKTsKKwlkYXRhLT52Ymlvc19ib290 X3N0YXRlLnZkZGNfYm9vdHVwX3ZhbHVlID0KKwkJCWxlMTZfdG9fY3B1KGZ3X2luZm8tPnVzQm9v dFVwVkREQ1ZvbHRhZ2UpOworCWRhdGEtPnZiaW9zX2Jvb3Rfc3RhdGUudmRkY2lfYm9vdHVwX3Zh bHVlID0KKwkJCWxlMTZfdG9fY3B1KGZ3X2luZm8tPnVzQm9vdFVwVkREQ0lWb2x0YWdlKTsKKwlk YXRhLT52Ymlvc19ib290X3N0YXRlLnBjaWVfZ2VuX2Jvb3R1cF92YWx1ZSA9CisJCQlmaWppX2dl dF9jdXJyZW50X3BjaWVfc3BlZWQoaHdtZ3IpOworCWRhdGEtPnZiaW9zX2Jvb3Rfc3RhdGUucGNp ZV9sYW5lX2Jvb3R1cF92YWx1ZSA9CisJCQkodWludDE2X3QpZmlqaV9nZXRfY3VycmVudF9wY2ll X2xhbmVfbnVtYmVyKGh3bWdyKTsKKworCS8qIHNldCBib290IHBvd2VyIHN0YXRlICovCisJcHMt PnBlcmZvcm1hbmNlX2xldmVsc1swXS5tZW1vcnlfY2xvY2sgPSBkYXRhLT52Ymlvc19ib290X3N0 YXRlLm1jbGtfYm9vdHVwX3ZhbHVlOworCXBzLT5wZXJmb3JtYW5jZV9sZXZlbHNbMF0uZW5naW5l X2Nsb2NrID0gZGF0YS0+dmJpb3NfYm9vdF9zdGF0ZS5zY2xrX2Jvb3R1cF92YWx1ZTsKKwlwcy0+ cGVyZm9ybWFuY2VfbGV2ZWxzWzBdLnBjaWVfZ2VuID0gZGF0YS0+dmJpb3NfYm9vdF9zdGF0ZS5w Y2llX2dlbl9ib290dXBfdmFsdWU7CisJcHMtPnBlcmZvcm1hbmNlX2xldmVsc1swXS5wY2llX2xh bmUgPSBkYXRhLT52Ymlvc19ib290X3N0YXRlLnBjaWVfbGFuZV9ib290dXBfdmFsdWU7CisKKwly ZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWppX2h3bWdyX2JhY2tlbmRfaW5pdChzdHJ1Y3Qg cHBfaHdtZ3IgKmh3bWdyKQoreworCXN0cnVjdCBmaWppX2h3bWdyICpkYXRhID0gKHN0cnVjdCBm aWppX2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKwl1aW50MzJfdCBpOworCXN0cnVjdCBwaG1f cHB0X3YxX2luZm9ybWF0aW9uICp0YWJsZV9pbmZvID0KKwkJCShzdHJ1Y3QgcGhtX3BwdF92MV9p bmZvcm1hdGlvbiAqKShod21nci0+cHB0YWJsZSk7CisJYm9vbCBzdGF5X2luX2Jvb3Q7CisJaW50 IHJlc3VsdDsKKworCWRhdGEtPmRsbF9kZWZhdWx0X29uID0gZmFsc2U7CisJZGF0YS0+c3JhbV9l bmQgPSBTTUNfUkFNX0VORDsKKworCWZvciAoaSA9IDA7IGkgPCBTTVU3M19NQVhfTEVWRUxTX0dS QVBISUNTOyBpKyspCisJCWRhdGEtPmFjdGl2aXR5X3RhcmdldFtpXSA9IEZJSklfQVRfREZMVDsK KworCWRhdGEtPnZkZGNfdmRkY2lfZGVsdGEgPSBWRERDX1ZERENJX0RFTFRBOworCisJZGF0YS0+ bWNsa19hY3Rpdml0eV90YXJnZXQgPSBQUEZJSklfTUNMS19UQVJHRVRBQ1RJVklUWV9ERkxUOwor CWRhdGEtPm1jbGtfZHBtMF9hY3Rpdml0eV90YXJnZXQgPSAweGE7CisKKwlkYXRhLT5zY2xrX2Rw bV9rZXlfZGlzYWJsZWQgPSAwOworCWRhdGEtPm1jbGtfZHBtX2tleV9kaXNhYmxlZCA9IDA7CisJ ZGF0YS0+cGNpZV9kcG1fa2V5X2Rpc2FibGVkID0gMDsKKworCXBobV9jYXBfc2V0KGh3bWdyLT5w bGF0Zm9ybV9kZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywKKwkJCVBITV9QbGF0Zm9ybUNhcHNfVW5U YWJsZWRIYXJkd2FyZUludGVyZmFjZSk7CisJcGhtX2NhcF9zZXQoaHdtZ3ItPnBsYXRmb3JtX2Rl c2NyaXB0b3IucGxhdGZvcm1DYXBzLAorCQkJUEhNX1BsYXRmb3JtQ2Fwc19UYWJsZWxlc3NIYXJk d2FyZUludGVyZmFjZSk7CisKKwlwaG1fY2FwX3NldChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRv ci5wbGF0Zm9ybUNhcHMsCisJCQlQSE1fUGxhdGZvcm1DYXBzX1NjbGtEZWVwU2xlZXApOworCisJ ZGF0YS0+Z3Bpb19kZWJ1ZyA9IDA7CisKKwlwaG1fY2FwX3NldChod21nci0+cGxhdGZvcm1fZGVz Y3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCQlQSE1fUGxhdGZvcm1DYXBzX0R5bmFtaWNQYXRjaFBv d2VyU3RhdGUpOworCisJLyogbmVlZCB0byBzZXQgdm9sdGFnZSBjb250cm9sIHR5cGVzIGJlZm9y ZSBFVlYgcGF0Y2hpbmcgKi8KKwlkYXRhLT52b2x0YWdlX2NvbnRyb2wgPSBGSUpJX1ZPTFRBR0Vf Q09OVFJPTF9OT05FOworCWRhdGEtPnZkZGNpX2NvbnRyb2wgPSBGSUpJX1ZPTFRBR0VfQ09OVFJP TF9OT05FOworCWRhdGEtPm12ZGRfY29udHJvbCA9IEZJSklfVk9MVEFHRV9DT05UUk9MX05PTkU7 CisKKwlpZiAoYXRvbWN0cmxfaXNfdm9sdGFnZV9jb250cm9sZWRfYnlfZ3Bpb192Myhod21nciwK KwkJCVZPTFRBR0VfVFlQRV9WRERDLCBWT0xUQUdFX09CSl9TVklEMikpCisJCWRhdGEtPnZvbHRh Z2VfY29udHJvbCA9IEZJSklfVk9MVEFHRV9DT05UUk9MX0JZX1NWSUQyOworCisJaWYgKHBobV9j YXBfZW5hYmxlZChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCQlQ SE1fUGxhdGZvcm1DYXBzX0VuYWJsZU1WRERDb250cm9sKSkKKwkJaWYgKGF0b21jdHJsX2lzX3Zv bHRhZ2VfY29udHJvbGVkX2J5X2dwaW9fdjMoaHdtZ3IsCisJCQkJVk9MVEFHRV9UWVBFX01WRERD LCBWT0xUQUdFX09CSl9HUElPX0xVVCkpCisJCQlkYXRhLT5tdmRkX2NvbnRyb2wgPSBGSUpJX1ZP TFRBR0VfQ09OVFJPTF9CWV9HUElPOworCisJaWYgKGRhdGEtPm12ZGRfY29udHJvbCA9PSBGSUpJ X1ZPTFRBR0VfQ09OVFJPTF9OT05FKQorCQlwaG1fY2FwX3NldChod21nci0+cGxhdGZvcm1fZGVz Y3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCQlQSE1fUGxhdGZvcm1DYXBzX0VuYWJsZU1WRERDb250 cm9sKTsKKworCWlmIChwaG1fY2FwX2VuYWJsZWQoaHdtZ3ItPnBsYXRmb3JtX2Rlc2NyaXB0b3Iu cGxhdGZvcm1DYXBzLAorCQkJUEhNX1BsYXRmb3JtQ2Fwc19Db250cm9sVkREQ0kpKSB7CisJCWlm IChhdG9tY3RybF9pc192b2x0YWdlX2NvbnRyb2xlZF9ieV9ncGlvX3YzKGh3bWdyLAorCQkJCVZP TFRBR0VfVFlQRV9WRERDSSwgVk9MVEFHRV9PQkpfR1BJT19MVVQpKQorCQkJZGF0YS0+dmRkY2lf Y29udHJvbCA9IEZJSklfVk9MVEFHRV9DT05UUk9MX0JZX0dQSU87CisJCWVsc2UgaWYgKGF0b21j dHJsX2lzX3ZvbHRhZ2VfY29udHJvbGVkX2J5X2dwaW9fdjMoaHdtZ3IsCisJCQkJVk9MVEFHRV9U WVBFX1ZERENJLCBWT0xUQUdFX09CSl9TVklEMikpCisJCQlkYXRhLT52ZGRjaV9jb250cm9sID0g RklKSV9WT0xUQUdFX0NPTlRST0xfQllfU1ZJRDI7CisJfQorCisJaWYgKGRhdGEtPnZkZGNpX2Nv bnRyb2wgPT0gRklKSV9WT0xUQUdFX0NPTlRST0xfTk9ORSkKKwkJcGhtX2NhcF91bnNldChod21n ci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCQkJUEhNX1BsYXRmb3JtQ2Fw c19Db250cm9sVkREQ0kpOworCisJaWYgKHRhYmxlX2luZm8gJiYgdGFibGVfaW5mby0+Y2FjX2R0 cF90YWJsZS0+dXNDbG9ja1N0cmV0Y2hBbW91bnQpCisJCXBobV9jYXBfc2V0KGh3bWdyLT5wbGF0 Zm9ybV9kZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywKKwkJCQlQSE1fUGxhdGZvcm1DYXBzX0Nsb2Nr U3RyZXRjaGVyKTsKKworCWZpamlfaW5pdF9kcG1fZGVmYXVsdHMoaHdtZ3IpOworCisJLyogR2V0 IGxlYWthZ2Ugdm9sdGFnZSBiYXNlZCBvbiBsZWFrYWdlIElELiAqLworCWZpamlfZ2V0X2V2dl92 b2x0YWdlcyhod21ncik7CisKKwkvKiBQYXRjaCBvdXIgdm9sdGFnZSBkZXBlbmRlbmN5IHRhYmxl IHdpdGggYWN0dWFsIGxlYWthZ2Ugdm9sdGFnZQorCSAqIFdlIG5lZWQgdG8gcGVyZm9ybSBsZWFr YWdlIHRyYW5zbGF0aW9uIGJlZm9yZSBpdCdzIHVzZWQgYnkgb3RoZXIgZnVuY3Rpb25zCisJICov CisJZmlqaV9jb21wbGV0ZV9kZXBlbmRlbmN5X3RhYmxlcyhod21ncik7CisKKwkvKiBQYXJzZSBw cHRhYmxlIGRhdGEgcmVhZCBmcm9tIFZCSU9TICovCisJZmlqaV9zZXRfcHJpdmF0ZV9kYXRhX2Jh c2VkX29uX3BwdGFibGUoaHdtZ3IpOworCisJLyogVUxWIFN1cHBvcnQgKi8KKwlkYXRhLT51bHYu dWx2X3N1cHBvcnRlZCA9IHRydWU7IC8qIFVMViBmZWF0dXJlIGlzIGVuYWJsZWQgYnkgZGVmYXVs dCAqLworCisJLyogSW5pdGFsaXplIER5bmFtaWMgU3RhdGUgQWRqdXN0bWVudCBSdWxlIFNldHRp bmdzICovCisJcmVzdWx0ID0gdG9uZ2FfaW5pdGlhbGl6YV9keW5hbWljX3N0YXRlX2FkanVzdG1l bnRfcnVsZV9zZXR0aW5ncyhod21ncik7CisKKwlpZiAoIXJlc3VsdCkgeworCQlkYXRhLT51dmRf ZW5hYmxlZCA9IGZhbHNlOworCQlwaG1fY2FwX3NldChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRv ci5wbGF0Zm9ybUNhcHMsCisJCQkJUEhNX1BsYXRmb3JtQ2Fwc19FbmFibGVTTVU3VGhlcm1hbE1h bmFnZW1lbnQpOworCQlkYXRhLT52ZGRjX3BoYXNlX3NoZWRfY29udHJvbCA9IGZhbHNlOworCX0K KworCXN0YXlfaW5fYm9vdCA9IHBobV9jYXBfZW5hYmxlZChod21nci0+cGxhdGZvcm1fZGVzY3Jp cHRvci5wbGF0Zm9ybUNhcHMsCisJCQlQSE1fUGxhdGZvcm1DYXBzX1N0YXlJbkJvb3RTdGF0ZSk7 CisKKwlpZiAoMCA9PSByZXN1bHQpIHsKKwkJZGF0YS0+aXNfdGx1X2VuYWJsZWQgPSAwOworCQlo d21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5oYXJkd2FyZUFjdGl2aXR5UGVyZm9ybWFuY2VMZXZl bHMgPQorCQkJCUZJSklfTUFYX0hBUkRXQVJFX1BPV0VSTEVWRUxTOworCQlod21nci0+cGxhdGZv cm1fZGVzY3JpcHRvci5oYXJkd2FyZVBlcmZvcm1hbmNlTGV2ZWxzID0gMjsKKwkJaHdtZ3ItPnBs YXRmb3JtX2Rlc2NyaXB0b3IubWluaW11bUNsb2Nrc1JlZHVjdGlvblBlcmNlbnRhZ2UgID0gNTA7 CisKKwkJZGF0YS0+cGNpZV9nZW5fY2FwID0gMHgzMDAwNzsKKwkJZGF0YS0+cGNpZV9sYW5lX2Nh cCA9IDB4MmYwMDAwOworCX0gZWxzZSB7CisJCS8qIElnbm9yZSByZXR1cm4gdmFsdWUgaW4gaGVy ZSwgd2UgYXJlIGNsZWFuaW5nIHVwIGEgbWVzcy4gKi8KKwkJdG9uZ2FfaHdtZ3JfYmFja2VuZF9m aW5pKGh3bWdyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBSZWFkIGNsb2NrIHJl bGF0ZWQgcmVnaXN0ZXJzLgorICoKKyAqIEBwYXJhbSAgICBod21nciAgdGhlIGFkZHJlc3Mgb2Yg dGhlIHBvd2VycGxheSBoYXJkd2FyZSBtYW5hZ2VyLgorICogQHJldHVybiAgIGFsd2F5cyAwCisg Ki8KK3N0YXRpYyBpbnQgZmlqaV9yZWFkX2Nsb2NrX3JlZ2lzdGVycyhzdHJ1Y3QgcHBfaHdtZ3Ig Kmh3bWdyKQoreworCXN0cnVjdCBmaWppX2h3bWdyICpkYXRhID0gKHN0cnVjdCBmaWppX2h3bWdy ICopKGh3bWdyLT5iYWNrZW5kKTsKKworCWRhdGEtPmNsb2NrX3JlZ2lzdGVycy52Q0dfU1BMTF9G VU5DX0NOVEwgPQorCQljZ3NfcmVhZF9pbmRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgQ0dTX0lO RF9SRUdfX1NNQywKKwkJCQlpeENHX1NQTExfRlVOQ19DTlRMKTsKKwlkYXRhLT5jbG9ja19yZWdp c3RlcnMudkNHX1NQTExfRlVOQ19DTlRMXzIgPQorCQljZ3NfcmVhZF9pbmRfcmVnaXN0ZXIoaHdt Z3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywKKwkJCQlpeENHX1NQTExfRlVOQ19DTlRMXzIp OworCWRhdGEtPmNsb2NrX3JlZ2lzdGVycy52Q0dfU1BMTF9GVU5DX0NOVExfMyA9CisJCWNnc19y ZWFkX2luZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01DLAorCQkJCWl4 Q0dfU1BMTF9GVU5DX0NOVExfMyk7CisJZGF0YS0+Y2xvY2tfcmVnaXN0ZXJzLnZDR19TUExMX0ZV TkNfQ05UTF80ID0KKwkJY2dzX3JlYWRfaW5kX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIENHU19J TkRfUkVHX19TTUMsCisJCQkJaXhDR19TUExMX0ZVTkNfQ05UTF80KTsKKwlkYXRhLT5jbG9ja19y ZWdpc3RlcnMudkNHX1NQTExfU1BSRUFEX1NQRUNUUlVNID0KKwkJY2dzX3JlYWRfaW5kX3JlZ2lz dGVyKGh3bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19TTUMsCisJCQkJaXhDR19TUExMX1NQUkVB RF9TUEVDVFJVTSk7CisJZGF0YS0+Y2xvY2tfcmVnaXN0ZXJzLnZDR19TUExMX1NQUkVBRF9TUEVD VFJVTV8yID0KKwkJY2dzX3JlYWRfaW5kX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIENHU19JTkRf UkVHX19TTUMsCisJCQkJaXhDR19TUExMX1NQUkVBRF9TUEVDVFJVTV8yKTsKKworCXJldHVybiAw OworfQorCisvKioKKyAqIEZpbmQgb3V0IGlmIG1lbW9yeSBpcyBHRERSNS4KKyAqCisgKiBAcGFy YW0gICAgaHdtZ3IgIHRoZSBhZGRyZXNzIG9mIHRoZSBwb3dlcnBsYXkgaGFyZHdhcmUgbWFuYWdl ci4KKyAqIEByZXR1cm4gICBhbHdheXMgMAorICovCitzdGF0aWMgaW50IGZpamlfZ2V0X21lbW9y eV90eXBlKHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJc3RydWN0IGZpamlfaHdtZ3IgKmRh dGEgPSAoc3RydWN0IGZpamlfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXVpbnQzMl90IHRl bXA7CisKKwl0ZW1wID0gY2dzX3JlYWRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19TRVFf TUlTQzApOworCisJZGF0YS0+aXNfbWVtb3J5X2dkZHI1ID0gKE1DX1NFUV9NSVNDMF9HRERSNV9W QUxVRSA9PQorCQkJKCh0ZW1wICYgTUNfU0VRX01JU0MwX0dERFI1X01BU0spID4+CisJCQkgTUNf U0VRX01JU0MwX0dERFI1X1NISUZUKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBFbmFi bGVzIER5bmFtaWMgUG93ZXIgTWFuYWdlbWVudCBieSBTTUMKKyAqCisgKiBAcGFyYW0gICAgaHdt Z3IgIHRoZSBhZGRyZXNzIG9mIHRoZSBwb3dlcnBsYXkgaGFyZHdhcmUgbWFuYWdlci4KKyAqIEBy ZXR1cm4gICBhbHdheXMgMAorICovCitzdGF0aWMgaW50IGZpamlfZW5hYmxlX2FjcGlfcG93ZXJf bWFuYWdlbWVudChzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCVBITV9XUklURV9JTkRJUkVD VF9GSUVMRChod21nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01DLAorCQkJR0VORVJBTF9QV1JN R1QsIFNUQVRJQ19QTV9FTiwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBJbml0aWFs aXplIFBvd2VyR2F0aW5nIFN0YXRlcyBmb3IgZGlmZmVyZW50IGVuZ2luZXMKKyAqCisgKiBAcGFy YW0gICAgaHdtZ3IgIHRoZSBhZGRyZXNzIG9mIHRoZSBwb3dlcnBsYXkgaGFyZHdhcmUgbWFuYWdl ci4KKyAqIEByZXR1cm4gICBhbHdheXMgMAorICovCitzdGF0aWMgaW50IGZpamlfaW5pdF9wb3dl cl9nYXRlX3N0YXRlKHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJc3RydWN0IGZpamlfaHdt Z3IgKmRhdGEgPSAoc3RydWN0IGZpamlfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCisJZGF0 YS0+dXZkX3Bvd2VyX2dhdGVkID0gZmFsc2U7CisJZGF0YS0+dmNlX3Bvd2VyX2dhdGVkID0gZmFs c2U7CisJZGF0YS0+c2FtdV9wb3dlcl9nYXRlZCA9IGZhbHNlOworCWRhdGEtPmFjcF9wb3dlcl9n YXRlZCA9IGZhbHNlOworCWRhdGEtPnBnX2FjcF9pbml0ID0gdHJ1ZTsKKworCXJldHVybiAwOwor fQorCitzdGF0aWMgaW50IGZpamlfaW5pdF9zY2xrX3RocmVzaG9sZChzdHJ1Y3QgcHBfaHdtZ3Ig Kmh3bWdyKQoreworCXN0cnVjdCBmaWppX2h3bWdyICpkYXRhID0gKHN0cnVjdCBmaWppX2h3bWdy ICopKGh3bWdyLT5iYWNrZW5kKTsKKwlkYXRhLT5sb3dfc2Nsa19pbnRlcnJ1cHRfdGhyZXNob2xk ID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpamlfc2V0dXBfYXNpY190YXNr KHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJaW50IHRtcF9yZXN1bHQsIHJlc3VsdCA9IDA7 CisKKwl0bXBfcmVzdWx0ID0gZmlqaV9yZWFkX2Nsb2NrX3JlZ2lzdGVycyhod21ncik7CisJUFBf QVNTRVJUX1dJVEhfQ09ERSgoMCA9PSB0bXBfcmVzdWx0KSwKKwkJCSJGYWlsZWQgdG8gcmVhZCBj bG9jayByZWdpc3RlcnMhIiwgcmVzdWx0ID0gdG1wX3Jlc3VsdCk7CisKKwl0bXBfcmVzdWx0ID0g ZmlqaV9nZXRfbWVtb3J5X3R5cGUoaHdtZ3IpOworCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgPT0g dG1wX3Jlc3VsdCksCisJCQkiRmFpbGVkIHRvIGdldCBtZW1vcnkgdHlwZSEiLCByZXN1bHQgPSB0 bXBfcmVzdWx0KTsKKworCXRtcF9yZXN1bHQgPSBmaWppX2VuYWJsZV9hY3BpX3Bvd2VyX21hbmFn ZW1lbnQoaHdtZ3IpOworCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgPT0gdG1wX3Jlc3VsdCksCisJ CQkiRmFpbGVkIHRvIGVuYWJsZSBBQ1BJIHBvd2VyIG1hbmFnZW1lbnQhIiwgcmVzdWx0ID0gdG1w X3Jlc3VsdCk7CisKKwl0bXBfcmVzdWx0ID0gZmlqaV9pbml0X3Bvd2VyX2dhdGVfc3RhdGUoaHdt Z3IpOworCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgPT0gdG1wX3Jlc3VsdCksCisJCQkiRmFpbGVk IHRvIGluaXQgcG93ZXIgZ2F0ZSBzdGF0ZSEiLCByZXN1bHQgPSB0bXBfcmVzdWx0KTsKKworCXRt cF9yZXN1bHQgPSB0b25nYV9nZXRfbWNfbWljcm9jb2RlX3ZlcnNpb24oaHdtZ3IpOworCVBQX0FT U0VSVF9XSVRIX0NPREUoKDAgPT0gdG1wX3Jlc3VsdCksCisJCQkiRmFpbGVkIHRvIGdldCBNQyBt aWNyb2NvZGUgdmVyc2lvbiEiLCByZXN1bHQgPSB0bXBfcmVzdWx0KTsKKworCXRtcF9yZXN1bHQg PSBmaWppX2luaXRfc2Nsa190aHJlc2hvbGQoaHdtZ3IpOworCVBQX0FTU0VSVF9XSVRIX0NPREUo KDAgPT0gdG1wX3Jlc3VsdCksCisJCQkiRmFpbGVkIHRvIGluaXQgc2NsayB0aHJlc2hvbGQhIiwg cmVzdWx0ID0gdG1wX3Jlc3VsdCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyogQ2hl Y2tzIGlmIHdlIHdhbnQgdG8gc3VwcG9ydCB2b2x0YWdlIGNvbnRyb2wKKyoKKyogQHBhcmFtICAg IGh3bWdyICB0aGUgYWRkcmVzcyBvZiB0aGUgcG93ZXJwbGF5IGhhcmR3YXJlIG1hbmFnZXIuCisq Lworc3RhdGljIGJvb2wgZmlqaV92b2x0YWdlX2NvbnRyb2woY29uc3Qgc3RydWN0IHBwX2h3bWdy ICpod21ncikKK3sKKwljb25zdCBzdHJ1Y3QgZmlqaV9od21nciAqZGF0YSA9CisJCQkoY29uc3Qg c3RydWN0IGZpamlfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCisJcmV0dXJuIChGSUpJX1ZP TFRBR0VfQ09OVFJPTF9OT05FICE9IGRhdGEtPnZvbHRhZ2VfY29udHJvbCk7Cit9CisKKy8qKgor KiBFbmFibGUgdm9sdGFnZSBjb250cm9sCisqCisqIEBwYXJhbSAgICBod21nciAgdGhlIGFkZHJl c3Mgb2YgdGhlIHBvd2VycGxheSBoYXJkd2FyZSBtYW5hZ2VyLgorKiBAcmV0dXJuICAgYWx3YXlz IDAKKyovCitzdGF0aWMgaW50IGZpamlfZW5hYmxlX3ZvbHRhZ2VfY29udHJvbChzdHJ1Y3QgcHBf aHdtZ3IgKmh3bWdyKQoreworCS8qIGVuYWJsZSB2b2x0YWdlIGNvbnRyb2wgKi8KKwlQSE1fV1JJ VEVfSU5ESVJFQ1RfRklFTEQoaHdtZ3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywKKwkJCUdF TkVSQUxfUFdSTUdULCBWT0xUX1BXUk1HVF9FTiwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoq CisqIFJlbW92ZSByZXBlYXRlZCB2b2x0YWdlIHZhbHVlcyBhbmQgY3JlYXRlIHRhYmxlIHdpdGgg dW5pcXVlIHZhbHVlcy4KKyoKKyogQHBhcmFtICAgIGh3bWdyICB0aGUgYWRkcmVzcyBvZiB0aGUg cG93ZXJwbGF5IGhhcmR3YXJlIG1hbmFnZXIuCisqIEBwYXJhbSAgICB2b2xfdGFibGUgIHRoZSBw b2ludGVyIHRvIGNoYW5naW5nIHZvbHRhZ2UgdGFibGUKKyogQHJldHVybiAgICAwIGluIHN1Y2Nl c3MKKyovCisKK3N0YXRpYyBpbnQgZmlqaV90cmltX3ZvbHRhZ2VfdGFibGUoc3RydWN0IHBwX2h3 bWdyICpod21nciwKKwkJc3RydWN0IHBwX2F0b21jdHJsX3ZvbHRhZ2VfdGFibGUgKnZvbF90YWJs ZSkKK3sKKwl1aW50MzJfdCBpLCBqOworCXVpbnQxNl90IHZ2YWx1ZTsKKwlib29sIGZvdW5kID0g ZmFsc2U7CisJc3RydWN0IHBwX2F0b21jdHJsX3ZvbHRhZ2VfdGFibGUgKnRhYmxlOworCisJUFBf QVNTRVJUX1dJVEhfQ09ERSgoTlVMTCAhPSB2b2xfdGFibGUpLAorCQkJIlZvbHRhZ2UgVGFibGUg ZW1wdHkuIiwgcmV0dXJuIC1FSU5WQUwpOworCXRhYmxlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0 IHBwX2F0b21jdHJsX3ZvbHRhZ2VfdGFibGUpLAorCQkJR0ZQX0tFUk5FTCk7CisKKwlpZiAoTlVM TCA9PSB0YWJsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0YWJsZS0+bWFza19sb3cgPSB2b2xf dGFibGUtPm1hc2tfbG93OworCXRhYmxlLT5waGFzZV9kZWxheSA9IHZvbF90YWJsZS0+cGhhc2Vf ZGVsYXk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdm9sX3RhYmxlLT5jb3VudDsgaSsrKSB7CisJCXZ2 YWx1ZSA9IHZvbF90YWJsZS0+ZW50cmllc1tpXS52YWx1ZTsKKwkJZm91bmQgPSBmYWxzZTsKKwor CQlmb3IgKGogPSAwOyBqIDwgdGFibGUtPmNvdW50OyBqKyspIHsKKwkJCWlmICh2dmFsdWUgPT0g dGFibGUtPmVudHJpZXNbal0udmFsdWUpIHsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJYnJlYWs7 CisJCQl9CisJCX0KKworCQlpZiAoIWZvdW5kKSB7CisJCQl0YWJsZS0+ZW50cmllc1t0YWJsZS0+ Y291bnRdLnZhbHVlID0gdnZhbHVlOworCQkJdGFibGUtPmVudHJpZXNbdGFibGUtPmNvdW50XS5z bWlvX2xvdyA9CisJCQkJCXZvbF90YWJsZS0+ZW50cmllc1tpXS5zbWlvX2xvdzsKKwkJCXRhYmxl LT5jb3VudCsrOworCQl9CisJfQorCisJbWVtY3B5KHZvbF90YWJsZSwgdGFibGUsIHNpemVvZihz dHJ1Y3QgcHBfYXRvbWN0cmxfdm9sdGFnZV90YWJsZSkpOworCWtmcmVlKHRhYmxlKTsKKworICAg IHJldHVybiAwOworfQorc3RhdGljIGludCBmaWppX2dldF9zdmkyX212ZGRfdm9sdGFnZV90YWJs ZShzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLAorCQlwaG1fcHB0X3YxX2Nsb2NrX3ZvbHRhZ2VfZGVw ZW5kZW5jeV90YWJsZSAqZGVwX3RhYmxlKQoreworCXVpbnQzMl90IGk7CisJaW50IHJlc3VsdDsK KwlzdHJ1Y3QgZmlqaV9od21nciAqZGF0YSA9IChzdHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+ YmFja2VuZCk7CisJc3RydWN0IHBwX2F0b21jdHJsX3ZvbHRhZ2VfdGFibGUgKnZvbF90YWJsZSA9 ICYoZGF0YS0+bXZkZF92b2x0YWdlX3RhYmxlKTsKKworCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAg IT0gZGVwX3RhYmxlLT5jb3VudCksCisJCQkiVm9sdGFnZSBEZXBlbmRlbmN5IFRhYmxlIGVtcHR5 LiIsIHJldHVybiAtRUlOVkFMKTsKKworCXZvbF90YWJsZS0+bWFza19sb3cgPSAwOworCXZvbF90 YWJsZS0+cGhhc2VfZGVsYXkgPSAwOworCXZvbF90YWJsZS0+Y291bnQgPSBkZXBfdGFibGUtPmNv dW50OworCisJZm9yIChpID0gMDsgaSA8IGRlcF90YWJsZS0+Y291bnQ7IGkrKykgeworCQl2b2xf dGFibGUtPmVudHJpZXNbaV0udmFsdWUgPSBkZXBfdGFibGUtPmVudHJpZXNbaV0ubXZkZDsKKwkJ dm9sX3RhYmxlLT5lbnRyaWVzW2ldLnNtaW9fbG93ID0gMDsKKwl9CisKKwlyZXN1bHQgPSBmaWpp X3RyaW1fdm9sdGFnZV90YWJsZShod21nciwgdm9sX3RhYmxlKTsKKwlQUF9BU1NFUlRfV0lUSF9D T0RFKCgwID09IHJlc3VsdCksCisJCQkiRmFpbGVkIHRvIHRyaW0gTVZERCB0YWJsZS4iLCByZXR1 cm4gcmVzdWx0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpamlfZ2V0X3N2aTJf dmRkY2lfdm9sdGFnZV90YWJsZShzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLAorCQlwaG1fcHB0X3Yx X2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZSAqZGVwX3RhYmxlKQoreworCXVpbnQzMl90 IGk7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZmlqaV9od21nciAqZGF0YSA9IChzdHJ1Y3QgZmlq aV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJc3RydWN0IHBwX2F0b21jdHJsX3ZvbHRhZ2Vf dGFibGUgKnZvbF90YWJsZSA9ICYoZGF0YS0+dmRkY2lfdm9sdGFnZV90YWJsZSk7CisKKwlQUF9B U1NFUlRfV0lUSF9DT0RFKCgwICE9IGRlcF90YWJsZS0+Y291bnQpLAorCQkJIlZvbHRhZ2UgRGVw ZW5kZW5jeSBUYWJsZSBlbXB0eS4iLCByZXR1cm4gLUVJTlZBTCk7CisKKwl2b2xfdGFibGUtPm1h c2tfbG93ID0gMDsKKwl2b2xfdGFibGUtPnBoYXNlX2RlbGF5ID0gMDsKKwl2b2xfdGFibGUtPmNv dW50ID0gZGVwX3RhYmxlLT5jb3VudDsKKworCWZvciAoaSA9IDA7IGkgPCBkZXBfdGFibGUtPmNv dW50OyBpKyspIHsKKwkJdm9sX3RhYmxlLT5lbnRyaWVzW2ldLnZhbHVlID0gZGVwX3RhYmxlLT5l bnRyaWVzW2ldLnZkZGNpOworCQl2b2xfdGFibGUtPmVudHJpZXNbaV0uc21pb19sb3cgPSAwOwor CX0KKworCXJlc3VsdCA9IGZpamlfdHJpbV92b2x0YWdlX3RhYmxlKGh3bWdyLCB2b2xfdGFibGUp OworCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgPT0gcmVzdWx0KSwKKwkJCSJGYWlsZWQgdG8gdHJp bSBWRERDSSB0YWJsZS4iLCByZXR1cm4gcmVzdWx0KTsKKworCXJldHVybiAwOworfQorCitzdGF0 aWMgaW50IGZpamlfZ2V0X3N2aTJfdmRkX3ZvbHRhZ2VfdGFibGUoc3RydWN0IHBwX2h3bWdyICpo d21nciwKKwkJcGhtX3BwdF92MV92b2x0YWdlX2xvb2t1cF90YWJsZSAqbG9va3VwX3RhYmxlKQor eworCWludCBpID0gMDsKKwlzdHJ1Y3QgZmlqaV9od21nciAqZGF0YSA9IChzdHJ1Y3QgZmlqaV9o d21nciAqKShod21nci0+YmFja2VuZCk7CisJc3RydWN0IHBwX2F0b21jdHJsX3ZvbHRhZ2VfdGFi bGUgKnZvbF90YWJsZSA9ICYoZGF0YS0+dmRkY192b2x0YWdlX3RhYmxlKTsKKworCVBQX0FTU0VS VF9XSVRIX0NPREUoKDAgIT0gbG9va3VwX3RhYmxlLT5jb3VudCksCisJCQkiVm9sdGFnZSBMb29r dXAgVGFibGUgZW1wdHkuIiwgcmV0dXJuIC1FSU5WQUwpOworCisJdm9sX3RhYmxlLT5tYXNrX2xv dyA9IDA7CisJdm9sX3RhYmxlLT5waGFzZV9kZWxheSA9IDA7CisKKwl2b2xfdGFibGUtPmNvdW50 ID0gbG9va3VwX3RhYmxlLT5jb3VudDsKKworCWZvciAoaSA9IDA7IGkgPCB2b2xfdGFibGUtPmNv dW50OyBpKyspIHsKKwkJdm9sX3RhYmxlLT5lbnRyaWVzW2ldLnZhbHVlID0gbG9va3VwX3RhYmxl LT5lbnRyaWVzW2ldLnVzX3ZkZDsKKwkJdm9sX3RhYmxlLT5lbnRyaWVzW2ldLnNtaW9fbG93ID0g MDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLSBWb2x0YWdlIFRhYmxlcyAtLS0tCisg KiBJZiB0aGUgdm9sdGFnZSB0YWJsZSB3b3VsZCBiZSBiaWdnZXIgdGhhbgorICogd2hhdCB3aWxs IGZpdCBpbnRvIHRoZSBzdGF0ZSB0YWJsZSBvbgorICogdGhlIFNNQyBrZWVwIG9ubHkgdGhlIGhp Z2hlciBlbnRyaWVzLgorICovCitzdGF0aWMgdm9pZCBmaWppX3RyaW1fdm9sdGFnZV90YWJsZV90 b19maXRfc3RhdGVfdGFibGUoc3RydWN0IHBwX2h3bWdyICpod21nciwKKwkJdWludDMyX3QgbWF4 X3ZvbF9zdGVwcywgc3RydWN0IHBwX2F0b21jdHJsX3ZvbHRhZ2VfdGFibGUgKnZvbF90YWJsZSkK K3sKKwl1bnNpZ25lZCBpbnQgaSwgZGlmZjsKKworCWlmICh2b2xfdGFibGUtPmNvdW50IDw9IG1h eF92b2xfc3RlcHMpCisJCXJldHVybjsKKworCWRpZmYgPSB2b2xfdGFibGUtPmNvdW50IC0gbWF4 X3ZvbF9zdGVwczsKKworCWZvciAoaSA9IDA7IGkgPCBtYXhfdm9sX3N0ZXBzOyBpKyspCisJCXZv bF90YWJsZS0+ZW50cmllc1tpXSA9IHZvbF90YWJsZS0+ZW50cmllc1tpICsgZGlmZl07CisKKwl2 b2xfdGFibGUtPmNvdW50ID0gbWF4X3ZvbF9zdGVwczsKKworCXJldHVybjsKK30KKworLyoqCisq IENyZWF0ZSBWb2x0YWdlIFRhYmxlcy4KKyoKKyogQHBhcmFtICAgIGh3bWdyICB0aGUgYWRkcmVz cyBvZiB0aGUgcG93ZXJwbGF5IGhhcmR3YXJlIG1hbmFnZXIuCisqIEByZXR1cm4gICBhbHdheXMg MAorKi8KK3N0YXRpYyBpbnQgZmlqaV9jb25zdHJ1Y3Rfdm9sdGFnZV90YWJsZXMoc3RydWN0IHBw X2h3bWdyICpod21ncikKK3sKKwlzdHJ1Y3QgZmlqaV9od21nciAqZGF0YSA9IChzdHJ1Y3QgZmlq aV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRp b24gKnRhYmxlX2luZm8gPQorCQkJKHN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICopaHdt Z3ItPnBwdGFibGU7CisJaW50IHJlc3VsdDsKKworCWlmIChGSUpJX1ZPTFRBR0VfQ09OVFJPTF9C WV9HUElPID09IGRhdGEtPm12ZGRfY29udHJvbCkgeworCQlyZXN1bHQgPSBhdG9tY3RybF9nZXRf dm9sdGFnZV90YWJsZV92Myhod21nciwKKwkJCQlWT0xUQUdFX1RZUEVfTVZEREMsCVZPTFRBR0Vf T0JKX0dQSU9fTFVULAorCQkJCSYoZGF0YS0+bXZkZF92b2x0YWdlX3RhYmxlKSk7CisJCVBQX0FT U0VSVF9XSVRIX0NPREUoKDAgPT0gcmVzdWx0KSwKKwkJCQkiRmFpbGVkIHRvIHJldHJpZXZlIE1W REQgdGFibGUuIiwKKwkJCQlyZXR1cm4gcmVzdWx0KTsKKwl9IGVsc2UgaWYgKEZJSklfVk9MVEFH RV9DT05UUk9MX0JZX1NWSUQyID09IGRhdGEtPm12ZGRfY29udHJvbCkgeworCQlyZXN1bHQgPSBm aWppX2dldF9zdmkyX212ZGRfdm9sdGFnZV90YWJsZShod21nciwKKwkJCQl0YWJsZV9pbmZvLT52 ZGRfZGVwX29uX21jbGspOworCQlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09IHJlc3VsdCksCisJ CQkJIkZhaWxlZCB0byByZXRyaWV2ZSBTVkkyIE1WREQgdGFibGUgZnJvbSBkZXBlbmRhbmN5IHRh YmxlLiIsCisJCQkJcmV0dXJuIHJlc3VsdDspOworCX0KKworCWlmIChGSUpJX1ZPTFRBR0VfQ09O VFJPTF9CWV9HUElPID09IGRhdGEtPnZkZGNpX2NvbnRyb2wpIHsKKwkJcmVzdWx0ID0gYXRvbWN0 cmxfZ2V0X3ZvbHRhZ2VfdGFibGVfdjMoaHdtZ3IsCisJCQkJVk9MVEFHRV9UWVBFX1ZERENJLCBW T0xUQUdFX09CSl9HUElPX0xVVCwKKwkJCQkmKGRhdGEtPnZkZGNpX3ZvbHRhZ2VfdGFibGUpKTsK KwkJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSByZXN1bHQpLAorCQkJCSJGYWlsZWQgdG8gcmV0 cmlldmUgVkREQ0kgdGFibGUuIiwKKwkJCQlyZXR1cm4gcmVzdWx0KTsKKwl9IGVsc2UgaWYgKEZJ SklfVk9MVEFHRV9DT05UUk9MX0JZX1NWSUQyID09IGRhdGEtPnZkZGNpX2NvbnRyb2wpIHsKKwkJ cmVzdWx0ID0gZmlqaV9nZXRfc3ZpMl92ZGRjaV92b2x0YWdlX3RhYmxlKGh3bWdyLAorCQkJCXRh YmxlX2luZm8tPnZkZF9kZXBfb25fbWNsayk7CisJCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgPT0g cmVzdWx0KSwKKwkJCQkiRmFpbGVkIHRvIHJldHJpZXZlIFNWSTIgVkREQ0kgdGFibGUgZnJvbSBk ZXBlbmRhbmN5IHRhYmxlLiIsCisJCQkJcmV0dXJuIHJlc3VsdCk7CisJfQorCisJaWYoRklKSV9W T0xUQUdFX0NPTlRST0xfQllfU1ZJRDIgPT0gZGF0YS0+dm9sdGFnZV9jb250cm9sKSB7CisJCXJl c3VsdCA9IGZpamlfZ2V0X3N2aTJfdmRkX3ZvbHRhZ2VfdGFibGUoaHdtZ3IsCisJCQkJdGFibGVf aW5mby0+dmRkY19sb29rdXBfdGFibGUpOworCQlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09IHJl c3VsdCksCisJCQkJIkZhaWxlZCB0byByZXRyaWV2ZSBTVkkyIFZEREMgdGFibGUgZnJvbSBsb29r dXAgdGFibGUuIiwKKwkJCQlyZXR1cm4gcmVzdWx0KTsKKwl9CisKKwlQUF9BU1NFUlRfV0lUSF9D T0RFKAorCQkJKGRhdGEtPnZkZGNfdm9sdGFnZV90YWJsZS5jb3VudCA8PSAoU01VNzNfTUFYX0xF VkVMU19WRERDKSksCisJCQkiVG9vIG1hbnkgdm9sdGFnZSB2YWx1ZXMgZm9yIFZEREMuIFRyaW1t aW5nIHRvIGZpdCBzdGF0ZSB0YWJsZS4iLAorCQkJZmlqaV90cmltX3ZvbHRhZ2VfdGFibGVfdG9f Zml0X3N0YXRlX3RhYmxlKGh3bWdyLAorCQkJCQlTTVU3M19NQVhfTEVWRUxTX1ZEREMsICYoZGF0 YS0+dmRkY192b2x0YWdlX3RhYmxlKSkpOworCisJUFBfQVNTRVJUX1dJVEhfQ09ERSgKKwkJCShk YXRhLT52ZGRjaV92b2x0YWdlX3RhYmxlLmNvdW50IDw9IChTTVU3M19NQVhfTEVWRUxTX1ZERENJ KSksCisJCQkiVG9vIG1hbnkgdm9sdGFnZSB2YWx1ZXMgZm9yIFZERENJLiBUcmltbWluZyB0byBm aXQgc3RhdGUgdGFibGUuIiwKKwkJCWZpamlfdHJpbV92b2x0YWdlX3RhYmxlX3RvX2ZpdF9zdGF0 ZV90YWJsZShod21nciwKKwkJCQkJU01VNzNfTUFYX0xFVkVMU19WRERDSSwgJihkYXRhLT52ZGRj aV92b2x0YWdlX3RhYmxlKSkpOworCisJUFBfQVNTRVJUX1dJVEhfQ09ERSgKKwkJCShkYXRhLT5t dmRkX3ZvbHRhZ2VfdGFibGUuY291bnQgPD0gKFNNVTczX01BWF9MRVZFTFNfTVZERCkpLAorCQkJ IlRvbyBtYW55IHZvbHRhZ2UgdmFsdWVzIGZvciBNVkRELiBUcmltbWluZyB0byBmaXQgc3RhdGUg dGFibGUuIiwKKwkJCWZpamlfdHJpbV92b2x0YWdlX3RhYmxlX3RvX2ZpdF9zdGF0ZV90YWJsZSho d21nciwKKwkJCQkJU01VNzNfTUFYX0xFVkVMU19NVkRELCAmKGRhdGEtPm12ZGRfdm9sdGFnZV90 YWJsZSkpKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpamlfaW5pdGlhbGl6 ZV9tY19yZWdfdGFibGUoc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwkvKiBQcm9ncmFtIGFk ZGl0aW9uYWwgTFAgcmVnaXN0ZXJzCisJICogdGhhdCBhcmUgbm8gbG9uZ2VyIHByb2dyYW1tZWQg YnkgVkJJT1MKKwkgKi8KKwljZ3Nfd3JpdGVfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19T RVFfUkFTX1RJTUlOR19MUCwKKwkJCWNnc19yZWFkX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIG1t TUNfU0VRX1JBU19USU1JTkcpKTsKKwljZ3Nfd3JpdGVfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwg bW1NQ19TRVFfQ0FTX1RJTUlOR19MUCwKKwkJCWNnc19yZWFkX3JlZ2lzdGVyKGh3bWdyLT5kZXZp Y2UsIG1tTUNfU0VRX0NBU19USU1JTkcpKTsKKwljZ3Nfd3JpdGVfcmVnaXN0ZXIoaHdtZ3ItPmRl dmljZSwgbW1NQ19TRVFfTUlTQ19USU1JTkcyX0xQLAorCQkJY2dzX3JlYWRfcmVnaXN0ZXIoaHdt Z3ItPmRldmljZSwgbW1NQ19TRVFfTUlTQ19USU1JTkcyKSk7CisJY2dzX3dyaXRlX3JlZ2lzdGVy KGh3bWdyLT5kZXZpY2UsIG1tTUNfU0VRX1dSX0NUTF9EMV9MUCwKKwkJCWNnc19yZWFkX3JlZ2lz dGVyKGh3bWdyLT5kZXZpY2UsIG1tTUNfU0VRX1dSX0NUTF9EMSkpOworCWNnc193cml0ZV9yZWdp c3Rlcihod21nci0+ZGV2aWNlLCBtbU1DX1NFUV9SRF9DVExfRDBfTFAsCisJCQljZ3NfcmVhZF9y ZWdpc3Rlcihod21nci0+ZGV2aWNlLCBtbU1DX1NFUV9SRF9DVExfRDApKTsKKwljZ3Nfd3JpdGVf cmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19TRVFfUkRfQ1RMX0QxX0xQLAorCQkJY2dzX3Jl YWRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19TRVFfUkRfQ1RMX0QxKSk7CisJY2dzX3dy aXRlX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIG1tTUNfU0VRX1BNR19USU1JTkdfTFAsCisJCQlj Z3NfcmVhZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBtbU1DX1NFUV9QTUdfVElNSU5HKSk7CisK KwlyZXR1cm4gMDsKK30KKworLyoqCisqIFByb2dyYW1zIHN0YXRpYyBzY3JlZWQgZGV0ZWN0aW9u IHBhcmFtZXRlcnMKKyoKKyogQHBhcmFtICAgIGh3bWdyICB0aGUgYWRkcmVzcyBvZiB0aGUgcG93 ZXJwbGF5IGhhcmR3YXJlIG1hbmFnZXIuCisqIEByZXR1cm4gICBhbHdheXMgMAorKi8KK3N0YXRp YyBpbnQgZmlqaV9wcm9ncmFtX3N0YXRpY19zY3JlZW5fdGhyZXNob2xkX3BhcmFtZXRlcnMoCisJ CXN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJc3RydWN0IGZpamlfaHdtZ3IgKmRhdGEgPSAo c3RydWN0IGZpamlfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCisJLyogU2V0IHN0YXRpYyBz Y3JlZW4gdGhyZXNob2xkIHVuaXQgKi8KKwlQSE1fV1JJVEVfSU5ESVJFQ1RfRklFTEQoaHdtZ3It PmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywKKwkJCUNHX1NUQVRJQ19TQ1JFRU5fUEFSQU1FVEVS LCBTVEFUSUNfU0NSRUVOX1RIUkVTSE9MRF9VTklULAorCQkJZGF0YS0+c3RhdGljX3NjcmVlbl90 aHJlc2hvbGRfdW5pdCk7CisJLyogU2V0IHN0YXRpYyBzY3JlZW4gdGhyZXNob2xkICovCisJUEhN X1dSSVRFX0lORElSRUNUX0ZJRUxEKGh3bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19TTUMsCisJ CQlDR19TVEFUSUNfU0NSRUVOX1BBUkFNRVRFUiwgU1RBVElDX1NDUkVFTl9USFJFU0hPTEQsCisJ CQlkYXRhLT5zdGF0aWNfc2NyZWVuX3RocmVzaG9sZCk7CisKKyAgICByZXR1cm4gMDsKK30KKwor LyoqCisqIFNldHVwIGRpc3BsYXkgZ2FwIGZvciBnbGl0Y2ggZnJlZSBtZW1vcnkgY2xvY2sgc3dp dGNoaW5nLgorKgorKiBAcGFyYW0gICAgaHdtZ3IgIHRoZSBhZGRyZXNzIG9mIHRoZSBwb3dlcnBs YXkgaGFyZHdhcmUgbWFuYWdlci4KKyogQHJldHVybiAgIGFsd2F5cyAgMAorKi8KK3N0YXRpYyBp bnQgZmlqaV9lbmFibGVfZGlzcGxheV9nYXAoc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwl1 aW50MzJfdCBkaXNwbGF5R2FwID0KKwkJCWNnc19yZWFkX2luZF9yZWdpc3Rlcihod21nci0+ZGV2 aWNlLCBDR1NfSU5EX1JFR19fU01DLAorCQkJCQlpeENHX0RJU1BMQVlfR0FQX0NOVEwpOworCisJ ZGlzcGxheUdhcCA9IFBITV9TRVRfRklFTEQoZGlzcGxheUdhcCwgQ0dfRElTUExBWV9HQVBfQ05U TCwKKwkJCURJU1BfR0FQLCBESVNQTEFZX0dBUF9JR05PUkUpOworCisJZGlzcGxheUdhcCA9IFBI TV9TRVRfRklFTEQoZGlzcGxheUdhcCwgQ0dfRElTUExBWV9HQVBfQ05UTCwKKwkJCURJU1BfR0FQ X01DSEcsIERJU1BMQVlfR0FQX1ZCTEFOSyk7CisKKwljZ3Nfd3JpdGVfaW5kX3JlZ2lzdGVyKGh3 bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19TTUMsCisJCQlpeENHX0RJU1BMQVlfR0FQX0NOVEws IGRpc3BsYXlHYXApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorKiBQcm9ncmFtcyBhY3Rpdml0 eSBzdGF0ZSB0cmFuc2l0aW9uIHZvdGluZyBjbGllbnRzCisqCisqIEBwYXJhbSAgICBod21nciAg dGhlIGFkZHJlc3Mgb2YgdGhlIHBvd2VycGxheSBoYXJkd2FyZSBtYW5hZ2VyLgorKiBAcmV0dXJu ICAgYWx3YXlzICAwCisqLworc3RhdGljIGludCBmaWppX3Byb2dyYW1fdm90aW5nX2NsaWVudHMo c3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwlzdHJ1Y3QgZmlqaV9od21nciAqZGF0YSA9IChz dHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+YmFja2VuZCk7CisKKwkvKiBDbGVhciByZXNldCBm b3Igdm90aW5nIGNsaWVudHMgYmVmb3JlIGVuYWJsaW5nIERQTSAqLworCVBITV9XUklURV9JTkRJ UkVDVF9GSUVMRChod21nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01DLAorCQkJU0NMS19QV1JN R1RfQ05UTCwgUkVTRVRfU0NMS19DTlQsIDApOworCVBITV9XUklURV9JTkRJUkVDVF9GSUVMRCho d21nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01DLAorCQkJU0NMS19QV1JNR1RfQ05UTCwgUkVT RVRfQlVTWV9DTlQsIDApOworCisJY2dzX3dyaXRlX2luZF9yZWdpc3Rlcihod21nci0+ZGV2aWNl LCBDR1NfSU5EX1JFR19fU01DLAorCQkJaXhDR19GUkVRX1RSQU5fVk9USU5HXzAsIGRhdGEtPnZv dGluZ19yaWdodHNfY2xpZW50czApOworCWNnc193cml0ZV9pbmRfcmVnaXN0ZXIoaHdtZ3ItPmRl dmljZSwgQ0dTX0lORF9SRUdfX1NNQywKKwkJCWl4Q0dfRlJFUV9UUkFOX1ZPVElOR18xLCBkYXRh LT52b3RpbmdfcmlnaHRzX2NsaWVudHMxKTsKKwljZ3Nfd3JpdGVfaW5kX3JlZ2lzdGVyKGh3bWdy LT5kZXZpY2UsIENHU19JTkRfUkVHX19TTUMsCisJCQlpeENHX0ZSRVFfVFJBTl9WT1RJTkdfMiwg ZGF0YS0+dm90aW5nX3JpZ2h0c19jbGllbnRzMik7CisJY2dzX3dyaXRlX2luZF9yZWdpc3Rlciho d21nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01DLAorCQkJaXhDR19GUkVRX1RSQU5fVk9USU5H XzMsIGRhdGEtPnZvdGluZ19yaWdodHNfY2xpZW50czMpOworCWNnc193cml0ZV9pbmRfcmVnaXN0 ZXIoaHdtZ3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywKKwkJCWl4Q0dfRlJFUV9UUkFOX1ZP VElOR180LCBkYXRhLT52b3RpbmdfcmlnaHRzX2NsaWVudHM0KTsKKwljZ3Nfd3JpdGVfaW5kX3Jl Z2lzdGVyKGh3bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19TTUMsCisJCQlpeENHX0ZSRVFfVFJB Tl9WT1RJTkdfNSwgZGF0YS0+dm90aW5nX3JpZ2h0c19jbGllbnRzNSk7CisJY2dzX3dyaXRlX2lu ZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01DLAorCQkJaXhDR19GUkVR X1RSQU5fVk9USU5HXzYsIGRhdGEtPnZvdGluZ19yaWdodHNfY2xpZW50czYpOworCWNnc193cml0 ZV9pbmRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywKKwkJCWl4Q0df RlJFUV9UUkFOX1ZPVElOR183LCBkYXRhLT52b3RpbmdfcmlnaHRzX2NsaWVudHM3KTsKKworCXJl dHVybiAwOworfQorCisvKioKKyogR2V0IHRoZSBsb2NhdGlvbiBvZiB2YXJpb3VzIHRhYmxlcyBp bnNpZGUgdGhlIEZXIGltYWdlLgorKgorKiBAcGFyYW0gICAgaHdtZ3IgIHRoZSBhZGRyZXNzIG9m IHRoZSBwb3dlcnBsYXkgaGFyZHdhcmUgbWFuYWdlci4KKyogQHJldHVybiAgIGFsd2F5cyAgMAor Ki8KK3N0YXRpYyBpbnQgZmlqaV9wcm9jZXNzX2Zpcm13YXJlX2hlYWRlcihzdHJ1Y3QgcHBfaHdt Z3IgKmh3bWdyKQoreworCXN0cnVjdCBmaWppX2h3bWdyICpkYXRhID0gKHN0cnVjdCBmaWppX2h3 bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKwlzdHJ1Y3QgZmlqaV9zbXVtZ3IgKnNtdV9kYXRhID0g KHN0cnVjdCBmaWppX3NtdW1nciAqKShod21nci0+c211bWdyLT5iYWNrZW5kKTsKKwl1aW50MzJf dCB0bXA7CisJaW50IHJlc3VsdDsKKwlib29sIGVycm9yID0gZmFsc2U7CisKKwlyZXN1bHQgPSBm aWppX3JlYWRfc21jX3NyYW1fZHdvcmQoaHdtZ3ItPnNtdW1nciwKKwkJCVNNVTdfRklSTVdBUkVf SEVBREVSX0xPQ0FUSU9OICsKKwkJCW9mZnNldG9mKFNNVTczX0Zpcm13YXJlX0hlYWRlciwgRHBt VGFibGUpLAorCQkJJnRtcCwgZGF0YS0+c3JhbV9lbmQpOworCisJaWYgKDAgPT0gcmVzdWx0KQor CQlkYXRhLT5kcG1fdGFibGVfc3RhcnQgPSB0bXA7CisKKwllcnJvciB8PSAoMCAhPSByZXN1bHQp OworCisJcmVzdWx0ID0gZmlqaV9yZWFkX3NtY19zcmFtX2R3b3JkKGh3bWdyLT5zbXVtZ3IsCisJ CQlTTVU3X0ZJUk1XQVJFX0hFQURFUl9MT0NBVElPTiArCisJCQlvZmZzZXRvZihTTVU3M19GaXJt d2FyZV9IZWFkZXIsIFNvZnRSZWdpc3RlcnMpLAorCQkJJnRtcCwgZGF0YS0+c3JhbV9lbmQpOwor CisJaWYgKCFyZXN1bHQpIHsKKwkJZGF0YS0+c29mdF9yZWdzX3N0YXJ0ID0gdG1wOworCQlzbXVf ZGF0YS0+c29mdF9yZWdzX3N0YXJ0ID0gdG1wOworCX0KKworCWVycm9yIHw9ICgwICE9IHJlc3Vs dCk7CisKKwlyZXN1bHQgPSBmaWppX3JlYWRfc21jX3NyYW1fZHdvcmQoaHdtZ3ItPnNtdW1nciwK KwkJCVNNVTdfRklSTVdBUkVfSEVBREVSX0xPQ0FUSU9OICsKKwkJCW9mZnNldG9mKFNNVTczX0Zp cm13YXJlX0hlYWRlciwgbWNSZWdpc3RlclRhYmxlKSwKKwkJCSZ0bXAsIGRhdGEtPnNyYW1fZW5k KTsKKworCWlmICghcmVzdWx0KQorCQlkYXRhLT5tY19yZWdfdGFibGVfc3RhcnQgPSB0bXA7CisK KwlyZXN1bHQgPSBmaWppX3JlYWRfc21jX3NyYW1fZHdvcmQoaHdtZ3ItPnNtdW1nciwKKwkJCVNN VTdfRklSTVdBUkVfSEVBREVSX0xPQ0FUSU9OICsKKwkJCW9mZnNldG9mKFNNVTczX0Zpcm13YXJl X0hlYWRlciwgRmFuVGFibGUpLAorCQkJJnRtcCwgZGF0YS0+c3JhbV9lbmQpOworCisJaWYgKCFy ZXN1bHQpCisJCWRhdGEtPmZhbl90YWJsZV9zdGFydCA9IHRtcDsKKworCWVycm9yIHw9ICgwICE9 IHJlc3VsdCk7CisKKwlyZXN1bHQgPSBmaWppX3JlYWRfc21jX3NyYW1fZHdvcmQoaHdtZ3ItPnNt dW1nciwKKwkJCVNNVTdfRklSTVdBUkVfSEVBREVSX0xPQ0FUSU9OICsKKwkJCW9mZnNldG9mKFNN VTczX0Zpcm13YXJlX0hlYWRlciwgbWNBcmJEcmFtVGltaW5nVGFibGUpLAorCQkJJnRtcCwgZGF0 YS0+c3JhbV9lbmQpOworCisJaWYgKCFyZXN1bHQpCisJCWRhdGEtPmFyYl90YWJsZV9zdGFydCA9 IHRtcDsKKworCWVycm9yIHw9ICgwICE9IHJlc3VsdCk7CisKKwlyZXN1bHQgPSBmaWppX3JlYWRf c21jX3NyYW1fZHdvcmQoaHdtZ3ItPnNtdW1nciwKKwkJCVNNVTdfRklSTVdBUkVfSEVBREVSX0xP Q0FUSU9OICsKKwkJCW9mZnNldG9mKFNNVTczX0Zpcm13YXJlX0hlYWRlciwgVmVyc2lvbiksCisJ CQkmdG1wLCBkYXRhLT5zcmFtX2VuZCk7CisKKwlpZiAoIXJlc3VsdCkKKwkJaHdtZ3ItPm1pY3Jv Y29kZV92ZXJzaW9uX2luZm8uU01DID0gdG1wOworCisJZXJyb3IgfD0gKDAgIT0gcmVzdWx0KTsK KworICAgIHJldHVybiBlcnJvciA/IC0xIDogMDsKK30KKworLyogQ29weSBvbmUgYXJiIHNldHRp bmcgdG8gYW5vdGhlciBhbmQgdGhlbiBzd2l0Y2ggdGhlIGFjdGl2ZSBzZXQuCisgKiBhcmJfc3Jj IGFuZCBhcmJfZGVzdCBpcyBvbmUgb2YgdGhlIE1DX0NHX0FSQl9GUkVRX0Z4IGNvbnN0YW50cy4K KyAqLworc3RhdGljIGludCBmaWppX2NvcHlfYW5kX3N3aXRjaF9hcmJfc2V0cyhzdHJ1Y3QgcHBf aHdtZ3IgKmh3bWdyLAorCQl1aW50MzJfdCBhcmJfc3JjLCB1aW50MzJfdCBhcmJfZGVzdCkKK3sK Kwl1aW50MzJfdCBtY19hcmJfZHJhbV90aW1pbmc7CisJdWludDMyX3QgbWNfYXJiX2RyYW1fdGlt aW5nMjsKKwl1aW50MzJfdCBidXJzdF90aW1lOworCXVpbnQzMl90IG1jX2NnX2NvbmZpZzsKKwor CXN3aXRjaCAoYXJiX3NyYykgeworCWNhc2UgTUNfQ0dfQVJCX0ZSRVFfRjA6CisJCW1jX2FyYl9k cmFtX3RpbWluZyAgPSBjZ3NfcmVhZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBtbU1DX0FSQl9E UkFNX1RJTUlORyk7CisJCW1jX2FyYl9kcmFtX3RpbWluZzIgPSBjZ3NfcmVhZF9yZWdpc3Rlciho d21nci0+ZGV2aWNlLCBtbU1DX0FSQl9EUkFNX1RJTUlORzIpOworCQlidXJzdF90aW1lID0gUEhN X1JFQURfRklFTEQoaHdtZ3ItPmRldmljZSwgTUNfQVJCX0JVUlNUX1RJTUUsIFNUQVRFMCk7CisJ CWJyZWFrOworCWNhc2UgTUNfQ0dfQVJCX0ZSRVFfRjE6CisJCW1jX2FyYl9kcmFtX3RpbWluZyAg PSBjZ3NfcmVhZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBtbU1DX0FSQl9EUkFNX1RJTUlOR18x KTsKKwkJbWNfYXJiX2RyYW1fdGltaW5nMiA9IGNnc19yZWFkX3JlZ2lzdGVyKGh3bWdyLT5kZXZp Y2UsIG1tTUNfQVJCX0RSQU1fVElNSU5HMl8xKTsKKwkJYnVyc3RfdGltZSA9IFBITV9SRUFEX0ZJ RUxEKGh3bWdyLT5kZXZpY2UsIE1DX0FSQl9CVVJTVF9USU1FLCBTVEFURTEpOworCQlicmVhazsK KwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGFyYl9kZXN0KSB7 CisJY2FzZSBNQ19DR19BUkJfRlJFUV9GMDoKKwkJY2dzX3dyaXRlX3JlZ2lzdGVyKGh3bWdyLT5k ZXZpY2UsIG1tTUNfQVJCX0RSQU1fVElNSU5HLCBtY19hcmJfZHJhbV90aW1pbmcpOworCQljZ3Nf d3JpdGVfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19BUkJfRFJBTV9USU1JTkcyLCBtY19h cmJfZHJhbV90aW1pbmcyKTsKKwkJUEhNX1dSSVRFX0ZJRUxEKGh3bWdyLT5kZXZpY2UsIE1DX0FS Ql9CVVJTVF9USU1FLCBTVEFURTAsIGJ1cnN0X3RpbWUpOworCQlicmVhazsKKwljYXNlIE1DX0NH X0FSQl9GUkVRX0YxOgorCQljZ3Nfd3JpdGVfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19B UkJfRFJBTV9USU1JTkdfMSwgbWNfYXJiX2RyYW1fdGltaW5nKTsKKwkJY2dzX3dyaXRlX3JlZ2lz dGVyKGh3bWdyLT5kZXZpY2UsIG1tTUNfQVJCX0RSQU1fVElNSU5HMl8xLCBtY19hcmJfZHJhbV90 aW1pbmcyKTsKKwkJUEhNX1dSSVRFX0ZJRUxEKGh3bWdyLT5kZXZpY2UsIE1DX0FSQl9CVVJTVF9U SU1FLCBTVEFURTEsIGJ1cnN0X3RpbWUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4g LUVJTlZBTDsKKwl9CisKKyAgICBtY19jZ19jb25maWcgPSBjZ3NfcmVhZF9yZWdpc3Rlcihod21n ci0+ZGV2aWNlLCBtbU1DX0NHX0NPTkZJRyk7CisgICAgbWNfY2dfY29uZmlnIHw9IDB4MDAwMDAw MEY7CisgICAgY2dzX3dyaXRlX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIG1tTUNfQ0dfQ09ORklH LCBtY19jZ19jb25maWcpOworICAgIFBITV9XUklURV9GSUVMRChod21nci0+ZGV2aWNlLCBNQ19B UkJfQ0csIENHX0FSQl9SRVEsIGFyYl9kZXN0KTsKKworICAgIHJldHVybiAwOworfQorCisvKioK KyogSW5pdGlhbCBzd2l0Y2ggZnJvbSBBUkIgRjAtPkYxCisqCisqIEBwYXJhbSAgICBod21nciAg dGhlIGFkZHJlc3Mgb2YgdGhlIHBvd2VycGxheSBoYXJkd2FyZSBtYW5hZ2VyLgorKiBAcmV0dXJu ICAgYWx3YXlzIDAKKyogVGhpcyBmdW5jdGlvbiBpcyB0byBiZSBjYWxsZWQgZnJvbSB0aGUgU2V0 UG93ZXJTdGF0ZSB0YWJsZS4KKyovCitzdGF0aWMgaW50IGZpamlfaW5pdGlhbF9zd2l0Y2hfZnJv bV9hcmJmMF90b19mMShzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCXJldHVybiBmaWppX2Nv cHlfYW5kX3N3aXRjaF9hcmJfc2V0cyhod21nciwKKwkJCU1DX0NHX0FSQl9GUkVRX0YwLCBNQ19D R19BUkJfRlJFUV9GMSk7Cit9CisKK3N0YXRpYyBpbnQgZmlqaV9yZXNldF9zaW5nbGVfZHBtX3Rh YmxlKHN0cnVjdCBwcF9od21nciAqaHdtZ3IsCisJCXN0cnVjdCBmaWppX3NpbmdsZV9kcG1fdGFi bGUgKmRwbV90YWJsZSwgdWludDMyX3QgY291bnQpCit7CisJaW50IGk7CisJUFBfQVNTRVJUX1dJ VEhfQ09ERShjb3VudCA8PSBNQVhfUkVHVUxBUl9EUE1fTlVNQkVSLAorCQkJIkZhdGFsIGVycm9y LCBjYW4gbm90IHNldCB1cCBzaW5nbGUgRFBNIHRhYmxlIGVudHJpZXMgIgorCQkJInRvIGV4Y2Vl ZCBtYXggbnVtYmVyISIsKTsKKworCWRwbV90YWJsZS0+Y291bnQgPSBjb3VudDsKKwlmb3IgKGkg PSAwOyBpIDwgTUFYX1JFR1VMQVJfRFBNX05VTUJFUjsgaSsrKQorCQlkcG1fdGFibGUtPmRwbV9s ZXZlbHNbaV0uZW5hYmxlZCA9IGZhbHNlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lk IGZpamlfc2V0dXBfcGNpZV90YWJsZV9lbnRyeSgKKwlzdHJ1Y3QgZmlqaV9zaW5nbGVfZHBtX3Rh YmxlICpkcG1fdGFibGUsCisJdWludDMyX3QgaW5kZXgsIHVpbnQzMl90IHBjaWVfZ2VuLAorCXVp bnQzMl90IHBjaWVfbGFuZXMpCit7CisJZHBtX3RhYmxlLT5kcG1fbGV2ZWxzW2luZGV4XS52YWx1 ZSA9IHBjaWVfZ2VuOworCWRwbV90YWJsZS0+ZHBtX2xldmVsc1tpbmRleF0ucGFyYW0xID0gcGNp ZV9sYW5lczsKKwlkcG1fdGFibGUtPmRwbV9sZXZlbHNbaW5kZXhdLmVuYWJsZWQgPSAxOworfQor CitzdGF0aWMgaW50IGZpamlfc2V0dXBfZGVmYXVsdF9wY2llX3RhYmxlKHN0cnVjdCBwcF9od21n ciAqaHdtZ3IpCit7CisJc3RydWN0IGZpamlfaHdtZ3IgKmRhdGEgPSAoc3RydWN0IGZpamlfaHdt Z3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICp0 YWJsZV9pbmZvID0KKwkJCShzdHJ1Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqKShod21nci0+ cHB0YWJsZSk7CisJc3RydWN0IHBobV9wcHRfdjFfcGNpZV90YWJsZSAqcGNpZV90YWJsZSA9IHRh YmxlX2luZm8tPnBjaWVfdGFibGU7CisJdWludDMyX3QgaSwgbWF4X2VudHJ5OworCisJUFBfQVNT RVJUX1dJVEhfQ09ERSgoZGF0YS0+dXNlX3BjaWVfcGVyZm9ybWFuY2VfbGV2ZWxzIHx8CisJCQlk YXRhLT51c2VfcGNpZV9wb3dlcl9zYXZpbmdfbGV2ZWxzKSwgIk5vIHBjaWUgcGVyZm9ybWFuY2Ug bGV2ZWxzISIsCisJCQlyZXR1cm4gLUVJTlZBTCk7CisKKwlpZiAoZGF0YS0+dXNlX3BjaWVfcGVy Zm9ybWFuY2VfbGV2ZWxzICYmCisJCQkhZGF0YS0+dXNlX3BjaWVfcG93ZXJfc2F2aW5nX2xldmVs cykgeworCQlkYXRhLT5wY2llX2dlbl9wb3dlcl9zYXZpbmcgPSBkYXRhLT5wY2llX2dlbl9wZXJm b3JtYW5jZTsKKwkJZGF0YS0+cGNpZV9sYW5lX3Bvd2VyX3NhdmluZyA9IGRhdGEtPnBjaWVfbGFu ZV9wZXJmb3JtYW5jZTsKKwl9IGVsc2UgaWYgKCFkYXRhLT51c2VfcGNpZV9wZXJmb3JtYW5jZV9s ZXZlbHMgJiYKKwkJCWRhdGEtPnVzZV9wY2llX3Bvd2VyX3NhdmluZ19sZXZlbHMpIHsKKwkJZGF0 YS0+cGNpZV9nZW5fcGVyZm9ybWFuY2UgPSBkYXRhLT5wY2llX2dlbl9wb3dlcl9zYXZpbmc7CisJ CWRhdGEtPnBjaWVfbGFuZV9wZXJmb3JtYW5jZSA9IGRhdGEtPnBjaWVfbGFuZV9wb3dlcl9zYXZp bmc7CisJfQorCisJZmlqaV9yZXNldF9zaW5nbGVfZHBtX3RhYmxlKGh3bWdyLAorCQkJJmRhdGEt PmRwbV90YWJsZS5wY2llX3NwZWVkX3RhYmxlLCBTTVU3M19NQVhfTEVWRUxTX0xJTkspOworCisJ aWYgKHBjaWVfdGFibGUgIT0gTlVMTCkgeworCQkvKiBtYXhfZW50cnkgaXMgdXNlZCB0byBtYWtl IHN1cmUgd2UgcmVzZXJ2ZSBvbmUgUENJRSBsZXZlbAorCQkgKiBmb3IgYm9vdCBsZXZlbCAoZml4 IGZvciBBK0EgUFNQUCBpc3N1ZSkuCisJCSAqIElmIFBDSUUgdGFibGUgZnJvbSBQUFRhYmxlIGhh dmUgVUxWIGVudHJ5ICsgOCBlbnRyaWVzLAorCQkgKiB0aGVuIGlnbm9yZSB0aGUgbGFzdCBlbnRy eS4qLworCQltYXhfZW50cnkgPSAoU01VNzNfTUFYX0xFVkVMU19MSU5LIDwgcGNpZV90YWJsZS0+ Y291bnQpID8KKwkJCQlTTVU3M19NQVhfTEVWRUxTX0xJTksgOiBwY2llX3RhYmxlLT5jb3VudDsK KwkJZm9yIChpID0gMTsgaSA8IG1heF9lbnRyeTsgaSsrKSB7CisJCQlmaWppX3NldHVwX3BjaWVf dGFibGVfZW50cnkoJmRhdGEtPmRwbV90YWJsZS5wY2llX3NwZWVkX3RhYmxlLCBpIC0gMSwKKwkJ CQkJZ2V0X3BjaWVfZ2VuX3N1cHBvcnQoZGF0YS0+cGNpZV9nZW5fY2FwLAorCQkJCQkJCXBjaWVf dGFibGUtPmVudHJpZXNbaV0uZ2VuX3NwZWVkKSwKKwkJCQkJZ2V0X3BjaWVfbGFuZV9zdXBwb3J0 KGRhdGEtPnBjaWVfbGFuZV9jYXAsCisJCQkJCQkJcGNpZV90YWJsZS0+ZW50cmllc1tpXS5sYW5l X3dpZHRoKSk7CisJCX0KKwkJZGF0YS0+ZHBtX3RhYmxlLnBjaWVfc3BlZWRfdGFibGUuY291bnQg PSBtYXhfZW50cnkgLSAxOworCX0gZWxzZSB7CisJCS8qIEhhcmRjb2RlIFBjaWUgVGFibGUgKi8K KwkJZmlqaV9zZXR1cF9wY2llX3RhYmxlX2VudHJ5KCZkYXRhLT5kcG1fdGFibGUucGNpZV9zcGVl ZF90YWJsZSwgMCwKKwkJCQlnZXRfcGNpZV9nZW5fc3VwcG9ydChkYXRhLT5wY2llX2dlbl9jYXAs CisJCQkJCQlQUF9NaW5fUENJRUdlbiksCisJCQkJZ2V0X3BjaWVfbGFuZV9zdXBwb3J0KGRhdGEt PnBjaWVfbGFuZV9jYXAsCisJCQkJCQlQUF9NYXhfUENJRUxhbmUpKTsKKwkJZmlqaV9zZXR1cF9w Y2llX3RhYmxlX2VudHJ5KCZkYXRhLT5kcG1fdGFibGUucGNpZV9zcGVlZF90YWJsZSwgMSwKKwkJ CQlnZXRfcGNpZV9nZW5fc3VwcG9ydChkYXRhLT5wY2llX2dlbl9jYXAsCisJCQkJCQlQUF9NaW5f UENJRUdlbiksCisJCQkJZ2V0X3BjaWVfbGFuZV9zdXBwb3J0KGRhdGEtPnBjaWVfbGFuZV9jYXAs CisJCQkJCQlQUF9NYXhfUENJRUxhbmUpKTsKKwkJZmlqaV9zZXR1cF9wY2llX3RhYmxlX2VudHJ5 KCZkYXRhLT5kcG1fdGFibGUucGNpZV9zcGVlZF90YWJsZSwgMiwKKwkJCQlnZXRfcGNpZV9nZW5f c3VwcG9ydChkYXRhLT5wY2llX2dlbl9jYXAsCisJCQkJCQlQUF9NYXhfUENJRUdlbiksCisJCQkJ Z2V0X3BjaWVfbGFuZV9zdXBwb3J0KGRhdGEtPnBjaWVfbGFuZV9jYXAsCisJCQkJCQlQUF9NYXhf UENJRUxhbmUpKTsKKwkJZmlqaV9zZXR1cF9wY2llX3RhYmxlX2VudHJ5KCZkYXRhLT5kcG1fdGFi bGUucGNpZV9zcGVlZF90YWJsZSwgMywKKwkJCQlnZXRfcGNpZV9nZW5fc3VwcG9ydChkYXRhLT5w Y2llX2dlbl9jYXAsCisJCQkJCQlQUF9NYXhfUENJRUdlbiksCisJCQkJZ2V0X3BjaWVfbGFuZV9z dXBwb3J0KGRhdGEtPnBjaWVfbGFuZV9jYXAsCisJCQkJCQlQUF9NYXhfUENJRUxhbmUpKTsKKwkJ ZmlqaV9zZXR1cF9wY2llX3RhYmxlX2VudHJ5KCZkYXRhLT5kcG1fdGFibGUucGNpZV9zcGVlZF90 YWJsZSwgNCwKKwkJCQlnZXRfcGNpZV9nZW5fc3VwcG9ydChkYXRhLT5wY2llX2dlbl9jYXAsCisJ CQkJCQlQUF9NYXhfUENJRUdlbiksCisJCQkJZ2V0X3BjaWVfbGFuZV9zdXBwb3J0KGRhdGEtPnBj aWVfbGFuZV9jYXAsCisJCQkJCQlQUF9NYXhfUENJRUxhbmUpKTsKKwkJZmlqaV9zZXR1cF9wY2ll X3RhYmxlX2VudHJ5KCZkYXRhLT5kcG1fdGFibGUucGNpZV9zcGVlZF90YWJsZSwgNSwKKwkJCQln ZXRfcGNpZV9nZW5fc3VwcG9ydChkYXRhLT5wY2llX2dlbl9jYXAsCisJCQkJCQlQUF9NYXhfUENJ RUdlbiksCisJCQkJZ2V0X3BjaWVfbGFuZV9zdXBwb3J0KGRhdGEtPnBjaWVfbGFuZV9jYXAsCisJ CQkJCQlQUF9NYXhfUENJRUxhbmUpKTsKKworCQlkYXRhLT5kcG1fdGFibGUucGNpZV9zcGVlZF90 YWJsZS5jb3VudCA9IDY7CisJfQorCS8qIFBvcHVsYXRlIGxhc3QgbGV2ZWwgZm9yIGJvb3QgUENJ RSBsZXZlbCwgYnV0IGRvIG5vdCBpbmNyZW1lbnQgY291bnQuICovCisJZmlqaV9zZXR1cF9wY2ll X3RhYmxlX2VudHJ5KCZkYXRhLT5kcG1fdGFibGUucGNpZV9zcGVlZF90YWJsZSwKKwkJCWRhdGEt PmRwbV90YWJsZS5wY2llX3NwZWVkX3RhYmxlLmNvdW50LAorCQkJZ2V0X3BjaWVfZ2VuX3N1cHBv cnQoZGF0YS0+cGNpZV9nZW5fY2FwLAorCQkJCQlQUF9NaW5fUENJRUdlbiksCisJCQlnZXRfcGNp ZV9sYW5lX3N1cHBvcnQoZGF0YS0+cGNpZV9sYW5lX2NhcCwKKwkJCQkJUFBfTWF4X1BDSUVMYW5l KSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdG8gaW5pdGFs aXplIGFsbCBEUE0gc3RhdGUgdGFibGVzCisgKiBmb3IgU01VNyBiYXNlZCBvbiB0aGUgZGVwZW5k ZW5jeSB0YWJsZS4KKyAqIER5bmFtaWMgc3RhdGUgcGF0Y2hpbmcgZnVuY3Rpb24gd2lsbCB0aGVu IHRyaW0gdGhlc2UKKyAqIHN0YXRlIHRhYmxlcyB0byB0aGUgYWxsb3dlZCByYW5nZSBiYXNlZAor ICogb24gdGhlIHBvd2VyIHBvbGljeSBvciBleHRlcm5hbCBjbGllbnQgcmVxdWVzdHMsCisgKiBz dWNoIGFzIFVWRCByZXF1ZXN0LCBldGMuCisgKi8KK3N0YXRpYyBpbnQgZmlqaV9zZXR1cF9kZWZh dWx0X2RwbV90YWJsZXMoc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwlzdHJ1Y3QgZmlqaV9o d21nciAqZGF0YSA9IChzdHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJc3Ry dWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKnRhYmxlX2luZm8gPQorCQkJKHN0cnVjdCBwaG1f cHB0X3YxX2luZm9ybWF0aW9uICopKGh3bWdyLT5wcHRhYmxlKTsKKwl1aW50MzJfdCBpOworCisJ c3RydWN0IHBobV9wcHRfdjFfY2xvY2tfdm9sdGFnZV9kZXBlbmRlbmN5X3RhYmxlICpkZXBfc2Ns a190YWJsZSA9CisJCQl0YWJsZV9pbmZvLT52ZGRfZGVwX29uX3NjbGs7CisJc3RydWN0IHBobV9w cHRfdjFfY2xvY2tfdm9sdGFnZV9kZXBlbmRlbmN5X3RhYmxlICpkZXBfbWNsa190YWJsZSA9CisJ CQl0YWJsZV9pbmZvLT52ZGRfZGVwX29uX21jbGs7CisKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKGRl cF9zY2xrX3RhYmxlICE9IE5VTEwsCisJCQkiU0NMSyBkZXBlbmRlbmN5IHRhYmxlIGlzIG1pc3Np bmcuIFRoaXMgdGFibGUgaXMgbWFuZGF0b3J5IiwKKwkJCXJldHVybiAtRUlOVkFMKTsKKwlQUF9B U1NFUlRfV0lUSF9DT0RFKGRlcF9zY2xrX3RhYmxlLT5jb3VudCA+PSAxLAorCQkJIlNDTEsgZGVw ZW5kZW5jeSB0YWJsZSBoYXMgdG8gaGF2ZSBpcyBtaXNzaW5nLiAiCisJCQkiVGhpcyB0YWJsZSBp cyBtYW5kYXRvcnkiLAorCQkJcmV0dXJuIC1FSU5WQUwpOworCisJUFBfQVNTRVJUX1dJVEhfQ09E RShkZXBfbWNsa190YWJsZSAhPSBOVUxMLAorCQkJIk1DTEsgZGVwZW5kZW5jeSB0YWJsZSBpcyBt aXNzaW5nLiBUaGlzIHRhYmxlIGlzIG1hbmRhdG9yeSIsCisJCQlyZXR1cm4gLUVJTlZBTCk7CisJ UFBfQVNTRVJUX1dJVEhfQ09ERShkZXBfbWNsa190YWJsZS0+Y291bnQgPj0gMSwKKwkJCSJNQ0xL IGRlcGVuZGVuY3kgdGFibGUgaGFzIHRvIGhhdmUgaXMgbWlzc2luZy4gIgorCQkJIlRoaXMgdGFi bGUgaXMgbWFuZGF0b3J5IiwKKwkJCXJldHVybiAtRUlOVkFMKTsKKworCS8qIGNsZWFyIHRoZSBz dGF0ZSB0YWJsZSB0byByZXNldCBldmVyeXRoaW5nIHRvIGRlZmF1bHQgKi8KKwlmaWppX3Jlc2V0 X3NpbmdsZV9kcG1fdGFibGUoaHdtZ3IsCisJCQkmZGF0YS0+ZHBtX3RhYmxlLnNjbGtfdGFibGUs IFNNVTczX01BWF9MRVZFTFNfR1JBUEhJQ1MpOworCWZpamlfcmVzZXRfc2luZ2xlX2RwbV90YWJs ZShod21nciwKKwkJCSZkYXRhLT5kcG1fdGFibGUubWNsa190YWJsZSwgU01VNzNfTUFYX0xFVkVM U19NRU1PUlkpOworCisJLyogSW5pdGlhbGl6ZSBTY2xrIERQTSB0YWJsZSBiYXNlZCBvbiBhbGxv dyBTY2xrIHZhbHVlcyAqLworCWRhdGEtPmRwbV90YWJsZS5zY2xrX3RhYmxlLmNvdW50ID0gMDsK Kwlmb3IgKGkgPSAwOyBpIDwgZGVwX3NjbGtfdGFibGUtPmNvdW50OyBpKyspIHsKKwkJaWYgKGkg PT0gMCB8fCBkYXRhLT5kcG1fdGFibGUuc2Nsa190YWJsZS5kcG1fbGV2ZWxzCisJCQkJW2RhdGEt PmRwbV90YWJsZS5zY2xrX3RhYmxlLmNvdW50IC0gMV0udmFsdWUgIT0KKwkJCQkJCWRlcF9zY2xr X3RhYmxlLT5lbnRyaWVzW2ldLmNsaykgeworCQkJZGF0YS0+ZHBtX3RhYmxlLnNjbGtfdGFibGUu ZHBtX2xldmVscworCQkJW2RhdGEtPmRwbV90YWJsZS5zY2xrX3RhYmxlLmNvdW50XS52YWx1ZSA9 CisJCQkJCWRlcF9zY2xrX3RhYmxlLT5lbnRyaWVzW2ldLmNsazsKKwkJCWRhdGEtPmRwbV90YWJs ZS5zY2xrX3RhYmxlLmRwbV9sZXZlbHMKKwkJCVtkYXRhLT5kcG1fdGFibGUuc2Nsa190YWJsZS5j b3VudF0uZW5hYmxlZCA9CisJCQkJCShpID09IDApID8gdHJ1ZSA6IGZhbHNlOworCQkJZGF0YS0+ ZHBtX3RhYmxlLnNjbGtfdGFibGUuY291bnQrKzsKKwkJfQorCX0KKworCS8qIEluaXRpYWxpemUg TWNsayBEUE0gdGFibGUgYmFzZWQgb24gYWxsb3cgTWNsayB2YWx1ZXMgKi8KKwlkYXRhLT5kcG1f dGFibGUubWNsa190YWJsZS5jb3VudCA9IDA7CisJZm9yIChpPTA7IGk8ZGVwX21jbGtfdGFibGUt PmNvdW50OyBpKyspIHsKKwkJaWYgKCBpPT0wIHx8IGRhdGEtPmRwbV90YWJsZS5tY2xrX3RhYmxl LmRwbV9sZXZlbHMKKwkJCQlbZGF0YS0+ZHBtX3RhYmxlLm1jbGtfdGFibGUuY291bnQgLSAxXS52 YWx1ZSAhPQorCQkJCQkJZGVwX21jbGtfdGFibGUtPmVudHJpZXNbaV0uY2xrKSB7CisJCQlkYXRh LT5kcG1fdGFibGUubWNsa190YWJsZS5kcG1fbGV2ZWxzCisJCQlbZGF0YS0+ZHBtX3RhYmxlLm1j bGtfdGFibGUuY291bnRdLnZhbHVlID0KKwkJCQkJZGVwX21jbGtfdGFibGUtPmVudHJpZXNbaV0u Y2xrOworCQkJZGF0YS0+ZHBtX3RhYmxlLm1jbGtfdGFibGUuZHBtX2xldmVscworCQkJW2RhdGEt PmRwbV90YWJsZS5tY2xrX3RhYmxlLmNvdW50XS5lbmFibGVkID0KKwkJCQkJKGkgPT0gMCkgPyB0 cnVlIDogZmFsc2U7CisJCQlkYXRhLT5kcG1fdGFibGUubWNsa190YWJsZS5jb3VudCsrOworCQl9 CisJfQorCisJLyogc2V0dXAgUENJRSBnZW4gc3BlZWQgbGV2ZWxzICovCisJZmlqaV9zZXR1cF9k ZWZhdWx0X3BjaWVfdGFibGUoaHdtZ3IpOworCisJLyogc2F2ZSBhIGNvcHkgb2YgdGhlIGRlZmF1 bHQgRFBNIHRhYmxlICovCisJbWVtY3B5KCYoZGF0YS0+Z29sZGVuX2RwbV90YWJsZSksICYoZGF0 YS0+ZHBtX3RhYmxlKSwKKwkJCXNpemVvZihzdHJ1Y3QgZmlqaV9kcG1fdGFibGUpKTsKKworCXJl dHVybiAwOworfQorCisvKioKKyAqIEBicmllZiBQaHdGaWppX0dldFZvbHRhZ2VPcmRlcgorICog IFJldHVybnMgaW5kZXggb2YgcmVxdWVzdGVkIHZvbHRhZ2UgcmVjb3JkIGluIGxvb2t1cCh0YWJs ZSkKKyAqIEBwYXJhbSBsb29rdXBfdGFibGUgLSBsb29rdXAgbGlzdCB0byBzZWFyY2ggaW4KKyAq IEBwYXJhbSB2b2x0YWdlIC0gdm9sdGFnZSB0byBsb29rIGZvcgorICogQHJldHVybiAwIG9uIHN1 Y2Nlc3MKKyAqLwordWludDhfdCBmaWppX2dldF92b2x0YWdlX2luZGV4KAorCQlzdHJ1Y3QgcGht X3BwdF92MV92b2x0YWdlX2xvb2t1cF90YWJsZSAqbG9va3VwX3RhYmxlLCB1aW50MTZfdCB2b2x0 YWdlKQoreworCXVpbnQ4X3QgY291bnQgPSAodWludDhfdCkgKGxvb2t1cF90YWJsZS0+Y291bnQp OworCXVpbnQ4X3QgaTsKKworCVBQX0FTU0VSVF9XSVRIX0NPREUoKE5VTEwgIT0gbG9va3VwX3Rh YmxlKSwKKwkJCSJMb29rdXAgVGFibGUgZW1wdHkuIiwgcmV0dXJuIDApOworCVBQX0FTU0VSVF9X SVRIX0NPREUoKDAgIT0gY291bnQpLAorCQkJIkxvb2t1cCBUYWJsZSBlbXB0eS4iLCByZXR1cm4g MCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbG9va3VwX3RhYmxlLT5jb3VudDsgaSsrKSB7CisJCS8q IGZpbmQgZmlyc3Qgdm9sdGFnZSBlcXVhbCBvciBiaWdnZXIgdGhhbiByZXF1ZXN0ZWQgKi8KKwkJ aWYgKGxvb2t1cF90YWJsZS0+ZW50cmllc1tpXS51c192ZGQgPj0gdm9sdGFnZSkKKwkJCXJldHVy biBpOworCX0KKwkvKiB2b2x0YWdlIGlzIGJpZ2dlciB0aGFuIG1heCB2b2x0YWdlIGluIHRoZSB0 YWJsZSAqLworCXJldHVybiBpIC0gMTsKK30KKworLyoqCisqIFByZXBhcmF0aW9uIG9mIHZkZGMg YW5kIHZkZGdmeCBDQUMgdGFibGVzIGZvciBTTUMuCisqCisqIEBwYXJhbSAgICBod21nciAgdGhl IGFkZHJlc3Mgb2YgdGhlIGhhcmR3YXJlIG1hbmFnZXIKKyogQHBhcmFtICAgIHRhYmxlICB0aGUg U01DIERQTSB0YWJsZSBzdHJ1Y3R1cmUgdG8gYmUgcG9wdWxhdGVkCisqIEByZXR1cm4gICBhbHdh eXMgMAorKi8KK3N0YXRpYyBpbnQgZmlqaV9wb3B1bGF0ZV9jYWNfdGFibGUoc3RydWN0IHBwX2h3 bWdyICpod21nciwKKwkJc3RydWN0IFNNVTczX0Rpc2NyZXRlX0RwbVRhYmxlICp0YWJsZSkKK3sK Kwl1aW50MzJfdCBjb3VudDsKKwl1aW50OF90IGluZGV4OworCWludCByZXN1bHQgPSAwOworCXN0 cnVjdCBmaWppX2h3bWdyICpkYXRhID0gKHN0cnVjdCBmaWppX2h3bWdyICopKGh3bWdyLT5iYWNr ZW5kKTsKKwlzdHJ1Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqdGFibGVfaW5mbyA9CisJCQko c3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKikoaHdtZ3ItPnBwdGFibGUpOworCXN0cnVj dCBwaG1fcHB0X3YxX3ZvbHRhZ2VfbG9va3VwX3RhYmxlICpsb29rdXBfdGFibGUgPQorCQkJdGFi bGVfaW5mby0+dmRkY19sb29rdXBfdGFibGU7CisJLyogdGFibGVzIGlzIGFscmVhZHkgc3dhcHBl ZCwgc28gaW4gb3JkZXIgdG8gdXNlIHRoZSB2YWx1ZSBmcm9tIGl0LAorCSAqIHdlIG5lZWQgdG8g c3dhcCBpdCBiYWNrLgorCSAqIFdlIGFyZSBwb3B1bGF0aW5nIHZkZGMgQ0FDIGRhdGEgdG8gQmFw bVZkZGMgdGFibGUKKwkgKiBpbiBzcGxpdCBhbmQgbWVyZ2VkIG1vZGUKKwkgKi8KKwlmb3IoIGNv dW50ID0gMDsgY291bnQ8bG9va3VwX3RhYmxlLT5jb3VudDsgY291bnQrKykgeworCQlpbmRleCA9 IGZpamlfZ2V0X3ZvbHRhZ2VfaW5kZXgobG9va3VwX3RhYmxlLAorCQkJCWRhdGEtPnZkZGNfdm9s dGFnZV90YWJsZS5lbnRyaWVzW2NvdW50XS52YWx1ZSk7CisJCXRhYmxlLT5CYXBtVmRkY1ZpZExv U2lkZFtjb3VudF0gPSAodWludDhfdCkgKCg2MjAwIC0KKwkJCQkobG9va3VwX3RhYmxlLT5lbnRy aWVzW2luZGV4XS51c19jYWNfbG93ICoKKwkJCQkJCVZPTFRBR0VfU0NBTEUpKSAvIDI1KTsKKwkJ dGFibGUtPkJhcG1WZGRjVmlkSGlTaWRkW2NvdW50XSA9ICh1aW50OF90KSAoKDYyMDAgLQorCQkJ CShsb29rdXBfdGFibGUtPmVudHJpZXNbaW5kZXhdLnVzX2NhY19oaWdoICoKKwkJCQkJCVZPTFRB R0VfU0NBTEUpKSAvIDI1KTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyogUHJl cGFyYXRpb24gb2Ygdm9sdGFnZSB0YWJsZXMgZm9yIFNNQy4KKyoKKyogQHBhcmFtICAgIGh3bWdy ICAgdGhlIGFkZHJlc3Mgb2YgdGhlIGhhcmR3YXJlIG1hbmFnZXIKKyogQHBhcmFtICAgIHRhYmxl ICAgdGhlIFNNQyBEUE0gdGFibGUgc3RydWN0dXJlIHRvIGJlIHBvcHVsYXRlZAorKiBAcmV0dXJu ICAgYWx3YXlzICAwCisqLworCitpbnQgZmlqaV9wb3B1bGF0ZV9zbWNfdm9sdGFnZV90YWJsZXMo c3RydWN0IHBwX2h3bWdyICpod21nciwKKwkJc3RydWN0IFNNVTczX0Rpc2NyZXRlX0RwbVRhYmxl ICp0YWJsZSkKK3sKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gZmlqaV9wb3B1bGF0ZV9jYWNf dGFibGUoaHdtZ3IsIHRhYmxlKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKDAgPT0gcmVzdWx0LAor CQkJImNhbiBub3QgcG9wdWxhdGUgQ0FDIHZvbHRhZ2UgdGFibGVzIHRvIFNNQyIsCisJCQlyZXR1 cm4gLUVJTlZBTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWppX3BvcHVsYXRl X3Vsdl9sZXZlbChzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLAorCQlzdHJ1Y3QgU01VNzNfRGlzY3Jl dGVfVWx2ICpzdGF0ZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgZmlqaV9od21nciAq ZGF0YSA9IChzdHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJc3RydWN0IHBo bV9wcHRfdjFfaW5mb3JtYXRpb24gKnRhYmxlX2luZm8gPQorCQkJKHN0cnVjdCBwaG1fcHB0X3Yx X2luZm9ybWF0aW9uICopKGh3bWdyLT5wcHRhYmxlKTsKKworCXN0YXRlLT5DY1B3ckR5blJtID0g MDsKKwlzdGF0ZS0+Q2NQd3JEeW5SbTEgPSAwOworCisJc3RhdGUtPlZkZGNPZmZzZXQgPSAodWlu dDE2X3QpIHRhYmxlX2luZm8tPnVzX3Vsdl92b2x0YWdlX29mZnNldDsKKwlzdGF0ZS0+VmRkY09m ZnNldFZpZCA9ICh1aW50OF90KSggdGFibGVfaW5mby0+dXNfdWx2X3ZvbHRhZ2Vfb2Zmc2V0ICoK KwkJCVZPTFRBR0VfVklEX09GRlNFVF9TQ0FMRTIgLyBWT0xUQUdFX1ZJRF9PRkZTRVRfU0NBTEUx ICk7CisKKwlzdGF0ZS0+VmRkY1BoYXNlID0gKGRhdGEtPnZkZGNfcGhhc2Vfc2hlZF9jb250cm9s KSA/IDAgOiAxOworCisJaWYgKCFyZXN1bHQpIHsKKwkJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01D X1VMKHN0YXRlLT5DY1B3ckR5blJtKTsKKwkJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VMKHN0 YXRlLT5DY1B3ckR5blJtMSk7CisJCUNPTlZFUlRfRlJPTV9IT1NUX1RPX1NNQ19VUyhzdGF0ZS0+ VmRkY09mZnNldCk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZmlqaV9w b3B1bGF0ZV91bHZfc3RhdGUoc3RydWN0IHBwX2h3bWdyICpod21nciwKKwkJc3RydWN0IFNNVTcz X0Rpc2NyZXRlX0RwbVRhYmxlICp0YWJsZSkKK3sKKwlyZXR1cm4gZmlqaV9wb3B1bGF0ZV91bHZf bGV2ZWwoaHdtZ3IsICZ0YWJsZS0+VWx2KTsKK30KKworc3RhdGljIGludDMyX3QgZmlqaV9nZXRf ZHBtX2xldmVsX2VuYWJsZV9tYXNrX3ZhbHVlKAorCQlzdHJ1Y3QgZmlqaV9zaW5nbGVfZHBtX3Rh YmxlKiBkcG1fdGFibGUpCit7CisJaW50MzJfdCBpOworCWludDMyX3QgbWFzayA9IDA7CisKKwlm b3IgKGkgPSBkcG1fdGFibGUtPmNvdW50OyBpID4gMDsgaS0tKSB7CisJCW1hc2sgPSBtYXNrIDw8 IDE7CisJCWlmIChkcG1fdGFibGUtPmRwbV9sZXZlbHNbaSAtIDFdLmVuYWJsZWQpCisJCQltYXNr IHw9IDB4MTsKKwkJZWxzZQorCQkJbWFzayAmPSAweEZGRkZGRkZFOworCX0KKwlyZXR1cm4gbWFz azsKK30KKworc3RhdGljIGludCBmaWppX3BvcHVsYXRlX3NtY19saW5rX2xldmVsKHN0cnVjdCBw cF9od21nciAqaHdtZ3IsCisJCXN0cnVjdCBTTVU3M19EaXNjcmV0ZV9EcG1UYWJsZSAqdGFibGUp Cit7CisJc3RydWN0IGZpamlfaHdtZ3IgKmRhdGEgPSAoc3RydWN0IGZpamlfaHdtZ3IgKikoaHdt Z3ItPmJhY2tlbmQpOworCXN0cnVjdCBmaWppX2RwbV90YWJsZSAqZHBtX3RhYmxlID0gJmRhdGEt PmRwbV90YWJsZTsKKwlpbnQgaTsKKworCS8qIEluZGV4IChkcG1fdGFibGUtPnBjaWVfc3BlZWRf dGFibGUuY291bnQpCisJICogaXMgcmVzZXJ2ZWQgZm9yIFBDSUUgYm9vdCBsZXZlbC4gKi8KKwlm b3IgKGkgPSAwOyBpIDw9IGRwbV90YWJsZS0+cGNpZV9zcGVlZF90YWJsZS5jb3VudDsgaSsrKSB7 CisJCXRhYmxlLT5MaW5rTGV2ZWxbaV0uUGNpZUdlblNwZWVkICA9CisJCQkJKHVpbnQ4X3QpZHBt X3RhYmxlLT5wY2llX3NwZWVkX3RhYmxlLmRwbV9sZXZlbHNbaV0udmFsdWU7CisJCXRhYmxlLT5M aW5rTGV2ZWxbaV0uUGNpZUxhbmVDb3VudCA9ICh1aW50OF90KWVuY29kZV9wY2llX2xhbmVfd2lk dGgoCisJCQkJZHBtX3RhYmxlLT5wY2llX3NwZWVkX3RhYmxlLmRwbV9sZXZlbHNbaV0ucGFyYW0x KTsKKwkJdGFibGUtPkxpbmtMZXZlbFtpXS5FbmFibGVkRm9yQWN0aXZpdHkgPSAxOworCQl0YWJs ZS0+TGlua0xldmVsW2ldLlNQQyA9ICh1aW50OF90KShkYXRhLT5wY2llX3NwY19jYXAgJiAweGZm KTsKKwkJdGFibGUtPkxpbmtMZXZlbFtpXS5Eb3duVGhyZXNob2xkID0gUFBfSE9TVF9UT19TTUNf VUwoNSk7CisJCXRhYmxlLT5MaW5rTGV2ZWxbaV0uVXBUaHJlc2hvbGQgPSBQUF9IT1NUX1RPX1NN Q19VTCgzMCk7CisJfQorCisJZGF0YS0+c21jX3N0YXRlX3RhYmxlLkxpbmtMZXZlbENvdW50ID0K KwkJCSh1aW50OF90KWRwbV90YWJsZS0+cGNpZV9zcGVlZF90YWJsZS5jb3VudDsKKwlkYXRhLT5k cG1fbGV2ZWxfZW5hYmxlX21hc2sucGNpZV9kcG1fZW5hYmxlX21hc2sgPQorCQkJZmlqaV9nZXRf ZHBtX2xldmVsX2VuYWJsZV9tYXNrX3ZhbHVlKCZkcG1fdGFibGUtPnBjaWVfc3BlZWRfdGFibGUp OworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorKiBDYWxjdWxhdGVzIHRoZSBTQ0xLIGRpdmlkZXJz IHVzaW5nIHRoZSBwcm92aWRlZCBlbmdpbmUgY2xvY2sKKyoKKyogQHBhcmFtICAgIGh3bWdyICB0 aGUgYWRkcmVzcyBvZiB0aGUgaGFyZHdhcmUgbWFuYWdlcgorKiBAcGFyYW0gICAgY2xvY2sgIHRo ZSBlbmdpbmUgY2xvY2sgdG8gdXNlIHRvIHBvcHVsYXRlIHRoZSBzdHJ1Y3R1cmUKKyogQHBhcmFt ICAgIHNjbGsgICB0aGUgU01DIFNDTEsgc3RydWN0dXJlIHRvIGJlIHBvcHVsYXRlZAorKi8KK3N0 YXRpYyBpbnQgZmlqaV9jYWxjdWxhdGVfc2Nsa19wYXJhbXMoc3RydWN0IHBwX2h3bWdyICpod21n ciwKKwkJdWludDMyX3QgY2xvY2ssIHN0cnVjdCBTTVU3M19EaXNjcmV0ZV9HcmFwaGljc0xldmVs ICpzY2xrKQoreworCWNvbnN0IHN0cnVjdCBmaWppX2h3bWdyICpkYXRhID0gKHN0cnVjdCBmaWpp X2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKwlzdHJ1Y3QgcHBfYXRvbWN0cmxfY2xvY2tfZGl2 aWRlcnNfdmkgZGl2aWRlcnM7CisJdWludDMyX3Qgc3BsbF9mdW5jX2NudGwgICAgICAgICAgICA9 IGRhdGEtPmNsb2NrX3JlZ2lzdGVycy52Q0dfU1BMTF9GVU5DX0NOVEw7CisJdWludDMyX3Qgc3Bs bF9mdW5jX2NudGxfMyAgICAgICAgICA9IGRhdGEtPmNsb2NrX3JlZ2lzdGVycy52Q0dfU1BMTF9G VU5DX0NOVExfMzsKKwl1aW50MzJfdCBzcGxsX2Z1bmNfY250bF80ICAgICAgICAgID0gZGF0YS0+ Y2xvY2tfcmVnaXN0ZXJzLnZDR19TUExMX0ZVTkNfQ05UTF80OworCXVpbnQzMl90IGNnX3NwbGxf c3ByZWFkX3NwZWN0cnVtICAgPSBkYXRhLT5jbG9ja19yZWdpc3RlcnMudkNHX1NQTExfU1BSRUFE X1NQRUNUUlVNOworCXVpbnQzMl90IGNnX3NwbGxfc3ByZWFkX3NwZWN0cnVtXzIgPSBkYXRhLT5j bG9ja19yZWdpc3RlcnMudkNHX1NQTExfU1BSRUFEX1NQRUNUUlVNXzI7CisJdWludDMyX3QgcmVm X2Nsb2NrOworCXVpbnQzMl90IHJlZl9kaXZpZGVyOworCXVpbnQzMl90IGZiZGl2OworCWludCBy ZXN1bHQ7CisKKwkvKiBnZXQgdGhlIGVuZ2luZSBjbG9jayBkaXZpZGVycyBmb3IgdGhpcyBjbG9j ayB2YWx1ZSAqLworCXJlc3VsdCA9IGF0b21jdHJsX2dldF9lbmdpbmVfcGxsX2RpdmlkZXJzX3Zp KGh3bWdyLCBjbG9jaywgICZkaXZpZGVycyk7CisKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKHJlc3Vs dCA9PSAwLAorCQkJIkVycm9yIHJldHJpZXZpbmcgRW5naW5lIENsb2NrIGRpdmlkZXJzIGZyb20g VkJJT1MuIiwKKwkJCXJldHVybiByZXN1bHQpOworCisJLyogVG8gZ2V0IEZCRElWIHdlIG5lZWQg dG8gbXVsdGlwbHkgdGhpcyBieSAxNjM4NCBhbmQgZGl2aWRlIGl0IGJ5IEZyZWYuICovCisJcmVm X2Nsb2NrID0gYXRvbWN0cmxfZ2V0X3JlZmVyZW5jZV9jbG9jayhod21ncik7CisJcmVmX2Rpdmlk ZXIgPSAxICsgZGl2aWRlcnMudWNfcGxsX3JlZl9kaXY7CisKKwkvKiBsb3cgMTQgYml0cyBpcyBm cmFjdGlvbiBhbmQgaGlnaCAxMiBiaXRzIGlzIGRpdmlkZXIgKi8KKwlmYmRpdiA9IGRpdmlkZXJz LnVsX2ZiX2Rpdi51bF9mYl9kaXZpZGVyICYgMHgzRkZGRkZGOworCisJLyogU1BMTF9GVU5DX0NO VEwgc2V0dXAgKi8KKwlzcGxsX2Z1bmNfY250bCA9IFBITV9TRVRfRklFTEQoc3BsbF9mdW5jX2Nu dGwsIENHX1NQTExfRlVOQ19DTlRMLAorCQkJU1BMTF9SRUZfRElWLCBkaXZpZGVycy51Y19wbGxf cmVmX2Rpdik7CisJc3BsbF9mdW5jX2NudGwgPSBQSE1fU0VUX0ZJRUxEKHNwbGxfZnVuY19jbnRs LCBDR19TUExMX0ZVTkNfQ05UTCwKKwkJCVNQTExfUERJVl9BLCAgZGl2aWRlcnMudWNfcGxsX3Bv c3RfZGl2KTsKKworCS8qIFNQTExfRlVOQ19DTlRMXzMgc2V0dXAqLworCXNwbGxfZnVuY19jbnRs XzMgPSBQSE1fU0VUX0ZJRUxEKHNwbGxfZnVuY19jbnRsXzMsIENHX1NQTExfRlVOQ19DTlRMXzMs CisJCQlTUExMX0ZCX0RJViwgZmJkaXYpOworCisJLyogc2V0IHRvIHVzZSBmcmFjdGlvbmFsIGFj Y3VtdWxhdGlvbiovCisJc3BsbF9mdW5jX2NudGxfMyA9IFBITV9TRVRfRklFTEQoc3BsbF9mdW5j X2NudGxfMywgQ0dfU1BMTF9GVU5DX0NOVExfMywKKwkJCVNQTExfRElUSEVOLCAxKTsKKworCWlm IChwaG1fY2FwX2VuYWJsZWQoaHdtZ3ItPnBsYXRmb3JtX2Rlc2NyaXB0b3IucGxhdGZvcm1DYXBz LAorCQkJCVBITV9QbGF0Zm9ybUNhcHNfRW5naW5lU3ByZWFkU3BlY3RydW1TdXBwb3J0KSkgewor CQlzdHJ1Y3QgcHBfYXRvbWN0cmxfaW50ZXJuYWxfc3NfaW5mbyBzc0luZm87CisKKwkJdWludDMy X3QgdmNvX2ZyZXEgPSBjbG9jayAqIGRpdmlkZXJzLnVjX3BsbF9wb3N0X2RpdjsKKwkJaWYgKCFh dG9tY3RybF9nZXRfZW5naW5lX2Nsb2NrX3NwcmVhZF9zcGVjdHJ1bShod21nciwKKwkJCQl2Y29f ZnJlcSwgJnNzSW5mbykpIHsKKwkJCS8qCisJCQkgKiBzc19pbmZvLnNwZWVkX3NwZWN0cnVtX3Bl cmNlbnRhZ2UgLS0gaW4gdW5pdCBvZiAwLjAxJQorCQkJICogc3NfaW5mby5zcGVlZF9zcGVjdHJ1 bV9yYXRlIC0tIGluIHVuaXQgb2Yga2h6CisJCQkgKgorCQkJICogY2xrcyA9IHJlZmVyZW5jZV9j bG9jayAqIDEwIC8gKFJFRkRJViArIDEpIC8gc3BlZWRfc3BlY3RydW1fcmF0ZSAvIDIKKwkJCSAq LworCQkJdWludDMyX3QgY2xrX3MgPSByZWZfY2xvY2sgKiA1IC8KKwkJCQkJKHJlZl9kaXZpZGVy ICogc3NJbmZvLnNwZWVkX3NwZWN0cnVtX3JhdGUpOworCQkJLyogY2xrdiA9IDIgKiBEICogZmJk aXYgLyBOUyAqLworCQkJdWludDMyX3QgY2xrX3YgPSA0ICogc3NJbmZvLnNwZWVkX3NwZWN0cnVt X3BlcmNlbnRhZ2UgKgorCQkJCQlmYmRpdiAvIChjbGtfcyAqIDEwMDAwKTsKKworCQkJY2dfc3Bs bF9zcHJlYWRfc3BlY3RydW0gPSBQSE1fU0VUX0ZJRUxEKGNnX3NwbGxfc3ByZWFkX3NwZWN0cnVt LAorCQkJCQlDR19TUExMX1NQUkVBRF9TUEVDVFJVTSwgQ0xLUywgY2xrX3MpOworCQkJY2dfc3Bs bF9zcHJlYWRfc3BlY3RydW0gPSBQSE1fU0VUX0ZJRUxEKGNnX3NwbGxfc3ByZWFkX3NwZWN0cnVt LAorCQkJCQlDR19TUExMX1NQUkVBRF9TUEVDVFJVTSwgU1NFTiwgMSk7CisJCQljZ19zcGxsX3Nw cmVhZF9zcGVjdHJ1bV8yID0gUEhNX1NFVF9GSUVMRChjZ19zcGxsX3NwcmVhZF9zcGVjdHJ1bV8y LAorCQkJCQlDR19TUExMX1NQUkVBRF9TUEVDVFJVTV8yLCBDTEtWLCBjbGtfdik7CisJCX0KKwl9 CisKKwlzY2xrLT5TY2xrRnJlcXVlbmN5ICAgICAgICA9IGNsb2NrOworCXNjbGstPkNnU3BsbEZ1 bmNDbnRsMyAgICAgID0gc3BsbF9mdW5jX2NudGxfMzsKKwlzY2xrLT5DZ1NwbGxGdW5jQ250bDQg ICAgICA9IHNwbGxfZnVuY19jbnRsXzQ7CisJc2Nsay0+U3BsbFNwcmVhZFNwZWN0cnVtICAgPSBj Z19zcGxsX3NwcmVhZF9zcGVjdHJ1bTsKKwlzY2xrLT5TcGxsU3ByZWFkU3BlY3RydW0yICA9IGNn X3NwbGxfc3ByZWFkX3NwZWN0cnVtXzI7CisJc2Nsay0+U2Nsa0RpZCAgICAgICAgICAgICAgPSAo dWludDhfdClkaXZpZGVycy5wbGxfcG9zdF9kaXZpZGVyOworCisJcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyB1aW50MTZfdCBmaWppX2ZpbmRfY2xvc2VzdF92ZGRjaShzdHJ1Y3QgcHBfaHdtZ3IgKmh3 bWdyLCB1aW50MTZfdCB2ZGRjaSkKK3sKKwl1aW50MzJfdCAgaTsKKwlzdHJ1Y3QgZmlqaV9od21n ciAqZGF0YSA9IChzdHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJc3RydWN0 IHBwX2F0b21jdHJsX3ZvbHRhZ2VfdGFibGUgKnZkZGNpX3RhYmxlID0KKwkJCSYoZGF0YS0+dmRk Y2lfdm9sdGFnZV90YWJsZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmRkY2lfdGFibGUtPmNvdW50 OyBpKyspIHsKKwkJaWYgKHZkZGNpX3RhYmxlLT5lbnRyaWVzW2ldLnZhbHVlID49IHZkZGNpKQor CQkJcmV0dXJuIHZkZGNpX3RhYmxlLT5lbnRyaWVzW2ldLnZhbHVlOworCX0KKworCVBQX0FTU0VS VF9XSVRIX0NPREUoZmFsc2UsCisJCQkiVkREQ0kgaXMgbGFyZ2VyIHRoYW4gbWF4IFZERENJIGlu IFZERENJIFZvbHRhZ2UgVGFibGUhIiwKKwkJCXJldHVybiB2ZGRjaV90YWJsZS0+ZW50cmllc1tp XS52YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgZmlqaV9nZXRfZGVwZW5kZW5jeV92b2x0X2J5X2Ns ayhzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLAorCQlzdHJ1Y3QgcGhtX3BwdF92MV9jbG9ja192b2x0 YWdlX2RlcGVuZGVuY3lfdGFibGUqIGRlcF90YWJsZSwKKwkJdWludDMyX3QgY2xvY2ssIFNNVV9W b2x0YWdlTGV2ZWwgKnZvbHRhZ2UsIHVpbnQzMl90ICptdmRkKQoreworCXVpbnQzMl90IGk7CisJ dWludDE2X3QgdmRkY2k7CisJc3RydWN0IGZpamlfaHdtZ3IgKmRhdGEgPSAoc3RydWN0IGZpamlf aHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCisJKnZvbHRhZ2UgPSAqbXZkZCA9IDA7CisKKwkv KiBjbG9jayAtIHZvbHRhZ2UgZGVwZW5kZW5jeSB0YWJsZSBpcyBlbXB0eSB0YWJsZSAqLworCWlm IChkZXBfdGFibGUtPmNvdW50ID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0g MDsgaSA8IGRlcF90YWJsZS0+Y291bnQ7IGkrKykgeworCQkvKiBmaW5kIGZpcnN0IHNjbGsgYmln Z2VyIHRoYW4gcmVxdWVzdCAqLworCQlpZiAoZGVwX3RhYmxlLT5lbnRyaWVzW2ldLmNsayA+PSBj bG9jaykgeworCQkJKnZvbHRhZ2UgfD0gKGRlcF90YWJsZS0+ZW50cmllc1tpXS52ZGRjICoKKwkJ CQkJVk9MVEFHRV9TQ0FMRSkgPDwgVkREQ19TSElGVDsKKwkJCWlmIChGSUpJX1ZPTFRBR0VfQ09O VFJPTF9OT05FID09IGRhdGEtPnZkZGNpX2NvbnRyb2wpCisJCQkJKnZvbHRhZ2UgfD0gKGRhdGEt PnZiaW9zX2Jvb3Rfc3RhdGUudmRkY2lfYm9vdHVwX3ZhbHVlICoKKwkJCQkJCVZPTFRBR0VfU0NB TEUpIDw8IFZERENJX1NISUZUOworCQkJZWxzZSBpZiAoZGVwX3RhYmxlLT5lbnRyaWVzW2ldLnZk ZGNpKQorCQkJCSp2b2x0YWdlIHw9IChkZXBfdGFibGUtPmVudHJpZXNbaV0udmRkY2kgKgorCQkJ CQkJVk9MVEFHRV9TQ0FMRSkgPDwgVkREQ0lfU0hJRlQ7CisJCQllbHNlIHsKKwkJCQl2ZGRjaSA9 IGZpamlfZmluZF9jbG9zZXN0X3ZkZGNpKGh3bWdyLAorCQkJCQkJKGRlcF90YWJsZS0+ZW50cmll c1tpXS52ZGRjIC0KKwkJCQkJCQkJKHVpbnQxNl90KWRhdGEtPnZkZGNfdmRkY2lfZGVsdGEpKTsK KwkJCQkqdm9sdGFnZSB8PSAodmRkY2kgKiBWT0xUQUdFX1NDQUxFKSA8PAlWRERDSV9TSElGVDsK KwkJCX0KKworCQkJaWYgKEZJSklfVk9MVEFHRV9DT05UUk9MX05PTkUgPT0gZGF0YS0+bXZkZF9j b250cm9sKQorCQkJCSptdmRkID0gZGF0YS0+dmJpb3NfYm9vdF9zdGF0ZS5tdmRkX2Jvb3R1cF92 YWx1ZSAqCisJCQkJCVZPTFRBR0VfU0NBTEU7CisJCQllbHNlIGlmIChkZXBfdGFibGUtPmVudHJp ZXNbaV0ubXZkZCkKKwkJCQkqbXZkZCA9ICh1aW50MzJfdCkgZGVwX3RhYmxlLT5lbnRyaWVzW2ld Lm12ZGQgKgorCQkJCQlWT0xUQUdFX1NDQUxFOworCisJCQkqdm9sdGFnZSB8PSAxIDw8IFBIQVNF U19TSElGVDsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogc2NsayBpcyBiaWdnZXIgdGhh biBtYXggc2NsayBpbiB0aGUgZGVwZW5kZW5jZSB0YWJsZSAqLworCSp2b2x0YWdlIHw9IChkZXBf dGFibGUtPmVudHJpZXNbaSAtIDFdLnZkZGMgKiBWT0xUQUdFX1NDQUxFKSA8PCBWRERDX1NISUZU OworCisJaWYgKEZJSklfVk9MVEFHRV9DT05UUk9MX05PTkUgPT0gZGF0YS0+dmRkY2lfY29udHJv bCkKKwkJKnZvbHRhZ2UgfD0gKGRhdGEtPnZiaW9zX2Jvb3Rfc3RhdGUudmRkY2lfYm9vdHVwX3Zh bHVlICoKKwkJCQlWT0xUQUdFX1NDQUxFKSA8PCBWRERDSV9TSElGVDsKKwllbHNlIGlmIChkZXBf dGFibGUtPmVudHJpZXNbaS0xXS52ZGRjaSkgeworCQl2ZGRjaSA9IGZpamlfZmluZF9jbG9zZXN0 X3ZkZGNpKGh3bWdyLAorCQkJCShkZXBfdGFibGUtPmVudHJpZXNbaV0udmRkYyAtCisJCQkJCQko dWludDE2X3QpZGF0YS0+dmRkY192ZGRjaV9kZWx0YSkpOworCQkqdm9sdGFnZSB8PSAodmRkY2kg KiBWT0xUQUdFX1NDQUxFKSA8PCBWRERDSV9TSElGVDsKKwl9CisKKwlpZiAoRklKSV9WT0xUQUdF X0NPTlRST0xfTk9ORSA9PSBkYXRhLT5tdmRkX2NvbnRyb2wpCisJCSptdmRkID0gZGF0YS0+dmJp b3NfYm9vdF9zdGF0ZS5tdmRkX2Jvb3R1cF92YWx1ZSAqIFZPTFRBR0VfU0NBTEU7CisJZWxzZSBp ZiAoZGVwX3RhYmxlLT5lbnRyaWVzW2ldLm12ZGQpCisJCSptdmRkID0gKHVpbnQzMl90KSBkZXBf dGFibGUtPmVudHJpZXNbaSAtIDFdLm12ZGQgKiBWT0xUQUdFX1NDQUxFOworCisJcmV0dXJuIDA7 Cit9CisvKioKKyogUG9wdWxhdGVzIHNpbmdsZSBTTUMgU0NMSyBzdHJ1Y3R1cmUgdXNpbmcgdGhl IHByb3ZpZGVkIGVuZ2luZSBjbG9jaworKgorKiBAcGFyYW0gICAgaHdtZ3IgICAgICB0aGUgYWRk cmVzcyBvZiB0aGUgaGFyZHdhcmUgbWFuYWdlcgorKiBAcGFyYW0gICAgY2xvY2sgdGhlIGVuZ2lu ZSBjbG9jayB0byB1c2UgdG8gcG9wdWxhdGUgdGhlIHN0cnVjdHVyZQorKiBAcGFyYW0gICAgc2Ns ayAgICAgICAgdGhlIFNNQyBTQ0xLIHN0cnVjdHVyZSB0byBiZSBwb3B1bGF0ZWQKKyovCisKK3N0 YXRpYyBpbnQgZmlqaV9wb3B1bGF0ZV9zaW5nbGVfZ3JhcGhpY19sZXZlbChzdHJ1Y3QgcHBfaHdt Z3IgKmh3bWdyLAorCQl1aW50MzJfdCBjbG9jaywgdWludDE2X3Qgc2Nsa19hbF90aHJlc2hvbGQs CisJCXN0cnVjdCBTTVU3M19EaXNjcmV0ZV9HcmFwaGljc0xldmVsICpsZXZlbCkKK3sKKwlpbnQg cmVzdWx0OworCS8qIFBQX0Nsb2NrcyBtaW5DbG9ja3M7ICovCisJdWludDMyX3QgdGhyZXNob2xk LCBtdmRkOworCXN0cnVjdCBmaWppX2h3bWdyICpkYXRhID0gKHN0cnVjdCBmaWppX2h3bWdyICop KGh3bWdyLT5iYWNrZW5kKTsKKwlzdHJ1Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqdGFibGVf aW5mbyA9CisJCQkoc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKikoaHdtZ3ItPnBwdGFi bGUpOworCisJcmVzdWx0ID0gZmlqaV9jYWxjdWxhdGVfc2Nsa19wYXJhbXMoaHdtZ3IsIGNsb2Nr LCBsZXZlbCk7CisKKwkvKiBwb3B1bGF0ZSBncmFwaGljcyBsZXZlbHMgKi8KKwlyZXN1bHQgPSBm aWppX2dldF9kZXBlbmRlbmN5X3ZvbHRfYnlfY2xrKGh3bWdyLAorCQkJdGFibGVfaW5mby0+dmRk X2RlcF9vbl9zY2xrLCBjbG9jaywKKwkJCSZsZXZlbC0+TWluVm9sdGFnZSwgJm12ZGQpOworCVBQ X0FTU0VSVF9XSVRIX0NPREUoKDAgPT0gcmVzdWx0KSwKKwkJCSJjYW4gbm90IGZpbmQgVkREQyB2 b2x0YWdlIHZhbHVlIGZvciAiCisJCQkiVkREQyBlbmdpbmUgY2xvY2sgZGVwZW5kZW5jeSB0YWJs ZSIsCisJCQlyZXR1cm4gcmVzdWx0KTsKKworCWxldmVsLT5TY2xrRnJlcXVlbmN5ID0gY2xvY2s7 CisJbGV2ZWwtPkFjdGl2aXR5TGV2ZWwgPSBzY2xrX2FsX3RocmVzaG9sZDsKKwlsZXZlbC0+Q2NQ d3JEeW5SbSA9IDA7CisJbGV2ZWwtPkNjUHdyRHluUm0xID0gMDsKKwlsZXZlbC0+RW5hYmxlZEZv ckFjdGl2aXR5ID0gMDsKKwlsZXZlbC0+RW5hYmxlZEZvclRocm90dGxlID0gMTsKKwlsZXZlbC0+ VXBIeXN0ID0gMTA7CisJbGV2ZWwtPkRvd25IeXN0ID0gMDsKKwlsZXZlbC0+Vm9sdGFnZURvd25I eXN0ID0gMDsKKwlsZXZlbC0+UG93ZXJUaHJvdHRsZSA9IDA7CisKKwl0aHJlc2hvbGQgPSBjbG9j ayAqIGRhdGEtPmZhc3Rfd2F0ZXJtYXJrX3RocmVzaG9sZCAvIDEwMDsKKworICAgIC8qCisgICAg ICogVE9ETzogZ2V0IG1pbmltdW0gY2xvY2tzIGZyb20gZGFsIGNvbmZpZ2FyYXRpb24KKyAgICAg KiBQRUNJX0dldE1pbkNsb2NrU2V0dGluZ3MoaHdtZ3ItPnBQRUNJLCAmbWluQ2xvY2tzKTsKKyAg ICAgKi8KKyAgICAvKiBkYXRhLT5EaXNwbGF5VGltaW5nLm1pbkNsb2NrSW5TUiA9IG1pbkNsb2Nr cy5lbmdpbmVDbG9ja0luU1I7ICovCisKKyAgICAvKiBnZXQgbGV2ZWwtPkRlZXBTbGVlcERpdklk CisgICAgaWYgKHBobV9jYXBfZW5hYmxlZChod21nci0+cGxhdGZvcm1EZXNjcmlwdG9yLnBsYXRm b3JtQ2FwcywgUEhNX1BsYXRmb3JtQ2Fwc19TY2xrRGVlcFNsZWVwKSkKKyAgICB7CisgICAgICAg IGxldmVsLT5EZWVwU2xlZXBEaXZJZCA9IFBod0ZpamlfR2V0U2xlZXBEaXZpZGVySWRGcm9tQ2xv Y2soaHdtZ3IsIGNsb2NrLCBtaW5DbG9ja3MuZW5naW5lQ2xvY2tJblNSKTsKKyAgICB9ICovCisK KwkvKiBEZWZhdWx0IHRvIHNsb3csIGhpZ2hlc3QgRFBNIGxldmVsIHdpbGwgYmUKKwkgKiBzZXQg dG8gUFBTTUNfRElTUExBWV9XQVRFUk1BUktfTE9XIGxhdGVyLgorCSAqLworCWxldmVsLT5EaXNw bGF5V2F0ZXJtYXJrID0gUFBTTUNfRElTUExBWV9XQVRFUk1BUktfTE9XOworCisJQ09OVkVSVF9G Uk9NX0hPU1RfVE9fU01DX1VMKGxldmVsLT5NaW5Wb2x0YWdlKTsKKwlDT05WRVJUX0ZST01fSE9T VF9UT19TTUNfVUwobGV2ZWwtPlNjbGtGcmVxdWVuY3kpOworCUNPTlZFUlRfRlJPTV9IT1NUX1RP X1NNQ19VUyhsZXZlbC0+QWN0aXZpdHlMZXZlbCk7CisJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01D X1VMKGxldmVsLT5DZ1NwbGxGdW5jQ250bDMpOworCUNPTlZFUlRfRlJPTV9IT1NUX1RPX1NNQ19V TChsZXZlbC0+Q2dTcGxsRnVuY0NudGw0KTsKKwlDT05WRVJUX0ZST01fSE9TVF9UT19TTUNfVUwo bGV2ZWwtPlNwbGxTcHJlYWRTcGVjdHJ1bSk7CisJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VM KGxldmVsLT5TcGxsU3ByZWFkU3BlY3RydW0yKTsKKwlDT05WRVJUX0ZST01fSE9TVF9UT19TTUNf VUwobGV2ZWwtPkNjUHdyRHluUm0pOworCUNPTlZFUlRfRlJPTV9IT1NUX1RPX1NNQ19VTChsZXZl bC0+Q2NQd3JEeW5SbTEpOworCisJcmV0dXJuIDA7Cit9CisvKioKKyogUG9wdWxhdGVzIGFsbCBT TUMgU0NMSyBsZXZlbHMnIHN0cnVjdHVyZSBiYXNlZCBvbiB0aGUgdHJpbW1lZCBhbGxvd2VkIGRw bSBlbmdpbmUgY2xvY2sgc3RhdGVzCisqCisqIEBwYXJhbSAgICBod21nciAgICAgIHRoZSBhZGRy ZXNzIG9mIHRoZSBoYXJkd2FyZSBtYW5hZ2VyCisqLworc3RhdGljIGludCBmaWppX3BvcHVsYXRl X2FsbF9ncmFwaGljX2xldmVscyhzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCXN0cnVjdCBm aWppX2h3bWdyICpkYXRhID0gKHN0cnVjdCBmaWppX2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsK KwlzdHJ1Y3QgZmlqaV9kcG1fdGFibGUgKmRwbV90YWJsZSA9ICZkYXRhLT5kcG1fdGFibGU7CisJ c3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKnRhYmxlX2luZm8gPQorCQkJKHN0cnVjdCBw aG1fcHB0X3YxX2luZm9ybWF0aW9uICopKGh3bWdyLT5wcHRhYmxlKTsKKwlzdHJ1Y3QgcGhtX3Bw dF92MV9wY2llX3RhYmxlICpwY2llX3RhYmxlID0gdGFibGVfaW5mby0+cGNpZV90YWJsZTsKKwl1 aW50OF90IHBjaWVfZW50cnlfY250ID0gKHVpbnQ4X3QpIGRhdGEtPmRwbV90YWJsZS5wY2llX3Nw ZWVkX3RhYmxlLmNvdW50OworCWludCByZXN1bHQgPSAwOworCXVpbnQzMl90IGFycmF5ID0gZGF0 YS0+ZHBtX3RhYmxlX3N0YXJ0ICsKKwkJCW9mZnNldG9mKFNNVTczX0Rpc2NyZXRlX0RwbVRhYmxl LCBHcmFwaGljc0xldmVsKTsKKwl1aW50MzJfdCBhcnJheV9zaXplID0gc2l6ZW9mKHN0cnVjdCBT TVU3M19EaXNjcmV0ZV9HcmFwaGljc0xldmVsKSAqCisJCQlTTVU3M19NQVhfTEVWRUxTX0dSQVBI SUNTOworCXN0cnVjdCBTTVU3M19EaXNjcmV0ZV9HcmFwaGljc0xldmVsICpsZXZlbHMgPQorCQkJ ZGF0YS0+c21jX3N0YXRlX3RhYmxlLkdyYXBoaWNzTGV2ZWw7CisJdWludDMyX3QgaSwgbWF4X2Vu dHJ5OworCXVpbnQ4X3QgaGlnaHRlc3RfcGNpZV9sZXZlbF9lbmFibGVkID0gMCwKKwkJCWxvd2Vz dF9wY2llX2xldmVsX2VuYWJsZWQgPSAwLAorCQkJbWlkX3BjaWVfbGV2ZWxfZW5hYmxlZCA9IDAs CisJCQljb3VudCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgZHBtX3RhYmxlLT5zY2xrX3RhYmxl LmNvdW50OyBpKyspIHsKKwkJcmVzdWx0ID0gZmlqaV9wb3B1bGF0ZV9zaW5nbGVfZ3JhcGhpY19s ZXZlbChod21nciwKKwkJCQlkcG1fdGFibGUtPnNjbGtfdGFibGUuZHBtX2xldmVsc1tpXS52YWx1 ZSwKKwkJCQkodWludDE2X3QpZGF0YS0+YWN0aXZpdHlfdGFyZ2V0W2ldLAorCQkJCSZsZXZlbHNb aV0pOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKworCQkvKiBNYWtpbmcgc3Vy ZSBvbmx5IERQTSBsZXZlbCAwLTEgaGF2ZSBEZWVwIFNsZWVwIERpdiBJRCBwb3B1bGF0ZWQuICov CisJCWlmIChpID4gMSkKKwkJCWxldmVsc1tpXS5EZWVwU2xlZXBEaXZJZCA9IDA7CisJfQorCisJ LyogT25seSBlbmFibGUgbGV2ZWwgMCBmb3Igbm93LiovCisJbGV2ZWxzWzBdLkVuYWJsZWRGb3JB Y3Rpdml0eSA9IDE7CisKKwkvKiBzZXQgaGlnaGVzdCBsZXZlbCB3YXRlcm1hcmsgdG8gaGlnaCAq LworCWxldmVsc1tkcG1fdGFibGUtPnNjbGtfdGFibGUuY291bnQgLSAxXS5EaXNwbGF5V2F0ZXJt YXJrID0KKwkJCVBQU01DX0RJU1BMQVlfV0FURVJNQVJLX0hJR0g7CisKKwlkYXRhLT5zbWNfc3Rh dGVfdGFibGUuR3JhcGhpY3NEcG1MZXZlbENvdW50ID0KKwkJCSh1aW50OF90KWRwbV90YWJsZS0+ c2Nsa190YWJsZS5jb3VudDsKKwlkYXRhLT5kcG1fbGV2ZWxfZW5hYmxlX21hc2suc2Nsa19kcG1f ZW5hYmxlX21hc2sgPQorCQkJZmlqaV9nZXRfZHBtX2xldmVsX2VuYWJsZV9tYXNrX3ZhbHVlKCZk cG1fdGFibGUtPnNjbGtfdGFibGUpOworCisJaWYgKHBjaWVfdGFibGUgIT0gTlVMTCkgeworCQlQ UF9BU1NFUlRfV0lUSF9DT0RFKCgxIDw9IHBjaWVfZW50cnlfY250KSwKKwkJCQkiVGhlcmUgbXVz dCBiZSAxIG9yIG1vcmUgUENJRSBsZXZlbHMgZGVmaW5lZCBpbiBQUFRhYmxlLiIsCisJCQkJcmV0 dXJuIC1FSU5WQUwpOworCQltYXhfZW50cnkgPSBwY2llX2VudHJ5X2NudCAtIDE7CisJCWZvciAo aSA9IDA7IGkgPCBkcG1fdGFibGUtPnNjbGtfdGFibGUuY291bnQ7IGkrKykKKwkJCWxldmVsc1tp XS5wY2llRHBtTGV2ZWwgPQorCQkJCQkodWludDhfdCkgKChpIDwgbWF4X2VudHJ5KT8gaSA6IG1h eF9lbnRyeSk7CisJfSBlbHNlIHsKKwkJd2hpbGUgKGRhdGEtPmRwbV9sZXZlbF9lbmFibGVfbWFz ay5wY2llX2RwbV9lbmFibGVfbWFzayAmJgorCQkJCSgoZGF0YS0+ZHBtX2xldmVsX2VuYWJsZV9t YXNrLnBjaWVfZHBtX2VuYWJsZV9tYXNrICYKKwkJCQkJCSgxIDw8IChoaWdodGVzdF9wY2llX2xl dmVsX2VuYWJsZWQgKyAxKSkpICE9IDAgKSkKKwkJCWhpZ2h0ZXN0X3BjaWVfbGV2ZWxfZW5hYmxl ZCsrOworCisJCXdoaWxlIChkYXRhLT5kcG1fbGV2ZWxfZW5hYmxlX21hc2sucGNpZV9kcG1fZW5h YmxlX21hc2sgJiYKKwkJCQkoKGRhdGEtPmRwbV9sZXZlbF9lbmFibGVfbWFzay5wY2llX2RwbV9l bmFibGVfbWFzayAmCisJCQkJCQkoMSA8PCBsb3dlc3RfcGNpZV9sZXZlbF9lbmFibGVkKSkgPT0g MCApKQorCQkJbG93ZXN0X3BjaWVfbGV2ZWxfZW5hYmxlZCsrOworCisJCXdoaWxlICgoY291bnQg PCBoaWdodGVzdF9wY2llX2xldmVsX2VuYWJsZWQpICYmCisJCQkJKChkYXRhLT5kcG1fbGV2ZWxf ZW5hYmxlX21hc2sucGNpZV9kcG1fZW5hYmxlX21hc2sgJgorCQkJCQkJKDEgPDwgKGxvd2VzdF9w Y2llX2xldmVsX2VuYWJsZWQgKyAxICsgY291bnQpKSkgPT0gMCApKQorCQkJY291bnQrKzsKKwor CQltaWRfcGNpZV9sZXZlbF9lbmFibGVkID0gKGxvd2VzdF9wY2llX2xldmVsX2VuYWJsZWQgKyAx KyBjb3VudCkgPAorCQkJCWhpZ2h0ZXN0X3BjaWVfbGV2ZWxfZW5hYmxlZD8KKwkJCQkJCShsb3dl c3RfcGNpZV9sZXZlbF9lbmFibGVkICsgMSArIGNvdW50KSA6CisJCQkJCQloaWdodGVzdF9wY2ll X2xldmVsX2VuYWJsZWQ7CisKKwkJLyogc2V0IHBjaWVEcG1MZXZlbCB0byBoaWdodGVzdF9wY2ll X2xldmVsX2VuYWJsZWQgKi8KKwkJZm9yKGkgPSAyOyBpIDwgZHBtX3RhYmxlLT5zY2xrX3RhYmxl LmNvdW50OyBpKyspCisJCQlsZXZlbHNbaV0ucGNpZURwbUxldmVsID0gaGlnaHRlc3RfcGNpZV9s ZXZlbF9lbmFibGVkOworCisJCS8qIHNldCBwY2llRHBtTGV2ZWwgdG8gbG93ZXN0X3BjaWVfbGV2 ZWxfZW5hYmxlZCAqLworCQlsZXZlbHNbMF0ucGNpZURwbUxldmVsID0gbG93ZXN0X3BjaWVfbGV2 ZWxfZW5hYmxlZDsKKworCQkvKiBzZXQgcGNpZURwbUxldmVsIHRvIG1pZF9wY2llX2xldmVsX2Vu YWJsZWQgKi8KKwkJbGV2ZWxzWzFdLnBjaWVEcG1MZXZlbCA9IG1pZF9wY2llX2xldmVsX2VuYWJs ZWQ7CisJfQorCS8qIGxldmVsIGNvdW50IHdpbGwgc2VuZCB0byBzbWMgb25jZSBhdCBpbml0IHNt YyB0YWJsZSBhbmQgbmV2ZXIgY2hhbmdlICovCisJcmVzdWx0ID0gZmlqaV9jb3B5X2J5dGVzX3Rv X3NtYyhod21nci0+c211bWdyLCBhcnJheSwgKHVpbnQ4X3QgKilsZXZlbHMsCisJCQkodWludDMy X3QpYXJyYXlfc2l6ZSwgZGF0YS0+c3JhbV9lbmQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKwor LyoqCisgKiBNQ0xLIEZyZXF1ZW5jeSBSYXRpbworICogU0VRX0NHX1JFU1AgIEJpdFszMToyNF0g LSAweDAKKyAqIEJpdFsyNzoyNF0gXDk2IEREUjMgRnJlcXVlbmN5IHJhdGlvCisgKiAweDAgPD0g MTAwTUh6LCAgICAgICA0NTAgPCAweDggPD0gNTAwTUh6CisgKiAxMDAgPCAweDEgPD0gMTUwTUh6 LCAgICAgICA1MDAgPCAweDkgPD0gNTUwTUh6CisgKiAxNTAgPCAweDIgPD0gMjAwTUh6LCAgICAg ICA1NTAgPCAweEEgPD0gNjAwTUh6CisgKiAyMDAgPCAweDMgPD0gMjUwTUh6LCAgICAgICA2MDAg PCAweEIgPD0gNjUwTUh6CisgKiAyNTAgPCAweDQgPD0gMzAwTUh6LCAgICAgICA2NTAgPCAweEMg PD0gNzAwTUh6CisgKiAzMDAgPCAweDUgPD0gMzUwTUh6LCAgICAgICA3MDAgPCAweEQgPD0gNzUw TUh6CisgKiAzNTAgPCAweDYgPD0gNDAwTUh6LCAgICAgICA3NTAgPCAweEUgPD0gODAwTUh6Cisg KiA0MDAgPCAweDcgPD0gNDUwTUh6LCAgICAgICA4MDAgPCAweEYKKyAqLworc3RhdGljIHVpbnQ4 X3QgZmlqaV9nZXRfbWNsa19mcmVxdWVuY3lfcmF0aW8odWludDMyX3QgbWVtX2Nsb2NrKQorewor CWlmIChtZW1fY2xvY2sgPD0gMTAwMDApIHJldHVybiAweDA7CisJaWYgKG1lbV9jbG9jayA8PSAx NTAwMCkgcmV0dXJuIDB4MTsKKwlpZiAobWVtX2Nsb2NrIDw9IDIwMDAwKSByZXR1cm4gMHgyOwor CWlmIChtZW1fY2xvY2sgPD0gMjUwMDApIHJldHVybiAweDM7CisJaWYgKG1lbV9jbG9jayA8PSAz MDAwMCkgcmV0dXJuIDB4NDsKKwlpZiAobWVtX2Nsb2NrIDw9IDM1MDAwKSByZXR1cm4gMHg1Owor CWlmIChtZW1fY2xvY2sgPD0gNDAwMDApIHJldHVybiAweDY7CisJaWYgKG1lbV9jbG9jayA8PSA0 NTAwMCkgcmV0dXJuIDB4NzsKKwlpZiAobWVtX2Nsb2NrIDw9IDUwMDAwKSByZXR1cm4gMHg4Owor CWlmIChtZW1fY2xvY2sgPD0gNTUwMDApIHJldHVybiAweDk7CisJaWYgKG1lbV9jbG9jayA8PSA2 MDAwMCkgcmV0dXJuIDB4YTsKKwlpZiAobWVtX2Nsb2NrIDw9IDY1MDAwKSByZXR1cm4gMHhiOwor CWlmIChtZW1fY2xvY2sgPD0gNzAwMDApIHJldHVybiAweGM7CisJaWYgKG1lbV9jbG9jayA8PSA3 NTAwMCkgcmV0dXJuIDB4ZDsKKwlpZiAobWVtX2Nsb2NrIDw9IDgwMDAwKSByZXR1cm4gMHhlOwor CS8qIG1lbV9jbG9jayA+IDgwME1IeiAqLworCXJldHVybiAweGY7Cit9CisKKy8qKgorKiBQb3B1 bGF0ZXMgdGhlIFNNQyBNQ0xLIHN0cnVjdHVyZSB1c2luZyB0aGUgcHJvdmlkZWQgbWVtb3J5IGNs b2NrCisqCisqIEBwYXJhbSAgICBod21nciAgIHRoZSBhZGRyZXNzIG9mIHRoZSBoYXJkd2FyZSBt YW5hZ2VyCisqIEBwYXJhbSAgICBjbG9jayAgIHRoZSBtZW1vcnkgY2xvY2sgdG8gdXNlIHRvIHBv cHVsYXRlIHRoZSBzdHJ1Y3R1cmUKKyogQHBhcmFtICAgIHNjbGsgICAgdGhlIFNNQyBTQ0xLIHN0 cnVjdHVyZSB0byBiZSBwb3B1bGF0ZWQKKyovCitzdGF0aWMgaW50IGZpamlfY2FsY3VsYXRlX21j bGtfcGFyYW1zKHN0cnVjdCBwcF9od21nciAqaHdtZ3IsCisgICAgdWludDMyX3QgY2xvY2ssIHN0 cnVjdCBTTVU3M19EaXNjcmV0ZV9NZW1vcnlMZXZlbCAqbWNsaykKK3sKKwlzdHJ1Y3QgcHBfYXRv bWN0cmxfbWVtb3J5X2Nsb2NrX3BhcmFtIG1lbV9wYXJhbTsKKwlpbnQgcmVzdWx0OworCisJcmVz dWx0ID0gYXRvbWN0cmxfZ2V0X21lbW9yeV9wbGxfZGl2aWRlcnNfdmkoaHdtZ3IsIGNsb2NrLCAm bWVtX3BhcmFtKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09IHJlc3VsdCksCisJCQkiRmFp bGVkIHRvIGdldCBNZW1vcnkgUExMIERpdmlkZXJzLiIsKTsKKworCS8qIFNhdmUgdGhlIHJlc3Vs dCBkYXRhIHRvIG91dHB1cHQgbWVtb3J5IGxldmVsIHN0cnVjdHVyZSAqLworCW1jbGstPk1jbGtG cmVxdWVuY3kgICA9IGNsb2NrOworCW1jbGstPk1jbGtEaXZpZGVyICAgICA9ICh1aW50OF90KW1l bV9wYXJhbS5tcGxsX3Bvc3RfZGl2aWRlcjsKKwltY2xrLT5GcmVxUmFuZ2UgICAgICAgPSBmaWpp X2dldF9tY2xrX2ZyZXF1ZW5jeV9yYXRpbyhjbG9jayk7CisKKwlyZXR1cm4gcmVzdWx0OworfQor CitzdGF0aWMgaW50IGZpamlfcG9wdWxhdGVfc2luZ2xlX21lbW9yeV9sZXZlbChzdHJ1Y3QgcHBf aHdtZ3IgKmh3bWdyLAorCQl1aW50MzJfdCBjbG9jaywgc3RydWN0IFNNVTczX0Rpc2NyZXRlX01l bW9yeUxldmVsICptZW1fbGV2ZWwpCit7CisJc3RydWN0IGZpamlfaHdtZ3IgKmRhdGEgPSAoc3Ry dWN0IGZpamlfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXN0cnVjdCBwaG1fcHB0X3YxX2lu Zm9ybWF0aW9uICp0YWJsZV9pbmZvID0KKwkJCShzdHJ1Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlv biAqKShod21nci0+cHB0YWJsZSk7CisJaW50IHJlc3VsdCA9IDA7CisKKwlpZiAodGFibGVfaW5m by0+dmRkX2RlcF9vbl9tY2xrKSB7CisJCXJlc3VsdCA9IGZpamlfZ2V0X2RlcGVuZGVuY3lfdm9s dF9ieV9jbGsoaHdtZ3IsCisJCQkJdGFibGVfaW5mby0+dmRkX2RlcF9vbl9tY2xrLCBjbG9jaywK KwkJCQkmbWVtX2xldmVsLT5NaW5Wb2x0YWdlLCAmbWVtX2xldmVsLT5NaW5NdmRkKTsKKwkJUFBf QVNTRVJUX1dJVEhfQ09ERSgoMCA9PSByZXN1bHQpLAorCQkJCSJjYW4gbm90IGZpbmQgTWluVmRk YyB2b2x0YWdlIHZhbHVlIGZyb20gbWVtb3J5ICIKKwkJCQkiVkREQyB2b2x0YWdlIGRlcGVuZGVu Y3kgdGFibGUiLCByZXR1cm4gcmVzdWx0KTsKKwl9CisKKwltZW1fbGV2ZWwtPkVuYWJsZWRGb3JU aHJvdHRsZSA9IDE7CisJbWVtX2xldmVsLT5FbmFibGVkRm9yQWN0aXZpdHkgPSAwOworCW1lbV9s ZXZlbC0+VXBIeXN0ID0gMDsKKwltZW1fbGV2ZWwtPkRvd25IeXN0ID0gMTAwOworCW1lbV9sZXZl bC0+Vm9sdGFnZURvd25IeXN0ID0gMDsKKwltZW1fbGV2ZWwtPkFjdGl2aXR5TGV2ZWwgPSAodWlu dDE2X3QpZGF0YS0+bWNsa19hY3Rpdml0eV90YXJnZXQ7CisJbWVtX2xldmVsLT5TdHV0dGVyRW5h YmxlID0gZmFsc2U7CisKKwltZW1fbGV2ZWwtPkRpc3BsYXlXYXRlcm1hcmsgPSBQUFNNQ19ESVNQ TEFZX1dBVEVSTUFSS19MT1c7CisKKwkvKiBlbmFibGUgc3R1dHRlciBtb2RlIGlmIGFsbCB0aGUg Zm9sbG93IGNvbmRpdGlvbiBhcHBsaWVkCisJICogUEVDSV9HZXROdW1iZXJPZkFjdGl2ZURpc3Bs YXlzKGh3bWdyLT5wUEVDSSwKKwkgKiAmKGRhdGEtPkRpc3BsYXlUaW1pbmcubnVtRXhpc3RpbmdE aXNwbGF5cykpOworCSAqLworCWRhdGEtPmRpc3BsYXlfdGltaW5nLm51bV9leGlzdGluZ19kaXNw bGF5cyA9IDE7CisKKwlpZiAoKGRhdGEtPm1jbGtfc3R1dHRlcl9tb2RlX3RocmVzaG9sZCkgJiYK KwkJKGNsb2NrIDw9IGRhdGEtPm1jbGtfc3R1dHRlcl9tb2RlX3RocmVzaG9sZCkgJiYKKwkJKCFk YXRhLT5pc191dmRfZW5hYmxlZCkgJiYKKwkJKFBITV9SRUFEX0ZJRUxEKGh3bWdyLT5kZXZpY2Us IERQR19QSVBFX1NUVVRURVJfQ09OVFJPTCwKKwkJCQlTVFVUVEVSX0VOQUJMRSkgJiAweDEpKQor CQltZW1fbGV2ZWwtPlN0dXR0ZXJFbmFibGUgPSB0cnVlOworCisJcmVzdWx0ID0gZmlqaV9jYWxj dWxhdGVfbWNsa19wYXJhbXMoaHdtZ3IsIGNsb2NrLCBtZW1fbGV2ZWwpOworCWlmICghcmVzdWx0 KSB7CisJCUNPTlZFUlRfRlJPTV9IT1NUX1RPX1NNQ19VTChtZW1fbGV2ZWwtPk1pbk12ZGQpOwor CQlDT05WRVJUX0ZST01fSE9TVF9UT19TTUNfVUwobWVtX2xldmVsLT5NY2xrRnJlcXVlbmN5KTsK KwkJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VTKG1lbV9sZXZlbC0+QWN0aXZpdHlMZXZlbCk7 CisJCUNPTlZFUlRfRlJPTV9IT1NUX1RPX1NNQ19VTChtZW1fbGV2ZWwtPk1pblZvbHRhZ2UpOwor CX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyogUG9wdWxhdGVzIGFsbCBTTUMgTUNMSyBs ZXZlbHMnIHN0cnVjdHVyZSBiYXNlZCBvbiB0aGUgdHJpbW1lZCBhbGxvd2VkIGRwbSBtZW1vcnkg Y2xvY2sgc3RhdGVzCisqCisqIEBwYXJhbSAgICBod21nciAgICAgIHRoZSBhZGRyZXNzIG9mIHRo ZSBoYXJkd2FyZSBtYW5hZ2VyCisqLworc3RhdGljIGludCBmaWppX3BvcHVsYXRlX2FsbF9tZW1v cnlfbGV2ZWxzKHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJc3RydWN0IGZpamlfaHdtZ3Ig KmRhdGEgPSAoc3RydWN0IGZpamlfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXN0cnVjdCBm aWppX2RwbV90YWJsZSAqZHBtX3RhYmxlID0gJmRhdGEtPmRwbV90YWJsZTsKKwlpbnQgcmVzdWx0 OworCS8qIHBvcHVsYXRlIE1DTEsgZHBtIHRhYmxlIHRvIFNNVTcgKi8KKwl1aW50MzJfdCBhcnJh eSA9IGRhdGEtPmRwbV90YWJsZV9zdGFydCArCisJCQlvZmZzZXRvZihTTVU3M19EaXNjcmV0ZV9E cG1UYWJsZSwgTWVtb3J5TGV2ZWwpOworCXVpbnQzMl90IGFycmF5X3NpemUgPSBzaXplb2YoU01V NzNfRGlzY3JldGVfTWVtb3J5TGV2ZWwpICoKKwkJCVNNVTczX01BWF9MRVZFTFNfTUVNT1JZOwor CXN0cnVjdCBTTVU3M19EaXNjcmV0ZV9NZW1vcnlMZXZlbCAqbGV2ZWxzID0KKwkJCWRhdGEtPnNt Y19zdGF0ZV90YWJsZS5NZW1vcnlMZXZlbDsKKwl1aW50MzJfdCBpOworCisJZm9yIChpID0gMDsg aSA8IGRwbV90YWJsZS0+bWNsa190YWJsZS5jb3VudDsgaSsrKSB7CisJCVBQX0FTU0VSVF9XSVRI X0NPREUoKDAgIT0gZHBtX3RhYmxlLT5tY2xrX3RhYmxlLmRwbV9sZXZlbHNbaV0udmFsdWUpLAor CQkJCSJjYW4gbm90IHBvcHVsYXRlIG1lbW9yeSBsZXZlbCBhcyBtZW1vcnkgY2xvY2sgaXMgemVy byIsCisJCQkJcmV0dXJuIC1FSU5WQUwpOworCQlyZXN1bHQgPSBmaWppX3BvcHVsYXRlX3Npbmds ZV9tZW1vcnlfbGV2ZWwoaHdtZ3IsCisJCQkJZHBtX3RhYmxlLT5tY2xrX3RhYmxlLmRwbV9sZXZl bHNbaV0udmFsdWUsCisJCQkJJmxldmVsc1tpXSk7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4g cmVzdWx0OworCX0KKworCS8qIE9ubHkgZW5hYmxlIGxldmVsIDAgZm9yIG5vdy4gKi8KKwlsZXZl bHNbMF0uRW5hYmxlZEZvckFjdGl2aXR5ID0gMTsKKworCS8qIGluIG9yZGVyIHRvIHByZXZlbnQg TUMgYWN0aXZpdHkgZnJvbSBzdHV0dGVyIG1vZGUgdG8gcHVzaCBEUE0gdXAuCisJICogdGhlIFVW RCBjaGFuZ2UgY29tcGxlbWVudHMgdGhpcyBieSBwdXR0aW5nIHRoZSBNQ0xLIGluCisJICogYSBo aWdoZXIgc3RhdGUgYnkgZGVmYXVsdCBzdWNoIHRoYXQgd2UgYXJlIG5vdCBlZmZlY3RlZCBieQor CSAqIHVwIHRocmVzaG9sZCBvciBhbmQgTUNMSyBEUE0gbGF0ZW5jeS4KKwkgKi8KKwlsZXZlbHNb MF0uQWN0aXZpdHlMZXZlbCA9ICh1aW50MTZfdClkYXRhLT5tY2xrX2RwbTBfYWN0aXZpdHlfdGFy Z2V0OworCUNPTlZFUlRfRlJPTV9IT1NUX1RPX1NNQ19VUyhsZXZlbHNbMF0uQWN0aXZpdHlMZXZl bCk7CisKKwlkYXRhLT5zbWNfc3RhdGVfdGFibGUuTWVtb3J5RHBtTGV2ZWxDb3VudCA9CisJCQko dWludDhfdClkcG1fdGFibGUtPm1jbGtfdGFibGUuY291bnQ7CisJZGF0YS0+ZHBtX2xldmVsX2Vu YWJsZV9tYXNrLm1jbGtfZHBtX2VuYWJsZV9tYXNrID0KKwkJCWZpamlfZ2V0X2RwbV9sZXZlbF9l bmFibGVfbWFza192YWx1ZSgmZHBtX3RhYmxlLT5tY2xrX3RhYmxlKTsKKwkvKiBzZXQgaGlnaGVz dCBsZXZlbCB3YXRlcm1hcmsgdG8gaGlnaCAqLworCWxldmVsc1tkcG1fdGFibGUtPm1jbGtfdGFi bGUuY291bnQgLSAxXS5EaXNwbGF5V2F0ZXJtYXJrID0KKwkJCVBQU01DX0RJU1BMQVlfV0FURVJN QVJLX0hJR0g7CisKKwkvKiBsZXZlbCBjb3VudCB3aWxsIHNlbmQgdG8gc21jIG9uY2UgYXQgaW5p dCBzbWMgdGFibGUgYW5kIG5ldmVyIGNoYW5nZSAqLworCXJlc3VsdCA9IGZpamlfY29weV9ieXRl c190b19zbWMoaHdtZ3ItPnNtdW1nciwgYXJyYXksICh1aW50OF90ICopbGV2ZWxzLAorCQkJKHVp bnQzMl90KWFycmF5X3NpemUsIGRhdGEtPnNyYW1fZW5kKTsKKworCXJldHVybiByZXN1bHQ7Cit9 CisKKy8qKgorKiBQb3B1bGF0ZXMgdGhlIFNNQyBNVkREIHN0cnVjdHVyZSB1c2luZyB0aGUgcHJv dmlkZWQgbWVtb3J5IGNsb2NrLgorKgorKiBAcGFyYW0gICAgaHdtZ3IgICAgICB0aGUgYWRkcmVz cyBvZiB0aGUgaGFyZHdhcmUgbWFuYWdlcgorKiBAcGFyYW0gICAgbWNsayAgICAgICAgdGhlIE1D TEsgdmFsdWUgdG8gYmUgdXNlZCBpbiB0aGUgZGVjaXNpb24gaWYgTVZERCBzaG91bGQgYmUgaGln aCBvciBsb3cuCisqIEBwYXJhbSAgICB2b2x0YWdlICAgICB0aGUgU01DIFZPTFRBR0Ugc3RydWN0 dXJlIHRvIGJlIHBvcHVsYXRlZAorKi8KK2ludCBmaWppX3BvcHVsYXRlX212ZGRfdmFsdWUoc3Ry dWN0IHBwX2h3bWdyICpod21nciwKKwkJdWludDMyX3QgbWNsaywgU01JT19QYXR0ZXJuICpzbWlv X3BhdCkKK3sKKwljb25zdCBzdHJ1Y3QgZmlqaV9od21nciAqZGF0YSA9IChzdHJ1Y3QgZmlqaV9o d21nciAqKShod21nci0+YmFja2VuZCk7CisJc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24g KnRhYmxlX2luZm8gPQorCQkJKHN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICopKGh3bWdy LT5wcHRhYmxlKTsKKwl1aW50MzJfdCBpID0gMDsKKworCWlmIChGSUpJX1ZPTFRBR0VfQ09OVFJP TF9OT05FICE9IGRhdGEtPm12ZGRfY29udHJvbCkgeworCQkvKiBmaW5kIG12ZGQgdmFsdWUgd2hp Y2ggY2xvY2sgaXMgbW9yZSB0aGFuIHJlcXVlc3QgKi8KKwkJZm9yIChpID0gMDsgaSA8IHRhYmxl X2luZm8tPnZkZF9kZXBfb25fbWNsay0+Y291bnQ7IGkrKykgeworCQkJaWYgKG1jbGsgPD0gdGFi bGVfaW5mby0+dmRkX2RlcF9vbl9tY2xrLT5lbnRyaWVzW2ldLmNsaykgeworCQkJCXNtaW9fcGF0 LT5Wb2x0YWdlID0gZGF0YS0+bXZkZF92b2x0YWdlX3RhYmxlLmVudHJpZXNbaV0udmFsdWU7CisJ CQkJYnJlYWs7CisJCQl9CisJCX0KKwkJUFBfQVNTRVJUX1dJVEhfQ09ERShpIDwgdGFibGVfaW5m by0+dmRkX2RlcF9vbl9tY2xrLT5jb3VudCwKKwkJCQkiTVZERCBWb2x0YWdlIGlzIG91dHNpZGUg dGhlIHN1cHBvcnRlZCByYW5nZS4iLAorCQkJCXJldHVybiAtRUlOVkFMKTsKKwl9IGVsc2UKKwkJ cmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWppX3BvcHVs YXRlX3NtY19hY3BpX2xldmVsKHN0cnVjdCBwcF9od21nciAqaHdtZ3IsCisJCVNNVTczX0Rpc2Ny ZXRlX0RwbVRhYmxlICp0YWJsZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwljb25zdCBzdHJ1Y3Qg ZmlqaV9od21nciAqZGF0YSA9IChzdHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+YmFja2VuZCk7 CisJc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKnRhYmxlX2luZm8gPQorCQkJKHN0cnVj dCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICopKGh3bWdyLT5wcHRhYmxlKTsKKwlzdHJ1Y3QgcHBf YXRvbWN0cmxfY2xvY2tfZGl2aWRlcnNfdmkgZGl2aWRlcnM7CisJU01JT19QYXR0ZXJuIHZvbF9s ZXZlbDsKKwl1aW50MzJfdCBtdmRkOworCXVpbnQxNl90IHVzX212ZGQ7CisJdWludDMyX3Qgc3Bs bF9mdW5jX2NudGwgICAgPSBkYXRhLT5jbG9ja19yZWdpc3RlcnMudkNHX1NQTExfRlVOQ19DTlRM OworCXVpbnQzMl90IHNwbGxfZnVuY19jbnRsXzIgID0gZGF0YS0+Y2xvY2tfcmVnaXN0ZXJzLnZD R19TUExMX0ZVTkNfQ05UTF8yOworCisJdGFibGUtPkFDUElMZXZlbC5GbGFncyAmPSB+UFBTTUNf U1dTVEFURV9GTEFHX0RDOworCisJaWYgKCFkYXRhLT5zY2xrX2RwbV9rZXlfZGlzYWJsZWQpIHsK KwkJLyogR2V0IE1pblZvbHRhZ2UgYW5kIEZyZXF1ZW5jeSBmcm9tIERQTTAsCisJCSAqIGFscmVh ZHkgY29udmVydGVkIHRvIFNNQ19VTCAqLworCQl0YWJsZS0+QUNQSUxldmVsLlNjbGtGcmVxdWVu Y3kgPQorCQkJCWRhdGEtPmRwbV90YWJsZS5zY2xrX3RhYmxlLmRwbV9sZXZlbHNbMF0udmFsdWU7 CisJCXJlc3VsdCA9IGZpamlfZ2V0X2RlcGVuZGVuY3lfdm9sdF9ieV9jbGsoaHdtZ3IsCisJCQkJ dGFibGVfaW5mby0+dmRkX2RlcF9vbl9zY2xrLAorCQkJCXRhYmxlLT5BQ1BJTGV2ZWwuU2Nsa0Zy ZXF1ZW5jeSwKKwkJCQkmdGFibGUtPkFDUElMZXZlbC5NaW5Wb2x0YWdlLCAmbXZkZCk7CisJCVBQ X0FTU0VSVF9XSVRIX0NPREUoKDAgPT0gcmVzdWx0KSwKKwkJCQkiQ2Fubm90IGZpbmQgQUNQSSBW RERDIHZvbHRhZ2UgdmFsdWUgIgorCQkJCSJpbiBDbG9jayBEZXBlbmRlbmN5IFRhYmxlIiwpOwor CX0gZWxzZSB7CisJCXRhYmxlLT5BQ1BJTGV2ZWwuU2Nsa0ZyZXF1ZW5jeSA9CisJCQkJZGF0YS0+ dmJpb3NfYm9vdF9zdGF0ZS5zY2xrX2Jvb3R1cF92YWx1ZTsKKwkJdGFibGUtPkFDUElMZXZlbC5N aW5Wb2x0YWdlID0KKwkJCQlkYXRhLT52Ymlvc19ib290X3N0YXRlLnZkZGNfYm9vdHVwX3ZhbHVl ICogVk9MVEFHRV9TQ0FMRTsKKwl9CisKKwkvKiBnZXQgdGhlIGVuZ2luZSBjbG9jayBkaXZpZGVy cyBmb3IgdGhpcyBjbG9jayB2YWx1ZSAqLworCXJlc3VsdCA9IGF0b21jdHJsX2dldF9lbmdpbmVf cGxsX2RpdmlkZXJzX3ZpKGh3bWdyLAorCQkJdGFibGUtPkFDUElMZXZlbC5TY2xrRnJlcXVlbmN5 LCAgJmRpdmlkZXJzKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKHJlc3VsdCA9PSAwLAorCQkJIkVy cm9yIHJldHJpZXZpbmcgRW5naW5lIENsb2NrIGRpdmlkZXJzIGZyb20gVkJJT1MuIiwKKwkJCXJl dHVybiByZXN1bHQpOworCisJdGFibGUtPkFDUElMZXZlbC5TY2xrRGlkID0gKHVpbnQ4X3QpZGl2 aWRlcnMucGxsX3Bvc3RfZGl2aWRlcjsKKwl0YWJsZS0+QUNQSUxldmVsLkRpc3BsYXlXYXRlcm1h cmsgPSBQUFNNQ19ESVNQTEFZX1dBVEVSTUFSS19MT1c7CisJdGFibGUtPkFDUElMZXZlbC5EZWVw U2xlZXBEaXZJZCA9IDA7CisKKwlzcGxsX2Z1bmNfY250bCA9IFBITV9TRVRfRklFTEQoc3BsbF9m dW5jX2NudGwsIENHX1NQTExfRlVOQ19DTlRMLAorCQkJU1BMTF9QV1JPTiwgMCk7CisJc3BsbF9m dW5jX2NudGwgPSBQSE1fU0VUX0ZJRUxEKHNwbGxfZnVuY19jbnRsLCBDR19TUExMX0ZVTkNfQ05U TCwKKwkJCVNQTExfUkVTRVQsIDEpOworCXNwbGxfZnVuY19jbnRsXzIgPSBQSE1fU0VUX0ZJRUxE KHNwbGxfZnVuY19jbnRsXzIsIENHX1NQTExfRlVOQ19DTlRMXzIsCisJCQlTQ0xLX01VWF9TRUws IDQpOworCisJdGFibGUtPkFDUElMZXZlbC5DZ1NwbGxGdW5jQ250bCA9IHNwbGxfZnVuY19jbnRs OworCXRhYmxlLT5BQ1BJTGV2ZWwuQ2dTcGxsRnVuY0NudGwyID0gc3BsbF9mdW5jX2NudGxfMjsK Kwl0YWJsZS0+QUNQSUxldmVsLkNnU3BsbEZ1bmNDbnRsMyA9IGRhdGEtPmNsb2NrX3JlZ2lzdGVy cy52Q0dfU1BMTF9GVU5DX0NOVExfMzsKKwl0YWJsZS0+QUNQSUxldmVsLkNnU3BsbEZ1bmNDbnRs NCA9IGRhdGEtPmNsb2NrX3JlZ2lzdGVycy52Q0dfU1BMTF9GVU5DX0NOVExfNDsKKwl0YWJsZS0+ QUNQSUxldmVsLlNwbGxTcHJlYWRTcGVjdHJ1bSA9IGRhdGEtPmNsb2NrX3JlZ2lzdGVycy52Q0df U1BMTF9TUFJFQURfU1BFQ1RSVU07CisJdGFibGUtPkFDUElMZXZlbC5TcGxsU3ByZWFkU3BlY3Ry dW0yID0gZGF0YS0+Y2xvY2tfcmVnaXN0ZXJzLnZDR19TUExMX1NQUkVBRF9TUEVDVFJVTV8yOwor CXRhYmxlLT5BQ1BJTGV2ZWwuQ2NQd3JEeW5SbSA9IDA7CisJdGFibGUtPkFDUElMZXZlbC5DY1B3 ckR5blJtMSA9IDA7CisKKwlDT05WRVJUX0ZST01fSE9TVF9UT19TTUNfVUwodGFibGUtPkFDUElM ZXZlbC5GbGFncyk7CisJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VMKHRhYmxlLT5BQ1BJTGV2 ZWwuU2Nsa0ZyZXF1ZW5jeSk7CisJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VMKHRhYmxlLT5B Q1BJTGV2ZWwuTWluVm9sdGFnZSk7CisJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VMKHRhYmxl LT5BQ1BJTGV2ZWwuQ2dTcGxsRnVuY0NudGwpOworCUNPTlZFUlRfRlJPTV9IT1NUX1RPX1NNQ19V TCh0YWJsZS0+QUNQSUxldmVsLkNnU3BsbEZ1bmNDbnRsMik7CisJQ09OVkVSVF9GUk9NX0hPU1Rf VE9fU01DX1VMKHRhYmxlLT5BQ1BJTGV2ZWwuQ2dTcGxsRnVuY0NudGwzKTsKKwlDT05WRVJUX0ZS T01fSE9TVF9UT19TTUNfVUwodGFibGUtPkFDUElMZXZlbC5DZ1NwbGxGdW5jQ250bDQpOworCUNP TlZFUlRfRlJPTV9IT1NUX1RPX1NNQ19VTCh0YWJsZS0+QUNQSUxldmVsLlNwbGxTcHJlYWRTcGVj dHJ1bSk7CisJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VMKHRhYmxlLT5BQ1BJTGV2ZWwuU3Bs bFNwcmVhZFNwZWN0cnVtMik7CisJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VMKHRhYmxlLT5B Q1BJTGV2ZWwuQ2NQd3JEeW5SbSk7CisJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VMKHRhYmxl LT5BQ1BJTGV2ZWwuQ2NQd3JEeW5SbTEpOworCisJaWYgKCFkYXRhLT5tY2xrX2RwbV9rZXlfZGlz YWJsZWQpIHsKKwkJLyogR2V0IE1pblZvbHRhZ2UgYW5kIEZyZXF1ZW5jeSBmcm9tIERQTTAsIGFs cmVhZHkgY29udmVydGVkIHRvIFNNQ19VTCAqLworCQl0YWJsZS0+TWVtb3J5QUNQSUxldmVsLk1j bGtGcmVxdWVuY3kgPQorCQkJCWRhdGEtPmRwbV90YWJsZS5tY2xrX3RhYmxlLmRwbV9sZXZlbHNb MF0udmFsdWU7CisJCXJlc3VsdCA9IGZpamlfZ2V0X2RlcGVuZGVuY3lfdm9sdF9ieV9jbGsoaHdt Z3IsCisJCQkJdGFibGVfaW5mby0+dmRkX2RlcF9vbl9tY2xrLAorCQkJCXRhYmxlLT5NZW1vcnlB Q1BJTGV2ZWwuTWNsa0ZyZXF1ZW5jeSwKKwkJCQkmdGFibGUtPk1lbW9yeUFDUElMZXZlbC5NaW5W b2x0YWdlLCAmbXZkZCk7CisJCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgPT0gcmVzdWx0KSwKKwkJ CQkiQ2Fubm90IGZpbmQgQUNQSSBWRERDSSB2b2x0YWdlIHZhbHVlICIKKwkJCQkiaW4gQ2xvY2sg RGVwZW5kZW5jeSBUYWJsZSIsKTsKKwl9IGVsc2UgeworCQl0YWJsZS0+TWVtb3J5QUNQSUxldmVs Lk1jbGtGcmVxdWVuY3kgPQorCQkJCWRhdGEtPnZiaW9zX2Jvb3Rfc3RhdGUubWNsa19ib290dXBf dmFsdWU7CisJCXRhYmxlLT5NZW1vcnlBQ1BJTGV2ZWwuTWluVm9sdGFnZSA9CisJCQkJZGF0YS0+ dmJpb3NfYm9vdF9zdGF0ZS52ZGRjaV9ib290dXBfdmFsdWUgKiBWT0xUQUdFX1NDQUxFOworCX0K KworCXVzX212ZGQgPSAwOworCWlmICgoRklKSV9WT0xUQUdFX0NPTlRST0xfTk9ORSA9PSBkYXRh LT5tdmRkX2NvbnRyb2wpIHx8CisJCQkoZGF0YS0+bWNsa19kcG1fa2V5X2Rpc2FibGVkKSkKKwkJ dXNfbXZkZCA9IGRhdGEtPnZiaW9zX2Jvb3Rfc3RhdGUubXZkZF9ib290dXBfdmFsdWU7CisJZWxz ZSB7CisJCWlmICghZmlqaV9wb3B1bGF0ZV9tdmRkX3ZhbHVlKGh3bWdyLAorCQkJCWRhdGEtPmRw bV90YWJsZS5tY2xrX3RhYmxlLmRwbV9sZXZlbHNbMF0udmFsdWUsCisJCQkJJnZvbF9sZXZlbCkp CisJCQl1c19tdmRkID0gdm9sX2xldmVsLlZvbHRhZ2U7CisJfQorCisJdGFibGUtPk1lbW9yeUFD UElMZXZlbC5NaW5NdmRkID0KKwkJCVBQX0hPU1RfVE9fU01DX1VMKHVzX212ZGQgKiBWT0xUQUdF X1NDQUxFKTsKKworCXRhYmxlLT5NZW1vcnlBQ1BJTGV2ZWwuRW5hYmxlZEZvclRocm90dGxlID0g MDsKKwl0YWJsZS0+TWVtb3J5QUNQSUxldmVsLkVuYWJsZWRGb3JBY3Rpdml0eSA9IDA7CisJdGFi bGUtPk1lbW9yeUFDUElMZXZlbC5VcEh5c3QgPSAwOworCXRhYmxlLT5NZW1vcnlBQ1BJTGV2ZWwu RG93bkh5c3QgPSAxMDA7CisJdGFibGUtPk1lbW9yeUFDUElMZXZlbC5Wb2x0YWdlRG93bkh5c3Qg PSAwOworCXRhYmxlLT5NZW1vcnlBQ1BJTGV2ZWwuQWN0aXZpdHlMZXZlbCA9CisJCQlQUF9IT1NU X1RPX1NNQ19VUygodWludDE2X3QpZGF0YS0+bWNsa19hY3Rpdml0eV90YXJnZXQpOworCisJdGFi bGUtPk1lbW9yeUFDUElMZXZlbC5TdHV0dGVyRW5hYmxlID0gZmFsc2U7CisJQ09OVkVSVF9GUk9N X0hPU1RfVE9fU01DX1VMKHRhYmxlLT5NZW1vcnlBQ1BJTGV2ZWwuTWNsa0ZyZXF1ZW5jeSk7CisJ Q09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VMKHRhYmxlLT5NZW1vcnlBQ1BJTGV2ZWwuTWluVm9s dGFnZSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGZpamlfcG9wdWxhdGVf c21jX3ZjZV9sZXZlbChzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLAorCQlTTVU3M19EaXNjcmV0ZV9E cG1UYWJsZSAqdGFibGUpCit7CisJaW50IHJlc3VsdCA9IC1FSU5WQUw7CisJdWludDhfdCBjb3Vu dDsKKwlzdHJ1Y3QgcHBfYXRvbWN0cmxfY2xvY2tfZGl2aWRlcnNfdmkgZGl2aWRlcnM7CisJc3Ry dWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKnRhYmxlX2luZm8gPQorCQkJKHN0cnVjdCBwaG1f cHB0X3YxX2luZm9ybWF0aW9uICopKGh3bWdyLT5wcHRhYmxlKTsKKwlzdHJ1Y3QgcGhtX3BwdF92 MV9tbV9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUgKm1tX3RhYmxlID0KKwkJCXRhYmxl X2luZm8tPm1tX2RlcF90YWJsZTsKKwlzdHJ1Y3QgZmlqaV9od21nciAqZGF0YSA9IChzdHJ1Y3Qg ZmlqaV9od21nciAqKShod21nci0+YmFja2VuZCk7CisKKwl0YWJsZS0+VmNlTGV2ZWxDb3VudCA9 ICh1aW50OF90KShtbV90YWJsZS0+Y291bnQpOworCXRhYmxlLT5WY2VCb290TGV2ZWwgPSAwOwor CisJZm9yKGNvdW50ID0gMDsgY291bnQgPCB0YWJsZS0+VmNlTGV2ZWxDb3VudDsgY291bnQrKykg eworCQl0YWJsZS0+VmNlTGV2ZWxbY291bnRdLkZyZXF1ZW5jeSA9IG1tX3RhYmxlLT5lbnRyaWVz W2NvdW50XS5lY2xrOworCQl0YWJsZS0+VmNlTGV2ZWxbY291bnRdLk1pblZvbHRhZ2UgfD0KKwkJ CQkobW1fdGFibGUtPmVudHJpZXNbY291bnRdLnZkZGMgKiBWT0xUQUdFX1NDQUxFKSA8PCBWRERD X1NISUZUOworCQl0YWJsZS0+VmNlTGV2ZWxbY291bnRdLk1pblZvbHRhZ2UgfD0KKwkJCQkoKG1t X3RhYmxlLT5lbnRyaWVzW2NvdW50XS52ZGRjIC0gZGF0YS0+dmRkY192ZGRjaV9kZWx0YSkgKgor CQkJCQkJVk9MVEFHRV9TQ0FMRSkgPDwgVkREQ0lfU0hJRlQ7CisJCXRhYmxlLT5WY2VMZXZlbFtj b3VudF0uTWluVm9sdGFnZSB8PSAxIDw8IFBIQVNFU19TSElGVDsKKworCQkvKnJldHJpZXZlIGRp dmlkZXIgdmFsdWUgZm9yIFZCSU9TICovCisJCXJlc3VsdCA9IGF0b21jdHJsX2dldF9kZnNfcGxs X2RpdmlkZXJzX3ZpKGh3bWdyLAorCQkJCXRhYmxlLT5WY2VMZXZlbFtjb3VudF0uRnJlcXVlbmN5 LCAmZGl2aWRlcnMpOworCQlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09IHJlc3VsdCksCisJCQkJ ImNhbiBub3QgZmluZCBkaXZpZGUgaWQgZm9yIFZDRSBlbmdpbmUgY2xvY2siLAorCQkJCXJldHVy biByZXN1bHQpOworCisJCXRhYmxlLT5WY2VMZXZlbFtjb3VudF0uRGl2aWRlciA9ICh1aW50OF90 KWRpdmlkZXJzLnBsbF9wb3N0X2RpdmlkZXI7CisKKwkJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01D X1VMKHRhYmxlLT5WY2VMZXZlbFtjb3VudF0uRnJlcXVlbmN5KTsKKwkJQ09OVkVSVF9GUk9NX0hP U1RfVE9fU01DX1VMKHRhYmxlLT5WY2VMZXZlbFtjb3VudF0uTWluVm9sdGFnZSk7CisJfQorCXJl dHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZmlqaV9wb3B1bGF0ZV9zbWNfYWNwX2xldmVs KHN0cnVjdCBwcF9od21nciAqaHdtZ3IsCisJCVNNVTczX0Rpc2NyZXRlX0RwbVRhYmxlICp0YWJs ZSkKK3sKKwlpbnQgcmVzdWx0ID0gLUVJTlZBTDsKKwl1aW50OF90IGNvdW50OworCXN0cnVjdCBw cF9hdG9tY3RybF9jbG9ja19kaXZpZGVyc192aSBkaXZpZGVyczsKKwlzdHJ1Y3QgcGhtX3BwdF92 MV9pbmZvcm1hdGlvbiAqdGFibGVfaW5mbyA9CisJCQkoc3RydWN0IHBobV9wcHRfdjFfaW5mb3Jt YXRpb24gKikoaHdtZ3ItPnBwdGFibGUpOworCXN0cnVjdCBwaG1fcHB0X3YxX21tX2Nsb2NrX3Zv bHRhZ2VfZGVwZW5kZW5jeV90YWJsZSAqbW1fdGFibGUgPQorCQkJdGFibGVfaW5mby0+bW1fZGVw X3RhYmxlOworCXN0cnVjdCBmaWppX2h3bWdyICpkYXRhID0gKHN0cnVjdCBmaWppX2h3bWdyICop KGh3bWdyLT5iYWNrZW5kKTsKKworCXRhYmxlLT5BY3BMZXZlbENvdW50ID0gKHVpbnQ4X3QpKG1t X3RhYmxlLT5jb3VudCk7CisJdGFibGUtPkFjcEJvb3RMZXZlbCA9IDA7CisKKwlmb3IgKGNvdW50 ID0gMDsgY291bnQgPCB0YWJsZS0+QWNwTGV2ZWxDb3VudDsgY291bnQrKykgeworCQl0YWJsZS0+ QWNwTGV2ZWxbY291bnRdLkZyZXF1ZW5jeSA9IG1tX3RhYmxlLT5lbnRyaWVzW2NvdW50XS5hY2xr OworCQl0YWJsZS0+QWNwTGV2ZWxbY291bnRdLk1pblZvbHRhZ2UgfD0gKG1tX3RhYmxlLT5lbnRy aWVzW2NvdW50XS52ZGRjICoKKwkJCQlWT0xUQUdFX1NDQUxFKSA8PCBWRERDX1NISUZUOworCQl0 YWJsZS0+QWNwTGV2ZWxbY291bnRdLk1pblZvbHRhZ2UgfD0gKChtbV90YWJsZS0+ZW50cmllc1tj b3VudF0udmRkYyAtCisJCQkJZGF0YS0+dmRkY192ZGRjaV9kZWx0YSkgKiBWT0xUQUdFX1NDQUxF KSA8PCBWRERDSV9TSElGVDsKKwkJdGFibGUtPkFjcExldmVsW2NvdW50XS5NaW5Wb2x0YWdlIHw9 IDEgPDwgUEhBU0VTX1NISUZUOworCisJCS8qIHJldHJpZXZlIGRpdmlkZXIgdmFsdWUgZm9yIFZC SU9TICovCisJCXJlc3VsdCA9IGF0b21jdHJsX2dldF9kZnNfcGxsX2RpdmlkZXJzX3ZpKGh3bWdy LAorCQkJCXRhYmxlLT5BY3BMZXZlbFtjb3VudF0uRnJlcXVlbmN5LCAmZGl2aWRlcnMpOworCQlQ UF9BU1NFUlRfV0lUSF9DT0RFKCgwID09IHJlc3VsdCksCisJCQkJImNhbiBub3QgZmluZCBkaXZp ZGUgaWQgZm9yIGVuZ2luZSBjbG9jayIsIHJldHVybiByZXN1bHQpOworCisJCXRhYmxlLT5BY3BM ZXZlbFtjb3VudF0uRGl2aWRlciA9ICh1aW50OF90KWRpdmlkZXJzLnBsbF9wb3N0X2RpdmlkZXI7 CisKKwkJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VMKHRhYmxlLT5BY3BMZXZlbFtjb3VudF0u RnJlcXVlbmN5KTsKKwkJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VMKHRhYmxlLT5BY3BMZXZl bFtjb3VudF0uTWluVm9sdGFnZSk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBp bnQgZmlqaV9wb3B1bGF0ZV9zbWNfc2FtdV9sZXZlbChzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLAor CQlTTVU3M19EaXNjcmV0ZV9EcG1UYWJsZSAqdGFibGUpCit7CisJaW50IHJlc3VsdCA9IC1FSU5W QUw7CisJdWludDhfdCBjb3VudDsKKwlzdHJ1Y3QgcHBfYXRvbWN0cmxfY2xvY2tfZGl2aWRlcnNf dmkgZGl2aWRlcnM7CisJc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKnRhYmxlX2luZm8g PQorCQkJKHN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICopKGh3bWdyLT5wcHRhYmxlKTsK KwlzdHJ1Y3QgcGhtX3BwdF92MV9tbV9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUgKm1t X3RhYmxlID0KKwkJCXRhYmxlX2luZm8tPm1tX2RlcF90YWJsZTsKKwlzdHJ1Y3QgZmlqaV9od21n ciAqZGF0YSA9IChzdHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+YmFja2VuZCk7CisKKwl0YWJs ZS0+U2FtdUJvb3RMZXZlbCA9IDA7CisJdGFibGUtPlNhbXVMZXZlbENvdW50ID0gKHVpbnQ4X3Qp KG1tX3RhYmxlLT5jb3VudCk7CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCB0YWJsZS0+U2Ft dUxldmVsQ291bnQ7IGNvdW50KyspIHsKKwkJLyogbm90IHN1cmUgd2hldGhlciB3ZSBuZWVkIGV2 Y2xrIG9yIG5vdCAqLworCQl0YWJsZS0+U2FtdUxldmVsW2NvdW50XS5GcmVxdWVuY3kgPSBtbV90 YWJsZS0+ZW50cmllc1tjb3VudF0uc2FtY2xvY2s7CisJCXRhYmxlLT5TYW11TGV2ZWxbY291bnRd Lk1pblZvbHRhZ2UgfD0gKG1tX3RhYmxlLT5lbnRyaWVzW2NvdW50XS52ZGRjICoKKwkJCQlWT0xU QUdFX1NDQUxFKSA8PCBWRERDX1NISUZUOworCQl0YWJsZS0+U2FtdUxldmVsW2NvdW50XS5NaW5W b2x0YWdlIHw9ICgobW1fdGFibGUtPmVudHJpZXNbY291bnRdLnZkZGMgLQorCQkJCWRhdGEtPnZk ZGNfdmRkY2lfZGVsdGEpICogVk9MVEFHRV9TQ0FMRSkgPDwgVkREQ0lfU0hJRlQ7CisJCXRhYmxl LT5TYW11TGV2ZWxbY291bnRdLk1pblZvbHRhZ2UgfD0gMSA8PCBQSEFTRVNfU0hJRlQ7CisKKwkJ LyogcmV0cmlldmUgZGl2aWRlciB2YWx1ZSBmb3IgVkJJT1MgKi8KKwkJcmVzdWx0ID0gYXRvbWN0 cmxfZ2V0X2Rmc19wbGxfZGl2aWRlcnNfdmkoaHdtZ3IsCisJCQkJdGFibGUtPlNhbXVMZXZlbFtj b3VudF0uRnJlcXVlbmN5LCAmZGl2aWRlcnMpOworCQlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09 IHJlc3VsdCksCisJCQkJImNhbiBub3QgZmluZCBkaXZpZGUgaWQgZm9yIHNhbXUgY2xvY2siLCBy ZXR1cm4gcmVzdWx0KTsKKworCQl0YWJsZS0+U2FtdUxldmVsW2NvdW50XS5EaXZpZGVyID0gKHVp bnQ4X3QpZGl2aWRlcnMucGxsX3Bvc3RfZGl2aWRlcjsKKworCQlDT05WRVJUX0ZST01fSE9TVF9U T19TTUNfVUwodGFibGUtPlNhbXVMZXZlbFtjb3VudF0uRnJlcXVlbmN5KTsKKwkJQ09OVkVSVF9G Uk9NX0hPU1RfVE9fU01DX1VMKHRhYmxlLT5TYW11TGV2ZWxbY291bnRdLk1pblZvbHRhZ2UpOwor CX0KKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGZpamlfcG9wdWxhdGVfbWVtb3J5 X3RpbWluZ19wYXJhbWV0ZXJzKHN0cnVjdCBwcF9od21nciAqaHdtZ3IsCisJCWludDMyX3QgZW5n X2Nsb2NrLCBpbnQzMl90IG1lbV9jbG9jaywKKwkJc3RydWN0IFNNVTczX0Rpc2NyZXRlX01DQXJi RHJhbVRpbWluZ1RhYmxlRW50cnkgKmFyYl9yZWdzKQoreworCXVpbnQzMl90IGRyYW1fdGltaW5n OworCXVpbnQzMl90IGRyYW1fdGltaW5nMjsKKwl1aW50MzJfdCBidXJzdFRpbWU7CisJVUxPTkcg c3RhdGUsIHRycmRzLCB0cnJkbDsKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gYXRvbWN0cmxf c2V0X2VuZ2luZV9kcmFtX3RpbWluZ3NfcnY3NzAoaHdtZ3IsCisJCQllbmdfY2xvY2ssIG1lbV9j bG9jayk7CisJUFBfQVNTRVJUX1dJVEhfQ09ERShyZXN1bHQgPT0gMCwKKwkJCSJFcnJvciBjYWxs aW5nIFZCSU9TIHRvIHNldCBEUkFNX1RJTUlORy4iLCByZXR1cm4gcmVzdWx0KTsKKworCWRyYW1f dGltaW5nID0gY2dzX3JlYWRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19BUkJfRFJBTV9U SU1JTkcpOworCWRyYW1fdGltaW5nMiA9IGNnc19yZWFkX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2Us IG1tTUNfQVJCX0RSQU1fVElNSU5HMik7CisJYnVyc3RUaW1lID0gY2dzX3JlYWRfcmVnaXN0ZXIo aHdtZ3ItPmRldmljZSwgbW1NQ19BUkJfQlVSU1RfVElNRSk7CisKKwlzdGF0ZSA9IFBITV9HRVRf RklFTEQoYnVyc3RUaW1lLCBNQ19BUkJfQlVSU1RfVElNRSwgU1RBVEUwKTsKKwl0cnJkcyA9IFBI TV9HRVRfRklFTEQoYnVyc3RUaW1lLCBNQ19BUkJfQlVSU1RfVElNRSwgVFJSRFMwKTsKKwl0cnJk bCA9IFBITV9HRVRfRklFTEQoYnVyc3RUaW1lLCBNQ19BUkJfQlVSU1RfVElNRSwgVFJSREwwKTsK KworCWFyYl9yZWdzLT5NY0FyYkRyYW1UaW1pbmcgID0gUFBfSE9TVF9UT19TTUNfVUwoZHJhbV90 aW1pbmcpOworCWFyYl9yZWdzLT5NY0FyYkRyYW1UaW1pbmcyID0gUFBfSE9TVF9UT19TTUNfVUwo ZHJhbV90aW1pbmcyKTsKKwlhcmJfcmVncy0+TWNBcmJCdXJzdFRpbWUgICA9ICh1aW50OF90KWJ1 cnN0VGltZTsKKwlhcmJfcmVncy0+VFJSRFMgICAgICAgICAgICA9ICh1aW50OF90KXRycmRzOwor CWFyYl9yZWdzLT5UUlJETCAgICAgICAgICAgID0gKHVpbnQ4X3QpdHJyZGw7CisKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIGludCBmaWppX3Byb2dyYW1fbWVtb3J5X3RpbWluZ19wYXJhbWV0ZXJz KHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJc3RydWN0IGZpamlfaHdtZ3IgKmRhdGEgPSAo c3RydWN0IGZpamlfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXN0cnVjdCBTTVU3M19EaXNj cmV0ZV9NQ0FyYkRyYW1UaW1pbmdUYWJsZSBhcmJfcmVnczsKKwl1aW50MzJfdCBpLCBqOworCWlu dCByZXN1bHQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPmRwbV90YWJsZS5zY2xrX3Rh YmxlLmNvdW50OyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IGRhdGEtPmRwbV90YWJsZS5tY2xr X3RhYmxlLmNvdW50OyBqKyspIHsKKwkJCXJlc3VsdCA9IGZpamlfcG9wdWxhdGVfbWVtb3J5X3Rp bWluZ19wYXJhbWV0ZXJzKGh3bWdyLAorCQkJCQlkYXRhLT5kcG1fdGFibGUuc2Nsa190YWJsZS5k cG1fbGV2ZWxzW2ldLnZhbHVlLAorCQkJCQlkYXRhLT5kcG1fdGFibGUubWNsa190YWJsZS5kcG1f bGV2ZWxzW2pdLnZhbHVlLAorCQkJCQkmYXJiX3JlZ3MuZW50cmllc1tpXVtqXSk7CisJCQlpZiAo cmVzdWx0KQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFyZXN1bHQpCisJCXJlc3VsdCA9 IGZpamlfY29weV9ieXRlc190b19zbWMoCisJCQkJaHdtZ3ItPnNtdW1nciwKKwkJCQlkYXRhLT5h cmJfdGFibGVfc3RhcnQsCisJCQkJKHVpbnQ4X3QgKikmYXJiX3JlZ3MsCisJCQkJc2l6ZW9mKFNN VTczX0Rpc2NyZXRlX01DQXJiRHJhbVRpbWluZ1RhYmxlKSwKKwkJCQlkYXRhLT5zcmFtX2VuZCk7 CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBmaWppX3BvcHVsYXRlX3NtY191dmRf bGV2ZWwoc3RydWN0IHBwX2h3bWdyICpod21nciwKKwkJc3RydWN0IFNNVTczX0Rpc2NyZXRlX0Rw bVRhYmxlICp0YWJsZSkKK3sKKwlpbnQgcmVzdWx0ID0gLUVJTlZBTDsKKwl1aW50OF90IGNvdW50 OworCXN0cnVjdCBwcF9hdG9tY3RybF9jbG9ja19kaXZpZGVyc192aSBkaXZpZGVyczsKKwlzdHJ1 Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqdGFibGVfaW5mbyA9CisJCQkoc3RydWN0IHBobV9w cHRfdjFfaW5mb3JtYXRpb24gKikoaHdtZ3ItPnBwdGFibGUpOworCXN0cnVjdCBwaG1fcHB0X3Yx X21tX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZSAqbW1fdGFibGUgPQorCQkJdGFibGVf aW5mby0+bW1fZGVwX3RhYmxlOworCXN0cnVjdCBmaWppX2h3bWdyICpkYXRhID0gKHN0cnVjdCBm aWppX2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKworCXRhYmxlLT5VdmRMZXZlbENvdW50ID0g KHVpbnQ4X3QpKG1tX3RhYmxlLT5jb3VudCk7CisJdGFibGUtPlV2ZEJvb3RMZXZlbCA9IDA7CisK Kwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCB0YWJsZS0+VXZkTGV2ZWxDb3VudDsgY291bnQrKykg eworCQl0YWJsZS0+VXZkTGV2ZWxbY291bnRdLlZjbGtGcmVxdWVuY3kgPSBtbV90YWJsZS0+ZW50 cmllc1tjb3VudF0udmNsazsKKwkJdGFibGUtPlV2ZExldmVsW2NvdW50XS5EY2xrRnJlcXVlbmN5 ID0gbW1fdGFibGUtPmVudHJpZXNbY291bnRdLmRjbGs7CisJCXRhYmxlLT5VdmRMZXZlbFtjb3Vu dF0uTWluVm9sdGFnZSB8PSAobW1fdGFibGUtPmVudHJpZXNbY291bnRdLnZkZGMgKgorCQkJCVZP TFRBR0VfU0NBTEUpIDw8IFZERENfU0hJRlQ7CisJCXRhYmxlLT5VdmRMZXZlbFtjb3VudF0uTWlu Vm9sdGFnZSB8PSAoKG1tX3RhYmxlLT5lbnRyaWVzW2NvdW50XS52ZGRjIC0KKwkJCQlkYXRhLT52 ZGRjX3ZkZGNpX2RlbHRhKSAqIFZPTFRBR0VfU0NBTEUpIDw8IFZERENJX1NISUZUOworCQl0YWJs ZS0+VXZkTGV2ZWxbY291bnRdLk1pblZvbHRhZ2UgfD0gMSA8PCBQSEFTRVNfU0hJRlQ7CisKKwkJ LyogcmV0cmlldmUgZGl2aWRlciB2YWx1ZSBmb3IgVkJJT1MgKi8KKwkJcmVzdWx0ID0gYXRvbWN0 cmxfZ2V0X2Rmc19wbGxfZGl2aWRlcnNfdmkoaHdtZ3IsCisJCQkJdGFibGUtPlV2ZExldmVsW2Nv dW50XS5WY2xrRnJlcXVlbmN5LCAmZGl2aWRlcnMpOworCQlQUF9BU1NFUlRfV0lUSF9DT0RFKCgw ID09IHJlc3VsdCksCisJCQkJImNhbiBub3QgZmluZCBkaXZpZGUgaWQgZm9yIFZjbGsgY2xvY2si LCByZXR1cm4gcmVzdWx0KTsKKworCQl0YWJsZS0+VXZkTGV2ZWxbY291bnRdLlZjbGtEaXZpZGVy ID0gKHVpbnQ4X3QpZGl2aWRlcnMucGxsX3Bvc3RfZGl2aWRlcjsKKworCQlyZXN1bHQgPSBhdG9t Y3RybF9nZXRfZGZzX3BsbF9kaXZpZGVyc192aShod21nciwKKwkJCQl0YWJsZS0+VXZkTGV2ZWxb Y291bnRdLkRjbGtGcmVxdWVuY3ksICZkaXZpZGVycyk7CisJCVBQX0FTU0VSVF9XSVRIX0NPREUo KDAgPT0gcmVzdWx0KSwKKwkJCQkiY2FuIG5vdCBmaW5kIGRpdmlkZSBpZCBmb3IgRGNsayBjbG9j ayIsIHJldHVybiByZXN1bHQpOworCisJCXRhYmxlLT5VdmRMZXZlbFtjb3VudF0uRGNsa0Rpdmlk ZXIgPSAodWludDhfdClkaXZpZGVycy5wbGxfcG9zdF9kaXZpZGVyOworCisJCUNPTlZFUlRfRlJP TV9IT1NUX1RPX1NNQ19VTCh0YWJsZS0+VXZkTGV2ZWxbY291bnRdLlZjbGtGcmVxdWVuY3kpOwor CQlDT05WRVJUX0ZST01fSE9TVF9UT19TTUNfVUwodGFibGUtPlV2ZExldmVsW2NvdW50XS5EY2xr RnJlcXVlbmN5KTsKKwkJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VMKHRhYmxlLT5VdmRMZXZl bFtjb3VudF0uTWluVm9sdGFnZSk7CisKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGlj IGludCBmaWppX2ZpbmRfYm9vdF9sZXZlbChzdHJ1Y3QgZmlqaV9zaW5nbGVfZHBtX3RhYmxlICp0 YWJsZSwKKwkJdWludDMyX3QgdmFsdWUsIHVpbnQzMl90ICpib290X2xldmVsKQoreworCWludCBy ZXN1bHQgPSAtRUlOVkFMOworCXVpbnQzMl90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdGFibGUt PmNvdW50OyBpKyspIHsKKwkJaWYgKHZhbHVlID09IHRhYmxlLT5kcG1fbGV2ZWxzW2ldLnZhbHVl KSB7CisJCQkqYm9vdF9sZXZlbCA9IGk7CisJCQlyZXN1bHQgPSAwOworCQl9CisJfQorCXJldHVy biByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZmlqaV9wb3B1bGF0ZV9zbWNfYm9vdF9sZXZlbChz dHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLAorCQlzdHJ1Y3QgU01VNzNfRGlzY3JldGVfRHBtVGFibGUg KnRhYmxlKQoreworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBmaWppX2h3bWdyICpkYXRhID0g KHN0cnVjdCBmaWppX2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKworCXRhYmxlLT5HcmFwaGlj c0Jvb3RMZXZlbCA9IDA7CisJdGFibGUtPk1lbW9yeUJvb3RMZXZlbCA9IDA7CisKKwkvKiBmaW5k IGJvb3QgbGV2ZWwgZnJvbSBkcG0gdGFibGUgKi8KKwlyZXN1bHQgPSBmaWppX2ZpbmRfYm9vdF9s ZXZlbCgmKGRhdGEtPmRwbV90YWJsZS5zY2xrX3RhYmxlKSwKKwkJCWRhdGEtPnZiaW9zX2Jvb3Rf c3RhdGUuc2Nsa19ib290dXBfdmFsdWUsCisJCQkodWludDMyX3QgKikmKHRhYmxlLT5HcmFwaGlj c0Jvb3RMZXZlbCkpOworCisJcmVzdWx0ID0gZmlqaV9maW5kX2Jvb3RfbGV2ZWwoJihkYXRhLT5k cG1fdGFibGUubWNsa190YWJsZSksCisJCQlkYXRhLT52Ymlvc19ib290X3N0YXRlLm1jbGtfYm9v dHVwX3ZhbHVlLAorCQkJKHVpbnQzMl90ICopJih0YWJsZS0+TWVtb3J5Qm9vdExldmVsKSk7CisK Kwl0YWJsZS0+Qm9vdFZkZGMgID0gZGF0YS0+dmJpb3NfYm9vdF9zdGF0ZS52ZGRjX2Jvb3R1cF92 YWx1ZSAqCisJCQlWT0xUQUdFX1NDQUxFOworCXRhYmxlLT5Cb290VmRkY2kgPSBkYXRhLT52Ymlv c19ib290X3N0YXRlLnZkZGNpX2Jvb3R1cF92YWx1ZSAqCisJCQlWT0xUQUdFX1NDQUxFOworCXRh YmxlLT5Cb290TVZkZCAgPSBkYXRhLT52Ymlvc19ib290X3N0YXRlLm12ZGRfYm9vdHVwX3ZhbHVl ICoKKwkJCVZPTFRBR0VfU0NBTEU7CisKKwlDT05WRVJUX0ZST01fSE9TVF9UT19TTUNfVVModGFi bGUtPkJvb3RWZGRjKTsKKwlDT05WRVJUX0ZST01fSE9TVF9UT19TTUNfVVModGFibGUtPkJvb3RW ZGRjaSk7CisJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VTKHRhYmxlLT5Cb290TVZkZCk7CisK KwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWppX3BvcHVsYXRlX3NtY19pbml0YWlsaWFs X3N0YXRlKHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJc3RydWN0IGZpamlfaHdtZ3IgKmRh dGEgPSAoc3RydWN0IGZpamlfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXN0cnVjdCBwaG1f cHB0X3YxX2luZm9ybWF0aW9uICp0YWJsZV9pbmZvID0KKwkJCShzdHJ1Y3QgcGhtX3BwdF92MV9p bmZvcm1hdGlvbiAqKShod21nci0+cHB0YWJsZSk7CisJdWludDhfdCBjb3VudCwgbGV2ZWw7CisK Kwljb3VudCA9ICh1aW50OF90KSh0YWJsZV9pbmZvLT52ZGRfZGVwX29uX3NjbGstPmNvdW50KTsK Kwlmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBjb3VudDsgbGV2ZWwrKykgeworCQlpZih0YWJsZV9p bmZvLT52ZGRfZGVwX29uX3NjbGstPmVudHJpZXNbbGV2ZWxdLmNsayA+PQorCQkJCWRhdGEtPnZi aW9zX2Jvb3Rfc3RhdGUuc2Nsa19ib290dXBfdmFsdWUpIHsKKwkJCWRhdGEtPnNtY19zdGF0ZV90 YWJsZS5HcmFwaGljc0Jvb3RMZXZlbCA9IGxldmVsOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlj b3VudCA9ICh1aW50OF90KSh0YWJsZV9pbmZvLT52ZGRfZGVwX29uX21jbGstPmNvdW50KTsKKwlm b3IgKGxldmVsID0gMDsgbGV2ZWwgPCBjb3VudDsgbGV2ZWwrKykgeworCQlpZih0YWJsZV9pbmZv LT52ZGRfZGVwX29uX21jbGstPmVudHJpZXNbbGV2ZWxdLmNsayA+PQorCQkJCWRhdGEtPnZiaW9z X2Jvb3Rfc3RhdGUubWNsa19ib290dXBfdmFsdWUpIHsKKwkJCWRhdGEtPnNtY19zdGF0ZV90YWJs ZS5NZW1vcnlCb290TGV2ZWwgPSBsZXZlbDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyBpbnQgZmlqaV9wb3B1bGF0ZV9jbG9ja19zdHJldGNoZXJfZGF0YV90 YWJsZShzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCXVpbnQzMl90IHJvLCBlZnVzZSwgZWZ1 c2UyLCBjbG9ja19mcmVxLCB2b2x0X3dpdGhvdXRfY2tzLAorCQkJdm9sdF93aXRoX2NrcywgdmFs dWU7CisJdWludDE2X3QgY2xvY2tfZnJlcV91MTY7CisJc3RydWN0IGZpamlfaHdtZ3IgKmRhdGEg PSAoc3RydWN0IGZpamlfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXVpbnQ4X3QgdHlwZSwg aSwgaiwgY2tzX3NldHRpbmcsIHN0cmV0Y2hfYW1vdW50LCBzdHJldGNoX2Ftb3VudDIsCisJCQl2 b2x0X29mZnNldCA9IDA7CisJc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKnRhYmxlX2lu Zm8gPQorCQkJKHN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICopKGh3bWdyLT5wcHRhYmxl KTsKKwlzdHJ1Y3QgcGhtX3BwdF92MV9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUgKnNj bGtfdGFibGUgPQorCQkJdGFibGVfaW5mby0+dmRkX2RlcF9vbl9zY2xrOworCisJc3RyZXRjaF9h bW91bnQgPSAodWludDhfdCl0YWJsZV9pbmZvLT5jYWNfZHRwX3RhYmxlLT51c0Nsb2NrU3RyZXRj aEFtb3VudDsKKworCS8qIFJlYWQgU01VX0VlZnVzZSB0byByZWFkIGFuZCBjYWxjdWxhdGUgUk8g YW5kIGRldGVybWluZQorCSAqIGlmIHRoZSBwYXJ0IGlzIFNTIG9yIEZGLiBpZiBSTyA+PSAxNjYw TUh6LCBwYXJ0IGlzIEZGLgorCSAqLworCWVmdXNlID0gY2dzX3JlYWRfaW5kX3JlZ2lzdGVyKGh3 bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19TTUMsCisJCQlpeFNNVV9FRlVTRV8wICsgKDE0NiAq IDQpKTsKKwllZnVzZTIgPSBjZ3NfcmVhZF9pbmRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgQ0dT X0lORF9SRUdfX1NNQywKKwkJCWl4U01VX0VGVVNFXzAgKyAoMTQ4ICogNCkpOworCWVmdXNlICY9 IDB4RkYwMDAwMDA7CisJZWZ1c2UgPSBlZnVzZSA+PiAyNDsKKwllZnVzZTIgJj0gMHhGOworCisJ aWYgKGVmdXNlMiA9PSAxKQorCQlybyA9ICgyMzAwIC0gMTM1MCkgKiBlZnVzZSAvIDI1NSArIDEz NTA7CisJZWxzZQorCQlybyA9ICgyNTAwIC0gMTAwMCkgKiBlZnVzZSAvIDI1NSArIDEwMDA7CisK KwlpZiAocm8gPj0gMTY2MCkKKwkJdHlwZSA9IDA7CisJZWxzZQorCQl0eXBlID0gMTsKKworCS8q IFBvcHVsYXRlIFN0cmV0Y2ggYW1vdW50ICovCisJZGF0YS0+c21jX3N0YXRlX3RhYmxlLkNsb2Nr U3RyZXRjaGVyQW1vdW50ID0gc3RyZXRjaF9hbW91bnQ7CisKKwkvKiBQb3B1bGF0ZSBTY2xrX0NL U19tYXN0ZXJFbjBfNyBhbmQgU2Nsa192b2x0YWdlT2Zmc2V0ICovCisJZm9yIChpID0gMDsgaSA8 IHNjbGtfdGFibGUtPmNvdW50OyBpKyspIHsKKwkJZGF0YS0+c21jX3N0YXRlX3RhYmxlLlNjbGtf Q0tTX21hc3RlckVuMF83IHw9CisJCQkJc2Nsa190YWJsZS0+ZW50cmllc1tpXS5ja3NfZW5hYmxl IDw8IGk7CisJCXZvbHRfd2l0aG91dF9ja3MgPSAodWludDMyX3QpKCgxNDA0MSAqCisJCQkoc2Ns a190YWJsZS0+ZW50cmllc1tpXS5jbGsvMTAwKSAvIDEwMDAwICsgMzU3MSArIDc1IC0gcm8pICog MTAwMCAvCisJCQkoNDAyNiAtICgxMzkyNCAqIChzY2xrX3RhYmxlLT5lbnRyaWVzW2ldLmNsay8x MDApIC8gMTAwMDApKSk7CisJCXZvbHRfd2l0aF9ja3MgPSAodWludDMyX3QpKCgxMzk0NiAqCisJ CQkoc2Nsa190YWJsZS0+ZW50cmllc1tpXS5jbGsvMTAwKSAvIDEwMDAwICsgMzMyMCArIDQ1IC0g cm8pICogMTAwMCAvCisJCQkoMzY2NCAtICgxMTQ1NCAqIChzY2xrX3RhYmxlLT5lbnRyaWVzW2ld LmNsay8xMDApIC8gMTAwMDApKSk7CisJCWlmICh2b2x0X3dpdGhvdXRfY2tzID49IHZvbHRfd2l0 aF9ja3MpCisJCQl2b2x0X29mZnNldCA9ICh1aW50OF90KSgoKHZvbHRfd2l0aG91dF9ja3MgLSB2 b2x0X3dpdGhfY2tzICsKKwkJCQkJc2Nsa190YWJsZS0+ZW50cmllc1tpXS5ja3Nfdm9mZnNldCkg KiAxMDAgLyA2MjUpICsgMSk7CisJCWRhdGEtPnNtY19zdGF0ZV90YWJsZS5TY2xrX3ZvbHRhZ2VP ZmZzZXRbaV0gPSB2b2x0X29mZnNldDsKKwl9CisKKwlQSE1fV1JJVEVfSU5ESVJFQ1RfRklFTEQo aHdtZ3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywgUFdSX0NLU19FTkFCTEUsCisJCQlTVFJF VENIX0VOQUJMRSwgMHgwKTsKKwlQSE1fV1JJVEVfSU5ESVJFQ1RfRklFTEQoaHdtZ3ItPmRldmlj ZSwgQ0dTX0lORF9SRUdfX1NNQywgUFdSX0NLU19FTkFCTEUsCisJCQltYXN0ZXJSZXNldCwgMHgx KTsKKwlQSE1fV1JJVEVfSU5ESVJFQ1RfRklFTEQoaHdtZ3ItPmRldmljZSwgQ0dTX0lORF9SRUdf X1NNQywgUFdSX0NLU19FTkFCTEUsCisJCQlzdGF0aWNFbmFibGUsIDB4MSk7CisJUEhNX1dSSVRF X0lORElSRUNUX0ZJRUxEKGh3bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19TTUMsIFBXUl9DS1Nf RU5BQkxFLAorCQkJbWFzdGVyUmVzZXQsIDB4MCk7CisKKwkvKiBQb3B1bGF0ZSBDS1MgTG9va3Vw IFRhYmxlICovCisJaWYgKHN0cmV0Y2hfYW1vdW50ID09IDEgfHwgc3RyZXRjaF9hbW91bnQgPT0g MiB8fCBzdHJldGNoX2Ftb3VudCA9PSA1KQorCQlzdHJldGNoX2Ftb3VudDIgPSAwOworCWVsc2Ug aWYgKHN0cmV0Y2hfYW1vdW50ID09IDMgfHwgc3RyZXRjaF9hbW91bnQgPT0gNCkKKwkJc3RyZXRj aF9hbW91bnQyID0gMTsKKwllbHNlIHsKKwkJcGhtX2NhcF91bnNldChod21nci0+cGxhdGZvcm1f ZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCQkJUEhNX1BsYXRmb3JtQ2Fwc19DbG9ja1N0cmV0 Y2hlcik7CisJCVBQX0FTU0VSVF9XSVRIX0NPREUoZmFsc2UsCisJCQkJIlN0cmV0Y2ggQW1vdW50 IGluIFBQVGFibGUgbm90IHN1cHBvcnRlZFxuIiwKKwkJCQlyZXR1cm4gLUVJTlZBTCk7CisJfQor CisJdmFsdWUgPSBjZ3NfcmVhZF9pbmRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgQ0dTX0lORF9S RUdfX1NNQywKKwkJCWl4UFdSX0NLU19DTlRMKTsKKwl2YWx1ZSAmPSAweEZGQzJGRjg3OworCWRh dGEtPnNtY19zdGF0ZV90YWJsZS5DS1NfTE9PS1VQVGFibGUuQ0tTX0xPT0tVUFRhYmxlRW50cnlb MF0ubWluRnJlcSA9CisJCQlmaWppX2Nsb2NrX3N0cmV0Y2hlcl9sb29rdXBfdGFibGVbc3RyZXRj aF9hbW91bnQyXVswXTsKKwlkYXRhLT5zbWNfc3RhdGVfdGFibGUuQ0tTX0xPT0tVUFRhYmxlLkNL U19MT09LVVBUYWJsZUVudHJ5WzBdLm1heEZyZXEgPQorCQkJZmlqaV9jbG9ja19zdHJldGNoZXJf bG9va3VwX3RhYmxlW3N0cmV0Y2hfYW1vdW50Ml1bMV07CisJY2xvY2tfZnJlcV91MTYgPSAodWlu dDE2X3QpKFBQX1NNQ19UT19IT1NUX1VMKGRhdGEtPnNtY19zdGF0ZV90YWJsZS4KKwkJCUdyYXBo aWNzTGV2ZWxbZGF0YS0+c21jX3N0YXRlX3RhYmxlLkdyYXBoaWNzRHBtTGV2ZWxDb3VudCAtIDFd LgorCQkJU2Nsa0ZyZXF1ZW5jeSkgLyAxMDApOworCWlmIChmaWppX2Nsb2NrX3N0cmV0Y2hlcl9s b29rdXBfdGFibGVbc3RyZXRjaF9hbW91bnQyXVswXSA8CisJCQljbG9ja19mcmVxX3UxNiAmJgor ICAgICAgICBmaWppX2Nsb2NrX3N0cmV0Y2hlcl9sb29rdXBfdGFibGVbc3RyZXRjaF9hbW91bnQy XVsxXSA+CisJCQljbG9ja19mcmVxX3UxNikgeworCQkvKiBQcm9ncmFtIFBXUl9DS1NfQ05UTC4g Q0tTX1VTRV9GT1JfTE9XX0ZSRVEgKi8KKwkJdmFsdWUgfD0gKGZpamlfY2xvY2tfc3RyZXRjaGVy X2xvb2t1cF90YWJsZVtzdHJldGNoX2Ftb3VudDJdWzNdKSA8PCAxNjsKKwkJLyogUHJvZ3JhbSBQ V1JfQ0tTX0NOVEwuIENLU19MRE9fUkVGU0VMICovCisJCXZhbHVlIHw9IChmaWppX2Nsb2NrX3N0 cmV0Y2hlcl9sb29rdXBfdGFibGVbc3RyZXRjaF9hbW91bnQyXVsyXSkgPDwgMTg7CisJCS8qIFBy b2dyYW0gUFdSX0NLU19DTlRMLiBDS1NfU1RSRVRDSF9BTU9VTlQgKi8KKwkJdmFsdWUgfD0gKGZp amlfY2xvY2tfc3RyZXRjaF9hbW91bnRfY29udmVyc2lvbgorCQkJCVtmaWppX2Nsb2NrX3N0cmV0 Y2hlcl9sb29rdXBfdGFibGVbc3RyZXRjaF9hbW91bnQyXVszXV0KKwkJCQkgW3N0cmV0Y2hfYW1v dW50XSkgPDwgMzsKKwl9CisJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VTKGRhdGEtPnNtY19z dGF0ZV90YWJsZS5DS1NfTE9PS1VQVGFibGUuCisJCQlDS1NfTE9PS1VQVGFibGVFbnRyeVswXS5t aW5GcmVxKTsKKwlDT05WRVJUX0ZST01fSE9TVF9UT19TTUNfVVMoZGF0YS0+c21jX3N0YXRlX3Rh YmxlLkNLU19MT09LVVBUYWJsZS4KKwkJCUNLU19MT09LVVBUYWJsZUVudHJ5WzBdLm1heEZyZXEp OworCWRhdGEtPnNtY19zdGF0ZV90YWJsZS5DS1NfTE9PS1VQVGFibGUuQ0tTX0xPT0tVUFRhYmxl RW50cnlbMF0uc2V0dGluZyA9CisJCQlmaWppX2Nsb2NrX3N0cmV0Y2hlcl9sb29rdXBfdGFibGVb c3RyZXRjaF9hbW91bnQyXVsyXSAmIDB4N0Y7CisJZGF0YS0+c21jX3N0YXRlX3RhYmxlLkNLU19M T09LVVBUYWJsZS5DS1NfTE9PS1VQVGFibGVFbnRyeVswXS5zZXR0aW5nIHw9CisJCQkoZmlqaV9j bG9ja19zdHJldGNoZXJfbG9va3VwX3RhYmxlW3N0cmV0Y2hfYW1vdW50Ml1bM10pIDw8IDc7CisK KwljZ3Nfd3JpdGVfaW5kX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19TTUMs CisJCQlpeFBXUl9DS1NfQ05UTCwgdmFsdWUpOworCisJLyogUG9wdWxhdGUgRERUIExvb2t1cCBU YWJsZSAqLworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJLyogQXNzaWduIHRoZSBtaW5p bXVtIGFuZCBtYXhpbXVtIFZJRCBzdG9yZWQKKwkJICogaW4gdGhlIGxhc3Qgcm93IG9mIENsb2Nr IFN0cmV0Y2hlciBWb2x0YWdlIFRhYmxlLgorCQkgKi8KKwkJZGF0YS0+c21jX3N0YXRlX3RhYmxl LkNsb2NrU3RyZXRjaGVyRGF0YVRhYmxlLgorCQlDbG9ja1N0cmV0Y2hlckRhdGFUYWJsZUVudHJ5 W2ldLm1pblZJRCA9CisJCQkJKHVpbnQ4X3QpIGZpamlfY2xvY2tfc3RyZXRjaGVyX2RkdF90YWJs ZVt0eXBlXVtpXVsyXTsKKwkJZGF0YS0+c21jX3N0YXRlX3RhYmxlLkNsb2NrU3RyZXRjaGVyRGF0 YVRhYmxlLgorCQlDbG9ja1N0cmV0Y2hlckRhdGFUYWJsZUVudHJ5W2ldLm1heFZJRCA9CisJCQkJ KHVpbnQ4X3QpIGZpamlfY2xvY2tfc3RyZXRjaGVyX2RkdF90YWJsZVt0eXBlXVtpXVszXTsKKwkJ LyogTG9vcCB0aHJvdWdoIGVhY2ggU0NMSyBhbmQgY2hlY2sgdGhlIGZyZXF1ZW5jeQorCQkgKiB0 byBzZWUgaWYgaXQgbGllcyB3aXRoaW4gdGhlIGZyZXF1ZW5jeSBmb3IgY2xvY2sgc3RyZXRjaGVy LgorCQkgKi8KKwkJZm9yIChqID0gMDsgaiA8IGRhdGEtPnNtY19zdGF0ZV90YWJsZS5HcmFwaGlj c0RwbUxldmVsQ291bnQ7IGorKykgeworCQkJY2tzX3NldHRpbmcgPSAwOworCQkJY2xvY2tfZnJl cSA9IFBQX1NNQ19UT19IT1NUX1VMKAorCQkJCQlkYXRhLT5zbWNfc3RhdGVfdGFibGUuR3JhcGhp Y3NMZXZlbFtqXS5TY2xrRnJlcXVlbmN5KTsKKwkJCS8qIENoZWNrIHRoZSBhbGxvd2VkIGZyZXF1 ZW5jeSBhZ2FpbnN0IHRoZSBzY2xrIGxldmVsW2pdLgorCQkJICogIFNjbGsncyBlbmRpYW5uZXNz IGhhcyBhbHJlYWR5IGJlZW4gY29udmVydGVkLAorCQkJICogIGFuZCBpdCdzIGluIDEwS2h6IHVu aXQsCisJCQkgKiAgYXMgb3Bwb3NlZCB0byBEYXRhIHRhYmxlLCB3aGljaCBpcyBpbiBNaHogdW5p dC4KKwkJCSAqLworCQkJaWYgKGNsb2NrX2ZyZXEgPj0KKwkJCQkJKGZpamlfY2xvY2tfc3RyZXRj aGVyX2RkdF90YWJsZVt0eXBlXVtpXVswXSkgKiAxMDApIHsKKwkJCQlja3Nfc2V0dGluZyB8PSAw eDI7CisJCQkJaWYgKGNsb2NrX2ZyZXEgPAorCQkJCQkJKGZpamlfY2xvY2tfc3RyZXRjaGVyX2Rk dF90YWJsZVt0eXBlXVtpXVsxXSkgKiAxMDApCisJCQkJCWNrc19zZXR0aW5nIHw9IDB4MTsKKwkJ CX0KKwkJCWRhdGEtPnNtY19zdGF0ZV90YWJsZS5DbG9ja1N0cmV0Y2hlckRhdGFUYWJsZS4KKwkJ CUNsb2NrU3RyZXRjaGVyRGF0YVRhYmxlRW50cnlbaV0uc2V0dGluZyB8PSBja3Nfc2V0dGluZyA8 PCAoaiAqIDIpOworCQl9CisJCUNPTlZFUlRfRlJPTV9IT1NUX1RPX1NNQ19VUyhkYXRhLT5zbWNf c3RhdGVfdGFibGUuCisJCQkJQ2xvY2tTdHJldGNoZXJEYXRhVGFibGUuCisJCQkJQ2xvY2tTdHJl dGNoZXJEYXRhVGFibGVFbnRyeVtpXS5zZXR0aW5nKTsKKwl9CisKKwl2YWx1ZSA9IGNnc19yZWFk X2luZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01DLCBpeFBXUl9DS1Nf Q05UTCk7CisJdmFsdWUgJj0gMHhGRkZGRkZGRTsKKwljZ3Nfd3JpdGVfaW5kX3JlZ2lzdGVyKGh3 bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19TTUMsIGl4UFdSX0NLU19DTlRMLCB2YWx1ZSk7CisK KwlyZXR1cm4gMDsKK30KKworLyoqCisqIFBvcHVsYXRlcyB0aGUgU01DIFZSQ29uZmlnIGZpZWxk IGluIERQTSB0YWJsZS4KKyoKKyogQHBhcmFtICAgIGh3bWdyICAgdGhlIGFkZHJlc3Mgb2YgdGhl IGhhcmR3YXJlIG1hbmFnZXIKKyogQHBhcmFtICAgIHRhYmxlICAgdGhlIFNNQyBEUE0gdGFibGUg c3RydWN0dXJlIHRvIGJlIHBvcHVsYXRlZAorKiBAcmV0dXJuICAgYWx3YXlzIDAKKyovCitzdGF0 aWMgaW50IGZpamlfcG9wdWxhdGVfdnJfY29uZmlnKHN0cnVjdCBwcF9od21nciAqaHdtZ3IsCisJ CXN0cnVjdCBTTVU3M19EaXNjcmV0ZV9EcG1UYWJsZSAqdGFibGUpCit7CisJc3RydWN0IGZpamlf aHdtZ3IgKmRhdGEgPSAoc3RydWN0IGZpamlfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXVp bnQxNl90IGNvbmZpZzsKKworCWNvbmZpZyA9IFZSX01FUkdFRF9XSVRIX1ZEREM7CisJdGFibGUt PlZSQ29uZmlnIHw9IChjb25maWcgPDwgVlJDT05GX1ZEREdGWF9TSElGVCk7CisKKwkvKiBTZXQg VmRkYyBWb2x0YWdlIENvbnRyb2xsZXIgKi8KKwlpZihGSUpJX1ZPTFRBR0VfQ09OVFJPTF9CWV9T VklEMiA9PSBkYXRhLT52b2x0YWdlX2NvbnRyb2wpIHsKKwkJY29uZmlnID0gVlJfU1ZJMl9QTEFO RV8xOworCQl0YWJsZS0+VlJDb25maWcgfD0gY29uZmlnOworCX0gZWxzZSB7CisJCVBQX0FTU0VS VF9XSVRIX0NPREUoZmFsc2UsCisJCQkJIlZEREMgc2hvdWxkIGJlIG9uIFNWSTIgY29udHJvbCBp biBtZXJnZWQgbW9kZSEiLCk7CisJfQorCS8qIFNldCBWZGRjaSBWb2x0YWdlIENvbnRyb2xsZXIg Ki8KKwlpZihGSUpJX1ZPTFRBR0VfQ09OVFJPTF9CWV9TVklEMiA9PSBkYXRhLT52ZGRjaV9jb250 cm9sKSB7CisJCWNvbmZpZyA9IFZSX1NWSTJfUExBTkVfMjsgIC8qIG9ubHkgaW4gbWVyZ2VkIG1v ZGUgKi8KKwkJdGFibGUtPlZSQ29uZmlnIHw9IChjb25maWcgPDwgVlJDT05GX1ZERENJX1NISUZU KTsKKwl9IGVsc2UgaWYgKEZJSklfVk9MVEFHRV9DT05UUk9MX0JZX0dQSU8gPT0gZGF0YS0+dmRk Y2lfY29udHJvbCkgeworCQljb25maWcgPSBWUl9TTUlPX1BBVFRFUk5fMTsKKwkJdGFibGUtPlZS Q29uZmlnIHw9IChjb25maWcgPDwgVlJDT05GX1ZERENJX1NISUZUKTsKKwl9IGVsc2UgeworCQlj b25maWcgPSBWUl9TVEFUSUNfVk9MVEFHRTsKKwkJdGFibGUtPlZSQ29uZmlnIHw9IChjb25maWcg PDwgVlJDT05GX1ZERENJX1NISUZUKTsKKwl9CisJLyogU2V0IE12ZGQgVm9sdGFnZSBDb250cm9s bGVyICovCisJaWYoRklKSV9WT0xUQUdFX0NPTlRST0xfQllfU1ZJRDIgPT0gZGF0YS0+bXZkZF9j b250cm9sKSB7CisJCWNvbmZpZyA9IFZSX1NWSTJfUExBTkVfMjsKKwkJdGFibGUtPlZSQ29uZmln IHw9IChjb25maWcgPDwgVlJDT05GX01WRERfU0hJRlQpOworCX0gZWxzZSBpZihGSUpJX1ZPTFRB R0VfQ09OVFJPTF9CWV9HUElPID09IGRhdGEtPm12ZGRfY29udHJvbCkgeworCQljb25maWcgPSBW Ul9TTUlPX1BBVFRFUk5fMjsKKwkJdGFibGUtPlZSQ29uZmlnIHw9IChjb25maWcgPDwgVlJDT05G X01WRERfU0hJRlQpOworCX0gZWxzZSB7CisJCWNvbmZpZyA9IFZSX1NUQVRJQ19WT0xUQUdFOwor CQl0YWJsZS0+VlJDb25maWcgfD0gKGNvbmZpZyA8PCBWUkNPTkZfTVZERF9TSElGVCk7CisJfQor CisJcmV0dXJuIDA7Cit9CisKKy8qKgorKiBJbml0aWFsaXplcyB0aGUgU01DIHRhYmxlIGFuZCB1 cGxvYWRzIGl0CisqCisqIEBwYXJhbSAgICBod21nciAgdGhlIGFkZHJlc3Mgb2YgdGhlIHBvd2Vy cGxheSBoYXJkd2FyZSBtYW5hZ2VyLgorKiBAcGFyYW0gICAgcElucHV0ICB0aGUgcG9pbnRlciB0 byBpbnB1dCBkYXRhIChQb3dlclN0YXRlKQorKiBAcmV0dXJuICAgYWx3YXlzIDAKKyovCitzdGF0 aWMgaW50IGZpamlfaW5pdF9zbWNfdGFibGUoc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwlp bnQgcmVzdWx0OworCXN0cnVjdCBmaWppX2h3bWdyICpkYXRhID0gKHN0cnVjdCBmaWppX2h3bWdy ICopKGh3bWdyLT5iYWNrZW5kKTsKKwlzdHJ1Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqdGFi bGVfaW5mbyA9CisJCQkoc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKikoaHdtZ3ItPnBw dGFibGUpOworCXN0cnVjdCBTTVU3M19EaXNjcmV0ZV9EcG1UYWJsZSAqdGFibGUgPSAmKGRhdGEt PnNtY19zdGF0ZV90YWJsZSk7CisJY29uc3Qgc3RydWN0IGZpamlfdWx2X3Bhcm0gKnVsdiA9ICYo ZGF0YS0+dWx2KTsKKwl1aW50OF90IGk7CisJc3RydWN0IHBwX2F0b21jdHJsX2dwaW9fcGluX2Fz c2lnbm1lbnQgZ3Bpb19waW47CisKKwlyZXN1bHQgPSBmaWppX3NldHVwX2RlZmF1bHRfZHBtX3Rh Ymxlcyhod21ncik7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgwID09IHJlc3VsdCwKKwkJCSJGYWls ZWQgdG8gc2V0dXAgZGVmYXVsdCBEUE0gdGFibGVzISIsIHJldHVybiByZXN1bHQpOworCisJaWYo RklKSV9WT0xUQUdFX0NPTlRST0xfTk9ORSAhPSBkYXRhLT52b2x0YWdlX2NvbnRyb2wpCisJCWZp amlfcG9wdWxhdGVfc21jX3ZvbHRhZ2VfdGFibGVzKGh3bWdyLCB0YWJsZSk7CisKKwlpZiAocGht X2NhcF9lbmFibGVkKGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywKKwkJ CVBITV9QbGF0Zm9ybUNhcHNfQXV0b21hdGljRENUcmFuc2l0aW9uKSkKKwkJdGFibGUtPlN5c3Rl bUZsYWdzIHw9IFBQU01DX1NZU1RFTUZMQUdfR1BJT19EQzsKKworCWlmIChwaG1fY2FwX2VuYWJs ZWQoaHdtZ3ItPnBsYXRmb3JtX2Rlc2NyaXB0b3IucGxhdGZvcm1DYXBzLAorCQkJUEhNX1BsYXRm b3JtQ2Fwc19TdGVwVmRkYykpCisJCXRhYmxlLT5TeXN0ZW1GbGFncyB8PSBQUFNNQ19TWVNURU1G TEFHX1NURVBWRERDOworCisJaWYgKGRhdGEtPmlzX21lbW9yeV9nZGRyNSkKKwkJdGFibGUtPlN5 c3RlbUZsYWdzIHw9IFBQU01DX1NZU1RFTUZMQUdfR0REUjU7CisKKwlpZiAodWx2LT51bHZfc3Vw cG9ydGVkICYmIHRhYmxlX2luZm8tPnVzX3Vsdl92b2x0YWdlX29mZnNldCkgeworCQlyZXN1bHQg PSBmaWppX3BvcHVsYXRlX3Vsdl9zdGF0ZShod21nciwgdGFibGUpOworCQlQUF9BU1NFUlRfV0lU SF9DT0RFKDAgPT0gcmVzdWx0LAorCQkJCSJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBVTFYgc3RhdGUh IiwgcmV0dXJuIHJlc3VsdCk7CisJCWNnc193cml0ZV9pbmRfcmVnaXN0ZXIoaHdtZ3ItPmRldmlj ZSwgQ0dTX0lORF9SRUdfX1NNQywKKwkJCQlpeENHX1VMVl9QQVJBTUVURVIsIHVsdi0+Y2dfdWx2 X3BhcmFtZXRlcik7CisJfQorCisJcmVzdWx0ID0gZmlqaV9wb3B1bGF0ZV9zbWNfbGlua19sZXZl bChod21nciwgdGFibGUpOworCVBQX0FTU0VSVF9XSVRIX0NPREUoMCA9PSByZXN1bHQsCisJCQki RmFpbGVkIHRvIGluaXRpYWxpemUgTGluayBMZXZlbCEiLCByZXR1cm4gcmVzdWx0KTsKKworCXJl c3VsdCA9IGZpamlfcG9wdWxhdGVfYWxsX2dyYXBoaWNfbGV2ZWxzKGh3bWdyKTsKKwlQUF9BU1NF UlRfV0lUSF9DT0RFKDAgPT0gcmVzdWx0LAorCQkJIkZhaWxlZCB0byBpbml0aWFsaXplIEdyYXBo aWNzIExldmVsISIsIHJldHVybiByZXN1bHQpOworCisJcmVzdWx0ID0gZmlqaV9wb3B1bGF0ZV9h bGxfbWVtb3J5X2xldmVscyhod21ncik7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgwID09IHJlc3Vs dCwKKwkJCSJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBNZW1vcnkgTGV2ZWwhIiwgcmV0dXJuIHJlc3Vs dCk7CisKKwlyZXN1bHQgPSBmaWppX3BvcHVsYXRlX3NtY19hY3BpX2xldmVsKGh3bWdyLCB0YWJs ZSk7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgwID09IHJlc3VsdCwKKwkJCSJGYWlsZWQgdG8gaW5p dGlhbGl6ZSBBQ1BJIExldmVsISIsIHJldHVybiByZXN1bHQpOworCisJcmVzdWx0ID0gZmlqaV9w b3B1bGF0ZV9zbWNfdmNlX2xldmVsKGh3bWdyLCB0YWJsZSk7CisJUFBfQVNTRVJUX1dJVEhfQ09E RSgwID09IHJlc3VsdCwKKwkJCSJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBWQ0UgTGV2ZWwhIiwgcmV0 dXJuIHJlc3VsdCk7CisKKwlyZXN1bHQgPSBmaWppX3BvcHVsYXRlX3NtY19hY3BfbGV2ZWwoaHdt Z3IsIHRhYmxlKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKDAgPT0gcmVzdWx0LAorCQkJIkZhaWxl ZCB0byBpbml0aWFsaXplIEFDUCBMZXZlbCEiLCByZXR1cm4gcmVzdWx0KTsKKworCXJlc3VsdCA9 IGZpamlfcG9wdWxhdGVfc21jX3NhbXVfbGV2ZWwoaHdtZ3IsIHRhYmxlKTsKKwlQUF9BU1NFUlRf V0lUSF9DT0RFKDAgPT0gcmVzdWx0LAorCQkJIkZhaWxlZCB0byBpbml0aWFsaXplIFNBTVUgTGV2 ZWwhIiwgcmV0dXJuIHJlc3VsdCk7CisKKwkvKiBTaW5jZSBvbmx5IHRoZSBpbml0aWFsIHN0YXRl IGlzIGNvbXBsZXRlbHkgc2V0IHVwIGF0IHRoaXMgcG9pbnQKKwkgKiAodGhlIG90aGVyIHN0YXRl cyBhcmUganVzdCBjb3BpZXMgb2YgdGhlIGJvb3Qgc3RhdGUpIHdlIG9ubHkKKwkgKiBuZWVkIHRv IHBvcHVsYXRlIHRoZSAgQVJCIHNldHRpbmdzIGZvciB0aGUgaW5pdGlhbCBzdGF0ZS4KKwkgKi8K KwlyZXN1bHQgPSBmaWppX3Byb2dyYW1fbWVtb3J5X3RpbWluZ19wYXJhbWV0ZXJzKGh3bWdyKTsK KwlQUF9BU1NFUlRfV0lUSF9DT0RFKDAgPT0gcmVzdWx0LAorCQkJIkZhaWxlZCB0byBXcml0ZSBB UkIgc2V0dGluZ3MgZm9yIHRoZSBpbml0aWFsIHN0YXRlLiIsIHJldHVybiByZXN1bHQpOworCisJ cmVzdWx0ID0gZmlqaV9wb3B1bGF0ZV9zbWNfdXZkX2xldmVsKGh3bWdyLCB0YWJsZSk7CisJUFBf QVNTRVJUX1dJVEhfQ09ERSgwID09IHJlc3VsdCwKKwkJCSJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBV VkQgTGV2ZWwhIiwgcmV0dXJuIHJlc3VsdCk7CisKKwlyZXN1bHQgPSBmaWppX3BvcHVsYXRlX3Nt Y19ib290X2xldmVsKGh3bWdyLCB0YWJsZSk7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgwID09IHJl c3VsdCwKKwkJCSJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBCb290IExldmVsISIsIHJldHVybiByZXN1 bHQpOworCisJcmVzdWx0ID0gZmlqaV9wb3B1bGF0ZV9zbWNfaW5pdGFpbGlhbF9zdGF0ZShod21n cik7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgwID09IHJlc3VsdCwKKwkJCSJGYWlsZWQgdG8gaW5p dGlhbGl6ZSBCb290IFN0YXRlISIsIHJldHVybiByZXN1bHQpOworCisJcmVzdWx0ID0gZmlqaV9w b3B1bGF0ZV9iYXBtX3BhcmFtZXRlcnNfaW5fZHBtX3RhYmxlKGh3bWdyKTsKKwlQUF9BU1NFUlRf V0lUSF9DT0RFKDAgPT0gcmVzdWx0LAorCQkJIkZhaWxlZCB0byBwb3B1bGF0ZSBCQVBNIFBhcmFt ZXRlcnMhIiwgcmV0dXJuIHJlc3VsdCk7CisKKwlpZiAocGhtX2NhcF9lbmFibGVkKGh3bWdyLT5w bGF0Zm9ybV9kZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywKKwkJCVBITV9QbGF0Zm9ybUNhcHNfQ2xv Y2tTdHJldGNoZXIpKSB7CisJCXJlc3VsdCA9IGZpamlfcG9wdWxhdGVfY2xvY2tfc3RyZXRjaGVy X2RhdGFfdGFibGUoaHdtZ3IpOworCQlQUF9BU1NFUlRfV0lUSF9DT0RFKDAgPT0gcmVzdWx0LAor CQkJCSJGYWlsZWQgdG8gcG9wdWxhdGUgQ2xvY2sgU3RyZXRjaGVyIERhdGEgVGFibGUhIiwKKwkJ CQlyZXR1cm4gcmVzdWx0KTsKKwl9CisKKwl0YWJsZS0+R3JhcGhpY3NWb2x0YWdlQ2hhbmdlRW5h YmxlICA9IDE7CisJdGFibGUtPkdyYXBoaWNzVGhlcm1UaHJvdHRsZUVuYWJsZSAgPSAxOworCXRh YmxlLT5HcmFwaGljc0ludGVydmFsID0gMTsKKwl0YWJsZS0+Vm9sdGFnZUludGVydmFsICA9IDE7 CisJdGFibGUtPlRoZXJtYWxJbnRlcnZhbCAgPSAxOworCXRhYmxlLT5UZW1wZXJhdHVyZUxpbWl0 SGlnaCA9CisJCQl0YWJsZV9pbmZvLT5jYWNfZHRwX3RhYmxlLT51c1RhcmdldE9wZXJhdGluZ1Rl bXAgKgorCQkJRklKSV9RODhfRk9STUFUX0NPTlZFUlNJT05fVU5JVDsKKwl0YWJsZS0+VGVtcGVy YXR1cmVMaW1pdExvdyAgPQorCQkJKHRhYmxlX2luZm8tPmNhY19kdHBfdGFibGUtPnVzVGFyZ2V0 T3BlcmF0aW5nVGVtcCAtIDEpICoKKwkJCUZJSklfUTg4X0ZPUk1BVF9DT05WRVJTSU9OX1VOSVQ7 CisJdGFibGUtPk1lbW9yeVZvbHRhZ2VDaGFuZ2VFbmFibGUgPSAxOworCXRhYmxlLT5NZW1vcnlJ bnRlcnZhbCA9IDE7CisJdGFibGUtPlZvbHRhZ2VSZXNwb25zZVRpbWUgPSAwOworCXRhYmxlLT5Q aGFzZVJlc3BvbnNlVGltZSA9IDA7CisJdGFibGUtPk1lbW9yeVRoZXJtVGhyb3R0bGVFbmFibGUg PSAxOworCXRhYmxlLT5QQ0llQm9vdExpbmtMZXZlbCA9IDA7ICAgICAgLyogMDpHZW4xIDE6R2Vu MiAyOkdlbjMqLworCXRhYmxlLT5QQ0llR2VuSW50ZXJ2YWwgPSAxOworCisJcmVzdWx0ID0gZmlq aV9wb3B1bGF0ZV92cl9jb25maWcoaHdtZ3IsIHRhYmxlKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RF KDAgPT0gcmVzdWx0LAorCQkJIkZhaWxlZCB0byBwb3B1bGF0ZSBWUkNvbmZpZyBzZXR0aW5nISIs IHJldHVybiByZXN1bHQpOworCisJdGFibGUtPlRoZXJtR3BpbyA9IDE3OworCXRhYmxlLT5TY2xr U3RlcFNpemUgPSAweDQwMDA7CisKKwlpZiAoYXRvbWN0cmxfZ2V0X3BwX2Fzc2lnbl9waW4oaHdt Z3IsIFZERENfVlJIT1RfR1BJT19QSU5JRCwgJmdwaW9fcGluKSkgeworCQl0YWJsZS0+VlJIb3RH cGlvID0gZ3Bpb19waW4udWNfZ3Bpb19waW5fYml0X3NoaWZ0OworCQlwaG1fY2FwX3NldChod21n ci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCQkJUEhNX1BsYXRmb3JtQ2Fw c19SZWd1bGF0b3JIb3QpOworCX0gZWxzZSB7CisJCXRhYmxlLT5WUkhvdEdwaW8gPSBGSUpJX1VO VVNFRF9HUElPX1BJTjsKKwkJcGhtX2NhcF91bnNldChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRv ci5wbGF0Zm9ybUNhcHMsCisJCQkJUEhNX1BsYXRmb3JtQ2Fwc19SZWd1bGF0b3JIb3QpOworCX0K KworCWlmIChhdG9tY3RybF9nZXRfcHBfYXNzaWduX3Bpbihod21nciwgUFBfQUNfRENfU1dJVENI X0dQSU9fUElOSUQsCisJCQkmZ3Bpb19waW4pKSB7CisJCXRhYmxlLT5BY0RjR3BpbyA9IGdwaW9f cGluLnVjX2dwaW9fcGluX2JpdF9zaGlmdDsKKwkJcGhtX2NhcF9zZXQoaHdtZ3ItPnBsYXRmb3Jt X2Rlc2NyaXB0b3IucGxhdGZvcm1DYXBzLAorCQkJCVBITV9QbGF0Zm9ybUNhcHNfQXV0b21hdGlj RENUcmFuc2l0aW9uKTsKKwl9IGVsc2UgeworCQl0YWJsZS0+QWNEY0dwaW8gPSBGSUpJX1VOVVNF RF9HUElPX1BJTjsKKwkJcGhtX2NhcF91bnNldChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5w bGF0Zm9ybUNhcHMsCisJCQkJUEhNX1BsYXRmb3JtQ2Fwc19BdXRvbWF0aWNEQ1RyYW5zaXRpb24p OworCX0KKworCS8qIFRoZXJtYWwgT3V0cHV0IEdQSU8gKi8KKwlpZiAoYXRvbWN0cmxfZ2V0X3Bw X2Fzc2lnbl9waW4oaHdtZ3IsIFRIRVJNQUxfSU5UX09VVFBVVF9HUElPX1BJTklELAorCQkJJmdw aW9fcGluKSkgeworCQlwaG1fY2FwX3NldChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0 Zm9ybUNhcHMsCisJCQkJUEhNX1BsYXRmb3JtQ2Fwc19UaGVybWFsT3V0R1BJTyk7CisKKwkJdGFi bGUtPlRoZXJtT3V0R3BpbyA9IGdwaW9fcGluLnVjX2dwaW9fcGluX2JpdF9zaGlmdDsKKworCQkv KiBGb3IgcG9ybGFyaXR5IHJlYWQgR1BJT1BBRF9BIHdpdGggYXNzaWduZWQgR3BpbyBwaW4KKwkJ ICogc2luY2UgVkJJT1Mgd2lsbCBwcm9ncmFtIHRoaXMgcmVnaXN0ZXIgdG8gc2V0ICdpbmFjdGl2 ZSBzdGF0ZScsCisJCSAqIGRyaXZlciBjYW4gdGhlbiBkZXRlcm1pbmUgJ2FjdGl2ZSBzdGF0ZScg ZnJvbSB0aGlzIGFuZAorCQkgKiBwcm9ncmFtIFNNVSB3aXRoIGNvcnJlY3QgcG9sYXJpdHkKKwkJ ICovCisJCXRhYmxlLT5UaGVybU91dFBvbGFyaXR5ID0gKDAgPT0gKGNnc19yZWFkX3JlZ2lzdGVy KGh3bWdyLT5kZXZpY2UsIG1tR1BJT1BBRF9BKSAmCisJCQkJKDEgPDwgZ3Bpb19waW4udWNfZ3Bp b19waW5fYml0X3NoaWZ0KSkpID8gMTowOworCQl0YWJsZS0+VGhlcm1PdXRNb2RlID0gU01VN19U SEVSTV9PVVRfTU9ERV9USEVSTV9PTkxZOworCisJCS8qIGlmIHJlcXVpcmVkLCBjb21iaW5lIFZS SG90L1BDQyB3aXRoIHRoZXJtYWwgb3V0IEdQSU8gKi8KKwkJaWYocGhtX2NhcF9lbmFibGVkKGh3 bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywKKwkJCQlQSE1fUGxhdGZvcm1D YXBzX1JlZ3VsYXRvckhvdCkgJiYKKwkJCXBobV9jYXBfZW5hYmxlZChod21nci0+cGxhdGZvcm1f ZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCQkJCVBITV9QbGF0Zm9ybUNhcHNfQ29tYmluZVBD Q1dpdGhUaGVybWFsU2lnbmFsKSkKKwkJCXRhYmxlLT5UaGVybU91dE1vZGUgPSBTTVU3X1RIRVJN X09VVF9NT0RFX1RIRVJNX1ZSSE9UOworCX0gZWxzZSB7CisJCXBobV9jYXBfdW5zZXQoaHdtZ3It PnBsYXRmb3JtX2Rlc2NyaXB0b3IucGxhdGZvcm1DYXBzLAorCQkJCVBITV9QbGF0Zm9ybUNhcHNf VGhlcm1hbE91dEdQSU8pOworCQl0YWJsZS0+VGhlcm1PdXRHcGlvID0gMTc7CisJCXRhYmxlLT5U aGVybU91dFBvbGFyaXR5ID0gMTsKKwkJdGFibGUtPlRoZXJtT3V0TW9kZSA9IFNNVTdfVEhFUk1f T1VUX01PREVfRElTQUJMRTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgU01VNzNfTUFYX0VOVFJJ RVNfU01JTzsgaSsrKQorCQl0YWJsZS0+U21pb1tpXSA9IFBQX0hPU1RfVE9fU01DX1VMKHRhYmxl LT5TbWlvW2ldKTsKKworCUNPTlZFUlRfRlJPTV9IT1NUX1RPX1NNQ19VTCh0YWJsZS0+U3lzdGVt RmxhZ3MpOworCUNPTlZFUlRfRlJPTV9IT1NUX1RPX1NNQ19VTCh0YWJsZS0+VlJDb25maWcpOwor CUNPTlZFUlRfRlJPTV9IT1NUX1RPX1NNQ19VTCh0YWJsZS0+U21pb01hc2sxKTsKKwlDT05WRVJU X0ZST01fSE9TVF9UT19TTUNfVUwodGFibGUtPlNtaW9NYXNrMik7CisJQ09OVkVSVF9GUk9NX0hP U1RfVE9fU01DX1VMKHRhYmxlLT5TY2xrU3RlcFNpemUpOworCUNPTlZFUlRfRlJPTV9IT1NUX1RP X1NNQ19VUyh0YWJsZS0+VGVtcGVyYXR1cmVMaW1pdEhpZ2gpOworCUNPTlZFUlRfRlJPTV9IT1NU X1RPX1NNQ19VUyh0YWJsZS0+VGVtcGVyYXR1cmVMaW1pdExvdyk7CisJQ09OVkVSVF9GUk9NX0hP U1RfVE9fU01DX1VTKHRhYmxlLT5Wb2x0YWdlUmVzcG9uc2VUaW1lKTsKKwlDT05WRVJUX0ZST01f SE9TVF9UT19TTUNfVVModGFibGUtPlBoYXNlUmVzcG9uc2VUaW1lKTsKKworCS8qIFVwbG9hZCBh bGwgZHBtIGRhdGEgdG8gU01DIG1lbW9yeS4oZHBtIGxldmVsLCBkcG0gbGV2ZWwgY291bnQgZXRj KSAqLworCXJlc3VsdCA9IGZpamlfY29weV9ieXRlc190b19zbWMoaHdtZ3ItPnNtdW1nciwKKwkJ CWRhdGEtPmRwbV90YWJsZV9zdGFydCArCisJCQlvZmZzZXRvZihTTVU3M19EaXNjcmV0ZV9EcG1U YWJsZSwgU3lzdGVtRmxhZ3MpLAorCQkJKHVpbnQ4X3QgKikmKHRhYmxlLT5TeXN0ZW1GbGFncyks CisJCQlzaXplb2YoU01VNzNfRGlzY3JldGVfRHBtVGFibGUpIC0gMyAqIHNpemVvZihTTVU3M19Q SURDb250cm9sbGVyKSwKKwkJCWRhdGEtPnNyYW1fZW5kKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RF KDAgPT0gcmVzdWx0LAorCQkJIkZhaWxlZCB0byB1cGxvYWQgZHBtIGRhdGEgdG8gU01DIG1lbW9y eSEiLCByZXR1cm4gcmVzdWx0KTsKKworCXJldHVybiAwOworfQorCisvKioKKyogSW5pdGlhbGl6 ZSB0aGUgQVJCIERSQU0gdGltaW5nIHRhYmxlJ3MgaW5kZXggZmllbGQuCisqCisqIEBwYXJhbSAg ICBod21nciAgdGhlIGFkZHJlc3Mgb2YgdGhlIHBvd2VycGxheSBoYXJkd2FyZSBtYW5hZ2VyLgor KiBAcmV0dXJuICAgYWx3YXlzIDAKKyovCitzdGF0aWMgaW50IGZpamlfaW5pdF9hcmJfdGFibGVf aW5kZXgoc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwljb25zdCBzdHJ1Y3QgZmlqaV9od21n ciAqZGF0YSA9IChzdHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJdWludDMy X3QgdG1wOworCWludCByZXN1bHQ7CisKKwkvKiBUaGlzIGlzIGEgcmVhZC1tb2RpZnktd3JpdGUg b24gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIEFSQiB0YWJsZS4KKwkgKiBUaGUgZmlyc3QgYnl0ZSBp biB0aGUgU01VNzNfRGlzY3JldGVfTUNBcmJEcmFtVGltaW5nVGFibGUgc3RydWN0dXJlCisJICog aXMgdGhlIGZpZWxkICdjdXJyZW50Jy4KKwkgKiBUaGlzIHNvbHV0aW9uIGlzIHVnbHksIGJ1dCB3 ZSBuZXZlciB3cml0ZSB0aGUgd2hvbGUgdGFibGUgb25seQorCSAqIGluZGl2aWR1YWwgZmllbGRz IGluIGl0LgorCSAqIEluIHJlYWxpdHkgdGhpcyBmaWVsZCBzaG91bGQgbm90IGJlIGluIHRoYXQg c3RydWN0dXJlCisJICogYnV0IGluIGEgc29mdCByZWdpc3Rlci4KKwkgKi8KKwlyZXN1bHQgPSBm aWppX3JlYWRfc21jX3NyYW1fZHdvcmQoaHdtZ3ItPnNtdW1nciwKKwkJCWRhdGEtPmFyYl90YWJs ZV9zdGFydCwgJnRtcCwgZGF0YS0+c3JhbV9lbmQpOworCisJaWYgKHJlc3VsdCkKKwkJcmV0dXJu IHJlc3VsdDsKKworCXRtcCAmPSAweDAwRkZGRkZGOworCXRtcCB8PSAoKHVpbnQzMl90KU1DX0NH X0FSQl9GUkVRX0YxKSA8PCAyNDsKKworCXJldHVybiBmaWppX3dyaXRlX3NtY19zcmFtX2R3b3Jk KGh3bWdyLT5zbXVtZ3IsCisJCQlkYXRhLT5hcmJfdGFibGVfc3RhcnQsICB0bXAsIGRhdGEtPnNy YW1fZW5kKTsKK30KKworc3RhdGljIGludCBmaWppX2VuYWJsZV92cmhvdF9ncGlvX2ludGVycnVw dChzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCWlmKHBobV9jYXBfZW5hYmxlZChod21nci0+ cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCQlQSE1fUGxhdGZvcm1DYXBzX1Jl Z3VsYXRvckhvdCkpCisJCXJldHVybiBzbXVtX3NlbmRfbXNnX3RvX3NtYyhod21nci0+c211bWdy LAorCQkJCVBQU01DX01TR19FbmFibGVWUkhvdEdQSU9JbnRlcnJ1cHQpOworCisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBpbnQgZmlqaV9lbmFibGVfc2Nsa19jb250cm9sKHN0cnVjdCBwcF9od21n ciAqaHdtZ3IpCit7CisJUEhNX1dSSVRFX0lORElSRUNUX0ZJRUxEKGh3bWdyLT5kZXZpY2UsIENH U19JTkRfUkVHX19TTUMsIFNDTEtfUFdSTUdUX0NOVEwsCisJCQlTQ0xLX1BXUk1HVF9PRkYsIDAp OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpamlfZW5hYmxlX3VsdihzdHJ1Y3QgcHBf aHdtZ3IgKmh3bWdyKQoreworCXN0cnVjdCBmaWppX2h3bWdyICpkYXRhID0gKHN0cnVjdCBmaWpp X2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKwlzdHJ1Y3QgZmlqaV91bHZfcGFybSAqdWx2ID0g JihkYXRhLT51bHYpOworCisJaWYgKHVsdi0+dWx2X3N1cHBvcnRlZCkKKwkJcmV0dXJuIHNtdW1f c2VuZF9tc2dfdG9fc21jKGh3bWdyLT5zbXVtZ3IsIFBQU01DX01TR19FbmFibGVVTFYpOworCisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlqaV9lbmFibGVfZGVlcF9zbGVlcF9tYXN0ZXJf c3dpdGNoKHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJaWYgKHBobV9jYXBfZW5hYmxlZCho d21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCQlQSE1fUGxhdGZvcm1D YXBzX1NjbGtEZWVwU2xlZXApKSB7CisJCWlmIChzbXVtX3NlbmRfbXNnX3RvX3NtYyhod21nci0+ c211bWdyLCBQUFNNQ19NU0dfTUFTVEVSX0RlZXBTbGVlcF9PTikpCisJCQlQUF9BU1NFUlRfV0lU SF9DT0RFKGZhbHNlLAorCQkJCQkiQXR0ZW1wdCB0byBlbmFibGUgTWFzdGVyIERlZXAgU2xlZXAg c3dpdGNoIGZhaWxlZCEiLAorCQkJCQlyZXR1cm4gLTEpOworCX0gZWxzZSB7CisJCWlmIChzbXVt X3NlbmRfbXNnX3RvX3NtYyhod21nci0+c211bWdyLAorCQkJCVBQU01DX01TR19NQVNURVJfRGVl cFNsZWVwX09GRikpIHsKKwkJCVBQX0FTU0VSVF9XSVRIX0NPREUoZmFsc2UsCisJCQkJCSJBdHRl bXB0IHRvIGRpc2FibGUgTWFzdGVyIERlZXAgU2xlZXAgc3dpdGNoIGZhaWxlZCEiLAorCQkJCQly ZXR1cm4gLTEpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlqaV9l bmFibGVfc2Nsa19tY2xrX2RwbShzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCXN0cnVjdCBm aWppX2h3bWdyICpkYXRhID0gKHN0cnVjdCBmaWppX2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsK Kwl1aW50MzJfdCAgIHZhbCwgdmFsMCwgdmFsMjsKKwl1aW50MzJfdCAgIGksIGNwbF9jbnRsLCBj cGxfdGhyZXNob2xkLCBtY190aHJlc2hvbGQ7CisKKwkvKiBlbmFibGUgU0NMSyBkcG0gKi8KKwlp ZighZGF0YS0+c2Nsa19kcG1fa2V5X2Rpc2FibGVkKQorCQlQUF9BU1NFUlRfV0lUSF9DT0RFKAor ICAgICAgICAgICAgKDAgPT0gc211bV9zZW5kX21zZ190b19zbWMoaHdtZ3ItPnNtdW1nciwgUFBT TUNfTVNHX0RQTV9FbmFibGUpKSwKKyAgICAgICAgICAgICJGYWlsZWQgdG8gZW5hYmxlIFNDTEsg RFBNIGR1cmluZyBEUE0gU3RhcnQgRnVuY3Rpb24hIiwKKyAgICAgICAgICAgIHJldHVybiAtMSk7 CisKKwkvKiBlbmFibGUgTUNMSyBkcG0gKi8KKwlpZigwID09IGRhdGEtPm1jbGtfZHBtX2tleV9k aXNhYmxlZCkgeworCQljcGxfdGhyZXNob2xkID0gMDsKKwkJbWNfdGhyZXNob2xkID0gMDsKKwor CQkvKiBSZWFkIHBlciBNQ0QgdGlsZSAoMCAtIDcpICovCisJCWZvciAoaSA9IDA7IGkgPCA4OyBp KyspIHsKKwkJCVBITV9XUklURV9GSUVMRChod21nci0+ZGV2aWNlLCBNQ19DT05GSUdfTUNELCBN Q19SRF9FTkFCTEUsIGkpOworCQkJdmFsID0gY2dzX3JlYWRfcmVnaXN0ZXIoaHdtZ3ItPmRldmlj ZSwgbW1NQ19TRVFfUkVTRVJWRV8wX1MpICYgMHhmMDAwMDAwMDsKKwkJCWlmICgweGYwMDAwMDAw ICE9IHZhbCkgeworCQkJCS8qIGNvdW50IG51bWJlciBvZiBNQ1EgdGhhdCBoYXMgY2hhbm5lbChz KSBlbmFibGVkICovCisJCQkJY3BsX3RocmVzaG9sZCsrOworCQkJCS8qIG9ubHkgaGFydmVzdCAz IG9yIGZ1bGwgNCBzdXBwb3J0ZWQgKi8KKwkJCQltY190aHJlc2hvbGQgPSB2YWwgPyAzIDogNDsK KwkJCX0KKwkJfQorCQlQUF9BU1NFUlRfV0lUSF9DT0RFKDAgIT0gY3BsX3RocmVzaG9sZCwKKwkJ CQkiTnVtYmVyIG9mIE1DUSBpcyB6ZXJvISIsIHJldHVybiAtRUlOVkFMOyk7CisKKwkJbWNfdGhy ZXNob2xkID0gKChtY190aHJlc2hvbGQgJiBMQ0FDX01DMF9DTlRMX19NQzBfVEhSRVNIT0xEX01B U0spIDw8CisJCQkJTENBQ19NQzBfQ05UTF9fTUMwX1RIUkVTSE9MRF9fU0hJRlQpIHwKKwkJCQkJ CUxDQUNfTUMwX0NOVExfX01DMF9FTkFCTEVfTUFTSzsKKwkJY3BsX2NudGwgPSAoKGNwbF90aHJl c2hvbGQgJiBMQ0FDX0NQTF9DTlRMX19DUExfVEhSRVNIT0xEX01BU0spIDw8CisJCQkJTENBQ19D UExfQ05UTF9fQ1BMX1RIUkVTSE9MRF9fU0hJRlQpIHwKKwkJCQkJCUxDQUNfQ1BMX0NOVExfX0NQ TF9FTkFCTEVfTUFTSzsKKwkJY3BsX2NudGwgPSAoY3BsX2NudGwgfCAoOCA8PCBMQ0FDX0NQTF9D TlRMX19DUExfQkxPQ0tfSURfX1NISUZUKSk7CisJCWNnc193cml0ZV9pbmRfcmVnaXN0ZXIoaHdt Z3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywKKwkJCQlpeExDQUNfTUMwX0NOVEwsIG1jX3Ro cmVzaG9sZCk7CisJCWNnc193cml0ZV9pbmRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgQ0dTX0lO RF9SRUdfX1NNQywKKwkJCQlpeExDQUNfTUMxX0NOVEwsIG1jX3RocmVzaG9sZCk7CisJCWlmICg4 ID09IGNwbF90aHJlc2hvbGQpIHsKKwkJCWNnc193cml0ZV9pbmRfcmVnaXN0ZXIoaHdtZ3ItPmRl dmljZSwgQ0dTX0lORF9SRUdfX1NNQywKKwkJCQkJaXhMQ0FDX01DMl9DTlRMLCBtY190aHJlc2hv bGQpOworCQkJY2dzX3dyaXRlX2luZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBDR1NfSU5EX1JF R19fU01DLAorCQkJCQlpeExDQUNfTUMzX0NOVEwsIG1jX3RocmVzaG9sZCk7CisJCQljZ3Nfd3Jp dGVfaW5kX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19TTUMsCisJCQkJCWl4 TENBQ19NQzRfQ05UTCwgbWNfdGhyZXNob2xkKTsKKwkJCWNnc193cml0ZV9pbmRfcmVnaXN0ZXIo aHdtZ3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywKKwkJCQkJaXhMQ0FDX01DNV9DTlRMLCBt Y190aHJlc2hvbGQpOworCQkJY2dzX3dyaXRlX2luZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBD R1NfSU5EX1JFR19fU01DLAorCQkJCQlpeExDQUNfTUM2X0NOVEwsIG1jX3RocmVzaG9sZCk7CisJ CQljZ3Nfd3JpdGVfaW5kX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19TTUMs CisJCQkJCWl4TENBQ19NQzdfQ05UTCwgbWNfdGhyZXNob2xkKTsKKwkJfQorCQljZ3Nfd3JpdGVf aW5kX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19TTUMsCisJCQkJaXhMQ0FD X0NQTF9DTlRMLCBjcGxfY250bCk7CisKKwkJdWRlbGF5KDUpOworCisJCW1jX3RocmVzaG9sZCA9 IG1jX3RocmVzaG9sZCB8CisJCQkJKDEgPDwgTENBQ19NQzBfQ05UTF9fTUMwX1NJR05BTF9JRF9f U0hJRlQpOworCQljcGxfY250bCA9IGNwbF9jbnRsIHwgKDEgPDwgTENBQ19DUExfQ05UTF9fQ1BM X1NJR05BTF9JRF9fU0hJRlQpOworCQljZ3Nfd3JpdGVfaW5kX3JlZ2lzdGVyKGh3bWdyLT5kZXZp Y2UsIENHU19JTkRfUkVHX19TTUMsCisJCQkJaXhMQ0FDX01DMF9DTlRMLCBtY190aHJlc2hvbGQp OworCQljZ3Nfd3JpdGVfaW5kX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19T TUMsCisJCQkJaXhMQ0FDX01DMV9DTlRMLCBtY190aHJlc2hvbGQpOworCQlpZiAoOCA9PSBjcGxf dGhyZXNob2xkKSB7CisJCQljZ3Nfd3JpdGVfaW5kX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIENH U19JTkRfUkVHX19TTUMsCisJCQkJCWl4TENBQ19NQzJfQ05UTCwgbWNfdGhyZXNob2xkKTsKKwkJ CWNnc193cml0ZV9pbmRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywK KwkJCQkJaXhMQ0FDX01DM19DTlRMLCBtY190aHJlc2hvbGQpOworCQkJY2dzX3dyaXRlX2luZF9y ZWdpc3Rlcihod21nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01DLAorCQkJCQlpeExDQUNfTUM0 X0NOVEwsIG1jX3RocmVzaG9sZCk7CisJCQljZ3Nfd3JpdGVfaW5kX3JlZ2lzdGVyKGh3bWdyLT5k ZXZpY2UsIENHU19JTkRfUkVHX19TTUMsCisJCQkJCWl4TENBQ19NQzVfQ05UTCwgbWNfdGhyZXNo b2xkKTsKKwkJCWNnc193cml0ZV9pbmRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgQ0dTX0lORF9S RUdfX1NNQywKKwkJCQkJaXhMQ0FDX01DNl9DTlRMLCBtY190aHJlc2hvbGQpOworCQkJY2dzX3dy aXRlX2luZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01DLAorCQkJCQlp eExDQUNfTUM3X0NOVEwsIG1jX3RocmVzaG9sZCk7CisJCX0KKwkJY2dzX3dyaXRlX2luZF9yZWdp c3Rlcihod21nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01DLAorCQkJCWl4TENBQ19DUExfQ05U TCwgY3BsX2NudGwpOworCisJCS8qIFByb2dyYW0gQ0FDX0VOIHBlciBNQ0QgKDAtNykgVGlsZSAq LworCQl2YWwwID0gdmFsID0gY2dzX3JlYWRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19D T05GSUdfTUNEKTsKKwkJdmFsICY9IH4oTUNfQ09ORklHX01DRF9fTUNEMF9XUl9FTkFCTEVfTUFT SyB8CisJCQkJTUNfQ09ORklHX01DRF9fTUNEMV9XUl9FTkFCTEVfTUFTSyB8CisJCQkJTUNfQ09O RklHX01DRF9fTUNEMl9XUl9FTkFCTEVfTUFTSyB8CisJCQkJTUNfQ09ORklHX01DRF9fTUNEM19X Ul9FTkFCTEVfTUFTSyB8CisJCQkJTUNfQ09ORklHX01DRF9fTUNENF9XUl9FTkFCTEVfTUFTSyB8 CisJCQkJTUNfQ09ORklHX01DRF9fTUNENV9XUl9FTkFCTEVfTUFTSyB8CisJCQkJTUNfQ09ORklH X01DRF9fTUNENl9XUl9FTkFCTEVfTUFTSyB8CisJCQkJTUNfQ09ORklHX01DRF9fTUNEN19XUl9F TkFCTEVfTUFTSyB8CisJCQkJTUNfQ09ORklHX01DRF9fTUNfUkRfRU5BQkxFX01BU0spOworCisJ CWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCS8qIEVuYWJsZSBNQ0QgaSBUaWxlIHJlYWQg JiB3cml0ZSAqLworCQkJdmFsMiAgPSAodmFsIHwgKGkgPDwgTUNfQ09ORklHX01DRF9fTUNfUkRf RU5BQkxFX19TSElGVCkgfAorCQkJCQkoMSA8PCBpKSk7CisJCQljZ3Nfd3JpdGVfcmVnaXN0ZXIo aHdtZ3ItPmRldmljZSwgbW1NQ19DT05GSUdfTUNELCB2YWwyKTsKKwkJCS8qIEVuYmFsZSBDQUNf T04gTUNEIGkgVGlsZSAqLworCQkJdmFsMiA9IGNnc19yZWFkX3JlZ2lzdGVyKGh3bWdyLT5kZXZp Y2UsIG1tTUNfU0VRX0NOVEwpOworCQkJdmFsMiB8PSBNQ19TRVFfQ05UTF9fQ0FDX0VOX01BU0s7 CisJCQljZ3Nfd3JpdGVfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwgbW1NQ19TRVFfQ05UTCwgdmFs Mik7CisJCX0KKwkJLyogU2V0IE1DX0NPTkZJR19NQ0QgYmFjayB0byBpdHMgZGVmYXVsdCBzZXR0 aW5nIHZhbDAgKi8KKwkJY2dzX3dyaXRlX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIG1tTUNfQ09O RklHX01DRCwgdmFsMCk7CisKKwkJUFBfQVNTRVJUX1dJVEhfQ09ERSgKKwkJCQkoMCA9PSBzbXVt X3NlbmRfbXNnX3RvX3NtYyhod21nci0+c211bWdyLAorCQkJCQkJUFBTTUNfTVNHX01DTEtEUE1f RW5hYmxlKSksCisJCQkJIkZhaWxlZCB0byBlbmFibGUgTUNMSyBEUE0gZHVyaW5nIERQTSBTdGFy dCBGdW5jdGlvbiEiLAorCQkJCXJldHVybiAtMSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0 aWMgaW50IGZpamlfc3RhcnRfZHBtKHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJc3RydWN0 IGZpamlfaHdtZ3IgKmRhdGEgPSAoc3RydWN0IGZpamlfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQp OworCisJLyplbmFibGUgZ2VuZXJhbCBwb3dlciBtYW5hZ2VtZW50ICovCisJUEhNX1dSSVRFX0lO RElSRUNUX0ZJRUxEKGh3bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19TTUMsIEdFTkVSQUxfUFdS TUdULAorCQkJR0xPQkFMX1BXUk1HVF9FTiwgMSk7CisJLyogZW5hYmxlIHNjbGsgZGVlcCBzbGVl cCAqLworCVBITV9XUklURV9JTkRJUkVDVF9GSUVMRChod21nci0+ZGV2aWNlLCBDR1NfSU5EX1JF R19fU01DLCBTQ0xLX1BXUk1HVF9DTlRMLAorCQkJRFlOQU1JQ19QTV9FTiwgMSk7CisJLyogcHJl cGFyZSBmb3IgUENJRSBEUE0gKi8KKwljZ3Nfd3JpdGVfaW5kX3JlZ2lzdGVyKGh3bWdyLT5kZXZp Y2UsIENHU19JTkRfUkVHX19TTUMsCisJCQlkYXRhLT5zb2Z0X3JlZ3Nfc3RhcnQgKyBvZmZzZXRv ZihTTVU3M19Tb2Z0UmVnaXN0ZXJzLAorCQkJCQlWb2x0YWdlQ2hhbmdlVGltZW91dCksIDB4MTAw MCk7CisJUEhNX1dSSVRFX0lORElSRUNUX0ZJRUxEKGh3bWdyLT5kZXZpY2UsIENHU19JTkRfUkVH X19QQ0lFLAorCQkJU1dSU1RfQ09NTUFORF8xLCBSRVNFVExDLCAweDApOworCisJUFBfQVNTRVJU X1dJVEhfQ09ERSgKKwkJCSgwID09IHNtdW1fc2VuZF9tc2dfdG9fc21jKGh3bWdyLT5zbXVtZ3Is CisJCQkJCVBQU01DX01TR19Wb2x0YWdlX0NudGxfRW5hYmxlKSksCisJCQkiRmFpbGVkIHRvIGVu YWJsZSB2b2x0YWdlIERQTSBkdXJpbmcgRFBNIFN0YXJ0IEZ1bmN0aW9uISIsCisJCQlyZXR1cm4g LTEpOworCisJaWYgKGZpamlfZW5hYmxlX3NjbGtfbWNsa19kcG0oaHdtZ3IpKSB7CisJCXByaW50 ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGVuYWJsZSBTY2xrIERQTSBhbmQgTWNsayBEUE0hIik7CisJ CXJldHVybiAtMTsKKwl9CisKKwkvKiBlbmFibGUgUENJRSBkcG0gKi8KKwlpZighZGF0YS0+cGNp ZV9kcG1fa2V5X2Rpc2FibGVkKSB7CisJCVBQX0FTU0VSVF9XSVRIX0NPREUoCisJCQkJKDAgPT0g c211bV9zZW5kX21zZ190b19zbWMoaHdtZ3ItPnNtdW1nciwKKwkJCQkJCVBQU01DX01TR19QQ0ll RFBNX0VuYWJsZSkpLAorCQkJCSJGYWlsZWQgdG8gZW5hYmxlIHBjaWUgRFBNIGR1cmluZyBEUE0g U3RhcnQgRnVuY3Rpb24hIiwKKwkJCQlyZXR1cm4gLTEpOworCX0KKworICAgIHJldHVybiAwOwor fQorCitzdGF0aWMgdm9pZCBmaWppX3NldF9kcG1fZXZlbnRfc291cmNlcyhzdHJ1Y3QgcHBfaHdt Z3IgKmh3bWdyLAorCQl1aW50MzJfdCBzb3VyY2VzKQoreworCWJvb2wgcHJvdGVjdGlvbjsKKwll bnVtIERQTV9FVkVOVF9TUkMgc3JjOworCisJc3dpdGNoIChzb3VyY2VzKSB7CisJZGVmYXVsdDoK KwkJcHJpbnRrKEtFUk5fRVJSICJVbmtub3duIHRocm90dGxpbmcgZXZlbnQgc291cmNlcy4iKTsK KwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAwOgorCQlwcm90ZWN0aW9uID0gZmFsc2U7CisJ CS8qIHNyYyBpcyB1bnVzZWQgKi8KKwkJYnJlYWs7CisJY2FzZSAoMSA8PCBQSE1fQXV0b1Rocm90 dGxlU291cmNlX1RoZXJtYWwpOgorCQlwcm90ZWN0aW9uID0gdHJ1ZTsKKwkJc3JjID0gRFBNX0VW RU5UX1NSQ19ESUdJVEFMOworCQlicmVhazsKKwljYXNlICgxIDw8IFBITV9BdXRvVGhyb3R0bGVT b3VyY2VfRXh0ZXJuYWwpOgorCQlwcm90ZWN0aW9uID0gdHJ1ZTsKKwkJc3JjID0gRFBNX0VWRU5U X1NSQ19FWFRFUk5BTDsKKwkJYnJlYWs7CisJY2FzZSAoMSA8PCBQSE1fQXV0b1Rocm90dGxlU291 cmNlX0V4dGVybmFsKSB8CisJCQkoMSA8PCBQSE1fQXV0b1Rocm90dGxlU291cmNlX1RoZXJtYWwp OgorCQlwcm90ZWN0aW9uID0gdHJ1ZTsKKwkJc3JjID0gRFBNX0VWRU5UX1NSQ19ESUdJVEFMX09S X0VYVEVSTkFMOworCQlicmVhazsKKwl9CisJLyogT3JkZXIgbWF0dGVycyAtIGRvbid0IGVuYWJs ZSB0aGVybWFsIHByb3RlY3Rpb24gZm9yIHRoZSB3cm9uZyBzb3VyY2UuICovCisJaWYgKHByb3Rl Y3Rpb24pIHsKKwkJUEhNX1dSSVRFX0lORElSRUNUX0ZJRUxEKGh3bWdyLT5kZXZpY2UsIENHU19J TkRfUkVHX19TTUMsIENHX1RIRVJNQUxfQ1RSTCwKKwkJCQlEUE1fRVZFTlRfU1JDLCBzcmMpOwor CQlQSE1fV1JJVEVfSU5ESVJFQ1RfRklFTEQoaHdtZ3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NN QywgR0VORVJBTF9QV1JNR1QsCisJCQkJVEhFUk1BTF9QUk9URUNUSU9OX0RJUywKKwkJCQlwaG1f Y2FwX2VuYWJsZWQoaHdtZ3ItPnBsYXRmb3JtX2Rlc2NyaXB0b3IucGxhdGZvcm1DYXBzLAorCQkJ CQkJUEhNX1BsYXRmb3JtQ2Fwc19UaGVybWFsQ29udHJvbGxlcikpOworCX0gZWxzZQorCQlQSE1f V1JJVEVfSU5ESVJFQ1RfRklFTEQoaHdtZ3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywgR0VO RVJBTF9QV1JNR1QsCisJCQkJVEhFUk1BTF9QUk9URUNUSU9OX0RJUywgMSk7Cit9CisKK3N0YXRp YyBpbnQgZmlqaV9lbmFibGVfYXV0b190aHJvdHRsZV9zb3VyY2Uoc3RydWN0IHBwX2h3bWdyICpo d21nciwKKwkJUEhNX0F1dG9UaHJvdHRsZVNvdXJjZSBzb3VyY2UpCit7CisJc3RydWN0IGZpamlf aHdtZ3IgKmRhdGEgPSAoc3RydWN0IGZpamlfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCisJ aWYgKCEoZGF0YS0+YWN0aXZlX2F1dG9fdGhyb3R0bGVfc291cmNlcyAmICgxIDw8IHNvdXJjZSkp KSB7CisJCWRhdGEtPmFjdGl2ZV9hdXRvX3Rocm90dGxlX3NvdXJjZXMgfD0gMSA8PCBzb3VyY2U7 CisJCWZpamlfc2V0X2RwbV9ldmVudF9zb3VyY2VzKGh3bWdyLCBkYXRhLT5hY3RpdmVfYXV0b190 aHJvdHRsZV9zb3VyY2VzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlqaV9l bmFibGVfdGhlcm1hbF9hdXRvX3Rocm90dGxlKHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7Cisg ICAgcmV0dXJuIGZpamlfZW5hYmxlX2F1dG9fdGhyb3R0bGVfc291cmNlKGh3bWdyLCBQSE1fQXV0 b1Rocm90dGxlU291cmNlX1RoZXJtYWwpOworfQorCitzdGF0aWMgaW50IGZpamlfZW5hYmxlX2Rw bV90YXNrcyhzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCWludCB0bXBfcmVzdWx0LCByZXN1 bHQgPSAwOworCisJdG1wX3Jlc3VsdCA9ICghZmlqaV9pc19kcG1fcnVubmluZyhod21ncikpPyAw IDogLTE7CisJUFBfQVNTRVJUX1dJVEhfQ09ERShyZXN1bHQgPT0gMCwKKwkJCSJEUE0gaXMgYWxy ZWFkeSBydW5uaW5nIHJpZ2h0IG5vdywgbm8gbmVlZCB0byBlbmFibGUgRFBNISIsCisJCQlyZXR1 cm4gMCk7CisKKwlpZiAoZmlqaV92b2x0YWdlX2NvbnRyb2woaHdtZ3IpKSB7CisJCXRtcF9yZXN1 bHQgPSBmaWppX2VuYWJsZV92b2x0YWdlX2NvbnRyb2woaHdtZ3IpOworCQlQUF9BU1NFUlRfV0lU SF9DT0RFKHRtcF9yZXN1bHQgPT0gMCwKKwkJCQkiRmFpbGVkIHRvIGVuYWJsZSB2b2x0YWdlIGNv bnRyb2whIiwKKwkJCQlyZXN1bHQgPSB0bXBfcmVzdWx0KTsKKwl9CisKKwlpZiAoZmlqaV92b2x0 YWdlX2NvbnRyb2woaHdtZ3IpKSB7CisJCXRtcF9yZXN1bHQgPSBmaWppX2NvbnN0cnVjdF92b2x0 YWdlX3RhYmxlcyhod21ncik7CisJCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgPT0gdG1wX3Jlc3Vs dCksCisJCQkJIkZhaWxlZCB0byBjb250cnVjdCB2b2x0YWdlIHRhYmxlcyEiLAorCQkJCXJlc3Vs dCA9IHRtcF9yZXN1bHQpOworCX0KKworCXRtcF9yZXN1bHQgPSBmaWppX2luaXRpYWxpemVfbWNf cmVnX3RhYmxlKGh3bWdyKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09IHRtcF9yZXN1bHQp LAorCQkJIkZhaWxlZCB0byBpbml0aWFsaXplIE1DIHJlZyB0YWJsZSEiLCByZXN1bHQgPSB0bXBf cmVzdWx0KTsKKworCWlmIChwaG1fY2FwX2VuYWJsZWQoaHdtZ3ItPnBsYXRmb3JtX2Rlc2NyaXB0 b3IucGxhdGZvcm1DYXBzLAorCQkJUEhNX1BsYXRmb3JtQ2Fwc19FbmdpbmVTcHJlYWRTcGVjdHJ1 bVN1cHBvcnQpKQorCQlQSE1fV1JJVEVfSU5ESVJFQ1RfRklFTEQoaHdtZ3ItPmRldmljZSwgQ0dT X0lORF9SRUdfX1NNQywKKwkJCQlHRU5FUkFMX1BXUk1HVCwgRFlOX1NQUkVBRF9TUEVDVFJVTV9F TiwgMSk7CisKKwlpZiAocGhtX2NhcF9lbmFibGVkKGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9y LnBsYXRmb3JtQ2FwcywKKwkJCVBITV9QbGF0Zm9ybUNhcHNfVGhlcm1hbENvbnRyb2xsZXIpKQor CQlQSE1fV1JJVEVfSU5ESVJFQ1RfRklFTEQoaHdtZ3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NN QywKKwkJCQlHRU5FUkFMX1BXUk1HVCwgVEhFUk1BTF9QUk9URUNUSU9OX0RJUywgMCk7CisKKwl0 bXBfcmVzdWx0ID0gZmlqaV9wcm9ncmFtX3N0YXRpY19zY3JlZW5fdGhyZXNob2xkX3BhcmFtZXRl cnMoaHdtZ3IpOworCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgPT0gdG1wX3Jlc3VsdCksCisJCQki RmFpbGVkIHRvIHByb2dyYW0gc3RhdGljIHNjcmVlbiB0aHJlc2hvbGQgcGFyYW1ldGVycyEiLAor CQkJcmVzdWx0ID0gdG1wX3Jlc3VsdCk7CisKKwl0bXBfcmVzdWx0ID0gZmlqaV9lbmFibGVfZGlz cGxheV9nYXAoaHdtZ3IpOworCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgPT0gdG1wX3Jlc3VsdCks CisJCQkiRmFpbGVkIHRvIGVuYWJsZSBkaXNwbGF5IGdhcCEiLCByZXN1bHQgPSB0bXBfcmVzdWx0 KTsKKworCXRtcF9yZXN1bHQgPSBmaWppX3Byb2dyYW1fdm90aW5nX2NsaWVudHMoaHdtZ3IpOwor CVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgPT0gdG1wX3Jlc3VsdCksCisJCQkiRmFpbGVkIHRvIHBy b2dyYW0gdm90aW5nIGNsaWVudHMhIiwgcmVzdWx0ID0gdG1wX3Jlc3VsdCk7CisKKwl0bXBfcmVz dWx0ID0gZmlqaV9wcm9jZXNzX2Zpcm13YXJlX2hlYWRlcihod21ncik7CisJUFBfQVNTRVJUX1dJ VEhfQ09ERSgoMCA9PSB0bXBfcmVzdWx0KSwKKwkJCSJGYWlsZWQgdG8gcHJvY2VzcyBmaXJtd2Fy ZSBoZWFkZXIhIiwgcmVzdWx0ID0gdG1wX3Jlc3VsdCk7CisKKwl0bXBfcmVzdWx0ID0gZmlqaV9p bml0aWFsX3N3aXRjaF9mcm9tX2FyYmYwX3RvX2YxKGh3bWdyKTsKKwlQUF9BU1NFUlRfV0lUSF9D T0RFKCgwID09IHRtcF9yZXN1bHQpLAorCQkJIkZhaWxlZCB0byBpbml0aWFsaXplIHN3aXRjaCBm cm9tIEFyYkYwIHRvIEYxISIsCisJCQlyZXN1bHQgPSB0bXBfcmVzdWx0KTsKKworCXRtcF9yZXN1 bHQgPSBmaWppX2luaXRfc21jX3RhYmxlKGh3bWdyKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKCgw ID09IHRtcF9yZXN1bHQpLAorCQkJIkZhaWxlZCB0byBpbml0aWFsaXplIFNNQyB0YWJsZSEiLCBy ZXN1bHQgPSB0bXBfcmVzdWx0KTsKKworCXRtcF9yZXN1bHQgPSBmaWppX2luaXRfYXJiX3RhYmxl X2luZGV4KGh3bWdyKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09IHRtcF9yZXN1bHQpLAor CQkJIkZhaWxlZCB0byBpbml0aWFsaXplIEFSQiB0YWJsZSBpbmRleCEiLCByZXN1bHQgPSB0bXBf cmVzdWx0KTsKKworCXRtcF9yZXN1bHQgPSBmaWppX3BvcHVsYXRlX3BtX2Z1c2VzKGh3bWdyKTsK KwlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09IHRtcF9yZXN1bHQpLAorCQkJIkZhaWxlZCB0byBw b3B1bGF0ZSBQTSBmdXNlcyEiLCByZXN1bHQgPSB0bXBfcmVzdWx0KTsKKworCXRtcF9yZXN1bHQg PSBmaWppX2VuYWJsZV92cmhvdF9ncGlvX2ludGVycnVwdChod21ncik7CisJUFBfQVNTRVJUX1dJ VEhfQ09ERSgoMCA9PSB0bXBfcmVzdWx0KSwKKwkJCSJGYWlsZWQgdG8gZW5hYmxlIFZSIGhvdCBH UElPIGludGVycnVwdCEiLCByZXN1bHQgPSB0bXBfcmVzdWx0KTsKKworCXRtcF9yZXN1bHQgPSBm aWppX2VuYWJsZV9zY2xrX2NvbnRyb2woaHdtZ3IpOworCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAg PT0gdG1wX3Jlc3VsdCksCisJCQkiRmFpbGVkIHRvIGVuYWJsZSBTQ0xLIGNvbnRyb2whIiwgcmVz dWx0ID0gdG1wX3Jlc3VsdCk7CisKKwl0bXBfcmVzdWx0ID0gZmlqaV9lbmFibGVfdWx2KGh3bWdy KTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09IHRtcF9yZXN1bHQpLAorCQkJIkZhaWxlZCB0 byBlbmFibGUgVUxWISIsIHJlc3VsdCA9IHRtcF9yZXN1bHQpOworCisJdG1wX3Jlc3VsdCA9IGZp amlfZW5hYmxlX2RlZXBfc2xlZXBfbWFzdGVyX3N3aXRjaChod21ncik7CisJUFBfQVNTRVJUX1dJ VEhfQ09ERSgoMCA9PSB0bXBfcmVzdWx0KSwKKwkJCSJGYWlsZWQgdG8gZW5hYmxlIGRlZXAgc2xl ZXAgbWFzdGVyIHN3aXRjaCEiLCByZXN1bHQgPSB0bXBfcmVzdWx0KTsKKworCXRtcF9yZXN1bHQg PSBmaWppX3N0YXJ0X2RwbShod21ncik7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSB0bXBf cmVzdWx0KSwKKwkJCSJGYWlsZWQgdG8gc3RhcnQgRFBNISIsIHJlc3VsdCA9IHRtcF9yZXN1bHQp OworCisJdG1wX3Jlc3VsdCA9IGZpamlfZW5hYmxlX3NtY19jYWMoaHdtZ3IpOworCVBQX0FTU0VS VF9XSVRIX0NPREUoKDAgPT0gdG1wX3Jlc3VsdCksCisJCQkiRmFpbGVkIHRvIGVuYWJsZSBTTUMg Q0FDISIsIHJlc3VsdCA9IHRtcF9yZXN1bHQpOworCisJdG1wX3Jlc3VsdCA9IGZpamlfZW5hYmxl X3Bvd2VyX2NvbnRhaW5tZW50KGh3bWdyKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09IHRt cF9yZXN1bHQpLAorCQkJIkZhaWxlZCB0byBlbmFibGUgcG93ZXIgY29udGFpbm1lbnQhIiwgcmVz dWx0ID0gdG1wX3Jlc3VsdCk7CisKKwl0bXBfcmVzdWx0ID0gZmlqaV9wb3dlcl9jb250cm9sX3Nl dF9sZXZlbChod21ncik7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSB0bXBfcmVzdWx0KSwK KwkJCSJGYWlsZWQgdG8gcG93ZXIgY29udHJvbCBzZXQgbGV2ZWwhIiwgcmVzdWx0ID0gdG1wX3Jl c3VsdCk7CisKKwl0bXBfcmVzdWx0ID0gZmlqaV9lbmFibGVfdGhlcm1hbF9hdXRvX3Rocm90dGxl KGh3bWdyKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09IHRtcF9yZXN1bHQpLAorCQkJIkZh aWxlZCB0byBlbmFibGUgdGhlcm1hbCBhdXRvIHRocm90dGxlISIsIHJlc3VsdCA9IHRtcF9yZXN1 bHQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBmaWppX2ZvcmNlX2RwbV9o aWdoZXN0KHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJc3RydWN0IGZpamlfaHdtZ3IgKmRh dGEgPSAoc3RydWN0IGZpamlfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXVpbnQzMl90IGxl dmVsLCB0bXA7CisKKwlpZiAoIWRhdGEtPnNjbGtfZHBtX2tleV9kaXNhYmxlZCkgeworCQlpZiAo ZGF0YS0+ZHBtX2xldmVsX2VuYWJsZV9tYXNrLnNjbGtfZHBtX2VuYWJsZV9tYXNrKSB7CisJCQls ZXZlbCA9IDA7CisJCQl0bXAgPSBkYXRhLT5kcG1fbGV2ZWxfZW5hYmxlX21hc2suc2Nsa19kcG1f ZW5hYmxlX21hc2s7CisJCQl3aGlsZSAodG1wID4+PSAxKQorCQkJCWxldmVsKys7CisJCQlpZiAo bGV2ZWwpCisJCQkJc211bV9zZW5kX21zZ190b19zbWNfd2l0aF9wYXJhbWV0ZXIoaHdtZ3ItPnNt dW1nciwKKwkJCQkJCVBQU01DX01TR19TQ0xLRFBNX1NldEVuYWJsZWRNYXNrLAorCQkJCQkJKDEg PDwgbGV2ZWwpKTsKKwkJfQorCX0KKworCWlmICghZGF0YS0+bWNsa19kcG1fa2V5X2Rpc2FibGVk KSB7CisJCWlmIChkYXRhLT5kcG1fbGV2ZWxfZW5hYmxlX21hc2subWNsa19kcG1fZW5hYmxlX21h c2spIHsKKwkJCWxldmVsID0gMDsKKwkJCXRtcCA9IGRhdGEtPmRwbV9sZXZlbF9lbmFibGVfbWFz ay5tY2xrX2RwbV9lbmFibGVfbWFzazsKKwkJCXdoaWxlICh0bXAgPj49IDEpCisJCQkJbGV2ZWwr KzsKKwkJCWlmIChsZXZlbCkKKwkJCQlzbXVtX3NlbmRfbXNnX3RvX3NtY193aXRoX3BhcmFtZXRl cihod21nci0+c211bWdyLAorCQkJCQkJUFBTTUNfTVNHX01DTEtEUE1fU2V0RW5hYmxlZE1hc2ss CisJCQkJCQkoMSA8PCBsZXZlbCkpOworCQl9CisJfQorCisJaWYgKCFkYXRhLT5wY2llX2RwbV9r ZXlfZGlzYWJsZWQpIHsKKwkJaWYgKGRhdGEtPmRwbV9sZXZlbF9lbmFibGVfbWFzay5wY2llX2Rw bV9lbmFibGVfbWFzaykgeworCQkJbGV2ZWwgPSAwOworCQkJdG1wID0gZGF0YS0+ZHBtX2xldmVs X2VuYWJsZV9tYXNrLnBjaWVfZHBtX2VuYWJsZV9tYXNrOworCQkJd2hpbGUgKHRtcCA+Pj0gMSkK KwkJCQlsZXZlbCsrOworCQkJaWYgKGxldmVsKQorCQkJCXNtdW1fc2VuZF9tc2dfdG9fc21jX3dp dGhfcGFyYW1ldGVyKGh3bWdyLT5zbXVtZ3IsCisJCQkJCQlQUFNNQ19NU0dfUENJZURQTV9Gb3Jj ZUxldmVsLAorCQkJCQkJKDEgPDwgbGV2ZWwpKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIHZvaWQgZmlqaV9hcHBseV9kYWxfbWluX3ZvbHRhZ2VfcmVxdWVzdChzdHJ1Y3QgcHBf aHdtZ3IgKmh3bWdyKQoreworCXN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICp0YWJsZV9p bmZvID0KKwkJCShzdHJ1Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqKWh3bWdyLT5wcHRhYmxl OworCXN0cnVjdCBwaG1fY2xvY2tfdm9sdGFnZV9kZXBlbmRlbmN5X3RhYmxlICp0YWJsZSA9CisJ CQkJdGFibGVfaW5mby0+dmRkY19kZXBfb25fZGFsX3B3cmw7CisJc3RydWN0IHBobV9wcHRfdjFf Y2xvY2tfdm9sdGFnZV9kZXBlbmRlbmN5X3RhYmxlICp2ZGRjX3RhYmxlOworCWVudW0gUFBfREFM X1BPV0VSTEVWRUwgZGFsX3Bvd2VyX2xldmVsID0gaHdtZ3ItPmRhbF9wb3dlcl9sZXZlbDsKKwl1 aW50MzJfdCByZXFfdmRkYyA9IDAsIHJlcV92b2x0LCBpOworCisJaWYgKCF0YWJsZSAmJiAhKGRh bF9wb3dlcl9sZXZlbCA+PSBQUF9EQUxfUE9XRVJMRVZFTF9VTFRSQUxPVyAmJgorCQkJZGFsX3Bv d2VyX2xldmVsIDw9IFBQX0RBTF9QT1dFUkxFVkVMX1BFUkZPUk1BTkNFKSkKKwkJcmV0dXJuOwor CisJZm9yIChpPSAwOyBpIDwgdGFibGUtPmNvdW50OyBpKyspIHsKKwkJaWYgKGRhbF9wb3dlcl9s ZXZlbCA9PSB0YWJsZS0+ZW50cmllc1tpXS5jbGspIHsKKwkJCXJlcV92ZGRjID0gdGFibGUtPmVu dHJpZXNbaV0udjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJdmRkY190YWJsZSA9IHRhYmxlX2lu Zm8tPnZkZF9kZXBfb25fc2NsazsKKwlmb3IgKGk9IDA7IGkgPCB2ZGRjX3RhYmxlLT5jb3VudDsg aSsrKSB7CisJCWlmIChyZXFfdmRkYyA8PSB2ZGRjX3RhYmxlLT5lbnRyaWVzW2ldLnZkZGMpIHsK KwkJCXJlcV92b2x0ID0gKCgodWludDMyX3QpdmRkY190YWJsZS0+ZW50cmllc1tpXS52ZGRjKSAq IFZPTFRBR0VfU0NBTEUpCisJCQkJCTw8IFZERENfU0hJRlQ7CisJCQlzbXVtX3NlbmRfbXNnX3Rv X3NtY193aXRoX3BhcmFtZXRlcihod21nci0+c211bWdyLAorCQkJCQlQUFNNQ19NU0dfVmRkQ19S ZXF1ZXN0LCByZXFfdm9sdCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJcHJpbnRrKEtFUk5fRVJS ICJEQUwgcmVxdWVzdGVkIGxldmVsIGNhbiBub3QiCisJCQkiIGZvdW5kIGEgYXZhaWxhYmxlIHZv bHRhZ2UgaW4gVkREQyBEUE0gVGFibGUgXG4iKTsKK30KKworc3RhdGljIGludCBmaWppX3VwbG9h ZF9kcG1sZXZlbF9lbmFibGVfbWFzayhzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCXN0cnVj dCBmaWppX2h3bWdyICpkYXRhID0gKHN0cnVjdCBmaWppX2h3bWdyICopKGh3bWdyLT5iYWNrZW5k KTsKKworCWZpamlfYXBwbHlfZGFsX21pbl92b2x0YWdlX3JlcXVlc3QoaHdtZ3IpOworCisJaWYg KCFkYXRhLT5zY2xrX2RwbV9rZXlfZGlzYWJsZWQpIHsKKwkJaWYgKGRhdGEtPmRwbV9sZXZlbF9l bmFibGVfbWFzay5zY2xrX2RwbV9lbmFibGVfbWFzaykKKwkJCXNtdW1fc2VuZF9tc2dfdG9fc21j X3dpdGhfcGFyYW1ldGVyKGh3bWdyLT5zbXVtZ3IsCisJCQkJCVBQU01DX01TR19TQ0xLRFBNX1Nl dEVuYWJsZWRNYXNrLAorCQkJCQlkYXRhLT5kcG1fbGV2ZWxfZW5hYmxlX21hc2suc2Nsa19kcG1f ZW5hYmxlX21hc2spOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWppX3VuZm9y Y2VfZHBtX2xldmVscyhzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCXN0cnVjdCBmaWppX2h3 bWdyICpkYXRhID0gKHN0cnVjdCBmaWppX2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKworCWlm ICghZmlqaV9pc19kcG1fcnVubmluZyhod21ncikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYg KCFkYXRhLT5wY2llX2RwbV9rZXlfZGlzYWJsZWQpIHsKKwkJc211bV9zZW5kX21zZ190b19zbWMo aHdtZ3ItPnNtdW1nciwKKwkJCQlQUFNNQ19NU0dfUENJZURQTV9VbkZvcmNlTGV2ZWwpOworCX0K KworCXJldHVybiBmaWppX3VwbG9hZF9kcG1sZXZlbF9lbmFibGVfbWFzayhod21ncik7Cit9CisK K3N0YXRpYyB1aW50MzJfdCBmaWppX2dldF9sb3dlc3RfZW5hYmxlZF9sZXZlbCgKKwkJc3RydWN0 IHBwX2h3bWdyICpod21nciwgdWludDMyX3QgbWFzaykKK3sKKwl1aW50MzJfdCBsZXZlbCA9IDA7 CisKKwl3aGlsZSgwID09IChtYXNrICYgKDEgPDwgbGV2ZWwpKSkKKwkJbGV2ZWwrKzsKKworCXJl dHVybiBsZXZlbDsKK30KKworc3RhdGljIGludCBmaWppX2ZvcmNlX2RwbV9sb3dlc3Qoc3RydWN0 IHBwX2h3bWdyICpod21ncikKK3sKKwlzdHJ1Y3QgZmlqaV9od21nciAqZGF0YSA9CisJCQkoc3Ry dWN0IGZpamlfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXVpbnQzMl90IGxldmVsID0gMDsK KworCS8qIE9ubHkgZm9yY2Ugc2NsayBmb3Igbm93ICovCisJaWYgKCFkYXRhLT5zY2xrX2RwbV9r ZXlfZGlzYWJsZWQpCisJCWlmIChkYXRhLT5kcG1fbGV2ZWxfZW5hYmxlX21hc2suc2Nsa19kcG1f ZW5hYmxlX21hc2spIHsKKwkJCWxldmVsID0gZmlqaV9nZXRfbG93ZXN0X2VuYWJsZWRfbGV2ZWwo aHdtZ3IsCisJCQkJCWRhdGEtPmRwbV9sZXZlbF9lbmFibGVfbWFzay5zY2xrX2RwbV9lbmFibGVf bWFzayk7CisJCQlzbXVtX3NlbmRfbXNnX3RvX3NtY193aXRoX3BhcmFtZXRlcihod21nci0+c211 bWdyLAorCQkJCQlQUFNNQ19NU0dfU0NMS0RQTV9TZXRFbmFibGVkTWFzaywKKwkJCQkJKDEgPDwg bGV2ZWwpKTsKKworCX0KKwlyZXR1cm4gMDsKKworfQorc3RhdGljIGludCBmaWppX2RwbV9mb3Jj ZV9kcG1fbGV2ZWwoc3RydWN0IHBwX2h3bWdyICpod21nciwKKwkJCQllbnVtIGFtZF9kcG1fZm9y Y2VkX2xldmVsIGxldmVsKQoreworCWludCByZXQgPSAwOworCisJc3dpdGNoIChsZXZlbCkgewor CWNhc2UgQU1EX0RQTV9GT1JDRURfTEVWRUxfSElHSDoKKwkJcmV0ID0gZmlqaV9mb3JjZV9kcG1f aGlnaGVzdChod21ncik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlicmVhazsKKwlj YXNlIEFNRF9EUE1fRk9SQ0VEX0xFVkVMX0xPVzoKKwkJcmV0ID0gZmlqaV9mb3JjZV9kcG1fbG93 ZXN0KGh3bWdyKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWJyZWFrOworCWNhc2Ug QU1EX0RQTV9GT1JDRURfTEVWRUxfQVVUTzoKKwkJcmV0ID0gZmlqaV91bmZvcmNlX2RwbV9sZXZl bHMoaHdtZ3IpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJYnJlYWs7CisJZGVmYXVs dDoKKwkJYnJlYWs7CisJfQorCisJaHdtZ3ItPmRwbV9sZXZlbCA9IGxldmVsOworCisJcmV0dXJu IHJldDsKK30KKworc3RhdGljIGludCBmaWppX2dldF9wb3dlcl9zdGF0ZV9zaXplKHN0cnVjdCBw cF9od21nciAqaHdtZ3IpCit7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZmlqaV9wb3dlcl9zdGF0 ZSk7Cit9CisKK3N0YXRpYyBpbnQgZmlqaV9nZXRfcHBfdGFibGVfZW50cnlfY2FsbGJhY2tfZnVu YyhzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLAorCQl2b2lkICpzdGF0ZSwgc3RydWN0IHBwX3Bvd2Vy X3N0YXRlICpwb3dlcl9zdGF0ZSwKKwkJdm9pZCAqcHBfdGFibGUsIHVpbnQzMl90IGNsYXNzaWZp Y2F0aW9uX2ZsYWcpCit7CisJc3RydWN0IGZpamlfaHdtZ3IgKmRhdGEgPSAoc3RydWN0IGZpamlf aHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXN0cnVjdCBmaWppX3Bvd2VyX3N0YXRlICAqZmlq aV9wb3dlcl9zdGF0ZSA9CisJCQkoc3RydWN0IGZpamlfcG93ZXJfc3RhdGUgKikoJihwb3dlcl9z dGF0ZS0+aGFyZHdhcmUpKTsKKwlzdHJ1Y3QgZmlqaV9wZXJmb3JtYW5jZV9sZXZlbCAqcGVyZm9y bWFuY2VfbGV2ZWw7CisJQVRPTV9Ub25nYV9TdGF0ZSAqc3RhdGVfZW50cnkgPSAoQVRPTV9Ub25n YV9TdGF0ZSAqKXN0YXRlOworCUFUT01fVG9uZ2FfUE9XRVJQTEFZVEFCTEUgKnBvd2VycGxheV90 YWJsZSA9CisJCQkoQVRPTV9Ub25nYV9QT1dFUlBMQVlUQUJMRSAqKXBwX3RhYmxlOworCUFUT01f VG9uZ2FfU0NMS19EZXBlbmRlbmN5X1RhYmxlICpzY2xrX2RlcF90YWJsZSA9CisJCQkoQVRPTV9U b25nYV9TQ0xLX0RlcGVuZGVuY3lfVGFibGUgKikKKwkJCSgoKHVuc2lnbmVkIGxvbmcpcG93ZXJw bGF5X3RhYmxlKSArCisJCQkJbGUxNl90b19jcHUocG93ZXJwbGF5X3RhYmxlLT51c1NjbGtEZXBl bmRlbmN5VGFibGVPZmZzZXQpKTsKKwlBVE9NX1RvbmdhX01DTEtfRGVwZW5kZW5jeV9UYWJsZSAq bWNsa19kZXBfdGFibGUgPQorCQkJKEFUT01fVG9uZ2FfTUNMS19EZXBlbmRlbmN5X1RhYmxlICop CisJCQkoKCh1bnNpZ25lZCBsb25nKXBvd2VycGxheV90YWJsZSkgKworCQkJCWxlMTZfdG9fY3B1 KHBvd2VycGxheV90YWJsZS0+dXNNY2xrRGVwZW5kZW5jeVRhYmxlT2Zmc2V0KSk7CisKKwkvKiBU aGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgbm90IGluaXRpYWxpemVkIGhlcmU6IGlkIG9yZGVyZWRM aXN0IGFsbFN0YXRlc0xpc3QgKi8KKwlwb3dlcl9zdGF0ZS0+Y2xhc3NpZmljYXRpb24udWlfbGFi ZWwgPQorCQkJKGxlMTZfdG9fY3B1KHN0YXRlX2VudHJ5LT51c0NsYXNzaWZpY2F0aW9uKSAmCisJ CQlBVE9NX1BQTElCX0NMQVNTSUZJQ0FUSU9OX1VJX01BU0spID4+CisJCQlBVE9NX1BQTElCX0NM QVNTSUZJQ0FUSU9OX1VJX1NISUZUOworCXBvd2VyX3N0YXRlLT5jbGFzc2lmaWNhdGlvbi5mbGFn cyA9IGNsYXNzaWZpY2F0aW9uX2ZsYWc7CisJLyogTk9URTogVGhlcmUgaXMgYSBjbGFzc2lmaWNh dGlvbjIgZmxhZyBpbiBCSU9TIHRoYXQgaXMgbm90IGJlaW5nIHVzZWQgcmlnaHQgbm93ICovCisK Kwlwb3dlcl9zdGF0ZS0+Y2xhc3NpZmljYXRpb24udGVtcG9yYXJ5X3N0YXRlID0gZmFsc2U7CisJ cG93ZXJfc3RhdGUtPmNsYXNzaWZpY2F0aW9uLnRvX2JlX2RlbGV0ZWQgPSBmYWxzZTsKKworCXBv d2VyX3N0YXRlLT52YWxpZGF0aW9uLmRpc2FsbG93T25EQyA9CisJCQkoMCAhPSAobGUzMl90b19j cHUoc3RhdGVfZW50cnktPnVsQ2Fwc0FuZFNldHRpbmdzKSAmCisJCQkJCUFUT01fVG9uZ2FfRElT QUxMT1dfT05fREMpKTsKKworCXBvd2VyX3N0YXRlLT5wY2llLmxhbmVzID0gMDsKKworCXBvd2Vy X3N0YXRlLT5kaXNwbGF5LmRpc2FibGVGcmFtZU1vZHVsYXRpb24gPSBmYWxzZTsKKwlwb3dlcl9z dGF0ZS0+ZGlzcGxheS5saW1pdFJlZnJlc2hyYXRlID0gZmFsc2U7CisJcG93ZXJfc3RhdGUtPmRp c3BsYXkuZW5hYmxlVmFyaUJyaWdodCA9CisJCQkoMCAhPSAobGUzMl90b19jcHUoc3RhdGVfZW50 cnktPnVsQ2Fwc0FuZFNldHRpbmdzKSAmCisJCQkJCUFUT01fVG9uZ2FfRU5BQkxFX1ZBUklCUklH SFQpKTsKKworCXBvd2VyX3N0YXRlLT52YWxpZGF0aW9uLnN1cHBvcnRlZFBvd2VyTGV2ZWxzID0g MDsKKwlwb3dlcl9zdGF0ZS0+dXZkX2Nsb2Nrcy5WQ0xLID0gMDsKKwlwb3dlcl9zdGF0ZS0+dXZk X2Nsb2Nrcy5EQ0xLID0gMDsKKwlwb3dlcl9zdGF0ZS0+dGVtcGVyYXR1cmVzLm1pbiA9IDA7CisJ cG93ZXJfc3RhdGUtPnRlbXBlcmF0dXJlcy5tYXggPSAwOworCisJcGVyZm9ybWFuY2VfbGV2ZWwg PSAmKGZpamlfcG93ZXJfc3RhdGUtPnBlcmZvcm1hbmNlX2xldmVscworCQkJW2ZpamlfcG93ZXJf c3RhdGUtPnBlcmZvcm1hbmNlX2xldmVsX2NvdW50KytdKTsKKworCVBQX0FTU0VSVF9XSVRIX0NP REUoCisJCQkoZmlqaV9wb3dlcl9zdGF0ZS0+cGVyZm9ybWFuY2VfbGV2ZWxfY291bnQgPCBTTVU3 M19NQVhfTEVWRUxTX0dSQVBISUNTKSwKKwkJCSJQZXJmb3JtYW5jZSBsZXZlbHMgZXhjZWVkcyBT TUMgbGltaXQhIiwKKwkJCXJldHVybiAtMSk7CisKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKAorCQkJ KGZpamlfcG93ZXJfc3RhdGUtPnBlcmZvcm1hbmNlX2xldmVsX2NvdW50IDw9CisJCQkJCWh3bWdy LT5wbGF0Zm9ybV9kZXNjcmlwdG9yLmhhcmR3YXJlQWN0aXZpdHlQZXJmb3JtYW5jZUxldmVscyks CisJCQkiUGVyZm9ybWFuY2UgbGV2ZWxzIGV4Y2VlZHMgRHJpdmVyIGxpbWl0ISIsCisJCQlyZXR1 cm4gLTEpOworCisJLyogUGVyZm9ybWFuY2UgbGV2ZWxzIGFyZSBhcnJhbmdlZCBmcm9tIGxvdyB0 byBoaWdoLiAqLworCXBlcmZvcm1hbmNlX2xldmVsLT5tZW1vcnlfY2xvY2sgPSBtY2xrX2RlcF90 YWJsZS0+ZW50cmllcworCQkJW3N0YXRlX2VudHJ5LT51Y01lbW9yeUNsb2NrSW5kZXhMb3ddLnVs TWNsazsKKwlwZXJmb3JtYW5jZV9sZXZlbC0+ZW5naW5lX2Nsb2NrID0gc2Nsa19kZXBfdGFibGUt PmVudHJpZXMKKwkJCVtzdGF0ZV9lbnRyeS0+dWNFbmdpbmVDbG9ja0luZGV4TG93XS51bFNjbGs7 CisJcGVyZm9ybWFuY2VfbGV2ZWwtPnBjaWVfZ2VuID0gZ2V0X3BjaWVfZ2VuX3N1cHBvcnQoZGF0 YS0+cGNpZV9nZW5fY2FwLAorCQkJc3RhdGVfZW50cnktPnVjUENJRUdlbkxvdyk7CisJcGVyZm9y bWFuY2VfbGV2ZWwtPnBjaWVfbGFuZSA9IGdldF9wY2llX2xhbmVfc3VwcG9ydChkYXRhLT5wY2ll X2xhbmVfY2FwLAorCQkJc3RhdGVfZW50cnktPnVjUENJRUxhbmVIaWdoKTsKKworCXBlcmZvcm1h bmNlX2xldmVsID0gJihmaWppX3Bvd2VyX3N0YXRlLT5wZXJmb3JtYW5jZV9sZXZlbHMKKwkJCVtm aWppX3Bvd2VyX3N0YXRlLT5wZXJmb3JtYW5jZV9sZXZlbF9jb3VudCsrXSk7CisJcGVyZm9ybWFu Y2VfbGV2ZWwtPm1lbW9yeV9jbG9jayA9IG1jbGtfZGVwX3RhYmxlLT5lbnRyaWVzCisJCQlbc3Rh dGVfZW50cnktPnVjTWVtb3J5Q2xvY2tJbmRleEhpZ2hdLnVsTWNsazsKKwlwZXJmb3JtYW5jZV9s ZXZlbC0+ZW5naW5lX2Nsb2NrID0gc2Nsa19kZXBfdGFibGUtPmVudHJpZXMKKwkJCVtzdGF0ZV9l bnRyeS0+dWNFbmdpbmVDbG9ja0luZGV4SGlnaF0udWxTY2xrOworCXBlcmZvcm1hbmNlX2xldmVs LT5wY2llX2dlbiA9IGdldF9wY2llX2dlbl9zdXBwb3J0KGRhdGEtPnBjaWVfZ2VuX2NhcCwKKwkJ CXN0YXRlX2VudHJ5LT51Y1BDSUVHZW5IaWdoKTsKKwlwZXJmb3JtYW5jZV9sZXZlbC0+cGNpZV9s YW5lID0gZ2V0X3BjaWVfbGFuZV9zdXBwb3J0KGRhdGEtPnBjaWVfbGFuZV9jYXAsCisJCQlzdGF0 ZV9lbnRyeS0+dWNQQ0lFTGFuZUhpZ2gpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQg ZmlqaV9nZXRfcHBfdGFibGVfZW50cnkoc3RydWN0IHBwX2h3bWdyICpod21nciwKKwkJdW5zaWdu ZWQgbG9uZyBlbnRyeV9pbmRleCwgc3RydWN0IHBwX3Bvd2VyX3N0YXRlICpzdGF0ZSkKK3sKKwlp bnQgcmVzdWx0OworCXN0cnVjdCBmaWppX3Bvd2VyX3N0YXRlICpwczsKKwlzdHJ1Y3QgZmlqaV9o d21nciAqZGF0YSA9IChzdHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJc3Ry dWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKnRhYmxlX2luZm8gPQorCQkJKHN0cnVjdCBwaG1f cHB0X3YxX2luZm9ybWF0aW9uICopKGh3bWdyLT5wcHRhYmxlKTsKKwlzdHJ1Y3QgcGhtX3BwdF92 MV9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUgKmRlcF9tY2xrX3RhYmxlID0KKwkJCXRh YmxlX2luZm8tPnZkZF9kZXBfb25fbWNsazsKKworCXN0YXRlLT5oYXJkd2FyZS5tYWdpYyA9IFBI TV9WSXNsYW5kc19NYWdpYzsKKworCXBzID0gKHN0cnVjdCBmaWppX3Bvd2VyX3N0YXRlICopKCZz dGF0ZS0+aGFyZHdhcmUpOworCisJcmVzdWx0ID0gdG9uZ2FfZ2V0X3Bvd2VycGxheV90YWJsZV9l bnRyeShod21nciwgZW50cnlfaW5kZXgsIHN0YXRlLAorCQkJZmlqaV9nZXRfcHBfdGFibGVfZW50 cnlfY2FsbGJhY2tfZnVuYyk7CisKKwkvKiBUaGlzIGlzIHRoZSBlYXJsaWVzdCB0aW1lIHdlIGhh dmUgYWxsIHRoZSBkZXBlbmRlbmN5IHRhYmxlIGFuZCB0aGUgVkJJT1MgYm9vdCBzdGF0ZQorCSAq IGFzIFBQX1RhYmxlc19HZXRQb3dlclBsYXlUYWJsZUVudHJ5IHJldHJpZXZlcyB0aGUgVkJJT1Mg Ym9vdCBzdGF0ZQorCSAqIGlmIHRoZXJlIGlzIG9ubHkgb25lIFZERENJL01DTEsgbGV2ZWwsIGNo ZWNrIGlmIGl0J3MgdGhlIHNhbWUgYXMgVkJJT1MgYm9vdCBzdGF0ZQorCSAqLworCWlmIChkZXBf bWNsa190YWJsZSAhPSBOVUxMICYmIGRlcF9tY2xrX3RhYmxlLT5jb3VudCA9PSAxKSB7CisJCWlm IChkZXBfbWNsa190YWJsZS0+ZW50cmllc1swXS5jbGsgIT0KKwkJCQlkYXRhLT52Ymlvc19ib290 X3N0YXRlLm1jbGtfYm9vdHVwX3ZhbHVlKQorCQkJcHJpbnRrKEtFUk5fRVJSICJTaW5nbGUgTUNM SyBlbnRyeSBWRERDSS9NQ0xLIGRlcGVuZGVuY3kgdGFibGUgIgorCQkJCQkiZG9lcyBub3QgbWF0 Y2ggVkJJT1MgYm9vdCBNQ0xLIGxldmVsIik7CisJCWlmIChkZXBfbWNsa190YWJsZS0+ZW50cmll c1swXS52ZGRjaSAhPQorCQkJCWRhdGEtPnZiaW9zX2Jvb3Rfc3RhdGUudmRkY2lfYm9vdHVwX3Zh bHVlKQorCQkJcHJpbnRrKEtFUk5fRVJSICJTaW5nbGUgVkREQ0kgZW50cnkgVkREQ0kvTUNMSyBk ZXBlbmRlbmN5IHRhYmxlICIKKwkJCQkJImRvZXMgbm90IG1hdGNoIFZCSU9TIGJvb3QgVkREQ0kg bGV2ZWwiKTsKKwl9CisKKwkvKiBzZXQgREMgY29tcGF0aWJsZSBmbGFnIGlmIHRoaXMgc3RhdGUg c3VwcG9ydHMgREMgKi8KKwlpZiAoIXN0YXRlLT52YWxpZGF0aW9uLmRpc2FsbG93T25EQykKKwkJ cHMtPmRjX2NvbXBhdGlibGUgPSB0cnVlOworCisJaWYgKHN0YXRlLT5jbGFzc2lmaWNhdGlvbi5m bGFncyAmIFBQX1N0YXRlQ2xhc3NpZmljYXRpb25GbGFnX0FDUEkpCisJCWRhdGEtPmFjcGlfcGNp ZV9nZW4gPSBwcy0+cGVyZm9ybWFuY2VfbGV2ZWxzWzBdLnBjaWVfZ2VuOworCisJcHMtPnV2ZF9j bGtzLnZjbGsgPSBzdGF0ZS0+dXZkX2Nsb2Nrcy5WQ0xLOworCXBzLT51dmRfY2xrcy5kY2xrID0g c3RhdGUtPnV2ZF9jbG9ja3MuRENMSzsKKworCWlmICghcmVzdWx0KSB7CisJCXVpbnQzMl90IGk7 CisKKwkJc3dpdGNoIChzdGF0ZS0+Y2xhc3NpZmljYXRpb24udWlfbGFiZWwpIHsKKwkJY2FzZSBQ UF9TdGF0ZVVJTGFiZWxfUGVyZm9ybWFuY2U6CisJCQlkYXRhLT51c2VfcGNpZV9wZXJmb3JtYW5j ZV9sZXZlbHMgPSB0cnVlOworCisJCQlmb3IgKGkgPSAwOyBpIDwgcHMtPnBlcmZvcm1hbmNlX2xl dmVsX2NvdW50OyBpKyspIHsKKwkJCQlpZiAoZGF0YS0+cGNpZV9nZW5fcGVyZm9ybWFuY2UubWF4 IDwKKwkJCQkJCXBzLT5wZXJmb3JtYW5jZV9sZXZlbHNbaV0ucGNpZV9nZW4pCisJCQkJCWRhdGEt PnBjaWVfZ2VuX3BlcmZvcm1hbmNlLm1heCA9CisJCQkJCQkJcHMtPnBlcmZvcm1hbmNlX2xldmVs c1tpXS5wY2llX2dlbjsKKworCQkJCWlmIChkYXRhLT5wY2llX2dlbl9wZXJmb3JtYW5jZS5taW4g PgorCQkJCQkJcHMtPnBlcmZvcm1hbmNlX2xldmVsc1tpXS5wY2llX2dlbikKKwkJCQkJZGF0YS0+ cGNpZV9nZW5fcGVyZm9ybWFuY2UubWluID0KKwkJCQkJCQlwcy0+cGVyZm9ybWFuY2VfbGV2ZWxz W2ldLnBjaWVfZ2VuOworCisJCQkJaWYgKGRhdGEtPnBjaWVfbGFuZV9wZXJmb3JtYW5jZS5tYXgg PAorCQkJCQkJcHMtPnBlcmZvcm1hbmNlX2xldmVsc1tpXS5wY2llX2xhbmUpCisJCQkJCWRhdGEt PnBjaWVfbGFuZV9wZXJmb3JtYW5jZS5tYXggPQorCQkJCQkJCXBzLT5wZXJmb3JtYW5jZV9sZXZl bHNbaV0ucGNpZV9sYW5lOworCisJCQkJaWYgKGRhdGEtPnBjaWVfbGFuZV9wZXJmb3JtYW5jZS5t aW4gPgorCQkJCQkJcHMtPnBlcmZvcm1hbmNlX2xldmVsc1tpXS5wY2llX2xhbmUpCisJCQkJCWRh dGEtPnBjaWVfbGFuZV9wZXJmb3JtYW5jZS5taW4gPQorCQkJCQkJCXBzLT5wZXJmb3JtYW5jZV9s ZXZlbHNbaV0ucGNpZV9sYW5lOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUFBfU3RhdGVVSUxh YmVsX0JhdHRlcnk6CisJCQlkYXRhLT51c2VfcGNpZV9wb3dlcl9zYXZpbmdfbGV2ZWxzID0gdHJ1 ZTsKKworCQkJZm9yIChpID0gMDsgaSA8IHBzLT5wZXJmb3JtYW5jZV9sZXZlbF9jb3VudDsgaSsr KSB7CisJCQkJaWYgKGRhdGEtPnBjaWVfZ2VuX3Bvd2VyX3NhdmluZy5tYXggPAorCQkJCQkJcHMt PnBlcmZvcm1hbmNlX2xldmVsc1tpXS5wY2llX2dlbikKKwkJCQkJZGF0YS0+cGNpZV9nZW5fcG93 ZXJfc2F2aW5nLm1heCA9CisJCQkJCQkJcHMtPnBlcmZvcm1hbmNlX2xldmVsc1tpXS5wY2llX2dl bjsKKworCQkJCWlmIChkYXRhLT5wY2llX2dlbl9wb3dlcl9zYXZpbmcubWluID4KKwkJCQkJCXBz LT5wZXJmb3JtYW5jZV9sZXZlbHNbaV0ucGNpZV9nZW4pCisJCQkJCWRhdGEtPnBjaWVfZ2VuX3Bv d2VyX3NhdmluZy5taW4gPQorCQkJCQkJCXBzLT5wZXJmb3JtYW5jZV9sZXZlbHNbaV0ucGNpZV9n ZW47CisKKwkJCQlpZiAoZGF0YS0+cGNpZV9sYW5lX3Bvd2VyX3NhdmluZy5tYXggPAorCQkJCQkJ cHMtPnBlcmZvcm1hbmNlX2xldmVsc1tpXS5wY2llX2xhbmUpCisJCQkJCWRhdGEtPnBjaWVfbGFu ZV9wb3dlcl9zYXZpbmcubWF4ID0KKwkJCQkJCQlwcy0+cGVyZm9ybWFuY2VfbGV2ZWxzW2ldLnBj aWVfbGFuZTsKKworCQkJCWlmIChkYXRhLT5wY2llX2xhbmVfcG93ZXJfc2F2aW5nLm1pbiA+CisJ CQkJCQlwcy0+cGVyZm9ybWFuY2VfbGV2ZWxzW2ldLnBjaWVfbGFuZSkKKwkJCQkJZGF0YS0+cGNp ZV9sYW5lX3Bvd2VyX3NhdmluZy5taW4gPQorCQkJCQkJCXBzLT5wZXJmb3JtYW5jZV9sZXZlbHNb aV0ucGNpZV9sYW5lOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJ fQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWppX2FwcGx5X3N0YXRlX2FkanVz dF9ydWxlcyhzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLAorCQkJCXN0cnVjdCBwcF9wb3dlcl9zdGF0 ZSAgKnJlcXVlc3RfcHMsCisJCQljb25zdCBzdHJ1Y3QgcHBfcG93ZXJfc3RhdGUgKmN1cnJlbnRf cHMpCit7CisJc3RydWN0IGZpamlfcG93ZXJfc3RhdGUgKmZpamlfcHMgPQorCQkJCWNhc3RfcGh3 X2ZpamlfcG93ZXJfc3RhdGUoJnJlcXVlc3RfcHMtPmhhcmR3YXJlKTsKKwl1aW50MzJfdCBzY2xr OworCXVpbnQzMl90IG1jbGs7CisJc3RydWN0IFBQX0Nsb2NrcyBtaW5pbXVtX2Nsb2NrcyA9IHsw fTsKKwlib29sIGRpc2FibGVfbWNsa19zd2l0Y2hpbmc7CisJYm9vbCBkaXNhYmxlX21jbGtfc3dp dGNoaW5nX2Zvcl9mcmFtZV9sb2NrOworCXN0cnVjdCBjZ3NfZGlzcGxheV9pbmZvIGluZm8gPSB7 MH07CisJY29uc3Qgc3RydWN0IHBobV9jbG9ja19hbmRfdm9sdGFnZV9saW1pdHMgKm1heF9saW1p dHM7CisJdWludDMyX3QgaTsKKwlzdHJ1Y3QgZmlqaV9od21nciAqZGF0YSA9IChzdHJ1Y3QgZmlq aV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRp b24gKnRhYmxlX2luZm8gPQorCQkJKHN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICopKGh3 bWdyLT5wcHRhYmxlKTsKKwlpbnQzMl90IGNvdW50OworCWludDMyX3Qgc3RhYmxlX3BzdGF0ZV9z Y2xrID0gMCwgc3RhYmxlX3BzdGF0ZV9tY2xrID0gMDsKKworCWRhdGEtPmJhdHRlcnlfc3RhdGUg PSAoUFBfU3RhdGVVSUxhYmVsX0JhdHRlcnkgPT0KKwkJCXJlcXVlc3RfcHMtPmNsYXNzaWZpY2F0 aW9uLnVpX2xhYmVsKTsKKworCVBQX0FTU0VSVF9XSVRIX0NPREUoZmlqaV9wcy0+cGVyZm9ybWFu Y2VfbGV2ZWxfY291bnQgPT0gMiwKKwkJCQkgIlZJIHNob3VsZCBhbHdheXMgaGF2ZSAyIHBlcmZv cm1hbmNlIGxldmVscyIsKTsKKworCW1heF9saW1pdHMgPSAoUFBfUG93ZXJTb3VyY2VfQUMgPT0g aHdtZ3ItPnBvd2VyX3NvdXJjZSkgPworCQkJJihod21nci0+ZHluX3N0YXRlLm1heF9jbG9ja192 b2x0YWdlX29uX2FjKSA6CisJCQkmKGh3bWdyLT5keW5fc3RhdGUubWF4X2Nsb2NrX3ZvbHRhZ2Vf b25fZGMpOworCisJLyogQ2FwIGNsb2NrIERQTSB0YWJsZXMgYXQgREMgTUFYIGlmIGl0IGlzIGlu IERDLiAqLworCWlmIChQUF9Qb3dlclNvdXJjZV9EQyA9PSBod21nci0+cG93ZXJfc291cmNlKSB7 CisJCWZvciAoaSA9IDA7IGkgPCBmaWppX3BzLT5wZXJmb3JtYW5jZV9sZXZlbF9jb3VudDsgaSsr KSB7CisJCQlpZiAoZmlqaV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxzW2ldLm1lbW9yeV9jbG9jayA+ IG1heF9saW1pdHMtPm1jbGspCisJCQkJZmlqaV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxzW2ldLm1l bW9yeV9jbG9jayA9IG1heF9saW1pdHMtPm1jbGs7CisJCQlpZiAoZmlqaV9wcy0+cGVyZm9ybWFu Y2VfbGV2ZWxzW2ldLmVuZ2luZV9jbG9jayA+IG1heF9saW1pdHMtPnNjbGspCisJCQkJZmlqaV9w cy0+cGVyZm9ybWFuY2VfbGV2ZWxzW2ldLmVuZ2luZV9jbG9jayA9IG1heF9saW1pdHMtPnNjbGs7 CisJCX0KKwl9CisKKwlmaWppX3BzLT52Y2VfY2xrcy5ldmNsayA9IGh3bWdyLT52Y2VfYXJiaXRl ci5ldmNsazsKKwlmaWppX3BzLT52Y2VfY2xrcy5lY2NsayA9IGh3bWdyLT52Y2VfYXJiaXRlci5l Y2NsazsKKworCWZpamlfcHMtPmFjcF9jbGsgPSBod21nci0+YWNwX2FyYml0ZXIuYWNwY2xrOwor CisJY2dzX2dldF9hY3RpdmVfZGlzcGxheXNfaW5mbyhod21nci0+ZGV2aWNlLCAmaW5mbyk7CisK KwkvKlRPIERPIHJlc3VsdCA9IFBITV9DaGVja1ZCbGFua1RpbWUoaHdtZ3IsICZ2YmxhbmtUb29T aG9ydCk7Ki8KKworCS8qIFRPIERPIEdldE1pbkNsb2NrU2V0dGluZ3MoaHdtZ3ItPnBQRUNJLCAm bWluaW11bV9jbG9ja3MpOyAqLworCisJaWYgKHBobV9jYXBfZW5hYmxlZChod21nci0+cGxhdGZv cm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCQlQSE1fUGxhdGZvcm1DYXBzX1N0YWJsZVBT dGF0ZSkpIHsKKwkJbWF4X2xpbWl0cyA9ICYoaHdtZ3ItPmR5bl9zdGF0ZS5tYXhfY2xvY2tfdm9s dGFnZV9vbl9hYyk7CisJCXN0YWJsZV9wc3RhdGVfc2NsayA9IChtYXhfbGltaXRzLT5zY2xrICog NzUpIC8gMTAwOworCisJCWZvciAoY291bnQgPSB0YWJsZV9pbmZvLT52ZGRfZGVwX29uX3NjbGst PmNvdW50IC0gMTsKKwkJCQljb3VudCA+PSAwOyBjb3VudC0tKSB7CisJCQlpZiAoc3RhYmxlX3Bz dGF0ZV9zY2xrID49CisJCQkJCXRhYmxlX2luZm8tPnZkZF9kZXBfb25fc2Nsay0+ZW50cmllc1tj b3VudF0uY2xrKSB7CisJCQkJc3RhYmxlX3BzdGF0ZV9zY2xrID0KKwkJCQkJCXRhYmxlX2luZm8t PnZkZF9kZXBfb25fc2Nsay0+ZW50cmllc1tjb3VudF0uY2xrOworCQkJCWJyZWFrOworCQkJfQor CQl9CisKKwkJaWYgKGNvdW50IDwgMCkKKwkJCXN0YWJsZV9wc3RhdGVfc2NsayA9IHRhYmxlX2lu Zm8tPnZkZF9kZXBfb25fc2Nsay0+ZW50cmllc1swXS5jbGs7CisKKwkJc3RhYmxlX3BzdGF0ZV9t Y2xrID0gbWF4X2xpbWl0cy0+bWNsazsKKworCQltaW5pbXVtX2Nsb2Nrcy5lbmdpbmVDbG9jayA9 IHN0YWJsZV9wc3RhdGVfc2NsazsKKwkJbWluaW11bV9jbG9ja3MubWVtb3J5Q2xvY2sgPSBzdGFi bGVfcHN0YXRlX21jbGs7CisJfQorCisJaWYgKG1pbmltdW1fY2xvY2tzLmVuZ2luZUNsb2NrIDwg aHdtZ3ItPmdmeF9hcmJpdGVyLnNjbGspCisJCW1pbmltdW1fY2xvY2tzLmVuZ2luZUNsb2NrID0g aHdtZ3ItPmdmeF9hcmJpdGVyLnNjbGs7CisKKwlpZiAobWluaW11bV9jbG9ja3MubWVtb3J5Q2xv Y2sgPCBod21nci0+Z2Z4X2FyYml0ZXIubWNsaykKKwkJbWluaW11bV9jbG9ja3MubWVtb3J5Q2xv Y2sgPSBod21nci0+Z2Z4X2FyYml0ZXIubWNsazsKKworCWZpamlfcHMtPnNjbGtfdGhyZXNob2xk ID0gaHdtZ3ItPmdmeF9hcmJpdGVyLnNjbGtfdGhyZXNob2xkOworCisJaWYgKDAgIT0gaHdtZ3It PmdmeF9hcmJpdGVyLnNjbGtfb3Zlcl9kcml2ZSkgeworCQlQUF9BU1NFUlRfV0lUSF9DT0RFKCho d21nci0+Z2Z4X2FyYml0ZXIuc2Nsa19vdmVyX2RyaXZlIDw9CisJCQkJaHdtZ3ItPnBsYXRmb3Jt X2Rlc2NyaXB0b3Iub3ZlcmRyaXZlTGltaXQuZW5naW5lQ2xvY2spLAorCQkJCSJPdmVyZHJpdmUg c2NsayBleGNlZWRzIGxpbWl0IiwKKwkJCQlod21nci0+Z2Z4X2FyYml0ZXIuc2Nsa19vdmVyX2Ry aXZlID0KKwkJCQkJCWh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLm92ZXJkcml2ZUxpbWl0LmVu Z2luZUNsb2NrKTsKKworCQlpZiAoaHdtZ3ItPmdmeF9hcmJpdGVyLnNjbGtfb3Zlcl9kcml2ZSA+ PSBod21nci0+Z2Z4X2FyYml0ZXIuc2NsaykKKwkJCWZpamlfcHMtPnBlcmZvcm1hbmNlX2xldmVs c1sxXS5lbmdpbmVfY2xvY2sgPQorCQkJCQlod21nci0+Z2Z4X2FyYml0ZXIuc2Nsa19vdmVyX2Ry aXZlOworCX0KKworCWlmICgwICE9IGh3bWdyLT5nZnhfYXJiaXRlci5tY2xrX292ZXJfZHJpdmUp IHsKKwkJUFBfQVNTRVJUX1dJVEhfQ09ERSgoaHdtZ3ItPmdmeF9hcmJpdGVyLm1jbGtfb3Zlcl9k cml2ZSA8PQorCQkJCWh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLm92ZXJkcml2ZUxpbWl0Lm1l bW9yeUNsb2NrKSwKKwkJCQkiT3ZlcmRyaXZlIG1jbGsgZXhjZWVkcyBsaW1pdCIsCisJCQkJaHdt Z3ItPmdmeF9hcmJpdGVyLm1jbGtfb3Zlcl9kcml2ZSA9CisJCQkJCQlod21nci0+cGxhdGZvcm1f ZGVzY3JpcHRvci5vdmVyZHJpdmVMaW1pdC5tZW1vcnlDbG9jayk7CisKKwkJaWYgKGh3bWdyLT5n ZnhfYXJiaXRlci5tY2xrX292ZXJfZHJpdmUgPj0gaHdtZ3ItPmdmeF9hcmJpdGVyLm1jbGspCisJ CQlmaWppX3BzLT5wZXJmb3JtYW5jZV9sZXZlbHNbMV0ubWVtb3J5X2Nsb2NrID0KKwkJCQkJaHdt Z3ItPmdmeF9hcmJpdGVyLm1jbGtfb3Zlcl9kcml2ZTsKKwl9CisKKwlkaXNhYmxlX21jbGtfc3dp dGNoaW5nX2Zvcl9mcmFtZV9sb2NrID0gcGhtX2NhcF9lbmFibGVkKAorCQkJCSAgICBod21nci0+ cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCQkJICAgIFBITV9QbGF0Zm9ybUNh cHNfRGlzYWJsZU1jbGtTd2l0Y2hpbmdGb3JGcmFtZUxvY2spOworCisJZGlzYWJsZV9tY2xrX3N3 aXRjaGluZyA9ICgxIDwgaW5mby5kaXNwbGF5X2NvdW50KSB8fAorCQkJCSAgICBkaXNhYmxlX21j bGtfc3dpdGNoaW5nX2Zvcl9mcmFtZV9sb2NrOworCisJc2NsayA9IGZpamlfcHMtPnBlcmZvcm1h bmNlX2xldmVsc1swXS5lbmdpbmVfY2xvY2s7CisJbWNsayA9IGZpamlfcHMtPnBlcmZvcm1hbmNl X2xldmVsc1swXS5tZW1vcnlfY2xvY2s7CisKKwlpZiAoZGlzYWJsZV9tY2xrX3N3aXRjaGluZykK KwkJbWNsayA9IGZpamlfcHMtPnBlcmZvcm1hbmNlX2xldmVscworCQlbZmlqaV9wcy0+cGVyZm9y bWFuY2VfbGV2ZWxfY291bnQgLSAxXS5tZW1vcnlfY2xvY2s7CisKKwlpZiAoc2NsayA8IG1pbmlt dW1fY2xvY2tzLmVuZ2luZUNsb2NrKQorCQlzY2xrID0gKG1pbmltdW1fY2xvY2tzLmVuZ2luZUNs b2NrID4gbWF4X2xpbWl0cy0+c2NsaykgPworCQkJCW1heF9saW1pdHMtPnNjbGsgOiBtaW5pbXVt X2Nsb2Nrcy5lbmdpbmVDbG9jazsKKworCWlmIChtY2xrIDwgbWluaW11bV9jbG9ja3MubWVtb3J5 Q2xvY2spCisJCW1jbGsgPSAobWluaW11bV9jbG9ja3MubWVtb3J5Q2xvY2sgPiBtYXhfbGltaXRz LT5tY2xrKSA/CisJCQkJbWF4X2xpbWl0cy0+bWNsayA6IG1pbmltdW1fY2xvY2tzLm1lbW9yeUNs b2NrOworCisJZmlqaV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxzWzBdLmVuZ2luZV9jbG9jayA9IHNj bGs7CisJZmlqaV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxzWzBdLm1lbW9yeV9jbG9jayA9IG1jbGs7 CisKKwlmaWppX3BzLT5wZXJmb3JtYW5jZV9sZXZlbHNbMV0uZW5naW5lX2Nsb2NrID0KKwkJKGZp amlfcHMtPnBlcmZvcm1hbmNlX2xldmVsc1sxXS5lbmdpbmVfY2xvY2sgPj0KKwkJCQlmaWppX3Bz LT5wZXJmb3JtYW5jZV9sZXZlbHNbMF0uZW5naW5lX2Nsb2NrKSA/CisJCQkJCQlmaWppX3BzLT5w ZXJmb3JtYW5jZV9sZXZlbHNbMV0uZW5naW5lX2Nsb2NrIDoKKwkJCQkJCWZpamlfcHMtPnBlcmZv cm1hbmNlX2xldmVsc1swXS5lbmdpbmVfY2xvY2s7CisKKwlpZiAoZGlzYWJsZV9tY2xrX3N3aXRj aGluZykgeworCQlpZiAobWNsayA8IGZpamlfcHMtPnBlcmZvcm1hbmNlX2xldmVsc1sxXS5tZW1v cnlfY2xvY2spCisJCQltY2xrID0gZmlqaV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxzWzFdLm1lbW9y eV9jbG9jazsKKworCQlmaWppX3BzLT5wZXJmb3JtYW5jZV9sZXZlbHNbMF0ubWVtb3J5X2Nsb2Nr ID0gbWNsazsKKwkJZmlqaV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxzWzFdLm1lbW9yeV9jbG9jayA9 IG1jbGs7CisJfSBlbHNlIHsKKwkJaWYgKGZpamlfcHMtPnBlcmZvcm1hbmNlX2xldmVsc1sxXS5t ZW1vcnlfY2xvY2sgPAorCQkJCWZpamlfcHMtPnBlcmZvcm1hbmNlX2xldmVsc1swXS5tZW1vcnlf Y2xvY2spCisJCQlmaWppX3BzLT5wZXJmb3JtYW5jZV9sZXZlbHNbMV0ubWVtb3J5X2Nsb2NrID0K KwkJCQkJZmlqaV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxzWzBdLm1lbW9yeV9jbG9jazsKKwl9CisK KwlpZiAocGhtX2NhcF9lbmFibGVkKGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLnBsYXRmb3Jt Q2FwcywKKwkJCVBITV9QbGF0Zm9ybUNhcHNfU3RhYmxlUFN0YXRlKSkgeworCQlmb3IgKGkgPSAw OyBpIDwgZmlqaV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxfY291bnQ7IGkrKykgeworCQkJZmlqaV9w cy0+cGVyZm9ybWFuY2VfbGV2ZWxzW2ldLmVuZ2luZV9jbG9jayA9IHN0YWJsZV9wc3RhdGVfc2Ns azsKKwkJCWZpamlfcHMtPnBlcmZvcm1hbmNlX2xldmVsc1tpXS5tZW1vcnlfY2xvY2sgPSBzdGFi bGVfcHN0YXRlX21jbGs7CisJCQlmaWppX3BzLT5wZXJmb3JtYW5jZV9sZXZlbHNbaV0ucGNpZV9n ZW4gPSBkYXRhLT5wY2llX2dlbl9wZXJmb3JtYW5jZS5tYXg7CisJCQlmaWppX3BzLT5wZXJmb3Jt YW5jZV9sZXZlbHNbaV0ucGNpZV9sYW5lID0gZGF0YS0+cGNpZV9nZW5fcGVyZm9ybWFuY2UubWF4 OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlqaV9maW5kX2RwbV9z dGF0ZXNfY2xvY2tzX2luX2RwbV90YWJsZShzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLCBjb25zdCB2 b2lkICppbnB1dCkKK3sKKwljb25zdCBzdHJ1Y3QgcGhtX3NldF9wb3dlcl9zdGF0ZV9pbnB1dCAq c3RhdGVzID0KKwkJCShjb25zdCBzdHJ1Y3QgcGhtX3NldF9wb3dlcl9zdGF0ZV9pbnB1dCAqKWlu cHV0OworCWNvbnN0IHN0cnVjdCBmaWppX3Bvd2VyX3N0YXRlICpmaWppX3BzID0KKwkJCWNhc3Rf Y29uc3RfcGh3X2ZpamlfcG93ZXJfc3RhdGUoc3RhdGVzLT5wbmV3X3N0YXRlKTsKKwlzdHJ1Y3Qg ZmlqaV9od21nciAqZGF0YSA9IChzdHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+YmFja2VuZCk7 CisJc3RydWN0IGZpamlfc2luZ2xlX2RwbV90YWJsZSAqc2Nsa190YWJsZSA9ICYoZGF0YS0+ZHBt X3RhYmxlLnNjbGtfdGFibGUpOworCXVpbnQzMl90IHNjbGsgPSBmaWppX3BzLT5wZXJmb3JtYW5j ZV9sZXZlbHMKKwkJCVtmaWppX3BzLT5wZXJmb3JtYW5jZV9sZXZlbF9jb3VudCAtIDFdLmVuZ2lu ZV9jbG9jazsKKwlzdHJ1Y3QgZmlqaV9zaW5nbGVfZHBtX3RhYmxlICptY2xrX3RhYmxlID0gJihk YXRhLT5kcG1fdGFibGUubWNsa190YWJsZSk7CisJdWludDMyX3QgbWNsayA9IGZpamlfcHMtPnBl cmZvcm1hbmNlX2xldmVscworCQkJW2ZpamlfcHMtPnBlcmZvcm1hbmNlX2xldmVsX2NvdW50IC0g MV0ubWVtb3J5X2Nsb2NrOworCXN0cnVjdCBQUF9DbG9ja3MgbWluX2Nsb2NrcyA9IHswfTsKKwl1 aW50MzJfdCBpOworCXN0cnVjdCBjZ3NfZGlzcGxheV9pbmZvIGluZm8gPSB7MH07CisKKwlkYXRh LT5uZWVkX3VwZGF0ZV9zbXU3X2RwbV90YWJsZSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2Ns a190YWJsZS0+Y291bnQ7IGkrKykgeworCQlpZiAoc2NsayA9PSBzY2xrX3RhYmxlLT5kcG1fbGV2 ZWxzW2ldLnZhbHVlKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPj0gc2Nsa190YWJsZS0+Y291 bnQpCisJCWRhdGEtPm5lZWRfdXBkYXRlX3NtdTdfZHBtX3RhYmxlIHw9IERQTVRBQkxFX09EX1VQ REFURV9TQ0xLOworCWVsc2UgeworCS8qIFRPRE86IENoZWNrIFNDTEsgaW4gREFMJ3MgbWluaW11 bSBjbG9ja3MKKwkgKiBpbiBjYXNlIERlZXBTbGVlcCBkaXZpZGVyIHVwZGF0ZSBpcyByZXF1aXJl ZC4KKwkgKi8KKwkJaWYoZGF0YS0+ZGlzcGxheV90aW1pbmcubWluX2Nsb2NrX2luX3NyICE9IG1p bl9jbG9ja3MuZW5naW5lQ2xvY2tJblNSKQorCQkJZGF0YS0+bmVlZF91cGRhdGVfc211N19kcG1f dGFibGUgfD0gRFBNVEFCTEVfVVBEQVRFX1NDTEs7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1j bGtfdGFibGUtPmNvdW50OyBpKyspIHsKKwkJaWYgKG1jbGsgPT0gbWNsa190YWJsZS0+ZHBtX2xl dmVsc1tpXS52YWx1ZSkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID49IG1jbGtfdGFibGUtPmNv dW50KQorCQlkYXRhLT5uZWVkX3VwZGF0ZV9zbXU3X2RwbV90YWJsZSB8PSBEUE1UQUJMRV9PRF9V UERBVEVfTUNMSzsKKworCWNnc19nZXRfYWN0aXZlX2Rpc3BsYXlzX2luZm8oaHdtZ3ItPmRldmlj ZSwgJmluZm8pOworCisJaWYgKGRhdGEtPmRpc3BsYXlfdGltaW5nLm51bV9leGlzdGluZ19kaXNw bGF5cyAhPSBpbmZvLmRpc3BsYXlfY291bnQpCisJCWRhdGEtPm5lZWRfdXBkYXRlX3NtdTdfZHBt X3RhYmxlIHw9IERQTVRBQkxFX1VQREFURV9NQ0xLOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyB1aW50MTZfdCBmaWppX2dldF9tYXhpbXVtX2xpbmtfc3BlZWQoc3RydWN0IHBwX2h3bWdyICpo d21nciwKKwkJY29uc3Qgc3RydWN0IGZpamlfcG93ZXJfc3RhdGUgKmZpamlfcHMpCit7CisJdWlu dDMyX3QgaTsKKwl1aW50MzJfdCBzY2xrLCBtYXhfc2NsayA9IDA7CisJc3RydWN0IGZpamlfaHdt Z3IgKmRhdGEgPSAoc3RydWN0IGZpamlfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXN0cnVj dCBmaWppX2RwbV90YWJsZSAqZHBtX3RhYmxlID0gJmRhdGEtPmRwbV90YWJsZTsKKworCWZvciAo aSA9IDA7IGkgPCBmaWppX3BzLT5wZXJmb3JtYW5jZV9sZXZlbF9jb3VudDsgaSsrKSB7CisJCXNj bGsgPSBmaWppX3BzLT5wZXJmb3JtYW5jZV9sZXZlbHNbaV0uZW5naW5lX2Nsb2NrOworCQlpZiAo bWF4X3NjbGsgPCBzY2xrKQorCQkJbWF4X3NjbGsgPSBzY2xrOworCX0KKworCWZvciAoaSA9IDA7 IGkgPCBkcG1fdGFibGUtPnNjbGtfdGFibGUuY291bnQ7IGkrKykgeworCQlpZiAoZHBtX3RhYmxl LT5zY2xrX3RhYmxlLmRwbV9sZXZlbHNbaV0udmFsdWUgPT0gbWF4X3NjbGspCisJCQlyZXR1cm4g KHVpbnQxNl90KSAoKGkgPj0gZHBtX3RhYmxlLT5wY2llX3NwZWVkX3RhYmxlLmNvdW50KSA/CisJ CQkJCWRwbV90YWJsZS0+cGNpZV9zcGVlZF90YWJsZS5kcG1fbGV2ZWxzCisJCQkJCVtkcG1fdGFi bGUtPnBjaWVfc3BlZWRfdGFibGUuY291bnQgLSAxXS52YWx1ZSA6CisJCQkJCWRwbV90YWJsZS0+ cGNpZV9zcGVlZF90YWJsZS5kcG1fbGV2ZWxzW2ldLnZhbHVlKTsKKwl9CisKKwlyZXR1cm4gMDsK K30KKworc3RhdGljIGludCBmaWppX3JlcXVlc3RfbGlua19zcGVlZF9jaGFuZ2VfYmVmb3JlX3N0 YXRlX2NoYW5nZSgKKwkJc3RydWN0IHBwX2h3bWdyICpod21nciwgY29uc3Qgdm9pZCAqaW5wdXQp Cit7CisJY29uc3Qgc3RydWN0IHBobV9zZXRfcG93ZXJfc3RhdGVfaW5wdXQgKnN0YXRlcyA9CisJ CQkoY29uc3Qgc3RydWN0IHBobV9zZXRfcG93ZXJfc3RhdGVfaW5wdXQgKilpbnB1dDsKKwlzdHJ1 Y3QgZmlqaV9od21nciAqZGF0YSA9IChzdHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+YmFja2Vu ZCk7CisJY29uc3Qgc3RydWN0IGZpamlfcG93ZXJfc3RhdGUgKmZpamlfbnBzID0KKwkJCWNhc3Rf Y29uc3RfcGh3X2ZpamlfcG93ZXJfc3RhdGUoc3RhdGVzLT5wbmV3X3N0YXRlKTsKKwljb25zdCBz dHJ1Y3QgZmlqaV9wb3dlcl9zdGF0ZSAqZmlqaV9jcHMgPQorCQkJY2FzdF9jb25zdF9waHdfZmlq aV9wb3dlcl9zdGF0ZShzdGF0ZXMtPnBjdXJyZW50X3N0YXRlKTsKKworCXVpbnQxNl90IHRhcmdl dF9saW5rX3NwZWVkID0gZmlqaV9nZXRfbWF4aW11bV9saW5rX3NwZWVkKGh3bWdyLCBmaWppX25w cyk7CisJdWludDE2X3QgY3VycmVudF9saW5rX3NwZWVkOworCisJaWYgKGRhdGEtPmZvcmNlX3Bj aWVfZ2VuID09IFBQX1BDSUVHZW5JbnZhbGlkKQorCQljdXJyZW50X2xpbmtfc3BlZWQgPSBmaWpp X2dldF9tYXhpbXVtX2xpbmtfc3BlZWQoaHdtZ3IsIGZpamlfY3BzKTsKKwllbHNlCisJCWN1cnJl bnRfbGlua19zcGVlZCA9IGRhdGEtPmZvcmNlX3BjaWVfZ2VuOworCisJZGF0YS0+Zm9yY2VfcGNp ZV9nZW4gPSBQUF9QQ0lFR2VuSW52YWxpZDsKKwlkYXRhLT5wc3BwX25vdGlmeV9yZXF1aXJlZCA9 IGZhbHNlOworCWlmICh0YXJnZXRfbGlua19zcGVlZCA+IGN1cnJlbnRfbGlua19zcGVlZCkgewor CQlzd2l0Y2godGFyZ2V0X2xpbmtfc3BlZWQpIHsKKwkJY2FzZSBQUF9QQ0lFR2VuMzoKKwkJCWlm ICgwID09IGFjcGlfcGNpZV9wZXJmX3JlcXVlc3QoaHdtZ3ItPmRldmljZSwgUENJRV9QRVJGX1JF UV9HRU4zLCBmYWxzZSkpCisJCQkJYnJlYWs7CisJCQlkYXRhLT5mb3JjZV9wY2llX2dlbiA9IFBQ X1BDSUVHZW4yOworCQkJaWYgKGN1cnJlbnRfbGlua19zcGVlZCA9PSBQUF9QQ0lFR2VuMikKKwkJ CQlicmVhazsKKwkJY2FzZSBQUF9QQ0lFR2VuMjoKKwkJCWlmICgwID09IGFjcGlfcGNpZV9wZXJm X3JlcXVlc3QoaHdtZ3ItPmRldmljZSwgUENJRV9QRVJGX1JFUV9HRU4yLCBmYWxzZSkpCisJCQkJ YnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkYXRhLT5mb3JjZV9wY2llX2dlbiA9IGZpamlfZ2V0X2N1 cnJlbnRfcGNpZV9zcGVlZChod21ncik7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCWlm ICh0YXJnZXRfbGlua19zcGVlZCA8IGN1cnJlbnRfbGlua19zcGVlZCkKKwkJCWRhdGEtPnBzcHBf bm90aWZ5X3JlcXVpcmVkID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlu dCBmaWppX2ZyZWV6ZV9zY2xrX21jbGtfZHBtKHN0cnVjdCBwcF9od21nciAqaHdtZ3IpCit7CisJ c3RydWN0IGZpamlfaHdtZ3IgKmRhdGEgPSAoc3RydWN0IGZpamlfaHdtZ3IgKikoaHdtZ3ItPmJh Y2tlbmQpOworCisJaWYgKDAgPT0gZGF0YS0+bmVlZF91cGRhdGVfc211N19kcG1fdGFibGUpCisJ CXJldHVybiAwOworCisJaWYgKCgwID09IGRhdGEtPnNjbGtfZHBtX2tleV9kaXNhYmxlZCkgJiYK KwkJKGRhdGEtPm5lZWRfdXBkYXRlX3NtdTdfZHBtX3RhYmxlICYKKwkJCShEUE1UQUJMRV9PRF9V UERBVEVfU0NMSyArIERQTVRBQkxFX1VQREFURV9TQ0xLKSkpIHsKKwkJUFBfQVNTRVJUX1dJVEhf Q09ERSh0cnVlID09IGZpamlfaXNfZHBtX3J1bm5pbmcoaHdtZ3IpLAorCQkJCSJUcnlpbmcgdG8g ZnJlZXplIFNDTEsgRFBNIHdoZW4gRFBNIGlzIGRpc2FibGVkIiwpOworCQlQUF9BU1NFUlRfV0lU SF9DT0RFKDAgPT0gc211bV9zZW5kX21zZ190b19zbWMoaHdtZ3ItPnNtdW1nciwKKwkJCQlQUFNN Q19NU0dfU0NMS0RQTV9GcmVlemVMZXZlbCksCisJCQkJIkZhaWxlZCB0byBmcmVlemUgU0NMSyBE UE0gZHVyaW5nIEZyZWV6ZVNjbGtNY2xrRFBNIEZ1bmN0aW9uISIsCisJCQkJcmV0dXJuIC0xKTsK Kwl9CisKKwlpZiAoKDAgPT0gZGF0YS0+bWNsa19kcG1fa2V5X2Rpc2FibGVkKSAmJgorCQkoZGF0 YS0+bmVlZF91cGRhdGVfc211N19kcG1fdGFibGUgJgorCQkgRFBNVEFCTEVfT0RfVVBEQVRFX01D TEspKSB7CisJCVBQX0FTU0VSVF9XSVRIX0NPREUodHJ1ZSA9PSBmaWppX2lzX2RwbV9ydW5uaW5n KGh3bWdyKSwKKwkJCQkiVHJ5aW5nIHRvIGZyZWV6ZSBNQ0xLIERQTSB3aGVuIERQTSBpcyBkaXNh YmxlZCIsKTsKKwkJUFBfQVNTRVJUX1dJVEhfQ09ERSgwID09IHNtdW1fc2VuZF9tc2dfdG9fc21j KGh3bWdyLT5zbXVtZ3IsCisJCQkJUFBTTUNfTVNHX01DTEtEUE1fRnJlZXplTGV2ZWwpLAorCQkJ CSJGYWlsZWQgdG8gZnJlZXplIE1DTEsgRFBNIGR1cmluZyBGcmVlemVTY2xrTWNsa0RQTSBGdW5j dGlvbiEiLAorCQkJCXJldHVybiAtMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBp bnQgZmlqaV9wb3B1bGF0ZV9hbmRfdXBsb2FkX3NjbGtfbWNsa19kcG1fbGV2ZWxzKAorCQlzdHJ1 Y3QgcHBfaHdtZ3IgKmh3bWdyLCBjb25zdCB2b2lkICppbnB1dCkKK3sKKwlpbnQgcmVzdWx0ID0g MDsKKwljb25zdCBzdHJ1Y3QgcGhtX3NldF9wb3dlcl9zdGF0ZV9pbnB1dCAqc3RhdGVzID0KKwkJ CShjb25zdCBzdHJ1Y3QgcGhtX3NldF9wb3dlcl9zdGF0ZV9pbnB1dCAqKWlucHV0OworCWNvbnN0 IHN0cnVjdCBmaWppX3Bvd2VyX3N0YXRlICpmaWppX3BzID0KKwkJCWNhc3RfY29uc3RfcGh3X2Zp amlfcG93ZXJfc3RhdGUoc3RhdGVzLT5wbmV3X3N0YXRlKTsKKwlzdHJ1Y3QgZmlqaV9od21nciAq ZGF0YSA9IChzdHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJdWludDMyX3Qg c2NsayA9IGZpamlfcHMtPnBlcmZvcm1hbmNlX2xldmVscworCQkJW2ZpamlfcHMtPnBlcmZvcm1h bmNlX2xldmVsX2NvdW50IC0gMV0uZW5naW5lX2Nsb2NrOworCXVpbnQzMl90IG1jbGsgPSBmaWpp X3BzLT5wZXJmb3JtYW5jZV9sZXZlbHMKKwkJCVtmaWppX3BzLT5wZXJmb3JtYW5jZV9sZXZlbF9j b3VudCAtIDFdLm1lbW9yeV9jbG9jazsKKwlzdHJ1Y3QgZmlqaV9kcG1fdGFibGUgKmRwbV90YWJs ZSA9ICZkYXRhLT5kcG1fdGFibGU7CisKKwlzdHJ1Y3QgZmlqaV9kcG1fdGFibGUgKmdvbGRlbl9k cG1fdGFibGUgPSAmZGF0YS0+Z29sZGVuX2RwbV90YWJsZTsKKwl1aW50MzJfdCBkcG1fY291bnQs IGNsb2NrX3BlcmNlbnQ7CisJdWludDMyX3QgaTsKKworCWlmICgwID09IGRhdGEtPm5lZWRfdXBk YXRlX3NtdTdfZHBtX3RhYmxlKQorCQlyZXR1cm4gMDsKKworCWlmIChkYXRhLT5uZWVkX3VwZGF0 ZV9zbXU3X2RwbV90YWJsZSAmIERQTVRBQkxFX09EX1VQREFURV9TQ0xLKSB7CisJCWRwbV90YWJs ZS0+c2Nsa190YWJsZS5kcG1fbGV2ZWxzCisJCVtkcG1fdGFibGUtPnNjbGtfdGFibGUuY291bnQg LSAxXS52YWx1ZSA9IHNjbGs7CisKKwkJaWYgKHBobV9jYXBfZW5hYmxlZChod21nci0+cGxhdGZv cm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCQkJUEhNX1BsYXRmb3JtQ2Fwc19PRDZQbHVz aW5BQ1N1cHBvcnQpIHx8CisJCQlwaG1fY2FwX2VuYWJsZWQoaHdtZ3ItPnBsYXRmb3JtX2Rlc2Ny aXB0b3IucGxhdGZvcm1DYXBzLAorCQkJCQlQSE1fUGxhdGZvcm1DYXBzX09ENlBsdXNpbkRDU3Vw cG9ydCkpIHsKKwkJLyogTmVlZCB0byBkbyBjYWxjdWxhdGlvbiBiYXNlZCBvbiB0aGUgZ29sZGVu IERQTSB0YWJsZQorCQkgKiBhcyB0aGUgSGVhdG1hcCBHUFUgQ2xvY2sgYXhpcyBpcyBhbHNvIGJh c2VkIG9uIHRoZSBkZWZhdWx0IHZhbHVlcworCQkgKi8KKwkJCVBQX0FTU0VSVF9XSVRIX0NPREUo CisJCQkJKGdvbGRlbl9kcG1fdGFibGUtPnNjbGtfdGFibGUuZHBtX2xldmVscworCQkJCQkJW2dv bGRlbl9kcG1fdGFibGUtPnNjbGtfdGFibGUuY291bnQgLSAxXS52YWx1ZSAhPSAwKSwKKwkJCQki RGl2aWRlIGJ5IDAhIiwKKwkJCQlyZXR1cm4gLTEpOworCQkJZHBtX2NvdW50ID0gZHBtX3RhYmxl LT5zY2xrX3RhYmxlLmNvdW50IDwgMiA/CisJCQkJCTAgOiBkcG1fdGFibGUtPnNjbGtfdGFibGUu Y291bnQgLSAyOworCQkJZm9yIChpID0gZHBtX2NvdW50OyBpID4gMTsgaS0tKSB7CisJCQkJaWYg KHNjbGsgPiBnb2xkZW5fZHBtX3RhYmxlLT5zY2xrX3RhYmxlLmRwbV9sZXZlbHMKKwkJCQkJCVtn b2xkZW5fZHBtX3RhYmxlLT5zY2xrX3RhYmxlLmNvdW50LTFdLnZhbHVlKSB7CisJCQkJCWNsb2Nr X3BlcmNlbnQgPQorCQkJCQkJKChzY2xrIC0gZ29sZGVuX2RwbV90YWJsZS0+c2Nsa190YWJsZS5k cG1fbGV2ZWxzCisJCQkJCQkJW2dvbGRlbl9kcG1fdGFibGUtPnNjbGtfdGFibGUuY291bnQtMV0u dmFsdWUpICogMTAwKSAvCisJCQkJCQlnb2xkZW5fZHBtX3RhYmxlLT5zY2xrX3RhYmxlLmRwbV9s ZXZlbHMKKwkJCQkJCQlbZ29sZGVuX2RwbV90YWJsZS0+c2Nsa190YWJsZS5jb3VudC0xXS52YWx1 ZTsKKworCQkJCQlkcG1fdGFibGUtPnNjbGtfdGFibGUuZHBtX2xldmVsc1tpXS52YWx1ZSA9CisJ CQkJCQkJZ29sZGVuX2RwbV90YWJsZS0+c2Nsa190YWJsZS5kcG1fbGV2ZWxzW2ldLnZhbHVlICsK KwkJCQkJCQkoZ29sZGVuX2RwbV90YWJsZS0+c2Nsa190YWJsZS5kcG1fbGV2ZWxzW2ldLnZhbHVl ICoKKwkJCQkJCQkJY2xvY2tfcGVyY2VudCkvMTAwOworCisJCQkJfSBlbHNlIGlmIChnb2xkZW5f ZHBtX3RhYmxlLT5zY2xrX3RhYmxlLmRwbV9sZXZlbHMKKwkJCQkJCVtkcG1fdGFibGUtPnNjbGtf dGFibGUuY291bnQtMV0udmFsdWUgPiBzY2xrKSB7CisJCQkJCWNsb2NrX3BlcmNlbnQgPQorCQkJ CQkJKChnb2xkZW5fZHBtX3RhYmxlLT5zY2xrX3RhYmxlLmRwbV9sZXZlbHMKKwkJCQkJCVtnb2xk ZW5fZHBtX3RhYmxlLT5zY2xrX3RhYmxlLmNvdW50IC0gMV0udmFsdWUgLSBzY2xrKSAqCisJCQkJ CQkJCTEwMCkgLworCQkJCQkJZ29sZGVuX2RwbV90YWJsZS0+c2Nsa190YWJsZS5kcG1fbGV2ZWxz CisJCQkJCQkJW2dvbGRlbl9kcG1fdGFibGUtPnNjbGtfdGFibGUuY291bnQtMV0udmFsdWU7CisK KwkJCQkJZHBtX3RhYmxlLT5zY2xrX3RhYmxlLmRwbV9sZXZlbHNbaV0udmFsdWUgPQorCQkJCQkJ CWdvbGRlbl9kcG1fdGFibGUtPnNjbGtfdGFibGUuZHBtX2xldmVsc1tpXS52YWx1ZSAtCisJCQkJ CQkJKGdvbGRlbl9kcG1fdGFibGUtPnNjbGtfdGFibGUuZHBtX2xldmVsc1tpXS52YWx1ZSAqCisJ CQkJCQkJCQljbG9ja19wZXJjZW50KSAvIDEwMDsKKwkJCQl9IGVsc2UKKwkJCQkJZHBtX3RhYmxl LT5zY2xrX3RhYmxlLmRwbV9sZXZlbHNbaV0udmFsdWUgPQorCQkJCQkJCWdvbGRlbl9kcG1fdGFi bGUtPnNjbGtfdGFibGUuZHBtX2xldmVsc1tpXS52YWx1ZTsKKwkJCX0KKwkJfQorCX0KKworCWlm IChkYXRhLT5uZWVkX3VwZGF0ZV9zbXU3X2RwbV90YWJsZSAmIERQTVRBQkxFX09EX1VQREFURV9N Q0xLKSB7CisJCWRwbV90YWJsZS0+bWNsa190YWJsZS5kcG1fbGV2ZWxzCisJCQlbZHBtX3RhYmxl LT5tY2xrX3RhYmxlLmNvdW50IC0gMV0udmFsdWUgPSBtY2xrOworCisJCWlmIChwaG1fY2FwX2Vu YWJsZWQoaHdtZ3ItPnBsYXRmb3JtX2Rlc2NyaXB0b3IucGxhdGZvcm1DYXBzLAorCQkJCVBITV9Q bGF0Zm9ybUNhcHNfT0Q2UGx1c2luQUNTdXBwb3J0KSB8fAorCQkJcGhtX2NhcF9lbmFibGVkKGh3 bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywKKwkJCQlQSE1fUGxhdGZvcm1D YXBzX09ENlBsdXNpbkRDU3VwcG9ydCkpIHsKKworCQkJUFBfQVNTRVJUX1dJVEhfQ09ERSgKKwkJ CQkJKGdvbGRlbl9kcG1fdGFibGUtPm1jbGtfdGFibGUuZHBtX2xldmVscworCQkJCQkJW2dvbGRl bl9kcG1fdGFibGUtPm1jbGtfdGFibGUuY291bnQtMV0udmFsdWUgIT0gMCksCisJCQkJCSJEaXZp ZGUgYnkgMCEiLAorCQkJCQlyZXR1cm4gLTEpOworCQkJZHBtX2NvdW50ID0gZHBtX3RhYmxlLT5t Y2xrX3RhYmxlLmNvdW50IDwgMiA/CisJCQkJCTAgOiBkcG1fdGFibGUtPm1jbGtfdGFibGUuY291 bnQgLSAyOworCQkJZm9yIChpID0gZHBtX2NvdW50OyBpID4gMTsgaS0tKSB7CisJCQkJaWYgKG1j bGsgPiBnb2xkZW5fZHBtX3RhYmxlLT5tY2xrX3RhYmxlLmRwbV9sZXZlbHMKKwkJCQkJCVtnb2xk ZW5fZHBtX3RhYmxlLT5tY2xrX3RhYmxlLmNvdW50LTFdLnZhbHVlKSB7CisJCQkJCWNsb2NrX3Bl cmNlbnQgPSAoKG1jbGsgLQorCQkJCQkJCWdvbGRlbl9kcG1fdGFibGUtPm1jbGtfdGFibGUuZHBt X2xldmVscworCQkJCQkJCVtnb2xkZW5fZHBtX3RhYmxlLT5tY2xrX3RhYmxlLmNvdW50LTFdLnZh bHVlKSAqIDEwMCkgLworCQkJCQkJCWdvbGRlbl9kcG1fdGFibGUtPm1jbGtfdGFibGUuZHBtX2xl dmVscworCQkJCQkJCVtnb2xkZW5fZHBtX3RhYmxlLT5tY2xrX3RhYmxlLmNvdW50LTFdLnZhbHVl OworCisJCQkJCWRwbV90YWJsZS0+bWNsa190YWJsZS5kcG1fbGV2ZWxzW2ldLnZhbHVlID0KKwkJ CQkJCQlnb2xkZW5fZHBtX3RhYmxlLT5tY2xrX3RhYmxlLmRwbV9sZXZlbHNbaV0udmFsdWUgKwor CQkJCQkJCShnb2xkZW5fZHBtX3RhYmxlLT5tY2xrX3RhYmxlLmRwbV9sZXZlbHNbaV0udmFsdWUg KgorCQkJCQkJCQkJY2xvY2tfcGVyY2VudCkgLyAxMDA7CisKKwkJCQl9IGVsc2UgaWYgKGdvbGRl bl9kcG1fdGFibGUtPm1jbGtfdGFibGUuZHBtX2xldmVscworCQkJCQkJW2RwbV90YWJsZS0+bWNs a190YWJsZS5jb3VudC0xXS52YWx1ZSA+IG1jbGspIHsKKwkJCQkJY2xvY2tfcGVyY2VudCA9ICgo Z29sZGVuX2RwbV90YWJsZS0+bWNsa190YWJsZS5kcG1fbGV2ZWxzCisJCQkJCQkJW2dvbGRlbl9k cG1fdGFibGUtPm1jbGtfdGFibGUuY291bnQtMV0udmFsdWUgLSBtY2xrKSAqIDEwMCkgLworCQkJ CQkJCQkJZ29sZGVuX2RwbV90YWJsZS0+bWNsa190YWJsZS5kcG1fbGV2ZWxzCisJCQkJCQkJCQlb Z29sZGVuX2RwbV90YWJsZS0+bWNsa190YWJsZS5jb3VudC0xXS52YWx1ZTsKKworCQkJCQlkcG1f dGFibGUtPm1jbGtfdGFibGUuZHBtX2xldmVsc1tpXS52YWx1ZSA9CisJCQkJCQkJZ29sZGVuX2Rw bV90YWJsZS0+bWNsa190YWJsZS5kcG1fbGV2ZWxzW2ldLnZhbHVlIC0KKwkJCQkJCQkoZ29sZGVu X2RwbV90YWJsZS0+bWNsa190YWJsZS5kcG1fbGV2ZWxzW2ldLnZhbHVlICoKKwkJCQkJCQkJCWNs b2NrX3BlcmNlbnQpIC8gMTAwOworCQkJCX0gZWxzZQorCQkJCQlkcG1fdGFibGUtPm1jbGtfdGFi bGUuZHBtX2xldmVsc1tpXS52YWx1ZSA9CisJCQkJCQkJZ29sZGVuX2RwbV90YWJsZS0+bWNsa190 YWJsZS5kcG1fbGV2ZWxzW2ldLnZhbHVlOworCQkJfQorCQl9CisJfQorCisJaWYgKGRhdGEtPm5l ZWRfdXBkYXRlX3NtdTdfZHBtX3RhYmxlICYKKwkJCShEUE1UQUJMRV9PRF9VUERBVEVfU0NMSyAr IERQTVRBQkxFX1VQREFURV9TQ0xLKSkgeworCQlyZXN1bHQgPSBmaWppX3BvcHVsYXRlX2FsbF9t ZW1vcnlfbGV2ZWxzKGh3bWdyKTsKKwkJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSByZXN1bHQp LAorCQkJCSJGYWlsZWQgdG8gcG9wdWxhdGUgU0NMSyBkdXJpbmcgUG9wdWxhdGVOZXdEUE1DbG9j a3NTdGF0ZXMgRnVuY3Rpb24hIiwKKwkJCQlyZXR1cm4gcmVzdWx0KTsKKwl9CisKKwlpZiAoZGF0 YS0+bmVlZF91cGRhdGVfc211N19kcG1fdGFibGUgJgorCQkJKERQTVRBQkxFX09EX1VQREFURV9N Q0xLICsgRFBNVEFCTEVfVVBEQVRFX01DTEspKSB7CisJCS8qcG9wdWxhdGUgTUNMSyBkcG0gdGFi bGUgdG8gU01VNyAqLworCQlyZXN1bHQgPSBmaWppX3BvcHVsYXRlX2FsbF9tZW1vcnlfbGV2ZWxz KGh3bWdyKTsKKwkJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSByZXN1bHQpLAorCQkJCSJGYWls ZWQgdG8gcG9wdWxhdGUgTUNMSyBkdXJpbmcgUG9wdWxhdGVOZXdEUE1DbG9ja3NTdGF0ZXMgRnVu Y3Rpb24hIiwKKwkJCQlyZXR1cm4gcmVzdWx0KTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQor CitzdGF0aWMgaW50IGZpamlfdHJpbV9zaW5nbGVfZHBtX3N0YXRlcyhzdHJ1Y3QgcHBfaHdtZ3Ig Kmh3bWdyLAorCQkJICBzdHJ1Y3QgZmlqaV9zaW5nbGVfZHBtX3RhYmxlICogZHBtX3RhYmxlLAor CQkJICAgICB1aW50MzJfdCBsb3dfbGltaXQsIHVpbnQzMl90IGhpZ2hfbGltaXQpCit7CisJdWlu dDMyX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBkcG1fdGFibGUtPmNvdW50OyBpKyspIHsKKwkJ aWYgKChkcG1fdGFibGUtPmRwbV9sZXZlbHNbaV0udmFsdWUgPCBsb3dfbGltaXQpIHx8CisJCSAg ICAoZHBtX3RhYmxlLT5kcG1fbGV2ZWxzW2ldLnZhbHVlID4gaGlnaF9saW1pdCkpCisJCQlkcG1f dGFibGUtPmRwbV9sZXZlbHNbaV0uZW5hYmxlZCA9IGZhbHNlOworCQllbHNlCisJCQlkcG1fdGFi bGUtPmRwbV9sZXZlbHNbaV0uZW5hYmxlZCA9IHRydWU7CisJfQorCXJldHVybiAwOworfQorCitz dGF0aWMgaW50IGZpamlfdHJpbV9kcG1fc3RhdGVzKHN0cnVjdCBwcF9od21nciAqaHdtZ3IsCisJ CWNvbnN0IHN0cnVjdCBmaWppX3Bvd2VyX3N0YXRlICpmaWppX3BzKQoreworCWludCByZXN1bHQg PSAwOworCXN0cnVjdCBmaWppX2h3bWdyICpkYXRhID0gKHN0cnVjdCBmaWppX2h3bWdyICopKGh3 bWdyLT5iYWNrZW5kKTsKKwl1aW50MzJfdCBoaWdoX2xpbWl0X2NvdW50OworCisJUFBfQVNTRVJU X1dJVEhfQ09ERSgoZmlqaV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxfY291bnQgPj0gMSksCisJCQki cG93ZXIgc3RhdGUgZGlkIG5vdCBoYXZlIGFueSBwZXJmb3JtYW5jZSBsZXZlbCIsCisJCQlyZXR1 cm4gLTEpOworCisJaGlnaF9saW1pdF9jb3VudCA9ICgxID09IGZpamlfcHMtPnBlcmZvcm1hbmNl X2xldmVsX2NvdW50KSA/IDAgOiAxOworCisJZmlqaV90cmltX3NpbmdsZV9kcG1fc3RhdGVzKGh3 bWdyLAorCQkJJihkYXRhLT5kcG1fdGFibGUuc2Nsa190YWJsZSksCisJCQlmaWppX3BzLT5wZXJm b3JtYW5jZV9sZXZlbHNbMF0uZW5naW5lX2Nsb2NrLAorCQkJZmlqaV9wcy0+cGVyZm9ybWFuY2Vf bGV2ZWxzW2hpZ2hfbGltaXRfY291bnRdLmVuZ2luZV9jbG9jayk7CisKKwlmaWppX3RyaW1fc2lu Z2xlX2RwbV9zdGF0ZXMoaHdtZ3IsCisJCQkmKGRhdGEtPmRwbV90YWJsZS5tY2xrX3RhYmxlKSwK KwkJCWZpamlfcHMtPnBlcmZvcm1hbmNlX2xldmVsc1swXS5tZW1vcnlfY2xvY2ssCisJCQlmaWpp X3BzLT5wZXJmb3JtYW5jZV9sZXZlbHNbaGlnaF9saW1pdF9jb3VudF0ubWVtb3J5X2Nsb2NrKTsK KworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZmlqaV9nZW5lcmF0ZV9kcG1fbGV2 ZWxfZW5hYmxlX21hc2soCisJCXN0cnVjdCBwcF9od21nciAqaHdtZ3IsIGNvbnN0IHZvaWQgKmlu cHV0KQoreworCWludCByZXN1bHQ7CisJY29uc3Qgc3RydWN0IHBobV9zZXRfcG93ZXJfc3RhdGVf aW5wdXQgKnN0YXRlcyA9CisJCQkoY29uc3Qgc3RydWN0IHBobV9zZXRfcG93ZXJfc3RhdGVfaW5w dXQgKilpbnB1dDsKKwlzdHJ1Y3QgZmlqaV9od21nciAqZGF0YSA9IChzdHJ1Y3QgZmlqaV9od21n ciAqKShod21nci0+YmFja2VuZCk7CisJY29uc3Qgc3RydWN0IGZpamlfcG93ZXJfc3RhdGUgKmZp amlfcHMgPQorCQkJY2FzdF9jb25zdF9waHdfZmlqaV9wb3dlcl9zdGF0ZShzdGF0ZXMtPnBuZXdf c3RhdGUpOworCisJcmVzdWx0ID0gZmlqaV90cmltX2RwbV9zdGF0ZXMoaHdtZ3IsIGZpamlfcHMp OworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwlkYXRhLT5kcG1fbGV2ZWxfZW5h YmxlX21hc2suc2Nsa19kcG1fZW5hYmxlX21hc2sgPQorCQkJZmlqaV9nZXRfZHBtX2xldmVsX2Vu YWJsZV9tYXNrX3ZhbHVlKCZkYXRhLT5kcG1fdGFibGUuc2Nsa190YWJsZSk7CisJZGF0YS0+ZHBt X2xldmVsX2VuYWJsZV9tYXNrLm1jbGtfZHBtX2VuYWJsZV9tYXNrID0KKwkJCWZpamlfZ2V0X2Rw bV9sZXZlbF9lbmFibGVfbWFza192YWx1ZSgmZGF0YS0+ZHBtX3RhYmxlLm1jbGtfdGFibGUpOwor CWRhdGEtPmxhc3RfbWNsa19kcG1fZW5hYmxlX21hc2sgPQorCQkJZGF0YS0+ZHBtX2xldmVsX2Vu YWJsZV9tYXNrLm1jbGtfZHBtX2VuYWJsZV9tYXNrOworCisJaWYgKGRhdGEtPnV2ZF9lbmFibGVk KSB7CisJCWlmIChkYXRhLT5kcG1fbGV2ZWxfZW5hYmxlX21hc2subWNsa19kcG1fZW5hYmxlX21h c2sgJiAxKQorCQkJZGF0YS0+ZHBtX2xldmVsX2VuYWJsZV9tYXNrLm1jbGtfZHBtX2VuYWJsZV9t YXNrICY9IDB4RkZGRkZGRkU7CisJfQorCisJZGF0YS0+ZHBtX2xldmVsX2VuYWJsZV9tYXNrLnBj aWVfZHBtX2VuYWJsZV9tYXNrID0KKwkJCWZpamlfZ2V0X2RwbV9sZXZlbF9lbmFibGVfbWFza192 YWx1ZSgmZGF0YS0+ZHBtX3RhYmxlLnBjaWVfc3BlZWRfdGFibGUpOworCisJcmV0dXJuIDA7Cit9 CisKK3N0YXRpYyBpbnQgZmlqaV9lbmFibGVfZGlzYWJsZV92Y2VfZHBtKHN0cnVjdCBwcF9od21n ciAqaHdtZ3IsIGJvb2wgZW5hYmxlKQoreworCXJldHVybiBzbXVtX3NlbmRfbXNnX3RvX3NtYyho d21nci0+c211bWdyLCBlbmFibGU/CisJCQlQUFNNQ19NU0dfVkNFRFBNX0VuYWJsZSA6CisJCQlQ UFNNQ19NU0dfVkNFRFBNX0Rpc2FibGUpOworfQorCitzdGF0aWMgaW50IGZpamlfdXBkYXRlX3Zj ZV9kcG0oc3RydWN0IHBwX2h3bWdyICpod21nciwgY29uc3Qgdm9pZCAqaW5wdXQpCit7CisJY29u c3Qgc3RydWN0IHBobV9zZXRfcG93ZXJfc3RhdGVfaW5wdXQgKnN0YXRlcyA9CisJCQkoY29uc3Qg c3RydWN0IHBobV9zZXRfcG93ZXJfc3RhdGVfaW5wdXQgKilpbnB1dDsKKwlzdHJ1Y3QgZmlqaV9o d21nciAqZGF0YSA9IChzdHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJY29u c3Qgc3RydWN0IGZpamlfcG93ZXJfc3RhdGUgKmZpamlfbnBzID0KKwkJCWNhc3RfY29uc3RfcGh3 X2ZpamlfcG93ZXJfc3RhdGUoc3RhdGVzLT5wbmV3X3N0YXRlKTsKKwljb25zdCBzdHJ1Y3QgZmlq aV9wb3dlcl9zdGF0ZSAqZmlqaV9jcHMgPQorCQkJY2FzdF9jb25zdF9waHdfZmlqaV9wb3dlcl9z dGF0ZShzdGF0ZXMtPnBjdXJyZW50X3N0YXRlKTsKKworCXVpbnQzMl90IG1tX2Jvb3RfbGV2ZWxf b2Zmc2V0LCBtbV9ib290X2xldmVsX3ZhbHVlOworCXN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0 aW9uICp0YWJsZV9pbmZvID0KKwkJCShzdHJ1Y3QgcGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqKSho d21nci0+cHB0YWJsZSk7CisKKwlpZiAoZmlqaV9ucHMtPnZjZV9jbGtzLmV2Y2xrID4wICYmCisJ KGZpamlfY3BzID09IE5VTEwgfHwgZmlqaV9jcHMtPnZjZV9jbGtzLmV2Y2xrID09IDApKSB7CisJ CWRhdGEtPnNtY19zdGF0ZV90YWJsZS5WY2VCb290TGV2ZWwgPQorCQkJCSh1aW50OF90KSAodGFi bGVfaW5mby0+bW1fZGVwX3RhYmxlLT5jb3VudCAtIDEpOworCisJCW1tX2Jvb3RfbGV2ZWxfb2Zm c2V0ID0gZGF0YS0+ZHBtX3RhYmxlX3N0YXJ0ICsKKwkJCQlvZmZzZXRvZihTTVU3M19EaXNjcmV0 ZV9EcG1UYWJsZSwgVmNlQm9vdExldmVsKTsKKwkJbW1fYm9vdF9sZXZlbF9vZmZzZXQgLz0gNDsK KwkJbW1fYm9vdF9sZXZlbF9vZmZzZXQgKj0gNDsKKwkJbW1fYm9vdF9sZXZlbF92YWx1ZSA9IGNn c19yZWFkX2luZF9yZWdpc3Rlcihod21nci0+ZGV2aWNlLAorCQkJCUNHU19JTkRfUkVHX19TTUMs IG1tX2Jvb3RfbGV2ZWxfb2Zmc2V0KTsKKwkJbW1fYm9vdF9sZXZlbF92YWx1ZSAmPSAweEZGMDBG RkZGOworCQltbV9ib290X2xldmVsX3ZhbHVlIHw9IGRhdGEtPnNtY19zdGF0ZV90YWJsZS5WY2VC b290TGV2ZWwgPDwgMTY7CisJCWNnc193cml0ZV9pbmRfcmVnaXN0ZXIoaHdtZ3ItPmRldmljZSwK KwkJCQlDR1NfSU5EX1JFR19fU01DLCBtbV9ib290X2xldmVsX29mZnNldCwgbW1fYm9vdF9sZXZl bF92YWx1ZSk7CisKKwkJaWYgKHBobV9jYXBfZW5hYmxlZChod21nci0+cGxhdGZvcm1fZGVzY3Jp cHRvci5wbGF0Zm9ybUNhcHMsCisJCQkJUEhNX1BsYXRmb3JtQ2Fwc19TdGFibGVQU3RhdGUpKSB7 CisJCQlzbXVtX3NlbmRfbXNnX3RvX3NtY193aXRoX3BhcmFtZXRlcihod21nci0+c211bWdyLAor CQkJCQlQUFNNQ19NU0dfVkNFRFBNX1NldEVuYWJsZWRNYXNrLAorCQkJCQkodWludDMyX3QpMSA8 PCBkYXRhLT5zbWNfc3RhdGVfdGFibGUuVmNlQm9vdExldmVsKTsKKworCQkJZmlqaV9lbmFibGVf ZGlzYWJsZV92Y2VfZHBtKGh3bWdyLCB0cnVlKTsKKwkJfSBlbHNlIGlmIChmaWppX25wcy0+dmNl X2Nsa3MuZXZjbGsgPT0gMCAmJgorCQkJCWZpamlfY3BzICE9IE5VTEwgJiYKKwkJCQlmaWppX2Nw cy0+dmNlX2Nsa3MuZXZjbGsgPiAwKQorCQkJZmlqaV9lbmFibGVfZGlzYWJsZV92Y2VfZHBtKGh3 bWdyLCBmYWxzZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlqaV91cGRh dGVfc2Nsa190aHJlc2hvbGQoc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwlzdHJ1Y3QgZmlq aV9od21nciAqZGF0YSA9IChzdHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+YmFja2VuZCk7CisK KwlpbnQgcmVzdWx0ID0gMDsKKwl1aW50MzJfdCBsb3dfc2Nsa19pbnRlcnJ1cHRfdGhyZXNob2xk ID0gMDsKKworCWlmIChwaG1fY2FwX2VuYWJsZWQoaHdtZ3ItPnBsYXRmb3JtX2Rlc2NyaXB0b3Iu cGxhdGZvcm1DYXBzLAorCQkJUEhNX1BsYXRmb3JtQ2Fwc19TY2xrVGhyb3R0bGVMb3dOb3RpZmlj YXRpb24pCisJCSYmIChod21nci0+Z2Z4X2FyYml0ZXIuc2Nsa190aHJlc2hvbGQgIT0KKwkJCQlk YXRhLT5sb3dfc2Nsa19pbnRlcnJ1cHRfdGhyZXNob2xkKSkgeworCQlkYXRhLT5sb3dfc2Nsa19p bnRlcnJ1cHRfdGhyZXNob2xkID0KKwkJCQlod21nci0+Z2Z4X2FyYml0ZXIuc2Nsa190aHJlc2hv bGQ7CisJCWxvd19zY2xrX2ludGVycnVwdF90aHJlc2hvbGQgPQorCQkJCWRhdGEtPmxvd19zY2xr X2ludGVycnVwdF90aHJlc2hvbGQ7CisKKwkJQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VMKGxv d19zY2xrX2ludGVycnVwdF90aHJlc2hvbGQpOworCisJCXJlc3VsdCA9IGZpamlfY29weV9ieXRl c190b19zbWMoCisJCQkJaHdtZ3ItPnNtdW1nciwKKwkJCQlkYXRhLT5kcG1fdGFibGVfc3RhcnQg KworCQkJCW9mZnNldG9mKFNNVTczX0Rpc2NyZXRlX0RwbVRhYmxlLAorCQkJCQlMb3dTY2xrSW50 ZXJydXB0VGhyZXNob2xkKSwKKwkJCQkodWludDhfdCAqKSZsb3dfc2Nsa19pbnRlcnJ1cHRfdGhy ZXNob2xkLAorCQkJCXNpemVvZih1aW50MzJfdCksCisJCQkJZGF0YS0+c3JhbV9lbmQpOworCX0K KworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZmlqaV9wcm9ncmFtX21lbV90aW1p bmdfcGFyYW1ldGVycyhzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCXN0cnVjdCBmaWppX2h3 bWdyICpkYXRhID0gKHN0cnVjdCBmaWppX2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKworCWlm IChkYXRhLT5uZWVkX3VwZGF0ZV9zbXU3X2RwbV90YWJsZSAmCisJCShEUE1UQUJMRV9PRF9VUERB VEVfU0NMSyArIERQTVRBQkxFX09EX1VQREFURV9NQ0xLKSkKKwkJcmV0dXJuIGZpamlfcHJvZ3Jh bV9tZW1vcnlfdGltaW5nX3BhcmFtZXRlcnMoaHdtZ3IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyBpbnQgZmlqaV91bmZyZWV6ZV9zY2xrX21jbGtfZHBtKHN0cnVjdCBwcF9od21nciAqaHdt Z3IpCit7CisJc3RydWN0IGZpamlfaHdtZ3IgKmRhdGEgPSAoc3RydWN0IGZpamlfaHdtZ3IgKiko aHdtZ3ItPmJhY2tlbmQpOworCisJaWYgKDAgPT0gZGF0YS0+bmVlZF91cGRhdGVfc211N19kcG1f dGFibGUpCisJCXJldHVybiAwOworCisJaWYgKCgwID09IGRhdGEtPnNjbGtfZHBtX2tleV9kaXNh YmxlZCkgJiYKKwkJKGRhdGEtPm5lZWRfdXBkYXRlX3NtdTdfZHBtX3RhYmxlICYKKwkJKERQTVRB QkxFX09EX1VQREFURV9TQ0xLICsgRFBNVEFCTEVfVVBEQVRFX1NDTEspKSkgeworCisJCVBQX0FT U0VSVF9XSVRIX0NPREUodHJ1ZSA9PSBmaWppX2lzX2RwbV9ydW5uaW5nKGh3bWdyKSwKKwkJCQki VHJ5aW5nIHRvIFVuZnJlZXplIFNDTEsgRFBNIHdoZW4gRFBNIGlzIGRpc2FibGVkIiwpOworCQlQ UF9BU1NFUlRfV0lUSF9DT0RFKDAgPT0gc211bV9zZW5kX21zZ190b19zbWMoaHdtZ3ItPnNtdW1n ciwKKwkJCQlQUFNNQ19NU0dfU0NMS0RQTV9VbmZyZWV6ZUxldmVsKSwKKwkJCSJGYWlsZWQgdG8g dW5mcmVlemUgU0NMSyBEUE0gZHVyaW5nIFVuRnJlZXplU2Nsa01jbGtEUE0gRnVuY3Rpb24hIiwK KwkJCXJldHVybiAtMSk7CisJfQorCisJaWYgKCgwID09IGRhdGEtPm1jbGtfZHBtX2tleV9kaXNh YmxlZCkgJiYKKwkJKGRhdGEtPm5lZWRfdXBkYXRlX3NtdTdfZHBtX3RhYmxlICYgRFBNVEFCTEVf T0RfVVBEQVRFX01DTEspKSB7CisKKwkJUFBfQVNTRVJUX1dJVEhfQ09ERSh0cnVlID09IGZpamlf aXNfZHBtX3J1bm5pbmcoaHdtZ3IpLAorCQkJCSJUcnlpbmcgdG8gVW5mcmVlemUgTUNMSyBEUE0g d2hlbiBEUE0gaXMgZGlzYWJsZWQiLCk7CisJCVBQX0FTU0VSVF9XSVRIX0NPREUoMCA9PSBzbXVt X3NlbmRfbXNnX3RvX3NtYyhod21nci0+c211bWdyLAorCQkJCVBQU01DX01TR19TQ0xLRFBNX1Vu ZnJlZXplTGV2ZWwpLAorCQkgICAgIkZhaWxlZCB0byB1bmZyZWV6ZSBNQ0xLIERQTSBkdXJpbmcg VW5GcmVlemVTY2xrTWNsa0RQTSBGdW5jdGlvbiEiLAorCQkgICAgcmV0dXJuIC0xKTsKKwl9CisK KwlkYXRhLT5uZWVkX3VwZGF0ZV9zbXU3X2RwbV90YWJsZSA9IDA7CisKKwlyZXR1cm4gMDsKK30K KworLyogTG9vayB1cCB0aGUgdm9sdGFnZWQgYmFzZWQgb24gREFMJ3MgcmVxdWVzdGVkIGxldmVs LgorICogYW5kIHRoZW4gc2VuZCB0aGUgcmVxdWVzdGVkIFZEREMgdm9sdGFnZSB0byBTTUMKKyAq Lworc3RhdGljIHZvaWQgZmlqaV9hcHBseV9kYWxfbWluaW11bV92b2x0YWdlX3JlcXVlc3Qoc3Ry dWN0IHBwX2h3bWdyICpod21ncikKK3sKKwlyZXR1cm47Cit9CisKK2ludCBmaWppX3VwbG9hZF9k cG1fbGV2ZWxfZW5hYmxlX21hc2soc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwlpbnQgcmVz dWx0OworCXN0cnVjdCBmaWppX2h3bWdyICpkYXRhID0gKHN0cnVjdCBmaWppX2h3bWdyICopKGh3 bWdyLT5iYWNrZW5kKTsKKworCS8qIEFwcGx5IG1pbmltdW0gdm9sdGFnZSBiYXNlZCBvbiBEQUwn cyByZXF1ZXN0IGxldmVsICovCisJZmlqaV9hcHBseV9kYWxfbWluaW11bV92b2x0YWdlX3JlcXVl c3QoaHdtZ3IpOworCisJaWYgKDAgPT0gZGF0YS0+c2Nsa19kcG1fa2V5X2Rpc2FibGVkKSB7CisJ CS8qIENoZWNraW5nIGlmIERQTSBpcyBydW5uaW5nLiAgSWYgd2UgZGlzY292ZXIgaGFuZyBiZWNh dXNlIG9mIHRoaXMsCisJCSAqICB3ZSBzaG91bGQgc2tpcCB0aGlzIG1lc3NhZ2UuCisJCSAqLwor CQlpZiAoIWZpamlfaXNfZHBtX3J1bm5pbmcoaHdtZ3IpKQorCQkJcHJpbnRrKEtFUk5fRVJSICJb IHBvd2VycGxheSBdICIKKwkJCQkJIlRyeWluZyB0byBzZXQgRW5hYmxlIE1hc2sgd2hlbiBEUE0g aXMgZGlzYWJsZWQgXG4iKTsKKworCQlpZiAoZGF0YS0+ZHBtX2xldmVsX2VuYWJsZV9tYXNrLnNj bGtfZHBtX2VuYWJsZV9tYXNrKSB7CisJCQlyZXN1bHQgPSBzbXVtX3NlbmRfbXNnX3RvX3NtY193 aXRoX3BhcmFtZXRlcihod21nci0+c211bWdyLAorCQkJCQlQUFNNQ19NU0dfU0NMS0RQTV9TZXRF bmFibGVkTWFzaywKKwkJCQkJZGF0YS0+ZHBtX2xldmVsX2VuYWJsZV9tYXNrLnNjbGtfZHBtX2Vu YWJsZV9tYXNrKTsKKwkJCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgPT0gcmVzdWx0KSwKKwkJCQki U2V0IFNjbGsgRHBtIGVuYWJsZSBNYXNrIGZhaWxlZCIsIHJldHVybiAtMSk7CisJCX0KKwl9CisK KwlpZiAoMCA9PSBkYXRhLT5tY2xrX2RwbV9rZXlfZGlzYWJsZWQpIHsKKwkJLyogQ2hlY2tpbmcg aWYgRFBNIGlzIHJ1bm5pbmcuICBJZiB3ZSBkaXNjb3ZlciBoYW5nIGJlY2F1c2Ugb2YgdGhpcywK KwkJICogIHdlIHNob3VsZCBza2lwIHRoaXMgbWVzc2FnZS4KKwkJICovCisJCWlmICghZmlqaV9p c19kcG1fcnVubmluZyhod21ncikpCisJCQlwcmludGsoS0VSTl9FUlIgIlsgcG93ZXJwbGF5IF0i CisJCQkJCSIgVHJ5aW5nIHRvIHNldCBFbmFibGUgTWFzayB3aGVuIERQTSBpcyBkaXNhYmxlZCBc biIpOworCisJCWlmIChkYXRhLT5kcG1fbGV2ZWxfZW5hYmxlX21hc2subWNsa19kcG1fZW5hYmxl X21hc2spIHsKKwkJCXJlc3VsdCA9IHNtdW1fc2VuZF9tc2dfdG9fc21jX3dpdGhfcGFyYW1ldGVy KGh3bWdyLT5zbXVtZ3IsCisJCQkJCVBQU01DX01TR19NQ0xLRFBNX1NldEVuYWJsZWRNYXNrLAor CQkJCQlkYXRhLT5kcG1fbGV2ZWxfZW5hYmxlX21hc2subWNsa19kcG1fZW5hYmxlX21hc2spOwor CQkJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSByZXN1bHQpLAorCQkJCSJTZXQgTWNsayBEcG0g ZW5hYmxlIE1hc2sgZmFpbGVkIiwgcmV0dXJuIC0xKTsKKwkJfQorCX0KKworCXJldHVybiAwOwor fQorCitzdGF0aWMgaW50IGZpamlfbm90aWZ5X2xpbmtfc3BlZWRfY2hhbmdlX2FmdGVyX3N0YXRl X2NoYW5nZSgKKwkJc3RydWN0IHBwX2h3bWdyICpod21nciwgY29uc3Qgdm9pZCAqaW5wdXQpCit7 CisJY29uc3Qgc3RydWN0IHBobV9zZXRfcG93ZXJfc3RhdGVfaW5wdXQgKnN0YXRlcyA9CisJCQko Y29uc3Qgc3RydWN0IHBobV9zZXRfcG93ZXJfc3RhdGVfaW5wdXQgKilpbnB1dDsKKwlzdHJ1Y3Qg ZmlqaV9od21nciAqZGF0YSA9IChzdHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+YmFja2VuZCk7 CisJY29uc3Qgc3RydWN0IGZpamlfcG93ZXJfc3RhdGUgKmZpamlfcHMgPQorCQkJY2FzdF9jb25z dF9waHdfZmlqaV9wb3dlcl9zdGF0ZShzdGF0ZXMtPnBuZXdfc3RhdGUpOworCXVpbnQxNl90IHRh cmdldF9saW5rX3NwZWVkID0gZmlqaV9nZXRfbWF4aW11bV9saW5rX3NwZWVkKGh3bWdyLCBmaWpp X3BzKTsKKwl1aW50OF90ICByZXF1ZXN0OworCisJaWYgKGRhdGEtPnBzcHBfbm90aWZ5X3JlcXVp cmVkKSB7CisJCWlmICh0YXJnZXRfbGlua19zcGVlZCA9PSBQUF9QQ0lFR2VuMykKKwkJCXJlcXVl c3QgPSBQQ0lFX1BFUkZfUkVRX0dFTjM7CisJCWVsc2UgaWYgKHRhcmdldF9saW5rX3NwZWVkID09 IFBQX1BDSUVHZW4yKQorCQkJcmVxdWVzdCA9IFBDSUVfUEVSRl9SRVFfR0VOMjsKKwkJZWxzZQor CQkJcmVxdWVzdCA9IFBDSUVfUEVSRl9SRVFfR0VOMTsKKworCQlpZihyZXF1ZXN0ID09IFBDSUVf UEVSRl9SRVFfR0VOMSAmJgorCQkJCWZpamlfZ2V0X2N1cnJlbnRfcGNpZV9zcGVlZChod21ncikg PiAwKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKGFjcGlfcGNpZV9wZXJmX3JlcXVlc3QoaHdtZ3It PmRldmljZSwgcmVxdWVzdCwgZmFsc2UpKSB7CisJCQlpZiAoUFBfUENJRUdlbjIgPT0gdGFyZ2V0 X2xpbmtfc3BlZWQpCisJCQkJcHJpbnRrKCJQU1BQIHJlcXVlc3QgdG8gc3dpdGNoIHRvIEdlbjIg ZnJvbSBHZW4zIEZhaWxlZCEiKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoIlBTUFAgcmVxdWVzdCB0 byBzd2l0Y2ggdG8gR2VuMSBmcm9tIEdlbjIgRmFpbGVkISIpOworCQl9CisJfQorCisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyBpbnQgZmlqaV9zZXRfcG93ZXJfc3RhdGVfdGFza3Moc3RydWN0IHBw X2h3bWdyICpod21nciwKKwkJY29uc3Qgdm9pZCAqaW5wdXQpCit7CisJaW50IHRtcF9yZXN1bHQs IHJlc3VsdCA9IDA7CisKKwl0bXBfcmVzdWx0ID0gZmlqaV9maW5kX2RwbV9zdGF0ZXNfY2xvY2tz X2luX2RwbV90YWJsZShod21nciwgaW5wdXQpOworCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgPT0g dG1wX3Jlc3VsdCksCisJCQkiRmFpbGVkIHRvIGZpbmQgRFBNIHN0YXRlcyBjbG9ja3MgaW4gRFBN IHRhYmxlISIsCisJCQlyZXN1bHQgPSB0bXBfcmVzdWx0KTsKKworCWlmIChwaG1fY2FwX2VuYWJs ZWQoaHdtZ3ItPnBsYXRmb3JtX2Rlc2NyaXB0b3IucGxhdGZvcm1DYXBzLAorCQkJUEhNX1BsYXRm b3JtQ2Fwc19QQ0lFUGVyZm9ybWFuY2VSZXF1ZXN0KSkgeworCQl0bXBfcmVzdWx0ID0KKwkJCWZp amlfcmVxdWVzdF9saW5rX3NwZWVkX2NoYW5nZV9iZWZvcmVfc3RhdGVfY2hhbmdlKGh3bWdyLCBp bnB1dCk7CisJCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgPT0gdG1wX3Jlc3VsdCksCisJCQkJIkZh aWxlZCB0byByZXF1ZXN0IGxpbmsgc3BlZWQgY2hhbmdlIGJlZm9yZSBzdGF0ZSBjaGFuZ2UhIiwK KwkJCQlyZXN1bHQgPSB0bXBfcmVzdWx0KTsKKwl9CisKKwl0bXBfcmVzdWx0ID0gZmlqaV9mcmVl emVfc2Nsa19tY2xrX2RwbShod21ncik7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSB0bXBf cmVzdWx0KSwKKwkJCSJGYWlsZWQgdG8gZnJlZXplIFNDTEsgTUNMSyBEUE0hIiwgcmVzdWx0ID0g dG1wX3Jlc3VsdCk7CisKKwl0bXBfcmVzdWx0ID0gZmlqaV9wb3B1bGF0ZV9hbmRfdXBsb2FkX3Nj bGtfbWNsa19kcG1fbGV2ZWxzKGh3bWdyLCBpbnB1dCk7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgo MCA9PSB0bXBfcmVzdWx0KSwKKwkJCSJGYWlsZWQgdG8gcG9wdWxhdGUgYW5kIHVwbG9hZCBTQ0xL IE1DTEsgRFBNIGxldmVscyEiLAorCQkJcmVzdWx0ID0gdG1wX3Jlc3VsdCk7CisKKwl0bXBfcmVz dWx0ID0gZmlqaV9nZW5lcmF0ZV9kcG1fbGV2ZWxfZW5hYmxlX21hc2soaHdtZ3IsIGlucHV0KTsK KwlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09IHRtcF9yZXN1bHQpLAorCQkJIkZhaWxlZCB0byBn ZW5lcmF0ZSBEUE0gbGV2ZWwgZW5hYmxlZCBtYXNrISIsCisJCQlyZXN1bHQgPSB0bXBfcmVzdWx0 KTsKKworCXRtcF9yZXN1bHQgPSBmaWppX3VwZGF0ZV92Y2VfZHBtKGh3bWdyLCBpbnB1dCk7CisJ UFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSB0bXBfcmVzdWx0KSwKKwkJCSJGYWlsZWQgdG8gdXBk YXRlIFZDRSBEUE0hIiwKKwkJCXJlc3VsdCA9IHRtcF9yZXN1bHQpOworCisJdG1wX3Jlc3VsdCA9 IGZpamlfdXBkYXRlX3NjbGtfdGhyZXNob2xkKGh3bWdyKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RF KCgwID09IHRtcF9yZXN1bHQpLAorCQkJIkZhaWxlZCB0byB1cGRhdGUgU0NMSyB0aHJlc2hvbGQh IiwKKwkJCXJlc3VsdCA9IHRtcF9yZXN1bHQpOworCisJdG1wX3Jlc3VsdCA9IGZpamlfcHJvZ3Jh bV9tZW1fdGltaW5nX3BhcmFtZXRlcnMoaHdtZ3IpOworCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAg PT0gdG1wX3Jlc3VsdCksCisJCQkiRmFpbGVkIHRvIHByb2dyYW0gbWVtb3J5IHRpbWluZyBwYXJh bWV0ZXJzISIsCisJCQlyZXN1bHQgPSB0bXBfcmVzdWx0KTsKKworCXRtcF9yZXN1bHQgPSBmaWpp X3VuZnJlZXplX3NjbGtfbWNsa19kcG0oaHdtZ3IpOworCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAg PT0gdG1wX3Jlc3VsdCksCisJCQkiRmFpbGVkIHRvIHVuZnJlZXplIFNDTEsgTUNMSyBEUE0hIiwK KwkJCXJlc3VsdCA9IHRtcF9yZXN1bHQpOworCisJdG1wX3Jlc3VsdCA9IGZpamlfdXBsb2FkX2Rw bV9sZXZlbF9lbmFibGVfbWFzayhod21ncik7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSB0 bXBfcmVzdWx0KSwKKwkJCSJGYWlsZWQgdG8gdXBsb2FkIERQTSBsZXZlbCBlbmFibGVkIG1hc2sh IiwKKwkJCXJlc3VsdCA9IHRtcF9yZXN1bHQpOworCisJaWYgKHBobV9jYXBfZW5hYmxlZChod21n ci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCQlQSE1fUGxhdGZvcm1DYXBz X1BDSUVQZXJmb3JtYW5jZVJlcXVlc3QpKSB7CisJCXRtcF9yZXN1bHQgPQorCQkJZmlqaV9ub3Rp ZnlfbGlua19zcGVlZF9jaGFuZ2VfYWZ0ZXJfc3RhdGVfY2hhbmdlKGh3bWdyLCBpbnB1dCk7CisJ CVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgPT0gdG1wX3Jlc3VsdCksCisJCQkJIkZhaWxlZCB0byBu b3RpZnkgbGluayBzcGVlZCBjaGFuZ2UgYWZ0ZXIgc3RhdGUgY2hhbmdlISIsCisJCQkJcmVzdWx0 ID0gdG1wX3Jlc3VsdCk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBm aWppX2RwbV9nZXRfc2NsayhzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyLCBib29sIGxvdykKK3sKKwlz dHJ1Y3QgcHBfcG93ZXJfc3RhdGUgICpwczsKKwlzdHJ1Y3QgZmlqaV9wb3dlcl9zdGF0ZSAgKmZp amlfcHM7CisKKwlpZiAoaHdtZ3IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwcyA9 IGh3bWdyLT5yZXF1ZXN0X3BzOworCisJaWYgKHBzID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFM OworCisJZmlqaV9wcyA9IGNhc3RfcGh3X2ZpamlfcG93ZXJfc3RhdGUoJnBzLT5oYXJkd2FyZSk7 CisKKwlpZiAobG93KQorCQlyZXR1cm4gZmlqaV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxzWzBdLmVu Z2luZV9jbG9jazsKKwllbHNlCisJCXJldHVybiBmaWppX3BzLT5wZXJmb3JtYW5jZV9sZXZlbHMK KwkJCQlbZmlqaV9wcy0+cGVyZm9ybWFuY2VfbGV2ZWxfY291bnQtMV0uZW5naW5lX2Nsb2NrOwor fQorCitzdGF0aWMgaW50IGZpamlfZHBtX2dldF9tY2xrKHN0cnVjdCBwcF9od21nciAqaHdtZ3Is IGJvb2wgbG93KQoreworCXN0cnVjdCBwcF9wb3dlcl9zdGF0ZSAgKnBzOworCXN0cnVjdCBmaWpp X3Bvd2VyX3N0YXRlICAqZmlqaV9wczsKKworCWlmIChod21nciA9PSBOVUxMKQorCQlyZXR1cm4g LUVJTlZBTDsKKworCXBzID0gaHdtZ3ItPnJlcXVlc3RfcHM7CisKKwlpZiAocHMgPT0gTlVMTCkK KwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmaWppX3BzID0gY2FzdF9waHdfZmlqaV9wb3dlcl9zdGF0 ZSgmcHMtPmhhcmR3YXJlKTsKKworCWlmIChsb3cpCisJCXJldHVybiBmaWppX3BzLT5wZXJmb3Jt YW5jZV9sZXZlbHNbMF0ubWVtb3J5X2Nsb2NrOworCWVsc2UKKwkJcmV0dXJuIGZpamlfcHMtPnBl cmZvcm1hbmNlX2xldmVscworCQkJCVtmaWppX3BzLT5wZXJmb3JtYW5jZV9sZXZlbF9jb3VudC0x XS5tZW1vcnlfY2xvY2s7Cit9CisKK3N0YXRpYyB2b2lkIGZpamlfcHJpbnRfY3VycmVudF9wZXJm b3JjZV9sZXZlbCgKKwkJc3RydWN0IHBwX2h3bWdyICpod21nciwgc3RydWN0IHNlcV9maWxlICpt KQoreworCXVpbnQzMl90IHNjbGssIG1jbGs7CisKKwlzbXVtX3NlbmRfbXNnX3RvX3NtYyhod21n ci0+c211bWdyLCBQUFNNQ19NU0dfQVBJX0dldFNjbGtGcmVxdWVuY3kpOworCisJc2NsayA9IGNn c19yZWFkX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIG1tU01DX01TR19BUkdfMCk7CisKKwlzbXVt X3NlbmRfbXNnX3RvX3NtYyhod21nci0+c211bWdyLCBQUFNNQ19NU0dfQVBJX0dldE1jbGtGcmVx dWVuY3kpOworCisJbWNsayA9IGNnc19yZWFkX3JlZ2lzdGVyKGh3bWdyLT5kZXZpY2UsIG1tU01D X01TR19BUkdfMCk7CisJc2VxX3ByaW50ZihtLCAiXG4gWyAgbWNsayAgXTogJXUgTUh6XG5cbiBb ICBzY2xrICBdOiAldSBNSHpcbiIsCisJCQltY2xrIC8gMTAwLCBzY2xrIC8gMTAwKTsKK30KKwor c3RhdGljIGNvbnN0IHN0cnVjdCBwcF9od21ncl9mdW5jIGZpamlfaHdtZ3JfZnVuY3MgPSB7CisJ LmJhY2tlbmRfaW5pdCA9ICZmaWppX2h3bWdyX2JhY2tlbmRfaW5pdCwKKwkuYmFja2VuZF9maW5p ID0gJnRvbmdhX2h3bWdyX2JhY2tlbmRfZmluaSwKKwkuYXNpY19zZXR1cCA9ICZmaWppX3NldHVw X2FzaWNfdGFzaywKKwkuZHluYW1pY19zdGF0ZV9tYW5hZ2VtZW50X2VuYWJsZSA9ICZmaWppX2Vu YWJsZV9kcG1fdGFza3MsCisJLmZvcmNlX2RwbV9sZXZlbCA9ICZmaWppX2RwbV9mb3JjZV9kcG1f bGV2ZWwsCisJLmdldF9udW1fb2ZfcHBfdGFibGVfZW50cmllcyA9ICZ0b25nYV9nZXRfbnVtYmVy X29mX3Bvd2VycGxheV90YWJsZV9lbnRyaWVzLAorCS5nZXRfcG93ZXJfc3RhdGVfc2l6ZSA9ICZm aWppX2dldF9wb3dlcl9zdGF0ZV9zaXplLAorCS5nZXRfcHBfdGFibGVfZW50cnkgPSAmZmlqaV9n ZXRfcHBfdGFibGVfZW50cnksCisJLnBhdGNoX2Jvb3Rfc3RhdGUgPSAmZmlqaV9wYXRjaF9ib290 X3N0YXRlLAorCS5hcHBseV9zdGF0ZV9hZGp1c3RfcnVsZXMgPSAmZmlqaV9hcHBseV9zdGF0ZV9h ZGp1c3RfcnVsZXMsCisJLnBvd2VyX3N0YXRlX3NldCA9ICZmaWppX3NldF9wb3dlcl9zdGF0ZV90 YXNrcywKKwkuZ2V0X3NjbGsgPSAmZmlqaV9kcG1fZ2V0X3NjbGssCisJLmdldF9tY2xrID0gJmZp amlfZHBtX2dldF9tY2xrLAorCS5wcmludF9jdXJyZW50X3BlcmZvcmNlX2xldmVsID0gJmZpamlf cHJpbnRfY3VycmVudF9wZXJmb3JjZV9sZXZlbCwKK307CisKK2ludCBmaWppX2h3bWdyX2luaXQo c3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwlzdHJ1Y3QgZmlqaV9od21nciAgKmRhdGE7CisJ aW50IHJldCA9IDA7CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZpamlfaHdtZ3Ip LCBHRlBfS0VSTkVMKTsKKwlpZiAoZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwor CWh3bWdyLT5iYWNrZW5kID0gZGF0YTsKKwlod21nci0+aHdtZ3JfZnVuYyA9ICZmaWppX2h3bWdy X2Z1bmNzOworCWh3bWdyLT5wcHRhYmxlX2Z1bmMgPSAmdG9uZ2FfcHB0YWJsZV9mdW5jczsKKwly ZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkv aHdtZ3IvZmlqaV9od21nci5oIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3Iv ZmlqaV9od21nci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZGJlNDkK LS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21nci9m aWppX2h3bWdyLmgKQEAgLTAsMCArMSwzNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBBZHZh bmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3Jh bnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkg b2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUg IlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0 aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwg Y29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAq IGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29u cyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0 IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0 IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgor ICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisg KgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkg T0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJ TUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBG T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5U IFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxF IEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJ TiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBG Uk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNF IE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5k ZWYgX0ZJSklfSFdNR1JfSF8KKyNkZWZpbmUgX0ZJSklfSFdNR1JfSF8KKworI2luY2x1ZGUgImh3 bWdyLmgiCisjaW5jbHVkZSAic211NzMuaCIKKyNpbmNsdWRlICJzbXU3M19kaXNjcmV0ZS5oIgor I2luY2x1ZGUgInBwYXRvbWN0cmwuaCIKKyNpbmNsdWRlICJmaWppX3Bwc21jLmgiCisKKyNkZWZp bmUgRklKSV9NQVhfSEFSRFdBUkVfUE9XRVJMRVZFTFMJMgorI2RlZmluZSBGSUpJX0FUX0RGTFQJ MzAKKworI2RlZmluZSBGSUpJX1ZPTFRBR0VfQ09OVFJPTF9OT05FICAgICAgICAgICAgICAgICAg IDB4MAorI2RlZmluZSBGSUpJX1ZPTFRBR0VfQ09OVFJPTF9CWV9HUElPICAgICAgICAgICAgICAg IDB4MQorI2RlZmluZSBGSUpJX1ZPTFRBR0VfQ09OVFJPTF9CWV9TVklEMiAgICAgICAgICAgICAg IDB4MgorI2RlZmluZSBGSUpJX1ZPTFRBR0VfQ09OVFJPTF9NRVJHRUQgICAgICAgICAgICAgICAg IDB4MworCisjZGVmaW5lIERQTVRBQkxFX09EX1VQREFURV9TQ0xLICAgICAweDAwMDAwMDAxCisj ZGVmaW5lIERQTVRBQkxFX09EX1VQREFURV9NQ0xLICAgICAweDAwMDAwMDAyCisjZGVmaW5lIERQ TVRBQkxFX1VQREFURV9TQ0xLICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIERQTVRBQkxFX1VQ REFURV9NQ0xLICAgICAgICAweDAwMDAwMDA4CisKK3N0cnVjdCBmaWppX3BlcmZvcm1hbmNlX2xl dmVsIHsKKwl1aW50MzJfdCAgbWVtb3J5X2Nsb2NrOworCXVpbnQzMl90ICBlbmdpbmVfY2xvY2s7 CisJdWludDE2X3QgIHBjaWVfZ2VuOworCXVpbnQxNl90ICBwY2llX2xhbmU7Cit9OworCitzdHJ1 Y3QgZmlqaV91dmRfY2xvY2tzIHsKKwl1aW50MzJfdCAgdmNsazsKKwl1aW50MzJfdCAgZGNsazsK K307CisKK3N0cnVjdCBmaWppX3ZjZV9jbG9ja3MgeworCXVpbnQzMl90ICBldmNsazsKKwl1aW50 MzJfdCAgZWNjbGs7Cit9OworCitzdHJ1Y3QgZmlqaV9wb3dlcl9zdGF0ZSB7CisgICAgdWludDMy X3QgICAgICAgICAgICAgICAgICBtYWdpYzsKKyAgICBzdHJ1Y3QgZmlqaV91dmRfY2xvY2tzICAg IHV2ZF9jbGtzOworICAgIHN0cnVjdCBmaWppX3ZjZV9jbG9ja3MgICAgdmNlX2Nsa3M7CisgICAg dWludDMyX3QgICAgICAgICAgICAgICAgICBzYW1fY2xrOworICAgIHVpbnQzMl90ICAgICAgICAg ICAgICAgICAgYWNwX2NsazsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIHBlcmZvcm1h bmNlX2xldmVsX2NvdW50OworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgZGNfY29tcGF0 aWJsZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgIHNjbGtfdGhyZXNob2xkOworICAg IHN0cnVjdCBmaWppX3BlcmZvcm1hbmNlX2xldmVsICBwZXJmb3JtYW5jZV9sZXZlbHNbRklKSV9N QVhfSEFSRFdBUkVfUE9XRVJMRVZFTFNdOworfTsKKworc3RydWN0IGZpamlfZHBtX2xldmVsIHsK Kwlib29sCWVuYWJsZWQ7CisgICAgdWludDMyX3QJdmFsdWU7CisgICAgdWludDMyX3QJcGFyYW0x OworfTsKKworI2RlZmluZSBGSUpJX01BWF9ERUVQU0xFRVBfRElWSURFUl9JRCA1CisjZGVmaW5l IE1BWF9SRUdVTEFSX0RQTV9OVU1CRVIgOAorI2RlZmluZSBGSUpJX01JTklNVU1fRU5HSU5FX0NM T0NLIDI1MDAKKworc3RydWN0IGZpamlfc2luZ2xlX2RwbV90YWJsZSB7CisJdWludDMyX3QJCWNv dW50OworCXN0cnVjdCBmaWppX2RwbV9sZXZlbAlkcG1fbGV2ZWxzW01BWF9SRUdVTEFSX0RQTV9O VU1CRVJdOworfTsKKworc3RydWN0IGZpamlfZHBtX3RhYmxlIHsKKwlzdHJ1Y3QgZmlqaV9zaW5n bGVfZHBtX3RhYmxlICBzY2xrX3RhYmxlOworCXN0cnVjdCBmaWppX3NpbmdsZV9kcG1fdGFibGUg IG1jbGtfdGFibGU7CisJc3RydWN0IGZpamlfc2luZ2xlX2RwbV90YWJsZSAgcGNpZV9zcGVlZF90 YWJsZTsKKwlzdHJ1Y3QgZmlqaV9zaW5nbGVfZHBtX3RhYmxlICB2ZGRjX3RhYmxlOworCXN0cnVj dCBmaWppX3NpbmdsZV9kcG1fdGFibGUgIHZkZGNpX3RhYmxlOworCXN0cnVjdCBmaWppX3Npbmds ZV9kcG1fdGFibGUgIG12ZGRfdGFibGU7Cit9OworCitzdHJ1Y3QgZmlqaV9jbG9ja19yZWdpc3Rl cnMgeworCXVpbnQzMl90ICB2Q0dfU1BMTF9GVU5DX0NOVEw7CisJdWludDMyX3QgIHZDR19TUExM X0ZVTkNfQ05UTF8yOworCXVpbnQzMl90ICB2Q0dfU1BMTF9GVU5DX0NOVExfMzsKKwl1aW50MzJf dCAgdkNHX1NQTExfRlVOQ19DTlRMXzQ7CisJdWludDMyX3QgIHZDR19TUExMX1NQUkVBRF9TUEVD VFJVTTsKKwl1aW50MzJfdCAgdkNHX1NQTExfU1BSRUFEX1NQRUNUUlVNXzI7CisJdWludDMyX3Qg IHZETExfQ05UTDsKKwl1aW50MzJfdCAgdk1DTEtfUFdSTUdUX0NOVEw7CisJdWludDMyX3QgIHZN UExMX0FEX0ZVTkNfQ05UTDsKKwl1aW50MzJfdCAgdk1QTExfRFFfRlVOQ19DTlRMOworCXVpbnQz Ml90ICB2TVBMTF9GVU5DX0NOVEw7CisJdWludDMyX3QgIHZNUExMX0ZVTkNfQ05UTF8xOworCXVp bnQzMl90ICB2TVBMTF9GVU5DX0NOVExfMjsKKwl1aW50MzJfdCAgdk1QTExfU1MxOworCXVpbnQz Ml90ICB2TVBMTF9TUzI7Cit9OworCitzdHJ1Y3QgZmlqaV92b2x0YWdlX3NtaW9fcmVnaXN0ZXJz IHsKKwl1aW50MzJfdCB2UzBfVklEX0xPV0VSX1NNSU9fQ05UTDsKK307CisKKyNkZWZpbmUgRklK SV9NQVhfTEVBS0FHRV9DT1VOVCAgOAorc3RydWN0IGZpamlfbGVha2FnZV92b2x0YWdlIHsKKwl1 aW50MTZfdCAgY291bnQ7CisJdWludDE2X3QgIGxlYWthZ2VfaWRbRklKSV9NQVhfTEVBS0FHRV9D T1VOVF07CisJdWludDE2X3QgIGFjdHVhbF92b2x0YWdlW0ZJSklfTUFYX0xFQUtBR0VfQ09VTlRd OworfTsKKworc3RydWN0IGZpamlfdmJpb3NfYm9vdF9zdGF0ZSB7CisJdWludDE2X3QgICAgbXZk ZF9ib290dXBfdmFsdWU7CisJdWludDE2X3QgICAgdmRkY19ib290dXBfdmFsdWU7CisJdWludDE2 X3QgICAgdmRkY2lfYm9vdHVwX3ZhbHVlOworCXVpbnQzMl90ICAgIHNjbGtfYm9vdHVwX3ZhbHVl OworCXVpbnQzMl90ICAgIG1jbGtfYm9vdHVwX3ZhbHVlOworCXVpbnQxNl90ICAgIHBjaWVfZ2Vu X2Jvb3R1cF92YWx1ZTsKKwl1aW50MTZfdCAgICBwY2llX2xhbmVfYm9vdHVwX3ZhbHVlOworfTsK Kworc3RydWN0IGZpamlfYmFjb3MgeworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICBi ZXN0X21hdGNoOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICBiYWNvX2ZsYWdzOwor CXN0cnVjdCBmaWppX3BlcmZvcm1hbmNlX2xldmVsICBwZXJmb3JtYW5jZV9sZXZlbDsKK307CisK Ky8qIFVsdHJhIExvdyBWb2x0YWdlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBmaWpp X3Vsdl9wYXJtIHsKKwlib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgdWx2X3N1cHBvcnRl ZDsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgY2dfdWx2X3BhcmFtZXRlcjsKKwl1 aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgdWx2X3ZvbHRfY2hhbmdlX2RlbGF5OworCXN0 cnVjdCBmaWppX3BlcmZvcm1hbmNlX2xldmVsICB1bHZfcG93ZXJfbGV2ZWw7Cit9OworCitzdHJ1 Y3QgZmlqaV9kaXNwbGF5X3RpbWluZyB7CisJdWludDMyX3QgIG1pbl9jbG9ja19pbl9zcjsKKwl1 aW50MzJfdCAgbnVtX2V4aXN0aW5nX2Rpc3BsYXlzOworfTsKKworc3RydWN0IGZpamlfZHBtbGV2 ZWxfZW5hYmxlX21hc2sgeworCXVpbnQzMl90ICB1dmRfZHBtX2VuYWJsZV9tYXNrOworCXVpbnQz Ml90ICB2Y2VfZHBtX2VuYWJsZV9tYXNrOworCXVpbnQzMl90ICBhY3BfZHBtX2VuYWJsZV9tYXNr OworCXVpbnQzMl90ICBzYW11X2RwbV9lbmFibGVfbWFzazsKKwl1aW50MzJfdCAgc2Nsa19kcG1f ZW5hYmxlX21hc2s7CisJdWludDMyX3QgIG1jbGtfZHBtX2VuYWJsZV9tYXNrOworCXVpbnQzMl90 ICBwY2llX2RwbV9lbmFibGVfbWFzazsKK307CisKK3N0cnVjdCBmaWppX3BjaWVfcGVyZl9yYW5n ZSB7CisJdWludDE2X3QgIG1heDsKKwl1aW50MTZfdCAgbWluOworfTsKKworc3RydWN0IGZpamlf aHdtZ3IgeworCXN0cnVjdCBmaWppX2RwbV90YWJsZQkJCWRwbV90YWJsZTsKKwlzdHJ1Y3QgZmlq aV9kcG1fdGFibGUJCQlnb2xkZW5fZHBtX3RhYmxlOworCisJdWludDMyX3QJCQkJCQl2b3Rpbmdf cmlnaHRzX2NsaWVudHMwOworCXVpbnQzMl90CQkJCQkJdm90aW5nX3JpZ2h0c19jbGllbnRzMTsK Kwl1aW50MzJfdAkJCQkJCXZvdGluZ19yaWdodHNfY2xpZW50czI7CisJdWludDMyX3QJCQkJCQl2 b3RpbmdfcmlnaHRzX2NsaWVudHMzOworCXVpbnQzMl90CQkJCQkJdm90aW5nX3JpZ2h0c19jbGll bnRzNDsKKwl1aW50MzJfdAkJCQkJCXZvdGluZ19yaWdodHNfY2xpZW50czU7CisJdWludDMyX3QJ CQkJCQl2b3RpbmdfcmlnaHRzX2NsaWVudHM2OworCXVpbnQzMl90CQkJCQkJdm90aW5nX3JpZ2h0 c19jbGllbnRzNzsKKwl1aW50MzJfdAkJCQkJCXN0YXRpY19zY3JlZW5fdGhyZXNob2xkX3VuaXQ7 CisJdWludDMyX3QJCQkJCQlzdGF0aWNfc2NyZWVuX3RocmVzaG9sZDsKKwl1aW50MzJfdAkJCQkJ CXZvbHRhZ2VfY29udHJvbDsKKwl1aW50MzJfdAkJCQkJCXZkZGNfdmRkY2lfZGVsdGE7CisKKwl1 aW50MzJfdAkJCQkJCWFjdGl2ZV9hdXRvX3Rocm90dGxlX3NvdXJjZXM7CisKKwlzdHJ1Y3QgZmlq aV9jbG9ja19yZWdpc3RlcnMgICAgICAgICAgICBjbG9ja19yZWdpc3RlcnM7CisJc3RydWN0IGZp amlfdm9sdGFnZV9zbWlvX3JlZ2lzdGVycyAgICAgIHZvbHRhZ2Vfc21pb19yZWdpc3RlcnM7CisK Kwlib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbWVtb3J5X2dkZHI1OworCXVpbnQx Nl90ICAgICAgICAgICAgICAgICAgICAgICBhY3BpX3ZkZGM7CisJYm9vbCAgICAgICAgICAgICAg ICAgICAgICAgICAgIHBzcHBfbm90aWZ5X3JlcXVpcmVkOworCXVpbnQxNl90ICAgICAgICAgICAg ICAgICAgICAgICBmb3JjZV9wY2llX2dlbjsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgICAg ICAgYWNwaV9wY2llX2dlbjsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgcGNpZV9n ZW5fY2FwOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICBwY2llX2xhbmVfY2FwOwor CXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICBwY2llX3NwY19jYXA7CisJc3RydWN0IGZp amlfbGVha2FnZV92b2x0YWdlICAgICAgICAgIHZkZGNfbGVha2FnZTsKKwlzdHJ1Y3QgZmlqaV9s ZWFrYWdlX3ZvbHRhZ2UgICAgICAgICAgVmRkY2lfbGVha2FnZTsKKworCXVpbnQzMl90ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBtdmRkX2NvbnRyb2w7CisJdWludDMyX3QgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHZkZGNfbWFza19sb3c7CisJdWludDMyX3QgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIG12ZGRfbWFza19sb3c7CisJdWludDE2X3QgICAgICAgICAgICAgICAg ICAgICAgICAgICAgbWF4X3ZkZGNfaW5fcHB0YWJsZTsKKwl1aW50MTZfdCAgICAgICAgICAgICAg ICAgICAgICAgICAgICBtaW5fdmRkY19pbl9wcHRhYmxlOworCXVpbnQxNl90ICAgICAgICAgICAg ICAgICAgICAgICAgICAgIG1heF92ZGRjaV9pbl9wcHRhYmxlOworCXVpbnQxNl90ICAgICAgICAg ICAgICAgICAgICAgICAgICAgIG1pbl92ZGRjaV9pbl9wcHRhYmxlOworCXVpbnQzMl90ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBtY2xrX3N0cm9iZV9tb2RlX3RocmVzaG9sZDsKKwl1aW50 MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWNsa19zdHV0dGVyX21vZGVfdGhyZXNo b2xkOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtY2xrX2VkY19lbmFi bGVfdGhyZXNob2xkOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtY2xr X2VkY3dyX2VuYWJsZV90aHJlc2hvbGQ7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgaXNfdXZkX2VuYWJsZWQ7CisJc3RydWN0IGZpamlfdmJpb3NfYm9vdF9zdGF0ZSAgICAg ICAgdmJpb3NfYm9vdF9zdGF0ZTsKKworCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICBi YXR0ZXJ5X3N0YXRlOworCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICBpc190bHVfZW5h YmxlZDsKKworCS8qIC0tLS0gU01DIFNSQU0gQWRkcmVzcyBvZiBmaXJtd2FyZSBoZWFkZXIgdGFi bGVzIC0tLS0gKi8KKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JhbV9l bmQ7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwbV90YWJsZV9zdGFy dDsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29mdF9yZWdzX3N0YXJ0 OworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtY19yZWdfdGFibGVfc3Rh cnQ7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbl90YWJsZV9zdGFy dDsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJiX3RhYmxlX3N0YXJ0 OworCXN0cnVjdCBTTVU3M19EaXNjcmV0ZV9EcG1UYWJsZSAgICAgICBzbWNfc3RhdGVfdGFibGU7 CisJc3RydWN0IFNNVTczX0Rpc2NyZXRlX1VsdiAgICAgICAgICAgIHVsdl9zZXR0aW5nOworCisJ LyogLS0tLSBTdHVmZiBvcmlnaW5hbGx5IGNvbWluZyBmcm9tIEV2ZXJncmVlbiAtLS0tICovCisJ dWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZkZGNpX2NvbnRyb2w7CisJc3Ry dWN0IHBwX2F0b21jdHJsX3ZvbHRhZ2VfdGFibGUgICAgIHZkZGNfdm9sdGFnZV90YWJsZTsKKwlz dHJ1Y3QgcHBfYXRvbWN0cmxfdm9sdGFnZV90YWJsZSAgICAgdmRkY2lfdm9sdGFnZV90YWJsZTsK KwlzdHJ1Y3QgcHBfYXRvbWN0cmxfdm9sdGFnZV90YWJsZSAgICAgbXZkZF92b2x0YWdlX3RhYmxl OworCisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1nY2dfY2d0dF9sb2Nh bDI7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1nY2dfY2d0dF9sb2Nh bDM7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwaW9fZGVidWc7CisJ dWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jX21pY3JvX2NvZGVfZmVhdHVy ZTsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGVzdF9tY2xrOwor CXVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX3ZkZGNpOworCXVpbnQ4 X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdmRkX2hpZ2hfaW5kZXg7CisJdWludDhf dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12ZGRfbG93X2luZGV4OworCWJvb2wgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbGxfZGVmYXVsdF9vbjsKKwlib29sICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWFuY2VfcmVxdWVzdF9yZWdpc3RlcmVk OworCisJLyogLS0tLSBMb3cgUG93ZXIgRmVhdHVyZXMgLS0tLSAqLworCXN0cnVjdCBmaWppX2Jh Y29zICAgICAgICAgICAgICAgICAgICBiYWNvczsKKwlzdHJ1Y3QgZmlqaV91bHZfcGFybSAgICAg ICAgICAgICAgICAgdWx2OworCisJLyogLS0tLSBDQUMgU3R1ZmYgLS0tLSAqLworCXVpbnQzMl90 ICAgICAgICAgICAgICAgICAgICAgICBjYWNfdGFibGVfc3RhcnQ7CisJYm9vbCAgICAgICAgICAg ICAgICAgICAgICAgICAgIGNhY19jb25maWd1cmF0aW9uX3JlcXVpcmVkOworCWJvb2wgICAgICAg ICAgICAgICAgICAgICAgICAgICBkcml2ZXJfY2FsY3VsYXRlX2NhY19sZWFrYWdlOworCWJvb2wg ICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNfZW5hYmxlZDsKKworCS8qIC0tLS0gRFBNMiBQ YXJhbWV0ZXJzIC0tLS0gKi8KKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgcG93ZXJf Y29udGFpbm1lbnRfZmVhdHVyZXM7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgIGVu YWJsZV9kdGVfZmVhdHVyZTsKKwlib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxl X3RkY19saW1pdF9mZWF0dXJlOworCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFi bGVfcGtnX3B3cl90cmFja2luZ19mZWF0dXJlOworCWJvb2wgICAgICAgICAgICAgICAgICAgICAg ICAgICBkaXNhYmxlX3V2ZF9wb3dlcl90dW5lX2ZlYXR1cmU7CisJc3RydWN0IGZpamlfcHRfZGVm YXVsdHMgICAgICAgKnBvd2VyX3R1bmVfZGVmYXVsdHM7CisJc3RydWN0IFNNVTczX0Rpc2NyZXRl X1BtRnVzZXMgIHBvd2VyX3R1bmVfdGFibGU7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAg ICAgIGR0ZV90al9vZmZzZXQ7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgIGZhc3Rf d2F0ZXJtYXJrX3RocmVzaG9sZDsKKworCS8qIC0tLS0gUGhhc2UgU2hlZGRpbmcgLS0tLSAqLwor CWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZGRjX3BoYXNlX3NoZWRfY29udHJvbDsK KworCS8qIC0tLS0gREkvRFQgLS0tLSAqLworCXN0cnVjdCBmaWppX2Rpc3BsYXlfdGltaW5nICAg ICAgICBkaXNwbGF5X3RpbWluZzsKKworCS8qIC0tLS0gVGhlcm1hbCBUZW1wZXJhdHVyZSBTZXR0 aW5nIC0tLS0gKi8KKwlzdHJ1Y3QgZmlqaV9kcG1sZXZlbF9lbmFibGVfbWFzayAgICAgZHBtX2xl dmVsX2VuYWJsZV9tYXNrOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBu ZWVkX3VwZGF0ZV9zbXU3X2RwbV90YWJsZTsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgc2Nsa19kcG1fa2V5X2Rpc2FibGVkOworCXVpbnQzMl90ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBtY2xrX2RwbV9rZXlfZGlzYWJsZWQ7CisJdWludDMyX3QgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHBjaWVfZHBtX2tleV9kaXNhYmxlZDsKKwl1aW50MzJfdCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgbWluX2VuZ2luZV9jbG9ja3M7CisJc3RydWN0IGZpamlf cGNpZV9wZXJmX3JhbmdlICAgICAgICAgIHBjaWVfZ2VuX3BlcmZvcm1hbmNlOworCXN0cnVjdCBm aWppX3BjaWVfcGVyZl9yYW5nZSAgICAgICAgICBwY2llX2xhbmVfcGVyZm9ybWFuY2U7CisJc3Ry dWN0IGZpamlfcGNpZV9wZXJmX3JhbmdlICAgICAgICAgIHBjaWVfZ2VuX3Bvd2VyX3NhdmluZzsK KwlzdHJ1Y3QgZmlqaV9wY2llX3BlcmZfcmFuZ2UgICAgICAgICAgcGNpZV9sYW5lX3Bvd2VyX3Nh dmluZzsKKwlib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlX3BjaWVfcGVy Zm9ybWFuY2VfbGV2ZWxzOworCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1 c2VfcGNpZV9wb3dlcl9zYXZpbmdfbGV2ZWxzOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBhY3Rpdml0eV90YXJnZXRbU01VNzNfTUFYX0xFVkVMU19HUkFQSElDU107CisJ dWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jbGtfYWN0aXZpdHlfdGFyZ2V0 OworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtY2xrX2RwbTBfYWN0aXZp dHlfdGFyZ2V0OworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dfc2Ns a19pbnRlcnJ1cHRfdGhyZXNob2xkOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBsYXN0X21jbGtfZHBtX2VuYWJsZV9tYXNrOworCWJvb2wgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB1dmRfZW5hYmxlZDsKKworCS8qIC0tLS0gUG93ZXIgR2F0aW5nIFN0YXRl cyAtLS0tICovCisJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2ZF9wb3dlcl9nYXRl ZDsKKwlib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgdmNlX3Bvd2VyX2dhdGVkOworCWJv b2wgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW11X3Bvd2VyX2dhdGVkOworCWJvb2wgICAg ICAgICAgICAgICAgICAgICAgICAgICBhY3BfcG93ZXJfZ2F0ZWQ7CisJYm9vbCAgICAgICAgICAg ICAgICAgICAgICAgICAgIHBnX2FjcF9pbml0OworCWJvb2wgICAgICAgICAgICAgICAgICAgICAg ICAgICBmcnRjX2VuYWJsZWQ7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgIGZydGNf c3RhdHVzX2NoYW5nZWQ7Cit9OworCisvKiBUbyBjb252ZXJ0IHRvIFE4LjggZm9ybWF0IGZvciBm aXJtd2FyZSAqLworI2RlZmluZSBGSUpJX1E4OF9GT1JNQVRfQ09OVkVSU0lPTl9VTklUICAgICAg ICAgICAgIDI1NgorCitlbnVtIEZpamlfSTJDTGluZUlEIHsKKyAgICBGaWppX0kyQ0xpbmVJRF9E REMxID0gMHg5MCwKKyAgICBGaWppX0kyQ0xpbmVJRF9EREMyID0gMHg5MSwKKyAgICBGaWppX0ky Q0xpbmVJRF9EREMzID0gMHg5MiwKKyAgICBGaWppX0kyQ0xpbmVJRF9EREM0ID0gMHg5MywKKyAg ICBGaWppX0kyQ0xpbmVJRF9EREM1ID0gMHg5NCwKKyAgICBGaWppX0kyQ0xpbmVJRF9EREM2ID0g MHg5NSwKKyAgICBGaWppX0kyQ0xpbmVJRF9TQ0xTREEgPSAweDk2LAorICAgIEZpamlfSTJDTGlu ZUlEX0REQ1ZHQSA9IDB4OTcKK307CisKKyNkZWZpbmUgRmlqaV9JMkNfRERDMURBVEEgICAgICAg ICAgMAorI2RlZmluZSBGaWppX0kyQ19EREMxQ0xLICAgICAgICAgICAxCisjZGVmaW5lIEZpamlf STJDX0REQzJEQVRBICAgICAgICAgIDIKKyNkZWZpbmUgRmlqaV9JMkNfRERDMkNMSyAgICAgICAg ICAgMworI2RlZmluZSBGaWppX0kyQ19EREMzREFUQSAgICAgICAgICA0CisjZGVmaW5lIEZpamlf STJDX0REQzNDTEsgICAgICAgICAgIDUKKyNkZWZpbmUgRmlqaV9JMkNfU0RBICAgICAgICAgICAg ICAgNDAKKyNkZWZpbmUgRmlqaV9JMkNfU0NMICAgICAgICAgICAgICAgNDEKKyNkZWZpbmUgRmlq aV9JMkNfRERDNERBVEEgICAgICAgICAgNjUKKyNkZWZpbmUgRmlqaV9JMkNfRERDNENMSyAgICAg ICAgICAgNjYKKyNkZWZpbmUgRmlqaV9JMkNfRERDNURBVEEgICAgICAgICAgMHg0OAorI2RlZmlu ZSBGaWppX0kyQ19EREM1Q0xLICAgICAgICAgICAweDQ5CisjZGVmaW5lIEZpamlfSTJDX0REQzZE QVRBICAgICAgICAgIDB4NGEKKyNkZWZpbmUgRmlqaV9JMkNfRERDNkNMSyAgICAgICAgICAgMHg0 YgorI2RlZmluZSBGaWppX0kyQ19ERENWR0FEQVRBICAgICAgICAweDRjCisjZGVmaW5lIEZpamlf STJDX0REQ1ZHQUNMSyAgICAgICAgIDB4NGQKKworI2RlZmluZSBGSUpJX1VOVVNFRF9HUElPX1BJ TiAgICAgICAweDdGCisKK2V4dGVybiBpbnQgdG9uZ2FfaW5pdGlhbGl6YV9keW5hbWljX3N0YXRl X2FkanVzdG1lbnRfcnVsZV9zZXR0aW5ncyhzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKTsKK2V4dGVy biBpbnQgdG9uZ2FfaHdtZ3JfYmFja2VuZF9maW5pKHN0cnVjdCBwcF9od21nciAqaHdtZ3IpOwor ZXh0ZXJuIGludCB0b25nYV9nZXRfbWNfbWljcm9jb2RlX3ZlcnNpb24gKHN0cnVjdCBwcF9od21n ciAqaHdtZ3IpOworZXh0ZXJuIHVpbnQxNl90IGdldF9wY2llX2dlbl9zdXBwb3J0KHVpbnQzMl90 IHBjaWVfbGlua19zcGVlZF9jYXAsIHVpbnQxNl90IG5zX3BjaWVfZ2VuKTsKK2V4dGVybiB1aW50 MTZfdCBnZXRfcGNpZV9sYW5lX3N1cHBvcnQodWludDMyX3QgcGNpZV9sYW5lX3dpZHRoX2NhcCwg dWludDE2X3QgbnNfcGNpZV9sYW5lcyk7CisKKyNkZWZpbmUgUFBfSE9TVF9UT19TTUNfVUwoWCkg Y3B1X3RvX2JlMzIoWCkKKyNkZWZpbmUgUFBfU01DX1RPX0hPU1RfVUwoWCkgYmUzMl90b19jcHUo WCkKKworI2RlZmluZSBQUF9IT1NUX1RPX1NNQ19VUyhYKSBjcHVfdG9fYmUxNihYKQorI2RlZmlu ZSBQUF9TTUNfVE9fSE9TVF9VUyhYKSBiZTE2X3RvX2NwdShYKQorCisjZGVmaW5lIENPTlZFUlRf RlJPTV9IT1NUX1RPX1NNQ19VTChYKSAoKFgpID0gUFBfSE9TVF9UT19TTUNfVUwoWCkpCisjZGVm aW5lIENPTlZFUlRfRlJPTV9TTUNfVE9fSE9TVF9VTChYKSAoKFgpID0gUFBfU01DX1RPX0hPU1Rf VUwoWCkpCisKKyNkZWZpbmUgQ09OVkVSVF9GUk9NX0hPU1RfVE9fU01DX1VTKFgpICgoWCkgPSBQ UF9IT1NUX1RPX1NNQ19VUyhYKSkKKworI2VuZGlmIC8qIF9GSUpJX0hXTUdSX0hfICovCmRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9od21nci9maWppX3Bvd2VydHVu ZS5jIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvZmlqaV9wb3dlcnR1bmUu YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODljOThmCi0tLSAvZGV2L251 bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvZmlqaV9wb3dlcnR1 bmUuYwpAQCAtMCwwICsxLDU1MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IEFkdmFuY2VkIE1p Y3JvIERldmljZXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBm cmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlz IHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdh cmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGlu Y2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBt b2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29y IHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdo b20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhl IGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNl IGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwg Y29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBU SEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkg S0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBU TyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBB UlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwK KyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFO WSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFD VElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9V VCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAq IE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgImh3 bWdyLmgiCisjaW5jbHVkZSAic211bWdyLmgiCisjaW5jbHVkZSAiZmlqaV9od21nci5oIgorI2lu Y2x1ZGUgImZpamlfcG93ZXJ0dW5lLmgiCisjaW5jbHVkZSAiZmlqaV9zbXVtZ3IuaCIKKyNpbmNs dWRlICJzbXU3M19kaXNjcmV0ZS5oIgorI2luY2x1ZGUgInBwX2RlYnVnLmgiCisKKyNkZWZpbmUg Vk9MVEFHRV9TQ0FMRSAgNAorI2RlZmluZSBQT1dFUlRVTkVfREVGQVVMVF9TRVRfTUFYICAgIDEK Kworc3RydWN0IGZpamlfcHRfZGVmYXVsdHMgZmlqaV9wb3dlcl90dW5lX2RhdGFfc2V0X2FycmF5 W1BPV0VSVFVORV9ERUZBVUxUX1NFVF9NQVhdID0geworCQkvKnN2aUxvYWRMSW5lRW4sICBTdmlM b2FkTGluZVZkZEMsIFREQ19WRERDX1Rocm90dGxlUmVsZWFzZUxpbWl0UGVyYyAqLworCQl7MSwg ICAgICAgICAgICAgICAweEYsICAgICAgICAgICAgIDB4RkQsCisJCS8qIFREQ19NQVd0LCBUZGNX YXRlcmZhbGxDdGwsIERURUFtYmllbnRUZW1wQmFzZSAqLworCQkweDE5LCAgICAgICAgNSwgICAg ICAgICAgICAgICA0NX0KK307CisKK3ZvaWQgZmlqaV9pbml0aWFsaXplX3Bvd2VyX3R1bmVfZGVm YXVsdHMoc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwlzdHJ1Y3QgZmlqaV9od21nciAqZmlq aV9od21nciA9IChzdHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJc3RydWN0 ICBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICp0YWJsZV9pbmZvID0KKwkJCShzdHJ1Y3QgIHBobV9w cHRfdjFfaW5mb3JtYXRpb24gKikoaHdtZ3ItPnBwdGFibGUpOworCXVpbnQzMl90IHRtcCA9IDA7 CisKKwlpZih0YWJsZV9pbmZvICYmCisJCQl0YWJsZV9pbmZvLT5jYWNfZHRwX3RhYmxlLT51c1Bv d2VyVHVuZURhdGFTZXRJRCA8PSBQT1dFUlRVTkVfREVGQVVMVF9TRVRfTUFYICYmCisJCQl0YWJs ZV9pbmZvLT5jYWNfZHRwX3RhYmxlLT51c1Bvd2VyVHVuZURhdGFTZXRJRCkKKwkJZmlqaV9od21n ci0+cG93ZXJfdHVuZV9kZWZhdWx0cyA9CisJCQkJJmZpamlfcG93ZXJfdHVuZV9kYXRhX3NldF9h cnJheQorCQkJCVt0YWJsZV9pbmZvLT5jYWNfZHRwX3RhYmxlLT51c1Bvd2VyVHVuZURhdGFTZXRJ RCAtIDFdOworCWVsc2UKKwkJZmlqaV9od21nci0+cG93ZXJfdHVuZV9kZWZhdWx0cyA9ICZmaWpp X3Bvd2VyX3R1bmVfZGF0YV9zZXRfYXJyYXlbMF07CisKKwkvKiBBc3N1bWUgZGlzYWJsZWQgKi8K KwlwaG1fY2FwX3Vuc2V0KGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywK KwkJCVBITV9QbGF0Zm9ybUNhcHNfUG93ZXJDb250YWlubWVudCk7CisJcGhtX2NhcF91bnNldCho d21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCQlQSE1fUGxhdGZvcm1D YXBzX0NBQyk7CisJcGhtX2NhcF91bnNldChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0 Zm9ybUNhcHMsCisJCQlQSE1fUGxhdGZvcm1DYXBzX1NRUmFtcGluZyk7CisJcGhtX2NhcF91bnNl dChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCQlQSE1fUGxhdGZv cm1DYXBzX0RCUmFtcGluZyk7CisJcGhtX2NhcF91bnNldChod21nci0+cGxhdGZvcm1fZGVzY3Jp cHRvci5wbGF0Zm9ybUNhcHMsCisJCQlQSE1fUGxhdGZvcm1DYXBzX1REUmFtcGluZyk7CisJcGht X2NhcF91bnNldChod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5wbGF0Zm9ybUNhcHMsCisJCQlQ SE1fUGxhdGZvcm1DYXBzX1RDUFJhbXBpbmcpOworCisJZmlqaV9od21nci0+ZHRlX3RqX29mZnNl dCA9IHRtcDsKKworCWlmICghdG1wKSB7CisJCXBobV9jYXBfc2V0KGh3bWdyLT5wbGF0Zm9ybV9k ZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywKKwkJCQlQSE1fUGxhdGZvcm1DYXBzX1Bvd2VyQ29udGFp bm1lbnQpOworCisJCXBobV9jYXBfc2V0KGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLnBsYXRm b3JtQ2FwcywKKwkJCQlQSE1fUGxhdGZvcm1DYXBzX0NBQyk7CisKKwkJZmlqaV9od21nci0+ZmFz dF93YXRlcm1hcmtfdGhyZXNob2xkID0gMTAwOworCisJCXRtcCA9IDE7CisJCWZpamlfaHdtZ3It PmVuYWJsZV9kdGVfZmVhdHVyZSA9IHRtcCA/IGZhbHNlIDogdHJ1ZTsKKwkJZmlqaV9od21nci0+ ZW5hYmxlX3RkY19saW1pdF9mZWF0dXJlID0gdG1wID8gdHJ1ZSA6IGZhbHNlOworCQlmaWppX2h3 bWdyLT5lbmFibGVfcGtnX3B3cl90cmFja2luZ19mZWF0dXJlID0gdG1wID8gdHJ1ZSA6IGZhbHNl OworCX0KK30KKworLyogUFBHZW4gaGFzIHRoZSBnYWluIHNldHRpbmcgZ2VuZXJhdGVkIGluIHgg KiAxMDAgdW5pdAorICogVGhpcyBmdW5jdGlvbiBpcyB0byBjb252ZXJ0IHRoZSB1bml0IHRvIHgg KiA0MDk2KDB4MTAwMCkgdW5pdC4KKyAqICBUaGlzIGlzIHRoZSB1bml0IGV4cGVjdGVkIGJ5IFNN QyBmaXJtd2FyZQorICovCitzdGF0aWMgdWludDE2X3Qgc2NhbGVfZmFuX2dhaW5fc2V0dGluZ3Mo dWludDE2X3QgcmF3X3NldHRpbmcpCit7CisgICAgdWludDMyX3QgdG1wOworICAgIHRtcCA9IHJh d19zZXR0aW5nICogNDA5NiAvIDEwMDsKKyAgICByZXR1cm4gKHVpbnQxNl90KXRtcDsKK30KKwor c3RhdGljIHZvaWQgZ2V0X3NjbF9zZGFfdmFsdWUodWludDhfdCBsaW5lLCB1aW50OF90ICpzY2ws IHVpbnQ4X3QqIHNkYSkKK3sKKwlzd2l0Y2ggKGxpbmUpIHsKKwljYXNlIEZpamlfSTJDTGluZUlE X0REQzEgOgorCQkqc2NsID0gRmlqaV9JMkNfRERDMUNMSzsKKwkJKnNkYSA9IEZpamlfSTJDX0RE QzFEQVRBOworCQlicmVhazsKKwljYXNlIEZpamlfSTJDTGluZUlEX0REQzIgOgorCQkqc2NsID0g RmlqaV9JMkNfRERDMkNMSzsKKwkJKnNkYSA9IEZpamlfSTJDX0REQzJEQVRBOworCQlicmVhazsK KwljYXNlIEZpamlfSTJDTGluZUlEX0REQzMgOgorCQkqc2NsID0gRmlqaV9JMkNfRERDM0NMSzsK KwkJKnNkYSA9IEZpamlfSTJDX0REQzNEQVRBOworCQlicmVhazsKKwljYXNlIEZpamlfSTJDTGlu ZUlEX0REQzQgOgorCQkqc2NsID0gRmlqaV9JMkNfRERDNENMSzsKKwkJKnNkYSA9IEZpamlfSTJD X0REQzREQVRBOworCQlicmVhazsKKwljYXNlIEZpamlfSTJDTGluZUlEX0REQzUgOgorCQkqc2Ns ID0gRmlqaV9JMkNfRERDNUNMSzsKKwkJKnNkYSA9IEZpamlfSTJDX0REQzVEQVRBOworCQlicmVh azsKKwljYXNlIEZpamlfSTJDTGluZUlEX0REQzYgOgorCQkqc2NsID0gRmlqaV9JMkNfRERDNkNM SzsKKwkJKnNkYSA9IEZpamlfSTJDX0REQzZEQVRBOworCQlicmVhazsKKwljYXNlIEZpamlfSTJD TGluZUlEX1NDTFNEQSA6CisJCSpzY2wgPSBGaWppX0kyQ19TQ0w7CisJCSpzZGEgPSBGaWppX0ky Q19TREE7CisJCWJyZWFrOworCWNhc2UgRmlqaV9JMkNMaW5lSURfRERDVkdBIDoKKwkJKnNjbCA9 IEZpamlfSTJDX0REQ1ZHQUNMSzsKKwkJKnNkYSA9IEZpamlfSTJDX0REQ1ZHQURBVEE7CisJCWJy ZWFrOworCWRlZmF1bHQ6CisJCSpzY2wgPSAwOworCQkqc2RhID0gMDsKKwkJYnJlYWs7CisJfQor fQorCitpbnQgZmlqaV9wb3B1bGF0ZV9iYXBtX3BhcmFtZXRlcnNfaW5fZHBtX3RhYmxlKHN0cnVj dCBwcF9od21nciAqaHdtZ3IpCit7CisJc3RydWN0IGZpamlfaHdtZ3IgKmRhdGEgPSAoc3RydWN0 IGZpamlfaHdtZ3IgKikoaHdtZ3ItPmJhY2tlbmQpOworCXN0cnVjdCBmaWppX3B0X2RlZmF1bHRz ICpkZWZhdWx0cyA9IGRhdGEtPnBvd2VyX3R1bmVfZGVmYXVsdHM7CisJU01VNzNfRGlzY3JldGVf RHBtVGFibGUgICpkcG1fdGFibGUgPSAmKGRhdGEtPnNtY19zdGF0ZV90YWJsZSk7CisJc3RydWN0 IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKnRhYmxlX2luZm8gPQorCQkJKHN0cnVjdCBwaG1fcHB0 X3YxX2luZm9ybWF0aW9uICopKGh3bWdyLT5wcHRhYmxlKTsKKwlzdHJ1Y3QgcGhtX2NhY190ZHBf dGFibGUgKmNhY19kdHBfdGFibGUgPSB0YWJsZV9pbmZvLT5jYWNfZHRwX3RhYmxlOworCXN0cnVj dCBwcF9hZHZhbmNlX2Zhbl9jb250cm9sX3BhcmFtZXRlcnMgKmZhbl90YWJsZT0KKwkJCSZod21n ci0+dGhlcm1hbF9jb250cm9sbGVyLmFkdmFuY2VGYW5Db250cm9sUGFyYW1ldGVyczsKKwl1aW50 OF90IHVjX3NjbCwgdWNfc2RhOworCisJLyogVERQIG51bWJlciBvZiBmcmFjdGlvbiBiaXRzIGFy ZSBjaGFuZ2VkIGZyb20gOCB0byA3IGZvciBGaWppCisJICogYXMgcmVxdWVzdGVkIGJ5IFNNQyB0 ZWFtCisJICovCisJZHBtX3RhYmxlLT5EZWZhdWx0VGRwID0gUFBfSE9TVF9UT19TTUNfVVMoCisJ CQkodWludDE2X3QpKGNhY19kdHBfdGFibGUtPnVzVERQICogMTI4KSk7CisJZHBtX3RhYmxlLT5U YXJnZXRUZHAgPSBQUF9IT1NUX1RPX1NNQ19VUygKKwkJCSh1aW50MTZfdCkoY2FjX2R0cF90YWJs ZS0+dXNURFAgKiAxMjgpKTsKKworCVBQX0FTU0VSVF9XSVRIX0NPREUoY2FjX2R0cF90YWJsZS0+ dXNUYXJnZXRPcGVyYXRpbmdUZW1wIDw9IDI1NSwKKwkJCSJUYXJnZXQgT3BlcmF0aW5nIFRlbXAg aXMgb3V0IG9mIFJhbmdlISIsKTsKKworCWRwbV90YWJsZS0+R3B1VGpNYXggPSAodWludDhfdCko Y2FjX2R0cF90YWJsZS0+dXNUYXJnZXRPcGVyYXRpbmdUZW1wKTsKKwlkcG1fdGFibGUtPkdwdVRq SHlzdCA9IDg7CisKKwlkcG1fdGFibGUtPkRURUFtYmllbnRUZW1wQmFzZSA9IGRlZmF1bHRzLT5E VEVBbWJpZW50VGVtcEJhc2U7CisKKwkvKiBUaGUgZm9sbG93aW5nIGFyZSBmb3IgbmV3IEZpamkg TXVsdGktaW5wdXQgZmFuL3RoZXJtYWwgY29udHJvbCAqLworCWRwbV90YWJsZS0+VGVtcGVyYXR1 cmVMaW1pdEVkZ2UgPSBQUF9IT1NUX1RPX1NNQ19VUygKKwkJCWNhY19kdHBfdGFibGUtPnVzVGFy Z2V0T3BlcmF0aW5nVGVtcCAqIDI1Nik7CisJZHBtX3RhYmxlLT5UZW1wZXJhdHVyZUxpbWl0SG90 c3BvdCA9IFBQX0hPU1RfVE9fU01DX1VTKAorCQkJY2FjX2R0cF90YWJsZS0+dXNUZW1wZXJhdHVy ZUxpbWl0SG90c3BvdCAqIDI1Nik7CisJZHBtX3RhYmxlLT5UZW1wZXJhdHVyZUxpbWl0TGlxdWlk MSA9IFBQX0hPU1RfVE9fU01DX1VTKAorCQkJY2FjX2R0cF90YWJsZS0+dXNUZW1wZXJhdHVyZUxp bWl0TGlxdWlkMSAqIDI1Nik7CisJZHBtX3RhYmxlLT5UZW1wZXJhdHVyZUxpbWl0TGlxdWlkMiA9 IFBQX0hPU1RfVE9fU01DX1VTKAorCQkJY2FjX2R0cF90YWJsZS0+dXNUZW1wZXJhdHVyZUxpbWl0 TGlxdWlkMiAqIDI1Nik7CisJZHBtX3RhYmxlLT5UZW1wZXJhdHVyZUxpbWl0VnJWZGRjID0gUFBf SE9TVF9UT19TTUNfVVMoCisJCQljYWNfZHRwX3RhYmxlLT51c1RlbXBlcmF0dXJlTGltaXRWclZk ZGMgKiAyNTYpOworCWRwbV90YWJsZS0+VGVtcGVyYXR1cmVMaW1pdFZyTXZkZCA9IFBQX0hPU1Rf VE9fU01DX1VTKAorCQkJY2FjX2R0cF90YWJsZS0+dXNUZW1wZXJhdHVyZUxpbWl0VnJNdmRkICog MjU2KTsKKwlkcG1fdGFibGUtPlRlbXBlcmF0dXJlTGltaXRQbHggPSBQUF9IT1NUX1RPX1NNQ19V UygKKwkJCWNhY19kdHBfdGFibGUtPnVzVGVtcGVyYXR1cmVMaW1pdFBseCAqIDI1Nik7CisKKwlk cG1fdGFibGUtPkZhbkdhaW5FZGdlID0gUFBfSE9TVF9UT19TTUNfVVMoCisJCQlzY2FsZV9mYW5f Z2Fpbl9zZXR0aW5ncyhmYW5fdGFibGUtPnVzRmFuR2FpbkVkZ2UpKTsKKwlkcG1fdGFibGUtPkZh bkdhaW5Ib3RzcG90ID0gUFBfSE9TVF9UT19TTUNfVVMoCisJCQlzY2FsZV9mYW5fZ2Fpbl9zZXR0 aW5ncyhmYW5fdGFibGUtPnVzRmFuR2FpbkhvdHNwb3QpKTsKKwlkcG1fdGFibGUtPkZhbkdhaW5M aXF1aWQgPSBQUF9IT1NUX1RPX1NNQ19VUygKKwkJCXNjYWxlX2Zhbl9nYWluX3NldHRpbmdzKGZh bl90YWJsZS0+dXNGYW5HYWluTGlxdWlkKSk7CisJZHBtX3RhYmxlLT5GYW5HYWluVnJWZGRjID0g UFBfSE9TVF9UT19TTUNfVVMoCisJCQlzY2FsZV9mYW5fZ2Fpbl9zZXR0aW5ncyhmYW5fdGFibGUt PnVzRmFuR2FpblZyVmRkYykpOworCWRwbV90YWJsZS0+RmFuR2FpblZyTXZkZCA9IFBQX0hPU1Rf VE9fU01DX1VTKAorCQkJc2NhbGVfZmFuX2dhaW5fc2V0dGluZ3MoZmFuX3RhYmxlLT51c0Zhbkdh aW5Wck12ZGQpKTsKKwlkcG1fdGFibGUtPkZhbkdhaW5QbHggPSBQUF9IT1NUX1RPX1NNQ19VUygK KwkJCXNjYWxlX2Zhbl9nYWluX3NldHRpbmdzKGZhbl90YWJsZS0+dXNGYW5HYWluUGx4KSk7CisJ ZHBtX3RhYmxlLT5GYW5HYWluSGJtID0gUFBfSE9TVF9UT19TTUNfVVMoCisJCQlzY2FsZV9mYW5f Z2Fpbl9zZXR0aW5ncyhmYW5fdGFibGUtPnVzRmFuR2FpbkhibSkpOworCisJZHBtX3RhYmxlLT5M aXF1aWQxX0kyQ19hZGRyZXNzID0gY2FjX2R0cF90YWJsZS0+dWNMaXF1aWQxX0kyQ19hZGRyZXNz OworCWRwbV90YWJsZS0+TGlxdWlkMl9JMkNfYWRkcmVzcyA9IGNhY19kdHBfdGFibGUtPnVjTGlx dWlkMl9JMkNfYWRkcmVzczsKKwlkcG1fdGFibGUtPlZyX0kyQ19hZGRyZXNzID0gY2FjX2R0cF90 YWJsZS0+dWNWcl9JMkNfYWRkcmVzczsKKwlkcG1fdGFibGUtPlBseF9JMkNfYWRkcmVzcyA9IGNh Y19kdHBfdGFibGUtPnVjUGx4X0kyQ19hZGRyZXNzOworCisJZ2V0X3NjbF9zZGFfdmFsdWUoY2Fj X2R0cF90YWJsZS0+dWNMaXF1aWRfSTJDX0xpbmUsICZ1Y19zY2wsICZ1Y19zZGEpOworCWRwbV90 YWJsZS0+TGlxdWlkX0kyQ19MaW5lU0NMID0gdWNfc2NsOworCWRwbV90YWJsZS0+TGlxdWlkX0ky Q19MaW5lU0RBID0gdWNfc2RhOworCisJZ2V0X3NjbF9zZGFfdmFsdWUoY2FjX2R0cF90YWJsZS0+ dWNWcl9JMkNfTGluZSwgJnVjX3NjbCwgJnVjX3NkYSk7CisJZHBtX3RhYmxlLT5Wcl9JMkNfTGlu ZVNDTCA9IHVjX3NjbDsKKwlkcG1fdGFibGUtPlZyX0kyQ19MaW5lU0RBID0gdWNfc2RhOworCisJ Z2V0X3NjbF9zZGFfdmFsdWUoY2FjX2R0cF90YWJsZS0+dWNQbHhfSTJDX0xpbmUsICZ1Y19zY2ws ICZ1Y19zZGEpOworCWRwbV90YWJsZS0+UGx4X0kyQ19MaW5lU0NMID0gdWNfc2NsOworCWRwbV90 YWJsZS0+UGx4X0kyQ19MaW5lU0RBID0gdWNfc2RhOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyBpbnQgZmlqaV9wb3B1bGF0ZV9zdmlfbG9hZF9saW5lKHN0cnVjdCBwcF9od21nciAqaHdtZ3Ip Cit7CisgICAgc3RydWN0IGZpamlfaHdtZ3IgKmRhdGEgPSAoc3RydWN0IGZpamlfaHdtZ3IgKiko aHdtZ3ItPmJhY2tlbmQpOworICAgIHN0cnVjdCBmaWppX3B0X2RlZmF1bHRzICpkZWZhdWx0cyA9 IGRhdGEtPnBvd2VyX3R1bmVfZGVmYXVsdHM7CisKKyAgICBkYXRhLT5wb3dlcl90dW5lX3RhYmxl LlN2aUxvYWRMaW5lRW4gPSBkZWZhdWx0cy0+U3ZpTG9hZExpbmVFbjsKKyAgICBkYXRhLT5wb3dl cl90dW5lX3RhYmxlLlN2aUxvYWRMaW5lVmRkQyA9IGRlZmF1bHRzLT5TdmlMb2FkTGluZVZkZEM7 CisgICAgZGF0YS0+cG93ZXJfdHVuZV90YWJsZS5TdmlMb2FkTGluZVRyaW1WZGRDID0gMzsKKyAg ICBkYXRhLT5wb3dlcl90dW5lX3RhYmxlLlN2aUxvYWRMaW5lT2Zmc2V0VmRkQyA9IDA7CisKKyAg ICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWppX3BvcHVsYXRlX3RkY19saW1pdChzdHJ1 Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCXVpbnQxNl90IHRkY19saW1pdDsKKwlzdHJ1Y3QgZmlq aV9od21nciAqZGF0YSA9IChzdHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJ c3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRpb24gKnRhYmxlX2luZm8gPQorCQkJKHN0cnVjdCBw aG1fcHB0X3YxX2luZm9ybWF0aW9uICopKGh3bWdyLT5wcHRhYmxlKTsKKwlzdHJ1Y3QgIGZpamlf cHRfZGVmYXVsdHMgKmRlZmF1bHRzID0gZGF0YS0+cG93ZXJfdHVuZV9kZWZhdWx0czsKKworCS8q IFREQyBudW1iZXIgb2YgZnJhY3Rpb24gYml0cyBhcmUgY2hhbmdlZCBmcm9tIDggdG8gNworCSAq IGZvciBGaWppIGFzIHJlcXVlc3RlZCBieSBTTUMgdGVhbQorCSAqLworCXRkY19saW1pdCA9ICh1 aW50MTZfdCkodGFibGVfaW5mby0+Y2FjX2R0cF90YWJsZS0+dXNUREMgKiAxMjgpOworCWRhdGEt PnBvd2VyX3R1bmVfdGFibGUuVERDX1ZERENfUGtnTGltaXQgPQorCQkJQ09OVkVSVF9GUk9NX0hP U1RfVE9fU01DX1VTKHRkY19saW1pdCk7CisJZGF0YS0+cG93ZXJfdHVuZV90YWJsZS5URENfVkRE Q19UaHJvdHRsZVJlbGVhc2VMaW1pdFBlcmMgPQorCQkJZGVmYXVsdHMtPlREQ19WRERDX1Rocm90 dGxlUmVsZWFzZUxpbWl0UGVyYzsKKwlkYXRhLT5wb3dlcl90dW5lX3RhYmxlLlREQ19NQVd0ID0g ZGVmYXVsdHMtPlREQ19NQVd0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlqaV9w b3B1bGF0ZV9kdzgoc3RydWN0IHBwX2h3bWdyICpod21nciwgdWludDMyX3QgZnVzZV90YWJsZV9v ZmZzZXQpCit7CisJc3RydWN0IGZpamlfaHdtZ3IgKmRhdGEgPSAoc3RydWN0IGZpamlfaHdtZ3Ig KikoaHdtZ3ItPmJhY2tlbmQpOworCXN0cnVjdCAgZmlqaV9wdF9kZWZhdWx0cyAqZGVmYXVsdHMg PSBkYXRhLT5wb3dlcl90dW5lX2RlZmF1bHRzOworCXVpbnQzMl90IHRlbXA7CisKKwlpZiAoZmlq aV9yZWFkX3NtY19zcmFtX2R3b3JkKGh3bWdyLT5zbXVtZ3IsCisJCQlmdXNlX3RhYmxlX29mZnNl dCArCisJCQlvZmZzZXRvZihTTVU3M19EaXNjcmV0ZV9QbUZ1c2VzLCBUZGNXYXRlcmZhbGxDdGwp LAorCQkJKHVpbnQzMl90ICopJnRlbXAsIGRhdGEtPnNyYW1fZW5kKSkKKwkJUFBfQVNTRVJUX1dJ VEhfQ09ERShmYWxzZSwKKwkJCQkiQXR0ZW1wdCB0byByZWFkIFBtRnVzZXMuRFc2IChTdmlMb2Fk TGluZUVuKSBmcm9tIFNNQyBGYWlsZWQhIiwKKwkJCQlyZXR1cm4gLUVJTlZBTCk7CisJZWxzZSB7 CisJCWRhdGEtPnBvd2VyX3R1bmVfdGFibGUuVGRjV2F0ZXJmYWxsQ3RsID0gZGVmYXVsdHMtPlRk Y1dhdGVyZmFsbEN0bDsKKwkJZGF0YS0+cG93ZXJfdHVuZV90YWJsZS5MUE1MVGVtcGVyYXR1cmVN aW4gPQorCQkJCSh1aW50OF90KSgodGVtcCA+PiAxNikgJiAweGZmKTsKKwkJZGF0YS0+cG93ZXJf dHVuZV90YWJsZS5MUE1MVGVtcGVyYXR1cmVNYXggPQorCQkJCSh1aW50OF90KSgodGVtcCA+PiA4 KSAmIDB4ZmYpOworCQlkYXRhLT5wb3dlcl90dW5lX3RhYmxlLlJlc2VydmVkID0gKHVpbnQ4X3Qp KHRlbXAgJiAweGZmKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlqaV9wb3B1 bGF0ZV90ZW1wZXJhdHVyZV9zY2FsZXIoc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwlpbnQg aTsKKwlzdHJ1Y3QgZmlqaV9od21nciAqZGF0YSA9IChzdHJ1Y3QgZmlqaV9od21nciAqKShod21n ci0+YmFja2VuZCk7CisKKwkvKiBDdXJyZW50bHkgbm90IHVzZWQuIFNldCBhbGwgdG8gemVyby4g Ki8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJZGF0YS0+cG93ZXJfdHVuZV90YWJsZS5M UE1MVGVtcGVyYXR1cmVTY2FsZXJbaV0gPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBp bnQgZmlqaV9wb3B1bGF0ZV9mdXp6eV9mYW4oc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwlz dHJ1Y3QgZmlqaV9od21nciAqZGF0YSA9IChzdHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+YmFj a2VuZCk7CisKKwlpZiggKGh3bWdyLT50aGVybWFsX2NvbnRyb2xsZXIuYWR2YW5jZUZhbkNvbnRy b2xQYXJhbWV0ZXJzLgorCQkJdXNGYW5PdXRwdXRTZW5zaXRpdml0eSAmICgxIDw8IDE1KSkgfHwK KwkJCTAgPT0gaHdtZ3ItPnRoZXJtYWxfY29udHJvbGxlci5hZHZhbmNlRmFuQ29udHJvbFBhcmFt ZXRlcnMuCisJCQl1c0Zhbk91dHB1dFNlbnNpdGl2aXR5ICkKKwkJaHdtZ3ItPnRoZXJtYWxfY29u dHJvbGxlci5hZHZhbmNlRmFuQ29udHJvbFBhcmFtZXRlcnMuCisJCXVzRmFuT3V0cHV0U2Vuc2l0 aXZpdHkgPSBod21nci0+dGhlcm1hbF9jb250cm9sbGVyLgorCQkJYWR2YW5jZUZhbkNvbnRyb2xQ YXJhbWV0ZXJzLnVzRGVmYXVsdEZhbk91dHB1dFNlbnNpdGl2aXR5OworCisJZGF0YS0+cG93ZXJf dHVuZV90YWJsZS5GdXp6eUZhbl9Qd21TZXREZWx0YSA9CisJCQlQUF9IT1NUX1RPX1NNQ19VUyho d21nci0+dGhlcm1hbF9jb250cm9sbGVyLgorCQkJCQlhZHZhbmNlRmFuQ29udHJvbFBhcmFtZXRl cnMudXNGYW5PdXRwdXRTZW5zaXRpdml0eSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQg ZmlqaV9wb3B1bGF0ZV9nbmJfbHBtbChzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCWludCBp OworCXN0cnVjdCBmaWppX2h3bWdyICpkYXRhID0gKHN0cnVjdCBmaWppX2h3bWdyICopKGh3bWdy LT5iYWNrZW5kKTsKKworCS8qIEN1cnJlbnRseSBub3QgdXNlZC4gU2V0IGFsbCB0byB6ZXJvLiAq LworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlkYXRhLT5wb3dlcl90dW5lX3RhYmxlLkdu YkxQTUxbaV0gPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlqaV9taW5fbWF4 X3ZnbmJfbHBtbF9pZF9mcm9tX2JhcG1fdmRkYyhzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQorewor IC8qICAgaW50ICBpLCBtaW4sIG1heDsKKyAgICBzdHJ1Y3QgZmlqaV9od21nciAqZGF0YSA9IChz dHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+YmFja2VuZCk7CisgICAgdWludDhfdCAqIHBIaVZJ RCA9IGRhdGEtPnBvd2VyX3R1bmVfdGFibGUuQmFwbVZkZENWaWRIaVNpZGQ7CisgICAgdWludDhf dCAqIHBMb1ZJRCA9IGRhdGEtPnBvd2VyX3R1bmVfdGFibGUuQmFwbVZkZENWaWRMb1NpZGQ7CisK KyAgICBtaW4gPSBtYXggPSBwSGlWSURbMF07CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykg eworICAgICAgICBpZiAoMCAhPSBwSGlWSURbaV0pIHsKKyAgICAgICAgICAgIGlmIChtaW4gPiBw SGlWSURbaV0pCisgICAgICAgICAgICAgICAgbWluID0gcEhpVklEW2ldOworICAgICAgICAgICAg aWYgKG1heCA8IHBIaVZJRFtpXSkKKyAgICAgICAgICAgICAgICBtYXggPSBwSGlWSURbaV07Cisg ICAgICAgIH0KKworICAgICAgICBpZiAoMCAhPSBwTG9WSURbaV0pIHsKKyAgICAgICAgICAgIGlm IChtaW4gPiBwTG9WSURbaV0pCisgICAgICAgICAgICAgICAgbWluID0gcExvVklEW2ldOworICAg ICAgICAgICAgaWYgKG1heCA8IHBMb1ZJRFtpXSkKKyAgICAgICAgICAgICAgICBtYXggPSBwTG9W SURbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBQUF9BU1NFUlRfV0lUSF9DT0RFKCgwICE9 IG1pbikgJiYgKDAgIT0gbWF4KSwgIkJhcG1WZGRjVmlkU2lkZCB0YWJsZSBkb2VzIG5vdCBleGlz dCEiLCByZXR1cm4gaW50X0ZhaWxlZCk7CisgICAgZGF0YS0+cG93ZXJfdHVuZV90YWJsZS5HbmJM UE1MTWF4VmlkID0gKHVpbnQ4X3QpbWF4OworICAgIGRhdGEtPnBvd2VyX3R1bmVfdGFibGUuR25i TFBNTE1pblZpZCA9ICh1aW50OF90KW1pbjsKKyovCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRp YyBpbnQgZmlqaV9wb3B1bGF0ZV9iYXBtX3ZkZGNfYmFzZV9sZWFrYWdlX3NpZGQoc3RydWN0IHBw X2h3bWdyICpod21ncikKK3sKKwlzdHJ1Y3QgZmlqaV9od21nciAqZGF0YSA9IChzdHJ1Y3QgZmlq aV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJc3RydWN0IHBobV9wcHRfdjFfaW5mb3JtYXRp b24gKnRhYmxlX2luZm8gPQorCQkJKHN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICopKGh3 bWdyLT5wcHRhYmxlKTsKKwl1aW50MTZfdCBIaVNpZGQgPSBkYXRhLT5wb3dlcl90dW5lX3RhYmxl LkJhcG1WZGRDQmFzZUxlYWthZ2VIaVNpZGQ7CisJdWludDE2X3QgTG9TaWRkID0gZGF0YS0+cG93 ZXJfdHVuZV90YWJsZS5CYXBtVmRkQ0Jhc2VMZWFrYWdlTG9TaWRkOworCXN0cnVjdCBwaG1fY2Fj X3RkcF90YWJsZSAqY2FjX3RhYmxlID0gdGFibGVfaW5mby0+Y2FjX2R0cF90YWJsZTsKKworCUhp U2lkZCA9ICh1aW50MTZfdCkoY2FjX3RhYmxlLT51c0hpZ2hDQUNMZWFrYWdlIC8gMTAwICogMjU2 KTsKKwlMb1NpZGQgPSAodWludDE2X3QpKGNhY190YWJsZS0+dXNMb3dDQUNMZWFrYWdlIC8gMTAw ICogMjU2KTsKKworCWRhdGEtPnBvd2VyX3R1bmVfdGFibGUuQmFwbVZkZENCYXNlTGVha2FnZUhp U2lkZCA9CisJCQlDT05WRVJUX0ZST01fSE9TVF9UT19TTUNfVVMoSGlTaWRkKTsKKwlkYXRhLT5w b3dlcl90dW5lX3RhYmxlLkJhcG1WZGRDQmFzZUxlYWthZ2VMb1NpZGQgPQorCQkJQ09OVkVSVF9G Uk9NX0hPU1RfVE9fU01DX1VTKExvU2lkZCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGZpamlf cG9wdWxhdGVfcG1fZnVzZXMoc3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwlzdHJ1Y3QgZmlq aV9od21nciAqZGF0YSA9IChzdHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJ dWludDMyX3QgcG1fZnVzZV90YWJsZV9vZmZzZXQ7CisKKwlpZiAocGhtX2NhcF9lbmFibGVkKGh3 bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywKKwkJCVBITV9QbGF0Zm9ybUNh cHNfUG93ZXJDb250YWlubWVudCkpIHsKKwkJaWYgKGZpamlfcmVhZF9zbWNfc3JhbV9kd29yZCho d21nci0+c211bWdyLAorCQkJCVNNVTdfRklSTVdBUkVfSEVBREVSX0xPQ0FUSU9OICsKKwkJCQlv ZmZzZXRvZihTTVU3M19GaXJtd2FyZV9IZWFkZXIsIFBtRnVzZVRhYmxlKSwKKwkJCQkmcG1fZnVz ZV90YWJsZV9vZmZzZXQsIGRhdGEtPnNyYW1fZW5kKSkKKwkJCVBQX0FTU0VSVF9XSVRIX0NPREUo ZmFsc2UsCisJCQkJCSJBdHRlbXB0IHRvIGdldCBwbV9mdXNlX3RhYmxlX29mZnNldCBGYWlsZWQh IiwKKwkJCQkJcmV0dXJuIC1FSU5WQUwpOworCisJCS8qIERXNiAqLworCQlpZiAoZmlqaV9wb3B1 bGF0ZV9zdmlfbG9hZF9saW5lKGh3bWdyKSkKKwkJCVBQX0FTU0VSVF9XSVRIX0NPREUoZmFsc2Us CisJCQkJCSJBdHRlbXB0IHRvIHBvcHVsYXRlIFN2aUxvYWRMaW5lIEZhaWxlZCEiLAorCQkJCQly ZXR1cm4gLUVJTlZBTCk7CisJCS8qIERXNyAqLworCQlpZiAoZmlqaV9wb3B1bGF0ZV90ZGNfbGlt aXQoaHdtZ3IpKQorCQkJUFBfQVNTRVJUX1dJVEhfQ09ERShmYWxzZSwKKwkJCQkJIkF0dGVtcHQg dG8gcG9wdWxhdGUgVERDTGltaXQgRmFpbGVkISIsIHJldHVybiAtRUlOVkFMKTsKKwkJLyogRFc4 ICovCisJCWlmIChmaWppX3BvcHVsYXRlX2R3OChod21nciwgcG1fZnVzZV90YWJsZV9vZmZzZXQp KQorCQkJUFBfQVNTRVJUX1dJVEhfQ09ERShmYWxzZSwKKwkJCQkJIkF0dGVtcHQgdG8gcG9wdWxh dGUgVGRjV2F0ZXJmYWxsQ3RsLCAiCisJCQkJCSJMUE1MVGVtcGVyYXR1cmUgTWluIGFuZCBNYXgg RmFpbGVkISIsCisJCQkJCXJldHVybiAtRUlOVkFMKTsKKworCQkvKiBEVzktRFcxMiAqLworCQlp ZiAoMCAhPSBmaWppX3BvcHVsYXRlX3RlbXBlcmF0dXJlX3NjYWxlcihod21ncikpCisJCQlQUF9B U1NFUlRfV0lUSF9DT0RFKGZhbHNlLAorCQkJCQkiQXR0ZW1wdCB0byBwb3B1bGF0ZSBMUE1MVGVt cGVyYXR1cmVTY2FsZXIgRmFpbGVkISIsCisJCQkJCXJldHVybiAtRUlOVkFMKTsKKworCQkvKiBE VzEzLURXMTQgKi8KKwkJaWYoZmlqaV9wb3B1bGF0ZV9mdXp6eV9mYW4oaHdtZ3IpKQorCQkJUFBf QVNTRVJUX1dJVEhfQ09ERShmYWxzZSwKKwkJCQkJIkF0dGVtcHQgdG8gcG9wdWxhdGUgRnV6enkg RmFuIENvbnRyb2wgcGFyYW1ldGVycyBGYWlsZWQhIiwKKwkJCQkJcmV0dXJuIC1FSU5WQUwpOwor CisJCS8qIERXMTUtRFcxOCAqLworCQlpZiAoZmlqaV9wb3B1bGF0ZV9nbmJfbHBtbChod21ncikp CisJCQlQUF9BU1NFUlRfV0lUSF9DT0RFKGZhbHNlLAorCQkJCQkiQXR0ZW1wdCB0byBwb3B1bGF0 ZSBHbmJMUE1MIEZhaWxlZCEiLAorCQkJCQlyZXR1cm4gLUVJTlZBTCk7CisKKwkJLyogRFcxOSAq LworCQlpZiAoZmlqaV9taW5fbWF4X3ZnbmJfbHBtbF9pZF9mcm9tX2JhcG1fdmRkYyhod21ncikp CisJCQlQUF9BU1NFUlRfV0lUSF9DT0RFKGZhbHNlLAorCQkJCQkiQXR0ZW1wdCB0byBwb3B1bGF0 ZSBHbmJMUE1MIE1pbiBhbmQgTWF4IFZpZCBGYWlsZWQhIiwKKwkJCQkJcmV0dXJuIC1FSU5WQUwp OworCisJCS8qIERXMjAgKi8KKwkJaWYgKGZpamlfcG9wdWxhdGVfYmFwbV92ZGRjX2Jhc2VfbGVh a2FnZV9zaWRkKGh3bWdyKSkKKwkJCVBQX0FTU0VSVF9XSVRIX0NPREUoZmFsc2UsCisJCQkJCSJB dHRlbXB0IHRvIHBvcHVsYXRlIEJhcG1WZGRDQmFzZUxlYWthZ2UgSGkgYW5kIExvICIKKwkJCQkJ IlNpZGQgRmFpbGVkISIsIHJldHVybiAtRUlOVkFMKTsKKworCQlpZiAoZmlqaV9jb3B5X2J5dGVz X3RvX3NtYyhod21nci0+c211bWdyLCBwbV9mdXNlX3RhYmxlX29mZnNldCwKKwkJCQkodWludDhf dCAqKSZkYXRhLT5wb3dlcl90dW5lX3RhYmxlLAorCQkJCXNpemVvZihzdHJ1Y3QgU01VNzNfRGlz Y3JldGVfUG1GdXNlcyksIGRhdGEtPnNyYW1fZW5kKSkKKwkJCVBQX0FTU0VSVF9XSVRIX0NPREUo ZmFsc2UsCisJCQkJCSJBdHRlbXB0IHRvIGRvd25sb2FkIFBtRnVzZVRhYmxlIEZhaWxlZCEiLAor CQkJCQlyZXR1cm4gLUVJTlZBTCk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgZmlqaV9lbmFi bGVfc21jX2NhYyhzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQoreworCXN0cnVjdCBmaWppX2h3bWdy ICpkYXRhID0gKHN0cnVjdCBmaWppX2h3bWdyICopKGh3bWdyLT5iYWNrZW5kKTsKKwlpbnQgcmVz dWx0ID0gMDsKKworCWlmIChwaG1fY2FwX2VuYWJsZWQoaHdtZ3ItPnBsYXRmb3JtX2Rlc2NyaXB0 b3IucGxhdGZvcm1DYXBzLAorCQkJUEhNX1BsYXRmb3JtQ2Fwc19DQUMpKSB7CisJCWludCBzbWNf cmVzdWx0OworCQlzbWNfcmVzdWx0ID0gc211bV9zZW5kX21zZ190b19zbWMoaHdtZ3ItPnNtdW1n ciwKKwkJCQkodWludDE2X3QpKFBQU01DX01TR19FbmFibGVDYWMpKTsKKwkJUFBfQVNTRVJUX1dJ VEhfQ09ERSgoMCA9PSBzbWNfcmVzdWx0KSwKKwkJCQkiRmFpbGVkIHRvIGVuYWJsZSBDQUMgaW4g U01DLiIsIHJlc3VsdCA9IC0xKTsKKworICAgICAgICBkYXRhLT5jYWNfZW5hYmxlZCA9ICgwID09 IHNtY19yZXN1bHQpID8gdHJ1ZSA6IGZhbHNlOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCitp bnQgZmlqaV9zZXRfcG93ZXJfbGltaXQoc3RydWN0IHBwX2h3bWdyICpod21nciwgdWludDMyX3Qg bikKK3sKKwlzdHJ1Y3QgZmlqaV9od21nciAqZGF0YSA9IChzdHJ1Y3QgZmlqaV9od21nciAqKSho d21nci0+YmFja2VuZCk7CisKKwlpZihkYXRhLT5wb3dlcl9jb250YWlubWVudF9mZWF0dXJlcyAm CisJCQlQT1dFUkNPTlRBSU5NRU5UX0ZFQVRVUkVfUGtnUHdyTGltaXQpCisJCXJldHVybiBzbXVt X3NlbmRfbXNnX3RvX3NtY193aXRoX3BhcmFtZXRlcihod21nci0+c211bWdyLAorCQkJCVBQU01D X01TR19Qa2dQd3JTZXRMaW1pdCwgbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlq aV9zZXRfb3ZlcmRyaXZlcl90YXJnZXRfdGRwKHN0cnVjdCBwcF9od21nciAqcEh3TWdyLCB1aW50 MzJfdCB0YXJnZXRfdGRwKQoreworCXJldHVybiBzbXVtX3NlbmRfbXNnX3RvX3NtY193aXRoX3Bh cmFtZXRlcihwSHdNZ3ItPnNtdW1nciwKKwkJCVBQU01DX01TR19PdmVyRHJpdmVTZXRUYXJnZXRU ZHAsIHRhcmdldF90ZHApOworfQorCitpbnQgZmlqaV9lbmFibGVfcG93ZXJfY29udGFpbm1lbnQo c3RydWN0IHBwX2h3bWdyICpod21ncikKK3sKKwlzdHJ1Y3QgZmlqaV9od21nciAqZGF0YSA9IChz dHJ1Y3QgZmlqaV9od21nciAqKShod21nci0+YmFja2VuZCk7CisJc3RydWN0IHBobV9wcHRfdjFf aW5mb3JtYXRpb24gKnRhYmxlX2luZm8gPQorCQkJKHN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0 aW9uICopKGh3bWdyLT5wcHRhYmxlKTsKKwlpbnQgc21jX3Jlc3VsdDsKKwlpbnQgcmVzdWx0ID0g MDsKKworCWRhdGEtPnBvd2VyX2NvbnRhaW5tZW50X2ZlYXR1cmVzID0gMDsKKwlpZiAocGhtX2Nh cF9lbmFibGVkKGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLnBsYXRmb3JtQ2FwcywKKwkJCVBI TV9QbGF0Zm9ybUNhcHNfUG93ZXJDb250YWlubWVudCkpIHsKKwkJaWYgKGRhdGEtPmVuYWJsZV9k dGVfZmVhdHVyZSkgeworCQkJc21jX3Jlc3VsdCA9IHNtdW1fc2VuZF9tc2dfdG9fc21jKGh3bWdy LT5zbXVtZ3IsCisJCQkJCSh1aW50MTZfdCkoUFBTTUNfTVNHX0VuYWJsZURURSkpOworCQkJUFBf QVNTRVJUX1dJVEhfQ09ERSgoMCA9PSBzbWNfcmVzdWx0KSwKKwkJCQkJIkZhaWxlZCB0byBlbmFi bGUgRFRFIGluIFNNQy4iLCByZXN1bHQgPSAtMTspOworCQkJaWYgKDAgPT0gc21jX3Jlc3VsdCkK KwkJCQlkYXRhLT5wb3dlcl9jb250YWlubWVudF9mZWF0dXJlcyB8PSBQT1dFUkNPTlRBSU5NRU5U X0ZFQVRVUkVfRFRFOworCQl9CisKKwkJaWYgKGRhdGEtPmVuYWJsZV90ZGNfbGltaXRfZmVhdHVy ZSkgeworCQkJc21jX3Jlc3VsdCA9IHNtdW1fc2VuZF9tc2dfdG9fc21jKGh3bWdyLT5zbXVtZ3Is CisJCQkJCSh1aW50MTZfdCkoUFBTTUNfTVNHX1REQ0xpbWl0RW5hYmxlKSk7CisJCQlQUF9BU1NF UlRfV0lUSF9DT0RFKCgwID09IHNtY19yZXN1bHQpLAorCQkJCQkiRmFpbGVkIHRvIGVuYWJsZSBU RENMaW1pdCBpbiBTTUMuIiwgcmVzdWx0ID0gLTE7KTsKKwkJCWlmICgwID09IHNtY19yZXN1bHQp CisJCQkJZGF0YS0+cG93ZXJfY29udGFpbm1lbnRfZmVhdHVyZXMgfD0KKwkJCQkJCVBPV0VSQ09O VEFJTk1FTlRfRkVBVFVSRV9URENMaW1pdDsKKwkJfQorCisJCWlmIChkYXRhLT5lbmFibGVfcGtn X3B3cl90cmFja2luZ19mZWF0dXJlKSB7CisJCQlzbWNfcmVzdWx0ID0gc211bV9zZW5kX21zZ190 b19zbWMoaHdtZ3ItPnNtdW1nciwKKwkJCQkJKHVpbnQxNl90KShQUFNNQ19NU0dfUGtnUHdyTGlt aXRFbmFibGUpKTsKKwkJCVBQX0FTU0VSVF9XSVRIX0NPREUoKDAgPT0gc21jX3Jlc3VsdCksCisJ CQkJCSJGYWlsZWQgdG8gZW5hYmxlIFBrZ1B3clRyYWNraW5nIGluIFNNQy4iLCByZXN1bHQgPSAt MTspOworCQkJaWYgKDAgPT0gc21jX3Jlc3VsdCkgeworCQkJCXN0cnVjdCBwaG1fY2FjX3RkcF90 YWJsZSAqY2FjX3RhYmxlID0KKwkJCQkJCXRhYmxlX2luZm8tPmNhY19kdHBfdGFibGU7CisJCQkJ dWludDMyX3QgZGVmYXVsdF9saW1pdCA9CisJCQkJCSh1aW50MzJfdCkoY2FjX3RhYmxlLT51c01h eGltdW1Qb3dlckRlbGl2ZXJ5TGltaXQgKiAyNTYpOworCisJCQkJZGF0YS0+cG93ZXJfY29udGFp bm1lbnRfZmVhdHVyZXMgfD0KKwkJCQkJCVBPV0VSQ09OVEFJTk1FTlRfRkVBVFVSRV9Qa2dQd3JM aW1pdDsKKworCQkJCWlmIChmaWppX3NldF9wb3dlcl9saW1pdChod21nciwgZGVmYXVsdF9saW1p dCkpCisJCQkJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHNldCBEZWZhdWx0IFBvd2VyIExp bWl0IGluIFNNQyEiKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQg ZmlqaV9wb3dlcl9jb250cm9sX3NldF9sZXZlbChzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKQorewor CXN0cnVjdCBwaG1fcHB0X3YxX2luZm9ybWF0aW9uICp0YWJsZV9pbmZvID0KKwkJCShzdHJ1Y3Qg cGhtX3BwdF92MV9pbmZvcm1hdGlvbiAqKShod21nci0+cHB0YWJsZSk7CisJc3RydWN0IHBobV9j YWNfdGRwX3RhYmxlICpjYWNfdGFibGUgPSB0YWJsZV9pbmZvLT5jYWNfZHRwX3RhYmxlOworCWlu dCBhZGp1c3RfcGVyY2VudCwgdGFyZ2V0X3RkcDsKKwlpbnQgcmVzdWx0ID0gMDsKKworCWlmIChw aG1fY2FwX2VuYWJsZWQoaHdtZ3ItPnBsYXRmb3JtX2Rlc2NyaXB0b3IucGxhdGZvcm1DYXBzLAor CQkJUEhNX1BsYXRmb3JtQ2Fwc19Qb3dlckNvbnRhaW5tZW50KSkgeworCQkvKiBhZGp1c3RtZW50 IHBlcmNlbnRhZ2UgaGFzIGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgKi8KKwkJYWRqdXN0X3BlcmNl bnQgPSBod21nci0+cGxhdGZvcm1fZGVzY3JpcHRvci5URFBBZGp1c3RtZW50UG9sYXJpdHkgPwor CQkJCWh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLlREUEFkanVzdG1lbnQgOgorCQkJCSgtMSAq IGh3bWdyLT5wbGF0Zm9ybV9kZXNjcmlwdG9yLlREUEFkanVzdG1lbnQpOworCQkvKiBTTUMgcmVx dWVzdGVkIHRoYXQgdGFyZ2V0X3RkcCB0byBiZSA3IGJpdCBmcmFjdGlvbiBpbiBEUE0gdGFibGUK KwkJICogYnV0IG1lc3NhZ2UgdG8gYmUgOCBiaXQgZnJhY3Rpb24gZm9yIG1lc3NhZ2VzCisJCSAq LworCQl0YXJnZXRfdGRwID0gKCgxMDAgKyBhZGp1c3RfcGVyY2VudCkgKiAoaW50KShjYWNfdGFi bGUtPnVzVERQICogMjU2KSkgLyAxMDA7CisgICAgICAgIHJlc3VsdCA9IGZpamlfc2V0X292ZXJk cml2ZXJfdGFyZ2V0X3RkcChod21nciwgKHVpbnQzMl90KXRhcmdldF90ZHApOworICAgIH0KKwor ICAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bv d2VycGxheS9od21nci9maWppX3Bvd2VydHVuZS5oIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dl cnBsYXkvaHdtZ3IvZmlqaV9wb3dlcnR1bmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwLi41NWU1ODIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9w b3dlcnBsYXkvaHdtZ3IvZmlqaV9wb3dlcnR1bmUuaApAQCAtMCwwICsxLDY2IEBACisvKgorICog Q29weXJpZ2h0IDIwMTUgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFBlcm1p c3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9i dGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1l bnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdh cmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICog dGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1 dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBh bmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hl ZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICog VGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hh bGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMg b2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMi LCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJ TkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ TElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5H RU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1Ig QVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBM SUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVS V0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUg U09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJF LgorICoKKyAqLworI2lmbmRlZiBGSUpJX1BPV0VSVFVORV9ICisjZGVmaW5lIEZJSklfUE9XRVJU VU5FX0gKKworZW51bSBmaWppX3B0X2NvbmZpZ19yZWdfdHlwZSB7CisJRklKSV9DT05GSUdSRUdf TU1SID0gMCwKKwlGSUpJX0NPTkZJR1JFR19TTUNfSU5ELAorCUZJSklfQ09ORklHUkVHX0RJRFRf SU5ELAorCUZJSklfQ09ORklHUkVHX0NBQ0hFLAorCUZJSklfQ09ORklHUkVHX01BWAorfTsKKwor LyogUG93ZXJDb250YWlubWVudCBGZWF0dXJlcyAqLworI2RlZmluZSBQT1dFUkNPTlRBSU5NRU5U X0ZFQVRVUkVfRFRFICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgUE9XRVJDT05UQUlO TUVOVF9GRUFUVVJFX1REQ0xpbWl0ICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFBPV0VSQ09O VEFJTk1FTlRfRkVBVFVSRV9Qa2dQd3JMaW1pdCAgICAgMHgwMDAwMDAwNAorCitzdHJ1Y3QgZmlq aV9wdF9jb25maWdfcmVnIHsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG9m ZnNldDsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2s7CisJdWludDMy X3QgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdDsKKwl1aW50MzJfdCAgICAgICAgICAg ICAgICAgICAgICAgICAgIHZhbHVlOworCWVudW0gZmlqaV9wdF9jb25maWdfcmVnX3R5cGUgICAg ICAgdHlwZTsKK307CisKK3N0cnVjdCBmaWppX3B0X2RlZmF1bHRzCit7CisgICAgdWludDhfdCAg IFN2aUxvYWRMaW5lRW47CisgICAgdWludDhfdCAgIFN2aUxvYWRMaW5lVmRkQzsKKyAgICB1aW50 OF90ICAgVERDX1ZERENfVGhyb3R0bGVSZWxlYXNlTGltaXRQZXJjOworICAgIHVpbnQ4X3QgICBU RENfTUFXdDsKKyAgICB1aW50OF90ICAgVGRjV2F0ZXJmYWxsQ3RsOworICAgIHVpbnQ4X3QgICBE VEVBbWJpZW50VGVtcEJhc2U7Cit9OworCit2b2lkIGZpamlfaW5pdGlhbGl6ZV9wb3dlcl90dW5l X2RlZmF1bHRzKHN0cnVjdCBwcF9od21nciAqaHdtZ3IpOworaW50IGZpamlfcG9wdWxhdGVfYmFw bV9wYXJhbWV0ZXJzX2luX2RwbV90YWJsZShzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKTsKK2ludCBm aWppX3BvcHVsYXRlX3BtX2Z1c2VzKHN0cnVjdCBwcF9od21nciAqaHdtZ3IpOworaW50IGZpamlf ZW5hYmxlX3NtY19jYWMoc3RydWN0IHBwX2h3bWdyICpod21ncik7CitpbnQgZmlqaV9lbmFibGVf cG93ZXJfY29udGFpbm1lbnQoc3RydWN0IHBwX2h3bWdyICpod21ncik7CitpbnQgZmlqaV9zZXRf cG93ZXJfbGltaXQoc3RydWN0IHBwX2h3bWdyICpod21nciwgdWludDMyX3Qgbik7CitpbnQgZmlq aV9wb3dlcl9jb250cm9sX3NldF9sZXZlbChzdHJ1Y3QgcHBfaHdtZ3IgKmh3bWdyKTsKKworI2Vu ZGlmICAvKiBGSUpJX1BPV0VSVFVORV9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS9hbWQvcG93ZXJwbGF5L2h3bWdyL2h3bWdyLmMgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2Vy cGxheS9od21nci9od21nci5jCmluZGV4IDQwN2IyZTMuLmYyNDNlNDAgMTAwNjQ0Ci0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2h3bWdyL2h3bWdyLmMKKysrIGIvZHJpdmVycy9n cHUvZHJtL2FtZC9wb3dlcnBsYXkvaHdtZ3IvaHdtZ3IuYwpAQCAtMzAsNiArMzAsOCBAQAogI2lu Y2x1ZGUgImN6X2h3bWdyLmgiCiAjaW5jbHVkZSAidG9uZ2FfaHdtZ3IuaCIKIAorZXh0ZXJuIGlu dCBmaWppX2h3bWdyX2luaXQoc3RydWN0IHBwX2h3bWdyICpod21ncik7CisKIGludCBod21ncl9p bml0KHN0cnVjdCBhbWRfcHBfaW5pdCAqcHBfaW5pdCwgc3RydWN0IHBwX2luc3RhbmNlICpoYW5k bGUpCiB7CiAJc3RydWN0IHBwX2h3bWdyICpod21ncjsKQEAgLTU5LDYgKzYxLDkgQEAgaW50IGh3 bWdyX2luaXQoc3RydWN0IGFtZF9wcF9pbml0ICpwcF9pbml0LCBzdHJ1Y3QgcHBfaW5zdGFuY2Ug KmhhbmRsZSkKIAkJY2FzZSBDSElQX1RPTkdBOgogCQkJdG9uZ2FfaHdtZ3JfaW5pdChod21ncik7 CiAJCQlicmVhazsKKwkJY2FzZSBDSElQX0ZJSkk6CisJCQlmaWppX2h3bWdyX2luaXQoaHdtZ3Ip OworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotLSAKMS44 LjMuMQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJp LWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHA6 Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK