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 1tvBaP-001gTt-08 for pgsql-hackers@arkaria.postgresql.org; Thu, 20 Mar 2025 08:49:10 +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 1tvBZP-0007UJ-9J for pgsql-hackers@arkaria.postgresql.org; Thu, 20 Mar 2025 08:48:07 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tvBZO-0007U8-O0 for pgsql-hackers@lists.postgresql.org; Thu, 20 Mar 2025 08:48:06 +0000 Received: from forward502b.mail.yandex.net ([178.154.239.146]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1tvBZL-0005m6-2U for pgsql-hackers@lists.postgresql.org; Thu, 20 Mar 2025 08:48:06 +0000 Received: from mail-nwsmtp-smtp-production-canary-88.sas.yp-c.yandex.net (mail-nwsmtp-smtp-production-canary-88.sas.yp-c.yandex.net [IPv6:2a02:6b8:c28:7d5:0:640:285a:0]) by forward502b.mail.yandex.net (Yandex) with ESMTPS id 8351D6148D; Thu, 20 Mar 2025 11:48:01 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-canary-88.sas.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id ulFKBv1LfqM0-IJUNaLPr; Thu, 20 Mar 2025 11:48:00 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tantorlabs.com; s=mail; t=1742460480; bh=wy20jnC6Jhm6UHcPqCuQOiyERwHSVAHffs781bP7aYg=; h=In-Reply-To:Cc:Date:References:To:Subject:Message-ID:From; b=G5iAfjZN6vhqH/uiRlTe1G2aFjbYZAe29e6JUD02NUEsmtDFScXndHjeCjCRxdS1+ 3rtNx7d512kRvSw6SNL5YsIJNKJ2Rn614PmvxaxX7YBAtPNj5S9Hs4k9m1hSEoDXRO F1HItFutOabd4j/OUCwTnd2n1jErXnK9zvTZAy94= Authentication-Results: mail-nwsmtp-smtp-production-canary-88.sas.yp-c.yandex.net; dkim=pass header.i=@tantorlabs.com Content-Type: multipart/mixed; boundary="------------exMJe9ahHKzsN5NWAJLY7yF4" Message-ID: Date: Thu, 20 Mar 2025 11:47:56 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Add estimated hit ratio to Memoize in EXPLAIN to explain cost adjustment To: Lukas Fittl , Daniel Gustafsson Cc: PostgreSQL Hackers , David Rowley References: <51A15CD7-E31B-483D-B911-D0EB9F5FF952@yesql.se> Content-Language: en-US From: Ilia Evdokimov 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. --------------exMJe9ahHKzsN5NWAJLY7yF4 Content-Type: multipart/alternative; boundary="------------jvn4cvv4qUyQadgYi1zLRvqH" --------------jvn4cvv4qUyQadgYi1zLRvqH Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 06.07.2023 11:27, Lukas Fittl wrote: > On Thu, Jul 6, 2023 at 12:56 AM Daniel Gustafsson wrote: > > Lukas: do you have an updated patch for this commitfest to address > David's > comments? > > > I have a draft - I should be able to post an updated patch in the next > days. Thanks for checking! > > Thanks, > Lukas > > -- > Lukas Fittl Hi hackers, While debugging a query execution plan involving Memoize, it'd be nice to determine how many unique keys would fit into the cache. The est_entries value provides some insight, but without knowing ndistinct, it is unclear whether the cache is large enough to hold all unique keys or if some will be evicted. Given its potential usefulness, I would like to work for this. I attached v2 patch with changes. Example from memoize.sql EXPLAIN SELECT COUNT(*),AVG(t1.unique1) FROM tenk1 t1 INNER JOIN tenk1 t2 ON t1.unique1 = t2.thousand WHERE t2.unique1 < 1200;                                              QUERY PLAN -----------------------------------------------------------------------------------------------------  Aggregate  (cost=815.12..815.13 rows=1 width=40)    ->  Nested Loop  (cost=0.30..809.12 rows=1200 width=4)          ->  Seq Scan on tenk1 t2  (cost=0.00..470.00 rows=1200 width=4)                Filter: (unique1 < 1200)          ->  Memoize  (cost=0.30..0.41 rows=1 width=4)                Cache Key: t2.thousand                Cache Mode: logical                Cache Estimated Entries: 655                Cache Estimated NDistinct: 721                ->  Index Only Scan using tenk1_unique1 on tenk1 t1  (cost=0.29..0.40 rows=1 width=4)                      Index Cond: (unique1 = t2.thousand) (11 rows) Additionally, since this information would only be shown in EXPLAIN when costs are enabled, it should not cause any performance regression in normal execution. However, reviewers should be especially careful when verifying test outputs, as this change could affect plan details in regression tests. Any thoughts? -- Best regards, Ilia Evdokimov, Tantor Labs LLC. --------------jvn4cvv4qUyQadgYi1zLRvqH Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit


On 06.07.2023 11:27, Lukas Fittl wrote:
On Thu, Jul 6, 2023 at 12:56 AM Daniel Gustafsson <daniel@yesql.se> wrote:
Lukas: do you have an updated patch for this commitfest to address David's
comments?

I have a draft - I should be able to post an updated patch in the next days. Thanks for checking!

Thanks,
Lukas

--
Lukas Fittl


Hi hackers,

While debugging a query execution plan involving Memoize, it'd be nice to determine how many unique keys would fit into the cache. The est_entries value provides some insight, but without knowing ndistinct, it is unclear whether the cache is large enough to hold all unique keys or if some will be evicted.

Given its potential usefulness, I would like to work for this. I attached v2 patch with changes.

Example from memoize.sql

EXPLAIN SELECT COUNT(*),AVG(t1.unique1) FROM tenk1 t1
INNER JOIN tenk1 t2 ON t1.unique1 = t2.thousand
WHERE t2.unique1 < 1200;
                                             QUERY PLAN                                              
-----------------------------------------------------------------------------------------------------
 Aggregate  (cost=815.12..815.13 rows=1 width=40)
   ->  Nested Loop  (cost=0.30..809.12 rows=1200 width=4)
         ->  Seq Scan on tenk1 t2  (cost=0.00..470.00 rows=1200 width=4)
               Filter: (unique1 < 1200)
         ->  Memoize  (cost=0.30..0.41 rows=1 width=4)
               Cache Key: t2.thousand
               Cache Mode: logical
               Cache Estimated Entries: 655
               Cache Estimated NDistinct: 721
               ->  Index Only Scan using tenk1_unique1 on tenk1 t1  (cost=0.29..0.40 rows=1 width=4)
                     Index Cond: (unique1 = t2.thousand)
(11 rows)

Additionally, since this information would only be shown in EXPLAIN when costs are enabled, it should not cause any performance regression in normal execution. However, reviewers should be especially careful when verifying test outputs, as this change could affect plan details in regression tests.

Any thoughts?

--
Best regards,
Ilia Evdokimov,
Tantor Labs LLC.

--------------jvn4cvv4qUyQadgYi1zLRvqH-- --------------exMJe9ahHKzsN5NWAJLY7yF4 Content-Type: text/x-patch; charset=UTF-8; name="v2-0001-Show-ndistinct-and-est_entries-in-EXPLAIN-for-Memoize.patch" Content-Disposition: attachment; filename*0="v2-0001-Show-ndistinct-and-est_entries-in-EXPLAIN-for-Memoiz"; filename*1="e.patch" Content-Transfer-Encoding: base64 RnJvbSAyZTdkOWJkOWJmZTU4ODI1ZmJkYmIwMTAwYjliZDE5ZDViYjdlNTNiIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBJbGlhIEV2ZG9raW1vdiA8aWx5YS5ldmRva2ltb3ZA dGFudG9ybGFicy5ydT4KRGF0ZTogVGh1LCAyMCBNYXIgMjAyNSAxMTo0NTowMiArMDMwMApT dWJqZWN0OiBbUEFUQ0ggdjJdIFNob3cgbmRpc3RpbmN0IGFuZCBlc3RfZW50cmllcyBpbiBF WFBMQUlOIGZvciBNZW1vaXplCgotLS0KIHNyYy9iYWNrZW5kL2NvbW1hbmRzL2V4cGxhaW4u YyAgICAgICAgICB8IDEyICsrKysrKysrKysrKwogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3Bh dGgvY29zdHNpemUuYyAgIHwgIDMgKysrCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9j cmVhdGVwbGFuLmMgfCAxMCArKysrKysrLS0tCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRp bC9wYXRobm9kZS5jICAgfCAgMyArKysKIHNyYy9pbmNsdWRlL25vZGVzL3BhdGhub2Rlcy5o ICAgICAgICAgICB8ICAyICsrCiBzcmMvaW5jbHVkZS9ub2Rlcy9wbGFubm9kZXMuaCAgICAg ICAgICAgfCAgNiArKysrKysKIDYgZmlsZXMgY2hhbmdlZCwgMzMgaW5zZXJ0aW9ucygrKSwg MyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy9leHBs YWluLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9leHBsYWluLmMKaW5kZXggMzNhMTZkMmQ4 ZTIuLjk1MTEwZTYzYzdkIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9leHBs YWluLmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvZXhwbGFpbi5jCkBAIC0zNjI5LDYg KzM2MjksMTEgQEAgc2hvd19tZW1vaXplX2luZm8oTWVtb2l6ZVN0YXRlICptc3RhdGUsIExp c3QgKmFuY2VzdG9ycywgRXhwbGFpblN0YXRlICplcykKIAl7CiAJCUV4cGxhaW5Qcm9wZXJ0 eVRleHQoIkNhY2hlIEtleSIsIGtleXN0ci5kYXRhLCBlcyk7CiAJCUV4cGxhaW5Qcm9wZXJ0 eVRleHQoIkNhY2hlIE1vZGUiLCBtc3RhdGUtPmJpbmFyeV9tb2RlID8gImJpbmFyeSIgOiAi bG9naWNhbCIsIGVzKTsKKwkJaWYgKGVzLT5jb3N0cykKKwkJeworCQkJRXhwbGFpblByb3Bl cnR5RmxvYXQoIkNhY2hlIEVzdGltYXRlZCBFbnRyaWVzIiwgIiIsICgoTWVtb2l6ZSAqKSBw bGFuKS0+ZXN0X2VudHJpZXMsIDAsIGVzKTsKKwkJCUV4cGxhaW5Qcm9wZXJ0eUZsb2F0KCJD YWNoZSBFc3RpbWF0ZWQgTkRpc3RpbmN0IiwgIiIsICgoTWVtb2l6ZSAqKSBwbGFuKS0+bmRp c3RpbmN0LCAwLCBlcyk7CisJCX0KIAl9CiAJZWxzZQogCXsKQEAgLTM2MzYsNiArMzY0MSwx MyBAQCBzaG93X21lbW9pemVfaW5mbyhNZW1vaXplU3RhdGUgKm1zdGF0ZSwgTGlzdCAqYW5j ZXN0b3JzLCBFeHBsYWluU3RhdGUgKmVzKQogCQlhcHBlbmRTdHJpbmdJbmZvKGVzLT5zdHIs ICJDYWNoZSBLZXk6ICVzXG4iLCBrZXlzdHIuZGF0YSk7CiAJCUV4cGxhaW5JbmRlbnRUZXh0 KGVzKTsKIAkJYXBwZW5kU3RyaW5nSW5mbyhlcy0+c3RyLCAiQ2FjaGUgTW9kZTogJXNcbiIs IG1zdGF0ZS0+YmluYXJ5X21vZGUgPyAiYmluYXJ5IiA6ICJsb2dpY2FsIik7CisJCWlmIChl cy0+Y29zdHMpCisJCXsKKwkJCUV4cGxhaW5JbmRlbnRUZXh0KGVzKTsKKwkJCWFwcGVuZFN0 cmluZ0luZm8oZXMtPnN0ciwgIkNhY2hlIEVzdGltYXRlZCBFbnRyaWVzOiAlZFxuIiwgKChN ZW1vaXplICopIHBsYW4pLT5lc3RfZW50cmllcyk7CisJCQlFeHBsYWluSW5kZW50VGV4dChl cyk7CisJCQlhcHBlbmRTdHJpbmdJbmZvKGVzLT5zdHIsICJDYWNoZSBFc3RpbWF0ZWQgTkRp c3RpbmN0OiAlMC4wZlxuIiwgKChNZW1vaXplICopIHBsYW4pLT5uZGlzdGluY3QpOworCQl9 CiAJfQogCiAJcGZyZWUoa2V5c3RyLmRhdGEpOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQv b3B0aW1pemVyL3BhdGgvY29zdHNpemUuYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRo L2Nvc3RzaXplLmMKaW5kZXggMjU2NTY4ZDA1YTIuLjljMDczOGRhNGZlIDEwMDY0NAotLS0g YS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9jb3N0c2l6ZS5jCisrKyBiL3NyYy9iYWNr ZW5kL29wdGltaXplci9wYXRoL2Nvc3RzaXplLmMKQEAgLTI2MDQsNiArMjYwNCw5IEBAIGNv c3RfbWVtb2l6ZV9yZXNjYW4oUGxhbm5lckluZm8gKnJvb3QsIE1lbW9pemVQYXRoICptcGF0 aCwKIAltcGF0aC0+ZXN0X2VudHJpZXMgPSBNaW4oTWluKG5kaXN0aW5jdCwgZXN0X2NhY2hl X2VudHJpZXMpLAogCQkJCQkJCSBQR19VSU5UMzJfTUFYKTsKIAorCS8qIFJlbWVtYmVyIG5k aXN0aW5jdCBmb3IgYSBwb3RlbnRpYWwgRVhQTEFJTiBsYXRlciAqLworCW1wYXRoLT5uZGlz dGluY3QgPSBuZGlzdGluY3Q7CisKIAkvKgogCSAqIFdoZW4gdGhlIG51bWJlciBvZiBkaXN0 aW5jdCBwYXJhbWV0ZXIgdmFsdWVzIGlzIGFib3ZlIHRoZSBhbW91bnQgd2UgY2FuCiAJICog c3RvcmUgaW4gdGhlIGNhY2hlLCB0aGVuIHdlJ2xsIGhhdmUgdG8gZXZpY3Qgc29tZSBlbnRy aWVzIGZyb20gdGhlCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9j cmVhdGVwbGFuLmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9jcmVhdGVwbGFuLmMK aW5kZXggNzVlMmIwYjkwMzYuLjc5Nzk1YTJiNWYyIDEwMDY0NAotLS0gYS9zcmMvYmFja2Vu ZC9vcHRpbWl6ZXIvcGxhbi9jcmVhdGVwbGFuLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1p emVyL3BsYW4vY3JlYXRlcGxhbi5jCkBAIC0yODQsNyArMjg0LDggQEAgc3RhdGljIE1hdGVy aWFsICptYWtlX21hdGVyaWFsKFBsYW4gKmxlZnR0cmVlKTsKIHN0YXRpYyBNZW1vaXplICpt YWtlX21lbW9pemUoUGxhbiAqbGVmdHRyZWUsIE9pZCAqaGFzaG9wZXJhdG9ycywKIAkJCQkJ CQkgT2lkICpjb2xsYXRpb25zLCBMaXN0ICpwYXJhbV9leHBycywKIAkJCQkJCQkgYm9vbCBz aW5nbGVyb3csIGJvb2wgYmluYXJ5X21vZGUsCi0JCQkJCQkJIHVpbnQzMiBlc3RfZW50cmll cywgQml0bWFwc2V0ICprZXlwYXJhbWlkcyk7CisJCQkJCQkJdWludDMyIGVzdF9lbnRyaWVz LCBCaXRtYXBzZXQgKmtleXBhcmFtaWRzLAorCQkJCQkJCWRvdWJsZSBuZGlzdGluY3QpOwog c3RhdGljIFdpbmRvd0FnZyAqbWFrZV93aW5kb3dhZ2coTGlzdCAqdGxpc3QsIFdpbmRvd0Ns YXVzZSAqd2MsCiAJCQkJCQkJCSBpbnQgcGFydE51bUNvbHMsIEF0dHJOdW1iZXIgKnBhcnRD b2xJZHgsIE9pZCAqcGFydE9wZXJhdG9ycywgT2lkICpwYXJ0Q29sbGF0aW9ucywKIAkJCQkJ CQkJIGludCBvcmROdW1Db2xzLCBBdHRyTnVtYmVyICpvcmRDb2xJZHgsIE9pZCAqb3JkT3Bl cmF0b3JzLCBPaWQgKm9yZENvbGxhdGlvbnMsCkBAIC0xNzAzLDcgKzE3MDQsOCBAQCBjcmVh dGVfbWVtb2l6ZV9wbGFuKFBsYW5uZXJJbmZvICpyb290LCBNZW1vaXplUGF0aCAqYmVzdF9w YXRoLCBpbnQgZmxhZ3MpCiAKIAlwbGFuID0gbWFrZV9tZW1vaXplKHN1YnBsYW4sIG9wZXJh dG9ycywgY29sbGF0aW9ucywgcGFyYW1fZXhwcnMsCiAJCQkJCQliZXN0X3BhdGgtPnNpbmds ZXJvdywgYmVzdF9wYXRoLT5iaW5hcnlfbW9kZSwKLQkJCQkJCWJlc3RfcGF0aC0+ZXN0X2Vu dHJpZXMsIGtleXBhcmFtaWRzKTsKKwkJCQkJCWJlc3RfcGF0aC0+ZXN0X2VudHJpZXMsIGtl eXBhcmFtaWRzLAorCQkJCQkJYmVzdF9wYXRoLT5uZGlzdGluY3QpOwogCiAJY29weV9nZW5l cmljX3BhdGhfaW5mbygmcGxhbi0+cGxhbiwgKFBhdGggKikgYmVzdF9wYXRoKTsKIApAQCAt NjYzNiw3ICs2NjM4LDggQEAgbWF0ZXJpYWxpemVfZmluaXNoZWRfcGxhbihQbGFuICpzdWJw bGFuKQogc3RhdGljIE1lbW9pemUgKgogbWFrZV9tZW1vaXplKFBsYW4gKmxlZnR0cmVlLCBP aWQgKmhhc2hvcGVyYXRvcnMsIE9pZCAqY29sbGF0aW9ucywKIAkJCSBMaXN0ICpwYXJhbV9l eHBycywgYm9vbCBzaW5nbGVyb3csIGJvb2wgYmluYXJ5X21vZGUsCi0JCQkgdWludDMyIGVz dF9lbnRyaWVzLCBCaXRtYXBzZXQgKmtleXBhcmFtaWRzKQorCQkJdWludDMyIGVzdF9lbnRy aWVzLCBCaXRtYXBzZXQgKmtleXBhcmFtaWRzLAorCQkJZG91YmxlIG5kaXN0aW5jdCkKIHsK IAlNZW1vaXplICAgICpub2RlID0gbWFrZU5vZGUoTWVtb2l6ZSk7CiAJUGxhbgkgICAqcGxh biA9ICZub2RlLT5wbGFuOwpAQCAtNjY1NCw2ICs2NjU3LDcgQEAgbWFrZV9tZW1vaXplKFBs YW4gKmxlZnR0cmVlLCBPaWQgKmhhc2hvcGVyYXRvcnMsIE9pZCAqY29sbGF0aW9ucywKIAlu b2RlLT5iaW5hcnlfbW9kZSA9IGJpbmFyeV9tb2RlOwogCW5vZGUtPmVzdF9lbnRyaWVzID0g ZXN0X2VudHJpZXM7CiAJbm9kZS0+a2V5cGFyYW1pZHMgPSBrZXlwYXJhbWlkczsKKwlub2Rl LT5uZGlzdGluY3QgPSBuZGlzdGluY3Q7CiAKIAlyZXR1cm4gbm9kZTsKIH0KZGlmZiAtLWdp dCBhL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3BhdGhub2RlLmMgYi9zcmMvYmFja2Vu ZC9vcHRpbWl6ZXIvdXRpbC9wYXRobm9kZS5jCmluZGV4IDkzZTczY2I0NGRiLi4xNjc2ZTIw ODc5YSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcGF0aG5vZGUu YworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9wYXRobm9kZS5jCkBAIC0xNzAx LDYgKzE3MDEsOSBAQCBjcmVhdGVfbWVtb2l6ZV9wYXRoKFBsYW5uZXJJbmZvICpyb290LCBS ZWxPcHRJbmZvICpyZWwsIFBhdGggKnN1YnBhdGgsCiAJQXNzZXJ0KGVuYWJsZV9tZW1vaXpl KTsKIAlwYXRobm9kZS0+cGF0aC5kaXNhYmxlZF9ub2RlcyA9IHN1YnBhdGgtPmRpc2FibGVk X25vZGVzOwogCisJLyogRXN0aW1hdGVkIG51bWJlciBvZiBkaXN0aW5jdCBtZW1vaXphdGlv biBrZXlzLCBjb21wdXRlZCB1c2luZyBlc3RpbWF0ZV9udW1fZ3JvdXBzKCkgKi8KKwlwYXRo bm9kZS0+bmRpc3RpbmN0ID0gMDsKKwogCS8qCiAJICogQWRkIGEgc21hbGwgYWRkaXRpb25h bCBjaGFyZ2UgZm9yIGNhY2hpbmcgdGhlIGZpcnN0IGVudHJ5LiAgQWxsIHRoZQogCSAqIGhh cmRlciBjYWxjdWxhdGlvbnMgZm9yIHJlc2NhbnMgYXJlIHBlcmZvcm1lZCBpbiBjb3N0X21l bW9pemVfcmVzY2FuKCkuCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9ub2Rlcy9wYXRobm9k ZXMuaCBiL3NyYy9pbmNsdWRlL25vZGVzL3BhdGhub2Rlcy5oCmluZGV4IGMyNGExZmM4NTE0 Li5lOTlkYmVlMmIzZiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvbm9kZXMvcGF0aG5vZGVz LmgKKysrIGIvc3JjL2luY2x1ZGUvbm9kZXMvcGF0aG5vZGVzLmgKQEAgLTIwNDAsNiArMjA0 MCw4IEBAIHR5cGVkZWYgc3RydWN0IE1lbW9pemVQYXRoCiAJdWludDMyCQllc3RfZW50cmll czsJLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgdGhhdCB0aGUKIAkJCQkJCQkJ ICogcGxhbm5lciBleHBlY3RzIHdpbGwgZml0IGluIHRoZSBjYWNoZSwgb3IgMAogCQkJCQkJ CQkgKiBpZiB1bmtub3duICovCisJZG91YmxlCQluZGlzdGluY3Q7CQkvKiBFc3RpbWF0ZWQg bnVtYmVyIG9mIGRpc3RpbmN0IG1lbW9pemF0aW9uIGtleXMsCisJCQkJCQkJCSAqIHVzZWQg Zm9yIGNhY2hlIHNpemUgZXZhbHVhdGlvbi4gS2VwdCBmb3IgRVhQTEFJTiAqLwogfSBNZW1v aXplUGF0aDsKIAogLyoKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL25vZGVzL3BsYW5ub2Rl cy5oIGIvc3JjL2luY2x1ZGUvbm9kZXMvcGxhbm5vZGVzLmgKaW5kZXggZjc4YmZmZDkwY2Yu LjE2YjMwN2EyMTQxIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9ub2Rlcy9wbGFubm9kZXMu aAorKysgYi9zcmMvaW5jbHVkZS9ub2Rlcy9wbGFubm9kZXMuaApAQCAtMTA2MCw2ICsxMDYw LDEyIEBAIHR5cGVkZWYgc3RydWN0IE1lbW9pemUKIAogCS8qIHBhcmFtaWRzIGZyb20gcGFy YW1fZXhwcnMgKi8KIAlCaXRtYXBzZXQgICprZXlwYXJhbWlkczsKKworCS8qCisJICogRXN0 aW1hdGVkIG51bWJlciBvZiBkaXN0aW5jdCBtZW1vaXphdGlvbiBrZXlzLAorCSAqIHVzZWQg Zm9yIGNhY2hlIHNpemUgZXZhbHVhdGlvbi4gS2VwdCBmb3IgRVhQTEFJTgorCSAqLworCWRv dWJsZQkJbmRpc3RpbmN0OwogfSBNZW1vaXplOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tCi0t IAoyLjM0LjEKCg== --------------exMJe9ahHKzsN5NWAJLY7yF4--