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 1r5gmA-00EWFW-PF for pgsql-hackers@arkaria.postgresql.org; Wed, 22 Nov 2023 06:31:55 +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 1r5gm9-005HKW-09 for pgsql-hackers@arkaria.postgresql.org; Wed, 22 Nov 2023 06:31:53 +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 1r5gm8-005HHv-Fv for pgsql-hackers@lists.postgresql.org; Wed, 22 Nov 2023 06:31:52 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1r5gm5-007jao-LP for pgsql-hackers@lists.postgresql.org; Wed, 22 Nov 2023 06:31:51 +0000 Received: from [10.10.20.70] (node-68p.pool-101-109.dynamic.totinternet.net [101.109.31.153]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) (Authenticated sender: a.lepikhov@postgrespro.ru) by mail.postgrespro.ru (Postfix/587) with ESMTPSA id 49F7AE20F0A; Wed, 22 Nov 2023 09:31:46 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1700634708; bh=SbanIyVhvD+iczpngd8gHIT+bG2gK/0TgjFJdxSSuBE=; h=Message-ID:Date:User-Agent:Subject:To:Cc:References:From: In-Reply-To:From; b=Srv0hKj2oXBnYdIu5Oo3lqNvidVttBpkxL4CNy3LBTsah1zQ569HXSEKGJKnUxXXy /UPqAeThhdyKAnqlicCDbCrFCG1ooanHf4kgtFESZ1xUhdPRtaT1THhG0Qlc3ckkDL XKEvVO9FwXog742Tmp87n+H76a/eCnbFBUqmzoW3teoPoMOmO3fUgdgMDExX1Np2eC orvIsXeWsRbxT9w17oqTFnuSbL+Z7BDKOPIMYEaBDWds6NB11h/n1pnz8D6GyJoxY/ qVVTQxS+H8a7dVAHzEJ2wzYKOfUvUpBtHV1r17Khs0AzvBYfescaOUfb23c/Lo+F+m vRMAMxrW2V67g== Content-Type: multipart/mixed; boundary="------------bxtV9JknpxzstnLIo4JT0aHG" Message-ID: <6fb43191-2df3-4791-b307-be754e648276@postgrespro.ru> Date: Wed, 22 Nov 2023 13:31:44 +0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Postgres picks suboptimal index after building of an extended statistics Content-Language: en-US To: Tomas Vondra , Peter Geoghegan Cc: PostgreSQL Hackers References: <0ca4553c-1f34-12ba-9122-44199d1ced41@postgrespro.ru> <6dc348eb-91dd-4163-98fc-af9a9358302a@postgrespro.ru> From: Andrei Lepikhov Organization: Postgres Professional 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. --------------bxtV9JknpxzstnLIo4JT0aHG Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Thanks for detaied answer, On 3/11/2023 00:37, Tomas Vondra wrote: > On 9/25/23 06:30, Andrey Lepikhov wrote: >> ... >> I can't stop thinking about this issue. It is bizarre when Postgres >> chooses a non-unique index if a unique index gives us proof of minimum >> scan. > That's true, but no one implemented this heuristics. So the "proof of > minimum scan" is merely hypothetical - the optimizer is unaware of it. See the simple patch in the attachment. There, I have attempted to resolve situations of uncertainty to avoid making decisions based solely on the order of indexes in the list. >> I don't see a reason to teach the clauselist_selectivity() routine to >> estimate UNIQUE indexes. We add some cycles, but it will work with btree >> indexes only. > I'm not sure I understand what this is meant to say. Can you elaborate? > We only allow UNIQUE for btree indexes anyway, so what exactly is the > problem here? Partly, you already answered yourself below: we have unique index estimation in a few estimation calls, but go through the list of indexes each time. Also, for this sake, we would add some input parameters, usually NULL, because many estimations don't involve indexes at all. >> Maybe to change compare_path_costs_fuzzily() and add some heuristic, for >> example: >> "If selectivity of both paths gives us no more than 1 row, prefer to use >> a unique index or an index with least selectivity." > I don't understand how this would work. What do yo mean by "selectivity > of a path"? AFAICS the problem here is that we estimate a path to return > more rows (while we know there can only be 1, thanks to UNIQUE index). Oops, I meant cardinality. See the patch in the attachment. > So how would you know the path does not give us more than 1 row? Surely > you're not proposing compare_path_costs_fuzzily() to do something > expensive like analyzing the paths, or something. I solely propose to make optimizer more consecutive in its decisions: if we have one row for both path candidates, use uniqueness of the index or value of selectivity as one more parameter. > Also, how would it work in upper levels? If you just change which path > we keep, but leave the inaccurate row estimate in place, that may fix > that level, but it's certainly going to confuse later planning steps. It is designed for the only scan level. > IMHO the problem here is that we produce wrong estimate, so we better > fix that, instead of adding band-aids to other places. Agree. I am looking for a solution to help users somehow resolve such problems. As an alternative solution, I can propose a selectivity hook or (maybe even better) - use the pathlist approach and add indexes into the index list with some predefined order - at first positions, place unique indexes with more columns, etc. > This happens because functional dependencies are very simple type of > statistics - it has some expectations about the input data and also the > queries executed on it. For example it assumes the data is reasonably > homogeneous, so that we can calculate a global "degree". > > But the data in the example directly violates that - it has 1000 rows > that are very random (so we'd find no dependencies), and 1000 rows with > perfect dependencies. Hence we end with degree=0.5, which approximates > the dependencies to all data. Not great, true, but that's the price for > simplicity of this statistics kind. > > So the simplest solution is to disable dependencies on such data sets. > It's a bit inconvenient/unfortunate we build dependencies by default, > and people may not be aware of there assumptions. > > Perhaps we could/should make dependency_degree() more pessimistic when > we find some "violations" of the rule (we intentionally are not strict > about it, because data are imperfect). I don't have a good idea how to > change the formulas, but I'm open to the idea in principle. Thanks for the explanation! > The other thing we could do is checking for unique indexes in > clauselist_selectivity, and if we find a match we can just skip the > extended statistics altogether. Not sure how expensive this would be, > but for typical cases (with modest number of indexes) perhaps OK. It > wouldn't work without a unique index, but I don't have a better idea. It looks a bit expensive for me. But I am ready to try, if current solution doesn't look applicable. -- regards, Andrei Lepikhov Postgres Professional --------------bxtV9JknpxzstnLIo4JT0aHG Content-Type: text/plain; charset=UTF-8; name="0001-Use-an-index-path-with-the-best-selectivity-estimati.patch" Content-Disposition: attachment; filename*0="0001-Use-an-index-path-with-the-best-selectivity-estimati.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSAyMTY3Nzg2MWUxMDFlZWQyMmM4MjllMGIxNDI5MGE1Njc4NmExMmMyIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmV5IFYuIExlcGlraG92IiA8YS5sZXBpa2hv dkBwb3N0Z3Jlc3Byby5ydT4KRGF0ZTogV2VkLCAyMiBOb3YgMjAyMyAxMjowMTozOSArMDcw MApTdWJqZWN0OiBbUEFUQ0hdIFVzZSBhbiBpbmRleCBwYXRoIHdpdGggdGhlIGJlc3Qgc2Vs ZWN0aXZpdHkgZXN0aW1hdGlvbgoKLS0tCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9w YXRobm9kZS5jICAgICAgICAgfCA0MCArKysrKysrKysrKysrKysrKwogLi4uL2V4cGVjdGVk L2Ryb3AtaW5kZXgtY29uY3VycmVudGx5LTEub3V0ICAgIHwgMTYgKysrKy0tLQogc3JjL3Rl c3QvcmVncmVzcy9leHBlY3RlZC9mdW5jdGlvbmFsX2RlcHMub3V0IHwgNDMgKysrKysrKysr KysrKysrKysrKwogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dCAgICAgICAg ICAgIHwgNDAgKysrKysrKysrLS0tLS0tLS0KIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2Z1bmN0 aW9uYWxfZGVwcy5zcWwgICAgICB8IDM2ICsrKysrKysrKysrKysrKysKIDUgZmlsZXMgY2hh bmdlZCwgMTQ5IGluc2VydGlvbnMoKyksIDI2IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBh L3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3BhdGhub2RlLmMgYi9zcmMvYmFja2VuZC9v cHRpbWl6ZXIvdXRpbC9wYXRobm9kZS5jCmluZGV4IDBiMWQxN2I5ZDMuLjMyYWNhODNkNjcg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3BhdGhub2RlLmMKKysr IGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcGF0aG5vZGUuYwpAQCAtNDU0LDYgKzQ1 NCw0NiBAQCBhZGRfcGF0aChSZWxPcHRJbmZvICpwYXJlbnRfcmVsLCBQYXRoICpuZXdfcGF0 aCkKIAkJY29zdGNtcCA9IGNvbXBhcmVfcGF0aF9jb3N0c19mdXp6aWx5KG5ld19wYXRoLCBv bGRfcGF0aCwKIAkJCQkJCQkJCQkJIFNURF9GVVpaX0ZBQ1RPUik7CiAKKwkJLyoKKwkJICog QXBwbHkgc29tZSBoZXVyaXN0aWNzIG9uIGluZGV4IHBhdGhzLgorCQkgKi8KKwkJaWYgKElz QShuZXdfcGF0aCwgSW5kZXhQYXRoKSAmJiBJc0Eob2xkX3BhdGgsIEluZGV4UGF0aCkpCisJ CXsKKwkJCUluZGV4UGF0aCAqaW5wID0gKEluZGV4UGF0aCAqKSBuZXdfcGF0aDsKKwkJCUlu ZGV4UGF0aCAqaW9wID0gKEluZGV4UGF0aCAqKSBvbGRfcGF0aDsKKworCQkJaWYgKG5ld19w YXRoLT5yb3dzIDw9IDEuMCAmJiBvbGRfcGF0aC0+cm93cyA8PSAxLjApCisJCQl7CisJCQkJ aWYgKGlucC0+aW5kZXhpbmZvLT51bmlxdWUgJiYgIWlvcC0+aW5kZXhpbmZvLT51bmlxdWUp CisJCQkJCS8qCisJCQkJCSAqIFdoZW4gYm90aCBwYXRocyBhcmUgcHJlZGljdGVkIHRvIHBy b2R1Y2Ugb25seSBvbmUgdHVwbGUsCisJCQkJCSAqIHRoZSBvcHRpbWlzZXIgc2hvdWxkIHBy ZWZlciBjaG9vc2luZyBhIHVuaXF1ZSBpbmRleCBzY2FuCisJCQkJCSAqIGluIGFsbCBjYXNl cy4KKwkJCQkJICovCisJCQkJCWNvc3RjbXAgPSBDT1NUU19CRVRURVIxOworCQkJCWVsc2Ug aWYgKGNvc3RjbXAgIT0gQ09TVFNfRElGRkVSRU5UKQorCQkJCQkvKgorCQkJCQkgKiBJZiB0 aGUgb3B0aW1pc2VyIGRvZXNuJ3QgaGF2ZSBhbiBvYnZpb3VzbHkgc3RhYmxlIGNob2ljZQor CQkJCQkgKiBvZiB1bmlxdWUgaW5kZXgsIGluY3JlYXNlIHRoZSBjaGFuY2Ugb2YgYXZvaWRp bmcgbWlzdGFrZXMKKwkJCQkJICogYnkgY2hvb3NpbmcgYW4gaW5kZXggd2l0aCBzbWFsbGVy IHNlbGVjdGl2aXR5LgorCQkJCQkgKiBUaGlzIG9wdGlvbiBtYWtlcyBkZWNpc2lvbiBtb3Jl IGNvbnNlcnZhdGl2ZSBhbmQgbG9va3MKKwkJCQkJICogZGViYXRhYmxlLgorCQkJCQkgKi8K KwkJCQkJY29zdGNtcCA9IChpbnAtPmluZGV4c2VsZWN0aXZpdHkgPCBpb3AtPmluZGV4c2Vs ZWN0aXZpdHkpID8KKwkJCQkJCQkJCQkJCUNPU1RTX0JFVFRFUjEgOiBDT1NUU19CRVRURVIy OworCQkJfQorCQkJZWxzZSBpZiAoY29zdGNtcCA9PSBDT1NUU19FUVVBTCkKKwkJCQkvKgor CQkJCSAqIFRoZSBvcHRpbWl6ZXIgY2FuJ3QgZGlmZmVyIHRoZSB2YWx1ZSBvZiB0d28gaW5k ZXggcGF0aHMuCisJCQkJICogVG8gYXZvaWQgbWFraW5nIGEgZGVjaXNpb24gdGhhdCBpcyBi YXNlZCBvbiBvbmx5IGFuIGluZGV4CisJCQkJICogb3JkZXIgaW4gdGhlIGxpc3QsIHVzZSBz b21lIHJhdGlvbmFsIHN0cmF0ZWd5IGJhc2VkIG9uCisJCQkJICogc2VsZWN0aXZpdHk6IHBy ZWZlciB0b3VjaGluZyBmZXdlciB0dXBsZXMgb24gdGhlIGRpc2sgdG8KKwkJCQkgKiBmaWx0 ZXJpbmcgdGhlbSBhZnRlci4KKwkJCQkgKi8KKwkJCQljb3N0Y21wID0gKGlucC0+aW5kZXhz ZWxlY3Rpdml0eSA8IGlvcC0+aW5kZXhzZWxlY3Rpdml0eSkgPworCQkJCQkJCQkJCQkJQ09T VFNfQkVUVEVSMSA6IENPU1RTX0JFVFRFUjI7CisJCX0KKwogCQkvKgogCQkgKiBJZiB0aGUg dHdvIHBhdGhzIGNvbXBhcmUgZGlmZmVyZW50bHkgZm9yIHN0YXJ0dXAgYW5kIHRvdGFsIGNv c3QsCiAJCSAqIHRoZW4gd2Ugd2FudCB0byBrZWVwIGJvdGgsIGFuZCB3ZSBjYW4gc2tpcCBj b21wYXJpbmcgcGF0aGtleXMgYW5kCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9pc29sYXRpb24v ZXhwZWN0ZWQvZHJvcC1pbmRleC1jb25jdXJyZW50bHktMS5vdXQgYi9zcmMvdGVzdC9pc29s YXRpb24vZXhwZWN0ZWQvZHJvcC1pbmRleC1jb25jdXJyZW50bHktMS5vdXQKaW5kZXggMWNi MjI1MDg5MS4uMjM5MmNkYjAzMyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvaXNvbGF0aW9uL2V4 cGVjdGVkL2Ryb3AtaW5kZXgtY29uY3VycmVudGx5LTEub3V0CisrKyBiL3NyYy90ZXN0L2lz b2xhdGlvbi9leHBlY3RlZC9kcm9wLWluZGV4LWNvbmN1cnJlbnRseS0xLm91dApAQCAtMTIs MTMgKzEyLDE1IEBAIHN0ZXAgcHJlcHM6IFBSRVBBUkUgZ2V0cm93X3NlcXNjYW4gQVMgU0VM RUNUICogRlJPTSB0ZXN0X2RjIFdIRVJFIGRhdGEgPSAzNCBPUkRFCiBzdGVwIGJlZ2luOiBC RUdJTjsKIHN0ZXAgZGlzYWJsZXNlcTogU0VUIGVuYWJsZV9zZXFzY2FuID0gZmFsc2U7CiBz dGVwIGV4cGxhaW5pOiBFWFBMQUlOIChDT1NUUyBPRkYpIEVYRUNVVEUgZ2V0cm93X2lkeHNj YW47Ci1RVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb3J0ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIFNvcnQgS2V5OiBp ZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC0+ICBJbmRleCBTY2FuIHVz aW5nIHRlc3RfZGNfZGF0YSBvbiB0ZXN0X2RjCi0gICAgICAgIEluZGV4IENvbmQ6IChkYXRh ID0gMzQpICAgICAgICAgICAgICAgCi0oNCByb3dzKQorUVVFUlkgUExBTiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KK1NvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIAorICBTb3J0IEtleTogaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCisgIC0+ICBCaXRtYXAgSGVhcCBTY2FuIG9uIHRlc3RfZGMgICAgICAgICAgICAKKyAg ICAgICAgUmVjaGVjayBDb25kOiAoZGF0YSA9IDM0KSAgICAgICAgICAgIAorICAgICAgICAt PiAgQml0bWFwIEluZGV4IFNjYW4gb24gdGVzdF9kY19kYXRhCisgICAgICAgICAgICAgIElu ZGV4IENvbmQ6IChkYXRhID0gMzQpICAgICAgICAKKyg2IHJvd3MpCiAKIHN0ZXAgZW5hYmxl c2VxOiBTRVQgZW5hYmxlX3NlcXNjYW4gPSB0cnVlOwogc3RlcCBleHBsYWluczogRVhQTEFJ TiAoQ09TVFMgT0ZGKSBFWEVDVVRFIGdldHJvd19zZXFzY2FuOwpkaWZmIC0tZ2l0IGEvc3Jj L3Rlc3QvcmVncmVzcy9leHBlY3RlZC9mdW5jdGlvbmFsX2RlcHMub3V0IGIvc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC9mdW5jdGlvbmFsX2RlcHMub3V0CmluZGV4IDMyMzgxYjhhZTcu LjYxYWY5OWEwNDEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZnVu Y3Rpb25hbF9kZXBzLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2Z1bmN0 aW9uYWxfZGVwcy5vdXQKQEAgLTIzMCwzICsyMzAsNDYgQEAgRVhFQ1VURSBmb287CiBBTFRF UiBUQUJMRSBhcnRpY2xlcyBEUk9QIENPTlNUUkFJTlQgYXJ0aWNsZXNfcGtleSBSRVNUUklD VDsKIEVYRUNVVEUgZm9vOyAgLS0gZmFpbAogRVJST1I6ICBjb2x1bW4gImFydGljbGVzLmtl eXdvcmRzIiBtdXN0IGFwcGVhciBpbiB0aGUgR1JPVVAgQlkgY2xhdXNlIG9yIGJlIHVzZWQg aW4gYW4gYWdncmVnYXRlIGZ1bmN0aW9uCisvKgorICogQ29ybmVyIGNhc2VzIG9mIFBvc3Rn cmVTUUwgb3B0aW1pemVyOgorICoKKyAqIENvcnJlbGF0aW9ucyBiZXR3ZWVuIGNvbHVtbnMg YXJlbid0IGZvdW5kIGJ5IERCTVMuCisgKiBTZWxlY3Rpdml0aWVzIG11bHRpcGxpY2F0aW9u IG9mIG1hbnkgY29sdW1ucyBpbmNyZWFzZXMgdG90YWwgc2VsZWN0aXZpdHkKKyAqIGVycm9y LiBJZiBzdWNoIG5vbi10cnVlIHNlbGVjdGl2aXR5IGlzIHNvIHNtYWxsLCB0aGF0IHJvd3Mg ZXN0aW1hdGlvbgorICogZ2l2ZSB1cyBhYnNvbHV0ZSBtaW5pbXVtICgxKSB0aGVuIHRoZSBv cHRpbWl6ZXIgY2FuJ3QgY2hvb3NlIGJldHdlZW4gZGlmZmVyZW50CisgKiBpbmRleGVzIGFu ZCB1c2VzIGZpcnN0IGZyb20gdGhlIGluZGV4IGxpc3QgKGxhc3QgY3JlYXRlZCkuCisgKi8K K1xzZXQgc2NhbGUgMTAwMDAwCitDUkVBVEUgVEFCTEUgdCBBUyAoCisgICAgU0VMRUNUICBj MSBBUyBjMSwgLS0gc2VsZWN0aXZpdHkoYzEpKnNlbGVjdGl2aXR5KGMyKSpucm93cyA8PSAx CisgICAgICAgICAgICBjMSBBUyBjMiwKKwkJCS0tIENyZWF0ZSB0d28gY29sdW1ucyB3aXRo IGRpZmZlcmVudCBzZWxlY3Rpdml0eS4KKyAgICAgICAgICAgIChjMSAlIDIpIEFTIGMzLCAt LSBtaXNzaW5nIGZyb20gYSBnb29kIGluZGV4LgorICAgICAgICAgICAgKGMxICUgNCkgQVMg YzQgLS0gbWlzc2luZyBmcm9tIGEgYmFkIGluZGV4LgorICAgIEZST00gZ2VuZXJhdGVfc2Vy aWVzKDEsOnNjYWxlKSBBUyBjMQorKTsKK1VQREFURSB0IFNFVCBjMT0xLGMyPTEsYzM9MSxj ND0yIFdIRVJFIGMxPDpzY2FsZS8xMDAwOworQ1JFQVRFIElOREVYIGJhZCBPTiB0IChjMSxj MixjMyk7CitDUkVBVEUgSU5ERVggZ29vZCBPTiB0IChjMSxjMixjNCk7CitBTkFMWVpFIHQ7 IC0tIHVwZGF0ZSBzdGF0IG9uIHRoZSBpbmRleGVzLgorRVhQTEFJTiAoQ09TVFMgT0ZGKSBT RUxFQ1QgKiBGUk9NIHQgV0hFUkUgYzE9MSBBTkQgYzI9MSBBTkQgYzM9MSBBTkQgYzQ9MTsK KyAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBJbmRleCBTY2FuIHVzaW5nIGdvb2Qgb24gdAorICAgSW5kZXggQ29uZDogKChjMSA9IDEp IEFORCAoYzIgPSAxKSBBTkQgKGM0ID0gMSkpCisgICBGaWx0ZXI6IChjMyA9IDEpCisoMyBy b3dzKQorCistLSBTZXQgdGhlIGJhZCBpbmRleCB0byB0aGUgZmlyc3QgcG9zaXRpb24gaW4g dGhlIGluZGV4IGxpc3QuCitEUk9QIElOREVYIGJhZDsKK0NSRUFURSBJTkRFWCBiYWQgT04g dCAoYzEsYzIsYzMpOworQU5BTFlaRSB0OworRVhQTEFJTiAoQ09TVFMgT0ZGKSBTRUxFQ1Qg KiBGUk9NIHQgV0hFUkUgYzE9MSBBTkQgYzI9MSBBTkQgYzM9MSBBTkQgYzQ9MTsKKyAgICAg ICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBJbmRl eCBTY2FuIHVzaW5nIGdvb2Qgb24gdAorICAgSW5kZXggQ29uZDogKChjMSA9IDEpIEFORCAo YzIgPSAxKSBBTkQgKGM0ID0gMSkpCisgICBGaWx0ZXI6IChjMyA9IDEpCisoMyByb3dzKQor CitEUk9QIFRBQkxFIHQgQ0FTQ0FERTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mv ZXhwZWN0ZWQvam9pbi5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0 CmluZGV4IDJjNzMyNzAxNDMuLjMyYjMzZmFiZDMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3Jl Z3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3Rl ZC9qb2luLm91dApAQCAtODYyOSwxNCArODYyOSwxNSBAQCBhbmFseXplIGoyOwogZXhwbGFp biAoY29zdHMgb2ZmKSBzZWxlY3QgKiBmcm9tIGoxCiBpbm5lciBqb2luIGoyIG9uIGoxLmlk MSA9IGoyLmlkMSBhbmQgajEuaWQyID0gajIuaWQyCiB3aGVyZSBqMS5pZDEgJSAxMDAwID0g MSBhbmQgajIuaWQxICUgMTAwMCA9IDE7Ci0gICAgICAgICAgICAgICBRVUVSWSBQTEFOICAg ICAgICAgICAgICAgIAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCiAgTWVyZ2UgSm9pbgotICAgTWVyZ2UgQ29uZDogKGoxLmlkMSA9IGoy LmlkMSkKLSAgIEpvaW4gRmlsdGVyOiAoajIuaWQyID0gajEuaWQyKQotICAgLT4gIEluZGV4 IFNjYW4gdXNpbmcgajFfaWQxX2lkeCBvbiBqMQotICAgLT4gIEluZGV4IFNjYW4gdXNpbmcg ajJfaWQxX2lkeCBvbiBqMgotKDUgcm93cykKKyAgIE1lcmdlIENvbmQ6ICgoajEuaWQxID0g ajIuaWQxKSBBTkQgKGoxLmlkMiA9IGoyLmlkMikpCisgICAtPiAgSW5kZXggT25seSBTY2Fu IHVzaW5nIGoxX3BrZXkgb24gajEKKyAgICAgICAgIEZpbHRlcjogKChpZDEgJSAxMDAwKSA9 IDEpCisgICAtPiAgSW5kZXggT25seSBTY2FuIHVzaW5nIGoyX3BrZXkgb24gajIKKyAgICAg ICAgIEZpbHRlcjogKChpZDEgJSAxMDAwKSA9IDEpCisoNiByb3dzKQogCiBzZWxlY3QgKiBm cm9tIGoxCiBpbm5lciBqb2luIGoyIG9uIGoxLmlkMSA9IGoyLmlkMSBhbmQgajEuaWQyID0g ajIuaWQyCkBAIC04NjUxLDE1ICs4NjUyLDE2IEBAIHdoZXJlIGoxLmlkMSAlIDEwMDAgPSAx IGFuZCBqMi5pZDEgJSAxMDAwID0gMTsKIGV4cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0ICog ZnJvbSBqMQogaW5uZXIgam9pbiBqMiBvbiBqMS5pZDEgPSBqMi5pZDEgYW5kIGoxLmlkMiA9 IGoyLmlkMgogd2hlcmUgajEuaWQxICUgMTAwMCA9IDEgYW5kIGoyLmlkMSAlIDEwMDAgPSAx IGFuZCBqMi5pZDEgPSBhbnkgKGFycmF5WzFdKTsKLSAgICAgICAgICAgICAgICAgICAgIFFV RVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAg UVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgTWVyZ2UgSm9pbgot ICAgTWVyZ2UgQ29uZDogKGoxLmlkMSA9IGoyLmlkMSkKLSAgIEpvaW4gRmlsdGVyOiAoajIu aWQyID0gajEuaWQyKQotICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgajFfaWQxX2lkeCBvbiBq MQotICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgajJfaWQxX2lkeCBvbiBqMgorICAgTWVyZ2Ug Q29uZDogKChqMS5pZDEgPSBqMi5pZDEpIEFORCAoajEuaWQyID0gajIuaWQyKSkKKyAgIC0+ ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgajFfcGtleSBvbiBqMQorICAgICAgICAgRmlsdGVy OiAoKGlkMSAlIDEwMDApID0gMSkKKyAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgajJf cGtleSBvbiBqMgogICAgICAgICAgSW5kZXggQ29uZDogKGlkMSA9IEFOWSAoJ3sxfSc6Omlu dGVnZXJbXSkpCi0oNiByb3dzKQorICAgICAgICAgRmlsdGVyOiAoKGlkMSAlIDEwMDApID0g MSkKKyg3IHJvd3MpCiAKIHNlbGVjdCAqIGZyb20gajEKIGlubmVyIGpvaW4gajIgb24gajEu aWQxID0gajIuaWQxIGFuZCBqMS5pZDIgPSBqMi5pZDIKQEAgLTg2NzQsMTIgKzg2NzYsMTIg QEAgd2hlcmUgajEuaWQxICUgMTAwMCA9IDEgYW5kIGoyLmlkMSAlIDEwMDAgPSAxIGFuZCBq Mi5pZDEgPSBhbnkgKGFycmF5WzFdKTsKIGV4cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0ICog ZnJvbSBqMQogaW5uZXIgam9pbiBqMiBvbiBqMS5pZDEgPSBqMi5pZDEgYW5kIGoxLmlkMiA9 IGoyLmlkMgogd2hlcmUgajEuaWQxICUgMTAwMCA9IDEgYW5kIGoyLmlkMSAlIDEwMDAgPSAx IGFuZCBqMi5pZDEgPj0gYW55IChhcnJheVsxLDVdKTsKLSAgICAgICAgICAgICAgICAgICAg ICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAKLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgTWVy Z2UgSm9pbgotICAgTWVyZ2UgQ29uZDogKGoxLmlkMSA9IGoyLmlkMSkKLSAgIEpvaW4gRmls dGVyOiAoajIuaWQyID0gajEuaWQyKQotICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgajFfaWQx X2lkeCBvbiBqMQorICAgTWVyZ2UgQ29uZDogKChqMS5pZDEgPSBqMi5pZDEpIEFORCAoajEu aWQyID0gajIuaWQyKSkKKyAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgajFfcGtleSBv biBqMQorICAgICAgICAgRmlsdGVyOiAoKGlkMSAlIDEwMDApID0gMSkKICAgIC0+ICBJbmRl eCBPbmx5IFNjYW4gdXNpbmcgajJfcGtleSBvbiBqMgogICAgICAgICAgSW5kZXggQ29uZDog KGlkMSA+PSBBTlkgKCd7MSw1fSc6OmludGVnZXJbXSkpCiAgICAgICAgICBGaWx0ZXI6ICgo aWQxICUgMTAwMCkgPSAxKQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZnVu Y3Rpb25hbF9kZXBzLnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2Z1bmN0aW9uYWxfZGVw cy5zcWwKaW5kZXggNDA2NDkwYjk5NS4uZjYxN2VlOTI2OSAxMDA2NDQKLS0tIGEvc3JjL3Rl c3QvcmVncmVzcy9zcWwvZnVuY3Rpb25hbF9kZXBzLnNxbAorKysgYi9zcmMvdGVzdC9yZWdy ZXNzL3NxbC9mdW5jdGlvbmFsX2RlcHMuc3FsCkBAIC0yMDgsMyArMjA4LDM5IEBAIEVYRUNV VEUgZm9vOwogQUxURVIgVEFCTEUgYXJ0aWNsZXMgRFJPUCBDT05TVFJBSU5UIGFydGljbGVz X3BrZXkgUkVTVFJJQ1Q7CiAKIEVYRUNVVEUgZm9vOyAgLS0gZmFpbAorCisvKgorICogQ29y bmVyIGNhc2VzIG9mIFBvc3RncmVTUUwgb3B0aW1pemVyOgorICoKKyAqIENvcnJlbGF0aW9u cyBiZXR3ZWVuIGNvbHVtbnMgYXJlbid0IGZvdW5kIGJ5IERCTVMuCisgKiBTZWxlY3Rpdml0 aWVzIG11bHRpcGxpY2F0aW9uIG9mIG1hbnkgY29sdW1ucyBpbmNyZWFzZXMgdG90YWwgc2Vs ZWN0aXZpdHkKKyAqIGVycm9yLiBJZiBzdWNoIG5vbi10cnVlIHNlbGVjdGl2aXR5IGlzIHNv IHNtYWxsLCB0aGF0IHJvd3MgZXN0aW1hdGlvbgorICogZ2l2ZSB1cyBhYnNvbHV0ZSBtaW5p bXVtICgxKSB0aGVuIHRoZSBvcHRpbWl6ZXIgY2FuJ3QgY2hvb3NlIGJldHdlZW4gZGlmZmVy ZW50CisgKiBpbmRleGVzIGFuZCB1c2VzIGZpcnN0IGZyb20gdGhlIGluZGV4IGxpc3QgKGxh c3QgY3JlYXRlZCkuCisgKi8KK1xzZXQgc2NhbGUgMTAwMDAwCisKK0NSRUFURSBUQUJMRSB0 IEFTICgKKyAgICBTRUxFQ1QgIGMxIEFTIGMxLCAtLSBzZWxlY3Rpdml0eShjMSkqc2VsZWN0 aXZpdHkoYzIpKm5yb3dzIDw9IDEKKyAgICAgICAgICAgIGMxIEFTIGMyLAorCQkJLS0gQ3Jl YXRlIHR3byBjb2x1bW5zIHdpdGggZGlmZmVyZW50IHNlbGVjdGl2aXR5LgorICAgICAgICAg ICAgKGMxICUgMikgQVMgYzMsIC0tIG1pc3NpbmcgZnJvbSBhIGdvb2QgaW5kZXguCisgICAg ICAgICAgICAoYzEgJSA0KSBBUyBjNCAtLSBtaXNzaW5nIGZyb20gYSBiYWQgaW5kZXguCisg ICAgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSw6c2NhbGUpIEFTIGMxCispOworVVBEQVRFIHQg U0VUIGMxPTEsYzI9MSxjMz0xLGM0PTIgV0hFUkUgYzE8OnNjYWxlLzEwMDA7CisKK0NSRUFU RSBJTkRFWCBiYWQgT04gdCAoYzEsYzIsYzMpOworQ1JFQVRFIElOREVYIGdvb2QgT04gdCAo YzEsYzIsYzQpOworQU5BTFlaRSB0OyAtLSB1cGRhdGUgc3RhdCBvbiB0aGUgaW5kZXhlcy4K KworRVhQTEFJTiAoQ09TVFMgT0ZGKSBTRUxFQ1QgKiBGUk9NIHQgV0hFUkUgYzE9MSBBTkQg YzI9MSBBTkQgYzM9MSBBTkQgYzQ9MTsKKworLS0gU2V0IHRoZSBiYWQgaW5kZXggdG8gdGhl IGZpcnN0IHBvc2l0aW9uIGluIHRoZSBpbmRleCBsaXN0LgorRFJPUCBJTkRFWCBiYWQ7CitD UkVBVEUgSU5ERVggYmFkIE9OIHQgKGMxLGMyLGMzKTsKK0FOQUxZWkUgdDsKKworRVhQTEFJ TiAoQ09TVFMgT0ZGKSBTRUxFQ1QgKiBGUk9NIHQgV0hFUkUgYzE9MSBBTkQgYzI9MSBBTkQg YzM9MSBBTkQgYzQ9MTsKKworRFJPUCBUQUJMRSB0IENBU0NBREU7Ci0tIAoyLjQzLjAKCg== --------------bxtV9JknpxzstnLIo4JT0aHG--