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 1vcm5j-00AeJh-2S for pgsql-hackers@arkaria.postgresql.org; Mon, 05 Jan 2026 15:01:56 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vcm5i-002W82-01 for pgsql-hackers@arkaria.postgresql.org; Mon, 05 Jan 2026 15:01:54 +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.96) (envelope-from ) id 1vcm5h-002W7o-15 for pgsql-hackers@lists.postgresql.org; Mon, 05 Jan 2026 15:01:54 +0000 Received: from mail-ej1-x62d.google.com ([2a00:1450:4864:20::62d]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vcm5f-004LBD-0n for pgsql-hackers@postgresql.org; Mon, 05 Jan 2026 15:01:53 +0000 Received: by mail-ej1-x62d.google.com with SMTP id a640c23a62f3a-b7ffa421f1bso309305266b.0 for ; Mon, 05 Jan 2026 07:01:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1767625308; x=1768230108; darn=postgresql.org; h=to:content-language:subject:from:user-agent:mime-version:date :message-id:from:to:cc:subject:date:message-id:reply-to; bh=kwFSha2bfu8v1tMQ6UN4PjpdFPfz1oloTpeQLIwHCD4=; b=IZiR5hA+2B+bs2mb3z2WEaZvMOkgcKHViOR31WpYJts328anr0xXUb5PY/s8fJwMfh HQa3s61M0Lre2iaNv5wif8lRs2bqStznE1EdiOY3Vk83PKMuGBu0Ib+7a/CaUsNMLrea eOgupX91R0YA7Zg7/PHJjO+LgzGa4mcEi8b4cYloy48SwJB2OfXJvjgoMyJCqgrV6juM mDZZvbgxBd35vzA0zbhjuJu1KcfEJsZy/6F6WPA1VLU0DuW4FJ1iqu/d0PIqrGs4hlcv IOrFjXdV9+IFwx7zkqZRAeJ7/j++l0SxJOPgAIWof7moH3WVtv219VHvXyFI/YYAY7f4 Y7JA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767625308; x=1768230108; h=to:content-language:subject:from:user-agent:mime-version:date :message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=kwFSha2bfu8v1tMQ6UN4PjpdFPfz1oloTpeQLIwHCD4=; b=O3eqx2DX96yPsAR9wcsBE068S6FxSp/iFnomcT4zWjuwDveqLz4NjBmBy5iqBd6RRd AxrFHWee2VdYmGLfSjqHkpU7jChcuAw6aqYLx9JP36cnx/8xUDC3e1/AuIKXX3uUcre/ fb0D91q3E8rIRF/aIkPkWhzrXjM2/bvc4GcC+MKojTq++eQ3OibigTAtmgIb8REyNSzu B4vKkXYjcmr4E5P7k+Loc07EGrv3gECLjEJGM8VIRHDz1koUo8/etd2Fydcy4MzclWZg aP9NA/CbEGnWXWP+KYEPcyCykGg7uCEnevXDr/CtHKh+sdykWyuQCQ7cj7iqpTuM8i8v dILA== X-Gm-Message-State: AOJu0Yw/wgzPaJ3RlOa5sn6wTnhOiJnhZYQiCIR7yEMc++qOAS18/m9z lqf7mgzA8MXQ1Up87j6ppVlzyMuLxg1wTu1F8HExqdJIDp5WbobsrIgi6WjDIg== X-Gm-Gg: AY/fxX430H14wSZodS+sVHM1B17TIg6yLj9UpMbDPkCAE7S4ch6WJWaArHGV/dr+jlX cdLMJvNyYNvXupp9JjMc/mElut7ZX8K41p67Wyy7RUtPIY2G91YDkLsOugw7qUmGjiWiSQ8GTw4 t09HVHyAnr8LiBIKIZrkEiytWLr+juBAWpvqokMzMc8eeEAwsNDyRR6uuTODT41Rq96Mo82DjCz 2BWZmwnRel6KMbHrWBEY0S5WUpCyRmJ7ErxMVcVnV+6J4jsSSc0RsspHFu8TqsGy4z69ityPoXL sx8EtoMpcR9tSg0cjTYyJTxjTgeTaj7zaiSTSYVlmL8ARuMYZmQQXZmqpeqReCnBuWJWbTxwkve 7OlADm4BiT8gIvXu1ZxLrbTD4kCgPMv3e8wJcgFpbNabB39kb56oqK0vuOj+mC1lGr0SzinBBID tDoyVuh+6PaKrlqC0= X-Google-Smtp-Source: AGHT+IEzOZRWUWGpFTJGf6GDkv8P1Jhbco5n44MpHtKkozFqKEMlwqeoAjFwy/EGf9E67dmrHZEWlQ== X-Received: by 2002:a17:907:268b:b0:b76:b928:eba1 with SMTP id a640c23a62f3a-b83e251ee4emr926818066b.7.1767625307444; Mon, 05 Jan 2026 07:01:47 -0800 (PST) Received: from [192.168.2.32] ([147.161.234.249]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b84265abff8sm14315166b.3.2026.01.05.07.01.46 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 05 Jan 2026 07:01:46 -0800 (PST) Content-Type: multipart/mixed; boundary="------------IhN4GcT9sRwrhtqlqHgdqwZh" Message-ID: <5d366878-2007-4d31-861e-19294b7a583b@gmail.com> Date: Mon, 5 Jan 2026 16:01:44 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird From: David Geier Subject: Reduce build times of pg_trgm GIN indexes Content-Language: en-US To: pgsql-hackers 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. --------------IhN4GcT9sRwrhtqlqHgdqwZh Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Hi hackers, Attached is a series of patches which gradually reduce the time it takes to create GIN indexes. Most of the gains come from optimizing the trigram extraction code in pg_trgm. A few small optimizations apply to any GIN index operator class. The changes are motivated by the time it takes to create GIN indexes on large production tables, especially, on columns with long strings. Even with multiple parallel maintenance workers I've seen this taking hours. For testing purposes I've used two different data sets: 1. The l_comment column of the TPC-H SF 10 lineitem table. l_comment contains relatively short strings with a minimum of 10, a maximum of 43 and an average of ~27 characters. 2. The plots from a collection of movies from Wikipedia. The plots are much longer than l_comment, with a minimum of 15, a maximum of 36,773 and an average of ~2,165 characters. The CSV file can be downloaded here [1]. Testing both cases is important because a big part of the trigram extraction is spent on removing duplicates. The longer the string, the more duplicates are usually encountered. The script I used for testing is attached. I ran CREATE INDEX three times and took the fastest run. I'm getting the following results on my i9-13950HX dev laptop in release build: Data set | Patched (ms) | Master (ms) | Speedup --------------------|--------------|--------------|---------- movies(plot) | 3,409 | 10,311 | 3.02x lineitem(l_comment) | 161,569 | 256,986 | 1.59x The attached patches do the following: - v1-0001-Inline-ginCompareAttEntries.patch: Inline ginCompareAttEntries() which is very frequently called by the GIN code. - v1-0002-Optimized-comparison-functions.patch: Use FunctionCallInvoke() instead of FunctionCall2Coll(). This saves a bunch of per-comparison setup code, such as calling InitFunctionCallInfoData(). - v1-0003-Use-sort_template.h.patch: Use sort_template.h instead of qsort(), to inline calls to the sort comparator. This is an interim step that is further improved on by patch 0006. - v1-0004-Avoid-dedup-and-sort-in-ginExtractEntries.patch ginExtractEntries() deduplicates and sorts the entries returned from the extract value function. In case of pg_trgm, that is completely redundant because the trigrams are already deduplicated and sorted. The current version of this patch is just to demonstrate the potential. We need to think about what we want here. Ideally, we would require the extraction function to provide the entries deduplicated and sorted. Alternatively, we could indicate to ginExtractEntries() if the entries are already deduplicated and sorted. If we don't want to alter the signature of the extract value function, we could e.g. use the MSB of the nentries argument. - v1-0005-Make-btint4cmp-branchless.patch: Removes branches from btint4cmp(), which is heavily called from the GIN code. This might as well have benefit in other parts of the code base. v1-0006-Use-radix-sort.patch: Replace the sort_template.h-based qsort() with radix sort. For the purpose of demonstrating the possible gains, I've only replaced the signed variant for now. I've also tried using simplehash.h for deduplicating followed by a sort_template.h-based sort. But that was slower. v1-0007-Faster-qunique-comparator.patch: qunique() doesn't require a full sort comparator (-1 = less, 0 = equal, 1 = greater) but only a equal/unequal comparator (e.g. 0 = equal and 1 = unequal). The same optimization can be done in plenty of other places in our code base. Likely, in most of them the gains are insignificant. v1-0008-Add-ASCII-fastpath-to-generate_trgm_only.patch: Typically lots of text is actually ASCII. Hence, we provide a fast path for this case which is exercised if the MSB of the current character is unset. With above changes, the majority of the runtime is now spent on inserting the trigrams into the GIN index via ginInsertBAEntry(). The code in master uses a red-black for further deduplication and sorting. Traversing the red-black tree and updating it is pretty slow. I haven't looked through all the code yet, but it seems to me that we would be better off replacing the red-black tree with a sort and/or a hash map. But I'll leave this as future work for now. [1] https://github.com/kiq005/movie-recommendation/raw/refs/heads/master/src/dataset/wiki_movie_plots_deduped.csv -- David Geier --------------IhN4GcT9sRwrhtqlqHgdqwZh Content-Type: text/x-patch; charset=UTF-8; name="v1-0008-Add-ASCII-fastpath-to-generate_trgm_only.patch" Content-Disposition: attachment; filename="v1-0008-Add-ASCII-fastpath-to-generate_trgm_only.patch" Content-Transfer-Encoding: base64 RnJvbSBmYzdiZjNiZDljMWJkZjEzMzZjMjMzYTc5NjA3OTU1NmJiMWRiZjlkIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBHZWllciA8Z2VpZGF2LnBnQGdtYWlsLmNv bT4KRGF0ZTogRnJpLCAxNCBOb3YgMjAyNSAxMTozNzo0MCArMDEwMApTdWJqZWN0OiBbUEFU Q0ggdjEgOC84XSBBZGQgQVNDSUkgZmFzdHBhdGggdG8gZ2VuZXJhdGVfdHJnbV9vbmx5KCkK Ci0tLQogY29udHJpYi9wZ190cmdtL3RyZ21fb3AuYyB8IDEyNCArKysrKysrKysrKysrKysr KysrKy0tLS0tLS0tLS0tLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDY1IGluc2VydGlvbnMo KyksIDU5IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfdHJnbS90cmdt X29wLmMgYi9jb250cmliL3BnX3RyZ20vdHJnbV9vcC5jCmluZGV4IGUwN2M1NTNiMWJkLi40 MjM0M2JkMTQ0MiAxMDA2NDQKLS0tIGEvY29udHJpYi9wZ190cmdtL3RyZ21fb3AuYworKysg Yi9jb250cmliL3BnX3RyZ20vdHJnbV9vcC5jCkBAIC0yMjYsMzIgKzIyNiw2IEBAIHNob3df bGltaXQoUEdfRlVOQ1RJT05fQVJHUykKIAlQR19SRVRVUk5fRkxPQVQ0KHNpbWlsYXJpdHlf dGhyZXNob2xkKTsKIH0KIAotLyoKLSAqIEZpbmRzIGZpcnN0IHdvcmQgaW4gc3RyaW5nLCBy ZXR1cm5zIHBvaW50ZXIgdG8gdGhlIHdvcmQsCi0gKiBlbmR3b3JkIHBvaW50cyB0byB0aGUg Y2hhcmFjdGVyIGFmdGVyIHdvcmQKLSAqLwotc3RhdGljIGNoYXIgKgotZmluZF93b3JkKGNo YXIgKnN0ciwgaW50IGxlbnN0ciwgY2hhciAqKmVuZHdvcmQsIGludCAqY2hhcmxlbikKLXsK LQljaGFyCSAgICpiZWdpbndvcmQgPSBzdHI7Ci0KLQl3aGlsZSAoYmVnaW53b3JkIC0gc3Ry IDwgbGVuc3RyICYmICFJU1dPUkRDSFIoYmVnaW53b3JkKSkKLQkJYmVnaW53b3JkICs9IHBn X21ibGVuKGJlZ2lud29yZCk7Ci0KLQlpZiAoYmVnaW53b3JkIC0gc3RyID49IGxlbnN0cikK LQkJcmV0dXJuIE5VTEw7Ci0KLQkqZW5kd29yZCA9IGJlZ2lud29yZDsKLQkqY2hhcmxlbiA9 IDA7Ci0Jd2hpbGUgKCplbmR3b3JkIC0gc3RyIDwgbGVuc3RyICYmIElTV09SRENIUigqZW5k d29yZCkpCi0JewotCQkqZW5kd29yZCArPSBwZ19tYmxlbigqZW5kd29yZCk7Ci0JCSgqY2hh cmxlbikrKzsKLQl9Ci0KLQlyZXR1cm4gYmVnaW53b3JkOwotfQotCiAvKgogICogUmVkdWNl IGEgdHJpZ3JhbSAodGhyZWUgcG9zc2libHkgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzKSB0byBh IHRyZ20sCiAgKiB3aGljaCBpcyBhbHdheXMgZXhhY3RseSB0aHJlZSBieXRlcy4gIElmIHdl IGhhdmUgdGhyZWUgc2luZ2xlLWJ5dGUKQEAgLTMzNyw1OCArMzExLDkwIEBAIG1ha2VfdHJp Z3JhbXModHJnbSAqdHB0ciwgY2hhciAqc3RyLCBpbnQgYnl0ZWxlbiwgaW50IGNoYXJsZW4p CiBzdGF0aWMgaW50CiBnZW5lcmF0ZV90cmdtX29ubHkodHJnbSAqdHJnLCBjaGFyICpzdHIs IGludCBzbGVuLCBUcmdtQm91bmQgKmJvdW5kcykKIHsKLQl0cmdtCSAgICp0cHRyOwotCWNo YXIJICAgKmJ1ZjsKLQlpbnQJCQljaGFybGVuLAotCQkJCWJ5dGVsZW47Ci0JY2hhcgkgICAq YndvcmQsCi0JCQkgICAqZXdvcmQ7CisJdHJnbSAqdHB0ciA9IHRyZzsKKwljaGFyICpidWY7 CiAKIAlpZiAoc2xlbiArIExQQURESU5HICsgUlBBRERJTkcgPCAzIHx8IHNsZW4gPT0gMCkK IAkJcmV0dXJuIDA7CiAKLQl0cHRyID0gdHJnOworCWJ1ZiA9IHBhbGxvY19hcnJheShjaGFy LCBzbGVuICogcGdfZGF0YWJhc2VfZW5jb2RpbmdfbWF4X2xlbmd0aCgpICsgNCArIDEpOwor CW1lbXNldChidWYsICcgJywgTFBBRERJTkcpOwogCi0JLyogQWxsb2NhdGUgYSBidWZmZXIg Zm9yIGNhc2UtZm9sZGVkLCBibGFuay1wYWRkZWQgd29yZHMgKi8KLQlidWYgPSAoY2hhciAq KSBwYWxsb2Moc2xlbiAqIHBnX2RhdGFiYXNlX2VuY29kaW5nX21heF9sZW5ndGgoKSArIDQp OwotCi0JaWYgKExQQURESU5HID4gMCkKKwlmb3IgKGludCBpID0gMDsgaSA8IHNsZW47ICkK IAl7Ci0JCSpidWYgPSAnICc7Ci0JCWlmIChMUEFERElORyA+IDEpCi0JCQkqKGJ1ZiArIDEp ID0gJyAnOwotCX0KKwkJaW50IG51bV9ieXRlcyA9IExQQURESU5HOworCQlpbnQgbnVtX2No YXJzID0gTFBBRERJTkc7CisJCWNoYXIgKndvcmQ7CiAKLQlld29yZCA9IHN0cjsKLQl3aGls ZSAoKGJ3b3JkID0gZmluZF93b3JkKGV3b3JkLCBzbGVuIC0gKGV3b3JkIC0gc3RyKSwgJmV3 b3JkLCAmY2hhcmxlbikpICE9IE5VTEwpCi0JeworCQkvKiBFeHRyYWN0IG5leHQgd29yZCAq LworCQl3aGlsZSAoaSA8IHNsZW4pCisJCXsKKwkJCWlmICgoc3RyW2ldICYgMHg4MCkgPT0g MCkgLyogRmFzdCBwYXRoIGZvciBBU0NJSS1vbmx5ICovCisJCQl7CisJCQkJaWYgKGlzYWxu dW0oc3RyW2ldKSkKKwkJCQl7CiAjaWZkZWYgSUdOT1JFQ0FTRQotCQlid29yZCA9IHN0cl90 b2xvd2VyKGJ3b3JkLCBld29yZCAtIGJ3b3JkLCBERUZBVUxUX0NPTExBVElPTl9PSUQpOwot CQlieXRlbGVuID0gc3RybGVuKGJ3b3JkKTsKKwkJCQkJYnVmW251bV9ieXRlcysrXSA9IHBn X2FzY2lpX3RvbG93ZXIoc3RyW2krK10pOwogI2Vsc2UKLQkJYnl0ZWxlbiA9IGV3b3JkIC0g YndvcmQ7CisJCQkJCWJ1ZltudW1fYnl0ZXMrK10gPSBzdHJbaSsrXTsKICNlbmRpZgorCQkJ CX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpKys7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJ CX0KKwkJCWVsc2UgCisJCQl7CisJCQkJY29uc3QgaW50IG1ibGVuID0gcGdfbWJsZW4oc3Ry ICsgaSk7CisJCQkJQXNzZXJ0KG1ibGVuID49IDIpOyAvKiBPdGhlcndpc2UsIGl0IHdvdWxk IGJlIEFTQ0lJICovCisKKwkJCQlpZiAoSVNXT1JEQ0hSKHN0ciArIGkpKQorCQkJCXsKKwkJ CQkJbWVtY3B5KGJ1ZiArIG51bV9ieXRlcywgc3RyICsgaSwgbWJsZW4pOworCQkJCQludW1f Ynl0ZXMgKz0gbWJsZW47CisJCQkJCWkgKz0gbWJsZW47CisJCQkJfQorCQkJCWVsc2UKKwkJ CQl7CisJCQkJCWkgKz0gbWJsZW47CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJ bnVtX2NoYXJzKys7CisJCX0KIAotCQltZW1jcHkoYnVmICsgTFBBRERJTkcsIGJ3b3JkLCBi eXRlbGVuKTsKKwkJaWYgKG51bV9jaGFycyA+IExQQURESU5HKQorCQl7CisJCQltZW1zZXQo YnVmICsgbnVtX2J5dGVzLCAnICcsIFJQQURESU5HKTsKKwkJCW51bV9ieXRlcyArPSBSUEFE RElORzsKKwkJCW51bV9jaGFycyArPSBSUEFERElORzsKKwkJCXdvcmQgPSBidWY7CiAKICNp ZmRlZiBJR05PUkVDQVNFCi0JCXBmcmVlKGJ3b3JkKTsKKwkJCWlmIChudW1fY2hhcnMgIT0g bnVtX2J5dGVzKQorCQkJeworCQkJCXdvcmQgPSBzdHJfdG9sb3dlcihidWYsIG51bV9ieXRl cywgREVGQVVMVF9DT0xMQVRJT05fT0lEKTsKKwkJCQludW1fYnl0ZXMgPSBzdHJsZW4od29y ZCk7IC8qIFN0cmluZyBjYW4gZ2V0IHNob3J0ZXIgZnJvbSBsb3dlci1jYXNpbmcgKi8KKwkJ CX0KICNlbmRpZgogCi0JCWJ1ZltMUEFERElORyArIGJ5dGVsZW5dID0gJyAnOwotCQlidWZb TFBBRERJTkcgKyBieXRlbGVuICsgMV0gPSAnICc7CisJCQlpZiAoYm91bmRzKQorCQkJCWJv dW5kc1t0cHRyIC0gdHJnXSB8PSBUUkdNX0JPVU5EX0xFRlQ7CisKKwkJCXRwdHIgPSBtYWtl X3RyaWdyYW1zKHRwdHIsIHdvcmQsIG51bV9ieXRlcywgbnVtX2NoYXJzKTsKKworCQkJaWYg KGJvdW5kcykKKwkJCQlib3VuZHNbdHB0ciAtIHRyZyAtIDFdIHw9IFRSR01fQk9VTkRfUklH SFQ7CiAKLQkJLyogQ2FsY3VsYXRlIHRyaWdyYW1zIG1hcmtpbmcgdGhlaXIgYm91bmRzIGlm IG5lZWRlZCAqLwotCQlpZiAoYm91bmRzKQotCQkJYm91bmRzW3RwdHIgLSB0cmddIHw9IFRS R01fQk9VTkRfTEVGVDsKLQkJdHB0ciA9IG1ha2VfdHJpZ3JhbXModHB0ciwgYnVmLCBieXRl bGVuICsgTFBBRERJTkcgKyBSUEFERElORywKLQkJCQkJCQkgY2hhcmxlbiArIExQQURESU5H ICsgUlBBRERJTkcpOwotCQlpZiAoYm91bmRzKQotCQkJYm91bmRzW3RwdHIgLSB0cmcgLSAx XSB8PSBUUkdNX0JPVU5EX1JJR0hUOworCQkJaWYgKHdvcmQgIT0gYnVmKQorCQkJCXBmcmVl KHdvcmQpOworCQl9CiAJfQogCiAJcGZyZWUoYnVmKTsKLQogCXJldHVybiB0cHRyIC0gdHJn OwogfQogCi0tIAoyLjUxLjAKCg== --------------IhN4GcT9sRwrhtqlqHgdqwZh Content-Type: text/x-patch; charset=UTF-8; name="v1-0007-Faster-qunique-comparator.patch" Content-Disposition: attachment; filename="v1-0007-Faster-qunique-comparator.patch" Content-Transfer-Encoding: base64 RnJvbSA0ZDEwMTcyNWE2MTAxZDcyMzg1OGQ1Yjc1NjFmZjFjZWYxMjNmNjcxIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBHZWllciA8Z2VpZGF2LnBnQGdtYWlsLmNv bT4KRGF0ZTogV2VkLCAxMiBOb3YgMjAyNSAxNDoyNzoxMyArMDEwMApTdWJqZWN0OiBbUEFU Q0ggdjEgNy84XSBGYXN0ZXIgcXVuaXF1ZSgpIGNvbXBhcmF0b3IKCi0tLQogY29udHJpYi9w Z190cmdtL3RyZ21fb3AuYyB8IDI0ICsrKysrKysrKysrKy0tLS0tLS0tLS0tLQogMSBmaWxl IGNoYW5nZWQsIDEyIGluc2VydGlvbnMoKyksIDEyIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdp dCBhL2NvbnRyaWIvcGdfdHJnbS90cmdtX29wLmMgYi9jb250cmliL3BnX3RyZ20vdHJnbV9v cC5jCmluZGV4IDI1ZWUwNDlmMzUyLi5lMDdjNTUzYjFiZCAxMDA2NDQKLS0tIGEvY29udHJp Yi9wZ190cmdtL3RyZ21fb3AuYworKysgYi9jb250cmliL3BnX3RyZ20vdHJnbV9vcC5jCkBA IC0xMzksNiArMTM5LDE0IEBAIENNUFRSR01fVU5TSUdORUQoY29uc3Qgdm9pZCAqYSwgY29u c3Qgdm9pZCAqYikKIAkJICAgOiBDTVBQQ0hBUl9VTlMoYSwgYiwgMikpOwogfQogCitzdGF0 aWMgaW5saW5lIGludAorQ01QVFJHTV9FUShjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpi KQoreworCWNoYXIgKmFhID0gKGNoYXIgKilhOworCWNoYXIgKmJiID0gKGNoYXIgKiliOwor CXJldHVybiBhYVswXSAhPSBiYlswXSB8fCBhYVsxXSAhPSBiYlsxXSB8fCBhYVsyXSAhPSBi YlsyXSA/IDEgOiAwOworfQorCiAvKgogICogVGhpcyBnZXRzIGNhbGxlZCBvbiB0aGUgZmly c3QgY2FsbC4gSXQgcmVwbGFjZXMgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgc28KICAqIHRoYXQg c3Vic2VxdWVudCBjYWxscyBhcmUgcm91dGVkIGRpcmVjdGx5IHRvIHRoZSBjaG9zZW4gaW1w bGVtZW50YXRpb24uCkBAIC00ODIsMTUgKzQ5MCwxMSBAQCBnZW5lcmF0ZV90cmdtKGNoYXIg KnN0ciwgaW50IHNsZW4pCiAJaWYgKGxlbiA+IDEpCiAJewogCQlpZiAoR2V0RGVmYXVsdENo YXJTaWduZWRuZXNzKCkpCi0JCXsKIAkJCXJhZGl4X3NvcnRfdHJpZ3JhbXNfc2lnbmVkKCh0 cmdtICopR0VUQVJSKHRyZyksIGxlbik7Ci0JCQlsZW4gPSBxdW5pcXVlKEdFVEFSUih0cmcp LCBsZW4sIHNpemVvZih0cmdtKSwgQ01QVFJHTV9TSUdORUQpOwotCQl9CiAJCWVsc2UKLQkJ ewogCQkJdHJpZ3JhbV9xc29ydF91bnNpZ25lZCgodm9pZCAqKSBHRVRBUlIodHJnKSwgbGVu LCBzaXplb2YodHJnbSkpOwotCQkJbGVuID0gcXVuaXF1ZShHRVRBUlIodHJnKSwgbGVuLCBz aXplb2YodHJnbSksIENNUFRSR01fVU5TSUdORUQpOwotCQl9CisKKwkJbGVuID0gcXVuaXF1 ZShHRVRBUlIodHJnKSwgbGVuLCBzaXplb2YodHJnbSksIENNUFRSR01fRVEpOwogCX0KIAog CVNFVF9WQVJTSVpFKHRyZywgQ0FMQ0dUU0laRShBUlJLRVksIGxlbikpOwpAQCAtMTAzOCwx NSArMTA0MiwxMSBAQCBnZW5lcmF0ZV93aWxkY2FyZF90cmdtKGNvbnN0IGNoYXIgKnN0ciwg aW50IHNsZW4pCiAJaWYgKGxlbiA+IDEpCiAJewogCQlpZiAoR2V0RGVmYXVsdENoYXJTaWdu ZWRuZXNzKCkpCi0JCXsKIAkJCXJhZGl4X3NvcnRfdHJpZ3JhbXNfc2lnbmVkKCh0cmdtICop R0VUQVJSKHRyZyksIGxlbik7Ci0JCQlsZW4gPSBxdW5pcXVlKEdFVEFSUih0cmcpLCBsZW4s IHNpemVvZih0cmdtKSwgQ01QVFJHTV9TSUdORUQpOwotCQl9CiAJCWVsc2UKLQkJewogCQkJ dHJpZ3JhbV9xc29ydF91bnNpZ25lZCgodm9pZCAqKSBHRVRBUlIodHJnKSwgbGVuLCBzaXpl b2YodHJnbSkpOwotCQkJbGVuID0gcXVuaXF1ZShHRVRBUlIodHJnKSwgbGVuLCBzaXplb2Yo dHJnbSksIENNUFRSR01fVU5TSUdORUQpOwotCQl9CisKKwkJbGVuID0gcXVuaXF1ZShHRVRB UlIodHJnKSwgbGVuLCBzaXplb2YodHJnbSksIENNUFRSR01fRVEpOwogCX0KIAogCVNFVF9W QVJTSVpFKHRyZywgQ0FMQ0dUU0laRShBUlJLRVksIGxlbikpOwotLSAKMi41MS4wCgo= --------------IhN4GcT9sRwrhtqlqHgdqwZh Content-Type: text/x-patch; charset=UTF-8; name="v1-0006-Use-radix-sort.patch" Content-Disposition: attachment; filename="v1-0006-Use-radix-sort.patch" Content-Transfer-Encoding: base64 RnJvbSA2MTQ4YjRiYmM3MDJlYjRjZTg5OTk0ZjNhYTQ3OTBkZWY1MGVkMGM1IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBHZWllciA8Z2VpZGF2LnBnQGdtYWlsLmNv bT4KRGF0ZTogVHVlLCAxMSBOb3YgMjAyNSAxMzoxODo1OSArMDEwMApTdWJqZWN0OiBbUEFU Q0ggdjEgNi84XSBVc2UgcmFkaXggc29ydAoKLS0tCiBjb250cmliL3BnX3RyZ20vdHJnbV9v cC5jIHwgNjQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tCiAxIGZp bGUgY2hhbmdlZCwgNTQgaW5zZXJ0aW9ucygrKSwgMTAgZGVsZXRpb25zKC0pCgpkaWZmIC0t Z2l0IGEvY29udHJpYi9wZ190cmdtL3RyZ21fb3AuYyBiL2NvbnRyaWIvcGdfdHJnbS90cmdt X29wLmMKaW5kZXggODc1MDY1YTQ2NzAuLjI1ZWUwNDlmMzUyIDEwMDY0NAotLS0gYS9jb250 cmliL3BnX3RyZ20vdHJnbV9vcC5jCisrKyBiL2NvbnRyaWIvcGdfdHJnbS90cmdtX29wLmMK QEAgLTE1NSwxNCArMTU1LDYgQEAgQ01QVFJHTV9DSE9PU0UoY29uc3Qgdm9pZCAqYSwgY29u c3Qgdm9pZCAqYikKIH0KIAogLyogRGVmaW5lIG91ciBzcGVjaWFsaXplZCBzb3J0IGZ1bmN0 aW9uIG5hbWUgKi8KLSNkZWZpbmUgU1RfU09SVCB0cmlncmFtX3Fzb3J0X3NpZ25lZAotI2Rl ZmluZSBTVF9FTEVNRU5UX1RZUEVfVk9JRAotI2RlZmluZSBTVF9DT01QQVJFKGEsIGIpIENN UFRSR01fU0lHTkVEKGEsIGIpCi0jZGVmaW5lIFNUX1NDT1BFIHN0YXRpYwotI2RlZmluZSBT VF9ERUZJTkUKLSNkZWZpbmUgU1RfREVDTEFSRQotI2luY2x1ZGUgImxpYi9zb3J0X3RlbXBs YXRlLmgiCi0KICNkZWZpbmUgU1RfU09SVCB0cmlncmFtX3Fzb3J0X3Vuc2lnbmVkCiAjZGVm aW5lIFNUX0VMRU1FTlRfVFlQRV9WT0lECiAjZGVmaW5lIFNUX0NPTVBBUkUoYSwgYikgQ01Q VFJHTV9VTlNJR05FRChhLCBiKQpAQCAtMzkyLDYgKzM4NCw1OCBAQCBnZW5lcmF0ZV90cmdt X29ubHkodHJnbSAqdHJnLCBjaGFyICpzdHIsIGludCBzbGVuLCBUcmdtQm91bmQgKmJvdW5k cykKIAlyZXR1cm4gdHB0ciAtIHRyZzsKIH0KIAorLyoKKyAqIE5lZWRlZCB0byBwcm9wZXJs eSBoYW5kbGUgbmVnYXRpdmUgbnVtYmVycyBpbiBjYXNlIGNoYXIgaXMgc2lnbmVkLgorICov CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgRmxpcFNpZ24oY2hhciB4KQoreworCXJl dHVybiB4XjB4ODA7Cit9CisKK3N0YXRpYyB2b2lkIHJhZGl4X3NvcnRfdHJpZ3JhbXNfc2ln bmVkKHRyZ20gKnRyZywgaW50IGNvdW50KQoreworCXRyZ20gKmJ1ZmZlciA9IHBhbGxvY19h cnJheSh0cmdtLCBjb3VudCk7CisJdHJnbSAqc3RhcnRzWzI1Nl07CisJdHJnbSAqZnJvbSA9 IHRyZzsKKwl0cmdtICp0byA9IGJ1ZmZlcjsKKwlpbnQgZnJlcXNbM11bMjU2XTsKKworCS8q CisJICogQ29tcHV0ZSBmcmVxdWVuY2llcyB0byBwYXJ0aXRpb24gdGhlIGJ1ZmZlci4KKwkg Ki8KKwltZW1zZXQoZnJlcXMsIDAsIHNpemVvZihmcmVxcykpOworCisJZm9yIChpbnQgaT0w OyBpPGNvdW50OyBpKyspCisJCWZvciAoaW50IGo9MDsgajwzOyBqKyspCisJCQlmcmVxc1tq XVtGbGlwU2lnbih0cmdbaV1bal0pXSsrOworCisJLyoKKwkgKiBEbyB0aGUgc29ydGluZy4g U3RhcnQgd2l0aCBsYXN0IGNoYXJhY3RlciBiZWNhdXNlIHRoYXQncyB0aGUgaXMgIkxTQiIK KwkgKiBpbiBhIHRyaWdyYW0uIEF2b2lkIHVubmVjZXNzYXJ5IGNvcGllcyBieSBwaW5nLXBv bmdpbmcgYmV0d2VlbiB0aGUgYnVmZmVycy4KKwkgKi8KKwlmb3IgKGludCBpPTI7IGk+PTA7 IGktLSkKKwl7CisJCXRyZ20gKm9sZF9mcm9tID0gZnJvbTsKKwkJdHJnbSAqbmV4dCA9IHRv OworCisJCWZvciAoaW50IGo9MDsgajwyNTY7IGorKykKKwkJeworCQkJc3RhcnRzW2pdID0g bmV4dDsKKwkJCW5leHQgKz0gZnJlcXNbaV1bal07CisJCX0KKworCQlmb3IgKGludCBqPTA7 IGo8Y291bnQ7IGorKykKKwkJCW1lbWNweShzdGFydHNbRmxpcFNpZ24oZnJvbVtqXVtpXSld KyssIGZyb21bal0sIHNpemVvZih0cmdtKSk7CisKKwkJZnJvbSA9IHRvOworCQl0byA9IG9s ZF9mcm9tOworCX0KKworCUFzc2VydCh0byA9PSBidWZmZXIpOworCW1lbWNweSh0cmcsIGJ1 ZmZlciwgc2l6ZW9mKHRyZ20pICogY291bnQpOworCXBmcmVlKGJ1ZmZlcik7Cit9CisKIC8q CiAgKiBHdWFyZCBhZ2FpbnN0IHBvc3NpYmxlIG92ZXJmbG93IGluIHRoZSBwYWxsb2MgcmVx dWVzdHMgYmVsb3cuICAoV2UKICAqIGRvbid0IHdvcnJ5IGFib3V0IHRoZSBhZGRpdGl2ZSBj b25zdGFudHMsIHNpbmNlIHBhbGxvYyBjYW4gZGV0ZWN0CkBAIC00MzksNyArNDgzLDcgQEAg Z2VuZXJhdGVfdHJnbShjaGFyICpzdHIsIGludCBzbGVuKQogCXsKIAkJaWYgKEdldERlZmF1 bHRDaGFyU2lnbmVkbmVzcygpKQogCQl7Ci0JCQl0cmlncmFtX3Fzb3J0X3NpZ25lZCgodm9p ZCAqKSBHRVRBUlIodHJnKSwgbGVuLCBzaXplb2YodHJnbSkpOworCQkJcmFkaXhfc29ydF90 cmlncmFtc19zaWduZWQoKHRyZ20gKilHRVRBUlIodHJnKSwgbGVuKTsKIAkJCWxlbiA9IHF1 bmlxdWUoR0VUQVJSKHRyZyksIGxlbiwgc2l6ZW9mKHRyZ20pLCBDTVBUUkdNX1NJR05FRCk7 CiAJCX0KIAkJZWxzZQpAQCAtOTk1LDcgKzEwMzksNyBAQCBnZW5lcmF0ZV93aWxkY2FyZF90 cmdtKGNvbnN0IGNoYXIgKnN0ciwgaW50IHNsZW4pCiAJewogCQlpZiAoR2V0RGVmYXVsdENo YXJTaWduZWRuZXNzKCkpCiAJCXsKLQkJCXRyaWdyYW1fcXNvcnRfc2lnbmVkKCh2b2lkICop IEdFVEFSUih0cmcpLCBsZW4sIHNpemVvZih0cmdtKSk7CisJCQlyYWRpeF9zb3J0X3RyaWdy YW1zX3NpZ25lZCgodHJnbSAqKUdFVEFSUih0cmcpLCBsZW4pOwogCQkJbGVuID0gcXVuaXF1 ZShHRVRBUlIodHJnKSwgbGVuLCBzaXplb2YodHJnbSksIENNUFRSR01fU0lHTkVEKTsKIAkJ fQogCQllbHNlCi0tIAoyLjUxLjAKCg== --------------IhN4GcT9sRwrhtqlqHgdqwZh Content-Type: text/x-patch; charset=UTF-8; name="v1-0005-Make-btint4cmp-branchless.patch" Content-Disposition: attachment; filename="v1-0005-Make-btint4cmp-branchless.patch" Content-Transfer-Encoding: base64 RnJvbSA5MTViZDMyNmRlNWViZGU0MTQ5MDkzZDUyZmZmOWM3MTBlNTU3ZGUyIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBHZWllciA8Z2VpZGF2LnBnQGdtYWlsLmNv bT4KRGF0ZTogTW9uLCAxMCBOb3YgMjAyNSAxNTo0MDoxMSArMDEwMApTdWJqZWN0OiBbUEFU Q0ggdjEgNS84XSBNYWtlIGJ0aW50NGNtcCgpIGJyYW5jaGxlc3MKCi0tLQogc3JjL2JhY2tl bmQvYWNjZXNzL25idHJlZS9uYnRjb21wYXJlLmMgfCA4ICsrLS0tLS0tCiAxIGZpbGUgY2hh bmdlZCwgMiBpbnNlcnRpb25zKCspLCA2IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3Ny Yy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0Y29tcGFyZS5jIGIvc3JjL2JhY2tlbmQvYWNj ZXNzL25idHJlZS9uYnRjb21wYXJlLmMKaW5kZXggYmZmYzRiNzcwOWMuLjVhZTI3YzIyNjIx IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idGNvbXBhcmUuYwor KysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idGNvbXBhcmUuYwpAQCAtNjAsNiAr NjAsNyBAQAogI2luY2x1ZGUgInV0aWxzL2ZtZ3Jwcm90b3MuaCIKICNpbmNsdWRlICJ1dGls cy9za2lwc3VwcG9ydC5oIgogI2luY2x1ZGUgInV0aWxzL3NvcnRzdXBwb3J0LmgiCisjaW5j bHVkZSAiY29tbW9uL2ludC5oIgogCiAjaWZkZWYgU1RSRVNTX1NPUlRfSU5UX01JTgogI2Rl ZmluZSBBX0xFU1NfVEhBTl9CCQlJTlRfTUlOCkBAIC0yMDIsMTIgKzIwMyw3IEBAIGJ0aW50 NGNtcChQR19GVU5DVElPTl9BUkdTKQogCWludDMyCQlhID0gUEdfR0VUQVJHX0lOVDMyKDAp OwogCWludDMyCQliID0gUEdfR0VUQVJHX0lOVDMyKDEpOwogCi0JaWYgKGEgPiBiKQotCQlQ R19SRVRVUk5fSU5UMzIoQV9HUkVBVEVSX1RIQU5fQik7Ci0JZWxzZSBpZiAoYSA9PSBiKQot CQlQR19SRVRVUk5fSU5UMzIoMCk7Ci0JZWxzZQotCQlQR19SRVRVUk5fSU5UMzIoQV9MRVNT X1RIQU5fQik7CisJUEdfUkVUVVJOX0lOVDMyKHBnX2NtcF9zMzIoYSwgYikpOwogfQogCiBE YXR1bQotLSAKMi41MS4wCgo= --------------IhN4GcT9sRwrhtqlqHgdqwZh Content-Type: text/x-patch; charset=UTF-8; name="v1-0004-Avoid-dedup-and-sort-in-ginExtractEntries.patch" Content-Disposition: attachment; filename="v1-0004-Avoid-dedup-and-sort-in-ginExtractEntries.patch" Content-Transfer-Encoding: base64 RnJvbSBlOTExOTg3MzBkMTBkMzAxODU3YjFlZjM4NjcwZjUwNmZjMDc0OWNhIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBHZWllciA8Z2VpZGF2LnBnQGdtYWlsLmNv bT4KRGF0ZTogTW9uLCAxMCBOb3YgMjAyNSAxNDo0MDozNyArMDEwMApTdWJqZWN0OiBbUEFU Q0ggdjEgNC84XSBBdm9pZCBkZWR1cCBhbmQgc29ydCBpbiBnaW5FeHRyYWN0RW50cmllcwoK LS0tCiBzcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbnV0aWwuYyB8IDIxICsrKysrKysrKy0t LS0tLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMTIgZGVsZXRp b25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9naW51dGlsLmMg Yi9zcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbnV0aWwuYwppbmRleCBmNDEzOWVmZmQ2ZS4u OTE4NzI2NGRiZGMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2ludXRp bC5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2ludXRpbC5jCkBAIC00OTgsMTMg KzQ5OCw2IEBAIGdpbkV4dHJhY3RFbnRyaWVzKEdpblN0YXRlICpnaW5zdGF0ZSwgT2Zmc2V0 TnVtYmVyIGF0dG51bSwKIAkJcmV0dXJuIGVudHJpZXM7CiAJfQogCi0JLyoKLQkgKiBJZiB0 aGUgZXh0cmFjdFZhbHVlRm4gZGlkbid0IGNyZWF0ZSBhIG51bGxGbGFncyBhcnJheSwgY3Jl YXRlIG9uZSwKLQkgKiBhc3N1bWluZyB0aGF0IGV2ZXJ5dGhpbmcncyBub24tbnVsbC4KLQkg Ki8KLQlpZiAobnVsbEZsYWdzID09IE5VTEwpCi0JCW51bGxGbGFncyA9IChib29sICopIHBh bGxvYzAoKm5lbnRyaWVzICogc2l6ZW9mKGJvb2wpKTsKLQogCS8qCiAJICogSWYgdGhlcmUn cyBtb3JlIHRoYW4gb25lIGtleSwgc29ydCBhbmQgdW5pcXVlLWlmeS4KIAkgKgpAQCAtNTEy LDggKzUwNSw4IEBAIGdpbkV4dHJhY3RFbnRyaWVzKEdpblN0YXRlICpnaW5zdGF0ZSwgT2Zm c2V0TnVtYmVyIGF0dG51bSwKIAkgKiBwcmV0dHkgYmFkIHRvby4gIEZvciBzbWFsbCBudW1i ZXJzIG9mIGtleXMgaXQnZCBsaWtlbHkgYmUgYmV0dGVyIHRvIHVzZQogCSAqIGEgc2ltcGxl IGluc2VydGlvbiBzb3J0LgogCSAqLwotCWlmICgqbmVudHJpZXMgPiAxKQotCXsKKwlpZiAo Km5lbnRyaWVzID4gMSAmJiBudWxsRmxhZ3MgIT0gTlVMTCkKKwl7CQogCQlrZXlFbnRyeURh dGEgKmtleWRhdGE7CiAJCWNtcEVudHJpZXNBcmcgYXJnOwogCkBAIC01NjQsOSArNTU3LDEz IEBAIGdpbkV4dHJhY3RFbnRyaWVzKEdpblN0YXRlICpnaW5zdGF0ZSwgT2Zmc2V0TnVtYmVy IGF0dG51bSwKIAkvKgogCSAqIENyZWF0ZSBHaW5OdWxsQ2F0ZWdvcnkgcmVwcmVzZW50YXRp b24gZnJvbSBudWxsRmxhZ3MuCiAJICovCi0JKmNhdGVnb3JpZXMgPSAoR2luTnVsbENhdGVn b3J5ICopIHBhbGxvYzAoKm5lbnRyaWVzICogc2l6ZW9mKEdpbk51bGxDYXRlZ29yeSkpOwot CWZvciAoaSA9IDA7IGkgPCAqbmVudHJpZXM7IGkrKykKLQkJKCpjYXRlZ29yaWVzKVtpXSA9 IChudWxsRmxhZ3NbaV0gPyBHSU5fQ0FUX05VTExfS0VZIDogR0lOX0NBVF9OT1JNX0tFWSk7 CisJU3RhdGljQXNzZXJ0U3RtdChHSU5fQ0FUX05PUk1fS0VZID09IDAsICJBc3N1bWluZyBH SU5fQ0FUX05PUk1fS0VZIGlzIDAiKTsKKwkqY2F0ZWdvcmllcyA9IHBhbGxvYzBfYXJyYXko R2luTnVsbENhdGVnb3J5LCAqbmVudHJpZXMpOworCisJaWYgKG51bGxGbGFncyAhPSBOVUxM KQorCQlmb3IgKGkgPSAwOyBpIDwgKm5lbnRyaWVzOyBpKyspCisJCQlpZiAobnVsbEZsYWdz W2ldKQorCQkJCSgqY2F0ZWdvcmllcylbaV0gPSBHSU5fQ0FUX05VTExfS0VZOwogCiAJcmV0 dXJuIGVudHJpZXM7CiB9Ci0tIAoyLjUxLjAKCg== --------------IhN4GcT9sRwrhtqlqHgdqwZh Content-Type: text/x-patch; charset=UTF-8; name="v1-0003-Use-sort_template.h.patch" Content-Disposition: attachment; filename="v1-0003-Use-sort_template.h.patch" Content-Transfer-Encoding: base64 RnJvbSA1YTViM2I5NTVmZmZhYzRiYWYyZWExMzY3OTE0Y2U4N2E2ZjhiZjVhIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBHZWllciA8Z2VpZGF2LnBnQGdtYWlsLmNv bT4KRGF0ZTogTW9uLCAxMCBOb3YgMjAyNSAxMzozNToxMSArMDEwMApTdWJqZWN0OiBbUEFU Q0ggdjEgMy84XSBVc2Ugc29ydF90ZW1wbGF0ZS5oCgotLS0KIGNvbnRyaWIvcGdfdHJnbS90 cmdtX29wLmMgfCA0OSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0K IDEgZmlsZSBjaGFuZ2VkLCAzOCBpbnNlcnRpb25zKCspLCAxMSBkZWxldGlvbnMoLSkKCmRp ZmYgLS1naXQgYS9jb250cmliL3BnX3RyZ20vdHJnbV9vcC5jIGIvY29udHJpYi9wZ190cmdt L3RyZ21fb3AuYwppbmRleCA4MTE4MmExNWUwNy4uODc1MDY1YTQ2NzAgMTAwNjQ0Ci0tLSBh L2NvbnRyaWIvcGdfdHJnbS90cmdtX29wLmMKKysrIGIvY29udHJpYi9wZ190cmdtL3RyZ21f b3AuYwpAQCAtMTU0LDYgKzE1NCwyMyBAQCBDTVBUUkdNX0NIT09TRShjb25zdCB2b2lkICph LCBjb25zdCB2b2lkICpiKQogCXJldHVybiBDTVBUUkdNKGEsIGIpOwogfQogCisvKiBEZWZp bmUgb3VyIHNwZWNpYWxpemVkIHNvcnQgZnVuY3Rpb24gbmFtZSAqLworI2RlZmluZSBTVF9T T1JUIHRyaWdyYW1fcXNvcnRfc2lnbmVkCisjZGVmaW5lIFNUX0VMRU1FTlRfVFlQRV9WT0lE CisjZGVmaW5lIFNUX0NPTVBBUkUoYSwgYikgQ01QVFJHTV9TSUdORUQoYSwgYikKKyNkZWZp bmUgU1RfU0NPUEUgc3RhdGljCisjZGVmaW5lIFNUX0RFRklORQorI2RlZmluZSBTVF9ERUNM QVJFCisjaW5jbHVkZSAibGliL3NvcnRfdGVtcGxhdGUuaCIKKworI2RlZmluZSBTVF9TT1JU IHRyaWdyYW1fcXNvcnRfdW5zaWduZWQKKyNkZWZpbmUgU1RfRUxFTUVOVF9UWVBFX1ZPSUQK KyNkZWZpbmUgU1RfQ09NUEFSRShhLCBiKSBDTVBUUkdNX1VOU0lHTkVEKGEsIGIpCisjZGVm aW5lIFNUX1NDT1BFIHN0YXRpYworI2RlZmluZSBTVF9ERUZJTkUKKyNkZWZpbmUgU1RfREVD TEFSRQorI2luY2x1ZGUgImxpYi9zb3J0X3RlbXBsYXRlLmgiCisKIC8qCiAgKiBEZXByZWNh dGVkIGZ1bmN0aW9uLgogICogVXNlICJwZ190cmdtLnNpbWlsYXJpdHlfdGhyZXNob2xkIiBH VUMgdmFyaWFibGUgaW5zdGVhZCBvZiB0aGlzIGZ1bmN0aW9uLgpAQCAtMjA5LDEyICsyMjYs NiBAQCBzaG93X2xpbWl0KFBHX0ZVTkNUSU9OX0FSR1MpCiAJUEdfUkVUVVJOX0ZMT0FUNChz aW1pbGFyaXR5X3RocmVzaG9sZCk7CiB9CiAKLXN0YXRpYyBpbnQKLWNvbXBfdHJnbShjb25z dCB2b2lkICphLCBjb25zdCB2b2lkICpiKQotewotCXJldHVybiBDTVBUUkdNKGEsIGIpOwot fQotCiAvKgogICogRmluZHMgZmlyc3Qgd29yZCBpbiBzdHJpbmcsIHJldHVybnMgcG9pbnRl ciB0byB0aGUgd29yZCwKICAqIGVuZHdvcmQgcG9pbnRzIHRvIHRoZSBjaGFyYWN0ZXIgYWZ0 ZXIgd29yZApAQCAtNDI2LDEyICs0MzcsMjAgQEAgZ2VuZXJhdGVfdHJnbShjaGFyICpzdHIs IGludCBzbGVuKQogCSAqLwogCWlmIChsZW4gPiAxKQogCXsKLQkJcXNvcnQoR0VUQVJSKHRy ZyksIGxlbiwgc2l6ZW9mKHRyZ20pLCBjb21wX3RyZ20pOwotCQlsZW4gPSBxdW5pcXVlKEdF VEFSUih0cmcpLCBsZW4sIHNpemVvZih0cmdtKSwgY29tcF90cmdtKTsKKwkJaWYgKEdldERl ZmF1bHRDaGFyU2lnbmVkbmVzcygpKQorCQl7CisJCQl0cmlncmFtX3Fzb3J0X3NpZ25lZCgo dm9pZCAqKSBHRVRBUlIodHJnKSwgbGVuLCBzaXplb2YodHJnbSkpOworCQkJbGVuID0gcXVu aXF1ZShHRVRBUlIodHJnKSwgbGVuLCBzaXplb2YodHJnbSksIENNUFRSR01fU0lHTkVEKTsK KwkJfQorCQllbHNlCisJCXsKKwkJCXRyaWdyYW1fcXNvcnRfdW5zaWduZWQoKHZvaWQgKikg R0VUQVJSKHRyZyksIGxlbiwgc2l6ZW9mKHRyZ20pKTsKKwkJCWxlbiA9IHF1bmlxdWUoR0VU QVJSKHRyZyksIGxlbiwgc2l6ZW9mKHRyZ20pLCBDTVBUUkdNX1VOU0lHTkVEKTsKKwkJfQog CX0KIAogCVNFVF9WQVJTSVpFKHRyZywgQ0FMQ0dUU0laRShBUlJLRVksIGxlbikpOwotCisg CiAJcmV0dXJuIHRyZzsKIH0KIApAQCAtOTc0LDggKzk5MywxNiBAQCBnZW5lcmF0ZV93aWxk Y2FyZF90cmdtKGNvbnN0IGNoYXIgKnN0ciwgaW50IHNsZW4pCiAJICovCiAJaWYgKGxlbiA+ IDEpCiAJewotCQlxc29ydChHRVRBUlIodHJnKSwgbGVuLCBzaXplb2YodHJnbSksIGNvbXBf dHJnbSk7Ci0JCWxlbiA9IHF1bmlxdWUoR0VUQVJSKHRyZyksIGxlbiwgc2l6ZW9mKHRyZ20p LCBjb21wX3RyZ20pOworCQlpZiAoR2V0RGVmYXVsdENoYXJTaWduZWRuZXNzKCkpCisJCXsK KwkJCXRyaWdyYW1fcXNvcnRfc2lnbmVkKCh2b2lkICopIEdFVEFSUih0cmcpLCBsZW4sIHNp emVvZih0cmdtKSk7CisJCQlsZW4gPSBxdW5pcXVlKEdFVEFSUih0cmcpLCBsZW4sIHNpemVv Zih0cmdtKSwgQ01QVFJHTV9TSUdORUQpOworCQl9CisJCWVsc2UKKwkJeworCQkJdHJpZ3Jh bV9xc29ydF91bnNpZ25lZCgodm9pZCAqKSBHRVRBUlIodHJnKSwgbGVuLCBzaXplb2YodHJn bSkpOworCQkJbGVuID0gcXVuaXF1ZShHRVRBUlIodHJnKSwgbGVuLCBzaXplb2YodHJnbSks IENNUFRSR01fVU5TSUdORUQpOworCQl9CiAJfQogCiAJU0VUX1ZBUlNJWkUodHJnLCBDQUxD R1RTSVpFKEFSUktFWSwgbGVuKSk7Ci0tIAoyLjUxLjAKCg== --------------IhN4GcT9sRwrhtqlqHgdqwZh Content-Type: text/x-patch; charset=UTF-8; name="v1-0002-Optimized-comparison-functions.patch" Content-Disposition: attachment; filename="v1-0002-Optimized-comparison-functions.patch" Content-Transfer-Encoding: base64 RnJvbSBlYjdmZTM3NjNiMzFkMzBkNDhlYmJkNDkzNDA4NWZlNzAzMTUyNDlhIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBHZWllciA8Z2VpZGF2LnBnQGdtYWlsLmNv bT4KRGF0ZTogTW9uLCAxMCBOb3YgMjAyNSAxMzozNTowMSArMDEwMApTdWJqZWN0OiBbUEFU Q0ggdjEgMi84XSBPcHRpbWl6ZWQgY29tcGFyaXNvbiBmdW5jdGlvbnMKCi0tLQogc3JjL2Jh Y2tlbmQvYWNjZXNzL2dpbi9naW51dGlsLmMgfCAxOSArKysrKysrKysrKystLS0tLS0tCiBz cmMvaW5jbHVkZS9hY2Nlc3MvZ2luX3ByaXZhdGUuaCB8IDE5ICsrKysrKysrKysrKysrKy0t LS0KIDIgZmlsZXMgY2hhbmdlZCwgMjcgaW5zZXJ0aW9ucygrKSwgMTEgZGVsZXRpb25zKC0p CgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9naW51dGlsLmMgYi9zcmMv YmFja2VuZC9hY2Nlc3MvZ2luL2dpbnV0aWwuYwppbmRleCBkMjA1MDkzZTIxZC4uZjQxMzll ZmZkNmUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2ludXRpbC5jCisr KyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2ludXRpbC5jCkBAIC0xMTQsNiArMTE0LDcg QEAgaW5pdEdpblN0YXRlKEdpblN0YXRlICpzdGF0ZSwgUmVsYXRpb24gaW5kZXgpCiAJZm9y IChpID0gMDsgaSA8IG9yaWdUdXBkZXNjLT5uYXR0czsgaSsrKQogCXsKIAkJRm9ybV9wZ19h dHRyaWJ1dGUgYXR0ciA9IFR1cGxlRGVzY0F0dHIob3JpZ1R1cGRlc2MsIGkpOworCQlGdW5j dGlvbkNhbGxJbmZvQmFzZURhdGEgKmZjaSAgPSAmc3RhdGUtPmNvbXBhcmVGbkNhbGxJbmZv W2ldLmZjaW5mbzsKIAogCQlpZiAoc3RhdGUtPm9uZUNvbCkKIAkJCXN0YXRlLT50dXBkZXNj W2ldID0gc3RhdGUtPm9yaWdUdXBkZXNjOwpAQCAtMjIyLDYgKzIyMywxMCBAQCBpbml0R2lu U3RhdGUoR2luU3RhdGUgKnN0YXRlLCBSZWxhdGlvbiBpbmRleCkKIAkJCXN0YXRlLT5zdXBw b3J0Q29sbGF0aW9uW2ldID0gaW5kZXgtPnJkX2luZGNvbGxhdGlvbltpXTsKIAkJZWxzZQog CQkJc3RhdGUtPnN1cHBvcnRDb2xsYXRpb25baV0gPSBERUZBVUxUX0NPTExBVElPTl9PSUQ7 CisKKwkJSW5pdEZ1bmN0aW9uQ2FsbEluZm9EYXRhKCpmY2ksICZzdGF0ZS0+Y29tcGFyZUZu W2ldLCAyLCBzdGF0ZS0+c3VwcG9ydENvbGxhdGlvbltpXSwgTlVMTCwgTlVMTCk7CisJCWZj aS0+YXJnc1swXS5pc251bGwgPSBmYWxzZTsKKwkJZmNpLT5hcmdzWzFdLmlzbnVsbCA9IGZh bHNlOwogCX0KIH0KIApAQCAtNDAyLDggKzQwNyw3IEBAIHR5cGVkZWYgc3RydWN0CiAKIHR5 cGVkZWYgc3RydWN0CiB7Ci0JRm1nckluZm8gICAqY21wRGF0dW1GdW5jOwotCU9pZAkJCWNv bGxhdGlvbjsKKwlGdW5jdGlvbkNhbGxJbmZvQmFzZURhdGEgICAqY21wRnVuY0luZm87CiAJ Ym9vbAkJaGF2ZUR1cHM7CiB9IGNtcEVudHJpZXNBcmc7CiAKQEAgLTQyNSw5ICs0MjksMTEg QEAgY21wRW50cmllcyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiLCB2b2lkICphcmcp CiAJZWxzZSBpZiAoYmItPmlzbnVsbCkKIAkJcmVzID0gLTE7CQkJCS8qIG5vdC1OVUxMICI8 IiBOVUxMICovCiAJZWxzZQotCQlyZXMgPSBEYXR1bUdldEludDMyKEZ1bmN0aW9uQ2FsbDJD b2xsKGRhdGEtPmNtcERhdHVtRnVuYywKLQkJCQkJCQkJCQkJICBkYXRhLT5jb2xsYXRpb24s Ci0JCQkJCQkJCQkJCSAgYWEtPmRhdHVtLCBiYi0+ZGF0dW0pKTsKKwl7CisJCWRhdGEtPmNt cEZ1bmNJbmZvLT5hcmdzWzBdLnZhbHVlID0gYWEtPmRhdHVtOworCQlkYXRhLT5jbXBGdW5j SW5mby0+YXJnc1sxXS52YWx1ZSA9IGJiLT5kYXR1bTsKKwkJcmVzID0gRGF0dW1HZXRJbnQz MihGdW5jdGlvbkNhbGxJbnZva2UoZGF0YS0+Y21wRnVuY0luZm8pKTsKKwl9CiAKIAkvKgog CSAqIERldGVjdCBpZiB3ZSBoYXZlIGFueSBkdXBsaWNhdGVzLiAgSWYgdGhlcmUgYXJlIGVx dWFsIGtleXMsIHFzb3J0IG11c3QKQEAgLTUxOCw4ICs1MjQsNyBAQCBnaW5FeHRyYWN0RW50 cmllcyhHaW5TdGF0ZSAqZ2luc3RhdGUsIE9mZnNldE51bWJlciBhdHRudW0sCiAJCQlrZXlk YXRhW2ldLmlzbnVsbCA9IG51bGxGbGFnc1tpXTsKIAkJfQogCi0JCWFyZy5jbXBEYXR1bUZ1 bmMgPSAmZ2luc3RhdGUtPmNvbXBhcmVGblthdHRudW0gLSAxXTsKLQkJYXJnLmNvbGxhdGlv biA9IGdpbnN0YXRlLT5zdXBwb3J0Q29sbGF0aW9uW2F0dG51bSAtIDFdOworCQlhcmcuY21w RnVuY0luZm8gPSAmZ2luc3RhdGUtPmNvbXBhcmVGbkNhbGxJbmZvW2F0dG51bSAtIDFdLmZj aW5mbzsKIAkJYXJnLmhhdmVEdXBzID0gZmFsc2U7CiAJCXFzb3J0X2FyZyhrZXlkYXRhLCAq bmVudHJpZXMsIHNpemVvZihrZXlFbnRyeURhdGEpLAogCQkJCSAgY21wRW50cmllcywgJmFy Zyk7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9hY2Nlc3MvZ2luX3ByaXZhdGUuaCBiL3Ny Yy9pbmNsdWRlL2FjY2Vzcy9naW5fcHJpdmF0ZS5oCmluZGV4IGUxNTUwNDVjZThhLi43Y2Yx OWM4YTVkYyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvYWNjZXNzL2dpbl9wcml2YXRlLmgK KysrIGIvc3JjL2luY2x1ZGUvYWNjZXNzL2dpbl9wcml2YXRlLmgKQEAgLTUxLDYgKzUxLDEx IEBAIHR5cGVkZWYgc3RydWN0IEdpbk9wdGlvbnMKICNkZWZpbmUgR0lOX1NIQVJFCUJVRkZF Ul9MT0NLX1NIQVJFCiAjZGVmaW5lIEdJTl9FWENMVVNJVkUgIEJVRkZFUl9MT0NLX0VYQ0xV U0lWRQogCit0eXBlZGVmIHVuaW9uIENvbXBhcmVGdW5jQ2FsbEluZm9EYXRhCit7CisJRnVu Y3Rpb25DYWxsSW5mb0Jhc2VEYXRhIGZjaW5mbzsKKwljaGFyIGZjaW5mb19kYXRhW1NpemVG b3JGdW5jdGlvbkNhbGxJbmZvKDIpXTsKK30gQ29tcGFyZUZ1bmNDYWxsSW5mb0RhdGE7CiAK IC8qCiAgKiBHaW5TdGF0ZTogd29ya2luZyBkYXRhIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRo ZSBpbmRleCBiZWluZyB3b3JrZWQgb24KQEAgLTc3LDYgKzgyLDEwIEBAIHR5cGVkZWYgc3Ry dWN0IEdpblN0YXRlCiAJLyoKIAkgKiBQZXItaW5kZXgtY29sdW1uIG9wY2xhc3Mgc3VwcG9y dCBmdW5jdGlvbnMKIAkgKi8KKworCisJQ29tcGFyZUZ1bmNDYWxsSW5mb0RhdGEgY29tcGFy ZUZuQ2FsbEluZm9bSU5ERVhfTUFYX0tFWVNdOworCiAJRm1nckluZm8JY29tcGFyZUZuW0lO REVYX01BWF9LRVlTXTsKIAlGbWdySW5mbwlleHRyYWN0VmFsdWVGbltJTkRFWF9NQVhfS0VZ U107CiAJRm1nckluZm8JZXh0cmFjdFF1ZXJ5Rm5bSU5ERVhfTUFYX0tFWVNdOwpAQCAtNTA0 LDYgKzUxMyw4IEBAIGdpbkNvbXBhcmVFbnRyaWVzKEdpblN0YXRlICpnaW5zdGF0ZSwgT2Zm c2V0TnVtYmVyIGF0dG51bSwKIAkJCQkgIERhdHVtIGEsIEdpbk51bGxDYXRlZ29yeSBjYXRl Z29yeWEsCiAJCQkJICBEYXR1bSBiLCBHaW5OdWxsQ2F0ZWdvcnkgY2F0ZWdvcnliKQogewor CUZ1bmN0aW9uQ2FsbEluZm9CYXNlRGF0YSAqZmNpOworCiAJLyogaWYgbm90IG9mIHNhbWUg bnVsbCBjYXRlZ29yeSwgc29ydCBieSB0aGF0IGZpcnN0ICovCiAJaWYgKGNhdGVnb3J5YSAh PSBjYXRlZ29yeWIpCiAJCXJldHVybiAoY2F0ZWdvcnlhIDwgY2F0ZWdvcnliKSA/IC0xIDog MTsKQEAgLTUxMiwxMCArNTIzLDEwIEBAIGdpbkNvbXBhcmVFbnRyaWVzKEdpblN0YXRlICpn aW5zdGF0ZSwgT2Zmc2V0TnVtYmVyIGF0dG51bSwKIAlpZiAoY2F0ZWdvcnlhICE9IEdJTl9D QVRfTk9STV9LRVkpCiAJCXJldHVybiAwOwogCi0JLyogYm90aCBub3QgbnVsbCwgc28gc2Fm ZSB0byBjYWxsIHRoZSBjb21wYXJlRm4gKi8KLQlyZXR1cm4gRGF0dW1HZXRJbnQzMihGdW5j dGlvbkNhbGwyQ29sbCgmZ2luc3RhdGUtPmNvbXBhcmVGblthdHRudW0gLSAxXSwKLQkJCQkJ CQkJCQkgICBnaW5zdGF0ZS0+c3VwcG9ydENvbGxhdGlvblthdHRudW0gLSAxXSwKLQkJCQkJ CQkJCQkgICBhLCBiKSk7CisJZmNpID0gJmdpbnN0YXRlLT5jb21wYXJlRm5DYWxsSW5mb1th dHRudW0gLSAxXS5mY2luZm87CisJZmNpLT5hcmdzWzBdLnZhbHVlID0gYTsKKwlmY2ktPmFy Z3NbMV0udmFsdWUgPSBiOworCXJldHVybiBEYXR1bUdldEludDMyKEZ1bmN0aW9uQ2FsbElu dm9rZShmY2kpKTsKIH0KIAogLyoKLS0gCjIuNTEuMAoK --------------IhN4GcT9sRwrhtqlqHgdqwZh Content-Type: text/x-patch; charset=UTF-8; name="v1-0001-Inline-ginCompareAttEntries.patch" Content-Disposition: attachment; filename="v1-0001-Inline-ginCompareAttEntries.patch" Content-Transfer-Encoding: base64 RnJvbSBhNDg0ZTdjNjliZWM2MjQ3NGIwNDFlYjRlNTMzNjAxZTQ4ODNkYWIzIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBHZWllciA8Z2VpZGF2LnBnQGdtYWlsLmNv bT4KRGF0ZTogVGh1LCA2IE5vdiAyMDI1IDA5OjQyOjI3ICswMTAwClN1YmplY3Q6IFtQQVRD SCB2MSAxLzhdIElubGluZSBnaW5Db21wYXJlQXR0RW50cmllcwoKLS0tCiBzcmMvYmFja2Vu ZC9hY2Nlc3MvZ2luL2dpbnV0aWwuYyB8IDM4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQogc3JjL2luY2x1ZGUvYWNjZXNzL2dpbl9wcml2YXRlLmggfCA0NCArKysrKysrKysrKysr KysrKysrKysrKysrKystLS0tLQogMiBmaWxlcyBjaGFuZ2VkLCAzOCBpbnNlcnRpb25zKCsp LCA0NCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvZ2lu L2dpbnV0aWwuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2ludXRpbC5jCmluZGV4IGE1 NDZjYWMxOGQzLi5kMjA1MDkzZTIxZCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNz L2dpbi9naW51dGlsLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9naW51dGlsLmMK QEAgLTM4Nyw0NCArMzg3LDYgQEAgR2luSW5pdE1ldGFidWZmZXIoQnVmZmVyIGIpCiAJCSgo Y2hhciAqKSBtZXRhZGF0YSArIHNpemVvZihHaW5NZXRhUGFnZURhdGEpKSAtIChjaGFyICop IHBhZ2U7CiB9CiAKLS8qCi0gKiBDb21wYXJlIHR3byBrZXlzIG9mIHRoZSBzYW1lIGluZGV4 IGNvbHVtbgotICovCi1pbnQKLWdpbkNvbXBhcmVFbnRyaWVzKEdpblN0YXRlICpnaW5zdGF0 ZSwgT2Zmc2V0TnVtYmVyIGF0dG51bSwKLQkJCQkgIERhdHVtIGEsIEdpbk51bGxDYXRlZ29y eSBjYXRlZ29yeWEsCi0JCQkJICBEYXR1bSBiLCBHaW5OdWxsQ2F0ZWdvcnkgY2F0ZWdvcnli KQotewotCS8qIGlmIG5vdCBvZiBzYW1lIG51bGwgY2F0ZWdvcnksIHNvcnQgYnkgdGhhdCBm aXJzdCAqLwotCWlmIChjYXRlZ29yeWEgIT0gY2F0ZWdvcnliKQotCQlyZXR1cm4gKGNhdGVn b3J5YSA8IGNhdGVnb3J5YikgPyAtMSA6IDE7Ci0KLQkvKiBhbGwgbnVsbCBpdGVtcyBpbiBz YW1lIGNhdGVnb3J5IGFyZSBlcXVhbCAqLwotCWlmIChjYXRlZ29yeWEgIT0gR0lOX0NBVF9O T1JNX0tFWSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBib3RoIG5vdCBudWxsLCBzbyBzYWZlIHRv IGNhbGwgdGhlIGNvbXBhcmVGbiAqLwotCXJldHVybiBEYXR1bUdldEludDMyKEZ1bmN0aW9u Q2FsbDJDb2xsKCZnaW5zdGF0ZS0+Y29tcGFyZUZuW2F0dG51bSAtIDFdLAotCQkJCQkJCQkJ CSAgIGdpbnN0YXRlLT5zdXBwb3J0Q29sbGF0aW9uW2F0dG51bSAtIDFdLAotCQkJCQkJCQkJ CSAgIGEsIGIpKTsKLX0KLQotLyoKLSAqIENvbXBhcmUgdHdvIGtleXMgb2YgcG9zc2libHkg ZGlmZmVyZW50IGluZGV4IGNvbHVtbnMKLSAqLwotaW50Ci1naW5Db21wYXJlQXR0RW50cmll cyhHaW5TdGF0ZSAqZ2luc3RhdGUsCi0JCQkJCSBPZmZzZXROdW1iZXIgYXR0bnVtYSwgRGF0 dW0gYSwgR2luTnVsbENhdGVnb3J5IGNhdGVnb3J5YSwKLQkJCQkJIE9mZnNldE51bWJlciBh dHRudW1iLCBEYXR1bSBiLCBHaW5OdWxsQ2F0ZWdvcnkgY2F0ZWdvcnliKQotewotCS8qIGF0 dHJpYnV0ZSBudW1iZXIgaXMgdGhlIGZpcnN0IHNvcnQga2V5ICovCi0JaWYgKGF0dG51bWEg IT0gYXR0bnVtYikKLQkJcmV0dXJuIChhdHRudW1hIDwgYXR0bnVtYikgPyAtMSA6IDE7Ci0K LQlyZXR1cm4gZ2luQ29tcGFyZUVudHJpZXMoZ2luc3RhdGUsIGF0dG51bWEsIGEsIGNhdGVn b3J5YSwgYiwgY2F0ZWdvcnliKTsKLX0KLQotCiAvKgogICogU3VwcG9ydCBmb3Igc29ydGlu ZyBrZXkgZGF0dW1zIGluIGdpbkV4dHJhY3RFbnRyaWVzCiAgKgpkaWZmIC0tZ2l0IGEvc3Jj L2luY2x1ZGUvYWNjZXNzL2dpbl9wcml2YXRlLmggYi9zcmMvaW5jbHVkZS9hY2Nlc3MvZ2lu X3ByaXZhdGUuaAppbmRleCBiMzNmN2NlYzViNC4uZTE1NTA0NWNlOGEgMTAwNjQ0Ci0tLSBh L3NyYy9pbmNsdWRlL2FjY2Vzcy9naW5fcHJpdmF0ZS5oCisrKyBiL3NyYy9pbmNsdWRlL2Fj Y2Vzcy9naW5fcHJpdmF0ZS5oCkBAIC05NywxMiArOTcsNiBAQCBleHRlcm4gQnVmZmVyIEdp bk5ld0J1ZmZlcihSZWxhdGlvbiBpbmRleCk7CiBleHRlcm4gdm9pZCBHaW5Jbml0QnVmZmVy KEJ1ZmZlciBiLCB1aW50MzIgZik7CiBleHRlcm4gdm9pZCBHaW5Jbml0UGFnZShQYWdlIHBh Z2UsIHVpbnQzMiBmLCBTaXplIHBhZ2VTaXplKTsKIGV4dGVybiB2b2lkIEdpbkluaXRNZXRh YnVmZmVyKEJ1ZmZlciBiKTsKLWV4dGVybiBpbnQJZ2luQ29tcGFyZUVudHJpZXMoR2luU3Rh dGUgKmdpbnN0YXRlLCBPZmZzZXROdW1iZXIgYXR0bnVtLAotCQkJCQkJCSAgRGF0dW0gYSwg R2luTnVsbENhdGVnb3J5IGNhdGVnb3J5YSwKLQkJCQkJCQkgIERhdHVtIGIsIEdpbk51bGxD YXRlZ29yeSBjYXRlZ29yeWIpOwotZXh0ZXJuIGludAlnaW5Db21wYXJlQXR0RW50cmllcyhH aW5TdGF0ZSAqZ2luc3RhdGUsCi0JCQkJCQkJCSBPZmZzZXROdW1iZXIgYXR0bnVtYSwgRGF0 dW0gYSwgR2luTnVsbENhdGVnb3J5IGNhdGVnb3J5YSwKLQkJCQkJCQkJIE9mZnNldE51bWJl ciBhdHRudW1iLCBEYXR1bSBiLCBHaW5OdWxsQ2F0ZWdvcnkgY2F0ZWdvcnliKTsKIGV4dGVy biBEYXR1bSAqZ2luRXh0cmFjdEVudHJpZXMoR2luU3RhdGUgKmdpbnN0YXRlLCBPZmZzZXRO dW1iZXIgYXR0bnVtLAogCQkJCQkJCQlEYXR1bSB2YWx1ZSwgYm9vbCBpc051bGwsCiAJCQkJ CQkJCWludDMyICpuZW50cmllcywgR2luTnVsbENhdGVnb3J5ICoqY2F0ZWdvcmllcyk7CkBA IC01MDIsNiArNDk2LDQ0IEBAIGdpbkNvbXBhcmVJdGVtUG9pbnRlcnMoSXRlbVBvaW50ZXIg YSwgSXRlbVBvaW50ZXIgYikKIAlyZXR1cm4gcGdfY21wX3U2NChpYSwgaWIpOwogfQogCisv KgorICogQ29tcGFyZSB0d28ga2V5cyBvZiB0aGUgc2FtZSBpbmRleCBjb2x1bW4KKyAqLwor c3RhdGljIGlubGluZSBpbnQKK2dpbkNvbXBhcmVFbnRyaWVzKEdpblN0YXRlICpnaW5zdGF0 ZSwgT2Zmc2V0TnVtYmVyIGF0dG51bSwKKwkJCQkgIERhdHVtIGEsIEdpbk51bGxDYXRlZ29y eSBjYXRlZ29yeWEsCisJCQkJICBEYXR1bSBiLCBHaW5OdWxsQ2F0ZWdvcnkgY2F0ZWdvcnli KQoreworCS8qIGlmIG5vdCBvZiBzYW1lIG51bGwgY2F0ZWdvcnksIHNvcnQgYnkgdGhhdCBm aXJzdCAqLworCWlmIChjYXRlZ29yeWEgIT0gY2F0ZWdvcnliKQorCQlyZXR1cm4gKGNhdGVn b3J5YSA8IGNhdGVnb3J5YikgPyAtMSA6IDE7CisKKwkvKiBhbGwgbnVsbCBpdGVtcyBpbiBz YW1lIGNhdGVnb3J5IGFyZSBlcXVhbCAqLworCWlmIChjYXRlZ29yeWEgIT0gR0lOX0NBVF9O T1JNX0tFWSkKKwkJcmV0dXJuIDA7CisKKwkvKiBib3RoIG5vdCBudWxsLCBzbyBzYWZlIHRv IGNhbGwgdGhlIGNvbXBhcmVGbiAqLworCXJldHVybiBEYXR1bUdldEludDMyKEZ1bmN0aW9u Q2FsbDJDb2xsKCZnaW5zdGF0ZS0+Y29tcGFyZUZuW2F0dG51bSAtIDFdLAorCQkJCQkJCQkJ CSAgIGdpbnN0YXRlLT5zdXBwb3J0Q29sbGF0aW9uW2F0dG51bSAtIDFdLAorCQkJCQkJCQkJ CSAgIGEsIGIpKTsKK30KKworLyoKKyAqIENvbXBhcmUgdHdvIGtleXMgb2YgcG9zc2libHkg ZGlmZmVyZW50IGluZGV4IGNvbHVtbnMKKyAqLworc3RhdGljIGlubGluZSBpbnQKK2dpbkNv bXBhcmVBdHRFbnRyaWVzKEdpblN0YXRlICpnaW5zdGF0ZSwKKwkJCQkJIE9mZnNldE51bWJl ciBhdHRudW1hLCBEYXR1bSBhLCBHaW5OdWxsQ2F0ZWdvcnkgY2F0ZWdvcnlhLAorCQkJCQkg T2Zmc2V0TnVtYmVyIGF0dG51bWIsIERhdHVtIGIsIEdpbk51bGxDYXRlZ29yeSBjYXRlZ29y eWIpCit7CisJLyogYXR0cmlidXRlIG51bWJlciBpcyB0aGUgZmlyc3Qgc29ydCBrZXkgKi8K KwlpZiAoYXR0bnVtYSAhPSBhdHRudW1iKQorCQlyZXR1cm4gKGF0dG51bWEgPCBhdHRudW1i KSA/IC0xIDogMTsKKworCXJldHVybiBnaW5Db21wYXJlRW50cmllcyhnaW5zdGF0ZSwgYXR0 bnVtYSwgYSwgY2F0ZWdvcnlhLCBiLCBjYXRlZ29yeWIpOworCit9CisKIGV4dGVybiBpbnQJ Z2luVHJhdmVyc2VMb2NrKEJ1ZmZlciBidWZmZXIsIGJvb2wgc2VhcmNoTW9kZSk7CiAKICNl bmRpZgkJCQkJCQkvKiBHSU5fUFJJVkFURV9IICovCi0tIAoyLjUxLjAKCg== --------------IhN4GcT9sRwrhtqlqHgdqwZh Content-Type: application/sql; name="test_gin_optimizations.sql" Content-Disposition: attachment; filename="test_gin_optimizations.sql" Content-Transfer-Encoding: base64 XHRpbWluZyBvbgpEUk9QIFRBQkxFIG1vdmllczsKRFJPUCBUQUJMRSBsaW5laXRlbTsKCkNS RUFURSBUQUJMRSBtb3ZpZXMoCiAgICBSZWxlYXNlWWVhciBpbnQsCiAgICBUaXRsZSB0ZXh0 LAogICAgT3JpZ2luIHRleHQsCiAgICBEaXJlY3RvciB0ZXh0LAogICAgQ2FzdGluZyB0ZXh0 LAogICAgR2VucmUgdGV4dCwKICAgIFdpa2lQYWdlIHRleHQsCiAgICBQbG90IHRleHQKKTsK ClxDT1BZIG1vdmllcyhSZWxlYXNlWWVhciwgVGl0bGUsIE9yaWdpbiwgRGlyZWN0b3IsIENh c3RpbmcsIEdlbnJlLCBXaWtpUGFnZSwgUGxvdCkgRlJPTSAnd2lraV9tb3ZpZV9wbG90c19k ZWR1cGVkLmNzdicgREVMSU1JVEVSICcsJyBDU1YgSEVBREVSOwoKQ1JFQVRFIFRBQkxFIGxp bmVpdGVtICgKCWxfb3JkZXJrZXkgICAgICBCSUdJTlQgTk9UIE5VTEwsCglsX3BhcnRrZXkg ICAgICAgQklHSU5UIE5PVCBOVUxMLAoJbF9zdXBwa2V5ICAgICAgIEJJR0lOVCBOT1QgTlVM TCwKCWxfbGluZW51bWJlciAgICBJTlRFR0VSLAoJbF9xdWFudGl0eSAgICAgIERFQ0lNQUws CglsX2V4dGVuZGVkcHJpY2UgREVDSU1BTCwKCWxfZGlzY291bnQgICAgICBERUNJTUFMLAoJ bF90YXggICAgICAgICAgIERFQ0lNQUwsCglsX3JldHVybmZsYWcgICAgQ0hBUigxKSwKCWxf bGluZXN0YXR1cyAgICBDSEFSKDEpLAoJbF9zaGlwZGF0ZSAgICAgIERBVEUsCglsX2NvbW1p dGRhdGUgICAgREFURSwKCWxfcmVjZWlwdGRhdGUgICBEQVRFLAoJbF9zaGlwaW5zdHJ1Y3Qg IENIQVIoMjUpLAoJbF9zaGlwbW9kZSAgICAgIENIQVIoMTApLAoJbF9jb21tZW50ICAgICAg IFZBUkNIQVIoNDQpCik7CgpDT1BZIGxpbmVpdGVtIEZST00gJ2xpbmVpdGVtLnRibCcgV0lU SCBkZWxpbWl0ZXIgJ3wnOwoKU0VUIG1heF9wYXJhbGxlbF9tYWludGVuYW5jZV93b3JrZXJz ID0gMDsKCkNSRUFURSBJTkRFWCBPTiBtb3ZpZXMgVVNJTkcgZ2luKFBsb3QgZ2luX3RyZ21f b3BzKTsKQ1JFQVRFIElOREVYIE9OIG1vdmllcyBVU0lORyBnaW4oUGxvdCBnaW5fdHJnbV9v cHMpOwpDUkVBVEUgSU5ERVggT04gbW92aWVzIFVTSU5HIGdpbihQbG90IGdpbl90cmdtX29w cyk7CkNSRUFURSBJTkRFWCBPTiBsaW5laXRlbSBVU0lORyBnaW4obF9jb21tZW50IGdpbl90 cmdtX29wcyk7CkNSRUFURSBJTkRFWCBPTiBsaW5laXRlbSBVU0lORyBnaW4obF9jb21tZW50 IGdpbl90cmdtX29wcyk7CkNSRUFURSBJTkRFWCBPTiBsaW5laXRlbSBVU0lORyBnaW4obF9j b21tZW50IGdpbl90cmdtX29wcyk7 --------------IhN4GcT9sRwrhtqlqHgdqwZh--