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 1v6BUX-000bH4-Lp for pgsql-hackers@arkaria.postgresql.org; Tue, 07 Oct 2025 17:28:50 +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 1v6BUV-001nli-4p for pgsql-hackers@arkaria.postgresql.org; Tue, 07 Oct 2025 17:28:48 +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 1v6BUU-001nlU-6i for pgsql-hackers@lists.postgresql.org; Tue, 07 Oct 2025 17:28:47 +0000 Received: from flow-b8-smtp.messagingengine.com ([202.12.124.143]) by makus.postgresql.org with smtp (Exim 4.96) (envelope-from ) id 1v6BUS-000Wu1-0a for pgsql-hackers@postgresql.org; Tue, 07 Oct 2025 17:28:46 +0000 Received: from phl-compute-04.internal (phl-compute-04.internal [10.202.2.44]) by mailflow.stl.internal (Postfix) with ESMTP id 7D45013000F4; Tue, 7 Oct 2025 13:28:43 -0400 (EDT) Received: from phl-imap-03 ([10.202.2.93]) by phl-compute-04.internal (MEProxy); Tue, 07 Oct 2025 13:28:43 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=compiler.org; h= cc:cc:content-type:content-type:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:subject :subject:to:to; s=fm2; t=1759858123; x=1759865323; bh=avu7Dp3Kib 02GhvWLmUPm5Kh98th0ZxE7QH+MUlx4AM=; b=hiQCwEd/PVBa6JsgiAx7nGPI19 Jdf67j9nawcYY6UyvALDMmX5pIK2t1yb4q7lsxkGmKb+HLTKY91/rOxPALyCarmM Pv9bxR5Y4KA3p/nLBU04Esv1j8XF/pYGBf4TieUPAf+9Yxl6RLhoxyRsiP23Da9e l4rpcYLKskOEHFsbS3piaROlEhmIAKWw5W8Nj5OkJ7aamVGHDZK/CIM+R+h6NYV7 BCxQEF7XqWcqLE3u/6JmSKS4Dockx0nHjCM5PupexpKj3TKDJpOoyaKQulWjWBxy y6kPcNwqa49AbWKmpmfOa2ScO6pgY9WQh/1/ryZ8m6dTKelX2aPBbBov/MbA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:subject:subject:to :to:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; t= 1759858123; x=1759865323; bh=avu7Dp3Kib02GhvWLmUPm5Kh98th0ZxE7QH +MUlx4AM=; b=QmbKmKBZO24Z57JtILhjQfDannvN+1OpwHW7kGRimeMwWzISte4 HFk8+ASr45kgrAUcei8JWLsVwjSodasLmA+On2DD4uSxIuP1JlFMJKwQK5818fzf Zm5p49bYOi4/RyK3+RBhUZZ7Iygb8hWq2i7dooWad6CG1I36RR9I3GPgl0LOBkua hnceodfH/+XvRdz3SCtK17tq3pdzns4NRCY5oKroRwH+rx3EPe2Sg+BTMiD/VtBN P+benuPVp+mnlzXs8wt01fhz60rE25xUSccGv4J0odWFAXJdUJ89PuQb00nuZ+5c WA4nDAl5SrHlPZMYafvMSgFEv8agW5BAkZA== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggddutddutddvucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucenucfjughrpefoggffhffvvefkjghfufgtsehmtderre ertddtnecuhfhrohhmpedflfhovghlucflrggtohgsshhonhdfuceojhhovghlsegtohhm phhilhgvrhdrohhrgheqnecuggftrfgrthhtvghrnhepfffgleffffdvhefhieegfeeije dujedvieeuveeugefgveeukeevieethefhteeinecuvehluhhsthgvrhfuihiivgeptden ucfrrghrrghmpehmrghilhhfrhhomhepjhhovghlsegtohhmphhilhgvrhdrohhrghdpnh gspghrtghpthhtohepfedpmhhouggvpehsmhhtphhouhhtpdhrtghpthhtohepmhgrthhh vghushhsshhilhhvleejsehgmhgrihhlrdgtohhmpdhrtghpthhtohepphhgshhqlhdqhh grtghkvghrshesphhoshhtghhrvghsqhhlrdhorhhgpdhrtghpthhtohepthhglhesshhs shdrphhghhdrphgrrdhush X-ME-Proxy: Feedback-ID: ic6394509:Fastmail Received: by mailuser.phl.internal (Postfix, from userid 501) id CF58518E0063; Tue, 7 Oct 2025 13:28:42 -0400 (EDT) X-Mailer: MessagingEngine.com Webmail Interface MIME-Version: 1.0 X-ThreadId: AZ7XRsRLdGms Date: Tue, 07 Oct 2025 19:28:22 +0200 From: "Joel Jacobson" To: "Matheus Alcantara" , "Tom Lane" Cc: pgsql-hackers Message-Id: <85828f29-e72e-4400-94f3-9a69bc8dc239@app.fastmail.com> In-Reply-To: References: <6899c044-4a82-49be-8117-e6f669765f7e@app.fastmail.com> <165530.1752362320@sss.pgh.pa.us> <02a7cd37-e2fc-4212-8b19-f8c239c95fb8@app.fastmail.com> <96f00bf1-cc9d-4520-9d02-9e14e7767c88@app.fastmail.com> <30c2aa7d-dd6c-4b68-a2e4-f217a1a34acf@app.fastmail.com> <0b4d402a-9ac2-4aa8-acf8-8231dbe579ea@app.fastmail.com> <3095599.1758644879@sss.pgh.pa.us> <0dc6a2cc-5216-4dc1-9dd2-430cafc6095b@app.fastmail.com> <52CC167F-763B-4ECA-B0B4-DAB381816828@gmail.com> <9186C6D0-F7A9-482A-9183-89E530B57E36@gmail.com> <1073593.1759423179@sss.pgh.pa.us> <4bd5e6c4-6fa7-44bb-869d-59a32a331fa8@app.fastmail.com> Subject: Re: Optimize LISTEN/NOTIFY Content-Type: multipart/mixed; boundary=d5715a4bc93049cf81c46a46cbdb4cb3 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --d5715a4bc93049cf81c46a46cbdb4cb3 Content-Type: text/plain Content-Transfer-Encoding: 7bit On Tue, Oct 7, 2025, at 14:40, Matheus Alcantara wrote: > This is not a complete review, I just read the v9 patch and summarized > some points. Many thanks for the review! > 1. You may want to add ChannelEntry and ChannelHashKey to typedefs.list > to get pgindent do the right job on indentation. Fixed. > 2. The ListCell* variables are normally named as lc > + ListCell *p; I agree, better to be consistent. I renamed the variables this patch adds, but I didn't change the existing ListCell *p variables in async.c. Would we want to harmonize it to just *lc everywhere in async.c? I notice we also use ListCell *l in async.c at some places. > 3. This block on ChannelHashRemoveListener() seems contradictory. You > early return if channel_hash == NULL and then call init_channel_hash > that it will early return if channel_hash != NULL. So if channel_hash != > NULL I don't think that we need to call init_channel_hash()? > + if (channel_hash == NULL) > + return; > + > + init_channel_hash(); > > A similar check also exists on SignalBackends() > if (channel_hash == NULL) > ... > else > { > // channel_hash is != NULL, so init_channel_hash will early > // return. > init_channel_hash(); > ... > } Ahh, right, I agree. I've removed the unnecessary init_channel_hash() calls. > 4. The ChannelHashRemoveListener() release lock logic could be > simplified to something like the following, what do you think? > + if (entry->num_listeners == 0) > + { > + dsa_free(channel_dsa, entry->listeners_array); > + dshash_delete_entry(channel_hash, entry); > + } > + break; > + } > + } > + > + /* Not found in list */ > + dshash_release_lock(channel_hash, entry); That would be nicer, but I noted that dshash_delete_entry() releases the lock just like dshash_release_lock(), so then I think we would need to return; after dshash_delete_entry(), to prevent attempting to release the lock twice? > 5. You may want to use list_member() on GetPendingNotifyChannels() to > avoid the inner loop to check for duplicate channel names. Ahh, much nicer! Fixed. > 6. s/beind/behind > + /* Need to signal if a backend has fallen too > far beind */ Fixed. > 7. I'm wondering if we could add some TAP tests for this? I think that > adding a case to ensure that we can grown the dshash correctly and also > we manage multiple backends to the same channel properly. This CF [1] > has some examples of how TAP tests can be created to test LISTEN/NOTIFY I will look over the tests. Maybe we should add some elog DEBUG at the new code paths, and ensure the tests at least cover all of them? /Joel --d5715a4bc93049cf81c46a46cbdb4cb3 Content-Disposition: attachment; filename="optimize_listen_notify-v10.patch" Content-Type: application/octet-stream; name="optimize_listen_notify-v10.patch" Content-Transfer-Encoding: base64 RnJvbSBlZDQ1MWZmNzllMTZlYTQ5OTE5NTdlMTIwNDIxY2E2NmM5MjBiNTc2IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKb2VsIEphY29ic29uIDxqb2VsQGNvbXBpbGVyLm9y Zz4KRGF0ZTogU3VuLCAyOCBTZXAgMjAyNSAxNDo1Mzo1NyArMDIwMApTdWJqZWN0OiBbUEFU Q0hdIE9wdGltaXplIExJU1RFTi9OT1RJRlkgd2l0aCBjaGFubmVsLXNwZWNpZmljIGxpc3Rl bmVyCiB0cmFja2luZwoKQ3VycmVudGx5LCBpZGxlIGxpc3RlbmluZyBiYWNrZW5kcyBjYXVz ZSBhIGRyYW1hdGljIHNsb3dkb3duIGR1ZSB0bwpjb250ZXh0IHN3aXRjaGluZyB3aGVuIHRo ZXkgYXJlIHNpZ25hbGVkIGFuZCB3YWtlIHVwLiBUaGlzIGlzIHdhc3RlZnVsCndoZW4gdGhl eSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgY2hhbm5lbCBiZWluZyBub3RpZmllZC4KCkp1 c3QgMTAgZXh0cmEgaWRsZSBsaXN0ZW5pbmcgY29ubmVjdGlvbnMgY2F1c2UgYSBzbG93ZG93 biBmcm9tIDg3MDAgVFBTCnRvIDYxMDAgVFBTLCAxMDAgZXh0cmEgY2F1c2UgaXQgdG8gZHJv cCB0byAyMDAwIFRQUywgYW5kIGF0IDEwMDAgZXh0cmEKaXQgZmFsbHMgdG8gMjUwIFRQUy4K ClRoaXMgcGF0Y2ggaW50cm9kdWNlcyB0YXJnZXRlZCBzaWduYWxpbmcgZm9yIExJU1RFTi9O T1RJRlksIGltcHJvdmluZwpzY2FsYWJpbGl0eSBpbiB3b3JrbG9hZHMgd2l0aCBtYW55IGlk bGUgbGlzdGVuZXJzLgoKQSBkeW5hbWljIHNoYXJlZCBoYXNoIHRhYmxlIG5vdyB0cmFja3Mg d2hpY2ggYmFja2VuZHMgbGlzdGVuIG9uIGVhY2gKKGRhdGFiYXNlLCBjaGFubmVsKSBwYWly LCB3aGljaCBTaWduYWxCYWNrZW5kcygpIHVzZXMgdG8gcGVyZm9ybQp0YXJnZXRlZCBzaWdu YWxpbmcuICBJbiBhZGRpdGlvbiwgaXQgc3RhZ2dlcnMgd2FrZXVwcyBieSBzaWduYWxpbmcg b25lCmJhY2tlbmQgYXQgdGhlIGdsb2JhbCB0YWlsIHRvIGhlbHAgaXQgYWR2YW5jZSBncmFk dWFsbHksIGFuZCBmb3JjZXMgYW55CmV4Y2Vzc2l2ZWx5IGxhZ2dpbmcgYmFja2VuZHMgdG8g Y2F0Y2ggdXAuICBBIHBlci1iYWNrZW5kIHdha2V1cF9wZW5kaW5nCmZsYWcgYXZvaWRzIHJl ZHVuZGFudCBzaWduYWxzLgotLS0KIHNyYy9iYWNrZW5kL2NvbW1hbmRzL2FzeW5jLmMgICAg ICAgICAgICAgICAgICB8IDQ2NCArKysrKysrKysrKysrKysrLS0KIC4uLi91dGlscy9hY3Rp dml0eS93YWl0X2V2ZW50X25hbWVzLnR4dCAgICAgICB8ICAgMSArCiBzcmMvaW5jbHVkZS9z dG9yYWdlL2x3bG9ja2xpc3QuaCAgICAgICAgICAgICAgfCAgIDEgKwogc3JjL3Rvb2xzL3Bn aW5kZW50L3R5cGVkZWZzLmxpc3QgICAgICAgICAgICAgIHwgICAyICsKIDQgZmlsZXMgY2hh bmdlZCwgNDMwIGluc2VydGlvbnMoKyksIDM4IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBh L3NyYy9iYWNrZW5kL2NvbW1hbmRzL2FzeW5jLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9h c3luYy5jCmluZGV4IDRiZDM3ZDViZWI1Li4wZmRhNmMwMmI0ZSAxMDA2NDQKLS0tIGEvc3Jj L2JhY2tlbmQvY29tbWFuZHMvYXN5bmMuYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9h c3luYy5jCkBAIC0yNCw4ICsyNCwxMCBAQAogICoJICBBbGwgbm90aWZpY2F0aW9uIG1lc3Nh Z2VzIGFyZSBwbGFjZWQgaW4gdGhlIHF1ZXVlIGFuZCBsYXRlciByZWFkIG91dAogICoJICBi eSBsaXN0ZW5pbmcgYmFja2VuZHMuCiAgKgotICoJICBUaGVyZSBpcyBubyBjZW50cmFsIGtu b3dsZWRnZSBvZiB3aGljaCBiYWNrZW5kIGxpc3RlbnMgb24gd2hpY2ggY2hhbm5lbDsKLSAq CSAgZXZlcnkgYmFja2VuZCBoYXMgaXRzIG93biBsaXN0IG9mIGludGVyZXN0aW5nIGNoYW5u ZWxzLgorICoJICBXZSBhbHNvIG1haW50YWluIGEgZHluYW1pYyBzaGFyZWQgaGFzaCB0YWJs ZSAoZHNoYXNoKSB0aGF0IG1hcHMgY2hhbm5lbAorICoJICBuYW1lcyB0byB0aGUgc2V0IG9m IGJhY2tlbmRzIGxpc3RlbmluZyBvbiBlYWNoIGNoYW5uZWwuIFRoaXMgdGFibGUgaXMKKyAq CSAgY3JlYXRlZCBsYXppbHkgb24gdGhlIGZpcnN0IExJU1RFTiBjb21tYW5kIGFuZCBncm93 cyBkeW5hbWljYWxseSBhcworICoJICBuZWVkZWQuCiAgKgogICoJICBBbHRob3VnaCB0aGVy ZSBpcyBvbmx5IG9uZSBxdWV1ZSwgbm90aWZpY2F0aW9ucyBhcmUgdHJlYXRlZCBhcyBiZWlu ZwogICoJICBkYXRhYmFzZS1sb2NhbDsgdGhpcyBpcyBkb25lIGJ5IGluY2x1ZGluZyB0aGUg c2VuZGVyJ3MgZGF0YWJhc2UgT0lECkBAIC03MSwxMyArNzMsMTcgQEAKICAqCSAgbWFrZSBh bnkgYWN0dWFsIHVwZGF0ZXMgdG8gdGhlIGVmZmVjdGl2ZSBsaXN0ZW4gc3RhdGUgKGxpc3Rl bkNoYW5uZWxzKS4KICAqCSAgVGhlbiB3ZSBzaWduYWwgYW55IGJhY2tlbmRzIHRoYXQgbWF5 IGJlIGludGVyZXN0ZWQgaW4gb3VyIG1lc3NhZ2VzCiAgKgkgIChpbmNsdWRpbmcgb3VyIG93 biBiYWNrZW5kLCBpZiBsaXN0ZW5pbmcpLiAgVGhpcyBpcyBkb25lIGJ5Ci0gKgkgIFNpZ25h bEJhY2tlbmRzKCksIHdoaWNoIHNjYW5zIHRoZSBsaXN0IG9mIGxpc3RlbmluZyBiYWNrZW5k cyBhbmQgc2VuZHMgYQotICoJICBQUk9DU0lHX05PVElGWV9JTlRFUlJVUFQgc2lnbmFsIHRv IGV2ZXJ5IGxpc3RlbmluZyBiYWNrZW5kICh3ZSBkb24ndAotICoJICBrbm93IHdoaWNoIGJh Y2tlbmQgaXMgbGlzdGVuaW5nIG9uIHdoaWNoIGNoYW5uZWwgc28gd2UgbXVzdCBzaWduYWwg dGhlbQotICoJICBhbGwpLiAgV2UgY2FuIGV4Y2x1ZGUgYmFja2VuZHMgdGhhdCBhcmUgYWxy ZWFkeSB1cCB0byBkYXRlLCB0aG91Z2gsIGFuZAotICoJICB3ZSBjYW4gYWxzbyBleGNsdWRl IGJhY2tlbmRzIHRoYXQgYXJlIGluIG90aGVyIGRhdGFiYXNlcyAodW5sZXNzIHRoZXkKLSAq CSAgYXJlIHdheSBiZWhpbmQgYW5kIHNob3VsZCBiZSBraWNrZWQgdG8gbWFrZSB0aGVtIGFk dmFuY2UgdGhlaXIKLSAqCSAgcG9pbnRlcnMpLgorICoJICBTaWduYWxCYWNrZW5kcygpLCB3 aGljaCBjb25zdWx0cyB0aGUgc2hhcmVkIGNoYW5uZWwgaGFzaCB0YWJsZSB0bworICoJICBp ZGVudGlmeSBsaXN0ZW5lcnMgZm9yIHRoZSBjaGFubmVscyB0aGF0IGhhdmUgcGVuZGluZyBu b3RpZmljYXRpb25zCisgKgkgIGluIHRoZSBjdXJyZW50IGRhdGFiYXNlLiAgRWFjaCBzZWxl Y3RlZCBiYWNrZW5kIGlzIG1hcmtlZCBhcyBoYXZpbmcgYQorICoJICB3YWtldXAgcGVuZGlu ZyB0byBhdm9pZCBkdXBsaWNhdGUgc2lnbmFscywgYW5kIGEgUFJPQ1NJR19OT1RJRllfSU5U RVJSVVBUCisgKgkgIHNpZ25hbCBpcyBzZW50IHRvIGl0LgorICoKKyAqCSAgVG8gbWFpbnRh aW4gcXVldWUgaGVhbHRoLCBTaWduYWxCYWNrZW5kcygpIGFsc28gd2FrZXMgb25lIGJhY2tl bmQKKyAqCSAgcG9zaXRpb25lZCBhdCB0aGUgZ2xvYmFsIHF1ZXVlIHRhaWwgdG8gaGVscCBh ZHZhbmNlIGl0LCBhbmQgc2lnbmFscworICoJICBhbnkgYmFja2VuZCB0aGF0IGhhcyBmYWxs ZW4gdG9vIGZhciBiZWhpbmQgdG8gY2F0Y2ggdXAuICBUaGVzZSBtZWFzdXJlcworICoJICBw cmV2ZW50IHRoZSBub3RpZmljYXRpb24gcXVldWUgZnJvbSBncm93aW5nIGluZGVmaW5pdGVs eSwgd2hpbGUgbW9zdGx5CisgKgkgIGxpbWl0aW5nIHdha2V1cHMgdG8gdGhlIGJhY2tlbmRz IHRoYXQgYWN0dWFsbHkgbmVlZCB0aGVtLgogICoKICAqCSAgRmluYWxseSwgYWZ0ZXIgd2Ug YXJlIG91dCBvZiB0aGUgdHJhbnNhY3Rpb24gYWx0b2dldGhlciBhbmQgYWJvdXQgdG8gZ28K ICAqCSAgaWRsZSwgd2Ugc2NhbiB0aGUgcXVldWUgZm9yIG1lc3NhZ2VzIHRoYXQgbmVlZCB0 byBiZSBzZW50IHRvIG91cgpAQCAtMTI4LDYgKzEzNCw3IEBACiAjaW5jbHVkZSA8bGltaXRz Lmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVk ZSA8c3RyaW5nLmg+CiAKICNpbmNsdWRlICJhY2Nlc3MvcGFyYWxsZWwuaCIKICNpbmNsdWRl ICJhY2Nlc3Mvc2xydS5oIgpAQCAtMTM3LDE0ICsxNDQsMTcgQEAKICNpbmNsdWRlICJjb21t YW5kcy9hc3luYy5oIgogI2luY2x1ZGUgImNvbW1vbi9oYXNoZm4uaCIKICNpbmNsdWRlICJm dW5jYXBpLmgiCisjaW5jbHVkZSAibGliL2RzaGFzaC5oIgogI2luY2x1ZGUgImxpYnBxL2xp YnBxLmgiCiAjaW5jbHVkZSAibGlicHEvcHFmb3JtYXQuaCIKICNpbmNsdWRlICJtaXNjYWRt aW4uaCIKKyNpbmNsdWRlICJzdG9yYWdlL2RzbV9yZWdpc3RyeS5oIgogI2luY2x1ZGUgInN0 b3JhZ2UvaXBjLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9sbWdyLmgiCiAjaW5jbHVkZSAic3Rv cmFnZS9wcm9jc2lnbmFsLmgiCiAjaW5jbHVkZSAidGNvcC90Y29wcHJvdC5oIgogI2luY2x1 ZGUgInV0aWxzL2J1aWx0aW5zLmgiCisjaW5jbHVkZSAidXRpbHMvZHNhLmgiCiAjaW5jbHVk ZSAidXRpbHMvZ3VjX2hvb2tzLmgiCiAjaW5jbHVkZSAidXRpbHMvbWVtdXRpbHMuaCIKICNp bmNsdWRlICJ1dGlscy9wc19zdGF0dXMuaCIKQEAgLTE2Miw2ICsxNzIsMjkgQEAKICAqLwog I2RlZmluZSBOT1RJRllfUEFZTE9BRF9NQVhfTEVOR1RICShCTENLU1ogLSBOQU1FREFUQUxF TiAtIDEyOCkKIAorLyoKKyAqIENoYW5uZWwgaGFzaCB0YWJsZSBkZWZpbml0aW9ucworICoK KyAqIFRoaXMgaGFzaCB0YWJsZSBtYXBzIChkYXRhYmFzZSBPSUQsIGNoYW5uZWwgbmFtZSkg a2V5cyB0byBhcnJheXMgb2YKKyAqIFByb2NOdW1iZXJzIHJlcHJlc2VudGluZyB0aGUgYmFj a2VuZHMgbGlzdGVuaW5nIG9uIGVhY2ggY2hhbm5lbC4KKyAqLworCisjZGVmaW5lIElOSVRJ QUxfTElTVEVORVJTX0FSUkFZX1NJWkUgNAorCit0eXBlZGVmIHN0cnVjdCBDaGFubmVsSGFz aEtleQoreworCU9pZAkJCWRib2lkOworCWNoYXIJCWNoYW5uZWxbTkFNRURBVEFMRU5dOwor fSBDaGFubmVsSGFzaEtleTsKKwordHlwZWRlZiBzdHJ1Y3QgQ2hhbm5lbEVudHJ5Cit7CisJ Q2hhbm5lbEhhc2hLZXkga2V5OworCWRzYV9wb2ludGVyIGxpc3RlbmVyc19hcnJheTsJLyog RFNBIHBvaW50ZXIgdG8gUHJvY051bWJlciBhcnJheSAqLworCWludAkJCW51bV9saXN0ZW5l cnM7CS8qIE51bWJlciBvZiBsaXN0ZW5lcnMgY3VycmVudGx5IHN0b3JlZCAqLworCWludAkJ CWFsbG9jYXRlZF9saXN0ZW5lcnM7CS8qIEFsbG9jYXRlZCBzaXplIG9mIGFycmF5ICovCit9 IENoYW5uZWxFbnRyeTsKKwogLyoKICAqIFN0cnVjdCByZXByZXNlbnRpbmcgYW4gZW50cnkg aW4gdGhlIGdsb2JhbCBub3RpZnkgcXVldWUKICAqCkBAIC0yMjcsOCArMjYwLDggQEAgdHlw ZWRlZiBzdHJ1Y3QgUXVldWVQb3NpdGlvbgogLyoKICAqIFBhcmFtZXRlciBkZXRlcm1pbmlu ZyBob3cgb2Z0ZW4gd2UgdHJ5IHRvIGFkdmFuY2UgdGhlIHRhaWwgcG9pbnRlcjoKICAqIHdl IGRvIHRoYXQgYWZ0ZXIgZXZlcnkgUVVFVUVfQ0xFQU5VUF9ERUxBWSBwYWdlcyBvZiBOT1RJ RlkgZGF0YS4gIFRoaXMgaXMKLSAqIGFsc28gdGhlIGRpc3RhbmNlIGJ5IHdoaWNoIGEgYmFj a2VuZCBpbiBhbm90aGVyIGRhdGFiYXNlIG5lZWRzIHRvIGJlCi0gKiBiZWhpbmQgYmVmb3Jl IHdlJ2xsIGRlY2lkZSB3ZSBuZWVkIHRvIHdha2UgaXQgdXAgdG8gYWR2YW5jZSBpdHMgcG9p bnRlci4KKyAqIGFsc28gdGhlIGRpc3RhbmNlIGJ5IHdoaWNoIGEgYmFja2VuZCBuZWVkcyB0 byBiZSBiZWhpbmQgYmVmb3JlIHdlJ2xsCisgKiBkZWNpZGUgd2UgbmVlZCB0byB3YWtlIGl0 IHVwIHRvIGFkdmFuY2UgaXRzIHBvaW50ZXIuCiAgKgogICogUmVzaXN0IHRoZSB0ZW1wdGF0 aW9uIHRvIG1ha2UgdGhpcyByZWFsbHkgbGFyZ2UuICBXaGlsZSB0aGF0IHdvdWxkIHNhdmUK ICAqIHdvcmsgaW4gc29tZSBwbGFjZXMsIGl0IHdvdWxkIGFkZCBjb3N0IGluIG90aGVycy4g IEluIHBhcnRpY3VsYXIsIHRoaXMKQEAgLTI0Niw2ICsyNzksNyBAQCB0eXBlZGVmIHN0cnVj dCBRdWV1ZUJhY2tlbmRTdGF0dXMKIAlPaWQJCQlkYm9pZDsJCQkvKiBiYWNrZW5kJ3MgZGF0 YWJhc2UgT0lELCBvciBJbnZhbGlkT2lkICovCiAJUHJvY051bWJlcgluZXh0TGlzdGVuZXI7 CS8qIGlkIG9mIG5leHQgbGlzdGVuZXIsIG9yIElOVkFMSURfUFJPQ19OVU1CRVIgKi8KIAlR dWV1ZVBvc2l0aW9uIHBvczsJCQkvKiBiYWNrZW5kIGhhcyByZWFkIHF1ZXVlIHVwIHRvIGhl cmUgKi8KKwlib29sCQl3YWtldXBfcGVuZGluZzsgLyogc2lnbmFsIHNlbnQgYnV0IG5vdCB5 ZXQgcHJvY2Vzc2VkICovCiB9IFF1ZXVlQmFja2VuZFN0YXR1czsKIAogLyoKQEAgLTI4OCwx MSArMzIyLDkxIEBAIHR5cGVkZWYgc3RydWN0IEFzeW5jUXVldWVDb250cm9sCiAJUHJvY051 bWJlcglmaXJzdExpc3RlbmVyOwkvKiBpZCBvZiBmaXJzdCBsaXN0ZW5lciwgb3IKIAkJCQkJ CQkJICogSU5WQUxJRF9QUk9DX05VTUJFUiAqLwogCVRpbWVzdGFtcFR6IGxhc3RRdWV1ZUZp bGxXYXJuOwkvKiB0aW1lIG9mIGxhc3QgcXVldWUtZnVsbCBtc2cgKi8KKwlkc2FfaGFuZGxl CWNoYW5uZWxfaGFzaF9kc2E7CisJZHNoYXNoX3RhYmxlX2hhbmRsZSBjaGFubmVsX2hhc2hf ZHNoOwogCVF1ZXVlQmFja2VuZFN0YXR1cyBiYWNrZW5kW0ZMRVhJQkxFX0FSUkFZX01FTUJF Ul07CiB9IEFzeW5jUXVldWVDb250cm9sOwogCiBzdGF0aWMgQXN5bmNRdWV1ZUNvbnRyb2wg KmFzeW5jUXVldWVDb250cm9sOwogCitzdGF0aWMgZHNhX2FyZWEgKmNoYW5uZWxfZHNhID0g TlVMTDsKK3N0YXRpYyBkc2hhc2hfdGFibGUgKmNoYW5uZWxfaGFzaCA9IE5VTEw7CitzdGF0 aWMgZHNoYXNoX2hhc2ggY2hhbm5lbF9oYXNoX2Z1bmMoY29uc3Qgdm9pZCAqa2V5LCBzaXpl X3Qgc2l6ZSwgdm9pZCAqYXJnKTsKKworLyogcGFyYW1ldGVycyBmb3IgdGhlIGNoYW5uZWwg aGFzaCB0YWJsZSAqLworc3RhdGljIGNvbnN0IGRzaGFzaF9wYXJhbWV0ZXJzIGNoYW5uZWxf ZHNoX3BhcmFtcyA9IHsKKwlzaXplb2YoQ2hhbm5lbEhhc2hLZXkpLAorCXNpemVvZihDaGFu bmVsRW50cnkpLAorCWRzaGFzaF9tZW1jbXAsCisJY2hhbm5lbF9oYXNoX2Z1bmMsCisJZHNo YXNoX21lbWNweSwKKwlMV1RSQU5DSEVfTk9USUZZX0NIQU5ORUxfSEFTSAorfTsKKworLyoK KyAqIGNoYW5uZWxfaGFzaF9mdW5jCisgKgkJSGFzaCBmdW5jdGlvbiBmb3IgY2hhbm5lbCBr ZXlzLgorICovCitzdGF0aWMgZHNoYXNoX2hhc2gKK2NoYW5uZWxfaGFzaF9mdW5jKGNvbnN0 IHZvaWQgKmtleSwgc2l6ZV90IHNpemUsIHZvaWQgKmFyZykKK3sKKwljb25zdCBDaGFubmVs SGFzaEtleSAqayA9IChjb25zdCBDaGFubmVsSGFzaEtleSAqKSBrZXk7CisJZHNoYXNoX2hh c2ggaDsKKworCWggPSBEYXR1bUdldFVJbnQzMihoYXNoX3VpbnQzMihrLT5kYm9pZCkpOwor CWggXj0gRGF0dW1HZXRVSW50MzIoaGFzaF9hbnkoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikg ay0+Y2hhbm5lbCwKKwkJCQkJCQkJIHN0cm5sZW4oay0+Y2hhbm5lbCwgTkFNRURBVEFMRU4p KSk7CisKKwlyZXR1cm4gaDsKK30KKworLyoKKyAqIGluaXRfY2hhbm5lbF9oYXNoCisgKgkJ TGF6eSBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2hhbm5lbCBoYXNoIHRhYmxlLgorICovCitz dGF0aWMgdm9pZAoraW5pdF9jaGFubmVsX2hhc2godm9pZCkKK3sKKwlNZW1vcnlDb250ZXh0 IG9sZGNvbnRleHQ7CisKKwkvKiBRdWljayBleGl0IGlmIHdlIGFscmVhZHkgZGlkIHRoaXMg Ki8KKwlpZiAoYXN5bmNRdWV1ZUNvbnRyb2wtPmNoYW5uZWxfaGFzaF9kc2ggIT0gRFNIQVNI X0hBTkRMRV9JTlZBTElEICYmCisJCWNoYW5uZWxfaGFzaCAhPSBOVUxMKQorCQlyZXR1cm47 CisKKwkvKiBPdGhlcndpc2UsIHVzZSBhIGxvY2sgdG8gZW5zdXJlIG9ubHkgb25lIHByb2Nl c3MgY3JlYXRlcyB0aGUgdGFibGUgKi8KKwlMV0xvY2tBY3F1aXJlKE5vdGlmeVF1ZXVlTG9j aywgTFdfRVhDTFVTSVZFKTsKKworCS8qIEJlIHN1cmUgYW55IGxvY2FsIG1lbW9yeSBhbGxv Y2F0ZWQgYnkgRFNBIHJvdXRpbmVzIGlzIHBlcnNpc3RlbnQgKi8KKwlvbGRjb250ZXh0ID0g TWVtb3J5Q29udGV4dFN3aXRjaFRvKFRvcE1lbW9yeUNvbnRleHQpOworCisJaWYgKGFzeW5j UXVldWVDb250cm9sLT5jaGFubmVsX2hhc2hfZHNoID09IERTSEFTSF9IQU5ETEVfSU5WQUxJ RCkKKwl7CisJCS8qIEluaXRpYWxpemUgZHluYW1pYyBzaGFyZWQgaGFzaCB0YWJsZSBmb3Ig Y2hhbm5lbCBoYXNoICovCisJCWNoYW5uZWxfZHNhID0gZHNhX2NyZWF0ZShMV1RSQU5DSEVf Tk9USUZZX0NIQU5ORUxfSEFTSCk7CisJCWRzYV9waW4oY2hhbm5lbF9kc2EpOworCQlkc2Ff cGluX21hcHBpbmcoY2hhbm5lbF9kc2EpOworCQljaGFubmVsX2hhc2ggPSBkc2hhc2hfY3Jl YXRlKGNoYW5uZWxfZHNhLCAmY2hhbm5lbF9kc2hfcGFyYW1zLCBOVUxMKTsKKworCQkvKiBT dG9yZSBoYW5kbGVzIGluIHNoYXJlZCBtZW1vcnkgZm9yIG90aGVyIGJhY2tlbmRzIHRvIHVz ZSAqLworCQlhc3luY1F1ZXVlQ29udHJvbC0+Y2hhbm5lbF9oYXNoX2RzYSA9IGRzYV9nZXRf aGFuZGxlKGNoYW5uZWxfZHNhKTsKKwkJYXN5bmNRdWV1ZUNvbnRyb2wtPmNoYW5uZWxfaGFz aF9kc2ggPQorCQkJZHNoYXNoX2dldF9oYXNoX3RhYmxlX2hhbmRsZShjaGFubmVsX2hhc2gp OworCX0KKwllbHNlIGlmICghY2hhbm5lbF9oYXNoKQorCXsKKwkJLyogQXR0YWNoIHRvIGV4 aXN0aW5nIGR5bmFtaWMgc2hhcmVkIGhhc2ggdGFibGUgKi8KKwkJY2hhbm5lbF9kc2EgPSBk c2FfYXR0YWNoKGFzeW5jUXVldWVDb250cm9sLT5jaGFubmVsX2hhc2hfZHNhKTsKKwkJZHNh X3Bpbl9tYXBwaW5nKGNoYW5uZWxfZHNhKTsKKwkJY2hhbm5lbF9oYXNoID0gZHNoYXNoX2F0 dGFjaChjaGFubmVsX2RzYSwgJmNoYW5uZWxfZHNoX3BhcmFtcywKKwkJCQkJCQkJCSBhc3lu Y1F1ZXVlQ29udHJvbC0+Y2hhbm5lbF9oYXNoX2RzaCwKKwkJCQkJCQkJCSBOVUxMKTsKKwl9 CisKKwlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7CisJTFdMb2NrUmVsZWFz ZShOb3RpZnlRdWV1ZUxvY2spOworfQorCiAjZGVmaW5lIFFVRVVFX0hFQUQJCQkJCShhc3lu Y1F1ZXVlQ29udHJvbC0+aGVhZCkKICNkZWZpbmUgUVVFVUVfVEFJTAkJCQkJKGFzeW5jUXVl dWVDb250cm9sLT50YWlsKQogI2RlZmluZSBRVUVVRV9TVE9QX1BBR0UJCQkJKGFzeW5jUXVl dWVDb250cm9sLT5zdG9wUGFnZSkKQEAgLTMwMSw2ICs0MTUsNyBAQCBzdGF0aWMgQXN5bmNR dWV1ZUNvbnRyb2wgKmFzeW5jUXVldWVDb250cm9sOwogI2RlZmluZSBRVUVVRV9CQUNLRU5E X0RCT0lEKGkpCQkoYXN5bmNRdWV1ZUNvbnRyb2wtPmJhY2tlbmRbaV0uZGJvaWQpCiAjZGVm aW5lIFFVRVVFX05FWFRfTElTVEVORVIoaSkJCShhc3luY1F1ZXVlQ29udHJvbC0+YmFja2Vu ZFtpXS5uZXh0TGlzdGVuZXIpCiAjZGVmaW5lIFFVRVVFX0JBQ0tFTkRfUE9TKGkpCQkoYXN5 bmNRdWV1ZUNvbnRyb2wtPmJhY2tlbmRbaV0ucG9zKQorI2RlZmluZSBRVUVVRV9CQUNLRU5E X1dBS0VVUF9QRU5ESU5HKGkpCShhc3luY1F1ZXVlQ29udHJvbC0+YmFja2VuZFtpXS53YWtl dXBfcGVuZGluZykKIAogLyoKICAqIFRoZSBTTFJVIGJ1ZmZlciBhcmVhIHRocm91Z2ggd2hp Y2ggd2UgYWNjZXNzIHRoZSBub3RpZmljYXRpb24gcXVldWUKQEAgLTQ1Nyw2ICs1NzIsMTAg QEAgc3RhdGljIHZvaWQgQWRkRXZlbnRUb1BlbmRpbmdOb3RpZmllcyhOb3RpZmljYXRpb24g Km4pOwogc3RhdGljIHVpbnQzMiBub3RpZmljYXRpb25faGFzaChjb25zdCB2b2lkICprZXks IFNpemUga2V5c2l6ZSk7CiBzdGF0aWMgaW50CW5vdGlmaWNhdGlvbl9tYXRjaChjb25zdCB2 b2lkICprZXkxLCBjb25zdCB2b2lkICprZXkyLCBTaXplIGtleXNpemUpOwogc3RhdGljIHZv aWQgQ2xlYXJQZW5kaW5nQWN0aW9uc0FuZE5vdGlmaWVzKHZvaWQpOworc3RhdGljIGlubGlu ZSB2b2lkIENoYW5uZWxIYXNoUHJlcGFyZUtleShDaGFubmVsSGFzaEtleSAqa2V5LCBPaWQg ZGJvaWQsIGNvbnN0IGNoYXIgKmNoYW5uZWwpOworc3RhdGljIHZvaWQgQ2hhbm5lbEhhc2hB ZGRMaXN0ZW5lcihjb25zdCBjaGFyICpjaGFubmVsKTsKK3N0YXRpYyB2b2lkIENoYW5uZWxI YXNoUmVtb3ZlTGlzdGVuZXIoY29uc3QgY2hhciAqY2hhbm5lbCk7CitzdGF0aWMgTGlzdCAq R2V0UGVuZGluZ05vdGlmeUNoYW5uZWxzKHZvaWQpOwogCiAvKgogICogQ29tcHV0ZSB0aGUg ZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBxdWV1ZSBwYWdlIG51bWJlcnMuCkBAIC01MjEsMTIg KzY0MCwxNiBAQCBBc3luY1NobWVtSW5pdCh2b2lkKQogCQlRVUVVRV9TVE9QX1BBR0UgPSAw OwogCQlRVUVVRV9GSVJTVF9MSVNURU5FUiA9IElOVkFMSURfUFJPQ19OVU1CRVI7CiAJCWFz eW5jUXVldWVDb250cm9sLT5sYXN0UXVldWVGaWxsV2FybiA9IDA7CisJCWFzeW5jUXVldWVD b250cm9sLT5jaGFubmVsX2hhc2hfZHNhID0gRFNBX0hBTkRMRV9JTlZBTElEOworCQlhc3lu Y1F1ZXVlQ29udHJvbC0+Y2hhbm5lbF9oYXNoX2RzaCA9IERTSEFTSF9IQU5ETEVfSU5WQUxJ RDsKKwogCQlmb3IgKGludCBpID0gMDsgaSA8IE1heEJhY2tlbmRzOyBpKyspCiAJCXsKIAkJ CVFVRVVFX0JBQ0tFTkRfUElEKGkpID0gSW52YWxpZFBpZDsKIAkJCVFVRVVFX0JBQ0tFTkRf REJPSUQoaSkgPSBJbnZhbGlkT2lkOwogCQkJUVVFVUVfTkVYVF9MSVNURU5FUihpKSA9IElO VkFMSURfUFJPQ19OVU1CRVI7CiAJCQlTRVRfUVVFVUVfUE9TKFFVRVVFX0JBQ0tFTkRfUE9T KGkpLCAwLCAwKTsKKwkJCVFVRVVFX0JBQ0tFTkRfV0FLRVVQX1BFTkRJTkcoaSkgPSBmYWxz ZTsKIAkJfQogCX0KIApAQCAtMTE1Miw2ICsxMjc1LDcgQEAgRXhlY19MaXN0ZW5Db21taXQo Y29uc3QgY2hhciAqY2hhbm5lbCkKIAlvbGRjb250ZXh0ID0gTWVtb3J5Q29udGV4dFN3aXRj aFRvKFRvcE1lbW9yeUNvbnRleHQpOwogCWxpc3RlbkNoYW5uZWxzID0gbGFwcGVuZChsaXN0 ZW5DaGFubmVscywgcHN0cmR1cChjaGFubmVsKSk7CiAJTWVtb3J5Q29udGV4dFN3aXRjaFRv KG9sZGNvbnRleHQpOworCUNoYW5uZWxIYXNoQWRkTGlzdGVuZXIoY2hhbm5lbCk7CiB9CiAK IC8qCkBAIC0xMTc1LDYgKzEyOTksNyBAQCBFeGVjX1VubGlzdGVuQ29tbWl0KGNvbnN0IGNo YXIgKmNoYW5uZWwpCiAJCXsKIAkJCWxpc3RlbkNoYW5uZWxzID0gZm9yZWFjaF9kZWxldGVf Y3VycmVudChsaXN0ZW5DaGFubmVscywgcSk7CiAJCQlwZnJlZShsY2hhbik7CisJCQlDaGFu bmVsSGFzaFJlbW92ZUxpc3RlbmVyKGNoYW5uZWwpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBA IC0xMTkzLDkgKzEzMTgsMTggQEAgRXhlY19Vbmxpc3RlbkNvbW1pdChjb25zdCBjaGFyICpj aGFubmVsKQogc3RhdGljIHZvaWQKIEV4ZWNfVW5saXN0ZW5BbGxDb21taXQodm9pZCkKIHsK KwlMaXN0Q2VsbCAgICpsYzsKKwogCWlmIChUcmFjZV9ub3RpZnkpCiAJCWVsb2coREVCVUcx LCAiRXhlY19Vbmxpc3RlbkFsbENvbW1pdCglZCkiLCBNeVByb2NQaWQpOwogCisJZm9yZWFj aChsYywgbGlzdGVuQ2hhbm5lbHMpCisJeworCQljaGFyCSAgICpjaGFubmVsID0gKGNoYXIg KikgbGZpcnN0KGxjKTsKKworCQlDaGFubmVsSGFzaFJlbW92ZUxpc3RlbmVyKGNoYW5uZWwp OworCX0KKwogCWxpc3RfZnJlZV9kZWVwKGxpc3RlbkNoYW5uZWxzKTsKIAlsaXN0ZW5DaGFu bmVscyA9IE5JTDsKIH0KQEAgLTE1NjUsMTIgKzE2OTksMTYgQEAgYXN5bmNRdWV1ZUZpbGxX YXJuaW5nKHZvaWQpCiAvKgogICogU2VuZCBzaWduYWxzIHRvIGxpc3RlbmluZyBiYWNrZW5k cy4KICAqCi0gKiBOb3JtYWxseSB3ZSBzaWduYWwgb25seSBiYWNrZW5kcyBpbiBvdXIgb3du IGRhdGFiYXNlLCBzaW5jZSBvbmx5IHRob3NlCi0gKiBiYWNrZW5kcyBjb3VsZCBiZSBpbnRl cmVzdGVkIGluIG5vdGlmaWVzIHdlIHNlbmQuICBIb3dldmVyLCBpZiB0aGVyZSdzCi0gKiBu b3RpZnkgdHJhZmZpYyBpbiBvdXIgZGF0YWJhc2UgYnV0IG5vIHRyYWZmaWMgaW4gYW5vdGhl ciBkYXRhYmFzZSB0aGF0Ci0gKiBkb2VzIGhhdmUgbGlzdGVuZXIocyksIHRob3NlIGxpc3Rl bmVycyB3aWxsIGZhbGwgZnVydGhlciBhbmQgZnVydGhlcgotICogYmVoaW5kLiAgV2FrZW4g dGhlbSBhbnl3YXkgaWYgdGhleSdyZSBmYXIgZW5vdWdoIGJlaGluZCwgc28gdGhhdCB0aGV5 J2xsCi0gKiBhZHZhbmNlIHRoZWlyIHF1ZXVlIHBvc2l0aW9uIHBvaW50ZXJzLCBhbGxvd2lu ZyB0aGUgZ2xvYmFsIHRhaWwgdG8gYWR2YW5jZS4KKyAqIE5vcm1hbGx5IHdlIHNpZ25hbCBv bmx5IGJhY2tlbmRzIHJlZ2lzdGVyZWQgYXMgbGlzdGVuZXJzIGZvciBjaGFubmVscworICog d2l0aCBwZW5kaW5nIG5vdGlmaWNhdGlvbnMuICBIb3dldmVyLCB3aGVuIHRoZXJlIGlzIG5v IHRyYWZmaWMgb24gc29tZQorICogY2hhbm5lbHMsIGxpc3RlbmVycyBvbiBzdWNoIGNoYW5u ZWxzIHdpbGwgZmFsbCBmdXJ0aGVyIGFuZCBmdXJ0aGVyCisgKiBiZWhpbmQuICBXYWtlbiB0 aGVtIGlmIHRoZXkgYXJlIHRvbyBmYXIgYmVoaW5kLCBzbyB0aGF0IHRoZXknbGwKKyAqIGFk dmFuY2UgdGhlaXIgcXVldWUgcG9zaXRpb24gcG9pbnRlcnMsIGFsbG93aW5nIHRoZSBnbG9i YWwgdGFpbCB0bworICogYWR2YW5jZS4KKyAqCisgKiBUbyBzdGFnZ2VyIHdha2V1cHMgb2Yg bGFnZ2luZyBiYWNrZW5kcywgd2FrZSB0aGUgYmFja2VuZCBmdXJ0aGVzdAorICogYmVoaW5k IChhdCB0aGUgdGFpbCksIGFtb3J0aXppbmcgdGhlIGNvbnRleHQtc3dpdGNoaW5nIGNvc3Qg YWNyb3NzCisgKiBzdWNjZXNzaXZlIG5vdGlmaWNhdGlvbnMgaW5zdGVhZCBvZiBwYXlpbmcg aXQgYWxsIGF0IG9uY2UuCiAgKgogICogU2luY2Ugd2Uga25vdyB0aGUgUHJvY051bWJlciBh bmQgdGhlIFBpZCB0aGUgc2lnbmFsaW5nIGlzIHF1aXRlIGNoZWFwLgogICoKQEAgLTE1ODMs NiArMTcyMSwxMCBAQCBTaWduYWxCYWNrZW5kcyh2b2lkKQogCWludDMyCSAgICpwaWRzOwog CVByb2NOdW1iZXIgKnByb2Nub3M7CiAJaW50CQkJY291bnQ7CisJTGlzdAkgICAqY2hhbm5l bHM7CisJTGlzdENlbGwgICAqbGM7CisJYm9vbAkgICAqc2lnbmFsZWQ7CisJaW50NjQJCXF1 ZXVlX2xlbmd0aDsKIAogCS8qCiAJICogSWRlbnRpZnkgYmFja2VuZHMgdGhhdCB3ZSBuZWVk IHRvIHNpZ25hbC4gIFdlIGRvbid0IHdhbnQgdG8gc2VuZApAQCAtMTU5NCwzOSArMTczNiwx MTcgQEAgU2lnbmFsQmFja2VuZHModm9pZCkKIAkgKi8KIAlwaWRzID0gKGludDMyICopIHBh bGxvYyhNYXhCYWNrZW5kcyAqIHNpemVvZihpbnQzMikpOwogCXByb2Nub3MgPSAoUHJvY051 bWJlciAqKSBwYWxsb2MoTWF4QmFja2VuZHMgKiBzaXplb2YoUHJvY051bWJlcikpOworCXNp Z25hbGVkID0gKGJvb2wgKikgcGFsbG9jMChNYXhCYWNrZW5kcyAqIHNpemVvZihib29sKSk7 CiAJY291bnQgPSAwOwogCisJY2hhbm5lbHMgPSBHZXRQZW5kaW5nTm90aWZ5Q2hhbm5lbHMo KTsKKwogCUxXTG9ja0FjcXVpcmUoTm90aWZ5UXVldWVMb2NrLCBMV19FWENMVVNJVkUpOwot CWZvciAoUHJvY051bWJlciBpID0gUVVFVUVfRklSU1RfTElTVEVORVI7IGkgIT0gSU5WQUxJ RF9QUk9DX05VTUJFUjsgaSA9IFFVRVVFX05FWFRfTElTVEVORVIoaSkpCisJZm9yZWFjaChs YywgY2hhbm5lbHMpCiAJewotCQlpbnQzMgkJcGlkID0gUVVFVUVfQkFDS0VORF9QSUQoaSk7 Ci0JCVF1ZXVlUG9zaXRpb24gcG9zOworCQljaGFyCSAgICpjaGFubmVsID0gKGNoYXIgKikg bGZpcnN0KGxjKTsKKwkJQ2hhbm5lbEVudHJ5ICplbnRyeTsKKwkJUHJvY051bWJlciAqbGlz dGVuZXJzOworCQlDaGFubmVsSGFzaEtleSBrZXk7CiAKLQkJQXNzZXJ0KHBpZCAhPSBJbnZh bGlkUGlkKTsKLQkJcG9zID0gUVVFVUVfQkFDS0VORF9QT1MoaSk7Ci0JCWlmIChRVUVVRV9C QUNLRU5EX0RCT0lEKGkpID09IE15RGF0YWJhc2VJZCkKKwkJaWYgKGNoYW5uZWxfaGFzaCA9 PSBOVUxMKQorCQkJZW50cnkgPSBOVUxMOworCQllbHNlCiAJCXsKLQkJCS8qCi0JCQkgKiBB bHdheXMgc2lnbmFsIGxpc3RlbmVycyBpbiBvdXIgb3duIGRhdGFiYXNlLCB1bmxlc3MgdGhl eSdyZQotCQkJICogYWxyZWFkeSBjYXVnaHQgdXAgKHVubGlrZWx5LCBidXQgcG9zc2libGUp LgotCQkJICovCisJCQlDaGFubmVsSGFzaFByZXBhcmVLZXkoJmtleSwgTXlEYXRhYmFzZUlk LCBjaGFubmVsKTsKKwkJCWVudHJ5ID0gZHNoYXNoX2ZpbmQoY2hhbm5lbF9oYXNoLCAma2V5 LCB0cnVlKTsKKwkJfQorCisJCWlmIChlbnRyeSA9PSBOVUxMKQorCQkJY29udGludWU7CQkJ LyogTm8gbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgY2hhbm5lbCAqLworCisJCWxp c3RlbmVycyA9IChQcm9jTnVtYmVyICopIGRzYV9nZXRfYWRkcmVzcyhjaGFubmVsX2RzYSwK KwkJCQkJCQkJCQkJCSAgIGVudHJ5LT5saXN0ZW5lcnNfYXJyYXkpOworCisJCWZvciAoaW50 IGogPSAwOyBqIDwgZW50cnktPm51bV9saXN0ZW5lcnM7IGorKykKKwkJeworCQkJUHJvY051 bWJlcglpID0gbGlzdGVuZXJzW2pdOworCQkJaW50MzIJCXBpZDsKKwkJCVF1ZXVlUG9zaXRp b24gcG9zOworCisJCQlpZiAoc2lnbmFsZWRbaV0gfHwgUVVFVUVfQkFDS0VORF9XQUtFVVBf UEVORElORyhpKSkKKwkJCQljb250aW51ZTsKKworCQkJcG9zID0gUVVFVUVfQkFDS0VORF9Q T1MoaSk7CisJCQlwaWQgPSBRVUVVRV9CQUNLRU5EX1BJRChpKTsKKworCQkJLyogU2tpcCBp ZiBjYXVnaHQgdXAgb3Igd3JvbmcgZGF0YWJhc2UgKi8KIAkJCWlmIChRVUVVRV9QT1NfRVFV QUwocG9zLCBRVUVVRV9IRUFEKSkKIAkJCQljb250aW51ZTsKKwkJCWlmIChRVUVVRV9CQUNL RU5EX0RCT0lEKGkpICE9IE15RGF0YWJhc2VJZCkKKwkJCQljb250aW51ZTsKKworCQkJQXNz ZXJ0KHBpZCAhPSBJbnZhbGlkUGlkKTsKKworCQkJUVVFVUVfQkFDS0VORF9XQUtFVVBfUEVO RElORyhpKSA9IHRydWU7CisKKwkJCXBpZHNbY291bnRdID0gcGlkOworCQkJcHJvY25vc1tj b3VudF0gPSBpOworCQkJc2lnbmFsZWRbaV0gPSB0cnVlOworCQkJY291bnQrKzsKIAkJfQot CQllbHNlCisKKwkJZHNoYXNoX3JlbGVhc2VfbG9jayhjaGFubmVsX2hhc2gsIGVudHJ5KTsK Kwl9CisKKwlxdWV1ZV9sZW5ndGggPSBhc3luY1F1ZXVlUGFnZURpZmYoUVVFVUVfUE9TX1BB R0UoUVVFVUVfSEVBRCksCisJCQkJCQkJCQkgIFFVRVVFX1BPU19QQUdFKFFVRVVFX1RBSUwp KTsKKworCS8qIENoZWNrIGZvciBsYWdnaW5nIGJhY2tlbmRzIHdoZW4gdGhlIHF1ZXVlIHNw YW5zIG11bHRpcGxlIHBhZ2VzICovCisJaWYgKHF1ZXVlX2xlbmd0aCA+IDApCisJeworCQli b29sCQl0YWlsX3dva2VuID0gZmFsc2U7CisKKwkJZm9yIChQcm9jTnVtYmVyIGkgPSBRVUVV RV9GSVJTVF9MSVNURU5FUjsKKwkJCSBpICE9IElOVkFMSURfUFJPQ19OVU1CRVI7CisJCQkg aSA9IFFVRVVFX05FWFRfTElTVEVORVIoaSkpCiAJCXsKLQkJCS8qCi0JCQkgKiBMaXN0ZW5l cnMgaW4gb3RoZXIgZGF0YWJhc2VzIHNob3VsZCBiZSBzaWduYWxlZCBvbmx5IGlmIHRoZXkK LQkJCSAqIGFyZSBmYXIgYmVoaW5kLgotCQkJICovCi0JCQlpZiAoYXN5bmNRdWV1ZVBhZ2VE aWZmKFFVRVVFX1BPU19QQUdFKFFVRVVFX0hFQUQpLAotCQkJCQkJCQkgICBRVUVVRV9QT1Nf UEFHRShwb3MpKSA8IFFVRVVFX0NMRUFOVVBfREVMQVkpCisJCQlRdWV1ZVBvc2l0aW9uIHBv czsKKwkJCWludDY0CQlsYWc7CisJCQlpbnQzMgkJcGlkOworCisJCQlpZiAoc2lnbmFsZWRb aV0gfHwgUVVFVUVfQkFDS0VORF9XQUtFVVBfUEVORElORyhpKSkKIAkJCQljb250aW51ZTsK KworCQkJcG9zID0gUVVFVUVfQkFDS0VORF9QT1MoaSk7CisKKwkJCS8qIFNpZ25hbCBvbmUg YmFja2VuZCBwb3NpdGlvbmVkIGF0IHRoZSBnbG9iYWwgdGFpbCAqLworCQkJaWYgKCF0YWls X3dva2VuICYmIGFzeW5jUXVldWVQYWdlRGlmZihRVUVVRV9QT1NfUEFHRShRVUVVRV9UQUlM KSwKKwkJCQkJCQkJCQkJCSAgUVVFVUVfUE9TX1BBR0UocG9zKSkgPT0gMCkKKwkJCXsKKwkJ CQlwaWQgPSBRVUVVRV9CQUNLRU5EX1BJRChpKTsKKwkJCQlBc3NlcnQocGlkICE9IEludmFs aWRQaWQpOworCisJCQkJUVVFVUVfQkFDS0VORF9XQUtFVVBfUEVORElORyhpKSA9IHRydWU7 CisJCQkJcGlkc1tjb3VudF0gPSBwaWQ7CisJCQkJcHJvY25vc1tjb3VudF0gPSBpOworCQkJ CXNpZ25hbGVkW2ldID0gdHJ1ZTsKKwkJCQljb3VudCsrOworCQkJCXRhaWxfd29rZW4gPSB0 cnVlOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlsYWcgPSBhc3luY1F1ZXVlUGFnZURp ZmYoUVVFVUVfUE9TX1BBR0UoUVVFVUVfSEVBRCksCisJCQkJCQkJCQkgUVVFVUVfUE9TX1BB R0UocG9zKSk7CisKKwkJCS8qIE5lZWQgdG8gc2lnbmFsIGlmIGEgYmFja2VuZCBoYXMgZmFs bGVuIHRvbyBmYXIgYmVoaW5kICovCisJCQlpZiAobGFnID49IFFVRVVFX0NMRUFOVVBfREVM QVkpCisJCQl7CisJCQkJcGlkID0gUVVFVUVfQkFDS0VORF9QSUQoaSk7CisJCQkJQXNzZXJ0 KHBpZCAhPSBJbnZhbGlkUGlkKTsKKworCQkJCVFVRVVFX0JBQ0tFTkRfV0FLRVVQX1BFTkRJ TkcoaSkgPSB0cnVlOworCQkJCXBpZHNbY291bnRdID0gcGlkOworCQkJCXByb2Nub3NbY291 bnRdID0gaTsKKwkJCQlzaWduYWxlZFtpXSA9IHRydWU7CisJCQkJY291bnQrKzsKKwkJCX0K IAkJfQotCQkvKiBPSywgbmVlZCB0byBzaWduYWwgdGhpcyBvbmUgKi8KLQkJcGlkc1tjb3Vu dF0gPSBwaWQ7Ci0JCXByb2Nub3NbY291bnRdID0gaTsKLQkJY291bnQrKzsKIAl9CiAJTFdM b2NrUmVsZWFzZShOb3RpZnlRdWV1ZUxvY2spOwogCkBAIC0xNjU3LDYgKzE4NzcsNyBAQCBT aWduYWxCYWNrZW5kcyh2b2lkKQogCiAJcGZyZWUocGlkcyk7CiAJcGZyZWUocHJvY25vcyk7 CisJcGZyZWUoc2lnbmFsZWQpOwogfQogCiAvKgpAQCAtMTg2NSw2ICsyMDg2LDcgQEAgYXN5 bmNRdWV1ZVJlYWRBbGxOb3RpZmljYXRpb25zKHZvaWQpCiAJTFdMb2NrQWNxdWlyZShOb3Rp ZnlRdWV1ZUxvY2ssIExXX1NIQVJFRCk7CiAJLyogQXNzZXJ0IGNoZWNrcyB0aGF0IHdlIGhh dmUgYSB2YWxpZCBzdGF0ZSBlbnRyeSAqLwogCUFzc2VydChNeVByb2NQaWQgPT0gUVVFVUVf QkFDS0VORF9QSUQoTXlQcm9jTnVtYmVyKSk7CisJUVVFVUVfQkFDS0VORF9XQUtFVVBfUEVO RElORyhNeVByb2NOdW1iZXIpID0gZmFsc2U7CiAJcG9zID0gUVVFVUVfQkFDS0VORF9QT1Mo TXlQcm9jTnVtYmVyKTsKIAloZWFkID0gUVVFVUVfSEVBRDsKIAlMV0xvY2tSZWxlYXNlKE5v dGlmeVF1ZXVlTG9jayk7CkBAIC0yMzk1LDMgKzI2MTcsMTY5IEBAIGNoZWNrX25vdGlmeV9i dWZmZXJzKGludCAqbmV3dmFsLCB2b2lkICoqZXh0cmEsIEd1Y1NvdXJjZSBzb3VyY2UpCiB7 CiAJcmV0dXJuIGNoZWNrX3NscnVfYnVmZmVycygibm90aWZ5X2J1ZmZlcnMiLCBuZXd2YWwp OwogfQorCisKKy8qCisgKiBDaGFubmVsSGFzaFByZXBhcmVLZXkKKyAqCQlQcmVwYXJlIGEg Y2hhbm5lbCBrZXkgZm9yIHVzZSBhcyBhIGhhc2gga2V5LgorICovCitzdGF0aWMgaW5saW5l IHZvaWQKK0NoYW5uZWxIYXNoUHJlcGFyZUtleShDaGFubmVsSGFzaEtleSAqa2V5LCBPaWQg ZGJvaWQsIGNvbnN0IGNoYXIgKmNoYW5uZWwpCit7CisJbWVtc2V0KGtleSwgMCwgc2l6ZW9m KENoYW5uZWxIYXNoS2V5KSk7CisJa2V5LT5kYm9pZCA9IGRib2lkOworCXN0cmxjcHkoa2V5 LT5jaGFubmVsLCBjaGFubmVsLCBOQU1FREFUQUxFTik7Cit9CisKKy8qCisgKiBDaGFubmVs SGFzaEFkZExpc3RlbmVyCisgKiAgICAgUmVnaXN0ZXIgYXMgYSBsaXN0ZW5lciBmb3IgdGhl IHNwZWNpZmllZCBjaGFubmVsLgorICovCitzdGF0aWMgdm9pZAorQ2hhbm5lbEhhc2hBZGRM aXN0ZW5lcihjb25zdCBjaGFyICpjaGFubmVsKQoreworCUNoYW5uZWxIYXNoS2V5IGtleTsK KwlDaGFubmVsRW50cnkgKmVudHJ5OworCWJvb2wJCWZvdW5kOworCVByb2NOdW1iZXIgKmxp c3RlbmVyczsKKworCWluaXRfY2hhbm5lbF9oYXNoKCk7CisKKwlDaGFubmVsSGFzaFByZXBh cmVLZXkoJmtleSwgTXlEYXRhYmFzZUlkLCBjaGFubmVsKTsKKworCS8qCisJICogRm9yIG5l dyBlbnRyaWVzLCB3ZSBpbml0aWFsaXplIGxpc3RlbmVyc19hcnJheSB0byBJbnZhbGlkRHNh UG9pbnRlciBhcworCSAqIGEgbWFya2VyLiBUaGlzIGhhbmRsZXMgYm90aCB0aGUgaW5pdGlh bCBjcmVhdGlvbiBhbmQgcG90ZW50aWFsIHJldHJ5CisJICogYWZ0ZXIgT09NLgorCSAqLwor CWVudHJ5ID0gZHNoYXNoX2ZpbmRfb3JfaW5zZXJ0KGNoYW5uZWxfaGFzaCwgJmtleSwgJmZv dW5kKTsKKworCWlmICghZm91bmQpCisJCWVudHJ5LT5saXN0ZW5lcnNfYXJyYXkgPSBJbnZh bGlkRHNhUG9pbnRlcjsKKworCWlmICghRHNhUG9pbnRlcklzVmFsaWQoZW50cnktPmxpc3Rl bmVyc19hcnJheSkpCisJeworCQkvKiBGaXJzdCBsaXN0ZW5lciBmb3IgdGhpcyBjaGFubmVs ICovCisJCWVudHJ5LT5saXN0ZW5lcnNfYXJyYXkgPSBkc2FfYWxsb2NhdGUoY2hhbm5lbF9k c2EsCisJCQkJCQkJCQkJCSAgc2l6ZW9mKFByb2NOdW1iZXIpICogSU5JVElBTF9MSVNURU5F UlNfQVJSQVlfU0laRSk7CisJCWVudHJ5LT5udW1fbGlzdGVuZXJzID0gMDsKKwkJZW50cnkt PmFsbG9jYXRlZF9saXN0ZW5lcnMgPSBJTklUSUFMX0xJU1RFTkVSU19BUlJBWV9TSVpFOwor CX0KKworCWxpc3RlbmVycyA9IChQcm9jTnVtYmVyICopIGRzYV9nZXRfYWRkcmVzcyhjaGFu bmVsX2RzYSwKKwkJCQkJCQkJCQkJICAgZW50cnktPmxpc3RlbmVyc19hcnJheSk7CisKKwlm b3IgKGludCBpID0gMDsgaSA8IGVudHJ5LT5udW1fbGlzdGVuZXJzOyBpKyspCisJeworCQlp ZiAobGlzdGVuZXJzW2ldID09IE15UHJvY051bWJlcikKKwkJeworCQkJZHNoYXNoX3JlbGVh c2VfbG9jayhjaGFubmVsX2hhc2gsIGVudHJ5KTsKKwkJCXJldHVybjsJCQkJLyogQWxyZWFk eSByZWdpc3RlcmVkICovCisJCX0KKwl9CisKKwkvKiBOZWVkIHRvIGFkZCB0aGlzIGxpc3Rl bmVyICovCisJaWYgKGVudHJ5LT5udW1fbGlzdGVuZXJzID49IGVudHJ5LT5hbGxvY2F0ZWRf bGlzdGVuZXJzKQorCXsKKwkJLyogR3JvdyB0aGUgYXJyYXkgKGRvdWJsZSB0aGUgc2l6ZSkg Ki8KKwkJaW50CQkJbmV3X3NpemUgPSBlbnRyeS0+YWxsb2NhdGVkX2xpc3RlbmVycyAqIDI7 CisJCWRzYV9wb2ludGVyIG5ld19hcnJheSA9IGRzYV9hbGxvY2F0ZShjaGFubmVsX2RzYSwK KwkJCQkJCQkJCQkJIHNpemVvZihQcm9jTnVtYmVyKSAqIG5ld19zaXplKTsKKwkJUHJvY051 bWJlciAqbmV3X2xpc3RlbmVycyA9IChQcm9jTnVtYmVyICopIGRzYV9nZXRfYWRkcmVzcyhj aGFubmVsX2RzYSwKKwkJCQkJCQkJCQkJCQkJCQkgICBuZXdfYXJyYXkpOworCisJCS8qIENv cHkgZXhpc3RpbmcgbGlzdGVuZXJzICovCisJCW1lbWNweShuZXdfbGlzdGVuZXJzLCBsaXN0 ZW5lcnMsCisJCQkgICBzaXplb2YoUHJvY051bWJlcikgKiBlbnRyeS0+bnVtX2xpc3RlbmVy cyk7CisKKwkJLyogRnJlZSBvbGQgYXJyYXkgYW5kIHVwZGF0ZSBlbnRyeSAqLworCQlkc2Ff ZnJlZShjaGFubmVsX2RzYSwgZW50cnktPmxpc3RlbmVyc19hcnJheSk7CisJCWVudHJ5LT5s aXN0ZW5lcnNfYXJyYXkgPSBuZXdfYXJyYXk7CisJCWVudHJ5LT5hbGxvY2F0ZWRfbGlzdGVu ZXJzID0gbmV3X3NpemU7CisJCWxpc3RlbmVycyA9IG5ld19saXN0ZW5lcnM7CisJfQorCisJ LyogQWRkIHRoZSBuZXcgbGlzdGVuZXIgKi8KKwlsaXN0ZW5lcnNbZW50cnktPm51bV9saXN0 ZW5lcnNdID0gTXlQcm9jTnVtYmVyOworCWVudHJ5LT5udW1fbGlzdGVuZXJzKys7CisKKwlk c2hhc2hfcmVsZWFzZV9sb2NrKGNoYW5uZWxfaGFzaCwgZW50cnkpOworfQorCisvKgorICog Q2hhbm5lbEhhc2hSZW1vdmVMaXN0ZW5lcgorICoJCVVucmVnaXN0ZXIgYXMgYSBsaXN0ZW5l ciBmb3IgdGhlIHNwZWNpZmllZCBjaGFubmVsLgorICovCitzdGF0aWMgdm9pZAorQ2hhbm5l bEhhc2hSZW1vdmVMaXN0ZW5lcihjb25zdCBjaGFyICpjaGFubmVsKQoreworCUNoYW5uZWxI YXNoS2V5IGtleTsKKwlDaGFubmVsRW50cnkgKmVudHJ5OworCVByb2NOdW1iZXIgKmxpc3Rl bmVyczsKKwlpbnQJCQlpOworCisJaWYgKGNoYW5uZWxfaGFzaCA9PSBOVUxMKQorCQlyZXR1 cm47CisKKwlDaGFubmVsSGFzaFByZXBhcmVLZXkoJmtleSwgTXlEYXRhYmFzZUlkLCBjaGFu bmVsKTsKKworCWVudHJ5ID0gZHNoYXNoX2ZpbmQoY2hhbm5lbF9oYXNoLCAma2V5LCB0cnVl KTsKKwlpZiAoZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJbGlzdGVuZXJzID0gKFBy b2NOdW1iZXIgKikgZHNhX2dldF9hZGRyZXNzKGNoYW5uZWxfZHNhLAorCQkJCQkJCQkJCQkg ICBlbnRyeS0+bGlzdGVuZXJzX2FycmF5KTsKKworCWZvciAoaSA9IDA7IGkgPCBlbnRyeS0+ bnVtX2xpc3RlbmVyczsgaSsrKQorCXsKKwkJaWYgKGxpc3RlbmVyc1tpXSA9PSBNeVByb2NO dW1iZXIpCisJCXsKKwkJCS8qIEZvdW5kIGl0LCByZW1vdmUgYnkgc2hpZnRpbmcgcmVtYWlu aW5nIGVsZW1lbnRzICovCisJCQllbnRyeS0+bnVtX2xpc3RlbmVycy0tOworCQkJaWYgKGkg PCBlbnRyeS0+bnVtX2xpc3RlbmVycykKKwkJCXsKKwkJCQltZW1tb3ZlKCZsaXN0ZW5lcnNb aV0sICZsaXN0ZW5lcnNbaSArIDFdLAorCQkJCQkJc2l6ZW9mKFByb2NOdW1iZXIpICogKGVu dHJ5LT5udW1fbGlzdGVuZXJzIC0gaSkpOworCQkJfQorCisJCQlpZiAoZW50cnktPm51bV9s aXN0ZW5lcnMgPT0gMCkKKwkJCXsKKwkJCQlkc2FfZnJlZShjaGFubmVsX2RzYSwgZW50cnkt Pmxpc3RlbmVyc19hcnJheSk7CisJCQkJZHNoYXNoX2RlbGV0ZV9lbnRyeShjaGFubmVsX2hh c2gsIGVudHJ5KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlkc2hhc2hfcmVsZWFzZV9s b2NrKGNoYW5uZWxfaGFzaCwgZW50cnkpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJfQor CisJLyogTm90IGZvdW5kIGluIGxpc3QgKi8KKwlkc2hhc2hfcmVsZWFzZV9sb2NrKGNoYW5u ZWxfaGFzaCwgZW50cnkpOworfQorCisvKgorICogR2V0UGVuZGluZ05vdGlmeUNoYW5uZWxz CisgKgkJR2V0IGxpc3Qgb2YgdW5pcXVlIGNoYW5uZWwgbmFtZXMgZnJvbSBwZW5kaW5nIG5v dGlmaWNhdGlvbnMuCisgKi8KK3N0YXRpYyBMaXN0ICoKK0dldFBlbmRpbmdOb3RpZnlDaGFu bmVscyh2b2lkKQoreworCUxpc3QJICAgKmNoYW5uZWxzID0gTklMOworCUxpc3RDZWxsICAg KmxjOworCisJaWYgKCFwZW5kaW5nTm90aWZpZXMpCisJCXJldHVybiBOSUw7CisKKwlmb3Jl YWNoKGxjLCBwZW5kaW5nTm90aWZpZXMtPmV2ZW50cykKKwl7CisJCU5vdGlmaWNhdGlvbiAq biA9IChOb3RpZmljYXRpb24gKikgbGZpcnN0KGxjKTsKKwkJY2hhcgkgICAqY2hhbm5lbCA9 IG4tPmRhdGE7CisKKwkJaWYgKCFsaXN0X21lbWJlcihjaGFubmVscywgY2hhbm5lbCkpCisJ CQljaGFubmVscyA9IGxhcHBlbmQoY2hhbm5lbHMsIGNoYW5uZWwpOworCX0KKworCXJldHVy biBjaGFubmVsczsKK30KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FjdGl2aXR5 L3dhaXRfZXZlbnRfbmFtZXMudHh0IGIvc3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvd2Fp dF9ldmVudF9uYW1lcy50eHQKaW5kZXggNzU1M2Y2ZWFjZWYuLmE0ZmFkYmQwNzY3IDEwMDY0 NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hY3Rpdml0eS93YWl0X2V2ZW50X25hbWVzLnR4 dAorKysgYi9zcmMvYmFja2VuZC91dGlscy9hY3Rpdml0eS93YWl0X2V2ZW50X25hbWVzLnR4 dApAQCAtMzY2LDYgKzM2Niw3IEBAIFN1YnRyYW5zQnVmZmVyCSJXYWl0aW5nIGZvciBJL08g b24gYSBzdWItdHJhbnNhY3Rpb24gU0xSVSBidWZmZXIuIgogTXVsdGlYYWN0T2Zmc2V0QnVm ZmVyCSJXYWl0aW5nIGZvciBJL08gb24gYSBtdWx0aXhhY3Qgb2Zmc2V0IFNMUlUgYnVmZmVy LiIKIE11bHRpWGFjdE1lbWJlckJ1ZmZlcgkiV2FpdGluZyBmb3IgSS9PIG9uIGEgbXVsdGl4 YWN0IG1lbWJlciBTTFJVIGJ1ZmZlci4iCiBOb3RpZnlCdWZmZXIJIldhaXRpbmcgZm9yIEkv TyBvbiBhIDxjb21tYW5kPk5PVElGWTwvY29tbWFuZD4gbWVzc2FnZSBTTFJVIGJ1ZmZlci4i CitOb3RpZnlDaGFubmVsSGFzaAkiV2FpdGluZyB0byBhY2Nlc3MgdGhlIDxjb21tYW5kPk5P VElGWTwvY29tbWFuZD4gY2hhbm5lbCBoYXNoIHRhYmxlLiIKIFNlcmlhbEJ1ZmZlcgkiV2Fp dGluZyBmb3IgSS9PIG9uIGEgc2VyaWFsaXphYmxlIHRyYW5zYWN0aW9uIGNvbmZsaWN0IFNM UlUgYnVmZmVyLiIKIFdBTEluc2VydAkiV2FpdGluZyB0byBpbnNlcnQgV0FMIGRhdGEgaW50 byBhIG1lbW9yeSBidWZmZXIuIgogQnVmZmVyQ29udGVudAkiV2FpdGluZyB0byBhY2Nlc3Mg YSBkYXRhIHBhZ2UgaW4gbWVtb3J5LiIKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3N0b3Jh Z2UvbHdsb2NrbGlzdC5oIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9sd2xvY2tsaXN0LmgKaW5k ZXggMDZhMWZmZDRiMDguLjI3NjhkZGY0NDE0IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9z dG9yYWdlL2x3bG9ja2xpc3QuaAorKysgYi9zcmMvaW5jbHVkZS9zdG9yYWdlL2x3bG9ja2xp c3QuaApAQCAtMTAwLDYgKzEwMCw3IEBAIFBHX0xXTE9DS1RSQU5DSEUoU1VCVFJBTlNfQlVG RkVSLCBTdWJ0cmFuc0J1ZmZlcikKIFBHX0xXTE9DS1RSQU5DSEUoTVVMVElYQUNUT0ZGU0VU X0JVRkZFUiwgTXVsdGlYYWN0T2Zmc2V0QnVmZmVyKQogUEdfTFdMT0NLVFJBTkNIRShNVUxU SVhBQ1RNRU1CRVJfQlVGRkVSLCBNdWx0aVhhY3RNZW1iZXJCdWZmZXIpCiBQR19MV0xPQ0tU UkFOQ0hFKE5PVElGWV9CVUZGRVIsIE5vdGlmeUJ1ZmZlcikKK1BHX0xXTE9DS1RSQU5DSEUo Tk9USUZZX0NIQU5ORUxfSEFTSCwgTm90aWZ5Q2hhbm5lbEhhc2gpCiBQR19MV0xPQ0tUUkFO Q0hFKFNFUklBTF9CVUZGRVIsIFNlcmlhbEJ1ZmZlcikKIFBHX0xXTE9DS1RSQU5DSEUoV0FM X0lOU0VSVCwgV0FMSW5zZXJ0KQogUEdfTFdMT0NLVFJBTkNIRShCVUZGRVJfQ09OVEVOVCwg QnVmZmVyQ29udGVudCkKZGlmZiAtLWdpdCBhL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVm cy5saXN0IGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QKaW5kZXggM2M4MGQ0 OWI2N2UuLmEwZWY2MzlkOGVhIDEwMDY0NAotLS0gYS9zcmMvdG9vbHMvcGdpbmRlbnQvdHlw ZWRlZnMubGlzdAorKysgYi9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdApAQCAt NDExLDYgKzQxMSw4IEBAIENhdGFsb2dJZE1hcEVudHJ5CiBDYXRhbG9nSW5kZXhTdGF0ZQog Q2hhbmdlVmFyTm9kZXNfY2FsbGJhY2sKIENoYW5nZVZhck5vZGVzX2NvbnRleHQKK0NoYW5u ZWxFbnRyeQorQ2hhbm5lbEhhc2hLZXkKIENoZWNrUG9pbnQKIENoZWNrUG9pbnRTdG10CiBD aGVja3BvaW50U3RhdHNEYXRhCi0tIAoyLjUwLjEKCg== --d5715a4bc93049cf81c46a46cbdb4cb3--