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.96) (envelope-from ) id 1vx2Dt-00BczU-2s for pgsql-hackers@arkaria.postgresql.org; Mon, 02 Mar 2026 12:18:06 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vx2Ds-000W8c-13 for pgsql-hackers@arkaria.postgresql.org; Mon, 02 Mar 2026 12:18:04 +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.96) (envelope-from ) id 1vx2Dr-000W8U-3B for pgsql-hackers@lists.postgresql.org; Mon, 02 Mar 2026 12:18:04 +0000 Received: from mail-wr1-x42f.google.com ([2a00:1450:4864:20::42f]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vx2Do-000000000rU-3RR3 for pgsql-hackers@postgresql.org; Mon, 02 Mar 2026 12:18:04 +0000 Received: by mail-wr1-x42f.google.com with SMTP id ffacd0b85a97d-4377174e1ebso3204731f8f.3 for ; Mon, 02 Mar 2026 04:18:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772453880; x=1773058680; darn=postgresql.org; h=in-reply-to:content-language:references:cc:to:from:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=mY//uG5dPg4zVGbZY7zXruQkwG+IP3r94BBxdzdT12U=; b=J4iQm9ybGmc3upRG6UiWYUyHP1m9dJQzs8HbjShuYNg+DJ3wKBNTMgMwGXRm+X3vxd 9/Lazx+yjWiPoy8yuwVfMcO8cMkGbP8Fe5is6Pb4i9osc8Uj34ktkJ1SwjxPvmyQckYd ilsVJXgHL2HZtWIJgSxk030gEhajxb0S4C9beJpwXOsae3rtuzgJ0/kP5kxDgIW2rRKs QKJN4JLFxFD4EK87/f8tXkP2TsBZw4xkQkrBDymjegDbNxq3akoms4wR4R2gVGBz505p j0Mx/w404Gg3lPMqa+pAO5P+T64NqgXFjmYIyi7OLxWtc9aJTfLzKLUYwNd8ft+3nOMu ENnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772453880; x=1773058680; h=in-reply-to:content-language:references:cc:to:from:subject :user-agent:mime-version:date:message-id:x-gm-gg:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=mY//uG5dPg4zVGbZY7zXruQkwG+IP3r94BBxdzdT12U=; b=PF6osPyagDnb/VEu7y5NYoh31HwBShRNNkXO6dkp+Qbb5x32tduexeMaZPUqfrdC1E GFlA3toYn1LiAy5jq03nN7xuDU/9WwaSIJ+nvgYnhrG3FQnGvhKJxLdIYA6G4uvANcfd eVhBiklUKPg+tKjrywNnajCUkTvll5upMG0Jt2Nq8q26OPd6h7I+VMMExJkZbC7JeUKu Nmeh6nmB/ay16jszE+7G85x6Zp8HYenXsA/Ya8rKhFpAHp27mxp34Bk5diDckdBtzvfm I+u4XcXnic9LJ24IRrhmwcC54eq547wcx8My5Y3Svxx1btPHZelqQwrV7ztjT9uz1uQ/ vd1w== X-Forwarded-Encrypted: i=1; AJvYcCW8S9N+NSFelsTS2XU4kk0FenXxeiirZHsHK2l+ud1MNTOj7X6Ct81+zCYWjn8N7k//zdqG0+bKOc/z7KGJ@postgresql.org X-Gm-Message-State: AOJu0Yzh5MRpt7/5DyBILgCNeP17pEZ7Hx0cQ2XDChTQxRAu+TBxH6K1 y1KGTFjSFQkBGaQevKv/VntIDH9k4ryxXn5AolIDwdt9l87iTHWHWRd+ X-Gm-Gg: ATEYQzy7tj8KdT8HEwL75jmXlQ3vIzFTtioq8c9+80x4yW1UUCz+daC4mb/ht1f2qfS vUE98P/QHPWs4YsCRYlc6umX5bRfOMtn9IiSMYEyvUyZ9Apx/Q6N/rLLARvO5I9gSTIm6oPR3C/ djsot5X7VOSWp9Rz+1RoC3oqzyC5o6JipIWC277BK28N5MrLDrRSm56p1bCN57O3JZVZqF01kzl UJwTfSVg5yuSGACS489pcjm5xbxddPvk/QkoNyoCESPgPtwA0nHYh0+BYl3lf+dyWUy9Z3bMdhd NXoeGWUFtD34LR6hM/ebi+SUknnRdhD5urIlsTAJyE+qs+cykLomMGJo68p/9BLfAHl2y9ap5XD v/FdKhJM38ZjxQ2NolQAg5RFa6uVI9Bb5mCg1/74o0l5nUFZFTlEWcDkyQx+kJrna9fr9Jq6mbB zLTD3QmzT+9gTKDiMXG2Y= X-Received: by 2002:a05:6000:604:b0:439:afd8:6230 with SMTP id ffacd0b85a97d-439afd867a0mr9684675f8f.58.1772453879246; Mon, 02 Mar 2026 04:17:59 -0800 (PST) Received: from [172.31.5.233] ([165.225.27.16]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439ba2a58dasm4577948f8f.27.2026.03.02.04.17.57 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 02 Mar 2026 04:17:58 -0800 (PST) Content-Type: multipart/mixed; boundary="------------H37eGzqg78eBh8EQ2lkjnhA0" Message-ID: Date: Mon, 2 Mar 2026 13:17:56 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Reduce build times of pg_trgm GIN indexes From: David Geier To: Matthias van de Meent Cc: Heikki Linnakangas , pgsql-hackers References: <5d366878-2007-4d31-861e-19294b7a583b@gmail.com> <9ac3931a-180e-4283-a7a8-05eb66099206@iki.fi> <2e11134f-02c3-43da-8c39-fb520a1a251d@iki.fi> <66620ec7-0f81-4813-9cf1-b901a56efcc3@gmail.com> Content-Language: en-US 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. --------------H37eGzqg78eBh8EQ2lkjnhA0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit On 23.01.2026 11:18, David Geier wrote: > Hi Matthias, > > On 21.01.2026 21:50, Matthias van de Meent wrote: >> On Wed, 21 Jan 2026 at 16:45, David Geier wrote: >>> >>> How do we usually go about such backwards-compatibility breaking >>> changes? >> >> When it concerns a bug, we mention the change in the release notes >> with a warning to reindex affected indexes to be sure no known >> corruption remains. See e.g. the final entry in the PG18 release >> notes' migration section here: >> https://www.postgresql.org/docs/18/release-18.html#RELEASE-18-MIGRATION. >> >>> Could we have pg_upgrade reindex all GIN indexes? Would that be >>> acceptable? >> >> No. We'd handle this like any other collation/opclass fixes; we ask >> users to reindex their indexes in their own time after they've >> upgraded their cluster. Note that in this case it concerns an issue >> with just one GIN opclass, not all GIN indexes; so even if we were to >> address this in pg_upgrade it wouldn't be a correct choice to reindex >> every GIN index, as only a subset of those would be affected by this >> issue. >> >> Generally speaking, pg_upgrade doesn't concern itself with the >> validity of the data structures that are described by the catalogs >> that it upgrades, it only concerns itself with that it correctly >> transcribes the catalogs from one version to another, and that the >> data files of the old cluster are transfered correctly without >> changes. > > Thanks for the clarifications and the link to the release notes. That's > very helpful. Then I know how to move on and will update the patch > accordingly. Attached are the patches rebased on latest master. I've removed the ASCII fast-path patch 0006 as it turned out to be more complicated to make work than expected. I kept the radix sort patch because it gives a decent speedup but I would like to focus for now on getting patches 0001 - 0004 merged. They're all simple and, the way I see it, uncontroversial. I remeasured the savings of 0001 - 0004, which comes on top of the already committed patch that inlined the comparison function, which gave another ~5%: Data set | Patched (ms) | Master (ms) | Speedup --------------------|--------------|--------------|---------- movies(plot) | 8,058 | 10,311 | 1.27x lineitem(l_comment) | 223,233 | 256,986 | 1.19x I've also registered the change at the commit fest, see https://commitfest.postgresql.org/patch/6418/. -- David Geier --------------H37eGzqg78eBh8EQ2lkjnhA0 Content-Type: text/x-patch; charset=UTF-8; name="v4-0005-Optimize-generate_trgm-with-radix-sort.patch" Content-Disposition: attachment; filename="v4-0005-Optimize-generate_trgm-with-radix-sort.patch" Content-Transfer-Encoding: base64 RnJvbSBjYzM3NzI2NmVhODA3MWJiMDAwZjBjMDVkMGFjYTBhYjIwMTJjZGZlIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBHZWllciA8Z2VpZGF2LnBnQGdtYWlsLmNv bT4KRGF0ZTogVHVlLCAxMSBOb3YgMjAyNSAxMzoxODo1OSArMDEwMApTdWJqZWN0OiBbUEFU Q0ggdjQgNS81XSBPcHRpbWl6ZSBnZW5lcmF0ZV90cmdtKCkgd2l0aCByYWRpeCBzb3J0Cgot LS0KIGNvbnRyaWIvcGdfdHJnbS90cmdtX29wLmMgfCA2NCArKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKystLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCA1NCBpbnNlcnRpb25zKCsp LCAxMCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9jb250cmliL3BnX3RyZ20vdHJnbV9v cC5jIGIvY29udHJpYi9wZ190cmdtL3RyZ21fb3AuYwppbmRleCAwN2RhZjExMTcyOS4uMTYw M2E1NTAyMmIgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcGdfdHJnbS90cmdtX29wLmMKKysrIGIv Y29udHJpYi9wZ190cmdtL3RyZ21fb3AuYwpAQCAtMjM1LDE0ICsyMzUsNiBAQCBDTVBUUkdN X0NIT09TRShjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQogfQogCiAvKiBEZWZpbmUg b3VyIHNwZWNpYWxpemVkIHNvcnQgZnVuY3Rpb24gbmFtZSAqLwotI2RlZmluZSBTVF9TT1JU IHRyaWdyYW1fcXNvcnRfc2lnbmVkCi0jZGVmaW5lIFNUX0VMRU1FTlRfVFlQRV9WT0lECi0j ZGVmaW5lIFNUX0NPTVBBUkUoYSwgYikgQ01QVFJHTV9TSUdORUQoYSwgYikKLSNkZWZpbmUg U1RfU0NPUEUgc3RhdGljCi0jZGVmaW5lIFNUX0RFRklORQotI2RlZmluZSBTVF9ERUNMQVJF Ci0jaW5jbHVkZSAibGliL3NvcnRfdGVtcGxhdGUuaCIKLQogI2RlZmluZSBTVF9TT1JUIHRy aWdyYW1fcXNvcnRfdW5zaWduZWQKICNkZWZpbmUgU1RfRUxFTUVOVF9UWVBFX1ZPSUQKICNk ZWZpbmUgU1RfQ09NUEFSRShhLCBiKSBDTVBUUkdNX1VOU0lHTkVEKGEsIGIpCkBAIC01NjQs NiArNTU2LDU4IEBAIGdlbmVyYXRlX3RyZ21fb25seShncm93YWJsZV90cmdtX2FycmF5ICpk c3QsIGNoYXIgKnN0ciwgaW50IHNsZW4sIFRyZ21Cb3VuZCAqKmJvCiAJcGZyZWUoYnVmKTsK IH0KIAorLyoKKyAqIE5lZWRlZCB0byBwcm9wZXJseSBoYW5kbGUgbmVnYXRpdmUgbnVtYmVy cyBpbiBjYXNlIGNoYXIgaXMgc2lnbmVkLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVk IGNoYXIgRmxpcFNpZ24oY2hhciB4KQoreworCXJldHVybiB4XjB4ODA7Cit9CisKK3N0YXRp YyB2b2lkIHJhZGl4X3NvcnRfdHJpZ3JhbXNfc2lnbmVkKHRyZ20gKnRyZywgaW50IGNvdW50 KQoreworCXRyZ20gKmJ1ZmZlciA9IHBhbGxvY19hcnJheSh0cmdtLCBjb3VudCk7CisJdHJn bSAqc3RhcnRzWzI1Nl07CisJdHJnbSAqZnJvbSA9IHRyZzsKKwl0cmdtICp0byA9IGJ1ZmZl cjsKKwlpbnQgZnJlcXNbM11bMjU2XTsKKworCS8qCisJICogQ29tcHV0ZSBmcmVxdWVuY2ll cyB0byBwYXJ0aXRpb24gdGhlIGJ1ZmZlci4KKwkgKi8KKwltZW1zZXQoZnJlcXMsIDAsIHNp emVvZihmcmVxcykpOworCisJZm9yIChpbnQgaT0wOyBpPGNvdW50OyBpKyspCisJCWZvciAo aW50IGo9MDsgajwzOyBqKyspCisJCQlmcmVxc1tqXVtGbGlwU2lnbih0cmdbaV1bal0pXSsr OworCisJLyoKKwkgKiBEbyB0aGUgc29ydGluZy4gU3RhcnQgd2l0aCBsYXN0IGNoYXJhY3Rl ciBiZWNhdXNlIHRoYXQncyB0aGUgaXMgIkxTQiIKKwkgKiBpbiBhIHRyaWdyYW0uIEF2b2lk IHVubmVjZXNzYXJ5IGNvcGllcyBieSBwaW5nLXBvbmdpbmcgYmV0d2VlbiB0aGUgYnVmZmVy cy4KKwkgKi8KKwlmb3IgKGludCBpPTI7IGk+PTA7IGktLSkKKwl7CisJCXRyZ20gKm9sZF9m cm9tID0gZnJvbTsKKwkJdHJnbSAqbmV4dCA9IHRvOworCisJCWZvciAoaW50IGo9MDsgajwy NTY7IGorKykKKwkJeworCQkJc3RhcnRzW2pdID0gbmV4dDsKKwkJCW5leHQgKz0gZnJlcXNb aV1bal07CisJCX0KKworCQlmb3IgKGludCBqPTA7IGo8Y291bnQ7IGorKykKKwkJCW1lbWNw eShzdGFydHNbRmxpcFNpZ24oZnJvbVtqXVtpXSldKyssIGZyb21bal0sIHNpemVvZih0cmdt KSk7CisKKwkJZnJvbSA9IHRvOworCQl0byA9IG9sZF9mcm9tOworCX0KKworCUFzc2VydCh0 byA9PSBidWZmZXIpOworCW1lbWNweSh0cmcsIGJ1ZmZlciwgc2l6ZW9mKHRyZ20pICogY291 bnQpOworCXBmcmVlKGJ1ZmZlcik7Cit9CisKIC8qCiAgKiBNYWtlIGFycmF5IG9mIHRyaWdy YW1zIHdpdGggc29ydGluZyBhbmQgcmVtb3ZpbmcgZHVwbGljYXRlIGl0ZW1zLgogICoKQEAg LTU4OSw3ICs2MzMsNyBAQCBnZW5lcmF0ZV90cmdtKGNoYXIgKnN0ciwgaW50IHNsZW4pCiAJ aWYgKGxlbiA+IDEpCiAJewogCQlpZiAoR2V0RGVmYXVsdENoYXJTaWduZWRuZXNzKCkpCi0J CQl0cmlncmFtX3Fzb3J0X3NpZ25lZCgodm9pZCAqKSBHRVRBUlIodHJnKSwgbGVuLCBzaXpl b2YodHJnbSkpOworCQkJcmFkaXhfc29ydF90cmlncmFtc19zaWduZWQoKHRyZ20gKilHRVRB UlIodHJnKSwgbGVuKTsKIAkJZWxzZQogCQkJdHJpZ3JhbV9xc29ydF91bnNpZ25lZCgodm9p ZCAqKSBHRVRBUlIodHJnKSwgbGVuLCBzaXplb2YodHJnbSkpOwogCkBAIC0xMTI0LDcgKzEx NjgsNyBAQCBnZW5lcmF0ZV93aWxkY2FyZF90cmdtKGNvbnN0IGNoYXIgKnN0ciwgaW50IHNs ZW4pCiAJaWYgKGxlbiA+IDEpCiAJewogCQlpZiAoR2V0RGVmYXVsdENoYXJTaWduZWRuZXNz KCkpCi0JCQl0cmlncmFtX3Fzb3J0X3NpZ25lZCgodm9pZCAqKSBHRVRBUlIodHJnKSwgbGVu LCBzaXplb2YodHJnbSkpOworCQkJcmFkaXhfc29ydF90cmlncmFtc19zaWduZWQoKHRyZ20g KilHRVRBUlIodHJnKSwgbGVuKTsKIAkJZWxzZQogCQkJdHJpZ3JhbV9xc29ydF91bnNpZ25l ZCgodm9pZCAqKSBHRVRBUlIodHJnKSwgbGVuLCBzaXplb2YodHJnbSkpOwogCi0tIAoyLjUx LjAKCg== --------------H37eGzqg78eBh8EQ2lkjnhA0 Content-Type: text/x-patch; charset=UTF-8; name="v4-0004-Faster-qunique-comparator-in-generate_trgm.patch" Content-Disposition: attachment; filename="v4-0004-Faster-qunique-comparator-in-generate_trgm.patch" Content-Transfer-Encoding: base64 RnJvbSA2ZDNhMGY2MTkyODk1OGI1MTk4OWUxMGQ1Zjg1ZGIyZGVlZjIxMGNmIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBHZWllciA8Z2VpZGF2LnBnQGdtYWlsLmNv bT4KRGF0ZTogV2VkLCAxMiBOb3YgMjAyNSAxNDoyNzoxMyArMDEwMApTdWJqZWN0OiBbUEFU Q0ggdjQgNC81XSBGYXN0ZXIgcXVuaXF1ZSgpIGNvbXBhcmF0b3IgaW4gZ2VuZXJhdGVfdHJn bSgpCgotLS0KIGNvbnRyaWIvcGdfdHJnbS90cmdtX29wLmMgfCAyNCArKysrKysrKysrKyst LS0tLS0tLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCAxMiBpbnNlcnRpb25zKCspLCAxMiBkZWxl dGlvbnMoLSkKCmRpZmYgLS1naXQgYS9jb250cmliL3BnX3RyZ20vdHJnbV9vcC5jIGIvY29u dHJpYi9wZ190cmdtL3RyZ21fb3AuYwppbmRleCA4NWRmNWVmMjMxMC4uMDdkYWYxMTE3Mjkg MTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcGdfdHJnbS90cmdtX29wLmMKKysrIGIvY29udHJpYi9w Z190cmdtL3RyZ21fb3AuYwpAQCAtMjExLDYgKzIxMSwxNCBAQCBDTVBUUkdNX1VOU0lHTkVE KGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCiAJCSAgIDogQ01QUENIQVJfVU5TKGEs IGIsIDIpKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQKK0NNUFRSR01fRVEoY29uc3Qgdm9p ZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKwljaGFyICphYSA9IChjaGFyICopYTsKKwljaGFy ICpiYiA9IChjaGFyICopYjsKKwlyZXR1cm4gYWFbMF0gIT0gYmJbMF0gfHwgYWFbMV0gIT0g YmJbMV0gfHwgYWFbMl0gIT0gYmJbMl0gPyAxIDogMDsKK30KKwogLyoKICAqIFRoaXMgZ2V0 cyBjYWxsZWQgb24gdGhlIGZpcnN0IGNhbGwuIEl0IHJlcGxhY2VzIHRoZSBmdW5jdGlvbiBw b2ludGVyIHNvCiAgKiB0aGF0IHN1YnNlcXVlbnQgY2FsbHMgYXJlIHJvdXRlZCBkaXJlY3Rs eSB0byB0aGUgY2hvc2VuIGltcGxlbWVudGF0aW9uLgpAQCAtNTgxLDE1ICs1ODksMTEgQEAg Z2VuZXJhdGVfdHJnbShjaGFyICpzdHIsIGludCBzbGVuKQogCWlmIChsZW4gPiAxKQogCXsK IAkJaWYgKEdldERlZmF1bHRDaGFyU2lnbmVkbmVzcygpKQotCQl7CiAJCQl0cmlncmFtX3Fz b3J0X3NpZ25lZCgodm9pZCAqKSBHRVRBUlIodHJnKSwgbGVuLCBzaXplb2YodHJnbSkpOwot CQkJbGVuID0gcXVuaXF1ZShHRVRBUlIodHJnKSwgbGVuLCBzaXplb2YodHJnbSksIENNUFRS R01fU0lHTkVEKTsKLQkJfQogCQllbHNlCi0JCXsKIAkJCXRyaWdyYW1fcXNvcnRfdW5zaWdu ZWQoKHZvaWQgKikgR0VUQVJSKHRyZyksIGxlbiwgc2l6ZW9mKHRyZ20pKTsKLQkJCWxlbiA9 IHF1bmlxdWUoR0VUQVJSKHRyZyksIGxlbiwgc2l6ZW9mKHRyZ20pLCBDTVBUUkdNX1VOU0lH TkVEKTsKLQkJfQorCisJCWxlbiA9IHF1bmlxdWUoR0VUQVJSKHRyZyksIGxlbiwgc2l6ZW9m KHRyZ20pLCBDTVBUUkdNX0VRKTsKIAl9CiAKIAlTRVRfVkFSU0laRSh0cmcsIENBTENHVFNJ WkUoQVJSS0VZLCBsZW4pKTsKQEAgLTExMjAsMTUgKzExMjQsMTEgQEAgZ2VuZXJhdGVfd2ls ZGNhcmRfdHJnbShjb25zdCBjaGFyICpzdHIsIGludCBzbGVuKQogCWlmIChsZW4gPiAxKQog CXsKIAkJaWYgKEdldERlZmF1bHRDaGFyU2lnbmVkbmVzcygpKQotCQl7CiAJCQl0cmlncmFt X3Fzb3J0X3NpZ25lZCgodm9pZCAqKSBHRVRBUlIodHJnKSwgbGVuLCBzaXplb2YodHJnbSkp OwotCQkJbGVuID0gcXVuaXF1ZShHRVRBUlIodHJnKSwgbGVuLCBzaXplb2YodHJnbSksIENN UFRSR01fU0lHTkVEKTsKLQkJfQogCQllbHNlCi0JCXsKIAkJCXRyaWdyYW1fcXNvcnRfdW5z aWduZWQoKHZvaWQgKikgR0VUQVJSKHRyZyksIGxlbiwgc2l6ZW9mKHRyZ20pKTsKLQkJCWxl biA9IHF1bmlxdWUoR0VUQVJSKHRyZyksIGxlbiwgc2l6ZW9mKHRyZ20pLCBDTVBUUkdNX1VO U0lHTkVEKTsKLQkJfQorCisJCWxlbiA9IHF1bmlxdWUoR0VUQVJSKHRyZyksIGxlbiwgc2l6 ZW9mKHRyZ20pLCBDTVBUUkdNX0VRKTsKIAl9CiAKIAl0cmctPmZsYWcgPSBBUlJLRVk7Ci0t IAoyLjUxLjAKCg== --------------H37eGzqg78eBh8EQ2lkjnhA0 Content-Type: text/x-patch; charset=UTF-8; name="v4-0003-Make-btint4cmp-branchless.patch" Content-Disposition: attachment; filename="v4-0003-Make-btint4cmp-branchless.patch" Content-Transfer-Encoding: base64 RnJvbSA0OWVhNDRlMWJjMjZkMzE2NjIzOWI0ZWZkMjU3YzVmOGM0ZjEzNmZkIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBHZWllciA8Z2VpZGF2LnBnQGdtYWlsLmNv bT4KRGF0ZTogTW9uLCAxMCBOb3YgMjAyNSAxNTo0MDoxMSArMDEwMApTdWJqZWN0OiBbUEFU Q0ggdjQgMy81XSBNYWtlIGJ0aW50NGNtcCgpIGJyYW5jaGxlc3MKCi0tLQogc3JjL2JhY2tl bmQvYWNjZXNzL25idHJlZS9uYnRjb21wYXJlLmMgfCA4ICsrLS0tLS0tCiAxIGZpbGUgY2hh bmdlZCwgMiBpbnNlcnRpb25zKCspLCA2IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3Ny Yy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0Y29tcGFyZS5jIGIvc3JjL2JhY2tlbmQvYWNj ZXNzL25idHJlZS9uYnRjb21wYXJlLmMKaW5kZXggMWQzNDMzNzdlOTguLmFjMTZlM2Q5OTNk IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idGNvbXBhcmUuYwor KysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idGNvbXBhcmUuYwpAQCAtNjEsNiAr NjEsNyBAQAogI2luY2x1ZGUgInV0aWxzL2ZtZ3Jwcm90b3MuaCIKICNpbmNsdWRlICJ1dGls cy9za2lwc3VwcG9ydC5oIgogI2luY2x1ZGUgInV0aWxzL3NvcnRzdXBwb3J0LmgiCisjaW5j bHVkZSAiY29tbW9uL2ludC5oIgogCiAjaWZkZWYgU1RSRVNTX1NPUlRfSU5UX01JTgogI2Rl ZmluZSBBX0xFU1NfVEhBTl9CCQlJTlRfTUlOCkBAIC0yMDMsMTIgKzIwNCw3IEBAIGJ0aW50 NGNtcChQR19GVU5DVElPTl9BUkdTKQogCWludDMyCQlhID0gUEdfR0VUQVJHX0lOVDMyKDAp OwogCWludDMyCQliID0gUEdfR0VUQVJHX0lOVDMyKDEpOwogCi0JaWYgKGEgPiBiKQotCQlQ R19SRVRVUk5fSU5UMzIoQV9HUkVBVEVSX1RIQU5fQik7Ci0JZWxzZSBpZiAoYSA9PSBiKQot CQlQR19SRVRVUk5fSU5UMzIoMCk7Ci0JZWxzZQotCQlQR19SRVRVUk5fSU5UMzIoQV9MRVNT X1RIQU5fQik7CisJUEdfUkVUVVJOX0lOVDMyKHBnX2NtcF9zMzIoYSwgYikpOwogfQogCiBE YXR1bQotLSAKMi41MS4wCgo= --------------H37eGzqg78eBh8EQ2lkjnhA0 Content-Type: text/x-patch; charset=UTF-8; name="v4-0002-Optimize-generate_trgm-with-sort_template.h.patch" Content-Disposition: attachment; filename*0="v4-0002-Optimize-generate_trgm-with-sort_template.h.patch" Content-Transfer-Encoding: base64 RnJvbSBiYTY0YjJmZWQ2NDhmOWIzZmVmNTNlMjQ0ZDI2NjVkZGYxYWM5ZWEzIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBHZWllciA8Z2VpZGF2LnBnQGdtYWlsLmNv bT4KRGF0ZTogTW9uLCAxMCBOb3YgMjAyNSAxMzozNToxMSArMDEwMApTdWJqZWN0OiBbUEFU Q0ggdjQgMi81XSBPcHRpbWl6ZSBnZW5lcmF0ZV90cmdtKCkgd2l0aCBzb3J0X3RlbXBsYXRl LmgKCi0tLQogY29udHJpYi9wZ190cmdtL3RyZ21fb3AuYyB8IDQ3ICsrKysrKysrKysrKysr KysrKysrKysrKysrKysrKy0tLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDM3IGluc2VydGlv bnMoKyksIDEwIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfdHJnbS90 cmdtX29wLmMgYi9jb250cmliL3BnX3RyZ20vdHJnbV9vcC5jCmluZGV4IGVlODllNTQ4ZDE2 Li44NWRmNWVmMjMxMCAxMDA2NDQKLS0tIGEvY29udHJpYi9wZ190cmdtL3RyZ21fb3AuYwor KysgYi9jb250cmliL3BnX3RyZ20vdHJnbV9vcC5jCkBAIC0yMjYsNiArMjI2LDIzIEBAIENN UFRSR01fQ0hPT1NFKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCiAJcmV0dXJuIENN UFRSR00oYSwgYik7CiB9CiAKKy8qIERlZmluZSBvdXIgc3BlY2lhbGl6ZWQgc29ydCBmdW5j dGlvbiBuYW1lICovCisjZGVmaW5lIFNUX1NPUlQgdHJpZ3JhbV9xc29ydF9zaWduZWQKKyNk ZWZpbmUgU1RfRUxFTUVOVF9UWVBFX1ZPSUQKKyNkZWZpbmUgU1RfQ09NUEFSRShhLCBiKSBD TVBUUkdNX1NJR05FRChhLCBiKQorI2RlZmluZSBTVF9TQ09QRSBzdGF0aWMKKyNkZWZpbmUg U1RfREVGSU5FCisjZGVmaW5lIFNUX0RFQ0xBUkUKKyNpbmNsdWRlICJsaWIvc29ydF90ZW1w bGF0ZS5oIgorCisjZGVmaW5lIFNUX1NPUlQgdHJpZ3JhbV9xc29ydF91bnNpZ25lZAorI2Rl ZmluZSBTVF9FTEVNRU5UX1RZUEVfVk9JRAorI2RlZmluZSBTVF9DT01QQVJFKGEsIGIpIENN UFRSR01fVU5TSUdORUQoYSwgYikKKyNkZWZpbmUgU1RfU0NPUEUgc3RhdGljCisjZGVmaW5l IFNUX0RFRklORQorI2RlZmluZSBTVF9ERUNMQVJFCisjaW5jbHVkZSAibGliL3NvcnRfdGVt cGxhdGUuaCIKKwogLyoKICAqIERlcHJlY2F0ZWQgZnVuY3Rpb24uCiAgKiBVc2UgInBnX3Ry Z20uc2ltaWxhcml0eV90aHJlc2hvbGQiIEdVQyB2YXJpYWJsZSBpbnN0ZWFkIG9mIHRoaXMg ZnVuY3Rpb24uCkBAIC0yODEsMTIgKzI5OCw2IEBAIHNob3dfbGltaXQoUEdfRlVOQ1RJT05f QVJHUykKIAlQR19SRVRVUk5fRkxPQVQ0KHNpbWlsYXJpdHlfdGhyZXNob2xkKTsKIH0KIAot c3RhdGljIGludAotY29tcF90cmdtKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCi17 Ci0JcmV0dXJuIENNUFRSR00oYSwgYik7Ci19Ci0KIC8qCiAgKiBGaW5kcyBmaXJzdCB3b3Jk IGluIHN0cmluZywgcmV0dXJucyBwb2ludGVyIHRvIHRoZSB3b3JkLAogICogZW5kd29yZCBw b2ludHMgdG8gdGhlIGNoYXJhY3RlciBhZnRlciB3b3JkCkBAIC01NjksOCArNTgwLDE2IEBA IGdlbmVyYXRlX3RyZ20oY2hhciAqc3RyLCBpbnQgc2xlbikKIAkgKi8KIAlpZiAobGVuID4g MSkKIAl7Ci0JCXFzb3J0KEdFVEFSUih0cmcpLCBsZW4sIHNpemVvZih0cmdtKSwgY29tcF90 cmdtKTsKLQkJbGVuID0gcXVuaXF1ZShHRVRBUlIodHJnKSwgbGVuLCBzaXplb2YodHJnbSks IGNvbXBfdHJnbSk7CisJCWlmIChHZXREZWZhdWx0Q2hhclNpZ25lZG5lc3MoKSkKKwkJewor CQkJdHJpZ3JhbV9xc29ydF9zaWduZWQoKHZvaWQgKikgR0VUQVJSKHRyZyksIGxlbiwgc2l6 ZW9mKHRyZ20pKTsKKwkJCWxlbiA9IHF1bmlxdWUoR0VUQVJSKHRyZyksIGxlbiwgc2l6ZW9m KHRyZ20pLCBDTVBUUkdNX1NJR05FRCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0cmlncmFt X3Fzb3J0X3Vuc2lnbmVkKCh2b2lkICopIEdFVEFSUih0cmcpLCBsZW4sIHNpemVvZih0cmdt KSk7CisJCQlsZW4gPSBxdW5pcXVlKEdFVEFSUih0cmcpLCBsZW4sIHNpemVvZih0cmdtKSwg Q01QVFJHTV9VTlNJR05FRCk7CisJCX0KIAl9CiAKIAlTRVRfVkFSU0laRSh0cmcsIENBTENH VFNJWkUoQVJSS0VZLCBsZW4pKTsKQEAgLTExMDAsOCArMTExOSwxNiBAQCBnZW5lcmF0ZV93 aWxkY2FyZF90cmdtKGNvbnN0IGNoYXIgKnN0ciwgaW50IHNsZW4pCiAJbGVuID0gYXJyLmxl bmd0aDsKIAlpZiAobGVuID4gMSkKIAl7Ci0JCXFzb3J0KEdFVEFSUih0cmcpLCBsZW4sIHNp emVvZih0cmdtKSwgY29tcF90cmdtKTsKLQkJbGVuID0gcXVuaXF1ZShHRVRBUlIodHJnKSwg bGVuLCBzaXplb2YodHJnbSksIGNvbXBfdHJnbSk7CisJCWlmIChHZXREZWZhdWx0Q2hhclNp Z25lZG5lc3MoKSkKKwkJeworCQkJdHJpZ3JhbV9xc29ydF9zaWduZWQoKHZvaWQgKikgR0VU QVJSKHRyZyksIGxlbiwgc2l6ZW9mKHRyZ20pKTsKKwkJCWxlbiA9IHF1bmlxdWUoR0VUQVJS KHRyZyksIGxlbiwgc2l6ZW9mKHRyZ20pLCBDTVBUUkdNX1NJR05FRCk7CisJCX0KKwkJZWxz ZQorCQl7CisJCQl0cmlncmFtX3Fzb3J0X3Vuc2lnbmVkKCh2b2lkICopIEdFVEFSUih0cmcp LCBsZW4sIHNpemVvZih0cmdtKSk7CisJCQlsZW4gPSBxdW5pcXVlKEdFVEFSUih0cmcpLCBs ZW4sIHNpemVvZih0cmdtKSwgQ01QVFJHTV9VTlNJR05FRCk7CisJCX0KIAl9CiAKIAl0cmct PmZsYWcgPSBBUlJLRVk7Ci0tIAoyLjUxLjAKCg== --------------H37eGzqg78eBh8EQ2lkjnhA0 Content-Type: text/x-patch; charset=UTF-8; name="v4-0001-Optimize-sort-and-deduplication-in-ginExtractEntr.patch" Content-Disposition: attachment; filename*0="v4-0001-Optimize-sort-and-deduplication-in-ginExtractEntr.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA5ODNlNTU0M2MwODAyMjAxZDhjMmM0M2RiZGUwYTE5YWUzZDVlZDFiIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBHZWllciA8Z2VpZGF2LnBnQGdtYWlsLmNv bT4KRGF0ZTogV2VkLCAxNCBKYW4gMjAyNiAxMDo1NDozMiArMDEwMApTdWJqZWN0OiBbUEFU Q0ggdjQgMS81XSBPcHRpbWl6ZSBzb3J0IGFuZCBkZWR1cGxpY2F0aW9uIGluIGdpbkV4dHJh Y3RFbnRyaWVzCgotLS0KIHNyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2ludXRpbC5jIHwgMTUy ICsrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0KIHNyYy9pbmNsdWRlL2FjY2Vzcy9n aW5fcHJpdmF0ZS5oIHwgICAyICstCiAyIGZpbGVzIGNoYW5nZWQsIDY2IGluc2VydGlvbnMo KyksIDg4IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9n aW4vZ2ludXRpbC5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9naW51dGlsLmMKaW5kZXgg ZmY5MjcyNzljYzMuLjE1ZjRhNjg2Nzk1IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nl c3MvZ2luL2dpbnV0aWwuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbnV0aWwu YwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgInV0aWxzL2luZGV4X3NlbGZ1bmNzLmgi CiAjaW5jbHVkZSAidXRpbHMvcmVsLmgiCiAjaW5jbHVkZSAidXRpbHMvdHlwY2FjaGUuaCIK KyNpbmNsdWRlICJsaWIvcXVuaXF1ZS5oIgogCiAKIC8qCkBAIC0zODcsMTkgKzM4OCw2IEBA IEdpbkluaXRNZXRhYnVmZmVyKEJ1ZmZlciBiKQogCQkoKGNoYXIgKikgbWV0YWRhdGEgKyBz aXplb2YoR2luTWV0YVBhZ2VEYXRhKSkgLSAoY2hhciAqKSBwYWdlOwogfQogCi0vKgotICog U3VwcG9ydCBmb3Igc29ydGluZyBrZXkgZGF0dW1zIGluIGdpbkV4dHJhY3RFbnRyaWVzCi0g KgotICogTm90ZTogd2Ugb25seSBoYXZlIHRvIHdvcnJ5IGFib3V0IG51bGwgYW5kIG5vdC1u dWxsIGtleXMgaGVyZTsKLSAqIGdpbkV4dHJhY3RFbnRyaWVzIG5ldmVyIGdlbmVyYXRlcyBt b3JlIHRoYW4gb25lIHBsYWNlaG9sZGVyIG51bGwsCi0gKiBzbyBpdCBkb2Vzbid0IGhhdmUg dG8gc29ydCB0aG9zZS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLQlEYXR1bQkJZGF0dW07 Ci0JYm9vbAkJaXNudWxsOwotfSBrZXlFbnRyeURhdGE7Ci0KIHR5cGVkZWYgc3RydWN0CiB7 CiAJRm1nckluZm8gICAqY21wRGF0dW1GdW5jOwpAQCAtNDEwLDI0ICszOTgsMTQgQEAgdHlw ZWRlZiBzdHJ1Y3QKIHN0YXRpYyBpbnQKIGNtcEVudHJpZXMoY29uc3Qgdm9pZCAqYSwgY29u c3Qgdm9pZCAqYiwgdm9pZCAqYXJnKQogewotCWNvbnN0IGtleUVudHJ5RGF0YSAqYWEgPSAo Y29uc3Qga2V5RW50cnlEYXRhICopIGE7Ci0JY29uc3Qga2V5RW50cnlEYXRhICpiYiA9IChj b25zdCBrZXlFbnRyeURhdGEgKikgYjsKKwljb25zdCBEYXR1bSAqYWEgPSAoY29uc3QgRGF0 dW0gKikgYTsKKwljb25zdCBEYXR1bSAqYmIgPSAoY29uc3QgRGF0dW0gKikgYjsKIAljbXBF bnRyaWVzQXJnICpkYXRhID0gKGNtcEVudHJpZXNBcmcgKikgYXJnOwogCWludAkJCXJlczsK IAotCWlmIChhYS0+aXNudWxsKQotCXsKLQkJaWYgKGJiLT5pc251bGwpCi0JCQlyZXMgPSAw OwkJCS8qIE5VTEwgIj0iIE5VTEwgKi8KLQkJZWxzZQotCQkJcmVzID0gMTsJCQkvKiBOVUxM ICI+IiBub3QtTlVMTCAqLwotCX0KLQllbHNlIGlmIChiYi0+aXNudWxsKQotCQlyZXMgPSAt MTsJCQkJLyogbm90LU5VTEwgIjwiIE5VTEwgKi8KLQllbHNlCi0JCXJlcyA9IERhdHVtR2V0 SW50MzIoRnVuY3Rpb25DYWxsMkNvbGwoZGF0YS0+Y21wRGF0dW1GdW5jLAotCQkJCQkJCQkJ CQkgIGRhdGEtPmNvbGxhdGlvbiwKLQkJCQkJCQkJCQkJICBhYS0+ZGF0dW0sIGJiLT5kYXR1 bSkpOworCXJlcyA9IERhdHVtR2V0SW50MzIoRnVuY3Rpb25DYWxsMkNvbGwoZGF0YS0+Y21w RGF0dW1GdW5jLAorCQkJCQkJCQkJCSAgZGF0YS0+Y29sbGF0aW9uLAorCQkJCQkJCQkJCSAg KmFhLCAqYmIpKTsKIAogCS8qCiAJICogRGV0ZWN0IGlmIHdlIGhhdmUgYW55IGR1cGxpY2F0 ZXMuICBJZiB0aGVyZSBhcmUgZXF1YWwga2V5cywgcXNvcnQgbXVzdApAQCAtNDQwLDYgKzQx OCwxNCBAQCBjbXBFbnRyaWVzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIsIHZvaWQg KmFyZykKIAlyZXR1cm4gcmVzOwogfQogCisjZGVmaW5lIFNUX1NPUlQgcXNvcnRfYXJnX2Vu dHJpZXMKKyNkZWZpbmUgU1RfRUxFTUVOVF9UWVBFIERhdHVtCisjZGVmaW5lIFNUX0NPTVBB UkVfQVJHX1RZUEUgY21wRW50cmllc0FyZworI2RlZmluZSBTVF9DT01QQVJFKGEsIGIsIGFy ZykgY21wRW50cmllcyhhLCBiLCBhcmcpCisjZGVmaW5lIFNUX1NDT1BFIHN0YXRpYworI2Rl ZmluZSBTVF9ERUZJTkUKKyNkZWZpbmUgU1RfREVDTEFSRQorI2luY2x1ZGUgImxpYi9zb3J0 X3RlbXBsYXRlLmgiCiAKIC8qCiAgKiBFeHRyYWN0IHRoZSBpbmRleCBrZXkgdmFsdWVzIGZy b20gYW4gaW5kZXhhYmxlIGl0ZW0KQEAgLTQ1MCwxMSArNDM2LDEzIEBAIGNtcEVudHJpZXMo Y29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYiwgdm9pZCAqYXJnKQogRGF0dW0gKgogZ2lu RXh0cmFjdEVudHJpZXMoR2luU3RhdGUgKmdpbnN0YXRlLCBPZmZzZXROdW1iZXIgYXR0bnVt LAogCQkJCSAgRGF0dW0gdmFsdWUsIGJvb2wgaXNOdWxsLAotCQkJCSAgaW50MzIgKm5lbnRy aWVzLCBHaW5OdWxsQ2F0ZWdvcnkgKipjYXRlZ29yaWVzKQorCQkJCSAgaW50MzIgKm5lbnRy aWVzX3AsIEdpbk51bGxDYXRlZ29yeSAqKmNhdGVnb3JpZXNfcCkKIHsKIAlEYXR1bQkgICAq ZW50cmllczsKIAlib29sCSAgICpudWxsRmxhZ3M7Ci0JaW50MzIJCWk7CisJR2luTnVsbENh dGVnb3J5ICpjYXRlZ29yaWVzOworCWJvb2wJCWhhc051bGw7CisJaW50MzIJCW5lbnRyaWVz OwogCiAJLyoKIAkgKiBXZSBkb24ndCBjYWxsIHRoZSBleHRyYWN0VmFsdWVGbiBvbiBhIG51 bGwgaXRlbS4gIEluc3RlYWQgZ2VuZXJhdGUgYQpAQCAtNDYyLDQyICs0NTAsNjAgQEAgZ2lu RXh0cmFjdEVudHJpZXMoR2luU3RhdGUgKmdpbnN0YXRlLCBPZmZzZXROdW1iZXIgYXR0bnVt LAogCSAqLwogCWlmIChpc051bGwpCiAJewotCQkqbmVudHJpZXMgPSAxOworCQkqbmVudHJp ZXNfcCA9IDE7CiAJCWVudHJpZXMgPSBwYWxsb2Nfb2JqZWN0KERhdHVtKTsKIAkJZW50cmll c1swXSA9IChEYXR1bSkgMDsKLQkJKmNhdGVnb3JpZXMgPSBwYWxsb2Nfb2JqZWN0KEdpbk51 bGxDYXRlZ29yeSk7Ci0JCSgqY2F0ZWdvcmllcylbMF0gPSBHSU5fQ0FUX05VTExfSVRFTTsK KwkJKmNhdGVnb3JpZXNfcCA9IHBhbGxvY19vYmplY3QoR2luTnVsbENhdGVnb3J5KTsKKwkJ KCpjYXRlZ29yaWVzX3ApWzBdID0gR0lOX0NBVF9OVUxMX0lURU07CiAJCXJldHVybiBlbnRy aWVzOwogCX0KIAogCS8qIE9LLCBjYWxsIHRoZSBvcGNsYXNzJ3MgZXh0cmFjdFZhbHVlRm4g Ki8KIAludWxsRmxhZ3MgPSBOVUxMOwkJCS8qIGluIGNhc2UgZXh0cmFjdFZhbHVlIGRvZXNu J3Qgc2V0IGl0ICovCisJbmVudHJpZXMgPSAwOwogCWVudHJpZXMgPSAoRGF0dW0gKikKIAkJ RGF0dW1HZXRQb2ludGVyKEZ1bmN0aW9uQ2FsbDNDb2xsKCZnaW5zdGF0ZS0+ZXh0cmFjdFZh bHVlRm5bYXR0bnVtIC0gMV0sCiAJCQkJCQkJCQkJICBnaW5zdGF0ZS0+c3VwcG9ydENvbGxh dGlvblthdHRudW0gLSAxXSwKIAkJCQkJCQkJCQkgIHZhbHVlLAotCQkJCQkJCQkJCSAgUG9p bnRlckdldERhdHVtKG5lbnRyaWVzKSwKKwkJCQkJCQkJCQkgIFBvaW50ZXJHZXREYXR1bSgm bmVudHJpZXMpLAogCQkJCQkJCQkJCSAgUG9pbnRlckdldERhdHVtKCZudWxsRmxhZ3MpKSk7 CiAKIAkvKgogCSAqIEdlbmVyYXRlIGEgcGxhY2Vob2xkZXIgaWYgdGhlIGl0ZW0gY29udGFp bmVkIG5vIGtleXMuCiAJICovCi0JaWYgKGVudHJpZXMgPT0gTlVMTCB8fCAqbmVudHJpZXMg PD0gMCkKKwlpZiAoZW50cmllcyA9PSBOVUxMIHx8IG5lbnRyaWVzIDw9IDApCiAJewotCQkq bmVudHJpZXMgPSAxOworCQkqbmVudHJpZXNfcCA9IDE7CiAJCWVudHJpZXMgPSBwYWxsb2Nf b2JqZWN0KERhdHVtKTsKIAkJZW50cmllc1swXSA9IChEYXR1bSkgMDsKLQkJKmNhdGVnb3Jp ZXMgPSBwYWxsb2Nfb2JqZWN0KEdpbk51bGxDYXRlZ29yeSk7Ci0JCSgqY2F0ZWdvcmllcylb MF0gPSBHSU5fQ0FUX0VNUFRZX0lURU07CisJCSpjYXRlZ29yaWVzX3AgPSBwYWxsb2Nfb2Jq ZWN0KEdpbk51bGxDYXRlZ29yeSk7CisJCSgqY2F0ZWdvcmllc19wKVswXSA9IEdJTl9DQVRf RU1QVFlfSVRFTTsKIAkJcmV0dXJuIGVudHJpZXM7CiAJfQogCiAJLyoKLQkgKiBJZiB0aGUg ZXh0cmFjdFZhbHVlRm4gZGlkbid0IGNyZWF0ZSBhIG51bGxGbGFncyBhcnJheSwgY3JlYXRl IG9uZSwKLQkgKiBhc3N1bWluZyB0aGF0IGV2ZXJ5dGhpbmcncyBub24tbnVsbC4KKwkgKiBT Y2FuIHRoZSBpdGVtcyBmb3IgYW55IE5VTExzLiAgQWxsIE5VTExzIGFyZSBjb25zaWRlcmVk IGVxdWFsLCBzbyB3ZQorCSAqIGp1c3QgbmVlZCB0byBjaGVjayBhbmQgcmVtZW1iZXIgaWYg dGhlcmUgYXJlIGFueS4gIFdlIHJlbW92ZSB0aGVtIGZyb20KKwkgKiB0aGUgYXJyYXkgaGVy ZSwgYW5kIGlmIG5lY2Vzc2FyeSwgcHV0IGJhY2sgb25lIE5VTEwgZW50cnkgdG8gcmVwcmVz ZW50CisJICogdGhlbSBhbGwgYWZ0ZXIgZGVkdXBsaWNhdGlvbi4KIAkgKi8KLQlpZiAobnVs bEZsYWdzID09IE5VTEwpCi0JCW51bGxGbGFncyA9IChib29sICopIHBhbGxvYzAoKm5lbnRy aWVzICogc2l6ZW9mKGJvb2wpKTsKKwloYXNOdWxsID0gZmFsc2U7CisJaWYgKG51bGxGbGFn cykKKwl7CisJCWludDMyCQludW1Ob25OdWxscyA9IDA7CisKKwkJZm9yIChpbnQzMiBpID0g MDsgaSA8IG5lbnRyaWVzOyBpKyspCisJCXsKKwkJCWlmIChudWxsRmxhZ3NbaV0pCisJCQkJ aGFzTnVsbCA9IHRydWU7CisJCQllbHNlCisJCQl7CisJCQkJZW50cmllc1tudW1Ob25OdWxs c10gPSBlbnRyaWVzW2ldOworCQkJCW51bU5vbk51bGxzKys7CisJCQl9CisJCX0KKwkJbmVu dHJpZXMgPSBudW1Ob25OdWxsczsKKwl9CiAKIAkvKgogCSAqIElmIHRoZXJlJ3MgbW9yZSB0 aGFuIG9uZSBrZXksIHNvcnQgYW5kIHVuaXF1ZS1pZnkuCkBAIC01MDYsNjMgKzUxMiwzNSBA QCBnaW5FeHRyYWN0RW50cmllcyhHaW5TdGF0ZSAqZ2luc3RhdGUsIE9mZnNldE51bWJlciBh dHRudW0sCiAJICogcHJldHR5IGJhZCB0b28uICBGb3Igc21hbGwgbnVtYmVycyBvZiBrZXlz IGl0J2QgbGlrZWx5IGJlIGJldHRlciB0byB1c2UKIAkgKiBhIHNpbXBsZSBpbnNlcnRpb24g c29ydC4KIAkgKi8KLQlpZiAoKm5lbnRyaWVzID4gMSkKKwlpZiAobmVudHJpZXMgPiAxKQog CXsKLQkJa2V5RW50cnlEYXRhICprZXlkYXRhOwogCQljbXBFbnRyaWVzQXJnIGFyZzsKLQot CQlrZXlkYXRhID0gcGFsbG9jX2FycmF5KGtleUVudHJ5RGF0YSwgKm5lbnRyaWVzKTsKLQkJ Zm9yIChpID0gMDsgaSA8ICpuZW50cmllczsgaSsrKQotCQl7Ci0JCQlrZXlkYXRhW2ldLmRh dHVtID0gZW50cmllc1tpXTsKLQkJCWtleWRhdGFbaV0uaXNudWxsID0gbnVsbEZsYWdzW2ld OwotCQl9Ci0KIAkJYXJnLmNtcERhdHVtRnVuYyA9ICZnaW5zdGF0ZS0+Y29tcGFyZUZuW2F0 dG51bSAtIDFdOwogCQlhcmcuY29sbGF0aW9uID0gZ2luc3RhdGUtPnN1cHBvcnRDb2xsYXRp b25bYXR0bnVtIC0gMV07CiAJCWFyZy5oYXZlRHVwcyA9IGZhbHNlOwotCQlxc29ydF9hcmco a2V5ZGF0YSwgKm5lbnRyaWVzLCBzaXplb2Yoa2V5RW50cnlEYXRhKSwKLQkJCQkgIGNtcEVu dHJpZXMsICZhcmcpOwogCi0JCWlmIChhcmcuaGF2ZUR1cHMpCi0JCXsKLQkJCS8qIHRoZXJl IGFyZSBkdXBsaWNhdGVzLCBtdXN0IGdldCByaWQgb2YgJ2VtICovCi0JCQlpbnQzMgkJajsK LQotCQkJZW50cmllc1swXSA9IGtleWRhdGFbMF0uZGF0dW07Ci0JCQludWxsRmxhZ3NbMF0g PSBrZXlkYXRhWzBdLmlzbnVsbDsKLQkJCWogPSAxOwotCQkJZm9yIChpID0gMTsgaSA8ICpu ZW50cmllczsgaSsrKQotCQkJewotCQkJCWlmIChjbXBFbnRyaWVzKCZrZXlkYXRhW2kgLSAx XSwgJmtleWRhdGFbaV0sICZhcmcpICE9IDApCi0JCQkJewotCQkJCQllbnRyaWVzW2pdID0g a2V5ZGF0YVtpXS5kYXR1bTsKLQkJCQkJbnVsbEZsYWdzW2pdID0ga2V5ZGF0YVtpXS5pc251 bGw7Ci0JCQkJCWorKzsKLQkJCQl9Ci0JCQl9Ci0JCQkqbmVudHJpZXMgPSBqOwotCQl9Ci0J CWVsc2UKLQkJewotCQkJLyogZWFzeSwgbm8gZHVwbGljYXRlcyAqLwotCQkJZm9yIChpID0g MDsgaSA8ICpuZW50cmllczsgaSsrKQotCQkJewotCQkJCWVudHJpZXNbaV0gPSBrZXlkYXRh W2ldLmRhdHVtOwotCQkJCW51bGxGbGFnc1tpXSA9IGtleWRhdGFbaV0uaXNudWxsOwotCQkJ fQotCQl9CisJCXFzb3J0X2FyZ19lbnRyaWVzKGVudHJpZXMsIG5lbnRyaWVzLCAmYXJnKTsK IAotCQlwZnJlZShrZXlkYXRhKTsKKwkJaWYgKGFyZy5oYXZlRHVwcykKKwkJCW5lbnRyaWVz ID0gcXVuaXF1ZV9hcmcoZW50cmllcywgbmVudHJpZXMsIHNpemVvZihEYXR1bSksIGNtcEVu dHJpZXMsICZhcmcpOwogCX0KIAogCS8qCi0JICogQ3JlYXRlIEdpbk51bGxDYXRlZ29yeSBy ZXByZXNlbnRhdGlvbiBmcm9tIG51bGxGbGFncy4KKwkgKiBDcmVhdGUgR2luTnVsbENhdGVn b3J5IHJlcHJlc2VudGF0aW9uLgogCSAqLwotCSpjYXRlZ29yaWVzID0gKEdpbk51bGxDYXRl Z29yeSAqKSBwYWxsb2MwKCpuZW50cmllcyAqIHNpemVvZihHaW5OdWxsQ2F0ZWdvcnkpKTsK LQlmb3IgKGkgPSAwOyBpIDwgKm5lbnRyaWVzOyBpKyspCi0JCSgqY2F0ZWdvcmllcylbaV0g PSAobnVsbEZsYWdzW2ldID8gR0lOX0NBVF9OVUxMX0tFWSA6IEdJTl9DQVRfTk9STV9LRVkp OworCVN0YXRpY0Fzc2VydFN0bXQoR0lOX0NBVF9OT1JNX0tFWSA9PSAwLCAiQXNzdW1pbmcg R0lOX0NBVF9OT1JNX0tFWT0wIik7CisJY2F0ZWdvcmllcyA9IHBhbGxvYzBfYXJyYXkoR2lu TnVsbENhdGVnb3J5LCBuZW50cmllcyArIChoYXNOdWxsID8gMSA6IDApKTsKKworCS8qIFB1 dCBiYWNrIGEgTlVMTCBlbnRyeSwgaWYgdGhlcmUgd2VyZSBhbnkgKi8KKwlpZiAoaGFzTnVs bCkKKwl7CisJCWVudHJpZXNbbmVudHJpZXNdID0gKERhdHVtKSAwOworCQljYXRlZ29yaWVz W25lbnRyaWVzXSA9IEdJTl9DQVRfTlVMTF9LRVk7CisJCW5lbnRyaWVzKys7CisJfQogCisJ Km5lbnRyaWVzX3AgPSBuZW50cmllczsKKwkqY2F0ZWdvcmllc19wID0gY2F0ZWdvcmllczsK IAlyZXR1cm4gZW50cmllczsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvYWNjZXNz L2dpbl9wcml2YXRlLmggYi9zcmMvaW5jbHVkZS9hY2Nlc3MvZ2luX3ByaXZhdGUuaAppbmRl eCA3YzNiNGRiOTRjZC4uYzg3ODU0NmI5ZDIgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2Fj Y2Vzcy9naW5fcHJpdmF0ZS5oCisrKyBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9naW5fcHJpdmF0 ZS5oCkBAIC05OSw3ICs5OSw3IEBAIGV4dGVybiB2b2lkIEdpbkluaXRQYWdlKFBhZ2UgcGFn ZSwgdWludDMyIGYsIFNpemUgcGFnZVNpemUpOwogZXh0ZXJuIHZvaWQgR2luSW5pdE1ldGFi dWZmZXIoQnVmZmVyIGIpOwogZXh0ZXJuIERhdHVtICpnaW5FeHRyYWN0RW50cmllcyhHaW5T dGF0ZSAqZ2luc3RhdGUsIE9mZnNldE51bWJlciBhdHRudW0sCiAJCQkJCQkJCURhdHVtIHZh bHVlLCBib29sIGlzTnVsbCwKLQkJCQkJCQkJaW50MzIgKm5lbnRyaWVzLCBHaW5OdWxsQ2F0 ZWdvcnkgKipjYXRlZ29yaWVzKTsKKwkJCQkJCQkJaW50MzIgKm5lbnRyaWVzX3AsIEdpbk51 bGxDYXRlZ29yeSAqKmNhdGVnb3JpZXNfcCk7CiAKIGV4dGVybiBPZmZzZXROdW1iZXIgZ2lu dHVwbGVfZ2V0X2F0dHJudW0oR2luU3RhdGUgKmdpbnN0YXRlLCBJbmRleFR1cGxlIHR1cGxl KTsKIGV4dGVybiBEYXR1bSBnaW50dXBsZV9nZXRfa2V5KEdpblN0YXRlICpnaW5zdGF0ZSwg SW5kZXhUdXBsZSB0dXBsZSwKLS0gCjIuNTEuMAoK --------------H37eGzqg78eBh8EQ2lkjnhA0--