Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1VmKaW-00078u-2W for pgsql-hackers@arkaria.postgresql.org; Fri, 29 Nov 2013 09:42:16 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.80) (envelope-from ) id 1VmKaV-0005bN-BZ for pgsql-hackers@arkaria.postgresql.org; Fri, 29 Nov 2013 09:42:15 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1VmKaR-0005bE-TA for pgsql-hackers@postgresql.org; Fri, 29 Nov 2013 09:42:12 +0000 Received: from smtp-outbound-2.vmware.com ([208.91.2.13]) by magus.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1VmKaH-0007lK-RX for pgsql-hackers@postgresql.org; Fri, 29 Nov 2013 09:42:10 +0000 Received: from sc9-mailhost3.vmware.com (sc9-mailhost3.vmware.com [10.113.161.73]) by smtp-outbound-2.vmware.com (Postfix) with ESMTP id 5FE362A756; Fri, 29 Nov 2013 01:41:58 -0800 (PST) Received: from zcs-prod-ext-mta-1.vmware.com (zcs-prod-ext-mta-1.vmware.com [10.113.62.223]) by sc9-mailhost3.vmware.com (Postfix) with ESMTP id 54DF940411; Fri, 29 Nov 2013 01:41:58 -0800 (PST) Received: from zcs-prod-ext-mta-1.vmware.com (localhost.localdomain [127.0.0.1]) by zcs-prod-ext-mta-1.vmware.com (Postfix) with ESMTP id 2054412000A; Fri, 29 Nov 2013 01:42:15 -0800 (PST) Received: from [192.168.1.90] (zimbra-prod-ext-proxy-vip.vmware.com [10.113.63.87]) by zcs-prod-ext-mta-1.vmware.com (Postfix) with ESMTPSA; Fri, 29 Nov 2013 01:42:10 -0800 (PST) Message-ID: <5298615C.7060102@vmware.com> Date: Fri, 29 Nov 2013 11:41:48 +0200 From: Heikki Linnakangas Organization: VMware User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20131005 Icedove/17.0.9 MIME-Version: 1.0 To: Alexander Korotkov CC: Alvaro Herrera , Tomas Vondra , pgsql-hackers Subject: Re: GIN improvements part 1: additional information References: <524E7C3B.7060402@vmware.com> <5250A7A1.2010701@fuzzy.cz> <52546434.1000303@vmware.com> <52548F79.6030407@fuzzy.cz> <52569635.5090808@vmware.com> <527A03AF.9010501@vmware.com> <20131106153604.GM5809@eldon.alvh.no-ip.org> <528CEB34.7080702@vmware.com> <52950F46.2080009@vmware.com> In-Reply-To: Content-Type: multipart/mixed; boundary="------------050406050509080408030909" X-Pg-Spam-Score: -6.9 (------) List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-hackers Precedence: bulk Sender: pgsql-hackers-owner@postgresql.org This is a multi-part message in MIME format. --------------050406050509080408030909 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 11/28/2013 09:19 AM, Alexander Korotkov wrote: > On Wed, Nov 27, 2013 at 1:14 AM, Heikki Linnakangas > wrote: > >> On 11/26/13 15:34, Alexander Korotkov wrote: >> >>> What's your plans about GIN now? I tried to rebase packed posting lists >>> with head. But I found that you've changed interface of placeToPage >>> function. That's conflicts with packed posting lists, because >>> dataPlaceToPageLeaf needs not only offset number to describe place to >>> insert item pointer. Do you like to commit rework of handling GIN >>> incomplete splits before? >> >> Yeah, I'm planning to get back to this patch after committing the >> incomplete splits patch. I think the refactoring of the WAL-logging that I >> did in that patch will simplify this patch, too. I'll take a look at >> Michael's latest comments on the incomplete splits patch tomorrow, so I >> should get back to this on Thursday or Friday. > > Should I try to rebase this patch now or you plan to do it yourself? Some > changes like "void *insertdata" argument make me think you have some > particular plan to rebase this patch, but I didn't get it exactly. Here's rebased version. I'll continue reviewing it now.. - Heikki --------------050406050509080408030909 Content-Type: application/x-gzip; name="gin-packed-postglists-17.patch.gz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="gin-packed-postglists-17.patch.gz" ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vUkVBRE1FIGIv c3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9SRUFETUUKaW5kZXggMWMxYzdiNi4u NzJiMGE2OSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9S RUFETUUKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9SRUFETUUKQEAg LTEzNywxNCArMTM3LDIxIEBAIHdpdGggb3JkaW5hcnkga2V5IGVudHJpZXMu CiAqIEluIGEga2V5IGVudHJ5IGF0IHRoZSBidHJlZSBsZWFmIGxldmVsLCBh dCB0aGUgbmV4dCBTSE9SVEFMSUdOIGJvdW5kYXJ5LAogdGhlcmUgaXMgYW4g YXJyYXkgb2YgemVybyBvciBtb3JlIEl0ZW1Qb2ludGVycywgd2hpY2ggc3Rv cmUgdGhlIGhlYXAgdHVwbGUKIFRJRHMgZm9yIHdoaWNoIHRoZSBpbmRleGFi bGUgaXRlbXMgY29udGFpbiB0aGlzIGtleS4gIFRoaXMgaXMgY2FsbGVkIHRo ZQotInBvc3RpbmcgbGlzdCIuICBUaGUgVElEcyBpbiBhIHBvc3RpbmcgbGlz dCBtdXN0IGFwcGVhciBpbiBzb3J0ZWQgb3JkZXIuCi1JZiB0aGUgbGlzdCB3 b3VsZCBiZSB0b28gYmlnIGZvciB0aGUgaW5kZXggdHVwbGUgdG8gZml0IG9u IGFuIGluZGV4IHBhZ2UsCi10aGUgSXRlbVBvaW50ZXJzIGFyZSBwdXNoZWQg b3V0IHRvIGEgc2VwYXJhdGUgcG9zdGluZyBwYWdlIG9yIHBhZ2VzLCBhbmQK LW5vbmUgYXBwZWFyIGluIHRoZSBrZXkgZW50cnkgaXRzZWxmLiAgVGhlIHNl cGFyYXRlIHBhZ2VzIGFyZSBjYWxsZWQgYQotInBvc3RpbmcgdHJlZSI7IHRo ZXkgYXJlIG9yZ2FuaXplZCBhcyBhIGJ0cmVlIG9mIEl0ZW1Qb2ludGVyIHZh bHVlcy4KLU5vdGUgdGhhdCBpbiBlaXRoZXIgY2FzZSwgdGhlIEl0ZW1Qb2lu dGVycyBhc3NvY2lhdGVkIHdpdGggYSBrZXkgY2FuCi1lYXNpbHkgYmUgcmVh ZCBvdXQgaW4gc29ydGVkIG9yZGVyOyB0aGlzIGlzIHJlbGllZCBvbiBieSB0 aGUgc2NhbgotYWxnb3JpdGhtcy4KKyJwb3N0aW5nIGxpc3QiLgorCisqIFRo ZSBUSURzIGluIGEgcG9zdGluZyBsaXN0IG11c3QgYXBwZWFyIGluIHNvcnRl ZCBvcmRlci4KK1NpbmNlIFRJRHMgYXJlIGFzY2VuZGluZyBzb3J0ZWQsIGJs b2NrIG51bWJlcnMgYXJlIGFsc28gYXNjZW5kaW5nLiBBdCBzZWNvbmQKK2Fu ZCBmdXJ0aGVyIEl0ZW1Qb2ludGVycyBpbmNyZW1lbnQgdG8gYmxvY2sgbnVt YmVyIGlzIHN0b3JlZCBpbnN0ZWFkIG9mCitibG9jayBudW1iZXIgaXRzZWxm LiBCbG9jayBhbmQgb2Zmc2V0IG51bWJlcnMgYXJlIHZhcmJ5dGUgZW5jb2Rl ZC4gU2luY2UKK2Jsb2NrIG51bWJlciBpbmNyZW1lbnQgYW4gb2Zmc2V0IG51 bWJlcnMgYXJlIHR5cGljYWxseSBsb3cgbnVtYmVycywgc2lnbmlmaWNhbnQK K2NvbXByZXNzaW9uIGlzIGFjaGlldmVkLgorCitJZiB0aGUgbGlzdCB3b3Vs ZCBiZSB0b28gYmlnIGZvciB0aGUgaW5kZXggdHVwbGUgdG8gZml0IG9uIGFu IGluZGV4IHBhZ2UsIHRoZQorSXRlbVBvaW50ZXJzIGFyZSBwdXNoZWQgb3V0 IHRvIGEgc2VwYXJhdGUgcG9zdGluZyBwYWdlIG9yIHBhZ2VzLCBhbmQgbm9u ZQorYXBwZWFyIGluIHRoZSBrZXkgZW50cnkgaXRzZWxmLiAgVGhlIHNlcGFy YXRlIHBhZ2VzIGFyZSBjYWxsZWQgYSAicG9zdGluZwordHJlZSIgKHNlZSBi ZWxvdyk7IE5vdGUgdGhhdCBpbiBlaXRoZXIgY2FzZSwgdGhlIEl0ZW1Qb2lu dGVycyBhc3NvY2lhdGVkIHdpdGgKK2Ega2V5IGNhbiBlYXNpbHkgYmUgcmVh ZCBvdXQgaW4gc29ydGVkIG9yZGVyOyB0aGlzIGlzIHJlbGllZCBvbiBieSB0 aGUgc2NhbgorYWxnb3JpdGhtcy4gCiAKICogVGhlIGluZGV4IHR1cGxlIGhl YWRlciBmaWVsZHMgb2YgYSBsZWFmIGtleSBlbnRyeSBhcmUgYWJ1c2VkIGFz IGZvbGxvd3M6CiAKQEAgLTIxMCw2ICsyMTcsNDEgQEAgZml0IG9uIG9uZSBw ZW5kaW5nLWxpc3QgcGFnZSBtdXN0IGhhdmUgdGhvc2UgcGFnZXMgdG8gaXRz ZWxmLCBldmVuIGlmIHRoaXMKIHJlc3VsdHMgaW4gd2FzdGluZyBtdWNoIG9m IHRoZSBzcGFjZSBvbiB0aGUgcHJlY2VkaW5nIHBhZ2UgYW5kIHRoZSBsYXN0 CiBwYWdlIGZvciB0aGUgdHVwbGUuKQogCitWYXJieXRlIGVuY29kaW5nCist LS0tLS0tLS0tLS0tLS0tCisKK1ZhcmJ5dGUgZW5jb2RpbmcgaXMgYSBtZXRo b2QgdG8gZW5jb2RlIGludGVnZXJzIGFsbG93aW5nIGxvd2VyIG51bWJlcnMg dG8KK3Rha2UgbGVzcyBzcGFjZS4gRWFjaCBpbnRlZ2VyIGlzIHJlcHJlc2Vu dGVkIGJ5IHZhcmlhYmxlIG51bWJlciBvZiBieXRlcy4KK0hpZ2ggYml0IG9m IGVhY2ggYnl0ZSBpbiB2YXJieXRlIGVuY29kaW5nIGRldGVybWluZXMgd2hl dGhlciBuZXh0IGJ5dGUgaXMKK3VzZWQgdG8gZW5jb2RlIHRoaXMgbnVtYmVy LiBUaGVyZWZvcmUsIHRvIHJlYWQgc2luZ2xlIHZhcmJ5dGUgZW5jb2RlZAor bnVtYmVyIHdlIGhhdmUgdG8gcmVhZCBieXRlcyB3aGlsZSB0aGVpciBoaWdo IGJpdCBpcyBzZXQuCisKK1RoZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIGhv dyB2YXJieXRlIGVuY29kZWQgbnVtYmVycyBjb3VsZCBiZSBkZWNvZGVkIGlu dG8KKzMyLWJpdHMgbGl0dGxlLWVuZGlhbiBpbnRlZ2VyczoKKzBYWFhYWFhY ICAgICAgICAgICAgICAgICAgIC0+IDBYWFhYWFhYIDAwMDAwMDAwIDAwMDAw MDAwIDAwMDAwMDAwCisxWFhYWFhYWCAwWVlZWVlZWSAgICAgICAgICAtPiBZ WFhYWFhYWCAwMFlZWVlZWSAwMDAwMDAwMCAwMDAwMDAwMAorMVhYWFhYWFgg MVlZWVlZWVkgMFpaWlpaWlogLT4gWVhYWFhYWFggWlpZWVlZWVkgMDAwWlpa WlogMDAwMDAwMDAKKworSW4gd29yc3QgY2FzZSB2YXJieXRlIGVuY29kZWQg MzItYml0cyBpbnRlZ2VyIHRha2VzIDUgYnl0ZXMgaW4gdmFyYnl0ZQorZW5j b2RpbmcuIEhvd2V2ZXIsIHRoZXNlIHdpbGwgcHJldHR5IHJhcmUgaGFwcGVu cyB0byBCbG9ja051bWJlciBpbmNyZW1lbnRzLgorCitQb3N0aW5nIHRyZWUK Ky0tLS0tLS0tLS0tLQorCitJZiBhIHBvc3RpbmcgbGlzdCBpcyB0b28gbGFy Z2UgdG8gc3RvcmUgaW4tbGluZSBpbiBhIGtleSBlbnRyeSwgYSBwb3N0aW5n IHRyZWUKK2lzIGNyZWF0ZWQuIEEgcG9zdGluZyB0cmVlIGlzIGEgQi10cmVl IHN0cnVjdHVyZSwgd2hlcmUgdGhlIEl0ZW1Qb2ludGVyIGlzCit1c2VkIGFz IHRoZSBrZXkuIEF0IHRoZSBsZWFmLWxldmVsLCBpdGVtIHBvaW50ZXJzIGFy ZSBzdG9yZWQgY29tcHJlc3NlZCwgaW4KKyJ2YXJieXRlIGVuY29kaW5nIi4K KwordGhleSBhcmUgb3JnYW5pemVkIGFzIGEgYnRyZWUgb2YgSXRlbVBvaW50 ZXIgdmFsdWVzLiBJdGVtUG9pbnRlcnMgaW4gbGVhZgorcGFnZSBvZiBwb3N0 aW5nIHRyZWUgYXJlIGNvbXByZXNzZWQgaW4gdGhlIHNhbWUgd2F5IGFzIGl0 IGlzIGluIHBvc3RpbmcgbGlzdC4KK0hvd2V2ZXIsIGZvciBpbnNlcnRpb25z IGludG8gcGFnZXMgZmluZGluZyBwb3NpdGlvbiBmb3IgSXRlbVBvaW50ZXIg aXMKK2ZyZXF1ZW50bHkgcmVxdWlyZWQuIEl0IHdvdWxkIGJlIHNsb3cgdG8g cmVzY2FuIGZ1bGwgcGFnZSBmb3IgZWFjaCBpbnNlcnRpb24uCitUaGF0J3Mg d2h5IGF0IHRoZSBlbmQgb2YgcGFnZSBHaW5EYXRhTGVhZkluZGV4Q291bnQg b2YgIml0ZW0gaW5kZXhlcyIgYXJlCitzdG9yZWQuIEl0ZW0gaW5kZXggaXMg YSB0cmlwbGUgb2YgSXRlbVBvaW50ZXIsIG9mZnNldCBudW1iZXIgb2YgSXRl bVBvaW50ZXIKK2FuZCBvZmZzZXQgaW4gcGFnZS4gVGhlcmVmb3JlLCB3aGVu IGluc2VydGluZyB3ZSBjYW4gcXVpY2tseSBmaW5kIHJlbGV2YW50CitpdGVt IGluZGV4IGFuZCB0aGVuIHNjYW4gb25seSBzbWFsbCBmcmFjdGlvbiBvZiBw YWdlLgorCiBDb25jdXJyZW5jeQogLS0tLS0tLS0tLS0KIApAQCAtMjYwLDYg KzMwMiwzOCBAQCBwYWdlLWRlbGV0aW9ucyBzYWZlOyBpdCBzdGFtcHMgdGhl IGRlbGV0ZWQgcGFnZXMgd2l0aCBhbiBYSUQgYW5kIGtlZXBzIHRoZQogZGVs ZXRlZCBwYWdlcyBhcm91bmQgd2l0aCB0aGUgcmlnaHQtbGluayBpbnRhY3Qg dW50aWwgYWxsIGNvbmN1cnJlbnQgc2NhbnMKIGhhdmUgZmluaXNoZWQuKQog CitDb21wYXRpYmlsaXR5CistLS0tLS0tLS0tLS0tCisKK0NvbXByZXNzaW9u IG9mIFRJRHMgd2FzIGludHJvZHVjZWQgaW4gOS40LiBTb21lIEdJTiBpbmRl eGVzIGNvdWxkIGJlIHJlbWFpbiBpbgordW5jb21wcmVzc2VkIGZvcm1hdCBi ZWNhdXNlIG9mIHBnX3VwZ3JhZGUgZnJvbSA5LjMgb3IgZWFybGllciB2ZXJz aW9ucy4KK0ZvciBjb21wYXRpYmlsaXR5LCBvbGQgdW5jb21wcmVzc2VkIGZv cm1hdCBpcyBhbHNvIHN1cHBvcnRlZC4gRm9sbG93aW5nCitydWxlcyBpcyB1 c2VkIHRvIGhhbmRsZSBpdDoKKworKiBHSU5fSVRVUF9DT01QUkVTU0VEIGZs YWcgaXMgaW50cm9kdWNlcyBmb3IgaW5kZXggdHVwbGVzIHdpdGggcG9zdGlu ZyBsaXN0cy4KK0l0IGRldGVybWluZXMgd2hldGhlciBpbmRleCB0dXBsZSBj b250YWlucyBjb21wcmVzc2VkIHBvc3RpbmcgbGlzdC4gVGhpcworZmxhZyBp cyBzdG9yZWQgaW4gaGlnaCBiaXQgb2YgSXRlbVBvaW50ZXJHZXRCbG9ja051 bWJlcigmaXR1cC0+dF90aWQpLiBNYWNybworR2luSXR1cElzQ29tcHJlc3Nl ZChpdHVwKSBpcyB1c2VkIHRvIGNoZWNrIGlmIGluZGV4IHR1cGxlIGNvbnRh aW5zIGNvbXByZXNzZWQKK3Bvc3RpbmcgbGlzdC4KKworKiBHSU5fQ09NUFJF U1NFRCBmbGFnIGlzIGludHJvZHVjZWQgZm9yIGxlYWYgcG9zdGluZyB0cmVl IHBhZ2VzLiBJdCBkZXRlcm1pbmVzCit3aGV0aGVyIHBhZ2UgaXMgaW4gbmV3 IGNvbXByZXNzZWQgZm9ybWF0LiBNYWNyb3MgR2luUGFnZUlzQ29tcHJlc3Nl ZChwYWdlKSBhbmQKK0dpblBhZ2VJc0NvbXByZXNzZWQocGFnZSkgYXJlIHVz ZWQgdG8gY2hlY2sgYW5kIHNldCB0aGlzIGZsYWcuCisKKyogQWxsIHNjYW4g b3BlcmF0aW9ucyBjaGVjayBmb3JtYXQgb2YgcG9zdGluZyBsaXN0IGFkZCB1 c2UgY29ycmVzcG9uZGluZyBjb2RlCit0byByZWFkIGl0cyBjb250ZW50Lgor CisqIFdoZW4gdXBkYXRpbmcgaW5kZXggdHVwbGUgY29udGFpbmluZyB1bmNv bXByZXNzZWQgcG9zdGluZyBsaXN0IGl0IHdpbGwgYmUKK3JlcGxhY2VkIHdp dGggbmV3IGluZGV4IHR1cGxlIGNvbnRhaW5pbmcgY29tcHJlc3NlZCBwb3N0 aW5nIGxpc3QuCisKKyogV2hlbiB1cGRhdGluZyB1bmNvbXByZXNzZWQgcG9z dGluZyB0cmVlIGxlYWYgcGFnZSwgaXQncyBwcmV2aW91c2x5IGNvbXByZXNz ZWQuCitUbyBzdWNjZXNzIHdlIG5lZWQgdGhhdCBjb21wcmVzc2VkIHBhZ2Ug Y2FuIGFkZGl0aW9uYWxseSBob2xkIGl0ZW0gaW5kZXhlcyBhbmQKK2F0IGxl YXN0IG9uZSBuZXdseSBpbnNlcnRlZCBUSUQuIFRoZW9yZXRpY2FsbHkgaW4g c29tZSByYXJlIGNhc2VzIGl0IGNvdWxkIGJlCitub3Qgc28uIEluIHRoaXMg Y2FzZSBlcnJvciBpcyB0cmlnZ2VyZWQuCisKKyogSWYgdmFjdXVtIGZpbmRz IHNvbWUgZGVhZCBUSURzIGluIHVuY29tcHJlc3NlZCBwb3N0aW5nIGxpc3Rz LCB0aGV5IGFyZQorY29udmVydGVkIGludG8gY29tcHJlc3NlZCBwb3N0aW5n IGxpc3RzLgorCiBMaW1pdGF0aW9ucwogLS0tLS0tLS0tLS0KIApkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9naW5idHJlZS5jIGIvc3Jj L2JhY2tlbmQvYWNjZXNzL2dpbi9naW5idHJlZS5jCmluZGV4IDdiOWI4NWQu LjFiYjVmODIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4v Z2luYnRyZWUuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbmJ0 cmVlLmMKQEAgLTM1MCw3ICszNTAsNyBAQCBnaW5QbGFjZVRvUGFnZShHaW5C dHJlZSBidHJlZSwgR2luQnRyZWVTdGFjayAqc3RhY2ssCiAJICogd2UnbGwg aGF2ZSB0byBzcGxpdCB0aGUgcGFnZS4KIAkgKi8KIAlTVEFSVF9DUklUX1NF Q1RJT04oKTsKLQlmaXQgPSBidHJlZS0+cGxhY2VUb1BhZ2UoYnRyZWUsIHN0 YWNrLT5idWZmZXIsIHN0YWNrLT5vZmYsCisJZml0ID0gYnRyZWUtPnBsYWNl VG9QYWdlKGJ0cmVlLCBzdGFjay0+YnVmZmVyLCBzdGFjaywKIAkJCQkJCQkg aW5zZXJ0ZGF0YSwgdXBkYXRlYmxrbm8sCiAJCQkJCQkJICZwYXlsb2FkcmRh dGEpOwogCWlmIChmaXQpCkBAIC0zNzMsNyArMzczLDYgQEAgZ2luUGxhY2VU b1BhZ2UoR2luQnRyZWUgYnRyZWUsIEdpbkJ0cmVlU3RhY2sgKnN0YWNrLAog CiAJCQl4bHJlYy5ub2RlID0gYnRyZWUtPmluZGV4LT5yZF9ub2RlOwogCQkJ eGxyZWMuYmxrbm8gPSBCdWZmZXJHZXRCbG9ja051bWJlcihzdGFjay0+YnVm ZmVyKTsKLQkJCXhscmVjLm9mZnNldCA9IHN0YWNrLT5vZmY7CiAJCQl4bHJl Yy5mbGFncyA9IHhsZmxhZ3M7CiAKIAkJCXJkYXRhWzBdLmJ1ZmZlciA9IElu dmFsaWRCdWZmZXI7CkBAIC00NDYsNyArNDQ1LDcgQEAgZ2luUGxhY2VUb1Bh Z2UoR2luQnRyZWUgYnRyZWUsIEdpbkJ0cmVlU3RhY2sgKnN0YWNrLAogCQkg KiBuZXdscGFnZSBpcyBhIHBvaW50ZXIgdG8gbWVtb3J5IHBhZ2UsIGl0IGlz IG5vdCBhc3NvY2lhdGVkIHdpdGggYQogCQkgKiBidWZmZXIuIHN0YWNrLT5i dWZmZXIgaXMgbm90IHRvdWNoZWQgeWV0LgogCQkgKi8KLQkJbmV3bHBhZ2Ug PSBidHJlZS0+c3BsaXRQYWdlKGJ0cmVlLCBzdGFjay0+YnVmZmVyLCByYnVm ZmVyLCBzdGFjay0+b2ZmLAorCQluZXdscGFnZSA9IGJ0cmVlLT5zcGxpdFBh Z2UoYnRyZWUsIHN0YWNrLT5idWZmZXIsIHJidWZmZXIsIHN0YWNrLAogCQkJ CQkJCQkJaW5zZXJ0ZGF0YSwgdXBkYXRlYmxrbm8sCiAJCQkJCQkJCQkmcGF5 bG9hZHJkYXRhKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNz L2dpbi9naW5kYXRhcGFnZS5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9n aW5kYXRhcGFnZS5jCmluZGV4IDUyMjFmNWUuLjhiNGFhNzYgMTAwNjQ0Ci0t LSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2luZGF0YXBhZ2UuYworKysg Yi9zcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbmRhdGFwYWdlLmMKQEAgLTE5 LDYgKzE5LDE3IEBACiAjaW5jbHVkZSAidXRpbHMvcmVsLmgiCiAKIC8qCisg KiBJbml0aWFsaXplIGxlYWYgcGFnZSBvZiBwb3N0aW5nIHRyZWUuIFJlc2Vy dmVzIHNwYWNlIGZvciBpdGVtIGluZGV4ZXMgYXQKKyAqIHRoZSBlbmQgb2Yg cGFnZS4KKyAqLworc3RhdGljIHZvaWQKK0dpbkluaXREYXRhTGVhZlBhZ2Uo UGFnZSBwYWdlKQoreworCUdpbkluaXRQYWdlKHBhZ2UsIEdJTl9EQVRBIHwg R0lOX0xFQUYgfCBHSU5fQ09NUFJFU1NFRCwgQkxDS1NaKTsKKwkoKFBhZ2VI ZWFkZXIpIHBhZ2UpLT5wZF91cHBlciAtPSBzaXplb2YoR2luRGF0YUxlYWZJ dGVtSW5kZXgpICogR2luRGF0YUxlYWZJbmRleENvdW50OworfQorCisvKgog ICogQ2hlY2tzLCBzaG91bGQgd2UgbW92ZSB0byByaWdodCBsaW5rLi4uCiAg KiBDb21wYXJlcyBpbnNlcnRpbmcgaXRlbXAgcG9pbnRlciB3aXRoIHJpZ2h0 IGJvdW5kIG9mIGN1cnJlbnQgcGFnZQogICovCkBAIC0xMDIsMTQgKzExMyw5 MSBAQCBkYXRhTG9jYXRlSXRlbShHaW5CdHJlZSBidHJlZSwgR2luQnRyZWVT dGFjayAqc3RhY2spCiB9CiAKIC8qCi0gKiBTZWFyY2hlcyBjb3JyZWN0IHBv c2l0aW9uIGZvciB2YWx1ZSBvbiBsZWFmIHBhZ2UuCi0gKiBQYWdlIHNob3Vs ZCBiZSBjb3JyZWN0bHkgY2hvc2VuLgotICogUmV0dXJucyB0cnVlIGlmIHZh bHVlIGZvdW5kIG9uIHBhZ2UuCisgKiBGaW5kIGl0ZW0gcG9pbnRlciBpbiBs ZWFmIGRhdGEgcGFnZS4gUmV0dXJucyB0cnVlIGlmIGdpdmVuIGl0ZW0gcG9p bnRlciBpcworICogZm91bmQgYW5kIGZhbHNlIGlmIGl0J3Mgbm90LiBTZXRz IG9mZnNldCBhbmQgaXB0ck91dCB0byBsYXN0IGl0ZW0gcG9pbnRlcgorICog d2hpY2ggaXMgbGVzcyB0aGFuIGdpdmVuIG9uZS4gU2V0cyBwdHJPdXQgYWhl YWQgdGhhdCBpdGVtIHBvaW50ZXIuCiAgKi8KIHN0YXRpYyBib29sCi1kYXRh TG9jYXRlTGVhZkl0ZW0oR2luQnRyZWUgYnRyZWUsIEdpbkJ0cmVlU3RhY2sg KnN0YWNrKQorZmluZEluTGVhZlBhZ2VDb21wcmVzc2VkKEdpbkJ0cmVlIGJ0 cmVlLCBQYWdlIHBhZ2UsCisJCQkgICBJdGVtUG9pbnRlckRhdGEgKmlwdHJP dXQsIFBvaW50ZXIgKnB0ck91dCkKK3sKKwlpbnQJCQlpOworCUl0ZW1Qb2lu dGVyRGF0YSBpcHRyID0ge3swLDB9LDB9OworCWludAkJCWNtcDsKKwlQb2lu dGVyCQlwdHI7CisJUG9pbnRlcgkJZW5kUHRyOworCWJvb2wJCXJlc3VsdCA9 IGZhbHNlOworCUdpbkRhdGFMZWFmSXRlbUluZGV4ICppbmRleGVzID0gR2lu UGFnZUdldEluZGV4ZXMocGFnZSk7CisKKwlwdHIgPSBHaW5EYXRhTGVhZlBh Z2VHZXRQb3N0aW5nTGlzdChwYWdlKTsKKwllbmRQdHIgPSBHaW5EYXRhTGVh ZlBhZ2VHZXRQb3N0aW5nTGlzdEVuZChwYWdlKTsKKworCS8qCisJICogRmly c3QsIHNlYXJjaCB0aGUgbGVhZi1pdGVtIGluZGV4IGF0IHRoZSBlbmQgb2Yg cGFnZS4gVGhhdCBuYXJyb3dzIHRoZQorCSAqIHJhbmdlIHdlIG5lZWQgdG8g bGluZWFybHkgc2Nhbi4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgR2luRGF0 YUxlYWZJbmRleENvdW50OyBpKyspCisJeworCQlHaW5EYXRhTGVhZkl0ZW1J bmRleCAqaW5kZXggPSAmaW5kZXhlc1tpXTsKKwkJaWYgKGluZGV4LT5wYWdl T2Zmc2V0ID09IDApCisJCQlicmVhazsKKworCQlBc3NlcnQoaW5kZXgtPnBh Z2VPZmZzZXQgPCBHaW5EYXRhTGVhZlBhZ2VHZXRQb3N0aW5nTGlzdFNpemUo cGFnZSkpOworCisJCWNtcCA9IGdpbkNvbXBhcmVJdGVtUG9pbnRlcnMoJmlu ZGV4LT5pcHRyLCAmYnRyZWUtPml0ZW1wdHIpOworCQlpZiAoY21wIDwgMCkK KwkJeworCQkJcHRyID0gR2luRGF0YUxlYWZQYWdlR2V0UG9zdGluZ0xpc3Qo cGFnZSkgKyBpbmRleC0+cGFnZU9mZnNldDsKKwkJCWlwdHIgPSBpbmRleC0+ aXB0cjsKKwkJfQorCQllbHNlCisJCXsKKwkJCWVuZFB0ciA9IEdpbkRhdGFM ZWFmUGFnZUdldFBvc3RpbmdMaXN0KHBhZ2UpICsgaW5kZXgtPnBhZ2VPZmZz ZXQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIFNlYXJjaCBwYWdlIGlu IFtmaXJzdCwgbWF4b2ZmXSByYW5nZSBmb3VuZCBieSBwYWdlIGluZGV4ICov CisJd2hpbGUgKHB0ciA8IGVuZFB0cikKKwl7CisJCVBvaW50ZXIgcHJldl9w dHIgPSBwdHI7CisJCUl0ZW1Qb2ludGVyRGF0YSBwcmV2X2lwdHIgPSBpcHRy OworCisJCUFzc2VydChHaW5EYXRhUGFnZUZyZWVTcGFjZVByZShwYWdlLCBw dHIpID49IDApOworCisJCXB0ciA9IGdpbkRhdGFQYWdlTGVhZlJlYWRJdGVt UG9pbnRlcihwdHIsICZpcHRyKTsKKworCQlBc3NlcnQoR2luRGF0YVBhZ2VG cmVlU3BhY2VQcmUocGFnZSwgcHRyKSA+PSAwKTsKKworCQljbXAgPSBnaW5D b21wYXJlSXRlbVBvaW50ZXJzKCZidHJlZS0+aXRlbXB0ciwgJmlwdHIpOwor CQlpZiAoY21wID09IDApCisJCXsKKwkJCXJlc3VsdCA9IHRydWU7CisJCQli cmVhazsKKwkJfQorCQlpZiAoY21wIDwgMCkKKwkJeworCQkJaXB0ciA9IHBy ZXZfaXB0cjsKKwkJCXB0ciA9IHByZXZfcHRyOworCQkJcmVzdWx0ID0gZmFs c2U7CisJCQlicmVhazsKKwkJfQorCX0KKworCUFzc2VydChHaW5EYXRhUGFn ZUZyZWVTcGFjZVByZShwYWdlLCBwdHIpID49IDApOworCisJKnB0ck91dCA9 IHB0cjsKKwkqaXB0ck91dCA9IGlwdHI7CisJcmV0dXJuIHJlc3VsdDsKK30K KworLyoKKyAqIEZpbmQgY29ycmVjdCBQb3N0aW5nSXRlbSBpbiBub24tbGVh ZiBwYWdlLiBJdCBzdXBwb3NlZCB0aGF0IHBhZ2UKKyAqIGNvcnJlY3RseSBj aG9zZW4gYW5kIHNlYXJjaGluZyB2YWx1ZSBTSE9VTEQgYmUgb24gcGFnZQor ICovCitzdGF0aWMgT2Zmc2V0TnVtYmVyCitmaW5kSW5MZWFmUGFnZVVuY29t cHJlc3NlZChHaW5CdHJlZSBidHJlZSwgUGFnZSBwYWdlLCBPZmZzZXROdW1i ZXIgKm9mZikKIHsKLQlQYWdlCQlwYWdlID0gQnVmZmVyR2V0UGFnZShzdGFj ay0+YnVmZmVyKTsKIAlPZmZzZXROdW1iZXIgbG93LAogCQkJCWhpZ2g7CiAJ aW50CQkJcmVzdWx0OwpAQCAtMTE3LDE4ICsyMDUsMTIgQEAgZGF0YUxvY2F0 ZUxlYWZJdGVtKEdpbkJ0cmVlIGJ0cmVlLCBHaW5CdHJlZVN0YWNrICpzdGFj aykKIAlBc3NlcnQoR2luUGFnZUlzTGVhZihwYWdlKSk7CiAJQXNzZXJ0KEdp blBhZ2VJc0RhdGEocGFnZSkpOwogCi0JaWYgKGJ0cmVlLT5mdWxsU2NhbikK LQl7Ci0JCXN0YWNrLT5vZmYgPSBGaXJzdE9mZnNldE51bWJlcjsKLQkJcmV0 dXJuIFRSVUU7Ci0JfQotCiAJbG93ID0gRmlyc3RPZmZzZXROdW1iZXI7CiAJ aGlnaCA9IEdpblBhZ2VHZXRPcGFxdWUocGFnZSktPm1heG9mZjsKIAogCWlm IChoaWdoIDwgbG93KQogCXsKLQkJc3RhY2stPm9mZiA9IEZpcnN0T2Zmc2V0 TnVtYmVyOworCQkqb2ZmID0gRmlyc3RPZmZzZXROdW1iZXI7CiAJCXJldHVy biBmYWxzZTsKIAl9CiAKQEAgLTE0Myw3ICsyMjUsNyBAQCBkYXRhTG9jYXRl TGVhZkl0ZW0oR2luQnRyZWUgYnRyZWUsIEdpbkJ0cmVlU3RhY2sgKnN0YWNr KQogCiAJCWlmIChyZXN1bHQgPT0gMCkKIAkJewotCQkJc3RhY2stPm9mZiA9 IG1pZDsKKwkJCSpvZmYgPSBtaWQ7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQog CQllbHNlIGlmIChyZXN1bHQgPiAwKQpAQCAtMTUyLDEzICsyMzQsNDcgQEAg ZGF0YUxvY2F0ZUxlYWZJdGVtKEdpbkJ0cmVlIGJ0cmVlLCBHaW5CdHJlZVN0 YWNrICpzdGFjaykKIAkJCWhpZ2ggPSBtaWQ7CiAJfQogCi0Jc3RhY2stPm9m ZiA9IGhpZ2g7CisJKm9mZiA9IGhpZ2g7CiAJcmV0dXJuIGZhbHNlOwogfQog CiAvKgotICogRmluZHMgbGlua3MgdG8gYmxrbm8gb24gbm9uLWxlYWYgcGFn ZSwgcmV0dXJucwotICogb2Zmc2V0IG9mIFBvc3RpbmdJdGVtCisgKiBTZWFy Y2hlcyBjb3JyZWN0IHBvc2l0aW9uIGZvciB2YWx1ZSB3aXRoaW4gbGVhZiBw YWdlLgorICogUGFnZSBzaG91bGQgYWxyZWFkeSBiZSBjb3JyZWN0bHkgY2hv c2VuLgorICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGZvdW5kIG9uIHBhZ2Uu CisgKi8KK3N0YXRpYyBib29sCitkYXRhTG9jYXRlTGVhZkl0ZW0oR2luQnRy ZWUgYnRyZWUsIEdpbkJ0cmVlU3RhY2sgKnN0YWNrKQoreworCVBhZ2UJCQlw YWdlID0gQnVmZmVyR2V0UGFnZShzdGFjay0+YnVmZmVyKTsKKwlib29sCQkJ cmVzdWx0OworCVBvaW50ZXIJCQlwdHI7CisKKwlBc3NlcnQoR2luUGFnZUlz RGF0YShwYWdlKSAmJiBHaW5QYWdlSXNMZWFmKHBhZ2UpKTsKKworCWlmIChi dHJlZS0+ZnVsbFNjYW4pCisJeworCQlzdGFjay0+b2ZmID0gSW52YWxpZE9m ZnNldE51bWJlcjsKKwkJc3RhY2stPnBhZ2VPZmZzZXQgPSBHaW5EYXRhTGVh ZlBhZ2VHZXRQb3N0aW5nTGlzdChwYWdlKSAtIHBhZ2U7CisJCXJldHVybiBU UlVFOworCX0KKworCWlmIChHaW5QYWdlSXNDb21wcmVzc2VkKHBhZ2UpKQor CXsKKwkJcmVzdWx0ID0gZmluZEluTGVhZlBhZ2VDb21wcmVzc2VkKGJ0cmVl LCBwYWdlLCAmc3RhY2stPmlwdHIsICZwdHIpOworCQlzdGFjay0+b2ZmID0g SW52YWxpZE9mZnNldE51bWJlcjsKKwkJc3RhY2stPnBhZ2VPZmZzZXQgPSBw dHIgLSBwYWdlOworCX0KKwllbHNlCisJeworCQlyZXN1bHQgPSBmaW5kSW5M ZWFmUGFnZVVuY29tcHJlc3NlZChidHJlZSwgcGFnZSwgJnN0YWNrLT5vZmYp OworCQlzdGFjay0+cGFnZU9mZnNldCA9IEludmFsaWRPZmZzZXROdW1iZXI7 CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBGaW5kcyBsaW5r cyB0byBibGtubyBvbiBub24tbGVhZiBwYWdlLCByZXR1cm5zIG9mZnNldCBv ZiBQb3N0aW5nSXRlbQogICovCiBzdGF0aWMgT2Zmc2V0TnVtYmVyCiBkYXRh RmluZENoaWxkUHRyKEdpbkJ0cmVlIGJ0cmVlLCBQYWdlIHBhZ2UsIEJsb2Nr TnVtYmVyIGJsa25vLCBPZmZzZXROdW1iZXIgc3RvcmVkT2ZmKQpAQCAtMjE5 LDM1ICszMzUsNiBAQCBkYXRhR2V0TGVmdE1vc3RQYWdlKEdpbkJ0cmVlIGJ0 cmVlLCBQYWdlIHBhZ2UpCiB9CiAKIC8qCi0gKiBhZGQgSXRlbVBvaW50ZXIg dG8gYSBsZWFmIHBhZ2UuCi0gKi8KLXZvaWQKLUdpbkRhdGFQYWdlQWRkSXRl bVBvaW50ZXIoUGFnZSBwYWdlLCBJdGVtUG9pbnRlciBkYXRhLCBPZmZzZXRO dW1iZXIgb2Zmc2V0KQotewotCU9mZnNldE51bWJlciBtYXhvZmYgPSBHaW5Q YWdlR2V0T3BhcXVlKHBhZ2UpLT5tYXhvZmY7Ci0JY2hhcgkgICAqcHRyOwot Ci0JQXNzZXJ0KEl0ZW1Qb2ludGVySXNWYWxpZChkYXRhKSk7Ci0JQXNzZXJ0 KEdpblBhZ2VJc0xlYWYocGFnZSkpOwotCi0JaWYgKG9mZnNldCA9PSBJbnZh bGlkT2Zmc2V0TnVtYmVyKQotCXsKLQkJcHRyID0gKGNoYXIgKikgR2luRGF0 YVBhZ2VHZXRJdGVtUG9pbnRlcihwYWdlLCBtYXhvZmYgKyAxKTsKLQl9Ci0J ZWxzZQotCXsKLQkJcHRyID0gKGNoYXIgKikgR2luRGF0YVBhZ2VHZXRJdGVt UG9pbnRlcihwYWdlLCBvZmZzZXQpOwotCQlpZiAobWF4b2ZmICsgMSAtIG9m ZnNldCAhPSAwKQotCQkJbWVtbW92ZShwdHIgKyBzaXplb2YoSXRlbVBvaW50 ZXJEYXRhKSwKLQkJCQkJcHRyLAotCQkJCQkobWF4b2ZmIC0gb2Zmc2V0ICsg MSkgKiBzaXplb2YoSXRlbVBvaW50ZXJEYXRhKSk7Ci0JfQotCW1lbWNweShw dHIsIGRhdGEsIHNpemVvZihJdGVtUG9pbnRlckRhdGEpKTsKLQotCUdpblBh Z2VHZXRPcGFxdWUocGFnZSktPm1heG9mZisrOwotfQotCi0vKgogICogYWRk IFBvc3RpbmdJdGVtIHRvIGEgbm9uLWxlYWYgcGFnZS4KICAqLwogdm9pZApA QCAtMjY2LDcgKzM1Myw3IEBAIEdpbkRhdGFQYWdlQWRkUG9zdGluZ0l0ZW0o UGFnZSBwYWdlLCBQb3N0aW5nSXRlbSAqZGF0YSwgT2Zmc2V0TnVtYmVyIG9m ZnNldCkKIAllbHNlCiAJewogCQlwdHIgPSAoY2hhciAqKSBHaW5EYXRhUGFn ZUdldFBvc3RpbmdJdGVtKHBhZ2UsIG9mZnNldCk7Ci0JCWlmIChtYXhvZmYg KyAxIC0gb2Zmc2V0ICE9IDApCisJCWlmIChvZmZzZXQgIT0gbWF4b2ZmICsg MSkKIAkJCW1lbW1vdmUocHRyICsgc2l6ZW9mKFBvc3RpbmdJdGVtKSwKIAkJ CQkJcHRyLAogCQkJCQkobWF4b2ZmIC0gb2Zmc2V0ICsgMSkgKiBzaXplb2Yo UG9zdGluZ0l0ZW0pKTsKQEAgLTI5NSwzMyArMzgyLDQwMCBAQCBHaW5QYWdl RGVsZXRlUG9zdGluZ0l0ZW0oUGFnZSBwYWdlLCBPZmZzZXROdW1iZXIgb2Zm c2V0KQogCUdpblBhZ2VHZXRPcGFxdWUocGFnZSktPm1heG9mZi0tOwogfQog CisKKy8qCisgKiBUaHJlc2hvbGQgdG8gc3BsaXQgYmluIGJldHdlZW4gcGFn ZSBpdGVtIGluZGV4ZXMgaW50byB0d28uIEl0J3MgdHdpY2UgbGFyZ2UKKyAq IGFzIGF2ZXJhZ2UgYmluIHNpemUsIHNvIGFmdGVyIHNwbGl0IGJpbiB3aWxs IGhhdmUgc2l6ZSBhYm91dCBhdmVyYWdlLgorICovCisjZGVmaW5lIFNQTElU X1RIUkVTSE9MRCAoMiAqIEdpbkRhdGFMZWFmTWF4UG9zdGluZ0xpc3RTaXpl IC8gKEdpbkRhdGFMZWFmSW5kZXhDb3VudCArIDEpKQorLyoKKyAqIFRocmVz aG9sZCB0byBhcHBlbmQgbmV3IHBhZ2UgaXRlbSBpbmRleGVzIGlzIGF2ZXJh Z2UgYmluIHNpemUuCisgKi8KKyNkZWZpbmUgQVBQRU5EX1RIUkVTSE9MRCAo R2luRGF0YUxlYWZNYXhQb3N0aW5nTGlzdFNpemUgLyAoR2luRGF0YUxlYWZJ bmRleENvdW50ICsgMSkpCisKKwogLyoKLSAqIGNoZWNrcyBzcGFjZSB0byBp bnN0YWxsIG5ldyB2YWx1ZSwKLSAqIGl0ZW0gcG9pbnRlciBuZXZlciBkZWxl dGVzIQorICogSW5jcmVtZW50YWwgdXBkYXRlIG9mIHBhZ2UgaXRlbSBpbmRl eGVzLiBJdGVtIGluZGV4ZXMgc3RhcnRpbmcgYXQgb2Zmc2V0CisgKiAnb2Zm JyB0byBiZSBzaGlmdCBieSAnbGVuJyBieXRlcy4KKyAqLwordm9pZAoraW5j clVwZGF0ZUl0ZW1JbmRleGVzKFBhZ2UgcGFnZSwgaW50IG9mZiwgaW50IGxl bikKK3sKKwlHaW5EYXRhTGVhZkl0ZW1JbmRleCAqaW5kZXhlcyA9IEdpblBh Z2VHZXRJbmRleGVzKHBhZ2UpOworCWludAkJCWk7CisJaW50CQkJdGFyZ2V0 YmluOworCisJQXNzZXJ0KEdpblBhZ2VJc0RhdGEocGFnZSkgJiYgR2luUGFn ZUlzTGVhZihwYWdlKSk7CisKKwkvKgorCSAqIEZpcnN0LCBhZGp1c3QgdGhl IG9mZnNldHMgaW4gYW55IGV4aXN0aW5nIGJpbnMuIFRoaXMgaXMgcmVxdWly ZWQKKwkgKiBmb3IgY29ycmVjdG5lc3MuCisJICovCisJZm9yIChpID0gR2lu RGF0YUxlYWZJbmRleENvdW50IC0gMTsgaSA+PSAwOyBpLS0pCisJeworCQlp ZiAoaW5kZXhlc1tpXS5wYWdlT2Zmc2V0ID09IDApCisJCQljb250aW51ZTsK KworCQlpZiAoaW5kZXhlc1tpXS5wYWdlT2Zmc2V0IDwgb2ZmKQorCQkJYnJl YWs7CisKKwkJaW5kZXhlc1tpXS5wYWdlT2Zmc2V0ICs9IGxlbjsKKwkJQXNz ZXJ0KGluZGV4ZXNbaV0ucGFnZU9mZnNldCA8IEdpbkRhdGFMZWFmUGFnZUdl dFBvc3RpbmdMaXN0U2l6ZShwYWdlKSk7CisJfQorCXRhcmdldGJpbiA9IGkg KyAxOworCisJLyoKKwkgKiBUaGUgbGVhZiBpdGVtIGluZGV4IGlzIG5vdyBj b25zaXN0ZW50LiBDaGVjayBpZiB0aGUgYmluIHRoZSBuZXcgdHVwbGVzCisJ ICogZmVsbCBpbnRvIGJlY2FtZSBzbyBsYXJnZSB0aGF0IGl0IHNob3VsZCBi ZSBzcGxpdCB0byBtYWtlIGl0IGJhbGFuY2VkLgorCSAqLworCWZvciAoOzsp CisJeworCQlpbnQJCQluZXh0b2ZmOworCQlpbnQJCQlwcmV2b2ZmOworCQlQ b2ludGVyCQliZWdpbnB0cjsKKwkJUG9pbnRlcgkJcHRyOworCQlJdGVtUG9p bnRlckRhdGEgaXB0cjsKKworCQlpZiAoaW5kZXhlc1tHaW5EYXRhTGVhZklu ZGV4Q291bnQgLSAxXS5wYWdlT2Zmc2V0ICE9IDApCisJCQlicmVhazsgLyog YWxsIHNsb3RzIGFyZSBpbiB1c2UsIGNhbid0IGluc2VydCBhIG5ldyBvbmUg Ki8KKworCQlpZiAoaW5kZXhlc1t0YXJnZXRiaW5dLnBhZ2VPZmZzZXQgPT0g MCkKKwkJCW5leHRvZmYgPSBHaW5EYXRhTGVhZlBhZ2VHZXRQb3N0aW5nTGlz dFNpemUocGFnZSk7CisJCWVsc2UKKwkJCW5leHRvZmYgPSBpbmRleGVzW3Rh cmdldGJpbl0ucGFnZU9mZnNldDsKKwkJaWYgKHRhcmdldGJpbiA9PSAwKQor CQl7CisJCQlwcmV2b2ZmID0gMDsKKwkJCU1lbVNldCgmaXB0ciwgMCwgc2l6 ZW9mKEl0ZW1Qb2ludGVyRGF0YSkpOworCQl9CisJCWVsc2UKKwkJeworCQkJ cHJldm9mZiA9IGluZGV4ZXNbdGFyZ2V0YmluIC0gMV0ucGFnZU9mZnNldDsK KwkJCWlwdHIgPSBpbmRleGVzW3RhcmdldGJpbiAtIDFdLmlwdHI7CisJCX0K KworCQkvKgorCQkgKiBJcyB0aGlzIGJpbiBsYXJnZSBlbm91Z2ggdG8gc3Bs aXQ/CisJCSAqLworCQlpZiAobmV4dG9mZiAtIHByZXZvZmYgPCBTUExJVF9U SFJFU0hPTEQpCisJCQlicmVhazsKKworCQkvKiBTaGlmdCBwYWdlIGl0ZW0g aW5kZXhlcyB0byBjcmVhdGUgYSBob2xlIGZvciBhIG5ldyBvbmUgKi8KKwkJ bWVtbW92ZSgmaW5kZXhlc1t0YXJnZXRiaW4gKyAxXSwgJmluZGV4ZXNbdGFy Z2V0YmluXSwKKwkJCQlzaXplb2YoR2luRGF0YUxlYWZJdGVtSW5kZXgpICoK KwkJCQkoR2luRGF0YUxlYWZJbmRleENvdW50IC0gdGFyZ2V0YmluIC0gMSkp OworCisJCS8qCisJCSAqIFNjYW4gdGhyb3VnaCB0aGUgYmluIHRvIGZpbmQg dGhlIHNwbGl0IHBvaW50LiBUaGUgYmluIGlzIG5vdAorCQkgKiBzcGxpdCBp biB0aGUgbWlkZGxlLCBidXQgYXQgdGhlIGZpcnN0IEFQUEVORF9USFJFU0hP TEQgbGltaXQuCisJCSAqIFRoYXQgbWlnaHQgbGVhdmUgdGhlIHJpZ2h0IGJp biBzdGlsbCBsYXJnZXIgdGhhbiBTUExJVF9USFJFU0hPTEQuCisJCSAqIElu IHRoYXQgY2FzZSB3ZSB3aWxsIGxvb3AgYmFjayB0byBzcGxpdCBpdCBmdXJ0 aGVyLgorCQkgKi8KKwkJYmVnaW5wdHIgPSBHaW5EYXRhTGVhZlBhZ2VHZXRQ b3N0aW5nTGlzdChwYWdlKSArIHByZXZvZmY7CisJCXB0ciA9IGJlZ2lucHRy OworCQl3aGlsZSAocHRyIC0gYmVnaW5wdHIgPCBBUFBFTkRfVEhSRVNIT0xE KQorCQkJcHRyID0gZ2luRGF0YVBhZ2VMZWFmUmVhZEl0ZW1Qb2ludGVyKHB0 ciwgJmlwdHIpOworCisJCS8qIEFkZCBuZXcgYmluICovCisJCWluZGV4ZXNb dGFyZ2V0YmluXS5pcHRyID0gaXB0cjsKKwkJaW5kZXhlc1t0YXJnZXRiaW5d LnBhZ2VPZmZzZXQgPSBwdHIgLSBHaW5EYXRhTGVhZlBhZ2VHZXRQb3N0aW5n TGlzdChwYWdlKTsKKwkJQXNzZXJ0KGluZGV4ZXNbdGFyZ2V0YmluXS5wYWdl T2Zmc2V0IDwgR2luRGF0YUxlYWZQYWdlR2V0UG9zdGluZ0xpc3RTaXplKHBh Z2UpKTsKKworCQkvKiBMb29wIHRvIHBvc3NpYmx5IGZ1cnRoZXIgc3BsaXQg dGhlIG5leHQgYmluLiAqLworCQl0YXJnZXRiaW4rKzsKKwl9Cit9CisKKy8q CisgKiBDb252ZXJ0IHVuY29tcHJlc3NlZCBsZWFmIHBvc3RpbmcgdHJlZSBw YWdlIGludG8gY29tcHJlc3NlZCBmb3JtYXQuIEluIHNvbWUKKyAqIHJhcmUg Y2FzZXMgY29tcHJlc3MgY291bGQgZmFpbCBiZWNhdXNlIHZhcmJ5dGUgZW5j b2RlZCBvZiBsYXJnZSAzMi1iaXQKKyAqIGludGVnZXIgY291bGQgYmUgNSBi eXRlcyBhbmQgd2UgYWRkaXRpb25hbGx5IHJlc2VydmUgc3BhY2UgZm9yIGl0 ZW0gaW5kZXhlcy4KKyAqIElmIGNvbnZlcnNpb24gc3VjY2VlZCBmdW5jdGlv biByZXR1cm5zIHRydWUuIElmIGNvbnZlcnNpb24gZmFpbGVkIGZ1bmN0aW9u CisgKiByZXR1cm5zIGZhbHNlIGFuZCBsZWF2ZSBwYWdlIHVudG91Y2hlZC4K KyAqLworYm9vbAorZGF0YUNvbXByZXNzTGVhZlBhZ2UoUGFnZSBwYWdlKQor eworCWNoYXIJCXBhZ2VDb3B5W0JMQ0tTWl07CisJT2Zmc2V0TnVtYmVyCWks IG1heG9mZjsKKwlJdGVtUG9pbnRlckRhdGEgcHJldl9pcHRyOworCUl0ZW1Q b2ludGVyIGlwdHI7CisJUG9pbnRlcgkJcHRyLCBjdXI7CisJU2l6ZQkJc2l6 ZSA9IDA7CisKKwkvKiBDaGVjayBpZiB3ZSd2ZSBlbm91Z2ggb2Ygc3BhY2Ug dG8gc3RvcmUgY29tcHJlc3NlZCByZXByZXNlbnRhdGlvbiAqLworCW1heG9m ZiA9IEdpblBhZ2VHZXRPcGFxdWUocGFnZSktPm1heG9mZjsKKwlNZW1TZXQo JnByZXZfaXB0ciwgMCwgc2l6ZW9mKEl0ZW1Qb2ludGVyRGF0YSkpOworCWZv ciAoaSA9IEZpcnN0T2Zmc2V0TnVtYmVyOyBpIDw9IG1heG9mZjsgaSsrKQor CXsKKwkJaXB0ciA9IEdpbkRhdGFQYWdlR2V0SXRlbVBvaW50ZXIocGFnZSwg aSk7CisJCXNpemUgKz0gZ2luRGF0YVBhZ2VMZWFmR2V0SXRlbVBvaW50ZXJT aXplKGlwdHIsICZwcmV2X2lwdHIpOworCQlwcmV2X2lwdHIgPSAqaXB0cjsK Kwl9CisKKwkvKgorCSAqIFdlIHNob3VsZCBiZSBhYmxlIHRvIGhvbGQgYXQg bGVhc3Qgb25lIG1vcmUgVElEIGZvciBwYWdlIGNvbXByZXNzaW9uIGJlCisJ ICogcHJvcGVybHkgeGxvZ2dlZC4KKwkgKi8KKwlpZiAoc2l6ZSA+IEdpbkRh dGFMZWFmTWF4UG9zdGluZ0xpc3RTaXplIC0gTUFYX0NPTVBSRVNTRURfSVRF TV9QT0lOVEVSX1NJWkUpCisJCXJldHVybiBmYWxzZTsKKworCS8qIE1ha2Ug Y29weSBvZiBwYWdlICovCisJbWVtY3B5KHBhZ2VDb3B5LCBwYWdlLCBCTENL U1opOworCisJLyogUmVpbml0aWFsaXplIHBhZ2UgYXMgY29tcHJlc3NlZCAq LworCUdpbkluaXREYXRhTGVhZlBhZ2UocGFnZSk7CisJR2luUGFnZUdldE9w YXF1ZShwYWdlKS0+cmlnaHRsaW5rID0gR2luUGFnZUdldE9wYXF1ZShwYWdl Q29weSktPnJpZ2h0bGluazsKKwkqR2luRGF0YVBhZ2VHZXRSaWdodEJvdW5k KHBhZ2UpID0gKkdpbkRhdGFQYWdlR2V0UmlnaHRCb3VuZChwYWdlQ29weSk7 CisJUGFnZVNldExTTihwYWdlLCBQYWdlR2V0TFNOKHBhZ2VDb3B5KSk7CisK KwkvKiBDb21wcmVzcyBUSURzIG9mIHBhZ2VDb3B5IGludG8gcGFnZSAqLwor CXB0ciA9IEdpbkRhdGFMZWFmUGFnZUdldFBvc3RpbmdMaXN0KHBhZ2UpOwor CWN1ciA9IHB0cjsKKwlNZW1TZXQoJnByZXZfaXB0ciwgMCwgc2l6ZW9mKEl0 ZW1Qb2ludGVyRGF0YSkpOworCWZvciAoaSA9IEZpcnN0T2Zmc2V0TnVtYmVy OyBpIDw9IG1heG9mZjsgaSsrKQorCXsKKwkJaXB0ciA9IEdpbkRhdGFQYWdl R2V0SXRlbVBvaW50ZXIocGFnZUNvcHksIGkpOworCQljdXIgPSBnaW5EYXRh UGFnZUxlYWZXcml0ZUl0ZW1Qb2ludGVyKGN1ciwgaXB0ciwgJnByZXZfaXB0 cik7CisJCXByZXZfaXB0ciA9ICppcHRyOworCX0KKwlHaW5EYXRhTGVhZlBh Z2VTZXRQb3N0aW5nTGlzdFNpemUocGFnZSwgY3VyIC0gcHRyKTsKKwlBc3Nl cnQoR2luRGF0YVBhZ2VGcmVlU3BhY2VQcmUocGFnZSwgY3VyKSA+PSAwKTsK Kwl1cGRhdGVJdGVtSW5kZXhlcyhwYWdlKTsKKworCXJldHVybiB0cnVlOwor fQorCisvKgorICogUGxhY2VzIGtleXMgdG8gbGVhZiBkYXRhIHBhZ2UgYW5k IGZpbGxzIFdBTCByZWNvcmQuCiAgKi8KIHN0YXRpYyBib29sCi1kYXRhSXNF bm91Z2hTcGFjZShHaW5CdHJlZSBidHJlZSwgQnVmZmVyIGJ1ZiwgT2Zmc2V0 TnVtYmVyIG9mZiwgdm9pZCAqaW5zZXJ0ZGF0YSkKK2RhdGFQbGFjZVRvUGFn ZUxlYWYoR2luQnRyZWUgYnRyZWUsIEJ1ZmZlciBidWYsIEdpbkJ0cmVlU3Rh Y2sgKnN0YWNrLAorCQkJCQl2b2lkICppbnNlcnRkYXRhLCBCbG9ja051bWJl ciB1cGRhdGVibGtubywKKwkJCQkJWExvZ1JlY0RhdGEgKipwcmRhdGEpCiB7 CisJR2luQnRyZWVEYXRhTGVhZkluc2VydERhdGEgKml0ZW1zID0gaW5zZXJ0 ZGF0YTsKKwlJdGVtUG9pbnRlciBuZXdJdGVtcyA9ICZpdGVtcy0+aXRlbXNb aXRlbXMtPmN1cml0ZW1dOworCWludAkJCW1heGl0ZW1zID0gaXRlbXMtPm5p dGVtIC0gaXRlbXMtPmN1cml0ZW07CiAJUGFnZQkJcGFnZSA9IEJ1ZmZlckdl dFBhZ2UoYnVmKTsKKwljaGFyCSAgICplbmRQdHI7CisJUG9pbnRlciAJcHRy LCBpbnNlcnRCZWdpbiwgaW5zZXJ0RW5kOworCUl0ZW1Qb2ludGVyRGF0YSBp cHRyID0ge3swLCAwfSwgMH0sIG5leHRJcHRyOworCVBvaW50ZXIJCXJlc3RQ dHI7CisJaW50CQkJbmV3bGVuOworCWludAkJCW5leHRsZW47CisJaW50CQkJ cmVzdGxlbjsKKwlpbnQJCQlmcmVlc3BhY2U7CisJaW50CQkJaTsKKwlJdGVt UG9pbnRlckRhdGEJcmJvdW5kOworCWludAkJCW9sZHNpemU7CisJaW50CQkJ bmV3c2l6ZTsKKwlib29sCQljb21wcmVzcyA9IGZhbHNlOworCisJLyogdGhl c2UgbXVzdCBiZSBzdGF0aWMgc28gdGhleSBjYW4gYmUgcmV0dXJuZWQgdG8g Y2FsbGVyICovCisJc3RhdGljIFhMb2dSZWNEYXRhIHJkYXRhWzJdOworCXN0 YXRpYyBnaW54bG9nSW5zZXJ0RGF0YUxlYWYgZGF0YTsKIAogCUFzc2VydChH aW5QYWdlSXNEYXRhKHBhZ2UpKTsKIAotCWlmIChHaW5QYWdlSXNMZWFmKHBh Z2UpKQorCS8qIFRyeSB0byBjb21wcmVzcyBwYWdlIGlmIGl0J3MgdW5jb21w cmVzc2VkICovCisJaWYgKCFHaW5QYWdlSXNDb21wcmVzc2VkKHBhZ2UpKQor CXsKKwkJaWYgKCFkYXRhQ29tcHJlc3NMZWFmUGFnZShwYWdlKSkKKwkJewor CQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJKGVycmNvZGUoRVJSQ09ERV9QUk9H UkFNX0xJTUlUX0VYQ0VFREVEKSwKKwkJCWVycm1zZygiY2FuJ3QgY29tcHJl c3MgYmxvY2sgJXUgb2YgZ2luIGluZGV4IFwiJXNcIiwgY29uc2lkZXIgUkVJ TkRFWCIsCisJCQkJCUJ1ZmZlckdldEJsb2NrTnVtYmVyKGJ1ZiksCisJCQkJ ICAgUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUoYnRyZWUtPmdpbnN0YXRlLT5p bmRleCkpKSk7CisJCX0KKwkJZmluZEluTGVhZlBhZ2VDb21wcmVzc2VkKGJ0 cmVlLCBwYWdlLCAmc3RhY2stPmlwdHIsICZwdHIpOworCQlzdGFjay0+b2Zm ID0gSW52YWxpZE9mZnNldE51bWJlcjsKKwkJc3RhY2stPnBhZ2VPZmZzZXQg PSBwdHIgLSBwYWdlOworCQljb21wcmVzcyA9IHRydWU7CisJfQorCisJZW5k UHRyID0gR2luRGF0YUxlYWZQYWdlR2V0UG9zdGluZ0xpc3RFbmQocGFnZSk7 CisKKwkvKgorCSAqIHN0YWNrLT5wYWdlT2Zmc2V0IHBvaW50cyB0byB0aGUg bG9jYXRpb24gd2hlcmUgd2UncmUgZ29pbmcgdG8gaW5zZXJ0CisJICogdGhl IG5ldyBpdGVtKHMpLCBhbmQgc3RhY2stPmlwdHIgaXMgdGhlIGNvcnJlc3Bv bmRpbmcgaXRlbSBwb2ludGVyCisJICogYXQgdGhhdCBsb2NhdGlvbi4KKwkg Ki8KKwlvbGRzaXplID0gR2luRGF0YUxlYWZQYWdlR2V0UG9zdGluZ0xpc3RT aXplKHBhZ2UpOworCWluc2VydEJlZ2luID0gcGFnZSArIHN0YWNrLT5wYWdl T2Zmc2V0OworCisJLyoKKwkgKiBSZWFkIHRoZSBuZXh0IGl0ZW0gcG9pbnRl ci4gVGhpcyB3aWxsIGJlY29tZSB0aGUgZmlyc3QgaXRlbSBwb2ludGVyCisJ ICogYWZ0ZXIgdGhlIG9uZXMgd2UgaW5zZXJ0LgorCSAqLworCXJlc3RQdHIg PSBpbnNlcnRCZWdpbjsKKwlpZiAoaW5zZXJ0QmVnaW4gPCBlbmRQdHIpCisJ eworCQluZXh0SXB0ciA9IHN0YWNrLT5pcHRyOworCQlyZXN0UHRyID0gZ2lu RGF0YVBhZ2VMZWFmUmVhZEl0ZW1Qb2ludGVyKGluc2VydEJlZ2luLCAmbmV4 dElwdHIpOworCQlyZXN0bGVuID0gR2luRGF0YUxlYWZQYWdlR2V0UG9zdGlu Z0xpc3RFbmQocGFnZSkgLSByZXN0UHRyOworCQlBc3NlcnQocmVzdGxlbiA+ PSAwKTsKKwkJbmV4dGxlbiA9IHJlc3RQdHIgLSBpbnNlcnRCZWdpbjsKKwkJ cmJvdW5kID0gbmV4dElwdHI7CisJfQorCWVsc2UgaWYgKEdpblBhZ2VSaWdo dE1vc3QocGFnZSkpCisJeworCQlJdGVtUG9pbnRlclNldE1heCgmcmJvdW5k KTsKKwkJcmVzdGxlbiA9IDA7CisJCW5leHRsZW4gPSAwOworCX0KKwllbHNl CisJeworCQlyYm91bmQgPSAqR2luRGF0YVBhZ2VHZXRSaWdodEJvdW5kKHBh Z2UpOworCQkvKgorCQkgKiBUaGUgcmlnaHQgYm91bmQgc3RvcmVkIG9uIHBh Z2UgaXMgaW5jbHVzaXZlLCBidXQgZm9yIHRoZSBjb21wYXJpc29uCisJCSAq IGJlbG93LCB3ZSB3YW50IGFuIGV4Y2x1c2l2ZSB2YWx1ZQorCQkgKi8KKwkJ cmJvdW5kLmlwX3Bvc2lkKys7CisJCXJlc3RsZW4gPSAwOworCQluZXh0bGVu ID0gMDsKKwl9CisKKwkvKgorCSAqIENhbGN1bGF0ZSBob3cgbWFueSBvZiB0 aGUgbmV3IGl0ZW1zIHdlIGluc2VydCBvbiB0aGlzIGxvY2F0aW9uLCBhbmQg aG93CisJICogbXVjaCBzcGFjZSB0aGV5IHRha2UuCisJICoKKwkgKiBOb3Rl OiBUaGUgc2l6ZSBvZiB0aGUgZmlyc3QgaXRlbSBhZnRlciB0aGUgaW5zZXJ0 ZWQgb25lIG1pZ2h0IGNoYW5nZQorCSAqIHdoZW4gaXQncyByZS1lbmNvZGVk LiBCdXQgaXQgY2FuIG5ldmVyIGJlY29tZSBsYXJnZXIsIGJlY2F1c2UgdGhl CisJICogZGlzdGFuY2UgZnJvbSB0aGUgcHJldmlvdXMgaXRlbSBnZXRzIHNt YWxsZXIsIG5vdCBsYXJnZXIuIFdlIGlnbm9yZQorCSAqIHRoYXQgZWZmZWN0 LCBhbmQgcG9zc2libHkgd2FzdGUgYSBmZXcgYnl0ZXMuCisJICovCisJaXB0 ciA9IHN0YWNrLT5pcHRyOworCW5ld2xlbiA9IDA7CisJZnJlZXNwYWNlID0g R2luRGF0YUxlYWZQYWdlR2V0RnJlZVNwYWNlKHBhZ2UpOworCWZvciAoaSA9 IDA7IGkgPCBtYXhpdGVtczsgaSsrKQogCXsKLQkJR2luQnRyZWVEYXRhTGVh Zkluc2VydERhdGEgKml0ZW1zID0gaW5zZXJ0ZGF0YTsKKwkJaW50CQlsOwog Ci0JCWlmIChHaW5QYWdlUmlnaHRNb3N0KHBhZ2UpICYmIG9mZiA+IEdpblBh Z2VHZXRPcGFxdWUocGFnZSktPm1heG9mZikKKwkJaWYgKGdpbkNvbXBhcmVJ dGVtUG9pbnRlcnMoJm5ld0l0ZW1zW2ldLCAmcmJvdW5kKSA+PSAwKQogCQl7 Ci0JCQlpZiAoKGl0ZW1zLT5uaXRlbSAtIGl0ZW1zLT5jdXJpdGVtKSAqIHNp emVvZihJdGVtUG9pbnRlckRhdGEpIDw9IEdpbkRhdGFQYWdlR2V0RnJlZVNw YWNlKHBhZ2UpKQotCQkJCXJldHVybiB0cnVlOworCQkJLyoKKwkJCSAqIFRo aXMgbmVlZHMgdG8gZ28gdG8gc29tZSBvdGhlciBsb2NhdGlvbiBpbiB0aGUg dHJlZS4gKFRoZQorCQkJICogY2FsbGVyIHNob3VsZCd2ZSBjaG9zZW4gdGhl IGluc2VydCBsb2NhdGlvbiBzbyB0aGF0IGF0IGxlYXN0CisJCQkgKiB0aGUg Zmlyc3QgaXRlbSBnb2VzIGhlcmUuKQorCQkJICovCisJCQlBc3NlcnQoaSA+ IDApOworCQkJYnJlYWs7CiAJCX0KLQkJZWxzZSBpZiAoc2l6ZW9mKEl0ZW1Q b2ludGVyRGF0YSkgPD0gR2luRGF0YVBhZ2VHZXRGcmVlU3BhY2UocGFnZSkp Ci0JCQlyZXR1cm4gdHJ1ZTsKKworCQlsID0gZ2luRGF0YVBhZ2VMZWFmR2V0 SXRlbVBvaW50ZXJTaXplKCZuZXdJdGVtc1tpXSwgJmlwdHIpOworCQlpZiAo bCArIG5ld2xlbiArIG5leHRsZW4gPiBmcmVlc3BhY2UpCisJCXsKKwkJCS8q IHRoaXMgZG9lc24ndCBmaXQgYW55bW9yZSAqLworCQkJYnJlYWs7CisJCX0K KworCQluZXdsZW4gKz0gbDsKKwkJaXB0ciA9IG5ld0l0ZW1zW2ldOwogCX0K LQllbHNlIGlmIChzaXplb2YoUG9zdGluZ0l0ZW0pIDw9IEdpbkRhdGFQYWdl R2V0RnJlZVNwYWNlKHBhZ2UpKQotCQlyZXR1cm4gdHJ1ZTsKKwltYXhpdGVt cyA9IGk7CisJaWYgKG1heGl0ZW1zID09IDApCisJeworCQkvKgorCQkgKiBQ YWdlIGNvbXByZXNzaW9uIHJlc2VydmVzIHNwYWNlIGZvciBhdCBsZWFzdCBv bmUgbW9yZSBUSUQuIFNvIGl0CisJCSAqIG11c3QgYmUgaW5zZXJ0ZWQuCisJ CSAqLworCQlBc3NlcnQoIWNvbXByZXNzKTsKIAotCXJldHVybiBmYWxzZTsK KwkJcmV0dXJuIGZhbHNlOyAvKiBubyBlbnRyaWVzIGZpdCBvbiB0aGlzIHBh Z2UgKi8KKwl9CisKKwkvKgorCSAqIFdlIGhhdmUgdG8gcmUtZW5jb2RlIHRo ZSBmaXJzdCBvbGQgaXRlbSBwb2ludGVyIGFmdGVyIHRoZSBvbmVzIHdlJ3Jl CisJICogaW5zZXJ0aW5nLiBDYWxjdWxhdGUgaG93IG11Y2ggc3BhY2UgaXQg d2lsbCB0YWtlIHJlLWVuY29kZWQuCisJICovCisJaWYgKGluc2VydEJlZ2lu IDwgZW5kUHRyKQorCXsKKwkJSXRlbVBvaW50ZXJEYXRhIGxhc3RuZXcgPSBu ZXdJdGVtc1ttYXhpdGVtcyAtIDFdOworCisJCW5leHRsZW4gPSBnaW5EYXRh UGFnZUxlYWZHZXRJdGVtUG9pbnRlclNpemUoJm5leHRJcHRyLCAmbGFzdG5l dyk7CisJfQorCisJLyoKKwkgKiBPaywgd2UgaGF2ZSBjb2xsZWN0ZWQgYWxs IHRoZSBpbmZvcm1hdGlvbiB3ZSBuZWVkLiBTaGlmdCBhbnkgZW50cmllcwor CSAqIGFmdGVyIHRoZSBpbnNlcnRpb24gcG9pbnQgdGhhdCB3ZSBhcmUgbm90 IGdvaW5nIHRvIG90aGVyd2lzZSBtb2RpZnkuCisJICovCisJQXNzZXJ0KEdp bkRhdGFQYWdlRnJlZVNwYWNlUHJlKHBhZ2UsIHJlc3RQdHIgKyBuZXdsZW4g KyBuZXh0bGVuICsgcmVzdGxlbikgPj0gMCk7CisJaW5zZXJ0RW5kID0gaW5z ZXJ0QmVnaW4gKyBuZXdsZW4gKyBuZXh0bGVuOworCWlmIChyZXN0bGVuID4g MCkKKwkJbWVtbW92ZShpbnNlcnRFbmQsIHJlc3RQdHIsIHJlc3RsZW4pOwor CisJLyogV3JpdGUgdGhlIG5ldyBpdGVtcyAqLworCXB0ciA9IGluc2VydEJl Z2luOworCWlwdHIgPSBzdGFjay0+aXB0cjsKKwlmb3IgKGkgPSAwOyBpIDwg bWF4aXRlbXM7IGkrKykKKwl7CisJCXB0ciA9IGdpbkRhdGFQYWdlTGVhZldy aXRlSXRlbVBvaW50ZXIocHRyLCAmbmV3SXRlbXNbaV0sICZpcHRyKTsKKwkJ QXNzZXJ0KEdpbkRhdGFQYWdlRnJlZVNwYWNlUHJlKHBhZ2UsIHB0cikgPj0g MCk7CisJCWlwdHIgPSBuZXdJdGVtc1tpXTsKKwl9CisKKwkvKiBXcml0ZSB0 aGUgcmUtZW5jb2RlZCBvbGQgaXRlbSAqLworCWlmIChuZXh0bGVuID4gMCkK Kwl7CisJCXB0ciA9IGdpbkRhdGFQYWdlTGVhZldyaXRlSXRlbVBvaW50ZXIo cHRyLCAmbmV4dElwdHIsICZpcHRyKTsKKwkJQXNzZXJ0KEdpbkRhdGFQYWdl RnJlZVNwYWNlUHJlKHBhZ2UscHRyKSA+PSAwKTsKKwl9CisJQXNzZXJ0KHB0 ciA9PSBpbnNlcnRFbmQpOworCisJbmV3c2l6ZSA9IGluc2VydEVuZCArIHJl c3RsZW4gLSBHaW5EYXRhTGVhZlBhZ2VHZXRQb3N0aW5nTGlzdChwYWdlKTsK KwlHaW5EYXRhTGVhZlBhZ2VTZXRQb3N0aW5nTGlzdFNpemUocGFnZSwgbmV3 c2l6ZSk7CisKKwkvKi0tLQorCSAqIFVwZGF0ZSBpbmRleGVzIGluIHRoZSBl bmQgb2YgcGFnZS4gSG93IGRvIHdlIHVwZGF0ZSBpdGVtIGluZGV4ZXMgaXMK KwkgKiBpbGx1c3RyYXRlZCBpbiBmb2xsb3dpbmcgcGljdHVyZS4gTGV0IGl0 ZW0gaW5kZXhlcyAxIGFuZCAyIGFyZSBpdGVtCisJICogcG9pbnRlcnMganVz dCBiZWZvcmUgYW5kIGFmdGVyIG5leHQgVElEIGFmdGVyIHBsYWNlIHdlIGlu c2VydGluZyBuZXcKKwkgKiBUSURzLgorCSAqCisJICogICAgICAgICAgICAg ICAgICAxICAgICAgICAgIDIKKwkgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tKy0tLS0tLS0tLS0tKworCSAqIHwgdW50b3VjaGVkIFRJRHMgfCBu ZXh0IFRJRCB8IHJlc3QgVElEcyB8CisJICogKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKKwkgKiAgICAgICAgICAgICAgICAg IF4KKwkgKiAgICAgICAgICAgICAgICAgIHwKKwkgKiAgICAgICAgICAgICAg ICAgIFBsYWNlIHdoZXJlIHdlIGluc2VydCBuZXcgVElEcworCSAqCisJICog ICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgMgorCSAq ICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0t LS0tLS0tLSsKKwkgKiB8IHVudG91Y2hlZCBUSURzIHwgbmV3IFRJRHMgfCBu ZXh0IFRJRCB8IHJlc3QgVElEcyB8CisJICogKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKworCSAqCisJICog SXRlbSBpbmRleCAxIHdhc24ndCB1cGRhdGVkIGJlY2F1c2UgcHJldmlvdXMg VElEIHJlbWFpbmluZyB0aGUgc2FtZSBmb3IKKwkgKiB0aGlzIG9mZnNldC4g SXRlbSBpbmRleCAyIHdhcyBzaGlmdGVkIGJlY2F1c2Ugb2YgYm90aCBpbnNl cnRpbmcgbmV3IFRJRHMKKwkgKiBhbmQgcG9zc2libGUgY2hhbmdlIG9mIG5l eHQgVElEIHNpemUuIFNhbWUgc2hpZnQgYXBwbHkgdG8gdGhlIGFsbAorCSAq IHN1YnNlcXVlbnQgaXRlbSBpbmRleGVzLgorCSAqLworCWluY3JVcGRhdGVJ dGVtSW5kZXhlcyhwYWdlLCByZXN0UHRyIC0gR2luRGF0YUxlYWZQYWdlR2V0 UG9zdGluZ0xpc3QocGFnZSksIG5ld3NpemUgLSBvbGRzaXplKTsKKworCS8q IFB1dCBXQUwgZGF0YSAqLworCSpwcmRhdGEgPSByZGF0YTsKKworCWRhdGEu YmVnaW5PZmZzZXQgPSBpbnNlcnRCZWdpbiAtIEdpbkRhdGFMZWFmUGFnZUdl dFBvc3RpbmdMaXN0KHBhZ2UpOworCWRhdGEubmV3bGVuID0gaW5zZXJ0RW5k IC0gaW5zZXJ0QmVnaW47CisJZGF0YS5yZXN0T2Zmc2V0ID0gcmVzdFB0ciAt IEdpbkRhdGFMZWFmUGFnZUdldFBvc3RpbmdMaXN0KHBhZ2UpOworCisJcmRh dGFbMF0uYnVmZmVyID0gSW52YWxpZEJ1ZmZlcjsKKwlyZGF0YVswXS5kYXRh ID0gKGNoYXIgKikgJmRhdGE7CisJcmRhdGFbMF0ubGVuID0gb2Zmc2V0b2Yo Z2lueGxvZ0luc2VydERhdGFMZWFmLCBuZXdkYXRhKTsKKwlyZGF0YVswXS5u ZXh0ID0gJnJkYXRhWzFdOworCisJcmRhdGFbMV0uYnVmZmVyID0gYnVmOwor CXJkYXRhWzFdLmJ1ZmZlcl9zdGQgPSBUUlVFOworCXJkYXRhWzFdLmRhdGEg PSBpbnNlcnRCZWdpbjsKKwlyZGF0YVsxXS5sZW4gPSBpbnNlcnRFbmQgLSBp bnNlcnRCZWdpbjsKKwlyZGF0YVsxXS5uZXh0ID0gTlVMTDsKKworCWl0ZW1z LT5jdXJpdGVtICs9IG1heGl0ZW1zOworCisJQXNzZXJ0KEdpbkRhdGFMZWFm UGFnZUdldEZyZWVTcGFjZShwYWdlKSA8PSBmcmVlc3BhY2UpOworCisJcmV0 dXJuIHRydWU7CiB9CiAKIC8qCkBAIC0zMzUsMjMwICs3ODksMzQwIEBAIGRh dGFJc0Vub3VnaFNwYWNlKEdpbkJ0cmVlIGJ0cmVlLCBCdWZmZXIgYnVmLCBP ZmZzZXROdW1iZXIgb2ZmLCB2b2lkICppbnNlcnRkYXRhCiAgKiAndXBkYXRl Ymxrbm8nLgogICovCiBzdGF0aWMgYm9vbAotZGF0YVBsYWNlVG9QYWdlKEdp bkJ0cmVlIGJ0cmVlLCBCdWZmZXIgYnVmLCBPZmZzZXROdW1iZXIgb2ZmLAot CQkJCXZvaWQgKmluc2VydGRhdGEsIEJsb2NrTnVtYmVyIHVwZGF0ZWJsa25v LAotCQkJCVhMb2dSZWNEYXRhICoqcHJkYXRhKQorZGF0YVBsYWNlVG9QYWdl SW50ZXJuYWwoR2luQnRyZWUgYnRyZWUsIEJ1ZmZlciBidWYsIEdpbkJ0cmVl U3RhY2sgKnN0YWNrLAorCQkJCQkJdm9pZCAqaW5zZXJ0ZGF0YSwgQmxvY2tO dW1iZXIgdXBkYXRlYmxrbm8sCisJCQkJCQlYTG9nUmVjRGF0YSAqKnByZGF0 YSkKIHsKIAlQYWdlCQlwYWdlID0gQnVmZmVyR2V0UGFnZShidWYpOworCU9m ZnNldE51bWJlciBvZmYgPSBzdGFjay0+b2ZmOworCVBvc3RpbmdJdGVtICpw aXRlbTsKIAkvKiB0aGVzZSBtdXN0IGJlIHN0YXRpYyBzbyB0aGV5IGNhbiBi ZSByZXR1cm5lZCB0byBjYWxsZXIgKi8KIAlzdGF0aWMgWExvZ1JlY0RhdGEg cmRhdGFbMl07CiAKIAkvKiBxdWljayBleGl0IGlmIGl0IGRvZXNuJ3QgZml0 ICovCi0JaWYgKCFkYXRhSXNFbm91Z2hTcGFjZShidHJlZSwgYnVmLCBvZmYs IGluc2VydGRhdGEpKQorCWlmIChHaW5Ob25MZWFmRGF0YVBhZ2VHZXRGcmVl U3BhY2UocGFnZSkgPCBzaXplb2YoUG9zdGluZ0l0ZW0pKQogCQlyZXR1cm4g ZmFsc2U7CiAKIAkqcHJkYXRhID0gcmRhdGE7CiAJQXNzZXJ0KEdpblBhZ2VJ c0RhdGEocGFnZSkpOwogCiAJLyogVXBkYXRlIGV4aXN0aW5nIGRvd25saW5r IHRvIHBvaW50IHRvIG5leHQgcGFnZSAob24gaW50ZXJuYWwgcGFnZSkgKi8K LQlpZiAoIUdpblBhZ2VJc0xlYWYocGFnZSkpCi0JewotCQlQb3N0aW5nSXRl bSAqcGl0ZW0gPSBHaW5EYXRhUGFnZUdldFBvc3RpbmdJdGVtKHBhZ2UsIG9m Zik7CisJcGl0ZW0gPSBHaW5EYXRhUGFnZUdldFBvc3RpbmdJdGVtKHBhZ2Us IG9mZik7CisJUG9zdGluZ0l0ZW1TZXRCbG9ja051bWJlcihwaXRlbSwgdXBk YXRlYmxrbm8pOwogCi0JCVBvc3RpbmdJdGVtU2V0QmxvY2tOdW1iZXIocGl0 ZW0sIHVwZGF0ZWJsa25vKTsKLQl9CisJLyogQWRkIG5ldyBpdGVtICovCisJ cGl0ZW0gPSBpbnNlcnRkYXRhOworCUdpbkRhdGFQYWdlQWRkUG9zdGluZ0l0 ZW0ocGFnZSwgcGl0ZW0sIG9mZik7CiAKLQlpZiAoR2luUGFnZUlzTGVhZihw YWdlKSkKLQl7Ci0JCUdpbkJ0cmVlRGF0YUxlYWZJbnNlcnREYXRhICppdGVt cyA9IGluc2VydGRhdGE7Ci0JCXN0YXRpYyBnaW54bG9nSW5zZXJ0RGF0YUxl YWYgZGF0YTsKLQkJdWludDMyCQlzYXZlZFBvcyA9IGl0ZW1zLT5jdXJpdGVt OworCXJkYXRhWzBdLmJ1ZmZlciA9IEludmFsaWRCdWZmZXI7CisJcmRhdGFb MF0uZGF0YSA9IChjaGFyICopIHBpdGVtOworCXJkYXRhWzBdLmxlbiA9IHNp emVvZihQb3N0aW5nSXRlbSk7CisJcmRhdGFbMF0ubmV4dCA9IE5VTEw7CiAK LQkJaWYgKEdpblBhZ2VSaWdodE1vc3QocGFnZSkgJiYgb2ZmID4gR2luUGFn ZUdldE9wYXF1ZShwYWdlKS0+bWF4b2ZmKQotCQl7Ci0JCQkvKiB1c3VhbGx5 LCBjcmVhdGUgaW5kZXguLi4gKi8KLQkJCXdoaWxlIChpdGVtcy0+Y3VyaXRl bSA8IGl0ZW1zLT5uaXRlbSkKLQkJCXsKLQkJCQlHaW5EYXRhUGFnZUFkZEl0 ZW1Qb2ludGVyKHBhZ2UsIGl0ZW1zLT5pdGVtcyArIGl0ZW1zLT5jdXJpdGVt LCBvZmYpOwotCQkJCW9mZisrOwotCQkJCWl0ZW1zLT5jdXJpdGVtKys7Ci0J CQl9Ci0JCQlkYXRhLm5pdGVtID0gaXRlbXMtPmN1cml0ZW0gLSBzYXZlZFBv czsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUdpbkRhdGFQYWdlQWRkSXRlbVBv aW50ZXIocGFnZSwgaXRlbXMtPml0ZW1zICsgaXRlbXMtPmN1cml0ZW0sIG9m Zik7Ci0JCQlpdGVtcy0+Y3VyaXRlbSsrOwotCQkJZGF0YS5uaXRlbSA9IDE7 Ci0JCX0KKwlyZXR1cm4gdHJ1ZTsKK30KIAotCQlyZGF0YVswXS5idWZmZXIg PSBJbnZhbGlkQnVmZmVyOwotCQlyZGF0YVswXS5kYXRhID0gKGNoYXIgKikg JmRhdGE7Ci0JCXJkYXRhWzBdLmxlbiA9IG9mZnNldG9mKGdpbnhsb2dJbnNl cnREYXRhTGVhZiwgaXRlbXMpOwotCQlyZGF0YVswXS5uZXh0ID0gJnJkYXRh WzFdOworLyoKKyAqIFBsYWNlcyBhbiBpdGVtIChvciBpdGVtcykgdG8gYSBw b3N0aW5nIHRyZWUuIENhbGxzIHJlbGV2YW50IGZ1bmN0aW9uIG9mCisgKiBp bnRlcm5hbCBvZiBsZWFmIHBhZ2UgYmVjYXVzZSB0aGV5IGFyZSBoYW5kbGVk IHZlcnkgZGlmZmVyZW50bHkuCisgKi8KK3N0YXRpYyBib29sCitkYXRhUGxh Y2VUb1BhZ2UoR2luQnRyZWUgYnRyZWUsIEJ1ZmZlciBidWYsIEdpbkJ0cmVl U3RhY2sgKnN0YWNrLAorCQkJCXZvaWQgKmluc2VydGRhdGEsIEJsb2NrTnVt YmVyIHVwZGF0ZWJsa25vLAorCQkJCVhMb2dSZWNEYXRhICoqcHJkYXRhKQor eworCUFzc2VydChHaW5QYWdlSXNEYXRhKEJ1ZmZlckdldFBhZ2UoYnVmKSkp OwogCi0JCXJkYXRhWzFdLmJ1ZmZlciA9IEludmFsaWRCdWZmZXI7Ci0JCXJk YXRhWzFdLmRhdGEgPSAoY2hhciAqKSAmaXRlbXMtPml0ZW1zW3NhdmVkUG9z XTsKLQkJcmRhdGFbMV0ubGVuID0gc2l6ZW9mKEl0ZW1Qb2ludGVyRGF0YSkg KiBkYXRhLm5pdGVtOwotCQlyZGF0YVsxXS5uZXh0ID0gTlVMTDsKLQl9CisJ aWYgKEdpblBhZ2VJc0xlYWYoQnVmZmVyR2V0UGFnZShidWYpKSkKKwkJcmV0 dXJuIGRhdGFQbGFjZVRvUGFnZUxlYWYoYnRyZWUsIGJ1Ziwgc3RhY2ssCisJ CQkJCQkJCSAgIGluc2VydGRhdGEsIHVwZGF0ZWJsa25vLAorCQkJCQkJCQkg ICBwcmRhdGEpOwogCWVsc2UKLQl7Ci0JCVBvc3RpbmdJdGVtICpwaXRlbSA9 IGluc2VydGRhdGE7Ci0KLQkJR2luRGF0YVBhZ2VBZGRQb3N0aW5nSXRlbShw YWdlLCBwaXRlbSwgb2ZmKTsKLQotCQlyZGF0YVswXS5idWZmZXIgPSBJbnZh bGlkQnVmZmVyOwotCQlyZGF0YVswXS5kYXRhID0gKGNoYXIgKikgcGl0ZW07 Ci0JCXJkYXRhWzBdLmxlbiA9IHNpemVvZihQb3N0aW5nSXRlbSk7Ci0JCXJk YXRhWzBdLm5leHQgPSBOVUxMOwotCX0KLQotCXJldHVybiB0cnVlOworCQly ZXR1cm4gZGF0YVBsYWNlVG9QYWdlSW50ZXJuYWwoYnRyZWUsIGJ1Ziwgc3Rh Y2ssCisJCQkJCQkJCQkgICBpbnNlcnRkYXRhLCB1cGRhdGVibGtubywKKwkJ CQkJCQkJCSAgIHByZGF0YSk7CiB9CiAKIC8qCi0gKiBzcGxpdCBwYWdlIGFu ZCBmaWxscyBXQUwgcmVjb3JkLiBvcmlnaW5hbCBidWZmZXIobGJ1ZikgbGVh dmVzIHVudG91Y2hlZCwKLSAqIHJldHVybnMgc2hhZG93IHBhZ2Ugb2YgbGJ1 ZiBmaWxsZWQgbmV3IGRhdGEuIEluIGxlYWYgcGFnZSBhbmQgYnVpbGQgbW9k ZSBwdXRzIGFsbAotICogSXRlbVBvaW50ZXJzIHRvIHBhZ2VzLiBBbHNvLCBp biBidWlsZCBtb2RlIHNwbGl0cyBkYXRhIGJ5IHdheSB0byBmdWxsIGZ1bGxl ZAotICogbGVmdCBwYWdlCisgKiBQbGFjZSB0dXBsZSBhbmQgc3BsaXQgcGFn ZSwgb3JpZ2luYWwgYnVmZmVyKGxidWYpIGxlYXZlcyB1bnRvdWNoZWQsCisg KiByZXR1cm5zIHNoYWRvdyBwYWdlIG9mIGxidWYgZmlsbGVkIG5ldyBkYXRh LgogICovCiBzdGF0aWMgUGFnZQotZGF0YVNwbGl0UGFnZShHaW5CdHJlZSBi dHJlZSwgQnVmZmVyIGxidWYsIEJ1ZmZlciByYnVmLCBPZmZzZXROdW1iZXIg b2ZmLAotCQkJICB2b2lkICppbnNlcnRkYXRhLCBCbG9ja051bWJlciB1cGRh dGVibGtubywgWExvZ1JlY0RhdGEgKipwcmRhdGEpCitkYXRhU3BsaXRQYWdl TGVhZihHaW5CdHJlZSBidHJlZSwgQnVmZmVyIGxidWYsIEJ1ZmZlciByYnVm LAorCQkJCSAgR2luQnRyZWVTdGFjayAqc3RhY2ssCisJCQkJICB2b2lkICpp bnNlcnRkYXRhLCBCbG9ja051bWJlciB1cGRhdGVibGtubywKKwkJCQkgIFhM b2dSZWNEYXRhICoqcHJkYXRhKQogewotCWNoYXIJICAgKnB0cjsKLQlPZmZz ZXROdW1iZXIgc2VwYXJhdG9yOwotCUl0ZW1Qb2ludGVyIGJvdW5kOwotCVBh Z2UJCWxwYWdlID0gUGFnZUdldFRlbXBQYWdlQ29weShCdWZmZXJHZXRQYWdl KGxidWYpKTsKLQlib29sCQlpc2xlYWYgPSBHaW5QYWdlSXNMZWFmKGxwYWdl KTsKLQlJdGVtUG9pbnRlckRhdGEgb2xkYm91bmQgPSAqR2luRGF0YVBhZ2VH ZXRSaWdodEJvdW5kKGxwYWdlKTsKLQlpbnQJCQlzaXplb2ZpdGVtID0gR2lu U2l6ZU9mRGF0YVBhZ2VJdGVtKGxwYWdlKTsKLQlPZmZzZXROdW1iZXIgbWF4 b2ZmID0gR2luUGFnZUdldE9wYXF1ZShscGFnZSktPm1heG9mZjsKKwlHaW5C dHJlZURhdGFMZWFmSW5zZXJ0RGF0YSAqaXRlbXMgPSBpbnNlcnRkYXRhOwor CU9mZnNldE51bWJlciBvZmYgPSBzdGFjay0+b2ZmOworCVNpemUJCXRvdGFs c2l6ZTsKKwlQb2ludGVyCQlwdHI7CisJUG9pbnRlcgkJb2xkUHRyLCBvbGRF bmRQdHI7CisJUGFnZQkJb2xkUGFnZSA9IEJ1ZmZlckdldFBhZ2UobGJ1Zik7 CisJUGFnZQkJcGFnZTsKKwlQYWdlCQlscGFnZSA9IFBhZ2VHZXRUZW1wUGFn ZShvbGRQYWdlKTsKIAlQYWdlCQlycGFnZSA9IEJ1ZmZlckdldFBhZ2UocmJ1 Zik7Ci0JU2l6ZQkJcGFnZVNpemUgPSBQYWdlR2V0UGFnZVNpemUobHBhZ2Up OwotCVNpemUJCWZyZWVTcGFjZTsKKwlJdGVtUG9pbnRlckRhdGEgaXB0ciwg cHJldklwdHIsIG1heExlZnRJcHRyOworCUl0ZW1Qb2ludGVyRGF0YSBuZXh0 b2xkLCBuZXh0bmV3OworCWludAkJCW1heEl0ZW1JbmRleCA9IGl0ZW1zLT5j dXJpdGVtOwogCiAJLyogdGhlc2UgbXVzdCBiZSBzdGF0aWMgc28gdGhleSBj YW4gYmUgcmV0dXJuZWQgdG8gY2FsbGVyICovCi0Jc3RhdGljIGdpbnhsb2dT cGxpdERhdGEgZGF0YTsKLQlzdGF0aWMgWExvZ1JlY0RhdGEgcmRhdGFbMl07 Ci0Jc3RhdGljIGNoYXIgdmVjdG9yWzIgKiBCTENLU1pdOwotCi0JR2luSW5p dFBhZ2UocnBhZ2UsIEdpblBhZ2VHZXRPcGFxdWUobHBhZ2UpLT5mbGFncywg cGFnZVNpemUpOwotCWZyZWVTcGFjZSA9IEdpbkRhdGFQYWdlR2V0RnJlZVNw YWNlKHJwYWdlKTsKKwlzdGF0aWMgZ2lueGxvZ1NwbGl0RGF0YUxlYWYgZGF0 YTsKKwlzdGF0aWMgWExvZ1JlY0RhdGEgcmRhdGFbM107CiAKIAkqcHJkYXRh ID0gcmRhdGE7CiAKLQkvKiBVcGRhdGUgZXhpc3RpbmcgZG93bmxpbmsgdG8g cG9pbnQgdG8gbmV4dCBwYWdlIChvbiBpbnRlcm5hbCBwYWdlKSAqLwotCWlm ICghaXNsZWFmKQotCXsKLQkJUG9zdGluZ0l0ZW0gKnBpdGVtID0gR2luRGF0 YVBhZ2VHZXRQb3N0aW5nSXRlbShscGFnZSwgb2ZmKTsKLQotCQlQb3N0aW5n SXRlbVNldEJsb2NrTnVtYmVyKHBpdGVtLCB1cGRhdGVibGtubyk7Ci0JfQot Ci0JaWYgKGlzbGVhZikKKwkvKgorCSAqIEVzdGltYXRlIHRoZSB0b3RhbCBz aXplIG9mIHRoZSBwb3N0aW5nIGxpc3RzIHdlJ3JlIGdvaW5nIHRvIHN0b3Jl IG9uCisJICogdGhlIHR3byBoYWx2ZXMuCisJICoKKwkgKiBUcnkgdG8gcGxh Y2UgYXMgbWFueSBpdGVtcyBhcyB3ZSBjYW4gaWYgd2UncmUgcGxhY2luZyB0 aGVtIHRvIHRoZSBlbmQKKwkgKiBvZiByaWdodG1vc3QgcGFnZS4gT3RoZXJ3 aXNlIHBsYWNlIG9uZSBpdGVtLiBXZSdsbCByZXNlcnZlIHR3bworCSAqIE1B WF9DT01QUkVTU0VEX0lURU1fUE9JTlRFUl9TSVpFLiBPbmUgYmVjYXVzZSBw b3NzaWJsZSB1bmV2ZW5uZXNzIG9mCisJICogc3BsaXQgYW5kIGFub3RoZXIg YmVjYXVzZSBvZiByZS1lbmNvZGluZyBmaXJzdCBpdGVtIHBvaW50ZXIgb2Yg cmlnaHQKKwkgKiBwYWdlIGZyb20gemVyby4KKwkgKi8KKwlNZW1TZXQoJmlw dHIsIDAsIHNpemVvZihJdGVtUG9pbnRlckRhdGEpKTsKKwl0b3RhbHNpemUg PSBHaW5EYXRhTGVhZlBhZ2VHZXRQb3N0aW5nTGlzdFNpemUob2xkUGFnZSk7 CisJaWYgKG9mZiA9PSBJbnZhbGlkT2Zmc2V0TnVtYmVyICYmIEdpblBhZ2VS aWdodE1vc3Qob2xkUGFnZSkpCiAJewotCQltZW1jcHkodmVjdG9yLAotCQkJ ICAgR2luRGF0YVBhZ2VHZXRJdGVtUG9pbnRlcihscGFnZSwgRmlyc3RPZmZz ZXROdW1iZXIpLAotCQkJICAgbWF4b2ZmICogc2l6ZW9mKEl0ZW1Qb2ludGVy RGF0YSkpOworCQl3aGlsZSAobWF4SXRlbUluZGV4IDwgaXRlbXMtPm5pdGVt ICYmIHRvdGFsc2l6ZSArCisJCQlnaW5EYXRhUGFnZUxlYWZHZXRJdGVtUG9p bnRlclNpemUoJml0ZW1zLT5pdGVtc1ttYXhJdGVtSW5kZXhdLCAmaXB0cikK KwkJCTwgMiAqIEdpbkRhdGFMZWFmTWF4UG9zdGluZ0xpc3RTaXplIC0gMiAq IE1BWF9DT01QUkVTU0VEX0lURU1fUE9JTlRFUl9TSVpFKQorCQl7CisJCQl0 b3RhbHNpemUgKz0gZ2luRGF0YVBhZ2VMZWFmR2V0SXRlbVBvaW50ZXJTaXpl KAorCQkJCQkJCQkJCQkmaXRlbXMtPml0ZW1zW21heEl0ZW1JbmRleF0sICZp cHRyKTsKKwkJCWlwdHIgPSBpdGVtcy0+aXRlbXNbbWF4SXRlbUluZGV4XTsK KwkJCW1heEl0ZW1JbmRleCsrOworCQl9CisJCUFzc2VydChtYXhJdGVtSW5k ZXggPiBpdGVtcy0+Y3VyaXRlbSk7CiAJfQogCWVsc2UKIAl7Ci0JCW1lbWNw eSh2ZWN0b3IsCi0JCQkgICBHaW5EYXRhUGFnZUdldFBvc3RpbmdJdGVtKGxw YWdlLCBGaXJzdE9mZnNldE51bWJlciksCi0JCQkgICBtYXhvZmYgKiBzaXpl b2YoUG9zdGluZ0l0ZW0pKTsKKwkJdG90YWxzaXplICs9IGdpbkRhdGFQYWdl TGVhZkdldEl0ZW1Qb2ludGVyU2l6ZSgKKwkJCQkJCQkJCQkJJml0ZW1zLT5p dGVtc1ttYXhJdGVtSW5kZXhdLCAmaXB0cik7CisJCUFzc2VydCh0b3RhbHNp emUgPAorCQkJCQkyICogR2luRGF0YUxlYWZNYXhQb3N0aW5nTGlzdFNpemUg LSAyICogTUFYX0NPTVBSRVNTRURfSVRFTV9QT0lOVEVSX1NJWkUpOwogCX0K IAotCWlmIChpc2xlYWYgJiYgR2luUGFnZVJpZ2h0TW9zdChscGFnZSkgJiYg b2ZmID4gR2luUGFnZUdldE9wYXF1ZShscGFnZSktPm1heG9mZikKLQl7Ci0J CS8qIGFwcGVuZCBuZXcgaXRlbXMgdG8gdGhlIGVuZCAqLwotCQlHaW5CdHJl ZURhdGFMZWFmSW5zZXJ0RGF0YSAqaXRlbXMgPSBpbnNlcnRkYXRhOworCS8q IFJlaW5pdGlhbGl6ZSBwYWdlcyAqLworCUdpbkluaXREYXRhTGVhZlBhZ2Uo bHBhZ2UpOworCUdpbkluaXREYXRhTGVhZlBhZ2UocnBhZ2UpOworCUdpbkRh dGFMZWFmUGFnZVNldFBvc3RpbmdMaXN0U2l6ZShscGFnZSwgMCk7CisJR2lu RGF0YUxlYWZQYWdlU2V0UG9zdGluZ0xpc3RTaXplKHJwYWdlLCAwKTsKIAot CQl3aGlsZSAoaXRlbXMtPmN1cml0ZW0gPCBpdGVtcy0+bml0ZW0gJiYKLQkJ CSAgIG1heG9mZiAqIHNpemVvZihJdGVtUG9pbnRlckRhdGEpIDwgMiAqIChm cmVlU3BhY2UgLSBzaXplb2YoSXRlbVBvaW50ZXJEYXRhKSkpCi0JCXsKLQkJ CW1lbWNweSh2ZWN0b3IgKyBtYXhvZmYgKiBzaXplb2YoSXRlbVBvaW50ZXJE YXRhKSwKLQkJCQkgICBpdGVtcy0+aXRlbXMgKyBpdGVtcy0+Y3VyaXRlbSwK LQkJCQkgICBzaXplb2YoSXRlbVBvaW50ZXJEYXRhKSk7Ci0JCQltYXhvZmYr KzsKLQkJCWl0ZW1zLT5jdXJpdGVtKys7Ci0JCX0KLQl9CisJLyoKKwkgKiBD b3B5IHRoZSBvbGQgYW5kIG5ldyBpdGVtcyB0byB0aGUgbmV3IHBhZ2VzLgor CSAqLworCU1lbVNldCgmbmV4dG9sZCwgMCwgc2l6ZW9mKEl0ZW1Qb2ludGVy RGF0YSkpOworCW9sZFB0ciA9IEdpbkRhdGFMZWFmUGFnZUdldFBvc3RpbmdM aXN0KG9sZFBhZ2UpOworCW9sZEVuZFB0ciA9IEdpbkRhdGFMZWFmUGFnZUdl dFBvc3RpbmdMaXN0RW5kKG9sZFBhZ2UpOworCWlmIChvbGRQdHIgPCBvbGRF bmRQdHIpCisJCW9sZFB0ciA9IGdpbkRhdGFQYWdlTGVhZlJlYWRJdGVtUG9p bnRlcihvbGRQdHIsICZuZXh0b2xkKTsKIAllbHNlCisJCUl0ZW1Qb2ludGVy U2V0SW52YWxpZCgmbmV4dG9sZCk7CisKKwluZXh0bmV3ID0gaXRlbXMtPml0 ZW1zW2l0ZW1zLT5jdXJpdGVtXTsKKworCU1lbVNldCgmcHJldklwdHIsIDAs IHNpemVvZihJdGVtUG9pbnRlckRhdGEpKTsKKwlwdHIgPSBHaW5EYXRhTGVh ZlBhZ2VHZXRQb3N0aW5nTGlzdChscGFnZSk7CisJcGFnZSA9IGxwYWdlOwor CXdoaWxlIChJdGVtUG9pbnRlcklzVmFsaWQoJm5leHRuZXcpIHx8IEl0ZW1Q b2ludGVySXNWYWxpZCgmbmV4dG9sZCkpCiAJewotCQlwdHIgPSB2ZWN0b3Ig KyAob2ZmIC0gMSkgKiBzaXplb2ZpdGVtOwotCQlpZiAobWF4b2ZmICsgMSAt IG9mZiAhPSAwKQotCQkJbWVtbW92ZShwdHIgKyBzaXplb2ZpdGVtLCBwdHIs IChtYXhvZmYgLSBvZmYgKyAxKSAqIHNpemVvZml0ZW0pOwotCQlpZiAoaXNs ZWFmKQotCQl7Ci0JCQlHaW5CdHJlZURhdGFMZWFmSW5zZXJ0RGF0YSAqaXRl bXMgPSBpbnNlcnRkYXRhOworCQlJdGVtUG9pbnRlckRhdGEgaXRlbTsKKwkJ aW50CQkJY21wOwogCi0JCQltZW1jcHkocHRyLCBpdGVtcy0+aXRlbXMgKyBp dGVtcy0+Y3VyaXRlbSwgc2l6ZW9maXRlbSk7Ci0JCQlpdGVtcy0+Y3VyaXRl bSsrOworCQkvKgorCQkgKiBQdWxsIHRoZSBuZXh0IHR1cGxlIGZyb20gdGhl IG9sZCBwYWdlLCBvciBmcm9tIHRoZSBhcnJheSBvZiBuZXcKKwkJICogaXRl bXMgdG8gcGxhY2UuCisJCSAqLworCQlpZiAoIUl0ZW1Qb2ludGVySXNWYWxp ZCgmbmV4dG5ldykpCisJCQljbXAgPSAtMTsKKwkJZWxzZSBpZiAoIUl0ZW1Q b2ludGVySXNWYWxpZCgmbmV4dG9sZCkpCisJCQljbXAgPSAxOworCQllbHNl CisJCQljbXAgPSBnaW5Db21wYXJlSXRlbVBvaW50ZXJzKCZuZXh0b2xkLCAm bmV4dG5ldyk7CisKKwkJQXNzZXJ0KGNtcCAhPSAwKTsgLyogZHVwbGljYXRl cyBhcmUgbm90IGV4cGVjdGVkICovCisJCWlmIChjbXAgPCAwKQorCQl7CisJ CQlpdGVtID0gbmV4dG9sZDsKKwkJCWlmIChvbGRQdHIgPCBvbGRFbmRQdHIp CisJCQkJb2xkUHRyID0gZ2luRGF0YVBhZ2VMZWFmUmVhZEl0ZW1Qb2ludGVy KG9sZFB0ciwgJm5leHRvbGQpOworCQkJZWxzZQorCQkJCUl0ZW1Qb2ludGVy U2V0SW52YWxpZCgmbmV4dG9sZCk7CiAJCX0KIAkJZWxzZQogCQl7Ci0JCQlQ b3N0aW5nSXRlbSAqcGl0ZW0gPSBpbnNlcnRkYXRhOwotCi0JCQltZW1jcHko cHRyLCBwaXRlbSwgc2l6ZW9maXRlbSk7CisJCQlpdGVtID0gbmV4dG5ldzsK KwkJCWl0ZW1zLT5jdXJpdGVtKys7CisJCQlpZiAoaXRlbXMtPmN1cml0ZW0g PCBtYXhJdGVtSW5kZXgpCisJCQkJbmV4dG5ldyA9IGl0ZW1zLT5pdGVtc1tp dGVtcy0+Y3VyaXRlbV07CisJCQllbHNlCisJCQkJSXRlbVBvaW50ZXJTZXRJ bnZhbGlkKCZuZXh0bmV3KTsKIAkJfQogCi0JCW1heG9mZisrOworCQkvKiBX cml0ZSB0aGUgdHVwbGUgdG8gdGhlIGN1cnJlbnQgaGFsZi4gKi8KKwkJcHRy ID0gZ2luRGF0YVBhZ2VMZWFmV3JpdGVJdGVtUG9pbnRlcihwdHIsICZpdGVt LCAmcHJldklwdHIpOworCQlBc3NlcnQoR2luRGF0YVBhZ2VGcmVlU3BhY2VQ cmUocGFnZSwgcHRyKSA+PSAwKTsKKwkJcHJldklwdHIgPSBpdGVtOworCisJ CS8qIENoZWNrIGlmIGl0J3MgdGltZSB0byBzd2l0Y2ggdG8gdGhlIHJpZ2h0 IHBhZ2UgKi8KKwkJaWYgKHB0ciAtIEdpbkRhdGFMZWFmUGFnZUdldFBvc3Rp bmdMaXN0KHBhZ2UpID4gdG90YWxzaXplIC8gMiAmJgorCQkJcGFnZSA9PSBs cGFnZSkKKwkJeworCQkJbWF4TGVmdElwdHIgPSBpdGVtOworCQkJR2luRGF0 YUxlYWZQYWdlU2V0UG9zdGluZ0xpc3RTaXplKGxwYWdlLCBwdHIgLSBHaW5E YXRhTGVhZlBhZ2VHZXRQb3N0aW5nTGlzdChscGFnZSkpOworCQkJTWVtU2V0 KCZwcmV2SXB0ciwgMCwgc2l6ZW9mKEl0ZW1Qb2ludGVyRGF0YSkpOworCQkJ cGFnZSA9IHJwYWdlOworCQkJcHRyID0gR2luRGF0YUxlYWZQYWdlR2V0UG9z dGluZ0xpc3QocnBhZ2UpOworCQl9CiAJfQogCisJQXNzZXJ0KHBhZ2UgPT0g cnBhZ2UpOworCUdpbkRhdGFMZWFmUGFnZVNldFBvc3RpbmdMaXN0U2l6ZShy cGFnZSwgcHRyIC0gR2luRGF0YUxlYWZQYWdlR2V0UG9zdGluZ0xpc3QocnBh Z2UpKTsKKworCSpHaW5EYXRhUGFnZUdldFJpZ2h0Qm91bmQocnBhZ2UpID0g KkdpbkRhdGFQYWdlR2V0UmlnaHRCb3VuZChvbGRQYWdlKTsKKwkqR2luRGF0 YVBhZ2VHZXRSaWdodEJvdW5kKGxwYWdlKSA9IG1heExlZnRJcHRyOworCisJ QXNzZXJ0KEdpblBhZ2VSaWdodE1vc3Qob2xkUGFnZSkgfHwKKwkJCWdpbkNv bXBhcmVJdGVtUG9pbnRlcnMoR2luRGF0YVBhZ2VHZXRSaWdodEJvdW5kKGxw YWdlKSwKKwkJCUdpbkRhdGFQYWdlR2V0UmlnaHRCb3VuZChycGFnZSkpIDwg MCk7CisKKwkvKiBGaWxsIGluZGV4ZXMgYXQgdGhlIGVuZCBvZiBwYWdlcyAq LworCXVwZGF0ZUl0ZW1JbmRleGVzKGxwYWdlKTsKKwl1cGRhdGVJdGVtSW5k ZXhlcyhycGFnZSk7CisKKwlkYXRhLnNlcGFyYXRvciA9IEdpbkRhdGFMZWFm UGFnZUdldFBvc3RpbmdMaXN0U2l6ZShscGFnZSk7CisJZGF0YS5uYnl0ZXMg PSBHaW5EYXRhTGVhZlBhZ2VHZXRQb3N0aW5nTGlzdFNpemUobHBhZ2UpICsg R2luRGF0YUxlYWZQYWdlR2V0UG9zdGluZ0xpc3RTaXplKHJwYWdlKTsKKwlk YXRhLnJpZ2h0Ym91bmQgPSAqR2luRGF0YVBhZ2VHZXRSaWdodEJvdW5kKHJw YWdlKTsKKworCXJkYXRhWzBdLmJ1ZmZlciA9IEludmFsaWRCdWZmZXI7CisJ cmRhdGFbMF0uZGF0YSA9IChjaGFyICopICZkYXRhOworCXJkYXRhWzBdLmxl biA9IHNpemVvZihnaW54bG9nU3BsaXQpOworCXJkYXRhWzBdLm5leHQgPSAm cmRhdGFbMV07CisKKwlyZGF0YVsxXS5idWZmZXIgPSBJbnZhbGlkQnVmZmVy OworCXJkYXRhWzFdLmRhdGEgPSBHaW5EYXRhTGVhZlBhZ2VHZXRQb3N0aW5n TGlzdChscGFnZSk7CisJcmRhdGFbMV0ubGVuID0gR2luRGF0YUxlYWZQYWdl R2V0UG9zdGluZ0xpc3RTaXplKGxwYWdlKTsKKwlyZGF0YVsxXS5uZXh0ID0g JnJkYXRhWzJdOworCisJcmRhdGFbMl0uYnVmZmVyID0gSW52YWxpZEJ1ZmZl cjsKKwlyZGF0YVsyXS5kYXRhID0gR2luRGF0YUxlYWZQYWdlR2V0UG9zdGlu Z0xpc3QocnBhZ2UpOworCXJkYXRhWzJdLmxlbiA9IEdpbkRhdGFMZWFmUGFn ZUdldFBvc3RpbmdMaXN0U2l6ZShycGFnZSk7CisJcmRhdGFbMl0ubmV4dCA9 IE5VTEw7CisKKwlyZXR1cm4gbHBhZ2U7Cit9CisKKy8qCisgKiBTcGxpdCBw YWdlIGFuZCBmaWxsIFdBTCByZWNvcmQuIFJldHVybnMgYSBuZXcgdGVtcCBi dWZmZXIgZmlsbGVkIHdpdGggZGF0YQorICogdGhhdCBzaG91bGQgZ28gdG8g dGhlIGxlZnQgcGFnZS4gVGhlIG9yaWdpbmFsIGJ1ZmZlciAobGJ1ZikgaXMg bGVmdAorICogdW50b3VjaGVkLgorICovCitzdGF0aWMgUGFnZQorZGF0YVNw bGl0UGFnZUludGVybmFsKEdpbkJ0cmVlIGJ0cmVlLCBCdWZmZXIgbGJ1Ziwg QnVmZmVyIHJidWYsCisJCQkJCSAgR2luQnRyZWVTdGFjayAqc3RhY2ssCisJ CQkJCSAgdm9pZCAqaW5zZXJ0ZGF0YSwgQmxvY2tOdW1iZXIgdXBkYXRlYmxr bm8sCisJCQkJCSAgWExvZ1JlY0RhdGEgKipwcmRhdGEpCit7CisJUGFnZQkJ b2xkcGFnZSA9IEJ1ZmZlckdldFBhZ2UobGJ1Zik7CisJT2Zmc2V0TnVtYmVy IG9mZiA9IHN0YWNrLT5vZmY7CisJaW50CQkJbml0ZW1zID0gR2luUGFnZUdl dE9wYXF1ZShvbGRwYWdlKS0+bWF4b2ZmOworCVNpemUJCXBhZ2VTaXplID0g UGFnZUdldFBhZ2VTaXplKG9sZHBhZ2UpOworCUl0ZW1Qb2ludGVyRGF0YSBv bGRib3VuZCA9ICpHaW5EYXRhUGFnZUdldFJpZ2h0Qm91bmQob2xkcGFnZSk7 CisJSXRlbVBvaW50ZXIJYm91bmQ7CisJUGFnZQkJbHBhZ2U7CisJUGFnZQkJ cnBhZ2U7CisJT2Zmc2V0TnVtYmVyIHNlcGFyYXRvcjsKKworCS8qIHRoZXNl IG11c3QgYmUgc3RhdGljIHNvIHRoZXkgY2FuIGJlIHJldHVybmVkIHRvIGNh bGxlciAqLworCXN0YXRpYyBnaW54bG9nU3BsaXREYXRhSW50ZXJuYWwgZGF0 YTsKKwlzdGF0aWMgWExvZ1JlY0RhdGEgcmRhdGFbNF07CisJc3RhdGljIFBv c3RpbmdJdGVtIGFsbGl0ZW1zWyhCTENLU1ogLyBzaXplb2YoUG9zdGluZ0l0 ZW0pKSArIDFdOworCisJbHBhZ2UgPSBQYWdlR2V0VGVtcFBhZ2Uob2xkcGFn ZSk7CisJcnBhZ2UgPSBCdWZmZXJHZXRQYWdlKHJidWYpOworCUdpbkluaXRQ YWdlKHJwYWdlLCBHaW5QYWdlR2V0T3BhcXVlKHJwYWdlKS0+ZmxhZ3MsIHBh Z2VTaXplKTsKKworCSpwcmRhdGEgPSByZGF0YTsKKworCiAJLyoKLQkgKiB3 ZSBhc3N1bWUgdGhhdCBkdXJpbmcgaW5kZXggY3JlYXRpb24gdGhlIHRhYmxl IHNjYW5uZWQgZnJvbSBiZWdpbm5pbmcKLQkgKiB0byBlbmQsIHNvIEl0ZW1Q b2ludGVycyBhcmUgaW4gbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIG9yZGVy LgorCSAqIEZpcnN0IGNvbnN0cnVjdCBhIG5ldyBsaXN0IG9mIFBvc3RpbmdJ dGVtcywgd2hpY2ggaW5jbHVkZXMgYWxsIHRoZQorCSAqIG9sZCBpdGVtcywg YW5kIHRoZSBuZXcgaXRlbS4KIAkgKi8KLQlpZiAoYnRyZWUtPmlzQnVpbGQg JiYgR2luUGFnZVJpZ2h0TW9zdChscGFnZSkpCi0JCXNlcGFyYXRvciA9IGZy ZWVTcGFjZSAvIHNpemVvZml0ZW07Ci0JZWxzZQotCQlzZXBhcmF0b3IgPSBt YXhvZmYgLyAyOworCW1lbWNweShhbGxpdGVtcywgR2luRGF0YVBhZ2VHZXRQ b3N0aW5nSXRlbShvbGRwYWdlLCBGaXJzdE9mZnNldE51bWJlciksCisJCSAg IChvZmYgLSAxKSAqIHNpemVvZihQb3N0aW5nSXRlbSkpOwogCi0JR2luSW5p dFBhZ2UocnBhZ2UsIEdpblBhZ2VHZXRPcGFxdWUobHBhZ2UpLT5mbGFncywg cGFnZVNpemUpOwotCUdpbkluaXRQYWdlKGxwYWdlLCBHaW5QYWdlR2V0T3Bh cXVlKHJwYWdlKS0+ZmxhZ3MsIHBhZ2VTaXplKTsKKwlhbGxpdGVtc1tvZmYg LSAxXSA9ICooKFBvc3RpbmdJdGVtICopIGluc2VydGRhdGEpOworCW1lbWNw eSgmYWxsaXRlbXNbb2ZmXSwgR2luRGF0YVBhZ2VHZXRQb3N0aW5nSXRlbShv bGRwYWdlLCBvZmYpLAorCQkgICAobml0ZW1zIC0gKG9mZiAtIDEpKSAqIHNp emVvZihQb3N0aW5nSXRlbSkpOworCW5pdGVtcysrOwogCi0JaWYgKGlzbGVh ZikKLQkJbWVtY3B5KEdpbkRhdGFQYWdlR2V0SXRlbVBvaW50ZXIobHBhZ2Us IEZpcnN0T2Zmc2V0TnVtYmVyKSwKLQkJCSAgIHZlY3Rvciwgc2VwYXJhdG9y ICogc2l6ZW9mKEl0ZW1Qb2ludGVyRGF0YSkpOwotCWVsc2UKLQkJbWVtY3B5 KEdpbkRhdGFQYWdlR2V0UG9zdGluZ0l0ZW0obHBhZ2UsIEZpcnN0T2Zmc2V0 TnVtYmVyKSwKLQkJCSAgIHZlY3Rvciwgc2VwYXJhdG9yICogc2l6ZW9mKFBv c3RpbmdJdGVtKSk7CisJLyogVXBkYXRlIGV4aXN0aW5nIGRvd25saW5rIHRv IHBvaW50IHRvIG5leHQgcGFnZSAqLworCVBvc3RpbmdJdGVtU2V0QmxvY2tO dW1iZXIoJmFsbGl0ZW1zW29mZl0sIHVwZGF0ZWJsa25vKTsKIAotCUdpblBh Z2VHZXRPcGFxdWUobHBhZ2UpLT5tYXhvZmYgPSBzZXBhcmF0b3I7Ci0JaWYg KGlzbGVhZikKLQkJbWVtY3B5KEdpbkRhdGFQYWdlR2V0SXRlbVBvaW50ZXIo cnBhZ2UsIEZpcnN0T2Zmc2V0TnVtYmVyKSwKLQkJCSAgIHZlY3RvciArIHNl cGFyYXRvciAqIHNpemVvZihJdGVtUG9pbnRlckRhdGEpLAotCQkJICAgKG1h eG9mZiAtIHNlcGFyYXRvcikgKiBzaXplb2YoSXRlbVBvaW50ZXJEYXRhKSk7 CisJLyoKKwkgKiBXaGVuIGNyZWF0aW5nIGEgbmV3IGluZGV4LCBmaXQgYXMg bWFueSB0dXBsZXMgYXMgcG9zc2libGUgb24gdGhlIGxlZnQKKwkgKiBwYWdl LCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSB0YWJsZSBpcyBzY2FubmVk IGZyb20gYmVnaW5uaW5nIHRvCisJICogZW5kLiBUaGlzIHBhY2tzIHRoZSBp bmRleCBhcyB0aWdodCBhcyBwb3NzaWJsZS4KKwkgKi8KKwlpZiAoYnRyZWUt PmlzQnVpbGQgJiYgR2luUGFnZVJpZ2h0TW9zdChvbGRwYWdlKSkKKwkJc2Vw YXJhdG9yID0gR2luTm9uTGVhZkRhdGFQYWdlR2V0RnJlZVNwYWNlKHJwYWdl KSAvIHNpemVvZihQb3N0aW5nSXRlbSk7CiAJZWxzZQotCQltZW1jcHkoR2lu RGF0YVBhZ2VHZXRQb3N0aW5nSXRlbShycGFnZSwgRmlyc3RPZmZzZXROdW1i ZXIpLAotCQkJICAgdmVjdG9yICsgc2VwYXJhdG9yICogc2l6ZW9mKFBvc3Rp bmdJdGVtKSwKLQkJCSAgIChtYXhvZmYgLSBzZXBhcmF0b3IpICogc2l6ZW9m KFBvc3RpbmdJdGVtKSk7CisJCXNlcGFyYXRvciA9IG5pdGVtcyAvIDI7CiAK LQlHaW5QYWdlR2V0T3BhcXVlKHJwYWdlKS0+bWF4b2ZmID0gbWF4b2ZmIC0g c2VwYXJhdG9yOworCW1lbWNweShHaW5EYXRhUGFnZUdldFBvc3RpbmdJdGVt KGxwYWdlLCBGaXJzdE9mZnNldE51bWJlciksIGFsbGl0ZW1zLCBzZXBhcmF0 b3IgKiBzaXplb2YoUG9zdGluZ0l0ZW0pKTsKKwlHaW5QYWdlR2V0T3BhcXVl KGxwYWdlKS0+bWF4b2ZmID0gc2VwYXJhdG9yOworCW1lbWNweShHaW5EYXRh UGFnZUdldFBvc3RpbmdJdGVtKHJwYWdlLCBGaXJzdE9mZnNldE51bWJlciks CisJCSAmYWxsaXRlbXNbc2VwYXJhdG9yXSwgKG5pdGVtcyAtIHNlcGFyYXRv cikgKiBzaXplb2YoUG9zdGluZ0l0ZW0pKTsKKwlHaW5QYWdlR2V0T3BhcXVl KHJwYWdlKS0+bWF4b2ZmID0gbml0ZW1zIC0gc2VwYXJhdG9yOwogCiAJLyog c2V0IHVwIHJpZ2h0IGJvdW5kIGZvciBsZWZ0IHBhZ2UgKi8KIAlib3VuZCA9 IEdpbkRhdGFQYWdlR2V0UmlnaHRCb3VuZChscGFnZSk7Ci0JaWYgKEdpblBh Z2VJc0xlYWYobHBhZ2UpKQotCQkqYm91bmQgPSAqR2luRGF0YVBhZ2VHZXRJ dGVtUG9pbnRlcihscGFnZSwKLQkJCQkJCQkJCQkJR2luUGFnZUdldE9wYXF1 ZShscGFnZSktPm1heG9mZik7Ci0JZWxzZQotCQkqYm91bmQgPSBHaW5EYXRh UGFnZUdldFBvc3RpbmdJdGVtKGxwYWdlLAotCQkJCQkJCQkJICAgR2luUGFn ZUdldE9wYXF1ZShscGFnZSktPm1heG9mZiktPmtleTsKKwkqYm91bmQgPSBH aW5EYXRhUGFnZUdldFBvc3RpbmdJdGVtKGxwYWdlLAorCQkJCQkJCQkgIEdp blBhZ2VHZXRPcGFxdWUobHBhZ2UpLT5tYXhvZmYpLT5rZXk7CiAKIAkvKiBz ZXQgdXAgcmlnaHQgYm91bmQgZm9yIHJpZ2h0IHBhZ2UgKi8KLQlib3VuZCA9 IEdpbkRhdGFQYWdlR2V0UmlnaHRCb3VuZChycGFnZSk7Ci0JKmJvdW5kID0g b2xkYm91bmQ7CisJKkdpbkRhdGFQYWdlR2V0UmlnaHRCb3VuZChycGFnZSkg PSBvbGRib3VuZDsKIAogCWRhdGEuc2VwYXJhdG9yID0gc2VwYXJhdG9yOwot CWRhdGEubml0ZW0gPSBtYXhvZmY7Ci0JZGF0YS5yaWdodGJvdW5kID0gb2xk Ym91bmQ7CisJZGF0YS5uaXRlbSA9IG5pdGVtczsKIAogCXJkYXRhWzBdLmJ1 ZmZlciA9IEludmFsaWRCdWZmZXI7CiAJcmRhdGFbMF0uZGF0YSA9IChjaGFy ICopICZkYXRhOwotCXJkYXRhWzBdLmxlbiA9IHNpemVvZihnaW54bG9nU3Bs aXREYXRhKTsKKwlyZGF0YVswXS5sZW4gPSBzaXplb2YoZ2lueGxvZ1NwbGl0 RGF0YUludGVybmFsKTsKIAlyZGF0YVswXS5uZXh0ID0gJnJkYXRhWzFdOwog CiAJcmRhdGFbMV0uYnVmZmVyID0gSW52YWxpZEJ1ZmZlcjsKLQlyZGF0YVsx XS5kYXRhID0gdmVjdG9yOwotCXJkYXRhWzFdLmxlbiA9IG1heG9mZiAqIHNp emVvZml0ZW07CisJcmRhdGFbMV0uZGF0YSA9IChjaGFyICopIGFsbGl0ZW1z OworCXJkYXRhWzFdLmxlbiA9IG5pdGVtcyAqIHNpemVvZihQb3N0aW5nSXRl bSk7CiAJcmRhdGFbMV0ubmV4dCA9IE5VTEw7CiAKIAlyZXR1cm4gbHBhZ2U7 CiB9CiAKIC8qCisgKiBTcGxpdCBwYWdlIG9mIHBvc3RpbmcgdHJlZS4gQ2Fs bHMgcmVsZXZhbnQgZnVuY3Rpb24gb2YgaW50ZXJuYWwgb2YgbGVhZiBwYWdl CisgKiBiZWNhdXNlIHRoZXkgYXJlIGhhbmRsZWQgdmVyeSBkaWZmZXJlbnRs eS4KKyAqLworc3RhdGljIFBhZ2UKK2RhdGFTcGxpdFBhZ2UoR2luQnRyZWUg YnRyZWUsIEJ1ZmZlciBsYnVmLCBCdWZmZXIgcmJ1ZiwKKwkJCSAgR2luQnRy ZWVTdGFjayAqc3RhY2ssCisJCQkgIHZvaWQgKmluc2VydGRhdGEsIEJsb2Nr TnVtYmVyIHVwZGF0ZWJsa25vLCAKKwkJCSAgWExvZ1JlY0RhdGEgKipwcmRh dGEpCit7CisJaWYgKEdpblBhZ2VJc0xlYWYoQnVmZmVyR2V0UGFnZShsYnVm KSkpCisJCXJldHVybiBkYXRhU3BsaXRQYWdlTGVhZihidHJlZSwgbGJ1Ziwg cmJ1Ziwgc3RhY2ssCisJCQkJCQkJCSBpbnNlcnRkYXRhLCB1cGRhdGVibGtu bywgcHJkYXRhKTsKKwllbHNlCisJCXJldHVybiBkYXRhU3BsaXRQYWdlSW50 ZXJuYWwoYnRyZWUsIGxidWYsIHJidWYsIHN0YWNrLAorCQkJCQkJCQkJIGlu c2VydGRhdGEsIHVwZGF0ZWJsa25vLCBwcmRhdGEpOworfQorCisKKy8qCiAg KiBDb25zdHJ1Y3QgaW5zZXJ0aW9uIHBheWxvYWQgZm9yIGluc2VydGluZyB0 aGUgZG93bmxpbmsgZm9yIGdpdmVuIGJ1ZmZlci4KICAqLwogc3RhdGljIHZv aWQgKgpAQCAtNTc0LDYgKzExMzgsNTcgQEAgZGF0YVByZXBhcmVEb3dubGlu ayhHaW5CdHJlZSBidHJlZSwgQnVmZmVyIGxidWYpCiB9CiAKIC8qCisgKiBV cGRhdGVzIGluZGV4ZXMgaW4gdGhlIGVuZCBvZiBsZWFmIHBhZ2Ugd2hpY2gg YXJlIHVzZWQgZm9yIGZhc3RlciBzZWFyY2guCisgKiBBbHNvIHVwZGF0ZXMg ZnJlZXNwYWNlIG9wYXF1ZSBmaWVsZCBvZiBwYWdlLiBSZXR1cm5zIGxhc3Qg aXRlbSBwb2ludGVyIG9mCisgKiBwYWdlLgorICovCitJdGVtUG9pbnRlckRh dGEKK3VwZGF0ZUl0ZW1JbmRleGVzKFBhZ2UgcGFnZSkKK3sKKwlHaW5EYXRh TGVhZkl0ZW1JbmRleCAqaW5kZXhlcyA9IEdpblBhZ2VHZXRJbmRleGVzKHBh Z2UpOworCVBvaW50ZXIJCWJlZ2lucHRyOworCVBvaW50ZXIJCXB0cjsKKwlQ b2ludGVyCQllbmRwdHI7CisJUG9pbnRlcgkJbmV4dHB0cjsKKwlJdGVtUG9p bnRlckRhdGEgaXB0cjsKKwlpbnQJCQlpLCBqOworCisJQXNzZXJ0KEdpblBh Z2VJc0xlYWYocGFnZSkpOworCisJLyogSXRlcmF0ZSBvdmVyIHBhZ2UgKi8K KworCXB0ciA9IGJlZ2lucHRyID0gR2luRGF0YUxlYWZQYWdlR2V0UG9zdGlu Z0xpc3QocGFnZSk7CisJZW5kcHRyID0gR2luRGF0YUxlYWZQYWdlR2V0UG9z dGluZ0xpc3RFbmQocGFnZSk7CisJTWVtU2V0KCZpcHRyLCAwLCBzaXplb2Yo SXRlbVBvaW50ZXJEYXRhKSk7CisKKwluZXh0cHRyID0gYmVnaW5wdHIgKyAo aW50KSAoKGRvdWJsZSkgR2luRGF0YUxlYWZNYXhQb3N0aW5nTGlzdFNpemUg LyAoZG91YmxlKSAoR2luRGF0YUxlYWZJbmRleENvdW50ICsgMSkpOworCWog PSAwOworCWkgPSBGaXJzdE9mZnNldE51bWJlcjsKKwl3aGlsZSAocHRyIDwg ZW5kcHRyICYmIGogPCBHaW5EYXRhTGVhZkluZGV4Q291bnQpCisJeworCQkv KiBQbGFjZSBuZXh0IHBhZ2UgaW5kZXggZW50cnkgaWYgaXQncyB0aW1lIHRv ICovCisJCWlmIChwdHIgPj0gbmV4dHB0cikKKwkJeworCQkJaW5kZXhlc1tq XS5pcHRyID0gaXB0cjsKKwkJCWluZGV4ZXNbal0ucGFnZU9mZnNldCA9IHB0 ciAtIEdpbkRhdGFMZWFmUGFnZUdldFBvc3RpbmdMaXN0KHBhZ2UpOworCQkJ aisrOworCQkJbmV4dHB0ciA9IGJlZ2lucHRyICsgKGludCkgKChkb3VibGUp IChqICsgMSkgKiAoZG91YmxlKSBHaW5EYXRhTGVhZk1heFBvc3RpbmdMaXN0 U2l6ZSAvIChkb3VibGUpIChHaW5EYXRhTGVhZkluZGV4Q291bnQgKyAxKSk7 CisJCX0KKwkJcHRyID0gZ2luRGF0YVBhZ2VMZWFmUmVhZEl0ZW1Qb2ludGVy KHB0ciwgJmlwdHIpOworCQlpKys7CisJfQorCisJLyogRmlsbCByZXN0IG9m IHBhZ2UgaW5kZXhlcyB3aXRoIEludmFsaWRPZmZzZXROdW1iZXIgKi8KKwlm b3IgKDsgaiA8IEdpbkRhdGFMZWFmSW5kZXhDb3VudDsgaisrKQorCXsKKwkJ TWVtU2V0KCZpbmRleGVzW2pdLmlwdHIsIDAsIHNpemVvZihJdGVtUG9pbnRl ckRhdGEpKTsKKwkJaW5kZXhlc1tqXS5wYWdlT2Zmc2V0ID0gMDsKKwl9CisK KwlyZXR1cm4gaXB0cjsKK30KKworLyoKICAqIEZpbGxzIG5ldyByb290IGJ5 IHJpZ2h0IGJvdW5kIHZhbHVlcyBmcm9tIGNoaWxkLgogICogQWxzbyBjYWxs ZWQgZnJvbSBnaW54bG9nLCBzaG91bGQgbm90IHVzZSBidHJlZQogICovCkBA IC02MDUsMTAgKzEyMjAsMjcgQEAgY3JlYXRlUG9zdGluZ1RyZWUoUmVsYXRp b24gaW5kZXgsIEl0ZW1Qb2ludGVyRGF0YSAqaXRlbXMsIHVpbnQzMiBuaXRl bXMsCiAJQmxvY2tOdW1iZXIgYmxrbm87CiAJQnVmZmVyCQlidWZmZXI7CiAJ UGFnZQkJcGFnZTsKKwlpbnQJCQlpOworCUNvbXByZXNzZWRQb3N0aW5nTGlz dCBwdHIsCisJCQkJY3VyOworCUl0ZW1Qb2ludGVyRGF0YSBwcmV2X2lwdHIg PSB7ezAsMH0sMH07CisJU2l6ZQkJc2l6ZTsKIAlpbnQJCQlucm9vdGl0ZW1z OwogCi0JLyogQ2FsY3VsYXRlIGhvdyBtYW55IFRJRHMgd2lsbCBmaXQgb24g Zmlyc3QgcGFnZS4gKi8KLQlucm9vdGl0ZW1zID0gTWluKG5pdGVtcywgR2lu TWF4TGVhZkRhdGFJdGVtcyk7CisJLyoKKwkgKiBDYWxjdWxhdGUgaG93IG1h bnkgVElEcyB3aWxsIGZpdCBvbiB0aGUgZmlyc3QgcGFnZQorCSAqLworCU1l bVNldCgmcHJldl9pcHRyLCAwLCBzaXplb2YoSXRlbVBvaW50ZXJEYXRhKSk7 CisJc2l6ZSA9IDA7CisJbnJvb3RpdGVtcyA9IDA7CisJd2hpbGUgKG5yb290 aXRlbXMgPCBuaXRlbXMpCisJeworCQlzaXplICs9IGdpbkRhdGFQYWdlTGVh ZkdldEl0ZW1Qb2ludGVyU2l6ZSgmaXRlbXNbbnJvb3RpdGVtc10sICZwcmV2 X2lwdHIpOworCQlpZiAoc2l6ZSA+IEdpbkRhdGFMZWFmTWF4UG9zdGluZ0xp c3RTaXplKQorCQkJYnJlYWs7CisJCXByZXZfaXB0ciA9IGl0ZW1zW25yb290 aXRlbXNdOworCQlucm9vdGl0ZW1zKys7CisJfQogCiAJLyoKIAkgKiBDcmVh dGUgdGhlIHJvb3QgcGFnZS4KQEAgLTYxOSw5ICsxMjUxLDE5IEBAIGNyZWF0 ZVBvc3RpbmdUcmVlKFJlbGF0aW9uIGluZGV4LCBJdGVtUG9pbnRlckRhdGEg Kml0ZW1zLCB1aW50MzIgbml0ZW1zLAogCiAJU1RBUlRfQ1JJVF9TRUNUSU9O KCk7CiAKLQlHaW5Jbml0QnVmZmVyKGJ1ZmZlciwgR0lOX0RBVEEgfCBHSU5f TEVBRik7Ci0JbWVtY3B5KEdpbkRhdGFQYWdlR2V0RGF0YShwYWdlKSwgaXRl bXMsIHNpemVvZihJdGVtUG9pbnRlckRhdGEpICogbnJvb3RpdGVtcyk7Ci0J R2luUGFnZUdldE9wYXF1ZShwYWdlKS0+bWF4b2ZmID0gbnJvb3RpdGVtczsK KwlHaW5Jbml0RGF0YUxlYWZQYWdlKHBhZ2UpOworCisJcHRyID0gR2luRGF0 YUxlYWZQYWdlR2V0UG9zdGluZ0xpc3QocGFnZSk7CisJY3VyID0gcHRyOwor CU1lbVNldCgmcHJldl9pcHRyLCAwLCBzaXplb2YoSXRlbVBvaW50ZXJEYXRh KSk7CisJZm9yIChpID0gMDsgaSA8IG5yb290aXRlbXM7IGkrKykKKwl7CisJ CWN1ciA9IGdpbkRhdGFQYWdlTGVhZldyaXRlSXRlbVBvaW50ZXIoY3VyLCAm aXRlbXNbaV0sICZwcmV2X2lwdHIpOworCQlwcmV2X2lwdHIgPSBpdGVtc1tp XTsKKwl9CisJR2luRGF0YUxlYWZQYWdlU2V0UG9zdGluZ0xpc3RTaXplKHBh Z2UsIGN1ciAtIHB0cik7CisJQXNzZXJ0KEdpbkRhdGFQYWdlRnJlZVNwYWNl UHJlKHBhZ2UsIGN1cikgPj0gMCk7CisJdXBkYXRlSXRlbUluZGV4ZXMocGFn ZSk7CiAKIAlNYXJrQnVmZmVyRGlydHkoYnVmZmVyKTsKIApAQCAtNjMwLDE5 ICsxMjcyLDIyIEBAIGNyZWF0ZVBvc3RpbmdUcmVlKFJlbGF0aW9uIGluZGV4 LCBJdGVtUG9pbnRlckRhdGEgKml0ZW1zLCB1aW50MzIgbml0ZW1zLAogCQlY TG9nUmVjUHRyCXJlY3B0cjsKIAkJWExvZ1JlY0RhdGEgcmRhdGFbMl07CiAJ CWdpbnhsb2dDcmVhdGVQb3N0aW5nVHJlZSBkYXRhOworCQlzdGF0aWMgY2hh cgkJYnVmW0JMQ0tTWl07CiAKIAkJZGF0YS5ub2RlID0gaW5kZXgtPnJkX25v ZGU7CiAJCWRhdGEuYmxrbm8gPSBibGtubzsKLQkJZGF0YS5uaXRlbSA9IG5y b290aXRlbXM7CisJCWRhdGEuc2l6ZSA9IGN1ciAtIHB0cjsKIAogCQlyZGF0 YVswXS5idWZmZXIgPSBJbnZhbGlkQnVmZmVyOwogCQlyZGF0YVswXS5kYXRh ID0gKGNoYXIgKikgJmRhdGE7CiAJCXJkYXRhWzBdLmxlbiA9IHNpemVvZihn aW54bG9nQ3JlYXRlUG9zdGluZ1RyZWUpOwogCQlyZGF0YVswXS5uZXh0ID0g JnJkYXRhWzFdOwogCisJCW1lbWNweShidWYsIEdpbkRhdGFMZWFmUGFnZUdl dFBvc3RpbmdMaXN0KHBhZ2UpLCBHaW5EYXRhTGVhZlBhZ2VHZXRQb3N0aW5n TGlzdFNpemUocGFnZSkpOworCiAJCXJkYXRhWzFdLmJ1ZmZlciA9IEludmFs aWRCdWZmZXI7Ci0JCXJkYXRhWzFdLmRhdGEgPSAoY2hhciAqKSBpdGVtczsK LQkJcmRhdGFbMV0ubGVuID0gc2l6ZW9mKEl0ZW1Qb2ludGVyRGF0YSkgKiBu cm9vdGl0ZW1zOworCQlyZGF0YVsxXS5kYXRhID0gYnVmOworCQlyZGF0YVsx XS5sZW4gPSBHaW5EYXRhTGVhZlBhZ2VHZXRQb3N0aW5nTGlzdFNpemUocGFn ZSk7CiAJCXJkYXRhWzFdLm5leHQgPSBOVUxMOwogCiAJCXJlY3B0ciA9IFhM b2dJbnNlcnQoUk1fR0lOX0lELCBYTE9HX0dJTl9DUkVBVEVfUFRSRUUsIHJk YXRhKTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2lu ZW50cnlwYWdlLmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbmVudHJ5 cGFnZS5jCmluZGV4IDg5Y2RlNGEuLjQ2ZThiOGUgMTAwNjQ0Ci0tLSBhL3Ny Yy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2luZW50cnlwYWdlLmMKKysrIGIvc3Jj L2JhY2tlbmQvYWNjZXNzL2dpbi9naW5lbnRyeXBhZ2UuYwpAQCAtMTgsMTUy ICsxOCwzMSBAQAogI2luY2x1ZGUgInV0aWxzL3JlbC5oIgogCiAvKgotICog Rm9ybSBhIHR1cGxlIGZvciBlbnRyeSB0cmVlLgotICoKLSAqIElmIHRoZSB0 dXBsZSB3b3VsZCBiZSB0b28gYmlnIHRvIGJlIHN0b3JlZCwgZnVuY3Rpb24g dGhyb3dzIGEgc3VpdGFibGUKLSAqIGVycm9yIGlmIGVycm9yVG9vQmlnIGlz IFRSVUUsIG9yIHJldHVybnMgTlVMTCBpZiBlcnJvclRvb0JpZyBpcyBGQUxT RS4KLSAqCi0gKiBTZWUgc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9SRUFETUUg Zm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGluZGV4IHR1cGxlCi0gKiBmb3Jt YXQgdGhhdCBpcyBiZWluZyBidWlsdCBoZXJlLiAgV2UgYnVpbGQgb24gdGhl IGFzc3VtcHRpb24gdGhhdCB3ZQotICogYXJlIG1ha2luZyBhIGxlYWYtbGV2 ZWwga2V5IGVudHJ5IGNvbnRhaW5pbmcgYSBwb3N0aW5nIGxpc3Qgb2Ygbmlw ZCBpdGVtcy4KLSAqIElmIHRoZSBjYWxsZXIgaXMgYWN0dWFsbHkgdHJ5aW5n IHRvIG1ha2UgYSBwb3N0aW5nLXRyZWUgZW50cnksIG5vbi1sZWFmCi0gKiBl bnRyeSwgb3IgcGVuZGluZy1saXN0IGVudHJ5LCBpdCBzaG91bGQgcGFzcyBu aXBkID0gMCBhbmQgdGhlbiBvdmVyd3JpdGUKLSAqIHRoZSB0X3RpZCBmaWVs ZHMgYXMgbmVjZXNzYXJ5LiAgSW4gYW55IGNhc2UsIGlwZCBjYW4gYmUgTlVM TCB0byBza2lwCi0gKiBjb3B5aW5nIGFueSBpdGVtcG9pbnRlcnMgaW50byB0 aGUgcG9zdGluZyBsaXN0OyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlCi0g KiBmb3IgZmlsbGluZyB0aGUgcG9zdGluZyBsaXN0IGFmdGVyd2FyZHMsIGlm IGlwZCA9IE5VTEwgYW5kIG5pcGQgPiAwLgorICogUmVhZCBpdGVtIHBvaW50 ZXJzIGZyb20gbGVhZiBkYXRhIHBhZ2UuIEluZm9ybWF0aW9uIGlzIHN0b3Jl ZCBpbiB0aGUgc2FtZQorICogbWFubmVyIGFzIGluIGxlYWYgZGF0YSBwYWdl cy4KICAqLwotSW5kZXhUdXBsZQotR2luRm9ybVR1cGxlKEdpblN0YXRlICpn aW5zdGF0ZSwKLQkJCSBPZmZzZXROdW1iZXIgYXR0bnVtLCBEYXR1bSBrZXks IEdpbk51bGxDYXRlZ29yeSBjYXRlZ29yeSwKLQkJCSBJdGVtUG9pbnRlckRh dGEgKmlwZCwgdWludDMyIG5pcGQsCi0JCQkgYm9vbCBlcnJvclRvb0JpZykK K3ZvaWQKK2dpblJlYWRUdXBsZShHaW5TdGF0ZSAqZ2luc3RhdGUsIE9mZnNl dE51bWJlciBhdHRudW0sCisJCQkgSW5kZXhUdXBsZSBpdHVwLCBJdGVtUG9p bnRlckRhdGEgKmlwZCkKIHsKLQlEYXR1bQkJZGF0dW1zWzJdOwotCWJvb2wJ CWlzbnVsbFsyXTsKLQlJbmRleFR1cGxlCWl0dXA7Ci0JdWludDMyCQluZXdz aXplOwotCi0JLyogQnVpbGQgdGhlIGJhc2ljIHR1cGxlOiBvcHRpb25hbCBj b2x1bW4gbnVtYmVyLCBwbHVzIGtleSBkYXR1bSAqLwotCWlmIChnaW5zdGF0 ZS0+b25lQ29sKQotCXsKLQkJZGF0dW1zWzBdID0ga2V5OwotCQlpc251bGxb MF0gPSAoY2F0ZWdvcnkgIT0gR0lOX0NBVF9OT1JNX0tFWSk7Ci0JfQotCWVs c2UKLQl7Ci0JCWRhdHVtc1swXSA9IFVJbnQxNkdldERhdHVtKGF0dG51bSk7 Ci0JCWlzbnVsbFswXSA9IGZhbHNlOwotCQlkYXR1bXNbMV0gPSBrZXk7Ci0J CWlzbnVsbFsxXSA9IChjYXRlZ29yeSAhPSBHSU5fQ0FUX05PUk1fS0VZKTsK LQl9Ci0KLQlpdHVwID0gaW5kZXhfZm9ybV90dXBsZShnaW5zdGF0ZS0+dHVw ZGVzY1thdHRudW0gLSAxXSwgZGF0dW1zLCBpc251bGwpOwotCi0JLyoKLQkg KiBEZXRlcm1pbmUgYW5kIHN0b3JlIG9mZnNldCB0byB0aGUgcG9zdGluZyBs aXN0LCBtYWtpbmcgc3VyZSB0aGVyZSBpcwotCSAqIHJvb20gZm9yIHRoZSBj YXRlZ29yeSBieXRlIGlmIG5lZWRlZC4KLQkgKgotCSAqIE5vdGU6IGJlY2F1 c2UgaW5kZXhfZm9ybV90dXBsZSBNQVhBTElHTnMgdGhlIHR1cGxlIHNpemUs IHRoZXJlIG1heSB3ZWxsCi0JICogYmUgc29tZSB3YXN0ZWQgcGFkIHNwYWNl LiAgSXMgaXQgd29ydGggcmVjb21wdXRpbmcgdGhlIGRhdGEgbGVuZ3RoIHRv Ci0JICogcHJldmVudCB0aGF0PyAgVGhhdCB3b3VsZCBhbHNvIGFsbG93IHVz IHRvIEFzc2VydCB0aGF0IHRoZSByZWFsIGRhdGEKLQkgKiBkb2Vzbid0IG92 ZXJsYXAgdGhlIEdpbk51bGxDYXRlZ29yeSBieXRlLCB3aGljaCB0aGlzIGNv ZGUgY3VycmVudGx5Ci0JICogdGFrZXMgb24gZmFpdGguCi0JICovCi0JbmV3 c2l6ZSA9IEluZGV4VHVwbGVTaXplKGl0dXApOwotCi0JaWYgKEluZGV4VHVw bGVIYXNOdWxscyhpdHVwKSkKLQl7Ci0JCXVpbnQzMgkJbWluc2l6ZTsKLQot CQlBc3NlcnQoY2F0ZWdvcnkgIT0gR0lOX0NBVF9OT1JNX0tFWSk7Ci0JCW1p bnNpemUgPSBHaW5DYXRlZ29yeU9mZnNldChpdHVwLCBnaW5zdGF0ZSkgKyBz aXplb2YoR2luTnVsbENhdGVnb3J5KTsKLQkJbmV3c2l6ZSA9IE1heChuZXdz aXplLCBtaW5zaXplKTsKLQl9Ci0KLQluZXdzaXplID0gU0hPUlRBTElHTihu ZXdzaXplKTsKLQotCUdpblNldFBvc3RpbmdPZmZzZXQoaXR1cCwgbmV3c2l6 ZSk7CisJUG9pbnRlcgkJcHRyOworCWludAkJCW5pcGQgPSBHaW5HZXROUG9z dGluZyhpdHVwKSwgaTsKKwlJdGVtUG9pbnRlckRhdGEgaXAgPSB7ezAsMH0s MH07CiAKLQlHaW5TZXROUG9zdGluZyhpdHVwLCBuaXBkKTsKKwlwdHIgPSBH aW5HZXRQb3N0aW5nKGl0dXApOwogCi0JLyoKLQkgKiBBZGQgc3BhY2UgbmVl ZGVkIGZvciBwb3N0aW5nIGxpc3QsIGlmIGFueS4gIFRoZW4gY2hlY2sgdGhh dCB0aGUgdHVwbGUKLQkgKiB3b24ndCBiZSB0b28gYmlnIHRvIHN0b3JlLgot CSAqLwotCW5ld3NpemUgKz0gc2l6ZW9mKEl0ZW1Qb2ludGVyRGF0YSkgKiBu aXBkOwotCW5ld3NpemUgPSBNQVhBTElHTihuZXdzaXplKTsKLQlpZiAobmV3 c2l6ZSA+IE1pbihJTkRFWF9TSVpFX01BU0ssIEdpbk1heEl0ZW1TaXplKSkK LQl7Ci0JCWlmIChlcnJvclRvb0JpZykKLQkJCWVyZXBvcnQoRVJST1IsCi0J CQkJCShlcnJjb2RlKEVSUkNPREVfUFJPR1JBTV9MSU1JVF9FWENFRURFRCks Ci0JCQllcnJtc2coImluZGV4IHJvdyBzaXplICVsdSBleGNlZWRzIG1heGlt dW0gJWx1IGZvciBpbmRleCBcIiVzXCIiLAotCQkJCSAgICh1bnNpZ25lZCBs b25nKSBuZXdzaXplLAotCQkJCSAgICh1bnNpZ25lZCBsb25nKSBNaW4oSU5E RVhfU0laRV9NQVNLLAotCQkJCQkJCQkJICAgR2luTWF4SXRlbVNpemUpLAot CQkJCSAgIFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKGdpbnN0YXRlLT5pbmRl eCkpKSk7Ci0JCXBmcmVlKGl0dXApOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0K LQkvKgotCSAqIFJlc2l6ZSB0dXBsZSBpZiBuZWVkZWQKLQkgKi8KLQlpZiAo bmV3c2l6ZSAhPSBJbmRleFR1cGxlU2l6ZShpdHVwKSkKKwlpZiAoR2luSXR1 cElzQ29tcHJlc3NlZChpdHVwKSkKIAl7Ci0JCWl0dXAgPSByZXBhbGxvYyhp dHVwLCBuZXdzaXplKTsKLQotCQkvKgotCQkgKiBQb3N0Z3JlU1FMIDkuMyBh bmQgZWFybGllciBkaWQgbm90IGNsZWFyIHRoaXMgbmV3IHNwYWNlLCBzbyB3 ZQotCQkgKiBtaWdodCBmaW5kIHVuaW5pdGlhbGl6ZWQgcGFkZGluZyB3aGVu IHJlYWRpbmcgdHVwbGVzIGZyb20gZGlzay4KLQkJICovCi0JCW1lbXNldCgo Y2hhciAqKSBpdHVwICsgSW5kZXhUdXBsZVNpemUoaXR1cCksCi0JCQkgICAw LCBuZXdzaXplIC0gSW5kZXhUdXBsZVNpemUoaXR1cCkpOwotCi0JCS8qIHNl dCBuZXcgc2l6ZSBpbiB0dXBsZSBoZWFkZXIgKi8KLQkJaXR1cC0+dF9pbmZv ICY9IH5JTkRFWF9TSVpFX01BU0s7Ci0JCWl0dXAtPnRfaW5mbyB8PSBuZXdz aXplOworCQlmb3IgKGkgPSAwOyBpIDwgbmlwZDsgaSsrKQorCQl7CisJCQlw dHIgPSBnaW5EYXRhUGFnZUxlYWZSZWFkSXRlbVBvaW50ZXIocHRyLCAmaXAp OworCQkJaXBkW2ldID0gaXA7CisJCX0KIAl9Ci0KLQkvKgotCSAqIEluc2Vy dCBjYXRlZ29yeSBieXRlLCBpZiBuZWVkZWQKLQkgKi8KLQlpZiAoY2F0ZWdv cnkgIT0gR0lOX0NBVF9OT1JNX0tFWSkKKwllbHNlCiAJewotCQlBc3NlcnQo SW5kZXhUdXBsZUhhc051bGxzKGl0dXApKTsKLQkJR2luU2V0TnVsbENhdGVn b3J5KGl0dXAsIGdpbnN0YXRlLCBjYXRlZ29yeSk7CisJCW1lbWNweShpcGQs IHB0ciwgc2l6ZW9mKEl0ZW1Qb2ludGVyRGF0YSkgKiBuaXBkKTsKIAl9Ci0K LQkvKgotCSAqIENvcHkgaW4gdGhlIHBvc3RpbmcgbGlzdCwgaWYgcHJvdmlk ZWQKLQkgKi8KLQlpZiAoaXBkKQotCQltZW1jcHkoR2luR2V0UG9zdGluZyhp dHVwKSwgaXBkLCBzaXplb2YoSXRlbVBvaW50ZXJEYXRhKSAqIG5pcGQpOwot Ci0JcmV0dXJuIGl0dXA7Ci19Ci0KLS8qCi0gKiBTb21ldGltZXMgd2UgcmVk dWNlIHRoZSBudW1iZXIgb2YgcG9zdGluZyBsaXN0IGl0ZW1zIGluIGEgdHVw bGUgYWZ0ZXIKLSAqIGhhdmluZyBidWlsdCBpdCB3aXRoIEdpbkZvcm1UdXBs ZS4gIFRoaXMgZnVuY3Rpb24gYWRqdXN0cyB0aGUgc2l6ZQotICogZmllbGRz IHRvIG1hdGNoLgotICovCi12b2lkCi1HaW5TaG9ydGVuVHVwbGUoSW5kZXhU dXBsZSBpdHVwLCB1aW50MzIgbmlwZCkKLXsKLQl1aW50MzIJCW5ld3NpemU7 Ci0KLQlBc3NlcnQobmlwZCA8PSBHaW5HZXROUG9zdGluZyhpdHVwKSk7Ci0K LQluZXdzaXplID0gR2luR2V0UG9zdGluZ09mZnNldChpdHVwKSArIHNpemVv ZihJdGVtUG9pbnRlckRhdGEpICogbmlwZDsKLQluZXdzaXplID0gTUFYQUxJ R04obmV3c2l6ZSk7Ci0KLQlBc3NlcnQobmV3c2l6ZSA8PSAoaXR1cC0+dF9p bmZvICYgSU5ERVhfU0laRV9NQVNLKSk7Ci0KLQlpdHVwLT50X2luZm8gJj0g fklOREVYX1NJWkVfTUFTSzsKLQlpdHVwLT50X2luZm8gfD0gbmV3c2l6ZTsK LQotCUdpblNldE5Qb3N0aW5nKGl0dXAsIG5pcGQpOwogfQogCiAvKgpAQCAt NDkzLDEzICszNzIsMTMgQEAgZW50cnlQcmVwYXJlUGFnZShHaW5CdHJlZSBi dHJlZSwgUGFnZSBwYWdlLCBPZmZzZXROdW1iZXIgb2ZmLAogICogJ3VwZGF0 ZWJsa25vJy4KICAqLwogc3RhdGljIGJvb2wKLWVudHJ5UGxhY2VUb1BhZ2Uo R2luQnRyZWUgYnRyZWUsIEJ1ZmZlciBidWYsIE9mZnNldE51bWJlciBvZmYs CitlbnRyeVBsYWNlVG9QYWdlKEdpbkJ0cmVlIGJ0cmVlLCBCdWZmZXIgYnVm LCBHaW5CdHJlZVN0YWNrICpzdGFjaywKIAkJCQkgdm9pZCAqaW5zZXJ0UGF5 bG9hZCwgQmxvY2tOdW1iZXIgdXBkYXRlYmxrbm8sCiAJCQkJIFhMb2dSZWNE YXRhICoqcHJkYXRhKQogewogCUdpbkJ0cmVlRW50cnlJbnNlcnREYXRhICpp bnNlcnREYXRhID0gaW5zZXJ0UGF5bG9hZDsKIAlQYWdlCQlwYWdlID0gQnVm ZmVyR2V0UGFnZShidWYpOwotCU9mZnNldE51bWJlciBwbGFjZWQ7CisJT2Zm c2V0TnVtYmVyIHBsYWNlZCwgb2ZmID0gc3RhY2stPm9mZjsKIAlpbnQJCQlj bnQgPSAwOwogCiAJLyogdGhlc2UgbXVzdCBiZSBzdGF0aWMgc28gdGhleSBj YW4gYmUgcmV0dXJuZWQgdG8gY2FsbGVyICovCkBAIC01MjIsNiArNDAxLDcg QEAgZW50cnlQbGFjZVRvUGFnZShHaW5CdHJlZSBidHJlZSwgQnVmZmVyIGJ1 ZiwgT2Zmc2V0TnVtYmVyIG9mZiwKIAkJCSBSZWxhdGlvbkdldFJlbGF0aW9u TmFtZShidHJlZS0+aW5kZXgpKTsKIAogCWRhdGEuaXNEZWxldGUgPSBpbnNl cnREYXRhLT5pc0RlbGV0ZTsKKwlkYXRhLm9mZnNldCA9IG9mZjsKIAogCXJk YXRhW2NudF0uYnVmZmVyID0gSW52YWxpZEJ1ZmZlcjsKIAlyZGF0YVtjbnRd LmRhdGEgPSAoY2hhciAqKSAmZGF0YTsKQEAgLTU0NCwxMSArNDI0LDEzIEBA IGVudHJ5UGxhY2VUb1BhZ2UoR2luQnRyZWUgYnRyZWUsIEJ1ZmZlciBidWYs IE9mZnNldE51bWJlciBvZmYsCiAgKiBhbiBlcXVhbCBudW1iZXIhCiAgKi8K IHN0YXRpYyBQYWdlCi1lbnRyeVNwbGl0UGFnZShHaW5CdHJlZSBidHJlZSwg QnVmZmVyIGxidWYsIEJ1ZmZlciByYnVmLCBPZmZzZXROdW1iZXIgb2ZmLAor ZW50cnlTcGxpdFBhZ2UoR2luQnRyZWUgYnRyZWUsIEJ1ZmZlciBsYnVmLCBC dWZmZXIgcmJ1ZiwKKwkJCSAgIEdpbkJ0cmVlU3RhY2sgKnN0YWNrLAogCQkJ ICAgdm9pZCAqaW5zZXJ0UGF5bG9hZCwKIAkJCSAgIEJsb2NrTnVtYmVyIHVw ZGF0ZWJsa25vLCBYTG9nUmVjRGF0YSAqKnByZGF0YSkKIHsKIAlHaW5CdHJl ZUVudHJ5SW5zZXJ0RGF0YSAqaW5zZXJ0RGF0YSA9IGluc2VydFBheWxvYWQ7 CisJT2Zmc2V0TnVtYmVyIG9mZiA9IHN0YWNrLT5vZmY7CiAJT2Zmc2V0TnVt YmVyIGksCiAJCQkJbWF4b2ZmLAogCQkJCXNlcGFyYXRvciA9IEludmFsaWRP ZmZzZXROdW1iZXI7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3Mv Z2luL2dpbmZhc3QuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2luZmFz dC5jCmluZGV4IDRmMmMxMTguLjY2OTQ5OTEgMTAwNjQ0Ci0tLSBhL3NyYy9i YWNrZW5kL2FjY2Vzcy9naW4vZ2luZmFzdC5jCisrKyBiL3NyYy9iYWNrZW5k L2FjY2Vzcy9naW4vZ2luZmFzdC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5j bHVkZSAibWlzY2FkbWluLmgiCiAjaW5jbHVkZSAidXRpbHMvbWVtdXRpbHMu aCIKICNpbmNsdWRlICJ1dGlscy9yZWwuaCIKKyNpbmNsdWRlICJhY2Nlc3Mv aHR1cF9kZXRhaWxzLmgiCiAKIAogI2RlZmluZSBHSU5fUEFHRV9GUkVFU0la RSBcCkBAIC00MzcsNiArNDM4LDg5IEBAIGdpbkhlYXBUdXBsZUZhc3RJbnNl cnQoR2luU3RhdGUgKmdpbnN0YXRlLCBHaW5UdXBsZUNvbGxlY3RvciAqY29s bGVjdG9yKQogCQlnaW5JbnNlcnRDbGVhbnVwKGdpbnN0YXRlLCBmYWxzZSwg TlVMTCk7CiB9CiAKK3N0YXRpYyBJbmRleFR1cGxlCitHaW5GYXN0Rm9ybVR1 cGxlKEdpblN0YXRlICpnaW5zdGF0ZSwKKwkJCQkgT2Zmc2V0TnVtYmVyIGF0 dG51bSwgRGF0dW0ga2V5LCBHaW5OdWxsQ2F0ZWdvcnkgY2F0ZWdvcnkpCit7 CisJRGF0dW0JCWRhdHVtc1syXTsKKwlib29sCQlpc251bGxbMl07CisJSW5k ZXhUdXBsZQlpdHVwOworCXVpbnQzMgkJbmV3c2l6ZTsKKworCS8qIEJ1aWxk IHRoZSBiYXNpYyB0dXBsZTogb3B0aW9uYWwgY29sdW1uIG51bWJlciwgcGx1 cyBrZXkgZGF0dW0gKi8KKworCWlmIChnaW5zdGF0ZS0+b25lQ29sKQorCXsK KwkJZGF0dW1zWzBdID0ga2V5OworCQlpc251bGxbMF0gPSAoY2F0ZWdvcnkg IT0gR0lOX0NBVF9OT1JNX0tFWSk7CisJfQorCWVsc2UKKwl7CisJCWRhdHVt c1swXSA9IFVJbnQxNkdldERhdHVtKGF0dG51bSk7CisJCWlzbnVsbFswXSA9 IGZhbHNlOworCQlkYXR1bXNbMV0gPSBrZXk7CisJCWlzbnVsbFsxXSA9IChj YXRlZ29yeSAhPSBHSU5fQ0FUX05PUk1fS0VZKTsKKwl9CisKKwlpdHVwID0g aW5kZXhfZm9ybV90dXBsZShnaW5zdGF0ZS0+dHVwZGVzY1thdHRudW0gLSAx XSwgZGF0dW1zLCBpc251bGwpOworCisJLyoKKwkgKiBQbGFjZSBjYXRlZ29y eSB0byB0aGUgbGFzdCBieXRlIG9mIGluZGV4IHR1cGxlIGV4dGVuZGluZyBp dCdzIHNpemUgaWYKKwkgKiBuZWVkZWQKKwkgKi8KKwluZXdzaXplID0gSW5k ZXhUdXBsZVNpemUoaXR1cCk7CisKKwlpZiAoY2F0ZWdvcnkgIT0gR0lOX0NB VF9OT1JNX0tFWSkKKwl7CisJCXVpbnQzMgkJbWluc2l6ZTsKKworCQlBc3Nl cnQoSW5kZXhUdXBsZUhhc051bGxzKGl0dXApKTsKKwkJbWluc2l6ZSA9IElu ZGV4SW5mb0ZpbmREYXRhT2Zmc2V0KGl0dXAtPnRfaW5mbykgKworCQkJaGVh cF9jb21wdXRlX2RhdGFfc2l6ZShnaW5zdGF0ZS0+dHVwZGVzY1thdHRudW0g LSAxXSwgZGF0dW1zLCBpc251bGwpICsKKwkJCXNpemVvZihHaW5OdWxsQ2F0 ZWdvcnkpOworCQluZXdzaXplID0gTWF4KG5ld3NpemUsIG1pbnNpemUpOwor CX0KKworCW5ld3NpemUgPSBNQVhBTElHTihuZXdzaXplKTsKKworCWlmIChu ZXdzaXplID4gTWluKElOREVYX1NJWkVfTUFTSywgR2luTWF4SXRlbVNpemUp KQorCXsKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RF X1BST0dSQU1fTElNSVRfRVhDRUVERUQpLAorCQllcnJtc2coImluZGV4IHJv dyBzaXplICVsdSBleGNlZWRzIG1heGltdW0gJWx1IGZvciBpbmRleCBcIiVz XCIiLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpIG5ld3NpemUsCisJCQkgICAo dW5zaWduZWQgbG9uZykgTWluKElOREVYX1NJWkVfTUFTSywKKwkJCQkJCQkJ ICAgR2luTWF4SXRlbVNpemUpLAorCQkJICAgUmVsYXRpb25HZXRSZWxhdGlv bk5hbWUoZ2luc3RhdGUtPmluZGV4KSkpKTsKKwkJcGZyZWUoaXR1cCk7CisJ CXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogUmVzaXplIHR1cGxlIGlm IG5lZWRlZAorCSAqLworCWlmIChuZXdzaXplICE9IEluZGV4VHVwbGVTaXpl KGl0dXApKQorCXsKKwkJaXR1cCA9IHJlcGFsbG9jKGl0dXAsIG5ld3NpemUp OworCisJCS8qIHNldCBuZXcgc2l6ZSBpbiB0dXBsZSBoZWFkZXIgKi8KKwkJ aXR1cC0+dF9pbmZvICY9IH5JTkRFWF9TSVpFX01BU0s7CisJCWl0dXAtPnRf aW5mbyB8PSBuZXdzaXplOworCX0KKworCS8qCisJICogSW5zZXJ0IGNhdGVn b3J5IGJ5dGUsIGlmIG5lZWRlZAorCSAqLworCWlmIChjYXRlZ29yeSAhPSBH SU5fQ0FUX05PUk1fS0VZKQorCXsKKwkJQXNzZXJ0KEluZGV4VHVwbGVIYXNO dWxscyhpdHVwKSk7CisJCUdpblNldE51bGxDYXRlZ29yeShpdHVwLCBnaW5z dGF0ZSwgY2F0ZWdvcnkpOworCX0KKworCXJldHVybiBpdHVwOworfQorCisK IC8qCiAgKiBDcmVhdGUgdGVtcG9yYXJ5IGluZGV4IHR1cGxlcyBmb3IgYSBz aW5nbGUgaW5kZXhhYmxlIGl0ZW0gKG9uZSBpbmRleCBjb2x1bW4KICAqIGZv ciB0aGUgaGVhcCB0dXBsZSBzcGVjaWZpZWQgYnkgaHRfY3RpZCksIGFuZCBh cHBlbmQgdGhlbSB0byB0aGUgYXJyYXkKQEAgLTQ4Niw4ICs1NzAsNyBAQCBn aW5IZWFwVHVwbGVGYXN0Q29sbGVjdChHaW5TdGF0ZSAqZ2luc3RhdGUsCiAJ ewogCQlJbmRleFR1cGxlCWl0dXA7CiAKLQkJaXR1cCA9IEdpbkZvcm1UdXBs ZShnaW5zdGF0ZSwgYXR0bnVtLCBlbnRyaWVzW2ldLCBjYXRlZ29yaWVzW2ld LAotCQkJCQkJCU5VTEwsIDAsIHRydWUpOworCQlpdHVwID0gR2luRmFzdEZv cm1UdXBsZShnaW5zdGF0ZSwgYXR0bnVtLCBlbnRyaWVzW2ldLCBjYXRlZ29y aWVzW2ldKTsKIAkJaXR1cC0+dF90aWQgPSAqaHRfY3RpZDsKIAkJY29sbGVj dG9yLT50dXBsZXNbY29sbGVjdG9yLT5udHVwbGVzKytdID0gaXR1cDsKIAkJ Y29sbGVjdG9yLT5zdW1zaXplICs9IEluZGV4VHVwbGVTaXplKGl0dXApOwpk aWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9naW5nZXQuYyBi L3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2luZ2V0LmMKaW5kZXggZjJlZTJm Yi4uMDJjNTYxYSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL2dp bi9naW5nZXQuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbmdl dC5jCkBAIC03MSwyMiArNzEsNTEgQEAgY2FsbENvbnNpc3RlbnRGbihHaW5T dGF0ZSAqZ2luc3RhdGUsIEdpblNjYW5LZXkga2V5KQogc3RhdGljIGJvb2wK IGZpbmRJdGVtSW5Qb3N0aW5nUGFnZShQYWdlIHBhZ2UsIEl0ZW1Qb2ludGVy IGl0ZW0sIE9mZnNldE51bWJlciAqb2ZmKQogewotCU9mZnNldE51bWJlciBt YXhvZmYgPSBHaW5QYWdlR2V0T3BhcXVlKHBhZ2UpLT5tYXhvZmY7CiAJaW50 CQkJcmVzOworCU9mZnNldE51bWJlcglpOwogCiAJaWYgKEdpblBhZ2VHZXRP cGFxdWUocGFnZSktPmZsYWdzICYgR0lOX0RFTEVURUQpCiAJCS8qIHBhZ2Ug d2FzIGRlbGV0ZWQgYnkgY29uY3VycmVudCB2YWN1dW0gKi8KIAkJcmV0dXJu IGZhbHNlOwogCi0JLyoKLQkgKiBzY2FuIHBhZ2UgdG8gZmluZCBlcXVhbCBv ciBmaXJzdCBncmVhdGVyIHZhbHVlCi0JICovCi0JZm9yICgqb2ZmID0gRmly c3RPZmZzZXROdW1iZXI7ICpvZmYgPD0gbWF4b2ZmOyAoKm9mZikrKykKKwlp ZiAoR2luUGFnZUlzQ29tcHJlc3NlZChwYWdlKSkKIAl7Ci0JCXJlcyA9IGdp bkNvbXBhcmVJdGVtUG9pbnRlcnMoaXRlbSwgR2luRGF0YVBhZ2VHZXRJdGVt UG9pbnRlcihwYWdlLCAqb2ZmKSk7CisJCVBvaW50ZXIJCXB0cjsKKwkJUG9p bnRlcgkJZW5kUHRyOworCQlJdGVtUG9pbnRlckRhdGEgaXB0ciA9IHt7MCwg MH0sIDB9OwogCi0JCWlmIChyZXMgPD0gMCkKLQkJCXJldHVybiB0cnVlOwor CQlpID0gRmlyc3RPZmZzZXROdW1iZXI7CisJCXB0ciA9IEdpbkRhdGFMZWFm UGFnZUdldFBvc3RpbmdMaXN0KHBhZ2UpOworCQllbmRQdHIgPSBHaW5EYXRh TGVhZlBhZ2VHZXRQb3N0aW5nTGlzdEVuZChwYWdlKTsKKwkJLyoKKwkJICog c2NhbiBwYWdlIHRvIGZpbmQgZXF1YWwgb3IgZmlyc3QgZ3JlYXRlciB2YWx1 ZQorCQkgKi8KKwkJd2hpbGUgKHB0ciA8IGVuZFB0cikKKwkJeworCQkJcHRy ID0gZ2luRGF0YVBhZ2VMZWFmUmVhZEl0ZW1Qb2ludGVyKHB0ciwgJmlwdHIp OworCisJCQlyZXMgPSBnaW5Db21wYXJlSXRlbVBvaW50ZXJzKGl0ZW0sICZp cHRyKTsKKwkJCWlmIChyZXMgPD0gMCkKKwkJCXsKKwkJCQkqb2ZmID0gaTsK KwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCWkrKzsKKwkJfQorCX0KKwll bHNlCisJeworCQlPZmZzZXROdW1iZXIgbWF4b2ZmID0gR2luUGFnZUdldE9w YXF1ZShwYWdlKS0+bWF4b2ZmOworCQkvKgorCQkgKiBzY2FuIHBhZ2UgdG8g ZmluZCBlcXVhbCBvciBmaXJzdCBncmVhdGVyIHZhbHVlCisJCSAqLworCQlm b3IgKCpvZmYgPSBGaXJzdE9mZnNldE51bWJlcjsgKm9mZiA8PSBtYXhvZmY7 ICgqb2ZmKSsrKQorCQl7CisJCQlyZXMgPSBnaW5Db21wYXJlSXRlbVBvaW50 ZXJzKGl0ZW0sIEdpbkRhdGFQYWdlR2V0SXRlbVBvaW50ZXIocGFnZSwgKm9m ZikpOworCisJCQlpZiAocmVzIDw9IDApCisJCQkJcmV0dXJuIHRydWU7CisJ CX0KIAl9CiAKIAlyZXR1cm4gZmFsc2U7CkBAIC0xNDAsMTUgKzE2OSwzNyBA QCBzY2FuUG9zdGluZ1RyZWUoUmVsYXRpb24gaW5kZXgsIEdpblNjYW5FbnRy eSBzY2FuRW50cnksCiAJICovCiAJZm9yICg7OykKIAl7Ci0JCXBhZ2UgPSBC dWZmZXJHZXRQYWdlKGJ1ZmZlcik7CisJCVBvaW50ZXIgcHRyOworCQlQb2lu dGVyIGVuZFB0cjsKIAorCQlwYWdlID0gQnVmZmVyR2V0UGFnZShidWZmZXIp OworCQlwdHIgPSBHaW5EYXRhTGVhZlBhZ2VHZXRQb3N0aW5nTGlzdChwYWdl KTsKKwkJZW5kUHRyID0gR2luRGF0YUxlYWZQYWdlR2V0UG9zdGluZ0xpc3RF bmQocGFnZSk7CiAJCWlmICgoR2luUGFnZUdldE9wYXF1ZShwYWdlKS0+Zmxh Z3MgJiBHSU5fREVMRVRFRCkgPT0gMCAmJgotCQkJR2luUGFnZUdldE9wYXF1 ZShwYWdlKS0+bWF4b2ZmID49IEZpcnN0T2Zmc2V0TnVtYmVyKQorCQkJcHRy IDwgZW5kUHRyKQogCQl7Ci0JCQl0Ym1fYWRkX3R1cGxlcyhzY2FuRW50cnkt Pm1hdGNoQml0bWFwLAotCQkJCQkJICAgR2luRGF0YVBhZ2VHZXRJdGVtUG9p bnRlcihwYWdlLCBGaXJzdE9mZnNldE51bWJlciksCi0JCQkJCQkgICBHaW5Q YWdlR2V0T3BhcXVlKHBhZ2UpLT5tYXhvZmYsIGZhbHNlKTsKLQkJCXNjYW5F bnRyeS0+cHJlZGljdE51bWJlclJlc3VsdCArPSBHaW5QYWdlR2V0T3BhcXVl KHBhZ2UpLT5tYXhvZmY7CisJCQlpZiAoR2luUGFnZUlzQ29tcHJlc3NlZChw YWdlKSkKKwkJCXsKKwkJCQlJdGVtUG9pbnRlckRhdGEgaXB0ciA9IHt7MCwg MH0sIDB9OworCQkJCWludCBpOworCisJCQkJaSA9IDA7CisJCQkJd2hpbGUg KHB0ciA8IGVuZFB0cikKKwkJCQl7CisJCQkJCXB0ciA9IGdpbkRhdGFQYWdl TGVhZlJlYWRJdGVtUG9pbnRlcihwdHIsICZpcHRyKTsKKwkJCQkJdGJtX2Fk ZF90dXBsZXMoc2NhbkVudHJ5LT5tYXRjaEJpdG1hcCwgJmlwdHIsIDEsIGZh bHNlKTsKKwkJCQkJaSsrOworCQkJCX0KKworCQkJCXNjYW5FbnRyeS0+cHJl ZGljdE51bWJlclJlc3VsdCArPSBpOworCQkJfQorCQkJZWxzZQorCQkJewor CQkJCXRibV9hZGRfdHVwbGVzKHNjYW5FbnRyeS0+bWF0Y2hCaXRtYXAsCisJ CQkJCQkJR2luRGF0YVBhZ2VHZXRJdGVtUG9pbnRlcihwYWdlLCBGaXJzdE9m ZnNldE51bWJlciksCisJCQkJCQkJICAgR2luUGFnZUdldE9wYXF1ZShwYWdl KS0+bWF4b2ZmLCBmYWxzZSk7CisJCQkJc2NhbkVudHJ5LT5wcmVkaWN0TnVt YmVyUmVzdWx0ICs9IEdpblBhZ2VHZXRPcGFxdWUocGFnZSktPm1heG9mZjsK KwkJCX0KIAkJfQogCiAJCWlmIChHaW5QYWdlUmlnaHRNb3N0KHBhZ2UpKQpA QCAtMzMzLDggKzM4NCwxMiBAQCBjb2xsZWN0TWF0Y2hCaXRtYXAoR2luQnRy ZWVEYXRhICpidHJlZSwgR2luQnRyZWVTdGFjayAqc3RhY2ssCiAJCX0KIAkJ ZWxzZQogCQl7CisJCQlJdGVtUG9pbnRlckRhdGEgKmlwZCA9IChJdGVtUG9p bnRlckRhdGEgKilwYWxsb2MoCisJCQkJCQkJCXNpemVvZihJdGVtUG9pbnRl ckRhdGEpICogR2luR2V0TlBvc3RpbmcoaXR1cCkpOworCQkJZ2luUmVhZFR1 cGxlKGJ0cmVlLT5naW5zdGF0ZSwgc2NhbkVudHJ5LT5hdHRudW0sIGl0dXAs IGlwZCk7CisKIAkJCXRibV9hZGRfdHVwbGVzKHNjYW5FbnRyeS0+bWF0Y2hC aXRtYXAsCi0JCQkJCQkgICBHaW5HZXRQb3N0aW5nKGl0dXApLCBHaW5HZXRO UG9zdGluZyhpdHVwKSwgZmFsc2UpOworCQkJCQkJICAgaXBkLCBHaW5HZXRO UG9zdGluZyhpdHVwKSwgZmFsc2UpOwogCQkJc2NhbkVudHJ5LT5wcmVkaWN0 TnVtYmVyUmVzdWx0ICs9IEdpbkdldE5Qb3N0aW5nKGl0dXApOwogCQl9CiAK QEAgLTQyNiw2ICs0ODEsOSBAQCByZXN0YXJ0U2NhbkVudHJ5OgogCQkJQmxv Y2tOdW1iZXIgcm9vdFBvc3RpbmdUcmVlID0gR2luR2V0UG9zdGluZ1RyZWUo aXR1cCk7CiAJCQlHaW5CdHJlZVN0YWNrICpzdGFjazsKIAkJCVBhZ2UJCXBh Z2U7CisJCQlQb2ludGVyCQlwdHI7CisJCQlQb2ludGVyCQllbmRQdHI7CisJ CQlJdGVtUG9pbnRlckRhdGEgaXB0ciA9IHt7MCwwfSwwfTsKIAogCQkJLyoK IAkJCSAqIFdlIHNob3VsZCB1bmxvY2sgZW50cnkgcGFnZSBiZWZvcmUgdG91 Y2hpbmcgcG9zdGluZyB0cmVlIHRvCkBAIC00NDgsMTYgKzUwNiwzMiBAQCBy ZXN0YXJ0U2NhbkVudHJ5OgogCQkJSW5jckJ1ZmZlclJlZkNvdW50KGVudHJ5 LT5idWZmZXIpOwogCiAJCQlwYWdlID0gQnVmZmVyR2V0UGFnZShlbnRyeS0+ YnVmZmVyKTsKLQkJCWVudHJ5LT5wcmVkaWN0TnVtYmVyUmVzdWx0ID0gc3Rh Y2stPnByZWRpY3ROdW1iZXIgKiBHaW5QYWdlR2V0T3BhcXVlKHBhZ2UpLT5t YXhvZmY7CiAKIAkJCS8qCiAJCQkgKiBLZWVwIHBhZ2UgY29udGVudCBpbiBt ZW1vcnkgdG8gcHJldmVudCBkdXJhYmxlIHBhZ2UgbG9ja2luZwogCQkJICov Ci0JCQllbnRyeS0+bGlzdCA9IChJdGVtUG9pbnRlckRhdGEgKikgcGFsbG9j KEJMQ0tTWik7Ci0JCQllbnRyeS0+bmxpc3QgPSBHaW5QYWdlR2V0T3BhcXVl KHBhZ2UpLT5tYXhvZmY7Ci0JCQltZW1jcHkoZW50cnktPmxpc3QsCi0JCQkJ ICAgR2luRGF0YVBhZ2VHZXRJdGVtUG9pbnRlcihwYWdlLCBGaXJzdE9mZnNl dE51bWJlciksCi0JCQkJICAgR2luUGFnZUdldE9wYXF1ZShwYWdlKS0+bWF4 b2ZmICogc2l6ZW9mKEl0ZW1Qb2ludGVyRGF0YSkpOworCQkJaWYgKEdpblBh Z2VJc0NvbXByZXNzZWQocGFnZSkpCisJCQl7CisJCQkJZW50cnktPmxpc3Qg PSAoSXRlbVBvaW50ZXJEYXRhICopIHBhbGxvYyhCTENLU1ogKiBzaXplb2Yo SXRlbVBvaW50ZXJEYXRhKSk7CisJCQkJZW50cnktPm5saXN0ID0gMDsKKwor CQkJCXB0ciA9IEdpbkRhdGFMZWFmUGFnZUdldFBvc3RpbmdMaXN0KHBhZ2Up OworCQkJCWVuZFB0ciA9IEdpbkRhdGFMZWFmUGFnZUdldFBvc3RpbmdMaXN0 RW5kKHBhZ2UpOworCQkJCXdoaWxlIChwdHIgPCBlbmRQdHIpCisJCQkJewor CQkJCQlwdHIgPSBnaW5EYXRhUGFnZUxlYWZSZWFkSXRlbVBvaW50ZXIocHRy LCAmaXB0cik7CisJCQkJCWVudHJ5LT5saXN0W2VudHJ5LT5ubGlzdCsrXSA9 IGlwdHI7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWVudHJ5 LT5saXN0ID0gKEl0ZW1Qb2ludGVyRGF0YSAqKSBwYWxsb2MoQkxDS1NaKTsK KwkJCQllbnRyeS0+bmxpc3QgPSBHaW5QYWdlR2V0T3BhcXVlKHBhZ2UpLT5t YXhvZmY7CisJCQkJbWVtY3B5KGVudHJ5LT5saXN0LCBHaW5EYXRhUGFnZUdl dEl0ZW1Qb2ludGVyKHBhZ2UsIEZpcnN0T2Zmc2V0TnVtYmVyKSwKKwkJCQkJ ICAgR2luUGFnZUdldE9wYXF1ZShwYWdlKS0+bWF4b2ZmICogc2l6ZW9mKEl0 ZW1Qb2ludGVyRGF0YSkpOworCQkJfQorCisJCQllbnRyeS0+cHJlZGljdE51 bWJlclJlc3VsdCA9IHN0YWNrLT5wcmVkaWN0TnVtYmVyICogZW50cnktPm5s aXN0OwogCiAJCQlMb2NrQnVmZmVyKGVudHJ5LT5idWZmZXIsIEdJTl9VTkxP Q0spOwogCQkJZnJlZUdpbkJ0cmVlU3RhY2soc3RhY2spOwpAQCAtNDY2LDgg KzU0MCwxMSBAQCByZXN0YXJ0U2NhbkVudHJ5OgogCQllbHNlIGlmIChHaW5H ZXROUG9zdGluZyhpdHVwKSA+IDApCiAJCXsKIAkJCWVudHJ5LT5ubGlzdCA9 IEdpbkdldE5Qb3N0aW5nKGl0dXApOworCQkJZW50cnktPnByZWRpY3ROdW1i ZXJSZXN1bHQgPSBlbnRyeS0+bmxpc3Q7CiAJCQllbnRyeS0+bGlzdCA9IChJ dGVtUG9pbnRlckRhdGEgKikgcGFsbG9jKHNpemVvZihJdGVtUG9pbnRlckRh dGEpICogZW50cnktPm5saXN0KTsKLQkJCW1lbWNweShlbnRyeS0+bGlzdCwg R2luR2V0UG9zdGluZyhpdHVwKSwgc2l6ZW9mKEl0ZW1Qb2ludGVyRGF0YSkg KiBlbnRyeS0+bmxpc3QpOworCisJCQlnaW5SZWFkVHVwbGUoZ2luc3RhdGUs IGVudHJ5LT5hdHRudW0sIGl0dXAsIGVudHJ5LT5saXN0KTsKKwogCQkJZW50 cnktPmlzRmluaXNoZWQgPSBGQUxTRTsKIAkJfQogCX0KQEAgLTU2NSwxMyAr NjQyLDMzIEBAIGVudHJ5R2V0TmV4dEl0ZW0oR2luU3RhdGUgKmdpbnN0YXRl LCBHaW5TY2FuRW50cnkgZW50cnkpCiAJCQlpZiAoIUl0ZW1Qb2ludGVySXNW YWxpZCgmZW50cnktPmN1ckl0ZW0pIHx8CiAJCQkJZmluZEl0ZW1JblBvc3Rp bmdQYWdlKHBhZ2UsICZlbnRyeS0+Y3VySXRlbSwgJmVudHJ5LT5vZmZzZXQp KQogCQkJewotCQkJCS8qCi0JCQkJICogRm91bmQgcG9zaXRpb24gZXF1YWwg dG8gb3IgZ3JlYXRlciB0aGFuIHN0b3JlZAotCQkJCSAqLwotCQkJCWVudHJ5 LT5ubGlzdCA9IEdpblBhZ2VHZXRPcGFxdWUocGFnZSktPm1heG9mZjsKLQkJ CQltZW1jcHkoZW50cnktPmxpc3QsCi0JCQkJCSAgIEdpbkRhdGFQYWdlR2V0 SXRlbVBvaW50ZXIocGFnZSwgRmlyc3RPZmZzZXROdW1iZXIpLAorCQkJCVBv aW50ZXIgcHRyOworCQkJCVBvaW50ZXIgZW5kUHRyOworCQkJCUl0ZW1Qb2lu dGVyRGF0YSBpcHRyID0ge3swLDB9LDB9OworCisJCQkJaWYgKEdpblBhZ2VJ c0NvbXByZXNzZWQocGFnZSkpCisJCQkJeworCQkJCQkvKgorCQkJCQkgKiBG b3VuZCBwb3NpdGlvbiBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gc3RvcmVk CisJCQkJCSAqLworCQkJCQlwdHIgPSBHaW5EYXRhTGVhZlBhZ2VHZXRQb3N0 aW5nTGlzdChwYWdlKTsKKwkJCQkJZW5kUHRyID0gR2luRGF0YUxlYWZQYWdl R2V0UG9zdGluZ0xpc3RFbmQocGFnZSk7CisJCQkJCWVudHJ5LT5ubGlzdCA9 IDA7CisJCQkJCXdoaWxlIChwdHIgPCBlbmRQdHIpCisJCQkJCXsKKwkJCQkJ CXB0ciA9IGdpbkRhdGFQYWdlTGVhZlJlYWRJdGVtUG9pbnRlcihwdHIsICZp cHRyKTsKKwkJCQkJCWVudHJ5LT5saXN0W2VudHJ5LT5ubGlzdCsrXSA9IGlw dHI7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLyoK KwkJCQkJICogRm91bmQgcG9zaXRpb24gZXF1YWwgdG8gb3IgZ3JlYXRlciB0 aGFuIHN0b3JlZAorCQkJCQkgKi8KKwkJCQkJZW50cnktPm5saXN0ID0gR2lu UGFnZUdldE9wYXF1ZShwYWdlKS0+bWF4b2ZmOworCQkJCQltZW1jcHkoZW50 cnktPmxpc3QsIEdpbkRhdGFQYWdlR2V0SXRlbVBvaW50ZXIocGFnZSwgRmly c3RPZmZzZXROdW1iZXIpLAogCQkJCQkgICBHaW5QYWdlR2V0T3BhcXVlKHBh Z2UpLT5tYXhvZmYgKiBzaXplb2YoSXRlbVBvaW50ZXJEYXRhKSk7CisJCQkJ fQogCiAJCQkJTG9ja0J1ZmZlcihlbnRyeS0+YnVmZmVyLCBHSU5fVU5MT0NL KTsKIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9naW5p bnNlcnQuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2luaW5zZXJ0LmMK aW5kZXggNTU2ZTMxOC4uY2Q3OTFhNyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvYWNjZXNzL2dpbi9naW5pbnNlcnQuYworKysgYi9zcmMvYmFja2VuZC9h Y2Nlc3MvZ2luL2dpbmluc2VydC5jCkBAIC0zNyw2ICszNywxNDkgQEAgdHlw ZWRlZiBzdHJ1Y3QKIAogCiAvKgorICogRm9ybSBhIHR1cGxlIGZvciBlbnRy eSB0cmVlLgorICoKKyAqIElmIHRoZSB0dXBsZSB3b3VsZCBiZSB0b28gYmln IHRvIGJlIHN0b3JlZCwgZnVuY3Rpb24gdGhyb3dzIGEgc3VpdGFibGUKKyAq IGVycm9yIGlmIGVycm9yVG9vQmlnIGlzIFRSVUUsIG9yIHJldHVybnMgTlVM TCBpZiBlcnJvclRvb0JpZyBpcyBGQUxTRS4KKyAqCisgKiBTZWUgc3JjL2Jh Y2tlbmQvYWNjZXNzL2dpbi9SRUFETUUgZm9yIGEgZGVzY3JpcHRpb24gb2Yg dGhlIGluZGV4IHR1cGxlCisgKiBmb3JtYXQgdGhhdCBpcyBiZWluZyBidWls dCBoZXJlLiAgV2UgYnVpbGQgb24gdGhlIGFzc3VtcHRpb24gdGhhdCB3ZQor ICogYXJlIG1ha2luZyBhIGxlYWYtbGV2ZWwga2V5IGVudHJ5IGNvbnRhaW5p bmcgYSBwb3N0aW5nIGxpc3Qgb2YgbmlwZCBpdGVtcy4KKyAqIElmIHRoZSBj YWxsZXIgaXMgYWN0dWFsbHkgdHJ5aW5nIHRvIG1ha2UgYSBwb3N0aW5nLXRy ZWUgZW50cnksIG5vbi1sZWFmCisgKiBlbnRyeSwgb3IgcGVuZGluZy1saXN0 IGVudHJ5LCBpdCBzaG91bGQgcGFzcyBuaXBkID0gMCBhbmQgdGhlbiBvdmVy d3JpdGUKKyAqIHRoZSB0X3RpZCBmaWVsZHMgYXMgbmVjZXNzYXJ5LiAgSW4g YW55IGNhc2UsIGlwZCBjYW4gYmUgTlVMTCB0byBza2lwCisgKiBjb3B5aW5n IGFueSBpdGVtcG9pbnRlcnMgaW50byB0aGUgcG9zdGluZyBsaXN0OyB0aGUg Y2FsbGVyIGlzIHJlc3BvbnNpYmxlCisgKiBmb3IgZmlsbGluZyB0aGUgcG9z dGluZyBsaXN0IGFmdGVyd2FyZHMsIGlmIGlwZCA9IE5VTEwgYW5kIG5pcGQg PiAwLgorICovCitzdGF0aWMgSW5kZXhUdXBsZQorR2luRm9ybVR1cGxlKEdp blN0YXRlICpnaW5zdGF0ZSwKKwkJCSBPZmZzZXROdW1iZXIgYXR0bnVtLCBE YXR1bSBrZXksIEdpbk51bGxDYXRlZ29yeSBjYXRlZ29yeSwKKwkJCSBJdGVt UG9pbnRlckRhdGEgKmlwZCwKKwkJCSB1aW50MzIgbmlwZCwKKwkJCSBib29s IGVycm9yVG9vQmlnKQoreworCURhdHVtCQlkYXR1bXNbM107CisJYm9vbAkJ aXNudWxsWzNdOworCUluZGV4VHVwbGUJaXR1cDsKKwl1aW50MzIJCW5ld3Np emU7CisJaW50CQkJaTsKKwlJdGVtUG9pbnRlckRhdGEgbnVsbEl0ZW1Qb2lu dGVyID0ge3swLDB9LDB9OworCisJLyogQnVpbGQgdGhlIGJhc2ljIHR1cGxl OiBvcHRpb25hbCBjb2x1bW4gbnVtYmVyLCBwbHVzIGtleSBkYXR1bSAqLwor CWlmIChnaW5zdGF0ZS0+b25lQ29sKQorCXsKKwkJZGF0dW1zWzBdID0ga2V5 OworCQlpc251bGxbMF0gPSAoY2F0ZWdvcnkgIT0gR0lOX0NBVF9OT1JNX0tF WSk7CisJCWlzbnVsbFsxXSA9IHRydWU7CisJfQorCWVsc2UKKwl7CisJCWRh dHVtc1swXSA9IFVJbnQxNkdldERhdHVtKGF0dG51bSk7CisJCWlzbnVsbFsw XSA9IGZhbHNlOworCQlkYXR1bXNbMV0gPSBrZXk7CisJCWlzbnVsbFsxXSA9 IChjYXRlZ29yeSAhPSBHSU5fQ0FUX05PUk1fS0VZKTsKKwkJaXNudWxsWzJd ID0gdHJ1ZTsKKwl9CisKKwlpdHVwID0gaW5kZXhfZm9ybV90dXBsZShnaW5z dGF0ZS0+dHVwZGVzY1thdHRudW0gLSAxXSwgZGF0dW1zLCBpc251bGwpOwor CisJLyoKKwkgKiBEZXRlcm1pbmUgYW5kIHN0b3JlIG9mZnNldCB0byB0aGUg cG9zdGluZyBsaXN0LCBtYWtpbmcgc3VyZSB0aGVyZSBpcworCSAqIHJvb20g Zm9yIHRoZSBjYXRlZ29yeSBieXRlIGlmIG5lZWRlZC4KKwkgKgorCSAqIE5v dGU6IGJlY2F1c2UgaW5kZXhfZm9ybV90dXBsZSBNQVhBTElHTnMgdGhlIHR1 cGxlIHNpemUsIHRoZXJlIG1heSB3ZWxsCisJICogYmUgc29tZSB3YXN0ZWQg cGFkIHNwYWNlLiAgSXMgaXQgd29ydGggcmVjb21wdXRpbmcgdGhlIGRhdGEg bGVuZ3RoIHRvCisJICogcHJldmVudCB0aGF0PyAgVGhhdCB3b3VsZCBhbHNv IGFsbG93IHVzIHRvIEFzc2VydCB0aGF0IHRoZSByZWFsIGRhdGEKKwkgKiBk b2Vzbid0IG92ZXJsYXAgdGhlIEdpbk51bGxDYXRlZ29yeSBieXRlLCB3aGlj aCB0aGlzIGNvZGUgY3VycmVudGx5CisJICogdGFrZXMgb24gZmFpdGguCisJ ICovCisJbmV3c2l6ZSA9IEluZGV4VHVwbGVTaXplKGl0dXApOworCisJaWYg KEluZGV4VHVwbGVIYXNOdWxscyhpdHVwKSkKKwl7CisJCXVpbnQzMgkJbWlu c2l6ZTsKKworCQlBc3NlcnQoY2F0ZWdvcnkgIT0gR0lOX0NBVF9OT1JNX0tF WSk7CisJCW1pbnNpemUgPSBHaW5DYXRlZ29yeU9mZnNldChpdHVwLCBnaW5z dGF0ZSkgKyBzaXplb2YoR2luTnVsbENhdGVnb3J5KTsKKwkJbmV3c2l6ZSA9 IE1heChuZXdzaXplLCBtaW5zaXplKTsKKwl9CisKKwlHaW5TZXRQb3N0aW5n T2Zmc2V0KGl0dXAsIG5ld3NpemUpOworCisJR2luU2V0TlBvc3RpbmcoaXR1 cCwgbmlwZCk7CisKKwkvKgorCSAqIEFkZCBzcGFjZSBuZWVkZWQgZm9yIHBv c3RpbmcgbGlzdCwgaWYgYW55LiAgVGhlbiBjaGVjayB0aGF0IHRoZSB0dXBs ZQorCSAqIHdvbid0IGJlIHRvbyBiaWcgdG8gc3RvcmUuCisJICovCisKKwlp ZiAobmlwZCA+IDApCisJeworCQluZXdzaXplICs9IGdpbkRhdGFQYWdlTGVh ZkdldEl0ZW1Qb2ludGVyU2l6ZSgmaXBkWzBdLCAmbnVsbEl0ZW1Qb2ludGVy KTsKKwkJZm9yIChpID0gMTsgaSA8IG5pcGQ7IGkrKykKKwkJeworCQkJbmV3 c2l6ZSArPSBnaW5EYXRhUGFnZUxlYWZHZXRJdGVtUG9pbnRlclNpemUoJmlw ZFtpXSwgJmlwZFtpIC0gMV0pOworCQl9CisJfQorCisJbmV3c2l6ZSA9IE1B WEFMSUdOKG5ld3NpemUpOworCisJaWYgKG5ld3NpemUgPiBNaW4oSU5ERVhf U0laRV9NQVNLLCBHaW5NYXhJdGVtU2l6ZSkpCisJeworCQlpZiAoZXJyb3JU b29CaWcpCisJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkoZXJyY29kZShFUlJD T0RFX1BST0dSQU1fTElNSVRfRVhDRUVERUQpLAorCQkJZXJybXNnKCJpbmRl eCByb3cgc2l6ZSAlbHUgZXhjZWVkcyBtYXhpbXVtICVsdSBmb3IgaW5kZXgg XCIlc1wiIiwKKwkJCQkgICAodW5zaWduZWQgbG9uZykgbmV3c2l6ZSwKKwkJ CQkgICAodW5zaWduZWQgbG9uZykgTWluKElOREVYX1NJWkVfTUFTSywKKwkJ CQkJCQkJCSAgIEdpbk1heEl0ZW1TaXplKSwKKwkJCQkgICBSZWxhdGlvbkdl dFJlbGF0aW9uTmFtZShnaW5zdGF0ZS0+aW5kZXgpKSkpOworCQlwZnJlZShp dHVwKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyoKKwkgKiBSZXNpemUg dHVwbGUgaWYgbmVlZGVkCisJICovCisJaWYgKG5ld3NpemUgIT0gSW5kZXhU dXBsZVNpemUoaXR1cCkpCisJeworCQlpdHVwID0gcmVwYWxsb2MoaXR1cCwg bmV3c2l6ZSk7CisKKwkJLyoKKwkJICogUG9zdGdyZVNRTCA5LjMgYW5kIGVh cmxpZXIgZGlkIG5vdCBjbGVhciB0aGlzIG5ldyBzcGFjZSwgc28gd2UKKwkJ ICogbWlnaHQgZmluZCB1bmluaXRpYWxpemVkIHBhZGRpbmcgd2hlbiByZWFk aW5nIHR1cGxlcyBmcm9tIGRpc2suCisJCSAqLworCQltZW1zZXQoKGNoYXIg KikgaXR1cCArIEluZGV4VHVwbGVTaXplKGl0dXApLAorCQkJICAgMCwgbmV3 c2l6ZSAtIEluZGV4VHVwbGVTaXplKGl0dXApKTsKKworCQkvKiBzZXQgbmV3 IHNpemUgaW4gdHVwbGUgaGVhZGVyICovCisJCWl0dXAtPnRfaW5mbyAmPSB+ SU5ERVhfU0laRV9NQVNLOworCQlpdHVwLT50X2luZm8gfD0gbmV3c2l6ZTsK Kwl9CisKKwkvKgorCSAqIENvcHkgaW4gdGhlIHBvc3RpbmcgbGlzdCwgaWYg cHJvdmlkZWQKKwkgKi8KKwlpZiAobmlwZCA+IDApCisJeworCQljaGFyICpw dHIgPSBHaW5HZXRQb3N0aW5nKGl0dXApOworCQlwdHIgPSBnaW5EYXRhUGFn ZUxlYWZXcml0ZUl0ZW1Qb2ludGVyKHB0ciwgJmlwZFswXSwgJm51bGxJdGVt UG9pbnRlcik7CisJCWZvciAoaSA9IDE7IGkgPCBuaXBkOyBpKyspCisJCQlw dHIgPSBnaW5EYXRhUGFnZUxlYWZXcml0ZUl0ZW1Qb2ludGVyKHB0ciwgJmlw ZFtpXSwgJmlwZFtpLTFdKTsKKwl9CisKKwkvKgorCSAqIEluc2VydCBjYXRl Z29yeSBieXRlLCBpZiBuZWVkZWQKKwkgKi8KKwlpZiAoY2F0ZWdvcnkgIT0g R0lOX0NBVF9OT1JNX0tFWSkKKwl7CisJCUFzc2VydChJbmRleFR1cGxlSGFz TnVsbHMoaXR1cCkpOworCQlHaW5TZXROdWxsQ2F0ZWdvcnkoaXR1cCwgZ2lu c3RhdGUsIGNhdGVnb3J5KTsKKwl9CisJcmV0dXJuIGl0dXA7Cit9CisKKy8q CiAgKiBBZGRzIGFycmF5IG9mIGl0ZW0gcG9pbnRlcnMgdG8gdHVwbGUncyBw b3N0aW5nIGxpc3QsIG9yCiAgKiBjcmVhdGVzIHBvc3RpbmcgdHJlZSBhbmQg dHVwbGUgcG9pbnRpbmcgdG8gdHJlZSBpbiBjYXNlCiAgKiBvZiBub3QgZW5v dWdoIHNwYWNlLiAgTWF4IHNpemUgb2YgdHVwbGUgaXMgZGVmaW5lZCBpbgpA QCAtNTMsMzEgKzE5NiwzMCBAQCBhZGRJdGVtUG9pbnRlcnNUb0xlYWZUdXBs ZShHaW5TdGF0ZSAqZ2luc3RhdGUsCiAJRGF0dW0JCWtleTsKIAlHaW5OdWxs Q2F0ZWdvcnkgY2F0ZWdvcnk7CiAJSW5kZXhUdXBsZQlyZXM7CisJSXRlbVBv aW50ZXJEYXRhICpuZXdJdGVtcywgKm9sZEl0ZW1zOworCWludAkJCW9sZE5Q b3N0aW5nLCBuZXdOUG9zdGluZzsKIAogCUFzc2VydCghR2luSXNQb3N0aW5n VHJlZShvbGQpKTsKIAogCWF0dG51bSA9IGdpbnR1cGxlX2dldF9hdHRybnVt KGdpbnN0YXRlLCBvbGQpOwogCWtleSA9IGdpbnR1cGxlX2dldF9rZXkoZ2lu c3RhdGUsIG9sZCwgJmNhdGVnb3J5KTsKIAorCW9sZE5Qb3N0aW5nID0gR2lu R2V0TlBvc3Rpbmcob2xkKTsKKwlvbGRJdGVtcyA9IChJdGVtUG9pbnRlckRh dGEgKikgcGFsbG9jKHNpemVvZihJdGVtUG9pbnRlckRhdGEpICogb2xkTlBv c3RpbmcpOworCisJbmV3TlBvc3RpbmcgPSBvbGROUG9zdGluZyArIG5pdGVt OworCW5ld0l0ZW1zID0gKEl0ZW1Qb2ludGVyRGF0YSAqKSBwYWxsb2Moc2l6 ZW9mKEl0ZW1Qb2ludGVyRGF0YSkgKiBuZXdOUG9zdGluZyk7CisKKwlnaW5S ZWFkVHVwbGUoZ2luc3RhdGUsIGF0dG51bSwgb2xkLCBvbGRJdGVtcyk7CisK KwluZXdOUG9zdGluZyA9IGdpbk1lcmdlSXRlbVBvaW50ZXJzKG5ld0l0ZW1z LAorCQkJCQkJCQkJICAgaXRlbXMsIG5pdGVtLAorCQkJCQkJCQkJICAgb2xk SXRlbXMsIG9sZE5Qb3N0aW5nKTsKKwogCS8qIHRyeSB0byBidWlsZCB0dXBs ZSB3aXRoIHJvb20gZm9yIGFsbCB0aGUgaXRlbXMgKi8KIAlyZXMgPSBHaW5G b3JtVHVwbGUoZ2luc3RhdGUsIGF0dG51bSwga2V5LCBjYXRlZ29yeSwKLQkJ CQkJICAgTlVMTCwgbml0ZW0gKyBHaW5HZXROUG9zdGluZyhvbGQpLAotCQkJ CQkgICBmYWxzZSk7Ci0KLQlpZiAocmVzKQotCXsKLQkJLyogZ29vZCwgc21h bGwgZW5vdWdoICovCi0JCXVpbnQzMgkJbmV3bml0ZW07Ci0KLQkJLyogZmls bCBpbiB0aGUgcG9zdGluZyBsaXN0IHdpdGggdW5pb24gb2Ygb2xkIGFuZCBu ZXcgVElEcyAqLwotCQluZXduaXRlbSA9IGdpbk1lcmdlSXRlbVBvaW50ZXJz KEdpbkdldFBvc3RpbmcocmVzKSwKLQkJCQkJCQkJCQlHaW5HZXRQb3N0aW5n KG9sZCksCi0JCQkJCQkJCQkJR2luR2V0TlBvc3Rpbmcob2xkKSwKLQkJCQkJ CQkJCQlpdGVtcywgbml0ZW0pOwotCQkvKiBtZXJnZSBtaWdodCBoYXZlIGVs aW1pbmF0ZWQgc29tZSBkdXBsaWNhdGUgaXRlbXMgKi8KLQkJR2luU2hvcnRl blR1cGxlKHJlcywgbmV3bml0ZW0pOwotCX0KLQllbHNlCisJCQkJCSAgIG5l d0l0ZW1zLCBuZXdOUG9zdGluZywgZmFsc2UpOworCWlmICghcmVzKQogCXsK IAkJLyogcG9zdGluZyBsaXN0IHdvdWxkIGJlIHRvbyBiaWcsIGNvbnZlcnQg dG8gcG9zdGluZyB0cmVlICovCiAJCUJsb2NrTnVtYmVyIHBvc3RpbmdSb290 OwpAQCAtODgsOCArMjMwLDggQEAgYWRkSXRlbVBvaW50ZXJzVG9MZWFmVHVw bGUoR2luU3RhdGUgKmdpbnN0YXRlLAogCQkgKiBhbHJlYWR5IGJlIGluIG9y ZGVyIHdpdGggbm8gZHVwbGljYXRlcy4KIAkJICovCiAJCXBvc3RpbmdSb290 ID0gY3JlYXRlUG9zdGluZ1RyZWUoZ2luc3RhdGUtPmluZGV4LAotCQkJCQkJ CQkJCUdpbkdldFBvc3Rpbmcob2xkKSwKLQkJCQkJCQkJCQlHaW5HZXROUG9z dGluZyhvbGQpLAorCQkJCQkJCQkJCW9sZEl0ZW1zLAorCQkJCQkJCQkJCW9s ZE5Qb3N0aW5nLAogCQkJCQkJCQkJCWJ1aWxkU3RhdHMpOwogCiAJCS8qIE5v dyBpbnNlcnQgdGhlIFRJRHMtdG8tYmUtYWRkZWQgaW50byB0aGUgcG9zdGlu ZyB0cmVlICovCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvZ2lu L2dpbnBvc3RpbmdsaXN0LmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dp bnBvc3RpbmdsaXN0LmMKaW5kZXggZTVhMTViZi4uMTIxNGY5ZCAxMDA2NDQK LS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9naW5wb3N0aW5nbGlzdC5j CisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2lucG9zdGluZ2xpc3Qu YwpAQCAtNCw2ICs0LDkgQEAKICAqCSAgcm91dGluZXMgZm9yIGRlYWxpbmcg d2l0aCBwb3N0aW5nIGxpc3RzLgogICoKICAqCisgKiBYWFg6IEV4cGxhaW4g dGhlIHZhcmJ5dGUgZW5jb2RpbmcgaGVyZS4KKyAqCisgKgogICogUG9ydGlv bnMgQ29weXJpZ2h0IChjKSAxOTk2LTIwMTMsIFBvc3RncmVTUUwgR2xvYmFs IERldmVsb3BtZW50IEdyb3VwCiAgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMp IDE5OTQsIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5p YQogICoKQEAgLTE3LDYgKzIwLDk0IEBACiAjaW5jbHVkZSAiYWNjZXNzL2dp bl9wcml2YXRlLmgiCiAKIC8qCisgKiBXcml0ZSBpdGVtIHBvaW50ZXIgaW50 byBsZWFmIGRhdGEgcGFnZSB1c2luZyB2YXJieXRlIGVuY29kaW5nLiBTaW5j ZQorICogQmxvY2tOdW1iZXIgaXMgc3RvcmVkIGluIGluY3JlbWVudGFsIG1h bm5lciB3ZSBhbHNvIG5lZWQgYSBwcmV2aW91cyBpdGVtCisgKiBwb2ludGVy LgorICovCitDb21wcmVzc2VkUG9zdGluZ0xpc3QKK2dpbkRhdGFQYWdlTGVh ZldyaXRlSXRlbVBvaW50ZXIoQ29tcHJlc3NlZFBvc3RpbmdMaXN0IHB0ciwg SXRlbVBvaW50ZXIgaXB0ciwgSXRlbVBvaW50ZXIgcHJldikKK3sKKwl1aW50 MzIJCWJsb2NrTnVtYmVySW5jcjsKKwl1aW50MTYJCW9mZnNldDsKKwl1aW50 OAkJdjsKKworCUFzc2VydChJdGVtUG9pbnRlckdldEJsb2NrTnVtYmVyKGlw dHIpICE9IEludmFsaWRCbG9ja051bWJlcik7CisJQXNzZXJ0KEl0ZW1Qb2lu dGVyR2V0T2Zmc2V0TnVtYmVyKGlwdHIpICE9IEludmFsaWRPZmZzZXROdW1i ZXIpOworCUFzc2VydChnaW5Db21wYXJlSXRlbVBvaW50ZXJzKGlwdHIsIHBy ZXYpID4gMCk7CisJYmxvY2tOdW1iZXJJbmNyID0gaXB0ci0+aXBfYmxraWQu YmlfbG8gKyAoaXB0ci0+aXBfYmxraWQuYmlfaGkgPDwgMTYpIC0KKwkJCQkJ ICAocHJldi0+aXBfYmxraWQuYmlfbG8gKyAocHJldi0+aXBfYmxraWQuYmlf aGkgPDwgMTYpKTsKKwlmb3IgKDs7KQorCXsKKwkJaWYgKGJsb2NrTnVtYmVy SW5jciA8IEhJR0hCSVQpCisJCXsKKwkJCXYgPSAodWludDgpIGJsb2NrTnVt YmVySW5jcjsKKwkJCSpwdHIgPSB2OworCQkJcHRyKys7CisJCQlicmVhazsK KwkJfQorCQllbHNlCisJCXsKKwkJCXYgPSAoKHVpbnQ4KSBibG9ja051bWJl ckluY3IpIHwgSElHSEJJVDsKKwkJCSpwdHIgPSB2OworCQkJcHRyKys7CisJ CQlibG9ja051bWJlckluY3IgPj49IDc7CisJCX0KKwl9CisKKwlvZmZzZXQg PSBpcHRyLT5pcF9wb3NpZDsKKwlmb3IgKDs7KQorCXsKKwkJaWYgKG9mZnNl dCA8IEhJR0hCSVQpCisJCXsKKwkJCXYgPSAodWludDgpIG9mZnNldDsKKwkJ CSpwdHIgPSB2OworCQkJcHRyKys7CisJCQlicmVhazsKKwkJfQorCQllbHNl CisJCXsKKwkJCXYgPSAoKHVpbnQ4KSBvZmZzZXQpIHwgSElHSEJJVDsKKwkJ CSpwdHIgPSB2OworCQkJcHRyKys7CisJCQlvZmZzZXQgPj49IDc7CisJCX0K Kwl9CisKKwlyZXR1cm4gcHRyOworfQorCisvKgorICogQ2FsY3VsYXRlIHNp emUgb2YgaW5jcmVtZW50YWwgdmFyYnl0ZSBlbmNvZGluZyBvZiBpdGVtIHBv aW50ZXIuCisgKi8KK2ludAorZ2luRGF0YVBhZ2VMZWFmR2V0SXRlbVBvaW50 ZXJTaXplKEl0ZW1Qb2ludGVyIGlwdHIsIEl0ZW1Qb2ludGVyIHByZXYpCit7 CisJdWludDMyCQlibG9ja051bWJlckluY3I7CisJdWludDE2CQlvZmZzZXQ7 CisJaW50CQkJc2l6ZSA9IDA7CisKKwlBc3NlcnQoZ2luQ29tcGFyZUl0ZW1Q b2ludGVycyhpcHRyLCBwcmV2KSA+IDApOworCisJYmxvY2tOdW1iZXJJbmNy ID0gaXB0ci0+aXBfYmxraWQuYmlfbG8gKyAoaXB0ci0+aXBfYmxraWQuYmlf aGkgPDwgMTYpIC0KKwkJCQkJICAocHJldi0+aXBfYmxraWQuYmlfbG8gKyAo cHJldi0+aXBfYmxraWQuYmlfaGkgPDwgMTYpKTsKKwlkbworCXsKKwkJc2l6 ZSsrOworCQlibG9ja051bWJlckluY3IgPj49IDc7CisJfSB3aGlsZSAoYmxv Y2tOdW1iZXJJbmNyID4gMCk7CisKKwlvZmZzZXQgPSBpcHRyLT5pcF9wb3Np ZDsKKwlkbworCXsKKwkJc2l6ZSsrOworCQlvZmZzZXQgPj49IDc7CisJfSB3 aGlsZSAob2Zmc2V0ID4gMCk7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworCisv KgogICogTWVyZ2UgdHdvIG9yZGVyZWQgYXJyYXlzIG9mIGl0ZW1wb2ludGVy cywgZWxpbWluYXRpbmcgYW55IGR1cGxpY2F0ZXMuCiAgKiBSZXR1cm5zIHRo ZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHJlc3VsdC4KICAqIENhbGxlciBp cyByZXNwb25zaWJsZSB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSBhdCAq ZHN0LgpAQCAtNTQsMyArMTQ1LDYzIEBAIGdpbk1lcmdlSXRlbVBvaW50ZXJz KEl0ZW1Qb2ludGVyRGF0YSAqZHN0LAogCiAJcmV0dXJuIGRwdHIgLSBkc3Q7 CiB9CisKKy8qCisgKiBOb24taW5saW5lZCB2ZXJzaW9uIG9mIGdpbkRhdGFQ YWdlTGVhZlJlYWRJdGVtUG9pbnRlci4KKyAqCisgKiBSZWFkIG5leHQgaXRl bSBwb2ludGVyIGZyb20gbGVhZiBkYXRhIHBhZ2UuIFJlcGxhY2VzIGN1cnJl bnQgaXRlbSBwb2ludGVyCisgKiB3aXRoIHRoZSBuZXh0IG9uZS4gWmVybyBp dGVtIHBvaW50ZXIgc2hvdWxkIGJlIHBhc3NlZCBpbiBvcmRlciB0byByZWFk IHRoZQorICogZmlyc3QgaXRlbSBwb2ludGVyLgorICovCisjaWZuZGVmIFBH X1VTRV9JTkxJTkUKK0NvbXByZXNzZWRQb3N0aW5nTGlzdAorZ2luRGF0YVBh Z2VMZWFmUmVhZEl0ZW1Qb2ludGVyKENvbXByZXNzZWRQb3N0aW5nTGlzdCBw dHIsIEl0ZW1Qb2ludGVyIGlwdHIpCit7CisJdWludDMyCQlibG9ja051bWJl ckluY3I7CisJdWludDE2CQlvZmZzZXQ7CisJaW50CQkJaTsKKwl1aW50OAkJ djsKKwlJdGVtUG9pbnRlckRhdGEgcHJldiA9ICppcHRyOworCisJaSA9IDA7 CisJYmxvY2tOdW1iZXJJbmNyID0gMDsKKwlkbworCXsKKwkJdiA9ICpwdHI7 CisJCXB0cisrOworCQlibG9ja051bWJlckluY3IgfD0gKHVpbnQzMikgKHYg JiAofkhJR0hCSVQpKSA8PCBpOworCQlBc3NlcnQoaSA8IDI4IHx8ICgoaSA9 PSAyOCkgJiYgKCh2ICYgKH5ISUdIQklUKSkgPCAoMSA8PCA0KSkpKTsKKwkJ aSArPSA3OworCX0KKwl3aGlsZSAoSVNfSElHSEJJVF9TRVQodikpOworCisJ QXNzZXJ0KCh1aW50NjQpaXB0ci0+aXBfYmxraWQuYmlfbG8gKyAoKHVpbnQ2 NClpcHRyLT5pcF9ibGtpZC5iaV9oaSA8PCAxNikgKworCQkJKHVpbnQ2NCli bG9ja051bWJlckluY3IgPCAoKHVpbnQ2NCkxIDw8IDMyKSk7CisKKwlibG9j a051bWJlckluY3IgKz0gaXB0ci0+aXBfYmxraWQuYmlfbG8gKyAoaXB0ci0+ aXBfYmxraWQuYmlfaGkgPDwgMTYpOworCisJaXB0ci0+aXBfYmxraWQuYmlf bG8gPSBibG9ja051bWJlckluY3IgJiAweEZGRkY7CisJaXB0ci0+aXBfYmxr aWQuYmlfaGkgPSAoYmxvY2tOdW1iZXJJbmNyID4+IDE2KSAmIDB4RkZGRjsK KworCWkgPSAwOworCW9mZnNldCA9IDA7CisJZG8KKwl7CisJCXYgPSAqcHRy OworCQlwdHIrKzsKKwkJb2Zmc2V0IHw9ICh1aW50MTYpICh2ICYgKH5ISUdI QklUKSkgPDwgaTsKKwkJQXNzZXJ0KGkgPCAxNCB8fCAoKGkgPT0gMTQpICYm ICgodiAmICh+SElHSEJJVCkpIDwgKDEgPDwgMikpKSk7CisJCWkgKz0gNzsK Kwl9IHdoaWxlKElTX0hJR0hCSVRfU0VUKHYpKTsKKworCUFzc2VydChPZmZz ZXROdW1iZXJJc1ZhbGlkKG9mZnNldCkpOworCisJaXB0ci0+aXBfcG9zaWQg PSBvZmZzZXQ7CisKKwlBc3NlcnQoYmxvY2tOdW1iZXJJbmNyID4gQmxvY2tJ ZEdldEJsb2NrTnVtYmVyKCZwcmV2LmlwX2Jsa2lkKSB8fAorCQkgICBvZmZz ZXQgPiBwcmV2LmlwX3Bvc2lkKTsKKworCXJldHVybiBwdHI7Cit9CisjZW5k aWYgICAvKiBQR19VU0VfSU5MSU5FICovCisKZGlmZiAtLWdpdCBhL3NyYy9i YWNrZW5kL2FjY2Vzcy9naW4vZ2ludmFjdXVtLmMgYi9zcmMvYmFja2VuZC9h Y2Nlc3MvZ2luL2dpbnZhY3V1bS5jCmluZGV4IGMxN2M4MDguLjJkMTEzODUg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2ludmFjdXVt LmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9naW52YWN1dW0uYwpA QCAtMzMsNDggKzMzLDI3NiBAQCB0eXBlZGVmIHN0cnVjdAogCiAKIC8qCi0g KiBWYWN1dW1zIGEgbGlzdCBvZiBpdGVtIHBvaW50ZXJzLiBUaGUgb3JpZ2lu YWwgc2l6ZSBvZiB0aGUgbGlzdCBpcyAnbml0ZW0nLAotICogcmV0dXJucyB0 aGUgbnVtYmVyIG9mIGl0ZW1zIHJlbWFpbmluZyBhZnRlcndhcmRzLgorICog VmFjdXVtcyBhIGNvbXByZXNzZWQgcG9zdGluZyBsaXN0LiBUaGUgc2l6ZSBv ZiB0aGUgbGlzdCBjYW4gYmUgc3BlY2lmaWVkCisgKiBpbiBlaXRoZXIgbnVt YmVyIG9mIGJ5dGVzIChuYnl0ZXMpIG9yIG51bWJlciBvZiBpdGVtcyAobml0 ZW1zKS4gTGVhdmUgdGhlCisgKiBvdGhlciBvbmUgb2YgdGhvc2UgMC4KICAq Ci0gKiBJZiAqY2xlYW5lZCA9PSBOVUxMIG9uIGVudHJ5LCB0aGUgb3JpZ2lu YWwgYXJyYXkgaXMgbGVmdCB1bm1vZGlmaWVkOyBpZgotICogYW55IGl0ZW1z IGFyZSByZW1vdmVkLCBhIHBhbGxvYydkIGNvcHkgb2YgdGhlIHJlc3VsdCBp cyBzdG9yZWQgaW4gKmNsZWFuZWQuCi0gKiBPdGhlcndpc2UgKmNsZWFuZWQg c2hvdWxkIHBvaW50IHRvIHRoZSBvcmlnaW5hbCBhcnJheSwgaW4gd2hpY2gg Y2FzZSBpdCdzCi0gKiBtb2RpZmllZCBkaXJlY3RseS4KKyAqIFJlc3VsdHMg YXJlIGFsd2F5cyBzdG9yZWQgaW4gKmNsZWFuZWQsIHdoaWNoIHdpbGwgYmUg YWxsb2NhdGVkCisgKiBpZiBpdCdzIG5lZWRlZC4KKyAqCisgKiBSZXR1cm5z IHRoZSBudW1iZXIgb2YgaXRlbXMgcmVtYWluaW5nLgorICovCitzdGF0aWMg aW50CitnaW5WYWN1dW1Qb3N0aW5nTGlzdENvbXByZXNzZWQoR2luVmFjdXVt U3RhdGUgKmd2cywKKwkJCQkJIENvbXByZXNzZWRQb3N0aW5nTGlzdCBzcmMs IGludCBuYnl0ZXMsIGludCBuaXRlbXMsCisJCQkJCSBDb21wcmVzc2VkUG9z dGluZ0xpc3QgKmNsZWFuZWQsIFNpemUgKm5ld1NpemUpCit7CisJSXRlbVBv aW50ZXJEYXRhIGlwdHIgPSB7ezAsMH0sMH0sIHByZXZJcHRyOworCVBvaW50 ZXIJCWRzdCA9IE5VTEwsIHByZXYsIHB0cjsKKwlQb2ludGVyCQllbmQ7CisJ Ym9vbAkJY29weWluZyA9IGZhbHNlOworCWludAkJCXJlbWFpbmluZyA9IDA7 CisJaW50CQkJaSA9IDA7CisKKwlBc3NlcnQoKmNsZWFuZWQgPT0gTlVMTCk7 CisKKwkvKgorCSAqIFRoZSBlbmQgb2YgdGhlIHBvc3RpbmcgbGlzdCBjYW4g YmUgc3BlY2lmaWVkIGFzIGVpdGhlciBudW1iZXIgb2YKKwkgKiBieXRlcyBv ciBudW1iZXIgb2YgaXRlbXMuCisJICovCisJaWYgKG5ieXRlcyA9PSAwICYm IG5pdGVtcyA9PSAwKQorCQlyZXR1cm4gMDsgLyogbm90aGluZyB0byBkbyAq LworCWlmIChuYnl0ZXMgPT0gMCkKKwl7CisJCS8qCisJCSAqIGN1cnJlbnRs eSB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCB0byBwcm9jZXNzIGxpc3Rz IHRoYXQgYXJlCisJCSAqIHN0b3JlZCBvbiBhIHBhZ2UsIHNvIGNhbid0IGJl IGxhcmdlciB0aGFuIGJsb2NrIHNpemUuCisJCSAqLworCQluYnl0ZXMgPSBC TENLU1o7CisJfQorCWVuZCA9IHNyYyArIG5ieXRlczsKKworCS8qCisJICog aXRlcmF0ZSB0aHJvdWdoIHRoZSBjb21wcmVzc2VkIHBvc3RpbmcgbGlzdC4K KwkgKi8KKwlwcmV2SXB0ciA9IGlwdHI7CisJcHRyID0gc3JjOworCXdoaWxl IChwdHIgPCBlbmQgJiYgKG5pdGVtcyA9PSAwIHx8IGkgPCBuaXRlbXMpKQor CXsKKwkJcHJldiA9IHB0cjsKKwkJcHRyID0gZ2luRGF0YVBhZ2VMZWFmUmVh ZEl0ZW1Qb2ludGVyKHB0ciwgJmlwdHIpOworCQlpZiAoZ3ZzLT5jYWxsYmFj aygmaXB0ciwgZ3ZzLT5jYWxsYmFja19zdGF0ZSkpCisJCXsKKwkJCWd2cy0+ cmVzdWx0LT50dXBsZXNfcmVtb3ZlZCArPSAxOworCQkJaWYgKCFkc3QpCisJ CQl7CisJCQkJZHN0ID0gcGFsbG9jKG5ieXRlcyk7CisJCQkJKmNsZWFuZWQg PSBkc3Q7CisJCQkJaWYgKHByZXYgIT0gc3JjKQorCQkJCXsKKwkJCQkJbWVt Y3B5KGRzdCwgc3JjLCBwcmV2IC0gc3JjKTsKKwkJCQkJZHN0ICs9IHByZXYg LSBzcmM7CisJCQkJfQorCQkJfQorCQkJY29weWluZyA9IHRydWU7CisJCX0K KwkJZWxzZQorCQl7CisJCQlyZW1haW5pbmcrKzsKKwkJCWd2cy0+cmVzdWx0 LT5udW1faW5kZXhfdHVwbGVzICs9IDE7CisJCQlpZiAoY29weWluZykKKwkJ CQlkc3QgPSBnaW5EYXRhUGFnZUxlYWZXcml0ZUl0ZW1Qb2ludGVyKGRzdCwg JmlwdHIsICZwcmV2SXB0cik7CisJCQlwcmV2SXB0ciA9IGlwdHI7CisJCX0K KwkJaSsrOworCX0KKworCWlmIChjb3B5aW5nKQorCXsKKwkJKm5ld1NpemUg PSBkc3QgLSAqY2xlYW5lZDsKKwkJQXNzZXJ0KCpuZXdTaXplIDw9IG5ieXRl cyk7CisJfQorCXJldHVybiByZW1haW5pbmc7Cit9CisKKy8qCisgKiBWYWN1 dW1zIGEgY29tcHJlc3NlZCBwb3N0aW5nIGxpc3QuIFRoZSBzaXplIG9mIHRo ZSBtdXN0IGNhbiBiZSBzcGVjaWZpZWQKKyAqIGluIG51bWJlciBvZiBpdGVt cyAobml0ZW1zKS4KKyAqCisgKiBSZXN1bHRzIGFyZSBhbHdheXMgc3RvcmVk IGluICpjbGVhbmVkLCB3aGljaCB3aWxsIGJlIGFsbG9jYXRlZAorICogaWYg aXQncyBuZWVkZWQuIFJlc3VsdHMgYXJlIGNvbXByZXNzZWQuCisgKgorICog UmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIHJlbWFpbmluZy4KICAqLwog c3RhdGljIGludAotZ2luVmFjdXVtUG9zdGluZ0xpc3QoR2luVmFjdXVtU3Rh dGUgKmd2cywgSXRlbVBvaW50ZXJEYXRhICppdGVtcywgaW50IG5pdGVtLAot CQkJCQkgSXRlbVBvaW50ZXJEYXRhICoqY2xlYW5lZCkKK2dpblZhY3V1bVBv c3RpbmdMaXN0VW5jb21wcmVzc2VkKEdpblZhY3V1bVN0YXRlICpndnMsIEl0 ZW1Qb2ludGVyRGF0YSAqaXRlbXMsCisJCWludCBuaXRlbSwgQ29tcHJlc3Nl ZFBvc3RpbmdMaXN0ICpjbGVhbmVkLCBTaXplICpuZXdTaXplKQogewotCWlu dAkJCWksCi0JCQkJaiA9IDA7CisJaW50CQkJaSwgaiwKKwkJCQlyZW1haW5p bmcgPSAwOworCVBvaW50ZXIJCWRzdCA9IE5VTEwsIHB0cjsKKwlJdGVtUG9p bnRlckRhdGEgcHJldklwdHIgPSB7ezAsMH0sMH07CisJYm9vbAkJY29weWlu ZyA9IGZhbHNlOwogCi0JQXNzZXJ0KCpjbGVhbmVkID09IE5VTEwgfHwgKmNs ZWFuZWQgPT0gaXRlbXMpOworCUFzc2VydCgqY2xlYW5lZCA9PSBOVUxMKTsK IAogCS8qCi0JICoganVzdCBzY2FuIG92ZXIgSXRlbVBvaW50ZXIgYXJyYXkK KwkgKiBJdGVyYXRlIG92ZXIgVElEcyBhcnJheQogCSAqLwogCWZvciAoaSA9 IDA7IGkgPCBuaXRlbTsgaSsrKQogCXsKIAkJaWYgKGd2cy0+Y2FsbGJhY2so aXRlbXMgKyBpLCBndnMtPmNhbGxiYWNrX3N0YXRlKSkKIAkJewogCQkJZ3Zz LT5yZXN1bHQtPnR1cGxlc19yZW1vdmVkICs9IDE7Ci0JCQlpZiAoISpjbGVh bmVkKQorCQkJaWYgKCFkc3QpCiAJCQl7Ci0JCQkJKmNsZWFuZWQgPSAoSXRl bVBvaW50ZXJEYXRhICopIHBhbGxvYyhzaXplb2YoSXRlbVBvaW50ZXJEYXRh KSAqIG5pdGVtKTsKKwkJCQkvKgorCQkJCSAqIEZpc3QgVElEIHRvIGJlIGRl bGV0ZWQ6IGFsbG9jYXRlIG1lbW9yeSBmb3IgY29tcHJlc3NlZAorCQkJCSAq IHJlc3VsdHMgYW5kIHB1dCB0aGVyZSBjb21wcmVzc2VkIHJlcHJlc2VudGF0 aW9uIG9mIHByZXZpb3VzCisJCQkJICogVElEcy4KKwkJCQkgKi8KKwkJCQlk c3QgPSBwYWxsb2MoTUFYX0NPTVBSRVNTRURfSVRFTV9QT0lOVEVSX1NJWkUg KiBuaXRlbSk7CisJCQkJcHRyID0gZHN0OwogCQkJCWlmIChpICE9IDApCi0J CQkJCW1lbWNweSgqY2xlYW5lZCwgaXRlbXMsIHNpemVvZihJdGVtUG9pbnRl ckRhdGEpICogaSk7CisJCQkJeworCQkJCQlmb3IgKGogPSAwOyBqIDwgaTsg aisrKQorCQkJCQl7CisJCQkJCQlwdHIgPSBnaW5EYXRhUGFnZUxlYWZXcml0 ZUl0ZW1Qb2ludGVyKHB0ciwgaXRlbXMgKyBqLAorCQkJCQkJCQkJCQkJCQkJ CQkmcHJldklwdHIpOworCQkJCQkJcHJldklwdHIgPSBpdGVtc1tqXTsKKwkJ CQkJfQorCQkJCX0KKwkJCQljb3B5aW5nID0gdHJ1ZTsKIAkJCX0KIAkJfQog CQllbHNlCiAJCXsKIAkJCWd2cy0+cmVzdWx0LT5udW1faW5kZXhfdHVwbGVz ICs9IDE7Ci0JCQlpZiAoaSAhPSBqKQotCQkJCSgqY2xlYW5lZClbal0gPSBp dGVtc1tpXTsKLQkJCWorKzsKKwkJCWlmIChjb3B5aW5nKQorCQkJeworCQkJ CXB0ciA9IGdpbkRhdGFQYWdlTGVhZldyaXRlSXRlbVBvaW50ZXIocHRyLCBp dGVtcyArIGksCisJCQkJCQkJCQkJCQkJCQkmcHJldklwdHIpOworCQkJCXBy ZXZJcHRyID0gaXRlbXNbaV07CisJCQl9CisJCQlyZW1haW5pbmcrKzsKIAkJ fQogCX0KIAotCXJldHVybiBqOworCWlmIChjb3B5aW5nKQorCXsKKwkJKmNs ZWFuZWQgPSBkc3Q7CisJCSpuZXdTaXplID0gcHRyIC0gZHN0OworCX0KKwor CXJldHVybiByZW1haW5pbmc7Cit9CisKKy8qCisgKiBGb3JtIGEgdHVwbGUg Zm9yIGVudHJ5IHRyZWUgYmFzZWQgb24gYWxyZWFkeSBlbmNvZGVkIGFycmF5 IG9mIGl0ZW0gcG9pbnRlcnMKKyAqIHdpdGggYWRkaXRpb25hbCBpbmZvcm1h dGlvbi4KKyAqLworc3RhdGljIEluZGV4VHVwbGUKK0dpbkZvcm1UdXBsZShH aW5TdGF0ZSAqZ2luc3RhdGUsCisJCQkgT2Zmc2V0TnVtYmVyIGF0dG51bSwg RGF0dW0ga2V5LCBHaW5OdWxsQ2F0ZWdvcnkgY2F0ZWdvcnksCisJCQkgUG9p bnRlciBkYXRhLAorCQkJIFNpemUgZGF0YVNpemUsCisJCQkgdWludDMyIG5p cGQsCisJCQkgYm9vbCBlcnJvclRvb0JpZykKK3sKKwlEYXR1bQkJZGF0dW1z WzNdOworCWJvb2wJCWlzbnVsbFszXTsKKwlJbmRleFR1cGxlCWl0dXA7CisJ dWludDMyCQluZXdzaXplOworCisJLyogQnVpbGQgdGhlIGJhc2ljIHR1cGxl OiBvcHRpb25hbCBjb2x1bW4gbnVtYmVyLCBwbHVzIGtleSBkYXR1bSAqLwor CWlmIChnaW5zdGF0ZS0+b25lQ29sKQorCXsKKwkJZGF0dW1zWzBdID0ga2V5 OworCQlpc251bGxbMF0gPSAoY2F0ZWdvcnkgIT0gR0lOX0NBVF9OT1JNX0tF WSk7CisJCWlzbnVsbFsxXSA9IHRydWU7CisJfQorCWVsc2UKKwl7CisJCWRh dHVtc1swXSA9IFVJbnQxNkdldERhdHVtKGF0dG51bSk7CisJCWlzbnVsbFsw XSA9IGZhbHNlOworCQlkYXR1bXNbMV0gPSBrZXk7CisJCWlzbnVsbFsxXSA9 IChjYXRlZ29yeSAhPSBHSU5fQ0FUX05PUk1fS0VZKTsKKwkJaXNudWxsWzJd ID0gdHJ1ZTsKKwl9CisKKwlpdHVwID0gaW5kZXhfZm9ybV90dXBsZShnaW5z dGF0ZS0+dHVwZGVzY1thdHRudW0gLSAxXSwgZGF0dW1zLCBpc251bGwpOwor CisJLyoKKwkgKiBEZXRlcm1pbmUgYW5kIHN0b3JlIG9mZnNldCB0byB0aGUg cG9zdGluZyBsaXN0LCBtYWtpbmcgc3VyZSB0aGVyZSBpcworCSAqIHJvb20g Zm9yIHRoZSBjYXRlZ29yeSBieXRlIGlmIG5lZWRlZC4KKwkgKgorCSAqIE5v dGU6IGJlY2F1c2UgaW5kZXhfZm9ybV90dXBsZSBNQVhBTElHTnMgdGhlIHR1 cGxlIHNpemUsIHRoZXJlIG1heSB3ZWxsCisJICogYmUgc29tZSB3YXN0ZWQg cGFkIHNwYWNlLiAgSXMgaXQgd29ydGggcmVjb21wdXRpbmcgdGhlIGRhdGEg bGVuZ3RoIHRvCisJICogcHJldmVudCB0aGF0PyAgVGhhdCB3b3VsZCBhbHNv IGFsbG93IHVzIHRvIEFzc2VydCB0aGF0IHRoZSByZWFsIGRhdGEKKwkgKiBk b2Vzbid0IG92ZXJsYXAgdGhlIEdpbk51bGxDYXRlZ29yeSBieXRlLCB3aGlj aCB0aGlzIGNvZGUgY3VycmVudGx5CisJICogdGFrZXMgb24gZmFpdGguCisJ ICovCisJbmV3c2l6ZSA9IEluZGV4VHVwbGVTaXplKGl0dXApOworCisJaWYg KEluZGV4VHVwbGVIYXNOdWxscyhpdHVwKSkKKwl7CisJCXVpbnQzMgkJbWlu c2l6ZTsKKworCQlBc3NlcnQoY2F0ZWdvcnkgIT0gR0lOX0NBVF9OT1JNX0tF WSk7CisJCW1pbnNpemUgPSBHaW5DYXRlZ29yeU9mZnNldChpdHVwLCBnaW5z dGF0ZSkgKyBzaXplb2YoR2luTnVsbENhdGVnb3J5KTsKKwkJbmV3c2l6ZSA9 IE1heChuZXdzaXplLCBtaW5zaXplKTsKKwl9CisKKwlHaW5TZXRQb3N0aW5n T2Zmc2V0KGl0dXAsIG5ld3NpemUpOworCisJR2luU2V0TlBvc3RpbmcoaXR1 cCwgbmlwZCk7CisKKwkvKgorCSAqIEFkZCBzcGFjZSBuZWVkZWQgZm9yIHBv c3RpbmcgbGlzdCwgaWYgYW55LiAgVGhlbiBjaGVjayB0aGF0IHRoZSB0dXBs ZQorCSAqIHdvbid0IGJlIHRvbyBiaWcgdG8gc3RvcmUuCisJICovCisKKwlp ZiAobmlwZCA+IDApCisJeworCQluZXdzaXplICs9IGRhdGFTaXplOworCX0K KworCW5ld3NpemUgPSBNQVhBTElHTihuZXdzaXplKTsKKworCWlmIChuZXdz aXplID4gTWluKElOREVYX1NJWkVfTUFTSywgR2luTWF4SXRlbVNpemUpKQor CXsKKwkJaWYgKGVycm9yVG9vQmlnKQorCQkJZXJlcG9ydChFUlJPUiwKKwkJ CQkJKGVycmNvZGUoRVJSQ09ERV9QUk9HUkFNX0xJTUlUX0VYQ0VFREVEKSwK KwkJCWVycm1zZygiaW5kZXggcm93IHNpemUgJWx1IGV4Y2VlZHMgbWF4aW11 bSAlbHUgZm9yIGluZGV4IFwiJXNcIiIsCisJCQkJICAgKHVuc2lnbmVkIGxv bmcpIG5ld3NpemUsCisJCQkJICAgKHVuc2lnbmVkIGxvbmcpIE1pbihJTkRF WF9TSVpFX01BU0ssCisJCQkJCQkJCQkgICBHaW5NYXhJdGVtU2l6ZSksCisJ CQkJICAgUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUoZ2luc3RhdGUtPmluZGV4 KSkpKTsKKwkJcGZyZWUoaXR1cCk7CisJCXJldHVybiBOVUxMOworCX0KKwor CS8qCisJICogUmVzaXplIHR1cGxlIGlmIG5lZWRlZAorCSAqLworCWlmIChu ZXdzaXplICE9IEluZGV4VHVwbGVTaXplKGl0dXApKQorCXsKKwkJaXR1cCA9 IHJlcGFsbG9jKGl0dXAsIG5ld3NpemUpOworCisJCS8qIHNldCBuZXcgc2l6 ZSBpbiB0dXBsZSBoZWFkZXIgKi8KKwkJaXR1cC0+dF9pbmZvICY9IH5JTkRF WF9TSVpFX01BU0s7CisJCWl0dXAtPnRfaW5mbyB8PSBuZXdzaXplOworCX0K KworCS8qCisJICogQ29weSBpbiB0aGUgcG9zdGluZyBsaXN0LCBpZiBwcm92 aWRlZAorCSAqLworCWlmIChuaXBkID4gMCkKKwl7CisJCWNoYXIgKnB0ciA9 IEdpbkdldFBvc3RpbmcoaXR1cCk7CisJCW1lbWNweShwdHIsIGRhdGEsIGRh dGFTaXplKTsKKwl9CisKKwkvKgorCSAqIEluc2VydCBjYXRlZ29yeSBieXRl LCBpZiBuZWVkZWQKKwkgKi8KKwlpZiAoY2F0ZWdvcnkgIT0gR0lOX0NBVF9O T1JNX0tFWSkKKwl7CisJCUFzc2VydChJbmRleFR1cGxlSGFzTnVsbHMoaXR1 cCkpOworCQlHaW5TZXROdWxsQ2F0ZWdvcnkoaXR1cCwgZ2luc3RhdGUsIGNh dGVnb3J5KTsKKwl9CisJcmV0dXJuIGl0dXA7CiB9CiAKIC8qCkBAIC05OCwx MyArMzI2LDIwIEBAIHhsb2dWYWN1dW1QYWdlKFJlbGF0aW9uIGluZGV4LCBC dWZmZXIgYnVmZmVyKQogCiAJZGF0YS5ub2RlID0gaW5kZXgtPnJkX25vZGU7 CiAJZGF0YS5ibGtubyA9IEJ1ZmZlckdldEJsb2NrTnVtYmVyKGJ1ZmZlcik7 Ci0KIAlpZiAoR2luUGFnZUlzRGF0YShwYWdlKSkKIAl7Ci0JCWJhY2t1cCA9 IEdpbkRhdGFQYWdlR2V0RGF0YShwYWdlKTsKLQkJZGF0YS5uaXRlbSA9IEdp blBhZ2VHZXRPcGFxdWUocGFnZSktPm1heG9mZjsKLQkJaWYgKGRhdGEubml0 ZW0pCi0JCQlsZW4gPSBNQVhBTElHTihzaXplb2YoSXRlbVBvaW50ZXJEYXRh KSAqIGRhdGEubml0ZW0pOworCQlpZiAoR2luUGFnZUlzTGVhZihwYWdlKSkK KwkJeworCQkJYmFja3VwID0gR2luRGF0YUxlYWZQYWdlR2V0UG9zdGluZ0xp c3QocGFnZSk7CisJCQlsZW4gPSBHaW5EYXRhTGVhZlBhZ2VHZXRQb3N0aW5n TGlzdFNpemUocGFnZSk7CisJCQlkYXRhLm5pdGVtID0gbGVuOworCQl9CisJ CWVsc2UKKwkJeworCQkJYmFja3VwID0gKGNoYXIgKikgR2luRGF0YVBhZ2VH ZXRQb3N0aW5nSXRlbShwYWdlLCAxKTsKKwkJCWRhdGEubml0ZW0gPSBHaW5Q YWdlR2V0T3BhcXVlKHBhZ2UpLT5tYXhvZmY7CisJCQlsZW4gPSBzaXplb2Yo UG9zdGluZ0l0ZW0pICogZGF0YS5uaXRlbTsKKwkJfQogCX0KIAllbHNlCiAJ ewpAQCAtMTc5LDIyICs0MTQsNjcgQEAgZ2luVmFjdXVtUG9zdGluZ1RyZWVM ZWF2ZXMoR2luVmFjdXVtU3RhdGUgKmd2cywgQmxvY2tOdW1iZXIgYmxrbm8s IGJvb2wgaXNSb290LAogCiAJaWYgKEdpblBhZ2VJc0xlYWYocGFnZSkpCiAJ ewotCQlPZmZzZXROdW1iZXIgbmV3TWF4T2ZmLAotCQkJCQlvbGRNYXhPZmYg PSBHaW5QYWdlR2V0T3BhcXVlKHBhZ2UpLT5tYXhvZmY7Ci0JCUl0ZW1Qb2lu dGVyRGF0YSAqY2xlYW5lZCA9IE5VTEw7CisJCVBvaW50ZXIgY2xlYW5lZCA9 IE5VTEw7CisJCVNpemUgbmV3U2l6ZTsKKwkJUG9pbnRlciBiZWdpblB0cjsK KworCQliZWdpblB0ciA9IEdpbkRhdGFMZWFmUGFnZUdldFBvc3RpbmdMaXN0 KHBhZ2UpOwogCi0JCW5ld01heE9mZiA9IGdpblZhY3V1bVBvc3RpbmdMaXN0 KGd2cywKLQkJCQkoSXRlbVBvaW50ZXIpIEdpbkRhdGFQYWdlR2V0RGF0YShw YWdlKSwgb2xkTWF4T2ZmLCAmY2xlYW5lZCk7CisJCS8qCisJCSAqIFZhY3V1 bSBwb3N0aW5nIGxpc3Qgd2l0aCBwcm9wZXIgZnVuY3Rpb24gZm9yIGNvbXBy ZXNzZWQgYW5kCisJCSAqIHVuY29tcHJlc3NlZCBmb3JtYXQuCisJCSAqLwor CQlpZiAoR2luUGFnZUlzQ29tcHJlc3NlZChwYWdlKSkKKwkJeworCQkJU2l6 ZSBvbGRTaXplOworCQkJb2xkU2l6ZSA9IEdpbkRhdGFMZWFmUGFnZUdldFBv c3RpbmdMaXN0U2l6ZShwYWdlKTsKKwkJCSh2b2lkKSBnaW5WYWN1dW1Qb3N0 aW5nTGlzdENvbXByZXNzZWQoZ3ZzLCBiZWdpblB0ciwgb2xkU2l6ZSwgMCwK KwkJCQkJCQkJCQkmY2xlYW5lZCwgJm5ld1NpemUpOworCQl9CisJCWVsc2UK KwkJeworCQkJKHZvaWQpIGdpblZhY3V1bVBvc3RpbmdMaXN0VW5jb21wcmVz c2VkKGd2cywKKwkJCQkJKEl0ZW1Qb2ludGVyKUdpbkRhdGFQYWdlR2V0RGF0 YShwYWdlKSwKKwkJCQkJR2luUGFnZUdldE9wYXF1ZShwYWdlKS0+bWF4b2Zm LAorCQkJCQkmY2xlYW5lZCwgJm5ld1NpemUpOworCQl9CiAKIAkJLyogc2F2 ZXMgY2hhbmdlcyBhYm91dCBkZWxldGVkIHR1cGxlIC4uLiAqLwotCQlpZiAo b2xkTWF4T2ZmICE9IG5ld01heE9mZikKKwkJaWYgKGNsZWFuZWQpCiAJCXsK KwkJCS8qCisJCQkgKiBXZSBzaG91bGQgaGF2ZSBlbm91Z2ggb2Ygc3BhY2Ug dG8gcGxhY2UgdmFjdXVtZWQgcG9zdGluZyBsaXN0LgorCQkJICogQ291bGQg ZmFpbCBpbiBzb21lIHZlcnkgcmFyZSBjYXNlcyBiZWNhdXNlIG9mIGNvbXBy ZXNzZWQKKwkJCSAqIHJlcHJlc2VudGF0aW9uIG9mIFRJRCBjb3VsZCBiZSBs YXJnZXIgaW4gd29yc3QgY2FzZSBhbmQgYmVjYXVzZQorCQkJICogd2UgaGF2 ZSB0byBwbGFjZSBpdGVtIGluZGV4ZXMgYXQgdGhlIGVuZCBvZiBwYWdlLgor CQkJICovCisJCQlpZiAobmV3U2l6ZSA+IEdpbkRhdGFMZWFmTWF4UG9zdGlu Z0xpc3RTaXplKQorCQkJeworCQkJCWVyZXBvcnQoRVJST1IsCisJCQkJCQko ZXJyY29kZShFUlJDT0RFX1BST0dSQU1fTElNSVRfRVhDRUVERUQpLAorCQkJ CWVycm1zZygiY2FuJ3QgY29tcHJlc3MgYmxvY2sgJXUgb2YgZ2luIGluZGV4 IFwiJXNcIiwgY29uc2lkZXIgUkVJTkRFWCIsCisJCQkJCQlibGtubywgUmVs YXRpb25HZXRSZWxhdGlvbk5hbWUoZ3ZzLT5naW5zdGF0ZS5pbmRleCkpKSk7 CisJCQl9CisKIAkJCVNUQVJUX0NSSVRfU0VDVElPTigpOwogCi0JCQlpZiAo bmV3TWF4T2ZmID4gMCkKLQkJCQltZW1jcHkoR2luRGF0YVBhZ2VHZXREYXRh KHBhZ2UpLCBjbGVhbmVkLCBzaXplb2YoSXRlbVBvaW50ZXJEYXRhKSAqIG5l d01heE9mZik7CisJCQlpZiAoIUdpblBhZ2VJc0NvbXByZXNzZWQocGFnZSkp CisJCQl7CisJCQkJLyoKKwkJCQkgKiBTZXQgcGFnZSBmb3JtYXQgaXMgY29t cHJlc3NlZCBhbmQgcmVzZXJ2ZSBzcGFjZSBmb3IKKwkJCQkgKiBpdGVtIGlu ZGV4ZXMKKwkJCQkgKi8KKwkJCQlHaW5QYWdlU2V0Q29tcHJlc3NlZChwYWdl KTsKKwkJCQkoKFBhZ2VIZWFkZXIpIHBhZ2UpLT5wZF91cHBlciAtPQorCQkJ CQkJc2l6ZW9mKEdpbkRhdGFMZWFmSXRlbUluZGV4KSAqIEdpbkRhdGFMZWFm SW5kZXhDb3VudDsKKwkJCX0KKworCQkJaWYgKG5ld1NpemUgPiAwKQorCQkJ CW1lbWNweShiZWdpblB0ciwgY2xlYW5lZCwgbmV3U2l6ZSk7CisKIAkJCXBm cmVlKGNsZWFuZWQpOwotCQkJR2luUGFnZUdldE9wYXF1ZShwYWdlKS0+bWF4 b2ZmID0gbmV3TWF4T2ZmOworCQkJR2luRGF0YUxlYWZQYWdlU2V0UG9zdGlu Z0xpc3RTaXplKHBhZ2UsIG5ld1NpemUpOworCQkJdXBkYXRlSXRlbUluZGV4 ZXMocGFnZSk7CiAKIAkJCU1hcmtCdWZmZXJEaXJ0eShidWZmZXIpOwogCQkJ eGxvZ1ZhY3V1bVBhZ2UoZ3ZzLT5pbmRleCwgYnVmZmVyKTsKQEAgLTIwMiw3 ICs0ODIsNyBAQCBnaW5WYWN1dW1Qb3N0aW5nVHJlZUxlYXZlcyhHaW5WYWN1 dW1TdGF0ZSAqZ3ZzLCBCbG9ja051bWJlciBibGtubywgYm9vbCBpc1Jvb3Qs CiAJCQlFTkRfQ1JJVF9TRUNUSU9OKCk7CiAKIAkJCS8qIGlmIHJvb3QgaXMg YSBsZWFmIHBhZ2UsIHdlIGRvbid0IGRlc2lyZSBmdXJ0aGVyIHByb2Nlc3Np bmcgKi8KLQkJCWlmICghaXNSb290ICYmIEdpblBhZ2VHZXRPcGFxdWUocGFn ZSktPm1heG9mZiA8IEZpcnN0T2Zmc2V0TnVtYmVyKQorCQkJaWYgKCFpc1Jv b3QgJiYgbmV3U2l6ZSA9PSAwKQogCQkJCWhhc1ZvaWRQYWdlID0gVFJVRTsK IAkJfQogCX0KQEAgLTM5MSw2ICs2NzEsNyBAQCBnaW5TY2FuVG9EZWxldGUo R2luVmFjdXVtU3RhdGUgKmd2cywgQmxvY2tOdW1iZXIgYmxrbm8sIGJvb2wg aXNSb290LAogCUJ1ZmZlcgkJYnVmZmVyOwogCVBhZ2UJCXBhZ2U7CiAJYm9v bAkJbWVEZWxldGUgPSBGQUxTRTsKKwlib29sCQlpc2VtcHR5OwogCiAJaWYg KGlzUm9vdCkKIAl7CkBAIC00MjksNyArNzEwLDEyIEBAIGdpblNjYW5Ub0Rl bGV0ZShHaW5WYWN1dW1TdGF0ZSAqZ3ZzLCBCbG9ja051bWJlciBibGtubywg Ym9vbCBpc1Jvb3QsCiAJCX0KIAl9CiAKLQlpZiAoR2luUGFnZUdldE9wYXF1 ZShwYWdlKS0+bWF4b2ZmIDwgRmlyc3RPZmZzZXROdW1iZXIpCisJaWYgKEdp blBhZ2VJc0xlYWYocGFnZSkpCisJCWlzZW1wdHkgPSAoR2luRGF0YUxlYWZQ YWdlR2V0UG9zdGluZ0xpc3RTaXplKHBhZ2UpID09IDApOworCWVsc2UKKwkJ aXNlbXB0eSA9IEdpblBhZ2VHZXRPcGFxdWUocGFnZSktPm1heG9mZiA8IEZp cnN0T2Zmc2V0TnVtYmVyOworCisJaWYgKGlzZW1wdHkpCiAJewogCQkvKiB3 ZSBuZXZlciBkZWxldGUgdGhlIGxlZnQtIG9yIHJpZ2h0bW9zdCBicmFuY2gg Ki8KIAkJaWYgKG1lLT5sZWZ0Qmxrbm8gIT0gSW52YWxpZEJsb2NrTnVtYmVy ICYmICFHaW5QYWdlUmlnaHRNb3N0KHBhZ2UpKQpAQCAtNTE2LDEyICs4MDIs MjkgQEAgZ2luVmFjdXVtRW50cnlQYWdlKEdpblZhY3V1bVN0YXRlICpndnMs IEJ1ZmZlciBidWZmZXIsIEJsb2NrTnVtYmVyICpyb290cywgdWludDMKIAkJ CS8qCiAJCQkgKiBpZiB3ZSBhbHJlYWR5IGNyZWF0ZWQgYSB0ZW1wb3Jhcnkg cGFnZSwgbWFrZSBjaGFuZ2VzIGluIHBsYWNlCiAJCQkgKi8KLQkJCUl0ZW1Q b2ludGVyRGF0YSAqY2xlYW5lZCA9ICh0bXBwYWdlID09IG9yaWdwYWdlKSA/ IE5VTEwgOiBHaW5HZXRQb3N0aW5nKGl0dXApOwotCQkJaW50CQkJbmV3TjsK LQotCQkJbmV3TiA9IGdpblZhY3V1bVBvc3RpbmdMaXN0KGd2cywgR2luR2V0 UG9zdGluZyhpdHVwKSwgR2luR2V0TlBvc3RpbmcoaXR1cCksICZjbGVhbmVk KTsKKwkJCVNpemUgY2xlYW5lZFNpemU7CisJCQlQb2ludGVyIGNsZWFuZWQg PSBOVUxMOworCQkJaW50CQluZXdOOwogCi0JCQlpZiAoR2luR2V0TlBvc3Rp bmcoaXR1cCkgIT0gbmV3TikKKwkJCS8qCisJCQkgKiBWYWN1dW0gcG9zdGlu ZyBsaXN0IHdpdGggcHJvcGVyIGZ1bmN0aW9uIGZvciBjb21wcmVzc2VkIGFu ZAorCQkJICogdW5jb21wcmVzc2VkIGZvcm1hdC4KKwkJCSAqLworCQkJaWYg KEdpbkl0dXBJc0NvbXByZXNzZWQoaXR1cCkpCisJCQkJbmV3TiA9IGdpblZh Y3V1bVBvc3RpbmdMaXN0Q29tcHJlc3NlZChndnMsCisJCQkJCQkJCQkJCUdp bkdldFBvc3RpbmcoaXR1cCksCisJCQkJCQkJCQkJCTAsCisJCQkJCQkJCQkJ CUdpbkdldE5Qb3N0aW5nKGl0dXApLAorCQkJCQkJCQkJCQkmY2xlYW5lZCwK KwkJCQkJCQkJCQkJJmNsZWFuZWRTaXplKTsKKwkJCWVsc2UKKwkJCQluZXdO ID0gZ2luVmFjdXVtUG9zdGluZ0xpc3RVbmNvbXByZXNzZWQoZ3ZzLAorCQkJ CQkJCQkJCQkoSXRlbVBvaW50ZXIpR2luR2V0UG9zdGluZyhpdHVwKSwKKwkJ CQkJCQkJCQkJR2luR2V0TlBvc3RpbmcoaXR1cCksCisJCQkJCQkJCQkJCSZj bGVhbmVkLAorCQkJCQkJCQkJCQkmY2xlYW5lZFNpemUpOworCisJCQlpZiAo Y2xlYW5lZCkKIAkJCXsKIAkJCQlPZmZzZXROdW1iZXIgYXR0bnVtOwogCQkJ CURhdHVtCQlrZXk7CkBAIC01MzgsMjMgKzg0MSwxNiBAQCBnaW5WYWN1dW1F bnRyeVBhZ2UoR2luVmFjdXVtU3RhdGUgKmd2cywgQnVmZmVyIGJ1ZmZlciwg QmxvY2tOdW1iZXIgKnJvb3RzLCB1aW50MwogCQkJCQkgKi8KIAkJCQkJdG1w cGFnZSA9IFBhZ2VHZXRUZW1wUGFnZUNvcHkob3JpZ3BhZ2UpOwogCi0JCQkJ CWlmIChuZXdOID4gMCkKLQkJCQkJewotCQkJCQkJU2l6ZQkJcG9zID0gKChj aGFyICopIEdpbkdldFBvc3RpbmcoaXR1cCkpIC0gKChjaGFyICopIG9yaWdw YWdlKTsKLQotCQkJCQkJbWVtY3B5KHRtcHBhZ2UgKyBwb3MsIGNsZWFuZWQs IHNpemVvZihJdGVtUG9pbnRlckRhdGEpICogbmV3Tik7Ci0JCQkJCX0KLQot CQkJCQlwZnJlZShjbGVhbmVkKTsKLQogCQkJCQkvKiBzZXQgaXR1cCBwb2lu dGVyIHRvIG5ldyBwYWdlICovCiAJCQkJCWl0dXAgPSAoSW5kZXhUdXBsZSkg UGFnZUdldEl0ZW0odG1wcGFnZSwgUGFnZUdldEl0ZW1JZCh0bXBwYWdlLCBp KSk7CiAJCQkJfQogCiAJCQkJYXR0bnVtID0gZ2ludHVwbGVfZ2V0X2F0dHJu dW0oJmd2cy0+Z2luc3RhdGUsIGl0dXApOwogCQkJCWtleSA9IGdpbnR1cGxl X2dldF9rZXkoJmd2cy0+Z2luc3RhdGUsIGl0dXAsICZjYXRlZ29yeSk7CisJ CQkJLyogRklYTUUgKi8KIAkJCQlpdHVwID0gR2luRm9ybVR1cGxlKCZndnMt PmdpbnN0YXRlLCBhdHRudW0sIGtleSwgY2F0ZWdvcnksCi0JCQkJCQkJCQlH aW5HZXRQb3N0aW5nKGl0dXApLCBuZXdOLCB0cnVlKTsKKwkJCQkJCQkJCWNs ZWFuZWQsIGNsZWFuZWRTaXplLCBuZXdOLCB0cnVlKTsKKwkJCQlwZnJlZShj bGVhbmVkKTsKIAkJCQlQYWdlSW5kZXhUdXBsZURlbGV0ZSh0bXBwYWdlLCBp KTsKIAogCQkJCWlmIChQYWdlQWRkSXRlbSh0bXBwYWdlLCAoSXRlbSkgaXR1 cCwgSW5kZXhUdXBsZVNpemUoaXR1cCksIGksIGZhbHNlLCBmYWxzZSkgIT0g aSkKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2lueGxv Zy5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9naW54bG9nLmMKaW5kZXgg NGU0M2FlOS4uMTFjOWQ1ZSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNj ZXNzL2dpbi9naW54bG9nLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2dp bi9naW54bG9nLmMKQEAgLTc4LDcgKzc4LDcgQEAgc3RhdGljIHZvaWQKIGdp blJlZG9DcmVhdGVQVHJlZShYTG9nUmVjUHRyIGxzbiwgWExvZ1JlY29yZCAq cmVjb3JkKQogewogCWdpbnhsb2dDcmVhdGVQb3N0aW5nVHJlZSAqZGF0YSA9 IChnaW54bG9nQ3JlYXRlUG9zdGluZ1RyZWUgKikgWExvZ1JlY0dldERhdGEo cmVjb3JkKTsKLQlJdGVtUG9pbnRlckRhdGEgKml0ZW1zID0gKEl0ZW1Qb2lu dGVyRGF0YSAqKSAoWExvZ1JlY0dldERhdGEocmVjb3JkKSArIHNpemVvZihn aW54bG9nQ3JlYXRlUG9zdGluZ1RyZWUpKTsKKwlDb21wcmVzc2VkUG9zdGlu Z0xpc3QgcHRyOwogCUJ1ZmZlcgkJYnVmZmVyOwogCVBhZ2UJCXBhZ2U7CiAK QEAgLTg5LDIyICs4OSwzMCBAQCBnaW5SZWRvQ3JlYXRlUFRyZWUoWExvZ1Jl Y1B0ciBsc24sIFhMb2dSZWNvcmQgKnJlY29yZCkKIAlBc3NlcnQoQnVmZmVy SXNWYWxpZChidWZmZXIpKTsKIAlwYWdlID0gKFBhZ2UpIEJ1ZmZlckdldFBh Z2UoYnVmZmVyKTsKIAotCUdpbkluaXRCdWZmZXIoYnVmZmVyLCBHSU5fREFU QSB8IEdJTl9MRUFGKTsKLQltZW1jcHkoR2luRGF0YVBhZ2VHZXREYXRhKHBh Z2UpLCBpdGVtcywgc2l6ZW9mKEl0ZW1Qb2ludGVyRGF0YSkgKiBkYXRhLT5u aXRlbSk7Ci0JR2luUGFnZUdldE9wYXF1ZShwYWdlKS0+bWF4b2ZmID0gZGF0 YS0+bml0ZW07CisJR2luSW5pdEJ1ZmZlcihidWZmZXIsIEdJTl9EQVRBIHwg R0lOX0xFQUYgfCBHSU5fQ09NUFJFU1NFRCk7CisJKChQYWdlSGVhZGVyKSBw YWdlKS0+cGRfdXBwZXIgLT0gc2l6ZW9mKEdpbkRhdGFMZWFmSXRlbUluZGV4 KSAqIEdpbkRhdGFMZWFmSW5kZXhDb3VudDsKKworCXB0ciA9IFhMb2dSZWNH ZXREYXRhKHJlY29yZCkgKyBzaXplb2YoZ2lueGxvZ0NyZWF0ZVBvc3RpbmdU cmVlKTsKKworCS8qIFBsYWNlIHBhZ2UgZGF0YSAqLworCW1lbWNweShHaW5E YXRhTGVhZlBhZ2VHZXRQb3N0aW5nTGlzdChwYWdlKSwgcHRyLCBkYXRhLT5z aXplKTsKKworCUdpbkRhdGFMZWFmUGFnZVNldFBvc3RpbmdMaXN0U2l6ZShw YWdlLCBkYXRhLT5zaXplKTsKIAogCVBhZ2VTZXRMU04ocGFnZSwgbHNuKTsK IAorCXVwZGF0ZUl0ZW1JbmRleGVzKHBhZ2UpOworCiAJTWFya0J1ZmZlckRp cnR5KGJ1ZmZlcik7CiAJVW5sb2NrUmVsZWFzZUJ1ZmZlcihidWZmZXIpOwog fQogCiBzdGF0aWMgdm9pZAotZ2luUmVkb0luc2VydEVudHJ5KEJ1ZmZlciBi dWZmZXIsIE9mZnNldE51bWJlciBvZmZzZXQsIEJsb2NrTnVtYmVyIHJpZ2h0 Ymxrbm8sCi0JCQkJICAgdm9pZCAqcmRhdGEpCitnaW5SZWRvSW5zZXJ0RW50 cnkoQnVmZmVyIGJ1ZmZlciwgQmxvY2tOdW1iZXIgcmlnaHRibGtubywgdm9p ZCAqcmRhdGEpCiB7CiAJUGFnZQkJcGFnZSA9IEJ1ZmZlckdldFBhZ2UoYnVm ZmVyKTsKIAlnaW54bG9nSW5zZXJ0RW50cnkgKmRhdGEgPSAoZ2lueGxvZ0lu c2VydEVudHJ5ICopIHJkYXRhOworCU9mZnNldE51bWJlciBvZmZzZXQgPSBk YXRhLT5vZmZzZXQ7CiAJSW5kZXhUdXBsZQlpdHVwOwogCiAJaWYgKHJpZ2h0 Ymxrbm8gIT0gSW52YWxpZEJsb2NrTnVtYmVyKQpAQCAtMTM4LDMwICsxNDYs NTUgQEAgZ2luUmVkb0luc2VydEVudHJ5KEJ1ZmZlciBidWZmZXIsIE9mZnNl dE51bWJlciBvZmZzZXQsIEJsb2NrTnVtYmVyIHJpZ2h0Ymxrbm8sCiB9CiAK IHN0YXRpYyB2b2lkCi1naW5SZWRvSW5zZXJ0RGF0YShCdWZmZXIgYnVmZmVy LCBPZmZzZXROdW1iZXIgb2Zmc2V0LCBCbG9ja051bWJlciByaWdodGJsa25v LAotCQkJCSAgdm9pZCAqcmRhdGEpCitnaW5SZWRvSW5zZXJ0RGF0YShCdWZm ZXIgYnVmZmVyLCBCbG9ja051bWJlciByaWdodGJsa25vLCB2b2lkICpyZGF0 YSkKIHsKIAlQYWdlCQlwYWdlID0gQnVmZmVyR2V0UGFnZShidWZmZXIpOwog CiAJaWYgKEdpblBhZ2VJc0xlYWYocGFnZSkpCiAJewogCQlnaW54bG9nSW5z ZXJ0RGF0YUxlYWYgKmRhdGEgPSAoZ2lueGxvZ0luc2VydERhdGFMZWFmICop IHJkYXRhOwotCQlJdGVtUG9pbnRlckRhdGEgKml0ZW1zID0gZGF0YS0+aXRl bXM7Ci0JCU9mZnNldE51bWJlciBpOworCQlpbnQJCQlyZXN0bGVuOworCQlQ b2ludGVyCQlyZXN0UHRyOworCQlQb2ludGVyCQliZWdpblB0cjsKKwkJaW50 CQkJb2xkc2l6ZTsKKwkJaW50CQkJbmV3c2l6ZTsKKworCQlpZiAoIUdpblBh Z2VJc0NvbXByZXNzZWQocGFnZSkpCisJCXsKKwkJCS8qCisJCQkgKiBQYWdl IGNvbXByZXNzaW9uIG11c3Qgc3VjY2VlZCBzaW5jZSB3ZSBoYXZlIGFuIHhs b2cgcmVjb3JkLgorCQkJICovCisJCQlib29sIHJlc3VsdDsKKwkJCXJlc3Vs dCA9IGRhdGFDb21wcmVzc0xlYWZQYWdlKHBhZ2UpOworCQkJQXNzZXJ0KHJl c3VsdCk7CisJCX0KIAotCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bml0ZW07 IGkrKykKLQkJCUdpbkRhdGFQYWdlQWRkSXRlbVBvaW50ZXIocGFnZSwgJml0 ZW1zW2ldLCBvZmZzZXQgKyBpKTsKKwkJYmVnaW5QdHIgPSBHaW5EYXRhTGVh ZlBhZ2VHZXRQb3N0aW5nTGlzdChwYWdlKSArIGRhdGEtPmJlZ2luT2Zmc2V0 OworCQlyZXN0UHRyID0gR2luRGF0YUxlYWZQYWdlR2V0UG9zdGluZ0xpc3Qo cGFnZSkgKyBkYXRhLT5yZXN0T2Zmc2V0OworCQkvKiBTaGlmdCBleGlzdGlu ZyBpdGVtcyB0byBtYWtlIHJvb20gKi8KKwkJcmVzdGxlbiA9IEdpbkRhdGFM ZWFmUGFnZUdldFBvc3RpbmdMaXN0RW5kKHBhZ2UpIC0gcmVzdFB0cjsKKwkJ QXNzZXJ0KGRhdGEtPmJlZ2luT2Zmc2V0ICsgZGF0YS0+bmV3bGVuICsgcmVz dGxlbiAgPD0gKChQYWdlSGVhZGVyKSBwYWdlKS0+cGRfdXBwZXIpOworCQlB c3NlcnQoYmVnaW5QdHIgKyBkYXRhLT5uZXdsZW4gPj0gcmVzdFB0cik7CisJ CW1lbW1vdmUoYmVnaW5QdHIgKyBkYXRhLT5uZXdsZW4sIHJlc3RQdHIsIHJl c3RsZW4pOworCisJCS8qIEluc2VydCB0aGUgbmV3IChvciByZXBsYWNpbmcp IGRhdGEgKi8KKwkJbWVtY3B5KGJlZ2luUHRyLCBkYXRhLT5uZXdkYXRhLCBk YXRhLT5uZXdsZW4pOworCisJCW9sZHNpemUgPSBHaW5EYXRhTGVhZlBhZ2VH ZXRQb3N0aW5nTGlzdFNpemUocGFnZSk7CisJCW5ld3NpemUgPSAgZGF0YS0+ YmVnaW5PZmZzZXQgKyBkYXRhLT5uZXdsZW4gKyByZXN0bGVuOworCQlHaW5E YXRhTGVhZlBhZ2VTZXRQb3N0aW5nTGlzdFNpemUocGFnZSwgbmV3c2l6ZSk7 CisJCWluY3JVcGRhdGVJdGVtSW5kZXhlcyhwYWdlLCBkYXRhLT5yZXN0T2Zm c2V0LCBuZXdzaXplIC0gb2xkc2l6ZSk7CiAJfQogCWVsc2UKIAl7Ci0JCVBv c3RpbmdJdGVtICpwaXRlbSA9IChQb3N0aW5nSXRlbSAqKSByZGF0YTsKKwkJ Z2lueGxvZ0luc2VydERhdGFJbnRlcm5hbCAqZGF0YSA9IChnaW54bG9nSW5z ZXJ0RGF0YUludGVybmFsICopIHJkYXRhOwogCQlQb3N0aW5nSXRlbSAqb2xk cGl0ZW07CiAKIAkJLyogdXBkYXRlIGxpbmsgdG8gcmlnaHQgcGFnZSBhZnRl ciBzcGxpdCAqLwotCQlvbGRwaXRlbSA9IEdpbkRhdGFQYWdlR2V0UG9zdGlu Z0l0ZW0ocGFnZSwgb2Zmc2V0KTsKKwkJb2xkcGl0ZW0gPSBHaW5EYXRhUGFn ZUdldFBvc3RpbmdJdGVtKHBhZ2UsIGRhdGEtPm9mZnNldCk7CiAJCVBvc3Rp bmdJdGVtU2V0QmxvY2tOdW1iZXIob2xkcGl0ZW0sIHJpZ2h0Ymxrbm8pOwog Ci0JCUdpbkRhdGFQYWdlQWRkUG9zdGluZ0l0ZW0ocGFnZSwgcGl0ZW0sIG9m ZnNldCk7CisJCUdpbkRhdGFQYWdlQWRkUG9zdGluZ0l0ZW0ocGFnZSwgJmRh dGEtPm5ld2l0ZW0sIGRhdGEtPm9mZnNldCk7CiAJfQogfQogCkBAIC0yMTMs MTIgKzI0NiwxMiBAQCBnaW5SZWRvSW5zZXJ0KFhMb2dSZWNQdHIgbHNuLCBY TG9nUmVjb3JkICpyZWNvcmQpCiAJCWlmIChkYXRhLT5mbGFncyAmIEdJTl9J TlNFUlRfSVNEQVRBKQogCQl7CiAJCQlBc3NlcnQoR2luUGFnZUlzRGF0YShw YWdlKSk7Ci0JCQlnaW5SZWRvSW5zZXJ0RGF0YShidWZmZXIsIGRhdGEtPm9m ZnNldCwgcmlnaHRDaGlsZEJsa25vLCBwYXlsb2FkKTsKKwkJCWdpblJlZG9J bnNlcnREYXRhKGJ1ZmZlciwgcmlnaHRDaGlsZEJsa25vLCBwYXlsb2FkKTsK IAkJfQogCQllbHNlCiAJCXsKIAkJCUFzc2VydCghR2luUGFnZUlzRGF0YShw YWdlKSk7Ci0JCQlnaW5SZWRvSW5zZXJ0RW50cnkoYnVmZmVyLCBkYXRhLT5v ZmZzZXQsIHJpZ2h0Q2hpbGRCbGtubywgcGF5bG9hZCk7CisJCQlnaW5SZWRv SW5zZXJ0RW50cnkoYnVmZmVyLCByaWdodENoaWxkQmxrbm8sIHBheWxvYWQp OwogCQl9CiAKIAkJUGFnZVNldExTTihwYWdlLCBsc24pOwpAQCAtMjUzLDM4 ICsyODYsNDkgQEAgZ2luUmVkb1NwbGl0RW50cnkoUGFnZSBscGFnZSwgUGFn ZSBycGFnZSwgdm9pZCAqcmRhdGEpCiBzdGF0aWMgdm9pZAogZ2luUmVkb1Nw bGl0RGF0YShQYWdlIGxwYWdlLCBQYWdlIHJwYWdlLCB2b2lkICpyZGF0YSkK IHsKLQlnaW54bG9nU3BsaXREYXRhICpkYXRhID0gKGdpbnhsb2dTcGxpdERh dGEgKikgcmRhdGE7CiAJYm9vbAkJaXNsZWFmID0gR2luUGFnZUlzTGVhZihs cGFnZSk7Ci0JY2hhcgkgICAqcHRyID0gKGNoYXIgKikgcmRhdGEgKyBzaXpl b2YoZ2lueGxvZ1NwbGl0RGF0YSk7CiAJT2Zmc2V0TnVtYmVyIGk7CiAJSXRl bVBvaW50ZXIgYm91bmQ7CiAKIAlpZiAoaXNsZWFmKQogCXsKLQkJSXRlbVBv aW50ZXIgaXRlbXMgPSAoSXRlbVBvaW50ZXIpIHB0cjsKLQkJZm9yIChpID0g MDsgaSA8IGRhdGEtPnNlcGFyYXRvcjsgaSsrKQotCQkJR2luRGF0YVBhZ2VB ZGRJdGVtUG9pbnRlcihscGFnZSwgJml0ZW1zW2ldLCBJbnZhbGlkT2Zmc2V0 TnVtYmVyKTsKLQkJZm9yIChpID0gZGF0YS0+c2VwYXJhdG9yOyBpIDwgZGF0 YS0+bml0ZW07IGkrKykKLQkJCUdpbkRhdGFQYWdlQWRkSXRlbVBvaW50ZXIo cnBhZ2UsICZpdGVtc1tpXSwgSW52YWxpZE9mZnNldE51bWJlcik7CisJCWdp bnhsb2dTcGxpdERhdGFMZWFmICpkYXRhID0gKGdpbnhsb2dTcGxpdERhdGFM ZWFmICopIHJkYXRhOworCQljaGFyCSAgICpwdHIgPSAoY2hhciAqKSByZGF0 YSArIHNpemVvZihnaW54bG9nU3BsaXREYXRhTGVhZik7CisJCVBvaW50ZXIJ CQlscHRyLCBycHRyOworCQlTaXplCQkJbHNpemUsIHJzaXplOworCisJCSgo UGFnZUhlYWRlcikgbHBhZ2UpLT5wZF91cHBlciAtPSBzaXplb2YoR2luRGF0 YUxlYWZJdGVtSW5kZXgpICogR2luRGF0YUxlYWZJbmRleENvdW50OworCQko KFBhZ2VIZWFkZXIpIHJwYWdlKS0+cGRfdXBwZXIgLT0gc2l6ZW9mKEdpbkRh dGFMZWFmSXRlbUluZGV4KSAqIEdpbkRhdGFMZWFmSW5kZXhDb3VudDsKKwor CQlsc2l6ZSA9IGRhdGEtPnNlcGFyYXRvcjsKKwkJbHB0ciA9IHB0cjsKKwkJ cnNpemUgPSBkYXRhLT5uYnl0ZXMgLSBkYXRhLT5zZXBhcmF0b3I7CisJCXJw dHIgPSBwdHIgKyBsc2l6ZTsKKworCQlBc3NlcnQobHNpemUgPiAwICYmIGxz aXplIDwgR2luRGF0YUxlYWZNYXhQb3N0aW5nTGlzdFNpemUpOworCQlBc3Nl cnQocnNpemUgPiAwICYmIHJzaXplIDwgR2luRGF0YUxlYWZNYXhQb3N0aW5n TGlzdFNpemUpOworCisJCS8qIFBsYWNlIHBhZ2VzIGRhdGEgKi8KKwkJbWVt Y3B5KEdpbkRhdGFMZWFmUGFnZUdldFBvc3RpbmdMaXN0KGxwYWdlKSwgbHB0 ciwgbHNpemUpOworCQltZW1jcHkoR2luRGF0YUxlYWZQYWdlR2V0UG9zdGlu Z0xpc3QocnBhZ2UpLCBycHRyLCByc2l6ZSk7CisKKwkJR2luRGF0YUxlYWZQ YWdlU2V0UG9zdGluZ0xpc3RTaXplKGxwYWdlLCBsc2l6ZSk7CisJCUdpbkRh dGFMZWFmUGFnZVNldFBvc3RpbmdMaXN0U2l6ZShycGFnZSwgcnNpemUpOwor CQkqR2luRGF0YVBhZ2VHZXRSaWdodEJvdW5kKGxwYWdlKSA9IHVwZGF0ZUl0 ZW1JbmRleGVzKGxwYWdlKTsKKwkJdXBkYXRlSXRlbUluZGV4ZXMocnBhZ2Up OwogCX0KIAllbHNlCiAJewotCQlQb3N0aW5nSXRlbSAqaXRlbXMgPSAoUG9z dGluZ0l0ZW0gKikgcHRyOworCQlnaW54bG9nU3BsaXREYXRhSW50ZXJuYWwg KmRhdGEgPSAoZ2lueGxvZ1NwbGl0RGF0YUludGVybmFsICopIHJkYXRhOwor CQlQb3N0aW5nSXRlbSAqaXRlbXMgPSAoUG9zdGluZ0l0ZW0gKikgKChjaGFy ICopIHJkYXRhICsgc2l6ZW9mKGdpbnhsb2dTcGxpdERhdGFJbnRlcm5hbCkp OwogCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+c2VwYXJhdG9yOyBpKyspCiAJ CQlHaW5EYXRhUGFnZUFkZFBvc3RpbmdJdGVtKGxwYWdlLCAmaXRlbXNbaV0s IEludmFsaWRPZmZzZXROdW1iZXIpOwogCQlmb3IgKGkgPSBkYXRhLT5zZXBh cmF0b3I7IGkgPCBkYXRhLT5uaXRlbTsgaSsrKQogCQkJR2luRGF0YVBhZ2VB ZGRQb3N0aW5nSXRlbShycGFnZSwgJml0ZW1zW2ldLCBJbnZhbGlkT2Zmc2V0 TnVtYmVyKTsKLQl9CiAKLQkvKiBzZXQgdXAgcmlnaHQga2V5ICovCi0JYm91 bmQgPSBHaW5EYXRhUGFnZUdldFJpZ2h0Qm91bmQobHBhZ2UpOwotCWlmIChp c2xlYWYpCi0JCSpib3VuZCA9ICpHaW5EYXRhUGFnZUdldEl0ZW1Qb2ludGVy KGxwYWdlLCBHaW5QYWdlR2V0T3BhcXVlKGxwYWdlKS0+bWF4b2ZmKTsKLQll bHNlCisJCS8qIHNldCB1cCByaWdodCBrZXkgKi8KIAkJKmJvdW5kID0gR2lu RGF0YVBhZ2VHZXRQb3N0aW5nSXRlbShscGFnZSwgR2luUGFnZUdldE9wYXF1 ZShscGFnZSktPm1heG9mZiktPmtleTsKLQotCWJvdW5kID0gR2luRGF0YVBh Z2VHZXRSaWdodEJvdW5kKHJwYWdlKTsKLQkqYm91bmQgPSBkYXRhLT5yaWdo dGJvdW5kOworCX0KIH0KIAogc3RhdGljIHZvaWQKQEAgLTMxNyw5ICszNjEs MTAgQEAgZ2luUmVkb1NwbGl0KFhMb2dSZWNQdHIgbHNuLCBYTG9nUmVjb3Jk ICpyZWNvcmQpCiAKIAlpZiAoaXNMZWFmKQogCQlmbGFncyB8PSBHSU5fTEVB RjsKLQogCWlmIChpc0RhdGEpCiAJCWZsYWdzIHw9IEdJTl9EQVRBOworCWlm IChpc0xlYWYgJiYgaXNEYXRhKQorCQlmbGFncyB8PSBHSU5fQ09NUFJFU1NF RDsKIAogCWxidWZmZXIgPSBYTG9nUmVhZEJ1ZmZlcihkYXRhLT5ub2RlLCBk YXRhLT5sYmxrbm8sIHRydWUpOwogCUFzc2VydChCdWZmZXJJc1ZhbGlkKGxi dWZmZXIpKTsKQEAgLTM1Miw3ICszOTcsNyBAQCBnaW5SZWRvU3BsaXQoWExv Z1JlY1B0ciBsc24sIFhMb2dSZWNvcmQgKnJlY29yZCkKIAkJQnVmZmVyCQly b290QnVmID0gWExvZ1JlYWRCdWZmZXIoZGF0YS0+bm9kZSwgcm9vdEJsa25v LCB0cnVlKTsKIAkJUGFnZQkJcm9vdFBhZ2UgPSBCdWZmZXJHZXRQYWdlKHJv b3RCdWYpOwogCi0JCUdpbkluaXRCdWZmZXIocm9vdEJ1ZiwgZmxhZ3MgJiB+ R0lOX0xFQUYpOworCQlHaW5Jbml0QnVmZmVyKHJvb3RCdWYsIGZsYWdzICYg fkdJTl9MRUFGICYgfkdJTl9DT01QUkVTU0VEKTsKIAogCQlpZiAoaXNEYXRh KQogCQl7CkBAIC00MDYsMTAgKzQ1MSwzOCBAQCBnaW5SZWRvVmFjdXVtUGFn ZShYTG9nUmVjUHRyIGxzbiwgWExvZ1JlY29yZCAqcmVjb3JkKQogCXsKIAkJ aWYgKEdpblBhZ2VJc0RhdGEocGFnZSkpCiAJCXsKLQkJCW1lbWNweShHaW5E YXRhUGFnZUdldERhdGEocGFnZSksCi0JCQkJICAgWExvZ1JlY0dldERhdGEo cmVjb3JkKSArIHNpemVvZihnaW54bG9nVmFjdXVtUGFnZSksCi0JCQkJICAg ZGF0YS0+bml0ZW0gKiBHaW5TaXplT2ZEYXRhUGFnZUl0ZW0ocGFnZSkpOwot CQkJR2luUGFnZUdldE9wYXF1ZShwYWdlKS0+bWF4b2ZmID0gZGF0YS0+bml0 ZW07CisJCQlpZiAoR2luUGFnZUlzTGVhZihwYWdlKSkKKwkJCXsKKwkJCQlQ b2ludGVyIHB0cjsKKworCQkJCXB0ciA9IFhMb2dSZWNHZXREYXRhKHJlY29y ZCkgKyBzaXplb2YoZ2lueGxvZ1ZhY3V1bVBhZ2UpOworCisJCQkJLyogVGhl cmUgc2hvdWxkIGJlIGVub3VnaCBvZiBzcGFjZSBzaW5jZSB3ZSBoYXZlIGEg eGxvZyByZWNvcmQgKi8KKwkJCQlBc3NlcnQoZGF0YS0+bml0ZW0gPD0gR2lu RGF0YUxlYWZNYXhQb3N0aW5nTGlzdFNpemUpOworCisJCQkJaWYgKCFHaW5Q YWdlSXNDb21wcmVzc2VkKHBhZ2UpKQorCQkJCXsKKwkJCQkJLyoKKwkJCQkJ ICogU2V0IHBhZ2UgZm9ybWF0IGlzIGNvbXByZXNzZWQgYW5kIHJlc2VydmUg c3BhY2UgZm9yCisJCQkJCSAqIGl0ZW0gaW5kZXhlcworCQkJCQkgKi8KKwkJ CQkJR2luUGFnZVNldENvbXByZXNzZWQocGFnZSk7CisJCQkJCSgoUGFnZUhl YWRlcikgcGFnZSktPnBkX3VwcGVyIC09CisJCQkJCQlzaXplb2YoR2luRGF0 YUxlYWZJdGVtSW5kZXgpICogR2luRGF0YUxlYWZJbmRleENvdW50OworCQkJ CX0KKworCQkJCW1lbWNweShHaW5EYXRhTGVhZlBhZ2VHZXRQb3N0aW5nTGlz dChwYWdlKSwgcHRyLCBkYXRhLT5uaXRlbSk7CisKKwkJCQlHaW5EYXRhTGVh ZlBhZ2VTZXRQb3N0aW5nTGlzdFNpemUocGFnZSwgZGF0YS0+bml0ZW0pOwor CQkJCXVwZGF0ZUl0ZW1JbmRleGVzKHBhZ2UpOworCQkJfQorCQkJZWxzZQor CQkJeworCQkJCW1lbWNweShHaW5EYXRhUGFnZUdldFBvc3RpbmdJdGVtKHBh Z2UsIDEpLAorCQkJCQkgICBYTG9nUmVjR2V0RGF0YShyZWNvcmQpICsgc2l6 ZW9mKGdpbnhsb2dWYWN1dW1QYWdlKSwKKwkJCQkJICAgZGF0YS0+bml0ZW0g KiBzaXplb2YoSXRlbVBvaW50ZXJEYXRhKSk7CisJCQkJR2luUGFnZUdldE9w YXF1ZShwYWdlKS0+bWF4b2ZmID0gZGF0YS0+bml0ZW07CisJCQl9CiAJCX0K IAkJZWxzZQogCQl7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3Mv cm1ncmRlc2MvZ2luZGVzYy5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3JtZ3Jk ZXNjL2dpbmRlc2MuYwppbmRleCA2NjNmZDA5Li5iZDI1ZTg3IDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC9hY2Nlc3Mvcm1ncmRlc2MvZ2luZGVzYy5jCisr KyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9ybWdyZGVzYy9naW5kZXNjLmMKQEAg LTQ3LDggKzQ3LDcgQEAgZ2luX2Rlc2MoU3RyaW5nSW5mbyBidWYsIHVpbnQ4 IHhsX2luZm8sIGNoYXIgKnJlYykKIAogCQkJCWFwcGVuZFN0cmluZ0luZm9T dHJpbmcoYnVmLCAiSW5zZXJ0IGl0ZW0sICIpOwogCQkJCWRlc2Nfbm9kZShi dWYsIHhscmVjLT5ub2RlLCB4bHJlYy0+Ymxrbm8pOwotCQkJCWFwcGVuZFN0 cmluZ0luZm8oYnVmLCAiIG9mZnNldDogJXUgaXNkYXRhOiAlYyBpc2xlYWY6 ICVjIiwKLQkJCQkJCQkJIHhscmVjLT5vZmZzZXQsCisJCQkJYXBwZW5kU3Ry aW5nSW5mbyhidWYsICIgaXNkYXRhOiAlYyBpc2xlYWY6ICVjIiwKIAkJCQkJ CQkJICh4bHJlYy0+ZmxhZ3MgJiBHSU5fSU5TRVJUX0lTREFUQSkgPyAnVCcg OiAnRicsCiAJCQkJCQkJCSAoeGxyZWMtPmZsYWdzICYgR0lOX0lOU0VSVF9J U0xFQUYpID8gJ1QnIDogJ0YnKTsKIAkJCQlpZiAoISh4bHJlYy0+ZmxhZ3Mg JiBHSU5fSU5TRVJUX0lTTEVBRikpCkBAIC02NywxMyArNjYsMjEgQEAgZ2lu X2Rlc2MoU3RyaW5nSW5mbyBidWYsIHVpbnQ4IHhsX2luZm8sIGNoYXIgKnJl YykKIAkJCQkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIgaXNkZWxldGU6ICVj IiwKIAkJCQkJCQkJCSAoKChnaW54bG9nSW5zZXJ0RW50cnkgKikgcGF5bG9h ZCktPmlzRGVsZXRlKSA/ICdUJyA6ICdGJyk7CiAJCQkJZWxzZSBpZiAoeGxy ZWMtPmZsYWdzICYgR0lOX0lOU0VSVF9JU0xFQUYpCi0JCQkJCWFwcGVuZFN0 cmluZ0luZm8oYnVmLCAiIG5pdGVtOiAldSIsCi0JCQkJCQkJCQkgKCgoZ2lu eGxvZ0luc2VydERhdGFMZWFmICopIHBheWxvYWQpLT5uaXRlbSkpOworCQkJ CXsKKwkJCQkJZ2lueGxvZ0luc2VydERhdGFMZWFmICpkYXRhID0gKGdpbnhs b2dJbnNlcnREYXRhTGVhZiAqKSByZWM7CisJCQkJCWFwcGVuZFN0cmluZ0lu Zm8oYnVmLCAiIGJlZ2luICV1LCBsZW4gJXUsIHJlc3RPZmZzZXQgJXUiLAor CQkJCQkJCQkJIGRhdGEtPmJlZ2luT2Zmc2V0LAorCQkJCQkJCQkJIGRhdGEt Pm5ld2xlbiwKKwkJCQkJCQkJCSBkYXRhLT5yZXN0T2Zmc2V0KTsKKwkJCQl9 CiAJCQkJZWxzZQorCQkJCXsKKwkJCQkJZ2lueGxvZ0luc2VydERhdGFJbnRl cm5hbCAqaW5zZXJ0RGF0YSA9IChnaW54bG9nSW5zZXJ0RGF0YUludGVybmFs ICopIHBheWxvYWQ7CiAJCQkJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiIHBp dGVtOiAldS0ldS8ldSIsCi0JCQkJCQkJCQkgUG9zdGluZ0l0ZW1HZXRCbG9j a051bWJlcigoUG9zdGluZ0l0ZW0gKikgcGF5bG9hZCksCi0JCQkJCQkJCQkg SXRlbVBvaW50ZXJHZXRCbG9ja051bWJlcigmKChQb3N0aW5nSXRlbSAqKSBw YXlsb2FkKS0+a2V5KSwKLQkJCQkJCQkJCSBJdGVtUG9pbnRlckdldE9mZnNl dE51bWJlcigmKChQb3N0aW5nSXRlbSAqKSBwYXlsb2FkKS0+a2V5KSk7CisJ CQkJCQkJCQkgUG9zdGluZ0l0ZW1HZXRCbG9ja051bWJlcigmaW5zZXJ0RGF0 YS0+bmV3aXRlbSksCisJCQkJCQkJCQkgSXRlbVBvaW50ZXJHZXRCbG9ja051 bWJlcigmaW5zZXJ0RGF0YS0+bmV3aXRlbS5rZXkpLAorCQkJCQkJCQkJIEl0 ZW1Qb2ludGVyR2V0T2Zmc2V0TnVtYmVyKCZpbnNlcnREYXRhLT5uZXdpdGVt LmtleSkpOworCQkJCX0KIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFhMT0df R0lOX1NQTElUOgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvYWNjZXNzL2dp bl9wcml2YXRlLmggYi9zcmMvaW5jbHVkZS9hY2Nlc3MvZ2luX3ByaXZhdGUu aAppbmRleCA3MTRjOGNhLi41ODUzYWEyIDEwMDY0NAotLS0gYS9zcmMvaW5j bHVkZS9hY2Nlc3MvZ2luX3ByaXZhdGUuaAorKysgYi9zcmMvaW5jbHVkZS9h Y2Nlc3MvZ2luX3ByaXZhdGUuaApAQCAtMzIsMTEgKzMyLDggQEAKIHR5cGVk ZWYgc3RydWN0IEdpblBhZ2VPcGFxdWVEYXRhCiB7CiAJQmxvY2tOdW1iZXIg cmlnaHRsaW5rOwkJLyogbmV4dCBwYWdlIGlmIGFueSAqLwotCU9mZnNldE51 bWJlciBtYXhvZmY7CQkvKiBudW1iZXIgZW50cmllcyBvbiBHSU5fREFUQSBw YWdlOiBudW1iZXIgb2YKLQkJCQkJCQkJICogaGVhcCBJdGVtUG9pbnRlcnMg b24gR0lOX0RBVEF8R0lOX0xFQUYgcGFnZQotCQkJCQkJCQkgKiBvciBudW1i ZXIgb2YgUG9zdGluZ0l0ZW1zIG9uIEdJTl9EQVRBICYKLQkJCQkJCQkJICog fkdJTl9MRUFGIHBhZ2UuIE9uIEdJTl9MSVNUIHBhZ2UsIG51bWJlciBvZgot CQkJCQkJCQkgKiBoZWFwIHR1cGxlcy4gKi8KKwlPZmZzZXROdW1iZXIgbWF4 b2ZmOwkJLyogbnVtYmVyIG9mIFBvc3RpbmdJdGVtcyBvbiBHSU5fREFUQSAm IH5HSU5fTEVBRiBwYWdlLgorCQkJCQkJCQkgKiBPbiBHSU5fTElTVCBwYWdl LCBudW1iZXIgb2YgaGVhcCB0dXBsZXMuICovCiAJdWludDE2CQlmbGFnczsJ CQkvKiBzZWUgYml0IGRlZmluaXRpb25zIGJlbG93ICovCiB9IEdpblBhZ2VP cGFxdWVEYXRhOwogCkBAIC00OSw2ICs0Niw3IEBAIHR5cGVkZWYgR2luUGFn ZU9wYXF1ZURhdGEgKkdpblBhZ2VPcGFxdWU7CiAjZGVmaW5lIEdJTl9MSVNU CQkgICgxIDw8IDQpCiAjZGVmaW5lIEdJTl9MSVNUX0ZVTExST1cgICgxIDw8 IDUpCQkvKiBtYWtlcyBzZW5zZSBvbmx5IG9uIEdJTl9MSVNUIHBhZ2UgKi8K ICNkZWZpbmUgR0lOX0lOQ09NUExFVEVfU1BMSVQgKDEgPDwgNikJLyogcGFn ZSB3YXMgc3BsaXQsIGJ1dCBwYXJlbnQgbm90IHVwZGF0ZWQgKi8KKyNkZWZp bmUgR0lOX0NPTVBSRVNTRUQJICAoMSA8PCA3KQogCiAvKiBQYWdlIG51bWJl cnMgb2YgZml4ZWQtbG9jYXRpb24gcGFnZXMgKi8KICNkZWZpbmUgR0lOX01F VEFQQUdFX0JMS05PCSgwKQpAQCAtMTE2LDYgKzExNCw4IEBAIHR5cGVkZWYg c3RydWN0IEdpbk1ldGFQYWdlRGF0YQogI2RlZmluZSBHaW5QYWdlU2V0TGlz dChwYWdlKSAgICggR2luUGFnZUdldE9wYXF1ZShwYWdlKS0+ZmxhZ3MgfD0g R0lOX0xJU1QgKQogI2RlZmluZSBHaW5QYWdlSGFzRnVsbFJvdyhwYWdlKSAg ICAoIEdpblBhZ2VHZXRPcGFxdWUocGFnZSktPmZsYWdzICYgR0lOX0xJU1Rf RlVMTFJPVyApCiAjZGVmaW5lIEdpblBhZ2VTZXRGdWxsUm93KHBhZ2UpICAg KCBHaW5QYWdlR2V0T3BhcXVlKHBhZ2UpLT5mbGFncyB8PSBHSU5fTElTVF9G VUxMUk9XICkKKyNkZWZpbmUgR2luUGFnZUlzQ29tcHJlc3NlZChwYWdlKSAg ICAoIEdpblBhZ2VHZXRPcGFxdWUocGFnZSktPmZsYWdzICYgR0lOX0NPTVBS RVNTRUQgKQorI2RlZmluZSBHaW5QYWdlU2V0Q29tcHJlc3NlZChwYWdlKSAg ICggR2luUGFnZUdldE9wYXF1ZShwYWdlKS0+ZmxhZ3MgfD0gR0lOX0NPTVBS RVNTRUQgKQogCiAjZGVmaW5lIEdpblBhZ2VJc0RlbGV0ZWQocGFnZSkgKCBH aW5QYWdlR2V0T3BhcXVlKHBhZ2UpLT5mbGFncyAmIEdJTl9ERUxFVEVEKQog I2RlZmluZSBHaW5QYWdlU2V0RGVsZXRlZChwYWdlKSAgICAoIEdpblBhZ2VH ZXRPcGFxdWUocGFnZSktPmZsYWdzIHw9IEdJTl9ERUxFVEVEKQpAQCAtMjEz LDEzICsyMTMsMTUgQEAgdHlwZWRlZiBzaWduZWQgY2hhciBHaW5OdWxsQ2F0 ZWdvcnk7CiAjZGVmaW5lIEdpblNldFBvc3RpbmdUcmVlKGl0dXAsIGJsa25v KQkoIEdpblNldE5Qb3N0aW5nKChpdHVwKSxHSU5fVFJFRV9QT1NUSU5HKSwg SXRlbVBvaW50ZXJTZXRCbG9ja051bWJlcigmKGl0dXApLT50X3RpZCwgYmxr bm8pICkKICNkZWZpbmUgR2luR2V0UG9zdGluZ1RyZWUoaXR1cCkgR2luSXRl bVBvaW50ZXJHZXRCbG9ja051bWJlcigmKGl0dXApLT50X3RpZCkKIAotI2Rl ZmluZSBHaW5HZXRQb3N0aW5nT2Zmc2V0KGl0dXApCUdpbkl0ZW1Qb2ludGVy R2V0QmxvY2tOdW1iZXIoJihpdHVwKS0+dF90aWQpCi0jZGVmaW5lIEdpblNl dFBvc3RpbmdPZmZzZXQoaXR1cCxuKSBJdGVtUG9pbnRlclNldEJsb2NrTnVt YmVyKCYoaXR1cCktPnRfdGlkLG4pCi0jZGVmaW5lIEdpbkdldFBvc3Rpbmco aXR1cCkJCQkoKEl0ZW1Qb2ludGVyKSAoKGNoYXIqKShpdHVwKSArIEdpbkdl dFBvc3RpbmdPZmZzZXQoaXR1cCkpKQorI2RlZmluZSBHSU5fSVRVUF9DT01Q UkVTU0VECQkoMSA8PCAzMSkKKyNkZWZpbmUgR2luR2V0UG9zdGluZ09mZnNl dChpdHVwKQkoR2luSXRlbVBvaW50ZXJHZXRCbG9ja051bWJlcigmKGl0dXAp LT50X3RpZCkgJiAofkdJTl9JVFVQX0NPTVBSRVNTRUQpKQorI2RlZmluZSBH aW5TZXRQb3N0aW5nT2Zmc2V0KGl0dXAsbikgSXRlbVBvaW50ZXJTZXRCbG9j a051bWJlcigmKGl0dXApLT50X3RpZCwobil8R0lOX0lUVVBfQ09NUFJFU1NF RCkKKyNkZWZpbmUgR2luR2V0UG9zdGluZyhpdHVwKQkJCSgoUG9pbnRlcikg KChjaGFyKikoaXR1cCkgKyBHaW5HZXRQb3N0aW5nT2Zmc2V0KGl0dXApKSkK KyNkZWZpbmUgR2luSXR1cElzQ29tcHJlc3NlZChpdHVwKQkoR2luSXRlbVBv aW50ZXJHZXRCbG9ja051bWJlcigmKGl0dXApLT50X3RpZCkgJiBHSU5fSVRV UF9DT01QUkVTU0VEKQogCiAjZGVmaW5lIEdpbk1heEl0ZW1TaXplIFwKIAlN QVhBTElHTl9ET1dOKCgoQkxDS1NaIC0gU2l6ZU9mUGFnZUhlYWRlckRhdGEg LSBcCi0JCU1BWEFMSUdOKHNpemVvZihHaW5QYWdlT3BhcXVlRGF0YSkpKSAv IDMgLSBzaXplb2YoSXRlbUlkRGF0YSkpKQorCQlNQVhBTElHTihzaXplb2Yo R2luUGFnZU9wYXF1ZURhdGEpKSkgLyA2IC0gc2l6ZW9mKEl0ZW1JZERhdGEp KSkKIAogLyoKICAqIEFjY2VzcyBtYWNyb3MgZm9yIG5vbi1sZWFmIGVudHJ5 IHR1cGxlcwpAQCAtMjMwLDIzICsyMzIsNjAgQEAgdHlwZWRlZiBzaWduZWQg Y2hhciBHaW5OdWxsQ2F0ZWdvcnk7CiAKIC8qCiAgKiBEYXRhIChwb3N0aW5n IHRyZWUpIHBhZ2VzCisgKgorICogUG9zdGluZyB0cmVlIHBhZ2VzIGRvbid0 IHN0b3JlIHJlZ3VsYXIgdHVwbGVzLiBOb24tbGVhZiBwYWdlcyBjb250YWlu CisgKiBQb3N0aW5nSXRlbXMsIHdoaWNoIGFyZSBwYWlycyBvZiBJdGVtUG9p bnRlcnMgYW5kIGNoaWxkIGJsb2NrIG51bWJlcnMsCisgKiBhbmQgbGVhZiBw YWdlcyBjb250YWluIGEgY29tcHJlc3NlZCBwb3N0aW5nIGxpc3QsIGFuZCBh IHNtYWxsICJsZWFmLWl0ZW0iCisgKiBpbmRleCB0byBhbGxvdyBxdWljayBz ZWVraW5nIGludG8gdGhlIGNvbXByZXNzZWQgcG9zdGluZyBsaXN0LgorICoK KyAqIFRoZSBjb21wcmVzc2VkIHBvc3RpbmcgbGlzdCBpcyBzdG9yZWQgYWZ0 ZXIgdGhlIHJlZ3VsYXIgcGFnZSBoZWFkZXIuCisgKiBBbHRob3VnaCB3ZSBk b24ndCBzdG9yZSByZWd1bGFyIHR1cGxlcywgcGRfbG93ZXIgaXMgdXNlZCB0 byBpbmRpY2F0ZQorICogdGhlIGVuZCBvZiB0aGUgcG9zdGluZyBsaXN0LiBB ZnRlciB0aGF0LCBmcmVlIHNwYWNlIGZvbGxvd3MuIEF0IHRoZQorICogZW5k IG9mIHRoZSBwYWdlIChiZWZvcmUgc3BlY2lhbCBzcGFjZSksIHRoZSBsZWFm LWl0ZW0gaW5kZXggaXMgc3RvcmVkLgorICogcGRfdXBwZXIgcG9pbnRzIHRv IHRoYXQgbG9jYXRpb24uIFRoaXMgbGF5b3V0IGlzIGNvbXBhdGlibGUgd2l0 aCB0aGUKKyAqICJzdGFuZGFyZCIgaGVhcCBhbmQgaW5kZXggcGFnZSBsYXlv dXQgZGVzY3JpYmVkIGluIGJ1ZnBhZ2UuaCwgc28gdGhhdAorICogd2UgY2Fu IGUuZyBzZXQgYnVmZmVyX3N0ZCB3aGVuIHdyaXRpbmcgV0FMIHJlY29yZHM6 CisgKgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tLS0tKworICogfCBQYWdlSGVhZGVyRGF0YSB8IHJpZ2h0 IGJvdW5kIHwgY29tcHJlc3NlZCAuLi4JICB8CisgKiArLS0tLS0tLS0tLS0t LS0tLSstLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiB8 ICBwb3N0aW5nIGxpc3QgLi4uIHwJCQkJCQkJICB8CisgKiArLS0tLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisg KiB8CQkJCSAgIF4gcGRfbG93ZXIJCQkJCSAgfAorICogfAkJCQkJCQkJCQkJ CSAgfAorICogfAkJICB2IHBkX3VwcGVyCQkJCQkJCSAgfAorICogKy0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0t KworICogfAkJICB8CWxlYWYtaXRlbSBpbmRleCAuLi4gfCAic3BlY2lhbCBz cGFjZSIgfAorICogKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0tKworICoJCQkJCQkJCQleIHBkX3NwZWNpYWwK KyAqCisgKiBJbiB0aGUgc3BlY2lhbCBzcGFjZSBpcyB0aGUgR2luUGFnZU9w YXF1ZSBzdHJ1Y3QuCiAgKi8KKyNkZWZpbmUgR2luRGF0YUxlYWZQYWdlR2V0 UG9zdGluZ0xpc3QocGFnZSkgXAorCShQYWdlR2V0Q29udGVudHMocGFnZSkg KyBzaXplb2YoSXRlbVBvaW50ZXJEYXRhKSkKKyNkZWZpbmUgR2luRGF0YUxl YWZQYWdlR2V0UG9zdGluZ0xpc3RFbmQocGFnZSkgXAorCShwYWdlICsgKChQ YWdlSGVhZGVyKSBwYWdlKS0+cGRfbG93ZXIpCisjZGVmaW5lIEdpbkRhdGFM ZWFmUGFnZUdldFBvc3RpbmdMaXN0U2l6ZShwYWdlKSBcCisJKCgoUGFnZUhl YWRlcikgcGFnZSktPnBkX2xvd2VyIC0gTUFYQUxJR04oU2l6ZU9mUGFnZUhl YWRlckRhdGEpIC0gc2l6ZW9mKEl0ZW1Qb2ludGVyRGF0YSkpCisjZGVmaW5l IEdpbkRhdGFMZWFmUGFnZVNldFBvc3RpbmdMaXN0U2l6ZShwYWdlLCBzaXpl KSBcCisJKCgoUGFnZUhlYWRlcikgcGFnZSktPnBkX2xvd2VyID0gKHNpemUp ICsgTUFYQUxJR04oU2l6ZU9mUGFnZUhlYWRlckRhdGEpICsgc2l6ZW9mKEl0 ZW1Qb2ludGVyRGF0YSkpCisKKyNkZWZpbmUgR2luRGF0YUxlYWZQYWdlR2V0 RnJlZVNwYWNlKHBhZ2UpIFBhZ2VHZXRFeGFjdEZyZWVTcGFjZShwYWdlKQor CiAjZGVmaW5lIEdpbkRhdGFQYWdlR2V0UmlnaHRCb3VuZChwYWdlKQkoKEl0 ZW1Qb2ludGVyKSBQYWdlR2V0Q29udGVudHMocGFnZSkpCiAjZGVmaW5lIEdp bkRhdGFQYWdlR2V0RGF0YShwYWdlKQlcCiAJKFBhZ2VHZXRDb250ZW50cyhw YWdlKSArIE1BWEFMSUdOKHNpemVvZihJdGVtUG9pbnRlckRhdGEpKSkKIC8q IG5vbi1sZWFmIHBhZ2VzIGNvbnRhaW4gUG9zdGluZ0l0ZW1zICovCiAjZGVm aW5lIEdpbkRhdGFQYWdlR2V0UG9zdGluZ0l0ZW0ocGFnZSwgaSkJXAogCSgo UG9zdGluZ0l0ZW0gKikgKEdpbkRhdGFQYWdlR2V0RGF0YShwYWdlKSArICgo aSktMSkgKiBzaXplb2YoUG9zdGluZ0l0ZW0pKSkKLS8qIGxlYWYgcGFnZXMg Y29udGFpbiBJdGVtUG9pbnRlcnMgKi8KLSNkZWZpbmUgR2luRGF0YVBhZ2VH ZXRJdGVtUG9pbnRlcihwYWdlLCBpKQlcCisvKiBvbGQgdW5jb21wcmVzc2Vk IGxlYWYgcGFnZXMgY29udGFpbiBJdGVtUG9pbnRlcnMgKi8KKyNkZWZpbmUg R2luRGF0YVBhZ2VHZXRJdGVtUG9pbnRlcihwYWdlLCBpKSAgXAogCSgoSXRl bVBvaW50ZXIpIChHaW5EYXRhUGFnZUdldERhdGEocGFnZSkgKyAoKGkpLTEp ICogc2l6ZW9mKEl0ZW1Qb2ludGVyRGF0YSkpKQotI2RlZmluZSBHaW5TaXpl T2ZEYXRhUGFnZUl0ZW0ocGFnZSkgXAotCShHaW5QYWdlSXNMZWFmKHBhZ2Up ID8gc2l6ZW9mKEl0ZW1Qb2ludGVyRGF0YSkgOiBzaXplb2YoUG9zdGluZ0l0 ZW0pKQogCi0jZGVmaW5lIEdpbkRhdGFQYWdlR2V0RnJlZVNwYWNlKHBhZ2Up CVwKKyNkZWZpbmUgR2luTm9uTGVhZkRhdGFQYWdlR2V0RnJlZVNwYWNlKHBh Z2UpCVwKIAkoQkxDS1NaIC0gTUFYQUxJR04oU2l6ZU9mUGFnZUhlYWRlckRh dGEpIFwKIAkgLSBNQVhBTElHTihzaXplb2YoSXRlbVBvaW50ZXJEYXRhKSkg XAotCSAtIEdpblBhZ2VHZXRPcGFxdWUocGFnZSktPm1heG9mZiAqIEdpblNp emVPZkRhdGFQYWdlSXRlbShwYWdlKSBcCisJIC0gR2luUGFnZUdldE9wYXF1 ZShwYWdlKS0+bWF4b2ZmICogc2l6ZW9mKFBvc3RpbmdJdGVtKQlcCiAJIC0g TUFYQUxJR04oc2l6ZW9mKEdpblBhZ2VPcGFxdWVEYXRhKSkpCiAKICNkZWZp bmUgR2luTWF4TGVhZkRhdGFJdGVtcyBcCkBAIC0yNTUsNiArMjk0LDMzIEBA IHR5cGVkZWYgc2lnbmVkIGNoYXIgR2luTnVsbENhdGVnb3J5OwogCSAgTUFY QUxJR04oc2l6ZW9mKEdpblBhZ2VPcGFxdWVEYXRhKSkpIFwKIAkgLyBzaXpl b2YoSXRlbVBvaW50ZXJEYXRhKSkKIAorI2RlZmluZSBNQVhfQ09NUFJFU1NF RF9JVEVNX1BPSU5URVJfU0laRSA4CisKKy8qCisgKiBFYWNoIGl0ZW0gaW5k ZXggY2xhaW1zIHRoYXQgYXQgb2Zmc2V0ICdwYWdlT2Zmc2V0JyBwcmV2aW91 c2x5IHJlYWQgVElEIHdhcworICogaXB0ci4KKyAqLwordHlwZWRlZiBzdHJ1 Y3QKK3sKKwlJdGVtUG9pbnRlckRhdGEgaXB0cjsKKwl1aW50MTYgcGFnZU9m ZnNldDsKK30gR2luRGF0YUxlYWZJdGVtSW5kZXg7CisKKyNkZWZpbmUgR2lu RGF0YUxlYWZJbmRleENvdW50IDMyCisKKyNkZWZpbmUgR2luRGF0YUxlYWZN YXhQb3N0aW5nTGlzdFNpemUJXAorCShCTENLU1ogLSBNQVhBTElHTihTaXpl T2ZQYWdlSGVhZGVyRGF0YSkgXAorCSAtIHNpemVvZihJdGVtUG9pbnRlckRh dGEpIFwKKwkgLSBNQVhBTElHTihzaXplb2YoR2luUGFnZU9wYXF1ZURhdGEp KSBcCisJIC0gTUFYQUxJR04oc2l6ZW9mKEdpbkRhdGFMZWFmSXRlbUluZGV4 KSAqIEdpbkRhdGFMZWFmSW5kZXhDb3VudCkpCisKKyNkZWZpbmUgR2luRGF0 YVBhZ2VGcmVlU3BhY2VQcmUocGFnZSwgcHRyKSBcCisJKCgoUGFnZUhlYWRl cikgcGFnZSktPnBkX3VwcGVyIC0gKChwdHIpIC0gKHBhZ2UpKSkKKworI2Rl ZmluZSBHaW5QYWdlR2V0SW5kZXhlcyhwYWdlKSBcCisJKChHaW5EYXRhTGVh Zkl0ZW1JbmRleCAqKShwYWdlICsgKChQYWdlSGVhZGVyKSBwYWdlKS0+cGRf dXBwZXIpKQorCisKIC8qCiAgKiBMaXN0IHBhZ2VzCiAgKi8KQEAgLTMyOCwx OCArMzk0LDIxIEBAIHR5cGVkZWYgc3RydWN0IGdpbnhsb2dDcmVhdGVQb3N0 aW5nVHJlZQogewogCVJlbEZpbGVOb2RlIG5vZGU7CiAJQmxvY2tOdW1iZXIg Ymxrbm87Ci0JdWludDMyCQluaXRlbTsKLQkvKiBmb2xsb3dzIGxpc3Qgb2Yg aGVhcCdzIEl0ZW1Qb2ludGVyICovCisJdWludDMyCQlzaXplOworCS8qIEEg Y29tcHJlc3NlZCBwb3N0aW5nIGxpc3QgZm9sbG93cyAqLwogfSBnaW54bG9n Q3JlYXRlUG9zdGluZ1RyZWU7CiAKICNkZWZpbmUgWExPR19HSU5fSU5TRVJU ICAweDIwCiAKLXR5cGVkZWYgc3RydWN0IGdpbnhsb2dJbnNlcnQKKy8qCisg KiBUaGUgZm9ybWF0IG9mIHRoZSBpbnNlcnRpb24gcmVjb3JkIHZhcmllcyBk ZXBlbmRpbmcgb24gdGhlIHBhZ2UgdHlwZS4KKyAqIGdpbnhsb2dJbnNlcnRD b21tb24gaXMgdGhlIGNvbW1vbiBwYXJ0IGJldHdlZW4gYWxsIHZhcmlhbnRz LgorICovCit0eXBlZGVmIHN0cnVjdAogewogCVJlbEZpbGVOb2RlIG5vZGU7 CiAJQmxvY2tOdW1iZXIgYmxrbm87CiAJdWludDE2CQlmbGFnczsJCS8qIEdJ Tl9TUExJVF9JU0xFQUYgYW5kL29yIEdJTl9TUExJVF9JU0RBVEEgKi8KLQlP ZmZzZXROdW1iZXIgb2Zmc2V0OwogCiAJLyoKIAkgKiBGT0xMT1dTOgpAQCAt MzU4LDE3ICs0MjcsMjYgQEAgdHlwZWRlZiBzdHJ1Y3QgZ2lueGxvZ0luc2Vy dAogCiB0eXBlZGVmIHN0cnVjdAogeworCU9mZnNldE51bWJlciBvZmZzZXQ7 CiAJYm9vbAkJaXNEZWxldGU7CiAJSW5kZXhUdXBsZURhdGEgdHVwbGU7CS8q IHZhcmlhYmxlIGxlbmd0aCAqLwogfSBnaW54bG9nSW5zZXJ0RW50cnk7CiAK IHR5cGVkZWYgc3RydWN0CiB7Ci0JT2Zmc2V0TnVtYmVyIG5pdGVtOwotCUl0 ZW1Qb2ludGVyRGF0YSBpdGVtc1sxXTsgLyogdmFyaWFibGUgbGVuZ3RoICov CisJdWludDE2CQliZWdpbk9mZnNldDsKKwl1aW50MTYJCW5ld2xlbjsKKwl1 aW50MTYJCXJlc3RPZmZzZXQ7CisKKwkvKiB2YXJpYWJsZSBsZW5ndGggbmV3 IHBvcnRpb24gb2YgdGhlIGNvbXByZXNzZWQgcG9zdGluZyBsaXN0IGZvbGxv d3MgKi8KKwljaGFyCQluZXdkYXRhWzFdOwogfSBnaW54bG9nSW5zZXJ0RGF0 YUxlYWY7CiAKLS8qIEluIGFuIGluc2VydCB0byBhbiBpbnRlcm5hbCBkYXRh IHBhZ2UsIHRoZSBwYXlsb2FkIGlzIGEgUG9zdGluZ0l0ZW0gKi8KK3R5cGVk ZWYgc3RydWN0Cit7CisJT2Zmc2V0TnVtYmVyIG9mZnNldDsKKwlQb3N0aW5n SXRlbSBuZXdpdGVtOworfSBnaW54bG9nSW5zZXJ0RGF0YUludGVybmFsOwog CiAKICNkZWZpbmUgWExPR19HSU5fU1BMSVQJMHgzMApAQCAtNDAzLDEyICs0 ODEsMjIgQEAgdHlwZWRlZiBzdHJ1Y3QKIAogdHlwZWRlZiBzdHJ1Y3QKIHsK Kwl1aW50MTYJCXNlcGFyYXRvcjsKKwl1aW50MTYJCW5ieXRlczsKKwlJdGVt UG9pbnRlckRhdGEgcmlnaHRib3VuZDsKKworCS8qIEZPTExPV1M6IG5ldyBj b21wcmVzc2VkIHBvc3RpbmcgbGlzdCB0byBpbnNlcnQgKi8KKwljaGFyCQlu ZXdkYXRhWzFdOworfSBnaW54bG9nU3BsaXREYXRhTGVhZjsKKwordHlwZWRl ZiBzdHJ1Y3QKK3sKIAlPZmZzZXROdW1iZXIgc2VwYXJhdG9yOwogCU9mZnNl dE51bWJlciBuaXRlbTsKIAlJdGVtUG9pbnRlckRhdGEgcmlnaHRib3VuZDsK IAotCS8qIEZPTExPV1M6IGFycmF5IG9mIEl0ZW1Qb2ludGVycyAoZm9yIGxl YWYpIG9yIFBvc3RpbmdJdGVtcyAobm9uLWxlYWYpICovCi19IGdpbnhsb2dT cGxpdERhdGE7CisJLyogRk9MTE9XUzogYXJyYXkgb2YgUG9zdGluZ0l0ZW1z ICovCit9IGdpbnhsb2dTcGxpdERhdGFJbnRlcm5hbDsKIAogI2RlZmluZSBY TE9HX0dJTl9WQUNVVU1fUEFHRQkweDQwCiAKQEAgLTUwNSw3ICs1OTMsOCBA QCB0eXBlZGVmIHN0cnVjdCBHaW5CdHJlZVN0YWNrCiB7CiAJQmxvY2tOdW1i ZXIgYmxrbm87CiAJQnVmZmVyCQlidWZmZXI7Ci0JT2Zmc2V0TnVtYmVyIG9m ZjsKKwlPZmZzZXROdW1iZXIgb2ZmLCBwYWdlT2Zmc2V0OworCUl0ZW1Qb2lu dGVyRGF0YSBpcHRyOwogCS8qIHByZWRpY3ROdW1iZXIgY29udGFpbnMgcHJl ZGljdGVkIG51bWJlciBvZiBwYWdlcyBvbiBjdXJyZW50IGxldmVsICovCiAJ dWludDMyCQlwcmVkaWN0TnVtYmVyOwogCXN0cnVjdCBHaW5CdHJlZVN0YWNr ICpwYXJlbnQ7CkBAIC01MjMsOCArNjEyLDggQEAgdHlwZWRlZiBzdHJ1Y3Qg R2luQnRyZWVEYXRhCiAKIAkvKiBpbnNlcnQgbWV0aG9kcyAqLwogCU9mZnNl dE51bWJlciAoKmZpbmRDaGlsZFB0cikgKEdpbkJ0cmVlLCBQYWdlLCBCbG9j a051bWJlciwgT2Zmc2V0TnVtYmVyKTsKLQlib29sCQkoKnBsYWNlVG9QYWdl KSAoR2luQnRyZWUsIEJ1ZmZlciwgT2Zmc2V0TnVtYmVyLCB2b2lkICosIEJs b2NrTnVtYmVyLCBYTG9nUmVjRGF0YSAqKik7Ci0JUGFnZQkJKCpzcGxpdFBh Z2UpIChHaW5CdHJlZSwgQnVmZmVyLCBCdWZmZXIsIE9mZnNldE51bWJlciwg dm9pZCAqLCBCbG9ja051bWJlciwgWExvZ1JlY0RhdGEgKiopOworCWJvb2wJ CSgqcGxhY2VUb1BhZ2UpIChHaW5CdHJlZSwgQnVmZmVyLCBHaW5CdHJlZVN0 YWNrICosIHZvaWQgKiwgQmxvY2tOdW1iZXIsIFhMb2dSZWNEYXRhICoqKTsK KwlQYWdlCQkoKnNwbGl0UGFnZSkgKEdpbkJ0cmVlLCBCdWZmZXIsIEJ1ZmZl ciwgR2luQnRyZWVTdGFjayAqc3RhY2ssIHZvaWQgKiwgQmxvY2tOdW1iZXIs IFhMb2dSZWNEYXRhICoqKTsKIAl2b2lkCSAgICooKnByZXBhcmVEb3dubGlu aykgKEdpbkJ0cmVlLCBCdWZmZXIpOwogCXZvaWQJCSgqZmlsbFJvb3QpIChH aW5CdHJlZSwgUGFnZSwgQmxvY2tOdW1iZXIsIFBhZ2UsIEJsb2NrTnVtYmVy LCBQYWdlKTsKIApAQCAtNTc1LDE2ICs2NjQsMTcgQEAgZXh0ZXJuIHZvaWQg Z2luSW5zZXJ0VmFsdWUoR2luQnRyZWUgYnRyZWUsIEdpbkJ0cmVlU3RhY2sg KnN0YWNrLAogCQkJICAgdm9pZCAqaW5zZXJ0ZGF0YSwgR2luU3RhdHNEYXRh ICpidWlsZFN0YXRzKTsKIAogLyogZ2luZW50cnlwYWdlLmMgKi8KLWV4dGVy biBJbmRleFR1cGxlIEdpbkZvcm1UdXBsZShHaW5TdGF0ZSAqZ2luc3RhdGUs Ci0JCQkgT2Zmc2V0TnVtYmVyIGF0dG51bSwgRGF0dW0ga2V5LCBHaW5OdWxs Q2F0ZWdvcnkgY2F0ZWdvcnksCi0JCQkgSXRlbVBvaW50ZXJEYXRhICppcGQs IHVpbnQzMiBuaXBkLCBib29sIGVycm9yVG9vQmlnKTsKLWV4dGVybiB2b2lk IEdpblNob3J0ZW5UdXBsZShJbmRleFR1cGxlIGl0dXAsIHVpbnQzMiBuaXBk KTsKIGV4dGVybiB2b2lkIGdpblByZXBhcmVFbnRyeVNjYW4oR2luQnRyZWUg YnRyZWUsIE9mZnNldE51bWJlciBhdHRudW0sCiAJCQkJCURhdHVtIGtleSwg R2luTnVsbENhdGVnb3J5IGNhdGVnb3J5LAogCQkJCQlHaW5TdGF0ZSAqZ2lu c3RhdGUpOwogZXh0ZXJuIHZvaWQgZ2luRW50cnlGaWxsUm9vdChHaW5CdHJl ZSBidHJlZSwgUGFnZSByb290LCBCbG9ja051bWJlciBsYmxrbm8sIFBhZ2Ug bHBhZ2UsIEJsb2NrTnVtYmVyIHJibGtubywgUGFnZSBycGFnZSk7CitleHRl cm4gdm9pZCBnaW5SZWFkVHVwbGUoR2luU3RhdGUgKmdpbnN0YXRlLCBPZmZz ZXROdW1iZXIgYXR0bnVtLAorCUluZGV4VHVwbGUgaXR1cCwgSXRlbVBvaW50 ZXJEYXRhICppcGQpOworZXh0ZXJuIEl0ZW1Qb2ludGVyRGF0YSB1cGRhdGVJ dGVtSW5kZXhlcyhQYWdlIHBhZ2UpOworZXh0ZXJuIHZvaWQgaW5jclVwZGF0 ZUl0ZW1JbmRleGVzKFBhZ2UgcGFnZSwgaW50IG9sZE9mZnNldCwgaW50IG5l d09mZnNldCk7CiAKIC8qIGdpbmRhdGFwYWdlLmMgKi8KK2V4dGVybiBib29s IGRhdGFDb21wcmVzc0xlYWZQYWdlKFBhZ2UgcGFnZSk7CiBleHRlcm4gQmxv Y2tOdW1iZXIgY3JlYXRlUG9zdGluZ1RyZWUoUmVsYXRpb24gaW5kZXgsCiAJ CQkJICBJdGVtUG9pbnRlckRhdGEgKml0ZW1zLCB1aW50MzIgbml0ZW1zLAog CQkJCSAgR2luU3RhdHNEYXRhICpidWlsZFN0YXRzKTsKQEAgLTc3MCwxMCAr ODYwLDc3IEBAIGV4dGVybiB2b2lkIGdpbkluc2VydENsZWFudXAoR2luU3Rh dGUgKmdpbnN0YXRlLAogCQkJCSBib29sIHZhY19kZWxheSwgSW5kZXhCdWxr RGVsZXRlUmVzdWx0ICpzdGF0cyk7CiAKIC8qIGdpbnBvc3RpbmdsaXN0LmMg Ki8KK2V4dGVybiBjaGFyICpnaW5EYXRhUGFnZUxlYWZXcml0ZUl0ZW1Qb2lu dGVyKGNoYXIgKnB0ciwgSXRlbVBvaW50ZXIgaXB0ciwgSXRlbVBvaW50ZXIg cHJldik7CitleHRlcm4gaW50IGdpbkRhdGFQYWdlTGVhZkdldEl0ZW1Qb2lu dGVyU2l6ZShJdGVtUG9pbnRlciBpcHRyLCBJdGVtUG9pbnRlciBwcmV2KTsK IGV4dGVybiB1aW50MzIgZ2luTWVyZ2VJdGVtUG9pbnRlcnMoSXRlbVBvaW50 ZXJEYXRhICpkc3QsCiAJCQkJCSBJdGVtUG9pbnRlckRhdGEgKmEsIHVpbnQz MiBuYSwKIAkJCQkJIEl0ZW1Qb2ludGVyRGF0YSAqYiwgdWludDMyIG5iKTsK IAordHlwZWRlZiBjaGFyICpDb21wcmVzc2VkUG9zdGluZ0xpc3Q7CisKKy8q CisgKiBGdW5jdGlvbiBmb3IgcmVhZGluZyBwYWNrZWQgSXRlbVBvaW50ZXJz LiBVc2VkIGluIHZhcmlvdXMgLmMgZmlsZXMgYW5kCisgKiBoYXZlIHRvIGJl IGlubGluZSBmb3IgYmVpbmcgZmFzdC4gV2hlbiBQR19VU0VfSU5MSU5FIGlz IG5vdCBkZWZpbmUKKyAqIHdlIGhhdmUgb25seSBkZWNsYXJhdGlvbiBpbiBo ZWFkZXIsIGJ1dCBmdW5jdGlvbiBpbnNlbGYgaW4gZ2lucG9zdGluZ2xpc3Qu Yy4KKyAqCisgKiBSZWFkIG5leHQgaXRlbSBwb2ludGVyIGZyb20gbGVhZiBk YXRhIHBhZ2UuIFJlcGxhY2VzIGN1cnJlbnQgaXRlbSBwb2ludGVyCisgKiB3 aXRoIHRoZSBuZXh0IG9uZS4gWmVybyBpdGVtIHBvaW50ZXIgc2hvdWxkIGJl IHBhc3NlZCBpbiBvcmRlciB0byByZWFkIHRoZQorICogZmlyc3QgaXRlbSBw b2ludGVyLgorICovCisjaWZkZWYgUEdfVVNFX0lOTElORQorc3RhdGljIGlu bGluZSBDb21wcmVzc2VkUG9zdGluZ0xpc3QKK2dpbkRhdGFQYWdlTGVhZlJl YWRJdGVtUG9pbnRlcihDb21wcmVzc2VkUG9zdGluZ0xpc3QgcHRyLCBJdGVt UG9pbnRlciBpcHRyKQoreworCXVpbnQzMgkJYmxvY2tOdW1iZXJJbmNyOwor CXVpbnQxNgkJb2Zmc2V0OworCWludAkJCWk7CisJdWludDgJCXY7CisJSXRl bVBvaW50ZXJEYXRhIHByZXYgPSAqaXB0cjsKKworCWkgPSAwOworCWJsb2Nr TnVtYmVySW5jciA9IDA7CisJZG8KKwl7CisJCXYgPSAqcHRyOworCQlwdHIr KzsKKwkJYmxvY2tOdW1iZXJJbmNyIHw9ICh1aW50MzIpICh2ICYgKH5ISUdI QklUKSkgPDwgaTsKKwkJQXNzZXJ0KGkgPCAyOCB8fCAoKGkgPT0gMjgpICYm ICgodiAmICh+SElHSEJJVCkpIDwgKDEgPDwgNCkpKSk7CisJCWkgKz0gNzsK Kwl9CisJd2hpbGUgKElTX0hJR0hCSVRfU0VUKHYpKTsKKworCUFzc2VydCgo dWludDY0KWlwdHItPmlwX2Jsa2lkLmJpX2xvICsgKCh1aW50NjQpaXB0ci0+ aXBfYmxraWQuYmlfaGkgPDwgMTYpICsKKwkJCSh1aW50NjQpYmxvY2tOdW1i ZXJJbmNyIDwgKCh1aW50NjQpMSA8PCAzMikpOworCisJYmxvY2tOdW1iZXJJ bmNyICs9IGlwdHItPmlwX2Jsa2lkLmJpX2xvICsgKGlwdHItPmlwX2Jsa2lk LmJpX2hpIDw8IDE2KTsKKworCWlwdHItPmlwX2Jsa2lkLmJpX2xvID0gYmxv Y2tOdW1iZXJJbmNyICYgMHhGRkZGOworCWlwdHItPmlwX2Jsa2lkLmJpX2hp ID0gKGJsb2NrTnVtYmVySW5jciA+PiAxNikgJiAweEZGRkY7CisKKwlpID0g MDsKKwlvZmZzZXQgPSAwOworCWRvCisJeworCQl2ID0gKnB0cjsKKwkJcHRy Kys7CisJCW9mZnNldCB8PSAodWludDE2KSAodiAmICh+SElHSEJJVCkpIDw8 IGk7CisJCUFzc2VydChpIDwgMTQgfHwgKChpID09IDE0KSAmJiAoKHYgJiAo fkhJR0hCSVQpKSA8ICgxIDw8IDIpKSkpOworCQlpICs9IDc7CisJfSB3aGls ZShJU19ISUdIQklUX1NFVCh2KSk7CisKKwlBc3NlcnQoT2Zmc2V0TnVtYmVy SXNWYWxpZChvZmZzZXQpKTsKKworCWlwdHItPmlwX3Bvc2lkID0gb2Zmc2V0 OworCisJQXNzZXJ0KGJsb2NrTnVtYmVySW5jciA+IEJsb2NrSWRHZXRCbG9j a051bWJlcigmcHJldi5pcF9ibGtpZCkgfHwKKwkJICAgb2Zmc2V0ID4gcHJl di5pcF9wb3NpZCk7CisKKwlyZXR1cm4gcHRyOworfQorI2Vsc2UKK0NvbXBy ZXNzZWRQb3N0aW5nTGlzdCBnaW5EYXRhUGFnZUxlYWZSZWFkSXRlbVBvaW50 ZXIoQ29tcHJlc3NlZFBvc3RpbmdMaXN0IHB0ciwKKwkJCQkJCQkJCQkJCQkJ CUl0ZW1Qb2ludGVyIGlwdHIpOworI2VuZGlmICAgLyogUEdfVVNFX0lOTElO RSAqLwogCiAvKgogICogTWVyZ2luZyB0aGUgcmVzdWx0cyBvZiBzZXZlcmFs IGdpbiBzY2FucyBjb21wYXJlcyBpdGVtIHBvaW50ZXJzIGEgbG90LAo= --------------050406050509080408030909 Content-Type: text/plain Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers --------------050406050509080408030909--