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 1veBGW-009rso-0S for pgsql-hackers@arkaria.postgresql.org; Fri, 09 Jan 2026 12:06:53 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1veBGU-0073OW-0Y for pgsql-hackers@arkaria.postgresql.org; Fri, 09 Jan 2026 12:06:50 +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 1veBGT-0073OO-10 for pgsql-hackers@lists.postgresql.org; Fri, 09 Jan 2026 12:06:50 +0000 Received: from mail-wm1-x329.google.com ([2a00:1450:4864:20::329]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1veBGQ-0053yZ-31 for pgsql-hackers@postgresql.org; Fri, 09 Jan 2026 12:06:49 +0000 Received: by mail-wm1-x329.google.com with SMTP id 5b1f17b1804b1-47775fb6c56so39561615e9.1 for ; Fri, 09 Jan 2026 04:06:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1767960405; x=1768565205; darn=postgresql.org; h=in-reply-to:content-language:references:to:subject:from:user-agent :mime-version:date:message-id:from:to:cc:subject:date:message-id :reply-to; bh=cxn0abzfVtTdZzpbdie/5E1bBvbA/aaMaBoAU7lQ/hU=; b=URJUSLsEHMKQfydDEeCuL6CgGOijjMEVDv0X7kZVEqMTDA0sRlfQdkU8LebMTq8mpI x6ja+iqGDzpDZNU1y3k0sj55vA2Lh/skuEuWzq7hjVDoXdrowd01R+su5KceGUV0hzRh RSYiJBq5htEw0+JAKOUBYVnYmIvvKDKAwdzSlsMHmDos7eByte3rebQBoy8DoY/u+/ch xS2VIRMD933xoe0xVXdRjZRPcm+83uK47rPVTcMjGVpQjPbl2j81rjU45ab785Au1WHT 67GGZlx0OaH4DppMXBDT8Td41naCgnSwa8fX25rgvme8GgfWCJa0DsYLDGxKxtoLZS0R x8cQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767960405; x=1768565205; h=in-reply-to:content-language:references:to: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=cxn0abzfVtTdZzpbdie/5E1bBvbA/aaMaBoAU7lQ/hU=; b=ZlCokJhmOmC5LkoQgQWS4i7O2WmhHqJFMgsGvb6Isapt8ATp5U5i/QOvHhCTJ9/J4Y aB2BNu6fpGALTlk3rbzt40NCOFhl2ghd8pRpjYIvFvltOTy8Px6NxOdeUURsZZ1fgBeG NO+jH+KssHZhYDy7vLBbxcMp1yWVXRPg+m3YX2orEt2+/1lAfLYqVgf7dTib5lVi1EME FGQvB7g6L1YWf5Vt4R6oomigljnSLMnMFCmPzQAi4PKMn7WTCXUlCnPiFtPb4GscGXV7 gMuTQA5JbIEL/hUnANvJYVuBnBAGNZ8ig/fdwsJRS4arKC9oCScH+7HBmi3cIZU1lgGD TOYw== X-Forwarded-Encrypted: i=1; AJvYcCWR1qFtiQvZubxMd7lIqXzxmlVbzkZtMQts+mKfFeVVzyciK1zvLHlwgcarlTZMs8JH8cNvki3LUT17moob@postgresql.org X-Gm-Message-State: AOJu0YypnHOtpmqGZOqEMPtCFE0JDpPfo8Xx5ErrWGN81xp6WQOjrNB0 oLz4E0GDNlcqXMzACYUvJlr9+geo3T9pzaAUM0IGVIzBlTn2AiGQD+G6dkAFI1t+ X-Gm-Gg: AY/fxX4WrmRO2e+0DlnAmLtbIQWLPQk24+M5Nxda2WTmHemT4buwYXXtIggnyt0Bde/ lUtJc0YPE9Dg1KZOGt78b4yqiNxW5V/nb9+dCZDxmABt+JXEWuYf4xs4bPTX+RM4Ob+TzIhRwfu ZuNXf4Mj0SaZlU0ZE2E0kjUO9C01nATs1oyQKl17u+HeO0Jl/A64m/6AqlyXrCNRMLTWPd7z6J9 rrwsTPlQCMrBKxi+9OnekwPFrIRE0smloUjQOPYMiXolYS8ts7RuZU7BNvZPVqroM8Y64K6QiiX XVV/ew7lPoco3KwlJd+JDCi8l4smbuiYjpEKYFwNCnn0lJv079IK/9Z52TyazL2EuE1lOUTtV6N /o8NGeIsy4dvuAwiUbSD1kDNtfMN6iYnWTPN1kDi/A+bX+5rAMNRkXwlfcn9ce78NEZaPY5SVJ7 HQ1TOGVeHxcGJG/Q== X-Google-Smtp-Source: AGHT+IHhSPn6K+KhsSr3cLKlkoxSCKgYd4TjyP6or3vUPCztqAy1V+EXRn36RHtkGl3QZAdcWUtPrQ== X-Received: by 2002:a05:600c:620f:b0:477:9fcf:3fe3 with SMTP id 5b1f17b1804b1-47d8f34f2e2mr31981495e9.0.1767960404659; Fri, 09 Jan 2026 04:06:44 -0800 (PST) Received: from [192.168.2.32] ([147.161.235.22]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-432bd5df90dsm21927998f8f.20.2026.01.09.04.06.43 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 09 Jan 2026 04:06:43 -0800 (PST) Content-Type: multipart/mixed; boundary="------------zG5CcYGocnDFmMDep3YanWGC" Message-ID: Date: Fri, 9 Jan 2026 13:06:42 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird From: David Geier Subject: Re: Reduce build times of pg_trgm GIN indexes To: Heikki Linnakangas , pgsql-hackers References: <5d366878-2007-4d31-861e-19294b7a583b@gmail.com> <9ac3931a-180e-4283-a7a8-05eb66099206@iki.fi> Content-Language: en-US In-Reply-To: <9ac3931a-180e-4283-a7a8-05eb66099206@iki.fi> 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. --------------zG5CcYGocnDFmMDep3YanWGC Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hi Heikki! Thanks for looking at the patch set. On 06.01.2026 18:00, Heikki Linnakangas wrote: > On 05/01/2026 17:01, David Geier wrote: >> - v1-0002-Optimized-comparison-functions.patch: Use FunctionCallInvoke() >> instead of FunctionCall2Coll(). This saves a bunch of per-comparison >> setup code, such as calling InitFunctionCallInfoData(). > > You lose the check for NULL result with this. That's probably still > worth checking. It seems like existing code where all args are not null, has that safety check. Added it for consistency. >> - 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. > > Yeah, this seems wrong as it is. You're assuming that if the extract > function returns nullFlags == NULL, the array is already sorted and > deduped. As said, that was just for demonstration purposes of the possible gains. I've changed the code now such that the extractValue function of the GIN index can indicate via the third argument uniqueAndSorted, if the returned keys are already unique and sorted. Unfortunately, it seems like this patch regresses performance. See measurements below. I haven't had the time to investigate why that is. It's pretty counter intuitive, given that this patch effectively only removes code. Maybe you could re-test patch 0004 and share your runtimes? >> 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. > > Makes sense. I'm a little disappointed the compiler won't do that > optimization for us.. I thought the same. > > Perhaps we should introduce a new qunique_eq() function with a different > callback signature: > > /* like qunique(), but the callback function returns true/false rather > than int */ > static inline size_t > qunique_eq(void *array, size_t elements, size_t width, >         bool (*equal) (const void *, const void *)) > I would prefer to change qunique() instead. That would enforce using an adequate comparison function from the get go. There are only ~15 calls to qunique(). So refactoring this should also be a fairly small patch. I can do that if there's agreement for that approach. >> 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. > > This uses pg_ascii_tolower() when for ASCII characters when built with > the IGNORECASE. I don't think that's correct, if the proper collation > would do something more complicated for than what pg_ascii_tolower() does. Oh, that's evil. I had tested that specifically. But it only worked because the code in master uses str_tolower() with DEFAULT_COLLATION_OID. So using a different locale like in the following example does something different than when creating a database with the same locale. postgres=# select lower('III' COLLATE "tr_TR"); lower ------- ııı postgres=# select show_trgm('III' COLLATE "tr_TR"); show_trgm ------------------------- {" i"," ii","ii ",iii} (1 row) But when using tr_TR as default locale of the database the following happens: postgres=# select lower('III' COLLATE "tr_TR"); lower ------- ııı postgres=# select show_trgm('III');sü show_trgm --------------------------------------- {0xbbd8dd,0xf26fab,0xf31e1a,0x2af4f1} I'm wondering if that's intentional to begin with. Shouldn't the code instead pass PG_GET_COLLATION() to str_tolower()? Might require some research to see how other index types handle locales. Coming back to the original problem: the lengthy comment at the top of pg_locale_libc.c, suggests that in some cases ASCII characters are handled the pg_ascii_tolower() way for the default locale. See for example tolower_libc_mb(). So a character by character conversion using that function will yield a different result than strlower_libc_mb(). I'm wondering why that is. Anyways, we could limit the optimization to only kick in when the used locale follows the same rules as pg_ascii_tolower(). We could test that when creating the locale and store that info in pg_locale_struct. Thoughts? > Did you measure how big is the impact from each individual patch? > Patches 1 and 2 seem pretty much ready to be committed, but I wonder if > they make any difference on their own. Here is the impact of each patch. I ran again CREATE INDEX three times and took the fastest run. The run of each patch includes all previous patches as well. For example, the timings for patch 0003 were measured with a binary that also had patch 0002 and 0001 applied. To get the impact of each patch in isolation, the delta to the previous run was taken. Code | movies |delta | lineitem | delta ------------------------------------|--------|-------|------------------ master | 10,311 | 0 | 256,986 | 0 v1-0001-Inline-ginCompareAttEntries | 9,694 | 617 | 239,778 | 17,208 v1-0002-Optimized-comparison-func | 9,510 | 184 | 238,094 | 1,684 v1-0003-Use-sort_template.h | 8,661 | 849 | 231,190 | 6,904 v1-0004-Avoid-dedup-and-sort-in | 9,305 | -644 | 232,472 | -1,282 v1-0005-Make-btint4cmp-branchless | 8,240 | 1,065 | 228,387 | 4,085 v1-0006-Use-radix-sort | 6,976 | 1,264 | 207,687 | 20,700 v1-0007-Faster-qunique-comparator | 5,911 | 1,065 | 203,744 | 3,943 v1-0008-Add-ASCII-fastpath | 3,409 | 2,502 | 161,469 | 42,275 Attached is v2 of the patch set with the aforementioned changes. I've also fixed the white space errors in 0003, 0004 and 0008, as reported by Kirill. -- David Geier --------------zG5CcYGocnDFmMDep3YanWGC Content-Type: text/x-patch; charset=UTF-8; name="v2-0008-Add-ASCII-fastpath-to-generate_trgm_only.patch" Content-Disposition: attachment; filename="v2-0008-Add-ASCII-fastpath-to-generate_trgm_only.patch" Content-Transfer-Encoding: base64 RnJvbSAwMGM3NWJkNThiNzk4MmM4YmZlNjJkMTI2MGU5MzY2NzY2YmM3ZjM0IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBHZWllciA8Z2VpZGF2LnBnQGdtYWlsLmNv bT4KRGF0ZTogRnJpLCAxNCBOb3YgMjAyNSAxMTozNzo0MCArMDEwMApTdWJqZWN0OiBbUEFU Q0ggdjIgOC84XSBBZGQgQVNDSUkgZmFzdHBhdGggdG8gZ2VuZXJhdGVfdHJnbV9vbmx5KCkK Ci0tLQogY29udHJpYi9wZ190cmdtL3RyZ21fb3AuYyB8IDEyNCArKysrKysrKysrKysrKysr KysrKy0tLS0tLS0tLS0tLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDY1IGluc2VydGlvbnMo KyksIDU5IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfdHJnbS90cmdt X29wLmMgYi9jb250cmliL3BnX3RyZ20vdHJnbV9vcC5jCmluZGV4IDM5YjU4NmY1YjlhLi5k MjA4N2IzYTQ1ZSAxMDA2NDQKLS0tIGEvY29udHJpYi9wZ190cmdtL3RyZ21fb3AuYworKysg Yi9jb250cmliL3BnX3RyZ20vdHJnbV9vcC5jCkBAIC0yMjYsMzIgKzIyNiw2IEBAIHNob3df bGltaXQoUEdfRlVOQ1RJT05fQVJHUykKIAlQR19SRVRVUk5fRkxPQVQ0KHNpbWlsYXJpdHlf dGhyZXNob2xkKTsKIH0KIAotLyoKLSAqIEZpbmRzIGZpcnN0IHdvcmQgaW4gc3RyaW5nLCBy ZXR1cm5zIHBvaW50ZXIgdG8gdGhlIHdvcmQsCi0gKiBlbmR3b3JkIHBvaW50cyB0byB0aGUg Y2hhcmFjdGVyIGFmdGVyIHdvcmQKLSAqLwotc3RhdGljIGNoYXIgKgotZmluZF93b3JkKGNo YXIgKnN0ciwgaW50IGxlbnN0ciwgY2hhciAqKmVuZHdvcmQsIGludCAqY2hhcmxlbikKLXsK LQljaGFyCSAgICpiZWdpbndvcmQgPSBzdHI7Ci0KLQl3aGlsZSAoYmVnaW53b3JkIC0gc3Ry IDwgbGVuc3RyICYmICFJU1dPUkRDSFIoYmVnaW53b3JkKSkKLQkJYmVnaW53b3JkICs9IHBn X21ibGVuKGJlZ2lud29yZCk7Ci0KLQlpZiAoYmVnaW53b3JkIC0gc3RyID49IGxlbnN0cikK LQkJcmV0dXJuIE5VTEw7Ci0KLQkqZW5kd29yZCA9IGJlZ2lud29yZDsKLQkqY2hhcmxlbiA9 IDA7Ci0Jd2hpbGUgKCplbmR3b3JkIC0gc3RyIDwgbGVuc3RyICYmIElTV09SRENIUigqZW5k d29yZCkpCi0JewotCQkqZW5kd29yZCArPSBwZ19tYmxlbigqZW5kd29yZCk7Ci0JCSgqY2hh cmxlbikrKzsKLQl9Ci0KLQlyZXR1cm4gYmVnaW53b3JkOwotfQotCiAvKgogICogUmVkdWNl IGEgdHJpZ3JhbSAodGhyZWUgcG9zc2libHkgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzKSB0byBh IHRyZ20sCiAgKiB3aGljaCBpcyBhbHdheXMgZXhhY3RseSB0aHJlZSBieXRlcy4gIElmIHdl IGhhdmUgdGhyZWUgc2luZ2xlLWJ5dGUKQEAgLTMzNyw1OCArMzExLDkwIEBAIG1ha2VfdHJp Z3JhbXModHJnbSAqdHB0ciwgY2hhciAqc3RyLCBpbnQgYnl0ZWxlbiwgaW50IGNoYXJsZW4p CiBzdGF0aWMgaW50CiBnZW5lcmF0ZV90cmdtX29ubHkodHJnbSAqdHJnLCBjaGFyICpzdHIs IGludCBzbGVuLCBUcmdtQm91bmQgKmJvdW5kcykKIHsKLQl0cmdtCSAgICp0cHRyOwotCWNo YXIJICAgKmJ1ZjsKLQlpbnQJCQljaGFybGVuLAotCQkJCWJ5dGVsZW47Ci0JY2hhcgkgICAq YndvcmQsCi0JCQkgICAqZXdvcmQ7CisJdHJnbSAqdHB0ciA9IHRyZzsKKwljaGFyICpidWY7 CiAKIAlpZiAoc2xlbiArIExQQURESU5HICsgUlBBRERJTkcgPCAzIHx8IHNsZW4gPT0gMCkK IAkJcmV0dXJuIDA7CiAKLQl0cHRyID0gdHJnOwotCi0JLyogQWxsb2NhdGUgYSBidWZmZXIg Zm9yIGNhc2UtZm9sZGVkLCBibGFuay1wYWRkZWQgd29yZHMgKi8KLQlidWYgPSAoY2hhciAq KSBwYWxsb2Moc2xlbiAqIHBnX2RhdGFiYXNlX2VuY29kaW5nX21heF9sZW5ndGgoKSArIDQp OworCWJ1ZiA9IHBhbGxvY19hcnJheShjaGFyLCBzbGVuICogcGdfZGF0YWJhc2VfZW5jb2Rp bmdfbWF4X2xlbmd0aCgpICsgNCArIDEpOworCW1lbXNldChidWYsICcgJywgTFBBRERJTkcp OwogCi0JaWYgKExQQURESU5HID4gMCkKKwlmb3IgKGludCBpID0gMDsgaSA8IHNsZW47ICkK IAl7Ci0JCSpidWYgPSAnICc7Ci0JCWlmIChMUEFERElORyA+IDEpCi0JCQkqKGJ1ZiArIDEp ID0gJyAnOwotCX0KKwkJaW50IG51bV9ieXRlcyA9IExQQURESU5HOworCQlpbnQgbnVtX2No YXJzID0gTFBBRERJTkc7CisJCWNoYXIgKndvcmQ7CiAKLQlld29yZCA9IHN0cjsKLQl3aGls ZSAoKGJ3b3JkID0gZmluZF93b3JkKGV3b3JkLCBzbGVuIC0gKGV3b3JkIC0gc3RyKSwgJmV3 b3JkLCAmY2hhcmxlbikpICE9IE5VTEwpCi0JeworCQkvKiBFeHRyYWN0IG5leHQgd29yZCAq LworCQl3aGlsZSAoaSA8IHNsZW4pCisJCXsKKwkJCWlmICgoc3RyW2ldICYgMHg4MCkgPT0g MCkgLyogRmFzdCBwYXRoIGZvciBBU0NJSS1vbmx5ICovCisJCQl7CisJCQkJaWYgKGlzYWxu dW0oc3RyW2ldKSkKKwkJCQl7CiAjaWZkZWYgSUdOT1JFQ0FTRQotCQlid29yZCA9IHN0cl90 b2xvd2VyKGJ3b3JkLCBld29yZCAtIGJ3b3JkLCBERUZBVUxUX0NPTExBVElPTl9PSUQpOwot CQlieXRlbGVuID0gc3RybGVuKGJ3b3JkKTsKKwkJCQkJYnVmW251bV9ieXRlcysrXSA9IHBn X2FzY2lpX3RvbG93ZXIoc3RyW2krK10pOwogI2Vsc2UKLQkJYnl0ZWxlbiA9IGV3b3JkIC0g YndvcmQ7CisJCQkJCWJ1ZltudW1fYnl0ZXMrK10gPSBzdHJbaSsrXTsKICNlbmRpZgorCQkJ CX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpKys7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJ CX0KKwkJCWVsc2UKKwkJCXsKKwkJCQljb25zdCBpbnQgbWJsZW4gPSBwZ19tYmxlbihzdHIg KyBpKTsKKwkJCQlBc3NlcnQobWJsZW4gPj0gMik7IC8qIE90aGVyd2lzZSwgaXQgd291bGQg YmUgQVNDSUkgKi8KKworCQkJCWlmIChJU1dPUkRDSFIoc3RyICsgaSkpCisJCQkJeworCQkJ CQltZW1jcHkoYnVmICsgbnVtX2J5dGVzLCBzdHIgKyBpLCBtYmxlbik7CisJCQkJCW51bV9i eXRlcyArPSBtYmxlbjsKKwkJCQkJaSArPSBtYmxlbjsKKwkJCQl9CisJCQkJZWxzZQorCQkJ CXsKKwkJCQkJaSArPSBtYmxlbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlu dW1fY2hhcnMrKzsKKwkJfQogCi0JCW1lbWNweShidWYgKyBMUEFERElORywgYndvcmQsIGJ5 dGVsZW4pOworCQlpZiAobnVtX2NoYXJzID4gTFBBRERJTkcpCisJCXsKKwkJCW1lbXNldChi dWYgKyBudW1fYnl0ZXMsICcgJywgUlBBRERJTkcpOworCQkJbnVtX2J5dGVzICs9IFJQQURE SU5HOworCQkJbnVtX2NoYXJzICs9IFJQQURESU5HOworCQkJd29yZCA9IGJ1ZjsKIAogI2lm ZGVmIElHTk9SRUNBU0UKLQkJcGZyZWUoYndvcmQpOworCQkJaWYgKG51bV9jaGFycyAhPSBu dW1fYnl0ZXMpCisJCQl7CisJCQkJd29yZCA9IHN0cl90b2xvd2VyKGJ1ZiwgbnVtX2J5dGVz LCBERUZBVUxUX0NPTExBVElPTl9PSUQpOworCQkJCW51bV9ieXRlcyA9IHN0cmxlbih3b3Jk KTsgLyogU3RyaW5nIGNhbiBnZXQgc2hvcnRlciBmcm9tIGxvd2VyLWNhc2luZyAqLworCQkJ fQogI2VuZGlmCiAKLQkJYnVmW0xQQURESU5HICsgYnl0ZWxlbl0gPSAnICc7Ci0JCWJ1ZltM UEFERElORyArIGJ5dGVsZW4gKyAxXSA9ICcgJzsKKwkJCWlmIChib3VuZHMpCisJCQkJYm91 bmRzW3RwdHIgLSB0cmddIHw9IFRSR01fQk9VTkRfTEVGVDsKKworCQkJdHB0ciA9IG1ha2Vf dHJpZ3JhbXModHB0ciwgd29yZCwgbnVtX2J5dGVzLCBudW1fY2hhcnMpOworCisJCQlpZiAo Ym91bmRzKQorCQkJCWJvdW5kc1t0cHRyIC0gdHJnIC0gMV0gfD0gVFJHTV9CT1VORF9SSUdI VDsKIAotCQkvKiBDYWxjdWxhdGUgdHJpZ3JhbXMgbWFya2luZyB0aGVpciBib3VuZHMgaWYg bmVlZGVkICovCi0JCWlmIChib3VuZHMpCi0JCQlib3VuZHNbdHB0ciAtIHRyZ10gfD0gVFJH TV9CT1VORF9MRUZUOwotCQl0cHRyID0gbWFrZV90cmlncmFtcyh0cHRyLCBidWYsIGJ5dGVs ZW4gKyBMUEFERElORyArIFJQQURESU5HLAotCQkJCQkJCSBjaGFybGVuICsgTFBBRERJTkcg KyBSUEFERElORyk7Ci0JCWlmIChib3VuZHMpCi0JCQlib3VuZHNbdHB0ciAtIHRyZyAtIDFd IHw9IFRSR01fQk9VTkRfUklHSFQ7CisJCQlpZiAod29yZCAhPSBidWYpCisJCQkJcGZyZWUo d29yZCk7CisJCX0KIAl9CiAKIAlwZnJlZShidWYpOwotCiAJcmV0dXJuIHRwdHIgLSB0cmc7 CiB9CiAKLS0gCjIuNTEuMAoK --------------zG5CcYGocnDFmMDep3YanWGC Content-Type: text/x-patch; charset=UTF-8; name="v2-0007-Faster-qunique-comparator.patch" Content-Disposition: attachment; filename="v2-0007-Faster-qunique-comparator.patch" Content-Transfer-Encoding: base64 RnJvbSA0NTdhM2QwZDU3YTgzNGE4MDIzN2Q2MjhkMzUzNDA4ZjNlMmY0Mzc4IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBHZWllciA8Z2VpZGF2LnBnQGdtYWlsLmNv bT4KRGF0ZTogV2VkLCAxMiBOb3YgMjAyNSAxNDoyNzoxMyArMDEwMApTdWJqZWN0OiBbUEFU Q0ggdjIgNy84XSBGYXN0ZXIgcXVuaXF1ZSgpIGNvbXBhcmF0b3IKCi0tLQogY29udHJpYi9w Z190cmdtL3RyZ21fb3AuYyB8IDI0ICsrKysrKysrKysrKy0tLS0tLS0tLS0tLQogMSBmaWxl IGNoYW5nZWQsIDEyIGluc2VydGlvbnMoKyksIDEyIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdp dCBhL2NvbnRyaWIvcGdfdHJnbS90cmdtX29wLmMgYi9jb250cmliL3BnX3RyZ20vdHJnbV9v cC5jCmluZGV4IDAzOWMyNzNmNmExLi4zOWI1ODZmNWI5YSAxMDA2NDQKLS0tIGEvY29udHJp 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= --------------zG5CcYGocnDFmMDep3YanWGC Content-Type: text/x-patch; charset=UTF-8; name="v2-0006-Use-radix-sort.patch" Content-Disposition: attachment; filename="v2-0006-Use-radix-sort.patch" Content-Transfer-Encoding: base64 RnJvbSA0NDdjZTMxMzYwMmU3NjhmMjljNDNkNGE1MzU5ZjRjOTA5YjhkYjQ2IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBHZWllciA8Z2VpZGF2LnBnQGdtYWlsLmNv bT4KRGF0ZTogVHVlLCAxMSBOb3YgMjAyNSAxMzoxODo1OSArMDEwMApTdWJqZWN0OiBbUEFU Q0ggdjIgNi84XSBVc2UgcmFkaXggc29ydAoKLS0tCiBjb250cmliL3BnX3RyZ20vdHJnbV9v cC5jIHwgNjQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tCiAxIGZp bGUgY2hhbmdlZCwgNTQgaW5zZXJ0aW9ucygrKSwgMTAgZGVsZXRpb25zKC0pCgpkaWZmIC0t Z2l0IGEvY29udHJpYi9wZ190cmdtL3RyZ21fb3AuYyBiL2NvbnRyaWIvcGdfdHJnbS90cmdt X29wLmMKaW5kZXggNmFmMTIwZmExYWQuLjAzOWMyNzNmNmExIDEwMDY0NAotLS0gYS9jb250 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== --------------zG5CcYGocnDFmMDep3YanWGC Content-Type: text/x-patch; charset=UTF-8; name="v2-0005-Make-btint4cmp-branchless.patch" Content-Disposition: attachment; filename="v2-0005-Make-btint4cmp-branchless.patch" Content-Transfer-Encoding: base64 RnJvbSBjNjhhYTcwMGEyNDVmMWViMDVmNzAxYTIyNzc3NmUyNGQwYzBhZmU3IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBHZWllciA8Z2VpZGF2LnBnQGdtYWlsLmNv bT4KRGF0ZTogTW9uLCAxMCBOb3YgMjAyNSAxNTo0MDoxMSArMDEwMApTdWJqZWN0OiBbUEFU Q0ggdjIgNS84XSBNYWtlIGJ0aW50NGNtcCgpIGJyYW5jaGxlc3MKCi0tLQogc3JjL2JhY2tl bmQvYWNjZXNzL25idHJlZS9uYnRjb21wYXJlLmMgfCA4ICsrLS0tLS0tCiAxIGZpbGUgY2hh bmdlZCwgMiBpbnNlcnRpb25zKCspLCA2IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3Ny Yy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0Y29tcGFyZS5jIGIvc3JjL2JhY2tlbmQvYWNj ZXNzL25idHJlZS9uYnRjb21wYXJlLmMKaW5kZXggYmZmYzRiNzcwOWMuLjVhZTI3YzIyNjIx IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idGNvbXBhcmUuYwor KysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idGNvbXBhcmUuYwpAQCAtNjAsNiAr NjAsNyBAQAogI2luY2x1ZGUgInV0aWxzL2ZtZ3Jwcm90b3MuaCIKICNpbmNsdWRlICJ1dGls cy9za2lwc3VwcG9ydC5oIgogI2luY2x1ZGUgInV0aWxzL3NvcnRzdXBwb3J0LmgiCisjaW5j bHVkZSAiY29tbW9uL2ludC5oIgogCiAjaWZkZWYgU1RSRVNTX1NPUlRfSU5UX01JTgogI2Rl ZmluZSBBX0xFU1NfVEhBTl9CCQlJTlRfTUlOCkBAIC0yMDIsMTIgKzIwMyw3IEBAIGJ0aW50 NGNtcChQR19GVU5DVElPTl9BUkdTKQogCWludDMyCQlhID0gUEdfR0VUQVJHX0lOVDMyKDAp OwogCWludDMyCQliID0gUEdfR0VUQVJHX0lOVDMyKDEpOwogCi0JaWYgKGEgPiBiKQotCQlQ R19SRVRVUk5fSU5UMzIoQV9HUkVBVEVSX1RIQU5fQik7Ci0JZWxzZSBpZiAoYSA9PSBiKQot CQlQR19SRVRVUk5fSU5UMzIoMCk7Ci0JZWxzZQotCQlQR19SRVRVUk5fSU5UMzIoQV9MRVNT X1RIQU5fQik7CisJUEdfUkVUVVJOX0lOVDMyKHBnX2NtcF9zMzIoYSwgYikpOwogfQogCiBE YXR1bQotLSAKMi41MS4wCgo= --------------zG5CcYGocnDFmMDep3YanWGC Content-Type: text/x-patch; charset=UTF-8; name="v2-0004-Avoid-dedup-and-sort-in-ginExtractEntries.patch" Content-Disposition: attachment; filename="v2-0004-Avoid-dedup-and-sort-in-ginExtractEntries.patch" Content-Transfer-Encoding: base64 RnJvbSAwY2RjODc2NDBjZjJhMmQ4Yzk0NmFmZjE2Njk3MDZmOTkyODBjNTU1IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBHZWllciA8Z2VpZGF2LnBnQGdtYWlsLmNv bT4KRGF0ZTogTW9uLCAxMCBOb3YgMjAyNSAxNDo0MDozNyArMDEwMApTdWJqZWN0OiBbUEFU Q0ggdjIgNC84XSBBdm9pZCBkZWR1cCBhbmQgc29ydCBpbiBnaW5FeHRyYWN0RW50cmllcwoK LS0tCiBjb250cmliL3BnX3RyZ20vdHJnbV9naW4uYyAgICAgICB8ICAyICsrCiBkb2Mvc3Jj L3NnbWwvZ2luLnNnbWwgICAgICAgICAgICB8ICA3ICsrKysrKy0KIHNyYy9iYWNrZW5kL2Fj Y2Vzcy9naW4vZ2ludXRpbC5jIHwgMzIgKysrKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0t LS0KIDMgZmlsZXMgY2hhbmdlZCwgMjcgaW5zZXJ0aW9ucygrKSwgMTQgZGVsZXRpb25zKC0p CgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wZ190cmdtL3RyZ21fZ2luLmMgYi9jb250cmliL3Bn X3RyZ20vdHJnbV9naW4uYwppbmRleCA2NmZmNmFkZGU5OS4uODYyZTY1MGVmZWMgMTAwNjQ0 Ci0tLSBhL2NvbnRyaWIvcGdfdHJnbS90cmdtX2dpbi5jCisrKyBiL2NvbnRyaWIvcGdfdHJn bS90cmdtX2dpbi5jCkBAIC0zNiwxMCArMzYsMTIgQEAgZ2luX2V4dHJhY3RfdmFsdWVfdHJn bShQR19GVU5DVElPTl9BUkdTKQogewogCXRleHQJICAgKnZhbCA9ICh0ZXh0ICopIFBHX0dF VEFSR19URVhUX1BQKDApOwogCWludDMyCSAgICpuZW50cmllcyA9IChpbnQzMiAqKSBQR19H RVRBUkdfUE9JTlRFUigxKTsKKwlib29sCSAgICp1bmlxdWVBbmRTb3J0ZWQgPSAoYm9vbCAq KSBQR19HRVRBUkdfUE9JTlRFUigzKTsKIAlEYXR1bQkgICAqZW50cmllcyA9IE5VTEw7CiAJ VFJHTQkgICAqdHJnOwogCWludDMyCQl0cmdsZW47CiAKKwkqdW5pcXVlQW5kU29ydGVkID0g dHJ1ZTsKIAkqbmVudHJpZXMgPSAwOwogCiAJdHJnID0gZ2VuZXJhdGVfdHJnbShWQVJEQVRB X0FOWSh2YWwpLCBWQVJTSVpFX0FOWV9FWEhEUih2YWwpKTsKZGlmZiAtLWdpdCBhL2RvYy9z cmMvc2dtbC9naW4uc2dtbCBiL2RvYy9zcmMvc2dtbC9naW4uc2dtbAppbmRleCA4MjQxMGIx ZmJkZi4uYjk2NDc4NzMxZjggMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9naW4uc2dtbAor KysgYi9kb2Mvc3JjL3NnbWwvZ2luLnNnbWwKQEAgLTE2Nyw3ICsxNjcsNyBAQAogICA8dmFy aWFibGVsaXN0PgogICAgIDx2YXJsaXN0ZW50cnk+CiAgICAgIDx0ZXJtPjxmdW5jdGlvbj5E YXR1bSAqZXh0cmFjdFZhbHVlKERhdHVtIGl0ZW1WYWx1ZSwgaW50MzIgKm5rZXlzLAotICAg ICAgICBib29sICoqbnVsbEZsYWdzKTwvZnVuY3Rpb24+PC90ZXJtPgorICAgICAgICBib29s ICoqbnVsbEZsYWdzLCBib29sICp1bmlxdWVBbmRTb3J0ZWQpPC9mdW5jdGlvbj48L3Rlcm0+ CiAgICAgIDxsaXN0aXRlbT4KICAgICAgIDxwYXJhPgogICAgICAgIFJldHVybnMgYSBwYWxs b2MnZCBhcnJheSBvZiBrZXlzIGdpdmVuIGFuIGl0ZW0gdG8gYmUgaW5kZXhlZC4gIFRoZQpA QCAtMTc3LDYgKzE3NywxMSBAQAogICAgICAgIDxsaXRlcmFsPipudWxsRmxhZ3M8L2xpdGVy YWw+LCBhbmQgc2V0IHRoZXNlIG51bGwgZmxhZ3MgYXMgbmVlZGVkLgogICAgICAgIDxsaXRl cmFsPipudWxsRmxhZ3M8L2xpdGVyYWw+IGNhbiBiZSBsZWZ0IDxzeW1ib2w+TlVMTDwvc3lt Ym9sPiAoaXRzIGluaXRpYWwgdmFsdWUpCiAgICAgICAgaWYgYWxsIGtleXMgYXJlIG5vbi1u dWxsLgorICAgICAgIElmIHRoZSByZXR1cm5lZCBrZXlzIGRvIG5vdCBjb250YWluIGR1cGxp Y2F0ZXMgYW5kIGFyZSBzb3J0ZWQgdy5yLnQuIHRoZSBjb21wYXJpc29uCisgICAgICAgZnVu Y3Rpb24gb2YgdGhlIEdJTiB0eXBlJ3Mgb3BlcmF0b3IgY2xhc3MsIHN0b3JlIDxzeW1ib2w+ dHJ1ZTwvc3ltYm9sPiBpbgorICAgICAgIDxsaXRlcmFsPnVuaXF1ZUFuZFNvcnRlZDwvbGl0 ZXJhbD4uIDxsaXRlcmFsPnVuaXF1ZUFuZFNvcnRlZDwvbGl0ZXJhbD4gY2FuIGJlIGxlZnQK KyAgICAgICA8c3ltYm9sPmZhbHNlPC9zeW1ib2w+IChpdHMgaW5pdGlhbCB2YWx1ZSkgaWYg dGhlIGtleXMgYXJlIGVpdGhlciB1bnNvcnRlZCBvciBjb250YWluCisgICAgICAgZHVwbGlj YXRlcy4gSW4gdGhhdCBjYXNlLCBkdXBsaWNhdGUgcmVtb3ZhbCBhbmQgc29ydGluZyBpcyBw ZXJmb3JtZWQgYnkgdGhlIEdJTiBpbmRleC4KICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGNh biBiZSA8c3ltYm9sPk5VTEw8L3N5bWJvbD4gaWYgdGhlIGl0ZW0gY29udGFpbnMgbm8ga2V5 cy4KICAgICAgIDwvcGFyYT4KICAgICAgPC9saXN0aXRlbT4KZGlmZiAtLWdpdCBhL3NyYy9i YWNrZW5kL2FjY2Vzcy9naW4vZ2ludXRpbC5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9n aW51dGlsLmMKaW5kZXggNzVhMThmNDU3YmMuLjIyYjU4ODQ4M2QwIDEwMDY0NAotLS0gYS9z cmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbnV0aWwuYworKysgYi9zcmMvYmFja2VuZC9hY2Nl c3MvZ2luL2dpbnV0aWwuYwpAQCAtNDY0LDYgKzQ2NCw3IEBAIGdpbkV4dHJhY3RFbnRyaWVz KEdpblN0YXRlICpnaW5zdGF0ZSwgT2Zmc2V0TnVtYmVyIGF0dG51bSwKIHsKIAlEYXR1bQkg ICAqZW50cmllczsKIAlib29sCSAgICpudWxsRmxhZ3M7CisJYm9vbAkJdW5pcXVlQW5kU29y dGVkID0gZmFsc2U7CiAJaW50MzIJCWk7CiAKIAkvKgpAQCAtNDgzLDExICs0ODQsMTIgQEAg Z2luRXh0cmFjdEVudHJpZXMoR2luU3RhdGUgKmdpbnN0YXRlLCBPZmZzZXROdW1iZXIgYXR0 bnVtLAogCS8qIE9LLCBjYWxsIHRoZSBvcGNsYXNzJ3MgZXh0cmFjdFZhbHVlRm4gKi8KIAlu dWxsRmxhZ3MgPSBOVUxMOwkJCS8qIGluIGNhc2UgZXh0cmFjdFZhbHVlIGRvZXNuJ3Qgc2V0 IGl0ICovCiAJZW50cmllcyA9IChEYXR1bSAqKQotCQlEYXR1bUdldFBvaW50ZXIoRnVuY3Rp b25DYWxsM0NvbGwoJmdpbnN0YXRlLT5leHRyYWN0VmFsdWVGblthdHRudW0gLSAxXSwKKwkJ RGF0dW1HZXRQb2ludGVyKEZ1bmN0aW9uQ2FsbDRDb2xsKCZnaW5zdGF0ZS0+ZXh0cmFjdFZh bHVlRm5bYXR0bnVtIC0gMV0sCiAJCQkJCQkJCQkJICBnaW5zdGF0ZS0+c3VwcG9ydENvbGxh dGlvblthdHRudW0gLSAxXSwKIAkJCQkJCQkJCQkgIHZhbHVlLAogCQkJCQkJCQkJCSAgUG9p bnRlckdldERhdHVtKG5lbnRyaWVzKSwKLQkJCQkJCQkJCQkgIFBvaW50ZXJHZXREYXR1bSgm bnVsbEZsYWdzKSkpOworCQkJCQkJCQkJCSAgUG9pbnRlckdldERhdHVtKCZudWxsRmxhZ3Mp LAorCQkJCQkJCQkJCSAgUG9pbnRlckdldERhdHVtKCZ1bmlxdWVBbmRTb3J0ZWQpKSk7CiAK IAkvKgogCSAqIEdlbmVyYXRlIGEgcGxhY2Vob2xkZXIgaWYgdGhlIGl0ZW0gY29udGFpbmVk IG5vIGtleXMuCkBAIC01MDIsMTMgKzUwNCw2IEBAIGdpbkV4dHJhY3RFbnRyaWVzKEdpblN0 YXRlICpnaW5zdGF0ZSwgT2Zmc2V0TnVtYmVyIGF0dG51bSwKIAkJcmV0dXJuIGVudHJpZXM7 CiAJfQogCi0JLyoKLQkgKiBJZiB0aGUgZXh0cmFjdFZhbHVlRm4gZGlkbid0IGNyZWF0ZSBh IG51bGxGbGFncyBhcnJheSwgY3JlYXRlIG9uZSwKLQkgKiBhc3N1bWluZyB0aGF0IGV2ZXJ5 dGhpbmcncyBub24tbnVsbC4KLQkgKi8KLQlpZiAobnVsbEZsYWdzID09IE5VTEwpCi0JCW51 bGxGbGFncyA9IChib29sICopIHBhbGxvYzAoKm5lbnRyaWVzICogc2l6ZW9mKGJvb2wpKTsK LQogCS8qCiAJICogSWYgdGhlcmUncyBtb3JlIHRoYW4gb25lIGtleSwgc29ydCBhbmQgdW5p cXVlLWlmeS4KIAkgKgpAQCAtNTE2LDExICs1MTEsMTggQEAgZ2luRXh0cmFjdEVudHJpZXMo R2luU3RhdGUgKmdpbnN0YXRlLCBPZmZzZXROdW1iZXIgYXR0bnVtLAogCSAqIHByZXR0eSBi YWQgdG9vLiAgRm9yIHNtYWxsIG51bWJlcnMgb2Yga2V5cyBpdCdkIGxpa2VseSBiZSBiZXR0 ZXIgdG8gdXNlCiAJICogYSBzaW1wbGUgaW5zZXJ0aW9uIHNvcnQuCiAJICovCi0JaWYgKCpu ZW50cmllcyA+IDEpCisJaWYgKCpuZW50cmllcyA+IDEgJiYgIXVuaXF1ZUFuZFNvcnRlZCkK IAl7CiAJCWtleUVudHJ5RGF0YSAqa2V5ZGF0YTsKIAkJY21wRW50cmllc0FyZyBhcmc7CiAK KwkJLyoKKwkJICogSWYgdGhlIGV4dHJhY3RWYWx1ZUZuIGRpZG4ndCBjcmVhdGUgYSBudWxs RmxhZ3MgYXJyYXksIGNyZWF0ZSBvbmUsCisJCSAqIGFzc3VtaW5nIHRoYXQgZXZlcnl0aGlu ZydzIG5vbi1udWxsLgorCQkgKi8KKwkJaWYgKG51bGxGbGFncyA9PSBOVUxMKQorCQkJbnVs bEZsYWdzID0gKGJvb2wgKikgcGFsbG9jMCgqbmVudHJpZXMgKiBzaXplb2YoYm9vbCkpOwor CiAJCWtleWRhdGEgPSBwYWxsb2NfYXJyYXkoa2V5RW50cnlEYXRhLCAqbmVudHJpZXMpOwog CQlmb3IgKGkgPSAwOyBpIDwgKm5lbnRyaWVzOyBpKyspCiAJCXsKQEAgLTU2OCw5ICs1NzAs MTMgQEAgZ2luRXh0cmFjdEVudHJpZXMoR2luU3RhdGUgKmdpbnN0YXRlLCBPZmZzZXROdW1i ZXIgYXR0bnVtLAogCS8qCiAJICogQ3JlYXRlIEdpbk51bGxDYXRlZ29yeSByZXByZXNlbnRh dGlvbiBmcm9tIG51bGxGbGFncy4KIAkgKi8KLQkqY2F0ZWdvcmllcyA9IChHaW5OdWxsQ2F0 ZWdvcnkgKikgcGFsbG9jMCgqbmVudHJpZXMgKiBzaXplb2YoR2luTnVsbENhdGVnb3J5KSk7 Ci0JZm9yIChpID0gMDsgaSA8ICpuZW50cmllczsgaSsrKQotCQkoKmNhdGVnb3JpZXMpW2ld ID0gKG51bGxGbGFnc1tpXSA/IEdJTl9DQVRfTlVMTF9LRVkgOiBHSU5fQ0FUX05PUk1fS0VZ KTsKKwlTdGF0aWNBc3NlcnRTdG10KEdJTl9DQVRfTk9STV9LRVkgPT0gMCwgIkFzc3VtaW5n IEdJTl9DQVRfTk9STV9LRVkgaXMgMCIpOworCSpjYXRlZ29yaWVzID0gcGFsbG9jMF9hcnJh eShHaW5OdWxsQ2F0ZWdvcnksICpuZW50cmllcyk7CisKKwlpZiAobnVsbEZsYWdzICE9IE5V TEwpCisJCWZvciAoaSA9IDA7IGkgPCAqbmVudHJpZXM7IGkrKykKKwkJCWlmIChudWxsRmxh Z3NbaV0pCisJCQkJKCpjYXRlZ29yaWVzKVtpXSA9IEdJTl9DQVRfTlVMTF9LRVk7CiAKIAly ZXR1cm4gZW50cmllczsKIH0KLS0gCjIuNTEuMAoK --------------zG5CcYGocnDFmMDep3YanWGC Content-Type: text/x-patch; charset=UTF-8; name="v2-0003-Use-sort_template.h.patch" Content-Disposition: attachment; filename="v2-0003-Use-sort_template.h.patch" Content-Transfer-Encoding: base64 RnJvbSBjMzhmMzUxN2QwNWQzY2VmYTBmYzZkOTk0ZjRlOGY2YWMxNDI3M2Q5IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBHZWllciA8Z2VpZGF2LnBnQGdtYWlsLmNv bT4KRGF0ZTogTW9uLCAxMCBOb3YgMjAyNSAxMzozNToxMSArMDEwMApTdWJqZWN0OiBbUEFU Q0ggdjIgMy84XSBVc2Ugc29ydF90ZW1wbGF0ZS5oCgotLS0KIGNvbnRyaWIvcGdfdHJnbS90 cmdtX29wLmMgfCA0NyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0K IDEgZmlsZSBjaGFuZ2VkLCAzNyBpbnNlcnRpb25zKCspLCAxMCBkZWxldGlvbnMoLSkKCmRp ZmYgLS1naXQgYS9jb250cmliL3BnX3RyZ20vdHJnbV9vcC5jIGIvY29udHJpYi9wZ190cmdt L3RyZ21fb3AuYwppbmRleCA4MTE4MmExNWUwNy4uNmFmMTIwZmExYWQgMTAwNjQ0Ci0tLSBh L2NvbnRyaWIvcGdfdHJnbS90cmdtX29wLmMKKysrIGIvY29udHJpYi9wZ190cmdtL3RyZ21f b3AuYwpAQCAtMTU0LDYgKzE1NCwyMyBAQCBDTVBUUkdNX0NIT09TRShjb25zdCB2b2lkICph LCBjb25zdCB2b2lkICpiKQogCXJldHVybiBDTVBUUkdNKGEsIGIpOwogfQogCisvKiBEZWZp bmUgb3VyIHNwZWNpYWxpemVkIHNvcnQgZnVuY3Rpb24gbmFtZSAqLworI2RlZmluZSBTVF9T T1JUIHRyaWdyYW1fcXNvcnRfc2lnbmVkCisjZGVmaW5lIFNUX0VMRU1FTlRfVFlQRV9WT0lE CisjZGVmaW5lIFNUX0NPTVBBUkUoYSwgYikgQ01QVFJHTV9TSUdORUQoYSwgYikKKyNkZWZp bmUgU1RfU0NPUEUgc3RhdGljCisjZGVmaW5lIFNUX0RFRklORQorI2RlZmluZSBTVF9ERUNM QVJFCisjaW5jbHVkZSAibGliL3NvcnRfdGVtcGxhdGUuaCIKKworI2RlZmluZSBTVF9TT1JU IHRyaWdyYW1fcXNvcnRfdW5zaWduZWQKKyNkZWZpbmUgU1RfRUxFTUVOVF9UWVBFX1ZPSUQK KyNkZWZpbmUgU1RfQ09NUEFSRShhLCBiKSBDTVBUUkdNX1VOU0lHTkVEKGEsIGIpCisjZGVm aW5lIFNUX1NDT1BFIHN0YXRpYworI2RlZmluZSBTVF9ERUZJTkUKKyNkZWZpbmUgU1RfREVD TEFSRQorI2luY2x1ZGUgImxpYi9zb3J0X3RlbXBsYXRlLmgiCisKIC8qCiAgKiBEZXByZWNh dGVkIGZ1bmN0aW9uLgogICogVXNlICJwZ190cmdtLnNpbWlsYXJpdHlfdGhyZXNob2xkIiBH VUMgdmFyaWFibGUgaW5zdGVhZCBvZiB0aGlzIGZ1bmN0aW9uLgpAQCAtMjA5LDEyICsyMjYs NiBAQCBzaG93X2xpbWl0KFBHX0ZVTkNUSU9OX0FSR1MpCiAJUEdfUkVUVVJOX0ZMT0FUNChz aW1pbGFyaXR5X3RocmVzaG9sZCk7CiB9CiAKLXN0YXRpYyBpbnQKLWNvbXBfdHJnbShjb25z dCB2b2lkICphLCBjb25zdCB2b2lkICpiKQotewotCXJldHVybiBDTVBUUkdNKGEsIGIpOwot fQotCiAvKgogICogRmluZHMgZmlyc3Qgd29yZCBpbiBzdHJpbmcsIHJldHVybnMgcG9pbnRl ciB0byB0aGUgd29yZCwKICAqIGVuZHdvcmQgcG9pbnRzIHRvIHRoZSBjaGFyYWN0ZXIgYWZ0 ZXIgd29yZApAQCAtNDI2LDggKzQzNywxNiBAQCBnZW5lcmF0ZV90cmdtKGNoYXIgKnN0ciwg aW50IHNsZW4pCiAJICovCiAJaWYgKGxlbiA+IDEpCiAJewotCQlxc29ydChHRVRBUlIodHJn KSwgbGVuLCBzaXplb2YodHJnbSksIGNvbXBfdHJnbSk7Ci0JCWxlbiA9IHF1bmlxdWUoR0VU QVJSKHRyZyksIGxlbiwgc2l6ZW9mKHRyZ20pLCBjb21wX3RyZ20pOworCQlpZiAoR2V0RGVm YXVsdENoYXJTaWduZWRuZXNzKCkpCisJCXsKKwkJCXRyaWdyYW1fcXNvcnRfc2lnbmVkKCh2 b2lkICopIEdFVEFSUih0cmcpLCBsZW4sIHNpemVvZih0cmdtKSk7CisJCQlsZW4gPSBxdW5p cXVlKEdFVEFSUih0cmcpLCBsZW4sIHNpemVvZih0cmdtKSwgQ01QVFJHTV9TSUdORUQpOwor CQl9CisJCWVsc2UKKwkJeworCQkJdHJpZ3JhbV9xc29ydF91bnNpZ25lZCgodm9pZCAqKSBH RVRBUlIodHJnKSwgbGVuLCBzaXplb2YodHJnbSkpOworCQkJbGVuID0gcXVuaXF1ZShHRVRB UlIodHJnKSwgbGVuLCBzaXplb2YodHJnbSksIENNUFRSR01fVU5TSUdORUQpOworCQl9CiAJ fQogCiAJU0VUX1ZBUlNJWkUodHJnLCBDQUxDR1RTSVpFKEFSUktFWSwgbGVuKSk7CkBAIC05 NzQsOCArOTkzLDE2IEBAIGdlbmVyYXRlX3dpbGRjYXJkX3RyZ20oY29uc3QgY2hhciAqc3Ry LCBpbnQgc2xlbikKIAkgKi8KIAlpZiAobGVuID4gMSkKIAl7Ci0JCXFzb3J0KEdFVEFSUih0 cmcpLCBsZW4sIHNpemVvZih0cmdtKSwgY29tcF90cmdtKTsKLQkJbGVuID0gcXVuaXF1ZShH RVRBUlIodHJnKSwgbGVuLCBzaXplb2YodHJnbSksIGNvbXBfdHJnbSk7CisJCWlmIChHZXRE ZWZhdWx0Q2hhclNpZ25lZG5lc3MoKSkKKwkJeworCQkJdHJpZ3JhbV9xc29ydF9zaWduZWQo KHZvaWQgKikgR0VUQVJSKHRyZyksIGxlbiwgc2l6ZW9mKHRyZ20pKTsKKwkJCWxlbiA9IHF1 bmlxdWUoR0VUQVJSKHRyZyksIGxlbiwgc2l6ZW9mKHRyZ20pLCBDTVBUUkdNX1NJR05FRCk7 CisJCX0KKwkJZWxzZQorCQl7CisJCQl0cmlncmFtX3Fzb3J0X3Vuc2lnbmVkKCh2b2lkICop IEdFVEFSUih0cmcpLCBsZW4sIHNpemVvZih0cmdtKSk7CisJCQlsZW4gPSBxdW5pcXVlKEdF VEFSUih0cmcpLCBsZW4sIHNpemVvZih0cmdtKSwgQ01QVFJHTV9VTlNJR05FRCk7CisJCX0K IAl9CiAKIAlTRVRfVkFSU0laRSh0cmcsIENBTENHVFNJWkUoQVJSS0VZLCBsZW4pKTsKLS0g CjIuNTEuMAoK --------------zG5CcYGocnDFmMDep3YanWGC Content-Type: text/x-patch; charset=UTF-8; name="v2-0002-Optimized-comparison-functions.patch" Content-Disposition: attachment; filename="v2-0002-Optimized-comparison-functions.patch" Content-Transfer-Encoding: base64 RnJvbSBhZTgwYzJkYzE5MDQ5M2Y4Yzk4MTFjMTk0OWM3ZWJjZWQyNjVhYmQ1IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBHZWllciA8Z2VpZGF2LnBnQGdtYWlsLmNv bT4KRGF0ZTogTW9uLCAxMCBOb3YgMjAyNSAxMzozNTowMSArMDEwMApTdWJqZWN0OiBbUEFU Q0ggdjIgMi84XSBPcHRpbWl6ZWQgY29tcGFyaXNvbiBmdW5jdGlvbnMKCi0tLQogc3JjL2Jh Y2tlbmQvYWNjZXNzL2dpbi9naW51dGlsLmMgfCAyMyArKysrKysrKysrKysrKysrLS0tLS0t LQogc3JjL2luY2x1ZGUvYWNjZXNzL2dpbl9wcml2YXRlLmggfCAxOSArKysrKysrKysrKysr KystLS0tCiAyIGZpbGVzIGNoYW5nZWQsIDMxIGluc2VydGlvbnMoKyksIDExIGRlbGV0aW9u cygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2ludXRpbC5jIGIv c3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9naW51dGlsLmMKaW5kZXggZDIwNTA5M2UyMWQuLjc1 YTE4ZjQ1N2JjIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbnV0aWwu YworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbnV0aWwuYwpAQCAtMTE0LDYgKzEx NCw3IEBAIGluaXRHaW5TdGF0ZShHaW5TdGF0ZSAqc3RhdGUsIFJlbGF0aW9uIGluZGV4KQog CWZvciAoaSA9IDA7IGkgPCBvcmlnVHVwZGVzYy0+bmF0dHM7IGkrKykKIAl7CiAJCUZvcm1f cGdfYXR0cmlidXRlIGF0dHIgPSBUdXBsZURlc2NBdHRyKG9yaWdUdXBkZXNjLCBpKTsKKwkJ RnVuY3Rpb25DYWxsSW5mb0Jhc2VEYXRhICpmY2kgID0gJnN0YXRlLT5jb21wYXJlRm5DYWxs SW5mb1tpXS5mY2luZm87CiAKIAkJaWYgKHN0YXRlLT5vbmVDb2wpCiAJCQlzdGF0ZS0+dHVw ZGVzY1tpXSA9IHN0YXRlLT5vcmlnVHVwZGVzYzsKQEAgLTIyMiw2ICsyMjMsMTAgQEAgaW5p dEdpblN0YXRlKEdpblN0YXRlICpzdGF0ZSwgUmVsYXRpb24gaW5kZXgpCiAJCQlzdGF0ZS0+ c3VwcG9ydENvbGxhdGlvbltpXSA9IGluZGV4LT5yZF9pbmRjb2xsYXRpb25baV07CiAJCWVs c2UKIAkJCXN0YXRlLT5zdXBwb3J0Q29sbGF0aW9uW2ldID0gREVGQVVMVF9DT0xMQVRJT05f T0lEOworCisJCUluaXRGdW5jdGlvbkNhbGxJbmZvRGF0YSgqZmNpLCAmc3RhdGUtPmNvbXBh cmVGbltpXSwgMiwgc3RhdGUtPnN1cHBvcnRDb2xsYXRpb25baV0sIE5VTEwsIE5VTEwpOwor CQlmY2ktPmFyZ3NbMF0uaXNudWxsID0gZmFsc2U7CisJCWZjaS0+YXJnc1sxXS5pc251bGwg PSBmYWxzZTsKIAl9CiB9CiAKQEAgLTQwMiw4ICs0MDcsNyBAQCB0eXBlZGVmIHN0cnVjdAog CiB0eXBlZGVmIHN0cnVjdAogewotCUZtZ3JJbmZvICAgKmNtcERhdHVtRnVuYzsKLQlPaWQJ CQljb2xsYXRpb247CisJRnVuY3Rpb25DYWxsSW5mb0Jhc2VEYXRhICAgKmNtcEZ1bmNJbmZv OwogCWJvb2wJCWhhdmVEdXBzOwogfSBjbXBFbnRyaWVzQXJnOwogCkBAIC00MjUsOSArNDI5 LDE1IEBAIGNtcEVudHJpZXMoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYiwgdm9pZCAq YXJnKQogCWVsc2UgaWYgKGJiLT5pc251bGwpCiAJCXJlcyA9IC0xOwkJCQkvKiBub3QtTlVM TCAiPCIgTlVMTCAqLwogCWVsc2UKLQkJcmVzID0gRGF0dW1HZXRJbnQzMihGdW5jdGlvbkNh bGwyQ29sbChkYXRhLT5jbXBEYXR1bUZ1bmMsCi0JCQkJCQkJCQkJCSAgZGF0YS0+Y29sbGF0 aW9uLAotCQkJCQkJCQkJCQkgIGFhLT5kYXR1bSwgYmItPmRhdHVtKSk7CisJeworCQlGdW5j dGlvbkNhbGxJbmZvIGZjaSA9IGRhdGEtPmNtcEZ1bmNJbmZvOworCQlmY2ktPmFyZ3NbMF0u dmFsdWUgPSBhYS0+ZGF0dW07CisJCWZjaS0+YXJnc1sxXS52YWx1ZSA9IGJiLT5kYXR1bTsK KwkJcmVzID0gRGF0dW1HZXRJbnQzMihGdW5jdGlvbkNhbGxJbnZva2UoZmNpKSk7CisKKwkJ aWYgKGZjaS0+aXNudWxsKQorCQkJZWxvZyhFUlJPUiwgImZ1bmN0aW9uICV1IHJldHVybmVk IE5VTEwiLCBmY2ktPmZsaW5mby0+Zm5fb2lkKTsKKwl9CiAKIAkvKgogCSAqIERldGVjdCBp ZiB3ZSBoYXZlIGFueSBkdXBsaWNhdGVzLiAgSWYgdGhlcmUgYXJlIGVxdWFsIGtleXMsIHFz b3J0IG11c3QKQEAgLTUxOCw4ICs1MjgsNyBAQCBnaW5FeHRyYWN0RW50cmllcyhHaW5TdGF0 ZSAqZ2luc3RhdGUsIE9mZnNldE51bWJlciBhdHRudW0sCiAJCQlrZXlkYXRhW2ldLmlzbnVs bCA9IG51bGxGbGFnc1tpXTsKIAkJfQogCi0JCWFyZy5jbXBEYXR1bUZ1bmMgPSAmZ2luc3Rh dGUtPmNvbXBhcmVGblthdHRudW0gLSAxXTsKLQkJYXJnLmNvbGxhdGlvbiA9IGdpbnN0YXRl LT5zdXBwb3J0Q29sbGF0aW9uW2F0dG51bSAtIDFdOworCQlhcmcuY21wRnVuY0luZm8gPSAm Z2luc3RhdGUtPmNvbXBhcmVGbkNhbGxJbmZvW2F0dG51bSAtIDFdLmZjaW5mbzsKIAkJYXJn LmhhdmVEdXBzID0gZmFsc2U7CiAJCXFzb3J0X2FyZyhrZXlkYXRhLCAqbmVudHJpZXMsIHNp emVvZihrZXlFbnRyeURhdGEpLAogCQkJCSAgY21wRW50cmllcywgJmFyZyk7CmRpZmYgLS1n aXQgYS9zcmMvaW5jbHVkZS9hY2Nlc3MvZ2luX3ByaXZhdGUuaCBiL3NyYy9pbmNsdWRlL2Fj Y2Vzcy9naW5fcHJpdmF0ZS5oCmluZGV4IGUxNTUwNDVjZThhLi43Y2YxOWM4YTVkYyAxMDA2 NDQKLS0tIGEvc3JjL2luY2x1ZGUvYWNjZXNzL2dpbl9wcml2YXRlLmgKKysrIGIvc3JjL2lu Y2x1ZGUvYWNjZXNzL2dpbl9wcml2YXRlLmgKQEAgLTUxLDYgKzUxLDExIEBAIHR5cGVkZWYg c3RydWN0IEdpbk9wdGlvbnMKICNkZWZpbmUgR0lOX1NIQVJFCUJVRkZFUl9MT0NLX1NIQVJF CiAjZGVmaW5lIEdJTl9FWENMVVNJVkUgIEJVRkZFUl9MT0NLX0VYQ0xVU0lWRQogCit0eXBl ZGVmIHVuaW9uIENvbXBhcmVGdW5jQ2FsbEluZm9EYXRhCit7CisJRnVuY3Rpb25DYWxsSW5m b0Jhc2VEYXRhIGZjaW5mbzsKKwljaGFyIGZjaW5mb19kYXRhW1NpemVGb3JGdW5jdGlvbkNh bGxJbmZvKDIpXTsKK30gQ29tcGFyZUZ1bmNDYWxsSW5mb0RhdGE7CiAKIC8qCiAgKiBHaW5T dGF0ZTogd29ya2luZyBkYXRhIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBpbmRleCBiZWlu ZyB3b3JrZWQgb24KQEAgLTc3LDYgKzgyLDEwIEBAIHR5cGVkZWYgc3RydWN0IEdpblN0YXRl CiAJLyoKIAkgKiBQZXItaW5kZXgtY29sdW1uIG9wY2xhc3Mgc3VwcG9ydCBmdW5jdGlvbnMK IAkgKi8KKworCisJQ29tcGFyZUZ1bmNDYWxsSW5mb0RhdGEgY29tcGFyZUZuQ2FsbEluZm9b SU5ERVhfTUFYX0tFWVNdOworCiAJRm1nckluZm8JY29tcGFyZUZuW0lOREVYX01BWF9LRVlT XTsKIAlGbWdySW5mbwlleHRyYWN0VmFsdWVGbltJTkRFWF9NQVhfS0VZU107CiAJRm1ncklu Zm8JZXh0cmFjdFF1ZXJ5Rm5bSU5ERVhfTUFYX0tFWVNdOwpAQCAtNTA0LDYgKzUxMyw4IEBA IGdpbkNvbXBhcmVFbnRyaWVzKEdpblN0YXRlICpnaW5zdGF0ZSwgT2Zmc2V0TnVtYmVyIGF0 dG51bSwKIAkJCQkgIERhdHVtIGEsIEdpbk51bGxDYXRlZ29yeSBjYXRlZ29yeWEsCiAJCQkJ ICBEYXR1bSBiLCBHaW5OdWxsQ2F0ZWdvcnkgY2F0ZWdvcnliKQogeworCUZ1bmN0aW9uQ2Fs bEluZm9CYXNlRGF0YSAqZmNpOworCiAJLyogaWYgbm90IG9mIHNhbWUgbnVsbCBjYXRlZ29y eSwgc29ydCBieSB0aGF0IGZpcnN0ICovCiAJaWYgKGNhdGVnb3J5YSAhPSBjYXRlZ29yeWIp CiAJCXJldHVybiAoY2F0ZWdvcnlhIDwgY2F0ZWdvcnliKSA/IC0xIDogMTsKQEAgLTUxMiwx MCArNTIzLDEwIEBAIGdpbkNvbXBhcmVFbnRyaWVzKEdpblN0YXRlICpnaW5zdGF0ZSwgT2Zm c2V0TnVtYmVyIGF0dG51bSwKIAlpZiAoY2F0ZWdvcnlhICE9IEdJTl9DQVRfTk9STV9LRVkp CiAJCXJldHVybiAwOwogCi0JLyogYm90aCBub3QgbnVsbCwgc28gc2FmZSB0byBjYWxsIHRo ZSBjb21wYXJlRm4gKi8KLQlyZXR1cm4gRGF0dW1HZXRJbnQzMihGdW5jdGlvbkNhbGwyQ29s bCgmZ2luc3RhdGUtPmNvbXBhcmVGblthdHRudW0gLSAxXSwKLQkJCQkJCQkJCQkgICBnaW5z dGF0ZS0+c3VwcG9ydENvbGxhdGlvblthdHRudW0gLSAxXSwKLQkJCQkJCQkJCQkgICBhLCBi KSk7CisJZmNpID0gJmdpbnN0YXRlLT5jb21wYXJlRm5DYWxsSW5mb1thdHRudW0gLSAxXS5m Y2luZm87CisJZmNpLT5hcmdzWzBdLnZhbHVlID0gYTsKKwlmY2ktPmFyZ3NbMV0udmFsdWUg PSBiOworCXJldHVybiBEYXR1bUdldEludDMyKEZ1bmN0aW9uQ2FsbEludm9rZShmY2kpKTsK IH0KIAogLyoKLS0gCjIuNTEuMAoK --------------zG5CcYGocnDFmMDep3YanWGC Content-Type: text/x-patch; charset=UTF-8; name="v2-0001-Inline-ginCompareAttEntries.patch" Content-Disposition: attachment; filename="v2-0001-Inline-ginCompareAttEntries.patch" Content-Transfer-Encoding: base64 RnJvbSBhNDg0ZTdjNjliZWM2MjQ3NGIwNDFlYjRlNTMzNjAxZTQ4ODNkYWIzIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBHZWllciA8Z2VpZGF2LnBnQGdtYWlsLmNv bT4KRGF0ZTogVGh1LCA2IE5vdiAyMDI1IDA5OjQyOjI3ICswMTAwClN1YmplY3Q6IFtQQVRD SCB2MiAxLzhdIElubGluZSBnaW5Db21wYXJlQXR0RW50cmllcwoKLS0tCiBzcmMvYmFja2Vu 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== --------------zG5CcYGocnDFmMDep3YanWGC--