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 1tz5ED-00Eme7-3n for pgsql-hackers@arkaria.postgresql.org; Mon, 31 Mar 2025 02:50:22 +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 1tz5EB-00GSxj-8T for pgsql-hackers@arkaria.postgresql.org; Mon, 31 Mar 2025 02:50:19 +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 1tz5EA-00GSxb-Gi for pgsql-hackers@lists.postgresql.org; Mon, 31 Mar 2025 02:50:18 +0000 Received: from mail.postgrespro.ru ([93.174.132.70]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1tz5E6-0023kN-0h for pgsql-hackers@postgresql.org; Mon, 31 Mar 2025 02:50:17 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1743389410; bh=/iNzM/yx5Un7yS7qNcbUejAdb+o8pDGyYsnEmGLzoeY=; h=Message-ID:Date:User-Agent:Subject:From:To:Cc:References: In-Reply-To:From; b=vZ1+U95sUofSGGogmQaEtAqhpRNBAY9XgrcFEXnhs+2X5ipruVwKW+jQnGV2ge7EQ bG+q5ylBu5WgZUBjSJF5HnkUeG82/Xhi9u5dD0KAA2jple4s6afW9Pq6lZnbwc9/Wn bx8YJe7SQIHH05IzUZZVCzchFgJ4LHu6levBUWcO+Fu7UJfjS39zfSvoemUSVTIG5w qOa79HFS8Fte2ZYvUuej4+ZKyiizut4kik38eMzAwGPBC9yXkIi5cOicyuCmJJk42r 7AGXU2UxPYOTggnveKQi1BrZXfgf9p6iIZci3Qlj5FXjeJKZgoMBOAYn6IlrevVwbF 39wHQ0OXb82aA== Received: from [10.0.85.1] (unknown [188.214.33.78]) (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) (Client did not present a certificate) (Authenticated sender: a.rybakina@postgrespro.ru) by mail.postgrespro.ru (Postfix/587) with ESMTPSA id B4CA4601E4; Mon, 31 Mar 2025 05:50:09 +0300 (MSK) Content-Type: multipart/mixed; boundary="------------TplpckXnZtrX2aea1b4WuObM" Message-ID: Date: Mon, 31 Mar 2025 05:50:07 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Memoize ANTI and SEMI JOIN inner From: Alena Rybakina To: Andrei Lepikhov Cc: David Rowley , PostgreSQL-development References: <60bf8d26-7c7e-4915-b544-afdb9020011d@gmail.com> <95586c5d-2632-4f1c-bfb9-4c391f260de4@gmail.com> <26e6dd23-ad56-4e00-8a24-c84b508267aa@postgrespro.ru> Content-Language: en-US In-Reply-To: <26e6dd23-ad56-4e00-8a24-c84b508267aa@postgrespro.ru> X-KSMG-AntiPhishing: NotDetected, bases: 2025/03/31 01:25:00 X-KSMG-AntiSpam-Interceptor-Info: not scanned X-KSMG-AntiSpam-Status: not scanned, disabled by settings X-KSMG-AntiVirus: Kaspersky Secure Mail Gateway, version 2.1.0.7854, bases: 2025/03/31 01:22:00 #27841732 X-KSMG-AntiVirus-Status: NotDetected, skipped X-KSMG-LinksScanning: not scanned, disabled by settings X-KSMG-Message-Action: skipped X-KSMG-Rule-ID: 1 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. --------------TplpckXnZtrX2aea1b4WuObM Content-Type: multipart/alternative; boundary="------------XQTEiOgAdqwMEpqLC09upNh9" --------------XQTEiOgAdqwMEpqLC09upNh9 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit I realized that I uploaded my diff file with a small mistake - sorry about that. I've corrected it with this message so your tests can pass in the CI. On 31.03.2025 05:33, Alena Rybakina wrote: > > Hi! > > On 21.03.2025 18:56, Andrei Lepikhov wrote: >> On 20/3/2025 07:02, David Rowley wrote: >>> On Thu, 20 Mar 2025 at 06:16, Andrei Lepikhov >>> wrote: >>>> How can we be sure that semi or anti-join needs only one tuple? I >>>> think >>>> it would be enough to control the absence of join clauses and >>>> filters in >>>> the join. Unfortunately, we only have such a guarantee in the plan >>>> creation stage (maybe even setrefs.c). So, it seems we need to >>>> invent an >>>> approach like AlternativeSubplan. >>> >>> I suggest looking at what 9e215378d did.  You might be able to also >>> allow semi and anti-joins providing the cache keys cover the entire >>> join condition. I think this might be safe as Nested Loop will only >>> ask its inner subnode for the first match before skipping to the next >>> outer row and with anti-join, there's no reason to look for additional >>> rows after the first. Semi-join and unique joins do the same thing in >>> nodeNestloop.c. To save doing additional checks at run-time, the code >>> does: >> Thank you for the clue! I almost took the wrong direction. >> I have attached the new patch, which includes corrected comments for >> better clarification of the changes, as well as some additional tests. >> I now feel much more confident about this version since I have >> resolved that concern. >> > > I reviewed your patch and made a couple of suggestions. > > The first change is related to your comment (and the one before it). I > fixed some grammar issues and simplified the wording to make it > clearer and easier to understand. > > The second change involves adding an Assert when generating the > Memoize path. Based on the existing comment and the surrounding logic > (shown below), > I believe it's worth asserting that both inner_unique and single_mode > are not true at the same time — just as a safety check. > /* > * We may do this for SEMI or ANTI joins when they need only one tuple from > * the inner side to produce the result. Following if condition checks that > * rule. > * > * XXX Currently we don't attempt to mark SEMI/ANTI joins as inner_unique > * = true. Should we? See add_paths_to_joinrel() > */ > if(!extra->inner_unique&& (jointype== JOIN_SEMI|| > jointype== JOIN_ANTI)) > single_mode= true; -- Regards, Alena Rybakina Postgres Professional --------------XQTEiOgAdqwMEpqLC09upNh9 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit

I realized that I uploaded my diff file with a small mistake - sorry about that. I've corrected it with this message so your tests can pass in the CI.

On 31.03.2025 05:33, Alena Rybakina wrote:

Hi!

On 21.03.2025 18:56, Andrei Lepikhov wrote:
On 20/3/2025 07:02, David Rowley wrote:
On Thu, 20 Mar 2025 at 06:16, Andrei Lepikhov <lepihov@gmail.com> wrote:
How can we be sure that semi or anti-join needs only one tuple? I think
it would be enough to control the absence of join clauses and filters in
the join. Unfortunately, we only have such a guarantee in the plan
creation stage (maybe even setrefs.c). So, it seems we need to invent an
approach like AlternativeSubplan.

I suggest looking at what 9e215378d did.  You might be able to also
allow semi and anti-joins providing the cache keys cover the entire
join condition. I think this might be safe as Nested Loop will only
ask its inner subnode for the first match before skipping to the next
outer row and with anti-join, there's no reason to look for additional
rows after the first. Semi-join and unique joins do the same thing in
nodeNestloop.c. To save doing additional checks at run-time, the code
does:
Thank you for the clue! I almost took the wrong direction.
I have attached the new patch, which includes corrected comments for better clarification of the changes, as well as some additional tests.
I now feel much more confident about this version since I have resolved that concern.


I reviewed your patch and made a couple of suggestions.

The first change is related to your comment (and the one before it). I fixed some grammar issues and simplified the wording to make it clearer and easier to understand.

The second change involves adding an Assert when generating the Memoize path. Based on the existing comment and the surrounding logic (shown below),
I believe it's worth asserting that both inner_unique and single_mode are not true at the same time — just as a safety check.
/*
* We may do this for SEMI or ANTI joins when they need only one tuple from
* the inner side to produce the result. Following if condition checks that
* rule.
*
* XXX Currently we don't attempt to mark SEMI/ANTI joins as inner_unique
* = true. Should we? See add_paths_to_joinrel()
*/
if (!extra->inner_unique && (jointype == JOIN_SEMI ||
jointype == JOIN_ANTI))
single_mode = true;
-- 
Regards,
Alena Rybakina
Postgres Professional
--------------XQTEiOgAdqwMEpqLC09upNh9-- --------------TplpckXnZtrX2aea1b4WuObM Content-Type: text/plain; charset=UTF-8; name="memoize.diff.no-cfbot" Content-Disposition: attachment; filename="memoize.diff.no-cfbot" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2pvaW5wYXRoLmMgYi9z cmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9qb2lucGF0aC5jCmluZGV4IGM3NTQwOGY1NTJi Li4yNTJjYjcxMjk0MyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgv am9pbnBhdGguYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9qb2lucGF0aC5j CkBAIC03MjgsMTQgKzcyOCwxNiBAQCBnZXRfbWVtb2l6ZV9wYXRoKFBsYW5uZXJJbmZvICpy b290LCBSZWxPcHRJbmZvICppbm5lcnJlbCwKIAkJc2luZ2xlX21vZGUgPSB0cnVlOwogCiAJ LyoKLQkgKiBNZW1vaXplIG5vcm1hbGx5IG1hcmtzIGNhY2hlIGVudHJpZXMgYXMgY29tcGxl dGUgd2hlbiBpdCBydW5zIG91dCBvZgotCSAqIHR1cGxlcyB0byByZWFkIGZyb20gaXRzIHN1 YnBsYW4uICBIb3dldmVyLCB3aXRoIHVuaXF1ZSBqb2lucywgTmVzdGVkCi0JICogTG9vcCB3 aWxsIHNraXAgdG8gdGhlIG5leHQgb3V0ZXIgdHVwbGUgYWZ0ZXIgZmluZGluZyB0aGUgZmly c3QgbWF0Y2hpbmcKLQkgKiBpbm5lciB0dXBsZS4gQW5vdGhlciBjYXNlIGlzIGEgc2VtaSBv ciBhbnRpIGpvaW4uIElmIG51bWJlciBvZiBqb2luCi0JICogY2xhdXNlcywgcHVzaGVkIHRv IHRoZSBpbm5lciBhcyBwYXJhbWV0ZXJpc2VkIGZpbHRlciBubyBsZXNzIHRoYW4gdGhlCi0J ICogbnVtYmVyIG9mIGpvaW4gY2xhdXNlcywgdGhhdCBtZWFucyBhbGwgdGhlIGNsYXVzZXMg aGF2ZSBiZWVuIHB1c2hlZCB0bwotCSAqIHRoZSBpbm5lciBhbmQgYW55IHR1cGxlIGNvbWlu ZyBmcm9tIHRoZSBpbm5lciBzaWRlIHdpbGwgYmUgc3VjY2Vzc2Z1bGx5Ci0JICogdXNlZCB0 byBidWlsZCB0aGUgam9pbiByZXN1bHQuCisJICogTm9ybWFsbHksIG1lbW9pemUgbWFya3Mg Y2FjaGUgZW50cmllcyBhcyBjb21wbGV0ZSB3aGVuIGl0IGV4aGF1c3RzCisJICogYWxsIHR1 cGxlcyBmcm9tIGl0cyBzdWJwbGFuLiAgSG93ZXZlciwgaW4gdW5pcXVlIGpvaW5zLCBOZXN0 ZWQgTG9vcAorCSAqIHdpbGwgc2tpcCB0byB0aGUgbmV4dCBvdXRlciB0dXBsZSBhZnRlciBm aW5kaW5nIHRoZSBmaXJzdCBtYXRjaGluZworCSAqIGlubmVyIHR1cGxlLgorCSAqIEFub3Ro ZXIgY2FzZSBpcyBhIFNFTUkgb3IgQU5USSBqb2lucy4gSWYgdGhlIG51bWJlciBvZiBqb2lu IGNsYXVzZXMsCisJICogcHVzaGVkIHRvIHRoZSBpbm5lciBhcyBwYXJhbWV0ZXJpc2VkIGZp bHRlciBpcyBlcXVhbCB0byBvciBncmVhdGVyCisJICogdGhhbiB0aGUgdG90YWwgbnVtYmVy IG9mIGpvaW4gY2xhdXNlcy4gVGhpcyBpbXBsaWVzIHRoYXQgYWxsIHJlbGV2YW50CisJICog am9pbiBjb25kaXRpb25zIGhhdmUgYmVlbiBhcHBsaWVkIG9uIHRoZSBpbm5lciBzaWRlLCBz byBhbnkgcmV0dXJuZWQKKwkgKiBpbm5lciB0dXBsZSB3aWxsIGJlIGd1YXJhbnRlZWQgdG8g c2F0aXNmeSB0aGUgam9pbiBjb25kaXRpb24sIG1ha2luZworCSAqIGl0IHNhZmUgdG8gbWVt b2l6ZS4KIAkgKiBUaGlzIG1lYW5zIHRoYXQgd2UgbWF5IG5vdCByZWFkIHRoZSBpbm5lciBz aWRlIG9mIHRoZQogCSAqIGpvaW4gdG8gY29tcGxldGlvbiB3aGljaCBsZWF2ZXMgbm8gb3Bw b3J0dW5pdHkgdG8gbWFyayB0aGUgY2FjaGUgZW50cnkKIAkgKiBhcyBjb21wbGV0ZS4gIFRv IHdvcmsgYXJvdW5kIHRoYXQsIHdoZW4gdGhlIGpvaW4gaXMgdW5pcXVlIHdlCkBAIC04MDgs NiArODEwLDggQEAgZ2V0X21lbW9pemVfcGF0aChQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0 SW5mbyAqaW5uZXJyZWwsCiAJCQkJCQkJCQkmaGFzaF9vcGVyYXRvcnMsCiAJCQkJCQkJCQkm YmluYXJ5X21vZGUpKQogCXsKKwkJQXNzZXJ0KCEoZXh0cmEtPmlubmVyX3VuaXF1ZSAmJiBz aW5nbGVfbW9kZSkpOworCiAJCXJldHVybiAoUGF0aCAqKSBjcmVhdGVfbWVtb2l6ZV9wYXRo KHJvb3QsCiAJCQkJCQkJCQkJCWlubmVycmVsLAogCQkJCQkJCQkJCQlpbm5lcl9wYXRoLAo= --------------TplpckXnZtrX2aea1b4WuObM Content-Type: text/x-patch; charset=UTF-8; name="v1-0001-Memoise-the-inner-of-SEMI-and-ANTI-join.patch" Content-Disposition: attachment; filename="v1-0001-Memoise-the-inner-of-SEMI-and-ANTI-join.patch" Content-Transfer-Encoding: base64 RnJvbSBjNTg5N2UzMWQyYTk1ZGUwNGZhMGU2NDFhZWZmNDNmMzExOGJjY2VkIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmVpIFYuIExlcGlraG92IiA8bGVwaWhvdkBn bWFpbC5jb20+CkRhdGU6IEZyaSwgMjEgTWFyIDIwMjUgMTU6NTU6NDAgKzAxMDAKU3ViamVj dDogW1BBVENIIHYxXSBNZW1vaXNlIHRoZSBpbm5lciBvZiBTRU1JLSBhbmQgQU5USS1qb2lu LgoKVG8gcHJvZHVjZSB0aGUgcmVzdWx0IG9mIHNlbWktam9pbiBvciBhbnRpLWpvaW4sIHdl IG9ubHkgbmVlZCBvbmUgdHVwbGUgZnJvbQp0aGUgcGFyYW1ldGVyaXNlZCBpbm5lci4gVGhl IFBvc3RncmVzIGNvcmUgYWxyZWFkeSBpbmNsdWRlcyBNZW1vaXplJ3MKc2luZ2xlX3JvdyBt b2RlIGZvciB0aGUgY2FzZSB3aGVuIGl0IGlzIHByb3ZlZCB0aGF0IGlubmVyIHJldHVybnMg b25seSBhIHNpbmdsZQp2YWx1ZS4gVGh1cywgaW1wbGVtZW50aW5nIHNpbWlsYXIgbG9naWMg Zm9yIHNlbWktam9pbnMgYW5kIGFudGktam9pbnMgaXMKcXVpdGUgZG9hYmxlLgoKVXN1YWxs eSwgdGhlc2UgdHlwZXMgb2Ygam9pbiBuZWVkIG9ubHkgc2luZ2xlIHR1cGxlIGZyb20gdGhl IGlubmVyIHRvIHByb2R1Y2UKcmVzdWx0IGZvciBlYWNoIG91dGVyIHR1cGxlLiBCdXQgaWYg YWZ0ZXIgcHVzaGluZyBwYXJhbWV0ZXJpc2VkIGNsYXVzZXMgZG93biB0bwp0aGUgaW5uZXIg dGhlIE5lc3RMb29wIHN0aWxsIGhhdmUgc29tZSBqb2luIGNsYXVzZXMgb3IgZmlsdGVycywg aXQgbWF5IHJlamVjdApzb21lIGlubmVyIHR1cGxlcyBkdXJpbmcgZXhlY3V0aW9uIGFuZCBj YWxsIHRoZSBpbm5lciBtb3JlIHRoYW4gb25jZS4gVG8gcHJldmVudAp0aGF0IHdlIGNoZWNr IHRoYXQgYWxsIHRoZSByZXN0cmljdGlvbnMgaGF2ZSBiZWVuIHB1c2hlZCB0byB0aGUgaW5u ZXIuCi0tLQogc3JjL2JhY2tlbmQvY29tbWFuZHMvZXhwbGFpbi5jICAgICAgICAgIHwgICA0 ICsKIHNyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2Nvc3RzaXplLmMgICB8ICAgMiArLQog c3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvam9pbnBhdGguYyAgIHwgIDIxICsrKy0tCiBz cmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9wYXRobm9kZS5jICAgfCAgIDIgKy0KIHNyYy90 ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQgICAgICB8ICAgMyArLQogc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC9tZW1vaXplLm91dCAgIHwgMTAyICsrKysrKysrKysrKysrKysr KysrKysrKwogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zdWJzZWxlY3Qub3V0IHwgICAz ICstCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9tZW1vaXplLnNxbCAgICAgICAgfCAgNDkgKysr KysrKysrKysrCiA4IGZpbGVzIGNoYW5nZWQsIDE3NCBpbnNlcnRpb25zKCspLCAxMiBkZWxl dGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy9leHBsYWluLmMg Yi9zcmMvYmFja2VuZC9jb21tYW5kcy9leHBsYWluLmMKaW5kZXggMzkxYjM0YTJhZjIuLjFi NGIzYjc0MGFiIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9leHBsYWluLmMK KysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvZXhwbGFpbi5jCkBAIC0zNjI4LDYgKzM2Mjgs MTAgQEAgc2hvd19tZW1vaXplX2luZm8oTWVtb2l6ZVN0YXRlICptc3RhdGUsIExpc3QgKmFu Y2VzdG9ycywgRXhwbGFpblN0YXRlICplcykKIAlFeHBsYWluUHJvcGVydHlUZXh0KCJDYWNo ZSBLZXkiLCBrZXlzdHIuZGF0YSwgZXMpOwogCUV4cGxhaW5Qcm9wZXJ0eVRleHQoIkNhY2hl IE1vZGUiLCBtc3RhdGUtPmJpbmFyeV9tb2RlID8gImJpbmFyeSIgOiAibG9naWNhbCIsIGVz KTsKIAorCS8qIFJlcG9ydCBvbmx5IGluIHRoZSBzaW5nbGUgbW9kZSBjYXNlIHRvIG5vdCBi cmVhayBjdXJyZW50IHRlc3RzICovCisJaWYgKG1zdGF0ZS0+c2luZ2xlcm93KQorCQlFeHBs YWluUHJvcGVydHlUZXh0KCJTdG9yZSBNb2RlIiwgInNpbmdsZXJvdyIsIGVzKTsKKwogCXBm cmVlKGtleXN0ci5kYXRhKTsKIAogCWlmICghZXMtPmFuYWx5emUpCmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9jb3N0c2l6ZS5jIGIvc3JjL2JhY2tlbmQvb3B0 aW1pemVyL3BhdGgvY29zdHNpemUuYwppbmRleCBmNmY3N2I4ZmUxOS4uOTQxYmE2ZTFkNDkg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2Nvc3RzaXplLmMKKysr IGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvY29zdHNpemUuYwpAQCAtMjU0NSw3ICsy NTQ1LDcgQEAgY29zdF9tZW1vaXplX3Jlc2NhbihQbGFubmVySW5mbyAqcm9vdCwgTWVtb2l6 ZVBhdGggKm1wYXRoLAogCUxpc3RDZWxsICAgKmxjOwogCUNvc3QJCWlucHV0X3N0YXJ0dXBf Y29zdCA9IG1wYXRoLT5zdWJwYXRoLT5zdGFydHVwX2Nvc3Q7CiAJQ29zdAkJaW5wdXRfdG90 YWxfY29zdCA9IG1wYXRoLT5zdWJwYXRoLT50b3RhbF9jb3N0OwotCWRvdWJsZQkJdHVwbGVz ID0gbXBhdGgtPnN1YnBhdGgtPnJvd3M7CisJZG91YmxlCQl0dXBsZXMgPSBtcGF0aC0+c2lu Z2xlcm93ID8gMSA6IG1wYXRoLT5zdWJwYXRoLT5yb3dzOwogCWRvdWJsZQkJY2FsbHMgPSBt cGF0aC0+Y2FsbHM7CiAJaW50CQkJd2lkdGggPSBtcGF0aC0+c3VicGF0aC0+cGF0aHRhcmdl dC0+d2lkdGg7CiAKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2pv aW5wYXRoLmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9qb2lucGF0aC5jCmluZGV4 IDE4ODkxY2U5MTU2Li5jNzU0MDhmNTUyYiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0 aW1pemVyL3BhdGgvam9pbnBhdGguYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0 aC9qb2lucGF0aC5jCkBAIC02ODIsNiArNjgyLDcgQEAgZ2V0X21lbW9pemVfcGF0aChQbGFu bmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqaW5uZXJyZWwsCiAJTGlzdENlbGwgICAqbGM7 CiAJYm9vbAkJYmluYXJ5X21vZGU7CiAJTGlzdAkgICAqcGhfbGF0ZXJhbF92YXJzOworCWJv b2wJCXNpbmdsZV9tb2RlID0gZmFsc2U7CiAKIAkvKiBPYnZpb3VzbHkgbm90IGlmIGl0J3Mg ZGlzYWJsZWQgKi8KIAlpZiAoIWVuYWJsZV9tZW1vaXplKQpAQCAtNzE1LDIzICs3MTYsMjcg QEAgZ2V0X21lbW9pemVfcGF0aChQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqaW5u ZXJyZWwsCiAJCXJldHVybiBOVUxMOwogCiAJLyoKLQkgKiBDdXJyZW50bHkgd2UgZG9uJ3Qg ZG8gdGhpcyBmb3IgU0VNSSBhbmQgQU5USSBqb2lucyB1bmxlc3MgdGhleSdyZQotCSAqIG1h cmtlZCBhcyBpbm5lcl91bmlxdWUuICBUaGlzIGlzIGJlY2F1c2UgbmVzdGVkIGxvb3AgU0VN SS9BTlRJIGpvaW5zCi0JICogZG9uJ3Qgc2NhbiB0aGUgaW5uZXIgbm9kZSB0byBjb21wbGV0 aW9uLCB3aGljaCB3aWxsIG1lYW4gbWVtb2l6ZSBjYW5ub3QKLQkgKiBtYXJrIHRoZSBjYWNo ZSBlbnRyeSBhcyBjb21wbGV0ZS4KKwkgKiBXZSBtYXkgZG8gdGhpcyBmb3IgU0VNSSBvciBB TlRJIGpvaW5zIHdoZW4gdGhleSBuZWVkIG9ubHkgb25lIHR1cGxlIGZyb20KKwkgKiB0aGUg aW5uZXIgc2lkZSB0byBwcm9kdWNlIHRoZSByZXN1bHQuIEZvbGxvd2luZyBpZiBjb25kaXRp b24gY2hlY2tzIHRoYXQKKwkgKiBydWxlLgogCSAqCiAJICogWFhYIEN1cnJlbnRseSB3ZSBk b24ndCBhdHRlbXB0IHRvIG1hcmsgU0VNSS9BTlRJIGpvaW5zIGFzIGlubmVyX3VuaXF1ZQog CSAqID0gdHJ1ZS4gIFNob3VsZCB3ZT8gIFNlZSBhZGRfcGF0aHNfdG9fam9pbnJlbCgpCiAJ ICovCiAJaWYgKCFleHRyYS0+aW5uZXJfdW5pcXVlICYmIChqb2ludHlwZSA9PSBKT0lOX1NF TUkgfHwKIAkJCQkJCQkJIGpvaW50eXBlID09IEpPSU5fQU5USSkpCi0JCXJldHVybiBOVUxM OworCQlzaW5nbGVfbW9kZSA9IHRydWU7CiAKIAkvKgogCSAqIE1lbW9pemUgbm9ybWFsbHkg bWFya3MgY2FjaGUgZW50cmllcyBhcyBjb21wbGV0ZSB3aGVuIGl0IHJ1bnMgb3V0IG9mCiAJ ICogdHVwbGVzIHRvIHJlYWQgZnJvbSBpdHMgc3VicGxhbi4gIEhvd2V2ZXIsIHdpdGggdW5p cXVlIGpvaW5zLCBOZXN0ZWQKIAkgKiBMb29wIHdpbGwgc2tpcCB0byB0aGUgbmV4dCBvdXRl ciB0dXBsZSBhZnRlciBmaW5kaW5nIHRoZSBmaXJzdCBtYXRjaGluZwotCSAqIGlubmVyIHR1 cGxlLiAgVGhpcyBtZWFucyB0aGF0IHdlIG1heSBub3QgcmVhZCB0aGUgaW5uZXIgc2lkZSBv ZiB0aGUKKwkgKiBpbm5lciB0dXBsZS4gQW5vdGhlciBjYXNlIGlzIGEgc2VtaSBvciBhbnRp IGpvaW4uIElmIG51bWJlciBvZiBqb2luCisJICogY2xhdXNlcywgcHVzaGVkIHRvIHRoZSBp bm5lciBhcyBwYXJhbWV0ZXJpc2VkIGZpbHRlciBubyBsZXNzIHRoYW4gdGhlCisJICogbnVt YmVyIG9mIGpvaW4gY2xhdXNlcywgdGhhdCBtZWFucyBhbGwgdGhlIGNsYXVzZXMgaGF2ZSBi ZWVuIHB1c2hlZCB0bworCSAqIHRoZSBpbm5lciBhbmQgYW55IHR1cGxlIGNvbWluZyBmcm9t IHRoZSBpbm5lciBzaWRlIHdpbGwgYmUgc3VjY2Vzc2Z1bGx5CisJICogdXNlZCB0byBidWls ZCB0aGUgam9pbiByZXN1bHQuCisJICogVGhpcyBtZWFucyB0aGF0IHdlIG1heSBub3QgcmVh ZCB0aGUgaW5uZXIgc2lkZSBvZiB0aGUKIAkgKiBqb2luIHRvIGNvbXBsZXRpb24gd2hpY2gg bGVhdmVzIG5vIG9wcG9ydHVuaXR5IHRvIG1hcmsgdGhlIGNhY2hlIGVudHJ5CiAJICogYXMg Y29tcGxldGUuICBUbyB3b3JrIGFyb3VuZCB0aGF0LCB3aGVuIHRoZSBqb2luIGlzIHVuaXF1 ZSB3ZQogCSAqIGF1dG9tYXRpY2FsbHkgbWFyayBjYWNoZSBlbnRyaWVzIGFzIGNvbXBsZXRl IGFmdGVyIGZldGNoaW5nIHRoZSBmaXJzdApAQCAtNzUzLDcgKzc1OCw3IEBAIGdldF9tZW1v aXplX3BhdGgoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKmlubmVycmVsLAogCSAq IHRoZSBpbm5lciBzY2FuJ3MgZmlsdGVyIGluc3RlYWQgb2YgdGhlIGpvaW4gZmlsdGVyLiAg TWF5YmUgaXQncyB3b3J0aAogCSAqIGNvbnNpZGVyaW5nIGRvaW5nIHRoYXQ/CiAJICovCi0J aWYgKGV4dHJhLT5pbm5lcl91bmlxdWUgJiYKKwlpZiAoKGV4dHJhLT5pbm5lcl91bmlxdWUg fHwgc2luZ2xlX21vZGUpICYmCiAJCShpbm5lcl9wYXRoLT5wYXJhbV9pbmZvID09IE5VTEwg fHwKIAkJIGJtc19udW1fbWVtYmVycyhpbm5lcl9wYXRoLT5wYXJhbV9pbmZvLT5wcGlfc2Vy aWFscykgPAogCQkgbGlzdF9sZW5ndGgoZXh0cmEtPnJlc3RyaWN0bGlzdCkpKQpAQCAtODA4 LDcgKzgxMyw3IEBAIGdldF9tZW1vaXplX3BhdGgoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9w dEluZm8gKmlubmVycmVsLAogCQkJCQkJCQkJCQlpbm5lcl9wYXRoLAogCQkJCQkJCQkJCQlw YXJhbV9leHBycywKIAkJCQkJCQkJCQkJaGFzaF9vcGVyYXRvcnMsCi0JCQkJCQkJCQkJCWV4 dHJhLT5pbm5lcl91bmlxdWUsCisJCQkJCQkJCQkJCWV4dHJhLT5pbm5lcl91bmlxdWUgfHwg c2luZ2xlX21vZGUsCiAJCQkJCQkJCQkJCWJpbmFyeV9tb2RlLAogCQkJCQkJCQkJCQlvdXRl cl9wYXRoLT5yb3dzKTsKIAl9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIv dXRpbC9wYXRobm9kZS5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcGF0aG5vZGUu YwppbmRleCA5M2U3M2NiNDRkYi4uOWI0YzBmOTYxOTMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL29wdGltaXplci91dGlsL3BhdGhub2RlLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1p emVyL3V0aWwvcGF0aG5vZGUuYwpAQCAtMTcwNyw3ICsxNzA3LDcgQEAgY3JlYXRlX21lbW9p emVfcGF0aChQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLCBQYXRoICpzdWJw YXRoLAogCSAqLwogCXBhdGhub2RlLT5wYXRoLnN0YXJ0dXBfY29zdCA9IHN1YnBhdGgtPnN0 YXJ0dXBfY29zdCArIGNwdV90dXBsZV9jb3N0OwogCXBhdGhub2RlLT5wYXRoLnRvdGFsX2Nv c3QgPSBzdWJwYXRoLT50b3RhbF9jb3N0ICsgY3B1X3R1cGxlX2Nvc3Q7Ci0JcGF0aG5vZGUt PnBhdGgucm93cyA9IHN1YnBhdGgtPnJvd3M7CisJcGF0aG5vZGUtPnBhdGgucm93cyA9IChw YXRobm9kZS0+c2luZ2xlcm93KSA/IDEgOiBzdWJwYXRoLT5yb3dzOwogCiAJcmV0dXJuIHBh dGhub2RlOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2lu Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQKaW5kZXggYTU3YmIx OGMyNGYuLmU4MjkzYzNjODdkIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVj dGVkL2pvaW4ub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQK QEAgLTY0NjksMTAgKzY0NjksMTEgQEAgc2VsZWN0ICogZnJvbSBzaiB0MQogICAgLT4gIE1l bW9pemUKICAgICAgICAgIENhY2hlIEtleTogdDEuYSwgdDEuYgogICAgICAgICAgQ2FjaGUg TW9kZTogYmluYXJ5CisgICAgICAgICBTdG9yZSBNb2RlOiBzaW5nbGVyb3cKICAgICAgICAg IC0+ICBTYW1wbGUgU2NhbiBvbiBzagogICAgICAgICAgICAgICAgU2FtcGxpbmc6IHN5c3Rl bSAodDEuYikKICAgICAgICAgICAgICAgIEZpbHRlcjogKHQxLmEgPSBhKQotKDggcm93cykK Kyg5IHJvd3MpCiAKIC0tIEVuc3VyZSB0aGF0IFNKRSBkb2VzIG5vdCBmb3JtIGEgc2VsZi1y ZWZlcmVudGlhbCBsYXRlcmFsIGRlcGVuZGVuY3kKIGV4cGxhaW4gKGNvc3RzIG9mZikKZGlm ZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvbWVtb2l6ZS5vdXQgYi9zcmMv dGVzdC9yZWdyZXNzL2V4cGVjdGVkL21lbW9pemUub3V0CmluZGV4IDM4ZGZhZjAyMWM5Li4z YWQ0NzNiMjExZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9tZW1v aXplLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL21lbW9pemUub3V0CkBA IC01MDAsMyArNTAwLDEwNSBAQCBSRVNFVCBtYXhfcGFyYWxsZWxfd29ya2Vyc19wZXJfZ2F0 aGVyOwogUkVTRVQgcGFyYWxsZWxfdHVwbGVfY29zdDsKIFJFU0VUIHBhcmFsbGVsX3NldHVw X2Nvc3Q7CiBSRVNFVCBtaW5fcGFyYWxsZWxfdGFibGVfc2Nhbl9zaXplOworLS0KKy0tIFRl c3RzIG9uIE1lbW9pemUgdW5kZXIgU0VNSSBhbmQgQU5USSBqb2lucy4KKy0tCitDUkVBVEUg VEFCTEUgbWVtX3NlbWlfaW5uZXJfYSAoeCBpbnQsIHogaW50KTsKK0NSRUFURSBUQUJMRSBt ZW1fc2VtaV9pbm5lcl9iICh4IGludCwgeSBpbnQpOworQ1JFQVRFIFRBQkxFIG1lbV9zZW1p X2lubmVyX2MgKHggaW50LCB5IGludCwgeiBpbnQpOworSU5TRVJUIElOVE8gbWVtX3NlbWlf aW5uZXJfYSAoeCx6KQorICAoU0VMRUNUIHZhbHVlJTIsIC00MiBGUk9NIGdlbmVyYXRlX3Nl cmllcygxLDEwKSBBUyB2YWx1ZSk7CitJTlNFUlQgSU5UTyBtZW1fc2VtaV9pbm5lcl9iICh4 LHkpCisgIChTRUxFQ1QgdmFsdWUlNSwgLXZhbHVlJTUtMSBGUk9NIGdlbmVyYXRlX3Nlcmll cygxLDEwKSBBUyB2YWx1ZSk7CitJTlNFUlQgSU5UTyBtZW1fc2VtaV9pbm5lcl9jICh4LHks eikKKyAgKFNFTEVDVCB2YWx1ZSU1MCwgdmFsdWUsIC00MiBGUk9NIGdlbmVyYXRlX3Nlcmll cygxLDEwMCkgQVMgdmFsdWUpOworQ1JFQVRFIElOREVYIE9OIG1lbV9zZW1pX2lubmVyX2Io eCk7CitDUkVBVEUgSU5ERVggT04gbWVtX3NlbWlfaW5uZXJfYyh4LHopOworVkFDVVVNIEFO QUxZWkUgbWVtX3NlbWlfaW5uZXJfYSxtZW1fc2VtaV9pbm5lcl9iLG1lbV9zZW1pX2lubmVy X2M7CistLSBGb3JjZSBOZXN0TG9vcCBhbmQgSW5kZXhTY2FuLiBIb3BlLCB0aGUgTWVtb2l6 ZSBub2RlIHdpbiB0aGUgY29zdAorLS0gY29tcGV0aXRpb24gb24gdGhlIGlubmVyIGMgdGFi bGUgc2Nhbi4KK1NFVCBlbmFibGVfaGFzaGpvaW4gPSAnb2ZmJzsKK1NFVCBlbmFibGVfbWVy Z2Vqb2luID0gJ29mZic7CitTRVQgZW5hYmxlX3NlcXNjYW4gPSAnb2ZmJzsKKy0tIFByaW1p dGl2ZSBleGFtcGxlIG9mIHNlbWkgYW5kIGFudGkgam9pbiBjYWNoaW5nIHRoZSBpbm5lcidz IHJlc3VsdAorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGEueCBGUk9NIG1lbV9zZW1p X2lubmVyX2EgYQorV0hFUkUgRVhJU1RTIChTRUxFQ1QgMSBGUk9NIG1lbV9zZW1pX2lubmVy X2MgYyBXSEVSRSBjLng9YS54KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBTZW1pIEpvaW4KKyAg IC0+ICBTZXEgU2NhbiBvbiBtZW1fc2VtaV9pbm5lcl9hIGEKKyAgICAgICAgIERpc2FibGVk OiB0cnVlCisgICAtPiAgTWVtb2l6ZQorICAgICAgICAgQ2FjaGUgS2V5OiBhLngKKyAgICAg ICAgIENhY2hlIE1vZGU6IGxvZ2ljYWwKKyAgICAgICAgIFN0b3JlIE1vZGU6IHNpbmdsZXJv dworICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyBtZW1fc2VtaV9pbm5lcl9j X3hfel9pZHggb24gbWVtX3NlbWlfaW5uZXJfYyBjCisgICAgICAgICAgICAgICBJbmRleCBD b25kOiAoeCA9IGEueCkKKyg5IHJvd3MpCisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVD VCBhLnggRlJPTSBtZW1fc2VtaV9pbm5lcl9hIGEKK1dIRVJFIE5PVCBFWElTVFMgKFNFTEVD VCAxIEZST00gbWVtX3NlbWlfaW5uZXJfYyBjIFdIRVJFIGMueD1hLngpOworICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5l c3RlZCBMb29wIEFudGkgSm9pbgorICAgLT4gIFNlcSBTY2FuIG9uIG1lbV9zZW1pX2lubmVy X2EgYQorICAgICAgICAgRGlzYWJsZWQ6IHRydWUKKyAgIC0+ICBNZW1vaXplCisgICAgICAg ICBDYWNoZSBLZXk6IGEueAorICAgICAgICAgQ2FjaGUgTW9kZTogbG9naWNhbAorICAgICAg ICAgU3RvcmUgTW9kZTogc2luZ2xlcm93CisgICAgICAgICAtPiAgSW5kZXggT25seSBTY2Fu IHVzaW5nIG1lbV9zZW1pX2lubmVyX2NfeF96X2lkeCBvbiBtZW1fc2VtaV9pbm5lcl9jIGMK KyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICh4ID0gYS54KQorKDkgcm93cykKKworLS0g Q2hlY2sgdGhlIHF1ZXJ5IHBsYW5zIGNvbnRhaW4gdGhlIE1lbW9pemUgbm9kZSBvdmVyIHRo ZSAiU2NhbiBiIiBvcGVyYXRvcgorLS0gYW5kIGRvZXMgbm90IGNvbnRhaW4gbWVtb2l6ZSBv dmVyICJTY2FuIGMiLgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGEueCwgYi54IEZS T00gbWVtX3NlbWlfaW5uZXJfYSBhCisgIExFRlQgSk9JTiBtZW1fc2VtaV9pbm5lcl9iIGIg T04gKGEueD1iLngpCitXSEVSRSBFWElTVFMgKAorICBTRUxFQ1QgMSBGUk9NIG1lbV9zZW1p X2lubmVyX2MgYyBXSEVSRSBjLng9YS54IEFORCBjLnk9Yi55IEFORCBjLno9YS56KTsKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgTmVzdGVkIExvb3AgU2VtaSBKb2luCisgICBKb2luIEZpbHRlcjogKChjLnggPSBhLngp IEFORCAoYy56ID0gYS56KSkKKyAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAgLT4gIFNl cSBTY2FuIG9uIG1lbV9zZW1pX2lubmVyX2EgYQorICAgICAgICAgICAgICAgRGlzYWJsZWQ6 IHRydWUKKyAgICAgICAgIC0+ICBNZW1vaXplCisgICAgICAgICAgICAgICBDYWNoZSBLZXk6 IGEueAorICAgICAgICAgICAgICAgQ2FjaGUgTW9kZTogbG9naWNhbAorICAgICAgICAgICAg ICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgbWVtX3NlbWlfaW5uZXJfYl94X2lkeCBvbiBtZW1f c2VtaV9pbm5lcl9iIGIKKyAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICh4ID0g YS54KQorICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgbWVtX3NlbWlfaW5uZXJfY194X3pfaWR4 IG9uIG1lbV9zZW1pX2lubmVyX2MgYworICAgICAgICAgSW5kZXggQ29uZDogKHggPSBiLngp CisgICAgICAgICBGaWx0ZXI6ICh5ID0gYi55KQorKDEzIHJvd3MpCisKK0VYUExBSU4gKENP U1RTIE9GRikKK1NFTEVDVCBhLngsIGIueCBGUk9NIG1lbV9zZW1pX2lubmVyX2EgYQorICBM RUZUIEpPSU4gbWVtX3NlbWlfaW5uZXJfYiBiIE9OIChhLng9Yi54KQorV0hFUkUgTk9UIEVY SVNUUyAoCisgIFNFTEVDVCAxIEZST00gbWVtX3NlbWlfaW5uZXJfYyBjIFdIRVJFIGMueD1h LnggQU5EIGMueT1iLnkgQU5EIGMuej1hLnopOworICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBBbnRpIEpv aW4KKyAgIEpvaW4gRmlsdGVyOiAoYy55ID0gYi55KQorICAgLT4gIE5lc3RlZCBMb29wIExl ZnQgSm9pbgorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIG1lbV9zZW1pX2lubmVyX2EgYQor ICAgICAgICAgICAgICAgRGlzYWJsZWQ6IHRydWUKKyAgICAgICAgIC0+ICBNZW1vaXplCisg ICAgICAgICAgICAgICBDYWNoZSBLZXk6IGEueAorICAgICAgICAgICAgICAgQ2FjaGUgTW9k ZTogbG9naWNhbAorICAgICAgICAgICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgbWVtX3Nl bWlfaW5uZXJfYl94X2lkeCBvbiBtZW1fc2VtaV9pbm5lcl9iIGIKKyAgICAgICAgICAgICAg ICAgICAgIEluZGV4IENvbmQ6ICh4ID0gYS54KQorICAgLT4gIEluZGV4IFNjYW4gdXNpbmcg bWVtX3NlbWlfaW5uZXJfY194X3pfaWR4IG9uIG1lbV9zZW1pX2lubmVyX2MgYworICAgICAg ICAgSW5kZXggQ29uZDogKCh4ID0gYS54KSBBTkQgKHogPSBhLnopKQorKDEyIHJvd3MpCisK K0RST1AgVEFCTEUgbWVtX3NlbWlfaW5uZXJfYSxtZW1fc2VtaV9pbm5lcl9iLG1lbV9zZW1p X2lubmVyX2M7CitSRVNFVCBlbmFibGVfaGFzaGpvaW47CitSRVNFVCBlbmFibGVfbWVyZ2Vq b2luOworUkVTRVQgZW5hYmxlX3NlcXNjYW47CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL3N1YnNlbGVjdC5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVk L3N1YnNlbGVjdC5vdXQKaW5kZXggZDBkYjhhNDEyZmYuLjVhYjU2ZjhkNzFmIDEwMDY0NAot LS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N1YnNlbGVjdC5vdXQKKysrIGIvc3Jj L3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zdWJzZWxlY3Qub3V0CkBAIC0yNjQyLDYgKzI2NDIs NyBAQCBPTiBCLmh1bmRyZWQgaW4gKFNFTEVDVCBtaW4oYy5odW5kcmVkKSBGUk9NIHRlbmsy IEMgV0hFUkUgYy5vZGQgPSBiLm9kZCk7CiAgICAgICAgICAgICAgICAtPiAgTWVtb2l6ZQog ICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgS2V5OiBiLmh1bmRyZWQsIGIub2RkCiAgICAg ICAgICAgICAgICAgICAgICBDYWNoZSBNb2RlOiBiaW5hcnkKKyAgICAgICAgICAgICAgICAg ICAgIFN0b3JlIE1vZGU6IHNpbmdsZXJvdwogICAgICAgICAgICAgICAgICAgICAgLT4gIFN1 YnF1ZXJ5IFNjYW4gb24gIkFOWV9zdWJxdWVyeSIKICAgICAgICAgICAgICAgICAgICAgICAg ICAgIEZpbHRlcjogKGIuaHVuZHJlZCA9ICJBTllfc3VicXVlcnkiLm1pbikKICAgICAgICAg ICAgICAgICAgICAgICAgICAgIC0+ICBSZXN1bHQKQEAgLTI2NTAsNSArMjY1MSw1IEBAIE9O IEIuaHVuZHJlZCBpbiAoU0VMRUNUIG1pbihjLmh1bmRyZWQpIEZST00gdGVuazIgQyBXSEVS RSBjLm9kZCA9IGIub2RkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgdGVuazJfaHVuZHJlZCBvbiB0ZW5rMiBjCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENv bmQ6IChodW5kcmVkIElTIE5PVCBOVUxMKQogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBGaWx0ZXI6IChvZGQgPSBiLm9kZCkKLSgxNiByb3dzKQor KDE3IHJvd3MpCiAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL21lbW9pemUu c3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvbWVtb2l6ZS5zcWwKaW5kZXggYzBkNDdmYTg3 NWEuLjA0OGM4ZTkwYWQwIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9tZW1v aXplLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9tZW1vaXplLnNxbApAQCAtMjQ0 LDMgKzI0NCw1MiBAQCBSRVNFVCBtYXhfcGFyYWxsZWxfd29ya2Vyc19wZXJfZ2F0aGVyOwog UkVTRVQgcGFyYWxsZWxfdHVwbGVfY29zdDsKIFJFU0VUIHBhcmFsbGVsX3NldHVwX2Nvc3Q7 CiBSRVNFVCBtaW5fcGFyYWxsZWxfdGFibGVfc2Nhbl9zaXplOworCistLQorLS0gVGVzdHMg b24gTWVtb2l6ZSB1bmRlciBTRU1JIGFuZCBBTlRJIGpvaW5zLgorLS0KKworQ1JFQVRFIFRB QkxFIG1lbV9zZW1pX2lubmVyX2EgKHggaW50LCB6IGludCk7CitDUkVBVEUgVEFCTEUgbWVt X3NlbWlfaW5uZXJfYiAoeCBpbnQsIHkgaW50KTsKK0NSRUFURSBUQUJMRSBtZW1fc2VtaV9p bm5lcl9jICh4IGludCwgeSBpbnQsIHogaW50KTsKK0lOU0VSVCBJTlRPIG1lbV9zZW1pX2lu bmVyX2EgKHgseikKKyAgKFNFTEVDVCB2YWx1ZSUyLCAtNDIgRlJPTSBnZW5lcmF0ZV9zZXJp ZXMoMSwxMCkgQVMgdmFsdWUpOworSU5TRVJUIElOVE8gbWVtX3NlbWlfaW5uZXJfYiAoeCx5 KQorICAoU0VMRUNUIHZhbHVlJTUsIC12YWx1ZSU1LTEgRlJPTSBnZW5lcmF0ZV9zZXJpZXMo MSwxMCkgQVMgdmFsdWUpOworSU5TRVJUIElOVE8gbWVtX3NlbWlfaW5uZXJfYyAoeCx5LHop CisgIChTRUxFQ1QgdmFsdWUlNTAsIHZhbHVlLCAtNDIgRlJPTSBnZW5lcmF0ZV9zZXJpZXMo MSwxMDApIEFTIHZhbHVlKTsKK0NSRUFURSBJTkRFWCBPTiBtZW1fc2VtaV9pbm5lcl9iKHgp OworQ1JFQVRFIElOREVYIE9OIG1lbV9zZW1pX2lubmVyX2MoeCx6KTsKK1ZBQ1VVTSBBTkFM WVpFIG1lbV9zZW1pX2lubmVyX2EsbWVtX3NlbWlfaW5uZXJfYixtZW1fc2VtaV9pbm5lcl9j OworCistLSBGb3JjZSBOZXN0TG9vcCBhbmQgSW5kZXhTY2FuLiBIb3BlLCB0aGUgTWVtb2l6 ZSBub2RlIHdpbiB0aGUgY29zdAorLS0gY29tcGV0aXRpb24gb24gdGhlIGlubmVyIGMgdGFi bGUgc2Nhbi4KK1NFVCBlbmFibGVfaGFzaGpvaW4gPSAnb2ZmJzsKK1NFVCBlbmFibGVfbWVy Z2Vqb2luID0gJ29mZic7CitTRVQgZW5hYmxlX3NlcXNjYW4gPSAnb2ZmJzsKKworLS0gUHJp bWl0aXZlIGV4YW1wbGUgb2Ygc2VtaSBhbmQgYW50aSBqb2luIGNhY2hpbmcgdGhlIGlubmVy J3MgcmVzdWx0CitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgYS54IEZST00gbWVtX3Nl bWlfaW5uZXJfYSBhCitXSEVSRSBFWElTVFMgKFNFTEVDVCAxIEZST00gbWVtX3NlbWlfaW5u ZXJfYyBjIFdIRVJFIGMueD1hLngpOworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGEu eCBGUk9NIG1lbV9zZW1pX2lubmVyX2EgYQorV0hFUkUgTk9UIEVYSVNUUyAoU0VMRUNUIDEg RlJPTSBtZW1fc2VtaV9pbm5lcl9jIGMgV0hFUkUgYy54PWEueCk7CisKKy0tIENoZWNrIHRo ZSBxdWVyeSBwbGFucyBjb250YWluIHRoZSBNZW1vaXplIG5vZGUgb3ZlciB0aGUgIlNjYW4g YiIgb3BlcmF0b3IKKy0tIGFuZCBkb2VzIG5vdCBjb250YWluIG1lbW9pemUgb3ZlciAiU2Nh biBjIi4KK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBhLngsIGIueCBGUk9NIG1lbV9z ZW1pX2lubmVyX2EgYQorICBMRUZUIEpPSU4gbWVtX3NlbWlfaW5uZXJfYiBiIE9OIChhLng9 Yi54KQorV0hFUkUgRVhJU1RTICgKKyAgU0VMRUNUIDEgRlJPTSBtZW1fc2VtaV9pbm5lcl9j IGMgV0hFUkUgYy54PWEueCBBTkQgYy55PWIueSBBTkQgYy56PWEueik7CitFWFBMQUlOIChD T1NUUyBPRkYpCitTRUxFQ1QgYS54LCBiLnggRlJPTSBtZW1fc2VtaV9pbm5lcl9hIGEKKyAg TEVGVCBKT0lOIG1lbV9zZW1pX2lubmVyX2IgYiBPTiAoYS54PWIueCkKK1dIRVJFIE5PVCBF WElTVFMgKAorICBTRUxFQ1QgMSBGUk9NIG1lbV9zZW1pX2lubmVyX2MgYyBXSEVSRSBjLng9 YS54IEFORCBjLnk9Yi55IEFORCBjLno9YS56KTsKKworRFJPUCBUQUJMRSBtZW1fc2VtaV9p bm5lcl9hLG1lbV9zZW1pX2lubmVyX2IsbWVtX3NlbWlfaW5uZXJfYzsKK1JFU0VUIGVuYWJs ZV9oYXNoam9pbjsKK1JFU0VUIGVuYWJsZV9tZXJnZWpvaW47CitSRVNFVCBlbmFibGVfc2Vx c2NhbjsKLS0gCjIuNDguMQoK --------------TplpckXnZtrX2aea1b4WuObM--