From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3DBFCC33C8C for ; Mon, 6 Jan 2020 23:47:11 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 160222072A for ; Mon, 6 Jan 2020 23:47:10 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 160222072A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 9BEF36E5A2; Mon, 6 Jan 2020 23:47:10 +0000 (UTC) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTPS id DF3356E5A2 for ; Mon, 6 Jan 2020 23:47:08 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 06 Jan 2020 15:47:07 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,404,1571727600"; d="scan'208";a="232983967" Received: from ijbeckin-mobl.ger.corp.intel.com (HELO mwahaha-bdw.ger.corp.intel.com) ([10.252.10.8]) by orsmga002.jf.intel.com with ESMTP; 06 Jan 2020 15:47:03 -0800 From: Matthew Auld To: intel-gfx@lists.freedesktop.org Date: Mon, 6 Jan 2020 23:47:02 +0000 Message-Id: <20200106234703.645168-1-matthew.auld@intel.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH] drm/i915/gtt: split up i915_gem_gtt X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" QXR0ZW1wdCB0byBzcGxpdCBpOTE1X2dlbV9ndHQuW2NoXSBpbnRvIG1vcmUgbWFuYWdlYWJsZSBj aHVua3MuCgpTdWdnZXN0ZWQtYnk6IENocmlzIFdpbHNvbiA8Y2hyaXNAY2hyaXMtd2lsc29uLmNv LnVrPgpTaWduZWQtb2ZmLWJ5OiBNYXR0aGV3IEF1bGQgPG1hdHRoZXcuYXVsZEBpbnRlbC5jb20+ CkNjOiBDaHJpcyBXaWxzb24gPGNocmlzQGNocmlzLXdpbHNvbi5jby51az4KLS0tCiBkcml2ZXJz L2dwdS9kcm0vaTkxNS9NYWtlZmlsZSAgICAgICAgICAgICAgICAgfCAgICA1ICsKIGRyaXZlcnMv Z3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9jb250ZXh0LmMgICB8ICAgIDEgKwogZHJpdmVycy9n cHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX2NvbnRleHQuaCAgIHwgICAgMSAtCiBkcml2ZXJzL2dw dS9kcm0vaTkxNS9ndC9nZW42X3BwZ3R0LmMgICAgICAgICAgfCAgNDk4ICsrKwogZHJpdmVycy9n cHUvZHJtL2k5MTUvZ3QvZ2VuNl9wcGd0dC5oICAgICAgICAgIHwgICA3OSArCiBkcml2ZXJzL2dw dS9kcm0vaTkxNS9ndC9nZW44X3BwZ3R0LmMgICAgICAgICAgfCAgNzE1ICsrKysKIGRyaXZlcnMv Z3B1L2RybS9pOTE1L2d0L2dlbjhfcHBndHQuaCAgICAgICAgICB8ICAgMTMgKwogZHJpdmVycy9n cHUvZHJtL2k5MTUvZ3QvaW50ZWxfZ2d0dC5jICAgICAgICAgIHwgMTQwMiArKysrKysrCiBkcml2 ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9ndHQuYyAgICAgICAgICAgfCAgNzE2ICsrKysKIGRy aXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2d0dC5oICAgICAgICAgICB8ICA3MTQgKysrKwog ZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfcHBndHQuYyAgICAgICAgIHwgIDIyNiArCiAu Li4vZ3B1L2RybS9pOTE1L2d0L2ludGVsX3Jpbmdfc3VibWlzc2lvbi5jICAgfCAgICAyICsKIGRy aXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5jICAgICAgICAgICB8IDM2MjQgKy0tLS0t LS0tLS0tLS0tLS0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5oICAgICAgICAg ICB8ICA2MjggKy0tCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9nZW1fZ3R0 LmMgfCAgICAzICstCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvbW9ja19ndHQuYyAg ICAgfCAgICA5ICstCiAxNiBmaWxlcyBjaGFuZ2VkLCA0NDE4IGluc2VydGlvbnMoKyksIDQyMTgg ZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Qv Z2VuNl9wcGd0dC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Qv Z2VuNl9wcGd0dC5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Qv Z2VuOF9wcGd0dC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Qv Z2VuOF9wcGd0dC5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Qv aW50ZWxfZ2d0dC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Qv aW50ZWxfZ3R0LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9p bnRlbF9ndHQuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2lu dGVsX3BwZ3R0LmMKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZSBi L2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCmluZGV4IDBiMWQ4ZDM2YTUwYS4uZWI1Y2Uz OGFjYzY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQorKysgYi9k cml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQpAQCAtNzQsNiArNzQsOCBAQCBndC15ICs9IFwK IAlndC9kZWJ1Z2ZzX2VuZ2luZXMubyBcCiAJZ3QvZGVidWdmc19ndC5vIFwKIAlndC9kZWJ1Z2Zz X2d0X3BtLm8gXAorCWd0L2dlbjZfcHBndHQubyBcCisJZ3QvZ2VuOF9wcGd0dC5vIFwKIAlndC9p bnRlbF9icmVhZGNydW1icy5vIFwKIAlndC9pbnRlbF9jb250ZXh0Lm8gXAogCWd0L2ludGVsX2Vu Z2luZV9jcy5vIFwKQEAgLTgyLDYgKzg0LDggQEAgZ3QteSArPSBcCiAJZ3QvaW50ZWxfZW5naW5l X3Bvb2wubyBcCiAJZ3QvaW50ZWxfZW5naW5lX3VzZXIubyBcCiAJZ3QvaW50ZWxfZ3QubyBcCisJ Z3QvaW50ZWxfZ2d0dC5vIFwKKwlndC9pbnRlbF9ndHQubyBcCiAJZ3QvaW50ZWxfZ3RfaXJxLm8g XAogCWd0L2ludGVsX2d0X3BtLm8gXAogCWd0L2ludGVsX2d0X3BtX2lycS5vIFwKQEAgLTg5LDYg KzkzLDcgQEAgZ3QteSArPSBcCiAJZ3QvaW50ZWxfbGxjLm8gXAogCWd0L2ludGVsX2xyYy5vIFwK IAlndC9pbnRlbF9tb2NzLm8gXAorCWd0L2ludGVsX3BwZ3R0Lm8gXAogCWd0L2ludGVsX3JjNi5v IFwKIAlndC9pbnRlbF9yZW5kZXJzdGF0ZS5vIFwKIAlndC9pbnRlbF9yZXNldC5vIFwKZGlmZiAt LWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9jb250ZXh0LmMgYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fY29udGV4dC5jCmluZGV4IGY3NDZiYjUzZjE4 ZS4uYzQ1OTg2ZjgwNWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkx NV9nZW1fY29udGV4dC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9j b250ZXh0LmMKQEAgLTY5LDYgKzY5LDcgQEAKIAogI2luY2x1ZGUgPGRybS9pOTE1X2RybS5oPgog CisjaW5jbHVkZSAiZ3QvZ2VuNl9wcGd0dC5oIgogI2luY2x1ZGUgImd0L2ludGVsX2NvbnRleHQu aCIKICNpbmNsdWRlICJndC9pbnRlbF9lbmdpbmVfaGVhcnRiZWF0LmgiCiAjaW5jbHVkZSAiZ3Qv aW50ZWxfZW5naW5lX3BtLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0v aTkxNV9nZW1fY29udGV4dC5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX2Nv bnRleHQuaAppbmRleCAxNGYzY2MxYjc1ODMuLjNhZTYxYTM1NWQ4NyAxMDA2NDQKLS0tIGEvZHJp dmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX2NvbnRleHQuaAorKysgYi9kcml2ZXJzL2dw dS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fY29udGV4dC5oCkBAIC0xMyw3ICsxMyw2IEBACiAKICNp bmNsdWRlICJpOTE1X2Rydi5oIgogI2luY2x1ZGUgImk5MTVfZ2VtLmgiCi0jaW5jbHVkZSAiaTkx NV9nZW1fZ3R0LmgiCiAjaW5jbHVkZSAiaTkxNV9zY2hlZHVsZXIuaCIKICNpbmNsdWRlICJpbnRl bF9kZXZpY2VfaW5mby5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9n ZW42X3BwZ3R0LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9nZW42X3BwZ3R0LmMKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi5jNzVkYmRkN2ViMDAKLS0tIC9kZXYv bnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9nZW42X3BwZ3R0LmMKQEAgLTAsMCAr MSw0OTggQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKKy8qCisgKiBDb3B5cmln aHQgwqkgMjAyMCBJbnRlbCBDb3Jwb3JhdGlvbgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFi Lmg+IC8qIGZhdWx0LWluamVjdC5oIGlzIG5vdCBzdGFuZGFsb25lISAqLworCisjaW5jbHVkZSA8 bGludXgvZmF1bHQtaW5qZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorI2luY2x1ZGUg PGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8 bGludXgvc3RvcF9tYWNoaW5lLmg+CisKKyNpbmNsdWRlIDxhc20vc2V0X21lbW9yeS5oPgorI2lu Y2x1ZGUgPGFzbS9zbXAuaD4KKworI2luY2x1ZGUgPGRybS9pOTE1X2RybS5oPgorCisjaW5jbHVk ZSAiZGlzcGxheS9pbnRlbF9mcm9udGJ1ZmZlci5oIgorI2luY2x1ZGUgImd0L2ludGVsX2d0Lmgi CisjaW5jbHVkZSAiZ3QvaW50ZWxfZ3RfcmVxdWVzdHMuaCIKKworI2luY2x1ZGUgImk5MTVfZHJ2 LmgiCisjaW5jbHVkZSAiaTkxNV9zY2F0dGVybGlzdC5oIgorI2luY2x1ZGUgImk5MTVfdHJhY2Uu aCIKKyNpbmNsdWRlICJpOTE1X3ZncHUuaCIKKworI2luY2x1ZGUgImdlbjZfcHBndHQuaCIKKwor LyogV3JpdGUgcGRlIChpbmRleCkgZnJvbSB0aGUgcGFnZSBkaXJlY3RvcnkgQHBkIHRvIHRoZSBw YWdlIHRhYmxlIEBwdCAqLworc3RhdGljIGlubGluZSB2b2lkIGdlbjZfd3JpdGVfcGRlKGNvbnN0 IHN0cnVjdCBnZW42X3BwZ3R0ICpwcGd0dCwKKwkJCQkgIGNvbnN0IHVuc2lnbmVkIGludCBwZGUs CisJCQkJICBjb25zdCBzdHJ1Y3QgaTkxNV9wYWdlX3RhYmxlICpwdCkKK3sKKwkvKiBDYWxsZXIg bmVlZHMgdG8gbWFrZSBzdXJlIHRoZSB3cml0ZSBjb21wbGV0ZXMgaWYgbmVjZXNzYXJ5ICovCisJ aW93cml0ZTMyKEdFTjZfUERFX0FERFJfRU5DT0RFKHB4X2RtYShwdCkpIHwgR0VONl9QREVfVkFM SUQsCisJCSAgcHBndHQtPnBkX2FkZHIgKyBwZGUpOworfQorCit2b2lkIGdlbjdfcHBndHRfZW5h YmxlKHN0cnVjdCBpbnRlbF9ndCAqZ3QpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5 MTUgPSBndC0+aTkxNTsKKwlzdHJ1Y3QgaW50ZWxfdW5jb3JlICp1bmNvcmUgPSBndC0+dW5jb3Jl OworCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZTsKKwllbnVtIGludGVsX2VuZ2luZV9p ZCBpZDsKKwl1MzIgZWNvY2hrOworCisJaW50ZWxfdW5jb3JlX3Jtdyh1bmNvcmUsIEdBQ19FQ09f QklUUywgMCwgRUNPQklUU19QUEdUVF9DQUNIRTY0Qik7CisKKwllY29jaGsgPSBpbnRlbF91bmNv cmVfcmVhZCh1bmNvcmUsIEdBTV9FQ09DSEspOworCWlmIChJU19IQVNXRUxMKGk5MTUpKSB7CisJ CWVjb2NoayB8PSBFQ09DSEtfUFBHVFRfV0JfSFNXOworCX0gZWxzZSB7CisJCWVjb2NoayB8PSBF Q09DSEtfUFBHVFRfTExDX0lWQjsKKwkJZWNvY2hrICY9IH5FQ09DSEtfUFBHVFRfR0ZEVF9JVkI7 CisJfQorCWludGVsX3VuY29yZV93cml0ZSh1bmNvcmUsIEdBTV9FQ09DSEssIGVjb2Noayk7CisK Kwlmb3JfZWFjaF9lbmdpbmUoZW5naW5lLCBndCwgaWQpIHsKKwkJLyogR0ZYX01PREUgaXMgcGVy LXJpbmcgb24gZ2VuNysgKi8KKwkJRU5HSU5FX1dSSVRFKGVuZ2luZSwKKwkJCSAgICAgUklOR19N T0RFX0dFTjcsCisJCQkgICAgIF9NQVNLRURfQklUX0VOQUJMRShHRlhfUFBHVFRfRU5BQkxFKSk7 CisJfQorfQorCit2b2lkIGdlbjZfcHBndHRfZW5hYmxlKHN0cnVjdCBpbnRlbF9ndCAqZ3QpCit7 CisJc3RydWN0IGludGVsX3VuY29yZSAqdW5jb3JlID0gZ3QtPnVuY29yZTsKKworCWludGVsX3Vu Y29yZV9ybXcodW5jb3JlLAorCQkJIEdBQ19FQ09fQklUUywKKwkJCSAwLAorCQkJIEVDT0JJVFNf U05CX0JJVCB8IEVDT0JJVFNfUFBHVFRfQ0FDSEU2NEIpOworCisJaW50ZWxfdW5jb3JlX3Jtdyh1 bmNvcmUsCisJCQkgR0FCX0NUTCwKKwkJCSAwLAorCQkJIEdBQl9DVExfQ09OVF9BRlRFUl9QQUdF RkFVTFQpOworCisJaW50ZWxfdW5jb3JlX3Jtdyh1bmNvcmUsCisJCQkgR0FNX0VDT0NISywKKwkJ CSAwLAorCQkJIEVDT0NIS19TTkJfQklUIHwgRUNPQ0hLX1BQR1RUX0NBQ0hFNjRCKTsKKworCWlm IChIQVNfUFBHVFQodW5jb3JlLT5pOTE1KSkgLyogbWF5IGJlIGRpc2FibGVkIGZvciBWVC1kICov CisJCWludGVsX3VuY29yZV93cml0ZSh1bmNvcmUsCisJCQkJICAgR0ZYX01PREUsCisJCQkJICAg X01BU0tFRF9CSVRfRU5BQkxFKEdGWF9QUEdUVF9FTkFCTEUpKTsKK30KKworLyogUFBHVFQgc3Vw cG9ydCBmb3IgU2FuZHliZHJpZ2UvR2VuNiBhbmQgbGF0ZXIgKi8KK3N0YXRpYyB2b2lkIGdlbjZf cHBndHRfY2xlYXJfcmFuZ2Uoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCisJCQkJICAg dTY0IHN0YXJ0LCB1NjQgbGVuZ3RoKQoreworCXN0cnVjdCBnZW42X3BwZ3R0ICogY29uc3QgcHBn dHQgPSB0b19nZW42X3BwZ3R0KGk5MTVfdm1fdG9fcHBndHQodm0pKTsKKwljb25zdCB1bnNpZ25l ZCBpbnQgZmlyc3RfZW50cnkgPSBzdGFydCAvIEk5MTVfR1RUX1BBR0VfU0laRTsKKwljb25zdCBn ZW42X3B0ZV90IHNjcmF0Y2hfcHRlID0gdm0tPnNjcmF0Y2hbMF0uZW5jb2RlOworCXVuc2lnbmVk IGludCBwZGUgPSBmaXJzdF9lbnRyeSAvIEdFTjZfUFRFUzsKKwl1bnNpZ25lZCBpbnQgcHRlID0g Zmlyc3RfZW50cnkgJSBHRU42X1BURVM7CisJdW5zaWduZWQgaW50IG51bV9lbnRyaWVzID0gbGVu Z3RoIC8gSTkxNV9HVFRfUEFHRV9TSVpFOworCisJd2hpbGUgKG51bV9lbnRyaWVzKSB7CisJCXN0 cnVjdCBpOTE1X3BhZ2VfdGFibGUgKiBjb25zdCBwdCA9CisJCQlpOTE1X3B0X2VudHJ5KHBwZ3R0 LT5iYXNlLnBkLCBwZGUrKyk7CisJCWNvbnN0IHVuc2lnbmVkIGludCBjb3VudCA9IG1pbihudW1f ZW50cmllcywgR0VONl9QVEVTIC0gcHRlKTsKKwkJZ2VuNl9wdGVfdCAqdmFkZHI7CisKKwkJR0VN X0JVR19PTihweF9iYXNlKHB0KSA9PSBweF9iYXNlKCZ2bS0+c2NyYXRjaFsxXSkpOworCisJCW51 bV9lbnRyaWVzIC09IGNvdW50OworCisJCUdFTV9CVUdfT04oY291bnQgPiBhdG9taWNfcmVhZCgm cHQtPnVzZWQpKTsKKwkJaWYgKCFhdG9taWNfc3ViX3JldHVybihjb3VudCwgJnB0LT51c2VkKSkK KwkJCXBwZ3R0LT5zY2FuX2Zvcl91bnVzZWRfcHQgPSB0cnVlOworCisJCS8qCisJCSAqIE5vdGUg dGhhdCB0aGUgaHcgZG9lc24ndCBzdXBwb3J0IHJlbW92aW5nIFBERSBvbiB0aGUgZmx5CisJCSAq ICh0aGV5IGFyZSBjYWNoZWQgaW5zaWRlIHRoZSBjb250ZXh0IHdpdGggbm8gbWVhbnMgdG8KKwkJ ICogaW52YWxpZGF0ZSB0aGUgY2FjaGUpLCBzbyB3ZSBjYW4gb25seSByZXNldCB0aGUgUFRFCisJ CSAqIGVudHJpZXMgYmFjayB0byBzY3JhdGNoLgorCQkgKi8KKworCQl2YWRkciA9IGttYXBfYXRv bWljX3B4KHB0KTsKKwkJbWVtc2V0MzIodmFkZHIgKyBwdGUsIHNjcmF0Y2hfcHRlLCBjb3VudCk7 CisJCWt1bm1hcF9hdG9taWModmFkZHIpOworCisJCXB0ZSA9IDA7CisJfQorfQorCitzdGF0aWMg dm9pZCBnZW42X3BwZ3R0X2luc2VydF9lbnRyaWVzKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2Ug KnZtLAorCQkJCSAgICAgIHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAorCQkJCSAgICAgIGVudW0gaTkx NV9jYWNoZV9sZXZlbCBjYWNoZV9sZXZlbCwKKwkJCQkgICAgICB1MzIgZmxhZ3MpCit7CisJc3Ry dWN0IGk5MTVfcHBndHQgKnBwZ3R0ID0gaTkxNV92bV90b19wcGd0dCh2bSk7CisJc3RydWN0IGk5 MTVfcGFnZV9kaXJlY3RvcnkgKiBjb25zdCBwZCA9IHBwZ3R0LT5wZDsKKwl1bnNpZ25lZCBmaXJz dF9lbnRyeSA9IHZtYS0+bm9kZS5zdGFydCAvIEk5MTVfR1RUX1BBR0VfU0laRTsKKwl1bnNpZ25l ZCBhY3RfcHQgPSBmaXJzdF9lbnRyeSAvIEdFTjZfUFRFUzsKKwl1bnNpZ25lZCBhY3RfcHRlID0g Zmlyc3RfZW50cnkgJSBHRU42X1BURVM7CisJY29uc3QgdTMyIHB0ZV9lbmNvZGUgPSB2bS0+cHRl X2VuY29kZSgwLCBjYWNoZV9sZXZlbCwgZmxhZ3MpOworCXN0cnVjdCBzZ3RfZG1hIGl0ZXIgPSBz Z3RfZG1hKHZtYSk7CisJZ2VuNl9wdGVfdCAqdmFkZHI7CisKKwlHRU1fQlVHX09OKHBkLT5lbnRy eVthY3RfcHRdID09ICZ2bS0+c2NyYXRjaFsxXSk7CisKKwl2YWRkciA9IGttYXBfYXRvbWljX3B4 KGk5MTVfcHRfZW50cnkocGQsIGFjdF9wdCkpOworCWRvIHsKKwkJdmFkZHJbYWN0X3B0ZV0gPSBw dGVfZW5jb2RlIHwgR0VONl9QVEVfQUREUl9FTkNPREUoaXRlci5kbWEpOworCisJCWl0ZXIuZG1h ICs9IEk5MTVfR1RUX1BBR0VfU0laRTsKKwkJaWYgKGl0ZXIuZG1hID09IGl0ZXIubWF4KSB7CisJ CQlpdGVyLnNnID0gX19zZ19uZXh0KGl0ZXIuc2cpOworCQkJaWYgKCFpdGVyLnNnKQorCQkJCWJy ZWFrOworCisJCQlpdGVyLmRtYSA9IHNnX2RtYV9hZGRyZXNzKGl0ZXIuc2cpOworCQkJaXRlci5t YXggPSBpdGVyLmRtYSArIGl0ZXIuc2ctPmxlbmd0aDsKKwkJfQorCisJCWlmICgrK2FjdF9wdGUg PT0gR0VONl9QVEVTKSB7CisJCQlrdW5tYXBfYXRvbWljKHZhZGRyKTsKKwkJCXZhZGRyID0ga21h cF9hdG9taWNfcHgoaTkxNV9wdF9lbnRyeShwZCwgKythY3RfcHQpKTsKKwkJCWFjdF9wdGUgPSAw OworCQl9CisJfSB3aGlsZSAoMSk7CisJa3VubWFwX2F0b21pYyh2YWRkcik7CisKKwl2bWEtPnBh Z2Vfc2l6ZXMuZ3R0ID0gSTkxNV9HVFRfUEFHRV9TSVpFOworfQorCitzdGF0aWMgdm9pZCBnZW42 X2ZsdXNoX3BkKHN0cnVjdCBnZW42X3BwZ3R0ICpwcGd0dCwgdTY0IHN0YXJ0LCB1NjQgZW5kKQor eworCXN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICogY29uc3QgcGQgPSBwcGd0dC0+YmFzZS5w ZDsKKwlzdHJ1Y3QgaTkxNV9wYWdlX3RhYmxlICpwdDsKKwl1bnNpZ25lZCBpbnQgcGRlOworCisJ c3RhcnQgPSByb3VuZF9kb3duKHN0YXJ0LCBTWl82NEspOworCWVuZCA9IHJvdW5kX3VwKGVuZCwg U1pfNjRLKSAtIHN0YXJ0OworCisJbXV0ZXhfbG9jaygmcHBndHQtPmZsdXNoKTsKKworCWdlbjZf Zm9yX2VhY2hfcGRlKHB0LCBwZCwgc3RhcnQsIGVuZCwgcGRlKQorCQlnZW42X3dyaXRlX3BkZShw cGd0dCwgcGRlLCBwdCk7CisKKwltYigpOworCWlvcmVhZDMyKHBwZ3R0LT5wZF9hZGRyICsgcGRl IC0gMSk7CisJZ2VuNl9nZ3R0X2ludmFsaWRhdGUocHBndHQtPmJhc2Uudm0uZ3QtPmdndHQpOwor CW1iKCk7CisKKwltdXRleF91bmxvY2soJnBwZ3R0LT5mbHVzaCk7Cit9CisKK3N0YXRpYyBpbnQg Z2VuNl9hbGxvY192YV9yYW5nZShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKKwkJCSAg ICAgICB1NjQgc3RhcnQsIHU2NCBsZW5ndGgpCit7CisJc3RydWN0IGdlbjZfcHBndHQgKnBwZ3R0 ID0gdG9fZ2VuNl9wcGd0dChpOTE1X3ZtX3RvX3BwZ3R0KHZtKSk7CisJc3RydWN0IGk5MTVfcGFn ZV9kaXJlY3RvcnkgKiBjb25zdCBwZCA9IHBwZ3R0LT5iYXNlLnBkOworCXN0cnVjdCBpOTE1X3Bh Z2VfdGFibGUgKnB0LCAqYWxsb2MgPSBOVUxMOworCWludGVsX3dha2VyZWZfdCB3YWtlcmVmOwor CXU2NCBmcm9tID0gc3RhcnQ7CisJdW5zaWduZWQgaW50IHBkZTsKKwlpbnQgcmV0ID0gMDsKKwor CXdha2VyZWYgPSBpbnRlbF9ydW50aW1lX3BtX2dldCgmdm0tPmk5MTUtPnJ1bnRpbWVfcG0pOwor CisJc3Bpbl9sb2NrKCZwZC0+bG9jayk7CisJZ2VuNl9mb3JfZWFjaF9wZGUocHQsIHBkLCBzdGFy dCwgbGVuZ3RoLCBwZGUpIHsKKwkJY29uc3QgdW5zaWduZWQgaW50IGNvdW50ID0gZ2VuNl9wdGVf Y291bnQoc3RhcnQsIGxlbmd0aCk7CisKKwkJaWYgKHB4X2Jhc2UocHQpID09IHB4X2Jhc2UoJnZt LT5zY3JhdGNoWzFdKSkgeworCQkJc3Bpbl91bmxvY2soJnBkLT5sb2NrKTsKKworCQkJcHQgPSBm ZXRjaF9hbmRfemVybygmYWxsb2MpOworCQkJaWYgKCFwdCkKKwkJCQlwdCA9IGFsbG9jX3B0KHZt KTsKKwkJCWlmIChJU19FUlIocHQpKSB7CisJCQkJcmV0ID0gUFRSX0VSUihwdCk7CisJCQkJZ290 byB1bndpbmRfb3V0OworCQkJfQorCisJCQlmaWxsMzJfcHgocHQsIHZtLT5zY3JhdGNoWzBdLmVu Y29kZSk7CisKKwkJCXNwaW5fbG9jaygmcGQtPmxvY2spOworCQkJaWYgKHBkLT5lbnRyeVtwZGVd ID09ICZ2bS0+c2NyYXRjaFsxXSkgeworCQkJCXBkLT5lbnRyeVtwZGVdID0gcHQ7CisJCQl9IGVs c2UgeworCQkJCWFsbG9jID0gcHQ7CisJCQkJcHQgPSBwZC0+ZW50cnlbcGRlXTsKKwkJCX0KKwkJ fQorCisJCWF0b21pY19hZGQoY291bnQsICZwdC0+dXNlZCk7CisJfQorCXNwaW5fdW5sb2NrKCZw ZC0+bG9jayk7CisKKwlpZiAoaTkxNV92bWFfaXNfYm91bmQocHBndHQtPnZtYSwgSTkxNV9WTUFf R0xPQkFMX0JJTkQpKQorCQlnZW42X2ZsdXNoX3BkKHBwZ3R0LCBmcm9tLCBzdGFydCk7CisKKwln b3RvIG91dDsKKwordW53aW5kX291dDoKKwlnZW42X3BwZ3R0X2NsZWFyX3JhbmdlKHZtLCBmcm9t LCBzdGFydCAtIGZyb20pOworb3V0OgorCWlmIChhbGxvYykKKwkJZnJlZV9weCh2bSwgYWxsb2Mp OworCWludGVsX3J1bnRpbWVfcG1fcHV0KCZ2bS0+aTkxNS0+cnVudGltZV9wbSwgd2FrZXJlZik7 CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnZW42X3BwZ3R0X2luaXRfc2NyYXRjaChz dHJ1Y3QgZ2VuNl9wcGd0dCAqcHBndHQpCit7CisJc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAq IGNvbnN0IHZtID0gJnBwZ3R0LT5iYXNlLnZtOworCXN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5 ICogY29uc3QgcGQgPSBwcGd0dC0+YmFzZS5wZDsKKwlpbnQgcmV0OworCisJcmV0ID0gc2V0dXBf c2NyYXRjaF9wYWdlKHZtLCBfX0dGUF9ISUdITUVNKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0 OworCisJdm0tPnNjcmF0Y2hbMF0uZW5jb2RlID0KKwkJdm0tPnB0ZV9lbmNvZGUocHhfZG1hKCZ2 bS0+c2NyYXRjaFswXSksCisJCQkgICAgICAgSTkxNV9DQUNIRV9OT05FLCBQVEVfUkVBRF9PTkxZ KTsKKworCWlmICh1bmxpa2VseShzZXR1cF9wYWdlX2RtYSh2bSwgcHhfYmFzZSgmdm0tPnNjcmF0 Y2hbMV0pKSkpIHsKKwkJY2xlYW51cF9zY3JhdGNoX3BhZ2Uodm0pOworCQlyZXR1cm4gLUVOT01F TTsKKwl9CisKKwlmaWxsMzJfcHgoJnZtLT5zY3JhdGNoWzFdLCB2bS0+c2NyYXRjaFswXS5lbmNv ZGUpOworCW1lbXNldF9wKHBkLT5lbnRyeSwgJnZtLT5zY3JhdGNoWzFdLCBJOTE1X1BERVMpOwor CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdlbjZfcHBndHRfZnJlZV9wZChzdHJ1Y3Qg Z2VuNl9wcGd0dCAqcHBndHQpCit7CisJc3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKiBjb25z dCBwZCA9IHBwZ3R0LT5iYXNlLnBkOworCXN0cnVjdCBpOTE1X3BhZ2VfZG1hICogY29uc3Qgc2Ny YXRjaCA9CisJCXB4X2Jhc2UoJnBwZ3R0LT5iYXNlLnZtLnNjcmF0Y2hbMV0pOworCXN0cnVjdCBp OTE1X3BhZ2VfdGFibGUgKnB0OworCXUzMiBwZGU7CisKKwlnZW42X2Zvcl9hbGxfcGRlcyhwdCwg cGQsIHBkZSkKKwkJaWYgKHB4X2Jhc2UocHQpICE9IHNjcmF0Y2gpCisJCQlmcmVlX3B4KCZwcGd0 dC0+YmFzZS52bSwgcHQpOworfQorCitzdGF0aWMgdm9pZCBnZW42X3BwZ3R0X2NsZWFudXAoc3Ry dWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pCit7CisJc3RydWN0IGdlbjZfcHBndHQgKnBwZ3R0 ID0gdG9fZ2VuNl9wcGd0dChpOTE1X3ZtX3RvX3BwZ3R0KHZtKSk7CisKKwlfX2k5MTVfdm1hX3B1 dChwcGd0dC0+dm1hKTsKKworCWdlbjZfcHBndHRfZnJlZV9wZChwcGd0dCk7CisJZnJlZV9zY3Jh dGNoKHZtKTsKKworCW11dGV4X2Rlc3Ryb3koJnBwZ3R0LT5mbHVzaCk7CisJbXV0ZXhfZGVzdHJv eSgmcHBndHQtPnBpbl9tdXRleCk7CisJa2ZyZWUocHBndHQtPmJhc2UucGQpOworfQorCitzdGF0 aWMgaW50IHBkX3ZtYV9zZXRfcGFnZXMoc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJdm1hLT5w YWdlcyA9IEVSUl9QVFIoLUVOT0RFVik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBk X3ZtYV9jbGVhcl9wYWdlcyhzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sKKwlHRU1fQlVHX09OKCF2 bWEtPnBhZ2VzKTsKKworCXZtYS0+cGFnZXMgPSBOVUxMOworfQorCitzdGF0aWMgaW50IHBkX3Zt YV9iaW5kKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAorCQkgICAgICAgZW51bSBpOTE1X2NhY2hlX2xl dmVsIGNhY2hlX2xldmVsLAorCQkgICAgICAgdTMyIHVudXNlZCkKK3sKKwlzdHJ1Y3QgaTkxNV9n Z3R0ICpnZ3R0ID0gaTkxNV92bV90b19nZ3R0KHZtYS0+dm0pOworCXN0cnVjdCBnZW42X3BwZ3R0 ICpwcGd0dCA9IHZtYS0+cHJpdmF0ZTsKKwl1MzIgZ2d0dF9vZmZzZXQgPSBpOTE1X2dndHRfb2Zm c2V0KHZtYSkgLyBJOTE1X0dUVF9QQUdFX1NJWkU7CisKKwlweF9iYXNlKHBwZ3R0LT5iYXNlLnBk KS0+Z2d0dF9vZmZzZXQgPSBnZ3R0X29mZnNldCAqIHNpemVvZihnZW42X3B0ZV90KTsKKwlwcGd0 dC0+cGRfYWRkciA9IChnZW42X3B0ZV90IF9faW9tZW0gKilnZ3R0LT5nc20gKyBnZ3R0X29mZnNl dDsKKworCWdlbjZfZmx1c2hfcGQocHBndHQsIDAsIHBwZ3R0LT5iYXNlLnZtLnRvdGFsKTsKKwly ZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGRfdm1hX3VuYmluZChzdHJ1Y3QgaTkxNV92bWEg KnZtYSkKK3sKKwlzdHJ1Y3QgZ2VuNl9wcGd0dCAqcHBndHQgPSB2bWEtPnByaXZhdGU7CisJc3Ry dWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKiBjb25zdCBwZCA9IHBwZ3R0LT5iYXNlLnBkOworCXN0 cnVjdCBpOTE1X3BhZ2VfZG1hICogY29uc3Qgc2NyYXRjaCA9CisJCXB4X2Jhc2UoJnBwZ3R0LT5i YXNlLnZtLnNjcmF0Y2hbMV0pOworCXN0cnVjdCBpOTE1X3BhZ2VfdGFibGUgKnB0OworCXVuc2ln bmVkIGludCBwZGU7CisKKwlpZiAoIXBwZ3R0LT5zY2FuX2Zvcl91bnVzZWRfcHQpCisJCXJldHVy bjsKKworCS8qIEZyZWUgYWxsIG5vIGxvbmdlciB1c2VkIHBhZ2UgdGFibGVzICovCisJZ2VuNl9m b3JfYWxsX3BkZXMocHQsIHBwZ3R0LT5iYXNlLnBkLCBwZGUpIHsKKwkJaWYgKHB4X2Jhc2UocHQp ID09IHNjcmF0Y2ggfHwgYXRvbWljX3JlYWQoJnB0LT51c2VkKSkKKwkJCWNvbnRpbnVlOworCisJ CWZyZWVfcHgoJnBwZ3R0LT5iYXNlLnZtLCBwdCk7CisJCXBkLT5lbnRyeVtwZGVdID0gc2NyYXRj aDsKKwl9CisKKwlwcGd0dC0+c2Nhbl9mb3JfdW51c2VkX3B0ID0gZmFsc2U7Cit9CisKK3N0YXRp YyBjb25zdCBzdHJ1Y3QgaTkxNV92bWFfb3BzIHBkX3ZtYV9vcHMgPSB7CisJLnNldF9wYWdlcyA9 IHBkX3ZtYV9zZXRfcGFnZXMsCisJLmNsZWFyX3BhZ2VzID0gcGRfdm1hX2NsZWFyX3BhZ2VzLAor CS5iaW5kX3ZtYSA9IHBkX3ZtYV9iaW5kLAorCS51bmJpbmRfdm1hID0gcGRfdm1hX3VuYmluZCwK K307CisKK3N0YXRpYyBzdHJ1Y3QgaTkxNV92bWEgKnBkX3ZtYV9jcmVhdGUoc3RydWN0IGdlbjZf cHBndHQgKnBwZ3R0LCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0ID0gcHBn dHQtPmJhc2Uudm0uZ3QtPmdndHQ7CisJc3RydWN0IGk5MTVfdm1hICp2bWE7CisKKwlHRU1fQlVH X09OKCFJU19BTElHTkVEKHNpemUsIEk5MTVfR1RUX1BBR0VfU0laRSkpOworCUdFTV9CVUdfT04o c2l6ZSA+IGdndHQtPnZtLnRvdGFsKTsKKworCXZtYSA9IGk5MTVfdm1hX2FsbG9jKCk7CisJaWYg KCF2bWEpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaTkxNV9hY3RpdmVfaW5pdCgm dm1hLT5hY3RpdmUsIE5VTEwsIE5VTEwpOworCisJa3JlZl9pbml0KCZ2bWEtPnJlZik7CisJbXV0 ZXhfaW5pdCgmdm1hLT5wYWdlc19tdXRleCk7CisJdm1hLT52bSA9IGk5MTVfdm1fZ2V0KCZnZ3R0 LT52bSk7CisJdm1hLT5vcHMgPSAmcGRfdm1hX29wczsKKwl2bWEtPnByaXZhdGUgPSBwcGd0dDsK KworCXZtYS0+c2l6ZSA9IHNpemU7CisJdm1hLT5mZW5jZV9zaXplID0gc2l6ZTsKKwlhdG9taWNf c2V0KCZ2bWEtPmZsYWdzLCBJOTE1X1ZNQV9HR1RUKTsKKwl2bWEtPmdndHRfdmlldy50eXBlID0g STkxNV9HR1RUX1ZJRVdfUk9UQVRFRDsgLyogcHJldmVudCBmZW5jaW5nICovCisKKwlJTklUX0xJ U1RfSEVBRCgmdm1hLT5vYmpfbGluayk7CisJSU5JVF9MSVNUX0hFQUQoJnZtYS0+Y2xvc2VkX2xp bmspOworCisJcmV0dXJuIHZtYTsKK30KKworaW50IGdlbjZfcHBndHRfcGluKHN0cnVjdCBpOTE1 X3BwZ3R0ICpiYXNlKQoreworCXN0cnVjdCBnZW42X3BwZ3R0ICpwcGd0dCA9IHRvX2dlbjZfcHBn dHQoYmFzZSk7CisJaW50IGVyciA9IDA7CisKKwlHRU1fQlVHX09OKCFhdG9taWNfcmVhZCgmcHBn dHQtPmJhc2Uudm0ub3BlbikpOworCisJLyoKKwkgKiBXb3JrYXJvdW5kIHRoZSBsaW1pdGVkIG1h eGltdW0gdm1hLT5waW5fY291bnQgYW5kIHRoZSBhbGlhc2luZ19wcGd0dAorCSAqIHdoaWNoIHdp bGwgYmUgcGlubmVkIGludG8gZXZlcnkgYWN0aXZlIGNvbnRleHQuCisJICogKFdoZW4gdm1hLT5w aW5fY291bnQgYmVjb21lcyBhdG9taWMsIEkgZXhwZWN0IHdlIHdpbGwgbmF0dXJhbGx5CisJICog bmVlZCBhIGxhcmdlciwgdW5wYWNrZWQsIHR5cGUgYW5kIGtpbGwgdGhpcyByZWR1bmRhbmN5LikK KwkgKi8KKwlpZiAoYXRvbWljX2FkZF91bmxlc3MoJnBwZ3R0LT5waW5fY291bnQsIDEsIDApKQor CQlyZXR1cm4gMDsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnBwZ3R0LT5waW5f bXV0ZXgpKQorCQlyZXR1cm4gLUVJTlRSOworCisJLyoKKwkgKiBQUEdUVCBQREVzIHJlc2lkZSBp biB0aGUgR0dUVCBhbmQgY29uc2lzdHMgb2YgNTEyIGVudHJpZXMuIFRoZQorCSAqIGFsbG9jYXRv ciB3b3JrcyBpbiBhZGRyZXNzIHNwYWNlIHNpemVzLCBzbyBpdCdzIG11bHRpcGxpZWQgYnkgcGFn ZQorCSAqIHNpemUuIFdlIGFsbG9jYXRlIGF0IHRoZSB0b3Agb2YgdGhlIEdUVCB0byBhdm9pZCBm cmFnbWVudGF0aW9uLgorCSAqLworCWlmICghYXRvbWljX3JlYWQoJnBwZ3R0LT5waW5fY291bnQp KSB7CisJCWVyciA9IGk5MTVfZ2d0dF9waW4ocHBndHQtPnZtYSwgR0VONl9QRF9BTElHTiwgUElO X0hJR0gpOworCX0KKwlpZiAoIWVycikKKwkJYXRvbWljX2luYygmcHBndHQtPnBpbl9jb3VudCk7 CisJbXV0ZXhfdW5sb2NrKCZwcGd0dC0+cGluX211dGV4KTsKKworCXJldHVybiBlcnI7Cit9CisK K3ZvaWQgZ2VuNl9wcGd0dF91bnBpbihzdHJ1Y3QgaTkxNV9wcGd0dCAqYmFzZSkKK3sKKwlzdHJ1 Y3QgZ2VuNl9wcGd0dCAqcHBndHQgPSB0b19nZW42X3BwZ3R0KGJhc2UpOworCisJR0VNX0JVR19P TighYXRvbWljX3JlYWQoJnBwZ3R0LT5waW5fY291bnQpKTsKKwlpZiAoYXRvbWljX2RlY19hbmRf dGVzdCgmcHBndHQtPnBpbl9jb3VudCkpCisJCWk5MTVfdm1hX3VucGluKHBwZ3R0LT52bWEpOwor fQorCit2b2lkIGdlbjZfcHBndHRfdW5waW5fYWxsKHN0cnVjdCBpOTE1X3BwZ3R0ICpiYXNlKQor eworCXN0cnVjdCBnZW42X3BwZ3R0ICpwcGd0dCA9IHRvX2dlbjZfcHBndHQoYmFzZSk7CisKKwlp ZiAoIWF0b21pY19yZWFkKCZwcGd0dC0+cGluX2NvdW50KSkKKwkJcmV0dXJuOworCisJaTkxNV92 bWFfdW5waW4ocHBndHQtPnZtYSk7CisJYXRvbWljX3NldCgmcHBndHQtPnBpbl9jb3VudCwgMCk7 Cit9CisKK3N0cnVjdCBpOTE1X3BwZ3R0ICpnZW42X3BwZ3R0X2NyZWF0ZShzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqaTkxNSkKK3sKKwlzdHJ1Y3QgaTkxNV9nZ3R0ICogY29uc3QgZ2d0dCA9ICZp OTE1LT5nZ3R0OworCXN0cnVjdCBnZW42X3BwZ3R0ICpwcGd0dDsKKwlpbnQgZXJyOworCisJcHBn dHQgPSBremFsbG9jKHNpemVvZigqcHBndHQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBwZ3R0KQor CQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCW11dGV4X2luaXQoJnBwZ3R0LT5mbHVzaCk7 CisJbXV0ZXhfaW5pdCgmcHBndHQtPnBpbl9tdXRleCk7CisKKwlwcGd0dF9pbml0KCZwcGd0dC0+ YmFzZSwgJmk5MTUtPmd0KTsKKwlwcGd0dC0+YmFzZS52bS50b3AgPSAxOworCisJcHBndHQtPmJh c2Uudm0uYmluZF9hc3luY19mbGFncyA9IEk5MTVfVk1BX0xPQ0FMX0JJTkQ7CisJcHBndHQtPmJh c2Uudm0uYWxsb2NhdGVfdmFfcmFuZ2UgPSBnZW42X2FsbG9jX3ZhX3JhbmdlOworCXBwZ3R0LT5i YXNlLnZtLmNsZWFyX3JhbmdlID0gZ2VuNl9wcGd0dF9jbGVhcl9yYW5nZTsKKwlwcGd0dC0+YmFz ZS52bS5pbnNlcnRfZW50cmllcyA9IGdlbjZfcHBndHRfaW5zZXJ0X2VudHJpZXM7CisJcHBndHQt PmJhc2Uudm0uY2xlYW51cCA9IGdlbjZfcHBndHRfY2xlYW51cDsKKworCXBwZ3R0LT5iYXNlLnZt LnB0ZV9lbmNvZGUgPSBnZ3R0LT52bS5wdGVfZW5jb2RlOworCisJcHBndHQtPmJhc2UucGQgPSBf X2FsbG9jX3BkKHNpemVvZigqcHBndHQtPmJhc2UucGQpKTsKKwlpZiAoIXBwZ3R0LT5iYXNlLnBk KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJZXJyID0gZ2Vu Nl9wcGd0dF9pbml0X3NjcmF0Y2gocHBndHQpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3BkOwor CisJcHBndHQtPnZtYSA9IHBkX3ZtYV9jcmVhdGUocHBndHQsIEdFTjZfUERfU0laRSk7CisJaWYg KElTX0VSUihwcGd0dC0+dm1hKSkgeworCQllcnIgPSBQVFJfRVJSKHBwZ3R0LT52bWEpOworCQln b3RvIGVycl9zY3JhdGNoOworCX0KKworCXJldHVybiAmcHBndHQtPmJhc2U7CisKK2Vycl9zY3Jh dGNoOgorCWZyZWVfc2NyYXRjaCgmcHBndHQtPmJhc2Uudm0pOworZXJyX3BkOgorCWtmcmVlKHBw Z3R0LT5iYXNlLnBkKTsKK2Vycl9mcmVlOgorCW11dGV4X2Rlc3Ryb3koJnBwZ3R0LT5waW5fbXV0 ZXgpOworCWtmcmVlKHBwZ3R0KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQpkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvZ2VuNl9wcGd0dC5oIGIvZHJpdmVycy9ncHUvZHJt L2k5MTUvZ3QvZ2VuNl9wcGd0dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAwMC4uY2U2M2U4MWM5MjRlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5 MTUvZ3QvZ2VuNl9wcGd0dC5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qIFNQRFgtTGljZW5zZS1JZGVu dGlmaWVyOiBNSVQgKi8KKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAyMCBJbnRlbCBDb3Jwb3JhdGlv bgorICovCisKKyNpZm5kZWYgX19HRU42X1BQR1RUX0hfXworI2RlZmluZSBfX0dFTjZfUFBHVFRf SF9fCisKKyNpbmNsdWRlICJpbnRlbF9ndHQuaCIKKworc3RydWN0IGdlbjZfcHBndHQgeworCXN0 cnVjdCBpOTE1X3BwZ3R0IGJhc2U7CisKKwlzdHJ1Y3QgbXV0ZXggZmx1c2g7CisJc3RydWN0IGk5 MTVfdm1hICp2bWE7CisJZ2VuNl9wdGVfdCBfX2lvbWVtICpwZF9hZGRyOworCisJYXRvbWljX3Qg cGluX2NvdW50OworCXN0cnVjdCBtdXRleCBwaW5fbXV0ZXg7CisKKwlib29sIHNjYW5fZm9yX3Vu dXNlZF9wdDsKK307CisKKworc3RhdGljIGlubGluZSB1MzIgZ2VuNl9wdGVfaW5kZXgodTMyIGFk ZHIpCit7CisJcmV0dXJuIGk5MTVfcHRlX2luZGV4KGFkZHIsIEdFTjZfUERFX1NISUZUKTsKK30K Kworc3RhdGljIGlubGluZSB1MzIgZ2VuNl9wdGVfY291bnQodTMyIGFkZHIsIHUzMiBsZW5ndGgp Cit7CisJcmV0dXJuIGk5MTVfcHRlX2NvdW50KGFkZHIsIGxlbmd0aCwgR0VONl9QREVfU0hJRlQp OworfQorCitzdGF0aWMgaW5saW5lIHUzMiBnZW42X3BkZV9pbmRleCh1MzIgYWRkcikKK3sKKwly ZXR1cm4gaTkxNV9wZGVfaW5kZXgoYWRkciwgR0VONl9QREVfU0hJRlQpOworfQorCisjZGVmaW5l IF9fdG9fZ2VuNl9wcGd0dChiYXNlKSBjb250YWluZXJfb2YoYmFzZSwgc3RydWN0IGdlbjZfcHBn dHQsIGJhc2UpCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGdlbjZfcHBndHQgKnRvX2dlbjZfcHBn dHQoc3RydWN0IGk5MTVfcHBndHQgKmJhc2UpCit7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0 cnVjdCBnZW42X3BwZ3R0LCBiYXNlKSk7CisJcmV0dXJuIF9fdG9fZ2VuNl9wcGd0dChiYXNlKTsK K30KKworLyoKKyAqIGdlbjZfZm9yX2VhY2hfcGRlKCkgaXRlcmF0ZXMgb3ZlciBldmVyeSBwZGUg ZnJvbSBzdGFydCB1bnRpbCBzdGFydCtsZW5ndGguCisgKiBJZiBzdGFydCBhbmQgc3RhcnQrbGVu Z3RoIGFyZSBub3QgcGVyZmVjdGx5IGRpdmlzaWJsZSwgdGhlIG1hY3JvIHdpbGwgcm91bmQKKyAq IGRvd24gYW5kIHVwIGFzIG5lZWRlZC4gU3RhcnQ9MCBhbmQgbGVuZ3RoPTJHIGVmZmVjdGl2ZWx5 IGl0ZXJhdGVzIG92ZXIKKyAqIGV2ZXJ5IFBERSBpbiB0aGUgc3lzdGVtLiBUaGUgbWFjcm8gbW9k aWZpZXMgQUxMIGl0cyBwYXJhbWV0ZXJzIGV4Y2VwdCAncGQnLAorICogc28gZWFjaCBvZiB0aGUg b3RoZXIgcGFyYW1ldGVycyBzaG91bGQgcHJlZmVyYWJseSBiZSBhIHNpbXBsZSB2YXJpYWJsZSwg b3IKKyAqIGF0IG1vc3QgYW4gbHZhbHVlIHdpdGggbm8gc2lkZS1lZmZlY3RzIQorICovCisjZGVm aW5lIGdlbjZfZm9yX2VhY2hfcGRlKHB0LCBwZCwgc3RhcnQsIGxlbmd0aCwgaXRlcikJCQlcCisJ Zm9yIChpdGVyID0gZ2VuNl9wZGVfaW5kZXgoc3RhcnQpOwkJCQlcCisJICAgICBsZW5ndGggPiAw ICYmIGl0ZXIgPCBJOTE1X1BERVMgJiYJCQkJXAorCQkgICAgIChwdCA9IGk5MTVfcHRfZW50cnko cGQsIGl0ZXIpLCB0cnVlKTsJCVwKKwkgICAgICh7IHUzMiB0ZW1wID0gQUxJR04oc3RhcnQrMSwg MSA8PCBHRU42X1BERV9TSElGVCk7CQlcCisJCSAgICB0ZW1wID0gbWluKHRlbXAgLSBzdGFydCwg bGVuZ3RoKTsJCQlcCisJCSAgICBzdGFydCArPSB0ZW1wLCBsZW5ndGggLT0gdGVtcDsgfSksICsr aXRlcikKKworI2RlZmluZSBnZW42X2Zvcl9hbGxfcGRlcyhwdCwgcGQsIGl0ZXIpCQkJCQlcCisJ Zm9yIChpdGVyID0gMDsJCQkJCQkJXAorCSAgICAgaXRlciA8IEk5MTVfUERFUyAmJgkJCQkJXAor CQkgICAgIChwdCA9IGk5MTVfcHRfZW50cnkocGQsIGl0ZXIpLCB0cnVlKTsJCVwKKwkgICAgICsr aXRlcikKKworCitpbnQgZ2VuNl9wcGd0dF9waW4oc3RydWN0IGk5MTVfcHBndHQgKmJhc2UpOwor dm9pZCBnZW42X3BwZ3R0X3VucGluKHN0cnVjdCBpOTE1X3BwZ3R0ICpiYXNlKTsKK3ZvaWQgZ2Vu Nl9wcGd0dF91bnBpbl9hbGwoc3RydWN0IGk5MTVfcHBndHQgKmJhc2UpOwordm9pZCBnZW42X3Bw Z3R0X2VuYWJsZShzdHJ1Y3QgaW50ZWxfZ3QgKmd0KTsKK3ZvaWQgZ2VuN19wcGd0dF9lbmFibGUo c3RydWN0IGludGVsX2d0ICpndCk7CitzdHJ1Y3QgaTkxNV9wcGd0dCAqZ2VuNl9wcGd0dF9jcmVh dGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUpOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvZ2VuOF9wcGd0dC5jIGIvZHJpdmVycy9ncHUvZHJt L2k5MTUvZ3QvZ2VuOF9wcGd0dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAwMC4uY2UzNWExNTQ5OTU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5 MTUvZ3QvZ2VuOF9wcGd0dC5jCkBAIC0wLDAgKzEsNzE1IEBACisvLyBTUERYLUxpY2Vuc2UtSWRl bnRpZmllcjogTUlUCisvKgorICogQ29weXJpZ2h0IMKpIDIwMjAgSW50ZWwgQ29ycG9yYXRpb24K KyAqLworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPiAvKiBmYXVsdC1pbmplY3QuaCBpcyBub3Qg c3RhbmRhbG9uZSEgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZhdWx0LWluamVjdC5oPgorI2luY2x1 ZGUgPGxpbnV4L2xvZzIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxs aW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0b3BfbWFjaGluZS5oPgorCisjaW5j bHVkZSA8YXNtL3NldF9tZW1vcnkuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisKKyNpbmNsdWRl IDxkcm0vaTkxNV9kcm0uaD4KKworI2luY2x1ZGUgImRpc3BsYXkvaW50ZWxfZnJvbnRidWZmZXIu aCIKKyNpbmNsdWRlICJndC9pbnRlbF9ndC5oIgorI2luY2x1ZGUgImd0L2ludGVsX2d0X3JlcXVl c3RzLmgiCisKKyNpbmNsdWRlICJpOTE1X2Rydi5oIgorI2luY2x1ZGUgImk5MTVfc2NhdHRlcmxp c3QuaCIKKyNpbmNsdWRlICJpOTE1X3RyYWNlLmgiCisjaW5jbHVkZSAiaTkxNV92Z3B1LmgiCisK KyNpbmNsdWRlICJpbnRlbF9ndHQuaCIKKyNpbmNsdWRlICJnZW44X3BwZ3R0LmgiCisKK3N0YXRp YyB2b2lkIGdlbjhfcHBndHRfbm90aWZ5X3ZndChzdHJ1Y3QgaTkxNV9wcGd0dCAqcHBndHQsIGJv b2wgY3JlYXRlKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdj0gcHBndHQt PnZtLmk5MTU7CisJZW51bSB2Z3RfZzJ2X3R5cGUgbXNnOworCWludCBpOworCisJaWYgKGNyZWF0 ZSkKKwkJYXRvbWljX2luYyhweF91c2VkKHBwZ3R0LT5wZCkpOyAvKiBuZXZlciByZW1vdmUgKi8K KwllbHNlCisJCWF0b21pY19kZWMocHhfdXNlZChwcGd0dC0+cGQpKTsKKworCW11dGV4X2xvY2so JmRldl9wcml2LT52Z3B1LmxvY2spOworCisJaWYgKGk5MTVfdm1faXNfNGx2bCgmcHBndHQtPnZt KSkgeworCQljb25zdCB1NjQgZGFkZHIgPSBweF9kbWEocHBndHQtPnBkKTsKKworCQlJOTE1X1dS SVRFKHZndGlmX3JlZyhwZHBbMF0ubG8pLCBsb3dlcl8zMl9iaXRzKGRhZGRyKSk7CisJCUk5MTVf V1JJVEUodmd0aWZfcmVnKHBkcFswXS5oaSksIHVwcGVyXzMyX2JpdHMoZGFkZHIpKTsKKworCQlt c2cgPSAoY3JlYXRlID8gVkdUX0cyVl9QUEdUVF9MNF9QQUdFX1RBQkxFX0NSRUFURSA6CisJCQkJ VkdUX0cyVl9QUEdUVF9MNF9QQUdFX1RBQkxFX0RFU1RST1kpOworCX0gZWxzZSB7CisJCWZvciAo aSA9IDA7IGkgPCBHRU44XzNMVkxfUERQRVM7IGkrKykgeworCQkJY29uc3QgdTY0IGRhZGRyID0g aTkxNV9wYWdlX2Rpcl9kbWFfYWRkcihwcGd0dCwgaSk7CisKKwkJCUk5MTVfV1JJVEUodmd0aWZf cmVnKHBkcFtpXS5sbyksIGxvd2VyXzMyX2JpdHMoZGFkZHIpKTsKKwkJCUk5MTVfV1JJVEUodmd0 aWZfcmVnKHBkcFtpXS5oaSksIHVwcGVyXzMyX2JpdHMoZGFkZHIpKTsKKwkJfQorCisJCW1zZyA9 IChjcmVhdGUgPyBWR1RfRzJWX1BQR1RUX0wzX1BBR0VfVEFCTEVfQ1JFQVRFIDoKKwkJCQlWR1Rf RzJWX1BQR1RUX0wzX1BBR0VfVEFCTEVfREVTVFJPWSk7CisJfQorCisJLyogZzJ2X25vdGlmeSBh dG9taWNhbGx5ICh2aWEgaHYgdHJhcCkgY29uc3VtZXMgdGhlIG1lc3NhZ2UgcGFja2V0LiAqLwor CUk5MTVfV1JJVEUodmd0aWZfcmVnKGcydl9ub3RpZnkpLCBtc2cpOworCisJbXV0ZXhfdW5sb2Nr KCZkZXZfcHJpdi0+dmdwdS5sb2NrKTsKK30KKworLyogSW5kZXggc2hpZnRzIGludG8gdGhlIHBh Z2V0YWJsZSBhcmUgb2Zmc2V0IGJ5IEdFTjhfUFRFX1NISUZUIFsxMl0gKi8KKyNkZWZpbmUgR0VO OF9QQUdFX1NJWkUgKFNaXzRLKSAvKiBwYWdlIGFuZCBwYWdlLWRpcmVjdG9yeSBzaXplcyBhcmUg dGhlIHNhbWUgKi8KKyNkZWZpbmUgR0VOOF9QVEVfU0hJRlQgKGlsb2cyKEdFTjhfUEFHRV9TSVpF KSkKKyNkZWZpbmUgR0VOOF9QREVTIChHRU44X1BBR0VfU0laRSAvIHNpemVvZih1NjQpKQorI2Rl ZmluZSBnZW44X3BkX3NoaWZ0KGx2bCkgKChsdmwpICogaWxvZzIoR0VOOF9QREVTKSkKKyNkZWZp bmUgZ2VuOF9wZF9pbmRleChpLCBsdmwpIGk5MTVfcGRlX2luZGV4KChpKSwgZ2VuOF9wZF9zaGlm dChsdmwpKQorI2RlZmluZSBfX2dlbjhfcHRlX3NoaWZ0KGx2bCkgKEdFTjhfUFRFX1NISUZUICsg Z2VuOF9wZF9zaGlmdChsdmwpKQorI2RlZmluZSBfX2dlbjhfcHRlX2luZGV4KGEsIGx2bCkgaTkx NV9wZGVfaW5kZXgoKGEpLCBfX2dlbjhfcHRlX3NoaWZ0KGx2bCkpCisKKyNkZWZpbmUgYXNfcGQo eCkgY29udGFpbmVyX29mKCh4KSwgdHlwZW9mKHN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5KSwg cHQpCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitnZW44X3BkX3JhbmdlKHU2NCBzdGFy dCwgdTY0IGVuZCwgaW50IGx2bCwgdW5zaWduZWQgaW50ICppZHgpCit7CisJY29uc3QgaW50IHNo aWZ0ID0gZ2VuOF9wZF9zaGlmdChsdmwpOworCWNvbnN0IHU2NCBtYXNrID0gfjB1bGwgPDwgZ2Vu OF9wZF9zaGlmdChsdmwgKyAxKTsKKworCUdFTV9CVUdfT04oc3RhcnQgPj0gZW5kKTsKKwllbmQg Kz0gfm1hc2sgPj4gZ2VuOF9wZF9zaGlmdCgxKTsKKworCSppZHggPSBpOTE1X3BkZV9pbmRleChz dGFydCwgc2hpZnQpOworCWlmICgoc3RhcnQgXiBlbmQpICYgbWFzaykKKwkJcmV0dXJuIEdFTjhf UERFUyAtICppZHg7CisJZWxzZQorCQlyZXR1cm4gaTkxNV9wZGVfaW5kZXgoZW5kLCBzaGlmdCkg LSAqaWR4OworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgZ2VuOF9wZF9jb250YWlucyh1NjQgc3Rh cnQsIHU2NCBlbmQsIGludCBsdmwpCit7CisJY29uc3QgdTY0IG1hc2sgPSB+MHVsbCA8PCBnZW44 X3BkX3NoaWZ0KGx2bCArIDEpOworCisJR0VNX0JVR19PTihzdGFydCA+PSBlbmQpOworCXJldHVy biAoc3RhcnQgXiBlbmQpICYgbWFzayAmJiAoc3RhcnQgJiB+bWFzaykgPT0gMDsKK30KKworc3Rh dGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2VuOF9wdF9jb3VudCh1NjQgc3RhcnQsIHU2NCBlbmQp Cit7CisJR0VNX0JVR19PTihzdGFydCA+PSBlbmQpOworCWlmICgoc3RhcnQgXiBlbmQpID4+IGdl bjhfcGRfc2hpZnQoMSkpCisJCXJldHVybiBHRU44X1BERVMgLSAoc3RhcnQgJiAoR0VOOF9QREVT IC0gMSkpOworCWVsc2UKKwkJcmV0dXJuIGVuZCAtIHN0YXJ0OworfQorCitzdGF0aWMgaW5saW5l IHVuc2lnbmVkIGludCBnZW44X3BkX3RvcF9jb3VudChjb25zdCBzdHJ1Y3QgaTkxNV9hZGRyZXNz X3NwYWNlICp2bSkKK3sKKwl1bnNpZ25lZCBpbnQgc2hpZnQgPSBfX2dlbjhfcHRlX3NoaWZ0KHZt LT50b3ApOworCXJldHVybiAodm0tPnRvdGFsICsgKDF1bGwgPDwgc2hpZnQpIC0gMSkgPj4gc2hp ZnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKgorZ2Vu OF9wZHBfZm9yX3BhZ2VfaW5kZXgoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqIGNvbnN0IHZt LCBjb25zdCB1NjQgaWR4KQoreworCXN0cnVjdCBpOTE1X3BwZ3R0ICogY29uc3QgcHBndHQgPSBp OTE1X3ZtX3RvX3BwZ3R0KHZtKTsKKworCWlmICh2bS0+dG9wID09IDIpCisJCXJldHVybiBwcGd0 dC0+cGQ7CisJZWxzZQorCQlyZXR1cm4gaTkxNV9wZF9lbnRyeShwcGd0dC0+cGQsIGdlbjhfcGRf aW5kZXgoaWR4LCB2bS0+dG9wKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGk5MTVfcGFn ZV9kaXJlY3RvcnkgKgorZ2VuOF9wZHBfZm9yX3BhZ2VfYWRkcmVzcyhzdHJ1Y3QgaTkxNV9hZGRy ZXNzX3NwYWNlICogY29uc3Qgdm0sIGNvbnN0IHU2NCBhZGRyKQoreworCXJldHVybiBnZW44X3Bk cF9mb3JfcGFnZV9pbmRleCh2bSwgYWRkciA+PiBHRU44X1BURV9TSElGVCk7Cit9CisKK3N0YXRp YyB2b2lkIF9fZ2VuOF9wcGd0dF9jbGVhbnVwKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZt LAorCQkJCSBzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqcGQsCisJCQkJIGludCBjb3VudCwg aW50IGx2bCkKK3sKKwlpZiAobHZsKSB7CisJCXZvaWQgKipwZGUgPSBwZC0+ZW50cnk7CisKKwkJ ZG8geworCQkJaWYgKCEqcGRlKQorCQkJCWNvbnRpbnVlOworCisJCQlfX2dlbjhfcHBndHRfY2xl YW51cCh2bSwgKnBkZSwgR0VOOF9QREVTLCBsdmwgLSAxKTsKKwkJfSB3aGlsZSAocGRlKyssIC0t Y291bnQpOworCX0KKworCWZyZWVfcHgodm0sIHBkKTsKK30KKworc3RhdGljIHZvaWQgZ2VuOF9w cGd0dF9jbGVhbnVwKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKQoreworCXN0cnVjdCBp OTE1X3BwZ3R0ICpwcGd0dCA9IGk5MTVfdm1fdG9fcHBndHQodm0pOworCisJaWYgKGludGVsX3Zn cHVfYWN0aXZlKHZtLT5pOTE1KSkKKwkJZ2VuOF9wcGd0dF9ub3RpZnlfdmd0KHBwZ3R0LCBmYWxz ZSk7CisKKwlfX2dlbjhfcHBndHRfY2xlYW51cCh2bSwgcHBndHQtPnBkLCBnZW44X3BkX3RvcF9j b3VudCh2bSksIHZtLT50b3ApOworCWZyZWVfc2NyYXRjaCh2bSk7Cit9CisKK3N0YXRpYyB1NjQg X19nZW44X3BwZ3R0X2NsZWFyKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKiBjb25zdCB2bSwK KwkJCSAgICAgIHN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICogY29uc3QgcGQsCisJCQkgICAg ICB1NjQgc3RhcnQsIGNvbnN0IHU2NCBlbmQsIGludCBsdmwpCit7CisJY29uc3Qgc3RydWN0IGk5 MTVfcGFnZV9zY3JhdGNoICogY29uc3Qgc2NyYXRjaCA9ICZ2bS0+c2NyYXRjaFtsdmxdOworCXVu c2lnbmVkIGludCBpZHgsIGxlbjsKKworCUdFTV9CVUdfT04oZW5kID4gdm0tPnRvdGFsID4+IEdF TjhfUFRFX1NISUZUKTsKKworCWxlbiA9IGdlbjhfcGRfcmFuZ2Uoc3RhcnQsIGVuZCwgbHZsLS0s ICZpZHgpOworCURCRygiJXMoJXApOnsgbHZsOiVkLCBzdGFydDolbGx4LCBlbmQ6JWxseCwgaWR4 OiVkLCBsZW46JWQsIHVzZWQ6JWQgfVxuIiwKKwkgICAgX19mdW5jX18sIHZtLCBsdmwgKyAxLCBz dGFydCwgZW5kLAorCSAgICBpZHgsIGxlbiwgYXRvbWljX3JlYWQocHhfdXNlZChwZCkpKTsKKwlH RU1fQlVHX09OKCFsZW4gfHwgbGVuID49IGF0b21pY19yZWFkKHB4X3VzZWQocGQpKSk7CisKKwlk byB7CisJCXN0cnVjdCBpOTE1X3BhZ2VfdGFibGUgKnB0ID0gcGQtPmVudHJ5W2lkeF07CisKKwkJ aWYgKGF0b21pY19mZXRjaF9pbmMoJnB0LT51c2VkKSA+PiBnZW44X3BkX3NoaWZ0KDEpICYmCisJ CSAgICBnZW44X3BkX2NvbnRhaW5zKHN0YXJ0LCBlbmQsIGx2bCkpIHsKKwkJCURCRygiJXMoJXAp OnsgbHZsOiVkLCBpZHg6JWQsIHN0YXJ0OiVsbHgsIGVuZDolbGx4IH0gcmVtb3ZpbmcgcGRcbiIs CisJCQkgICAgX19mdW5jX18sIHZtLCBsdmwgKyAxLCBpZHgsIHN0YXJ0LCBlbmQpOworCQkJY2xl YXJfcGRfZW50cnkocGQsIGlkeCwgc2NyYXRjaCk7CisJCQlfX2dlbjhfcHBndHRfY2xlYW51cCh2 bSwgYXNfcGQocHQpLCBJOTE1X1BERVMsIGx2bCk7CisJCQlzdGFydCArPSAodTY0KUk5MTVfUERF UyA8PCBnZW44X3BkX3NoaWZ0KGx2bCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChsdmwp IHsKKwkJCXN0YXJ0ID0gX19nZW44X3BwZ3R0X2NsZWFyKHZtLCBhc19wZChwdCksCisJCQkJCQkg ICBzdGFydCwgZW5kLCBsdmwpOworCQl9IGVsc2UgeworCQkJdW5zaWduZWQgaW50IGNvdW50Owor CQkJdTY0ICp2YWRkcjsKKworCQkJY291bnQgPSBnZW44X3B0X2NvdW50KHN0YXJ0LCBlbmQpOwor CQkJREJHKCIlcyglcCk6eyBsdmw6JWQsIHN0YXJ0OiVsbHgsIGVuZDolbGx4LCBpZHg6JWQsIGxl bjolZCwgdXNlZDolZCB9IHJlbW92aW5nIHB0ZVxuIiwKKwkJCSAgICBfX2Z1bmNfXywgdm0sIGx2 bCwgc3RhcnQsIGVuZCwKKwkJCSAgICBnZW44X3BkX2luZGV4KHN0YXJ0LCAwKSwgY291bnQsCisJ CQkgICAgYXRvbWljX3JlYWQoJnB0LT51c2VkKSk7CisJCQlHRU1fQlVHX09OKCFjb3VudCB8fCBj b3VudCA+PSBhdG9taWNfcmVhZCgmcHQtPnVzZWQpKTsKKworCQkJdmFkZHIgPSBrbWFwX2F0b21p Y19weChwdCk7CisJCQltZW1zZXQ2NCh2YWRkciArIGdlbjhfcGRfaW5kZXgoc3RhcnQsIDApLAor CQkJCSB2bS0+c2NyYXRjaFswXS5lbmNvZGUsCisJCQkJIGNvdW50KTsKKwkJCWt1bm1hcF9hdG9t aWModmFkZHIpOworCisJCQlhdG9taWNfc3ViKGNvdW50LCAmcHQtPnVzZWQpOworCQkJc3RhcnQg Kz0gY291bnQ7CisJCX0KKworCQlpZiAocmVsZWFzZV9wZF9lbnRyeShwZCwgaWR4LCBwdCwgc2Ny YXRjaCkpCisJCQlmcmVlX3B4KHZtLCBwdCk7CisJfSB3aGlsZSAoaWR4KyssIC0tbGVuKTsKKwor CXJldHVybiBzdGFydDsKK30KKworc3RhdGljIHZvaWQgZ2VuOF9wcGd0dF9jbGVhcihzdHJ1Y3Qg aTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKKwkJCSAgICAgdTY0IHN0YXJ0LCB1NjQgbGVuZ3RoKQor eworCUdFTV9CVUdfT04oIUlTX0FMSUdORUQoc3RhcnQsIEJJVF9VTEwoR0VOOF9QVEVfU0hJRlQp KSk7CisJR0VNX0JVR19PTighSVNfQUxJR05FRChsZW5ndGgsIEJJVF9VTEwoR0VOOF9QVEVfU0hJ RlQpKSk7CisJR0VNX0JVR19PTihyYW5nZV9vdmVyZmxvd3Moc3RhcnQsIGxlbmd0aCwgdm0tPnRv dGFsKSk7CisKKwlzdGFydCA+Pj0gR0VOOF9QVEVfU0hJRlQ7CisJbGVuZ3RoID4+PSBHRU44X1BU RV9TSElGVDsKKwlHRU1fQlVHX09OKGxlbmd0aCA9PSAwKTsKKworCV9fZ2VuOF9wcGd0dF9jbGVh cih2bSwgaTkxNV92bV90b19wcGd0dCh2bSktPnBkLAorCQkJICAgc3RhcnQsIHN0YXJ0ICsgbGVu Z3RoLCB2bS0+dG9wKTsKK30KKworc3RhdGljIGludCBfX2dlbjhfcHBndHRfYWxsb2Moc3RydWN0 IGk5MTVfYWRkcmVzc19zcGFjZSAqIGNvbnN0IHZtLAorCQkJICAgICAgc3RydWN0IGk5MTVfcGFn ZV9kaXJlY3RvcnkgKiBjb25zdCBwZCwKKwkJCSAgICAgIHU2NCAqIGNvbnN0IHN0YXJ0LCBjb25z dCB1NjQgZW5kLCBpbnQgbHZsKQoreworCWNvbnN0IHN0cnVjdCBpOTE1X3BhZ2Vfc2NyYXRjaCAq IGNvbnN0IHNjcmF0Y2ggPSAmdm0tPnNjcmF0Y2hbbHZsXTsKKwlzdHJ1Y3QgaTkxNV9wYWdlX3Rh YmxlICphbGxvYyA9IE5VTEw7CisJdW5zaWduZWQgaW50IGlkeCwgbGVuOworCWludCByZXQgPSAw OworCisJR0VNX0JVR19PTihlbmQgPiB2bS0+dG90YWwgPj4gR0VOOF9QVEVfU0hJRlQpOworCisJ bGVuID0gZ2VuOF9wZF9yYW5nZSgqc3RhcnQsIGVuZCwgbHZsLS0sICZpZHgpOworCURCRygiJXMo JXApOnsgbHZsOiVkLCBzdGFydDolbGx4LCBlbmQ6JWxseCwgaWR4OiVkLCBsZW46JWQsIHVzZWQ6 JWQgfVxuIiwKKwkgICAgX19mdW5jX18sIHZtLCBsdmwgKyAxLCAqc3RhcnQsIGVuZCwKKwkgICAg aWR4LCBsZW4sIGF0b21pY19yZWFkKHB4X3VzZWQocGQpKSk7CisJR0VNX0JVR19PTighbGVuIHx8 IChpZHggKyBsZW4gLSAxKSA+PiBnZW44X3BkX3NoaWZ0KDEpKTsKKworCXNwaW5fbG9jaygmcGQt PmxvY2spOworCUdFTV9CVUdfT04oIWF0b21pY19yZWFkKHB4X3VzZWQocGQpKSk7IC8qIE11c3Qg YmUgcGlubmVkISAqLworCWRvIHsKKwkJc3RydWN0IGk5MTVfcGFnZV90YWJsZSAqcHQgPSBwZC0+ ZW50cnlbaWR4XTsKKworCQlpZiAoIXB0KSB7CisJCQlzcGluX3VubG9jaygmcGQtPmxvY2spOwor CisJCQlEQkcoIiVzKCVwKTp7IGx2bDolZCwgaWR4OiVkIH0gYWxsb2NhdGluZyBuZXcgdHJlZVxu IiwKKwkJCSAgICBfX2Z1bmNfXywgdm0sIGx2bCArIDEsIGlkeCk7CisKKwkJCXB0ID0gZmV0Y2hf YW5kX3plcm8oJmFsbG9jKTsKKwkJCWlmIChsdmwpIHsKKwkJCQlpZiAoIXB0KSB7CisJCQkJCXB0 ID0gJmFsbG9jX3BkKHZtKS0+cHQ7CisJCQkJCWlmIChJU19FUlIocHQpKSB7CisJCQkJCQlyZXQg PSBQVFJfRVJSKHB0KTsKKwkJCQkJCWdvdG8gb3V0OworCQkJCQl9CisJCQkJfQorCisJCQkJZmls bF9weChwdCwgdm0tPnNjcmF0Y2hbbHZsXS5lbmNvZGUpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAo IXB0KSB7CisJCQkJCXB0ID0gYWxsb2NfcHQodm0pOworCQkJCQlpZiAoSVNfRVJSKHB0KSkgewor CQkJCQkJcmV0ID0gUFRSX0VSUihwdCk7CisJCQkJCQlnb3RvIG91dDsKKwkJCQkJfQorCQkJCX0K KworCQkJCWlmIChpbnRlbF92Z3B1X2FjdGl2ZSh2bS0+aTkxNSkgfHwKKwkJCQkgICAgZ2VuOF9w dF9jb3VudCgqc3RhcnQsIGVuZCkgPCBJOTE1X1BERVMpCisJCQkJCWZpbGxfcHgocHQsIHZtLT5z Y3JhdGNoW2x2bF0uZW5jb2RlKTsKKwkJCX0KKworCQkJc3Bpbl9sb2NrKCZwZC0+bG9jayk7CisJ CQlpZiAobGlrZWx5KCFwZC0+ZW50cnlbaWR4XSkpCisJCQkJc2V0X3BkX2VudHJ5KHBkLCBpZHgs IHB0KTsKKwkJCWVsc2UKKwkJCQlhbGxvYyA9IHB0LCBwdCA9IHBkLT5lbnRyeVtpZHhdOworCQl9 CisKKwkJaWYgKGx2bCkgeworCQkJYXRvbWljX2luYygmcHQtPnVzZWQpOworCQkJc3Bpbl91bmxv Y2soJnBkLT5sb2NrKTsKKworCQkJcmV0ID0gX19nZW44X3BwZ3R0X2FsbG9jKHZtLCBhc19wZChw dCksCisJCQkJCQkgc3RhcnQsIGVuZCwgbHZsKTsKKwkJCWlmICh1bmxpa2VseShyZXQpKSB7CisJ CQkJaWYgKHJlbGVhc2VfcGRfZW50cnkocGQsIGlkeCwgcHQsIHNjcmF0Y2gpKQorCQkJCQlmcmVl X3B4KHZtLCBwdCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCXNwaW5fbG9jaygmcGQtPmxv Y2spOworCQkJYXRvbWljX2RlYygmcHQtPnVzZWQpOworCQkJR0VNX0JVR19PTighYXRvbWljX3Jl YWQoJnB0LT51c2VkKSk7CisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBpbnQgY291bnQgPSBnZW44 X3B0X2NvdW50KCpzdGFydCwgZW5kKTsKKworCQkJREJHKCIlcyglcCk6eyBsdmw6JWQsIHN0YXJ0 OiVsbHgsIGVuZDolbGx4LCBpZHg6JWQsIGxlbjolZCwgdXNlZDolZCB9IGluc2VydGluZyBwdGVc biIsCisJCQkgICAgX19mdW5jX18sIHZtLCBsdmwsICpzdGFydCwgZW5kLAorCQkJICAgIGdlbjhf cGRfaW5kZXgoKnN0YXJ0LCAwKSwgY291bnQsCisJCQkgICAgYXRvbWljX3JlYWQoJnB0LT51c2Vk KSk7CisKKwkJCWF0b21pY19hZGQoY291bnQsICZwdC0+dXNlZCk7CisJCQkvKiBBbGwgb3RoZXIg cGRlcyBtYXkgYmUgc2ltdWx0YW5lb3VzbHkgcmVtb3ZlZCAqLworCQkJR0VNX0JVR19PTihhdG9t aWNfcmVhZCgmcHQtPnVzZWQpID4gTkFMTE9DICogSTkxNV9QREVTKTsKKwkJCSpzdGFydCArPSBj b3VudDsKKwkJfQorCX0gd2hpbGUgKGlkeCsrLCAtLWxlbik7CisJc3Bpbl91bmxvY2soJnBkLT5s b2NrKTsKK291dDoKKwlpZiAoYWxsb2MpCisJCWZyZWVfcHgodm0sIGFsbG9jKTsKKwlyZXR1cm4g cmV0OworfQorCitzdGF0aWMgaW50IGdlbjhfcHBndHRfYWxsb2Moc3RydWN0IGk5MTVfYWRkcmVz c19zcGFjZSAqdm0sCisJCQkgICAgdTY0IHN0YXJ0LCB1NjQgbGVuZ3RoKQoreworCXU2NCBmcm9t OworCWludCBlcnI7CisKKwlHRU1fQlVHX09OKCFJU19BTElHTkVEKHN0YXJ0LCBCSVRfVUxMKEdF TjhfUFRFX1NISUZUKSkpOworCUdFTV9CVUdfT04oIUlTX0FMSUdORUQobGVuZ3RoLCBCSVRfVUxM KEdFTjhfUFRFX1NISUZUKSkpOworCUdFTV9CVUdfT04ocmFuZ2Vfb3ZlcmZsb3dzKHN0YXJ0LCBs ZW5ndGgsIHZtLT50b3RhbCkpOworCisJc3RhcnQgPj49IEdFTjhfUFRFX1NISUZUOworCWxlbmd0 aCA+Pj0gR0VOOF9QVEVfU0hJRlQ7CisJR0VNX0JVR19PTihsZW5ndGggPT0gMCk7CisJZnJvbSA9 IHN0YXJ0OworCisJZXJyID0gX19nZW44X3BwZ3R0X2FsbG9jKHZtLCBpOTE1X3ZtX3RvX3BwZ3R0 KHZtKS0+cGQsCisJCQkJICZzdGFydCwgc3RhcnQgKyBsZW5ndGgsIHZtLT50b3ApOworCWlmICh1 bmxpa2VseShlcnIgJiYgZnJvbSAhPSBzdGFydCkpCisJCV9fZ2VuOF9wcGd0dF9jbGVhcih2bSwg aTkxNV92bV90b19wcGd0dCh2bSktPnBkLAorCQkJCSAgIGZyb20sIHN0YXJ0LCB2bS0+dG9wKTsK KworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdTY0CitnZW44X3Bw Z3R0X2luc2VydF9wdGUoc3RydWN0IGk5MTVfcHBndHQgKnBwZ3R0LAorCQkgICAgICBzdHJ1Y3Qg aTkxNV9wYWdlX2RpcmVjdG9yeSAqcGRwLAorCQkgICAgICBzdHJ1Y3Qgc2d0X2RtYSAqaXRlciwK KwkJICAgICAgdTY0IGlkeCwKKwkJICAgICAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGNhY2hlX2xl dmVsLAorCQkgICAgICB1MzIgZmxhZ3MpCit7CisJc3RydWN0IGk5MTVfcGFnZV9kaXJlY3Rvcnkg KnBkOworCWNvbnN0IGdlbjhfcHRlX3QgcHRlX2VuY29kZSA9IGdlbjhfcHRlX2VuY29kZSgwLCBj YWNoZV9sZXZlbCwgZmxhZ3MpOworCWdlbjhfcHRlX3QgKnZhZGRyOworCisJcGQgPSBpOTE1X3Bk X2VudHJ5KHBkcCwgZ2VuOF9wZF9pbmRleChpZHgsIDIpKTsKKwl2YWRkciA9IGttYXBfYXRvbWlj X3B4KGk5MTVfcHRfZW50cnkocGQsIGdlbjhfcGRfaW5kZXgoaWR4LCAxKSkpOworCWRvIHsKKwkJ dmFkZHJbZ2VuOF9wZF9pbmRleChpZHgsIDApXSA9IHB0ZV9lbmNvZGUgfCBpdGVyLT5kbWE7CisK KwkJaXRlci0+ZG1hICs9IEk5MTVfR1RUX1BBR0VfU0laRTsKKwkJaWYgKGl0ZXItPmRtYSA+PSBp dGVyLT5tYXgpIHsKKwkJCWl0ZXItPnNnID0gX19zZ19uZXh0KGl0ZXItPnNnKTsKKwkJCWlmICgh aXRlci0+c2cpIHsKKwkJCQlpZHggPSAwOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpdGVyLT5k bWEgPSBzZ19kbWFfYWRkcmVzcyhpdGVyLT5zZyk7CisJCQlpdGVyLT5tYXggPSBpdGVyLT5kbWEg KyBpdGVyLT5zZy0+bGVuZ3RoOworCQl9CisKKwkJaWYgKGdlbjhfcGRfaW5kZXgoKytpZHgsIDAp ID09IDApIHsKKwkJCWlmIChnZW44X3BkX2luZGV4KGlkeCwgMSkgPT0gMCkgeworCQkJCS8qIExp bWl0ZWQgYnkgc2cgbGVuZ3RoIGZvciAzbHZsICovCisJCQkJaWYgKGdlbjhfcGRfaW5kZXgoaWR4 LCAyKSA9PSAwKQorCQkJCQlicmVhazsKKworCQkJCXBkID0gcGRwLT5lbnRyeVtnZW44X3BkX2lu ZGV4KGlkeCwgMildOworCQkJfQorCisJCQlrdW5tYXBfYXRvbWljKHZhZGRyKTsKKwkJCXZhZGRy ID0ga21hcF9hdG9taWNfcHgoaTkxNV9wdF9lbnRyeShwZCwgZ2VuOF9wZF9pbmRleChpZHgsIDEp KSk7CisJCX0KKwl9IHdoaWxlICgxKTsKKwlrdW5tYXBfYXRvbWljKHZhZGRyKTsKKworCXJldHVy biBpZHg7Cit9CisKK3N0YXRpYyB2b2lkIGdlbjhfcHBndHRfaW5zZXJ0X2h1Z2Uoc3RydWN0IGk5 MTVfdm1hICp2bWEsCisJCQkJICAgc3RydWN0IHNndF9kbWEgKml0ZXIsCisJCQkJICAgZW51bSBp OTE1X2NhY2hlX2xldmVsIGNhY2hlX2xldmVsLAorCQkJCSAgIHUzMiBmbGFncykKK3sKKwljb25z dCBnZW44X3B0ZV90IHB0ZV9lbmNvZGUgPSBnZW44X3B0ZV9lbmNvZGUoMCwgY2FjaGVfbGV2ZWws IGZsYWdzKTsKKwl1NjQgc3RhcnQgPSB2bWEtPm5vZGUuc3RhcnQ7CisJZG1hX2FkZHJfdCByZW0g PSBpdGVyLT5zZy0+bGVuZ3RoOworCisJR0VNX0JVR19PTighaTkxNV92bV9pc180bHZsKHZtYS0+ dm0pKTsKKworCWRvIHsKKwkJc3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKiBjb25zdCBwZHAg PQorCQkJZ2VuOF9wZHBfZm9yX3BhZ2VfYWRkcmVzcyh2bWEtPnZtLCBzdGFydCk7CisJCXN0cnVj dCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICogY29uc3QgcGQgPQorCQkJaTkxNV9wZF9lbnRyeShwZHAs IF9fZ2VuOF9wdGVfaW5kZXgoc3RhcnQsIDIpKTsKKwkJZ2VuOF9wdGVfdCBlbmNvZGUgPSBwdGVf ZW5jb2RlOworCQl1bnNpZ25lZCBpbnQgbWF5YmVfNjRLID0gLTE7CisJCXVuc2lnbmVkIGludCBw YWdlX3NpemU7CisJCWdlbjhfcHRlX3QgKnZhZGRyOworCQl1MTYgaW5kZXg7CisKKwkJaWYgKHZt YS0+cGFnZV9zaXplcy5zZyAmIEk5MTVfR1RUX1BBR0VfU0laRV8yTSAmJgorCQkgICAgSVNfQUxJ R05FRChpdGVyLT5kbWEsIEk5MTVfR1RUX1BBR0VfU0laRV8yTSkgJiYKKwkJICAgIHJlbSA+PSBJ OTE1X0dUVF9QQUdFX1NJWkVfMk0gJiYKKwkJICAgICFfX2dlbjhfcHRlX2luZGV4KHN0YXJ0LCAw KSkgeworCQkJaW5kZXggPSBfX2dlbjhfcHRlX2luZGV4KHN0YXJ0LCAxKTsKKwkJCWVuY29kZSB8 PSBHRU44X1BERV9QU18yTTsKKwkJCXBhZ2Vfc2l6ZSA9IEk5MTVfR1RUX1BBR0VfU0laRV8yTTsK KworCQkJdmFkZHIgPSBrbWFwX2F0b21pY19weChwZCk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qg aTkxNV9wYWdlX3RhYmxlICpwdCA9CisJCQkJaTkxNV9wdF9lbnRyeShwZCwgX19nZW44X3B0ZV9p bmRleChzdGFydCwgMSkpOworCisJCQlpbmRleCA9IF9fZ2VuOF9wdGVfaW5kZXgoc3RhcnQsIDAp OworCQkJcGFnZV9zaXplID0gSTkxNV9HVFRfUEFHRV9TSVpFOworCisJCQlpZiAoIWluZGV4ICYm CisJCQkgICAgdm1hLT5wYWdlX3NpemVzLnNnICYgSTkxNV9HVFRfUEFHRV9TSVpFXzY0SyAmJgor CQkJICAgIElTX0FMSUdORUQoaXRlci0+ZG1hLCBJOTE1X0dUVF9QQUdFX1NJWkVfNjRLKSAmJgor CQkJICAgIChJU19BTElHTkVEKHJlbSwgSTkxNV9HVFRfUEFHRV9TSVpFXzY0SykgfHwKKwkJCSAg ICAgcmVtID49IChJOTE1X1BERVMgLSBpbmRleCkgKiBJOTE1X0dUVF9QQUdFX1NJWkUpKQorCQkJ CW1heWJlXzY0SyA9IF9fZ2VuOF9wdGVfaW5kZXgoc3RhcnQsIDEpOworCisJCQl2YWRkciA9IGtt YXBfYXRvbWljX3B4KHB0KTsKKwkJfQorCisJCWRvIHsKKwkJCUdFTV9CVUdfT04oaXRlci0+c2ct Pmxlbmd0aCA8IHBhZ2Vfc2l6ZSk7CisJCQl2YWRkcltpbmRleCsrXSA9IGVuY29kZSB8IGl0ZXIt PmRtYTsKKworCQkJc3RhcnQgKz0gcGFnZV9zaXplOworCQkJaXRlci0+ZG1hICs9IHBhZ2Vfc2l6 ZTsKKwkJCXJlbSAtPSBwYWdlX3NpemU7CisJCQlpZiAoaXRlci0+ZG1hID49IGl0ZXItPm1heCkg eworCQkJCWl0ZXItPnNnID0gX19zZ19uZXh0KGl0ZXItPnNnKTsKKwkJCQlpZiAoIWl0ZXItPnNn KQorCQkJCQlicmVhazsKKworCQkJCXJlbSA9IGl0ZXItPnNnLT5sZW5ndGg7CisJCQkJaXRlci0+ ZG1hID0gc2dfZG1hX2FkZHJlc3MoaXRlci0+c2cpOworCQkJCWl0ZXItPm1heCA9IGl0ZXItPmRt YSArIHJlbTsKKworCQkJCWlmIChtYXliZV82NEsgIT0gLTEgJiYgaW5kZXggPCBJOTE1X1BERVMg JiYKKwkJCQkgICAgIShJU19BTElHTkVEKGl0ZXItPmRtYSwgSTkxNV9HVFRfUEFHRV9TSVpFXzY0 SykgJiYKKwkJCQkgICAgICAoSVNfQUxJR05FRChyZW0sIEk5MTVfR1RUX1BBR0VfU0laRV82NEsp IHx8CisJCQkJICAgICAgIHJlbSA+PSAoSTkxNV9QREVTIC0gaW5kZXgpICogSTkxNV9HVFRfUEFH RV9TSVpFKSkpCisJCQkJCW1heWJlXzY0SyA9IC0xOworCisJCQkJaWYgKHVubGlrZWx5KCFJU19B TElHTkVEKGl0ZXItPmRtYSwgcGFnZV9zaXplKSkpCisJCQkJCWJyZWFrOworCQkJfQorCQl9IHdo aWxlIChyZW0gPj0gcGFnZV9zaXplICYmIGluZGV4IDwgSTkxNV9QREVTKTsKKworCQlrdW5tYXBf YXRvbWljKHZhZGRyKTsKKworCQkvKgorCQkgKiBJcyBpdCBzYWZlIHRvIG1hcmsgdGhlIDJNIGJs b2NrIGFzIDY0Sz8gLS0gRWl0aGVyIHdlIGhhdmUKKwkJICogZmlsbGVkIHdob2xlIHBhZ2UtdGFi bGUgd2l0aCA2NEsgZW50cmllcywgb3IgZmlsbGVkIHBhcnQgb2YKKwkJICogaXQgYW5kIGhhdmUg cmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzZyB0YWJsZSBhbmQgd2UgaGF2ZQorCQkgKiBlbm91Z2gg cGFkZGluZy4KKwkJICovCisJCWlmIChtYXliZV82NEsgIT0gLTEgJiYKKwkJICAgIChpbmRleCA9 PSBJOTE1X1BERVMgfHwKKwkJICAgICAoaTkxNV92bV9oYXNfc2NyYXRjaF82NEsodm1hLT52bSkg JiYKKwkJICAgICAgIWl0ZXItPnNnICYmIElTX0FMSUdORUQodm1hLT5ub2RlLnN0YXJ0ICsKKwkJ CQkJICAgICAgdm1hLT5ub2RlLnNpemUsCisJCQkJCSAgICAgIEk5MTVfR1RUX1BBR0VfU0laRV8y TSkpKSkgeworCQkJdmFkZHIgPSBrbWFwX2F0b21pY19weChwZCk7CisJCQl2YWRkclttYXliZV82 NEtdIHw9IEdFTjhfUERFX0lQU182NEs7CisJCQlrdW5tYXBfYXRvbWljKHZhZGRyKTsKKwkJCXBh Z2Vfc2l6ZSA9IEk5MTVfR1RUX1BBR0VfU0laRV82NEs7CisKKwkJCS8qCisJCQkgKiBXZSB3cml0 ZSBhbGwgNEsgcGFnZSBlbnRyaWVzLCBldmVuIHdoZW4gdXNpbmcgNjRLCisJCQkgKiBwYWdlcy4g SW4gb3JkZXIgdG8gdmVyaWZ5IHRoYXQgdGhlIEhXIGlzbid0IGNoZWF0aW5nCisJCQkgKiBieSB1 c2luZyB0aGUgNEsgUFRFIGluc3RlYWQgb2YgdGhlIDY0SyBQVEUsIHdlIHdhbnQKKwkJCSAqIHRv IHJlbW92ZSBhbGwgdGhlIHN1cnBsdXMgZW50cmllcy4gSWYgdGhlIEhXIHNraXBwZWQKKwkJCSAq IHRoZSA2NEsgUFRFLCBpdCB3aWxsIHJlYWQvd3JpdGUgaW50byB0aGUgc2NyYXRjaCBwYWdlCisJ CQkgKiBpbnN0ZWFkIC0gd2hpY2ggd2UgZGV0ZWN0IGFzIG1pc3NpbmcgcmVzdWx0cyBkdXJpbmcK KwkJCSAqIHNlbGZ0ZXN0cy4KKwkJCSAqLworCQkJaWYgKEk5MTVfU0VMRlRFU1RfT05MWSh2bWEt PnZtLT5zY3J1Yl82NEspKSB7CisJCQkJdTE2IGk7CisKKwkJCQllbmNvZGUgPSB2bWEtPnZtLT5z Y3JhdGNoWzBdLmVuY29kZTsKKwkJCQl2YWRkciA9IGttYXBfYXRvbWljX3B4KGk5MTVfcHRfZW50 cnkocGQsIG1heWJlXzY0SykpOworCisJCQkJZm9yIChpID0gMTsgaSA8IGluZGV4OyBpICs9IDE2 KQorCQkJCQltZW1zZXQ2NCh2YWRkciArIGksIGVuY29kZSwgMTUpOworCisJCQkJa3VubWFwX2F0 b21pYyh2YWRkcik7CisJCQl9CisJCX0KKworCQl2bWEtPnBhZ2Vfc2l6ZXMuZ3R0IHw9IHBhZ2Vf c2l6ZTsKKwl9IHdoaWxlIChpdGVyLT5zZyk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbjhfcHBndHRf aW5zZXJ0KHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAorCQkJICAgICAgc3RydWN0IGk5 MTVfdm1hICp2bWEsCisJCQkgICAgICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgY2FjaGVfbGV2ZWws CisJCQkgICAgICB1MzIgZmxhZ3MpCit7CisJc3RydWN0IGk5MTVfcHBndHQgKiBjb25zdCBwcGd0 dCA9IGk5MTVfdm1fdG9fcHBndHQodm0pOworCXN0cnVjdCBzZ3RfZG1hIGl0ZXIgPSBzZ3RfZG1h KHZtYSk7CisKKwlpZiAodm1hLT5wYWdlX3NpemVzLnNnID4gSTkxNV9HVFRfUEFHRV9TSVpFKSB7 CisJCWdlbjhfcHBndHRfaW5zZXJ0X2h1Z2Uodm1hLCAmaXRlciwgY2FjaGVfbGV2ZWwsIGZsYWdz KTsKKwl9IGVsc2UgIHsKKwkJdTY0IGlkeCA9IHZtYS0+bm9kZS5zdGFydCA+PiBHRU44X1BURV9T SElGVDsKKworCQlkbyB7CisJCQlzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqIGNvbnN0IHBk cCA9CisJCQkJZ2VuOF9wZHBfZm9yX3BhZ2VfaW5kZXgodm0sIGlkeCk7CisKKwkJCWlkeCA9IGdl bjhfcHBndHRfaW5zZXJ0X3B0ZShwcGd0dCwgcGRwLCAmaXRlciwgaWR4LAorCQkJCQkJICAgIGNh Y2hlX2xldmVsLCBmbGFncyk7CisJCX0gd2hpbGUgKGlkeCk7CisKKwkJdm1hLT5wYWdlX3NpemVz Lmd0dCA9IEk5MTVfR1RUX1BBR0VfU0laRTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZ2VuOF9pbml0 X3NjcmF0Y2goc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pCit7CisJaW50IHJldDsKKwlp bnQgaTsKKworCS8qCisJICogSWYgZXZlcnlib2R5IGFncmVlcyB0byBub3QgdG8gd3JpdGUgaW50 byB0aGUgc2NyYXRjaCBwYWdlLAorCSAqIHdlIGNhbiByZXVzZSBpdCBmb3IgYWxsIHZtLCBrZWVw aW5nIGNvbnRleHRzIGFuZCBwcm9jZXNzZXMgc2VwYXJhdGUuCisJICovCisJaWYgKHZtLT5oYXNf cmVhZF9vbmx5ICYmIHZtLT5ndC0+dm0gJiYgIWk5MTVfaXNfZ2d0dCh2bS0+Z3QtPnZtKSkgewor CQlzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICpjbG9uZSA9IHZtLT5ndC0+dm07CisKKwkJR0VN X0JVR19PTighY2xvbmUtPmhhc19yZWFkX29ubHkpOworCisJCXZtLT5zY3JhdGNoX29yZGVyID0g Y2xvbmUtPnNjcmF0Y2hfb3JkZXI7CisJCW1lbWNweSh2bS0+c2NyYXRjaCwgY2xvbmUtPnNjcmF0 Y2gsIHNpemVvZih2bS0+c2NyYXRjaCkpOworCQlweF9kbWEoJnZtLT5zY3JhdGNoWzBdKSA9IDA7 IC8qIG5vIHhmZXIgb2Ygb3duZXJzaGlwICovCisJCXJldHVybiAwOworCX0KKworCXJldCA9IHNl dHVwX3NjcmF0Y2hfcGFnZSh2bSwgX19HRlBfSElHSE1FTSk7CisJaWYgKHJldCkKKwkJcmV0dXJu IHJldDsKKworCXZtLT5zY3JhdGNoWzBdLmVuY29kZSA9CisJCWdlbjhfcHRlX2VuY29kZShweF9k bWEoJnZtLT5zY3JhdGNoWzBdKSwKKwkJCQlJOTE1X0NBQ0hFX0xMQywgdm0tPmhhc19yZWFkX29u bHkpOworCisJZm9yIChpID0gMTsgaSA8PSB2bS0+dG9wOyBpKyspIHsKKwkJaWYgKHVubGlrZWx5 KHNldHVwX3BhZ2VfZG1hKHZtLCBweF9iYXNlKCZ2bS0+c2NyYXRjaFtpXSkpKSkKKwkJCWdvdG8g ZnJlZV9zY3JhdGNoOworCisJCWZpbGxfcHgoJnZtLT5zY3JhdGNoW2ldLCB2bS0+c2NyYXRjaFtp IC0gMV0uZW5jb2RlKTsKKwkJdm0tPnNjcmF0Y2hbaV0uZW5jb2RlID0KKwkJCWdlbjhfcGRlX2Vu Y29kZShweF9kbWEoJnZtLT5zY3JhdGNoW2ldKSwKKwkJCQkJSTkxNV9DQUNIRV9MTEMpOworCX0K KworCXJldHVybiAwOworCitmcmVlX3NjcmF0Y2g6CisJZnJlZV9zY3JhdGNoKHZtKTsKKwlyZXR1 cm4gLUVOT01FTTsKK30KKworc3RhdGljIGludCBnZW44X3ByZWFsbG9jYXRlX3RvcF9sZXZlbF9w ZHAoc3RydWN0IGk5MTVfcHBndHQgKnBwZ3R0KQoreworCXN0cnVjdCBpOTE1X2FkZHJlc3Nfc3Bh Y2UgKnZtID0gJnBwZ3R0LT52bTsKKwlzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqcGQgPSBw cGd0dC0+cGQ7CisJdW5zaWduZWQgaW50IGlkeDsKKworCUdFTV9CVUdfT04odm0tPnRvcCAhPSAy KTsKKwlHRU1fQlVHX09OKGdlbjhfcGRfdG9wX2NvdW50KHZtKSAhPSBHRU44XzNMVkxfUERQRVMp OworCisJZm9yIChpZHggPSAwOyBpZHggPCBHRU44XzNMVkxfUERQRVM7IGlkeCsrKSB7CisJCXN0 cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICpwZGU7CisKKwkJcGRlID0gYWxsb2NfcGQodm0pOwor CQlpZiAoSVNfRVJSKHBkZSkpCisJCQlyZXR1cm4gUFRSX0VSUihwZGUpOworCisJCWZpbGxfcHgo cGRlLCB2bS0+c2NyYXRjaFsxXS5lbmNvZGUpOworCQlzZXRfcGRfZW50cnkocGQsIGlkeCwgcGRl KTsKKwkJYXRvbWljX2luYyhweF91c2VkKHBkZSkpOyAvKiBrZWVwIHBpbm5lZCAqLworCX0KKwl3 bWIoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGk5MTVfcGFnZV9kaXJlY3Rv cnkgKgorZ2VuOF9hbGxvY190b3BfcGQoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pCit7 CisJY29uc3QgdW5zaWduZWQgaW50IGNvdW50ID0gZ2VuOF9wZF90b3BfY291bnQodm0pOworCXN0 cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICpwZDsKKworCUdFTV9CVUdfT04oY291bnQgPiBBUlJB WV9TSVpFKHBkLT5lbnRyeSkpOworCisJcGQgPSBfX2FsbG9jX3BkKG9mZnNldG9mKHR5cGVvZigq cGQpLCBlbnRyeVtjb3VudF0pKTsKKwlpZiAodW5saWtlbHkoIXBkKSkKKwkJcmV0dXJuIEVSUl9Q VFIoLUVOT01FTSk7CisKKwlpZiAodW5saWtlbHkoc2V0dXBfcGFnZV9kbWEodm0sIHB4X2Jhc2Uo cGQpKSkpIHsKKwkJa2ZyZWUocGQpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisK KwlmaWxsX3BhZ2VfZG1hKHB4X2Jhc2UocGQpLCB2bS0+c2NyYXRjaFt2bS0+dG9wXS5lbmNvZGUs IGNvdW50KTsKKwlhdG9taWNfaW5jKHB4X3VzZWQocGQpKTsgLyogbWFyayBhcyBwaW5uZWQgKi8K KwlyZXR1cm4gcGQ7Cit9CisKKy8qCisgKiBHRU44IGxlZ2FjeSBwcGd0dCBwcm9ncmFtbWluZyBp cyBhY2NvbXBsaXNoZWQgdGhyb3VnaCBhIG1heCA0IFBEUCByZWdpc3RlcnMKKyAqIHdpdGggYSBu ZXQgZWZmZWN0IHJlc2VtYmxpbmcgYSAyLWxldmVsIHBhZ2UgdGFibGUgaW4gbm9ybWFsIHg4NiB0 ZXJtcy4gRWFjaAorICogUERQIHJlcHJlc2VudHMgMUdCIG9mIG1lbW9yeSA0ICogNTEyICogNTEy ICogNDA5NiA9IDRHQiBsZWdhY3kgMzJiIGFkZHJlc3MKKyAqIHNwYWNlLgorICoKKyAqLworc3Ry dWN0IGk5MTVfcHBndHQgKmdlbjhfcHBndHRfY3JlYXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICppOTE1KQoreworCXN0cnVjdCBpOTE1X3BwZ3R0ICpwcGd0dDsKKwlpbnQgZXJyOworCisJcHBn dHQgPSBremFsbG9jKHNpemVvZigqcHBndHQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBwZ3R0KQor CQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXBwZ3R0X2luaXQocHBndHQsICZpOTE1LT5n dCk7CisJcHBndHQtPnZtLnRvcCA9IGk5MTVfdm1faXNfNGx2bCgmcHBndHQtPnZtKSA/IDMgOiAy OworCisJLyoKKwkgKiBGcm9tIGJkdywgdGhlcmUgaXMgaHcgc3VwcG9ydCBmb3IgcmVhZC1vbmx5 IHBhZ2VzIGluIHRoZSBQUEdUVC4KKwkgKgorCSAqIEdlbjExIGhhcyBIU0RFUyM6MTgwNzEzNjE4 NyB1bnJlc29sdmVkLiBEaXNhYmxlIHJvIHN1cHBvcnQKKwkgKiBmb3Igbm93LgorCSAqCisJICog R2VuMTIgaGFzIGluaGVyaXRlZCB0aGUgc2FtZSByZWFkLW9ubHkgZmF1bHQgaXNzdWUgZnJvbSBn ZW4xMS4KKwkgKi8KKwlwcGd0dC0+dm0uaGFzX3JlYWRfb25seSA9ICFJU19HRU5fUkFOR0UoaTkx NSwgMTEsIDEyKTsKKworCS8qIFRoZXJlIGFyZSBvbmx5IGZldyBleGNlcHRpb25zIGZvciBnZW4g Pj02LiBjaHYgYW5kIGJ4dC4KKwkgKiBBbmQgd2UgYXJlIG5vdCBzdXJlIGFib3V0IHRoZSBsYXR0 ZXIgc28gcGxheSBzYWZlIGZvciBub3cuCisJICovCisJaWYgKElTX0NIRVJSWVZJRVcoaTkxNSkg fHwgSVNfQlJPWFRPTihpOTE1KSkKKwkJcHBndHQtPnZtLnB0X2ttYXBfd2MgPSB0cnVlOworCisJ ZXJyID0gZ2VuOF9pbml0X3NjcmF0Y2goJnBwZ3R0LT52bSk7CisJaWYgKGVycikKKwkJZ290byBl cnJfZnJlZTsKKworCXBwZ3R0LT5wZCA9IGdlbjhfYWxsb2NfdG9wX3BkKCZwcGd0dC0+dm0pOwor CWlmIChJU19FUlIocHBndHQtPnBkKSkgeworCQllcnIgPSBQVFJfRVJSKHBwZ3R0LT5wZCk7CisJ CWdvdG8gZXJyX2ZyZWVfc2NyYXRjaDsKKwl9CisKKwlpZiAoIWk5MTVfdm1faXNfNGx2bCgmcHBn dHQtPnZtKSkgeworCQllcnIgPSBnZW44X3ByZWFsbG9jYXRlX3RvcF9sZXZlbF9wZHAocHBndHQp OworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfZnJlZV9wZDsKKwl9CisKKwlwcGd0dC0+dm0uYmlu ZF9hc3luY19mbGFncyA9IEk5MTVfVk1BX0xPQ0FMX0JJTkQ7CisJcHBndHQtPnZtLmluc2VydF9l bnRyaWVzID0gZ2VuOF9wcGd0dF9pbnNlcnQ7CisJcHBndHQtPnZtLmFsbG9jYXRlX3ZhX3Jhbmdl ID0gZ2VuOF9wcGd0dF9hbGxvYzsKKwlwcGd0dC0+dm0uY2xlYXJfcmFuZ2UgPSBnZW44X3BwZ3R0 X2NsZWFyOworCisJaWYgKGludGVsX3ZncHVfYWN0aXZlKGk5MTUpKQorCQlnZW44X3BwZ3R0X25v dGlmeV92Z3QocHBndHQsIHRydWUpOworCisJcHBndHQtPnZtLmNsZWFudXAgPSBnZW44X3BwZ3R0 X2NsZWFudXA7CisKKwlyZXR1cm4gcHBndHQ7CisKK2Vycl9mcmVlX3BkOgorCV9fZ2VuOF9wcGd0 dF9jbGVhbnVwKCZwcGd0dC0+dm0sIHBwZ3R0LT5wZCwKKwkJCSAgICAgZ2VuOF9wZF90b3BfY291 bnQoJnBwZ3R0LT52bSksIHBwZ3R0LT52bS50b3ApOworZXJyX2ZyZWVfc2NyYXRjaDoKKwlmcmVl X3NjcmF0Y2goJnBwZ3R0LT52bSk7CitlcnJfZnJlZToKKwlrZnJlZShwcGd0dCk7CisJcmV0dXJu IEVSUl9QVFIoZXJyKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2dl bjhfcHBndHQuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2dlbjhfcHBndHQuaApuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmJkYjBjNjg3YmZhOQotLS0gL2Rldi9u dWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2dlbjhfcHBndHQuaApAQCAtMCwwICsx LDEzIEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUICovCisvKgorICogQ29weXJp Z2h0IMKpIDIwMjAgSW50ZWwgQ29ycG9yYXRpb24KKyAqLworCisjaWZuZGVmIF9fR0VOOF9QUEdU VF9IX18KKyNkZWZpbmUgX19HRU44X1BQR1RUX0hfXworCitzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZTsKKworc3RydWN0IGk5MTVfcHBndHQgKmdlbjhfcHBndHRfY3JlYXRlKHN0cnVjdCBkcm1faTkx NV9wcml2YXRlICppOTE1KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0v aTkxNS9ndC9pbnRlbF9nZ3R0LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9nZ3R0 LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi44NDhiMzkzMTkzOGUK LS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9nZ3R0LmMK QEAgLTAsMCArMSwxNDAyIEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCisvKgor ICogQ29weXJpZ2h0IMKpIDIwMjAgSW50ZWwgQ29ycG9yYXRpb24KKyAqLworCisjaW5jbHVkZSA8 bGludXgvc3RvcF9tYWNoaW5lLmg+CisKKyNpbmNsdWRlIDxhc20vc2V0X21lbW9yeS5oPgorCisj aW5jbHVkZSAiaW50ZWxfZ3QuaCIKKyNpbmNsdWRlICJpOTE1X2Rydi5oIgorI2luY2x1ZGUgImk5 MTVfc2NhdHRlcmxpc3QuaCIKKyNpbmNsdWRlICJpOTE1X3ZncHUuaCIKKworI2luY2x1ZGUgImlu dGVsX2d0dC5oIgorCitzdGF0aWMgaW50CitpOTE1X2dldF9nZ3R0X3ZtYV9wYWdlcyhzdHJ1Y3Qg aTkxNV92bWEgKnZtYSk7CisKK3N0YXRpYyB2b2lkIGk5MTVfZ2d0dF9jb2xvcl9hZGp1c3QoY29u c3Qgc3RydWN0IGRybV9tbV9ub2RlICpub2RlLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgY29sb3Is CisJCQkJICAgdTY0ICpzdGFydCwKKwkJCQkgICB1NjQgKmVuZCkKK3sKKwlpZiAoaTkxNV9ub2Rl X2NvbG9yX2RpZmZlcnMobm9kZSwgY29sb3IpKQorCQkqc3RhcnQgKz0gSTkxNV9HVFRfUEFHRV9T SVpFOworCisJLyogQWxzbyBsZWF2ZSBhIHNwYWNlIGJldHdlZW4gdGhlIHVuYWxsb2NhdGVkIHJl c2VydmVkIG5vZGUgYWZ0ZXIgdGhlCisJICogR1RUIGFuZCBhbnkgb2JqZWN0cyB3aXRoaW4gdGhl IEdUVCwgaS5lLiB3ZSB1c2UgdGhlIGNvbG9yIGFkanVzdG1lbnQKKwkgKiB0byBpbnNlcnQgYSBn dWFyZCBwYWdlIHRvIHByZXZlbnQgcHJlZmV0Y2hlcyBjcm9zc2luZyBvdmVyIHRoZQorCSAqIEdU VCBib3VuZGFyeS4KKwkgKi8KKwlub2RlID0gbGlzdF9uZXh0X2VudHJ5KG5vZGUsIG5vZGVfbGlz dCk7CisJaWYgKG5vZGUtPmNvbG9yICE9IGNvbG9yKQorCQkqZW5kIC09IEk5MTVfR1RUX1BBR0Vf U0laRTsKK30KKworc3RhdGljIGludCBnZ3R0X2luaXRfaHcoc3RydWN0IGk5MTVfZ2d0dCAqZ2d0 dCkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGdndHQtPnZtLmk5MTU7CisK KwlpOTE1X2FkZHJlc3Nfc3BhY2VfaW5pdCgmZ2d0dC0+dm0sIFZNX0NMQVNTX0dHVFQpOworCisJ Z2d0dC0+dm0uaXNfZ2d0dCA9IHRydWU7CisKKwkvKiBPbmx5IFZMViBzdXBwb3J0cyByZWFkLW9u bHkgR0dUVCBtYXBwaW5ncyAqLworCWdndHQtPnZtLmhhc19yZWFkX29ubHkgPSBJU19WQUxMRVlW SUVXKGk5MTUpOworCisJaWYgKCFIQVNfTExDKGk5MTUpICYmICFIQVNfUFBHVFQoaTkxNSkpCisJ CWdndHQtPnZtLm1tLmNvbG9yX2FkanVzdCA9IGk5MTVfZ2d0dF9jb2xvcl9hZGp1c3Q7CisKKwlp ZiAoZ2d0dC0+bWFwcGFibGVfZW5kKSB7CisJCWlmICghaW9fbWFwcGluZ19pbml0X3djKCZnZ3R0 LT5pb21hcCwKKwkJCQkJZ2d0dC0+Z21hZHIuc3RhcnQsCisJCQkJCWdndHQtPm1hcHBhYmxlX2Vu ZCkpIHsKKwkJCWdndHQtPnZtLmNsZWFudXAoJmdndHQtPnZtKTsKKwkJCXJldHVybiAtRUlPOwor CQl9CisKKwkJZ2d0dC0+bXRyciA9IGFyY2hfcGh5c193Y19hZGQoZ2d0dC0+Z21hZHIuc3RhcnQs CisJCQkJCSAgICAgIGdndHQtPm1hcHBhYmxlX2VuZCk7CisJfQorCisJaTkxNV9nZ3R0X2luaXRf ZmVuY2VzKGdndHQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaTkxNV9nZ3R0X2luaXRf aHcgLSBJbml0aWFsaXplIEdHVFQgaGFyZHdhcmUKKyAqIEBpOTE1OiBpOTE1IGRldmljZQorICov CitpbnQgaTkxNV9nZ3R0X2luaXRfaHcoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUpCit7 CisJaW50IHJldDsKKworCXN0YXNoX2luaXQoJmk5MTUtPm1tLndjX3N0YXNoKTsKKworCS8qIE5v dGUgdGhhdCB3ZSB1c2UgcGFnZSBjb2xvdXJpbmcgdG8gZW5mb3JjZSBhIGd1YXJkIHBhZ2UgYXQg dGhlCisJICogZW5kIG9mIHRoZSBhZGRyZXNzIHNwYWNlLiBUaGlzIGlzIHJlcXVpcmVkIGFzIHRo ZSBDUyBtYXkgcHJlZmV0Y2gKKwkgKiBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgYmF0Y2ggYnVmZmVy LCBhY3Jvc3MgdGhlIHBhZ2UgYm91bmRhcnksCisJICogYW5kIGJleW9uZCB0aGUgZW5kIG9mIHRo ZSBHVFQgaWYgd2UgZG8gbm90IHByb3ZpZGUgYSBndWFyZC4KKwkgKi8KKwlyZXQgPSBnZ3R0X2lu aXRfaHcoJmk5MTUtPmdndHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4g MDsKK30KKworLyogQ2VydGFpbiBHZW41IGNoaXBzZXRzIHJlcXVpcmUgcmVxdWlyZSBpZGxpbmcg dGhlIEdQVSBiZWZvcmUKKyAqIHVubWFwcGluZyBhbnl0aGluZyBmcm9tIHRoZSBHVFQgd2hlbiBW VC1kIGlzIGVuYWJsZWQuCisgKi8KK3N0YXRpYyBib29sIG5lZWRzX2lkbGVfbWFwcyhzdHJ1Y3Qg ZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKK3sKKwkvKiBRdWVyeSBpbnRlbF9pb21tdSB0byBzZWUg aWYgd2UgbmVlZCB0aGUgd29ya2Fyb3VuZC4gUHJlc3VtYWJseSB0aGF0CisJICogd2FzIGxvYWRl ZCBmaXJzdC4KKwkgKi8KKwlyZXR1cm4gSVNfR0VOKGk5MTUsIDUpICYmIElTX01PQklMRShpOTE1 KSAmJiBpbnRlbF92dGRfYWN0aXZlKCk7Cit9CisKK3N0YXRpYyB2b2lkIGdndHRfc3VzcGVuZF9t YXBwaW5ncyhzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICppOTE1ID0gZ2d0dC0+dm0uaTkxNTsKKworCS8qIERvbid0IGJvdGhlciBtZXNzaW5nIHdp dGggZmF1bHRzIHByZSBHRU42IGFzIHdlIGhhdmUgbGl0dGxlCisJICogZG9jdW1lbnRhdGlvbiBz dXBwb3J0aW5nIHRoYXQgaXQncyBhIGdvb2QgaWRlYS4KKwkgKi8KKwlpZiAoSU5URUxfR0VOKGk5 MTUpIDwgNikKKwkJcmV0dXJuOworCisJaW50ZWxfZ3RfY2hlY2tfYW5kX2NsZWFyX2ZhdWx0cyhn Z3R0LT52bS5ndCk7CisKKwlnZ3R0LT52bS5jbGVhcl9yYW5nZSgmZ2d0dC0+dm0sIDAsIGdndHQt PnZtLnRvdGFsKTsKKworCWdndHQtPmludmFsaWRhdGUoZ2d0dCk7Cit9CisKK3ZvaWQgaTkxNV9n ZW1fc3VzcGVuZF9ndHRfbWFwcGluZ3Moc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUpCit7 CisJZ2d0dF9zdXNwZW5kX21hcHBpbmdzKCZpOTE1LT5nZ3R0KTsKK30KKwordm9pZCBnZW42X2dn dHRfaW52YWxpZGF0ZShzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0KQoreworCXN0cnVjdCBpbnRlbF91 bmNvcmUgKnVuY29yZSA9IGdndHQtPnZtLmd0LT51bmNvcmU7CisKKwlzcGluX2xvY2tfaXJxKCZ1 bmNvcmUtPmxvY2spOworCWludGVsX3VuY29yZV93cml0ZV9mdyh1bmNvcmUsIEdGWF9GTFNIX0NO VExfR0VONiwgR0ZYX0ZMU0hfQ05UTF9FTik7CisJaW50ZWxfdW5jb3JlX3JlYWRfZncodW5jb3Jl LCBHRlhfRkxTSF9DTlRMX0dFTjYpOworCXNwaW5fdW5sb2NrX2lycSgmdW5jb3JlLT5sb2NrKTsK K30KKworc3RhdGljIHZvaWQgZ2VuOF9nZ3R0X2ludmFsaWRhdGUoc3RydWN0IGk5MTVfZ2d0dCAq Z2d0dCkKK3sKKwlzdHJ1Y3QgaW50ZWxfdW5jb3JlICp1bmNvcmUgPSBnZ3R0LT52bS5ndC0+dW5j b3JlOworCisJLyoKKwkgKiBOb3RlIHRoYXQgYXMgYW4gdW5jYWNoZWQgbW1pbyB3cml0ZSwgdGhp cyB3aWxsIGZsdXNoIHRoZQorCSAqIFdDQiBvZiB0aGUgd3JpdGVzIGludG8gdGhlIEdHVFQgYmVm b3JlIGl0IHRyaWdnZXJzIHRoZSBpbnZhbGlkYXRlLgorCSAqLworCWludGVsX3VuY29yZV93cml0 ZV9mdyh1bmNvcmUsIEdGWF9GTFNIX0NOVExfR0VONiwgR0ZYX0ZMU0hfQ05UTF9FTik7Cit9CisK K3N0YXRpYyB2b2lkIGd1Y19nZ3R0X2ludmFsaWRhdGUoc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCkK K3sKKwlzdHJ1Y3QgaW50ZWxfdW5jb3JlICp1bmNvcmUgPSBnZ3R0LT52bS5ndC0+dW5jb3JlOwor CXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gZ2d0dC0+dm0uaTkxNTsKKworCWdlbjhf Z2d0dF9pbnZhbGlkYXRlKGdndHQpOworCisJaWYgKElOVEVMX0dFTihpOTE1KSA+PSAxMikKKwkJ aW50ZWxfdW5jb3JlX3dyaXRlX2Z3KHVuY29yZSwgR0VOMTJfR1VDX1RMQl9JTlZfQ1IsCisJCQkJ ICAgICAgR0VOMTJfR1VDX1RMQl9JTlZfQ1JfSU5WQUxJREFURSk7CisJZWxzZQorCQlpbnRlbF91 bmNvcmVfd3JpdGVfZncodW5jb3JlLCBHRU44X0dUQ1IsIEdFTjhfR1RDUl9JTlZBTElEQVRFKTsK K30KKworc3RhdGljIHZvaWQgZ21jaF9nZ3R0X2ludmFsaWRhdGUoc3RydWN0IGk5MTVfZ2d0dCAq Z2d0dCkKK3sKKwlpbnRlbF9ndHRfY2hpcHNldF9mbHVzaCgpOworfQorCitzdGF0aWMgdm9pZCBn ZW44X3NldF9wdGUodm9pZCBfX2lvbWVtICphZGRyLCBnZW44X3B0ZV90IHB0ZSkKK3sKKwl3cml0 ZXEocHRlLCBhZGRyKTsKK30KKworc3RhdGljIHZvaWQgZ2VuOF9nZ3R0X2luc2VydF9wYWdlKHN0 cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAorCQkJCSAgZG1hX2FkZHJfdCBhZGRyLAorCQkJ CSAgdTY0IG9mZnNldCwKKwkJCQkgIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBsZXZlbCwKKwkJCQkg IHUzMiB1bnVzZWQpCit7CisJc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCA9IGk5MTVfdm1fdG9fZ2d0 dCh2bSk7CisJZ2VuOF9wdGVfdCBfX2lvbWVtICpwdGUgPQorCQkoZ2VuOF9wdGVfdCBfX2lvbWVt ICopZ2d0dC0+Z3NtICsgb2Zmc2V0IC8gSTkxNV9HVFRfUEFHRV9TSVpFOworCisJZ2VuOF9zZXRf cHRlKHB0ZSwgZ2VuOF9wdGVfZW5jb2RlKGFkZHIsIGxldmVsLCAwKSk7CisKKwlnZ3R0LT5pbnZh bGlkYXRlKGdndHQpOworfQorCitzdGF0aWMgdm9pZCBnZW44X2dndHRfaW5zZXJ0X2VudHJpZXMo c3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCisJCQkJICAgICBzdHJ1Y3QgaTkxNV92bWEg KnZtYSwKKwkJCQkgICAgIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBsZXZlbCwKKwkJCQkgICAgIHUz MiBmbGFncykKK3sKKwlzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0ID0gaTkxNV92bV90b19nZ3R0KHZt KTsKKwlzdHJ1Y3Qgc2d0X2l0ZXIgc2d0X2l0ZXI7CisJZ2VuOF9wdGVfdCBfX2lvbWVtICpndHRf ZW50cmllczsKKwljb25zdCBnZW44X3B0ZV90IHB0ZV9lbmNvZGUgPSBnZW44X3B0ZV9lbmNvZGUo MCwgbGV2ZWwsIDApOworCWRtYV9hZGRyX3QgYWRkcjsKKworCS8qCisJICogTm90ZSB0aGF0IHdl IGlnbm9yZSBQVEVfUkVBRF9PTkxZIGhlcmUuIFRoZSBjYWxsZXIgbXVzdCBiZSBjYXJlZnVsCisJ ICogbm90IHRvIGFsbG93IHRoZSB1c2VyIHRvIG92ZXJyaWRlIGFjY2VzcyB0byBhIHJlYWQgb25s eSBwYWdlLgorCSAqLworCisJZ3R0X2VudHJpZXMgPSAoZ2VuOF9wdGVfdCBfX2lvbWVtICopZ2d0 dC0+Z3NtOworCWd0dF9lbnRyaWVzICs9IHZtYS0+bm9kZS5zdGFydCAvIEk5MTVfR1RUX1BBR0Vf U0laRTsKKwlmb3JfZWFjaF9zZ3RfZGFkZHIoYWRkciwgc2d0X2l0ZXIsIHZtYS0+cGFnZXMpCisJ CWdlbjhfc2V0X3B0ZShndHRfZW50cmllcysrLCBwdGVfZW5jb2RlIHwgYWRkcik7CisKKwkvKgor CSAqIFdlIHdhbnQgdG8gZmx1c2ggdGhlIFRMQnMgb25seSBhZnRlciB3ZSdyZSBjZXJ0YWluIGFs bCB0aGUgUFRFCisJICogdXBkYXRlcyBoYXZlIGZpbmlzaGVkLgorCSAqLworCWdndHQtPmludmFs aWRhdGUoZ2d0dCk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbjZfZ2d0dF9pbnNlcnRfcGFnZShzdHJ1 Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKKwkJCQkgIGRtYV9hZGRyX3QgYWRkciwKKwkJCQkg IHU2NCBvZmZzZXQsCisJCQkJICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgbGV2ZWwsCisJCQkJICB1 MzIgZmxhZ3MpCit7CisJc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCA9IGk5MTVfdm1fdG9fZ2d0dCh2 bSk7CisJZ2VuNl9wdGVfdCBfX2lvbWVtICpwdGUgPQorCQkoZ2VuNl9wdGVfdCBfX2lvbWVtICop Z2d0dC0+Z3NtICsgb2Zmc2V0IC8gSTkxNV9HVFRfUEFHRV9TSVpFOworCisJaW93cml0ZTMyKHZt LT5wdGVfZW5jb2RlKGFkZHIsIGxldmVsLCBmbGFncyksIHB0ZSk7CisKKwlnZ3R0LT5pbnZhbGlk YXRlKGdndHQpOworfQorCisvKgorICogQmluZHMgYW4gb2JqZWN0IGludG8gdGhlIGdsb2JhbCBn dHQgd2l0aCB0aGUgc3BlY2lmaWVkIGNhY2hlIGxldmVsLiBUaGUgb2JqZWN0CisgKiB3aWxsIGJl IGFjY2Vzc2libGUgdG8gdGhlIEdQVSB2aWEgY29tbWFuZHMgd2hvc2Ugb3BlcmFuZHMgcmVmZXJl bmNlIG9mZnNldHMKKyAqIHdpdGhpbiB0aGUgZ2xvYmFsIEdUVCBhcyB3ZWxsIGFzIGFjY2Vzc2li bGUgYnkgdGhlIEdQVSB0aHJvdWdoIHRoZSBHTUFEUgorICogbWFwcGVkIEJBUiAoaTkxNS0+bW0u Z3R0LT5ndHQpLgorICovCitzdGF0aWMgdm9pZCBnZW42X2dndHRfaW5zZXJ0X2VudHJpZXMoc3Ry dWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCisJCQkJICAgICBzdHJ1Y3QgaTkxNV92bWEgKnZt YSwKKwkJCQkgICAgIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBsZXZlbCwKKwkJCQkgICAgIHUzMiBm bGFncykKK3sKKwlzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0ID0gaTkxNV92bV90b19nZ3R0KHZtKTsK KwlnZW42X3B0ZV90IF9faW9tZW0gKmVudHJpZXMgPSAoZ2VuNl9wdGVfdCBfX2lvbWVtICopZ2d0 dC0+Z3NtOworCXVuc2lnbmVkIGludCBpID0gdm1hLT5ub2RlLnN0YXJ0IC8gSTkxNV9HVFRfUEFH RV9TSVpFOworCXN0cnVjdCBzZ3RfaXRlciBpdGVyOworCWRtYV9hZGRyX3QgYWRkcjsKKwlmb3Jf ZWFjaF9zZ3RfZGFkZHIoYWRkciwgaXRlciwgdm1hLT5wYWdlcykKKwkJaW93cml0ZTMyKHZtLT5w dGVfZW5jb2RlKGFkZHIsIGxldmVsLCBmbGFncyksICZlbnRyaWVzW2krK10pOworCisJLyoKKwkg KiBXZSB3YW50IHRvIGZsdXNoIHRoZSBUTEJzIG9ubHkgYWZ0ZXIgd2UncmUgY2VydGFpbiBhbGwg dGhlIFBURQorCSAqIHVwZGF0ZXMgaGF2ZSBmaW5pc2hlZC4KKwkgKi8KKwlnZ3R0LT5pbnZhbGlk YXRlKGdndHQpOworfQorCitzdGF0aWMgdm9pZCBub3BfY2xlYXJfcmFuZ2Uoc3RydWN0IGk5MTVf YWRkcmVzc19zcGFjZSAqdm0sCisJCQkgICAgdTY0IHN0YXJ0LCB1NjQgbGVuZ3RoKQoreworfQor CitzdGF0aWMgdm9pZCBnZW44X2dndHRfY2xlYXJfcmFuZ2Uoc3RydWN0IGk5MTVfYWRkcmVzc19z cGFjZSAqdm0sCisJCQkJICB1NjQgc3RhcnQsIHU2NCBsZW5ndGgpCit7CisJc3RydWN0IGk5MTVf Z2d0dCAqZ2d0dCA9IGk5MTVfdm1fdG9fZ2d0dCh2bSk7CisJdW5zaWduZWQgZmlyc3RfZW50cnkg PSBzdGFydCAvIEk5MTVfR1RUX1BBR0VfU0laRTsKKwl1bnNpZ25lZCBudW1fZW50cmllcyA9IGxl bmd0aCAvIEk5MTVfR1RUX1BBR0VfU0laRTsKKwljb25zdCBnZW44X3B0ZV90IHNjcmF0Y2hfcHRl ID0gdm0tPnNjcmF0Y2hbMF0uZW5jb2RlOworCWdlbjhfcHRlX3QgX19pb21lbSAqZ3R0X2Jhc2Ug PQorCQkoZ2VuOF9wdGVfdCBfX2lvbWVtICopZ2d0dC0+Z3NtICsgZmlyc3RfZW50cnk7CisJY29u c3QgaW50IG1heF9lbnRyaWVzID0gZ2d0dF90b3RhbF9lbnRyaWVzKGdndHQpIC0gZmlyc3RfZW50 cnk7CisJaW50IGk7CisKKwlpZiAoV0FSTihudW1fZW50cmllcyA+IG1heF9lbnRyaWVzLAorCQkg IkZpcnN0IGVudHJ5ID0gJWQ7IE51bSBlbnRyaWVzID0gJWQgKG1heD0lZClcbiIsCisJCSBmaXJz dF9lbnRyeSwgbnVtX2VudHJpZXMsIG1heF9lbnRyaWVzKSkKKwkJbnVtX2VudHJpZXMgPSBtYXhf ZW50cmllczsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fZW50cmllczsgaSsrKQorCQlnZW44X3Nl dF9wdGUoJmd0dF9iYXNlW2ldLCBzY3JhdGNoX3B0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGJ4dF92 dGRfZ2d0dF93YShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkKK3sKKwlzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB2bS0+aTkxNTsKKworCS8qCisJICogTWFrZSBzdXJl IHRoZSBpbnRlcm5hbCBHQU0gZmlmbyBoYXMgYmVlbiBjbGVhcmVkIG9mIGFsbCBHVFQKKwkgKiB3 cml0ZXMgYmVmb3JlIGV4aXRpbmcgc3RvcF9tYWNoaW5lKCkuIFRoaXMgZ3VhcmFudGVlcyB0aGF0 CisJICogYW55IGFwZXJ0dXJlIGFjY2Vzc2VzIHdhaXRpbmcgdG8gc3RhcnQgaW4gYW5vdGhlciBw cm9jZXNzCisJICogY2Fubm90IGJhY2sgdXAgYmVoaW5kIHRoZSBHVFQgd3JpdGVzIGNhdXNpbmcg YSBoYW5nLgorCSAqIFRoZSByZWdpc3RlciBjYW4gYmUgYW55IGFyYml0cmFyeSBHQU0gcmVnaXN0 ZXIuCisJICovCisJUE9TVElOR19SRUFEKEdGWF9GTFNIX0NOVExfR0VONik7Cit9CisKK3N0cnVj dCBpbnNlcnRfcGFnZSB7CisJc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm07CisJZG1hX2Fk ZHJfdCBhZGRyOworCXU2NCBvZmZzZXQ7CisJZW51bSBpOTE1X2NhY2hlX2xldmVsIGxldmVsOwor fTsKKworc3RhdGljIGludCBieHRfdnRkX2dndHRfaW5zZXJ0X3BhZ2VfX2NiKHZvaWQgKl9hcmcp Cit7CisJc3RydWN0IGluc2VydF9wYWdlICphcmcgPSBfYXJnOworCisJZ2VuOF9nZ3R0X2luc2Vy dF9wYWdlKGFyZy0+dm0sIGFyZy0+YWRkciwgYXJnLT5vZmZzZXQsIGFyZy0+bGV2ZWwsIDApOwor CWJ4dF92dGRfZ2d0dF93YShhcmctPnZtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9p ZCBieHRfdnRkX2dndHRfaW5zZXJ0X3BhZ2VfX0JLTChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNl ICp2bSwKKwkJCQkJICBkbWFfYWRkcl90IGFkZHIsCisJCQkJCSAgdTY0IG9mZnNldCwKKwkJCQkJ ICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgbGV2ZWwsCisJCQkJCSAgdTMyIHVudXNlZCkKK3sKKwlz dHJ1Y3QgaW5zZXJ0X3BhZ2UgYXJnID0geyB2bSwgYWRkciwgb2Zmc2V0LCBsZXZlbCB9OworCisJ c3RvcF9tYWNoaW5lKGJ4dF92dGRfZ2d0dF9pbnNlcnRfcGFnZV9fY2IsICZhcmcsIE5VTEwpOwor fQorCitzdHJ1Y3QgaW5zZXJ0X2VudHJpZXMgeworCXN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2Ug KnZtOworCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOworCWVudW0gaTkxNV9jYWNoZV9sZXZlbCBsZXZl bDsKKwl1MzIgZmxhZ3M7Cit9OworCitzdGF0aWMgaW50IGJ4dF92dGRfZ2d0dF9pbnNlcnRfZW50 cmllc19fY2Iodm9pZCAqX2FyZykKK3sKKwlzdHJ1Y3QgaW5zZXJ0X2VudHJpZXMgKmFyZyA9IF9h cmc7CisKKwlnZW44X2dndHRfaW5zZXJ0X2VudHJpZXMoYXJnLT52bSwgYXJnLT52bWEsIGFyZy0+ bGV2ZWwsIGFyZy0+ZmxhZ3MpOworCWJ4dF92dGRfZ2d0dF93YShhcmctPnZtKTsKKworCXJldHVy biAwOworfQorCitzdGF0aWMgdm9pZCBieHRfdnRkX2dndHRfaW5zZXJ0X2VudHJpZXNfX0JLTChz dHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKKwkJCQkJICAgICBzdHJ1Y3QgaTkxNV92bWEg KnZtYSwKKwkJCQkJICAgICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgbGV2ZWwsCisJCQkJCSAgICAg dTMyIGZsYWdzKQoreworCXN0cnVjdCBpbnNlcnRfZW50cmllcyBhcmcgPSB7IHZtLCB2bWEsIGxl dmVsLCBmbGFncyB9OworCisJc3RvcF9tYWNoaW5lKGJ4dF92dGRfZ2d0dF9pbnNlcnRfZW50cmll c19fY2IsICZhcmcsIE5VTEwpOworfQorCitzdHJ1Y3QgY2xlYXJfcmFuZ2UgeworCXN0cnVjdCBp OTE1X2FkZHJlc3Nfc3BhY2UgKnZtOworCXU2NCBzdGFydDsKKwl1NjQgbGVuZ3RoOworfTsKKwor c3RhdGljIGludCBieHRfdnRkX2dndHRfY2xlYXJfcmFuZ2VfX2NiKHZvaWQgKl9hcmcpCit7CisJ c3RydWN0IGNsZWFyX3JhbmdlICphcmcgPSBfYXJnOworCisJZ2VuOF9nZ3R0X2NsZWFyX3Jhbmdl KGFyZy0+dm0sIGFyZy0+c3RhcnQsIGFyZy0+bGVuZ3RoKTsKKwlieHRfdnRkX2dndHRfd2EoYXJn LT52bSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYnh0X3Z0ZF9nZ3R0X2NsZWFy X3JhbmdlX19CS0woc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCisJCQkJCSAgdTY0IHN0 YXJ0LAorCQkJCQkgIHU2NCBsZW5ndGgpCit7CisJc3RydWN0IGNsZWFyX3JhbmdlIGFyZyA9IHsg dm0sIHN0YXJ0LCBsZW5ndGggfTsKKworCXN0b3BfbWFjaGluZShieHRfdnRkX2dndHRfY2xlYXJf cmFuZ2VfX2NiLCAmYXJnLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgZ2VuNl9nZ3R0X2NsZWFy X3JhbmdlKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAorCQkJCSAgdTY0IHN0YXJ0LCB1 NjQgbGVuZ3RoKQoreworCXN0cnVjdCBpOTE1X2dndHQgKmdndHQgPSBpOTE1X3ZtX3RvX2dndHQo dm0pOworCXVuc2lnbmVkIGZpcnN0X2VudHJ5ID0gc3RhcnQgLyBJOTE1X0dUVF9QQUdFX1NJWkU7 CisJdW5zaWduZWQgbnVtX2VudHJpZXMgPSBsZW5ndGggLyBJOTE1X0dUVF9QQUdFX1NJWkU7CisJ Z2VuNl9wdGVfdCBzY3JhdGNoX3B0ZSwgX19pb21lbSAqZ3R0X2Jhc2UgPQorCQkoZ2VuNl9wdGVf dCBfX2lvbWVtICopZ2d0dC0+Z3NtICsgZmlyc3RfZW50cnk7CisJY29uc3QgaW50IG1heF9lbnRy aWVzID0gZ2d0dF90b3RhbF9lbnRyaWVzKGdndHQpIC0gZmlyc3RfZW50cnk7CisJaW50IGk7CisK KwlpZiAoV0FSTihudW1fZW50cmllcyA+IG1heF9lbnRyaWVzLAorCQkgIkZpcnN0IGVudHJ5ID0g JWQ7IE51bSBlbnRyaWVzID0gJWQgKG1heD0lZClcbiIsCisJCSBmaXJzdF9lbnRyeSwgbnVtX2Vu dHJpZXMsIG1heF9lbnRyaWVzKSkKKwkJbnVtX2VudHJpZXMgPSBtYXhfZW50cmllczsKKworCXNj cmF0Y2hfcHRlID0gdm0tPnNjcmF0Y2hbMF0uZW5jb2RlOworCWZvciAoaSA9IDA7IGkgPCBudW1f ZW50cmllczsgaSsrKQorCQlpb3dyaXRlMzIoc2NyYXRjaF9wdGUsICZndHRfYmFzZVtpXSk7Cit9 CisKK3N0YXRpYyB2b2lkIGk5MTVfZ2d0dF9pbnNlcnRfcGFnZShzdHJ1Y3QgaTkxNV9hZGRyZXNz X3NwYWNlICp2bSwKKwkJCQkgIGRtYV9hZGRyX3QgYWRkciwKKwkJCQkgIHU2NCBvZmZzZXQsCisJ CQkJICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgY2FjaGVfbGV2ZWwsCisJCQkJICB1MzIgdW51c2Vk KQoreworCXVuc2lnbmVkIGludCBmbGFncyA9IChjYWNoZV9sZXZlbCA9PSBJOTE1X0NBQ0hFX05P TkUpID8KKwkJQUdQX1VTRVJfTUVNT1JZIDogQUdQX1VTRVJfQ0FDSEVEX01FTU9SWTsKKworCWlu dGVsX2d0dF9pbnNlcnRfcGFnZShhZGRyLCBvZmZzZXQgPj4gUEFHRV9TSElGVCwgZmxhZ3MpOwor fQorCitzdGF0aWMgdm9pZCBpOTE1X2dndHRfaW5zZXJ0X2VudHJpZXMoc3RydWN0IGk5MTVfYWRk cmVzc19zcGFjZSAqdm0sCisJCQkJICAgICBzdHJ1Y3QgaTkxNV92bWEgKnZtYSwKKwkJCQkgICAg IGVudW0gaTkxNV9jYWNoZV9sZXZlbCBjYWNoZV9sZXZlbCwKKwkJCQkgICAgIHUzMiB1bnVzZWQp Cit7CisJdW5zaWduZWQgaW50IGZsYWdzID0gKGNhY2hlX2xldmVsID09IEk5MTVfQ0FDSEVfTk9O RSkgPworCQlBR1BfVVNFUl9NRU1PUlkgOiBBR1BfVVNFUl9DQUNIRURfTUVNT1JZOworCisJaW50 ZWxfZ3R0X2luc2VydF9zZ19lbnRyaWVzKHZtYS0+cGFnZXMsIHZtYS0+bm9kZS5zdGFydCA+PiBQ QUdFX1NISUZULAorCQkJCSAgICBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGk5MTVfZ2d0dF9j bGVhcl9yYW5nZShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKKwkJCQkgIHU2NCBzdGFy dCwgdTY0IGxlbmd0aCkKK3sKKwlpbnRlbF9ndHRfY2xlYXJfcmFuZ2Uoc3RhcnQgPj4gUEFHRV9T SElGVCwgbGVuZ3RoID4+IFBBR0VfU0hJRlQpOworfQorCitzdGF0aWMgaW50IGdndHRfYmluZF92 bWEoc3RydWN0IGk5MTVfdm1hICp2bWEsCisJCQkgZW51bSBpOTE1X2NhY2hlX2xldmVsIGNhY2hl X2xldmVsLAorCQkJIHUzMiBmbGFncykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkx NSA9IHZtYS0+dm0tPmk5MTU7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IHZt YS0+b2JqOworCWludGVsX3dha2VyZWZfdCB3YWtlcmVmOworCXUzMiBwdGVfZmxhZ3M7CisKKwkv KiBBcHBsaWNhYmxlIHRvIFZMViAoZ2VuOCsgZG8gbm90IHN1cHBvcnQgUk8gaW4gdGhlIEdHVFQp ICovCisJcHRlX2ZsYWdzID0gMDsKKwlpZiAoaTkxNV9nZW1fb2JqZWN0X2lzX3JlYWRvbmx5KG9i aikpCisJCXB0ZV9mbGFncyB8PSBQVEVfUkVBRF9PTkxZOworCisJd2l0aF9pbnRlbF9ydW50aW1l X3BtKCZpOTE1LT5ydW50aW1lX3BtLCB3YWtlcmVmKQorCQl2bWEtPnZtLT5pbnNlcnRfZW50cmll cyh2bWEtPnZtLCB2bWEsIGNhY2hlX2xldmVsLCBwdGVfZmxhZ3MpOworCisJdm1hLT5wYWdlX3Np emVzLmd0dCA9IEk5MTVfR1RUX1BBR0VfU0laRTsKKworCS8qCisJICogV2l0aG91dCBhbGlhc2lu ZyBQUEdUVCB0aGVyZSdzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbgorCSAqIEdMT0JBTC9MT0NBTF9C SU5ELCBpdCdzIGFsbCB0aGUgc2FtZSBwdGVzLiBIZW5jZSB1bmNvbmRpdGlvbmFsbHkKKwkgKiB1 cGdyYWRlIHRvIGJvdGggYm91bmQgaWYgd2UgYmluZCBlaXRoZXIgdG8gYXZvaWQgZG91YmxlLWJp bmRpbmcuCisJICovCisJYXRvbWljX29yKEk5MTVfVk1BX0dMT0JBTF9CSU5EIHwgSTkxNV9WTUFf TE9DQUxfQklORCwgJnZtYS0+ZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lk IGdndHRfdW5iaW5kX3ZtYShzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sKKwlzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqaTkxNSA9IHZtYS0+dm0tPmk5MTU7CisJaW50ZWxfd2FrZXJlZl90IHdha2Vy ZWY7CisKKwl3aXRoX2ludGVsX3J1bnRpbWVfcG0oJmk5MTUtPnJ1bnRpbWVfcG0sIHdha2VyZWYp CisJCXZtYS0+dm0tPmNsZWFyX3JhbmdlKHZtYS0+dm0sIHZtYS0+bm9kZS5zdGFydCwgdm1hLT5z aXplKTsKK30KKworc3RhdGljIGludCBnZ3R0X3Jlc2VydmVfZ3VjX3RvcChzdHJ1Y3QgaTkxNV9n Z3R0ICpnZ3R0KQoreworCXU2NCBzaXplOworCWludCByZXQ7CisKKwlpZiAoIVVTRVNfR1VDKGdn dHQtPnZtLmk5MTUpKQorCQlyZXR1cm4gMDsKKworCUdFTV9CVUdfT04oZ2d0dC0+dm0udG90YWwg PD0gR1VDX0dHVFRfVE9QKTsKKwlzaXplID0gZ2d0dC0+dm0udG90YWwgLSBHVUNfR0dUVF9UT1A7 CisKKwlyZXQgPSBpOTE1X2dlbV9ndHRfcmVzZXJ2ZSgmZ2d0dC0+dm0sICZnZ3R0LT51Y19mdywg c2l6ZSwKKwkJCQkgICBHVUNfR0dUVF9UT1AsIEk5MTVfQ09MT1JfVU5FVklDVEFCTEUsCisJCQkJ ICAgUElOX05PRVZJQ1QpOworCWlmIChyZXQpCisJCURSTV9ERUJVR19EUklWRVIoIkZhaWxlZCB0 byByZXNlcnZlIHRvcCBvZiBHR1RUIGZvciBHdUNcbiIpOworCisJcmV0dXJuIHJldDsKK30KKwor c3RhdGljIHZvaWQgZ2d0dF9yZWxlYXNlX2d1Y190b3Aoc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCkK K3sKKwlpZiAoZHJtX21tX25vZGVfYWxsb2NhdGVkKCZnZ3R0LT51Y19mdykpCisJCWRybV9tbV9y ZW1vdmVfbm9kZSgmZ2d0dC0+dWNfZncpOworfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwX2luaXRf Z2d0dChzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0KQoreworCWdndHRfcmVsZWFzZV9ndWNfdG9wKGdn dHQpOworCWlmIChkcm1fbW1fbm9kZV9hbGxvY2F0ZWQoJmdndHQtPmVycm9yX2NhcHR1cmUpKQor CQlkcm1fbW1fcmVtb3ZlX25vZGUoJmdndHQtPmVycm9yX2NhcHR1cmUpOworfQorCitzdGF0aWMg aW50IGluaXRfZ2d0dChzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0KQoreworCS8qIExldCBHRU0gTWFu YWdlIGFsbCBvZiB0aGUgYXBlcnR1cmUuCisJICoKKwkgKiBIb3dldmVyLCBsZWF2ZSBvbmUgcGFn ZSBhdCB0aGUgZW5kIHN0aWxsIGJvdW5kIHRvIHRoZSBzY3JhdGNoIHBhZ2UuCisJICogVGhlcmUg YXJlIGEgbnVtYmVyIG9mIHBsYWNlcyB3aGVyZSB0aGUgaGFyZHdhcmUgYXBwYXJlbnRseSBwcmVm ZXRjaGVzCisJICogcGFzdCB0aGUgZW5kIG9mIHRoZSBvYmplY3QsIGFuZCB3ZSd2ZSBzZWVuIG11 bHRpcGxlIGhhbmdzIHdpdGggdGhlCisJICogR1BVIGhlYWQgcG9pbnRlciBzdHVjayBpbiBhIGJh dGNoYnVmZmVyIGJvdW5kIGF0IHRoZSBsYXN0IHBhZ2Ugb2YgdGhlCisJICogYXBlcnR1cmUuICBP bmUgcGFnZSBzaG91bGQgYmUgZW5vdWdoIHRvIGtlZXAgYW55IHByZWZldGNoaW5nIGluc2lkZQor CSAqIG9mIHRoZSBhcGVydHVyZS4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIGhvbGVfc3RhcnQsIGhv bGVfZW5kOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqZW50cnk7CisJaW50IHJldDsKKworCS8qCisJ ICogR3VDIHJlcXVpcmVzIGFsbCByZXNvdXJjZXMgdGhhdCB3ZSdyZSBzaGFyaW5nIHdpdGggaXQg dG8gYmUgcGxhY2VkIGluCisJICogbm9uLVdPUENNIG1lbW9yeS4gSWYgR3VDIGlzIG5vdCBwcmVz ZW50IG9yIG5vdCBpbiB1c2Ugd2Ugc3RpbGwgbmVlZCBhCisJICogc21hbGwgYmlhcyBhcyByaW5n IHdyYXBhcm91bmQgYXQgb2Zmc2V0IDAgc29tZXRpbWVzIGhhbmdzLiBObyBpZGVhCisJICogd2h5 LgorCSAqLworCWdndHQtPnBpbl9iaWFzID0gbWF4X3QodTMyLCBJOTE1X0dUVF9QQUdFX1NJWkUs CisJCQkgICAgICAgaW50ZWxfd29wY21fZ3VjX3NpemUoJmdndHQtPnZtLmk5MTUtPndvcGNtKSk7 CisKKwlyZXQgPSBpbnRlbF92Z3RfYmFsbG9vbihnZ3R0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4g cmV0OworCisJaWYgKGdndHQtPm1hcHBhYmxlX2VuZCkgeworCQkvKiBSZXNlcnZlIGEgbWFwcGFi bGUgc2xvdCBmb3Igb3VyIGxvY2tsZXNzIGVycm9yIGNhcHR1cmUgKi8KKwkJcmV0ID0gZHJtX21t X2luc2VydF9ub2RlX2luX3JhbmdlKCZnZ3R0LT52bS5tbSwgJmdndHQtPmVycm9yX2NhcHR1cmUs CisJCQkJCQkgIFBBR0VfU0laRSwgMCwgSTkxNV9DT0xPUl9VTkVWSUNUQUJMRSwKKwkJCQkJCSAg MCwgZ2d0dC0+bWFwcGFibGVfZW5kLAorCQkJCQkJICBEUk1fTU1fSU5TRVJUX0xPVyk7CisJCWlm IChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCS8qCisJICogVGhlIHVwcGVyIHBvcnRpb24g b2YgdGhlIEd1QyBhZGRyZXNzIHNwYWNlIGhhcyBhIHNpemVhYmxlIGhvbGUKKwkgKiAoc2V2ZXJh bCBNQikgdGhhdCBpcyBpbmFjY2Vzc2libGUgYnkgR3VDLiBSZXNlcnZlIHRoaXMgcmFuZ2Ugd2l0 aGluCisJICogR0dUVCBhcyBpdCBjYW4gY29tZm9ydGFibHkgaG9sZCBHdUMvSHVDIGZpcm13YXJl IGltYWdlcy4KKwkgKi8KKwlyZXQgPSBnZ3R0X3Jlc2VydmVfZ3VjX3RvcChnZ3R0KTsKKwlpZiAo cmV0KQorCQlnb3RvIGVycjsKKworCS8qIENsZWFyIGFueSBub24tcHJlYWxsb2NhdGVkIGJsb2Nr cyAqLworCWRybV9tbV9mb3JfZWFjaF9ob2xlKGVudHJ5LCAmZ2d0dC0+dm0ubW0sIGhvbGVfc3Rh cnQsIGhvbGVfZW5kKSB7CisJCURSTV9ERUJVR19LTVMoImNsZWFyaW5nIHVudXNlZCBHVFQgc3Bh Y2U6IFslbHgsICVseF1cbiIsCisJCQkgICAgICBob2xlX3N0YXJ0LCBob2xlX2VuZCk7CisJCWdn dHQtPnZtLmNsZWFyX3JhbmdlKCZnZ3R0LT52bSwgaG9sZV9zdGFydCwKKwkJCQkgICAgIGhvbGVf ZW5kIC0gaG9sZV9zdGFydCk7CisJfQorCisJLyogQW5kIGZpbmFsbHkgY2xlYXIgdGhlIHJlc2Vy dmVkIGd1YXJkIHBhZ2UgKi8KKwlnZ3R0LT52bS5jbGVhcl9yYW5nZSgmZ2d0dC0+dm0sIGdndHQt PnZtLnRvdGFsIC0gUEFHRV9TSVpFLCBQQUdFX1NJWkUpOworCisJcmV0dXJuIDA7CisKK2VycjoK KwljbGVhbnVwX2luaXRfZ2d0dChnZ3R0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50 IGFsaWFzaW5nX2d0dF9iaW5kX3ZtYShzdHJ1Y3QgaTkxNV92bWEgKnZtYSwKKwkJCQkgZW51bSBp OTE1X2NhY2hlX2xldmVsIGNhY2hlX2xldmVsLAorCQkJCSB1MzIgZmxhZ3MpCit7CisJc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSB2bWEtPnZtLT5pOTE1OworCXUzMiBwdGVfZmxhZ3M7 CisJaW50IHJldDsKKworCS8qIEN1cnJlbnRseSBhcHBsaWNhYmxlIG9ubHkgdG8gVkxWICovCisJ cHRlX2ZsYWdzID0gMDsKKwlpZiAoaTkxNV9nZW1fb2JqZWN0X2lzX3JlYWRvbmx5KHZtYS0+b2Jq KSkKKwkJcHRlX2ZsYWdzIHw9IFBURV9SRUFEX09OTFk7CisKKwlpZiAoZmxhZ3MgJiBJOTE1X1ZN QV9MT0NBTF9CSU5EKSB7CisJCXN0cnVjdCBpOTE1X3BwZ3R0ICphbGlhcyA9IGk5MTVfdm1fdG9f Z2d0dCh2bWEtPnZtKS0+YWxpYXM7CisKKwkJaWYgKGZsYWdzICYgSTkxNV9WTUFfQUxMT0MpIHsK KwkJCXJldCA9IGFsaWFzLT52bS5hbGxvY2F0ZV92YV9yYW5nZSgmYWxpYXMtPnZtLAorCQkJCQkJ CSAgdm1hLT5ub2RlLnN0YXJ0LAorCQkJCQkJCSAgdm1hLT5zaXplKTsKKwkJCWlmIChyZXQpCisJ CQkJcmV0dXJuIHJldDsKKworCQkJc2V0X2JpdChJOTE1X1ZNQV9BTExPQ19CSVQsIF9faTkxNV92 bWFfZmxhZ3Modm1hKSk7CisJCX0KKworCQlHRU1fQlVHX09OKCF0ZXN0X2JpdChJOTE1X1ZNQV9B TExPQ19CSVQsCisJCQkJICAgICBfX2k5MTVfdm1hX2ZsYWdzKHZtYSkpKTsKKwkJYWxpYXMtPnZt Lmluc2VydF9lbnRyaWVzKCZhbGlhcy0+dm0sIHZtYSwKKwkJCQkJIGNhY2hlX2xldmVsLCBwdGVf ZmxhZ3MpOworCX0KKworCWlmIChmbGFncyAmIEk5MTVfVk1BX0dMT0JBTF9CSU5EKSB7CisJCWlu dGVsX3dha2VyZWZfdCB3YWtlcmVmOworCisJCXdpdGhfaW50ZWxfcnVudGltZV9wbSgmaTkxNS0+ cnVudGltZV9wbSwgd2FrZXJlZikgeworCQkJdm1hLT52bS0+aW5zZXJ0X2VudHJpZXModm1hLT52 bSwgdm1hLAorCQkJCQkJY2FjaGVfbGV2ZWwsIHB0ZV9mbGFncyk7CisJCX0KKwl9CisKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWxpYXNpbmdfZ3R0X3VuYmluZF92bWEoc3RydWN0IGk5 MTVfdm1hICp2bWEpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSB2bWEtPnZt LT5pOTE1OworCisJaWYgKGk5MTVfdm1hX2lzX2JvdW5kKHZtYSwgSTkxNV9WTUFfR0xPQkFMX0JJ TkQpKSB7CisJCXN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtID0gdm1hLT52bTsKKwkJaW50 ZWxfd2FrZXJlZl90IHdha2VyZWY7CisKKwkJd2l0aF9pbnRlbF9ydW50aW1lX3BtKCZpOTE1LT5y dW50aW1lX3BtLCB3YWtlcmVmKQorCQkJdm0tPmNsZWFyX3JhbmdlKHZtLCB2bWEtPm5vZGUuc3Rh cnQsIHZtYS0+c2l6ZSk7CisJfQorCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChJOTE1X1ZNQV9B TExPQ19CSVQsIF9faTkxNV92bWFfZmxhZ3Modm1hKSkpIHsKKwkJc3RydWN0IGk5MTVfYWRkcmVz c19zcGFjZSAqdm0gPQorCQkJJmk5MTVfdm1fdG9fZ2d0dCh2bWEtPnZtKS0+YWxpYXMtPnZtOwor CisJCXZtLT5jbGVhcl9yYW5nZSh2bSwgdm1hLT5ub2RlLnN0YXJ0LCB2bWEtPnNpemUpOworCX0K K30KKworc3RhdGljIGludCBpbml0X2FsaWFzaW5nX3BwZ3R0KHN0cnVjdCBpOTE1X2dndHQgKmdn dHQpCit7CisJc3RydWN0IGk5MTVfcHBndHQgKnBwZ3R0OworCWludCBlcnI7CisKKwlwcGd0dCA9 IGk5MTVfcHBndHRfY3JlYXRlKGdndHQtPnZtLmk5MTUpOworCWlmIChJU19FUlIocHBndHQpKQor CQlyZXR1cm4gUFRSX0VSUihwcGd0dCk7CisKKwlpZiAoR0VNX1dBUk5fT04ocHBndHQtPnZtLnRv dGFsIDwgZ2d0dC0+dm0udG90YWwpKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3Bw Z3R0OworCX0KKworCS8qCisJICogTm90ZSB3ZSBvbmx5IHByZS1hbGxvY2F0ZSBhcyBmYXIgYXMg dGhlIGVuZCBvZiB0aGUgZ2xvYmFsCisJICogR1RULiBPbiA0OGIgLyA0LWxldmVsIHBhZ2UtdGFi bGVzLCB0aGUgZGlmZmVyZW5jZSBpcyB2ZXJ5LAorCSAqIHZlcnkgc2lnbmlmaWNhbnQhIFdlIGhh dmUgdG8gcHJlYWxsb2NhdGUgYXMgR1ZUL3ZncHUgZG9lcworCSAqIG5vdCBsaWtlIHRoZSBwYWdl IGRpcmVjdG9yeSBkaXNhcHBlYXJpbmcuCisJICovCisJZXJyID0gcHBndHQtPnZtLmFsbG9jYXRl X3ZhX3JhbmdlKCZwcGd0dC0+dm0sIDAsIGdndHQtPnZtLnRvdGFsKTsKKwlpZiAoZXJyKQorCQln b3RvIGVycl9wcGd0dDsKKworCWdndHQtPmFsaWFzID0gcHBndHQ7CisJZ2d0dC0+dm0uYmluZF9h c3luY19mbGFncyB8PSBwcGd0dC0+dm0uYmluZF9hc3luY19mbGFnczsKKworCUdFTV9CVUdfT04o Z2d0dC0+dm0udm1hX29wcy5iaW5kX3ZtYSAhPSBnZ3R0X2JpbmRfdm1hKTsKKwlnZ3R0LT52bS52 bWFfb3BzLmJpbmRfdm1hID0gYWxpYXNpbmdfZ3R0X2JpbmRfdm1hOworCisJR0VNX0JVR19PTihn Z3R0LT52bS52bWFfb3BzLnVuYmluZF92bWEgIT0gZ2d0dF91bmJpbmRfdm1hKTsKKwlnZ3R0LT52 bS52bWFfb3BzLnVuYmluZF92bWEgPSBhbGlhc2luZ19ndHRfdW5iaW5kX3ZtYTsKKworCXJldHVy biAwOworCitlcnJfcHBndHQ6CisJaTkxNV92bV9wdXQoJnBwZ3R0LT52bSk7CisJcmV0dXJuIGVy cjsKK30KKworc3RhdGljIHZvaWQgZmluaV9hbGlhc2luZ19wcGd0dChzdHJ1Y3QgaTkxNV9nZ3R0 ICpnZ3R0KQoreworCXN0cnVjdCBpOTE1X3BwZ3R0ICpwcGd0dDsKKworCXBwZ3R0ID0gZmV0Y2hf YW5kX3plcm8oJmdndHQtPmFsaWFzKTsKKwlpZiAoIXBwZ3R0KQorCQlyZXR1cm47CisKKwlpOTE1 X3ZtX3B1dCgmcHBndHQtPnZtKTsKKworCWdndHQtPnZtLnZtYV9vcHMuYmluZF92bWEgICA9IGdn dHRfYmluZF92bWE7CisJZ2d0dC0+dm0udm1hX29wcy51bmJpbmRfdm1hID0gZ2d0dF91bmJpbmRf dm1hOworfQorCitpbnQgaTkxNV9pbml0X2dndHQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5 MTUpCit7CisJaW50IHJldDsKKworCXJldCA9IGluaXRfZ2d0dCgmaTkxNS0+Z2d0dCk7CisJaWYg KHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChJTlRFTF9QUEdUVChpOTE1KSA9PSBJTlRFTF9Q UEdUVF9BTElBU0lORykgeworCQlyZXQgPSBpbml0X2FsaWFzaW5nX3BwZ3R0KCZpOTE1LT5nZ3R0 KTsKKwkJaWYgKHJldCkKKwkJCWNsZWFudXBfaW5pdF9nZ3R0KCZpOTE1LT5nZ3R0KTsKKwl9CisK KwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2d0dF9jbGVhbnVwX2h3KHN0cnVjdCBpOTE1 X2dndHQgKmdndHQpCit7CisJc3RydWN0IGk5MTVfdm1hICp2bWEsICp2bjsKKworCWF0b21pY19z ZXQoJmdndHQtPnZtLm9wZW4sIDApOworCisJcmN1X2JhcnJpZXIoKTsgLyogZmx1c2ggdGhlIFJD VSdlZF9faTkxNV92bV9yZWxlYXNlICovCisJZmx1c2hfd29ya3F1ZXVlKGdndHQtPnZtLmk5MTUt PndxKTsKKworCW11dGV4X2xvY2soJmdndHQtPnZtLm11dGV4KTsKKworCWxpc3RfZm9yX2VhY2hf ZW50cnlfc2FmZSh2bWEsIHZuLCAmZ2d0dC0+dm0uYm91bmRfbGlzdCwgdm1fbGluaykKKwkJV0FS Tl9PTihfX2k5MTVfdm1hX3VuYmluZCh2bWEpKTsKKworCWlmIChkcm1fbW1fbm9kZV9hbGxvY2F0 ZWQoJmdndHQtPmVycm9yX2NhcHR1cmUpKQorCQlkcm1fbW1fcmVtb3ZlX25vZGUoJmdndHQtPmVy cm9yX2NhcHR1cmUpOworCisJZ2d0dF9yZWxlYXNlX2d1Y190b3AoZ2d0dCk7CisJaW50ZWxfdmd0 X2RlYmFsbG9vbihnZ3R0KTsKKworCWdndHQtPnZtLmNsZWFudXAoJmdndHQtPnZtKTsKKworCW11 dGV4X3VubG9jaygmZ2d0dC0+dm0ubXV0ZXgpOworCWk5MTVfYWRkcmVzc19zcGFjZV9maW5pKCZn Z3R0LT52bSk7CisKKwlhcmNoX3BoeXNfd2NfZGVsKGdndHQtPm10cnIpOworCisJaWYgKGdndHQt PmlvbWFwLnNpemUpCisJCWlvX21hcHBpbmdfZmluaSgmZ2d0dC0+aW9tYXApOworfQorCisvKioK KyAqIGk5MTVfZ2d0dF9kcml2ZXJfcmVsZWFzZSAtIENsZWFuIHVwIEdHVFQgaGFyZHdhcmUgaW5p dGlhbGl6YXRpb24KKyAqIEBpOTE1OiBpOTE1IGRldmljZQorICovCit2b2lkIGk5MTVfZ2d0dF9k cml2ZXJfcmVsZWFzZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKK3sKKwlzdHJ1Y3Qg cGFnZXZlYyAqcHZlYzsKKworCWZpbmlfYWxpYXNpbmdfcHBndHQoJmk5MTUtPmdndHQpOworCisJ Z2d0dF9jbGVhbnVwX2h3KCZpOTE1LT5nZ3R0KTsKKworCXB2ZWMgPSAmaTkxNS0+bW0ud2Nfc3Rh c2gucHZlYzsKKwlpZiAocHZlYy0+bnIpIHsKKwkJc2V0X3BhZ2VzX2FycmF5X3diKHB2ZWMtPnBh Z2VzLCBwdmVjLT5ucik7CisJCV9fcGFnZXZlY19yZWxlYXNlKHB2ZWMpOworCX0KK30KKworc3Rh dGljIHVuc2lnbmVkIGludCBnZW42X2dldF90b3RhbF9ndHRfc2l6ZSh1MTYgc25iX2dtY2hfY3Rs KQoreworCXNuYl9nbWNoX2N0bCA+Pj0gU05CX0dNQ0hfR0dNU19TSElGVDsKKwlzbmJfZ21jaF9j dGwgJj0gU05CX0dNQ0hfR0dNU19NQVNLOworCXJldHVybiBzbmJfZ21jaF9jdGwgPDwgMjA7Cit9 CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2VuOF9nZXRfdG90YWxfZ3R0X3NpemUodTE2IGJkd19n bWNoX2N0bCkKK3sKKwliZHdfZ21jaF9jdGwgPj49IEJEV19HTUNIX0dHTVNfU0hJRlQ7CisJYmR3 X2dtY2hfY3RsICY9IEJEV19HTUNIX0dHTVNfTUFTSzsKKwlpZiAoYmR3X2dtY2hfY3RsKQorCQli ZHdfZ21jaF9jdGwgPSAxIDw8IGJkd19nbWNoX2N0bDsKKworI2lmZGVmIENPTkZJR19YODZfMzIK KwkvKiBMaW1pdCAzMmIgcGxhdGZvcm1zIHRvIGEgMkdCIEdHVFQ6IDQgPDwgMjAgLyBwdGUgc2l6 ZSAqIEk5MTVfR1RUX1BBR0VfU0laRSAqLworCWlmIChiZHdfZ21jaF9jdGwgPiA0KQorCQliZHdf Z21jaF9jdGwgPSA0OworI2VuZGlmCisKKwlyZXR1cm4gYmR3X2dtY2hfY3RsIDw8IDIwOworfQor CitzdGF0aWMgdW5zaWduZWQgaW50IGNodl9nZXRfdG90YWxfZ3R0X3NpemUodTE2IGdtY2hfY3Ry bCkKK3sKKwlnbWNoX2N0cmwgPj49IFNOQl9HTUNIX0dHTVNfU0hJRlQ7CisJZ21jaF9jdHJsICY9 IFNOQl9HTUNIX0dHTVNfTUFTSzsKKworCWlmIChnbWNoX2N0cmwpCisJCXJldHVybiAxIDw8ICgy MCArIGdtY2hfY3RybCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZ3R0X3Byb2Jl X2NvbW1vbihzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0LCB1NjQgc2l6ZSkKK3sKKwlzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGdndHQtPnZtLmk5MTU7CisJc3RydWN0IHBjaV9kZXYgKnBk ZXYgPSBpOTE1LT5kcm0ucGRldjsKKwlwaHlzX2FkZHJfdCBwaHlzX2FkZHI7CisJaW50IHJldDsK KworCS8qIEZvciBNb2Rlcm4gR0VOcyB0aGUgUFRFcyBhbmQgcmVnaXN0ZXIgc3BhY2UgYXJlIHNw bGl0IGluIHRoZSBCQVIgKi8KKwlwaHlzX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwg MCkgKyBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApIC8gMjsKKworCS8qCisJICogT24gQlhUKy9D TkwrIHdyaXRlcyBsYXJnZXIgdGhhbiA2NCBiaXQgdG8gdGhlIEdUVCBwYWdldGFibGUgcmFuZ2UK KwkgKiB3aWxsIGJlIGRyb3BwZWQuIEZvciBXQyBtYXBwaW5ncyBpbiBnZW5lcmFsIHdlIGhhdmUg NjQgYnl0ZSBidXJzdAorCSAqIHdyaXRlcyB3aGVuIHRoZSBXQyBidWZmZXIgaXMgZmx1c2hlZCwg c28gd2UgY2FuJ3QgdXNlIGl0LCBidXQgaGF2ZSB0bworCSAqIHJlc29ydCB0byBhbiB1bmNhY2hl ZCBtYXBwaW5nLiBUaGUgV0MgaXNzdWUgaXMgZWFzaWx5IGNhdWdodCBieSB0aGUKKwkgKiByZWFk YmFjayBjaGVjayB3aGVuIHdyaXRpbmcgR1RUIFBURSBlbnRyaWVzLgorCSAqLworCWlmIChJU19H RU45X0xQKGk5MTUpIHx8IElOVEVMX0dFTihpOTE1KSA+PSAxMCkKKwkJZ2d0dC0+Z3NtID0gaW9y ZW1hcF9ub2NhY2hlKHBoeXNfYWRkciwgc2l6ZSk7CisJZWxzZQorCQlnZ3R0LT5nc20gPSBpb3Jl bWFwX3djKHBoeXNfYWRkciwgc2l6ZSk7CisJaWYgKCFnZ3R0LT5nc20pIHsKKwkJRFJNX0VSUk9S KCJGYWlsZWQgdG8gbWFwIHRoZSBnZ3R0IHBhZ2UgdGFibGVcbiIpOworCQlyZXR1cm4gLUVOT01F TTsKKwl9CisKKwlyZXQgPSBzZXR1cF9zY3JhdGNoX3BhZ2UoJmdndHQtPnZtLCBHRlBfRE1BMzIp OworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJTY3JhdGNoIHNldHVwIGZhaWxlZFxuIik7CisJ CS8qIGlvdW5tYXAgd2lsbCBhbHNvIGdldCBjYWxsZWQgYXQgcmVtb3ZlLCBidXQgbWVoICovCisJ CWlvdW5tYXAoZ2d0dC0+Z3NtKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlnZ3R0LT52bS5zY3Jh dGNoWzBdLmVuY29kZSA9CisJCWdndHQtPnZtLnB0ZV9lbmNvZGUocHhfZG1hKCZnZ3R0LT52bS5z Y3JhdGNoWzBdKSwKKwkJCQkgICAgSTkxNV9DQUNIRV9OT05FLCAwKTsKKworCXJldHVybiAwOwor fQorCitpbnQgZ2d0dF9zZXRfcGFnZXMoc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJaW50IHJl dDsKKworCUdFTV9CVUdfT04odm1hLT5wYWdlcyk7CisKKwlyZXQgPSBpOTE1X2dldF9nZ3R0X3Zt YV9wYWdlcyh2bWEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl2bWEtPnBhZ2Vfc2l6 ZXMgPSB2bWEtPm9iai0+bW0ucGFnZV9zaXplczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMg dm9pZCBnZW42X2dtY2hfcmVtb3ZlKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKQorewor CXN0cnVjdCBpOTE1X2dndHQgKmdndHQgPSBpOTE1X3ZtX3RvX2dndHQodm0pOworCisJaW91bm1h cChnZ3R0LT5nc20pOworCWNsZWFudXBfc2NyYXRjaF9wYWdlKHZtKTsKK30KKworc3RhdGljIHN0 cnVjdCByZXNvdXJjZSBwY2lfcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBiYXIp Cit7CisJcmV0dXJuIChzdHJ1Y3QgcmVzb3VyY2UpREVGSU5FX1JFU19NRU0ocGNpX3Jlc291cmNl X3N0YXJ0KHBkZXYsIGJhciksCisJCQkJCSAgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGJh cikpOworfQorCitzdGF0aWMgaW50IGdlbjhfZ21jaF9wcm9iZShzdHJ1Y3QgaTkxNV9nZ3R0ICpn Z3R0KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gZ2d0dC0+dm0uaTkxNTsK KwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGk5MTUtPmRybS5wZGV2OworCXVuc2lnbmVkIGludCBz aXplOworCXUxNiBzbmJfZ21jaF9jdGw7CisJaW50IGVycjsKKworCS8qIFRPRE86IFdlJ3JlIG5v dCBhd2FyZSBvZiBtYXBwYWJsZSBjb25zdHJhaW50cyBvbiBnZW44IHlldCAqLworCWlmICghSVNf REdGWChpOTE1KSkgeworCQlnZ3R0LT5nbWFkciA9IHBjaV9yZXNvdXJjZShwZGV2LCAyKTsKKwkJ Z2d0dC0+bWFwcGFibGVfZW5kID0gcmVzb3VyY2Vfc2l6ZSgmZ2d0dC0+Z21hZHIpOworCX0KKwor CWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDM5KSk7CisJaWYgKCFl cnIpCisJCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01B U0soMzkpKTsKKwlpZiAoZXJyKQorCQlEUk1fRVJST1IoIkNhbid0IHNldCBETUEgbWFzay9jb25z aXN0ZW50IG1hc2sgKCVkKVxuIiwgZXJyKTsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYs IFNOQl9HTUNIX0NUUkwsICZzbmJfZ21jaF9jdGwpOworCWlmIChJU19DSEVSUllWSUVXKGk5MTUp KQorCQlzaXplID0gY2h2X2dldF90b3RhbF9ndHRfc2l6ZShzbmJfZ21jaF9jdGwpOworCWVsc2UK KwkJc2l6ZSA9IGdlbjhfZ2V0X3RvdGFsX2d0dF9zaXplKHNuYl9nbWNoX2N0bCk7CisKKwlnZ3R0 LT52bS50b3RhbCA9IChzaXplIC8gc2l6ZW9mKGdlbjhfcHRlX3QpKSAqIEk5MTVfR1RUX1BBR0Vf U0laRTsKKwlnZ3R0LT52bS5jbGVhbnVwID0gZ2VuNl9nbWNoX3JlbW92ZTsKKwlnZ3R0LT52bS5p bnNlcnRfcGFnZSA9IGdlbjhfZ2d0dF9pbnNlcnRfcGFnZTsKKwlnZ3R0LT52bS5jbGVhcl9yYW5n ZSA9IG5vcF9jbGVhcl9yYW5nZTsKKwlpZiAoaW50ZWxfc2Nhbm91dF9uZWVkc192dGRfd2EoaTkx NSkpCisJCWdndHQtPnZtLmNsZWFyX3JhbmdlID0gZ2VuOF9nZ3R0X2NsZWFyX3JhbmdlOworCisJ Z2d0dC0+dm0uaW5zZXJ0X2VudHJpZXMgPSBnZW44X2dndHRfaW5zZXJ0X2VudHJpZXM7CisKKwkv KiBTZXJpYWxpemUgR1RUIHVwZGF0ZXMgd2l0aCBhcGVydHVyZSBhY2Nlc3Mgb24gQlhUIGlmIFZU LWQgaXMgb24uICovCisJaWYgKGludGVsX2dndHRfdXBkYXRlX25lZWRzX3Z0ZF93YShpOTE1KSB8 fAorCSAgICBJU19DSEVSUllWSUVXKGk5MTUpIC8qIGZhaWxzIHdpdGggY29uY3VycmVudCB1c2Uv dXBkYXRlICovKSB7CisJCWdndHQtPnZtLmluc2VydF9lbnRyaWVzID0gYnh0X3Z0ZF9nZ3R0X2lu c2VydF9lbnRyaWVzX19CS0w7CisJCWdndHQtPnZtLmluc2VydF9wYWdlICAgID0gYnh0X3Z0ZF9n Z3R0X2luc2VydF9wYWdlX19CS0w7CisJCWlmIChnZ3R0LT52bS5jbGVhcl9yYW5nZSAhPSBub3Bf Y2xlYXJfcmFuZ2UpCisJCQlnZ3R0LT52bS5jbGVhcl9yYW5nZSA9IGJ4dF92dGRfZ2d0dF9jbGVh cl9yYW5nZV9fQktMOworCX0KKworCWdndHQtPmludmFsaWRhdGUgPSBnZW44X2dndHRfaW52YWxp ZGF0ZTsKKworCWdndHQtPnZtLnZtYV9vcHMuYmluZF92bWEgICAgPSBnZ3R0X2JpbmRfdm1hOwor CWdndHQtPnZtLnZtYV9vcHMudW5iaW5kX3ZtYSAgPSBnZ3R0X3VuYmluZF92bWE7CisJZ2d0dC0+ dm0udm1hX29wcy5zZXRfcGFnZXMgICA9IGdndHRfc2V0X3BhZ2VzOworCWdndHQtPnZtLnZtYV9v cHMuY2xlYXJfcGFnZXMgPSBjbGVhcl9wYWdlczsKKworCWdndHQtPnZtLnB0ZV9lbmNvZGUgPSBn ZW44X3B0ZV9lbmNvZGU7CisKKwlzZXR1cF9wcml2YXRlX3BhdChnZ3R0LT52bS5ndC0+dW5jb3Jl KTsKKworCXJldHVybiBnZ3R0X3Byb2JlX2NvbW1vbihnZ3R0LCBzaXplKTsKK30KKworc3RhdGlj IGludCBnZW42X2dtY2hfcHJvYmUoc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCkKK3sKKwlzdHJ1Y3Qg ZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGdndHQtPnZtLmk5MTU7CisJc3RydWN0IHBjaV9kZXYg KnBkZXYgPSBpOTE1LT5kcm0ucGRldjsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl1MTYgc25iX2dt Y2hfY3RsOworCWludCBlcnI7CisKKwlnZ3R0LT5nbWFkciA9IHBjaV9yZXNvdXJjZShwZGV2LCAy KTsKKwlnZ3R0LT5tYXBwYWJsZV9lbmQgPSByZXNvdXJjZV9zaXplKCZnZ3R0LT5nbWFkcik7CisK KwkvKiA2NC81MTJNQiBpcyB0aGUgY3VycmVudCBtaW4vbWF4IHdlIGFjdHVhbGx5IGtub3cgb2Ys IGJ1dCB0aGlzIGlzIGp1c3QKKwkgKiBhIGNvYXJzZSBzYW5pdHkgY2hlY2suCisJICovCisJaWYg KGdndHQtPm1hcHBhYmxlX2VuZCA8ICg2NDw8MjApIHx8IGdndHQtPm1hcHBhYmxlX2VuZCA+ICg1 MTI8PDIwKSkgeworCQlEUk1fRVJST1IoIlVua25vd24gR01BRFIgc2l6ZSAoJXBhKVxuIiwgJmdn dHQtPm1hcHBhYmxlX2VuZCk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJZXJyID0gcGNpX3Nl dF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNDApKTsKKwlpZiAoIWVycikKKwkJZXJyID0g cGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg0MCkpOworCWlm IChlcnIpCisJCURSTV9FUlJPUigiQ2FuJ3Qgc2V0IERNQSBtYXNrL2NvbnNpc3RlbnQgbWFzayAo JWQpXG4iLCBlcnIpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFNOQl9HTUNIX0NUUkws ICZzbmJfZ21jaF9jdGwpOworCisJc2l6ZSA9IGdlbjZfZ2V0X3RvdGFsX2d0dF9zaXplKHNuYl9n bWNoX2N0bCk7CisJZ2d0dC0+dm0udG90YWwgPSAoc2l6ZSAvIHNpemVvZihnZW42X3B0ZV90KSkg KiBJOTE1X0dUVF9QQUdFX1NJWkU7CisKKwlnZ3R0LT52bS5jbGVhcl9yYW5nZSA9IG5vcF9jbGVh cl9yYW5nZTsKKwlpZiAoIUhBU19GVUxMX1BQR1RUKGk5MTUpIHx8IGludGVsX3NjYW5vdXRfbmVl ZHNfdnRkX3dhKGk5MTUpKQorCQlnZ3R0LT52bS5jbGVhcl9yYW5nZSA9IGdlbjZfZ2d0dF9jbGVh cl9yYW5nZTsKKwlnZ3R0LT52bS5pbnNlcnRfcGFnZSA9IGdlbjZfZ2d0dF9pbnNlcnRfcGFnZTsK KwlnZ3R0LT52bS5pbnNlcnRfZW50cmllcyA9IGdlbjZfZ2d0dF9pbnNlcnRfZW50cmllczsKKwln Z3R0LT52bS5jbGVhbnVwID0gZ2VuNl9nbWNoX3JlbW92ZTsKKworCWdndHQtPmludmFsaWRhdGUg PSBnZW42X2dndHRfaW52YWxpZGF0ZTsKKworCWlmIChIQVNfRURSQU0oaTkxNSkpCisJCWdndHQt PnZtLnB0ZV9lbmNvZGUgPSBpcmlzX3B0ZV9lbmNvZGU7CisJZWxzZSBpZiAoSVNfSEFTV0VMTChp OTE1KSkKKwkJZ2d0dC0+dm0ucHRlX2VuY29kZSA9IGhzd19wdGVfZW5jb2RlOworCWVsc2UgaWYg KElTX1ZBTExFWVZJRVcoaTkxNSkpCisJCWdndHQtPnZtLnB0ZV9lbmNvZGUgPSBieXRfcHRlX2Vu Y29kZTsKKwllbHNlIGlmIChJTlRFTF9HRU4oaTkxNSkgPj0gNykKKwkJZ2d0dC0+dm0ucHRlX2Vu Y29kZSA9IGl2Yl9wdGVfZW5jb2RlOworCWVsc2UKKwkJZ2d0dC0+dm0ucHRlX2VuY29kZSA9IHNu Yl9wdGVfZW5jb2RlOworCisJZ2d0dC0+dm0udm1hX29wcy5iaW5kX3ZtYSAgICA9IGdndHRfYmlu ZF92bWE7CisJZ2d0dC0+dm0udm1hX29wcy51bmJpbmRfdm1hICA9IGdndHRfdW5iaW5kX3ZtYTsK KwlnZ3R0LT52bS52bWFfb3BzLnNldF9wYWdlcyAgID0gZ2d0dF9zZXRfcGFnZXM7CisJZ2d0dC0+ dm0udm1hX29wcy5jbGVhcl9wYWdlcyA9IGNsZWFyX3BhZ2VzOworCisJcmV0dXJuIGdndHRfcHJv YmVfY29tbW9uKGdndHQsIHNpemUpOworfQorCitzdGF0aWMgdm9pZCBpOTE1X2dtY2hfcmVtb3Zl KHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKQoreworCWludGVsX2dtY2hfcmVtb3ZlKCk7 Cit9CisKK3N0YXRpYyBpbnQgaTkxNV9nbWNoX3Byb2JlKHN0cnVjdCBpOTE1X2dndHQgKmdndHQp Cit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBnZ3R0LT52bS5pOTE1OworCXBo eXNfYWRkcl90IGdtYWRyX2Jhc2U7CisJaW50IHJldDsKKworCXJldCA9IGludGVsX2dtY2hfcHJv YmUoaTkxNS0+YnJpZGdlX2RldiwgaTkxNS0+ZHJtLnBkZXYsIE5VTEwpOworCWlmICghcmV0KSB7 CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIHNldCB1cCBnbWNoXG4iKTsKKwkJcmV0dXJuIC1FSU87 CisJfQorCisJaW50ZWxfZ3R0X2dldCgmZ2d0dC0+dm0udG90YWwsICZnbWFkcl9iYXNlLCAmZ2d0 dC0+bWFwcGFibGVfZW5kKTsKKworCWdndHQtPmdtYWRyID0KKwkJKHN0cnVjdCByZXNvdXJjZSkg REVGSU5FX1JFU19NRU0oZ21hZHJfYmFzZSwKKwkJCQkJCSBnZ3R0LT5tYXBwYWJsZV9lbmQpOwor CisJZ2d0dC0+ZG9faWRsZV9tYXBzID0gbmVlZHNfaWRsZV9tYXBzKGk5MTUpOworCWdndHQtPnZt Lmluc2VydF9wYWdlID0gaTkxNV9nZ3R0X2luc2VydF9wYWdlOworCWdndHQtPnZtLmluc2VydF9l bnRyaWVzID0gaTkxNV9nZ3R0X2luc2VydF9lbnRyaWVzOworCWdndHQtPnZtLmNsZWFyX3Jhbmdl ID0gaTkxNV9nZ3R0X2NsZWFyX3JhbmdlOworCWdndHQtPnZtLmNsZWFudXAgPSBpOTE1X2dtY2hf cmVtb3ZlOworCisJZ2d0dC0+aW52YWxpZGF0ZSA9IGdtY2hfZ2d0dF9pbnZhbGlkYXRlOworCisJ Z2d0dC0+dm0udm1hX29wcy5iaW5kX3ZtYSAgICA9IGdndHRfYmluZF92bWE7CisJZ2d0dC0+dm0u dm1hX29wcy51bmJpbmRfdm1hICA9IGdndHRfdW5iaW5kX3ZtYTsKKwlnZ3R0LT52bS52bWFfb3Bz LnNldF9wYWdlcyAgID0gZ2d0dF9zZXRfcGFnZXM7CisJZ2d0dC0+dm0udm1hX29wcy5jbGVhcl9w YWdlcyA9IGNsZWFyX3BhZ2VzOworCisJaWYgKHVubGlrZWx5KGdndHQtPmRvX2lkbGVfbWFwcykp CisJCWRldl9ub3RpY2UoaTkxNS0+ZHJtLmRldiwKKwkJCSAgICJBcHBseWluZyBJcm9ubGFrZSBx dWlya3MgZm9yIGludGVsX2lvbW11XG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50 IGdndHRfcHJvYmVfaHcoc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCwgc3RydWN0IGludGVsX2d0ICpn dCkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGd0LT5pOTE1OworCWludCBy ZXQ7CisKKwlnZ3R0LT52bS5ndCA9IGd0OworCWdndHQtPnZtLmk5MTUgPSBpOTE1OworCWdndHQt PnZtLmRtYSA9ICZpOTE1LT5kcm0ucGRldi0+ZGV2OworCisJaWYgKElOVEVMX0dFTihpOTE1KSA8 PSA1KQorCQlyZXQgPSBpOTE1X2dtY2hfcHJvYmUoZ2d0dCk7CisJZWxzZSBpZiAoSU5URUxfR0VO KGk5MTUpIDwgOCkKKwkJcmV0ID0gZ2VuNl9nbWNoX3Byb2JlKGdndHQpOworCWVsc2UKKwkJcmV0 ID0gZ2VuOF9nbWNoX3Byb2JlKGdndHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlp ZiAoKGdndHQtPnZtLnRvdGFsIC0gMSkgPj4gMzIpIHsKKwkJRFJNX0VSUk9SKCJXZSBuZXZlciBl eHBlY3RlZCBhIEdsb2JhbCBHVFQgd2l0aCBtb3JlIHRoYW4gMzJiaXRzIgorCQkJICAiIG9mIGFk ZHJlc3Mgc3BhY2UhIEZvdW5kICVsbGRNIVxuIiwKKwkJCSAgZ2d0dC0+dm0udG90YWwgPj4gMjAp OworCQlnZ3R0LT52bS50b3RhbCA9IDFVTEwgPDwgMzI7CisJCWdndHQtPm1hcHBhYmxlX2VuZCA9 CisJCQltaW5fdCh1NjQsIGdndHQtPm1hcHBhYmxlX2VuZCwgZ2d0dC0+dm0udG90YWwpOworCX0K KworCWlmIChnZ3R0LT5tYXBwYWJsZV9lbmQgPiBnZ3R0LT52bS50b3RhbCkgeworCQlEUk1fRVJS T1IoIm1hcHBhYmxlIGFwZXJ0dXJlIGV4dGVuZHMgcGFzdCBlbmQgb2YgR0dUVCwiCisJCQkgICIg YXBlcnR1cmU9JXBhLCB0b3RhbD0lbGx4XG4iLAorCQkJICAmZ2d0dC0+bWFwcGFibGVfZW5kLCBn Z3R0LT52bS50b3RhbCk7CisJCWdndHQtPm1hcHBhYmxlX2VuZCA9IGdndHQtPnZtLnRvdGFsOwor CX0KKworCS8qIEdNQURSIGlzIHRoZSBQQ0kgbW1pbyBhcGVydHVyZSBpbnRvIHRoZSBnbG9iYWwg R1RULiAqLworCURSTV9ERUJVR19EUklWRVIoIkdHVFQgc2l6ZSA9ICVsbHVNXG4iLCBnZ3R0LT52 bS50b3RhbCA+PiAyMCk7CisJRFJNX0RFQlVHX0RSSVZFUigiR01BRFIgc2l6ZSA9ICVsbHVNXG4i LCAodTY0KWdndHQtPm1hcHBhYmxlX2VuZCA+PiAyMCk7CisJRFJNX0RFQlVHX0RSSVZFUigiRFNN IHNpemUgPSAlbGx1TVxuIiwKKwkJCSAodTY0KXJlc291cmNlX3NpemUoJmludGVsX2dyYXBoaWNz X3N0b2xlbl9yZXMpID4+IDIwKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGk5MTVfZ2d0 dF9wcm9iZV9odyAtIFByb2JlIEdHVFQgaGFyZHdhcmUgbG9jYXRpb24KKyAqIEBpOTE1OiBpOTE1 IGRldmljZQorICovCitpbnQgaTkxNV9nZ3R0X3Byb2JlX2h3KHN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICppOTE1KQoreworCWludCByZXQ7CisKKwlyZXQgPSBnZ3R0X3Byb2JlX2h3KCZpOTE1LT5n Z3R0LCAmaTkxNS0+Z3QpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoaW50ZWxf dnRkX2FjdGl2ZSgpKQorCQlkZXZfaW5mbyhpOTE1LT5kcm0uZGV2LCAiVlQtZCBhY3RpdmUgZm9y IGdmeCBhY2Nlc3NcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpOTE1X2dndHRfZW5hYmxl X2h3KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1KQoreworCWlmIChJTlRFTF9HRU4oaTkx NSkgPCA2ICYmICFpbnRlbF9lbmFibGVfZ3R0KCkpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJu IDA7Cit9CisKK3ZvaWQgaTkxNV9nZ3R0X2VuYWJsZV9ndWMoc3RydWN0IGk5MTVfZ2d0dCAqZ2d0 dCkKK3sKKwlHRU1fQlVHX09OKGdndHQtPmludmFsaWRhdGUgIT0gZ2VuOF9nZ3R0X2ludmFsaWRh dGUpOworCisJZ2d0dC0+aW52YWxpZGF0ZSA9IGd1Y19nZ3R0X2ludmFsaWRhdGU7CisKKwlnZ3R0 LT5pbnZhbGlkYXRlKGdndHQpOworfQorCit2b2lkIGk5MTVfZ2d0dF9kaXNhYmxlX2d1YyhzdHJ1 Y3QgaTkxNV9nZ3R0ICpnZ3R0KQoreworCS8qIFhYWCBUZW1wb3JhcnkgcGFyZG9uIGZvciBlcnJv ciB1bmxvYWQgKi8KKwlpZiAoZ2d0dC0+aW52YWxpZGF0ZSA9PSBnZW44X2dndHRfaW52YWxpZGF0 ZSkKKwkJcmV0dXJuOworCisJLyogV2Ugc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGk5MTVf Z2d0dF9lbmFibGVfZ3VjKCkgKi8KKwlHRU1fQlVHX09OKGdndHQtPmludmFsaWRhdGUgIT0gZ3Vj X2dndHRfaW52YWxpZGF0ZSk7CisKKwlnZ3R0LT5pbnZhbGlkYXRlID0gZ2VuOF9nZ3R0X2ludmFs aWRhdGU7CisKKwlnZ3R0LT5pbnZhbGlkYXRlKGdndHQpOworfQorCitzdGF0aWMgdm9pZCBnZ3R0 X3Jlc3RvcmVfbWFwcGluZ3Moc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCkKK3sKKwlzdHJ1Y3QgaTkx NV92bWEgKnZtYSwgKnZuOworCWJvb2wgZmx1c2ggPSBmYWxzZTsKKwlpbnQgb3BlbjsKKworCWlu dGVsX2d0X2NoZWNrX2FuZF9jbGVhcl9mYXVsdHMoZ2d0dC0+dm0uZ3QpOworCisJbXV0ZXhfbG9j aygmZ2d0dC0+dm0ubXV0ZXgpOworCisJLyogRmlyc3QgZmlsbCBvdXIgcG9ydGlvbiBvZiB0aGUg R1RUIHdpdGggc2NyYXRjaCBwYWdlcyAqLworCWdndHQtPnZtLmNsZWFyX3JhbmdlKCZnZ3R0LT52 bSwgMCwgZ2d0dC0+dm0udG90YWwpOworCisJLyogU2tpcCByZXdyaXRpbmcgUFRFIG9uIFZNQSB1 bmJpbmQuICovCisJb3BlbiA9IGF0b21pY194Y2hnKCZnZ3R0LT52bS5vcGVuLCAwKTsKKworCS8q IGNsZmx1c2ggb2JqZWN0cyBib3VuZCBpbnRvIHRoZSBHR1RUIGFuZCByZWJpbmQgdGhlbS4gKi8K KwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodm1hLCB2biwgJmdndHQtPnZtLmJvdW5kX2xpc3Qs IHZtX2xpbmspIHsKKwkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IHZtYS0+b2Jq OworCisJCWlmICghaTkxNV92bWFfaXNfYm91bmQodm1hLCBJOTE1X1ZNQV9HTE9CQUxfQklORCkp CisJCQljb250aW51ZTsKKworCQlpZiAoIV9faTkxNV92bWFfdW5iaW5kKHZtYSkpCisJCQljb250 aW51ZTsKKworCQljbGVhcl9iaXQoSTkxNV9WTUFfR0xPQkFMX0JJTkRfQklULCBfX2k5MTVfdm1h X2ZsYWdzKHZtYSkpOworCQlXQVJOX09OKGk5MTVfdm1hX2JpbmQodm1hLAorCQkJCSAgICAgIG9i aiA/IG9iai0+Y2FjaGVfbGV2ZWwgOiAwLAorCQkJCSAgICAgIFBJTl9HTE9CQUwsIE5VTEwpKTsK KwkJaWYgKG9iaikgeyAvKiBvbmx5IHVzZWQgZHVyaW5nIHJlc3VtZSA9PiBleGNsdXNpdmUgYWNj ZXNzICovCisJCQlmbHVzaCB8PSBmZXRjaF9hbmRfemVybygmb2JqLT53cml0ZV9kb21haW4pOwor CQkJb2JqLT5yZWFkX2RvbWFpbnMgfD0gSTkxNV9HRU1fRE9NQUlOX0dUVDsKKwkJfQorCX0KKwor CWF0b21pY19zZXQoJmdndHQtPnZtLm9wZW4sIG9wZW4pOworCWdndHQtPmludmFsaWRhdGUoZ2d0 dCk7CisKKwltdXRleF91bmxvY2soJmdndHQtPnZtLm11dGV4KTsKKworCWlmIChmbHVzaCkKKwkJ d2JpbnZkX29uX2FsbF9jcHVzKCk7Cit9CisKK3ZvaWQgaTkxNV9nZW1fcmVzdG9yZV9ndHRfbWFw cGluZ3Moc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUpCit7CisJc3RydWN0IGk5MTVfZ2d0 dCAqZ2d0dCA9ICZpOTE1LT5nZ3R0OworCisJZ2d0dF9yZXN0b3JlX21hcHBpbmdzKGdndHQpOwor CisJaWYgKElOVEVMX0dFTihpOTE1KSA+PSA4KQorCQlzZXR1cF9wcml2YXRlX3BhdChnZ3R0LT52 bS5ndC0+dW5jb3JlKTsKK30KKworc3RhdGljIHN0cnVjdCBzY2F0dGVybGlzdCAqCityb3RhdGVf cGFnZXMoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgdW5zaWduZWQgaW50IG9mZnNl dCwKKwkgICAgIHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwKKwkgICAg IHVuc2lnbmVkIGludCBzdHJpZGUsCisJICAgICBzdHJ1Y3Qgc2dfdGFibGUgKnN0LCBzdHJ1Y3Qg c2NhdHRlcmxpc3QgKnNnKQoreworCXVuc2lnbmVkIGludCBjb2x1bW4sIHJvdzsKKwl1bnNpZ25l ZCBpbnQgc3JjX2lkeDsKKworCWZvciAoY29sdW1uID0gMDsgY29sdW1uIDwgd2lkdGg7IGNvbHVt bisrKSB7CisJCXNyY19pZHggPSBzdHJpZGUgKiAoaGVpZ2h0IC0gMSkgKyBjb2x1bW4gKyBvZmZz ZXQ7CisJCWZvciAocm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworCQkJc3QtPm5lbnRz Kys7CisJCQkvKiBXZSBkb24ndCBuZWVkIHRoZSBwYWdlcywgYnV0IG5lZWQgdG8gaW5pdGlhbGl6 ZQorCQkJICogdGhlIGVudHJpZXMgc28gdGhlIHNnIGxpc3QgY2FuIGJlIGhhcHBpbHkgdHJhdmVy c2VkLgorCQkJICogVGhlIG9ubHkgdGhpbmcgd2UgbmVlZCBhcmUgRE1BIGFkZHJlc3Nlcy4KKwkJ CSAqLworCQkJc2dfc2V0X3BhZ2Uoc2csIE5VTEwsIEk5MTVfR1RUX1BBR0VfU0laRSwgMCk7CisJ CQlzZ19kbWFfYWRkcmVzcyhzZykgPQorCQkJCWk5MTVfZ2VtX29iamVjdF9nZXRfZG1hX2FkZHJl c3Mob2JqLCBzcmNfaWR4KTsKKwkJCXNnX2RtYV9sZW4oc2cpID0gSTkxNV9HVFRfUEFHRV9TSVpF OworCQkJc2cgPSBzZ19uZXh0KHNnKTsKKwkJCXNyY19pZHggLT0gc3RyaWRlOworCQl9CisJfQor CisJcmV0dXJuIHNnOworfQorCitzdGF0aWMgbm9pbmxpbmUgc3RydWN0IHNnX3RhYmxlICoKK2lu dGVsX3JvdGF0ZV9wYWdlcyhzdHJ1Y3QgaW50ZWxfcm90YXRpb25faW5mbyAqcm90X2luZm8sCisJ CSAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJdW5zaWduZWQgaW50IHNp emUgPSBpbnRlbF9yb3RhdGlvbl9pbmZvX3NpemUocm90X2luZm8pOworCXN0cnVjdCBzZ190YWJs ZSAqc3Q7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKwlp bnQgaTsKKworCS8qIEFsbG9jYXRlIHRhcmdldCBTRyBsaXN0LiAqLworCXN0ID0ga21hbGxvYyhz aXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdCkKKwkJZ290byBlcnJfc3RfYWxsb2M7 CisKKwlyZXQgPSBzZ19hbGxvY190YWJsZShzdCwgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJl dCkKKwkJZ290byBlcnJfc2dfYWxsb2M7CisKKwlzdC0+bmVudHMgPSAwOworCXNnID0gc3QtPnNn bDsKKworCWZvciAoaSA9IDAgOyBpIDwgQVJSQVlfU0laRShyb3RfaW5mby0+cGxhbmUpOyBpKysp IHsKKwkJc2cgPSByb3RhdGVfcGFnZXMob2JqLCByb3RfaW5mby0+cGxhbmVbaV0ub2Zmc2V0LAor CQkJCSAgcm90X2luZm8tPnBsYW5lW2ldLndpZHRoLCByb3RfaW5mby0+cGxhbmVbaV0uaGVpZ2h0 LAorCQkJCSAgcm90X2luZm8tPnBsYW5lW2ldLnN0cmlkZSwgc3QsIHNnKTsKKwl9CisKKwlyZXR1 cm4gc3Q7CisKK2Vycl9zZ19hbGxvYzoKKwlrZnJlZShzdCk7CitlcnJfc3RfYWxsb2M6CisKKwlE Uk1fREVCVUdfRFJJVkVSKCJGYWlsZWQgdG8gY3JlYXRlIHJvdGF0ZWQgbWFwcGluZyBmb3Igb2Jq ZWN0IHNpemUgJXp1ISAoJXV4JXUgdGlsZXMsICV1IHBhZ2VzKVxuIiwKKwkJCSBvYmotPmJhc2Uu c2l6ZSwgcm90X2luZm8tPnBsYW5lWzBdLndpZHRoLCByb3RfaW5mby0+cGxhbmVbMF0uaGVpZ2h0 LCBzaXplKTsKKworCXJldHVybiBFUlJfUFRSKHJldCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2Nh dHRlcmxpc3QgKgorcmVtYXBfcGFnZXMoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwg dW5zaWduZWQgaW50IG9mZnNldCwKKwkgICAgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBp bnQgaGVpZ2h0LAorCSAgICB1bnNpZ25lZCBpbnQgc3RyaWRlLAorCSAgICBzdHJ1Y3Qgc2dfdGFi bGUgKnN0LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnKQoreworCXVuc2lnbmVkIGludCByb3c7CisK Kwlmb3IgKHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKwkJdW5zaWduZWQgaW50IGxl ZnQgPSB3aWR0aCAqIEk5MTVfR1RUX1BBR0VfU0laRTsKKworCQl3aGlsZSAobGVmdCkgeworCQkJ ZG1hX2FkZHJfdCBhZGRyOworCQkJdW5zaWduZWQgaW50IGxlbmd0aDsKKworCQkJLyogV2UgZG9u J3QgbmVlZCB0aGUgcGFnZXMsIGJ1dCBuZWVkIHRvIGluaXRpYWxpemUKKwkJCSAqIHRoZSBlbnRy aWVzIHNvIHRoZSBzZyBsaXN0IGNhbiBiZSBoYXBwaWx5IHRyYXZlcnNlZC4KKwkJCSAqIFRoZSBv bmx5IHRoaW5nIHdlIG5lZWQgYXJlIERNQSBhZGRyZXNzZXMuCisJCQkgKi8KKworCQkJYWRkciA9 IGk5MTVfZ2VtX29iamVjdF9nZXRfZG1hX2FkZHJlc3NfbGVuKG9iaiwgb2Zmc2V0LCAmbGVuZ3Ro KTsKKworCQkJbGVuZ3RoID0gbWluKGxlZnQsIGxlbmd0aCk7CisKKwkJCXN0LT5uZW50cysrOwor CisJCQlzZ19zZXRfcGFnZShzZywgTlVMTCwgbGVuZ3RoLCAwKTsKKwkJCXNnX2RtYV9hZGRyZXNz KHNnKSA9IGFkZHI7CisJCQlzZ19kbWFfbGVuKHNnKSA9IGxlbmd0aDsKKwkJCXNnID0gc2dfbmV4 dChzZyk7CisKKwkJCW9mZnNldCArPSBsZW5ndGggLyBJOTE1X0dUVF9QQUdFX1NJWkU7CisJCQls ZWZ0IC09IGxlbmd0aDsKKwkJfQorCisJCW9mZnNldCArPSBzdHJpZGUgLSB3aWR0aDsKKwl9CisK KwlyZXR1cm4gc2c7Cit9CisKK3N0YXRpYyBub2lubGluZSBzdHJ1Y3Qgc2dfdGFibGUgKgoraW50 ZWxfcmVtYXBfcGFnZXMoc3RydWN0IGludGVsX3JlbWFwcGVkX2luZm8gKnJlbV9pbmZvLAorCQkg IHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJdW5zaWduZWQgaW50IHNpemUg PSBpbnRlbF9yZW1hcHBlZF9pbmZvX3NpemUocmVtX2luZm8pOworCXN0cnVjdCBzZ190YWJsZSAq c3Q7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKwlpbnQg aTsKKworCS8qIEFsbG9jYXRlIHRhcmdldCBTRyBsaXN0LiAqLworCXN0ID0ga21hbGxvYyhzaXpl b2YoKnN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdCkKKwkJZ290byBlcnJfc3RfYWxsb2M7CisK KwlyZXQgPSBzZ19hbGxvY190YWJsZShzdCwgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldCkK KwkJZ290byBlcnJfc2dfYWxsb2M7CisKKwlzdC0+bmVudHMgPSAwOworCXNnID0gc3QtPnNnbDsK KworCWZvciAoaSA9IDAgOyBpIDwgQVJSQVlfU0laRShyZW1faW5mby0+cGxhbmUpOyBpKyspIHsK KwkJc2cgPSByZW1hcF9wYWdlcyhvYmosIHJlbV9pbmZvLT5wbGFuZVtpXS5vZmZzZXQsCisJCQkJ IHJlbV9pbmZvLT5wbGFuZVtpXS53aWR0aCwgcmVtX2luZm8tPnBsYW5lW2ldLmhlaWdodCwKKwkJ CQkgcmVtX2luZm8tPnBsYW5lW2ldLnN0cmlkZSwgc3QsIHNnKTsKKwl9CisKKwlpOTE1X3NnX3Ry aW0oc3QpOworCisJcmV0dXJuIHN0OworCitlcnJfc2dfYWxsb2M6CisJa2ZyZWUoc3QpOworZXJy X3N0X2FsbG9jOgorCisJRFJNX0RFQlVHX0RSSVZFUigiRmFpbGVkIHRvIGNyZWF0ZSByZW1hcHBl ZCBtYXBwaW5nIGZvciBvYmplY3Qgc2l6ZSAlenUhICgldXgldSB0aWxlcywgJXUgcGFnZXMpXG4i LAorCQkJIG9iai0+YmFzZS5zaXplLCByZW1faW5mby0+cGxhbmVbMF0ud2lkdGgsIHJlbV9pbmZv LT5wbGFuZVswXS5oZWlnaHQsIHNpemUpOworCisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KKwor c3RhdGljIG5vaW5saW5lIHN0cnVjdCBzZ190YWJsZSAqCitpbnRlbF9wYXJ0aWFsX3BhZ2VzKGNv bnN0IHN0cnVjdCBpOTE1X2dndHRfdmlldyAqdmlldywKKwkJICAgIHN0cnVjdCBkcm1faTkxNV9n ZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IHNnX3RhYmxlICpzdDsKKwlzdHJ1Y3Qgc2NhdHRl cmxpc3QgKnNnLCAqaXRlcjsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSB2aWV3LT5wYXJ0aWFsLnNp emU7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKworCXN0ID0g a21hbGxvYyhzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdCkKKwkJZ290byBlcnJf c3RfYWxsb2M7CisKKwlyZXQgPSBzZ19hbGxvY190YWJsZShzdCwgY291bnQsIEdGUF9LRVJORUwp OworCWlmIChyZXQpCisJCWdvdG8gZXJyX3NnX2FsbG9jOworCisJaXRlciA9IGk5MTVfZ2VtX29i amVjdF9nZXRfc2cob2JqLCB2aWV3LT5wYXJ0aWFsLm9mZnNldCwgJm9mZnNldCk7CisJR0VNX0JV R19PTighaXRlcik7CisKKwlzZyA9IHN0LT5zZ2w7CisJc3QtPm5lbnRzID0gMDsKKwlkbyB7CisJ CXVuc2lnbmVkIGludCBsZW47CisKKwkJbGVuID0gbWluKGl0ZXItPmxlbmd0aCAtIChvZmZzZXQg PDwgUEFHRV9TSElGVCksCisJCQkgIGNvdW50IDw8IFBBR0VfU0hJRlQpOworCQlzZ19zZXRfcGFn ZShzZywgTlVMTCwgbGVuLCAwKTsKKwkJc2dfZG1hX2FkZHJlc3Moc2cpID0KKwkJCXNnX2RtYV9h ZGRyZXNzKGl0ZXIpICsgKG9mZnNldCA8PCBQQUdFX1NISUZUKTsKKwkJc2dfZG1hX2xlbihzZykg PSBsZW47CisKKwkJc3QtPm5lbnRzKys7CisJCWNvdW50IC09IGxlbiA+PiBQQUdFX1NISUZUOwor CQlpZiAoY291bnQgPT0gMCkgeworCQkJc2dfbWFya19lbmQoc2cpOworCQkJaTkxNV9zZ190cmlt KHN0KTsgLyogRHJvcCBhbnkgdW51c2VkIHRhaWwgZW50cmllcy4gKi8KKworCQkJcmV0dXJuIHN0 OworCQl9CisKKwkJc2cgPSBfX3NnX25leHQoc2cpOworCQlpdGVyID0gX19zZ19uZXh0KGl0ZXIp OworCQlvZmZzZXQgPSAwOworCX0gd2hpbGUgKDEpOworCitlcnJfc2dfYWxsb2M6CisJa2ZyZWUo c3QpOworZXJyX3N0X2FsbG9jOgorCXJldHVybiBFUlJfUFRSKHJldCk7Cit9CisKK3N0YXRpYyBp bnQKK2k5MTVfZ2V0X2dndHRfdm1hX3BhZ2VzKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCWlu dCByZXQ7CisKKwkvKiBUaGUgdm1hLT5wYWdlcyBhcmUgb25seSB2YWxpZCB3aXRoaW4gdGhlIGxp ZmVzcGFuIG9mIHRoZSBib3Jyb3dlZAorCSAqIG9iai0+bW0ucGFnZXMuIFdoZW4gdGhlIG9iai0+ bW0ucGFnZXMgc2dfdGFibGUgaXMgcmVnZW5lcmF0ZWQsIHNvCisJICogbXVzdCBiZSB0aGUgdm1h LT5wYWdlcy4gQSBzaW1wbGUgcnVsZSBpcyB0aGF0IHZtYS0+cGFnZXMgbXVzdCBvbmx5CisJICog YmUgYWNjZXNzZWQgd2hlbiB0aGUgb2JqLT5tbS5wYWdlcyBhcmUgcGlubmVkLgorCSAqLworCUdF TV9CVUdfT04oIWk5MTVfZ2VtX29iamVjdF9oYXNfcGlubmVkX3BhZ2VzKHZtYS0+b2JqKSk7CisK Kwlzd2l0Y2ggKHZtYS0+Z2d0dF92aWV3LnR5cGUpIHsKKwlkZWZhdWx0OgorCQlHRU1fQlVHX09O KHZtYS0+Z2d0dF92aWV3LnR5cGUpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIEk5MTVf R0dUVF9WSUVXX05PUk1BTDoKKwkJdm1hLT5wYWdlcyA9IHZtYS0+b2JqLT5tbS5wYWdlczsKKwkJ cmV0dXJuIDA7CisKKwljYXNlIEk5MTVfR0dUVF9WSUVXX1JPVEFURUQ6CisJCXZtYS0+cGFnZXMg PQorCQkJaW50ZWxfcm90YXRlX3BhZ2VzKCZ2bWEtPmdndHRfdmlldy5yb3RhdGVkLCB2bWEtPm9i aik7CisJCWJyZWFrOworCisJY2FzZSBJOTE1X0dHVFRfVklFV19SRU1BUFBFRDoKKwkJdm1hLT5w YWdlcyA9CisJCQlpbnRlbF9yZW1hcF9wYWdlcygmdm1hLT5nZ3R0X3ZpZXcucmVtYXBwZWQsIHZt YS0+b2JqKTsKKwkJYnJlYWs7CisKKwljYXNlIEk5MTVfR0dUVF9WSUVXX1BBUlRJQUw6CisJCXZt YS0+cGFnZXMgPSBpbnRlbF9wYXJ0aWFsX3BhZ2VzKCZ2bWEtPmdndHRfdmlldywgdm1hLT5vYmop OworCQlicmVhazsKKwl9CisKKwlyZXQgPSAwOworCWlmIChJU19FUlIodm1hLT5wYWdlcykpIHsK KwkJcmV0ID0gUFRSX0VSUih2bWEtPnBhZ2VzKTsKKwkJdm1hLT5wYWdlcyA9IE5VTEw7CisJCURS TV9FUlJPUigiRmFpbGVkIHRvIGdldCBwYWdlcyBmb3IgVk1BIHZpZXcgdHlwZSAldSAoJWQpIVxu IiwKKwkJCSAgdm1hLT5nZ3R0X3ZpZXcudHlwZSwgcmV0KTsKKwl9CisJcmV0dXJuIHJldDsKK30K ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2d0dC5jIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfZ3R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMDAwLi4zMmU5ZTQ5ZjM2ODIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dw dS9kcm0vaTkxNS9ndC9pbnRlbF9ndHQuYwpAQCAtMCwwICsxLDcxNiBAQAorLy8gU1BEWC1MaWNl bnNlLUlkZW50aWZpZXI6IE1JVAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDIwIEludGVsIENvcnBv cmF0aW9uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4gLyogZmF1bHQtaW5qZWN0Lmgg aXMgbm90IHN0YW5kYWxvbmUhICovCisKKyNpbmNsdWRlIDxkcm0vaTkxNV9kcm0uaD4KKworI2lu Y2x1ZGUgImRpc3BsYXkvaW50ZWxfZnJvbnRidWZmZXIuaCIKKyNpbmNsdWRlICJndC9pbnRlbF9n dC5oIgorI2luY2x1ZGUgImd0L2ludGVsX2d0X3JlcXVlc3RzLmgiCisKKyNpbmNsdWRlICJpOTE1 X2Rydi5oIgorI2luY2x1ZGUgImk5MTVfc2NhdHRlcmxpc3QuaCIKKyNpbmNsdWRlICJpOTE1X3Ry YWNlLmgiCisjaW5jbHVkZSAiaTkxNV92Z3B1LmgiCisKKyNpbmNsdWRlICJnZW42X3BwZ3R0Lmgi CisjaW5jbHVkZSAiZ2VuOF9wcGd0dC5oIgorI2luY2x1ZGUgImludGVsX2d0dC5oIgorCit2b2lk IHN0YXNoX2luaXQoc3RydWN0IHBhZ2VzdGFzaCAqc3Rhc2gpCit7CisJcGFnZXZlY19pbml0KCZz dGFzaC0+cHZlYyk7CisJc3Bpbl9sb2NrX2luaXQoJnN0YXNoLT5sb2NrKTsKK30KKworc3RhdGlj IHN0cnVjdCBwYWdlICpzdGFzaF9wb3BfcGFnZShzdHJ1Y3QgcGFnZXN0YXNoICpzdGFzaCkKK3sK KwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CisKKwlzcGluX2xvY2soJnN0YXNoLT5sb2NrKTsK KwlpZiAobGlrZWx5KHN0YXNoLT5wdmVjLm5yKSkKKwkJcGFnZSA9IHN0YXNoLT5wdmVjLnBhZ2Vz Wy0tc3Rhc2gtPnB2ZWMubnJdOworCXNwaW5fdW5sb2NrKCZzdGFzaC0+bG9jayk7CisKKwlyZXR1 cm4gcGFnZTsKK30KKworc3RhdGljIHZvaWQgc3Rhc2hfcHVzaF9wYWdldmVjKHN0cnVjdCBwYWdl c3Rhc2ggKnN0YXNoLCBzdHJ1Y3QgcGFnZXZlYyAqcHZlYykKK3sKKwl1bnNpZ25lZCBpbnQgbnI7 CisKKwlzcGluX2xvY2tfbmVzdGVkKCZzdGFzaC0+bG9jaywgU0lOR0xFX0RFUFRIX05FU1RJTkcp OworCisJbnIgPSBtaW5fdCh0eXBlb2YobnIpLCBwdmVjLT5uciwgcGFnZXZlY19zcGFjZSgmc3Rh c2gtPnB2ZWMpKTsKKwltZW1jcHkoc3Rhc2gtPnB2ZWMucGFnZXMgKyBzdGFzaC0+cHZlYy5uciwK KwkgICAgICAgcHZlYy0+cGFnZXMgKyBwdmVjLT5uciAtIG5yLAorCSAgICAgICBzaXplb2YocHZl Yy0+cGFnZXNbMF0pICogbnIpOworCXN0YXNoLT5wdmVjLm5yICs9IG5yOworCisJc3Bpbl91bmxv Y2soJnN0YXNoLT5sb2NrKTsKKworCXB2ZWMtPm5yIC09IG5yOworfQorCitzdGF0aWMgc3RydWN0 IHBhZ2UgKnZtX2FsbG9jX3BhZ2Uoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sIGdmcF90 IGdmcCkKK3sKKwlzdHJ1Y3QgcGFnZXZlYyBzdGFjazsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwor CWlmIChJOTE1X1NFTEZURVNUX09OTFkoc2hvdWxkX2ZhaWwoJnZtLT5mYXVsdF9hdHRyLCAxKSkp CisJCWk5MTVfZ2VtX3Nocmlua19hbGwodm0tPmk5MTUpOworCisJcGFnZSA9IHN0YXNoX3BvcF9w YWdlKCZ2bS0+ZnJlZV9wYWdlcyk7CisJaWYgKHBhZ2UpCisJCXJldHVybiBwYWdlOworCisJaWYg KCF2bS0+cHRfa21hcF93YykKKwkJcmV0dXJuIGFsbG9jX3BhZ2UoZ2ZwKTsKKworCS8qIExvb2sg aW4gb3VyIGdsb2JhbCBzdGFzaCBvZiBXQyBwYWdlcy4uLiAqLworCXBhZ2UgPSBzdGFzaF9wb3Bf cGFnZSgmdm0tPmk5MTUtPm1tLndjX3N0YXNoKTsKKwlpZiAocGFnZSkKKwkJcmV0dXJuIHBhZ2U7 CisKKwkvKgorCSAqIE90aGVyd2lzZSBiYXRjaCBhbGxvY2F0ZSBwYWdlcyB0byBhbW9ydGl6ZSBj b3N0IG9mIHNldF9wYWdlc193Yy4KKwkgKgorCSAqIFdlIGhhdmUgdG8gYmUgY2FyZWZ1bCBhcyBw YWdlIGFsbG9jYXRpb24gbWF5IHRyaWdnZXIgdGhlIHNocmlua2VyCisJICogKHZpYSBkaXJlY3Qg cmVjbGFpbSkgd2hpY2ggd2lsbCBmaWxsIHVwIHRoZSBXQyBzdGFzaCB1bmRlcm5lYXRoIHVzLgor CSAqIFNvIHdlIGFkZCBvdXIgV0IgcGFnZXMgaW50byBhIHRlbXBvcmFyeSBwdmVjIG9uIHRoZSBz dGFjayBhbmQgbWVyZ2UKKwkgKiB0aGVtIGludG8gdGhlIFdDIHN0YXNoIGFmdGVyIGFsbCB0aGUg YWxsb2NhdGlvbnMgYXJlIGNvbXBsZXRlLgorCSAqLworCXBhZ2V2ZWNfaW5pdCgmc3RhY2spOwor CWRvIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkJcGFnZSA9IGFsbG9jX3BhZ2UoZ2ZwKTsK KwkJaWYgKHVubGlrZWx5KCFwYWdlKSkKKwkJCWJyZWFrOworCisJCXN0YWNrLnBhZ2VzW3N0YWNr Lm5yKytdID0gcGFnZTsKKwl9IHdoaWxlIChwYWdldmVjX3NwYWNlKCZzdGFjaykpOworCisJaWYg KHN0YWNrLm5yICYmICFzZXRfcGFnZXNfYXJyYXlfd2Moc3RhY2sucGFnZXMsIHN0YWNrLm5yKSkg eworCQlwYWdlID0gc3RhY2sucGFnZXNbLS1zdGFjay5ucl07CisKKwkJLyogTWVyZ2Ugc3BhcmUg V0MgcGFnZXMgdG8gdGhlIGdsb2JhbCBzdGFzaCAqLworCQlpZiAoc3RhY2subnIpCisJCQlzdGFz aF9wdXNoX3BhZ2V2ZWMoJnZtLT5pOTE1LT5tbS53Y19zdGFzaCwgJnN0YWNrKTsKKworCQkvKiBQ dXNoIGFueSBzdXJwbHVzIFdDIHBhZ2VzIG9udG8gdGhlIGxvY2FsIFZNIHN0YXNoICovCisJCWlm IChzdGFjay5ucikKKwkJCXN0YXNoX3B1c2hfcGFnZXZlYygmdm0tPmZyZWVfcGFnZXMsICZzdGFj ayk7CisJfQorCisJLyogUmV0dXJuIHVud2FudGVkIGxlZnRvdmVycyAqLworCWlmICh1bmxpa2Vs eShzdGFjay5ucikpIHsKKwkJV0FSTl9PTl9PTkNFKHNldF9wYWdlc19hcnJheV93YihzdGFjay5w YWdlcywgc3RhY2subnIpKTsKKwkJX19wYWdldmVjX3JlbGVhc2UoJnN0YWNrKTsKKwl9CisKKwly ZXR1cm4gcGFnZTsKK30KKworc3RhdGljIHZvaWQgdm1fZnJlZV9wYWdlc19yZWxlYXNlKHN0cnVj dCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAorCQkJCSAgYm9vbCBpbW1lZGlhdGUpCit7CisJc3Ry dWN0IHBhZ2V2ZWMgKnB2ZWMgPSAmdm0tPmZyZWVfcGFnZXMucHZlYzsKKwlzdHJ1Y3QgcGFnZXZl YyBzdGFjazsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnZtLT5mcmVlX3BhZ2VzLmxvY2spOwor CUdFTV9CVUdfT04oIXBhZ2V2ZWNfY291bnQocHZlYykpOworCisJaWYgKHZtLT5wdF9rbWFwX3dj KSB7CisJCS8qCisJCSAqIFdoZW4gd2UgdXNlIFdDLCBmaXJzdCBmaWxsIHVwIHRoZSBnbG9iYWwg c3Rhc2ggYW5kIHRoZW4KKwkJICogb25seSBpZiBmdWxsIGltbWVkaWF0ZWx5IGZyZWUgdGhlIG92 ZXJmbG93LgorCQkgKi8KKwkJc3Rhc2hfcHVzaF9wYWdldmVjKCZ2bS0+aTkxNS0+bW0ud2Nfc3Rh c2gsIHB2ZWMpOworCisJCS8qCisJCSAqIEFzIHdlIGhhdmUgbWFkZSBzb21lIHJvb20gaW4gdGhl IFZNJ3MgZnJlZV9wYWdlcywKKwkJICogd2UgY2FuIHdhaXQgZm9yIGl0IHRvIGZpbGwgYWdhaW4u IFVubGVzcyB3ZSBhcmUKKwkJICogaW5zaWRlIGk5MTVfYWRkcmVzc19zcGFjZV9maW5pKCkgYW5k IG11c3QKKwkJICogaW1tZWRpYXRlbHkgcmVsZWFzZSB0aGUgcGFnZXMhCisJCSAqLworCQlpZiAo cHZlYy0+bnIgPD0gKGltbWVkaWF0ZSA/IDAgOiBQQUdFVkVDX1NJWkUgLSAxKSkKKwkJCXJldHVy bjsKKworCQkvKgorCQkgKiBXZSBoYXZlIHRvIGRyb3AgdGhlIGxvY2sgdG8gYWxsb3cgb3Vyc2Vs dmVzIHRvIHNsZWVwLAorCQkgKiBzbyB0YWtlIGEgY29weSBvZiB0aGUgcHZlYyBhbmQgY2xlYXIg dGhlIHN0YXNoIGZvcgorCQkgKiBvdGhlcnMgdG8gdXNlIGl0IGFzIHdlIHNsZWVwLgorCQkgKi8K KwkJc3RhY2sgPSAqcHZlYzsKKwkJcGFnZXZlY19yZWluaXQocHZlYyk7CisJCXNwaW5fdW5sb2Nr KCZ2bS0+ZnJlZV9wYWdlcy5sb2NrKTsKKworCQlwdmVjID0gJnN0YWNrOworCQlzZXRfcGFnZXNf YXJyYXlfd2IocHZlYy0+cGFnZXMsIHB2ZWMtPm5yKTsKKworCQlzcGluX2xvY2soJnZtLT5mcmVl X3BhZ2VzLmxvY2spOworCX0KKworCV9fcGFnZXZlY19yZWxlYXNlKHB2ZWMpOworfQorCitzdGF0 aWMgdm9pZCB2bV9mcmVlX3BhZ2Uoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sIHN0cnVj dCBwYWdlICpwYWdlKQoreworCS8qCisJICogT24gIWxsYywgd2UgbmVlZCB0byBjaGFuZ2UgdGhl IHBhZ2VzIGJhY2sgdG8gV0IuIFdlIG9ubHkgZG8gc28KKwkgKiBpbiBidWxrLCBzbyB3ZSByYXJl bHkgbmVlZCB0byBjaGFuZ2UgdGhlIHBhZ2UgYXR0cmlidXRlcyBoZXJlLAorCSAqIGJ1dCBkb2lu ZyBzbyByZXF1aXJlcyBhIHN0b3BfbWFjaGluZSgpIGZyb20gZGVlcCBpbnNpZGUgYXJjaC94ODYv bW0uCisJICogVG8gbWFrZSBkZXRlY3Rpb24gb2YgdGhlIHBvc3NpYmxlIHNsZWVwIG1vcmUgbGlr ZWx5LCB1c2UgYW4KKwkgKiB1bmNvbmRpdGlvbmFsIG1pZ2h0X3NsZWVwKCkgZm9yIGV2ZXJ5Ym9k eS4KKwkgKi8KKwltaWdodF9zbGVlcCgpOworCXNwaW5fbG9jaygmdm0tPmZyZWVfcGFnZXMubG9j ayk7CisJd2hpbGUgKCFwYWdldmVjX3NwYWNlKCZ2bS0+ZnJlZV9wYWdlcy5wdmVjKSkKKwkJdm1f ZnJlZV9wYWdlc19yZWxlYXNlKHZtLCBmYWxzZSk7CisJR0VNX0JVR19PTihwYWdldmVjX2NvdW50 KCZ2bS0+ZnJlZV9wYWdlcy5wdmVjKSA+PSBQQUdFVkVDX1NJWkUpOworCXBhZ2V2ZWNfYWRkKCZ2 bS0+ZnJlZV9wYWdlcy5wdmVjLCBwYWdlKTsKKwlzcGluX3VubG9jaygmdm0tPmZyZWVfcGFnZXMu bG9jayk7Cit9CisKK3ZvaWQgX19pOTE1X3ZtX2Nsb3NlKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3Bh Y2UgKnZtKQoreworCXN0cnVjdCBpOTE1X3ZtYSAqdm1hLCAqdm47CisKKwltdXRleF9sb2NrKCZ2 bS0+bXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2bWEsIHZuLCAmdm0tPmJvdW5k X2xpc3QsIHZtX2xpbmspIHsKKwkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IHZt YS0+b2JqOworCisJCS8qIEtlZXAgdGhlIG9iaiAoYW5kIGhlbmNlIHRoZSB2bWEpIGFsaXZlIGFz IF93ZV8gZGVzdHJveSBpdCAqLworCQlpZiAoIWtyZWZfZ2V0X3VubGVzc196ZXJvKCZvYmotPmJh c2UucmVmY291bnQpKQorCQkJY29udGludWU7CisKKwkJYXRvbWljX2FuZCh+STkxNV9WTUFfUElO X01BU0ssICZ2bWEtPmZsYWdzKTsKKwkJV0FSTl9PTihfX2k5MTVfdm1hX3VuYmluZCh2bWEpKTsK KwkJX19pOTE1X3ZtYV9wdXQodm1hKTsKKworCQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisJ fQorCUdFTV9CVUdfT04oIWxpc3RfZW1wdHkoJnZtLT5ib3VuZF9saXN0KSk7CisJbXV0ZXhfdW5s b2NrKCZ2bS0+bXV0ZXgpOworfQorCisKK3ZvaWQgaTkxNV9hZGRyZXNzX3NwYWNlX2Zpbmkoc3Ry dWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pCit7CisJc3Bpbl9sb2NrKCZ2bS0+ZnJlZV9wYWdl cy5sb2NrKTsKKwlpZiAocGFnZXZlY19jb3VudCgmdm0tPmZyZWVfcGFnZXMucHZlYykpCisJCXZt X2ZyZWVfcGFnZXNfcmVsZWFzZSh2bSwgdHJ1ZSk7CisJR0VNX0JVR19PTihwYWdldmVjX2NvdW50 KCZ2bS0+ZnJlZV9wYWdlcy5wdmVjKSk7CisJc3Bpbl91bmxvY2soJnZtLT5mcmVlX3BhZ2VzLmxv Y2spOworCisJZHJtX21tX3Rha2Vkb3duKCZ2bS0+bW0pOworCisJbXV0ZXhfZGVzdHJveSgmdm0t Pm11dGV4KTsKK30KKworc3RhdGljIHZvaWQgX19pOTE1X3ZtX3JlbGVhc2Uoc3RydWN0IHdvcmtf c3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtID0KKwkJY29u dGFpbmVyX29mKHdvcmssIHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UsIHJjdS53b3JrKTsKKwor CXZtLT5jbGVhbnVwKHZtKTsKKwlpOTE1X2FkZHJlc3Nfc3BhY2VfZmluaSh2bSk7CisKKwlrZnJl ZSh2bSk7Cit9CisKK3ZvaWQgaTkxNV92bV9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQorewor CXN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtID0KKwkJY29udGFpbmVyX29mKGtyZWYsIHN0 cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UsIHJlZik7CisKKwlHRU1fQlVHX09OKGk5MTVfaXNfZ2d0 dCh2bSkpOworCXRyYWNlX2k5MTVfcHBndHRfcmVsZWFzZSh2bSk7CisKKwlxdWV1ZV9yY3Vfd29y ayh2bS0+aTkxNS0+d3EsICZ2bS0+cmN1KTsKK30KKwordm9pZCBpOTE1X2FkZHJlc3Nfc3BhY2Vf aW5pdChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwgaW50IHN1YmNsYXNzKQoreworCWty ZWZfaW5pdCgmdm0tPnJlZik7CisJSU5JVF9SQ1VfV09SSygmdm0tPnJjdSwgX19pOTE1X3ZtX3Jl bGVhc2UpOworCWF0b21pY19zZXQoJnZtLT5vcGVuLCAxKTsKKworCS8qCisJICogVGhlIHZtLT5t dXRleCBtdXN0IGJlIHJlY2xhaW0gc2FmZSAoZm9yIHVzZSBpbiB0aGUgc2hyaW5rZXIpLgorCSAq IERvIGEgZHVtbXkgYWNxdWlyZSBub3cgdW5kZXIgZnNfcmVjbGFpbSBzbyB0aGF0IGFueSBhbGxv Y2F0aW9uCisJICogYXR0ZW1wdCBob2xkaW5nIHRoZSBsb2NrIGlzIGltbWVkaWF0ZWx5IHJlcG9y dGVkIGJ5IGxvY2tkZXAuCisJICovCisJbXV0ZXhfaW5pdCgmdm0tPm11dGV4KTsKKwlsb2NrZGVw X3NldF9zdWJjbGFzcygmdm0tPm11dGV4LCBzdWJjbGFzcyk7CisJaTkxNV9nZW1fc2hyaW5rZXJf dGFpbnRzX211dGV4KHZtLT5pOTE1LCAmdm0tPm11dGV4KTsKKworCUdFTV9CVUdfT04oIXZtLT50 b3RhbCk7CisJZHJtX21tX2luaXQoJnZtLT5tbSwgMCwgdm0tPnRvdGFsKTsKKwl2bS0+bW0uaGVh ZF9ub2RlLmNvbG9yID0gSTkxNV9DT0xPUl9VTkVWSUNUQUJMRTsKKworCXN0YXNoX2luaXQoJnZt LT5mcmVlX3BhZ2VzKTsKKworCUlOSVRfTElTVF9IRUFEKCZ2bS0+Ym91bmRfbGlzdCk7Cit9CisK K3ZvaWQgY2xlYXJfcGFnZXMoc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJR0VNX0JVR19PTigh dm1hLT5wYWdlcyk7CisKKwlpZiAodm1hLT5wYWdlcyAhPSB2bWEtPm9iai0+bW0ucGFnZXMpIHsK KwkJc2dfZnJlZV90YWJsZSh2bWEtPnBhZ2VzKTsKKwkJa2ZyZWUodm1hLT5wYWdlcyk7CisJfQor CXZtYS0+cGFnZXMgPSBOVUxMOworCisJbWVtc2V0KCZ2bWEtPnBhZ2Vfc2l6ZXMsIDAsIHNpemVv Zih2bWEtPnBhZ2Vfc2l6ZXMpKTsKK30KKworc3RhdGljIGludCBfX3NldHVwX3BhZ2VfZG1hKHN0 cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAorCQkJICAgIHN0cnVjdCBpOTE1X3BhZ2VfZG1h ICpwLAorCQkJICAgIGdmcF90IGdmcCkKK3sKKwlwLT5wYWdlID0gdm1fYWxsb2NfcGFnZSh2bSwg Z2ZwIHwgSTkxNV9HRlBfQUxMT1dfRkFJTCk7CisJaWYgKHVubGlrZWx5KCFwLT5wYWdlKSkKKwkJ cmV0dXJuIC1FTk9NRU07CisKKwlwLT5kYWRkciA9IGRtYV9tYXBfcGFnZV9hdHRycyh2bS0+ZG1h LAorCQkJCSAgICAgIHAtPnBhZ2UsIDAsIFBBR0VfU0laRSwKKwkJCQkgICAgICBQQ0lfRE1BX0JJ RElSRUNUSU9OQUwsCisJCQkJICAgICAgRE1BX0FUVFJfU0tJUF9DUFVfU1lOQyB8CisJCQkJICAg ICAgRE1BX0FUVFJfTk9fV0FSTik7CisJaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKHZt LT5kbWEsIHAtPmRhZGRyKSkpIHsKKwkJdm1fZnJlZV9wYWdlKHZtLCBwLT5wYWdlKTsKKwkJcmV0 dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBzZXR1cF9wYWdlX2RtYShz dHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKKwkJCSAgc3RydWN0IGk5MTVfcGFnZV9kbWEg KnApCit7CisJcmV0dXJuIF9fc2V0dXBfcGFnZV9kbWEodm0sIHAsIF9fR0ZQX0hJR0hNRU0pOwor fQorCit2b2lkIGNsZWFudXBfcGFnZV9kbWEoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0s CisJCSAgICAgIHN0cnVjdCBpOTE1X3BhZ2VfZG1hICpwKQoreworCWRtYV91bm1hcF9wYWdlKHZt LT5kbWEsIHAtPmRhZGRyLCBQQUdFX1NJWkUsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJdm1f ZnJlZV9wYWdlKHZtLCBwLT5wYWdlKTsKK30KKwordm9pZAorZmlsbF9wYWdlX2RtYShjb25zdCBz dHJ1Y3QgaTkxNV9wYWdlX2RtYSAqcCwgY29uc3QgdTY0IHZhbCwgdW5zaWduZWQgaW50IGNvdW50 KQoreworCWt1bm1hcF9hdG9taWMobWVtc2V0NjQoa21hcF9hdG9taWMocC0+cGFnZSksIHZhbCwg Y291bnQpKTsKK30KKworaW50CitzZXR1cF9zY3JhdGNoX3BhZ2Uoc3RydWN0IGk5MTVfYWRkcmVz c19zcGFjZSAqdm0sIGdmcF90IGdmcCkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwkvKgor CSAqIEluIG9yZGVyIHRvIHV0aWxpemUgNjRLIHBhZ2VzIGZvciBhbiBvYmplY3Qgd2l0aCBhIHNp emUgPCAyTSwgd2Ugd2lsbAorCSAqIG5lZWQgdG8gc3VwcG9ydCBhIDY0SyBzY3JhdGNoIHBhZ2Us IGdpdmVuIHRoYXQgZXZlcnkgMTZ0aCBlbnRyeSBmb3IgYQorCSAqIHBhZ2UtdGFibGUgb3BlcmF0 aW5nIGluIDY0SyBtb2RlIG11c3QgcG9pbnQgdG8gYSBwcm9wZXJseSBhbGlnbmVkIDY0SworCSAq IHJlZ2lvbiwgaW5jbHVkaW5nIGFueSBQVEVzIHdoaWNoIGhhcHBlbiB0byBwb2ludCB0byBzY3Jh dGNoLgorCSAqCisJICogVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciB0aGUgNDhiIFBQR1RUIHdo ZXJlIHdlIHN1cHBvcnQKKwkgKiBodWdlLWd0dC1wYWdlcywgc2VlIGFsc28gaTkxNV92bWFfaW5z ZXJ0KCkuIEhvd2V2ZXIsIGFzIHdlIHNoYXJlIHRoZQorCSAqIHNjcmF0Y2ggKHJlYWQtb25seSkg YmV0d2VlbiBhbGwgdm0sIHdlIGNyZWF0ZSBvbmUgNjRrIHNjcmF0Y2ggcGFnZQorCSAqIGZvciBh bGwuCisJICovCisJc2l6ZSA9IEk5MTVfR1RUX1BBR0VfU0laRV80SzsKKwlpZiAoaTkxNV92bV9p c180bHZsKHZtKSAmJgorCSAgICBIQVNfUEFHRV9TSVpFUyh2bS0+aTkxNSwgSTkxNV9HVFRfUEFH RV9TSVpFXzY0SykpIHsKKwkJc2l6ZSA9IEk5MTVfR1RUX1BBR0VfU0laRV82NEs7CisJCWdmcCB8 PSBfX0dGUF9OT1dBUk47CisJfQorCWdmcCB8PSBfX0dGUF9aRVJPIHwgX19HRlBfUkVUUllfTUFZ RkFJTDsKKworCWRvIHsKKwkJdW5zaWduZWQgaW50IG9yZGVyID0gZ2V0X29yZGVyKHNpemUpOwor CQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJZG1hX2FkZHJfdCBhZGRyOworCisJCXBhZ2UgPSBhbGxv Y19wYWdlcyhnZnAsIG9yZGVyKTsKKwkJaWYgKHVubGlrZWx5KCFwYWdlKSkKKwkJCWdvdG8gc2tp cDsKKworCQlhZGRyID0gZG1hX21hcF9wYWdlX2F0dHJzKHZtLT5kbWEsCisJCQkJCSAgcGFnZSwg MCwgc2l6ZSwKKwkJCQkJICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwsCisJCQkJCSAgRE1BX0FUVFJf U0tJUF9DUFVfU1lOQyB8CisJCQkJCSAgRE1BX0FUVFJfTk9fV0FSTik7CisJCWlmICh1bmxpa2Vs eShkbWFfbWFwcGluZ19lcnJvcih2bS0+ZG1hLCBhZGRyKSkpCisJCQlnb3RvIGZyZWVfcGFnZTsK KworCQlpZiAodW5saWtlbHkoIUlTX0FMSUdORUQoYWRkciwgc2l6ZSkpKQorCQkJZ290byB1bm1h cF9wYWdlOworCisJCXZtLT5zY3JhdGNoWzBdLmJhc2UucGFnZSA9IHBhZ2U7CisJCXZtLT5zY3Jh dGNoWzBdLmJhc2UuZGFkZHIgPSBhZGRyOworCQl2bS0+c2NyYXRjaF9vcmRlciA9IG9yZGVyOwor CQlyZXR1cm4gMDsKKwordW5tYXBfcGFnZToKKwkJZG1hX3VubWFwX3BhZ2Uodm0tPmRtYSwgYWRk ciwgc2l6ZSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKK2ZyZWVfcGFnZToKKwkJX19mcmVlX3Bh Z2VzKHBhZ2UsIG9yZGVyKTsKK3NraXA6CisJCWlmIChzaXplID09IEk5MTVfR1RUX1BBR0VfU0la RV80SykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXNpemUgPSBJOTE1X0dUVF9QQUdFX1NJWkVf NEs7CisJCWdmcCAmPSB+X19HRlBfTk9XQVJOOworCX0gd2hpbGUgKDEpOworfQorCit2b2lkIGNs ZWFudXBfc2NyYXRjaF9wYWdlKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKQoreworCXN0 cnVjdCBpOTE1X3BhZ2VfZG1hICpwID0gcHhfYmFzZSgmdm0tPnNjcmF0Y2hbMF0pOworCXVuc2ln bmVkIGludCBvcmRlciA9IHZtLT5zY3JhdGNoX29yZGVyOworCisJZG1hX3VubWFwX3BhZ2Uodm0t PmRtYSwgcC0+ZGFkZHIsIEJJVChvcmRlcikgPDwgUEFHRV9TSElGVCwKKwkJICAgICAgIFBDSV9E TUFfQklESVJFQ1RJT05BTCk7CisJX19mcmVlX3BhZ2VzKHAtPnBhZ2UsIG9yZGVyKTsKK30KKwor dm9pZCBmcmVlX3NjcmF0Y2goc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pCit7CisJaW50 IGk7CisKKwlpZiAoIXB4X2RtYSgmdm0tPnNjcmF0Y2hbMF0pKSAvKiBzZXQgdG8gMCBvbiBjbG9u ZXMgKi8KKwkJcmV0dXJuOworCisJZm9yIChpID0gMTsgaSA8PSB2bS0+dG9wOyBpKyspIHsKKwkJ aWYgKCFweF9kbWEoJnZtLT5zY3JhdGNoW2ldKSkKKwkJCWJyZWFrOworCQljbGVhbnVwX3BhZ2Vf ZG1hKHZtLCBweF9iYXNlKCZ2bS0+c2NyYXRjaFtpXSkpOworCX0KKworCWNsZWFudXBfc2NyYXRj aF9wYWdlKHZtKTsKK30KKwordm9pZCBndHRfd3JpdGVfd29ya2Fyb3VuZHMoc3RydWN0IGludGVs X2d0ICpndCkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGd0LT5pOTE1Owor CXN0cnVjdCBpbnRlbF91bmNvcmUgKnVuY29yZSA9IGd0LT51bmNvcmU7CisKKwkvKiBUaGlzIGZ1 bmN0aW9uIGlzIGZvciBndHQgcmVsYXRlZCB3b3JrYXJvdW5kcy4gVGhpcyBmdW5jdGlvbiBpcwor CSAqIGNhbGxlZCBvbiBkcml2ZXIgbG9hZCBhbmQgYWZ0ZXIgYSBHUFUgcmVzZXQsIHNvIHlvdSBj YW4gcGxhY2UKKwkgKiB3b3JrYXJvdW5kcyBoZXJlIGV2ZW4gaWYgdGhleSBnZXQgb3ZlcndyaXR0 ZW4gYnkgR1BVIHJlc2V0LgorCSAqLworCS8qIFdhSW5jcmVhc2VEZWZhdWx0VExCRW50cmllczpj aHYsYmR3LHNrbCxieHQsa2JsLGdsayxjZmwsY25sLGljbCAqLworCWlmIChJU19CUk9BRFdFTEwo aTkxNSkpCisJCWludGVsX3VuY29yZV93cml0ZSh1bmNvcmUsCisJCQkJICAgR0VOOF9MM19MUkFf MV9HUEdQVSwKKwkJCQkgICBHRU44X0wzX0xSQV8xX0dQR1BVX0RFRkFVTFRfVkFMVUVfQkRXKTsK KwllbHNlIGlmIChJU19DSEVSUllWSUVXKGk5MTUpKQorCQlpbnRlbF91bmNvcmVfd3JpdGUodW5j b3JlLAorCQkJCSAgIEdFTjhfTDNfTFJBXzFfR1BHUFUsCisJCQkJICAgR0VOOF9MM19MUkFfMV9H UEdQVV9ERUZBVUxUX1ZBTFVFX0NIVik7CisJZWxzZSBpZiAoSVNfR0VOOV9MUChpOTE1KSkKKwkJ aW50ZWxfdW5jb3JlX3dyaXRlKHVuY29yZSwKKwkJCQkgICBHRU44X0wzX0xSQV8xX0dQR1BVLAor CQkJCSAgIEdFTjlfTDNfTFJBXzFfR1BHUFVfREVGQVVMVF9WQUxVRV9CWFQpOworCWVsc2UgaWYg KElOVEVMX0dFTihpOTE1KSA+PSA5ICYmIElOVEVMX0dFTihpOTE1KSA8PSAxMSkKKwkJaW50ZWxf dW5jb3JlX3dyaXRlKHVuY29yZSwKKwkJCQkgICBHRU44X0wzX0xSQV8xX0dQR1BVLAorCQkJCSAg IEdFTjlfTDNfTFJBXzFfR1BHUFVfREVGQVVMVF9WQUxVRV9TS0wpOworCisJLyoKKwkgKiBUbyBz dXBwb3J0IDY0SyBQVEVzIHdlIG5lZWQgdG8gZmlyc3QgZW5hYmxlIHRoZSB1c2Ugb2YgdGhlCisJ ICogSW50ZXJtZWRpYXRlLVBhZ2UtU2l6ZShJUFMpIGJpdCBvZiB0aGUgUERFIGZpZWxkIHZpYSBz b21lIG1hZ2ljYWwKKwkgKiBtbWlvLCBvdGhlcndpc2UgdGhlIHBhZ2Utd2Fsa2VyIHdpbGwgc2lt cGx5IGlnbm9yZSB0aGUgSVBTIGJpdC4gVGhpcworCSAqIHNob3VsZG4ndCBiZSBuZWVkZWQgYWZ0 ZXIgR0VOMTAuCisJICoKKwkgKiA2NEsgcGFnZXMgd2VyZSBmaXJzdCBpbnRyb2R1Y2VkIGZyb20g QkRXKywgYWx0aG91Z2ggdGVjaG5pY2FsbHkgdGhleQorCSAqIG9ubHkgKndvcmsqIGZyb20gZ2Vu OSsuIEZvciBwcmUtQkRXIHdlIGluc3RlYWQgaGF2ZSB0aGUgb3B0aW9uIGZvcgorCSAqIDMySyBw YWdlcywgYnV0IHdlIGRvbid0IGN1cnJlbnRseSBoYXZlIGFueSBzdXBwb3J0IGZvciBpdCBpbiBv dXIKKwkgKiBkcml2ZXIuCisJICovCisJaWYgKEhBU19QQUdFX1NJWkVTKGk5MTUsIEk5MTVfR1RU X1BBR0VfU0laRV82NEspICYmCisJICAgIElOVEVMX0dFTihpOTE1KSA8PSAxMCkKKwkJaW50ZWxf dW5jb3JlX3Jtdyh1bmNvcmUsCisJCQkJIEdFTjhfR0FNV19FQ09fREVWX1JXX0lBLAorCQkJCSAw LAorCQkJCSBHQU1XX0VDT19FTkFCTEVfNjRLX0lQU19GSUVMRCk7CisKKwlpZiAoSVNfR0VOX1JB TkdFKGk5MTUsIDgsIDExKSkgeworCQlib29sIGNhbl91c2VfZ3R0X2NhY2hlID0gdHJ1ZTsKKwor CQkvKgorCQkgKiBBY2NvcmRpbmcgdG8gdGhlIEJTcGVjIGlmIHdlIHVzZSAyTS8xRyBwYWdlcyB0 aGVuIHdlIGFsc28KKwkJICogbmVlZCB0byBkaXNhYmxlIHRoZSBHVFQgY2FjaGUuIEF0IGxlYXN0 IG9uIEJEVyB3ZSBjYW4gc2VlCisJCSAqIHZpc3VhbCBjb3JydXB0aW9uIHdoZW4gdXNpbmcgMk0g cGFnZXMsIGFuZCBub3QgZGlzYWJsaW5nIHRoZQorCQkgKiBHVFQgY2FjaGUuCisJCSAqLworCQlp ZiAoSEFTX1BBR0VfU0laRVMoaTkxNSwgSTkxNV9HVFRfUEFHRV9TSVpFXzJNKSkKKwkJCWNhbl91 c2VfZ3R0X2NhY2hlID0gZmFsc2U7CisKKwkJLyogV2FHdHRDYWNoaW5nT2ZmQnlEZWZhdWx0ICov CisJCWludGVsX3VuY29yZV93cml0ZSh1bmNvcmUsCisJCQkJICAgSFNXX0dUVF9DQUNIRV9FTiwK KwkJCQkgICBjYW5fdXNlX2d0dF9jYWNoZSA/IEdUVF9DQUNIRV9FTl9BTEwgOiAwKTsKKwkJV0FS Tl9PTl9PTkNFKGNhbl91c2VfZ3R0X2NhY2hlICYmCisJCQkgICAgIGludGVsX3VuY29yZV9yZWFk KHVuY29yZSwKKwkJCQkJICAgICAgIEhTV19HVFRfQ0FDSEVfRU4pID09IDApOworCX0KK30KKwor dTY0IGdlbjhfcHRlX2VuY29kZShkbWFfYWRkcl90IGFkZHIsCisJCSAgICBlbnVtIGk5MTVfY2Fj aGVfbGV2ZWwgbGV2ZWwsCisJCSAgICB1MzIgZmxhZ3MpCit7CisJZ2VuOF9wdGVfdCBwdGUgPSBh ZGRyIHwgX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1JXOworCisJaWYgKHVubGlrZWx5KGZsYWdzICYg UFRFX1JFQURfT05MWSkpCisJCXB0ZSAmPSB+X1BBR0VfUlc7CisKKwlzd2l0Y2ggKGxldmVsKSB7 CisJY2FzZSBJOTE1X0NBQ0hFX05PTkU6CisJCXB0ZSB8PSBQUEFUX1VOQ0FDSEVEOworCQlicmVh azsKKwljYXNlIEk5MTVfQ0FDSEVfV1Q6CisJCXB0ZSB8PSBQUEFUX0RJU1BMQVlfRUxMQzsKKwkJ YnJlYWs7CisJZGVmYXVsdDoKKwkJcHRlIHw9IFBQQVRfQ0FDSEVEOworCQlicmVhazsKKwl9CisK KwlyZXR1cm4gcHRlOworfQorCit1NjQgZ2VuOF9wZGVfZW5jb2RlKGNvbnN0IGRtYV9hZGRyX3Qg YWRkciwKKwkJICAgIGNvbnN0IGVudW0gaTkxNV9jYWNoZV9sZXZlbCBsZXZlbCkKK3sKKwl1NjQg cGRlID0gX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1JXOworCXBkZSB8PSBhZGRyOworCWlmIChsZXZl bCAhPSBJOTE1X0NBQ0hFX05PTkUpCisJCXBkZSB8PSBQUEFUX0NBQ0hFRF9QREU7CisJZWxzZQor CQlwZGUgfD0gUFBBVF9VTkNBQ0hFRDsKKwlyZXR1cm4gcGRlOworfQorCit1NjQgc25iX3B0ZV9l bmNvZGUoZG1hX2FkZHJfdCBhZGRyLAorCQkgICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgbGV2ZWws CisJCSAgIHUzMiBmbGFncykKK3sKKwlnZW42X3B0ZV90IHB0ZSA9IEdFTjZfUFRFX1ZBTElEOwor CXB0ZSB8PSBHRU42X1BURV9BRERSX0VOQ09ERShhZGRyKTsKKworCXN3aXRjaCAobGV2ZWwpIHsK KwljYXNlIEk5MTVfQ0FDSEVfTDNfTExDOgorCWNhc2UgSTkxNV9DQUNIRV9MTEM6CisJCXB0ZSB8 PSBHRU42X1BURV9DQUNIRV9MTEM7CisJCWJyZWFrOworCWNhc2UgSTkxNV9DQUNIRV9OT05FOgor CQlwdGUgfD0gR0VONl9QVEVfVU5DQUNIRUQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCU1JU1NJ TkdfQ0FTRShsZXZlbCk7CisJfQorCisJcmV0dXJuIHB0ZTsKK30KKwordTY0IGl2Yl9wdGVfZW5j b2RlKGRtYV9hZGRyX3QgYWRkciwKKwkJICAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGxldmVsLAor CQkgICB1MzIgZmxhZ3MpCit7CisJZ2VuNl9wdGVfdCBwdGUgPSBHRU42X1BURV9WQUxJRDsKKwlw dGUgfD0gR0VONl9QVEVfQUREUl9FTkNPREUoYWRkcik7CisKKwlzd2l0Y2ggKGxldmVsKSB7CisJ Y2FzZSBJOTE1X0NBQ0hFX0wzX0xMQzoKKwkJcHRlIHw9IEdFTjdfUFRFX0NBQ0hFX0wzX0xMQzsK KwkJYnJlYWs7CisJY2FzZSBJOTE1X0NBQ0hFX0xMQzoKKwkJcHRlIHw9IEdFTjZfUFRFX0NBQ0hF X0xMQzsKKwkJYnJlYWs7CisJY2FzZSBJOTE1X0NBQ0hFX05PTkU6CisJCXB0ZSB8PSBHRU42X1BU RV9VTkNBQ0hFRDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTUlTU0lOR19DQVNFKGxldmVsKTsK Kwl9CisKKwlyZXR1cm4gcHRlOworfQorCit1NjQgYnl0X3B0ZV9lbmNvZGUoZG1hX2FkZHJfdCBh ZGRyLAorCQkgICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgbGV2ZWwsCisJCSAgIHUzMiBmbGFncykK K3sKKwlnZW42X3B0ZV90IHB0ZSA9IEdFTjZfUFRFX1ZBTElEOworCXB0ZSB8PSBHRU42X1BURV9B RERSX0VOQ09ERShhZGRyKTsKKworCWlmICghKGZsYWdzICYgUFRFX1JFQURfT05MWSkpCisJCXB0 ZSB8PSBCWVRfUFRFX1dSSVRFQUJMRTsKKworCWlmIChsZXZlbCAhPSBJOTE1X0NBQ0hFX05PTkUp CisJCXB0ZSB8PSBCWVRfUFRFX1NOT09QRURfQllfQ1BVX0NBQ0hFUzsKKworCXJldHVybiBwdGU7 Cit9CisKK3U2NCBoc3dfcHRlX2VuY29kZShkbWFfYWRkcl90IGFkZHIsCisJCSAgIGVudW0gaTkx NV9jYWNoZV9sZXZlbCBsZXZlbCwKKwkJICAgdTMyIGZsYWdzKQoreworCWdlbjZfcHRlX3QgcHRl ID0gR0VONl9QVEVfVkFMSUQ7CisJcHRlIHw9IEhTV19QVEVfQUREUl9FTkNPREUoYWRkcik7CisK KwlpZiAobGV2ZWwgIT0gSTkxNV9DQUNIRV9OT05FKQorCQlwdGUgfD0gSFNXX1dCX0xMQ19BR0Uz OworCisJcmV0dXJuIHB0ZTsKK30KKwordTY0IGlyaXNfcHRlX2VuY29kZShkbWFfYWRkcl90IGFk ZHIsCisJCSAgICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgbGV2ZWwsCisJCSAgICB1MzIgZmxhZ3Mp Cit7CisJZ2VuNl9wdGVfdCBwdGUgPSBHRU42X1BURV9WQUxJRDsKKwlwdGUgfD0gSFNXX1BURV9B RERSX0VOQ09ERShhZGRyKTsKKworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIEk5MTVfQ0FDSEVf Tk9ORToKKwkJYnJlYWs7CisJY2FzZSBJOTE1X0NBQ0hFX1dUOgorCQlwdGUgfD0gSFNXX1dUX0VM TENfTExDX0FHRTM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXB0ZSB8PSBIU1dfV0JfRUxMQ19M TENfQUdFMzsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHB0ZTsKK30KKworc3RhdGljIHZvaWQg dGdsX3NldHVwX3ByaXZhdGVfcHBhdChzdHJ1Y3QgaW50ZWxfdW5jb3JlICp1bmNvcmUpCit7CisJ LyogVEdMIGRvZXNuJ3Qgc3VwcG9ydCBMTEMgb3IgQUdFIHNldHRpbmdzICovCisJaW50ZWxfdW5j b3JlX3dyaXRlKHVuY29yZSwgR0VOMTJfUEFUX0lOREVYKDApLCBHRU44X1BQQVRfV0IpOworCWlu dGVsX3VuY29yZV93cml0ZSh1bmNvcmUsIEdFTjEyX1BBVF9JTkRFWCgxKSwgR0VOOF9QUEFUX1dD KTsKKwlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLCBHRU4xMl9QQVRfSU5ERVgoMiksIEdFTjhf UFBBVF9XVCk7CisJaW50ZWxfdW5jb3JlX3dyaXRlKHVuY29yZSwgR0VOMTJfUEFUX0lOREVYKDMp LCBHRU44X1BQQVRfVUMpOworCWludGVsX3VuY29yZV93cml0ZSh1bmNvcmUsIEdFTjEyX1BBVF9J TkRFWCg0KSwgR0VOOF9QUEFUX1dCKTsKKwlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLCBHRU4x Ml9QQVRfSU5ERVgoNSksIEdFTjhfUFBBVF9XQik7CisJaW50ZWxfdW5jb3JlX3dyaXRlKHVuY29y ZSwgR0VOMTJfUEFUX0lOREVYKDYpLCBHRU44X1BQQVRfV0IpOworCWludGVsX3VuY29yZV93cml0 ZSh1bmNvcmUsIEdFTjEyX1BBVF9JTkRFWCg3KSwgR0VOOF9QUEFUX1dCKTsKK30KKworc3RhdGlj IHZvaWQgY25sX3NldHVwX3ByaXZhdGVfcHBhdChzdHJ1Y3QgaW50ZWxfdW5jb3JlICp1bmNvcmUp Cit7CisJaW50ZWxfdW5jb3JlX3dyaXRlKHVuY29yZSwKKwkJCSAgIEdFTjEwX1BBVF9JTkRFWCgw KSwKKwkJCSAgIEdFTjhfUFBBVF9XQiB8IEdFTjhfUFBBVF9MTEMpOworCWludGVsX3VuY29yZV93 cml0ZSh1bmNvcmUsCisJCQkgICBHRU4xMF9QQVRfSU5ERVgoMSksCisJCQkgICBHRU44X1BQQVRf V0MgfCBHRU44X1BQQVRfTExDRUxMQyk7CisJaW50ZWxfdW5jb3JlX3dyaXRlKHVuY29yZSwKKwkJ CSAgIEdFTjEwX1BBVF9JTkRFWCgyKSwKKwkJCSAgIEdFTjhfUFBBVF9XVCB8IEdFTjhfUFBBVF9M TENFTExDKTsKKwlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLAorCQkJICAgR0VOMTBfUEFUX0lO REVYKDMpLAorCQkJICAgR0VOOF9QUEFUX1VDKTsKKwlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3Jl LAorCQkJICAgR0VOMTBfUEFUX0lOREVYKDQpLAorCQkJICAgR0VOOF9QUEFUX1dCIHwgR0VOOF9Q UEFUX0xMQ0VMTEMgfCBHRU44X1BQQVRfQUdFKDApKTsKKwlpbnRlbF91bmNvcmVfd3JpdGUodW5j b3JlLAorCQkJICAgR0VOMTBfUEFUX0lOREVYKDUpLAorCQkJICAgR0VOOF9QUEFUX1dCIHwgR0VO OF9QUEFUX0xMQ0VMTEMgfCBHRU44X1BQQVRfQUdFKDEpKTsKKwlpbnRlbF91bmNvcmVfd3JpdGUo dW5jb3JlLAorCQkJICAgR0VOMTBfUEFUX0lOREVYKDYpLAorCQkJICAgR0VOOF9QUEFUX1dCIHwg R0VOOF9QUEFUX0xMQ0VMTEMgfCBHRU44X1BQQVRfQUdFKDIpKTsKKwlpbnRlbF91bmNvcmVfd3Jp dGUodW5jb3JlLAorCQkJICAgR0VOMTBfUEFUX0lOREVYKDcpLAorCQkJICAgR0VOOF9QUEFUX1dC IHwgR0VOOF9QUEFUX0xMQ0VMTEMgfCBHRU44X1BQQVRfQUdFKDMpKTsKK30KKworLyogVGhlIEdH VFQgYW5kIFBQR1RUIG5lZWQgYSBwcml2YXRlIFBQQVQgc2V0dXAgaW4gb3JkZXIgdG8gaGFuZGxl IGNhY2hlYWJpbGl0eQorICogYml0cy4gV2hlbiB1c2luZyBhZHZhbmNlZCBjb250ZXh0cyBlYWNo IGNvbnRleHQgc3RvcmVzIGl0cyBvd24gUEFULCBidXQKKyAqIHdyaXRpbmcgdGhpcyBkYXRhIHNo b3VsZG4ndCBiZSBoYXJtZnVsIGV2ZW4gaW4gdGhvc2UgY2FzZXMuICovCitzdGF0aWMgdm9pZCBi ZHdfc2V0dXBfcHJpdmF0ZV9wcGF0KHN0cnVjdCBpbnRlbF91bmNvcmUgKnVuY29yZSkKK3sKKwl1 NjQgcGF0OworCisJcGF0ID0gR0VOOF9QUEFUKDAsIEdFTjhfUFBBVF9XQiB8IEdFTjhfUFBBVF9M TEMpIHwJLyogZm9yIG5vcm1hbCBvYmplY3RzLCBubyBlTExDICovCisJICAgICAgR0VOOF9QUEFU KDEsIEdFTjhfUFBBVF9XQyB8IEdFTjhfUFBBVF9MTENFTExDKSB8CS8qIGZvciBzb21ldGhpbmcg cG9pbnRpbmcgdG8gcHRlcz8gKi8KKwkgICAgICBHRU44X1BQQVQoMiwgR0VOOF9QUEFUX1dUIHwg R0VOOF9QUEFUX0xMQ0VMTEMpIHwJLyogZm9yIHNjYW5vdXQgd2l0aCBlTExDICovCisJICAgICAg R0VOOF9QUEFUKDMsIEdFTjhfUFBBVF9VQykgfAkJCS8qIFVuY2FjaGVkIG9iamVjdHMsIG1vc3Rs eSBmb3Igc2Nhbm91dCAqLworCSAgICAgIEdFTjhfUFBBVCg0LCBHRU44X1BQQVRfV0IgfCBHRU44 X1BQQVRfTExDRUxMQyB8IEdFTjhfUFBBVF9BR0UoMCkpIHwKKwkgICAgICBHRU44X1BQQVQoNSwg R0VOOF9QUEFUX1dCIHwgR0VOOF9QUEFUX0xMQ0VMTEMgfCBHRU44X1BQQVRfQUdFKDEpKSB8CisJ ICAgICAgR0VOOF9QUEFUKDYsIEdFTjhfUFBBVF9XQiB8IEdFTjhfUFBBVF9MTENFTExDIHwgR0VO OF9QUEFUX0FHRSgyKSkgfAorCSAgICAgIEdFTjhfUFBBVCg3LCBHRU44X1BQQVRfV0IgfCBHRU44 X1BQQVRfTExDRUxMQyB8IEdFTjhfUFBBVF9BR0UoMykpOworCisJaW50ZWxfdW5jb3JlX3dyaXRl KHVuY29yZSwgR0VOOF9QUklWQVRFX1BBVF9MTywgbG93ZXJfMzJfYml0cyhwYXQpKTsKKwlpbnRl bF91bmNvcmVfd3JpdGUodW5jb3JlLCBHRU44X1BSSVZBVEVfUEFUX0hJLCB1cHBlcl8zMl9iaXRz KHBhdCkpOworfQorCitzdGF0aWMgdm9pZCBjaHZfc2V0dXBfcHJpdmF0ZV9wcGF0KHN0cnVjdCBp bnRlbF91bmNvcmUgKnVuY29yZSkKK3sKKwl1NjQgcGF0OworCisJLyoKKwkgKiBNYXAgV0Igb24g QkRXIHRvIHNub29wZWQgb24gQ0hWLgorCSAqCisJICogT25seSB0aGUgc25vb3AgYml0IGhhcyBt ZWFuaW5nIGZvciBDSFYsIHRoZSByZXN0IGlzCisJICogaWdub3JlZC4KKwkgKgorCSAqIFRoZSBo YXJkd2FyZSB3aWxsIG5ldmVyIHNub29wIGZvciBjZXJ0YWluIHR5cGVzIG9mIGFjY2Vzc2VzOgor CSAqIC0gQ1BVIEdUVCAoR01BRFItPkdHVFQtPm5vIHNub29wLT5tZW1vcnkpCisJICogLSBQUEdU VCBwYWdlIHRhYmxlcworCSAqIC0gc29tZSBvdGhlciBzcGVjaWFsIGN5Y2xlcworCSAqCisJICog QXMgd2l0aCBCRFcsIHdlIGFsc28gbmVlZCB0byBjb25zaWRlciB0aGUgZm9sbG93aW5nIGZvciBH VCBhY2Nlc3NlczoKKwkgKiAiRm9yIEdHVFQsIHRoZXJlIGlzIE5PIHBhdF9zZWxbMjowXSBmcm9t IHRoZSBlbnRyeSwKKwkgKiBzbyBSVEwgd2lsbCBhbHdheXMgdXNlIHRoZSB2YWx1ZSBjb3JyZXNw b25kaW5nIHRvCisJICogcGF0X3NlbCA9IDAwMCIuCisJICogV2hpY2ggbWVhbnMgd2UgbXVzdCBz ZXQgdGhlIHNub29wIGJpdCBpbiBQQVQgZW50cnkgMAorCSAqIGluIG9yZGVyIHRvIGtlZXAgdGhl IGdsb2JhbCBzdGF0dXMgcGFnZSB3b3JraW5nLgorCSAqLworCisJcGF0ID0gR0VOOF9QUEFUKDAs IENIVl9QUEFUX1NOT09QKSB8CisJICAgICAgR0VOOF9QUEFUKDEsIDApIHwKKwkgICAgICBHRU44 X1BQQVQoMiwgMCkgfAorCSAgICAgIEdFTjhfUFBBVCgzLCAwKSB8CisJICAgICAgR0VOOF9QUEFU KDQsIENIVl9QUEFUX1NOT09QKSB8CisJICAgICAgR0VOOF9QUEFUKDUsIENIVl9QUEFUX1NOT09Q KSB8CisJICAgICAgR0VOOF9QUEFUKDYsIENIVl9QUEFUX1NOT09QKSB8CisJICAgICAgR0VOOF9Q UEFUKDcsIENIVl9QUEFUX1NOT09QKTsKKworCWludGVsX3VuY29yZV93cml0ZSh1bmNvcmUsIEdF TjhfUFJJVkFURV9QQVRfTE8sIGxvd2VyXzMyX2JpdHMocGF0KSk7CisJaW50ZWxfdW5jb3JlX3dy aXRlKHVuY29yZSwgR0VOOF9QUklWQVRFX1BBVF9ISSwgdXBwZXJfMzJfYml0cyhwYXQpKTsKK30K Kwordm9pZCBzZXR1cF9wcml2YXRlX3BhdChzdHJ1Y3QgaW50ZWxfdW5jb3JlICp1bmNvcmUpCit7 CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSB1bmNvcmUtPmk5MTU7CisKKwlHRU1f QlVHX09OKElOVEVMX0dFTihpOTE1KSA8IDgpOworCisJaWYgKElOVEVMX0dFTihpOTE1KSA+PSAx MikKKwkJdGdsX3NldHVwX3ByaXZhdGVfcHBhdCh1bmNvcmUpOworCWVsc2UgaWYgKElOVEVMX0dF TihpOTE1KSA+PSAxMCkKKwkJY25sX3NldHVwX3ByaXZhdGVfcHBhdCh1bmNvcmUpOworCWVsc2Ug aWYgKElTX0NIRVJSWVZJRVcoaTkxNSkgfHwgSVNfR0VOOV9MUChpOTE1KSkKKwkJY2h2X3NldHVw X3ByaXZhdGVfcHBhdCh1bmNvcmUpOworCWVsc2UKKwkJYmR3X3NldHVwX3ByaXZhdGVfcHBhdCh1 bmNvcmUpOworfQorCisjaWYgSVNfRU5BQkxFRChDT05GSUdfRFJNX0k5MTVfU0VMRlRFU1QpCisj aW5jbHVkZSAic2VsZnRlc3RzL21vY2tfZ3R0LmMiCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2d0dC5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Qv aW50ZWxfZ3R0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi4zY2Iy NWJjYzkwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRl bF9ndHQuaApAQCAtMCwwICsxLDcxNCBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1J VCAqLworLyoKKyAqIENvcHlyaWdodCDCqSAyMDIwIEludGVsIENvcnBvcmF0aW9uCisgKgorICog UGxlYXNlIHRyeSB0byBtYWludGFpbiB0aGUgZm9sbG93aW5nIG9yZGVyIHdpdGhpbiB0aGlzIGZp bGUgdW5sZXNzIGl0IG1ha2VzCisgKiBzZW5zZSB0byBkbyBvdGhlcndpc2UuIEZyb20gdG9wIHRv IGJvdHRvbToKKyAqIDEuIHR5cGVkZWZzCisgKiAyLiAjZGVmaW5lcywgYW5kIG1hY3JvcworICog My4gc3RydWN0dXJlIGRlZmluaXRpb25zCisgKiA0LiBmdW5jdGlvbiBwcm90b3R5cGVzCisgKgor ICogV2l0aGluIGVhY2ggc2VjdGlvbiwgcGxlYXNlIHRyeSB0byBvcmRlciBieSBnZW5lcmF0aW9u IGluIGFzY2VuZGluZyBvcmRlciwKKyAqIGZyb20gdG9wIHRvIGJvdHRvbSAoaWUuIGdlbjYgb24g dGhlIHRvcCwgZ2VuOCBvbiB0aGUgYm90dG9tKS4KKyAqLworCisjaWZuZGVmIF9fSU5URUxfR1RU X0hfXworI2RlZmluZSBfX0lOVEVMX0dUVF9IX18KKworI2luY2x1ZGUgPGxpbnV4L2lvLW1hcHBp bmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNp bmNsdWRlIDxsaW51eC9wYWdldmVjLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisK KyNpbmNsdWRlIDxkcm0vZHJtX21tLmg+CisKKyNpbmNsdWRlICJndC9pbnRlbF9yZXNldC5oIgor I2luY2x1ZGUgImk5MTVfZ2VtX2ZlbmNlX3JlZy5oIgorI2luY2x1ZGUgImk5MTVfc2VsZnRlc3Qu aCIKKworI2RlZmluZSBJOTE1X0dGUF9BTExPV19GQUlMIChHRlBfS0VSTkVMIHwgX19HRlBfUkVU UllfTUFZRkFJTCB8IF9fR0ZQX05PV0FSTikKKworI2lmIElTX0VOQUJMRUQoQ09ORklHX0RSTV9J OTE1X1RSQUNFX0dUVCkKKyNkZWZpbmUgREJHKC4uLikgdHJhY2VfcHJpbnRrKF9fVkFfQVJHU19f KQorI2Vsc2UKKyNkZWZpbmUgREJHKC4uLikKKyNlbmRpZgorCisjZGVmaW5lIE5BTExPQyAzIC8q IDEgbm9ybWFsLCAxIGZvciBjb25jdXJyZW50IHRocmVhZHMsIDEgZm9yIHByZWFsbG9jYXRpb24g Ki8KKworI2RlZmluZSBJOTE1X0dUVF9QQUdFX1NJWkVfNEsJQklUX1VMTCgxMikKKyNkZWZpbmUg STkxNV9HVFRfUEFHRV9TSVpFXzY0SwlCSVRfVUxMKDE2KQorI2RlZmluZSBJOTE1X0dUVF9QQUdF X1NJWkVfMk0JQklUX1VMTCgyMSkKKworI2RlZmluZSBJOTE1X0dUVF9QQUdFX1NJWkUgSTkxNV9H VFRfUEFHRV9TSVpFXzRLCisjZGVmaW5lIEk5MTVfR1RUX01BWF9QQUdFX1NJWkUgSTkxNV9HVFRf UEFHRV9TSVpFXzJNCisKKyNkZWZpbmUgSTkxNV9HVFRfUEFHRV9NQVNLIC1JOTE1X0dUVF9QQUdF X1NJWkUKKworI2RlZmluZSBJOTE1X0dUVF9NSU5fQUxJR05NRU5UIEk5MTVfR1RUX1BBR0VfU0la RQorCisjZGVmaW5lIEk5MTVfRkVOQ0VfUkVHX05PTkUgLTEKKyNkZWZpbmUgSTkxNV9NQVhfTlVN X0ZFTkNFUyAzMgorLyogMzIgZmVuY2VzICsgc2lnbiBiaXQgZm9yIEZFTkNFX1JFR19OT05FICov CisjZGVmaW5lIEk5MTVfTUFYX05VTV9GRU5DRV9CSVRTIDYKKwordHlwZWRlZiB1MzIgZ2VuNl9w dGVfdDsKK3R5cGVkZWYgdTY0IGdlbjhfcHRlX3Q7CisKKyNkZWZpbmUgZ2d0dF90b3RhbF9lbnRy aWVzKGdndHQpICgoZ2d0dCktPnZtLnRvdGFsID4+IFBBR0VfU0hJRlQpCisKKyNkZWZpbmUgSTkx NV9QVEVTKHB0ZV9sZW4pCQkoKHVuc2lnbmVkIGludCkoUEFHRV9TSVpFIC8gKHB0ZV9sZW4pKSkK KyNkZWZpbmUgSTkxNV9QVEVfTUFTSyhwdGVfbGVuKQkJKEk5MTVfUFRFUyhwdGVfbGVuKSAtIDEp CisjZGVmaW5lIEk5MTVfUERFUwkJCTUxMgorI2RlZmluZSBJOTE1X1BERV9NQVNLCQkJKEk5MTVf UERFUyAtIDEpCisKKy8qIGdlbjYtaHN3IGhhcyBiaXQgMTEtNCBmb3IgcGh5c2ljYWwgYWRkciBi aXQgMzktMzIgKi8KKyNkZWZpbmUgR0VONl9HVFRfQUREUl9FTkNPREUoYWRkcikJKChhZGRyKSB8 ICgoKGFkZHIpID4+IDI4KSAmIDB4ZmYwKSkKKyNkZWZpbmUgR0VONl9QVEVfQUREUl9FTkNPREUo YWRkcikJR0VONl9HVFRfQUREUl9FTkNPREUoYWRkcikKKyNkZWZpbmUgR0VONl9QREVfQUREUl9F TkNPREUoYWRkcikJR0VONl9HVFRfQUREUl9FTkNPREUoYWRkcikKKyNkZWZpbmUgR0VONl9QVEVf Q0FDSEVfTExDCQkoMiA8PCAxKQorI2RlZmluZSBHRU42X1BURV9VTkNBQ0hFRAkJKDEgPDwgMSkK KyNkZWZpbmUgR0VONl9QVEVfVkFMSUQJCQkoMSA8PCAwKQorCisjZGVmaW5lIEdFTjZfUFRFUwkJ CUk5MTVfUFRFUyhzaXplb2YoZ2VuNl9wdGVfdCkpCisjZGVmaW5lIEdFTjZfUERfU0laRQkJICAg ICAgICAoSTkxNV9QREVTICogUEFHRV9TSVpFKQorI2RlZmluZSBHRU42X1BEX0FMSUdOCQkJKFBB R0VfU0laRSAqIDE2KQorI2RlZmluZSBHRU42X1BERV9TSElGVAkJCTIyCisjZGVmaW5lIEdFTjZf UERFX1ZBTElECQkJKDEgPDwgMCkKKyNkZWZpbmUgTlVNX1BURShwZGVfc2hpZnQpICAgICAoMSA8 PCAocGRlX3NoaWZ0IC0gUEFHRV9TSElGVCkpCisKKyNkZWZpbmUgR0VON19QVEVfQ0FDSEVfTDNf TExDCQkoMyA8PCAxKQorCisjZGVmaW5lIEJZVF9QVEVfU05PT1BFRF9CWV9DUFVfQ0FDSEVTCSgx IDw8IDIpCisjZGVmaW5lIEJZVF9QVEVfV1JJVEVBQkxFCQkoMSA8PCAxKQorCisvKiBDYWNoZWFi aWxpdHkgQ29udHJvbCBpcyBhIDQtYml0IHZhbHVlLiBUaGUgbG93IHRocmVlIGJpdHMgYXJlIHN0 b3JlZCBpbiBiaXRzCisgKiAzOjEgb2YgdGhlIFBURSwgd2hpbGUgdGhlIGZvdXJ0aCBiaXQgaXMg c3RvcmVkIGluIGJpdCAxMSBvZiB0aGUgUFRFLgorICovCisjZGVmaW5lIEhTV19DQUNIRUFCSUxJ VFlfQ09OVFJPTChiaXRzKQkoKCgoYml0cykgJiAweDcpIDw8IDEpIHwgXAorCQkJCQkgKCgoYml0 cykgJiAweDgpIDw8ICgxMSAtIDMpKSkKKyNkZWZpbmUgSFNXX1dCX0xMQ19BR0UzCQkJSFNXX0NB Q0hFQUJJTElUWV9DT05UUk9MKDB4MikKKyNkZWZpbmUgSFNXX1dCX0xMQ19BR0UwCQkJSFNXX0NB Q0hFQUJJTElUWV9DT05UUk9MKDB4MykKKyNkZWZpbmUgSFNXX1dCX0VMTENfTExDX0FHRTMJCUhT V19DQUNIRUFCSUxJVFlfQ09OVFJPTCgweDgpCisjZGVmaW5lIEhTV19XQl9FTExDX0xMQ19BR0Uw CQlIU1dfQ0FDSEVBQklMSVRZX0NPTlRST0woMHhiKQorI2RlZmluZSBIU1dfV1RfRUxMQ19MTENf QUdFMwkJSFNXX0NBQ0hFQUJJTElUWV9DT05UUk9MKDB4NykKKyNkZWZpbmUgSFNXX1dUX0VMTENf TExDX0FHRTAJCUhTV19DQUNIRUFCSUxJVFlfQ09OVFJPTCgweDYpCisjZGVmaW5lIEhTV19QVEVf VU5DQUNIRUQJCSgwKQorI2RlZmluZSBIU1dfR1RUX0FERFJfRU5DT0RFKGFkZHIpCSgoYWRkcikg fCAoKChhZGRyKSA+PiAyOCkgJiAweDdmMCkpCisjZGVmaW5lIEhTV19QVEVfQUREUl9FTkNPREUo YWRkcikJSFNXX0dUVF9BRERSX0VOQ09ERShhZGRyKQorCisvKgorICogR0VOOCAzMmIgc3R5bGUg YWRkcmVzcyBpcyBkZWZpbmVkIGFzIGEgMyBsZXZlbCBwYWdlIHRhYmxlOgorICogMzE6MzAgfCAy OToyMSB8IDIwOjEyIHwgIDExOjAKKyAqIFBEUEUgIHwgIFBERSAgfCAgUFRFICB8IG9mZnNldAor ICogVGhlIGRpZmZlcmVuY2UgYXMgY29tcGFyZWQgdG8gbm9ybWFsIHg4NiAzIGxldmVsIHBhZ2Ug dGFibGUgaXMgdGhlIFBEUEVzIGFyZQorICogcHJvZ3JhbW1lZCB2aWEgcmVnaXN0ZXIuCisgKgor ICogR0VOOCA0OGIgc3R5bGUgYWRkcmVzcyBpcyBkZWZpbmVkIGFzIGEgNCBsZXZlbCBwYWdlIHRh YmxlOgorICogNDc6MzkgfCAzODozMCB8IDI5OjIxIHwgMjA6MTIgfCAgMTE6MAorICogUE1MNEUg fCBQRFBFICB8ICBQREUgIHwgIFBURSAgfCBvZmZzZXQKKyAqLworI2RlZmluZSBHRU44XzNMVkxf UERQRVMJCQk0CisKKyNkZWZpbmUgUFBBVF9VTkNBQ0hFRAkJCShfUEFHRV9QV1QgfCBfUEFHRV9Q Q0QpCisjZGVmaW5lIFBQQVRfQ0FDSEVEX1BERQkJCTAgLyogV0IgTExDICovCisjZGVmaW5lIFBQ QVRfQ0FDSEVECQkJX1BBR0VfUEFUIC8qIFdCIExMQ2VMTEMgKi8KKyNkZWZpbmUgUFBBVF9ESVNQ TEFZX0VMTEMJCV9QQUdFX1BDRCAvKiBXVCBlTExDICovCisKKyNkZWZpbmUgQ0hWX1BQQVRfU05P T1AJCQkoMTw8NikKKyNkZWZpbmUgR0VOOF9QUEFUX0FHRSh4KQkJKCh4KTw8NCkKKyNkZWZpbmUg R0VOOF9QUEFUX0xMQ2VMTEMJCSgzPDwyKQorI2RlZmluZSBHRU44X1BQQVRfTExDRUxMQwkJKDI8 PDIpCisjZGVmaW5lIEdFTjhfUFBBVF9MTEMJCQkoMTw8MikKKyNkZWZpbmUgR0VOOF9QUEFUX1dC CQkJKDM8PDApCisjZGVmaW5lIEdFTjhfUFBBVF9XVAkJCSgyPDwwKQorI2RlZmluZSBHRU44X1BQ QVRfV0MJCQkoMTw8MCkKKyNkZWZpbmUgR0VOOF9QUEFUX1VDCQkJKDA8PDApCisjZGVmaW5lIEdF TjhfUFBBVF9FTExDX09WRVJSSURFCQkoMDw8MikKKyNkZWZpbmUgR0VOOF9QUEFUKGksIHgpCQkJ KCh1NjQpKHgpIDw8ICgoaSkgKiA4KSkKKworI2RlZmluZSBHRU44X1BERV9JUFNfNjRLIEJJVCgx MSkKKyNkZWZpbmUgR0VOOF9QREVfUFNfMk0gICBCSVQoNykKKworI2RlZmluZSBmb3JfZWFjaF9z Z3RfZGFkZHIoX19kcCwgX19pdGVyLCBfX3NndCkgXAorCV9fZm9yX2VhY2hfc2d0X2RhZGRyKF9f ZHAsIF9faXRlciwgX19zZ3QsIEk5MTVfR1RUX1BBR0VfU0laRSkKKworLyoqCisgKiBET0M6IEds b2JhbCBHVFQgdmlld3MKKyAqCisgKiBCYWNrZ3JvdW5kIGFuZCBwcmV2aW91cyBzdGF0ZQorICoK KyAqIEhpc3RvcmljYWxseSBvYmplY3RzIGNvdWxkIGV4aXN0cyAoYmUgYm91bmQpIGluIGdsb2Jh bCBHVFQgc3BhY2Ugb25seSBhcworICogc2luZ3VsYXIgaW5zdGFuY2VzIHdpdGggYSB2aWV3IHJl cHJlc2VudGluZyBhbGwgb2YgdGhlIG9iamVjdCdzIGJhY2tpbmcgcGFnZXMKKyAqIGluIGEgbGlu ZWFyIGZhc2hpb24uIFRoaXMgdmlldyB3aWxsIGJlIGNhbGxlZCBhIG5vcm1hbCB2aWV3LgorICoK KyAqIFRvIHN1cHBvcnQgbXVsdGlwbGUgdmlld3Mgb2YgdGhlIHNhbWUgb2JqZWN0LCB3aGVyZSB0 aGUgbnVtYmVyIG9mIG1hcHBlZAorICogcGFnZXMgaXMgbm90IGVxdWFsIHRvIHRoZSBiYWNraW5n IHN0b3JlLCBvciB3aGVyZSB0aGUgbGF5b3V0IG9mIHRoZSBwYWdlcworICogaXMgbm90IGxpbmVh ciwgY29uY2VwdCBvZiBhIEdHVFQgdmlldyB3YXMgYWRkZWQuCisgKgorICogT25lIGV4YW1wbGUg b2YgYW4gYWx0ZXJuYXRpdmUgdmlldyBpcyBhIHN0ZXJlbyBkaXNwbGF5IGRyaXZlbiBieSBhIHNp bmdsZQorICogaW1hZ2UuIEluIHRoaXMgY2FzZSB3ZSB3b3VsZCBoYXZlIGEgZnJhbWVidWZmZXIg bG9va2luZyBsaWtlIHRoaXMKKyAqICgyeDIgcGFnZXMpOgorICoKKyAqICAgIDEyCisgKiAgICAz NAorICoKKyAqIEFib3ZlIHdvdWxkIHJlcHJlc2VudCBhIG5vcm1hbCBHR1RUIHZpZXcgYXMgbm9y bWFsbHkgbWFwcGVkIGZvciBHUFUgb3IgQ1BVCisgKiByZW5kZXJpbmcuIEluIGNvbnRyYXN0LCBm ZWQgdG8gdGhlIGRpc3BsYXkgZW5naW5lIHdvdWxkIGJlIGFuIGFsdGVybmF0aXZlCisgKiB2aWV3 IHdoaWNoIGNvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczoKKyAqCisgKiAgIDEyMTIKKyAq ICAgMzQzNAorICoKKyAqIEluIHRoaXMgZXhhbXBsZSBib3RoIHRoZSBzaXplIGFuZCBsYXlvdXQg b2YgcGFnZXMgaW4gdGhlIGFsdGVybmF0aXZlIHZpZXcgaXMKKyAqIGRpZmZlcmVudCBmcm9tIHRo ZSBub3JtYWwgdmlldy4KKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBhbmQgdXNhZ2UKKyAqCisgKiBH R1RUIHZpZXdzIGFyZSBpbXBsZW1lbnRlZCB1c2luZyBWTUFzIGFuZCBhcmUgZGlzdGluZ3Vpc2hl ZCB2aWEgZW51bQorICogaTkxNV9nZ3R0X3ZpZXdfdHlwZSBhbmQgc3RydWN0IGk5MTVfZ2d0dF92 aWV3LgorICoKKyAqIEEgbmV3IGZsYXZvdXIgb2YgY29yZSBHRU0gZnVuY3Rpb25zIHdoaWNoIHdv cmsgd2l0aCBHR1RUIGJvdW5kIG9iamVjdHMgd2VyZQorICogYWRkZWQgd2l0aCB0aGUgX2dndHRf IGluZml4LCBhbmQgc29tZXRpbWVzIHdpdGggX3ZpZXcgcG9zdGZpeCB0byBhdm9pZAorICogcmVu YW1pbmcgIGluIGxhcmdlIGFtb3VudHMgb2YgY29kZS4gVGhleSB0YWtlIHRoZSBzdHJ1Y3QgaTkx NV9nZ3R0X3ZpZXcKKyAqIHBhcmFtZXRlciBlbmNhcHN1bGF0aW5nIGFsbCBtZXRhZGF0YSByZXF1 aXJlZCB0byBpbXBsZW1lbnQgYSB2aWV3LgorICoKKyAqIEFzIGEgaGVscGVyIGZvciBjYWxsZXJz IHdoaWNoIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIG5vcm1hbCB2aWV3LAorICogZ2xvYmFs bHkgY29uc3QgaTkxNV9nZ3R0X3ZpZXdfbm9ybWFsIHNpbmdsZXRvbiBpbnN0YW5jZSBleGlzdHMu IEFsbCBvbGQgY29yZQorICogR0VNIEFQSSBmdW5jdGlvbnMsIHRoZSBvbmVzIG5vdCB0YWtpbmcg dGhlIHZpZXcgcGFyYW1ldGVyLCBhcmUgb3BlcmF0aW5nIG9uLAorICogb3Igd2l0aCB0aGUgbm9y bWFsIEdHVFQgdmlldy4KKyAqCisgKiBDb2RlIHdhbnRpbmcgdG8gYWRkIG9yIHVzZSBhIG5ldyBH R1RUIHZpZXcgbmVlZHMgdG86CisgKgorICogMS4gQWRkIGEgbmV3IGVudW0gd2l0aCBhIHN1aXRh YmxlIG5hbWUuCisgKiAyLiBFeHRlbmQgdGhlIG1ldGFkYXRhIGluIHRoZSBpOTE1X2dndHRfdmll dyBzdHJ1Y3R1cmUgaWYgcmVxdWlyZWQuCisgKiAzLiBBZGQgc3VwcG9ydCB0byBpOTE1X2dldF92 bWFfcGFnZXMoKS4KKyAqCisgKiBOZXcgdmlld3MgYXJlIHJlcXVpcmVkIHRvIGJ1aWxkIGEgc2Nh dHRlci1nYXRoZXIgdGFibGUgZnJvbSB3aXRoaW4gdGhlCisgKiBpOTE1X2dldF92bWFfcGFnZXMg ZnVuY3Rpb24uIFRoaXMgdGFibGUgaXMgc3RvcmVkIGluIHRoZSB2bWEuZ2d0dF92aWV3IGFuZAor ICogZXhpc3RzIGZvciB0aGUgbGlmZXRpbWUgb2YgYW4gVk1BLgorICoKKyAqIENvcmUgQVBJIGlz IGRlc2lnbmVkIHRvIGhhdmUgY29weSBzZW1hbnRpY3Mgd2hpY2ggbWVhbnMgdGhhdCBwYXNzZWQg aW4KKyAqIHN0cnVjdCBpOTE1X2dndHRfdmlldyBkb2VzIG5vdCBuZWVkIHRvIGJlIHBlcnNpc3Rl bnQgKGxlZnQgYXJvdW5kIGFmdGVyCisgKiBjYWxsaW5nIHRoZSBjb3JlIEFQSSBmdW5jdGlvbnMp LgorICoKKyAqLworCitzdHJ1Y3QgaW50ZWxfcmVtYXBwZWRfcGxhbmVfaW5mbyB7CisJLyogaW4g Z3R0IHBhZ2VzICovCisJdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgb2Zmc2V0 OworfSBfX3BhY2tlZDsKKworc3RydWN0IGludGVsX3JlbWFwcGVkX2luZm8geworCXN0cnVjdCBp bnRlbF9yZW1hcHBlZF9wbGFuZV9pbmZvIHBsYW5lWzJdOworCXVuc2lnbmVkIGludCB1bnVzZWRf bWJ6OworfSBfX3BhY2tlZDsKKworc3RydWN0IGludGVsX3JvdGF0aW9uX2luZm8geworCXN0cnVj dCBpbnRlbF9yZW1hcHBlZF9wbGFuZV9pbmZvIHBsYW5lWzJdOworfSBfX3BhY2tlZDsKKworc3Ry dWN0IGludGVsX3BhcnRpYWxfaW5mbyB7CisJdTY0IG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgc2l6 ZTsKK30gX19wYWNrZWQ7CisKK2VudW0gaTkxNV9nZ3R0X3ZpZXdfdHlwZSB7CisJSTkxNV9HR1RU X1ZJRVdfTk9STUFMID0gMCwKKwlJOTE1X0dHVFRfVklFV19ST1RBVEVEID0gc2l6ZW9mKHN0cnVj dCBpbnRlbF9yb3RhdGlvbl9pbmZvKSwKKwlJOTE1X0dHVFRfVklFV19QQVJUSUFMID0gc2l6ZW9m KHN0cnVjdCBpbnRlbF9wYXJ0aWFsX2luZm8pLAorCUk5MTVfR0dUVF9WSUVXX1JFTUFQUEVEID0g c2l6ZW9mKHN0cnVjdCBpbnRlbF9yZW1hcHBlZF9pbmZvKSwKK307CisKK3N0YXRpYyBpbmxpbmUg dm9pZCBhc3NlcnRfaTkxNV9nZW1fZ3R0X3R5cGVzKHZvaWQpCit7CisJQlVJTERfQlVHX09OKHNp emVvZihzdHJ1Y3QgaW50ZWxfcm90YXRpb25faW5mbykgIT0gOCpzaXplb2YodW5zaWduZWQgaW50 KSk7CisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgaW50ZWxfcGFydGlhbF9pbmZvKSAhPSBz aXplb2YodTY0KSArIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKwlCVUlMRF9CVUdfT04oc2l6ZW9m KHN0cnVjdCBpbnRlbF9yZW1hcHBlZF9pbmZvKSAhPSA5KnNpemVvZih1bnNpZ25lZCBpbnQpKTsK KworCS8qIENoZWNrIHRoYXQgcm90YXRpb24vcmVtYXBwZWQgc2hhcmVzIG9mZnNldHMgZm9yIHNp bXBsaWNpdHkgKi8KKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGludGVsX3JlbWFwcGVk X2luZm8sIHBsYW5lWzBdKSAhPQorCQkgICAgIG9mZnNldG9mKHN0cnVjdCBpbnRlbF9yb3RhdGlv bl9pbmZvLCBwbGFuZVswXSkpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZmVuZChzdHJ1Y3QgaW50 ZWxfcmVtYXBwZWRfaW5mbywgcGxhbmVbMV0pICE9CisJCSAgICAgb2Zmc2V0b2ZlbmQoc3RydWN0 IGludGVsX3JvdGF0aW9uX2luZm8sIHBsYW5lWzFdKSk7CisKKwkvKiBBcyB3ZSBlbmNvZGUgdGhl IHNpemUgb2YgZWFjaCBicmFuY2ggaW5zaWRlIHRoZSB1bmlvbiBpbnRvIGl0cyB0eXBlLAorCSAq IHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCB0aGF0IGVhY2ggYnJhbmNoIGhhcyBhIHVuaXF1ZSBzaXpl LgorCSAqLworCXN3aXRjaCAoKGVudW0gaTkxNV9nZ3R0X3ZpZXdfdHlwZSkwKSB7CisJY2FzZSBJ OTE1X0dHVFRfVklFV19OT1JNQUw6CisJY2FzZSBJOTE1X0dHVFRfVklFV19QQVJUSUFMOgorCWNh c2UgSTkxNV9HR1RUX1ZJRVdfUk9UQVRFRDoKKwljYXNlIEk5MTVfR0dUVF9WSUVXX1JFTUFQUEVE OgorCQkvKiBnY2MgY29tcGxhaW5zIGlmIHRoZXNlIGFyZSBpZGVudGljYWwgY2FzZXMgKi8KKwkJ YnJlYWs7CisJfQorfQorCitzdHJ1Y3QgaTkxNV9nZ3R0X3ZpZXcgeworCWVudW0gaTkxNV9nZ3R0 X3ZpZXdfdHlwZSB0eXBlOworCXVuaW9uIHsKKwkJLyogTWVtYmVycyBuZWVkIHRvIGNvbnRhaW4g bm8gaG9sZXMvcGFkZGluZyAqLworCQlzdHJ1Y3QgaW50ZWxfcGFydGlhbF9pbmZvIHBhcnRpYWw7 CisJCXN0cnVjdCBpbnRlbF9yb3RhdGlvbl9pbmZvIHJvdGF0ZWQ7CisJCXN0cnVjdCBpbnRlbF9y ZW1hcHBlZF9pbmZvIHJlbWFwcGVkOworCX07Cit9OworCitzdHJ1Y3QgaTkxNV9wYWdlX2RtYSB7 CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5pb24geworCQlkbWFfYWRkcl90IGRhZGRyOworCisJ CS8qIEZvciBnZW42L2dlbjcgb25seS4gVGhpcyBpcyB0aGUgb2Zmc2V0IGluIHRoZSBHR1RUCisJ CSAqIHdoZXJlIHRoZSBwYWdlIGRpcmVjdG9yeSBlbnRyaWVzIGZvciBQUEdUVCBiZWdpbgorCQkg Ki8KKwkJdTMyIGdndHRfb2Zmc2V0OworCX07Cit9OworCitzdHJ1Y3QgaTkxNV9wYWdlX3NjcmF0 Y2ggeworCXN0cnVjdCBpOTE1X3BhZ2VfZG1hIGJhc2U7CisJdTY0IGVuY29kZTsKK307CisKK3N0 cnVjdCBpOTE1X3BhZ2VfdGFibGUgeworCXN0cnVjdCBpOTE1X3BhZ2VfZG1hIGJhc2U7CisJYXRv bWljX3QgdXNlZDsKK307CisKK3N0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5IHsKKwlzdHJ1Y3Qg aTkxNV9wYWdlX3RhYmxlIHB0OworCXNwaW5sb2NrX3QgbG9jazsKKwl2b2lkICplbnRyeVs1MTJd OworfTsKKworI2RlZmluZSBfX3B4X2Nob29zZV9leHByKHgsIHR5cGUsIGV4cHIsIG90aGVyKSBc CisJX19idWlsdGluX2Nob29zZV9leHByKCBcCisJX19idWlsdGluX3R5cGVzX2NvbXBhdGlibGVf cCh0eXBlb2YoeCksIHR5cGUpIHx8IFwKKwlfX2J1aWx0aW5fdHlwZXNfY29tcGF0aWJsZV9wKHR5 cGVvZih4KSwgY29uc3QgdHlwZSksIFwKKwkoeyB0eXBlIF9feCA9ICh0eXBlKSh4KTsgZXhwcjsg fSksIFwKKwlvdGhlcikKKworI2RlZmluZSBweF9iYXNlKHB4KSBcCisJX19weF9jaG9vc2VfZXhw cihweCwgc3RydWN0IGk5MTVfcGFnZV9kbWEgKiwgX194LCBcCisJX19weF9jaG9vc2VfZXhwcihw eCwgc3RydWN0IGk5MTVfcGFnZV9zY3JhdGNoICosICZfX3gtPmJhc2UsIFwKKwlfX3B4X2Nob29z ZV9leHByKHB4LCBzdHJ1Y3QgaTkxNV9wYWdlX3RhYmxlICosICZfX3gtPmJhc2UsIFwKKwlfX3B4 X2Nob29zZV9leHByKHB4LCBzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqLCAmX194LT5wdC5i YXNlLCBcCisJKHZvaWQpMCkpKSkKKyNkZWZpbmUgcHhfZG1hKHB4KSAocHhfYmFzZShweCktPmRh ZGRyKQorCisjZGVmaW5lIHB4X3B0KHB4KSBcCisJX19weF9jaG9vc2VfZXhwcihweCwgc3RydWN0 IGk5MTVfcGFnZV90YWJsZSAqLCBfX3gsIFwKKwlfX3B4X2Nob29zZV9leHByKHB4LCBzdHJ1Y3Qg aTkxNV9wYWdlX2RpcmVjdG9yeSAqLCAmX194LT5wdCwgXAorCSh2b2lkKTApKQorI2RlZmluZSBw eF91c2VkKHB4KSAoJnB4X3B0KHB4KS0+dXNlZCkKKworZW51bSBpOTE1X2NhY2hlX2xldmVsOwor CitzdHJ1Y3QgZHJtX2k5MTVfZmlsZV9wcml2YXRlOworc3RydWN0IGRybV9pOTE1X2dlbV9vYmpl Y3Q7CitzdHJ1Y3QgaTkxNV92bWE7CitzdHJ1Y3QgaW50ZWxfZ3Q7CisKK3N0cnVjdCBpOTE1X3Zt YV9vcHMgeworCS8qIE1hcCBhbiBvYmplY3QgaW50byBhbiBhZGRyZXNzIHNwYWNlIHdpdGggdGhl IGdpdmVuIGNhY2hlIGZsYWdzLiAqLworCWludCAoKmJpbmRfdm1hKShzdHJ1Y3QgaTkxNV92bWEg KnZtYSwKKwkJCWVudW0gaTkxNV9jYWNoZV9sZXZlbCBjYWNoZV9sZXZlbCwKKwkJCXUzMiBmbGFn cyk7CisJLyoKKwkgKiBVbm1hcCBhbiBvYmplY3QgZnJvbSBhbiBhZGRyZXNzIHNwYWNlLiBUaGlz IHVzdWFsbHkgY29uc2lzdHMgb2YKKwkgKiBzZXR0aW5nIHRoZSB2YWxpZCBQVEUgZW50cmllcyB0 byBhIHJlc2VydmVkIHNjcmF0Y2ggcGFnZS4KKwkgKi8KKwl2b2lkICgqdW5iaW5kX3ZtYSkoc3Ry dWN0IGk5MTVfdm1hICp2bWEpOworCisJaW50ICgqc2V0X3BhZ2VzKShzdHJ1Y3QgaTkxNV92bWEg KnZtYSk7CisJdm9pZCAoKmNsZWFyX3BhZ2VzKShzdHJ1Y3QgaTkxNV92bWEgKnZtYSk7Cit9Owor CitzdHJ1Y3QgcGFnZXN0YXNoIHsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IHBhZ2V2ZWMg cHZlYzsKK307CisKK3ZvaWQgc3Rhc2hfaW5pdChzdHJ1Y3QgcGFnZXN0YXNoICpzdGFzaCk7CisK K3N0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgeworCXN0cnVjdCBrcmVmIHJlZjsKKwlzdHJ1Y3Qg cmN1X3dvcmsgcmN1OworCisJc3RydWN0IGRybV9tbSBtbTsKKwlzdHJ1Y3QgaW50ZWxfZ3QgKmd0 OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1OworCXN0cnVjdCBkZXZpY2UgKmRtYTsK KwkvKiBFdmVyeSBhZGRyZXNzIHNwYWNlIGJlbG9uZ3MgdG8gYSBzdHJ1Y3QgZmlsZSAtIGV4Y2Vw dCBmb3IgdGhlIGdsb2JhbAorCSAqIEdUVCB0aGF0IGlzIG93bmVkIGJ5IHRoZSBkcml2ZXIgKGFu ZCBzbyBAZmlsZSBpcyBzZXQgdG8gTlVMTCkuIEluCisJICogcHJpbmNpcGxlLCBubyBpbmZvcm1h dGlvbiBzaG91bGQgbGVhayBmcm9tIG9uZSBjb250ZXh0IHRvIGFub3RoZXIKKwkgKiAob3IgYmV0 d2VlbiBmaWxlcy9wcm9jZXNzZXMgZXRjKSB1bmxlc3MgZXhwbGljaXRseSBzaGFyZWQgYnkgdGhl CisJICogb3duZXIuIFRyYWNraW5nIHRoZSBvd25lciBpcyBpbXBvcnRhbnQgaW4gb3JkZXIgdG8g ZnJlZSB1cCBwZXItZmlsZQorCSAqIG9iamVjdHMgYWxvbmcgd2l0aCB0aGUgZmlsZSwgdG8gYWlk ZSByZXNvdXJjZSB0cmFja2luZywgYW5kIHRvCisJICogYXNzaWduIGJsYW1lLgorCSAqLworCXN0 cnVjdCBkcm1faTkxNV9maWxlX3ByaXZhdGUgKmZpbGU7CisJdTY0IHRvdGFsOwkJLyogc2l6ZSBh ZGRyIHNwYWNlIG1hcHMgKGV4LiAyR0IgZm9yIGdndHQpICovCisJdTY0IHJlc2VydmVkOwkJLyog c2l6ZSBhZGRyIHNwYWNlIHJlc2VydmVkICovCisKKwl1bnNpZ25lZCBpbnQgYmluZF9hc3luY19m bGFnczsKKworCS8qCisJICogRWFjaCBhY3RpdmUgdXNlciBjb250ZXh0IGhhcyBpdHMgb3duIGFk ZHJlc3Mgc3BhY2UgKGluIGZ1bGwtcHBndHQpLgorCSAqIFNpbmNlIHRoZSB2bSBtYXkgYmUgc2hh cmVkIGJldHdlZW4gbXVsdGlwbGUgY29udGV4dHMsIHdlIGNvdW50IGhvdworCSAqIG1hbnkgY29u dGV4dHMga2VlcCB1cyAib3BlbiIuIE9uY2Ugb3BlbiBoaXRzIHplcm8sIHdlIGFyZSBjbG9zZWQK KwkgKiBhbmQgZG8gbm90IGFsbG93IGFueSBuZXcgYXR0YWNobWVudHMsIGFuZCBwcm9jZWVkIHRv IHNodXRkb3duIG91cgorCSAqIHZtYSBhbmQgcGFnZSBkaXJlY3Rvcmllcy4KKwkgKi8KKwlhdG9t aWNfdCBvcGVuOworCisJc3RydWN0IG11dGV4IG11dGV4OyAvKiBwcm90ZWN0cyB2bWEgYW5kIG91 ciBsaXN0cyAqLworI2RlZmluZSBWTV9DTEFTU19HR1RUIDAKKyNkZWZpbmUgVk1fQ0xBU1NfUFBH VFQgMQorCisJc3RydWN0IGk5MTVfcGFnZV9zY3JhdGNoIHNjcmF0Y2hbNF07CisJdW5zaWduZWQg aW50IHNjcmF0Y2hfb3JkZXI7CisJdW5zaWduZWQgaW50IHRvcDsKKworCS8qKgorCSAqIExpc3Qg b2Ygdm1hIGN1cnJlbnRseSBib3VuZC4KKwkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGJvdW5kX2xp c3Q7CisKKwlzdHJ1Y3QgcGFnZXN0YXNoIGZyZWVfcGFnZXM7CisKKwkvKiBHbG9iYWwgR1RUICov CisJYm9vbCBpc19nZ3R0OjE7CisKKwkvKiBTb21lIHN5c3RlbXMgcmVxdWlyZSB1bmNhY2hlZCB1 cGRhdGVzIG9mIHRoZSBwYWdlIGRpcmVjdG9yaWVzICovCisJYm9vbCBwdF9rbWFwX3djOjE7CisK KwkvKiBTb21lIHN5c3RlbXMgc3VwcG9ydCByZWFkLW9ubHkgbWFwcGluZ3MgZm9yIEdHVFQgYW5k L29yIFBQR1RUICovCisJYm9vbCBoYXNfcmVhZF9vbmx5OjE7CisKKwl1NjQgKCpwdGVfZW5jb2Rl KShkbWFfYWRkcl90IGFkZHIsCisJCQkgIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBsZXZlbCwKKwkJ CSAgdTMyIGZsYWdzKTsgLyogQ3JlYXRlIGEgdmFsaWQgUFRFICovCisjZGVmaW5lIFBURV9SRUFE X09OTFkJKDE8PDApCisKKwlpbnQgKCphbGxvY2F0ZV92YV9yYW5nZSkoc3RydWN0IGk5MTVfYWRk cmVzc19zcGFjZSAqdm0sCisJCQkJIHU2NCBzdGFydCwgdTY0IGxlbmd0aCk7CisJdm9pZCAoKmNs ZWFyX3JhbmdlKShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKKwkJCSAgICB1NjQgc3Rh cnQsIHU2NCBsZW5ndGgpOworCXZvaWQgKCppbnNlcnRfcGFnZSkoc3RydWN0IGk5MTVfYWRkcmVz c19zcGFjZSAqdm0sCisJCQkgICAgZG1hX2FkZHJfdCBhZGRyLAorCQkJICAgIHU2NCBvZmZzZXQs CisJCQkgICAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGNhY2hlX2xldmVsLAorCQkJICAgIHUzMiBm bGFncyk7CisJdm9pZCAoKmluc2VydF9lbnRyaWVzKShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNl ICp2bSwKKwkJCSAgICAgICBzdHJ1Y3QgaTkxNV92bWEgKnZtYSwKKwkJCSAgICAgICBlbnVtIGk5 MTVfY2FjaGVfbGV2ZWwgY2FjaGVfbGV2ZWwsCisJCQkgICAgICAgdTMyIGZsYWdzKTsKKwl2b2lk ICgqY2xlYW51cCkoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pOworCisJc3RydWN0IGk5 MTVfdm1hX29wcyB2bWFfb3BzOworCisJSTkxNV9TRUxGVEVTVF9ERUNMQVJFKHN0cnVjdCBmYXVs dF9hdHRyIGZhdWx0X2F0dHIpOworCUk5MTVfU0VMRlRFU1RfREVDTEFSRShib29sIHNjcnViXzY0 Syk7Cit9OworCisvKiBUaGUgR3JhcGhpY3MgVHJhbnNsYXRpb24gVGFibGUgaXMgdGhlIHdheSBp biB3aGljaCBHRU4gaGFyZHdhcmUgdHJhbnNsYXRlcyBhCisgKiBHcmFwaGljcyBWaXJ0dWFsIEFk ZHJlc3MgaW50byBhIFBoeXNpY2FsIEFkZHJlc3MuIEluIGFkZGl0aW9uIHRvIHRoZSBub3JtYWwK KyAqIGNvbGxhdGVyYWwgYXNzb2NpYXRlZCB3aXRoIGFueSB2YS0+cGEgdHJhbnNsYXRpb25zIEdF TiBoYXJkd2FyZSBhbHNvIGhhcyBhCisgKiBwb3J0aW9uIG9mIHRoZSBHVFQgd2hpY2ggY2FuIGJl IG1hcHBlZCBieSB0aGUgQ1BVIGFuZCByZW1haW4gYm90aCBjb2hlcmVudAorICogYW5kIGNvcnJl Y3QgKGluIGNhc2VzIGxpa2Ugc3dpenpsaW5nKS4gVGhhdCByZWdpb24gaXMgcmVmZXJyZWQgdG8g YXMgR01BRFIgaW4KKyAqIHRoZSBzcGVjLgorICovCitzdHJ1Y3QgaTkxNV9nZ3R0IHsKKwlzdHJ1 Y3QgaTkxNV9hZGRyZXNzX3NwYWNlIHZtOworCisJc3RydWN0IGlvX21hcHBpbmcgaW9tYXA7CS8q IE1hcHBpbmcgdG8gb3VyIENQVSBtYXBwYWJsZSByZWdpb24gKi8KKwlzdHJ1Y3QgcmVzb3VyY2Ug Z21hZHI7ICAgICAgICAgIC8qIEdNQURSIHJlc291cmNlICovCisJcmVzb3VyY2Vfc2l6ZV90IG1h cHBhYmxlX2VuZDsJLyogRW5kIG9mZnNldCB0aGF0IHdlIGNhbiBDUFUgbWFwICovCisKKwkvKiog IkdyYXBoaWNzIFN0b2xlbiBNZW1vcnkiIGhvbGRzIHRoZSBnbG9iYWwgUFRFcyAqLworCXZvaWQg X19pb21lbSAqZ3NtOworCXZvaWQgKCppbnZhbGlkYXRlKShzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0 KTsKKworCS8qKiBQUEdUVCB1c2VkIGZvciBhbGlhc2luZyB0aGUgUFBHVFQgd2l0aCB0aGUgR1RU ICovCisJc3RydWN0IGk5MTVfcHBndHQgKmFsaWFzOworCisJYm9vbCBkb19pZGxlX21hcHM7CisK KwlpbnQgbXRycjsKKworCS8qKiBCaXQgNiBzd2l6emxpbmcgcmVxdWlyZWQgZm9yIFggdGlsaW5n ICovCisJdTMyIGJpdF82X3N3aXp6bGVfeDsKKwkvKiogQml0IDYgc3dpenpsaW5nIHJlcXVpcmVk IGZvciBZIHRpbGluZyAqLworCXUzMiBiaXRfNl9zd2l6emxlX3k7CisKKwl1MzIgcGluX2JpYXM7 CisKKwl1bnNpZ25lZCBpbnQgbnVtX2ZlbmNlczsKKwlzdHJ1Y3QgaTkxNV9mZW5jZV9yZWcgZmVu Y2VfcmVnc1tJOTE1X01BWF9OVU1fRkVOQ0VTXTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZlbmNlX2xp c3Q7CisKKwkvKiogTGlzdCBvZiBhbGwgb2JqZWN0cyBpbiBndHRfc3BhY2UsIGN1cnJlbnRseSBt bWFwZWQgYnkgdXNlcnNwYWNlLgorCSAqIEFsbCBvYmplY3RzIHdpdGhpbiB0aGlzIGxpc3QgbXVz dCBhbHNvIGJlIG9uIGJvdW5kX2xpc3QuCisJICovCisJc3RydWN0IGxpc3RfaGVhZCB1c2VyZmF1 bHRfbGlzdDsKKworCS8qIE1hbnVhbCBydW50aW1lIHBtIGF1dG9zdXNwZW5kIGRlbGF5IGZvciB1 c2VyIEdHVFQgbW1hcHMgKi8KKwlzdHJ1Y3QgaW50ZWxfd2FrZXJlZl9hdXRvIHVzZXJmYXVsdF93 YWtlcmVmOworCisJc3RydWN0IGRybV9tbV9ub2RlIGVycm9yX2NhcHR1cmU7CisJc3RydWN0IGRy bV9tbV9ub2RlIHVjX2Z3OworfTsKKworc3RydWN0IGk5MTVfcHBndHQgeworCXN0cnVjdCBpOTE1 X2FkZHJlc3Nfc3BhY2Ugdm07CisKKwlzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqcGQ7Cit9 OworCisjZGVmaW5lIGk5MTVfaXNfZ2d0dCh2bSkgKCh2bSktPmlzX2dndHQpCisKK3N0YXRpYyBp bmxpbmUgYm9vbAoraTkxNV92bV9pc180bHZsKGNvbnN0IHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3Bh Y2UgKnZtKQoreworCXJldHVybiAodm0tPnRvdGFsIC0gMSkgPj4gMzI7Cit9CisKK3N0YXRpYyBp bmxpbmUgYm9vbAoraTkxNV92bV9oYXNfc2NyYXRjaF82NEsoc3RydWN0IGk5MTVfYWRkcmVzc19z cGFjZSAqdm0pCit7CisJcmV0dXJuIHZtLT5zY3JhdGNoX29yZGVyID09IGdldF9vcmRlcihJOTE1 X0dUVF9QQUdFX1NJWkVfNjRLKTsKK30KKworc3RhdGljIGlubGluZSBib29sCitpOTE1X3ZtX2hh c19jYWNoZV9jb2xvcmluZyhzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkKK3sKKwlyZXR1 cm4gaTkxNV9pc19nZ3R0KHZtKSAmJiB2bS0+bW0uY29sb3JfYWRqdXN0OworfQorCitzdGF0aWMg aW5saW5lIHN0cnVjdCBpOTE1X2dndHQgKgoraTkxNV92bV90b19nZ3R0KHN0cnVjdCBpOTE1X2Fk ZHJlc3Nfc3BhY2UgKnZtKQoreworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaTkxNV9n Z3R0LCB2bSkpOworCUdFTV9CVUdfT04oIWk5MTVfaXNfZ2d0dCh2bSkpOworCXJldHVybiBjb250 YWluZXJfb2Yodm0sIHN0cnVjdCBpOTE1X2dndHQsIHZtKTsKK30KKworc3RhdGljIGlubGluZSBz dHJ1Y3QgaTkxNV9wcGd0dCAqCitpOTE1X3ZtX3RvX3BwZ3R0KHN0cnVjdCBpOTE1X2FkZHJlc3Nf c3BhY2UgKnZtKQoreworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaTkxNV9wcGd0dCwg dm0pKTsKKwlHRU1fQlVHX09OKGk5MTVfaXNfZ2d0dCh2bSkpOworCXJldHVybiBjb250YWluZXJf b2Yodm0sIHN0cnVjdCBpOTE1X3BwZ3R0LCB2bSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0 IGk5MTVfYWRkcmVzc19zcGFjZSAqCitpOTE1X3ZtX2dldChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3Nw YWNlICp2bSkKK3sKKwlrcmVmX2dldCgmdm0tPnJlZik7CisJcmV0dXJuIHZtOworfQorCit2b2lk IGk5MTVfdm1fcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZik7CisKK3N0YXRpYyBpbmxpbmUgdm9p ZCBpOTE1X3ZtX3B1dChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkKK3sKKwlrcmVmX3B1 dCgmdm0tPnJlZiwgaTkxNV92bV9yZWxlYXNlKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qg aTkxNV9hZGRyZXNzX3NwYWNlICoKK2k5MTVfdm1fb3BlbihzdHJ1Y3QgaTkxNV9hZGRyZXNzX3Nw YWNlICp2bSkKK3sKKwlHRU1fQlVHX09OKCFhdG9taWNfcmVhZCgmdm0tPm9wZW4pKTsKKwlhdG9t aWNfaW5jKCZ2bS0+b3Blbik7CisJcmV0dXJuIGk5MTVfdm1fZ2V0KHZtKTsKK30KKworc3RhdGlj IGlubGluZSBib29sCitpOTE1X3ZtX3RyeW9wZW4oc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAq dm0pCit7CisJaWYgKGF0b21pY19hZGRfdW5sZXNzKCZ2bS0+b3BlbiwgMSwgMCkpCisJCXJldHVy biBpOTE1X3ZtX2dldCh2bSk7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgX19pOTE1X3Zt X2Nsb3NlKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKTsKKworc3RhdGljIGlubGluZSB2 b2lkCitpOTE1X3ZtX2Nsb3NlKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKQoreworCUdF TV9CVUdfT04oIWF0b21pY19yZWFkKCZ2bS0+b3BlbikpOworCWlmIChhdG9taWNfZGVjX2FuZF90 ZXN0KCZ2bS0+b3BlbikpCisJCV9faTkxNV92bV9jbG9zZSh2bSk7CisKKwlpOTE1X3ZtX3B1dCh2 bSk7Cit9CisKK3ZvaWQgaTkxNV9hZGRyZXNzX3NwYWNlX2luaXQoc3RydWN0IGk5MTVfYWRkcmVz c19zcGFjZSAqdm0sIGludCBzdWJjbGFzcyk7Cit2b2lkIGk5MTVfYWRkcmVzc19zcGFjZV9maW5p KHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKTsKKworc3RhdGljIGlubGluZSB1MzIgaTkx NV9wdGVfaW5kZXgodTY0IGFkZHJlc3MsIHVuc2lnbmVkIGludCBwZGVfc2hpZnQpCit7CisJY29u c3QgdTMyIG1hc2sgPSBOVU1fUFRFKHBkZV9zaGlmdCkgLSAxOworCisJcmV0dXJuIChhZGRyZXNz ID4+IFBBR0VfU0hJRlQpICYgbWFzazsKK30KKworLyogSGVscGVyIHRvIGNvdW50cyB0aGUgbnVt YmVyIG9mIFBURXMgd2l0aGluIHRoZSBnaXZlbiBsZW5ndGguIFRoaXMgY291bnQKKyAqIGRvZXMg bm90IGNyb3NzIGEgcGFnZSB0YWJsZSBib3VuZGFyeSwgc28gdGhlIG1heCB2YWx1ZSB3b3VsZCBi ZQorICogR0VONl9QVEVTIGZvciBHRU42LCBhbmQgR0VOOF9QVEVTIGZvciBHRU44LgorKi8KK3N0 YXRpYyBpbmxpbmUgdTMyIGk5MTVfcHRlX2NvdW50KHU2NCBhZGRyLCB1NjQgbGVuZ3RoLCB1bnNp Z25lZCBpbnQgcGRlX3NoaWZ0KQoreworCWNvbnN0IHU2NCBtYXNrID0gfigoMVVMTCA8PCBwZGVf c2hpZnQpIC0gMSk7CisJdTY0IGVuZDsKKworCUdFTV9CVUdfT04obGVuZ3RoID09IDApOworCUdF TV9CVUdfT04ob2Zmc2V0X2luX3BhZ2UoYWRkciB8IGxlbmd0aCkpOworCisJZW5kID0gYWRkciAr IGxlbmd0aDsKKworCWlmICgoYWRkciAmIG1hc2spICE9IChlbmQgJiBtYXNrKSkKKwkJcmV0dXJu IE5VTV9QVEUocGRlX3NoaWZ0KSAtIGk5MTVfcHRlX2luZGV4KGFkZHIsIHBkZV9zaGlmdCk7CisK KwlyZXR1cm4gaTkxNV9wdGVfaW5kZXgoZW5kLCBwZGVfc2hpZnQpIC0gaTkxNV9wdGVfaW5kZXgo YWRkciwgcGRlX3NoaWZ0KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgaTkxNV9wZGVfaW5kZXgo dTY0IGFkZHIsIHUzMiBzaGlmdCkKK3sKKwlyZXR1cm4gKGFkZHIgPj4gc2hpZnQpICYgSTkxNV9Q REVfTUFTSzsKK30KKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpOTE1X3BhZ2VfdGFibGUgKgor aTkxNV9wdF9lbnRyeShjb25zdCBzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqIGNvbnN0IHBk LAorCSAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IG4pCit7CisJcmV0dXJuIHBkLT5lbnRyeVtu XTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqCitpOTE1 X3BkX2VudHJ5KGNvbnN0IHN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICogY29uc3QgcGRwLAor CSAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IG4pCit7CisJcmV0dXJuIHBkcC0+ZW50cnlbbl07 Cit9CisKK3N0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdAoraTkxNV9wYWdlX2Rpcl9kbWFfYWRkcihj b25zdCBzdHJ1Y3QgaTkxNV9wcGd0dCAqcHBndHQsIGNvbnN0IHVuc2lnbmVkIGludCBuKQorewor CXN0cnVjdCBpOTE1X3BhZ2VfZG1hICpwdCA9IHBwZ3R0LT5wZC0+ZW50cnlbbl07CisKKwlyZXR1 cm4gcHhfZG1hKHB0ID86IHB4X2Jhc2UoJnBwZ3R0LT52bS5zY3JhdGNoW3BwZ3R0LT52bS50b3Bd KSk7Cit9CisKK3ZvaWQgcHBndHRfaW5pdChzdHJ1Y3QgaTkxNV9wcGd0dCAqcHBndHQsIHN0cnVj dCBpbnRlbF9ndCAqZ3QpOworCitpbnQgaTkxNV9nZ3R0X3Byb2JlX2h3KHN0cnVjdCBkcm1faTkx NV9wcml2YXRlICppOTE1KTsKK2ludCBpOTE1X2dndHRfaW5pdF9odyhzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqaTkxNSk7CitpbnQgaTkxNV9nZ3R0X2VuYWJsZV9odyhzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqaTkxNSk7Cit2b2lkIGk5MTVfZ2d0dF9lbmFibGVfZ3VjKHN0cnVjdCBpOTE1X2dn dHQgKmdndHQpOwordm9pZCBpOTE1X2dndHRfZGlzYWJsZV9ndWMoc3RydWN0IGk5MTVfZ2d0dCAq Z2d0dCk7CitpbnQgaTkxNV9pbml0X2dndHQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUp Owordm9pZCBpOTE1X2dndHRfZHJpdmVyX3JlbGVhc2Uoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg Kmk5MTUpOworCitzdGF0aWMgaW5saW5lIGJvb2wgaTkxNV9nZ3R0X2hhc19hcGVydHVyZShjb25z dCBzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0KQoreworCXJldHVybiBnZ3R0LT5tYXBwYWJsZV9lbmQg PiAwOworfQorCitpbnQgaTkxNV9wcGd0dF9pbml0X2h3KHN0cnVjdCBpbnRlbF9ndCAqZ3QpOwor CitzdHJ1Y3QgaTkxNV9wcGd0dCAqaTkxNV9wcGd0dF9jcmVhdGUoc3RydWN0IGRybV9pOTE1X3By aXZhdGUgKmRldl9wcml2KTsKKworc3RydWN0IHNndF9kbWEgeworCXN0cnVjdCBzY2F0dGVybGlz dCAqc2c7CisJZG1hX2FkZHJfdCBkbWEsIG1heDsKK30gc2d0X2RtYShzdHJ1Y3QgaTkxNV92bWEg KnZtYSk7CisKK3ZvaWQgaTkxNV9nZW1fc3VzcGVuZF9ndHRfbWFwcGluZ3Moc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmk5MTUpOwordm9pZCBpOTE1X2dlbV9yZXN0b3JlX2d0dF9tYXBwaW5ncyhz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSk7CisKK3U2NCBnZW44X3B0ZV9lbmNvZGUoZG1h X2FkZHJfdCBhZGRyLAorCQkgICAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGxldmVsLAorCQkgICAg dTMyIGZsYWdzKTsKK3U2NCBnZW44X3BkZV9lbmNvZGUoY29uc3QgZG1hX2FkZHJfdCBhZGRyLAor CQkgICAgY29uc3QgZW51bSBpOTE1X2NhY2hlX2xldmVsIGxldmVsKTsKKwordTY0IHNuYl9wdGVf ZW5jb2RlKGRtYV9hZGRyX3QgYWRkciwKKwkJICAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGxldmVs LAorCQkgICB1MzIgZmxhZ3MpOwordTY0IGl2Yl9wdGVfZW5jb2RlKGRtYV9hZGRyX3QgYWRkciwK KwkJICAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGxldmVsLAorCQkgICB1MzIgZmxhZ3MpOwordTY0 IGJ5dF9wdGVfZW5jb2RlKGRtYV9hZGRyX3QgYWRkciwKKwkJICAgZW51bSBpOTE1X2NhY2hlX2xl dmVsIGxldmVsLAorCQkgICB1MzIgZmxhZ3MpOwordTY0IGhzd19wdGVfZW5jb2RlKGRtYV9hZGRy X3QgYWRkciwKKwkJICAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGxldmVsLAorCQkgICB1MzIgZmxh Z3MpOwordTY0IGlyaXNfcHRlX2VuY29kZShkbWFfYWRkcl90IGFkZHIsCisJCSAgICBlbnVtIGk5 MTVfY2FjaGVfbGV2ZWwgbGV2ZWwsCisJCSAgICB1MzIgZmxhZ3MpOworCitpbnQgc2V0dXBfcGFn ZV9kbWEoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sIHN0cnVjdCBpOTE1X3BhZ2VfZG1h ICpwKTsKK3ZvaWQgY2xlYW51cF9wYWdlX2RtYShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2 bSwgc3RydWN0IGk5MTVfcGFnZV9kbWEgKnApOworCisjZGVmaW5lIGttYXBfYXRvbWljX3B4KHB4 KSBrbWFwX2F0b21pYyhweF9iYXNlKHB4KS0+cGFnZSkKKwordm9pZAorZmlsbF9wYWdlX2RtYShj b25zdCBzdHJ1Y3QgaTkxNV9wYWdlX2RtYSAqcCwgY29uc3QgdTY0IHZhbCwgdW5zaWduZWQgaW50 IGNvdW50KTsKKworI2RlZmluZSBmaWxsX3B4KHB4LCB2KSBmaWxsX3BhZ2VfZG1hKHB4X2Jhc2Uo cHgpLCAodiksIFBBR0VfU0laRSAvIHNpemVvZih1NjQpKQorI2RlZmluZSBmaWxsMzJfcHgocHgs IHYpIGRvIHsJCQkJCQlcCisJdTY0IHZfXyA9IGxvd2VyXzMyX2JpdHModik7CQkJCQlcCisJZmls bF9weCgocHgpLCB2X18gPDwgMzIgfCB2X18pOwkJCQkJXAorfSB3aGlsZSAoMCkKKworaW50IHNl dHVwX3NjcmF0Y2hfcGFnZShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwgZ2ZwX3QgZ2Zw KTsKK3ZvaWQgY2xlYW51cF9zY3JhdGNoX3BhZ2Uoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAq dm0pOwordm9pZCBmcmVlX3NjcmF0Y2goc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pOwor CitzdHJ1Y3QgaTkxNV9wYWdlX3RhYmxlICphbGxvY19wdChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3Nw YWNlICp2bSk7CitzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqYWxsb2NfcGQoc3RydWN0IGk5 MTVfYWRkcmVzc19zcGFjZSAqdm0pOworc3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKl9fYWxs b2NfcGQoc2l6ZV90IHN6KTsKKwordm9pZCBmcmVlX3BkKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3Bh Y2UgKnZtLCBzdHJ1Y3QgaTkxNV9wYWdlX2RtYSAqcGQpOworCisjZGVmaW5lIGZyZWVfcHgodm0s IHB4KSBmcmVlX3BkKHZtLCBweF9iYXNlKHB4KSkKKwordm9pZAorX19zZXRfcGRfZW50cnkoc3Ry dWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKiBjb25zdCBwZCwKKwkgICAgICAgY29uc3QgdW5zaWdu ZWQgc2hvcnQgaWR4LAorCSAgICAgICBzdHJ1Y3QgaTkxNV9wYWdlX2RtYSAqIGNvbnN0IHRvLAor CSAgICAgICB1NjQgKCplbmNvZGUpKGNvbnN0IGRtYV9hZGRyX3QsIGNvbnN0IGVudW0gaTkxNV9j YWNoZV9sZXZlbCkpOworCisjZGVmaW5lIHNldF9wZF9lbnRyeShwZCwgaWR4LCB0bykgXAorCV9f c2V0X3BkX2VudHJ5KChwZCksIChpZHgpLCBweF9iYXNlKHRvKSwgZ2VuOF9wZGVfZW5jb2RlKQor Cit2b2lkCitjbGVhcl9wZF9lbnRyeShzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqIGNvbnN0 IHBkLAorCSAgICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBpZHgsCisJICAgICAgIGNvbnN0IHN0 cnVjdCBpOTE1X3BhZ2Vfc2NyYXRjaCAqIGNvbnN0IHNjcmF0Y2gpOworCitib29sCityZWxlYXNl X3BkX2VudHJ5KHN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICogY29uc3QgcGQsCisJCSBjb25z dCB1bnNpZ25lZCBzaG9ydCBpZHgsCisJCSBzdHJ1Y3QgaTkxNV9wYWdlX3RhYmxlICogY29uc3Qg cHQsCisJCSBjb25zdCBzdHJ1Y3QgaTkxNV9wYWdlX3NjcmF0Y2ggKiBjb25zdCBzY3JhdGNoKTsK K3ZvaWQgZ2VuNl9nZ3R0X2ludmFsaWRhdGUoc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCk7CisKK2lu dCBnZ3R0X3NldF9wYWdlcyhzdHJ1Y3QgaTkxNV92bWEgKnZtYSk7CitpbnQgcHBndHRfc2V0X3Bh Z2VzKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKTsKK3ZvaWQgY2xlYXJfcGFnZXMoc3RydWN0IGk5MTVf dm1hICp2bWEpOworCit2b2lkIGd0dF93cml0ZV93b3JrYXJvdW5kcyhzdHJ1Y3QgaW50ZWxfZ3Qg Kmd0KTsKKwordm9pZCBzZXR1cF9wcml2YXRlX3BhdChzdHJ1Y3QgaW50ZWxfdW5jb3JlICp1bmNv cmUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVs X3BwZ3R0LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9wcGd0dC5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uNWQ1M2QyMzI5Yzg2Ci0tLSAvZGV2L251 bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfcHBndHQuYwpAQCAtMCwwICsx LDIyNiBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAorLyoKKyAqIENvcHlyaWdo dCDCqSAyMDIwIEludGVsIENvcnBvcmF0aW9uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIu aD4gLyogZmF1bHQtaW5qZWN0LmggaXMgbm90IHN0YW5kYWxvbmUhICovCisKKyNpbmNsdWRlICJp OTE1X3RyYWNlLmgiCisKKyNpbmNsdWRlICJpbnRlbF9ndHQuaCIKKyNpbmNsdWRlICJnZW42X3Bw Z3R0LmgiCisjaW5jbHVkZSAiZ2VuOF9wcGd0dC5oIgorCitzdHJ1Y3QgaTkxNV9wYWdlX3RhYmxl ICphbGxvY19wdChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkKK3sKKwlzdHJ1Y3QgaTkx NV9wYWdlX3RhYmxlICpwdDsKKworCXB0ID0ga21hbGxvYyhzaXplb2YoKnB0KSwgSTkxNV9HRlBf QUxMT1dfRkFJTCk7CisJaWYgKHVubGlrZWx5KCFwdCkpCisJCXJldHVybiBFUlJfUFRSKC1FTk9N RU0pOworCisJaWYgKHVubGlrZWx5KHNldHVwX3BhZ2VfZG1hKHZtLCAmcHQtPmJhc2UpKSkgewor CQlrZnJlZShwdCk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCWF0b21pY19z ZXQoJnB0LT51c2VkLCAwKTsKKwlyZXR1cm4gcHQ7Cit9CisKK3N0cnVjdCBpOTE1X3BhZ2VfZGly ZWN0b3J5ICpfX2FsbG9jX3BkKHNpemVfdCBzeikKK3sKKwlzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVj dG9yeSAqcGQ7CisKKwlwZCA9IGt6YWxsb2Moc3osIEk5MTVfR0ZQX0FMTE9XX0ZBSUwpOworCWlm ICh1bmxpa2VseSghcGQpKQorCQlyZXR1cm4gTlVMTDsKKworCXNwaW5fbG9ja19pbml0KCZwZC0+ bG9jayk7CisJcmV0dXJuIHBkOworfQorCitzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqYWxs b2NfcGQoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pCit7CisJc3RydWN0IGk5MTVfcGFn ZV9kaXJlY3RvcnkgKnBkOworCisJcGQgPSBfX2FsbG9jX3BkKHNpemVvZigqcGQpKTsKKwlpZiAo dW5saWtlbHkoIXBkKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAodW5saWtl bHkoc2V0dXBfcGFnZV9kbWEodm0sIHB4X2Jhc2UocGQpKSkpIHsKKwkJa2ZyZWUocGQpOworCQly ZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlyZXR1cm4gcGQ7Cit9CisKK3ZvaWQgZnJl ZV9wZChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwgc3RydWN0IGk5MTVfcGFnZV9kbWEg KnBkKQoreworCWNsZWFudXBfcGFnZV9kbWEodm0sIHBkKTsKKwlrZnJlZShwZCk7Cit9CisKK3N0 YXRpYyBpbmxpbmUgdm9pZAord3JpdGVfZG1hX2VudHJ5KHN0cnVjdCBpOTE1X3BhZ2VfZG1hICog Y29uc3QgcGRtYSwKKwkJY29uc3QgdW5zaWduZWQgc2hvcnQgaWR4LAorCQljb25zdCB1NjQgZW5j b2RlZF9lbnRyeSkKK3sKKwl1NjQgKiBjb25zdCB2YWRkciA9IGttYXBfYXRvbWljKHBkbWEtPnBh Z2UpOworCisJdmFkZHJbaWR4XSA9IGVuY29kZWRfZW50cnk7CisJa3VubWFwX2F0b21pYyh2YWRk cik7Cit9CisKK3ZvaWQKK19fc2V0X3BkX2VudHJ5KHN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5 ICogY29uc3QgcGQsCisJICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IGlkeCwKKwkgICAgICAg c3RydWN0IGk5MTVfcGFnZV9kbWEgKiBjb25zdCB0bywKKwkgICAgICAgdTY0ICgqZW5jb2RlKShj b25zdCBkbWFfYWRkcl90LCBjb25zdCBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwpKQoreworCS8qIEVh Y2ggdGhyZWFkIHByZS1waW5zIHRoZSBwZCwgYW5kIHdlIG1heSBoYXZlIGEgdGhyZWFkIHBlciBw ZGUuICovCisJR0VNX0JVR19PTihhdG9taWNfcmVhZChweF91c2VkKHBkKSkgPiBOQUxMT0MgKiBB UlJBWV9TSVpFKHBkLT5lbnRyeSkpOworCisJYXRvbWljX2luYyhweF91c2VkKHBkKSk7CisJcGQt PmVudHJ5W2lkeF0gPSB0bzsKKwl3cml0ZV9kbWFfZW50cnkocHhfYmFzZShwZCksIGlkeCwgZW5j b2RlKHRvLT5kYWRkciwgSTkxNV9DQUNIRV9MTEMpKTsKK30KKwordm9pZAorY2xlYXJfcGRfZW50 cnkoc3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKiBjb25zdCBwZCwKKwkgICAgICAgY29uc3Qg dW5zaWduZWQgc2hvcnQgaWR4LAorCSAgICAgICBjb25zdCBzdHJ1Y3QgaTkxNV9wYWdlX3NjcmF0 Y2ggKiBjb25zdCBzY3JhdGNoKQoreworCUdFTV9CVUdfT04oYXRvbWljX3JlYWQocHhfdXNlZChw ZCkpID09IDApOworCisJd3JpdGVfZG1hX2VudHJ5KHB4X2Jhc2UocGQpLCBpZHgsIHNjcmF0Y2gt PmVuY29kZSk7CisJcGQtPmVudHJ5W2lkeF0gPSBOVUxMOworCWF0b21pY19kZWMocHhfdXNlZChw ZCkpOworfQorCitib29sCityZWxlYXNlX3BkX2VudHJ5KHN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0 b3J5ICogY29uc3QgcGQsCisJCSBjb25zdCB1bnNpZ25lZCBzaG9ydCBpZHgsCisJCSBzdHJ1Y3Qg aTkxNV9wYWdlX3RhYmxlICogY29uc3QgcHQsCisJCSBjb25zdCBzdHJ1Y3QgaTkxNV9wYWdlX3Nj cmF0Y2ggKiBjb25zdCBzY3JhdGNoKQoreworCWJvb2wgZnJlZSA9IGZhbHNlOworCisJaWYgKGF0 b21pY19hZGRfdW5sZXNzKCZwdC0+dXNlZCwgLTEsIDEpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlz cGluX2xvY2soJnBkLT5sb2NrKTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcHQtPnVzZWQp KSB7CisJCWNsZWFyX3BkX2VudHJ5KHBkLCBpZHgsIHNjcmF0Y2gpOworCQlmcmVlID0gdHJ1ZTsK Kwl9CisJc3Bpbl91bmxvY2soJnBkLT5sb2NrKTsKKworCXJldHVybiBmcmVlOworfQorCitpbnQg aTkxNV9wcGd0dF9pbml0X2h3KHN0cnVjdCBpbnRlbF9ndCAqZ3QpCit7CisJc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmk5MTUgPSBndC0+aTkxNTsKKworCWd0dF93cml0ZV93b3JrYXJvdW5kcyhn dCk7CisKKwlpZiAoSVNfR0VOKGk5MTUsIDYpKQorCQlnZW42X3BwZ3R0X2VuYWJsZShndCk7CisJ ZWxzZSBpZiAoSVNfR0VOKGk5MTUsIDcpKQorCQlnZW43X3BwZ3R0X2VuYWJsZShndCk7CisKKwly ZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpOTE1X3BwZ3R0ICoKK19fcHBndHRfY3JlYXRl KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1KQoreworCWlmIChJTlRFTF9HRU4oaTkxNSkg PCA4KQorCQlyZXR1cm4gZ2VuNl9wcGd0dF9jcmVhdGUoaTkxNSk7CisJZWxzZQorCQlyZXR1cm4g Z2VuOF9wcGd0dF9jcmVhdGUoaTkxNSk7Cit9CisKK3N0cnVjdCBpOTE1X3BwZ3R0ICoKK2k5MTVf cHBndHRfY3JlYXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1KQoreworCXN0cnVjdCBp OTE1X3BwZ3R0ICpwcGd0dDsKKworCXBwZ3R0ID0gX19wcGd0dF9jcmVhdGUoaTkxNSk7CisJaWYg KElTX0VSUihwcGd0dCkpCisJCXJldHVybiBwcGd0dDsKKworCXRyYWNlX2k5MTVfcHBndHRfY3Jl YXRlKCZwcGd0dC0+dm0pOworCisJcmV0dXJuIHBwZ3R0OworfQorCitzdGF0aWMgaW50IHBwZ3R0 X2JpbmRfdm1hKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAorCQkJICBlbnVtIGk5MTVfY2FjaGVfbGV2 ZWwgY2FjaGVfbGV2ZWwsCisJCQkgIHUzMiBmbGFncykKK3sKKwl1MzIgcHRlX2ZsYWdzOworCWlu dCBlcnI7CisKKwlpZiAoZmxhZ3MgJiBJOTE1X1ZNQV9BTExPQykgeworCQllcnIgPSB2bWEtPnZt LT5hbGxvY2F0ZV92YV9yYW5nZSh2bWEtPnZtLAorCQkJCQkJIHZtYS0+bm9kZS5zdGFydCwgdm1h LT5zaXplKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJc2V0X2JpdChJOTE1X1ZN QV9BTExPQ19CSVQsIF9faTkxNV92bWFfZmxhZ3Modm1hKSk7CisJfQorCisJLyogQXBwbGljYWJs ZSB0byBWTFYsIGFuZCBnZW44KyAqLworCXB0ZV9mbGFncyA9IDA7CisJaWYgKGk5MTVfZ2VtX29i amVjdF9pc19yZWFkb25seSh2bWEtPm9iaikpCisJCXB0ZV9mbGFncyB8PSBQVEVfUkVBRF9PTkxZ OworCisJR0VNX0JVR19PTighdGVzdF9iaXQoSTkxNV9WTUFfQUxMT0NfQklULCBfX2k5MTVfdm1h X2ZsYWdzKHZtYSkpKTsKKwl2bWEtPnZtLT5pbnNlcnRfZW50cmllcyh2bWEtPnZtLCB2bWEsIGNh Y2hlX2xldmVsLCBwdGVfZmxhZ3MpOworCXdtYigpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyB2b2lkIHBwZ3R0X3VuYmluZF92bWEoc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJaWYgKHRl c3RfYW5kX2NsZWFyX2JpdChJOTE1X1ZNQV9BTExPQ19CSVQsIF9faTkxNV92bWFfZmxhZ3Modm1h KSkpCisJCXZtYS0+dm0tPmNsZWFyX3JhbmdlKHZtYS0+dm0sIHZtYS0+bm9kZS5zdGFydCwgdm1h LT5zaXplKTsKK30KKworaW50IHBwZ3R0X3NldF9wYWdlcyhzdHJ1Y3QgaTkxNV92bWEgKnZtYSkK K3sKKwlHRU1fQlVHX09OKHZtYS0+cGFnZXMpOworCisJdm1hLT5wYWdlcyA9IHZtYS0+b2JqLT5t bS5wYWdlczsKKworCXZtYS0+cGFnZV9zaXplcyA9IHZtYS0+b2JqLT5tbS5wYWdlX3NpemVzOwor CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcHBndHRfaW5pdChzdHJ1Y3QgaTkxNV9wcGd0dCAqcHBn dHQsIHN0cnVjdCBpbnRlbF9ndCAqZ3QpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5 MTUgPSBndC0+aTkxNTsKKworCXBwZ3R0LT52bS5ndCA9IGd0OworCXBwZ3R0LT52bS5pOTE1ID0g aTkxNTsKKwlwcGd0dC0+dm0uZG1hID0gJmk5MTUtPmRybS5wZGV2LT5kZXY7CisJcHBndHQtPnZt LnRvdGFsID0gQklUX1VMTChJTlRFTF9JTkZPKGk5MTUpLT5wcGd0dF9zaXplKTsKKworCWk5MTVf YWRkcmVzc19zcGFjZV9pbml0KCZwcGd0dC0+dm0sIFZNX0NMQVNTX1BQR1RUKTsKKworCXBwZ3R0 LT52bS52bWFfb3BzLmJpbmRfdm1hICAgID0gcHBndHRfYmluZF92bWE7CisJcHBndHQtPnZtLnZt YV9vcHMudW5iaW5kX3ZtYSAgPSBwcGd0dF91bmJpbmRfdm1hOworCXBwZ3R0LT52bS52bWFfb3Bz LnNldF9wYWdlcyAgID0gcHBndHRfc2V0X3BhZ2VzOworCXBwZ3R0LT52bS52bWFfb3BzLmNsZWFy X3BhZ2VzID0gY2xlYXJfcGFnZXM7Cit9CisKK3N0cnVjdCBzZ3RfZG1hIHNndF9kbWEoc3RydWN0 IGk5MTVfdm1hICp2bWEpIHsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gdm1hLT5wYWdlcy0+ c2dsOworCWRtYV9hZGRyX3QgYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKKwlyZXR1cm4gKHN0 cnVjdCBzZ3RfZG1hKSB7IHNnLCBhZGRyLCBhZGRyICsgc2ctPmxlbmd0aCB9OworfQpkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfcmluZ19zdWJtaXNzaW9uLmMgYi9k cml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9yaW5nX3N1Ym1pc3Npb24uYwppbmRleCAyZTE0 NzhhNDhhNGIuLjMwOTFjNjk1ZDE5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUv Z3QvaW50ZWxfcmluZ19zdWJtaXNzaW9uLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Qv aW50ZWxfcmluZ19zdWJtaXNzaW9uLmMKQEAgLTMzLDYgKzMzLDggQEAKIAogI2luY2x1ZGUgImdl bS9pOTE1X2dlbV9jb250ZXh0LmgiCiAKKworI2luY2x1ZGUgImdlbjZfcHBndHQuaCIKICNpbmNs dWRlICJpOTE1X2Rydi5oIgogI2luY2x1ZGUgImk5MTVfdHJhY2UuaCIKICNpbmNsdWRlICJpbnRl bF9jb250ZXh0LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9n dHQuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5jCmluZGV4IDFlZmU1OGFk MGNlOS4uZTAzOWViNTY5MDBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1 X2dlbV9ndHQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYwpAQCAt MSwyNiArMSw3IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCiAvKgogICogQ29w eXJpZ2h0IMKpIDIwMTAgRGFuaWVsIFZldHRlcgotICogQ29weXJpZ2h0IMKpIDIwMTEtMjAxNCBJ bnRlbCBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZy ZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi0gKiBjb3B5IG9mIHRoaXMg c29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2Fy ZSIpLAotICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5j bHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1v ZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCi0gKiBhbmQvb3Ig c2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hv bSB0aGUKLSAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUg Zm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKgotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2Ug YW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAotICogcGFyYWdy YXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRp b25zIG9mIHRoZQotICogU29mdHdhcmUuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVE ICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLSAqIElN UExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVS Q0hBTlRBQklMSVRZLAotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5P TklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBUSEUgQVVUSE9SUyBPUiBDT1BZ UklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgot ICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBP VEhFUldJU0UsIEFSSVNJTkcKLSAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEgg VEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKLSAqIElOIFRIRSBTT0ZU V0FSRS4KLSAqCisgKiBDb3B5cmlnaHQgwqkgMjAyMCBJbnRlbCBDb3Jwb3JhdGlvbgogICovCiAK ICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+IC8qIGZhdWx0LWluamVjdC5oIGlzIG5vdCBzdGFuZGFs b25lISAqLwpAQCAtNDUsMzU4NiArMjYsNTAgQEAKICNpbmNsdWRlICJpOTE1X3RyYWNlLmgiCiAj aW5jbHVkZSAiaTkxNV92Z3B1LmgiCiAKLSNkZWZpbmUgSTkxNV9HRlBfQUxMT1dfRkFJTCAoR0ZQ X0tFUk5FTCB8IF9fR0ZQX1JFVFJZX01BWUZBSUwgfCBfX0dGUF9OT1dBUk4pCi0KLSNpZiBJU19F TkFCTEVEKENPTkZJR19EUk1fSTkxNV9UUkFDRV9HVFQpCi0jZGVmaW5lIERCRyguLi4pIHRyYWNl X3ByaW50ayhfX1ZBX0FSR1NfXykKLSNlbHNlCi0jZGVmaW5lIERCRyguLi4pCi0jZW5kaWYKLQot I2RlZmluZSBOQUxMT0MgMyAvKiAxIG5vcm1hbCwgMSBmb3IgY29uY3VycmVudCB0aHJlYWRzLCAx IGZvciBwcmVhbGxvY2F0aW9uICovCi0KLS8qKgotICogRE9DOiBHbG9iYWwgR1RUIHZpZXdzCi0g KgotICogQmFja2dyb3VuZCBhbmQgcHJldmlvdXMgc3RhdGUKLSAqCi0gKiBIaXN0b3JpY2FsbHkg b2JqZWN0cyBjb3VsZCBleGlzdHMgKGJlIGJvdW5kKSBpbiBnbG9iYWwgR1RUIHNwYWNlIG9ubHkg YXMKLSAqIHNpbmd1bGFyIGluc3RhbmNlcyB3aXRoIGEgdmlldyByZXByZXNlbnRpbmcgYWxsIG9m IHRoZSBvYmplY3QncyBiYWNraW5nIHBhZ2VzCi0gKiBpbiBhIGxpbmVhciBmYXNoaW9uLiBUaGlz IHZpZXcgd2lsbCBiZSBjYWxsZWQgYSBub3JtYWwgdmlldy4KLSAqCi0gKiBUbyBzdXBwb3J0IG11 bHRpcGxlIHZpZXdzIG9mIHRoZSBzYW1lIG9iamVjdCwgd2hlcmUgdGhlIG51bWJlciBvZiBtYXBw ZWQKLSAqIHBhZ2VzIGlzIG5vdCBlcXVhbCB0byB0aGUgYmFja2luZyBzdG9yZSwgb3Igd2hlcmUg dGhlIGxheW91dCBvZiB0aGUgcGFnZXMKLSAqIGlzIG5vdCBsaW5lYXIsIGNvbmNlcHQgb2YgYSBH R1RUIHZpZXcgd2FzIGFkZGVkLgotICoKLSAqIE9uZSBleGFtcGxlIG9mIGFuIGFsdGVybmF0aXZl IHZpZXcgaXMgYSBzdGVyZW8gZGlzcGxheSBkcml2ZW4gYnkgYSBzaW5nbGUKLSAqIGltYWdlLiBJ biB0aGlzIGNhc2Ugd2Ugd291bGQgaGF2ZSBhIGZyYW1lYnVmZmVyIGxvb2tpbmcgbGlrZSB0aGlz Ci0gKiAoMngyIHBhZ2VzKToKLSAqCi0gKiAgICAxMgotICogICAgMzQKLSAqCi0gKiBBYm92ZSB3 b3VsZCByZXByZXNlbnQgYSBub3JtYWwgR0dUVCB2aWV3IGFzIG5vcm1hbGx5IG1hcHBlZCBmb3Ig R1BVIG9yIENQVQotICogcmVuZGVyaW5nLiBJbiBjb250cmFzdCwgZmVkIHRvIHRoZSBkaXNwbGF5 IGVuZ2luZSB3b3VsZCBiZSBhbiBhbHRlcm5hdGl2ZQotICogdmlldyB3aGljaCBjb3VsZCBsb29r IHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0gKgotICogICAxMjEyCi0gKiAgIDM0MzQKLSAqCi0gKiBJ biB0aGlzIGV4YW1wbGUgYm90aCB0aGUgc2l6ZSBhbmQgbGF5b3V0IG9mIHBhZ2VzIGluIHRoZSBh bHRlcm5hdGl2ZSB2aWV3IGlzCi0gKiBkaWZmZXJlbnQgZnJvbSB0aGUgbm9ybWFsIHZpZXcuCi0g KgotICogSW1wbGVtZW50YXRpb24gYW5kIHVzYWdlCi0gKgotICogR0dUVCB2aWV3cyBhcmUgaW1w bGVtZW50ZWQgdXNpbmcgVk1BcyBhbmQgYXJlIGRpc3Rpbmd1aXNoZWQgdmlhIGVudW0KLSAqIGk5 MTVfZ2d0dF92aWV3X3R5cGUgYW5kIHN0cnVjdCBpOTE1X2dndHRfdmlldy4KLSAqCi0gKiBBIG5l dyBmbGF2b3VyIG9mIGNvcmUgR0VNIGZ1bmN0aW9ucyB3aGljaCB3b3JrIHdpdGggR0dUVCBib3Vu ZCBvYmplY3RzIHdlcmUKLSAqIGFkZGVkIHdpdGggdGhlIF9nZ3R0XyBpbmZpeCwgYW5kIHNvbWV0 aW1lcyB3aXRoIF92aWV3IHBvc3RmaXggdG8gYXZvaWQKLSAqIHJlbmFtaW5nICBpbiBsYXJnZSBh bW91bnRzIG9mIGNvZGUuIFRoZXkgdGFrZSB0aGUgc3RydWN0IGk5MTVfZ2d0dF92aWV3Ci0gKiBw YXJhbWV0ZXIgZW5jYXBzdWxhdGluZyBhbGwgbWV0YWRhdGEgcmVxdWlyZWQgdG8gaW1wbGVtZW50 IGEgdmlldy4KLSAqCi0gKiBBcyBhIGhlbHBlciBmb3IgY2FsbGVycyB3aGljaCBhcmUgb25seSBp bnRlcmVzdGVkIGluIHRoZSBub3JtYWwgdmlldywKLSAqIGdsb2JhbGx5IGNvbnN0IGk5MTVfZ2d0 dF92aWV3X25vcm1hbCBzaW5nbGV0b24gaW5zdGFuY2UgZXhpc3RzLiBBbGwgb2xkIGNvcmUKLSAq IEdFTSBBUEkgZnVuY3Rpb25zLCB0aGUgb25lcyBub3QgdGFraW5nIHRoZSB2aWV3IHBhcmFtZXRl ciwgYXJlIG9wZXJhdGluZyBvbiwKLSAqIG9yIHdpdGggdGhlIG5vcm1hbCBHR1RUIHZpZXcuCi0g KgotICogQ29kZSB3YW50aW5nIHRvIGFkZCBvciB1c2UgYSBuZXcgR0dUVCB2aWV3IG5lZWRzIHRv OgotICoKLSAqIDEuIEFkZCBhIG5ldyBlbnVtIHdpdGggYSBzdWl0YWJsZSBuYW1lLgotICogMi4g RXh0ZW5kIHRoZSBtZXRhZGF0YSBpbiB0aGUgaTkxNV9nZ3R0X3ZpZXcgc3RydWN0dXJlIGlmIHJl cXVpcmVkLgotICogMy4gQWRkIHN1cHBvcnQgdG8gaTkxNV9nZXRfdm1hX3BhZ2VzKCkuCi0gKgot ICogTmV3IHZpZXdzIGFyZSByZXF1aXJlZCB0byBidWlsZCBhIHNjYXR0ZXItZ2F0aGVyIHRhYmxl IGZyb20gd2l0aGluIHRoZQotICogaTkxNV9nZXRfdm1hX3BhZ2VzIGZ1bmN0aW9uLiBUaGlzIHRh YmxlIGlzIHN0b3JlZCBpbiB0aGUgdm1hLmdndHRfdmlldyBhbmQKLSAqIGV4aXN0cyBmb3IgdGhl IGxpZmV0aW1lIG9mIGFuIFZNQS4KLSAqCi0gKiBDb3JlIEFQSSBpcyBkZXNpZ25lZCB0byBoYXZl IGNvcHkgc2VtYW50aWNzIHdoaWNoIG1lYW5zIHRoYXQgcGFzc2VkIGluCi0gKiBzdHJ1Y3QgaTkx NV9nZ3R0X3ZpZXcgZG9lcyBub3QgbmVlZCB0byBiZSBwZXJzaXN0ZW50IChsZWZ0IGFyb3VuZCBh ZnRlcgotICogY2FsbGluZyB0aGUgY29yZSBBUEkgZnVuY3Rpb25zKS4KLSAqCi0gKi8KLQotI2Rl ZmluZSBhc19wZCh4KSBjb250YWluZXJfb2YoKHgpLCB0eXBlb2Yoc3RydWN0IGk5MTVfcGFnZV9k aXJlY3RvcnkpLCBwdCkKLQotc3RhdGljIGludAotaTkxNV9nZXRfZ2d0dF92bWFfcGFnZXMoc3Ry dWN0IGk5MTVfdm1hICp2bWEpOwotCi1zdGF0aWMgdm9pZCBnZW42X2dndHRfaW52YWxpZGF0ZShz dHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0KQotewotCXN0cnVjdCBpbnRlbF91bmNvcmUgKnVuY29yZSA9 IGdndHQtPnZtLmd0LT51bmNvcmU7Ci0KLQlzcGluX2xvY2tfaXJxKCZ1bmNvcmUtPmxvY2spOwot CWludGVsX3VuY29yZV93cml0ZV9mdyh1bmNvcmUsIEdGWF9GTFNIX0NOVExfR0VONiwgR0ZYX0ZM U0hfQ05UTF9FTik7Ci0JaW50ZWxfdW5jb3JlX3JlYWRfZncodW5jb3JlLCBHRlhfRkxTSF9DTlRM X0dFTjYpOwotCXNwaW5fdW5sb2NrX2lycSgmdW5jb3JlLT5sb2NrKTsKLX0KLQotc3RhdGljIHZv aWQgZ2VuOF9nZ3R0X2ludmFsaWRhdGUoc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCkKLXsKLQlzdHJ1 Y3QgaW50ZWxfdW5jb3JlICp1bmNvcmUgPSBnZ3R0LT52bS5ndC0+dW5jb3JlOwotCi0JLyoKLQkg KiBOb3RlIHRoYXQgYXMgYW4gdW5jYWNoZWQgbW1pbyB3cml0ZSwgdGhpcyB3aWxsIGZsdXNoIHRo ZQotCSAqIFdDQiBvZiB0aGUgd3JpdGVzIGludG8gdGhlIEdHVFQgYmVmb3JlIGl0IHRyaWdnZXJz IHRoZSBpbnZhbGlkYXRlLgotCSAqLwotCWludGVsX3VuY29yZV93cml0ZV9mdyh1bmNvcmUsIEdG WF9GTFNIX0NOVExfR0VONiwgR0ZYX0ZMU0hfQ05UTF9FTik7Ci19Ci0KLXN0YXRpYyB2b2lkIGd1 Y19nZ3R0X2ludmFsaWRhdGUoc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCkKLXsKLQlzdHJ1Y3QgaW50 ZWxfdW5jb3JlICp1bmNvcmUgPSBnZ3R0LT52bS5ndC0+dW5jb3JlOwotCXN0cnVjdCBkcm1faTkx NV9wcml2YXRlICppOTE1ID0gZ2d0dC0+dm0uaTkxNTsKLQotCWdlbjhfZ2d0dF9pbnZhbGlkYXRl KGdndHQpOwotCi0JaWYgKElOVEVMX0dFTihpOTE1KSA+PSAxMikKLQkJaW50ZWxfdW5jb3JlX3dy aXRlX2Z3KHVuY29yZSwgR0VOMTJfR1VDX1RMQl9JTlZfQ1IsCi0JCQkJICAgICAgR0VOMTJfR1VD X1RMQl9JTlZfQ1JfSU5WQUxJREFURSk7Ci0JZWxzZQotCQlpbnRlbF91bmNvcmVfd3JpdGVfZnco dW5jb3JlLCBHRU44X0dUQ1IsIEdFTjhfR1RDUl9JTlZBTElEQVRFKTsKLX0KLQotc3RhdGljIHZv aWQgZ21jaF9nZ3R0X2ludmFsaWRhdGUoc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCkKLXsKLQlpbnRl bF9ndHRfY2hpcHNldF9mbHVzaCgpOwotfQotCi1zdGF0aWMgaW50IHBwZ3R0X2JpbmRfdm1hKHN0 cnVjdCBpOTE1X3ZtYSAqdm1hLAotCQkJICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgY2FjaGVfbGV2 ZWwsCi0JCQkgIHUzMiBmbGFncykKLXsKLQl1MzIgcHRlX2ZsYWdzOwotCWludCBlcnI7Ci0KLQlp ZiAoZmxhZ3MgJiBJOTE1X1ZNQV9BTExPQykgewotCQllcnIgPSB2bWEtPnZtLT5hbGxvY2F0ZV92 YV9yYW5nZSh2bWEtPnZtLAotCQkJCQkJIHZtYS0+bm9kZS5zdGFydCwgdm1hLT5zaXplKTsKLQkJ aWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0KLQkJc2V0X2JpdChJOTE1X1ZNQV9BTExPQ19CSVQs IF9faTkxNV92bWFfZmxhZ3Modm1hKSk7Ci0JfQotCi0JLyogQXBwbGljYWJsZSB0byBWTFYsIGFu ZCBnZW44KyAqLwotCXB0ZV9mbGFncyA9IDA7Ci0JaWYgKGk5MTVfZ2VtX29iamVjdF9pc19yZWFk b25seSh2bWEtPm9iaikpCi0JCXB0ZV9mbGFncyB8PSBQVEVfUkVBRF9PTkxZOwotCi0JR0VNX0JV R19PTighdGVzdF9iaXQoSTkxNV9WTUFfQUxMT0NfQklULCBfX2k5MTVfdm1hX2ZsYWdzKHZtYSkp KTsKLQl2bWEtPnZtLT5pbnNlcnRfZW50cmllcyh2bWEtPnZtLCB2bWEsIGNhY2hlX2xldmVsLCBw dGVfZmxhZ3MpOwotCXdtYigpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHBwZ3R0 X3VuYmluZF92bWEoc3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0JaWYgKHRlc3RfYW5kX2NsZWFy X2JpdChJOTE1X1ZNQV9BTExPQ19CSVQsIF9faTkxNV92bWFfZmxhZ3Modm1hKSkpCi0JCXZtYS0+ dm0tPmNsZWFyX3JhbmdlKHZtYS0+dm0sIHZtYS0+bm9kZS5zdGFydCwgdm1hLT5zaXplKTsKLX0K LQotc3RhdGljIGludCBwcGd0dF9zZXRfcGFnZXMoc3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0J R0VNX0JVR19PTih2bWEtPnBhZ2VzKTsKLQotCXZtYS0+cGFnZXMgPSB2bWEtPm9iai0+bW0ucGFn ZXM7Ci0KLQl2bWEtPnBhZ2Vfc2l6ZXMgPSB2bWEtPm9iai0+bW0ucGFnZV9zaXplczsKLQotCXJl dHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBjbGVhcl9wYWdlcyhzdHJ1Y3QgaTkxNV92bWEgKnZt YSkKLXsKLQlHRU1fQlVHX09OKCF2bWEtPnBhZ2VzKTsKLQotCWlmICh2bWEtPnBhZ2VzICE9IHZt YS0+b2JqLT5tbS5wYWdlcykgewotCQlzZ19mcmVlX3RhYmxlKHZtYS0+cGFnZXMpOwotCQlrZnJl ZSh2bWEtPnBhZ2VzKTsKLQl9Ci0Jdm1hLT5wYWdlcyA9IE5VTEw7Ci0KLQltZW1zZXQoJnZtYS0+ cGFnZV9zaXplcywgMCwgc2l6ZW9mKHZtYS0+cGFnZV9zaXplcykpOwotfQotCi1zdGF0aWMgdTY0 IGdlbjhfcHRlX2VuY29kZShkbWFfYWRkcl90IGFkZHIsCi0JCQkgICBlbnVtIGk5MTVfY2FjaGVf bGV2ZWwgbGV2ZWwsCi0JCQkgICB1MzIgZmxhZ3MpCi17Ci0JZ2VuOF9wdGVfdCBwdGUgPSBhZGRy IHwgX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1JXOwotCi0JaWYgKHVubGlrZWx5KGZsYWdzICYgUFRF X1JFQURfT05MWSkpCi0JCXB0ZSAmPSB+X1BBR0VfUlc7Ci0KLQlzd2l0Y2ggKGxldmVsKSB7Ci0J Y2FzZSBJOTE1X0NBQ0hFX05PTkU6Ci0JCXB0ZSB8PSBQUEFUX1VOQ0FDSEVEOwotCQlicmVhazsK LQljYXNlIEk5MTVfQ0FDSEVfV1Q6Ci0JCXB0ZSB8PSBQUEFUX0RJU1BMQVlfRUxMQzsKLQkJYnJl YWs7Ci0JZGVmYXVsdDoKLQkJcHRlIHw9IFBQQVRfQ0FDSEVEOwotCQlicmVhazsKLQl9Ci0KLQly ZXR1cm4gcHRlOwotfQotCi1zdGF0aWMgdTY0IGdlbjhfcGRlX2VuY29kZShjb25zdCBkbWFfYWRk cl90IGFkZHIsCi0JCQkgICBjb25zdCBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgbGV2ZWwpCi17Ci0J dTY0IHBkZSA9IF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9SVzsKLQlwZGUgfD0gYWRkcjsKLQlpZiAo bGV2ZWwgIT0gSTkxNV9DQUNIRV9OT05FKQotCQlwZGUgfD0gUFBBVF9DQUNIRURfUERFOwotCWVs c2UKLQkJcGRlIHw9IFBQQVRfVU5DQUNIRUQ7Ci0JcmV0dXJuIHBkZTsKLX0KLQotc3RhdGljIHU2 NCBzbmJfcHRlX2VuY29kZShkbWFfYWRkcl90IGFkZHIsCi0JCQkgIGVudW0gaTkxNV9jYWNoZV9s ZXZlbCBsZXZlbCwKLQkJCSAgdTMyIGZsYWdzKQotewotCWdlbjZfcHRlX3QgcHRlID0gR0VONl9Q VEVfVkFMSUQ7Ci0JcHRlIHw9IEdFTjZfUFRFX0FERFJfRU5DT0RFKGFkZHIpOwotCi0Jc3dpdGNo IChsZXZlbCkgewotCWNhc2UgSTkxNV9DQUNIRV9MM19MTEM6Ci0JY2FzZSBJOTE1X0NBQ0hFX0xM QzoKLQkJcHRlIHw9IEdFTjZfUFRFX0NBQ0hFX0xMQzsKLQkJYnJlYWs7Ci0JY2FzZSBJOTE1X0NB Q0hFX05PTkU6Ci0JCXB0ZSB8PSBHRU42X1BURV9VTkNBQ0hFRDsKLQkJYnJlYWs7Ci0JZGVmYXVs dDoKLQkJTUlTU0lOR19DQVNFKGxldmVsKTsKLQl9Ci0KLQlyZXR1cm4gcHRlOwotfQotCi1zdGF0 aWMgdTY0IGl2Yl9wdGVfZW5jb2RlKGRtYV9hZGRyX3QgYWRkciwKLQkJCSAgZW51bSBpOTE1X2Nh Y2hlX2xldmVsIGxldmVsLAotCQkJICB1MzIgZmxhZ3MpCi17Ci0JZ2VuNl9wdGVfdCBwdGUgPSBH RU42X1BURV9WQUxJRDsKLQlwdGUgfD0gR0VONl9QVEVfQUREUl9FTkNPREUoYWRkcik7Ci0KLQlz d2l0Y2ggKGxldmVsKSB7Ci0JY2FzZSBJOTE1X0NBQ0hFX0wzX0xMQzoKLQkJcHRlIHw9IEdFTjdf UFRFX0NBQ0hFX0wzX0xMQzsKLQkJYnJlYWs7Ci0JY2FzZSBJOTE1X0NBQ0hFX0xMQzoKLQkJcHRl IHw9IEdFTjZfUFRFX0NBQ0hFX0xMQzsKLQkJYnJlYWs7Ci0JY2FzZSBJOTE1X0NBQ0hFX05PTkU6 Ci0JCXB0ZSB8PSBHRU42X1BURV9VTkNBQ0hFRDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTUlT U0lOR19DQVNFKGxldmVsKTsKLQl9Ci0KLQlyZXR1cm4gcHRlOwotfQotCi1zdGF0aWMgdTY0IGJ5 dF9wdGVfZW5jb2RlKGRtYV9hZGRyX3QgYWRkciwKLQkJCSAgZW51bSBpOTE1X2NhY2hlX2xldmVs IGxldmVsLAotCQkJICB1MzIgZmxhZ3MpCi17Ci0JZ2VuNl9wdGVfdCBwdGUgPSBHRU42X1BURV9W QUxJRDsKLQlwdGUgfD0gR0VONl9QVEVfQUREUl9FTkNPREUoYWRkcik7Ci0KLQlpZiAoIShmbGFn cyAmIFBURV9SRUFEX09OTFkpKQotCQlwdGUgfD0gQllUX1BURV9XUklURUFCTEU7Ci0KLQlpZiAo bGV2ZWwgIT0gSTkxNV9DQUNIRV9OT05FKQotCQlwdGUgfD0gQllUX1BURV9TTk9PUEVEX0JZX0NQ VV9DQUNIRVM7Ci0KLQlyZXR1cm4gcHRlOwotfQotCi1zdGF0aWMgdTY0IGhzd19wdGVfZW5jb2Rl KGRtYV9hZGRyX3QgYWRkciwKLQkJCSAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGxldmVsLAotCQkJ ICB1MzIgZmxhZ3MpCi17Ci0JZ2VuNl9wdGVfdCBwdGUgPSBHRU42X1BURV9WQUxJRDsKLQlwdGUg fD0gSFNXX1BURV9BRERSX0VOQ09ERShhZGRyKTsKLQotCWlmIChsZXZlbCAhPSBJOTE1X0NBQ0hF X05PTkUpCi0JCXB0ZSB8PSBIU1dfV0JfTExDX0FHRTM7Ci0KLQlyZXR1cm4gcHRlOwotfQotCi1z dGF0aWMgdTY0IGlyaXNfcHRlX2VuY29kZShkbWFfYWRkcl90IGFkZHIsCi0JCQkgICBlbnVtIGk5 MTVfY2FjaGVfbGV2ZWwgbGV2ZWwsCi0JCQkgICB1MzIgZmxhZ3MpCi17Ci0JZ2VuNl9wdGVfdCBw dGUgPSBHRU42X1BURV9WQUxJRDsKLQlwdGUgfD0gSFNXX1BURV9BRERSX0VOQ09ERShhZGRyKTsK LQotCXN3aXRjaCAobGV2ZWwpIHsKLQljYXNlIEk5MTVfQ0FDSEVfTk9ORToKLQkJYnJlYWs7Ci0J Y2FzZSBJOTE1X0NBQ0hFX1dUOgotCQlwdGUgfD0gSFNXX1dUX0VMTENfTExDX0FHRTM7Ci0JCWJy ZWFrOwotCWRlZmF1bHQ6Ci0JCXB0ZSB8PSBIU1dfV0JfRUxMQ19MTENfQUdFMzsKLQkJYnJlYWs7 Ci0JfQotCi0JcmV0dXJuIHB0ZTsKLX0KLQotc3RhdGljIHZvaWQgc3Rhc2hfaW5pdChzdHJ1Y3Qg cGFnZXN0YXNoICpzdGFzaCkKLXsKLQlwYWdldmVjX2luaXQoJnN0YXNoLT5wdmVjKTsKLQlzcGlu X2xvY2tfaW5pdCgmc3Rhc2gtPmxvY2spOwotfQotCi1zdGF0aWMgc3RydWN0IHBhZ2UgKnN0YXNo X3BvcF9wYWdlKHN0cnVjdCBwYWdlc3Rhc2ggKnN0YXNoKQotewotCXN0cnVjdCBwYWdlICpwYWdl ID0gTlVMTDsKLQotCXNwaW5fbG9jaygmc3Rhc2gtPmxvY2spOwotCWlmIChsaWtlbHkoc3Rhc2gt PnB2ZWMubnIpKQotCQlwYWdlID0gc3Rhc2gtPnB2ZWMucGFnZXNbLS1zdGFzaC0+cHZlYy5ucl07 Ci0Jc3Bpbl91bmxvY2soJnN0YXNoLT5sb2NrKTsKLQotCXJldHVybiBwYWdlOwotfQotCi1zdGF0 aWMgdm9pZCBzdGFzaF9wdXNoX3BhZ2V2ZWMoc3RydWN0IHBhZ2VzdGFzaCAqc3Rhc2gsIHN0cnVj dCBwYWdldmVjICpwdmVjKQotewotCXVuc2lnbmVkIGludCBucjsKLQotCXNwaW5fbG9ja19uZXN0 ZWQoJnN0YXNoLT5sb2NrLCBTSU5HTEVfREVQVEhfTkVTVElORyk7Ci0KLQluciA9IG1pbl90KHR5 cGVvZihuciksIHB2ZWMtPm5yLCBwYWdldmVjX3NwYWNlKCZzdGFzaC0+cHZlYykpOwotCW1lbWNw eShzdGFzaC0+cHZlYy5wYWdlcyArIHN0YXNoLT5wdmVjLm5yLAotCSAgICAgICBwdmVjLT5wYWdl cyArIHB2ZWMtPm5yIC0gbnIsCi0JICAgICAgIHNpemVvZihwdmVjLT5wYWdlc1swXSkgKiBucik7 Ci0Jc3Rhc2gtPnB2ZWMubnIgKz0gbnI7Ci0KLQlzcGluX3VubG9jaygmc3Rhc2gtPmxvY2spOwot Ci0JcHZlYy0+bnIgLT0gbnI7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqdm1fYWxsb2NfcGFn ZShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwgZ2ZwX3QgZ2ZwKQoraW50IGk5MTVfZ2Vt X2d0dF9wcmVwYXJlX3BhZ2VzKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCQkg ICAgICAgc3RydWN0IHNnX3RhYmxlICpwYWdlcykKIHsKLQlzdHJ1Y3QgcGFnZXZlYyBzdGFjazsK LQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQotCWlmIChJOTE1X1NFTEZURVNUX09OTFkoc2hvdWxkX2Zh aWwoJnZtLT5mYXVsdF9hdHRyLCAxKSkpCi0JCWk5MTVfZ2VtX3Nocmlua19hbGwodm0tPmk5MTUp OwotCi0JcGFnZSA9IHN0YXNoX3BvcF9wYWdlKCZ2bS0+ZnJlZV9wYWdlcyk7Ci0JaWYgKHBhZ2Up Ci0JCXJldHVybiBwYWdlOwotCi0JaWYgKCF2bS0+cHRfa21hcF93YykKLQkJcmV0dXJuIGFsbG9j X3BhZ2UoZ2ZwKTsKLQotCS8qIExvb2sgaW4gb3VyIGdsb2JhbCBzdGFzaCBvZiBXQyBwYWdlcy4u LiAqLwotCXBhZ2UgPSBzdGFzaF9wb3BfcGFnZSgmdm0tPmk5MTUtPm1tLndjX3N0YXNoKTsKLQlp ZiAocGFnZSkKLQkJcmV0dXJuIHBhZ2U7Ci0KLQkvKgotCSAqIE90aGVyd2lzZSBiYXRjaCBhbGxv Y2F0ZSBwYWdlcyB0byBhbW9ydGl6ZSBjb3N0IG9mIHNldF9wYWdlc193Yy4KLQkgKgotCSAqIFdl IGhhdmUgdG8gYmUgY2FyZWZ1bCBhcyBwYWdlIGFsbG9jYXRpb24gbWF5IHRyaWdnZXIgdGhlIHNo cmlua2VyCi0JICogKHZpYSBkaXJlY3QgcmVjbGFpbSkgd2hpY2ggd2lsbCBmaWxsIHVwIHRoZSBX QyBzdGFzaCB1bmRlcm5lYXRoIHVzLgotCSAqIFNvIHdlIGFkZCBvdXIgV0IgcGFnZXMgaW50byBh IHRlbXBvcmFyeSBwdmVjIG9uIHRoZSBzdGFjayBhbmQgbWVyZ2UKLQkgKiB0aGVtIGludG8gdGhl IFdDIHN0YXNoIGFmdGVyIGFsbCB0aGUgYWxsb2NhdGlvbnMgYXJlIGNvbXBsZXRlLgotCSAqLwot CXBhZ2V2ZWNfaW5pdCgmc3RhY2spOwogCWRvIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0KLQkJ cGFnZSA9IGFsbG9jX3BhZ2UoZ2ZwKTsKLQkJaWYgKHVubGlrZWx5KCFwYWdlKSkKLQkJCWJyZWFr OwotCi0JCXN0YWNrLnBhZ2VzW3N0YWNrLm5yKytdID0gcGFnZTsKLQl9IHdoaWxlIChwYWdldmVj X3NwYWNlKCZzdGFjaykpOwotCi0JaWYgKHN0YWNrLm5yICYmICFzZXRfcGFnZXNfYXJyYXlfd2Mo c3RhY2sucGFnZXMsIHN0YWNrLm5yKSkgewotCQlwYWdlID0gc3RhY2sucGFnZXNbLS1zdGFjay5u cl07Ci0KLQkJLyogTWVyZ2Ugc3BhcmUgV0MgcGFnZXMgdG8gdGhlIGdsb2JhbCBzdGFzaCAqLwot CQlpZiAoc3RhY2subnIpCi0JCQlzdGFzaF9wdXNoX3BhZ2V2ZWMoJnZtLT5pOTE1LT5tbS53Y19z dGFzaCwgJnN0YWNrKTsKLQotCQkvKiBQdXNoIGFueSBzdXJwbHVzIFdDIHBhZ2VzIG9udG8gdGhl IGxvY2FsIFZNIHN0YXNoICovCi0JCWlmIChzdGFjay5ucikKLQkJCXN0YXNoX3B1c2hfcGFnZXZl Yygmdm0tPmZyZWVfcGFnZXMsICZzdGFjayk7Ci0JfQotCi0JLyogUmV0dXJuIHVud2FudGVkIGxl ZnRvdmVycyAqLwotCWlmICh1bmxpa2VseShzdGFjay5ucikpIHsKLQkJV0FSTl9PTl9PTkNFKHNl dF9wYWdlc19hcnJheV93YihzdGFjay5wYWdlcywgc3RhY2subnIpKTsKLQkJX19wYWdldmVjX3Jl bGVhc2UoJnN0YWNrKTsKLQl9Ci0KLQlyZXR1cm4gcGFnZTsKLX0KLQotc3RhdGljIHZvaWQgdm1f ZnJlZV9wYWdlc19yZWxlYXNlKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAotCQkJCSAg Ym9vbCBpbW1lZGlhdGUpCi17Ci0Jc3RydWN0IHBhZ2V2ZWMgKnB2ZWMgPSAmdm0tPmZyZWVfcGFn ZXMucHZlYzsKLQlzdHJ1Y3QgcGFnZXZlYyBzdGFjazsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQo JnZtLT5mcmVlX3BhZ2VzLmxvY2spOwotCUdFTV9CVUdfT04oIXBhZ2V2ZWNfY291bnQocHZlYykp OwotCi0JaWYgKHZtLT5wdF9rbWFwX3djKSB7Ci0JCS8qCi0JCSAqIFdoZW4gd2UgdXNlIFdDLCBm aXJzdCBmaWxsIHVwIHRoZSBnbG9iYWwgc3Rhc2ggYW5kIHRoZW4KLQkJICogb25seSBpZiBmdWxs IGltbWVkaWF0ZWx5IGZyZWUgdGhlIG92ZXJmbG93LgotCQkgKi8KLQkJc3Rhc2hfcHVzaF9wYWdl dmVjKCZ2bS0+aTkxNS0+bW0ud2Nfc3Rhc2gsIHB2ZWMpOwotCi0JCS8qCi0JCSAqIEFzIHdlIGhh dmUgbWFkZSBzb21lIHJvb20gaW4gdGhlIFZNJ3MgZnJlZV9wYWdlcywKLQkJICogd2UgY2FuIHdh aXQgZm9yIGl0IHRvIGZpbGwgYWdhaW4uIFVubGVzcyB3ZSBhcmUKLQkJICogaW5zaWRlIGk5MTVf YWRkcmVzc19zcGFjZV9maW5pKCkgYW5kIG11c3QKLQkJICogaW1tZWRpYXRlbHkgcmVsZWFzZSB0 aGUgcGFnZXMhCi0JCSAqLwotCQlpZiAocHZlYy0+bnIgPD0gKGltbWVkaWF0ZSA/IDAgOiBQQUdF VkVDX1NJWkUgLSAxKSkKLQkJCXJldHVybjsKKwkJaWYgKGRtYV9tYXBfc2dfYXR0cnMoJm9iai0+ YmFzZS5kZXYtPnBkZXYtPmRldiwKKwkJCQkgICAgIHBhZ2VzLT5zZ2wsIHBhZ2VzLT5uZW50cywK KwkJCQkgICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCwKKwkJCQkgICAgIERNQV9BVFRSX05PX1dB Uk4pKQorCQkJcmV0dXJuIDA7CiAKIAkJLyoKLQkJICogV2UgaGF2ZSB0byBkcm9wIHRoZSBsb2Nr IHRvIGFsbG93IG91cnNlbHZlcyB0byBzbGVlcCwKLQkJICogc28gdGFrZSBhIGNvcHkgb2YgdGhl IHB2ZWMgYW5kIGNsZWFyIHRoZSBzdGFzaCBmb3IKLQkJICogb3RoZXJzIHRvIHVzZSBpdCBhcyB3 ZSBzbGVlcC4KKwkJICogSWYgdGhlIERNQSByZW1hcCBmYWlscywgb25lIGNhdXNlIGNhbiBiZSB0 aGF0IHdlIGhhdmUKKwkJICogdG9vIG1hbnkgb2JqZWN0cyBwaW5uZWQgaW4gYSBzbWFsbCByZW1h cHBpbmcgdGFibGUsCisJCSAqIHN1Y2ggYXMgc3dpb3RsYi4gSW5jcmVtZW50YWxseSBwdXJnZSBh bGwgb3RoZXIgb2JqZWN0cyBhbmQKKwkJICogdHJ5IGFnYWluIC0gaWYgdGhlcmUgYXJlIG5vIG1v cmUgcGFnZXMgdG8gcmVtb3ZlIGZyb20KKwkJICogdGhlIERNQSByZW1hcHBlciwgaTkxNV9nZW1f c2hyaW5rIHdpbGwgcmV0dXJuIDAuCiAJCSAqLwotCQlzdGFjayA9ICpwdmVjOwotCQlwYWdldmVj X3JlaW5pdChwdmVjKTsKLQkJc3Bpbl91bmxvY2soJnZtLT5mcmVlX3BhZ2VzLmxvY2spOwotCi0J CXB2ZWMgPSAmc3RhY2s7Ci0JCXNldF9wYWdlc19hcnJheV93YihwdmVjLT5wYWdlcywgcHZlYy0+ bnIpOwotCi0JCXNwaW5fbG9jaygmdm0tPmZyZWVfcGFnZXMubG9jayk7Ci0JfQotCi0JX19wYWdl dmVjX3JlbGVhc2UocHZlYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZtX2ZyZWVfcGFnZShzdHJ1Y3Qg aTkxNV9hZGRyZXNzX3NwYWNlICp2bSwgc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JLyoKLQkgKiBP biAhbGxjLCB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgcGFnZXMgYmFjayB0byBXQi4gV2Ugb25seSBk byBzbwotCSAqIGluIGJ1bGssIHNvIHdlIHJhcmVseSBuZWVkIHRvIGNoYW5nZSB0aGUgcGFnZSBh dHRyaWJ1dGVzIGhlcmUsCi0JICogYnV0IGRvaW5nIHNvIHJlcXVpcmVzIGEgc3RvcF9tYWNoaW5l KCkgZnJvbSBkZWVwIGluc2lkZSBhcmNoL3g4Ni9tbS4KLQkgKiBUbyBtYWtlIGRldGVjdGlvbiBv ZiB0aGUgcG9zc2libGUgc2xlZXAgbW9yZSBsaWtlbHksIHVzZSBhbgotCSAqIHVuY29uZGl0aW9u YWwgbWlnaHRfc2xlZXAoKSBmb3IgZXZlcnlib2R5LgotCSAqLwotCW1pZ2h0X3NsZWVwKCk7Ci0J c3Bpbl9sb2NrKCZ2bS0+ZnJlZV9wYWdlcy5sb2NrKTsKLQl3aGlsZSAoIXBhZ2V2ZWNfc3BhY2Uo JnZtLT5mcmVlX3BhZ2VzLnB2ZWMpKQotCQl2bV9mcmVlX3BhZ2VzX3JlbGVhc2Uodm0sIGZhbHNl KTsKLQlHRU1fQlVHX09OKHBhZ2V2ZWNfY291bnQoJnZtLT5mcmVlX3BhZ2VzLnB2ZWMpID49IFBB R0VWRUNfU0laRSk7Ci0JcGFnZXZlY19hZGQoJnZtLT5mcmVlX3BhZ2VzLnB2ZWMsIHBhZ2UpOwot CXNwaW5fdW5sb2NrKCZ2bS0+ZnJlZV9wYWdlcy5sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgaTkx NV9hZGRyZXNzX3NwYWNlX2Zpbmkoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pCi17Ci0J c3Bpbl9sb2NrKCZ2bS0+ZnJlZV9wYWdlcy5sb2NrKTsKLQlpZiAocGFnZXZlY19jb3VudCgmdm0t PmZyZWVfcGFnZXMucHZlYykpCi0JCXZtX2ZyZWVfcGFnZXNfcmVsZWFzZSh2bSwgdHJ1ZSk7Ci0J R0VNX0JVR19PTihwYWdldmVjX2NvdW50KCZ2bS0+ZnJlZV9wYWdlcy5wdmVjKSk7Ci0Jc3Bpbl91 bmxvY2soJnZtLT5mcmVlX3BhZ2VzLmxvY2spOwotCi0JZHJtX21tX3Rha2Vkb3duKCZ2bS0+bW0p OwotCi0JbXV0ZXhfZGVzdHJveSgmdm0tPm11dGV4KTsKLX0KLQotdm9pZCBfX2k5MTVfdm1fY2xv c2Uoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pCi17Ci0Jc3RydWN0IGk5MTVfdm1hICp2 bWEsICp2bjsKLQotCW11dGV4X2xvY2soJnZtLT5tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRy eV9zYWZlKHZtYSwgdm4sICZ2bS0+Ym91bmRfbGlzdCwgdm1fbGluaykgewotCQlzdHJ1Y3QgZHJt X2k5MTVfZ2VtX29iamVjdCAqb2JqID0gdm1hLT5vYmo7Ci0KLQkJLyogS2VlcCB0aGUgb2JqIChh bmQgaGVuY2UgdGhlIHZtYSkgYWxpdmUgYXMgX3dlXyBkZXN0cm95IGl0ICovCi0JCWlmICgha3Jl Zl9nZXRfdW5sZXNzX3plcm8oJm9iai0+YmFzZS5yZWZjb3VudCkpCi0JCQljb250aW51ZTsKLQot CQlhdG9taWNfYW5kKH5JOTE1X1ZNQV9QSU5fTUFTSywgJnZtYS0+ZmxhZ3MpOwotCQlXQVJOX09O KF9faTkxNV92bWFfdW5iaW5kKHZtYSkpOwotCQlfX2k5MTVfdm1hX3B1dCh2bWEpOwotCi0JCWk5 MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKLQl9Ci0JR0VNX0JVR19PTighbGlzdF9lbXB0eSgmdm0t PmJvdW5kX2xpc3QpKTsKLQltdXRleF91bmxvY2soJnZtLT5tdXRleCk7Ci19Ci0KLXN0YXRpYyB2 b2lkIF9faTkxNV92bV9yZWxlYXNlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1 Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qg aTkxNV9hZGRyZXNzX3NwYWNlLCByY3Uud29yayk7Ci0KLQl2bS0+Y2xlYW51cCh2bSk7Ci0JaTkx NV9hZGRyZXNzX3NwYWNlX2Zpbmkodm0pOwotCi0Ja2ZyZWUodm0pOwotfQotCi12b2lkIGk5MTVf dm1fcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKLXsKLQlzdHJ1Y3QgaTkxNV9hZGRyZXNzX3Nw YWNlICp2bSA9Ci0JCWNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNl LCByZWYpOwotCi0JR0VNX0JVR19PTihpOTE1X2lzX2dndHQodm0pKTsKLQl0cmFjZV9pOTE1X3Bw Z3R0X3JlbGVhc2Uodm0pOwotCi0JcXVldWVfcmN1X3dvcmsodm0tPmk5MTUtPndxLCAmdm0tPnJj dSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGk5MTVfYWRkcmVzc19zcGFjZV9pbml0KHN0cnVjdCBpOTE1 X2FkZHJlc3Nfc3BhY2UgKnZtLCBpbnQgc3ViY2xhc3MpCi17Ci0Ja3JlZl9pbml0KCZ2bS0+cmVm KTsKLQlJTklUX1JDVV9XT1JLKCZ2bS0+cmN1LCBfX2k5MTVfdm1fcmVsZWFzZSk7Ci0JYXRvbWlj X3NldCgmdm0tPm9wZW4sIDEpOwotCi0JLyoKLQkgKiBUaGUgdm0tPm11dGV4IG11c3QgYmUgcmVj bGFpbSBzYWZlIChmb3IgdXNlIGluIHRoZSBzaHJpbmtlcikuCi0JICogRG8gYSBkdW1teSBhY3F1 aXJlIG5vdyB1bmRlciBmc19yZWNsYWltIHNvIHRoYXQgYW55IGFsbG9jYXRpb24KLQkgKiBhdHRl bXB0IGhvbGRpbmcgdGhlIGxvY2sgaXMgaW1tZWRpYXRlbHkgcmVwb3J0ZWQgYnkgbG9ja2RlcC4K LQkgKi8KLQltdXRleF9pbml0KCZ2bS0+bXV0ZXgpOwotCWxvY2tkZXBfc2V0X3N1YmNsYXNzKCZ2 bS0+bXV0ZXgsIHN1YmNsYXNzKTsKLQlpOTE1X2dlbV9zaHJpbmtlcl90YWludHNfbXV0ZXgodm0t Pmk5MTUsICZ2bS0+bXV0ZXgpOwotCi0JR0VNX0JVR19PTighdm0tPnRvdGFsKTsKLQlkcm1fbW1f aW5pdCgmdm0tPm1tLCAwLCB2bS0+dG90YWwpOwotCXZtLT5tbS5oZWFkX25vZGUuY29sb3IgPSBJ OTE1X0NPTE9SX1VORVZJQ1RBQkxFOwotCi0Jc3Rhc2hfaW5pdCgmdm0tPmZyZWVfcGFnZXMpOwot Ci0JSU5JVF9MSVNUX0hFQUQoJnZtLT5ib3VuZF9saXN0KTsKLX0KLQotc3RhdGljIGludCBfX3Nl dHVwX3BhZ2VfZG1hKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAotCQkJICAgIHN0cnVj dCBpOTE1X3BhZ2VfZG1hICpwLAotCQkJICAgIGdmcF90IGdmcCkKLXsKLQlwLT5wYWdlID0gdm1f YWxsb2NfcGFnZSh2bSwgZ2ZwIHwgSTkxNV9HRlBfQUxMT1dfRkFJTCk7Ci0JaWYgKHVubGlrZWx5 KCFwLT5wYWdlKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwLT5kYWRkciA9IGRtYV9tYXBfcGFn ZV9hdHRycyh2bS0+ZG1hLAotCQkJCSAgICAgIHAtPnBhZ2UsIDAsIFBBR0VfU0laRSwKLQkJCQkg ICAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwsCi0JCQkJICAgICAgRE1BX0FUVFJfU0tJUF9DUFVf U1lOQyB8Ci0JCQkJICAgICAgRE1BX0FUVFJfTk9fV0FSTik7Ci0JaWYgKHVubGlrZWx5KGRtYV9t YXBwaW5nX2Vycm9yKHZtLT5kbWEsIHAtPmRhZGRyKSkpIHsKLQkJdm1fZnJlZV9wYWdlKHZtLCBw LT5wYWdlKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRp YyBpbnQgc2V0dXBfcGFnZV9kbWEoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCi0JCQkg IHN0cnVjdCBpOTE1X3BhZ2VfZG1hICpwKQotewotCXJldHVybiBfX3NldHVwX3BhZ2VfZG1hKHZt LCBwLCBfX0dGUF9ISUdITUVNKTsKLX0KLQotc3RhdGljIHZvaWQgY2xlYW51cF9wYWdlX2RtYShz dHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKLQkJCSAgICAgc3RydWN0IGk5MTVfcGFnZV9k bWEgKnApCi17Ci0JZG1hX3VubWFwX3BhZ2Uodm0tPmRtYSwgcC0+ZGFkZHIsIFBBR0VfU0laRSwg UENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQl2bV9mcmVlX3BhZ2Uodm0sIHAtPnBhZ2UpOwotfQot Ci0jZGVmaW5lIGttYXBfYXRvbWljX3B4KHB4KSBrbWFwX2F0b21pYyhweF9iYXNlKHB4KS0+cGFn ZSkKKwkJR0VNX0JVR19PTihvYmotPm1tLnBhZ2VzID09IHBhZ2VzKTsKKwl9IHdoaWxlIChpOTE1 X2dlbV9zaHJpbmsodG9faTkxNShvYmotPmJhc2UuZGV2KSwKKwkJCQkgb2JqLT5iYXNlLnNpemUg Pj4gUEFHRV9TSElGVCwgTlVMTCwKKwkJCQkgSTkxNV9TSFJJTktfQk9VTkQgfAorCQkJCSBJOTE1 X1NIUklOS19VTkJPVU5EKSk7CiAKLXN0YXRpYyB2b2lkCi1maWxsX3BhZ2VfZG1hKGNvbnN0IHN0 cnVjdCBpOTE1X3BhZ2VfZG1hICpwLCBjb25zdCB1NjQgdmFsLCB1bnNpZ25lZCBpbnQgY291bnQp Ci17Ci0Ja3VubWFwX2F0b21pYyhtZW1zZXQ2NChrbWFwX2F0b21pYyhwLT5wYWdlKSwgdmFsLCBj b3VudCkpOworCXJldHVybiAtRU5PU1BDOwogfQogCi0jZGVmaW5lIGZpbGxfcHgocHgsIHYpIGZp bGxfcGFnZV9kbWEocHhfYmFzZShweCksICh2KSwgUEFHRV9TSVpFIC8gc2l6ZW9mKHU2NCkpCi0j ZGVmaW5lIGZpbGwzMl9weChweCwgdikgZG8gewkJCQkJCVwKLQl1NjQgdl9fID0gbG93ZXJfMzJf Yml0cyh2KTsJCQkJCVwKLQlmaWxsX3B4KChweCksIHZfXyA8PCAzMiB8IHZfXyk7CQkJCQlcCi19 IHdoaWxlICgwKQotCi1zdGF0aWMgaW50Ci1zZXR1cF9zY3JhdGNoX3BhZ2Uoc3RydWN0IGk5MTVf YWRkcmVzc19zcGFjZSAqdm0sIGdmcF90IGdmcCkKK3ZvaWQgaTkxNV9nZW1fZ3R0X2ZpbmlzaF9w YWdlcyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJICAgICAgIHN0cnVjdCBz Z190YWJsZSAqcGFnZXMpCiB7Ci0JdW5zaWduZWQgbG9uZyBzaXplOworCXN0cnVjdCBkcm1faTkx NV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUob2JqLT5iYXNlLmRldik7CisJc3RydWN0IGRl dmljZSAqa2RldiA9ICZkZXZfcHJpdi0+ZHJtLnBkZXYtPmRldjsKKwlzdHJ1Y3QgaTkxNV9nZ3R0 ICpnZ3R0ID0gJmRldl9wcml2LT5nZ3R0OwogCi0JLyoKLQkgKiBJbiBvcmRlciB0byB1dGlsaXpl IDY0SyBwYWdlcyBmb3IgYW4gb2JqZWN0IHdpdGggYSBzaXplIDwgMk0sIHdlIHdpbGwKLQkgKiBu ZWVkIHRvIHN1cHBvcnQgYSA2NEsgc2NyYXRjaCBwYWdlLCBnaXZlbiB0aGF0IGV2ZXJ5IDE2dGgg ZW50cnkgZm9yIGEKLQkgKiBwYWdlLXRhYmxlIG9wZXJhdGluZyBpbiA2NEsgbW9kZSBtdXN0IHBv aW50IHRvIGEgcHJvcGVybHkgYWxpZ25lZCA2NEsKLQkgKiByZWdpb24sIGluY2x1ZGluZyBhbnkg UFRFcyB3aGljaCBoYXBwZW4gdG8gcG9pbnQgdG8gc2NyYXRjaC4KLQkgKgotCSAqIFRoaXMgaXMg b25seSByZWxldmFudCBmb3IgdGhlIDQ4YiBQUEdUVCB3aGVyZSB3ZSBzdXBwb3J0Ci0JICogaHVn ZS1ndHQtcGFnZXMsIHNlZSBhbHNvIGk5MTVfdm1hX2luc2VydCgpLiBIb3dldmVyLCBhcyB3ZSBz aGFyZSB0aGUKLQkgKiBzY3JhdGNoIChyZWFkLW9ubHkpIGJldHdlZW4gYWxsIHZtLCB3ZSBjcmVh dGUgb25lIDY0ayBzY3JhdGNoIHBhZ2UKLQkgKiBmb3IgYWxsLgotCSAqLwotCXNpemUgPSBJOTE1 X0dUVF9QQUdFX1NJWkVfNEs7Ci0JaWYgKGk5MTVfdm1faXNfNGx2bCh2bSkgJiYKLQkgICAgSEFT X1BBR0VfU0laRVModm0tPmk5MTUsIEk5MTVfR1RUX1BBR0VfU0laRV82NEspKSB7Ci0JCXNpemUg PSBJOTE1X0dUVF9QQUdFX1NJWkVfNjRLOwotCQlnZnAgfD0gX19HRlBfTk9XQVJOOworCWlmICh1 bmxpa2VseShnZ3R0LT5kb19pZGxlX21hcHMpKSB7CisJCS8qIFhYWCBUaGlzIGRvZXMgbm90IHBy ZXZlbnQgbW9yZSByZXF1ZXN0cyBiZWluZyBzdWJtaXR0ZWQhICovCisJCWlmIChpbnRlbF9ndF9y ZXRpcmVfcmVxdWVzdHNfdGltZW91dChnZ3R0LT52bS5ndCwKKwkJCQkJCSAgICAgLU1BWF9TQ0hF RFVMRV9USU1FT1VUKSkgeworCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gd2FpdCBmb3IgaWRsZTsg VlQnZCBtYXkgaGFuZy5cbiIpOworCQkJLyogV2FpdCBhIGJpdCwgaW4gaG9wZXMgaXQgYXZvaWRz IHRoZSBoYW5nICovCisJCQl1ZGVsYXkoMTApOworCQl9CiAJfQotCWdmcCB8PSBfX0dGUF9aRVJP IHwgX19HRlBfUkVUUllfTUFZRkFJTDsKLQotCWRvIHsKLQkJdW5zaWduZWQgaW50IG9yZGVyID0g Z2V0X29yZGVyKHNpemUpOwotCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQkJZG1hX2FkZHJfdCBhZGRy OwogCi0JCXBhZ2UgPSBhbGxvY19wYWdlcyhnZnAsIG9yZGVyKTsKLQkJaWYgKHVubGlrZWx5KCFw YWdlKSkKLQkJCWdvdG8gc2tpcDsKLQotCQlhZGRyID0gZG1hX21hcF9wYWdlX2F0dHJzKHZtLT5k bWEsCi0JCQkJCSAgcGFnZSwgMCwgc2l6ZSwKLQkJCQkJICBQQ0lfRE1BX0JJRElSRUNUSU9OQUws Ci0JCQkJCSAgRE1BX0FUVFJfU0tJUF9DUFVfU1lOQyB8Ci0JCQkJCSAgRE1BX0FUVFJfTk9fV0FS Tik7Ci0JCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcih2bS0+ZG1hLCBhZGRyKSkpCi0J CQlnb3RvIGZyZWVfcGFnZTsKLQotCQlpZiAodW5saWtlbHkoIUlTX0FMSUdORUQoYWRkciwgc2l6 ZSkpKQotCQkJZ290byB1bm1hcF9wYWdlOwotCi0JCXZtLT5zY3JhdGNoWzBdLmJhc2UucGFnZSA9 IHBhZ2U7Ci0JCXZtLT5zY3JhdGNoWzBdLmJhc2UuZGFkZHIgPSBhZGRyOwotCQl2bS0+c2NyYXRj aF9vcmRlciA9IG9yZGVyOwotCQlyZXR1cm4gMDsKLQotdW5tYXBfcGFnZToKLQkJZG1hX3VubWFw X3BhZ2Uodm0tPmRtYSwgYWRkciwgc2l6ZSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLWZyZWVf cGFnZToKLQkJX19mcmVlX3BhZ2VzKHBhZ2UsIG9yZGVyKTsKLXNraXA6Ci0JCWlmIChzaXplID09 IEk5MTVfR1RUX1BBR0VfU0laRV80SykKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCXNpemUgPSBJ OTE1X0dUVF9QQUdFX1NJWkVfNEs7Ci0JCWdmcCAmPSB+X19HRlBfTk9XQVJOOwotCX0gd2hpbGUg KDEpOwotfQotCi1zdGF0aWMgdm9pZCBjbGVhbnVwX3NjcmF0Y2hfcGFnZShzdHJ1Y3QgaTkxNV9h ZGRyZXNzX3NwYWNlICp2bSkKLXsKLQlzdHJ1Y3QgaTkxNV9wYWdlX2RtYSAqcCA9IHB4X2Jhc2Uo JnZtLT5zY3JhdGNoWzBdKTsKLQl1bnNpZ25lZCBpbnQgb3JkZXIgPSB2bS0+c2NyYXRjaF9vcmRl cjsKLQotCWRtYV91bm1hcF9wYWdlKHZtLT5kbWEsIHAtPmRhZGRyLCBCSVQob3JkZXIpIDw8IFBB R0VfU0hJRlQsCi0JCSAgICAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCV9fZnJlZV9wYWdl cyhwLT5wYWdlLCBvcmRlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfc2NyYXRjaChzdHJ1Y3Qg aTkxNV9hZGRyZXNzX3NwYWNlICp2bSkKLXsKLQlpbnQgaTsKLQotCWlmICghcHhfZG1hKCZ2bS0+ c2NyYXRjaFswXSkpIC8qIHNldCB0byAwIG9uIGNsb25lcyAqLwotCQlyZXR1cm47Ci0KLQlmb3Ig KGkgPSAxOyBpIDw9IHZtLT50b3A7IGkrKykgewotCQlpZiAoIXB4X2RtYSgmdm0tPnNjcmF0Y2hb aV0pKQotCQkJYnJlYWs7Ci0JCWNsZWFudXBfcGFnZV9kbWEodm0sIHB4X2Jhc2UoJnZtLT5zY3Jh dGNoW2ldKSk7Ci0JfQotCi0JY2xlYW51cF9zY3JhdGNoX3BhZ2Uodm0pOwotfQotCi1zdGF0aWMg c3RydWN0IGk5MTVfcGFnZV90YWJsZSAqYWxsb2NfcHQoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFj ZSAqdm0pCi17Ci0Jc3RydWN0IGk5MTVfcGFnZV90YWJsZSAqcHQ7Ci0KLQlwdCA9IGttYWxsb2Mo c2l6ZW9mKCpwdCksIEk5MTVfR0ZQX0FMTE9XX0ZBSUwpOwotCWlmICh1bmxpa2VseSghcHQpKQot CQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQotCWlmICh1bmxpa2VseShzZXR1cF9wYWdlX2Rt YSh2bSwgJnB0LT5iYXNlKSkpIHsKLQkJa2ZyZWUocHQpOwotCQlyZXR1cm4gRVJSX1BUUigtRU5P TUVNKTsKLQl9Ci0KLQlhdG9taWNfc2V0KCZwdC0+dXNlZCwgMCk7Ci0JcmV0dXJuIHB0OwotfQot Ci1zdGF0aWMgc3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKl9fYWxsb2NfcGQoc2l6ZV90IHN6 KQotewotCXN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICpwZDsKLQotCXBkID0ga3phbGxvYyhz eiwgSTkxNV9HRlBfQUxMT1dfRkFJTCk7Ci0JaWYgKHVubGlrZWx5KCFwZCkpCi0JCXJldHVybiBO VUxMOwotCi0Jc3Bpbl9sb2NrX2luaXQoJnBkLT5sb2NrKTsKLQlyZXR1cm4gcGQ7Ci19Ci0KLXN0 YXRpYyBzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqYWxsb2NfcGQoc3RydWN0IGk5MTVfYWRk cmVzc19zcGFjZSAqdm0pCi17Ci0Jc3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKnBkOwotCi0J cGQgPSBfX2FsbG9jX3BkKHNpemVvZigqcGQpKTsKLQlpZiAodW5saWtlbHkoIXBkKSkKLQkJcmV0 dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0KLQlpZiAodW5saWtlbHkoc2V0dXBfcGFnZV9kbWEodm0s IHB4X2Jhc2UocGQpKSkpIHsKLQkJa2ZyZWUocGQpOwotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVN KTsKLQl9Ci0KLQlyZXR1cm4gcGQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfcGQoc3RydWN0IGk5 MTVfYWRkcmVzc19zcGFjZSAqdm0sIHN0cnVjdCBpOTE1X3BhZ2VfZG1hICpwZCkKLXsKLQljbGVh bnVwX3BhZ2VfZG1hKHZtLCBwZCk7Ci0Ja2ZyZWUocGQpOwotfQotCi0jZGVmaW5lIGZyZWVfcHgo dm0sIHB4KSBmcmVlX3BkKHZtLCBweF9iYXNlKHB4KSkKLQotc3RhdGljIGlubGluZSB2b2lkCi13 cml0ZV9kbWFfZW50cnkoc3RydWN0IGk5MTVfcGFnZV9kbWEgKiBjb25zdCBwZG1hLAotCQljb25z dCB1bnNpZ25lZCBzaG9ydCBpZHgsCi0JCWNvbnN0IHU2NCBlbmNvZGVkX2VudHJ5KQotewotCXU2 NCAqIGNvbnN0IHZhZGRyID0ga21hcF9hdG9taWMocGRtYS0+cGFnZSk7Ci0KLQl2YWRkcltpZHhd ID0gZW5jb2RlZF9lbnRyeTsKLQlrdW5tYXBfYXRvbWljKHZhZGRyKTsKLX0KLQotc3RhdGljIGlu bGluZSB2b2lkCi1fX3NldF9wZF9lbnRyeShzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqIGNv bnN0IHBkLAotCSAgICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBpZHgsCi0JICAgICAgIHN0cnVj dCBpOTE1X3BhZ2VfZG1hICogY29uc3QgdG8sCi0JICAgICAgIHU2NCAoKmVuY29kZSkoY29uc3Qg ZG1hX2FkZHJfdCwgY29uc3QgZW51bSBpOTE1X2NhY2hlX2xldmVsKSkKLXsKLQkvKiBFYWNoIHRo cmVhZCBwcmUtcGlucyB0aGUgcGQsIGFuZCB3ZSBtYXkgaGF2ZSBhIHRocmVhZCBwZXIgcGRlLiAq LwotCUdFTV9CVUdfT04oYXRvbWljX3JlYWQocHhfdXNlZChwZCkpID4gTkFMTE9DICogQVJSQVlf U0laRShwZC0+ZW50cnkpKTsKLQotCWF0b21pY19pbmMocHhfdXNlZChwZCkpOwotCXBkLT5lbnRy eVtpZHhdID0gdG87Ci0Jd3JpdGVfZG1hX2VudHJ5KHB4X2Jhc2UocGQpLCBpZHgsIGVuY29kZSh0 by0+ZGFkZHIsIEk5MTVfQ0FDSEVfTExDKSk7Ci19Ci0KLSNkZWZpbmUgc2V0X3BkX2VudHJ5KHBk LCBpZHgsIHRvKSBcCi0JX19zZXRfcGRfZW50cnkoKHBkKSwgKGlkeCksIHB4X2Jhc2UodG8pLCBn ZW44X3BkZV9lbmNvZGUpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotY2xlYXJfcGRfZW50cnkoc3Ry dWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKiBjb25zdCBwZCwKLQkgICAgICAgY29uc3QgdW5zaWdu ZWQgc2hvcnQgaWR4LAotCSAgICAgICBjb25zdCBzdHJ1Y3QgaTkxNV9wYWdlX3NjcmF0Y2ggKiBj b25zdCBzY3JhdGNoKQotewotCUdFTV9CVUdfT04oYXRvbWljX3JlYWQocHhfdXNlZChwZCkpID09 IDApOwotCi0Jd3JpdGVfZG1hX2VudHJ5KHB4X2Jhc2UocGQpLCBpZHgsIHNjcmF0Y2gtPmVuY29k ZSk7Ci0JcGQtPmVudHJ5W2lkeF0gPSBOVUxMOwotCWF0b21pY19kZWMocHhfdXNlZChwZCkpOwot fQotCi1zdGF0aWMgYm9vbAotcmVsZWFzZV9wZF9lbnRyeShzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVj dG9yeSAqIGNvbnN0IHBkLAotCQkgY29uc3QgdW5zaWduZWQgc2hvcnQgaWR4LAotCQkgc3RydWN0 IGk5MTVfcGFnZV90YWJsZSAqIGNvbnN0IHB0LAotCQkgY29uc3Qgc3RydWN0IGk5MTVfcGFnZV9z Y3JhdGNoICogY29uc3Qgc2NyYXRjaCkKLXsKLQlib29sIGZyZWUgPSBmYWxzZTsKLQotCWlmIChh dG9taWNfYWRkX3VubGVzcygmcHQtPnVzZWQsIC0xLCAxKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0J c3Bpbl9sb2NrKCZwZC0+bG9jayk7Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnB0LT51c2Vk KSkgewotCQljbGVhcl9wZF9lbnRyeShwZCwgaWR4LCBzY3JhdGNoKTsKLQkJZnJlZSA9IHRydWU7 Ci0JfQotCXNwaW5fdW5sb2NrKCZwZC0+bG9jayk7Ci0KLQlyZXR1cm4gZnJlZTsKLX0KLQotc3Rh dGljIHZvaWQgZ2VuOF9wcGd0dF9ub3RpZnlfdmd0KHN0cnVjdCBpOTE1X3BwZ3R0ICpwcGd0dCwg Ym9vbCBjcmVhdGUpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gcHBn dHQtPnZtLmk5MTU7Ci0JZW51bSB2Z3RfZzJ2X3R5cGUgbXNnOwotCWludCBpOwotCi0JaWYgKGNy ZWF0ZSkKLQkJYXRvbWljX2luYyhweF91c2VkKHBwZ3R0LT5wZCkpOyAvKiBuZXZlciByZW1vdmUg Ki8KLQllbHNlCi0JCWF0b21pY19kZWMocHhfdXNlZChwcGd0dC0+cGQpKTsKLQotCW11dGV4X2xv Y2soJmRldl9wcml2LT52Z3B1LmxvY2spOwotCi0JaWYgKGk5MTVfdm1faXNfNGx2bCgmcHBndHQt PnZtKSkgewotCQljb25zdCB1NjQgZGFkZHIgPSBweF9kbWEocHBndHQtPnBkKTsKLQotCQlJOTE1 X1dSSVRFKHZndGlmX3JlZyhwZHBbMF0ubG8pLCBsb3dlcl8zMl9iaXRzKGRhZGRyKSk7Ci0JCUk5 MTVfV1JJVEUodmd0aWZfcmVnKHBkcFswXS5oaSksIHVwcGVyXzMyX2JpdHMoZGFkZHIpKTsKLQot CQltc2cgPSAoY3JlYXRlID8gVkdUX0cyVl9QUEdUVF9MNF9QQUdFX1RBQkxFX0NSRUFURSA6Ci0J CQkJVkdUX0cyVl9QUEdUVF9MNF9QQUdFX1RBQkxFX0RFU1RST1kpOwotCX0gZWxzZSB7Ci0JCWZv ciAoaSA9IDA7IGkgPCBHRU44XzNMVkxfUERQRVM7IGkrKykgewotCQkJY29uc3QgdTY0IGRhZGRy ID0gaTkxNV9wYWdlX2Rpcl9kbWFfYWRkcihwcGd0dCwgaSk7Ci0KLQkJCUk5MTVfV1JJVEUodmd0 aWZfcmVnKHBkcFtpXS5sbyksIGxvd2VyXzMyX2JpdHMoZGFkZHIpKTsKLQkJCUk5MTVfV1JJVEUo dmd0aWZfcmVnKHBkcFtpXS5oaSksIHVwcGVyXzMyX2JpdHMoZGFkZHIpKTsKLQkJfQotCi0JCW1z ZyA9IChjcmVhdGUgPyBWR1RfRzJWX1BQR1RUX0wzX1BBR0VfVEFCTEVfQ1JFQVRFIDoKLQkJCQlW R1RfRzJWX1BQR1RUX0wzX1BBR0VfVEFCTEVfREVTVFJPWSk7Ci0JfQotCi0JLyogZzJ2X25vdGlm eSBhdG9taWNhbGx5ICh2aWEgaHYgdHJhcCkgY29uc3VtZXMgdGhlIG1lc3NhZ2UgcGFja2V0LiAq LwotCUk5MTVfV1JJVEUodmd0aWZfcmVnKGcydl9ub3RpZnkpLCBtc2cpOwotCi0JbXV0ZXhfdW5s b2NrKCZkZXZfcHJpdi0+dmdwdS5sb2NrKTsKLX0KLQotLyogSW5kZXggc2hpZnRzIGludG8gdGhl IHBhZ2V0YWJsZSBhcmUgb2Zmc2V0IGJ5IEdFTjhfUFRFX1NISUZUIFsxMl0gKi8KLSNkZWZpbmUg R0VOOF9QQUdFX1NJWkUgKFNaXzRLKSAvKiBwYWdlIGFuZCBwYWdlLWRpcmVjdG9yeSBzaXplcyBh cmUgdGhlIHNhbWUgKi8KLSNkZWZpbmUgR0VOOF9QVEVfU0hJRlQgKGlsb2cyKEdFTjhfUEFHRV9T SVpFKSkKLSNkZWZpbmUgR0VOOF9QREVTIChHRU44X1BBR0VfU0laRSAvIHNpemVvZih1NjQpKQot I2RlZmluZSBnZW44X3BkX3NoaWZ0KGx2bCkgKChsdmwpICogaWxvZzIoR0VOOF9QREVTKSkKLSNk ZWZpbmUgZ2VuOF9wZF9pbmRleChpLCBsdmwpIGk5MTVfcGRlX2luZGV4KChpKSwgZ2VuOF9wZF9z aGlmdChsdmwpKQotI2RlZmluZSBfX2dlbjhfcHRlX3NoaWZ0KGx2bCkgKEdFTjhfUFRFX1NISUZU ICsgZ2VuOF9wZF9zaGlmdChsdmwpKQotI2RlZmluZSBfX2dlbjhfcHRlX2luZGV4KGEsIGx2bCkg aTkxNV9wZGVfaW5kZXgoKGEpLCBfX2dlbjhfcHRlX3NoaWZ0KGx2bCkpCi0KLXN0YXRpYyBpbmxp bmUgdW5zaWduZWQgaW50Ci1nZW44X3BkX3JhbmdlKHU2NCBzdGFydCwgdTY0IGVuZCwgaW50IGx2 bCwgdW5zaWduZWQgaW50ICppZHgpCi17Ci0JY29uc3QgaW50IHNoaWZ0ID0gZ2VuOF9wZF9zaGlm dChsdmwpOwotCWNvbnN0IHU2NCBtYXNrID0gfjB1bGwgPDwgZ2VuOF9wZF9zaGlmdChsdmwgKyAx KTsKLQotCUdFTV9CVUdfT04oc3RhcnQgPj0gZW5kKTsKLQllbmQgKz0gfm1hc2sgPj4gZ2VuOF9w ZF9zaGlmdCgxKTsKLQotCSppZHggPSBpOTE1X3BkZV9pbmRleChzdGFydCwgc2hpZnQpOwotCWlm ICgoc3RhcnQgXiBlbmQpICYgbWFzaykKLQkJcmV0dXJuIEdFTjhfUERFUyAtICppZHg7Ci0JZWxz ZQotCQlyZXR1cm4gaTkxNV9wZGVfaW5kZXgoZW5kLCBzaGlmdCkgLSAqaWR4OwotfQotCi1zdGF0 aWMgaW5saW5lIGJvb2wgZ2VuOF9wZF9jb250YWlucyh1NjQgc3RhcnQsIHU2NCBlbmQsIGludCBs dmwpCi17Ci0JY29uc3QgdTY0IG1hc2sgPSB+MHVsbCA8PCBnZW44X3BkX3NoaWZ0KGx2bCArIDEp OwotCi0JR0VNX0JVR19PTihzdGFydCA+PSBlbmQpOwotCXJldHVybiAoc3RhcnQgXiBlbmQpICYg bWFzayAmJiAoc3RhcnQgJiB+bWFzaykgPT0gMDsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25l ZCBpbnQgZ2VuOF9wdF9jb3VudCh1NjQgc3RhcnQsIHU2NCBlbmQpCi17Ci0JR0VNX0JVR19PTihz dGFydCA+PSBlbmQpOwotCWlmICgoc3RhcnQgXiBlbmQpID4+IGdlbjhfcGRfc2hpZnQoMSkpCi0J CXJldHVybiBHRU44X1BERVMgLSAoc3RhcnQgJiAoR0VOOF9QREVTIC0gMSkpOwotCWVsc2UKLQkJ cmV0dXJuIGVuZCAtIHN0YXJ0OwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZW44 X3BkX3RvcF9jb3VudChjb25zdCBzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkKLXsKLQl1 bnNpZ25lZCBpbnQgc2hpZnQgPSBfX2dlbjhfcHRlX3NoaWZ0KHZtLT50b3ApOwotCXJldHVybiAo dm0tPnRvdGFsICsgKDF1bGwgPDwgc2hpZnQpIC0gMSkgPj4gc2hpZnQ7Ci19Ci0KLXN0YXRpYyBp bmxpbmUgc3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKgotZ2VuOF9wZHBfZm9yX3BhZ2VfaW5k ZXgoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqIGNvbnN0IHZtLCBjb25zdCB1NjQgaWR4KQot ewotCXN0cnVjdCBpOTE1X3BwZ3R0ICogY29uc3QgcHBndHQgPSBpOTE1X3ZtX3RvX3BwZ3R0KHZt KTsKLQotCWlmICh2bS0+dG9wID09IDIpCi0JCXJldHVybiBwcGd0dC0+cGQ7Ci0JZWxzZQotCQly ZXR1cm4gaTkxNV9wZF9lbnRyeShwcGd0dC0+cGQsIGdlbjhfcGRfaW5kZXgoaWR4LCB2bS0+dG9w KSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKgotZ2Vu OF9wZHBfZm9yX3BhZ2VfYWRkcmVzcyhzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICogY29uc3Qg dm0sIGNvbnN0IHU2NCBhZGRyKQotewotCXJldHVybiBnZW44X3BkcF9mb3JfcGFnZV9pbmRleCh2 bSwgYWRkciA+PiBHRU44X1BURV9TSElGVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZ2VuOF9wcGd0 dF9jbGVhbnVwKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAotCQkJCSBzdHJ1Y3QgaTkx NV9wYWdlX2RpcmVjdG9yeSAqcGQsCi0JCQkJIGludCBjb3VudCwgaW50IGx2bCkKLXsKLQlpZiAo bHZsKSB7Ci0JCXZvaWQgKipwZGUgPSBwZC0+ZW50cnk7Ci0KLQkJZG8gewotCQkJaWYgKCEqcGRl KQotCQkJCWNvbnRpbnVlOwotCi0JCQlfX2dlbjhfcHBndHRfY2xlYW51cCh2bSwgKnBkZSwgR0VO OF9QREVTLCBsdmwgLSAxKTsKLQkJfSB3aGlsZSAocGRlKyssIC0tY291bnQpOwotCX0KLQotCWZy ZWVfcHgodm0sIHBkKTsKLX0KLQotc3RhdGljIHZvaWQgZ2VuOF9wcGd0dF9jbGVhbnVwKHN0cnVj dCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKQotewotCXN0cnVjdCBpOTE1X3BwZ3R0ICpwcGd0dCA9 IGk5MTVfdm1fdG9fcHBndHQodm0pOwotCi0JaWYgKGludGVsX3ZncHVfYWN0aXZlKHZtLT5pOTE1 KSkKLQkJZ2VuOF9wcGd0dF9ub3RpZnlfdmd0KHBwZ3R0LCBmYWxzZSk7Ci0KLQlfX2dlbjhfcHBn dHRfY2xlYW51cCh2bSwgcHBndHQtPnBkLCBnZW44X3BkX3RvcF9jb3VudCh2bSksIHZtLT50b3Ap OwotCWZyZWVfc2NyYXRjaCh2bSk7Ci19Ci0KLXN0YXRpYyB1NjQgX19nZW44X3BwZ3R0X2NsZWFy KHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKiBjb25zdCB2bSwKLQkJCSAgICAgIHN0cnVjdCBp OTE1X3BhZ2VfZGlyZWN0b3J5ICogY29uc3QgcGQsCi0JCQkgICAgICB1NjQgc3RhcnQsIGNvbnN0 IHU2NCBlbmQsIGludCBsdmwpCi17Ci0JY29uc3Qgc3RydWN0IGk5MTVfcGFnZV9zY3JhdGNoICog Y29uc3Qgc2NyYXRjaCA9ICZ2bS0+c2NyYXRjaFtsdmxdOwotCXVuc2lnbmVkIGludCBpZHgsIGxl bjsKLQotCUdFTV9CVUdfT04oZW5kID4gdm0tPnRvdGFsID4+IEdFTjhfUFRFX1NISUZUKTsKLQot CWxlbiA9IGdlbjhfcGRfcmFuZ2Uoc3RhcnQsIGVuZCwgbHZsLS0sICZpZHgpOwotCURCRygiJXMo JXApOnsgbHZsOiVkLCBzdGFydDolbGx4LCBlbmQ6JWxseCwgaWR4OiVkLCBsZW46JWQsIHVzZWQ6 JWQgfVxuIiwKLQkgICAgX19mdW5jX18sIHZtLCBsdmwgKyAxLCBzdGFydCwgZW5kLAotCSAgICBp ZHgsIGxlbiwgYXRvbWljX3JlYWQocHhfdXNlZChwZCkpKTsKLQlHRU1fQlVHX09OKCFsZW4gfHwg bGVuID49IGF0b21pY19yZWFkKHB4X3VzZWQocGQpKSk7Ci0KLQlkbyB7Ci0JCXN0cnVjdCBpOTE1 X3BhZ2VfdGFibGUgKnB0ID0gcGQtPmVudHJ5W2lkeF07Ci0KLQkJaWYgKGF0b21pY19mZXRjaF9p bmMoJnB0LT51c2VkKSA+PiBnZW44X3BkX3NoaWZ0KDEpICYmCi0JCSAgICBnZW44X3BkX2NvbnRh aW5zKHN0YXJ0LCBlbmQsIGx2bCkpIHsKLQkJCURCRygiJXMoJXApOnsgbHZsOiVkLCBpZHg6JWQs IHN0YXJ0OiVsbHgsIGVuZDolbGx4IH0gcmVtb3ZpbmcgcGRcbiIsCi0JCQkgICAgX19mdW5jX18s IHZtLCBsdmwgKyAxLCBpZHgsIHN0YXJ0LCBlbmQpOwotCQkJY2xlYXJfcGRfZW50cnkocGQsIGlk eCwgc2NyYXRjaCk7Ci0JCQlfX2dlbjhfcHBndHRfY2xlYW51cCh2bSwgYXNfcGQocHQpLCBJOTE1 X1BERVMsIGx2bCk7Ci0JCQlzdGFydCArPSAodTY0KUk5MTVfUERFUyA8PCBnZW44X3BkX3NoaWZ0 KGx2bCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChsdmwpIHsKLQkJCXN0YXJ0ID0gX19n ZW44X3BwZ3R0X2NsZWFyKHZtLCBhc19wZChwdCksCi0JCQkJCQkgICBzdGFydCwgZW5kLCBsdmwp OwotCQl9IGVsc2UgewotCQkJdW5zaWduZWQgaW50IGNvdW50OwotCQkJdTY0ICp2YWRkcjsKLQot CQkJY291bnQgPSBnZW44X3B0X2NvdW50KHN0YXJ0LCBlbmQpOwotCQkJREJHKCIlcyglcCk6eyBs dmw6JWQsIHN0YXJ0OiVsbHgsIGVuZDolbGx4LCBpZHg6JWQsIGxlbjolZCwgdXNlZDolZCB9IHJl bW92aW5nIHB0ZVxuIiwKLQkJCSAgICBfX2Z1bmNfXywgdm0sIGx2bCwgc3RhcnQsIGVuZCwKLQkJ CSAgICBnZW44X3BkX2luZGV4KHN0YXJ0LCAwKSwgY291bnQsCi0JCQkgICAgYXRvbWljX3JlYWQo JnB0LT51c2VkKSk7Ci0JCQlHRU1fQlVHX09OKCFjb3VudCB8fCBjb3VudCA+PSBhdG9taWNfcmVh ZCgmcHQtPnVzZWQpKTsKLQotCQkJdmFkZHIgPSBrbWFwX2F0b21pY19weChwdCk7Ci0JCQltZW1z ZXQ2NCh2YWRkciArIGdlbjhfcGRfaW5kZXgoc3RhcnQsIDApLAotCQkJCSB2bS0+c2NyYXRjaFsw XS5lbmNvZGUsCi0JCQkJIGNvdW50KTsKLQkJCWt1bm1hcF9hdG9taWModmFkZHIpOwotCi0JCQlh dG9taWNfc3ViKGNvdW50LCAmcHQtPnVzZWQpOwotCQkJc3RhcnQgKz0gY291bnQ7Ci0JCX0KLQot CQlpZiAocmVsZWFzZV9wZF9lbnRyeShwZCwgaWR4LCBwdCwgc2NyYXRjaCkpCi0JCQlmcmVlX3B4 KHZtLCBwdCk7Ci0JfSB3aGlsZSAoaWR4KyssIC0tbGVuKTsKLQotCXJldHVybiBzdGFydDsKLX0K LQotc3RhdGljIHZvaWQgZ2VuOF9wcGd0dF9jbGVhcihzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNl ICp2bSwKLQkJCSAgICAgdTY0IHN0YXJ0LCB1NjQgbGVuZ3RoKQotewotCUdFTV9CVUdfT04oIUlT X0FMSUdORUQoc3RhcnQsIEJJVF9VTEwoR0VOOF9QVEVfU0hJRlQpKSk7Ci0JR0VNX0JVR19PTigh SVNfQUxJR05FRChsZW5ndGgsIEJJVF9VTEwoR0VOOF9QVEVfU0hJRlQpKSk7Ci0JR0VNX0JVR19P TihyYW5nZV9vdmVyZmxvd3Moc3RhcnQsIGxlbmd0aCwgdm0tPnRvdGFsKSk7Ci0KLQlzdGFydCA+ Pj0gR0VOOF9QVEVfU0hJRlQ7Ci0JbGVuZ3RoID4+PSBHRU44X1BURV9TSElGVDsKLQlHRU1fQlVH X09OKGxlbmd0aCA9PSAwKTsKLQotCV9fZ2VuOF9wcGd0dF9jbGVhcih2bSwgaTkxNV92bV90b19w cGd0dCh2bSktPnBkLAotCQkJICAgc3RhcnQsIHN0YXJ0ICsgbGVuZ3RoLCB2bS0+dG9wKTsKLX0K LQotc3RhdGljIGludCBfX2dlbjhfcHBndHRfYWxsb2Moc3RydWN0IGk5MTVfYWRkcmVzc19zcGFj ZSAqIGNvbnN0IHZtLAotCQkJICAgICAgc3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKiBjb25z dCBwZCwKLQkJCSAgICAgIHU2NCAqIGNvbnN0IHN0YXJ0LCBjb25zdCB1NjQgZW5kLCBpbnQgbHZs KQotewotCWNvbnN0IHN0cnVjdCBpOTE1X3BhZ2Vfc2NyYXRjaCAqIGNvbnN0IHNjcmF0Y2ggPSAm dm0tPnNjcmF0Y2hbbHZsXTsKLQlzdHJ1Y3QgaTkxNV9wYWdlX3RhYmxlICphbGxvYyA9IE5VTEw7 Ci0JdW5zaWduZWQgaW50IGlkeCwgbGVuOwotCWludCByZXQgPSAwOwotCi0JR0VNX0JVR19PTihl bmQgPiB2bS0+dG90YWwgPj4gR0VOOF9QVEVfU0hJRlQpOwotCi0JbGVuID0gZ2VuOF9wZF9yYW5n ZSgqc3RhcnQsIGVuZCwgbHZsLS0sICZpZHgpOwotCURCRygiJXMoJXApOnsgbHZsOiVkLCBzdGFy dDolbGx4LCBlbmQ6JWxseCwgaWR4OiVkLCBsZW46JWQsIHVzZWQ6JWQgfVxuIiwKLQkgICAgX19m dW5jX18sIHZtLCBsdmwgKyAxLCAqc3RhcnQsIGVuZCwKLQkgICAgaWR4LCBsZW4sIGF0b21pY19y ZWFkKHB4X3VzZWQocGQpKSk7Ci0JR0VNX0JVR19PTighbGVuIHx8IChpZHggKyBsZW4gLSAxKSA+ PiBnZW44X3BkX3NoaWZ0KDEpKTsKLQotCXNwaW5fbG9jaygmcGQtPmxvY2spOwotCUdFTV9CVUdf T04oIWF0b21pY19yZWFkKHB4X3VzZWQocGQpKSk7IC8qIE11c3QgYmUgcGlubmVkISAqLwotCWRv IHsKLQkJc3RydWN0IGk5MTVfcGFnZV90YWJsZSAqcHQgPSBwZC0+ZW50cnlbaWR4XTsKLQotCQlp ZiAoIXB0KSB7Ci0JCQlzcGluX3VubG9jaygmcGQtPmxvY2spOwotCi0JCQlEQkcoIiVzKCVwKTp7 IGx2bDolZCwgaWR4OiVkIH0gYWxsb2NhdGluZyBuZXcgdHJlZVxuIiwKLQkJCSAgICBfX2Z1bmNf Xywgdm0sIGx2bCArIDEsIGlkeCk7Ci0KLQkJCXB0ID0gZmV0Y2hfYW5kX3plcm8oJmFsbG9jKTsK LQkJCWlmIChsdmwpIHsKLQkJCQlpZiAoIXB0KSB7Ci0JCQkJCXB0ID0gJmFsbG9jX3BkKHZtKS0+ cHQ7Ci0JCQkJCWlmIChJU19FUlIocHQpKSB7Ci0JCQkJCQlyZXQgPSBQVFJfRVJSKHB0KTsKLQkJ CQkJCWdvdG8gb3V0OwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJZmlsbF9weChwdCwgdm0tPnNjcmF0 Y2hbbHZsXS5lbmNvZGUpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIXB0KSB7Ci0JCQkJCXB0ID0g YWxsb2NfcHQodm0pOwotCQkJCQlpZiAoSVNfRVJSKHB0KSkgewotCQkJCQkJcmV0ID0gUFRSX0VS UihwdCk7Ci0JCQkJCQlnb3RvIG91dDsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChpbnRlbF92 Z3B1X2FjdGl2ZSh2bS0+aTkxNSkgfHwKLQkJCQkgICAgZ2VuOF9wdF9jb3VudCgqc3RhcnQsIGVu ZCkgPCBJOTE1X1BERVMpCi0JCQkJCWZpbGxfcHgocHQsIHZtLT5zY3JhdGNoW2x2bF0uZW5jb2Rl KTsKLQkJCX0KLQotCQkJc3Bpbl9sb2NrKCZwZC0+bG9jayk7Ci0JCQlpZiAobGlrZWx5KCFwZC0+ ZW50cnlbaWR4XSkpCi0JCQkJc2V0X3BkX2VudHJ5KHBkLCBpZHgsIHB0KTsKLQkJCWVsc2UKLQkJ CQlhbGxvYyA9IHB0LCBwdCA9IHBkLT5lbnRyeVtpZHhdOwotCQl9Ci0KLQkJaWYgKGx2bCkgewot CQkJYXRvbWljX2luYygmcHQtPnVzZWQpOwotCQkJc3Bpbl91bmxvY2soJnBkLT5sb2NrKTsKLQot CQkJcmV0ID0gX19nZW44X3BwZ3R0X2FsbG9jKHZtLCBhc19wZChwdCksCi0JCQkJCQkgc3RhcnQs IGVuZCwgbHZsKTsKLQkJCWlmICh1bmxpa2VseShyZXQpKSB7Ci0JCQkJaWYgKHJlbGVhc2VfcGRf ZW50cnkocGQsIGlkeCwgcHQsIHNjcmF0Y2gpKQotCQkJCQlmcmVlX3B4KHZtLCBwdCk7Ci0JCQkJ Z290byBvdXQ7Ci0JCQl9Ci0KLQkJCXNwaW5fbG9jaygmcGQtPmxvY2spOwotCQkJYXRvbWljX2Rl YygmcHQtPnVzZWQpOwotCQkJR0VNX0JVR19PTighYXRvbWljX3JlYWQoJnB0LT51c2VkKSk7Ci0J CX0gZWxzZSB7Ci0JCQl1bnNpZ25lZCBpbnQgY291bnQgPSBnZW44X3B0X2NvdW50KCpzdGFydCwg ZW5kKTsKLQotCQkJREJHKCIlcyglcCk6eyBsdmw6JWQsIHN0YXJ0OiVsbHgsIGVuZDolbGx4LCBp ZHg6JWQsIGxlbjolZCwgdXNlZDolZCB9IGluc2VydGluZyBwdGVcbiIsCi0JCQkgICAgX19mdW5j X18sIHZtLCBsdmwsICpzdGFydCwgZW5kLAotCQkJICAgIGdlbjhfcGRfaW5kZXgoKnN0YXJ0LCAw KSwgY291bnQsCi0JCQkgICAgYXRvbWljX3JlYWQoJnB0LT51c2VkKSk7Ci0KLQkJCWF0b21pY19h ZGQoY291bnQsICZwdC0+dXNlZCk7Ci0JCQkvKiBBbGwgb3RoZXIgcGRlcyBtYXkgYmUgc2ltdWx0 YW5lb3VzbHkgcmVtb3ZlZCAqLwotCQkJR0VNX0JVR19PTihhdG9taWNfcmVhZCgmcHQtPnVzZWQp ID4gTkFMTE9DICogSTkxNV9QREVTKTsKLQkJCSpzdGFydCArPSBjb3VudDsKLQkJfQotCX0gd2hp bGUgKGlkeCsrLCAtLWxlbik7Ci0Jc3Bpbl91bmxvY2soJnBkLT5sb2NrKTsKLW91dDoKLQlpZiAo YWxsb2MpCi0JCWZyZWVfcHgodm0sIGFsbG9jKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMg aW50IGdlbjhfcHBndHRfYWxsb2Moc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCi0JCQkg ICAgdTY0IHN0YXJ0LCB1NjQgbGVuZ3RoKQotewotCXU2NCBmcm9tOwotCWludCBlcnI7Ci0KLQlH RU1fQlVHX09OKCFJU19BTElHTkVEKHN0YXJ0LCBCSVRfVUxMKEdFTjhfUFRFX1NISUZUKSkpOwot CUdFTV9CVUdfT04oIUlTX0FMSUdORUQobGVuZ3RoLCBCSVRfVUxMKEdFTjhfUFRFX1NISUZUKSkp OwotCUdFTV9CVUdfT04ocmFuZ2Vfb3ZlcmZsb3dzKHN0YXJ0LCBsZW5ndGgsIHZtLT50b3RhbCkp OwotCi0Jc3RhcnQgPj49IEdFTjhfUFRFX1NISUZUOwotCWxlbmd0aCA+Pj0gR0VOOF9QVEVfU0hJ RlQ7Ci0JR0VNX0JVR19PTihsZW5ndGggPT0gMCk7Ci0JZnJvbSA9IHN0YXJ0OwotCi0JZXJyID0g X19nZW44X3BwZ3R0X2FsbG9jKHZtLCBpOTE1X3ZtX3RvX3BwZ3R0KHZtKS0+cGQsCi0JCQkJICZz dGFydCwgc3RhcnQgKyBsZW5ndGgsIHZtLT50b3ApOwotCWlmICh1bmxpa2VseShlcnIgJiYgZnJv bSAhPSBzdGFydCkpCi0JCV9fZ2VuOF9wcGd0dF9jbGVhcih2bSwgaTkxNV92bV90b19wcGd0dCh2 bSktPnBkLAotCQkJCSAgIGZyb20sIHN0YXJ0LCB2bS0+dG9wKTsKLQotCXJldHVybiBlcnI7Ci19 Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNndF9kbWEgewotCXN0cnVjdCBzY2F0dGVybGlzdCAq c2c7Ci0JZG1hX2FkZHJfdCBkbWEsIG1heDsKLX0gc2d0X2RtYShzdHJ1Y3QgaTkxNV92bWEgKnZt YSkgewotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSB2bWEtPnBhZ2VzLT5zZ2w7Ci0JZG1hX2Fk ZHJfdCBhZGRyID0gc2dfZG1hX2FkZHJlc3Moc2cpOwotCXJldHVybiAoc3RydWN0IHNndF9kbWEp IHsgc2csIGFkZHIsIGFkZHIgKyBzZy0+bGVuZ3RoIH07Ci19Ci0KLXN0YXRpYyBfX2Fsd2F5c19p bmxpbmUgdTY0Ci1nZW44X3BwZ3R0X2luc2VydF9wdGUoc3RydWN0IGk5MTVfcHBndHQgKnBwZ3R0 LAotCQkgICAgICBzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqcGRwLAotCQkgICAgICBzdHJ1 Y3Qgc2d0X2RtYSAqaXRlciwKLQkJICAgICAgdTY0IGlkeCwKLQkJICAgICAgZW51bSBpOTE1X2Nh Y2hlX2xldmVsIGNhY2hlX2xldmVsLAotCQkgICAgICB1MzIgZmxhZ3MpCi17Ci0Jc3RydWN0IGk5 MTVfcGFnZV9kaXJlY3RvcnkgKnBkOwotCWNvbnN0IGdlbjhfcHRlX3QgcHRlX2VuY29kZSA9IGdl bjhfcHRlX2VuY29kZSgwLCBjYWNoZV9sZXZlbCwgZmxhZ3MpOwotCWdlbjhfcHRlX3QgKnZhZGRy OwotCi0JcGQgPSBpOTE1X3BkX2VudHJ5KHBkcCwgZ2VuOF9wZF9pbmRleChpZHgsIDIpKTsKLQl2 YWRkciA9IGttYXBfYXRvbWljX3B4KGk5MTVfcHRfZW50cnkocGQsIGdlbjhfcGRfaW5kZXgoaWR4 LCAxKSkpOwotCWRvIHsKLQkJdmFkZHJbZ2VuOF9wZF9pbmRleChpZHgsIDApXSA9IHB0ZV9lbmNv ZGUgfCBpdGVyLT5kbWE7Ci0KLQkJaXRlci0+ZG1hICs9IEk5MTVfR1RUX1BBR0VfU0laRTsKLQkJ aWYgKGl0ZXItPmRtYSA+PSBpdGVyLT5tYXgpIHsKLQkJCWl0ZXItPnNnID0gX19zZ19uZXh0KGl0 ZXItPnNnKTsKLQkJCWlmICghaXRlci0+c2cpIHsKLQkJCQlpZHggPSAwOwotCQkJCWJyZWFrOwot CQkJfQotCi0JCQlpdGVyLT5kbWEgPSBzZ19kbWFfYWRkcmVzcyhpdGVyLT5zZyk7Ci0JCQlpdGVy LT5tYXggPSBpdGVyLT5kbWEgKyBpdGVyLT5zZy0+bGVuZ3RoOwotCQl9Ci0KLQkJaWYgKGdlbjhf cGRfaW5kZXgoKytpZHgsIDApID09IDApIHsKLQkJCWlmIChnZW44X3BkX2luZGV4KGlkeCwgMSkg PT0gMCkgewotCQkJCS8qIExpbWl0ZWQgYnkgc2cgbGVuZ3RoIGZvciAzbHZsICovCi0JCQkJaWYg KGdlbjhfcGRfaW5kZXgoaWR4LCAyKSA9PSAwKQotCQkJCQlicmVhazsKLQotCQkJCXBkID0gcGRw LT5lbnRyeVtnZW44X3BkX2luZGV4KGlkeCwgMildOwotCQkJfQotCi0JCQlrdW5tYXBfYXRvbWlj KHZhZGRyKTsKLQkJCXZhZGRyID0ga21hcF9hdG9taWNfcHgoaTkxNV9wdF9lbnRyeShwZCwgZ2Vu OF9wZF9pbmRleChpZHgsIDEpKSk7Ci0JCX0KLQl9IHdoaWxlICgxKTsKLQlrdW5tYXBfYXRvbWlj KHZhZGRyKTsKLQotCXJldHVybiBpZHg7Ci19Ci0KLXN0YXRpYyB2b2lkIGdlbjhfcHBndHRfaW5z ZXJ0X2h1Z2Uoc3RydWN0IGk5MTVfdm1hICp2bWEsCi0JCQkJICAgc3RydWN0IHNndF9kbWEgKml0 ZXIsCi0JCQkJICAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGNhY2hlX2xldmVsLAotCQkJCSAgIHUz MiBmbGFncykKLXsKLQljb25zdCBnZW44X3B0ZV90IHB0ZV9lbmNvZGUgPSBnZW44X3B0ZV9lbmNv ZGUoMCwgY2FjaGVfbGV2ZWwsIGZsYWdzKTsKLQl1NjQgc3RhcnQgPSB2bWEtPm5vZGUuc3RhcnQ7 Ci0JZG1hX2FkZHJfdCByZW0gPSBpdGVyLT5zZy0+bGVuZ3RoOwotCi0JR0VNX0JVR19PTighaTkx NV92bV9pc180bHZsKHZtYS0+dm0pKTsKLQotCWRvIHsKLQkJc3RydWN0IGk5MTVfcGFnZV9kaXJl Y3RvcnkgKiBjb25zdCBwZHAgPQotCQkJZ2VuOF9wZHBfZm9yX3BhZ2VfYWRkcmVzcyh2bWEtPnZt LCBzdGFydCk7Ci0JCXN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICogY29uc3QgcGQgPQotCQkJ aTkxNV9wZF9lbnRyeShwZHAsIF9fZ2VuOF9wdGVfaW5kZXgoc3RhcnQsIDIpKTsKLQkJZ2VuOF9w dGVfdCBlbmNvZGUgPSBwdGVfZW5jb2RlOwotCQl1bnNpZ25lZCBpbnQgbWF5YmVfNjRLID0gLTE7 Ci0JCXVuc2lnbmVkIGludCBwYWdlX3NpemU7Ci0JCWdlbjhfcHRlX3QgKnZhZGRyOwotCQl1MTYg aW5kZXg7Ci0KLQkJaWYgKHZtYS0+cGFnZV9zaXplcy5zZyAmIEk5MTVfR1RUX1BBR0VfU0laRV8y TSAmJgotCQkgICAgSVNfQUxJR05FRChpdGVyLT5kbWEsIEk5MTVfR1RUX1BBR0VfU0laRV8yTSkg JiYKLQkJICAgIHJlbSA+PSBJOTE1X0dUVF9QQUdFX1NJWkVfMk0gJiYKLQkJICAgICFfX2dlbjhf cHRlX2luZGV4KHN0YXJ0LCAwKSkgewotCQkJaW5kZXggPSBfX2dlbjhfcHRlX2luZGV4KHN0YXJ0 LCAxKTsKLQkJCWVuY29kZSB8PSBHRU44X1BERV9QU18yTTsKLQkJCXBhZ2Vfc2l6ZSA9IEk5MTVf R1RUX1BBR0VfU0laRV8yTTsKLQotCQkJdmFkZHIgPSBrbWFwX2F0b21pY19weChwZCk7Ci0JCX0g ZWxzZSB7Ci0JCQlzdHJ1Y3QgaTkxNV9wYWdlX3RhYmxlICpwdCA9Ci0JCQkJaTkxNV9wdF9lbnRy eShwZCwgX19nZW44X3B0ZV9pbmRleChzdGFydCwgMSkpOwotCi0JCQlpbmRleCA9IF9fZ2VuOF9w dGVfaW5kZXgoc3RhcnQsIDApOwotCQkJcGFnZV9zaXplID0gSTkxNV9HVFRfUEFHRV9TSVpFOwot Ci0JCQlpZiAoIWluZGV4ICYmCi0JCQkgICAgdm1hLT5wYWdlX3NpemVzLnNnICYgSTkxNV9HVFRf UEFHRV9TSVpFXzY0SyAmJgotCQkJICAgIElTX0FMSUdORUQoaXRlci0+ZG1hLCBJOTE1X0dUVF9Q QUdFX1NJWkVfNjRLKSAmJgotCQkJICAgIChJU19BTElHTkVEKHJlbSwgSTkxNV9HVFRfUEFHRV9T SVpFXzY0SykgfHwKLQkJCSAgICAgcmVtID49IChJOTE1X1BERVMgLSBpbmRleCkgKiBJOTE1X0dU VF9QQUdFX1NJWkUpKQotCQkJCW1heWJlXzY0SyA9IF9fZ2VuOF9wdGVfaW5kZXgoc3RhcnQsIDEp OwotCi0JCQl2YWRkciA9IGttYXBfYXRvbWljX3B4KHB0KTsKLQkJfQotCi0JCWRvIHsKLQkJCUdF TV9CVUdfT04oaXRlci0+c2ctPmxlbmd0aCA8IHBhZ2Vfc2l6ZSk7Ci0JCQl2YWRkcltpbmRleCsr XSA9IGVuY29kZSB8IGl0ZXItPmRtYTsKLQotCQkJc3RhcnQgKz0gcGFnZV9zaXplOwotCQkJaXRl ci0+ZG1hICs9IHBhZ2Vfc2l6ZTsKLQkJCXJlbSAtPSBwYWdlX3NpemU7Ci0JCQlpZiAoaXRlci0+ ZG1hID49IGl0ZXItPm1heCkgewotCQkJCWl0ZXItPnNnID0gX19zZ19uZXh0KGl0ZXItPnNnKTsK LQkJCQlpZiAoIWl0ZXItPnNnKQotCQkJCQlicmVhazsKLQotCQkJCXJlbSA9IGl0ZXItPnNnLT5s ZW5ndGg7Ci0JCQkJaXRlci0+ZG1hID0gc2dfZG1hX2FkZHJlc3MoaXRlci0+c2cpOwotCQkJCWl0 ZXItPm1heCA9IGl0ZXItPmRtYSArIHJlbTsKLQotCQkJCWlmIChtYXliZV82NEsgIT0gLTEgJiYg aW5kZXggPCBJOTE1X1BERVMgJiYKLQkJCQkgICAgIShJU19BTElHTkVEKGl0ZXItPmRtYSwgSTkx NV9HVFRfUEFHRV9TSVpFXzY0SykgJiYKLQkJCQkgICAgICAoSVNfQUxJR05FRChyZW0sIEk5MTVf R1RUX1BBR0VfU0laRV82NEspIHx8Ci0JCQkJICAgICAgIHJlbSA+PSAoSTkxNV9QREVTIC0gaW5k ZXgpICogSTkxNV9HVFRfUEFHRV9TSVpFKSkpCi0JCQkJCW1heWJlXzY0SyA9IC0xOwotCi0JCQkJ aWYgKHVubGlrZWx5KCFJU19BTElHTkVEKGl0ZXItPmRtYSwgcGFnZV9zaXplKSkpCi0JCQkJCWJy ZWFrOwotCQkJfQotCQl9IHdoaWxlIChyZW0gPj0gcGFnZV9zaXplICYmIGluZGV4IDwgSTkxNV9Q REVTKTsKLQotCQlrdW5tYXBfYXRvbWljKHZhZGRyKTsKLQotCQkvKgotCQkgKiBJcyBpdCBzYWZl IHRvIG1hcmsgdGhlIDJNIGJsb2NrIGFzIDY0Sz8gLS0gRWl0aGVyIHdlIGhhdmUKLQkJICogZmls bGVkIHdob2xlIHBhZ2UtdGFibGUgd2l0aCA2NEsgZW50cmllcywgb3IgZmlsbGVkIHBhcnQgb2YK LQkJICogaXQgYW5kIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzZyB0YWJsZSBhbmQgd2Ug aGF2ZQotCQkgKiBlbm91Z2ggcGFkZGluZy4KLQkJICovCi0JCWlmIChtYXliZV82NEsgIT0gLTEg JiYKLQkJICAgIChpbmRleCA9PSBJOTE1X1BERVMgfHwKLQkJICAgICAoaTkxNV92bV9oYXNfc2Ny YXRjaF82NEsodm1hLT52bSkgJiYKLQkJICAgICAgIWl0ZXItPnNnICYmIElTX0FMSUdORUQodm1h LT5ub2RlLnN0YXJ0ICsKLQkJCQkJICAgICAgdm1hLT5ub2RlLnNpemUsCi0JCQkJCSAgICAgIEk5 MTVfR1RUX1BBR0VfU0laRV8yTSkpKSkgewotCQkJdmFkZHIgPSBrbWFwX2F0b21pY19weChwZCk7 Ci0JCQl2YWRkclttYXliZV82NEtdIHw9IEdFTjhfUERFX0lQU182NEs7Ci0JCQlrdW5tYXBfYXRv bWljKHZhZGRyKTsKLQkJCXBhZ2Vfc2l6ZSA9IEk5MTVfR1RUX1BBR0VfU0laRV82NEs7Ci0KLQkJ CS8qCi0JCQkgKiBXZSB3cml0ZSBhbGwgNEsgcGFnZSBlbnRyaWVzLCBldmVuIHdoZW4gdXNpbmcg NjRLCi0JCQkgKiBwYWdlcy4gSW4gb3JkZXIgdG8gdmVyaWZ5IHRoYXQgdGhlIEhXIGlzbid0IGNo ZWF0aW5nCi0JCQkgKiBieSB1c2luZyB0aGUgNEsgUFRFIGluc3RlYWQgb2YgdGhlIDY0SyBQVEUs IHdlIHdhbnQKLQkJCSAqIHRvIHJlbW92ZSBhbGwgdGhlIHN1cnBsdXMgZW50cmllcy4gSWYgdGhl IEhXIHNraXBwZWQKLQkJCSAqIHRoZSA2NEsgUFRFLCBpdCB3aWxsIHJlYWQvd3JpdGUgaW50byB0 aGUgc2NyYXRjaCBwYWdlCi0JCQkgKiBpbnN0ZWFkIC0gd2hpY2ggd2UgZGV0ZWN0IGFzIG1pc3Np bmcgcmVzdWx0cyBkdXJpbmcKLQkJCSAqIHNlbGZ0ZXN0cy4KLQkJCSAqLwotCQkJaWYgKEk5MTVf U0VMRlRFU1RfT05MWSh2bWEtPnZtLT5zY3J1Yl82NEspKSB7Ci0JCQkJdTE2IGk7Ci0KLQkJCQll bmNvZGUgPSB2bWEtPnZtLT5zY3JhdGNoWzBdLmVuY29kZTsKLQkJCQl2YWRkciA9IGttYXBfYXRv bWljX3B4KGk5MTVfcHRfZW50cnkocGQsIG1heWJlXzY0SykpOwotCi0JCQkJZm9yIChpID0gMTsg aSA8IGluZGV4OyBpICs9IDE2KQotCQkJCQltZW1zZXQ2NCh2YWRkciArIGksIGVuY29kZSwgMTUp OwotCi0JCQkJa3VubWFwX2F0b21pYyh2YWRkcik7Ci0JCQl9Ci0JCX0KLQotCQl2bWEtPnBhZ2Vf c2l6ZXMuZ3R0IHw9IHBhZ2Vfc2l6ZTsKLQl9IHdoaWxlIChpdGVyLT5zZyk7Ci19Ci0KLXN0YXRp YyB2b2lkIGdlbjhfcHBndHRfaW5zZXJ0KHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAot CQkJICAgICAgc3RydWN0IGk5MTVfdm1hICp2bWEsCi0JCQkgICAgICBlbnVtIGk5MTVfY2FjaGVf bGV2ZWwgY2FjaGVfbGV2ZWwsCi0JCQkgICAgICB1MzIgZmxhZ3MpCi17Ci0Jc3RydWN0IGk5MTVf cHBndHQgKiBjb25zdCBwcGd0dCA9IGk5MTVfdm1fdG9fcHBndHQodm0pOwotCXN0cnVjdCBzZ3Rf ZG1hIGl0ZXIgPSBzZ3RfZG1hKHZtYSk7Ci0KLQlpZiAodm1hLT5wYWdlX3NpemVzLnNnID4gSTkx NV9HVFRfUEFHRV9TSVpFKSB7Ci0JCWdlbjhfcHBndHRfaW5zZXJ0X2h1Z2Uodm1hLCAmaXRlciwg Y2FjaGVfbGV2ZWwsIGZsYWdzKTsKLQl9IGVsc2UgIHsKLQkJdTY0IGlkeCA9IHZtYS0+bm9kZS5z dGFydCA+PiBHRU44X1BURV9TSElGVDsKLQotCQlkbyB7Ci0JCQlzdHJ1Y3QgaTkxNV9wYWdlX2Rp cmVjdG9yeSAqIGNvbnN0IHBkcCA9Ci0JCQkJZ2VuOF9wZHBfZm9yX3BhZ2VfaW5kZXgodm0sIGlk eCk7Ci0KLQkJCWlkeCA9IGdlbjhfcHBndHRfaW5zZXJ0X3B0ZShwcGd0dCwgcGRwLCAmaXRlciwg aWR4LAotCQkJCQkJICAgIGNhY2hlX2xldmVsLCBmbGFncyk7Ci0JCX0gd2hpbGUgKGlkeCk7Ci0K LQkJdm1hLT5wYWdlX3NpemVzLmd0dCA9IEk5MTVfR1RUX1BBR0VfU0laRTsKLQl9Ci19Ci0KLXN0 YXRpYyBpbnQgZ2VuOF9pbml0X3NjcmF0Y2goc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0p Ci17Ci0JaW50IHJldDsKLQlpbnQgaTsKLQotCS8qCi0JICogSWYgZXZlcnlib2R5IGFncmVlcyB0 byBub3QgdG8gd3JpdGUgaW50byB0aGUgc2NyYXRjaCBwYWdlLAotCSAqIHdlIGNhbiByZXVzZSBp dCBmb3IgYWxsIHZtLCBrZWVwaW5nIGNvbnRleHRzIGFuZCBwcm9jZXNzZXMgc2VwYXJhdGUuCi0J ICovCi0JaWYgKHZtLT5oYXNfcmVhZF9vbmx5ICYmIHZtLT5ndC0+dm0gJiYgIWk5MTVfaXNfZ2d0 dCh2bS0+Z3QtPnZtKSkgewotCQlzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICpjbG9uZSA9IHZt LT5ndC0+dm07Ci0KLQkJR0VNX0JVR19PTighY2xvbmUtPmhhc19yZWFkX29ubHkpOwotCi0JCXZt LT5zY3JhdGNoX29yZGVyID0gY2xvbmUtPnNjcmF0Y2hfb3JkZXI7Ci0JCW1lbWNweSh2bS0+c2Ny YXRjaCwgY2xvbmUtPnNjcmF0Y2gsIHNpemVvZih2bS0+c2NyYXRjaCkpOwotCQlweF9kbWEoJnZt LT5zY3JhdGNoWzBdKSA9IDA7IC8qIG5vIHhmZXIgb2Ygb3duZXJzaGlwICovCi0JCXJldHVybiAw OwotCX0KLQotCXJldCA9IHNldHVwX3NjcmF0Y2hfcGFnZSh2bSwgX19HRlBfSElHSE1FTSk7Ci0J aWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXZtLT5zY3JhdGNoWzBdLmVuY29kZSA9Ci0JCWdl bjhfcHRlX2VuY29kZShweF9kbWEoJnZtLT5zY3JhdGNoWzBdKSwKLQkJCQlJOTE1X0NBQ0hFX0xM Qywgdm0tPmhhc19yZWFkX29ubHkpOwotCi0JZm9yIChpID0gMTsgaSA8PSB2bS0+dG9wOyBpKysp IHsKLQkJaWYgKHVubGlrZWx5KHNldHVwX3BhZ2VfZG1hKHZtLCBweF9iYXNlKCZ2bS0+c2NyYXRj aFtpXSkpKSkKLQkJCWdvdG8gZnJlZV9zY3JhdGNoOwotCi0JCWZpbGxfcHgoJnZtLT5zY3JhdGNo W2ldLCB2bS0+c2NyYXRjaFtpIC0gMV0uZW5jb2RlKTsKLQkJdm0tPnNjcmF0Y2hbaV0uZW5jb2Rl ID0KLQkJCWdlbjhfcGRlX2VuY29kZShweF9kbWEoJnZtLT5zY3JhdGNoW2ldKSwKLQkJCQkJSTkx NV9DQUNIRV9MTEMpOwotCX0KLQotCXJldHVybiAwOwotCi1mcmVlX3NjcmF0Y2g6Ci0JZnJlZV9z Y3JhdGNoKHZtKTsKLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotc3RhdGljIGludCBnZW44X3ByZWFs bG9jYXRlX3RvcF9sZXZlbF9wZHAoc3RydWN0IGk5MTVfcHBndHQgKnBwZ3R0KQotewotCXN0cnVj dCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtID0gJnBwZ3R0LT52bTsKLQlzdHJ1Y3QgaTkxNV9wYWdl X2RpcmVjdG9yeSAqcGQgPSBwcGd0dC0+cGQ7Ci0JdW5zaWduZWQgaW50IGlkeDsKLQotCUdFTV9C VUdfT04odm0tPnRvcCAhPSAyKTsKLQlHRU1fQlVHX09OKGdlbjhfcGRfdG9wX2NvdW50KHZtKSAh PSBHRU44XzNMVkxfUERQRVMpOwotCi0JZm9yIChpZHggPSAwOyBpZHggPCBHRU44XzNMVkxfUERQ RVM7IGlkeCsrKSB7Ci0JCXN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICpwZGU7Ci0KLQkJcGRl ID0gYWxsb2NfcGQodm0pOwotCQlpZiAoSVNfRVJSKHBkZSkpCi0JCQlyZXR1cm4gUFRSX0VSUihw ZGUpOwotCi0JCWZpbGxfcHgocGRlLCB2bS0+c2NyYXRjaFsxXS5lbmNvZGUpOwotCQlzZXRfcGRf ZW50cnkocGQsIGlkeCwgcGRlKTsKLQkJYXRvbWljX2luYyhweF91c2VkKHBkZSkpOyAvKiBrZWVw IHBpbm5lZCAqLwotCX0KLQl3bWIoKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBw cGd0dF9pbml0KHN0cnVjdCBpOTE1X3BwZ3R0ICpwcGd0dCwgc3RydWN0IGludGVsX2d0ICpndCkK LXsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGd0LT5pOTE1OwotCi0JcHBndHQt PnZtLmd0ID0gZ3Q7Ci0JcHBndHQtPnZtLmk5MTUgPSBpOTE1OwotCXBwZ3R0LT52bS5kbWEgPSAm aTkxNS0+ZHJtLnBkZXYtPmRldjsKLQlwcGd0dC0+dm0udG90YWwgPSBCSVRfVUxMKElOVEVMX0lO Rk8oaTkxNSktPnBwZ3R0X3NpemUpOwotCi0JaTkxNV9hZGRyZXNzX3NwYWNlX2luaXQoJnBwZ3R0 LT52bSwgVk1fQ0xBU1NfUFBHVFQpOwotCi0JcHBndHQtPnZtLnZtYV9vcHMuYmluZF92bWEgICAg PSBwcGd0dF9iaW5kX3ZtYTsKLQlwcGd0dC0+dm0udm1hX29wcy51bmJpbmRfdm1hICA9IHBwZ3R0 X3VuYmluZF92bWE7Ci0JcHBndHQtPnZtLnZtYV9vcHMuc2V0X3BhZ2VzICAgPSBwcGd0dF9zZXRf cGFnZXM7Ci0JcHBndHQtPnZtLnZtYV9vcHMuY2xlYXJfcGFnZXMgPSBjbGVhcl9wYWdlczsKLX0K LQotc3RhdGljIHN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICoKLWdlbjhfYWxsb2NfdG9wX3Bk KHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKQotewotCWNvbnN0IHVuc2lnbmVkIGludCBj b3VudCA9IGdlbjhfcGRfdG9wX2NvdW50KHZtKTsKLQlzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9y eSAqcGQ7Ci0KLQlHRU1fQlVHX09OKGNvdW50ID4gQVJSQVlfU0laRShwZC0+ZW50cnkpKTsKLQot CXBkID0gX19hbGxvY19wZChvZmZzZXRvZih0eXBlb2YoKnBkKSwgZW50cnlbY291bnRdKSk7Ci0J aWYgKHVubGlrZWx5KCFwZCkpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCi0JaWYgKHVu bGlrZWx5KHNldHVwX3BhZ2VfZG1hKHZtLCBweF9iYXNlKHBkKSkpKSB7Ci0JCWtmcmVlKHBkKTsK LQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JfQotCi0JZmlsbF9wYWdlX2RtYShweF9iYXNl KHBkKSwgdm0tPnNjcmF0Y2hbdm0tPnRvcF0uZW5jb2RlLCBjb3VudCk7Ci0JYXRvbWljX2luYyhw eF91c2VkKHBkKSk7IC8qIG1hcmsgYXMgcGlubmVkICovCi0JcmV0dXJuIHBkOwotfQotCi0vKgot ICogR0VOOCBsZWdhY3kgcHBndHQgcHJvZ3JhbW1pbmcgaXMgYWNjb21wbGlzaGVkIHRocm91Z2gg YSBtYXggNCBQRFAgcmVnaXN0ZXJzCi0gKiB3aXRoIGEgbmV0IGVmZmVjdCByZXNlbWJsaW5nIGEg Mi1sZXZlbCBwYWdlIHRhYmxlIGluIG5vcm1hbCB4ODYgdGVybXMuIEVhY2gKLSAqIFBEUCByZXBy ZXNlbnRzIDFHQiBvZiBtZW1vcnkgNCAqIDUxMiAqIDUxMiAqIDQwOTYgPSA0R0IgbGVnYWN5IDMy YiBhZGRyZXNzCi0gKiBzcGFjZS4KLSAqCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgaTkxNV9wcGd0dCAq Z2VuOF9wcGd0dF9jcmVhdGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUpCi17Ci0Jc3Ry dWN0IGk5MTVfcHBndHQgKnBwZ3R0OwotCWludCBlcnI7Ci0KLQlwcGd0dCA9IGt6YWxsb2Moc2l6 ZW9mKCpwcGd0dCksIEdGUF9LRVJORUwpOwotCWlmICghcHBndHQpCi0JCXJldHVybiBFUlJfUFRS KC1FTk9NRU0pOwotCi0JcHBndHRfaW5pdChwcGd0dCwgJmk5MTUtPmd0KTsKLQlwcGd0dC0+dm0u dG9wID0gaTkxNV92bV9pc180bHZsKCZwcGd0dC0+dm0pID8gMyA6IDI7Ci0KLQkvKgotCSAqIEZy b20gYmR3LCB0aGVyZSBpcyBodyBzdXBwb3J0IGZvciByZWFkLW9ubHkgcGFnZXMgaW4gdGhlIFBQ R1RULgotCSAqCi0JICogR2VuMTEgaGFzIEhTREVTIzoxODA3MTM2MTg3IHVucmVzb2x2ZWQuIERp c2FibGUgcm8gc3VwcG9ydAotCSAqIGZvciBub3cuCi0JICoKLQkgKiBHZW4xMiBoYXMgaW5oZXJp dGVkIHRoZSBzYW1lIHJlYWQtb25seSBmYXVsdCBpc3N1ZSBmcm9tIGdlbjExLgotCSAqLwotCXBw Z3R0LT52bS5oYXNfcmVhZF9vbmx5ID0gIUlTX0dFTl9SQU5HRShpOTE1LCAxMSwgMTIpOwotCi0J LyogVGhlcmUgYXJlIG9ubHkgZmV3IGV4Y2VwdGlvbnMgZm9yIGdlbiA+PTYuIGNodiBhbmQgYnh0 LgotCSAqIEFuZCB3ZSBhcmUgbm90IHN1cmUgYWJvdXQgdGhlIGxhdHRlciBzbyBwbGF5IHNhZmUg Zm9yIG5vdy4KLQkgKi8KLQlpZiAoSVNfQ0hFUlJZVklFVyhpOTE1KSB8fCBJU19CUk9YVE9OKGk5 MTUpKQotCQlwcGd0dC0+dm0ucHRfa21hcF93YyA9IHRydWU7Ci0KLQllcnIgPSBnZW44X2luaXRf c2NyYXRjaCgmcHBndHQtPnZtKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9mcmVlOwotCi0JcHBn dHQtPnBkID0gZ2VuOF9hbGxvY190b3BfcGQoJnBwZ3R0LT52bSk7Ci0JaWYgKElTX0VSUihwcGd0 dC0+cGQpKSB7Ci0JCWVyciA9IFBUUl9FUlIocHBndHQtPnBkKTsKLQkJZ290byBlcnJfZnJlZV9z Y3JhdGNoOwotCX0KLQotCWlmICghaTkxNV92bV9pc180bHZsKCZwcGd0dC0+dm0pKSB7Ci0JCWVy ciA9IGdlbjhfcHJlYWxsb2NhdGVfdG9wX2xldmVsX3BkcChwcGd0dCk7Ci0JCWlmIChlcnIpCi0J CQlnb3RvIGVycl9mcmVlX3BkOwotCX0KLQotCXBwZ3R0LT52bS5iaW5kX2FzeW5jX2ZsYWdzID0g STkxNV9WTUFfTE9DQUxfQklORDsKLQlwcGd0dC0+dm0uaW5zZXJ0X2VudHJpZXMgPSBnZW44X3Bw Z3R0X2luc2VydDsKLQlwcGd0dC0+dm0uYWxsb2NhdGVfdmFfcmFuZ2UgPSBnZW44X3BwZ3R0X2Fs bG9jOwotCXBwZ3R0LT52bS5jbGVhcl9yYW5nZSA9IGdlbjhfcHBndHRfY2xlYXI7Ci0KLQlpZiAo aW50ZWxfdmdwdV9hY3RpdmUoaTkxNSkpCi0JCWdlbjhfcHBndHRfbm90aWZ5X3ZndChwcGd0dCwg dHJ1ZSk7Ci0KLQlwcGd0dC0+dm0uY2xlYW51cCA9IGdlbjhfcHBndHRfY2xlYW51cDsKLQotCXJl dHVybiBwcGd0dDsKLQotZXJyX2ZyZWVfcGQ6Ci0JX19nZW44X3BwZ3R0X2NsZWFudXAoJnBwZ3R0 LT52bSwgcHBndHQtPnBkLAotCQkJICAgICBnZW44X3BkX3RvcF9jb3VudCgmcHBndHQtPnZtKSwg cHBndHQtPnZtLnRvcCk7Ci1lcnJfZnJlZV9zY3JhdGNoOgotCWZyZWVfc2NyYXRjaCgmcHBndHQt PnZtKTsKLWVycl9mcmVlOgotCWtmcmVlKHBwZ3R0KTsKLQlyZXR1cm4gRVJSX1BUUihlcnIpOwot fQotCi0vKiBXcml0ZSBwZGUgKGluZGV4KSBmcm9tIHRoZSBwYWdlIGRpcmVjdG9yeSBAcGQgdG8g dGhlIHBhZ2UgdGFibGUgQHB0ICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZ2VuNl93cml0ZV9wZGUo Y29uc3Qgc3RydWN0IGdlbjZfcHBndHQgKnBwZ3R0LAotCQkJCSAgY29uc3QgdW5zaWduZWQgaW50 IHBkZSwKLQkJCQkgIGNvbnN0IHN0cnVjdCBpOTE1X3BhZ2VfdGFibGUgKnB0KQotewotCS8qIENh bGxlciBuZWVkcyB0byBtYWtlIHN1cmUgdGhlIHdyaXRlIGNvbXBsZXRlcyBpZiBuZWNlc3Nhcnkg Ki8KLQlpb3dyaXRlMzIoR0VONl9QREVfQUREUl9FTkNPREUocHhfZG1hKHB0KSkgfCBHRU42X1BE RV9WQUxJRCwKLQkJICBwcGd0dC0+cGRfYWRkciArIHBkZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGdl bjdfcHBndHRfZW5hYmxlKHN0cnVjdCBpbnRlbF9ndCAqZ3QpCi17Ci0Jc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUgKmk5MTUgPSBndC0+aTkxNTsKLQlzdHJ1Y3QgaW50ZWxfdW5jb3JlICp1bmNvcmUg PSBndC0+dW5jb3JlOwotCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZTsKLQllbnVtIGlu dGVsX2VuZ2luZV9pZCBpZDsKLQl1MzIgZWNvY2hrOwotCi0JaW50ZWxfdW5jb3JlX3Jtdyh1bmNv cmUsIEdBQ19FQ09fQklUUywgMCwgRUNPQklUU19QUEdUVF9DQUNIRTY0Qik7Ci0KLQllY29jaGsg PSBpbnRlbF91bmNvcmVfcmVhZCh1bmNvcmUsIEdBTV9FQ09DSEspOwotCWlmIChJU19IQVNXRUxM KGk5MTUpKSB7Ci0JCWVjb2NoayB8PSBFQ09DSEtfUFBHVFRfV0JfSFNXOwotCX0gZWxzZSB7Ci0J CWVjb2NoayB8PSBFQ09DSEtfUFBHVFRfTExDX0lWQjsKLQkJZWNvY2hrICY9IH5FQ09DSEtfUFBH VFRfR0ZEVF9JVkI7Ci0JfQotCWludGVsX3VuY29yZV93cml0ZSh1bmNvcmUsIEdBTV9FQ09DSEss IGVjb2Noayk7Ci0KLQlmb3JfZWFjaF9lbmdpbmUoZW5naW5lLCBndCwgaWQpIHsKLQkJLyogR0ZY X01PREUgaXMgcGVyLXJpbmcgb24gZ2VuNysgKi8KLQkJRU5HSU5FX1dSSVRFKGVuZ2luZSwKLQkJ CSAgICAgUklOR19NT0RFX0dFTjcsCi0JCQkgICAgIF9NQVNLRURfQklUX0VOQUJMRShHRlhfUFBH VFRfRU5BQkxFKSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBnZW42X3BwZ3R0X2VuYWJsZShzdHJ1 Y3QgaW50ZWxfZ3QgKmd0KQotewotCXN0cnVjdCBpbnRlbF91bmNvcmUgKnVuY29yZSA9IGd0LT51 bmNvcmU7Ci0KLQlpbnRlbF91bmNvcmVfcm13KHVuY29yZSwKLQkJCSBHQUNfRUNPX0JJVFMsCi0J CQkgMCwKLQkJCSBFQ09CSVRTX1NOQl9CSVQgfCBFQ09CSVRTX1BQR1RUX0NBQ0hFNjRCKTsKLQot CWludGVsX3VuY29yZV9ybXcodW5jb3JlLAotCQkJIEdBQl9DVEwsCi0JCQkgMCwKLQkJCSBHQUJf Q1RMX0NPTlRfQUZURVJfUEFHRUZBVUxUKTsKLQotCWludGVsX3VuY29yZV9ybXcodW5jb3JlLAot CQkJIEdBTV9FQ09DSEssCi0JCQkgMCwKLQkJCSBFQ09DSEtfU05CX0JJVCB8IEVDT0NIS19QUEdU VF9DQUNIRTY0Qik7Ci0KLQlpZiAoSEFTX1BQR1RUKHVuY29yZS0+aTkxNSkpIC8qIG1heSBiZSBk aXNhYmxlZCBmb3IgVlQtZCAqLwotCQlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLAotCQkJCSAg IEdGWF9NT0RFLAotCQkJCSAgIF9NQVNLRURfQklUX0VOQUJMRShHRlhfUFBHVFRfRU5BQkxFKSk7 Ci19Ci0KLS8qIFBQR1RUIHN1cHBvcnQgZm9yIFNhbmR5YmRyaWdlL0dlbjYgYW5kIGxhdGVyICov Ci1zdGF0aWMgdm9pZCBnZW42X3BwZ3R0X2NsZWFyX3JhbmdlKHN0cnVjdCBpOTE1X2FkZHJlc3Nf c3BhY2UgKnZtLAotCQkJCSAgIHU2NCBzdGFydCwgdTY0IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgZ2Vu Nl9wcGd0dCAqIGNvbnN0IHBwZ3R0ID0gdG9fZ2VuNl9wcGd0dChpOTE1X3ZtX3RvX3BwZ3R0KHZt KSk7Ci0JY29uc3QgdW5zaWduZWQgaW50IGZpcnN0X2VudHJ5ID0gc3RhcnQgLyBJOTE1X0dUVF9Q QUdFX1NJWkU7Ci0JY29uc3QgZ2VuNl9wdGVfdCBzY3JhdGNoX3B0ZSA9IHZtLT5zY3JhdGNoWzBd LmVuY29kZTsKLQl1bnNpZ25lZCBpbnQgcGRlID0gZmlyc3RfZW50cnkgLyBHRU42X1BURVM7Ci0J dW5zaWduZWQgaW50IHB0ZSA9IGZpcnN0X2VudHJ5ICUgR0VONl9QVEVTOwotCXVuc2lnbmVkIGlu dCBudW1fZW50cmllcyA9IGxlbmd0aCAvIEk5MTVfR1RUX1BBR0VfU0laRTsKLQotCXdoaWxlIChu dW1fZW50cmllcykgewotCQlzdHJ1Y3QgaTkxNV9wYWdlX3RhYmxlICogY29uc3QgcHQgPQotCQkJ aTkxNV9wdF9lbnRyeShwcGd0dC0+YmFzZS5wZCwgcGRlKyspOwotCQljb25zdCB1bnNpZ25lZCBp bnQgY291bnQgPSBtaW4obnVtX2VudHJpZXMsIEdFTjZfUFRFUyAtIHB0ZSk7Ci0JCWdlbjZfcHRl X3QgKnZhZGRyOwotCi0JCUdFTV9CVUdfT04ocHhfYmFzZShwdCkgPT0gcHhfYmFzZSgmdm0tPnNj cmF0Y2hbMV0pKTsKLQotCQludW1fZW50cmllcyAtPSBjb3VudDsKLQotCQlHRU1fQlVHX09OKGNv dW50ID4gYXRvbWljX3JlYWQoJnB0LT51c2VkKSk7Ci0JCWlmICghYXRvbWljX3N1Yl9yZXR1cm4o Y291bnQsICZwdC0+dXNlZCkpCi0JCQlwcGd0dC0+c2Nhbl9mb3JfdW51c2VkX3B0ID0gdHJ1ZTsK LQotCQkvKgotCQkgKiBOb3RlIHRoYXQgdGhlIGh3IGRvZXNuJ3Qgc3VwcG9ydCByZW1vdmluZyBQ REUgb24gdGhlIGZseQotCQkgKiAodGhleSBhcmUgY2FjaGVkIGluc2lkZSB0aGUgY29udGV4dCB3 aXRoIG5vIG1lYW5zIHRvCi0JCSAqIGludmFsaWRhdGUgdGhlIGNhY2hlKSwgc28gd2UgY2FuIG9u bHkgcmVzZXQgdGhlIFBURQotCQkgKiBlbnRyaWVzIGJhY2sgdG8gc2NyYXRjaC4KLQkJICovCi0K LQkJdmFkZHIgPSBrbWFwX2F0b21pY19weChwdCk7Ci0JCW1lbXNldDMyKHZhZGRyICsgcHRlLCBz Y3JhdGNoX3B0ZSwgY291bnQpOwotCQlrdW5tYXBfYXRvbWljKHZhZGRyKTsKLQotCQlwdGUgPSAw OwotCX0KLX0KLQotc3RhdGljIHZvaWQgZ2VuNl9wcGd0dF9pbnNlcnRfZW50cmllcyhzdHJ1Y3Qg aTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKLQkJCQkgICAgICBzdHJ1Y3QgaTkxNV92bWEgKnZtYSwK LQkJCQkgICAgICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgY2FjaGVfbGV2ZWwsCi0JCQkJICAgICAg dTMyIGZsYWdzKQotewotCXN0cnVjdCBpOTE1X3BwZ3R0ICpwcGd0dCA9IGk5MTVfdm1fdG9fcHBn dHQodm0pOwotCXN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICogY29uc3QgcGQgPSBwcGd0dC0+ cGQ7Ci0JdW5zaWduZWQgZmlyc3RfZW50cnkgPSB2bWEtPm5vZGUuc3RhcnQgLyBJOTE1X0dUVF9Q QUdFX1NJWkU7Ci0JdW5zaWduZWQgYWN0X3B0ID0gZmlyc3RfZW50cnkgLyBHRU42X1BURVM7Ci0J dW5zaWduZWQgYWN0X3B0ZSA9IGZpcnN0X2VudHJ5ICUgR0VONl9QVEVTOwotCWNvbnN0IHUzMiBw dGVfZW5jb2RlID0gdm0tPnB0ZV9lbmNvZGUoMCwgY2FjaGVfbGV2ZWwsIGZsYWdzKTsKLQlzdHJ1 Y3Qgc2d0X2RtYSBpdGVyID0gc2d0X2RtYSh2bWEpOwotCWdlbjZfcHRlX3QgKnZhZGRyOwotCi0J R0VNX0JVR19PTihwZC0+ZW50cnlbYWN0X3B0XSA9PSAmdm0tPnNjcmF0Y2hbMV0pOwotCi0JdmFk ZHIgPSBrbWFwX2F0b21pY19weChpOTE1X3B0X2VudHJ5KHBkLCBhY3RfcHQpKTsKLQlkbyB7Ci0J CXZhZGRyW2FjdF9wdGVdID0gcHRlX2VuY29kZSB8IEdFTjZfUFRFX0FERFJfRU5DT0RFKGl0ZXIu ZG1hKTsKLQotCQlpdGVyLmRtYSArPSBJOTE1X0dUVF9QQUdFX1NJWkU7Ci0JCWlmIChpdGVyLmRt YSA9PSBpdGVyLm1heCkgewotCQkJaXRlci5zZyA9IF9fc2dfbmV4dChpdGVyLnNnKTsKLQkJCWlm ICghaXRlci5zZykKLQkJCQlicmVhazsKLQotCQkJaXRlci5kbWEgPSBzZ19kbWFfYWRkcmVzcyhp dGVyLnNnKTsKLQkJCWl0ZXIubWF4ID0gaXRlci5kbWEgKyBpdGVyLnNnLT5sZW5ndGg7Ci0JCX0K LQotCQlpZiAoKythY3RfcHRlID09IEdFTjZfUFRFUykgewotCQkJa3VubWFwX2F0b21pYyh2YWRk cik7Ci0JCQl2YWRkciA9IGttYXBfYXRvbWljX3B4KGk5MTVfcHRfZW50cnkocGQsICsrYWN0X3B0 KSk7Ci0JCQlhY3RfcHRlID0gMDsKLQkJfQotCX0gd2hpbGUgKDEpOwotCWt1bm1hcF9hdG9taWMo dmFkZHIpOwotCi0Jdm1hLT5wYWdlX3NpemVzLmd0dCA9IEk5MTVfR1RUX1BBR0VfU0laRTsKLX0K LQotc3RhdGljIHZvaWQgZ2VuNl9mbHVzaF9wZChzdHJ1Y3QgZ2VuNl9wcGd0dCAqcHBndHQsIHU2 NCBzdGFydCwgdTY0IGVuZCkKLXsKLQlzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqIGNvbnN0 IHBkID0gcHBndHQtPmJhc2UucGQ7Ci0Jc3RydWN0IGk5MTVfcGFnZV90YWJsZSAqcHQ7Ci0JdW5z aWduZWQgaW50IHBkZTsKLQotCXN0YXJ0ID0gcm91bmRfZG93bihzdGFydCwgU1pfNjRLKTsKLQll bmQgPSByb3VuZF91cChlbmQsIFNaXzY0SykgLSBzdGFydDsKLQotCW11dGV4X2xvY2soJnBwZ3R0 LT5mbHVzaCk7Ci0KLQlnZW42X2Zvcl9lYWNoX3BkZShwdCwgcGQsIHN0YXJ0LCBlbmQsIHBkZSkK LQkJZ2VuNl93cml0ZV9wZGUocHBndHQsIHBkZSwgcHQpOwotCi0JbWIoKTsKLQlpb3JlYWQzMihw cGd0dC0+cGRfYWRkciArIHBkZSAtIDEpOwotCWdlbjZfZ2d0dF9pbnZhbGlkYXRlKHBwZ3R0LT5i YXNlLnZtLmd0LT5nZ3R0KTsKLQltYigpOwotCi0JbXV0ZXhfdW5sb2NrKCZwcGd0dC0+Zmx1c2gp OwotfQotCi1zdGF0aWMgaW50IGdlbjZfYWxsb2NfdmFfcmFuZ2Uoc3RydWN0IGk5MTVfYWRkcmVz c19zcGFjZSAqdm0sCi0JCQkgICAgICAgdTY0IHN0YXJ0LCB1NjQgbGVuZ3RoKQotewotCXN0cnVj dCBnZW42X3BwZ3R0ICpwcGd0dCA9IHRvX2dlbjZfcHBndHQoaTkxNV92bV90b19wcGd0dCh2bSkp OwotCXN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICogY29uc3QgcGQgPSBwcGd0dC0+YmFzZS5w ZDsKLQlzdHJ1Y3QgaTkxNV9wYWdlX3RhYmxlICpwdCwgKmFsbG9jID0gTlVMTDsKLQlpbnRlbF93 YWtlcmVmX3Qgd2FrZXJlZjsKLQl1NjQgZnJvbSA9IHN0YXJ0OwotCXVuc2lnbmVkIGludCBwZGU7 Ci0JaW50IHJldCA9IDA7Ci0KLQl3YWtlcmVmID0gaW50ZWxfcnVudGltZV9wbV9nZXQoJnZtLT5p OTE1LT5ydW50aW1lX3BtKTsKLQotCXNwaW5fbG9jaygmcGQtPmxvY2spOwotCWdlbjZfZm9yX2Vh Y2hfcGRlKHB0LCBwZCwgc3RhcnQsIGxlbmd0aCwgcGRlKSB7Ci0JCWNvbnN0IHVuc2lnbmVkIGlu dCBjb3VudCA9IGdlbjZfcHRlX2NvdW50KHN0YXJ0LCBsZW5ndGgpOwotCi0JCWlmIChweF9iYXNl KHB0KSA9PSBweF9iYXNlKCZ2bS0+c2NyYXRjaFsxXSkpIHsKLQkJCXNwaW5fdW5sb2NrKCZwZC0+ bG9jayk7Ci0KLQkJCXB0ID0gZmV0Y2hfYW5kX3plcm8oJmFsbG9jKTsKLQkJCWlmICghcHQpCi0J CQkJcHQgPSBhbGxvY19wdCh2bSk7Ci0JCQlpZiAoSVNfRVJSKHB0KSkgewotCQkJCXJldCA9IFBU Ul9FUlIocHQpOwotCQkJCWdvdG8gdW53aW5kX291dDsKLQkJCX0KLQotCQkJZmlsbDMyX3B4KHB0 LCB2bS0+c2NyYXRjaFswXS5lbmNvZGUpOwotCi0JCQlzcGluX2xvY2soJnBkLT5sb2NrKTsKLQkJ CWlmIChwZC0+ZW50cnlbcGRlXSA9PSAmdm0tPnNjcmF0Y2hbMV0pIHsKLQkJCQlwZC0+ZW50cnlb cGRlXSA9IHB0OwotCQkJfSBlbHNlIHsKLQkJCQlhbGxvYyA9IHB0OwotCQkJCXB0ID0gcGQtPmVu dHJ5W3BkZV07Ci0JCQl9Ci0JCX0KLQotCQlhdG9taWNfYWRkKGNvdW50LCAmcHQtPnVzZWQpOwot CX0KLQlzcGluX3VubG9jaygmcGQtPmxvY2spOwotCi0JaWYgKGk5MTVfdm1hX2lzX2JvdW5kKHBw Z3R0LT52bWEsIEk5MTVfVk1BX0dMT0JBTF9CSU5EKSkKLQkJZ2VuNl9mbHVzaF9wZChwcGd0dCwg ZnJvbSwgc3RhcnQpOwotCi0JZ290byBvdXQ7Ci0KLXVud2luZF9vdXQ6Ci0JZ2VuNl9wcGd0dF9j bGVhcl9yYW5nZSh2bSwgZnJvbSwgc3RhcnQgLSBmcm9tKTsKLW91dDoKLQlpZiAoYWxsb2MpCi0J CWZyZWVfcHgodm0sIGFsbG9jKTsKLQlpbnRlbF9ydW50aW1lX3BtX3B1dCgmdm0tPmk5MTUtPnJ1 bnRpbWVfcG0sIHdha2VyZWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgZ2VuNl9w cGd0dF9pbml0X3NjcmF0Y2goc3RydWN0IGdlbjZfcHBndHQgKnBwZ3R0KQotewotCXN0cnVjdCBp OTE1X2FkZHJlc3Nfc3BhY2UgKiBjb25zdCB2bSA9ICZwcGd0dC0+YmFzZS52bTsKLQlzdHJ1Y3Qg aTkxNV9wYWdlX2RpcmVjdG9yeSAqIGNvbnN0IHBkID0gcHBndHQtPmJhc2UucGQ7Ci0JaW50IHJl dDsKLQotCXJldCA9IHNldHVwX3NjcmF0Y2hfcGFnZSh2bSwgX19HRlBfSElHSE1FTSk7Ci0JaWYg KHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXZtLT5zY3JhdGNoWzBdLmVuY29kZSA9Ci0JCXZtLT5w dGVfZW5jb2RlKHB4X2RtYSgmdm0tPnNjcmF0Y2hbMF0pLAotCQkJICAgICAgIEk5MTVfQ0FDSEVf Tk9ORSwgUFRFX1JFQURfT05MWSk7Ci0KLQlpZiAodW5saWtlbHkoc2V0dXBfcGFnZV9kbWEodm0s IHB4X2Jhc2UoJnZtLT5zY3JhdGNoWzFdKSkpKSB7Ci0JCWNsZWFudXBfc2NyYXRjaF9wYWdlKHZt KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZmlsbDMyX3B4KCZ2bS0+c2NyYXRjaFsxXSwg dm0tPnNjcmF0Y2hbMF0uZW5jb2RlKTsKLQltZW1zZXRfcChwZC0+ZW50cnksICZ2bS0+c2NyYXRj aFsxXSwgSTkxNV9QREVTKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBnZW42X3Bw Z3R0X2ZyZWVfcGQoc3RydWN0IGdlbjZfcHBndHQgKnBwZ3R0KQotewotCXN0cnVjdCBpOTE1X3Bh Z2VfZGlyZWN0b3J5ICogY29uc3QgcGQgPSBwcGd0dC0+YmFzZS5wZDsKLQlzdHJ1Y3QgaTkxNV9w YWdlX2RtYSAqIGNvbnN0IHNjcmF0Y2ggPQotCQlweF9iYXNlKCZwcGd0dC0+YmFzZS52bS5zY3Jh dGNoWzFdKTsKLQlzdHJ1Y3QgaTkxNV9wYWdlX3RhYmxlICpwdDsKLQl1MzIgcGRlOwotCi0JZ2Vu Nl9mb3JfYWxsX3BkZXMocHQsIHBkLCBwZGUpCi0JCWlmIChweF9iYXNlKHB0KSAhPSBzY3JhdGNo KQotCQkJZnJlZV9weCgmcHBndHQtPmJhc2Uudm0sIHB0KTsKLX0KLQotc3RhdGljIHZvaWQgZ2Vu Nl9wcGd0dF9jbGVhbnVwKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKQotewotCXN0cnVj dCBnZW42X3BwZ3R0ICpwcGd0dCA9IHRvX2dlbjZfcHBndHQoaTkxNV92bV90b19wcGd0dCh2bSkp OwotCi0JX19pOTE1X3ZtYV9wdXQocHBndHQtPnZtYSk7Ci0KLQlnZW42X3BwZ3R0X2ZyZWVfcGQo cHBndHQpOwotCWZyZWVfc2NyYXRjaCh2bSk7Ci0KLQltdXRleF9kZXN0cm95KCZwcGd0dC0+Zmx1 c2gpOwotCW11dGV4X2Rlc3Ryb3koJnBwZ3R0LT5waW5fbXV0ZXgpOwotCWtmcmVlKHBwZ3R0LT5i YXNlLnBkKTsKLX0KLQotc3RhdGljIGludCBwZF92bWFfc2V0X3BhZ2VzKHN0cnVjdCBpOTE1X3Zt YSAqdm1hKQotewotCXZtYS0+cGFnZXMgPSBFUlJfUFRSKC1FTk9ERVYpOwotCXJldHVybiAwOwot fQotCi1zdGF0aWMgdm9pZCBwZF92bWFfY2xlYXJfcGFnZXMoc3RydWN0IGk5MTVfdm1hICp2bWEp Ci17Ci0JR0VNX0JVR19PTighdm1hLT5wYWdlcyk7Ci0KLQl2bWEtPnBhZ2VzID0gTlVMTDsKLX0K LQotc3RhdGljIGludCBwZF92bWFfYmluZChzdHJ1Y3QgaTkxNV92bWEgKnZtYSwKLQkJICAgICAg IGVudW0gaTkxNV9jYWNoZV9sZXZlbCBjYWNoZV9sZXZlbCwKLQkJICAgICAgIHUzMiB1bnVzZWQp Ci17Ci0Jc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCA9IGk5MTVfdm1fdG9fZ2d0dCh2bWEtPnZtKTsK LQlzdHJ1Y3QgZ2VuNl9wcGd0dCAqcHBndHQgPSB2bWEtPnByaXZhdGU7Ci0JdTMyIGdndHRfb2Zm c2V0ID0gaTkxNV9nZ3R0X29mZnNldCh2bWEpIC8gSTkxNV9HVFRfUEFHRV9TSVpFOwotCi0JcHhf YmFzZShwcGd0dC0+YmFzZS5wZCktPmdndHRfb2Zmc2V0ID0gZ2d0dF9vZmZzZXQgKiBzaXplb2Yo Z2VuNl9wdGVfdCk7Ci0JcHBndHQtPnBkX2FkZHIgPSAoZ2VuNl9wdGVfdCBfX2lvbWVtICopZ2d0 dC0+Z3NtICsgZ2d0dF9vZmZzZXQ7Ci0KLQlnZW42X2ZsdXNoX3BkKHBwZ3R0LCAwLCBwcGd0dC0+ YmFzZS52bS50b3RhbCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHBkX3ZtYV91bmJp bmQoc3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0Jc3RydWN0IGdlbjZfcHBndHQgKnBwZ3R0ID0g dm1hLT5wcml2YXRlOwotCXN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICogY29uc3QgcGQgPSBw cGd0dC0+YmFzZS5wZDsKLQlzdHJ1Y3QgaTkxNV9wYWdlX2RtYSAqIGNvbnN0IHNjcmF0Y2ggPQot CQlweF9iYXNlKCZwcGd0dC0+YmFzZS52bS5zY3JhdGNoWzFdKTsKLQlzdHJ1Y3QgaTkxNV9wYWdl X3RhYmxlICpwdDsKLQl1bnNpZ25lZCBpbnQgcGRlOwotCi0JaWYgKCFwcGd0dC0+c2Nhbl9mb3Jf dW51c2VkX3B0KQotCQlyZXR1cm47Ci0KLQkvKiBGcmVlIGFsbCBubyBsb25nZXIgdXNlZCBwYWdl IHRhYmxlcyAqLwotCWdlbjZfZm9yX2FsbF9wZGVzKHB0LCBwcGd0dC0+YmFzZS5wZCwgcGRlKSB7 Ci0JCWlmIChweF9iYXNlKHB0KSA9PSBzY3JhdGNoIHx8IGF0b21pY19yZWFkKCZwdC0+dXNlZCkp Ci0JCQljb250aW51ZTsKLQotCQlmcmVlX3B4KCZwcGd0dC0+YmFzZS52bSwgcHQpOwotCQlwZC0+ ZW50cnlbcGRlXSA9IHNjcmF0Y2g7Ci0JfQotCi0JcHBndHQtPnNjYW5fZm9yX3VudXNlZF9wdCA9 IGZhbHNlOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGk5MTVfdm1hX29wcyBwZF92bWFfb3Bz ID0gewotCS5zZXRfcGFnZXMgPSBwZF92bWFfc2V0X3BhZ2VzLAotCS5jbGVhcl9wYWdlcyA9IHBk X3ZtYV9jbGVhcl9wYWdlcywKLQkuYmluZF92bWEgPSBwZF92bWFfYmluZCwKLQkudW5iaW5kX3Zt YSA9IHBkX3ZtYV91bmJpbmQsCi19OwotCi1zdGF0aWMgc3RydWN0IGk5MTVfdm1hICpwZF92bWFf Y3JlYXRlKHN0cnVjdCBnZW42X3BwZ3R0ICpwcGd0dCwgaW50IHNpemUpCi17Ci0Jc3RydWN0IGk5 MTVfZ2d0dCAqZ2d0dCA9IHBwZ3R0LT5iYXNlLnZtLmd0LT5nZ3R0OwotCXN0cnVjdCBpOTE1X3Zt YSAqdm1hOwotCi0JR0VNX0JVR19PTighSVNfQUxJR05FRChzaXplLCBJOTE1X0dUVF9QQUdFX1NJ WkUpKTsKLQlHRU1fQlVHX09OKHNpemUgPiBnZ3R0LT52bS50b3RhbCk7Ci0KLQl2bWEgPSBpOTE1 X3ZtYV9hbGxvYygpOwotCWlmICghdm1hKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQot CWk5MTVfYWN0aXZlX2luaXQoJnZtYS0+YWN0aXZlLCBOVUxMLCBOVUxMKTsKLQotCWtyZWZfaW5p dCgmdm1hLT5yZWYpOwotCW11dGV4X2luaXQoJnZtYS0+cGFnZXNfbXV0ZXgpOwotCXZtYS0+dm0g PSBpOTE1X3ZtX2dldCgmZ2d0dC0+dm0pOwotCXZtYS0+b3BzID0gJnBkX3ZtYV9vcHM7Ci0Jdm1h LT5wcml2YXRlID0gcHBndHQ7Ci0KLQl2bWEtPnNpemUgPSBzaXplOwotCXZtYS0+ZmVuY2Vfc2l6 ZSA9IHNpemU7Ci0JYXRvbWljX3NldCgmdm1hLT5mbGFncywgSTkxNV9WTUFfR0dUVCk7Ci0Jdm1h LT5nZ3R0X3ZpZXcudHlwZSA9IEk5MTVfR0dUVF9WSUVXX1JPVEFURUQ7IC8qIHByZXZlbnQgZmVu Y2luZyAqLwotCi0JSU5JVF9MSVNUX0hFQUQoJnZtYS0+b2JqX2xpbmspOwotCUlOSVRfTElTVF9I RUFEKCZ2bWEtPmNsb3NlZF9saW5rKTsKLQotCXJldHVybiB2bWE7Ci19Ci0KLWludCBnZW42X3Bw Z3R0X3BpbihzdHJ1Y3QgaTkxNV9wcGd0dCAqYmFzZSkKLXsKLQlzdHJ1Y3QgZ2VuNl9wcGd0dCAq cHBndHQgPSB0b19nZW42X3BwZ3R0KGJhc2UpOwotCWludCBlcnIgPSAwOwotCi0JR0VNX0JVR19P TighYXRvbWljX3JlYWQoJnBwZ3R0LT5iYXNlLnZtLm9wZW4pKTsKLQotCS8qCi0JICogV29ya2Fy b3VuZCB0aGUgbGltaXRlZCBtYXhpbXVtIHZtYS0+cGluX2NvdW50IGFuZCB0aGUgYWxpYXNpbmdf cHBndHQKLQkgKiB3aGljaCB3aWxsIGJlIHBpbm5lZCBpbnRvIGV2ZXJ5IGFjdGl2ZSBjb250ZXh0 LgotCSAqIChXaGVuIHZtYS0+cGluX2NvdW50IGJlY29tZXMgYXRvbWljLCBJIGV4cGVjdCB3ZSB3 aWxsIG5hdHVyYWxseQotCSAqIG5lZWQgYSBsYXJnZXIsIHVucGFja2VkLCB0eXBlIGFuZCBraWxs IHRoaXMgcmVkdW5kYW5jeS4pCi0JICovCi0JaWYgKGF0b21pY19hZGRfdW5sZXNzKCZwcGd0dC0+ cGluX2NvdW50LCAxLCAwKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1 cHRpYmxlKCZwcGd0dC0+cGluX211dGV4KSkKLQkJcmV0dXJuIC1FSU5UUjsKLQotCS8qCi0JICog UFBHVFQgUERFcyByZXNpZGUgaW4gdGhlIEdHVFQgYW5kIGNvbnNpc3RzIG9mIDUxMiBlbnRyaWVz LiBUaGUKLQkgKiBhbGxvY2F0b3Igd29ya3MgaW4gYWRkcmVzcyBzcGFjZSBzaXplcywgc28gaXQn cyBtdWx0aXBsaWVkIGJ5IHBhZ2UKLQkgKiBzaXplLiBXZSBhbGxvY2F0ZSBhdCB0aGUgdG9wIG9m IHRoZSBHVFQgdG8gYXZvaWQgZnJhZ21lbnRhdGlvbi4KLQkgKi8KLQlpZiAoIWF0b21pY19yZWFk KCZwcGd0dC0+cGluX2NvdW50KSkgewotCQllcnIgPSBpOTE1X2dndHRfcGluKHBwZ3R0LT52bWEs IEdFTjZfUERfQUxJR04sIFBJTl9ISUdIKTsKLQl9Ci0JaWYgKCFlcnIpCi0JCWF0b21pY19pbmMo JnBwZ3R0LT5waW5fY291bnQpOwotCW11dGV4X3VubG9jaygmcHBndHQtPnBpbl9tdXRleCk7Ci0K LQlyZXR1cm4gZXJyOwotfQotCi12b2lkIGdlbjZfcHBndHRfdW5waW4oc3RydWN0IGk5MTVfcHBn dHQgKmJhc2UpCi17Ci0Jc3RydWN0IGdlbjZfcHBndHQgKnBwZ3R0ID0gdG9fZ2VuNl9wcGd0dChi YXNlKTsKLQotCUdFTV9CVUdfT04oIWF0b21pY19yZWFkKCZwcGd0dC0+cGluX2NvdW50KSk7Ci0J aWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnBwZ3R0LT5waW5fY291bnQpKQotCQlpOTE1X3ZtYV91 bnBpbihwcGd0dC0+dm1hKTsKLX0KLQotdm9pZCBnZW42X3BwZ3R0X3VucGluX2FsbChzdHJ1Y3Qg aTkxNV9wcGd0dCAqYmFzZSkKLXsKLQlzdHJ1Y3QgZ2VuNl9wcGd0dCAqcHBndHQgPSB0b19nZW42 X3BwZ3R0KGJhc2UpOwotCi0JaWYgKCFhdG9taWNfcmVhZCgmcHBndHQtPnBpbl9jb3VudCkpCi0J CXJldHVybjsKLQotCWk5MTVfdm1hX3VucGluKHBwZ3R0LT52bWEpOwotCWF0b21pY19zZXQoJnBw Z3R0LT5waW5fY291bnQsIDApOwotfQotCi1zdGF0aWMgc3RydWN0IGk5MTVfcHBndHQgKmdlbjZf cHBndHRfY3JlYXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1KQotewotCXN0cnVjdCBp OTE1X2dndHQgKiBjb25zdCBnZ3R0ID0gJmk5MTUtPmdndHQ7Ci0Jc3RydWN0IGdlbjZfcHBndHQg KnBwZ3R0OwotCWludCBlcnI7Ci0KLQlwcGd0dCA9IGt6YWxsb2Moc2l6ZW9mKCpwcGd0dCksIEdG UF9LRVJORUwpOwotCWlmICghcHBndHQpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCi0J bXV0ZXhfaW5pdCgmcHBndHQtPmZsdXNoKTsKLQltdXRleF9pbml0KCZwcGd0dC0+cGluX211dGV4 KTsKLQotCXBwZ3R0X2luaXQoJnBwZ3R0LT5iYXNlLCAmaTkxNS0+Z3QpOwotCXBwZ3R0LT5iYXNl LnZtLnRvcCA9IDE7Ci0KLQlwcGd0dC0+YmFzZS52bS5iaW5kX2FzeW5jX2ZsYWdzID0gSTkxNV9W TUFfTE9DQUxfQklORDsKLQlwcGd0dC0+YmFzZS52bS5hbGxvY2F0ZV92YV9yYW5nZSA9IGdlbjZf YWxsb2NfdmFfcmFuZ2U7Ci0JcHBndHQtPmJhc2Uudm0uY2xlYXJfcmFuZ2UgPSBnZW42X3BwZ3R0 X2NsZWFyX3JhbmdlOwotCXBwZ3R0LT5iYXNlLnZtLmluc2VydF9lbnRyaWVzID0gZ2VuNl9wcGd0 dF9pbnNlcnRfZW50cmllczsKLQlwcGd0dC0+YmFzZS52bS5jbGVhbnVwID0gZ2VuNl9wcGd0dF9j bGVhbnVwOwotCi0JcHBndHQtPmJhc2Uudm0ucHRlX2VuY29kZSA9IGdndHQtPnZtLnB0ZV9lbmNv ZGU7Ci0KLQlwcGd0dC0+YmFzZS5wZCA9IF9fYWxsb2NfcGQoc2l6ZW9mKCpwcGd0dC0+YmFzZS5w ZCkpOwotCWlmICghcHBndHQtPmJhc2UucGQpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBl cnJfZnJlZTsKLQl9Ci0KLQllcnIgPSBnZW42X3BwZ3R0X2luaXRfc2NyYXRjaChwcGd0dCk7Ci0J aWYgKGVycikKLQkJZ290byBlcnJfcGQ7Ci0KLQlwcGd0dC0+dm1hID0gcGRfdm1hX2NyZWF0ZShw cGd0dCwgR0VONl9QRF9TSVpFKTsKLQlpZiAoSVNfRVJSKHBwZ3R0LT52bWEpKSB7Ci0JCWVyciA9 IFBUUl9FUlIocHBndHQtPnZtYSk7Ci0JCWdvdG8gZXJyX3NjcmF0Y2g7Ci0JfQotCi0JcmV0dXJu ICZwcGd0dC0+YmFzZTsKLQotZXJyX3NjcmF0Y2g6Ci0JZnJlZV9zY3JhdGNoKCZwcGd0dC0+YmFz ZS52bSk7Ci1lcnJfcGQ6Ci0Ja2ZyZWUocHBndHQtPmJhc2UucGQpOwotZXJyX2ZyZWU6Ci0JbXV0 ZXhfZGVzdHJveSgmcHBndHQtPnBpbl9tdXRleCk7Ci0Ja2ZyZWUocHBndHQpOwotCXJldHVybiBF UlJfUFRSKGVycik7Ci19Ci0KLXN0YXRpYyB2b2lkIGd0dF93cml0ZV93b3JrYXJvdW5kcyhzdHJ1 Y3QgaW50ZWxfZ3QgKmd0KQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gZ3Qt Pmk5MTU7Ci0Jc3RydWN0IGludGVsX3VuY29yZSAqdW5jb3JlID0gZ3QtPnVuY29yZTsKLQotCS8q IFRoaXMgZnVuY3Rpb24gaXMgZm9yIGd0dCByZWxhdGVkIHdvcmthcm91bmRzLiBUaGlzIGZ1bmN0 aW9uIGlzCi0JICogY2FsbGVkIG9uIGRyaXZlciBsb2FkIGFuZCBhZnRlciBhIEdQVSByZXNldCwg c28geW91IGNhbiBwbGFjZQotCSAqIHdvcmthcm91bmRzIGhlcmUgZXZlbiBpZiB0aGV5IGdldCBv dmVyd3JpdHRlbiBieSBHUFUgcmVzZXQuCi0JICovCi0JLyogV2FJbmNyZWFzZURlZmF1bHRUTEJF bnRyaWVzOmNodixiZHcsc2tsLGJ4dCxrYmwsZ2xrLGNmbCxjbmwsaWNsICovCi0JaWYgKElTX0JS T0FEV0VMTChpOTE1KSkKLQkJaW50ZWxfdW5jb3JlX3dyaXRlKHVuY29yZSwKLQkJCQkgICBHRU44 X0wzX0xSQV8xX0dQR1BVLAotCQkJCSAgIEdFTjhfTDNfTFJBXzFfR1BHUFVfREVGQVVMVF9WQUxV RV9CRFcpOwotCWVsc2UgaWYgKElTX0NIRVJSWVZJRVcoaTkxNSkpCi0JCWludGVsX3VuY29yZV93 cml0ZSh1bmNvcmUsCi0JCQkJICAgR0VOOF9MM19MUkFfMV9HUEdQVSwKLQkJCQkgICBHRU44X0wz X0xSQV8xX0dQR1BVX0RFRkFVTFRfVkFMVUVfQ0hWKTsKLQllbHNlIGlmIChJU19HRU45X0xQKGk5 MTUpKQotCQlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLAotCQkJCSAgIEdFTjhfTDNfTFJBXzFf R1BHUFUsCi0JCQkJICAgR0VOOV9MM19MUkFfMV9HUEdQVV9ERUZBVUxUX1ZBTFVFX0JYVCk7Ci0J ZWxzZSBpZiAoSU5URUxfR0VOKGk5MTUpID49IDkgJiYgSU5URUxfR0VOKGk5MTUpIDw9IDExKQot CQlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLAotCQkJCSAgIEdFTjhfTDNfTFJBXzFfR1BHUFUs Ci0JCQkJICAgR0VOOV9MM19MUkFfMV9HUEdQVV9ERUZBVUxUX1ZBTFVFX1NLTCk7Ci0KLQkvKgot CSAqIFRvIHN1cHBvcnQgNjRLIFBURXMgd2UgbmVlZCB0byBmaXJzdCBlbmFibGUgdGhlIHVzZSBv ZiB0aGUKLQkgKiBJbnRlcm1lZGlhdGUtUGFnZS1TaXplKElQUykgYml0IG9mIHRoZSBQREUgZmll bGQgdmlhIHNvbWUgbWFnaWNhbAotCSAqIG1taW8sIG90aGVyd2lzZSB0aGUgcGFnZS13YWxrZXIg d2lsbCBzaW1wbHkgaWdub3JlIHRoZSBJUFMgYml0LiBUaGlzCi0JICogc2hvdWxkbid0IGJlIG5l ZWRlZCBhZnRlciBHRU4xMC4KLQkgKgotCSAqIDY0SyBwYWdlcyB3ZXJlIGZpcnN0IGludHJvZHVj ZWQgZnJvbSBCRFcrLCBhbHRob3VnaCB0ZWNobmljYWxseSB0aGV5Ci0JICogb25seSAqd29yayog ZnJvbSBnZW45Ky4gRm9yIHByZS1CRFcgd2UgaW5zdGVhZCBoYXZlIHRoZSBvcHRpb24gZm9yCi0J ICogMzJLIHBhZ2VzLCBidXQgd2UgZG9uJ3QgY3VycmVudGx5IGhhdmUgYW55IHN1cHBvcnQgZm9y IGl0IGluIG91cgotCSAqIGRyaXZlci4KLQkgKi8KLQlpZiAoSEFTX1BBR0VfU0laRVMoaTkxNSwg STkxNV9HVFRfUEFHRV9TSVpFXzY0SykgJiYKLQkgICAgSU5URUxfR0VOKGk5MTUpIDw9IDEwKQot CQlpbnRlbF91bmNvcmVfcm13KHVuY29yZSwKLQkJCQkgR0VOOF9HQU1XX0VDT19ERVZfUldfSUEs Ci0JCQkJIDAsCi0JCQkJIEdBTVdfRUNPX0VOQUJMRV82NEtfSVBTX0ZJRUxEKTsKLQotCWlmIChJ U19HRU5fUkFOR0UoaTkxNSwgOCwgMTEpKSB7Ci0JCWJvb2wgY2FuX3VzZV9ndHRfY2FjaGUgPSB0 cnVlOwotCi0JCS8qCi0JCSAqIEFjY29yZGluZyB0byB0aGUgQlNwZWMgaWYgd2UgdXNlIDJNLzFH IHBhZ2VzIHRoZW4gd2UgYWxzbwotCQkgKiBuZWVkIHRvIGRpc2FibGUgdGhlIEdUVCBjYWNoZS4g QXQgbGVhc3Qgb24gQkRXIHdlIGNhbiBzZWUKLQkJICogdmlzdWFsIGNvcnJ1cHRpb24gd2hlbiB1 c2luZyAyTSBwYWdlcywgYW5kIG5vdCBkaXNhYmxpbmcgdGhlCi0JCSAqIEdUVCBjYWNoZS4KLQkJ ICovCi0JCWlmIChIQVNfUEFHRV9TSVpFUyhpOTE1LCBJOTE1X0dUVF9QQUdFX1NJWkVfMk0pKQot CQkJY2FuX3VzZV9ndHRfY2FjaGUgPSBmYWxzZTsKLQotCQkvKiBXYUd0dENhY2hpbmdPZmZCeURl ZmF1bHQgKi8KLQkJaW50ZWxfdW5jb3JlX3dyaXRlKHVuY29yZSwKLQkJCQkgICBIU1dfR1RUX0NB Q0hFX0VOLAotCQkJCSAgIGNhbl91c2VfZ3R0X2NhY2hlID8gR1RUX0NBQ0hFX0VOX0FMTCA6IDAp OwotCQlXQVJOX09OX09OQ0UoY2FuX3VzZV9ndHRfY2FjaGUgJiYKLQkJCSAgICAgaW50ZWxfdW5j b3JlX3JlYWQodW5jb3JlLAotCQkJCQkgICAgICAgSFNXX0dUVF9DQUNIRV9FTikgPT0gMCk7Ci0J fQotfQotCi1pbnQgaTkxNV9wcGd0dF9pbml0X2h3KHN0cnVjdCBpbnRlbF9ndCAqZ3QpCi17Ci0J c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBndC0+aTkxNTsKLQotCWd0dF93cml0ZV93 b3JrYXJvdW5kcyhndCk7Ci0KLQlpZiAoSVNfR0VOKGk5MTUsIDYpKQotCQlnZW42X3BwZ3R0X2Vu YWJsZShndCk7Ci0JZWxzZSBpZiAoSVNfR0VOKGk5MTUsIDcpKQotCQlnZW43X3BwZ3R0X2VuYWJs ZShndCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpOTE1X3BwZ3R0ICoKLV9f cHBndHRfY3JlYXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1KQotewotCWlmIChJTlRF TF9HRU4oaTkxNSkgPCA4KQotCQlyZXR1cm4gZ2VuNl9wcGd0dF9jcmVhdGUoaTkxNSk7Ci0JZWxz ZQotCQlyZXR1cm4gZ2VuOF9wcGd0dF9jcmVhdGUoaTkxNSk7Ci19Ci0KLXN0cnVjdCBpOTE1X3Bw Z3R0ICoKLWk5MTVfcHBndHRfY3JlYXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1KQot ewotCXN0cnVjdCBpOTE1X3BwZ3R0ICpwcGd0dDsKLQotCXBwZ3R0ID0gX19wcGd0dF9jcmVhdGUo aTkxNSk7Ci0JaWYgKElTX0VSUihwcGd0dCkpCi0JCXJldHVybiBwcGd0dDsKLQotCXRyYWNlX2k5 MTVfcHBndHRfY3JlYXRlKCZwcGd0dC0+dm0pOwotCi0JcmV0dXJuIHBwZ3R0OwotfQotCi0vKiBD ZXJ0YWluIEdlbjUgY2hpcHNldHMgcmVxdWlyZSByZXF1aXJlIGlkbGluZyB0aGUgR1BVIGJlZm9y ZQotICogdW5tYXBwaW5nIGFueXRoaW5nIGZyb20gdGhlIEdUVCB3aGVuIFZULWQgaXMgZW5hYmxl ZC4KLSAqLwotc3RhdGljIGJvb2wgbmVlZHNfaWRsZV9tYXBzKHN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICpkZXZfcHJpdikKLXsKLQkvKiBRdWVyeSBpbnRlbF9pb21tdSB0byBzZWUgaWYgd2UgbmVl ZCB0aGUgd29ya2Fyb3VuZC4gUHJlc3VtYWJseSB0aGF0Ci0JICogd2FzIGxvYWRlZCBmaXJzdC4K LQkgKi8KLQlyZXR1cm4gSVNfR0VOKGRldl9wcml2LCA1KSAmJiBJU19NT0JJTEUoZGV2X3ByaXYp ICYmIGludGVsX3Z0ZF9hY3RpdmUoKTsKLX0KLQotc3RhdGljIHZvaWQgZ2d0dF9zdXNwZW5kX21h cHBpbmdzKHN0cnVjdCBpOTE1X2dndHQgKmdndHQpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmk5MTUgPSBnZ3R0LT52bS5pOTE1OwotCi0JLyogRG9uJ3QgYm90aGVyIG1lc3Npbmcgd2l0 aCBmYXVsdHMgcHJlIEdFTjYgYXMgd2UgaGF2ZSBsaXR0bGUKLQkgKiBkb2N1bWVudGF0aW9uIHN1 cHBvcnRpbmcgdGhhdCBpdCdzIGEgZ29vZCBpZGVhLgotCSAqLwotCWlmIChJTlRFTF9HRU4oaTkx NSkgPCA2KQotCQlyZXR1cm47Ci0KLQlpbnRlbF9ndF9jaGVja19hbmRfY2xlYXJfZmF1bHRzKGdn dHQtPnZtLmd0KTsKLQotCWdndHQtPnZtLmNsZWFyX3JhbmdlKCZnZ3R0LT52bSwgMCwgZ2d0dC0+ dm0udG90YWwpOwotCi0JZ2d0dC0+aW52YWxpZGF0ZShnZ3R0KTsKLX0KLQotdm9pZCBpOTE1X2dl bV9zdXNwZW5kX2d0dF9tYXBwaW5ncyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKLXsK LQlnZ3R0X3N1c3BlbmRfbWFwcGluZ3MoJmk5MTUtPmdndHQpOwotfQotCi1pbnQgaTkxNV9nZW1f Z3R0X3ByZXBhcmVfcGFnZXMoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKLQkJCSAg ICAgICBzdHJ1Y3Qgc2dfdGFibGUgKnBhZ2VzKQotewotCWRvIHsKLQkJaWYgKGRtYV9tYXBfc2df YXR0cnMoJm9iai0+YmFzZS5kZXYtPnBkZXYtPmRldiwKLQkJCQkgICAgIHBhZ2VzLT5zZ2wsIHBh Z2VzLT5uZW50cywKLQkJCQkgICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCwKLQkJCQkgICAgIERN QV9BVFRSX05PX1dBUk4pKQotCQkJcmV0dXJuIDA7Ci0KLQkJLyoKLQkJICogSWYgdGhlIERNQSBy ZW1hcCBmYWlscywgb25lIGNhdXNlIGNhbiBiZSB0aGF0IHdlIGhhdmUKLQkJICogdG9vIG1hbnkg b2JqZWN0cyBwaW5uZWQgaW4gYSBzbWFsbCByZW1hcHBpbmcgdGFibGUsCi0JCSAqIHN1Y2ggYXMg c3dpb3RsYi4gSW5jcmVtZW50YWxseSBwdXJnZSBhbGwgb3RoZXIgb2JqZWN0cyBhbmQKLQkJICog dHJ5IGFnYWluIC0gaWYgdGhlcmUgYXJlIG5vIG1vcmUgcGFnZXMgdG8gcmVtb3ZlIGZyb20KLQkJ ICogdGhlIERNQSByZW1hcHBlciwgaTkxNV9nZW1fc2hyaW5rIHdpbGwgcmV0dXJuIDAuCi0JCSAq LwotCQlHRU1fQlVHX09OKG9iai0+bW0ucGFnZXMgPT0gcGFnZXMpOwotCX0gd2hpbGUgKGk5MTVf Z2VtX3Nocmluayh0b19pOTE1KG9iai0+YmFzZS5kZXYpLAotCQkJCSBvYmotPmJhc2Uuc2l6ZSA+ PiBQQUdFX1NISUZULCBOVUxMLAotCQkJCSBJOTE1X1NIUklOS19CT1VORCB8Ci0JCQkJIEk5MTVf U0hSSU5LX1VOQk9VTkQpKTsKLQotCXJldHVybiAtRU5PU1BDOwotfQotCi1zdGF0aWMgdm9pZCBn ZW44X3NldF9wdGUodm9pZCBfX2lvbWVtICphZGRyLCBnZW44X3B0ZV90IHB0ZSkKLXsKLQl3cml0 ZXEocHRlLCBhZGRyKTsKLX0KLQotc3RhdGljIHZvaWQgZ2VuOF9nZ3R0X2luc2VydF9wYWdlKHN0 cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAotCQkJCSAgZG1hX2FkZHJfdCBhZGRyLAotCQkJ CSAgdTY0IG9mZnNldCwKLQkJCQkgIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBsZXZlbCwKLQkJCQkg IHUzMiB1bnVzZWQpCi17Ci0Jc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCA9IGk5MTVfdm1fdG9fZ2d0 dCh2bSk7Ci0JZ2VuOF9wdGVfdCBfX2lvbWVtICpwdGUgPQotCQkoZ2VuOF9wdGVfdCBfX2lvbWVt ICopZ2d0dC0+Z3NtICsgb2Zmc2V0IC8gSTkxNV9HVFRfUEFHRV9TSVpFOwotCi0JZ2VuOF9zZXRf cHRlKHB0ZSwgZ2VuOF9wdGVfZW5jb2RlKGFkZHIsIGxldmVsLCAwKSk7Ci0KLQlnZ3R0LT5pbnZh bGlkYXRlKGdndHQpOwotfQotCi1zdGF0aWMgdm9pZCBnZW44X2dndHRfaW5zZXJ0X2VudHJpZXMo c3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCi0JCQkJICAgICBzdHJ1Y3QgaTkxNV92bWEg KnZtYSwKLQkJCQkgICAgIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBsZXZlbCwKLQkJCQkgICAgIHUz MiBmbGFncykKLXsKLQlzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0ID0gaTkxNV92bV90b19nZ3R0KHZt KTsKLQlzdHJ1Y3Qgc2d0X2l0ZXIgc2d0X2l0ZXI7Ci0JZ2VuOF9wdGVfdCBfX2lvbWVtICpndHRf ZW50cmllczsKLQljb25zdCBnZW44X3B0ZV90IHB0ZV9lbmNvZGUgPSBnZW44X3B0ZV9lbmNvZGUo MCwgbGV2ZWwsIDApOwotCWRtYV9hZGRyX3QgYWRkcjsKLQotCS8qCi0JICogTm90ZSB0aGF0IHdl IGlnbm9yZSBQVEVfUkVBRF9PTkxZIGhlcmUuIFRoZSBjYWxsZXIgbXVzdCBiZSBjYXJlZnVsCi0J ICogbm90IHRvIGFsbG93IHRoZSB1c2VyIHRvIG92ZXJyaWRlIGFjY2VzcyB0byBhIHJlYWQgb25s eSBwYWdlLgotCSAqLwotCi0JZ3R0X2VudHJpZXMgPSAoZ2VuOF9wdGVfdCBfX2lvbWVtICopZ2d0 dC0+Z3NtOwotCWd0dF9lbnRyaWVzICs9IHZtYS0+bm9kZS5zdGFydCAvIEk5MTVfR1RUX1BBR0Vf U0laRTsKLQlmb3JfZWFjaF9zZ3RfZGFkZHIoYWRkciwgc2d0X2l0ZXIsIHZtYS0+cGFnZXMpCi0J CWdlbjhfc2V0X3B0ZShndHRfZW50cmllcysrLCBwdGVfZW5jb2RlIHwgYWRkcik7Ci0KLQkvKgot CSAqIFdlIHdhbnQgdG8gZmx1c2ggdGhlIFRMQnMgb25seSBhZnRlciB3ZSdyZSBjZXJ0YWluIGFs bCB0aGUgUFRFCi0JICogdXBkYXRlcyBoYXZlIGZpbmlzaGVkLgotCSAqLwotCWdndHQtPmludmFs aWRhdGUoZ2d0dCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGdlbjZfZ2d0dF9pbnNlcnRfcGFnZShzdHJ1 Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKLQkJCQkgIGRtYV9hZGRyX3QgYWRkciwKLQkJCQkg IHU2NCBvZmZzZXQsCi0JCQkJICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgbGV2ZWwsCi0JCQkJICB1 MzIgZmxhZ3MpCi17Ci0Jc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCA9IGk5MTVfdm1fdG9fZ2d0dCh2 bSk7Ci0JZ2VuNl9wdGVfdCBfX2lvbWVtICpwdGUgPQotCQkoZ2VuNl9wdGVfdCBfX2lvbWVtICop Z2d0dC0+Z3NtICsgb2Zmc2V0IC8gSTkxNV9HVFRfUEFHRV9TSVpFOwotCi0JaW93cml0ZTMyKHZt LT5wdGVfZW5jb2RlKGFkZHIsIGxldmVsLCBmbGFncyksIHB0ZSk7Ci0KLQlnZ3R0LT5pbnZhbGlk YXRlKGdndHQpOwotfQotCi0vKgotICogQmluZHMgYW4gb2JqZWN0IGludG8gdGhlIGdsb2JhbCBn dHQgd2l0aCB0aGUgc3BlY2lmaWVkIGNhY2hlIGxldmVsLiBUaGUgb2JqZWN0Ci0gKiB3aWxsIGJl IGFjY2Vzc2libGUgdG8gdGhlIEdQVSB2aWEgY29tbWFuZHMgd2hvc2Ugb3BlcmFuZHMgcmVmZXJl bmNlIG9mZnNldHMKLSAqIHdpdGhpbiB0aGUgZ2xvYmFsIEdUVCBhcyB3ZWxsIGFzIGFjY2Vzc2li bGUgYnkgdGhlIEdQVSB0aHJvdWdoIHRoZSBHTUFEUgotICogbWFwcGVkIEJBUiAoZGV2X3ByaXYt Pm1tLmd0dC0+Z3R0KS4KLSAqLwotc3RhdGljIHZvaWQgZ2VuNl9nZ3R0X2luc2VydF9lbnRyaWVz KHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAotCQkJCSAgICAgc3RydWN0IGk5MTVfdm1h ICp2bWEsCi0JCQkJICAgICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgbGV2ZWwsCi0JCQkJICAgICB1 MzIgZmxhZ3MpCi17Ci0Jc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCA9IGk5MTVfdm1fdG9fZ2d0dCh2 bSk7Ci0JZ2VuNl9wdGVfdCBfX2lvbWVtICplbnRyaWVzID0gKGdlbjZfcHRlX3QgX19pb21lbSAq KWdndHQtPmdzbTsKLQl1bnNpZ25lZCBpbnQgaSA9IHZtYS0+bm9kZS5zdGFydCAvIEk5MTVfR1RU X1BBR0VfU0laRTsKLQlzdHJ1Y3Qgc2d0X2l0ZXIgaXRlcjsKLQlkbWFfYWRkcl90IGFkZHI7Ci0J Zm9yX2VhY2hfc2d0X2RhZGRyKGFkZHIsIGl0ZXIsIHZtYS0+cGFnZXMpCi0JCWlvd3JpdGUzMih2 bS0+cHRlX2VuY29kZShhZGRyLCBsZXZlbCwgZmxhZ3MpLCAmZW50cmllc1tpKytdKTsKLQotCS8q Ci0JICogV2Ugd2FudCB0byBmbHVzaCB0aGUgVExCcyBvbmx5IGFmdGVyIHdlJ3JlIGNlcnRhaW4g YWxsIHRoZSBQVEUKLQkgKiB1cGRhdGVzIGhhdmUgZmluaXNoZWQuCi0JICovCi0JZ2d0dC0+aW52 YWxpZGF0ZShnZ3R0KTsKLX0KLQotc3RhdGljIHZvaWQgbm9wX2NsZWFyX3JhbmdlKHN0cnVjdCBp OTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAotCQkJICAgIHU2NCBzdGFydCwgdTY0IGxlbmd0aCkKLXsK LX0KLQotc3RhdGljIHZvaWQgZ2VuOF9nZ3R0X2NsZWFyX3JhbmdlKHN0cnVjdCBpOTE1X2FkZHJl c3Nfc3BhY2UgKnZtLAotCQkJCSAgdTY0IHN0YXJ0LCB1NjQgbGVuZ3RoKQotewotCXN0cnVjdCBp OTE1X2dndHQgKmdndHQgPSBpOTE1X3ZtX3RvX2dndHQodm0pOwotCXVuc2lnbmVkIGZpcnN0X2Vu dHJ5ID0gc3RhcnQgLyBJOTE1X0dUVF9QQUdFX1NJWkU7Ci0JdW5zaWduZWQgbnVtX2VudHJpZXMg PSBsZW5ndGggLyBJOTE1X0dUVF9QQUdFX1NJWkU7Ci0JY29uc3QgZ2VuOF9wdGVfdCBzY3JhdGNo X3B0ZSA9IHZtLT5zY3JhdGNoWzBdLmVuY29kZTsKLQlnZW44X3B0ZV90IF9faW9tZW0gKmd0dF9i YXNlID0KLQkJKGdlbjhfcHRlX3QgX19pb21lbSAqKWdndHQtPmdzbSArIGZpcnN0X2VudHJ5Owot CWNvbnN0IGludCBtYXhfZW50cmllcyA9IGdndHRfdG90YWxfZW50cmllcyhnZ3R0KSAtIGZpcnN0 X2VudHJ5OwotCWludCBpOwotCi0JaWYgKFdBUk4obnVtX2VudHJpZXMgPiBtYXhfZW50cmllcywK LQkJICJGaXJzdCBlbnRyeSA9ICVkOyBOdW0gZW50cmllcyA9ICVkIChtYXg9JWQpXG4iLAotCQkg Zmlyc3RfZW50cnksIG51bV9lbnRyaWVzLCBtYXhfZW50cmllcykpCi0JCW51bV9lbnRyaWVzID0g bWF4X2VudHJpZXM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKykKLQkJZ2Vu OF9zZXRfcHRlKCZndHRfYmFzZVtpXSwgc2NyYXRjaF9wdGUpOwotfQotCi1zdGF0aWMgdm9pZCBi eHRfdnRkX2dndHRfd2Eoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pCi17Ci0Jc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdm0tPmk5MTU7Ci0KLQkvKgotCSAqIE1ha2Ug c3VyZSB0aGUgaW50ZXJuYWwgR0FNIGZpZm8gaGFzIGJlZW4gY2xlYXJlZCBvZiBhbGwgR1RUCi0J ICogd3JpdGVzIGJlZm9yZSBleGl0aW5nIHN0b3BfbWFjaGluZSgpLiBUaGlzIGd1YXJhbnRlZXMg dGhhdAotCSAqIGFueSBhcGVydHVyZSBhY2Nlc3NlcyB3YWl0aW5nIHRvIHN0YXJ0IGluIGFub3Ro ZXIgcHJvY2VzcwotCSAqIGNhbm5vdCBiYWNrIHVwIGJlaGluZCB0aGUgR1RUIHdyaXRlcyBjYXVz aW5nIGEgaGFuZy4KLQkgKiBUaGUgcmVnaXN0ZXIgY2FuIGJlIGFueSBhcmJpdHJhcnkgR0FNIHJl Z2lzdGVyLgotCSAqLwotCVBPU1RJTkdfUkVBRChHRlhfRkxTSF9DTlRMX0dFTjYpOwotfQotCi1z dHJ1Y3QgaW5zZXJ0X3BhZ2UgewotCXN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtOwotCWRt YV9hZGRyX3QgYWRkcjsKLQl1NjQgb2Zmc2V0OwotCWVudW0gaTkxNV9jYWNoZV9sZXZlbCBsZXZl bDsKLX07Ci0KLXN0YXRpYyBpbnQgYnh0X3Z0ZF9nZ3R0X2luc2VydF9wYWdlX19jYih2b2lkICpf YXJnKQotewotCXN0cnVjdCBpbnNlcnRfcGFnZSAqYXJnID0gX2FyZzsKLQotCWdlbjhfZ2d0dF9p bnNlcnRfcGFnZShhcmctPnZtLCBhcmctPmFkZHIsIGFyZy0+b2Zmc2V0LCBhcmctPmxldmVsLCAw KTsKLQlieHRfdnRkX2dndHRfd2EoYXJnLT52bSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGlj IHZvaWQgYnh0X3Z0ZF9nZ3R0X2luc2VydF9wYWdlX19CS0woc3RydWN0IGk5MTVfYWRkcmVzc19z cGFjZSAqdm0sCi0JCQkJCSAgZG1hX2FkZHJfdCBhZGRyLAotCQkJCQkgIHU2NCBvZmZzZXQsCi0J CQkJCSAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGxldmVsLAotCQkJCQkgIHUzMiB1bnVzZWQpCi17 Ci0Jc3RydWN0IGluc2VydF9wYWdlIGFyZyA9IHsgdm0sIGFkZHIsIG9mZnNldCwgbGV2ZWwgfTsK LQotCXN0b3BfbWFjaGluZShieHRfdnRkX2dndHRfaW5zZXJ0X3BhZ2VfX2NiLCAmYXJnLCBOVUxM KTsKLX0KLQotc3RydWN0IGluc2VydF9lbnRyaWVzIHsKLQlzdHJ1Y3QgaTkxNV9hZGRyZXNzX3Nw YWNlICp2bTsKLQlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKLQllbnVtIGk5MTVfY2FjaGVfbGV2ZWwg bGV2ZWw7Ci0JdTMyIGZsYWdzOwotfTsKLQotc3RhdGljIGludCBieHRfdnRkX2dndHRfaW5zZXJ0 X2VudHJpZXNfX2NiKHZvaWQgKl9hcmcpCi17Ci0Jc3RydWN0IGluc2VydF9lbnRyaWVzICphcmcg PSBfYXJnOwotCi0JZ2VuOF9nZ3R0X2luc2VydF9lbnRyaWVzKGFyZy0+dm0sIGFyZy0+dm1hLCBh cmctPmxldmVsLCBhcmctPmZsYWdzKTsKLQlieHRfdnRkX2dndHRfd2EoYXJnLT52bSk7Ci0KLQly ZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYnh0X3Z0ZF9nZ3R0X2luc2VydF9lbnRyaWVzX19C S0woc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCi0JCQkJCSAgICAgc3RydWN0IGk5MTVf dm1hICp2bWEsCi0JCQkJCSAgICAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGxldmVsLAotCQkJCQkg ICAgIHUzMiBmbGFncykKLXsKLQlzdHJ1Y3QgaW5zZXJ0X2VudHJpZXMgYXJnID0geyB2bSwgdm1h LCBsZXZlbCwgZmxhZ3MgfTsKLQotCXN0b3BfbWFjaGluZShieHRfdnRkX2dndHRfaW5zZXJ0X2Vu dHJpZXNfX2NiLCAmYXJnLCBOVUxMKTsKLX0KLQotc3RydWN0IGNsZWFyX3JhbmdlIHsKLQlzdHJ1 Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bTsKLQl1NjQgc3RhcnQ7Ci0JdTY0IGxlbmd0aDsKLX07 Ci0KLXN0YXRpYyBpbnQgYnh0X3Z0ZF9nZ3R0X2NsZWFyX3JhbmdlX19jYih2b2lkICpfYXJnKQot ewotCXN0cnVjdCBjbGVhcl9yYW5nZSAqYXJnID0gX2FyZzsKLQotCWdlbjhfZ2d0dF9jbGVhcl9y YW5nZShhcmctPnZtLCBhcmctPnN0YXJ0LCBhcmctPmxlbmd0aCk7Ci0JYnh0X3Z0ZF9nZ3R0X3dh KGFyZy0+dm0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ4dF92dGRfZ2d0dF9j bGVhcl9yYW5nZV9fQktMKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAotCQkJCQkgIHU2 NCBzdGFydCwKLQkJCQkJICB1NjQgbGVuZ3RoKQotewotCXN0cnVjdCBjbGVhcl9yYW5nZSBhcmcg PSB7IHZtLCBzdGFydCwgbGVuZ3RoIH07Ci0KLQlzdG9wX21hY2hpbmUoYnh0X3Z0ZF9nZ3R0X2Ns ZWFyX3JhbmdlX19jYiwgJmFyZywgTlVMTCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGdlbjZfZ2d0dF9j bGVhcl9yYW5nZShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKLQkJCQkgIHU2NCBzdGFy dCwgdTY0IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0ID0gaTkxNV92bV90b19n Z3R0KHZtKTsKLQl1bnNpZ25lZCBmaXJzdF9lbnRyeSA9IHN0YXJ0IC8gSTkxNV9HVFRfUEFHRV9T SVpFOwotCXVuc2lnbmVkIG51bV9lbnRyaWVzID0gbGVuZ3RoIC8gSTkxNV9HVFRfUEFHRV9TSVpF OwotCWdlbjZfcHRlX3Qgc2NyYXRjaF9wdGUsIF9faW9tZW0gKmd0dF9iYXNlID0KLQkJKGdlbjZf cHRlX3QgX19pb21lbSAqKWdndHQtPmdzbSArIGZpcnN0X2VudHJ5OwotCWNvbnN0IGludCBtYXhf ZW50cmllcyA9IGdndHRfdG90YWxfZW50cmllcyhnZ3R0KSAtIGZpcnN0X2VudHJ5OwotCWludCBp OwotCi0JaWYgKFdBUk4obnVtX2VudHJpZXMgPiBtYXhfZW50cmllcywKLQkJICJGaXJzdCBlbnRy eSA9ICVkOyBOdW0gZW50cmllcyA9ICVkIChtYXg9JWQpXG4iLAotCQkgZmlyc3RfZW50cnksIG51 bV9lbnRyaWVzLCBtYXhfZW50cmllcykpCi0JCW51bV9lbnRyaWVzID0gbWF4X2VudHJpZXM7Ci0K LQlzY3JhdGNoX3B0ZSA9IHZtLT5zY3JhdGNoWzBdLmVuY29kZTsKLQlmb3IgKGkgPSAwOyBpIDwg bnVtX2VudHJpZXM7IGkrKykKLQkJaW93cml0ZTMyKHNjcmF0Y2hfcHRlLCAmZ3R0X2Jhc2VbaV0p OwotfQotCi1zdGF0aWMgdm9pZCBpOTE1X2dndHRfaW5zZXJ0X3BhZ2Uoc3RydWN0IGk5MTVfYWRk cmVzc19zcGFjZSAqdm0sCi0JCQkJICBkbWFfYWRkcl90IGFkZHIsCi0JCQkJICB1NjQgb2Zmc2V0 LAotCQkJCSAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGNhY2hlX2xldmVsLAotCQkJCSAgdTMyIHVu dXNlZCkKLXsKLQl1bnNpZ25lZCBpbnQgZmxhZ3MgPSAoY2FjaGVfbGV2ZWwgPT0gSTkxNV9DQUNI RV9OT05FKSA/Ci0JCUFHUF9VU0VSX01FTU9SWSA6IEFHUF9VU0VSX0NBQ0hFRF9NRU1PUlk7Ci0K LQlpbnRlbF9ndHRfaW5zZXJ0X3BhZ2UoYWRkciwgb2Zmc2V0ID4+IFBBR0VfU0hJRlQsIGZsYWdz KTsKLX0KLQotc3RhdGljIHZvaWQgaTkxNV9nZ3R0X2luc2VydF9lbnRyaWVzKHN0cnVjdCBpOTE1 X2FkZHJlc3Nfc3BhY2UgKnZtLAotCQkJCSAgICAgc3RydWN0IGk5MTVfdm1hICp2bWEsCi0JCQkJ ICAgICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgY2FjaGVfbGV2ZWwsCi0JCQkJICAgICB1MzIgdW51 c2VkKQotewotCXVuc2lnbmVkIGludCBmbGFncyA9IChjYWNoZV9sZXZlbCA9PSBJOTE1X0NBQ0hF X05PTkUpID8KLQkJQUdQX1VTRVJfTUVNT1JZIDogQUdQX1VTRVJfQ0FDSEVEX01FTU9SWTsKLQot CWludGVsX2d0dF9pbnNlcnRfc2dfZW50cmllcyh2bWEtPnBhZ2VzLCB2bWEtPm5vZGUuc3RhcnQg Pj4gUEFHRV9TSElGVCwKLQkJCQkgICAgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBpOTE1X2dn dHRfY2xlYXJfcmFuZ2Uoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCi0JCQkJICB1NjQg c3RhcnQsIHU2NCBsZW5ndGgpCi17Ci0JaW50ZWxfZ3R0X2NsZWFyX3JhbmdlKHN0YXJ0ID4+IFBB R0VfU0hJRlQsIGxlbmd0aCA+PiBQQUdFX1NISUZUKTsKLX0KLQotc3RhdGljIGludCBnZ3R0X2Jp bmRfdm1hKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAotCQkJIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBj YWNoZV9sZXZlbCwKLQkJCSB1MzIgZmxhZ3MpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg Kmk5MTUgPSB2bWEtPnZtLT5pOTE1OwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmog PSB2bWEtPm9iajsKLQlpbnRlbF93YWtlcmVmX3Qgd2FrZXJlZjsKLQl1MzIgcHRlX2ZsYWdzOwot Ci0JLyogQXBwbGljYWJsZSB0byBWTFYgKGdlbjgrIGRvIG5vdCBzdXBwb3J0IFJPIGluIHRoZSBH R1RUKSAqLwotCXB0ZV9mbGFncyA9IDA7Ci0JaWYgKGk5MTVfZ2VtX29iamVjdF9pc19yZWFkb25s eShvYmopKQotCQlwdGVfZmxhZ3MgfD0gUFRFX1JFQURfT05MWTsKLQotCXdpdGhfaW50ZWxfcnVu dGltZV9wbSgmaTkxNS0+cnVudGltZV9wbSwgd2FrZXJlZikKLQkJdm1hLT52bS0+aW5zZXJ0X2Vu dHJpZXModm1hLT52bSwgdm1hLCBjYWNoZV9sZXZlbCwgcHRlX2ZsYWdzKTsKLQotCXZtYS0+cGFn ZV9zaXplcy5ndHQgPSBJOTE1X0dUVF9QQUdFX1NJWkU7Ci0KLQkvKgotCSAqIFdpdGhvdXQgYWxp YXNpbmcgUFBHVFQgdGhlcmUncyBubyBkaWZmZXJlbmNlIGJldHdlZW4KLQkgKiBHTE9CQUwvTE9D QUxfQklORCwgaXQncyBhbGwgdGhlIHNhbWUgcHRlcy4gSGVuY2UgdW5jb25kaXRpb25hbGx5Ci0J ICogdXBncmFkZSB0byBib3RoIGJvdW5kIGlmIHdlIGJpbmQgZWl0aGVyIHRvIGF2b2lkIGRvdWJs ZS1iaW5kaW5nLgotCSAqLwotCWF0b21pY19vcihJOTE1X1ZNQV9HTE9CQUxfQklORCB8IEk5MTVf Vk1BX0xPQ0FMX0JJTkQsICZ2bWEtPmZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMg dm9pZCBnZ3R0X3VuYmluZF92bWEoc3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0Jc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmk5MTUgPSB2bWEtPnZtLT5pOTE1OwotCWludGVsX3dha2VyZWZfdCB3 YWtlcmVmOwotCi0Jd2l0aF9pbnRlbF9ydW50aW1lX3BtKCZpOTE1LT5ydW50aW1lX3BtLCB3YWtl cmVmKQotCQl2bWEtPnZtLT5jbGVhcl9yYW5nZSh2bWEtPnZtLCB2bWEtPm5vZGUuc3RhcnQsIHZt YS0+c2l6ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgYWxpYXNpbmdfZ3R0X2JpbmRfdm1hKHN0cnVjdCBp OTE1X3ZtYSAqdm1hLAotCQkJCSBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgY2FjaGVfbGV2ZWwsCi0J CQkJIHUzMiBmbGFncykKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IHZtYS0+ dm0tPmk5MTU7Ci0JdTMyIHB0ZV9mbGFnczsKLQlpbnQgcmV0OwotCi0JLyogQ3VycmVudGx5IGFw cGxpY2FibGUgb25seSB0byBWTFYgKi8KLQlwdGVfZmxhZ3MgPSAwOwotCWlmIChpOTE1X2dlbV9v YmplY3RfaXNfcmVhZG9ubHkodm1hLT5vYmopKQotCQlwdGVfZmxhZ3MgfD0gUFRFX1JFQURfT05M WTsKLQotCWlmIChmbGFncyAmIEk5MTVfVk1BX0xPQ0FMX0JJTkQpIHsKLQkJc3RydWN0IGk5MTVf cHBndHQgKmFsaWFzID0gaTkxNV92bV90b19nZ3R0KHZtYS0+dm0pLT5hbGlhczsKLQotCQlpZiAo ZmxhZ3MgJiBJOTE1X1ZNQV9BTExPQykgewotCQkJcmV0ID0gYWxpYXMtPnZtLmFsbG9jYXRlX3Zh X3JhbmdlKCZhbGlhcy0+dm0sCi0JCQkJCQkJICB2bWEtPm5vZGUuc3RhcnQsCi0JCQkJCQkJICB2 bWEtPnNpemUpOwotCQkJaWYgKHJldCkKLQkJCQlyZXR1cm4gcmV0OwotCi0JCQlzZXRfYml0KEk5 MTVfVk1BX0FMTE9DX0JJVCwgX19pOTE1X3ZtYV9mbGFncyh2bWEpKTsKLQkJfQotCi0JCUdFTV9C VUdfT04oIXRlc3RfYml0KEk5MTVfVk1BX0FMTE9DX0JJVCwKLQkJCQkgICAgIF9faTkxNV92bWFf ZmxhZ3Modm1hKSkpOwotCQlhbGlhcy0+dm0uaW5zZXJ0X2VudHJpZXMoJmFsaWFzLT52bSwgdm1h LAotCQkJCQkgY2FjaGVfbGV2ZWwsIHB0ZV9mbGFncyk7Ci0JfQotCi0JaWYgKGZsYWdzICYgSTkx NV9WTUFfR0xPQkFMX0JJTkQpIHsKLQkJaW50ZWxfd2FrZXJlZl90IHdha2VyZWY7Ci0KLQkJd2l0 aF9pbnRlbF9ydW50aW1lX3BtKCZpOTE1LT5ydW50aW1lX3BtLCB3YWtlcmVmKSB7Ci0JCQl2bWEt PnZtLT5pbnNlcnRfZW50cmllcyh2bWEtPnZtLCB2bWEsCi0JCQkJCQljYWNoZV9sZXZlbCwgcHRl X2ZsYWdzKTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhbGlhc2lu Z19ndHRfdW5iaW5kX3ZtYShzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKLXsKLQlzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqaTkxNSA9IHZtYS0+dm0tPmk5MTU7Ci0KLQlpZiAoaTkxNV92bWFfaXNfYm91 bmQodm1hLCBJOTE1X1ZNQV9HTE9CQUxfQklORCkpIHsKLQkJc3RydWN0IGk5MTVfYWRkcmVzc19z cGFjZSAqdm0gPSB2bWEtPnZtOwotCQlpbnRlbF93YWtlcmVmX3Qgd2FrZXJlZjsKLQotCQl3aXRo X2ludGVsX3J1bnRpbWVfcG0oJmk5MTUtPnJ1bnRpbWVfcG0sIHdha2VyZWYpCi0JCQl2bS0+Y2xl YXJfcmFuZ2Uodm0sIHZtYS0+bm9kZS5zdGFydCwgdm1hLT5zaXplKTsKLQl9Ci0KLQlpZiAodGVz dF9hbmRfY2xlYXJfYml0KEk5MTVfVk1BX0FMTE9DX0JJVCwgX19pOTE1X3ZtYV9mbGFncyh2bWEp KSkgewotCQlzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSA9Ci0JCQkmaTkxNV92bV90b19n Z3R0KHZtYS0+dm0pLT5hbGlhcy0+dm07Ci0KLQkJdm0tPmNsZWFyX3JhbmdlKHZtLCB2bWEtPm5v ZGUuc3RhcnQsIHZtYS0+c2l6ZSk7Ci0JfQotfQotCi12b2lkIGk5MTVfZ2VtX2d0dF9maW5pc2hf cGFnZXMoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKLQkJCSAgICAgICBzdHJ1Y3Qg c2dfdGFibGUgKnBhZ2VzKQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9 IHRvX2k5MTUob2JqLT5iYXNlLmRldik7Ci0Jc3RydWN0IGRldmljZSAqa2RldiA9ICZkZXZfcHJp di0+ZHJtLnBkZXYtPmRldjsKLQlzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0ID0gJmRldl9wcml2LT5n Z3R0OwotCi0JaWYgKHVubGlrZWx5KGdndHQtPmRvX2lkbGVfbWFwcykpIHsKLQkJLyogWFhYIFRo aXMgZG9lcyBub3QgcHJldmVudCBtb3JlIHJlcXVlc3RzIGJlaW5nIHN1Ym1pdHRlZCEgKi8KLQkJ aWYgKGludGVsX2d0X3JldGlyZV9yZXF1ZXN0c190aW1lb3V0KGdndHQtPnZtLmd0LAotCQkJCQkJ ICAgICAtTUFYX1NDSEVEVUxFX1RJTUVPVVQpKSB7Ci0JCQlEUk1fRVJST1IoIkZhaWxlZCB0byB3 YWl0IGZvciBpZGxlOyBWVCdkIG1heSBoYW5nLlxuIik7Ci0JCQkvKiBXYWl0IGEgYml0LCBpbiBo b3BlcyBpdCBhdm9pZHMgdGhlIGhhbmcgKi8KLQkJCXVkZWxheSgxMCk7Ci0JCX0KLQl9Ci0KLQlk bWFfdW5tYXBfc2coa2RldiwgcGFnZXMtPnNnbCwgcGFnZXMtPm5lbnRzLCBQQ0lfRE1BX0JJRElS RUNUSU9OQUwpOwotfQotCi1zdGF0aWMgaW50IGdndHRfc2V0X3BhZ2VzKHN0cnVjdCBpOTE1X3Zt YSAqdm1hKQotewotCWludCByZXQ7Ci0KLQlHRU1fQlVHX09OKHZtYS0+cGFnZXMpOwotCi0JcmV0 ID0gaTkxNV9nZXRfZ2d0dF92bWFfcGFnZXModm1hKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0 OwotCi0Jdm1hLT5wYWdlX3NpemVzID0gdm1hLT5vYmotPm1tLnBhZ2Vfc2l6ZXM7Ci0KLQlyZXR1 cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaTkxNV9nZ3R0X2NvbG9yX2FkanVzdChjb25zdCBzdHJ1 Y3QgZHJtX21tX25vZGUgKm5vZGUsCi0JCQkJICAgdW5zaWduZWQgbG9uZyBjb2xvciwKLQkJCQkg ICB1NjQgKnN0YXJ0LAotCQkJCSAgIHU2NCAqZW5kKQotewotCWlmIChpOTE1X25vZGVfY29sb3Jf ZGlmZmVycyhub2RlLCBjb2xvcikpCi0JCSpzdGFydCArPSBJOTE1X0dUVF9QQUdFX1NJWkU7Ci0K LQkvKiBBbHNvIGxlYXZlIGEgc3BhY2UgYmV0d2VlbiB0aGUgdW5hbGxvY2F0ZWQgcmVzZXJ2ZWQg bm9kZSBhZnRlciB0aGUKLQkgKiBHVFQgYW5kIGFueSBvYmplY3RzIHdpdGhpbiB0aGUgR1RULCBp LmUuIHdlIHVzZSB0aGUgY29sb3IgYWRqdXN0bWVudAotCSAqIHRvIGluc2VydCBhIGd1YXJkIHBh Z2UgdG8gcHJldmVudCBwcmVmZXRjaGVzIGNyb3NzaW5nIG92ZXIgdGhlCi0JICogR1RUIGJvdW5k YXJ5LgotCSAqLwotCW5vZGUgPSBsaXN0X25leHRfZW50cnkobm9kZSwgbm9kZV9saXN0KTsKLQlp ZiAobm9kZS0+Y29sb3IgIT0gY29sb3IpCi0JCSplbmQgLT0gSTkxNV9HVFRfUEFHRV9TSVpFOwot fQotCi1zdGF0aWMgaW50IGluaXRfYWxpYXNpbmdfcHBndHQoc3RydWN0IGk5MTVfZ2d0dCAqZ2d0 dCkKLXsKLQlzdHJ1Y3QgaTkxNV9wcGd0dCAqcHBndHQ7Ci0JaW50IGVycjsKLQotCXBwZ3R0ID0g aTkxNV9wcGd0dF9jcmVhdGUoZ2d0dC0+dm0uaTkxNSk7Ci0JaWYgKElTX0VSUihwcGd0dCkpCi0J CXJldHVybiBQVFJfRVJSKHBwZ3R0KTsKLQotCWlmIChHRU1fV0FSTl9PTihwcGd0dC0+dm0udG90 YWwgPCBnZ3R0LT52bS50b3RhbCkpIHsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBlcnJfcHBn dHQ7Ci0JfQotCi0JLyoKLQkgKiBOb3RlIHdlIG9ubHkgcHJlLWFsbG9jYXRlIGFzIGZhciBhcyB0 aGUgZW5kIG9mIHRoZSBnbG9iYWwKLQkgKiBHVFQuIE9uIDQ4YiAvIDQtbGV2ZWwgcGFnZS10YWJs ZXMsIHRoZSBkaWZmZXJlbmNlIGlzIHZlcnksCi0JICogdmVyeSBzaWduaWZpY2FudCEgV2UgaGF2 ZSB0byBwcmVhbGxvY2F0ZSBhcyBHVlQvdmdwdSBkb2VzCi0JICogbm90IGxpa2UgdGhlIHBhZ2Ug ZGlyZWN0b3J5IGRpc2FwcGVhcmluZy4KLQkgKi8KLQllcnIgPSBwcGd0dC0+dm0uYWxsb2NhdGVf dmFfcmFuZ2UoJnBwZ3R0LT52bSwgMCwgZ2d0dC0+dm0udG90YWwpOwotCWlmIChlcnIpCi0JCWdv dG8gZXJyX3BwZ3R0OwotCi0JZ2d0dC0+YWxpYXMgPSBwcGd0dDsKLQlnZ3R0LT52bS5iaW5kX2Fz eW5jX2ZsYWdzIHw9IHBwZ3R0LT52bS5iaW5kX2FzeW5jX2ZsYWdzOwotCi0JR0VNX0JVR19PTihn Z3R0LT52bS52bWFfb3BzLmJpbmRfdm1hICE9IGdndHRfYmluZF92bWEpOwotCWdndHQtPnZtLnZt YV9vcHMuYmluZF92bWEgPSBhbGlhc2luZ19ndHRfYmluZF92bWE7Ci0KLQlHRU1fQlVHX09OKGdn dHQtPnZtLnZtYV9vcHMudW5iaW5kX3ZtYSAhPSBnZ3R0X3VuYmluZF92bWEpOwotCWdndHQtPnZt LnZtYV9vcHMudW5iaW5kX3ZtYSA9IGFsaWFzaW5nX2d0dF91bmJpbmRfdm1hOwotCi0JcmV0dXJu IDA7Ci0KLWVycl9wcGd0dDoKLQlpOTE1X3ZtX3B1dCgmcHBndHQtPnZtKTsKLQlyZXR1cm4gZXJy OwotfQotCi1zdGF0aWMgdm9pZCBmaW5pX2FsaWFzaW5nX3BwZ3R0KHN0cnVjdCBpOTE1X2dndHQg KmdndHQpCi17Ci0Jc3RydWN0IGk5MTVfcHBndHQgKnBwZ3R0OwotCi0JcHBndHQgPSBmZXRjaF9h bmRfemVybygmZ2d0dC0+YWxpYXMpOwotCWlmICghcHBndHQpCi0JCXJldHVybjsKLQotCWk5MTVf dm1fcHV0KCZwcGd0dC0+dm0pOwotCi0JZ2d0dC0+dm0udm1hX29wcy5iaW5kX3ZtYSAgID0gZ2d0 dF9iaW5kX3ZtYTsKLQlnZ3R0LT52bS52bWFfb3BzLnVuYmluZF92bWEgPSBnZ3R0X3VuYmluZF92 bWE7Ci19Ci0KLXN0YXRpYyBpbnQgZ2d0dF9yZXNlcnZlX2d1Y190b3Aoc3RydWN0IGk5MTVfZ2d0 dCAqZ2d0dCkKLXsKLQl1NjQgc2l6ZTsKLQlpbnQgcmV0OwotCi0JaWYgKCFVU0VTX0dVQyhnZ3R0 LT52bS5pOTE1KSkKLQkJcmV0dXJuIDA7Ci0KLQlHRU1fQlVHX09OKGdndHQtPnZtLnRvdGFsIDw9 IEdVQ19HR1RUX1RPUCk7Ci0Jc2l6ZSA9IGdndHQtPnZtLnRvdGFsIC0gR1VDX0dHVFRfVE9QOwot Ci0JcmV0ID0gaTkxNV9nZW1fZ3R0X3Jlc2VydmUoJmdndHQtPnZtLCAmZ2d0dC0+dWNfZncsIHNp emUsCi0JCQkJICAgR1VDX0dHVFRfVE9QLCBJOTE1X0NPTE9SX1VORVZJQ1RBQkxFLAotCQkJCSAg IFBJTl9OT0VWSUNUKTsKLQlpZiAocmV0KQotCQlEUk1fREVCVUdfRFJJVkVSKCJGYWlsZWQgdG8g cmVzZXJ2ZSB0b3Agb2YgR0dUVCBmb3IgR3VDXG4iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0 YXRpYyB2b2lkIGdndHRfcmVsZWFzZV9ndWNfdG9wKHN0cnVjdCBpOTE1X2dndHQgKmdndHQpCi17 Ci0JaWYgKGRybV9tbV9ub2RlX2FsbG9jYXRlZCgmZ2d0dC0+dWNfZncpKQotCQlkcm1fbW1fcmVt b3ZlX25vZGUoJmdndHQtPnVjX2Z3KTsKLX0KLQotc3RhdGljIHZvaWQgY2xlYW51cF9pbml0X2dn dHQoc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCkKLXsKLQlnZ3R0X3JlbGVhc2VfZ3VjX3RvcChnZ3R0 KTsKLQlpZiAoZHJtX21tX25vZGVfYWxsb2NhdGVkKCZnZ3R0LT5lcnJvcl9jYXB0dXJlKSkKLQkJ ZHJtX21tX3JlbW92ZV9ub2RlKCZnZ3R0LT5lcnJvcl9jYXB0dXJlKTsKLX0KLQotc3RhdGljIGlu dCBpbml0X2dndHQoc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCkKLXsKLQkvKiBMZXQgR0VNIE1hbmFn ZSBhbGwgb2YgdGhlIGFwZXJ0dXJlLgotCSAqCi0JICogSG93ZXZlciwgbGVhdmUgb25lIHBhZ2Ug YXQgdGhlIGVuZCBzdGlsbCBib3VuZCB0byB0aGUgc2NyYXRjaCBwYWdlLgotCSAqIFRoZXJlIGFy ZSBhIG51bWJlciBvZiBwbGFjZXMgd2hlcmUgdGhlIGhhcmR3YXJlIGFwcGFyZW50bHkgcHJlZmV0 Y2hlcwotCSAqIHBhc3QgdGhlIGVuZCBvZiB0aGUgb2JqZWN0LCBhbmQgd2UndmUgc2VlbiBtdWx0 aXBsZSBoYW5ncyB3aXRoIHRoZQotCSAqIEdQVSBoZWFkIHBvaW50ZXIgc3R1Y2sgaW4gYSBiYXRj aGJ1ZmZlciBib3VuZCBhdCB0aGUgbGFzdCBwYWdlIG9mIHRoZQotCSAqIGFwZXJ0dXJlLiAgT25l IHBhZ2Ugc2hvdWxkIGJlIGVub3VnaCB0byBrZWVwIGFueSBwcmVmZXRjaGluZyBpbnNpZGUKLQkg KiBvZiB0aGUgYXBlcnR1cmUuCi0JICovCi0JdW5zaWduZWQgbG9uZyBob2xlX3N0YXJ0LCBob2xl X2VuZDsKLQlzdHJ1Y3QgZHJtX21tX25vZGUgKmVudHJ5OwotCWludCByZXQ7Ci0KLQkvKgotCSAq IEd1QyByZXF1aXJlcyBhbGwgcmVzb3VyY2VzIHRoYXQgd2UncmUgc2hhcmluZyB3aXRoIGl0IHRv IGJlIHBsYWNlZCBpbgotCSAqIG5vbi1XT1BDTSBtZW1vcnkuIElmIEd1QyBpcyBub3QgcHJlc2Vu dCBvciBub3QgaW4gdXNlIHdlIHN0aWxsIG5lZWQgYQotCSAqIHNtYWxsIGJpYXMgYXMgcmluZyB3 cmFwYXJvdW5kIGF0IG9mZnNldCAwIHNvbWV0aW1lcyBoYW5ncy4gTm8gaWRlYQotCSAqIHdoeS4K LQkgKi8KLQlnZ3R0LT5waW5fYmlhcyA9IG1heF90KHUzMiwgSTkxNV9HVFRfUEFHRV9TSVpFLAot CQkJICAgICAgIGludGVsX3dvcGNtX2d1Y19zaXplKCZnZ3R0LT52bS5pOTE1LT53b3BjbSkpOwot Ci0JcmV0ID0gaW50ZWxfdmd0X2JhbGxvb24oZ2d0dCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJl dDsKLQotCWlmIChnZ3R0LT5tYXBwYWJsZV9lbmQpIHsKLQkJLyogUmVzZXJ2ZSBhIG1hcHBhYmxl IHNsb3QgZm9yIG91ciBsb2NrbGVzcyBlcnJvciBjYXB0dXJlICovCi0JCXJldCA9IGRybV9tbV9p bnNlcnRfbm9kZV9pbl9yYW5nZSgmZ2d0dC0+dm0ubW0sICZnZ3R0LT5lcnJvcl9jYXB0dXJlLAot CQkJCQkJICBQQUdFX1NJWkUsIDAsIEk5MTVfQ09MT1JfVU5FVklDVEFCTEUsCi0JCQkJCQkgIDAs IGdndHQtPm1hcHBhYmxlX2VuZCwKLQkJCQkJCSAgRFJNX01NX0lOU0VSVF9MT1cpOwotCQlpZiAo cmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKgotCSAqIFRoZSB1cHBlciBwb3J0aW9uIG9m IHRoZSBHdUMgYWRkcmVzcyBzcGFjZSBoYXMgYSBzaXplYWJsZSBob2xlCi0JICogKHNldmVyYWwg TUIpIHRoYXQgaXMgaW5hY2Nlc3NpYmxlIGJ5IEd1Qy4gUmVzZXJ2ZSB0aGlzIHJhbmdlIHdpdGhp bgotCSAqIEdHVFQgYXMgaXQgY2FuIGNvbWZvcnRhYmx5IGhvbGQgR3VDL0h1QyBmaXJtd2FyZSBp bWFnZXMuCi0JICovCi0JcmV0ID0gZ2d0dF9yZXNlcnZlX2d1Y190b3AoZ2d0dCk7Ci0JaWYgKHJl dCkKLQkJZ290byBlcnI7Ci0KLQkvKiBDbGVhciBhbnkgbm9uLXByZWFsbG9jYXRlZCBibG9ja3Mg Ki8KLQlkcm1fbW1fZm9yX2VhY2hfaG9sZShlbnRyeSwgJmdndHQtPnZtLm1tLCBob2xlX3N0YXJ0 LCBob2xlX2VuZCkgewotCQlEUk1fREVCVUdfS01TKCJjbGVhcmluZyB1bnVzZWQgR1RUIHNwYWNl OiBbJWx4LCAlbHhdXG4iLAotCQkJICAgICAgaG9sZV9zdGFydCwgaG9sZV9lbmQpOwotCQlnZ3R0 LT52bS5jbGVhcl9yYW5nZSgmZ2d0dC0+dm0sIGhvbGVfc3RhcnQsCi0JCQkJICAgICBob2xlX2Vu ZCAtIGhvbGVfc3RhcnQpOwotCX0KLQotCS8qIEFuZCBmaW5hbGx5IGNsZWFyIHRoZSByZXNlcnZl ZCBndWFyZCBwYWdlICovCi0JZ2d0dC0+dm0uY2xlYXJfcmFuZ2UoJmdndHQtPnZtLCBnZ3R0LT52 bS50b3RhbCAtIFBBR0VfU0laRSwgUEFHRV9TSVpFKTsKLQotCXJldHVybiAwOwotCi1lcnI6Ci0J Y2xlYW51cF9pbml0X2dndHQoZ2d0dCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IGk5MTVfaW5p dF9nZ3R0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1KQotewotCWludCByZXQ7Ci0KLQly ZXQgPSBpbml0X2dndHQoJmk5MTUtPmdndHQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0K LQlpZiAoSU5URUxfUFBHVFQoaTkxNSkgPT0gSU5URUxfUFBHVFRfQUxJQVNJTkcpIHsKLQkJcmV0 ID0gaW5pdF9hbGlhc2luZ19wcGd0dCgmaTkxNS0+Z2d0dCk7Ci0JCWlmIChyZXQpCi0JCQljbGVh bnVwX2luaXRfZ2d0dCgmaTkxNS0+Z2d0dCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRp YyB2b2lkIGdndHRfY2xlYW51cF9odyhzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0KQotewotCXN0cnVj dCBpOTE1X3ZtYSAqdm1hLCAqdm47Ci0KLQlhdG9taWNfc2V0KCZnZ3R0LT52bS5vcGVuLCAwKTsK LQotCXJjdV9iYXJyaWVyKCk7IC8qIGZsdXNoIHRoZSBSQ1UnZWRfX2k5MTVfdm1fcmVsZWFzZSAq LwotCWZsdXNoX3dvcmtxdWV1ZShnZ3R0LT52bS5pOTE1LT53cSk7Ci0KLQltdXRleF9sb2NrKCZn Z3R0LT52bS5tdXRleCk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodm1hLCB2biwgJmdn dHQtPnZtLmJvdW5kX2xpc3QsIHZtX2xpbmspCi0JCVdBUk5fT04oX19pOTE1X3ZtYV91bmJpbmQo dm1hKSk7Ci0KLQlpZiAoZHJtX21tX25vZGVfYWxsb2NhdGVkKCZnZ3R0LT5lcnJvcl9jYXB0dXJl KSkKLQkJZHJtX21tX3JlbW92ZV9ub2RlKCZnZ3R0LT5lcnJvcl9jYXB0dXJlKTsKLQotCWdndHRf cmVsZWFzZV9ndWNfdG9wKGdndHQpOwotCWludGVsX3ZndF9kZWJhbGxvb24oZ2d0dCk7Ci0KLQln Z3R0LT52bS5jbGVhbnVwKCZnZ3R0LT52bSk7Ci0KLQltdXRleF91bmxvY2soJmdndHQtPnZtLm11 dGV4KTsKLQlpOTE1X2FkZHJlc3Nfc3BhY2VfZmluaSgmZ2d0dC0+dm0pOwotCi0JYXJjaF9waHlz X3djX2RlbChnZ3R0LT5tdHJyKTsKLQotCWlmIChnZ3R0LT5pb21hcC5zaXplKQotCQlpb19tYXBw aW5nX2ZpbmkoJmdndHQtPmlvbWFwKTsKLX0KLQotLyoqCi0gKiBpOTE1X2dndHRfZHJpdmVyX3Jl bGVhc2UgLSBDbGVhbiB1cCBHR1RUIGhhcmR3YXJlIGluaXRpYWxpemF0aW9uCi0gKiBAaTkxNTog aTkxNSBkZXZpY2UKLSAqLwotdm9pZCBpOTE1X2dndHRfZHJpdmVyX3JlbGVhc2Uoc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmk5MTUpCi17Ci0Jc3RydWN0IHBhZ2V2ZWMgKnB2ZWM7Ci0KLQlmaW5p X2FsaWFzaW5nX3BwZ3R0KCZpOTE1LT5nZ3R0KTsKLQotCWdndHRfY2xlYW51cF9odygmaTkxNS0+ Z2d0dCk7Ci0KLQlwdmVjID0gJmk5MTUtPm1tLndjX3N0YXNoLnB2ZWM7Ci0JaWYgKHB2ZWMtPm5y KSB7Ci0JCXNldF9wYWdlc19hcnJheV93YihwdmVjLT5wYWdlcywgcHZlYy0+bnIpOwotCQlfX3Bh Z2V2ZWNfcmVsZWFzZShwdmVjKTsKLQl9Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZ2VuNl9n ZXRfdG90YWxfZ3R0X3NpemUodTE2IHNuYl9nbWNoX2N0bCkKLXsKLQlzbmJfZ21jaF9jdGwgPj49 IFNOQl9HTUNIX0dHTVNfU0hJRlQ7Ci0Jc25iX2dtY2hfY3RsICY9IFNOQl9HTUNIX0dHTVNfTUFT SzsKLQlyZXR1cm4gc25iX2dtY2hfY3RsIDw8IDIwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50 IGdlbjhfZ2V0X3RvdGFsX2d0dF9zaXplKHUxNiBiZHdfZ21jaF9jdGwpCi17Ci0JYmR3X2dtY2hf Y3RsID4+PSBCRFdfR01DSF9HR01TX1NISUZUOwotCWJkd19nbWNoX2N0bCAmPSBCRFdfR01DSF9H R01TX01BU0s7Ci0JaWYgKGJkd19nbWNoX2N0bCkKLQkJYmR3X2dtY2hfY3RsID0gMSA8PCBiZHdf Z21jaF9jdGw7Ci0KLSNpZmRlZiBDT05GSUdfWDg2XzMyCi0JLyogTGltaXQgMzJiIHBsYXRmb3Jt cyB0byBhIDJHQiBHR1RUOiA0IDw8IDIwIC8gcHRlIHNpemUgKiBJOTE1X0dUVF9QQUdFX1NJWkUg Ki8KLQlpZiAoYmR3X2dtY2hfY3RsID4gNCkKLQkJYmR3X2dtY2hfY3RsID0gNDsKLSNlbmRpZgot Ci0JcmV0dXJuIGJkd19nbWNoX2N0bCA8PCAyMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBj aHZfZ2V0X3RvdGFsX2d0dF9zaXplKHUxNiBnbWNoX2N0cmwpCi17Ci0JZ21jaF9jdHJsID4+PSBT TkJfR01DSF9HR01TX1NISUZUOwotCWdtY2hfY3RybCAmPSBTTkJfR01DSF9HR01TX01BU0s7Ci0K LQlpZiAoZ21jaF9jdHJsKQotCQlyZXR1cm4gMSA8PCAoMjAgKyBnbWNoX2N0cmwpOwotCi0JcmV0 dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZ2d0dF9wcm9iZV9jb21tb24oc3RydWN0IGk5MTVfZ2d0 dCAqZ2d0dCwgdTY0IHNpemUpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2 ID0gZ2d0dC0+dm0uaTkxNTsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldl9wcml2LT5kcm0u cGRldjsKLQlwaHlzX2FkZHJfdCBwaHlzX2FkZHI7Ci0JaW50IHJldDsKLQotCS8qIEZvciBNb2Rl cm4gR0VOcyB0aGUgUFRFcyBhbmQgcmVnaXN0ZXIgc3BhY2UgYXJlIHNwbGl0IGluIHRoZSBCQVIg Ki8KLQlwaHlzX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCkgKyBwY2lfcmVzb3Vy Y2VfbGVuKHBkZXYsIDApIC8gMjsKLQotCS8qCi0JICogT24gQlhUKy9DTkwrIHdyaXRlcyBsYXJn ZXIgdGhhbiA2NCBiaXQgdG8gdGhlIEdUVCBwYWdldGFibGUgcmFuZ2UKLQkgKiB3aWxsIGJlIGRy b3BwZWQuIEZvciBXQyBtYXBwaW5ncyBpbiBnZW5lcmFsIHdlIGhhdmUgNjQgYnl0ZSBidXJzdAot CSAqIHdyaXRlcyB3aGVuIHRoZSBXQyBidWZmZXIgaXMgZmx1c2hlZCwgc28gd2UgY2FuJ3QgdXNl IGl0LCBidXQgaGF2ZSB0bwotCSAqIHJlc29ydCB0byBhbiB1bmNhY2hlZCBtYXBwaW5nLiBUaGUg V0MgaXNzdWUgaXMgZWFzaWx5IGNhdWdodCBieSB0aGUKLQkgKiByZWFkYmFjayBjaGVjayB3aGVu IHdyaXRpbmcgR1RUIFBURSBlbnRyaWVzLgotCSAqLwotCWlmIChJU19HRU45X0xQKGRldl9wcml2 KSB8fCBJTlRFTF9HRU4oZGV2X3ByaXYpID49IDEwKQotCQlnZ3R0LT5nc20gPSBpb3JlbWFwX25v Y2FjaGUocGh5c19hZGRyLCBzaXplKTsKLQllbHNlCi0JCWdndHQtPmdzbSA9IGlvcmVtYXBfd2Mo cGh5c19hZGRyLCBzaXplKTsKLQlpZiAoIWdndHQtPmdzbSkgewotCQlEUk1fRVJST1IoIkZhaWxl ZCB0byBtYXAgdGhlIGdndHQgcGFnZSB0YWJsZVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0K LQotCXJldCA9IHNldHVwX3NjcmF0Y2hfcGFnZSgmZ2d0dC0+dm0sIEdGUF9ETUEzMik7Ci0JaWYg KHJldCkgewotCQlEUk1fRVJST1IoIlNjcmF0Y2ggc2V0dXAgZmFpbGVkXG4iKTsKLQkJLyogaW91 bm1hcCB3aWxsIGFsc28gZ2V0IGNhbGxlZCBhdCByZW1vdmUsIGJ1dCBtZWggKi8KLQkJaW91bm1h cChnZ3R0LT5nc20pOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWdndHQtPnZtLnNjcmF0Y2hbMF0u ZW5jb2RlID0KLQkJZ2d0dC0+dm0ucHRlX2VuY29kZShweF9kbWEoJmdndHQtPnZtLnNjcmF0Y2hb MF0pLAotCQkJCSAgICBJOTE1X0NBQ0hFX05PTkUsIDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0 YXRpYyB2b2lkIHRnbF9zZXR1cF9wcml2YXRlX3BwYXQoc3RydWN0IGludGVsX3VuY29yZSAqdW5j b3JlKQotewotCS8qIFRHTCBkb2Vzbid0IHN1cHBvcnQgTExDIG9yIEFHRSBzZXR0aW5ncyAqLwot CWludGVsX3VuY29yZV93cml0ZSh1bmNvcmUsIEdFTjEyX1BBVF9JTkRFWCgwKSwgR0VOOF9QUEFU X1dCKTsKLQlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLCBHRU4xMl9QQVRfSU5ERVgoMSksIEdF TjhfUFBBVF9XQyk7Ci0JaW50ZWxfdW5jb3JlX3dyaXRlKHVuY29yZSwgR0VOMTJfUEFUX0lOREVY KDIpLCBHRU44X1BQQVRfV1QpOwotCWludGVsX3VuY29yZV93cml0ZSh1bmNvcmUsIEdFTjEyX1BB VF9JTkRFWCgzKSwgR0VOOF9QUEFUX1VDKTsKLQlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLCBH RU4xMl9QQVRfSU5ERVgoNCksIEdFTjhfUFBBVF9XQik7Ci0JaW50ZWxfdW5jb3JlX3dyaXRlKHVu Y29yZSwgR0VOMTJfUEFUX0lOREVYKDUpLCBHRU44X1BQQVRfV0IpOwotCWludGVsX3VuY29yZV93 cml0ZSh1bmNvcmUsIEdFTjEyX1BBVF9JTkRFWCg2KSwgR0VOOF9QUEFUX1dCKTsKLQlpbnRlbF91 bmNvcmVfd3JpdGUodW5jb3JlLCBHRU4xMl9QQVRfSU5ERVgoNyksIEdFTjhfUFBBVF9XQik7Ci19 Ci0KLXN0YXRpYyB2b2lkIGNubF9zZXR1cF9wcml2YXRlX3BwYXQoc3RydWN0IGludGVsX3VuY29y ZSAqdW5jb3JlKQotewotCWludGVsX3VuY29yZV93cml0ZSh1bmNvcmUsCi0JCQkgICBHRU4xMF9Q QVRfSU5ERVgoMCksCi0JCQkgICBHRU44X1BQQVRfV0IgfCBHRU44X1BQQVRfTExDKTsKLQlpbnRl bF91bmNvcmVfd3JpdGUodW5jb3JlLAotCQkJICAgR0VOMTBfUEFUX0lOREVYKDEpLAotCQkJICAg R0VOOF9QUEFUX1dDIHwgR0VOOF9QUEFUX0xMQ0VMTEMpOwotCWludGVsX3VuY29yZV93cml0ZSh1 bmNvcmUsCi0JCQkgICBHRU4xMF9QQVRfSU5ERVgoMiksCi0JCQkgICBHRU44X1BQQVRfV1QgfCBH RU44X1BQQVRfTExDRUxMQyk7Ci0JaW50ZWxfdW5jb3JlX3dyaXRlKHVuY29yZSwKLQkJCSAgIEdF TjEwX1BBVF9JTkRFWCgzKSwKLQkJCSAgIEdFTjhfUFBBVF9VQyk7Ci0JaW50ZWxfdW5jb3JlX3dy aXRlKHVuY29yZSwKLQkJCSAgIEdFTjEwX1BBVF9JTkRFWCg0KSwKLQkJCSAgIEdFTjhfUFBBVF9X QiB8IEdFTjhfUFBBVF9MTENFTExDIHwgR0VOOF9QUEFUX0FHRSgwKSk7Ci0JaW50ZWxfdW5jb3Jl X3dyaXRlKHVuY29yZSwKLQkJCSAgIEdFTjEwX1BBVF9JTkRFWCg1KSwKLQkJCSAgIEdFTjhfUFBB VF9XQiB8IEdFTjhfUFBBVF9MTENFTExDIHwgR0VOOF9QUEFUX0FHRSgxKSk7Ci0JaW50ZWxfdW5j b3JlX3dyaXRlKHVuY29yZSwKLQkJCSAgIEdFTjEwX1BBVF9JTkRFWCg2KSwKLQkJCSAgIEdFTjhf UFBBVF9XQiB8IEdFTjhfUFBBVF9MTENFTExDIHwgR0VOOF9QUEFUX0FHRSgyKSk7Ci0JaW50ZWxf dW5jb3JlX3dyaXRlKHVuY29yZSwKLQkJCSAgIEdFTjEwX1BBVF9JTkRFWCg3KSwKLQkJCSAgIEdF TjhfUFBBVF9XQiB8IEdFTjhfUFBBVF9MTENFTExDIHwgR0VOOF9QUEFUX0FHRSgzKSk7Ci19Ci0K LS8qIFRoZSBHR1RUIGFuZCBQUEdUVCBuZWVkIGEgcHJpdmF0ZSBQUEFUIHNldHVwIGluIG9yZGVy IHRvIGhhbmRsZSBjYWNoZWFiaWxpdHkKLSAqIGJpdHMuIFdoZW4gdXNpbmcgYWR2YW5jZWQgY29u dGV4dHMgZWFjaCBjb250ZXh0IHN0b3JlcyBpdHMgb3duIFBBVCwgYnV0Ci0gKiB3cml0aW5nIHRo aXMgZGF0YSBzaG91bGRuJ3QgYmUgaGFybWZ1bCBldmVuIGluIHRob3NlIGNhc2VzLiAqLwotc3Rh dGljIHZvaWQgYmR3X3NldHVwX3ByaXZhdGVfcHBhdChzdHJ1Y3QgaW50ZWxfdW5jb3JlICp1bmNv cmUpCi17Ci0JdTY0IHBhdDsKLQotCXBhdCA9IEdFTjhfUFBBVCgwLCBHRU44X1BQQVRfV0IgfCBH RU44X1BQQVRfTExDKSB8CS8qIGZvciBub3JtYWwgb2JqZWN0cywgbm8gZUxMQyAqLwotCSAgICAg IEdFTjhfUFBBVCgxLCBHRU44X1BQQVRfV0MgfCBHRU44X1BQQVRfTExDRUxMQykgfAkvKiBmb3Ig c29tZXRoaW5nIHBvaW50aW5nIHRvIHB0ZXM/ICovCi0JICAgICAgR0VOOF9QUEFUKDIsIEdFTjhf UFBBVF9XVCB8IEdFTjhfUFBBVF9MTENFTExDKSB8CS8qIGZvciBzY2Fub3V0IHdpdGggZUxMQyAq LwotCSAgICAgIEdFTjhfUFBBVCgzLCBHRU44X1BQQVRfVUMpIHwJCQkvKiBVbmNhY2hlZCBvYmpl Y3RzLCBtb3N0bHkgZm9yIHNjYW5vdXQgKi8KLQkgICAgICBHRU44X1BQQVQoNCwgR0VOOF9QUEFU X1dCIHwgR0VOOF9QUEFUX0xMQ0VMTEMgfCBHRU44X1BQQVRfQUdFKDApKSB8Ci0JICAgICAgR0VO OF9QUEFUKDUsIEdFTjhfUFBBVF9XQiB8IEdFTjhfUFBBVF9MTENFTExDIHwgR0VOOF9QUEFUX0FH RSgxKSkgfAotCSAgICAgIEdFTjhfUFBBVCg2LCBHRU44X1BQQVRfV0IgfCBHRU44X1BQQVRfTExD RUxMQyB8IEdFTjhfUFBBVF9BR0UoMikpIHwKLQkgICAgICBHRU44X1BQQVQoNywgR0VOOF9QUEFU X1dCIHwgR0VOOF9QUEFUX0xMQ0VMTEMgfCBHRU44X1BQQVRfQUdFKDMpKTsKLQotCWludGVsX3Vu Y29yZV93cml0ZSh1bmNvcmUsIEdFTjhfUFJJVkFURV9QQVRfTE8sIGxvd2VyXzMyX2JpdHMocGF0 KSk7Ci0JaW50ZWxfdW5jb3JlX3dyaXRlKHVuY29yZSwgR0VOOF9QUklWQVRFX1BBVF9ISSwgdXBw ZXJfMzJfYml0cyhwYXQpKTsKLX0KLQotc3RhdGljIHZvaWQgY2h2X3NldHVwX3ByaXZhdGVfcHBh dChzdHJ1Y3QgaW50ZWxfdW5jb3JlICp1bmNvcmUpCi17Ci0JdTY0IHBhdDsKLQotCS8qCi0JICog TWFwIFdCIG9uIEJEVyB0byBzbm9vcGVkIG9uIENIVi4KLQkgKgotCSAqIE9ubHkgdGhlIHNub29w IGJpdCBoYXMgbWVhbmluZyBmb3IgQ0hWLCB0aGUgcmVzdCBpcwotCSAqIGlnbm9yZWQuCi0JICoK LQkgKiBUaGUgaGFyZHdhcmUgd2lsbCBuZXZlciBzbm9vcCBmb3IgY2VydGFpbiB0eXBlcyBvZiBh Y2Nlc3NlczoKLQkgKiAtIENQVSBHVFQgKEdNQURSLT5HR1RULT5ubyBzbm9vcC0+bWVtb3J5KQot CSAqIC0gUFBHVFQgcGFnZSB0YWJsZXMKLQkgKiAtIHNvbWUgb3RoZXIgc3BlY2lhbCBjeWNsZXMK LQkgKgotCSAqIEFzIHdpdGggQkRXLCB3ZSBhbHNvIG5lZWQgdG8gY29uc2lkZXIgdGhlIGZvbGxv d2luZyBmb3IgR1QgYWNjZXNzZXM6Ci0JICogIkZvciBHR1RULCB0aGVyZSBpcyBOTyBwYXRfc2Vs WzI6MF0gZnJvbSB0aGUgZW50cnksCi0JICogc28gUlRMIHdpbGwgYWx3YXlzIHVzZSB0aGUgdmFs dWUgY29ycmVzcG9uZGluZyB0bwotCSAqIHBhdF9zZWwgPSAwMDAiLgotCSAqIFdoaWNoIG1lYW5z IHdlIG11c3Qgc2V0IHRoZSBzbm9vcCBiaXQgaW4gUEFUIGVudHJ5IDAKLQkgKiBpbiBvcmRlciB0 byBrZWVwIHRoZSBnbG9iYWwgc3RhdHVzIHBhZ2Ugd29ya2luZy4KLQkgKi8KLQotCXBhdCA9IEdF TjhfUFBBVCgwLCBDSFZfUFBBVF9TTk9PUCkgfAotCSAgICAgIEdFTjhfUFBBVCgxLCAwKSB8Ci0J ICAgICAgR0VOOF9QUEFUKDIsIDApIHwKLQkgICAgICBHRU44X1BQQVQoMywgMCkgfAotCSAgICAg IEdFTjhfUFBBVCg0LCBDSFZfUFBBVF9TTk9PUCkgfAotCSAgICAgIEdFTjhfUFBBVCg1LCBDSFZf UFBBVF9TTk9PUCkgfAotCSAgICAgIEdFTjhfUFBBVCg2LCBDSFZfUFBBVF9TTk9PUCkgfAotCSAg ICAgIEdFTjhfUFBBVCg3LCBDSFZfUFBBVF9TTk9PUCk7Ci0KLQlpbnRlbF91bmNvcmVfd3JpdGUo dW5jb3JlLCBHRU44X1BSSVZBVEVfUEFUX0xPLCBsb3dlcl8zMl9iaXRzKHBhdCkpOwotCWludGVs X3VuY29yZV93cml0ZSh1bmNvcmUsIEdFTjhfUFJJVkFURV9QQVRfSEksIHVwcGVyXzMyX2JpdHMo cGF0KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGdlbjZfZ21jaF9yZW1vdmUoc3RydWN0IGk5MTVfYWRk cmVzc19zcGFjZSAqdm0pCi17Ci0Jc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCA9IGk5MTVfdm1fdG9f Z2d0dCh2bSk7Ci0KLQlpb3VubWFwKGdndHQtPmdzbSk7Ci0JY2xlYW51cF9zY3JhdGNoX3BhZ2Uo dm0pOwotfQotCi1zdGF0aWMgdm9pZCBzZXR1cF9wcml2YXRlX3BhdChzdHJ1Y3QgaW50ZWxfdW5j b3JlICp1bmNvcmUpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSB1bmNvcmUt Pmk5MTU7Ci0KLQlHRU1fQlVHX09OKElOVEVMX0dFTihpOTE1KSA8IDgpOwotCi0JaWYgKElOVEVM X0dFTihpOTE1KSA+PSAxMikKLQkJdGdsX3NldHVwX3ByaXZhdGVfcHBhdCh1bmNvcmUpOwotCWVs c2UgaWYgKElOVEVMX0dFTihpOTE1KSA+PSAxMCkKLQkJY25sX3NldHVwX3ByaXZhdGVfcHBhdCh1 bmNvcmUpOwotCWVsc2UgaWYgKElTX0NIRVJSWVZJRVcoaTkxNSkgfHwgSVNfR0VOOV9MUChpOTE1 KSkKLQkJY2h2X3NldHVwX3ByaXZhdGVfcHBhdCh1bmNvcmUpOwotCWVsc2UKLQkJYmR3X3NldHVw X3ByaXZhdGVfcHBhdCh1bmNvcmUpOwotfQotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHBjaV9y ZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJhcikKLXsKLQlyZXR1cm4gKHN0cnVj dCByZXNvdXJjZSlERUZJTkVfUkVTX01FTShwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgYmFyKSwK LQkJCQkJICAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgYmFyKSk7Ci19Ci0KLXN0YXRpYyBp bnQgZ2VuOF9nbWNoX3Byb2JlKHN0cnVjdCBpOTE1X2dndHQgKmdndHQpCi17Ci0Jc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZ2d0dC0+dm0uaTkxNTsKLQlzdHJ1Y3QgcGNpX2Rl diAqcGRldiA9IGRldl9wcml2LT5kcm0ucGRldjsKLQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQl1MTYg c25iX2dtY2hfY3RsOwotCWludCBlcnI7Ci0KLQkvKiBUT0RPOiBXZSdyZSBub3QgYXdhcmUgb2Yg bWFwcGFibGUgY29uc3RyYWludHMgb24gZ2VuOCB5ZXQgKi8KLQlpZiAoIUlTX0RHRlgoZGV2X3By aXYpKSB7Ci0JCWdndHQtPmdtYWRyID0gcGNpX3Jlc291cmNlKHBkZXYsIDIpOwotCQlnZ3R0LT5t YXBwYWJsZV9lbmQgPSByZXNvdXJjZV9zaXplKCZnZ3R0LT5nbWFkcik7Ci0JfQotCi0JZXJyID0g cGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzkpKTsKLQlpZiAoIWVycikKLQkJ ZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzOSkp OwotCWlmIChlcnIpCi0JCURSTV9FUlJPUigiQ2FuJ3Qgc2V0IERNQSBtYXNrL2NvbnNpc3RlbnQg bWFzayAoJWQpXG4iLCBlcnIpOwotCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgU05CX0dN Q0hfQ1RSTCwgJnNuYl9nbWNoX2N0bCk7Ci0JaWYgKElTX0NIRVJSWVZJRVcoZGV2X3ByaXYpKQot CQlzaXplID0gY2h2X2dldF90b3RhbF9ndHRfc2l6ZShzbmJfZ21jaF9jdGwpOwotCWVsc2UKLQkJ c2l6ZSA9IGdlbjhfZ2V0X3RvdGFsX2d0dF9zaXplKHNuYl9nbWNoX2N0bCk7Ci0KLQlnZ3R0LT52 bS50b3RhbCA9IChzaXplIC8gc2l6ZW9mKGdlbjhfcHRlX3QpKSAqIEk5MTVfR1RUX1BBR0VfU0la RTsKLQlnZ3R0LT52bS5jbGVhbnVwID0gZ2VuNl9nbWNoX3JlbW92ZTsKLQlnZ3R0LT52bS5pbnNl cnRfcGFnZSA9IGdlbjhfZ2d0dF9pbnNlcnRfcGFnZTsKLQlnZ3R0LT52bS5jbGVhcl9yYW5nZSA9 IG5vcF9jbGVhcl9yYW5nZTsKLQlpZiAoaW50ZWxfc2Nhbm91dF9uZWVkc192dGRfd2EoZGV2X3By aXYpKQotCQlnZ3R0LT52bS5jbGVhcl9yYW5nZSA9IGdlbjhfZ2d0dF9jbGVhcl9yYW5nZTsKLQot CWdndHQtPnZtLmluc2VydF9lbnRyaWVzID0gZ2VuOF9nZ3R0X2luc2VydF9lbnRyaWVzOwotCi0J LyogU2VyaWFsaXplIEdUVCB1cGRhdGVzIHdpdGggYXBlcnR1cmUgYWNjZXNzIG9uIEJYVCBpZiBW VC1kIGlzIG9uLiAqLwotCWlmIChpbnRlbF9nZ3R0X3VwZGF0ZV9uZWVkc192dGRfd2EoZGV2X3By aXYpIHx8Ci0JICAgIElTX0NIRVJSWVZJRVcoZGV2X3ByaXYpIC8qIGZhaWxzIHdpdGggY29uY3Vy cmVudCB1c2UvdXBkYXRlICovKSB7Ci0JCWdndHQtPnZtLmluc2VydF9lbnRyaWVzID0gYnh0X3Z0 ZF9nZ3R0X2luc2VydF9lbnRyaWVzX19CS0w7Ci0JCWdndHQtPnZtLmluc2VydF9wYWdlICAgID0g Ynh0X3Z0ZF9nZ3R0X2luc2VydF9wYWdlX19CS0w7Ci0JCWlmIChnZ3R0LT52bS5jbGVhcl9yYW5n ZSAhPSBub3BfY2xlYXJfcmFuZ2UpCi0JCQlnZ3R0LT52bS5jbGVhcl9yYW5nZSA9IGJ4dF92dGRf Z2d0dF9jbGVhcl9yYW5nZV9fQktMOwotCX0KLQotCWdndHQtPmludmFsaWRhdGUgPSBnZW44X2dn dHRfaW52YWxpZGF0ZTsKLQotCWdndHQtPnZtLnZtYV9vcHMuYmluZF92bWEgICAgPSBnZ3R0X2Jp bmRfdm1hOwotCWdndHQtPnZtLnZtYV9vcHMudW5iaW5kX3ZtYSAgPSBnZ3R0X3VuYmluZF92bWE7 Ci0JZ2d0dC0+dm0udm1hX29wcy5zZXRfcGFnZXMgICA9IGdndHRfc2V0X3BhZ2VzOwotCWdndHQt PnZtLnZtYV9vcHMuY2xlYXJfcGFnZXMgPSBjbGVhcl9wYWdlczsKLQotCWdndHQtPnZtLnB0ZV9l bmNvZGUgPSBnZW44X3B0ZV9lbmNvZGU7Ci0KLQlzZXR1cF9wcml2YXRlX3BhdChnZ3R0LT52bS5n dC0+dW5jb3JlKTsKLQotCXJldHVybiBnZ3R0X3Byb2JlX2NvbW1vbihnZ3R0LCBzaXplKTsKLX0K LQotc3RhdGljIGludCBnZW42X2dtY2hfcHJvYmUoc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCkKLXsK LQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBnZ3R0LT52bS5pOTE1OwotCXN0 cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2X3ByaXYtPmRybS5wZGV2OwotCXVuc2lnbmVkIGludCBz aXplOwotCXUxNiBzbmJfZ21jaF9jdGw7Ci0JaW50IGVycjsKLQotCWdndHQtPmdtYWRyID0KLQkJ KHN0cnVjdCByZXNvdXJjZSkgREVGSU5FX1JFU19NRU0ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYs IDIpLAotCQkJCQkJIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMikpOwotCWdndHQtPm1hcHBhYmxl X2VuZCA9IHJlc291cmNlX3NpemUoJmdndHQtPmdtYWRyKTsKLQotCS8qIDY0LzUxMk1CIGlzIHRo ZSBjdXJyZW50IG1pbi9tYXggd2UgYWN0dWFsbHkga25vdyBvZiwgYnV0IHRoaXMgaXMganVzdAot CSAqIGEgY29hcnNlIHNhbml0eSBjaGVjay4KLQkgKi8KLQlpZiAoZ2d0dC0+bWFwcGFibGVfZW5k IDwgKDY0PDwyMCkgfHwgZ2d0dC0+bWFwcGFibGVfZW5kID4gKDUxMjw8MjApKSB7Ci0JCURSTV9F UlJPUigiVW5rbm93biBHTUFEUiBzaXplICglcGEpXG4iLCAmZ2d0dC0+bWFwcGFibGVfZW5kKTsK LQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERN QV9CSVRfTUFTSyg0MCkpOwotCWlmICghZXJyKQotCQllcnIgPSBwY2lfc2V0X2NvbnNpc3RlbnRf ZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDQwKSk7Ci0JaWYgKGVycikKLQkJRFJNX0VSUk9S KCJDYW4ndCBzZXQgRE1BIG1hc2svY29uc2lzdGVudCBtYXNrICglZClcbiIsIGVycik7Ci0JcGNp X3JlYWRfY29uZmlnX3dvcmQocGRldiwgU05CX0dNQ0hfQ1RSTCwgJnNuYl9nbWNoX2N0bCk7Ci0K LQlzaXplID0gZ2VuNl9nZXRfdG90YWxfZ3R0X3NpemUoc25iX2dtY2hfY3RsKTsKLQlnZ3R0LT52 bS50b3RhbCA9IChzaXplIC8gc2l6ZW9mKGdlbjZfcHRlX3QpKSAqIEk5MTVfR1RUX1BBR0VfU0la RTsKLQotCWdndHQtPnZtLmNsZWFyX3JhbmdlID0gbm9wX2NsZWFyX3JhbmdlOwotCWlmICghSEFT X0ZVTExfUFBHVFQoZGV2X3ByaXYpIHx8IGludGVsX3NjYW5vdXRfbmVlZHNfdnRkX3dhKGRldl9w cml2KSkKLQkJZ2d0dC0+dm0uY2xlYXJfcmFuZ2UgPSBnZW42X2dndHRfY2xlYXJfcmFuZ2U7Ci0J Z2d0dC0+dm0uaW5zZXJ0X3BhZ2UgPSBnZW42X2dndHRfaW5zZXJ0X3BhZ2U7Ci0JZ2d0dC0+dm0u aW5zZXJ0X2VudHJpZXMgPSBnZW42X2dndHRfaW5zZXJ0X2VudHJpZXM7Ci0JZ2d0dC0+dm0uY2xl YW51cCA9IGdlbjZfZ21jaF9yZW1vdmU7Ci0KLQlnZ3R0LT5pbnZhbGlkYXRlID0gZ2VuNl9nZ3R0 X2ludmFsaWRhdGU7Ci0KLQlpZiAoSEFTX0VEUkFNKGRldl9wcml2KSkKLQkJZ2d0dC0+dm0ucHRl X2VuY29kZSA9IGlyaXNfcHRlX2VuY29kZTsKLQllbHNlIGlmIChJU19IQVNXRUxMKGRldl9wcml2 KSkKLQkJZ2d0dC0+dm0ucHRlX2VuY29kZSA9IGhzd19wdGVfZW5jb2RlOwotCWVsc2UgaWYgKElT X1ZBTExFWVZJRVcoZGV2X3ByaXYpKQotCQlnZ3R0LT52bS5wdGVfZW5jb2RlID0gYnl0X3B0ZV9l bmNvZGU7Ci0JZWxzZSBpZiAoSU5URUxfR0VOKGRldl9wcml2KSA+PSA3KQotCQlnZ3R0LT52bS5w dGVfZW5jb2RlID0gaXZiX3B0ZV9lbmNvZGU7Ci0JZWxzZQotCQlnZ3R0LT52bS5wdGVfZW5jb2Rl ID0gc25iX3B0ZV9lbmNvZGU7Ci0KLQlnZ3R0LT52bS52bWFfb3BzLmJpbmRfdm1hICAgID0gZ2d0 dF9iaW5kX3ZtYTsKLQlnZ3R0LT52bS52bWFfb3BzLnVuYmluZF92bWEgID0gZ2d0dF91bmJpbmRf dm1hOwotCWdndHQtPnZtLnZtYV9vcHMuc2V0X3BhZ2VzICAgPSBnZ3R0X3NldF9wYWdlczsKLQln Z3R0LT52bS52bWFfb3BzLmNsZWFyX3BhZ2VzID0gY2xlYXJfcGFnZXM7Ci0KLQlyZXR1cm4gZ2d0 dF9wcm9iZV9jb21tb24oZ2d0dCwgc2l6ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGk5MTVfZ21jaF9y ZW1vdmUoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pCi17Ci0JaW50ZWxfZ21jaF9yZW1v dmUoKTsKLX0KLQotc3RhdGljIGludCBpOTE1X2dtY2hfcHJvYmUoc3RydWN0IGk5MTVfZ2d0dCAq Z2d0dCkKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBnZ3R0LT52bS5p OTE1OwotCXBoeXNfYWRkcl90IGdtYWRyX2Jhc2U7Ci0JaW50IHJldDsKLQotCXJldCA9IGludGVs X2dtY2hfcHJvYmUoZGV2X3ByaXYtPmJyaWRnZV9kZXYsIGRldl9wcml2LT5kcm0ucGRldiwgTlVM TCk7Ci0JaWYgKCFyZXQpIHsKLQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gc2V0IHVwIGdtY2hcbiIp OwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlpbnRlbF9ndHRfZ2V0KCZnZ3R0LT52bS50b3RhbCwg JmdtYWRyX2Jhc2UsICZnZ3R0LT5tYXBwYWJsZV9lbmQpOwotCi0JZ2d0dC0+Z21hZHIgPQotCQko c3RydWN0IHJlc291cmNlKSBERUZJTkVfUkVTX01FTShnbWFkcl9iYXNlLAotCQkJCQkJIGdndHQt Pm1hcHBhYmxlX2VuZCk7Ci0KLQlnZ3R0LT5kb19pZGxlX21hcHMgPSBuZWVkc19pZGxlX21hcHMo ZGV2X3ByaXYpOwotCWdndHQtPnZtLmluc2VydF9wYWdlID0gaTkxNV9nZ3R0X2luc2VydF9wYWdl OwotCWdndHQtPnZtLmluc2VydF9lbnRyaWVzID0gaTkxNV9nZ3R0X2luc2VydF9lbnRyaWVzOwot CWdndHQtPnZtLmNsZWFyX3JhbmdlID0gaTkxNV9nZ3R0X2NsZWFyX3JhbmdlOwotCWdndHQtPnZt LmNsZWFudXAgPSBpOTE1X2dtY2hfcmVtb3ZlOwotCi0JZ2d0dC0+aW52YWxpZGF0ZSA9IGdtY2hf Z2d0dF9pbnZhbGlkYXRlOwotCi0JZ2d0dC0+dm0udm1hX29wcy5iaW5kX3ZtYSAgICA9IGdndHRf YmluZF92bWE7Ci0JZ2d0dC0+dm0udm1hX29wcy51bmJpbmRfdm1hICA9IGdndHRfdW5iaW5kX3Zt YTsKLQlnZ3R0LT52bS52bWFfb3BzLnNldF9wYWdlcyAgID0gZ2d0dF9zZXRfcGFnZXM7Ci0JZ2d0 dC0+dm0udm1hX29wcy5jbGVhcl9wYWdlcyA9IGNsZWFyX3BhZ2VzOwotCi0JaWYgKHVubGlrZWx5 KGdndHQtPmRvX2lkbGVfbWFwcykpCi0JCWRldl9ub3RpY2UoZGV2X3ByaXYtPmRybS5kZXYsCi0J CQkgICAiQXBwbHlpbmcgSXJvbmxha2UgcXVpcmtzIGZvciBpbnRlbF9pb21tdVxuIik7Ci0KLQly ZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBnZ3R0X3Byb2JlX2h3KHN0cnVjdCBpOTE1X2dndHQg KmdndHQsIHN0cnVjdCBpbnRlbF9ndCAqZ3QpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg Kmk5MTUgPSBndC0+aTkxNTsKLQlpbnQgcmV0OwotCi0JZ2d0dC0+dm0uZ3QgPSBndDsKLQlnZ3R0 LT52bS5pOTE1ID0gaTkxNTsKLQlnZ3R0LT52bS5kbWEgPSAmaTkxNS0+ZHJtLnBkZXYtPmRldjsK LQotCWlmIChJTlRFTF9HRU4oaTkxNSkgPD0gNSkKLQkJcmV0ID0gaTkxNV9nbWNoX3Byb2JlKGdn dHQpOwotCWVsc2UgaWYgKElOVEVMX0dFTihpOTE1KSA8IDgpCi0JCXJldCA9IGdlbjZfZ21jaF9w cm9iZShnZ3R0KTsKLQllbHNlCi0JCXJldCA9IGdlbjhfZ21jaF9wcm9iZShnZ3R0KTsKLQlpZiAo cmV0KQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKChnZ3R0LT52bS50b3RhbCAtIDEpID4+IDMyKSB7 Ci0JCURSTV9FUlJPUigiV2UgbmV2ZXIgZXhwZWN0ZWQgYSBHbG9iYWwgR1RUIHdpdGggbW9yZSB0 aGFuIDMyYml0cyIKLQkJCSAgIiBvZiBhZGRyZXNzIHNwYWNlISBGb3VuZCAlbGxkTSFcbiIsCi0J CQkgIGdndHQtPnZtLnRvdGFsID4+IDIwKTsKLQkJZ2d0dC0+dm0udG90YWwgPSAxVUxMIDw8IDMy OwotCQlnZ3R0LT5tYXBwYWJsZV9lbmQgPQotCQkJbWluX3QodTY0LCBnZ3R0LT5tYXBwYWJsZV9l bmQsIGdndHQtPnZtLnRvdGFsKTsKLQl9Ci0KLQlpZiAoZ2d0dC0+bWFwcGFibGVfZW5kID4gZ2d0 dC0+dm0udG90YWwpIHsKLQkJRFJNX0VSUk9SKCJtYXBwYWJsZSBhcGVydHVyZSBleHRlbmRzIHBh c3QgZW5kIG9mIEdHVFQsIgotCQkJICAiIGFwZXJ0dXJlPSVwYSwgdG90YWw9JWxseFxuIiwKLQkJ CSAgJmdndHQtPm1hcHBhYmxlX2VuZCwgZ2d0dC0+dm0udG90YWwpOwotCQlnZ3R0LT5tYXBwYWJs ZV9lbmQgPSBnZ3R0LT52bS50b3RhbDsKLQl9Ci0KLQkvKiBHTUFEUiBpcyB0aGUgUENJIG1taW8g YXBlcnR1cmUgaW50byB0aGUgZ2xvYmFsIEdUVC4gKi8KLQlEUk1fREVCVUdfRFJJVkVSKCJHR1RU IHNpemUgPSAlbGx1TVxuIiwgZ2d0dC0+dm0udG90YWwgPj4gMjApOwotCURSTV9ERUJVR19EUklW RVIoIkdNQURSIHNpemUgPSAlbGx1TVxuIiwgKHU2NClnZ3R0LT5tYXBwYWJsZV9lbmQgPj4gMjAp OwotCURSTV9ERUJVR19EUklWRVIoIkRTTSBzaXplID0gJWxsdU1cbiIsCi0JCQkgKHU2NClyZXNv dXJjZV9zaXplKCZpbnRlbF9ncmFwaGljc19zdG9sZW5fcmVzKSA+PiAyMCk7Ci0KLQlyZXR1cm4g MDsKLX0KLQotLyoqCi0gKiBpOTE1X2dndHRfcHJvYmVfaHcgLSBQcm9iZSBHR1RUIGhhcmR3YXJl IGxvY2F0aW9uCi0gKiBAaTkxNTogaTkxNSBkZXZpY2UKLSAqLwotaW50IGk5MTVfZ2d0dF9wcm9i ZV9odyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKLXsKLQlpbnQgcmV0OwotCi0JcmV0 ID0gZ2d0dF9wcm9iZV9odygmaTkxNS0+Z2d0dCwgJmk5MTUtPmd0KTsKLQlpZiAocmV0KQotCQly ZXR1cm4gcmV0OwotCi0JaWYgKGludGVsX3Z0ZF9hY3RpdmUoKSkKLQkJZGV2X2luZm8oaTkxNS0+ ZHJtLmRldiwgIlZULWQgYWN0aXZlIGZvciBnZnggYWNjZXNzXG4iKTsKLQotCXJldHVybiAwOwot fQotCi1zdGF0aWMgaW50IGdndHRfaW5pdF9odyhzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0KQotewot CXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gZ2d0dC0+dm0uaTkxNTsKLQotCWk5MTVf YWRkcmVzc19zcGFjZV9pbml0KCZnZ3R0LT52bSwgVk1fQ0xBU1NfR0dUVCk7Ci0KLQlnZ3R0LT52 bS5pc19nZ3R0ID0gdHJ1ZTsKLQotCS8qIE9ubHkgVkxWIHN1cHBvcnRzIHJlYWQtb25seSBHR1RU IG1hcHBpbmdzICovCi0JZ2d0dC0+dm0uaGFzX3JlYWRfb25seSA9IElTX1ZBTExFWVZJRVcoaTkx NSk7Ci0KLQlpZiAoIUhBU19MTEMoaTkxNSkgJiYgIUhBU19QUEdUVChpOTE1KSkKLQkJZ2d0dC0+ dm0ubW0uY29sb3JfYWRqdXN0ID0gaTkxNV9nZ3R0X2NvbG9yX2FkanVzdDsKLQotCWlmIChnZ3R0 LT5tYXBwYWJsZV9lbmQpIHsKLQkJaWYgKCFpb19tYXBwaW5nX2luaXRfd2MoJmdndHQtPmlvbWFw LAotCQkJCQlnZ3R0LT5nbWFkci5zdGFydCwKLQkJCQkJZ2d0dC0+bWFwcGFibGVfZW5kKSkgewot CQkJZ2d0dC0+dm0uY2xlYW51cCgmZ2d0dC0+dm0pOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQot CQlnZ3R0LT5tdHJyID0gYXJjaF9waHlzX3djX2FkZChnZ3R0LT5nbWFkci5zdGFydCwKLQkJCQkJ ICAgICAgZ2d0dC0+bWFwcGFibGVfZW5kKTsKLQl9Ci0KLQlpOTE1X2dndHRfaW5pdF9mZW5jZXMo Z2d0dCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBpOTE1X2dndHRfaW5pdF9odyAtIElu aXRpYWxpemUgR0dUVCBoYXJkd2FyZQotICogQGRldl9wcml2OiBpOTE1IGRldmljZQotICovCi1p bnQgaTkxNV9nZ3R0X2luaXRfaHcoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQot ewotCWludCByZXQ7Ci0KLQlzdGFzaF9pbml0KCZkZXZfcHJpdi0+bW0ud2Nfc3Rhc2gpOwotCi0J LyogTm90ZSB0aGF0IHdlIHVzZSBwYWdlIGNvbG91cmluZyB0byBlbmZvcmNlIGEgZ3VhcmQgcGFn ZSBhdCB0aGUKLQkgKiBlbmQgb2YgdGhlIGFkZHJlc3Mgc3BhY2UuIFRoaXMgaXMgcmVxdWlyZWQg YXMgdGhlIENTIG1heSBwcmVmZXRjaAotCSAqIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBiYXRjaCBi dWZmZXIsIGFjcm9zcyB0aGUgcGFnZSBib3VuZGFyeSwKLQkgKiBhbmQgYmV5b25kIHRoZSBlbmQg b2YgdGhlIEdUVCBpZiB3ZSBkbyBub3QgcHJvdmlkZSBhIGd1YXJkLgotCSAqLwotCXJldCA9IGdn dHRfaW5pdF9odygmZGV2X3ByaXYtPmdndHQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0K LQlyZXR1cm4gMDsKLX0KLQotaW50IGk5MTVfZ2d0dF9lbmFibGVfaHcoc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUgKmRldl9wcml2KQotewotCWlmIChJTlRFTF9HRU4oZGV2X3ByaXYpIDwgNiAmJiAh aW50ZWxfZW5hYmxlX2d0dCgpKQotCQlyZXR1cm4gLUVJTzsKLQotCXJldHVybiAwOwotfQotCi12 b2lkIGk5MTVfZ2d0dF9lbmFibGVfZ3VjKHN0cnVjdCBpOTE1X2dndHQgKmdndHQpCi17Ci0JR0VN X0JVR19PTihnZ3R0LT5pbnZhbGlkYXRlICE9IGdlbjhfZ2d0dF9pbnZhbGlkYXRlKTsKLQotCWdn dHQtPmludmFsaWRhdGUgPSBndWNfZ2d0dF9pbnZhbGlkYXRlOwotCi0JZ2d0dC0+aW52YWxpZGF0 ZShnZ3R0KTsKLX0KLQotdm9pZCBpOTE1X2dndHRfZGlzYWJsZV9ndWMoc3RydWN0IGk5MTVfZ2d0 dCAqZ2d0dCkKLXsKLQkvKiBYWFggVGVtcG9yYXJ5IHBhcmRvbiBmb3IgZXJyb3IgdW5sb2FkICov Ci0JaWYgKGdndHQtPmludmFsaWRhdGUgPT0gZ2VuOF9nZ3R0X2ludmFsaWRhdGUpCi0JCXJldHVy bjsKLQotCS8qIFdlIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlciBpOTE1X2dndHRfZW5hYmxl X2d1YygpICovCi0JR0VNX0JVR19PTihnZ3R0LT5pbnZhbGlkYXRlICE9IGd1Y19nZ3R0X2ludmFs aWRhdGUpOwotCi0JZ2d0dC0+aW52YWxpZGF0ZSA9IGdlbjhfZ2d0dF9pbnZhbGlkYXRlOwotCi0J Z2d0dC0+aW52YWxpZGF0ZShnZ3R0KTsKLX0KLQotc3RhdGljIHZvaWQgZ2d0dF9yZXN0b3JlX21h cHBpbmdzKHN0cnVjdCBpOTE1X2dndHQgKmdndHQpCi17Ci0Jc3RydWN0IGk5MTVfdm1hICp2bWEs ICp2bjsKLQlib29sIGZsdXNoID0gZmFsc2U7Ci0JaW50IG9wZW47Ci0KLQlpbnRlbF9ndF9jaGVj a19hbmRfY2xlYXJfZmF1bHRzKGdndHQtPnZtLmd0KTsKLQotCW11dGV4X2xvY2soJmdndHQtPnZt Lm11dGV4KTsKLQotCS8qIEZpcnN0IGZpbGwgb3VyIHBvcnRpb24gb2YgdGhlIEdUVCB3aXRoIHNj cmF0Y2ggcGFnZXMgKi8KLQlnZ3R0LT52bS5jbGVhcl9yYW5nZSgmZ2d0dC0+dm0sIDAsIGdndHQt PnZtLnRvdGFsKTsKLQotCS8qIFNraXAgcmV3cml0aW5nIFBURSBvbiBWTUEgdW5iaW5kLiAqLwot CW9wZW4gPSBhdG9taWNfeGNoZygmZ2d0dC0+dm0ub3BlbiwgMCk7Ci0KLQkvKiBjbGZsdXNoIG9i amVjdHMgYm91bmQgaW50byB0aGUgR0dUVCBhbmQgcmViaW5kIHRoZW0uICovCi0JbGlzdF9mb3Jf ZWFjaF9lbnRyeV9zYWZlKHZtYSwgdm4sICZnZ3R0LT52bS5ib3VuZF9saXN0LCB2bV9saW5rKSB7 Ci0JCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSB2bWEtPm9iajsKLQotCQlpZiAo IWk5MTVfdm1hX2lzX2JvdW5kKHZtYSwgSTkxNV9WTUFfR0xPQkFMX0JJTkQpKQotCQkJY29udGlu dWU7Ci0KLQkJaWYgKCFfX2k5MTVfdm1hX3VuYmluZCh2bWEpKQotCQkJY29udGludWU7Ci0KLQkJ Y2xlYXJfYml0KEk5MTVfVk1BX0dMT0JBTF9CSU5EX0JJVCwgX19pOTE1X3ZtYV9mbGFncyh2bWEp KTsKLQkJV0FSTl9PTihpOTE1X3ZtYV9iaW5kKHZtYSwKLQkJCQkgICAgICBvYmogPyBvYmotPmNh Y2hlX2xldmVsIDogMCwKLQkJCQkgICAgICBQSU5fR0xPQkFMLCBOVUxMKSk7Ci0JCWlmIChvYmop IHsgLyogb25seSB1c2VkIGR1cmluZyByZXN1bWUgPT4gZXhjbHVzaXZlIGFjY2VzcyAqLwotCQkJ Zmx1c2ggfD0gZmV0Y2hfYW5kX3plcm8oJm9iai0+d3JpdGVfZG9tYWluKTsKLQkJCW9iai0+cmVh ZF9kb21haW5zIHw9IEk5MTVfR0VNX0RPTUFJTl9HVFQ7Ci0JCX0KLQl9Ci0KLQlhdG9taWNfc2V0 KCZnZ3R0LT52bS5vcGVuLCBvcGVuKTsKLQlnZ3R0LT5pbnZhbGlkYXRlKGdndHQpOwotCi0JbXV0 ZXhfdW5sb2NrKCZnZ3R0LT52bS5tdXRleCk7Ci0KLQlpZiAoZmx1c2gpCi0JCXdiaW52ZF9vbl9h bGxfY3B1cygpOwotfQotCi12b2lkIGk5MTVfZ2VtX3Jlc3RvcmVfZ3R0X21hcHBpbmdzKHN0cnVj dCBkcm1faTkxNV9wcml2YXRlICppOTE1KQotewotCXN0cnVjdCBpOTE1X2dndHQgKmdndHQgPSAm aTkxNS0+Z2d0dDsKLQotCWdndHRfcmVzdG9yZV9tYXBwaW5ncyhnZ3R0KTsKLQotCWlmIChJTlRF TF9HRU4oaTkxNSkgPj0gOCkKLQkJc2V0dXBfcHJpdmF0ZV9wYXQoZ2d0dC0+dm0uZ3QtPnVuY29y ZSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKgotcm90YXRlX3BhZ2VzKHN0cnVj dCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosIHVuc2lnbmVkIGludCBvZmZzZXQsCi0JICAgICB1 bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsCi0JICAgICB1bnNpZ25lZCBp bnQgc3RyaWRlLAotCSAgICAgc3RydWN0IHNnX3RhYmxlICpzdCwgc3RydWN0IHNjYXR0ZXJsaXN0 ICpzZykKLXsKLQl1bnNpZ25lZCBpbnQgY29sdW1uLCByb3c7Ci0JdW5zaWduZWQgaW50IHNyY19p ZHg7Ci0KLQlmb3IgKGNvbHVtbiA9IDA7IGNvbHVtbiA8IHdpZHRoOyBjb2x1bW4rKykgewotCQlz cmNfaWR4ID0gc3RyaWRlICogKGhlaWdodCAtIDEpICsgY29sdW1uICsgb2Zmc2V0OwotCQlmb3Ig KHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKLQkJCXN0LT5uZW50cysrOwotCQkJLyog V2UgZG9uJ3QgbmVlZCB0aGUgcGFnZXMsIGJ1dCBuZWVkIHRvIGluaXRpYWxpemUKLQkJCSAqIHRo ZSBlbnRyaWVzIHNvIHRoZSBzZyBsaXN0IGNhbiBiZSBoYXBwaWx5IHRyYXZlcnNlZC4KLQkJCSAq IFRoZSBvbmx5IHRoaW5nIHdlIG5lZWQgYXJlIERNQSBhZGRyZXNzZXMuCi0JCQkgKi8KLQkJCXNn X3NldF9wYWdlKHNnLCBOVUxMLCBJOTE1X0dUVF9QQUdFX1NJWkUsIDApOwotCQkJc2dfZG1hX2Fk ZHJlc3Moc2cpID0KLQkJCQlpOTE1X2dlbV9vYmplY3RfZ2V0X2RtYV9hZGRyZXNzKG9iaiwgc3Jj X2lkeCk7Ci0JCQlzZ19kbWFfbGVuKHNnKSA9IEk5MTVfR1RUX1BBR0VfU0laRTsKLQkJCXNnID0g c2dfbmV4dChzZyk7Ci0JCQlzcmNfaWR4IC09IHN0cmlkZTsKLQkJfQotCX0KLQotCXJldHVybiBz ZzsKLX0KLQotc3RhdGljIG5vaW5saW5lIHN0cnVjdCBzZ190YWJsZSAqCi1pbnRlbF9yb3RhdGVf cGFnZXMoc3RydWN0IGludGVsX3JvdGF0aW9uX2luZm8gKnJvdF9pbmZvLAotCQkgICBzdHJ1Y3Qg ZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQotewotCXVuc2lnbmVkIGludCBzaXplID0gaW50ZWxf cm90YXRpb25faW5mb19zaXplKHJvdF9pbmZvKTsKLQlzdHJ1Y3Qgc2dfdGFibGUgKnN0OwotCXN0 cnVjdCBzY2F0dGVybGlzdCAqc2c7Ci0JaW50IHJldCA9IC1FTk9NRU07Ci0JaW50IGk7Ci0KLQkv KiBBbGxvY2F0ZSB0YXJnZXQgU0cgbGlzdC4gKi8KLQlzdCA9IGttYWxsb2Moc2l6ZW9mKCpzdCks IEdGUF9LRVJORUwpOwotCWlmICghc3QpCi0JCWdvdG8gZXJyX3N0X2FsbG9jOwotCi0JcmV0ID0g c2dfYWxsb2NfdGFibGUoc3QsIHNpemUsIEdGUF9LRVJORUwpOwotCWlmIChyZXQpCi0JCWdvdG8g ZXJyX3NnX2FsbG9jOwotCi0Jc3QtPm5lbnRzID0gMDsKLQlzZyA9IHN0LT5zZ2w7Ci0KLQlmb3Ig KGkgPSAwIDsgaSA8IEFSUkFZX1NJWkUocm90X2luZm8tPnBsYW5lKTsgaSsrKSB7Ci0JCXNnID0g cm90YXRlX3BhZ2VzKG9iaiwgcm90X2luZm8tPnBsYW5lW2ldLm9mZnNldCwKLQkJCQkgIHJvdF9p bmZvLT5wbGFuZVtpXS53aWR0aCwgcm90X2luZm8tPnBsYW5lW2ldLmhlaWdodCwKLQkJCQkgIHJv dF9pbmZvLT5wbGFuZVtpXS5zdHJpZGUsIHN0LCBzZyk7Ci0JfQotCi0JcmV0dXJuIHN0OwotCi1l cnJfc2dfYWxsb2M6Ci0Ja2ZyZWUoc3QpOwotZXJyX3N0X2FsbG9jOgotCi0JRFJNX0RFQlVHX0RS SVZFUigiRmFpbGVkIHRvIGNyZWF0ZSByb3RhdGVkIG1hcHBpbmcgZm9yIG9iamVjdCBzaXplICV6 dSEgKCV1eCV1IHRpbGVzLCAldSBwYWdlcylcbiIsCi0JCQkgb2JqLT5iYXNlLnNpemUsIHJvdF9p bmZvLT5wbGFuZVswXS53aWR0aCwgcm90X2luZm8tPnBsYW5lWzBdLmhlaWdodCwgc2l6ZSk7Ci0K LQlyZXR1cm4gRVJSX1BUUihyZXQpOwotfQotCi1zdGF0aWMgc3RydWN0IHNjYXR0ZXJsaXN0ICoK LXJlbWFwX3BhZ2VzKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosIHVuc2lnbmVkIGlu dCBvZmZzZXQsCi0JICAgIHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwK LQkgICAgdW5zaWduZWQgaW50IHN0cmlkZSwKLQkgICAgc3RydWN0IHNnX3RhYmxlICpzdCwgc3Ry dWN0IHNjYXR0ZXJsaXN0ICpzZykKLXsKLQl1bnNpZ25lZCBpbnQgcm93OwotCi0JZm9yIChyb3cg PSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7Ci0JCXVuc2lnbmVkIGludCBsZWZ0ID0gd2lkdGgg KiBJOTE1X0dUVF9QQUdFX1NJWkU7Ci0KLQkJd2hpbGUgKGxlZnQpIHsKLQkJCWRtYV9hZGRyX3Qg YWRkcjsKLQkJCXVuc2lnbmVkIGludCBsZW5ndGg7Ci0KLQkJCS8qIFdlIGRvbid0IG5lZWQgdGhl IHBhZ2VzLCBidXQgbmVlZCB0byBpbml0aWFsaXplCi0JCQkgKiB0aGUgZW50cmllcyBzbyB0aGUg c2cgbGlzdCBjYW4gYmUgaGFwcGlseSB0cmF2ZXJzZWQuCi0JCQkgKiBUaGUgb25seSB0aGluZyB3 ZSBuZWVkIGFyZSBETUEgYWRkcmVzc2VzLgotCQkJICovCi0KLQkJCWFkZHIgPSBpOTE1X2dlbV9v YmplY3RfZ2V0X2RtYV9hZGRyZXNzX2xlbihvYmosIG9mZnNldCwgJmxlbmd0aCk7Ci0KLQkJCWxl bmd0aCA9IG1pbihsZWZ0LCBsZW5ndGgpOwotCi0JCQlzdC0+bmVudHMrKzsKLQotCQkJc2dfc2V0 X3BhZ2Uoc2csIE5VTEwsIGxlbmd0aCwgMCk7Ci0JCQlzZ19kbWFfYWRkcmVzcyhzZykgPSBhZGRy OwotCQkJc2dfZG1hX2xlbihzZykgPSBsZW5ndGg7Ci0JCQlzZyA9IHNnX25leHQoc2cpOwotCi0J CQlvZmZzZXQgKz0gbGVuZ3RoIC8gSTkxNV9HVFRfUEFHRV9TSVpFOwotCQkJbGVmdCAtPSBsZW5n dGg7Ci0JCX0KLQotCQlvZmZzZXQgKz0gc3RyaWRlIC0gd2lkdGg7Ci0JfQotCi0JcmV0dXJuIHNn OwotfQotCi1zdGF0aWMgbm9pbmxpbmUgc3RydWN0IHNnX3RhYmxlICoKLWludGVsX3JlbWFwX3Bh Z2VzKHN0cnVjdCBpbnRlbF9yZW1hcHBlZF9pbmZvICpyZW1faW5mbywKLQkJICBzdHJ1Y3QgZHJt X2k5MTVfZ2VtX29iamVjdCAqb2JqKQotewotCXVuc2lnbmVkIGludCBzaXplID0gaW50ZWxfcmVt YXBwZWRfaW5mb19zaXplKHJlbV9pbmZvKTsKLQlzdHJ1Y3Qgc2dfdGFibGUgKnN0OwotCXN0cnVj dCBzY2F0dGVybGlzdCAqc2c7Ci0JaW50IHJldCA9IC1FTk9NRU07Ci0JaW50IGk7Ci0KLQkvKiBB bGxvY2F0ZSB0YXJnZXQgU0cgbGlzdC4gKi8KLQlzdCA9IGttYWxsb2Moc2l6ZW9mKCpzdCksIEdG UF9LRVJORUwpOwotCWlmICghc3QpCi0JCWdvdG8gZXJyX3N0X2FsbG9jOwotCi0JcmV0ID0gc2df YWxsb2NfdGFibGUoc3QsIHNpemUsIEdGUF9LRVJORUwpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJy X3NnX2FsbG9jOwotCi0Jc3QtPm5lbnRzID0gMDsKLQlzZyA9IHN0LT5zZ2w7Ci0KLQlmb3IgKGkg PSAwIDsgaSA8IEFSUkFZX1NJWkUocmVtX2luZm8tPnBsYW5lKTsgaSsrKSB7Ci0JCXNnID0gcmVt YXBfcGFnZXMob2JqLCByZW1faW5mby0+cGxhbmVbaV0ub2Zmc2V0LAotCQkJCSByZW1faW5mby0+ cGxhbmVbaV0ud2lkdGgsIHJlbV9pbmZvLT5wbGFuZVtpXS5oZWlnaHQsCi0JCQkJIHJlbV9pbmZv LT5wbGFuZVtpXS5zdHJpZGUsIHN0LCBzZyk7Ci0JfQotCi0JaTkxNV9zZ190cmltKHN0KTsKLQot CXJldHVybiBzdDsKLQotZXJyX3NnX2FsbG9jOgotCWtmcmVlKHN0KTsKLWVycl9zdF9hbGxvYzoK LQotCURSTV9ERUJVR19EUklWRVIoIkZhaWxlZCB0byBjcmVhdGUgcmVtYXBwZWQgbWFwcGluZyBm b3Igb2JqZWN0IHNpemUgJXp1ISAoJXV4JXUgdGlsZXMsICV1IHBhZ2VzKVxuIiwKLQkJCSBvYmot PmJhc2Uuc2l6ZSwgcmVtX2luZm8tPnBsYW5lWzBdLndpZHRoLCByZW1faW5mby0+cGxhbmVbMF0u aGVpZ2h0LCBzaXplKTsKLQotCXJldHVybiBFUlJfUFRSKHJldCk7Ci19Ci0KLXN0YXRpYyBub2lu bGluZSBzdHJ1Y3Qgc2dfdGFibGUgKgotaW50ZWxfcGFydGlhbF9wYWdlcyhjb25zdCBzdHJ1Y3Qg aTkxNV9nZ3R0X3ZpZXcgKnZpZXcsCi0JCSAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAq b2JqKQotewotCXN0cnVjdCBzZ190YWJsZSAqc3Q7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywg Kml0ZXI7Ci0JdW5zaWduZWQgaW50IGNvdW50ID0gdmlldy0+cGFydGlhbC5zaXplOwotCXVuc2ln bmVkIGludCBvZmZzZXQ7Ci0JaW50IHJldCA9IC1FTk9NRU07Ci0KLQlzdCA9IGttYWxsb2Moc2l6 ZW9mKCpzdCksIEdGUF9LRVJORUwpOwotCWlmICghc3QpCi0JCWdvdG8gZXJyX3N0X2FsbG9jOwot Ci0JcmV0ID0gc2dfYWxsb2NfdGFibGUoc3QsIGNvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAocmV0 KQotCQlnb3RvIGVycl9zZ19hbGxvYzsKLQotCWl0ZXIgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X3Nn KG9iaiwgdmlldy0+cGFydGlhbC5vZmZzZXQsICZvZmZzZXQpOwotCUdFTV9CVUdfT04oIWl0ZXIp OwotCi0Jc2cgPSBzdC0+c2dsOwotCXN0LT5uZW50cyA9IDA7Ci0JZG8gewotCQl1bnNpZ25lZCBp bnQgbGVuOwotCi0JCWxlbiA9IG1pbihpdGVyLT5sZW5ndGggLSAob2Zmc2V0IDw8IFBBR0VfU0hJ RlQpLAotCQkJICBjb3VudCA8PCBQQUdFX1NISUZUKTsKLQkJc2dfc2V0X3BhZ2Uoc2csIE5VTEws IGxlbiwgMCk7Ci0JCXNnX2RtYV9hZGRyZXNzKHNnKSA9Ci0JCQlzZ19kbWFfYWRkcmVzcyhpdGVy KSArIChvZmZzZXQgPDwgUEFHRV9TSElGVCk7Ci0JCXNnX2RtYV9sZW4oc2cpID0gbGVuOwotCi0J CXN0LT5uZW50cysrOwotCQljb3VudCAtPSBsZW4gPj4gUEFHRV9TSElGVDsKLQkJaWYgKGNvdW50 ID09IDApIHsKLQkJCXNnX21hcmtfZW5kKHNnKTsKLQkJCWk5MTVfc2dfdHJpbShzdCk7IC8qIERy b3AgYW55IHVudXNlZCB0YWlsIGVudHJpZXMuICovCi0KLQkJCXJldHVybiBzdDsKLQkJfQotCi0J CXNnID0gX19zZ19uZXh0KHNnKTsKLQkJaXRlciA9IF9fc2dfbmV4dChpdGVyKTsKLQkJb2Zmc2V0 ID0gMDsKLQl9IHdoaWxlICgxKTsKLQotZXJyX3NnX2FsbG9jOgotCWtmcmVlKHN0KTsKLWVycl9z dF9hbGxvYzoKLQlyZXR1cm4gRVJSX1BUUihyZXQpOwotfQotCi1zdGF0aWMgaW50Ci1pOTE1X2dl dF9nZ3R0X3ZtYV9wYWdlcyhzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKLXsKLQlpbnQgcmV0OwotCi0J LyogVGhlIHZtYS0+cGFnZXMgYXJlIG9ubHkgdmFsaWQgd2l0aGluIHRoZSBsaWZlc3BhbiBvZiB0 aGUgYm9ycm93ZWQKLQkgKiBvYmotPm1tLnBhZ2VzLiBXaGVuIHRoZSBvYmotPm1tLnBhZ2VzIHNn X3RhYmxlIGlzIHJlZ2VuZXJhdGVkLCBzbwotCSAqIG11c3QgYmUgdGhlIHZtYS0+cGFnZXMuIEEg c2ltcGxlIHJ1bGUgaXMgdGhhdCB2bWEtPnBhZ2VzIG11c3Qgb25seQotCSAqIGJlIGFjY2Vzc2Vk IHdoZW4gdGhlIG9iai0+bW0ucGFnZXMgYXJlIHBpbm5lZC4KLQkgKi8KLQlHRU1fQlVHX09OKCFp OTE1X2dlbV9vYmplY3RfaGFzX3Bpbm5lZF9wYWdlcyh2bWEtPm9iaikpOwotCi0Jc3dpdGNoICh2 bWEtPmdndHRfdmlldy50eXBlKSB7Ci0JZGVmYXVsdDoKLQkJR0VNX0JVR19PTih2bWEtPmdndHRf dmlldy50eXBlKTsKLQkJLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBJOTE1X0dHVFRfVklFV19O T1JNQUw6Ci0JCXZtYS0+cGFnZXMgPSB2bWEtPm9iai0+bW0ucGFnZXM7Ci0JCXJldHVybiAwOwot Ci0JY2FzZSBJOTE1X0dHVFRfVklFV19ST1RBVEVEOgotCQl2bWEtPnBhZ2VzID0KLQkJCWludGVs X3JvdGF0ZV9wYWdlcygmdm1hLT5nZ3R0X3ZpZXcucm90YXRlZCwgdm1hLT5vYmopOwotCQlicmVh azsKLQotCWNhc2UgSTkxNV9HR1RUX1ZJRVdfUkVNQVBQRUQ6Ci0JCXZtYS0+cGFnZXMgPQotCQkJ aW50ZWxfcmVtYXBfcGFnZXMoJnZtYS0+Z2d0dF92aWV3LnJlbWFwcGVkLCB2bWEtPm9iaik7Ci0J CWJyZWFrOwotCi0JY2FzZSBJOTE1X0dHVFRfVklFV19QQVJUSUFMOgotCQl2bWEtPnBhZ2VzID0g aW50ZWxfcGFydGlhbF9wYWdlcygmdm1hLT5nZ3R0X3ZpZXcsIHZtYS0+b2JqKTsKLQkJYnJlYWs7 Ci0JfQotCi0JcmV0ID0gMDsKLQlpZiAoSVNfRVJSKHZtYS0+cGFnZXMpKSB7Ci0JCXJldCA9IFBU Ul9FUlIodm1hLT5wYWdlcyk7Ci0JCXZtYS0+cGFnZXMgPSBOVUxMOwotCQlEUk1fRVJST1IoIkZh aWxlZCB0byBnZXQgcGFnZXMgZm9yIFZNQSB2aWV3IHR5cGUgJXUgKCVkKSFcbiIsCi0JCQkgIHZt YS0+Z2d0dF92aWV3LnR5cGUsIHJldCk7Ci0JfQotCXJldHVybiByZXQ7CisJZG1hX3VubWFwX3Nn KGtkZXYsIHBhZ2VzLT5zZ2wsIHBhZ2VzLT5uZW50cywgUENJX0RNQV9CSURJUkVDVElPTkFMKTsK IH0KIAogLyoqCkBAIC0zODQ4LDYgKzI5Myw1IEBAIGludCBpOTE1X2dlbV9ndHRfaW5zZXJ0KHN0 cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAogfQogCiAjaWYgSVNfRU5BQkxFRChDT05GSUdf RFJNX0k5MTVfU0VMRlRFU1QpCi0jaW5jbHVkZSAic2VsZnRlc3RzL21vY2tfZ3R0LmMiCiAjaW5j bHVkZSAic2VsZnRlc3RzL2k5MTVfZ2VtX2d0dC5jIgogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5 MTVfZ2VtX2d0dC5oCmluZGV4IDMxYTRhOTZkZGQwZC4uZDQ2NDJjNTVhMWQ0IDEwMDY0NAotLS0g YS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuaAorKysgYi9kcml2ZXJzL2dwdS9k cm0vaTkxNS9pOTE1X2dlbV9ndHQuaApAQCAtMSw2MzkgKzEsMTkgQEAKKy8qIFNQRFgtTGljZW5z ZS1JZGVudGlmaWVyOiBNSVQgKi8KIC8qCi0gKiBDb3B5cmlnaHQgwqkgMjAxNCBJbnRlbCBDb3Jw b3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hh cmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi0gKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUg YW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotICog dG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdp dGhvdXQgbGltaXRhdGlvbgotICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVy Z2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCi0gKiBhbmQvb3Igc2VsbCBjb3Bp ZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKLSAq IFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5n IGNvbmRpdGlvbnM6Ci0gKgotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMg cGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAotICogcGFyYWdyYXBoKSBzaGFs bCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRo ZQotICogU29mdHdhcmUuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIs IFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLSAqIElNUExJRUQsIElO Q0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM SVRZLAotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdF TUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9M REVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgotICogTElBQklM SVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0Us IEFSSVNJTkcKLSAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRX QVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKLSAqIElOIFRIRSBTT0ZUV0FSRS4KLSAq Ci0gKiBQbGVhc2UgdHJ5IHRvIG1haW50YWluIHRoZSBmb2xsb3dpbmcgb3JkZXIgd2l0aGluIHRo aXMgZmlsZSB1bmxlc3MgaXQgbWFrZXMKLSAqIHNlbnNlIHRvIGRvIG90aGVyd2lzZS4gRnJvbSB0 b3AgdG8gYm90dG9tOgotICogMS4gdHlwZWRlZnMKLSAqIDIuICNkZWZpbmVzLCBhbmQgbWFjcm9z Ci0gKiAzLiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMKLSAqIDQuIGZ1bmN0aW9uIHByb3RvdHlwZXMK LSAqCi0gKiBXaXRoaW4gZWFjaCBzZWN0aW9uLCBwbGVhc2UgdHJ5IHRvIG9yZGVyIGJ5IGdlbmVy YXRpb24gaW4gYXNjZW5kaW5nIG9yZGVyLAotICogZnJvbSB0b3AgdG8gYm90dG9tIChpZS4gZ2Vu NiBvbiB0aGUgdG9wLCBnZW44IG9uIHRoZSBib3R0b20pLgorICogQ29weXJpZ2h0IMKpIDIwMjAg SW50ZWwgQ29ycG9yYXRpb24KICAqLwogCiAjaWZuZGVmIF9fSTkxNV9HRU1fR1RUX0hfXwogI2Rl ZmluZSBfX0k5MTVfR0VNX0dUVF9IX18KIAogI2luY2x1ZGUgPGxpbnV4L2lvLW1hcHBpbmcuaD4K LSNpbmNsdWRlIDxsaW51eC9rcmVmLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRl IDxsaW51eC9wYWdldmVjLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKICNpbmNs dWRlIDxkcm0vZHJtX21tLmg+CiAKLSNpbmNsdWRlICJndC9pbnRlbF9yZXNldC5oIgotI2luY2x1 ZGUgImk5MTVfZ2VtX2ZlbmNlX3JlZy5oIgotI2luY2x1ZGUgImk5MTVfcmVxdWVzdC5oIgorI2lu Y2x1ZGUgImd0L2ludGVsX2d0dC5oIgogI2luY2x1ZGUgImk5MTVfc2NhdHRlcmxpc3QuaCIKLSNp bmNsdWRlICJpOTE1X3NlbGZ0ZXN0LmgiCi0jaW5jbHVkZSAiZ3QvaW50ZWxfdGltZWxpbmUuaCIK IAotI2RlZmluZSBJOTE1X0dUVF9QQUdFX1NJWkVfNEsJQklUX1VMTCgxMikKLSNkZWZpbmUgSTkx NV9HVFRfUEFHRV9TSVpFXzY0SwlCSVRfVUxMKDE2KQotI2RlZmluZSBJOTE1X0dUVF9QQUdFX1NJ WkVfMk0JQklUX1VMTCgyMSkKLQotI2RlZmluZSBJOTE1X0dUVF9QQUdFX1NJWkUgSTkxNV9HVFRf UEFHRV9TSVpFXzRLCi0jZGVmaW5lIEk5MTVfR1RUX01BWF9QQUdFX1NJWkUgSTkxNV9HVFRfUEFH RV9TSVpFXzJNCi0KLSNkZWZpbmUgSTkxNV9HVFRfUEFHRV9NQVNLIC1JOTE1X0dUVF9QQUdFX1NJ WkUKLQotI2RlZmluZSBJOTE1X0dUVF9NSU5fQUxJR05NRU5UIEk5MTVfR1RUX1BBR0VfU0laRQot Ci0jZGVmaW5lIEk5MTVfRkVOQ0VfUkVHX05PTkUgLTEKLSNkZWZpbmUgSTkxNV9NQVhfTlVNX0ZF TkNFUyAzMgotLyogMzIgZmVuY2VzICsgc2lnbiBiaXQgZm9yIEZFTkNFX1JFR19OT05FICovCi0j ZGVmaW5lIEk5MTVfTUFYX05VTV9GRU5DRV9CSVRTIDYKLQotc3RydWN0IGRybV9pOTE1X2ZpbGVf cHJpdmF0ZTsKIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0Owotc3RydWN0IGk5MTVfdm1hOwot c3RydWN0IGludGVsX2d0OwotCi10eXBlZGVmIHUzMiBnZW42X3B0ZV90OwotdHlwZWRlZiB1NjQg Z2VuOF9wdGVfdDsKLQotI2RlZmluZSBnZ3R0X3RvdGFsX2VudHJpZXMoZ2d0dCkgKChnZ3R0KS0+ dm0udG90YWwgPj4gUEFHRV9TSElGVCkKLQotLyogZ2VuNi1oc3cgaGFzIGJpdCAxMS00IGZvciBw aHlzaWNhbCBhZGRyIGJpdCAzOS0zMiAqLwotI2RlZmluZSBHRU42X0dUVF9BRERSX0VOQ09ERShh ZGRyKQkoKGFkZHIpIHwgKCgoYWRkcikgPj4gMjgpICYgMHhmZjApKQotI2RlZmluZSBHRU42X1BU RV9BRERSX0VOQ09ERShhZGRyKQlHRU42X0dUVF9BRERSX0VOQ09ERShhZGRyKQotI2RlZmluZSBH RU42X1BERV9BRERSX0VOQ09ERShhZGRyKQlHRU42X0dUVF9BRERSX0VOQ09ERShhZGRyKQotI2Rl ZmluZSBHRU42X1BURV9DQUNIRV9MTEMJCSgyIDw8IDEpCi0jZGVmaW5lIEdFTjZfUFRFX1VOQ0FD SEVECQkoMSA8PCAxKQotI2RlZmluZSBHRU42X1BURV9WQUxJRAkJCSgxIDw8IDApCi0KLSNkZWZp bmUgSTkxNV9QVEVTKHB0ZV9sZW4pCQkoKHVuc2lnbmVkIGludCkoUEFHRV9TSVpFIC8gKHB0ZV9s ZW4pKSkKLSNkZWZpbmUgSTkxNV9QVEVfTUFTSyhwdGVfbGVuKQkJKEk5MTVfUFRFUyhwdGVfbGVu KSAtIDEpCi0jZGVmaW5lIEk5MTVfUERFUwkJCTUxMgotI2RlZmluZSBJOTE1X1BERV9NQVNLCQkJ KEk5MTVfUERFUyAtIDEpCi0jZGVmaW5lIE5VTV9QVEUocGRlX3NoaWZ0KSAgICAgKDEgPDwgKHBk ZV9zaGlmdCAtIFBBR0VfU0hJRlQpKQotCi0jZGVmaW5lIEdFTjZfUFRFUwkJCUk5MTVfUFRFUyhz aXplb2YoZ2VuNl9wdGVfdCkpCi0jZGVmaW5lIEdFTjZfUERfU0laRQkJICAgICAgICAoSTkxNV9Q REVTICogUEFHRV9TSVpFKQotI2RlZmluZSBHRU42X1BEX0FMSUdOCQkJKFBBR0VfU0laRSAqIDE2 KQotI2RlZmluZSBHRU42X1BERV9TSElGVAkJCTIyCi0jZGVmaW5lIEdFTjZfUERFX1ZBTElECQkJ KDEgPDwgMCkKLQotI2RlZmluZSBHRU43X1BURV9DQUNIRV9MM19MTEMJCSgzIDw8IDEpCi0KLSNk ZWZpbmUgQllUX1BURV9TTk9PUEVEX0JZX0NQVV9DQUNIRVMJKDEgPDwgMikKLSNkZWZpbmUgQllU X1BURV9XUklURUFCTEUJCSgxIDw8IDEpCi0KLS8qIENhY2hlYWJpbGl0eSBDb250cm9sIGlzIGEg NC1iaXQgdmFsdWUuIFRoZSBsb3cgdGhyZWUgYml0cyBhcmUgc3RvcmVkIGluIGJpdHMKLSAqIDM6 MSBvZiB0aGUgUFRFLCB3aGlsZSB0aGUgZm91cnRoIGJpdCBpcyBzdG9yZWQgaW4gYml0IDExIG9m IHRoZSBQVEUuCi0gKi8KLSNkZWZpbmUgSFNXX0NBQ0hFQUJJTElUWV9DT05UUk9MKGJpdHMpCSgo KChiaXRzKSAmIDB4NykgPDwgMSkgfCBcCi0JCQkJCSAoKChiaXRzKSAmIDB4OCkgPDwgKDExIC0g MykpKQotI2RlZmluZSBIU1dfV0JfTExDX0FHRTMJCQlIU1dfQ0FDSEVBQklMSVRZX0NPTlRST0wo MHgyKQotI2RlZmluZSBIU1dfV0JfTExDX0FHRTAJCQlIU1dfQ0FDSEVBQklMSVRZX0NPTlRST0wo MHgzKQotI2RlZmluZSBIU1dfV0JfRUxMQ19MTENfQUdFMwkJSFNXX0NBQ0hFQUJJTElUWV9DT05U Uk9MKDB4OCkKLSNkZWZpbmUgSFNXX1dCX0VMTENfTExDX0FHRTAJCUhTV19DQUNIRUFCSUxJVFlf Q09OVFJPTCgweGIpCi0jZGVmaW5lIEhTV19XVF9FTExDX0xMQ19BR0UzCQlIU1dfQ0FDSEVBQklM SVRZX0NPTlRST0woMHg3KQotI2RlZmluZSBIU1dfV1RfRUxMQ19MTENfQUdFMAkJSFNXX0NBQ0hF QUJJTElUWV9DT05UUk9MKDB4NikKLSNkZWZpbmUgSFNXX1BURV9VTkNBQ0hFRAkJKDApCi0jZGVm aW5lIEhTV19HVFRfQUREUl9FTkNPREUoYWRkcikJKChhZGRyKSB8ICgoKGFkZHIpID4+IDI4KSAm IDB4N2YwKSkKLSNkZWZpbmUgSFNXX1BURV9BRERSX0VOQ09ERShhZGRyKQlIU1dfR1RUX0FERFJf RU5DT0RFKGFkZHIpCi0KLS8qCi0gKiBHRU44IDMyYiBzdHlsZSBhZGRyZXNzIGlzIGRlZmluZWQg YXMgYSAzIGxldmVsIHBhZ2UgdGFibGU6Ci0gKiAzMTozMCB8IDI5OjIxIHwgMjA6MTIgfCAgMTE6 MAotICogUERQRSAgfCAgUERFICB8ICBQVEUgIHwgb2Zmc2V0Ci0gKiBUaGUgZGlmZmVyZW5jZSBh cyBjb21wYXJlZCB0byBub3JtYWwgeDg2IDMgbGV2ZWwgcGFnZSB0YWJsZSBpcyB0aGUgUERQRXMg YXJlCi0gKiBwcm9ncmFtbWVkIHZpYSByZWdpc3Rlci4KLSAqCi0gKiBHRU44IDQ4YiBzdHlsZSBh ZGRyZXNzIGlzIGRlZmluZWQgYXMgYSA0IGxldmVsIHBhZ2UgdGFibGU6Ci0gKiA0NzozOSB8IDM4 OjMwIHwgMjk6MjEgfCAyMDoxMiB8ICAxMTowCi0gKiBQTUw0RSB8IFBEUEUgIHwgIFBERSAgfCAg UFRFICB8IG9mZnNldAotICovCi0jZGVmaW5lIEdFTjhfM0xWTF9QRFBFUwkJCTQKLQotI2RlZmlu ZSBQUEFUX1VOQ0FDSEVECQkJKF9QQUdFX1BXVCB8IF9QQUdFX1BDRCkKLSNkZWZpbmUgUFBBVF9D QUNIRURfUERFCQkJMCAvKiBXQiBMTEMgKi8KLSNkZWZpbmUgUFBBVF9DQUNIRUQJCQlfUEFHRV9Q QVQgLyogV0IgTExDZUxMQyAqLwotI2RlZmluZSBQUEFUX0RJU1BMQVlfRUxMQwkJX1BBR0VfUENE IC8qIFdUIGVMTEMgKi8KLQotI2RlZmluZSBDSFZfUFBBVF9TTk9PUAkJCSgxPDw2KQotI2RlZmlu ZSBHRU44X1BQQVRfQUdFKHgpCQkoKHgpPDw0KQotI2RlZmluZSBHRU44X1BQQVRfTExDZUxMQwkJ KDM8PDIpCi0jZGVmaW5lIEdFTjhfUFBBVF9MTENFTExDCQkoMjw8MikKLSNkZWZpbmUgR0VOOF9Q UEFUX0xMQwkJCSgxPDwyKQotI2RlZmluZSBHRU44X1BQQVRfV0IJCQkoMzw8MCkKLSNkZWZpbmUg R0VOOF9QUEFUX1dUCQkJKDI8PDApCi0jZGVmaW5lIEdFTjhfUFBBVF9XQwkJCSgxPDwwKQotI2Rl ZmluZSBHRU44X1BQQVRfVUMJCQkoMDw8MCkKLSNkZWZpbmUgR0VOOF9QUEFUX0VMTENfT1ZFUlJJ REUJCSgwPDwyKQotI2RlZmluZSBHRU44X1BQQVQoaSwgeCkJCQkoKHU2NCkoeCkgPDwgKChpKSAq IDgpKQotCi0jZGVmaW5lIEdFTjhfUERFX0lQU182NEsgQklUKDExKQotI2RlZmluZSBHRU44X1BE RV9QU18yTSAgIEJJVCg3KQotCi0jZGVmaW5lIGZvcl9lYWNoX3NndF9kYWRkcihfX2RwLCBfX2l0 ZXIsIF9fc2d0KSBcCi0JX19mb3JfZWFjaF9zZ3RfZGFkZHIoX19kcCwgX19pdGVyLCBfX3NndCwg STkxNV9HVFRfUEFHRV9TSVpFKQotCi1zdHJ1Y3QgaW50ZWxfcmVtYXBwZWRfcGxhbmVfaW5mbyB7 Ci0JLyogaW4gZ3R0IHBhZ2VzICovCi0JdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQsIHN0cmlk ZSwgb2Zmc2V0OwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGludGVsX3JlbWFwcGVkX2luZm8gewot CXN0cnVjdCBpbnRlbF9yZW1hcHBlZF9wbGFuZV9pbmZvIHBsYW5lWzJdOwotCXVuc2lnbmVkIGlu dCB1bnVzZWRfbWJ6OwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGludGVsX3JvdGF0aW9uX2luZm8g ewotCXN0cnVjdCBpbnRlbF9yZW1hcHBlZF9wbGFuZV9pbmZvIHBsYW5lWzJdOwotfSBfX3BhY2tl ZDsKLQotc3RydWN0IGludGVsX3BhcnRpYWxfaW5mbyB7Ci0JdTY0IG9mZnNldDsKLQl1bnNpZ25l ZCBpbnQgc2l6ZTsKLX0gX19wYWNrZWQ7Ci0KLWVudW0gaTkxNV9nZ3R0X3ZpZXdfdHlwZSB7Ci0J STkxNV9HR1RUX1ZJRVdfTk9STUFMID0gMCwKLQlJOTE1X0dHVFRfVklFV19ST1RBVEVEID0gc2l6 ZW9mKHN0cnVjdCBpbnRlbF9yb3RhdGlvbl9pbmZvKSwKLQlJOTE1X0dHVFRfVklFV19QQVJUSUFM ID0gc2l6ZW9mKHN0cnVjdCBpbnRlbF9wYXJ0aWFsX2luZm8pLAotCUk5MTVfR0dUVF9WSUVXX1JF TUFQUEVEID0gc2l6ZW9mKHN0cnVjdCBpbnRlbF9yZW1hcHBlZF9pbmZvKSwKLX07Ci0KLXN0YXRp YyBpbmxpbmUgdm9pZCBhc3NlcnRfaTkxNV9nZW1fZ3R0X3R5cGVzKHZvaWQpCi17Ci0JQlVJTERf QlVHX09OKHNpemVvZihzdHJ1Y3QgaW50ZWxfcm90YXRpb25faW5mbykgIT0gOCpzaXplb2YodW5z aWduZWQgaW50KSk7Ci0JQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgaW50ZWxfcGFydGlhbF9p bmZvKSAhPSBzaXplb2YodTY0KSArIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKLQlCVUlMRF9CVUdf T04oc2l6ZW9mKHN0cnVjdCBpbnRlbF9yZW1hcHBlZF9pbmZvKSAhPSA5KnNpemVvZih1bnNpZ25l ZCBpbnQpKTsKLQotCS8qIENoZWNrIHRoYXQgcm90YXRpb24vcmVtYXBwZWQgc2hhcmVzIG9mZnNl dHMgZm9yIHNpbXBsaWNpdHkgKi8KLQlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGludGVs X3JlbWFwcGVkX2luZm8sIHBsYW5lWzBdKSAhPQotCQkgICAgIG9mZnNldG9mKHN0cnVjdCBpbnRl bF9yb3RhdGlvbl9pbmZvLCBwbGFuZVswXSkpOwotCUJVSUxEX0JVR19PTihvZmZzZXRvZmVuZChz dHJ1Y3QgaW50ZWxfcmVtYXBwZWRfaW5mbywgcGxhbmVbMV0pICE9Ci0JCSAgICAgb2Zmc2V0b2Zl bmQoc3RydWN0IGludGVsX3JvdGF0aW9uX2luZm8sIHBsYW5lWzFdKSk7Ci0KLQkvKiBBcyB3ZSBl bmNvZGUgdGhlIHNpemUgb2YgZWFjaCBicmFuY2ggaW5zaWRlIHRoZSB1bmlvbiBpbnRvIGl0cyB0 eXBlLAotCSAqIHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCB0aGF0IGVhY2ggYnJhbmNoIGhhcyBhIHVu aXF1ZSBzaXplLgotCSAqLwotCXN3aXRjaCAoKGVudW0gaTkxNV9nZ3R0X3ZpZXdfdHlwZSkwKSB7 Ci0JY2FzZSBJOTE1X0dHVFRfVklFV19OT1JNQUw6Ci0JY2FzZSBJOTE1X0dHVFRfVklFV19QQVJU SUFMOgotCWNhc2UgSTkxNV9HR1RUX1ZJRVdfUk9UQVRFRDoKLQljYXNlIEk5MTVfR0dUVF9WSUVX X1JFTUFQUEVEOgotCQkvKiBnY2MgY29tcGxhaW5zIGlmIHRoZXNlIGFyZSBpZGVudGljYWwgY2Fz ZXMgKi8KLQkJYnJlYWs7Ci0JfQotfQotCi1zdHJ1Y3QgaTkxNV9nZ3R0X3ZpZXcgewotCWVudW0g aTkxNV9nZ3R0X3ZpZXdfdHlwZSB0eXBlOwotCXVuaW9uIHsKLQkJLyogTWVtYmVycyBuZWVkIHRv IGNvbnRhaW4gbm8gaG9sZXMvcGFkZGluZyAqLwotCQlzdHJ1Y3QgaW50ZWxfcGFydGlhbF9pbmZv IHBhcnRpYWw7Ci0JCXN0cnVjdCBpbnRlbF9yb3RhdGlvbl9pbmZvIHJvdGF0ZWQ7Ci0JCXN0cnVj dCBpbnRlbF9yZW1hcHBlZF9pbmZvIHJlbWFwcGVkOwotCX07Ci19OwotCi1lbnVtIGk5MTVfY2Fj aGVfbGV2ZWw7Ci0KLXN0cnVjdCBpOTE1X3ZtYTsKLQotc3RydWN0IGk5MTVfcGFnZV9kbWEgewot CXN0cnVjdCBwYWdlICpwYWdlOwotCXVuaW9uIHsKLQkJZG1hX2FkZHJfdCBkYWRkcjsKLQotCQkv KiBGb3IgZ2VuNi9nZW43IG9ubHkuIFRoaXMgaXMgdGhlIG9mZnNldCBpbiB0aGUgR0dUVAotCQkg KiB3aGVyZSB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cmllcyBmb3IgUFBHVFQgYmVnaW4KLQkJICov Ci0JCXUzMiBnZ3R0X29mZnNldDsKLQl9OwotfTsKLQotc3RydWN0IGk5MTVfcGFnZV9zY3JhdGNo IHsKLQlzdHJ1Y3QgaTkxNV9wYWdlX2RtYSBiYXNlOwotCXU2NCBlbmNvZGU7Ci19OwotCi1zdHJ1 Y3QgaTkxNV9wYWdlX3RhYmxlIHsKLQlzdHJ1Y3QgaTkxNV9wYWdlX2RtYSBiYXNlOwotCWF0b21p Y190IHVzZWQ7Ci19OwotCi1zdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSB7Ci0Jc3RydWN0IGk5 MTVfcGFnZV90YWJsZSBwdDsKLQlzcGlubG9ja190IGxvY2s7Ci0Jdm9pZCAqZW50cnlbNTEyXTsK LX07Ci0KLSNkZWZpbmUgX19weF9jaG9vc2VfZXhwcih4LCB0eXBlLCBleHByLCBvdGhlcikgXAot CV9fYnVpbHRpbl9jaG9vc2VfZXhwciggXAotCV9fYnVpbHRpbl90eXBlc19jb21wYXRpYmxlX3Ao dHlwZW9mKHgpLCB0eXBlKSB8fCBcCi0JX19idWlsdGluX3R5cGVzX2NvbXBhdGlibGVfcCh0eXBl b2YoeCksIGNvbnN0IHR5cGUpLCBcCi0JKHsgdHlwZSBfX3ggPSAodHlwZSkoeCk7IGV4cHI7IH0p LCBcCi0Jb3RoZXIpCi0KLSNkZWZpbmUgcHhfYmFzZShweCkgXAotCV9fcHhfY2hvb3NlX2V4cHIo cHgsIHN0cnVjdCBpOTE1X3BhZ2VfZG1hICosIF9feCwgXAotCV9fcHhfY2hvb3NlX2V4cHIocHgs IHN0cnVjdCBpOTE1X3BhZ2Vfc2NyYXRjaCAqLCAmX194LT5iYXNlLCBcCi0JX19weF9jaG9vc2Vf ZXhwcihweCwgc3RydWN0IGk5MTVfcGFnZV90YWJsZSAqLCAmX194LT5iYXNlLCBcCi0JX19weF9j aG9vc2VfZXhwcihweCwgc3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKiwgJl9feC0+cHQuYmFz ZSwgXAotCSh2b2lkKTApKSkpCi0jZGVmaW5lIHB4X2RtYShweCkgKHB4X2Jhc2UocHgpLT5kYWRk cikKLQotI2RlZmluZSBweF9wdChweCkgXAotCV9fcHhfY2hvb3NlX2V4cHIocHgsIHN0cnVjdCBp OTE1X3BhZ2VfdGFibGUgKiwgX194LCBcCi0JX19weF9jaG9vc2VfZXhwcihweCwgc3RydWN0IGk5 MTVfcGFnZV9kaXJlY3RvcnkgKiwgJl9feC0+cHQsIFwKLQkodm9pZCkwKSkKLSNkZWZpbmUgcHhf dXNlZChweCkgKCZweF9wdChweCktPnVzZWQpCi0KLXN0cnVjdCBpOTE1X3ZtYV9vcHMgewotCS8q IE1hcCBhbiBvYmplY3QgaW50byBhbiBhZGRyZXNzIHNwYWNlIHdpdGggdGhlIGdpdmVuIGNhY2hl IGZsYWdzLiAqLwotCWludCAoKmJpbmRfdm1hKShzdHJ1Y3QgaTkxNV92bWEgKnZtYSwKLQkJCWVu dW0gaTkxNV9jYWNoZV9sZXZlbCBjYWNoZV9sZXZlbCwKLQkJCXUzMiBmbGFncyk7Ci0JLyoKLQkg KiBVbm1hcCBhbiBvYmplY3QgZnJvbSBhbiBhZGRyZXNzIHNwYWNlLiBUaGlzIHVzdWFsbHkgY29u c2lzdHMgb2YKLQkgKiBzZXR0aW5nIHRoZSB2YWxpZCBQVEUgZW50cmllcyB0byBhIHJlc2VydmVk IHNjcmF0Y2ggcGFnZS4KLQkgKi8KLQl2b2lkICgqdW5iaW5kX3ZtYSkoc3RydWN0IGk5MTVfdm1h ICp2bWEpOwotCi0JaW50ICgqc2V0X3BhZ2VzKShzdHJ1Y3QgaTkxNV92bWEgKnZtYSk7Ci0Jdm9p ZCAoKmNsZWFyX3BhZ2VzKShzdHJ1Y3QgaTkxNV92bWEgKnZtYSk7Ci19OwotCi1zdHJ1Y3QgcGFn ZXN0YXNoIHsKLQlzcGlubG9ja190IGxvY2s7Ci0Jc3RydWN0IHBhZ2V2ZWMgcHZlYzsKLX07Ci0K LXN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgewotCXN0cnVjdCBrcmVmIHJlZjsKLQlzdHJ1Y3Qg cmN1X3dvcmsgcmN1OwotCi0Jc3RydWN0IGRybV9tbSBtbTsKLQlzdHJ1Y3QgaW50ZWxfZ3QgKmd0 OwotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1OwotCXN0cnVjdCBkZXZpY2UgKmRtYTsK LQkvKiBFdmVyeSBhZGRyZXNzIHNwYWNlIGJlbG9uZ3MgdG8gYSBzdHJ1Y3QgZmlsZSAtIGV4Y2Vw dCBmb3IgdGhlIGdsb2JhbAotCSAqIEdUVCB0aGF0IGlzIG93bmVkIGJ5IHRoZSBkcml2ZXIgKGFu ZCBzbyBAZmlsZSBpcyBzZXQgdG8gTlVMTCkuIEluCi0JICogcHJpbmNpcGxlLCBubyBpbmZvcm1h dGlvbiBzaG91bGQgbGVhayBmcm9tIG9uZSBjb250ZXh0IHRvIGFub3RoZXIKLQkgKiAob3IgYmV0 d2VlbiBmaWxlcy9wcm9jZXNzZXMgZXRjKSB1bmxlc3MgZXhwbGljaXRseSBzaGFyZWQgYnkgdGhl Ci0JICogb3duZXIuIFRyYWNraW5nIHRoZSBvd25lciBpcyBpbXBvcnRhbnQgaW4gb3JkZXIgdG8g ZnJlZSB1cCBwZXItZmlsZQotCSAqIG9iamVjdHMgYWxvbmcgd2l0aCB0aGUgZmlsZSwgdG8gYWlk ZSByZXNvdXJjZSB0cmFja2luZywgYW5kIHRvCi0JICogYXNzaWduIGJsYW1lLgotCSAqLwotCXN0 cnVjdCBkcm1faTkxNV9maWxlX3ByaXZhdGUgKmZpbGU7Ci0JdTY0IHRvdGFsOwkJLyogc2l6ZSBh ZGRyIHNwYWNlIG1hcHMgKGV4LiAyR0IgZm9yIGdndHQpICovCi0JdTY0IHJlc2VydmVkOwkJLyog c2l6ZSBhZGRyIHNwYWNlIHJlc2VydmVkICovCi0KLQl1bnNpZ25lZCBpbnQgYmluZF9hc3luY19m bGFnczsKLQotCS8qCi0JICogRWFjaCBhY3RpdmUgdXNlciBjb250ZXh0IGhhcyBpdHMgb3duIGFk ZHJlc3Mgc3BhY2UgKGluIGZ1bGwtcHBndHQpLgotCSAqIFNpbmNlIHRoZSB2bSBtYXkgYmUgc2hh cmVkIGJldHdlZW4gbXVsdGlwbGUgY29udGV4dHMsIHdlIGNvdW50IGhvdwotCSAqIG1hbnkgY29u dGV4dHMga2VlcCB1cyAib3BlbiIuIE9uY2Ugb3BlbiBoaXRzIHplcm8sIHdlIGFyZSBjbG9zZWQK LQkgKiBhbmQgZG8gbm90IGFsbG93IGFueSBuZXcgYXR0YWNobWVudHMsIGFuZCBwcm9jZWVkIHRv IHNodXRkb3duIG91cgotCSAqIHZtYSBhbmQgcGFnZSBkaXJlY3Rvcmllcy4KLQkgKi8KLQlhdG9t aWNfdCBvcGVuOwotCi0Jc3RydWN0IG11dGV4IG11dGV4OyAvKiBwcm90ZWN0cyB2bWEgYW5kIG91 ciBsaXN0cyAqLwotI2RlZmluZSBWTV9DTEFTU19HR1RUIDAKLSNkZWZpbmUgVk1fQ0xBU1NfUFBH VFQgMQotCi0Jc3RydWN0IGk5MTVfcGFnZV9zY3JhdGNoIHNjcmF0Y2hbNF07Ci0JdW5zaWduZWQg aW50IHNjcmF0Y2hfb3JkZXI7Ci0JdW5zaWduZWQgaW50IHRvcDsKLQotCS8qKgotCSAqIExpc3Qg b2Ygdm1hIGN1cnJlbnRseSBib3VuZC4KLQkgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGJvdW5kX2xp c3Q7Ci0KLQlzdHJ1Y3QgcGFnZXN0YXNoIGZyZWVfcGFnZXM7Ci0KLQkvKiBHbG9iYWwgR1RUICov Ci0JYm9vbCBpc19nZ3R0OjE7Ci0KLQkvKiBTb21lIHN5c3RlbXMgcmVxdWlyZSB1bmNhY2hlZCB1 cGRhdGVzIG9mIHRoZSBwYWdlIGRpcmVjdG9yaWVzICovCi0JYm9vbCBwdF9rbWFwX3djOjE7Ci0K LQkvKiBTb21lIHN5c3RlbXMgc3VwcG9ydCByZWFkLW9ubHkgbWFwcGluZ3MgZm9yIEdHVFQgYW5k L29yIFBQR1RUICovCi0JYm9vbCBoYXNfcmVhZF9vbmx5OjE7Ci0KLQl1NjQgKCpwdGVfZW5jb2Rl KShkbWFfYWRkcl90IGFkZHIsCi0JCQkgIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBsZXZlbCwKLQkJ CSAgdTMyIGZsYWdzKTsgLyogQ3JlYXRlIGEgdmFsaWQgUFRFICovCi0jZGVmaW5lIFBURV9SRUFE X09OTFkJKDE8PDApCi0KLQlpbnQgKCphbGxvY2F0ZV92YV9yYW5nZSkoc3RydWN0IGk5MTVfYWRk cmVzc19zcGFjZSAqdm0sCi0JCQkJIHU2NCBzdGFydCwgdTY0IGxlbmd0aCk7Ci0Jdm9pZCAoKmNs ZWFyX3JhbmdlKShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKLQkJCSAgICB1NjQgc3Rh cnQsIHU2NCBsZW5ndGgpOwotCXZvaWQgKCppbnNlcnRfcGFnZSkoc3RydWN0IGk5MTVfYWRkcmVz c19zcGFjZSAqdm0sCi0JCQkgICAgZG1hX2FkZHJfdCBhZGRyLAotCQkJICAgIHU2NCBvZmZzZXQs Ci0JCQkgICAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGNhY2hlX2xldmVsLAotCQkJICAgIHUzMiBm bGFncyk7Ci0Jdm9pZCAoKmluc2VydF9lbnRyaWVzKShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNl ICp2bSwKLQkJCSAgICAgICBzdHJ1Y3QgaTkxNV92bWEgKnZtYSwKLQkJCSAgICAgICBlbnVtIGk5 MTVfY2FjaGVfbGV2ZWwgY2FjaGVfbGV2ZWwsCi0JCQkgICAgICAgdTMyIGZsYWdzKTsKLQl2b2lk ICgqY2xlYW51cCkoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pOwotCi0Jc3RydWN0IGk5 MTVfdm1hX29wcyB2bWFfb3BzOwotCi0JSTkxNV9TRUxGVEVTVF9ERUNMQVJFKHN0cnVjdCBmYXVs dF9hdHRyIGZhdWx0X2F0dHIpOwotCUk5MTVfU0VMRlRFU1RfREVDTEFSRShib29sIHNjcnViXzY0 Syk7Ci19OwotCi0jZGVmaW5lIGk5MTVfaXNfZ2d0dCh2bSkgKCh2bSktPmlzX2dndHQpCi0KLXN0 YXRpYyBpbmxpbmUgYm9vbAotaTkxNV92bV9pc180bHZsKGNvbnN0IHN0cnVjdCBpOTE1X2FkZHJl c3Nfc3BhY2UgKnZtKQotewotCXJldHVybiAodm0tPnRvdGFsIC0gMSkgPj4gMzI7Ci19Ci0KLXN0 YXRpYyBpbmxpbmUgYm9vbAotaTkxNV92bV9oYXNfc2NyYXRjaF82NEsoc3RydWN0IGk5MTVfYWRk cmVzc19zcGFjZSAqdm0pCi17Ci0JcmV0dXJuIHZtLT5zY3JhdGNoX29yZGVyID09IGdldF9vcmRl cihJOTE1X0dUVF9QQUdFX1NJWkVfNjRLKTsKLX0KLQotc3RhdGljIGlubGluZSBib29sCi1pOTE1 X3ZtX2hhc19jYWNoZV9jb2xvcmluZyhzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkKLXsK LQlyZXR1cm4gaTkxNV9pc19nZ3R0KHZtKSAmJiB2bS0+bW0uY29sb3JfYWRqdXN0OwotfQotCi0v KiBUaGUgR3JhcGhpY3MgVHJhbnNsYXRpb24gVGFibGUgaXMgdGhlIHdheSBpbiB3aGljaCBHRU4g aGFyZHdhcmUgdHJhbnNsYXRlcyBhCi0gKiBHcmFwaGljcyBWaXJ0dWFsIEFkZHJlc3MgaW50byBh IFBoeXNpY2FsIEFkZHJlc3MuIEluIGFkZGl0aW9uIHRvIHRoZSBub3JtYWwKLSAqIGNvbGxhdGVy YWwgYXNzb2NpYXRlZCB3aXRoIGFueSB2YS0+cGEgdHJhbnNsYXRpb25zIEdFTiBoYXJkd2FyZSBh bHNvIGhhcyBhCi0gKiBwb3J0aW9uIG9mIHRoZSBHVFQgd2hpY2ggY2FuIGJlIG1hcHBlZCBieSB0 aGUgQ1BVIGFuZCByZW1haW4gYm90aCBjb2hlcmVudAotICogYW5kIGNvcnJlY3QgKGluIGNhc2Vz IGxpa2Ugc3dpenpsaW5nKS4gVGhhdCByZWdpb24gaXMgcmVmZXJyZWQgdG8gYXMgR01BRFIgaW4K LSAqIHRoZSBzcGVjLgotICovCi1zdHJ1Y3QgaTkxNV9nZ3R0IHsKLQlzdHJ1Y3QgaTkxNV9hZGRy ZXNzX3NwYWNlIHZtOwotCi0Jc3RydWN0IGlvX21hcHBpbmcgaW9tYXA7CS8qIE1hcHBpbmcgdG8g b3VyIENQVSBtYXBwYWJsZSByZWdpb24gKi8KLQlzdHJ1Y3QgcmVzb3VyY2UgZ21hZHI7ICAgICAg ICAgIC8qIEdNQURSIHJlc291cmNlICovCi0JcmVzb3VyY2Vfc2l6ZV90IG1hcHBhYmxlX2VuZDsJ LyogRW5kIG9mZnNldCB0aGF0IHdlIGNhbiBDUFUgbWFwICovCi0KLQkvKiogIkdyYXBoaWNzIFN0 b2xlbiBNZW1vcnkiIGhvbGRzIHRoZSBnbG9iYWwgUFRFcyAqLwotCXZvaWQgX19pb21lbSAqZ3Nt OwotCXZvaWQgKCppbnZhbGlkYXRlKShzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0KTsKLQotCS8qKiBQ UEdUVCB1c2VkIGZvciBhbGlhc2luZyB0aGUgUFBHVFQgd2l0aCB0aGUgR1RUICovCi0Jc3RydWN0 IGk5MTVfcHBndHQgKmFsaWFzOwotCi0JYm9vbCBkb19pZGxlX21hcHM7Ci0KLQlpbnQgbXRycjsK LQotCS8qKiBCaXQgNiBzd2l6emxpbmcgcmVxdWlyZWQgZm9yIFggdGlsaW5nICovCi0JdTMyIGJp dF82X3N3aXp6bGVfeDsKLQkvKiogQml0IDYgc3dpenpsaW5nIHJlcXVpcmVkIGZvciBZIHRpbGlu ZyAqLwotCXUzMiBiaXRfNl9zd2l6emxlX3k7Ci0KLQl1MzIgcGluX2JpYXM7Ci0KLQl1bnNpZ25l ZCBpbnQgbnVtX2ZlbmNlczsKLQlzdHJ1Y3QgaTkxNV9mZW5jZV9yZWcgZmVuY2VfcmVnc1tJOTE1 X01BWF9OVU1fRkVOQ0VTXTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZlbmNlX2xpc3Q7Ci0KLQkvKiog TGlzdCBvZiBhbGwgb2JqZWN0cyBpbiBndHRfc3BhY2UsIGN1cnJlbnRseSBtbWFwZWQgYnkgdXNl cnNwYWNlLgotCSAqIEFsbCBvYmplY3RzIHdpdGhpbiB0aGlzIGxpc3QgbXVzdCBhbHNvIGJlIG9u IGJvdW5kX2xpc3QuCi0JICovCi0Jc3RydWN0IGxpc3RfaGVhZCB1c2VyZmF1bHRfbGlzdDsKLQot CS8qIE1hbnVhbCBydW50aW1lIHBtIGF1dG9zdXNwZW5kIGRlbGF5IGZvciB1c2VyIEdHVFQgbW1h cHMgKi8KLQlzdHJ1Y3QgaW50ZWxfd2FrZXJlZl9hdXRvIHVzZXJmYXVsdF93YWtlcmVmOwotCi0J c3RydWN0IGRybV9tbV9ub2RlIGVycm9yX2NhcHR1cmU7Ci0Jc3RydWN0IGRybV9tbV9ub2RlIHVj X2Z3OwotfTsKLQotc3RydWN0IGk5MTVfcHBndHQgewotCXN0cnVjdCBpOTE1X2FkZHJlc3Nfc3Bh Y2Ugdm07Ci0KLQlzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqcGQ7Ci19OwotCi1zdHJ1Y3Qg Z2VuNl9wcGd0dCB7Ci0Jc3RydWN0IGk5MTVfcHBndHQgYmFzZTsKLQotCXN0cnVjdCBtdXRleCBm bHVzaDsKLQlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKLQlnZW42X3B0ZV90IF9faW9tZW0gKnBkX2Fk ZHI7Ci0KLQlhdG9taWNfdCBwaW5fY291bnQ7Ci0Jc3RydWN0IG11dGV4IHBpbl9tdXRleDsKLQot CWJvb2wgc2Nhbl9mb3JfdW51c2VkX3B0OwotfTsKLQotI2RlZmluZSBfX3RvX2dlbjZfcHBndHQo YmFzZSkgY29udGFpbmVyX29mKGJhc2UsIHN0cnVjdCBnZW42X3BwZ3R0LCBiYXNlKQotCi1zdGF0 aWMgaW5saW5lIHN0cnVjdCBnZW42X3BwZ3R0ICp0b19nZW42X3BwZ3R0KHN0cnVjdCBpOTE1X3Bw Z3R0ICpiYXNlKQotewotCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgZ2VuNl9wcGd0dCwg YmFzZSkpOwotCXJldHVybiBfX3RvX2dlbjZfcHBndHQoYmFzZSk7Ci19Ci0KLS8qCi0gKiBnZW42 X2Zvcl9lYWNoX3BkZSgpIGl0ZXJhdGVzIG92ZXIgZXZlcnkgcGRlIGZyb20gc3RhcnQgdW50aWwg c3RhcnQrbGVuZ3RoLgotICogSWYgc3RhcnQgYW5kIHN0YXJ0K2xlbmd0aCBhcmUgbm90IHBlcmZl Y3RseSBkaXZpc2libGUsIHRoZSBtYWNybyB3aWxsIHJvdW5kCi0gKiBkb3duIGFuZCB1cCBhcyBu ZWVkZWQuIFN0YXJ0PTAgYW5kIGxlbmd0aD0yRyBlZmZlY3RpdmVseSBpdGVyYXRlcyBvdmVyCi0g KiBldmVyeSBQREUgaW4gdGhlIHN5c3RlbS4gVGhlIG1hY3JvIG1vZGlmaWVzIEFMTCBpdHMgcGFy YW1ldGVycyBleGNlcHQgJ3BkJywKLSAqIHNvIGVhY2ggb2YgdGhlIG90aGVyIHBhcmFtZXRlcnMg c2hvdWxkIHByZWZlcmFibHkgYmUgYSBzaW1wbGUgdmFyaWFibGUsIG9yCi0gKiBhdCBtb3N0IGFu IGx2YWx1ZSB3aXRoIG5vIHNpZGUtZWZmZWN0cyEKLSAqLwotI2RlZmluZSBnZW42X2Zvcl9lYWNo X3BkZShwdCwgcGQsIHN0YXJ0LCBsZW5ndGgsIGl0ZXIpCQkJXAotCWZvciAoaXRlciA9IGdlbjZf cGRlX2luZGV4KHN0YXJ0KTsJCQkJXAotCSAgICAgbGVuZ3RoID4gMCAmJiBpdGVyIDwgSTkxNV9Q REVTICYmCQkJCVwKLQkJICAgICAocHQgPSBpOTE1X3B0X2VudHJ5KHBkLCBpdGVyKSwgdHJ1ZSk7 CQlcCi0JICAgICAoeyB1MzIgdGVtcCA9IEFMSUdOKHN0YXJ0KzEsIDEgPDwgR0VONl9QREVfU0hJ RlQpOwkJXAotCQkgICAgdGVtcCA9IG1pbih0ZW1wIC0gc3RhcnQsIGxlbmd0aCk7CQkJXAotCQkg ICAgc3RhcnQgKz0gdGVtcCwgbGVuZ3RoIC09IHRlbXA7IH0pLCArK2l0ZXIpCi0KLSNkZWZpbmUg Z2VuNl9mb3JfYWxsX3BkZXMocHQsIHBkLCBpdGVyKQkJCQkJXAotCWZvciAoaXRlciA9IDA7CQkJ CQkJCVwKLQkgICAgIGl0ZXIgPCBJOTE1X1BERVMgJiYJCQkJCVwKLQkJICAgICAocHQgPSBpOTE1 X3B0X2VudHJ5KHBkLCBpdGVyKSwgdHJ1ZSk7CQlcCi0JICAgICArK2l0ZXIpCi0KLXN0YXRpYyBp bmxpbmUgdTMyIGk5MTVfcHRlX2luZGV4KHU2NCBhZGRyZXNzLCB1bnNpZ25lZCBpbnQgcGRlX3No aWZ0KQotewotCWNvbnN0IHUzMiBtYXNrID0gTlVNX1BURShwZGVfc2hpZnQpIC0gMTsKLQotCXJl dHVybiAoYWRkcmVzcyA+PiBQQUdFX1NISUZUKSAmIG1hc2s7Ci19Ci0KLS8qIEhlbHBlciB0byBj b3VudHMgdGhlIG51bWJlciBvZiBQVEVzIHdpdGhpbiB0aGUgZ2l2ZW4gbGVuZ3RoLiBUaGlzIGNv dW50Ci0gKiBkb2VzIG5vdCBjcm9zcyBhIHBhZ2UgdGFibGUgYm91bmRhcnksIHNvIHRoZSBtYXgg dmFsdWUgd291bGQgYmUKLSAqIEdFTjZfUFRFUyBmb3IgR0VONiwgYW5kIEdFTjhfUFRFUyBmb3Ig R0VOOC4KLSovCi1zdGF0aWMgaW5saW5lIHUzMiBpOTE1X3B0ZV9jb3VudCh1NjQgYWRkciwgdTY0 IGxlbmd0aCwgdW5zaWduZWQgaW50IHBkZV9zaGlmdCkKLXsKLQljb25zdCB1NjQgbWFzayA9IH4o KDFVTEwgPDwgcGRlX3NoaWZ0KSAtIDEpOwotCXU2NCBlbmQ7Ci0KLQlHRU1fQlVHX09OKGxlbmd0 aCA9PSAwKTsKLQlHRU1fQlVHX09OKG9mZnNldF9pbl9wYWdlKGFkZHIgfCBsZW5ndGgpKTsKLQot CWVuZCA9IGFkZHIgKyBsZW5ndGg7Ci0KLQlpZiAoKGFkZHIgJiBtYXNrKSAhPSAoZW5kICYgbWFz aykpCi0JCXJldHVybiBOVU1fUFRFKHBkZV9zaGlmdCkgLSBpOTE1X3B0ZV9pbmRleChhZGRyLCBw ZGVfc2hpZnQpOwotCi0JcmV0dXJuIGk5MTVfcHRlX2luZGV4KGVuZCwgcGRlX3NoaWZ0KSAtIGk5 MTVfcHRlX2luZGV4KGFkZHIsIHBkZV9zaGlmdCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIGk5 MTVfcGRlX2luZGV4KHU2NCBhZGRyLCB1MzIgc2hpZnQpCi17Ci0JcmV0dXJuIChhZGRyID4+IHNo aWZ0KSAmIEk5MTVfUERFX01BU0s7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIGdlbjZfcHRlX2lu ZGV4KHUzMiBhZGRyKQotewotCXJldHVybiBpOTE1X3B0ZV9pbmRleChhZGRyLCBHRU42X1BERV9T SElGVCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIGdlbjZfcHRlX2NvdW50KHUzMiBhZGRyLCB1 MzIgbGVuZ3RoKQotewotCXJldHVybiBpOTE1X3B0ZV9jb3VudChhZGRyLCBsZW5ndGgsIEdFTjZf UERFX1NISUZUKTsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgZ2VuNl9wZGVfaW5kZXgodTMyIGFk ZHIpCi17Ci0JcmV0dXJuIGk5MTVfcGRlX2luZGV4KGFkZHIsIEdFTjZfUERFX1NISUZUKTsKLX0K LQotc3RhdGljIGlubGluZSBzdHJ1Y3QgaTkxNV9wYWdlX3RhYmxlICoKLWk5MTVfcHRfZW50cnko Y29uc3Qgc3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKiBjb25zdCBwZCwKLQkgICAgICBjb25z dCB1bnNpZ25lZCBzaG9ydCBuKQotewotCXJldHVybiBwZC0+ZW50cnlbbl07Ci19Ci0KLXN0YXRp YyBpbmxpbmUgc3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKgotaTkxNV9wZF9lbnRyeShjb25z dCBzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqIGNvbnN0IHBkcCwKLQkgICAgICBjb25zdCB1 bnNpZ25lZCBzaG9ydCBuKQotewotCXJldHVybiBwZHAtPmVudHJ5W25dOwotfQotCi1zdGF0aWMg aW5saW5lIGRtYV9hZGRyX3QKLWk5MTVfcGFnZV9kaXJfZG1hX2FkZHIoY29uc3Qgc3RydWN0IGk5 MTVfcHBndHQgKnBwZ3R0LCBjb25zdCB1bnNpZ25lZCBpbnQgbikKLXsKLQlzdHJ1Y3QgaTkxNV9w YWdlX2RtYSAqcHQgPSBwcGd0dC0+cGQtPmVudHJ5W25dOwotCi0JcmV0dXJuIHB4X2RtYShwdCA/ OiBweF9iYXNlKCZwcGd0dC0+dm0uc2NyYXRjaFtwcGd0dC0+dm0udG9wXSkpOwotfQotCi1zdGF0 aWMgaW5saW5lIHN0cnVjdCBpOTE1X2dndHQgKgotaTkxNV92bV90b19nZ3R0KHN0cnVjdCBpOTE1 X2FkZHJlc3Nfc3BhY2UgKnZtKQotewotCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaTkx NV9nZ3R0LCB2bSkpOwotCUdFTV9CVUdfT04oIWk5MTVfaXNfZ2d0dCh2bSkpOwotCXJldHVybiBj b250YWluZXJfb2Yodm0sIHN0cnVjdCBpOTE1X2dndHQsIHZtKTsKLX0KLQotc3RhdGljIGlubGlu ZSBzdHJ1Y3QgaTkxNV9wcGd0dCAqCi1pOTE1X3ZtX3RvX3BwZ3R0KHN0cnVjdCBpOTE1X2FkZHJl c3Nfc3BhY2UgKnZtKQotewotCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaTkxNV9wcGd0 dCwgdm0pKTsKLQlHRU1fQlVHX09OKGk5MTVfaXNfZ2d0dCh2bSkpOwotCXJldHVybiBjb250YWlu ZXJfb2Yodm0sIHN0cnVjdCBpOTE1X3BwZ3R0LCB2bSk7Ci19Ci0KLWludCBpOTE1X2dndHRfcHJv YmVfaHcoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKLWludCBpOTE1X2dndHRf aW5pdF9odyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOwotaW50IGk5MTVfZ2d0 dF9lbmFibGVfaHcoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKLXZvaWQgaTkx NV9nZ3R0X2VuYWJsZV9ndWMoc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCk7Ci12b2lkIGk5MTVfZ2d0 dF9kaXNhYmxlX2d1YyhzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0KTsKLWludCBpOTE1X2luaXRfZ2d0 dChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOwotdm9pZCBpOTE1X2dndHRfZHJp dmVyX3JlbGVhc2Uoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKLQotc3RhdGlj IGlubGluZSBib29sIGk5MTVfZ2d0dF9oYXNfYXBlcnR1cmUoY29uc3Qgc3RydWN0IGk5MTVfZ2d0 dCAqZ2d0dCkKLXsKLQlyZXR1cm4gZ2d0dC0+bWFwcGFibGVfZW5kID4gMDsKLX0KLQotaW50IGk5 MTVfcHBndHRfaW5pdF9odyhzdHJ1Y3QgaW50ZWxfZ3QgKmd0KTsKLQotc3RydWN0IGk5MTVfcHBn dHQgKmk5MTVfcHBndHRfY3JlYXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7 Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqCi1pOTE1X3ZtX2dl dChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkKLXsKLQlrcmVmX2dldCgmdm0tPnJlZik7 Ci0JcmV0dXJuIHZtOwotfQotCi12b2lkIGk5MTVfdm1fcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3Jl Zik7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpOTE1X3ZtX3B1dChzdHJ1Y3QgaTkxNV9hZGRyZXNz X3NwYWNlICp2bSkKLXsKLQlrcmVmX3B1dCgmdm0tPnJlZiwgaTkxNV92bV9yZWxlYXNlKTsKLX0K LQotc3RhdGljIGlubGluZSBzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICoKLWk5MTVfdm1fb3Bl bihzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkKLXsKLQlHRU1fQlVHX09OKCFhdG9taWNf cmVhZCgmdm0tPm9wZW4pKTsKLQlhdG9taWNfaW5jKCZ2bS0+b3Blbik7Ci0JcmV0dXJuIGk5MTVf dm1fZ2V0KHZtKTsKLX0KLQotc3RhdGljIGlubGluZSBib29sCi1pOTE1X3ZtX3RyeW9wZW4oc3Ry dWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pCi17Ci0JaWYgKGF0b21pY19hZGRfdW5sZXNzKCZ2 bS0+b3BlbiwgMSwgMCkpCi0JCXJldHVybiBpOTE1X3ZtX2dldCh2bSk7Ci0KLQlyZXR1cm4gZmFs c2U7Ci19Ci0KLXZvaWQgX19pOTE1X3ZtX2Nsb3NlKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2Ug KnZtKTsKLQotc3RhdGljIGlubGluZSB2b2lkCi1pOTE1X3ZtX2Nsb3NlKHN0cnVjdCBpOTE1X2Fk ZHJlc3Nfc3BhY2UgKnZtKQotewotCUdFTV9CVUdfT04oIWF0b21pY19yZWFkKCZ2bS0+b3Blbikp OwotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZ2bS0+b3BlbikpCi0JCV9faTkxNV92bV9jbG9z ZSh2bSk7Ci0KLQlpOTE1X3ZtX3B1dCh2bSk7Ci19Ci0KLWludCBnZW42X3BwZ3R0X3BpbihzdHJ1 Y3QgaTkxNV9wcGd0dCAqYmFzZSk7Ci12b2lkIGdlbjZfcHBndHRfdW5waW4oc3RydWN0IGk5MTVf cHBndHQgKmJhc2UpOwotdm9pZCBnZW42X3BwZ3R0X3VucGluX2FsbChzdHJ1Y3QgaTkxNV9wcGd0 dCAqYmFzZSk7Ci0KLXZvaWQgaTkxNV9nZW1fc3VzcGVuZF9ndHRfbWFwcGluZ3Moc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKLXZvaWQgaTkxNV9nZW1fcmVzdG9yZV9ndHRfbWFw cGluZ3Moc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKIAogaW50IF9fbXVzdF9j aGVjayBpOTE1X2dlbV9ndHRfcHJlcGFyZV9wYWdlcyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVj dCAqb2JqLAogCQkJCQkgICAgc3RydWN0IHNnX3RhYmxlICpwYWdlcyk7CkBAIC02NjQsNiArNDQs NiBAQCBpbnQgaTkxNV9nZW1fZ3R0X2luc2VydChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2 bSwKICNkZWZpbmUgUElOX0dMT0JBTAkJQklUX1VMTCgxMCkgLyogSTkxNV9WTUFfR0xPQkFMX0JJ TkQgKi8KICNkZWZpbmUgUElOX1VTRVIJCUJJVF9VTEwoMTEpIC8qIEk5MTVfVk1BX0xPQ0FMX0JJ TkQgKi8KIAotI2RlZmluZSBQSU5fT0ZGU0VUX01BU0sJCSgtSTkxNV9HVFRfUEFHRV9TSVpFKQor I2RlZmluZSBQSU5fT0ZGU0VUX01BU0sJCUk5MTVfR1RUX1BBR0VfTUFTSwogCiAjZW5kaWYKZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X2dlbV9ndHQuYyBi L2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X2dlbV9ndHQuYwppbmRleCA4MGNk ZTViZGE5MjIuLjhmYmZlODU4NmE2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUv c2VsZnRlc3RzL2k5MTVfZ2VtX2d0dC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0 ZXN0cy9pOTE1X2dlbV9ndHQuYwpAQCAtMzQsNiArMzQsNyBAQAogCiAjaW5jbHVkZSAibW9ja19k cm0uaCIKICNpbmNsdWRlICJtb2NrX2dlbV9kZXZpY2UuaCIKKyNpbmNsdWRlICJtb2NrX2d0dC5o IgogI2luY2x1ZGUgImlndF9mbHVzaF90ZXN0LmgiCiAKIHN0YXRpYyB2b2lkIGNsZWFudXBfZnJl ZWRfb2JqZWN0cyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKQEAgLTE1MSw3ICsxNTIs NyBAQCBzdGF0aWMgaW50IGlndF9wcGd0dF9hbGxvYyh2b2lkICphcmcpCiAJaWYgKCFIQVNfUFBH VFQoZGV2X3ByaXYpKQogCQlyZXR1cm4gMDsKIAotCXBwZ3R0ID0gX19wcGd0dF9jcmVhdGUoZGV2 X3ByaXYpOworCXBwZ3R0ID0gaTkxNV9wcGd0dF9jcmVhdGUoZGV2X3ByaXYpOwogCWlmIChJU19F UlIocHBndHQpKQogCQlyZXR1cm4gUFRSX0VSUihwcGd0dCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZl cnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9tb2NrX2d0dC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5 MTUvc2VsZnRlc3RzL21vY2tfZ3R0LmMKaW5kZXggMjBhYzM4NDRlZGVjLi5lZGM1ZTNkZGE4Y2Eg MTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9tb2NrX2d0dC5jCisr KyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9tb2NrX2d0dC5jCkBAIC01NSw2ICs1 NSwxMSBAQCBzdGF0aWMgdm9pZCBtb2NrX2NsZWFudXAoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFj ZSAqdm0pCiB7CiB9CiAKK3N0YXRpYyB2b2lkIG1vY2tfY2xlYXJfcmFuZ2Uoc3RydWN0IGk5MTVf YWRkcmVzc19zcGFjZSAqdm0sCisJCQkgICAgIHU2NCBzdGFydCwgdTY0IGxlbmd0aCkKK3sKK30K Kwogc3RydWN0IGk5MTVfcHBndHQgKm1vY2tfcHBndHQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg Kmk5MTUsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IGk5MTVfcHBndHQgKnBwZ3R0OwpA QCAtNzAsNyArNzUsNyBAQCBzdHJ1Y3QgaTkxNV9wcGd0dCAqbW9ja19wcGd0dChzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqaTkxNSwgY29uc3QgY2hhciAqbmFtZSkKIAogCWk5MTVfYWRkcmVzc19z cGFjZV9pbml0KCZwcGd0dC0+dm0sIFZNX0NMQVNTX1BQR1RUKTsKIAotCXBwZ3R0LT52bS5jbGVh cl9yYW5nZSA9IG5vcF9jbGVhcl9yYW5nZTsKKwlwcGd0dC0+dm0uY2xlYXJfcmFuZ2UgPSBtb2Nr X2NsZWFyX3JhbmdlOwogCXBwZ3R0LT52bS5pbnNlcnRfcGFnZSA9IG1vY2tfaW5zZXJ0X3BhZ2U7 CiAJcHBndHQtPnZtLmluc2VydF9lbnRyaWVzID0gbW9ja19pbnNlcnRfZW50cmllczsKIAlwcGd0 dC0+dm0uY2xlYW51cCA9IG1vY2tfY2xlYW51cDsKQEAgLTEwNyw3ICsxMTIsNyBAQCB2b2lkIG1v Y2tfaW5pdF9nZ3R0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LCBzdHJ1Y3QgaTkxNV9n Z3R0ICpnZ3R0KQogCWdndHQtPm1hcHBhYmxlX2VuZCA9IHJlc291cmNlX3NpemUoJmdndHQtPmdt YWRyKTsKIAlnZ3R0LT52bS50b3RhbCA9IDQwOTYgKiBQQUdFX1NJWkU7CiAKLQlnZ3R0LT52bS5j bGVhcl9yYW5nZSA9IG5vcF9jbGVhcl9yYW5nZTsKKwlnZ3R0LT52bS5jbGVhcl9yYW5nZSA9IG1v Y2tfY2xlYXJfcmFuZ2U7CiAJZ2d0dC0+dm0uaW5zZXJ0X3BhZ2UgPSBtb2NrX2luc2VydF9wYWdl OwogCWdndHQtPnZtLmluc2VydF9lbnRyaWVzID0gbW9ja19pbnNlcnRfZW50cmllczsKIAlnZ3R0 LT52bS5jbGVhbnVwID0gbW9ja19jbGVhbnVwOwotLSAKMi4yMC4xCgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0Cklu dGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5v cmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK