Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tITqJ-00Eazt-0C for pgsql-hackers@arkaria.postgresql.org; Tue, 03 Dec 2024 14:25:36 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1tITqG-00AGji-2Y for pgsql-hackers@arkaria.postgresql.org; Tue, 03 Dec 2024 14:25:33 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tITqE-00AGja-Up for pgsql-hackers@lists.postgresql.org; Tue, 03 Dec 2024 14:25:32 +0000 Received: from meesny.iki.fi ([195.140.195.201]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tITq3-000pzt-8d for pgsql-hackers@postgresql.org; Tue, 03 Dec 2024 14:25:30 +0000 Received: from [192.168.1.110] (dsl-hkibng22-50ddb7-241.dhcp.inet.fi [80.221.183.241]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: hlinnaka) by meesny.iki.fi (Postfix) with ESMTPSA id 4Y2jbt2R7xzyWc; Tue, 3 Dec 2024 16:25:14 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=meesny; t=1733235915; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=mN66M6jm7eubg89fNrVdzUNT03LfWBEJwRXrLYakqxY=; b=NO9qraRTpQHvUcW5l3xxOIq69TsSKpyvcjzC8LnioUxQWTF0WijJmayldeA2TA0SnsIjIP jTtIg8LFOsh0/sz/McccXck3JtDPWX5M7gqWI962agoKmRSv6NxXYVHv1pM5MT1jXLLKRD IKywOPxNeNTWVzhLobZZbgP/AhhL8jg= ARC-Seal: i=1; s=meesny; d=iki.fi; t=1733235915; a=rsa-sha256; cv=none; b=m9d1MdIpno5aVYIzF7rAAl/8UeayiSHVlTgVTpVLJgBY3v6NeztOv1W7X6tc1GIxlVcWtJ 2thlLhpw0PmwgagTPwEDFKfDvtwDTiBM5u3ABJ8Brg+YTlqBEs+9eDApyTDJty/P8+N+PQ WCXDWTS2/UiT1zcWTCJxUVWz1d5eeP0= ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=hlinnaka smtp.mailfrom=hlinnaka@iki.fi ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=meesny; t=1733235915; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=mN66M6jm7eubg89fNrVdzUNT03LfWBEJwRXrLYakqxY=; b=zOVN8YBmf5ifGawxMhAfED7mngzVKB/Pr06yIQo3ewkvuPbUuPF2euJPARnNo/EgjUtyMY BdaastTLnGKRTp2ahbWyAKdGYuAL+9VIhdTRgMzqUU+n4dKjhXBPKiuCQ6gSsmfS6ugBGM 8X/pQQFBHcrGtgBf56ztkS8l0qvKKyU= Content-Type: multipart/mixed; boundary="------------6V2bsblsMdY4BnmlS1v5weLR" Message-ID: <718d1788-b058-40e6-bc37-8f15612b5646@iki.fi> Date: Tue, 3 Dec 2024 16:25:13 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: CSN snapshots in hot standby To: John Naylor Cc: Andres Freund , "Andrey M. Borodin" , Kirill Reshke , pgsql-hackers References: <08da26cc-95ef-4c0e-9573-8b930f80ce27@iki.fi> <53C9CD5A-4403-4FF0-9F00-8B8A00F922A7@yandex-team.ru> <7cd97248-fd04-4fb2-9f7f-096c1d7660e8@iki.fi> Content-Language: en-US From: Heikki Linnakangas In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------6V2bsblsMdY4BnmlS1v5weLR Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 20/11/2024 15:33, John Naylor wrote: > The tree is only as tall as need be to store the highest non-zero > byte. On a newly initialized cluster, the current txid is small. The > first two test cases here will result in a tree with height of 2. The > last one will have a height of 3, and its runtime looks a bit higher, > although that could be just noise or touching more cache lines. It > might be worth it to try a test run while forcing the upper byte of > the keys to be non-zero (something like "key | (1<<30), so that the > tree always has a height of 4. That would match real-world conditions > more closely. If need be, there are a couple things we can do to > optimize node dispatch and touch fewer cache lines. Good point. In some quick testing with the 'few-xacts' test, the difference between the worst case and best case is about 10%. That can be avoided very easily: instead of using the xid as the key, use (xmax - xid). That way, the highest key used is the distance between the snapshot's xmin and xmax rather than the absolute xid values. >> I added two tests to the test suite: >> master patched >> insert-all-different-xids: 0.00027 0.00019 s / iteration >> insert-all-different-subxids: 0.00023 0.00020 s / iteration > >> The point of these new tests is to test the scenario where the cache >> doesn't help and just adds overhead, because each XID is looked up only >> once. Seems to be fine. Surprisingly good actually; I'll do some more >> profiling on that to understand why it's even faster than 'master'. > > These tests use a sequential scan. For things like primary key > lookups, I wonder if the overhead of creating and destroying the > tree's memory contexts for the (not used again) cache would be > noticeable. If so, it wouldn't be too difficult to teach radix tree to > create the larger contexts lazily. I played with that a little, but it doesn't make much difference. It is measurable when you look at the profile with 'perf': XidInMVCCSnapshot() takes about 4% of CPU time in the worst case, where you perform a very simple SeqScan over a table with just one row, and you perform only one visibility check in each scan. I could squeeze that down to around 3% by allocating the contexts lazily. But that's not significant in the grand scheme of things. Might still be worth doing, but it's not a blocker for this work, it can be discussed separately. I did find one weird thing that makes a big difference: I originally used AllocSetContextCreate(..., ALLOCSET_DEFAULT_SIZES) for the radix tree's memory context. With that, XidInMVCCSnapshot() takes about 19% of the CPU time in that test. When I changed that to ALLOCSET_SMALL_SIZES, it falls down to the 4% figure. And weird enough, in both cases the time seems to be spent in the malloc() call from SlabContextCreate(), not AllocSetContextCreate(). I think doing this particular mix of large and small allocations with malloc() somehow poisons its free list or something. So this is probably heavily dependent on the malloc() implementation. In any case, ALLOCSET_SMALL_SIZES is clearly a better choice here, even without that effect. One way to eliminate all that would be to start with a tiny cache with e.g. 4 elements with linear probing, and switch to the radix tree only when that fills up. But it doesn't seem worth the extra code right now. Here's a new version with the those small changes: - use xmax - xid as the cache key - use ALLOCSET_SMALL_SIZES for the radix tree's memory context Thanks for looking into this! -- Heikki Linnakangas Neon (https://neon.tech) --------------6V2bsblsMdY4BnmlS1v5weLR Content-Type: text/x-patch; charset=UTF-8; name="v5-0001-XXX-add-perf-test.patch" Content-Disposition: attachment; filename="v5-0001-XXX-add-perf-test.patch" Content-Transfer-Encoding: base64 RnJvbSBhZmQ2MzNmNDk4ZWQ5ODZkYTZjYWRhZThhMGM5ZGQ2NTc1Mzk5ZWY3IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBIZWlra2kgTGlubmFrYW5nYXMgPGhlaWtraS5saW5u YWthbmdhc0Bpa2kuZmk+CkRhdGU6IE1vbiwgMjEgT2N0IDIwMjQgMTQ6MDc6MzggKzAzMDAK U3ViamVjdDogW1BBVENIIHY1IDEvNV0gWFhYOiBhZGQgcGVyZiB0ZXN0CgpUaGlzIGlzIG5v dCBpbnRlbmRlZCB0byBiZSBtZXJnZWQuIEJ1dCBpdCdzIGJlZW4gdXNlZnVsIHRvIGhhdmUg dGhpcwppbiB0aGUgdHJlZSBmb3Igc29tZSBxdWljayBwZXJmIHRlc3RpbmcgZHVyaW5nIGRl dmVsb3BtZW50LgoKVG8gcnVuIGl0LCBJJ3ZlIHVzZWQ6CgooY2QgYnVpbGQtcmVsZWFzZSAm JiBuaW5qYSAmJiAgcm0gLXJmIHRtcF9pbnN0YWxsICYmIG1lc29uIHRlc3QgLS1zdWl0ZSBz ZXR1cCAtLXN1aXRlIHRlc3RfbWlzYzsgZ3JlcCBURVNUIHRlc3RydW4vdGVzdF9taXNjLzAw MF9jc25fcGVyZi9sb2cvcmVncmVzc19sb2dfMDAwX2Nzbl9wZXJmICkKCkl0IHJ1bnMgdGhl IG90aGVyIHRlc3RfbWlzYyB0ZXN0cyBjb25jdXJyZW50bHksIGJ1dCB0aGV5IGZpbmlzaCBh IGxvdApmYXN0ZXIgc28gdGhleSBkb24ndCBhZmZlY3QgdGhlIHJlc3VsdHMgbXVjaC4KLS0t CiBzcmMvdGVzdC9tb2R1bGVzL3Rlc3RfbWlzYy9tZXNvbi5idWlsZCAgICAgICB8ICAgMSAr CiBzcmMvdGVzdC9tb2R1bGVzL3Rlc3RfbWlzYy90LzAwMF9jc25fcGVyZi5wbCB8IDMzNyAr KysrKysrKysrKysrKysrKysrCiAyIGZpbGVzIGNoYW5nZWQsIDMzOCBpbnNlcnRpb25zKCsp CiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X21pc2MvdC8wMDBf Y3NuX3BlcmYucGwKCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfbWlzYy9t ZXNvbi5idWlsZCBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9taXNjL21lc29uLmJ1aWxkCmlu ZGV4IDI4M2ZmYTc1MWEuLmU1NWU4MGFmNTQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L21vZHVs ZXMvdGVzdF9taXNjL21lc29uLmJ1aWxkCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9t aXNjL21lc29uLmJ1aWxkCkBAIC05LDYgKzksNyBAQCB0ZXN0cyArPSB7CiAgICAgICAgJ2Vu YWJsZV9pbmplY3Rpb25fcG9pbnRzJzogZ2V0X29wdGlvbignaW5qZWN0aW9uX3BvaW50cycp ID8gJ3llcycgOiAnbm8nLAogICAgIH0sCiAgICAgJ3Rlc3RzJzogWworICAgICAgJ3QvMDAw X2Nzbl9wZXJmLnBsJywKICAgICAgICd0LzAwMV9jb25zdHJhaW50X3ZhbGlkYXRpb24ucGwn LAogICAgICAgJ3QvMDAyX3RhYmxlc3BhY2UucGwnLAogICAgICAgJ3QvMDAzX2NoZWNrX2d1 Yy5wbCcsCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfbWlzYy90LzAwMF9j c25fcGVyZi5wbCBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9taXNjL3QvMDAwX2Nzbl9wZXJm LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAuLjM5MTU4NzhhNDAK LS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfbWlzYy90LzAwMF9j c25fcGVyZi5wbApAQCAtMCwwICsxLDMzNyBAQAorCisjIENvcHlyaWdodCAoYykgMjAyMS0y MDI0LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorCisjIFZlcmlmeSB0 aGF0IEFMVEVSIFRBQkxFIG9wdGltaXplcyBjZXJ0YWluIG9wZXJhdGlvbnMgYXMgZXhwZWN0 ZWQKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5ncyBGQVRBTCA9PiAnYWxsJzsKK3VzZSBQ b3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyOwordXNlIFBvc3RncmVTUUw6OlRlc3Q6OlV0aWxz OwordXNlIFRlc3Q6Ok1vcmU7Cit1c2UgVGltZTo6SGlSZXMgcXcodGltZSk7CisKK215ICRk dXJhdGlvbiA9IDE1OyAjIHNlY29uZHMKK215ICRtaW5pdGVyYXRpb25zID0gMzsKKworIyBJ bml0aWFsaXplIGEgdGVzdCBjbHVzdGVyCitteSAkcHJpbWFyeSA9IFBvc3RncmVTUUw6OlRl c3Q6OkNsdXN0ZXItPm5ldygncHJpbWFyeScpOworJHByaW1hcnktPmluaXQoKTsKKyMgVHVy biBtZXNzYWdlIGxldmVsIHVwIHRvIERFQlVHMSBzbyB0aGF0IHdlIGdldCB0aGUgbWVzc2Fn ZXMgd2Ugd2FudCB0byBzZWUKKyRwcmltYXJ5LT5hcHBlbmRfY29uZigncG9zdGdyZXNxbC5j b25mJywgJ21heF93YWxfc2VuZGVycyA9IDUnKTsKKyRwcmltYXJ5LT5hcHBlbmRfY29uZign cG9zdGdyZXNxbC5jb25mJywgJ3dhbF9sZXZlbD1yZXBsaWNhJyk7CiskcHJpbWFyeS0+YXBw ZW5kX2NvbmYoJ3Bvc3RncmVzcWwuY29uZicsICdtYXhfY29ubmVjdGlvbnMgPSAxMDA1Jyk7 CiskcHJpbWFyeS0+c3RhcnQ7CiskcHJpbWFyeS0+YmFja3VwKCdia3AnKTsKKworbXkgJHJl cGxpY2EgPSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyLT5uZXcoJ3JlcGxpY2EnKTsKKyRy ZXBsaWNhLT5pbml0X2Zyb21fYmFja3VwKCRwcmltYXJ5LCAnYmtwJywgaGFzX3N0cmVhbWlu ZyA9PiAxKTsKKyRyZXBsaWNhLT5hcHBlbmRfY29uZigncG9zdGdyZXNxbC5jb25mJywgInNo YXJlZF9idWZmZXJzPScxIEdCJyIpOworJHJlcGxpY2EtPnN0YXJ0OworCitzdWIgd2FpdF9j YXRjaHVwCit7CisJbXkgKCRwcmltYXJ5LCAkcmVwbGljYSkgPSBAXzsKKwkKKwlteSAkcHJp bWFyeV9sc24gPQorCSAgJHByaW1hcnktPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAiU0VMRUNU IHBnX2N1cnJlbnRfd2FsX2xzbigpIik7CisJbXkgJGNhdWdodHVwX3F1ZXJ5ID0KKwkgICJT RUxFQ1QgJyRwcmltYXJ5X2xzbic6OnBnX2xzbiA8PSBwZ19sYXN0X3dhbF9yZXBsYXlfbHNu KCkiOworCSRyZXBsaWNhLT5wb2xsX3F1ZXJ5X3VudGlsKCdwb3N0Z3JlcycsICRjYXVnaHR1 cF9xdWVyeSkKKwkgIG9yIGRpZSAiVGltZWQgb3V0IHdoaWxlIHdhaXRpbmcgZm9yIHN0YW5k YnkgdG8gY2F0Y2ggdXAiOworfQorCitzdWIgcmVwZWF0X2FuZF90aW1lX3NxbAoreworICAJ bXkgKCRuYW1lLCAkbm9kZSwgJHNxbCkgPSBAXzsKKworCW15ICRzZXNzaW9uID0gICRub2Rl LT5iYWNrZ3JvdW5kX3BzcWwoJ3Bvc3RncmVzJywgb25fZXJyb3JfZGllID0+IDEpOworCSRz ZXNzaW9uLT5xdWVyeV9zYWZlKCJTRVQgbWF4X3BhcmFsbGVsX3dvcmtlcnNfcGVyX2dhdGhl cj0wIik7CisKKwlteSAkaXRlcmF0aW9ucyA9IDA7CisKKwlteSAkbm93OworCW15ICRlbGFw c2VkOworICAgIG15ICRiZWdpbl90aW1lID0gdGltZSgpOworCXdoaWxlICgxKSB7CisJCSRz ZXNzaW9uLT5xdWVyeV9zYWZlKCRzcWwpOworCQkkbm93ID0gdGltZSgpOworCQkkaXRlcmF0 aW9ucyA9ICRpdGVyYXRpb25zICsgMTsKKworCQkkZWxhcHNlZCA9ICRub3cgLSAkYmVnaW5f dGltZTsKKwkJaWYgKCRlbGFwc2VkID4gJGR1cmF0aW9uICYmICRpdGVyYXRpb25zID49ICRt aW5pdGVyYXRpb25zKSB7CisJCQlsYXN0OworCQl9CisJfQorCisJbXkgJHBlcml0ZXIgPSAk ZWxhcHNlZCAvICRpdGVyYXRpb25zOworCisJcGFzcyAoIlRFU1QgJG5hbWU6ICRlbGFwc2Vk IHMsICRpdGVyYXRpb25zIGl0ZXJhdGlvbnMsICRwZXJpdGVyIHMgLyBpdGVyYXRpb24iKTsK K30KKworCiskcHJpbWFyeS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJDUkVBVEUgVEFCTEUg bGl0dGxlIChpIGludCk7Iik7CiskcHJpbWFyeS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJJ TlNFUlQgSU5UTyBsaXR0bGUgVkFMVUVTICgxKTsiKTsKKworc3ViIGNvbnN1bWVfeGlkcwor eworCW15ICgkbm9kZSkgPSBAXzsKKworCW15ICRzZXNzaW9uID0gJG5vZGUtPmJhY2tncm91 bmRfcHNxbCgncG9zdGdyZXMnLCBvbl9lcnJvcl9kaWUgPT4gMSk7CisJZm9yKG15ICRpID0g MDsgJGkgPCAyMDsgJGkrKykgeworCQkkc2Vzc2lvbi0+cXVlcnlfc2FmZShxe2RvICQkCisg IGJlZ2luCisgICAgZm9yIGkgaW4gMS4uNTAgbG9vcAorICAgICAgYmVnaW4KKyAgICAgICAg REVMRVRFIGZyb20gbGl0dGxlOworICAgICAgICBwZXJmb3JtIDEgLyAwOworICAgICAgZXhj ZXB0aW9uCisgICAgICAgIHdoZW4gZGl2aXNpb25fYnlfemVybyB0aGVuIHBlcmZvcm0gMCAv KiBkbyBub3RoaW5nICovOworICAgICAgICB3aGVuIG90aGVycyB0aGVuIHJhaXNlICdmYWls OiAlJywgc3FsZXJybTsKKyAgICAgIGVuZDsKKyAgICBlbmQgbG9vcDsKKyAgZW5kCiskJDt9 KTsKKwl9CisJJHNlc3Npb24tPnF1aXQ7Cit9CisKKyMgVEVTVCBmZXcteGFjdHMKKyMKKyMg Q3ljbGUgdGhyb3VnaCA0IGRpZmZlcmVudCB0b3AtbGV2ZWwgWElEcworIworIyAxMDAxLCAx MDAyLCAxMDAzLCAxMDA0LCAxMDAxLCAxMDAyLCAxMDAzLCAxMDA0LCAuLi4KKyMKK2lmICgx KQoreworCSRwcmltYXJ5LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgJ0NSRUFURSBUQUJMRSB0 YmwoaSBpbnQpJyk7CisJJHByaW1hcnktPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAiSU5TRVJU IElOVE8gdGJsIFNFTEVDVCBnIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwMDAwMCkgZzsi KTsKKwkkcHJpbWFyeS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJWQUNVVU0gRlJFRVpFIHRi bDsiKTsKKworCW15IEBwcmltYXJ5X3Nlc3Npb25zID0gKCk7CisJbXkgJG51bV9jb25uZWN0 aW9ucyA9IDQ7CisJZm9yKG15ICRpID0gMDsgJGkgPCAkbnVtX2Nvbm5lY3Rpb25zOyAkaSsr KSB7CisJCW15ICRwcmltYXJ5X3Nlc3Npb24gPSAgJHByaW1hcnktPmJhY2tncm91bmRfcHNx bCgncG9zdGdyZXMnLCBvbl9lcnJvcl9kaWUgPT4gMSk7CisJCSRwcmltYXJ5X3Nlc3Npb24t PnF1ZXJ5X3NhZmUoIkJFR0lOOyIpOworCQkkcHJpbWFyeV9zZXNzaW9uLT5xdWVyeV9zYWZl KCJERUxFVEUgRlJPTSB0YmwgV0hFUkUgaSAlICRudW1fY29ubmVjdGlvbnMgPSAkaTsiKTsK KwkJcHVzaChAcHJpbWFyeV9zZXNzaW9ucywgJHByaW1hcnlfc2Vzc2lvbik7CisJfQorCisJ IyBDb25zdW1lIG9uZSBtb3JlIFhJRCwgdG8gYnVtcCB1cCAibGFzdCBjb21taXR0ZWQgWElE IgorCSRwcmltYXJ5LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgInNlbGVjdCB0eGlkX2N1cnJl bnQoKSIpOworCisJd2FpdF9jYXRjaHVwKCRwcmltYXJ5LCAkcmVwbGljYSk7CisKKwlyZXBl YXRfYW5kX3RpbWVfc3FsKCJmZXcteGFjdHMiLCAkcmVwbGljYSwgInNlbGVjdCBjb3VudCgq KSBmcm9tIHRibCIpOworCisJZm9yKG15ICRpID0gMDsgJGkgPCAkbnVtX2Nvbm5lY3Rpb25z OyAkaSsrKSB7CisJCSRwcmltYXJ5X3Nlc3Npb25zWyRpXS0+cXVpdDsKKwl9CisJJHByaW1h cnktPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAiRFJPUCBUQUJMRSB0YmwiKTsKK30KKworIyBU RVNUIG1hbnkteGFjdHMKKyMKKyMgbGlrZSBmZXcteGFjdHMsIGJ1dCB3ZSBjeWNsZSB0aHJv dWdoIDEwMCBkaWZmZXJlbnQgWElEcyBpbnN0ZWFkIG9mIDQuCisjCisjIDEwMDEsIDEwMDIs IDEwMDMsIC4uLiAxMTAwLCAxMDAxLCAxMDAyLCAxMDAzLCAuLi4gMTEwMCAgLi4uLgorIwor aWYgKDEpCit7CisJJHByaW1hcnktPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAnQ1JFQVRFIFRB QkxFIHRibChpIGludCknKTsKKwkkcHJpbWFyeS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJJ TlNFUlQgSU5UTyB0YmwgU0VMRUNUIGcgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgMTAwMDAw KSBnOyIpOworCSRwcmltYXJ5LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgIlZBQ1VVTSBGUkVF WkUgdGJsOyIpOworCisJbXkgQHByaW1hcnlfc2Vzc2lvbnMgPSAoKTsKKwlteSAkbnVtX2Nv bm5lY3Rpb25zID0gMTAwOworCWZvcihteSAkaSA9IDA7ICRpIDwgJG51bV9jb25uZWN0aW9u czsgJGkrKykgeworCQlteSAkcHJpbWFyeV9zZXNzaW9uID0gICRwcmltYXJ5LT5iYWNrZ3Jv dW5kX3BzcWwoJ3Bvc3RncmVzJywgb25fZXJyb3JfZGllID0+IDEpOworCQkkcHJpbWFyeV9z ZXNzaW9uLT5xdWVyeV9zYWZlKCJCRUdJTjsiKTsKKwkJJHByaW1hcnlfc2Vzc2lvbi0+cXVl cnlfc2FmZSgiREVMRVRFIEZST00gdGJsIFdIRVJFIGkgJSAkbnVtX2Nvbm5lY3Rpb25zID0g JGk7Iik7CisJCXB1c2goQHByaW1hcnlfc2Vzc2lvbnMsICRwcmltYXJ5X3Nlc3Npb24pOwor CX0KKworCSMgQ29uc3VtZSBvbmUgbW9yZSBYSUQsIHRvIGJ1bXAgdXAgImxhc3QgY29tbWl0 dGVkIFhJRCIKKwkkcHJpbWFyeS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJzZWxlY3QgdHhp ZF9jdXJyZW50KCkiKTsKKworCXdhaXRfY2F0Y2h1cCgkcHJpbWFyeSwgJHJlcGxpY2EpOwor CisJcmVwZWF0X2FuZF90aW1lX3NxbCgibWFueS14YWN0cyIsICRyZXBsaWNhLCAic2VsZWN0 IGNvdW50KCopIGZyb20gdGJsIik7CisKKwlmb3IobXkgJGkgPSAwOyAkaSA8ICRudW1fY29u bmVjdGlvbnM7ICRpKyspIHsKKwkJJHByaW1hcnlfc2Vzc2lvbnNbJGldLT5xdWl0OworCX0K KwkkcHJpbWFyeS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJEUk9QIFRBQkxFIHRibCIpOwor fQorCisjIFRFU1QgbWFueS14YWN0cy13aWRlLWFwYXJ0CisjCisjIGxpa2UgbWFueS14YWN0 cywgYnV0IHRoZSBYSURzIGFyZSBtb3JlIHNwcmVhZCBvdXQsIHNvIHRoYXQgdGhleSBkb24n dCBmaXQgaW4gdGhlCisjIFNMUlUgY2FjaGVzLgorIworIyAxMDAwLCAyMDAwLCAzMDAwLCA0 MDAwLCAuLi4uCitpZiAoMSkKK3sKKwkkcHJpbWFyeS0+c2FmZV9wc3FsKCdwb3N0Z3Jlcycs ICdDUkVBVEUgVEFCTEUgdGJsKGkgaW50KScpOworCSRwcmltYXJ5LT5zYWZlX3BzcWwoJ3Bv c3RncmVzJywgIklOU0VSVCBJTlRPIHRibCBTRUxFQ1QgZyBGUk9NIGdlbmVyYXRlX3Nlcmll cygxLCAxMDAwMDApIGc7Iik7CisJJHByaW1hcnktPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAi VkFDVVVNIEZSRUVaRSB0Ymw7Iik7CisKKwlteSBAcHJpbWFyeV9zZXNzaW9ucyA9ICgpOwor CW15ICRudW1fY29ubmVjdGlvbnMgPSAxMDA7CisJZm9yKG15ICRpID0gMDsgJGkgPCAkbnVt X2Nvbm5lY3Rpb25zOyAkaSsrKSB7CisJCW15ICRwcmltYXJ5X3Nlc3Npb24gPSAgJHByaW1h cnktPmJhY2tncm91bmRfcHNxbCgncG9zdGdyZXMnLCBvbl9lcnJvcl9kaWUgPT4gMSk7CisK KwkJY29uc3VtZV94aWRzKCRwcmltYXJ5KTsKKworCQkkcHJpbWFyeV9zZXNzaW9uLT5xdWVy eV9zYWZlKCJCRUdJTjsiKTsKKwkJJHByaW1hcnlfc2Vzc2lvbi0+cXVlcnlfc2FmZSgiREVM RVRFIEZST00gdGJsIFdIRVJFIGkgJSAkbnVtX2Nvbm5lY3Rpb25zID0gJGk7Iik7CisJCXB1 c2goQHByaW1hcnlfc2Vzc2lvbnMsICRwcmltYXJ5X3Nlc3Npb24pOworCX0KKworCSMgQ29u c3VtZSBvbmUgbW9yZSBYSUQsIHRvIGJ1bXAgdXAgImxhc3QgY29tbWl0dGVkIFhJRCIKKwkk cHJpbWFyeS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJzZWxlY3QgdHhpZF9jdXJyZW50KCki KTsKKworCXdhaXRfY2F0Y2h1cCgkcHJpbWFyeSwgJHJlcGxpY2EpOworCisJcmVwZWF0X2Fu ZF90aW1lX3NxbCgibWFueS14YWN0cy13aWRlLWFwYXJ0IiwgJHJlcGxpY2EsICJzZWxlY3Qg Y291bnQoKikgZnJvbSB0YmwiKTsKKworCWZvcihteSAkaSA9IDA7ICRpIDwgJG51bV9jb25u ZWN0aW9uczsgJGkrKykgeworCQkkcHJpbWFyeV9zZXNzaW9uc1skaV0tPnF1aXQ7CisJfQor CSRwcmltYXJ5LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgIkRST1AgVEFCTEUgdGJsIik7Cit9 CisKKyMgVEVTVDogZmV3LXN1YnhhY3RzCitpZiAoMSkKK3sKKwkkcHJpbWFyeS0+c2FmZV9w c3FsKCdwb3N0Z3JlcycsICdDUkVBVEUgVEFCTEUgdGJsKGkgaW50KScpOworCSRwcmltYXJ5 LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgIklOU0VSVCBJTlRPIHRibCBTRUxFQ1QgZyBGUk9N IGdlbmVyYXRlX3NlcmllcygxLCAxMDAwMDApIGc7Iik7CisJJHByaW1hcnktPnNhZmVfcHNx bCgncG9zdGdyZXMnLCAiVkFDVVVNIEZSRUVaRSB0Ymw7Iik7CisKKwlteSAkcHJpbWFyeV9z ZXNzaW9uID0gICRwcmltYXJ5LT5iYWNrZ3JvdW5kX3BzcWwoJ3Bvc3RncmVzJywgb25fZXJy b3JfZGllID0+IDEpOworCSRwcmltYXJ5X3Nlc3Npb24tPnF1ZXJ5X3NhZmUoIkJFR0lOOyIp OworCW15ICRudW1fc3VieGFjdHMgPSA0OworCWZvcihteSAkaSA9IDA7ICRpIDwgJG51bV9z dWJ4YWN0czsgJGkrKykgeworCQkkcHJpbWFyeV9zZXNzaW9uLT5xdWVyeV9zYWZlKCJzYXZl cG9pbnQgc3AkaTsiKTsKKwkJJHByaW1hcnlfc2Vzc2lvbi0+cXVlcnlfc2FmZSgiREVMRVRF IEZST00gdGJsIFdIRVJFIGkgJSAkbnVtX3N1YnhhY3RzID0gJGk7Iik7CisJCSRwcmltYXJ5 X3Nlc3Npb24tPnF1ZXJ5X3NhZmUoInJlbGVhc2Ugc2F2ZXBvaW50IHNwJGk7Iik7CisJfQor CisJIyBDb25zdW1lIG9uZSBtb3JlIFhJRCwgdG8gYnVtcCB1cCAibGFzdCBjb21taXR0ZWQg WElEIgorCSRwcmltYXJ5LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgInNlbGVjdCB0eGlkX2N1 cnJlbnQoKSIpOworCisJd2FpdF9jYXRjaHVwKCRwcmltYXJ5LCAkcmVwbGljYSk7CisKKwly ZXBlYXRfYW5kX3RpbWVfc3FsKCJmZXctc3VieGFjdHMiLCAkcmVwbGljYSwgInNlbGVjdCBj b3VudCgqKSBmcm9tIHRibCIpOworCisJJHByaW1hcnlfc2Vzc2lvbi0+cXVpdDsKKwkkcHJp bWFyeS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJEUk9QIFRBQkxFIHRibCIpOworfQorCisK KyMgVEVTVDogbWFueS1zdWJ4YWN0cworaWYgKDEpCit7CisJJHByaW1hcnktPnNhZmVfcHNx bCgncG9zdGdyZXMnLCAnQ1JFQVRFIFRBQkxFIHRibChpIGludCknKTsKKwkkcHJpbWFyeS0+ c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJJTlNFUlQgSU5UTyB0YmwgU0VMRUNUIGcgRlJPTSBn ZW5lcmF0ZV9zZXJpZXMoMSwgMTAwMDAwKSBnOyIpOworCSRwcmltYXJ5LT5zYWZlX3BzcWwo J3Bvc3RncmVzJywgIlZBQ1VVTSBGUkVFWkUgdGJsOyIpOworCisJbXkgJHByaW1hcnlfc2Vz c2lvbiA9ICAkcHJpbWFyeS0+YmFja2dyb3VuZF9wc3FsKCdwb3N0Z3JlcycsIG9uX2Vycm9y X2RpZSA9PiAxKTsKKwkkcHJpbWFyeV9zZXNzaW9uLT5xdWVyeV9zYWZlKCJCRUdJTjsiKTsK KwlteSAkbnVtX3N1YnhhY3RzID0gMTAwMDsKKwlmb3IobXkgJGkgPSAwOyAkaSA8ICRudW1f c3VieGFjdHM7ICRpKyspIHsKKwkJJHByaW1hcnlfc2Vzc2lvbi0+cXVlcnlfc2FmZSgic2F2 ZXBvaW50IHNwJGk7Iik7CisJCSRwcmltYXJ5X3Nlc3Npb24tPnF1ZXJ5X3NhZmUoIkRFTEVU RSBGUk9NIHRibCBXSEVSRSBpICUgJG51bV9zdWJ4YWN0cyA9ICRpOyIpOworCQkkcHJpbWFy eV9zZXNzaW9uLT5xdWVyeV9zYWZlKCJyZWxlYXNlIHNhdmVwb2ludCBzcCRpOyIpOworCX0K KworCSMgQ29uc3VtZSBvbmUgbW9yZSBYSUQsIHRvIGJ1bXAgdXAgImxhc3QgY29tbWl0dGVk IFhJRCIKKwkkcHJpbWFyeS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJzZWxlY3QgdHhpZF9j dXJyZW50KCkiKTsKKworCXdhaXRfY2F0Y2h1cCgkcHJpbWFyeSwgJHJlcGxpY2EpOworCisJ cmVwZWF0X2FuZF90aW1lX3NxbCgibWFueS1zdWJ4YWN0cyIsICRyZXBsaWNhLCAic2VsZWN0 IGNvdW50KCopIGZyb20gdGJsIik7CisKKwkkcHJpbWFyeV9zZXNzaW9uLT5xdWl0OworCSRw cmltYXJ5LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgIkRST1AgVEFCTEUgdGJsIik7Cit9CisK KyMgVEVTVDogbWFueS1zdWJ4YWN0cy13aWRlLWFwYXJ0CitpZiAoMSkKK3sKKwkkcHJpbWFy eS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICdDUkVBVEUgVEFCTEUgdGJsKGkgaW50KScpOwor CSRwcmltYXJ5LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgIklOU0VSVCBJTlRPIHRibCBTRUxF Q1QgZyBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMDAwMDApIGc7Iik7CisJJHByaW1hcnkt PnNhZmVfcHNxbCgncG9zdGdyZXMnLCAiVkFDVVVNIEZSRUVaRSB0Ymw7Iik7CisKKwlteSAk cHJpbWFyeV9zZXNzaW9uID0gICRwcmltYXJ5LT5iYWNrZ3JvdW5kX3BzcWwoJ3Bvc3RncmVz Jywgb25fZXJyb3JfZGllID0+IDEpOworCSRwcmltYXJ5X3Nlc3Npb24tPnF1ZXJ5X3NhZmUo IkJFR0lOOyIpOworCW15ICRudW1fc3VieGFjdHMgPSAxMDAwOworCWZvcihteSAkaSA9IDA7 ICRpIDwgJG51bV9zdWJ4YWN0czsgJGkrKykgeworCQljb25zdW1lX3hpZHMoJHByaW1hcnkp OworCQkkcHJpbWFyeV9zZXNzaW9uLT5xdWVyeV9zYWZlKCJzYXZlcG9pbnQgc3AkaTsiKTsK KwkJJHByaW1hcnlfc2Vzc2lvbi0+cXVlcnlfc2FmZSgiREVMRVRFIEZST00gdGJsIFdIRVJF IGkgJSAkbnVtX3N1YnhhY3RzID0gJGk7Iik7CisJCSRwcmltYXJ5X3Nlc3Npb24tPnF1ZXJ5 X3NhZmUoInJlbGVhc2Ugc2F2ZXBvaW50IHNwJGk7Iik7CisJfQorCisJIyBDb25zdW1lIG9u ZSBtb3JlIFhJRCwgdG8gYnVtcCB1cCAibGFzdCBjb21taXR0ZWQgWElEIgorCSRwcmltYXJ5 LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgInNlbGVjdCB0eGlkX2N1cnJlbnQoKSIpOworCisJ d2FpdF9jYXRjaHVwKCRwcmltYXJ5LCAkcmVwbGljYSk7CisKKwlyZXBlYXRfYW5kX3RpbWVf c3FsKCJtYW55LXN1YnhhY3RzLXdpZGUtYXBhcnQiLCAkcmVwbGljYSwgInNlbGVjdCBjb3Vu dCgqKSBmcm9tIHRibCIpOworCisJJHByaW1hcnlfc2Vzc2lvbi0+cXVpdDsKKwkkcHJpbWFy eS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJEUk9QIFRBQkxFIHRibCIpOworfQorCisjIFRF U1Q6IGluc2VydC1hbGwtZGlmZmVyZW50LXhpZHMKK2lmICgxKQoreworCSRwcmltYXJ5LT5z YWZlX3BzcWwoJ3Bvc3RncmVzJywgJ0NSRUFURSBUQUJMRSB0YmwoaSBpbnQpJyk7CisKKwlt eSBAcHJpbWFyeV9zZXNzaW9ucyA9ICgpOworCW15ICRudW1fY29ubmVjdGlvbnMgPSAxMDAw OworCWZvcihteSAkaSA9IDA7ICRpIDwgJG51bV9jb25uZWN0aW9uczsgJGkrKykgeworCQlt eSAkcHJpbWFyeV9zZXNzaW9uID0gICRwcmltYXJ5LT5iYWNrZ3JvdW5kX3BzcWwoJ3Bvc3Rn cmVzJywgb25fZXJyb3JfZGllID0+IDEpOworCQkkcHJpbWFyeV9zZXNzaW9uLT5xdWVyeV9z YWZlKCJCRUdJTjsiKTsKKwkJJHByaW1hcnlfc2Vzc2lvbi0+cXVlcnlfc2FmZSgiSU5TRVJU IElOVE8gdGJsIFZBTFVFUyAoJGkpIik7CisJCXB1c2goQHByaW1hcnlfc2Vzc2lvbnMsICRw cmltYXJ5X3Nlc3Npb24pOworCX0KKworCSMgQ29uc3VtZSBvbmUgbW9yZSBYSUQsIHRvIGJ1 bXAgdXAgImxhc3QgY29tbWl0dGVkIFhJRCIKKwkkcHJpbWFyeS0+c2FmZV9wc3FsKCdwb3N0 Z3JlcycsICJzZWxlY3QgdHhpZF9jdXJyZW50KCkiKTsKKworCXdhaXRfY2F0Y2h1cCgkcHJp bWFyeSwgJHJlcGxpY2EpOworCisJcmVwZWF0X2FuZF90aW1lX3NxbCgiaW5zZXJ0LWFsbC1k aWZmZXJlbnQteGlkcyIsICRyZXBsaWNhLCAic2VsZWN0IGNvdW50KCopIGZyb20gdGJsIik7 CisKKwlmb3IobXkgJGkgPSAwOyAkaSA8ICRudW1fY29ubmVjdGlvbnM7ICRpKyspIHsKKwkJ JHByaW1hcnlfc2Vzc2lvbnNbJGldLT5xdWl0OworCX0KKwkkcHJpbWFyeS0+c2FmZV9wc3Fs KCdwb3N0Z3JlcycsICJEUk9QIFRBQkxFIHRibCIpOworfQorCisjIFRFU1Q6IGluc2VydC1h bGwtZGlmZmVyZW50LXN1YnhpZHMKK2lmICgxKQoreworCSRwcmltYXJ5LT5zYWZlX3BzcWwo J3Bvc3RncmVzJywgJ0NSRUFURSBUQUJMRSB0YmwoaSBpbnQpJyk7CisJJHByaW1hcnktPnNh ZmVfcHNxbCgncG9zdGdyZXMnLCAiVkFDVVVNIEZSRUVaRSB0Ymw7Iik7CisKKwlteSAkcHJp bWFyeV9zZXNzaW9uID0gICRwcmltYXJ5LT5iYWNrZ3JvdW5kX3BzcWwoJ3Bvc3RncmVzJywg b25fZXJyb3JfZGllID0+IDEpOworCSRwcmltYXJ5X3Nlc3Npb24tPnF1ZXJ5X3NhZmUoIkJF R0lOOyIpOworCW15ICRudW1fc3VieGFjdHMgPSAxMDAwOworCWZvcihteSAkaSA9IDA7ICRp IDwgJG51bV9zdWJ4YWN0czsgJGkrKykgeworCQkkcHJpbWFyeV9zZXNzaW9uLT5xdWVyeV9z YWZlKCJzYXZlcG9pbnQgc3AkaTsgSU5TRVJUIElOVE8gdGJsIFZBTFVFUygkaSk7IHJlbGVh c2Ugc2F2ZXBvaW50IHNwJGk7Iik7CisJfQorCisJIyBDb25zdW1lIG9uZSBtb3JlIFhJRCwg dG8gYnVtcCB1cCAibGFzdCBjb21taXR0ZWQgWElEIgorCSRwcmltYXJ5LT5zYWZlX3BzcWwo J3Bvc3RncmVzJywgInNlbGVjdCB0eGlkX2N1cnJlbnQoKSIpOworCisJd2FpdF9jYXRjaHVw KCRwcmltYXJ5LCAkcmVwbGljYSk7CisKKwlyZXBlYXRfYW5kX3RpbWVfc3FsKCJpbnNlcnQt YWxsLWRpZmZlcmVudC1zdWJ4aWRzIiwgJHJlcGxpY2EsICJzZWxlY3QgY291bnQoKikgZnJv bSB0YmwiKTsKKworCSRwcmltYXJ5X3Nlc3Npb24tPnF1aXQ7CisJJHByaW1hcnktPnNhZmVf cHNxbCgncG9zdGdyZXMnLCAiRFJPUCBUQUJMRSB0YmwiKTsKK30KKworZG9uZV90ZXN0aW5n KCk7Ci0tIAoyLjM5LjUKCg== --------------6V2bsblsMdY4BnmlS1v5weLR Content-Type: text/x-patch; charset=UTF-8; name="v5-0002-Use-CSN-snapshots-during-Hot-Standby.patch" Content-Disposition: attachment; filename="v5-0002-Use-CSN-snapshots-during-Hot-Standby.patch" Content-Transfer-Encoding: base64 RnJvbSBlNTg1NDNiOTJiY2JmYzAwNjE5NjQzNDFjZWNmOTNmYTgxM2RjNzdlIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBIZWlra2kgTGlubmFrYW5nYXMgPGhlaWtraS5saW5u YWthbmdhc0Bpa2kuZmk+CkRhdGU6IFR1ZSwgMTMgQXVnIDIwMjQgMjA6MjY6NDAgKzAzMDAK U3ViamVjdDogW1BBVENIIHY1IDIvNV0gVXNlIENTTiBzbmFwc2hvdHMgZHVyaW5nIEhvdCBT dGFuZGJ5CgpSZXBsYWNlIHRoZSBrbm93bi1hc3NpZ25lZC1YSURzIG1lY2hhbmlzbSB3aXRo IGEgQ1NOIGxvZy4gVGhlIENTTiBsb2cKKHBnX2NzbikgdHJhY2tzIHRoZSBjb21taXQgTFNO IG9mIGVhY2ggdHJhbnNhY3Rpb24sIHdoZW4gcmVwbGF5aW5nIHRoZQpXQUwgb24gYSBzdGFu ZGJ5LiBJdCdzIG9ubHkgdXNlZCBvbiB0aGUgc3RhbmRieSwgYW5kIGlzIGluaXRpYWxpemVk CmZyb20gc2NyYXRjaCBhdCBzZXJ2ZXIgc3RhcnR1cCBsaWtlIHBnX3N1YnRyYW5zLgoKQmFz ZWQgb24gMDAwMS1DU04tYmFzZS1zbmFwc2hvdC5wYXRjaCBmcm9tCmh0dHBzOi8vd3d3LnBv c3RncmVzcWwub3JnL21lc3NhZ2UtaWQvMjAyMDA4MTAwOTUyNTIxMzI3NzI2MSU0MGhpZ2hn by5jYS4KVGhpcyBwYXRjaCBoYXMgYSBsb25nIGxpbmVhZ2UsIHZhcmlvdXMgQ1NOIHBhdGNo ZXMgaGF2ZSBiZWVuIHBvc3RlZAp3aXRoIHBhcnRzIGZyb20gU3RhcyBLZWx2aWNoLCBNb3Zl YWQgTGksIEFudHMgQWFzbWEsIEhlaWtraQpMaW5uYWthbmdhcywgQWxleGFuZGVyIEt1em1l bmtvdgotLS0KIGNvbnRyaWIvcGdfdmlzaWJpbGl0eS9wZ192aXNpYmlsaXR5LmMgICAgICAg ICB8ICAgIDEgKwogc3JjL2JhY2tlbmQvYWNjZXNzL3JtZ3JkZXNjL3hhY3RkZXNjLmMgICAg ICAgIHwgICAyNiAtCiBzcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS9NYWtlZmlsZSAgICAg ICAgICAgfCAgICAxICsKIHNyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL2Nzbl9sb2cuYyAg ICAgICAgICB8ICA0NzQgKysrKysrCiBzcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS9tZXNv bi5idWlsZCAgICAgICAgfCAgICAxICsKIHNyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3Ry YW5zYW0uYyAgICAgICAgICB8ICAgIDMgKwogc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0v dHdvcGhhc2UuYyAgICAgICAgIHwgICAzNCArLQogc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5z YW0vdmFyc3VwLmMgICAgICAgICAgIHwgICAgMSArCiBzcmMvYmFja2VuZC9hY2Nlc3MvdHJh bnNhbS94YWN0LmMgICAgICAgICAgICAgfCAgMTM4ICstCiBzcmMvYmFja2VuZC9hY2Nlc3Mv dHJhbnNhbS94bG9nLmMgICAgICAgICAgICAgfCAgMTE4ICstCiBzcmMvYmFja2VuZC9hY2Nl c3MvdHJhbnNhbS94bG9ncmVjb3ZlcnkuYyAgICAgfCAgIDEzICstCiBzcmMvYmFja2VuZC9h Y2Nlc3MvdHJhbnNhbS94bG9ndXRpbHMuYyAgICAgICAgfCAgICAyICstCiBzcmMvYmFja2Vu ZC9wb3N0bWFzdGVyL3N0YXJ0dXAuYyAgICAgICAgICAgICAgfCAgICAyICstCiBzcmMvYmFj a2VuZC9yZXBsaWNhdGlvbi9sb2dpY2FsL2RlY29kZS5jICAgICAgfCAgICA4IC0KIHNyYy9i YWNrZW5kL3JlcGxpY2F0aW9uL2xvZ2ljYWwvc25hcGJ1aWxkLmMgICB8ICAgIDIgKy0KIHNy Yy9iYWNrZW5kL3N0b3JhZ2UvaXBjL2lwY2kuYyAgICAgICAgICAgICAgICB8ICAgIDMgKwog c3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvcHJvY2FycmF5LmMgICAgICAgICAgIHwgMTUxMiAr Ky0tLS0tLS0tLS0tLS0tLQogc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvc3RhbmRieS5jICAg ICAgICAgICAgIHwgIDEwMiArLQogc3JjL2JhY2tlbmQvc3RvcmFnZS9sbWdyL2x3bG9jay5j ICAgICAgICAgICAgIHwgICAgMiArCiAuLi4vdXRpbHMvYWN0aXZpdHkvd2FpdF9ldmVudF9u YW1lcy50eHQgICAgICAgfCAgICAxICsKIHNyYy9iYWNrZW5kL3V0aWxzL3Byb2Jlcy5kICAg ICAgICAgICAgICAgICAgICB8ICAgIDIgKwogc3JjL2JhY2tlbmQvdXRpbHMvdGltZS9zbmFw bWdyLmMgICAgICAgICAgICAgIHwgICAzNyArLQogc3JjL2Jpbi9pbml0ZGIvaW5pdGRiLmMg ICAgICAgICAgICAgICAgICAgICAgIHwgICAgMyArLQogc3JjL2luY2x1ZGUvYWNjZXNzL2Nz bl9sb2cuaCAgICAgICAgICAgICAgICAgIHwgICAzMCArCiBzcmMvaW5jbHVkZS9hY2Nlc3Mv dHJhbnNhbS5oICAgICAgICAgICAgICAgICAgfCAgICAzICsKIHNyYy9pbmNsdWRlL2FjY2Vz cy90d29waGFzZS5oICAgICAgICAgICAgICAgICB8ICAgIDMgKy0KIHNyYy9pbmNsdWRlL2Fj Y2Vzcy94YWN0LmggICAgICAgICAgICAgICAgICAgICB8ICAgMTIgKy0KIHNyYy9pbmNsdWRl L2FjY2Vzcy94bG9ndXRpbHMuaCAgICAgICAgICAgICAgICB8ICAgMzMgKy0KIHNyYy9pbmNs dWRlL3N0b3JhZ2UvbHdsb2NrLmggICAgICAgICAgICAgICAgICB8ICAgIDIgKwogc3JjL2lu Y2x1ZGUvc3RvcmFnZS9wcm9jYXJyYXkuaCAgICAgICAgICAgICAgIHwgICAxMyArLQogc3Jj L2luY2x1ZGUvdXRpbHMvc25hcHNob3QuaCAgICAgICAgICAgICAgICAgIHwgICAgNyArCiAz MSBmaWxlcyBjaGFuZ2VkLCA4MjEgaW5zZXJ0aW9ucygrKSwgMTc2OCBkZWxldGlvbnMoLSkK IGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS9jc25fbG9n LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvaW5jbHVkZS9hY2Nlc3MvY3NuX2xvZy5oCgpk aWZmIC0tZ2l0IGEvY29udHJpYi9wZ192aXNpYmlsaXR5L3BnX3Zpc2liaWxpdHkuYyBiL2Nv bnRyaWIvcGdfdmlzaWJpbGl0eS9wZ192aXNpYmlsaXR5LmMKaW5kZXggNWQwZGVhYmE2MS4u NzkwNWE5MTQxMiAxMDA2NDQKLS0tIGEvY29udHJpYi9wZ192aXNpYmlsaXR5L3BnX3Zpc2li aWxpdHkuYworKysgYi9jb250cmliL3BnX3Zpc2liaWxpdHkvcGdfdmlzaWJpbGl0eS5jCkBA IC01ODEsNiArNTgxLDcgQEAgY29sbGVjdF92aXNpYmlsaXR5X2RhdGEoT2lkIHJlbGlkLCBi b29sIGluY2x1ZGVfcGQpCiAgKiAgICBub3cgcGVyZm9ybSBtaW5pbWFsIGNoZWNraW5nIG9u IGEgc3RhbmRieSBieSBhbHdheXMgdXNpbmcgbmV4dFhpZCwgdGhpcwogICogICAgYXBwcm9h Y2ggaXMgYmV0dGVyIHRoYW4gbm90aGluZyBhbmQgd2lsbCBhdCBsZWFzdCBjYXRjaCBleHRy ZW1lbHkgYnJva2VuCiAgKiAgICBjYXNlcyB3aGVyZSBhIHhpZCBpcyBpbiB0aGUgZnV0dXJl LgorICogICAgWFhYIEtub3duQXNzaWduZWRYaWRzIGlzIGdvbmUuCiAgKiAzLiBJZ25vcmUg d2Fsc2VuZGVyIHhtaW4sIGJlY2F1c2UgaXQgY291bGQgZ28gYmFja3dhcmQgaWYgc29tZSBy ZXBsaWNhdGlvbgogICogICAgY29ubmVjdGlvbnMgZG9uJ3QgdXNlIHJlcGxpY2F0aW9uIHNs b3RzLgogICoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9ybWdyZGVzYy94YWN0 ZGVzYy5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3JtZ3JkZXNjL3hhY3RkZXNjLmMKaW5kZXgg ODg5Y2I5NTVjMS4uMTI4NDg2ZTc1MSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNz L3JtZ3JkZXNjL3hhY3RkZXNjLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3JtZ3JkZXNj L3hhY3RkZXNjLmMKQEAgLTQyNCwxNyArNDI0LDYgQEAgeGFjdF9kZXNjX3ByZXBhcmUoU3Ry aW5nSW5mbyBidWYsIHVpbnQ4IGluZm8sIHhsX3hhY3RfcHJlcGFyZSAqeGxyZWMsIFJlcE9y aWdpbkkKIAkJCQkJCSB0aW1lc3RhbXB0el90b19zdHIocGFyc2VkLm9yaWdpbl90aW1lc3Rh bXApKTsKIH0KIAotc3RhdGljIHZvaWQKLXhhY3RfZGVzY19hc3NpZ25tZW50KFN0cmluZ0lu Zm8gYnVmLCB4bF94YWN0X2Fzc2lnbm1lbnQgKnhscmVjKQotewotCWludAkJCWk7Ci0KLQlh cHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgInN1YnhhY3RzOiIpOwotCi0JZm9yIChpID0g MDsgaSA8IHhscmVjLT5uc3VieGFjdHM7IGkrKykKLQkJYXBwZW5kU3RyaW5nSW5mbyhidWYs ICIgJXUiLCB4bHJlYy0+eHN1YltpXSk7Ci19Ci0KIHZvaWQKIHhhY3RfZGVzYyhTdHJpbmdJ bmZvIGJ1ZiwgWExvZ1JlYWRlclN0YXRlICpyZWNvcmQpCiB7CkBAIC00NjIsMTggKzQ1MSw2 IEBAIHhhY3RfZGVzYyhTdHJpbmdJbmZvIGJ1ZiwgWExvZ1JlYWRlclN0YXRlICpyZWNvcmQp CiAJCXhhY3RfZGVzY19wcmVwYXJlKGJ1ZiwgWExvZ1JlY0dldEluZm8ocmVjb3JkKSwgeGxy ZWMsCiAJCQkJCQkgIFhMb2dSZWNHZXRPcmlnaW4ocmVjb3JkKSk7CiAJfQotCWVsc2UgaWYg KGluZm8gPT0gWExPR19YQUNUX0FTU0lHTk1FTlQpCi0JewotCQl4bF94YWN0X2Fzc2lnbm1l bnQgKnhscmVjID0gKHhsX3hhY3RfYXNzaWdubWVudCAqKSByZWM7Ci0KLQkJLyoKLQkJICog Tm90ZSB0aGF0IHdlIGlnbm9yZSB0aGUgV0FMIHJlY29yZCdzIHhpZCwgc2luY2Ugd2UncmUg bW9yZQotCQkgKiBpbnRlcmVzdGVkIGluIHRoZSB0b3AtbGV2ZWwgeGlkIHRoYXQgaXNzdWVk IHRoZSByZWNvcmQgYW5kIHdoaWNoCi0JCSAqIHhpZHMgYXJlIGJlaW5nIHJlcG9ydGVkIGhl cmUuCi0JCSAqLwotCQlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgInh0b3AgJXU6ICIsIHhscmVj LT54dG9wKTsKLQkJeGFjdF9kZXNjX2Fzc2lnbm1lbnQoYnVmLCB4bHJlYyk7Ci0JfQogCWVs c2UgaWYgKGluZm8gPT0gWExPR19YQUNUX0lOVkFMSURBVElPTlMpCiAJewogCQl4bF94YWN0 X2ludmFscyAqeGxyZWMgPSAoeGxfeGFjdF9pbnZhbHMgKikgcmVjOwpAQCAtNTA1LDkgKzQ4 Miw2IEBAIHhhY3RfaWRlbnRpZnkodWludDggaW5mbykKIAkJY2FzZSBYTE9HX1hBQ1RfQUJP UlRfUFJFUEFSRUQ6CiAJCQlpZCA9ICJBQk9SVF9QUkVQQVJFRCI7CiAJCQlicmVhazsKLQkJ Y2FzZSBYTE9HX1hBQ1RfQVNTSUdOTUVOVDoKLQkJCWlkID0gIkFTU0lHTk1FTlQiOwotCQkJ YnJlYWs7CiAJCWNhc2UgWExPR19YQUNUX0lOVkFMSURBVElPTlM6CiAJCQlpZCA9ICJJTlZB TElEQVRJT04iOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3Mv dHJhbnNhbS9NYWtlZmlsZSBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL01ha2VmaWxl CmluZGV4IDY2MWM1NWE5ZGIuLjI1MjBkNzdjN2MgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L2FjY2Vzcy90cmFuc2FtL01ha2VmaWxlCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFu c2FtL01ha2VmaWxlCkBAIC0xNSw2ICsxNSw3IEBAIGluY2x1ZGUgJCh0b3BfYnVpbGRkaXIp L3NyYy9NYWtlZmlsZS5nbG9iYWwKIE9CSlMgPSBcCiAJY2xvZy5vIFwKIAljb21taXRfdHMu byBcCisJY3NuX2xvZy5vIFwKIAlnZW5lcmljX3hsb2cubyBcCiAJbXVsdGl4YWN0Lm8gXAog CXBhcmFsbGVsLm8gXApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0v Y3NuX2xvZy5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vY3NuX2xvZy5jCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAuLjExODhhNzhjNGEKLS0tIC9kZXYv bnVsbAorKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS9jc25fbG9nLmMKQEAgLTAs MCArMSw0NzQgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBjc25fbG9n LmMKKyAqCQlUcmFjayBjb21taXQgcmVjb3JkIExTTnMgb2YgZmluaXNoZWQgdHJhbnNhY3Rp b25zCisgKgorICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYW4gU0xSVSB0byBzdG9yZSB0aGUg TFNOIG9mIHRoZSBjb21taXQgcmVjb3JkIG9mIGVhY2gKKyAqIHRyYW5zYWN0aW9uLiBDU04g c3RhbmRzIGZvciBDb21taXQgU2VxdWVuY2UgTnVtYmVyLCBhbmQgaW4gcHJpbmNpcGxlIHdl CisgKiBjb3VsZCB1c2UgYSBzZXBhcmF0ZSBjb3VudGVyIHRoYXQgaXMgaW5jcmVtZW50ZWQg YXQgZXZlcnkgY29tbWl0LiBGb3IKKyAqIHNpbXBsaWNpdHksIHRob3VnaCwgd2UgdXNlIHRo ZSBjb21taXQgcmVjb3JkcyBMU04gYXMgdGhlIHNlcXVlbmNlIG51bWJlci4KKyAqCisgKiBM aWtlIHBnX3N1YnRyYW5zLCB0aGlzIG1hcHBpbmcgbmVlZCB0byBiZSBrZXB0IG9ubHkgZm9y IHhpZCdzIGdyZWF0ZXIgdGhlbgorICogb2xkZXN0WG1pbiwgYW5kIGRvZXNuJ3QgbmVlZCB0 byBiZSBwcmVzZXJ2ZWQgb3ZlciBjcmFzaGVzLiAgQWxzbywgdGhpcyBpcworICogb25seSBu ZWVkZWQgaW4gaG90IHN0YW5kYnkgbW9kZSwgYW5kIGltbWVkaWF0ZWx5IGFmdGVyIGV4aXRp bmcgaG90IHN0YW5kYnkKKyAqIG1vZGUsIHVudGlsIGFsbCBvbGQgc25hcHNob3RzIHRha2Vu IGR1cmluZyBzdGFuZGJ5IG1vZGUgYXJlIGdvbmUuCisgKgorICogUG9ydGlvbnMgQ29weXJp Z2h0IChjKSAxOTk2LTIwMTgsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3Vw CisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTQsIFJlZ2VudHMgb2YgdGhlIFVuaXZl cnNpdHkgb2YgQ2FsaWZvcm5pYQorICoKKyAqIHNyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2Ft L2Nzbl9sb2cuYworICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1 ZGUgInBvc3RncmVzLmgiCisKKyNpbmNsdWRlICJhY2Nlc3MvY2xvZy5oIgorI2luY2x1ZGUg ImFjY2Vzcy9jc25fbG9nLmgiCisjaW5jbHVkZSAiYWNjZXNzL3NscnUuaCIKKyNpbmNsdWRl ICJhY2Nlc3Mvc3VidHJhbnMuaCIKKyNpbmNsdWRlICJhY2Nlc3MvdHJhbnNhbS5oIgorI2lu Y2x1ZGUgIm1pc2NhZG1pbi5oIgorI2luY2x1ZGUgInBnX3RyYWNlLmgiCisjaW5jbHVkZSAi dXRpbHMvc25hcG1nci5oIgorCisvKgorICogRGVmaW5lcyBmb3IgQ1NOTG9nIHBhZ2Ugc2l6 ZXMuICBBIHBhZ2UgaXMgdGhlIHNhbWUgQkxDS1NaIGFzIGlzIHVzZWQKKyAqIGV2ZXJ5d2hl cmUgZWxzZSBpbiBQb3N0Z3Jlcy4KKyAqCisgKiBOb3RlOiBiZWNhdXNlIFRyYW5zYWN0aW9u SWRzIGFyZSAzMiBiaXRzIGFuZCB3cmFwIGFyb3VuZCBhdCAweEZGRkZGRkZGLAorICogQ1NO TG9nIHBhZ2UgbnVtYmVyaW5nIGFsc28gd3JhcHMgYXJvdW5kIGF0CisgKiAweEZGRkZGRkZG L0NTTl9MT0dfWEFDVFNfUEVSX1BBR0UsIGFuZCBDU05Mb2cgc2VnbWVudCBudW1iZXJpbmcg YXQKKyAqIDB4RkZGRkZGRkYvQ0xPR19YQUNUU19QRVJfUEFHRS9TTFJVX1BBR0VTX1BFUl9T RUdNRU5ULiAgV2UgbmVlZCB0YWtlIG5vCisgKiBleHBsaWNpdCBub3RpY2Ugb2YgdGhhdCBm YWN0IGluIHRoaXMgbW9kdWxlLCBleGNlcHQgd2hlbiBjb21wYXJpbmcgc2VnbWVudAorICog YW5kIHBhZ2UgbnVtYmVycyBpbiBUcnVuY2F0ZUNTTkxvZyAoc2VlIENTTkxvZ1BhZ2VQcmVj ZWRlcykuCisgKi8KKworLyogV2Ugc3RvcmUgdGhlIGNvbW1pdCBDU04gZm9yIGVhY2ggeGlk ICovCisjZGVmaW5lIENTTl9MT0dfWEFDVFNfUEVSX1BBR0UgKEJMQ0tTWiAvIHNpemVvZihY TG9nUmVjUHRyKSkKKworI2RlZmluZSBUcmFuc2FjdGlvbklkVG9QYWdlKHhpZCkJKCh4aWQp IC8gKFRyYW5zYWN0aW9uSWQpIENTTl9MT0dfWEFDVFNfUEVSX1BBR0UpCisjZGVmaW5lIFRy YW5zYWN0aW9uSWRUb1BnSW5kZXgoeGlkKSAoKHhpZCkgJSAoVHJhbnNhY3Rpb25JZCkgQ1NO X0xPR19YQUNUU19QRVJfUEFHRSkKKworI2RlZmluZSBQZ0luZGV4VG9UcmFuc2FjdGlvbklk KHBhZ2VubywgaWR4KSAoQ1NOX0xPR19YQUNUU19QRVJfUEFHRSAqIChwYWdlbm8pICsgaWR4 KQorCisKKworLyoKKyAqIExpbmsgdG8gc2hhcmVkLW1lbW9yeSBkYXRhIHN0cnVjdHVyZXMg Zm9yIENTTkxvZyBjb250cm9sCisgKi8KK3N0YXRpYyBTbHJ1Q3RsRGF0YSBDU05Mb2dDdGxE YXRhOworI2RlZmluZSBDc25sb2dDdGwgKCZDU05Mb2dDdGxEYXRhKQorCitzdGF0aWMgaW50 CVplcm9DU05Mb2dQYWdlKGludCBwYWdlbm8pOworc3RhdGljIGJvb2wgQ1NOTG9nUGFnZVBy ZWNlZGVzKGludDY0IHBhZ2UxLCBpbnQ2NCBwYWdlMik7CitzdGF0aWMgdm9pZCBDU05Mb2dT ZXRQYWdlU3RhdHVzKFRyYW5zYWN0aW9uSWQgeGlkLCBpbnQgbnN1YnhpZHMsCisJCQkJCQkJ CVRyYW5zYWN0aW9uSWQgKnN1YnhpZHMsCisJCQkJCQkJCVhMb2dSZWNQdHIgY3NuLCBpbnQg cGFnZW5vKTsKK3N0YXRpYyB2b2lkIENTTkxvZ1NldENTTkluU2xvdChUcmFuc2FjdGlvbklk IHhpZCwgWExvZ1JlY1B0ciBjc24sCisJCQkJCQkJICAgaW50IHNsb3Rubyk7CisKKworLyoK KyAqIFJlY29yZCBjb21taXQgTFNOIG9mIGEgdHJhbnNhY3Rpb24gYW5kIGl0cyBzdWJ0cmFu c2FjdGlvbiB0cmVlLgorICoKKyAqIHhpZCBpcyBhIHNpbmdsZSB4aWQgdG8gc2V0IHN0YXR1 cyBmb3IuIFRoaXMgd2lsbCB0eXBpY2FsbHkgYmUgdGhlIHRvcCBsZXZlbAorICogdHJhbnNh Y3Rpb24gSUQgZm9yIGEgdG9wIGxldmVsIGNvbW1pdC4KKyAqCisgKiBzdWJ4aWRzIGlzIGFu IGFycmF5IG9mIHhpZHMgb2YgbGVuZ3RoIG5zdWJ4aWRzLCBpbiBsb2dpY2FsIFhJRCBvcmRl ciwKKyAqIHJlcHJlc2VudGluZyBzdWJ0cmFuc2FjdGlvbnMgaW4gdGhlIHRyZWUgb2YgWElE cy4gSW4gdmFyaW91cyBjYXNlcyBuc3VieGlkcworICogbWF5IGJlIHplcm8uCisgKgorICog Y29tbWl0THNuIGlzIHRoZSBMU04gb2YgdGhlIGNvbW1pdCByZWNvcmQuICBUaGlzIGlzIGN1 cnJlbnRseSBuZXZlciBjYWxsZWQKKyAqIGZvciBhYm9ydGVkIHRyYW5zYWN0aW9ucy4KKyAq Lwordm9pZAorQ1NOTG9nU2V0Q1NOKFRyYW5zYWN0aW9uSWQgeGlkLCBpbnQgbnN1YnhpZHMs IFRyYW5zYWN0aW9uSWQgKnN1YnhpZHMsCisJCQkgWExvZ1JlY1B0ciBjb21taXRMc24pCit7 CisJaW50CQkJcGFnZW5vOworCWludAkJCWkgPSAwOworCWludAkJCW9mZnNldCA9IDA7CisK KwlBc3NlcnQoVHJhbnNhY3Rpb25JZElzVmFsaWQoeGlkKSk7CisKKwlwYWdlbm8gPSBUcmFu c2FjdGlvbklkVG9QYWdlKHhpZCk7CS8qIGdldCBwYWdlIG9mIHBhcmVudCAqLworCWZvciAo OzspCisJeworCQlpbnQJCQludW1fb25fcGFnZSA9IDA7CisKKwkJd2hpbGUgKGkgPCBuc3Vi eGlkcyAmJiBUcmFuc2FjdGlvbklkVG9QYWdlKHN1YnhpZHNbaV0pID09IHBhZ2VubykKKwkJ eworCQkJbnVtX29uX3BhZ2UrKzsKKwkJCWkrKzsKKwkJfQorCisJCUNTTkxvZ1NldFBhZ2VT dGF0dXMoeGlkLAorCQkJCQkJCW51bV9vbl9wYWdlLCBzdWJ4aWRzICsgb2Zmc2V0LAorCQkJ CQkJCWNvbW1pdExzbiwgcGFnZW5vKTsKKwkJaWYgKGkgPj0gbnN1YnhpZHMpCisJCQlicmVh azsKKworCQlvZmZzZXQgPSBpOworCQlwYWdlbm8gPSBUcmFuc2FjdGlvbklkVG9QYWdlKHN1 YnhpZHNbb2Zmc2V0XSk7CisJCXhpZCA9IEludmFsaWRUcmFuc2FjdGlvbklkOworCX0KK30K KworLyoKKyAqIFJlY29yZCB0aGUgZmluYWwgc3RhdGUgb2YgdHJhbnNhY3Rpb24gZW50cmll cyBpbiB0aGUgQ1NOIGxvZyBmb3IgYWxsCisgKiBlbnRyaWVzIG9uIGEgc2luZ2xlIHBhZ2Uu ICBBdG9taWMgb25seSBvbiB0aGlzIHBhZ2UuCisgKgorICogT3RoZXJ3aXNlIEFQSSBpcyBz YW1lIGFzIENTTkxvZ1NldENTTigpCisgKi8KK3N0YXRpYyB2b2lkCitDU05Mb2dTZXRQYWdl U3RhdHVzKFRyYW5zYWN0aW9uSWQgeGlkLCBpbnQgbnN1YnhpZHMsIFRyYW5zYWN0aW9uSWQg KnN1YnhpZHMsCisJCQkJCVhMb2dSZWNQdHIgY29tbWl0THNuLCBpbnQgcGFnZW5vKQorewor CWludAkJCXNsb3RubzsKKwlpbnQJCQlpOworCUxXTG9jawkgICAqbG9jazsKKworCWxvY2sg PSBTaW1wbGVMcnVHZXRCYW5rTG9jayhDc25sb2dDdGwsIHBhZ2Vubyk7CisJTFdMb2NrQWNx dWlyZShsb2NrLCBMV19FWENMVVNJVkUpOworCisJc2xvdG5vID0gU2ltcGxlTHJ1UmVhZFBh Z2UoQ3NubG9nQ3RsLCBwYWdlbm8sIHRydWUsIHhpZCk7CisKKwkvKiBTdWJ0cmFuc2FjdGlv bnMgZmlyc3QsIGlmIG5lZWRlZCAuLi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnN1YnhpZHM7 IGkrKykKKwl7CisJCUFzc2VydChDc25sb2dDdGwtPnNoYXJlZC0+cGFnZV9udW1iZXJbc2xv dG5vXSA9PSBUcmFuc2FjdGlvbklkVG9QYWdlKHN1YnhpZHNbaV0pKTsKKwkJQ1NOTG9nU2V0 Q1NOSW5TbG90KHN1YnhpZHNbaV0sIGNvbW1pdExzbiwgc2xvdG5vKTsKKwl9CisKKwkvKiAu Li4gdGhlbiB0aGUgbWFpbiB0cmFuc2FjdGlvbiAqLworCWlmIChUcmFuc2FjdGlvbklkSXNW YWxpZCh4aWQpKQorCQlDU05Mb2dTZXRDU05JblNsb3QoeGlkLCBjb21taXRMc24sIHNsb3Ru byk7CisKKwlDc25sb2dDdGwtPnNoYXJlZC0+cGFnZV9kaXJ0eVtzbG90bm9dID0gdHJ1ZTsK KworCUxXTG9ja1JlbGVhc2UobG9jayk7Cit9CisKKy8qCisgKiBTZXRzIHRoZSBjb21taXQg c3RhdHVzIG9mIGEgc2luZ2xlIHRyYW5zYWN0aW9uLgorICovCitzdGF0aWMgdm9pZAorQ1NO TG9nU2V0Q1NOSW5TbG90KFRyYW5zYWN0aW9uSWQgeGlkLCBYTG9nUmVjUHRyIGNzbiwgaW50 IHNsb3RubykKK3sKKwlpbnQJCQllbnRyeW5vID0gVHJhbnNhY3Rpb25JZFRvUGdJbmRleCh4 aWQpOworCVhMb2dSZWNQdHIgKnB0cjsKKworCXB0ciA9IChYTG9nUmVjUHRyICopIChDc25s b2dDdGwtPnNoYXJlZC0+cGFnZV9idWZmZXJbc2xvdG5vXSArIGVudHJ5bm8gKiBzaXplb2Yo WExvZ1JlY1B0cikpOworCisJKnB0ciA9IGNzbjsKK30KKworLyoKKyAqIEludGVycm9nYXRl IHRoZSBzdGF0ZSBvZiBhIHRyYW5zYWN0aW9uIGluIHRoZSBsb2cuCisgKgorICogTkI6IHRo aXMgaXMgYSBsb3ctbGV2ZWwgcm91dGluZSBhbmQgaXMgTk9UIHRoZSBwcmVmZXJyZWQgZW50 cnkgcG9pbnQKKyAqIGZvciBtb3N0IHVzZXM7IFRyYW5zYWN0aW9uSWRHZXRYaWRDU04oKSBp biBjc25fc25hcHNob3QuYyBpcyB0aGUKKyAqIGludGVuZGVkIGNhbGxlci4KKyAqLworWExv Z1JlY1B0cgorQ1NOTG9nR2V0Q1NOQnlYaWQoVHJhbnNhY3Rpb25JZCB4aWQpCit7CisJaW50 CQkJcGFnZW5vID0gVHJhbnNhY3Rpb25JZFRvUGFnZSh4aWQpOworCWludAkJCWVudHJ5bm8g PSBUcmFuc2FjdGlvbklkVG9QZ0luZGV4KHhpZCk7CisJaW50CQkJc2xvdG5vOworCVhMb2dS ZWNQdHIgKnB0cjsKKwlYTG9nUmVjUHRyCXhpZF9jc247CisKKwlBc3NlcnQoVHJhbnNhY3Rp b25JZElzVmFsaWQoeGlkKSk7CisKKwkvKiBDYW4ndCBhc2sgYWJvdXQgc3R1ZmYgdGhhdCBt aWdodCBub3QgYmUgYXJvdW5kIGFueW1vcmUgKi8KKwlBc3NlcnQoVHJhbnNhY3Rpb25JZEZv bGxvd3NPckVxdWFscyh4aWQsIFRyYW5zYWN0aW9uWG1pbikpOworCisJLyogbG9jayBpcyBh Y3F1aXJlZCBieSBTaW1wbGVMcnVSZWFkUGFnZV9SZWFkT25seSAqLworCisJc2xvdG5vID0g U2ltcGxlTHJ1UmVhZFBhZ2VfUmVhZE9ubHkoQ3NubG9nQ3RsLCBwYWdlbm8sIHhpZCk7CisJ cHRyID0gKFhMb2dSZWNQdHIgKikgKENzbmxvZ0N0bC0+c2hhcmVkLT5wYWdlX2J1ZmZlcltz bG90bm9dICsgZW50cnlubyAqIHNpemVvZihYTG9nUmVjUHRyKSk7CisJeGlkX2NzbiA9ICpw dHI7CisKKwlMV0xvY2tSZWxlYXNlKFNpbXBsZUxydUdldEJhbmtMb2NrKENzbmxvZ0N0bCwg cGFnZW5vKSk7CisKKwlyZXR1cm4geGlkX2NzbjsKK30KKworLyoKKyAqIE51bWJlciBvZiBz aGFyZWQgQ1NOTG9nIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyBTaXplCitDU05Mb2dTaG1lbUJ1 ZmZlcnModm9pZCkKK3sKKwlyZXR1cm4gTWluKDMyLCBNYXgoMTYsIE5CdWZmZXJzIC8gNTEy KSk7Cit9CisKKy8qCisgKiBSZXNlcnZlIHNoYXJlZCBtZW1vcnkgZm9yIENzbmxvZ0N0bC4K KyAqLworU2l6ZQorQ1NOTG9nU2htZW1TaXplKHZvaWQpCit7CisJLy8gRklYTUU6IHNraXAg aWYgbm90IEluSG90U3RhbmRieT8KKwlyZXR1cm4gU2ltcGxlTHJ1U2htZW1TaXplKENTTkxv Z1NobWVtQnVmZmVycygpLCAwKTsKK30KKworLyoKKyAqIEluaXRpYWxpemF0aW9uIG9mIHNo YXJlZCBtZW1vcnkgZm9yIENTTkxvZy4KKyAqLwordm9pZAorQ1NOTG9nU2htZW1Jbml0KHZv aWQpCit7CisJQ3NubG9nQ3RsLT5QYWdlUHJlY2VkZXMgPSBDU05Mb2dQYWdlUHJlY2VkZXM7 CisJU2ltcGxlTHJ1SW5pdChDc25sb2dDdGwsICJDU05Mb2cgQ3RsIiwgQ1NOTG9nU2htZW1C dWZmZXJzKCksIDAsCisJCQkJICAicGdfY3NuIiwgTFdUUkFOQ0hFX0NTTl9MT0dfQlVGRkVS LAorCQkJCSAgTFdUUkFOQ0hFX0NTTl9MT0dfU0xSVSwgU1lOQ19IQU5ETEVSX05PTkUsIGZh bHNlKTsKKwkvL1NscnVQYWdlUHJlY2VkZXNVbml0VGVzdHMoQ3NubG9nQ3RsLCBTVUJUUkFO U19YQUNUU19QRVJfUEFHRSk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmMgbXVzdCBiZSBjYWxs ZWQgT05DRSBvbiBzeXN0ZW0gaW5zdGFsbC4gIEl0IGNyZWF0ZXMgdGhlIGluaXRpYWwKKyAq IENTTkxvZyBzZWdtZW50LiAgVGhlIHBnX2NzbiBkaXJlY3RvcnkgaXMgYXNzdW1lZCB0byBo YXZlIGJlZW4KKyAqIGNyZWF0ZWQgYnkgaW5pdGRiLCBhbmQgQ1NOTG9nU2htZW1Jbml0IG11 c3QgaGF2ZSBiZWVuIGNhbGxlZCBhbHJlYWR5LgorICoKKyAqIE5vdGU6IGl0J3Mgbm90IHJl YWxseSBuZWNlc3NhcnkgdG8gY3JlYXRlIHRoZSBpbml0aWFsIHNlZ21lbnQgbm93LAorICog c2luY2Ugc2xydS5jIHdvdWxkIGNyZWF0ZSBpdCBvbiBmaXJzdCB3cml0ZSBhbnl3YXkuICBC dXQgd2UgbWF5IGFzIHdlbGwKKyAqIGRvIGl0IHRvIGJlIHN1cmUgdGhlIGRpcmVjdG9yeSBp cyBzZXQgdXAgY29ycmVjdGx5LgorICovCit2b2lkCitCb290U3RyYXBDU05Mb2codm9pZCkK K3sKKwlpbnQJCQlzbG90bm87CisJTFdMb2NrCSAgICpsb2NrOworCisJbG9jayA9IFNpbXBs ZUxydUdldEJhbmtMb2NrKENzbmxvZ0N0bCwgMCk7CisJTFdMb2NrQWNxdWlyZShsb2NrLCBM V19FWENMVVNJVkUpOworCisJLyogQ3JlYXRlIGFuZCB6ZXJvIHRoZSBmaXJzdCBwYWdlIG9m IHRoZSBjb21taXQgbG9nICovCisJc2xvdG5vID0gWmVyb0NTTkxvZ1BhZ2UoMCk7CisKKwkv KiBNYWtlIHN1cmUgaXQncyB3cml0dGVuIG91dCAqLworCVNpbXBsZUxydVdyaXRlUGFnZShD c25sb2dDdGwsIHNsb3Rubyk7CisJQXNzZXJ0KCFDc25sb2dDdGwtPnNoYXJlZC0+cGFnZV9k aXJ0eVtzbG90bm9dKTsKKworCUxXTG9ja1JlbGVhc2UobG9jayk7Cit9CisKKy8qCisgKiBJ bml0aWFsaXplIChvciByZWluaXRpYWxpemUpIGEgcGFnZSBvZiBDU05Mb2cgdG8gemVyb2Vz LgorICoKKyAqIFRoZSBwYWdlIGlzIG5vdCBhY3R1YWxseSB3cml0dGVuLCBqdXN0IHNldCB1 cCBpbiBzaGFyZWQgbWVtb3J5LgorICogVGhlIHNsb3QgbnVtYmVyIG9mIHRoZSBuZXcgcGFn ZSBpcyByZXR1cm5lZC4KKyAqCisgKiBDb250cm9sIGxvY2sgbXVzdCBiZSBoZWxkIGF0IGVu dHJ5LCBhbmQgd2lsbCBiZSBoZWxkIGF0IGV4aXQuCisgKi8KK3N0YXRpYyBpbnQKK1plcm9D U05Mb2dQYWdlKGludCBwYWdlbm8pCit7CisJcmV0dXJuIFNpbXBsZUxydVplcm9QYWdlKENz bmxvZ0N0bCwgcGFnZW5vKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgYSBwYWdlIG9mIENT TkxvZyBiYXNlZCBvbiBwZ194YWN0LgorICoKKyAqIEFsbCBjb21taXR0ZWQgdHJhbnNhY3Rp b25zIGFyZSBzdGFtcGVkIHdpdGggJ2NzbicKKyAqLworc3RhdGljIHZvaWQKK0luaXRDU05M b2dQYWdlKGludCBwYWdlbm8sIFRyYW5zYWN0aW9uSWQgKnhpZCwgVHJhbnNhY3Rpb25JZCBu ZXh0WGlkLCBYTG9nUmVjUHRyIGNzbikKK3sKKwlYTG9nUmVjUHRyCWR1bW15OworCWludAkJ CXNsb3RubzsKKworCXNsb3RubyA9IFplcm9DU05Mb2dQYWdlKHBhZ2Vubyk7CisKKwl3aGls ZSAoKnhpZCA8IG5leHRYaWQgJiYgVHJhbnNhY3Rpb25JZFRvUGFnZSgqeGlkKSA9PSBwYWdl bm8pCisJeworCQlYaWRTdGF0dXMJc3RhdHVzID0gVHJhbnNhY3Rpb25JZEdldFN0YXR1cygq eGlkLCAmZHVtbXkpOworCisJCWlmIChzdGF0dXMgPT0gVFJBTlNBQ1RJT05fU1RBVFVTX0NP TU1JVFRFRCB8fAorCQkJc3RhdHVzID09IFRSQU5TQUNUSU9OX1NUQVRVU19BQk9SVEVEKQor CQkJQ1NOTG9nU2V0Q1NOSW5TbG90KCp4aWQsIGNzbiwgc2xvdG5vKTsKKworCQlUcmFuc2Fj dGlvbklkQWR2YW5jZSgqeGlkKTsKKwl9CisJU2ltcGxlTHJ1WmVyb1BhZ2UoQ3NubG9nQ3Rs LCBwYWdlbm8pOworfQorCisvKgorICogVGhpcyBtdXN0IGJlIGNhbGxlZCBPTkNFIGR1cmlu ZyBwb3N0bWFzdGVyIG9yIHN0YW5kYWxvbmUtYmFja2VuZCBzdGFydHVwLAorICogYWZ0ZXIg U3RhcnR1cFhMT0cgaGFzIGluaXRpYWxpemVkIFNobWVtVmFyaWFibGVDYWNoZS0+bmV4dFhp ZCwgYW5kIGFmdGVyCisgKiBpbml0aWFsaXppbmcgdGhlIENMT0cuCisgKgorICogb2xkZXN0 QWN0aXZlWElEIGlzIHRoZSBvbGRlc3QgWElEIG9mIGFueSBwcmVwYXJlZCB0cmFuc2FjdGlv biwgb3IgbmV4dFhpZAorICogaWYgdGhlcmUgYXJlIG5vbmUuCisgKgorICogQWxsIHRyYW5z YWN0aW9ucyB0aGF0IGhhdmUgYWxyZWFkeSBjb21wbGV0ZWQgYXJlIG1hcmtlZCB3aXRoICdj c24nLiAoJ2NzbicKKyAqIGlzIHN1cHBvc2VkIHRvIGJlIGFuICJvbGRlciB0aGFuIGFueXRo aW5nIHdlJ2xsIGV2ZXIgbmVlZCB0byBjb21wYXJlIHdpdGgiKQorICovCit2b2lkCitTdGFy dHVwQ1NOTG9nKFRyYW5zYWN0aW9uSWQgb2xkZXN0QWN0aXZlWElELCBYTG9nUmVjUHRyIGNz bikKK3sKKwlUcmFuc2FjdGlvbklkIHhpZDsKKwlGdWxsVHJhbnNhY3Rpb25JZCBuZXh0WGlk OworCWludAkJCXN0YXJ0UGFnZTsKKwlpbnQJCQllbmRQYWdlOworCUxXTG9jawkgICAqcHJl dmxvY2sgPSBOVUxMOworCUxXTG9jawkgICAqbG9jazsKKworCS8qCisJICogU2luY2Ugd2Ug ZG9uJ3QgZXhwZWN0IHBnX2NzbiB0byBiZSB2YWxpZCBhY3Jvc3MgY3Jhc2hlcywgd2UgaW5p dGlhbGl6ZQorCSAqIHRoZSBjdXJyZW50bHktYWN0aXZlIHBhZ2UocykgdG8gemVyb2VzIGR1 cmluZyBzdGFydHVwLiBXaGVuZXZlciB3ZQorCSAqIGFkdmFuY2UgaW50byBhIG5ldyBwYWdl LCBFeHRlbmRDU05Mb2cgd2lsbCBsaWtld2lzZSB6ZXJvIHRoZSBuZXcgcGFnZQorCSAqIHdp dGhvdXQgcmVnYXJkIHRvIHdoYXRldmVyIHdhcyBwcmV2aW91c2x5IG9uIGRpc2suCisJICov CisJc3RhcnRQYWdlID0gVHJhbnNhY3Rpb25JZFRvUGFnZShvbGRlc3RBY3RpdmVYSUQpOwor CW5leHRYaWQgPSBUcmFuc2FtVmFyaWFibGVzLT5uZXh0WGlkOworCWVuZFBhZ2UgPSBUcmFu c2FjdGlvbklkVG9QYWdlKFhpZEZyb21GdWxsVHJhbnNhY3Rpb25JZChuZXh0WGlkKSk7CisK KwlBc3NlcnQoVHJhbnNhY3Rpb25JZElzVmFsaWQob2xkZXN0QWN0aXZlWElEKSk7CisJQXNz ZXJ0KEZ1bGxUcmFuc2FjdGlvbklkSXNWYWxpZChuZXh0WGlkKSk7CisKKwl4aWQgPSBvbGRl c3RBY3RpdmVYSUQ7CisJZm9yICg7OykKKwl7CisJCWxvY2sgPSBTaW1wbGVMcnVHZXRCYW5r TG9jayhDc25sb2dDdGwsIHN0YXJ0UGFnZSk7CisJCWlmIChwcmV2bG9jayAhPSBsb2NrKQor CQl7CisJCQlpZiAocHJldmxvY2spCisJCQkJTFdMb2NrUmVsZWFzZShwcmV2bG9jayk7CisJ CQlMV0xvY2tBY3F1aXJlKGxvY2ssIExXX0VYQ0xVU0lWRSk7CisJCQlwcmV2bG9jayA9IGxv Y2s7CisJCX0KKworCQlJbml0Q1NOTG9nUGFnZShzdGFydFBhZ2UsICZ4aWQsIFhpZEZyb21G dWxsVHJhbnNhY3Rpb25JZChuZXh0WGlkKSwgY3NuKTsKKwkJaWYgKHN0YXJ0UGFnZSA9PSBl bmRQYWdlKQorCQkJYnJlYWs7CisKKwkJc3RhcnRQYWdlKys7CisJCS8qIG11c3QgYWNjb3Vu dCBmb3Igd3JhcGFyb3VuZCAqLworCQlpZiAoc3RhcnRQYWdlID4gVHJhbnNhY3Rpb25JZFRv UGFnZShNYXhUcmFuc2FjdGlvbklkKSkKKwkJCXN0YXJ0UGFnZSA9IDA7CisJfQorCisJTFdM b2NrUmVsZWFzZShsb2NrKTsKK30KKworLyoKKyAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgT05D RSBkdXJpbmcgcG9zdG1hc3RlciBvciBzdGFuZGFsb25lLWJhY2tlbmQgc2h1dGRvd24KKyAq Lwordm9pZAorU2h1dGRvd25DU05Mb2codm9pZCkKK3sKKwkvKgorCSAqIEZsdXNoIGRpcnR5 IENTTkxvZyBwYWdlcyB0byBkaXNrLgorCSAqCisJICogVGhpcyBpcyBub3QgYWN0dWFsbHkg bmVjZXNzYXJ5IGZyb20gYSBjb3JyZWN0bmVzcyBwb2ludCBvZiB2aWV3LiBXZSBkbworCSAq IGl0IG1lcmVseSBhcyBhIGRlYnVnZ2luZyBhaWQuCisJICovCisJVFJBQ0VfUE9TVEdSRVNR TF9DU05MT0dfQ0hFQ0tQT0lOVF9TVEFSVChmYWxzZSk7CisJU2ltcGxlTHJ1V3JpdGVBbGwo Q3NubG9nQ3RsLCBmYWxzZSk7CisJVFJBQ0VfUE9TVEdSRVNRTF9DU05MT0dfQ0hFQ0tQT0lO VF9ET05FKGZhbHNlKTsKK30KKworLyoKKyAqIFBlcmZvcm0gYSBjaGVja3BvaW50IC0tLSBl aXRoZXIgZHVyaW5nIHNodXRkb3duLCBvciBvbi10aGUtZmx5CisgKi8KK3ZvaWQKK0NoZWNr UG9pbnRDU05Mb2codm9pZCkKK3sKKwkvKgorCSAqIEZsdXNoIGRpcnR5IENTTkxvZyBwYWdl cyB0byBkaXNrLgorCSAqCisJICogVGhpcyBpcyBub3QgYWN0dWFsbHkgbmVjZXNzYXJ5IGZy b20gYSBjb3JyZWN0bmVzcyBwb2ludCBvZiB2aWV3LiBXZSBkbworCSAqIGl0IG1lcmVseSB0 byBpbXByb3ZlIHRoZSBvZGRzIHRoYXQgd3JpdGluZyBvZiBkaXJ0eSBwYWdlcyBpcyBkb25l IGJ5CisJICogdGhlIGNoZWNrcG9pbnQgcHJvY2VzcyBhbmQgbm90IGJ5IGJhY2tlbmRzLgor CSAqLworCVRSQUNFX1BPU1RHUkVTUUxfQ1NOTE9HX0NIRUNLUE9JTlRfU1RBUlQodHJ1ZSk7 CisJU2ltcGxlTHJ1V3JpdGVBbGwoQ3NubG9nQ3RsLCB0cnVlKTsKKwlUUkFDRV9QT1NUR1JF U1FMX0NTTkxPR19DSEVDS1BPSU5UX0RPTkUodHJ1ZSk7Cit9CisKKy8qCisgKiBNYWtlIHN1 cmUgdGhhdCBDU05Mb2cgaGFzIHJvb20gZm9yIGEgbmV3bHktYWxsb2NhdGVkIFhJRC4KKyAq CisgKiBOQjogdGhpcyBpcyBjYWxsZWQgd2hpbGUgaG9sZGluZyBYaWRHZW5Mb2NrLiAgV2Ug d2FudCBpdCB0byBiZSB2ZXJ5IGZhc3QKKyAqIG1vc3Qgb2YgdGhlIHRpbWU7IGV2ZW4gd2hl biBpdCdzIG5vdCBzbyBmYXN0LCBubyBhY3R1YWwgSS9PIG5lZWQgaGFwcGVuCisgKiB1bmxl c3Mgd2UncmUgZm9yY2VkIHRvIHdyaXRlIG91dCBhIGRpcnR5IGNsb2cgb3IgeGxvZyBwYWdl IHRvIG1ha2Ugcm9vbQorICogaW4gc2hhcmVkIG1lbW9yeS4KKyAqLwordm9pZAorRXh0ZW5k Q1NOTG9nKFRyYW5zYWN0aW9uSWQgbmV3ZXN0WGFjdCkKK3sKKwlpbnQ2NAkJcGFnZW5vOwor CUxXTG9jawkgICAqbG9jazsKKworCS8qCisJICogTm8gd29yayBleGNlcHQgYXQgZmlyc3Qg WElEIG9mIGEgcGFnZS4gIEJ1dCBiZXdhcmU6IGp1c3QgYWZ0ZXIKKwkgKiB3cmFwYXJvdW5k LCB0aGUgZmlyc3QgWElEIG9mIHBhZ2UgemVybyBpcyBGaXJzdE5vcm1hbFRyYW5zYWN0aW9u SWQuCisJICovCisJaWYgKFRyYW5zYWN0aW9uSWRUb1BnSW5kZXgobmV3ZXN0WGFjdCkgIT0g MCAmJgorCQkhVHJhbnNhY3Rpb25JZEVxdWFscyhuZXdlc3RYYWN0LCBGaXJzdE5vcm1hbFRy YW5zYWN0aW9uSWQpKQorCQlyZXR1cm47CisKKwlwYWdlbm8gPSBUcmFuc2FjdGlvbklkVG9Q YWdlKG5ld2VzdFhhY3QpOworCisJbG9jayA9IFNpbXBsZUxydUdldEJhbmtMb2NrKENzbmxv Z0N0bCwgcGFnZW5vKTsKKworCUxXTG9ja0FjcXVpcmUobG9jaywgTFdfRVhDTFVTSVZFKTsK KworCS8qIFplcm8gdGhlIHBhZ2UgYW5kIG1ha2UgYW4gWExPRyBlbnRyeSBhYm91dCBpdCAq LworCVplcm9DU05Mb2dQYWdlKHBhZ2Vubyk7CisKKwlMV0xvY2tSZWxlYXNlKGxvY2spOwor fQorCisvKgorICogUmVtb3ZlIGFsbCBDU05Mb2cgc2VnbWVudHMgYmVmb3JlIHRoZSBvbmUg aG9sZGluZyB0aGUgcGFzc2VkCisgKiB0cmFuc2FjdGlvbiBJRC4KKyAqCisgKiBUaGlzIGlz IG5vcm1hbGx5IGNhbGxlZCBkdXJpbmcgY2hlY2twb2ludCwgd2l0aCBvbGRlc3RYYWN0IGJl aW5nIHRoZQorICogb2xkZXN0IFRyYW5zYWN0aW9uWG1pbiBvZiBhbnkgcnVubmluZyB0cmFu c2FjdGlvbi4KKyAqLwordm9pZAorVHJ1bmNhdGVDU05Mb2coVHJhbnNhY3Rpb25JZCBvbGRl c3RYYWN0KQoreworCWludAkJCWN1dG9mZlBhZ2U7CisKKwkvKgorCSAqIFRoZSBjdXRvZmYg cG9pbnQgaXMgdGhlIHN0YXJ0IG9mIHRoZSBzZWdtZW50IGNvbnRhaW5pbmcgb2xkZXN0WGFj dC4gV2UKKwkgKiBwYXNzIHRoZSAqcGFnZSogY29udGFpbmluZyBvbGRlc3RYYWN0IHRvIFNp bXBsZUxydVRydW5jYXRlLiBXZSBzdGVwCisJICogYmFjayBvbmUgdHJhbnNhY3Rpb24gdG8g YXZvaWQgcGFzc2luZyBhIGN1dG9mZiBwYWdlIHRoYXQgaGFzbid0IGJlZW4KKwkgKiBjcmVh dGVkIHlldCBpbiB0aGUgcmFyZSBjYXNlIHRoYXQgb2xkZXN0WGFjdCB3b3VsZCBiZSB0aGUg Zmlyc3QgaXRlbSBvbgorCSAqIGEgcGFnZSBhbmQgb2xkZXN0WGFjdCA9PSBuZXh0IFhJRC4g IEluIHRoYXQgY2FzZSwgaWYgd2UgZGlkbid0IHN1YnRyYWN0CisJICogb25lLCB3ZSdkIHRy aWdnZXIgU2ltcGxlTHJ1VHJ1bmNhdGUncyB3cmFwYXJvdW5kIGRldGVjdGlvbi4KKwkgKi8K KwlUcmFuc2FjdGlvbklkUmV0cmVhdChvbGRlc3RYYWN0KTsKKwljdXRvZmZQYWdlID0gVHJh bnNhY3Rpb25JZFRvUGFnZShvbGRlc3RYYWN0KTsKKworCVNpbXBsZUxydVRydW5jYXRlKENz bmxvZ0N0bCwgY3V0b2ZmUGFnZSk7Cit9CisKKy8qCisgKiBEZWNpZGUgd2hpY2ggb2YgdHdv IENTTkxvZyBwYWdlIG51bWJlcnMgaXMgIm9sZGVyIiBmb3IgdHJ1bmNhdGlvbgorICogcHVy cG9zZXMuCisgKgorICogV2UgbmVlZCB0byB1c2UgY29tcGFyaXNvbiBvZiBUcmFuc2FjdGlv bklkcyBoZXJlIGluIG9yZGVyIHRvIGRvIHRoZSByaWdodAorICogdGhpbmcgd2l0aCB3cmFw YXJvdW5kIFhJRCBhcml0aG1ldGljLiAgSG93ZXZlciwgaWYgd2UgYXJlIGFza2VkIGFib3V0 CisgKiBwYWdlIG51bWJlciB6ZXJvLCB3ZSBkb24ndCB3YW50IHRvIGhhbmQgSW52YWxpZFRy YW5zYWN0aW9uSWQgdG8KKyAqIFRyYW5zYWN0aW9uSWRQcmVjZWRlczogaXQnbGwgZ2V0IHdl aXJkIGFib3V0IHBlcm1hbmVudCB4YWN0IElEcy4gIFNvLAorICogb2Zmc2V0IGJvdGggeGlk cyBieSBGaXJzdE5vcm1hbFRyYW5zYWN0aW9uSWQgdG8gYXZvaWQgdGhhdC4KKyAqLworc3Rh dGljIGJvb2wKK0NTTkxvZ1BhZ2VQcmVjZWRlcyhpbnQ2NCBwYWdlMSwgaW50NjQgcGFnZTIp Cit7CisJVHJhbnNhY3Rpb25JZCB4aWQxOworCVRyYW5zYWN0aW9uSWQgeGlkMjsKKworCXhp ZDEgPSAoKFRyYW5zYWN0aW9uSWQpIHBhZ2UxKSAqIENTTl9MT0dfWEFDVFNfUEVSX1BBR0U7 CisJeGlkMSArPSBGaXJzdE5vcm1hbFRyYW5zYWN0aW9uSWQ7CisJeGlkMiA9ICgoVHJhbnNh Y3Rpb25JZCkgcGFnZTIpICogQ1NOX0xPR19YQUNUU19QRVJfUEFHRTsKKwl4aWQyICs9IEZp cnN0Tm9ybWFsVHJhbnNhY3Rpb25JZDsKKworCXJldHVybiBUcmFuc2FjdGlvbklkUHJlY2Vk ZXMoeGlkMSwgeGlkMik7Cit9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJh bnNhbS9tZXNvbi5idWlsZCBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL21lc29uLmJ1 aWxkCmluZGV4IDhhMzUyMjU1N2MuLmNmNDFkZjI5NzEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL2FjY2Vzcy90cmFuc2FtL21lc29uLmJ1aWxkCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vz cy90cmFuc2FtL21lc29uLmJ1aWxkCkBAIC0yLDYgKzIsNyBAQAogCiBiYWNrZW5kX3NvdXJj ZXMgKz0gZmlsZXMoCiAgICdjbG9nLmMnLAorICAnY3NuX2xvZy5jJywKICAgJ2NvbW1pdF90 cy5jJywKICAgJ2dlbmVyaWNfeGxvZy5jJywKICAgJ211bHRpeGFjdC5jJywKZGlmZiAtLWdp dCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3RyYW5zYW0uYyBiL3NyYy9iYWNrZW5k L2FjY2Vzcy90cmFuc2FtL3RyYW5zYW0uYwppbmRleCA3NWI1MzI1ZGY4Li45M2M0ZDQ5NWU0 IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS90cmFuc2FtLmMKKysr IGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vdHJhbnNhbS5jCkBAIC0zNzcsNiArMzc3 LDkgQEAgVHJhbnNhY3Rpb25JZExhdGVzdChUcmFuc2FjdGlvbklkIG1haW54aWQsCiAgKiBB bHNvLCBiZWNhdXNlIHdlIGdyb3VwIHRyYW5zYWN0aW9ucyBvbiB0aGUgc2FtZSBjbG9nIHBh Z2UgdG8gY29uc2VydmUKICAqIHN0b3JhZ2UsIHdlIG1pZ2h0IHJldHVybiB0aGUgTFNOIG9m IGEgbGF0ZXIgdHJhbnNhY3Rpb24gdGhhdCBmYWxscyBpbnRvCiAgKiB0aGUgc2FtZSBncm91 cC4KKyAqCisgKiBYWFg6IE5vdyB0aGF0IHdlIGhhdmUgdGhlIENTTi1sb2csIHNob3VsZCB3 ZSB1c2UgdGhhdCBkdXJpbmcgcmVjb3Zlcnk/IE9yCisgKiByZW5hbWUgdGhpcyBmdW5jdGlv biB0byByZWR1Y2UgY29uZnVzaW9uLgogICovCiBYTG9nUmVjUHRyCiBUcmFuc2FjdGlvbklk R2V0Q29tbWl0TFNOKFRyYW5zYWN0aW9uSWQgeGlkKQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tl bmQvYWNjZXNzL3RyYW5zYW0vdHdvcGhhc2UuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFu c2FtL3R3b3BoYXNlLmMKaW5kZXggNDliZTFkZjkxYy4uODcyOWNlMjA1NCAxMDA2NDQKLS0t IGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vdHdvcGhhc2UuYworKysgYi9zcmMvYmFj a2VuZC9hY2Nlc3MvdHJhbnNhbS90d29waGFzZS5jCkBAIC03Nyw2ICs3Nyw3IEBACiAjaW5j bHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlICJhY2Nlc3MvY29tbWl0X3RzLmgiCisjaW5j bHVkZSAiYWNjZXNzL2Nzbl9sb2cuaCIKICNpbmNsdWRlICJhY2Nlc3MvaHR1cF9kZXRhaWxz LmgiCiAjaW5jbHVkZSAiYWNjZXNzL3N1YnRyYW5zLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3Ry YW5zYW0uaCIKQEAgLTE5NTksMjAgKzE5NjAsMTMgQEAgcmVzdG9yZVR3b1BoYXNlRGF0YSh2 b2lkKQogICogT3VyIG90aGVyIHJlc3BvbnNpYmlsaXR5IGlzIHRvIGRldGVybWluZSBhbmQg cmV0dXJuIHRoZSBvbGRlc3QgdmFsaWQgWElECiAgKiBhbW9uZyB0aGUgcHJlcGFyZWQgeGFj dHMgKGlmIG5vbmUsIHJldHVybiBUcmFuc2FtVmFyaWFibGVzLT5uZXh0WGlkKS4KICAqIFRo aXMgaXMgbmVlZGVkIHRvIHN5bmNocm9uaXplIHBnX3N1YnRyYW5zIHN0YXJ0dXAgcHJvcGVy bHkuCi0gKgotICogSWYgeGlkc19wIGFuZCBueGlkc19wIGFyZSBub3QgTlVMTCwgcG9pbnRl ciB0byBhIHBhbGxvYydkIGFycmF5IG9mIGFsbAotICogdG9wLWxldmVsIHhpZHMgaXMgc3Rv cmVkIGluICp4aWRzX3AuIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgYXJyYXkKLSAq IGlzIHJldHVybmVkIGluICpueGlkc19wLgogICovCiBUcmFuc2FjdGlvbklkCi1QcmVzY2Fu UHJlcGFyZWRUcmFuc2FjdGlvbnMoVHJhbnNhY3Rpb25JZCAqKnhpZHNfcCwgaW50ICpueGlk c19wKQorUHJlc2NhblByZXBhcmVkVHJhbnNhY3Rpb25zKHZvaWQpCiB7CiAJRnVsbFRyYW5z YWN0aW9uSWQgbmV4dFhpZCA9IFRyYW5zYW1WYXJpYWJsZXMtPm5leHRYaWQ7CiAJVHJhbnNh Y3Rpb25JZCBvcmlnTmV4dFhpZCA9IFhpZEZyb21GdWxsVHJhbnNhY3Rpb25JZChuZXh0WGlk KTsKIAlUcmFuc2FjdGlvbklkIHJlc3VsdCA9IG9yaWdOZXh0WGlkOwotCVRyYW5zYWN0aW9u SWQgKnhpZHMgPSBOVUxMOwotCWludAkJCW54aWRzID0gMDsKLQlpbnQJCQlhbGxvY3NpemUg PSAwOwogCWludAkJCWk7CiAKIAlMV0xvY2tBY3F1aXJlKFR3b1BoYXNlU3RhdGVMb2NrLCBM V19FWENMVVNJVkUpOwpAQCAtMjAwMCwzNCArMTk5NCwxMCBAQCBQcmVzY2FuUHJlcGFyZWRU cmFuc2FjdGlvbnMoVHJhbnNhY3Rpb25JZCAqKnhpZHNfcCwgaW50ICpueGlkc19wKQogCQlp ZiAoVHJhbnNhY3Rpb25JZFByZWNlZGVzKHhpZCwgcmVzdWx0KSkKIAkJCXJlc3VsdCA9IHhp ZDsKIAotCQlpZiAoeGlkc19wKQotCQl7Ci0JCQlpZiAobnhpZHMgPT0gYWxsb2NzaXplKQot CQkJewotCQkJCWlmIChueGlkcyA9PSAwKQotCQkJCXsKLQkJCQkJYWxsb2NzaXplID0gMTA7 Ci0JCQkJCXhpZHMgPSBwYWxsb2MoYWxsb2NzaXplICogc2l6ZW9mKFRyYW5zYWN0aW9uSWQp KTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJYWxsb2NzaXplID0gYWxsb2NzaXpl ICogMjsKLQkJCQkJeGlkcyA9IHJlcGFsbG9jKHhpZHMsIGFsbG9jc2l6ZSAqIHNpemVvZihU cmFuc2FjdGlvbklkKSk7Ci0JCQkJfQotCQkJfQotCQkJeGlkc1tueGlkcysrXSA9IHhpZDsK LQkJfQotCiAJCXBmcmVlKGJ1Zik7CiAJfQogCUxXTG9ja1JlbGVhc2UoVHdvUGhhc2VTdGF0 ZUxvY2spOwogCi0JaWYgKHhpZHNfcCkKLQl7Ci0JCSp4aWRzX3AgPSB4aWRzOwotCQkqbnhp ZHNfcCA9IG54aWRzOwotCX0KLQogCXJldHVybiByZXN1bHQ7CiB9CiAKZGlmZiAtLWdpdCBh L3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3ZhcnN1cC5jIGIvc3JjL2JhY2tlbmQvYWNj ZXNzL3RyYW5zYW0vdmFyc3VwLmMKaW5kZXggY2ZlOGM2Y2Y4ZC4uYjA3NDQyMzY1NCAxMDA2 NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vdmFyc3VwLmMKKysrIGIvc3Jj L2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vdmFyc3VwLmMKQEAgLTE1LDYgKzE1LDcgQEAKIAog I2luY2x1ZGUgImFjY2Vzcy9jbG9nLmgiCiAjaW5jbHVkZSAiYWNjZXNzL2NvbW1pdF90cy5o IgorI2luY2x1ZGUgImFjY2Vzcy9jc25fbG9nLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3N1YnRy YW5zLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3RyYW5zYW0uaCIKICNpbmNsdWRlICJhY2Nlc3Mv eGFjdC5oIgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGFjdC5j IGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGFjdC5jCmluZGV4IDFlY2NiNzhkZGMu LmNhYjllZGM0OGIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hh Y3QuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94YWN0LmMKQEAgLTIxLDYg KzIxLDcgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgImFjY2Vzcy9jb21t aXRfdHMuaCIKKyNpbmNsdWRlICJhY2Nlc3MvY3NuX2xvZy5oIgogI2luY2x1ZGUgImFjY2Vz cy9tdWx0aXhhY3QuaCIKICNpbmNsdWRlICJhY2Nlc3MvcGFyYWxsZWwuaCIKICNpbmNsdWRl ICJhY2Nlc3Mvc3VidHJhbnMuaCIKQEAgLTIwOSw3ICsyMTAsNiBAQCB0eXBlZGVmIHN0cnVj dCBUcmFuc2FjdGlvblN0YXRlRGF0YQogCWludAkJCXByZXZTZWNDb250ZXh0OyAvKiBwcmV2 aW91cyBTZWN1cml0eVJlc3RyaWN0aW9uQ29udGV4dCAqLwogCWJvb2wJCXByZXZYYWN0UmVh ZE9ubHk7CS8qIGVudHJ5LXRpbWUgeGFjdCByL28gc3RhdGUgKi8KIAlib29sCQlzdGFydGVk SW5SZWNvdmVyeTsJLyogZGlkIHdlIHN0YXJ0IGluIHJlY292ZXJ5PyAqLwotCWJvb2wJCWRp ZExvZ1hpZDsJCS8qIGhhcyB4aWQgYmVlbiBpbmNsdWRlZCBpbiBXQUwgcmVjb3JkPyAqLwog CWludAkJCXBhcmFsbGVsTW9kZUxldmVsOwkvKiBFbnRlci9FeGl0UGFyYWxsZWxNb2RlIGNv dW50ZXIgKi8KIAlib29sCQlwYXJhbGxlbENoaWxkWGFjdDsJLyogaXMgYW55IHBhcmVudCB0 cmFuc2FjdGlvbiBwYXJhbGxlbD8gKi8KIAlib29sCQljaGFpbjsJCQkvKiBzdGFydCBhIG5l dyBibG9jayBhZnRlciB0aGlzIG9uZSAqLwpAQCAtMjQ5LDEzICsyNDksNiBAQCBzdGF0aWMg VHJhbnNhY3Rpb25TdGF0ZURhdGEgVG9wVHJhbnNhY3Rpb25TdGF0ZURhdGEgPSB7CiAJLnRv cFhpZExvZ2dlZCA9IGZhbHNlLAogfTsKIAotLyoKLSAqIHVucmVwb3J0ZWRYaWRzIGhvbGRz IFhJRHMgb2YgYWxsIHN1YnRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgbm90IHlldCBiZWVuCi0g KiByZXBvcnRlZCBpbiBhbiBYTE9HX1hBQ1RfQVNTSUdOTUVOVCByZWNvcmQuCi0gKi8KLXN0 YXRpYyBpbnQJblVucmVwb3J0ZWRYaWRzOwotc3RhdGljIFRyYW5zYWN0aW9uSWQgdW5yZXBv cnRlZFhpZHNbUEdQUk9DX01BWF9DQUNIRURfU1VCWElEU107Ci0KIHN0YXRpYyBUcmFuc2Fj dGlvblN0YXRlIEN1cnJlbnRUcmFuc2FjdGlvblN0YXRlID0gJlRvcFRyYW5zYWN0aW9uU3Rh dGVEYXRhOwogCiAvKgpAQCAtNTMxLDE4ICs1MjQsNiBAQCBHZXRDdXJyZW50RnVsbFRyYW5z YWN0aW9uSWRJZkFueSh2b2lkKQogCXJldHVybiBDdXJyZW50VHJhbnNhY3Rpb25TdGF0ZS0+ ZnVsbFRyYW5zYWN0aW9uSWQ7CiB9CiAKLS8qCi0gKglNYXJrQ3VycmVudFRyYW5zYWN0aW9u SWRMb2dnZWRJZkFueQotICoKLSAqIFJlbWVtYmVyIHRoYXQgdGhlIGN1cnJlbnQgeGlkIC0g aWYgaXQgaXMgYXNzaWduZWQgLSBub3cgaGFzIGJlZW4gd2FsIGxvZ2dlZC4KLSAqLwotdm9p ZAotTWFya0N1cnJlbnRUcmFuc2FjdGlvbklkTG9nZ2VkSWZBbnkodm9pZCkKLXsKLQlpZiAo RnVsbFRyYW5zYWN0aW9uSWRJc1ZhbGlkKEN1cnJlbnRUcmFuc2FjdGlvblN0YXRlLT5mdWxs VHJhbnNhY3Rpb25JZCkpCi0JCUN1cnJlbnRUcmFuc2FjdGlvblN0YXRlLT5kaWRMb2dYaWQg PSB0cnVlOwotfQotCiAvKgogICogSXNTdWJ4YWN0VG9wWGlkTG9nUGVuZGluZwogICoKQEAg LTYzNSw3ICs2MTYsNiBAQCBBc3NpZ25UcmFuc2FjdGlvbklkKFRyYW5zYWN0aW9uU3RhdGUg cykKIHsKIAlib29sCQlpc1N1YlhhY3QgPSAocy0+cGFyZW50ICE9IE5VTEwpOwogCVJlc291 cmNlT3duZXIgY3VycmVudE93bmVyOwotCWJvb2wJCWxvZ191bmtub3duX3RvcCA9IGZhbHNl OwogCiAJLyogQXNzZXJ0IHRoYXQgY2FsbGVyIGRpZG4ndCBzY3JldyB1cCAqLwogCUFzc2Vy dCghRnVsbFRyYW5zYWN0aW9uSWRJc1ZhbGlkKHMtPmZ1bGxUcmFuc2FjdGlvbklkKSk7CkBA IC02NzksMjAgKzY1OSw2IEBAIEFzc2lnblRyYW5zYWN0aW9uSWQoVHJhbnNhY3Rpb25TdGF0 ZSBzKQogCQlwZnJlZShwYXJlbnRzKTsKIAl9CiAKLQkvKgotCSAqIFdoZW4gd2FsX2xldmVs PWxvZ2ljYWwsIGd1YXJhbnRlZSB0aGF0IGEgc3VidHJhbnNhY3Rpb24ncyB4aWQgY2FuIG9u bHkKLQkgKiBiZSBzZWVuIGluIHRoZSBXQUwgc3RyZWFtIGlmIGl0cyB0b3BsZXZlbCB4aWQg aGFzIGJlZW4gbG9nZ2VkIGJlZm9yZS4KLQkgKiBJZiBuZWNlc3Nhcnkgd2UgbG9nIGFuIHhh Y3RfYXNzaWdubWVudCByZWNvcmQgd2l0aCBmZXdlciB0aGFuCi0JICogUEdQUk9DX01BWF9D QUNIRURfU1VCWElEUy4gTm90ZSB0aGF0IGl0IGlzIGZpbmUgaWYgZGlkTG9nWGlkIGlzbid0 IHNldAotCSAqIGZvciBhIHRyYW5zYWN0aW9uIGV2ZW4gdGhvdWdoIGl0IGFwcGVhcnMgaW4g YSBXQUwgcmVjb3JkLCB3ZSBqdXN0IG1pZ2h0Ci0JICogc3VwZXJmbHVvdXNseSBsb2cgc29t ZXRoaW5nLiBUaGF0IGNhbiBoYXBwZW4gd2hlbiBhbiB4aWQgaXMgaW5jbHVkZWQKLQkgKiBz b21ld2hlcmUgaW5zaWRlIGEgd2FsIHJlY29yZCwgYnV0IG5vdCBpbiBYTG9nUmVjb3JkLT54 bF94aWQsIGxpa2UgaW4KLQkgKiB4bF9zdGFuZGJ5X2xvY2tzLgotCSAqLwotCWlmIChpc1N1 YlhhY3QgJiYgWExvZ0xvZ2ljYWxJbmZvQWN0aXZlKCkgJiYKLQkJIVRvcFRyYW5zYWN0aW9u U3RhdGVEYXRhLmRpZExvZ1hpZCkKLQkJbG9nX3Vua25vd25fdG9wID0gdHJ1ZTsKLQogCS8q CiAJICogR2VuZXJhdGUgYSBuZXcgRnVsbFRyYW5zYWN0aW9uSWQgYW5kIHJlY29yZCBpdHMg eGlkIGluIFBHUFJPQyBhbmQKIAkgKiBwZ19zdWJ0cmFucy4KQEAgLTcyOCw1OSArNjk0LDYg QEAgQXNzaWduVHJhbnNhY3Rpb25JZChUcmFuc2FjdGlvblN0YXRlIHMpCiAJWGFjdExvY2tU YWJsZUluc2VydChYaWRGcm9tRnVsbFRyYW5zYWN0aW9uSWQocy0+ZnVsbFRyYW5zYWN0aW9u SWQpKTsKIAogCUN1cnJlbnRSZXNvdXJjZU93bmVyID0gY3VycmVudE93bmVyOwotCi0JLyoK LQkgKiBFdmVyeSBQR1BST0NfTUFYX0NBQ0hFRF9TVUJYSURTIGFzc2lnbmVkIHRyYW5zYWN0 aW9uIGlkcyB3aXRoaW4gZWFjaAotCSAqIHRvcC1sZXZlbCB0cmFuc2FjdGlvbiB3ZSBpc3N1 ZSBhIFdBTCByZWNvcmQgZm9yIHRoZSBhc3NpZ25tZW50LiBXZQotCSAqIGluY2x1ZGUgdGhl IHRvcC1sZXZlbCB4aWQgYW5kIGFsbCB0aGUgc3VieGlkcyB0aGF0IGhhdmUgbm90IHlldCBi ZWVuCi0JICogcmVwb3J0ZWQgdXNpbmcgWExPR19YQUNUX0FTU0lHTk1FTlQgcmVjb3Jkcy4K LQkgKgotCSAqIFRoaXMgaXMgcmVxdWlyZWQgdG8gbGltaXQgdGhlIGFtb3VudCBvZiBzaGFy ZWQgbWVtb3J5IHJlcXVpcmVkIGluIGEgaG90Ci0JICogc3RhbmRieSBzZXJ2ZXIgdG8ga2Vl cCB0cmFjayBvZiBpbi1wcm9ncmVzcyBYSURzLiBTZWUgbm90ZXMgZm9yCi0JICogUmVjb3Jk S25vd25Bc3NpZ25lZFRyYW5zYWN0aW9uSWRzKCkuCi0JICoKLQkgKiBXZSBkb24ndCBrZWVw IHRyYWNrIG9mIHRoZSBpbW1lZGlhdGUgcGFyZW50IG9mIGVhY2ggc3VieGlkLCBvbmx5IHRo ZQotCSAqIHRvcC1sZXZlbCB0cmFuc2FjdGlvbiB0aGF0IGVhY2ggc3VieGFjdCBiZWxvbmdz IHRvLiBUaGlzIGlzIGNvcnJlY3QgaW4KLQkgKiByZWNvdmVyeSBvbmx5IGJlY2F1c2UgYWJv cnRlZCBzdWJ0cmFuc2FjdGlvbnMgYXJlIHNlcGFyYXRlbHkgV0FMCi0JICogbG9nZ2VkLgot CSAqCi0JICogVGhpcyBpcyBjb3JyZWN0IGV2ZW4gZm9yIHRoZSBjYXNlIHdoZXJlIHNldmVy YWwgbGV2ZWxzIGFib3ZlIHVzIGRpZG4ndAotCSAqIGhhdmUgYW4geGlkIGFzc2lnbmVkIGFz IHdlIHJlY3Vyc2VkIHVwIHRvIHRoZW0gYmVmb3JlaGFuZC4KLQkgKi8KLQlpZiAoaXNTdWJY YWN0ICYmIFhMb2dTdGFuZGJ5SW5mb0FjdGl2ZSgpKQotCXsKLQkJdW5yZXBvcnRlZFhpZHNb blVucmVwb3J0ZWRYaWRzXSA9IFhpZEZyb21GdWxsVHJhbnNhY3Rpb25JZChzLT5mdWxsVHJh bnNhY3Rpb25JZCk7Ci0JCW5VbnJlcG9ydGVkWGlkcysrOwotCi0JCS8qCi0JCSAqIGVuc3Vy ZSB0aGlzIHRlc3QgbWF0Y2hlcyBzaW1pbGFyIG9uZSBpbgotCQkgKiBSZWNvdmVyUHJlcGFy ZWRUcmFuc2FjdGlvbnMoKQotCQkgKi8KLQkJaWYgKG5VbnJlcG9ydGVkWGlkcyA+PSBQR1BS T0NfTUFYX0NBQ0hFRF9TVUJYSURTIHx8Ci0JCQlsb2dfdW5rbm93bl90b3ApCi0JCXsKLQkJ CXhsX3hhY3RfYXNzaWdubWVudCB4bHJlYzsKLQotCQkJLyoKLQkJCSAqIHh0b3AgaXMgYWx3 YXlzIHNldCBieSBub3cgYmVjYXVzZSB3ZSByZWN1cnNlIHVwIHRyYW5zYWN0aW9uCi0JCQkg KiBzdGFjayB0byB0aGUgaGlnaGVzdCB1bmFzc2lnbmVkIHhpZCBhbmQgdGhlbiBjb21lIGJh Y2sgZG93bgotCQkJICovCi0JCQl4bHJlYy54dG9wID0gR2V0VG9wVHJhbnNhY3Rpb25JZCgp OwotCQkJQXNzZXJ0KFRyYW5zYWN0aW9uSWRJc1ZhbGlkKHhscmVjLnh0b3ApKTsKLQkJCXhs cmVjLm5zdWJ4YWN0cyA9IG5VbnJlcG9ydGVkWGlkczsKLQotCQkJWExvZ0JlZ2luSW5zZXJ0 KCk7Ci0JCQlYTG9nUmVnaXN0ZXJEYXRhKChjaGFyICopICZ4bHJlYywgTWluU2l6ZU9mWGFj dEFzc2lnbm1lbnQpOwotCQkJWExvZ1JlZ2lzdGVyRGF0YSgoY2hhciAqKSB1bnJlcG9ydGVk WGlkcywKLQkJCQkJCQkgblVucmVwb3J0ZWRYaWRzICogc2l6ZW9mKFRyYW5zYWN0aW9uSWQp KTsKLQotCQkJKHZvaWQpIFhMb2dJbnNlcnQoUk1fWEFDVF9JRCwgWExPR19YQUNUX0FTU0lH Tk1FTlQpOwotCi0JCQluVW5yZXBvcnRlZFhpZHMgPSAwOwotCQkJLyogbWFyayB0b3AsIG5v dCBjdXJyZW50IHhhY3QgYXMgaGF2aW5nIGJlZW4gbG9nZ2VkICovCi0JCQlUb3BUcmFuc2Fj dGlvblN0YXRlRGF0YS5kaWRMb2dYaWQgPSB0cnVlOwotCQl9Ci0JfQogfQogCiAvKgpAQCAt MTQ4MCwxMSArMTM5MywxMSBAQCBSZWNvcmRUcmFuc2FjdGlvbkNvbW1pdCh2b2lkKQogCSAq IHRlbXAgdGFibGVzIHdpbGwgYmUgbG9zdCBhbnl3YXksIHVubG9nZ2VkIHRhYmxlcyB3aWxs IGJlIHRydW5jYXRlZCBhbmQKIAkgKiBIT1QgcHJ1bmluZyB3aWxsIGJlIGRvbmUgYWdhaW4g bGF0ZXIuIChHaXZlbiB0aGUgZm9yZWdvaW5nLCB5b3UgbWlnaHQKIAkgKiB0aGluayB0aGF0 IGl0IHdvdWxkIGJlIHVubmVjZXNzYXJ5IHRvIGVtaXQgdGhlIFhMT0cgcmVjb3JkIGF0IGFs bCBpbgotCSAqIHRoaXMgY2FzZSwgYnV0IHdlIGRvbid0IGN1cnJlbnRseSB0cnkgdG8gZG8g dGhhdC4gIEl0IHdvdWxkIGNlcnRhaW5seQotCSAqIGNhdXNlIHByb2JsZW1zIGF0IGxlYXN0 IGluIEhvdCBTdGFuZGJ5IG1vZGUsIHdoZXJlIHRoZQotCSAqIEtub3duQXNzaWduZWRYaWRz IG1hY2hpbmVyeSByZXF1aXJlcyB0cmFja2luZyBldmVyeSBYSUQgYXNzaWdubWVudC4gIEl0 Ci0JICogbWlnaHQgYmUgT0sgdG8gc2tpcCBpdCBvbmx5IHdoZW4gd2FsX2xldmVsIDwgcmVw bGljYSwgYnV0IGZvciBub3cgd2UKLQkgKiBkb24ndC4pCisJICogdGhpcyBjYXNlLCBidXQg d2UgZG9uJ3QgY3VycmVudGx5IHRyeSB0byBkbyB0aGF0LiAgSXQgbWlnaHQgY2F1c2UKKwkg KiBpbmVmZmljaWVuY2llcyBpbiBIb3QgU3RhbmRieSBtb2RlLCBpZiBub3RoaW5nIGVsc2Us IHdoZXJlIHRoZQorCSAqIGNvbW1pdC9hYm9ydCByZWNvcmRzIGFsbG93IGFkdmFuY2luZyB0 aGUgeG1pbiBob3Jpem9uIGZvciBuZXcKKwkgKiBzbmFwc2hvdHMuIEl0IG1pZ2h0IGJlIE9L IHRvIHNraXAgaXQgb25seSB3aGVuIHdhbF9sZXZlbCA8IHJlcGxpY2EsIGJ1dAorCSAqIGZv ciBub3cgd2UgZG9uJ3QuKQogCSAqCiAJICogSG93ZXZlciwgaWYgd2UncmUgZG9pbmcgY2xl YW51cCBvZiBhbnkgbm9uLXRlbXAgcmVscyBvciBjb21taXR0aW5nIGFueQogCSAqIGNvbW1h bmQgdGhhdCB3YW50ZWQgdG8gZm9yY2Ugc3luYyBjb21taXQsIHRoZW4gd2UgbXVzdCBmbHVz aCBYTE9HCkBAIC0xOTUyLDEzICsxODY1LDYgQEAgQXRTdWJBYm9ydF9jaGlsZFhpZHModm9p ZCkKIAlzLT5jaGlsZFhpZHMgPSBOVUxMOwogCXMtPm5DaGlsZFhpZHMgPSAwOwogCXMtPm1h eENoaWxkWGlkcyA9IDA7Ci0KLQkvKgotCSAqIFdlIGNvdWxkIHBydW5lIHRoZSB1bnJlcG9y dGVkWGlkcyBhcnJheSBoZXJlLiBCdXQgd2UgZG9uJ3QgYm90aGVyLiBUaGF0Ci0JICogd291 bGQgcG90ZW50aWFsbHkgcmVkdWNlIG51bWJlciBvZiBYTE9HX1hBQ1RfQVNTSUdOTUVOVCBy ZWNvcmRzIGJ1dCBpdAotCSAqIHdvdWxkIGxpa2VseSBpbnRyb2R1Y2UgbW9yZSBDUFUgdGlt ZSBpbnRvIHRoZSBtb3JlIGNvbW1vbiBwYXRocywgc28gd2UKLQkgKiBjaG9vc2Ugbm90IHRv IGRvIHRoYXQuCi0JICovCiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTIxNDEsMTIgKzIwNDcs NiBAQCBTdGFydFRyYW5zYWN0aW9uKHZvaWQpCiAJY3VycmVudENvbW1hbmRJZCA9IEZpcnN0 Q29tbWFuZElkOwogCWN1cnJlbnRDb21tYW5kSWRVc2VkID0gZmFsc2U7CiAKLQkvKgotCSAq IGluaXRpYWxpemUgcmVwb3J0ZWQgeGlkIGFjY291bnRpbmcKLQkgKi8KLQluVW5yZXBvcnRl ZFhpZHMgPSAwOwotCXMtPmRpZExvZ1hpZCA9IGZhbHNlOwotCiAJLyoKIAkgKiBtdXN0IGlu aXRpYWxpemUgcmVzb3VyY2UtbWFuYWdlbWVudCBzdHVmZiBmaXJzdAogCSAqLwpAQCAtNjE0 Miw3ICs2MDQyLDcgQEAgeGFjdF9yZWRvX2NvbW1pdCh4bF94YWN0X3BhcnNlZF9jb21taXQg KnBhcnNlZCwKIAlUcmFuc2FjdGlvblRyZWVTZXRDb21taXRUc0RhdGEoeGlkLCBwYXJzZWQt Pm5zdWJ4YWN0cywgcGFyc2VkLT5zdWJ4YWN0cywKIAkJCQkJCQkJICAgY29tbWl0X3RpbWUs IG9yaWdpbl9pZCk7CiAKLQlpZiAoc3RhbmRieVN0YXRlID09IFNUQU5EQllfRElTQUJMRUQp CisJaWYgKCFJbkhvdFN0YW5kYnkpCiAJewogCQkvKgogCQkgKiBNYXJrIHRoZSB0cmFuc2Fj dGlvbiBjb21taXR0ZWQgaW4gcGdfeGFjdC4KQEAgLTYxNjIsNiArNjA2MiwxMiBAQCB4YWN0 X3JlZG9fY29tbWl0KHhsX3hhY3RfcGFyc2VkX2NvbW1pdCAqcGFyc2VkLAogCQkgKi8KIAkJ UmVjb3JkS25vd25Bc3NpZ25lZFRyYW5zYWN0aW9uSWRzKG1heF94aWQpOwogCisJCS8qCisJ CSAqIE1hcmsgdGhlIENTTkxPRyBmaXJzdC4gIFRoZSB0cmFuc2FjdGlvbiB3b24ndCBiZWNv bWUgdmlzaWJsZSB0byBuZXcKKwkJICogc25hcHNob3RzIHVudGlsIHRoZSBjYWxsIHRvIFBy b2NBcnJheVJlY292ZXJ5RW5kVHJhbnNhY3Rpb24oKS4KKwkJICovCisJCUNTTkxvZ1NldENT Tih4aWQsIHBhcnNlZC0+bnN1YnhhY3RzLCBwYXJzZWQtPnN1YnhhY3RzLCBsc24pOworCiAJ CS8qCiAJCSAqIE1hcmsgdGhlIHRyYW5zYWN0aW9uIGNvbW1pdHRlZCBpbiBwZ194YWN0LiBX ZSB1c2UgYXN5bmMgY29tbWl0CiAJCSAqIHByb3RvY29sIGR1cmluZyByZWNvdmVyeSB0byBw cm92aWRlIGluZm9ybWF0aW9uIG9uIGRhdGFiYXNlCkBAIC02MTc0LDkgKzYwODAsOSBAQCB4 YWN0X3JlZG9fY29tbWl0KHhsX3hhY3RfcGFyc2VkX2NvbW1pdCAqcGFyc2VkLAogCQlUcmFu c2FjdGlvbklkQXN5bmNDb21taXRUcmVlKHhpZCwgcGFyc2VkLT5uc3VieGFjdHMsIHBhcnNl ZC0+c3VieGFjdHMsIGxzbik7CiAKIAkJLyoKLQkJICogV2UgbXVzdCBtYXJrIGNsb2cgYmVm b3JlIHdlIHVwZGF0ZSB0aGUgUHJvY0FycmF5LgorCQkgKiBNYWtlIHRoZSBjb21taXQgdmlz aWJsZSB0byBuZXcgc25hcHNob3RzIGluIHRoZSBQcm9jQXJyYXkuCiAJCSAqLwotCQlFeHBp cmVUcmVlS25vd25Bc3NpZ25lZFRyYW5zYWN0aW9uSWRzKHhpZCwgcGFyc2VkLT5uc3VieGFj dHMsIHBhcnNlZC0+c3VieGFjdHMsIG1heF94aWQpOworCQlQcm9jQXJyYXlSZWNvdmVyeUVu ZFRyYW5zYWN0aW9uKG1heF94aWQsIGxzbik7CiAKIAkJLyoKIAkJICogU2VuZCBhbnkgY2Fj aGUgaW52YWxpZGF0aW9ucyBhdHRhY2hlZCB0byB0aGUgY29tbWl0LiBXZSBtdXN0CkBAIC02 MjgyLDcgKzYxODgsNyBAQCB4YWN0X3JlZG9fYWJvcnQoeGxfeGFjdF9wYXJzZWRfYWJvcnQg KnBhcnNlZCwgVHJhbnNhY3Rpb25JZCB4aWQsCiAJCQkJCQkJCSAgcGFyc2VkLT5zdWJ4YWN0 cyk7CiAJQWR2YW5jZU5leHRGdWxsVHJhbnNhY3Rpb25JZFBhc3RYaWQobWF4X3hpZCk7CiAK LQlpZiAoc3RhbmRieVN0YXRlID09IFNUQU5EQllfRElTQUJMRUQpCisJaWYgKCFJbkhvdFN0 YW5kYnkpCiAJewogCQkvKiBNYXJrIHRoZSB0cmFuc2FjdGlvbiBhYm9ydGVkIGluIHBnX3hh Y3QsIG5vIG5lZWQgZm9yIGFzeW5jIHN0dWZmICovCiAJCVRyYW5zYWN0aW9uSWRBYm9ydFRy ZWUoeGlkLCBwYXJzZWQtPm5zdWJ4YWN0cywgcGFyc2VkLT5zdWJ4YWN0cyk7CkBAIC02MzAw LDEzICs2MjA2LDE1IEBAIHhhY3RfcmVkb19hYm9ydCh4bF94YWN0X3BhcnNlZF9hYm9ydCAq cGFyc2VkLCBUcmFuc2FjdGlvbklkIHhpZCwKIAkJICovCiAJCVJlY29yZEtub3duQXNzaWdu ZWRUcmFuc2FjdGlvbklkcyhtYXhfeGlkKTsKIAorCQkvKiBOb3RlOiB3ZSBkb24ndCBuZWVk IHRvIHVwZGF0ZSB0aGUgQ1NOIGxvZyBvbiBhYm9ydC4gKi8KKwogCQkvKiBNYXJrIHRoZSB0 cmFuc2FjdGlvbiBhYm9ydGVkIGluIHBnX3hhY3QsIG5vIG5lZWQgZm9yIGFzeW5jIHN0dWZm ICovCiAJCVRyYW5zYWN0aW9uSWRBYm9ydFRyZWUoeGlkLCBwYXJzZWQtPm5zdWJ4YWN0cywg cGFyc2VkLT5zdWJ4YWN0cyk7CiAKIAkJLyoKIAkJICogV2UgbXVzdCB1cGRhdGUgdGhlIFBy b2NBcnJheSBhZnRlciB3ZSBoYXZlIG1hcmtlZCBjbG9nLgogCQkgKi8KLQkJRXhwaXJlVHJl ZUtub3duQXNzaWduZWRUcmFuc2FjdGlvbklkcyh4aWQsIHBhcnNlZC0+bnN1YnhhY3RzLCBw YXJzZWQtPnN1YnhhY3RzLCBtYXhfeGlkKTsKKwkJUHJvY0FycmF5UmVjb3ZlcnlFbmRUcmFu c2FjdGlvbihtYXhfeGlkLCBsc24pOwogCiAJCS8qCiAJCSAqIFRoZXJlIGFyZSBubyBpbnZh bGlkYXRpb24gbWVzc2FnZXMgdG8gc2VuZCBvciB1bmRvLgpAQCAtNjQxNCwxNCArNjMyMiw2 IEBAIHhhY3RfcmVkbyhYTG9nUmVhZGVyU3RhdGUgKnJlY29yZCkKIAkJCQkJICAgWExvZ1Jl Y0dldE9yaWdpbihyZWNvcmQpKTsKIAkJTFdMb2NrUmVsZWFzZShUd29QaGFzZVN0YXRlTG9j ayk7CiAJfQotCWVsc2UgaWYgKGluZm8gPT0gWExPR19YQUNUX0FTU0lHTk1FTlQpCi0Jewot CQl4bF94YWN0X2Fzc2lnbm1lbnQgKnhscmVjID0gKHhsX3hhY3RfYXNzaWdubWVudCAqKSBY TG9nUmVjR2V0RGF0YShyZWNvcmQpOwotCi0JCWlmIChzdGFuZGJ5U3RhdGUgPj0gU1RBTkRC WV9JTklUSUFMSVpFRCkKLQkJCVByb2NBcnJheUFwcGx5WGlkQXNzaWdubWVudCh4bHJlYy0+ eHRvcCwKLQkJCQkJCQkJCQl4bHJlYy0+bnN1YnhhY3RzLCB4bHJlYy0+eHN1Yik7Ci0JfQog CWVsc2UgaWYgKGluZm8gPT0gWExPR19YQUNUX0lOVkFMSURBVElPTlMpCiAJewogCQkvKgpk aWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZy5jIGIvc3JjL2Jh Y2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZy5jCmluZGV4IDZmNTg0MTJiY2EuLmEzYmEwNGZi YzggMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2cuYworKysg Yi9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9nLmMKQEAgLTQ4LDYgKzQ4LDcgQEAK IAogI2luY2x1ZGUgImFjY2Vzcy9jbG9nLmgiCiAjaW5jbHVkZSAiYWNjZXNzL2NvbW1pdF90 cy5oIgorI2luY2x1ZGUgImFjY2Vzcy9jc25fbG9nLmgiCiAjaW5jbHVkZSAiYWNjZXNzL2hl YXB0b2FzdC5oIgogI2luY2x1ZGUgImFjY2Vzcy9tdWx0aXhhY3QuaCIKICNpbmNsdWRlICJh Y2Nlc3MvcmV3cml0ZWhlYXAuaCIKQEAgLTk1MSw4ICs5NTIsNiBAQCBYTG9nSW5zZXJ0UmVj b3JkKFhMb2dSZWNEYXRhICpyZGF0YSwKIAogCUVORF9DUklUX1NFQ1RJT04oKTsKIAotCU1h cmtDdXJyZW50VHJhbnNhY3Rpb25JZExvZ2dlZElmQW55KCk7Ci0KIAkvKgogCSAqIE1hcmsg dG9wIHRyYW5zYWN0aW9uIGlkIGlzIGxvZ2dlZCAoaWYgbmVlZGVkKSBzbyB0aGF0IHdlIHNo b3VsZCBub3QgdHJ5CiAJICogdG8gbG9nIGl0IGFnYWluIHdpdGggdGhlIG5leHQgV0FMIHJl Y29yZCBpbiB0aGUgY3VycmVudCBzdWJ0cmFuc2FjdGlvbi4KQEAgLTUxODIsNiArNTE4MSw3 IEBAIEJvb3RTdHJhcFhMT0codWludDMyIGRhdGFfY2hlY2tzdW1fdmVyc2lvbikKIAogCS8q IEJvb3RzdHJhcCB0aGUgY29tbWl0IGxvZywgdG9vICovCiAJQm9vdFN0cmFwQ0xPRygpOwor CUJvb3RTdHJhcENTTkxvZygpOwogCUJvb3RTdHJhcENvbW1pdFRzKCk7CiAJQm9vdFN0cmFw U1VCVFJBTlMoKTsKIAlCb290U3RyYXBNdWx0aVhhY3QoKTsKQEAgLTU3ODMsMTYgKzU3ODMs MTYgQEAgU3RhcnR1cFhMT0codm9pZCkKIAkJICovCiAJCWlmIChBcmNoaXZlUmVjb3ZlcnlS ZXF1ZXN0ZWQgJiYgRW5hYmxlSG90U3RhbmRieSkKIAkJewotCQkJVHJhbnNhY3Rpb25JZCAq eGlkczsKLQkJCWludAkJCW54aWRzOworCQkJRnVsbFRyYW5zYWN0aW9uSWQgbGF0ZXN0Q29t cGxldGVkWGlkOwogCiAJCQllcmVwb3J0KERFQlVHMSwKIAkJCQkJKGVycm1zZ19pbnRlcm5h bCgiaW5pdGlhbGl6aW5nIGZvciBob3Qgc3RhbmRieSIpKSk7CisJCQlJbkhvdFN0YW5kYnkg PSB0cnVlOwogCiAJCQlJbml0UmVjb3ZlcnlUcmFuc2FjdGlvbkVudmlyb25tZW50KCk7CiAK IAkJCWlmICh3YXNTaHV0ZG93bikKLQkJCQlvbGRlc3RBY3RpdmVYSUQgPSBQcmVzY2FuUHJl cGFyZWRUcmFuc2FjdGlvbnMoJnhpZHMsICZueGlkcyk7CisJCQkJb2xkZXN0QWN0aXZlWElE ID0gUHJlc2NhblByZXBhcmVkVHJhbnNhY3Rpb25zKCk7CiAJCQllbHNlCiAJCQkJb2xkZXN0 QWN0aXZlWElEID0gY2hlY2tQb2ludC5vbGRlc3RBY3RpdmVYaWQ7CiAJCQlBc3NlcnQoVHJh bnNhY3Rpb25JZElzVmFsaWQob2xkZXN0QWN0aXZlWElEKSk7CkBAIC01ODA3LDM5ICs1ODA3 LDE3IEBAIFN0YXJ0dXBYTE9HKHZvaWQpCiAJCQkgKi8KIAkJCVN0YXJ0dXBTVUJUUkFOUyhv bGRlc3RBY3RpdmVYSUQpOwogCi0JCQkvKgotCQkJICogSWYgd2UncmUgYmVnaW5uaW5nIGF0 IGEgc2h1dGRvd24gY2hlY2twb2ludCwgd2Uga25vdyB0aGF0Ci0JCQkgKiBub3RoaW5nIHdh cyBydW5uaW5nIG9uIHRoZSBwcmltYXJ5IGF0IHRoaXMgcG9pbnQuIFNvIGZha2UtdXAgYW4K LQkJCSAqIGVtcHR5IHJ1bm5pbmcteGFjdHMgcmVjb3JkIGFuZCB1c2UgdGhhdCBoZXJlIGFu ZCBub3cuIFJlY292ZXIKLQkJCSAqIGFkZGl0aW9uYWwgc3RhbmRieSBzdGF0ZSBmb3IgcHJl cGFyZWQgdHJhbnNhY3Rpb25zLgotCQkJICovCi0JCQlpZiAod2FzU2h1dGRvd24pCi0JCQl7 Ci0JCQkJUnVubmluZ1RyYW5zYWN0aW9uc0RhdGEgcnVubmluZzsKLQkJCQlUcmFuc2FjdGlv bklkIGxhdGVzdENvbXBsZXRlZFhpZDsKKwkJCWxhdGVzdENvbXBsZXRlZFhpZCA9IGNoZWNr UG9pbnQubmV4dFhpZDsKKwkJCUZ1bGxUcmFuc2FjdGlvbklkUmV0cmVhdCgmbGF0ZXN0Q29t cGxldGVkWGlkKTsKKwkJCVRyYW5zYW1WYXJpYWJsZXMtPmxhdGVzdENvbXBsZXRlZFhpZCA9 IGxhdGVzdENvbXBsZXRlZFhpZDsKIAotCQkJCS8qIFVwZGF0ZSBwZ19zdWJ0cmFucyBlbnRy aWVzIGZvciBhbnkgcHJlcGFyZWQgdHJhbnNhY3Rpb25zICovCi0JCQkJU3RhbmRieVJlY292 ZXJQcmVwYXJlZFRyYW5zYWN0aW9ucygpOworCQkJU3RhcnR1cENTTkxvZyhvbGRlc3RBY3Rp dmVYSUQsIFJlZG9SZWNQdHIpOwogCi0JCQkJLyoKLQkJCQkgKiBDb25zdHJ1Y3QgYSBSdW5u aW5nVHJhbnNhY3Rpb25zIHNuYXBzaG90IHJlcHJlc2VudGluZyBhCi0JCQkJICogc2h1dCBk b3duIHNlcnZlciwgd2l0aCBvbmx5IHByZXBhcmVkIHRyYW5zYWN0aW9ucyBzdGlsbAotCQkJ CSAqIGFsaXZlLiBXZSdyZSBuZXZlciBvdmVyZmxvd2VkIGF0IHRoaXMgcG9pbnQgYmVjYXVz ZSBhbGwKLQkJCQkgKiBzdWJ4aWRzIGFyZSBsaXN0ZWQgd2l0aCB0aGVpciBwYXJlbnQgcHJl cGFyZWQgdHJhbnNhY3Rpb25zLgotCQkJCSAqLwotCQkJCXJ1bm5pbmcueGNudCA9IG54aWRz OwotCQkJCXJ1bm5pbmcuc3VieGNudCA9IDA7Ci0JCQkJcnVubmluZy5zdWJ4aWRfc3RhdHVz ID0gU1VCWElEU19JTl9TVUJUUkFOUzsKLQkJCQlydW5uaW5nLm5leHRYaWQgPSBYaWRGcm9t RnVsbFRyYW5zYWN0aW9uSWQoY2hlY2tQb2ludC5uZXh0WGlkKTsKLQkJCQlydW5uaW5nLm9s ZGVzdFJ1bm5pbmdYaWQgPSBvbGRlc3RBY3RpdmVYSUQ7Ci0JCQkJbGF0ZXN0Q29tcGxldGVk WGlkID0gWGlkRnJvbUZ1bGxUcmFuc2FjdGlvbklkKGNoZWNrUG9pbnQubmV4dFhpZCk7Ci0J CQkJVHJhbnNhY3Rpb25JZFJldHJlYXQobGF0ZXN0Q29tcGxldGVkWGlkKTsKLQkJCQlBc3Nl cnQoVHJhbnNhY3Rpb25JZElzTm9ybWFsKGxhdGVzdENvbXBsZXRlZFhpZCkpOwotCQkJCXJ1 bm5pbmcubGF0ZXN0Q29tcGxldGVkWGlkID0gbGF0ZXN0Q29tcGxldGVkWGlkOwotCQkJCXJ1 bm5pbmcueGlkcyA9IHhpZHM7Ci0KLQkJCQlQcm9jQXJyYXlBcHBseVJlY292ZXJ5SW5mbygm cnVubmluZyk7Ci0JCQl9CisJCQlQcm9jQXJyYXlVcGRhdGVPbGRlc3RSdW5uaW5nWGlkKG9s ZGVzdEFjdGl2ZVhJRCk7CisKKwkJCS8qIFVwZGF0ZSBwZ19zdWJ0cmFucyBlbnRyaWVzIGZv ciBhbnkgcHJlcGFyZWQgdHJhbnNhY3Rpb25zICovCisJCQlpZiAod2FzU2h1dGRvd24pCisJ CQkJU3RhbmRieVJlY292ZXJQcmVwYXJlZFRyYW5zYWN0aW9ucygpOwogCQl9CiAKIAkJLyoK QEAgLTU5MjMsNyArNTkwMSw3IEBAIFN0YXJ0dXBYTE9HKHZvaWQpCiAJICogVGhpcyBpbmZv cm1hdGlvbiBpcyBub3QgcXVpdGUgbmVlZGVkIHlldCwgYnV0IGl0IGlzIHBvc2l0aW9uZWQg aGVyZSBzbwogCSAqIGFzIHBvdGVudGlhbCBwcm9ibGVtcyBhcmUgZGV0ZWN0ZWQgYmVmb3Jl IGFueSBvbi1kaXNrIGNoYW5nZSBpcyBkb25lLgogCSAqLwotCW9sZGVzdEFjdGl2ZVhJRCA9 IFByZXNjYW5QcmVwYXJlZFRyYW5zYWN0aW9ucyhOVUxMLCBOVUxMKTsKKwlvbGRlc3RBY3Rp dmVYSUQgPSBQcmVzY2FuUHJlcGFyZWRUcmFuc2FjdGlvbnMoKTsKIAogCS8qCiAJICogQWxs b3cgb3JkaW5hcnkgV0FMIHNlZ21lbnQgY3JlYXRpb24gYmVmb3JlIHBvc3NpYmx5IHN3aXRj aGluZyB0byBhIG5ldwpAQCAtNjA4OSw5ICs2MDY3LDE4IEBAIFN0YXJ0dXBYTE9HKHZvaWQp CiAJICogU3RhcnQgdXAgc3VidHJhbnMsIGlmIG5vdCBhbHJlYWR5IGRvbmUgZm9yIGhvdCBz dGFuZGJ5LiAgKGNvbW1pdAogCSAqIHRpbWVzdGFtcHMgYXJlIHN0YXJ0ZWQgYmVsb3csIGlm IG5lY2Vzc2FyeS4pCiAJICovCi0JaWYgKHN0YW5kYnlTdGF0ZSA9PSBTVEFOREJZX0RJU0FC TEVEKQorCWlmICghSW5Ib3RTdGFuZGJ5KQorCXsKIAkJU3RhcnR1cFNVQlRSQU5TKG9sZGVz dEFjdGl2ZVhJRCk7CiAKKwkJLyoKKwkJICogVE9ETzogd2UgZG9uJ3QgbmVlZCB0byB1cGRh dGUgQ1NOIGxvZyBmcm9tIG5vdyBvbiwgYnV0IGl0J3Mgc3RpbGwKKwkJICogcmVxdWlyZWQg Ynkgc25hcHNob3RzIHRoYXQgd2VyZSB0YWtlbiBiZWZvcmUgcmVjb3ZlcnkgZW5kZWQuICBX ZQorCQkgKiBqdXN0IGxldCBpdCBiZSwgYnV0IGl0IHdvdWxkIGJlIG5pY2UgdG8gdHJ1bmNh dGUgaXQgdG8gMCBhZnRlciBhbGwKKwkJICogdGhlIHNuYXBzaG90cyBhcmUgZ29uZS4KKwkJ ICovCisJfQorCiAJLyoKIAkgKiBQZXJmb3JtIGVuZCBvZiByZWNvdmVyeSBhY3Rpb25zIGZv ciBhbnkgU0xSVXMgdGhhdCBuZWVkIGl0LgogCSAqLwpAQCAtNjE3NywxMiArNjE2NCwxMiBA QCBTdGFydHVwWExPRyh2b2lkKQogCSAqIFNodXRkb3duIHRoZSByZWNvdmVyeSBlbnZpcm9u bWVudC4gIFRoaXMgbXVzdCBvY2N1ciBhZnRlcgogCSAqIFJlY292ZXJQcmVwYXJlZFRyYW5z YWN0aW9ucygpIChzZWUgbm90ZXMgaW4gbG9ja190d29waGFzZV9yZWNvdmVyKCkpCiAJICog YW5kIGFmdGVyIHN3aXRjaGluZyBTaGFyZWRSZWNvdmVyeVN0YXRlIHRvIFJFQ09WRVJZX1NU QVRFX0RPTkUgc28gYXMKLQkgKiBhbnkgc2Vzc2lvbiBidWlsZGluZyBhIHNuYXBzaG90IHdp bGwgbm90IHJlbHkgb24gS25vd25Bc3NpZ25lZFhpZHMgYXMKKwkgKiBhbnkgc2Vzc2lvbiBi dWlsZGluZyBhIHNuYXBzaG90IHdpbGwgbm90IHJlbHkgb24gdGhlIENTTiBsb2cgYXMKIAkg KiBSZWNvdmVyeUluUHJvZ3Jlc3MoKSB3b3VsZCByZXR1cm4gZmFsc2UgYXQgdGhpcyBzdGFn ZS4gIFRoaXMgaXMKIAkgKiBwYXJ0aWN1bGFybHkgY3JpdGljYWwgZm9yIHByZXBhcmVkIDJQ QyB0cmFuc2FjdGlvbnMsIHRoYXQgd291bGQgc3RpbGwKIAkgKiBuZWVkIHRvIGJlIGluY2x1 ZGVkIGluIHNuYXBzaG90cyBvbmNlIHJlY292ZXJ5IGhhcyBlbmRlZC4KIAkgKi8KLQlpZiAo c3RhbmRieVN0YXRlICE9IFNUQU5EQllfRElTQUJMRUQpCisJaWYgKEluSG90U3RhbmRieSkK IAkJU2h1dGRvd25SZWNvdmVyeVRyYW5zYWN0aW9uRW52aXJvbm1lbnQoKTsKIAogCS8qCkBA IC02OTU0LDcgKzY5NDEsNyBAQCBDcmVhdGVDaGVja1BvaW50KGludCBmbGFncykKIAkgKiBz dGFydGluZyBzbmFwc2hvdCBvZiBsb2NrcyBhbmQgdHJhbnNhY3Rpb25zLgogCSAqLwogCWlm ICghc2h1dGRvd24gJiYgWExvZ1N0YW5kYnlJbmZvQWN0aXZlKCkpCi0JCWNoZWNrUG9pbnQu b2xkZXN0QWN0aXZlWGlkID0gR2V0T2xkZXN0QWN0aXZlVHJhbnNhY3Rpb25JZCgpOworCQlj aGVja1BvaW50Lm9sZGVzdEFjdGl2ZVhpZCA9IEdldE9sZGVzdEFjdGl2ZVRyYW5zYWN0aW9u SWQodHJ1ZSk7CiAJZWxzZQogCQljaGVja1BvaW50Lm9sZGVzdEFjdGl2ZVhpZCA9IEludmFs aWRUcmFuc2FjdGlvbklkOwogCkBAIC03MzQ2LDcgKzczMzMsMTAgQEAgQ3JlYXRlQ2hlY2tQ b2ludChpbnQgZmxhZ3MpCiAJICogU3RhcnR1cFNVQlRSQU5TIGhhc24ndCBiZWVuIGNhbGxl ZCB5ZXQuCiAJICovCiAJaWYgKCFSZWNvdmVyeUluUHJvZ3Jlc3MoKSkKKwl7CiAJCVRydW5j YXRlU1VCVFJBTlMoR2V0T2xkZXN0VHJhbnNhY3Rpb25JZENvbnNpZGVyZWRSdW5uaW5nKCkp OworCQlUcnVuY2F0ZUNTTkxvZyhHZXRPbGRlc3RUcmFuc2FjdGlvbklkQ29uc2lkZXJlZFJ1 bm5pbmcoKSk7CisJfQogCiAJLyogUmVhbCB3b3JrIGlzIGRvbmU7IGxvZyBhbmQgdXBkYXRl IHN0YXRzLiAqLwogCUxvZ0NoZWNrcG9pbnRFbmQoZmFsc2UpOwpAQCAtNzUxOSw2ICs3NTA5 LDcgQEAgQ2hlY2tQb2ludEd1dHMoWExvZ1JlY1B0ciBjaGVja1BvaW50UmVkbywgaW50IGZs YWdzKQogCVRSQUNFX1BPU1RHUkVTUUxfQlVGRkVSX0NIRUNLUE9JTlRfU1RBUlQoZmxhZ3Mp OwogCUNoZWNrcG9pbnRTdGF0cy5ja3B0X3dyaXRlX3QgPSBHZXRDdXJyZW50VGltZXN0YW1w KCk7CiAJQ2hlY2tQb2ludENMT0coKTsKKwlDaGVja1BvaW50Q1NOTG9nKCk7CiAJQ2hlY2tQ b2ludENvbW1pdFRzKCk7CiAJQ2hlY2tQb2ludFNVQlRSQU5TKCk7CiAJQ2hlY2tQb2ludE11 bHRpWGFjdCgpOwpAQCAtNzgxNSw3ICs3ODA2LDEwIEBAIENyZWF0ZVJlc3RhcnRQb2ludChp bnQgZmxhZ3MpCiAJICogdGhpcyBiZWNhdXNlIFN0YXJ0dXBTVUJUUkFOUyBoYXNuJ3QgYmVl biBjYWxsZWQgeWV0LgogCSAqLwogCWlmIChFbmFibGVIb3RTdGFuZGJ5KQorCXsKIAkJVHJ1 bmNhdGVTVUJUUkFOUyhHZXRPbGRlc3RUcmFuc2FjdGlvbklkQ29uc2lkZXJlZFJ1bm5pbmco KSk7CisJCVRydW5jYXRlQ1NOTG9nKEdldE9sZGVzdFRyYW5zYWN0aW9uSWRDb25zaWRlcmVk UnVubmluZygpKTsKKwl9CiAKIAkvKiBSZWFsIHdvcmsgaXMgZG9uZTsgbG9nIGFuZCB1cGRh dGUgc3RhdHMuICovCiAJTG9nQ2hlY2twb2ludEVuZCh0cnVlKTsKQEAgLTgzMDAsNDEgKzgy OTQsMTcgQEAgeGxvZ19yZWRvKFhMb2dSZWFkZXJTdGF0ZSAqcmVjb3JkKQogCiAJCS8qCiAJ CSAqIElmIHdlIHNlZSBhIHNodXRkb3duIGNoZWNrcG9pbnQsIHdlIGtub3cgdGhhdCBub3Ro aW5nIHdhcyBydW5uaW5nCi0JCSAqIG9uIHRoZSBwcmltYXJ5IGF0IHRoaXMgcG9pbnQuIFNv IGZha2UtdXAgYW4gZW1wdHkgcnVubmluZy14YWN0cwotCQkgKiByZWNvcmQgYW5kIHVzZSB0 aGF0IGhlcmUgYW5kIG5vdy4gUmVjb3ZlciBhZGRpdGlvbmFsIHN0YW5kYnkgc3RhdGUKLQkJ ICogZm9yIHByZXBhcmVkIHRyYW5zYWN0aW9ucy4KKwkJICogb24gdGhlIHByaW1hcnkgYXQg dGhpcyBwb2ludCwgZXhjZXB0IGZvciBwcmVwYXJlZCB0cmFuc2FjdGlvbnMuCiAJCSAqLwot CQlpZiAoc3RhbmRieVN0YXRlID49IFNUQU5EQllfSU5JVElBTElaRUQpCisJCWlmIChJbkhv dFN0YW5kYnkpCiAJCXsKLQkJCVRyYW5zYWN0aW9uSWQgKnhpZHM7Ci0JCQlpbnQJCQlueGlk czsKIAkJCVRyYW5zYWN0aW9uSWQgb2xkZXN0QWN0aXZlWElEOwotCQkJVHJhbnNhY3Rpb25J ZCBsYXRlc3RDb21wbGV0ZWRYaWQ7Ci0JCQlSdW5uaW5nVHJhbnNhY3Rpb25zRGF0YSBydW5u aW5nOwogCi0JCQlvbGRlc3RBY3RpdmVYSUQgPSBQcmVzY2FuUHJlcGFyZWRUcmFuc2FjdGlv bnMoJnhpZHMsICZueGlkcyk7CisJCQlvbGRlc3RBY3RpdmVYSUQgPSBQcmVzY2FuUHJlcGFy ZWRUcmFuc2FjdGlvbnMoKTsKKwkJCVByb2NBcnJheVVwZGF0ZU9sZGVzdFJ1bm5pbmdYaWQo b2xkZXN0QWN0aXZlWElEKTsKIAogCQkJLyogVXBkYXRlIHBnX3N1YnRyYW5zIGVudHJpZXMg Zm9yIGFueSBwcmVwYXJlZCB0cmFuc2FjdGlvbnMgKi8KIAkJCVN0YW5kYnlSZWNvdmVyUHJl cGFyZWRUcmFuc2FjdGlvbnMoKTsKLQotCQkJLyoKLQkJCSAqIENvbnN0cnVjdCBhIFJ1bm5p bmdUcmFuc2FjdGlvbnMgc25hcHNob3QgcmVwcmVzZW50aW5nIGEgc2h1dAotCQkJICogZG93 biBzZXJ2ZXIsIHdpdGggb25seSBwcmVwYXJlZCB0cmFuc2FjdGlvbnMgc3RpbGwgYWxpdmUu IFdlJ3JlCi0JCQkgKiBuZXZlciBvdmVyZmxvd2VkIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSBh bGwgc3VieGlkcyBhcmUgbGlzdGVkCi0JCQkgKiB3aXRoIHRoZWlyIHBhcmVudCBwcmVwYXJl ZCB0cmFuc2FjdGlvbnMuCi0JCQkgKi8KLQkJCXJ1bm5pbmcueGNudCA9IG54aWRzOwotCQkJ cnVubmluZy5zdWJ4Y250ID0gMDsKLQkJCXJ1bm5pbmcuc3VieGlkX3N0YXR1cyA9IFNVQlhJ RFNfSU5fU1VCVFJBTlM7Ci0JCQlydW5uaW5nLm5leHRYaWQgPSBYaWRGcm9tRnVsbFRyYW5z YWN0aW9uSWQoY2hlY2tQb2ludC5uZXh0WGlkKTsKLQkJCXJ1bm5pbmcub2xkZXN0UnVubmlu Z1hpZCA9IG9sZGVzdEFjdGl2ZVhJRDsKLQkJCWxhdGVzdENvbXBsZXRlZFhpZCA9IFhpZEZy b21GdWxsVHJhbnNhY3Rpb25JZChjaGVja1BvaW50Lm5leHRYaWQpOwotCQkJVHJhbnNhY3Rp b25JZFJldHJlYXQobGF0ZXN0Q29tcGxldGVkWGlkKTsKLQkJCUFzc2VydChUcmFuc2FjdGlv bklkSXNOb3JtYWwobGF0ZXN0Q29tcGxldGVkWGlkKSk7Ci0JCQlydW5uaW5nLmxhdGVzdENv bXBsZXRlZFhpZCA9IGxhdGVzdENvbXBsZXRlZFhpZDsKLQkJCXJ1bm5pbmcueGlkcyA9IHhp ZHM7Ci0KLQkJCVByb2NBcnJheUFwcGx5UmVjb3ZlcnlJbmZvKCZydW5uaW5nKTsKIAkJfQog CiAJCS8qIENvbnRyb2xGaWxlLT5jaGVja1BvaW50Q29weSBhbHdheXMgdHJhY2tzIHRoZSBs YXRlc3QgY2twdCBYSUQgKi8KQEAgLTgzOTgsNiArODM2OCwxNiBAQCB4bG9nX3JlZG8oWExv Z1JlYWRlclN0YXRlICpyZWNvcmQpCiAJCQkJCQkJCSAgY2hlY2tQb2ludC5vbGRlc3RYaWQp KQogCQkJU2V0VHJhbnNhY3Rpb25JZExpbWl0KGNoZWNrUG9pbnQub2xkZXN0WGlkLAogCQkJ CQkJCQkgIGNoZWNrUG9pbnQub2xkZXN0WGlkREIpOworCisJCS8qCisJCSAqIFJlbWVtYmVy IHRoZSBvbGRlc3QgWElEIHRoYXQgd2FzIHJ1bm5pbmcgYXQgdGhlIHRpbWUuICBOb3JtYWxs eSwKKwkJICogYWxsIHRyYW5zYWN0aW9uIGFib3J0cyBhbmQgY29tbWl0cyBhcmUgV0FMLWxv Z2dlZCwgc28gb3VyCisJCSAqIG9sZGVzdFJ1bm5pbmdYaWQgdmFsdWUgc2hvdWxkIGJlIHVw LXRvLWRhdGUsIGJ1dCBpZiBub3QsIHRoaXMKKwkJICogYWxsb3dzIHVzIHRvIHJlc3luY2hy b25pemUuCisJCSAqLworCQlpZiAoSW5Ib3RTdGFuZGJ5KQorCQkJUHJvY0FycmF5VXBkYXRl T2xkZXN0UnVubmluZ1hpZChjaGVja1BvaW50Lm9sZGVzdEFjdGl2ZVhpZCk7CisKIAkJLyog Q29udHJvbEZpbGUtPmNoZWNrUG9pbnRDb3B5IGFsd2F5cyB0cmFja3MgdGhlIGxhdGVzdCBj a3B0IFhJRCAqLwogCQlMV0xvY2tBY3F1aXJlKENvbnRyb2xGaWxlTG9jaywgTFdfRVhDTFVT SVZFKTsKIAkJQ29udHJvbEZpbGUtPmNoZWNrUG9pbnRDb3B5Lm5leHRYaWQgPSBjaGVja1Bv aW50Lm5leHRYaWQ7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94 bG9ncmVjb3ZlcnkuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2dyZWNvdmVy eS5jCmluZGV4IGM2OTk0Yjc4MjguLjdiMjQ3NWU0ZTIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2dyZWNvdmVyeS5jCisrKyBiL3NyYy9iYWNrZW5kL2Fj Y2Vzcy90cmFuc2FtL3hsb2dyZWNvdmVyeS5jCkBAIC0xOTc1LDEwICsxOTc1LDkgQEAgQXBw bHlXYWxSZWNvcmQoWExvZ1JlYWRlclN0YXRlICp4bG9ncmVhZGVyLCBYTG9nUmVjb3JkICpy ZWNvcmQsIFRpbWVMaW5lSUQgKnJlcGwKIAlTcGluTG9ja1JlbGVhc2UoJlhMb2dSZWNvdmVy eUN0bC0+aW5mb19sY2spOwogCiAJLyoKLQkgKiBJZiB3ZSBhcmUgYXR0ZW1wdGluZyB0byBl bnRlciBIb3QgU3RhbmRieSBtb2RlLCBwcm9jZXNzIFhJRHMgd2Ugc2VlCisJICogSW4gSG90 IFN0YW5kYnkgbW9kZSwgcHJvY2VzcyBYSURzIHdlIHNlZQogCSAqLwotCWlmIChzdGFuZGJ5 U3RhdGUgPj0gU1RBTkRCWV9JTklUSUFMSVpFRCAmJgotCQlUcmFuc2FjdGlvbklkSXNWYWxp ZChyZWNvcmQtPnhsX3hpZCkpCisJaWYgKEluSG90U3RhbmRieSAmJiBUcmFuc2FjdGlvbklk SXNWYWxpZChyZWNvcmQtPnhsX3hpZCkpCiAJCVJlY29yZEtub3duQXNzaWduZWRUcmFuc2Fj dGlvbklkcyhyZWNvcmQtPnhsX3hpZCk7CiAKIAkvKgpAQCAtMjI1NSw3ICsyMjU0LDcgQEAg Q2hlY2tSZWNvdmVyeUNvbnNpc3RlbmN5KHZvaWQpCiAJICogcnVuPyBJZiBzbywgd2UgY2Fu IHRlbGwgcG9zdG1hc3RlciB0aGF0IHRoZSBkYXRhYmFzZSBpcyBjb25zaXN0ZW50IG5vdywK IAkgKiBlbmFibGluZyBjb25uZWN0aW9ucy4KIAkgKi8KLQlpZiAoc3RhbmRieVN0YXRlID09 IFNUQU5EQllfU05BUFNIT1RfUkVBRFkgJiYKKwlpZiAoSW5Ib3RTdGFuZGJ5ICYmCiAJCSFM b2NhbEhvdFN0YW5kYnlBY3RpdmUgJiYKIAkJcmVhY2hlZENvbnNpc3RlbmN5ICYmCiAJCUlz VW5kZXJQb3N0bWFzdGVyKQpAQCAtMzcwMCw5ICszNjk5LDYgQEAgV2FpdEZvcldBTFRvQmVj b21lQXZhaWxhYmxlKFhMb2dSZWNQdHIgUmVjUHRyLCBib29sIHJhbmRBY2Nlc3MsCiAJCQkJ CQllbG9nKExPRywgIndhaXRpbmcgZm9yIFdBTCB0byBiZWNvbWUgYXZhaWxhYmxlIGF0ICVY LyVYIiwKIAkJCQkJCQkgTFNOX0ZPUk1BVF9BUkdTKFJlY1B0cikpOwogCi0JCQkJCQkvKiBE byBiYWNrZ3JvdW5kIHRhc2tzIHRoYXQgbWlnaHQgYmVuZWZpdCB1cyBsYXRlci4gKi8KLQkJ CQkJCUtub3duQXNzaWduZWRUcmFuc2FjdGlvbklkc0lkbGVNYWludGVuYW5jZSgpOwotCiAJ CQkJCQkodm9pZCkgV2FpdExhdGNoKCZYTG9nUmVjb3ZlcnlDdGwtPnJlY292ZXJ5V2FrZXVw TGF0Y2gsCiAJCQkJCQkJCQkJIFdMX0xBVENIX1NFVCB8IFdMX1RJTUVPVVQgfAogCQkJCQkJ CQkJCSBXTF9FWElUX09OX1BNX0RFQVRILApAQCAtMzk2OCw5ICszOTY0LDYgQEAgV2FpdEZv cldBTFRvQmVjb21lQXZhaWxhYmxlKFhMb2dSZWNQdHIgUmVjUHRyLCBib29sIHJhbmRBY2Nl c3MsCiAJCQkJCQlzdHJlYW1pbmdfcmVwbHlfc2VudCA9IHRydWU7CiAJCQkJCX0KIAotCQkJ CQkvKiBEbyBhbnkgYmFja2dyb3VuZCB0YXNrcyB0aGF0IG1pZ2h0IGJlbmVmaXQgdXMgbGF0 ZXIuICovCi0JCQkJCUtub3duQXNzaWduZWRUcmFuc2FjdGlvbklkc0lkbGVNYWludGVuYW5j ZSgpOwotCiAJCQkJCS8qIFVwZGF0ZSBwZ19zdGF0X3JlY292ZXJ5X3ByZWZldGNoIGJlZm9y ZSBzbGVlcGluZy4gKi8KIAkJCQkJWExvZ1ByZWZldGNoZXJDb21wdXRlU3RhdHMoeGxvZ3By ZWZldGNoZXIpOwogCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94 bG9ndXRpbHMuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2d1dGlscy5jCmlu ZGV4IDUyOTViODVmZTAuLmJmMDhjNjBlOTMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2Fj Y2Vzcy90cmFuc2FtL3hsb2d1dGlscy5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFu c2FtL3hsb2d1dGlscy5jCkBAIC01MCw3ICs1MCw3IEBAIGJvb2wJCWlnbm9yZV9pbnZhbGlk X3BhZ2VzID0gZmFsc2U7CiBib29sCQlJblJlY292ZXJ5ID0gZmFsc2U7CiAKIC8qIEFyZSB3 ZSBpbiBIb3QgU3RhbmRieSBtb2RlPyBPbmx5IHZhbGlkIGluIHN0YXJ0dXAgcHJvY2Vzcywg c2VlIHhsb2d1dGlscy5oICovCi1Ib3RTdGFuZGJ5U3RhdGUgc3RhbmRieVN0YXRlID0gU1RB TkRCWV9ESVNBQkxFRDsKK2Jvb2wJCUluSG90U3RhbmRieSA9IGZhbHNlOwogCiAvKgogICog RHVyaW5nIFhMT0cgcmVwbGF5LCB3ZSBtYXkgc2VlIFhMT0cgcmVjb3JkcyBmb3IgaW5jcmVt ZW50YWwgdXBkYXRlcyBvZgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9z dGFydHVwLmMgYi9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL3N0YXJ0dXAuYwppbmRleCBlZjZm OThlYmNkLi5hOTc1ODY1ZmRkIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9wb3N0bWFzdGVy L3N0YXJ0dXAuYworKysgYi9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL3N0YXJ0dXAuYwpAQCAt MjAzLDcgKzIwMyw3IEBAIHN0YXRpYyB2b2lkCiBTdGFydHVwUHJvY0V4aXQoaW50IGNvZGUs IERhdHVtIGFyZykKIHsKIAkvKiBTaHV0ZG93biB0aGUgcmVjb3ZlcnkgZW52aXJvbm1lbnQg Ki8KLQlpZiAoc3RhbmRieVN0YXRlICE9IFNUQU5EQllfRElTQUJMRUQpCisJaWYgKEluSG90 U3RhbmRieSkKIAkJU2h1dGRvd25SZWNvdmVyeVRyYW5zYWN0aW9uRW52aXJvbm1lbnQoKTsK IH0KIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvcmVwbGljYXRpb24vbG9naWNhbC9kZWNv ZGUuYyBiL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2xvZ2ljYWwvZGVjb2RlLmMKaW5kZXgg ZTczNTc2YWQxMi4uYzRmOWZlZWQ2NCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvcmVwbGlj YXRpb24vbG9naWNhbC9kZWNvZGUuYworKysgYi9zcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9s b2dpY2FsL2RlY29kZS5jCkBAIC0yNzAsMTQgKzI3MCw2IEBAIHhhY3RfZGVjb2RlKExvZ2lj YWxEZWNvZGluZ0NvbnRleHQgKmN0eCwgWExvZ1JlY29yZEJ1ZmZlciAqYnVmKQogCQkJCURl Y29kZUFib3J0KGN0eCwgYnVmLCAmcGFyc2VkLCB4aWQsIHR3b19waGFzZSk7CiAJCQkJYnJl YWs7CiAJCQl9Ci0JCWNhc2UgWExPR19YQUNUX0FTU0lHTk1FTlQ6Ci0KLQkJCS8qCi0JCQkg KiBXZSBhc3NpZ24gc3VieGFjdCB0byB0aGUgdG9wbGV2ZWwgeGFjdCB3aGlsZSBwcm9jZXNz aW5nIGVhY2gKLQkJCSAqIHJlY29yZCBpZiByZXF1aXJlZC4gIFNvLCB3ZSBkb24ndCBuZWVk IHRvIGRvIGFueXRoaW5nIGhlcmUuIFNlZQotCQkJICogTG9naWNhbERlY29kaW5nUHJvY2Vz c1JlY29yZC4KLQkJCSAqLwotCQkJYnJlYWs7CiAJCWNhc2UgWExPR19YQUNUX0lOVkFMSURB VElPTlM6CiAJCQl7CiAJCQkJVHJhbnNhY3Rpb25JZCB4aWQ7CmRpZmYgLS1naXQgYS9zcmMv YmFja2VuZC9yZXBsaWNhdGlvbi9sb2dpY2FsL3NuYXBidWlsZC5jIGIvc3JjL2JhY2tlbmQv cmVwbGljYXRpb24vbG9naWNhbC9zbmFwYnVpbGQuYwppbmRleCBhNmE0ZGEzMjY2Li43MzQ4 NjVjZTYyIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9sb2dpY2FsL3Nu YXBidWlsZC5jCisrKyBiL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2xvZ2ljYWwvc25hcGJ1 aWxkLmMKQEAgLTI3LDcgKzI3LDcgQEAKICAqIHJlbW92ZWQuIFRoaXMgaXMgYWNoaWV2ZWQg YnkgdXNpbmcgdGhlIHJlcGxpY2F0aW9uIHNsb3QgbWVjaGFuaXNtLgogICoKICAqIEFzIHRo ZSBwZXJjZW50YWdlIG9mIHRyYW5zYWN0aW9ucyBtb2RpZnlpbmcgdGhlIGNhdGFsb2cgbm9y bWFsbHkgaXMgZmFpcmx5Ci0gKiBzbWFsbCBpbiBjb21wYXJpc29ucyB0byBvbmVzIG9ubHkg bWFuaXB1bGF0aW5nIHVzZXIgZGF0YSwgd2Uga2VlcCB0cmFjayBvZgorICogc21hbGwgaW4g Y29tcGFyaXNvbiB0byBvbmVzIG9ubHkgbWFuaXB1bGF0aW5nIHVzZXIgZGF0YSwgd2Uga2Vl cCB0cmFjayBvZgogICogdGhlIGNvbW1pdHRlZCBjYXRhbG9nIG1vZGlmeWluZyBvbmVzIGlu c2lkZSBbeG1pbiwgeG1heCkgaW5zdGVhZCBvZiBrZWVwaW5nCiAgKiB0cmFjayBvZiBhbGwg cnVubmluZyB0cmFuc2FjdGlvbnMgbGlrZSBpdCdzIGRvbmUgaW4gYSBub3JtYWwgc25hcHNo b3QuIE5vdGUKICAqIHRoYXQgd2UncmUgZ2VuZXJhbGx5IG9ubHkgbG9va2luZyBhdCB0cmFu c2FjdGlvbnMgdGhhdCBoYXZlIGFjcXVpcmVkIGFuCmRpZmYgLS1naXQgYS9zcmMvYmFja2Vu ZC9zdG9yYWdlL2lwYy9pcGNpLmMgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9pcGNpLmMK aW5kZXggNzc4M2JhODU0Zi4uNDljMmNlZDJkNCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQv c3RvcmFnZS9pcGMvaXBjaS5jCisrKyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL2lwY2ku YwpAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSAiYWNjZXNzL2Nsb2cuaCIKICNpbmNs dWRlICJhY2Nlc3MvY29tbWl0X3RzLmgiCisjaW5jbHVkZSAiYWNjZXNzL2Nzbl9sb2cuaCIK ICNpbmNsdWRlICJhY2Nlc3MvbXVsdGl4YWN0LmgiCiAjaW5jbHVkZSAiYWNjZXNzL25idHJl ZS5oIgogI2luY2x1ZGUgImFjY2Vzcy9zdWJ0cmFucy5oIgpAQCAtMTIxLDYgKzEyMiw3IEBA IENhbGN1bGF0ZVNobWVtU2l6ZShpbnQgKm51bV9zZW1hcGhvcmVzKQogCXNpemUgPSBhZGRf c2l6ZShzaXplLCBYTE9HU2htZW1TaXplKCkpOwogCXNpemUgPSBhZGRfc2l6ZShzaXplLCBY TG9nUmVjb3ZlcnlTaG1lbVNpemUoKSk7CiAJc2l6ZSA9IGFkZF9zaXplKHNpemUsIENMT0dT aG1lbVNpemUoKSk7CisJc2l6ZSA9IGFkZF9zaXplKHNpemUsIENTTkxvZ1NobWVtU2l6ZSgp KTsKIAlzaXplID0gYWRkX3NpemUoc2l6ZSwgQ29tbWl0VHNTaG1lbVNpemUoKSk7CiAJc2l6 ZSA9IGFkZF9zaXplKHNpemUsIFNVQlRSQU5TU2htZW1TaXplKCkpOwogCXNpemUgPSBhZGRf c2l6ZShzaXplLCBUd29QaGFzZVNobWVtU2l6ZSgpKTsKQEAgLTI4NSw2ICsyODcsNyBAQCBD cmVhdGVPckF0dGFjaFNobWVtU3RydWN0cyh2b2lkKQogCVhMb2dQcmVmZXRjaFNobWVtSW5p dCgpOwogCVhMb2dSZWNvdmVyeVNobWVtSW5pdCgpOwogCUNMT0dTaG1lbUluaXQoKTsKKwlD U05Mb2dTaG1lbUluaXQoKTsKIAlDb21taXRUc1NobWVtSW5pdCgpOwogCVNVQlRSQU5TU2ht ZW1Jbml0KCk7CiAJTXVsdGlYYWN0U2htZW1Jbml0KCk7CmRpZmYgLS1naXQgYS9zcmMvYmFj a2VuZC9zdG9yYWdlL2lwYy9wcm9jYXJyYXkuYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBj L3Byb2NhcnJheS5jCmluZGV4IDM2NjEwYTFjN2UuLmM4MmU4ZDhjNDMgMTAwNjQ0Ci0tLSBh L3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL3Byb2NhcnJheS5jCisrKyBiL3NyYy9iYWNrZW5k L3N0b3JhZ2UvaXBjL3Byb2NhcnJheS5jCkBAIC0xOSwyMCArMTksMTAgQEAKICAqIG15UHJv Y0xvY2tzIGxpc3RzLiAgVGhleSBjYW4gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIHJlZ3VsYXIg YmFja2VuZCBQR1BST0NzCiAgKiBhdCBuZWVkIGJ5IGNoZWNraW5nIGZvciBwaWQgPT0gMC4K ICAqCi0gKiBEdXJpbmcgaG90IHN0YW5kYnksIHdlIGFsc28ga2VlcCBhIGxpc3Qgb2YgWElE cyByZXByZXNlbnRpbmcgdHJhbnNhY3Rpb25zCi0gKiB0aGF0IGFyZSBrbm93biB0byBiZSBy dW5uaW5nIG9uIHRoZSBwcmltYXJ5IChvciBtb3JlIHByZWNpc2VseSwgd2VyZSBydW5uaW5n Ci0gKiBhcyBvZiB0aGUgY3VycmVudCBwb2ludCBpbiB0aGUgV0FMIHN0cmVhbSkuICBUaGlz IGxpc3QgaXMga2VwdCBpbiB0aGUKLSAqIEtub3duQXNzaWduZWRYaWRzIGFycmF5LCBhbmQg aXMgdXBkYXRlZCBieSB3YXRjaGluZyB0aGUgc2VxdWVuY2Ugb2YKLSAqIGFycml2aW5nIFhJ RHMuICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGlmIHdlIGxlYXZlIHRob3NlIFhJRHMg b3V0IG9mCi0gKiBzbmFwc2hvdHMgdGFrZW4gZm9yIHN0YW5kYnkgcXVlcmllcywgdGhlbiB0 aGV5IHdpbGwgYXBwZWFyIHRvIGJlIGFscmVhZHkKLSAqIGNvbXBsZXRlLCBsZWFkaW5nIHRv IE1WQ0MgZmFpbHVyZXMuICBOb3RlIHRoYXQgaW4gaG90IHN0YW5kYnksIHRoZSBQR1BST0MK LSAqIGFycmF5IHJlcHJlc2VudHMgc3RhbmRieSBwcm9jZXNzZXMsIHdoaWNoIGJ5IGRlZmlu aXRpb24gYXJlIG5vdCBydW5uaW5nCi0gKiB0cmFuc2FjdGlvbnMgdGhhdCBoYXZlIFhJRHMu Ci0gKgotICogSXQgaXMgcGVyaGFwcyBwb3NzaWJsZSBmb3IgYSBiYWNrZW5kIG9uIHRoZSBw cmltYXJ5IHRvIHRlcm1pbmF0ZSB3aXRob3V0Ci0gKiB3cml0aW5nIGFuIGFib3J0IHJlY29y ZCBmb3IgaXRzIHRyYW5zYWN0aW9uLiAgV2hpbGUgdGhhdCBzaG91bGRuJ3QgcmVhbGx5Ci0g KiBoYXBwZW4sIGl0IHdvdWxkIHRpZSB1cCBLbm93bkFzc2lnbmVkWGlkcyBpbmRlZmluaXRl bHksIHNvIHdlIHByb3RlY3QKLSAqIG91cnNlbHZlcyBieSBwcnVuaW5nIHRoZSBhcnJheSB3 aGVuIGEgdmFsaWQgbGlzdCBvZiBydW5uaW5nIFhJRHMgYXJyaXZlcy4KKyAqIER1cmluZyBo b3Qgc3RhbmRieSwgd2UgZG9uJ3QgaGF2ZSBQR1BST0MgZW50cmllcyByZXByZXNlbnRpbmcg dHJhbnNhY3Rpb25zCisgKiBydW5uaW5nIGluIHRoZSBwcmltYXJ5LiAgSW4gc25hcHNob3Rz IHRha2VuIGR1cmluZyByZWNvdmVyeSwgdGhlIHNuYXBzaG90CisgKiBjb250YWlucyBhIENv bW1pdC1TZXF1ZW5jZSBOdW1iZXIgKENTTikgd2hpY2ggaXMgdXNlZCB0byBkZXRlcm1pbmUg d2hpY2gKKyAqIFhJRHMgYXJlIHN0aWxsIGNvbnNpZGVyZWQgYXMgcnVubmluZyBieSB0aGUg c25hcHNob3QuCiAgKgogICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk2LTIwMjQsIFBv c3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3VwCiAgKiBQb3J0aW9ucyBDb3B5cmln aHQgKGMpIDE5OTQsIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQpA QCAtNDcsNiArMzcsNyBAQAogCiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAKKyNpbmNsdWRlICJh Y2Nlc3MvY3NuX2xvZy5oIgogI2luY2x1ZGUgImFjY2Vzcy9zdWJ0cmFucy5oIgogI2luY2x1 ZGUgImFjY2Vzcy90cmFuc2FtLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3R3b3BoYXNlLmgiCkBA IC03MywyMiArNjQsOCBAQCB0eXBlZGVmIHN0cnVjdCBQcm9jQXJyYXlTdHJ1Y3QKIAlpbnQJ CQludW1Qcm9jczsJCS8qIG51bWJlciBvZiB2YWxpZCBwcm9jcyBlbnRyaWVzICovCiAJaW50 CQkJbWF4UHJvY3M7CQkvKiBhbGxvY2F0ZWQgc2l6ZSBvZiBwcm9jcyBhcnJheSAqLwogCi0J LyoKLQkgKiBLbm93biBhc3NpZ25lZCBYSURzIGhhbmRsaW5nCi0JICovCi0JaW50CQkJbWF4 S25vd25Bc3NpZ25lZFhpZHM7CS8qIGFsbG9jYXRlZCBzaXplIG9mIGFycmF5ICovCi0JaW50 CQkJbnVtS25vd25Bc3NpZ25lZFhpZHM7CS8qIGN1cnJlbnQgIyBvZiB2YWxpZCBlbnRyaWVz ICovCi0JaW50CQkJdGFpbEtub3duQXNzaWduZWRYaWRzOwkvKiBpbmRleCBvZiBvbGRlc3Qg dmFsaWQgZWxlbWVudCAqLwotCWludAkJCWhlYWRLbm93bkFzc2lnbmVkWGlkczsJLyogaW5k ZXggb2YgbmV3ZXN0IGVsZW1lbnQsICsgMSAqLwotCi0JLyoKLQkgKiBIaWdoZXN0IHN1Ynhp ZCB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBLbm93bkFzc2lnbmVkWGlkcyBhcnJheSB0 bwotCSAqIHByZXZlbnQgb3ZlcmZsb3c7IG9yIEludmFsaWRUcmFuc2FjdGlvbklkIGlmIG5v bmUuICBXZSB0cmFjayB0aGlzIGZvcgotCSAqIHNpbWlsYXIgcmVhc29ucyB0byB0cmFja2lu ZyBvdmVyZmxvd2luZyBjYWNoZWQgc3VieGlkcyBpbiBQR1BST0MKLQkgKiBlbnRyaWVzLiAg TXVzdCBob2xkIGV4Y2x1c2l2ZSBQcm9jQXJyYXlMb2NrIHRvIGNoYW5nZSB0aGlzLCBhbmQg c2hhcmVkCi0JICogbG9jayB0byByZWFkIGl0LgotCSAqLwotCVRyYW5zYWN0aW9uSWQgbGFz dE92ZXJmbG93ZWRYaWQ7CisJLyogSW4gcmVjb3ZlcnksIG9sZGVzdCBYSUQgdGhhdCBjb3Vs ZCBiZSBzdGlsbCBydW5uaW5nIGluIHByaW1hcnkgKi8KKwlUcmFuc2FjdGlvbklkIG9sZGVz dF9ydW5uaW5nX3ByaW1hcnlfeGlkOwogCiAJLyogb2xkZXN0IHhtaW4gb2YgYW55IHJlcGxp Y2F0aW9uIHNsb3QgKi8KIAlUcmFuc2FjdGlvbklkIHJlcGxpY2F0aW9uX3Nsb3RfeG1pbjsK QEAgLTk5LDYgKzc2LDIxIEBAIHR5cGVkZWYgc3RydWN0IFByb2NBcnJheVN0cnVjdAogCWlu dAkJCXBncHJvY25vc1tGTEVYSUJMRV9BUlJBWV9NRU1CRVJdOwogfSBQcm9jQXJyYXlTdHJ1 Y3Q7CiAKKyNkZWZpbmUgUFJPQ0FSUkFZX01BWFBST0NTCShNYXhCYWNrZW5kcyArIG1heF9w cmVwYXJlZF94YWN0cykKKworLyoKKyAqIFRPVEFMX01BWF9DQUNIRURfU1VCWElEUyBpcyB0 aGUgdG90YWwgbnVtYmVyIG9mIFhJRHMgdGhhdCBmaXRzIGluIHRoZSBwcm9jCisgKiBhcnJh eSwgYXMgdG9wIFhJRHMgYW5kIGluIHRoZSBzdWJ4aWRzIGNhY2hlcy4KKyAqCisgKiBMb2Nh bCBkYXRhIHN0cnVjdHVyZXMgYXJlIGFsc28gY3JlYXRlZCBpbiB2YXJpb3VzIGJhY2tlbmRz IGR1cmluZworICogR2V0U25hcHNob3REYXRhKCksIFRyYW5zYWN0aW9uSWRJc0luUHJvZ3Jl c3MoKSBhbmQKKyAqIEdldFJ1bm5pbmdUcmFuc2FjdGlvbkRhdGEoKS4gQWxsIG9mIHRoZSBt YWluIHN0cnVjdHVyZXMgY3JlYXRlZCBpbiB0aG9zZQorICogZnVuY3Rpb25zIG11c3QgYmUg aWRlbnRpY2FsbHkgc2l6ZWQsIHNpbmNlIHdlIG1heSBhdCB0aW1lcyBjb3B5IHRoZSB3aG9s ZQorICogb2YgdGhlIGRhdGEgc3RydWN0dXJlcyBhcm91bmQuCisgKi8KKyNkZWZpbmUgVE9U QUxfTUFYX0NBQ0hFRF9TVUJYSURTIFwKKwkoKFBHUFJPQ19NQVhfQ0FDSEVEX1NVQlhJRFMg KyAxKSAqIFBST0NBUlJBWV9NQVhQUk9DUykKKwogLyoKICAqIFN0YXRlIGZvciB0aGUgR2xv YmFsVmlzVGVzdCogZmFtaWx5IG9mIGZ1bmN0aW9ucy4gVGhvc2UgZnVuY3Rpb25zIGNhbgog ICogZS5nLiBiZSB1c2VkIHRvIGRlY2lkZSBpZiBhIGRlbGV0ZWQgcm93IGNhbiBiZSByZW1v dmVkIHdpdGhvdXQgdmlvbGF0aW5nCkBAIC0yNTQsMTcgKzI0Niw2IEBAIHR5cGVkZWYgZW51 bSBHbG9iYWxWaXNIb3Jpem9uS2luZAogCVZJU0hPUklaT05fVEVNUCwKIH0gR2xvYmFsVmlz SG9yaXpvbktpbmQ7CiAKLS8qCi0gKiBSZWFzb24gY29kZXMgZm9yIEtub3duQXNzaWduZWRY aWRzQ29tcHJlc3MoKS4KLSAqLwotdHlwZWRlZiBlbnVtIEtBWENvbXByZXNzUmVhc29uCi17 Ci0JS0FYX05PX1NQQUNFLAkJCQkvKiBuZWVkIHRvIGZyZWUgdXAgc3BhY2UgYXQgYXJyYXkg ZW5kICovCi0JS0FYX1BSVU5FLAkJCQkJLyogd2UganVzdCBwcnVuZWQgb2xkIGVudHJpZXMg Ki8KLQlLQVhfVFJBTlNBQ1RJT05fRU5ELAkJLyogd2UganVzdCBjb21taXR0ZWQvcmVtb3Zl ZCBzb21lIFhJRHMgKi8KLQlLQVhfU1RBUlRVUF9QUk9DRVNTX0lETEUsCS8qIHN0YXJ0dXAg cHJvY2VzcyBpcyBhYm91dCB0byBzbGVlcCAqLwotfSBLQVhDb21wcmVzc1JlYXNvbjsKLQog CiBzdGF0aWMgUHJvY0FycmF5U3RydWN0ICpwcm9jQXJyYXk7CiAKQEAgLTI3OCwxNyArMjU5 LDggQEAgc3RhdGljIFRyYW5zYWN0aW9uSWQgY2FjaGVkWGlkSXNOb3RJblByb2dyZXNzID0g SW52YWxpZFRyYW5zYWN0aW9uSWQ7CiAvKgogICogQm9va2tlZXBpbmcgZm9yIHRyYWNraW5n IGVtdWxhdGVkIHRyYW5zYWN0aW9ucyBpbiByZWNvdmVyeQogICovCi1zdGF0aWMgVHJhbnNh Y3Rpb25JZCAqS25vd25Bc3NpZ25lZFhpZHM7Ci1zdGF0aWMgYm9vbCAqS25vd25Bc3NpZ25l ZFhpZHNWYWxpZDsKIHN0YXRpYyBUcmFuc2FjdGlvbklkIGxhdGVzdE9ic2VydmVkWGlkID0g SW52YWxpZFRyYW5zYWN0aW9uSWQ7CiAKLS8qCi0gKiBJZiB3ZSdyZSBpbiBTVEFOREJZX1NO QVBTSE9UX1BFTkRJTkcgc3RhdGUsIHN0YW5kYnlTbmFwc2hvdFBlbmRpbmdYbWluIGlzCi0g KiB0aGUgaGlnaGVzdCB4aWQgdGhhdCBtaWdodCBzdGlsbCBiZSBydW5uaW5nIHRoYXQgd2Ug ZG9uJ3QgaGF2ZSBpbgotICogS25vd25Bc3NpZ25lZFhpZHMuCi0gKi8KLXN0YXRpYyBUcmFu c2FjdGlvbklkIHN0YW5kYnlTbmFwc2hvdFBlbmRpbmdYbWluOwotCiAvKgogICogU3RhdGUg Zm9yIHZpc2liaWxpdHkgY2hlY2tzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiByZWxhdGlvbnMu IFNlZSBzdHJ1Y3QKICAqIEdsb2JhbFZpc1N0YXRlIGZvciBkZXRhaWxzLiBBcyBzaGFyZWQs IGNhdGFsb2csIG5vcm1hbCBhbmQgdGVtcG9yYXJ5CkBAIC0zMTUsNyArMjg3LDcgQEAgc3Rh dGljIGxvbmcgeGNfYnlfbXlfeGFjdCA9IDA7CiBzdGF0aWMgbG9uZyB4Y19ieV9sYXRlc3Rf eGlkID0gMDsKIHN0YXRpYyBsb25nIHhjX2J5X21haW5feGlkID0gMDsKIHN0YXRpYyBsb25n IHhjX2J5X2NoaWxkX3hpZCA9IDA7Ci1zdGF0aWMgbG9uZyB4Y19ieV9rbm93bl9hc3NpZ25l ZCA9IDA7CitzdGF0aWMgbG9uZyB4Y19kdXJpbmdfcmVjb3ZlcnkgPSAwOwogc3RhdGljIGxv bmcgeGNfbm9fb3ZlcmZsb3cgPSAwOwogc3RhdGljIGxvbmcgeGNfc2xvd19hbnN3ZXIgPSAw OwogCkBAIC0zMjUsNyArMjk3LDcgQEAgc3RhdGljIGxvbmcgeGNfc2xvd19hbnN3ZXIgPSAw OwogI2RlZmluZSB4Y19ieV9sYXRlc3RfeGlkX2luYygpCQkoeGNfYnlfbGF0ZXN0X3hpZCsr KQogI2RlZmluZSB4Y19ieV9tYWluX3hpZF9pbmMoKQkJKHhjX2J5X21haW5feGlkKyspCiAj ZGVmaW5lIHhjX2J5X2NoaWxkX3hpZF9pbmMoKQkJKHhjX2J5X2NoaWxkX3hpZCsrKQotI2Rl ZmluZSB4Y19ieV9rbm93bl9hc3NpZ25lZF9pbmMoKQkoeGNfYnlfa25vd25fYXNzaWduZWQr KykKKyNkZWZpbmUgeGNfZHVyaW5nX3JlY292ZXJ5X2luYygpCSh4Y19kdXJpbmdfcmVjb3Zl cnkrKykKICNkZWZpbmUgeGNfbm9fb3ZlcmZsb3dfaW5jKCkJCSh4Y19ub19vdmVyZmxvdysr KQogI2RlZmluZSB4Y19zbG93X2Fuc3dlcl9pbmMoKQkJKHhjX3Nsb3dfYW5zd2VyKyspCiAK QEAgLTMzOCwyOCArMzEwLDEyIEBAIHN0YXRpYyB2b2lkIERpc3BsYXlYaWRDYWNoZSh2b2lk KTsKICNkZWZpbmUgeGNfYnlfbGF0ZXN0X3hpZF9pbmMoKQkJKCh2b2lkKSAwKQogI2RlZmlu ZSB4Y19ieV9tYWluX3hpZF9pbmMoKQkJKCh2b2lkKSAwKQogI2RlZmluZSB4Y19ieV9jaGls ZF94aWRfaW5jKCkJCSgodm9pZCkgMCkKLSNkZWZpbmUgeGNfYnlfa25vd25fYXNzaWduZWRf aW5jKCkJKCh2b2lkKSAwKQorI2RlZmluZSB4Y19kdXJpbmdfcmVjb3ZlcnlfaW5jKCkJKCh2 b2lkKSAwKQogI2RlZmluZSB4Y19ub19vdmVyZmxvd19pbmMoKQkJKCh2b2lkKSAwKQogI2Rl ZmluZSB4Y19zbG93X2Fuc3dlcl9pbmMoKQkJKCh2b2lkKSAwKQogI2VuZGlmCQkJCQkJCS8q IFhJRENBQ0hFX0RFQlVHICovCiAKLS8qIFByaW1pdGl2ZXMgZm9yIEtub3duQXNzaWduZWRY aWRzIGFycmF5IGhhbmRsaW5nIGZvciBzdGFuZGJ5ICovCi1zdGF0aWMgdm9pZCBLbm93bkFz c2lnbmVkWGlkc0NvbXByZXNzKEtBWENvbXByZXNzUmVhc29uIHJlYXNvbiwgYm9vbCBoYXZl TG9jayk7Ci1zdGF0aWMgdm9pZCBLbm93bkFzc2lnbmVkWGlkc0FkZChUcmFuc2FjdGlvbklk IGZyb21feGlkLCBUcmFuc2FjdGlvbklkIHRvX3hpZCwKLQkJCQkJCQkJIGJvb2wgZXhjbHVz aXZlX2xvY2spOwotc3RhdGljIGJvb2wgS25vd25Bc3NpZ25lZFhpZHNTZWFyY2goVHJhbnNh Y3Rpb25JZCB4aWQsIGJvb2wgcmVtb3ZlKTsKLXN0YXRpYyBib29sIEtub3duQXNzaWduZWRY aWRFeGlzdHMoVHJhbnNhY3Rpb25JZCB4aWQpOwotc3RhdGljIHZvaWQgS25vd25Bc3NpZ25l ZFhpZHNSZW1vdmUoVHJhbnNhY3Rpb25JZCB4aWQpOwotc3RhdGljIHZvaWQgS25vd25Bc3Np Z25lZFhpZHNSZW1vdmVUcmVlKFRyYW5zYWN0aW9uSWQgeGlkLCBpbnQgbnN1YnhpZHMsCi0J CQkJCQkJCQkJVHJhbnNhY3Rpb25JZCAqc3VieGlkcyk7Ci1zdGF0aWMgdm9pZCBLbm93bkFz c2lnbmVkWGlkc1JlbW92ZVByZWNlZGluZyhUcmFuc2FjdGlvbklkIHJlbW92ZVhpZCk7Ci1z dGF0aWMgaW50CUtub3duQXNzaWduZWRYaWRzR2V0KFRyYW5zYWN0aW9uSWQgKnhhcnJheSwg VHJhbnNhY3Rpb25JZCB4bWF4KTsKLXN0YXRpYyBpbnQJS25vd25Bc3NpZ25lZFhpZHNHZXRB bmRTZXRYbWluKFRyYW5zYWN0aW9uSWQgKnhhcnJheSwKLQkJCQkJCQkJCQkgICBUcmFuc2Fj dGlvbklkICp4bWluLAotCQkJCQkJCQkJCSAgIFRyYW5zYWN0aW9uSWQgeG1heCk7Ci1zdGF0 aWMgVHJhbnNhY3Rpb25JZCBLbm93bkFzc2lnbmVkWGlkc0dldE9sZGVzdFhtaW4odm9pZCk7 Ci1zdGF0aWMgdm9pZCBLbm93bkFzc2lnbmVkWGlkc0Rpc3BsYXkoaW50IHRyYWNlX2xldmVs KTsKLXN0YXRpYyB2b2lkIEtub3duQXNzaWduZWRYaWRzUmVzZXQodm9pZCk7CisKIHN0YXRp YyBpbmxpbmUgdm9pZCBQcm9jQXJyYXlFbmRUcmFuc2FjdGlvbkludGVybmFsKFBHUFJPQyAq cHJvYywgVHJhbnNhY3Rpb25JZCBsYXRlc3RYaWQpOwogc3RhdGljIHZvaWQgUHJvY0FycmF5 R3JvdXBDbGVhclhpZChQR1BST0MgKnByb2MsIFRyYW5zYWN0aW9uSWQgbGF0ZXN0WGlkKTsK IHN0YXRpYyB2b2lkIE1haW50YWluTGF0ZXN0Q29tcGxldGVkWGlkKFRyYW5zYWN0aW9uSWQg bGF0ZXN0WGlkKTsKQEAgLTM4MywzMSArMzM5LDYgQEAgUHJvY0FycmF5U2htZW1TaXplKHZv aWQpCiAJc2l6ZSA9IG9mZnNldG9mKFByb2NBcnJheVN0cnVjdCwgcGdwcm9jbm9zKTsKIAlz aXplID0gYWRkX3NpemUoc2l6ZSwgbXVsX3NpemUoc2l6ZW9mKGludCksIFBST0NBUlJBWV9N QVhQUk9DUykpOwogCi0JLyoKLQkgKiBEdXJpbmcgSG90IFN0YW5kYnkgcHJvY2Vzc2luZyB3 ZSBoYXZlIGEgZGF0YSBzdHJ1Y3R1cmUgY2FsbGVkCi0JICogS25vd25Bc3NpZ25lZFhpZHMs IGNyZWF0ZWQgaW4gc2hhcmVkIG1lbW9yeS4gTG9jYWwgZGF0YSBzdHJ1Y3R1cmVzIGFyZQot CSAqIGFsc28gY3JlYXRlZCBpbiB2YXJpb3VzIGJhY2tlbmRzIGR1cmluZyBHZXRTbmFwc2hv dERhdGEoKSwKLQkgKiBUcmFuc2FjdGlvbklkSXNJblByb2dyZXNzKCkgYW5kIEdldFJ1bm5p bmdUcmFuc2FjdGlvbkRhdGEoKS4gQWxsIG9mIHRoZQotCSAqIG1haW4gc3RydWN0dXJlcyBj cmVhdGVkIGluIHRob3NlIGZ1bmN0aW9ucyBtdXN0IGJlIGlkZW50aWNhbGx5IHNpemVkLAot CSAqIHNpbmNlIHdlIG1heSBhdCB0aW1lcyBjb3B5IHRoZSB3aG9sZSBvZiB0aGUgZGF0YSBz dHJ1Y3R1cmVzIGFyb3VuZC4gV2UKLQkgKiByZWZlciB0byB0aGlzIHNpemUgYXMgVE9UQUxf TUFYX0NBQ0hFRF9TVUJYSURTLgotCSAqCi0JICogSWRlYWxseSB3ZSdkIG9ubHkgY3JlYXRl IHRoaXMgc3RydWN0dXJlIGlmIHdlIHdlcmUgYWN0dWFsbHkgZG9pbmcgaG90Ci0JICogc3Rh bmRieSBpbiB0aGUgY3VycmVudCBydW4sIGJ1dCB3ZSBkb24ndCBrbm93IHRoYXQgeWV0IGF0 IHRoZSB0aW1lCi0JICogc2hhcmVkIG1lbW9yeSBpcyBiZWluZyBzZXQgdXAuCi0JICovCi0j ZGVmaW5lIFRPVEFMX01BWF9DQUNIRURfU1VCWElEUyBcCi0JKChQR1BST0NfTUFYX0NBQ0hF RF9TVUJYSURTICsgMSkgKiBQUk9DQVJSQVlfTUFYUFJPQ1MpCi0KLQlpZiAoRW5hYmxlSG90 U3RhbmRieSkKLQl7Ci0JCXNpemUgPSBhZGRfc2l6ZShzaXplLAotCQkJCQkJbXVsX3NpemUo c2l6ZW9mKFRyYW5zYWN0aW9uSWQpLAotCQkJCQkJCQkgVE9UQUxfTUFYX0NBQ0hFRF9TVUJY SURTKSk7Ci0JCXNpemUgPSBhZGRfc2l6ZShzaXplLAotCQkJCQkJbXVsX3NpemUoc2l6ZW9m KGJvb2wpLCBUT1RBTF9NQVhfQ0FDSEVEX1NVQlhJRFMpKTsKLQl9Ci0KIAlyZXR1cm4gc2l6 ZTsKIH0KIApAQCAtNDM0LDMxICszNjUsMTIgQEAgUHJvY0FycmF5U2htZW1Jbml0KHZvaWQp CiAJCSAqLwogCQlwcm9jQXJyYXktPm51bVByb2NzID0gMDsKIAkJcHJvY0FycmF5LT5tYXhQ cm9jcyA9IFBST0NBUlJBWV9NQVhQUk9DUzsKLQkJcHJvY0FycmF5LT5tYXhLbm93bkFzc2ln bmVkWGlkcyA9IFRPVEFMX01BWF9DQUNIRURfU1VCWElEUzsKLQkJcHJvY0FycmF5LT5udW1L bm93bkFzc2lnbmVkWGlkcyA9IDA7Ci0JCXByb2NBcnJheS0+dGFpbEtub3duQXNzaWduZWRY aWRzID0gMDsKLQkJcHJvY0FycmF5LT5oZWFkS25vd25Bc3NpZ25lZFhpZHMgPSAwOwotCQlw cm9jQXJyYXktPmxhc3RPdmVyZmxvd2VkWGlkID0gSW52YWxpZFRyYW5zYWN0aW9uSWQ7CiAJ CXByb2NBcnJheS0+cmVwbGljYXRpb25fc2xvdF94bWluID0gSW52YWxpZFRyYW5zYWN0aW9u SWQ7CiAJCXByb2NBcnJheS0+cmVwbGljYXRpb25fc2xvdF9jYXRhbG9nX3htaW4gPSBJbnZh bGlkVHJhbnNhY3Rpb25JZDsKIAkJVHJhbnNhbVZhcmlhYmxlcy0+eGFjdENvbXBsZXRpb25D b3VudCA9IDE7CiAJfQogCiAJYWxsUHJvY3MgPSBQcm9jR2xvYmFsLT5hbGxQcm9jczsKLQot CS8qIENyZWF0ZSBvciBhdHRhY2ggdG8gdGhlIEtub3duQXNzaWduZWRYaWRzIGFycmF5cyB0 b28sIGlmIG5lZWRlZCAqLwotCWlmIChFbmFibGVIb3RTdGFuZGJ5KQotCXsKLQkJS25vd25B c3NpZ25lZFhpZHMgPSAoVHJhbnNhY3Rpb25JZCAqKQotCQkJU2htZW1Jbml0U3RydWN0KCJL bm93bkFzc2lnbmVkWGlkcyIsCi0JCQkJCQkJbXVsX3NpemUoc2l6ZW9mKFRyYW5zYWN0aW9u SWQpLAotCQkJCQkJCQkJIFRPVEFMX01BWF9DQUNIRURfU1VCWElEUyksCi0JCQkJCQkJJmZv dW5kKTsKLQkJS25vd25Bc3NpZ25lZFhpZHNWYWxpZCA9IChib29sICopCi0JCQlTaG1lbUlu aXRTdHJ1Y3QoIktub3duQXNzaWduZWRYaWRzVmFsaWQiLAotCQkJCQkJCW11bF9zaXplKHNp emVvZihib29sKSwgVE9UQUxfTUFYX0NBQ0hFRF9TVUJYSURTKSwKLQkJCQkJCQkmZm91bmQp OwotCX0KIH0KIAogLyoKQEAgLTEwMjIsMzU1ICs5MzQsMzUgQEAgTWFpbnRhaW5MYXRlc3RD b21wbGV0ZWRYaWRSZWNvdmVyeShUcmFuc2FjdGlvbklkIGxhdGVzdFhpZCkKIHZvaWQKIFBy b2NBcnJheUluaXRSZWNvdmVyeShUcmFuc2FjdGlvbklkIGluaXRpYWxpemVkVXB0b1hJRCkK IHsKLQlBc3NlcnQoc3RhbmRieVN0YXRlID09IFNUQU5EQllfSU5JVElBTElaRUQpOworCUFz c2VydChJbkhvdFN0YW5kYnkpOwogCUFzc2VydChUcmFuc2FjdGlvbklkSXNOb3JtYWwoaW5p dGlhbGl6ZWRVcHRvWElEKSk7CiAKIAkvKgotCSAqIHdlIHNldCBsYXRlc3RPYnNlcnZlZFhp ZCB0byB0aGUgeGlkIFNVQlRSQU5TIGhhcyBiZWVuIGluaXRpYWxpemVkIHVwCi0JICogdG8s IHNvIHdlIGNhbiBleHRlbmQgaXQgZnJvbSB0aGF0IHBvaW50IG9ud2FyZHMgaW4KLQkgKiBS ZWNvcmRLbm93bkFzc2lnbmVkVHJhbnNhY3Rpb25JZHMsIGFuZCB3aGVuIHdlIGdldCBjb25z aXN0ZW50IGluCi0JICogUHJvY0FycmF5QXBwbHlSZWNvdmVyeUluZm8oKS4KKwkgKiB3ZSBz ZXQgbGF0ZXN0T2JzZXJ2ZWRYaWQgdG8gdGhlIHhpZCBTVUJUUkFOUyBhbmQgQ1NOIGxvZyBo YXZlIGJlZW4KKwkgKiBpbml0aWFsaXplZCB1cCB0bywgc28gd2UgY2FuIGV4dGVuZCBpdCBm cm9tIHRoYXQgcG9pbnQgb253YXJkcyB3aGVuZXZlcgorCSAqIHdlIG9ic2VydmUgbmV3IFhJ RHMuCiAJICovCiAJbGF0ZXN0T2JzZXJ2ZWRYaWQgPSBpbml0aWFsaXplZFVwdG9YSUQ7CiAJ VHJhbnNhY3Rpb25JZFJldHJlYXQobGF0ZXN0T2JzZXJ2ZWRYaWQpOwogfQogCiAvKgotICog UHJvY0FycmF5QXBwbHlSZWNvdmVyeUluZm8gLS0gYXBwbHkgcmVjb3ZlcnkgaW5mbyBhYm91 dCB4aWRzCi0gKgotICogVGFrZXMgdXMgdGhyb3VnaCAzIHN0YXRlczogSW5pdGlhbGl6ZWQs IFBlbmRpbmcgYW5kIFJlYWR5LgotICogTm9ybWFsIGNhc2UgaXMgdG8gZ28gYWxsIHRoZSB3 YXkgdG8gUmVhZHkgc3RyYWlnaHQgYXdheSwgdGhvdWdoIHRoZXJlCi0gKiBhcmUgYXR5cGlj YWwgY2FzZXMgd2hlcmUgd2UgbmVlZCB0byB0YWtlIGl0IGluIHN0ZXBzLgotICoKLSAqIFVz ZSB0aGUgZGF0YSBhYm91dCBydW5uaW5nIHRyYW5zYWN0aW9ucyBvbiB0aGUgcHJpbWFyeSB0 byBjcmVhdGUgdGhlIGluaXRpYWwKLSAqIHN0YXRlIG9mIEtub3duQXNzaWduZWRYaWRzLiBX ZSBhbHNvIHVzZSB0aGVzZSByZWNvcmRzIHRvIHJlZ3VsYXJseSBwcnVuZQotICogS25vd25B c3NpZ25lZFhpZHMgYmVjYXVzZSB3ZSBrbm93IGl0IGlzIHBvc3NpYmxlIHRoYXQgc29tZSB0 cmFuc2FjdGlvbnMKLSAqIHdpdGggRkFUQUwgZXJyb3JzIGZhaWwgdG8gd3JpdGUgYWJvcnQg cmVjb3Jkcywgd2hpY2ggY291bGQgY2F1c2UgZXZlbnR1YWwKLSAqIG92ZXJmbG93LgotICoK LSAqIFNlZSBjb21tZW50cyBmb3IgTG9nU3RhbmRieVNuYXBzaG90KCkuCisgKiBVcGRhdGUg b2xkZXN0IHJ1bm5pbmcgWElELiBmcm9tIGEgY2hlY2twb2ludCByZWNvcmQuIFRoaXMgYWxs b3dzIHRydW5jYXRpbmcKKyAqIFNVQlRSQU5TIGFuZCB0aGUgQ1NOIGxvZy4KICAqLwogdm9p ZAotUHJvY0FycmF5QXBwbHlSZWNvdmVyeUluZm8oUnVubmluZ1RyYW5zYWN0aW9ucyBydW5u aW5nKQorUHJvY0FycmF5VXBkYXRlT2xkZXN0UnVubmluZ1hpZChUcmFuc2FjdGlvbklkIG9s ZGVzdFJ1bm5pbmdYSUQpCiB7Ci0JVHJhbnNhY3Rpb25JZCAqeGlkczsKLQlUcmFuc2FjdGlv bklkIGFkdmFuY2VOZXh0WGlkOwotCWludAkJCW54aWRzOwotCWludAkJCWk7Ci0KLQlBc3Nl cnQoc3RhbmRieVN0YXRlID49IFNUQU5EQllfSU5JVElBTElaRUQpOwotCUFzc2VydChUcmFu c2FjdGlvbklkSXNWYWxpZChydW5uaW5nLT5uZXh0WGlkKSk7Ci0JQXNzZXJ0KFRyYW5zYWN0 aW9uSWRJc1ZhbGlkKHJ1bm5pbmctPm9sZGVzdFJ1bm5pbmdYaWQpKTsKLQlBc3NlcnQoVHJh bnNhY3Rpb25JZElzTm9ybWFsKHJ1bm5pbmctPmxhdGVzdENvbXBsZXRlZFhpZCkpOwotCi0J LyoKLQkgKiBSZW1vdmUgc3RhbGUgdHJhbnNhY3Rpb25zLCBpZiBhbnkuCi0JICovCi0JRXhw aXJlT2xkS25vd25Bc3NpZ25lZFRyYW5zYWN0aW9uSWRzKHJ1bm5pbmctPm9sZGVzdFJ1bm5p bmdYaWQpOwotCi0JLyoKLQkgKiBBZGp1c3QgVHJhbnNhbVZhcmlhYmxlcy0+bmV4dFhpZCBi ZWZvcmUgU3RhbmRieVJlbGVhc2VPbGRMb2NrcygpLAotCSAqIGJlY2F1c2Ugd2Ugd2lsbCBu ZWVkIGl0IHVwIHRvIGRhdGUgZm9yIGFjY2Vzc2luZyB0d28tcGhhc2UgdHJhbnNhY3Rpb25z Ci0JICogaW4gU3RhbmRieVJlbGVhc2VPbGRMb2NrcygpLgotCSAqLwotCWFkdmFuY2VOZXh0 WGlkID0gcnVubmluZy0+bmV4dFhpZDsKLQlUcmFuc2FjdGlvbklkUmV0cmVhdChhZHZhbmNl TmV4dFhpZCk7Ci0JQWR2YW5jZU5leHRGdWxsVHJhbnNhY3Rpb25JZFBhc3RYaWQoYWR2YW5j ZU5leHRYaWQpOwotCUFzc2VydChGdWxsVHJhbnNhY3Rpb25JZElzVmFsaWQoVHJhbnNhbVZh cmlhYmxlcy0+bmV4dFhpZCkpOwotCiAJLyoKIAkgKiBSZW1vdmUgc3RhbGUgbG9ja3MsIGlm IGFueS4KIAkgKi8KLQlTdGFuZGJ5UmVsZWFzZU9sZExvY2tzKHJ1bm5pbmctPm9sZGVzdFJ1 bm5pbmdYaWQpOwotCi0JLyoKLQkgKiBJZiBvdXIgc25hcHNob3QgaXMgYWxyZWFkeSB2YWxp ZCwgbm90aGluZyBlbHNlIHRvIGRvLi4uCi0JICovCi0JaWYgKHN0YW5kYnlTdGF0ZSA9PSBT VEFOREJZX1NOQVBTSE9UX1JFQURZKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIElmIG91ciBp bml0aWFsIFJ1bm5pbmdUcmFuc2FjdGlvbnNEYXRhIGhhZCBhbiBvdmVyZmxvd2VkIHNuYXBz aG90IHRoZW4KLQkgKiB3ZSBrbmV3IHdlIHdlcmUgbWlzc2luZyBzb21lIHN1YnhpZHMgZnJv bSBvdXIgc25hcHNob3QuIElmIHdlIGNvbnRpbnVlCi0JICogdG8gc2VlIG92ZXJmbG93ZWQg c25hcHNob3RzIHRoZW4gd2UgbWlnaHQgbmV2ZXIgYmUgYWJsZSB0byBzdGFydCB1cCwgc28K LQkgKiB3ZSBtYWtlIGFub3RoZXIgdGVzdCB0byBzZWUgaWYgb3VyIHNuYXBzaG90IGlzIG5v dyB2YWxpZC4gV2Uga25vdyB0aGF0Ci0JICogdGhlIG1pc3Npbmcgc3VieGlkcyBhcmUgZXF1 YWwgdG8gb3IgZWFybGllciB0aGFuIG5leHRYaWQuIEFmdGVyIHdlCi0JICogaW5pdGlhbGlz ZSB3ZSBjb250aW51ZSB0byBhcHBseSBjaGFuZ2VzIGR1cmluZyByZWNvdmVyeSwgc28gb25j ZSB0aGUKLQkgKiBvbGRlc3RSdW5uaW5nWGlkIGlzIGxhdGVyIHRoYW4gdGhlIG5leHRYaWQg ZnJvbSB0aGUgaW5pdGlhbCBzbmFwc2hvdCB3ZQotCSAqIGtub3cgdGhhdCB3ZSBubyBsb25n ZXIgaGF2ZSBtaXNzaW5nIGluZm9ybWF0aW9uIGFuZCBjYW4gbWFyayB0aGUKLQkgKiBzbmFw c2hvdCBhcyB2YWxpZC4KLQkgKi8KLQlpZiAoc3RhbmRieVN0YXRlID09IFNUQU5EQllfU05B UFNIT1RfUEVORElORykKLQl7Ci0JCS8qCi0JCSAqIElmIHRoZSBzbmFwc2hvdCBpc24ndCBv dmVyZmxvd2VkIG9yIGlmIGl0cyBlbXB0eSB3ZSBjYW4gcmVzZXQgb3VyCi0JCSAqIHBlbmRp bmcgc3RhdGUgYW5kIHVzZSB0aGlzIHNuYXBzaG90IGluc3RlYWQuCi0JCSAqLwotCQlpZiAo cnVubmluZy0+c3VieGlkX3N0YXR1cyAhPSBTVUJYSURTX01JU1NJTkcgfHwgcnVubmluZy0+ eGNudCA9PSAwKQotCQl7Ci0JCQkvKgotCQkJICogSWYgd2UgaGF2ZSBhbHJlYWR5IGNvbGxl Y3RlZCBrbm93biBhc3NpZ25lZCB4aWRzLCB3ZSBuZWVkIHRvCi0JCQkgKiB0aHJvdyB0aGVt IGF3YXkgYmVmb3JlIHdlIGFwcGx5IHRoZSByZWNvdmVyeSBzbmFwc2hvdC4KLQkJCSAqLwot CQkJS25vd25Bc3NpZ25lZFhpZHNSZXNldCgpOwotCQkJc3RhbmRieVN0YXRlID0gU1RBTkRC WV9JTklUSUFMSVpFRDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChUcmFuc2FjdGlvbklk UHJlY2VkZXMoc3RhbmRieVNuYXBzaG90UGVuZGluZ1htaW4sCi0JCQkJCQkJCQkgIHJ1bm5p bmctPm9sZGVzdFJ1bm5pbmdYaWQpKQotCQkJewotCQkJCXN0YW5kYnlTdGF0ZSA9IFNUQU5E QllfU05BUFNIT1RfUkVBRFk7Ci0JCQkJZWxvZyhERUJVRzEsCi0JCQkJCSAicmVjb3Zlcnkg c25hcHNob3RzIGFyZSBub3cgZW5hYmxlZCIpOwotCQkJfQotCQkJZWxzZQotCQkJCWVsb2co REVCVUcxLAotCQkJCQkgInJlY292ZXJ5IHNuYXBzaG90IHdhaXRpbmcgZm9yIG5vbi1vdmVy Zmxvd2VkIHNuYXBzaG90IG9yICIKLQkJCQkJICJ1bnRpbCBvbGRlc3QgYWN0aXZlIHhpZCBv biBzdGFuZGJ5IGlzIGF0IGxlYXN0ICV1IChub3cgJXUpIiwKLQkJCQkJIHN0YW5kYnlTbmFw c2hvdFBlbmRpbmdYbWluLAotCQkJCQkgcnVubmluZy0+b2xkZXN0UnVubmluZ1hpZCk7Ci0J CQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlBc3NlcnQoc3RhbmRieVN0YXRlID09IFNUQU5EQllf SU5JVElBTElaRUQpOwotCi0JLyoKLQkgKiBOQjogdGhpcyBjYW4gYmUgcmVhY2hlZCBhdCBs ZWFzdCB0d2ljZSwgc28gbWFrZSBzdXJlIG5ldyBjb2RlIGNhbiBkZWFsCi0JICogd2l0aCB0 aGF0LgotCSAqLworCVN0YW5kYnlSZWxlYXNlT2xkTG9ja3Mob2xkZXN0UnVubmluZ1hJRCk7 CiAKLQkvKgotCSAqIE5vYm9keSBlbHNlIGlzIHJ1bm5pbmcgeWV0LCBidXQgdGFrZSBsb2Nr cyBhbnlob3cKLQkgKi8KIAlMV0xvY2tBY3F1aXJlKFByb2NBcnJheUxvY2ssIExXX0VYQ0xV U0lWRSk7Ci0KLQkvKgotCSAqIEtub3duQXNzaWduZWRYaWRzIGlzIHNvcnRlZCBzbyB3ZSBj YW5ub3QganVzdCBhZGQgdGhlIHhpZHMsIHdlIGhhdmUgdG8KLQkgKiBzb3J0IHRoZW0gZmly c3QuCi0JICoKLQkgKiBTb21lIG9mIHRoZSBuZXcgeGlkcyBhcmUgdG9wLWxldmVsIHhpZHMg YW5kIHNvbWUgYXJlIHN1YnRyYW5zYWN0aW9ucy4KLQkgKiBXZSBkb24ndCBjYWxsIFN1YlRy YW5zU2V0UGFyZW50IGJlY2F1c2UgaXQgZG9lc24ndCBtYXR0ZXIgeWV0LiBJZiB3ZQotCSAq IGFyZW4ndCBvdmVyZmxvd2VkIHRoZW4gYWxsIHhpZHMgd2lsbCBmaXQgaW4gc25hcHNob3Qg YW5kIHNvIHdlIGRvbid0Ci0JICogbmVlZCBzdWJ0cmFucy4gSWYgd2UgbGF0ZXIgb3ZlcmZs b3csIGFuIHhpZCBhc3NpZ25tZW50IHJlY29yZCB3aWxsIGFkZAotCSAqIHhpZHMgdG8gc3Vi dHJhbnMuIElmIFJ1bm5pbmdUcmFuc2FjdGlvbnNEYXRhIGlzIG92ZXJmbG93ZWQgdGhlbiB3 ZQotCSAqIGRvbid0IGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGNvcnJlY3RseSB1cGRh dGUgc3VidHJhbnMgYW55d2F5LgotCSAqLwotCi0JLyoKLQkgKiBBbGxvY2F0ZSBhIHRlbXBv cmFyeSBhcnJheSB0byBhdm9pZCBtb2RpZnlpbmcgdGhlIGFycmF5IHBhc3NlZCBhcwotCSAq IGFyZ3VtZW50LgotCSAqLwotCXhpZHMgPSBwYWxsb2Moc2l6ZW9mKFRyYW5zYWN0aW9uSWQp ICogKHJ1bm5pbmctPnhjbnQgKyBydW5uaW5nLT5zdWJ4Y250KSk7Ci0KLQkvKgotCSAqIEFk ZCB0byB0aGUgdGVtcCBhcnJheSBhbnkgeGlkcyB3aGljaCBoYXZlIG5vdCBhbHJlYWR5IGNv bXBsZXRlZC4KLQkgKi8KLQlueGlkcyA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IHJ1bm5pbmct PnhjbnQgKyBydW5uaW5nLT5zdWJ4Y250OyBpKyspCi0JewotCQlUcmFuc2FjdGlvbklkIHhp ZCA9IHJ1bm5pbmctPnhpZHNbaV07Ci0KLQkJLyoKLQkJICogVGhlIHJ1bm5pbmcteGFjdHMg c25hcHNob3QgY2FuIGNvbnRhaW4geGlkcyB0aGF0IHdlcmUgc3RpbGwgdmlzaWJsZQotCQkg KiBpbiB0aGUgcHJvY2FycmF5IHdoZW4gdGhlIHNuYXBzaG90IHdhcyB0YWtlbiwgYnV0IHdl cmUgYWxyZWFkeQotCQkgKiBXQUwtbG9nZ2VkIGFzIGNvbXBsZXRlZC4gVGhleSdyZSBub3Qg cnVubmluZyBhbnltb3JlLCBzbyBpZ25vcmUKLQkJICogdGhlbS4KLQkJICovCi0JCWlmIChU cmFuc2FjdGlvbklkRGlkQ29tbWl0KHhpZCkgfHwgVHJhbnNhY3Rpb25JZERpZEFib3J0KHhp ZCkpCi0JCQljb250aW51ZTsKLQotCQl4aWRzW254aWRzKytdID0geGlkOwotCX0KLQotCWlm IChueGlkcyA+IDApCi0JewotCQlpZiAocHJvY0FycmF5LT5udW1Lbm93bkFzc2lnbmVkWGlk cyAhPSAwKQotCQl7Ci0JCQlMV0xvY2tSZWxlYXNlKFByb2NBcnJheUxvY2spOwotCQkJZWxv ZyhFUlJPUiwgIktub3duQXNzaWduZWRYaWRzIGlzIG5vdCBlbXB0eSIpOwotCQl9Ci0KLQkJ LyoKLQkJICogU29ydCB0aGUgYXJyYXkgc28gdGhhdCB3ZSBjYW4gYWRkIHRoZW0gc2FmZWx5 IGludG8KLQkJICogS25vd25Bc3NpZ25lZFhpZHMuCi0JCSAqCi0JCSAqIFdlIGhhdmUgdG8g c29ydCB0aGVtIGxvZ2ljYWxseSwgYmVjYXVzZSBpbiBLbm93bkFzc2lnbmVkWGlkc0FkZCB3 ZQotCQkgKiBjYWxsIFRyYW5zYWN0aW9uSWRGb2xsb3dzT3JFcXVhbHMgYW5kIHNvIG9uLiBC dXQgd2Uga25vdyB0aGVzZSBYSURzCi0JCSAqIGNvbWUgZnJvbSBSVU5OSU5HX1hBQ1RTLCB3 aGljaCBtZWFucyB0aGVyZSBhcmUgb25seSBub3JtYWwgWElEcwotCQkgKiBmcm9tIHRoZSBz YW1lIGVwb2NoLCBzbyB0aGlzIGlzIHNhZmUuCi0JCSAqLwotCQlxc29ydCh4aWRzLCBueGlk cywgc2l6ZW9mKFRyYW5zYWN0aW9uSWQpLCB4aWRMb2dpY2FsQ29tcGFyYXRvcik7Ci0KLQkJ LyoKLQkJICogQWRkIHRoZSBzb3J0ZWQgc25hcHNob3QgaW50byBLbm93bkFzc2lnbmVkWGlk cy4gIFRoZSBydW5uaW5nLXhhY3RzCi0JCSAqIHNuYXBzaG90IG1heSBpbmNsdWRlIGR1cGxp Y2F0ZWQgeGlkcyBiZWNhdXNlIG9mIHByZXBhcmVkCi0JCSAqIHRyYW5zYWN0aW9ucywgc28g aWdub3JlIHRoZW0uCi0JCSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgbnhpZHM7IGkrKykKLQkJ ewotCQkJaWYgKGkgPiAwICYmIFRyYW5zYWN0aW9uSWRFcXVhbHMoeGlkc1tpIC0gMV0sIHhp ZHNbaV0pKQotCQkJewotCQkJCWVsb2coREVCVUcxLAotCQkJCQkgImZvdW5kIGR1cGxpY2F0 ZWQgdHJhbnNhY3Rpb24gJXUgZm9yIEtub3duQXNzaWduZWRYaWRzIGluc2VydGlvbiIsCi0J CQkJCSB4aWRzW2ldKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUtub3duQXNzaWduZWRY aWRzQWRkKHhpZHNbaV0sIHhpZHNbaV0sIHRydWUpOwotCQl9Ci0KLQkJS25vd25Bc3NpZ25l ZFhpZHNEaXNwbGF5KERFQlVHMyk7Ci0JfQotCi0JcGZyZWUoeGlkcyk7Ci0KLQkvKgotCSAq IGxhdGVzdE9ic2VydmVkWGlkIGlzIGF0IGxlYXN0IHNldCB0byB0aGUgcG9pbnQgd2hlcmUg U1VCVFJBTlMgd2FzCi0JICogc3RhcnRlZCB1cCB0byAoY2YuIFByb2NBcnJheUluaXRSZWNv dmVyeSgpKSBvciB0byB0aGUgYmlnZ2VzdCB4aWQKLQkgKiBSZWNvcmRLbm93bkFzc2lnbmVk VHJhbnNhY3Rpb25JZHMoKSB3YXMgY2FsbGVkIGZvci4gIEluaXRpYWxpemUKLQkgKiBzdWJ0 cmFucyBmcm9tIHRoZXJlb24sIHVwIHRvIG5leHRYaWQgLSAxLgotCSAqCi0JICogV2UgbmVl ZCB0byBkdXBsaWNhdGUgcGFydHMgb2YgUmVjb3JkS25vd25Bc3NpZ25lZFRyYW5zYWN0aW9u SWQoKSBoZXJlLAotCSAqIGJlY2F1c2Ugd2UndmUganVzdCBhZGRlZCB4aWRzIHRvIHRoZSBr bm93biBhc3NpZ25lZCB4aWRzIG1hY2hpbmVyeSB0aGF0Ci0JICogaGF2ZW4ndCBnb25lIHRo cm91Z2ggUmVjb3JkS25vd25Bc3NpZ25lZFRyYW5zYWN0aW9uSWQoKS4KLQkgKi8KLQlBc3Nl cnQoVHJhbnNhY3Rpb25JZElzTm9ybWFsKGxhdGVzdE9ic2VydmVkWGlkKSk7Ci0JVHJhbnNh Y3Rpb25JZEFkdmFuY2UobGF0ZXN0T2JzZXJ2ZWRYaWQpOwotCXdoaWxlIChUcmFuc2FjdGlv bklkUHJlY2VkZXMobGF0ZXN0T2JzZXJ2ZWRYaWQsIHJ1bm5pbmctPm5leHRYaWQpKQotCXsK LQkJRXh0ZW5kU1VCVFJBTlMobGF0ZXN0T2JzZXJ2ZWRYaWQpOwotCQlUcmFuc2FjdGlvbklk QWR2YW5jZShsYXRlc3RPYnNlcnZlZFhpZCk7Ci0JfQotCVRyYW5zYWN0aW9uSWRSZXRyZWF0 KGxhdGVzdE9ic2VydmVkWGlkKTsJLyogPSBydW5uaW5nLT5uZXh0WGlkIC0gMSAqLwotCi0J LyogLS0tLS0tLS0tLQotCSAqIE5vdyB3ZSd2ZSBnb3QgdGhlIHJ1bm5pbmcgeGlkcyB3ZSBu ZWVkIHRvIHNldCB0aGUgZ2xvYmFsIHZhbHVlcyB0aGF0Ci0JICogYXJlIHVzZWQgdG8gdHJh Y2sgc25hcHNob3RzIGFzIHRoZXkgZXZvbHZlIGZ1cnRoZXIuCi0JICoKLQkgKiAtIGxhdGVz dENvbXBsZXRlZFhpZCB3aGljaCB3aWxsIGJlIHRoZSB4bWF4IGZvciBzbmFwc2hvdHMKLQkg KiAtIGxhc3RPdmVyZmxvd2VkWGlkIHdoaWNoIHNob3dzIHdoZXRoZXIgc25hcHNob3RzIG92 ZXJmbG93Ci0JICogLSBuZXh0WGlkCi0JICoKLQkgKiBJZiB0aGUgc25hcHNob3Qgb3ZlcmZs b3dlZCwgdGhlbiB3ZSBzdGlsbCBpbml0aWFsaXNlIHdpdGggd2hhdCB3ZSBrbm93LAotCSAq IGJ1dCB0aGUgcmVjb3Zlcnkgc25hcHNob3QgaXNuJ3QgZnVsbHkgdmFsaWQgeWV0IGJlY2F1 c2Ugd2Uga25vdyB0aGVyZQotCSAqIGFyZSBzb21lIHN1YnhpZHMgbWlzc2luZy4gV2UgZG9u J3Qga25vdyB0aGUgc3BlY2lmaWMgc3VieGlkcyB0aGF0IGFyZQotCSAqIG1pc3NpbmcsIHNv IGNvbnNlcnZhdGl2ZWx5IGFzc3VtZSB0aGUgbGFzdCBvbmUgaXMgbGF0ZXN0T2JzZXJ2ZWRY aWQuCi0JICogLS0tLS0tLS0tLQotCSAqLwotCWlmIChydW5uaW5nLT5zdWJ4aWRfc3RhdHVz ID09IFNVQlhJRFNfTUlTU0lORykKLQl7Ci0JCXN0YW5kYnlTdGF0ZSA9IFNUQU5EQllfU05B UFNIT1RfUEVORElORzsKLQotCQlzdGFuZGJ5U25hcHNob3RQZW5kaW5nWG1pbiA9IGxhdGVz dE9ic2VydmVkWGlkOwotCQlwcm9jQXJyYXktPmxhc3RPdmVyZmxvd2VkWGlkID0gbGF0ZXN0 T2JzZXJ2ZWRYaWQ7Ci0JfQotCWVsc2UKLQl7Ci0JCXN0YW5kYnlTdGF0ZSA9IFNUQU5EQllf U05BUFNIT1RfUkVBRFk7Ci0KLQkJc3RhbmRieVNuYXBzaG90UGVuZGluZ1htaW4gPSBJbnZh bGlkVHJhbnNhY3Rpb25JZDsKLQotCQkvKgotCQkgKiBJZiB0aGUgJ3hpZHMnIGFycmF5IGRp ZG4ndCBpbmNsdWRlIGFsbCBzdWJ0cmFuc2FjdGlvbnMsIHdlIGhhdmUgdG8KLQkJICogbWFy ayBhbnkgc25hcHNob3RzIHRha2VuIGFzIG92ZXJmbG93ZWQuCi0JCSAqLwotCQlpZiAocnVu bmluZy0+c3VieGlkX3N0YXR1cyA9PSBTVUJYSURTX0lOX1NVQlRSQU5TKQotCQkJcHJvY0Fy cmF5LT5sYXN0T3ZlcmZsb3dlZFhpZCA9IGxhdGVzdE9ic2VydmVkWGlkOwotCQllbHNlCi0J CXsKLQkJCUFzc2VydChydW5uaW5nLT5zdWJ4aWRfc3RhdHVzID09IFNVQlhJRFNfSU5fQVJS QVkpOwotCQkJcHJvY0FycmF5LT5sYXN0T3ZlcmZsb3dlZFhpZCA9IEludmFsaWRUcmFuc2Fj dGlvbklkOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBJZiBhIHRyYW5zYWN0aW9uIHdyb3RlIGEg Y29tbWl0IHJlY29yZCBpbiB0aGUgZ2FwIGJldHdlZW4gdGFraW5nIGFuZAotCSAqIGxvZ2dp bmcgdGhlIHNuYXBzaG90IHRoZW4gbGF0ZXN0Q29tcGxldGVkWGlkIG1heSBhbHJlYWR5IGJl IGhpZ2hlciB0aGFuCi0JICogdGhlIHZhbHVlIGZyb20gdGhlIHNuYXBzaG90LCBzbyBjaGVj ayBiZWZvcmUgd2UgdXNlIHRoZSBpbmNvbWluZyB2YWx1ZS4KLQkgKiBJdCBhbHNvIG1pZ2h0 IG5vdCB5ZXQgYmUgc2V0IGF0IGFsbC4KLQkgKi8KLQlNYWludGFpbkxhdGVzdENvbXBsZXRl ZFhpZFJlY292ZXJ5KHJ1bm5pbmctPmxhdGVzdENvbXBsZXRlZFhpZCk7Ci0KLQkvKgotCSAq IE5COiBObyBuZWVkIHRvIGluY3JlbWVudCBUcmFuc2FtVmFyaWFibGVzLT54YWN0Q29tcGxl dGlvbkNvdW50IGhlcmUsCi0JICogbm9ib2R5IGNhbiBzZWUgaXQgeWV0LgotCSAqLwotCisJ cHJvY0FycmF5LT5vbGRlc3RfcnVubmluZ19wcmltYXJ5X3hpZCA9IG9sZGVzdFJ1bm5pbmdY SUQ7CiAJTFdMb2NrUmVsZWFzZShQcm9jQXJyYXlMb2NrKTsKLQotCUtub3duQXNzaWduZWRY aWRzRGlzcGxheShERUJVRzMpOwotCWlmIChzdGFuZGJ5U3RhdGUgPT0gU1RBTkRCWV9TTkFQ U0hPVF9SRUFEWSkKLQkJZWxvZyhERUJVRzEsICJyZWNvdmVyeSBzbmFwc2hvdHMgYXJlIG5v dyBlbmFibGVkIik7Ci0JZWxzZQotCQllbG9nKERFQlVHMSwKLQkJCSAicmVjb3Zlcnkgc25h cHNob3Qgd2FpdGluZyBmb3Igbm9uLW92ZXJmbG93ZWQgc25hcHNob3Qgb3IgIgotCQkJICJ1 bnRpbCBvbGRlc3QgYWN0aXZlIHhpZCBvbiBzdGFuZGJ5IGlzIGF0IGxlYXN0ICV1IChub3cg JXUpIiwKLQkJCSBzdGFuZGJ5U25hcHNob3RQZW5kaW5nWG1pbiwKLQkJCSBydW5uaW5nLT5v bGRlc3RSdW5uaW5nWGlkKTsKIH0KIAotLyoKLSAqIFByb2NBcnJheUFwcGx5WGlkQXNzaWdu bWVudAotICoJCVByb2Nlc3MgYW4gWExPR19YQUNUX0FTU0lHTk1FTlQgV0FMIHJlY29yZAot ICovCi12b2lkCi1Qcm9jQXJyYXlBcHBseVhpZEFzc2lnbm1lbnQoVHJhbnNhY3Rpb25JZCB0 b3B4aWQsCi0JCQkJCQkJaW50IG5zdWJ4aWRzLCBUcmFuc2FjdGlvbklkICpzdWJ4aWRzKQot ewotCVRyYW5zYWN0aW9uSWQgbWF4X3hpZDsKLQlpbnQJCQlpOwotCi0JQXNzZXJ0KHN0YW5k YnlTdGF0ZSA+PSBTVEFOREJZX0lOSVRJQUxJWkVEKTsKLQotCW1heF94aWQgPSBUcmFuc2Fj dGlvbklkTGF0ZXN0KHRvcHhpZCwgbnN1YnhpZHMsIHN1YnhpZHMpOwotCi0JLyoKLQkgKiBN YXJrIGFsbCB0aGUgc3VidHJhbnNhY3Rpb25zIGFzIG9ic2VydmVkLgotCSAqCi0JICogTk9U RTogVGhpcyB3aWxsIGZhaWwgaWYgdGhlIHN1YnhpZCBjb250YWlucyB0b28gbWFueSBwcmV2 aW91c2x5Ci0JICogdW5vYnNlcnZlZCB4aWRzIHRvIGZpdCBpbnRvIGtub3duLWFzc2lnbmVk LXhpZHMuIFRoYXQgc2hvdWxkbid0IGhhcHBlbgotCSAqIGFzIHRoZSBjb2RlIHN0YW5kcywg YmVjYXVzZSB4aWQtYXNzaWdubWVudCByZWNvcmRzIHNob3VsZCBuZXZlciBjb250YWluCi0J ICogbW9yZSB0aGFuIFBHUFJPQ19NQVhfQ0FDSEVEX1NVQlhJRFMgZW50cmllcy4KLQkgKi8K LQlSZWNvcmRLbm93bkFzc2lnbmVkVHJhbnNhY3Rpb25JZHMobWF4X3hpZCk7Ci0KLQkvKgot CSAqIE5vdGljZSB0aGF0IHdlIHVwZGF0ZSBwZ19zdWJ0cmFucyB3aXRoIHRoZSB0b3AtbGV2 ZWwgeGlkLCByYXRoZXIgdGhhbgotCSAqIHRoZSBwYXJlbnQgeGlkLiBUaGlzIGlzIGEgZGlm ZmVyZW5jZSBiZXR3ZWVuIG5vcm1hbCBwcm9jZXNzaW5nIGFuZAotCSAqIHJlY292ZXJ5LCB5 ZXQgaXMgc3RpbGwgY29ycmVjdCBpbiBhbGwgY2FzZXMuIFRoZSByZWFzb24gaXMgdGhhdAot CSAqIHN1YnRyYW5zYWN0aW9uIGNvbW1pdCBpcyBub3QgbWFya2VkIGluIGNsb2cgdW50aWwg Y29tbWl0IHByb2Nlc3NpbmcsIHNvCi0JICogYWxsIGFib3J0ZWQgc3VidHJhbnNhY3Rpb25z IGhhdmUgYWxyZWFkeSBiZWVuIGNsZWFybHkgbWFya2VkIGluIGNsb2cuCi0JICogQXMgYSBy ZXN1bHQgd2UgYXJlIGFibGUgdG8gcmVmZXIgZGlyZWN0bHkgdG8gdGhlIHRvcC1sZXZlbAot CSAqIHRyYW5zYWN0aW9uJ3Mgc3RhdGUgcmF0aGVyIHRoYW4gc2tpcHBpbmcgdGhyb3VnaCBh bGwgdGhlIGludGVybWVkaWF0ZQotCSAqIHN0YXRlcyBpbiB0aGUgc3VidHJhbnNhY3Rpb24g dHJlZS4gVGhpcyBzaG91bGQgYmUgdGhlIGZpcnN0IHRpbWUgd2UKLQkgKiBoYXZlIGF0dGVt cHRlZCB0byBTdWJUcmFuc1NldFBhcmVudCgpLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBu c3VieGlkczsgaSsrKQotCQlTdWJUcmFuc1NldFBhcmVudChzdWJ4aWRzW2ldLCB0b3B4aWQp OwotCi0JLyogS25vd25Bc3NpZ25lZFhpZHMgaXNuJ3QgbWFpbnRhaW5lZCB5ZXQsIHNvIHdl J3JlIGRvbmUgZm9yIG5vdyAqLwotCWlmIChzdGFuZGJ5U3RhdGUgPT0gU1RBTkRCWV9JTklU SUFMSVpFRCkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBVc2VzIHNhbWUgbG9ja2luZyBhcyB0 cmFuc2FjdGlvbiBjb21taXQKLQkgKi8KLQlMV0xvY2tBY3F1aXJlKFByb2NBcnJheUxvY2ss IExXX0VYQ0xVU0lWRSk7Ci0KLQkvKgotCSAqIFJlbW92ZSBzdWJ4aWRzIGZyb20ga25vd24t YXNzaWduZWQteGFjdHMuCi0JICovCi0JS25vd25Bc3NpZ25lZFhpZHNSZW1vdmVUcmVlKElu dmFsaWRUcmFuc2FjdGlvbklkLCBuc3VieGlkcywgc3VieGlkcyk7Ci0KLQkvKgotCSAqIEFk dmFuY2UgbGFzdE92ZXJmbG93ZWRYaWQgdG8gYmUgYXQgbGVhc3QgdGhlIGxhc3Qgb2YgdGhl c2Ugc3VieGlkcy4KLQkgKi8KLQlpZiAoVHJhbnNhY3Rpb25JZFByZWNlZGVzKHByb2NBcnJh eS0+bGFzdE92ZXJmbG93ZWRYaWQsIG1heF94aWQpKQotCQlwcm9jQXJyYXktPmxhc3RPdmVy Zmxvd2VkWGlkID0gbWF4X3hpZDsKLQotCUxXTG9ja1JlbGVhc2UoUHJvY0FycmF5TG9jayk7 Ci19CiAKIC8qCiAgKiBUcmFuc2FjdGlvbklkSXNJblByb2dyZXNzIC0tIGlzIGdpdmVuIHRy YW5zYWN0aW9uIHJ1bm5pbmcgaW4gc29tZSBiYWNrZW5kCkBAIC0xMzc4LDIzICs5NzAsMjQg QEAgUHJvY0FycmF5QXBwbHlYaWRBc3NpZ25tZW50KFRyYW5zYWN0aW9uSWQgdG9weGlkLAog ICogQXNpZGUgZnJvbSBzb21lIHNob3J0Y3V0cyBzdWNoIGFzIGNoZWNraW5nIFJlY2VudFht aW4gYW5kIG91ciBvd24gWGlkLAogICogdGhlcmUgYXJlIGZvdXIgcG9zc2liaWxpdGllcyBm b3IgZmluZGluZyBhIHJ1bm5pbmcgdHJhbnNhY3Rpb246CiAgKgotICogMS4gVGhlIGdpdmVu IFhpZCBpcyBhIG1haW4gdHJhbnNhY3Rpb24gSWQuICBXZSB3aWxsIGZpbmQgdGhpcyBvdXQg Y2hlYXBseQorICogMS4gSW4gSG90IFN0YW5kYnkgbW9kZSwgdGhlcmUgYXJlIG5vIHRyYW5z YWN0aW9ucyB3aXRoIFhJRHMgYWN0aXZlIGluIHRoZQorICogc3RhbmRieS4gQ2hlY2sgcGdf eGFjdCB0byBzZWUgaWYgdGhlIHRyYW5zYWN0aW9uIGlzIGtub3duIHRvIGhhdmUgY29tbWl0 dGVkCisgKiBvciBhYm9ydGVkLCBvdGhlcndpc2UgaXQncyBjb25zaWRlcmVkIGFzIHJ1bm5p bmcuCisgKgorICogMi4gVGhlIGdpdmVuIFhpZCBpcyBhIG1haW4gdHJhbnNhY3Rpb24gSWQu ICBXZSB3aWxsIGZpbmQgdGhpcyBvdXQgY2hlYXBseQogICogYnkgbG9va2luZyBhdCBQcm9j R2xvYmFsLT54aWRzLgogICoKLSAqIDIuIFRoZSBnaXZlbiBYaWQgaXMgb25lIG9mIHRoZSBj YWNoZWQgc3VieGFjdCBYaWRzIGluIHRoZSBQR1BST0MgYXJyYXkuCisgKiAzLiBUaGUgZ2l2 ZW4gWGlkIGlzIG9uZSBvZiB0aGUgY2FjaGVkIHN1YnhhY3QgWGlkcyBpbiB0aGUgUEdQUk9D IGFycmF5LgogICogV2UgY2FuIGZpbmQgdGhpcyBvdXQgY2hlYXBseSB0b28uCiAgKgotICog My4gSW4gSG90IFN0YW5kYnkgbW9kZSwgd2UgbXVzdCBzZWFyY2ggdGhlIEtub3duQXNzaWdu ZWRYaWRzIGxpc3QgdG8gc2VlCi0gKiBpZiB0aGUgWGlkIGlzIHJ1bm5pbmcgb24gdGhlIHBy aW1hcnkuCi0gKgogICogNC4gU2VhcmNoIHRoZSBTdWJUcmFucyB0cmVlIHRvIGZpbmQgdGhl IFhpZCdzIHRvcG1vc3QgcGFyZW50LCBhbmQgdGhlbiBzZWUKLSAqIGlmIHRoYXQgaXMgcnVu bmluZyBhY2NvcmRpbmcgdG8gUHJvY0dsb2JhbC0+eGlkc1tdIG9yIEtub3duQXNzaWduZWRY aWRzLgorICogaWYgdGhhdCBpcyBydW5uaW5nIGFjY29yZGluZyB0byBQcm9jR2xvYmFsLT54 aWRzW10uCiAgKiBUaGlzIGlzIHRoZSBzbG93ZXN0IHdheSwgYnV0IHNhZGx5IGl0IGhhcyB0 byBiZSBkb25lIGFsd2F5cyBpZiB0aGUgb3RoZXJzCiAgKiBmYWlsZWQsIHVubGVzcyB3ZSBz ZWUgdGhhdCB0aGUgY2FjaGVkIHN1YnhhY3Qgc2V0cyBhcmUgY29tcGxldGUgKG5vbmUgaGF2 ZQogICogb3ZlcmZsb3dlZCkuCiAgKgotICogUHJvY0FycmF5TG9jayBoYXMgdG8gYmUgaGVs ZCB3aGlsZSB3ZSBkbyAxLCAyLCAzLiAgSWYgd2Ugc2F2ZSB0aGUgdG9wIFhpZHMKLSAqIHdo aWxlIGRvaW5nIDEgYW5kIDMsIHdlIGNhbiByZWxlYXNlIHRoZSBQcm9jQXJyYXlMb2NrIHdo aWxlIHdlIGRvIDQuCisgKiBQcm9jQXJyYXlMb2NrIGhhcyB0byBiZSBoZWxkIHdoaWxlIHdl IGRvIDIgYW5kIDMuICBJZiB3ZSBzYXZlIHRoZSB0b3AgWGlkcworICogd2hpbGUgZG9pbmcg MiBhbmQgMywgd2UgY2FuIHJlbGVhc2UgdGhlIFByb2NBcnJheUxvY2sgd2hpbGUgd2UgZG8g NC4KICAqIFRoaXMgYnV5cyBiYWNrIHNvbWUgY29uY3VycmVuY3kgKGFuZCB3ZSBjYW4ndCBy ZXRyaWV2ZSB0aGUgbWFpbiBYaWRzIGZyb20KICAqIFByb2NHbG9iYWwtPnhpZHNbXSBhZ2Fp biBhbnl3YXk7IHNlZSBHZXROZXdUcmFuc2FjdGlvbklkKS4KICAqLwpAQCAtMTQzNSw2ICsx MDI4LDI4IEBAIFRyYW5zYWN0aW9uSWRJc0luUHJvZ3Jlc3MoVHJhbnNhY3Rpb25JZCB4aWQp CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKKwkvKgorCSAqIEluIGhvdCBzdGFuZGJ5IG1vZGUs IGNoZWNrIHBnX3hhY3QuCisJICoKKwkgKiBXaXRoIG5vcm1hbCBub24tQ1NOIHNuYXBzaG90 cywgeW91IG11c3QgYmUgY2FyZWZ1bCB0byBjaGVjaworCSAqIFRyYW5zYWN0aW9uSWRJc0lu UHJvZ3Jlc3MoKSBiZWZvcmUgY2hlY2tpbmcgcGdfeGFjdCwgYmVjYXVzZSBhCisJICogdHJh bnNhY3Rpb24gaXMgbWFya2VkIGFzIGNvbW1pdHRlZCBiZWZvcmUgaXQncyByZW1vdmVkIGZy b20gUEdQUk9DLiBCdXQKKwkgKiBkdXJpbmcgcmVjb3ZlcnksIHdlIG5vdyB1c2UgQ1NOIHNu YXBzaG90cyBzbyBJIHRoaW5rIHRoYXQncyBPSy4gU2VlIHRoZQorCSAqICJOT1RFIiBhdCB0 aGUgdG9wIG9mIGhlYXBhbV92aXNpYmlsaXR5LmMuCisJICoKKwkgKiBEdXJpbmcgcmVjb3Zl cnksIHRoZSBYSUQgY2Fubm90IGJlIG91ciBvd24gdHJhbnNhY3Rpb24sIGFuZCB0aGUgQ1NO CisJICogY2hlY2sgaGFuZGxlcyBzdWJ0cmFuc2FjdGlvbnMgdG9vLCBzbyB3ZSBjYW4gc2tp cCB0aGUgcmVzdCBvZiB0aGUKKwkgKiBmdW5jdGlvbi4KKwkgKi8KKwlpZiAoUmVjb3ZlcnlJ blByb2dyZXNzKCkpCisJeworCQl4Y19kdXJpbmdfcmVjb3ZlcnlfaW5jKCk7CisJCWlmIChU cmFuc2FjdGlvbklkRGlkQ29tbWl0KHhpZCkgfHwgVHJhbnNhY3Rpb25JZERpZEFib3J0KHhp ZCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWVsc2UKKwkJCXJldHVybiB0cnVlOworCX0KKwog CS8qCiAJICogQWxzbywgd2UgY2FuIGhhbmRsZSBvdXIgb3duIHRyYW5zYWN0aW9uIChhbmQg c3VidHJhbnNhY3Rpb25zKSB3aXRob3V0CiAJICogYW55IGFjY2VzcyB0byBzaGFyZWQgbWVt b3J5LgpAQCAtMTQ1MSwxMiArMTA2Niw3IEBAIFRyYW5zYWN0aW9uSWRJc0luUHJvZ3Jlc3Mo VHJhbnNhY3Rpb25JZCB4aWQpCiAJICovCiAJaWYgKHhpZHMgPT0gTlVMTCkKIAl7Ci0JCS8q Ci0JCSAqIEluIGhvdCBzdGFuZGJ5IG1vZGUsIHJlc2VydmUgZW5vdWdoIHNwYWNlIHRvIGhv bGQgYWxsIHhpZHMgaW4gdGhlCi0JCSAqIGtub3duLWFzc2lnbmVkIGxpc3QuIElmIHdlIGxh dGVyIGZpbmlzaCByZWNvdmVyeSwgd2Ugbm8gbG9uZ2VyIG5lZWQKLQkJICogdGhlIGJpZ2dl ciBhcnJheSwgYnV0IHdlIGRvbid0IGJvdGhlciB0byBzaHJpbmsgaXQuCi0JCSAqLwotCQlp bnQJCQltYXh4aWRzID0gUmVjb3ZlcnlJblByb2dyZXNzKCkgPyBUT1RBTF9NQVhfQ0FDSEVE X1NVQlhJRFMgOiBhcnJheVAtPm1heFByb2NzOworCQlpbnQJCQltYXh4aWRzID0gYXJyYXlQ LT5tYXhQcm9jczsKIAogCQl4aWRzID0gKFRyYW5zYWN0aW9uSWQgKikgbWFsbG9jKG1heHhp ZHMgKiBzaXplb2YoVHJhbnNhY3Rpb25JZCkpOwogCQlpZiAoeGlkcyA9PSBOVUxMKQpAQCAt MTU1MSwzMyArMTE2MSw2IEBAIFRyYW5zYWN0aW9uSWRJc0luUHJvZ3Jlc3MoVHJhbnNhY3Rp b25JZCB4aWQpCiAJCQl4aWRzW254aWRzKytdID0gcHhpZDsKIAl9CiAKLQkvKgotCSAqIFN0 ZXAgMzogaW4gaG90IHN0YW5kYnkgbW9kZSwgY2hlY2sgdGhlIGtub3duLWFzc2lnbmVkLXhp ZHMgbGlzdC4gIFhJRHMKLQkgKiBpbiB0aGUgbGlzdCBtdXN0IGJlIHRyZWF0ZWQgYXMgcnVu bmluZy4KLQkgKi8KLQlpZiAoUmVjb3ZlcnlJblByb2dyZXNzKCkpCi0JewotCQkvKiBub25l IG9mIHRoZSBQR1BST0MgZW50cmllcyBzaG91bGQgaGF2ZSBYSURzIGluIGhvdCBzdGFuZGJ5 IG1vZGUgKi8KLQkJQXNzZXJ0KG54aWRzID09IDApOwotCi0JCWlmIChLbm93bkFzc2lnbmVk WGlkRXhpc3RzKHhpZCkpCi0JCXsKLQkJCUxXTG9ja1JlbGVhc2UoUHJvY0FycmF5TG9jayk7 Ci0JCQl4Y19ieV9rbm93bl9hc3NpZ25lZF9pbmMoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9 Ci0KLQkJLyoKLQkJICogSWYgdGhlIEtub3duQXNzaWduZWRYaWRzIG92ZXJmbG93ZWQsIHdl IGhhdmUgdG8gY2hlY2sgcGdfc3VidHJhbnMKLQkJICogdG9vLiAgRmV0Y2ggYWxsIHhpZHMg ZnJvbSBLbm93bkFzc2lnbmVkWGlkcyB0aGF0IGFyZSBsb3dlciB0aGFuCi0JCSAqIHhpZCwg c2luY2UgaWYgeGlkIGlzIGEgc3VidHJhbnNhY3Rpb24gaXRzIHBhcmVudCB3aWxsIGFsd2F5 cyBoYXZlIGEKLQkJICogbG93ZXIgdmFsdWUuICBOb3RlIHdlIHdpbGwgY29sbGVjdCBib3Ro IG1haW4gYW5kIHN1YlhJRHMgaGVyZSwgYnV0Ci0JCSAqIHRoZXJlJ3Mgbm8gaGVscCBmb3Ig aXQuCi0JCSAqLwotCQlpZiAoVHJhbnNhY3Rpb25JZFByZWNlZGVzT3JFcXVhbHMoeGlkLCBw cm9jQXJyYXktPmxhc3RPdmVyZmxvd2VkWGlkKSkKLQkJCW54aWRzID0gS25vd25Bc3NpZ25l ZFhpZHNHZXQoeGlkcywgeGlkKTsKLQl9Ci0KIAlMV0xvY2tSZWxlYXNlKFByb2NBcnJheUxv Y2spOwogCiAJLyoKQEAgLTE4NTEsOCArMTQzNCw3IEBAIENvbXB1dGVYaWRIb3Jpem9ucyhD b21wdXRlWGlkSG9yaXpvbnNSZXN1bHQgKmgpCiAJCSAqIGNhbid0IGJlIHRpZWQgdG8gYSBz cGVjaWZpYyBkYXRhYmFzZS4pCiAJCSAqCiAJCSAqIEFsc28sIHdoaWxlIGluIHJlY292ZXJ5 IHdlIGNhbm5vdCBjb21wdXRlIGFuIGFjY3VyYXRlIHBlci1kYXRhYmFzZQotCQkgKiBob3Jp em9uLCBhcyBhbGwgeGlkcyBhcmUgbWFuYWdlZCB2aWEgdGhlIEtub3duQXNzaWduZWRYaWRz Ci0JCSAqIG1hY2hpbmVyeS4KKwkJICogaG9yaXpvbiwgYXMgYWxsIHhpZHMgYXJlIG1hbmFn ZWQgdmlhIHRoZSBDU04gbG9nIG1hY2hpbmVyeS4KIAkJICovCiAJCWlmIChwcm9jLT5kYXRh YmFzZUlkID09IE15RGF0YWJhc2VJZCB8fAogCQkJTXlEYXRhYmFzZUlkID09IEludmFsaWRP aWQgfHwKQEAgLTE4NjUsMTEgKzE0NDcsMTQgQEAgQ29tcHV0ZVhpZEhvcml6b25zKENvbXB1 dGVYaWRIb3Jpem9uc1Jlc3VsdCAqaCkKIAl9CiAKIAkvKgotCSAqIElmIGluIHJlY292ZXJ5 IGZldGNoIG9sZGVzdCB4aWQgaW4gS25vd25Bc3NpZ25lZFhpZHMsIHdpbGwgYmUgYXBwbGll ZAotCSAqIGFmdGVyIGxvY2sgaXMgcmVsZWFzZWQuCisJICogSWYgaW4gcmVjb3ZlcnkgZmV0 Y2ggb2xkZXN0IHhpZCBmcm9tIGxhc3QgY2hlY2twb2ludC4KKwkgKgorCSAqIFhYWDogdGhh dCBjYW4gYmUgbXVjaCBvbGRlciB0aGFuIHdoYXQgd2UgaGFkIHByZXZpb3VzbHkgd2l0aCB0 aGUKKwkgKiBrbm93bi1hc3NpZ25lZC14aWRzIG1hY2hpbmVyeS4gSSB0aGluayB0aGF0J3Mg T0ssIGdpdmVuIHdoYXQgdGhpcworCSAqIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIGR1cmluZyBy ZWNvdmVyeT8KIAkgKi8KIAlpZiAoaW5fcmVjb3ZlcnkpCi0JCWtheG1pbiA9IEtub3duQXNz aWduZWRYaWRzR2V0T2xkZXN0WG1pbigpOworCQlrYXhtaW4gPSBwcm9jQXJyYXktPm9sZGVz dF9ydW5uaW5nX3ByaW1hcnlfeGlkOwogCiAJLyoKIAkgKiBObyBvdGhlciBpbmZvcm1hdGlv biBmcm9tIHNoYXJlZCBzdGF0ZSBpcyBuZWVkZWQsIHJlbGVhc2UgdGhlIGxvY2sKQEAgLTIx ODgsNyArMTc3Myw3IEBAIEdldFNuYXBzaG90RGF0YShTbmFwc2hvdCBzbmFwc2hvdCkKIAlp bnQJCQlteXBneGFjdG9mZjsKIAlUcmFuc2FjdGlvbklkIG15eGlkOwogCXVpbnQ2NAkJY3Vy WGFjdENvbXBsZXRpb25Db3VudDsKLQorCVhMb2dSZWNQdHIJY3NuID0gSW52YWxpZFhMb2dS ZWNQdHI7CiAJVHJhbnNhY3Rpb25JZCByZXBsaWNhdGlvbl9zbG90X3htaW4gPSBJbnZhbGlk VHJhbnNhY3Rpb25JZDsKIAlUcmFuc2FjdGlvbklkIHJlcGxpY2F0aW9uX3Nsb3RfY2F0YWxv Z194bWluID0gSW52YWxpZFRyYW5zYWN0aW9uSWQ7CiAKQEAgLTIzNjgsMjcgKzE5NTMsOCBA QCBHZXRTbmFwc2hvdERhdGEoU25hcHNob3Qgc25hcHNob3QpCiAJZWxzZQogCXsKIAkJLyoK LQkJICogV2UncmUgaW4gaG90IHN0YW5kYnksIHNvIGdldCBYSURzIGZyb20gS25vd25Bc3Np Z25lZFhpZHMuCi0JCSAqCi0JCSAqIFdlIHN0b3JlIGFsbCB4aWRzIGRpcmVjdGx5IGludG8g c3VieGlwW10uIEhlcmUncyB3aHk6Ci0JCSAqCi0JCSAqIEluIHJlY292ZXJ5IHdlIGRvbid0 IGtub3cgd2hpY2ggeGlkcyBhcmUgdG9wLWxldmVsIGFuZCB3aGljaCBhcmUKLQkJICogc3Vi eGFjdHMsIGEgZGVzaWduIGNob2ljZSB0aGF0IGdyZWF0bHkgc2ltcGxpZmllcyB4aWQgcHJv Y2Vzc2luZy4KLQkJICoKLQkJICogSXQgc2VlbXMgbGlrZSB3ZSB3b3VsZCB3YW50IHRvIHRy eSB0byBwdXQgeGlkcyBpbnRvIHhpcFtdIG9ubHksIGJ1dAotCQkgKiB0aGF0IGlzIGZhaXJs eSBzbWFsbC4gV2Ugd291bGQgZWl0aGVyIG5lZWQgdG8gbWFrZSB0aGF0IGJpZ2dlciBvcgot CQkgKiB0byBpbmNyZWFzZSB0aGUgcmF0ZSBhdCB3aGljaCB3ZSBXQUwtbG9nIHhpZCBhc3Np Z25tZW50OyBuZWl0aGVyIGlzCi0JCSAqIGFuIGFwcGVhbGluZyBjaG9pY2UuCi0JCSAqCi0J CSAqIFdlIGNvdWxkIHRyeSB0byBzdG9yZSB4aWRzIGludG8geGlwW10gZmlyc3QgYW5kIHRo ZW4gaW50byBzdWJ4aXBbXQotCQkgKiBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgeGlkcy4gVGhh dCBvbmx5IHdvcmtzIGlmIHRoZSBzbmFwc2hvdCBkb2Vzbid0Ci0JCSAqIG92ZXJmbG93IGJl Y2F1c2Ugd2UgZG8gbm90IHNlYXJjaCBzdWJ4aXBbXSBpbiB0aGF0IGNhc2UuIEEgc2ltcGxl cgotCQkgKiB3YXkgaXMgdG8ganVzdCBzdG9yZSBhbGwgeGlkcyBpbiB0aGUgc3VieGlwIGFy cmF5IGJlY2F1c2UgdGhpcyBpcwotCQkgKiBieSBmYXIgdGhlIGJpZ2dlciBhcnJheS4gV2Ug anVzdCBsZWF2ZSB0aGUgeGlwIGFycmF5IGVtcHR5LgotCQkgKgotCQkgKiBFaXRoZXIgd2F5 IHdlIG5lZWQgdG8gY2hhbmdlIHRoZSB3YXkgWGlkSW5NVkNDU25hcHNob3QoKSB3b3Jrcwot CQkgKiBkZXBlbmRpbmcgdXBvbiB3aGVuIHRoZSBzbmFwc2hvdCB3YXMgdGFrZW4sIG9yIGNo YW5nZSBub3JtYWwKLQkJICogc25hcHNob3QgcHJvY2Vzc2luZyBzbyBpdCBtYXRjaGVzLgor CQkgKiBXZSdyZSBpbiBob3Qgc3RhbmRieSwgc28gZ2V0IHRoZSBjdXJyZW50IENTTi4gVGhh dCdzIHVzZWQgdG8KKwkJICogZGV0ZXJtaW5lIHdoaWNoIHRyYW5zYWN0aW9ucyBjb21taXR0 ZWQgYmVmb3JlIHRoaXMgc25hcHNob3QuCiAJCSAqCiAJCSAqIE5vdGU6IEl0IGlzIHBvc3Np YmxlIGZvciByZWNvdmVyeSB0byBlbmQgYmVmb3JlIHdlIGZpbmlzaCB0YWtpbmcKIAkJICog dGhlIHNuYXBzaG90LCBhbmQgZm9yIG5ld2x5IGFzc2lnbmVkIHRyYW5zYWN0aW9uIGlkcyB0 byBiZSBhZGRlZCB0bwpAQCAtMjM5NiwxNCArMTk2MiwxNyBAQCBHZXRTbmFwc2hvdERhdGEo U25hcHNob3Qgc25hcHNob3QpCiAJCSAqIHRob3NlIG5ld2x5IGFkZGVkIHRyYW5zYWN0aW9u IGlkcyB3b3VsZCBiZSBmaWx0ZXJlZCBhd2F5LCBzbyB3ZQogCQkgKiBuZWVkIG5vdCBiZSBj b25jZXJuZWQgYWJvdXQgdGhlbS4KIAkJICovCi0JCXN1YmNvdW50ID0gS25vd25Bc3NpZ25l ZFhpZHNHZXRBbmRTZXRYbWluKHNuYXBzaG90LT5zdWJ4aXAsICZ4bWluLAotCQkJCQkJCQkJ CQkJICB4bWF4KTsKKwkJeG1pbiA9IHByb2NBcnJheS0+b2xkZXN0X3J1bm5pbmdfcHJpbWFy eV94aWQ7CiAKLQkJaWYgKFRyYW5zYWN0aW9uSWRQcmVjZWRlc09yRXF1YWxzKHhtaW4sIHBy b2NBcnJheS0+bGFzdE92ZXJmbG93ZWRYaWQpKQotCQkJc3Vib3ZlcmZsb3dlZCA9IHRydWU7 CisJCS8qCisJCSAqIFRha2UgQ1NOIHVuZGVyIFByb2NBcnJheUxvY2sgc28gdGhlIHNuYXBz aG90IHN0YXlzIHN5bmNocm9uaXplZC4KKwkJICogKFhYWDogbm90IHN1cmUgdGhhdCdzIHN0 cmljdGx5IHJlcXVpcmVkLikKKwkJICogVGhpcyBpcyB3aGF0IGRldGVybWluZXMgd2hpY2gg dHJhbnNhY3Rpb25zIHdlIGNvbnNpZGVyIGZpbmlzaGVkIGFuZAorCQkgKiB3aGljaCBhcmUg c3RpbGwgaW4gcHJvZ3Jlc3MuCisJCSAqLworCQljc24gPSBUcmFuc2FtVmFyaWFibGVzLT5s YXRlc3RDb21taXRMU047CiAJfQogCi0KIAkvKgogCSAqIEZldGNoIGludG8gbG9jYWwgdmFy aWFibGUgd2hpbGUgUHJvY0FycmF5TG9jayBpcyBoZWxkIC0gdGhlCiAJICogTFdMb2NrUmVs ZWFzZSBiZWxvdyBpcyBhIGJhcnJpZXIsIGVuc3VyaW5nIHRoaXMgaGFwcGVucyBpbnNpZGUg dGhlCkBAIC0yNTE5LDYgKzIwODgsOCBAQCBHZXRTbmFwc2hvdERhdGEoU25hcHNob3Qgc25h cHNob3QpCiAJc25hcHNob3QtPmxzbiA9IEludmFsaWRYTG9nUmVjUHRyOwogCXNuYXBzaG90 LT53aGVuVGFrZW4gPSAwOwogCisJc25hcHNob3QtPnNuYXBzaG90Q3NuID0gY3NuOworCiAJ cmV0dXJuIHNuYXBzaG90OwogfQogCkBAIC0yNjc0LDkgKzIyNDUsNiBAQCBQcm9jQXJyYXlJ bnN0YWxsUmVzdG9yZWRYbWluKFRyYW5zYWN0aW9uSWQgeG1pbiwgUEdQUk9DICpwcm9jKQog ICogVGhlIHJldHVybmVkIGRhdGEgc3RydWN0dXJlIGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVk OyBjYWxsZXIgc2hvdWxkIG5vdAogICogbW9kaWZ5IGl0LCBhbmQgbXVzdCBub3QgYXNzdW1l IGl0IGlzIHZhbGlkIHBhc3QgdGhlIG5leHQgY2FsbC4KICAqCi0gKiBUaGlzIGlzIG5ldmVy IGV4ZWN1dGVkIGR1cmluZyByZWNvdmVyeSBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGxvb2sg YXQKLSAqIEtub3duQXNzaWduZWRYaWRzLgotICoKICAqIER1bW15IFBHUFJPQ3MgZnJvbSBw cmVwYXJlZCB0cmFuc2FjdGlvbiBhcmUgaW5jbHVkZWQsIG1lYW5pbmcgdGhhdCB0aGlzCiAg KiBtYXkgcmV0dXJuIGVudHJpZXMgd2l0aCBkdXBsaWNhdGVkIFRyYW5zYWN0aW9uSWQgdmFs dWVzIGNvbWluZyBmcm9tCiAgKiB0cmFuc2FjdGlvbiBmaW5pc2hpbmcgdG8gcHJlcGFyZS4g IE5vdGhpbmcgaXMgZG9uZSBhYm91dCBkdXBsaWNhdGVkCkBAIC0yNzA3LDYgKzIyNzUsNyBA QCBHZXRSdW5uaW5nVHJhbnNhY3Rpb25EYXRhKHZvaWQpCiAJaW50CQkJc3ViY291bnQ7CiAJ Ym9vbAkJc3Vib3ZlcmZsb3dlZDsKIAorCS8qIFRoaXMgaXMgbmV2ZXIgZXhlY3V0ZWQgZHVy aW5nIHJlY292ZXJ5ICovCiAJQXNzZXJ0KCFSZWNvdmVyeUluUHJvZ3Jlc3MoKSk7CiAKIAkv KgpAQCAtMjg3MywxNSArMjQ0MiwxNiBAQCBHZXRSdW5uaW5nVHJhbnNhY3Rpb25EYXRhKHZv aWQpCiAgKiBXZSBsb29rIGF0IGFsbCBkYXRhYmFzZXMsIHRob3VnaCB0aGVyZSBpcyBubyBu ZWVkIHRvIGluY2x1ZGUgV0FMU2VuZGVyCiAgKiBzaW5jZSB0aGlzIGhhcyBubyBlZmZlY3Qg b24gaG90IHN0YW5kYnkgY29uZmxpY3RzLgogICoKLSAqIFRoaXMgaXMgbmV2ZXIgZXhlY3V0 ZWQgZHVyaW5nIHJlY292ZXJ5IHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gbG9vayBhdAotICog S25vd25Bc3NpZ25lZFhpZHMuCisgKiBJZiBhbGxEYnMgaXMgZmFsc2UsIHNraXAgcHJvY2Vz c2VzIGF0dGFjaGVkIHRvIG90aGVyIGRhdGFiYXNlcy4KKyAqCisgKiBUaGlzIGlzIG5ldmVy IGV4ZWN1dGVkIGR1cmluZyByZWNvdmVyeS4KICAqCiAgKiBXZSBkb24ndCB3b3JyeSBhYm91 dCB1cGRhdGluZyBvdGhlciBjb3VudGVycywgd2Ugd2FudCB0byBrZWVwIHRoaXMgYXMKICAq IHNpbXBsZSBhcyBwb3NzaWJsZSBhbmQgbGVhdmUgR2V0U25hcHNob3REYXRhKCkgYXMgdGhl IHByaW1hcnkgY29kZSBmb3IKICAqIHRoYXQgYm9va2tlZXBpbmcuCiAgKi8KIFRyYW5zYWN0 aW9uSWQKLUdldE9sZGVzdEFjdGl2ZVRyYW5zYWN0aW9uSWQodm9pZCkKK0dldE9sZGVzdEFj dGl2ZVRyYW5zYWN0aW9uSWQoYm9vbCBhbGxEYnMpCiB7CiAJUHJvY0FycmF5U3RydWN0ICph cnJheVAgPSBwcm9jQXJyYXk7CiAJVHJhbnNhY3Rpb25JZCAqb3RoZXJfeGlkcyA9IFByb2NH bG9iYWwtPnhpZHM7CkBAIC0yOTAyLDExICsyNDcyLDEzIEBAIEdldE9sZGVzdEFjdGl2ZVRy YW5zYWN0aW9uSWQodm9pZCkKIAlMV0xvY2tSZWxlYXNlKFhpZEdlbkxvY2spOwogCiAJLyoK LQkgKiBTcGluIG92ZXIgcHJvY0FycmF5IGNvbGxlY3RpbmcgYWxsIHhpZHMgYW5kIHN1Ynhp ZHMuCisJICogU3BpbiBvdmVyIHByb2NBcnJheSBjaGVja2luZyBlYWNoIHhpZC4KIAkgKi8K IAlMV0xvY2tBY3F1aXJlKFByb2NBcnJheUxvY2ssIExXX1NIQVJFRCk7CiAJZm9yIChpbmRl eCA9IDA7IGluZGV4IDwgYXJyYXlQLT5udW1Qcm9jczsgaW5kZXgrKykKIAl7CisJCWludAkJ CXBncHJvY25vID0gYXJyYXlQLT5wZ3Byb2Nub3NbaW5kZXhdOworCQlQR1BST0MJICAgKnBy b2MgPSAmYWxsUHJvY3NbcGdwcm9jbm9dOwogCQlUcmFuc2FjdGlvbklkIHhpZDsKIAogCQkv KiBGZXRjaCB4aWQganVzdCBvbmNlIC0gc2VlIEdldE5ld1RyYW5zYWN0aW9uSWQgKi8KQEAg LTI5MTUsNiArMjQ4Nyw5IEBAIEdldE9sZGVzdEFjdGl2ZVRyYW5zYWN0aW9uSWQodm9pZCkK IAkJaWYgKCFUcmFuc2FjdGlvbklkSXNOb3JtYWwoeGlkKSkKIAkJCWNvbnRpbnVlOwogCisJ CWlmICghYWxsRGJzICYmIHByb2MtPmRhdGFiYXNlSWQgIT0gTXlEYXRhYmFzZUlkKQorCQkJ Y29udGludWU7CisKIAkJaWYgKFRyYW5zYWN0aW9uSWRQcmVjZWRlcyh4aWQsIG9sZGVzdFJ1 bm5pbmdYaWQpKQogCQkJb2xkZXN0UnVubmluZ1hpZCA9IHhpZDsKIApAQCAtMjk5Myw4ICsy NTY4LDggQEAgR2V0T2xkZXN0U2FmZURlY29kaW5nVHJhbnNhY3Rpb25JZChib29sIGNhdGFs b2dPbmx5KQogCSAqCiAJICogSW4gcmVjb3Zlcnkgd2UgY2FuJ3QgbG93ZXIgdGhlIHNhZmUg dmFsdWUgYmVzaWRlcyB3aGF0IHdlJ3ZlIGNvbXB1dGVkCiAJICogYWJvdmUsIHNvIHdlJ2xs IGhhdmUgdG8gd2FpdCBhIGJpdCBsb25nZXIgdGhlcmUuIFdlIHVuZm9ydHVuYXRlbHkgY2Fu Ci0JICogKm5vdCogdXNlIEtub3duQXNzaWduZWRYaWRzR2V0T2xkZXN0WG1pbigpIHNpbmNl IHRoZSBLbm93bkFzc2lnbmVkWGlkcwotCSAqIG1hY2hpbmVyeSBjYW4gbWlzcyB2YWx1ZXMg YW5kIHJldHVybiBhbiBvbGRlciB2YWx1ZSB0aGFuIGlzIHNhZmUuCisJICogKm5vdCogdXNl IG9sZGVzdF9ydW5uaW5nX3ByaW1hcnlfeGlkIHNpbmNlIHRoZSBYSUQgdHJhY2tpbmcgbWFj aGluZXJ5CisJICogY2FuIG1pc3MgdmFsdWVzIGFuZCByZXR1cm4gYW4gb2xkZXIgdmFsdWUg dGhhbiBpcyBzYWZlLgogCSAqLwogCWlmICghcmVjb3ZlcnlfaW5fcHJvZ3Jlc3MpCiAJewpA QCAtMzQxMiw2ICsyOTg3LDkgQEAgR2V0Q3VycmVudFZpcnR1YWxYSURzKFRyYW5zYWN0aW9u SWQgbGltaXRYbWluLCBib29sIGV4Y2x1ZGVYbWluMCwKICAqIGJ1dCB0aGF0IHdvdWxkIG5v dCBiZSB0cnVlIGluIHRoZSBjYXNlIG9mIEZBVEFMIGVycm9ycyBsYWdnaW5nIGluIGFycmF5 LAogICogYnV0IHdlIGFscmVhZHkga25vdyB0aG9zZSBhcmUgYm9ndXMgYW55d2F5LCBzbyB3 ZSBza2lwIHRoYXQgdGVzdC4KICAqCisgKiBYWFg6IEtub3duQXNzaWduZWRYaWRzIGlzIGdv bmUgc28gdGhlIGFib3ZlIGNvbW1lbnQgbmVlZHMgdXBkYXRpbmcuIElzCisgKiB0aGUgY29k ZSBzdGlsbCBjb3JyZWN0PyBJIHRoaW5rIHNvIGJ1dCBuZWVkIHRvIGRvdWJsZS1jaGVjay4K KyAqCiAgKiBJZiBkYk9pZCBpcyB2YWxpZCB3ZSBza2lwIGJhY2tlbmRzIGF0dGFjaGVkIHRv IG90aGVyIGRhdGFiYXNlcy4KICAqCiAgKiBCZSBjYXJlZnVsIHRvICpub3QqIHBmcmVlIHRo ZSByZXN1bHQgZnJvbSB0aGlzIGZ1bmN0aW9uLiBXZSByZXVzZQpAQCAtNDA4MywxNCArMzY2 MSwxNCBAQCBzdGF0aWMgdm9pZAogRGlzcGxheVhpZENhY2hlKHZvaWQpCiB7CiAJZnByaW50 ZihzdGRlcnIsCi0JCQkiWGlkQ2FjaGU6IHhtaW46ICVsZCwga25vd246ICVsZCwgbXl4YWN0 OiAlbGQsIGxhdGVzdDogJWxkLCBtYWlueGlkOiAlbGQsIGNoaWxkeGlkOiAlbGQsIGtub3du YXNzaWduZWQ6ICVsZCwgbm9vZmxvOiAlbGQsIHNsb3c6ICVsZFxuIiwKKwkJCSJYaWRDYWNo ZTogeG1pbjogJWxkLCBrbm93bjogJWxkLCBteXhhY3Q6ICVsZCwgbGF0ZXN0OiAlbGQsIG1h aW54aWQ6ICVsZCwgY2hpbGR4aWQ6ICVsZCwgZHVyaW5nX3JlY292ZXJ5OiAlbGQsIG5vb2Zs bzogJWxkLCBzbG93OiAlbGRcbiIsCiAJCQl4Y19ieV9yZWNlbnRfeG1pbiwKIAkJCXhjX2J5 X2tub3duX3hhY3QsCiAJCQl4Y19ieV9teV94YWN0LAogCQkJeGNfYnlfbGF0ZXN0X3hpZCwK IAkJCXhjX2J5X21haW5feGlkLAogCQkJeGNfYnlfY2hpbGRfeGlkLAotCQkJeGNfYnlfa25v d25fYXNzaWduZWQsCisJCQl4Y19kdXJpbmdfcmVjb3ZlcnksCiAJCQl4Y19ub19vdmVyZmxv dywKIAkJCXhjX3Nsb3dfYW5zd2VyKTsKIH0KQEAgLTQzMzcsNjEgKzM5MTUsNiBAQCBGdWxs WGlkUmVsYXRpdmVUbyhGdWxsVHJhbnNhY3Rpb25JZCByZWwsIFRyYW5zYWN0aW9uSWQgeGlk KQogfQogCiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KLSAqCQlLbm93bkFzc2lnbmVkVHJhbnNhY3Rpb25JZHMgc3ViLW1vZHVsZQotICog LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0K LS8qCi0gKiBJbiBIb3QgU3RhbmRieSBtb2RlLCB3ZSBtYWludGFpbiBhIGxpc3Qgb2YgdHJh bnNhY3Rpb25zIHRoYXQgYXJlIChvciB3ZXJlKQotICogcnVubmluZyBvbiB0aGUgcHJpbWFy eSBhdCB0aGUgY3VycmVudCBwb2ludCBpbiBXQUwuICBUaGVzZSBYSURzIG11c3QgYmUKLSAq IHRyZWF0ZWQgYXMgcnVubmluZyBieSBzdGFuZGJ5IHRyYW5zYWN0aW9ucywgZXZlbiB0aG91 Z2ggdGhleSBhcmUgbm90IGluCi0gKiB0aGUgc3RhbmRieSBzZXJ2ZXIncyBQR1BST0MgYXJy YXkuCi0gKgotICogV2UgcmVjb3JkIGFsbCBYSURzIHRoYXQgd2Uga25vdyBoYXZlIGJlZW4g YXNzaWduZWQuICBUaGF0IGluY2x1ZGVzIGFsbCB0aGUKLSAqIFhJRHMgc2VlbiBpbiBXQUwg cmVjb3JkcywgcGx1cyBhbGwgdW5vYnNlcnZlZCBYSURzIHRoYXQgd2UgY2FuIGRlZHVjZSBo YXZlCi0gKiBiZWVuIGFzc2lnbmVkLiAgV2UgY2FuIGRlZHVjZSB0aGUgZXhpc3RlbmNlIG9m IHVub2JzZXJ2ZWQgWElEcyBiZWNhdXNlIHdlCi0gKiBrbm93IFhJRHMgYXJlIGFzc2lnbmVk IGluIHNlcXVlbmNlLCB3aXRoIG5vIGdhcHMuICBUaGUgS25vd25Bc3NpZ25lZFhpZHMKLSAq IGxpc3QgZXhwYW5kcyBhcyBuZXcgWElEcyBhcmUgb2JzZXJ2ZWQgb3IgaW5mZXJyZWQsIGFu ZCBjb250cmFjdHMgd2hlbgotICogdHJhbnNhY3Rpb24gY29tcGxldGlvbiByZWNvcmRzIGFy cml2ZS4KLSAqCi0gKiBEdXJpbmcgaG90IHN0YW5kYnkgd2UgZG8gbm90IGZyZXQgdG9vIG11 Y2ggYWJvdXQgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4KLSAqIHRvcC1sZXZlbCBYSURzIGFu ZCBzdWJ0cmFuc2FjdGlvbiBYSURzLiBXZSBzdG9yZSBib3RoIHRvZ2V0aGVyIGluIHRoZQot ICogS25vd25Bc3NpZ25lZFhpZHMgbGlzdC4gIEluIGJhY2tlbmRzLCB0aGlzIGlzIGNvcGll ZCBpbnRvIHNuYXBzaG90cyBpbgotICogR2V0U25hcHNob3REYXRhKCksIHRha2luZyBhZHZh bnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCBYaWRJbk1WQ0NTbmFwc2hvdCgpCi0gKiBkb2Vzbid0 IGNhcmUgYWJvdXQgdGhlIGRpc3RpbmN0aW9uIGVpdGhlci4gIFN1YnRyYW5zYWN0aW9uIFhJ RHMgYXJlCi0gKiBlZmZlY3RpdmVseSB0cmVhdGVkIGFzIHRvcC1sZXZlbCBYSURzIGFuZCBp biB0aGUgdHlwaWNhbCBjYXNlIHBnX3N1YnRyYW5zCi0gKiBsaW5rcyBhcmUgKm5vdCogbWFp bnRhaW5lZCAod2hpY2ggZG9lcyBub3QgYWZmZWN0IHZpc2liaWxpdHkpLgotICoKLSAqIFdl IGhhdmUgcm9vbSBpbiBLbm93bkFzc2lnbmVkWGlkcyBhbmQgaW4gc25hcHNob3RzIHRvIGhv bGQgbWF4UHJvY3MgKgotICogKDEgKyBQR1BST0NfTUFYX0NBQ0hFRF9TVUJYSURTKSBYSURz LCBzbyBldmVyeSBwcmltYXJ5IHRyYW5zYWN0aW9uIG11c3QKLSAqIHJlcG9ydCBpdHMgc3Vi dHJhbnNhY3Rpb24gWElEcyBpbiBhIFdBTCBYTE9HX1hBQ1RfQVNTSUdOTUVOVCByZWNvcmQg YXQKLSAqIGxlYXN0IGV2ZXJ5IFBHUFJPQ19NQVhfQ0FDSEVEX1NVQlhJRFMuICBXaGVuIHdl IHJlY2VpdmUgb25lIG9mIHRoZXNlCi0gKiByZWNvcmRzLCB3ZSBtYXJrIHRoZSBzdWJYSURz IGFzIGNoaWxkcmVuIG9mIHRoZSB0b3AgWElEIGluIHBnX3N1YnRyYW5zLAotICogYW5kIHRo ZW4gcmVtb3ZlIHRoZW0gZnJvbSBLbm93bkFzc2lnbmVkWGlkcy4gIFRoaXMgcHJldmVudHMg b3ZlcmZsb3cgb2YKLSAqIEtub3duQXNzaWduZWRYaWRzIGFuZCBzbmFwc2hvdHMsIGF0IHRo ZSBjb3N0IHRoYXQgc3RhdHVzIGNoZWNrcyBmb3IgdGhlc2UKLSAqIHN1YlhJRHMgd2lsbCB0 YWtlIGEgc2xvd2VyIHBhdGggdGhyb3VnaCBUcmFuc2FjdGlvbklkSXNJblByb2dyZXNzKCku Ci0gKiBUaGlzIG1lYW5zIHRoYXQgS25vd25Bc3NpZ25lZFhpZHMgaXMgbm90IG5lY2Vzc2Fy aWx5IGNvbXBsZXRlIGZvciBzdWJYSURzLAotICogdGhvdWdoIGl0IHNob3VsZCBiZSBjb21w bGV0ZSBmb3IgdG9wLWxldmVsIFhJRHM7IHRoaXMgaXMgdGhlIHNhbWUgc2l0dWF0aW9uCi0g KiB0aGF0IGhvbGRzIHdpdGggcmVzcGVjdCB0byB0aGUgUEdQUk9DIGVudHJpZXMgaW4gbm9y bWFsIHJ1bm5pbmcuCi0gKgotICogV2hlbiB3ZSB0aHJvdyBhd2F5IHN1YlhJRHMgZnJvbSBL bm93bkFzc2lnbmVkWGlkcywgd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mCi0gKiB0aGF0LCBz aW1pbGFybHkgdG8gdHJhY2tpbmcgb3ZlcmZsb3cgb2YgYSBQR1BST0MncyBzdWJ4aWRzIGFy cmF5LiAgV2UgZG8KLSAqIHRoYXQgYnkgcmVtZW1iZXJpbmcgdGhlIGxhc3RPdmVyZmxvd2Vk WGlkLCBpZSB0aGUgbGFzdCB0aHJvd24tYXdheSBzdWJYSUQuCi0gKiBBcyBsb25nIGFzIHRo YXQgaXMgd2l0aGluIHRoZSByYW5nZSBvZiBpbnRlcmVzdGluZyBYSURzLCB3ZSBoYXZlIHRv IGFzc3VtZQotICogdGhhdCBzdWJYSURzIGFyZSBtaXNzaW5nIGZyb20gc25hcHNob3RzLiAg KE5vdGUgdGhhdCBzdWJYSUQgb3ZlcmZsb3cgb2NjdXJzCi0gKiBvbiBwcmltYXJ5IHdoZW4g NjV0aCBzdWJYSUQgYXJyaXZlcywgd2hlcmVhcyBvbiBzdGFuZGJ5IGl0IG9jY3VycyB3aGVu IDY0dGgKLSAqIHN1YlhJRCBhcnJpdmVzIC0gdGhhdCBpcyBub3QgYW4gZXJyb3IuKQotICoK LSAqIFNob3VsZCBhIGJhY2tlbmQgb24gcHJpbWFyeSBzb21laG93IGRpc2FwcGVhciBiZWZv cmUgaXQgY2FuIHdyaXRlIGFuIGFib3J0Ci0gKiByZWNvcmQsIHRoZW4gd2UganVzdCBsZWF2 ZSB0aG9zZSBYSURzIGluIEtub3duQXNzaWduZWRYaWRzLiBUaGV5IGFjdHVhbGx5Ci0gKiBh Ym9ydGVkIGJ1dCB3ZSB0aGluayB0aGV5IHdlcmUgcnVubmluZzsgdGhlIGRpc3RpbmN0aW9u IGlzIGlycmVsZXZhbnQKLSAqIGJlY2F1c2UgZWl0aGVyIHdheSBhbnkgY2hhbmdlcyBkb25l IGJ5IHRoZSB0cmFuc2FjdGlvbiBhcmUgbm90IHZpc2libGUgdG8KLSAqIGJhY2tlbmRzIGlu IHRoZSBzdGFuZGJ5LiAgV2UgcHJ1bmUgS25vd25Bc3NpZ25lZFhpZHMgd2hlbgotICogWExP R19SVU5OSU5HX1hBQ1RTIGFycml2ZXMsIHRvIGZvcmVzdGFsbCBwb3NzaWJsZSBvdmVyZmxv dyBvZiB0aGUKLSAqIGFycmF5IGR1ZSB0byBzdWNoIGRlYWQgWElEcy4KLSAqLwotCiAvKgog ICogUmVjb3JkS25vd25Bc3NpZ25lZFRyYW5zYWN0aW9uSWRzCiAgKgkJUmVjb3JkIHRoZSBn aXZlbiBYSUQgaW4gS25vd25Bc3NpZ25lZFhpZHMsIGFzIHdlbGwgYXMgYW55IHByZWNlZGlu ZwpAQCAtNDQwNiw3ICszOTI5LDcgQEAgRnVsbFhpZFJlbGF0aXZlVG8oRnVsbFRyYW5zYWN0 aW9uSWQgcmVsLCBUcmFuc2FjdGlvbklkIHhpZCkKIHZvaWQKIFJlY29yZEtub3duQXNzaWdu ZWRUcmFuc2FjdGlvbklkcyhUcmFuc2FjdGlvbklkIHhpZCkKIHsKLQlBc3NlcnQoc3RhbmRi eVN0YXRlID49IFNUQU5EQllfSU5JVElBTElaRUQpOworCUFzc2VydChJbkhvdFN0YW5kYnkp OwogCUFzc2VydChUcmFuc2FjdGlvbklkSXNWYWxpZCh4aWQpKTsKIAlBc3NlcnQoVHJhbnNh Y3Rpb25JZElzVmFsaWQobGF0ZXN0T2JzZXJ2ZWRYaWQpKTsKIApAQCAtNDQyNCwzOCArMzk0 NywxOSBAQCBSZWNvcmRLbm93bkFzc2lnbmVkVHJhbnNhY3Rpb25JZHMoVHJhbnNhY3Rpb25J ZCB4aWQpCiAKIAkJLyoKIAkJICogRXh0ZW5kIHN1YnRyYW5zIGxpa2Ugd2UgZG8gaW4gR2V0 TmV3VHJhbnNhY3Rpb25JZCgpIGR1cmluZyBub3JtYWwKLQkJICogb3BlcmF0aW9uIHVzaW5n IGluZGl2aWR1YWwgZXh0ZW5kIHN0ZXBzLiBOb3RlIHRoYXQgd2UgZG8gbm90IG5lZWQKLQkJ ICogdG8gZXh0ZW5kIGNsb2cgc2luY2UgaXRzIGV4dGVuc2lvbnMgYXJlIFdBTCBsb2dnZWQu Ci0JCSAqCi0JCSAqIFRoaXMgcGFydCBoYXMgdG8gYmUgZG9uZSByZWdhcmRsZXNzIG9mIHN0 YW5kYnlTdGF0ZSBzaW5jZSB3ZQotCQkgKiBpbW1lZGlhdGVseSBzdGFydCBhc3NpZ25pbmcg c3VidHJhbnNhY3Rpb25zIHRvIHRoZWlyIHRvcGxldmVsCi0JCSAqIHRyYW5zYWN0aW9ucy4K KwkJICogb3BlcmF0aW9uIHVzaW5nIGluZGl2aWR1YWwgZXh0ZW5kIHN0ZXBzLiBBbmQgQ1NO IGxvZywgdG9vLiBOb3RlCisJCSAqIHRoYXQgd2UgZG8gbm90IG5lZWQgdG8gZXh0ZW5kIGNs b2cgc2luY2UgaXRzIGV4dGVuc2lvbnMgYXJlIFdBTAorCQkgKiBsb2dnZWQuCiAJCSAqLwog CQluZXh0X2V4cGVjdGVkX3hpZCA9IGxhdGVzdE9ic2VydmVkWGlkOwogCQl3aGlsZSAoVHJh bnNhY3Rpb25JZFByZWNlZGVzKG5leHRfZXhwZWN0ZWRfeGlkLCB4aWQpKQogCQl7CiAJCQlU cmFuc2FjdGlvbklkQWR2YW5jZShuZXh0X2V4cGVjdGVkX3hpZCk7CiAJCQlFeHRlbmRTVUJU UkFOUyhuZXh0X2V4cGVjdGVkX3hpZCk7CisJCQlFeHRlbmRDU05Mb2cobmV4dF9leHBlY3Rl ZF94aWQpOwogCQl9CiAJCUFzc2VydChuZXh0X2V4cGVjdGVkX3hpZCA9PSB4aWQpOwogCi0J CS8qCi0JCSAqIElmIHRoZSBLbm93bkFzc2lnbmVkWGlkcyBtYWNoaW5lcnkgaXNuJ3QgdXAg eWV0LCB0aGVyZSdzIG5vdGhpbmcKLQkJICogbW9yZSB0byBkbyBzaW5jZSB3ZSBkb24ndCB0 cmFjayBhc3NpZ25lZCB4aWRzIHlldC4KLQkJICovCi0JCWlmIChzdGFuZGJ5U3RhdGUgPD0g U1RBTkRCWV9JTklUSUFMSVpFRCkKLQkJewotCQkJbGF0ZXN0T2JzZXJ2ZWRYaWQgPSB4aWQ7 Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKgotCQkgKiBBZGQgKGxhdGVzdE9ic2VydmVkWGlk LCB4aWRdIG9udG8gdGhlIEtub3duQXNzaWduZWRYaWRzIGFycmF5LgotCQkgKi8KLQkJbmV4 dF9leHBlY3RlZF94aWQgPSBsYXRlc3RPYnNlcnZlZFhpZDsKLQkJVHJhbnNhY3Rpb25JZEFk dmFuY2UobmV4dF9leHBlY3RlZF94aWQpOwotCQlLbm93bkFzc2lnbmVkWGlkc0FkZChuZXh0 X2V4cGVjdGVkX3hpZCwgeGlkLCBmYWxzZSk7Ci0KIAkJLyoKIAkJICogTm93IHdlIGNhbiBh ZHZhbmNlIGxhdGVzdE9ic2VydmVkWGlkCiAJCSAqLwpAQCAtNDQ2Nyw3ODEgKzM5NzEsNjEg QEAgUmVjb3JkS25vd25Bc3NpZ25lZFRyYW5zYWN0aW9uSWRzKFRyYW5zYWN0aW9uSWQgeGlk KQogfQogCiAvKgotICogRXhwaXJlVHJlZUtub3duQXNzaWduZWRUcmFuc2FjdGlvbklkcwot ICoJCVJlbW92ZSB0aGUgZ2l2ZW4gWElEcyBmcm9tIEtub3duQXNzaWduZWRYaWRzLgorICog UHJvY0FycmF5UmVjb3ZlcnlFbmRUcmFuc2FjdGlvbgorICoKKyAqIENhbGxlZCBkdXJpbmcg cmVjb3ZlcnkgaW4gYW5hbG9neSB3aXRoIGFuZCBpbiBwbGFjZSBvZgorICogUHJvY0FycmF5 RW5kVHJhbnNhY3Rpb24oKS4gVGhlIHRyYW5zYWN0aW9uIGJlY29tZXMgdmlzaWJsZSB0byBh bnkgbmV3CisgKiBzbmFwc2hvdHMgdGFrZW4gYWZ0ZXIgdGhpcy4gJ21heF94aWQnIGlzIHRo ZSBoaWdoZXN0IChzdWIpWElEIG9mIHRoZQorICogY29tbWl0dGVkIHRyYW5zYWN0aW9uLCBh bmQgJ2xzbicgaXMgTFNOIG9mIHRoZSBjb21taXQgcmVjb3JkLgogICoKLSAqIENhbGxlZCBk dXJpbmcgcmVjb3ZlcnkgaW4gYW5hbG9neSB3aXRoIGFuZCBpbiBwbGFjZSBvZiBQcm9jQXJy YXlFbmRUcmFuc2FjdGlvbigpCisgKiBUaGUgdHJhbnNhY3Rpb24gYW5kIGFsbCBpdHMgc3Vi dHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBhbHJlYWR5IG1hcmtlZCBhcworICogY29tbWl0dGVk IGluIHRoZSBDTE9HIGFuZCBpbiB0aGUgQ1NOTE9HLgogICovCiB2b2lkCi1FeHBpcmVUcmVl S25vd25Bc3NpZ25lZFRyYW5zYWN0aW9uSWRzKFRyYW5zYWN0aW9uSWQgeGlkLCBpbnQgbnN1 YnhpZHMsCi0JCQkJCQkJCQkgIFRyYW5zYWN0aW9uSWQgKnN1YnhpZHMsIFRyYW5zYWN0aW9u SWQgbWF4X3hpZCkKK1Byb2NBcnJheVJlY292ZXJ5RW5kVHJhbnNhY3Rpb24oVHJhbnNhY3Rp b25JZCBtYXhfeGlkLCBYTG9nUmVjUHRyIGxzbikKIHsKLQlBc3NlcnQoc3RhbmRieVN0YXRl ID49IFNUQU5EQllfSU5JVElBTElaRUQpOworCVRyYW5zYWN0aW9uSWQgb2xkZXN0X3J1bm5p bmdfcHJpbWFyeV94aWQ7CisKKwlBc3NlcnQoSW5Ib3RTdGFuZGJ5KTsKKworCS8qCisJICog SWYgdGhpcyB3YXMgdGhlIHRoZSBvbGRlc3QgWElEIHRoYXQgd2FzIHN0aWxsIHJ1bm5pbmcs IGFkdmFuY2UgaXQuCisJICogVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGFkdmFuY2luZyB0aGUg Z2xvYmFsIHhtaW4sIHdoaWNoIGF2b2lkcworCSAqIHVubmVjZXNzYXJ5IHJlY292ZXJ5IGNv bmZsaWN0cworCSAqCisJICogTm8gbG9ja2luZyByZXF1aXJlZCBiZWNhdXNlIHRoaXMgcnVu cyBpbiB0aGUgc3RhcnR1cCBwcm9jZXNzLgorCSAqCisJICogWFhYOiB0aGUgY2FsbGVyIGFj dHVhbGx5IGhhcyBhIGxpc3Qgb2YgWElEcyB0aGF0IGp1c3QgY29tbWl0dGVkLiBXZQorCSAq IGNvdWxkIHNhdmUgc29tZSBjbG9nIGxvb2t1cHMgYnkgdGFraW5nIGFkdmFudGFnZSBvZiB0 aGF0IGxpc3QuCisJICovCisJb2xkZXN0X3J1bm5pbmdfcHJpbWFyeV94aWQgPSBwcm9jQXJy YXktPm9sZGVzdF9ydW5uaW5nX3ByaW1hcnlfeGlkOworCXdoaWxlIChvbGRlc3RfcnVubmlu Z19wcmltYXJ5X3hpZCA8IG1heF94aWQpCisJeworCQlpZiAoIVRyYW5zYWN0aW9uSWREaWRD b21taXQob2xkZXN0X3J1bm5pbmdfcHJpbWFyeV94aWQpICYmCisJCQkhVHJhbnNhY3Rpb25J ZERpZEFib3J0KG9sZGVzdF9ydW5uaW5nX3ByaW1hcnlfeGlkKSkKKwkJeworCQkJYnJlYWs7 CisJCX0KKwkJVHJhbnNhY3Rpb25JZEFkdmFuY2Uob2xkZXN0X3J1bm5pbmdfcHJpbWFyeV94 aWQpOworCX0KKwlpZiAobWF4X3hpZCA9PSBvbGRlc3RfcnVubmluZ19wcmltYXJ5X3hpZCkK KwkJVHJhbnNhY3Rpb25JZEFkdmFuY2Uob2xkZXN0X3J1bm5pbmdfcHJpbWFyeV94aWQpOwog CiAJLyoKIAkgKiBVc2VzIHNhbWUgbG9ja2luZyBhcyB0cmFuc2FjdGlvbiBjb21taXQKIAkg Ki8KIAlMV0xvY2tBY3F1aXJlKFByb2NBcnJheUxvY2ssIExXX0VYQ0xVU0lWRSk7CiAKLQlL bm93bkFzc2lnbmVkWGlkc1JlbW92ZVRyZWUoeGlkLCBuc3VieGlkcywgc3VieGlkcyk7Ci0K IAkvKiBBcyBpbiBQcm9jQXJyYXlFbmRUcmFuc2FjdGlvbiwgYWR2YW5jZSBsYXRlc3RDb21w bGV0ZWRYaWQgKi8KIAlNYWludGFpbkxhdGVzdENvbXBsZXRlZFhpZFJlY292ZXJ5KG1heF94 aWQpOwogCiAJLyogLi4uIGFuZCB4YWN0Q29tcGxldGlvbkNvdW50ICovCiAJVHJhbnNhbVZh cmlhYmxlcy0+eGFjdENvbXBsZXRpb25Db3VudCsrOwogCi0JTFdMb2NrUmVsZWFzZShQcm9j QXJyYXlMb2NrKTsKLX0KLQotLyoKLSAqIEV4cGlyZUFsbEtub3duQXNzaWduZWRUcmFuc2Fj dGlvbklkcwotICoJCVJlbW92ZSBhbGwgZW50cmllcyBpbiBLbm93bkFzc2lnbmVkWGlkcyBh bmQgcmVzZXQgbGFzdE92ZXJmbG93ZWRYaWQuCi0gKi8KLXZvaWQKLUV4cGlyZUFsbEtub3du QXNzaWduZWRUcmFuc2FjdGlvbklkcyh2b2lkKQotewotCUxXTG9ja0FjcXVpcmUoUHJvY0Fy cmF5TG9jaywgTFdfRVhDTFVTSVZFKTsKLQlLbm93bkFzc2lnbmVkWGlkc1JlbW92ZVByZWNl ZGluZyhJbnZhbGlkVHJhbnNhY3Rpb25JZCk7Ci0KLQkvKgotCSAqIFJlc2V0IGxhc3RPdmVy Zmxvd2VkWGlkLiAgQ3VycmVudGx5LCBsYXN0T3ZlcmZsb3dlZFhpZCBoYXMgbm8gdXNlIGFm dGVyCi0JICogdGhlIGNhbGwgb2YgdGhpcyBmdW5jdGlvbi4gIEJ1dCBkbyB0aGlzIGZvciB1 bmlmaWNhdGlvbiB3aXRoIHdoYXQKLQkgKiBFeHBpcmVPbGRLbm93bkFzc2lnbmVkVHJhbnNh Y3Rpb25JZHMoKSBkby4KLQkgKi8KLQlwcm9jQXJyYXktPmxhc3RPdmVyZmxvd2VkWGlkID0g SW52YWxpZFRyYW5zYWN0aW9uSWQ7Ci0JTFdMb2NrUmVsZWFzZShQcm9jQXJyYXlMb2NrKTsK LX0KLQotLyoKLSAqIEV4cGlyZU9sZEtub3duQXNzaWduZWRUcmFuc2FjdGlvbklkcwotICoJ CVJlbW92ZSBLbm93bkFzc2lnbmVkWGlkcyBlbnRyaWVzIHByZWNlZGluZyB0aGUgZ2l2ZW4g WElEIGFuZAotICoJCXBvdGVudGlhbGx5IHJlc2V0IGxhc3RPdmVyZmxvd2VkWGlkLgotICov Ci12b2lkCi1FeHBpcmVPbGRLbm93bkFzc2lnbmVkVHJhbnNhY3Rpb25JZHMoVHJhbnNhY3Rp b25JZCB4aWQpCi17Ci0JTFdMb2NrQWNxdWlyZShQcm9jQXJyYXlMb2NrLCBMV19FWENMVVNJ VkUpOwotCi0JLyoKLQkgKiBSZXNldCBsYXN0T3ZlcmZsb3dlZFhpZCBpZiB3ZSBrbm93IGFs bCB0cmFuc2FjdGlvbnMgdGhhdCBoYXZlIGJlZW4KLQkgKiBwb3NzaWJseSBydW5uaW5nIGFy ZSBiZWluZyBnb25lLiAgTm90IGRvaW5nIHNvIGNvdWxkIGNhdXNlIGFuIGluY29ycmVjdAot CSAqIGxhc3RPdmVyZmxvd2VkWGlkIHZhbHVlLCB3aGljaCBtYWtlcyBleHRyYSBzbmFwc2hv dHMgYmUgbWFya2VkIGFzCi0JICogc3Vib3ZlcmZsb3dlZC4KLQkgKi8KLQlpZiAoVHJhbnNh Y3Rpb25JZFByZWNlZGVzKHByb2NBcnJheS0+bGFzdE92ZXJmbG93ZWRYaWQsIHhpZCkpCi0J CXByb2NBcnJheS0+bGFzdE92ZXJmbG93ZWRYaWQgPSBJbnZhbGlkVHJhbnNhY3Rpb25JZDsK LQlLbm93bkFzc2lnbmVkWGlkc1JlbW92ZVByZWNlZGluZyh4aWQpOwotCUxXTG9ja1JlbGVh c2UoUHJvY0FycmF5TG9jayk7Ci19Ci0KLS8qCi0gKiBLbm93bkFzc2lnbmVkVHJhbnNhY3Rp b25JZHNJZGxlTWFpbnRlbmFuY2UKLSAqCQlPcHBvcnR1bmlzdGljYWxseSBkbyBtYWludGVu YW5jZSB3b3JrIHdoZW4gdGhlIHN0YXJ0dXAgcHJvY2VzcwotICoJCWlzIGFib3V0IHRvIGdv IGlkbGUuCi0gKi8KLXZvaWQKLUtub3duQXNzaWduZWRUcmFuc2FjdGlvbklkc0lkbGVNYWlu dGVuYW5jZSh2b2lkKQotewotCUtub3duQXNzaWduZWRYaWRzQ29tcHJlc3MoS0FYX1NUQVJU VVBfUFJPQ0VTU19JRExFLCBmYWxzZSk7Ci19Ci0KLQotLyoKLSAqIFByaXZhdGUgbW9kdWxl IGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIEtub3duQXNzaWduZWRYaWRzCi0gKgotICogVGhl cmUgYXJlIDUgbWFpbiB1c2VzIG9mIHRoZSBLbm93bkFzc2lnbmVkWGlkcyBkYXRhIHN0cnVj dHVyZToKLSAqCi0gKgkqIGJhY2tlbmRzIHRha2luZyBzbmFwc2hvdHMgLSBhbGwgdmFsaWQg WElEcyBuZWVkIHRvIGJlIGNvcGllZCBvdXQKLSAqCSogYmFja2VuZHMgc2Vla2luZyB0byBk ZXRlcm1pbmUgcHJlc2VuY2Ugb2YgYSBzcGVjaWZpYyBYSUQKLSAqCSogc3RhcnR1cCBwcm9j ZXNzIGFkZGluZyBuZXcga25vd24tYXNzaWduZWQgWElEcwotICoJKiBzdGFydHVwIHByb2Nl c3MgcmVtb3Zpbmcgc3BlY2lmaWMgWElEcyBhcyB0cmFuc2FjdGlvbnMgZW5kCi0gKgkqIHN0 YXJ0dXAgcHJvY2VzcyBwcnVuaW5nIGFycmF5IHdoZW4gc3BlY2lhbCBXQUwgcmVjb3JkcyBh cnJpdmUKLSAqCi0gKiBUaGlzIGRhdGEgc3RydWN0dXJlIGlzIGtub3duIHRvIGJlIGEgaG90 IHNwb3QgZHVyaW5nIEhvdCBTdGFuZGJ5LCBzbyB3ZQotICogZ28gdG8gc29tZSBsZW5ndGhz IHRvIG1ha2UgdGhlc2Ugb3BlcmF0aW9ucyBhcyBlZmZpY2llbnQgYW5kIGFzIGNvbmN1cnJl bnQKLSAqIGFzIHBvc3NpYmxlLgotICoKLSAqIFRoZSBYSURzIGFyZSBzdG9yZWQgaW4gYW4g YXJyYXkgaW4gc29ydGVkIG9yZGVyIC0tLSBUcmFuc2FjdGlvbklkUHJlY2VkZXMKLSAqIG9y ZGVyLCB0byBiZSBleGFjdCAtLS0gdG8gYWxsb3cgYmluYXJ5IHNlYXJjaCBmb3Igc3BlY2lm aWMgWElEcy4gIE5vdGU6Ci0gKiBpbiBnZW5lcmFsIFRyYW5zYWN0aW9uSWRQcmVjZWRlcyB3 b3VsZCBub3QgcHJvdmlkZSBhIHRvdGFsIG9yZGVyLCBidXQKLSAqIHdlIGtub3cgdGhhdCB0 aGUgZW50cmllcyBwcmVzZW50IGF0IGFueSBpbnN0YW50IHNob3VsZCBub3QgZXh0ZW5kIGFj cm9zcwotICogYSBsYXJnZSBlbm91Z2ggZnJhY3Rpb24gb2YgWElEIHNwYWNlIHRvIHdyYXAg YXJvdW5kICh0aGUgcHJpbWFyeSB3b3VsZAotICogc2h1dCBkb3duIGZvciBmZWFyIG9mIFhJ RCB3cmFwIGxvbmcgYmVmb3JlIHRoYXQgaGFwcGVucykuICBTbyBpdCdzIE9LIHRvCi0gKiB1 c2UgVHJhbnNhY3Rpb25JZFByZWNlZGVzIGFzIGEgYmluYXJ5LXNlYXJjaCBjb21wYXJhdG9y LgotICoKLSAqIEl0J3MgY2hlYXAgdG8gbWFpbnRhaW4gdGhlIHNvcnRlZG5lc3MgZHVyaW5n IGluc2VydGlvbnMsIHNpbmNlIG5ldyBrbm93bgotICogWElEcyBhcmUgYWx3YXlzIHJlcG9y dGVkIGluIFhJRCBvcmRlcjsgd2UganVzdCBhcHBlbmQgdGhlbSBhdCB0aGUgcmlnaHQuCi0g KgotICogVG8ga2VlcCBpbmRpdmlkdWFsIGRlbGV0aW9ucyBjaGVhcCwgd2UgbmVlZCB0byBh bGxvdyBnYXBzIGluIHRoZSBhcnJheS4KLSAqIFRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgbWFy a2luZyBhcnJheSBlbGVtZW50cyBhcyB2YWxpZCBvciBpbnZhbGlkIHVzaW5nCi0gKiB0aGUg cGFyYWxsZWwgYm9vbGVhbiBhcnJheSBLbm93bkFzc2lnbmVkWGlkc1ZhbGlkW10uICBBIGRl bGV0aW9uIGlzIGRvbmUKLSAqIGJ5IHNldHRpbmcgS25vd25Bc3NpZ25lZFhpZHNWYWxpZFtp XSB0byBmYWxzZSwgKndpdGhvdXQqIGNsZWFyaW5nIHRoZQotICogWElEIGVudHJ5IGl0c2Vs Zi4gIFRoaXMgcHJlc2VydmVzIHRoZSBwcm9wZXJ0eSB0aGF0IHRoZSBYSUQgZW50cmllcyBh cmUKLSAqIHNvcnRlZCwgc28gd2UgY2FuIGRvIGJpbmFyeSBzZWFyY2hlcyBlYXNpbHkuICBQ ZXJpb2RpY2FsbHkgd2UgY29tcHJlc3MKLSAqIG91dCB0aGUgdW51c2VkIGVudHJpZXM7IHRo YXQncyBtdWNoIGNoZWFwZXIgdGhhbiBoYXZpbmcgdG8gY29tcHJlc3MgdGhlCi0gKiBhcnJh eSBpbW1lZGlhdGVseSBvbiBldmVyeSBkZWxldGlvbi4KLSAqCi0gKiBUaGUgYWN0dWFsbHkg dmFsaWQgaXRlbXMgaW4gS25vd25Bc3NpZ25lZFhpZHNbXSBhbmQgS25vd25Bc3NpZ25lZFhp ZHNWYWxpZFtdCi0gKiBhcmUgdGhvc2Ugd2l0aCBpbmRleGVzIHRhaWwgPD0gaSA8IGhlYWQ7 IGl0ZW1zIG91dHNpZGUgdGhpcyBzdWJzY3JpcHQgcmFuZ2UKLSAqIGhhdmUgdW5zcGVjaWZp ZWQgY29udGVudHMuICBXaGVuIGhlYWQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBhcnJheSwg d2UKLSAqIGZvcmNlIGNvbXByZXNzaW9uIG9mIHVudXNlZCBlbnRyaWVzIHJhdGhlciB0aGFu IHdyYXBwaW5nIGFyb3VuZCwgc2luY2UKLSAqIGFsbG93aW5nIHdyYXBhcm91bmQgd291bGQg Z3JlYXRseSBjb21wbGljYXRlIHRoZSBzZWFyY2ggbG9naWMuICBXZSBtYWludGFpbgotICog YW4gZXhwbGljaXQgdGFpbCBwb2ludGVyIHNvIHRoYXQgcHJ1bmluZyBvZiBvbGQgWElEcyBj YW4gYmUgZG9uZSB3aXRob3V0Ci0gKiBpbW1lZGlhdGVseSBtb3ZpbmcgdGhlIGFycmF5IGNv bnRlbnRzLiAgSW4gbW9zdCBjYXNlcyBvbmx5IGEgc21hbGwgZnJhY3Rpb24KLSAqIG9mIHRo ZSBhcnJheSBjb250YWlucyB2YWxpZCBlbnRyaWVzIGF0IGFueSBpbnN0YW50LgotICoKLSAq IEFsdGhvdWdoIG9ubHkgdGhlIHN0YXJ0dXAgcHJvY2VzcyBjYW4gZXZlciBjaGFuZ2UgdGhl IEtub3duQXNzaWduZWRYaWRzCi0gKiBkYXRhIHN0cnVjdHVyZSwgd2Ugc3RpbGwgbmVlZCBp bnRlcmxvY2tpbmcgc28gdGhhdCBzdGFuZGJ5IGJhY2tlbmRzIHdpbGwKLSAqIG5vdCBvYnNl cnZlIGludmFsaWQgaW50ZXJtZWRpYXRlIHN0YXRlcy4gIFRoZSBjb252ZW50aW9uIGlzIHRo YXQgYmFja2VuZHMKLSAqIG11c3QgaG9sZCBzaGFyZWQgUHJvY0FycmF5TG9jayB0byBleGFt aW5lIHRoZSBhcnJheS4gIFRvIHJlbW92ZSBYSURzIGZyb20KLSAqIHRoZSBhcnJheSwgdGhl IHN0YXJ0dXAgcHJvY2VzcyBtdXN0IGhvbGQgUHJvY0FycmF5TG9jayBleGNsdXNpdmVseSwg Zm9yCi0gKiB0aGUgdXN1YWwgdHJhbnNhY3Rpb25hbCByZWFzb25zIChjb21wYXJlIGNvbW1p dC9hYm9ydCBvZiBhIHRyYW5zYWN0aW9uCi0gKiBkdXJpbmcgbm9ybWFsIHJ1bm5pbmcpLiAg Q29tcHJlc3NpbmcgdW51c2VkIGVudHJpZXMgb3V0IG9mIHRoZSBhcnJheQotICogbGlrZXdp c2UgcmVxdWlyZXMgZXhjbHVzaXZlIGxvY2suICBUbyBhZGQgWElEcyB0byB0aGUgYXJyYXks IHdlIGp1c3QgaW5zZXJ0Ci0gKiB0aGVtIGludG8gc2xvdHMgdG8gdGhlIHJpZ2h0IG9mIHRo ZSBoZWFkIHBvaW50ZXIgYW5kIHRoZW4gYWR2YW5jZSB0aGUgaGVhZAotICogcG9pbnRlci4g IFRoaXMgZG9lc24ndCByZXF1aXJlIGFueSBsb2NrIGF0IGFsbCwgYnV0IG9uIG1hY2hpbmVz IHdpdGggd2VhawotICogbWVtb3J5IG9yZGVyaW5nLCB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwg dGhhdCBvdGhlciBwcm9jZXNzb3JzIHNlZSB0aGUgYXJyYXkKLSAqIGVsZW1lbnQgY2hhbmdl cyBiZWZvcmUgdGhleSBzZWUgdGhlIGhlYWQgcG9pbnRlciBjaGFuZ2UuICBXZSBoYW5kbGUg dGhpcyBieQotICogdXNpbmcgbWVtb3J5IGJhcnJpZXJzIHdoZW4gcmVhZGluZyBvciB3cml0 aW5nIHRoZSBoZWFkL3RhaWwgcG9pbnRlcnMgKHVubGVzcwotICogdGhlIGNhbGxlciBob2xk cyBQcm9jQXJyYXlMb2NrIGV4Y2x1c2l2ZWx5KS4KLSAqCi0gKiBBbGdvcml0aG1pYyBhbmFs eXNpczoKLSAqCi0gKiBJZiB3ZSBoYXZlIGEgbWF4aW11bSBvZiBNIHNsb3RzLCB3aXRoIE4g WElEcyBjdXJyZW50bHkgc3ByZWFkIGFjcm9zcwotICogUyBlbGVtZW50cyB0aGVuIHdlIGhh dmUgTiA8PSBTIDw9IE0gYWx3YXlzLgotICoKLSAqCSogQWRkaW5nIGEgbmV3IFhJRCBpcyBP KDEpIGFuZCBuZWVkcyBubyBsb2NrICh1bmxlc3MgY29tcHJlc3Npb24gbXVzdAotICoJCWhh cHBlbikKLSAqCSogQ29tcHJlc3NpbmcgdGhlIGFycmF5IGlzIE8oUykgYW5kIHJlcXVpcmVz IGV4Y2x1c2l2ZSBsb2NrCi0gKgkqIFJlbW92aW5nIGFuIFhJRCBpcyBPKGxvZ1MpIGFuZCBy ZXF1aXJlcyBleGNsdXNpdmUgbG9jawotICoJKiBUYWtpbmcgYSBzbmFwc2hvdCBpcyBPKFMp IGFuZCByZXF1aXJlcyBzaGFyZWQgbG9jawotICoJKiBDaGVja2luZyBmb3IgYW4gWElEIGlz IE8obG9nUykgYW5kIHJlcXVpcmVzIHNoYXJlZCBsb2NrCi0gKgotICogSW4gY29tcGFyaXNv biwgdXNpbmcgYSBoYXNoIHRhYmxlIGZvciBLbm93bkFzc2lnbmVkWGlkcyB3b3VsZCBtZWFu IHRoYXQKLSAqIHRha2luZyBzbmFwc2hvdHMgd291bGQgYmUgTyhNKS4gSWYgd2UgY2FuIG1h aW50YWluIFMgPDwgTSB0aGVuIHRoZQotICogc29ydGVkIGFycmF5IHRlY2huaXF1ZSB3aWxs IGRlbGl2ZXIgc2lnbmlmaWNhbnRseSBmYXN0ZXIgc25hcHNob3RzLgotICogSWYgd2UgdHJ5 IHRvIGtlZXAgUyB0b28gc21hbGwgdGhlbiB3ZSB3aWxsIHNwZW5kIHRvbyBtdWNoIHRpbWUg Y29tcHJlc3NpbmcsCi0gKiBzbyB0aGVyZSBpcyBhbiBvcHRpbWFsIHBvaW50IGZvciBhbnkg d29ya2xvYWQgbWl4LiBXZSB1c2UgYSBoZXVyaXN0aWMgdG8KLSAqIGRlY2lkZSB3aGVuIHRv IGNvbXByZXNzIHRoZSBhcnJheSwgdGhvdWdoIHRyaW1taW5nIGFsc28gaGVscHMgcmVkdWNl Ci0gKiBmcmVxdWVuY3kgb2YgY29tcHJlc3NpbmcuIFRoZSBoZXVyaXN0aWMgcmVxdWlyZXMg dXMgdG8gdHJhY2sgdGhlIG51bWJlciBvZgotICogY3VycmVudGx5IHZhbGlkIFhJRHMgaW4g dGhlIGFycmF5IChOKS4gIEV4Y2VwdCBpbiBzcGVjaWFsIGNhc2VzLCB3ZSdsbAotICogY29t cHJlc3Mgd2hlbiBTID49IDJOLiAgQm91bmRpbmcgUyBhdCAyTiBpbiB0dXJuIGJvdW5kcyB0 aGUgdGltZSBmb3IKLSAqIHRha2luZyBhIHNuYXBzaG90IHRvIGJlIE8oTiksIHdoaWNoIGl0 IHdvdWxkIGhhdmUgdG8gYmUgYW55d2F5LgotICovCi0KLQotLyoKLSAqIENvbXByZXNzIEtu b3duQXNzaWduZWRYaWRzIGJ5IHNoaWZ0aW5nIHZhbGlkIGRhdGEgZG93biB0byB0aGUgc3Rh cnQgb2YgdGhlCi0gKiBhcnJheSwgcmVtb3ZpbmcgYW55IGdhcHMuCi0gKgotICogQSBjb21w cmVzc2lvbiBzdGVwIGlzIGZvcmNlZCBpZiAicmVhc29uIiBpcyBLQVhfTk9fU1BBQ0UsIG90 aGVyd2lzZQotICogd2UgZG8gaXQgb25seSBpZiBhIGhldXJpc3RpYyBpbmRpY2F0ZXMgaXQn cyBhIGdvb2QgdGltZSB0byBkbyBpdC4KLSAqCi0gKiBDb21wcmVzc2lvbiByZXF1aXJlcyBo b2xkaW5nIFByb2NBcnJheUxvY2sgaW4gZXhjbHVzaXZlIG1vZGUuCi0gKiBDYWxsZXIgbXVz dCBwYXNzIGhhdmVMb2NrID0gdHJ1ZSBpZiBpdCBhbHJlYWR5IGhvbGRzIHRoZSBsb2NrLgot ICovCi1zdGF0aWMgdm9pZAotS25vd25Bc3NpZ25lZFhpZHNDb21wcmVzcyhLQVhDb21wcmVz c1JlYXNvbiByZWFzb24sIGJvb2wgaGF2ZUxvY2spCi17Ci0JUHJvY0FycmF5U3RydWN0ICpw QXJyYXkgPSBwcm9jQXJyYXk7Ci0JaW50CQkJaGVhZCwKLQkJCQl0YWlsLAotCQkJCW5lbGVt ZW50czsKLQlpbnQJCQljb21wcmVzc19pbmRleDsKLQlpbnQJCQlpOwotCi0JLyogQ291bnRl cnMgZm9yIGNvbXByZXNzaW9uIGhldXJpc3RpY3MgKi8KLQlzdGF0aWMgdW5zaWduZWQgaW50 IHRyYW5zYWN0aW9uRW5kc0NvdW50ZXI7Ci0Jc3RhdGljIFRpbWVzdGFtcFR6IGxhc3RDb21w cmVzc1RzOwotCi0JLyogVHVuaW5nIGNvbnN0YW50cyAqLwotI2RlZmluZSBLQVhfQ09NUFJF U1NfRlJFUVVFTkNZIDEyOAkvKiBpbiB0cmFuc2FjdGlvbnMgKi8KLSNkZWZpbmUgS0FYX0NP TVBSRVNTX0lETEVfSU5URVJWQUwgMTAwMCAvKiBpbiBtcyAqLwotCi0JLyoKLQkgKiBTaW5j ZSBvbmx5IHRoZSBzdGFydHVwIHByb2Nlc3MgbW9kaWZpZXMgdGhlIGhlYWQvdGFpbCBwb2lu dGVycywgd2UKLQkgKiBkb24ndCBuZWVkIGEgbG9jayB0byByZWFkIHRoZW0gaGVyZS4KLQkg Ki8KLQloZWFkID0gcEFycmF5LT5oZWFkS25vd25Bc3NpZ25lZFhpZHM7Ci0JdGFpbCA9IHBB cnJheS0+dGFpbEtub3duQXNzaWduZWRYaWRzOwotCW5lbGVtZW50cyA9IGhlYWQgLSB0YWls OwotCi0JLyoKLQkgKiBJZiB3ZSBjYW4gY2hvb3NlIHdoZXRoZXIgdG8gY29tcHJlc3MsIHVz ZSBhIGhldXJpc3RpYyB0byBhdm9pZAotCSAqIGNvbXByZXNzaW5nIHRvbyBvZnRlbiBvciBu b3Qgb2Z0ZW4gZW5vdWdoLiAgIkNvbXByZXNzIiBoZXJlIHNpbXBseQotCSAqIG1lYW5zIG1v dmluZyB0aGUgdmFsdWVzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LCBzbyBpdCBp cyBub3QgYXMKLQkgKiBjb21wbGV4IG9yIGNvc3RseSBhcyB0eXBpY2FsIGRhdGEgY29tcHJl c3Npb24gYWxnb3JpdGhtcy4KLQkgKi8KLQlpZiAobmVsZW1lbnRzID09IHBBcnJheS0+bnVt S25vd25Bc3NpZ25lZFhpZHMpCi0JewotCQkvKgotCQkgKiBXaGVuIHRoZXJlIGFyZSBubyBn YXBzIGJldHdlZW4gaGVhZCBhbmQgdGFpbCwgZG9uJ3QgYm90aGVyIHRvCi0JCSAqIGNvbXBy ZXNzLCBleGNlcHQgaW4gdGhlIEtBWF9OT19TUEFDRSBjYXNlIHdoZXJlIHdlIG11c3QgY29t cHJlc3MgdG8KLQkJICogY3JlYXRlIHNvbWUgc3BhY2UgYWZ0ZXIgdGhlIGhlYWQuCi0JCSAq LwotCQlpZiAocmVhc29uICE9IEtBWF9OT19TUEFDRSkKLQkJCXJldHVybjsKLQl9Ci0JZWxz ZSBpZiAocmVhc29uID09IEtBWF9UUkFOU0FDVElPTl9FTkQpCi0JewotCQkvKgotCQkgKiBD b25zaWRlciBjb21wcmVzc2luZyBvbmx5IG9uY2UgZXZlcnkgc28gbWFueSBjb21taXRzLiAg RnJlcXVlbmN5Ci0JCSAqIGRldGVybWluZWQgYnkgYmVuY2htYXJrcy4KLQkJICovCi0JCWlm ICgodHJhbnNhY3Rpb25FbmRzQ291bnRlcisrKSAlIEtBWF9DT01QUkVTU19GUkVRVUVOQ1kg IT0gMCkKLQkJCXJldHVybjsKLQotCQkvKgotCQkgKiBGdXJ0aGVybW9yZSwgY29tcHJlc3Mg b25seSBpZiB0aGUgdXNlZCBwYXJ0IG9mIHRoZSBhcnJheSBpcyBsZXNzCi0JCSAqIHRoYW4g NTAlIGZ1bGwgKHNlZSBjb21tZW50cyBhYm92ZSkuCi0JCSAqLwotCQlpZiAobmVsZW1lbnRz IDwgMiAqIHBBcnJheS0+bnVtS25vd25Bc3NpZ25lZFhpZHMpCi0JCQlyZXR1cm47Ci0JfQot CWVsc2UgaWYgKHJlYXNvbiA9PSBLQVhfU1RBUlRVUF9QUk9DRVNTX0lETEUpCi0JewotCQkv KgotCQkgKiBXZSdyZSBhYm91dCB0byBnbyBpZGxlIGZvciBsYWNrIG9mIG5ldyBXQUwsIHNv IHdlIG1pZ2h0IGFzIHdlbGwKLQkJICogY29tcHJlc3MuICBCdXQgbm90IHRvbyBvZnRlbiwg dG8gYXZvaWQgUHJvY0FycmF5IGxvY2sgY29udGVudGlvbgotCQkgKiB3aXRoIHJlYWRlcnMu Ci0JCSAqLwotCQlpZiAobGFzdENvbXByZXNzVHMgIT0gMCkKLQkJewotCQkJVGltZXN0YW1w VHogY29tcHJlc3NfYWZ0ZXI7Ci0KLQkJCWNvbXByZXNzX2FmdGVyID0gVGltZXN0YW1wVHpQ bHVzTWlsbGlzZWNvbmRzKGxhc3RDb21wcmVzc1RzLAotCQkJCQkJCQkJCQkJCQkgS0FYX0NP TVBSRVNTX0lETEVfSU5URVJWQUwpOwotCQkJaWYgKEdldEN1cnJlbnRUaW1lc3RhbXAoKSA8 IGNvbXByZXNzX2FmdGVyKQotCQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qIE5lZWQgdG8g Y29tcHJlc3MsIHNvIGdldCB0aGUgbG9jayBpZiB3ZSBkb24ndCBoYXZlIGl0LiAqLwotCWlm ICghaGF2ZUxvY2spCi0JCUxXTG9ja0FjcXVpcmUoUHJvY0FycmF5TG9jaywgTFdfRVhDTFVT SVZFKTsKLQotCS8qCi0JICogV2UgY29tcHJlc3MgdGhlIGFycmF5IGJ5IHJlYWRpbmcgdGhl IHZhbGlkIHZhbHVlcyBmcm9tIHRhaWwgdG8gaGVhZCwKLQkgKiByZS1hbGlnbmluZyBkYXRh IHRvIDB0aCBlbGVtZW50LgotCSAqLwotCWNvbXByZXNzX2luZGV4ID0gMDsKLQlmb3IgKGkg PSB0YWlsOyBpIDwgaGVhZDsgaSsrKQotCXsKLQkJaWYgKEtub3duQXNzaWduZWRYaWRzVmFs aWRbaV0pCi0JCXsKLQkJCUtub3duQXNzaWduZWRYaWRzW2NvbXByZXNzX2luZGV4XSA9IEtu b3duQXNzaWduZWRYaWRzW2ldOwotCQkJS25vd25Bc3NpZ25lZFhpZHNWYWxpZFtjb21wcmVz c19pbmRleF0gPSB0cnVlOwotCQkJY29tcHJlc3NfaW5kZXgrKzsKLQkJfQotCX0KLQlBc3Nl cnQoY29tcHJlc3NfaW5kZXggPT0gcEFycmF5LT5udW1Lbm93bkFzc2lnbmVkWGlkcyk7Ci0K LQlwQXJyYXktPnRhaWxLbm93bkFzc2lnbmVkWGlkcyA9IDA7Ci0JcEFycmF5LT5oZWFkS25v d25Bc3NpZ25lZFhpZHMgPSBjb21wcmVzc19pbmRleDsKLQotCWlmICghaGF2ZUxvY2spCi0J CUxXTG9ja1JlbGVhc2UoUHJvY0FycmF5TG9jayk7Ci0KLQkvKiBVcGRhdGUgdGltZXN0YW1w IGZvciBtYWludGVuYW5jZS4gIE5vIG5lZWQgdG8gaG9sZCBsb2NrIGZvciB0aGlzLiAqLwot CWxhc3RDb21wcmVzc1RzID0gR2V0Q3VycmVudFRpbWVzdGFtcCgpOwotfQotCi0vKgotICog QWRkIHhpZHMgaW50byBLbm93bkFzc2lnbmVkWGlkcyBhdCB0aGUgaGVhZCBvZiB0aGUgYXJy YXkuCi0gKgotICogeGlkcyBmcm9tIGZyb21feGlkIHRvIHRvX3hpZCwgaW5jbHVzaXZlLCBh cmUgYWRkZWQgdG8gdGhlIGFycmF5LgotICoKLSAqIElmIGV4Y2x1c2l2ZV9sb2NrIGlzIHRy dWUgdGhlbiBjYWxsZXIgYWxyZWFkeSBob2xkcyBQcm9jQXJyYXlMb2NrIGluCi0gKiBleGNs dXNpdmUgbW9kZSwgc28gd2UgbmVlZCBubyBleHRyYSBsb2NraW5nIGhlcmUuICBFbHNlIGNh bGxlciBob2xkcyBubwotICogbG9jaywgc28gd2UgbmVlZCB0byBiZSBzdXJlIHdlIG1haW50 YWluIHN1ZmZpY2llbnQgaW50ZXJsb2NrcyBhZ2FpbnN0Ci0gKiBjb25jdXJyZW50IHJlYWRl cnMuICAoT25seSB0aGUgc3RhcnR1cCBwcm9jZXNzIGV2ZXIgY2FsbHMgdGhpcywgc28gbm8g bmVlZAotICogdG8gd29ycnkgYWJvdXQgY29uY3VycmVudCB3cml0ZXJzLikKLSAqLwotc3Rh dGljIHZvaWQKLUtub3duQXNzaWduZWRYaWRzQWRkKFRyYW5zYWN0aW9uSWQgZnJvbV94aWQs IFRyYW5zYWN0aW9uSWQgdG9feGlkLAotCQkJCQkgYm9vbCBleGNsdXNpdmVfbG9jaykKLXsK LQlQcm9jQXJyYXlTdHJ1Y3QgKnBBcnJheSA9IHByb2NBcnJheTsKLQlUcmFuc2FjdGlvbklk IG5leHRfeGlkOwotCWludAkJCWhlYWQsCi0JCQkJdGFpbDsKLQlpbnQJCQlueGlkczsKLQlp bnQJCQlpOwotCi0JQXNzZXJ0KFRyYW5zYWN0aW9uSWRQcmVjZWRlc09yRXF1YWxzKGZyb21f eGlkLCB0b194aWQpKTsKLQotCS8qCi0JICogQ2FsY3VsYXRlIGhvdyBtYW55IGFycmF5IHNs b3RzIHdlJ2xsIG5lZWQuICBOb3JtYWxseSB0aGlzIGlzIGNoZWFwOyBpbgotCSAqIHRoZSB1 bnVzdWFsIGNhc2Ugd2hlcmUgdGhlIFhJRHMgY3Jvc3MgdGhlIHdyYXAgcG9pbnQsIHdlIGRv IGl0IHRoZSBoYXJkCi0JICogd2F5LgotCSAqLwotCWlmICh0b194aWQgPj0gZnJvbV94aWQp Ci0JCW54aWRzID0gdG9feGlkIC0gZnJvbV94aWQgKyAxOwotCWVsc2UKLQl7Ci0JCW54aWRz ID0gMTsKLQkJbmV4dF94aWQgPSBmcm9tX3hpZDsKLQkJd2hpbGUgKFRyYW5zYWN0aW9uSWRQ cmVjZWRlcyhuZXh0X3hpZCwgdG9feGlkKSkKLQkJewotCQkJbnhpZHMrKzsKLQkJCVRyYW5z YWN0aW9uSWRBZHZhbmNlKG5leHRfeGlkKTsKLQkJfQotCX0KLQotCS8qCi0JICogU2luY2Ug b25seSB0aGUgc3RhcnR1cCBwcm9jZXNzIG1vZGlmaWVzIHRoZSBoZWFkL3RhaWwgcG9pbnRl cnMsIHdlCi0JICogZG9uJ3QgbmVlZCBhIGxvY2sgdG8gcmVhZCB0aGVtIGhlcmUuCi0JICov Ci0JaGVhZCA9IHBBcnJheS0+aGVhZEtub3duQXNzaWduZWRYaWRzOwotCXRhaWwgPSBwQXJy YXktPnRhaWxLbm93bkFzc2lnbmVkWGlkczsKLQotCUFzc2VydChoZWFkID49IDAgJiYgaGVh ZCA8PSBwQXJyYXktPm1heEtub3duQXNzaWduZWRYaWRzKTsKLQlBc3NlcnQodGFpbCA+PSAw ICYmIHRhaWwgPCBwQXJyYXktPm1heEtub3duQXNzaWduZWRYaWRzKTsKLQotCS8qCi0JICog VmVyaWZ5IHRoYXQgaW5zZXJ0aW9ucyBvY2N1ciBpbiBUcmFuc2FjdGlvbklkIHNlcXVlbmNl LiAgTm90ZSB0aGF0IGV2ZW4KLQkgKiBpZiB0aGUgbGFzdCBleGlzdGluZyBlbGVtZW50IGlz IG1hcmtlZCBpbnZhbGlkLCBpdCBtdXN0IHN0aWxsIGhhdmUgYQotCSAqIGNvcnJlY3RseSBz ZXF1ZW5jZWQgWElEIHZhbHVlLgotCSAqLwotCWlmIChoZWFkID4gdGFpbCAmJgotCQlUcmFu c2FjdGlvbklkRm9sbG93c09yRXF1YWxzKEtub3duQXNzaWduZWRYaWRzW2hlYWQgLSAxXSwg ZnJvbV94aWQpKQotCXsKLQkJS25vd25Bc3NpZ25lZFhpZHNEaXNwbGF5KExPRyk7Ci0JCWVs b2coRVJST1IsICJvdXQtb2Ytb3JkZXIgWElEIGluc2VydGlvbiBpbiBLbm93bkFzc2lnbmVk WGlkcyIpOwotCX0KLQotCS8qCi0JICogSWYgb3VyIHhpZHMgd29uJ3QgZml0IGluIHRoZSBy ZW1haW5pbmcgc3BhY2UsIGNvbXByZXNzIG91dCBmcmVlIHNwYWNlCi0JICovCi0JaWYgKGhl YWQgKyBueGlkcyA+IHBBcnJheS0+bWF4S25vd25Bc3NpZ25lZFhpZHMpCi0JewotCQlLbm93 bkFzc2lnbmVkWGlkc0NvbXByZXNzKEtBWF9OT19TUEFDRSwgZXhjbHVzaXZlX2xvY2spOwot Ci0JCWhlYWQgPSBwQXJyYXktPmhlYWRLbm93bkFzc2lnbmVkWGlkczsKLQkJLyogbm90ZTog d2Ugbm8gbG9uZ2VyIGNhcmUgYWJvdXQgdGhlIHRhaWwgcG9pbnRlciAqLwotCi0JCS8qCi0J CSAqIElmIGl0IHN0aWxsIHdvbid0IGZpdCB0aGVuIHdlJ3JlIG91dCBvZiBtZW1vcnkKLQkJ ICovCi0JCWlmIChoZWFkICsgbnhpZHMgPiBwQXJyYXktPm1heEtub3duQXNzaWduZWRYaWRz KQotCQkJZWxvZyhFUlJPUiwgInRvbyBtYW55IEtub3duQXNzaWduZWRYaWRzIik7Ci0JfQot Ci0JLyogTm93IHdlIGNhbiBpbnNlcnQgdGhlIHhpZHMgaW50byB0aGUgc3BhY2Ugc3RhcnRp bmcgYXQgaGVhZCAqLwotCW5leHRfeGlkID0gZnJvbV94aWQ7Ci0JZm9yIChpID0gMDsgaSA8 IG54aWRzOyBpKyspCi0JewotCQlLbm93bkFzc2lnbmVkWGlkc1toZWFkXSA9IG5leHRfeGlk OwotCQlLbm93bkFzc2lnbmVkWGlkc1ZhbGlkW2hlYWRdID0gdHJ1ZTsKLQkJVHJhbnNhY3Rp b25JZEFkdmFuY2UobmV4dF94aWQpOwotCQloZWFkKys7Ci0JfQotCi0JLyogQWRqdXN0IGNv dW50IG9mIG51bWJlciBvZiB2YWxpZCBlbnRyaWVzICovCi0JcEFycmF5LT5udW1Lbm93bkFz c2lnbmVkWGlkcyArPSBueGlkczsKLQotCS8qCi0JICogTm93IHVwZGF0ZSB0aGUgaGVhZCBw b2ludGVyLiAgV2UgdXNlIGEgd3JpdGUgYmFycmllciB0byBlbnN1cmUgdGhhdAotCSAqIG90 aGVyIHByb2Nlc3NvcnMgc2VlIHRoZSBhYm92ZSBhcnJheSB1cGRhdGVzIGJlZm9yZSB0aGV5 IHNlZSB0aGUgaGVhZAotCSAqIHBvaW50ZXIgY2hhbmdlLiAgVGhlIGJhcnJpZXIgaXNuJ3Qg cmVxdWlyZWQgaWYgd2UncmUgaG9sZGluZwotCSAqIFByb2NBcnJheUxvY2sgZXhjbHVzaXZl bHkuCi0JICovCi0JaWYgKCFleGNsdXNpdmVfbG9jaykKLQkJcGdfd3JpdGVfYmFycmllcigp OwotCi0JcEFycmF5LT5oZWFkS25vd25Bc3NpZ25lZFhpZHMgPSBoZWFkOwotfQotCi0vKgot ICogS25vd25Bc3NpZ25lZFhpZHNTZWFyY2gKLSAqCi0gKiBTZWFyY2hlcyBLbm93bkFzc2ln bmVkWGlkcyBmb3IgYSBzcGVjaWZpYyB4aWQgYW5kIG9wdGlvbmFsbHkgcmVtb3ZlcyBpdC4K LSAqIFJldHVybnMgdHJ1ZSBpZiBpdCB3YXMgZm91bmQsIGZhbHNlIGlmIG5vdC4KLSAqCi0g KiBDYWxsZXIgbXVzdCBob2xkIFByb2NBcnJheUxvY2sgaW4gc2hhcmVkIG9yIGV4Y2x1c2l2 ZSBtb2RlLgotICogRXhjbHVzaXZlIGxvY2sgbXVzdCBiZSBoZWxkIGZvciByZW1vdmUgPSB0 cnVlLgotICovCi1zdGF0aWMgYm9vbAotS25vd25Bc3NpZ25lZFhpZHNTZWFyY2goVHJhbnNh Y3Rpb25JZCB4aWQsIGJvb2wgcmVtb3ZlKQotewotCVByb2NBcnJheVN0cnVjdCAqcEFycmF5 ID0gcHJvY0FycmF5OwotCWludAkJCWZpcnN0LAotCQkJCWxhc3Q7Ci0JaW50CQkJaGVhZDsK LQlpbnQJCQl0YWlsOwotCWludAkJCXJlc3VsdF9pbmRleCA9IC0xOwotCi0JdGFpbCA9IHBB cnJheS0+dGFpbEtub3duQXNzaWduZWRYaWRzOwotCWhlYWQgPSBwQXJyYXktPmhlYWRLbm93 bkFzc2lnbmVkWGlkczsKLQotCS8qCi0JICogT25seSB0aGUgc3RhcnR1cCBwcm9jZXNzIHJl bW92ZXMgZW50cmllcywgc28gd2UgZG9uJ3QgbmVlZCB0aGUgcmVhZAotCSAqIGJhcnJpZXIg aW4gdGhhdCBjYXNlLgotCSAqLwotCWlmICghcmVtb3ZlKQotCQlwZ19yZWFkX2JhcnJpZXIo KTsJCS8qIHBhaXJzIHdpdGggS25vd25Bc3NpZ25lZFhpZHNBZGQgKi8KLQotCS8qCi0JICog U3RhbmRhcmQgYmluYXJ5IHNlYXJjaC4gIE5vdGUgd2UgY2FuIGlnbm9yZSB0aGUgS25vd25B c3NpZ25lZFhpZHNWYWxpZAotCSAqIGFycmF5IGhlcmUsIHNpbmNlIGV2ZW4gaW52YWxpZCBl bnRyaWVzIHdpbGwgY29udGFpbiBzb3J0ZWQgWElEcy4KLQkgKi8KLQlmaXJzdCA9IHRhaWw7 Ci0JbGFzdCA9IGhlYWQgLSAxOwotCXdoaWxlIChmaXJzdCA8PSBsYXN0KQotCXsKLQkJaW50 CQkJbWlkX2luZGV4OwotCQlUcmFuc2FjdGlvbklkIG1pZF94aWQ7Ci0KLQkJbWlkX2luZGV4 ID0gKGZpcnN0ICsgbGFzdCkgLyAyOwotCQltaWRfeGlkID0gS25vd25Bc3NpZ25lZFhpZHNb bWlkX2luZGV4XTsKLQotCQlpZiAoeGlkID09IG1pZF94aWQpCi0JCXsKLQkJCXJlc3VsdF9p bmRleCA9IG1pZF9pbmRleDsKLQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UgaWYgKFRyYW5zYWN0 aW9uSWRQcmVjZWRlcyh4aWQsIG1pZF94aWQpKQotCQkJbGFzdCA9IG1pZF9pbmRleCAtIDE7 Ci0JCWVsc2UKLQkJCWZpcnN0ID0gbWlkX2luZGV4ICsgMTsKLQl9Ci0KLQlpZiAocmVzdWx0 X2luZGV4IDwgMCkKLQkJcmV0dXJuIGZhbHNlOwkJCS8qIG5vdCBpbiBhcnJheSAqLwotCi0J aWYgKCFLbm93bkFzc2lnbmVkWGlkc1ZhbGlkW3Jlc3VsdF9pbmRleF0pCi0JCXJldHVybiBm YWxzZTsJCQkvKiBpbiBhcnJheSwgYnV0IGludmFsaWQgKi8KLQotCWlmIChyZW1vdmUpCi0J ewotCQlLbm93bkFzc2lnbmVkWGlkc1ZhbGlkW3Jlc3VsdF9pbmRleF0gPSBmYWxzZTsKLQot CQlwQXJyYXktPm51bUtub3duQXNzaWduZWRYaWRzLS07Ci0JCUFzc2VydChwQXJyYXktPm51 bUtub3duQXNzaWduZWRYaWRzID49IDApOwotCi0JCS8qCi0JCSAqIElmIHdlJ3JlIHJlbW92 aW5nIHRoZSB0YWlsIGVsZW1lbnQgdGhlbiBhZHZhbmNlIHRhaWwgcG9pbnRlciBvdmVyCi0J CSAqIGFueSBpbnZhbGlkIGVsZW1lbnRzLiAgVGhpcyB3aWxsIHNwZWVkIGZ1dHVyZSBzZWFy Y2hlcy4KLQkJICovCi0JCWlmIChyZXN1bHRfaW5kZXggPT0gdGFpbCkKLQkJewotCQkJdGFp bCsrOwotCQkJd2hpbGUgKHRhaWwgPCBoZWFkICYmICFLbm93bkFzc2lnbmVkWGlkc1ZhbGlk W3RhaWxdKQotCQkJCXRhaWwrKzsKLQkJCWlmICh0YWlsID49IGhlYWQpCi0JCQl7Ci0JCQkJ LyogQXJyYXkgaXMgZW1wdHksIHNvIHdlIGNhbiByZXNldCBib3RoIHBvaW50ZXJzICovCi0J CQkJcEFycmF5LT5oZWFkS25vd25Bc3NpZ25lZFhpZHMgPSAwOwotCQkJCXBBcnJheS0+dGFp bEtub3duQXNzaWduZWRYaWRzID0gMDsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwQXJy YXktPnRhaWxLbm93bkFzc2lnbmVkWGlkcyA9IHRhaWw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQly ZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLSAqIElzIHRoZSBzcGVjaWZpZWQgWElEIHByZXNlbnQg aW4gS25vd25Bc3NpZ25lZFhpZHNbXT8KLSAqCi0gKiBDYWxsZXIgbXVzdCBob2xkIFByb2NB cnJheUxvY2sgaW4gc2hhcmVkIG9yIGV4Y2x1c2l2ZSBtb2RlLgotICovCi1zdGF0aWMgYm9v bAotS25vd25Bc3NpZ25lZFhpZEV4aXN0cyhUcmFuc2FjdGlvbklkIHhpZCkKLXsKLQlBc3Nl cnQoVHJhbnNhY3Rpb25JZElzVmFsaWQoeGlkKSk7Ci0KLQlyZXR1cm4gS25vd25Bc3NpZ25l ZFhpZHNTZWFyY2goeGlkLCBmYWxzZSk7Ci19Ci0KLS8qCi0gKiBSZW1vdmUgdGhlIHNwZWNp ZmllZCBYSUQgZnJvbSBLbm93bkFzc2lnbmVkWGlkc1tdLgotICoKLSAqIENhbGxlciBtdXN0 IGhvbGQgUHJvY0FycmF5TG9jayBpbiBleGNsdXNpdmUgbW9kZS4KLSAqLwotc3RhdGljIHZv aWQKLUtub3duQXNzaWduZWRYaWRzUmVtb3ZlKFRyYW5zYWN0aW9uSWQgeGlkKQotewotCUFz c2VydChUcmFuc2FjdGlvbklkSXNWYWxpZCh4aWQpKTsKLQotCWVsb2coREVCVUc0LCAicmVt b3ZlIEtub3duQXNzaWduZWRYaWQgJXUiLCB4aWQpOwotCi0JLyoKLQkgKiBOb3RlOiB3ZSBj YW5ub3QgY29uc2lkZXIgaXQgYW4gZXJyb3IgdG8gcmVtb3ZlIGFuIFhJRCB0aGF0J3Mgbm90 Ci0JICogcHJlc2VudC4gIFdlIGludGVudGlvbmFsbHkgcmVtb3ZlIHN1YnhhY3QgSURzIHdo aWxlIHByb2Nlc3NpbmcKLQkgKiBYTE9HX1hBQ1RfQVNTSUdOTUVOVCwgdG8gYXZvaWQgYXJy YXkgb3ZlcmZsb3cuICBUaGVuIHRob3NlIFhJRHMgd2lsbCBiZQotCSAqIHJlbW92ZWQgYWdh aW4gd2hlbiB0aGUgdG9wLWxldmVsIHhhY3QgY29tbWl0cyBvciBhYm9ydHMuCi0JICoKLQkg KiBJdCBtaWdodCBiZSBwb3NzaWJsZSB0byB0cmFjayBzdWNoIFhJRHMgdG8gZGlzdGluZ3Vp c2ggdGhpcyBjYXNlIGZyb20KLQkgKiBhY3R1YWwgZXJyb3JzLCBidXQgaXQgd291bGQgYmUg Y29tcGxpY2F0ZWQgYW5kIHByb2JhYmx5IG5vdCB3b3J0aCBpdC4KLQkgKiBTbywganVzdCBp Z25vcmUgdGhlIHNlYXJjaCByZXN1bHQuCi0JICovCi0JKHZvaWQpIEtub3duQXNzaWduZWRY aWRzU2VhcmNoKHhpZCwgdHJ1ZSk7Ci19Ci0KLS8qCi0gKiBLbm93bkFzc2lnbmVkWGlkc1Jl bW92ZVRyZWUKLSAqCQlSZW1vdmUgeGlkIChpZiBpdCdzIG5vdCBJbnZhbGlkVHJhbnNhY3Rp b25JZCkgYW5kIGFsbCB0aGUgc3VieGlkcy4KLSAqCi0gKiBDYWxsZXIgbXVzdCBob2xkIFBy b2NBcnJheUxvY2sgaW4gZXhjbHVzaXZlIG1vZGUuCi0gKi8KLXN0YXRpYyB2b2lkCi1Lbm93 bkFzc2lnbmVkWGlkc1JlbW92ZVRyZWUoVHJhbnNhY3Rpb25JZCB4aWQsIGludCBuc3VieGlk cywKLQkJCQkJCQlUcmFuc2FjdGlvbklkICpzdWJ4aWRzKQotewotCWludAkJCWk7Ci0KLQlp ZiAoVHJhbnNhY3Rpb25JZElzVmFsaWQoeGlkKSkKLQkJS25vd25Bc3NpZ25lZFhpZHNSZW1v dmUoeGlkKTsKLQotCWZvciAoaSA9IDA7IGkgPCBuc3VieGlkczsgaSsrKQotCQlLbm93bkFz c2lnbmVkWGlkc1JlbW92ZShzdWJ4aWRzW2ldKTsKLQotCS8qIE9wcG9ydHVuaXN0aWNhbGx5 IGNvbXByZXNzIHRoZSBhcnJheSAqLwotCUtub3duQXNzaWduZWRYaWRzQ29tcHJlc3MoS0FY X1RSQU5TQUNUSU9OX0VORCwgdHJ1ZSk7Ci19Ci0KLS8qCi0gKiBQcnVuZSBLbm93bkFzc2ln bmVkWGlkcyB1cCB0bywgYnV0ICpub3QqIGluY2x1ZGluZyB4aWQuIElmIHhpZCBpcyBpbnZh bGlkCi0gKiB0aGVuIGNsZWFyIHRoZSB3aG9sZSB0YWJsZS4KLSAqCi0gKiBDYWxsZXIgbXVz dCBob2xkIFByb2NBcnJheUxvY2sgaW4gZXhjbHVzaXZlIG1vZGUuCi0gKi8KLXN0YXRpYyB2 b2lkCi1Lbm93bkFzc2lnbmVkWGlkc1JlbW92ZVByZWNlZGluZyhUcmFuc2FjdGlvbklkIHJl bW92ZVhpZCkKLXsKLQlQcm9jQXJyYXlTdHJ1Y3QgKnBBcnJheSA9IHByb2NBcnJheTsKLQlp bnQJCQljb3VudCA9IDA7Ci0JaW50CQkJaGVhZCwKLQkJCQl0YWlsLAotCQkJCWk7Ci0KLQlp ZiAoIVRyYW5zYWN0aW9uSWRJc1ZhbGlkKHJlbW92ZVhpZCkpCi0JewotCQllbG9nKERFQlVH NCwgInJlbW92aW5nIGFsbCBLbm93bkFzc2lnbmVkWGlkcyIpOwotCQlwQXJyYXktPm51bUtu b3duQXNzaWduZWRYaWRzID0gMDsKLQkJcEFycmF5LT5oZWFkS25vd25Bc3NpZ25lZFhpZHMg PSBwQXJyYXktPnRhaWxLbm93bkFzc2lnbmVkWGlkcyA9IDA7Ci0JCXJldHVybjsKLQl9Ci0K LQllbG9nKERFQlVHNCwgInBydW5lIEtub3duQXNzaWduZWRYaWRzIHRvICV1IiwgcmVtb3Zl WGlkKTsKLQotCS8qCi0JICogTWFyayBlbnRyaWVzIGludmFsaWQgc3RhcnRpbmcgYXQgdGhl IHRhaWwuICBTaW5jZSBhcnJheSBpcyBzb3J0ZWQsIHdlCi0JICogY2FuIHN0b3AgYXMgc29v biBhcyB3ZSByZWFjaCBhbiBlbnRyeSA+PSByZW1vdmVYaWQuCi0JICovCi0JdGFpbCA9IHBB cnJheS0+dGFpbEtub3duQXNzaWduZWRYaWRzOwotCWhlYWQgPSBwQXJyYXktPmhlYWRLbm93 bkFzc2lnbmVkWGlkczsKLQotCWZvciAoaSA9IHRhaWw7IGkgPCBoZWFkOyBpKyspCi0Jewot CQlpZiAoS25vd25Bc3NpZ25lZFhpZHNWYWxpZFtpXSkKLQkJewotCQkJVHJhbnNhY3Rpb25J ZCBrbm93blhpZCA9IEtub3duQXNzaWduZWRYaWRzW2ldOwotCi0JCQlpZiAoVHJhbnNhY3Rp b25JZEZvbGxvd3NPckVxdWFscyhrbm93blhpZCwgcmVtb3ZlWGlkKSkKLQkJCQlicmVhazsK LQotCQkJaWYgKCFTdGFuZGJ5VHJhbnNhY3Rpb25JZElzUHJlcGFyZWQoa25vd25YaWQpKQot CQkJewotCQkJCUtub3duQXNzaWduZWRYaWRzVmFsaWRbaV0gPSBmYWxzZTsKLQkJCQljb3Vu dCsrOwotCQkJfQotCQl9Ci0JfQotCi0JcEFycmF5LT5udW1Lbm93bkFzc2lnbmVkWGlkcyAt PSBjb3VudDsKLQlBc3NlcnQocEFycmF5LT5udW1Lbm93bkFzc2lnbmVkWGlkcyA+PSAwKTsK LQotCS8qCi0JICogQWR2YW5jZSB0aGUgdGFpbCBwb2ludGVyIGlmIHdlJ3ZlIG1hcmtlZCB0 aGUgdGFpbCBpdGVtIGludmFsaWQuCi0JICovCi0JZm9yIChpID0gdGFpbDsgaSA8IGhlYWQ7 IGkrKykKLQl7Ci0JCWlmIChLbm93bkFzc2lnbmVkWGlkc1ZhbGlkW2ldKQotCQkJYnJlYWs7 Ci0JfQotCWlmIChpID49IGhlYWQpCi0JewotCQkvKiBBcnJheSBpcyBlbXB0eSwgc28gd2Ug Y2FuIHJlc2V0IGJvdGggcG9pbnRlcnMgKi8KLQkJcEFycmF5LT5oZWFkS25vd25Bc3NpZ25l ZFhpZHMgPSAwOwotCQlwQXJyYXktPnRhaWxLbm93bkFzc2lnbmVkWGlkcyA9IDA7Ci0JfQot CWVsc2UKLQl7Ci0JCXBBcnJheS0+dGFpbEtub3duQXNzaWduZWRYaWRzID0gaTsKLQl9Ci0K LQkvKiBPcHBvcnR1bmlzdGljYWxseSBjb21wcmVzcyB0aGUgYXJyYXkgKi8KLQlLbm93bkFz c2lnbmVkWGlkc0NvbXByZXNzKEtBWF9QUlVORSwgdHJ1ZSk7Ci19Ci0KLS8qCi0gKiBLbm93 bkFzc2lnbmVkWGlkc0dldCAtIEdldCBhbiBhcnJheSBvZiB4aWRzIGJ5IHNjYW5uaW5nIEtu b3duQXNzaWduZWRYaWRzLgotICogV2UgZmlsdGVyIG91dCBhbnl0aGluZyA+PSB4bWF4Lgot ICoKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBYSURzIHN0b3JlZCBpbnRvIHhhcnJheVtd LiAgQ2FsbGVyIGlzIHJlc3BvbnNpYmxlCi0gKiB0aGF0IGFycmF5IGlzIGxhcmdlIGVub3Vn aC4KLSAqCi0gKiBDYWxsZXIgbXVzdCBob2xkIFByb2NBcnJheUxvY2sgaW4gKGF0IGxlYXN0 KSBzaGFyZWQgbW9kZS4KLSAqLwotc3RhdGljIGludAotS25vd25Bc3NpZ25lZFhpZHNHZXQo VHJhbnNhY3Rpb25JZCAqeGFycmF5LCBUcmFuc2FjdGlvbklkIHhtYXgpCi17Ci0JVHJhbnNh Y3Rpb25JZCB4dG1wID0gSW52YWxpZFRyYW5zYWN0aW9uSWQ7Ci0KLQlyZXR1cm4gS25vd25B c3NpZ25lZFhpZHNHZXRBbmRTZXRYbWluKHhhcnJheSwgJnh0bXAsIHhtYXgpOwotfQotCi0v KgotICogS25vd25Bc3NpZ25lZFhpZHNHZXRBbmRTZXRYbWluIC0gYXMgS25vd25Bc3NpZ25l ZFhpZHNHZXQsIHBsdXMKLSAqIHdlIHJlZHVjZSAqeG1pbiB0byB0aGUgbG93ZXN0IHhpZCB2 YWx1ZSBzZWVuIGlmIG5vdCBhbHJlYWR5IGxvd2VyLgotICoKLSAqIENhbGxlciBtdXN0IGhv bGQgUHJvY0FycmF5TG9jayBpbiAoYXQgbGVhc3QpIHNoYXJlZCBtb2RlLgotICovCi1zdGF0 aWMgaW50Ci1Lbm93bkFzc2lnbmVkWGlkc0dldEFuZFNldFhtaW4oVHJhbnNhY3Rpb25JZCAq eGFycmF5LCBUcmFuc2FjdGlvbklkICp4bWluLAotCQkJCQkJCSAgIFRyYW5zYWN0aW9uSWQg eG1heCkKLXsKLQlpbnQJCQljb3VudCA9IDA7Ci0JaW50CQkJaGVhZCwKLQkJCQl0YWlsOwot CWludAkJCWk7Ci0KLQkvKgotCSAqIEZldGNoIGhlYWQganVzdCBvbmNlLCBzaW5jZSBpdCBt YXkgY2hhbmdlIHdoaWxlIHdlIGxvb3AuIFdlIGNhbiBzdG9wCi0JICogb25jZSB3ZSByZWFj aCB0aGUgaW5pdGlhbGx5IHNlZW4gaGVhZCwgc2luY2Ugd2UgYXJlIGNlcnRhaW4gdGhhdCBh biB4aWQKLQkgKiBjYW5ub3QgZW50ZXIgYW5kIHRoZW4gbGVhdmUgdGhlIGFycmF5IHdoaWxl IHdlIGhvbGQgUHJvY0FycmF5TG9jay4gIFdlCi0JICogbWlnaHQgbWlzcyBuZXdseS1hZGRl ZCB4aWRzLCBidXQgdGhleSBzaG91bGQgYmUgPj0geG1heCBzbyBpcnJlbGV2YW50Ci0JICog YW55d2F5LgotCSAqLwotCXRhaWwgPSBwcm9jQXJyYXktPnRhaWxLbm93bkFzc2lnbmVkWGlk czsKLQloZWFkID0gcHJvY0FycmF5LT5oZWFkS25vd25Bc3NpZ25lZFhpZHM7Ci0KLQlwZ19y ZWFkX2JhcnJpZXIoKTsJCQkvKiBwYWlycyB3aXRoIEtub3duQXNzaWduZWRYaWRzQWRkICov Ci0KLQlmb3IgKGkgPSB0YWlsOyBpIDwgaGVhZDsgaSsrKQotCXsKLQkJLyogU2tpcCBhbnkg Z2FwcyBpbiB0aGUgYXJyYXkgKi8KLQkJaWYgKEtub3duQXNzaWduZWRYaWRzVmFsaWRbaV0p Ci0JCXsKLQkJCVRyYW5zYWN0aW9uSWQga25vd25YaWQgPSBLbm93bkFzc2lnbmVkWGlkc1tp XTsKLQotCQkJLyoKLQkJCSAqIFVwZGF0ZSB4bWluIGlmIHJlcXVpcmVkLiAgT25seSB0aGUg Zmlyc3QgWElEIG5lZWQgYmUgY2hlY2tlZCwKLQkJCSAqIHNpbmNlIHRoZSBhcnJheSBpcyBz b3J0ZWQuCi0JCQkgKi8KLQkJCWlmIChjb3VudCA9PSAwICYmCi0JCQkJVHJhbnNhY3Rpb25J ZFByZWNlZGVzKGtub3duWGlkLCAqeG1pbikpCi0JCQkJKnhtaW4gPSBrbm93blhpZDsKLQot CQkJLyoKLQkJCSAqIEZpbHRlciBvdXQgYW55dGhpbmcgPj0geG1heCwgYWdhaW4gcmVseWlu ZyBvbiBzb3J0ZWQgcHJvcGVydHkKLQkJCSAqIG9mIGFycmF5LgotCQkJICovCi0JCQlpZiAo VHJhbnNhY3Rpb25JZElzVmFsaWQoeG1heCkgJiYKLQkJCQlUcmFuc2FjdGlvbklkRm9sbG93 c09yRXF1YWxzKGtub3duWGlkLCB4bWF4KSkKLQkJCQlicmVhazsKLQotCQkJLyogQWRkIGtu b3duWGlkIGludG8gb3V0cHV0IGFycmF5ICovCi0JCQl4YXJyYXlbY291bnQrK10gPSBrbm93 blhpZDsKLQkJfQotCX0KLQotCXJldHVybiBjb3VudDsKLX0KLQotLyoKLSAqIEdldCBvbGRl c3QgWElEIGluIHRoZSBLbm93bkFzc2lnbmVkWGlkcyBhcnJheSwgb3IgSW52YWxpZFRyYW5z YWN0aW9uSWQKLSAqIGlmIG5vdGhpbmcgdGhlcmUuCi0gKi8KLXN0YXRpYyBUcmFuc2FjdGlv bklkCi1Lbm93bkFzc2lnbmVkWGlkc0dldE9sZGVzdFhtaW4odm9pZCkKLXsKLQlpbnQJCQlo ZWFkLAotCQkJCXRhaWw7Ci0JaW50CQkJaTsKLQotCS8qCi0JICogRmV0Y2ggaGVhZCBqdXN0 IG9uY2UsIHNpbmNlIGl0IG1heSBjaGFuZ2Ugd2hpbGUgd2UgbG9vcC4KLQkgKi8KLQl0YWls ID0gcHJvY0FycmF5LT50YWlsS25vd25Bc3NpZ25lZFhpZHM7Ci0JaGVhZCA9IHByb2NBcnJh eS0+aGVhZEtub3duQXNzaWduZWRYaWRzOwotCi0JcGdfcmVhZF9iYXJyaWVyKCk7CQkJLyog cGFpcnMgd2l0aCBLbm93bkFzc2lnbmVkWGlkc0FkZCAqLwotCi0JZm9yIChpID0gdGFpbDsg aSA8IGhlYWQ7IGkrKykKLQl7Ci0JCS8qIFNraXAgYW55IGdhcHMgaW4gdGhlIGFycmF5ICov Ci0JCWlmIChLbm93bkFzc2lnbmVkWGlkc1ZhbGlkW2ldKQotCQkJcmV0dXJuIEtub3duQXNz aWduZWRYaWRzW2ldOwotCX0KLQotCXJldHVybiBJbnZhbGlkVHJhbnNhY3Rpb25JZDsKLX0K LQotLyoKLSAqIERpc3BsYXkgS25vd25Bc3NpZ25lZFhpZHMgdG8gcHJvdmlkZSBkZWJ1ZyB0 cmFpbAotICoKLSAqIEN1cnJlbnRseSB0aGlzIGlzIG9ubHkgY2FsbGVkIHdpdGhpbiBzdGFy dHVwIHByb2Nlc3MsIHNvIHdlIG5lZWQgbm8KLSAqIHNwZWNpYWwgbG9ja2luZy4KLSAqCi0g KiBOb3RlIHRoaXMgaXMgcHJldHR5IGV4cGVuc2l2ZSwgYW5kIG11Y2ggb2YgdGhlIGV4cGVu c2Ugd2lsbCBiZSBpbmN1cnJlZAotICogZXZlbiBpZiB0aGUgZWxvZyBtZXNzYWdlIHdpbGwg Z2V0IGRpc2NhcmRlZC4gIEl0J3Mgbm90IGN1cnJlbnRseSBjYWxsZWQKLSAqIGluIGFueSBw ZXJmb3JtYW5jZS1jcml0aWNhbCBwbGFjZXMsIGhvd2V2ZXIsIHNvIG5vIG5lZWQgdG8gYmUg dGVuc2VyLgotICovCi1zdGF0aWMgdm9pZAotS25vd25Bc3NpZ25lZFhpZHNEaXNwbGF5KGlu dCB0cmFjZV9sZXZlbCkKLXsKLQlQcm9jQXJyYXlTdHJ1Y3QgKnBBcnJheSA9IHByb2NBcnJh eTsKLQlTdHJpbmdJbmZvRGF0YSBidWY7Ci0JaW50CQkJaGVhZCwKLQkJCQl0YWlsLAotCQkJ CWk7Ci0JaW50CQkJbnhpZHMgPSAwOwotCi0JdGFpbCA9IHBBcnJheS0+dGFpbEtub3duQXNz aWduZWRYaWRzOwotCWhlYWQgPSBwQXJyYXktPmhlYWRLbm93bkFzc2lnbmVkWGlkczsKLQot CWluaXRTdHJpbmdJbmZvKCZidWYpOwotCi0JZm9yIChpID0gdGFpbDsgaSA8IGhlYWQ7IGkr KykKLQl7Ci0JCWlmIChLbm93bkFzc2lnbmVkWGlkc1ZhbGlkW2ldKQotCQl7Ci0JCQlueGlk cysrOwotCQkJYXBwZW5kU3RyaW5nSW5mbygmYnVmLCAiWyVkXT0ldSAiLCBpLCBLbm93bkFz c2lnbmVkWGlkc1tpXSk7Ci0JCX0KLQl9Ci0KLQllbG9nKHRyYWNlX2xldmVsLCAiJWQgS25v d25Bc3NpZ25lZFhpZHMgKG51bT0lZCB0YWlsPSVkIGhlYWQ9JWQpICVzIiwKLQkJIG54aWRz LAotCQkgcEFycmF5LT5udW1Lbm93bkFzc2lnbmVkWGlkcywKLQkJIHBBcnJheS0+dGFpbEtu b3duQXNzaWduZWRYaWRzLAotCQkgcEFycmF5LT5oZWFkS25vd25Bc3NpZ25lZFhpZHMsCi0J CSBidWYuZGF0YSk7Ci0KLQlwZnJlZShidWYuZGF0YSk7Ci19Ci0KLS8qCi0gKiBLbm93bkFz c2lnbmVkWGlkc1Jlc2V0Ci0gKgkJUmVzZXRzIEtub3duQXNzaWduZWRYaWRzIHRvIGJlIGVt cHR5Ci0gKi8KLXN0YXRpYyB2b2lkCi1Lbm93bkFzc2lnbmVkWGlkc1Jlc2V0KHZvaWQpCi17 Ci0JUHJvY0FycmF5U3RydWN0ICpwQXJyYXkgPSBwcm9jQXJyYXk7Ci0KLQlMV0xvY2tBY3F1 aXJlKFByb2NBcnJheUxvY2ssIExXX0VYQ0xVU0lWRSk7CisJQXNzZXJ0KGxzbiA+IFRyYW5z YW1WYXJpYWJsZXMtPmxhdGVzdENvbW1pdExTTik7CisJVHJhbnNhbVZhcmlhYmxlcy0+bGF0 ZXN0Q29tbWl0TFNOID0gbHNuOwogCi0JcEFycmF5LT5udW1Lbm93bkFzc2lnbmVkWGlkcyA9 IDA7Ci0JcEFycmF5LT50YWlsS25vd25Bc3NpZ25lZFhpZHMgPSAwOwotCXBBcnJheS0+aGVh ZEtub3duQXNzaWduZWRYaWRzID0gMDsKKwlwcm9jQXJyYXktPm9sZGVzdF9ydW5uaW5nX3By aW1hcnlfeGlkID0gb2xkZXN0X3J1bm5pbmdfcHJpbWFyeV94aWQ7CiAKIAlMV0xvY2tSZWxl YXNlKFByb2NBcnJheUxvY2spOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFn ZS9pcGMvc3RhbmRieS5jIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvc3RhbmRieS5jCmlu ZGV4IDI1MjY3ZjBmODUuLmUwMmM5YWI4NDIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0 b3JhZ2UvaXBjL3N0YW5kYnkuYworKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9zdGFu ZGJ5LmMKQEAgLTEzOSw4ICsxMzksNiBAQCBJbml0UmVjb3ZlcnlUcmFuc2FjdGlvbkVudmly b25tZW50KHZvaWQpCiAJdnhpZC5wcm9jTnVtYmVyID0gTXlQcm9jTnVtYmVyOwogCXZ4aWQu bG9jYWxUcmFuc2FjdGlvbklkID0gR2V0TmV4dExvY2FsVHJhbnNhY3Rpb25JZCgpOwogCVZp cnR1YWxYYWN0TG9ja1RhYmxlSW5zZXJ0KHZ4aWQpOwotCi0Jc3RhbmRieVN0YXRlID0gU1RB TkRCWV9JTklUSUFMSVpFRDsKIH0KIAogLyoKQEAgLTE2OCw5ICsxNjYsNiBAQCBTaHV0ZG93 blJlY292ZXJ5VHJhbnNhY3Rpb25FbnZpcm9ubWVudCh2b2lkKQogCWlmIChSZWNvdmVyeUxv Y2tIYXNoID09IE5VTEwpCiAJCXJldHVybjsKIAotCS8qIE1hcmsgYWxsIHRyYWNrZWQgaW4t cHJvZ3Jlc3MgdHJhbnNhY3Rpb25zIGFzIGZpbmlzaGVkLiAqLwotCUV4cGlyZUFsbEtub3du QXNzaWduZWRUcmFuc2FjdGlvbklkcygpOwotCiAJLyogUmVsZWFzZSBhbGwgbG9ja3MgdGhl IHRyYWNrZWQgdHJhbnNhY3Rpb25zIHdlcmUgaG9sZGluZyAqLwogCVN0YW5kYnlSZWxlYXNl QWxsTG9ja3MoKTsKIApAQCAtMTE2Nyw3ICsxMTYyLDcgQEAgc3RhbmRieV9yZWRvKFhMb2dS ZWFkZXJTdGF0ZSAqcmVjb3JkKQogCUFzc2VydCghWExvZ1JlY0hhc0FueUJsb2NrUmVmcyhy ZWNvcmQpKTsKIAogCS8qIERvIG5vdGhpbmcgaWYgd2UncmUgbm90IGluIGhvdCBzdGFuZGJ5 IG1vZGUgKi8KLQlpZiAoc3RhbmRieVN0YXRlID09IFNUQU5EQllfRElTQUJMRUQpCisJaWYg KCFJbkhvdFN0YW5kYnkpCiAJCXJldHVybjsKIAogCWlmIChpbmZvID09IFhMT0dfU1RBTkRC WV9MT0NLKQpAQCAtMTE4MiwxOCArMTE3NywyMSBAQCBzdGFuZGJ5X3JlZG8oWExvZ1JlYWRl clN0YXRlICpyZWNvcmQpCiAJfQogCWVsc2UgaWYgKGluZm8gPT0gWExPR19SVU5OSU5HX1hB Q1RTKQogCXsKKwkJLyoKKwkJICogWFhYOiBydW5uaW5nIHhhY3RzIHJlY29yZHMgd2VyZSBw cmV2aW91c2x5IHVzZWQgdG8gdXBkYXRlCisJCSAqIGtub3duLWFzc2lnbmVkIHhpZHMsIGJ1 dCBub3cgd2Ugb25seSBuZWVkIGl0IGZvciB0aGUgbG9naWNhbAorCQkgKiByZXBsaWNhdGlv biBzbmFwYnVpbGRlciBzdHVmZi4gQW5kIGZvciB0aGUKKwkJICogcGdfc3RhdF9yZXBvcnRf c3RhdCh0cnVlKSBjYWxsIGJlbG93LgorCQkgKi8KIAkJeGxfcnVubmluZ194YWN0cyAqeGxy ZWMgPSAoeGxfcnVubmluZ194YWN0cyAqKSBYTG9nUmVjR2V0RGF0YShyZWNvcmQpOwotCQlS dW5uaW5nVHJhbnNhY3Rpb25zRGF0YSBydW5uaW5nOwogCi0JCXJ1bm5pbmcueGNudCA9IHhs cmVjLT54Y250OwotCQlydW5uaW5nLnN1YnhjbnQgPSB4bHJlYy0+c3VieGNudDsKLQkJcnVu bmluZy5zdWJ4aWRfc3RhdHVzID0geGxyZWMtPnN1YnhpZF9vdmVyZmxvdyA/IFNVQlhJRFNf TUlTU0lORyA6IFNVQlhJRFNfSU5fQVJSQVk7Ci0JCXJ1bm5pbmcubmV4dFhpZCA9IHhscmVj LT5uZXh0WGlkOwotCQlydW5uaW5nLmxhdGVzdENvbXBsZXRlZFhpZCA9IHhscmVjLT5sYXRl c3RDb21wbGV0ZWRYaWQ7Ci0JCXJ1bm5pbmcub2xkZXN0UnVubmluZ1hpZCA9IHhscmVjLT5v bGRlc3RSdW5uaW5nWGlkOwotCQlydW5uaW5nLnhpZHMgPSB4bHJlYy0+eGlkczsKLQotCQlQ cm9jQXJyYXlBcHBseVJlY292ZXJ5SW5mbygmcnVubmluZyk7CisJCS8qCisJCSAqIFJlbWVt YmVyIHRoZSBvbGRlc3QgWElEIHRoYXQgd2FzIHJ1bm5pbmcgYXQgdGhlIHRpbWUuIE5vcm1h bGx5LCBhbGwKKwkJICogdHJhbnNhY3Rpb24gYWJvcnRzIGFuZCBjb21taXRzIGFyZSBXQUwt bG9nZ2VkLCBzbyBvdXIKKwkJICogb2xkZXN0UnVubmluZ1hpZCB2YWx1ZSBzaG91bGQgYmUg dXAtdG8tZGF0ZSwgYnV0IGlmIG5vdCwgdGhpcworCQkgKiBhbGxvd3MgdXMgdG8gcmVzeW5j aHJvbml6ZS4KKwkJICovCisJCVByb2NBcnJheVVwZGF0ZU9sZGVzdFJ1bm5pbmdYaWQoeGxy ZWMtPm9sZGVzdFJ1bm5pbmdYaWQpOwogCiAJCS8qCiAJCSAqIFRoZSBzdGFydHVwIHByb2Nl c3MgY3VycmVudGx5IGhhcyBubyBjb252ZW5pZW50IHdheSB0byBzY2hlZHVsZQpAQCAtMTIy NCw1MCArMTIyMiw0NiBAQCBzdGFuZGJ5X3JlZG8oWExvZ1JlYWRlclN0YXRlICpyZWNvcmQp CiAgKgogICogVGhpcyBpcyB1c2VkIGZvciBIb3QgU3RhbmRieSBhcyBmb2xsb3dzOgogICoK LSAqIFdlIGNhbiBtb3ZlIGRpcmVjdGx5IHRvIFNUQU5EQllfU05BUFNIT1RfUkVBRFkgYXQg c3RhcnR1cCBpZiB3ZQotICogc3RhcnQgZnJvbSBhIHNodXRkb3duIGNoZWNrcG9pbnQgYmVj YXVzZSB3ZSBrbm93IG5vdGhpbmcgd2FzIHJ1bm5pbmcKLSAqIGF0IHRoYXQgdGltZSBhbmQg b3VyIHJlY292ZXJ5IHNuYXBzaG90IGlzIGtub3duIGVtcHR5LiBJbiB0aGUgbW9yZQotICog dHlwaWNhbCBjYXNlIG9mIGFuIG9ubGluZSBjaGVja3BvaW50IHdlIG5lZWQgdG8ganVtcCB0 aHJvdWdoIGEgZmV3Ci0gKiBob29wcyB0byBnZXQgYSBjb3JyZWN0IHJlY292ZXJ5IHNuYXBz aG90IGFuZCB0aGlzIHJlcXVpcmVzIGEgdHdvIG9yCi0gKiBzb21ldGltZXMgYSB0aHJlZSBz dGFnZSBwcm9jZXNzLgorICogV2UgY2FuIGVudGVyIGhvdCBzdGFuZGJ5IG1vZGUgYW5kIHN0 YXJ0IGFjY2VwdGluZyByZWFkLW9ubHkgcXVlcmllcworICogaW1tZWRpYXRlbHkgYXQgc3Rh cnR1cCBpZiB3ZSBzdGFydCBmcm9tIGEgc2h1dGRvd24gY2hlY2twb2ludCwgYmVjYXVzZSB3 ZQorICoga25vdyBub3RoaW5nIHdhcyBydW5uaW5nIGF0IHRoYXQgdGltZSBhbmQgb3VyIHJl Y292ZXJ5IHNuYXBzaG90IGlzIGtub3duCisgKiBlbXB0eS4gSW4gdGhlIG1vcmUgdHlwaWNh bCBjYXNlIG9mIGFuIG9ubGluZSBjaGVja3BvaW50LCB0aGUgY2hlY2twb2ludAorICogcmVj b3JkIGRvZXNuJ3QgY29udGFpbiBhbGwgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBhYm91 dCBydW5uaW5nCisgKiB0cmFuc2FjdGlvbiBzdGF0ZSwgYW5kIHdlIG5lZWQgdG8ganVtcCB0 aHJvdWdoIGEgZmV3IGhvb3BzIHRvIGdldCBhIGNvcnJlY3QKKyAqIHJlY292ZXJ5IHNuYXBz aG90LgogICoKLSAqIFRoZSBpbml0aWFsIHNuYXBzaG90IG11c3QgY29udGFpbiBhbGwgcnVu bmluZyB4aWRzIGFuZCBhbGwgY3VycmVudAotICogQWNjZXNzRXhjbHVzaXZlTG9ja3MgYXQg YSBwb2ludCBpbiB0aW1lIG9uIHRoZSBzdGFuZGJ5LiBBc3NlbWJsaW5nCi0gKiB0aGF0IGlu Zm9ybWF0aW9uIHdoaWxlIHRoZSBzZXJ2ZXIgaXMgcnVubmluZyByZXF1aXJlcyBtYW55IGFu ZAotICogdmFyaW91cyBMV0xvY2tzLCBzbyB3ZSBjaG9vc2UgdG8gZGVyaXZlIHRoYXQgaW5m b3JtYXRpb24gcGllY2UgYnkKLSAqIHBpZWNlIGFuZCB0aGVuIHJlLWFzc2VtYmxlIHRoYXQg aW5mbyBvbiB0aGUgc3RhbmRieS4gV2hlbiB0aGF0Ci0gKiBpbmZvcm1hdGlvbiBpcyBmdWxs eSBhc3NlbWJsZWQgd2UgbW92ZSB0byBTVEFOREJZX1NOQVBTSE9UX1JFQURZLgorICogVGhl IGluaXRpYWwgc25hcHNob3QgbXVzdCBjb250YWluIGFsbCBjdXJyZW50IEFjY2Vzc0V4Y2x1 c2l2ZUxvY2tzIGF0IGEKKyAqIHBvaW50IGluIHRpbWUgb24gdGhlIHN0YW5kYnkuIEFzc2Vt YmxpbmcgdGhhdCBpbmZvcm1hdGlvbiB3aGlsZSB0aGUgc2VydmVyCisgKiBpcyBydW5uaW5n IHJlcXVpcmVzIG1hbnkgYW5kIHZhcmlvdXMgTFdMb2Nrcywgc28gd2UgY2hvb3NlIHRvIGRl cml2ZSB0aGF0CisgKiBpbmZvcm1hdGlvbiBwaWVjZSBieSBwaWVjZSBhbmQgdGhlbiByZS1h c3NlbWJsZSB0aGF0IGluZm8gb24gdGhlIHN0YW5kYnkuCiAgKgotICogU2luY2UgbG9ja2lu ZyBvbiB0aGUgcHJpbWFyeSB3aGVuIHdlIGRlcml2ZSB0aGUgaW5mb3JtYXRpb24gaXMgbm90 Ci0gKiBzdHJpY3QsIHdlIG5vdGUgdGhhdCB0aGVyZSBpcyBhIHRpbWUgd2luZG93IGJldHdl ZW4gdGhlIGRlcml2YXRpb24gYW5kCi0gKiB3cml0aW5nIHRvIFdBTCBvZiB0aGUgZGVyaXZl ZCBpbmZvcm1hdGlvbi4gVGhhdCBhbGxvd3MgcmFjZSBjb25kaXRpb25zCi0gKiB0aGF0IHdl IG11c3QgcmVzb2x2ZSwgc2luY2UgeGlkcyBhbmQgbG9ja3MgbWF5IGVudGVyIG9yIGxlYXZl IHRoZQotICogc25hcHNob3QgZHVyaW5nIHRoYXQgd2luZG93LiBUaGlzIGNyZWF0ZXMgdGhl IGlzc3VlIHRoYXQgYW4geGlkIG9yCi0gKiBsb2NrIG1heSBzdGFydCAqYWZ0ZXIqIHRoZSBz bmFwc2hvdCBoYXMgYmVlbiBkZXJpdmVkIHlldCAqYmVmb3JlKiB0aGUKLSAqIHNuYXBzaG90 IGlzIGxvZ2dlZCBpbiB0aGUgcnVubmluZyB4YWN0cyBXQUwgcmVjb3JkLiBXZSByZXNvbHZl IHRoaXMgYnkKLSAqIHN0YXJ0aW5nIHRvIGFjY3VtdWxhdGUgY2hhbmdlcyBhdCBhIHBvaW50 IGp1c3QgcHJpb3IgdG8gd2hlbiB3ZSBkZXJpdmUKLSAqIHRoZSBzbmFwc2hvdCBvbiB0aGUg cHJpbWFyeSwgdGhlbiBpZ25vcmUgZHVwbGljYXRlcyB3aGVuIHdlIGxhdGVyIGFwcGx5Ci0g KiB0aGUgc25hcHNob3QgZnJvbSB0aGUgcnVubmluZyB4YWN0cyByZWNvcmQuIFRoaXMgaXMg aW1wbGVtZW50ZWQgZHVyaW5nCi0gKiBDcmVhdGVDaGVja1BvaW50KCkgd2hlcmUgd2UgdXNl IHRoZSBsb2dpY2FsIGNoZWNrcG9pbnQgbG9jYXRpb24gYXMKLSAqIG91ciBzdGFydGluZyBw b2ludCBhbmQgdGhlbiB3cml0ZSB0aGUgcnVubmluZyB4YWN0cyByZWNvcmQgaW1tZWRpYXRl bHkKLSAqIGJlZm9yZSB3cml0aW5nIHRoZSBtYWluIGNoZWNrcG9pbnQgV0FMIHJlY29yZC4g U2luY2Ugd2UgYWx3YXlzIHN0YXJ0Ci0gKiB1cCBmcm9tIGEgY2hlY2twb2ludCBhbmQgYXJl IGltbWVkaWF0ZWx5IGF0IG91ciBzdGFydGluZyBwb2ludCwgd2UKLSAqIHVuY29uZGl0aW9u YWxseSBtb3ZlIHRvIFNUQU5EQllfSU5JVElBTElaRUQuIEFmdGVyIHRoaXMgcG9pbnQgd2UK LSAqIG11c3QgZG8gNCB0aGluZ3M6CisgKiBTaW5jZSBsb2NraW5nIG9uIHRoZSBwcmltYXJ5 IHdoZW4gd2UgZGVyaXZlIHRoZSBpbmZvcm1hdGlvbiBpcyBub3Qgc3RyaWN0LAorICogdGhl cmUgaXMgYSB0aW1lIHdpbmRvdyBiZXR3ZWVuIHRoZSBkZXJpdmF0aW9uIGFuZCB3cml0aW5n IHRvIFdBTCBvZiB0aGUKKyAqIGRlcml2ZWQgaW5mb3JtYXRpb24uIFRoYXQgYWxsb3dzIHJh Y2UgY29uZGl0aW9ucyB0aGF0IHdlIG11c3QgcmVzb2x2ZSwKKyAqIHNpbmNlIHhpZHMgYW5k IGxvY2tzIG1heSBlbnRlciBvciBsZWF2ZSB0aGUgc25hcHNob3QgZHVyaW5nIHRoYXQKKyAq IHdpbmRvdy4gVGhpcyBjcmVhdGVzIHRoZSBpc3N1ZSB0aGF0IGFuIHhpZCBvciBsb2NrIG1h eSBzdGFydCAqYWZ0ZXIqIHRoZQorICogc25hcHNob3QgaGFzIGJlZW4gZGVyaXZlZCB5ZXQg KmJlZm9yZSogdGhlIHNuYXBzaG90IGlzIGxvZ2dlZCBpbiB0aGUKKyAqIHJ1bm5pbmcgeGFj dHMgV0FMIHJlY29yZC4gV2UgcmVzb2x2ZSB0aGlzIGJ5IHN0YXJ0aW5nIHRvIGFjY3VtdWxh dGUgY2hhbmdlcworICogYXQgYSBwb2ludCBqdXN0IHByaW9yIHRvIHdoZW4gd2UgY29sbGVj dCB0aGUgbG9jayBpbmZvcm1hdGlvbiBvbiB0aGUKKyAqIHByaW1hcnksIHRoZW4gaWdub3Jl IGR1cGxpY2F0ZXMgd2hlbiB3ZSBsYXRlciBhcHBseSB0aGUgc25hcHNob3QgZnJvbSB0aGUK KyAqIHJ1bm5pbmcgeGFjdHMgcmVjb3JkLiBUaGlzIGlzIGltcGxlbWVudGVkIGR1cmluZyBD cmVhdGVDaGVja1BvaW50KCkgd2hlcmUKKyAqIHdlIHVzZSB0aGUgbG9naWNhbCBjaGVja3Bv aW50IGxvY2F0aW9uIGFzIG91ciBzdGFydGluZyBwb2ludCBhbmQgdGhlbiB3cml0ZQorICog dGhlIHJ1bm5pbmcgeGFjdHMgcmVjb3JkIGltbWVkaWF0ZWx5IGJlZm9yZSB3cml0aW5nIHRo ZSBtYWluIGNoZWNrcG9pbnQgV0FMCisgKiByZWNvcmQuIFNpbmNlIHdlIGFsd2F5cyBzdGFy dCB1cCBmcm9tIGEgY2hlY2twb2ludCdzIHJlZG8gcG9pbnRlciwgd2Ugd2lsbAorICogYWx3 YXlzIHNlZSBhIHJ1bm5pbmcteGFjdHMgcmVjb3JkIGJldHdlZW4gYmVmb3JlIHJlYWNoaW5n IHRoZSBjaGVja3BvaW50CisgKiByZWNvcmQsIGFuZCBjYW4gaW1tZWRpYXRlbHkgZW50ZXIg aG90IHN0YW5kYnkgbW9kZS4gQWZ0ZXIgdGhpcyBwb2ludCB3ZQorICogbXVzdCBkbyAzIHRo aW5nczoKICAqCSogbW92ZSBzaGFyZWQgbmV4dFhpZCBmb3J3YXJkcyBhcyB3ZSBzZWUgbmV3 IHhpZHMKICAqCSogZXh0ZW5kIHRoZSBjbG9nIGFuZCBzdWJ0cmFucyB3aXRoIGVhY2ggbmV3 IHhpZAotICoJKiBrZWVwIHRyYWNrIG9mIHVuY29tbWl0dGVkIGtub3duIGFzc2lnbmVkIHhp ZHMKICAqCSoga2VlcCB0cmFjayBvZiB1bmNvbW1pdHRlZCBBY2Nlc3NFeGNsdXNpdmVMb2Nr cwogICoKLSAqIFdoZW4gd2Ugc2VlIGEgY29tbWl0L2Fib3J0IHdlIG11c3QgcmVtb3ZlIGtu b3duIGFzc2lnbmVkIHhpZHMgYW5kIGxvY2tzCi0gKiBmcm9tIHRoZSBjb21wbGV0aW5nIHRy YW5zYWN0aW9uLiBBdHRlbXB0ZWQgcmVtb3ZhbHMgdGhhdCBjYW5ub3QgbG9jYXRlCi0gKiBh biBlbnRyeSBhcmUgZXhwZWN0ZWQgYW5kIG11c3Qgbm90IGNhdXNlIGFuIGVycm9yIHdoZW4g d2UgYXJlIGluIHN0YXRlCi0gKiBTVEFOREJZX0lOSVRJQUxJWkVELiBUaGlzIGlzIGltcGxl bWVudGVkIGluIFN0YW5kYnlSZWxlYXNlTG9ja3MoKSBhbmQKLSAqIEtub3duQXNzaWduZWRY aWRzUmVtb3ZlKCkuCi0gKgotICogTGF0ZXIsIHdoZW4gd2UgYXBwbHkgdGhlIHJ1bm5pbmcg eGFjdCBkYXRhIHdlIG11c3QgYmUgY2FyZWZ1bCB0byBpZ25vcmUKLSAqIHRyYW5zYWN0aW9u cyBhbHJlYWR5IGNvbW1pdHRlZCwgc2luY2UgdGhvc2UgY29tbWl0cyByYWNlZCBhaGVhZCB3 aGVuCi0gKiBtYWtpbmcgV0FMIGVudHJpZXMuCisgKiBXaGVuIHdlIHNlZSBhIGNvbW1pdC9h Ym9ydCB3ZSBtdXN0IGFkdmFuY2Ugb2xkZXN0X3J1bm5pbmdfcHJpbWFyeV94aWQgYW5kCisg KiByZW1vdmUgbG9ja3MgZnJvbSB0aGUgY29tcGxldGluZyB0cmFuc2FjdGlvbi4gQXR0ZW1w dGVkIHJlbW92YWxzIHRoYXQKKyAqIGNhbm5vdCBsb2NhdGUgYW4gZW50cnkgYXJlIGV4cGVj dGVkIGFuZCBtdXN0IG5vdCBjYXVzZSBhbiBlcnJvciB1bnRpbCB3ZQorICogaGF2ZSBzZWVu IHRoZSBydW5uaW5nLXhhY3RzIHJlY29yZC4gKFdlIGRvbid0IHRocm93IGFuIGVycm9yIGV2 ZW4gYWZ0ZXIKKyAqIHRoYXQsIGJlY2F1c2Ugd2hhdGV2ZXIgdGhlIHJlYXNvbiB3YXMsIGFm dGVyIHRoZSB0cmFuc2FjdGlvbiBoYXMgY29tcGxldGVkCisgKiB0aGUgaXNzdWUgaGFzIGFs cmVhZHkgYmVlbiByZXNvbHZlZCBhbnl3YXkuKSBUaGlzIGlzIGltcGxlbWVudGVkIGluCisg KiBTdGFuZGJ5UmVsZWFzZUxvY2tzKCkuCiAgKgogICogRm9yIGxvZ2ljYWwgZGVjb2Rpbmcg b25seSB0aGUgcnVubmluZyB4YWN0cyBpbmZvcm1hdGlvbiBpcyBuZWVkZWQ7CiAgKiB0aGVy ZSdzIG5vIG5lZWQgdG8gbG9vayBhdCB0aGUgbG9ja2luZyBpbmZvcm1hdGlvbiwgYnV0IGl0 J3MgbG9nZ2VkIGFueXdheSwKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvbG1n ci9sd2xvY2suYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvbG1nci9sd2xvY2suYwppbmRleCBk YjZlZDc4NGFiLi42MGY5M2EzOWE0IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdG9yYWdl L2xtZ3IvbHdsb2NrLmMKKysrIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9sbWdyL2x3bG9jay5j CkBAIC0xMzAsNiArMTMwLDcgQEAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IEJ1aWx0aW5U cmFuY2hlTmFtZXNbXSA9IHsKIAlbTFdUUkFOQ0hFX1hBQ1RfQlVGRkVSXSA9ICJYYWN0QnVm ZmVyIiwKIAlbTFdUUkFOQ0hFX0NPTU1JVFRTX0JVRkZFUl0gPSAiQ29tbWl0VHNCdWZmZXIi LAogCVtMV1RSQU5DSEVfU1VCVFJBTlNfQlVGRkVSXSA9ICJTdWJ0cmFuc0J1ZmZlciIsCisJ W0xXVFJBTkNIRV9DU05fTE9HX0JVRkZFUl0gPSAiQ3NuTG9nQnVmZmVyIiwKIAlbTFdUUkFO Q0hFX01VTFRJWEFDVE9GRlNFVF9CVUZGRVJdID0gIk11bHRpWGFjdE9mZnNldEJ1ZmZlciIs CiAJW0xXVFJBTkNIRV9NVUxUSVhBQ1RNRU1CRVJfQlVGRkVSXSA9ICJNdWx0aVhhY3RNZW1i ZXJCdWZmZXIiLAogCVtMV1RSQU5DSEVfTk9USUZZX0JVRkZFUl0gPSAiTm90aWZ5QnVmZmVy IiwKQEAgLTE2Niw2ICsxNjcsNyBAQCBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgQnVpbHRp blRyYW5jaGVOYW1lc1tdID0gewogCVtMV1RSQU5DSEVfU1VCVFJBTlNfU0xSVV0gPSAiU3Vi dHJhbnNTTFJVIiwKIAlbTFdUUkFOQ0hFX1hBQ1RfU0xSVV0gPSAiWGFjdFNMUlUiLAogCVtM V1RSQU5DSEVfUEFSQUxMRUxfVkFDVVVNX0RTQV0gPSAiUGFyYWxsZWxWYWN1dW1EU0EiLAor CVtMV1RSQU5DSEVfQ1NOX0xPR19TTFJVXSA9ICJDc25Mb2dTTFJVIiwKIH07CiAKIFN0YXRp Y0Fzc2VydERlY2wobGVuZ3Rob2YoQnVpbHRpblRyYW5jaGVOYW1lcykgPT0KZGlmZiAtLWdp dCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FjdGl2aXR5L3dhaXRfZXZlbnRfbmFtZXMudHh0IGIv c3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvd2FpdF9ldmVudF9uYW1lcy50eHQKaW5kZXgg MTYxNDRjMmI3Mi4uYWFjZWFiNzc3MSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMv YWN0aXZpdHkvd2FpdF9ldmVudF9uYW1lcy50eHQKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMv YWN0aXZpdHkvd2FpdF9ldmVudF9uYW1lcy50eHQKQEAgLTM1Nyw2ICszNTcsNyBAQCBTZXJp YWxDb250cm9sCSJXYWl0aW5nIHRvIHJlYWQgb3IgdXBkYXRlIHNoYXJlZCA8ZmlsZW5hbWU+ cGdfc2VyaWFsPC9maWxlbmFtZT4gcwogWGFjdEJ1ZmZlcgkiV2FpdGluZyBmb3IgSS9PIG9u IGEgdHJhbnNhY3Rpb24gc3RhdHVzIFNMUlUgYnVmZmVyLiIKIENvbW1pdFRzQnVmZmVyCSJX YWl0aW5nIGZvciBJL08gb24gYSBjb21taXQgdGltZXN0YW1wIFNMUlUgYnVmZmVyLiIKIFN1 YnRyYW5zQnVmZmVyCSJXYWl0aW5nIGZvciBJL08gb24gYSBzdWItdHJhbnNhY3Rpb24gU0xS VSBidWZmZXIuIgorQ3NubG9nQnVmZmVyCSJXYWl0aW5nIGZvciBJL08gb24gYSBzdWItdHJh bnNhY3Rpb24gU0xSVSBidWZmZXIuIgogTXVsdGlYYWN0T2Zmc2V0QnVmZmVyCSJXYWl0aW5n IGZvciBJL08gb24gYSBtdWx0aXhhY3Qgb2Zmc2V0IFNMUlUgYnVmZmVyLiIKIE11bHRpWGFj dE1lbWJlckJ1ZmZlcgkiV2FpdGluZyBmb3IgSS9PIG9uIGEgbXVsdGl4YWN0IG1lbWJlciBT TFJVIGJ1ZmZlci4iCiBOb3RpZnlCdWZmZXIJIldhaXRpbmcgZm9yIEkvTyBvbiBhIDxjb21t YW5kPk5PVElGWTwvY29tbWFuZD4gbWVzc2FnZSBTTFJVIGJ1ZmZlci4iCmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC91dGlscy9wcm9iZXMuZCBiL3NyYy9iYWNrZW5kL3V0aWxzL3Byb2Jl cy5kCmluZGV4IGQ3NzI1NDQzNzcuLmZmYmZhZTg0YjggMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL3V0aWxzL3Byb2Jlcy5kCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL3Byb2Jlcy5kCkBA IC03Nyw2ICs3Nyw4IEBAIHByb3ZpZGVyIHBvc3RncmVzcWwgewogCXByb2JlIGNsb2dfX2No ZWNrcG9pbnRfX2RvbmUoYm9vbCk7CiAJcHJvYmUgc3VidHJhbnNfX2NoZWNrcG9pbnRfX3N0 YXJ0KGJvb2wpOwogCXByb2JlIHN1YnRyYW5zX19jaGVja3BvaW50X19kb25lKGJvb2wpOwor CXByb2JlIGNzbmxvZ19fY2hlY2twb2ludF9fc3RhcnQoYm9vbCk7CisJcHJvYmUgY3NubG9n X19jaGVja3BvaW50X19kb25lKGJvb2wpOwogCXByb2JlIG11bHRpeGFjdF9fY2hlY2twb2lu dF9fc3RhcnQoYm9vbCk7CiAJcHJvYmUgbXVsdGl4YWN0X19jaGVja3BvaW50X19kb25lKGJv b2wpOwogCXByb2JlIHR3b3BoYXNlX19jaGVja3BvaW50X19zdGFydCgpOwpkaWZmIC0tZ2l0 IGEvc3JjL2JhY2tlbmQvdXRpbHMvdGltZS9zbmFwbWdyLmMgYi9zcmMvYmFja2VuZC91dGls cy90aW1lL3NuYXBtZ3IuYwppbmRleCA3ZDJiMzRkNGYyLi5kYTgyZGVmODQ2IDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC91dGlscy90aW1lL3NuYXBtZ3IuYworKysgYi9zcmMvYmFja2Vu ZC91dGlscy90aW1lL3NuYXBtZ3IuYwpAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUgPHN5 cy9zdGF0Lmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKKyNpbmNsdWRlICJhY2Nlc3MvY3Nu X2xvZy5oIgogI2luY2x1ZGUgImFjY2Vzcy9zdWJ0cmFucy5oIgogI2luY2x1ZGUgImFjY2Vz cy90cmFuc2FtLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3hhY3QuaCIKQEAgLTIwMSw2ICsyMDIs NyBAQCB0eXBlZGVmIHN0cnVjdCBTZXJpYWxpemVkU25hcHNob3REYXRhCiAJQ29tbWFuZElk CWN1cmNpZDsKIAlUaW1lc3RhbXBUeiB3aGVuVGFrZW47CiAJWExvZ1JlY1B0cglsc247CisJ WExvZ1JlY1B0cglzbmFwc2hvdENzbjsKIH0gU2VyaWFsaXplZFNuYXBzaG90RGF0YTsKIAog LyoKQEAgLTE3MjksNiArMTczMSw3IEBAIFNlcmlhbGl6ZVNuYXBzaG90KFNuYXBzaG90IHNu YXBzaG90LCBjaGFyICpzdGFydF9hZGRyZXNzKQogCXNlcmlhbGl6ZWRfc25hcHNob3QuY3Vy Y2lkID0gc25hcHNob3QtPmN1cmNpZDsKIAlzZXJpYWxpemVkX3NuYXBzaG90LndoZW5UYWtl biA9IHNuYXBzaG90LT53aGVuVGFrZW47CiAJc2VyaWFsaXplZF9zbmFwc2hvdC5sc24gPSBz bmFwc2hvdC0+bHNuOworCXNlcmlhbGl6ZWRfc25hcHNob3Quc25hcHNob3RDc24gPSBzbmFw c2hvdC0+c25hcHNob3RDc247CiAKIAkvKgogCSAqIElnbm9yZSB0aGUgU3ViWElEIGFycmF5 IGlmIGl0IGhhcyBvdmVyZmxvd2VkLCB1bmxlc3MgdGhlIHNuYXBzaG90IHdhcwpAQCAtMTgw Myw2ICsxODA2LDcgQEAgUmVzdG9yZVNuYXBzaG90KGNoYXIgKnN0YXJ0X2FkZHJlc3MpCiAJ c25hcHNob3QtPmN1cmNpZCA9IHNlcmlhbGl6ZWRfc25hcHNob3QuY3VyY2lkOwogCXNuYXBz aG90LT53aGVuVGFrZW4gPSBzZXJpYWxpemVkX3NuYXBzaG90LndoZW5UYWtlbjsKIAlzbmFw c2hvdC0+bHNuID0gc2VyaWFsaXplZF9zbmFwc2hvdC5sc247CisJc25hcHNob3QtPnNuYXBz aG90Q3NuID0gc2VyaWFsaXplZF9zbmFwc2hvdC5zbmFwc2hvdENzbjsKIAlzbmFwc2hvdC0+ c25hcFhhY3RDb21wbGV0aW9uQ291bnQgPSAwOwogCiAJLyogQ29weSBYSURzLCBpZiBwcmVz ZW50LiAqLwpAQCAtMTkxMywzNiArMTkxNywxMSBAQCBYaWRJbk1WQ0NTbmFwc2hvdChUcmFu c2FjdGlvbklkIHhpZCwgU25hcHNob3Qgc25hcHNob3QpCiAJfQogCWVsc2UKIAl7Ci0JCS8q Ci0JCSAqIEluIHJlY292ZXJ5IHdlIHN0b3JlIGFsbCB4aWRzIGluIHRoZSBzdWJ4aXAgYXJy YXkgYmVjYXVzZSBpdCBpcyBieQotCQkgKiBmYXIgdGhlIGJpZ2dlciBhcnJheSwgYW5kIHdl IG1vc3RseSBkb24ndCBrbm93IHdoaWNoIHhpZHMgYXJlCi0JCSAqIHRvcC1sZXZlbCBhbmQg d2hpY2ggYXJlIHN1YnhhY3RzLiBUaGUgeGlwIGFycmF5IGlzIGVtcHR5LgotCQkgKgotCQkg KiBXZSBzdGFydCBieSBzZWFyY2hpbmcgc3VidHJhbnMsIGlmIHdlIG92ZXJmbG93ZWQuCi0J CSAqLwotCQlpZiAoc25hcHNob3QtPnN1Ym92ZXJmbG93ZWQpCi0JCXsKLQkJCS8qCi0JCQkg KiBTbmFwc2hvdCBvdmVyZmxvd2VkLCBzbyBjb252ZXJ0IHhpZCB0byB0b3AtbGV2ZWwuICBU aGlzIGlzIHNhZmUKLQkJCSAqIGJlY2F1c2Ugd2UgZWxpbWluYXRlZCB0b28tb2xkIFhJRHMg YWJvdmUuCi0JCQkgKi8KLQkJCXhpZCA9IFN1YlRyYW5zR2V0VG9wbW9zdFRyYW5zYWN0aW9u KHhpZCk7CisJCVhMb2dSZWNQdHIJY3NuID0gQ1NOTG9nR2V0Q1NOQnlYaWQoeGlkKTsKIAot CQkJLyoKLQkJCSAqIElmIHhpZCB3YXMgaW5kZWVkIGEgc3VieGFjdCwgd2UgbWlnaHQgbm93 IGhhdmUgYW4geGlkIDwgeG1pbiwKLQkJCSAqIHNvIHJlY2hlY2sgdG8gYXZvaWQgYW4gYXJy YXkgc2Nhbi4gIE5vIHBvaW50IGluIHJlY2hlY2tpbmcKLQkJCSAqIHhtYXguCi0JCQkgKi8K LQkJCWlmIChUcmFuc2FjdGlvbklkUHJlY2VkZXMoeGlkLCBzbmFwc2hvdC0+eG1pbikpCi0J CQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLyoKLQkJICogV2Ugbm93IGhhdmUgZWl0aGVy IGEgdG9wLWxldmVsIHhpZCBoaWdoZXIgdGhhbiB4bWluIG9yIGFuCi0JCSAqIGluZGV0ZXJt aW5hdGUgeGlkLiBXZSBkb24ndCBrbm93IHdoZXRoZXIgaXQncyB0b3AgbGV2ZWwgb3Igc3Vi eGFjdAotCQkgKiBidXQgaXQgZG9lc24ndCBtYXR0ZXIuIElmIGl0J3MgcHJlc2VudCwgdGhl IHhpZCBpcyB2aXNpYmxlLgotCQkgKi8KLQkJaWYgKHBnX2xmaW5kMzIoeGlkLCBzbmFwc2hv dC0+c3VieGlwLCBzbmFwc2hvdC0+c3VieGNudCkpCisJCWlmIChjc24gIT0gSW52YWxpZFhM b2dSZWNQdHIgJiYgY3NuIDw9IHNuYXBzaG90LT5zbmFwc2hvdENzbikKKwkJCXJldHVybiBm YWxzZTsKKwkJZWxzZQogCQkJcmV0dXJuIHRydWU7CiAJfQogCmRpZmYgLS1naXQgYS9zcmMv YmluL2luaXRkYi9pbml0ZGIuYyBiL3NyYy9iaW4vaW5pdGRiL2luaXRkYi5jCmluZGV4IDlh OTE4MzA3ODMuLmRmZTgwZWFhMGQgMTAwNjQ0Ci0tLSBhL3NyYy9iaW4vaW5pdGRiL2luaXRk Yi5jCisrKyBiL3NyYy9iaW4vaW5pdGRiL2luaXRkYi5jCkBAIC0yNDksNyArMjQ5LDggQEAg c3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHN1YmRpcnNbXSA9IHsKIAkicGdfeGFjdCIsCiAJ InBnX2xvZ2ljYWwiLAogCSJwZ19sb2dpY2FsL3NuYXBzaG90cyIsCi0JInBnX2xvZ2ljYWwv bWFwcGluZ3MiCisJInBnX2xvZ2ljYWwvbWFwcGluZ3MiLAorCSJwZ19jc24iCiB9OwogCiAK ZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2FjY2Vzcy9jc25fbG9nLmggYi9zcmMvaW5jbHVk ZS9hY2Nlc3MvY3NuX2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAuLmY4Y2RmNTczYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaW5jbHVkZS9hY2Nlc3Mv Y3NuX2xvZy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBjc25fbG9nLmgKKyAqCisgKiBN YXBwaW5nIGZyb20gWElEIHRvIGNvbW1pdCByZWNvcmQncyBMU04gKENvbW1pdCBTZXF1ZW5j ZSBOdW1iZXIpLgorICoKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5Ni0yMDE0LCBQ b3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorICogUG9ydGlvbnMgQ29weXJp Z2h0IChjKSAxOTk0LCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEK KyAqCisgKiBzcmMvaW5jbHVkZS9hY2Nlc3MvY3NuX2xvZy5oCisgKi8KKyNpZm5kZWYgQ1NO TE9HX0gKKyNkZWZpbmUgQ1NOTE9HX0gKKworI2luY2x1ZGUgImFjY2Vzcy94bG9nLmgiCisj aW5jbHVkZSAidXRpbHMvc25hcHNob3QuaCIKKworZXh0ZXJuIHZvaWQgQ1NOTG9nU2V0Q1NO KFRyYW5zYWN0aW9uSWQgeGlkLCBpbnQgbnN1YnhpZHMsCisJCQkJCQkgVHJhbnNhY3Rpb25J ZCAqc3VieGlkcywgWExvZ1JlY1B0ciBjc24pOworZXh0ZXJuIFhMb2dSZWNQdHIgQ1NOTG9n R2V0Q1NOQnlYaWQoVHJhbnNhY3Rpb25JZCB4aWQpOworCitleHRlcm4gU2l6ZSBDU05Mb2dT aG1lbVNpemUodm9pZCk7CitleHRlcm4gdm9pZCBDU05Mb2dTaG1lbUluaXQodm9pZCk7Citl eHRlcm4gdm9pZCBCb290U3RyYXBDU05Mb2codm9pZCk7CitleHRlcm4gdm9pZCBTdGFydHVw Q1NOTG9nKFRyYW5zYWN0aW9uSWQgb2xkZXN0QWN0aXZlWElELCBYTG9nUmVjUHRyIGNzbik7 CitleHRlcm4gdm9pZCBTaHV0ZG93bkNTTkxvZyh2b2lkKTsKK2V4dGVybiB2b2lkIENoZWNr UG9pbnRDU05Mb2codm9pZCk7CitleHRlcm4gdm9pZCBFeHRlbmRDU05Mb2coVHJhbnNhY3Rp b25JZCBuZXdlc3RYYWN0KTsKK2V4dGVybiB2b2lkIFRydW5jYXRlQ1NOTG9nKFRyYW5zYWN0 aW9uSWQgb2xkZXN0WGFjdCk7CisKKyNlbmRpZgkJCQkJCQkvKiBDU05MT0dfSCAqLwpkaWZm IC0tZ2l0IGEvc3JjL2luY2x1ZGUvYWNjZXNzL3RyYW5zYW0uaCBiL3NyYy9pbmNsdWRlL2Fj Y2Vzcy90cmFuc2FtLmgKaW5kZXggMjhhMmQyODdmZC4uYTcwNTRmZTExYyAxMDA2NDQKLS0t IGEvc3JjL2luY2x1ZGUvYWNjZXNzL3RyYW5zYW0uaAorKysgYi9zcmMvaW5jbHVkZS9hY2Nl c3MvdHJhbnNhbS5oCkBAIC0yMzgsNiArMjM4LDkgQEAgdHlwZWRlZiBzdHJ1Y3QgVHJhbnNh bVZhcmlhYmxlc0RhdGEKIAlGdWxsVHJhbnNhY3Rpb25JZCBsYXRlc3RDb21wbGV0ZWRYaWQ7 CS8qIG5ld2VzdCBmdWxsIFhJRCB0aGF0IGhhcwogCQkJCQkJCQkJCQkgKiBjb21taXR0ZWQg b3IgYWJvcnRlZCAqLwogCisJLyogRHVyaW5nIHJlY292ZXJ5LCBMU04gb2YgbGF0ZXN0IHJl cGxheWVkIGNvbW1pdCByZWNvcmQgKi8KKwlYTG9nUmVjUHRyCWxhdGVzdENvbW1pdExTTjsK KwogCS8qCiAJICogTnVtYmVyIG9mIHRvcC1sZXZlbCB0cmFuc2FjdGlvbnMgd2l0aCB4aWRz IChpLmUuIHdoaWNoIG1heSBoYXZlCiAJICogbW9kaWZpZWQgdGhlIGRhdGFiYXNlKSB0aGF0 IGNvbXBsZXRlZCBpbiBzb21lIGZvcm0gc2luY2UgdGhlIHN0YXJ0IG9mCmRpZmYgLS1naXQg YS9zcmMvaW5jbHVkZS9hY2Nlc3MvdHdvcGhhc2UuaCBiL3NyYy9pbmNsdWRlL2FjY2Vzcy90 d29waGFzZS5oCmluZGV4IGI4NWI2NWM2MDQuLjU4ZWQwZmMwMzggMTAwNjQ0Ci0tLSBhL3Ny Yy9pbmNsdWRlL2FjY2Vzcy90d29waGFzZS5oCisrKyBiL3NyYy9pbmNsdWRlL2FjY2Vzcy90 d29waGFzZS5oCkBAIC00Nyw4ICs0Nyw3IEBAIGV4dGVybiB2b2lkIFN0YXJ0UHJlcGFyZShH bG9iYWxUcmFuc2FjdGlvbiBneGFjdCk7CiBleHRlcm4gdm9pZCBFbmRQcmVwYXJlKEdsb2Jh bFRyYW5zYWN0aW9uIGd4YWN0KTsKIGV4dGVybiBib29sIFN0YW5kYnlUcmFuc2FjdGlvbklk SXNQcmVwYXJlZChUcmFuc2FjdGlvbklkIHhpZCk7CiAKLWV4dGVybiBUcmFuc2FjdGlvbklk IFByZXNjYW5QcmVwYXJlZFRyYW5zYWN0aW9ucyhUcmFuc2FjdGlvbklkICoqeGlkc19wLAot CQkJCQkJCQkJCQkJIGludCAqbnhpZHNfcCk7CitleHRlcm4gVHJhbnNhY3Rpb25JZCBQcmVz Y2FuUHJlcGFyZWRUcmFuc2FjdGlvbnModm9pZCk7CiBleHRlcm4gdm9pZCBTdGFuZGJ5UmVj b3ZlclByZXBhcmVkVHJhbnNhY3Rpb25zKHZvaWQpOwogZXh0ZXJuIHZvaWQgUmVjb3ZlclBy ZXBhcmVkVHJhbnNhY3Rpb25zKHZvaWQpOwogCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9h Y2Nlc3MveGFjdC5oIGIvc3JjL2luY2x1ZGUvYWNjZXNzL3hhY3QuaAppbmRleCBmYjY0ZDc0 MTNhLi4yNDBjYmZkNDE3IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9hY2Nlc3MveGFjdC5o CisrKyBiL3NyYy9pbmNsdWRlL2FjY2Vzcy94YWN0LmgKQEAgLTE3MSw3ICsxNzEsNyBAQCB0 eXBlZGVmIHN0cnVjdCBTYXZlZFRyYW5zYWN0aW9uQ2hhcmFjdGVyaXN0aWNzCiAjZGVmaW5l IFhMT0dfWEFDVF9BQk9SVAkJCQkweDIwCiAjZGVmaW5lIFhMT0dfWEFDVF9DT01NSVRfUFJF UEFSRUQJMHgzMAogI2RlZmluZSBYTE9HX1hBQ1RfQUJPUlRfUFJFUEFSRUQJMHg0MAotI2Rl ZmluZSBYTE9HX1hBQ1RfQVNTSUdOTUVOVAkJMHg1MAorLyogMHg1MCBpcyB1bnVzZWQsIHdh cyBYTE9HX1hBQ1RfQVNTSUdOTUVOVCAqLwogI2RlZmluZSBYTE9HX1hBQ1RfSU5WQUxJREFU SU9OUwkJMHg2MAogLyogZnJlZSBvcGNvZGUgMHg3MCAqLwogCkBAIC0yMTUsMTUgKzIxNSw2 IEBAIHR5cGVkZWYgc3RydWN0IFNhdmVkVHJhbnNhY3Rpb25DaGFyYWN0ZXJpc3RpY3MKICNk ZWZpbmUgWGFjdENvbXBsZXRpb25Gb3JjZVN5bmNDb21taXQoeGluZm8pIFwKIAkoKHhpbmZv ICYgWEFDVF9DT01QTEVUSU9OX0ZPUkNFX1NZTkNfQ09NTUlUKSAhPSAwKQogCi10eXBlZGVm IHN0cnVjdCB4bF94YWN0X2Fzc2lnbm1lbnQKLXsKLQlUcmFuc2FjdGlvbklkIHh0b3A7CQkJ LyogYXNzaWduZWQgWElEJ3MgdG9wLWxldmVsIFhJRCAqLwotCWludAkJCW5zdWJ4YWN0czsJ CS8qIG51bWJlciBvZiBzdWJ0cmFuc2FjdGlvbiBYSURzICovCi0JVHJhbnNhY3Rpb25JZCB4 c3ViW0ZMRVhJQkxFX0FSUkFZX01FTUJFUl07CS8qIGFzc2lnbmVkIHN1YnhpZHMgKi8KLX0g eGxfeGFjdF9hc3NpZ25tZW50OwotCi0jZGVmaW5lIE1pblNpemVPZlhhY3RBc3NpZ25tZW50 IG9mZnNldG9mKHhsX3hhY3RfYXNzaWdubWVudCwgeHN1YikKLQogLyoKICAqIENvbW1pdCBh bmQgYWJvcnQgcmVjb3JkcyBjYW4gY29udGFpbiBhIGxvdCBvZiBpbmZvcm1hdGlvbi4gQnV0 IGEgbGFyZ2UKICAqIHBvcnRpb24gb2YgdGhlIHJlY29yZHMgd29uJ3QgbmVlZCBhbGwgcG9z c2libGUgcGllY2VzIG9mIGluZm9ybWF0aW9uLiBTbyB3ZQpAQCAtNDQ4LDcgKzQzOSw2IEBA IGV4dGVybiBGdWxsVHJhbnNhY3Rpb25JZCBHZXRUb3BGdWxsVHJhbnNhY3Rpb25JZCh2b2lk KTsKIGV4dGVybiBGdWxsVHJhbnNhY3Rpb25JZCBHZXRUb3BGdWxsVHJhbnNhY3Rpb25JZElm QW55KHZvaWQpOwogZXh0ZXJuIEZ1bGxUcmFuc2FjdGlvbklkIEdldEN1cnJlbnRGdWxsVHJh bnNhY3Rpb25JZCh2b2lkKTsKIGV4dGVybiBGdWxsVHJhbnNhY3Rpb25JZCBHZXRDdXJyZW50 RnVsbFRyYW5zYWN0aW9uSWRJZkFueSh2b2lkKTsKLWV4dGVybiB2b2lkIE1hcmtDdXJyZW50 VHJhbnNhY3Rpb25JZExvZ2dlZElmQW55KHZvaWQpOwogZXh0ZXJuIGJvb2wgU3ViVHJhbnNh Y3Rpb25Jc0FjdGl2ZShTdWJUcmFuc2FjdGlvbklkIHN1YnhpZCk7CiBleHRlcm4gQ29tbWFu ZElkIEdldEN1cnJlbnRDb21tYW5kSWQoYm9vbCB1c2VkKTsKIGV4dGVybiB2b2lkIFNldFBh cmFsbGVsU3RhcnRUaW1lc3RhbXBzKFRpbWVzdGFtcFR6IHhhY3RfdHMsIFRpbWVzdGFtcFR6 IHN0bXRfdHMpOwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvYWNjZXNzL3hsb2d1dGlscy5o IGIvc3JjL2luY2x1ZGUvYWNjZXNzL3hsb2d1dGlscy5oCmluZGV4IDIwOTUwY2UwMzMuLjE5 Y2I1ZjMzYmQgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2FjY2Vzcy94bG9ndXRpbHMuaAor KysgYi9zcmMvaW5jbHVkZS9hY2Nlc3MveGxvZ3V0aWxzLmgKQEAgLTI3LDM3ICsyNywxMCBA QCBleHRlcm4gUEdETExJTVBPUlQgYm9vbCBpZ25vcmVfaW52YWxpZF9wYWdlczsKIGV4dGVy biBQR0RMTElNUE9SVCBib29sIEluUmVjb3Zlcnk7CiAKIC8qCi0gKiBMaWtlIEluUmVjb3Zl cnksIHN0YW5kYnlTdGF0ZSBpcyBvbmx5IHZhbGlkIGluIHRoZSBzdGFydHVwIHByb2Nlc3Mu Ci0gKiBJbiBhbGwgb3RoZXIgcHJvY2Vzc2VzIGl0IHdpbGwgaGF2ZSB0aGUgdmFsdWUgU1RB TkRCWV9ESVNBQkxFRCAoc28KLSAqIEluSG90U3RhbmRieSB3aWxsIHJlYWQgYXMgZmFsc2Up LgotICoKLSAqIEluIERJU0FCTEVEIHN0YXRlLCB3ZSdyZSBwZXJmb3JtaW5nIGNyYXNoIHJl Y292ZXJ5IG9yIGhvdCBzdGFuZGJ5IHdhcwotICogZGlzYWJsZWQgaW4gcG9zdGdyZXNxbC5j b25mLgotICoKLSAqIEluIElOSVRJQUxJWkVEIHN0YXRlLCB3ZSd2ZSBydW4gSW5pdFJlY292 ZXJ5VHJhbnNhY3Rpb25FbnZpcm9ubWVudCwgYnV0Ci0gKiB3ZSBoYXZlbid0IHlldCBwcm9j ZXNzZWQgYSBSVU5OSU5HX1hBQ1RTIG9yIHNodXRkb3duLWNoZWNrcG9pbnQgV0FMIHJlY29y ZAotICogdG8gaW5pdGlhbGl6ZSBvdXIgcHJpbWFyeS10cmFuc2FjdGlvbiB0cmFja2luZyBz eXN0ZW0uCi0gKgotICogV2hlbiB0aGUgdHJhbnNhY3Rpb24gdHJhY2tpbmcgaXMgaW5pdGlh bGl6ZWQsIHdlIGVudGVyIHRoZSBTTkFQU0hPVF9QRU5ESU5HCi0gKiBzdGF0ZS4gVGhlIHRy YWNrZWQgaW5mb3JtYXRpb24gbWlnaHQgc3RpbGwgYmUgaW5jb21wbGV0ZSwgc28gd2UgY2Fu J3QgYWxsb3cKLSAqIGNvbm5lY3Rpb25zIHlldCwgYnV0IHJlZG8gZnVuY3Rpb25zIG11c3Qg dXBkYXRlIHRoZSBpbi1tZW1vcnkgc3RhdGUgd2hlbgotICogYXBwcm9wcmlhdGUuCi0gKgot ICogSW4gU05BUFNIT1RfUkVBRFkgbW9kZSwgd2UgaGF2ZSBmdWxsIGtub3dsZWRnZSBvZiB0 cmFuc2FjdGlvbnMgdGhhdCBhcmUKLSAqIChvciB3ZXJlKSBydW5uaW5nIG9uIHRoZSBwcmlt YXJ5IGF0IHRoZSBjdXJyZW50IFdBTCBsb2NhdGlvbi4gU25hcHNob3RzCi0gKiBjYW4gYmUg dGFrZW4sIGFuZCByZWFkLW9ubHkgcXVlcmllcyBjYW4gYmUgcnVuLgorICogTGlrZSBJblJl Y292ZXJ5LCBJbkhvdFN0YW5kYnkgaXMgb25seSB2YWxpZCBpbiB0aGUgc3RhcnR1cCBwcm9j ZXNzLgorICogSW4gYWxsIG90aGVyIHByb2Nlc3NlcyBpdCB3aWxsIGJlIGZhbHNlLgogICov Ci10eXBlZGVmIGVudW0KLXsKLQlTVEFOREJZX0RJU0FCTEVELAotCVNUQU5EQllfSU5JVElB TElaRUQsCi0JU1RBTkRCWV9TTkFQU0hPVF9QRU5ESU5HLAotCVNUQU5EQllfU05BUFNIT1Rf UkVBRFksCi19IEhvdFN0YW5kYnlTdGF0ZTsKLQotZXh0ZXJuIFBHRExMSU1QT1JUIEhvdFN0 YW5kYnlTdGF0ZSBzdGFuZGJ5U3RhdGU7Ci0KLSNkZWZpbmUgSW5Ib3RTdGFuZGJ5IChzdGFu ZGJ5U3RhdGUgPj0gU1RBTkRCWV9TTkFQU0hPVF9QRU5ESU5HKQorZXh0ZXJuIFBHRExMSU1Q T1JUIGJvb2wgSW5Ib3RTdGFuZGJ5OwogCiAKIGV4dGVybiBib29sIFhMb2dIYXZlSW52YWxp ZFBhZ2VzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9sd2xvY2su aCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2UvbHdsb2NrLmgKaW5kZXggZDcwZTZkMzdlMC4uYzIx NTZhY2ExMiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9sd2xvY2suaAorKysg Yi9zcmMvaW5jbHVkZS9zdG9yYWdlL2x3bG9jay5oCkBAIC0xNzksNiArMTc5LDcgQEAgdHlw ZWRlZiBlbnVtIEJ1aWx0aW5UcmFuY2hlSWRzCiAJTFdUUkFOQ0hFX1hBQ1RfQlVGRkVSID0g TlVNX0lORElWSURVQUxfTFdMT0NLUywKIAlMV1RSQU5DSEVfQ09NTUlUVFNfQlVGRkVSLAog CUxXVFJBTkNIRV9TVUJUUkFOU19CVUZGRVIsCisJTFdUUkFOQ0hFX0NTTl9MT0dfQlVGRkVS LAogCUxXVFJBTkNIRV9NVUxUSVhBQ1RPRkZTRVRfQlVGRkVSLAogCUxXVFJBTkNIRV9NVUxU SVhBQ1RNRU1CRVJfQlVGRkVSLAogCUxXVFJBTkNIRV9OT1RJRllfQlVGRkVSLApAQCAtMjE1 LDYgKzIxNiw3IEBAIHR5cGVkZWYgZW51bSBCdWlsdGluVHJhbmNoZUlkcwogCUxXVFJBTkNI RV9TVUJUUkFOU19TTFJVLAogCUxXVFJBTkNIRV9YQUNUX1NMUlUsCiAJTFdUUkFOQ0hFX1BB UkFMTEVMX1ZBQ1VVTV9EU0EsCisJTFdUUkFOQ0hFX0NTTl9MT0dfU0xSVSwKIAlMV1RSQU5D SEVfRklSU1RfVVNFUl9ERUZJTkVELAogfQkJCUJ1aWx0aW5UcmFuY2hlSWRzOwogCmRpZmYg LS1naXQgYS9zcmMvaW5jbHVkZS9zdG9yYWdlL3Byb2NhcnJheS5oIGIvc3JjL2luY2x1ZGUv c3RvcmFnZS9wcm9jYXJyYXkuaAppbmRleCA1NmFmMGI0MGIzLi5kZTc0ZmNlMjRlIDEwMDY0 NAotLS0gYS9zcmMvaW5jbHVkZS9zdG9yYWdlL3Byb2NhcnJheS5oCisrKyBiL3NyYy9pbmNs dWRlL3N0b3JhZ2UvcHJvY2FycmF5LmgKQEAgLTI4LDE4ICsyOCwxMSBAQCBleHRlcm4gdm9p ZCBQcm9jQXJyYXlSZW1vdmUoUEdQUk9DICpwcm9jLCBUcmFuc2FjdGlvbklkIGxhdGVzdFhp ZCk7CiBleHRlcm4gdm9pZCBQcm9jQXJyYXlFbmRUcmFuc2FjdGlvbihQR1BST0MgKnByb2Ms IFRyYW5zYWN0aW9uSWQgbGF0ZXN0WGlkKTsKIGV4dGVybiB2b2lkIFByb2NBcnJheUNsZWFy VHJhbnNhY3Rpb24oUEdQUk9DICpwcm9jKTsKIAorZXh0ZXJuIHZvaWQgUHJvY0FycmF5VXBk YXRlT2xkZXN0UnVubmluZ1hpZChUcmFuc2FjdGlvbklkIG9sZGVzdFJ1bm5pbmdYSUQpOwog ZXh0ZXJuIHZvaWQgUHJvY0FycmF5SW5pdFJlY292ZXJ5KFRyYW5zYWN0aW9uSWQgaW5pdGlh bGl6ZWRVcHRvWElEKTsKLWV4dGVybiB2b2lkIFByb2NBcnJheUFwcGx5UmVjb3ZlcnlJbmZv KFJ1bm5pbmdUcmFuc2FjdGlvbnMgcnVubmluZyk7Ci1leHRlcm4gdm9pZCBQcm9jQXJyYXlB cHBseVhpZEFzc2lnbm1lbnQoVHJhbnNhY3Rpb25JZCB0b3B4aWQsCi0JCQkJCQkJCQkJaW50 IG5zdWJ4aWRzLCBUcmFuc2FjdGlvbklkICpzdWJ4aWRzKTsKIAogZXh0ZXJuIHZvaWQgUmVj b3JkS25vd25Bc3NpZ25lZFRyYW5zYWN0aW9uSWRzKFRyYW5zYWN0aW9uSWQgeGlkKTsKLWV4 dGVybiB2b2lkIEV4cGlyZVRyZWVLbm93bkFzc2lnbmVkVHJhbnNhY3Rpb25JZHMoVHJhbnNh Y3Rpb25JZCB4aWQsCi0JCQkJCQkJCQkJCQkgIGludCBuc3VieGlkcywgVHJhbnNhY3Rpb25J ZCAqc3VieGlkcywKLQkJCQkJCQkJCQkJCSAgVHJhbnNhY3Rpb25JZCBtYXhfeGlkKTsKLWV4 dGVybiB2b2lkIEV4cGlyZUFsbEtub3duQXNzaWduZWRUcmFuc2FjdGlvbklkcyh2b2lkKTsK LWV4dGVybiB2b2lkIEV4cGlyZU9sZEtub3duQXNzaWduZWRUcmFuc2FjdGlvbklkcyhUcmFu c2FjdGlvbklkIHhpZCk7Ci1leHRlcm4gdm9pZCBLbm93bkFzc2lnbmVkVHJhbnNhY3Rpb25J ZHNJZGxlTWFpbnRlbmFuY2Uodm9pZCk7CitleHRlcm4gdm9pZCBQcm9jQXJyYXlSZWNvdmVy eUVuZFRyYW5zYWN0aW9uKFRyYW5zYWN0aW9uSWQgbWF4X3hpZCwgWExvZ1JlY1B0ciBsc24p OwogCiBleHRlcm4gaW50CUdldE1heFNuYXBzaG90WGlkQ291bnQodm9pZCk7CiBleHRlcm4g aW50CUdldE1heFNuYXBzaG90U3VieGlkQ291bnQodm9pZCk7CkBAIC01Niw3ICs0OSw3IEBA IGV4dGVybiBib29sIFRyYW5zYWN0aW9uSWRJc0luUHJvZ3Jlc3MoVHJhbnNhY3Rpb25JZCB4 aWQpOwogZXh0ZXJuIGJvb2wgVHJhbnNhY3Rpb25JZElzQWN0aXZlKFRyYW5zYWN0aW9uSWQg eGlkKTsKIGV4dGVybiBUcmFuc2FjdGlvbklkIEdldE9sZGVzdE5vblJlbW92YWJsZVRyYW5z YWN0aW9uSWQoUmVsYXRpb24gcmVsKTsKIGV4dGVybiBUcmFuc2FjdGlvbklkIEdldE9sZGVz dFRyYW5zYWN0aW9uSWRDb25zaWRlcmVkUnVubmluZyh2b2lkKTsKLWV4dGVybiBUcmFuc2Fj dGlvbklkIEdldE9sZGVzdEFjdGl2ZVRyYW5zYWN0aW9uSWQodm9pZCk7CitleHRlcm4gVHJh bnNhY3Rpb25JZCBHZXRPbGRlc3RBY3RpdmVUcmFuc2FjdGlvbklkKGJvb2wgYWxsRGJzKTsK IGV4dGVybiBUcmFuc2FjdGlvbklkIEdldE9sZGVzdFNhZmVEZWNvZGluZ1RyYW5zYWN0aW9u SWQoYm9vbCBjYXRhbG9nT25seSk7CiBleHRlcm4gdm9pZCBHZXRSZXBsaWNhdGlvbkhvcml6 b25zKFRyYW5zYWN0aW9uSWQgKnhtaW4sIFRyYW5zYWN0aW9uSWQgKmNhdGFsb2dfeG1pbik7 CiAKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3V0aWxzL3NuYXBzaG90LmggYi9zcmMvaW5j bHVkZS91dGlscy9zbmFwc2hvdC5oCmluZGV4IDhkMWUzMWU4ODguLjFmZGE1YjA2ZjYgMTAw NjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3V0aWxzL3NuYXBzaG90LmgKKysrIGIvc3JjL2luY2x1 ZGUvdXRpbHMvc25hcHNob3QuaApAQCAtMTgxLDYgKzE4MSwxMyBAQCB0eXBlZGVmIHN0cnVj dCBTbmFwc2hvdERhdGEKIAlpbnQzMgkJc3VieGNudDsJCS8qICMgb2YgeGFjdCBpZHMgaW4g c3VieGlwW10gKi8KIAlib29sCQlzdWJvdmVyZmxvd2VkOwkvKiBoYXMgdGhlIHN1YnhpcCBh cnJheSBvdmVyZmxvd2VkPyAqLwogCisJLyoKKwkgKiBNVkNDIHNuYXBzaG90cyB0YWtlbiBk dXJpbmcgcmVjb3ZlcnkgdXNlIHRoaXMgQ1NOIGluc3RlYWQgb2YgdGhlIHhpcAorCSAqIGFu ZCBzdWJ4aXAgYXJyYXlzLiBBbnkgdHJhbnNhY3Rpb25zIHRoYXQgY29tbWl0dGVkIGF0IG9y IGJlZm9yZSB0aGlzCisJICogTFNOIGFyZSBjb25zaWRlcmVkIGFzIHZpc2libGUuCisJICov CisJWExvZ1JlY1B0cglzbmFwc2hvdENzbjsKKwogCWJvb2wJCXRha2VuRHVyaW5nUmVjb3Zl cnk7CS8qIHJlY292ZXJ5LXNoYXBlZCBzbmFwc2hvdD8gKi8KIAlib29sCQljb3BpZWQ7CQkJ LyogZmFsc2UgaWYgaXQncyBhIHN0YXRpYyBzbmFwc2hvdCAqLwogCi0tIAoyLjM5LjUKCg== --------------6V2bsblsMdY4BnmlS1v5weLR Content-Type: text/x-patch; charset=UTF-8; name="v5-0003-Make-SnapBuildWaitSnapshot-work-without-xl_runnin.patch" Content-Disposition: attachment; filename*0="v5-0003-Make-SnapBuildWaitSnapshot-work-without-xl_runnin.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSAwZGUzMmNkYjg3Yzg0NDQwNTE2ZTRkNmVlMWFjMmQ1NWUyZjJjM2QyIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBIZWlra2kgTGlubmFrYW5nYXMgPGhlaWtraS5saW5u YWthbmdhc0Bpa2kuZmk+CkRhdGU6IFR1ZSwgMTMgQXVnIDIwMjQgMjA6MDE6MDcgKzAzMDAK U3ViamVjdDogW1BBVENIIHY1IDMvNV0gTWFrZSBTbmFwQnVpbGRXYWl0U25hcHNob3Qgd29y ayB3aXRob3V0CiB4bF9ydW5uaW5nX3hhY3RzLnhpZHMgYXJyYXkKClNuYXBCdWlsZFdhaXRT bmFwc2hvdCBsb29wZWQgdGhyb3VnaCBhbGwgdGhlIFhJRHMgaW4gdGhlCnhsX3J1bm5pbmdf eGFjdHMsIHdhaXRpbmcgZm9yIHRoZW0gdG8gZmluaXNoLiBDaGFuZ2UgaXQgdG8gZ3JhYiB0 aGUKbGlzdCBvZiBydW5uaW5nIFhJRHMgZnJvbSB0aGUgcHJvYyBhcnJheSBpbnN0ZWFkLiBU aGlzIHJlbW92ZXMgdGhlCmxhc3QgdXNhZ2Ugb2YgdGhlIFhJRHMgYXJyYXkgaW4gdGhlIHhs X3J1bm5pbmdfeGFjdHMgcmVjb3JkLCBhbGxvd2luZwppdCB0byBiZSByZW1vdmVkIGluIHRo ZSBuZXh0IGNvbW1pdC4KCldoZW4gU25hcEJ1aWxkV2FpdFNuYXBzaG90KCkgaXMgY2FsbGVk IHdpdGggcnVubmluZy0+bmV4dFhpZCBhcyB0aGUKJ2N1dG9mZicgcG9pbnQsIHRoZSBuZXcg Y29kZSBzaG91bGQgd2FpdCBmb3IgZXhhY3RseSB0aGUgc2FtZSBzZXQgb2YKdHJhbnNhY3Rp b25zIGFzIGJlZm9yZS4gQnV0IHdoZW4gY2FsbGVkIHdpdGggaW5pdGlhbF94bWluX2hvcml6 b24gYXMKdGhlICdjdXRvZmYnLCB0aGlzIG1pZ2h0IHdhaXQgZm9yIG1vcmUgdHJhbnNhY3Rp b25zIHRoYW4gYmVmb3JlOiB0aG9zZQpiZXR3ZWVuIHJ1bm5pbmctPm5leHRYaWQgYW5kIGlu aXRpYWxfeG1pbl9ob3Jpem9uLiBGb3IgZXhhbXBsZSwKaW1hZ2luZSB0aGF0IHdlIHNlZSBh IHJ1bm5pbmcteGFjdHMgcmVjb3JkIHdpdGggbmV4dFhpZCAxMDAsIGFuZAppbml0aWFsX3ht aW5faG9yaXpvbiBpcyAyMDAuIEJlZm9yZSwgd2Ugd291bGQgd2FpdCBmb3IgYWxsIFhJRHMg PCAxMDAKdG8gY29tcGxldGUsIGFuZCB0aGVuIGxvZyB0aGUgc3RhbmRieSBzbmFwc2hvdCBh bmQgcHJvY2VlZCwgYnV0IG5vdyB3ZQp3aWxsIHdhaXQgZm9yIGFsbCBYSURzIDwgMjAwLiBJ IGJlbGlldmUgdGhhdCdzIGEgZ29vZCB0aGluZywgYmVjYXVzZQp3ZSB3b24ndCBhY3R1YWxs eSBiZSBhYmxlIHRvIG1vdmUgdG8gdGhlIG5leHQgc3RhdGUgaW4gdGhlIHNuYXBzaG90CmJ1 aWxkaW5nIHVudGlsIGFsbCB0cmFuc2FjdGlvbnMgPCAyMDAgaGF2ZSBjb21wbGV0ZWQuIFRo ZQpydW5uaW5nLXhhY3RzIHNuYXBzaG90IHRoYXQgd2UgbG9nZ2VkIGFmdGVyIHdhaXRpbmcg dXAgdG8gWElEIDEwMAp3b3VsZCBub3QgYmUgdXNlZnVsIHRvIHVzIGVpdGhlciwgaWYgdGhl cmUgYXJlIHN0aWxsIFhJRHMgYmV0d2VlbiAxMDAKYW5kIDIwMCBydW5uaW5nLgoKU25hcEJ1 aWxkV2FpdFNuYXBzaG90KCkgdXNlZCB0byBkbyB1c2VsZXNzIHdvcmsgd2hlbiBjYWxsZWQg aW4gYQpzdGFuZGJ5LCBiZWNhdXNlIGluIGEgc3RhbmRieSwgdGhlcmUgYXJlIG5vIFhJRCBs b2NrcyBhbmQgdGhlClhhY3RMb2NrVGFibGVXYWl0KCkgY2FsbHMgcmV0dXJuZWQgaW1tZWRp YXRlbHksIGV2ZW4gaWYgdGhlIFhJRHMgd2VyZQppbiBmYWN0IHN0aWxsIHJ1bm5pbmcgaW4g dGhlIHByaW1hcnkuIEJ1dCBhcyB0aGUgY29tbWVudCBzYXlzLCB0aGUKd2FpdGluZyBpc24n dCBuZWNlc3NhcnkgZm9yIGNvcnJlY3RuZXNzLCBzbyB0aGF0IHdhcyBoYXJtbGVzcy4gSW4g YW55CmNhc2UsIHN0b3AgZG9pbmcgdGhlIGZ1dGlsZSB3b3JrIG9uIGEgc3RhbmRieS4KLS0t CiBzcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9sb2dpY2FsL3NuYXBidWlsZC5jIHwgNTAgKysr KysrKysrKysrKystLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgMzQgaW5zZXJ0aW9ucygrKSwg MTYgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvcmVwbGljYXRpb24v bG9naWNhbC9zbmFwYnVpbGQuYyBiL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2xvZ2ljYWwv c25hcGJ1aWxkLmMKaW5kZXggNzM0ODY1Y2U2Mi4uMzFkYTA4MzJjYyAxMDA2NDQKLS0tIGEv c3JjL2JhY2tlbmQvcmVwbGljYXRpb24vbG9naWNhbC9zbmFwYnVpbGQuYworKysgYi9zcmMv YmFja2VuZC9yZXBsaWNhdGlvbi9sb2dpY2FsL3NuYXBidWlsZC5jCkBAIC0xNjgsNyArMTY4 LDcgQEAgc3RhdGljIGlubGluZSBib29sIFNuYXBCdWlsZFhpZEhhc0NhdGFsb2dDaGFuZ2Vz KFNuYXBCdWlsZCAqYnVpbGRlciwgVHJhbnNhY3Rpb24KIAogLyogeGxvZyByZWFkaW5nIGhl bHBlciBmdW5jdGlvbnMgZm9yIFNuYXBCdWlsZFByb2Nlc3NSdW5uaW5nWGFjdHMgKi8KIHN0 YXRpYyBib29sIFNuYXBCdWlsZEZpbmRTbmFwc2hvdChTbmFwQnVpbGQgKmJ1aWxkZXIsIFhM b2dSZWNQdHIgbHNuLCB4bF9ydW5uaW5nX3hhY3RzICpydW5uaW5nKTsKLXN0YXRpYyB2b2lk IFNuYXBCdWlsZFdhaXRTbmFwc2hvdCh4bF9ydW5uaW5nX3hhY3RzICpydW5uaW5nLCBUcmFu c2FjdGlvbklkIGN1dG9mZik7CitzdGF0aWMgdm9pZCBTbmFwQnVpbGRXYWl0U25hcHNob3Qo VHJhbnNhY3Rpb25JZCBjdXRvZmYpOwogCiAvKiBzZXJpYWxpemF0aW9uIGZ1bmN0aW9ucyAq Lwogc3RhdGljIHZvaWQgU25hcEJ1aWxkU2VyaWFsaXplKFNuYXBCdWlsZCAqYnVpbGRlciwg WExvZ1JlY1B0ciBsc24pOwpAQCAtMTIyMiwxNCArMTIyMiwxNyBAQCBTbmFwQnVpbGRGaW5k U25hcHNob3QoU25hcEJ1aWxkICpidWlsZGVyLCBYTG9nUmVjUHRyIGxzbiwgeGxfcnVubmlu Z194YWN0cyAqcnVubgogCQlOb3JtYWxUcmFuc2FjdGlvbklkUHJlY2VkZXMocnVubmluZy0+ b2xkZXN0UnVubmluZ1hpZCwKIAkJCQkJCQkJCWJ1aWxkZXItPmluaXRpYWxfeG1pbl9ob3Jp em9uKSkKIAl7CisJCVRyYW5zYWN0aW9uSWQgY3V0b2ZmOworCiAJCWVyZXBvcnQoREVCVUcx LAogCQkJCShlcnJtc2dfaW50ZXJuYWwoInNraXBwaW5nIHNuYXBzaG90IGF0ICVYLyVYIHdo aWxlIGJ1aWxkaW5nIGxvZ2ljYWwgZGVjb2Rpbmcgc25hcHNob3QsIHhtaW4gaG9yaXpvbiB0 b28gbG93IiwKIAkJCQkJCQkJIExTTl9GT1JNQVRfQVJHUyhsc24pKSwKIAkJCQkgZXJyZGV0 YWlsX2ludGVybmFsKCJpbml0aWFsIHhtaW4gaG9yaXpvbiBvZiAldSB2cyB0aGUgc25hcHNo b3QncyAldSIsCiAJCQkJCQkJCQlidWlsZGVyLT5pbml0aWFsX3htaW5faG9yaXpvbiwgcnVu bmluZy0+b2xkZXN0UnVubmluZ1hpZCkpKTsKIAotCi0JCVNuYXBCdWlsZFdhaXRTbmFwc2hv dChydW5uaW5nLCBidWlsZGVyLT5pbml0aWFsX3htaW5faG9yaXpvbik7CisJCWN1dG9mZiA9 IGJ1aWxkZXItPmluaXRpYWxfeG1pbl9ob3Jpem9uOworCQlUcmFuc2FjdGlvbklkUmV0cmVh dChjdXRvZmYpOworCQlTbmFwQnVpbGRXYWl0U25hcHNob3QoY3V0b2ZmKTsKIAogCQlyZXR1 cm4gdHJ1ZTsKIAl9CkBAIC0xMzE2LDcgKzEzMTksNyBAQCBTbmFwQnVpbGRGaW5kU25hcHNo b3QoU25hcEJ1aWxkICpidWlsZGVyLCBYTG9nUmVjUHRyIGxzbiwgeGxfcnVubmluZ194YWN0 cyAqcnVubgogCQkJCSBlcnJkZXRhaWwoIldhaXRpbmcgZm9yIHRyYW5zYWN0aW9ucyAoYXBw cm94aW1hdGVseSAlZCkgb2xkZXIgdGhhbiAldSB0byBlbmQuIiwKIAkJCQkJCSAgIHJ1bm5p bmctPnhjbnQsIHJ1bm5pbmctPm5leHRYaWQpKSk7CiAKLQkJU25hcEJ1aWxkV2FpdFNuYXBz aG90KHJ1bm5pbmcsIHJ1bm5pbmctPm5leHRYaWQpOworCQlTbmFwQnVpbGRXYWl0U25hcHNo b3QocnVubmluZy0+bmV4dFhpZCk7CiAJfQogCiAJLyoKQEAgLTEzNDAsNyArMTM0Myw3IEBA IFNuYXBCdWlsZEZpbmRTbmFwc2hvdChTbmFwQnVpbGQgKmJ1aWxkZXIsIFhMb2dSZWNQdHIg bHNuLCB4bF9ydW5uaW5nX3hhY3RzICpydW5uCiAJCQkJIGVycmRldGFpbCgiV2FpdGluZyBm b3IgdHJhbnNhY3Rpb25zIChhcHByb3hpbWF0ZWx5ICVkKSBvbGRlciB0aGFuICV1IHRvIGVu ZC4iLAogCQkJCQkJICAgcnVubmluZy0+eGNudCwgcnVubmluZy0+bmV4dFhpZCkpKTsKIAot CQlTbmFwQnVpbGRXYWl0U25hcHNob3QocnVubmluZywgcnVubmluZy0+bmV4dFhpZCk7CisJ CVNuYXBCdWlsZFdhaXRTbmFwc2hvdChydW5uaW5nLT5uZXh0WGlkKTsKIAl9CiAKIAkvKgpA QCAtMTM3Myw4ICsxMzc2LDggQEAgU25hcEJ1aWxkRmluZFNuYXBzaG90KFNuYXBCdWlsZCAq YnVpbGRlciwgWExvZ1JlY1B0ciBsc24sIHhsX3J1bm5pbmdfeGFjdHMgKnJ1bm4KIH0KIAog LyogLS0tCi0gKiBJdGVyYXRlIHRocm91Z2ggeGlkcyBpbiByZWNvcmQsIHdhaXQgZm9yIGFs bCBvbGRlciB0aGFuIHRoZSBjdXRvZmYgdG8KLSAqIGZpbmlzaC4gIFRoZW4sIGlmIHBvc3Np YmxlLCBsb2cgYSBuZXcgeGxfcnVubmluZ194YWN0cyByZWNvcmQuCisgKiBXYWl0IGZvciBh bGwgdHJhbnNhY3Rpb25zIG9sZGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGN1dG9mZiB0byBm aW5pc2guCisgKiBUaGVuLCBpZiBwb3NzaWJsZSwgbG9nIGEgbmV3IHhsX3J1bm5pbmdfeGFj dHMgcmVjb3JkLgogICoKICAqIFRoaXMgaXNuJ3QgcmVxdWlyZWQgZm9yIHRoZSBjb3JyZWN0 bmVzcyBvZiBkZWNvZGluZywgYnV0IHRvOgogICogYSkgYWxsb3cgaXNvbGF0aW9udGVzdGVy IHRvIG5vdGljZSB0aGF0IHdlJ3JlIGN1cnJlbnRseSB3YWl0aW5nIGZvcgpAQCAtMTM4NCwx MyArMTM4NywzMSBAQCBTbmFwQnVpbGRGaW5kU25hcHNob3QoU25hcEJ1aWxkICpidWlsZGVy LCBYTG9nUmVjUHRyIGxzbiwgeGxfcnVubmluZ194YWN0cyAqcnVubgogICogLS0tCiAgKi8K IHN0YXRpYyB2b2lkCi1TbmFwQnVpbGRXYWl0U25hcHNob3QoeGxfcnVubmluZ194YWN0cyAq cnVubmluZywgVHJhbnNhY3Rpb25JZCBjdXRvZmYpCitTbmFwQnVpbGRXYWl0U25hcHNob3Qo VHJhbnNhY3Rpb25JZCBjdXRvZmYpCiB7Ci0JaW50CQkJb2ZmOworCVJ1bm5pbmdUcmFuc2Fj dGlvbnMgcnVubmluZzsKKworCWlmIChSZWNvdmVyeUluUHJvZ3Jlc3MoKSkKKwl7CisJCS8q CisJCSAqIER1cmluZyByZWNvdmVyeSwgd2UgaGF2ZSBubyBtZWNoYW5pc20gZm9yIHdhaXRp bmcgZm9yIGFuIFhJRCB0bworCQkgKiBmaW5pc2gsIGFuZCB3ZSBjYW5ub3QgY3JlYXRlIG5l dyBydW5uaW5nLXhhY3RzIHJlY29yZHMgZWl0aGVyLgorCQkgKi8KKwkJcmV0dXJuOworCX0K KworCXJ1bm5pbmcgPSBHZXRSdW5uaW5nVHJhbnNhY3Rpb25EYXRhKCk7CisKKwkvKgorCSAq IEdldFJ1bm5pbmdUcmFuc2FjdGlvbkRhdGEgcmV0dXJucyB3aXRoIFhpZEdlbkxvY2sgYW5k IFByb2NBcnJheUxvY2sKKwkgKiBoZWxkLCBidXQgd2UgZG9uJ3QgbmVlZCB0aGVtLgorCSAq LworCUxXTG9ja1JlbGVhc2UoWGlkR2VuTG9jayk7CisJTFdMb2NrUmVsZWFzZShQcm9jQXJy YXlMb2NrKTsKIAotCWZvciAob2ZmID0gMDsgb2ZmIDwgcnVubmluZy0+eGNudDsgb2ZmKysp CisJZm9yIChpbnQgaSA9IDA7IGkgPCBydW5uaW5nLT54Y250OyBpKyspCiAJewotCQlUcmFu c2FjdGlvbklkIHhpZCA9IHJ1bm5pbmctPnhpZHNbb2ZmXTsKKwkJVHJhbnNhY3Rpb25JZCB4 aWQgPSBydW5uaW5nLT54aWRzW2ldOwogCiAJCS8qCiAJCSAqIFVwcGVyIGxheWVycyBzaG91 bGQgcHJldmVudCB0aGF0IHdlIGV2ZXIgbmVlZCB0byB3YWl0IG9uIG91cnNlbHZlcy4KQEAg LTE0MDAsNyArMTQyMSw3IEBAIFNuYXBCdWlsZFdhaXRTbmFwc2hvdCh4bF9ydW5uaW5nX3hh Y3RzICpydW5uaW5nLCBUcmFuc2FjdGlvbklkIGN1dG9mZikKIAkJaWYgKFRyYW5zYWN0aW9u SWRJc0N1cnJlbnRUcmFuc2FjdGlvbklkKHhpZCkpCiAJCQllbG9nKEVSUk9SLCAid2FpdGlu ZyBmb3Igb3Vyc2VsdmVzIik7CiAKLQkJaWYgKFRyYW5zYWN0aW9uSWRGb2xsb3dzKHhpZCwg Y3V0b2ZmKSkKKwkJaWYgKFRyYW5zYWN0aW9uSWRGb2xsb3dzT3JFcXVhbHMoeGlkLCBjdXRv ZmYpKQogCQkJY29udGludWU7CiAKIAkJWGFjdExvY2tUYWJsZVdhaXQoeGlkLCBOVUxMLCBO VUxMLCBYTFRXX05vbmUpOwpAQCAtMTQxMiwxMCArMTQzMyw3IEBAIFNuYXBCdWlsZFdhaXRT bmFwc2hvdCh4bF9ydW5uaW5nX3hhY3RzICpydW5uaW5nLCBUcmFuc2FjdGlvbklkIGN1dG9m ZikKIAkgKiB3YWl0IGZvciBiZ3dyaXRlciBvciBjaGVja3BvaW50ZXIgdG8gbG9nIG9uZS4g IER1cmluZyByZWNvdmVyeSB3ZSBjYW4ndAogCSAqIGVuZm9yY2UgdGhhdCwgc28gd2UnbGwg aGF2ZSB0byB3YWl0LgogCSAqLwotCWlmICghUmVjb3ZlcnlJblByb2dyZXNzKCkpCi0Jewot CQlMb2dTdGFuZGJ5U25hcHNob3QoKTsKLQl9CisJTG9nU3RhbmRieVNuYXBzaG90KCk7CiB9 CiAKICNkZWZpbmUgU25hcEJ1aWxkT25EaXNrQ29uc3RhbnRTaXplIFwKLS0gCjIuMzkuNQoK --------------6V2bsblsMdY4BnmlS1v5weLR Content-Type: text/x-patch; charset=UTF-8; name="v5-0004-Remove-the-now-unused-xids-array-from-xl_running_.patch" Content-Disposition: attachment; filename*0="v5-0004-Remove-the-now-unused-xids-array-from-xl_running_.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSAyYjg2NzJlMDIwYjllMTcwMWZmMmExNmQxODMxM2FkOGQzN2NiNzllIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBIZWlra2kgTGlubmFrYW5nYXMgPGhlaWtraS5saW5u YWthbmdhc0Bpa2kuZmk+CkRhdGU6IFR1ZSwgMTMgQXVnIDIwMjQgMTY6NDA6NTcgKzAzMDAK U3ViamVjdDogW1BBVENIIHY1IDQvNV0gUmVtb3ZlIHRoZSBub3ctdW51c2VkIHhpZHMgYXJy YXkgZnJvbSB4bF9ydW5uaW5nX3hhY3RzCgpXZSBzdGlsbCBnZW5lcmF0ZSBydW5uaW5nLXhh Y3RzIHJlY29yZHMsIGJlY2F1c2UgdGhleSBhcmUgc3RpbGwgbmVlZGVkCnRvIGluaXRpYWxp emUgdGhlIHNuYXBzaG90IGluIGxvZ2ljYWwgZGVjb2RpbmcuCi0tLQogc3JjL2JhY2tlbmQv YWNjZXNzL3JtZ3JkZXNjL3N0YW5kYnlkZXNjLmMgICB8IDE4IC0tLS0tLS0tLS0tLQogc3Jj L2JhY2tlbmQvcmVwbGljYXRpb24vbG9naWNhbC9zbmFwYnVpbGQuYyB8ICA4ICsrKy0tLQog c3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvc3RhbmRieS5jICAgICAgICAgICB8IDMyICsrKysr LS0tLS0tLS0tLS0tLS0tLQogc3JjL2luY2x1ZGUvc3RvcmFnZS9zdGFuZGJ5LmggICAgICAg ICAgICAgICB8ICAyIC0tCiBzcmMvaW5jbHVkZS9zdG9yYWdlL3N0YW5kYnlkZWZzLmggICAg ICAgICAgIHwgMTYgKysrKysrKy0tLS0KIDUgZmlsZXMgY2hhbmdlZCwgMjEgaW5zZXJ0aW9u cygrKSwgNTUgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNz L3JtZ3JkZXNjL3N0YW5kYnlkZXNjLmMgYi9zcmMvYmFja2VuZC9hY2Nlc3Mvcm1ncmRlc2Mv c3RhbmRieWRlc2MuYwppbmRleCAzMmU1MDlhNDAwLi45OWYwOGJlYjRhIDEwMDY0NAotLS0g YS9zcmMvYmFja2VuZC9hY2Nlc3Mvcm1ncmRlc2Mvc3RhbmRieWRlc2MuYworKysgYi9zcmMv YmFja2VuZC9hY2Nlc3Mvcm1ncmRlc2Mvc3RhbmRieWRlc2MuYwpAQCAtMTksMjggKzE5LDEw IEBACiBzdGF0aWMgdm9pZAogc3RhbmRieV9kZXNjX3J1bm5pbmdfeGFjdHMoU3RyaW5nSW5m byBidWYsIHhsX3J1bm5pbmdfeGFjdHMgKnhscmVjKQogewotCWludAkJCWk7Ci0KIAlhcHBl bmRTdHJpbmdJbmZvKGJ1ZiwgIm5leHRYaWQgJXUgbGF0ZXN0Q29tcGxldGVkWGlkICV1IG9s ZGVzdFJ1bm5pbmdYaWQgJXUiLAogCQkJCQkgeGxyZWMtPm5leHRYaWQsCiAJCQkJCSB4bHJl Yy0+bGF0ZXN0Q29tcGxldGVkWGlkLAogCQkJCQkgeGxyZWMtPm9sZGVzdFJ1bm5pbmdYaWQp OwotCWlmICh4bHJlYy0+eGNudCA+IDApCi0JewotCQlhcHBlbmRTdHJpbmdJbmZvKGJ1Ziwg IjsgJWQgeGFjdHM6IiwgeGxyZWMtPnhjbnQpOwotCQlmb3IgKGkgPSAwOyBpIDwgeGxyZWMt PnhjbnQ7IGkrKykKLQkJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiICV1IiwgeGxyZWMtPnhp ZHNbaV0pOwotCX0KLQotCWlmICh4bHJlYy0+c3VieGlkX292ZXJmbG93KQotCQlhcHBlbmRT dHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIjsgc3VieGlkIG92ZXJmbG93ZWQiKTsKLQotCWlmICh4 bHJlYy0+c3VieGNudCA+IDApCi0JewotCQlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIjsgJWQg c3VieGFjdHM6IiwgeGxyZWMtPnN1YnhjbnQpOwotCQlmb3IgKGkgPSAwOyBpIDwgeGxyZWMt PnN1YnhjbnQ7IGkrKykKLQkJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiICV1IiwgeGxyZWMt PnhpZHNbeGxyZWMtPnhjbnQgKyBpXSk7Ci0JfQogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC9yZXBsaWNhdGlvbi9sb2dpY2FsL3NuYXBidWlsZC5jIGIvc3JjL2JhY2tl bmQvcmVwbGljYXRpb24vbG9naWNhbC9zbmFwYnVpbGQuYwppbmRleCAzMWRhMDgzMmNjLi5j YWMzZmZlNTc3IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9sb2dpY2Fs L3NuYXBidWlsZC5jCisrKyBiL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2xvZ2ljYWwvc25h cGJ1aWxkLmMKQEAgLTEzMTYsOCArMTMxNiw4IEBAIFNuYXBCdWlsZEZpbmRTbmFwc2hvdChT bmFwQnVpbGQgKmJ1aWxkZXIsIFhMb2dSZWNQdHIgbHNuLCB4bF9ydW5uaW5nX3hhY3RzICpy dW5uCiAJCWVyZXBvcnQoTE9HLAogCQkJCShlcnJtc2coImxvZ2ljYWwgZGVjb2RpbmcgZm91 bmQgaW5pdGlhbCBzdGFydGluZyBwb2ludCBhdCAlWC8lWCIsCiAJCQkJCQlMU05fRk9STUFU X0FSR1MobHNuKSksCi0JCQkJIGVycmRldGFpbCgiV2FpdGluZyBmb3IgdHJhbnNhY3Rpb25z IChhcHByb3hpbWF0ZWx5ICVkKSBvbGRlciB0aGFuICV1IHRvIGVuZC4iLAotCQkJCQkJICAg cnVubmluZy0+eGNudCwgcnVubmluZy0+bmV4dFhpZCkpKTsKKwkJCQkgZXJyZGV0YWlsKCJX YWl0aW5nIGZvciB0cmFuc2FjdGlvbnMgb2xkZXIgdGhhbiAldSB0byBlbmQuIiwKKwkJCQkJ CSAgIHJ1bm5pbmctPm5leHRYaWQpKSk7CiAKIAkJU25hcEJ1aWxkV2FpdFNuYXBzaG90KHJ1 bm5pbmctPm5leHRYaWQpOwogCX0KQEAgLTEzNDAsOCArMTM0MCw4IEBAIFNuYXBCdWlsZEZp bmRTbmFwc2hvdChTbmFwQnVpbGQgKmJ1aWxkZXIsIFhMb2dSZWNQdHIgbHNuLCB4bF9ydW5u aW5nX3hhY3RzICpydW5uCiAJCWVyZXBvcnQoTE9HLAogCQkJCShlcnJtc2coImxvZ2ljYWwg ZGVjb2RpbmcgZm91bmQgaW5pdGlhbCBjb25zaXN0ZW50IHBvaW50IGF0ICVYLyVYIiwKIAkJ CQkJCUxTTl9GT1JNQVRfQVJHUyhsc24pKSwKLQkJCQkgZXJyZGV0YWlsKCJXYWl0aW5nIGZv ciB0cmFuc2FjdGlvbnMgKGFwcHJveGltYXRlbHkgJWQpIG9sZGVyIHRoYW4gJXUgdG8gZW5k LiIsCi0JCQkJCQkgICBydW5uaW5nLT54Y250LCBydW5uaW5nLT5uZXh0WGlkKSkpOworCQkJ CSBlcnJkZXRhaWwoIldhaXRpbmcgZm9yIHRyYW5zYWN0aW9ucyBvbGRlciB0aGFuICV1IHRv IGVuZC4iLAorCQkJCQkJICAgcnVubmluZy0+bmV4dFhpZCkpKTsKIAogCQlTbmFwQnVpbGRX YWl0U25hcHNob3QocnVubmluZy0+bmV4dFhpZCk7CiAJfQpkaWZmIC0tZ2l0IGEvc3JjL2Jh Y2tlbmQvc3RvcmFnZS9pcGMvc3RhbmRieS5jIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMv c3RhbmRieS5jCmluZGV4IGUwMmM5YWI4NDIuLjZlZDQ2YmVkMDMgMTAwNjQ0Ci0tLSBhL3Ny Yy9iYWNrZW5kL3N0b3JhZ2UvaXBjL3N0YW5kYnkuYworKysgYi9zcmMvYmFja2VuZC9zdG9y YWdlL2lwYy9zdGFuZGJ5LmMKQEAgLTEzMzcsOSArMTMzNyw2IEBAIExvZ0N1cnJlbnRSdW5u aW5nWGFjdHMoUnVubmluZ1RyYW5zYWN0aW9ucyBDdXJyUnVubmluZ1hhY3RzKQogCXhsX3J1 bm5pbmdfeGFjdHMgeGxyZWM7CiAJWExvZ1JlY1B0cglyZWNwdHI7CiAKLQl4bHJlYy54Y250 ID0gQ3VyclJ1bm5pbmdYYWN0cy0+eGNudDsKLQl4bHJlYy5zdWJ4Y250ID0gQ3VyclJ1bm5p bmdYYWN0cy0+c3VieGNudDsKLQl4bHJlYy5zdWJ4aWRfb3ZlcmZsb3cgPSAoQ3VyclJ1bm5p bmdYYWN0cy0+c3VieGlkX3N0YXR1cyAhPSBTVUJYSURTX0lOX0FSUkFZKTsKIAl4bHJlYy5u ZXh0WGlkID0gQ3VyclJ1bm5pbmdYYWN0cy0+bmV4dFhpZDsKIAl4bHJlYy5vbGRlc3RSdW5u aW5nWGlkID0gQ3VyclJ1bm5pbmdYYWN0cy0+b2xkZXN0UnVubmluZ1hpZDsKIAl4bHJlYy5s YXRlc3RDb21wbGV0ZWRYaWQgPSBDdXJyUnVubmluZ1hhY3RzLT5sYXRlc3RDb21wbGV0ZWRY aWQ7CkBAIC0xMzQ3LDMxICsxMzQ0LDE2IEBAIExvZ0N1cnJlbnRSdW5uaW5nWGFjdHMoUnVu bmluZ1RyYW5zYWN0aW9ucyBDdXJyUnVubmluZ1hhY3RzKQogCS8qIEhlYWRlciAqLwogCVhM b2dCZWdpbkluc2VydCgpOwogCVhMb2dTZXRSZWNvcmRGbGFncyhYTE9HX01BUktfVU5JTVBP UlRBTlQpOwotCVhMb2dSZWdpc3RlckRhdGEoKGNoYXIgKikgKCZ4bHJlYyksIE1pblNpemVP ZlhhY3RSdW5uaW5nWGFjdHMpOwotCi0JLyogYXJyYXkgb2YgVHJhbnNhY3Rpb25JZHMgKi8K LQlpZiAoeGxyZWMueGNudCA+IDApCi0JCVhMb2dSZWdpc3RlckRhdGEoKGNoYXIgKikgQ3Vy clJ1bm5pbmdYYWN0cy0+eGlkcywKLQkJCQkJCSAoeGxyZWMueGNudCArIHhscmVjLnN1Ynhj bnQpICogc2l6ZW9mKFRyYW5zYWN0aW9uSWQpKTsKKwlYTG9nUmVnaXN0ZXJEYXRhKChjaGFy ICopICgmeGxyZWMpLCBTaXplT2ZYYWN0UnVubmluZ1hhY3RzKTsKIAogCXJlY3B0ciA9IFhM b2dJbnNlcnQoUk1fU1RBTkRCWV9JRCwgWExPR19SVU5OSU5HX1hBQ1RTKTsKIAotCWlmICh4 bHJlYy5zdWJ4aWRfb3ZlcmZsb3cpCi0JCWVsb2coREVCVUcyLAotCQkJICJzbmFwc2hvdCBv ZiAlZCBydW5uaW5nIHRyYW5zYWN0aW9ucyBvdmVyZmxvd2VkIChsc24gJVgvJVggb2xkZXN0 IHhpZCAldSBsYXRlc3QgY29tcGxldGUgJXUgbmV4dCB4aWQgJXUpIiwKLQkJCSBDdXJyUnVu bmluZ1hhY3RzLT54Y250LAotCQkJIExTTl9GT1JNQVRfQVJHUyhyZWNwdHIpLAotCQkJIEN1 cnJSdW5uaW5nWGFjdHMtPm9sZGVzdFJ1bm5pbmdYaWQsCi0JCQkgQ3VyclJ1bm5pbmdYYWN0 cy0+bGF0ZXN0Q29tcGxldGVkWGlkLAotCQkJIEN1cnJSdW5uaW5nWGFjdHMtPm5leHRYaWQp OwotCWVsc2UKLQkJZWxvZyhERUJVRzIsCi0JCQkgInNuYXBzaG90IG9mICVkKyVkIHJ1bm5p bmcgdHJhbnNhY3Rpb24gaWRzIChsc24gJVgvJVggb2xkZXN0IHhpZCAldSBsYXRlc3QgY29t cGxldGUgJXUgbmV4dCB4aWQgJXUpIiwKLQkJCSBDdXJyUnVubmluZ1hhY3RzLT54Y250LCBD dXJyUnVubmluZ1hhY3RzLT5zdWJ4Y250LAotCQkJIExTTl9GT1JNQVRfQVJHUyhyZWNwdHIp LAotCQkJIEN1cnJSdW5uaW5nWGFjdHMtPm9sZGVzdFJ1bm5pbmdYaWQsCi0JCQkgQ3VyclJ1 bm5pbmdYYWN0cy0+bGF0ZXN0Q29tcGxldGVkWGlkLAotCQkJIEN1cnJSdW5uaW5nWGFjdHMt Pm5leHRYaWQpOworCWVsb2coREVCVUcyLAorCQkgImxvZ2dpbmcgcnVubmluZyB0cmFuc2Fj dGlvbiBib3VuZHMgKGxzbiAlWC8lWCBvbGRlc3QgeGlkICV1IGxhdGVzdCBjb21wbGV0ZSAl dSBuZXh0IHhpZCAldSkiLAorCQkgTFNOX0ZPUk1BVF9BUkdTKHJlY3B0ciksCisJCSBDdXJy UnVubmluZ1hhY3RzLT5vbGRlc3RSdW5uaW5nWGlkLAorCQkgQ3VyclJ1bm5pbmdYYWN0cy0+ bGF0ZXN0Q29tcGxldGVkWGlkLAorCQkgQ3VyclJ1bm5pbmdYYWN0cy0+bmV4dFhpZCk7CiAK IAkvKgogCSAqIEVuc3VyZSBydW5uaW5nX3hhY3RzIGluZm9ybWF0aW9uIGlzIHN5bmNlZCB0 byBkaXNrIG5vdCB0b28gZmFyIGluIHRoZQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvc3Rv cmFnZS9zdGFuZGJ5LmggYi9zcmMvaW5jbHVkZS9zdG9yYWdlL3N0YW5kYnkuaAppbmRleCBj Y2UwYmM1MjFlLi45ZDVhMjk4YTM5IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9zdG9yYWdl L3N0YW5kYnkuaAorKysgYi9zcmMvaW5jbHVkZS9zdG9yYWdlL3N0YW5kYnkuaApAQCAtNjAs OCArNjAsNiBAQCBleHRlcm4gdm9pZCBTdGFuZGJ5UmVsZWFzZUxvY2tUcmVlKFRyYW5zYWN0 aW9uSWQgeGlkLAogZXh0ZXJuIHZvaWQgU3RhbmRieVJlbGVhc2VBbGxMb2Nrcyh2b2lkKTsK IGV4dGVybiB2b2lkIFN0YW5kYnlSZWxlYXNlT2xkTG9ja3MoVHJhbnNhY3Rpb25JZCBvbGR4 aWQpOwogCi0jZGVmaW5lIE1pblNpemVPZlhhY3RSdW5uaW5nWGFjdHMgb2Zmc2V0b2YoeGxf cnVubmluZ194YWN0cywgeGlkcykKLQogCiAvKgogICogRGVjbGFyYXRpb25zIGZvciBHZXRS dW5uaW5nVHJhbnNhY3Rpb25EYXRhKCkuIFNpbWlsYXIgdG8gU25hcHNob3RzLCBidXQKZGlm ZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3N0b3JhZ2Uvc3RhbmRieWRlZnMuaCBiL3NyYy9pbmNs dWRlL3N0b3JhZ2Uvc3RhbmRieWRlZnMuaAppbmRleCBmZTEyZjQ2M2E4Li5kODU4MjA5NDQ3 IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9zdG9yYWdlL3N0YW5kYnlkZWZzLmgKKysrIGIv c3JjL2luY2x1ZGUvc3RvcmFnZS9zdGFuZGJ5ZGVmcy5oCkBAIC00MiwyMCArNDIsMjQgQEAg dHlwZWRlZiBzdHJ1Y3QgeGxfc3RhbmRieV9sb2NrcwogfSB4bF9zdGFuZGJ5X2xvY2tzOwog CiAvKgotICogV2hlbiB3ZSB3cml0ZSBydW5uaW5nIHhhY3QgZGF0YSB0byBXQUwsIHdlIHVz ZSB0aGlzIHN0cnVjdHVyZS4KKyAqIERhdGEgaW5jbHVkZWQgaW4gYW4gWExPR19SVU5OSU5H X1hBQ1RTIHJlY29yZC4KKyAqCisgKiBUaGlzIHVzZWQgdG8gaW5jbHVkZSBhIGxpc3Qgb2Yg cnVubmluZyBYSURzLCBoZW5jZSB0aGUgbmFtZSwgYnV0IG5vd2FkYXlzCisgKiB0aGlzIG9u bHkgY29udGFpbnMgdGhlIG1pbiBhbmQgbWF4IGJvdW5kcyBvZiB0aGUgdHJhbnNhY3Rpb25z IHRoYXQgd2VyZQorICogcnVubmluZyB3aGVuIHRoZSByZWNvcmQgd2FzIHdyaXR0ZW4uICBU aGV5IGFyZSBuZWVkZWQgdG8gaW5pdGlhbGl6ZSBsb2dpY2FsCisgKiBkZWNvZGluZy4gIFRo ZXkgYXJlIGFsc28gdXNlZCBpbiBob3Qgc3RhbmRieSB0byBwcnVuZSBpbmZvcm1hdGlvbiBh Ym91dCBvbGQKKyAqIHJ1bm5pbmcgdHJhbnNhY3Rpb25zLCBpbiBjYXNlIHRoZSB0aGUgcHJp bWFyeSBkaWRuJ3Qgd3JpdGUgYSBDT01NSVQvQUJPUlQKKyAqIHJlY29yZCBmb3Igc29tZSBy ZWFzb24uCiAgKi8KIHR5cGVkZWYgc3RydWN0IHhsX3J1bm5pbmdfeGFjdHMKIHsKLQlpbnQJ CQl4Y250OwkJCS8qICMgb2YgeGFjdCBpZHMgaW4geGlkc1tdICovCi0JaW50CQkJc3VieGNu dDsJCS8qICMgb2Ygc3VieGFjdCBpZHMgaW4geGlkc1tdICovCi0JYm9vbAkJc3VieGlkX292 ZXJmbG93OwkvKiBzbmFwc2hvdCBvdmVyZmxvd2VkLCBzdWJ4aWRzIG1pc3NpbmcgKi8KIAlU cmFuc2FjdGlvbklkIG5leHRYaWQ7CQkvKiB4aWQgZnJvbSBUcmFuc2FtVmFyaWFibGVzLT5u ZXh0WGlkICovCiAJVHJhbnNhY3Rpb25JZCBvbGRlc3RSdW5uaW5nWGlkOyAvKiAqbm90KiBv bGRlc3RYbWluICovCiAJVHJhbnNhY3Rpb25JZCBsYXRlc3RDb21wbGV0ZWRYaWQ7CS8qIHNv IHdlIGNhbiBzZXQgeG1heCAqLwotCi0JVHJhbnNhY3Rpb25JZCB4aWRzW0ZMRVhJQkxFX0FS UkFZX01FTUJFUl07CiB9IHhsX3J1bm5pbmdfeGFjdHM7CiAKKyNkZWZpbmUgU2l6ZU9mWGFj dFJ1bm5pbmdYYWN0cyBzaXplb2YoeGxfcnVubmluZ194YWN0cykKKwogLyoKICAqIEludmFs aWRhdGlvbnMgZm9yIHN0YW5kYnksIGN1cnJlbnRseSBvbmx5IHdoZW4gdHJhbnNhY3Rpb25z IHdpdGhvdXQgYW4KICAqIGFzc2lnbmVkIHhpZCBjb21taXQuCi0tIAoyLjM5LjUKCg== --------------6V2bsblsMdY4BnmlS1v5weLR Content-Type: text/x-patch; charset=UTF-8; name="v5-0005-Add-a-cache-to-Snapshot-to-avoid-repeated-CSN-loo.patch" Content-Disposition: attachment; filename*0="v5-0005-Add-a-cache-to-Snapshot-to-avoid-repeated-CSN-loo.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA2N2FkNmIwYjc3ZGY4M2Q2ZWE5NWFiMmI5MjE1NDBlMjI4OGJlMzcyIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBIZWlra2kgTGlubmFrYW5nYXMgPGhlaWtraS5saW5u YWthbmdhc0Bpa2kuZmk+CkRhdGU6IFR1ZSwgMyBEZWMgMjAyNCAxNTo0MjowMyArMDIwMApT dWJqZWN0OiBbUEFUQ0ggdjUgNS81XSBBZGQgYSBjYWNoZSB0byBTbmFwc2hvdCB0byBhdm9p ZCByZXBlYXRlZCBDU04gbG9va3VwcwoKQ2FjaGUgdGhlIHN0YXR1cyBvZiBhbGwgWElEcyB0 aGF0IGhhdmUgYmVlbiBsb29rZWQgdXAgaW4gdGhlIENTTiBsb2cKaW4gdGhlIFNuYXBzaG90 RGF0YS4gVGhpcyBhdm9pZHMgaGF2aW5nIHRvIGdvIHRoZSBDU04gbG9nIGluIHRoZQpjb21t b24gY2FzZSB0aGF0IHRoZSBzYW1lIFhJRHMgYXJlIGxvb2tlZCB1cCBvdmVyIGFuZCBvdmVy IGFnYWluLgotLS0KIHNyYy9iYWNrZW5kL3V0aWxzL3RpbWUvc25hcG1nci5jIHwgOTIgKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrLS0KIHNyYy9pbmNsdWRlL3V0aWxzL3NuYXBz aG90LmggICAgIHwgMTAgKysrLQogMiBmaWxlcyBjaGFuZ2VkLCA5NiBpbnNlcnRpb25zKCsp LCA2IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL3RpbWUv c25hcG1nci5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvdGltZS9zbmFwbWdyLmMKaW5kZXggZGE4 MmRlZjg0Ni4uZGY5ZThiYTM3ZiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvdGlt ZS9zbmFwbWdyLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvdGltZS9zbmFwbWdyLmMKQEAg LTY2LDYgKzY2LDM1IEBACiAjaW5jbHVkZSAidXRpbHMvc25hcG1nci5oIgogI2luY2x1ZGUg InV0aWxzL3N5c2NhY2hlLmgiCiAKKy8qCisgKiBEZWZpbmUgYSByYWRpeCB0cmVlIGltcGxl bWVudGF0aW9uIHRvIGNhY2hlIENTTiBsb29rdXBzIGluIGEgc25hcHNob3QuCisgKgorICog V2UgbmVlZCBvbmx5IG9uZSBiaXQgb2YgaW5mb3JtYXRpb24gZm9yIGVhY2ggWElEIHN0b3Jl ZCBpbiB0aGUgY2FjaGU6IHdhcworICogdGhlIFhJRCBydW5uaW5nIG9yIG5vdC4gIEhvd2V2 ZXIsIHRoZSByYWRpeCB0cmVlIGltcGxlbWVudGF0aW9uIHVzZXMgOAorICogYnl0ZXMgZm9y IGVhY2ggZW50cnkgKG9uIDY0LWJpdCBtYWNoaW5lcykgZXZlbiBpZiB0aGUgdmFsdWUgdHlw ZSBpcyBzbWFsbGVyCisgKiB0aGFuIHRoYXQuICBUbyByZWR1Y2UgbWVtb3J5IHVzYWdlLCB3 ZSB1c2UgdWludDY0IGFzIHRoZSB2YWx1ZSB0eXBlLCBhbmQKKyAqIHN0b3JlIG11bHRpcGxl IFhJRHMgaW4gZWFjaCB2YWx1ZS4KKyAqCisgKiBUaGUgNjQtYml0IHZhbHVlIHdvcmQgaG9s ZHMgdHdvIGJpdHMgZm9yIGVhY2ggWElEOiB3aGV0aGVyIHRoZSBYSUQgaXMKKyAqIHByZXNl bnQgaW4gdGhlIGNhY2hlIG9yIG5vdCwgYW5kIGlmIGl0J3MgcHJlc2VudCwgd2hldGhlciBp dCdzIGNvbnNpZGVyZWQKKyAqIGFzIGluLXByb2dyZXNzIGJ5IHRoZSBzbmFwc2hvdCBvciBu b3QuICBTbyBlYWNoIGVudHJ5IGluIHRoZSByYWRpeCB0cmVlCisgKiBob2xkcyB0aGUgc3Rh dHVzIGZvciAzMiBYSURzLgorICovCisjZGVmaW5lIFJUX1BSRUZJWCBpbnByb2dyZXNzX2Nh Y2hlCisjZGVmaW5lIFJUX1NDT1BFCisjZGVmaW5lIFJUX0RFQ0xBUkUKKyNkZWZpbmUgUlRf REVGSU5FCisjZGVmaW5lIFJUX1ZBTFVFX1RZUEUgdWludDY0CisjaW5jbHVkZSAibGliL3Jh ZGl4dHJlZS5oIgorCisjZGVmaW5lIElOUFJPR1JFU1NfQ0FDSEVfQklUUyAyCisjZGVmaW5l IElOUFJPR1JFU1NfQ0FDSEVfWElEU19QRVJfV09SRCAzMgorCisjZGVmaW5lIElOUFJPR1JF U1NfQ0FDSEVfWElEX0lTX0NBQ0hFRCh3b3JkLCBzbG90bm8pIFwKKwkoKCgod29yZCkgJiAo VUlOVDY0Q09OU1QoMSkgPDwgKHNsb3RubykpKSkgIT0gMCkKKworI2RlZmluZSBJTlBST0dS RVNTX0NBQ0hFX1hJRF9JU19JTl9QUk9HUkVTUyh3b3JkLCBzbG90bm8pIFwKKwkoKCgod29y ZCkgJiAoVUlOVDY0Q09OU1QoMSkgPDwgKChzbG90bm8pICsgMSkpKSkgIT0gMCkKIAogLyoK ICAqIEN1cnJlbnRTbmFwc2hvdCBwb2ludHMgdG8gdGhlIG9ubHkgc25hcHNob3QgdGFrZW4g aW4gdHJhbnNhY3Rpb24tc25hcHNob3QKQEAgLTU5NSw2ICs2MjQsMTIgQEAgQ29weVNuYXBz aG90KFNuYXBzaG90IHNuYXBzaG90KQogCW5ld3NuYXAtPmNvcGllZCA9IHRydWU7CiAJbmV3 c25hcC0+c25hcFhhY3RDb21wbGV0aW9uQ291bnQgPSAwOwogCisJLyoKKwkgKiBUT0RPOiBJ ZiB3ZSBoYWQgYSBzZXBhcmF0ZSByZWZlcmVuY2UgY291bnQgb24gdGhlIGNhY2hlLCB3ZSBj b3VsZCBzaGFyZQorCSAqIGl0IGJldHdlZW4gdGhlIGNvcGllcy4KKwkgKi8KKwluZXdzbmFw LT5pbnByb2dyZXNzX2NhY2hlID0gTlVMTDsKKwogCS8qIHNldHVwIFhJRCBhcnJheSAqLwog CWlmIChzbmFwc2hvdC0+eGNudCA+IDApCiAJewpAQCAtNjA5LDcgKzY0NCw3IEBAIENvcHlT bmFwc2hvdChTbmFwc2hvdCBzbmFwc2hvdCkKIAkgKiBTZXR1cCBzdWJYSUQgYXJyYXkuIERv bid0IGJvdGhlciB0byBjb3B5IGl0IGlmIGl0IGhhZCBvdmVyZmxvd2VkLAogCSAqIHRob3Vn aCwgYmVjYXVzZSBpdCdzIG5vdCB1c2VkIGFueXdoZXJlIGluIHRoYXQgY2FzZS4gRXhjZXB0 IGlmIGl0J3MgYQogCSAqIHNuYXBzaG90IHRha2VuIGR1cmluZyByZWNvdmVyeTsgYWxsIHRo ZSB0b3AtbGV2ZWwgWElEcyBhcmUgaW4gc3VieGlwIGFzCi0JICogd2VsbCBpbiB0aGF0IGNh c2UsIHNvIHdlIG11c3RuJ3QgbG9zZSB0aGVtLgorCSAqIHdlbGwgaW4gdGhhdCBjYXNlLCBz byB3ZSBtdXN0bid0IGxvc2UgdGhlbS4gWFhYCiAJICovCiAJaWYgKHNuYXBzaG90LT5zdWJ4 Y250ID4gMCAmJgogCQkoIXNuYXBzaG90LT5zdWJvdmVyZmxvd2VkIHx8IHNuYXBzaG90LT50 YWtlbkR1cmluZ1JlY292ZXJ5KSkKQEAgLTYzNSw2ICs2NzAsOCBAQCBGcmVlU25hcHNob3Qo U25hcHNob3Qgc25hcHNob3QpCiAJQXNzZXJ0KHNuYXBzaG90LT5hY3RpdmVfY291bnQgPT0g MCk7CiAJQXNzZXJ0KHNuYXBzaG90LT5jb3BpZWQpOwogCisJaWYgKHNuYXBzaG90LT5pbnBy b2dyZXNzX2NhY2hlKQorCQlpbnByb2dyZXNzX2NhY2hlX2ZyZWUoc25hcHNob3QtPmlucHJv Z3Jlc3NfY2FjaGUpOwogCXBmcmVlKHNuYXBzaG90KTsKIH0KIApAQCAtMTgwNyw2ICsxODQ0 LDcgQEAgUmVzdG9yZVNuYXBzaG90KGNoYXIgKnN0YXJ0X2FkZHJlc3MpCiAJc25hcHNob3Qt PndoZW5UYWtlbiA9IHNlcmlhbGl6ZWRfc25hcHNob3Qud2hlblRha2VuOwogCXNuYXBzaG90 LT5sc24gPSBzZXJpYWxpemVkX3NuYXBzaG90LmxzbjsKIAlzbmFwc2hvdC0+c25hcHNob3RD c24gPSBzZXJpYWxpemVkX3NuYXBzaG90LnNuYXBzaG90Q3NuOworCXNuYXBzaG90LT5pbnBy b2dyZXNzX2NhY2hlID0gTlVMTDsKIAlzbmFwc2hvdC0+c25hcFhhY3RDb21wbGV0aW9uQ291 bnQgPSAwOwogCiAJLyogQ29weSBYSURzLCBpZiBwcmVzZW50LiAqLwpAQCAtMTkxNywxMiAr MTk1NSw1NiBAQCBYaWRJbk1WQ0NTbmFwc2hvdChUcmFuc2FjdGlvbklkIHhpZCwgU25hcHNo b3Qgc25hcHNob3QpCiAJfQogCWVsc2UKIAl7Ci0JCVhMb2dSZWNQdHIJY3NuID0gQ1NOTG9n R2V0Q1NOQnlYaWQoeGlkKTsKKwkJWExvZ1JlY1B0cgljc247CisJCWJvb2wJCWlucHJvZ3Jl c3M7CisJCXVpbnQ2NAkgICAqY2FjaGVfZW50cnkgPSBOVUxMOworCQl1aW50NjQJCWNhY2hl X3dvcmQgPSAwOworCisJCS8qCisJCSAqIENhbGN1bGF0ZSB0aGUgd29yZCBhbmQgYml0IHNs b3QgZm9yIHRoZSBYSUQgaW4gdGhlIGNhY2hlLiBXZSB1c2UgYW4KKwkJICogb2Zmc2V0IGZy b20geG1heCBhcyB0aGUga2V5IGluc3RlYWQgb2YgdGhlIFhJRCBkaXJlY3RseSwgYmVjYXVz ZQorCQkgKiB0aGUgcmFkaXggdHJlZSBjYW4gY29tcGFjdCBhd2F5IGxlYWRpbmcgemVyb3Mg YW5kIGlzIHRodXMgc2xpZ2h0bHkKKwkJICogbW9yZSBlZmZpY2llbnQgd2l0aCBrZXlzIGNs b3NlciB0byAwLgorCQkgKi8KKwkJdWludDMyCQljYWNoZV9pZHggPSBzbmFwc2hvdC0+eG1h eCAtIHhpZDsKKwkJdWludDY0CQl3b3Jkbm8gPSBjYWNoZV9pZHggLyBJTlBST0dSRVNTX0NB Q0hFX1hJRFNfUEVSX1dPUkQ7CisJCXVpbnQ2NAkJc2xvdG5vID0gKGNhY2hlX2lkeCAlIElO UFJPR1JFU1NfQ0FDSEVfWElEU19QRVJfV09SRCkgKiBJTlBST0dSRVNTX0NBQ0hFX0JJVFM7 CisKKwkJaWYgKHNuYXBzaG90LT5pbnByb2dyZXNzX2NhY2hlKQorCQl7CisJCQljYWNoZV9l bnRyeSA9IGlucHJvZ3Jlc3NfY2FjaGVfZmluZChzbmFwc2hvdC0+aW5wcm9ncmVzc19jYWNo ZSwgd29yZG5vKTsKKwkJCWlmIChjYWNoZV9lbnRyeSkKKwkJCXsKKwkJCQljYWNoZV93b3Jk ID0gKmNhY2hlX2VudHJ5OworCQkJCWlmIChJTlBST0dSRVNTX0NBQ0hFX1hJRF9JU19DQUNI RUQoY2FjaGVfd29yZCwgc2xvdG5vKSkKKwkJCQkJcmV0dXJuIElOUFJPR1JFU1NfQ0FDSEVf WElEX0lTX0lOX1BST0dSRVNTKGNhY2hlX3dvcmQsIHNsb3Rubyk7CisJCQl9CisJCX0KKwor CQkvKiBOb3QgZm91bmQgaW4gY2FjaGUsIGxvb2sgdXAgdGhlIENTTiAqLworCQljc24gPSBD U05Mb2dHZXRDU05CeVhpZCh4aWQpOworCQlpbnByb2dyZXNzID0gKGNzbiA9PSBJbnZhbGlk WExvZ1JlY1B0ciB8fCBjc24gPiBzbmFwc2hvdC0+c25hcHNob3RDc24pOwogCi0JCWlmIChj c24gIT0gSW52YWxpZFhMb2dSZWNQdHIgJiYgY3NuIDw9IHNuYXBzaG90LT5zbmFwc2hvdENz bikKLQkJCXJldHVybiBmYWxzZTsKKwkJLyogVXBkYXRlIHRoZSBjYWNoZSB3b3JkLCBhbmQg c3RvcmUgaXQgYmFjayB0byB0aGUgcmFkaXggdHJlZSAqLworCQljYWNoZV93b3JkIHw9IFVJ TlQ2NENPTlNUKDEpIDw8IHNsb3RubzsJLyogY2FjaGVkICovCisJCWlmIChpbnByb2dyZXNz KQorCQkJY2FjaGVfd29yZCB8PSBVSU5UNjRDT05TVCgxKSA8PCAoc2xvdG5vICsgMSk7CS8q IGluLXByb2dyZXNzICovCisKKwkJaWYgKCFzbmFwc2hvdC0+aW5wcm9ncmVzc19jYWNoZSkK KwkJeworCQkJTWVtb3J5Q29udGV4dCBjYWNoZV9jdHg7CisKKwkJCWNhY2hlX2N0eCA9IEFs bG9jU2V0Q29udGV4dENyZWF0ZShUb3BUcmFuc2FjdGlvbkNvbnRleHQsCisJCQkJCQkJCQkJ CSAgInNuYXBzaG90IGlucHJvZ3Jlc3MgY2FjaGUgY29udGV4dCIsCisJCQkJCQkJCQkJCSAg QUxMT0NTRVRfU01BTExfU0laRVMpOworCQkJc25hcHNob3QtPmlucHJvZ3Jlc3NfY2FjaGUg PSBpbnByb2dyZXNzX2NhY2hlX2NyZWF0ZShjYWNoZV9jdHgpOworCQl9CisJCWlmIChjYWNo ZV9lbnRyeSkKKwkJCSpjYWNoZV9lbnRyeSA9IGNhY2hlX3dvcmQ7CiAJCWVsc2UKLQkJCXJl dHVybiB0cnVlOworCQkJaW5wcm9ncmVzc19jYWNoZV9zZXQoc25hcHNob3QtPmlucHJvZ3Jl c3NfY2FjaGUsIHdvcmRubywgJmNhY2hlX3dvcmQpOworCisJCXJldHVybiBpbnByb2dyZXNz OwogCX0KIAogCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3V0aWxz L3NuYXBzaG90LmggYi9zcmMvaW5jbHVkZS91dGlscy9zbmFwc2hvdC5oCmluZGV4IDFmZGE1 YjA2ZjYuLjNmYjc1NzI4NzkgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3V0aWxzL3NuYXBz aG90LmgKKysrIGIvc3JjL2luY2x1ZGUvdXRpbHMvc25hcHNob3QuaApAQCAtMTIyLDYgKzEy Miw4IEBAIHR5cGVkZWYgc3RydWN0IFNuYXBzaG90RGF0YSAqU25hcHNob3Q7CiAKICNkZWZp bmUgSW52YWxpZFNuYXBzaG90CQkoKFNuYXBzaG90KSBOVUxMKQogCitzdHJ1Y3QgaW5wcm9n cmVzc19jYWNoZV9yYWRpeF90cmVlOyAvKiBwcml2YXRlIHRvIHNuYXBtZ3IuYyAqLworCiAv KgogICogU3RydWN0IHJlcHJlc2VudGluZyBhbGwga2luZCBvZiBwb3NzaWJsZSBzbmFwc2hv dHMuCiAgKgpAQCAtMTU4LDcgKzE2MCw3IEBAIHR5cGVkZWYgc3RydWN0IFNuYXBzaG90RGF0 YQogCVRyYW5zYWN0aW9uSWQgeG1heDsJCQkvKiBhbGwgWElEID49IHhtYXggYXJlIGludmlz aWJsZSB0byBtZSAqLwogCiAJLyoKLQkgKiBGb3Igbm9ybWFsIE1WQ0Mgc25hcHNob3QgdGhp cyBjb250YWlucyB0aGUgYWxsIHhhY3QgSURzIHRoYXQgYXJlIGluCisJICogRm9yIG5vcm1h bCBNVkNDIHNuYXBzaG90IHRoaXMgY29udGFpbnMgYWxsIHRoZSB4YWN0IElEcyB0aGF0IGFy ZSBpbgogCSAqIHByb2dyZXNzLCB1bmxlc3MgdGhlIHNuYXBzaG90IHdhcyB0YWtlbiBkdXJp bmcgcmVjb3ZlcnkgaW4gd2hpY2ggY2FzZQogCSAqIGl0J3MgZW1wdHkuIEZvciBoaXN0b3Jp YyBNVkNDIHNuYXBzaG90cywgdGhlIG1lYW5pbmcgaXMgaW52ZXJ0ZWQsIGkuZS4KIAkgKiBp dCBjb250YWlucyAqY29tbWl0dGVkKiB0cmFuc2FjdGlvbnMgYmV0d2VlbiB4bWluIGFuZCB4 bWF4LgpAQCAtMTg4LDYgKzE5MCwxMiBAQCB0eXBlZGVmIHN0cnVjdCBTbmFwc2hvdERhdGEK IAkgKi8KIAlYTG9nUmVjUHRyCXNuYXBzaG90Q3NuOwogCisJLyoKKwkgKiBDYWNoZSBvZiBY SURzIGtub3duIHRvIGJlIHJ1bm5pbmcgb3Igbm90IGFjY29yZGluZyB0byB0aGUgc25hcHNo b3QuCisJICogVXNlZCBpbiBzbmFwc2hvdHMgdGFrZW4gZHVyaW5nIHJlY292ZXJ5LgorCSAq LworCXN0cnVjdCBpbnByb2dyZXNzX2NhY2hlX3JhZGl4X3RyZWUgKmlucHJvZ3Jlc3NfY2Fj aGU7CisKIAlib29sCQl0YWtlbkR1cmluZ1JlY292ZXJ5OwkvKiByZWNvdmVyeS1zaGFwZWQg c25hcHNob3Q/ICovCiAJYm9vbAkJY29waWVkOwkJCS8qIGZhbHNlIGlmIGl0J3MgYSBzdGF0 aWMgc25hcHNob3QgKi8KIAotLSAKMi4zOS41Cgo= --------------6V2bsblsMdY4BnmlS1v5weLR--