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 1vYQTM-003CeA-12 for pgsql-hackers@arkaria.postgresql.org; Wed, 24 Dec 2025 15:08:21 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vYQTK-004voE-38 for pgsql-hackers@arkaria.postgresql.org; Wed, 24 Dec 2025 15:08:19 +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 1vYQTK-004vo4-1D for pgsql-hackers@lists.postgresql.org; Wed, 24 Dec 2025 15:08:19 +0000 Received: from mail-ej1-x62b.google.com ([2a00:1450:4864:20::62b]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vYQTH-002PdY-33 for pgsql-hackers@postgresql.org; Wed, 24 Dec 2025 15:08:17 +0000 Received: by mail-ej1-x62b.google.com with SMTP id a640c23a62f3a-b7277324054so972845166b.0 for ; Wed, 24 Dec 2025 07:08:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=esi.dz; s=google; t=1766588888; x=1767193688; 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=G8BSHxvUlyZIAZXi+psCrDiu2LjyQjQEyStT7WInGlI=; b=HQHS2EL9onRrxjq7f6GrS0DtxrU6eYIgYFMZeK2C9a27hDEdgunkyqLe8rbwe5z6bJ W+NGW8tKquJG6xpyEvrlLXDG9ENN2Ab788FX1T1kpYA5mhsEwKr7jEcUCTbXuFBtJQ0c ehUSsTaRTcJwdi3rrgiWny65qLobLmsEqCrQAgpD5VHLdkHMvuaqWGfS+ZNrPSd264oP nFlSi0YJYQNGJWJcZxAUOApiMcp+rYhC1a1lm/MgFym7VQ5vSswJxNe5JjAE2+B6zx9/ dbdcXbK2rqpbiAjnofwF+xJEuWCd7s8TKv9eeIZ8TMxf1CcdOBa2FJQhaE5sSooNUJ8r bK2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766588888; x=1767193688; 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=G8BSHxvUlyZIAZXi+psCrDiu2LjyQjQEyStT7WInGlI=; b=qkJ+mNeSLrodzxugYPuowFoXnleTBwwIZXmaYsPD4YvbikOm3cEslBURgVfKft7u6k leOdASGpXxYe10YRjzsV4NpsnZFM6al4acXzwoyR76fIPbLW9MgzlfKoQBP5ZuX0QBdb jk7bJS/W0Xm7Ojd/3eRZ5cJwO7b8WaknF7xoAWMBmdcGS7oIlQj+jQgObALa4cqOCxZ/ QEqVqNGCKeuyY3f+Rpl8Z1F2yfCxDyguUz6YRweHwOcIMm+ijJprEtrg8IiOZzzlWlDF 7OlmawrasBJo5lJlCaCaJ6EZ8dChUxq2LuwNlkhUDLi7J1OrGERhfHH2mpDgp6oWRZ7T 4S6g== X-Forwarded-Encrypted: i=1; AJvYcCXNNDQKebAZyswoovglijGzWczcajsBXWba6lhKV/jwjLrZv1hR2YYFNQUAh+FuVP/2TBVXGX22+lEimz6s@postgresql.org X-Gm-Message-State: AOJu0YyGraa5oHAmz/++KxZbw3Kq1EKPdjW61H3G1t3n8PEwITJz5Mkj +BmdEuugRVo7H17uxW1WzT3nza0OGe+zwV+Ck5VckuhuvmjnvaFsf9lRInyhdh7+fXNQCac7nZi H7FHHDuxItyY1DaOk+vBoBBBrdHntLodq54vkm3tv X-Gm-Gg: AY/fxX6RqqvB9IksWsT/gK8ty2/RPXELMcioUqlmK0Apc6g49CuLv6HeFvYIxppTPFj oX5g5riQaXxCnQtddAo0wJjC+sPGAbkp7uymZKczAnvNfREgq0LLB7aYxQL7vncdaBgvo9OH+wA Bbgzoe3iuVEFrvCWu9dmvqAiTvIl/EPY4wtKuWmb7PYhTJMmrRAjdegeUsQetyZYgJsx8jJ2uo+ ZHdi1nIxLECtw53nSZaAc/w0nt88ZRj+NUiVl4NGqz1FGQKMktloZQEYkWcixmbp/OERgmaXkHe O2G077sT9oz3o87hfw0Vltzz+KKHBA== X-Google-Smtp-Source: AGHT+IGxRyfD0Ptyj1gXbRok6aaj1q+sHgqQW35J1yhpsVfhaAevR/JyfX7x66EhBBLLu48Wfn6lTBrwz4eWpWF0cvI= X-Received: by 2002:a17:907:7fa8:b0:b73:572d:3b07 with SMTP id a640c23a62f3a-b8036fac50amr1964499766b.28.1766588887844; Wed, 24 Dec 2025 07:08:07 -0800 (PST) MIME-Version: 1.0 References: <8e226753-57af-489a-bfbe-caa23dd71286@dunslane.net> In-Reply-To: From: KAZAR Ayoub Date: Wed, 24 Dec 2025 16:07:55 +0100 X-Gm-Features: AQt7F2rvK1clwETNqGqHy-rj1iQzQC7P6gtacHVvdGC4fq19JbTYrRH2tNmIzl4 Message-ID: Subject: Re: Speed up COPY FROM text/CSV parsing using SIMD To: Nazir Bilal Yavuz Cc: Manni Wood , Mark Wong , Nathan Bossart , Andrew Dunstan , Shinya Kato , PostgreSQL-development Content-Type: multipart/mixed; boundary="0000000000002026970646b4077d" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000002026970646b4077d Content-Type: multipart/alternative; boundary="0000000000002026950646b4077b" --0000000000002026950646b4077b Content-Type: text/plain; charset="UTF-8" Hello, Following the same path of optimizing COPY FROM using SIMD, i found that COPY TO can also benefit from this. I attached a small patch that uses SIMD to skip data and advance as far as the first special character is found, then fallback to scalar processing for that character and re-enter the SIMD path again... There's two ways to do this: 1) Essentially we do SIMD until we find a special character, then continue scalar path without re-entering SIMD again. - This gives from 10% to 30% speedups depending on the weight of special characters in the attribute, we don't lose anything here since it advances with SIMD until it can't (using the previous scripts: 1/3, 2/3 specials chars). 2) Do SIMD path, then use scalar path when we hit a special character, keep re-entering the SIMD path each time. - This is equivalent to the COPY FROM story, we'll need to find the same heuristic to use for both COPY FROM/TO to reduce the regressions (same regressions: around from 20% to 30% with 1/3, 2/3 specials chars). Something else to note is that the scalar path for COPY TO isn't as heavy as the state machine in COPY FROM. So if we find the sweet spot for the heuristic, doing the same for COPY TO will be trivial and always beneficial. Attached is 0004 which is option 1 (SIMD without re-entering), 0005 is the second one. Regards, Ayoub --0000000000002026950646b4077b Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hello,
Following the same path of optim= izing COPY FROM using SIMD, i found that COPY TO can also benefit from this= .

I attached a small patch that uses SIMD to skip = data and advance as far as the first special character is found, then fallb= ack to scalar processing for that character and re-enter the SIMD path agai= n...
There's two ways to do this:
1) Essent= ially we do SIMD until we find a special character, then continue scalar pa= th without re-entering SIMD again.
- This gives from 10% to 3= 0% speedups depending on the weight of special characters in the attribute,= we don't lose anything here since it advances with SIMD until it can&#= 39;t (using the previous scripts: 1/3, 2/3 specials chars).

