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 1tzuVd-008QV6-02 for pgsql-hackers@arkaria.postgresql.org; Wed, 02 Apr 2025 09:35:45 +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 1tzuVb-00BVXY-P2 for pgsql-hackers@arkaria.postgresql.org; Wed, 02 Apr 2025 09:35:43 +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 1tzuVb-00BVXQ-8j for pgsql-hackers@lists.postgresql.org; Wed, 02 Apr 2025 09:35:43 +0000 Received: from forward502d.mail.yandex.net ([2a02:6b8:c41:1300:1:45:d181:d502]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1tzuVY-002wH1-1C for pgsql-hackers@lists.postgresql.org; Wed, 02 Apr 2025 09:35:42 +0000 Received: from mail-nwsmtp-smtp-production-main-84.klg.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-84.klg.yp-c.yandex.net [IPv6:2a02:6b8:c42:8741:0:640:b274:0]) by forward502d.mail.yandex.net (Yandex) with ESMTPS id 348F46173C; Wed, 2 Apr 2025 12:35:38 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-84.klg.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id YZT2TlDLi0U0-wjvt4KWq; Wed, 02 Apr 2025 12:35:36 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tantorlabs.com; s=mail; t=1743586537; bh=SLd+nLLqDepuSmbSYpnWTDx0lohT30AbuRvOU54VX3s=; h=In-Reply-To:Cc:Date:References:To:Subject:Message-ID:From; b=21RSQ3hj6E1AezDf6mzbAQHOUCROJQw3KsZ/EH0tqpMkC6voT6HJWr1c6rpzxs3qW DjT8l4nYqATGgEtGfhkwbQQoomoTYSIh97TfOAtW1IhQicBvbPJZp57JhSKBhwSCSX Ja+3bI4nAxlEoHhRMQfOgRHU/pdPQnpEKHqUtu0c= Authentication-Results: mail-nwsmtp-smtp-production-main-84.klg.yp-c.yandex.net; dkim=pass header.i=@tantorlabs.com Content-Type: multipart/mixed; boundary="------------dV55vvSxJM08zNK9o2p4SzIX" Message-ID: <7c7f40ae-dc26-4191-af3f-3277ab1c45a2@tantorlabs.com> Date: Wed, 2 Apr 2025 12:35:33 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Add estimated hit ratio to Memoize in EXPLAIN to explain cost adjustment To: David Rowley Cc: Robert Haas , Tom Lane , Lukas Fittl , Daniel Gustafsson , PostgreSQL Hackers , Nikolay Samokhvalov , Andrei Lepikhov References: <8e12aa55-39eb-4e03-a8f7-077fe02309c3@gmail.com> <11c709e1-9b17-4c00-9ead-93609a09b9db@gmail.com> <1161645.1742854534@sss.pgh.pa.us> <1164845.1742856354@sss.pgh.pa.us> <3ba16aa7-3cb2-4289-b773-522ae2f03a77@tantorlabs.com> <81ef0f5a-b6a1-4417-ae3a-2bae9b8d419e@gmail.com> <67b5c84a-dedd-4103-af7e-0117046102fe@tantorlabs.com> <580fe72c-85be-45a8-9e00-6b5417690557@tantorlabs.com> 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. --------------dV55vvSxJM08zNK9o2p4SzIX Content-Type: multipart/alternative; boundary="------------ueH7P5kNsY1g30TslRhohakG" --------------ueH7P5kNsY1g30TslRhohakG Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 02.04.2025 00:06, David Rowley wrote: > I tried to move things along to address Tom's concern about not > wanting to show this in EXPLAIN's standard output. I suggested in [1] > that we could use EXPLAIN ANALYZE, but nobody commented on that. > EXPLAIN ANALYZE is much more verbose than EXPLAIN already, and if we > put these in EXPLAIN ANALYZE then the viewer can more easily compare > planned vs actual. I had mentioned that Hash Join does something like > this for buckets. > > David > > [1]https://postgr.es/m/CAApHDvqPkWmz1Lq23c9CD+mAW=hgPrD289tC30f3H1f6Ng59+g@mail.gmail.com Apologies for not addressing your earlier suggestion properly. After reconsidering, I agree that showing ndistinct and est_entries in EXPLAIN ANALYZE when there are actual cache misses is the best approach. This is typically when users notice performance regressions and start investigating the cause, so surfacing planner expectations at that point can be the most useful. I attached v6 patch with changes. -- Best regards, Ilia Evdokimov, Tantor Labs LLC. --------------ueH7P5kNsY1g30TslRhohakG Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 7bit


