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 1w1XiB-000OCv-1e for pgsql-hackers@arkaria.postgresql.org; Sat, 14 Mar 2026 22:44: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 1w1Xi8-002zFm-34 for pgsql-hackers@arkaria.postgresql.org; Sat, 14 Mar 2026 22:43:57 +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 1w1Xi8-002zFc-0o for pgsql-hackers@lists.postgresql.org; Sat, 14 Mar 2026 22:43:57 +0000 Received: from mail-ed1-x534.google.com ([2a00:1450:4864:20::534]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w1Xi4-00000000AC4-3Uov for pgsql-hackers@postgresql.org; Sat, 14 Mar 2026 22:43:54 +0000 Received: by mail-ed1-x534.google.com with SMTP id 4fb4d7f45d1cf-661b16ac011so5814588a12.2 for ; Sat, 14 Mar 2026 15:43:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1773528231; cv=none; d=google.com; s=arc-20240605; b=f9COQj/LrmEn6t7rXOnpgT8HXjIFi1GruTQM0ts1i08cvGUUFcwcn3pmCTXJUNHiEl ceJEITc05hdUGVpHd2FRrTSzgzTjC95ocBaiauOqNXzR3bkAI6t25KknhnldHCkBIbZD eGJL7LajpYRy0zPLbtSzpOJ5zcdIb0TI0zNYCoI88w/my1HJcglYMCvzmWzb5yKiGS9v 8ddR1lVyXx7epKTsOh9HvZUg2MWO2hiV0rWh5IriPEBM9V2KH9aFshPbN8RX4Lk92+sZ yo+Vj5jR31+MtiCWQPcOfzIKpPFhW0hZc1JtORWXD75ae4eyj0RBeUd7ZfpNnVg11Fff CGJA== 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=L4U4upBAy2Yw8zUJ87KH3xdDhQc13xwXKGpypesKDZs=; fh=m33QZEfAdUPr40jZBntmkGq5owhVrJadaKhMGw9IArU=; b=S+6l4qKHukbhpw98zYgmuwaQjFJkb90xZjJsD7y5NrLjmBGAaw1NeSNqXaRPjhBdSl 7C6ARY84rhMqZ3wmNYd62xTP+4S80/uDYFL1WYH+NOOFzyW956JhIQyJx1xZi0zLqtqO khGs5aSlkWcWyhDINs7EWsEMc8tMmm0VqZp86mQYz1/XAuwSiISodS9BtKw2xW7dopG0 +72+We5+QNYPaQQRykid87AvwfSOJY0MyLlQpeUAzzr4Tra4me64rfF8tdaINwqM1pk5 Z83hQrlkZNo8nA5oX9MNZ7o8AyCNhWaWlSk22o9gCZDHEj5aAK48rI5fn2tISR6A7MGx uafA==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=esi.dz; s=google; t=1773528231; x=1774133031; darn=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=L4U4upBAy2Yw8zUJ87KH3xdDhQc13xwXKGpypesKDZs=; b=Y/eNr3GTBdEprchEUijGzOoRW9LbKiVrQ3b/3Eh006WhwQhYjXNd34v+k/8+HIS/El kXHklsrkFcyfVJoz/kC/abSKLic+BLEcM8ZLVR+F+rz6KbYx22xZe6wBKPyJ4aO/6TbH p4uWNWlfyonCnbetwq56u8J8ll8NJKyXO59Cq2UcDk1kuuZnt8s8+QBSWiSfgsODv+JY 5jvbgItSgy7NfOSD7/kQEk/fp9jjVN0SaZ2WeEhoBA+L7nR0ICBmw0Sh0I2AX701/pDG fEgNpxx2q/GRoGjc07V+zU9dZ8+FXSkwYSEPCrWuZ9KOqRw3I1zWfqCrUyzNqomjwfjR JY/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773528231; x=1774133031; 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=L4U4upBAy2Yw8zUJ87KH3xdDhQc13xwXKGpypesKDZs=; b=cGYz7L0i+WaNxmoI/p67NCg3tj7hkHfPDtuR6sM14q+FF1L+xdWf5ecS06vFaAY3vZ 1sigdXf2HS1LRahdiR1L9dVjLauUJmXSNouo6KegwCVW5osBuLc/B6U0thY1FWzjmNTz bCuQVNqv/uKdG+iWzBuuwGrlEw+2cnryOcKdnRN8KBZNd/DTZXLuRK2iVWOm4E9rroMd mFcWLnEmE3cXc3Fb/4t04wLjH13QzPzoKecWxL9bcuFKSJ2fGeypvNi4mYbEBGgPyRto uWVu7W62+ELkVtJXx+6lOOVgXnG0lrdOFeeVQfm86ZoxOlDGcFgggnlyvauxiHjEB9sW i02g== X-Forwarded-Encrypted: i=1; AJvYcCUoV0ccoEIBPd6ff70eNAr/wpIb6hmIyqKgnLV6LigT8EKD43yEpwGnuFRv+ibCtqSdzyyWaJERbvhxZsE4@postgresql.org X-Gm-Message-State: AOJu0YysoKKnknB6b7iyiKEYJyR2pJCdzEHECGcpWFWMcwuuywldjPYb aIHBSdzvv0ZEHrsopJRZ1NhF5o69DNz5BzwyBn0aNywfH1yIv11qCZAIqk1gvmt1WMO6tgQjkMd lehKdbje0IMUTKH03Mi7PzZXKLRNQl+5QkD1L8rWV X-Gm-Gg: ATEYQzxNV1/3I+Rm0nN8iINKxNUur76IJmnRBbWV+2HQCj9Wl/s66zYhaQbLpx8hbv/ PaE2GY/0CekuwWujYVZ7u+7ZwNe9y1NNOVbEsC2uarDRySBVI4leM0OeiphwbKBjNAOF+IELl9W L1ROYCKlq0Pt5E2cDxW4gUVRxX6qfuN+1EO4l3JzEFGoj3sEmWCHZwIAL012WThWD1/RjbNtNlh 2EUdVLTk6zvLBCV3IA/FHNr4YD969CUFXr6yzMSDtZeW5krey+Z0WL4YAc6wWaN6r/VL2tuQQbd UJg/McWq966vMzWYd2hbxQ8WzaZW/mns1+69ZAByiP7PhsAyo24ybH7uzudxTWl9Smi2mppF/yS gow460ejHc6529AVDACW4ic8wc3Y= X-Received: by 2002:a05:6402:280e:b0:662:fad8:4a9f with SMTP id 4fb4d7f45d1cf-663ba8b62f3mr4898372a12.9.1773528230479; Sat, 14 Mar 2026 15:43:50 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: KAZAR Ayoub Date: Sat, 14 Mar 2026 23:43:38 +0100 X-Gm-Features: AaiRm53ffm51l_GgH7GdNCq-Qvvwlp7TwBDKrwAerpIfKzgwznKMRyOd7SWg8HE Message-ID: Subject: Re: Speed up COPY TO text/CSV parsing using SIMD To: Nathan Bossart Cc: Andres Freund , Pg Hackers , Neil Conway , Manni Wood , Andrew Dunstan , Shinya Kato , Mark Wong , Nazir Bilal Yavuz Content-Type: multipart/mixed; boundary="0000000000002d8cf6064d03b866" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000002d8cf6064d03b866 Content-Type: multipart/alternative; boundary="0000000000002d8cf4064d03b864" --0000000000002d8cf4064d03b864 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hello, On Tue, Mar 10, 2026 at 8:17=E2=80=AFPM Nathan Bossart wrote: > On Sat, Feb 14, 2026 at 04:02:21PM +0100, KAZAR Ayoub wrote: > > On Thu, Feb 12, 2026 at 10:25=E2=80=AFPM Andres Freund > wrote: > >> I have a hard time believing that adding a strlen() to the handling of= a > >> short column won't be a measurable overhead with lots of short > attributes. > >> Particularly because the patch afaict will call it repeatedly if there > are > >> any to-be-escaped characters. > > > > [...] > > > > 1000 columns: > > TEXT: 17% regression > > CSV: 3.4% regression > > > > 500 columns: > > TEXT: 17.7% regression > > CSV: 3.1% regression > > > > 100 columns: > > TEXT: 17.3% regression > > CSV: 3% regression > > > > A bit unstable results, but yeah the overhead for worse cases like this > is > > really significant, I can't argue whether this is worth it or not, so > > thoughts on this ? > > I seriously doubt we'd commit something that produces a 17% regression > here. Perhaps we should skip the SIMD paths whenever transcoding is > required. > > -- > nathan > I've spent some time rethinking about this and here's what i've done in v3: SIMD is only used for varlena attributes whose text representation is longer than a single SIMD vector, and only when no transcoding is required. Fixed-size types such as integers etc.. mostly produce short ASCII output for which SIMD provides no benefit. For eligible attributes, the stored varlena size is used as a cheap pre-filter to avoid an unnecessary strlen() call on short values. Here are the benchmark results after many runs compared to master (4deecb52aff): TEXT clean: -34.0% CSV clean: -39.3% TEXT 1/3: +4.7% CSV 1/3: -2.3% the above numbers have a variance of 1% to 3% improvs or regressions across +20 runs WIDE tables short attributes TEXT: 50 columns: -3.7% 100 columns: -1.7% 200 columns: +1.8% 500 columns: -0.5% 1000 columns: -0.3% WIDE tables short attributes CSV: 50 columns: -2.5% 100 columns: +1.8% 200 columns: +1.4% 500 columns: -0.9% 1000 columns: -1.1% Wide tables benchmarks where all similar noise, across +20 runs its always around -2% and +4% for all numbers of columns. Just a small concern about where some varlenas have a larger binary size than its text representation ex: SELECT pg_column_size(to_tsvector('SIMD is GOOD')); pg_column_size ---------------- 32 its text representation is less than sizeof(Vector8) so currently v3 would enter SIMD path and exit out just from the beginning (two extra branches) because it does this: + if (TupleDescAttr(tup_desc, attnum - 1)->attlen =3D=3D -1 && + VARSIZE_ANY_EXHDR(DatumGetPointer(value)) > sizeof(Vector8)) I thought maybe we could do * 2 or * 4 its binary size, depends on the type really but this is just a proposition if this case is something concerning. Thoughts? Regards, Ayoub --0000000000002d8cf4064d03b864 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hello,
On Tue, Mar 10, 2026 at 8:17= =E2=80=AFPM Nathan Bossart <= nathandbossart@gmail.com> wrote:
On Sat, Feb 14, 2026 at 04:02:21PM +0100, KAZAR Ayo= ub wrote:
> On Thu, Feb 12, 2026 at 10:25=E2=80=AFPM Andres Freund <andres@anarazel.de> wro= te:
>> I have a hard time believing that adding a strlen() to the handlin= g of a
>> short column won't be a measurable overhead with lots of short= attributes.
>> Particularly because the patch afaict will call it repeatedly if t= here are
>> any to-be-escaped characters.
>
> [...]
>
> 1000 columns:
> TEXT: 17% regression
> CSV: 3.4% regression
>
> 500 columns:
> TEXT: 17.7% regression
> CSV: 3.1% regression
>
> 100 columns:
> TEXT: 17.3% regression
> CSV: 3% regression
>
> A bit unstable results, but yeah the overhead for worse cases like thi= s is
> really significant, I can't argue whether this is worth it or not,= so
> thoughts on this ?

I seriously doubt we'd commit something that produces a 17% regression<= br> here.=C2=A0 Perhaps we should skip the SIMD paths whenever transcoding is required.

--
nathan
I've spent some time rethinking about this = and here's what i've done in v3:
SIMD is only used fo= r varlena attributes whose text representation is longer than a single SIMD= vector, and only when no transcoding is required. =C2=A0
Fixed-s= ize types such as integers etc.. mostly produce short ASCII output for whic= h SIMD provides no benefit.

For eligible attributes, the stored varl= ena size is used as a cheap pre-filter to avoid an
unnecessary strlen() = call on short values.

Here are the benchmark results afte= r many runs compared to master (4deecb52aff):
TEXT clean: -34.0%<= /div>
CSV clean: -39.3%
TEXT 1/3:=C2=A0+4.7%
CSV 1/= 3: -2.3%
the above numbers have a variance of 1% to 3% improvs or= regressions across=C2=A0+20 runs

WIDE tables shor= t attributes TEXT:=C2=A0
50 columns: -3.7%=C2=A0
100 co= lumns: -1.7%=C2=A0
200 columns: +1.8%=C2=A0
500 columns= : -0.5%=C2=A0
1000 columns: -0.3%

WIDE tables short attributes CSV:=C2=A0
50 columns: -2.5%
100 columns: +1.8%
200 columns: +1.4%=C2=A0
500 c= olumns: -0.9%=C2=A0
1000 columns:=C2=A0-1.1%

Wi= de tables benchmarks where all similar noise, across=C2=A0+20 runs its alwa= ys around -2% and=C2=A0+4% for all numbers of columns.

Ju= st a small concern about where some varlenas have a larger binary size than= its text representation ex:=C2=A0
SELECT pg_column_size(to_tsvector(= 9;SIMD is GOOD'));
=C2=A0pg_column_size
----------------
=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A032

its text = representation is less than sizeof(Vector8) so currently v3 would enter SIM= D path and exit out just from the beginning (two extra branches)
= because it does this:
+ if (TupleDescAttr(tup_desc, attnum - 1)= ->attlen =3D=3D -1 &&
+ VARSIZE_ANY_EXHDR(DatumGetPointer(= value)) > sizeof(Vector8))

I thought maybe we could do= * 2 or * 4 its binary size, depends on the type really but this is just a = proposition if this case is something concerning.

= Thoughts?


Regards,
Ayoub<= /div>
--0000000000002d8cf4064d03b864-- --0000000000002d8cf6064d03b866 Content-Type: text/x-patch; charset="US-ASCII"; name="v3-0001-Speed-up-COPY-TO-FORMAT-text-csv-using-SIMD.patch" Content-Disposition: attachment; filename="v3-0001-Speed-up-COPY-TO-FORMAT-text-csv-using-SIMD.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmqwj9sj0 RnJvbSBhMjIyNThkZmU0MmQ5ODA0Y2Q2Y2M0MWM3YTE1MTUxYzRkMzBjOGI5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBeW91YktBWiA8a2F6YXJheW91YjIwMDRAZ21haWwuY29tPgpE YXRlOiBTYXQsIDE0IE1hciAyMDI2IDIyOjUyOjIyICswMTAwClN1YmplY3Q6IFtQQVRDSF0gU3Bl ZWQgdXAgQ09QWSBUTyAoRk9STUFUIHt0ZXh0LGNzdn0pIHVzaW5nIFNJTUQuIFByZXNlbnRseSwK IHN1Y2ggY29tbWFuZHMgc2NhbiBlYWNoIGF0dHJpYnV0ZSdzIHN0cmluZyByZXByZXNlbnRhdGlv biBvbmUgYnl0ZSBhdCBhIHRpbWUKIGxvb2tpbmcgZm9yIHNwZWNpYWwgY2hhcmFjdGVycy4gIFRo aXMgY29tbWl0IGFkZHMgYSBuZXcgcGF0aCB0aGF0IHVzZXMgU0lNRAogaW5zdHJ1Y3Rpb25zIHRv IHNraXAgb3ZlciBjaHVua3Mgb2YgZGF0YSB3aXRob3V0IGFueSBzcGVjaWFsIGNoYXJhY3RlcnMu IAogVGhpcyBjYW4gYmUgbXVjaCBmYXN0ZXIuCgpTSU1EIHByb2Nlc3NpbmcgaXMgb25seSB1c2Vk IGZvciB2YXJsZW5hIGF0dHJpYnV0ZXMgd2hvc2UgdGV4dApyZXByZXNlbnRhdGlvbiBpcyBsb25n ZXIgdGhhbiBhIHNpbmdsZSBTSU1EIHZlY3RvciwgYW5kIG9ubHkgd2hlbgpubyBlbmNvZGluZyBj b252ZXJzaW9uIGlzIHJlcXVpcmVkLiAgRml4ZWQtc2l6ZSB0eXBlcyBzdWNoIGFzCmludGVnZXJz IGFuZCBib29sZWFucyBhbHdheXMgcHJvZHVjZSBzaG9ydCBBU0NJSSBvdXRwdXQgZm9yIHdoaWNo ClNJTUQgcHJvdmlkZXMgbm8gYmVuZWZpdCwgYW5kIHdoZW4gdHJhbnNjb2RpbmcgaXMgbmVlZGVk IHRoZSBzdHJpbmcKbGVuZ3RoIG1heSBjaGFuZ2UgYWZ0ZXIgY29udmVyc2lvbi4gIEZvciBlbGln aWJsZSBhdHRyaWJ1dGVzLCB0aGUKc3RvcmVkIHZhcmxlbmEgc2l6ZSBpcyB1c2VkIGFzIGEgY2hl YXAgcHJlLWZpbHRlciB0byBhdm9pZCBhbgp1bm5lY2Vzc2FyeSBzdHJsZW4oKSBjYWxsIG9uIHNo b3J0IHZhbHVlcywgdGhpcyB2ZXJzaW9uIGFsc28gYXZvaWRzCmNhbGxpbmcgc3RybGVuIHR3aWNl IHdoZW4gdHJhbnNjb2RpbmcgaXMgbmVjZXNzYXJ5LgoKRm9yIFRFWFQgbW9kZSwgdGhlIFNJTUQg cGF0aCBzY2FucyBmb3IgQVNDSUkgY29udHJvbCBjaGFyYWN0ZXJzLApiYWNrc2xhc2gsIGFuZCB0 aGUgZGVsaW1pdGVyLiAgRm9yIENTViBtb2RlLCB0d28gU0lNRCBoZWxwZXJzIGFyZQp1c2VkOiBv bmUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBmaWVsZCByZXF1aXJlcyBxdW90aW5nIGJ5IHNjYW5u aW5nCmZvciB0aGUgZGVsaW1pdGVyLCBxdW90ZSBjaGFyYWN0ZXIsIGFuZCBlbmQtb2YtbGluZSBj aGFyYWN0ZXJzLCBhbmQKb25lIHRvIHNjYW4gZm9yIGNoYXJhY3RlcnMgcmVxdWlyaW5nIGVzY2Fw aW5nIGR1cmluZyB0aGUgb3V0cHV0IHBhc3MuCkluIGJvdGggbW9kZXMsIHRoZSBzY2FsYXIgcGF0 aCBoYW5kbGVzIGFueSByZW1haW5pbmcgY2hhcmFjdGVycyBhZnRlcgp0aGUgU0lNRCBwcmUtcGFz cy4KLS0tCiBzcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5dG8uYyB8IDI1NCArKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrLS0tCiAxIGZpbGUgY2hhbmdlZCwgMjM2IGluc2VydGlvbnMoKyks IDE4IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHl0 by5jIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weXRvLmMKaW5kZXggZDZlZjcyNzVhNjQuLmZk ZTE5ZjlhNmE0IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5dG8uYworKysg Yi9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5dG8uYwpAQCAtMzEsNiArMzEsOCBAQAogI2luY2x1 ZGUgIm1iL3BnX3djaGFyLmgiCiAjaW5jbHVkZSAibWlzY2FkbWluLmgiCiAjaW5jbHVkZSAicGdz dGF0LmgiCisjaW5jbHVkZSAicG9ydC9wZ19iaXR1dGlscy5oIgorI2luY2x1ZGUgInBvcnQvc2lt ZC5oIgogI2luY2x1ZGUgInN0b3JhZ2UvZmQuaCIKICNpbmNsdWRlICJ0Y29wL3Rjb3Bwcm90Lmgi CiAjaW5jbHVkZSAidXRpbHMvbHN5c2NhY2hlLmgiCkBAIC0xMTcsMTEgKzExOSwxNDcgQEAgc3Rh dGljIGNvbnN0IGNoYXIgQmluYXJ5U2lnbmF0dXJlWzExXSA9ICJQR0NPUFlcblwzNzdcclxuXDAi Owogc3RhdGljIHZvaWQgRW5kQ29weShDb3B5VG9TdGF0ZSBjc3RhdGUpOwogc3RhdGljIHZvaWQg Q2xvc2VQaXBlVG9Qcm9ncmFtKENvcHlUb1N0YXRlIGNzdGF0ZSk7CiBzdGF0aWMgdm9pZCBDb3B5 T25lUm93VG8oQ29weVRvU3RhdGUgY3N0YXRlLCBUdXBsZVRhYmxlU2xvdCAqc2xvdCk7Ci1zdGF0 aWMgdm9pZCBDb3B5QXR0cmlidXRlT3V0VGV4dChDb3B5VG9TdGF0ZSBjc3RhdGUsIGNvbnN0IGNo YXIgKnN0cmluZyk7Ci1zdGF0aWMgdm9pZCBDb3B5QXR0cmlidXRlT3V0Q1NWKENvcHlUb1N0YXRl IGNzdGF0ZSwgY29uc3QgY2hhciAqc3RyaW5nLAotCQkJCQkJCQlib29sIHVzZV9xdW90ZSk7Citz dGF0aWMgcGdfYXR0cmlidXRlX2Fsd2F5c19pbmxpbmUgdm9pZCBDb3B5QXR0cmlidXRlT3V0VGV4 dChDb3B5VG9TdGF0ZSBjc3RhdGUsIGNvbnN0IGNoYXIgKnN0cmluZywKKwkJCQkJCQkJCQkJCQkJ CWJvb2wgdXNlX3NpbWQsIHNpemVfdCBsZW4pOworc3RhdGljIHBnX2F0dHJpYnV0ZV9hbHdheXNf aW5saW5lIHZvaWQgQ29weUF0dHJpYnV0ZU91dENTVihDb3B5VG9TdGF0ZSBjc3RhdGUsIGNvbnN0 IGNoYXIgKnN0cmluZywKKwkJCQkJCQkJCQkJCQkJICAgYm9vbCB1c2VfcXVvdGUsIGJvb2wgdXNl X3NpbWQsIHNpemVfdCBsZW4pOwogc3RhdGljIHZvaWQgQ29weVJlbGF0aW9uVG8oQ29weVRvU3Rh dGUgY3N0YXRlLCBSZWxhdGlvbiByZWwsIFJlbGF0aW9uIHJvb3RfcmVsLAogCQkJCQkJICAgdWlu dDY0ICpwcm9jZXNzZWQpOworc3RhdGljIHZvaWQgQ29weVNraXBUZXh0U0lNRChjb25zdCBjaGFy ICoqcHRyLAorCQkJCQkJCSBzaXplX3QgbGVuLCBjaGFyIGRlbGltYyk7CitzdGF0aWMgdm9pZCBD b3B5Q2hlY2tDU1ZRdW90ZU5lZWRTSU1EKGNvbnN0IGNoYXIgKipwdHIsCisJCQkJCQkJCQkgIHNp emVfdCBsZW4sIGNoYXIgZGVsaW1jLCBjaGFyIHF1b3RlYyk7CitzdGF0aWMgdm9pZCBDb3B5U2tp cENTVkVzY2FwZVNJTUQoY29uc3QgY2hhciAqKnB0ciwKKwkJCQkJCQkJICBzaXplX3QgbGVuLCBj aGFyIGVzY2FwZWMsIGNoYXIgcXVvdGVjKTsKKworLyoKKyAqIENvcHlTa2lwVGV4dFNJTUQgLSBT Y2FuIGZvcndhcmQgaW4gVEVYVCBtb2RlIHVzaW5nIFNJTUQsCisgKiBzdG9wcGluZyBhdCB0aGUg Zmlyc3Qgc3BlY2lhbCBjaGFyYWN0ZXIgdGhlbiBjYWxsZXIgY29udGludWVzIHByb2Nlc3Npbmcg YW55IHJlbWFpbmluZworICogY2hhcmFjdGVycyBpbiB0aGUgc2NhbGFyIHBhdGguCisgKgorICog U3BlY2lhbCBjaGFyYWN0ZXJzIGZvciBURVhUIG1vZGUgYXJlOiBBU0NJSSBjb250cm9sIGNoYXJh Y3RlcnMgKDwgMHgyMCksCisgKiBiYWNrc2xhc2gsIGFuZCB0aGUgZGVsaW1pdGVyLgorICovCitz dGF0aWMgdm9pZAorQ29weVNraXBUZXh0U0lNRChjb25zdCBjaGFyICoqcHRyLCBzaXplX3QgbGVu LCBjaGFyIGRlbGltYykKK3sKKyNpZm5kZWYgVVNFX05PX1NJTUQKKwljb25zdCBjaGFyICpwID0g KnB0cjsKKwljb25zdCBjaGFyICplbmQgPSBwICsgbGVuOworCisJY29uc3QgVmVjdG9yOCBiYWNr c2xhc2hfbWFzayA9IHZlY3RvcjhfYnJvYWRjYXN0KCdcXCcpOworCWNvbnN0IFZlY3RvcjggZGVs aW1fbWFzayA9IHZlY3RvcjhfYnJvYWRjYXN0KGRlbGltYyk7CisJY29uc3QgVmVjdG9yOCBjb250 cm9sX21hc2sgPSB2ZWN0b3I4X2Jyb2FkY2FzdCgweDIwKTsKKworCXdoaWxlIChwICsgc2l6ZW9m KFZlY3RvcjgpIDw9IGVuZCkKKwl7CisJCVZlY3RvcjgJCWNodW5rOworCQlWZWN0b3I4CQltYXRj aDsKKworCQl2ZWN0b3I4X2xvYWQoJmNodW5rLCAoY29uc3QgdWludDggKikgcCk7CisKKwkJbWF0 Y2ggPSB2ZWN0b3I4X29yKHZlY3RvcjhfZ3QoY29udHJvbF9tYXNrLCBjaHVuayksCisJCQkJCQkg ICB2ZWN0b3I4X2VxKGNodW5rLCBiYWNrc2xhc2hfbWFzaykpOworCQltYXRjaCA9IHZlY3Rvcjhf b3IobWF0Y2gsIHZlY3RvcjhfZXEoY2h1bmssIGRlbGltX21hc2spKTsKKworCQlpZiAodmVjdG9y OF9pc19oaWdoYml0X3NldChtYXRjaCkpCisJCXsKKwkJCXVpbnQzMgkJbWFzazsKKworCQkJbWFz ayA9IHZlY3RvcjhfaGlnaGJpdF9tYXNrKG1hdGNoKTsKKwkJCSpwdHIgPSBwICsgcGdfcmlnaHRt b3N0X29uZV9wb3MzMihtYXNrKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXAgKz0gc2l6ZW9mKFZl Y3RvcjgpOworCX0KKworCSpwdHIgPSBwOworI2VuZGlmCit9CisKKy8qCisgKiBDb3B5Q2hlY2tD U1ZRdW90ZU5lZWRTSU1EIC0gU2NhbiBhIENTViBmaWVsZCB1c2luZyBTSU1EIHRvIGRldGVybWlu ZQorICogd2hldGhlciBpdCBuZWVkcyBxdW90aW5nIHN0b3BwaW5nIGF0IHRoZSBmaXJzdCBjaGFy YWN0ZXIgdGhhdCB3b3VsZCByZXF1aXJlIHRoZSBmaWVsZCB0byBiZSBxdW90ZWQ6CisgKiB0aGUg ZGVsaW1pdGVyLCB0aGUgcXVvdGUgY2hhcmFjdGVyLCBuZXdsaW5lLCBvciBjYXJyaWFnZSByZXR1 cm4uCisgKi8KK3N0YXRpYyB2b2lkCitDb3B5Q2hlY2tDU1ZRdW90ZU5lZWRTSU1EKGNvbnN0IGNo YXIgKipwdHIsIHNpemVfdCBsZW4sIGNoYXIgZGVsaW1jLCBjaGFyIHF1b3RlYykKK3sKKyNpZm5k ZWYgVVNFX05PX1NJTUQKKwljb25zdCBjaGFyICpwID0gKnB0cjsKKwljb25zdCBjaGFyICplbmQg PSBwICsgbGVuOworCisJY29uc3QgVmVjdG9yOCBkZWxpbV9tYXNrID0gdmVjdG9yOF9icm9hZGNh c3QoZGVsaW1jKTsKKwljb25zdCBWZWN0b3I4IHF1b3RlX21hc2sgPSB2ZWN0b3I4X2Jyb2FkY2Fz dChxdW90ZWMpOworCWNvbnN0IFZlY3RvcjggbmxfbWFzayA9IHZlY3RvcjhfYnJvYWRjYXN0KCdc bicpOworCWNvbnN0IFZlY3RvcjggY3JfbWFzayA9IHZlY3RvcjhfYnJvYWRjYXN0KCdccicpOwor CisJd2hpbGUgKHAgKyBzaXplb2YoVmVjdG9yOCkgPD0gZW5kKQorCXsKKwkJVmVjdG9yOAkJY2h1 bms7CisJCVZlY3RvcjgJCW1hdGNoOworCisJCXZlY3RvcjhfbG9hZCgmY2h1bmssIChjb25zdCB1 aW50OCAqKSBwKTsKKworCQltYXRjaCA9IHZlY3Rvcjhfb3IodmVjdG9yOF9lcShjaHVuaywgbmxf bWFzayksIHZlY3RvcjhfZXEoY2h1bmssIGNyX21hc2spKTsKKwkJbWF0Y2ggPSB2ZWN0b3I4X29y KG1hdGNoLCB2ZWN0b3I4X29yKHZlY3RvcjhfZXEoY2h1bmssIGRlbGltX21hc2spLAorCQkJCQkJ CQkJCQkgdmVjdG9yOF9lcShjaHVuaywgcXVvdGVfbWFzaykpKTsKKworCQlpZiAodmVjdG9yOF9p c19oaWdoYml0X3NldChtYXRjaCkpCisJCXsKKwkJCXVpbnQzMgkJbWFzazsKKworCQkJbWFzayA9 IHZlY3RvcjhfaGlnaGJpdF9tYXNrKG1hdGNoKTsKKwkJCSpwdHIgPSBwICsgcGdfcmlnaHRtb3N0 X29uZV9wb3MzMihtYXNrKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXAgKz0gc2l6ZW9mKFZlY3Rv cjgpOworCX0KKworCSpwdHIgPSBwOworI2VuZGlmCit9CisKKy8qCisgKiBDb3B5U2tpcENTVkVz Y2FwZVNJTUQgLSBTYW1lIGFzIENvcHlDaGVja0NTVlF1b3RlTmVlZFNJTUQsIHNjYW4gZm9yd2Fy ZCBpbiBDU1YgbW9kZSB1c2luZyBTSU1ELAorICogc3RvcHBpbmcgYXQgdGhlIGZpcnN0IGNoYXJh Y3RlciB0aGF0IHJlcXVpcmVzIGVzY2FwaW5nLgorICovCitzdGF0aWMgdm9pZAorQ29weVNraXBD U1ZFc2NhcGVTSU1EKGNvbnN0IGNoYXIgKipwdHIsIHNpemVfdCBsZW4sIGNoYXIgZXNjYXBlYywg Y2hhciBxdW90ZWMpCit7CisjaWZuZGVmIFVTRV9OT19TSU1ECisJY29uc3QgY2hhciAqcCA9ICpw dHI7CisJY29uc3QgY2hhciAqZW5kID0gcCArIGxlbjsKKworCWNvbnN0IFZlY3RvcjggZXNjYXBl X21hc2sgPSB2ZWN0b3I4X2Jyb2FkY2FzdChlc2NhcGVjKTsKKwljb25zdCBWZWN0b3I4IHF1b3Rl X21hc2sgPSB2ZWN0b3I4X2Jyb2FkY2FzdChxdW90ZWMpOworCisJd2hpbGUgKHAgKyBzaXplb2Yo VmVjdG9yOCkgPD0gZW5kKQorCXsKKwkJVmVjdG9yOAkJY2h1bms7CisJCVZlY3RvcjgJCW1hdGNo OworCisJCXZlY3RvcjhfbG9hZCgmY2h1bmssIChjb25zdCB1aW50OCAqKSBwKTsKKworCQltYXRj aCA9IHZlY3Rvcjhfb3IodmVjdG9yOF9lcShjaHVuaywgcXVvdGVfbWFzayksIHZlY3RvcjhfZXEo Y2h1bmssIGVzY2FwZV9tYXNrKSk7CisKKwkJaWYgKHZlY3RvcjhfaXNfaGlnaGJpdF9zZXQobWF0 Y2gpKQorCQl7CisJCQl1aW50MzIJCW1hc2s7CisKKwkJCW1hc2sgPSB2ZWN0b3I4X2hpZ2hiaXRf bWFzayhtYXRjaCk7CisJCQkqcHRyID0gcCArIHBnX3JpZ2h0bW9zdF9vbmVfcG9zMzIobWFzayk7 CisJCQlyZXR1cm47CisJCX0KKworCQlwICs9IHNpemVvZihWZWN0b3I4KTsKKwl9CisKKwkqcHRy ID0gcDsKKyNlbmRpZgorfQogCiAvKiBidWlsdC1pbiBmb3JtYXQtc3BlY2lmaWMgcm91dGluZXMg Ki8KIHN0YXRpYyB2b2lkIENvcHlUb1RleHRMaWtlU3RhcnQoQ29weVRvU3RhdGUgY3N0YXRlLCBU dXBsZURlc2MgdHVwRGVzYyk7CkBAIC0yMjIsOSArMzYwLDkgQEAgQ29weVRvVGV4dExpa2VTdGFy dChDb3B5VG9TdGF0ZSBjc3RhdGUsIFR1cGxlRGVzYyB0dXBEZXNjKQogCQkJY29sbmFtZSA9IE5h bWVTdHIoVHVwbGVEZXNjQXR0cih0dXBEZXNjLCBhdHRudW0gLSAxKS0+YXR0bmFtZSk7CiAKIAkJ CWlmIChjc3RhdGUtPm9wdHMuY3N2X21vZGUpCi0JCQkJQ29weUF0dHJpYnV0ZU91dENTVihjc3Rh dGUsIGNvbG5hbWUsIGZhbHNlKTsKKwkJCQlDb3B5QXR0cmlidXRlT3V0Q1NWKGNzdGF0ZSwgY29s bmFtZSwgZmFsc2UsIGZhbHNlLCAwKTsKIAkJCWVsc2UKLQkJCQlDb3B5QXR0cmlidXRlT3V0VGV4 dChjc3RhdGUsIGNvbG5hbWUpOworCQkJCUNvcHlBdHRyaWJ1dGVPdXRUZXh0KGNzdGF0ZSwgY29s bmFtZSwgZmFsc2UsIDApOwogCQl9CiAKIAkJQ29weVNlbmRUZXh0TGlrZUVuZE9mUm93KGNzdGF0 ZSk7CkBAIC0yNzMsNiArNDExLDcgQEAgQ29weVRvVGV4dExpa2VPbmVSb3coQ29weVRvU3RhdGUg Y3N0YXRlLAogewogCWJvb2wJCW5lZWRfZGVsaW0gPSBmYWxzZTsKIAlGbWdySW5mbyAgICpvdXRf ZnVuY3Rpb25zID0gY3N0YXRlLT5vdXRfZnVuY3Rpb25zOworCVR1cGxlRGVzYwl0dXBfZGVzYyA9 IHNsb3QtPnR0c190dXBsZURlc2NyaXB0b3I7CiAKIAlmb3JlYWNoX2ludChhdHRudW0sIGNzdGF0 ZS0+YXR0bnVtbGlzdCkKIAl7CkBAIC0yOTAsMTUgKzQyOSw0OCBAQCBDb3B5VG9UZXh0TGlrZU9u ZVJvdyhDb3B5VG9TdGF0ZSBjc3RhdGUsCiAJCWVsc2UKIAkJewogCQkJY2hhcgkgICAqc3RyaW5n OworCQkJYm9vbAkJdXNlX3NpbWQgPSBmYWxzZTsKKwkJCXNpemVfdAkJbGVuID0gMDsKKworCQkJ c3RyaW5nID0gT3V0cHV0RnVuY3Rpb25DYWxsKCZvdXRfZnVuY3Rpb25zW2F0dG51bSAtIDFdLCB2 YWx1ZSk7CiAKLQkJCXN0cmluZyA9IE91dHB1dEZ1bmN0aW9uQ2FsbCgmb3V0X2Z1bmN0aW9uc1th dHRudW0gLSAxXSwKLQkJCQkJCQkJCQl2YWx1ZSk7CisJCQkvKgorCQkJKiBPbmx5IHVzZSBTSU1E IGZvciB2YXJsZW5hIHR5cGVzIHdpdGhvdXQgdHJhbnNjb2RpbmcuICBGaXhlZC1zaXplCisJCQkq IHR5cGVzIChpbnQ0LCBib29sLCBkYXRlLCBldGMuKSBhbHdheXMgcHJvZHVjZSBzaG9ydCBBU0NJ SSBvdXRwdXQKKwkJCSogZm9yIHdoaWNoIFNJTUQgcHJvdmlkZXMgbm8gYmVuZWZpdC4gIFdoZW4g dHJhbnNjb2RpbmcgaXMgbmVlZGVkLAorCQkJKiB0aGUgc3RyaW5nIGxlbmd0aCBtYXkgY2hhbmdl IGFmdGVyIGNvbnZlcnNpb24sIHNvIHdlIHNraXAgU0lNRAorCQkJKiBlbnRpcmVseSBpbiB0aGF0 IGNhc2UgdG9vLgorCQkJKgorCQkJKiBXZSB1c2UgVkFSU0laRV9BTllfRVhIRFIgYXMgYSBjaGVh cCBwcmUtZmlsdGVyIHRvIGF2b2lkIGNhbGxpbmcKKwkJCSogc3RybGVuKCkgb24gc2hvcnQgdmFy bGVuYXMuICBUaGUgYWN0dWFsIGxlbmd0aCBwYXNzZWQgdG8gdGhlIFNJTUQKKwkJCSogaGVscGVy cyBpcyBhbHdheXMgc3RybGVuKHN0cmluZykgc28gdGhlIHRleHQgb3V0cHV0IGxlbmd0aCBub3QK KwkJCSogdGhlIGJpbmFyeSBzdG9yYWdlIHNpemUuCisJCQkqLworCQkJaWYgKFR1cGxlRGVzY0F0 dHIodHVwX2Rlc2MsIGF0dG51bSAtIDEpLT5hdHRsZW4gPT0gLTEgJiYKKwkJCQlWQVJTSVpFX0FO WV9FWEhEUihEYXR1bUdldFBvaW50ZXIodmFsdWUpKSA+IHNpemVvZihWZWN0b3I4KSkKKwkJCXsK KwkJCQlsZW4gPSBzdHJsZW4oc3RyaW5nKTsKKwkJCQl1c2Vfc2ltZCA9ICFjc3RhdGUtPm5lZWRf dHJhbnNjb2RpbmcgJiYgKGxlbiA+IHNpemVvZihWZWN0b3I4KSk7CisJCQl9CiAKIAkJCWlmIChp c19jc3YpCi0JCQkJQ29weUF0dHJpYnV0ZU91dENTVihjc3RhdGUsIHN0cmluZywKLQkJCQkJCQkJ CWNzdGF0ZS0+b3B0cy5mb3JjZV9xdW90ZV9mbGFnc1thdHRudW0gLSAxXSk7CisJCQl7CisJCQkJ aWYgKHVzZV9zaW1kKQorCQkJCQlDb3B5QXR0cmlidXRlT3V0Q1NWKGNzdGF0ZSwgc3RyaW5nLAor CQkJCQkJCQkJCWNzdGF0ZS0+b3B0cy5mb3JjZV9xdW90ZV9mbGFnc1thdHRudW0gLSAxXSwKKwkJ CQkJCQkJCQl0cnVlLCBsZW4pOworCQkJCWVsc2UKKwkJCQkJQ29weUF0dHJpYnV0ZU91dENTVihj c3RhdGUsIHN0cmluZywKKwkJCQkJCQkJCQljc3RhdGUtPm9wdHMuZm9yY2VfcXVvdGVfZmxhZ3Nb YXR0bnVtIC0gMV0sCisJCQkJCQkJCQkJZmFsc2UsIGxlbik7CisJCQl9CiAJCQllbHNlCi0JCQkJ Q29weUF0dHJpYnV0ZU91dFRleHQoY3N0YXRlLCBzdHJpbmcpOworCQkJeworCQkJCWlmICh1c2Vf c2ltZCkKKwkJCQkJQ29weUF0dHJpYnV0ZU91dFRleHQoY3N0YXRlLCBzdHJpbmcsIHRydWUsIGxl bik7CisJCQkJZWxzZQorCQkJCQlDb3B5QXR0cmlidXRlT3V0VGV4dChjc3RhdGUsIHN0cmluZywg ZmFsc2UsIGxlbik7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTEyMzksOCArMTQxMSwyNCBAQCBDb3B5 T25lUm93VG8oQ29weVRvU3RhdGUgY3N0YXRlLCBUdXBsZVRhYmxlU2xvdCAqc2xvdCkKIAkJCUNv cHlTZW5kRGF0YShjc3RhdGUsIHN0YXJ0LCBwdHIgLSBzdGFydCk7IFwKIAl9IHdoaWxlICgwKQog Ci1zdGF0aWMgdm9pZAotQ29weUF0dHJpYnV0ZU91dFRleHQoQ29weVRvU3RhdGUgY3N0YXRlLCBj b25zdCBjaGFyICpzdHJpbmcpCisvKgorICogQ29weUF0dHJpYnV0ZU91dFRleHQgLSBTZW5kIHRl eHQgcmVwcmVzZW50YXRpb24gb2Ygb25lIGF0dHJpYnV0ZSwKKyAqIHdpdGggY29udmVyc2lvbiBh bmQgZXNjYXBpbmcuCisgKgorICogRm9yIGEgbGl0dGxlIGV4dHJhIHNwZWVkLCBpZiB1c2Vfc2lt ZCBpcyB0cnVlIHdlIGZpcnN0IHVzZSBTSU1ECisgKiBpbnN0cnVjdGlvbnMgdG8gc2tpcCBvdmVy IGNodW5rcyBvZiBkYXRhIHRoYXQgY29udGFpbiBubyBzcGVjaWFsCisgKiBjaGFyYWN0ZXJzLiAg VGhpcyBwcmUtcGFzcyBhZHZhbmNlcyBwdHIgYXMgZmFyIGFzIHBvc3NpYmxlIGJlZm9yZQorICog aGFuZGluZyBvZmYgdG8gdGhlIHNjYWxhciBsb29wIGJlbG93LCB3aGljaCB0aGVuIHByb2Nlc3Nl cyBhbnkKKyAqIHJlbWFpbmluZyBjaGFyYWN0ZXJzLiAgdXNlX3NpbWQgaXMgb25seSBzZXQgYnkg dGhlIGNhbGxlciB3aGVuIHRoZQorICogYXR0cmlidXRlIGlzIGEgdmFybGVuYSB0eXBlIHdob3Nl IHRleHQgcmVwcmVzZW50YXRpb24gaXMgbG9uZ2VyIHRoYW4KKyAqIGEgc2luZ2xlIFNJTUQgdmVj dG9yIGFuZCBubyBlbmNvZGluZyBjb252ZXJzaW9uIGlzIHJlcXVpcmVkLiAgSW4gYWxsCisgKiBv dGhlciBjYXNlcyB3ZSBmYWxsIHN0cmFpZ2h0IHRocm91Z2ggdG8gdGhlIHNjYWxhciBwYXRoLgor ICoKKyAqIFdoZW4gdXNlX3NpbWQgaXMgdHJ1ZSwgbGVuIG11c3QgYmUgdGhlIHN0cmxlbigpIG9m IHN0cmluZywgb3RoZXJ3aXNlIGl0IGlzIHVudXNlZAorICovCitzdGF0aWMgcGdfYXR0cmlidXRl X2Fsd2F5c19pbmxpbmUgdm9pZAorQ29weUF0dHJpYnV0ZU91dFRleHQoQ29weVRvU3RhdGUgY3N0 YXRlLCBjb25zdCBjaGFyICpzdHJpbmcsCisJCQkJCSBib29sIHVzZV9zaW1kLCBzaXplX3QgbGVu KQogewogCWNvbnN0IGNoYXIgKnB0cjsKIAljb25zdCBjaGFyICpzdGFydDsKQEAgLTEyNDgsNyAr MTQzNiwxNSBAQCBDb3B5QXR0cmlidXRlT3V0VGV4dChDb3B5VG9TdGF0ZSBjc3RhdGUsIGNvbnN0 IGNoYXIgKnN0cmluZykKIAljaGFyCQlkZWxpbWMgPSBjc3RhdGUtPm9wdHMuZGVsaW1bMF07CiAK IAlpZiAoY3N0YXRlLT5uZWVkX3RyYW5zY29kaW5nKQotCQlwdHIgPSBwZ19zZXJ2ZXJfdG9fYW55 KHN0cmluZywgc3RybGVuKHN0cmluZyksIGNzdGF0ZS0+ZmlsZV9lbmNvZGluZyk7CisJeworCQkv KgorCQkgKiBsZW4gbWF5IGFscmVhZHkgYmUgc2V0IGJ5IHRoZSBjYWxsZXIgZm9yIGxvbmcgdmFy bGVuYXMsIGF2b2lkaW5nIGFuIGV4dHJhCisJCSAqIHN0cmxlbigpIGNhbGwuICBGb3IgYWxsIG90 aGVyIGNhc2VzIGl0IGlzIDAgYW5kIHdlIGNvbXB1dGUgaXQgaGVyZS4KKwkJICovCisJCWlmIChs ZW4gPT0gMCkKKwkJCWxlbiA9IHN0cmxlbihzdHJpbmcpOworCQlwdHIgPSBwZ19zZXJ2ZXJfdG9f YW55KHN0cmluZywgbGVuLCBjc3RhdGUtPmZpbGVfZW5jb2RpbmcpOworCX0KIAllbHNlCiAJCXB0 ciA9IHN0cmluZzsKIApAQCAtMTI2OSw2ICsxNDY1LDkgQEAgQ29weUF0dHJpYnV0ZU91dFRleHQo Q29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpzdHJpbmcpCiAJaWYgKGNzdGF0ZS0+ZW5j b2RpbmdfZW1iZWRzX2FzY2lpKQogCXsKIAkJc3RhcnQgPSBwdHI7CisJCWlmICh1c2Vfc2ltZCkK KwkJCUNvcHlTa2lwVGV4dFNJTUQoJnB0ciwgbGVuLCBkZWxpbWMpOworCiAJCXdoaWxlICgoYyA9 ICpwdHIpICE9ICdcMCcpCiAJCXsKIAkJCWlmICgodW5zaWduZWQgY2hhcikgYyA8ICh1bnNpZ25l ZCBjaGFyKSAweDIwKQpAQCAtMTMyOSw2ICsxNTI4LDkgQEAgQ29weUF0dHJpYnV0ZU91dFRleHQo Q29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpzdHJpbmcpCiAJZWxzZQogCXsKIAkJc3Rh cnQgPSBwdHI7CisJCWlmICh1c2Vfc2ltZCkKKwkJCUNvcHlTa2lwVGV4dFNJTUQoJnB0ciwgbGVu LCBkZWxpbWMpOworCiAJCXdoaWxlICgoYyA9ICpwdHIpICE9ICdcMCcpCiAJCXsKIAkJCWlmICgo dW5zaWduZWQgY2hhcikgYyA8ICh1bnNpZ25lZCBjaGFyKSAweDIwKQpAQCAtMTM4OSwxMiArMTU5 MSwxNCBAQCBDb3B5QXR0cmlidXRlT3V0VGV4dChDb3B5VG9TdGF0ZSBjc3RhdGUsIGNvbnN0IGNo YXIgKnN0cmluZykKIH0KIAogLyoKLSAqIFNlbmQgdGV4dCByZXByZXNlbnRhdGlvbiBvZiBvbmUg YXR0cmlidXRlLCB3aXRoIGNvbnZlcnNpb24gYW5kCi0gKiBDU1Ytc3R5bGUgZXNjYXBpbmcKKyAq IENvcHlBdHRyaWJ1dGVPdXRDU1YgLSBTZW5kIHRleHQgcmVwcmVzZW50YXRpb24gb2Ygb25lIGF0 dHJpYnV0ZSwKKyAqIHdpdGggY29udmVyc2lvbiBhbmQgQ1NWLXN0eWxlIGVzY2FwaW5nLgorICoK KyAqIFdlIHVzZSB0aGUgc2FtZSBzaW1kIG9wdGltaXphdGlvbiBpZGVhLCBzZWUgQ29weUF0dHJp YnV0ZU91dFRleHQgY29tbWVudC4KICAqLwotc3RhdGljIHZvaWQKK3N0YXRpYyBwZ19hdHRyaWJ1 dGVfYWx3YXlzX2lubGluZSB2b2lkCiBDb3B5QXR0cmlidXRlT3V0Q1NWKENvcHlUb1N0YXRlIGNz dGF0ZSwgY29uc3QgY2hhciAqc3RyaW5nLAotCQkJCQlib29sIHVzZV9xdW90ZSkKKwkJCQkJYm9v bCB1c2VfcXVvdGUsIGJvb2wgdXNlX3NpbWQsIHNpemVfdCBsZW4pCiB7CiAJY29uc3QgY2hhciAq cHRyOwogCWNvbnN0IGNoYXIgKnN0YXJ0OwpAQCAtMTQwOSw3ICsxNjEzLDE1IEBAIENvcHlBdHRy aWJ1dGVPdXRDU1YoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpzdHJpbmcsCiAJCXVz ZV9xdW90ZSA9IHRydWU7CiAKIAlpZiAoY3N0YXRlLT5uZWVkX3RyYW5zY29kaW5nKQotCQlwdHIg PSBwZ19zZXJ2ZXJfdG9fYW55KHN0cmluZywgc3RybGVuKHN0cmluZyksIGNzdGF0ZS0+ZmlsZV9l bmNvZGluZyk7CisJeworCQkvKgorCQkgKiBsZW4gbWF5IGFscmVhZHkgYmUgc2V0IGJ5IHRoZSBj YWxsZXIgZm9yIGxvbmcgdmFybGVuYXMsIGF2b2lkaW5nIGFuIGV4dHJhCisJCSAqIHN0cmxlbigp IGNhbGwuICBGb3IgYWxsIG90aGVyIGNhc2VzIGl0IGlzIDAgYW5kIHdlIGNvbXB1dGUgaXQgaGVy ZS4KKwkJICovCisJCWlmIChsZW4gPT0gMCkKKwkJCWxlbiA9IHN0cmxlbihzdHJpbmcpOworCQlw dHIgPSBwZ19zZXJ2ZXJfdG9fYW55KHN0cmluZywgbGVuLCBjc3RhdGUtPmZpbGVfZW5jb2Rpbmcp OworCX0KIAllbHNlCiAJCXB0ciA9IHN0cmluZzsKIApAQCAtMTQzMSw2ICsxNjQzLDkgQEAgQ29w eUF0dHJpYnV0ZU91dENTVihDb3B5VG9TdGF0ZSBjc3RhdGUsIGNvbnN0IGNoYXIgKnN0cmluZywK IAkJewogCQkJY29uc3QgY2hhciAqdHB0ciA9IHB0cjsKIAorCQkJaWYgKHVzZV9zaW1kKQorCQkJ CUNvcHlDaGVja0NTVlF1b3RlTmVlZFNJTUQoJnRwdHIsIGxlbiwgZGVsaW1jLCBxdW90ZWMpOwor CiAJCQl3aGlsZSAoKGMgPSAqdHB0cikgIT0gJ1wwJykKIAkJCXsKIAkJCQlpZiAoYyA9PSBkZWxp bWMgfHwgYyA9PSBxdW90ZWMgfHwgYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJykKQEAgLTE0NTQsNiAr MTY2OSw5IEBAIENvcHlBdHRyaWJ1dGVPdXRDU1YoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBj aGFyICpzdHJpbmcsCiAJCSAqIFdlIGFkb3B0IHRoZSBzYW1lIG9wdGltaXphdGlvbiBzdHJhdGVn eSBhcyBpbiBDb3B5QXR0cmlidXRlT3V0VGV4dAogCQkgKi8KIAkJc3RhcnQgPSBwdHI7CisJCWlm ICh1c2Vfc2ltZCkKKwkJCUNvcHlTa2lwQ1NWRXNjYXBlU0lNRCgmcHRyLCBsZW4sIGVzY2FwZWMs IHF1b3RlYyk7CisKIAkJd2hpbGUgKChjID0gKnB0cikgIT0gJ1wwJykKIAkJewogCQkJaWYgKGMg PT0gcXVvdGVjIHx8IGMgPT0gZXNjYXBlYykKLS0gCjIuMzQuMQoK --0000000000002d8cf6064d03b866--