<= /div>
2) Do SIMD path, then use scalar path when we hit a special chara= cter, keep re-entering the SIMD path each time.
- This is equ= ivalent to the COPY FROM story, we'll need to find the same heuristic t= o use for both COPY FROM/TO to reduce the regressions (same regressions: ar= ound from 20% to 30% with 1/3, 2/3 specials chars).

Something else to note is that the scalar path for COPY TO isn't as h= eavy as the state machine in COPY FROM.

So if we f= ind the sweet spot for the heuristic, doing the same for COPY TO will be tr= ivial and always beneficial.
Attached is 0004 which is option 1 (= SIMD without re-entering),=C2=A00005 is the second one.


Regards,=
Ayoub
--0000000000002026950646b4077b-- --0000000000002026970646b4077d Content-Type: text/x-patch; charset="US-ASCII"; name="0005-Speed-up-COPY-TO-text-CSV-using-SIMD.patch" Content-Disposition: attachment; filename="0005-Speed-up-COPY-TO-text-CSV-using-SIMD.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mjk44xxk0 RnJvbSAzMTllNTQwMmUzNTQyOTk0M2Q4MGJhMTM2ZjI3ZTYxODU0MTBlNmY1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBeW91YktBWiA8a2F6YXJheW91YjIwMDRAZ21haWwuY29tPgpE YXRlOiBXZWQsIDI0IERlYyAyMDI1IDE1OjIwOjUzICswMTAwClN1YmplY3Q6IFtQQVRDSF0gU3Bl ZWQgdXAgQ09QWSBUTyB0ZXh0IENTViB1c2luZyBTSU1ECgotLS0KIHNyYy9iYWNrZW5kL2NvbW1h bmRzL2NvcHl0by5jIHwgMjUyICsrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0KIDEg ZmlsZSBjaGFuZ2VkLCAxNjcgaW5zZXJ0aW9ucygrKSwgODUgZGVsZXRpb25zKC0pCgpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weXRvLmMgYi9zcmMvYmFja2VuZC9jb21tYW5k cy9jb3B5dG8uYwppbmRleCBlMTMwNjcyODUwOS4uYjlkN2I1NWYxYWIgMTAwNjQ0Ci0tLSBhL3Ny Yy9iYWNrZW5kL2NvbW1hbmRzL2NvcHl0by5jCisrKyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2Nv cHl0by5jCkBAIC0xMjY4LDM4ICsxMjY4LDYzIEBAIENvcHlBdHRyaWJ1dGVPdXRUZXh0KENvcHlU b1N0YXRlIGNzdGF0ZSwgY29uc3QgY2hhciAqc3RyaW5nKQogCWlmIChjc3RhdGUtPmVuY29kaW5n X2VtYmVkc19hc2NpaSkKIAl7CiAJCXN0YXJ0ID0gcHRyOwotCQkjaWZuZGVmIFVTRV9OT19TSU1E CisJCWNvbnN0IGNoYXIgKmVuZCA9IHB0ciArIHN0cmxlbihwdHIpOworCisJCXdoaWxlICgoYyA9 ICpwdHIpICE9ICdcMCcpCisJCXsKKyNpZm5kZWYgVVNFX05PX1NJTUQKKwkJCS8qCisJCQkgKiBT SU1EIGZhc3QgcGF0aDogc2NhbiBhaGVhZCBmb3Igc3BlY2lhbCBjaGFyYWN0ZXJzLgorCQkJICog V2UgcmUtZW50ZXIgdGhpcyBwYXRoIGFmdGVyIGhhbmRsaW5nIGVhY2ggc3BlY2lhbCBjaGFyYWN0 ZXIKKwkJCSAqIHRvIG1heGltaXplIHRoZSBiZW5lZml0IG9mIHZlY3Rvcml6YXRpb24uCisJCQkg Ki8KIAkJCXsKLQkJCQljb25zdCBjaGFyKiBlbmQgPSBwdHIgKyBzdHJsZW4ocHRyKTsKLQkJCQl3 aGlsZSAocHRyICsgc2l6ZW9mKFZlY3RvcjgpIDw9IGVuZCkgewotCQkJCQlWZWN0b3I4IGNodW5r OwotCQkJCQlWZWN0b3I4IGNvbnRyb2xfbWFzazsKLQkJCQkJVmVjdG9yOCBiYWNrc2xhc2hfbWFz azsKLQkJCQkJVmVjdG9yOCBkZWxpbV9tYXNrOwotCQkJCQlWZWN0b3I4IHNwZWNpYWxfbWFzazsK LQkJCQkJdWludDMyIG1hc2s7CisJCQkJCisJCQkJd2hpbGUgKHB0ciArIHNpemVvZihWZWN0b3I4 KSA8PSBlbmQpCisJCQkJeworCQkJCQlWZWN0b3I4CQljaHVuazsKKwkJCQkJVmVjdG9yOAkJY29u dHJvbF9tYXNrOworCQkJCQlWZWN0b3I4CQliYWNrc2xhc2hfbWFzazsKKwkJCQkJVmVjdG9yOAkJ ZGVsaW1fbWFzazsKKwkJCQkJVmVjdG9yOAkJc3BlY2lhbF9tYXNrOworCQkJCQl1aW50MzIJCW1h c2s7CiAKIAkJCQkJdmVjdG9yOF9sb2FkKCZjaHVuaywgKGNvbnN0IHVpbnQ4ICopIHB0cik7CisJ CQkJCQorCQkJCQkvKiBDaGVjayBmb3IgY29udHJvbCBjaGFyYWN0ZXJzICg8IDB4MjApICovCiAJ CQkJCWNvbnRyb2xfbWFzayA9IHZlY3RvcjhfZ3QodmVjdG9yOF9icm9hZGNhc3QoMHgyMCksIGNo dW5rKTsKLQkJCQkJYmFja3NsYXNoX21hc2sgPSB2ZWN0b3I4X2VxKHZlY3RvcjhfYnJvYWRjYXN0 KCdcXCcpLCBjaHVuayk7Ci0JCQkJCWRlbGltX21hc2sgPSB2ZWN0b3I4X2VxKHZlY3RvcjhfYnJv YWRjYXN0KGRlbGltYyksIGNodW5rKTsKKwkJCQkJCisJCQkJCS8qIENoZWNrIGZvciBiYWNrc2xh c2ggYW5kIGRlbGltaXRlciAqLworCQkJCQliYWNrc2xhc2hfbWFzayA9IHZlY3RvcjhfZXEoY2h1 bmssIHZlY3RvcjhfYnJvYWRjYXN0KCdcXCcpKTsKKwkJCQkJZGVsaW1fbWFzayA9IHZlY3Rvcjhf ZXEoY2h1bmssIHZlY3RvcjhfYnJvYWRjYXN0KGRlbGltYykpOworCQkJCQkKIAotCQkJCQlzcGVj aWFsX21hc2sgPSB2ZWN0b3I4X29yKGNvbnRyb2xfbWFzaywgdmVjdG9yOF9vcihiYWNrc2xhc2hf bWFzaywgZGVsaW1fbWFzaykpOworCQkJCQkvKiBDb21iaW5lIGFsbCBtYXNrcyAqLworCQkJCQlz cGVjaWFsX21hc2sgPSB2ZWN0b3I4X29yKAorCQkJCQkJdmVjdG9yOF9vcihjb250cm9sX21hc2ss IGJhY2tzbGFzaF9tYXNrKSwgZGVsaW1fbWFzayk7CiAKIAkJCQkJbWFzayA9IHZlY3RvcjhfaGln aGJpdF9tYXNrKHNwZWNpYWxfbWFzayk7Ci0JCQkJCWlmIChtYXNrICE9IDApIHsKKwkJCQkJaWYg KG1hc2sgIT0gMCkKKwkJCQkJeworCQkJCQkJLyogRm91bmQgc3BlY2lhbCBjaGFyYWN0ZXIsIGFk dmFuY2UgdG8gaXQgKi8KIAkJCQkJCWludCBhZHZhbmNlID0gcGdfcmlnaHRtb3N0X29uZV9wb3Mz MihtYXNrKTsKIAkJCQkJCXB0ciArPSBhZHZhbmNlOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAor CQkJCQkvKiBObyBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gdGhpcyBjaHVuaywgYWR2YW5jZSAqLwog CQkJCQlwdHIgKz0gc2l6ZW9mKFZlY3RvcjgpOwogCQkJCX0KLQkJCX0gCi0JCSNlbmRpZgorCQkJ CQorCQkJCS8qIFVwZGF0ZSBjIGFmdGVyIFNJTUQgc2NhbiAqLworCQkJCWMgPSAqcHRyOworCQkJ fQorI2VuZGlmIC8qICFVU0VfTk9fU0lNRCAqLworCisJCQkvKiBTY2FsYXIgaGFuZGxpbmcgLSBz YW1lIGNvZGUgZm9yIFNJTUQgYW5kIG5vbi1TSU1EIGJ1aWxkcyAqLworCQkJaWYgKGMgPT0gJ1ww JykKKwkJCQlicmVhazsKIAotCQl3aGlsZSAoKGMgPSAqcHRyKSAhPSAnXDAnKQotCQl7CiAJCQlp ZiAoKHVuc2lnbmVkIGNoYXIpIGMgPCAodW5zaWduZWQgY2hhcikgMHgyMCkKIAkJCXsKIAkJCQkv KgpAQCAtMTM1OCwzOCArMTM4Myw2MCBAQCBDb3B5QXR0cmlidXRlT3V0VGV4dChDb3B5VG9TdGF0 ZSBjc3RhdGUsIGNvbnN0IGNoYXIgKnN0cmluZykKIAllbHNlCiAJewogCQlzdGFydCA9IHB0cjsK LQkJI2lmbmRlZiBVU0VfTk9fU0lNRAorCQljb25zdCBjaGFyICplbmQgPSBwdHIgKyBzdHJsZW4o cHRyKTsKKworCQl3aGlsZSAoKGMgPSAqcHRyKSAhPSAnXDAnKQorCQl7CisjaWZuZGVmIFVTRV9O T19TSU1ECisJCQkvKgorCQkJICogU0lNRCBmYXN0IHBhdGg6IHNjYW4gYWhlYWQgZm9yIHNwZWNp YWwgY2hhcmFjdGVycy4KKwkJCSAqLwogCQkJewotCQkJCWNvbnN0IGNoYXIqIGVuZCA9IHB0ciAr IHN0cmxlbihwdHIpOwotCQkJCXdoaWxlIChwdHIgKyBzaXplb2YoVmVjdG9yOCkgPD0gZW5kKSB7 Ci0JCQkJCVZlY3RvcjggY2h1bms7Ci0JCQkJCVZlY3RvcjggY29udHJvbF9tYXNrOwotCQkJCQlW ZWN0b3I4IGJhY2tzbGFzaF9tYXNrOwotCQkJCQlWZWN0b3I4IGRlbGltX21hc2s7Ci0JCQkJCVZl Y3Rvcjggc3BlY2lhbF9tYXNrOwotCQkJCQl1aW50MzIgbWFzazsKKwkJCQkKKwkJCQl3aGlsZSAo cHRyICsgc2l6ZW9mKFZlY3RvcjgpIDw9IGVuZCkKKwkJCQl7CisJCQkJCVZlY3RvcjgJCWNodW5r OworCQkJCQlWZWN0b3I4CQljb250cm9sX21hc2s7CisJCQkJCVZlY3RvcjgJCWJhY2tzbGFzaF9t YXNrOworCQkJCQlWZWN0b3I4CQlkZWxpbV9tYXNrOworCQkJCQlWZWN0b3I4CQlzcGVjaWFsX21h c2s7CisJCQkJCXVpbnQzMgkJbWFzazsKIAogCQkJCQl2ZWN0b3I4X2xvYWQoJmNodW5rLCAoY29u c3QgdWludDggKikgcHRyKTsKKwkJCQkJCisJCQkJCS8qIENoZWNrIGZvciBjb250cm9sIGNoYXJh Y3RlcnMgKDwgMHgyMCkgKi8KIAkJCQkJY29udHJvbF9tYXNrID0gdmVjdG9yOF9ndCh2ZWN0b3I4 X2Jyb2FkY2FzdCgweDIwKSwgY2h1bmspOwotCQkJCQliYWNrc2xhc2hfbWFzayA9IHZlY3Rvcjhf ZXEodmVjdG9yOF9icm9hZGNhc3QoJ1xcJyksIGNodW5rKTsKLQkJCQkJZGVsaW1fbWFzayA9IHZl Y3RvcjhfZXEodmVjdG9yOF9icm9hZGNhc3QoZGVsaW1jKSwgY2h1bmspOworCQkJCQkKKwkJCQkJ LyogQ2hlY2sgZm9yIGJhY2tzbGFzaCBhbmQgZGVsaW1pdGVyICovCisJCQkJCWJhY2tzbGFzaF9t YXNrID0gdmVjdG9yOF9lcShjaHVuaywgdmVjdG9yOF9icm9hZGNhc3QoJ1xcJykpOworCQkJCQlk ZWxpbV9tYXNrID0gdmVjdG9yOF9lcShjaHVuaywgdmVjdG9yOF9icm9hZGNhc3QoZGVsaW1jKSk7 CiAKLQkJCQkJc3BlY2lhbF9tYXNrID0gdmVjdG9yOF9vcihjb250cm9sX21hc2ssIHZlY3Rvcjhf b3IoYmFja3NsYXNoX21hc2ssIGRlbGltX21hc2spKTsKKwkJCQkJLyogQ29tYmluZSBtYXNrcyAq LworCQkJCQlzcGVjaWFsX21hc2sgPSB2ZWN0b3I4X29yKGNvbnRyb2xfbWFzaywgCisJCQkJCQkJ CQkJCSAgdmVjdG9yOF9vcihiYWNrc2xhc2hfbWFzaywgZGVsaW1fbWFzaykpOwogCiAJCQkJCW1h c2sgPSB2ZWN0b3I4X2hpZ2hiaXRfbWFzayhzcGVjaWFsX21hc2spOwotCQkJCQlpZiAobWFzayAh PSAwKSB7CisJCQkJCWlmIChtYXNrICE9IDApCisJCQkJCXsKKwkJCQkJCS8qIEZvdW5kIHNwZWNp YWwgY2hhcmFjdGVyICovCiAJCQkJCQlpbnQgYWR2YW5jZSA9IHBnX3JpZ2h0bW9zdF9vbmVfcG9z MzIobWFzayk7CiAJCQkJCQlwdHIgKz0gYWR2YW5jZTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAK KwkJCQkJLyogTm8gc3BlY2lhbCBjaGFyYWN0ZXJzLCBhZHZhbmNlICovCiAJCQkJCXB0ciArPSBz aXplb2YoVmVjdG9yOCk7CiAJCQkJfQotCQkJfSAKLQkJI2VuZGlmCisJCQkJCisJCQkJLyogVXBk YXRlIGMgYWZ0ZXIgU0lNRCBzY2FuICovCisJCQkJYyA9ICpwdHI7CisJCQl9CisjZW5kaWYgLyog IVVTRV9OT19TSU1EICovCisKKwkJCS8qIFNjYWxhciBoYW5kbGluZyAtIHNhbWUgZm9yIFNJTUQg YW5kIG5vbi1TSU1EICovCisJCQlpZiAoYyA9PSAnXDAnKQorCQkJCWJyZWFrOwogCi0JCXdoaWxl ICgoYyA9ICpwdHIpICE9ICdcMCcpCi0JCXsKIAkJCWlmICgodW5zaWduZWQgY2hhcikgYyA8ICh1 bnNpZ25lZCBjaGFyKSAweDIwKQogCQkJewogCQkJCS8qCkBAIC0xNDg5LDUzICsxNTM2LDY4IEBA IENvcHlBdHRyaWJ1dGVPdXRDU1YoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpzdHJp bmcsCiAJCWVsc2UKIAkJewogCQkJY29uc3QgY2hhciAqdHB0ciA9IHB0cjsKKwkJCWNvbnN0IGNo YXIgKmVuZCA9IHRwdHIgKyBzdHJsZW4odHB0cik7CisJCQkKKwkJCXdoaWxlICgoYyA9ICp0cHRy KSAhPSAnXDAnKSAKKwkJCXsKKyNpZm5kZWYgVVNFX05PX1NJTUQKKwkJCS8qCisJCQkgKiBTSU1E IGFjY2VsZXJhdGVkIHF1b3RlIGRldGVjdGlvbi4KKwkJCSAqLworCQkJewkKKwkJCQlWZWN0b3I4 CQlkZWxpbV92ZWM7CisJCQkJVmVjdG9yOAkJcXVvdGVfdmVjOworCQkJCVZlY3RvcjgJCW5ld2xp bmVfdmVjOworCQkJCVZlY3RvcjgJCWNyX3ZlYzsKKwkJCQkKKwkJCQlkZWxpbV92ZWMgPSB2ZWN0 b3I4X2Jyb2FkY2FzdChkZWxpbWMpOworCQkJCXF1b3RlX3ZlYyA9IHZlY3RvcjhfYnJvYWRjYXN0 KHF1b3RlYyk7CisJCQkJbmV3bGluZV92ZWMgPSB2ZWN0b3I4X2Jyb2FkY2FzdCgnXG4nKTsKKwkJ CQljcl92ZWMgPSB2ZWN0b3I4X2Jyb2FkY2FzdCgnXHInKTsKKworCQkJCXdoaWxlICh0cHRyICsg c2l6ZW9mKFZlY3RvcjgpIDw9IGVuZCkKKwkJCQl7CisJCQkJCVZlY3RvcjgJCWNodW5rOworCQkJ CQlWZWN0b3I4CQlzcGVjaWFsX21hc2s7CisJCQkJCXVpbnQzMgkJbWFzazsKIAotCQkJI2lmbmRl ZiBVU0VfTk9fU0lNRAotCQkJCXsJCi0JCQkJCWNvbnN0IGNoYXIqIGVuZCA9IHRwdHIgKyBzdHJs ZW4odHB0cik7Ci0KLQkJCQkJVmVjdG9yOCBkZWxpbV9tYXNrID0gdmVjdG9yOF9icm9hZGNhc3Qo ZGVsaW1jKTsKLQkJCQkJVmVjdG9yOCBxdW90ZV9tYXNrID0gdmVjdG9yOF9icm9hZGNhc3QocXVv dGVjKTsKLQkJCQkJVmVjdG9yOCBuZXdsaW5lX21hc2sgPSB2ZWN0b3I4X2Jyb2FkY2FzdCgnXG4n KTsKLQkJCQkJVmVjdG9yOCBjYXJyaWFnZV9yZXR1cm5fbWFzayA9IHZlY3RvcjhfYnJvYWRjYXN0 KCdccicpOwotCi0JCQkJCXdoaWxlICh0cHRyICsgc2l6ZW9mKFZlY3RvcjgpIDw9IGVuZCkgewot CQkJCQkJVmVjdG9yOCBjaHVuazsKLQkJCQkJCVZlY3Rvcjggc3BlY2lhbF9tYXNrOwotCQkJCQkJ dWludDMyIG1hc2s7Ci0KLQkJCQkJCXZlY3RvcjhfbG9hZCgmY2h1bmssIChjb25zdCB1aW50OCAq KSB0cHRyKTsKLQkJCQkJCXNwZWNpYWxfbWFzayA9IHZlY3Rvcjhfb3IoCi0JCQkJCQkJdmVjdG9y OF9vcih2ZWN0b3I4X2VxKGNodW5rLCBkZWxpbV9tYXNrKSwKLQkJCQkJCQkJCSAgIHZlY3Rvcjhf ZXEoY2h1bmssIHF1b3RlX21hc2spKSwKLQkJCQkJCQl2ZWN0b3I4X29yKHZlY3RvcjhfZXEoY2h1 bmssIG5ld2xpbmVfbWFzayksCi0JCQkJCQkJCQkgICB2ZWN0b3I4X2VxKGNodW5rLCBjYXJyaWFn ZV9yZXR1cm5fbWFzaykpCi0JCQkJCQkpOwotCi0JCQkJCQltYXNrID0gdmVjdG9yOF9oaWdoYml0 X21hc2soc3BlY2lhbF9tYXNrKTsKLQkJCQkJCWlmIChtYXNrICE9IDApIHsKLQkJCQkJCQl0cHRy ICs9IHBnX3JpZ2h0bW9zdF9vbmVfcG9zMzIobWFzayk7Ci0JCQkJCQkJdXNlX3F1b3RlID0gdHJ1 ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KKwkJCQkJdmVjdG9yOF9sb2FkKCZjaHVuaywgKGNv bnN0IHVpbnQ4ICopIHRwdHIpOworCQkJCQkKKwkJCQkJc3BlY2lhbF9tYXNrID0gdmVjdG9yOF9v cigKKwkJCQkJCXZlY3Rvcjhfb3IodmVjdG9yOF9lcShjaHVuaywgZGVsaW1fdmVjKSwKKwkJCQkJ CQkJICAgdmVjdG9yOF9lcShjaHVuaywgcXVvdGVfdmVjKSksCisJCQkJCQl2ZWN0b3I4X29yKHZl Y3RvcjhfZXEoY2h1bmssIG5ld2xpbmVfdmVjKSwKKwkJCQkJCQkJICAgdmVjdG9yOF9lcShjaHVu aywgY3JfdmVjKSkpOwogCi0JCQkJCQl0cHRyICs9IHNpemVvZihWZWN0b3I4KTsKKwkJCQkJbWFz ayA9IHZlY3RvcjhfaGlnaGJpdF9tYXNrKHNwZWNpYWxfbWFzayk7CisJCQkJCWlmIChtYXNrICE9 IDApCisJCQkJCXsKKwkJCQkJCXRwdHIgKz0gcGdfcmlnaHRtb3N0X29uZV9wb3MzMihtYXNrKTsK KwkJCQkJCXVzZV9xdW90ZSA9IHRydWU7CisJCQkJCQlicmVhazsKIAkJCQkJfQorCisJCQkJCXRw dHIgKz0gc2l6ZW9mKFZlY3RvcjgpOwogCQkJCX0KLQkJCSNlbmRpZgorCQkJfQorI2VuZGlmIC8q ICFVU0VfTk9fU0lNRCAqLwogCi0JCQl3aGlsZSAoKGMgPSAqdHB0cikgIT0gJ1wwJykKKwkJCS8q CisJCQkgKiBTY2FsYXIgc2NhbiBmb3IgcmVtYWluaW5nIGJ5dGVzICh0YWlsIGFmdGVyIFNJTUQs IG9yIGVudGlyZQorCQkJICogc3RyaW5nIGlmIFVTRV9OT19TSU1EKS4KKwkJCSAqLworCQkJaWYg KChjID0gKnRwdHIpICE9ICdcMCcpCiAJCQl7CiAJCQkJaWYgKGMgPT0gZGVsaW1jIHx8IGMgPT0g cXVvdGVjIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdccicpCiAJCQkJewogCQkJCQl1c2VfcXVvdGUg PSB0cnVlOwotCQkJCQlicmVhazsKIAkJCQl9CiAJCQkJaWYgKElTX0hJR0hCSVRfU0VUKGMpICYm IGNzdGF0ZS0+ZW5jb2RpbmdfZW1iZWRzX2FzY2lpKQogCQkJCQl0cHRyICs9IHBnX2VuY29kaW5n X21ibGVuKGNzdGF0ZS0+ZmlsZV9lbmNvZGluZywgdHB0cik7CiAJCQkJZWxzZQogCQkJCQl0cHRy Kys7CiAJCQl9CisJCQl9CiAJCX0KIAl9CiAKQEAgLTE1NDgsMzcgKzE2MTAsNTcgQEAgQ29weUF0 dHJpYnV0ZU91dENTVihDb3B5VG9TdGF0ZSBjc3RhdGUsIGNvbnN0IGNoYXIgKnN0cmluZywKIAkJ ICovCiAJCXN0YXJ0ID0gcHRyOwogCi0JCSNpZm5kZWYgVVNFX05PX1NJTUQKLQkJCXsJCi0JCQkJ Y29uc3QgY2hhciogZW5kID0gcHRyICsgc3RybGVuKHB0cik7Ci0KLQkJCQlWZWN0b3I4IGVzY2Fw ZV9tYXNrID0gdmVjdG9yOF9icm9hZGNhc3QoZXNjYXBlYyk7Ci0JCQkJVmVjdG9yOCBxdW90ZV9t YXNrID0gdmVjdG9yOF9icm9hZGNhc3QocXVvdGVjKTsKKwkJY29uc3QgY2hhciAqZW5kID0gcHRy ICsgc3RybGVuKHB0cik7CiAKLQkJCQl3aGlsZSAocHRyICsgc2l6ZW9mKFZlY3RvcjgpIDw9IGVu ZCkgewotCQkJCQlWZWN0b3I4IGNodW5rOwotCQkJCQlWZWN0b3I4IHNwZWNpYWxfbWFzazsKLQkJ CQkJdWludDMyIG1hc2s7CisJCXdoaWxlICgoYyA9ICpwdHIpICE9ICdcMCcpCisJCXsKKyNpZm5k ZWYgVVNFX05PX1NJTUQKKwkJCS8qCisJCQkgKiBTSU1EIGZhc3QgcGF0aDogc2NhbiBhaGVhZCBm b3IgcXVvdGUvZXNjYXBlIGNoYXJhY3RlcnMuCisJCQkgKiBSZS1lbnRlciBhZnRlciBoYW5kbGlu ZyBlYWNoIHNwZWNpYWwgY2hhcmFjdGVyLgorCQkJICovCisJCQl7CQorCQkJCVZlY3RvcjgJCWVz Y2FwZV92ZWM7CisJCQkJVmVjdG9yOAkJcXVvdGVfdmVjOworCQkJCQorCQkJCS8qIFByZS1jb21w dXRlIGJyb2FkY2FzdCB2ZWN0b3JzICovCisJCQkJZXNjYXBlX3ZlYyA9IHZlY3RvcjhfYnJvYWRj YXN0KGVzY2FwZWMpOworCQkJCXF1b3RlX3ZlYyA9IHZlY3RvcjhfYnJvYWRjYXN0KHF1b3RlYyk7 CisKKwkJCQl3aGlsZSAocHRyICsgc2l6ZW9mKFZlY3RvcjgpIDw9IGVuZCkKKwkJCQl7CisJCQkJ CVZlY3RvcjgJCWNodW5rOworCQkJCQlWZWN0b3I4CQlzcGVjaWFsX21hc2s7CisJCQkJCXVpbnQz MgkJbWFzazsKIAogCQkJCQl2ZWN0b3I4X2xvYWQoJmNodW5rLCAoY29uc3QgdWludDggKikgcHRy KTsKKwkJCQkJCiAJCQkJCXNwZWNpYWxfbWFzayA9IHZlY3Rvcjhfb3IoCi0JCQkJCQl2ZWN0b3I4 X2VxKGNodW5rLCBlc2NhcGVfbWFzayksIAotCQkJCQkJCXZlY3RvcjhfZXEoY2h1bmssIHF1b3Rl X21hc2spKTsKKwkJCQkJCXZlY3RvcjhfZXEoY2h1bmssIGVzY2FwZV92ZWMpLCAKKwkJCQkJCXZl Y3RvcjhfZXEoY2h1bmssIHF1b3RlX3ZlYykpOwogCiAJCQkJCW1hc2sgPSB2ZWN0b3I4X2hpZ2hi aXRfbWFzayhzcGVjaWFsX21hc2spOwotCQkJCQlpZiAobWFzayAhPSAwKSB7Ci0JCQkJCQlwdHIg Kz0gcGdfcmlnaHRtb3N0X29uZV9wb3MzMihtYXNrKTsKLQkJCQkJCXVzZV9xdW90ZSA9IHRydWU7 CisJCQkJCWlmIChtYXNrICE9IDApCisJCQkJCXsKKwkJCQkJCS8qIEZvdW5kIHNwZWNpYWwgY2hh cmFjdGVyICovCisJCQkJCQlpbnQgYWR2YW5jZSA9IHBnX3JpZ2h0bW9zdF9vbmVfcG9zMzIobWFz ayk7CisJCQkJCQlwdHIgKz0gYWR2YW5jZTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAKKwkJCQkJ LyogTm8gc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRoaXMgY2h1bmsgKi8KIAkJCQkJcHRyICs9IHNp emVvZihWZWN0b3I4KTsKIAkJCQl9CisJCQkJCisJCQkJLyogVXBkYXRlIGMgYWZ0ZXIgU0lNRCBz Y2FuICovCisJCQkJYyA9ICpwdHI7CiAJCQl9Ci0JCSNlbmRpZgotCQkKLQkJd2hpbGUgKChjID0g KnB0cikgIT0gJ1wwJykKLQkJeworI2VuZGlmIC8qICFVU0VfTk9fU0lNRCAqLworCisJCQkvKiBT Y2FsYXIgaGFuZGxpbmcgLSBzYW1lIGNvZGUgZm9yIFNJTUQgYW5kIG5vbi1TSU1EIGJ1aWxkcyAq LworCQkJaWYgKGMgPT0gJ1wwJykKKwkJCQlicmVhazsKKwogCQkJaWYgKGMgPT0gcXVvdGVjIHx8 IGMgPT0gZXNjYXBlYykKIAkJCXsKIAkJCQlEVU1QU09GQVIoKTsKLS0gCjIuMzQuMQoK --0000000000002026970646b4077d Content-Type: text/x-patch; charset="US-ASCII"; name="0004-Speed-up-COPY-TO-text-CSV-using-SIMD.patch" Content-Disposition: attachment; filename="0004-Speed-up-COPY-TO-text-CSV-using-SIMD.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mjk44xy11 RnJvbSBiZmM1ODBiMTdhZDVlNmQ5ODFhZGMxNDZjMjQ2OTBhZmU0NjM0Y2UxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBeW91YktBWiA8a2F6YXJheW91YjIwMDRAZ21haWwuY29tPgpE YXRlOiBXZWQsIDI0IERlYyAyMDI1IDEyOjU1OjE1ICswMTAwClN1YmplY3Q6IFtQQVRDSF0gU3Bl ZWQgdXAgQ09QWSBUTyB0ZXh0IENTViB1c2luZyBTSU1ECgotLS0KIHNyYy9iYWNrZW5kL2NvbW1h bmRzL2NvcHl0by5jIHwgMTI2ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDEg ZmlsZSBjaGFuZ2VkLCAxMjYgaW5zZXJ0aW9ucygrKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L2NvbW1hbmRzL2NvcHl0by5jIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weXRvLmMKaW5kZXgg ZGFlOTE2MzBhYzMuLmUxMzA2NzI4NTA5IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5k cy9jb3B5dG8uYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5dG8uYwpAQCAtMzEsNiAr MzEsOCBAQAogI2luY2x1ZGUgIm1iL3BnX3djaGFyLmgiCiAjaW5jbHVkZSAibWlzY2FkbWluLmgi CiAjaW5jbHVkZSAicGdzdGF0LmgiCisjaW5jbHVkZSAicG9ydC9wZ19iaXR1dGlscy5oIgorI2lu Y2x1ZGUgInBvcnQvc2ltZC5oIgogI2luY2x1ZGUgInN0b3JhZ2UvZmQuaCIKICNpbmNsdWRlICJ0 Y29wL3Rjb3Bwcm90LmgiCiAjaW5jbHVkZSAidXRpbHMvbHN5c2NhY2hlLmgiCkBAIC0xMjY2LDYg KzEyNjgsMzYgQEAgQ29weUF0dHJpYnV0ZU91dFRleHQoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25z dCBjaGFyICpzdHJpbmcpCiAJaWYgKGNzdGF0ZS0+ZW5jb2RpbmdfZW1iZWRzX2FzY2lpKQogCXsK IAkJc3RhcnQgPSBwdHI7CisJCSNpZm5kZWYgVVNFX05PX1NJTUQKKwkJCXsKKwkJCQljb25zdCBj aGFyKiBlbmQgPSBwdHIgKyBzdHJsZW4ocHRyKTsKKwkJCQl3aGlsZSAocHRyICsgc2l6ZW9mKFZl Y3RvcjgpIDw9IGVuZCkgeworCQkJCQlWZWN0b3I4IGNodW5rOworCQkJCQlWZWN0b3I4IGNvbnRy b2xfbWFzazsKKwkJCQkJVmVjdG9yOCBiYWNrc2xhc2hfbWFzazsKKwkJCQkJVmVjdG9yOCBkZWxp bV9tYXNrOworCQkJCQlWZWN0b3I4IHNwZWNpYWxfbWFzazsKKwkJCQkJdWludDMyIG1hc2s7CisK KwkJCQkJdmVjdG9yOF9sb2FkKCZjaHVuaywgKGNvbnN0IHVpbnQ4ICopIHB0cik7CisJCQkJCWNv bnRyb2xfbWFzayA9IHZlY3RvcjhfZ3QodmVjdG9yOF9icm9hZGNhc3QoMHgyMCksIGNodW5rKTsK KwkJCQkJYmFja3NsYXNoX21hc2sgPSB2ZWN0b3I4X2VxKHZlY3RvcjhfYnJvYWRjYXN0KCdcXCcp LCBjaHVuayk7CisJCQkJCWRlbGltX21hc2sgPSB2ZWN0b3I4X2VxKHZlY3RvcjhfYnJvYWRjYXN0 KGRlbGltYyksIGNodW5rKTsKKworCQkJCQlzcGVjaWFsX21hc2sgPSB2ZWN0b3I4X29yKGNvbnRy b2xfbWFzaywgdmVjdG9yOF9vcihiYWNrc2xhc2hfbWFzaywgZGVsaW1fbWFzaykpOworCisJCQkJ CW1hc2sgPSB2ZWN0b3I4X2hpZ2hiaXRfbWFzayhzcGVjaWFsX21hc2spOworCQkJCQlpZiAobWFz ayAhPSAwKSB7CisJCQkJCQlpbnQgYWR2YW5jZSA9IHBnX3JpZ2h0bW9zdF9vbmVfcG9zMzIobWFz ayk7CisJCQkJCQlwdHIgKz0gYWR2YW5jZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJ cHRyICs9IHNpemVvZihWZWN0b3I4KTsKKwkJCQl9CisJCQl9IAorCQkjZW5kaWYKKwogCQl3aGls ZSAoKGMgPSAqcHRyKSAhPSAnXDAnKQogCQl7CiAJCQlpZiAoKHVuc2lnbmVkIGNoYXIpIGMgPCAo dW5zaWduZWQgY2hhcikgMHgyMCkKQEAgLTEzMjYsNiArMTM1OCwzNiBAQCBDb3B5QXR0cmlidXRl T3V0VGV4dChDb3B5VG9TdGF0ZSBjc3RhdGUsIGNvbnN0IGNoYXIgKnN0cmluZykKIAllbHNlCiAJ ewogCQlzdGFydCA9IHB0cjsKKwkJI2lmbmRlZiBVU0VfTk9fU0lNRAorCQkJeworCQkJCWNvbnN0 IGNoYXIqIGVuZCA9IHB0ciArIHN0cmxlbihwdHIpOworCQkJCXdoaWxlIChwdHIgKyBzaXplb2Yo VmVjdG9yOCkgPD0gZW5kKSB7CisJCQkJCVZlY3RvcjggY2h1bms7CisJCQkJCVZlY3RvcjggY29u dHJvbF9tYXNrOworCQkJCQlWZWN0b3I4IGJhY2tzbGFzaF9tYXNrOworCQkJCQlWZWN0b3I4IGRl bGltX21hc2s7CisJCQkJCVZlY3Rvcjggc3BlY2lhbF9tYXNrOworCQkJCQl1aW50MzIgbWFzazsK KworCQkJCQl2ZWN0b3I4X2xvYWQoJmNodW5rLCAoY29uc3QgdWludDggKikgcHRyKTsKKwkJCQkJ Y29udHJvbF9tYXNrID0gdmVjdG9yOF9ndCh2ZWN0b3I4X2Jyb2FkY2FzdCgweDIwKSwgY2h1bmsp OworCQkJCQliYWNrc2xhc2hfbWFzayA9IHZlY3RvcjhfZXEodmVjdG9yOF9icm9hZGNhc3QoJ1xc JyksIGNodW5rKTsKKwkJCQkJZGVsaW1fbWFzayA9IHZlY3RvcjhfZXEodmVjdG9yOF9icm9hZGNh c3QoZGVsaW1jKSwgY2h1bmspOworCisJCQkJCXNwZWNpYWxfbWFzayA9IHZlY3Rvcjhfb3IoY29u dHJvbF9tYXNrLCB2ZWN0b3I4X29yKGJhY2tzbGFzaF9tYXNrLCBkZWxpbV9tYXNrKSk7CisKKwkJ CQkJbWFzayA9IHZlY3RvcjhfaGlnaGJpdF9tYXNrKHNwZWNpYWxfbWFzayk7CisJCQkJCWlmICht YXNrICE9IDApIHsKKwkJCQkJCWludCBhZHZhbmNlID0gcGdfcmlnaHRtb3N0X29uZV9wb3MzMiht YXNrKTsKKwkJCQkJCXB0ciArPSBhZHZhbmNlOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJ CQlwdHIgKz0gc2l6ZW9mKFZlY3RvcjgpOworCQkJCX0KKwkJCX0gCisJCSNlbmRpZgorCiAJCXdo aWxlICgoYyA9ICpwdHIpICE9ICdcMCcpCiAJCXsKIAkJCWlmICgodW5zaWduZWQgY2hhcikgYyA8 ICh1bnNpZ25lZCBjaGFyKSAweDIwKQpAQCAtMTQyOCw2ICsxNDkwLDQwIEBAIENvcHlBdHRyaWJ1 dGVPdXRDU1YoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpzdHJpbmcsCiAJCXsKIAkJ CWNvbnN0IGNoYXIgKnRwdHIgPSBwdHI7CiAKKwkJCSNpZm5kZWYgVVNFX05PX1NJTUQKKwkJCQl7 CQorCQkJCQljb25zdCBjaGFyKiBlbmQgPSB0cHRyICsgc3RybGVuKHRwdHIpOworCisJCQkJCVZl Y3RvcjggZGVsaW1fbWFzayA9IHZlY3RvcjhfYnJvYWRjYXN0KGRlbGltYyk7CisJCQkJCVZlY3Rv cjggcXVvdGVfbWFzayA9IHZlY3RvcjhfYnJvYWRjYXN0KHF1b3RlYyk7CisJCQkJCVZlY3Rvcjgg bmV3bGluZV9tYXNrID0gdmVjdG9yOF9icm9hZGNhc3QoJ1xuJyk7CisJCQkJCVZlY3RvcjggY2Fy cmlhZ2VfcmV0dXJuX21hc2sgPSB2ZWN0b3I4X2Jyb2FkY2FzdCgnXHInKTsKKworCQkJCQl3aGls ZSAodHB0ciArIHNpemVvZihWZWN0b3I4KSA8PSBlbmQpIHsKKwkJCQkJCVZlY3RvcjggY2h1bms7 CisJCQkJCQlWZWN0b3I4IHNwZWNpYWxfbWFzazsKKwkJCQkJCXVpbnQzMiBtYXNrOworCisJCQkJ CQl2ZWN0b3I4X2xvYWQoJmNodW5rLCAoY29uc3QgdWludDggKikgdHB0cik7CisJCQkJCQlzcGVj aWFsX21hc2sgPSB2ZWN0b3I4X29yKAorCQkJCQkJCXZlY3Rvcjhfb3IodmVjdG9yOF9lcShjaHVu aywgZGVsaW1fbWFzayksCisJCQkJCQkJCQkgICB2ZWN0b3I4X2VxKGNodW5rLCBxdW90ZV9tYXNr KSksCisJCQkJCQkJdmVjdG9yOF9vcih2ZWN0b3I4X2VxKGNodW5rLCBuZXdsaW5lX21hc2spLAor CQkJCQkJCQkJICAgdmVjdG9yOF9lcShjaHVuaywgY2FycmlhZ2VfcmV0dXJuX21hc2spKQorCQkJ CQkJKTsKKworCQkJCQkJbWFzayA9IHZlY3RvcjhfaGlnaGJpdF9tYXNrKHNwZWNpYWxfbWFzayk7 CisJCQkJCQlpZiAobWFzayAhPSAwKSB7CisJCQkJCQkJdHB0ciArPSBwZ19yaWdodG1vc3Rfb25l X3BvczMyKG1hc2spOworCQkJCQkJCXVzZV9xdW90ZSA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJ CQkJCQl9CisKKwkJCQkJCXRwdHIgKz0gc2l6ZW9mKFZlY3RvcjgpOworCQkJCQl9CisJCQkJfQor CQkJI2VuZGlmCisKIAkJCXdoaWxlICgoYyA9ICp0cHRyKSAhPSAnXDAnKQogCQkJewogCQkJCWlm IChjID09IGRlbGltYyB8fCBjID09IHF1b3RlYyB8fCBjID09ICdcbicgfHwgYyA9PSAnXHInKQpA QCAtMTQ1MSw2ICsxNTQ3LDM2IEBAIENvcHlBdHRyaWJ1dGVPdXRDU1YoQ29weVRvU3RhdGUgY3N0 YXRlLCBjb25zdCBjaGFyICpzdHJpbmcsCiAJCSAqIFdlIGFkb3B0IHRoZSBzYW1lIG9wdGltaXph dGlvbiBzdHJhdGVneSBhcyBpbiBDb3B5QXR0cmlidXRlT3V0VGV4dAogCQkgKi8KIAkJc3RhcnQg PSBwdHI7CisKKwkJI2lmbmRlZiBVU0VfTk9fU0lNRAorCQkJewkKKwkJCQljb25zdCBjaGFyKiBl bmQgPSBwdHIgKyBzdHJsZW4ocHRyKTsKKworCQkJCVZlY3RvcjggZXNjYXBlX21hc2sgPSB2ZWN0 b3I4X2Jyb2FkY2FzdChlc2NhcGVjKTsKKwkJCQlWZWN0b3I4IHF1b3RlX21hc2sgPSB2ZWN0b3I4 X2Jyb2FkY2FzdChxdW90ZWMpOworCisJCQkJd2hpbGUgKHB0ciArIHNpemVvZihWZWN0b3I4KSA8 PSBlbmQpIHsKKwkJCQkJVmVjdG9yOCBjaHVuazsKKwkJCQkJVmVjdG9yOCBzcGVjaWFsX21hc2s7 CisJCQkJCXVpbnQzMiBtYXNrOworCisJCQkJCXZlY3RvcjhfbG9hZCgmY2h1bmssIChjb25zdCB1 aW50OCAqKSBwdHIpOworCQkJCQlzcGVjaWFsX21hc2sgPSB2ZWN0b3I4X29yKAorCQkJCQkJdmVj dG9yOF9lcShjaHVuaywgZXNjYXBlX21hc2spLCAKKwkJCQkJCQl2ZWN0b3I4X2VxKGNodW5rLCBx dW90ZV9tYXNrKSk7CisKKwkJCQkJbWFzayA9IHZlY3RvcjhfaGlnaGJpdF9tYXNrKHNwZWNpYWxf bWFzayk7CisJCQkJCWlmIChtYXNrICE9IDApIHsKKwkJCQkJCXB0ciArPSBwZ19yaWdodG1vc3Rf b25lX3BvczMyKG1hc2spOworCQkJCQkJdXNlX3F1b3RlID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOwor CQkJCQl9CisKKwkJCQkJcHRyICs9IHNpemVvZihWZWN0b3I4KTsKKwkJCQl9CisJCQl9CisJCSNl bmRpZgorCQkKIAkJd2hpbGUgKChjID0gKnB0cikgIT0gJ1wwJykKIAkJewogCQkJaWYgKGMgPT0g cXVvdGVjIHx8IGMgPT0gZXNjYXBlYykKLS0gCjIuMzQuMQoK --0000000000002026970646b4077d--