On 02.04.2025 00:06, David Rowley wrote:
I tried to move things along to address Tom's concern about not
wanting to show this in EXPLAIN's standard output. I suggested in [1]
that we could use EXPLAIN ANALYZE, but nobody commented on that.
EXPLAIN ANALYZE is much more verbose than EXPLAIN already, and if we
put these in EXPLAIN ANALYZE then the viewer can more easily compare
planned vs actual. I had mentioned that Hash Join does something like
this for buckets.

David

[1] https://postgr.es/m/CAApHDvqPkWmz1Lq23c9CD+mAW=hgPrD289tC30f3H1f6Ng59+g@mail.gmail.com


Apologies for not addressing your earlier suggestion properly. After reconsidering, I agree that showing ndistinct and est_entries in EXPLAIN ANALYZE when there are actual cache misses is the best approach. This is typically when users notice performance regressions and start investigating the cause, so surfacing planner expectations at that point can be the most useful. I attached v6 patch with changes.

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

--------------ueH7P5kNsY1g30TslRhohakG-- --------------dV55vvSxJM08zNK9o2p4SzIX Content-Type: text/x-patch; charset=UTF-8; name="v6-0001-Display-estimated-distinct-keys-and-cache-capacity.patch" Content-Disposition: attachment; filename*0="v6-0001-Display-estimated-distinct-keys-and-cache-capacity.p"; filename*1="atch" Content-Transfer-Encoding: base64 RnJvbSAzNmVkODY2ZTNkMjhhNzA5ZmQxMTMzYTg5ZWNkYzdhMjY1NGE2NTdmIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBJbGlhIEV2ZG9raW1vdiA8aWx5YS5ldmRva2ltb3ZA dGFudG9ybGFicy5ydT4KRGF0ZTogV2VkLCAyIEFwciAyMDI1IDEwOjQ5OjI3ICswMzAwClN1 YmplY3Q6IFtQQVRDSCB2Nl0gRGlzcGxheSBlc3RpbWF0ZWQgZGlzdGluY3Qga2V5cyBhbmQg Y2FjaGUgY2FwYWNpdHkgaW4KIEVYUExBSU4gQU5BTFlaRSBmb3IgTWVtb2l6ZSB3aGVuIGNh Y2hlIG1pc3NlcyBvY2N1cgoKLS0tCiBzcmMvYmFja2VuZC9jb21tYW5kcy9leHBsYWluLmMg ICAgICAgICAgfCAxMyArKysrKysrKysrKysrCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0 aC9jb3N0c2l6ZS5jICAgfCAgMyArKysKIHNyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2Ny ZWF0ZXBsYW4uYyB8IDEwICsrKysrKystLS0KIHNyYy9iYWNrZW5kL29wdGltaXplci91dGls L3BhdGhub2RlLmMgICB8ICAzICsrKwogc3JjL2luY2x1ZGUvbm9kZXMvcGF0aG5vZGVzLmgg ICAgICAgICAgIHwgIDIgKysKIHNyYy9pbmNsdWRlL25vZGVzL3BsYW5ub2Rlcy5oICAgICAg ICAgICB8ICA2ICsrKysrKwogNiBmaWxlcyBjaGFuZ2VkLCAzNCBpbnNlcnRpb25zKCspLCAz IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2V4cGxh aW4uYyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2V4cGxhaW4uYwppbmRleCBlZjhhYTQ4OWFm OC4uZjIxZGU1OGUwYTAgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2V4cGxh aW4uYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9leHBsYWluLmMKQEAgLTM2MzUsNiAr MzYzNSwxOSBAQCBzaG93X21lbW9pemVfaW5mbyhNZW1vaXplU3RhdGUgKm1zdGF0ZSwgTGlz dCAqYW5jZXN0b3JzLCBFeHBsYWluU3RhdGUgKmVzKQogCiAJaWYgKG1zdGF0ZS0+c3RhdHMu Y2FjaGVfbWlzc2VzID4gMCkKIAl7CisJCWlmIChlcy0+Zm9ybWF0ID09IEVYUExBSU5fRk9S TUFUX1RFWFQpCisJCXsKKwkJCUV4cGxhaW5JbmRlbnRUZXh0KGVzKTsKKwkJCWFwcGVuZFN0 cmluZ0luZm8oZXMtPnN0ciwgIkVzdGltYXRlZCBDYXBhY2l0eTogJXUgIEVzdGltYXRlZCBE aXN0aW5jdCBMb29rdXAgS2V5czogJTAuMGZcbiIsCisJCQkJCQkJKChNZW1vaXplICopIHBs YW4pLT5lc3RfZW50cmllcywKKwkJCQkJCQkoKE1lbW9pemUgKikgcGxhbiktPmVzdF91bmlx dWVfa2V5cyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlFeHBsYWluUHJvcGVydHlVSW50ZWdl cigiRXN0aW1hdGVkIENhcGFjaXR5IiwgIiIsICgoTWVtb2l6ZSAqKSBwbGFuKS0+ZXN0X2Vu dHJpZXMsIGVzKTsKKwkJCUV4cGxhaW5Qcm9wZXJ0eUZsb2F0KCJFc3RpbWF0ZWQgRGlzdGlu Y3QgTG9va3VwIEtleXMiLCAiIiwgKChNZW1vaXplICopIHBsYW4pLT5lc3RfdW5pcXVlX2tl eXMsIDAsIGVzKTsKKwkJfQorCiAJCS8qCiAJCSAqIG1lbV9wZWFrIGlzIG9ubHkgc2V0IHdo ZW4gd2UgZnJlZWQgbWVtb3J5LCBzbyB3ZSBtdXN0IHVzZSBtZW1fdXNlZAogCQkgKiB3aGVu IG1lbV9wZWFrIGlzIDAuCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0 aC9jb3N0c2l6ZS5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvY29zdHNpemUuYwpp bmRleCBmNmY3N2I4ZmUxOS4uZTNhYmY5Y2NjMjYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L29wdGltaXplci9wYXRoL2Nvc3RzaXplLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVy L3BhdGgvY29zdHNpemUuYwpAQCAtMjYwNCw2ICsyNjA0LDkgQEAgY29zdF9tZW1vaXplX3Jl c2NhbihQbGFubmVySW5mbyAqcm9vdCwgTWVtb2l6ZVBhdGggKm1wYXRoLAogCW1wYXRoLT5l c3RfZW50cmllcyA9IE1pbihNaW4obmRpc3RpbmN0LCBlc3RfY2FjaGVfZW50cmllcyksCiAJ CQkJCQkJIFBHX1VJTlQzMl9NQVgpOwogCisJLyogUmVtZW1iZXIgbmRpc3RpbmN0IGZvciBh IHBvdGVudGlhbCBFWFBMQUlOIGxhdGVyICovCisJbXBhdGgtPmVzdF91bmlxdWVfa2V5cyA9 IG5kaXN0aW5jdDsKKwogCS8qCiAJICogV2hlbiB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IHBh cmFtZXRlciB2YWx1ZXMgaXMgYWJvdmUgdGhlIGFtb3VudCB3ZSBjYW4KIAkgKiBzdG9yZSBp biB0aGUgY2FjaGUsIHRoZW4gd2UnbGwgaGF2ZSB0byBldmljdCBzb21lIGVudHJpZXMgZnJv bSB0aGUKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2NyZWF0ZXBs YW4uYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2NyZWF0ZXBsYW4uYwppbmRleCA3 NWUyYjBiOTAzNi4uMzg4ODI1MDE0ODQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGlt aXplci9wbGFuL2NyZWF0ZXBsYW4uYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxh bi9jcmVhdGVwbGFuLmMKQEAgLTI4NCw3ICsyODQsOCBAQCBzdGF0aWMgTWF0ZXJpYWwgKm1h a2VfbWF0ZXJpYWwoUGxhbiAqbGVmdHRyZWUpOwogc3RhdGljIE1lbW9pemUgKm1ha2VfbWVt b2l6ZShQbGFuICpsZWZ0dHJlZSwgT2lkICpoYXNob3BlcmF0b3JzLAogCQkJCQkJCSBPaWQg KmNvbGxhdGlvbnMsIExpc3QgKnBhcmFtX2V4cHJzLAogCQkJCQkJCSBib29sIHNpbmdsZXJv dywgYm9vbCBiaW5hcnlfbW9kZSwKLQkJCQkJCQkgdWludDMyIGVzdF9lbnRyaWVzLCBCaXRt YXBzZXQgKmtleXBhcmFtaWRzKTsKKwkJCQkJCQkgdWludDMyIGVzdF9lbnRyaWVzLCBkb3Vi bGUgZXN0X3VuaXF1ZV9rZXlzLAorCQkJCQkJCSBCaXRtYXBzZXQgKmtleXBhcmFtaWRzKTsK IHN0YXRpYyBXaW5kb3dBZ2cgKm1ha2Vfd2luZG93YWdnKExpc3QgKnRsaXN0LCBXaW5kb3dD bGF1c2UgKndjLAogCQkJCQkJCQkgaW50IHBhcnROdW1Db2xzLCBBdHRyTnVtYmVyICpwYXJ0 Q29sSWR4LCBPaWQgKnBhcnRPcGVyYXRvcnMsIE9pZCAqcGFydENvbGxhdGlvbnMsCiAJCQkJ CQkJCSBpbnQgb3JkTnVtQ29scywgQXR0ck51bWJlciAqb3JkQ29sSWR4LCBPaWQgKm9yZE9w ZXJhdG9ycywgT2lkICpvcmRDb2xsYXRpb25zLApAQCAtMTcwMyw3ICsxNzA0LDggQEAgY3Jl YXRlX21lbW9pemVfcGxhbihQbGFubmVySW5mbyAqcm9vdCwgTWVtb2l6ZVBhdGggKmJlc3Rf cGF0aCwgaW50IGZsYWdzKQogCiAJcGxhbiA9IG1ha2VfbWVtb2l6ZShzdWJwbGFuLCBvcGVy YXRvcnMsIGNvbGxhdGlvbnMsIHBhcmFtX2V4cHJzLAogCQkJCQkJYmVzdF9wYXRoLT5zaW5n bGVyb3csIGJlc3RfcGF0aC0+YmluYXJ5X21vZGUsCi0JCQkJCQliZXN0X3BhdGgtPmVzdF9l bnRyaWVzLCBrZXlwYXJhbWlkcyk7CisJCQkJCQliZXN0X3BhdGgtPmVzdF9lbnRyaWVzLCBi ZXN0X3BhdGgtPmVzdF91bmlxdWVfa2V5cywKKwkJCQkJCWtleXBhcmFtaWRzKTsKIAogCWNv cHlfZ2VuZXJpY19wYXRoX2luZm8oJnBsYW4tPnBsYW4sIChQYXRoICopIGJlc3RfcGF0aCk7 CiAKQEAgLTY2MzYsNyArNjYzOCw4IEBAIG1hdGVyaWFsaXplX2ZpbmlzaGVkX3BsYW4oUGxh biAqc3VicGxhbikKIHN0YXRpYyBNZW1vaXplICoKIG1ha2VfbWVtb2l6ZShQbGFuICpsZWZ0 dHJlZSwgT2lkICpoYXNob3BlcmF0b3JzLCBPaWQgKmNvbGxhdGlvbnMsCiAJCQkgTGlzdCAq cGFyYW1fZXhwcnMsIGJvb2wgc2luZ2xlcm93LCBib29sIGJpbmFyeV9tb2RlLAotCQkJIHVp bnQzMiBlc3RfZW50cmllcywgQml0bWFwc2V0ICprZXlwYXJhbWlkcykKKwkJCXVpbnQzMiBl c3RfZW50cmllcywgZG91YmxlIGVzdF91bmlxdWVfa2V5cywKKwkJCUJpdG1hcHNldCAqa2V5 cGFyYW1pZHMpCiB7CiAJTWVtb2l6ZSAgICAqbm9kZSA9IG1ha2VOb2RlKE1lbW9pemUpOwog CVBsYW4JICAgKnBsYW4gPSAmbm9kZS0+cGxhbjsKQEAgLTY2NTQsNiArNjY1Nyw3IEBAIG1h a2VfbWVtb2l6ZShQbGFuICpsZWZ0dHJlZSwgT2lkICpoYXNob3BlcmF0b3JzLCBPaWQgKmNv bGxhdGlvbnMsCiAJbm9kZS0+YmluYXJ5X21vZGUgPSBiaW5hcnlfbW9kZTsKIAlub2RlLT5l c3RfZW50cmllcyA9IGVzdF9lbnRyaWVzOwogCW5vZGUtPmtleXBhcmFtaWRzID0ga2V5cGFy YW1pZHM7CisJbm9kZS0+ZXN0X3VuaXF1ZV9rZXlzID0gZXN0X3VuaXF1ZV9rZXlzOwogCiAJ cmV0dXJuIG5vZGU7CiB9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRp bC9wYXRobm9kZS5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcGF0aG5vZGUuYwpp bmRleCA5M2U3M2NiNDRkYi4uMWZiY2RhOTkwNjcgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L29wdGltaXplci91dGlsL3BhdGhub2RlLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVy L3V0aWwvcGF0aG5vZGUuYwpAQCAtMTcwMSw2ICsxNzAxLDkgQEAgY3JlYXRlX21lbW9pemVf cGF0aChQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLCBQYXRoICpzdWJwYXRo LAogCUFzc2VydChlbmFibGVfbWVtb2l6ZSk7CiAJcGF0aG5vZGUtPnBhdGguZGlzYWJsZWRf bm9kZXMgPSBzdWJwYXRoLT5kaXNhYmxlZF9ub2RlczsKIAorCS8qIEVzdGltYXRlZCBudW1i ZXIgb2YgZGlzdGluY3QgbWVtb2l6YXRpb24ga2V5cywgY29tcHV0ZWQgdXNpbmcgZXN0aW1h dGVfbnVtX2dyb3VwcygpICovCisJcGF0aG5vZGUtPmVzdF91bmlxdWVfa2V5cyA9IDA7CisK IAkvKgogCSAqIEFkZCBhIHNtYWxsIGFkZGl0aW9uYWwgY2hhcmdlIGZvciBjYWNoaW5nIHRo ZSBmaXJzdCBlbnRyeS4gIEFsbCB0aGUKIAkgKiBoYXJkZXIgY2FsY3VsYXRpb25zIGZvciBy ZXNjYW5zIGFyZSBwZXJmb3JtZWQgaW4gY29zdF9tZW1vaXplX3Jlc2NhbigpLgpkaWZmIC0t Z2l0IGEvc3JjL2luY2x1ZGUvbm9kZXMvcGF0aG5vZGVzLmggYi9zcmMvaW5jbHVkZS9ub2Rl cy9wYXRobm9kZXMuaAppbmRleCBjMjRhMWZjODUxNC4uMDk0NmNjZWE5OTQgMTAwNjQ0Ci0t LSBhL3NyYy9pbmNsdWRlL25vZGVzL3BhdGhub2Rlcy5oCisrKyBiL3NyYy9pbmNsdWRlL25v ZGVzL3BhdGhub2Rlcy5oCkBAIC0yMDQwLDYgKzIwNDAsOCBAQCB0eXBlZGVmIHN0cnVjdCBN ZW1vaXplUGF0aAogCXVpbnQzMgkJZXN0X2VudHJpZXM7CS8qIFRoZSBtYXhpbXVtIG51bWJl ciBvZiBlbnRyaWVzIHRoYXQgdGhlCiAJCQkJCQkJCSAqIHBsYW5uZXIgZXhwZWN0cyB3aWxs IGZpdCBpbiB0aGUgY2FjaGUsIG9yIDAKIAkJCQkJCQkJICogaWYgdW5rbm93biAqLworCWRv dWJsZQkJZXN0X3VuaXF1ZV9rZXlzOwkJLyogRXN0aW1hdGVkIG51bWJlciBvZiBkaXN0aW5j dCBtZW1vaXphdGlvbiBrZXlzLAorCQkJCQkJCQkgKiB1c2VkIGZvciBjYWNoZSBzaXplIGV2 YWx1YXRpb24uIEtlcHQgZm9yIEVYUExBSU4gKi8KIH0gTWVtb2l6ZVBhdGg7CiAKIC8qCmRp ZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9ub2Rlcy9wbGFubm9kZXMuaCBiL3NyYy9pbmNsdWRl L25vZGVzL3BsYW5ub2Rlcy5oCmluZGV4IDY1OGQ3NjIyNWU0Li4zZDlkM2ExMTU5ZCAxMDA2 NDQKLS0tIGEvc3JjL2luY2x1ZGUvbm9kZXMvcGxhbm5vZGVzLmgKKysrIGIvc3JjL2luY2x1 ZGUvbm9kZXMvcGxhbm5vZGVzLmgKQEAgLTEwNjMsNiArMTA2MywxMiBAQCB0eXBlZGVmIHN0 cnVjdCBNZW1vaXplCiAKIAkvKiBwYXJhbWlkcyBmcm9tIHBhcmFtX2V4cHJzICovCiAJQml0 bWFwc2V0ICAqa2V5cGFyYW1pZHM7CisKKwkvKgorCSAqIEVzdGltYXRlZCBudW1iZXIgb2Yg ZGlzdGluY3QgbWVtb2l6YXRpb24ga2V5cywKKwkgKiB1c2VkIGZvciBjYWNoZSBzaXplIGV2 YWx1YXRpb24uIEtlcHQgZm9yIEVYUExBSU4KKwkgKi8KKwlkb3VibGUJCWVzdF91bmlxdWVf a2V5czsKIH0gTWVtb2l6ZTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLQotLSAKMi4zNC4xCgo= --------------dV55vvSxJM08zNK9o2p4SzIX--