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 1x681L-0002zK-0H for pgsql-hackers@arkaria.postgresql.org; Mon, 14 Sep 2026 14:51:00 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1x681K-00Dlh7-1G for pgsql-hackers@arkaria.postgresql.org; Mon, 14 Sep 2026 14:50:58 +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 1x681J-00Dlgu-1r for pgsql-hackers@lists.postgresql.org; Mon, 14 Sep 2026 14:50:58 +0000 Received: from mail-yx1-xb131.google.com ([2607:f8b0:4864:20::b131]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1x681F-0000000026H-2Xzj for pgsql-hackers@lists.postgresql.org; Mon, 14 Sep 2026 14:50:56 +0000 Received: by mail-yx1-xb131.google.com with SMTP id 956f58d0204a3-670f572e814so1995092d50.1 for ; Mon, 14 Sep 2026 07:50:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dunslane-net.20251104.gappssmtp.com; s=20251104; t=1789397452; x=1790002252; darn=lists.postgresql.org; h=to:subject:content-language:from:user-agent:mime-version:date :message-id:content-type:from:to:cc:subject:date:message-id:reply-to :content-type; bh=nhNIpXcDsP6r/E/G3T+tW2ahDn2VxUdUDDWrUoVTqOM=; b=Ny3G+/TQgmYhdMKPVGV2O4r6cblkptBhL6yKM1yP2VTjcC94kifGTBjH1V+W9VQVOE qsgPVxk72uXewHoEboOIa9I63ur/h+FCDiHNeT0ydBp5Av2XC46VvxBZhF21gDg2pW7+ 7G+Tfl/LHNeVfEvphCKY3y1MAD9S0OEA5/09a5hs6jtKQQhDbN8TMVxu0kINdNHU1/qW 48Yn4NtkjpHvW/SA+3Z3kFl203QAD52HZzfgBIx8OC7JMIhTazeoi3DeSwe3E3pyHHDF DSxUgt1ejdqzvcwI+4OTHsQQoBul9IYXQIP9TWdXp2Id+DkzfkAboK3l5jMVDRZJM1g/ Glyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789397452; x=1790002252; h=to:subject:content-language:from:user-agent:mime-version:date :message-id:content-type:x-gm-gg:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to:content-type; bh=nhNIpXcDsP6r/E/G3T+tW2ahDn2VxUdUDDWrUoVTqOM=; b=Eti0Rbf7xmxcNVsXhW/xO2Sq+6nJwo+z9K7637GJRpFKgwpCKfJCBzgoRtUOH6Ggw2 8r74PA7XTsNqb1jXDwRHViULhSTNyZFGI6svvdDQxu2ypX/Q9NAo6r3r9mAAdqkPPfj4 rYQZKWINM85mhAt46r5Y205RVbQLsrnGyRWGZQA00pS5/ZWWLDXHScy3faUXCQ4HHvNr 3Vs7U/3Ytim8a+d96ky0wOscIfUTuLEzyoE0JqvpD2FNYDm16UQ6XFXXu2WeC/NuPhwN 5/luvTWJ5t8+UF4r0UGSRgNj8+y/yrD7HOc/4G1QxG6CeXn/42+fa+usEmmnbqpdDAI8 6dgg== X-Gm-Message-State: AFuF++m8KdlULd5t25OVO21lk8splVwB7JdcGkOmRGV1QFWryUYO+erA Cdj1V6QgKMwmjTkFG85WQuqAoMCNySLRy7MQTIXO2Vopi/3JY9GtRbuz9TG4CY5BwOfrr71zEG4 YmOfsZU4= X-Gm-Gg: AYBFou0H7OZJ/lBEolj9K0m1sDPlxWsxzTMdSgxyW+ylot4TBz8+eUMu8CN3B5/ihys Ld+SO/74sBsNO8dhmv3h5vZOeIfNqitFHZbuxNirKcppg03gNBQRbzhfxcMNDrbatGqHrUJUhEQ SVViT8J08fDiP0vwNzo6wgpw2QLfRtjjngstxBuVcKJxpBoJGoFizNRrI4FpljWjN9vyMsTN4Fi LQ78G6vUJI60B2t43yIe5M1UVRgQFQ7H+ilOMlREIBPxGonRQ828EvzWXghK1BCRxcEXeRhVr8O z4oS77qGz41VGnVGTdfMvr1seqTDxAUNQY3unhHOZiTqzBt/+HqqTGzhG5V93eI95Xb0wCfsNiF i2xGoywhxO7iXJui37vC9wpJasf1kuNEaaMFMkCX4yGoOk06TrQpXP1k2HnTDZz2dLfXG00OEdf VF8Dyg/cNVwaPqn5lVpSnjaUamIp7kcjc+umyNUNOV1Q38YKwn+ha9QgsNj8kldspMsxCsiijD6 r79HE5IBQ== X-Received: by 2002:a05:690e:1548:20b0:66f:c1bc:4062 with SMTP id 956f58d0204a3-67142ccc7abmr803698d50.42.1789397446759; Mon, 14 Sep 2026 07:50:46 -0700 (PDT) Received: from ?IPV6:2605:a601:a6a6:4300::303? ([2605:a601:a6a6:4300::303]) by smtp.gmail.com with ESMTPSA id 956f58d0204a3-67125e7f5b9sm4705001d50.18.2026.09.14.07.50.46 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 14 Sep 2026 07:50:46 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------76LdLCQNBp18TuTgCciLM4g1" Message-ID: <8cb366d6-a30f-49a4-b5d3-a5dfc0f2fea2@dunslane.net> Date: Mon, 14 Sep 2026 10:50:45 -0400 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird From: Andrew Dunstan Content-Language: en-US Subject: Add ASCII fast path to Unicode normalization functions To: PostgreSQL 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. --------------76LdLCQNBp18TuTgCciLM4g1 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi, A linkedin post comparing CedarDB's new Unicode normalization support to PostgreSQL's caught my eye [1]: same results, but a claimed 30x speedup on "SELECT count(*) FROM hits WHERE url IS NORMALIZED" over ClickBench's hits table. Most of that turned out to be down to CedarDB using all available threads by default versus our max_parallel_workers_per_gather of 2. But even at the matched thread count they reported a 6x edge, attributed to two things: an ASCII fast path (most URLs are already normalized ASCII, so you can skip decoding entirely), and vectorized byte scanning for the ASCII check itself. I went and looked, and unicode_is_normalized(), unicode_assigned(), and normalize() all decode every string to an array of char32_t codepoints, one utf8_to_unicode()/pg_utf_mblen() call at a time, before doing any real work -- including on input that's already pure ASCII. The attached patch adds a fast path: scan the raw bytes for anything with the high bit set, using the SIMD-vectorized is_valid_ascii() we already have (currently only used inside pg_utf8_verifystr()). If nothing is found, the string is trivially normalized (ASCII code points have no canonical or compatibility decomposition, and a combining class of zero) and every code point in it is assigned, so all three functions can return immediately. I deliberately didn't copy CedarDB's trick of comparing byte length to codepoint count -- getting the codepoint count means calling pg_mbstrlen_with_len(), exactly the scalar work this patch avoids. Scanning raw bytes with is_valid_ascii() instead reuses SIMD infrastructure we already have, and is cheaper to begin with: a single reduction versus a population count. Benchmarked with data sized to fit comfortably under shared_buffers rather than triggering the seqscan ring-buffer bypass, which otherwise swamps the comparison at larger table sizes: ~10x on pure ASCII, ~4x on an 85/15 ASCII/non-ASCII mix, and no measurable regression on non-ASCII input that still needs the full decode-and-quickcheck path. Regression tests cover the ASCII-hit case for all three functions, plus a boundary sweep that plants a non-NFC sequence at varying offsets around ASCII padding, to catch any off-by-one in the SIMD-chunk/scalar- remainder split. cheers andrew [1] https://lnkd.in/p/eKUqSj73 -- Andrew Dunstan EDB: https://www.enterprisedb.com --------------76LdLCQNBp18TuTgCciLM4g1 Content-Type: text/x-patch; charset=UTF-8; name="0001-Add-ASCII-fast-path-to-Unicode-normalization-functio.patch" Content-Disposition: attachment; filename*0="0001-Add-ASCII-fast-path-to-Unicode-normalization-functio.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSAwNjY2MjU2YTAyMWFiNGQ4YzgxOTNkMjNlMDAxYTUyZjc1ZmE4OTNkIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZXcgRHVuc3RhbiA8YW5kcmV3QGR1bnNsYW5l Lm5ldD4KRGF0ZTogU3VuLCAxMyBTZXAgMjAyNiAxNzoxMzoxNSAtMDQwMApTdWJqZWN0OiBb UEFUQ0hdIEFkZCBBU0NJSSBmYXN0IHBhdGggdG8gVW5pY29kZSBub3JtYWxpemF0aW9uIGZ1 bmN0aW9ucwoKdW5pY29kZV9pc19ub3JtYWxpemVkKCksIHVuaWNvZGVfYXNzaWduZWQoKSwg YW5kIHVuaWNvZGVfbm9ybWFsaXplX2Z1bmMoKQplYWNoIGRlY29kZWQgaXRzIGlucHV0IHRv IGFuIGFycmF5IG9mIGNoYXIzMl90IGNvZGVwb2ludHMsIG9uZQp1dGY4X3RvX3VuaWNvZGUo KS9wZ191dGZfbWJsZW4oKSBjYWxsIGF0IGEgdGltZSwgYmVmb3JlIGRvaW5nIGFueSByZWFs CndvcmsuICBBIHN0cmluZyB0aGF0IGlzIGVudGlyZWx5IEFTQ0lJIChjb2RlIHBvaW50cyAw LTEyNykgaGFzIG5vCmNhbm9uaWNhbCBvciBjb21wYXRpYmlsaXR5IGRlY29tcG9zaXRpb24g YW55d2hlcmUgaW4gaXQsIGFuZCBhCmNvbWJpbmluZyBjbGFzcyBvZiB6ZXJvIHRocm91Z2hv dXQsIHNvIGl0IGlzIHRyaXZpYWxseSBub3JtYWxpemVkCnVuZGVyIE5GQy9ORktDL05GRC9O RktEIGFsaWtlLiAgRXZlcnkgb25lIG9mIGl0cyBjb2RlIHBvaW50cyBpcwphc3NpZ25lZCB0 b28uICBEZXRlY3QgdGhhdCBjYXNlIHVwIGZyb250IHdpdGggYSBieXRlIHNjYW4gdXNpbmcg dGhlCmV4aXN0aW5nIFNJTUQtdmVjdG9yaXplZCBpc192YWxpZF9hc2NpaSgpIChhbHJlYWR5 IHVzZWQgYnkKcGdfdXRmOF92ZXJpZnlzdHIoKSksIGFuZCBza2lwIHRoZSBkZWNvZGUgbG9v cCBhbmQgcGVyLWNvZGVwb2ludCB3b3JrCmVudGlyZWx5LgoKQWRkIHJlZ3Jlc3Npb24gY292 ZXJhZ2UgZm9yIHRoZSBBU0NJSS1oaXQgY2FzZSBpbiBhbGwgdGhyZWUgZnVuY3Rpb25zLApw bHVzIGEgY2h1bmsvcmVtYWluZGVyIGJvdW5kYXJ5IHN3ZWVwIHRoYXQgcGxhbnRzIGEgbm9u LU5GQyBzZXF1ZW5jZSBhdAp2YXJ5aW5nIG9mZnNldHMgdG8gY2F0Y2ggYW55IG9mZi1ieS1v bmUgaW4gdGV4dF9pc19hc2NpaSgpJ3MgU0lNRC8Kc2NhbGFyIHNwbGl0LgotLS0KIHNyYy9i YWNrZW5kL3V0aWxzL2FkdC92YXJsZW5hLmMgICAgICAgfCA0NyArKysrKysrKysrKysrKysr CiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3VuaWNvZGUub3V0IHwgNzggKysrKysrKysr KysrKysrKysrKysrKysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC91bmljb2RlLnNxbCAg ICAgIHwgMTQgKysrKysKIDMgZmlsZXMgY2hhbmdlZCwgMTM5IGluc2VydGlvbnMoKykKCmRp ZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvdmFybGVuYS5jIGIvc3JjL2JhY2tl bmQvdXRpbHMvYWR0L3ZhcmxlbmEuYwppbmRleCBmNmE0MWU3MDlhZS4uMWI2MDEzZmFjYzIg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC92YXJsZW5hLmMKKysrIGIvc3Jj L2JhY2tlbmQvdXRpbHMvYWR0L3ZhcmxlbmEuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1 ZGUgInBhcnNlci9zY2Fuc3VwLmgiCiAjaW5jbHVkZSAicG9ydC9wZ19ic3dhcC5oIgogI2lu Y2x1ZGUgInJlZ2V4L3JlZ2V4LmgiCisjaW5jbHVkZSAidXRpbHMvYXNjaWkuaCIKICNpbmNs dWRlICJ1dGlscy9idWlsdGlucy5oIgogI2luY2x1ZGUgInV0aWxzL2d1Yy5oIgogI2luY2x1 ZGUgInV0aWxzL2xzeXNjYWNoZS5oIgpAQCAtMTY3LDYgKzE2OCw3IEBAIHN0YXRpYyB2b2lk IHRleHRfZm9ybWF0X3N0cmluZ19jb252ZXJzaW9uKFN0cmluZ0luZm8gYnVmLCBjaGFyIGNv bnZlcnNpb24sCiAJCQkJCQkJCQkJICBpbnQgZmxhZ3MsIGludCB3aWR0aCk7CiBzdGF0aWMg dm9pZCB0ZXh0X2Zvcm1hdF9hcHBlbmRfc3RyaW5nKFN0cmluZ0luZm8gYnVmLCBjb25zdCBj aGFyICpzdHIsCiAJCQkJCQkJCQkgIGludCBmbGFncywgaW50IHdpZHRoKTsKK3N0YXRpYyBi b29sIHRleHRfaXNfYXNjaWkodGV4dCAqdCk7CiAKIAogLyoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqCkBAIC01NDgwLDYgKzU0ODIsMzkgQEAgaWN1X3VuaWNvZGVfdmVyc2lvbihQR19GVU5D VElPTl9BUkdTKQogCQlQR19SRVRVUk5fTlVMTCgpOwogfQogCisvKgorICogQ2hlY2sgd2hl dGhlciBhIHRleHQgdmFsdWUgaXMgcHVyZSBBU0NJSS4KKyAqCisgKiBQdXJlIEFTQ0lJIChj b2RlIHBvaW50cyAwLTEyNykgaXMgdW5hZmZlY3RlZCBieSBVbmljb2RlIG5vcm1hbGl6YXRp b24KKyAqIGFuZCBpcyBhbHdheXMgYW4gYXNzaWduZWQgY29kZSBwb2ludCwgaW5kZXBlbmRl bnQgb2Ygc2VydmVyIGVuY29kaW5nLAorICogc28gY2FsbGVycyBjYW4gdXNlIHRoaXMgdG8g c2tpcCBtdWx0aWJ5dGUgZGVjb2RpbmcgZW50aXJlbHkuIFRoaXMgaXMKKyAqIGJ5dGUtb3Jp ZW50ZWQgKGNoZWNraW5nIHJhdyBieXRlcyBmb3IgdGhlIGhpZ2ggYml0LCByYXRoZXIgdGhh bgorICogY29tcGFyaW5nIGJ5dGUgbGVuZ3RoIHRvIGNvZGVwb2ludCBjb3VudCkgc28gaXQg c3RheXMgY29ycmVjdCBpZiBldmVyCisgKiByZXVzZWQgc29tZXdoZXJlIHRoZSBzZXJ2ZXIg ZW5jb2RpbmcgaXNuJ3QgYWxyZWFkeSBrbm93biB0byBiZSBVVEY4LgorICoKKyAqIGlzX3Zh bGlkX2FzY2lpKCkgcmVqZWN0cyBlbWJlZGRlZCB6ZXJvIGJ5dGVzIGFzIHdlbGwgYXMgaGln aC1iaXQKKyAqIGJ5dGVzLCBhbmQgcmVxdWlyZXMgaXRzIGxlbmd0aCBhcmd1bWVudCB0byBi ZSBhIG11bHRpcGxlIG9mIHRoZSBTSU1ECisgKiBjaHVuayBzaXplIChzaXplb2YoVmVjdG9y OCkpLCBzbyBzY2FuIHRoZSBsYXJnZXN0IGNodW5rLWFsaWduZWQKKyAqIHByZWZpeCB3aXRo IGl0LCB0aGVuIGFwcGx5IHRoZSBzYW1lIHplcm8tYnl0ZS9oaWdoLWJpdCBjaGVjaworICog Ynl0ZS1hdC1hLXRpbWUgdG8gdGhlIHJlbWFpbmRlciBmb3IgY29uc2lzdGVuY3kuCisgKi8K K3N0YXRpYyBib29sCit0ZXh0X2lzX2FzY2lpKHRleHQgKnQpCit7CisJdW5zaWduZWQgY2hh ciAqcyA9ICh1bnNpZ25lZCBjaGFyICopIFZBUkRBVEFfQU5ZKHQpOworCWludAkJCWxlbiA9 IFZBUlNJWkVfQU5ZX0VYSERSKHQpOworCWludAkJCWNodW5rX2xlbiA9IGxlbiAtIChsZW4g JSBzaXplb2YoVmVjdG9yOCkpOworCisJaWYgKGNodW5rX2xlbiA+IDAgJiYgIWlzX3ZhbGlk X2FzY2lpKHMsIGNodW5rX2xlbikpCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaW50IGkg PSBjaHVua19sZW47IGkgPCBsZW47IGkrKykKKwkJaWYgKHNbaV0gPT0gMCB8fCBJU19ISUdI QklUX1NFVChzW2ldKSkKKwkJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQor CiAvKgogICogQ2hlY2sgd2hldGhlciB0aGUgc3RyaW5nIGNvbnRhaW5zIG9ubHkgYXNzaWdu ZWQgVW5pY29kZSBjb2RlCiAgKiBwb2ludHMuIFJlcXVpcmVzIHRoYXQgdGhlIGRhdGFiYXNl IGVuY29kaW5nIGlzIFVURi04LgpAQCAtNTQ5NSw2ICs1NTMwLDEwIEBAIHVuaWNvZGVfYXNz aWduZWQoUEdfRlVOQ1RJT05fQVJHUykKIAkJZXJlcG9ydChFUlJPUiwKIAkJCQkoZXJybXNn KCJVbmljb2RlIGNhdGVnb3JpemF0aW9uIGNhbiBvbmx5IGJlIHBlcmZvcm1lZCBpZiBzZXJ2 ZXIgZW5jb2RpbmcgaXMgVVRGOCIpKSk7CiAKKwkvKiBBU0NJSSBjb2RlIHBvaW50cyBhcmUg YWx3YXlzIGFzc2lnbmVkICovCisJaWYgKHRleHRfaXNfYXNjaWkoaW5wdXQpKQorCQlQR19S RVRVUk5fQk9PTCh0cnVlKTsKKwogCS8qIGNvbnZlcnQgdG8gY2hhcjMyX3QgKi8KIAlzaXpl ID0gcGdfbWJzdHJsZW5fd2l0aF9sZW4oVkFSREFUQV9BTlkoaW5wdXQpLCBWQVJTSVpFX0FO WV9FWEhEUihpbnB1dCkpOwogCXAgPSAodW5zaWduZWQgY2hhciAqKSBWQVJEQVRBX0FOWShp bnB1dCk7CkBAIC01NTI3LDYgKzU1NjYsMTAgQEAgdW5pY29kZV9ub3JtYWxpemVfZnVuYyhQ R19GVU5DVElPTl9BUkdTKQogCiAJZm9ybSA9IHVuaWNvZGVfbm9ybV9mb3JtX2Zyb21fc3Ry aW5nKGZvcm1zdHIpOwogCisJLyogQVNDSUkgY29kZSBwb2ludHMgYXJlIHVuYWZmZWN0ZWQg Ynkgbm9ybWFsaXphdGlvbiAqLworCWlmICh0ZXh0X2lzX2FzY2lpKGlucHV0KSkKKwkJUEdf UkVUVVJOX1RFWFRfUChpbnB1dCk7CisKIAkvKiBjb252ZXJ0IHRvIGNoYXIzMl90ICovCiAJ c2l6ZSA9IHBnX21ic3RybGVuX3dpdGhfbGVuKFZBUkRBVEFfQU5ZKGlucHV0KSwgVkFSU0la RV9BTllfRVhIRFIoaW5wdXQpKTsKIAlpbnB1dF9jaGFycyA9IHBhbGxvY19hcnJheShjaGFy MzJfdCwgc2l6ZSArIDEpOwpAQCAtNTU5NSw2ICs1NjM4LDEwIEBAIHVuaWNvZGVfaXNfbm9y bWFsaXplZChQR19GVU5DVElPTl9BUkdTKQogCiAJZm9ybSA9IHVuaWNvZGVfbm9ybV9mb3Jt X2Zyb21fc3RyaW5nKGZvcm1zdHIpOwogCisJLyogQVNDSUkgY29kZSBwb2ludHMgYXJlIGFs d2F5cyBub3JtYWxpemVkLCBpbiBhbnkgb2YgdGhlIGZvdXIgZm9ybXMgKi8KKwlpZiAodGV4 dF9pc19hc2NpaShpbnB1dCkpCisJCVBHX1JFVFVSTl9CT09MKHRydWUpOworCiAJLyogY29u dmVydCB0byBjaGFyMzJfdCAqLwogCXNpemUgPSBwZ19tYnN0cmxlbl93aXRoX2xlbihWQVJE QVRBX0FOWShpbnB1dCksIFZBUlNJWkVfQU5ZX0VYSERSKGlucHV0KSk7CiAJaW5wdXRfY2hh cnMgPSBwYWxsb2NfYXJyYXkoY2hhcjMyX3QsIHNpemUgKyAxKTsKZGlmZiAtLWdpdCBhL3Ny Yy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvdW5pY29kZS5vdXQgYi9zcmMvdGVzdC9yZWdyZXNz L2V4cGVjdGVkL3VuaWNvZGUub3V0CmluZGV4IDYzZTQ4ZDNhOTYxLi5lNzE2YWE3ZmNhMiAx MDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC91bmljb2RlLm91dAorKysg Yi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3VuaWNvZGUub3V0CkBAIC0yNiw2ICsyNiwx MiBAQCBTRUxFQ1QgdW5pY29kZV9hc3NpZ25lZChVJidhYmNcKzEwRkZGRicpOwogIGYKICgx IHJvdykKIAorU0VMRUNUIHVuaWNvZGVfYXNzaWduZWQoJ2FiYycpOworIHVuaWNvZGVfYXNz aWduZWQgCistLS0tLS0tLS0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisKIFNFTEVDVCBub3Jt YWxpemUoJycpOwogIG5vcm1hbGl6ZSAKIC0tLS0tLS0tLS0tCkBAIC02OCw2ICs3NCwxOSBA QCBTRUxFQ1Qgbm9ybWFsaXplKFUmJ1wwMEU0XDI0RDFjJywgTkZLRCkgPSBVJidcMDA2MVww MzA4YmMnIENPTExBVEUgIkMiIEFTIHRlc3RfbgogIHQKICgxIHJvdykKIAorU0VMRUNUIG5v cm1hbGl6ZSgnYWJjJykgPSAnYWJjJyBDT0xMQVRFICJDIiBBUyB0ZXN0X2FzY2lpX2lkZW07 CisgdGVzdF9hc2NpaV9pZGVtIAorLS0tLS0tLS0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisK K1NFTEVDVCBub3JtYWxpemUodmFsKSA9IHZhbCBDT0xMQVRFICJDIiBBUyB0ZXN0X2FzY2lp X2lkZW1fY29sdW1uCitGUk9NIChWQUxVRVMgKCdhYmMnOjp0ZXh0KSkgdih2YWwpOworIHRl c3RfYXNjaWlfaWRlbV9jb2x1bW4gCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0Ciso MSByb3cpCisKIFNFTEVDVCAibm9ybWFsaXplIignYWJjJywgJ2RlZicpOyAgLS0gcnVuLXRp bWUgZXJyb3IKIEVSUk9SOiAgaW52YWxpZCBub3JtYWxpemF0aW9uIGZvcm06IGRlZgogU0VM RUNUIFUmJ1wwMEU0XDI0RDFjJyBJUyBOT1JNQUxJWkVEIEFTIHRlc3RfZGVmYXVsdDsKQEAg LTgyLDYgKzEwMSwxMiBAQCBTRUxFQ1QgVSYnXDAwRTRcMjREMWMnIElTIE5GQyBOT1JNQUxJ WkVEIEFTIHRlc3RfbmZjOwogIHQKICgxIHJvdykKIAorU0VMRUNUICdhYmMnIElTIE5PUk1B TElaRUQgQVMgdGVzdF9hc2NpaTsKKyB0ZXN0X2FzY2lpIAorLS0tLS0tLS0tLS0tCisgdAor KDEgcm93KQorCiBTRUxFQ1QgbnVtLCB2YWwsCiAgICAgdmFsIElTIE5GQyBOT1JNQUxJWkVE IEFTIE5GQywKICAgICB2YWwgSVMgTkZEIE5PUk1BTElaRUQgQVMgTkZELApAQCAtMTA1LDYg KzEzMCw1OSBAQCBPUkRFUiBCWSBudW07CiAKIFNFTEVDVCBpc19ub3JtYWxpemVkKCdhYmMn LCAnZGVmJyk7ICAtLSBydW4tdGltZSBlcnJvcgogRVJST1I6ICBpbnZhbGlkIG5vcm1hbGl6 YXRpb24gZm9ybTogZGVmCistLSBFeGVyY2lzZSB0aGUgQVNDSUkgZmFzdC1wYXRoJ3MgY2h1 bmsvcmVtYWluZGVyIGJvdW5kYXJ5IGhhbmRsaW5nOiBhCistLSBub24tTkZDLW5vcm1hbGl6 ZWQgY29kZXBvaW50IHNlcXVlbmNlIG11c3Qgc3RpbGwgYmUgZGV0ZWN0ZWQgYXMgc3VjaAor LS0gcmVnYXJkbGVzcyBvZiBob3cgbXVjaCBwdXJlLUFTQ0lJIHBhZGRpbmcgc3Vycm91bmRz IGl0LgorU0VMRUNUIGxlbiwKKyAgICAocmVwZWF0KCdhJywgbGVuKSB8fCBVJidcMDA2MVww MzA4JykgSVMgTk9STUFMSVpFRCBBUyBub25fbmZjX2F0X2VuZCwKKyAgICAoVSYnXDAwNjFc MDMwOCcgfHwgcmVwZWF0KCdhJywgbGVuKSkgSVMgTk9STUFMSVpFRCBBUyBub25fbmZjX2F0 X3N0YXJ0CitGUk9NIGdlbmVyYXRlX3NlcmllcygwLCA0MCkgQVMgbGVuCitPUkRFUiBCWSBs ZW47CisgbGVuIHwgbm9uX25mY19hdF9lbmQgfCBub25fbmZjX2F0X3N0YXJ0IAorLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0KKyAgIDAgfCBmICAgICAgICAg ICAgICB8IGYKKyAgIDEgfCBmICAgICAgICAgICAgICB8IGYKKyAgIDIgfCBmICAgICAgICAg ICAgICB8IGYKKyAgIDMgfCBmICAgICAgICAgICAgICB8IGYKKyAgIDQgfCBmICAgICAgICAg ICAgICB8IGYKKyAgIDUgfCBmICAgICAgICAgICAgICB8IGYKKyAgIDYgfCBmICAgICAgICAg ICAgICB8IGYKKyAgIDcgfCBmICAgICAgICAgICAgICB8IGYKKyAgIDggfCBmICAgICAgICAg ICAgICB8IGYKKyAgIDkgfCBmICAgICAgICAgICAgICB8IGYKKyAgMTAgfCBmICAgICAgICAg ICAgICB8IGYKKyAgMTEgfCBmICAgICAgICAgICAgICB8IGYKKyAgMTIgfCBmICAgICAgICAg ICAgICB8IGYKKyAgMTMgfCBmICAgICAgICAgICAgICB8IGYKKyAgMTQgfCBmICAgICAgICAg ICAgICB8IGYKKyAgMTUgfCBmICAgICAgICAgICAgICB8IGYKKyAgMTYgfCBmICAgICAgICAg ICAgICB8IGYKKyAgMTcgfCBmICAgICAgICAgICAgICB8IGYKKyAgMTggfCBmICAgICAgICAg ICAgICB8IGYKKyAgMTkgfCBmICAgICAgICAgICAgICB8IGYKKyAgMjAgfCBmICAgICAgICAg ICAgICB8IGYKKyAgMjEgfCBmICAgICAgICAgICAgICB8IGYKKyAgMjIgfCBmICAgICAgICAg ICAgICB8IGYKKyAgMjMgfCBmICAgICAgICAgICAgICB8IGYKKyAgMjQgfCBmICAgICAgICAg ICAgICB8IGYKKyAgMjUgfCBmICAgICAgICAgICAgICB8IGYKKyAgMjYgfCBmICAgICAgICAg ICAgICB8IGYKKyAgMjcgfCBmICAgICAgICAgICAgICB8IGYKKyAgMjggfCBmICAgICAgICAg ICAgICB8IGYKKyAgMjkgfCBmICAgICAgICAgICAgICB8IGYKKyAgMzAgfCBmICAgICAgICAg ICAgICB8IGYKKyAgMzEgfCBmICAgICAgICAgICAgICB8IGYKKyAgMzIgfCBmICAgICAgICAg ICAgICB8IGYKKyAgMzMgfCBmICAgICAgICAgICAgICB8IGYKKyAgMzQgfCBmICAgICAgICAg ICAgICB8IGYKKyAgMzUgfCBmICAgICAgICAgICAgICB8IGYKKyAgMzYgfCBmICAgICAgICAg ICAgICB8IGYKKyAgMzcgfCBmICAgICAgICAgICAgICB8IGYKKyAgMzggfCBmICAgICAgICAg ICAgICB8IGYKKyAgMzkgfCBmICAgICAgICAgICAgICB8IGYKKyAgNDAgfCBmICAgICAgICAg ICAgICB8IGYKKyg0MSByb3dzKQorCiAtLSBIYW5ndWwgTkZDIHJlY29tcG9zaXRpb24gdGVz dHMKIC0tIEwrViAtPiBMViBjb21wb3NpdGlvbiAoZmlyc3QgYW5kIGxhc3QpCiBTRUxFQ1Qg bm9ybWFsaXplKFUmJ1wxMTAwXDExNjEnLCBORkMpID0gVSYnXEFDMDAnIENPTExBVEUgIkMi IEFTIGhhbmd1bF9sdl9maXJzdDsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3Fs L3VuaWNvZGUuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvdW5pY29kZS5zcWwKaW5kZXgg OTUxZjg2YTMzNmUuLmUzYzAzMGMzNzQ0IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNz L3NxbC91bmljb2RlLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC91bmljb2RlLnNx bApAQCAtOCw2ICs4LDcgQEAgU0VMRUNUIFUmJ1wwMDYxXDAzMDhiYycgPD4gVSYnXDAwRTRi YycgQ09MTEFURSAiQyIgQVMgc2FuaXR5X2NoZWNrOwogU0VMRUNUIHVuaWNvZGVfdmVyc2lv bigpIElTIE5PVCBOVUxMOwogU0VMRUNUIHVuaWNvZGVfYXNzaWduZWQoVSYnYWJjJyk7CiBT RUxFQ1QgdW5pY29kZV9hc3NpZ25lZChVJidhYmNcKzEwRkZGRicpOworU0VMRUNUIHVuaWNv ZGVfYXNzaWduZWQoJ2FiYycpOwogCiBTRUxFQ1Qgbm9ybWFsaXplKCcnKTsKIFNFTEVDVCBu b3JtYWxpemUoVSYnXDAwNjFcMDMwOFwyNEQxYycpID0gVSYnXDAwRTRcMjREMWMnIENPTExB VEUgIkMiIEFTIHRlc3RfZGVmYXVsdDsKQEAgLTE2LDExICsxNywxNSBAQCBTRUxFQ1Qgbm9y bWFsaXplKFUmJ1wwMEU0YmMnLCBORkMpID0gVSYnXDAwRTRiYycgQ09MTEFURSAiQyIgQVMg dGVzdF9uZmNfaWRlbTsKIFNFTEVDVCBub3JtYWxpemUoVSYnXDAwRTRcMjREMWMnLCBORkQp ID0gVSYnXDAwNjFcMDMwOFwyNEQxYycgQ09MTEFURSAiQyIgQVMgdGVzdF9uZmQ7CiBTRUxF Q1Qgbm9ybWFsaXplKFUmJ1wwMDYxXDAzMDhcMjREMWMnLCBORktDKSA9IFUmJ1wwMEU0YmMn IENPTExBVEUgIkMiIEFTIHRlc3RfbmZrYzsKIFNFTEVDVCBub3JtYWxpemUoVSYnXDAwRTRc MjREMWMnLCBORktEKSA9IFUmJ1wwMDYxXDAzMDhiYycgQ09MTEFURSAiQyIgQVMgdGVzdF9u ZmtkOworU0VMRUNUIG5vcm1hbGl6ZSgnYWJjJykgPSAnYWJjJyBDT0xMQVRFICJDIiBBUyB0 ZXN0X2FzY2lpX2lkZW07CitTRUxFQ1Qgbm9ybWFsaXplKHZhbCkgPSB2YWwgQ09MTEFURSAi QyIgQVMgdGVzdF9hc2NpaV9pZGVtX2NvbHVtbgorRlJPTSAoVkFMVUVTICgnYWJjJzo6dGV4 dCkpIHYodmFsKTsKIAogU0VMRUNUICJub3JtYWxpemUiKCdhYmMnLCAnZGVmJyk7ICAtLSBy dW4tdGltZSBlcnJvcgogCiBTRUxFQ1QgVSYnXDAwRTRcMjREMWMnIElTIE5PUk1BTElaRUQg QVMgdGVzdF9kZWZhdWx0OwogU0VMRUNUIFUmJ1wwMEU0XDI0RDFjJyBJUyBORkMgTk9STUFM SVpFRCBBUyB0ZXN0X25mYzsKK1NFTEVDVCAnYWJjJyBJUyBOT1JNQUxJWkVEIEFTIHRlc3Rf YXNjaWk7CiAKIFNFTEVDVCBudW0sIHZhbCwKICAgICB2YWwgSVMgTkZDIE5PUk1BTElaRUQg QVMgTkZDLApAQCAtMzcsNiArNDIsMTUgQEAgT1JERVIgQlkgbnVtOwogCiBTRUxFQ1QgaXNf bm9ybWFsaXplZCgnYWJjJywgJ2RlZicpOyAgLS0gcnVuLXRpbWUgZXJyb3IKIAorLS0gRXhl cmNpc2UgdGhlIEFTQ0lJIGZhc3QtcGF0aCdzIGNodW5rL3JlbWFpbmRlciBib3VuZGFyeSBo YW5kbGluZzogYQorLS0gbm9uLU5GQy1ub3JtYWxpemVkIGNvZGVwb2ludCBzZXF1ZW5jZSBt dXN0IHN0aWxsIGJlIGRldGVjdGVkIGFzIHN1Y2gKKy0tIHJlZ2FyZGxlc3Mgb2YgaG93IG11 Y2ggcHVyZS1BU0NJSSBwYWRkaW5nIHN1cnJvdW5kcyBpdC4KK1NFTEVDVCBsZW4sCisgICAg KHJlcGVhdCgnYScsIGxlbikgfHwgVSYnXDAwNjFcMDMwOCcpIElTIE5PUk1BTElaRUQgQVMg bm9uX25mY19hdF9lbmQsCisgICAgKFUmJ1wwMDYxXDAzMDgnIHx8IHJlcGVhdCgnYScsIGxl bikpIElTIE5PUk1BTElaRUQgQVMgbm9uX25mY19hdF9zdGFydAorRlJPTSBnZW5lcmF0ZV9z ZXJpZXMoMCwgNDApIEFTIGxlbgorT1JERVIgQlkgbGVuOworCiAtLSBIYW5ndWwgTkZDIHJl Y29tcG9zaXRpb24gdGVzdHMKIC0tIEwrViAtPiBMViBjb21wb3NpdGlvbiAoZmlyc3QgYW5k IGxhc3QpCiBTRUxFQ1Qgbm9ybWFsaXplKFUmJ1wxMTAwXDExNjEnLCBORkMpID0gVSYnXEFD MDAnIENPTExBVEUgIkMiIEFTIGhhbmd1bF9sdl9maXJzdDsKLS0gCjIuNDMuMAoK --------------76LdLCQNBp18TuTgCciLM4g1--