From owner-freebsd-wireless@FreeBSD.ORG Mon Aug 5 15:58:35 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 3DB78F26; Mon, 5 Aug 2013 15:58:35 +0000 (UTC) (envelope-from qinchenchong@gmail.com) Received: from mail-vb0-x234.google.com (mail-vb0-x234.google.com [IPv6:2607:f8b0:400c:c02::234]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id BD02724E3; Mon, 5 Aug 2013 15:58:34 +0000 (UTC) Received: by mail-vb0-f52.google.com with SMTP id f12so2956146vbg.25 for ; Mon, 05 Aug 2013 08:58:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=TMdOrqRGXjQTg9n+zgjjnd7ls8Re3bKSi3jbHmRAzJ0=; b=wUBLuaO89RjIx9q7mrfRG4atYs/XTZd1dI0rXLZaHbmOOGBnP29uZJfoORNSKDWQrS 7z+S/qrAbjWbsbQNXAPFHWCyyazYYGpmz2V1UzVMrfdnSaQIkFwHkDV2VvqQU07BPKg0 x0NoKEVRmEt5yTxxQoQbmxbZ4DD3VNNx9pO6rsFuaCDW5U8qJ66/GLSyzQ23Acz0a1ii 90NxUaFZjaWKgpsoYI3aock5tzAQsqvuaO5r6l9JB6E2CD0I2Onnv60gzyU9FQ8utUq2 bKa3G+QPi6xRUxY2Af0BW3/aStLHNgfG4J9R4YZNpBFqIbu3JwpCz5zDJHhoDbrBBkf2 iYRw== MIME-Version: 1.0 X-Received: by 10.58.200.73 with SMTP id jq9mr6028400vec.53.1375718313942; Mon, 05 Aug 2013 08:58:33 -0700 (PDT) Received: by 10.220.57.142 with HTTP; Mon, 5 Aug 2013 08:58:33 -0700 (PDT) In-Reply-To: References: Date: Mon, 5 Aug 2013 23:58:33 +0800 Message-ID: Subject: Re: Chenchong's work on net80211_ratectl From: Chenchong Qin To: Adrian Chadd Content-Type: multipart/mixed; boundary=047d7bd6b90069e7a604e3356150 X-Content-Filtered-By: Mailman/MimeDel 2.1.14 Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 05 Aug 2013 15:58:35 -0000 --047d7bd6b90069e7a604e3356150 Content-Type: text/plain; charset=ISO-8859-1 Hi! Here is my work done these days on porting ath_rate_sample to net80211. It has not been finished yet. _complete_ and _update_ are to be added. _complete_ is really a tricky thing. We have to provide rc algos with rc information during the frame completion period. Different rc algos may need different rc information. What makes things more thornier is that different drivers provide different rc information in different ways. So, it seems we need a unified way to provide the rc information during completion of a frame. I'm browsing mac80211 these days to see what Linux do about _complete_. And, looking forward to your commets! Thanks! Chenchong On Sat, Aug 3, 2013 at 1:30 AM, Adrian Chadd wrote: > Well just remember you can always ask me/us questions! > > What's your latest diff against -HEAD? Maybe I can start looking at > including parts of it in the tree. > > > > > -adrian > > On 2 August 2013 09:17, Chenchong Qin wrote: > > Hi! > > > > These days, I'm taking a further look at what Linux done for the > > _completion_ of a > > frame. Some updates will be posted here later. > > > > And, with ir_rates, we can return/fill an rc array rather than just > > returning the rix. > > > > Thanks! > > > > Chenchong > > > > > > > > > > > > On Thu, Aug 1, 2013 at 12:21 AM, Adrian Chadd > wrote: > >> > >> Boo! > >> > >> Do you have another update? > >> > >> > >> > >> -adrian > >> > >> On 24 July 2013 06:44, Adrian Chadd wrote: > >> > On 24 July 2013 06:38, Chenchong Qin wrote: > >> >> > >> >> My pleasure! > >> >> > >> >> It's also against HEAD. > >> >> > >> >> Thanks! > >> > > >> > Ok. This is looking great! > >> > > >> > Next - we need to update the rate control API to now populate an rc > >> > array rather than just returning the rix. > >> > > >> > This is the tricky part - as we're going to have to modify all the > >> > drivers that use the rate control API to use this. > >> > Which is fine, as there's only a handful. It's just annoying. > >> > > >> > Then we have to provide the rate control information during frame > >> > _completion_, so the rate control code knows which transmission rates > >> > succeeded or failed. I'm still not sure what to do about it here. > >> > Maybe do something like Linux and attach TX rate control and > >> > completion information as an mbuf tag? > >> > > >> > _Then_ we can start doing interesting thing with it. :) > >> > > >> > > >> > > >> > -adrian > > > > > --047d7bd6b90069e7a604e3356150 Content-Type: application/octet-stream; name="20130805-net80211-ratectl.diff" Content-Disposition: attachment; filename="20130805-net80211-ratectl.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hjzv0cx60 SW5kZXg6IGllZWU4MDIxMV9yY19zYW1wbGUuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBpZWVlODAyMTFfcmNf c2FtcGxlLmMJKHJldmlzaW9uIDApCisrKyBpZWVlODAyMTFfcmNfc2FtcGxlLmMJKHJldmlzaW9u IDI1NTUzOSkKQEAgLTAsMCArMSw5MjYgQEAKKy8qICRGcmVlQlNEOiBoZWFkL3N5cy9kZXYvYXRo L2F0aF9yYXRlL3NhbXBsZS9zYW1wbGUuYyAyNDg1NzMgMjAxMy0wMi0yNyAwNDozMzowNlogYWRy aWFuICQqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAxMyBDaGVuY2hvbmcgUWluIDxjY3Fp bkBGcmVlQlNELm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0 CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93 aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291 cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0 aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92 ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5Z IEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ TUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBB TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJ TiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E SVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEs IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E IE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRX QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor ICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKworI2luY2x1ZGUgIm9wdF93bGFuLmgiCisK KyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMva2VybmVsLmg+CisjaW5jbHVk ZSA8c3lzL21vZHVsZS5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMv c3lzY3RsLmg+CisKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXQvaWZfbWVkaWEu aD4KKworI2lmZGVmIElORVQKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0 aW5ldC9pZl9ldGhlci5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAyMTFf dmFyLmg+CisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX2h0Lmg+CisjaW5jbHVkZSA8bmV0 ODAyMTEvaWVlZTgwMjExX3JhdGVjdGwuaD4KKyNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAyMTFf cmNfc2FtcGxlLmg+CisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3JjX3NhbXBsZV90eHNj aGVkLmg+CisKK3N0YXRpYyB2b2lkCXNhbXBsZV9pbml0KHN0cnVjdCBpZWVlODAyMTF2YXAgKik7 CitzdGF0aWMgdm9pZAlzYW1wbGVfZGVpbml0KHN0cnVjdCBpZWVlODAyMTF2YXAgKik7CitzdGF0 aWMgdm9pZAlzYW1wbGVfbm9kZV9pbml0KHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqKTsKK3N0YXRp YyB2b2lkCXNhbXBsZV9ub2RlX2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKik7CitzdGF0 aWMgaW50CXNhbXBsZV9yYXRlKHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqLCB2b2lkICosIHVpbnQz Ml90KTsKK3N0YXRpYyB2b2lkCXNhbXBsZV90eF9jb21wbGV0ZShjb25zdCBzdHJ1Y3QgaWVlZTgw MjExdmFwICosCisgICAgCQkJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICosIGludCwgCisJ CQl2b2lkICosIHZvaWQgKik7CitzdGF0aWMgdm9pZAlzYW1wbGVfdHhfdXBkYXRlKGNvbnN0IHN0 cnVjdCBpZWVlODAyMTF2YXAgKnZhcCwKKwkJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAq LCB2b2lkICosIHZvaWQgKiwgdm9pZCAqKTsKK3N0YXRpYyB2b2lkCXNhbXBsZV9zZXRpbnRlcnZh bChjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICosIGludCk7CisKKy8qIG51bWJlciBvZiByZWZl cmVuY2VzIGZyb20gbmV0ODAyMTEgbGF5ZXIgKi8KK3N0YXRpYwlpbnQgbnJlZnMgPSAwOworCitz dGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlY3RsIHNhbXBsZSA9IHsKKwkuaXJfbmFt ZQk9ICJzYW1wbGUiLAorCS5pcl9hdHRhY2gJPSBOVUxMLAorCS5pcl9kZXRhY2gJPSBOVUxMLAor CS5pcl9pbml0CT0gc2FtcGxlX2luaXQsCisJLmlyX2RlaW5pdAk9IHNhbXBsZV9kZWluaXQsCisJ LmlyX25vZGVfaW5pdAk9IHNhbXBsZV9ub2RlX2luaXQsCisJLmlyX25vZGVfZGVpbml0CT0gc2Ft cGxlX25vZGVfZGVpbml0LAorCS5pcl9yYXRlCT0gc2FtcGxlX3JhdGUsCisJLmlyX3JhdGVzCT0g TlVMTCwKKwkuaXJfdHhfY29tcGxldGUJPSBzYW1wbGVfdHhfY29tcGxldGUsCisJLmlyX3R4X3Vw ZGF0ZQk9IHNhbXBsZV90eF91cGRhdGUsCisJLmlyX3NldGludGVydmFsCT0gc2FtcGxlX3NldGlu dGVydmFsLAorfTsKK0lFRUU4MDIxMV9SQVRFQ1RMX01PRFVMRShzYW1wbGUsIDEpOworSUVFRTgw MjExX1JBVEVDVExfQUxHKHNhbXBsZSwgSUVFRTgwMjExX1JBVEVDVExfU0FNUExFLCBzYW1wbGUp OworCitzdGF0aWMgdm9pZAorc2FtcGxlX2luaXQoc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwKQor eworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGU7CisKKwlLQVNTRVJUKHZhcC0+aXZf cnMgPT0gTlVMTCwgKCIlcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMiLCBfX2Z1bmNfXykpOworCisJ c2FtcGxlID0gdmFwLT5pdl9ycyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9zYW1w bGUpLAorCSAgICBNXzgwMjExX1JBVEVDVEwsIE1fTk9XQUlUfE1fWkVSTyk7CisJaWYgKHNhbXBs ZSA9PSBOVUxMKSB7CisJCWlmX3ByaW50Zih2YXAtPml2X2lmcCwgImNvdWxkbid0IGFsbG9jIHJh dGVjdGwgc3RydWN0dXJlXG4iKTsKKwkJcmV0dXJuOworCX0KKwlzYW1wbGUtPnNhbXBsZV9zbW9v dGhpbmdfcmF0ZSA9IDc1OwkJLyogZXdtYSBwZXJjZW50YWdlIChbMC4uOTldKSAqLworCXNhbXBs ZS0+c2FtcGxlX3Ntb290aGluZ19taW5wYWNrZXRzID0gMTAwIC8gKDEwMCAtIHNhbXBsZS0+c2Ft cGxlX3Ntb290aGluZ19yYXRlKTsKKwlzYW1wbGUtPnNhbXBsZV9yYXRlID0gMTA7CQkJLyogJXRp bWUgdG8gdHJ5IGRpZmYgdHggcmF0ZXMgKi8KKwlzYW1wbGUtPnNhbXBsZV9tYXhfc3VjY2Vzc2l2 ZV9mYWlsdXJlcyA9IDM7CS8qIHRocmVzaG9sZCBmb3IgcmF0ZSBzYW1wbGluZyovCisJc2FtcGxl LT5zYW1wbGVfc3RhbGVfZmFpbHVyZV90aW1lb3V0ID0gMTAgKiBoejsJLyogMTAgc2Vjb25kcyAq LworCXNhbXBsZS0+c2FtcGxlX21pbl9zd2l0Y2ggPSBoejsJCQkvKiAxIHNlY29uZCAqLworCXNh bXBsZV9zZXRpbnRlcnZhbCh2YXAsIDUwMCAvKiBtcyAqLyk7IAkvKiBhY3R1YWxseSBkbyBub3Ro aW5nICovCisJc2FtcGxlX3N5c2N0bGF0dGFjaCh2YXAsIHZhcC0+aXZfc3lzY3RsLCB2YXAtPml2 X29pZCk7Cit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfZGVpbml0KHN0cnVjdCBpZWVlODAyMTF2 YXAgKnZhcCkKK3sKKwlmcmVlKHZhcC0+aXZfcnMsIE1fODAyMTFfUkFURUNUTCk7Cit9CisKKy8v IFhYWCBzaG91bGQgYmUgc2hhcmVkIGJ5IHJhdGVjdGwgYWxnb3MKK3N0YXRpYyBpbnQKK3NhbXBs ZV9ub2RlX2lzXzExbihzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQoreworCisJaWYgKG5pLT5u aV9jaGFuID09IE5VTEwpCisJCXJldHVybiAoMCk7CisJaWYgKG5pLT5uaV9jaGFuID09IElFRUU4 MDIxMV9DSEFOX0FOWUMpCisJCXJldHVybiAoMCk7CisJcmV0dXJuIChJRUVFODAyMTFfSVNfQ0hB Tl9IVChuaS0+bmlfY2hhbikpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2NoZWR1bGUg Km1ycl9zY2hlZHVsZXNbSUVFRTgwMjExX01PREVfTUFYKzJdID0geworCU5VTEwsCQkvKiBJRUVF ODAyMTFfTU9ERV9BVVRPICovCisJc2VyaWVzXzExYSwJLyogSUVFRTgwMjExX01PREVfMTFBICov CisJc2VyaWVzXzExZywJLyogSUVFRTgwMjExX01PREVfMTFCICovCisJc2VyaWVzXzExZywJLyog SUVFRTgwMjExX01PREVfMTFHICovCisJTlVMTCwJCS8qIElFRUU4MDIxMV9NT0RFX0ZIICovCisJ c2VyaWVzXzExYSwJLyogSUVFRTgwMjExX01PREVfVFVSQk9fQSAqLworCXNlcmllc18xMWcsCS8q IElFRUU4MDIxMV9NT0RFX1RVUkJPX0cgKi8KKwlzZXJpZXNfMTFhLAkvKiBJRUVFODAyMTFfTU9E RV9TVFVSQk9fQSAqLworCXNlcmllc18xMW5hLAkvKiBJRUVFODAyMTFfTU9ERV8xMU5BICovCisJ c2VyaWVzXzExbmcsCS8qIElFRUU4MDIxMV9NT0RFXzExTkcgKi8KKwlzZXJpZXNfaGFsZiwJLyog SUVFRTgwMjExX01PREVfSEFMRiAqLworCXNlcmllc19xdWFydGVyLAkvKiBJRUVFODAyMTFfTU9E RV9RVUFSVEVSICovCit9OworCitzdGF0aWMgdm9pZAorc2FtcGxlX25vZGVfaW5pdChzdHJ1Y3Qg aWVlZTgwMjExX25vZGUgKm5pKQoreworI2RlZmluZQlSQVRFKF9peCkJKG5pLT5uaV9yYXRlcy5y c19yYXRlc1soX2l4KV0gJiBJRUVFODAyMTFfUkFURV9WQUwpCisjZGVmaW5lCURPVDExUkFURShf aXgpCShydC0+aW5mb1soX2l4KV0uZG90MTFSYXRlICYgSUVFRTgwMjExX1JBVEVfVkFMKQorI2Rl ZmluZQlNQ1MoX2l4KQkobmktPm5pX2h0cmF0ZXMucnNfcmF0ZXNbX2l4XSB8IElFRUU4MDIxMV9S QVRFX01DUykKKwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBuaS0+bmlfdmFwOworCXN0cnVj dCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSB2YXAtPml2X3JzOworCXN0cnVjdCBpZWVlODAy MTFfc2FtcGxlX25vZGUgKnNhbiA9IE5VTEw7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRl X3RhYmxlICpydCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmljX2N1cmNo YW4pOworCWVudW0gaWVlZTgwMjExX3BoeW1vZGUgY3VybW9kZSA9IGllZWU4MDIxMV9jaGFuMm1v ZGUodmFwLT5pdl9pYy0+aWNfY3VyY2hhbik7CisJaW50IHgsIHksIHJpeDsKKworCWlmIChuaS0+ bmlfcmN0bHMgPT0gTlVMTCkgeworCQluaS0+bmlfcmN0bHMgPSBzYW4gPSBtYWxsb2Moc2l6ZW9m KHN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUpLAorCQkgICAgTV84MDIxMV9SQVRFQ1RMLCBN X05PV0FJVHxNX1pFUk8pOworCQlpZiAoc2FuID09IE5VTEwpIHsKKwkJCWlmX3ByaW50Zih2YXAt Pml2X2lmcCwgImNvdWxkbid0IGFsbG9jIHBlci1ub2RlIHJhdGVjdGwgIgorCQkJICAgICJzdHJ1 Y3R1cmVcbiIpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlCisJCXNhbiA9IG5pLT5uaV9yY3Rs czsKKwlzYW4tPnNhbl9zYW1wbGUgPSBzYW1wbGU7CisKKwlLQVNTRVJUKHJ0ICE9IE5VTEwsICgi bm8gcmF0ZSB0YWJsZSwgbW9kZSAldSIsIGN1cm1vZGUpKTsKKworCXNhbi0+c2NoZWQgPSBtcnJf c2NoZWR1bGVzW2N1cm1vZGVdOworCUtBU1NFUlQoc2FuLT5zY2hlZCAhPSBOVUxMLCAoIm5vIG1y ciBzY2hlZHVsZSBmb3IgbW9kZSAldSIsIGN1cm1vZGUpKTsKKworCXNhbi0+c3RhdGljX3JpeCA9 IC0xOworCXNhbXBsZV91cGRhdGVfc3RhdGljX3JpeChuaSk7CisKKwkvKgorCSAqIENvbnN0cnVj dCBhIGJpdG1hc2sgb2YgdXNhYmxlIHJhdGVzLiAgVGhpcyBoYXMgYWxsCisJICogbmVnb3RpYXRl ZCByYXRlcyBtaW51cyB0aG9zZSBtYXJrZWQgYnkgdGhlIGhhbCBhcworCSAqIHRvIGJlIGlnbm9y ZWQgZm9yIGRvaW5nIHJhdGUgY29udHJvbC4KKwkgKi8KKwlzYW4tPnJhdGVtYXNrID0gMDsKKwor CS8qIE1DUyByYXRlcyAqLworCWlmIChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkg eworCQlmb3IgKHggPSAwOyB4IDwgbmktPm5pX2h0cmF0ZXMucnNfbnJhdGVzOyB4KyspIHsKKwkJ CXJpeCA9IHJ0LT5yYXRlQ29kZVRvSW5kZXhbTUNTKHgpXTsKKwkJCWlmIChyaXggPT0gMHhmZikK KwkJCQljb250aW51ZTsKKwkJCS8qIHNraXAgcmF0ZXMgbWFya2VkIGJyb2tlbiBieSBoYWwgKi8K KwkJCWlmICghcnQtPmluZm9bcml4XS52YWxpZCkKKwkJCQljb250aW51ZTsKKwkJCUtBU1NFUlQo cml4IDwgU0FNUExFX01BWFJBVEVTLAorCQkJICAgICgibWNzICV1IGhhcyByaXggJWQiLCBNQ1Mo eCksIHJpeCkpOworCQkJc2FuLT5yYXRlbWFzayB8PSAodWludDY0X3QpIDE8PHJpeDsKKwkJfQor CX0KKworCS8qIExlZ2FjeSByYXRlcyAqLworCWZvciAoeCA9IDA7IHggPCBuaS0+bmlfcmF0ZXMu cnNfbnJhdGVzOyB4KyspIHsKKwkJcml4ID0gcnQtPnJhdGVDb2RlVG9JbmRleFtSQVRFKHgpXTsK KwkJaWYgKHJpeCA9PSAweGZmKQorCQkJY29udGludWU7CisJCS8qIHNraXAgcmF0ZXMgbWFya2Vk IGJyb2tlbiBieSBoYWwgKi8KKwkJaWYgKCFydC0+aW5mb1tyaXhdLnZhbGlkKQorCQkJY29udGlu dWU7CisJCUtBU1NFUlQocml4IDwgU0FNUExFX01BWFJBVEVTLAorCQkgICAgKCJyYXRlICV1IGhh cyByaXggJWQiLCBSQVRFKHgpLCByaXgpKTsKKwkJc2FuLT5yYXRlbWFzayB8PSAodWludDY0X3Qp IDE8PHJpeDsKKwl9CisKKwlmb3IgKHkgPSAwOyB5IDwgTlVNX1BBQ0tFVF9TSVpFX0JJTlM7IHkr KykgeworCQlpbnQgc2l6ZSA9IGJpbl90b19zaXplKHkpOworCQl1aW50NjRfdCBtYXNrOworCisJ CXNhbi0+cGFja2V0c19zZW50W3ldID0gMDsKKwkJc2FuLT5jdXJyZW50X3NhbXBsZV9yaXhbeV0g PSAtMTsKKwkJc2FuLT5sYXN0X3NhbXBsZV9yaXhbeV0gPSAwOworCQkvKiBYWFggc3RhcnQgd2l0 aCBmaXJzdCB2YWxpZCByYXRlICovCisJCXNhbi0+Y3VycmVudF9yaXhbeV0gPSBmZnMoc2FuLT5y YXRlbWFzayktMTsKKwkJCisJCS8qCisJCSAqIEluaXRpYWxpemUgdGhlIHN0YXRpc3RpY3MgYnVj a2V0czsgdGhlc2UgYXJlCisJCSAqIGluZGV4ZWQgYnkgdGhlIHJhdGUgY29kZSBpbmRleC4KKwkJ ICovCisJCWZvciAocml4ID0gMCwgbWFzayA9IHNhbi0+cmF0ZW1hc2s7IG1hc2sgIT0gMDsgcml4 KyssIG1hc2sgPj49IDEpIHsKKwkJCWlmICgobWFzayAmIDEpID09IDApCQkvKiBub3QgYSB2YWxp ZCByYXRlICovCisJCQkJY29udGludWU7CisJCQlzYW4tPnN0YXRzW3ldW3JpeF0uc3VjY2Vzc2l2 ZV9mYWlsdXJlcyA9IDA7CisJCQlzYW4tPnN0YXRzW3ldW3JpeF0udHJpZXMgPSAwOworCQkJc2Fu LT5zdGF0c1t5XVtyaXhdLnRvdGFsX3BhY2tldHMgPSAwOworCQkJc2FuLT5zdGF0c1t5XVtyaXhd LnBhY2tldHNfYWNrZWQgPSAwOworCQkJc2FuLT5zdGF0c1t5XVtyaXhdLmxhc3RfdHggPSAwOwor CQkJc2FuLT5zdGF0c1t5XVtyaXhdLmV3bWFfcGN0ID0gMDsKKwkJCQorCQkJc2FuLT5zdGF0c1t5 XVtyaXhdLnBlcmZlY3RfdHhfdGltZSA9CisJCQkgICAgY2FsY191c2Vjc191bmljYXN0X3BhY2tl dChzaXplLCByaXgsIDAsIDAsCisJCQkgICAgKG5pLT5uaV9jaHcgPT0gNDApKTsKKwkJCXNhbi0+ c3RhdHNbeV1bcml4XS5hdmVyYWdlX3R4X3RpbWUgPQorCQkJICAgIHNhbi0+c3RhdHNbeV1bcml4 XS5wZXJmZWN0X3R4X3RpbWU7CisJCX0KKwl9CisKKwkvKiBzZXQgdGhlIHZpc2libGUgYml0LXJh dGUgKi8KKwlpZiAoc2FuLT5zdGF0aWNfcml4ICE9IC0xKQorCQluaS0+bmlfdHhyYXRlID0gRE9U MTFSQVRFKHNhbi0+c3RhdGljX3JpeCk7CisJZWxzZQorCQluaS0+bmlfdHhyYXRlID0gUkFURSgw KTsKKyN1bmRlZiBSQVRFCisjdW5kZWYgRE9UMTFSQVRFCisjdW5kZWYgTUNTCit9CisKK3N0YXRp YyB2b2lkCitzYW1wbGVfbm9kZV9kZWluaXQoc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSkKK3sK KwlmcmVlKG5pLT5uaV9yY3RscywgTV84MDIxMV9SQVRFQ1RMKTsKK30KKworc3RhdGljIGludAor ZG90MTFyYXRlKGNvbnN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCwgaW50IHJpeCkKK3sKKwlp ZiAocml4IDwgMCkKKwkJcmV0dXJuIC0xOworCXJldHVybiBydC0+aW5mb1tyaXhdLnBoeSA9PSBJ RUVFODAyMTFfVF9IVCA/CisJICAgIHJ0LT5pbmZvW3JpeF0uZG90MTFSYXRlIDogKHJ0LT5pbmZv W3JpeF0uZG90MTFSYXRlICYgSUVFRTgwMjExX1JBVEVfVkFMKSAvIDI7Cit9CisKK3N0YXRpYyBj b25zdCBjaGFyICoKK2RvdDExcmF0ZV9sYWJlbChjb25zdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAq cnQsIGludCByaXgpCit7CisJaWYgKHJpeCA8IDApCisJCXJldHVybiAiIjsKKwlyZXR1cm4gcnQt PmluZm9bcml4XS5waHkgPT0gSUVFRTgwMjExX1RfSFQgPyAiTUNTIiA6ICJNYiAiOworfQorCisv KgorICogUmV0dXJuIHRoZSByaXggd2l0aCB0aGUgbG93ZXN0IGF2ZXJhZ2VfdHhfdGltZSwKKyAq IG9yIC0xIGlmIGFsbCB0aGUgYXZlcmFnZV90eF90aW1lcyBhcmUgMC4KKyAqLworc3RhdGljIF9f aW5saW5lIGludAorcGlja19iZXN0X3JhdGUoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpu aSwgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCwKKyAgICBpbnQgc2l6ZV9i aW4sIGludCByZXF1aXJlX2Fja2VkX2JlZm9yZSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBs ZV9ub2RlICpzYW4gPSBuaS0+bmlfcmN0bHM7CisgICAgaW50IGJlc3RfcmF0ZV9yaXgsIGJlc3Rf cmF0ZV90dCwgYmVzdF9yYXRlX3BjdDsKKwl1aW50NjRfdCBtYXNrOworCWludCByaXgsIHR0LCBw Y3Q7CisKKyAgICBiZXN0X3JhdGVfcml4ID0gMDsKKyAgICBiZXN0X3JhdGVfdHQgPSAwOworCWJl c3RfcmF0ZV9wY3QgPSAwOworCisJZm9yIChtYXNrID0gc2FuLT5yYXRlbWFzaywgcml4ID0gMDsg bWFzayAhPSAwOyBtYXNrID4+PSAxLCByaXgrKykgeworCQlpZiAoKG1hc2sgJiAxKSA9PSAwKQkJ Lyogbm90IGEgc3VwcG9ydGVkIHJhdGUgKi8KKwkJCWNvbnRpbnVlOworCisJCS8qIERvbid0IHBp Y2sgYSBub24tSFQgcmF0ZSBmb3IgYSBIVCBub2RlICovCisJCWlmICgobmktPm5pX2ZsYWdzICYg SUVFRTgwMjExX05PREVfSFQpICYmCisJCSAgICAocnQtPmluZm9bcml4XS5waHkgIT0gSUVFRTgw MjExX1RfSFQpKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCXR0ID0gc2FuLT5zdGF0c1tzaXpl X2Jpbl1bcml4XS5hdmVyYWdlX3R4X3RpbWU7CisJCWlmICh0dCA8PSAwIHx8CisJCSAgICAocmVx dWlyZV9hY2tlZF9iZWZvcmUgJiYKKwkJICAgICAhc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4XS5w YWNrZXRzX2Fja2VkKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIENhbGN1bGF0ZSBwZXJjZW50YWdl IGlmIHBvc3NpYmxlICovCisJCWlmIChzYW4tPnN0YXRzW3NpemVfYmluXVtyaXhdLnRvdGFsX3Bh Y2tldHMgPiAwKSB7CisJCQlwY3QgPSBzYW4tPnN0YXRzW3NpemVfYmluXVtyaXhdLmV3bWFfcGN0 OworCQl9IGVsc2UgeworCQkJLyogWFhYIGZvciBub3csIGFzc3VtZSA5NSUgb2sgKi8KKwkJCXBj dCA9IDk1OworCQl9CisKKwkJLyogZG9uJ3QgdXNlIGEgYml0LXJhdGUgdGhhdCBoYXMgYmVlbiBm YWlsaW5nICovCisJCWlmIChzYW4tPnN0YXRzW3NpemVfYmluXVtyaXhdLnN1Y2Nlc3NpdmVfZmFp bHVyZXMgPiAzKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogRm9yIEhULCBEb24ndCB1c2Ug YSBiaXQgcmF0ZSB0aGF0IGlzIG11Y2ggbW9yZQorCQkgKiBsb3NzeSB0aGFuIHRoZSBiZXN0Lgor CQkgKgorCQkgKiBYWFggdGhpcyBpc24ndCBvcHRpbWFsOyBpdCdzIGp1c3QgZGVzaWduZWQgdG8K KwkJICogZWxpbWluYXRlIHJhdGVzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIG9idmlvdXNseQorCQkg KiB3b3JzZS4KKwkJICovCisJCWlmIChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkg eworCQkJaWYgKGJlc3RfcmF0ZV9wY3QgPiAocGN0ICsgNTApKQorCQkJCWNvbnRpbnVlOworCQl9 CisKKwkJLyoKKwkJICogRm9yIG5vbi1NQ1MgcmF0ZXMsIHVzZSB0aGUgY3VycmVudCBhdmVyYWdl IHR4dGltZSBmb3IKKwkJICogY29tcGFyaXNvbi4KKwkJICovCisJCWlmICghIChuaS0+bmlfZmxh Z3MgJiBJRUVFODAyMTFfTk9ERV9IVCkpIHsKKwkJCWlmIChiZXN0X3JhdGVfdHQgPT0gMCB8fCB0 dCA8PSBiZXN0X3JhdGVfdHQpIHsKKwkJCQliZXN0X3JhdGVfdHQgPSB0dDsKKwkJCQliZXN0X3Jh dGVfcml4ID0gcml4OworCQkJCWJlc3RfcmF0ZV9wY3QgPSBwY3Q7CisJCQl9CisJCX0KKworCQkv KgorCQkgKiBTaW5jZSAyIHN0cmVhbSByYXRlcyBoYXZlIHNsaWdodGx5IGhpZ2hlciBUWCB0aW1l cywKKwkJICogYWxsb3cgYSBsaXR0bGUgYml0IG9mIGxlZXdheS4gVGhpcyBzaG91bGQgbGF0ZXIK KwkJICogYmUgYWJzdHJhY3RlZCBvdXQgYW5kIHByb3Blcmx5IGhhbmRsZWQuCisJCSAqLworCQlp ZiAobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpIHsKKwkJCWlmIChiZXN0X3JhdGVf dHQgPT0gMCB8fCAodHQgKiA4IDw9IGJlc3RfcmF0ZV90dCAqIDEwKSkgeworCQkJCWJlc3RfcmF0 ZV90dCA9IHR0OworCQkJCWJlc3RfcmF0ZV9yaXggPSByaXg7CisJCQkJYmVzdF9yYXRlX3BjdCA9 IHBjdDsKKwkJCX0KKwkJfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoYmVzdF9yYXRlX3R0 ID8gYmVzdF9yYXRlX3JpeCA6IC0xKTsKK30KKworLyoKKyAqIFBpY2sgYSBnb29kICJyYW5kb20i IGJpdC1yYXRlIHRvIHNhbXBsZSBvdGhlciB0aGFuIHRoZSBjdXJyZW50IG9uZS4KKyAqLworc3Rh dGljIF9faW5saW5lIGludAorcGlja19zYW1wbGVfcmF0ZShjb25zdCBzdHJ1Y3QgaWVlZTgwMjEx X25vZGUgKm5pLCBjb25zdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQsIAorCWludCBzaXplX2Jp bikKK3sKKyNkZWZpbmUJRE9UMTFSQVRFKGl4KQkocnQtPmluZm9baXhdLmRvdDExUmF0ZSAmIElF RUU4MDIxMV9SQVRFX1ZBTCkKKyNkZWZpbmUJTUNTKGl4KQkJKHJ0LT5pbmZvW2l4XS5kb3QxMVJh dGUgfCBJRUVFODAyMTFfUkFURV9NQ1MpCisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAq c2FuID0gbmktPm5pX3JjdGxzOworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSBz YW4tPnNhbl9zYW1wbGU7CisJaW50IGN1cnJlbnRfcml4LCByaXg7CisJdW5zaWduZWQgY3VycmVu dF90dDsKKwl1aW50NjRfdCBtYXNrOworCQorCWN1cnJlbnRfcml4ID0gc2FuLT5jdXJyZW50X3Jp eFtzaXplX2Jpbl07CisJaWYgKGN1cnJlbnRfcml4IDwgMCkgeworCQkvKiBubyBzdWNjZXNzZXMg eWV0LCBzZW5kIGF0IHRoZSBsb3dlc3QgYml0LXJhdGUgKi8KKwkJLyogWFhYIHNob3VsZCByZXR1 cm4gTUNTMCBpZiBIVCAqLworCQlyZXR1cm4gMDsKKwl9CisKKwljdXJyZW50X3R0ID0gc2FuLT5z dGF0c1tzaXplX2Jpbl1bY3VycmVudF9yaXhdLmF2ZXJhZ2VfdHhfdGltZTsKKworCXJpeCA9IHNh bi0+bGFzdF9zYW1wbGVfcml4W3NpemVfYmluXSsxOwkvKiBuZXh0IHNhbXBsZSByYXRlICovCisJ bWFzayA9IHNhbi0+cmF0ZW1hc2sgJn4gKCh1aW50NjRfdCkgMTw8Y3VycmVudF9yaXgpOy8qIGRv bid0IHNhbXBsZSBjdXJyZW50IHJhdGUgKi8KKwl3aGlsZSAobWFzayAhPSAwKSB7CisJCWlmICgo bWFzayAmICgodWludDY0X3QpIDE8PHJpeCkpID09IDApIHsJLyogbm90IGEgc3VwcG9ydGVkIHJh dGUgKi8KKwluZXh0cmF0ZToKKwkJCWlmICgrK3JpeCA+PSBydC0+cmF0ZUNvdW50KQorCQkJCXJp eCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIFRoZSBmb2xsb3dpbmcgY29k ZSBzdG9wcyB0cnlpbmcgdG8gc2FtcGxlCisJCSAqIG5vbi1NQ1MgcmF0ZXMgd2hlbiBzcGVha2lu ZyB0byBhbiBNQ1Mgbm9kZS4KKwkJICogSG93ZXZlciwgYXQgbGVhc3QgZm9yIENDSyByYXRlcyBp biAyLjRHSHogbW9kZSwKKwkJICogdGhlIG5vbi1NQ1MgcmF0ZXMgTUFZIGFjdHVhbGx5IHByb3Zp ZGUgYmV0dGVyCisJCSAqIFBFUiBhdCB0aGUgdmVyeSBmYXIgZWRnZSBvZiByZWNlcHRpb24uCisJ CSAqCisJCSAqIEhvd2V2ZXIhIFVudGlsIGF0aF9yYXRlX2Zvcm1fYWdncigpIGdyb3dzCisJCSAq IHNvbWUgbG9naWMgdG8gbm90IGZvcm0gYWdncmVnYXRlcyBpZiB0aGUKKwkJICogc2VsZWN0ZWQg cmF0ZSBpcyBub24tTUNTLCB0aGlzIHdvbid0IHdvcmsuCisJCSAqCisJCSAqIFNvIGRvbid0IGRp c2FibGUgdGhpcyBjb2RlIHVudGlsIHlvdSd2ZSB0YXVnaHQKKwkJICogYXRoX3JhdGVfZm9ybV9h Z2dyKCkgdG8gZHJvcCBvdXQgaWYgYW55IG9mCisJCSAqIHRoZSBzZWxlY3RlZCByYXRlcyBhcmUg bm9uLU1DUy4KKwkJICovCisjaWYgMQorCQkvKiBpZiB0aGUgbm9kZSBpcyBIVCBhbmQgdGhlIHJh dGUgaXNuJ3QgSFQsIGRvbid0IGJvdGhlciBzYW1wbGUgKi8KKwkJaWYgKChuaS0+bmlfZmxhZ3Mg JiBJRUVFODAyMTFfTk9ERV9IVCkgJiYKKwkJICAgIChydC0+aW5mb1tyaXhdLnBoeSAhPSBJRUVF ODAyMTFfVF9IVCkpIHsKKwkJCW1hc2sgJj0gfigodWludDY0X3QpIDE8PHJpeCk7CisJCQlnb3Rv IG5leHRyYXRlOworCQl9CisjZW5kaWYKKworCQkvKiB0aGlzIGJpdC1yYXRlIGlzIGFsd2F5cyB3 b3JzZSB0aGFuIHRoZSBjdXJyZW50IG9uZSAqLworCQlpZiAoc2FuLT5zdGF0c1tzaXplX2Jpbl1b cml4XS5wZXJmZWN0X3R4X3RpbWUgPiBjdXJyZW50X3R0KSB7CisJCQltYXNrICY9IH4oKHVpbnQ2 NF90KSAxPDxyaXgpOworCQkJZ290byBuZXh0cmF0ZTsKKwkJfQorCisJCS8qIHJhcmVseSBzYW1w bGUgYml0LXJhdGVzIHRoYXQgZmFpbCBhIGxvdCAqLworCQlpZiAoc2FuLT5zdGF0c1tzaXplX2Jp bl1bcml4XS5zdWNjZXNzaXZlX2ZhaWx1cmVzID4gc2FtcGxlLT5zYW1wbGVfbWF4X3N1Y2Nlc3Np dmVfZmFpbHVyZXMgJiYKKwkJICAgIHRpY2tzIC0gc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4XS5s YXN0X3R4IDwgc2FtcGxlLT5zYW1wbGVfc3RhbGVfZmFpbHVyZV90aW1lb3V0KSB7CisJCQltYXNr ICY9IH4oKHVpbnQ2NF90KSAxPDxyaXgpOworCQkJZ290byBuZXh0cmF0ZTsKKwkJfQorCisJCS8q CisJCSAqIEZvciBIVCwgb25seSBzYW1wbGUgYSBmZXcgcmF0ZXMgb24gZWl0aGVyIHNpZGUgb2Yg dGhlCisJCSAqIGN1cnJlbnQgcml4OyB0aGVyZSdzIHF1aXRlIGxpa2VseSBhIGxvdCBvZiB0aGVt LgorCQkgKi8KKwkJaWYgKG5pLT5uaV9mbGFncyAmIElFRUU4MDIxMV9OT0RFX0hUKSB7CisJCQlp ZiAocml4IDwgKGN1cnJlbnRfcml4IC0gMykgfHwKKwkJCSAgICByaXggPiAoY3VycmVudF9yaXgg KyAzKSkgeworCQkJCW1hc2sgJj0gfigodWludDY0X3QpIDE8PHJpeCk7CisJCQkJZ290byBuZXh0 cmF0ZTsKKwkJCX0KKwkJfQorCisJCS8qIERvbid0IHNhbXBsZSBtb3JlIHRoYW4gMiByYXRlcyBo aWdoZXIgZm9yIHJhdGVzID4gMTFNIGZvciBub24tSFQgcmF0ZXMgKi8KKwkJaWYgKCEgKG5pLT5u aV9mbGFncyAmIElFRUU4MDIxMV9OT0RFX0hUKSkgeworCQkJaWYgKERPVDExUkFURShyaXgpID4g MioxMSAmJiByaXggPiBjdXJyZW50X3JpeCArIDIpIHsKKwkJCQltYXNrICY9IH4oKHVpbnQ2NF90 KSAxPDxyaXgpOworCQkJCWdvdG8gbmV4dHJhdGU7CisJCQl9CisJCX0KKworCQlzYW4tPmxhc3Rf c2FtcGxlX3JpeFtzaXplX2Jpbl0gPSByaXg7CisJCXJldHVybiByaXg7CisJfQorCXJldHVybiBj dXJyZW50X3JpeDsKKyN1bmRlZiBET1QxMVJBVEUKKyN1bmRlZiBNQ1MKK30KKworc3RhdGljIGlu dAorc2FtcGxlX2dldF9zdGF0aWNfcml4KGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmkp Cit7CisjZGVmaW5lCVJBVEUoX2l4KQkobmktPm5pX3JhdGVzLnJzX3JhdGVzWyhfaXgpXSAmIElF RUU4MDIxMV9SQVRFX1ZBTCkKKyNkZWZpbmUJTUNTKF9peCkJKG5pLT5uaV9odHJhdGVzLnJzX3Jh dGVzW19peF0gfCBJRUVFODAyMTFfUkFURV9NQ1MpCisJc3RydWN0IGllZWU4MDIxMXZhcCAqdmFw ID0gbmktPm5pX3ZhcDsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0ID0g aWVlZTgwMjExX2dldF9yYXRldGFibGUodmFwLT5pdl9pYy0+aWNfY3VyY2hhbik7CisJY29uc3Qg c3RydWN0IGllZWU4MDIxMV90eHBhcmFtICp0cCA9IG5pLT5uaV90eHBhcm1zOworCWludCBzcmF0 ZTsKKworCS8qIENoZWNrIE1DUyByYXRlcyAqLworCWZvciAoc3JhdGUgPSBuaS0+bmlfaHRyYXRl cy5yc19ucmF0ZXMgLSAxOyBzcmF0ZSA+PSAwOyBzcmF0ZS0tKSB7CisJCWlmIChNQ1Moc3JhdGUp ID09IHRwLT51Y2FzdHJhdGUpCisJCQlyZXR1cm4gcnQtPnJhdGVDb2RlVG9JbmRleFt0cC0+dWNh c3RyYXRlXTsKKwl9CisKKwkvKiBDaGVjayBsZWdhY3kgcmF0ZXMgKi8KKwlmb3IgKHNyYXRlID0g bmktPm5pX3JhdGVzLnJzX25yYXRlcyAtIDE7IHNyYXRlID49IDA7IHNyYXRlLS0pIHsKKwkJaWYg KFJBVEUoc3JhdGUpID09IHRwLT51Y2FzdHJhdGUpCisJCQlyZXR1cm4gcnQtPnJhdGVDb2RlVG9J bmRleFt0cC0+dWNhc3RyYXRlXTsKKwl9CisJcmV0dXJuIC0xOworI3VuZGVmCVJBVEUKKyN1bmRl ZglNQ1MKK30KKworc3RhdGljIHZvaWQKK3NhbXBsZV91cGRhdGVfc3RhdGljX3JpeChzdHJ1Y3Qg aWVlZTgwMjExX25vZGUgKm5pKQoreworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUgKnNh biA9IG5pLT5uaV9yY3RsczsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4cGFyYW0gKnRwID0g bmktPm5pX3R4cGFybXM7CisKKwlpZiAodHAgIT0gTlVMTCAmJiB0cC0+dWNhc3RyYXRlICE9IElF RUU4MDIxMV9GSVhFRF9SQVRFX05PTkUpIHsKKwkJLyoKKwkJICogQSBmaXhlZCByYXRlIGlzIHRv IGJlIHVzZWQ7IHVjYXN0cmF0ZSBpcyB0aGUgSUVFRSBjb2RlCisJCSAqIGZvciB0aGlzIHJhdGUg KHNhbnMgYmFzaWMgYml0KS4gIENoZWNrIHRoaXMgYWdhaW5zdCB0aGUKKwkJICogbmVnb3RpYXRl ZCByYXRlIHNldCBmb3IgdGhlIG5vZGUuICBOb3RlIHRoZSBmaXhlZCByYXRlCisJCSAqIG1heSBu b3QgYmUgYXZhaWxhYmxlIGZvciB2YXJpb3VzIHJlYXNvbnMgc28gd2Ugb25seQorCQkgKiBzZXR1 cCB0aGUgc3RhdGljIHJhdGUgaW5kZXggaWYgdGhlIGxvb2t1cCBpcyBzdWNjZXNzZnVsLgorCQkg Ki8KKwkJc2FuLT5zdGF0aWNfcml4ID0gc2FtcGxlX2dldF9zdGF0aWNfcml4KG5pKTsKKwl9IGVs c2UgeworCQlzYW4tPnN0YXRpY19yaXggPSAtMTsKKwl9Cit9CisKKy8qCisgKiBQaWNrIGEgbm9u LUhUIHJhdGUgdG8gYmVnaW4gdXNpbmcuCisgKi8KK3N0YXRpYyBpbnQKK3NhbXBsZV9waWNrX3Nl ZWRfcmF0ZV9sZWdhY3koY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgaW50IGZyYW1l TGVuKQoreworI2RlZmluZQlET1QxMVJBVEUoaXgpCShydC0+aW5mb1tpeF0uZG90MTFSYXRlICYg SUVFRTgwMjExX1JBVEVfVkFMKQorCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IG5pLT5uaV92 YXA7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxzOwor CWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQgPSBpZWVlODAyMTFfZ2V0X3Jh dGV0YWJsZSh2YXAtPml2X2ljLT5pY19jdXJjaGFuKTsKKwkKKwljb25zdCBpbnQgc2l6ZV9iaW4g PSBzaXplX3RvX2JpbihmcmFtZUxlbik7CisJaW50IHJpeCA9IC0xOworCisJLyogbm8gcGFja2V0 IGhhcyBiZWVuIHNlbnQgc3VjY2Vzc2Z1bGx5IHlldCAqLworCWZvciAocml4ID0gcnQtPnJhdGVD b3VudC0xOyByaXggPiAwOyByaXgtLSkgeworCQlpZiAoKHNhbi0+cmF0ZW1hc2sgJiAoKHVpbnQ2 NF90KSAxPDxyaXgpKSA9PSAwKQorCQkJY29udGludWU7CisKKwkJLyogU2tpcCBIVCByYXRlcyAq LworCQlpZiAocnQtPmluZm9bcml4XS5waHkgPT0gSUVFRTgwMjExX1RfSFQpCisJCQljb250aW51 ZTsKKworCQkvKgorCQkgKiBQaWNrIHRoZSBoaWdoZXN0IHJhdGUgPD0gMzYgTWJwcworCQkgKiB0 aGF0IGhhc24ndCBmYWlsZWQuCisJCSAqLworCQlpZiAoRE9UMTFSQVRFKHJpeCkgPD0gNzIgJiYK KwkJICAgIHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeF0uc3VjY2Vzc2l2ZV9mYWlsdXJlcyA9PSAw KSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcml4OworI3VuZGVmIERPVDExUkFURQor fQorCisvKgorICogUGljayBhIEhUIHJhdGUgdG8gYmVnaW4gdXNpbmcuCisgKgorICogRG9uJ3Qg dXNlIGFueSBub24tSFQgcmF0ZXM7IG9ubHkgY29uc2lkZXIgSFQgcmF0ZXMuCisgKi8KK3N0YXRp YyBpbnQKK3NhbXBsZV9waWNrX3NlZWRfcmF0ZV9odChjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25v ZGUgKm5pLCBpbnQgZnJhbWVMZW4pCit7CisjZGVmaW5lCU1DUyhpeCkJCShydC0+aW5mb1tpeF0u ZG90MTFSYXRlIHwgSUVFRTgwMjExX1JBVEVfTUNTKQorCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZh cCA9IG5pLT5uaV92YXA7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmkt Pm5pX3JjdGxzOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQgPSBpZWVl ODAyMTFfZ2V0X3JhdGV0YWJsZSh2YXAtPml2X2ljLT5pY19jdXJjaGFuKTsKKwkKKwljb25zdCBp bnQgc2l6ZV9iaW4gPSBzaXplX3RvX2JpbihmcmFtZUxlbik7CisJaW50IHJpeCA9IC0xLCBodF9y aXggPSAtMTsKKworCS8qIG5vIHBhY2tldCBoYXMgYmVlbiBzZW50IHN1Y2Nlc3NmdWxseSB5ZXQg Ki8KKwlmb3IgKHJpeCA9IHJ0LT5yYXRlQ291bnQtMTsgcml4ID4gMDsgcml4LS0pIHsKKwkJLyog U2tpcCByYXRlcyB3ZSBjYW4ndCB1c2UgKi8KKwkJaWYgKChzYW4tPnJhdGVtYXNrICYgKCh1aW50 NjRfdCkgMTw8cml4KSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIEtlZXAgYSBjb3B5IG9m IHRoZSBsYXN0IHNlZW4gSFQgcmF0ZSBpbmRleCAqLworCQlpZiAocnQtPmluZm9bcml4XS5waHkg PT0gSUVFRTgwMjExX1RfSFQpCisJCQlodF9yaXggPSByaXg7CisKKwkJLyogU2tpcCBub24tSFQg cmF0ZXMgKi8KKwkJaWYgKHJ0LT5pbmZvW3JpeF0ucGh5ICE9IElFRUU4MDIxMV9UX0hUKQorCQkJ Y29udGludWU7CisKKwkJLyoKKwkJICogUGljayBhIG1lZGl1bS1zcGVlZCByYXRlIHJlZ2FyZGxl c3Mgb2Ygc3RyZWFtIGNvdW50CisJCSAqIHdoaWNoIGhhcyBub3Qgc2VlbiBhbnkgZmFpbHVyZXMu IEhpZ2hlciByYXRlcyBtYXkgZmFpbDsKKwkJICogd2UnbGwgdHJ5IHRoZW0gbGF0ZXIuCisJCSAq LworCQlpZiAoKChNQ1Mocml4KSAmIDB4NykgPD0gNCkgJiYKKwkJICAgIHNhbi0+c3RhdHNbc2l6 ZV9iaW5dW3JpeF0uc3VjY2Vzc2l2ZV9mYWlsdXJlcyA9PSAwKSB7CisJCQlicmVhazsKKwkJfQor CX0KKworCS8qCisJICogSWYgYWxsIHRoZSBNQ1MgcmF0ZXMgaGF2ZSBzdWNjZXNzaXZlIGZhaWx1 cmVzLCByaXggc2hvdWxkIGJlCisJICogPiAwOyBvdGhlcndpc2UgdXNlIHRoZSBsb3dlc3QgTUNT IHJpeCAoaG9wZWZ1bGx5IE1DUyAwLikKKwkgKi8KKwlyZXR1cm4gTUFYKHJpeCwgaHRfcml4KTsK KyN1bmRlZiBNQ1MKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZXNldCAq CitzYW1wbGVfZ2V0X3JhdGVzZXQoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSkKK3sK Kwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVzZXQgKnJzID0gTlVMTDsKKwkvKiAxMW4gb3Ig bm90PyBQaWNrIHRoZSByaWdodCByYXRlc2V0ICovCisJaWYgKHNhbXBsZV9ub2RlX2lzXzExbihu aSkpIHsKKwkJLyogWFhYIGV3ICovCisJCUlFRUU4MDIxMV9OT1RFKG5pLT5uaV92YXAsIElFRUU4 MDIxMV9NU0dfUkFURUNUTCwgbmksCisJCSAgICAiJXM6IDExbiBub2RlIiwgX19mdW5jX18pOwor CQlycyA9IChzdHJ1Y3QgaWVlZTgwMjExX3JhdGVzZXQgKikgJm5pLT5uaV9odHJhdGVzOworCX0g ZWxzZSB7CisJCUlFRUU4MDIxMV9OT1RFKG5pLT5uaV92YXAsIElFRUU4MDIxMV9NU0dfUkFURUNU TCwgbmksCisJCSAgICAiJXM6IG5vbi0xMW4gbm9kZSIsIF9fZnVuY19fKTsKKwkJcnMgPSAmbmkt Pm5pX3JhdGVzOworCX0KKwlyZXR1cm4gcnM7Cit9CisKK3N0YXRpYyBpbnQKK3NhbXBsZV9yYXRl KHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksIHZvaWQgKmFyZyBfX3VudXNlZCwgdWludDMyX3Qg aWFyZyBfX3VudXNlZCkKK3sKKyNkZWZpbmUJRE9UMTFSQVRFKGl4KQkocnQtPmluZm9baXhdLmRv dDExUmF0ZSAmIElFRUU4MDIxMV9SQVRFX1ZBTCkKKyNkZWZpbmUJTUNTKGl4KQkJKHJ0LT5pbmZv W2l4XS5kb3QxMVJhdGUgfCBJRUVFODAyMTFfUkFURV9NQ1MpCisjZGVmaW5lCVJBVEUoaXgpCShE T1QxMVJBVEUoaXgpIC8gMikKKwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBuaS0+bmlfdmFw OworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUgKnNhbiA9IG5pLT5uaV9yY3RsczsKKwlz dHJ1Y3QgaWVlZTgwMjExX3NhbXBsZSAqc2FtcGxlID0gc2FuLT5zYW5fc2FtcGxlOworCWNvbnN0 IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQgPSBpZWVlODAyMTFfZ2V0X3JhdGV0YWJs ZSh2YXAtPml2X2ljLT5pY19jdXJjaGFuKTsKKwkKKwlpbnQgcml4LCBtcnIsIGJlc3Rfcml4LCBj aGFuZ2VfcmF0ZXM7CisJdW5zaWduZWQgYXZlcmFnZV90eF90aW1lOworCQorCXNpemVfdCBmcmFt ZUxlbiA9IChzaXplX3QpaWFyZzsKKwljb25zdCBpbnQgc2l6ZV9iaW4gPSBzaXplX3RvX2Jpbihm cmFtZUxlbik7CisKKwlzYW1wbGVfdXBkYXRlX3N0YXRpY19yaXgobmkpOworCisJaWYgKHNhbi0+ c3RhdGljX3JpeCAhPSAtMSkgeworCQlyaXggPSBzYW4tPnN0YXRpY19yaXg7CisJCWdvdG8gZG9u ZTsKKwl9CisKKwlpZiAodmFwLT5pdl9yYXRlLT5pcl9jYXBhYmlsaXRpZXMgJiBJRUVFODAyMTFf UkFURUNUTF9DQVBfTVJSKQorCQltcnIgPSAxOworCWlmICghKHZhcC0+aXZfcmF0ZS0+aXJfY2Fw YWJpbGl0aWVzICYgSUVFRTgwMjExX1JBVEVDVExfQ0FQX01SUlBST1QpKQorCQltcnIgPSAwOwor CisJYmVzdF9yaXggPSBwaWNrX2Jlc3RfcmF0ZShuaSwgcnQsIHNpemVfYmluLCAhbXJyKTsKKwlp ZiAoYmVzdF9yaXggPj0gMCkgeworCQlhdmVyYWdlX3R4X3RpbWUgPSBzYW4tPnN0YXRzW3NpemVf YmluXVtiZXN0X3JpeF0uYXZlcmFnZV90eF90aW1lOworCX0gZWxzZSB7CisJCWF2ZXJhZ2VfdHhf dGltZSA9IDA7CisJfQorCisJLyoKKwkgKiBMaW1pdCB0aGUgdGltZSBtZWFzdXJpbmcgdGhlIHBl cmZvcm1hbmNlIG9mIG90aGVyIHR4CisJICogcmF0ZXMgdG8gc2FtcGxlX3JhdGUlIG9mIHRoZSB0 b3RhbCB0cmFuc21pc3Npb24gdGltZS4KKwkgKi8KKwlpZiAoc2FuLT5zYW1wbGVfdHRbc2l6ZV9i aW5dIDwgYXZlcmFnZV90eF90aW1lICogKHNhbi0+cGFja2V0c19zaW5jZV9zYW1wbGVbc2l6ZV9i aW5dICoKKwkJc2FtcGxlLT5zYW1wbGVfcmF0ZS8xMDApKSB7CisJCXJpeCA9IHBpY2tfc2FtcGxl X3JhdGUobmksIHJ0LCBzaXplX2Jpbik7CisJCUlFRUU4MDIxMV9OT1RFKHZhcCwgSUVFRTgwMjEx X01TR19SQVRFQ1RMLAorCQkgICAgICZuaSwgImF0dCAlZCBzYW1wbGVfdHQgJWQgc2l6ZSAldSBz YW1wbGUgcmF0ZSAlZCAlcyBjdXJyZW50IHJhdGUgJWQgJXMiLAorCQkgICAgIGF2ZXJhZ2VfdHhf dGltZSwKKwkJICAgICBzYW4tPnNhbXBsZV90dFtzaXplX2Jpbl0sCisJCSAgICAgYmluX3RvX3Np emUoc2l6ZV9iaW4pLAorCQkgICAgIGRvdDExcmF0ZShydCwgcml4KSwKKwkJICAgICBkb3QxMXJh dGVfbGFiZWwocnQsIHJpeCksCisJCSAgICAgZG90MTFyYXRlKHJ0LCBzYW4tPmN1cnJlbnRfcml4 W3NpemVfYmluXSksCisJCSAgICAgZG90MTFyYXRlX2xhYmVsKHJ0LCBzYW4tPmN1cnJlbnRfcml4 W3NpemVfYmluXSkpOworCQlpZiAocml4ICE9IHNhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dKSB7 CisJCQlzYW4tPmN1cnJlbnRfc2FtcGxlX3JpeFtzaXplX2Jpbl0gPSByaXg7CisJCX0gZWxzZSB7 CisJCQlzYW4tPmN1cnJlbnRfc2FtcGxlX3JpeFtzaXplX2Jpbl0gPSAtMTsKKwkJfQorCQlzYW4t PnBhY2tldHNfc2luY2Vfc2FtcGxlW3NpemVfYmluXSA9IDA7CisJfSBlbHNlIHsKKwkJY2hhbmdl X3JhdGVzID0gMDsKKwkJaWYgKCFzYW4tPnBhY2tldHNfc2VudFtzaXplX2Jpbl0gfHwgYmVzdF9y aXggPT0gLTEpIHsKKwkJCS8qIG5vIHBhY2tldCBoYXMgYmVlbiBzZW50IHN1Y2Nlc3NmdWxseSB5 ZXQgKi8KKwkJCWNoYW5nZV9yYXRlcyA9IDE7CisJCQlpZiAobmktPm5pX2ZsYWdzICYgSUVFRTgw MjExX05PREVfSFQpCisJCQkJYmVzdF9yaXggPSBzYW1wbGVfcGlja19zZWVkX3JhdGVfaHQobmks IGZyYW1lTGVuKTsKKwkJCWVsc2UKKwkJCQliZXN0X3JpeCA9IHNhbXBsZV9waWNrX3NlZWRfcmF0 ZV9sZWdhY3kobmksIGZyYW1lTGVuKTsKKwkJfSBlbHNlIGlmIChzYW4tPnBhY2tldHNfc2VudFtz aXplX2Jpbl0gPCAyMCkgeworCQkJLyogbGV0IHRoZSBiaXQtcmF0ZSBzd2l0Y2ggcXVpY2tseSBk dXJpbmcgdGhlIGZpcnN0IGZldyBwYWNrZXRzICovCisJCQlJRUVFODAyMTFfTk9URSh2YXAsCisJ CQkgICAgSUVFRTgwMjExX01TR19SQVRFQ1RMLCAmbmksCisJCQkgICAgIiVzOiBzd2l0Y2hpbmcg cXVpY2tseS4uIiwgX19mdW5jX18pOworCQkJY2hhbmdlX3JhdGVzID0gMTsKKwkJfSBlbHNlIGlm ICh0aWNrcyAtIHNhbXBsZS0+c2FtcGxlX21pbl9zd2l0Y2ggPiBzYW4tPnRpY2tzX3NpbmNlX3N3 aXRjaFtzaXplX2Jpbl0pIHsKKwkJCS8qIG1pbl9zd2l0Y2ggc2Vjb25kcyBoYXZlIGdvbmUgYnkg Ki8KKwkJCUlFRUU4MDIxMV9OT1RFKHZhcCwKKwkJCSAgICBJRUVFODAyMTFfTVNHX1JBVEVDVEws ICZuaSwKKwkJCSAgICAiJXM6IG1pbl9zd2l0Y2ggJWQgPiB0aWNrc19zaW5jZV9zd2l0Y2ggJWQu LiIsCisJCQkgICAgX19mdW5jX18sIHRpY2tzIC0gc2FtcGxlLT5zYW1wbGVfbWluX3N3aXRjaCwg c2FuLT50aWNrc19zaW5jZV9zd2l0Y2hbc2l6ZV9iaW5dKTsKKwkJCWNoYW5nZV9yYXRlcyA9IDE7 CisJCX0gZWxzZSBpZiAoKCEgKG5pLT5uaV9mbGFncyAmIElFRUU4MDIxMV9OT0RFX0hUKSkgJiYK KwkJICAgICgyKmF2ZXJhZ2VfdHhfdGltZSA8IHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3Nhbi0+Y3Vy cmVudF9yaXhbc2l6ZV9iaW5dXS5hdmVyYWdlX3R4X3RpbWUpKSB7CisJCQkvKiB0aGUgY3VycmVu dCBiaXQtcmF0ZSBpcyB0d2ljZSBhcyBzbG93IGFzIHRoZSBiZXN0IG9uZSAqLworCQkJSUVFRTgw MjExX05PVEUodmFwLAorCQkJICAgIElFRUU4MDIxMV9NU0dfUkFURUNUTCwgJm5pLAorCQkJICAg ICIlczogMnggYXR0ICg9ICVkKSA8IGN1cl9yaXggYXR0ICVkIiwKKwkJCSAgICBfX2Z1bmNfXywK KwkJCSAgICAyICogYXZlcmFnZV90eF90aW1lLCBzYW4tPnN0YXRzW3NpemVfYmluXVtzYW4tPmN1 cnJlbnRfcml4W3NpemVfYmluXV0uYXZlcmFnZV90eF90aW1lKTsKKwkJCWNoYW5nZV9yYXRlcyA9 IDE7CisJCX0gZWxzZSBpZiAoKG5pLT5uaV9mbGFncyAmIElFRUU4MDIxMV9OT0RFX0hUKSkgewor CQkJaW50IGN1cl9yaXggPSBzYW4tPmN1cnJlbnRfcml4W3NpemVfYmluXTsKKwkJCWludCBjdXJf YXR0ID0gc2FuLT5zdGF0c1tzaXplX2Jpbl1bY3VyX3JpeF0uYXZlcmFnZV90eF90aW1lOworCQkJ LyoKKwkJCSAqIElmIHRoZSBub2RlIGlzIEhULCB1cGdyYWRlIGl0IGlmIHRoZSBNQ1MgcmF0ZSBp cworCQkJICogaGlnaGVyIGFuZCB0aGUgYXZlcmFnZSB0eCB0aW1lIGlzIHdpdGhpbiAyMCUgb2YK KwkJCSAqIHRoZSBjdXJyZW50IHJhdGUuIEl0IGNhbiBmYWlsIGEgbGl0dGxlLgorCQkJICoKKwkJ CSAqIFRoaXMgaXMgbGlrZWx5IG5vdCBvcHRpbWFsIQorCQkJICovCisjaWYgMAorCQkJcHJpbnRm KCJjdXIgcml4L2F0dCAleC8lZCwgYmVzdCByaXgvYXR0ICV4LyVkXG4iLAorCQkJICAgIE1DUyhj dXJfcml4KSwgY3VyX2F0dCwgTUNTKGJlc3Rfcml4KSwgYXZlcmFnZV90eF90aW1lKTsKKyNlbmRp ZgorCQkJaWYgKChNQ1MoYmVzdF9yaXgpID4gTUNTKGN1cl9yaXgpKSAmJgorCQkJICAgIChhdmVy YWdlX3R4X3RpbWUgKiA4KSA8PSAoY3VyX2F0dCAqIDEwKSkgeworCQkJCUlFRUU4MDIxMV9OT1RF KHZhcCwKKwkJCQkgICAgSUVFRTgwMjExX01TR19SQVRFQ1RMLCAmbmksCisJCQkJICAgICIlczog SFQ6IGJlc3Rfcml4IDB4JWQgPiBjdXJfcml4IDB4JXgsIGF2ZXJhZ2VfdHhfdGltZSAlZCwgY3Vy X2F0dCAlZCIsCisJCQkJICAgIF9fZnVuY19fLAorCQkJCSAgICBNQ1MoYmVzdF9yaXgpLCBNQ1Mo Y3VyX3JpeCksIGF2ZXJhZ2VfdHhfdGltZSwgY3VyX2F0dCk7CisJCQkJY2hhbmdlX3JhdGVzID0g MTsKKwkJCX0KKwkJfQorCisJCXNhbi0+cGFja2V0c19zaW5jZV9zYW1wbGVbc2l6ZV9iaW5dKys7 CisJCQorCQlpZiAoY2hhbmdlX3JhdGVzKSB7CisJCQlpZiAoYmVzdF9yaXggIT0gc2FuLT5jdXJy ZW50X3JpeFtzaXplX2Jpbl0pIHsKKwkJCQlJRUVFODAyMTFfTk9URSh2YXAsCisJCQkJICAgIElF RUU4MDIxMV9NU0dfUkFURUNUTCwKKwkJCQkgICAgJm5pLAorIiVzOiBzaXplICVkIHN3aXRjaCBy YXRlICVkICglZC8lZCkgLT4gJWQgKCVkLyVkKSBhZnRlciAlZCBwYWNrZXRzIG1yciAlZCIsCisJ CQkJICAgIF9fZnVuY19fLAorCQkJCSAgICBiaW5fdG9fc2l6ZShzaXplX2JpbiksCisJCQkJICAg IFJBVEUoc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl0pLAorCQkJCSAgICBzYW4tPnN0YXRzW3Np emVfYmluXVtzYW4tPmN1cnJlbnRfcml4W3NpemVfYmluXV0uYXZlcmFnZV90eF90aW1lLAorCQkJ CSAgICBzYW4tPnN0YXRzW3NpemVfYmluXVtzYW4tPmN1cnJlbnRfcml4W3NpemVfYmluXV0ucGVy ZmVjdF90eF90aW1lLAorCQkJCSAgICBSQVRFKGJlc3Rfcml4KSwKKwkJCQkgICAgc2FuLT5zdGF0 c1tzaXplX2Jpbl1bYmVzdF9yaXhdLmF2ZXJhZ2VfdHhfdGltZSwKKwkJCQkgICAgc2FuLT5zdGF0 c1tzaXplX2Jpbl1bYmVzdF9yaXhdLnBlcmZlY3RfdHhfdGltZSwKKwkJCQkgICAgc2FuLT5wYWNr ZXRzX3NpbmNlX3N3aXRjaFtzaXplX2Jpbl0sCisJCQkJICAgIG1ycik7CisJCQl9CisJCQlzYW4t PnBhY2tldHNfc2luY2Vfc3dpdGNoW3NpemVfYmluXSA9IDA7CisJCQlzYW4tPmN1cnJlbnRfcml4 W3NpemVfYmluXSA9IGJlc3Rfcml4OworCQkJc2FuLT50aWNrc19zaW5jZV9zd2l0Y2hbc2l6ZV9i aW5dID0gdGlja3M7CisJCQkvKiAKKwkJCSAqIFNldCB0aGUgdmlzaWJsZSB0eHJhdGUgZm9yIHRo aXMgbm9kZS4KKwkJCSAqLworCQkJbmktPm5pX3R4cmF0ZSA9IGRvdDExcmF0ZShydCwgYmVzdF9y aXgpOworCQl9CisJCXJpeCA9IHNhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dOworCQlzYW4tPnBh Y2tldHNfc2luY2Vfc3dpdGNoW3NpemVfYmluXSsrOworCX0KKwkvLyAqdHJ5MCA9IG1yciA/IHNh bi0+c2NoZWRbcml4XS50MCA6IEFUSF9UWE1BWFRSWTsKK2RvbmU6CisKKwkvKgorCSAqIFRoaXMg YnVnIHRvdGFsbHkgc3Vja3MgYW5kIHNob3VsZCBiZSBmaXhlZC4KKwkgKgorCSAqIEZvciBub3cg dGhvdWdoLCBsZXQncyBub3QgcGFuaWMsIHNvIHdlIGNhbiBzdGFydCB0byBmaWd1cmUKKwkgKiBv dXQgaG93IHRvIGJldHRlciByZXByb2R1Y2UgaXQuCisJICovCisJaWYgKHJpeCA8IDAgfHwgcml4 ID49IHJ0LT5yYXRlQ291bnQpIHsKKwkJcHJpbnRmKCIlczogRVJST1I6IHJpeCAlZCBvdXQgb2Yg Ym91bmRzIChyYXRlQ291bnQ9JWQpXG4iLAorCQkgICAgX19mdW5jX18sCisJCSAgICByaXgsCisJ CSAgICBydC0+cmF0ZUNvdW50KTsKKwkJICAgIHJpeCA9IDA7CS8qIFhYWCBqdXN0IGRlZmF1bHQg Zm9yIG5vdyAqLworCX0KKwlLQVNTRVJUKHJpeCA+PSAwICYmIHJpeCA8IHJ0LT5yYXRlQ291bnQs ICgicml4IGlzICVkIiwgcml4KSk7CisKKwkvLyAqcml4MCA9IHJpeDsKKwkvLyAqdHhyYXRlID0g cnQtPmluZm9bcml4XS5yYXRlQ29kZQorCS8vIAl8IChzaG9ydFByZWFtYmxlID8gcnQtPmluZm9b cml4XS5zaG9ydFByZWFtYmxlIDogMCk7CisJc2FuLT5wYWNrZXRzX3NlbnRbc2l6ZV9iaW5dKys7 CisKKwlyZXR1cm4gcml4OworI3VuZGVmIERPVDExUkFURQorI3VuZGVmIE1DUworI3VuZGVmIFJB VEUKK30KKworc3RhdGljIHZvaWQKK3NhbXBsZV90eF9jb21wbGV0ZShjb25zdCBzdHJ1Y3QgaWVl ZTgwMjExdmFwICp2YXAsCisgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgaW50 IG9rLAorICAgIHZvaWQgKmFyZzEsIHZvaWQgKmFyZzIgX191bnVzZWQpCit7Cit9CisKK3N0YXRp YyB2b2lkCitzYW1wbGVfdHhfdXBkYXRlKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCwg Y29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwKKyAgICB2b2lkICphcmcxLCB2b2lkICph cmcyLCB2b2lkICphcmczKQoreworfQorCitzdGF0aWMgdm9pZAorc2FtcGxlX3NldGludGVydmFs KGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCwgaW50IG1zZWNzKQoreworCXN0cnVjdCBp ZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSB2YXAtPml2X3JzOworCWludCB0OworCisJaWYgKG1z ZWNzIDwgMTAwKQorCQltc2VjcyA9IDEwMDsKKwl0ID0gbXNlY3NfdG9fdGlja3MobXNlY3MpOwor CS8qIGllZWU4MDIxMV9zYW1wbGUgZG9lc24ndCBoYXZlIHRoZSBzYW1wbGVfaW50ZXJ2YWwgZmll bGQgYnkgbm93ICovCisJLy8gc2FtcGxlLT5zYW1wbGVfaW50ZXJ2YWwgPSAodCA8IDEpID8gMSA6 IHQ7Cit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfc3RhdHModm9pZCAqYXJnLCBzdHJ1Y3QgaWVl ZTgwMjExX25vZGUgKm5pKQoreworCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IG5pLT5uaV92 YXA7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxzOwor CWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQgPSBpZWVlODAyMTFfZ2V0X3Jh dGV0YWJsZSh2YXAtPml2X2ljLT5pY19jdXJjaGFuKTsKKwl1aW50NjRfdCBtYXNrOworCWludCBy aXgsIHk7CisKKwlwcmludGYoIlxuWyVzXSByZWZjbnQgJWQgc3RhdGljX3JpeCAoJWQgJXMpIHJh dGVtYXNrIDB4JWp4XG4iLAorCSAgICBldGhlcl9zcHJpbnRmKG5pLT5uaV9tYWNhZGRyKSwgaWVl ZTgwMjExX25vZGVfcmVmY250KG5pKSwKKwkgICAgZG90MTFyYXRlKHJ0LCBzYW4tPnN0YXRpY19y aXgpLAorCSAgICBkb3QxMXJhdGVfbGFiZWwocnQsIHNhbi0+c3RhdGljX3JpeCksCisJICAgICh1 aW50bWF4X3Qpc2FuLT5yYXRlbWFzayk7CisJZm9yICh5ID0gMDsgeSA8IE5VTV9QQUNLRVRfU0la RV9CSU5TOyB5KyspIHsKKwkJcHJpbnRmKCJbJTR1XSBjdXIgcml4ICVkICglZCAlcykgc2luY2Ug c3dpdGNoOiBwYWNrZXRzICVkIHRpY2tzICV1XG4iLAorCQkgICAgYmluX3RvX3NpemUoeSksIHNh bi0+Y3VycmVudF9yaXhbeV0sCisJCSAgICBkb3QxMXJhdGUocnQsIHNhbi0+Y3VycmVudF9yaXhb eV0pLAorCQkgICAgZG90MTFyYXRlX2xhYmVsKHJ0LCBzYW4tPmN1cnJlbnRfcml4W3ldKSwKKwkJ ICAgIHNhbi0+cGFja2V0c19zaW5jZV9zd2l0Y2hbeV0sIHNhbi0+dGlja3Nfc2luY2Vfc3dpdGNo W3ldKTsKKwkJcHJpbnRmKCJbJTR1XSBsYXN0IHNhbXBsZSAoJWQgJXMpIGN1ciBzYW1wbGUgKCVk ICVzKSBwYWNrZXRzIHNlbnQgJWRcbiIsCisJCSAgICBiaW5fdG9fc2l6ZSh5KSwKKwkJICAgIGRv dDExcmF0ZShydCwgc2FuLT5sYXN0X3NhbXBsZV9yaXhbeV0pLAorCQkgICAgZG90MTFyYXRlX2xh YmVsKHJ0LCBzYW4tPmxhc3Rfc2FtcGxlX3JpeFt5XSksCisJCSAgICBkb3QxMXJhdGUocnQsIHNh bi0+Y3VycmVudF9zYW1wbGVfcml4W3ldKSwKKwkJICAgIGRvdDExcmF0ZV9sYWJlbChydCwgc2Fu LT5jdXJyZW50X3NhbXBsZV9yaXhbeV0pLAorCQkgICAgc2FuLT5wYWNrZXRzX3NlbnRbeV0pOwor CQlwcmludGYoIlslNHVdIHBhY2tldHMgc2luY2Ugc2FtcGxlICVkIHNhbXBsZSB0dCAldVxuIiwK KwkJICAgIGJpbl90b19zaXplKHkpLCBzYW4tPnBhY2tldHNfc2luY2Vfc2FtcGxlW3ldLAorCQkg ICAgc2FuLT5zYW1wbGVfdHRbeV0pOworCX0KKwlmb3IgKG1hc2sgPSBzYW4tPnJhdGVtYXNrLCBy aXggPSAwOyBtYXNrICE9IDA7IG1hc2sgPj49IDEsIHJpeCsrKSB7CisJCWlmICgobWFzayAmIDEp ID09IDApCisJCQkJY29udGludWU7CisJCWZvciAoeSA9IDA7IHkgPCBOVU1fUEFDS0VUX1NJWkVf QklOUzsgeSsrKSB7CisJCQlpZiAoc2FuLT5zdGF0c1t5XVtyaXhdLnRvdGFsX3BhY2tldHMgPT0g MCkKKwkJCQljb250aW51ZTsKKwkJCXByaW50ZigiWyUydSAlczolNHVdICU4anU6JS04anUgKCUz ZCUlKSAoRVdNQSAlM2QuJTFkJSUpIFQgJThqdSBGICU0ZCBhdmcgJTV1IGxhc3QgJXVcbiIsCisJ CQkgICAgZG90MTFyYXRlKHJ0LCByaXgpLCBkb3QxMXJhdGVfbGFiZWwocnQsIHJpeCksCisJCQkg ICAgYmluX3RvX3NpemUoeSksCisJCQkgICAgKHVpbnRtYXhfdCkgc2FuLT5zdGF0c1t5XVtyaXhd LnRvdGFsX3BhY2tldHMsCisJCQkgICAgKHVpbnRtYXhfdCkgc2FuLT5zdGF0c1t5XVtyaXhdLnBh Y2tldHNfYWNrZWQsCisJCQkgICAgKGludCkgKChzYW4tPnN0YXRzW3ldW3JpeF0ucGFja2V0c19h Y2tlZCAqIDEwMFVMTCkgLworCQkJICAgICBzYW4tPnN0YXRzW3ldW3JpeF0udG90YWxfcGFja2V0 cyksCisJCQkgICAgc2FuLT5zdGF0c1t5XVtyaXhdLmV3bWFfcGN0IC8gMTAsCisJCQkgICAgc2Fu LT5zdGF0c1t5XVtyaXhdLmV3bWFfcGN0ICUgMTAsCisJCQkgICAgKHVpbnRtYXhfdCkgc2FuLT5z dGF0c1t5XVtyaXhdLnRyaWVzLAorCQkJICAgIHNhbi0+c3RhdHNbeV1bcml4XS5zdWNjZXNzaXZl X2ZhaWx1cmVzLAorCQkJICAgIHNhbi0+c3RhdHNbeV1bcml4XS5hdmVyYWdlX3R4X3RpbWUsCisJ CQkgICAgdGlja3MgLSBzYW4tPnN0YXRzW3ldW3JpeF0ubGFzdF90eCk7CisJCX0KKwl9Cit9CisK K3N0YXRpYyBpbnQKK3NhbXBsZV9zeXNjdGxfc3RhdHMoU1lTQ1RMX0hBTkRMRVJfQVJHUykKK3sK KwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBhcmcxOworCXN0cnVjdCBpZWVlODAyMTFjb20g KmljID0gdmFwLT5pdl9pZnAtPmlmX2wyY29tOworCWludCBlcnJvciwgdjsKKworCXYgPSAwOwor CWVycm9yID0gc3lzY3RsX2hhbmRsZV9pbnQob2lkcCwgJnYsIDAsIHJlcSk7CisJaWYgKGVycm9y IHx8ICFyZXEtPm5ld3B0cikKKwkJcmV0dXJuIGVycm9yOworCWllZWU4MDIxMV9pdGVyYXRlX25v ZGVzKCZpYy0+aWNfc3RhLCBzYW1wbGVfc3RhdHMsIE5VTEwpOworCXJldHVybiAwOworfQorCitz dGF0aWMgaW50CitzYW1wbGVfc3lzY3RsX3Ntb290aGluZ19yYXRlKFNZU0NUTF9IQU5ETEVSX0FS R1MpCit7CisJc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gYXJnMTsKKwlzdHJ1Y3QgaWVlZTgw MjExX3NhbXBsZSAqc2FtcGxlID0gdmFwLT5pdl9yczsKKwlpbnQgcmF0ZSwgZXJyb3I7CisKKwly YXRlID0gc2FtcGxlLT5zYW1wbGVfc21vb3RoaW5nX3JhdGU7CisJZXJyb3IgPSBzeXNjdGxfaGFu ZGxlX2ludChvaWRwLCAmcmF0ZSwgMCwgcmVxKTsKKwlpZiAoZXJyb3IgfHwgIXJlcS0+bmV3cHRy KQorCQlyZXR1cm4gZXJyb3I7CisJaWYgKCEoMCA8PSByYXRlICYmIHJhdGUgPCAxMDApKQorCQly ZXR1cm4gRUlOVkFMOworCXNhbXBsZS0+c2FtcGxlX3Ntb290aGluZ19yYXRlID0gcmF0ZTsKKwlz YW1wbGUtPnNhbXBsZV9zbW9vdGhpbmdfbWlucGFja2V0cyA9IDEwMCAvICgxMDAgLSByYXRlKTsK KwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2FtcGxlX3N5c2N0bF9zYW1wbGVfcmF0ZShT WVNDVExfSEFORExFUl9BUkdTKQoreworCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IGFyZzE7 CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGUgKnNhbXBsZSA9IHZhcC0+aXZfcnM7CisJaW50IHJh dGUsIGVycm9yOworCisJcmF0ZSA9IHNhbXBsZS0+c2FtcGxlX3JhdGU7CisJZXJyb3IgPSBzeXNj dGxfaGFuZGxlX2ludChvaWRwLCAmcmF0ZSwgMCwgcmVxKTsKKwlpZiAoZXJyb3IgfHwgIXJlcS0+ bmV3cHRyKQorCQlyZXR1cm4gZXJyb3I7CisJaWYgKCEoMiA8PSByYXRlICYmIHJhdGUgPD0gMTAw KSkKKwkJcmV0dXJuIEVJTlZBTDsKKwlzYW1wbGUtPnNhbXBsZV9yYXRlID0gcmF0ZTsKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3NhbXBsZV9zeXNjdGxhdHRhY2goc3RydWN0IGllZWU4 MDIxMXZhcCAqdmFwLAorICAgIHN0cnVjdCBzeXNjdGxfY3R4X2xpc3QgKmN0eCwgc3RydWN0IHN5 c2N0bF9vaWQgKnRyZWUpCit7CisJU1lTQ1RMX0FERF9QUk9DKGN0eCwgU1lTQ1RMX0NISUxEUkVO KHRyZWUpLCBPSURfQVVUTywKKwkgICAgInNhbXBsZV9zbW9vdGhpbmdfcmF0ZSIsIENUTFRZUEVf SU5UIHwgQ1RMRkxBR19SVywgdmFwLCAwLAorCSAgICBzYW1wbGVfc3lzY3RsX3Ntb290aGluZ19y YXRlLCAiSSIsCisJICAgICJzYW1wbGU6IHNtb290aGluZyByYXRlIGZvciBhdmcgdHggdGltZSAo JSUpIik7CisJU1lTQ1RMX0FERF9QUk9DKGN0eCwgU1lTQ1RMX0NISUxEUkVOKHRyZWUpLCBPSURf QVVUTywKKwkgICAgInNhbXBsZV9yYXRlIiwgQ1RMVFlQRV9JTlQgfCBDVExGTEFHX1JXLCB2YXAs IDAsCisJICAgIHNhbXBsZV9zeXNjdGxfc2FtcGxlX3JhdGUsICJJIiwKKwkgICAgInNhbXBsZTog cGVyY2VudCBhaXIgdGltZSBkZXZvdGVkIHRvIHNhbXBsaW5nIG5ldyByYXRlcyAoJSUpIik7CisJ LyogWFhYIG1heF9zdWNjZXNzaXZlX2ZhaWx1cmVzLCBzdGFsZV9mYWlsdXJlX3RpbWVvdXQsIG1p bl9zd2l0Y2ggKi8KKwlTWVNDVExfQUREX1BST0MoY3R4LCBTWVNDVExfQ0hJTERSRU4odHJlZSks IE9JRF9BVVRPLAorCSAgICAic2FtcGxlX3N0YXRzIiwgQ1RMVFlQRV9JTlQgfCBDVExGTEFHX1JX LCB2YXAsIDAsCisJICAgIHNhbXBsZV9zeXNjdGxfc3RhdHMsICJJIiwgInNhbXBsZTogcHJpbnQg c3RhdGlzdGljcyIpOworfQpJbmRleDogaWVlZTgwMjExX3JjX3NhbXBsZS5oCj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K LS0tIGllZWU4MDIxMV9yY19zYW1wbGUuaAkocmV2aXNpb24gMCkKKysrIGllZWU4MDIxMV9yY19z YW1wbGUuaAkocmV2aXNpb24gMjU1NTM5KQpAQCAtMCwwICsxLDE1MiBAQAorLyogJEZyZWVCU0Q6 IGhlYWQvc3lzL2Rldi9hdGgvYXRoX3JhdGUvc2FtcGxlL3NhbXBsZS5oIDI0MDM4MiAyMDEyLTA4 LTE1IDA3OjEwOjEwWiBhZHJpYW4gJCovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDEzIENo ZW5jaG9uZyBRaW4gPGNjcWluQEZyZWVCU0Qub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4K KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0 CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n IGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJp YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xh aW1lcgorICogICAgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93 ICgiRGlzY2xhaW1lciIpIGFuZCBhbnkKKyAqICAgIHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29u ZGl0aW9uZWQgdXBvbiBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5CisgKiAgICBzaW1pbGFyIERp c2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgor ICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9s ZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMg c29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgor ICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2 ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9u LgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRI RSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiBgYEFTIElTJycgQU5EIEFO WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM SU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTklORlJJTkdFTUVOVCwgTUVS Q0hBTlRJQklMSVRZCisgKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMg T1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLAorICogT1Ig Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP Q1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVS IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIENP TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP UiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD SCBEQU1BR0VTLgorICovCisKKyNpZm5kZWYgX05FVDgwMjExX0lFRUU4MDIxMV9SQVRFQ1RMX1NB TVBMRV9IXworI2RlZmluZSBfTkVUODAyMTFfSUVFRTgwMjExX1JBVEVDVExfU0FNUExFX0hfCisK Ky8qCisgKiBmb3Igbm93LCB3ZSB0cmFjayBwZXJmb3JtYW5jZSBmb3IgdGhyZWUgZGlmZmVyZW50 IHBhY2tldAorICogc2l6ZSBidWNrZXRzCisgKi8KKyNkZWZpbmUgTlVNX1BBQ0tFVF9TSVpFX0JJ TlMgMgorI2RlZmluZQlTQU1QTEVfTUFYUkFURVMJNjQJCS8qIE5COiBjb3JyZXNwb25kcyB0byBo YWwgaW5mb1szMl0gKi8KKworLyoKKyAqIFJhdGUgY29udHJvbCBzZXR0aW5ncy4KKyAqLworc3Ry dWN0IGllZWU4MDIxMV9zYW1wbGUgeworCWludAlzYW1wbGVfc21vb3RoaW5nX3JhdGU7CQkJLyog ZXdtYSBwZXJjZW50YWdlIFswLi45OV0gKi8KKwlpbnQJc2FtcGxlX3Ntb290aGluZ19taW5wYWNr ZXRzOworCWludAlzYW1wbGVfcmF0ZTsJCQkvKiAldGltZSB0byB0cnkgZGlmZmVyZW50IHR4IHJh dGVzICovCisJaW50CXNhbXBsZV9tYXhfc3VjY2Vzc2l2ZV9mYWlsdXJlczsKKwlpbnQJc2FtcGxl X3N0YWxlX2ZhaWx1cmVfdGltZW91dDsJLyogaG93IGxvbmcgdG8gaG9ub3IgbWF4X3N1Y2Nlc3Np dmVfZmFpbHVyZXMgKi8KKwlpbnQJc2FtcGxlX21pbl9zd2l0Y2g7CQkvKiBtaW4gdGltZSBiZXR3 ZWVuIHJhdGUgY2hhbmdlcyAqLworCWludAlzYW1wbGVfbWluX2dvb2RfcGN0OwkvKiBtaW4gZ29v ZCBwZXJjZW50YWdlIGZvciBhIHJhdGUgdG8gYmUgY29uc2lkZXJlZCAqLworfTsKKworc3RydWN0 IHJhdGVfc3RhdHMgewkKKwl1bnNpZ25lZCBhdmVyYWdlX3R4X3RpbWU7CisJaW50IHN1Y2Nlc3Np dmVfZmFpbHVyZXM7CisJdWludDY0X3QgdHJpZXM7CisJdWludDY0X3QgdG90YWxfcGFja2V0czsJ LyogcGt0cyB0b3RhbCBzaW5jZSBhc3NvYyAqLworCXVpbnQ2NF90IHBhY2tldHNfYWNrZWQ7CS8q IHBrdHMgYWNrZWQgc2luY2UgYXNzb2MgKi8KKwlpbnQgZXdtYV9wY3Q7CS8qIEVXTUEgcGVyY2Vu dGFnZSAqLworCXVuc2lnbmVkIHBlcmZlY3RfdHhfdGltZTsgLyogdHJhbnNtaXQgdGltZSBmb3Ig MCByZXRyaWVzICovCisJaW50IGxhc3RfdHg7Cit9OworCitzdHJ1Y3QgdHhzY2hlZHVsZSB7CisJ dWludDhfdAl0MCwgcjA7CQkvKiBzZXJpZXMgMDogdHJpZXMsIHJhdGUgY29kZSAqLworCXVpbnQ4 X3QJdDEsIHIxOwkJLyogc2VyaWVzIDE6IHRyaWVzLCByYXRlIGNvZGUgKi8KKwl1aW50OF90CXQy LCByMjsJCS8qIHNlcmllcyAyOiB0cmllcywgcmF0ZSBjb2RlICovCisJdWludDhfdAl0MywgcjM7 CQkvKiBzZXJpZXMgMzogdHJpZXMsIHJhdGUgY29kZSAqLworfTsKKworLyoKKyAqIFJhdGUgY29u dHJvbCBzdGF0ZSBmb3IgYSBnaXZlbiBub2RlLgorICovCisvKiBYWFggY2hhbmdlIG5hbWluZyBj b252ZXJzaW9uPyAqLworc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSB7CisJc3RydWN0IGll ZWU4MDIxMV9zYW1wbGUgKnNhbl9zYW1wbGU7LyogYmFja3BvaW50ZXIgKi8KKwlpbnQgc3RhdGlj X3JpeDsJCQkvKiByYXRlIGluZGV4IG9mIGZpeGVkIHR4IHJhdGUgKi8KKwl1aW50NjRfdCByYXRl bWFzazsJCS8qIGJpdCBtYXNrIG9mIHZhbGlkIHJhdGUgaW5kaWNlcyAqLworCWNvbnN0IHN0cnVj dCB0eHNjaGVkdWxlICpzY2hlZDsJLyogdHggc2NoZWR1bGUgdGFibGUgKi8KKworCXN0cnVjdCBy YXRlX3N0YXRzIHN0YXRzW05VTV9QQUNLRVRfU0laRV9CSU5TXVtTQU1QTEVfTUFYUkFURVNdOwor CWludCBsYXN0X3NhbXBsZV9yaXhbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdOworCisJaW50IGN1cnJl bnRfc2FtcGxlX3JpeFtOVU1fUEFDS0VUX1NJWkVfQklOU107ICAgICAgIAorCWludCBwYWNrZXRz X3NlbnRbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdOworCisJaW50IGN1cnJlbnRfcml4W05VTV9QQUNL RVRfU0laRV9CSU5TXTsKKwlpbnQgcGFja2V0c19zaW5jZV9zd2l0Y2hbTlVNX1BBQ0tFVF9TSVpF X0JJTlNdOworCXVuc2lnbmVkIHRpY2tzX3NpbmNlX3N3aXRjaFtOVU1fUEFDS0VUX1NJWkVfQklO U107CisKKwlpbnQgcGFja2V0c19zaW5jZV9zYW1wbGVbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdOwor CXVuc2lnbmVkIHNhbXBsZV90dFtOVU1fUEFDS0VUX1NJWkVfQklOU107Cit9OworCisjZGVmaW5l CUlTX1JBVEVfREVGSU5FRChzYW4sIHJpeCkJKCgoc2FuKS0+cmF0ZW1hc2sgJiAoMTw8KHJpeCkp KSAhPSAwKQorCisjaWZuZGVmIE1JTgorI2RlZmluZQlNSU4oYSxiKQkoKGEpIDwgKGIpID8gKGEp IDogKGIpKQorI2VuZGlmCisjaWZuZGVmIE1BWAorI2RlZmluZQlNQVgoYSxiKQkoKGEpID4gKGIp ID8gKGEpIDogKGIpKQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBpbnQgcGFja2V0X3NpemVfYmlu c1tOVU1fUEFDS0VUX1NJWkVfQklOU10gID0geyAyNTAsIDE2MDAgfTsKKworc3RhdGljIGlubGlu ZSBpbnQKK2Jpbl90b19zaXplKGludCBpbmRleCkKK3sKKwlyZXR1cm4gcGFja2V0X3NpemVfYmlu c1tpbmRleF07Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitzaXplX3RvX2JpbihpbnQgc2l6ZSkg Cit7CisjaWYgTlVNX1BBQ0tFVF9TSVpFX0JJTlMgPiAxCisJaWYgKHNpemUgPD0gcGFja2V0X3Np emVfYmluc1swXSkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKyNpZiBOVU1fUEFDS0VUX1NJWkVfQklO UyA+IDIKKwlpZiAoc2l6ZSA8PSBwYWNrZXRfc2l6ZV9iaW5zWzFdKQorCQlyZXR1cm4gMTsKKyNl bmRpZgorI2lmIE5VTV9QQUNLRVRfU0laRV9CSU5TID4gMworCWlmIChzaXplIDw9IHBhY2tldF9z aXplX2JpbnNbMl0pCisJCXJldHVybiAyOworI2VuZGlmCisjaWYgTlVNX1BBQ0tFVF9TSVpFX0JJ TlMgPiA0CisjZXJyb3IgImFkZCBzdXBwb3J0IGZvciBtb3JlIHBhY2tldCBzaXplcyIKKyNlbmRp ZgorCXJldHVybiBOVU1fUEFDS0VUX1NJWkVfQklOUy0xOworfQorCisvKgorICogQ2FsY3VsYXRl IHRoZSB0cmFuc21pdCBkdXJhdGlvbiBvZiBhIGZyYW1lLgorICovCitzdGF0aWMgdW5zaWduZWQg Y2FsY191c2Vjc191bmljYXN0X3BhY2tldChpbnQgbGVuZ3RoLAorCQkJCWludCByaXgsIGludCBz aG9ydF9yZXRyaWVzLAorCQkJCWludCBsb25nX3JldHJpZXMsIGludCBpc19odDQwKQoreworCS8q IFhYWCBub3QgZG9uZSB5ZXQgKi8KK30KKworI2VuZGlmIC8qIF9ORVQ4MDIxMV9JRUVFODAyMTFf UkFURUNUTF9TQU1QTEVfSF8gKi8KSW5kZXg6IGllZWU4MDIxMV9yY19zYW1wbGVfdHhzY2hlZC5o Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KLS0tIGllZWU4MDIxMV9yY19zYW1wbGVfdHhzY2hlZC5oCShyZXZpc2lvbiAw KQorKysgaWVlZTgwMjExX3JjX3NhbXBsZV90eHNjaGVkLmgJKHJldmlzaW9uIDI1NTUzOSkKQEAg LTAsMCArMSwyNDEgQEAKKy8qICRGcmVlQlNEOiBoZWFkL3N5cy9kZXYvYXRoL2F0aF9yYXRlL3Nh bXBsZS90eF9zY2hlZHVsZXMuaCAyNDAzODQgMjAxMi0wOC0xNSAwNzo1MDo0MlogYWRyaWFuICQq LworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNSBKb2huIEJpY2tldAorICogQ29weXJpZ2h0 IChjKSAyMDEzIENoZW5jaG9uZyBRaW4gPGNjcWluQEZyZWVCU0Qub3JnPgorICogQWxsIHJpZ2h0 cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0 aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAq IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5p bXVtIGEgZGlzY2xhaW1lcgorICogICAgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNj bGFpbWVyIGJlbG93ICgiRGlzY2xhaW1lciIpIGFuZCBhbnkKKyAqICAgIHJlZGlzdHJpYnV0aW9u IG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbiBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5CisgKiAg ICBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIgYmluYXJ5IHJlZGlz dHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBj b3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3Jz IG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAg ICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1p c3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJp YnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2Fy ZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBS T1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiBgYEFT IElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC VVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTklORlJJ TkdFTUVOVCwgTUVSQ0hBTlRJQklMSVRZCisgKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJ R0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBM QVJZLAorICogT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7 IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBU SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI RVIKKyAqIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcg TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lC SUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICoKKyAqLworI2lmbmRlZglfX0FUSF9SQVRFX1NBTVBM RV9UWFNDSEVEVUxFU19IX18KKyNkZWZpbmUJX19BVEhfUkFURV9TQU1QTEVfVFhTQ0hFRFVMRVNf SF9fCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKworI2RlZmluZSBBKF9yKSBcCisgICAgKCgo X3IpID09IDYpICAgPyAwIDogKCgoX3IpID09IDkpICAgPyAxIDogKCgoX3IpID09IDEyKSAgPyAy IDogXAorICAgICgoKF9yKSA9PSAxOCkgID8gMyA6ICgoKF9yKSA9PSAyNCkgID8gNCA6ICgoKF9y KSA9PSAzNikgID8gNSA6IFwKKyAgICAoKChfcikgPT0gNDgpICA/IDYgOiAoKChfcikgPT0gNTQp ICA/IDcgOiAwKSkpKSkpKSkKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHhzY2hlZHVsZSBzZXJpZXNf MTFhW10gPSB7CisJeyAzLEEoIDYpLCAzLEEoICA2KSwgMCxBKCAgNiksIDAsQSggNikgfSwJLyog ICA2TWIvcyAqLworCXsgNCxBKCA5KSwgMyxBKCAgNiksIDQsQSggIDYpLCAwLEEoIDYpIH0sCS8q ICAgOU1iL3MgKi8KKwl7IDQsQSgxMiksIDMsQSggIDYpLCA0LEEoICA2KSwgMCxBKCA2KSB9LAkv KiAgMTJNYi9zICovCisJeyA0LEEoMTgpLCAzLEEoIDEyKSwgNCxBKCAgNiksIDIsQSggNikgfSwJ LyogIDE4TWIvcyAqLworCXsgNCxBKDI0KSwgMyxBKCAxOCksIDQsQSggMTIpLCAyLEEoIDYpIH0s CS8qICAyNE1iL3MgKi8KKwl7IDQsQSgzNiksIDMsQSggMjQpLCA0LEEoIDE4KSwgMixBKCA2KSB9 LAkvKiAgMzZNYi9zICovCisJeyA0LEEoNDgpLCAzLEEoIDM2KSwgNCxBKCAyNCksIDIsQSgxMikg fSwJLyogIDQ4TWIvcyAqLworCXsgNCxBKDU0KSwgMyxBKCA0OCksIDQsQSggMzYpLCAyLEEoMjQp IH0JLyogIDU0TWIvcyAqLworfTsKKworI2RlZmluZSBOQTEoX3IpIFwKKwkoKChfcikgPT0gNi41 KSAgPyA4IDogKCgoX3IpID09IDEzKSAgPyAgOSA6ICgoKF9yKSA9PSAxOS41KT8gMTAgOiBcCisJ KCgoX3IpID09IDI2KSAgPyAxMSA6ICgoKF9yKSA9PSAzOSkgID8gMTIgOiAoKChfcikgPT0gNTIp ICA/IDEzIDogXAorCSgoKF9yKSA9PSA1OC41KT8gMTQgOiAoKChfcikgPT0gNjUpICA/IDE1IDog MCkpKSkpKSkpCisjZGVmaW5lIE5BMihfcikgXAorCSgoKF9yKSA9PSAxMykgPyAxNiA6ICgoKF9y KSA9PSAyNikgPyAxNyA6ICgoKF9yKSA9PSAzOSkgPyAxOCA6IFwKKwkoKChfcikgPT0gNTIpID8g MTkgOiAoKChfcikgPT0gNzgpID8gMjAgOiAoKChfcikgPT0gMTA0KT8gMjEgOiBcCisJKCgoX3Ip ID09IDExNyk/IDIyIDogKCgoX3IpID09IDEzMCk/IDIzIDogMCkpKSkpKSkpCisjZGVmaW5lIE5B MyhfcikgXAorCSgoKF9yKSA9PSAxOS41KSAgPyAyNCA6ICgoKF9yKSA9PSAzOSkgPyAyNSA6ICgo KF9yKSA9PSA1OC41KSAgPyAyNiA6IFwKKwkoKChfcikgPT0gNzgpICA/IDI3IDogKCgoX3IpID09 IDExNykgPyAyOCA6ICgoKF9yKSA9PSAxNTYpID8gMjkgOiBcCisJKCgoX3IpID09IDE3NS41KSA/ IDMwIDogKCgoX3IpID09IDE5NSk/IDMxIDogMCkpKSkpKSkpCitzdGF0aWMgY29uc3Qgc3RydWN0 IHR4c2NoZWR1bGUgc2VyaWVzXzExbmFbXSA9IHsKKwl7IDMsQSggNiksIDMsQSggIDYpLCAwLEEo ICA2KSwgMCxBKCA2KSB9LCAgICAgICAvKiAgIDZNYi9zICovCisJeyA0LEEoIDkpLCAzLEEoICA2 KSwgNCxBKCAgNiksIDAsQSggNikgfSwgICAgICAgLyogICA5TWIvcyAqLworCXsgNCxBKDEyKSwg MyxBKCAgNiksIDQsQSggIDYpLCAwLEEoIDYpIH0sICAgICAgIC8qICAxMk1iL3MgKi8KKwl7IDQs QSgxOCksIDMsQSggMTIpLCA0LEEoICA2KSwgMixBKCA2KSB9LCAgICAgICAvKiAgMThNYi9zICov CisJeyA0LEEoMjQpLCAzLEEoIDE4KSwgNCxBKCAxMiksIDIsQSggNikgfSwgICAgICAgLyogIDI0 TWIvcyAqLworCXsgNCxBKDM2KSwgMyxBKCAyNCksIDQsQSggMTgpLCAyLEEoIDYpIH0sICAgICAg IC8qICAzNk1iL3MgKi8KKwl7IDQsQSg0OCksIDMsQSggMzYpLCA0LEEoIDI0KSwgMixBKDEyKSB9 LCAgICAgICAvKiAgNDhNYi9zICovCisJeyA0LEEoNTQpLCAzLEEoIDQ4KSwgNCxBKCAzNiksIDIs QSgyNCkgfSwgICAgICAgLyogIDU0TWIvcyAqLworCisJLyogMSBzdHJlYW0gcmF0ZXMgKi8KKwor CXsgMyxOQTEoIDYuNSksIDMsTkExKCA2LjUpLCAwLE5BMSggNi41KSwgMCxOQTEoNi41KSB9LCAg LyogNi41TWIvcyAqLworCXsgNCxOQTEoICAxMyksIDMsTkExKCA2LjUpLCA0LE5BMSggNi41KSwg MCxOQTEoNi41KSB9LCAgLyogIDEzTWIvcyAqLworCXsgNCxOQTEoMTkuNSksIDMsTkExKCA2LjUp LCA0LE5BMSggNi41KSwgMCxOQTEoNi41KSB9LCAgLyoxOS41TWIvcyAqLworCXsgNCxOQTEoICAy NiksIDMsTkExKDE5LjUpLCA0LE5BMSggNi41KSwgMixOQTEoNi41KSB9LCAgLyogIDI2TWIvcyAq LworCXsgNCxOQTEoICAzOSksIDMsTkExKCAgMjYpLCA0LE5BMSgxOS41KSwgMixOQTEoNi41KSB9 LCAgLyogIDM5TWIvcyAqLworCXsgNCxOQTEoICA1MiksIDMsTkExKCAgMzkpLCA0LE5BMSggIDI2 KSwgMixOQTEoNi41KSB9LCAgLyogIDUyTWIvcyAqLworCXsgNCxOQTEoNTguNSksIDMsTkExKCAg NTIpLCA0LE5BMSggIDM5KSwgMixOQTEoIDEzKSB9LCAgLyo1OC41TWIvcyAqLworCXsgNCxOQTEo ICA2NSksIDMsTkExKDU4LjUpLCA0LE5BMSggIDUyKSwgMixOQTEoIDEzKSB9LCAgLyogIDY1TWIv cyAqLworCisJLyogMiBzdHJlYW0gcmF0ZXMgKi8KKworCXsgMyxOQTIoICAxMyksIDMsTkEyKCAg MTMpLCAwLE5BMiggIDEzKSwgMCxOQTIoIDEzKSB9LCAgLyogIDEzTWIvcyAqLworCXsgNCxOQTIo ICAyNiksIDMsTkEyKCAgMTMpLCA0LE5BMiggIDEzKSwgMCxOQTIoIDEzKSB9LCAgLyogIDI2TWIv cyAqLworCXsgNCxOQTIoICAzOSksIDMsTkEyKCAgMjYpLCA0LE5BMiggIDEzKSwgMixOQTIoIDEz KSB9LCAgLyogIDM5TWIvcyAqLworCXsgNCxOQTIoICA1MiksIDMsTkEyKCAgMzkpLCA0LE5BMigg IDI2KSwgMixOQTIoIDEzKSB9LCAgLyogIDUyTWIvcyAqLworCXsgNCxOQTIoICA3OCksIDMsTkEy KCAgNTIpLCA0LE5BMiggIDM5KSwgMixOQTIoIDEzKSB9LCAgLyogIDc4TWIvcyAqLworCXsgNCxO QTIoIDEwNCksIDMsTkEyKCAgNzgpLCA0LE5BMiggIDUyKSwgMixOQTIoIDEzKSB9LCAgLyogMTA0 TWIvcyAqLworCXsgNCxOQTIoIDExNyksIDMsTkEyKCAxMDQpLCA0LE5BMiggIDc4KSwgMixOQTIo IDI2KSB9LCAgLyogMTE3TWIvcyAqLworCXsgNCxOQTIoIDEzMCksIDMsTkEyKCAxMTcpLCA0LE5B MiggMTA0KSwgMixOQTIoIDI2KSB9LCAgIC8qIDEzME1iL3MgKi8KKworCS8qIDMgc3RyZWFtIHJh dGVzICovCisKKwl7IDMsTkEzKDE5LjUpLCAzLE5BMygxOS41KSwgMCxOQTMoMTkuNSksIDAsTkEz KDE5LjUpIH0sICAvKiAgMTlNYi9zICovCisJeyAzLE5BMyggIDM5KSwgMyxOQTMoMTkuNSksIDAs TkEzKDE5LjUpLCAwLE5BMygxOS41KSB9LCAgLyogIDM5TWIvcyAqLworCXsgMyxOQTMoNTguNSks IDMsTkEzKCAgMzkpLCAwLE5BMygxOS41KSwgMCxOQTMoMTkuNSkgfSwgIC8qICA1OE1iL3MgKi8K Kwl7IDMsTkEzKCAgNzgpLCAzLE5BMyg1OC41KSwgMCxOQTMoICAzOSksIDAsTkEzKDE5LjUpIH0s ICAvKiAgNzhNYi9zICovCisJeyAzLE5BMyggMTE3KSwgMyxOQTMoICA3OCksIDAsTkEzKDU4LjUp LCAwLE5BMygxOS41KSB9LCAgLyogMTE3TWIvcyAqLworCXsgMyxOQTMoIDE1NiksIDMsTkEzKCAx MTcpLCAwLE5BMyggIDc4KSwgMCxOQTMoMTkuNSkgfSwgIC8qICAxNTZNYi9zICovCisJeyAzLE5B MygxNzUuNSksIDMsTkEzKCAxNTYpLCAwLE5BMyggMTE3KSwgMCxOQTMoICAzOSkgfSwgIC8qICAx NzVNYi9zICovCisJeyAzLE5BMyggMTk1KSwgMyxOQTMoIDE5NSksIDAsTkEzKCAxNTYpLCAwLE5B Myg1OC41KSB9LCAgLyogMTk1TWIvcyAqLworfTsKKyN1bmRlZiBBCisjdW5kZWYgTkEzCisjdW5k ZWYgTkEyCisjdW5kZWYgTkExCisKKyNkZWZpbmUgRyhfcikgXAorICAgICgoKF9yKSA9PSAxKSAg ID8gMCA6ICgoKF9yKSA9PSAyKSAgID8gMSA6ICgoKF9yKSA9PSA1LjUpID8gMiA6IFwKKyAgICAo KChfcikgPT0gMTEpICA/IDMgOiAoKChfcikgPT0gNikgICA/IDQgOiAoKChfcikgPT0gOSkgICA/ IDUgOiBcCisgICAgKCgoX3IpID09IDEyKSAgPyA2IDogKCgoX3IpID09IDE4KSAgPyA3IDogKCgo X3IpID09IDI0KSAgPyA4IDogXAorICAgICgoKF9yKSA9PSAzNikgID8gOSA6ICgoKF9yKSA9PSA0 OCkgID8gMTAgOiAoKChfcikgPT0gNTQpICA/IDExIDogMCkpKSkpKSkpKSkpKQorc3RhdGljIGNv bnN0IHN0cnVjdCB0eHNjaGVkdWxlIHNlcmllc18xMWdbXSA9IHsKKwl7IDMsRyggMSksIDMsRygg IDEpLCAwLEcoICAxKSwgMCxHKCAxKSB9LAkvKiAgIDFNYi9zICovCisJeyA0LEcoIDIpLCAzLEco ICAxKSwgNCxHKCAgMSksIDAsRyggMSkgfSwJLyogICAyTWIvcyAqLworCXsgNCxHKDUuNSksMyxH KCAgMiksIDQsRyggIDEpLCAyLEcoIDEpIH0sCS8qIDUuNU1iL3MgKi8KKwl7IDQsRygxMSksIDMs Ryg1LjUpLCA0LEcoICAyKSwgMixHKCAxKSB9LAkvKiAgMTFNYi9zICovCisJeyA0LEcoIDYpLCAz LEcoNS41KSwgNCxHKCAgMiksIDIsRyggMSkgfSwJLyogICA2TWIvcyAqLworCXsgNCxHKCA5KSwg MyxHKCAgNiksIDQsRyg1LjUpLCAyLEcoIDEpIH0sCS8qICAgOU1iL3MgKi8KKwl7IDQsRygxMiks IDMsRyggMTEpLCA0LEcoNS41KSwgMixHKCAxKSB9LAkvKiAgMTJNYi9zICovCisJeyA0LEcoMTgp LCAzLEcoIDEyKSwgNCxHKCAxMSksIDIsRyggMSkgfSwJLyogIDE4TWIvcyAqLworCXsgNCxHKDI0 KSwgMyxHKCAxOCksIDQsRyggMTIpLCAyLEcoIDEpIH0sCS8qICAyNE1iL3MgKi8KKwl7IDQsRygz NiksIDMsRyggMjQpLCA0LEcoIDE4KSwgMixHKCAxKSB9LAkvKiAgMzZNYi9zICovCisJeyA0LEco NDgpLCAzLEcoIDM2KSwgNCxHKCAyNCksIDIsRyggMSkgfSwJLyogIDQ4TWIvcyAqLworCXsgNCxH KDU0KSwgMyxHKCA0OCksIDQsRyggMzYpLCAyLEcoIDEpIH0JLyogIDU0TWIvcyAqLworfTsKKwor I2RlZmluZSBORzEoX3IpIFwKKwkoKChfcikgPT0gNi41KSA/IDEyIDogKCgoX3IpID09IDEzKSA/ IDEzIDogKCgoX3IpID09IDE5LjUpPyAxNCA6IFwKKwkoKChfcikgPT0gMjYpICA/IDE1IDogKCgo X3IpID09IDM5KSA/IDE2IDogKCgoX3IpID09IDUyKSAgPyAxNyA6IFwKKwkoKChfcikgPT0gNTgu NSk/IDE4IDogKCgoX3IpID09IDY1KSA/IDE5IDogMCkpKSkpKSkpCisjZGVmaW5lIE5HMihfcikg XAorCSgoKF9yKSA9PSAxMykgID8gMjAgOiAoKChfcikgPT0gMjYpID8gMjEgOiAoKChfcikgPT0g MzkpICA/IDIyIDogXAorCSgoKF9yKSA9PSA1MikgID8gMjMgOiAoKChfcikgPT0gNzgpID8gMjQg OiAoKChfcikgPT0gMTA0KSA/IDI1IDogXAorCSgoKF9yKSA9PSAxMTcpID8gMjYgOiAoKChfcikg PT0gMTMwKT8gMjcgOiAwKSkpKSkpKSkKKyNkZWZpbmUgTkczKF9yKSBcCisJKCgoX3IpID09IDE5 LjUpICA/IDI4IDogKCgoX3IpID09IDM5KSA/IDI5IDogKCgoX3IpID09IDU4LjUpICA/IDMwIDog XAorCSgoKF9yKSA9PSA3OCkgID8gMzEgOiAoKChfcikgPT0gMTE3KSA/IDMyIDogKCgoX3IpID09 IDE1NikgPyAzMyA6IFwKKwkoKChfcikgPT0gMTc1LjUpID8gMzQgOiAoKChfcikgPT0gMTk1KT8g MzUgOiAwKSkpKSkpKSkKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0eHNjaGVkdWxlIHNlcmllc18x MW5nW10gPSB7CisJeyAzLEcoIDEpLCAzLEcoICAxKSwgMCxHKCAgMSksIDAsRyggMSkgfSwgICAg ICAgLyogICAxTWIvcyAqLworCXsgNCxHKCAyKSwgMyxHKCAgMSksIDQsRyggIDEpLCAwLEcoIDEp IH0sICAgICAgIC8qICAgMk1iL3MgKi8KKwl7IDQsRyg1LjUpLDMsRyggIDIpLCA0LEcoICAxKSwg MixHKCAxKSB9LCAgICAgICAvKiA1LjVNYi9zICovCisJeyA0LEcoMTEpLCAzLEcoNS41KSwgNCxH KCAgMiksIDIsRyggMSkgfSwgICAgICAgLyogIDExTWIvcyAqLworCXsgNCxHKCA2KSwgMyxHKDUu NSksIDQsRyggIDIpLCAyLEcoIDEpIH0sICAgICAgIC8qICAgNk1iL3MgKi8KKwl7IDQsRyggOSks IDMsRyggIDYpLCA0LEcoNS41KSwgMixHKCAxKSB9LCAgICAgICAvKiAgIDlNYi9zICovCisJeyA0 LEcoMTIpLCAzLEcoIDExKSwgNCxHKDUuNSksIDIsRyggMSkgfSwgICAgICAgLyogIDEyTWIvcyAq LworCXsgNCxHKDE4KSwgMyxHKCAxMiksIDQsRyggMTEpLCAyLEcoIDEpIH0sICAgICAgIC8qICAx OE1iL3MgKi8KKwl7IDQsRygyNCksIDMsRyggMTgpLCA0LEcoIDEyKSwgMixHKCAxKSB9LCAgICAg ICAvKiAgMjRNYi9zICovCisJeyA0LEcoMzYpLCAzLEcoIDI0KSwgNCxHKCAxOCksIDIsRyggMSkg fSwgICAgICAgLyogIDM2TWIvcyAqLworCXsgNCxHKDQ4KSwgMyxHKCAzNiksIDQsRyggMjQpLCAy LEcoIDEpIH0sICAgICAgIC8qICA0OE1iL3MgKi8KKwl7IDQsRyg1NCksIDMsRyggNDgpLCA0LEco IDM2KSwgMixHKCAxKSB9LCAgICAgICAvKiAgNTRNYi9zICovCisKKwkvKiAxIHN0cmVhbSByYXRl cyAqLworCisJeyAzLE5HMSggNi41KSwgMyxORzEoIDYuNSksIDAsTkcxKCA2LjUpLCAwLE5HMSg2 LjUpIH0sICAvKiA2LjVNYi9zICovCisJeyA0LE5HMSggIDEzKSwgMyxORzEoIDYuNSksIDQsTkcx KCA2LjUpLCAwLE5HMSg2LjUpIH0sICAvKiAgMTNNYi9zICovCisJeyA0LE5HMSgxOS41KSwgMyxO RzEoIDYuNSksIDQsTkcxKCA2LjUpLCAwLE5HMSg2LjUpIH0sICAvKjE5LjVNYi9zICovCisJeyA0 LE5HMSggIDI2KSwgMyxORzEoMTkuNSksIDQsTkcxKCA2LjUpLCAyLE5HMSg2LjUpIH0sICAvKiAg MjZNYi9zICovCisJeyA0LE5HMSggIDM5KSwgMyxORzEoICAyNiksIDQsTkcxKDE5LjUpLCAyLE5H MSg2LjUpIH0sICAvKiAgMzlNYi9zICovCisJeyA0LE5HMSggIDUyKSwgMyxORzEoICAzOSksIDQs TkcxKCAgMjYpLCAyLE5HMSg2LjUpIH0sICAvKiAgNTJNYi9zICovCisJeyA0LE5HMSg1OC41KSwg MyxORzEoICA1MiksIDQsTkcxKCAgMzkpLCAyLE5HMSggMTMpIH0sICAvKjU4LjVNYi9zICovCisJ eyA0LE5HMSggIDY1KSwgMyxORzEoNTguNSksIDQsTkcxKCAgNTIpLCAyLE5HMSggMTMpIH0sICAv KiAgNjVNYi9zICovCisKKwkvKiAyIHN0cmVhbSByYXRlcyAqLworCisJeyAzLE5HMiggIDEzKSwg MyxORzIoICAxMyksIDAsTkcyKCAgMTMpLCAwLE5HMiggMTMpIH0sICAvKiAgMTNNYi9zICovCisJ eyA0LE5HMiggIDI2KSwgMyxORzIoICAxMyksIDQsTkcyKCAgMTMpLCAwLE5HMiggMTMpIH0sICAv KiAgMjZNYi9zICovCisJeyA0LE5HMiggIDM5KSwgMyxORzIoICAyNiksIDQsTkcyKCAgMTMpLCAy LE5HMiggMTMpIH0sICAvKiAgMzlNYi9zICovCisJeyA0LE5HMiggIDUyKSwgMyxORzIoICAzOSks IDQsTkcyKCAgMjYpLCAyLE5HMiggMTMpIH0sICAvKiAgNTJNYi9zICovCisJeyA0LE5HMiggIDc4 KSwgMyxORzIoICA1MiksIDQsTkcyKCAgMzkpLCAyLE5HMiggMTMpIH0sICAvKiAgNzhNYi9zICov CisJeyA0LE5HMiggMTA0KSwgMyxORzIoICA3OCksIDQsTkcyKCAgNTIpLCAyLE5HMiggMTMpIH0s ICAvKiAxMDRNYi9zICovCisJeyA0LE5HMiggMTE3KSwgMyxORzIoIDEwNCksIDQsTkcyKCAgNzgp LCAyLE5HMiggMjYpIH0sICAvKiAxMTdNYi9zICovCisJeyA0LE5HMiggMTMwKSwgMyxORzIoIDEx NyksIDQsTkcyKCAxMDQpLCAyLE5HMiggMjYpIH0sICAvKiAxMzBNYi9zICovCisKKwkvKiAzIHN0 cmVhbSByYXRlcyAqLworCisJeyAzLE5HMygxOS41KSwgMyxORzMoMTkuNSksIDAsTkczKDE5LjUp LCAwLE5HMygxOS41KSB9LCAgLyogIDE5TWIvcyAqLworCXsgMyxORzMoICAzOSksIDMsTkczKDE5 LjUpLCAwLE5HMygxOS41KSwgMCxORzMoMTkuNSkgfSwgIC8qICAzOU1iL3MgKi8KKwl7IDMsTkcz KDU4LjUpLCAzLE5HMyggIDM5KSwgMCxORzMoMTkuNSksIDAsTkczKDE5LjUpIH0sICAvKiAgNThN Yi9zICovCisJeyAzLE5HMyggIDc4KSwgMyxORzMoNTguNSksIDAsTkczKCAgMzkpLCAwLE5HMygx OS41KSB9LCAgLyogIDc4TWIvcyAqLworCXsgMyxORzMoIDExNyksIDMsTkczKCAgNzgpLCAwLE5H Myg1OC41KSwgMCxORzMoMTkuNSkgfSwgIC8qIDExN01iL3MgKi8KKwl7IDMsTkczKCAxNTYpLCAz LE5HMyggMTE3KSwgMCxORzMoICA3OCksIDAsTkczKDE5LjUpIH0sICAvKiAgMTU2TWIvcyAqLwor CXsgMyxORzMoMTc1LjUpLCAzLE5HMyggMTU2KSwgMCxORzMoIDExNyksIDAsTkczKCAgMzkpIH0s ICAvKiAgMTc1TWIvcyAqLworCXsgMyxORzMoIDE5NSksIDMsTkczKCAxOTUpLCAwLE5HMyggMTU2 KSwgMCxORzMoNTguNSkgfSwgIC8qIDE5NU1iL3MgKi8KKworfTsKKyN1bmRlZiBHCisjdW5kZWYg TkczCisjdW5kZWYgTkcyCisjdW5kZWYgTkcxCisKKyNkZWZpbmUgSChfcikgXAorICAgICgoKF9y KSA9PSAzKSAgID8gMCA6ICgoKF9yKSA9PSA0LjUpID8gMSA6ICgoKF9yKSA9PSA2KSAgPyAyIDog XAorICAgICgoKF9yKSA9PSA5KSAgID8gMyA6ICgoKF9yKSA9PSAxMikgID8gNCA6ICgoKF9yKSA9 PSAxOCkgPyA1IDogXAorICAgICgoKF9yKSA9PSAyNCkgID8gNiA6ICgoKF9yKSA9PSAyNykgID8g NyA6IDApKSkpKSkpKQorc3RhdGljIGNvbnN0IHN0cnVjdCB0eHNjaGVkdWxlIHNlcmllc19oYWxm W10gPSB7CisJeyAzLEgoIDMpLCAzLEgoICAzKSwgMCxIKCAgMyksIDAsSCggMykgfSwJLyogICAz TWIvcyAqLworCXsgNCxIKDQuNSksMyxIKCAgMyksIDQsSCggIDMpLCAwLEgoIDMpIH0sCS8qIDQu NU1iL3MgKi8KKwl7IDQsSCggNiksIDMsSCggIDMpLCA0LEgoICAzKSwgMCxIKCAzKSB9LAkvKiAg IDZNYi9zICovCisJeyA0LEgoIDkpLCAzLEgoICA2KSwgNCxIKCAgMyksIDIsSCggMykgfSwJLyog ICA5TWIvcyAqLworCXsgNCxIKDEyKSwgMyxIKCAgOSksIDQsSCggIDYpLCAyLEgoIDMpIH0sCS8q ICAxMk1iL3MgKi8KKwl7IDQsSCgxOCksIDMsSCggMTIpLCA0LEgoICA5KSwgMixIKCAzKSB9LAkv KiAgMThNYi9zICovCisJeyA0LEgoMjQpLCAzLEgoIDE4KSwgNCxIKCAxMiksIDIsSCggNikgfSwJ LyogIDI0TWIvcyAqLworCXsgNCxIKDI3KSwgMyxIKCAyNCksIDQsSCggMTgpLCAyLEgoMTIpIH0J LyogIDI3TWIvcyAqLworfTsKKyN1bmRlZiBICisKKyNpZmRlZiBRCisjdW5kZWYgUQorI2VuZGlm CisjZGVmaW5lIFEoX3IpIFwKKyAgICAoKChfcikgPT0gMS41KSA/IDAgOiAoKChfcikgPT0yLjI1 KSA/IDEgOiAoKChfcikgPT0gMykgID8gMiA6IFwKKyAgICAoKChfcikgPT0gNC41KSA/IDMgOiAo KChfcikgPT0gIDYpICA/IDQgOiAoKChfcikgPT0gOSkgID8gNSA6IFwKKyAgICAoKChfcikgPT0g MTIpICA/IDYgOiAoKChfcikgPT0gMTMuNSk/IDcgOiAwKSkpKSkpKSkKK3N0YXRpYyBjb25zdCBz dHJ1Y3QgdHhzY2hlZHVsZSBzZXJpZXNfcXVhcnRlcltdID0geworCXsgMyxRKCAxLjUpLDMsUSgx LjUpLCAwLFEoMS41KSwgMCxRKDEuNSkgfSwJLyogMS41TWIvcyAqLworCXsgNCxRKDIuMjUpLDMs USgxLjUpLCA0LFEoMS41KSwgMCxRKDEuNSkgfSwJLyoyLjI1TWIvcyAqLworCXsgNCxRKCAgIDMp LDMsUSgxLjUpLCA0LFEoMS41KSwgMCxRKDEuNSkgfSwJLyogICAzTWIvcyAqLworCXsgNCxRKCA0 LjUpLDMsUSggIDMpLCA0LFEoMS41KSwgMixRKDEuNSkgfSwJLyogNC41TWIvcyAqLworCXsgNCxR KCAgIDYpLDMsUSg0LjUpLCA0LFEoICAzKSwgMixRKDEuNSkgfSwJLyogICA2TWIvcyAqLworCXsg NCxRKCAgIDkpLDMsUSggIDYpLCA0LFEoNC41KSwgMixRKDEuNSkgfSwJLyogICA5TWIvcyAqLwor CXsgNCxRKCAgMTIpLDMsUSggIDkpLCA0LFEoICA2KSwgMixRKCAgMykgfSwJLyogIDEyTWIvcyAq LworCXsgNCxRKDEzLjUpLDMsUSggMTIpLCA0LFEoICA5KSwgMixRKCAgNikgfQkvKjEzLjVNYi9z ICovCit9OworI3VuZGVmIFEKKworI2VuZGlmCkluZGV4OiBpZWVlODAyMTFfcmF0ZWN0bC5jCj09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KLS0tIGllZWU4MDIxMV9yYXRlY3RsLmMJKHJldmlzaW9uIDI1NDgyNikKKysrIGll ZWU4MDIxMV9yYXRlY3RsLmMJKHJldmlzaW9uIDI1NTUzOSkKQEAgLTEsNSArMSw2IEBACiAvKi0K ICAqIENvcHlyaWdodCAoYykgMjAxMCBSdWkgUGF1bG8gPHJwYXVsb0BGcmVlQlNELm9yZz4KKyAq IENvcHlyaWdodCAoYykgMjAxMyBDaGVuY2hvbmcgUWluIDxjY3FpbkBGcmVlQlNELm9yZz4KICAq IEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC00OSw2ICs1MCwzMyBA QAogCiBNQUxMT0NfREVGSU5FKE1fODAyMTFfUkFURUNUTCwgIjgwMjExcmF0ZWN0bCIsICI4MDIu MTEgcmF0ZSBjb250cm9sIik7CiAKK2ludCBtYXhfNG1zX2ZyYW1lbGVuWzRdWzMyXSA9IHsKKwlb TUNTX0hUMjBdID0geworCQkzMjEyLCAgNjQzMiwgIDk2NDgsICAxMjg2NCwgIDE5MzAwLCAgMjU3 MzYsICAyODk1MiwgIDMyMTcyLAorCQk2NDI0LCAgMTI4NTIsIDE5MjgwLCAyNTcwOCwgIDM4NTY4 LCAgNTE0MjQsICA1Nzg1MiwgIDY0MjgwLAorCQk5NjI4LCAgMTkyNjAsIDI4ODk2LCAzODUyOCwg IDU3NzkyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLAorCQkxMjgyOCwgMjU2NTYsIDM4NDg4LCA1 MTMyMCwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLAorCX0sCisJW01DU19IVDIwX1NH SV0gPSB7CisJCTM1NzIsICA3MTQ0LCAgMTA3MjAsICAxNDI5NiwgIDIxNDQ0LCAgMjg1OTYsICAz MjE3MiwgIDM1NzQ0LAorCQk3MTQwLCAgMTQyODQsIDIxNDI4LCAgMjg1NjgsICA0Mjg1NiwgIDU3 MTQ0LCAgNjQyODgsICA2NTUzMiwKKwkJMTA3MDAsIDIxNDA4LCAzMjExMiwgIDQyODE2LCAgNjQy MjgsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsCisJCTE0MjU2LCAyODUxNiwgNDI3ODAsICA1NzA0 MCwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLAorCX0sCisJW01DU19IVDQwXSA9IHsK KwkJNjY4MCwgIDEzMzYwLCAgMjAwNDQsICAyNjcyNCwgIDQwMDkyLCAgNTM0NTYsICA2MDE0MCwg IDY1NTMyLAorCQkxMzM0OCwgMjY3MDAsICA0MDA1MiwgIDUzNDAwLCAgNjU1MzIsICA2NTUzMiwg IDY1NTMyLCAgNjU1MzIsCisJCTIwMDA0LCA0MDAwOCwgIDYwMDE2LCAgNjU1MzIsICA2NTUzMiwg IDY1NTMyLCAgNjU1MzIsICA2NTUzMiwKKwkJMjY2NDQsIDUzMjkyLCAgNjU1MzIsICA2NTUzMiwg IDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLAorCX0sCisJW01DU19IVDQwX1NHSV0gPSB7 CisJCTc0MjAsICAxNDg0NCwgIDIyMjcyLCAgMjk2OTYsICA0NDU0NCwgIDU5Mzk2LCAgNjU1MzIs ICA2NTUzMiwKKwkJMTQ4MzIsIDI5NjY4LCAgNDQ1MDQsICA1OTM0MCwgIDY1NTMyLCAgNjU1MzIs ICA2NTUzMiwgIDY1NTMyLAorCQkyMjIzMiwgNDQ0NjQsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIs ICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsCisJCTI5NjE2LCA1OTIzMiwgIDY1NTMyLCAgNjU1MzIs ICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwKKwl9Cit9OworCiB2b2lkCiBpZWVlODAy MTFfcmF0ZWN0bF9yZWdpc3RlcihpbnQgdHlwZSwgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRl Y3RsICpyYXRlY3RsKQogewpAQCAtNjYsMTAgKzk0LDExIEBACiB9CiAKIHZvaWQKLWllZWU4MDIx MV9yYXRlY3RsX2luaXQoc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwKQoraWVlZTgwMjExX3JhdGVj dGxfaW5pdChzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsIHVpbnQzMl90IGNhcGFiaWxpdGllcykK IHsKIAlpZiAodmFwLT5pdl9yYXRlID09IHJhdGVjdGxzW0lFRUU4MDIxMV9SQVRFQ1RMX05PTkVd KQogCQlpZWVlODAyMTFfcmF0ZWN0bF9zZXQodmFwLCBJRUVFODAyMTFfUkFURUNUTF9BTVJSKTsK Kwl2YXAtPml2X3JhdGUuaXJfY2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzOwogCXZhcC0+aXZf cmF0ZS0+aXJfaW5pdCh2YXApOwogfQogCkBAIC05MCwzICsxMTksOTUgQEAKIAl9CiAJdmFwLT5p dl9yYXRlID0gcmF0ZWN0bHNbdHlwZV07CiB9CisKK3ZvaWQKK2llZWU4MDIxMV9yYXRlY3RsX2Nv bXBsZXRlX3JjZmxhZ3MoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwKKwkJc3RydWN0 IGllZWU4MDIxMV9yY19zZXJpZXMgKnJjLCBpbnQgc2hvcnRQcmVhbWJsZSkKK3sKKwljb25zdCBz dHJ1Y3QgaWVlZTgwMjExY29tICppYyA9IG5pLT5uaV9pYzsKKwljb25zdCBzdHJ1Y3QgaWVlZTgw MjExdmFwICp2YXAgPSBuaS0+bmlfdmFwOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90 YWJsZSAqIHJ0ID0gaWMtPmljX3J0OworCXVpbnQ4X3QgcmF0ZTsKKwlpbnQgaTsKKworCS8qIE1h a2Ugc3VyZSB0aGF0IHJhdGUgY29udHJvbCBjb2RlIGRvZXNuJ3QgbWVzcyBpdCB1cC4KKwkgKiBJ ZiBlbmFibGUgcnRzL2N0cyBhbmQgaXMgcHJlLTgwMi4xMW4sIGJsYW5rIHRyaWVzIDEsIDIsIDMg CisJICovCisKKwlpZiAoISAodmFwLT5pdl9yYXRlLT5pcl9jYXBhYmlsaXRpZXMgJiBJRUVFODAy MTFfUkFURUNUTF9DQVBfTVJSUFJPVCkpCisJeworCQlmb3IgKGkgPSAxOyBpIDwgSUVFRTgwMjEx X1JBVEVDVExfTlVNOyBpKyspCisJCXsKKwkJCWlmIChyY1swXS5mbGFncyAmIElFRUU4MDIxMV9S QVRFQ1RMX1JUU0NUU19GTEFHKQorCQkJCXJjW2ldLnRyaWVzID0gMDsKKwkJCXJjW2ldLmZsYWdz ICY9IH5JRUVFODAyMTFfUkFURUNUTF9SVFNDVFNfRkxBRzsgCisJCX0KKwl9CisKKwlmb3IgKGkg PSAwOyBpIDwgSUVFRTgwMjExX1JBVEVDVExfTlVNOyBpKyspIHsKKwkJCisJCWlmIChyY1tpXS50 cmllcyA9PSAwKQorCQkJY29udGludWU7CisKKwkJcmF0ZSA9IHJ0LT5pbmZvW3JjW2ldLnJpeF0u cmF0ZUNvZGU7CisKKwkJLyoKKwkJICogT25seSBlbmFibGUgc2hvcnQgcHJlYW1ibGUgZm9yIGxl Z2FjeSByYXRlcworCQkgKi8KKwkJaWYgKCghIElTX0hUX1JBVEUocmF0ZSkpICYmIHNob3J0UHJl YW1ibGUpCisJCQlyYXRlIHw9IHJ0LT5pbmZvW3JjW2ldLnJpeF0uc2hvcnRQcmVhbWJsZTsKKwor CQkvKgorCQkgKiBTYXZlIHRoaXMsIHVzZWQgYnkgdGhlIFRYIGFuZCBjb21wbGV0aW9uIGNvZGUK KwkJICovCisJCXJjW2ldLnJhdGVjb2RlID0gcmF0ZTsKKworCQkvKiBPbmx5IGVuYWJsZSBzaG9y dGdpLCAyMDQwLCBkdWFsLXN0cmVhbSBpZiBIVCBpcyBzZXQgKi8KKwkJaWYgKElTX0hUX1JBVEUo cmF0ZSkpIHsKKwkJCXJjW2ldLmZsYWdzIHw9IElFRUU4MDIxMV9SQVRFQ1RMX0hUX0ZMQUc7CisK KwkJCS8qCisJCQkgKiBYWFggVE9ETzogTERQQworCQkJICovCisKKwkJCS8qCisJCQkgKiBEdWFs IC8gVHJpcGxlIHN0cmVhbSByYXRlPworCQkJICovCisJCQlpZiAoSFRfUkNfMl9TVFJFQU1TKHJh dGUpID09IDIpCisJCQkJcmNbaV0uZmxhZ3MgfD0gSUVFRTgwMjExX1JBVEVDVExfRFNfRkxBRzsK KwkJCWVsc2UgaWYgKEhUX1JDXzJfU1RSRUFNUyhyYXRlKSA9PSAzKQorCQkJCXJjW2ldLmZsYWdz IHw9IElFRUU4MDIxMV9SQVRFQ1RMX1RTX0ZMQUc7CisJCX0KKworCQkvKgorCQkgKiBDYWxjdWxh dGUgdGhlIG1heGltdW0gVFggcG93ZXIgY2FwIGZvciB0aGUgY3VycmVudAorCQkgKiBub2RlLiAK KwkJICogUmF0ZSBjb250cm9sIGFsZ28gY2FuJ3QgY29udHJvbCBUWCBwb3dlciBieSBub3cuCisJ CSAqLworCQlyY1tpXS50eF9wb3dlcl9jYXAgPSBpZWVlODAyMTFfZ2V0X25vZGVfdHhwb3dlcihu aSk7CisJCQorCQkvKgorCQkgKiBDYWxjdWxhdGUgdGhlIG1heGltdW0gNG1zIGZyYW1lIGxlbmd0 aCBiYXNlZAorCQkgKiBvbiB0aGUgTUNTIHJhdGUsIFNHSSBhbmQgY2hhbm5lbCB3aWR0aCBmbGFn cy4KKwkJICovCisJCWlmICgocmNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfUkFURUNUTF9IVF9GTEFH KSAmJgorCQkgICAgKEhUX1JDXzJfTUNTKHJhdGUpIDwgMzIpKSB7CisJCQlpbnQgajsKKwkJCWlm IChyY1tpXS5mbGFncyAmIElFRUU4MDIxMV9SQVRFQ1RMX0NXNDBfRkxBRykgeworCQkJCWlmIChy Y1tpXS5mbGFncyAmIElFRUU4MDIxMV9SQVRFQ1RMX1NHSV9GTEFHKQorCQkJCQlqID0gTUNTX0hU NDBfU0dJOworCQkJCWVsc2UKKwkJCQkJaiA9IE1DU19IVDQwOworCQkJfSBlbHNlIHsKKwkJCQlp ZiAocmNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfUkFURUNUTF9TR0lfRkxBRykKKwkJCQkJaiA9IE1D U19IVDIwX1NHSTsKKwkJCQllbHNlCisJCQkJCWogPSBNQ1NfSFQyMDsKKwkJCX0KKwkJCXJjW2ld Lm1heDRtc2ZyYW1lbGVuID0KKwkJCSAgICBtYXhfNG1zX2ZyYW1lbGVuW2pdW0hUX1JDXzJfTUNT KHJhdGUpXTsKKwkJfSBlbHNlCisJCQlyY1tpXS5tYXg0bXNmcmFtZWxlbiA9IDA7CisJfQorfQor CkluZGV4OiBpZWVlODAyMTFfcmF0ZWN0bC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGllZWU4MDIxMV9yYXRl Y3RsLmgJKHJldmlzaW9uIDI1NDgyNikKKysrIGllZWU4MDIxMV9yYXRlY3RsLmgJKHJldmlzaW9u IDI1NTUzOSkKQEAgLTEsNSArMSw2IEBACiAvKi0KICAqIENvcHlyaWdodCAoYykgMjAxMCBSdWkg UGF1bG8gPHJwYXVsb0BGcmVlQlNELm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAxMyBDaGVuY2hv bmcgUWluIDxjY3FpbkBGcmVlQlNELm9yZz4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgog ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0 aCBvciB3aXRob3V0CkBAIC0yNCw2ICsyNSw4IEBACiAgKgogICogJEZyZWVCU0QkCiAgKi8KKyNp Zm5kZWYgX05FVDgwMjExX0lFRUU4MDIxMV9SQVRFQ1RMX0hfCisjZGVmaW5lIF9ORVQ4MDIxMV9J RUVFODAyMTFfUkFURUNUTF9IXwogCiBlbnVtIGllZWU4MDIxMV9yYXRlYWxncyB7CiAJSUVFRTgw MjExX1JBVEVDVExfQU1SUgkJPSAwLApAQCAtMzQsMTEgKzM3LDU2IEBACiAJSUVFRTgwMjExX1JB VEVDVExfTUFYCiB9OwogCitlbnVtIHsKKwlNQ1NfSFQyMCwKKwlNQ1NfSFQyMF9TR0ksCisJTUNT X0hUNDAsCisJTUNTX0hUNDBfU0dJLAorfTsKKwogI2RlZmluZQlJRUVFODAyMTFfUkFURUNUTF9U WF9TVUNDRVNTCTEKICNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfVFhfRkFJTFVSRQkwCiAKKyNk ZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfVFJVRQkJMQorI2RlZmluZQlJRUVFODAyMTFfUkFURUNU TF9GQUxTRQkJMAorCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX05VTQkJNAorCisjZGVmaW5l CUlFRUU4MDIxMV9SQVRFQ1RMX0RTX0ZMQUcJCTB4MDEJLyogZHVhbC1zdHJlYW0gcmF0ZSAqLwor I2RlZmluZQlJRUVFODAyMTFfUkFURUNUTF9DVzQwX0ZMQUcJCTB4MDIJLyogdXNlIEhUNDAgKi8K KyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfU0dJX0ZMQUcJCTB4MDQJLyogdXNlIHNob3J0LUdJ ICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0hUX0ZMQUcJCTB4MDgJLyogdXNlIEhUICov CisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX1JUU0NUU19GTEFHCTB4MTAJLyogZW5hYmxlIFJU Uy9DVFMgcHJvdGVjdGlvbiAqLworI2RlZmluZQlJRUVFODAyMTFfUkFURUNUTF9TVEJDX0ZMQUcJ CTB4MjAJLyogZW5hYmxlIFNUQkMgKi8KKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfVFNfRkxB RwkJMHg0MAkvKiB0cmlwbGUtc3RyZWFtIHJhdGUgKi8KKworLyogSGFyZHdhcmUgQ0FQcyBjaGlw IG9mZmVyZWQgdG8gcmF0ZSBjb250cm9sIGNvZGUgKi8KKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVD VExfQ0FQX01SUgkJCTB4MDEJLyogc3VwcG9ydCBNUlIgKi8KKyNkZWZpbmUJSUVFRTgwMjExX1JB VEVDVExfQ0FQX01SUlBST1QJCTB4MDIJLyogc3VwcG9ydCBNUlIgKyBwcm90ZWN0ICovCisjZGVm aW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NVUxUWENIQUlOCTB4MDQJLyogaGFzIG1vcmUgdGhh biAxIHR4Y2hhaW4gKi8KKworI2RlZmluZSBJU19WQVBfSFQodmFwKQkoKHZhcCktPml2X2h0Y2Fw cyAmIElFRUU4MDIxMV9IVENfSFQpCisKKyNkZWZpbmUgSVNfSFRfUkFURShfcmF0ZSkgICAoKF9y YXRlKSAmIDB4ODApCisjZGVmaW5lIEhUX1JDXzJfTUNTKF9yYykgICAgKChfcmMpICYgMHg3ZikK KyNkZWZpbmUgSFRfUkNfMl9TVFJFQU1TKF9yYykgICAgKCgoKF9yYykgJiAweDc4KSA+PiAzKSAr IDEpCisKKworZXh0ZXJuIGludCBtYXhfNG1zX2ZyYW1lbGVuWzRdWzMyXTsKKworc3RydWN0IGll ZWU4MDIxMV9yY19zZXJpZXMgeworCXVpbnQ4X3Qgcml4OwkJLyogcmF0ZXRhYmxlIGluZGV4LCBu b3QgcmF0ZSBjb2RlICovCisJdWludDhfdCByYXRlY29kZTsJLyogaGFyZHdhcmUgcmF0ZSBjb2Rl ICovCisJdWludDhfdCB0cmllczsKKwl1aW50OF90IHR4X3Bvd2VyX2NhcDsKKwl1aW50MTZfdCBm bGFnczsKKwl1aW50MTZfdCBtYXg0bXNmcmFtZWxlbjsKK307CisKIHN0cnVjdCBpZWVlODAyMTFf cmF0ZWN0bCB7CiAJY29uc3QgY2hhciAqaXJfbmFtZTsKKwl1aW50MzJfdCBpcl9jYXBhYmlsaXRp ZXM7CQkvKiBoYXJkd2FyZSBjYXBhYmlsaXRpZXMgb2ZmZXJlZCB0byByYyAqLworCiAJaW50CSgq aXJfYXR0YWNoKShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICopOwogCXZvaWQJKCppcl9kZXRh Y2gpKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKik7CiAJdm9pZAkoKmlyX2luaXQpKHN0cnVj dCBpZWVlODAyMTF2YXAgKik7CkBAIC00Niw2ICs5NCw4IEBACiAJdm9pZAkoKmlyX25vZGVfaW5p dCkoc3RydWN0IGllZWU4MDIxMV9ub2RlICopOwogCXZvaWQJKCppcl9ub2RlX2RlaW5pdCkoc3Ry dWN0IGllZWU4MDIxMV9ub2RlICopOwogCWludAkoKmlyX3JhdGUpKHN0cnVjdCBpZWVlODAyMTFf bm9kZSAqLCB2b2lkICosIHVpbnQzMl90KTsKKwl2b2lkCSgqaXJfcmF0ZXMpKHN0cnVjdCBpZWVl ODAyMTFfbm9kZSAqLCBzdHJ1Y3QgaWVlZTgwMjExX3JjX3NlcmllcyAqLCAKKwkJCQkJICBpbnQs IHNpemVfdCk7CiAJdm9pZAkoKmlyX3R4X2NvbXBsZXRlKShjb25zdCBzdHJ1Y3QgaWVlZTgwMjEx dmFwICosCiAJICAgIAkJCSAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICosIGludCwKIAkg ICAgCQkJICB2b2lkICosIHZvaWQgKik7CkBAIC01Nyw4ICsxMDcsMTAgQEAKIAogdm9pZAlpZWVl ODAyMTFfcmF0ZWN0bF9yZWdpc3RlcihpbnQsIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZWN0 bCAqKTsKIHZvaWQJaWVlZTgwMjExX3JhdGVjdGxfdW5yZWdpc3RlcihpbnQpOwotdm9pZAlpZWVl ODAyMTFfcmF0ZWN0bF9pbml0KHN0cnVjdCBpZWVlODAyMTF2YXAgKik7Cit2b2lkCWllZWU4MDIx MV9yYXRlY3RsX2luaXQoc3RydWN0IGllZWU4MDIxMXZhcCAqLCB1aW50MzJfdCk7CiB2b2lkCWll ZWU4MDIxMV9yYXRlY3RsX3NldChzdHJ1Y3QgaWVlZTgwMjExdmFwICosIGludCk7Cit2b2lkCWll ZWU4MDIxMV9yYXRlY3RsX2NvbXBsZXRlX3JjZmxhZ3MoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9u b2RlICosIAorCQlzdHJ1Y3QgaWVlZTgwMjExX3JjX3NlcmllcyAqLCBpbnQpCiAKIE1BTExPQ19E RUNMQVJFKE1fODAyMTFfUkFURUNUTCk7CiAKQEAgLTkzLDYgKzE0NSwxNyBAQAogfQogCiBzdGF0 aWMgdm9pZCBfX2lubGluZQoraWVlZTgwMjExX3JhdGVjdGxfcmF0ZXMoc3RydWN0IGllZWU4MDIx MV9ub2RlICpuaSwgc3RydWN0IGllZWU4MDIxMV9yY19zZXJpZXMgKnJjLAorCQlpbnQgc2hvcnRQ cmVhbWJsZSwgc2l6ZV90IGZyYW1lTGVuKQoreworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAg KnZhcCA9IG5pLT5uaV92YXA7CisKKwl2YXAtPml2X3JhdGUtPmlyX3JhdGVzKG5pLCByYywgc2hv cnRQcmVhbWJsZSwgZnJhbWVMZW4pOworCQorCWllZWU4MDIxMV9yYXRlY3RsX2NvbXBsZXRlX3Jj ZmxhZ3MobmksIHJjLCBzaG9ydFByZWFtYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19pbmxpbmUK IGllZWU4MDIxMV9yYXRlY3RsX3R4X2NvbXBsZXRlKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAg KnZhcCwKICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBpbnQgc3RhdHVzLCB2 b2lkICphcmcxLCB2b2lkICphcmcyKQogewpAQCAtMTE1LDMgKzE3OCw0MCBAQAogCQlyZXR1cm47 CiAJdmFwLT5pdl9yYXRlLT5pcl9zZXRpbnRlcnZhbCh2YXAsIG1zZWNzKTsKIH0KKworc3RhdGlj IGludCBfX2lubGluZQoraWVlZTgwMjExX3JhdGVjdGxfaGFzY2FwX2N3NDAoY29uc3Qgc3RydWN0 IGllZWU4MDIxMXZhcCAqdmFwLAorCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQor eworCXJldHVybiBJU19WQVBfSFQodmFwKSAmJiAobmktPm5pX2NodyA9PSA0MCk7Cit9CisKK3N0 YXRpYyBpbnQgX19pbmxpbmUKK2llZWU4MDIxMV9yYXRlY3RsX2hhc2NhcF9zaG9ydGdpKGNvbnN0 IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCwKKwkJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2Rl ICpuaSkKK3sKKwlpZiAoISBJU19WQVBfSFQodmFwKSkKKwkJcmV0dXJuIElFRUU4MDIxMV9SQVRF Q1RMX0ZBTFNFOworCisJaWYgKG5pLT5uaV9jaHcgPT0gNDAgJiYKKwkJCXZhcC0+aXZfaHRjYXBz ICYgSUVFRTgwMjExX0hUQ0FQX1NIT1JUR0k0MCAmJgorCQkJbmktPm5pX2h0Y2FwICYgSUVFRTgw MjExX0hUQ0FQX1NIT1JUR0k0MCkKKwkJcmV0dXJuIElFRUU4MDIxMV9SQVRFQ1RMX1RSVUU7CisK KwlpZiAobmktPm5pX2NodyA9PSAyMCAmJgorCQkJdmFwLT5pdl9odGNhcHMgJiBJRUVFODAyMTFf SFRDQVBfU0hPUlRHSTIwICYmCisJCQluaS0+bmlfaHRjYXAgJiBJRUVFODAyMTFfSFRDQVBfU0hP UlRHSTIwKQorCQlyZXR1cm4gSUVFRTgwMjExX1JBVEVDVExfVFJVRTsKK30KKworCitzdGF0aWMg aW50IF9faW5saW5lCitpZWVlODAyMTFfcmF0ZWN0bF9oYXNjYXBfc3RiYyhjb25zdCBzdHJ1Y3Qg aWVlZTgwMjExdmFwICp2YXAsCisJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmkpCit7 CisgICByZXR1cm4gSVNfVkFQX0hUKHZhcCkgJiYgKHZhcC0+aXZfaHRjYXBzICYgSUVFRTgwMjEx X0hUQ0FQX1RYU1RCQykgJiYKKwkJCSAgICAobmktPm5pX2h0Y2FwICYgSUVFRTgwMjExX0hUQ0FQ X1JYU1RCQ18xU1RSRUFNKSAmJgorCQkJICAgICh2YXAtPml2X3JhdGUtPmlyX2NhcGFiaWxpdGll cyAmIElFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NVUxUWENIQUlOKTsKK30KKworI2VuZGlmCg== --047d7bd6b90069e7a604e3356150--