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 1vH64h-00Didl-G7 for pgsql-performance@arkaria.postgresql.org; Thu, 06 Nov 2025 19:55:16 +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 1vH64f-00A2OY-Sk for pgsql-performance@arkaria.postgresql.org; Thu, 06 Nov 2025 19:55:13 +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 1vH64f-00A2OO-6g for pgsql-performance@lists.postgresql.org; Thu, 06 Nov 2025 19:55:13 +0000 Received: from mail-wr1-x42a.google.com ([2a00:1450:4864:20::42a]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vH64c-005mAt-1A for pgsql-performance@lists.postgresql.org; Thu, 06 Nov 2025 19:55:12 +0000 Received: by mail-wr1-x42a.google.com with SMTP id ffacd0b85a97d-429c7869704so2518f8f.2 for ; Thu, 06 Nov 2025 11:55:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bowt-ie.20230601.gappssmtp.com; s=20230601; t=1762458908; x=1763063708; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=Lb65qE9/2q27Ce9ftDr+ASPuBP77Jw8jZOWO7BJGtP4=; b=pGm+DrM/XcN6xFX4BY/XfO5J0eSlv3R7d9K4pqgw1qV9O0Wx/fxw6Dvk6gs5EGc8ga qq64QeVuN9evPiUKDIMF4NGP6yDi/U5AOGyLomWPLL0GtTpSjdqlIzfYMGWz0QGaZrre LVKZa1N5Yi2cDBa4ayWNbNgYw/Z58px6J4r3AC1l35Zf5QAgiGJZpf5xu6LFK8L2REin xGJW7+ZZhB/1PwNPnwiyURDgVWzO/X/TqFf0lhN5nPX/RvSESVe0GZ3hb9gH0LrFhFRg anLou+Q0LxJQluKmOp1VrLx8zMGiqe4vqofD2UZkhHJTjKzFid1LPcq6nePCLP405adt GN7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762458908; x=1763063708; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=Lb65qE9/2q27Ce9ftDr+ASPuBP77Jw8jZOWO7BJGtP4=; b=sI6VTT01TsHyWFsEcttMBlzlV4gkFK+e/wAlFfGhWwQN86Kj23zkOl4we2YpfhhbRy C7ItQEDNv1jp+59J8flDsKJcJwsjnPAmD+aiJsCrHLmJ6+nd6RJg4REneUuCclBik7Vy SEI+fZ9eiJwRYrcy0SVYnP5lCcXpxsZM5V2qcycw3u9dmjhmfBIFf+oAm8hDK1o1xCUP 7kRMVftIM/Ya6AqN6S69v9qSgQv3gOyUsg02Uwjfwc7+NFrCDUvwWoRf7ofc2vU0T3di n2oddk63mV1Tb9Ae5Wzy2OZCkZgExoI6SM6/TRVWelFzXDGUHecocCayB6hX4Nuiyvs2 aZlw== X-Gm-Message-State: AOJu0YwyhlXr5kiH4f0Vt15LRYoom3nhdVzXWxkFBlPm2aY5/wQpH8je tPcTfzXeB7R2Wb5kVhWMPWTTbtJB4udjMJ9R+/jRL0gIupE7mzeXK9Z5HI0Y9F7ZWWnmuZKXirl KFVuv/sfcjmtc+YzSzq26nGi4poY7zaZ2VqHq2XVg3A== X-Gm-Gg: ASbGncv1FrCtSzeAeIDeq+adiNugtwvtNRtqqB9umfHb46fLZSSS3ymFQ/hA2RgL/bE +OeT/Nw65lrJVWGKtdnNGTReq9GI010gYOFEzBMhxHjTH0msF0OiixDM+ldBepu5FVVbTZFIW5j dU3YIVg2qTcbJ1AfT3AeQKbZ73hg3jAwclD8jFcp5Yu1ZyLj0JFaYk65yHJqQB4jgfTbwUVkX6R tS7i669mJ+DJn1SsKDwK5Sq7I+rP2xg/iTEIilgAWwhj3z7i8hCZPQYgPbdjnbi2LNe63E= X-Google-Smtp-Source: AGHT+IF8qtfMid8HQmfrz+DcMjOqzD1kjD9r9VnAA7dB66nHHM42F1dY4W+fHw8/tUBjEMtSFm6Ic9Ix72KfRCa9m/8= X-Received: by 2002:a05:6000:186d:b0:42a:4331:3298 with SMTP id ffacd0b85a97d-42ae5af5439mr375631f8f.63.1762458908298; Thu, 06 Nov 2025 11:55:08 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Peter Geoghegan Date: Thu, 6 Nov 2025 14:54:40 -0500 X-Gm-Features: AWmQ_bls8FRKPtGKExkH3RLSBuP3G519kia_-H_-yEG5NSJEHY6qFHKnBEhn6HM Message-ID: Subject: Re: Index Searches higher than expected for skip scan To: Michael Christofides Cc: pgsql-performance@lists.postgresql.org Content-Type: multipart/mixed; boundary="000000000000294bc70642f271f6" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000294bc70642f271f6 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Thu, Nov 6, 2025 at 2:01=E2=80=AFPM Michael Christofides wrote: > I'm trying to understand the new Index Searches field in Postgres 18 expl= ain analyze output. I've put together a super simple test case (below) expe= cting a skip scan with 2 Index Searches, one for each value in the leading = (boolean) column of the index. That's a good question. You're right that in this specific case, with a boolean column, skip scan performs 4 index searches, when in principle it only really needs to do 3. > In reality, instead of 2 Index Searches, I got 4 (query plan below). During work on skip scan (and on the 17 work), I went to quite a lot of effort to build custom instrumentation that would show me exactly what an index scan was doing. Including details of the scan's array keys, and how they advance as the scan advances through the index. Attached is its output when I run your test query. The issue here is that skip scan thinks that there are 4 distinct skip array values that it must use: 1. SK_BT_MINVAL 2. false 3. true 4. SK_ISNULL SK_BT_MINVAL is a sentinel value that represents the lowest possible value that can be stored by the data type. That's the same thing as "false", which is a little bit unfortunate with a datatype like bool, where the difference might actually matter -- here we waste an access to the leftmost leaf page to "advance" the skip array from SK_BT_MINVAL to false, instead of making false the lowest skip array value directly, from the very start. This is highly unlikely to matter with a data type like integer, though: in practice it's very unlikely that the value INT_MIN is actually stored in the index, so having 2 distinct representations for the same thing (SK_BT_MINVAL and INT_MIN) is equally unlikely to result in the scan reading any more leaf pages than strictly necessary due to this implementation deficiency. We'll have to go to the leftmost leaf page to determine what the real lowest value in the index is either way -- doesn't matter if you start from SK_BT_MINVAL or from INT_MIN (unless there really are hundreds of tuples that have the value INT_MIN, when the difference between those 2 things starts to matter, as with your bool test case). I did actually think about making this work. In fact, there were revisions of the skip scan patch where it actually did work. Ultimately I judged that it wasn't worth the trouble of introducing this special case. Better to have types with skip support (like boolean and integer) behave exactly the same as all other types, by also using these SK_BT_MINVAL/SK_BT_MAXVAL sentinels (we don't use SK_BT_MAXVAL at all here because the highest skip array value is SK_ISNULL, but we would if the index was declared NULLS FIRST). That just leaves SK_ISNULL. We cannot assume that the index doesn't have any NULLs (unless the query uses IS NOT NULL directly). We might end up having to read the rightmost leaf page anyway, in which case there won't be an extra search for SK_ISNULL, but we'll likely need an extra search for this too (just like the leftmost leaf page, with SK_BT_MINVAL). This isn't an implementation deficiency -- it's strictly necessary for correctness. --=20 Peter Geoghegan --000000000000294bc70642f271f6 Content-Type: text/plain; charset="UTF-8"; name="skipscan_instrumentation.txt" Content-Disposition: attachment; filename="skipscan_instrumentation.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mhntxhop0 cGdAcmVncmVzc2lvbjo1NDMyIFsxMTE2MDAzXT0jIFNFTEVDVCBib29sZWFuX2ZpZWxkIEZST00g ZXhhbXBsZSBXSEVSRSBpbnRlZ2VyX2ZpZWxkID0gNTQzMjsKTE9HOgrwn5G+ICBidGJlZ2luc2Nh biB0byBiZWdpbiBzY2FuIG9mIGluZGV4ICJib29sX2ludF9pZHgiIGluIHdvcmtlciAtMQrimbvv uI8gIGJ0cmVzY2FuCmJ0cmVzY2FuOiBCVFNjYW5Qb3NJbnZhbGlkYXRlKCkgY2FsbGVkIGZvciBt YXJrUG9zCl9idF9wcmVwcm9jZXNzX2tleXM6ICBzY2FuLT5rZXlEYXRhWzBdOiBbIHN0cmF0ZWd5 OiA9ICwgYXR0bm86IDIvImludGVnZXJfZmllbGQiLCBmdW5jOiBpbnQ4NGVxLCBmbGFnczogW10g XQpfYnRfcHJlcHJvY2Vzc19rZXlzOiAgICBzby0+a2V5RGF0YVswXTogWyBzdHJhdGVneTogPSAs IGF0dG5vOiAxLyJib29sZWFuX2ZpZWxkIiwgZnVuYzogYm9vbGVxLCBmbGFnczogW1NLX1NFQVJD SEFSUkFZLCBTS19CVF9SRVFGV0QsIFNLX0JUX1JFUUJLV0QsIFNLX0JUX1NLSVBdIF0KICAgICAg ICAgICAgICAgICAgICAgICAgc28tPmtleURhdGFbMV06IFsgc3RyYXRlZ3k6ID0gLCBhdHRubzog Mi8iaW50ZWdlcl9maWVsZCIsIGZ1bmM6IGludDg0ZXEsIGZsYWdzOiBbU0tfQlRfUkVRRldELCBT S19CVF9SRVFCS1dEXSBdCl9idF9wcmVwcm9jZXNzX2tleXM6IHNjYW4tPm51bWJlck9mS2V5cyBp cyAxLCBzby0+bnVtYmVyT2ZLZXlzIG9uIG91dHB1dCBpcyAyLCBzby0+bnVtQXJyYXlLZXlzIG9u IG91dHB1dCBpcyAxCgrinpUgICAgIOKelSAgICAg4p6VCl9idF9maXJzdDogc2sgY291bGQgbm90 IGJlIGZvcm1lZCwgc28gZGVzY2VuZGluZyB0byBsZWZ0bW9zdCBsZWFmIHBhZ2UgaW4gd2hvbGUg aW5kZXgKX2J0X3JlYWRwYWdlOiDwn42AICAxIHdpdGggMTIyIG9mZnNldHMvdHVwbGVzIChsZWZ0 c2liIDAsIHJpZ2h0c2liIDIpIOKeoe+4jwogX2J0X3JlYWRwYWdlIGZpcnN0OiAoYm9vbGVhbl9m aWVsZCwgaW50ZWdlcl9maWVsZCk9KGYsIDApLCBUSUQ9JygxNzEsNjgpJywgMHg3ZmZmYWVhYTlm YzgsIGZyb20gbm9uLXBpdm90IG9mZm51bSAyIHN0YXJ0ZWQgcGFnZQogX2J0X3JlYWRwYWdlIHBz dGF0ZS5zdGFydGlrZXk6IDAsIHdpdGggMiBzY2FuIGtleXMKICBfYnRfY2hlY2trZXlzOiBjb21w YXJpbmcgKGJvb2xlYW5fZmllbGQsIGludGVnZXJfZmllbGQpPShmLCAwKSB3aXRoIFRJRCAoMTcx LDY4KSwgMHg3ZmZmYWVhYTlmYzgKX2J0X2FkdmFuY2VfYXJyYXlfa2V5cywgc2t0cmlnIChyZXF1 aXJlZCk6IDAsIHR1cGxlOiAoYm9vbGVhbl9maWVsZCwgaW50ZWdlcl9maWVsZCk9KGYsIDApLCAw eDdmZmZhZWFhOWZjOAoKICAtIHNrOiAwLCBza19hdHRubzogMSwgY3VyX2VsZW06ICAgLTEsIG51 bV9lbGVtczogICAtMSwgdmFsOiA/Pz8/PyBTS19CVF9NSU5WQUwgICAgICAgICAgICA8LS0KCiAg KyBzazogMCwgc2tfYXR0bm86IDEsIGN1cl9lbGVtOiAgIC0xLCBudW1fZWxlbXM6ICAgLTEsIHZh bDogZgoKIF9idF9yZWFkcGFnZSBmaW5hbDogKGJvb2xlYW5fZmllbGQsIGludGVnZXJfZmllbGQp PShmLCAwKSwgVElEPScoMTcxLDY4KScsIDB4N2ZmZmFlYWE5ZmM4LCBmcm9tIG5vbi1waXZvdCBv ZmZudW0gMiBzZXQgc28tPmN1cnJQb3MubW9yZVJpZ2h0PWZhbHNlIOKeoe+4jyAg8J+bkQogX2J0 X3JlYWRwYWdlIHN0YXRzOiBjdXJyUG9zLmZpcnN0SXRlbTogMCwgY3VyclBvcy5sYXN0SXRlbTog LTEsIG5tYXRjaGluZzogMCDinYwKCuKelSAgICAg4p6VICAgICDinpUKX2J0X2ZpcnN0OiBza19h dHRubyAxLiB2YWw6IGYsIGZ1bmM6IGJ0Ym9vbGNtcCwgZmxhZ3M6IFtTS19TRUFSQ0hBUlJBWSwg U0tfQlRfUkVRRldELCBTS19CVF9SRVFCS1dELCBTS19CVF9TS0lQXQogICAgICAgICAgIHNrX2F0 dG5vIDIuIHZhbDogNTQzMiwgZnVuYzogYnRpbnQ4NGNtcCwgZmxhZ3M6IFtTS19CVF9SRVFGV0Qs IFNLX0JUX1JFUUJLV0RdCiAgICAgICAgICAgd2l0aCBzdHJhdF90b3RhbD0nPSAnLCBpbnNrZXku a2V5cz0yLCBpbnNrZXkubmV4dGtleT0wLCBpbnNrZXkuYmFja3dhcmQ9MArwn5S9ICA9PT09PT09 PT09PT09PT09PT09PSBfYnRfc2VhcmNoIGJlZ2luIGF0IHJvb3QgMyBsZXZlbCAxID09PT09PT09 PT09PT09PT09PT09Cl9idF9tb3ZlcmlnaHQ6IGJsayAzIGlzIHJpZ2h0bW9zdApfYnRfc2VhcmNo OiBzayA+IChib29sZWFuX2ZpZWxkLCBpbnRlZ2VyX2ZpZWxkKT0oZiwgNTMyMSksIHNrIDw9IChi b29sZWFuX2ZpZWxkLCBpbnRlZ2VyX2ZpZWxkKT0oZiwgNTQ0MykK8J+UvSAgLS0tLS0tLS0tLS0t LS0tLS0tLS0gZGVzY2VuZGVkIHRvIGNoaWxkIGJsayA0NiBsZXZlbCAwIC0tLS0tLS0tLS0tLS0t LS0tLS0tCl9idF9tb3ZlcmlnaHQ6IChib29sZWFuX2ZpZWxkLCBpbnRlZ2VyX2ZpZWxkKT0oZiwg NTQ0MyksIGhpZ2gga2V5IG5vIG1vdmUgcmlnaHQK4o+577iPID09PT09PT09PT09PT09PT09PT09 IF9idF9zZWFyY2ggZW5kID09PT09PT09PT09PT09PT09PT09IOKeoe+4jwpfYnRfcmVhZHBhZ2U6 IPCfjYAgIDQ2IHdpdGggMTIzIG9mZnNldHMvdHVwbGVzIChsZWZ0c2liIDQ1LCByaWdodHNpYiA0 Nykg4p6h77iPCiBfYnRfcmVhZHBhZ2UgZmlyc3Q6IChib29sZWFuX2ZpZWxkLCBpbnRlZ2VyX2Zp ZWxkKT0oZiwgNTQzMiksIFRJRD0nKDUsNDApJywgMHg3ZmZmYWVhYWU3NzAsIGZyb20gbm9uLXBp dm90IG9mZm51bSAxMTMgc3RhcnRlZCBwYWdlCiBfYnRfcmVhZHBhZ2UgcHN0YXRlLnN0YXJ0aWtl eTogMCwgd2l0aCAyIHNjYW4ga2V5cwogIF9idF9jaGVja2tleXM6IGNvbXBhcmluZyAoYm9vbGVh bl9maWVsZCwgaW50ZWdlcl9maWVsZCk9KGYsIDU0MzIpIHdpdGggVElEICg1LDQwKSwgMHg3ZmZm YWVhYWU3NzAKICBfYnRfY2hlY2trZXlzOiBjb21wYXJpbmcgKGJvb2xlYW5fZmllbGQsIGludGVn ZXJfZmllbGQpPShmLCA1NDMzKSB3aXRoIFRJRCAoNjgsMjApLCAweDdmZmZhZWFhZTc1OApfYnRf YWR2YW5jZV9hcnJheV9rZXlzLCBza3RyaWcgKHJlcXVpcmVkKTogMSwgdHVwbGU6IChib29sZWFu X2ZpZWxkLCBpbnRlZ2VyX2ZpZWxkKT0oZiwgNTQzMyksIDB4N2ZmZmFlYWFlNzU4CgogIC0gc2s6 IDAsIHNrX2F0dG5vOiAxLCBjdXJfZWxlbTogICAtMSwgbnVtX2VsZW1zOiAgIC0xLCB2YWw6IGYK CiAgKyBzazogMCwgc2tfYXR0bm86IDEsIGN1cl9lbGVtOiAgIC0xLCBudW1fZWxlbXM6ICAgLTEs IHZhbDogdAoKIF9idF9yZWFkcGFnZSBmaW5hbDogKGJvb2xlYW5fZmllbGQsIGludGVnZXJfZmll bGQpPShmLCA1NDMzKSwgVElEPScoNjgsMjApJywgMHg3ZmZmYWVhYWU3NTgsIGZyb20gbm9uLXBp dm90IG9mZm51bSAxMTQgc2V0IHNvLT5jdXJyUG9zLm1vcmVSaWdodD1mYWxzZSDinqHvuI8gIPCf m5EKIF9idF9yZWFkcGFnZSBzdGF0czogY3VyclBvcy5maXJzdEl0ZW06IDAsIGN1cnJQb3MubGFz dEl0ZW06IDQsIG5tYXRjaGluZzogNSDinIUKCuKelSAgICAg4p6VICAgICDinpUKX2J0X2ZpcnN0 OiBza19hdHRubyAxLiB2YWw6IHQsIGZ1bmM6IGJ0Ym9vbGNtcCwgZmxhZ3M6IFtTS19TRUFSQ0hB UlJBWSwgU0tfQlRfUkVRRldELCBTS19CVF9SRVFCS1dELCBTS19CVF9TS0lQXQogICAgICAgICAg IHNrX2F0dG5vIDIuIHZhbDogNTQzMiwgZnVuYzogYnRpbnQ4NGNtcCwgZmxhZ3M6IFtTS19CVF9S RVFGV0QsIFNLX0JUX1JFUUJLV0RdCiAgICAgICAgICAgd2l0aCBzdHJhdF90b3RhbD0nPSAnLCBp bnNrZXkua2V5cz0yLCBpbnNrZXkubmV4dGtleT0wLCBpbnNrZXkuYmFja3dhcmQ9MArwn5S9ICA9 PT09PT09PT09PT09PT09PT09PSBfYnRfc2VhcmNoIGJlZ2luIGF0IHJvb3QgMyBsZXZlbCAxID09 PT09PT09PT09PT09PT09PT09Cl9idF9tb3ZlcmlnaHQ6IGJsayAzIGlzIHJpZ2h0bW9zdApfYnRf c2VhcmNoOiBzayA+IChib29sZWFuX2ZpZWxkLCBpbnRlZ2VyX2ZpZWxkKT0odCwgNTM1NyksIHNr IDw9IChib29sZWFuX2ZpZWxkLCBpbnRlZ2VyX2ZpZWxkKT0odCwgNTQ4MSkK8J+UvSAgLS0tLS0t LS0tLS0tLS0tLS0tLS0gZGVzY2VuZGVkIHRvIGNoaWxkIGJsayAxMjkgbGV2ZWwgMCAtLS0tLS0t LS0tLS0tLS0tLS0tLQpfYnRfbW92ZXJpZ2h0OiAoYm9vbGVhbl9maWVsZCwgaW50ZWdlcl9maWVs ZCk9KHQsIDU0ODEpLCBoaWdoIGtleSBubyBtb3ZlIHJpZ2h0CuKPue+4jyA9PT09PT09PT09PT09 PT09PT09PSBfYnRfc2VhcmNoIGVuZCA9PT09PT09PT09PT09PT09PT09PSDinqHvuI8KX2J0X3Jl YWRwYWdlOiDwn42AICAxMjkgd2l0aCAxMjUgb2Zmc2V0cy90dXBsZXMgKGxlZnRzaWIgMTI4LCBy aWdodHNpYiAxMzApIOKeoe+4jwogX2J0X3JlYWRwYWdlIGZpcnN0OiAoYm9vbGVhbl9maWVsZCwg aW50ZWdlcl9maWVsZCk9KHQsIDU0MzIpLCBUSUQ9JygyNzcsMTExKScsIDB4N2ZmZmFlYWIwZmIw LCBmcm9tIG5vbi1waXZvdCBvZmZudW0gNzcgc3RhcnRlZCBwYWdlCiBfYnRfcmVhZHBhZ2UgcHN0 YXRlLnN0YXJ0aWtleTogMCwgd2l0aCAyIHNjYW4ga2V5cwogIF9idF9jaGVja2tleXM6IGNvbXBh cmluZyAoYm9vbGVhbl9maWVsZCwgaW50ZWdlcl9maWVsZCk9KHQsIDU0MzIpIHdpdGggVElEICgy NzcsMTExKSwgMHg3ZmZmYWVhYjBmYjAKICBfYnRfY2hlY2trZXlzOiBjb21wYXJpbmcgKGJvb2xl YW5fZmllbGQsIGludGVnZXJfZmllbGQpPSh0LCA1NDMzKSB3aXRoIFRJRCAoNTQsMTcyKSwgMHg3 ZmZmYWVhYjBmNzgKX2J0X2FkdmFuY2VfYXJyYXlfa2V5cywgc2t0cmlnIChyZXF1aXJlZCk6IDEs IHR1cGxlOiAoYm9vbGVhbl9maWVsZCwgaW50ZWdlcl9maWVsZCk9KHQsIDU0MzMpLCAweDdmZmZh ZWFiMGY3OAoKICAtIHNrOiAwLCBza19hdHRubzogMSwgY3VyX2VsZW06ICAgLTEsIG51bV9lbGVt czogICAtMSwgdmFsOiB0CgogICsgc2s6IDAsIHNrX2F0dG5vOiAxLCBjdXJfZWxlbTogICAtMSwg bnVtX2VsZW1zOiAgIC0xLCB2YWw6IFNLX0lTTlVMTAoKIF9idF9yZWFkcGFnZSBmaW5hbDogKGJv b2xlYW5fZmllbGQsIGludGVnZXJfZmllbGQpPSh0LCA1NDMzKSwgVElEPScoNTQsMTcyKScsIDB4 N2ZmZmFlYWIwZjc4LCBmcm9tIG5vbi1waXZvdCBvZmZudW0gNzggc2V0IHNvLT5jdXJyUG9zLm1v cmVSaWdodD1mYWxzZSDinqHvuI8gIPCfm5EKIF9idF9yZWFkcGFnZSBzdGF0czogY3VyclBvcy5m aXJzdEl0ZW06IDAsIGN1cnJQb3MubGFzdEl0ZW06IDAsIG5tYXRjaGluZzogMSDinIUKCuKelSAg ICAg4p6VICAgICDinpUKX2J0X2ZpcnN0OiBza19hdHRubyAxLiB2YWw6IE5VTEwsIGZsYWdzOiBb U0tfSVNOVUxMLCBTS19TRUFSQ0hBUlJBWSwgU0tfU0VBUkNITlVMTCwgU0tfQlRfUkVRRldELCBT S19CVF9SRVFCS1dELCBTS19CVF9TS0lQXQogICAgICAgICAgIHNrX2F0dG5vIDIuIHZhbDogNTQz MiwgZnVuYzogYnRpbnQ4NGNtcCwgZmxhZ3M6IFtTS19CVF9SRVFGV0QsIFNLX0JUX1JFUUJLV0Rd CiAgICAgICAgICAgd2l0aCBzdHJhdF90b3RhbD0nPSAnLCBpbnNrZXkua2V5cz0yLCBpbnNrZXku bmV4dGtleT0wLCBpbnNrZXkuYmFja3dhcmQ9MArwn5S9ICA9PT09PT09PT09PT09PT09PT09PSBf YnRfc2VhcmNoIGJlZ2luIGF0IHJvb3QgMyBsZXZlbCAxID09PT09PT09PT09PT09PT09PT09Cl9i dF9tb3ZlcmlnaHQ6IGJsayAzIGlzIHJpZ2h0bW9zdApfYnRfc2VhcmNoOiBzayA+IChib29sZWFu X2ZpZWxkLCBpbnRlZ2VyX2ZpZWxkKT0odCwgOTk3MyksIHNrIDw9IChib29sZWFuX2ZpZWxkLCBp bnRlZ2VyX2ZpZWxkKT0oKSAsICg8PSBzZXBhcmF0b3IgaXMgaGlnaCBrZXkpCvCflL0gIC0tLS0t LS0tLS0tLS0tLS0tLS0tIGRlc2NlbmRlZCB0byBjaGlsZCBibGsgMTY3IGxldmVsIDAgLS0tLS0t LS0tLS0tLS0tLS0tLS0KX2J0X21vdmVyaWdodDogYmxrIDE2NyBpcyByaWdodG1vc3QK4o+577iP ID09PT09PT09PT09PT09PT09PT09IF9idF9zZWFyY2ggZW5kID09PT09PT09PT09PT09PT09PT09 IOKeoe+4jwpfYnRfcmVhZHBhZ2U6IPCfjYAgIDE2NyB3aXRoIDI4IG9mZnNldHMvdHVwbGVzIChs ZWZ0c2liIDE2NiwgcmlnaHRzaWIgMCkg4p6h77iPCiBfYnRfcmVhZHBhZ2UgZmlyc3Q6IG5vbmUs IG9mZm51bSAyOSBpcyA+IG1heG9mZiBvZiAyOAogX2J0X3JlYWRwYWdlIGZpbmFsOiAgLCAobmls KSwgY29udGludWVzY2FuIGhpZ2gga2V5IGNoZWNrIG5vdCBwZXJmb3JtZWQgb24gcmlnaHRtb3N0 IHBhZ2Ug4p6h77iPICDwn5uRCiBfYnRfcmVhZHBhZ2Ugc3RhdHM6IGN1cnJQb3MuZmlyc3RJdGVt OiAwLCBjdXJyUG9zLmxhc3RJdGVtOiAtMSwgbm1hdGNoaW5nOiAwIOKdjApidGVuZHNjYW4gZm9y IGluZGV4ICJib29sX2ludF9pZHgiLCBQYXJhbGxlbFdvcmtlck51bWJlcjogLTEsIG5wYWdlczog NCwgbmZvcmNlbm9ucmVxdWlyZWRwYWdlczogMCwgbndyb25ncHJlY2hlY2twYWdlczogMCwgbnNl YXJjaGVzOiA0CgrilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilJAK4pSCIGJvb2xlYW5fZmllbGQg4pSCCuKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUpArilIIgZiAgICAgICAgICAgICDilIIK4pSCIGYgICAgICAg ICAgICAg4pSCCuKUgiBmICAgICAgICAgICAgIOKUggrilIIgZiAgICAgICAgICAgICDilIIK4pSC IGYgICAgICAgICAgICAg4pSCCuKUgiB0ICAgICAgICAgICAgIOKUggrilJTilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJgKKDYgcm93cykKCg== --000000000000294bc70642f271f6--