From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Geoffrey D. Bennett" Subject: [PATCH V5] ALSA: usb-audio: Scarlett Gen 2 mixer interface Date: Wed, 10 Jul 2019 02:17:43 +0930 Message-ID: <20190709164743.GA26161@b4.vu> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from b4.vu (b4.vu [203.16.231.147]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 46BA4F801A4 for ; Tue, 9 Jul 2019 18:47:48 +0200 (CEST) Content-Disposition: inline List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" To: alsa-devel@alsa-project.org Cc: Takashi Iwai List-Id: alsa-devel@alsa-project.org QWRkIG1peGVyIHF1aXJrIGZvciB0aGUgRm9jdXNyaXRlIFNjYXJsZXR0IDZpNiwgMThpOCwgYW5k IDE4aTIwIEdlbiAyCmF1ZGlvIGludGVyZmFjZXMuIEFsdGhvdWdoIHRoZSBpbnRlcmZhY2VzIGFy ZSBVU0IgY29tcGxpYW50LAphZGRpdGlvbmFsIGlucHV0L291dHB1dCBsZXZlbCBjb250cm9scyBh bmQgaGFyZHdhcmUgcm91dGluZy9taXhpbmcKZnVuY3Rpb25hbGl0eSBhcmUgYXZhaWxhYmxlIHVz aW5nIHByb3ByaWV0YXJ5IFVTQiByZXF1ZXN0cy4KClNpZ25lZC1vZmYtYnk6IEdlb2ZmcmV5IEQu IEJlbm5ldHQgPGdAYjQudnU+Ci0tLQpIaSBhbGwsCgpUaGlzIHBhdGNoIGFkZHMgdGhlIGZvbGxv d2luZyBjb250cm9scyBmb3IgdGhlIFNjYXJsZXR0IDZpNiwgMThpOCwgYW5kCjE4aTIwIEdlbiAy OgotIE1hc3RlciB2b2x1bWUga25vYiBpbmRpY2F0b3IgKDE4aTIwIG9ubHkpCi0gTXV0ZSBhbmQg ZGltIHN3aXRjaGVzICgxOGkyMCBvbmx5KQotIFZvbHVtZSBjb250cm9scyBmb3IgdGhlIGFuYWxv Z3VlIEhXIG91dHB1dHMKLSBIVy9TVyB2b2x1bWUgc3dpdGNoZXMgZm9yIHRoZSAxMCBhbmFsb2d1 ZSBIVyBvdXRwdXRzICgxOGkyMCBvbmx5KQotIExpbmUgTGV2ZWwvSW5zdHJ1bWVudCBMZXZlbCBh bmQgUGFkIGNvbnRyb2xzICg2aTYgYW5kIDE4aTggb25seSkKLSBPdXRwdXQgbXV4ICh3aGVyZSB0 aGUgc291bmQgZm9yIHRoZSBIVyBvdXRwdXRzIGNvbWVzIGZyb207IGRlZmF1bHRzCiAgdG8gUENN IG91dHB1dHMpCi0gQ2FwdHVyZSBtdXggKHdoZXJlIHRoZSBzb3VuZCBmb3IgUENNIHJlY29yZGlu ZyBjb21lcyBmcm9tOyBkZWZhdWx0cwogIHRvIEhXIGlucHV0cykKLSBNYXRyaXggbXV4ICh3aGVy ZSB0aGUgc291bmQgZ29pbmcgaW50byB0aGUgbWl4ZXIgY29tZXMgZnJvbTsgMTgKICBpbnB1dHMg ZGVmYXVsdCBvZmYpCi0gTWl4ZXIgbWF0cml4ICgxOCBpbnB1dHMgKiAxMCBvdXRwdXRzID0gMTgw IGNvbnRyb2xzKQotIExldmVsIG1ldGVycwoKQ2hhbmdlcyBzaW5jZSB2MToKLSBBZGQgc3VwcG9y dCBmb3IgdGhlIFNjYXJsZXR0IDE4aTggR2VuIDIKLSBTYXZlIGNvbmZpZ3VyYXRpb24gcGFyYW1l dGVycyB0byBOVlJBTQotIEltcGxlbWVudGVkIGZlZWRiYWNrIGZyb20gVGFrYXNoaSdzIGVtYWls IDI0L0Fwci8yMDE5Ci0gTW92ZWQgcHJpdmF0ZSBmaWVsZCBmcm9tIHN0cnVjdCBzbmRfdXNiX2F1 ZGlvIHRvIHN0cnVjdAogIHVzYl9taXhlcl9pbnRlcmZhY2UKLSBBZGRlZCB0aW1lciBhbmQgYnVm ZmVyIGZpZWxkcyB0byBzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZQotIE90aGVyIHNtYWxsIGNv ZGUgZml4ZXMvY2xlYW51cHMvaW1wcm92ZW1lbnRzCgpDaGFuZ2VzIHNpbmNlIHYyOgotIEFkZCBz dXBwb3J0IGZvciB0aGUgU2NhcmxldHQgNmk2IEdlbiAyCi0gQWRkIHN1cHBvcnQgZm9yIGNvbnRy b2xsaW5nIHRoZSBtdXRlL2RpbSBzd2l0Y2hlcyAoMThpMjAgb25seSkKLSBJbXBsZW1lbnRlZCBm ZWVkYmFjayBmcm9tIFRha2FzaGkncyBlbWFpbCAyOS9BcHIvMjAxOTogT25lIHBvaW50ZXIKICBm aWVsZCBwcml2YXRlX2RhdGEgYW5kIG9uZSBmdW5jdGlvbiBwb2ludGVyIHByaXZhdGVfZnJlZS4g UmVwbGFjZWQKICB0aW1lciB3aXRoIGRlbGF5ZWQgd29yayAodGhhbmtzIGZvciB0aGF0IHN1Z2dl c3Rpb247IGl0IG1ha2VzIHRoZQogIGNvZGUgYSAqbG90KiBzaW1wbGVyISkuCi0gVGhlIG5ldyBm dW5jdGlvbmFsaXR5IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYXMgdGhlcmUgd2VyZSByZXBvcnRz CiAgb2Ygc29tZSBHZW4gMiBkZXZpY2VzIG5vdCByZXNwb25kaW5nIHRvIHRoZSBpbml0aWFsaXNh dGlvbiBzZXF1ZW5jZQogIGFuZCBoYW5naW5nLiBBZGRlZCBtb2R1bGUgcGFyYW1ldGVyICJzY2Fy bGV0dF9nZW4yX21peGVyX2VuYWJsZSIuCiAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHNldCwg bG9ncyBhIG1lc3NhZ2UgIkZvY3Vzcml0ZSBTY2FybGV0dCBHZW4KICAyIE1peGVyIERyaXZlciBk aXNhYmxlZDsgdXNlIG9wdGlvbnMgc25kX3VzYl9hdWRpbwogIHNjYXJsZXR0X2dlbjJfbWl4ZXJf ZW5hYmxlPTEgdG8gZW5hYmxlIGFuZCByZXBvcnQgYW55IGlzc3VlcyB0bwogIGdAYjQudnUiLgoK Q2hhbmdlcyBzaW5jZSB2MzoKLSBObyBmdW5jdGlvbmFsIGNoYW5nZXM7IGZpeCBjaGVja3BhdGNo LnBsIGVycm9yIGFuZCB0eXBvIGluCiAgZGVjbGFyYXRpb24uCgpDaGFuZ2VzIHNpbmNlIHY0Ogot IEltcGxlbWVudGVkIGZlZWRiYWNrIGZyb20gVGFrYXNoaSdzIGVtYWlsIDkvSnVsLzIwMTk6IGNh bmNlbAogIGRlbGF5ZWQgd29yayBvbiBzdXNwZW5kLCBkcm9wIGNvcHlyaWdodCB0ZXh0cywgcmVt b3ZlIHVubmVjZXNzYXJ5CiAgYmxhbmsgbGluZXMsIGFuZCBydW4ga21hbGxvYyBvdXRzaWRlIHRo ZSBtdXRleC4KCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvTWFrZWZpbGUgYi9zb3VuZC91c2IvTWFr ZWZpbGUKaW5kZXggZTFjZTI1N2FiNzA1Li5mNGI3Mzg0Y2FhOWQgMTAwNjQ0Ci0tLSBhL3NvdW5k L3VzYi9NYWtlZmlsZQorKysgYi9zb3VuZC91c2IvTWFrZWZpbGUKQEAgLTExLDYgKzExLDcgQEAg c25kLXVzYi1hdWRpby1vYmpzIDo9IAljYXJkLm8gXAogCQkJbWl4ZXIubyBcCiAJCQltaXhlcl9x dWlya3MubyBcCiAJCQltaXhlcl9zY2FybGV0dC5vIFwKKwkJCW1peGVyX3NjYXJsZXR0X2dlbjIu byBcCiAJCQltaXhlcl91czE2eDA4Lm8gXAogCQkJcGNtLm8gXAogCQkJcG93ZXIubyBcCmRpZmYg LS1naXQgYS9zb3VuZC91c2IvbWl4ZXIuYyBiL3NvdW5kL3VzYi9taXhlci5jCmluZGV4IGM3MDNm ODUzNGIwNy4uNzM0ODQ2ZmFlZTdhIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvbWl4ZXIuYworKysg Yi9zb3VuZC91c2IvbWl4ZXIuYwpAQCAtMzUwNSw2ICszNTA1LDggQEAgdm9pZCBzbmRfdXNiX21p eGVyX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQogCQl1c2Jf a2lsbF91cmIobWl4ZXItPnVyYik7CiAJaWYgKG1peGVyLT5yY191cmIpCiAJCXVzYl9raWxsX3Vy YihtaXhlci0+cmNfdXJiKTsKKwlpZiAobWl4ZXItPnByaXZhdGVfZnJlZSkKKwkJbWl4ZXItPnBy aXZhdGVfZnJlZShtaXhlcik7CiAJbWl4ZXItPmRpc2Nvbm5lY3RlZCA9IHRydWU7CiB9CiAKQEAg LTM1MzIsNiArMzUzNCw4IEBAIHN0YXRpYyBpbnQgc25kX3VzYl9taXhlcl9hY3RpdmF0ZShzdHJ1 Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCiBpbnQgc25kX3VzYl9taXhlcl9zdXNwZW5k KHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcikKIHsKIAlzbmRfdXNiX21peGVyX2lu YWN0aXZhdGUobWl4ZXIpOworCWlmIChtaXhlci0+cHJpdmF0ZV9zdXNwZW5kKQorCQltaXhlci0+ cHJpdmF0ZV9zdXNwZW5kKG1peGVyKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291 bmQvdXNiL21peGVyLmggYi9zb3VuZC91c2IvbWl4ZXIuaAppbmRleCAzOTRjZDkxMDc1MDcuLjM3 ZTFiMjM0YzgwMiAxMDA2NDQKLS0tIGEvc291bmQvdXNiL21peGVyLmgKKysrIGIvc291bmQvdXNi L21peGVyLmgKQEAgLTI4LDYgKzI4LDEwIEBAIHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlIHsK IAlzdHJ1Y3QgbWVkaWFfbWl4ZXJfY3RsICptZWRpYV9taXhlcl9jdGw7CiAKIAlib29sIGRpc2Nv bm5lY3RlZDsKKworCXZvaWQgKnByaXZhdGVfZGF0YTsKKwl2b2lkICgqcHJpdmF0ZV9mcmVlKShz dHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpOworCXZvaWQgKCpwcml2YXRlX3N1c3Bl bmQpKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcik7CiB9OwogCiAjZGVmaW5lIE1B WF9DSEFOTkVMUwkxNgkvKiBtYXggbG9naWNhbCBjaGFubmVscyAqLwpkaWZmIC0tZ2l0IGEvc291 bmQvdXNiL21peGVyX3F1aXJrcy5jIGIvc291bmQvdXNiL21peGVyX3F1aXJrcy5jCmluZGV4IDE5 OWZhMTU3YTQxMS4uNzA4MDVjMTViMGI1IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvbWl4ZXJfcXVp cmtzLmMKKysrIGIvc291bmQvdXNiL21peGVyX3F1aXJrcy5jCkBAIC0zMiw2ICszMiw3IEBACiAj aW5jbHVkZSAibWl4ZXIuaCIKICNpbmNsdWRlICJtaXhlcl9xdWlya3MuaCIKICNpbmNsdWRlICJt aXhlcl9zY2FybGV0dC5oIgorI2luY2x1ZGUgIm1peGVyX3NjYXJsZXR0X2dlbjIuaCIKICNpbmNs dWRlICJtaXhlcl91czE2eDA4LmgiCiAjaW5jbHVkZSAiaGVscGVyLmgiCiAKQEAgLTIyNTgsNiAr MjI1OSwxMiBAQCBpbnQgc25kX3VzYl9taXhlcl9hcHBseV9jcmVhdGVfcXVpcmsoc3RydWN0IHVz Yl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQogCQllcnIgPSBzbmRfc2NhcmxldHRfY29udHJvbHNf Y3JlYXRlKG1peGVyKTsKIAkJYnJlYWs7CiAKKwljYXNlIFVTQl9JRCgweDEyMzUsIDB4ODIwMyk6 IC8qIEZvY3Vzcml0ZSBTY2FybGV0dCA2aTYgMm5kIEdlbiAqLworCWNhc2UgVVNCX0lEKDB4MTIz NSwgMHg4MjA0KTogLyogRm9jdXNyaXRlIFNjYXJsZXR0IDE4aTggMm5kIEdlbiAqLworCWNhc2Ug VVNCX0lEKDB4MTIzNSwgMHg4MjAxKTogLyogRm9jdXNyaXRlIFNjYXJsZXR0IDE4aTIwIDJuZCBH ZW4gKi8KKwkJZXJyID0gc25kX3NjYXJsZXR0X2dlbjJfY29udHJvbHNfY3JlYXRlKG1peGVyKTsK KwkJYnJlYWs7CisKIAljYXNlIFVTQl9JRCgweDA0MWUsIDB4MzIzYik6IC8qIENyZWF0aXZlIFNv dW5kIEJsYXN0ZXIgRTEgKi8KIAkJZXJyID0gc25kX3NvdW5kYmxhc3Rlcl9lMV9zd2l0Y2hfY3Jl YXRlKG1peGVyKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWl4ZXJfc2Nhcmxl dHRfZ2VuMi5jIGIvc291bmQvdXNiL21peGVyX3NjYXJsZXR0X2dlbjIuYwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjFmMDU1Y2I4OWU5MQotLS0gL2Rldi9udWxsCisr KyBiL3NvdW5kL3VzYi9taXhlcl9zY2FybGV0dF9nZW4yLmMKQEAgLTAsMCArMSwyMDc1IEBACisv LyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyoKKyAqICAgRm9jdXNyaXRlIFNj YXJsZXR0IDZpNi8xOGk4LzE4aTIwIEdlbiAyIERyaXZlciBmb3IgQUxTQQorICoKKyAqICAgQ29w eXJpZ2h0IChjKSAyMDE4LTIwMTkgYnkgR2VvZmZyZXkgRC4gQmVubmV0dCA8ZyBhdCBiNC52dT4K KyAqCisgKiAgIEJhc2VkIG9uIHRoZSBTY2FybGV0dCAoR2VuIDEpIERyaXZlciBmb3IgQUxTQToK KyAqCisgKiAgIENvcHlyaWdodCAoYykgMjAxMyBieSBUb2JpYXMgSG9mZm1hbm4KKyAqICAgQ29w eXJpZ2h0IChjKSAyMDEzIGJ5IFJvYmluIEdhcmV1cyA8cm9iaW4gYXQgZ2FyZXVzLm9yZz4KKyAq ICAgQ29weXJpZ2h0IChjKSAyMDAyIGJ5IFRha2FzaGkgSXdhaSA8dGl3YWkgYXQgc3VzZS5kZT4K KyAqICAgQ29weXJpZ2h0IChjKSAyMDE0IGJ5IENocmlzIEogQXJnZXMgPGNocmlzLmouYXJnZXMg YXQgY2Fub25pY2FsLmNvbT4KKyAqCisgKiAgIE1hbnkgY29kZXMgYm9ycm93ZWQgZnJvbSBhdWRp by5jIGJ5CisgKiAgICAgQWxhbiBDb3ggKGFsYW4gYXQgbHhvcmd1ay51a3V1Lm9yZy51aykKKyAq ICAgICBUaG9tYXMgU2FpbGVyIChzYWlsZXIgYXQgaWZlLmVlLmV0aHouY2gpCisgKgorICogICBD b2RlIGNsZWFudXA6CisgKiAgIERhdmlkIEhlbm5pbmdzc29uIDxkYXZpZC5oZW5uaW5nc3NvbiBh dCBjYW5vbmljYWwuY29tPgorICovCisKKy8qIE1peGVyIEludGVyZmFjZSBmb3IgdGhlIEZvY3Vz cml0ZSBTY2FybGV0dCA2aTYvMThpOC8xOGkyMCBHZW4gMiBhdWRpbworICogaW50ZXJmYWNlLiBC YXNlZCBvbiB0aGUgR2VuIDEgZHJpdmVyIGFuZCByZXdyaXR0ZW4uCisgKi8KKworLyogVGhlIHBy b3RvY29sIHdhcyByZXZlcnNlIGVuZ2luZWVyZWQgYnkgbG9va2luZyBhdCB0aGUgY29tbXVuaWNh dGlvbgorICogYmV0d2VlbiBGb2N1c3JpdGUgQ29udHJvbCAyLjMuNCBhbmQgdGhlIEZvY3Vzcml0 ZShSKSBTY2FybGV0dCAxOGkyMAorICogKGZpcm13YXJlIDEwODMpIHVzaW5nIHVzYm1vbiBpbiBK dWx5LUF1Z3VzdCAyMDE4LgorICoKKyAqIFNjYXJsZXR0IDE4aTggc3VwcG9ydCBhZGRlZCBpbiBB cHJpbCAyMDE5LgorICoKKyAqIFNjYXJsZXR0IDZpNiBzdXBwb3J0IGFkZGVkIGluIEp1bmUgMjAx OSAodGhhbmtzIHRvIE1hcnRpbiBXaXR0bWFubgorICogZm9yIHByb3ZpZGluZyB1c2Jtb24gb3V0 cHV0IGFuZCB0ZXN0aW5nKS4KKyAqCisgKiBUaGlzIEFMU0EgbWl4ZXIgZ2l2ZXMgYWNjZXNzIHRv OgorICogIC0gaW5wdXQsIG91dHB1dCwgbWl4ZXItbWF0cml4IG11eGVzCisgKiAgLSAxOHgxMCBt aXhlci1tYXRyaXggZ2FpbiBzdGFnZXMKKyAqICAtIGdhaW4vdm9sdW1lIGNvbnRyb2xzCisgKiAg LSBsZXZlbCBtZXRlcnMKKyAqICAtIGxpbmUvaW5zdCBsZXZlbCBhbmQgcGFkIGNvbnRyb2xzCisg KgorICogPGRpdGFhPgorICogICAgLy0tLS0tLS0tLS0tLS0tXCAgICAxOGNobiAgICAgICAgICAg IDIwY2huICAgICAvLS0tLS0tLS0tLS0tLS1cCisgKiAgICB8IEhhcmR3YXJlICBpbiArLS0rLS0t LS0tXCAgICAvLS0tLS0tLS0tLS0tLSstLSsgQUxTQSBQQ00gb3V0IHwKKyAqICAgIFwtLS0tLS0t LS0tLS0tLS8gIHwgICAgICB8ICAgIHwgICAgICAgICAgICAgfCAgXC0tLS0tLS0tLS0tLS0tLwor ICogICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgfCAgICAvLS0tLS1cICB8CisgKiAg ICAgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICB8ICAgIHwgICAgIHwgIHwKKyAqICAgICAg ICAgICAgICAgICAgICAgIHwgICAgICB2ICAgIHYgICAgdiAgICAgfCAgfAorICogICAgICAgICAg ICAgICAgICAgICAgfCAgICstLS0tLS0tLS0tLS0tLS0rICB8ICB8CisgKiAgICAgICAgICAgICAg ICAgICAgICB8ICAgIFwgTWF0cml4ICBNdXggLyAgIHwgIHwKKyAqICAgICAgICAgICAgICAgICAg ICAgIHwgICAgICstLS0tLSstLS0tLSsgICAgfCAgfAorICogICAgICAgICAgICAgICAgICAgICAg fCAgICAgICAgICAgfCAgICAgICAgICB8ICB8CisgKiAgICAgICAgICAgICAgICAgICAgICB8ICAg ICAgICAgICB8MThjaG4gICAgIHwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAg ICAgIHwgICAgICAgICAgfCAgfAorICogICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAg fCAgICAgMTBjaG58ICB8CisgKiAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB2ICAg ICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgIHwgICAgICstLS0tLS0tLS0tLS0r ICAgfCAgfAorICogICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBNaXhlciAgICAgIHwgICB8 ICB8CisgKiAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8ICAgICBNYXRyaXggfCAgIHwgIHwK KyAqICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgICAgICAgICAgICB8ICAgfCAgfAorICog ICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCAxOHgxMCBHYWluIHwgICB8ICB8CisgKiAgICAg ICAgICAgICAgICAgICAgICB8ICAgICB8ICAgc3RhZ2VzICAgfCAgIHwgIHwKKyAqICAgICAgICAg ICAgICAgICAgICAgIHwgICAgICstLS0tLSstLS0tLS0rICAgfCAgfAorICogICAgICAgICAgICAg ICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICB8ICB8CisgKiAgICAgICAgICAgICAgICAg ICAgICB8MThjaG4gICAgICB8MTBjaG4gICAgIHwgIHwyMGNobgorICogICAgICAgICAgICAgICAg ICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICB8ICB8CisgKiAgICAgICAgICAgICAgICAgICAg ICB8ICAgICAgICAgICArLS0tLS0tLS0tLS8gIHwKKyAqICAgICAgICAgICAgICAgICAgICAgIHwg ICAgICAgICAgIHwgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgdiAgICAg ICAgICAgdiAgICAgICAgICAgICB2CisgKiAgICAgICAgICAgICAgICAgICAgICA9PT09PT09PT09 PT09PT09PT09PT09PT09PT0KKyAqICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsgICAg ICAgKy0t4oCULS0tLS0tLS0tLS0tKworICogICAgICAgICAgICAgICAgXCBPdXRwdXQgIE11eCAv ICAgICAgICAgXCBDYXB0dXJlIE11eCAvCisgKiAgICAgICAgICAgICAgICAgKy0tLSstLS0rLS0t KyAgICAgICAgICAgKy0tLS0tKy0tLS0tKworICogICAgICAgICAgICAgICAgICAgICB8ICAgfCAg ICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgIDEwY2hufCAgIHwgICAgICAg ICAgICAgICAgICAgICB8MThjaG4KKyAqICAgICAgICAgICAgICAgICAgICAgfCAgIHwgICAgICAg ICAgICAgICAgICAgICB8CisgKiAgLy0tLS0tLS0tLS0tLS0tXCAgIHwgICB8ICAgICAgICAgICAg ICAgICAgICAgfCAgIC8tLS0tLS0tLS0tLS0tLVwKKyAqICB8IFMvUERJRiwgQURBVCB8PC0tLyAg IHwxMGNobiAgICAgICAgICAgICAgICBcLS0+fCBBTFNBIFBDTSBpbiAgfAorICogIHwgSGFyZHdh cmUgb3V0IHwgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBcLS0tLS0tLS0tLS0tLS0v CisgKiAgXC0tLS0tLS0tLS0tLS0tLyAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAg ICB2CisgKiAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tKyAgICBTb2Z0d2FyZSBnYWlu IHBlciBjaGFubmVsLgorICogICAgICAgICAgICAgICAgICB8IE1hc3RlciBHYWluIHw8LS0gMThp MjAgb25seTogU3dpdGNoIHBlciBjaGFubmVsCisgKiAgICAgICAgICAgICAgICAgICstLS0tLS0r LS0tLS0tKyAgICB0byBzZWxlY3QgSFcgb3IgU1cgZ2FpbiBjb250cm9sLgorICogICAgICAgICAg ICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgfDEwY2huCisgKiAg Ly0tLS0tLS0tLS0tLS0tXCAgICAgICB8CisgKiAgfCBBbmFsb2d1ZSAgICAgfDwtLS0tLS0vCisg KiAgfCBIYXJkd2FyZSBvdXQgfAorICogIFwtLS0tLS0tLS0tLS0tLS8KKyAqIDwvZGl0YWE+Cisg KgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+ CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKworI2luY2x1ZGUgPHNvdW5kL2NvbnRy b2wuaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KKworI2luY2x1ZGUgInVzYmF1ZGlvLmgiCisj aW5jbHVkZSAibWl4ZXIuaCIKKyNpbmNsdWRlICJoZWxwZXIuaCIKKworI2luY2x1ZGUgIm1peGVy X3NjYXJsZXR0X2dlbjIuaCIKKworc3RhdGljIGludCBzY2FybGV0dF9nZW4yX21peGVyX2VuYWJs ZTsKK21vZHVsZV9wYXJhbShzY2FybGV0dF9nZW4yX21peGVyX2VuYWJsZSwgaW50LCAwNDQ0KTsK K01PRFVMRV9QQVJNX0RFU0Moc2NhcmxldHRfZ2VuMl9taXhlcl9lbmFibGUsCisJCSAiRm9jdXNy aXRlIFNjYXJsZXR0IEdlbiAyIE1peGVyIERyaXZlciBFbmFibGUiKTsKKworLyogc29tZSBndWkg bWl4ZXJzIGNhbid0IGhhbmRsZSBuZWdhdGl2ZSBjdGwgdmFsdWVzICovCisjZGVmaW5lIFNDQVJM RVRUX1ZPTFVNRV9CSUFTIDEyNworCisvKiBtaXhlciByYW5nZSBmcm9tIC04MGRCIHRvICs2ZEIg aW4gMC41ZEIgc3RlcHMgKi8KKyNkZWZpbmUgU0NBUkxFVFRfTUlYRVJfTUlOX0RCIC04MAorI2Rl ZmluZSBTQ0FSTEVUVF9NSVhFUl9CSUFTICgtU0NBUkxFVFRfTUlYRVJfTUlOX0RCICogMikKKyNk ZWZpbmUgU0NBUkxFVFRfTUlYRVJfTUFYX0RCIDYKKyNkZWZpbmUgU0NBUkxFVFRfTUlYRVJfTUFY X1ZBTFVFIFwKKwkoKFNDQVJMRVRUX01JWEVSX01BWF9EQiAtIFNDQVJMRVRUX01JWEVSX01JTl9E QikgKiAyKQorCisvKiBtYXAgZnJvbSAoZEIgKyA4MCkgKiAyIHRvIG1peGVyIHZhbHVlCisgKiBm b3IgZEIgaW4gMCAuLiAxNzI6IGludCg4MTkyICogcG93KDEwLCAoKGRCIC0gMTYwKSAvIDIgLyAy MCkpKQorICovCitzdGF0aWMgY29uc3QgdTE2IHNjYXJsZXR0Ml9taXhlcl92YWx1ZXNbMTczXSA9 IHsKKwkwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAyLCAy LCAyLCAyLCAyLAorCTIsIDIsIDMsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDYs IDYsIDYsIDcsIDcsIDgsIDgsCisJOSwgOSwgMTAsIDEwLCAxMSwgMTIsIDEyLCAxMywgMTQsIDE1 LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLAorCTIzLCAyNCwgMjUsIDI3LCAyOSwgMzAsIDMyLCAz NCwgMzYsIDM4LCA0MSwgNDMsIDQ2LCA0OCwgNTEsCisJNTQsIDU3LCA2MSwgNjUsIDY4LCA3Mywg NzcsIDgxLCA4NiwgOTEsIDk3LCAxMDMsIDEwOSwgMTE1LAorCTEyMiwgMTI5LCAxMzcsIDE0NSwg MTU0LCAxNjMsIDE3MywgMTgzLCAxOTQsIDIwNSwgMjE3LCAyMzAsCisJMjQ0LCAyNTksIDI3NCwg MjkwLCAzMDcsIDMyNiwgMzQ1LCAzNjUsIDM4NywgNDEwLCA0MzQsIDQ2MCwKKwk0ODcsIDUxNiwg NTQ3LCA1NzksIDYxNCwgNjUwLCA2ODksIDczMCwgNzczLCA4MTksIDg2NywgOTE5LAorCTk3Mywg MTAzMSwgMTA5MiwgMTE1NywgMTIyNSwgMTI5OCwgMTM3NSwgMTQ1NiwgMTU0MywgMTYzNCwKKwkx NzMxLCAxODMzLCAxOTQyLCAyMDU3LCAyMTc5LCAyMzA4LCAyNDQ1LCAyNTkwLCAyNzQ0LCAyOTA2 LAorCTMwNzgsIDMyNjEsIDM0NTQsIDM2NTksIDM4NzYsIDQxMDUsIDQzNDksIDQ2MDYsIDQ4Nzks IDUxNjgsCisJNTQ3NSwgNTc5OSwgNjE0MywgNjUwNywgNjg5MiwgNzMwMSwgNzczMywgODE5Miwg ODY3NywgOTE5MSwKKwk5NzM2LCAxMDMxMywgMTA5MjQsIDExNTcxLCAxMjI1NywgMTI5ODMsIDEz NzUyLCAxNDU2NywgMTU0MzAsCisJMTYzNDUKK307CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGFu YWxvZ3VlIG91dHB1dHMgKi8KKyNkZWZpbmUgU0NBUkxFVFQyX0FOQUxPR1VFX01BWCAxMAorCisv KiBNYXhpbXVtIG51bWJlciBvZiBsZXZlbCBhbmQgcGFkIHN3aXRjaGVzICovCisjZGVmaW5lIFND QVJMRVRUMl9MRVZFTF9TV0lUQ0hfTUFYIDIKKyNkZWZpbmUgU0NBUkxFVFQyX1BBRF9TV0lUQ0hf TUFYIDQKKworLyogTWF4aW11bSBudW1iZXIgb2YgaW5wdXRzIHRvIHRoZSBtaXhlciAqLworI2Rl ZmluZSBTQ0FSTEVUVDJfSU5QVVRfTUlYX01BWCAxOAorCisvKiBNYXhpbXVtIG51bWJlciBvZiBv dXRwdXRzIGZyb20gdGhlIG1peGVyICovCisjZGVmaW5lIFNDQVJMRVRUMl9PVVRQVVRfTUlYX01B WCAxMAorCisvKiBNYXhpbXVtIHNpemUgb2YgdGhlIGRhdGEgaW4gdGhlIFVTQiBtdXggYXNzaWdu bWVudCBtZXNzYWdlOgorICogMTggaW5wdXRzLCAyMCBvdXRwdXRzLCAxOCBtYXRyaXggaW5wdXRz LCA4IHNwYXJlCisgKi8KKyNkZWZpbmUgU0NBUkxFVFQyX01VWF9NQVggNjQKKworLyogTnVtYmVy IG9mIG1ldGVyczoKKyAqIDE4IGlucHV0cywgMjAgb3V0cHV0cywgMTggbWF0cml4IGlucHV0cwor ICovCisjZGVmaW5lIFNDQVJMRVRUMl9OVU1fTUVURVJTIDU2CisKKy8qIEhhcmR3YXJlIHBvcnQg dHlwZXM6CisgKiAtIE5vbmUgKG5vIGlucHV0IHRvIG11eCkKKyAqIC0gQW5hbG9ndWUgSS9PCisg KiAtIFMvUERJRiBJL08KKyAqIC0gQURBVCBJL08KKyAqIC0gTWl4ZXIgSS9PCisgKiAtIFBDTSBJ L08KKyAqLworZW51bSB7CisJU0NBUkxFVFQyX1BPUlRfVFlQRV9OT05FID0gMCwKKwlTQ0FSTEVU VDJfUE9SVF9UWVBFX0FOQUxPR1VFID0gMSwKKwlTQ0FSTEVUVDJfUE9SVF9UWVBFX1NQRElGID0g MiwKKwlTQ0FSTEVUVDJfUE9SVF9UWVBFX0FEQVQgPSAzLAorCVNDQVJMRVRUMl9QT1JUX1RZUEVf TUlYID0gNCwKKwlTQ0FSTEVUVDJfUE9SVF9UWVBFX1BDTSA9IDUsCisJU0NBUkxFVFQyX1BPUlRf VFlQRV9DT1VOVCA9IDYsCit9OworCisvKiBDb3VudCBvZiB0b3RhbCBJL08gYW5kIG51bWJlciBh dmFpbGFibGUgYXQgZWFjaCBzYW1wbGUgcmF0ZSAqLworZW51bSB7CisJU0NBUkxFVFQyX1BPUlRf SU4gPSAwLAorCVNDQVJMRVRUMl9QT1JUX09VVCA9IDEsCisJU0NBUkxFVFQyX1BPUlRfT1VUXzQ0 ID0gMiwKKwlTQ0FSTEVUVDJfUE9SVF9PVVRfODggPSAzLAorCVNDQVJMRVRUMl9QT1JUX09VVF8x NzYgPSA0LAorCVNDQVJMRVRUMl9QT1JUX0RJUkVDVElPTlMgPSA1LAorfTsKKworLyogSGFyZHdh cmUgYnV0dG9ucyBvbiB0aGUgMThpMjAgKi8KKyNkZWZpbmUgU0NBUkxFVFQyX0JVVFRPTl9NQVgg MgorCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2NhcmxldHQyX2J1dHRvbl9uYW1lc1tTQ0FS TEVUVDJfQlVUVE9OX01BWF0gPSB7CisJIk11dGUiLCAiRGltIgorfTsKKworLyogRGVzY3JpcHRp b24gb2YgZWFjaCBoYXJkd2FyZSBwb3J0IHR5cGU6CisgKiAtIGlkOiBoYXJkd2FyZSBJRCBmb3Ig dGhpcyBwb3J0IHR5cGUKKyAqIC0gbnVtOiBudW1iZXIgb2Ygc291cmNlcy9kZXN0aW5hdGlvbnMg b2YgdGhpcyBwb3J0IHR5cGUKKyAqIC0gc3JjX2Rlc2NyOiBwcmludGYgZm9ybWF0IHN0cmluZyBm b3IgbXV4IGlucHV0IHNlbGVjdGlvbnMKKyAqIC0gc3JjX251bV9vZmZzZXQ6IGFkZGVkIHRvIGNo YW5uZWwgbnVtYmVyIGZvciB0aGUgZnByaW50ZgorICogLSBkc3RfZGVzY3I6IHByaW50ZiBmb3Jt YXQgc3RyaW5nIGZvciBtaXhlciBjb250cm9scworICovCitzdHJ1Y3Qgc2NhcmxldHQyX3BvcnRz IHsKKwl1MTYgaWQ7CisJaW50IG51bVtTQ0FSTEVUVDJfUE9SVF9ESVJFQ1RJT05TXTsKKwljb25z dCBjaGFyICogY29uc3Qgc3JjX2Rlc2NyOworCWludCBzcmNfbnVtX29mZnNldDsKKwljb25zdCBj aGFyICogY29uc3QgZHN0X2Rlc2NyOworfTsKKworc3RydWN0IHNjYXJsZXR0Ml9kZXZpY2VfaW5m byB7CisJdTggbGluZV9vdXRfaHdfdm9sOyAvKiBsaW5lIG91dCBodyB2b2x1bWUgaXMgc3cgY29u dHJvbGxlZCAqLworCXU4IGJ1dHRvbl9jb3VudDsgLyogbnVtYmVyIG9mIGJ1dHRvbnMgKi8KKwl1 OCBsZXZlbF9pbnB1dF9jb3VudDsgLyogaW5wdXRzIHdpdGggbGV2ZWwgc2VsZWN0YWJsZSAqLwor CXU4IHBhZF9pbnB1dF9jb3VudDsgLyogaW5wdXRzIHdpdGggcGFkIHNlbGVjdGFibGUgKi8KKwlj b25zdCBjaGFyICogY29uc3QgbGluZV9vdXRfZGVzY3JzW1NDQVJMRVRUMl9BTkFMT0dVRV9NQVhd OworCXN0cnVjdCBzY2FybGV0dDJfcG9ydHMgcG9ydHNbU0NBUkxFVFQyX1BPUlRfVFlQRV9DT1VO VF07Cit9OworCitzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgeworCXN0cnVjdCB1c2JfbWl4 ZXJfaW50ZXJmYWNlICptaXhlcjsKKwlzdHJ1Y3QgbXV0ZXggdXNiX211dGV4OyAvKiBwcmV2ZW50 IHNlbmRpbmcgY29uY3VycmVudCBVU0IgcmVxdWVzdHMgKi8KKwlzdHJ1Y3QgbXV0ZXggZGF0YV9t dXRleDsgLyogbG9jayBhY2Nlc3MgdG8gdGhpcyBkYXRhICovCisJc3RydWN0IGRlbGF5ZWRfd29y ayB3b3JrOworCWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfZGV2aWNlX2luZm8gKmluZm87CisJaW50 IG51bV9tdXhfc3JjczsKKwl1MTYgc2NhcmxldHQyX3NlcTsKKwl1OCB2b2xfdXBkYXRlZDsKKwl1 OCBtYXN0ZXJfdm9sOworCXU4IHZvbFtTQ0FSTEVUVDJfQU5BTE9HVUVfTUFYXTsKKwl1OCB2b2xf c3dfaHdfc3dpdGNoW1NDQVJMRVRUMl9BTkFMT0dVRV9NQVhdOworCXU4IGxldmVsX3N3aXRjaFtT Q0FSTEVUVDJfTEVWRUxfU1dJVENIX01BWF07CisJdTggcGFkX3N3aXRjaFtTQ0FSTEVUVDJfUEFE X1NXSVRDSF9NQVhdOworCXU4IGJ1dHRvbnNbU0NBUkxFVFQyX0JVVFRPTl9NQVhdOworCXN0cnVj dCBzbmRfa2NvbnRyb2wgKm1hc3Rlcl92b2xfY3RsOworCXN0cnVjdCBzbmRfa2NvbnRyb2wgKnZv bF9jdGxzW1NDQVJMRVRUMl9BTkFMT0dVRV9NQVhdOworCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmJ1 dHRvbl9jdGxzW1NDQVJMRVRUMl9CVVRUT05fTUFYXTsKKwl1OCBtdXhbU0NBUkxFVFQyX01VWF9N QVhdOworCXU4IG1peFtTQ0FSTEVUVDJfSU5QVVRfTUlYX01BWCAqIFNDQVJMRVRUMl9PVVRQVVRf TUlYX01BWF07Cit9OworCitzdGF0aWMgdm9pZCBzbmRfc2NhcmxldHRfZ2VuMl9wcml2YXRlX2Zy ZWUoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKTsKK3N0YXRpYyB2b2lkIHNuZF9z Y2FybGV0dF9nZW4yX3ByaXZhdGVfc3VzcGVuZCgKKwkJCQkJc3RydWN0IHVzYl9taXhlcl9pbnRl cmZhY2UgKm1peGVyKTsKKworLyoqKiBNb2RlbC1zcGVjaWZpYyBkYXRhICoqKi8KKworc3RhdGlj IGNvbnN0IHN0cnVjdCBzY2FybGV0dDJfZGV2aWNlX2luZm8gczZpNl9nZW4yX2luZm8gPSB7CisJ LyogVGhlIGZpcnN0IHR3byBhbmFsb2d1ZSBpbnB1dHMgY2FuIGJlIHN3aXRjaGVkIGJldHdlZW4g bGluZQorCSAqIGFuZCBpbnN0cnVtZW50IGxldmVscy4KKwkgKi8KKwkubGV2ZWxfaW5wdXRfY291 bnQgPSAyLAorCisJLyogVGhlIGZpcnN0IHR3byBhbmFsb2d1ZSBpbnB1dHMgaGF2ZSBhbiBvcHRp b25hbCBwYWQuICovCisJLnBhZF9pbnB1dF9jb3VudCA9IDIsCisKKwkubGluZV9vdXRfZGVzY3Jz ID0geworCQkiTW9uaXRvciBMIiwKKwkJIk1vbml0b3IgUiIsCisJCSJIZWFkcGhvbmVzIEwiLAor CQkiSGVhZHBob25lcyBSIiwKKwl9LAorCisJLnBvcnRzID0geworCQl7CisJCQkuaWQgPSAweDAw MCwKKwkJCS5udW0gPSB7IDEsIDAsIDgsIDgsIDggfSwKKwkJCS5zcmNfZGVzY3IgPSAiT2ZmIiwK KwkJCS5zcmNfbnVtX29mZnNldCA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IDB4MDgwLAorCQkJ Lm51bSA9IHsgNCwgNCwgNCwgNCwgNCB9LAorCQkJLnNyY19kZXNjciA9ICJBbmFsb2d1ZSAlZCIs CisJCQkuc3JjX251bV9vZmZzZXQgPSAxLAorCQkJLmRzdF9kZXNjciA9ICJBbmFsb2d1ZSBPdXRw dXQgJTAyZCBQbGF5YmFjayIKKwkJfSwKKwkJeworCQkJLmlkID0gMHgxODAsCisJCQkubnVtID0g eyAyLCAyLCAyLCAyLCAyIH0sCisJCQkuc3JjX2Rlc2NyID0gIlMvUERJRiAlZCIsCisJCQkuc3Jj X251bV9vZmZzZXQgPSAxLAorCQkJLmRzdF9kZXNjciA9ICJTL1BESUYgT3V0cHV0ICVkIFBsYXli YWNrIgorCQl9LAorCQl7CisJCQkuaWQgPSAweDMwMCwKKwkJCS5udW0gPSB7IDEwLCAxOCwgMTgs IDE4LCAxOCB9LAorCQkJLnNyY19kZXNjciA9ICJNaXggJWMiLAorCQkJLnNyY19udW1fb2Zmc2V0 ID0gNjUsCisJCQkuZHN0X2Rlc2NyID0gIk1peGVyIElucHV0ICUwMmQgQ2FwdHVyZSIKKwkJfSwK KwkJeworCQkJLmlkID0gMHg2MDAsCisJCQkubnVtID0geyA2LCA2LCA2LCA2LCA2IH0sCisJCQku c3JjX2Rlc2NyID0gIlBDTSAlZCIsCisJCQkuc3JjX251bV9vZmZzZXQgPSAxLAorCQkJLmRzdF9k ZXNjciA9ICJQQ00gJTAyZCBDYXB0dXJlIgorCQl9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qg c3RydWN0IHNjYXJsZXR0Ml9kZXZpY2VfaW5mbyBzMThpOF9nZW4yX2luZm8gPSB7CisJLyogVGhl IGZpcnN0IHR3byBhbmFsb2d1ZSBpbnB1dHMgY2FuIGJlIHN3aXRjaGVkIGJldHdlZW4gbGluZQor CSAqIGFuZCBpbnN0cnVtZW50IGxldmVscy4KKwkgKi8KKwkubGV2ZWxfaW5wdXRfY291bnQgPSAy LAorCisJLyogVGhlIGZpcnN0IGZvdXIgYW5hbG9ndWUgaW5wdXRzIGhhdmUgYW4gb3B0aW9uYWwg cGFkLiAqLworCS5wYWRfaW5wdXRfY291bnQgPSA0LAorCisJLmxpbmVfb3V0X2Rlc2NycyA9IHsK KwkJIk1vbml0b3IgTCIsCisJCSJNb25pdG9yIFIiLAorCQkiSGVhZHBob25lcyAxIEwiLAorCQki SGVhZHBob25lcyAxIFIiLAorCQkiSGVhZHBob25lcyAyIEwiLAorCQkiSGVhZHBob25lcyAyIFIi LAorCX0sCisKKwkucG9ydHMgPSB7CisJCXsKKwkJCS5pZCA9IDB4MDAwLAorCQkJLm51bSA9IHsg MSwgMCwgOCwgOCwgNCB9LAorCQkJLnNyY19kZXNjciA9ICJPZmYiLAorCQkJLnNyY19udW1fb2Zm c2V0ID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gMHgwODAsCisJCQkubnVtID0geyA4LCA2LCA2 LCA2LCA2IH0sCisJCQkuc3JjX2Rlc2NyID0gIkFuYWxvZ3VlICVkIiwKKwkJCS5zcmNfbnVtX29m ZnNldCA9IDEsCisJCQkuZHN0X2Rlc2NyID0gIkFuYWxvZ3VlIE91dHB1dCAlMDJkIFBsYXliYWNr IgorCQl9LAorCQl7CisJCQkvKiBTL1BESUYgb3V0cHV0cyBhcmVuJ3QgYXZhaWxhYmxlIGF0IDE5 MktIegorCQkJICogYnV0IGFyZSBpbmNsdWRlZCBpbiB0aGUgVVNCIG11eCBJL08KKwkJCSAqIGFz c2lnbm1lbnQgbWVzc2FnZSBhbnl3YXkKKwkJCSAqLworCQkJLmlkID0gMHgxODAsCisJCQkubnVt ID0geyAyLCAyLCAyLCAyLCAyIH0sCisJCQkuc3JjX2Rlc2NyID0gIlMvUERJRiAlZCIsCisJCQku c3JjX251bV9vZmZzZXQgPSAxLAorCQkJLmRzdF9kZXNjciA9ICJTL1BESUYgT3V0cHV0ICVkIFBs YXliYWNrIgorCQl9LAorCQl7CisJCQkuaWQgPSAweDIwMCwKKwkJCS5udW0gPSB7IDgsIDAsIDAs IDAsIDAgfSwKKwkJCS5zcmNfZGVzY3IgPSAiQURBVCAlZCIsCisJCQkuc3JjX251bV9vZmZzZXQg PSAxLAorCQl9LAorCQl7CisJCQkuaWQgPSAweDMwMCwKKwkJCS5udW0gPSB7IDEwLCAxOCwgMTgs IDE4LCAxOCB9LAorCQkJLnNyY19kZXNjciA9ICJNaXggJWMiLAorCQkJLnNyY19udW1fb2Zmc2V0 ID0gNjUsCisJCQkuZHN0X2Rlc2NyID0gIk1peGVyIElucHV0ICUwMmQgQ2FwdHVyZSIKKwkJfSwK KwkJeworCQkJLmlkID0gMHg2MDAsCisJCQkubnVtID0geyAyMCwgMTgsIDE4LCAxNCwgMTAgfSwK KwkJCS5zcmNfZGVzY3IgPSAiUENNICVkIiwKKwkJCS5zcmNfbnVtX29mZnNldCA9IDEsCisJCQku ZHN0X2Rlc2NyID0gIlBDTSAlMDJkIENhcHR1cmUiCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBj b25zdCBzdHJ1Y3Qgc2NhcmxldHQyX2RldmljZV9pbmZvIHMxOGkyMF9nZW4yX2luZm8gPSB7CisJ LyogVGhlIGFuYWxvZ3VlIGxpbmUgb3V0cHV0cyBvbiB0aGUgMThpMjAgY2FuIGJlIHN3aXRjaGVk CisJICogYmV0d2VlbiBzb2Z0d2FyZSBhbmQgaGFyZHdhcmUgdm9sdW1lIGNvbnRyb2wKKwkgKi8K KwkubGluZV9vdXRfaHdfdm9sID0gMSwKKworCS8qIE11dGUgYW5kIGRpbSBidXR0b25zICovCisJ LmJ1dHRvbl9jb3VudCA9IDIsCisKKwkubGluZV9vdXRfZGVzY3JzID0geworCQkiTW9uaXRvciBM IiwKKwkJIk1vbml0b3IgUiIsCisJCU5VTEwsCisJCU5VTEwsCisJCU5VTEwsCisJCU5VTEwsCisJ CSJIZWFkcGhvbmVzIDEgTCIsCisJCSJIZWFkcGhvbmVzIDEgUiIsCisJCSJIZWFkcGhvbmVzIDIg TCIsCisJCSJIZWFkcGhvbmVzIDIgUiIsCisJfSwKKworCS5wb3J0cyA9IHsKKwkJeworCQkJLmlk ID0gMHgwMDAsCisJCQkubnVtID0geyAxLCAwLCA4LCA4LCA2IH0sCisJCQkuc3JjX2Rlc2NyID0g Ik9mZiIsCisJCQkuc3JjX251bV9vZmZzZXQgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSAweDA4 MCwKKwkJCS5udW0gPSB7IDgsIDEwLCAxMCwgMTAsIDEwIH0sCisJCQkuc3JjX2Rlc2NyID0gIkFu YWxvZ3VlICVkIiwKKwkJCS5zcmNfbnVtX29mZnNldCA9IDEsCisJCQkuZHN0X2Rlc2NyID0gIkFu YWxvZ3VlIE91dHB1dCAlMDJkIFBsYXliYWNrIgorCQl9LAorCQl7CisJCQkvKiBTL1BESUYgb3V0 cHV0cyBhcmVuJ3QgYXZhaWxhYmxlIGF0IDE5MktIegorCQkJICogYnV0IGFyZSBpbmNsdWRlZCBp biB0aGUgVVNCIG11eCBJL08KKwkJCSAqIGFzc2lnbm1lbnQgbWVzc2FnZSBhbnl3YXkKKwkJCSAq LworCQkJLmlkID0gMHgxODAsCisJCQkubnVtID0geyAyLCAyLCAyLCAyLCAyIH0sCisJCQkuc3Jj X2Rlc2NyID0gIlMvUERJRiAlZCIsCisJCQkuc3JjX251bV9vZmZzZXQgPSAxLAorCQkJLmRzdF9k ZXNjciA9ICJTL1BESUYgT3V0cHV0ICVkIFBsYXliYWNrIgorCQl9LAorCQl7CisJCQkuaWQgPSAw eDIwMCwKKwkJCS5udW0gPSB7IDgsIDgsIDgsIDQsIDAgfSwKKwkJCS5zcmNfZGVzY3IgPSAiQURB VCAlZCIsCisJCQkuc3JjX251bV9vZmZzZXQgPSAxLAorCQkJLmRzdF9kZXNjciA9ICJBREFUIE91 dHB1dCAlZCBQbGF5YmFjayIKKwkJfSwKKwkJeworCQkJLmlkID0gMHgzMDAsCisJCQkubnVtID0g eyAxMCwgMTgsIDE4LCAxOCwgMTggfSwKKwkJCS5zcmNfZGVzY3IgPSAiTWl4ICVjIiwKKwkJCS5z cmNfbnVtX29mZnNldCA9IDY1LAorCQkJLmRzdF9kZXNjciA9ICJNaXhlciBJbnB1dCAlMDJkIENh cHR1cmUiCisJCX0sCisJCXsKKwkJCS5pZCA9IDB4NjAwLAorCQkJLm51bSA9IHsgMjAsIDE4LCAx OCwgMTQsIDEwIH0sCisJCQkuc3JjX2Rlc2NyID0gIlBDTSAlZCIsCisJCQkuc3JjX251bV9vZmZz ZXQgPSAxLAorCQkJLmRzdF9kZXNjciA9ICJQQ00gJTAyZCBDYXB0dXJlIgorCQl9LAorCX0sCit9 OworCisvKiBnZXQgdGhlIHN0YXJ0aW5nIHBvcnQgaW5kZXggbnVtYmVyIGZvciBhIGdpdmVuIHBv cnQgdHlwZS9kaXJlY3Rpb24gKi8KK3N0YXRpYyBpbnQgc2NhcmxldHQyX2dldF9wb3J0X3N0YXJ0 X251bShjb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX3BvcnRzICpwb3J0cywKKwkJCQkJaW50IGRpcmVj dGlvbiwgaW50IHBvcnRfdHlwZSkKK3sKKwlpbnQgaSwgbnVtID0gMDsKKworCWZvciAoaSA9IDA7 IGkgPCBwb3J0X3R5cGU7IGkrKykKKwkJbnVtICs9IHBvcnRzW2ldLm51bVtkaXJlY3Rpb25dOwor CisJcmV0dXJuIG51bTsKK30KKworLyoqKiBVU0IgSW50ZXJhY3Rpb25zICoqKi8KKworLyogVmVu ZG9yLVNwZWNpZmljIEludGVyZmFjZSwgRW5kcG9pbnQsIE1heFBhY2tldFNpemUsIEludGVydmFs ICovCisjZGVmaW5lIFNDQVJMRVRUMl9VU0JfVkVORE9SX1NQRUNJRklDX0lOVEVSRkFDRSA1Cisj ZGVmaW5lIFNDQVJMRVRUMl9VU0JfSU5URVJSVVBUX0VORFBPSU5UIDQKKyNkZWZpbmUgU0NBUkxF VFQyX1VTQl9JTlRFUlJVUFRfTUFYX0RBVEEgNjQKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9JTlRF UlJVUFRfSU5URVJWQUwgMworCisvKiBJbnRlcnJ1cHQgZmxhZ3MgZm9yIHZvbHVtZSBhbmQgbXV0 ZS9kaW0gYnV0dG9uIGNoYW5nZXMgKi8KKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9JTlRFUlJVUFRf Vk9MX0NIQU5HRSAweDQwMDAwMAorI2RlZmluZSBTQ0FSTEVUVDJfVVNCX0lOVEVSUlVQVF9CVVRU T05fQ0hBTkdFIDB4MjAwMDAwCisKKy8qIENvbW1hbmRzIGZvciBzZW5kaW5nL3JlY2VpdmluZyBy ZXF1ZXN0cy9yZXNwb25zZXMgKi8KKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9WRU5ET1JfU1BFQ0lG SUNfQ01EX1JFUSAyCisjZGVmaW5lIFNDQVJMRVRUMl9VU0JfVkVORE9SX1NQRUNJRklDX0NNRF9S RVNQIDMKKworI2RlZmluZSBTQ0FSTEVUVDJfVVNCX0lOSVRfU0VRIDB4MDAwMDAwMDAKKyNkZWZp bmUgU0NBUkxFVFQyX1VTQl9HRVRfTUVURVJfTEVWRUxTIDB4MDAwMDEwMDEKKyNkZWZpbmUgU0NB UkxFVFQyX1VTQl9TRVRfTUlYIDB4MDAwMDIwMDIKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9TRVRf TVVYIDB4MDAwMDMwMDIKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9HRVRfREFUQSAweDAwODAwMDAw CisjZGVmaW5lIFNDQVJMRVRUMl9VU0JfU0VUX0RBVEEgMHgwMDgwMDAwMQorI2RlZmluZSBTQ0FS TEVUVDJfVVNCX0RBVEFfQ01EIDB4MDA4MDAwMDIKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9DT05G SUdfU0FWRSA2CisKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9WT0xVTUVfU1RBVFVTX09GRlNFVCAw eDMxCisjZGVmaW5lIFNDQVJMRVRUMl9VU0JfTUVURVJfTEVWRUxTX0dFVF9NQUdJQyAxCisKKy8q IHZvbHVtZSBzdGF0dXMgaXMgcmVhZCB0b2dldGhlciAobWF0Y2hlcyBzY2FybGV0dDJfY29uZmln X2l0ZW1zW10pICovCitzdHJ1Y3Qgc2NhcmxldHQyX3VzYl92b2x1bWVfc3RhdHVzIHsKKwkvKiBt dXRlICYgZGltIGJ1dHRvbnMgKi8KKwl1OCBidXR0b25zW1NDQVJMRVRUMl9CVVRUT05fTUFYXTsK KworCXU4IHBhZDE7CisKKwkvKiBzb2Z0d2FyZSB2b2x1bWUgc2V0dGluZyAqLworCXMxNiBzd192 b2xbU0NBUkxFVFQyX0FOQUxPR1VFX01BWF07CisKKwkvKiBhY3R1YWwgdm9sdW1lIG9mIG91dHB1 dCBpbmMuIGRpbSAoLTE4ZEIpICovCisJczE2IGh3X3ZvbFtTQ0FSTEVUVDJfQU5BTE9HVUVfTUFY XTsKKworCXU4IHBhZDJbU0NBUkxFVFQyX0FOQUxPR1VFX01BWF07CisKKwkvKiBzdyAoMCkgb3Ig aHcgKDEpIGNvbnRyb2xsZWQgKi8KKwl1OCBzd19od19zd2l0Y2hbU0NBUkxFVFQyX0FOQUxPR1VF X01BWF07CisKKwl1OCBwYWQzWzZdOworCisJLyogZnJvbnQgcGFuZWwgdm9sdW1lIGtub2IgKi8K KwlzMTYgbWFzdGVyX3ZvbDsKK30gX19wYWNrZWQ7CisKKy8qIENvbmZpZ3VyYXRpb24gcGFyYW1l dGVycyB0aGF0IGNhbiBiZSByZWFkIGFuZCB3cml0dGVuICovCitlbnVtIHsKKwlTQ0FSTEVUVDJf Q09ORklHX0JVVFRPTlMgPSAwLAorCVNDQVJMRVRUMl9DT05GSUdfTElORV9PVVRfVk9MVU1FID0g MSwKKwlTQ0FSTEVUVDJfQ09ORklHX1NXX0hXX1NXSVRDSCA9IDIsCisJU0NBUkxFVFQyX0NPTkZJ R19MRVZFTF9TV0lUQ0ggPSAzLAorCVNDQVJMRVRUMl9DT05GSUdfUEFEX1NXSVRDSCA9IDQsCisJ U0NBUkxFVFQyX0NPTkZJR19DT1VOVCA9IDUKK307CisKKy8qIExvY2F0aW9uLCBzaXplLCBhbmQg YWN0aXZhdGlvbiBjb21tYW5kIG51bWJlciBmb3IgdGhlIGNvbmZpZ3VyYXRpb24KKyAqIHBhcmFt ZXRlcnMKKyAqLworc3RydWN0IHNjYXJsZXR0Ml9jb25maWcgeworCXU4IG9mZnNldDsKKwl1OCBz aXplOworCXU4IGFjdGl2YXRlOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzY2FybGV0dDJf Y29uZmlnCisJCXNjYXJsZXR0Ml9jb25maWdfaXRlbXNbU0NBUkxFVFQyX0NPTkZJR19DT1VOVF0g PSB7CisJLyogTXV0ZS9EaW0gQnV0dG9ucyAqLworCXsKKwkJLm9mZnNldCA9IDB4MzEsCisJCS5z aXplID0gMSwKKwkJLmFjdGl2YXRlID0gMgorCX0sCisKKwkvKiBMaW5lIE91dCBWb2x1bWUgKi8K Kwl7CisJCS5vZmZzZXQgPSAweDM0LAorCQkuc2l6ZSA9IDIsCisJCS5hY3RpdmF0ZSA9IDEKKwl9 LAorCisJLyogU1cvSFcgVm9sdW1lIFN3aXRjaCAqLworCXsKKwkJLm9mZnNldCA9IDB4NjYsCisJ CS5zaXplID0gMSwKKwkJLmFjdGl2YXRlID0gMworCX0sCisKKwkvKiBMZXZlbCBTd2l0Y2ggKi8K Kwl7CisJCS5vZmZzZXQgPSAweDdjLAorCQkuc2l6ZSA9IDEsCisJCS5hY3RpdmF0ZSA9IDcKKwl9 LAorCisJLyogUGFkIFN3aXRjaCAqLworCXsKKwkJLm9mZnNldCA9IDB4ODQsCisJCS5zaXplID0g MSwKKwkJLmFjdGl2YXRlID0gOAorCX0KK307CisKKy8qIHByb3ByaWV0YXJ5IHJlcXVlc3QvcmVz cG9uc2UgZm9ybWF0ICovCitzdHJ1Y3Qgc2NhcmxldHQyX3VzYl9wYWNrZXQgeworCXUzMiBjbWQ7 CisJdTE2IHNpemU7CisJdTE2IHNlcTsKKwl1MzIgZXJyb3I7CisJdTMyIHBhZDsKKwl1OCBkYXRh W107Cit9OworCisjZGVmaW5lIFNDQVJMRVRUMl9VU0JfUEFDS0VUX0xFTiAoc2l6ZW9mKHN0cnVj dCBzY2FybGV0dDJfdXNiX3BhY2tldCkpCisKK3N0YXRpYyB2b2lkIHNjYXJsZXR0Ml9maWxsX3Jl cXVlc3RfaGVhZGVyKHN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSwKKwkJCQkJ ICBzdHJ1Y3Qgc2NhcmxldHQyX3VzYl9wYWNrZXQgKnJlcSwKKwkJCQkJICB1MzIgY21kLCB1MTYg cmVxX3NpemUpCit7CisJLyogc2VxdWVuY2UgbXVzdCBnbyB1cCBieSAxIGZvciBlYWNoIHJlcXVl c3QgKi8KKwl1MTYgc2VxID0gcHJpdmF0ZS0+c2NhcmxldHQyX3NlcSsrOworCisJcmVxLT5jbWQg PSBjcHVfdG9fbGUzMihjbWQpOworCXJlcS0+c2l6ZSA9IGNwdV90b19sZTE2KHJlcV9zaXplKTsK KwlyZXEtPnNlcSA9IGNwdV90b19sZTE2KHNlcSk7CisJcmVxLT5lcnJvciA9IDA7CisJcmVxLT5w YWQgPSAwOworfQorCisvKiBTZW5kIGEgcHJvcHJpZXRhcnkgZm9ybWF0IHJlcXVlc3QgdG8gdGhl IFNjYXJsZXR0IGludGVyZmFjZSAqLworc3RhdGljIGludCBzY2FybGV0dDJfdXNiKAorCXN0cnVj dCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciwgdTMyIGNtZCwKKwl2b2lkICpyZXFfZGF0YSwg dTE2IHJlcV9zaXplLCB2b2lkICpyZXNwX2RhdGEsIHUxNiByZXNwX3NpemUpCit7CisJc3RydWN0 IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKwl1 MTYgcmVxX2J1Zl9zaXplID0gc2l6ZW9mKHN0cnVjdCBzY2FybGV0dDJfdXNiX3BhY2tldCkgKyBy ZXFfc2l6ZTsKKwl1MTYgcmVzcF9idWZfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2NhcmxldHQyX3Vz Yl9wYWNrZXQpICsgcmVzcF9zaXplOworCXN0cnVjdCBzY2FybGV0dDJfdXNiX3BhY2tldCAqcmVx ID0gMCwgKnJlc3AgPSAwOworCWludCBlcnIgPSAwOworCisJcmVxID0ga21hbGxvYyhyZXFfYnVm X3NpemUsIEdGUF9LRVJORUwpOworCWlmICghcmVxKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdv dG8gZXJyb3I7CisJfQorCisJcmVzcCA9IGttYWxsb2MocmVzcF9idWZfc2l6ZSwgR0ZQX0tFUk5F TCk7CisJaWYgKCFyZXNwKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQor CisJbXV0ZXhfbG9jaygmcHJpdmF0ZS0+dXNiX211dGV4KTsKKworCS8qIGJ1aWxkIHJlcXVlc3Qg bWVzc2FnZSBhbmQgc2VuZCBpdCAqLworCisJc2NhcmxldHQyX2ZpbGxfcmVxdWVzdF9oZWFkZXIo cHJpdmF0ZSwgcmVxLCBjbWQsIHJlcV9zaXplKTsKKworCWlmIChyZXFfc2l6ZSkKKwkJbWVtY3B5 KHJlcS0+ZGF0YSwgcmVxX2RhdGEsIHJlcV9zaXplKTsKKworCWVyciA9IHNuZF91c2JfY3RsX21z ZyhtaXhlci0+Y2hpcC0+ZGV2LAorCQkJdXNiX3NuZGN0cmxwaXBlKG1peGVyLT5jaGlwLT5kZXYs IDApLAorCQkJU0NBUkxFVFQyX1VTQl9WRU5ET1JfU1BFQ0lGSUNfQ01EX1JFUSwKKwkJCVVTQl9S RUNJUF9JTlRFUkZBQ0UgfCBVU0JfVFlQRV9DTEFTUyB8IFVTQl9ESVJfT1VULAorCQkJMCwKKwkJ CVNDQVJMRVRUMl9VU0JfVkVORE9SX1NQRUNJRklDX0lOVEVSRkFDRSwKKwkJCXJlcSwKKwkJCXJl cV9idWZfc2l6ZSk7CisKKwlpZiAoZXJyICE9IHJlcV9idWZfc2l6ZSkgeworCQl1c2JfYXVkaW9f ZXJyKAorCQkJbWl4ZXItPmNoaXAsCisJCQkiU2NhcmxldHQgR2VuIDIgVVNCIHJlcXVlc3QgcmVz dWx0IGNtZCAleCB3YXMgJWRcbiIsCisJCQljbWQsIGVycik7CisJCWVyciA9IC1FSU5WQUw7CisJ CWdvdG8gdW5sb2NrOworCX0KKworCS8qIHNlbmQgYSBzZWNvbmQgbWVzc2FnZSB0byBnZXQgdGhl IHJlc3BvbnNlICovCisKKwllcnIgPSBzbmRfdXNiX2N0bF9tc2cobWl4ZXItPmNoaXAtPmRldiwK KwkJCXVzYl9zbmRjdHJscGlwZShtaXhlci0+Y2hpcC0+ZGV2LCAwKSwKKwkJCVNDQVJMRVRUMl9V U0JfVkVORE9SX1NQRUNJRklDX0NNRF9SRVNQLAorCQkJVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVT Ql9UWVBFX0NMQVNTIHwgVVNCX0RJUl9JTiwKKwkJCTAsCisJCQlTQ0FSTEVUVDJfVVNCX1ZFTkRP Ul9TUEVDSUZJQ19JTlRFUkZBQ0UsCisJCQlyZXNwLAorCQkJcmVzcF9idWZfc2l6ZSk7CisKKwkv KiB2YWxpZGF0ZSB0aGUgcmVzcG9uc2UgKi8KKworCWlmIChlcnIgIT0gcmVzcF9idWZfc2l6ZSkg eworCQl1c2JfYXVkaW9fZXJyKAorCQkJbWl4ZXItPmNoaXAsCisJCQkiU2NhcmxldHQgR2VuIDIg VVNCIHJlc3BvbnNlIHJlc3VsdCBjbWQgJXggd2FzICVkXG4iLAorCQkJY21kLCBlcnIpOworCQll cnIgPSAtRUlOVkFMOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlpZiAocmVzcC0+Y21kICE9IHJl cS0+Y21kIHx8CisJICAgIHJlc3AtPnNlcSAhPSByZXEtPnNlcSB8fAorCSAgICByZXNwX3NpemUg IT0gbGUxNl90b19jcHUocmVzcC0+c2l6ZSkgfHwKKwkgICAgcmVzcC0+ZXJyb3IgfHwKKwkgICAg cmVzcC0+cGFkKSB7CisJCXVzYl9hdWRpb19lcnIoCisJCQltaXhlci0+Y2hpcCwKKwkJCSJTY2Fy bGV0dCBHZW4gMiBVU0IgaW52YWxpZCByZXNwb25zZTsgIgorCQkJICAgImNtZCB0eC9yeCAlZC8l ZCBzZXEgJWQvJWQgc2l6ZSAlZC8lZCAiCisJCQkgICAiZXJyb3IgJWQgcGFkICVkXG4iLAorCQkJ bGUxNl90b19jcHUocmVxLT5jbWQpLCBsZTE2X3RvX2NwdShyZXNwLT5jbWQpLAorCQkJbGUxNl90 b19jcHUocmVxLT5zZXEpLCBsZTE2X3RvX2NwdShyZXNwLT5zZXEpLAorCQkJcmVzcF9zaXplLCBs ZTE2X3RvX2NwdShyZXNwLT5zaXplKSwKKwkJCWxlMTZfdG9fY3B1KHJlc3AtPmVycm9yKSwKKwkJ CWxlMTZfdG9fY3B1KHJlc3AtPnBhZCkpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIHVubG9j azsKKwl9CisKKwlpZiAocmVzcF9zaXplID4gMCkKKwkJbWVtY3B5KHJlc3BfZGF0YSwgcmVzcC0+ ZGF0YSwgcmVzcF9zaXplKTsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmcHJpdmF0ZS0+dXNi X211dGV4KTsKK2Vycm9yOgorCWtmcmVlKHJlcSk7CisJa2ZyZWUocmVzcCk7CisJcmV0dXJuIGVy cjsKK30KKworLyogU2VuZCBTQ0FSTEVUVDJfVVNCX0RBVEFfQ01EIFNDQVJMRVRUMl9VU0JfQ09O RklHX1NBVkUgKi8KK3N0YXRpYyB2b2lkIHNjYXJsZXR0Ml9jb25maWdfc2F2ZShzdHJ1Y3Qgd29y a19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRl ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSwgd29y ay53b3JrKTsKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIgPSBwcml2YXRlLT5t aXhlcjsKKwl1MzIgcmVxID0gY3B1X3RvX2xlMzIoU0NBUkxFVFQyX1VTQl9DT05GSUdfU0FWRSk7 CisKKwlzY2FybGV0dDJfdXNiKG1peGVyLCBTQ0FSTEVUVDJfVVNCX0RBVEFfQ01ELAorCQkgICAg ICAmcmVxLCBzaXplb2YodTMyKSwKKwkJICAgICAgTlVMTCwgMCk7Cit9CisKKy8qIFNlbmQgYSBV U0IgbWVzc2FnZSB0byBzZXQgYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciAodm9sdW1lIGxldmVs LAorICogc3cvaHcgdm9sdW1lIHN3aXRjaCwgbGluZS9pbnN0IGxldmVsIHN3aXRjaCwgb3IgcGFk IHN3aXRjaCkKKyAqLworc3RhdGljIGludCBzY2FybGV0dDJfdXNiX3NldF9jb25maWcoCisJc3Ry dWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyLAorCWludCBjb25maWdfaXRlbV9udW0sIGlu dCBpbmRleCwgaW50IHZhbHVlKQoreworCWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfY29uZmlnIGNv bmZpZ19pdGVtID0KKwkgICAgICAgc2NhcmxldHQyX2NvbmZpZ19pdGVtc1tjb25maWdfaXRlbV9u dW1dOworCXN0cnVjdCB7CisJCXUzMiBvZmZzZXQ7CisJCXUzMiBieXRlczsKKwkJczMyIHZhbHVl OworCX0gX19wYWNrZWQgcmVxOworCXUzMiByZXEyOworCWludCBlcnI7CisJc3RydWN0IHNjYXJs ZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKworCS8qIFNl bmQgdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGRhdGEgKi8KKwlyZXEub2Zmc2V0ID0gY3B1 X3RvX2xlMzIoY29uZmlnX2l0ZW0ub2Zmc2V0ICsgaW5kZXggKiBjb25maWdfaXRlbS5zaXplKTsK KwlyZXEuYnl0ZXMgPSBjcHVfdG9fbGUzMihjb25maWdfaXRlbS5zaXplKTsKKwlyZXEudmFsdWUg PSBjcHVfdG9fbGUzMih2YWx1ZSk7CisJZXJyID0gc2NhcmxldHQyX3VzYihtaXhlciwgU0NBUkxF VFQyX1VTQl9TRVRfREFUQSwKKwkJCSAgICAmcmVxLCBzaXplb2YodTMyKSAqIDIgKyBjb25maWdf aXRlbS5zaXplLAorCQkJICAgIE5VTEwsIDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJy OworCisJLyogQWN0aXZhdGUgdGhlIGNoYW5nZSAqLworCXJlcTIgPSBjcHVfdG9fbGUzMihjb25m aWdfaXRlbS5hY3RpdmF0ZSk7CisJZXJyID0gc2NhcmxldHQyX3VzYihtaXhlciwgU0NBUkxFVFQy X1VTQl9EQVRBX0NNRCwKKwkJCSAgICAmcmVxMiwgc2l6ZW9mKHJlcTIpLCBOVUxMLCAwKTsKKwlp ZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qIFNjaGVkdWxlIHRoZSBjaGFuZ2UgdG8g YmUgd3JpdHRlbiB0byBOVlJBTSAqLworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdmF0ZS0+ d29yaywgbXNlY3NfdG9famlmZmllcygyMDAwKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogU2Vu ZCBhIFVTQiBtZXNzYWdlIHRvIGdldCBkYXRhOyByZXN1bHQgcGxhY2VkIGluICpidWYgKi8KK3N0 YXRpYyBpbnQgc2NhcmxldHQyX3VzYl9nZXQoCisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2Ug Km1peGVyLAorCWludCBvZmZzZXQsIHZvaWQgKmJ1ZiwgaW50IHNpemUpCit7CisJc3RydWN0IHsK KwkJdTMyIG9mZnNldDsKKwkJdTMyIHNpemU7CisJfSBfX3BhY2tlZCByZXE7CisKKwlyZXEub2Zm c2V0ID0gY3B1X3RvX2xlMzIob2Zmc2V0KTsKKwlyZXEuc2l6ZSA9IGNwdV90b19sZTMyKHNpemUp OworCXJldHVybiBzY2FybGV0dDJfdXNiKG1peGVyLCBTQ0FSTEVUVDJfVVNCX0dFVF9EQVRBLAor CQkJICAgICAmcmVxLCBzaXplb2YocmVxKSwgYnVmLCBzaXplKTsKK30KKworLyogU2VuZCBhIFVT QiBtZXNzYWdlIHRvIGdldCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM7IHJlc3VsdCBwbGFjZWQg aW4gKmJ1ZiAqLworc3RhdGljIGludCBzY2FybGV0dDJfdXNiX2dldF9jb25maWcoCisJc3RydWN0 IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyLAorCWludCBjb25maWdfaXRlbV9udW0sIGludCBj b3VudCwgdm9pZCAqYnVmKQoreworCWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfY29uZmlnIGNvbmZp Z19pdGVtID0KKwkgICAgICAgc2NhcmxldHQyX2NvbmZpZ19pdGVtc1tjb25maWdfaXRlbV9udW1d OworCWludCBzaXplID0gY29uZmlnX2l0ZW0uc2l6ZSAqIGNvdW50OworCisJcmV0dXJuIHNjYXJs ZXR0Ml91c2JfZ2V0KG1peGVyLCBjb25maWdfaXRlbS5vZmZzZXQsIGJ1Ziwgc2l6ZSk7Cit9CisK Ky8qIFNlbmQgYSBVU0IgbWVzc2FnZSB0byBnZXQgdm9sdW1lIHN0YXR1czsgcmVzdWx0IHBsYWNl ZCBpbiAqYnVmICovCitzdGF0aWMgaW50IHNjYXJsZXR0Ml91c2JfZ2V0X3ZvbHVtZV9zdGF0dXMo CisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyLAorCXN0cnVjdCBzY2FybGV0dDJf dXNiX3ZvbHVtZV9zdGF0dXMgKmJ1ZikKK3sKKwlyZXR1cm4gc2NhcmxldHQyX3VzYl9nZXQobWl4 ZXIsIFNDQVJMRVRUMl9VU0JfVk9MVU1FX1NUQVRVU19PRkZTRVQsCisJCQkJIGJ1Ziwgc2l6ZW9m KCpidWYpKTsKK30KKworLyogU2VuZCBhIFVTQiBtZXNzYWdlIHRvIHNldCB0aGUgdm9sdW1lcyBm b3IgYWxsIGlucHV0cyBvZiBvbmUgbWl4CisgKiAodmFsdWVzIG9idGFpbmVkIGZyb20gcHJpdmF0 ZS0+bWl4W10pCisgKi8KK3N0YXRpYyBpbnQgc2NhcmxldHQyX3VzYl9zZXRfbWl4KHN0cnVjdCB1 c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciwKKwkJCQkgICAgIGludCBtaXhfbnVtKQoreworCXN0 cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlX2RhdGE7 CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9kZXZpY2VfaW5mbyAqaW5mbyA9IHByaXZhdGUtPmlu Zm87CisKKwlzdHJ1Y3QgeworCQl1MTYgbWl4X251bTsKKwkJdTE2IGRhdGFbU0NBUkxFVFQyX0lO UFVUX01JWF9NQVhdOworCX0gX19wYWNrZWQgcmVxOworCisJaW50IGksIGo7CisJaW50IG51bV9t aXhlcl9pbiA9CisJCWluZm8tPnBvcnRzW1NDQVJMRVRUMl9QT1JUX1RZUEVfTUlYXS5udW1bU0NB UkxFVFQyX1BPUlRfT1VUXTsKKworCXJlcS5taXhfbnVtID0gY3B1X3RvX2xlMTYobWl4X251bSk7 CisKKwlmb3IgKGkgPSAwLCBqID0gbWl4X251bSAqIG51bV9taXhlcl9pbjsgaSA8IG51bV9taXhl cl9pbjsgaSsrLCBqKyspCisJCXJlcS5kYXRhW2ldID0gY3B1X3RvX2xlMTYoCisJCQlzY2FybGV0 dDJfbWl4ZXJfdmFsdWVzW3ByaXZhdGUtPm1peFtqXV0KKwkJKTsKKworCXJldHVybiBzY2FybGV0 dDJfdXNiKG1peGVyLCBTQ0FSTEVUVDJfVVNCX1NFVF9NSVgsCisJCQkgICAgICZyZXEsIChudW1f bWl4ZXJfaW4gKyAxKSAqIHNpemVvZih1MTYpLAorCQkJICAgICBOVUxMLCAwKTsKK30KKworLyog Q29udmVydCBhIHBvcnQgbnVtYmVyIGluZGV4IChwZXIgaW5mby0+cG9ydHMpIHRvIGEgaGFyZHdh cmUgSUQgKi8KK3N0YXRpYyB1MzIgc2NhcmxldHQyX211eF9zcmNfbnVtX3RvX2lkKGNvbnN0IHN0 cnVjdCBzY2FybGV0dDJfcG9ydHMgKnBvcnRzLAorCQkJCSAgICAgICBpbnQgbnVtKQoreworCWlu dCBwb3J0X3R5cGU7CisKKwlmb3IgKHBvcnRfdHlwZSA9IDA7CisJICAgICBwb3J0X3R5cGUgPCBT Q0FSTEVUVDJfUE9SVF9UWVBFX0NPVU5UOworCSAgICAgcG9ydF90eXBlKyspIHsKKwkJaWYgKG51 bSA8IHBvcnRzW3BvcnRfdHlwZV0ubnVtW1NDQVJMRVRUMl9QT1JUX0lOXSkKKwkJCXJldHVybiBw b3J0c1twb3J0X3R5cGVdLmlkIHwgbnVtOworCQludW0gLT0gcG9ydHNbcG9ydF90eXBlXS5udW1b U0NBUkxFVFQyX1BPUlRfSU5dOworCX0KKworCS8qIE9vcHMgKi8KKwlyZXR1cm4gMDsKK30KKwor LyogU2VuZCBVU0IgbWVzc2FnZXMgdG8gc2V0IG11eCBpbnB1dHMgKi8KK3N0YXRpYyBpbnQgc2Nh cmxldHQyX3VzYl9zZXRfbXV4KHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcikKK3sK KwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9k YXRhOworCWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfZGV2aWNlX2luZm8gKmluZm8gPSBwcml2YXRl LT5pbmZvOworCWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfcG9ydHMgKnBvcnRzID0gaW5mby0+cG9y dHM7CisJaW50IHJhdGUsIHBvcnRfZGlyX3JhdGU7CisKKwlzdGF0aWMgY29uc3QgaW50IGFzc2ln bm1lbnRfb3JkZXJbU0NBUkxFVFQyX1BPUlRfVFlQRV9DT1VOVF0gPSB7CisJCVNDQVJMRVRUMl9Q T1JUX1RZUEVfUENNLAorCQlTQ0FSTEVUVDJfUE9SVF9UWVBFX0FOQUxPR1VFLAorCQlTQ0FSTEVU VDJfUE9SVF9UWVBFX1NQRElGLAorCQlTQ0FSTEVUVDJfUE9SVF9UWVBFX0FEQVQsCisJCVNDQVJM RVRUMl9QT1JUX1RZUEVfTUlYLAorCQlTQ0FSTEVUVDJfUE9SVF9UWVBFX05PTkUsCisJfTsKKwor CXN0cnVjdCB7CisJCXUxNiBwYWQ7CisJCXUxNiBudW07CisJCXUzMiBkYXRhW1NDQVJMRVRUMl9N VVhfTUFYXTsKKwl9IF9fcGFja2VkIHJlcTsKKworCXJlcS5wYWQgPSAwOworCisJLyogbXV4IHNl dHRpbmdzIGZvciBlYWNoIHJhdGUgKi8KKwlmb3IgKHJhdGUgPSAwLCBwb3J0X2Rpcl9yYXRlID0g U0NBUkxFVFQyX1BPUlRfT1VUXzQ0OworCSAgICAgcG9ydF9kaXJfcmF0ZSA8PSBTQ0FSTEVUVDJf UE9SVF9PVVRfMTc2OworCSAgICAgcmF0ZSsrLCBwb3J0X2Rpcl9yYXRlKyspIHsKKwkJaW50IG9y ZGVyX251bSwgaSwgZXJyOworCisJCXJlcS5udW0gPSBjcHVfdG9fbGUxNihyYXRlKTsKKworCQlm b3IgKG9yZGVyX251bSA9IDAsIGkgPSAwOworCQkgICAgIG9yZGVyX251bSA8IFNDQVJMRVRUMl9Q T1JUX1RZUEVfQ09VTlQ7CisJCSAgICAgb3JkZXJfbnVtKyspIHsKKwkJCWludCBwb3J0X3R5cGUg PSBhc3NpZ25tZW50X29yZGVyW29yZGVyX251bV07CisJCQlpbnQgaiA9IHNjYXJsZXR0Ml9nZXRf cG9ydF9zdGFydF9udW0ocG9ydHMsCisJCQkJCQkJICAgICBTQ0FSTEVUVDJfUE9SVF9PVVQsCisJ CQkJCQkJICAgICBwb3J0X3R5cGUpOworCQkJaW50IHBvcnRfaWQgPSBwb3J0c1twb3J0X3R5cGVd LmlkOworCQkJaW50IGNoYW5uZWw7CisKKwkJCWZvciAoY2hhbm5lbCA9IDA7CisJCQkgICAgIGNo YW5uZWwgPCBwb3J0c1twb3J0X3R5cGVdLm51bVtwb3J0X2Rpcl9yYXRlXTsKKwkJCSAgICAgY2hh bm5lbCsrLCBpKyssIGorKykKKwkJCQkvKiBsb3dlciAxMiBiaXRzIGZvciB0aGUgZGVzdGluYXRp b24gYW5kCisJCQkJICogbmV4dCAxMiBiaXRzIGZvciB0aGUgc291cmNlCisJCQkJICovCisJCQkJ cmVxLmRhdGFbaV0gPSAhcG9ydF9pZAorCQkJCQk/IDAKKwkJCQkJOiBjcHVfdG9fbGUzMigKKwkJ CQkJCXBvcnRfaWQgfAorCQkJCQkJY2hhbm5lbCB8CisJCQkJCQlzY2FybGV0dDJfbXV4X3NyY19u dW1fdG9faWQoCisJCQkJCQkJcG9ydHMsIHByaXZhdGUtPm11eFtqXQorCQkJCQkJKSA8PCAxMgor CQkJCQkgICk7CisKKwkJCS8qIHNraXAgcHJpdmF0ZS0+bXV4W2pdIGVudHJpZXMgbm90IG91dHB1 dCAqLworCQkJaiArPSBwb3J0c1twb3J0X3R5cGVdLm51bVtTQ0FSTEVUVDJfUE9SVF9PVVRdIC0K KwkJCSAgICAgcG9ydHNbcG9ydF90eXBlXS5udW1bcG9ydF9kaXJfcmF0ZV07CisJCX0KKworCQll cnIgPSBzY2FybGV0dDJfdXNiKG1peGVyLCBTQ0FSTEVUVDJfVVNCX1NFVF9NVVgsCisJCQkJICAg ICZyZXEsIChpICsgMSkgKiBzaXplb2YodTMyKSwKKwkJCQkgICAgTlVMTCwgMCk7CisJCWlmIChl cnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogU2VuZCBV U0IgbWVzc2FnZSB0byBnZXQgbWV0ZXIgbGV2ZWxzICovCitzdGF0aWMgaW50IHNjYXJsZXR0Ml91 c2JfZ2V0X21ldGVyX2xldmVscyhzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIsCisJ CQkJCSAgdTE2ICpsZXZlbHMpCit7CisJc3RydWN0IHsKKwkJdTE2IHBhZDsKKwkJdTE2IG51bV9t ZXRlcnM7CisJCXUzMiBtYWdpYzsKKwl9IF9fcGFja2VkIHJlcTsKKwl1MzIgcmVzcFtTQ0FSTEVU VDJfTlVNX01FVEVSU107CisJaW50IGksIGVycjsKKworCXJlcS5wYWQgPSAwOworCXJlcS5udW1f bWV0ZXJzID0gY3B1X3RvX2xlMTYoU0NBUkxFVFQyX05VTV9NRVRFUlMpOworCXJlcS5tYWdpYyA9 IGNwdV90b19sZTMyKFNDQVJMRVRUMl9VU0JfTUVURVJfTEVWRUxTX0dFVF9NQUdJQyk7CisJZXJy ID0gc2NhcmxldHQyX3VzYihtaXhlciwgU0NBUkxFVFQyX1VTQl9HRVRfTUVURVJfTEVWRUxTLAor CQkJICAgICZyZXEsIHNpemVvZihyZXEpLCByZXNwLCBzaXplb2YocmVzcCkpOworCWlmIChlcnIg PCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogY29weSwgY29udmVydCB0byB1MTYgKi8KKwlmb3Ig KGkgPSAwOyBpIDwgU0NBUkxFVFQyX05VTV9NRVRFUlM7IGkrKykKKwkJbGV2ZWxzW2ldID0gcmVz cFtpXTsKKworCXJldHVybiAwOworfQorCisvKioqIENvbnRyb2wgRnVuY3Rpb25zICoqKi8KKwor LyogaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBjb250cm9sICovCitzdGF0aWMgaW50 IHNjYXJsZXR0Ml9hZGRfbmV3X2N0bChzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIs CisJCQkJIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICpuY29udHJvbCwKKwkJCQkgaW50 IGluZGV4LCBpbnQgY2hhbm5lbHMsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJIHN0cnVjdCBzbmRf a2NvbnRyb2wgKiprY3RsX3JldHVybikKK3sKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsOwor CXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtOworCWludCBlcnI7CisKKwllbGVtID0g a3phbGxvYyhzaXplb2YoKmVsZW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVsZW0pCisJCXJldHVy biAtRU5PTUVNOworCisJZWxlbS0+aGVhZC5taXhlciA9IG1peGVyOworCWVsZW0tPmNvbnRyb2wg PSBpbmRleDsKKwllbGVtLT5oZWFkLmlkID0gaW5kZXg7CisJZWxlbS0+Y2hhbm5lbHMgPSBjaGFu bmVsczsKKworCWtjdGwgPSBzbmRfY3RsX25ldzEobmNvbnRyb2wsIGVsZW0pOworCWlmICgha2N0 bCkgeworCQlrZnJlZShlbGVtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWtjdGwtPnByaXZh dGVfZnJlZSA9IHNuZF91c2JfbWl4ZXJfZWxlbV9mcmVlOworCisJc3RybGNweShrY3RsLT5pZC5u YW1lLCBuYW1lLCBzaXplb2Yoa2N0bC0+aWQubmFtZSkpOworCisJZXJyID0gc25kX3VzYl9taXhl cl9hZGRfY29udHJvbCgmZWxlbS0+aGVhZCwga2N0bCk7CisJaWYgKGVyciA8IDApCisJCXJldHVy biBlcnI7CisKKwlpZiAoa2N0bF9yZXR1cm4pCisJCSprY3RsX3JldHVybiA9IGtjdGw7CisKKwly ZXR1cm4gMDsKK30KKworLyoqKiBBbmFsb2d1ZSBMaW5lIE91dCBWb2x1bWUgQ29udHJvbHMgKioq LworCisvKiBVcGRhdGUgaGFyZHdhcmUgdm9sdW1lIGNvbnRyb2xzIGFmdGVyIHJlY2VpdmluZyBu b3RpZmljYXRpb24gdGhhdAorICogdGhleSBoYXZlIGNoYW5nZWQKKyAqLworc3RhdGljIGludCBz Y2FybGV0dDJfdXBkYXRlX3ZvbHVtZXMoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVy KQoreworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2 YXRlX2RhdGE7CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyAqcG9ydHMgPSBwcml2YXRl LT5pbmZvLT5wb3J0czsKKwlzdHJ1Y3Qgc2NhcmxldHQyX3VzYl92b2x1bWVfc3RhdHVzIHZvbHVt ZV9zdGF0dXM7CisJaW50IG51bV9saW5lX291dCA9CisJCXBvcnRzW1NDQVJMRVRUMl9QT1JUX1RZ UEVfQU5BTE9HVUVdLm51bVtTQ0FSTEVUVDJfUE9SVF9PVVRdOworCWludCBlcnIsIGk7CisKKwlw cml2YXRlLT52b2xfdXBkYXRlZCA9IDA7CisKKwllcnIgPSBzY2FybGV0dDJfdXNiX2dldF92b2x1 bWVfc3RhdHVzKG1peGVyLCAmdm9sdW1lX3N0YXR1cyk7CisJaWYgKGVyciA8IDApCisJCXJldHVy biBlcnI7CisKKwlwcml2YXRlLT5tYXN0ZXJfdm9sID0gY2xhbXAoCisJCXZvbHVtZV9zdGF0dXMu bWFzdGVyX3ZvbCArIFNDQVJMRVRUX1ZPTFVNRV9CSUFTLAorCQkwLCBTQ0FSTEVUVF9WT0xVTUVf QklBUyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2xpbmVfb3V0OyBpKyspIHsKKwkJaWYgKHBy aXZhdGUtPnZvbF9zd19od19zd2l0Y2hbaV0pCisJCQlwcml2YXRlLT52b2xbaV0gPSBwcml2YXRl LT5tYXN0ZXJfdm9sOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwcml2YXRlLT5pbmZvLT5idXR0 b25fY291bnQ7IGkrKykKKwkJcHJpdmF0ZS0+YnV0dG9uc1tpXSA9ICEhdm9sdW1lX3N0YXR1cy5i dXR0b25zW2ldOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX3ZvbHVt ZV9jdGxfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCSAgICAgc3RydWN0IHNu ZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAq ZWxlbSA9IGtjdGwtPnByaXZhdGVfZGF0YTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VM RU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IGVsZW0tPmNoYW5uZWxzOworCXVpbmZv LT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gU0NB UkxFVFRfVk9MVU1FX0JJQVM7CisJdWluZm8tPnZhbHVlLmludGVnZXIuc3RlcCA9IDE7CisJcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX21hc3Rlcl92b2x1bWVfY3RsX2dldChz dHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3Zh bHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqZWxlbSA9IGtj dGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIgPSBl bGVtLT5oZWFkLm1peGVyOworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9 IG1peGVyLT5wcml2YXRlX2RhdGE7CisKKwlpZiAocHJpdmF0ZS0+dm9sX3VwZGF0ZWQpIHsKKwkJ bXV0ZXhfbG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisJCXNjYXJsZXR0Ml91cGRhdGVfdm9s dW1lcyhtaXhlcik7CisJCW11dGV4X3VubG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisJfQor CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBwcml2YXRlLT5tYXN0ZXJfdm9s OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjYXJsZXR0Ml92b2x1bWVfY3RsX2dldChz dHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3Zh bHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqZWxlbSA9IGtj dGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIgPSBl bGVtLT5oZWFkLm1peGVyOworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9 IG1peGVyLT5wcml2YXRlX2RhdGE7CisJaW50IGluZGV4ID0gZWxlbS0+Y29udHJvbDsKKworCWlm IChwcml2YXRlLT52b2xfdXBkYXRlZCkgeworCQltdXRleF9sb2NrKCZwcml2YXRlLT5kYXRhX211 dGV4KTsKKwkJc2NhcmxldHQyX3VwZGF0ZV92b2x1bWVzKG1peGVyKTsKKwkJbXV0ZXhfdW5sb2Nr KCZwcml2YXRlLT5kYXRhX211dGV4KTsKKwl9CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52 YWx1ZVswXSA9IHByaXZhdGUtPnZvbFtpbmRleF07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBp bnQgc2NhcmxldHQyX3ZvbHVtZV9jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJ CQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1 c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1 c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciA9IGVsZW0tPmhlYWQubWl4ZXI7CisJc3RydWN0IHNj YXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKwlpbnQg aW5kZXggPSBlbGVtLT5jb250cm9sOworCWludCBvdmFsLCB2YWwsIGVyciA9IDA7CisKKwljYW5j ZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXZhdGUtPndvcmspOworCW11dGV4X2xvY2soJnByaXZh dGUtPmRhdGFfbXV0ZXgpOworCisJb3ZhbCA9IHByaXZhdGUtPnZvbFtpbmRleF07CisJdmFsID0g dWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisKKwlpZiAob3ZhbCA9PSB2YWwpCisJ CWdvdG8gdW5sb2NrOworCisJcHJpdmF0ZS0+dm9sW2luZGV4XSA9IHZhbDsKKwllcnIgPSBzY2Fy bGV0dDJfdXNiX3NldF9jb25maWcobWl4ZXIsIFNDQVJMRVRUMl9DT05GSUdfTElORV9PVVRfVk9M VU1FLAorCQkJCSAgICAgICBpbmRleCwgdmFsIC0gU0NBUkxFVFRfVk9MVU1FX0JJQVMpOworCWlm IChlcnIgPT0gMCkKKwkJZXJyID0gMTsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmcHJpdmF0 ZS0+ZGF0YV9tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IERFQ0xBUkVf VExWX0RCX01JTk1BWCgKKwlkYl9zY2FsZV9zY2FybGV0dF9nYWluLCAtU0NBUkxFVFRfVk9MVU1F X0JJQVMgKiAxMDAsIDAKKyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25l dyBzY2FybGV0dDJfbWFzdGVyX3ZvbHVtZV9jdGwgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VM RU1fSUZBQ0VfTUlYRVIsCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwK KwkJICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQsCisJLm5hbWUgPSAiIiwKKwkuaW5m byA9IHNjYXJsZXR0Ml92b2x1bWVfY3RsX2luZm8sCisJLmdldCAgPSBzY2FybGV0dDJfbWFzdGVy X3ZvbHVtZV9jdGxfZ2V0LAorCS5wcml2YXRlX3ZhbHVlID0gMCwgLyogbWF4IHZhbHVlICovCisJ LnRsdiA9IHsgLnAgPSBkYl9zY2FsZV9zY2FybGV0dF9nYWluIH0KK307CisKK3N0YXRpYyBjb25z dCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzY2FybGV0dDJfbGluZV9vdXRfdm9sdW1lX2N0bCA9 IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkuYWNjZXNzID0gU05E UlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8CisJCSAgU05EUlZfQ1RMX0VMRU1fQUNDRVNT X1RMVl9SRUFELAorCS5uYW1lID0gIiIsCisJLmluZm8gPSBzY2FybGV0dDJfdm9sdW1lX2N0bF9p bmZvLAorCS5nZXQgID0gc2NhcmxldHQyX3ZvbHVtZV9jdGxfZ2V0LAorCS5wdXQgID0gc2Nhcmxl dHQyX3ZvbHVtZV9jdGxfcHV0LAorCS5wcml2YXRlX3ZhbHVlID0gMCwgLyogbWF4IHZhbHVlICov CisJLnRsdiA9IHsgLnAgPSBkYl9zY2FsZV9zY2FybGV0dF9nYWluIH0KK307CisKKy8qKiogSFcv U1cgVm9sdW1lIFN3aXRjaCBDb250cm9scyAqKiovCisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX3N3 X2h3X2VudW1fY3RsX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJCQkJIHN0cnVj dCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0 IHZhbHVlc1syXSA9IHsKKwkJIlNXIiwgIkhXIgorCX07CisKKwlyZXR1cm4gc25kX2N0bF9lbnVt X2luZm8odWluZm8sIDEsIDIsIHZhbHVlcyk7Cit9CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX3N3 X2h3X2VudW1fY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCQlzdHJ1Y3Qg c25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1f aW5mbyAqZWxlbSA9IGtjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVy X2RhdGEgKnByaXZhdGUgPSBlbGVtLT5oZWFkLm1peGVyLT5wcml2YXRlX2RhdGE7CisKKwl1Y29u dHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KKwkJcHJpdmF0ZS0+dm9sX3N3X2h3X3N3 aXRjaFtlbGVtLT5jb250cm9sXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2FybGV0 dDJfc3dfaHdfZW51bV9jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJCXN0 cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJf ZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfbWl4ZXJf aW50ZXJmYWNlICptaXhlciA9IGVsZW0tPmhlYWQubWl4ZXI7CisJc3RydWN0IHNjYXJsZXR0Ml9t aXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKworCWludCBpbmRleCA9 IGVsZW0tPmNvbnRyb2w7CisJaW50IG92YWwsIHZhbCwgZXJyID0gMDsKKworCWNhbmNlbF9kZWxh eWVkX3dvcmtfc3luYygmcHJpdmF0ZS0+d29yayk7CisJbXV0ZXhfbG9jaygmcHJpdmF0ZS0+ZGF0 YV9tdXRleCk7CisKKwlvdmFsID0gcHJpdmF0ZS0+dm9sX3N3X2h3X3N3aXRjaFtpbmRleF07CisJ dmFsID0gISF1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCWlmIChvdmFsID09 IHZhbCkKKwkJZ290byB1bmxvY2s7CisKKwlwcml2YXRlLT52b2xfc3dfaHdfc3dpdGNoW2luZGV4 XSA9IHZhbDsKKworCS8qIENoYW5nZSBhY2Nlc3MgbW9kZSB0byBSTyAoaGFyZHdhcmUgY29udHJv bGxlZCB2b2x1bWUpCisJICogb3IgUlcgKHNvZnR3YXJlIGNvbnRyb2xsZWQgdm9sdW1lKQorCSAq LworCWlmICh2YWwpCisJCXByaXZhdGUtPnZvbF9jdGxzW2luZGV4XS0+dmRbMF0uYWNjZXNzICY9 CisJCQl+U05EUlZfQ1RMX0VMRU1fQUNDRVNTX1dSSVRFOworCWVsc2UKKwkJcHJpdmF0ZS0+dm9s X2N0bHNbaW5kZXhdLT52ZFswXS5hY2Nlc3MgfD0KKwkJCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19X UklURTsKKworCS8qIFJlc2V0IHZvbHVtZSB0byBtYXN0ZXIgdm9sdW1lICovCisJcHJpdmF0ZS0+ dm9sW2luZGV4XSA9IHByaXZhdGUtPm1hc3Rlcl92b2w7CisKKwkvKiBTZXQgU1cgdm9sdW1lIHRv IGN1cnJlbnQgSFcgdm9sdW1lICovCisJZXJyID0gc2NhcmxldHQyX3VzYl9zZXRfY29uZmlnKAor CQltaXhlciwgU0NBUkxFVFQyX0NPTkZJR19MSU5FX09VVF9WT0xVTUUsCisJCWluZGV4LCBwcml2 YXRlLT5tYXN0ZXJfdm9sIC0gU0NBUkxFVFRfVk9MVU1FX0JJQVMpOworCWlmIChlcnIgPCAwKQor CQlnb3RvIHVubG9jazsKKworCS8qIE5vdGlmeSBvZiBSTy9SVyBjaGFuZ2UgKi8KKwlzbmRfY3Rs X25vdGlmeShtaXhlci0+Y2hpcC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfSU5GTywKKwkJ ICAgICAgICZwcml2YXRlLT52b2xfY3Rsc1tpbmRleF0tPmlkKTsKKworCS8qIFNlbmQgU1cvSFcg c3dpdGNoIGNoYW5nZSB0byB0aGUgZGV2aWNlICovCisJZXJyID0gc2NhcmxldHQyX3VzYl9zZXRf Y29uZmlnKG1peGVyLCBTQ0FSTEVUVDJfQ09ORklHX1NXX0hXX1NXSVRDSCwKKwkJCQkgICAgICAg aW5kZXgsIHZhbCk7CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJnByaXZhdGUtPmRhdGFfbXV0 ZXgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9s X25ldyBzY2FybGV0dDJfc3dfaHdfZW51bV9jdGwgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VM RU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiIiwKKwkuaW5mbyA9IHNjYXJsZXR0Ml9zd19od19l bnVtX2N0bF9pbmZvLAorCS5nZXQgID0gc2NhcmxldHQyX3N3X2h3X2VudW1fY3RsX2dldCwKKwku cHV0ICA9IHNjYXJsZXR0Ml9zd19od19lbnVtX2N0bF9wdXQsCit9OworCisvKioqIExpbmUgTGV2 ZWwvSW5zdHJ1bWVudCBMZXZlbCBTd2l0Y2ggQ29udHJvbHMgKioqLworCitzdGF0aWMgaW50IHNj YXJsZXR0Ml9sZXZlbF9lbnVtX2N0bF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJ CQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0YXRpYyBjb25zdCBj aGFyICpjb25zdCB2YWx1ZXNbMl0gPSB7CisJCSJMaW5lIiwgIkluc3QiCisJfTsKKworCXJldHVy biBzbmRfY3RsX2VudW1faW5mbyh1aW5mbywgMSwgMiwgdmFsdWVzKTsKK30KKworc3RhdGljIGlu dCBzY2FybGV0dDJfbGV2ZWxfZW51bV9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGws CisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1 c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBz Y2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IGVsZW0tPmhlYWQubWl4ZXItPnByaXZhdGVf ZGF0YTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCQlwcml2YXRl LT5sZXZlbF9zd2l0Y2hbZWxlbS0+Y29udHJvbF07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBp bnQgc2NhcmxldHQyX2xldmVsX2VudW1fY3RsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY3Rs LAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qg dXNiX21peGVyX2VsZW1faW5mbyAqZWxlbSA9IGtjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qg dXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIgPSBlbGVtLT5oZWFkLm1peGVyOworCXN0cnVjdCBz Y2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlX2RhdGE7CisKKwlp bnQgaW5kZXggPSBlbGVtLT5jb250cm9sOworCWludCBvdmFsLCB2YWwsIGVyciA9IDA7CisKKwlj YW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXZhdGUtPndvcmspOworCW11dGV4X2xvY2soJnBy aXZhdGUtPmRhdGFfbXV0ZXgpOworCisJb3ZhbCA9IHByaXZhdGUtPmxldmVsX3N3aXRjaFtpbmRl eF07CisJdmFsID0gISF1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCWlmIChv dmFsID09IHZhbCkKKwkJZ290byB1bmxvY2s7CisKKwlwcml2YXRlLT5sZXZlbF9zd2l0Y2hbaW5k ZXhdID0gdmFsOworCisJLyogU2VuZCBzd2l0Y2ggY2hhbmdlIHRvIHRoZSBkZXZpY2UgKi8KKwll cnIgPSBzY2FybGV0dDJfdXNiX3NldF9jb25maWcobWl4ZXIsIFNDQVJMRVRUMl9DT05GSUdfTEVW RUxfU1dJVENILAorCQkJCSAgICAgICBpbmRleCwgdmFsKTsKKwordW5sb2NrOgorCW11dGV4X3Vu bG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNv bnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNjYXJsZXR0Ml9sZXZlbF9lbnVtX2N0bCA9IHsK KwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICIiLAorCS5p bmZvID0gc2NhcmxldHQyX2xldmVsX2VudW1fY3RsX2luZm8sCisJLmdldCAgPSBzY2FybGV0dDJf bGV2ZWxfZW51bV9jdGxfZ2V0LAorCS5wdXQgID0gc2NhcmxldHQyX2xldmVsX2VudW1fY3RsX3B1 dCwKK307CisKKy8qKiogUGFkIFN3aXRjaCBDb250cm9scyAqKiovCisKK3N0YXRpYyBpbnQgc2Nh cmxldHQyX3BhZF9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJIHN0cnVj dCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxl bV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzY2FybGV0dDJfbWl4 ZXJfZGF0YSAqcHJpdmF0ZSA9IGVsZW0tPmhlYWQubWl4ZXItPnByaXZhdGVfZGF0YTsKKworCXVj b250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCQlwcml2YXRlLT5wYWRfc3dpdGNo W2VsZW0tPmNvbnRyb2xdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9w YWRfY3RsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCSBzdHJ1Y3Qgc25kX2N0 bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAq ZWxlbSA9IGtjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAq bWl4ZXIgPSBlbGVtLT5oZWFkLm1peGVyOworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAq cHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlX2RhdGE7CisKKwlpbnQgaW5kZXggPSBlbGVtLT5jb250 cm9sOworCWludCBvdmFsLCB2YWwsIGVyciA9IDA7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5 bmMoJnByaXZhdGUtPndvcmspOworCW11dGV4X2xvY2soJnByaXZhdGUtPmRhdGFfbXV0ZXgpOwor CisJb3ZhbCA9IHByaXZhdGUtPnBhZF9zd2l0Y2hbaW5kZXhdOworCXZhbCA9ICEhdWNvbnRyb2wt PnZhbHVlLmludGVnZXIudmFsdWVbMF07CisKKwlpZiAob3ZhbCA9PSB2YWwpCisJCWdvdG8gdW5s b2NrOworCisJcHJpdmF0ZS0+cGFkX3N3aXRjaFtpbmRleF0gPSB2YWw7CisKKwkvKiBTZW5kIHN3 aXRjaCBjaGFuZ2UgdG8gdGhlIGRldmljZSAqLworCWVyciA9IHNjYXJsZXR0Ml91c2Jfc2V0X2Nv bmZpZyhtaXhlciwgU0NBUkxFVFQyX0NPTkZJR19QQURfU1dJVENILAorCQkJCSAgICAgICBpbmRl eCwgdmFsKTsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7 CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3 IHNjYXJsZXR0Ml9wYWRfY3RsID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01J WEVSLAorCS5uYW1lID0gIiIsCisJLmluZm8gPSBzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvLAor CS5nZXQgID0gc2NhcmxldHQyX3BhZF9jdGxfZ2V0LAorCS5wdXQgID0gc2NhcmxldHQyX3BhZF9j dGxfcHV0LAorfTsKKworLyoqKiBNdXRlL0RpbSBDb250cm9scyAqKiovCisKK3N0YXRpYyBpbnQg c2NhcmxldHQyX2J1dHRvbl9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJ ICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2Jf bWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2Jf bWl4ZXJfaW50ZXJmYWNlICptaXhlciA9IGVsZW0tPmhlYWQubWl4ZXI7CisJc3RydWN0IHNjYXJs ZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKworCWlmIChw cml2YXRlLT52b2xfdXBkYXRlZCkgeworCQltdXRleF9sb2NrKCZwcml2YXRlLT5kYXRhX211dGV4 KTsKKwkJc2NhcmxldHQyX3VwZGF0ZV92b2x1bWVzKG1peGVyKTsKKwkJbXV0ZXhfdW5sb2NrKCZw cml2YXRlLT5kYXRhX211dGV4KTsKKwl9CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5p dGVtWzBdID0gcHJpdmF0ZS0+YnV0dG9uc1tlbGVtLT5jb250cm9sXTsKKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIGludCBzY2FybGV0dDJfYnV0dG9uX2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJv bCAqa2N0bCwKKwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7 CisJc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7 CisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyID0gZWxlbS0+aGVhZC5taXhlcjsK KwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9k YXRhOworCisJaW50IGluZGV4ID0gZWxlbS0+Y29udHJvbDsKKwlpbnQgb3ZhbCwgdmFsLCBlcnIg PSAwOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2YXRlLT53b3JrKTsKKwltdXRl eF9sb2NrKCZwcml2YXRlLT5kYXRhX211dGV4KTsKKworCW92YWwgPSBwcml2YXRlLT5idXR0b25z W2luZGV4XTsKKwl2YWwgPSAhIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCisJ aWYgKG92YWwgPT0gdmFsKQorCQlnb3RvIHVubG9jazsKKworCXByaXZhdGUtPmJ1dHRvbnNbaW5k ZXhdID0gdmFsOworCisJLyogU2VuZCBzd2l0Y2ggY2hhbmdlIHRvIHRoZSBkZXZpY2UgKi8KKwll cnIgPSBzY2FybGV0dDJfdXNiX3NldF9jb25maWcobWl4ZXIsIFNDQVJMRVRUMl9DT05GSUdfQlVU VE9OUywKKwkJCQkgICAgICAgaW5kZXgsIHZhbCk7CisKK3VubG9jazoKKwltdXRleF91bmxvY2so JnByaXZhdGUtPmRhdGFfbXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBz dHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzY2FybGV0dDJfYnV0dG9uX2N0bCA9IHsKKwkuaWZhY2Ug PSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICIiLAorCS5pbmZvID0gc25k X2N0bF9ib29sZWFuX21vbm9faW5mbywKKwkuZ2V0ICA9IHNjYXJsZXR0Ml9idXR0b25fY3RsX2dl dCwKKwkucHV0ICA9IHNjYXJsZXR0Ml9idXR0b25fY3RsX3B1dAorfTsKKworLyoqKiBDcmVhdGUg dGhlIGFuYWxvZ3VlIG91dHB1dCBjb250cm9scyAqKiovCisKK3N0YXRpYyBpbnQgc2NhcmxldHQy X2FkZF9saW5lX291dF9jdGxzKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcikKK3sK KwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9k YXRhOworCWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfZGV2aWNlX2luZm8gKmluZm8gPSBwcml2YXRl LT5pbmZvOworCWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfcG9ydHMgKnBvcnRzID0gaW5mby0+cG9y dHM7CisJaW50IG51bV9saW5lX291dCA9CisJCXBvcnRzW1NDQVJMRVRUMl9QT1JUX1RZUEVfQU5B TE9HVUVdLm51bVtTQ0FSTEVUVDJfUE9SVF9PVVRdOworCWludCBlcnIsIGk7CisJY2hhciBzW1NO RFJWX0NUTF9FTEVNX0lEX05BTUVfTUFYTEVOXTsKKworCS8qIEFkZCBSL08gSFcgdm9sdW1lIGNv bnRyb2wgKi8KKwlpZiAoaW5mby0+bGluZV9vdXRfaHdfdm9sKSB7CisJCXNucHJpbnRmKHMsIHNp emVvZihzKSwgIk1hc3RlciBIVyBQbGF5YmFjayBWb2x1bWUiKTsKKwkJZXJyID0gc2NhcmxldHQy X2FkZF9uZXdfY3RsKG1peGVyLAorCQkJCQkgICAgJnNjYXJsZXR0Ml9tYXN0ZXJfdm9sdW1lX2N0 bCwKKwkJCQkJICAgIDAsIDEsIHMsICZwcml2YXRlLT5tYXN0ZXJfdm9sX2N0bCk7CisJCWlmIChl cnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBBZGQgdm9sdW1lIGNvbnRyb2xzICov CisJZm9yIChpID0gMDsgaSA8IG51bV9saW5lX291dDsgaSsrKSB7CisKKwkJLyogRmFkZXIgKi8K KwkJaWYgKGluZm8tPmxpbmVfb3V0X2Rlc2Nyc1tpXSkKKwkJCXNucHJpbnRmKHMsIHNpemVvZihz KSwKKwkJCQkgIkxpbmUgJTAyZCAoJXMpIFBsYXliYWNrIFZvbHVtZSIsCisJCQkJIGkgKyAxLCBp bmZvLT5saW5lX291dF9kZXNjcnNbaV0pOworCQllbHNlCisJCQlzbnByaW50ZihzLCBzaXplb2Yo cyksCisJCQkJICJMaW5lICUwMmQgUGxheWJhY2sgVm9sdW1lIiwKKwkJCQkgaSArIDEpOworCQll cnIgPSBzY2FybGV0dDJfYWRkX25ld19jdGwobWl4ZXIsCisJCQkJCSAgICAmc2NhcmxldHQyX2xp bmVfb3V0X3ZvbHVtZV9jdGwsCisJCQkJCSAgICBpLCAxLCBzLCAmcHJpdmF0ZS0+dm9sX2N0bHNb aV0pOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisKKwkJLyogTWFrZSB0aGUgZmFk ZXIgcmVhZC1vbmx5IGlmIHRoZSBTVy9IVyBzd2l0Y2ggaXMgc2V0IHRvIEhXICovCisJCWlmIChw cml2YXRlLT52b2xfc3dfaHdfc3dpdGNoW2ldKQorCQkJcHJpdmF0ZS0+dm9sX2N0bHNbaV0tPnZk WzBdLmFjY2VzcyAmPQorCQkJCX5TTkRSVl9DVExfRUxFTV9BQ0NFU1NfV1JJVEU7CisKKwkJLyog U1cvSFcgU3dpdGNoICovCisJCWlmIChpbmZvLT5saW5lX291dF9od192b2wpIHsKKwkJCXNucHJp bnRmKHMsIHNpemVvZihzKSwKKwkJCQkgIkxpbmUgT3V0ICUwMmQgVm9sdW1lIENvbnRyb2wgUGxh eWJhY2sgRW51bSIsCisJCQkJIGkgKyAxKTsKKwkJCWVyciA9IHNjYXJsZXR0Ml9hZGRfbmV3X2N0 bChtaXhlciwKKwkJCQkJCSAgICAmc2NhcmxldHQyX3N3X2h3X2VudW1fY3RsLAorCQkJCQkJICAg IGksIDEsIHMsIE5VTEwpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQor CX0KKworCS8qIEFkZCBIVyBidXR0b24gY29udHJvbHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcHJp dmF0ZS0+aW5mby0+YnV0dG9uX2NvdW50OyBpKyspIHsKKwkJZXJyID0gc2NhcmxldHQyX2FkZF9u ZXdfY3RsKG1peGVyLCAmc2NhcmxldHQyX2J1dHRvbl9jdGwsCisJCQkJCSAgICBpLCAxLCBzY2Fy bGV0dDJfYnV0dG9uX25hbWVzW2ldLAorCQkJCQkgICAgJnByaXZhdGUtPmJ1dHRvbl9jdGxzW2ld KTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQor CisvKioqIENyZWF0ZSB0aGUgYW5hbG9ndWUgaW5wdXQgY29udHJvbHMgKioqLworCitzdGF0aWMg aW50IHNjYXJsZXR0Ml9hZGRfbGluZV9pbl9jdGxzKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNl ICptaXhlcikKK3sKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhl ci0+cHJpdmF0ZV9kYXRhOworCWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfZGV2aWNlX2luZm8gKmlu Zm8gPSBwcml2YXRlLT5pbmZvOworCWludCBlcnIsIGk7CisJY2hhciBzW1NORFJWX0NUTF9FTEVN X0lEX05BTUVfTUFYTEVOXTsKKworCS8qIEFkZCBpbnB1dCBsZXZlbCAobGluZS9pbnN0KSBjb250 cm9scyAqLworCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5sZXZlbF9pbnB1dF9jb3VudDsgaSsrKSB7 CisJCXNucHJpbnRmKHMsIHNpemVvZihzKSwgIkxpbmUgSW4gJWQgTGV2ZWwgQ2FwdHVyZSBFbnVt IiwgaSArIDEpOworCQllcnIgPSBzY2FybGV0dDJfYWRkX25ld19jdGwobWl4ZXIsICZzY2FybGV0 dDJfbGV2ZWxfZW51bV9jdGwsCisJCQkJCSAgICBpLCAxLCBzLCBOVUxMKTsKKwkJaWYgKGVyciA8 IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCS8qIEFkZCBpbnB1dCBwYWQgY29udHJvbHMgKi8K Kwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+cGFkX2lucHV0X2NvdW50OyBpKyspIHsKKwkJc25wcmlu dGYocywgc2l6ZW9mKHMpLCAiTGluZSBJbiAlZCBQYWQgQ2FwdHVyZSBTd2l0Y2giLCBpICsgMSk7 CisJCWVyciA9IHNjYXJsZXR0Ml9hZGRfbmV3X2N0bChtaXhlciwgJnNjYXJsZXR0Ml9wYWRfY3Rs LAorCQkJCQkgICAgaSwgMSwgcywgTlVMTCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVy cjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKiBNaXhlciBWb2x1bWUgQ29udHJvbHMgKioq LworCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9taXhlcl9jdGxfaW5mbyhzdHJ1Y3Qgc25kX2tjb250 cm9sICprY3RsLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQorewor CXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOwor CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNv dW50ID0gZWxlbS0+Y2hhbm5lbHM7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1 aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBTQ0FSTEVUVF9NSVhFUl9NQVhfVkFMVUU7CisJdWlu Zm8tPnZhbHVlLmludGVnZXIuc3RlcCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQg c2NhcmxldHQyX21peGVyX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJCQkg ICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdXNiX21p eGVyX2VsZW1faW5mbyAqZWxlbSA9IGtjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2Nhcmxl dHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBlbGVtLT5oZWFkLm1peGVyLT5wcml2YXRlX2RhdGE7 CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHByaXZhdGUtPm1peFtlbGVt LT5jb250cm9sXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2FybGV0dDJfbWl4ZXJf Y3RsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCSAgIHN0cnVjdCBzbmRfY3Rs X2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICpl bGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICpt aXhlciA9IGVsZW0tPmhlYWQubWl4ZXI7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpw cml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKwljb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX2Rl dmljZV9pbmZvICppbmZvID0gcHJpdmF0ZS0+aW5mbzsKKwljb25zdCBzdHJ1Y3Qgc2NhcmxldHQy X3BvcnRzICpwb3J0cyA9IGluZm8tPnBvcnRzOworCWludCBvdmFsLCB2YWwsIG51bV9taXhlcl9p biwgbWl4X251bSwgZXJyID0gMDsKKworCW11dGV4X2xvY2soJnByaXZhdGUtPmRhdGFfbXV0ZXgp OworCisJb3ZhbCA9IHByaXZhdGUtPm1peFtlbGVtLT5jb250cm9sXTsKKwl2YWwgPSB1Y29udHJv bC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwludW1fbWl4ZXJfaW4gPSBwb3J0c1tTQ0FSTEVU VDJfUE9SVF9UWVBFX01JWF0ubnVtW1NDQVJMRVRUMl9QT1JUX09VVF07CisJbWl4X251bSA9IGVs ZW0tPmNvbnRyb2wgLyBudW1fbWl4ZXJfaW47CisKKwlpZiAob3ZhbCA9PSB2YWwpCisJCWdvdG8g dW5sb2NrOworCisJcHJpdmF0ZS0+bWl4W2VsZW0tPmNvbnRyb2xdID0gdmFsOworCWVyciA9IHNj YXJsZXR0Ml91c2Jfc2V0X21peChtaXhlciwgbWl4X251bSk7CisJaWYgKGVyciA9PSAwKQorCQll cnIgPSAxOworCit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZwcml2YXRlLT5kYXRhX211dGV4KTsK KwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTUlOTUFYKAor CWRiX3NjYWxlX3NjYXJsZXR0X21peGVyLAorCVNDQVJMRVRUX01JWEVSX01JTl9EQiAqIDEwMCwK KwlTQ0FSTEVUVF9NSVhFUl9NQVhfREIgKiAxMDAKKyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg c25kX2tjb250cm9sX25ldyBzY2FybGV0dDJfbWl4ZXJfY3RsID0geworCS5pZmFjZSA9IFNORFJW X0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1Nf UkVBRFdSSVRFIHwKKwkJICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQsCisJLm5hbWUg PSAiIiwKKwkuaW5mbyA9IHNjYXJsZXR0Ml9taXhlcl9jdGxfaW5mbywKKwkuZ2V0ICA9IHNjYXJs ZXR0Ml9taXhlcl9jdGxfZ2V0LAorCS5wdXQgID0gc2NhcmxldHQyX21peGVyX2N0bF9wdXQsCisJ LnByaXZhdGVfdmFsdWUgPSBTQ0FSTEVUVF9NSVhFUl9NQVhfREIsIC8qIG1heCB2YWx1ZSAqLwor CS50bHYgPSB7IC5wID0gZGJfc2NhbGVfc2NhcmxldHRfbWl4ZXIgfQorfTsKKworc3RhdGljIGlu dCBzY2FybGV0dDJfYWRkX21peGVyX2N0bHMoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1p eGVyKQoreworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1peGVyLT5w cml2YXRlX2RhdGE7CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyAqcG9ydHMgPSBwcml2 YXRlLT5pbmZvLT5wb3J0czsKKwlpbnQgZXJyLCBpLCBqOworCWludCBpbmRleDsKKwljaGFyIHNb U05EUlZfQ1RMX0VMRU1fSURfTkFNRV9NQVhMRU5dOworCisJaW50IG51bV9pbnB1dHMgPSBwb3J0 c1tTQ0FSTEVUVDJfUE9SVF9UWVBFX01JWF0ubnVtW1NDQVJMRVRUMl9QT1JUX09VVF07CisJaW50 IG51bV9vdXRwdXRzID0gcG9ydHNbU0NBUkxFVFQyX1BPUlRfVFlQRV9NSVhdLm51bVtTQ0FSTEVU VDJfUE9SVF9JTl07CisKKwlmb3IgKGkgPSAwLCBpbmRleCA9IDA7IGkgPCBudW1fb3V0cHV0czsg aSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBudW1faW5wdXRzOyBqKyssIGluZGV4KyspIHsKKwkJ CXNucHJpbnRmKHMsIHNpemVvZihzKSwKKwkJCQkgIk1peCAlYyBJbnB1dCAlMDJkIFBsYXliYWNr IFZvbHVtZSIsCisJCQkJICdBJyArIGksIGogKyAxKTsKKwkJCWVyciA9IHNjYXJsZXR0Ml9hZGRf bmV3X2N0bChtaXhlciwgJnNjYXJsZXR0Ml9taXhlcl9jdGwsCisJCQkJCQkgICAgaW5kZXgsIDEs IHMsIE5VTEwpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKwor CXJldHVybiAwOworfQorCisvKioqIE11eCBTb3VyY2UgU2VsZWN0aW9uIENvbnRyb2xzICoqKi8K Kworc3RhdGljIGludCBzY2FybGV0dDJfbXV4X3NyY19lbnVtX2N0bF9pbmZvKHN0cnVjdCBzbmRf a2NvbnRyb2wgKmtjdGwsCisJCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8p Cit7CisJc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2Rh dGE7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gZWxlbS0+aGVhZC5t aXhlci0+cHJpdmF0ZV9kYXRhOworCWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfcG9ydHMgKnBvcnRz ID0gcHJpdmF0ZS0+aW5mby0+cG9ydHM7CisJdW5zaWduZWQgaW50IGl0ZW0gPSB1aW5mby0+dmFs dWUuZW51bWVyYXRlZC5pdGVtOworCWludCBpdGVtcyA9IHByaXZhdGUtPm51bV9tdXhfc3JjczsK KwlpbnQgcG9ydF90eXBlOworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VO VU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gZWxlbS0+Y2hhbm5lbHM7CisJdWluZm8tPnZhbHVl LmVudW1lcmF0ZWQuaXRlbXMgPSBpdGVtczsKKworCWlmIChpdGVtID49IGl0ZW1zKQorCQlpdGVt ID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IGl0ZW1zIC0gMTsKKworCWZvciAocG9y dF90eXBlID0gMDsKKwkgICAgIHBvcnRfdHlwZSA8IFNDQVJMRVRUMl9QT1JUX1RZUEVfQ09VTlQ7 CisJICAgICBwb3J0X3R5cGUrKykgeworCQlpZiAoaXRlbSA8IHBvcnRzW3BvcnRfdHlwZV0ubnVt W1NDQVJMRVRUMl9QT1JUX0lOXSkgeworCQkJc3ByaW50Zih1aW5mby0+dmFsdWUuZW51bWVyYXRl ZC5uYW1lLAorCQkJCXBvcnRzW3BvcnRfdHlwZV0uc3JjX2Rlc2NyLAorCQkJCWl0ZW0gKyBwb3J0 c1twb3J0X3R5cGVdLnNyY19udW1fb2Zmc2V0KTsKKwkJCXJldHVybiAwOworCQl9CisJCWl0ZW0g LT0gcG9ydHNbcG9ydF90eXBlXS5udW1bU0NBUkxFVFQyX1BPUlRfSU5dOworCX0KKworCXJldHVy biAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9tdXhfc3JjX2VudW1fY3RsX2dl dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1f dmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0g a2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0 ZSA9IGVsZW0tPmhlYWQubWl4ZXItPnByaXZhdGVfZGF0YTsKKworCXVjb250cm9sLT52YWx1ZS5l bnVtZXJhdGVkLml0ZW1bMF0gPSBwcml2YXRlLT5tdXhbZWxlbS0+Y29udHJvbF07CisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX211eF9zcmNfZW51bV9jdGxfcHV0KHN0cnVj dCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAq dWNvbnRyb2wpCit7CisJc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5w cml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyID0gZWxlbS0+ aGVhZC5taXhlcjsKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhl ci0+cHJpdmF0ZV9kYXRhOworCWludCBpbmRleCA9IGVsZW0tPmNvbnRyb2w7CisJaW50IG92YWws IHZhbCwgZXJyID0gMDsKKworCW11dGV4X2xvY2soJnByaXZhdGUtPmRhdGFfbXV0ZXgpOworCisJ b3ZhbCA9IHByaXZhdGUtPm11eFtpbmRleF07CisJdmFsID0gY2xhbXAodWNvbnRyb2wtPnZhbHVl LmludGVnZXIudmFsdWVbMF0sCisJCSAgICAwTCwgcHJpdmF0ZS0+bnVtX211eF9zcmNzIC0gMUwp OworCisJaWYgKG92YWwgPT0gdmFsKQorCQlnb3RvIHVubG9jazsKKworCXByaXZhdGUtPm11eFtp bmRleF0gPSB2YWw7CisJZXJyID0gc2NhcmxldHQyX3VzYl9zZXRfbXV4KG1peGVyKTsKKwlpZiAo ZXJyID09IDApCisJCWVyciA9IDE7CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJnByaXZhdGUt PmRhdGFfbXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25k X2tjb250cm9sX25ldyBzY2FybGV0dDJfbXV4X3NyY19lbnVtX2N0bCA9IHsKKwkuaWZhY2UgPSBT TkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICIiLAorCS5pbmZvID0gc2Nhcmxl dHQyX211eF9zcmNfZW51bV9jdGxfaW5mbywKKwkuZ2V0ICA9IHNjYXJsZXR0Ml9tdXhfc3JjX2Vu dW1fY3RsX2dldCwKKwkucHV0ICA9IHNjYXJsZXR0Ml9tdXhfc3JjX2VudW1fY3RsX3B1dCwKK307 CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX2FkZF9tdXhfZW51bXMoc3RydWN0IHVzYl9taXhlcl9p bnRlcmZhY2UgKm1peGVyKQoreworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0 ZSA9IG1peGVyLT5wcml2YXRlX2RhdGE7CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyAq cG9ydHMgPSBwcml2YXRlLT5pbmZvLT5wb3J0czsKKwlpbnQgcG9ydF90eXBlLCBjaGFubmVsLCBp OworCisJZm9yIChpID0gMCwgcG9ydF90eXBlID0gMDsKKwkgICAgIHBvcnRfdHlwZSA8IFNDQVJM RVRUMl9QT1JUX1RZUEVfQ09VTlQ7CisJICAgICBwb3J0X3R5cGUrKykgeworCQlmb3IgKGNoYW5u ZWwgPSAwOworCQkgICAgIGNoYW5uZWwgPCBwb3J0c1twb3J0X3R5cGVdLm51bVtTQ0FSTEVUVDJf UE9SVF9PVVRdOworCQkgICAgIGNoYW5uZWwrKywgaSsrKSB7CisJCQlpbnQgZXJyOworCQkJY2hh ciBzW1NORFJWX0NUTF9FTEVNX0lEX05BTUVfTUFYTEVOXTsKKwkJCWNvbnN0IGNoYXIgKmNvbnN0 IGRlc2NyID0gcG9ydHNbcG9ydF90eXBlXS5kc3RfZGVzY3I7CisKKwkJCXNucHJpbnRmKHMsIHNp emVvZihzKSAtIDUsIGRlc2NyLCBjaGFubmVsICsgMSk7CisJCQlzdHJjYXQocywgIiBFbnVtIik7 CisKKwkJCWVyciA9IHNjYXJsZXR0Ml9hZGRfbmV3X2N0bChtaXhlciwKKwkJCQkJCSAgICAmc2Nh cmxldHQyX211eF9zcmNfZW51bV9jdGwsCisJCQkJCQkgICAgaSwgMSwgcywgTlVMTCk7CisJCQlp ZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisK Ky8qKiogTWV0ZXIgQ29udHJvbHMgKioqLworCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9tZXRlcl9j dGxfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0 bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVt ID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9U WVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gZWxlbS0+Y2hhbm5lbHM7CisJdWluZm8tPnZh bHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSA0MDk1Owor CXVpbmZvLT52YWx1ZS5pbnRlZ2VyLnN0ZXAgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMg aW50IHNjYXJsZXR0Ml9tZXRlcl9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJ CQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHVz Yl9taXhlcl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7CisJdTE2IG1ldGVy X2xldmVsc1tTQ0FSTEVUVDJfTlVNX01FVEVSU107CisJaW50IGksIGVycjsKKworCWVyciA9IHNj YXJsZXR0Ml91c2JfZ2V0X21ldGVyX2xldmVscyhlbGVtLT5oZWFkLm1peGVyLCBtZXRlcl9sZXZl bHMpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZm9yIChpID0gMDsgaSA8IGVs ZW0tPmNoYW5uZWxzOyBpKyspCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldID0g bWV0ZXJfbGV2ZWxzW2ldOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg c25kX2tjb250cm9sX25ldyBzY2FybGV0dDJfbWV0ZXJfY3RsID0geworCS5pZmFjZSA9IFNORFJW X0NUTF9FTEVNX0lGQUNFX1BDTSwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JF QUQgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUsCisJLm5hbWUgPSAiIiwKKwkuaW5m byA9IHNjYXJsZXR0Ml9tZXRlcl9jdGxfaW5mbywKKwkuZ2V0ICA9IHNjYXJsZXR0Ml9tZXRlcl9j dGxfZ2V0Cit9OworCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9hZGRfbWV0ZXJfY3RsKHN0cnVjdCB1 c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcikKK3sKKwlyZXR1cm4gc2NhcmxldHQyX2FkZF9uZXdf Y3RsKG1peGVyLCAmc2NhcmxldHQyX21ldGVyX2N0bCwKKwkJCQkgICAgIDAsIFNDQVJMRVRUMl9O VU1fTUVURVJTLAorCQkJCSAgICAgIkxldmVsIE1ldGVyIiwgTlVMTCk7Cit9CisKKy8qKiogSW5p dGlhbGlzYXRpb24gKioqLworCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9jb3VudF9tdXhfc3Jjcyhj b25zdCBzdHJ1Y3Qgc2NhcmxldHQyX3BvcnRzICpwb3J0cykKK3sKKwlpbnQgcG9ydF90eXBlLCBj b3VudCA9IDA7CisKKwlmb3IgKHBvcnRfdHlwZSA9IDA7CisJICAgICBwb3J0X3R5cGUgPCBTQ0FS TEVUVDJfUE9SVF9UWVBFX0NPVU5UOworCSAgICAgcG9ydF90eXBlKyspCisJCWNvdW50ICs9IHBv cnRzW3BvcnRfdHlwZV0ubnVtW1NDQVJMRVRUMl9QT1JUX0lOXTsKKworCXJldHVybiBjb3VudDsK K30KKworLyogRGVmYXVsdCByb3V0aW5nIGNvbm5lY3RzIFBDTSBvdXRwdXRzIGFuZCBpbnB1dHMg dG8gQW5hbG9ndWUsCisgKiBTL1BESUYsIHRoZW4gQURBVAorICovCitzdGF0aWMgdm9pZCBzY2Fy bGV0dDJfaW5pdF9yb3V0aW5nKHU4ICptdXgsCisJCQkJICAgY29uc3Qgc3RydWN0IHNjYXJsZXR0 Ml9wb3J0cyAqcG9ydHMpCit7CisJaW50IGksIGlucHV0X251bSwgaW5wdXRfY291bnQsIHBvcnRf dHlwZTsKKwlpbnQgb3V0cHV0X251bSwgb3V0cHV0X2NvdW50LCBwb3J0X3R5cGVfY29ubmVjdF9u dW07CisKKwlzdGF0aWMgY29uc3QgaW50IGNvbm5lY3Rfb3JkZXJbXSA9IHsKKwkJU0NBUkxFVFQy X1BPUlRfVFlQRV9BTkFMT0dVRSwKKwkJU0NBUkxFVFQyX1BPUlRfVFlQRV9TUERJRiwKKwkJU0NB UkxFVFQyX1BPUlRfVFlQRV9BREFULAorCQktMQorCX07CisKKwkvKiBBc3NpZ24gUENNIGlucHV0 cyAocm91dGluZyBvdXRwdXRzKSAqLworCW91dHB1dF9udW0gPSBzY2FybGV0dDJfZ2V0X3BvcnRf c3RhcnRfbnVtKHBvcnRzLAorCQkJCQkJICBTQ0FSTEVUVDJfUE9SVF9PVVQsCisJCQkJCQkgIFND QVJMRVRUMl9QT1JUX1RZUEVfUENNKTsKKwlvdXRwdXRfY291bnQgPSBwb3J0c1tTQ0FSTEVUVDJf UE9SVF9UWVBFX1BDTV0ubnVtW1NDQVJMRVRUMl9QT1JUX09VVF07CisKKwlmb3IgKHBvcnRfdHlw ZSA9IGNvbm5lY3Rfb3JkZXJbcG9ydF90eXBlX2Nvbm5lY3RfbnVtID0gMF07CisJICAgICBwb3J0 X3R5cGUgPj0gMDsKKwkgICAgIHBvcnRfdHlwZSA9IGNvbm5lY3Rfb3JkZXJbKytwb3J0X3R5cGVf Y29ubmVjdF9udW1dKSB7CisJCWlucHV0X251bSA9IHNjYXJsZXR0Ml9nZXRfcG9ydF9zdGFydF9u dW0oCisJCQlwb3J0cywgU0NBUkxFVFQyX1BPUlRfSU4sIHBvcnRfdHlwZSk7CisJCWlucHV0X2Nv dW50ID0gcG9ydHNbcG9ydF90eXBlXS5udW1bU0NBUkxFVFQyX1BPUlRfSU5dOworCQlmb3IgKGkg PSAwOworCQkgICAgIGkgPCBpbnB1dF9jb3VudCAmJiBvdXRwdXRfY291bnQ7CisJCSAgICAgaSsr LCBvdXRwdXRfY291bnQtLSkKKwkJCW11eFtvdXRwdXRfbnVtKytdID0gaW5wdXRfbnVtKys7CisJ fQorCisJLyogQXNzaWduIFBDTSBvdXRwdXRzIChyb3V0aW5nIGlucHV0cykgKi8KKwlpbnB1dF9u dW0gPSBzY2FybGV0dDJfZ2V0X3BvcnRfc3RhcnRfbnVtKHBvcnRzLAorCQkJCQkJIFNDQVJMRVRU Ml9QT1JUX0lOLAorCQkJCQkJIFNDQVJMRVRUMl9QT1JUX1RZUEVfUENNKTsKKwlpbnB1dF9jb3Vu dCA9IHBvcnRzW1NDQVJMRVRUMl9QT1JUX1RZUEVfUENNXS5udW1bU0NBUkxFVFQyX1BPUlRfSU5d OworCisJZm9yIChwb3J0X3R5cGUgPSBjb25uZWN0X29yZGVyW3BvcnRfdHlwZV9jb25uZWN0X251 bSA9IDBdOworCSAgICAgcG9ydF90eXBlID49IDA7CisJICAgICBwb3J0X3R5cGUgPSBjb25uZWN0 X29yZGVyWysrcG9ydF90eXBlX2Nvbm5lY3RfbnVtXSkgeworCQlvdXRwdXRfbnVtID0gc2Nhcmxl dHQyX2dldF9wb3J0X3N0YXJ0X251bSgKKwkJCXBvcnRzLCBTQ0FSTEVUVDJfUE9SVF9PVVQsIHBv cnRfdHlwZSk7CisJCW91dHB1dF9jb3VudCA9IHBvcnRzW3BvcnRfdHlwZV0ubnVtW1NDQVJMRVRU Ml9QT1JUX09VVF07CisJCWZvciAoaSA9IDA7CisJCSAgICAgaSA8IG91dHB1dF9jb3VudCAmJiBp bnB1dF9jb3VudDsKKwkJICAgICBpKyssIGlucHV0X2NvdW50LS0pCisJCQltdXhbb3V0cHV0X251 bSsrXSA9IGlucHV0X251bSsrOworCX0KK30KKworLyogSW5pdGlhbGlzZSBwcml2YXRlIGRhdGEs IHJvdXRpbmcsIHNlcXVlbmNlIG51bWJlciAqLworc3RhdGljIGludCBzY2FybGV0dDJfaW5pdF9w cml2YXRlKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciwKKwkJCQkgIGNvbnN0IHN0 cnVjdCBzY2FybGV0dDJfZGV2aWNlX2luZm8gKmluZm8pCit7CisJc3RydWN0IHNjYXJsZXR0Ml9t aXhlcl9kYXRhICpwcml2YXRlID0KKwkJa3phbGxvYyhzaXplb2Yoc3RydWN0IHNjYXJsZXR0Ml9t aXhlcl9kYXRhKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXByaXZhdGUpCisJCXJldHVybiAtRU5P TUVNOworCisJbXV0ZXhfaW5pdCgmcHJpdmF0ZS0+dXNiX211dGV4KTsKKwltdXRleF9pbml0KCZw cml2YXRlLT5kYXRhX211dGV4KTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdmF0ZS0+d29yaywg c2NhcmxldHQyX2NvbmZpZ19zYXZlKTsKKwlwcml2YXRlLT5pbmZvID0gaW5mbzsKKwlwcml2YXRl LT5udW1fbXV4X3NyY3MgPSBzY2FybGV0dDJfY291bnRfbXV4X3NyY3MoaW5mby0+cG9ydHMpOwor CXByaXZhdGUtPnNjYXJsZXR0Ml9zZXEgPSAwOworCXByaXZhdGUtPm1peGVyID0gbWl4ZXI7CisJ bWl4ZXItPnByaXZhdGVfZGF0YSA9IHByaXZhdGU7CisJbWl4ZXItPnByaXZhdGVfZnJlZSA9IHNu ZF9zY2FybGV0dF9nZW4yX3ByaXZhdGVfZnJlZTsKKwltaXhlci0+cHJpdmF0ZV9zdXNwZW5kID0g c25kX3NjYXJsZXR0X2dlbjJfcHJpdmF0ZV9zdXNwZW5kOworCisJLyogU2V0dXAgZGVmYXVsdCBy b3V0aW5nICovCisJc2NhcmxldHQyX2luaXRfcm91dGluZyhwcml2YXRlLT5tdXgsIGluZm8tPnBv cnRzKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIHNlcXVlbmNlIG51bWJlciB1c2VkIGZvciB0aGUg cHJvcHJpZXRhcnkgY29tbWFuZHMgKi8KKwlyZXR1cm4gc2NhcmxldHQyX3VzYihtaXhlciwgU0NB UkxFVFQyX1VTQl9JTklUX1NFUSwKKwkJCSAgICAgTlVMTCwgMCwgTlVMTCwgMCk7Cit9CisKKy8q IFJlYWQgbGluZS1pbiBjb25maWcgYW5kIGxpbmUtb3V0IHZvbHVtZSBzZXR0aW5ncyBvbiBzdGFy dCAqLworc3RhdGljIGludCBzY2FybGV0dDJfcmVhZF9jb25maWdzKHN0cnVjdCB1c2JfbWl4ZXJf aW50ZXJmYWNlICptaXhlcikKK3sKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZh dGUgPSBtaXhlci0+cHJpdmF0ZV9kYXRhOworCWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfZGV2aWNl X2luZm8gKmluZm8gPSBwcml2YXRlLT5pbmZvOworCWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfcG9y dHMgKnBvcnRzID0gaW5mby0+cG9ydHM7CisJaW50IG51bV9saW5lX291dCA9CisJCXBvcnRzW1ND QVJMRVRUMl9QT1JUX1RZUEVfQU5BTE9HVUVdLm51bVtTQ0FSTEVUVDJfUE9SVF9PVVRdOworCXU4 IGxldmVsX3N3aXRjaGVzW1NDQVJMRVRUMl9MRVZFTF9TV0lUQ0hfTUFYXTsKKwl1OCBwYWRfc3dp dGNoZXNbU0NBUkxFVFQyX1BBRF9TV0lUQ0hfTUFYXTsKKwlzdHJ1Y3Qgc2NhcmxldHQyX3VzYl92 b2x1bWVfc3RhdHVzIHZvbHVtZV9zdGF0dXM7CisJaW50IGVyciwgaTsKKworCWlmIChpbmZvLT5s ZXZlbF9pbnB1dF9jb3VudCkgeworCQllcnIgPSBzY2FybGV0dDJfdXNiX2dldF9jb25maWcoCisJ CQltaXhlciwKKwkJCVNDQVJMRVRUMl9DT05GSUdfTEVWRUxfU1dJVENILAorCQkJaW5mby0+bGV2 ZWxfaW5wdXRfY291bnQsCisJCQlsZXZlbF9zd2l0Y2hlcyk7CisJCWlmIChlcnIgPCAwKQorCQkJ cmV0dXJuIGVycjsKKwkJZm9yIChpID0gMDsgaSA8IGluZm8tPmxldmVsX2lucHV0X2NvdW50OyBp KyspCisJCQlwcml2YXRlLT5sZXZlbF9zd2l0Y2hbaV0gPSBsZXZlbF9zd2l0Y2hlc1tpXTsKKwl9 CisKKwlpZiAoaW5mby0+cGFkX2lucHV0X2NvdW50KSB7CisJCWVyciA9IHNjYXJsZXR0Ml91c2Jf Z2V0X2NvbmZpZygKKwkJCW1peGVyLAorCQkJU0NBUkxFVFQyX0NPTkZJR19QQURfU1dJVENILAor CQkJaW5mby0+cGFkX2lucHV0X2NvdW50LAorCQkJcGFkX3N3aXRjaGVzKTsKKwkJaWYgKGVyciA8 IDApCisJCQlyZXR1cm4gZXJyOworCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+cGFkX2lucHV0X2Nv dW50OyBpKyspCisJCQlwcml2YXRlLT5wYWRfc3dpdGNoW2ldID0gcGFkX3N3aXRjaGVzW2ldOwor CX0KKworCWVyciA9IHNjYXJsZXR0Ml91c2JfZ2V0X3ZvbHVtZV9zdGF0dXMobWl4ZXIsICZ2b2x1 bWVfc3RhdHVzKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXByaXZhdGUtPm1h c3Rlcl92b2wgPSBjbGFtcCgKKwkJdm9sdW1lX3N0YXR1cy5tYXN0ZXJfdm9sICsgU0NBUkxFVFRf Vk9MVU1FX0JJQVMsCisJCTAsIFNDQVJMRVRUX1ZPTFVNRV9CSUFTKTsKKworCWZvciAoaSA9IDA7 IGkgPCBudW1fbGluZV9vdXQ7IGkrKykgeworCQlpbnQgdm9sdW1lOworCisJCXByaXZhdGUtPnZv bF9zd19od19zd2l0Y2hbaV0gPQorCQkJaW5mby0+bGluZV9vdXRfaHdfdm9sCisJCQkJJiYgdm9s dW1lX3N0YXR1cy5zd19od19zd2l0Y2hbaV07CisKKwkJdm9sdW1lID0gcHJpdmF0ZS0+dm9sX3N3 X2h3X3N3aXRjaFtpXQorCQkJICAgPyB2b2x1bWVfc3RhdHVzLm1hc3Rlcl92b2wKKwkJCSAgIDog dm9sdW1lX3N0YXR1cy5zd192b2xbaV07CisJCXZvbHVtZSA9IGNsYW1wKHZvbHVtZSArIFNDQVJM RVRUX1ZPTFVNRV9CSUFTLAorCQkJICAgICAgIDAsIFNDQVJMRVRUX1ZPTFVNRV9CSUFTKTsKKwkJ cHJpdmF0ZS0+dm9sW2ldID0gdm9sdW1lOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5i dXR0b25fY291bnQ7IGkrKykKKwkJcHJpdmF0ZS0+YnV0dG9uc1tpXSA9ICEhdm9sdW1lX3N0YXR1 cy5idXR0b25zW2ldOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE5vdGlmeSBvbiB2b2x1bWUgY2hh bmdlICovCitzdGF0aWMgdm9pZCBzY2FybGV0dDJfbWl4ZXJfaW50ZXJydXB0X3ZvbF9jaGFuZ2Uo CisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQoreworCXN0cnVjdCBzY2FybGV0 dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlX2RhdGE7CisJY29uc3Qgc3Ry dWN0IHNjYXJsZXR0Ml9wb3J0cyAqcG9ydHMgPSBwcml2YXRlLT5pbmZvLT5wb3J0czsKKwlpbnQg bnVtX2xpbmVfb3V0ID0KKwkJcG9ydHNbU0NBUkxFVFQyX1BPUlRfVFlQRV9BTkFMT0dVRV0ubnVt W1NDQVJMRVRUMl9QT1JUX09VVF07CisJaW50IGk7CisKKwlwcml2YXRlLT52b2xfdXBkYXRlZCA9 IDE7CisKKwlzbmRfY3RsX25vdGlmeShtaXhlci0+Y2hpcC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5U X01BU0tfVkFMVUUsCisJCSAgICAgICAmcHJpdmF0ZS0+bWFzdGVyX3ZvbF9jdGwtPmlkKTsKKwor CWZvciAoaSA9IDA7IGkgPCBudW1fbGluZV9vdXQ7IGkrKykgeworCQlpZiAoIXByaXZhdGUtPnZv bF9zd19od19zd2l0Y2hbaV0pCisJCQljb250aW51ZTsKKwkJc25kX2N0bF9ub3RpZnkobWl4ZXIt PmNoaXAtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLAorCQkJICAgICAgICZwcml2 YXRlLT52b2xfY3Rsc1tpXS0+aWQpOworCX0KK30KKworLyogTm90aWZ5IG9uIGJ1dHRvbiBjaGFu Z2UgKi8KK3N0YXRpYyB2b2lkIHNjYXJsZXR0Ml9taXhlcl9pbnRlcnJ1cHRfYnV0dG9uX2NoYW5n ZSgKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCit7CisJc3RydWN0IHNjYXJs ZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKwlpbnQgaTsK KworCXByaXZhdGUtPnZvbF91cGRhdGVkID0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBwcml2YXRl LT5pbmZvLT5idXR0b25fY291bnQ7IGkrKykKKwkJc25kX2N0bF9ub3RpZnkobWl4ZXItPmNoaXAt PmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLAorCQkJICAgICAgICZwcml2YXRlLT5i dXR0b25fY3Rsc1tpXS0+aWQpOworfQorCisvKiBJbnRlcnJ1cHQgY2FsbGJhY2sgKi8KK3N0YXRp YyB2b2lkIHNjYXJsZXR0Ml9taXhlcl9pbnRlcnJ1cHQoc3RydWN0IHVyYiAqdXJiKQoreworCXN0 cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciA9IHVyYi0+Y29udGV4dDsKKwlpbnQgbGVu ID0gdXJiLT5hY3R1YWxfbGVuZ3RoOworCWludCB1c3RhdHVzID0gdXJiLT5zdGF0dXM7CisJdTMy IGRhdGE7CisKKwlpZiAodXN0YXR1cyAhPSAwKQorCQlnb3RvIHJlcXVldWU7CisKKwlpZiAobGVu ID09IDgpIHsKKwkJZGF0YSA9IGxlMzJfdG9fY3B1KCoodTMyICopdXJiLT50cmFuc2Zlcl9idWZm ZXIpOworCQlpZiAoZGF0YSAmIFNDQVJMRVRUMl9VU0JfSU5URVJSVVBUX1ZPTF9DSEFOR0UpCisJ CQlzY2FybGV0dDJfbWl4ZXJfaW50ZXJydXB0X3ZvbF9jaGFuZ2UobWl4ZXIpOworCQlpZiAoZGF0 YSAmIFNDQVJMRVRUMl9VU0JfSU5URVJSVVBUX0JVVFRPTl9DSEFOR0UpCisJCQlzY2FybGV0dDJf bWl4ZXJfaW50ZXJydXB0X2J1dHRvbl9jaGFuZ2UobWl4ZXIpOworCX0gZWxzZSB7CisJCXVzYl9h dWRpb19lcnIobWl4ZXItPmNoaXAsCisJCQkgICAgICAic2NhcmxldHQgbWl4ZXIgaW50ZXJydXB0 IGxlbmd0aCAlZFxuIiwgbGVuKTsKKwl9CisKK3JlcXVldWU6CisJaWYgKHVzdGF0dXMgIT0gLUVO T0VOVCAmJgorCSAgICB1c3RhdHVzICE9IC1FQ09OTlJFU0VUICYmCisJICAgIHVzdGF0dXMgIT0g LUVTSFVURE9XTikgeworCQl1cmItPmRldiA9IG1peGVyLT5jaGlwLT5kZXY7CisJCXVzYl9zdWJt aXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJfQorfQorCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9t aXhlcl9zdGF0dXNfY3JlYXRlKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcikKK3sK Kwl2b2lkICp0cmFuc2Zlcl9idWZmZXI7CisKKwlpZiAobWl4ZXItPnVyYikgeworCQl1c2JfYXVk aW9fZXJyKG1peGVyLT5jaGlwLAorCQkJICAgICAgIiVzOiBtaXhlciB1cmIgYWxyZWFkeSBpbiB1 c2UhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCW1peGVyLT51cmIgPSB1c2Jf YWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghbWl4ZXItPnVyYikKKwkJcmV0dXJuIC1F Tk9NRU07CisKKwl0cmFuc2Zlcl9idWZmZXIgPSBrbWFsbG9jKFNDQVJMRVRUMl9VU0JfSU5URVJS VVBUX01BWF9EQVRBLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRyYW5zZmVyX2J1ZmZlcikKKwkJcmV0 dXJuIC1FTk9NRU07CisKKwl1c2JfZmlsbF9pbnRfdXJiKAorCQltaXhlci0+dXJiLAorCQltaXhl ci0+Y2hpcC0+ZGV2LAorCQl1c2JfcmN2aW50cGlwZShtaXhlci0+Y2hpcC0+ZGV2LAorCQkJICAg ICAgIFNDQVJMRVRUMl9VU0JfSU5URVJSVVBUX0VORFBPSU5UKSwKKwkJdHJhbnNmZXJfYnVmZmVy LAorCQlTQ0FSTEVUVDJfVVNCX0lOVEVSUlVQVF9NQVhfREFUQSwKKwkJc2NhcmxldHQyX21peGVy X2ludGVycnVwdCwKKwkJbWl4ZXIsCisJCVNDQVJMRVRUMl9VU0JfSU5URVJSVVBUX0lOVEVSVkFM KTsKKworCXJldHVybiB1c2Jfc3VibWl0X3VyYihtaXhlci0+dXJiLCBHRlBfS0VSTkVMKTsKK30K KworLyogRW50cnkgcG9pbnQgKi8KK2ludCBzbmRfc2NhcmxldHRfZ2VuMl9jb250cm9sc19jcmVh dGUoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQoreworCWNvbnN0IHN0cnVjdCBz Y2FybGV0dDJfZGV2aWNlX2luZm8gKmluZm87CisJaW50IGVycjsKKworCS8qIG9ubHkgdXNlIFVB Q19WRVJTSU9OXzIgKi8KKwlpZiAoIW1peGVyLT5wcm90b2NvbCkKKwkJcmV0dXJuIDA7CisKKwlz d2l0Y2ggKG1peGVyLT5jaGlwLT51c2JfaWQpIHsKKwljYXNlIFVTQl9JRCgweDEyMzUsIDB4ODIw Myk6CisJCWluZm8gPSAmczZpNl9nZW4yX2luZm87CisJCWJyZWFrOworCWNhc2UgVVNCX0lEKDB4 MTIzNSwgMHg4MjA0KToKKwkJaW5mbyA9ICZzMThpOF9nZW4yX2luZm87CisJCWJyZWFrOworCWNh c2UgVVNCX0lEKDB4MTIzNSwgMHg4MjAxKToKKwkJaW5mbyA9ICZzMThpMjBfZ2VuMl9pbmZvOwor CQlicmVhazsKKwlkZWZhdWx0OiAvKiBkZXZpY2Ugbm90ICh5ZXQpIHN1cHBvcnRlZCAqLworCQly ZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXNjYXJsZXR0X2dlbjJfbWl4ZXJfZW5hYmxlKSB7 CisJCXVzYl9hdWRpb19lcnIobWl4ZXItPmNoaXAsCisJCQkiRm9jdXNyaXRlIFNjYXJsZXR0IEdl biAyIE1peGVyIERyaXZlciBkaXNhYmxlZDsgdXNlICIKKwkJCSJvcHRpb25zIHNuZF91c2JfYXVk aW8gc2NhcmxldHRfZ2VuMl9taXhlcl9lbmFibGU9MSAiCisJCQkidG8gZW5hYmxlIGFuZCByZXBv cnQgYW55IGlzc3VlcyB0byBnQGI0LnZ1Iik7CisJCXJldHVybiAwOworCX0KKworCS8qIEluaXRp YWxpc2UgcHJpdmF0ZSBkYXRhLCByb3V0aW5nLCBzZXF1ZW5jZSBudW1iZXIgKi8KKwllcnIgPSBz Y2FybGV0dDJfaW5pdF9wcml2YXRlKG1peGVyLCBpbmZvKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0 dXJuIGVycjsKKworCS8qIFJlYWQgdm9sdW1lIGxldmVscyBhbmQgY29udHJvbHMgZnJvbSB0aGUg aW50ZXJmYWNlICovCisJZXJyID0gc2NhcmxldHQyX3JlYWRfY29uZmlncyhtaXhlcik7CisJaWYg KGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBDcmVhdGUgdGhlIGFuYWxvZ3VlIG91dHB1 dCBjb250cm9scyAqLworCWVyciA9IHNjYXJsZXR0Ml9hZGRfbGluZV9vdXRfY3RscyhtaXhlcik7 CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBDcmVhdGUgdGhlIGFuYWxvZ3Vl IGlucHV0IGNvbnRyb2xzICovCisJZXJyID0gc2NhcmxldHQyX2FkZF9saW5lX2luX2N0bHMobWl4 ZXIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogQ3JlYXRlIHRoZSBpbnB1 dCwgb3V0cHV0LCBhbmQgbWl4ZXIgbXV4IGlucHV0IHNlbGVjdGlvbnMgKi8KKwllcnIgPSBzY2Fy bGV0dDJfYWRkX211eF9lbnVtcyhtaXhlcik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7 CisKKwkvKiBDcmVhdGUgdGhlIG1hdHJpeCBtaXhlciBjb250cm9scyAqLworCWVyciA9IHNjYXJs ZXR0Ml9hZGRfbWl4ZXJfY3RscyhtaXhlcik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7 CisKKwkvKiBDcmVhdGUgdGhlIGxldmVsIG1ldGVyIGNvbnRyb2xzICovCisJZXJyID0gc2Nhcmxl dHQyX2FkZF9tZXRlcl9jdGwobWl4ZXIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwor CisJLyogU2V0IHVwIHRoZSBpbnRlcnJ1cHQgcG9sbGluZyBpZiB0aGVyZSBhcmUgaGFyZHdhcmUg YnV0dG9ucyAqLworCWlmIChpbmZvLT5idXR0b25fY291bnQpIHsKKwkJZXJyID0gc2NhcmxldHQy X21peGVyX3N0YXR1c19jcmVhdGUobWl4ZXIpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBl cnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9zY2FybGV0dF9nZW4y X3ByaXZhdGVfZnJlZShzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCit7CisJc3Ry dWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsK KworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdmF0ZS0+d29yayk7CisJa2ZyZWUocHJp dmF0ZSk7CisJbWl4ZXItPnByaXZhdGVfZGF0YSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNu ZF9zY2FybGV0dF9nZW4yX3ByaXZhdGVfc3VzcGVuZChzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFj ZSAqbWl4ZXIpCit7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4 ZXItPnByaXZhdGVfZGF0YTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdmF0ZS0+ d29yayk7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWl4ZXJfc2NhcmxldHRfZ2VuMi5oIGIv c291bmQvdXNiL21peGVyX3NjYXJsZXR0X2dlbjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAwMDAuLjUyZTFkYWQ3N2FmZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3Vz Yi9taXhlcl9zY2FybGV0dF9nZW4yLmgKQEAgLTAsMCArMSw3IEBACisvKiBTUERYLUxpY2Vuc2Ut SWRlbnRpZmllcjogR1BMLTIuMCAqLworI2lmbmRlZiBfX1VTQl9NSVhFUl9TQ0FSTEVUVF9HRU4y X0gKKyNkZWZpbmUgX19VU0JfTUlYRVJfU0NBUkxFVFRfR0VOMl9ICisKK2ludCBzbmRfc2Nhcmxl dHRfZ2VuMl9jb250cm9sc19jcmVhdGUoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVy KTsKKworI2VuZGlmIC8qIF9fVVNCX01JWEVSX1NDQVJMRVRUX0dFTjJfSCAqLwpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpBbHNhLWRldmVsIG1haWxpbmcg bGlzdApBbHNhLWRldmVsQGFsc2EtcHJvamVjdC5vcmcKaHR0cHM6Ly9tYWlsbWFuLmFsc2EtcHJv amVjdC5vcmcvbWFpbG1hbi9saXN0aW5mby9hbHNhLWRldmVsCg==