From owner-freebsd-wireless@FreeBSD.ORG Sun Aug 25 14:30:02 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 A85D3E1A; Sun, 25 Aug 2013 14:30:02 +0000 (UTC) (envelope-from qinchenchong@gmail.com) Received: from mail-vc0-x22d.google.com (mail-vc0-x22d.google.com [IPv6:2607:f8b0:400c:c03::22d]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 33C3A206B; Sun, 25 Aug 2013 14:30:02 +0000 (UTC) Received: by mail-vc0-f173.google.com with SMTP id id13so1431904vcb.4 for ; Sun, 25 Aug 2013 07:30:01 -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=bu/p5U9sNV3fRwMAEO8I7Q0ESXRS4EdYPwoNePRWcBY=; b=fJCNi7CO/Zk22ynrVHkZUA7XbzOhUAsumpwXD7JLfDTRhI5x/74iY53kvHMxr65qI3 GBK+pzuwJ10uszUwF40qlqVBa7F1LGNqyc7EL4sTNVfNKAnY+uXUN+KMga8W0ns249Rl AnGE+6BK4RKepfj50gfxg4iQf15UBtEJHDQkqWKxsKsmZFEC79BPhZWSGFHzdtUFc8Cs nYv93cUAmv+7Ea5LLZPoU4jdC27e2r8hAELOIlj7/Pdzu8fpIIAcfkC9nI5UgCzk5XXH uKZazl/b3aYuQX2nCx8Nv9fJd4oF7mi959kDEzXxhGwpl5Va806TqBT65/vZyp1r/0Aa tU6w== MIME-Version: 1.0 X-Received: by 10.52.92.73 with SMTP id ck9mr8323707vdb.2.1377441001232; Sun, 25 Aug 2013 07:30:01 -0700 (PDT) Received: by 10.220.182.68 with HTTP; Sun, 25 Aug 2013 07:30:01 -0700 (PDT) In-Reply-To: References: Date: Sun, 25 Aug 2013 22:30:01 +0800 Message-ID: Subject: Re: Chenchong's work on net80211_ratectl From: Chenchong Qin To: Adrian Chadd Content-Type: multipart/mixed; boundary=20cf3071c88693e1e004e4c679b2 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: Sun, 25 Aug 2013 14:30:02 -0000 --20cf3071c88693e1e004e4c679b2 Content-Type: text/plain; charset=ISO-8859-1 Hi! This is the latest update. * add a simple per vap ratectl statistic tracker and api to update it. * port irn_capabilities to irs_capabilities in struct ieee80211_rc_stat. perhaps the capabilities field needs to be within ieee80211_rc_stat as a per vap atrribute. corresponding updates performed. * add ieee80211_ratectl_none.h to record common ratectl state. Thanks! Chenchong On Thu, Aug 15, 2013 at 8:03 PM, Chenchong Qin wrote: > Hi! > > Here is my latest update. In this update: > > * add a new struct, ieee80211_ratectl_node. This is the common state that > all per node rc > state, i.e. ieee80211_[amrr|sample]_node, should contains it as the > first field. It's now used to store > the capabilities. see below. > * rename ir_capabilities to irn_capabilities and move it to > ieee80211_ratectl_node (it contained in > ieee80211_[amrr|sample]_node). ieee80211_ratectl is readonly, so > ir_capabilities can't be set. And, > the capabilities is not a part of rc algo. It seems that it should be > put in the per node rc state. Interface > of ieee80211_ratectl_node_init() and its callers are updated. > References to ir_capabilities are also adapted. > * add ieee80211_ratectl_[node_is11n|get_rateset] to the ratectl api. rc > algoes all need these functions. > * change the naming conversion of IEEE80211_RATECTL_FLAG_*. > * some errors fixed. > > > On Thu, Aug 15, 2013 at 12:58 AM, Adrian Chadd wrote: > >> Hi! >> >> So yes, we do need to have a generic way of returning that completion >> information to the rate control code. >> >> I'm all for you churning the rate control API to return a struct >> ieee80211_rc_info in the complete function and totally just kill arg1/arg2. >> That forces us to extend ieee80211_rc_info to be "right" for all the >> drivers. >> > > Do you mean drop arg1/arg2 and pass pointer of ieee80211_rc_info to the > complete function directly? Or return it > when complete function return? > > >> What wifi devices do you have there? It looks like we're almost at the >> point where we can start converting a few things to use the modified rate >> control API and modules - notably iwn (which won't use the multi-rate retry >> stuff to begin with - it works "differently"..) and ath (which will use the >> multi-rate retry stuff and the sample rate control module.) >> > > Yeah, I have an AR9227 device at hand. > > And, I also get a question here. The ieee80211_ratetable doesn't get a > rateCode field. So, how we get the > ratecode of the non_ht rate? > > Thanks! > > Chenchong > > --20cf3071c88693e1e004e4c679b2 Content-Type: application/octet-stream; name="20130825-net80211-ratectl.diff" Content-Disposition: attachment; filename="20130825-net80211-ratectl.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hkscsnzn1 SW5kZXg6IHN5cy9kZXYvaXduL2lmX2l3bi5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9kZXYvaXduL2lm X2l3bi5jCShyZXZpc2lvbiAyNTQ4MjYpCisrKyBzeXMvZGV2L2l3bi9pZl9pd24uYwkod29ya2lu ZyBjb3B5KQpAQCAtODc2LDcgKzg3Niw4IEBACiAJaXZwLT5pdl9uZXdzdGF0ZSA9IHZhcC0+aXZf bmV3c3RhdGU7CiAJdmFwLT5pdl9uZXdzdGF0ZSA9IGl3bl9uZXdzdGF0ZTsKIAotCWllZWU4MDIx MV9yYXRlY3RsX2luaXQodmFwKTsKKwkvKiBYWFggVE9ETyBmaWxsIHRoZSBjYXAgKi8KKwlpZWVl ODAyMTFfcmF0ZWN0bF9pbml0KHZhcCwgMCk7CiAJLyogQ29tcGxldGUgc2V0dXAuICovCiAJaWVl ZTgwMjExX3ZhcF9hdHRhY2godmFwLCBpd25fbWVkaWFfY2hhbmdlLCBpZWVlODAyMTFfbWVkaWFf c3RhdHVzKTsKIAlpYy0+aWNfb3Btb2RlID0gb3Btb2RlOwpJbmRleDogc3lzL2Rldi9id2kvaWZf YndpLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQotLS0gc3lzL2Rldi9id2kvaWZfYndpLmMJKHJldmlzaW9uIDI1NDgy NikKKysrIHN5cy9kZXYvYndpL2lmX2J3aS5jCSh3b3JraW5nIGNvcHkpCkBAIC02MTcsNyArNjE3 LDggQEAKICNpZiAwCiAJdmFwLT5pdl91cGRhdGVfYmVhY29uID0gYndpX2JlYWNvbl91cGRhdGU7 CiAjZW5kaWYKLQlpZWVlODAyMTFfcmF0ZWN0bF9pbml0KHZhcCk7CisJLyogWFhYIFRPRE8gZmls bCB0aGUgY2FwICovCisJaWVlZTgwMjExX3JhdGVjdGxfaW5pdCh2YXAsIDApOwogCiAJLyogY29t cGxldGUgc2V0dXAgKi8KIAlpZWVlODAyMTFfdmFwX2F0dGFjaCh2YXAsIGJ3aV9tZWRpYV9jaGFu Z2UsIGllZWU4MDIxMV9tZWRpYV9zdGF0dXMpOwpJbmRleDogc3lzL2Rldi9id24vaWZfYnduLmMK PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQotLS0gc3lzL2Rldi9id24vaWZfYnduLmMJKHJldmlzaW9uIDI1NDgyNikKKysr IHN5cy9kZXYvYnduL2lmX2J3bi5jCSh3b3JraW5nIGNvcHkpCkBAIC0yOTcwLDcgKzI5NzAsOCBA QAogCS8qIG92ZXJyaWRlIG1heCBhaWQgc28gc3RhJ3MgY2Fubm90IGFzc29jIHdoZW4gd2UncmUg b3V0IG9mIHN0YSBpZCdzICovCiAJdmFwLT5pdl9tYXhfYWlkID0gQldOX1NUQUlEX01BWDsKIAot CWllZWU4MDIxMV9yYXRlY3RsX2luaXQodmFwKTsKKwkvKiBYWFggVE9ETyBmaWxsIHRoZSBjYXAg Ki8KKwlpZWVlODAyMTFfcmF0ZWN0bF9pbml0KHZhcCwgMCk7CiAKIAkvKiBjb21wbGV0ZSBzZXR1 cCAqLwogCWllZWU4MDIxMV92YXBfYXR0YWNoKHZhcCwgaWVlZTgwMjExX21lZGlhX2NoYW5nZSwK SW5kZXg6IHN5cy9kZXYvdXNiL3dsYW4vaWZfdXJhbC5jCj09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9kZXYv dXNiL3dsYW4vaWZfdXJhbC5jCShyZXZpc2lvbiAyNTQ4MjYpCisrKyBzeXMvZGV2L3VzYi93bGFu L2lmX3VyYWwuYwkod29ya2luZyBjb3B5KQpAQCAtNTk4LDcgKzU5OCw4IEBACiAKIAl1c2JfY2Fs bG91dF9pbml0X210eCgmdXZwLT5yYXRlY3RsX2NoLCAmc2MtPnNjX210eCwgMCk7CiAJVEFTS19J TklUKCZ1dnAtPnJhdGVjdGxfdGFzaywgMCwgdXJhbF9yYXRlY3RsX3Rhc2ssIHV2cCk7Ci0JaWVl ZTgwMjExX3JhdGVjdGxfaW5pdCh2YXApOworCS8qIFhYWCBUT0RPIGZpbGwgdGhlIGNhcCAqLwor CWllZWU4MDIxMV9yYXRlY3RsX2luaXQodmFwLCAwKTsKIAlpZWVlODAyMTFfcmF0ZWN0bF9zZXRp bnRlcnZhbCh2YXAsIDEwMDAgLyogMSBzZWMgKi8pOwogCiAJLyogY29tcGxldGUgc2V0dXAgKi8K SW5kZXg6IHN5cy9kZXYvdXNiL3dsYW4vaWZfcnVtLmMKPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL2Rldi91 c2Ivd2xhbi9pZl9ydW0uYwkocmV2aXNpb24gMjU0ODI2KQorKysgc3lzL2Rldi91c2Ivd2xhbi9p Zl9ydW0uYwkod29ya2luZyBjb3B5KQpAQCAtNjEzLDcgKzYxMyw4IEBACiAKIAl1c2JfY2FsbG91 dF9pbml0X210eCgmcnZwLT5yYXRlY3RsX2NoLCAmc2MtPnNjX210eCwgMCk7CiAJVEFTS19JTklU KCZydnAtPnJhdGVjdGxfdGFzaywgMCwgcnVtX3JhdGVjdGxfdGFzaywgcnZwKTsKLQlpZWVlODAy MTFfcmF0ZWN0bF9pbml0KHZhcCk7CisJLyogWFhYIFRPRE8gZmlsbCB0aGUgY2FwICovCisJaWVl ZTgwMjExX3JhdGVjdGxfaW5pdCh2YXAsIDApOwogCWllZWU4MDIxMV9yYXRlY3RsX3NldGludGVy dmFsKHZhcCwgMTAwMCAvKiAxIHNlYyAqLyk7CiAJLyogY29tcGxldGUgc2V0dXAgKi8KIAlpZWVl ODAyMTFfdmFwX2F0dGFjaCh2YXAsIGllZWU4MDIxMV9tZWRpYV9jaGFuZ2UsIGllZWU4MDIxMV9t ZWRpYV9zdGF0dXMpOwpJbmRleDogc3lzL2Rldi91c2Ivd2xhbi9pZl9ydW4uYwo9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 Ci0tLSBzeXMvZGV2L3VzYi93bGFuL2lmX3J1bi5jCShyZXZpc2lvbiAyNTQ4MjYpCisrKyBzeXMv ZGV2L3VzYi93bGFuL2lmX3J1bi5jCSh3b3JraW5nIGNvcHkpCkBAIC04MjAsNyArODIwLDggQEAK IAlydnAtPm5ld3N0YXRlID0gdmFwLT5pdl9uZXdzdGF0ZTsKIAl2YXAtPml2X25ld3N0YXRlID0g cnVuX25ld3N0YXRlOwogCi0JaWVlZTgwMjExX3JhdGVjdGxfaW5pdCh2YXApOworCS8qIFhYWCBU T0RPIGZpbGwgdGhlIGNhcCAqLworCWllZWU4MDIxMV9yYXRlY3RsX2luaXQodmFwLCAwKTsKIAlp ZWVlODAyMTFfcmF0ZWN0bF9zZXRpbnRlcnZhbCh2YXAsIDEwMDAgLyogMSBzZWMgKi8pOwogCiAJ LyogY29tcGxldGUgc2V0dXAgKi8KSW5kZXg6IHN5cy9kZXYvdXNiL3dsYW4vaWZfenlkLmMKPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQotLS0gc3lzL2Rldi91c2Ivd2xhbi9pZl96eWQuYwkocmV2aXNpb24gMjU0ODI2KQor Kysgc3lzL2Rldi91c2Ivd2xhbi9pZl96eWQuYwkod29ya2luZyBjb3B5KQpAQCAtNDk2LDcgKzQ5 Niw4IEBACiAJenZwLT5uZXdzdGF0ZSA9IHZhcC0+aXZfbmV3c3RhdGU7CiAJdmFwLT5pdl9uZXdz dGF0ZSA9IHp5ZF9uZXdzdGF0ZTsKIAotCWllZWU4MDIxMV9yYXRlY3RsX2luaXQodmFwKTsKKwkv KiBYWFggVE9ETyBmaWxsIHRoZSBjYXAgKi8KKwlpZWVlODAyMTFfcmF0ZWN0bF9pbml0KHZhcCwg MCk7CiAJaWVlZTgwMjExX3JhdGVjdGxfc2V0aW50ZXJ2YWwodmFwLCAxMDAwIC8qIDEgc2VjICov KTsKIAogCS8qIGNvbXBsZXRlIHNldHVwICovCkluZGV4OiBzeXMvZGV2L3dwaS9pZl93cGkuYwo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09Ci0tLSBzeXMvZGV2L3dwaS9pZl93cGkuYwkocmV2aXNpb24gMjU0ODI2KQorKysg c3lzL2Rldi93cGkvaWZfd3BpLmMJKHdvcmtpbmcgY29weSkKQEAgLTc4Miw3ICs3ODIsOCBAQAog CXd2cC0+bmV3c3RhdGUgPSB2YXAtPml2X25ld3N0YXRlOwogCXZhcC0+aXZfbmV3c3RhdGUgPSB3 cGlfbmV3c3RhdGU7CiAKLQlpZWVlODAyMTFfcmF0ZWN0bF9pbml0KHZhcCk7CisJLyogWFhYIFRP RE8gZmlsbCB0aGUgY2FwICovCisJaWVlZTgwMjExX3JhdGVjdGxfaW5pdCh2YXAsIDApOwogCS8q IGNvbXBsZXRlIHNldHVwICovCiAJaWVlZTgwMjExX3ZhcF9hdHRhY2godmFwLCBpZWVlODAyMTFf bWVkaWFfY2hhbmdlLCBpZWVlODAyMTFfbWVkaWFfc3RhdHVzKTsKIAlpYy0+aWNfb3Btb2RlID0g b3Btb2RlOwpJbmRleDogc3lzL2Rldi9yYWwvcnQyNTYwLmMKPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL2Rl di9yYWwvcnQyNTYwLmMJKHJldmlzaW9uIDI1NDgyNikKKysrIHN5cy9kZXYvcmFsL3J0MjU2MC5j CSh3b3JraW5nIGNvcHkpCkBAIC00MjYsNyArNDI2LDggQEAKIAl2YXAtPml2X25ld3N0YXRlID0g cnQyNTYwX25ld3N0YXRlOwogCXZhcC0+aXZfdXBkYXRlX2JlYWNvbiA9IHJ0MjU2MF9iZWFjb25f dXBkYXRlOwogCi0JaWVlZTgwMjExX3JhdGVjdGxfaW5pdCh2YXApOworCS8qIFhYWCBUT0RPIGZp bGwgdGhlIGNhcCAqLworCWllZWU4MDIxMV9yYXRlY3RsX2luaXQodmFwLCAwKTsKIAkvKiBjb21w bGV0ZSBzZXR1cCAqLwogCWllZWU4MDIxMV92YXBfYXR0YWNoKHZhcCwgaWVlZTgwMjExX21lZGlh X2NoYW5nZSwgaWVlZTgwMjExX21lZGlhX3N0YXR1cyk7CiAJaWYgKFRBSUxRX0ZJUlNUKCZpYy0+ aWNfdmFwcykgPT0gdmFwKQpJbmRleDogc3lzL2Rldi9yYWwvcnQyNjYxLmMKPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot LS0gc3lzL2Rldi9yYWwvcnQyNjYxLmMJKHJldmlzaW9uIDI1NDgyNikKKysrIHN5cy9kZXYvcmFs L3J0MjY2MS5jCSh3b3JraW5nIGNvcHkpCkBAIC00MjMsNyArNDIzLDggQEAKIAl2YXAtPml2X3Vw ZGF0ZV9iZWFjb24gPSBydDI2NjFfYmVhY29uX3VwZGF0ZTsKICNlbmRpZgogCi0JaWVlZTgwMjEx X3JhdGVjdGxfaW5pdCh2YXApOworCS8qIFhYWCBUT0RPIGZpbGwgdGhlIGNhcCAqLworCWllZWU4 MDIxMV9yYXRlY3RsX2luaXQodmFwLCAwKTsKIAkvKiBjb21wbGV0ZSBzZXR1cCAqLwogCWllZWU4 MDIxMV92YXBfYXR0YWNoKHZhcCwgaWVlZTgwMjExX21lZGlhX2NoYW5nZSwgaWVlZTgwMjExX21l ZGlhX3N0YXR1cyk7CiAJaWYgKFRBSUxRX0ZJUlNUKCZpYy0+aWNfdmFwcykgPT0gdmFwKQpJbmRl eDogc3lzL2Rldi9yYWwvcnQyODYwLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL2Rldi9yYWwvcnQyODYw LmMJKHJldmlzaW9uIDI1NDgyNikKKysrIHN5cy9kZXYvcmFsL3J0Mjg2MC5jCSh3b3JraW5nIGNv cHkpCkBAIC00ODQsNyArNDg0LDggQEAKIAkvKiBIVyBzdXBwb3J0cyB1cCB0byAyNTUgU1RBcyAo MC0yNTQpIGluIEhvc3RBUCBhbmQgSUJTUyBtb2RlcyAqLwogCXZhcC0+aXZfbWF4X2FpZCA9IG1p bihJRUVFODAyMTFfQUlEX01BWCwgUlQyODYwX1dDSURfTUFYKTsKIAotCWllZWU4MDIxMV9yYXRl Y3RsX2luaXQodmFwKTsKKwkvKiBYWFggVE9ETyBmaWxsIHRoZSBjYXAgKi8KKwlpZWVlODAyMTFf cmF0ZWN0bF9pbml0KHZhcCwgMCk7CiAJLyogY29tcGxldGUgc2V0dXAgKi8KIAlpZWVlODAyMTFf dmFwX2F0dGFjaCh2YXAsIGllZWU4MDIxMV9tZWRpYV9jaGFuZ2UsIGllZWU4MDIxMV9tZWRpYV9z dGF0dXMpOwogCWlmIChUQUlMUV9GSVJTVCgmaWMtPmljX3ZhcHMpID09IHZhcCkKSW5kZXg6IHN5 cy9uZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bF9ub25lLmMKPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL25l dDgwMjExL2llZWU4MDIxMV9yYXRlY3RsX25vbmUuYwkocmV2aXNpb24gMjU0ODI2KQorKysgc3lz L25ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsX25vbmUuYwkod29ya2luZyBjb3B5KQpAQCAtNDQs MTAgKzQ0LDI2IEBACiAKICNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAyMTFfdmFyLmg+CiAjaW5j bHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3JhdGVjdGwuaD4KKyNpbmNsdWRlIDxuZXQ4MDIxMS9p ZWVlODAyMTFfcmF0ZWN0bF9ub25lLmg+CiAKIHN0YXRpYyB2b2lkCi1ub25lX2luaXQoc3RydWN0 IGllZWU4MDIxMXZhcCAqdmFwKQorbm9uZV9pbml0KHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCwg dWludDMyX3QgY2FwYWJpbGl0aWVzKQogeworCXN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbm9uZTsK KworCUtBU1NFUlQodmFwLT5pdl9ycyA9PSBOVUxMLCAoIiVzIGNhbGxlZCBtdWx0aXBsZSB0aW1l cyIsIF9fZnVuY19fKSk7CisKKwlub25lID0gdmFwLT5pdl9ycyA9IG1hbGxvYyhzaXplb2Yoc3Ry dWN0IGllZWU4MDIxMV9ub25lKSwKKwkgICAgTV84MDIxMV9SQVRFQ1RMLCBNX05PV0FJVHxNX1pF Uk8pOworCWlmIChub25lID09IE5VTEwpIHsKKwkJaWZfcHJpbnRmKHZhcC0+aXZfaWZwLCAiY291 bGRuJ3QgYWxsb2MgcmF0ZWN0bCBzdHJ1Y3R1cmVcbiIpOworCQlyZXR1cm47CisJfQorCisJc3Ry dWN0IGllZWU4MDIxMV9yY19zdGF0ICogaXJzID0gSUVFRTgwMjExX1JBVEVDVExfU1RBVCh2YXAp OworCWlycy0+aXJzX2NhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllczsKKworCS8qIC4uLiAqLwog fQogCiBzdGF0aWMgdm9pZApAQCAtNTksNiArNzUsMjUgQEAKIHN0YXRpYyB2b2lkCiBub25lX25v ZGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQogeworCXN0cnVjdCBpZWVlODAyMTF2 YXAgKnZhcCA9IG5pLT5uaV92YXA7CisJc3RydWN0IGllZWU4MDIxMV9ub25lICpub25lID0gdmFw LT5pdl9yczsKKwlzdHJ1Y3QgaWVlZTgwMjExX25vbmVfbm9kZSAqbm9uOworCisJaWYgKG5pLT5u aV9yY3RscyA9PSBOVUxMKSB7CisJCW5pLT5uaV9yY3RscyA9IG5vbiA9IG1hbGxvYyhzaXplb2Yo c3RydWN0IGllZWU4MDIxMV9ub25lX25vZGUpLAorCQkgICAgTV84MDIxMV9SQVRFQ1RMLCBNX05P V0FJVHxNX1pFUk8pOworCQlpZiAobm9uID09IE5VTEwpIHsKKwkJCWlmX3ByaW50Zih2YXAtPml2 X2lmcCwgImNvdWxkbid0IGFsbG9jIHBlci1ub2RlIHJhdGVjdGwgIgorCQkJICAgICJzdHJ1Y3R1 cmVcbiIpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlCisJCW5vbiA9IG5pLT5uaV9yY3RsczsK KworCW5vbi0+bm9uX25vbmUgPSBub25lOworCisJLyogLi4uICovCisJCiAJbmktPm5pX3R4cmF0 ZSA9IG5pLT5uaV9yYXRlcy5yc19yYXRlc1swXSAmIElFRUU4MDIxMV9SQVRFX1ZBTDsKIH0KIApJ bmRleDogc3lzL25ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsLmMKPT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lz L25ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsLmMJKHJldmlzaW9uIDI1NDgyNikKKysrIHN5cy9u ZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5jCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNiBA QAogLyotCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUnVpIFBhdWxvIDxycGF1bG9ARnJlZUJTRC5v cmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNob25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5v cmc+CiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1 c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNDksNiAr NTAsNDAgQEAKIAogTUFMTE9DX0RFRklORShNXzgwMjExX1JBVEVDVEwsICI4MDIxMXJhdGVjdGwi LCAiODAyLjExIHJhdGUgY29udHJvbCIpOwogCitlbnVtIHsKKwlNQ1NfSFQyMCwKKwlNQ1NfSFQy MF9TR0ksCisJTUNTX0hUNDAsCisJTUNTX0hUNDBfU0dJLAorfTsKKworaW50IG1heF80bXNfZnJh bWVsZW5bNF1bMzJdID0geworCVtNQ1NfSFQyMF0gPSB7CisJCTMyMTIsICA2NDMyLCAgOTY0OCwg IDEyODY0LCAgMTkzMDAsICAyNTczNiwgIDI4OTUyLCAgMzIxNzIsCisJCTY0MjQsICAxMjg1Miwg MTkyODAsIDI1NzA4LCAgMzg1NjgsICA1MTQyNCwgIDU3ODUyLCAgNjQyODAsCisJCTk2MjgsICAx OTI2MCwgMjg4OTYsIDM4NTI4LCAgNTc3OTIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsCisJCTEy ODI4LCAyNTY1NiwgMzg0ODgsIDUxMzIwLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIs CisJfSwKKwlbTUNTX0hUMjBfU0dJXSA9IHsKKwkJMzU3MiwgIDcxNDQsICAxMDcyMCwgIDE0Mjk2 LCAgMjE0NDQsICAyODU5NiwgIDMyMTcyLCAgMzU3NDQsCisJCTcxNDAsICAxNDI4NCwgMjE0Mjgs ICAyODU2OCwgIDQyODU2LCAgNTcxNDQsICA2NDI4OCwgIDY1NTMyLAorCQkxMDcwMCwgMjE0MDgs IDMyMTEyLCAgNDI4MTYsICA2NDIyOCwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwKKwkJMTQyNTYs IDI4NTE2LCA0Mjc4MCwgIDU3MDQwLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsCisJ fSwKKwlbTUNTX0hUNDBdID0geworCQk2NjgwLCAgMTMzNjAsICAyMDA0NCwgIDI2NzI0LCAgNDAw OTIsICA1MzQ1NiwgIDYwMTQwLCAgNjU1MzIsCisJCTEzMzQ4LCAyNjcwMCwgIDQwMDUyLCAgNTM0 MDAsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwKKwkJMjAwMDQsIDQwMDA4LCAgNjAw MTYsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLAorCQkyNjY0NCwgNTMy OTIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsCisJfSwK KwlbTUNTX0hUNDBfU0dJXSA9IHsKKwkJNzQyMCwgIDE0ODQ0LCAgMjIyNzIsICAyOTY5NiwgIDQ0 NTQ0LCAgNTkzOTYsICA2NTUzMiwgIDY1NTMyLAorCQkxNDgzMiwgMjk2NjgsICA0NDUwNCwgIDU5 MzQwLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsCisJCTIyMjMyLCA0NDQ2NCwgIDY1 NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwKKwkJMjk2MTYsIDU5 MjMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLAorCX0K K307CisKIHZvaWQKIGllZWU4MDIxMV9yYXRlY3RsX3JlZ2lzdGVyKGludCB0eXBlLCBjb25zdCBz dHJ1Y3QgaWVlZTgwMjExX3JhdGVjdGwgKnJhdGVjdGwpCiB7CkBAIC02NiwxMSArMTAxLDExIEBA CiB9CiAKIHZvaWQKLWllZWU4MDIxMV9yYXRlY3RsX2luaXQoc3RydWN0IGllZWU4MDIxMXZhcCAq dmFwKQoraWVlZTgwMjExX3JhdGVjdGxfaW5pdChzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsIHVp bnQzMl90IGNhcGFiaWxpdGllcykKIHsKIAlpZiAodmFwLT5pdl9yYXRlID09IHJhdGVjdGxzW0lF RUU4MDIxMV9SQVRFQ1RMX05PTkVdKQogCQlpZWVlODAyMTFfcmF0ZWN0bF9zZXQodmFwLCBJRUVF ODAyMTFfUkFURUNUTF9BTVJSKTsKLQl2YXAtPml2X3JhdGUtPmlyX2luaXQodmFwKTsKKwl2YXAt Pml2X3JhdGUtPmlyX2luaXQodmFwLCBjYXBhYmlsaXRpZXMpOwogfQogCiB2b2lkCkBAIC05MCwz ICsxMjUsMTAzIEBACiAJfQogCXZhcC0+aXZfcmF0ZSA9IHJhdGVjdGxzW3R5cGVdOwogfQorCit2 b2lkCitpZWVlODAyMTFfcmF0ZWN0bF9jb21wbGV0ZV9yY2ZsYWdzKHN0cnVjdCBpZWVlODAyMTFf bm9kZSAqbmksCisJCXN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyAqcmNfaW5mbykKK3sKKwlzdHJ1 Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBuaS0+bmlfdmFwOworCWNvbnN0IHN0cnVjdCBpZWVlODAy MTFfcmF0ZV90YWJsZSAqIHJ0ID0gTlVMTDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JjX3NlcmllcyAq cmMgPSByY19pbmZvLT5pcmlfcmM7CisJLyogaW50IHNob3J0UHJlYW1ibGUgPSByY19pbmZvLT5y aV9zaG9ydFByZWFtYmxlOyAqLworCXVpbnQ4X3QgcmF0ZTsKKwlpbnQgaTsKKworCXJ0ID0gaWVl ZTgwMjExX2dldF9yYXRldGFibGUobmktPm5pX2ljLT5pY19jdXJjaGFuKTsKKworCS8qIE1ha2Ug c3VyZSB0aGF0IHJhdGUgY29udHJvbCBjb2RlIGRvZXNuJ3QgbWVzcyBpdCB1cC4KKwkgKiBJZiBl bmFibGUgcnRzL2N0cyBhbmQgaXMgcHJlLTgwMi4xMW4sIGJsYW5rIHRyaWVzIDEsIDIsIDMgCisJ ICovCisKKwlpZiAoISBJRUVFODAyMTFfUkFURUNUTF9IQVNDQVBfTVJSUFJPVCh2YXApKQorCXsK KwkJZm9yIChpID0gMTsgaSA8IElFRUU4MDIxMV9SQVRFQ1RMX05VTTsgaSsrKQorCQl7CisJCQlp ZiAocmNbMF0uZmxhZ3MgJiBJRUVFODAyMTFfUkFURUNUTF9GTEFHX1JUU0NUUykKKwkJCQlyY1tp XS50cmllcyA9IDA7CisJCQlyY1tpXS5mbGFncyAmPSB+SUVFRTgwMjExX1JBVEVDVExfRkxBR19S VFNDVFM7IAorCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IElFRUU4MDIxMV9SQVRFQ1RMX05V TTsgaSsrKSB7CisJCQorCQlpZiAocmNbaV0udHJpZXMgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJ CXJhdGUgPSBydC0+aW5mb1tyY1tpXS5yaXhdLmRvdDExUmF0ZTsKKworCQkvKgorCQkgKiBPbmx5 IGVuYWJsZSBzaG9ydCBwcmVhbWJsZSBmb3IgbGVnYWN5IHJhdGVzCisJCSAqLworCisJCS8qIFhY WCBob3cgd2UgZ2V0IHRoZSBub25faHQgcmF0ZWNvZGUgaGVyZT8gKi8KKworCQkjaWYgMAorCQlp ZiAoKCEgSVNfSFRfUkFURShyYXRlKSkgJiYgc2hvcnRQcmVhbWJsZSkKKwkJCXJhdGUgfD0gcnQt PmluZm9bcmNbaV0ucml4XS5zaG9ydFByZWFtYmxlOworCQkjZW5kaWYKKworCQkvKgorCQkgKiBT YXZlIHRoaXMsIHVzZWQgYnkgdGhlIFRYIGFuZCBjb21wbGV0aW9uIGNvZGUKKwkJICovCisJCXJj W2ldLnJhdGVjb2RlID0gcmF0ZTsKKworCQkvKiBPbmx5IGVuYWJsZSBzaG9ydGdpLCAyMDQwLCBk dWFsLXN0cmVhbSBpZiBIVCBpcyBzZXQgKi8KKwkJaWYgKElTX0hUX1JBVEUocmF0ZSkpIHsKKwkJ CXJjW2ldLmZsYWdzIHw9IElFRUU4MDIxMV9SQVRFQ1RMX0ZMQUdfSFQ7CisKKwkJCS8qCisJCQkg KiBYWFggVE9ETzogTERQQworCQkJICovCisKKwkJCS8qCisJCQkgKiBEdWFsIC8gVHJpcGxlIHN0 cmVhbSByYXRlPworCQkJICovCisJCQlpZiAoSFRfUkNfMl9TVFJFQU1TKHJhdGUpID09IDIpCisJ CQkJcmNbaV0uZmxhZ3MgfD0gSUVFRTgwMjExX1JBVEVDVExfRkxBR19EUzsKKwkJCWVsc2UgaWYg KEhUX1JDXzJfU1RSRUFNUyhyYXRlKSA9PSAzKQorCQkJCXJjW2ldLmZsYWdzIHw9IElFRUU4MDIx MV9SQVRFQ1RMX0ZMQUdfVFM7CisJCX0KKworCQkvKgorCQkgKiBDYWxjdWxhdGUgdGhlIG1heGlt dW0gVFggcG93ZXIgY2FwIGZvciB0aGUgY3VycmVudAorCQkgKiBub2RlLiAKKwkJICogUmF0ZSBj b250cm9sIGFsZ28gY2FuJ3QgY29udHJvbCBUWCBwb3dlciBieSBub3cuCisJCSAqLworCQlyY1tp XS50eF9wb3dlcl9jYXAgPSBpZWVlODAyMTFfZ2V0X25vZGVfdHhwb3dlcihuaSk7CisJCQorCQkv KgorCQkgKiBDYWxjdWxhdGUgdGhlIG1heGltdW0gNG1zIGZyYW1lIGxlbmd0aCBiYXNlZAorCQkg KiBvbiB0aGUgTUNTIHJhdGUsIFNHSSBhbmQgY2hhbm5lbCB3aWR0aCBmbGFncy4KKwkJICovCisJ CWlmICgocmNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfUkFURUNUTF9GTEFHX0hUKSAmJgorCQkgICAg KEhUX1JDXzJfTUNTKHJhdGUpIDwgMzIpKSB7CisJCQlpbnQgajsKKwkJCWlmIChyY1tpXS5mbGFn cyAmIElFRUU4MDIxMV9SQVRFQ1RMX0ZMQUdfQ1c0MCkgeworCQkJCWlmIChyY1tpXS5mbGFncyAm IElFRUU4MDIxMV9SQVRFQ1RMX0ZMQUdfU0dJKQorCQkJCQlqID0gTUNTX0hUNDBfU0dJOworCQkJ CWVsc2UKKwkJCQkJaiA9IE1DU19IVDQwOworCQkJfSBlbHNlIHsKKwkJCQlpZiAocmNbaV0uZmxh Z3MgJiBJRUVFODAyMTFfUkFURUNUTF9GTEFHX1NHSSkKKwkJCQkJaiA9IE1DU19IVDIwX1NHSTsK KwkJCQllbHNlCisJCQkJCWogPSBNQ1NfSFQyMDsKKwkJCX0KKwkJCXJjW2ldLm1heDRtc2ZyYW1l bGVuID0KKwkJCSAgICBtYXhfNG1zX2ZyYW1lbGVuW2pdW0hUX1JDXzJfTUNTKHJhdGUpXTsKKwkJ fSBlbHNlCisJCQlyY1tpXS5tYXg0bXNmcmFtZWxlbiA9IDA7CisJfQorfQorCkluZGV4OiBzeXMv bmV0ODAyMTEvaWVlZTgwMjExX2FtcnIuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbmV0ODAyMTEvaWVl ZTgwMjExX2FtcnIuYwkocmV2aXNpb24gMjU0ODI2KQorKysgc3lzL25ldDgwMjExL2llZWU4MDIx MV9hbXJyLmMJKHdvcmtpbmcgY29weSkKQEAgLTQ3LDggKzQ3LDggQEAKIAogI2luY2x1ZGUgPG5l dDgwMjExL2llZWU4MDIxMV92YXIuaD4KICNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAyMTFfaHQu aD4KKyNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5oPgogI2luY2x1ZGUgPG5l dDgwMjExL2llZWU4MDIxMV9hbXJyLmg+Ci0jaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3Jh dGVjdGwuaD4KIAogI2RlZmluZSBpc19zdWNjZXNzKGFtbikJXAogCSgoYW1uKS0+YW1uX3JldHJ5 Y250IDwgKGFtbiktPmFtbl90eGNudCAvIDEwKQpAQCAtNTgsNyArNTgsNyBAQAogCSgoYW1uKS0+ YW1uX3R4Y250ID4gMTApCiAKIHN0YXRpYyB2b2lkCWFtcnJfc2V0aW50ZXJ2YWwoY29uc3Qgc3Ry dWN0IGllZWU4MDIxMXZhcCAqLCBpbnQpOwotc3RhdGljIHZvaWQJYW1ycl9pbml0KHN0cnVjdCBp ZWVlODAyMTF2YXAgKik7CitzdGF0aWMgdm9pZAlhbXJyX2luaXQoc3RydWN0IGllZWU4MDIxMXZh cCAqLCB1aW50MzJfdCk7CiBzdGF0aWMgdm9pZAlhbXJyX2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjEx dmFwICopOwogc3RhdGljIHZvaWQJYW1ycl9ub2RlX2luaXQoc3RydWN0IGllZWU4MDIxMV9ub2Rl ICopOwogc3RhdGljIHZvaWQJYW1ycl9ub2RlX2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExX25vZGUg Kik7CkBAIC0xMDUsNyArMTA1LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWFtcnJfaW5pdChzdHJ1 Y3QgaWVlZTgwMjExdmFwICp2YXApCithbXJyX2luaXQoc3RydWN0IGllZWU4MDIxMXZhcCAqdmFw LCB1aW50MzJfdCBjYXBhYmlsaXRpZXMpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9hbXJyICphbXJy OwogCkBAIC0xMTcsNiArMTE3LDEwIEBACiAJCWlmX3ByaW50Zih2YXAtPml2X2lmcCwgImNvdWxk bid0IGFsbG9jIHJhdGVjdGwgc3RydWN0dXJlXG4iKTsKIAkJcmV0dXJuOwogCX0KKworCXN0cnVj dCBpZWVlODAyMTFfcmNfc3RhdCAqIGlycyA9IElFRUU4MDIxMV9SQVRFQ1RMX1NUQVQodmFwKTsK KwlpcnMtPmlyc19jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7CisKIAlhbXJyLT5hbXJyX21p bl9zdWNjZXNzX3RocmVzaG9sZCA9IElFRUU4MDIxMV9BTVJSX01JTl9TVUNDRVNTX1RIUkVTSE9M RDsKIAlhbXJyLT5hbXJyX21heF9zdWNjZXNzX3RocmVzaG9sZCA9IElFRUU4MDIxMV9BTVJSX01B WF9TVUNDRVNTX1RIUkVTSE9MRDsKIAlhbXJyX3NldGludGVydmFsKHZhcCwgNTAwIC8qIG1zICov KTsKQEAgLTEyOSwxNyArMTMzLDYgQEAKIAlmcmVlKHZhcC0+aXZfcnMsIE1fODAyMTFfUkFURUNU TCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFtcnJfbm9kZV9pc18xMW4oc3RydWN0IGllZWU4MDIxMV9u b2RlICpuaSkKLXsKLQotCWlmIChuaS0+bmlfY2hhbiA9PSBOVUxMKQotCQlyZXR1cm4gKDApOwot CWlmIChuaS0+bmlfY2hhbiA9PSBJRUVFODAyMTFfQ0hBTl9BTllDKQotCQlyZXR1cm4gKDApOwot CXJldHVybiAoSUVFRTgwMjExX0lTX0NIQU5fSFQobmktPm5pX2NoYW4pKTsKLX0KLQogc3RhdGlj IHZvaWQKIGFtcnJfbm9kZV9pbml0KHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmkpCiB7CkBAIC0x NTksNiArMTUyLDcgQEAKIAkJfQogCX0gZWxzZQogCQlhbW4gPSBuaS0+bmlfcmN0bHM7CisKIAlh bW4tPmFtbl9hbXJyID0gYW1ycjsKIAlhbW4tPmFtbl9zdWNjZXNzID0gMDsKIAlhbW4tPmFtbl9y ZWNvdmVyeSA9IDA7CkBAIC0xNjUsMjMgKzE1OSwxMyBAQAogCWFtbi0+YW1uX3R4Y250ID0gYW1u LT5hbW5fcmV0cnljbnQgPSAwOwogCWFtbi0+YW1uX3N1Y2Nlc3NfdGhyZXNob2xkID0gYW1yci0+ YW1ycl9taW5fc3VjY2Vzc190aHJlc2hvbGQ7CiAKLQkvKiAxMW4gb3Igbm90PyBQaWNrIHRoZSBy aWdodCByYXRlc2V0ICovCi0JaWYgKGFtcnJfbm9kZV9pc18xMW4obmkpKSB7Ci0JCS8qIFhYWCBl dyAqLwotCQlJRUVFODAyMTFfTk9URShuaS0+bmlfdmFwLCBJRUVFODAyMTFfTVNHX1JBVEVDVEws IG5pLAotCQkgICAgIiVzOiAxMW4gbm9kZSIsIF9fZnVuY19fKTsKLQkJcnMgPSAoc3RydWN0IGll ZWU4MDIxMV9yYXRlc2V0ICopICZuaS0+bmlfaHRyYXRlczsKLQl9IGVsc2UgewotCQlJRUVFODAy MTFfTk9URShuaS0+bmlfdmFwLCBJRUVFODAyMTFfTVNHX1JBVEVDVEwsIG5pLAotCQkgICAgIiVz OiBub24tMTFuIG5vZGUiLCBfX2Z1bmNfXyk7Ci0JCXJzID0gJm5pLT5uaV9yYXRlczsKLQl9CisJ cnMgPSBpZWVlODAyMTFfcmF0ZWN0bF9nZXRfcmF0ZXNldChuaSk7CiAKIAkvKiBJbml0aWFsIHJh dGUgLSBsb3dlc3QgKi8KIAlyYXRlID0gcnMtPnJzX3JhdGVzWzBdOwogCiAJLyogWFhYIGNsZWFy IHRoZSBiYXNpYyByYXRlIGZsYWcgaWYgaXQncyBub3QgMTFuICovCi0JaWYgKCEgYW1ycl9ub2Rl X2lzXzExbihuaSkpCisJaWYgKCEgaWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pczExbihuaSkpCiAJ CXJhdGUgJj0gSUVFRTgwMjExX1JBVEVfVkFMOwogCiAJLyogcGljayBpbml0aWFsIHJhdGUgZnJv bSB0aGUgcmF0ZXNldCAtIEhUIG9yIG90aGVyd2lzZSAqLwpAQCAtMTg5LDcgKzE3Myw3IEBACiAJ ICAgIGFtbi0+YW1uX3JpeC0tKSB7CiAJCS8qIGxlZ2FjeSAtIGFueXRoaW5nIDwgMzZtYml0LCBz dG9wIHNlYXJjaGluZyAqLwogCQkvKiAxMW4gLSBzdG9wIGF0IE1DUzQgLyBNQ1MxMiAvIE1DUzI4 ICovCi0JCWlmIChhbXJyX25vZGVfaXNfMTFuKG5pKSAmJgorCQlpZiAoaWVlZTgwMjExX3JhdGVj dGxfbm9kZV9pczExbihuaSkgJiYKIAkJICAgIChycy0+cnNfcmF0ZXNbYW1uLT5hbW5fcml4XSAm IDB4NykgPCA0KQogCQkJYnJlYWs7CiAJCWVsc2UgaWYgKChycy0+cnNfcmF0ZXNbYW1uLT5hbW5f cml4XSAmIElFRUU4MDIxMV9SQVRFX1ZBTCkgPD0gNzIpCkBAIC0xOTgsNyArMTgyLDcgQEAKIAl9 CiAKIAkvKiBpZiB0aGUgcmF0ZSBpcyBhbiAxMW4gcmF0ZSwgZW5zdXJlIHRoZSBNQ1MgYml0IGlz IHNldCAqLwotCWlmIChhbXJyX25vZGVfaXNfMTFuKG5pKSkKKwlpZiAoaWVlZTgwMjExX3JhdGVj dGxfbm9kZV9pczExbihuaSkpCiAJCXJhdGUgfD0gSUVFRTgwMjExX1JBVEVfTUNTOwogCiAJLyog QXNzaWduIGluaXRpYWwgcmF0ZSBmcm9tIHRoZSByYXRlc2V0ICovCkBAIC0yMjYsMTQgKzIxMCw5 IEBACiAKIAlLQVNTRVJUKGlzX2Vub3VnaChhbW4pLCAoInR4Y250ICVkIiwgYW1uLT5hbW5fdHhj bnQpKTsKIAotCS8qIDExbiBvciBub3Q/IFBpY2sgdGhlIHJpZ2h0IHJhdGVzZXQgKi8KLQlpZiAo YW1ycl9ub2RlX2lzXzExbihuaSkpIHsKLQkJLyogWFhYIGV3ICovCi0JCXJzID0gKHN0cnVjdCBp ZWVlODAyMTFfcmF0ZXNldCAqKSAmbmktPm5pX2h0cmF0ZXM7Ci0JfSBlbHNlIHsKLQkJcnMgPSAm bmktPm5pX3JhdGVzOwotCX0KKwlycyA9IGllZWU4MDIxMV9yYXRlY3RsX2dldF9yYXRlc2V0KG5p KTsKIAorCiAJSUVFRTgwMjExX05PVEUobmktPm5pX3ZhcCwgSUVFRTgwMjExX01TR19SQVRFQ1RM LCBuaSwKIAkgICAgIkFNUlI6IGN1cnJlbnQgcmF0ZSAlZCwgdHhjbnQ9JWQsIHJldHJ5Y250PSVk IiwKIAkgICAgcnMtPnJzX3JhdGVzW3JpeF0gJiBJRUVFODAyMTFfUkFURV9WQUwsCkBAIC0zMDQs MTMgKzI4Myw3IEBACiAJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlc2V0ICpycyA9IE5VTEw7 CiAJaW50IHJpeDsKIAotCS8qIDExbiBvciBub3Q/IFBpY2sgdGhlIHJpZ2h0IHJhdGVzZXQgKi8K LQlpZiAoYW1ycl9ub2RlX2lzXzExbihuaSkpIHsKLQkJLyogWFhYIGV3ICovCi0JCXJzID0gKHN0 cnVjdCBpZWVlODAyMTFfcmF0ZXNldCAqKSAmbmktPm5pX2h0cmF0ZXM7Ci0JfSBlbHNlIHsKLQkJ cnMgPSAmbmktPm5pX3JhdGVzOwotCX0KKwlycyA9IGllZWU4MDIxMV9yYXRlY3RsX2dldF9yYXRl c2V0KG5pKTsKIAogCWlmIChpc19lbm91Z2goYW1uKSAmJiAodGlja3MgLSBhbW4tPmFtbl90aWNr cykgPiBhbXJyLT5hbXJyX2ludGVydmFsKSB7CiAJCXJpeCA9IGFtcnJfdXBkYXRlKGFtcnIsIGFt biwgbmkpOwpAQCAtMzE4LDcgKzI5MSw3IEBACiAJCQkvKiB1cGRhdGUgcHVibGljIHJhdGUgKi8K IAkJCW5pLT5uaV90eHJhdGUgPSBycy0+cnNfcmF0ZXNbcml4XTsKIAkJCS8qIFhYWCBzdHJpcCBi YXNpYyByYXRlIGZsYWcgZnJvbSB0eHJhdGUsIGlmIG5vbi0xMW4gKi8KLQkJCWlmIChhbXJyX25v ZGVfaXNfMTFuKG5pKSkKKwkJCWlmIChpZWVlODAyMTFfcmF0ZWN0bF9ub2RlX2lzMTFuKG5pKSkK IAkJCQluaS0+bmlfdHhyYXRlIHw9IElFRUU4MDIxMV9SQVRFX01DUzsKIAkJCWVsc2UKIAkJCQlu aS0+bmlfdHhyYXRlICY9IElFRUU4MDIxMV9SQVRFX1ZBTDsKQEAgLTMzOCwxMSArMzExLDE3IEBA CiBzdGF0aWMgdm9pZAogYW1ycl90eF9jb21wbGV0ZShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFw ICp2YXAsCiAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgaW50IG9rLAotICAg IHZvaWQgKmFyZzEsIHZvaWQgKmFyZzIgX191bnVzZWQpCisgICAgdm9pZCAqYXJnMSwgdm9pZCAq YXJnMikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2FtcnJfbm9kZSAqYW1uID0gbmktPm5pX3JjdGxz OwogCWludCByZXRyaWVzID0gKihpbnQgKilhcmcxOwogCisJLyogWFhYIG5lZWQgdG8gY2hhbmdl IGFyZzIgdG8gcG9pbnRlciBvZiBpZWVlODAyMTFfcmNfaW5mbyAqLworCXN0cnVjdCBpZWVlODAy MTFfcmNfaW5mbyAqcmNfaW5mbyA9IChzdHJ1Y3QgaWVlZTgwMjExX3JjX2luZm8qKWFyZzI7CisK KwkvKiB1cGRhdGUgcGVyIHZhcCBzdGF0aXN0aWNzICovCisJaWVlZTgwMjExX3JhdGVjdGxfdXBk YXRlX3N0YXQodmFwLCByY19pbmZvKTsKKwogCWFtbi0+YW1uX3R4Y250Kys7CiAJaWYgKG9rKQog CQlhbW4tPmFtbl9zdWNjZXNzKys7CkluZGV4OiBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3JhdGVj dGwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09Ci0tLSBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3JhdGVjdGwuaAkocmV2 aXNpb24gMjU0ODI2KQorKysgc3lzL25ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsLmgJKHdvcmtp bmcgY29weSkKQEAgLTEsNSArMSw2IEBACiAvKi0KICAqIENvcHlyaWdodCAoYykgMjAxMCBSdWkg UGF1bG8gPHJwYXVsb0BGcmVlQlNELm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAxMyBDaGVuY2hv bmcgUWluIDxjY3FpbkBGcmVlQlNELm9yZz4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgog ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0 aCBvciB3aXRob3V0CkBAIC0yNCw2ICsyNSw4IEBACiAgKgogICogJEZyZWVCU0QkCiAgKi8KKyNp Zm5kZWYgX05FVDgwMjExX0lFRUU4MDIxMV9SQVRFQ1RMX0hfCisjZGVmaW5lIF9ORVQ4MDIxMV9J RUVFODAyMTFfUkFURUNUTF9IXwogCiBlbnVtIGllZWU4MDIxMV9yYXRlYWxncyB7CiAJSUVFRTgw MjExX1JBVEVDVExfQU1SUgkJPSAwLApAQCAtMzcsMTUgKzQwLDkxIEBACiAjZGVmaW5lCUlFRUU4 MDIxMV9SQVRFQ1RMX1RYX1NVQ0NFU1MJMQogI2RlZmluZQlJRUVFODAyMTFfUkFURUNUTF9UWF9G QUlMVVJFCTAKIAorI2RlZmluZQlJRUVFODAyMTFfUkFURUNUTF9UUlVFCQkxCisjZGVmaW5lCUlF RUU4MDIxMV9SQVRFQ1RMX0ZBTFNFCQkwCisKKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfTlVN CQk0CisKKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfRkxBR19EUwkJMHgwMQkvKiBkdWFsLXN0 cmVhbSByYXRlICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0ZMQUdfQ1c0MAkJMHgwMgkv KiB1c2UgSFQ0MCAqLworI2RlZmluZQlJRUVFODAyMTFfUkFURUNUTF9GTEFHX1NHSQkJMHgwNAkv KiB1c2Ugc2hvcnQtR0kgKi8KKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfRkxBR19IVAkJMHgw OAkvKiB1c2UgSFQgKi8KKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfRkxBR19SVFNDVFMJMHgx MAkvKiBlbmFibGUgUlRTL0NUUyBwcm90ZWN0aW9uICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRF Q1RMX0ZMQUdfU1RCQwkJMHgyMAkvKiBlbmFibGUgU1RCQyAqLworI2RlZmluZQlJRUVFODAyMTFf UkFURUNUTF9GTEFHX1RTCQkweDQwCS8qIHRyaXBsZS1zdHJlYW0gcmF0ZSAqLworCisvKiBIYXJk d2FyZSBDQVBzIG9mZmVyZWQgdG8gcmF0ZSBjb250cm9sIGFsZ28gKi8KKyNkZWZpbmUJSUVFRTgw MjExX1JBVEVDVExfQ0FQX01SUgkJCTB4MDEJLyogc3VwcG9ydCBNUlIgKi8KKyNkZWZpbmUJSUVF RTgwMjExX1JBVEVDVExfQ0FQX01SUlBST1QJCTB4MDIJLyogc3VwcG9ydCBNUlIgKyBwcm90ZWN0 ICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NVUxUWENIQUlOCTB4MDQJLyogaGFz IG1vcmUgdGhhbiAxIHR4Y2hhaW4gKi8KKworI2RlZmluZSBJU19WQVBfSFQodmFwKQkoKHZhcCkt Pml2X2h0Y2FwcyAmIElFRUU4MDIxMV9IVENfSFQpCisjZGVmaW5lIElTX0hUX1JBVEUoX3JhdGUp ICAgKChfcmF0ZSkgJiAweDgwKQorI2RlZmluZSBIVF9SQ18yX01DUyhfcmMpICAgICgoX3JjKSAm IDB4N2YpCisjZGVmaW5lIEhUX1JDXzJfU1RSRUFNUyhfcmMpICAgICgoKChfcmMpICYgMHg3OCkg Pj4gMykgKyAxKQorCitleHRlcm4gaW50IG1heF80bXNfZnJhbWVsZW5bNF1bMzJdOworCitzdHJ1 Y3QgaWVlZTgwMjExX3JjX3NlcmllcyB7CisJdWludDhfdCByaXg7CQkvKiByYXRldGFibGUgaW5k ZXgsIG5vdCByYXRlIGNvZGUgKi8KKwl1aW50OF90IHJhdGVjb2RlOwkvKiBoYXJkd2FyZSByYXRl IGNvZGUgKi8KKwl1aW50OF90IHRyaWVzOworCXVpbnQ4X3QgdHhfcG93ZXJfY2FwOworCXVpbnQx Nl90IGZsYWdzOworCXVpbnQxNl90IG1heDRtc2ZyYW1lbGVuOworfTsKKworc3RydWN0IGllZWU4 MDIxMV9yY19pbmZvIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JjX3NlcmllcyBpcmlfcmNbSUVFRTgw MjExX1JBVEVDVExfTlVNXTsKKwlpbnQgaXJpX2ZyYW1lbGVuOworCWludCBpcmlfc2hvcnRQcmVh bWJsZTsKKworCS8qIFRYIGluZm8gKi8KKwlpbnQgaXJpX3N1Y2Nlc3M7CS8qIFRYIHN1Y2Nlc3Mg b3Igbm90ICovCisJaW50IGlyaV9va2NudDsJCS8qIFRYIG9rIHdpdGggb3Igd2l0aG91dCByZXRy eSAqLworCWludCBpcmlfZmFpbGNudDsJLyogVFggcmV0cnktZmFpbCBjb3VudCAqLworCWludCBp cmlfdHhjbnQ7CQkvKiBUWCBjb3VudCAqLworCWludCBpcmlfcmV0cnljbnQ7CS8qIFRYIHJldHJ5 IGNvdW50ICovCisJaW50IGlyaV9zaG9ydHJldHJ5OworCWludCBpcmlfbG9uZ3JldHJ5OworCWlu dCBpcmlfZmluYWx0c2k7CisJaW50IGlyaV90eHJhdGU7CQkvKiBodyB0eCByYXRlICovCit9Owor CisvKiBuZXQ4MDIxMSByYXRlY3RsIHN0YXRpc3RpY3MuIAorICogcGVyIHZhcCByYXRlY3RsIHNl ZXRpbmcgbXVzdCBzdGFydCB3aXRoIHRoaXMgY29tbW9uIHN0YXRlCisgKi8KK3N0cnVjdCBpZWVl ODAyMTFfcmNfc3RhdCB7CisJdWludDMyX3QgaXJzX2NhcGFiaWxpdGllczsJCS8qIGhhcmR3YXJl IGNhcGFiaWxpdGllcyBvZmZlcmVkIHRvIHJjICovCisKKwkvKiByYXRlY3RsIHN0YXRpc3RpY3Mg Ki8KKwl1aW50MzJfdCBpcnNfdHhjbnQ7CisJdWludDMyX3QgaXJzX2ZhaWxjbnQ7CisJdWludDMy X3QgaXJzX3JldHJ5Y250OworCXVpbnQzMl90IGlyc19zaG9ydHJldHJ5OworCXVpbnQzMl90IGly c19sb25ncmV0cnk7Cit9OworCisjZGVmaW5lIElFRUU4MDIxMV9SQVRFQ1RMX1NUQVQoX3ZhcCkg XAorCSgoc3RydWN0IGllZWU4MDIxMV9yY19zdGF0ICopKChfdmFwKS0+aXZfcnMpKQorCisjZGVm aW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0hBU0NBUF9NUlIoX3ZhcCkgXAorCShJRUVFODAyMTFfUkFU RUNUTF9TVEFUKF92YXApLT5pcnNfY2FwYWJpbGl0aWVzICYgSUVFRTgwMjExX1JBVEVDVExfQ0FQ X01SUikKKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfSEFTQ0FQX01SUlBST1QoX3ZhcCkgXAor CShJRUVFODAyMTFfUkFURUNUTF9TVEFUKF92YXApLT5pcnNfY2FwYWJpbGl0aWVzICYgSUVFRTgw MjExX1JBVEVDVExfQ0FQX01SUlBST1QpCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0hBU0NB UF9NVUxUWENIQUlOKF92YXApIFwKKwkoSUVFRTgwMjExX1JBVEVDVExfU1RBVChfdmFwKS0+aXJz X2NhcGFiaWxpdGllcyAmIElFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NVUxUWENIQUlOKQorCiBzdHJ1 Y3QgaWVlZTgwMjExX3JhdGVjdGwgewogCWNvbnN0IGNoYXIgKmlyX25hbWU7CiAJaW50CSgqaXJf YXR0YWNoKShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICopOwogCXZvaWQJKCppcl9kZXRhY2gp KGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKik7Ci0Jdm9pZAkoKmlyX2luaXQpKHN0cnVjdCBp ZWVlODAyMTF2YXAgKik7CisJdm9pZAkoKmlyX2luaXQpKHN0cnVjdCBpZWVlODAyMTF2YXAgKiwg dWludDMyX3QpOwogCXZvaWQJKCppcl9kZWluaXQpKHN0cnVjdCBpZWVlODAyMTF2YXAgKik7CiAJ dm9pZAkoKmlyX25vZGVfaW5pdCkoc3RydWN0IGllZWU4MDIxMV9ub2RlICopOwogCXZvaWQJKCpp cl9ub2RlX2RlaW5pdCkoc3RydWN0IGllZWU4MDIxMV9ub2RlICopOwogCWludAkoKmlyX3JhdGUp KHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqLCB2b2lkICosIHVpbnQzMl90KTsKKwl2b2lkCSgqaXJf cmF0ZXMpKHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqLCBzdHJ1Y3QgaWVlZTgwMjExX3JjX2luZm8g Kik7CiAJdm9pZAkoKmlyX3R4X2NvbXBsZXRlKShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICos CiAJICAgIAkJCSAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICosIGludCwKIAkgICAgCQkJ ICB2b2lkICosIHZvaWQgKik7CkBAIC01Nyw4ICsxMzYsMTAgQEAKIAogdm9pZAlpZWVlODAyMTFf cmF0ZWN0bF9yZWdpc3RlcihpbnQsIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZWN0bCAqKTsK IHZvaWQJaWVlZTgwMjExX3JhdGVjdGxfdW5yZWdpc3RlcihpbnQpOwotdm9pZAlpZWVlODAyMTFf cmF0ZWN0bF9pbml0KHN0cnVjdCBpZWVlODAyMTF2YXAgKik7Cit2b2lkCWllZWU4MDIxMV9yYXRl Y3RsX2luaXQoc3RydWN0IGllZWU4MDIxMXZhcCAqLCB1aW50MzJfdCk7CiB2b2lkCWllZWU4MDIx MV9yYXRlY3RsX3NldChzdHJ1Y3QgaWVlZTgwMjExdmFwICosIGludCk7Cit2b2lkCWllZWU4MDIx MV9yYXRlY3RsX2NvbXBsZXRlX3JjZmxhZ3Moc3RydWN0IGllZWU4MDIxMV9ub2RlICosIAorCQkJ CQkJc3RydWN0IGllZWU4MDIxMV9yY19pbmZvKik7CiAKIE1BTExPQ19ERUNMQVJFKE1fODAyMTFf UkFURUNUTCk7CiAKQEAgLTkzLDYgKzE3NCwxNSBAQAogfQogCiBzdGF0aWMgdm9pZCBfX2lubGlu ZQoraWVlZTgwMjExX3JhdGVjdGxfcmF0ZXMoc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgc3Ry dWN0IGllZWU4MDIxMV9yY19pbmZvICpyY19pbmZvKQoreworCWNvbnN0IHN0cnVjdCBpZWVlODAy MTF2YXAgKnZhcCA9IG5pLT5uaV92YXA7CisKKwl2YXAtPml2X3JhdGUtPmlyX3JhdGVzKG5pLCBy Y19pbmZvKTsKKwlpZWVlODAyMTFfcmF0ZWN0bF9jb21wbGV0ZV9yY2ZsYWdzKG5pLCByY19pbmZv KTsKK30KKworc3RhdGljIHZvaWQgX19pbmxpbmUKIGllZWU4MDIxMV9yYXRlY3RsX3R4X2NvbXBs ZXRlKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCwKICAgICBjb25zdCBzdHJ1Y3QgaWVl ZTgwMjExX25vZGUgKm5pLCBpbnQgc3RhdHVzLCB2b2lkICphcmcxLCB2b2lkICphcmcyKQogewpA QCAtMTE1LDMgKzIwNSw3MSBAQAogCQlyZXR1cm47CiAJdmFwLT5pdl9yYXRlLT5pcl9zZXRpbnRl cnZhbCh2YXAsIG1zZWNzKTsKIH0KKworc3RhdGljIGludCBfX2lubGluZQoraWVlZTgwMjExX3Jh dGVjdGxfaGFzY2FwX2N3NDAoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAorCQljb25z dCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQoreworCXJldHVybiBJU19WQVBfSFQodmFwKSAm JiAobmktPm5pX2NodyA9PSA0MCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbmxpbmUKK2llZWU4MDIx MV9yYXRlY3RsX2hhc2NhcF9zaG9ydGdpKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCwK KwkJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSkKK3sKKwlpZiAoSVNfVkFQX0hUKHZh cCkpCisJeworCQlpZiAobmktPm5pX2NodyA9PSA0MCAmJgorCQkJCXZhcC0+aXZfaHRjYXBzICYg SUVFRTgwMjExX0hUQ0FQX1NIT1JUR0k0MCAmJgorCQkJCW5pLT5uaV9odGNhcCAmIElFRUU4MDIx MV9IVENBUF9TSE9SVEdJNDApCisJCQlyZXR1cm4gSUVFRTgwMjExX1JBVEVDVExfVFJVRTsKKwor CQlpZiAobmktPm5pX2NodyA9PSAyMCAmJgorCQkJCXZhcC0+aXZfaHRjYXBzICYgSUVFRTgwMjEx X0hUQ0FQX1NIT1JUR0kyMCAmJgorCQkJCW5pLT5uaV9odGNhcCAmIElFRUU4MDIxMV9IVENBUF9T SE9SVEdJMjApCisJCQlyZXR1cm4gSUVFRTgwMjExX1JBVEVDVExfVFJVRTsKKwl9CisJcmV0dXJu IElFRUU4MDIxMV9SQVRFQ1RMX0ZBTFNFOworfQorCisKK3N0YXRpYyBpbnQgX19pbmxpbmUKK2ll ZWU4MDIxMV9yYXRlY3RsX2hhc2NhcF9zdGJjKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZh cCwKKwkJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSkKK3sKKyAgIHJldHVybiBJU19W QVBfSFQodmFwKSAmJiAodmFwLT5pdl9odGNhcHMgJiBJRUVFODAyMTFfSFRDQVBfVFhTVEJDKSAm JgorCQkJICAgIChuaS0+bmlfaHRjYXAgJiBJRUVFODAyMTFfSFRDQVBfUlhTVEJDXzFTVFJFQU0p ICYmCisJCQkgICAgSUVFRTgwMjExX1JBVEVDVExfSEFTQ0FQX01VTFRYQ0hBSU4odmFwKTsKK30K Kworc3RhdGljIGludCBfX2lubGluZQoraWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pczExbihjb25z dCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQoreworCWlmIChuaS0+bmlfY2hhbiA9PSBOVUxM KQorCQlyZXR1cm4gKDApOworCWlmIChuaS0+bmlfY2hhbiA9PSBJRUVFODAyMTFfQ0hBTl9BTllD KQorCQlyZXR1cm4gKDApOworCXJldHVybiAoSUVFRTgwMjExX0lTX0NIQU5fSFQobmktPm5pX2No YW4pKTsKK30KKworX19pbmxpbmUgc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZXNl dCAqCitpZWVlODAyMTFfcmF0ZWN0bF9nZXRfcmF0ZXNldChjb25zdCBzdHJ1Y3QgaWVlZTgwMjEx X25vZGUgKm5pKQoreworCXJldHVybiBpZWVlODAyMTFfcmF0ZWN0bF9ub2RlX2lzMTFuKG5pKSA/ IAorCQkJCShzdHJ1Y3QgaWVlZTgwMjExX3JhdGVzZXQgKikgJm5pLT5uaV9odHJhdGVzIDoKKwkJ CQkmbmktPm5pX3JhdGVzOworfQorCitzdGF0aWMgdm9pZCBfX2lubGluZQoraWVlZTgwMjExX3Jh dGVjdGxfdXBkYXRlX3N0YXQoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAorCQljb25z dCBzdHJ1Y3QgaWVlZTgwMjExX3JjX2luZm8gKnJjX2luZm8pCit7CisJc3RydWN0IGllZWU4MDIx MV9yY19zdGF0ICogaXJzID0gSUVFRTgwMjExX1JBVEVDVExfU1RBVCh2YXApOworCWlycy0+aXJz X3R4Y250ICs9IHJjX2luZm8tPmlyaV90eGNudDsKKwlpcnMtPmlyc19mYWlsY250ICs9IHJjX2lu Zm8tPmlyaV9mYWlsY250OworCWlycy0+aXJzX3JldHJ5Y250ICs9IHJjX2luZm8tPmlyaV9yZXRy eWNudDsKKwlpcnMtPmlyc19zaG9ydHJldHJ5ICs9IHJjX2luZm8tPmlyaV9zaG9ydHJldHJ5Owor CWlycy0+aXJzX2xvbmdyZXRyeSArPSByY19pbmZvLT5pcmlfbG9uZ3JldHJ5OworfQorCisjZW5k aWYKSW5kZXg6IHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfYW1yci5oCj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5 cy9uZXQ4MDIxMS9pZWVlODAyMTFfYW1yci5oCShyZXZpc2lvbiAyNTQ4MjYpCisrKyBzeXMvbmV0 ODAyMTEvaWVlZTgwMjExX2FtcnIuaAkod29ya2luZyBjb3B5KQpAQCAtMjAsNiArMjAsNyBAQAog I2lmbmRlZiBfTkVUODAyMTFfSUVFRTgwMjExX0FNUlJfSF8KICNkZWZpbmUgX05FVDgwMjExX0lF RUU4MDIxMV9BTVJSX0hfCiAKKyNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5o PgogLyotCiAgKiBOYWl2ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQWRhcHRpdmUgTXVsdGkgUmF0 ZSBSZXRyeSBhbGdvcml0aG06CiAgKgpAQCAtMzUsNiArMzYsNyBAQAogc3RydWN0IGllZWU4MDIx MXZhcDsKIAogc3RydWN0IGllZWU4MDIxMV9hbXJyIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JjX3N0 YXQgYW1ycl9zdGF0OwogCXVfaW50CWFtcnJfbWluX3N1Y2Nlc3NfdGhyZXNob2xkOwogCXVfaW50 CWFtcnJfbWF4X3N1Y2Nlc3NfdGhyZXNob2xkOwogCWludAlhbXJyX2ludGVydmFsOwkJLyogdXBk YXRlIGludGVydmFsICh0aWNrcykgKi8KSW5kZXg6IHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfcmF0 ZWN0bF9ub25lLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL25ldDgwMjExL2llZWU4MDIxMV9yYXRlY3Rs X25vbmUuaAkocmV2aXNpb24gMCkKKysrIHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bF9u b25lLmgJKHJldmlzaW9uIDI1NjQ4OSkKQEAgLTAsMCArMSwzOCBAQAorLyotCisgKiBDb3B5cmln aHQgKGMpIDIwMTMgQ2hlbmNob25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5vcmc+CisgKgorICogUGVy bWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2Fy ZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50 ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlz IHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZU V0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FS UkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElN UExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBO TyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBE SVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMK KyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklU UywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9U SEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04g V0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lm bmRlZiBfTkVUODAyMTFfSUVFRTgwMjExX1JBVEVDVExfTk9ORV9IXworI2RlZmluZSBfTkVUODAy MTFfSUVFRTgwMjExX1JBVEVDVExfTk9ORV9IXworCisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgw MjExX3JhdGVjdGwuaD4KKworLyoKKyAqIFJhdGUgY29udHJvbCBzZXR0aW5ncy4KKyAqLworCitz dHJ1Y3QgaWVlZTgwMjExX25vbmUgeworCXN0cnVjdCBpZWVlODAyMTFfcmNfc3RhdCBub25lX3N0 YXQ7CisJLyogb3RoZXIgc3R1ZmZzICovCit9OworCisvKgorICogUmF0ZSBjb250cm9sIHN0YXRl IGZvciBhIGdpdmVuIG5vZGUuCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfbm9uZV9ub2RlIHsKKwlz dHJ1Y3QgaWVlZTgwMjExX25vbmUgKm5vbl9ub25lOworfTsKKworI2VuZGlmIC8qIF9ORVQ4MDIx MV9JRUVFODAyMTFfUkFURUNUTF9OT05FX0hfICovCkluZGV4OiBzeXMvbmV0ODAyMTEvaWVlZTgw MjExX3JjX3NhbXBsZS5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfcmNf c2FtcGxlLmMJKHJldmlzaW9uIDApCisrKyBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3JjX3NhbXBs ZS5jCShyZXZpc2lvbiAyNTY0NzQpCkBAIC0wLDAgKzEsMTE0MSBAQAorLyogJEZyZWVCU0Q6IGhl YWQvc3lzL2Rldi9hdGgvYXRoX3JhdGUvc2FtcGxlL3NhbXBsZS5jIDI0ODU3MyAyMDEzLTAyLTI3 IDA0OjMzOjA2WiBhZHJpYW4gJCovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IEpvaG4g Qmlja2V0CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNob25nIFFpbiA8Y2NxaW5ARnJlZUJT RC5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0 IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93 aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G VFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNT IE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP LCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZF TlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAor ICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH RVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9G SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkK KyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZF TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj aW5jbHVkZSA8c3lzL2NkZWZzLmg+CisKKyNpbmNsdWRlICJvcHRfd2xhbi5oIgorCisjaW5jbHVk ZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL2tlcm5lbC5oPgorI2luY2x1ZGUgPHN5cy9t b2R1bGUuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3N5c2N0bC5o PgorCisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0L2lmX21lZGlhLmg+CisKKyNp ZmRlZiBJTkVUCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaWZf ZXRoZXIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3Zhci5oPgor I2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9odC5oPgorI2luY2x1ZGUgPG5ldDgwMjExL2ll ZWU4MDIxMV9yYXRlY3RsLmg+CisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3JjX3NhbXBs ZS5oPgorI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9yY19zYW1wbGVfdHhzY2hlZC5oPgor CitzdGF0aWMgdm9pZAlzYW1wbGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjExdmFwICosIHVpbnQzMl90 KTsKK3N0YXRpYyB2b2lkCXNhbXBsZV9kZWluaXQoc3RydWN0IGllZWU4MDIxMXZhcCAqKTsKK3N0 YXRpYyB2b2lkCXNhbXBsZV9ub2RlX2luaXQoc3RydWN0IGllZWU4MDIxMV9ub2RlICopOworc3Rh dGljIHZvaWQJc2FtcGxlX25vZGVfZGVpbml0KHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqKTsKK3N0 YXRpYyBpbnQJc2FtcGxlX3JhdGUoc3RydWN0IGllZWU4MDIxMV9ub2RlICosIHZvaWQgKiwgdWlu dDMyX3QpOworc3RhdGljIHZvaWQJc2FtcGxlX3R4X2NvbXBsZXRlKGNvbnN0IHN0cnVjdCBpZWVl ODAyMTF2YXAgKiwKKyAgICAJCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKiwgaW50LCAK KwkJCXZvaWQgKiwgdm9pZCAqKTsKK3N0YXRpYyB2b2lkCXNhbXBsZV90eF91cGRhdGUoY29uc3Qg c3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAorCQkJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2Rl ICosIHZvaWQgKiwgdm9pZCAqLCB2b2lkICopOworc3RhdGljIHZvaWQJc2FtcGxlX3NldGludGVy dmFsKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKiwgaW50KTsKKworLyogbnVtYmVyIG9mIHJl ZmVyZW5jZXMgZnJvbSBuZXQ4MDIxMSBsYXllciAqLworc3RhdGljCWludCBucmVmcyA9IDA7CisK K3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVjdGwgc2FtcGxlID0geworCS5pcl9u YW1lCT0gInNhbXBsZSIsCisJLmlyX2F0dGFjaAk9IE5VTEwsCisJLmlyX2RldGFjaAk9IE5VTEws CisJLmlyX2luaXQJPSBzYW1wbGVfaW5pdCwKKwkuaXJfZGVpbml0CT0gc2FtcGxlX2RlaW5pdCwK KwkuaXJfbm9kZV9pbml0CT0gc2FtcGxlX25vZGVfaW5pdCwKKwkuaXJfbm9kZV9kZWluaXQJPSBz YW1wbGVfbm9kZV9kZWluaXQsCisJLmlyX3JhdGUJPSBzYW1wbGVfcmF0ZSwKKwkuaXJfcmF0ZXMJ PSBzYW1wbGVfcmF0ZXMsCisJLmlyX3R4X2NvbXBsZXRlCT0gc2FtcGxlX3R4X2NvbXBsZXRlLAor CS5pcl90eF91cGRhdGUJPSBzYW1wbGVfdHhfdXBkYXRlLAorCS5pcl9zZXRpbnRlcnZhbAk9IHNh bXBsZV9zZXRpbnRlcnZhbCwKK307CitJRUVFODAyMTFfUkFURUNUTF9NT0RVTEUoc2FtcGxlLCAx KTsKK0lFRUU4MDIxMV9SQVRFQ1RMX0FMRyhzYW1wbGUsIElFRUU4MDIxMV9SQVRFQ1RMX1NBTVBM RSwgc2FtcGxlKTsKKworc3RhdGljIHZvaWQKK3NhbXBsZV9pbml0KHN0cnVjdCBpZWVlODAyMTF2 YXAgKnZhcCwgdWludDMyX3QgY2FwYWJpbGl0aWVzKQoreworCXN0cnVjdCBpZWVlODAyMTFfc2Ft cGxlICpzYW1wbGU7CisKKwlLQVNTRVJUKHZhcC0+aXZfcnMgPT0gTlVMTCwgKCIlcyBjYWxsZWQg bXVsdGlwbGUgdGltZXMiLCBfX2Z1bmNfXykpOworCisJc2FtcGxlID0gdmFwLT5pdl9ycyA9IG1h bGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9zYW1wbGUpLAorCSAgICBNXzgwMjExX1JBVEVD VEwsIE1fTk9XQUlUfE1fWkVSTyk7CisJaWYgKHNhbXBsZSA9PSBOVUxMKSB7CisJCWlmX3ByaW50 Zih2YXAtPml2X2lmcCwgImNvdWxkbid0IGFsbG9jIHJhdGVjdGwgc3RydWN0dXJlXG4iKTsKKwkJ cmV0dXJuOworCX0KKworCXN0cnVjdCBpZWVlODAyMTFfcmNfc3RhdCAqIGlycyA9IElFRUU4MDIx MV9SQVRFQ1RMX1NUQVQodmFwKTsKKwlpcnMtPmlyc19jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRp ZXM7CisKKwlzYW1wbGUtPnNhbXBsZV9zbW9vdGhpbmdfcmF0ZSA9IDc1OwkJLyogZXdtYSBwZXJj ZW50YWdlIChbMC4uOTldKSAqLworCXNhbXBsZS0+c2FtcGxlX3Ntb290aGluZ19taW5wYWNrZXRz ID0gMTAwIC8gKDEwMCAtIHNhbXBsZS0+c2FtcGxlX3Ntb290aGluZ19yYXRlKTsKKwlzYW1wbGUt PnNhbXBsZV9yYXRlID0gMTA7CQkJLyogJXRpbWUgdG8gdHJ5IGRpZmYgdHggcmF0ZXMgKi8KKwlz YW1wbGUtPnNhbXBsZV9tYXhfc3VjY2Vzc2l2ZV9mYWlsdXJlcyA9IDM7CS8qIHRocmVzaG9sZCBm b3IgcmF0ZSBzYW1wbGluZyovCisJc2FtcGxlLT5zYW1wbGVfc3RhbGVfZmFpbHVyZV90aW1lb3V0 ID0gMTAgKiBoejsJLyogMTAgc2Vjb25kcyAqLworCXNhbXBsZS0+c2FtcGxlX21pbl9zd2l0Y2gg PSBoejsJCQkvKiAxIHNlY29uZCAqLworCXNhbXBsZV9zZXRpbnRlcnZhbCh2YXAsIDUwMCAvKiBt cyAqLyk7IAkvKiBhY3R1YWxseSBkbyBub3RoaW5nICovCisJc2FtcGxlX3N5c2N0bGF0dGFjaCh2 YXAsIHZhcC0+aXZfc3lzY3RsLCB2YXAtPml2X29pZCk7Cit9CisKK3N0YXRpYyB2b2lkCitzYW1w bGVfZGVpbml0KHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCkKK3sKKwlmcmVlKHZhcC0+aXZfcnMs IE1fODAyMTFfUkFURUNUTCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHhzY2hlZHVsZSAq bXJyX3NjaGVkdWxlc1tJRUVFODAyMTFfTU9ERV9NQVgrMl0gPSB7CisJTlVMTCwJCS8qIElFRUU4 MDIxMV9NT0RFX0FVVE8gKi8KKwlzZXJpZXNfMTFhLAkvKiBJRUVFODAyMTFfTU9ERV8xMUEgKi8K KwlzZXJpZXNfMTFnLAkvKiBJRUVFODAyMTFfTU9ERV8xMUIgKi8KKwlzZXJpZXNfMTFnLAkvKiBJ RUVFODAyMTFfTU9ERV8xMUcgKi8KKwlOVUxMLAkJLyogSUVFRTgwMjExX01PREVfRkggKi8KKwlz ZXJpZXNfMTFhLAkvKiBJRUVFODAyMTFfTU9ERV9UVVJCT19BICovCisJc2VyaWVzXzExZywJLyog SUVFRTgwMjExX01PREVfVFVSQk9fRyAqLworCXNlcmllc18xMWEsCS8qIElFRUU4MDIxMV9NT0RF X1NUVVJCT19BICovCisJc2VyaWVzXzExbmEsCS8qIElFRUU4MDIxMV9NT0RFXzExTkEgKi8KKwlz ZXJpZXNfMTFuZywJLyogSUVFRTgwMjExX01PREVfMTFORyAqLworCXNlcmllc19oYWxmLAkvKiBJ RUVFODAyMTFfTU9ERV9IQUxGICovCisJc2VyaWVzX3F1YXJ0ZXIsCS8qIElFRUU4MDIxMV9NT0RF X1FVQVJURVIgKi8KK307CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfbm9kZV9pbml0KHN0cnVjdCBp ZWVlODAyMTFfbm9kZSAqbmkpCit7CisjZGVmaW5lCVJBVEUoX2l4KQkobmktPm5pX3JhdGVzLnJz X3JhdGVzWyhfaXgpXSAmIElFRUU4MDIxMV9SQVRFX1ZBTCkKKyNkZWZpbmUJRE9UMTFSQVRFKF9p eCkJKHJ0LT5pbmZvWyhfaXgpXS5kb3QxMVJhdGUgJiBJRUVFODAyMTFfUkFURV9WQUwpCisjZGVm aW5lCU1DUyhfaXgpCShuaS0+bmlfaHRyYXRlcy5yc19yYXRlc1tfaXhdIHwgSUVFRTgwMjExX1JB VEVfTUNTKQorCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IG5pLT5uaV92YXA7CisJc3RydWN0 IGllZWU4MDIxMV9zYW1wbGUgKnNhbXBsZSA9IHZhcC0+aXZfcnM7CisJc3RydWN0IGllZWU4MDIx MV9zYW1wbGVfbm9kZSAqc2FuID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVf dGFibGUgKnJ0ID0gaWVlZTgwMjExX2dldF9yYXRldGFibGUodmFwLT5pdl9pYy0+aWNfY3VyY2hh bik7CisJZW51bSBpZWVlODAyMTFfcGh5bW9kZSBjdXJtb2RlID0gaWVlZTgwMjExX2NoYW4ybW9k ZSh2YXAtPml2X2ljLT5pY19jdXJjaGFuKTsKKwlpbnQgeCwgeSwgcml4OworCisJaWYgKG5pLT5u aV9yY3RscyA9PSBOVUxMKSB7CisJCW5pLT5uaV9yY3RscyA9IHNhbiA9IG1hbGxvYyhzaXplb2Yo c3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSksCisJCSAgICBNXzgwMjExX1JBVEVDVEwsIE1f Tk9XQUlUfE1fWkVSTyk7CisJCWlmIChzYW4gPT0gTlVMTCkgeworCQkJaWZfcHJpbnRmKHZhcC0+ aXZfaWZwLCAiY291bGRuJ3QgYWxsb2MgcGVyLW5vZGUgcmF0ZWN0bCAiCisJCQkgICAgInN0cnVj dHVyZVxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UKKwkJc2FuID0gbmktPm5pX3JjdGxz OworCQorCXNhbi0+c2FuX3NhbXBsZSA9IHNhbXBsZTsKKworCUtBU1NFUlQocnQgIT0gTlVMTCwg KCJubyByYXRlIHRhYmxlLCBtb2RlICV1IiwgY3VybW9kZSkpOworCisJc2FuLT5zY2hlZCA9IG1y cl9zY2hlZHVsZXNbY3VybW9kZV07CisJS0FTU0VSVChzYW4tPnNjaGVkICE9IE5VTEwsICgibm8g bXJyIHNjaGVkdWxlIGZvciBtb2RlICV1IiwgY3VybW9kZSkpOworCisJc2FuLT5zdGF0aWNfcml4 ID0gLTE7CisJc2FtcGxlX3VwZGF0ZV9zdGF0aWNfcml4KG5pKTsKKworCS8qCisJICogQ29uc3Ry dWN0IGEgYml0bWFzayBvZiB1c2FibGUgcmF0ZXMuICBUaGlzIGhhcyBhbGwKKwkgKiBuZWdvdGlh dGVkIHJhdGVzIG1pbnVzIHRob3NlIG1hcmtlZCBieSB0aGUgaGFsIGFzCisJICogdG8gYmUgaWdu b3JlZCBmb3IgZG9pbmcgcmF0ZSBjb250cm9sLgorCSAqLworCXNhbi0+cmF0ZW1hc2sgPSAwOwor CisJLyogTUNTIHJhdGVzICovCisJaWYgKG5pLT5uaV9mbGFncyAmIElFRUU4MDIxMV9OT0RFX0hU KSB7CisJCWZvciAoeCA9IDA7IHggPCBuaS0+bmlfaHRyYXRlcy5yc19ucmF0ZXM7IHgrKykgewor CQkJcml4ID0gcnQtPnJhdGVDb2RlVG9JbmRleFtNQ1MoeCldOworCQkJaWYgKHJpeCA9PSAweGZm KQorCQkJCWNvbnRpbnVlOworCQkJLyogc2tpcCByYXRlcyBtYXJrZWQgYnJva2VuIGJ5IGhhbCAq LworCQkJaWYgKCFydC0+aW5mb1tyaXhdLnZhbGlkKQorCQkJCWNvbnRpbnVlOworCQkJS0FTU0VS VChyaXggPCBTQU1QTEVfTUFYUkFURVMsCisJCQkgICAgKCJtY3MgJXUgaGFzIHJpeCAlZCIsIE1D Uyh4KSwgcml4KSk7CisJCQlzYW4tPnJhdGVtYXNrIHw9ICh1aW50NjRfdCkgMTw8cml4OworCQl9 CisJfQorCisJLyogTGVnYWN5IHJhdGVzICovCisJZm9yICh4ID0gMDsgeCA8IG5pLT5uaV9yYXRl cy5yc19ucmF0ZXM7IHgrKykgeworCQlyaXggPSBydC0+cmF0ZUNvZGVUb0luZGV4W1JBVEUoeCld OworCQlpZiAocml4ID09IDB4ZmYpCisJCQljb250aW51ZTsKKwkJLyogc2tpcCByYXRlcyBtYXJr ZWQgYnJva2VuIGJ5IGhhbCAqLworCQlpZiAoIXJ0LT5pbmZvW3JpeF0udmFsaWQpCisJCQljb250 aW51ZTsKKwkJS0FTU0VSVChyaXggPCBTQU1QTEVfTUFYUkFURVMsCisJCSAgICAoInJhdGUgJXUg aGFzIHJpeCAlZCIsIFJBVEUoeCksIHJpeCkpOworCQlzYW4tPnJhdGVtYXNrIHw9ICh1aW50NjRf dCkgMTw8cml4OworCX0KKworCWZvciAoeSA9IDA7IHkgPCBOVU1fUEFDS0VUX1NJWkVfQklOUzsg eSsrKSB7CisJCWludCBzaXplID0gYmluX3RvX3NpemUoeSk7CisJCXVpbnQ2NF90IG1hc2s7CisK KwkJc2FuLT5wYWNrZXRzX3NlbnRbeV0gPSAwOworCQlzYW4tPmN1cnJlbnRfc2FtcGxlX3JpeFt5 XSA9IC0xOworCQlzYW4tPmxhc3Rfc2FtcGxlX3JpeFt5XSA9IDA7CisJCS8qIFhYWCBzdGFydCB3 aXRoIGZpcnN0IHZhbGlkIHJhdGUgKi8KKwkJc2FuLT5jdXJyZW50X3JpeFt5XSA9IGZmcyhzYW4t PnJhdGVtYXNrKS0xOworCQkKKwkJLyoKKwkJICogSW5pdGlhbGl6ZSB0aGUgc3RhdGlzdGljcyBi dWNrZXRzOyB0aGVzZSBhcmUKKwkJICogaW5kZXhlZCBieSB0aGUgcmF0ZSBjb2RlIGluZGV4Lgor CQkgKi8KKwkJZm9yIChyaXggPSAwLCBtYXNrID0gc2FuLT5yYXRlbWFzazsgbWFzayAhPSAwOyBy aXgrKywgbWFzayA+Pj0gMSkgeworCQkJaWYgKChtYXNrICYgMSkgPT0gMCkJCS8qIG5vdCBhIHZh bGlkIHJhdGUgKi8KKwkJCQljb250aW51ZTsKKwkJCXNhbi0+c3RhdHNbeV1bcml4XS5zdWNjZXNz aXZlX2ZhaWx1cmVzID0gMDsKKwkJCXNhbi0+c3RhdHNbeV1bcml4XS50cmllcyA9IDA7CisJCQlz YW4tPnN0YXRzW3ldW3JpeF0udG90YWxfcGFja2V0cyA9IDA7CisJCQlzYW4tPnN0YXRzW3ldW3Jp eF0ucGFja2V0c19hY2tlZCA9IDA7CisJCQlzYW4tPnN0YXRzW3ldW3JpeF0ubGFzdF90eCA9IDA7 CisJCQlzYW4tPnN0YXRzW3ldW3JpeF0uZXdtYV9wY3QgPSAwOworCQkJCisJCQlzYW4tPnN0YXRz W3ldW3JpeF0ucGVyZmVjdF90eF90aW1lID0KKwkJCSAgICBjYWxjX3VzZWNzX3VuaWNhc3RfcGFj a2V0KHZhcCwgc2l6ZSwgcml4LCAwLCAwLAorCQkJICAgIChuaS0+bmlfY2h3ID09IDQwKSk7CisJ CQlzYW4tPnN0YXRzW3ldW3JpeF0uYXZlcmFnZV90eF90aW1lID0KKwkJCSAgICBzYW4tPnN0YXRz W3ldW3JpeF0ucGVyZmVjdF90eF90aW1lOworCQl9CisJfQorCisJLyogc2V0IHRoZSB2aXNpYmxl IGJpdC1yYXRlICovCisJaWYgKHNhbi0+c3RhdGljX3JpeCAhPSAtMSkKKwkJbmktPm5pX3R4cmF0 ZSA9IERPVDExUkFURShzYW4tPnN0YXRpY19yaXgpOworCWVsc2UKKwkJbmktPm5pX3R4cmF0ZSA9 IFJBVEUoMCk7CisjdW5kZWYgUkFURQorI3VuZGVmIERPVDExUkFURQorI3VuZGVmIE1DUworfQor CitzdGF0aWMgdm9pZAorc2FtcGxlX25vZGVfZGVpbml0KHN0cnVjdCBpZWVlODAyMTFfbm9kZSAq bmkpCit7CisJZnJlZShuaS0+bmlfcmN0bHMsIE1fODAyMTFfUkFURUNUTCk7Cit9CisKK3N0YXRp YyBpbnQKK2RvdDExcmF0ZShjb25zdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQsIGludCByaXgp Cit7CisJaWYgKHJpeCA8IDApCisJCXJldHVybiAtMTsKKwlyZXR1cm4gcnQtPmluZm9bcml4XS5w aHkgPT0gSUVFRTgwMjExX1RfSFQgPworCSAgICBydC0+aW5mb1tyaXhdLmRvdDExUmF0ZSA6IChy dC0+aW5mb1tyaXhdLmRvdDExUmF0ZSAmIElFRUU4MDIxMV9SQVRFX1ZBTCkgLyAyOworfQorCitz dGF0aWMgY29uc3QgY2hhciAqCitkb3QxMXJhdGVfbGFiZWwoY29uc3QgaWVlZTgwMjExX3JhdGVf dGFibGUgKnJ0LCBpbnQgcml4KQoreworCWlmIChyaXggPCAwKQorCQlyZXR1cm4gIiI7CisJcmV0 dXJuIHJ0LT5pbmZvW3JpeF0ucGh5ID09IElFRUU4MDIxMV9UX0hUID8gIk1DUyIgOiAiTWIgIjsK K30KKworLyoKKyAqIFJldHVybiB0aGUgcml4IHdpdGggdGhlIGxvd2VzdCBhdmVyYWdlX3R4X3Rp bWUsCisgKiBvciAtMSBpZiBhbGwgdGhlIGF2ZXJhZ2VfdHhfdGltZXMgYXJlIDAuCisgKi8KK3N0 YXRpYyBfX2lubGluZSBpbnQKK3BpY2tfYmVzdF9yYXRlKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFf bm9kZSAqbmksIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQsCisgICAgaW50 IHNpemVfYmluLCBpbnQgcmVxdWlyZV9hY2tlZF9iZWZvcmUpCit7CisJc3RydWN0IGllZWU4MDIx MV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxzOworICAgIGludCBiZXN0X3JhdGVfcml4 LCBiZXN0X3JhdGVfdHQsIGJlc3RfcmF0ZV9wY3Q7CisJdWludDY0X3QgbWFzazsKKwlpbnQgcml4 LCB0dCwgcGN0OworCisgICAgYmVzdF9yYXRlX3JpeCA9IDA7CisgICAgYmVzdF9yYXRlX3R0ID0g MDsKKwliZXN0X3JhdGVfcGN0ID0gMDsKKworCWZvciAobWFzayA9IHNhbi0+cmF0ZW1hc2ssIHJp eCA9IDA7IG1hc2sgIT0gMDsgbWFzayA+Pj0gMSwgcml4KyspIHsKKwkJaWYgKChtYXNrICYgMSkg PT0gMCkJCS8qIG5vdCBhIHN1cHBvcnRlZCByYXRlICovCisJCQljb250aW51ZTsKKworCQkvKiBE b24ndCBwaWNrIGEgbm9uLUhUIHJhdGUgZm9yIGEgSFQgbm9kZSAqLworCQlpZiAoKG5pLT5uaV9m bGFncyAmIElFRUU4MDIxMV9OT0RFX0hUKSAmJgorCQkgICAgKHJ0LT5pbmZvW3JpeF0ucGh5ICE9 IElFRUU4MDIxMV9UX0hUKSkgeworCQkJY29udGludWU7CisJCX0KKworCQl0dCA9IHNhbi0+c3Rh dHNbc2l6ZV9iaW5dW3JpeF0uYXZlcmFnZV90eF90aW1lOworCQlpZiAodHQgPD0gMCB8fAorCQkg ICAgKHJlcXVpcmVfYWNrZWRfYmVmb3JlICYmCisJCSAgICAgIXNhbi0+c3RhdHNbc2l6ZV9iaW5d W3JpeF0ucGFja2V0c19hY2tlZCkpCisJCQljb250aW51ZTsKKworCQkvKiBDYWxjdWxhdGUgcGVy Y2VudGFnZSBpZiBwb3NzaWJsZSAqLworCQlpZiAoc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4XS50 b3RhbF9wYWNrZXRzID4gMCkgeworCQkJcGN0ID0gc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4XS5l d21hX3BjdDsKKwkJfSBlbHNlIHsKKwkJCS8qIFhYWCBmb3Igbm93LCBhc3N1bWUgOTUlIG9rICov CisJCQlwY3QgPSA5NTsKKwkJfQorCisJCS8qIGRvbid0IHVzZSBhIGJpdC1yYXRlIHRoYXQgaGFz IGJlZW4gZmFpbGluZyAqLworCQlpZiAoc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4XS5zdWNjZXNz aXZlX2ZhaWx1cmVzID4gMykKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIEZvciBIVCwgRG9u J3QgdXNlIGEgYml0IHJhdGUgdGhhdCBpcyBtdWNoIG1vcmUKKwkJICogbG9zc3kgdGhhbiB0aGUg YmVzdC4KKwkJICoKKwkJICogWFhYIHRoaXMgaXNuJ3Qgb3B0aW1hbDsgaXQncyBqdXN0IGRlc2ln bmVkIHRvCisJCSAqIGVsaW1pbmF0ZSByYXRlcyB0aGF0IGFyZSBnb2luZyB0byBiZSBvYnZpb3Vz bHkKKwkJICogd29yc2UuCisJCSAqLworCQlpZiAobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05P REVfSFQpIHsKKwkJCWlmIChiZXN0X3JhdGVfcGN0ID4gKHBjdCArIDUwKSkKKwkJCQljb250aW51 ZTsKKwkJfQorCisJCS8qCisJCSAqIEZvciBub24tTUNTIHJhdGVzLCB1c2UgdGhlIGN1cnJlbnQg YXZlcmFnZSB0eHRpbWUgZm9yCisJCSAqIGNvbXBhcmlzb24uCisJCSAqLworCQlpZiAoISAobmkt Pm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpKSB7CisJCQlpZiAoYmVzdF9yYXRlX3R0ID09 IDAgfHwgdHQgPD0gYmVzdF9yYXRlX3R0KSB7CisJCQkJYmVzdF9yYXRlX3R0ID0gdHQ7CisJCQkJ YmVzdF9yYXRlX3JpeCA9IHJpeDsKKwkJCQliZXN0X3JhdGVfcGN0ID0gcGN0OworCQkJfQorCQl9 CisKKwkJLyoKKwkJICogU2luY2UgMiBzdHJlYW0gcmF0ZXMgaGF2ZSBzbGlnaHRseSBoaWdoZXIg VFggdGltZXMsCisJCSAqIGFsbG93IGEgbGl0dGxlIGJpdCBvZiBsZWV3YXkuIFRoaXMgc2hvdWxk IGxhdGVyCisJCSAqIGJlIGFic3RyYWN0ZWQgb3V0IGFuZCBwcm9wZXJseSBoYW5kbGVkLgorCQkg Ki8KKwkJaWYgKG5pLT5uaV9mbGFncyAmIElFRUU4MDIxMV9OT0RFX0hUKSB7CisJCQlpZiAoYmVz dF9yYXRlX3R0ID09IDAgfHwgKHR0ICogOCA8PSBiZXN0X3JhdGVfdHQgKiAxMCkpIHsKKwkJCQli ZXN0X3JhdGVfdHQgPSB0dDsKKwkJCQliZXN0X3JhdGVfcml4ID0gcml4OworCQkJCWJlc3RfcmF0 ZV9wY3QgPSBwY3Q7CisJCQl9CisJCX0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGJlc3Rf cmF0ZV90dCA/IGJlc3RfcmF0ZV9yaXggOiAtMSk7Cit9CisKKy8qCisgKiBQaWNrIGEgZ29vZCAi cmFuZG9tIiBiaXQtcmF0ZSB0byBzYW1wbGUgb3RoZXIgdGhhbiB0aGUgY3VycmVudCBvbmUuCisg Ki8KK3N0YXRpYyBfX2lubGluZSBpbnQKK3BpY2tfc2FtcGxlX3JhdGUoY29uc3Qgc3RydWN0IGll ZWU4MDIxMV9ub2RlICpuaSwgY29uc3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0LCAKKwlpbnQg c2l6ZV9iaW4pCit7CisjZGVmaW5lCURPVDExUkFURShpeCkJKHJ0LT5pbmZvW2l4XS5kb3QxMVJh dGUgJiBJRUVFODAyMTFfUkFURV9WQUwpCisjZGVmaW5lCU1DUyhpeCkJCShydC0+aW5mb1tpeF0u ZG90MTFSYXRlIHwgSUVFRTgwMjExX1JBVEVfTUNTKQorCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxl X25vZGUgKnNhbiA9IG5pLT5uaV9yY3RsczsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZSAqc2Ft cGxlID0gc2FuLT5zYW5fc2FtcGxlOworCWludCBjdXJyZW50X3JpeCwgcml4OworCXVuc2lnbmVk IGN1cnJlbnRfdHQ7CisJdWludDY0X3QgbWFzazsKKwkKKwljdXJyZW50X3JpeCA9IHNhbi0+Y3Vy cmVudF9yaXhbc2l6ZV9iaW5dOworCWlmIChjdXJyZW50X3JpeCA8IDApIHsKKwkJLyogbm8gc3Vj Y2Vzc2VzIHlldCwgc2VuZCBhdCB0aGUgbG93ZXN0IGJpdC1yYXRlICovCisJCS8qIFhYWCBzaG91 bGQgcmV0dXJuIE1DUzAgaWYgSFQgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJY3VycmVudF90dCA9 IHNhbi0+c3RhdHNbc2l6ZV9iaW5dW2N1cnJlbnRfcml4XS5hdmVyYWdlX3R4X3RpbWU7CisKKwly aXggPSBzYW4tPmxhc3Rfc2FtcGxlX3JpeFtzaXplX2Jpbl0rMTsJLyogbmV4dCBzYW1wbGUgcmF0 ZSAqLworCW1hc2sgPSBzYW4tPnJhdGVtYXNrICZ+ICgodWludDY0X3QpIDE8PGN1cnJlbnRfcml4 KTsvKiBkb24ndCBzYW1wbGUgY3VycmVudCByYXRlICovCisJd2hpbGUgKG1hc2sgIT0gMCkgewor CQlpZiAoKG1hc2sgJiAoKHVpbnQ2NF90KSAxPDxyaXgpKSA9PSAwKSB7CS8qIG5vdCBhIHN1cHBv cnRlZCByYXRlICovCisJbmV4dHJhdGU6CisJCQlpZiAoKytyaXggPj0gcnQtPnJhdGVDb3VudCkK KwkJCQlyaXggPSAwOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBUaGUgZm9sbG93 aW5nIGNvZGUgc3RvcHMgdHJ5aW5nIHRvIHNhbXBsZQorCQkgKiBub24tTUNTIHJhdGVzIHdoZW4g c3BlYWtpbmcgdG8gYW4gTUNTIG5vZGUuCisJCSAqIEhvd2V2ZXIsIGF0IGxlYXN0IGZvciBDQ0sg cmF0ZXMgaW4gMi40R0h6IG1vZGUsCisJCSAqIHRoZSBub24tTUNTIHJhdGVzIE1BWSBhY3R1YWxs eSBwcm92aWRlIGJldHRlcgorCQkgKiBQRVIgYXQgdGhlIHZlcnkgZmFyIGVkZ2Ugb2YgcmVjZXB0 aW9uLgorCQkgKgorCQkgKiBIb3dldmVyISBVbnRpbCBhdGhfcmF0ZV9mb3JtX2FnZ3IoKSBncm93 cworCQkgKiBzb21lIGxvZ2ljIHRvIG5vdCBmb3JtIGFnZ3JlZ2F0ZXMgaWYgdGhlCisJCSAqIHNl bGVjdGVkIHJhdGUgaXMgbm9uLU1DUywgdGhpcyB3b24ndCB3b3JrLgorCQkgKgorCQkgKiBTbyBk b24ndCBkaXNhYmxlIHRoaXMgY29kZSB1bnRpbCB5b3UndmUgdGF1Z2h0CisJCSAqIGF0aF9yYXRl X2Zvcm1fYWdncigpIHRvIGRyb3Agb3V0IGlmIGFueSBvZgorCQkgKiB0aGUgc2VsZWN0ZWQgcmF0 ZXMgYXJlIG5vbi1NQ1MuCisJCSAqLworI2lmIDEKKwkJLyogaWYgdGhlIG5vZGUgaXMgSFQgYW5k IHRoZSByYXRlIGlzbid0IEhULCBkb24ndCBib3RoZXIgc2FtcGxlICovCisJCWlmICgobmktPm5p X2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpICYmCisJCSAgICAocnQtPmluZm9bcml4XS5waHkg IT0gSUVFRTgwMjExX1RfSFQpKSB7CisJCQltYXNrICY9IH4oKHVpbnQ2NF90KSAxPDxyaXgpOwor CQkJZ290byBuZXh0cmF0ZTsKKwkJfQorI2VuZGlmCisKKwkJLyogdGhpcyBiaXQtcmF0ZSBpcyBh bHdheXMgd29yc2UgdGhhbiB0aGUgY3VycmVudCBvbmUgKi8KKwkJaWYgKHNhbi0+c3RhdHNbc2l6 ZV9iaW5dW3JpeF0ucGVyZmVjdF90eF90aW1lID4gY3VycmVudF90dCkgeworCQkJbWFzayAmPSB+ KCh1aW50NjRfdCkgMTw8cml4KTsKKwkJCWdvdG8gbmV4dHJhdGU7CisJCX0KKworCQkvKiByYXJl bHkgc2FtcGxlIGJpdC1yYXRlcyB0aGF0IGZhaWwgYSBsb3QgKi8KKwkJaWYgKHNhbi0+c3RhdHNb c2l6ZV9iaW5dW3JpeF0uc3VjY2Vzc2l2ZV9mYWlsdXJlcyA+IHNhbXBsZS0+c2FtcGxlX21heF9z dWNjZXNzaXZlX2ZhaWx1cmVzICYmCisJCSAgICB0aWNrcyAtIHNhbi0+c3RhdHNbc2l6ZV9iaW5d W3JpeF0ubGFzdF90eCA8IHNhbXBsZS0+c2FtcGxlX3N0YWxlX2ZhaWx1cmVfdGltZW91dCkgewor CQkJbWFzayAmPSB+KCh1aW50NjRfdCkgMTw8cml4KTsKKwkJCWdvdG8gbmV4dHJhdGU7CisJCX0K KworCQkvKgorCQkgKiBGb3IgSFQsIG9ubHkgc2FtcGxlIGEgZmV3IHJhdGVzIG9uIGVpdGhlciBz aWRlIG9mIHRoZQorCQkgKiBjdXJyZW50IHJpeDsgdGhlcmUncyBxdWl0ZSBsaWtlbHkgYSBsb3Qg b2YgdGhlbS4KKwkJICovCisJCWlmIChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkg eworCQkJaWYgKHJpeCA8IChjdXJyZW50X3JpeCAtIDMpIHx8CisJCQkgICAgcml4ID4gKGN1cnJl bnRfcml4ICsgMykpIHsKKwkJCQltYXNrICY9IH4oKHVpbnQ2NF90KSAxPDxyaXgpOworCQkJCWdv dG8gbmV4dHJhdGU7CisJCQl9CisJCX0KKworCQkvKiBEb24ndCBzYW1wbGUgbW9yZSB0aGFuIDIg cmF0ZXMgaGlnaGVyIGZvciByYXRlcyA+IDExTSBmb3Igbm9uLUhUIHJhdGVzICovCisJCWlmICgh IChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkpIHsKKwkJCWlmIChET1QxMVJBVEUo cml4KSA+IDIqMTEgJiYgcml4ID4gY3VycmVudF9yaXggKyAyKSB7CisJCQkJbWFzayAmPSB+KCh1 aW50NjRfdCkgMTw8cml4KTsKKwkJCQlnb3RvIG5leHRyYXRlOworCQkJfQorCQl9CisKKwkJc2Fu LT5sYXN0X3NhbXBsZV9yaXhbc2l6ZV9iaW5dID0gcml4OworCQlyZXR1cm4gcml4OworCX0KKwly ZXR1cm4gY3VycmVudF9yaXg7CisjdW5kZWYgRE9UMTFSQVRFCisjdW5kZWYgTUNTCit9CisKK3N0 YXRpYyBpbnQKK3NhbXBsZV9nZXRfc3RhdGljX3JpeChjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25v ZGUgKm5pKQoreworI2RlZmluZQlSQVRFKF9peCkJKG5pLT5uaV9yYXRlcy5yc19yYXRlc1soX2l4 KV0gJiBJRUVFODAyMTFfUkFURV9WQUwpCisjZGVmaW5lCU1DUyhfaXgpCShuaS0+bmlfaHRyYXRl cy5yc19yYXRlc1tfaXhdIHwgSUVFRTgwMjExX1JBVEVfTUNTKQorCXN0cnVjdCBpZWVlODAyMTF2 YXAgKnZhcCA9IG5pLT5uaV92YXA7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxl ICpydCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4pOwor CWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhwYXJhbSAqdHAgPSBuaS0+bmlfdHhwYXJtczsKKwlp bnQgc3JhdGU7CisKKwkvKiBDaGVjayBNQ1MgcmF0ZXMgKi8KKwlmb3IgKHNyYXRlID0gbmktPm5p X2h0cmF0ZXMucnNfbnJhdGVzIC0gMTsgc3JhdGUgPj0gMDsgc3JhdGUtLSkgeworCQlpZiAoTUNT KHNyYXRlKSA9PSB0cC0+dWNhc3RyYXRlKQorCQkJcmV0dXJuIHJ0LT5yYXRlQ29kZVRvSW5kZXhb dHAtPnVjYXN0cmF0ZV07CisJfQorCisJLyogQ2hlY2sgbGVnYWN5IHJhdGVzICovCisJZm9yIChz cmF0ZSA9IG5pLT5uaV9yYXRlcy5yc19ucmF0ZXMgLSAxOyBzcmF0ZSA+PSAwOyBzcmF0ZS0tKSB7 CisJCWlmIChSQVRFKHNyYXRlKSA9PSB0cC0+dWNhc3RyYXRlKQorCQkJcmV0dXJuIHJ0LT5yYXRl Q29kZVRvSW5kZXhbdHAtPnVjYXN0cmF0ZV07CisJfQorCXJldHVybiAtMTsKKyN1bmRlZglSQVRF CisjdW5kZWYJTUNTCit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfdXBkYXRlX3N0YXRpY19yaXgo c3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9u b2RlICpzYW4gPSBuaS0+bmlfcmN0bHM7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV90eHBhcmFt ICp0cCA9IG5pLT5uaV90eHBhcm1zOworCisJaWYgKHRwICE9IE5VTEwgJiYgdHAtPnVjYXN0cmF0 ZSAhPSBJRUVFODAyMTFfRklYRURfUkFURV9OT05FKSB7CisJCS8qCisJCSAqIEEgZml4ZWQgcmF0 ZSBpcyB0byBiZSB1c2VkOyB1Y2FzdHJhdGUgaXMgdGhlIElFRUUgY29kZQorCQkgKiBmb3IgdGhp cyByYXRlIChzYW5zIGJhc2ljIGJpdCkuICBDaGVjayB0aGlzIGFnYWluc3QgdGhlCisJCSAqIG5l Z290aWF0ZWQgcmF0ZSBzZXQgZm9yIHRoZSBub2RlLiAgTm90ZSB0aGUgZml4ZWQgcmF0ZQorCQkg KiBtYXkgbm90IGJlIGF2YWlsYWJsZSBmb3IgdmFyaW91cyByZWFzb25zIHNvIHdlIG9ubHkKKwkJ ICogc2V0dXAgdGhlIHN0YXRpYyByYXRlIGluZGV4IGlmIHRoZSBsb29rdXAgaXMgc3VjY2Vzc2Z1 bC4KKwkJICovCisJCXNhbi0+c3RhdGljX3JpeCA9IHNhbXBsZV9nZXRfc3RhdGljX3JpeChuaSk7 CisJfSBlbHNlIHsKKwkJc2FuLT5zdGF0aWNfcml4ID0gLTE7CisJfQorfQorCisvKgorICogUGlj ayBhIG5vbi1IVCByYXRlIHRvIGJlZ2luIHVzaW5nLgorICovCitzdGF0aWMgaW50CitzYW1wbGVf cGlja19zZWVkX3JhdGVfbGVnYWN5KGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksIGlu dCBmcmFtZUxlbikKK3sKKyNkZWZpbmUJRE9UMTFSQVRFKGl4KQkocnQtPmluZm9baXhdLmRvdDEx UmF0ZSAmIElFRUU4MDIxMV9SQVRFX1ZBTCkKKwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBu aS0+bmlfdmFwOworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUgKnNhbiA9IG5pLT5uaV9y Y3RsczsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0ID0gaWVlZTgwMjEx X2dldF9yYXRldGFibGUodmFwLT5pdl9pYy0+aWNfY3VyY2hhbik7CisJCisJY29uc3QgaW50IHNp emVfYmluID0gc2l6ZV90b19iaW4oZnJhbWVMZW4pOworCWludCByaXggPSAtMTsKKworCS8qIG5v IHBhY2tldCBoYXMgYmVlbiBzZW50IHN1Y2Nlc3NmdWxseSB5ZXQgKi8KKwlmb3IgKHJpeCA9IHJ0 LT5yYXRlQ291bnQtMTsgcml4ID4gMDsgcml4LS0pIHsKKwkJaWYgKChzYW4tPnJhdGVtYXNrICYg KCh1aW50NjRfdCkgMTw8cml4KSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIFNraXAgSFQg cmF0ZXMgKi8KKwkJaWYgKHJ0LT5pbmZvW3JpeF0ucGh5ID09IElFRUU4MDIxMV9UX0hUKQorCQkJ Y29udGludWU7CisKKwkJLyoKKwkJICogUGljayB0aGUgaGlnaGVzdCByYXRlIDw9IDM2IE1icHMK KwkJICogdGhhdCBoYXNuJ3QgZmFpbGVkLgorCQkgKi8KKwkJaWYgKERPVDExUkFURShyaXgpIDw9 IDcyICYmCisJCSAgICBzYW4tPnN0YXRzW3NpemVfYmluXVtyaXhdLnN1Y2Nlc3NpdmVfZmFpbHVy ZXMgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJpeDsKKyN1bmRlZiBET1Qx MVJBVEUKK30KKworLyoKKyAqIFBpY2sgYSBIVCByYXRlIHRvIGJlZ2luIHVzaW5nLgorICoKKyAq IERvbid0IHVzZSBhbnkgbm9uLUhUIHJhdGVzOyBvbmx5IGNvbnNpZGVyIEhUIHJhdGVzLgorICov CitzdGF0aWMgaW50CitzYW1wbGVfcGlja19zZWVkX3JhdGVfaHQoY29uc3Qgc3RydWN0IGllZWU4 MDIxMV9ub2RlICpuaSwgaW50IGZyYW1lTGVuKQoreworI2RlZmluZQlNQ1MoaXgpCQkocnQtPmlu Zm9baXhdLmRvdDExUmF0ZSB8IElFRUU4MDIxMV9SQVRFX01DUykKKwlzdHJ1Y3QgaWVlZTgwMjEx dmFwICp2YXAgPSBuaS0+bmlfdmFwOworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUgKnNh biA9IG5pLT5uaV9yY3RsczsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0 ID0gaWVlZTgwMjExX2dldF9yYXRldGFibGUodmFwLT5pdl9pYy0+aWNfY3VyY2hhbik7CisJCisJ Y29uc3QgaW50IHNpemVfYmluID0gc2l6ZV90b19iaW4oZnJhbWVMZW4pOworCWludCByaXggPSAt MSwgaHRfcml4ID0gLTE7CisKKwkvKiBubyBwYWNrZXQgaGFzIGJlZW4gc2VudCBzdWNjZXNzZnVs bHkgeWV0ICovCisJZm9yIChyaXggPSBydC0+cmF0ZUNvdW50LTE7IHJpeCA+IDA7IHJpeC0tKSB7 CisJCS8qIFNraXAgcmF0ZXMgd2UgY2FuJ3QgdXNlICovCisJCWlmICgoc2FuLT5yYXRlbWFzayAm ICgodWludDY0X3QpIDE8PHJpeCkpID09IDApCisJCQljb250aW51ZTsKKworCQkvKiBLZWVwIGEg Y29weSBvZiB0aGUgbGFzdCBzZWVuIEhUIHJhdGUgaW5kZXggKi8KKwkJaWYgKHJ0LT5pbmZvW3Jp eF0ucGh5ID09IElFRUU4MDIxMV9UX0hUKQorCQkJaHRfcml4ID0gcml4OworCisJCS8qIFNraXAg bm9uLUhUIHJhdGVzICovCisJCWlmIChydC0+aW5mb1tyaXhdLnBoeSAhPSBJRUVFODAyMTFfVF9I VCkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIFBpY2sgYSBtZWRpdW0tc3BlZWQgcmF0ZSBy ZWdhcmRsZXNzIG9mIHN0cmVhbSBjb3VudAorCQkgKiB3aGljaCBoYXMgbm90IHNlZW4gYW55IGZh aWx1cmVzLiBIaWdoZXIgcmF0ZXMgbWF5IGZhaWw7CisJCSAqIHdlJ2xsIHRyeSB0aGVtIGxhdGVy LgorCQkgKi8KKwkJaWYgKCgoTUNTKHJpeCkgJiAweDcpIDw9IDQpICYmCisJCSAgICBzYW4tPnN0 YXRzW3NpemVfYmluXVtyaXhdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMgPT0gMCkgeworCQkJYnJlYWs7 CisJCX0KKwl9CisKKwkvKgorCSAqIElmIGFsbCB0aGUgTUNTIHJhdGVzIGhhdmUgc3VjY2Vzc2l2 ZSBmYWlsdXJlcywgcml4IHNob3VsZCBiZQorCSAqID4gMDsgb3RoZXJ3aXNlIHVzZSB0aGUgbG93 ZXN0IE1DUyByaXggKGhvcGVmdWxseSBNQ1MgMC4pCisJICovCisJcmV0dXJuIE1BWChyaXgsIGh0 X3JpeCk7CisjdW5kZWYgTUNTCit9CisKK3N0YXRpYyBpbnQKK3NhbXBsZV9yYXRlKHN0cnVjdCBp ZWVlODAyMTFfbm9kZSAqbmksIHZvaWQgKmFyZyBfX3VudXNlZCwgdWludDMyX3QgaWFyZyBfX3Vu dXNlZCkKK3sKKyNkZWZpbmUJRE9UMTFSQVRFKGl4KQkocnQtPmluZm9baXhdLmRvdDExUmF0ZSAm IElFRUU4MDIxMV9SQVRFX1ZBTCkKKyNkZWZpbmUJTUNTKGl4KQkJKHJ0LT5pbmZvW2l4XS5kb3Qx MVJhdGUgfCBJRUVFODAyMTFfUkFURV9NQ1MpCisjZGVmaW5lCVJBVEUoaXgpCShET1QxMVJBVEUo aXgpIC8gMikKKwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBuaS0+bmlfdmFwOworCXN0cnVj dCBpZWVlODAyMTFfc2FtcGxlX25vZGUgKnNhbiA9IG5pLT5uaV9yY3RsczsKKwlzdHJ1Y3QgaWVl ZTgwMjExX3NhbXBsZSAqc2FtcGxlID0gc2FuLT5zYW5fc2FtcGxlOworCWNvbnN0IHN0cnVjdCBp ZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQgPSBpZWVlODAyMTFfZ2V0X3JhdGV0YWJsZSh2YXAtPml2 X2ljLT5pY19jdXJjaGFuKTsKKwkKKwlpbnQgcml4LCBtcnIsIGJlc3Rfcml4LCBjaGFuZ2VfcmF0 ZXM7CisJdW5zaWduZWQgYXZlcmFnZV90eF90aW1lOworCQorCXNpemVfdCBmcmFtZUxlbiA9IChz aXplX3QpaWFyZzsKKwljb25zdCBpbnQgc2l6ZV9iaW4gPSBzaXplX3RvX2JpbihmcmFtZUxlbik7 CisKKwlzYW1wbGVfdXBkYXRlX3N0YXRpY19yaXgobmkpOworCisJaWYgKHNhbi0+c3RhdGljX3Jp eCAhPSAtMSkgeworCQlyaXggPSBzYW4tPnN0YXRpY19yaXg7CisJCWdvdG8gZG9uZTsKKwl9CisK KwlpZiAoSUVFRTgwMjExX1JBVEVDVExfSEFTQ0FQX01SUih2YXApKQorCQltcnIgPSAxOworCWlm ICghIElFRUU4MDIxMV9SQVRFQ1RMX0hBU0NBUF9NUlJQUk9UKHZhcCkpCisJCW1yciA9IDA7CisK KwliZXN0X3JpeCA9IHBpY2tfYmVzdF9yYXRlKG5pLCBydCwgc2l6ZV9iaW4sICFtcnIpOworCWlm IChiZXN0X3JpeCA+PSAwKSB7CisJCWF2ZXJhZ2VfdHhfdGltZSA9IHNhbi0+c3RhdHNbc2l6ZV9i aW5dW2Jlc3Rfcml4XS5hdmVyYWdlX3R4X3RpbWU7CisJfSBlbHNlIHsKKwkJYXZlcmFnZV90eF90 aW1lID0gMDsKKwl9CisKKwkvKgorCSAqIExpbWl0IHRoZSB0aW1lIG1lYXN1cmluZyB0aGUgcGVy Zm9ybWFuY2Ugb2Ygb3RoZXIgdHgKKwkgKiByYXRlcyB0byBzYW1wbGVfcmF0ZSUgb2YgdGhlIHRv dGFsIHRyYW5zbWlzc2lvbiB0aW1lLgorCSAqLworCWlmIChzYW4tPnNhbXBsZV90dFtzaXplX2Jp bl0gPCBhdmVyYWdlX3R4X3RpbWUgKiAoc2FuLT5wYWNrZXRzX3NpbmNlX3NhbXBsZVtzaXplX2Jp bl0gKgorCQlzYW1wbGUtPnNhbXBsZV9yYXRlLzEwMCkpIHsKKwkJcml4ID0gcGlja19zYW1wbGVf cmF0ZShuaSwgcnQsIHNpemVfYmluKTsKKwkJSUVFRTgwMjExX05PVEUodmFwLCBJRUVFODAyMTFf TVNHX1JBVEVDVEwsCisJCSAgICAgJm5pLCAiYXR0ICVkIHNhbXBsZV90dCAlZCBzaXplICV1IHNh bXBsZSByYXRlICVkICVzIGN1cnJlbnQgcmF0ZSAlZCAlcyIsCisJCSAgICAgYXZlcmFnZV90eF90 aW1lLAorCQkgICAgIHNhbi0+c2FtcGxlX3R0W3NpemVfYmluXSwKKwkJICAgICBiaW5fdG9fc2l6 ZShzaXplX2JpbiksCisJCSAgICAgZG90MTFyYXRlKHJ0LCByaXgpLAorCQkgICAgIGRvdDExcmF0 ZV9sYWJlbChydCwgcml4KSwKKwkJICAgICBkb3QxMXJhdGUocnQsIHNhbi0+Y3VycmVudF9yaXhb c2l6ZV9iaW5dKSwKKwkJICAgICBkb3QxMXJhdGVfbGFiZWwocnQsIHNhbi0+Y3VycmVudF9yaXhb c2l6ZV9iaW5dKSk7CisJCWlmIChyaXggIT0gc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl0pIHsK KwkJCXNhbi0+Y3VycmVudF9zYW1wbGVfcml4W3NpemVfYmluXSA9IHJpeDsKKwkJfSBlbHNlIHsK KwkJCXNhbi0+Y3VycmVudF9zYW1wbGVfcml4W3NpemVfYmluXSA9IC0xOworCQl9CisJCXNhbi0+ cGFja2V0c19zaW5jZV9zYW1wbGVbc2l6ZV9iaW5dID0gMDsKKwl9IGVsc2UgeworCQljaGFuZ2Vf cmF0ZXMgPSAwOworCQlpZiAoIXNhbi0+cGFja2V0c19zZW50W3NpemVfYmluXSB8fCBiZXN0X3Jp eCA9PSAtMSkgeworCQkJLyogbm8gcGFja2V0IGhhcyBiZWVuIHNlbnQgc3VjY2Vzc2Z1bGx5IHll dCAqLworCQkJY2hhbmdlX3JhdGVzID0gMTsKKwkJCWlmIChuaS0+bmlfZmxhZ3MgJiBJRUVFODAy MTFfTk9ERV9IVCkKKwkJCQliZXN0X3JpeCA9IHNhbXBsZV9waWNrX3NlZWRfcmF0ZV9odChuaSwg ZnJhbWVMZW4pOworCQkJZWxzZQorCQkJCWJlc3Rfcml4ID0gc2FtcGxlX3BpY2tfc2VlZF9yYXRl X2xlZ2FjeShuaSwgZnJhbWVMZW4pOworCQl9IGVsc2UgaWYgKHNhbi0+cGFja2V0c19zZW50W3Np emVfYmluXSA8IDIwKSB7CisJCQkvKiBsZXQgdGhlIGJpdC1yYXRlIHN3aXRjaCBxdWlja2x5IGR1 cmluZyB0aGUgZmlyc3QgZmV3IHBhY2tldHMgKi8KKwkJCUlFRUU4MDIxMV9OT1RFKHZhcCwKKwkJ CSAgICBJRUVFODAyMTFfTVNHX1JBVEVDVEwsICZuaSwKKwkJCSAgICAiJXM6IHN3aXRjaGluZyBx dWlja2x5Li4iLCBfX2Z1bmNfXyk7CisJCQljaGFuZ2VfcmF0ZXMgPSAxOworCQl9IGVsc2UgaWYg KHRpY2tzIC0gc2FtcGxlLT5zYW1wbGVfbWluX3N3aXRjaCA+IHNhbi0+dGlja3Nfc2luY2Vfc3dp dGNoW3NpemVfYmluXSkgeworCQkJLyogbWluX3N3aXRjaCBzZWNvbmRzIGhhdmUgZ29uZSBieSAq LworCQkJSUVFRTgwMjExX05PVEUodmFwLAorCQkJICAgIElFRUU4MDIxMV9NU0dfUkFURUNUTCwg Jm5pLAorCQkJICAgICIlczogbWluX3N3aXRjaCAlZCA+IHRpY2tzX3NpbmNlX3N3aXRjaCAlZC4u IiwKKwkJCSAgICBfX2Z1bmNfXywgdGlja3MgLSBzYW1wbGUtPnNhbXBsZV9taW5fc3dpdGNoLCBz YW4tPnRpY2tzX3NpbmNlX3N3aXRjaFtzaXplX2Jpbl0pOworCQkJY2hhbmdlX3JhdGVzID0gMTsK KwkJfSBlbHNlIGlmICgoISAobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpKSAmJgor CQkgICAgKDIqYXZlcmFnZV90eF90aW1lIDwgc2FuLT5zdGF0c1tzaXplX2Jpbl1bc2FuLT5jdXJy ZW50X3JpeFtzaXplX2Jpbl1dLmF2ZXJhZ2VfdHhfdGltZSkpIHsKKwkJCS8qIHRoZSBjdXJyZW50 IGJpdC1yYXRlIGlzIHR3aWNlIGFzIHNsb3cgYXMgdGhlIGJlc3Qgb25lICovCisJCQlJRUVFODAy MTFfTk9URSh2YXAsCisJCQkgICAgSUVFRTgwMjExX01TR19SQVRFQ1RMLCAmbmksCisJCQkgICAg IiVzOiAyeCBhdHQgKD0gJWQpIDwgY3VyX3JpeCBhdHQgJWQiLAorCQkJICAgIF9fZnVuY19fLAor CQkJICAgIDIgKiBhdmVyYWdlX3R4X3RpbWUsIHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3Nhbi0+Y3Vy cmVudF9yaXhbc2l6ZV9iaW5dXS5hdmVyYWdlX3R4X3RpbWUpOworCQkJY2hhbmdlX3JhdGVzID0g MTsKKwkJfSBlbHNlIGlmICgobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpKSB7CisJ CQlpbnQgY3VyX3JpeCA9IHNhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dOworCQkJaW50IGN1cl9h dHQgPSBzYW4tPnN0YXRzW3NpemVfYmluXVtjdXJfcml4XS5hdmVyYWdlX3R4X3RpbWU7CisJCQkv KgorCQkJICogSWYgdGhlIG5vZGUgaXMgSFQsIHVwZ3JhZGUgaXQgaWYgdGhlIE1DUyByYXRlIGlz CisJCQkgKiBoaWdoZXIgYW5kIHRoZSBhdmVyYWdlIHR4IHRpbWUgaXMgd2l0aGluIDIwJSBvZgor CQkJICogdGhlIGN1cnJlbnQgcmF0ZS4gSXQgY2FuIGZhaWwgYSBsaXR0bGUuCisJCQkgKgorCQkJ ICogVGhpcyBpcyBsaWtlbHkgbm90IG9wdGltYWwhCisJCQkgKi8KKyNpZiAwCisJCQlwcmludGYo ImN1ciByaXgvYXR0ICV4LyVkLCBiZXN0IHJpeC9hdHQgJXgvJWRcbiIsCisJCQkgICAgTUNTKGN1 cl9yaXgpLCBjdXJfYXR0LCBNQ1MoYmVzdF9yaXgpLCBhdmVyYWdlX3R4X3RpbWUpOworI2VuZGlm CisJCQlpZiAoKE1DUyhiZXN0X3JpeCkgPiBNQ1MoY3VyX3JpeCkpICYmCisJCQkgICAgKGF2ZXJh Z2VfdHhfdGltZSAqIDgpIDw9IChjdXJfYXR0ICogMTApKSB7CisJCQkJSUVFRTgwMjExX05PVEUo dmFwLAorCQkJCSAgICBJRUVFODAyMTFfTVNHX1JBVEVDVEwsICZuaSwKKwkJCQkgICAgIiVzOiBI VDogYmVzdF9yaXggMHglZCA+IGN1cl9yaXggMHgleCwgYXZlcmFnZV90eF90aW1lICVkLCBjdXJf YXR0ICVkIiwKKwkJCQkgICAgX19mdW5jX18sCisJCQkJICAgIE1DUyhiZXN0X3JpeCksIE1DUyhj dXJfcml4KSwgYXZlcmFnZV90eF90aW1lLCBjdXJfYXR0KTsKKwkJCQljaGFuZ2VfcmF0ZXMgPSAx OworCQkJfQorCQl9CisKKwkJc2FuLT5wYWNrZXRzX3NpbmNlX3NhbXBsZVtzaXplX2Jpbl0rKzsK KwkJCisJCWlmIChjaGFuZ2VfcmF0ZXMpIHsKKwkJCWlmIChiZXN0X3JpeCAhPSBzYW4tPmN1cnJl bnRfcml4W3NpemVfYmluXSkgeworCQkJCUlFRUU4MDIxMV9OT1RFKHZhcCwKKwkJCQkgICAgSUVF RTgwMjExX01TR19SQVRFQ1RMLAorCQkJCSAgICAmbmksCisiJXM6IHNpemUgJWQgc3dpdGNoIHJh dGUgJWQgKCVkLyVkKSAtPiAlZCAoJWQvJWQpIGFmdGVyICVkIHBhY2tldHMgbXJyICVkIiwKKwkJ CQkgICAgX19mdW5jX18sCisJCQkJICAgIGJpbl90b19zaXplKHNpemVfYmluKSwKKwkJCQkgICAg UkFURShzYW4tPmN1cnJlbnRfcml4W3NpemVfYmluXSksCisJCQkJICAgIHNhbi0+c3RhdHNbc2l6 ZV9iaW5dW3Nhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dXS5hdmVyYWdlX3R4X3RpbWUsCisJCQkJ ICAgIHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3Nhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dXS5wZXJm ZWN0X3R4X3RpbWUsCisJCQkJICAgIFJBVEUoYmVzdF9yaXgpLAorCQkJCSAgICBzYW4tPnN0YXRz W3NpemVfYmluXVtiZXN0X3JpeF0uYXZlcmFnZV90eF90aW1lLAorCQkJCSAgICBzYW4tPnN0YXRz W3NpemVfYmluXVtiZXN0X3JpeF0ucGVyZmVjdF90eF90aW1lLAorCQkJCSAgICBzYW4tPnBhY2tl dHNfc2luY2Vfc3dpdGNoW3NpemVfYmluXSwKKwkJCQkgICAgbXJyKTsKKwkJCX0KKwkJCXNhbi0+ cGFja2V0c19zaW5jZV9zd2l0Y2hbc2l6ZV9iaW5dID0gMDsKKwkJCXNhbi0+Y3VycmVudF9yaXhb c2l6ZV9iaW5dID0gYmVzdF9yaXg7CisJCQlzYW4tPnRpY2tzX3NpbmNlX3N3aXRjaFtzaXplX2Jp bl0gPSB0aWNrczsKKwkJCS8qIAorCQkJICogU2V0IHRoZSB2aXNpYmxlIHR4cmF0ZSBmb3IgdGhp cyBub2RlLgorCQkJICovCisJCQluaS0+bmlfdHhyYXRlID0gZG90MTFyYXRlKHJ0LCBiZXN0X3Jp eCk7CisJCX0KKwkJcml4ID0gc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl07CisJCXNhbi0+cGFj a2V0c19zaW5jZV9zd2l0Y2hbc2l6ZV9iaW5dKys7CisJfQorCS8vICp0cnkwID0gbXJyID8gc2Fu LT5zY2hlZFtyaXhdLnQwIDogQVRIX1RYTUFYVFJZOworZG9uZToKKworCS8qCisJICogVGhpcyBi dWcgdG90YWxseSBzdWNrcyBhbmQgc2hvdWxkIGJlIGZpeGVkLgorCSAqCisJICogRm9yIG5vdyB0 aG91Z2gsIGxldCdzIG5vdCBwYW5pYywgc28gd2UgY2FuIHN0YXJ0IHRvIGZpZ3VyZQorCSAqIG91 dCBob3cgdG8gYmV0dGVyIHJlcHJvZHVjZSBpdC4KKwkgKi8KKwlpZiAocml4IDwgMCB8fCByaXgg Pj0gcnQtPnJhdGVDb3VudCkgeworCQlwcmludGYoIiVzOiBFUlJPUjogcml4ICVkIG91dCBvZiBi b3VuZHMgKHJhdGVDb3VudD0lZClcbiIsCisJCSAgICBfX2Z1bmNfXywKKwkJICAgIHJpeCwKKwkJ ICAgIHJ0LT5yYXRlQ291bnQpOworCQkgICAgcml4ID0gMDsJLyogWFhYIGp1c3QgZGVmYXVsdCBm b3Igbm93ICovCisJfQorCUtBU1NFUlQocml4ID49IDAgJiYgcml4IDwgcnQtPnJhdGVDb3VudCwg KCJyaXggaXMgJWQiLCByaXgpKTsKKworCS8vICpyaXgwID0gcml4OworCS8vICp0eHJhdGUgPSBy dC0+aW5mb1tyaXhdLnJhdGVDb2RlCisJLy8gCXwgKHNob3J0UHJlYW1ibGUgPyBydC0+aW5mb1ty aXhdLnNob3J0UHJlYW1ibGUgOiAwKTsKKwlzYW4tPnBhY2tldHNfc2VudFtzaXplX2Jpbl0rKzsK KworCXJldHVybiByaXg7CisjdW5kZWYgRE9UMTFSQVRFCisjdW5kZWYgTUNTCisjdW5kZWYgUkFU RQorfQorCitzdGF0aWMgdm9pZAorc2FtcGxlX3JhdGVzKHN0cnVjdCBpZWVlODAyMTFfbm9kZSAq bmksIHN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyAqcmNfaW5mbykKK3sKKwlzdHJ1Y3QgaWVlZTgw MjExX3NhbXBsZV9ub2RlICpzYW4gPSBuaS0+bmlfcmN0bHM7CisJdWludDhfdCByaXgwID0gc2Ft cGxlX3JhdGUobmksIE5VTEwsIDApOworCWNvbnN0IHN0cnVjdCB0eHNjaGVkdWxlICpzY2hlZCA9 ICZzYW4tPnNjaGVkW3JpeDBdOworCXN0cnVjdCBpZWVlODAyMTFfcmNfc2VyaWVzICpyYyA9IHJj X2luZm8tPmlyaV9yYzsKKworCUtBU1NFUlQocml4MCA9PSBzY2hlZC0+cjAsICgicml4MCAoJXgp ICE9IHNjaGVkLT5yMCAoJXgpIVxuIiwKKwkgICAgcml4MCwgc2NoZWQtPnIwKSk7CisJLyogWFhY ICovCisJcmNbMF0uZmxhZ3MgPSByY1sxXS5mbGFncyA9IHJjWzJdLmZsYWdzID0gcmNbM10uZmxh Z3MgPSAwOworCisJcmNbMF0ucml4ID0gc2NoZWQtPnIwOworCXJjWzFdLnJpeCA9IHNjaGVkLT5y MTsKKwlyY1syXS5yaXggPSBzY2hlZC0+cjI7CisJcmNbM10ucml4ID0gc2NoZWQtPnIzOworCisJ cmNbMF0udHJpZXMgPSBzY2hlZC0+dDA7CisJcmNbMV0udHJpZXMgPSBzY2hlZC0+dDE7CisJcmNb Ml0udHJpZXMgPSBzY2hlZC0+dDI7CisJcmNbM10udHJpZXMgPSBzY2hlZC0+dDM7Cit9CisKK3N0 YXRpYyB2b2lkCit1cGRhdGVfc3RhdHMoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAor ICAgIAkgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksCisJCSAgaW50IGZyYW1lX3Np emUsCisJCSAgaW50IHJpeDAsIGludCB0cmllczAsCisJCSAgaW50IHJpeDEsIGludCB0cmllczEs CisJCSAgaW50IHJpeDIsIGludCB0cmllczIsCisJCSAgaW50IHJpeDMsIGludCB0cmllczMsCisJ CSAgaW50IHNob3J0X3RyaWVzLCBpbnQgdHJpZXMsCisJCSAgaW50IG5mcmFtZXMsIGludCBuYmFk KQoreworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUgKnNhbiA9IG5pLT5uaV9yY3RsczsK KwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZSAqc2FtcGxlID0gc2FuLT5zYW5fc2FtcGxlOworCisJ Y29uc3QgaW50IHNpemVfYmluID0gc2l6ZV90b19iaW4oZnJhbWVfc2l6ZSk7CisJY29uc3QgaW50 IHNpemUgPSBiaW5fdG9fc2l6ZShzaXplX2Jpbik7CisKKwlpbnQgaXNfaHQ0MCA9IGllZWU4MDIx MV9yYXRlY3RsX2hhc2NhcF9jdzQwKHZhcCwgbmkpOworCWludCB0dCwgdHJpZXNfc29fZmFyOwor CWludCBwY3Q7CisKKwlpZiAoIUlTX1JBVEVfREVGSU5FRChzYW4sIHJpeDApKQorCQlyZXR1cm47 CisJdHQgPSBjYWxjX3VzZWNzX3VuaWNhc3RfcGFja2V0KHZhcCwgc2l6ZSwgcml4MCwgc2hvcnRf dHJpZXMsCisJCU1JTih0cmllczAsIHRyaWVzKSAtIDEsIGlzX2h0NDApOworCXRyaWVzX3NvX2Zh ciA9IHRyaWVzMDsKKworCWlmICh0cmllczEgJiYgdHJpZXNfc29fZmFyIDwgdHJpZXMpIHsKKwkJ aWYgKCFJU19SQVRFX0RFRklORUQoc2FuLCByaXgxKSkKKwkJCXJldHVybjsKKwkJdHQgKz0gY2Fs Y191c2Vjc191bmljYXN0X3BhY2tldCh2YXAsIHNpemUsIHJpeDEsIHNob3J0X3RyaWVzLAorCQkJ TUlOKHRyaWVzMSArIHRyaWVzX3NvX2ZhciwgdHJpZXMpIC0gdHJpZXNfc29fZmFyIC0gMSwgaXNf aHQ0MCk7CisJCXRyaWVzX3NvX2ZhciArPSB0cmllczE7CisJfQorCisJaWYgKHRyaWVzMiAmJiB0 cmllc19zb19mYXIgPCB0cmllcykgeworCQlpZiAoIUlTX1JBVEVfREVGSU5FRChzYW4sIHJpeDIp KQorCQkJcmV0dXJuOworCQl0dCArPSBjYWxjX3VzZWNzX3VuaWNhc3RfcGFja2V0KHZhcCwgc2l6 ZSwgcml4Miwgc2hvcnRfdHJpZXMsCisJCQlNSU4odHJpZXMyICsgdHJpZXNfc29fZmFyLCB0cmll cykgLSB0cmllc19zb19mYXIgLSAxLCBpc19odDQwKTsKKwkJdHJpZXNfc29fZmFyICs9IHRyaWVz MjsKKwl9CisKKwlpZiAodHJpZXMzICYmIHRyaWVzX3NvX2ZhciA8IHRyaWVzKSB7CisJCWlmICgh SVNfUkFURV9ERUZJTkVEKHNhbiwgcml4MykpCisJCQlyZXR1cm47CisJCXR0ICs9IGNhbGNfdXNl Y3NfdW5pY2FzdF9wYWNrZXQodmFwLCBzaXplLCByaXgzLCBzaG9ydF90cmllcywKKwkJCU1JTih0 cmllczMgKyB0cmllc19zb19mYXIsIHRyaWVzKSAtIHRyaWVzX3NvX2ZhciAtIDEsIGlzX2h0NDAp OworCX0KKworCWlmIChzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS50b3RhbF9wYWNrZXRzIDwg c2FtcGxlLT5zYW5wbGVfc21vb3RoaW5nX21pbnBhY2tldHMpIHsKKwkJLyoganVzdCBhdmVyYWdl IHRoZSBmaXJzdCBmZXcgcGFja2V0cyAqLworCQlpbnQgYXZnX3R4ID0gc2FuLT5zdGF0c1tzaXpl X2Jpbl1bcml4MF0uYXZlcmFnZV90eF90aW1lOworCQlpbnQgcGFja2V0cyA9IHNhbi0+c3RhdHNb c2l6ZV9iaW5dW3JpeDBdLnRvdGFsX3BhY2tldHM7CisJCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3Jp eDBdLmF2ZXJhZ2VfdHhfdGltZSA9ICh0dCsoYXZnX3R4KnBhY2tldHMpKS8ocGFja2V0cytuZnJh bWVzKTsKKwl9IGVsc2UgeworCQkvKiB1c2UgYSBld21hICovCisJCXNhbi0+c3RhdHNbc2l6ZV9i aW5dW3JpeDBdLmF2ZXJhZ2VfdHhfdGltZSA9IAorCQkJKChzYW4tPnN0YXRzW3NpemVfYmluXVty aXgwXS5hdmVyYWdlX3R4X3RpbWUgKiBzYW1wbGUtPnNhbnBsZV9zbW9vdGhpbmdfcmF0ZSkgKyAK KwkJCSAodHQgKiAoMTAwIC0gc2FtcGxlLT5zYW5wbGVfc21vb3RoaW5nX3JhdGUpKSkgLyAxMDA7 CisJfQorCQorCS8qCisJICogWFhYIERvbid0IG1hcmsgdGhlIGhpZ2hlciBiaXQgcmF0ZXMgYXMg YWxzbyBoYXZpbmcgZmFpbGVkOyBhcyB0aGlzCisJICogdW5mb3J0dW5hdGVseSBzdG9wcyB0aG9z ZSByYXRlcyBmcm9tIGJlaW5nIHRhc3RlZCB3aGVuIHRyeWluZyB0bworCSAqIFRYLiBUaGlzIGhh cHBlbnMgd2l0aCAxMW4gYWdncmVnYXRpb24uCisJICovCisJaWYgKG5mcmFtZXMgPT0gbmJhZCkg eworCQlzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS5zdWNjZXNzaXZlX2ZhaWx1cmVzICs9IG5i YWQ7CisKKwl9IGVsc2UgeworCQlzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS5wYWNrZXRzX2Fj a2VkICs9IChuZnJhbWVzIC0gbmJhZCk7CisJCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnN1 Y2Nlc3NpdmVfZmFpbHVyZXMgPSAwOworCX0KKwlzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS50 cmllcyArPSB0cmllczsKKwlzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS5sYXN0X3R4ID0gdGlj a3M7CisJc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4MF0udG90YWxfcGFja2V0cyArPSBuZnJhbWVz OworCisJLyogdXBkYXRlIEVXTUEgZm9yIHRoaXMgcml4ICovCisKKwkvKiBDYWxjdWxhdGUgcGVy Y2VudGFnZSBiYXNlZCBvbiBjdXJyZW50IHJhdGUgKi8KKwlpZiAobmZyYW1lcyA9PSAwKQorCQlu ZnJhbWVzID0gbmJhZCA9IDE7CisJcGN0ID0gKChuZnJhbWVzIC0gbmJhZCkgKiAxMDAwKSAvIG5m cmFtZXM7CisKKwlpZiAoc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4MF0udG90YWxfcGFja2V0cyA8 CisJICAgIHNhbXBsZS0+c2FucGxlX3Ntb290aGluZ19taW5wYWNrZXRzKSB7CisJCS8qIGp1c3Qg YXZlcmFnZSB0aGUgZmlyc3QgZmV3IHBhY2tldHMgKi8KKwkJaW50IGFfcGN0ID0gKHNhbi0+c3Rh dHNbc2l6ZV9iaW5dW3JpeDBdLnBhY2tldHNfYWNrZWQgKiAxMDAwKSAvCisJCSAgICAoc2FuLT5z dGF0c1tzaXplX2Jpbl1bcml4MF0udG90YWxfcGFja2V0cyk7CisJCXNhbi0+c3RhdHNbc2l6ZV9i aW5dW3JpeDBdLmV3bWFfcGN0ID0gYV9wY3Q7CisJfSBlbHNlIHsKKwkJLyogdXNlIGEgZXdtYSAq LworCQlzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS5ld21hX3BjdCA9CisJCQkoKHNhbi0+c3Rh dHNbc2l6ZV9iaW5dW3JpeDBdLmV3bWFfcGN0ICogc2FtcGxlLT5zYW5wbGVfc21vb3RoaW5nX3Jh dGUpICsKKwkJCSAocGN0ICogKDEwMCAtIHNhbXBsZS0+c2FucGxlX3Ntb290aGluZ19yYXRlKSkp IC8gMTAwOworCX0KKworCWlmIChyaXgwID09IHNhbi0+Y3VycmVudF9zYW1wbGVfcml4W3NpemVf YmluXSkgeworCQlzYW4tPnNhbXBsZV90dFtzaXplX2Jpbl0gPSB0dDsKKwkJc2FuLT5jdXJyZW50 X3NhbXBsZV9yaXhbc2l6ZV9iaW5dID0gLTE7CisJfQorfQorCitzdGF0aWMgdm9pZAorc2FtcGxl X3R4X2NvbXBsZXRlKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCwKKyAgICBjb25zdCBz dHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBpbnQgb2ssCisgICAgdm9pZCAqYXJnMSwgdm9pZCAq YXJnMikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlICpzYW4gPSBuaS0+bmlfcmN0 bHM7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCA9IGllZWU4MDIxMV9n ZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4pOworCisJLyogWFhYIG5lZWQgdG8g Y2hhbmdlIGFyZzIgdG8gcG9pbnRlciBvZiBpZWVlODAyMTFfcmNfaW5mbyAqLworCXN0cnVjdCBp ZWVlODAyMTFfcmNfaW5mbyAqcmNfaW5mbyA9IChzdHJ1Y3QgaWVlZTgwMjExX3JjX2luZm8qKWFy ZzI7CisKKwlpbnQgZmluYWxfcml4LCBzaG9ydF90cmllcywgbG9uZ190cmllczsKKwlpbnQgbmZy YW1lcywgbmJhZDsKKwlpbnQgZnJhbWVfc2l6ZSwgbXJyOworCisJLyogdXBkYXRlIHBlciB2YXAg c3RhdGlzdGljcyAqLworCWllZWU4MDIxMV9yYXRlY3RsX3VwZGF0ZV9zdGF0KHZhcCwgcmNfaW5m byk7CisKKwlmaW5hbF9yaXggPSBydC0+cmF0ZUNvZGVUb0luZGV4W3JjX2luZm8tPmlyaV90eHJh dGVdOworCXNob3J0X3RyaWVzID0gcmNfaW5mby0+aXJpX3Nob3J0cmV0cnk7CisJLyogWFhYIHdo eSBwbHVzIDEgaGVyZT8gKi8KKwlsb25nX3RyaWVzID0gcmNfaW5mby0+aXJpX2xvbmdyZXRyeSAr IDE7CisKKwluZnJhbWVzID0gcmNfaW5mby0+aXJpX3R4Y250OworCW5iYWQgPSByY19pbmZvLT5p cmlfZmFpbGNudDsKKworCWZyYW1lX3NpemUgPSByY19pbmZvLT5pcmlfZnJhbWVsZW47CisJbXJy ID0gMDsKKworCWlmIChuZnJhbWVzID09IDApIHsKKwkJcmV0dXJuOworCX0KKworCWlmIChmcmFt ZV9zaXplID09IDApCQkgICAgLyogTkI6IHNob3VsZCBub3QgaGFwcGVuICovCisJCWZyYW1lX3Np emUgPSAxNTAwOworCisJaWYgKHNhbi0+cmF0ZW1hc2sgPT0gMCkgeworCQlyZXR1cm47CisJfQor CQorCWlmIChJRUVFODAyMTFfUkFURUNUTF9IQVNDQVBfTVJSKHZhcCkpCisJCW1yciA9IDE7CisJ LyogWFhYIGNoZWNrIEhUIHByb3Rtb2RlIHRvbyAqLworCWlmIChtcnIgJiYgIUlFRUU4MDIxMV9S QVRFQ1RMX0hBU0NBUF9NUlJQUk9UKHZhcCkpCisJCW1yciA9IDA7CisJCisJaWYgKCFtcnIgfHwg cmNfaW5mby0+aXJpX2ZpbmFsdHNpID09IDApIHsKKwkJaWYgKCFJU19SQVRFX0RFRklORUQoc2Fu LCBmaW5hbF9yaXgpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJLyoKKwkJICogT25seSBvbmUgcmF0 ZSB3YXMgdXNlZDsgb3B0aW1pemUgd29yay4KKwkJICovCisJCXVwZGF0ZV9zdGF0cyh2YXAsIG5p LCBmcmFtZV9zaXplLCAKKwkJCSAgICAgZmluYWxfcml4LCBsb25nX3RyaWVzLAorCQkJICAgICAw LCAwLAorCQkJICAgICAwLCAwLAorCQkJICAgICAwLCAwLAorCQkJICAgICBzaG9ydF90cmllcywg bG9uZ190cmllcywKKwkJCSAgICAgbmZyYW1lcywgbmJhZCk7CisKKwl9IGVsc2UgeworCQlpbnQg ZmluYWxUU0lkeCA9IHJjX2luZm8tPmlyaV9maW5hbHRzaTsKKwkJaW50IGk7CisKKwkJLyoKKwkJ ICogTkI6IHNlcmllcyA+IDAgYXJlIG5vdCBwZW5hbGl6ZWQgZm9yIGZhaWx1cmUKKwkJICogYmFz ZWQgb24gdGhlIHRyeSBjb3VudHMgdW5kZXIgdGhlIGFzc3VtcHRpb24KKwkJICogdGhhdCBsb3Nz ZXMgYXJlIG9mdGVuIGJ1cnN0eSBhbmQgc2luY2Ugd2UKKwkJICogc2FtcGxlIGhpZ2hlciByYXRl cyAxIHRyeSBhdCBhIHRpbWUgZG9pbmcgc28KKwkJICogbWF5IHVuZmFpcmx5IHBlbmFsaXplIHRo ZW0uCisJCSAqLworCQlpZiAocmNbMF0udHJpZXMpIHsKKwkJCXVwZGF0ZV9zdGF0cyh2YXAsIG5p LCBmcmFtZV9zaXplLAorCQkJCSAgICAgcmNbMF0ucml4LCByY1swXS50cmllcywKKwkJCQkgICAg IHJjWzFdLnJpeCwgcmNbMV0udHJpZXMsCisJCQkJICAgICByY1syXS5yaXgsIHJjWzJdLnRyaWVz LAorCQkJCSAgICAgcmNbM10ucml4LCByY1szXS50cmllcywKKwkJCQkgICAgIHNob3J0X3RyaWVz LCBsb25nX3RyaWVzLAorCQkJCSAgICAgbmZyYW1lcywgbmJhZCk7CisJCQlsb25nX3RyaWVzIC09 IHJjWzBdLnRyaWVzOworCQl9CisJCQorCQlpZiAocmNbMV0udHJpZXMgJiYgZmluYWxUU0lkeCA+ IDApIHsKKwkJCXVwZGF0ZV9zdGF0cyh2YXAsIG5pLCBmcmFtZV9zaXplLAorCQkJCSAgICAgcmNb MV0ucml4LCByY1sxXS50cmllcywKKwkJCQkgICAgIHJjWzJdLnJpeCwgcmNbMl0udHJpZXMsCisJ CQkJICAgICByY1szXS5yaXgsIHJjWzNdLnRyaWVzLAorCQkJCSAgICAgMCwgMCwKKwkJCQkgICAg IHNob3J0X3RyaWVzLCBsb25nX3RyaWVzLAorCQkJCSAgICAgbmZyYW1lcywgbmJhZCk7CisJCQls b25nX3RyaWVzIC09IHJjWzFdLnRyaWVzOworCQl9CisKKwkJaWYgKHJjWzJdLnRyaWVzICYmIGZp bmFsVFNJZHggPiAxKSB7CisJCQl1cGRhdGVfc3RhdHModmFwLCBuaSwgZnJhbWVfc2l6ZSwKKwkJ CQkgICAgIHJjWzJdLnJpeCwgcmNbMl0udHJpZXMsCisJCQkJICAgICByY1szXS5yaXgsIHJjWzNd LnRyaWVzLAorCQkJCSAgICAgMCwgMCwKKwkJCQkgICAgIDAsIDAsCisJCQkJICAgICBzaG9ydF90 cmllcywgbG9uZ190cmllcywKKwkJCQkgICAgIG5mcmFtZXMsIG5iYWQpOworCQkJbG9uZ190cmll cyAtPSByY1syXS50cmllczsKKwkJfQorCisJCWlmIChyY1szXS50cmllcyAmJiBmaW5hbFRTSWR4 ID4gMikgeworCQkJdXBkYXRlX3N0YXRzKHZhcCwgbmksIGZyYW1lX3NpemUsCisJCQkJICAgICBy Y1szXS5yaXgsIHJjWzNdLnRyaWVzLAorCQkJCSAgICAgMCwgMCwKKwkJCQkgICAgIDAsIDAsCisJ CQkJICAgICAwLCAwLAorCQkJCSAgICAgc2hvcnRfdHJpZXMsIGxvbmdfdHJpZXMsCisJCQkJICAg ICBuZnJhbWVzLCBuYmFkKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK3NhbXBsZV90eF91 cGRhdGUoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLCBjb25zdCBzdHJ1Y3QgaWVlZTgw MjExX25vZGUgKm5pLAorICAgIHZvaWQgKmFyZzEsIHZvaWQgKmFyZzIsIHZvaWQgKmFyZzMpCit7 CisJLyogbm90aGluZyBoZXJlLiAqLworfQorCitzdGF0aWMgdm9pZAorc2FtcGxlX3NldGludGVy dmFsKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCwgaW50IG1zZWNzKQoreworCXN0cnVj dCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSB2YXAtPml2X3JzOworCWludCB0OworCisJaWYg KG1zZWNzIDwgMTAwKQorCQltc2VjcyA9IDEwMDsKKwl0ID0gbXNlY3NfdG9fdGlja3MobXNlY3Mp OworCS8qIGllZWU4MDIxMV9zYW1wbGUgZG9lc24ndCBoYXZlIHRoZSBzYW1wbGVfaW50ZXJ2YWwg ZmllbGQgYnkgbm93ICovCisJLy8gc2FtcGxlLT5zYW1wbGVfaW50ZXJ2YWwgPSAodCA8IDEpID8g MSA6IHQ7Cit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfc3RhdHModm9pZCAqYXJnLCBzdHJ1Y3Qg aWVlZTgwMjExX25vZGUgKm5pKQoreworCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IG5pLT5u aV92YXA7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxz OworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQgPSBpZWVlODAyMTFfZ2V0 X3JhdGV0YWJsZSh2YXAtPml2X2ljLT5pY19jdXJjaGFuKTsKKwl1aW50NjRfdCBtYXNrOworCWlu dCByaXgsIHk7CisKKwlwcmludGYoIlxuWyVzXSByZWZjbnQgJWQgc3RhdGljX3JpeCAoJWQgJXMp IHJhdGVtYXNrIDB4JWp4XG4iLAorCSAgICBldGhlcl9zcHJpbnRmKG5pLT5uaV9tYWNhZGRyKSwg aWVlZTgwMjExX25vZGVfcmVmY250KG5pKSwKKwkgICAgZG90MTFyYXRlKHJ0LCBzYW4tPnN0YXRp Y19yaXgpLAorCSAgICBkb3QxMXJhdGVfbGFiZWwocnQsIHNhbi0+c3RhdGljX3JpeCksCisJICAg ICh1aW50bWF4X3Qpc2FuLT5yYXRlbWFzayk7CisJZm9yICh5ID0gMDsgeSA8IE5VTV9QQUNLRVRf U0laRV9CSU5TOyB5KyspIHsKKwkJcHJpbnRmKCJbJTR1XSBjdXIgcml4ICVkICglZCAlcykgc2lu Y2Ugc3dpdGNoOiBwYWNrZXRzICVkIHRpY2tzICV1XG4iLAorCQkgICAgYmluX3RvX3NpemUoeSks IHNhbi0+Y3VycmVudF9yaXhbeV0sCisJCSAgICBkb3QxMXJhdGUocnQsIHNhbi0+Y3VycmVudF9y aXhbeV0pLAorCQkgICAgZG90MTFyYXRlX2xhYmVsKHJ0LCBzYW4tPmN1cnJlbnRfcml4W3ldKSwK KwkJICAgIHNhbi0+cGFja2V0c19zaW5jZV9zd2l0Y2hbeV0sIHNhbi0+dGlja3Nfc2luY2Vfc3dp dGNoW3ldKTsKKwkJcHJpbnRmKCJbJTR1XSBsYXN0IHNhbXBsZSAoJWQgJXMpIGN1ciBzYW1wbGUg KCVkICVzKSBwYWNrZXRzIHNlbnQgJWRcbiIsCisJCSAgICBiaW5fdG9fc2l6ZSh5KSwKKwkJICAg IGRvdDExcmF0ZShydCwgc2FuLT5sYXN0X3NhbXBsZV9yaXhbeV0pLAorCQkgICAgZG90MTFyYXRl X2xhYmVsKHJ0LCBzYW4tPmxhc3Rfc2FtcGxlX3JpeFt5XSksCisJCSAgICBkb3QxMXJhdGUocnQs IHNhbi0+Y3VycmVudF9zYW1wbGVfcml4W3ldKSwKKwkJICAgIGRvdDExcmF0ZV9sYWJlbChydCwg c2FuLT5jdXJyZW50X3NhbXBsZV9yaXhbeV0pLAorCQkgICAgc2FuLT5wYWNrZXRzX3NlbnRbeV0p OworCQlwcmludGYoIlslNHVdIHBhY2tldHMgc2luY2Ugc2FtcGxlICVkIHNhbXBsZSB0dCAldVxu IiwKKwkJICAgIGJpbl90b19zaXplKHkpLCBzYW4tPnBhY2tldHNfc2luY2Vfc2FtcGxlW3ldLAor CQkgICAgc2FuLT5zYW1wbGVfdHRbeV0pOworCX0KKwlmb3IgKG1hc2sgPSBzYW4tPnJhdGVtYXNr LCByaXggPSAwOyBtYXNrICE9IDA7IG1hc2sgPj49IDEsIHJpeCsrKSB7CisJCWlmICgobWFzayAm IDEpID09IDApCisJCQkJY29udGludWU7CisJCWZvciAoeSA9IDA7IHkgPCBOVU1fUEFDS0VUX1NJ WkVfQklOUzsgeSsrKSB7CisJCQlpZiAoc2FuLT5zdGF0c1t5XVtyaXhdLnRvdGFsX3BhY2tldHMg PT0gMCkKKwkJCQljb250aW51ZTsKKwkJCXByaW50ZigiWyUydSAlczolNHVdICU4anU6JS04anUg KCUzZCUlKSAoRVdNQSAlM2QuJTFkJSUpIFQgJThqdSBGICU0ZCBhdmcgJTV1IGxhc3QgJXVcbiIs CisJCQkgICAgZG90MTFyYXRlKHJ0LCByaXgpLCBkb3QxMXJhdGVfbGFiZWwocnQsIHJpeCksCisJ CQkgICAgYmluX3RvX3NpemUoeSksCisJCQkgICAgKHVpbnRtYXhfdCkgc2FuLT5zdGF0c1t5XVty aXhdLnRvdGFsX3BhY2tldHMsCisJCQkgICAgKHVpbnRtYXhfdCkgc2FuLT5zdGF0c1t5XVtyaXhd LnBhY2tldHNfYWNrZWQsCisJCQkgICAgKGludCkgKChzYW4tPnN0YXRzW3ldW3JpeF0ucGFja2V0 c19hY2tlZCAqIDEwMFVMTCkgLworCQkJICAgICBzYW4tPnN0YXRzW3ldW3JpeF0udG90YWxfcGFj a2V0cyksCisJCQkgICAgc2FuLT5zdGF0c1t5XVtyaXhdLmV3bWFfcGN0IC8gMTAsCisJCQkgICAg c2FuLT5zdGF0c1t5XVtyaXhdLmV3bWFfcGN0ICUgMTAsCisJCQkgICAgKHVpbnRtYXhfdCkgc2Fu LT5zdGF0c1t5XVtyaXhdLnRyaWVzLAorCQkJICAgIHNhbi0+c3RhdHNbeV1bcml4XS5zdWNjZXNz aXZlX2ZhaWx1cmVzLAorCQkJICAgIHNhbi0+c3RhdHNbeV1bcml4XS5hdmVyYWdlX3R4X3RpbWUs CisJCQkgICAgdGlja3MgLSBzYW4tPnN0YXRzW3ldW3JpeF0ubGFzdF90eCk7CisJCX0KKwl9Cit9 CisKK3N0YXRpYyBpbnQKK3NhbXBsZV9zeXNjdGxfc3RhdHMoU1lTQ1RMX0hBTkRMRVJfQVJHUykK K3sKKwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBhcmcxOworCXN0cnVjdCBpZWVlODAyMTFj b20gKmljID0gdmFwLT5pdl9pZnAtPmlmX2wyY29tOworCWludCBlcnJvciwgdjsKKworCXYgPSAw OworCWVycm9yID0gc3lzY3RsX2hhbmRsZV9pbnQob2lkcCwgJnYsIDAsIHJlcSk7CisJaWYgKGVy cm9yIHx8ICFyZXEtPm5ld3B0cikKKwkJcmV0dXJuIGVycm9yOworCWllZWU4MDIxMV9pdGVyYXRl X25vZGVzKCZpYy0+aWNfc3RhLCBzYW1wbGVfc3RhdHMsIE5VTEwpOworCXJldHVybiAwOworfQor CitzdGF0aWMgaW50CitzYW1wbGVfc3lzY3RsX3Ntb290aGluZ19yYXRlKFNZU0NUTF9IQU5ETEVS X0FSR1MpCit7CisJc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gYXJnMTsKKwlzdHJ1Y3QgaWVl ZTgwMjExX3NhbXBsZSAqc2FtcGxlID0gdmFwLT5pdl9yczsKKwlpbnQgcmF0ZSwgZXJyb3I7CisK KwlyYXRlID0gc2FtcGxlLT5zYW1wbGVfc21vb3RoaW5nX3JhdGU7CisJZXJyb3IgPSBzeXNjdGxf aGFuZGxlX2ludChvaWRwLCAmcmF0ZSwgMCwgcmVxKTsKKwlpZiAoZXJyb3IgfHwgIXJlcS0+bmV3 cHRyKQorCQlyZXR1cm4gZXJyb3I7CisJaWYgKCEoMCA8PSByYXRlICYmIHJhdGUgPCAxMDApKQor CQlyZXR1cm4gRUlOVkFMOworCXNhbXBsZS0+c2FtcGxlX3Ntb290aGluZ19yYXRlID0gcmF0ZTsK KwlzYW1wbGUtPnNhbXBsZV9zbW9vdGhpbmdfbWlucGFja2V0cyA9IDEwMCAvICgxMDAgLSByYXRl KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2FtcGxlX3N5c2N0bF9zYW1wbGVfcmF0 ZShTWVNDVExfSEFORExFUl9BUkdTKQoreworCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IGFy ZzE7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGUgKnNhbXBsZSA9IHZhcC0+aXZfcnM7CisJaW50 IHJhdGUsIGVycm9yOworCisJcmF0ZSA9IHNhbXBsZS0+c2FtcGxlX3JhdGU7CisJZXJyb3IgPSBz eXNjdGxfaGFuZGxlX2ludChvaWRwLCAmcmF0ZSwgMCwgcmVxKTsKKwlpZiAoZXJyb3IgfHwgIXJl cS0+bmV3cHRyKQorCQlyZXR1cm4gZXJyb3I7CisJaWYgKCEoMiA8PSByYXRlICYmIHJhdGUgPD0g MTAwKSkKKwkJcmV0dXJuIEVJTlZBTDsKKwlzYW1wbGUtPnNhbXBsZV9yYXRlID0gcmF0ZTsKKwly ZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3NhbXBsZV9zeXNjdGxhdHRhY2goc3RydWN0IGll ZWU4MDIxMXZhcCAqdmFwLAorICAgIHN0cnVjdCBzeXNjdGxfY3R4X2xpc3QgKmN0eCwgc3RydWN0 IHN5c2N0bF9vaWQgKnRyZWUpCit7CisJU1lTQ1RMX0FERF9QUk9DKGN0eCwgU1lTQ1RMX0NISUxE UkVOKHRyZWUpLCBPSURfQVVUTywKKwkgICAgInNhbXBsZV9zbW9vdGhpbmdfcmF0ZSIsIENUTFRZ UEVfSU5UIHwgQ1RMRkxBR19SVywgdmFwLCAwLAorCSAgICBzYW1wbGVfc3lzY3RsX3Ntb290aGlu Z19yYXRlLCAiSSIsCisJICAgICJzYW1wbGU6IHNtb290aGluZyByYXRlIGZvciBhdmcgdHggdGlt ZSAoJSUpIik7CisJU1lTQ1RMX0FERF9QUk9DKGN0eCwgU1lTQ1RMX0NISUxEUkVOKHRyZWUpLCBP SURfQVVUTywKKwkgICAgInNhbXBsZV9yYXRlIiwgQ1RMVFlQRV9JTlQgfCBDVExGTEFHX1JXLCB2 YXAsIDAsCisJICAgIHNhbXBsZV9zeXNjdGxfc2FtcGxlX3JhdGUsICJJIiwKKwkgICAgInNhbXBs ZTogcGVyY2VudCBhaXIgdGltZSBkZXZvdGVkIHRvIHNhbXBsaW5nIG5ldyByYXRlcyAoJSUpIik7 CisJLyogWFhYIG1heF9zdWNjZXNzaXZlX2ZhaWx1cmVzLCBzdGFsZV9mYWlsdXJlX3RpbWVvdXQs IG1pbl9zd2l0Y2ggKi8KKwlTWVNDVExfQUREX1BST0MoY3R4LCBTWVNDVExfQ0hJTERSRU4odHJl ZSksIE9JRF9BVVRPLAorCSAgICAic2FtcGxlX3N0YXRzIiwgQ1RMVFlQRV9JTlQgfCBDVExGTEFH X1JXLCB2YXAsIDAsCisJICAgIHNhbXBsZV9zeXNjdGxfc3RhdHMsICJJIiwgInNhbXBsZTogcHJp bnQgc3RhdGlzdGljcyIpOworfQpJbmRleDogc3lzL25ldDgwMjExL2llZWU4MDIxMV9yY19zYW1w bGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09Ci0tLSBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3JjX3NhbXBsZS5oCShy ZXZpc2lvbiAwKQorKysgc3lzL25ldDgwMjExL2llZWU4MDIxMV9yY19zYW1wbGUuaAkocmV2aXNp b24gMjU2NDc0KQpAQCAtMCwwICsxLDI4NyBAQAorLyogJEZyZWVCU0Q6IGhlYWQvc3lzL2Rldi9h dGgvYXRoX3JhdGUvc2FtcGxlL3NhbXBsZS5oIDI0MDM4MiAyMDEyLTA4LTE1IDA3OjEwOjEwWiBh ZHJpYW4gJCovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IEpvaG4gQmlja2V0CisgKiBD b3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNob25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5vcmc+CisgKiBB bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291 cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0 aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl IGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFO VFkiIGRpc2NsYWltZXIgYmVsb3cgKCJEaXNjbGFpbWVyIikgYW5kIGFueQorICogICAgcmVkaXN0 cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uIGluY2x1ZGluZyBhIHN1YnN0YW50aWFs bHkKKyAqICAgIHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlciBiaW5h cnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUt bGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250 cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2 ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0 ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBi ZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAq IFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdB UkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMK KyAqIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM VURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg Tk9OSU5GUklOR0VNRU5ULCBNRVJDSEFOVElCSUxJVFkKKyAqIEFORCBGSVRORVNTIEZPUiBBIFBB UlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRI RSBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFM LCBFWEVNUExBUlksCisgKiBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBT RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJ TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU WSwgV0hFVEhFUgorICogSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElO Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBP VVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRI RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2lmbmRlZiBfTkVUODAyMTFf SUVFRTgwMjExX1JBVEVDVExfU0FNUExFX0hfCisjZGVmaW5lIF9ORVQ4MDIxMV9JRUVFODAyMTFf UkFURUNUTF9TQU1QTEVfSF8KKworI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9yYXRlY3Rs Lmg+CisKKy8qCisgKiBmb3Igbm93LCB3ZSB0cmFjayBwZXJmb3JtYW5jZSBmb3IgdGhyZWUgZGlm ZmVyZW50IHBhY2tldAorICogc2l6ZSBidWNrZXRzCisgKi8KKyNkZWZpbmUgTlVNX1BBQ0tFVF9T SVpFX0JJTlMgMgorI2RlZmluZQlTQU1QTEVfTUFYUkFURVMJNjQJCS8qIE5COiBjb3JyZXNwb25k cyB0byBoYWwgaW5mb1szMl0gKi8KKworLyoKKyAqIFJhdGUgY29udHJvbCBzZXR0aW5ncy4KKyAq Lworc3RydWN0IGllZWU4MDIxMV9zYW1wbGUgeworCXN0cnVjdCBpZWVlODAyMTFfcmNfc3RhdCBz YW1wbGVfc3RhdDsKKwlpbnQJc2FtcGxlX3Ntb290aGluZ19yYXRlOwkJCS8qIGV3bWEgcGVyY2Vu dGFnZSBbMC4uOTldICovCisJaW50CXNhbXBsZV9zbW9vdGhpbmdfbWlucGFja2V0czsKKwlpbnQJ c2FtcGxlX3JhdGU7CQkJLyogJXRpbWUgdG8gdHJ5IGRpZmZlcmVudCB0eCByYXRlcyAqLworCWlu dAlzYW1wbGVfbWF4X3N1Y2Nlc3NpdmVfZmFpbHVyZXM7CisJaW50CXNhbXBsZV9zdGFsZV9mYWls dXJlX3RpbWVvdXQ7CS8qIGhvdyBsb25nIHRvIGhvbm9yIG1heF9zdWNjZXNzaXZlX2ZhaWx1cmVz ICovCisJaW50CXNhbXBsZV9taW5fc3dpdGNoOwkJLyogbWluIHRpbWUgYmV0d2VlbiByYXRlIGNo YW5nZXMgKi8KKwlpbnQJc2FtcGxlX21pbl9nb29kX3BjdDsJLyogbWluIGdvb2QgcGVyY2VudGFn ZSBmb3IgYSByYXRlIHRvIGJlIGNvbnNpZGVyZWQgKi8KK307CisKK3N0cnVjdCByYXRlX3N0YXRz IHsJCisJdW5zaWduZWQgYXZlcmFnZV90eF90aW1lOworCWludCBzdWNjZXNzaXZlX2ZhaWx1cmVz OworCXVpbnQ2NF90IHRyaWVzOworCXVpbnQ2NF90IHRvdGFsX3BhY2tldHM7CS8qIHBrdHMgdG90 YWwgc2luY2UgYXNzb2MgKi8KKwl1aW50NjRfdCBwYWNrZXRzX2Fja2VkOwkvKiBwa3RzIGFja2Vk IHNpbmNlIGFzc29jICovCisJaW50IGV3bWFfcGN0OwkvKiBFV01BIHBlcmNlbnRhZ2UgKi8KKwl1 bnNpZ25lZCBwZXJmZWN0X3R4X3RpbWU7IC8qIHRyYW5zbWl0IHRpbWUgZm9yIDAgcmV0cmllcyAq LworCWludCBsYXN0X3R4OworfTsKKworc3RydWN0IHR4c2NoZWR1bGUgeworCXVpbnQ4X3QJdDAs IHIwOwkJLyogc2VyaWVzIDA6IHRyaWVzLCByYXRlIGNvZGUgKi8KKwl1aW50OF90CXQxLCByMTsJ CS8qIHNlcmllcyAxOiB0cmllcywgcmF0ZSBjb2RlICovCisJdWludDhfdAl0MiwgcjI7CQkvKiBz ZXJpZXMgMjogdHJpZXMsIHJhdGUgY29kZSAqLworCXVpbnQ4X3QJdDMsIHIzOwkJLyogc2VyaWVz IDM6IHRyaWVzLCByYXRlIGNvZGUgKi8KK307CisKKy8qCisgKiBSYXRlIGNvbnRyb2wgc3RhdGUg Zm9yIGEgZ2l2ZW4gbm9kZS4KKyAqLworLyogWFhYIGNoYW5nZSBuYW1pbmcgY29udmVyc2lvbj8g Ki8KK3N0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUgeworCXN0cnVjdCBpZWVlODAyMTFfc2Ft cGxlICpzYW5fc2FtcGxlOy8qIGJhY2twb2ludGVyICovCisJaW50IHN0YXRpY19yaXg7CQkJLyog cmF0ZSBpbmRleCBvZiBmaXhlZCB0eCByYXRlICovCisJdWludDY0X3QgcmF0ZW1hc2s7CQkvKiBi aXQgbWFzayBvZiB2YWxpZCByYXRlIGluZGljZXMgKi8KKwljb25zdCBzdHJ1Y3QgdHhzY2hlZHVs ZSAqc2NoZWQ7CS8qIHR4IHNjaGVkdWxlIHRhYmxlICovCisKKwlzdHJ1Y3QgcmF0ZV9zdGF0cyBz dGF0c1tOVU1fUEFDS0VUX1NJWkVfQklOU11bU0FNUExFX01BWFJBVEVTXTsKKwlpbnQgbGFzdF9z YW1wbGVfcml4W05VTV9QQUNLRVRfU0laRV9CSU5TXTsKKworCWludCBjdXJyZW50X3NhbXBsZV9y aXhbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdOyAgICAgICAKKwlpbnQgcGFja2V0c19zZW50W05VTV9Q QUNLRVRfU0laRV9CSU5TXTsKKworCWludCBjdXJyZW50X3JpeFtOVU1fUEFDS0VUX1NJWkVfQklO U107CisJaW50IHBhY2tldHNfc2luY2Vfc3dpdGNoW05VTV9QQUNLRVRfU0laRV9CSU5TXTsKKwl1 bnNpZ25lZCB0aWNrc19zaW5jZV9zd2l0Y2hbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdOworCisJaW50 IHBhY2tldHNfc2luY2Vfc2FtcGxlW05VTV9QQUNLRVRfU0laRV9CSU5TXTsKKwl1bnNpZ25lZCBz YW1wbGVfdHRbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdOworfTsKKworI2RlZmluZQlJU19SQVRFX0RF RklORUQoc2FuLCByaXgpCSgoKHNhbiktPnJhdGVtYXNrICYgKDE8PChyaXgpKSkgIT0gMCkKKwor I2lmbmRlZiBNSU4KKyNkZWZpbmUJTUlOKGEsYikJKChhKSA8IChiKSA/IChhKSA6IChiKSkKKyNl bmRpZgorI2lmbmRlZiBNQVgKKyNkZWZpbmUJTUFYKGEsYikJKChhKSA+IChiKSA/IChhKSA6IChi KSkKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgaW50IHBhY2tldF9zaXplX2JpbnNbTlVNX1BBQ0tF VF9TSVpFX0JJTlNdICA9IHsgMjUwLCAxNjAwIH07CisKK3N0YXRpYyBpbmxpbmUgaW50CitiaW5f dG9fc2l6ZShpbnQgaW5kZXgpCit7CisJcmV0dXJuIHBhY2tldF9zaXplX2JpbnNbaW5kZXhdOwor fQorCitzdGF0aWMgaW5saW5lIGludAorc2l6ZV90b19iaW4oaW50IHNpemUpIAoreworI2lmIE5V TV9QQUNLRVRfU0laRV9CSU5TID4gMQorCWlmIChzaXplIDw9IHBhY2tldF9zaXplX2JpbnNbMF0p CisJCXJldHVybiAwOworI2VuZGlmCisjaWYgTlVNX1BBQ0tFVF9TSVpFX0JJTlMgPiAyCisJaWYg KHNpemUgPD0gcGFja2V0X3NpemVfYmluc1sxXSkKKwkJcmV0dXJuIDE7CisjZW5kaWYKKyNpZiBO VU1fUEFDS0VUX1NJWkVfQklOUyA+IDMKKwlpZiAoc2l6ZSA8PSBwYWNrZXRfc2l6ZV9iaW5zWzJd KQorCQlyZXR1cm4gMjsKKyNlbmRpZgorI2lmIE5VTV9QQUNLRVRfU0laRV9CSU5TID4gNAorI2Vy cm9yICJhZGQgc3VwcG9ydCBmb3IgbW9yZSBwYWNrZXQgc2l6ZXMiCisjZW5kaWYKKwlyZXR1cm4g TlVNX1BBQ0tFVF9TSVpFX0JJTlMtMTsKK30KKworc3RhdGljIHVpbnQzMl90IHNhbXBsZV9wa3Rf dHh0aW1lKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQsCisJdWludDMyX3Qg ZnJhbWVMZW4sIHVpbnQxNl90IHJhdGVpeCwgaW50IGlzaHQ0MCwgaW50IGlzU2hvcnRQcmVhbWJs ZSkKK3sKKwl1aW50OF90IHJjOworICAgIGludCBudW1TdHJlYW1zOworCisgICAgcmMgPSBydC0+ aW5mb1tyYXRlaXhdLnJhdGVDb2RlOworCisgICAgLyogTGVnYWN5IHJhdGU/IFJldHVybiB0aGUg b2xkIHdheSAqLworICAgIGlmICghIElTX0hUX1JBVEUocmMpKQorICAgIAlyZXR1cm4gaWVlZTgw MjExX2NvbXB1dGVfZHVyYXRpb24ocnQsIGZyYW1lTGVuLCByYXRlaXgsIGlzU2hvcnRQcmVhbWJs ZSk7CisKKyAgICAvKiAxMW4gZnJhbWUgLSBleHRyYWN0IG91dCB0aGUgbnVtYmVyIG9mIHNwYXRp YWwgc3RyZWFtcyAqLworICAgIG51bVN0cmVhbXMgPSBIVF9SQ18yX1NUUkVBTVMocmMpOworICAg IEtBU1NFUlQobnVtU3RyZWFtcyA+IDAgJiYgbnVtU3RyZWFtcyA8PSA0LAorICAgICAgICAoIm51 bWJlciBvZiBzcGF0aWFsIHN0cmVhbXMgbmVlZHMgdG8gYmUgMS4uMzogTUNTIHJhdGUgMHgleCEi LAorICAgICAgICByYXRlaXgpKTsKKworICAgIHJldHVybiBpZWVlODAyMTFfY29tcHV0ZV9kdXJh dGlvbl9odChmcmFtZUxlbiwgcmMsIG51bVN0cmVhbXMsIGlzaHQ0MCwgaXNTaG9ydFByZWFtYmxl KTsKK30KKworI2RlZmluZSBXSUZJX0NXX01JTiAzMQorI2RlZmluZSBXSUZJX0NXX01BWCAxMDIz CisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIHRyYW5zbWl0IGR1cmF0aW9uIG9mIGEgZnJhbWUuCisg Ki8KK3N0YXRpYyB1bnNpZ25lZCBjYWxjX3VzZWNzX3VuaWNhc3RfcGFja2V0KGNvbnN0IHN0cnVj dCBpZWVlODAyMTF2YXAgKnZhcCwKKwkJCQlpbnQgbGVuZ3RoLAorCQkJCWludCByaXgsIGludCBz aG9ydF9yZXRyaWVzLAorCQkJCWludCBsb25nX3JldHJpZXMsIGludCBpc19odDQwKQoreworCWNv bnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQgPSBpZWVlODAyMTFfZ2V0X3JhdGV0 YWJsZSh2YXAtPml2X2ljLT5pY19jdXJjaGFuKTsKKwlzdHJ1Y3QgaWVlZTgwMjExY29tICppYyA9 IHZhcC0+aXZfaWM7CisJaW50IGN1cm1vZGUgPSBpZWVlODAyMTFfY2hhbjJtb2RlKHZhcC0+aXZf aWMtPmljX2N1cmNoYW4pOworCQorCXVuc2lnbmVkIHRfc2xvdCwgdF9kaWZzLCB0X3NpZnM7IAor CWludCBydHMsIGN0czsKKwlpbnQgdHQsIHgsIGN3LCBjaXg7CisKKwlpbnQgdHQgPSAwOworCWlu dCB4ID0gMDsKKwlpbnQgY3cgPSBXSUZJX0NXX01JTjsKKworCUtBU1NFUlQocnQgIT0gTlVMTCwg KCJubyByYXRlIHRhYmxlLCBtb2RlICV1IiwgY3VybW9kZSkpOworCisJaWYgKHJpeCA+PSBydC0+ cmF0ZUNvdW50KSB7CisJCXByaW50ZigiYm9ndXMgcml4ICVkLCBtYXggJXUsIG1vZGUgJXVcbiIs CisJCSAgICAgICByaXgsIHJ0LT5yYXRlQ291bnQsIGN1cm1vZGUpOworCQlyZXR1cm4gMDsKKwl9 CisJY2l4ID0gcnQtPmluZm9bcml4XS5jb250cm9sUmF0ZTsKKwkvKiAKKwkgKiBYWFggZ2V0dGlu ZyBtYWMvcGh5IGxldmVsIHRpbWluZ3Mgc2hvdWxkIGJlIGZpeGVkIGZvciB0dXJibworCSAqIHJh dGVzLCBhbmQgdGhlcmUgaXMgcHJvYmFibHkgYSB3YXkgdG8gZ2V0IHRoaXMgZnJvbSB0aGUKKwkg KiBoYWwuLi4KKwkgKi8KKwlzd2l0Y2ggKHJ0LT5pbmZvW3JpeF0ucGh5KSB7CisJY2FzZSBJRUVF ODAyMTFfVF9PRkRNOgorCQl0X3Nsb3QgPSA5OworCQl0X3NpZnMgPSAxNjsKKwkJdF9kaWZzID0g Mjg7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgSUVFRTgwMjExX1RfVFVSQk86CisJCXRf c2xvdCA9IDk7CisJCXRfc2lmcyA9IDg7CisJCXRfZGlmcyA9IDI4OworCQlicmVhazsKKwljYXNl IElFRUU4MDIxMV9UX0hUOgorCQl0X3Nsb3QgPSA5OworCQl0X3NpZnMgPSA4OworCQl0X2RpZnMg PSAyODsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfVF9EUzoKKwkJLyogZmFsbCB0aHJvdWdo IHRvIGRlZmF1bHQgKi8KKwlkZWZhdWx0OgorCQkvKiBwZyAyMDUgaWVlZS44MDIuMTEucGRmICov CisJCXRfc2xvdCA9IDIwOworCQl0X2RpZnMgPSA1MDsKKwkJdF9zaWZzID0gMTA7CisJfQorCisJ cnRzID0gY3RzID0gMDsKKworCWlmICgoaWMtPmljX2ZsYWdzICYgSUVFRTgwMjExX0ZfVVNFUFJP VCkgJiYKKwkgICAgcnQtPmluZm9bcml4XS5waHkgPT0gSUVFRTgwMjExX1RfT0ZETSkgeworCQlp ZiAoaWMtPmljX3Byb3Rtb2RlID09IElFRUU4MDIxMV9QUk9UX1JUU0NUUykKKwkJCXJ0cyA9IDE7 CisJCWVsc2UgaWYgKGljLT5pY19wcm90bW9kZSA9PSBJRUVFODAyMTFfUFJPVF9DVFNPTkxZKQor CQkJY3RzID0gMTsKKworCQlpbnQgcHJvdHJpeDsKKyAgICAJaWYgKGN1cm1vZGUgPT0gSUVFRTgw MjExX01PREVfMTFHKQorICAgIAkgICAgcHJvdHJpeCA9IHJ0LT5yYXRlQ29kZVRvSW5kZXhbMioy XTsKKyAgICAJZWxzZSAKKyAgICAJICAgIHByb3RyaXggPSBydC0+cmF0ZUNvZGVUb0luZGV4WzIq MV07CisgICAgCWlmICgweGZmID09IHByb3RyaXgpCisgICAgCQlwcm90cml4ID0gMDsKKworCQlj aXggPSBydC0+aW5mb1twcm90cml4XS5jb250cm9sUmF0ZTsKKwl9CisKKwlpZiAoMCAvKmxlbmd0 aCA+IGljLT5pY19ydHN0aHJlc2hvbGQgKi8pIHsKKwkJcnRzID0gMTsKKwl9CisKKwlpZiAocnRz IHx8IGN0cykgeworCQlpbnQgY3RzcmF0ZTsKKwkJaW50IGN0c2R1cmF0aW9uID0gMDsKKworCQkv KiBOQjogdGhpcyBpcyBpbnRlbnRpb25hbGx5IG5vdCBhIHJ1bnRpbWUgY2hlY2sgKi8KKwkJS0FT U0VSVChjaXggPCBydC0+cmF0ZUNvdW50LAorCQkgICAgKCJib2d1cyBjaXggJWQsIG1heCAldSwg bW9kZSAldVxuIiwgY2l4LCBydC0+cmF0ZUNvdW50LAorCQkgICAgIGN1cm1vZGUpKTsKKworCQlj dHNyYXRlID0gcnQtPmluZm9bY2l4XS5yYXRlQ29kZSB8IHJ0LT5pbmZvW2NpeF0uc2hvcnRQcmVh bWJsZTsKKwkJaWYgKHJ0cykJCS8qIFNJRlMgKyBDVFMgKi8KKwkJCWN0c2R1cmF0aW9uICs9IHJ0 LT5pbmZvW2NpeF0uc3BBY2tEdXJhdGlvbjsKKworCQkvKiBYWFggYXNzdW1lcyBzaG9ydCBwcmVh bWJsZSAqLworCQljdHNkdXJhdGlvbiArPSBzYW1wbGVfcGt0X3R4dGltZShydCwgbGVuZ3RoLCBy aXgsIGlzX2h0NDAsIDApOworCisJCWlmIChjdHMpCS8qIFNJRlMgKyBBQ0sgKi8KKwkJCWN0c2R1 cmF0aW9uICs9IHJ0LT5pbmZvW2NpeF0uc3BBY2tEdXJhdGlvbjsKKworCQl0dCArPSAoc2hvcnRf cmV0cmllcyArIDEpICogY3RzZHVyYXRpb247CisJfQorCXR0ICs9IHRfZGlmczsKKworCS8qIFhY WCBhc3N1bWVzIHNob3J0IHByZWFtYmxlICovCisJdHQgKz0gKGxvbmdfcmV0cmllcysxKSpzYW1w bGVfcGt0X3R4dGltZShydCwgbGVuZ3RoLCByaXgsIGlzX2h0NDAsIDApOworCisJdHQgKz0gKGxv bmdfcmV0cmllcysxKSoodF9zaWZzICsgcnQtPmluZm9bcml4XS5zcEFja0R1cmF0aW9uKTsKKwor CWZvciAoeCA9IDA7IHggPD0gc2hvcnRfcmV0cmllcyArIGxvbmdfcmV0cmllczsgeCsrKSB7CisJ CWN3ID0gTUlOKFdJRklfQ1dfTUFYLCAoY3cgKyAxKSAqIDIpOworCQl0dCArPSAodF9zbG90ICog Y3cvMik7CisJfQorCXJldHVybiB0dDsKK30KKworI2VuZGlmIC8qIF9ORVQ4MDIxMV9JRUVFODAy MTFfUkFURUNUTF9TQU1QTEVfSF8gKi8KSW5kZXg6IHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfcmNf c2FtcGxlX3R4c2NoZWQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3Jj X3NhbXBsZV90eHNjaGVkLmgJKHJldmlzaW9uIDApCisrKyBzeXMvbmV0ODAyMTEvaWVlZTgwMjEx X3JjX3NhbXBsZV90eHNjaGVkLmgJKHJldmlzaW9uIDI1NjQ5MSkKQEAgLTAsMCArMSwyNDEgQEAK Ky8qICRGcmVlQlNEOiBoZWFkL3N5cy9kZXYvYXRoL2F0aF9yYXRlL3NhbXBsZS90eF9zY2hlZHVs ZXMuaCAyNDAzODQgMjAxMi0wOC0xNSAwNzo1MDo0MlogYWRyaWFuICQqLworCisvKi0KKyAqIENv cHlyaWdodCAoYykgMjAwNSBKb2huIEJpY2tldAorICogQ29weXJpZ2h0IChjKSAyMDEzIENoZW5j aG9uZyBRaW4gPGNjcWluQEZyZWVCU0Qub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3 aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0 aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp c2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0 aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1l cgorICogICAgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93ICgi RGlzY2xhaW1lciIpIGFuZCBhbnkKKyAqICAgIHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0 aW9uZWQgdXBvbiBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5CisgKiAgICBzaW1pbGFyIERpc2Ns YWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICog My4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVy cyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRv IGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29m dHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICog QWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhl IHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJz aW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgor ICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBD T1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiBgYEFTIElTJycgQU5EIEFOWSBF WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1J VEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTklORlJJTkdFTUVOVCwgTUVSQ0hB TlRJQklMSVRZCisgKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJ U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1Ig Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLAorICogT1IgQ09O U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS RU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB VVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIENPTlRS QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP VEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBT T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE QU1BR0VTLgorICoKKyAqLworI2lmbmRlZglfTkVUODAyMTFfSUVFRTgwMjExX1JBVEVDVExfU0FN UExFX1RYU0NIRURVTEVTX0hfCisjZGVmaW5lCV9ORVQ4MDIxMV9JRUVFODAyMTFfUkFURUNUTF9T QU1QTEVfVFhTQ0hFRFVMRVNfSF8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorCisjZGVmaW5l IEEoX3IpIFwKKyAgICAoKChfcikgPT0gNikgICA/IDAgOiAoKChfcikgPT0gOSkgICA/IDEgOiAo KChfcikgPT0gMTIpICA/IDIgOiBcCisgICAgKCgoX3IpID09IDE4KSAgPyAzIDogKCgoX3IpID09 IDI0KSAgPyA0IDogKCgoX3IpID09IDM2KSAgPyA1IDogXAorICAgICgoKF9yKSA9PSA0OCkgID8g NiA6ICgoKF9yKSA9PSA1NCkgID8gNyA6IDApKSkpKSkpKQorc3RhdGljIGNvbnN0IHN0cnVjdCB0 eHNjaGVkdWxlIHNlcmllc18xMWFbXSA9IHsKKwl7IDMsQSggNiksIDMsQSggIDYpLCAwLEEoICA2 KSwgMCxBKCA2KSB9LAkvKiAgIDZNYi9zICovCisJeyA0LEEoIDkpLCAzLEEoICA2KSwgNCxBKCAg NiksIDAsQSggNikgfSwJLyogICA5TWIvcyAqLworCXsgNCxBKDEyKSwgMyxBKCAgNiksIDQsQSgg IDYpLCAwLEEoIDYpIH0sCS8qICAxMk1iL3MgKi8KKwl7IDQsQSgxOCksIDMsQSggMTIpLCA0LEEo ICA2KSwgMixBKCA2KSB9LAkvKiAgMThNYi9zICovCisJeyA0LEEoMjQpLCAzLEEoIDE4KSwgNCxB KCAxMiksIDIsQSggNikgfSwJLyogIDI0TWIvcyAqLworCXsgNCxBKDM2KSwgMyxBKCAyNCksIDQs QSggMTgpLCAyLEEoIDYpIH0sCS8qICAzNk1iL3MgKi8KKwl7IDQsQSg0OCksIDMsQSggMzYpLCA0 LEEoIDI0KSwgMixBKDEyKSB9LAkvKiAgNDhNYi9zICovCisJeyA0LEEoNTQpLCAzLEEoIDQ4KSwg NCxBKCAzNiksIDIsQSgyNCkgfQkvKiAgNTRNYi9zICovCit9OworCisjZGVmaW5lIE5BMShfcikg XAorCSgoKF9yKSA9PSA2LjUpICA/IDggOiAoKChfcikgPT0gMTMpICA/ICA5IDogKCgoX3IpID09 IDE5LjUpPyAxMCA6IFwKKwkoKChfcikgPT0gMjYpICA/IDExIDogKCgoX3IpID09IDM5KSAgPyAx MiA6ICgoKF9yKSA9PSA1MikgID8gMTMgOiBcCisJKCgoX3IpID09IDU4LjUpPyAxNCA6ICgoKF9y KSA9PSA2NSkgID8gMTUgOiAwKSkpKSkpKSkKKyNkZWZpbmUgTkEyKF9yKSBcCisJKCgoX3IpID09 IDEzKSA/IDE2IDogKCgoX3IpID09IDI2KSA/IDE3IDogKCgoX3IpID09IDM5KSA/IDE4IDogXAor CSgoKF9yKSA9PSA1MikgPyAxOSA6ICgoKF9yKSA9PSA3OCkgPyAyMCA6ICgoKF9yKSA9PSAxMDQp PyAyMSA6IFwKKwkoKChfcikgPT0gMTE3KT8gMjIgOiAoKChfcikgPT0gMTMwKT8gMjMgOiAwKSkp KSkpKSkKKyNkZWZpbmUgTkEzKF9yKSBcCisJKCgoX3IpID09IDE5LjUpICA/IDI0IDogKCgoX3Ip ID09IDM5KSA/IDI1IDogKCgoX3IpID09IDU4LjUpICA/IDI2IDogXAorCSgoKF9yKSA9PSA3OCkg ID8gMjcgOiAoKChfcikgPT0gMTE3KSA/IDI4IDogKCgoX3IpID09IDE1NikgPyAyOSA6IFwKKwko KChfcikgPT0gMTc1LjUpID8gMzAgOiAoKChfcikgPT0gMTk1KT8gMzEgOiAwKSkpKSkpKSkKK3N0 YXRpYyBjb25zdCBzdHJ1Y3QgdHhzY2hlZHVsZSBzZXJpZXNfMTFuYVtdID0geworCXsgMyxBKCA2 KSwgMyxBKCAgNiksIDAsQSggIDYpLCAwLEEoIDYpIH0sICAgICAgIC8qICAgNk1iL3MgKi8KKwl7 IDQsQSggOSksIDMsQSggIDYpLCA0LEEoICA2KSwgMCxBKCA2KSB9LCAgICAgICAvKiAgIDlNYi9z ICovCisJeyA0LEEoMTIpLCAzLEEoICA2KSwgNCxBKCAgNiksIDAsQSggNikgfSwgICAgICAgLyog IDEyTWIvcyAqLworCXsgNCxBKDE4KSwgMyxBKCAxMiksIDQsQSggIDYpLCAyLEEoIDYpIH0sICAg ICAgIC8qICAxOE1iL3MgKi8KKwl7IDQsQSgyNCksIDMsQSggMTgpLCA0LEEoIDEyKSwgMixBKCA2 KSB9LCAgICAgICAvKiAgMjRNYi9zICovCisJeyA0LEEoMzYpLCAzLEEoIDI0KSwgNCxBKCAxOCks IDIsQSggNikgfSwgICAgICAgLyogIDM2TWIvcyAqLworCXsgNCxBKDQ4KSwgMyxBKCAzNiksIDQs QSggMjQpLCAyLEEoMTIpIH0sICAgICAgIC8qICA0OE1iL3MgKi8KKwl7IDQsQSg1NCksIDMsQSgg NDgpLCA0LEEoIDM2KSwgMixBKDI0KSB9LCAgICAgICAvKiAgNTRNYi9zICovCisKKwkvKiAxIHN0 cmVhbSByYXRlcyAqLworCisJeyAzLE5BMSggNi41KSwgMyxOQTEoIDYuNSksIDAsTkExKCA2LjUp LCAwLE5BMSg2LjUpIH0sICAvKiA2LjVNYi9zICovCisJeyA0LE5BMSggIDEzKSwgMyxOQTEoIDYu NSksIDQsTkExKCA2LjUpLCAwLE5BMSg2LjUpIH0sICAvKiAgMTNNYi9zICovCisJeyA0LE5BMSgx OS41KSwgMyxOQTEoIDYuNSksIDQsTkExKCA2LjUpLCAwLE5BMSg2LjUpIH0sICAvKjE5LjVNYi9z ICovCisJeyA0LE5BMSggIDI2KSwgMyxOQTEoMTkuNSksIDQsTkExKCA2LjUpLCAyLE5BMSg2LjUp IH0sICAvKiAgMjZNYi9zICovCisJeyA0LE5BMSggIDM5KSwgMyxOQTEoICAyNiksIDQsTkExKDE5 LjUpLCAyLE5BMSg2LjUpIH0sICAvKiAgMzlNYi9zICovCisJeyA0LE5BMSggIDUyKSwgMyxOQTEo ICAzOSksIDQsTkExKCAgMjYpLCAyLE5BMSg2LjUpIH0sICAvKiAgNTJNYi9zICovCisJeyA0LE5B MSg1OC41KSwgMyxOQTEoICA1MiksIDQsTkExKCAgMzkpLCAyLE5BMSggMTMpIH0sICAvKjU4LjVN Yi9zICovCisJeyA0LE5BMSggIDY1KSwgMyxOQTEoNTguNSksIDQsTkExKCAgNTIpLCAyLE5BMSgg MTMpIH0sICAvKiAgNjVNYi9zICovCisKKwkvKiAyIHN0cmVhbSByYXRlcyAqLworCisJeyAzLE5B MiggIDEzKSwgMyxOQTIoICAxMyksIDAsTkEyKCAgMTMpLCAwLE5BMiggMTMpIH0sICAvKiAgMTNN Yi9zICovCisJeyA0LE5BMiggIDI2KSwgMyxOQTIoICAxMyksIDQsTkEyKCAgMTMpLCAwLE5BMigg MTMpIH0sICAvKiAgMjZNYi9zICovCisJeyA0LE5BMiggIDM5KSwgMyxOQTIoICAyNiksIDQsTkEy KCAgMTMpLCAyLE5BMiggMTMpIH0sICAvKiAgMzlNYi9zICovCisJeyA0LE5BMiggIDUyKSwgMyxO QTIoICAzOSksIDQsTkEyKCAgMjYpLCAyLE5BMiggMTMpIH0sICAvKiAgNTJNYi9zICovCisJeyA0 LE5BMiggIDc4KSwgMyxOQTIoICA1MiksIDQsTkEyKCAgMzkpLCAyLE5BMiggMTMpIH0sICAvKiAg NzhNYi9zICovCisJeyA0LE5BMiggMTA0KSwgMyxOQTIoICA3OCksIDQsTkEyKCAgNTIpLCAyLE5B MiggMTMpIH0sICAvKiAxMDRNYi9zICovCisJeyA0LE5BMiggMTE3KSwgMyxOQTIoIDEwNCksIDQs TkEyKCAgNzgpLCAyLE5BMiggMjYpIH0sICAvKiAxMTdNYi9zICovCisJeyA0LE5BMiggMTMwKSwg MyxOQTIoIDExNyksIDQsTkEyKCAxMDQpLCAyLE5BMiggMjYpIH0sICAgLyogMTMwTWIvcyAqLwor CisJLyogMyBzdHJlYW0gcmF0ZXMgKi8KKworCXsgMyxOQTMoMTkuNSksIDMsTkEzKDE5LjUpLCAw LE5BMygxOS41KSwgMCxOQTMoMTkuNSkgfSwgIC8qICAxOU1iL3MgKi8KKwl7IDMsTkEzKCAgMzkp LCAzLE5BMygxOS41KSwgMCxOQTMoMTkuNSksIDAsTkEzKDE5LjUpIH0sICAvKiAgMzlNYi9zICov CisJeyAzLE5BMyg1OC41KSwgMyxOQTMoICAzOSksIDAsTkEzKDE5LjUpLCAwLE5BMygxOS41KSB9 LCAgLyogIDU4TWIvcyAqLworCXsgMyxOQTMoICA3OCksIDMsTkEzKDU4LjUpLCAwLE5BMyggIDM5 KSwgMCxOQTMoMTkuNSkgfSwgIC8qICA3OE1iL3MgKi8KKwl7IDMsTkEzKCAxMTcpLCAzLE5BMygg IDc4KSwgMCxOQTMoNTguNSksIDAsTkEzKDE5LjUpIH0sICAvKiAxMTdNYi9zICovCisJeyAzLE5B MyggMTU2KSwgMyxOQTMoIDExNyksIDAsTkEzKCAgNzgpLCAwLE5BMygxOS41KSB9LCAgLyogIDE1 Nk1iL3MgKi8KKwl7IDMsTkEzKDE3NS41KSwgMyxOQTMoIDE1NiksIDAsTkEzKCAxMTcpLCAwLE5B MyggIDM5KSB9LCAgLyogIDE3NU1iL3MgKi8KKwl7IDMsTkEzKCAxOTUpLCAzLE5BMyggMTk1KSwg MCxOQTMoIDE1NiksIDAsTkEzKDU4LjUpIH0sICAvKiAxOTVNYi9zICovCit9OworI3VuZGVmIEEK KyN1bmRlZiBOQTMKKyN1bmRlZiBOQTIKKyN1bmRlZiBOQTEKKworI2RlZmluZSBHKF9yKSBcCisg ICAgKCgoX3IpID09IDEpICAgPyAwIDogKCgoX3IpID09IDIpICAgPyAxIDogKCgoX3IpID09IDUu NSkgPyAyIDogXAorICAgICgoKF9yKSA9PSAxMSkgID8gMyA6ICgoKF9yKSA9PSA2KSAgID8gNCA6 ICgoKF9yKSA9PSA5KSAgID8gNSA6IFwKKyAgICAoKChfcikgPT0gMTIpICA/IDYgOiAoKChfcikg PT0gMTgpICA/IDcgOiAoKChfcikgPT0gMjQpICA/IDggOiBcCisgICAgKCgoX3IpID09IDM2KSAg PyA5IDogKCgoX3IpID09IDQ4KSAgPyAxMCA6ICgoKF9yKSA9PSA1NCkgID8gMTEgOiAwKSkpKSkp KSkpKSkpCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2NoZWR1bGUgc2VyaWVzXzExZ1tdID0gewor CXsgMyxHKCAxKSwgMyxHKCAgMSksIDAsRyggIDEpLCAwLEcoIDEpIH0sCS8qICAgMU1iL3MgKi8K Kwl7IDQsRyggMiksIDMsRyggIDEpLCA0LEcoICAxKSwgMCxHKCAxKSB9LAkvKiAgIDJNYi9zICov CisJeyA0LEcoNS41KSwzLEcoICAyKSwgNCxHKCAgMSksIDIsRyggMSkgfSwJLyogNS41TWIvcyAq LworCXsgNCxHKDExKSwgMyxHKDUuNSksIDQsRyggIDIpLCAyLEcoIDEpIH0sCS8qICAxMU1iL3Mg Ki8KKwl7IDQsRyggNiksIDMsRyg1LjUpLCA0LEcoICAyKSwgMixHKCAxKSB9LAkvKiAgIDZNYi9z ICovCisJeyA0LEcoIDkpLCAzLEcoICA2KSwgNCxHKDUuNSksIDIsRyggMSkgfSwJLyogICA5TWIv cyAqLworCXsgNCxHKDEyKSwgMyxHKCAxMSksIDQsRyg1LjUpLCAyLEcoIDEpIH0sCS8qICAxMk1i L3MgKi8KKwl7IDQsRygxOCksIDMsRyggMTIpLCA0LEcoIDExKSwgMixHKCAxKSB9LAkvKiAgMThN Yi9zICovCisJeyA0LEcoMjQpLCAzLEcoIDE4KSwgNCxHKCAxMiksIDIsRyggMSkgfSwJLyogIDI0 TWIvcyAqLworCXsgNCxHKDM2KSwgMyxHKCAyNCksIDQsRyggMTgpLCAyLEcoIDEpIH0sCS8qICAz Nk1iL3MgKi8KKwl7IDQsRyg0OCksIDMsRyggMzYpLCA0LEcoIDI0KSwgMixHKCAxKSB9LAkvKiAg NDhNYi9zICovCisJeyA0LEcoNTQpLCAzLEcoIDQ4KSwgNCxHKCAzNiksIDIsRyggMSkgfQkvKiAg NTRNYi9zICovCit9OworCisjZGVmaW5lIE5HMShfcikgXAorCSgoKF9yKSA9PSA2LjUpID8gMTIg OiAoKChfcikgPT0gMTMpID8gMTMgOiAoKChfcikgPT0gMTkuNSk/IDE0IDogXAorCSgoKF9yKSA9 PSAyNikgID8gMTUgOiAoKChfcikgPT0gMzkpID8gMTYgOiAoKChfcikgPT0gNTIpICA/IDE3IDog XAorCSgoKF9yKSA9PSA1OC41KT8gMTggOiAoKChfcikgPT0gNjUpID8gMTkgOiAwKSkpKSkpKSkK KyNkZWZpbmUgTkcyKF9yKSBcCisJKCgoX3IpID09IDEzKSAgPyAyMCA6ICgoKF9yKSA9PSAyNikg PyAyMSA6ICgoKF9yKSA9PSAzOSkgID8gMjIgOiBcCisJKCgoX3IpID09IDUyKSAgPyAyMyA6ICgo KF9yKSA9PSA3OCkgPyAyNCA6ICgoKF9yKSA9PSAxMDQpID8gMjUgOiBcCisJKCgoX3IpID09IDEx NykgPyAyNiA6ICgoKF9yKSA9PSAxMzApPyAyNyA6IDApKSkpKSkpKQorI2RlZmluZSBORzMoX3Ip IFwKKwkoKChfcikgPT0gMTkuNSkgID8gMjggOiAoKChfcikgPT0gMzkpID8gMjkgOiAoKChfcikg PT0gNTguNSkgID8gMzAgOiBcCisJKCgoX3IpID09IDc4KSAgPyAzMSA6ICgoKF9yKSA9PSAxMTcp ID8gMzIgOiAoKChfcikgPT0gMTU2KSA/IDMzIDogXAorCSgoKF9yKSA9PSAxNzUuNSkgPyAzNCA6 ICgoKF9yKSA9PSAxOTUpPyAzNSA6IDApKSkpKSkpKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4 c2NoZWR1bGUgc2VyaWVzXzExbmdbXSA9IHsKKwl7IDMsRyggMSksIDMsRyggIDEpLCAwLEcoICAx KSwgMCxHKCAxKSB9LCAgICAgICAvKiAgIDFNYi9zICovCisJeyA0LEcoIDIpLCAzLEcoICAxKSwg NCxHKCAgMSksIDAsRyggMSkgfSwgICAgICAgLyogICAyTWIvcyAqLworCXsgNCxHKDUuNSksMyxH KCAgMiksIDQsRyggIDEpLCAyLEcoIDEpIH0sICAgICAgIC8qIDUuNU1iL3MgKi8KKwl7IDQsRygx MSksIDMsRyg1LjUpLCA0LEcoICAyKSwgMixHKCAxKSB9LCAgICAgICAvKiAgMTFNYi9zICovCisJ eyA0LEcoIDYpLCAzLEcoNS41KSwgNCxHKCAgMiksIDIsRyggMSkgfSwgICAgICAgLyogICA2TWIv cyAqLworCXsgNCxHKCA5KSwgMyxHKCAgNiksIDQsRyg1LjUpLCAyLEcoIDEpIH0sICAgICAgIC8q ICAgOU1iL3MgKi8KKwl7IDQsRygxMiksIDMsRyggMTEpLCA0LEcoNS41KSwgMixHKCAxKSB9LCAg ICAgICAvKiAgMTJNYi9zICovCisJeyA0LEcoMTgpLCAzLEcoIDEyKSwgNCxHKCAxMSksIDIsRygg MSkgfSwgICAgICAgLyogIDE4TWIvcyAqLworCXsgNCxHKDI0KSwgMyxHKCAxOCksIDQsRyggMTIp LCAyLEcoIDEpIH0sICAgICAgIC8qICAyNE1iL3MgKi8KKwl7IDQsRygzNiksIDMsRyggMjQpLCA0 LEcoIDE4KSwgMixHKCAxKSB9LCAgICAgICAvKiAgMzZNYi9zICovCisJeyA0LEcoNDgpLCAzLEco IDM2KSwgNCxHKCAyNCksIDIsRyggMSkgfSwgICAgICAgLyogIDQ4TWIvcyAqLworCXsgNCxHKDU0 KSwgMyxHKCA0OCksIDQsRyggMzYpLCAyLEcoIDEpIH0sICAgICAgIC8qICA1NE1iL3MgKi8KKwor CS8qIDEgc3RyZWFtIHJhdGVzICovCisKKwl7IDMsTkcxKCA2LjUpLCAzLE5HMSggNi41KSwgMCxO RzEoIDYuNSksIDAsTkcxKDYuNSkgfSwgIC8qIDYuNU1iL3MgKi8KKwl7IDQsTkcxKCAgMTMpLCAz LE5HMSggNi41KSwgNCxORzEoIDYuNSksIDAsTkcxKDYuNSkgfSwgIC8qICAxM01iL3MgKi8KKwl7 IDQsTkcxKDE5LjUpLCAzLE5HMSggNi41KSwgNCxORzEoIDYuNSksIDAsTkcxKDYuNSkgfSwgIC8q MTkuNU1iL3MgKi8KKwl7IDQsTkcxKCAgMjYpLCAzLE5HMSgxOS41KSwgNCxORzEoIDYuNSksIDIs TkcxKDYuNSkgfSwgIC8qICAyNk1iL3MgKi8KKwl7IDQsTkcxKCAgMzkpLCAzLE5HMSggIDI2KSwg NCxORzEoMTkuNSksIDIsTkcxKDYuNSkgfSwgIC8qICAzOU1iL3MgKi8KKwl7IDQsTkcxKCAgNTIp LCAzLE5HMSggIDM5KSwgNCxORzEoICAyNiksIDIsTkcxKDYuNSkgfSwgIC8qICA1Mk1iL3MgKi8K Kwl7IDQsTkcxKDU4LjUpLCAzLE5HMSggIDUyKSwgNCxORzEoICAzOSksIDIsTkcxKCAxMykgfSwg IC8qNTguNU1iL3MgKi8KKwl7IDQsTkcxKCAgNjUpLCAzLE5HMSg1OC41KSwgNCxORzEoICA1Miks IDIsTkcxKCAxMykgfSwgIC8qICA2NU1iL3MgKi8KKworCS8qIDIgc3RyZWFtIHJhdGVzICovCisK Kwl7IDMsTkcyKCAgMTMpLCAzLE5HMiggIDEzKSwgMCxORzIoICAxMyksIDAsTkcyKCAxMykgfSwg IC8qICAxM01iL3MgKi8KKwl7IDQsTkcyKCAgMjYpLCAzLE5HMiggIDEzKSwgNCxORzIoICAxMyks IDAsTkcyKCAxMykgfSwgIC8qICAyNk1iL3MgKi8KKwl7IDQsTkcyKCAgMzkpLCAzLE5HMiggIDI2 KSwgNCxORzIoICAxMyksIDIsTkcyKCAxMykgfSwgIC8qICAzOU1iL3MgKi8KKwl7IDQsTkcyKCAg NTIpLCAzLE5HMiggIDM5KSwgNCxORzIoICAyNiksIDIsTkcyKCAxMykgfSwgIC8qICA1Mk1iL3Mg Ki8KKwl7IDQsTkcyKCAgNzgpLCAzLE5HMiggIDUyKSwgNCxORzIoICAzOSksIDIsTkcyKCAxMykg fSwgIC8qICA3OE1iL3MgKi8KKwl7IDQsTkcyKCAxMDQpLCAzLE5HMiggIDc4KSwgNCxORzIoICA1 MiksIDIsTkcyKCAxMykgfSwgIC8qIDEwNE1iL3MgKi8KKwl7IDQsTkcyKCAxMTcpLCAzLE5HMigg MTA0KSwgNCxORzIoICA3OCksIDIsTkcyKCAyNikgfSwgIC8qIDExN01iL3MgKi8KKwl7IDQsTkcy KCAxMzApLCAzLE5HMiggMTE3KSwgNCxORzIoIDEwNCksIDIsTkcyKCAyNikgfSwgIC8qIDEzME1i L3MgKi8KKworCS8qIDMgc3RyZWFtIHJhdGVzICovCisKKwl7IDMsTkczKDE5LjUpLCAzLE5HMygx OS41KSwgMCxORzMoMTkuNSksIDAsTkczKDE5LjUpIH0sICAvKiAgMTlNYi9zICovCisJeyAzLE5H MyggIDM5KSwgMyxORzMoMTkuNSksIDAsTkczKDE5LjUpLCAwLE5HMygxOS41KSB9LCAgLyogIDM5 TWIvcyAqLworCXsgMyxORzMoNTguNSksIDMsTkczKCAgMzkpLCAwLE5HMygxOS41KSwgMCxORzMo MTkuNSkgfSwgIC8qICA1OE1iL3MgKi8KKwl7IDMsTkczKCAgNzgpLCAzLE5HMyg1OC41KSwgMCxO RzMoICAzOSksIDAsTkczKDE5LjUpIH0sICAvKiAgNzhNYi9zICovCisJeyAzLE5HMyggMTE3KSwg MyxORzMoICA3OCksIDAsTkczKDU4LjUpLCAwLE5HMygxOS41KSB9LCAgLyogMTE3TWIvcyAqLwor CXsgMyxORzMoIDE1NiksIDMsTkczKCAxMTcpLCAwLE5HMyggIDc4KSwgMCxORzMoMTkuNSkgfSwg IC8qICAxNTZNYi9zICovCisJeyAzLE5HMygxNzUuNSksIDMsTkczKCAxNTYpLCAwLE5HMyggMTE3 KSwgMCxORzMoICAzOSkgfSwgIC8qICAxNzVNYi9zICovCisJeyAzLE5HMyggMTk1KSwgMyxORzMo IDE5NSksIDAsTkczKCAxNTYpLCAwLE5HMyg1OC41KSB9LCAgLyogMTk1TWIvcyAqLworCit9Owor I3VuZGVmIEcKKyN1bmRlZiBORzMKKyN1bmRlZiBORzIKKyN1bmRlZiBORzEKKworI2RlZmluZSBI KF9yKSBcCisgICAgKCgoX3IpID09IDMpICAgPyAwIDogKCgoX3IpID09IDQuNSkgPyAxIDogKCgo X3IpID09IDYpICA/IDIgOiBcCisgICAgKCgoX3IpID09IDkpICAgPyAzIDogKCgoX3IpID09IDEy KSAgPyA0IDogKCgoX3IpID09IDE4KSA/IDUgOiBcCisgICAgKCgoX3IpID09IDI0KSAgPyA2IDog KCgoX3IpID09IDI3KSAgPyA3IDogMCkpKSkpKSkpCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2No ZWR1bGUgc2VyaWVzX2hhbGZbXSA9IHsKKwl7IDMsSCggMyksIDMsSCggIDMpLCAwLEgoICAzKSwg MCxIKCAzKSB9LAkvKiAgIDNNYi9zICovCisJeyA0LEgoNC41KSwzLEgoICAzKSwgNCxIKCAgMyks IDAsSCggMykgfSwJLyogNC41TWIvcyAqLworCXsgNCxIKCA2KSwgMyxIKCAgMyksIDQsSCggIDMp LCAwLEgoIDMpIH0sCS8qICAgNk1iL3MgKi8KKwl7IDQsSCggOSksIDMsSCggIDYpLCA0LEgoICAz KSwgMixIKCAzKSB9LAkvKiAgIDlNYi9zICovCisJeyA0LEgoMTIpLCAzLEgoICA5KSwgNCxIKCAg NiksIDIsSCggMykgfSwJLyogIDEyTWIvcyAqLworCXsgNCxIKDE4KSwgMyxIKCAxMiksIDQsSCgg IDkpLCAyLEgoIDMpIH0sCS8qICAxOE1iL3MgKi8KKwl7IDQsSCgyNCksIDMsSCggMTgpLCA0LEgo IDEyKSwgMixIKCA2KSB9LAkvKiAgMjRNYi9zICovCisJeyA0LEgoMjcpLCAzLEgoIDI0KSwgNCxI KCAxOCksIDIsSCgxMikgfQkvKiAgMjdNYi9zICovCit9OworI3VuZGVmIEgKKworI2lmZGVmIFEK KyN1bmRlZiBRCisjZW5kaWYKKyNkZWZpbmUgUShfcikgXAorICAgICgoKF9yKSA9PSAxLjUpID8g MCA6ICgoKF9yKSA9PTIuMjUpID8gMSA6ICgoKF9yKSA9PSAzKSAgPyAyIDogXAorICAgICgoKF9y KSA9PSA0LjUpID8gMyA6ICgoKF9yKSA9PSAgNikgID8gNCA6ICgoKF9yKSA9PSA5KSAgPyA1IDog XAorICAgICgoKF9yKSA9PSAxMikgID8gNiA6ICgoKF9yKSA9PSAxMy41KT8gNyA6IDApKSkpKSkp KQorc3RhdGljIGNvbnN0IHN0cnVjdCB0eHNjaGVkdWxlIHNlcmllc19xdWFydGVyW10gPSB7CisJ eyAzLFEoIDEuNSksMyxRKDEuNSksIDAsUSgxLjUpLCAwLFEoMS41KSB9LAkvKiAxLjVNYi9zICov CisJeyA0LFEoMi4yNSksMyxRKDEuNSksIDQsUSgxLjUpLCAwLFEoMS41KSB9LAkvKjIuMjVNYi9z ICovCisJeyA0LFEoICAgMyksMyxRKDEuNSksIDQsUSgxLjUpLCAwLFEoMS41KSB9LAkvKiAgIDNN Yi9zICovCisJeyA0LFEoIDQuNSksMyxRKCAgMyksIDQsUSgxLjUpLCAyLFEoMS41KSB9LAkvKiA0 LjVNYi9zICovCisJeyA0LFEoICAgNiksMyxRKDQuNSksIDQsUSggIDMpLCAyLFEoMS41KSB9LAkv KiAgIDZNYi9zICovCisJeyA0LFEoICAgOSksMyxRKCAgNiksIDQsUSg0LjUpLCAyLFEoMS41KSB9 LAkvKiAgIDlNYi9zICovCisJeyA0LFEoICAxMiksMyxRKCAgOSksIDQsUSggIDYpLCAyLFEoICAz KSB9LAkvKiAgMTJNYi9zICovCisJeyA0LFEoMTMuNSksMyxRKCAxMiksIDQsUSggIDkpLCAyLFEo ICA2KSB9CS8qMTMuNU1iL3MgKi8KK307CisjdW5kZWYgUQorCisjZW5kaWYgLyogX05FVDgwMjEx X0lFRUU4MDIxMV9SQVRFQ1RMX1NBTVBMRV9UWFNDSEVEVUxFU19IXyAqLwo= --20cf3071c88693e1e004e4c679b2--