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 1w7BJ2-0052aQ-1J for pgsql-hackers@arkaria.postgresql.org; Mon, 30 Mar 2026 12:01:20 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w7BJ0-0032mo-2v for pgsql-hackers@arkaria.postgresql.org; Mon, 30 Mar 2026 12:01:19 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w7BJ0-0032me-1l for pgsql-hackers@lists.postgresql.org; Mon, 30 Mar 2026 12:01:19 +0000 Received: from mail-oi1-x242.google.com ([2607:f8b0:4864:20::242]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w7BIy-00000001zJS-01Rk for pgsql-hackers@lists.postgresql.org; Mon, 30 Mar 2026 12:01:18 +0000 Received: by mail-oi1-x242.google.com with SMTP id 5614622812f47-46808125c65so1456421b6e.2 for ; Mon, 30 Mar 2026 05:01:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1774872074; cv=none; d=google.com; s=arc-20240605; b=ZGojahrgO6+y6ExTFFl+Y9Y8tT//ab4xktUXHuT9rMM9L5fFSyWEl1H1MLm8mJCHgn PNlRSJxQIbajgh/ajY3LM+6A5Vuqqq46isJtOBIkWhwjS3l4DKoSdZPFtfwLEgSne0wt +bwZMQTU5ZFKrSpdunr2TQPJGAJhVn09lbV/HonJX/fo8ClzTlp0lzJriRSBgFfTdfM1 mfezCbhi0V+i2iYhno1NLgLrxtsUnsTxMLUp0KOp7chV+s/Bu5W7IkoTH83Zf7L9YQ9G yqWIlCwK9GSrKYL9uqdcfaJBr2fCuqom77xPrSBHk7CxZLA4TamQRcNBMuq9JHzXgyMQ U0hw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=LSp2/E2L9VyFFXso8XaRlhkm8+vTEZcVv7sssqmzvw0=; fh=ntrcJSRx8waxKSzVaiEFaLIru73+DJxEtDwE9FagoDo=; b=BV7O849wnBCdAqMe+YptqFaZRGeItNUz3K9en6AC4j+X6KIPp6s5OOZbiZn6HkrqvP AgHcBB1tSq3dZyd9Jf0mscy4RJb6LgG8OdLMjccgi2ZMa8+szuNEd26tr2PCF+zXlfv3 UbFxudDPYJZ8WxSdcr0VsobfQVZ4pEBihrlX5Ve2I2IpgVohXSlMMsVOl+nG5o5JqAf6 aS0693wnkVIaO008tjYrEzunMO1nxmWia2n+8RGxsajJEczuPqCORY78ESMYOkvwO6fI nWuRW3+slvTOAQrD2ViOQEApnfzpYpZj/9R93cKEb5Sr333hnM1DMksg9xp7LYWNsgV8 5erw==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774872074; x=1775476874; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=LSp2/E2L9VyFFXso8XaRlhkm8+vTEZcVv7sssqmzvw0=; b=pxFLD/JZHokNqFC046ClNuTbxBJmkFdyEzXbT4fY15GmN6QautHjKgEZvN2VGG8p67 d7Gry9TMAdoRgkAUYy+p9mo2VMz1GOIQl0u71xrVIuJfitMpeV3XbXEuCe26T2ftmEdf kBbB5dnRdgpFZH8zoEy/AvmXmskqmjiI/RjSGiU91qHOpJtjRaFmXeeeq8qs2EM8Rgjr VBeLgQiH9Z0gIaSAxAfSTBj15ty1ycXxHFTflfqYTWd0xoP8PUVm3Cxk2+/jG3sJ7jzg U32Q1S2j2tPw8ptnEDyONWnxV4IXK4Ba7RW1nSKX3zUojJ6Gm1ZLh1JajPbkNR/eOymK jEew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774872074; x=1775476874; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=LSp2/E2L9VyFFXso8XaRlhkm8+vTEZcVv7sssqmzvw0=; b=omrtAyKHYUrOBmKJ/21gQK8tbiMP1wa7Z3ZBV0NzM7eki3iXxAixZPKfKQWYAgaMI2 f7uodpeAkeVghrDkIJcXw+6FMg1U6cI26qrdnj/dC0L/aGNuzLAyJ8I+WqdPFkjknC81 +o0XoHqxKoXJ/ZpkSEmUIhRWrepsxaHc7ZAZTrd/J1p8y9f9jm985I/P4//mLueDvPe/ Mj8oJnlm3Bkv0DzM/+jBsctBKRn0DdcGSZCNwSC67d70jw/UoLs23VIiP1R/GNWam54t MlebAbbbYNyIbyJu7ZhbUJ7TA3TzIFdrr1dWk9cD+KWKold/YSCz5OpCnS6LVX0fokHm WcTw== X-Forwarded-Encrypted: i=1; AJvYcCUtSP2L5ahz3PAdb3ibnBYmq+K5RCJjsvTATUoNwJA0HV6ftj02r1o2ILlErcX3Eijenk1NyBzqsRizop7L@lists.postgresql.org X-Gm-Message-State: AOJu0YzxBULk+bGtHTFm3aR6I2N2P5Jw+fb9lGvOz/0rrKGYTpylxlgN 0DVRz1hSXlnRbLNcGd2hWvbozP+tBP1koTDjyDWtVaeP7TfV9ofxSOl2AaTU60rtbN5cDk0ri2p OuhTxyCR9CzAvssd1tCqspCiZlAbbdmE= X-Gm-Gg: ATEYQzzm4nzRapD0PjVxjJIU7U2c2GzcjwIFqeKRX/Nlh48tZZctrsU0xdmvF9XFoQW +cmLipnfizTR0gtfX9dRQlitN64AanJq9NFE3UVIQf8MRuhf4Llh6EVRn9fxhKLng7D//iqPVRn GT6Ej7R+HrfdFEJoHWe5qZQv9fTI4izjFH4l/BFE7cox+tPCakjkTgbCjghsd7fgYq1GHVCTqO3 8fqfR3U9tEr+qg5HVIri2jIYxrvDujUj9KPZDKn+leUNPH5OomMJmFRHVwHmv665ck0B2kamWzC 194vPjgdpJXzwYnOW+59k2T5sg0/MB3NuetkNgHiU5yiUco5epjsXT/XsTvfLAWiB7h9KLCIFXE NY7Mh8uOFwY70CeQTnmra5nsrGig= X-Received: by 2002:a05:6808:1d02:b0:468:fad3:1303 with SMTP id 5614622812f47-46a8a5ecaacmr4989473b6e.45.1774872073837; Mon, 30 Mar 2026 05:01:13 -0700 (PDT) MIME-Version: 1.0 References: <20250911054220.3784-1-root@ip-172-31-36-228.ec2.internal> <0be1b7b05726652ea0d83e8f72fd4cfe@postgrespro.ru> In-Reply-To: From: John Naylor Date: Mon, 30 Mar 2026 19:01:02 +0700 X-Gm-Features: AQROBzCUW1mI6f-FxfYKPv5VjPAfDLnjzj5AgV4rswlnjeM0Cn6Qs4ek0Ua-vo8 Message-ID: Subject: Re: Proposal for enabling auto-vectorization for checksum calculations To: Andrew Kim Cc: Oleg Tselebrovskiy , pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="0000000000007bba90064e3c9bbf" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000007bba90064e3c9bbf Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, Mar 17, 2026 at 9:23=E2=80=AFAM John Naylor wrote: > I've attached v12 which is just a rebase over the new centralized > feature detection. I also have some review: Andrew Kim let me know he is not available at this time, so since I found only minor issues and we're close to feature freeze I took care of them myself in the attached v13. I also further updated an outdated comment to reflect that some compilers (for the archives: at least gcc 8.5 and up) can turn a multiplication by a constant into shifts and adds (the FNV prime is pretty sparse in one-bits), so it's no longer true that vector multiplication is required. That works on SSE2 and powerpc, at least. I don't remember the last time anyone did measurements, so I went ahead and did that: master: 945ms 32 AVX2: 335ms 64 AVX2: 220ms The last one is just to verify an old code comment, and assertion in this thread, that the choice of 32 accumulators left some performance on the table. (Even if it weren't in diminishing returns territory, we wouldn't consider raising this because that changes the computed value, but if I'm updating comments anyway, I wanted to check as much as convenient.) I'll repeat building pg_filedump with this and if that goes well I plan to push this week unless there are objections. --=20 John Naylor Amazon Web Services --0000000000007bba90064e3c9bbf Content-Type: text/x-patch; charset="US-ASCII"; name="v13-0001-Enable-autovectorizing-page-checksums-with-AVX2-.patch" Content-Disposition: attachment; filename="v13-0001-Enable-autovectorizing-page-checksums-with-AVX2-.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mnd4h53p0 RnJvbSBkYTE1YWVmZDcyNjliOGEzNDJmNzUxZTJiNWMyYzRiOWMxYjA2MjdjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKb2huIE5heWxvciA8am9obi5uYXlsb3JAcG9zdGdyZXNxbC5v cmc+CkRhdGU6IE1vbiwgMiBNYXIgMjAyNiAxNzoyODo1OCArMDcwMApTdWJqZWN0OiBbUEFUQ0gg djEzXSBFbmFibGUgYXV0b3ZlY3Rvcml6aW5nIHBhZ2UgY2hlY2tzdW1zIHdpdGggQVZYMiB3aGVy ZQogYXZhaWxhYmxlCgpXZSBhbHJlYWR5IHJlbHkgb24gYXV0b3ZlY3Rvcml6YXRpb24gZm9yIGNv bXB1dGluZyBwYWdlIGNoZWNrc3VtcywgYnV0Cm9uIHg4NiB3ZSBjYW4gZ2V0IG5lYXJseSB0aHJl ZSB0aW1lcyB0aGUgcGVyZm9ybWFuY2UgYnkgYW5ub3RhdGluZwpwZ19jaGVja3N1bV9ibG9jaygp IHdpdGggYSBmdW5jdGlvbiB0YXJnZXQgYXR0cmlidXRlIGZvciBBVlgyLgpUaGF0IGZlYXR1cmUg c2V0IG5vdCBvbmx5IHVzZXMgMjU2LWJpdCByZWdpc3RlcnMsIGJ1dCBjYW4gYWxzbyB1c2UKdmVj dG9yIG11bHRpcGxpY2F0aW9uIHJhdGhlciB0aGFuIHRoZSB2ZWN0b3Igc2hpZnRzIGFuZCBhZGRz IGF2YWlsYWJsZQppbiBTU0UyLgoKVGhpcyBtYXR0ZXJzIG1vc3Qgd2hlbiB1c2luZyBpb191cmlu ZyBzaW5jZSBpbiB0aGF0IGNhc2UgdGhlIGNoZWNrc3VtCmNvbXB1dGF0aW9uIGlzIG5vdCBkb25l IGluIHBhcmFsbGVsIHZpYSB3b3JrZXJzLgoKQ28tYXV0aG9yZWQtYnk6IE1hdHRoZXcgU3RlcnJl dHQgPG1hdHRoZXdzdGVycmV0dDJAZ21haWwuY29tPgpDby1hdXRob3JlZC1ieTogQW5kcmV3IEtp bSA8YW5kcmV3LmtpbUBpbnRlbC5jb20+ClJldmlld2VkLWJ5OiBPbGVnIFRzZWxlYnJvdnNraXkg PG8udHNlbGVicm92c2tpeUBwb3N0Z3Jlc3Byby5ydT4KRGlzY3Vzc2lvbjogaHR0cHM6Ly9wb3N0 Z3IuZXMvbS9DQSUyQnZBODVfNUdUdSUyQkhIbmlTYnZ2UCUyQjhrMyUzRHhaTyUzRFdFODROUHdp S3l4enRxdnBmWjNRJTQwbWFpbC5nbWFpbC5jb20KRGlzY3Vzc2lvbjogaHR0cHM6Ly9wb3N0Z3Iu ZXMvbS8yMDI1MDkxMTA1NDIyMC4zNzg0LTEtcm9vdCU0MGlwLTE3Mi0zMS0zNi0yMjguZWMyLmlu dGVybmFsCi0tLQogY29uZmlnL2MtY29tcGlsZXIubTQgICAgICAgICAgICAgICAgICAgICB8IDIz ICsrKysrKysrKysrCiBjb25maWd1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg NDYgKysrKysrKysrKysrKysrKysrKysrCiBjb25maWd1cmUuYWMgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgIDkgKysrKwogbWVzb24uYnVpbGQgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8IDI4ICsrKysrKysrKysrKysKIHNyYy9iYWNrZW5kL3N0b3JhZ2UvcGFnZS9jaGVja3N1 bS5jICAgICAgfCA0NCArKysrKysrKysrKysrKysrKysrLQogc3JjL2luY2x1ZGUvcGdfY29uZmln LmguaW4gICAgICAgICAgICAgICB8ICAzICsrCiBzcmMvaW5jbHVkZS9wb3J0L3BnX2NwdS5oICAg ICAgICAgICAgICAgIHwgIDMgKysKIHNyYy9pbmNsdWRlL3N0b3JhZ2UvY2hlY2tzdW1fYmxvY2su aW5jLmMgfCA0MiArKysrKysrKysrKysrKysrKysrCiBzcmMvaW5jbHVkZS9zdG9yYWdlL2NoZWNr c3VtX2ltcGwuaCAgICAgIHwgNTIgKysrKysrKystLS0tLS0tLS0tLS0tLS0tCiBzcmMvcG9ydC9w Z19jcHVfeDg2LmMgICAgICAgICAgICAgICAgICAgIHwgIDQgKysKIDEwIGZpbGVzIGNoYW5nZWQs IDIxOSBpbnNlcnRpb25zKCspLCAzNSBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBz cmMvaW5jbHVkZS9zdG9yYWdlL2NoZWNrc3VtX2Jsb2NrLmluYy5jCgpkaWZmIC0tZ2l0IGEvY29u ZmlnL2MtY29tcGlsZXIubTQgYi9jb25maWcvYy1jb21waWxlci5tNAppbmRleCA2Mjk1NzJlZTM1 MC4uNGQ1YWNmOGJlNmUgMTAwNjQ0Ci0tLSBhL2NvbmZpZy9jLWNvbXBpbGVyLm00CisrKyBiL2Nv bmZpZy9jLWNvbXBpbGVyLm00CkBAIC02ODcsNiArNjg3LDI5IEBAIGZpCiB1bmRlZmluZShbQWNf Y2FjaGV2YXJdKWRubAogXSkjIFBHQUNfU1NFNDJfQ1JDMzJfSU5UUklOU0lDUwogCisjIFBHQUNf QVZYMl9TVVBQT1JUCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayBpZiB0 aGUgY29tcGlsZXIgc3VwcG9ydHMgQVZYMiBhcyBhIHRhcmdldAorIworIyBJZiBBVlgyIHRhcmdl dCBhdHRyaWJ1dGUgaXMgc3VwcG9ydGVkLCBzZXRzIHBnYWNfYXZ4Ml9zdXBwb3J0LgorQUNfREVG VU4oW1BHQUNfQVZYMl9TVVBQT1JUXSwKK1tkZWZpbmUoW0FjX2NhY2hldmFyXSwgW0FTX1RSX1NI KFtwZ2FjX2N2X2F2eDJfc3VwcG9ydF0pXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgQVZYMiB0 YXJnZXQgYXR0cmlidXRlIHN1cHBvcnRdLCBbQWNfY2FjaGV2YXJdLAorW0FDX0NPTVBJTEVfSUZF TFNFKFtBQ19MQU5HX1BST0dSQU0oWyNpbmNsdWRlIDxzdGRpbnQuaD4KKyAgICBfX2F0dHJpYnV0 ZV9fKCh0YXJnZXQoImF2eDIiKSkpCisgICAgc3RhdGljIGludCBhdngyX3Rlc3Qodm9pZCkKKyAg ICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9XSwKKyAgW3JldHVybiBhdngyX3Rlc3QoKTtdKV0s CisgIFtBY19jYWNoZXZhcj15ZXNdLAorICBbQWNfY2FjaGV2YXI9bm9dKV0pCitpZiB0ZXN0IHgi JEFjX2NhY2hldmFyIiA9IHgieWVzIjsgdGhlbgorICBwZ2FjX2F2eDJfc3VwcG9ydD15ZXMKK2Zp Cit1bmRlZmluZShbQWNfY2FjaGV2YXJdKWRubAorXSkjIFBHQUNfQVZYMl9TVVBQT1JUCisKICMg UEdBQ19BVlg1MTJfUENMTVVMX0lOVFJJTlNJQ1MKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCiAjIENoZWNrIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBBVlgtNTEyIGNhcnJ5bGVzcyBt dWx0aXBsaWNhdGlvbgpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmluZGV4IDhl MGU3NDgzYzFkLi4xYWU1MjcyMTVjNyAxMDA3NTUKLS0tIGEvY29uZmlndXJlCisrKyBiL2NvbmZp Z3VyZQpAQCAtMTc3MjUsNiArMTc3MjUsNTIgQEAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9fQ1BV SURFWCAxIiA+PmNvbmZkZWZzLmgKICAgZmkKIGZpCiAKKyMgQ2hlY2sgZm9yIEFWWDIgdGFyZ2V0 IGFuZCBpbnRyaW5zaWMgc3VwcG9ydAorIworaWYgdGVzdCB4IiRob3N0X2NwdSIgPSB4Ing4Nl82 NCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVj a2luZyBmb3IgQVZYMiB0YXJnZXQgYXR0cmlidXRlIHN1cHBvcnQiID4mNQorJGFzX2VjaG9fbiAi Y2hlY2tpbmcgZm9yIEFWWDIgdGFyZ2V0IGF0dHJpYnV0ZSBzdXBwb3J0Li4uICIgPiY2OyB9Citp ZiAke3BnYWNfY3ZfYXZ4Ml9zdXBwb3J0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAi KGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRl c3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGludC5oPgor ICAgICNpZiBkZWZpbmVkKF9faGFzX2F0dHJpYnV0ZSkgJiYgX19oYXNfYXR0cmlidXRlICh0YXJn ZXQpCisgICAgX19hdHRyaWJ1dGVfXygodGFyZ2V0KCJhdngyIikpKQorICAgIHN0YXRpYyBpbnQg YXZ4Ml90ZXN0KHZvaWQpCisgICAgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICNlbmRp ZgoraW50CittYWluICgpCit7CityZXR1cm4gYXZ4Ml90ZXN0KCk7CisgIDsKKyAgcmV0dXJuIDA7 Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAg cGdhY19jdl9hdngyX3N1cHBvcnQ9eWVzCitlbHNlCisgIHBnYWNfY3ZfYXZ4Ml9zdXBwb3J0PW5v CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVz dC4kYWNfZXh0CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBy ZXN1bHQ6ICRwZ2FjX2N2X2F2eDJfc3VwcG9ydCIgPiY1CiskYXNfZWNobyAiJHBnYWNfY3ZfYXZ4 Ml9zdXBwb3J0IiA+JjY7IH0KK2lmIHRlc3QgeCIkcGdhY19jdl9hdngyX3N1cHBvcnQiID0geCJ5 ZXMiOyB0aGVuCisgIHBnYWNfYXZ4Ml9zdXBwb3J0PXllcworZmkKKworICBpZiB0ZXN0IHgiJHBn YWNfYXZ4Ml9zdXBwb3J0IiA9IHgieWVzIjsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBVU0Vf QVZYMl9XSVRIX1JVTlRJTUVfQ0hFQ0sgMSIgPj5jb25mZGVmcy5oCisKKyAgZmkKK2ZpCisKICMg Q2hlY2sgZm9yIFhTQVZFIGludHJpbnNpY3MKICMKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xp bmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIF94Z2V0YnYiID4mNQpkaWZmIC0tZ2l0IGEvY29u ZmlndXJlLmFjIGIvY29uZmlndXJlLmFjCmluZGV4IDJiYWFjNWU5ZGE3Li5hNDNhZGQ1MWNhNiAx MDA2NDQKLS0tIGEvY29uZmlndXJlLmFjCisrKyBiL2NvbmZpZ3VyZS5hYwpAQCAtMjEyOSw2ICsy MTI5LDE1IEBAIGVsc2UKICAgZmkKIGZpCiAKKyMgQ2hlY2sgZm9yIEFWWDIgdGFyZ2V0IHN1cHBv cnQKKyMKK2lmIHRlc3QgeCIkaG9zdF9jcHUiID0geCJ4ODZfNjQiOyB0aGVuCisgIFBHQUNfQVZY Ml9TVVBQT1JUKCkKKyAgaWYgdGVzdCB4IiRwZ2FjX2F2eDJfc3VwcG9ydCIgPSB4InllcyI7IHRo ZW4KKyAgICBBQ19ERUZJTkUoVVNFX0FWWDJfV0lUSF9SVU5USU1FX0NIRUNLLCAxLCBbRGVmaW5l IHRvIDEgdG8gdXNlIEFWWDIgaW5zdHJ1Y3Rpb25zIHdpdGggYSBydW50aW1lIGNoZWNrLl0pCisg IGZpCitmaQorCiAjIENoZWNrIGZvciBYU0FWRSBpbnRyaW5zaWNzCiAjCiBQR0FDX1hTQVZFX0lO VFJJTlNJQ1MoKQpkaWZmIC0tZ2l0IGEvbWVzb24uYnVpbGQgYi9tZXNvbi5idWlsZAppbmRleCBl YTMxY2JjZTljMC4uNWNmMjMxOTVhNmEgMTAwNjQ0Ci0tLSBhL21lc29uLmJ1aWxkCisrKyBiL21l c29uLmJ1aWxkCkBAIC0yNDUxLDYgKzI0NTEsMzQgQEAgaW50IG1haW4odm9pZCkKIGVuZGlmCiAK IAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjCisjIENoZWNrIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBBVlgyIGFzIGEgdGFy Z2V0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMKKworaWYgaG9zdF9jcHUgPT0gJ3g4Nl82NCcKKworICBwcm9nID0gJycnCisj aW5jbHVkZSA8aW1taW50cmluLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CitfX2F0dHJpYnV0ZV9f KCh0YXJnZXQoImF2eDIiKSkpCitzdGF0aWMgaW50IGF2eDJfdGVzdCh2b2lkKQoreworICAgIHJl dHVybiAwOworfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIHJldHVybiBhdngyX3Rlc3QoKTsK K30KKycnJworCisgIGlmIGNjLmxpbmtzKHByb2csIG5hbWU6ICdBVlgyIHN1cHBvcnQnLCBhcmdz OiB0ZXN0X2NfYXJncykKKyAgICBjZGF0YS5zZXQoJ1VTRV9BVlgyX1dJVEhfUlVOVElNRV9DSEVD SycsIDEpCisgIGVuZGlmCisKK2VuZGlmCisKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIENoZWNrIGZvciB0aGUgYXZh aWxhYmlsaXR5IG9mIEFWWC01MTIgcG9wY291bnQgaW50cmluc2ljcy4KICMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9wYWdlL2NoZWNrc3VtLmMgYi9zcmMvYmFja2VuZC9z dG9yYWdlL3BhZ2UvY2hlY2tzdW0uYwppbmRleCA4NzE2NjUxYzhiNS4uN2NlNTFmZTlkMmUgMTAw NjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvcGFnZS9jaGVja3N1bS5jCisrKyBiL3NyYy9i YWNrZW5kL3N0b3JhZ2UvcGFnZS9jaGVja3N1bS5jCkBAIC0xMywxMCArMTMsNTIgQEAKICAqLwog I2luY2x1ZGUgInBvc3RncmVzLmgiCiAKKyNpbmNsdWRlICJwb3J0L3BnX2NwdS5oIgogI2luY2x1 ZGUgInN0b3JhZ2UvY2hlY2tzdW0uaCIKIC8qCiAgKiBUaGUgYWN0dWFsIGNvZGUgaXMgaW4gc3Rv cmFnZS9jaGVja3N1bV9pbXBsLmguICBUaGlzIGlzIGRvbmUgc28gdGhhdAogICogZXh0ZXJuYWwg cHJvZ3JhbXMgY2FuIGluY29ycG9yYXRlIHRoZSBjaGVja3N1bSBjb2RlIGJ5ICNpbmNsdWRlJ2lu ZwotICogdGhhdCBmaWxlIGZyb20gdGhlIGV4cG9ydGVkIFBvc3RncmVzIGhlYWRlcnMuICAoQ29t cGFyZSBvdXIgQ1JDIGNvZGUuKQorICogdGhhdCBmaWxlIGZyb20gdGhlIGV4cG9ydGVkIFBvc3Rn cmVzIGhlYWRlcnMuICAoQ29tcGFyZSBvdXIgbGVnYWN5CisgKiBDUkMgY29kZSBpbiBwZ19jcmMu aC4pCisgKiBUaGUgUEdfQ0hFQ0tTVU1fSU5URVJOQUwgc3ltYm9sIGFsbG93cyBjb3JlIHRvIHVz ZSBoYXJkd2FyZS1zcGVjaWZpYworICogY29kaW5nIHdpdGhvdXQgYWZmZWN0aW5nIGV4dGVybmFs IHByb2dyYW1zLgogICovCisjZGVmaW5lIFBHX0NIRUNLU1VNX0lOVEVSTkFMCiAjaW5jbHVkZSAi c3RvcmFnZS9jaGVja3N1bV9pbXBsLmgiCS8qIElXWVUgcHJhZ21hOiBrZWVwICovCisKKworc3Rh dGljIHVpbnQzMgorcGdfY2hlY2tzdW1fYmxvY2tfZmFsbGJhY2soY29uc3QgUEdDaGVja3N1bW1h YmxlUGFnZSAqcGFnZSkKK3sKKyNpbmNsdWRlICJzdG9yYWdlL2NoZWNrc3VtX2Jsb2NrLmluYy5j IgorfQorCisvKgorICogQVZYMi1vcHRpbWl6ZWQgYmxvY2sgY2hlY2tzdW0gYWxnb3JpdGhtLgor ICovCisjaWZkZWYgVVNFX0FWWDJfV0lUSF9SVU5USU1FX0NIRUNLCitwZ19hdHRyaWJ1dGVfdGFy Z2V0KCJhdngyIikKK3N0YXRpYyB1aW50MzIKK3BnX2NoZWNrc3VtX2Jsb2NrX2F2eDIoY29uc3Qg UEdDaGVja3N1bW1hYmxlUGFnZSAqcGFnZSkKK3sKKyNpbmNsdWRlICJzdG9yYWdlL2NoZWNrc3Vt X2Jsb2NrLmluYy5jIgorfQorI2VuZGlmCQkJCQkJCS8qIFVTRV9BVlgyX1dJVEhfUlVOVElNRV9D SEVDSyAqLworCisvKgorICogQ2hvb3NlIHRoZSBiZXN0IGF2YWlsYWJsZSBjaGVja3N1bSBpbXBs ZW1lbnRhdGlvbi4KKyAqLworc3RhdGljIHVpbnQzMgorcGdfY2hlY2tzdW1fY2hvb3NlKGNvbnN0 IFBHQ2hlY2tzdW1tYWJsZVBhZ2UgKnBhZ2UpCit7CisJcGdfY2hlY2tzdW1fYmxvY2sgPSBwZ19j aGVja3N1bV9ibG9ja19mYWxsYmFjazsKKworI2lmZGVmIFVTRV9BVlgyX1dJVEhfUlVOVElNRV9D SEVDSworCWlmICh4ODZfZmVhdHVyZV9hdmFpbGFibGUoUEdfQVZYMikpCisJCXBnX2NoZWNrc3Vt X2Jsb2NrID0gcGdfY2hlY2tzdW1fYmxvY2tfYXZ4MjsKKyNlbmRpZgorCisJcmV0dXJuIHBnX2No ZWNrc3VtX2Jsb2NrKHBhZ2UpOworfQorCitzdGF0aWMgdWludDMyICgqcGdfY2hlY2tzdW1fYmxv Y2spIChjb25zdCBQR0NoZWNrc3VtbWFibGVQYWdlICpwYWdlKSA9IHBnX2NoZWNrc3VtX2Nob29z ZTsKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3BnX2NvbmZpZy5oLmluIGIvc3JjL2luY2x1ZGUv cGdfY29uZmlnLmguaW4KaW5kZXggZDhkNjE5MThhZmYuLjUzOTRhNjE0Zjg3IDEwMDY0NAotLS0g YS9zcmMvaW5jbHVkZS9wZ19jb25maWcuaC5pbgorKysgYi9zcmMvaW5jbHVkZS9wZ19jb25maWcu aC5pbgpAQCAtNjc3LDYgKzY3Nyw5IEBACiAvKiBEZWZpbmUgdG8gMSB0byB1c2UgQVZYLTUxMiBD UkMgYWxnb3JpdGhtcyB3aXRoIGEgcnVudGltZSBjaGVjay4gKi8KICN1bmRlZiBVU0VfQVZYNTEy X0NSQzMyQ19XSVRIX1JVTlRJTUVfQ0hFQ0sKIAorLyogRGVmaW5lIHRvIDEgdG8gdXNlIEFWWDIg aW5zdHJ1Y3Rpb25zIHdpdGggYSBydW50aW1lIGNoZWNrLiAqLworI3VuZGVmIFVTRV9BVlgyX1dJ VEhfUlVOVElNRV9DSEVDSworCiAvKiBEZWZpbmUgdG8gMSB0byB1c2UgQVZYLTUxMiBwb3Bjb3Vu dCBpbnN0cnVjdGlvbnMgd2l0aCBhIHJ1bnRpbWUgY2hlY2suICovCiAjdW5kZWYgVVNFX0FWWDUx Ml9QT1BDTlRfV0lUSF9SVU5USU1FX0NIRUNLCiAKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3Bv cnQvcGdfY3B1LmggYi9zcmMvaW5jbHVkZS9wb3J0L3BnX2NwdS5oCmluZGV4IGI5M2I4MjhkM2Fj Li5jNWQ5NmJiNGY0NyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvcG9ydC9wZ19jcHUuaAorKysg Yi9zcmMvaW5jbHVkZS9wb3J0L3BnX2NwdS5oCkBAIC0yNCw2ICsyNCw5IEBAIHR5cGVkZWYgZW51 bSBYODZGZWF0dXJlSWQKIAlQR19TU0U0XzIsCiAJUEdfUE9QQ05ULAogCisJLyogMjU2LWJpdCBZ TU0gcmVnaXN0ZXJzICovCisJUEdfQVZYMiwKKwogCS8qIDUxMi1iaXQgWk1NIHJlZ2lzdGVycyAq LwogCVBHX0FWWDUxMl9CVywKIAlQR19BVlg1MTJfVkwsCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVk ZS9zdG9yYWdlL2NoZWNrc3VtX2Jsb2NrLmluYy5jIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9jaGVj a3N1bV9ibG9jay5pbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4u NmVmOGE5MTExNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaW5jbHVkZS9zdG9yYWdlL2NoZWNr c3VtX2Jsb2NrLmluYy5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoK KyAqIGNoZWNrc3VtX2Jsb2NrLmluYy5jCisgKgkgIENvcmUgYWxnb3JpdGhtIGZvciBwYWdlIGNo ZWNrc3Vtcywgc2VtaS1wcml2YXRlIHRvIGNoZWNrc3VtX2ltcGwuaAorICoJICBhbmQgY2hlY2tz dW0uYy4KKyAqCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTYtMjAyNiwgUG9zdGdyZVNR TCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5 NCwgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCisgKgorICogc3JjL2lu Y2x1ZGUvc3RvcmFnZS9jaGVja3N1bV9ibG9jay5pbmMuYworICoKKyAqLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorICovCisKKy8qIHRoZXJlIGlzIGRlbGliZXJhdGVseSBub3QgYW4gI2lmbmRlZiBDSEVDS1NV TV9CTE9DS19JTkNfQyBoZXJlICovCisKK3VpbnQzMgkJc3Vtc1tOX1NVTVNdOwordWludDMyCQly ZXN1bHQgPSAwOwordWludDMyCQlpLAorCQkJajsKKworLyogZW5zdXJlIHRoYXQgdGhlIHNpemUg aXMgY29tcGF0aWJsZSB3aXRoIHRoZSBhbGdvcml0aG0gKi8KK0Fzc2VydChzaXplb2YoUEdDaGVj a3N1bW1hYmxlUGFnZSkgPT0gQkxDS1NaKTsKKworLyogaW5pdGlhbGl6ZSBwYXJ0aWFsIGNoZWNr c3VtcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIG9mZnNldHMgKi8KK21lbWNweShzdW1zLCBjaGVj a3N1bUJhc2VPZmZzZXRzLCBzaXplb2YoY2hlY2tzdW1CYXNlT2Zmc2V0cykpOworCisvKiBtYWlu IGNoZWNrc3VtIGNhbGN1bGF0aW9uICovCitmb3IgKGkgPSAwOyBpIDwgKHVpbnQzMikgKEJMQ0tT WiAvIChzaXplb2YodWludDMyKSAqIE5fU1VNUykpOyBpKyspCisJZm9yIChqID0gMDsgaiA8IE5f U1VNUzsgaisrKQorCQlDSEVDS1NVTV9DT01QKHN1bXNbal0sIHBhZ2UtPmRhdGFbaV1bal0pOwor CisvKiBmaW5hbGx5IGFkZCBpbiB0d28gcm91bmRzIG9mIHplcm9lcyBmb3IgYWRkaXRpb25hbCBt aXhpbmcgKi8KK2ZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJZm9yIChqID0gMDsgaiA8IE5fU1VN UzsgaisrKQorCQlDSEVDS1NVTV9DT01QKHN1bXNbal0sIDApOworCisvKiB4b3IgZm9sZCBwYXJ0 aWFsIGNoZWNrc3VtcyB0b2dldGhlciAqLworZm9yIChpID0gMDsgaSA8IE5fU1VNUzsgaSsrKQor CXJlc3VsdCBePSBzdW1zW2ldOworCityZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvc3JjL2lu Y2x1ZGUvc3RvcmFnZS9jaGVja3N1bV9pbXBsLmggYi9zcmMvaW5jbHVkZS9zdG9yYWdlL2NoZWNr c3VtX2ltcGwuaAppbmRleCA1YzJkY2JjNjNlNy4uMjg1NzBhYmRkYTAgMTAwNjQ0Ci0tLSBhL3Ny Yy9pbmNsdWRlL3N0b3JhZ2UvY2hlY2tzdW1faW1wbC5oCisrKyBiL3NyYy9pbmNsdWRlL3N0b3Jh Z2UvY2hlY2tzdW1faW1wbC5oCkBAIC03MiwxMiArNzIsMTMgQEAKICAqIHJhbmRvbSBzZWdtZW50 cyBvZiBwYWdlIHdpdGggMHgwMCwgMHhGRiBhbmQgcmFuZG9tIGRhdGEgYWxsIHNob3cgb3B0aW1h bAogICogMmUtMTYgZmFsc2UgcG9zaXRpdmUgcmF0ZSB3aXRoaW4gbWFyZ2luIG9mIGVycm9yLgog ICoKLSAqIFZlY3Rvcml6YXRpb24gb2YgdGhlIGFsZ29yaXRobSByZXF1aXJlcyAzMmJpdCB4IDMy Yml0IC0+IDMyYml0IGludGVnZXIKLSAqIG11bHRpcGxpY2F0aW9uIGluc3RydWN0aW9uLiBBcyBv ZiAyMDEzIHRoZSBjb3JyZXNwb25kaW5nIGluc3RydWN0aW9uIGlzCi0gKiBhdmFpbGFibGUgb24g eDg2IFNTRTQuMSBleHRlbnNpb25zIChwbXVsbGQpIGFuZCBBUk0gTkVPTiAodm11bC5pMzIpLgot ICogVmVjdG9yaXphdGlvbiByZXF1aXJlcyBhIGNvbXBpbGVyIHRvIGRvIHRoZSB2ZWN0b3JpemF0 aW9uIGZvciB1cy4gRm9yIHJlY2VudAotICogR0NDIHZlcnNpb25zIHRoZSBmbGFncyAtbXNzZTQu MSAtZnVucm9sbC1sb29wcyAtZnRyZWUtdmVjdG9yaXplIGFyZSBlbm91Z2gKLSAqIHRvIGFjaGll dmUgdmVjdG9yaXphdGlvbi4KKyAqIFZlY3Rvcml6YXRpb24gb2YgdGhlIGFsZ29yaXRobSB3b3Jr cyBiZXN0IHdpdGggYSAzMmJpdCB4IDMyYml0IC0+IDMyYml0CisgKiB2ZWN0b3IgaW50ZWdlciBt dWx0aXBsaWNhdGlvbiBpbnN0cnVjdGlvbiwgRXhhbXBsZXMgaW5jbHVkZSB4ODYgQVZYMgorICog ZXh0ZW5zaW9ucyAodnBtdWxsZCkgYW5kIEFSTSBORU9OICh2bXVsLmkzMikuIFdpdGhvdXQgdGhh dCwgdmVjdG9yaXphdGlvbgorICogaXMgc3RpbGwgcG9zc2libGUgaWYgdGhlIGNvbXBpbGVyIGNh biB0dXJuIG11bHRpcGxpY2F0aW9uIGJ5IEZOVl9QUklNRQorICogaW50byBhIHNlcXVlbmNlIG9m IHZlY3Rvcml6ZWQgc2hpZnRzIGFuZCBhZGRzLiAgRm9yIHNpbXBsaWNpdHkgd2UgcmVseQorICog b24gdGhlIGNvbXBpbGVyIHRvIGRvIHRoZSB2ZWN0b3JpemF0aW9uIGZvciB1cy4gRm9yIEdDQyBh bmQgY2xhbmcgdGhlCisgKiBmbGFncyAtZnVucm9sbC1sb29wcyAtZnRyZWUtdmVjdG9yaXplIGFy ZSBlbm91Z2ggdG8gYWNoaWV2ZSB2ZWN0b3JpemF0aW9uLgogICoKICAqIFRoZSBvcHRpbWFsIGFt b3VudCBvZiBwYXJhbGxlbGlzbSB0byB1c2UgZGVwZW5kcyBvbiBDUFUgc3BlY2lmaWMgaW5zdHJ1 Y3Rpb24KICAqIGxhdGVuY3ksIFNJTUQgaW5zdHJ1Y3Rpb24gd2lkdGgsIHRocm91Z2hwdXQgYW5k IHRoZSBhbW91bnQgb2YgcmVnaXN0ZXJzCkBAIC04OSw4ICs5MCw5IEBACiAgKgogICogVGhlIHBh cmFsbGVsaXNtIG51bWJlciAzMiB3YXMgY2hvc2VuIGJhc2VkIG9uIHRoZSBmYWN0IHRoYXQgaXQg aXMgdGhlCiAgKiBsYXJnZXN0IHN0YXRlIHRoYXQgZml0cyBpbnRvIGFyY2hpdGVjdHVyYWxseSB2 aXNpYmxlIHg4NiBTU0UgcmVnaXN0ZXJzIHdoaWxlCi0gKiBsZWF2aW5nIHNvbWUgZnJlZSByZWdp c3RlcnMgZm9yIGludGVybWVkaWF0ZSB2YWx1ZXMuIEZvciBmdXR1cmUgcHJvY2Vzc29ycwotICog d2l0aCAyNTZiaXQgdmVjdG9yIHJlZ2lzdGVycyB0aGlzIHdpbGwgbGVhdmUgc29tZSBwZXJmb3Jt YW5jZSBvbiB0aGUgdGFibGUuCisgKiBsZWF2aW5nIHNvbWUgZnJlZSByZWdpc3RlcnMgZm9yIGlu dGVybWVkaWF0ZSB2YWx1ZXMuIEZvciBwcm9jZXNzb3JzCisgKiB3aXRoIDI1Ni1iaXQgdmVjdG9y IHJlZ2lzdGVycyB0aGlzIGxlYXZlcyBzb21lIHBlcmZvcm1hbmNlIG9uIHRoZSB0YWJsZS4KKyAq CiAgKiBXaGVuIHZlY3Rvcml6YXRpb24gaXMgbm90IGF2YWlsYWJsZSBpdCBtaWdodCBiZSBiZW5l ZmljaWFsIHRvIHJlc3RydWN0dXJlCiAgKiB0aGUgY29tcHV0YXRpb24gdG8gY2FsY3VsYXRlIGEg c3Vic2V0IG9mIHRoZSBjb2x1bW5zIGF0IGEgdGltZSBhbmQgcGVyZm9ybQogICogbXVsdGlwbGUg cGFzc2VzIHRvIGF2b2lkIHJlZ2lzdGVyIHNwaWxsaW5nLiBUaGlzIG9wdGltaXphdGlvbiBvcHBv cnR1bml0eQpAQCAtMTM4LDYgKzE0MCw5IEBAIGRvIHsgXAogCShjaGVja3N1bSkgPSBfX3RtcCAq IEZOVl9QUklNRSBeIChfX3RtcCA+PiAxNyk7IFwKIH0gd2hpbGUgKDApCiAKKy8qIFByb3ZpZGUg YSBzdGF0aWMgZGVmaW5pdGlvbiBmb3IgZXh0ZXJuYWwgcHJvZ3JhbXMgKi8KKyNpZm5kZWYgUEdf Q0hFQ0tTVU1fSU5URVJOQUwKKwogLyoKICAqIEJsb2NrIGNoZWNrc3VtIGFsZ29yaXRobS4gIFRo ZSBwYWdlIG11c3QgYmUgYWRlcXVhdGVseSBhbGlnbmVkCiAgKiAoYXQgbGVhc3Qgb24gNC1ieXRl IGJvdW5kYXJ5KS4KQEAgLTE0NSwzNCArMTUwLDEzIEBAIGRvIHsgXAogc3RhdGljIHVpbnQzMgog cGdfY2hlY2tzdW1fYmxvY2soY29uc3QgUEdDaGVja3N1bW1hYmxlUGFnZSAqcGFnZSkKIHsKLQl1 aW50MzIJCXN1bXNbTl9TVU1TXTsKLQl1aW50MzIJCXJlc3VsdCA9IDA7Ci0JdWludDMyCQlpLAot CQkJCWo7Ci0KLQkvKiBlbnN1cmUgdGhhdCB0aGUgc2l6ZSBpcyBjb21wYXRpYmxlIHdpdGggdGhl IGFsZ29yaXRobSAqLwotCUFzc2VydChzaXplb2YoUEdDaGVja3N1bW1hYmxlUGFnZSkgPT0gQkxD S1NaKTsKLQotCS8qIGluaXRpYWxpemUgcGFydGlhbCBjaGVja3N1bXMgdG8gdGhlaXIgY29ycmVz cG9uZGluZyBvZmZzZXRzICovCi0JbWVtY3B5KHN1bXMsIGNoZWNrc3VtQmFzZU9mZnNldHMsIHNp emVvZihjaGVja3N1bUJhc2VPZmZzZXRzKSk7Ci0KLQkvKiBtYWluIGNoZWNrc3VtIGNhbGN1bGF0 aW9uICovCi0JZm9yIChpID0gMDsgaSA8ICh1aW50MzIpIChCTENLU1ogLyAoc2l6ZW9mKHVpbnQz MikgKiBOX1NVTVMpKTsgaSsrKQotCQlmb3IgKGogPSAwOyBqIDwgTl9TVU1TOyBqKyspCi0JCQlD SEVDS1NVTV9DT01QKHN1bXNbal0sIHBhZ2UtPmRhdGFbaV1bal0pOwotCi0JLyogZmluYWxseSBh ZGQgaW4gdHdvIHJvdW5kcyBvZiB6ZXJvZXMgZm9yIGFkZGl0aW9uYWwgbWl4aW5nICovCi0JZm9y IChpID0gMDsgaSA8IDI7IGkrKykKLQkJZm9yIChqID0gMDsgaiA8IE5fU1VNUzsgaisrKQotCQkJ Q0hFQ0tTVU1fQ09NUChzdW1zW2pdLCAwKTsKLQotCS8qIHhvciBmb2xkIHBhcnRpYWwgY2hlY2tz dW1zIHRvZ2V0aGVyICovCi0JZm9yIChpID0gMDsgaSA8IE5fU1VNUzsgaSsrKQotCQlyZXN1bHQg Xj0gc3Vtc1tpXTsKLQotCXJldHVybiByZXN1bHQ7CisjaW5jbHVkZSAic3RvcmFnZS9jaGVja3N1 bV9ibG9jay5pbmMuYyIKIH0KIAorI2Vsc2UKK3N0YXRpYyB1aW50MzIgKCpwZ19jaGVja3N1bV9i bG9jaykgKGNvbnN0IFBHQ2hlY2tzdW1tYWJsZVBhZ2UgKnBhZ2UpOworI2VuZGlmCisKIC8qCiAg KiBDb21wdXRlIHRoZSBjaGVja3N1bSBmb3IgYSBQb3N0Z3JlcyBwYWdlLgogICoKZGlmZiAtLWdp dCBhL3NyYy9wb3J0L3BnX2NwdV94ODYuYyBiL3NyYy9wb3J0L3BnX2NwdV94ODYuYwppbmRleCBl MmFiOTJiMDlhYy4uZjA2OWFmZDFjNTMgMTAwNjQ0Ci0tLSBhL3NyYy9wb3J0L3BnX2NwdV94ODYu YworKysgYi9zcmMvcG9ydC9wZ19jcHVfeDg2LmMKQEAgLTEyMSw2ICsxMjEsMTAgQEAgc2V0X3g4 Nl9mZWF0dXJlcyh2b2lkKQogCQl4Y3IwX3ZhbCA9IF94Z2V0YnYoMCk7CiAjZW5kaWYKIAorCQkv KiBBcmUgWU1NIHJlZ2lzdGVycyBlbmFibGVkPyAqLworCQlpZiAobWFza19hdmFpbGFibGUoeGNy MF92YWwsIFhNTSB8IFlNTSkpCisJCQlYODZGZWF0dXJlc1tQR19BVlgyXSA9IHJlZ1tFQlhdID4+ IDUgJiAxOworCiAJCS8qIEFyZSBaTU0gcmVnaXN0ZXJzIGVuYWJsZWQ/ICovCiAJCWlmIChtYXNr X2F2YWlsYWJsZSh4Y3IwX3ZhbCwgWE1NIHwgWU1NIHwKIAkJCQkJCSAgIE9QTUFTSyB8IFpNTTBf MTUgfCBaTU0xNl8zMSkpCi0tIAoyLjUzLjAKCg== --0000000000007bba90064e3c9bbf--