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 1wSNaT-003934-3C for pgsql-hackers@arkaria.postgresql.org; Wed, 27 May 2026 23:22:58 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wSNaR-00A2Qd-2j for pgsql-hackers@arkaria.postgresql.org; Wed, 27 May 2026 23:22:56 +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 1wSNaR-00A2QV-0q for pgsql-hackers@lists.postgresql.org; Wed, 27 May 2026 23:22:56 +0000 Received: from mail-vk1-xa35.google.com ([2607:f8b0:4864:20::a35]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wSNaP-0000000159v-0DiY for pgsql-hackers@postgresql.org; Wed, 27 May 2026 23:22:55 +0000 Received: by mail-vk1-xa35.google.com with SMTP id 71dfb90a1353d-57513733658so4178670e0c.3 for ; Wed, 27 May 2026 16:22:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779924172; x=1780528972; darn=postgresql.org; h=in-reply-to:references:from:subject:cc:to:message-id:date :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=/urvyba0JjyvvFHCetja4IKpShCLV96ufjMJwFexTgk=; b=bSdSC+/UUVSTGN1prrPX/AtdQm/gvY6JJ/n8MNMUjym/zLjXeuon8WsprUgnf6Tt5k 4lwHOXTGejgbYxVQlQzAokW3dX8uUYo9cDQq+2WefuLpfK2Zc+9ex9q1v5rM7NuE0vIu kqUbZfOWBzQHungGG58Xmh3Pjlz54HwJcEX/inDuTduE3OVBavYGOvNDEPjuGE9U0ntw LUCCzw7GPmoGsJb+A7/wdohXuCmn2niEQoyFGwF0oW2tFhIOV46y1HT+7i3NWW2OjRGt DcRVGCyKMN6m7RzdCjOV7GnDJyhikjqifO8Uqo4A0zwv0HnN6a4ylWw1/gUhC2XF9Co+ lynw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779924172; x=1780528972; h=in-reply-to:references:from:subject:cc:to:message-id:date :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=/urvyba0JjyvvFHCetja4IKpShCLV96ufjMJwFexTgk=; b=GB360ga2L4J0xtVGSFnjoQtQHVahGNzKNhyiCTXyEhtG9VeuOfFYgMLEOqgNK7vT/+ ix0L/py//Grd47zLQDUreDl+iKVoS39Gn3OgMm9GZEuYbba+Cd4fEvQD7npcGYM1BwM3 9RZE5jb1P/XxQsHOk0Rgwu6BpwxEZj4u0FIn7FYcGp/RO0tAizsF0dEm8P4y0+0v3wqH dB2zstJtQ8c+32pJVqeIL3ePVSoWqJzwQ+OMDTc3diCgX5zng7SjGPcrb4HF67MJsf+T ara4fp10Hqw1Ba7UFnsVrl/bYYlFybrRk1iJJ2ZtLhzwMnQY0GGriiNRjjOsTQvxKw3Q xlTA== X-Forwarded-Encrypted: i=1; AFNElJ9zTNLTZb+F4Sj1F3i0mhgvqAh48jjpFDeF3e05rc3QGDcro83er9of2q+MRPmT+vYOzMFJrbfRSw8nNUe/@postgresql.org X-Gm-Message-State: AOJu0Yzd2x3Gt7aj0z6wGFjfml/SWl+23hf4mpDAcykpZUBvNN5joYy6 2zI4qhz99ZB17OPmrFPsgK6rV9QevZRXtgpJDjWH4lcoWVfYz7UMuFOl X-Gm-Gg: Acq92OHuKB+6PFPmjlAJDjDaWDFdB1DHD9a1GEfMCIi7eYCd+DorzBA//hnqrVXCfXF 0PQ1V4SEezUlhnGVxkoEvT20LjjIUhmU67rIlUu/D4w5GPtaKRxGjnqRApSakHt67wrldX20+B/ CRDOPtL8NWkLvmvCv/TJL+1J2PdXb77OpNSV8YJLhYKcyrQ1Z+DPz5aXa43njho52ma5NDczoD0 kK0Q82AiF+OSkFn53rN/ijWuM9LNUyx98SzFABmzbxLlquCyhcrwKYVllj+QjaFKEq7c0C0T6Ed WOHUYxAsN4nr40AyOCE8Ktd0shfS46MWwicPEm8aySWgi0ZlhEkFvKw2AuYWsatkcLmi3Zo+e3U UTxQ6jDkp+EyUvX+ytln8VVbB7snPtla23SlKZYbnqmCkYv9w32LhdRpjktXJM4+vTOSlpGo/WM NCRAVPDCO4K5ONiKMcbzTP8eKhHV7Hwo9VSPd2h824ykQRYMzxCaNe/6IL9HOp X-Received: by 2002:a05:6122:1686:b0:56d:4511:9367 with SMTP id 71dfb90a1353d-5865865a0camr12049946e0c.0.1779924171087; Wed, 27 May 2026 16:22:51 -0700 (PDT) Received: from localhost ([2804:14d:328a:a59c:e478:6aba:413:6a85]) by smtp.gmail.com with ESMTPSA id 71dfb90a1353d-588c129cba5sm19918368e0c.14.2026.05.27.16.22.48 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 27 May 2026 16:22:50 -0700 (PDT) Content-Type: multipart/mixed; boundary=0914b003dd872f83283d693efb1b4087ca3ae32bc3bf0fc70f456a8dd072 Mime-Version: 1.0 Date: Wed, 27 May 2026 20:22:47 -0300 Message-Id: To: "Masahiko Sawada" Cc: "Andrew Dunstan" , "jian he" , "Tomas Vondra" , Subject: Re: postgres_fdw: Use COPY to speed up batch inserts From: "Matheus Alcantara" X-Mailer: aerc 0.21.0 References: <5c52f4c7-74fa-4594-8378-53fd49f39329@dunslane.net> <72ec1708-0c02-4ae9-b4f5-ee2bac5fd2f3@gmail.com> In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0914b003dd872f83283d693efb1b4087ca3ae32bc3bf0fc70f456a8dd072 Content-Type: multipart/alternative; boundary=81d8e2b2d2607f390ea508e256969932e4465e6003539d1d7bc80d17dcfd --81d8e2b2d2607f390ea508e256969932e4465e6003539d1d7bc80d17dcfd Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Content-Type: text/plain; charset=UTF-8 On Wed Apr 1, 2026 at 12:50 PM -03, Matheus Alcantara wrote: >> -- on local server >> copy t(a, d) from stdin; >> Enter data to be copied followed by a newline. >> End with a backslash and a period on a line by itself, or an EOF signal. >>>> 1 hello\nworld >>>> \. >> ERROR: invalid input syntax for type integer: "world" >> CONTEXT: COPY t, line 2, column a: "world" >> remote SQL command: COPY public.t(a, d) FROM STDIN (FORMAT TEXT) >> > > I think that we need something like CopyAttributeOutText() here.=20 > > To fix this I've added appendStringInfoText() which is a similar version > of CopyAttributeOutText() that works with a StringInfo. I did not find > any function that I could reuse here, if such function exists please let > me know. > > I'm wondering if we should have this similar function or try to combine > both to avoid duplicated logic, although it looks complicated to me at > first look to combine these both usages. > I've spent some time hacking into this and actually I don't think that it's too complicated. Please see the attached patchset. 0001: Extract CopyAttributeOutText escape logic into a reusable function that can be used by postgres_fdw and by COPY TO routine. 0002: Is the main feature implementation using the TEXT format reusing the refactor from 0001 avoiding all the duplicated code introduced on this previous patch version. I've also removed the resultRelInfo->ri_WithCheckOptions =3D=3D NIL check that I've introduced again by mistake since it was already commented at [1] that it should be removed. [1] https://www.postgresql.org/message-id/72ec1708-0c02-4ae9-b4f5-ee2bac5fd= 2f3%40gmail.com -- Matheus Alcantara EDB: https://www.enterprisedb.com --81d8e2b2d2607f390ea508e256969932e4465e6003539d1d7bc80d17dcfd-- --0914b003dd872f83283d693efb1b4087ca3ae32bc3bf0fc70f456a8dd072 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=v15-0001-Extract-CopyEscapeText-for-reuse-outside-COPY-TO.patch Content-Type: text/plain; charset=utf-8; name=v15-0001-Extract-CopyEscapeText-for-reuse-outside-COPY-TO.patch RnJvbSBlMDJlY2QxMWM5MzMwNmEwMTYwYjdmZmI4N2EwMGUxNDIyYjJiZDhhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXRoZXVzIEFsY2FudGFyYSA8bXRocy5kZXZAcG0ubWU+CkRh dGU6IE1vbiwgMTggTWF5IDIwMjYgMTk6MjM6NDMgLTAzMDAKU3ViamVjdDogW1BBVENIIHYxNSAx LzJdIEV4dHJhY3QgQ29weUVzY2FwZVRleHQoKSBmb3IgcmV1c2Ugb3V0c2lkZSBDT1BZIFRPCgpS ZWZhY3RvciBDb3B5QXR0cmlidXRlT3V0VGV4dCgpIHRvIGV4dHJhY3QgaXRzIGNvcmUgdGV4dCBl c2NhcGluZyBsb2dpYwppbnRvIGEgbmV3IHB1YmxpYyBmdW5jdGlvbiBDb3B5RXNjYXBlVGV4dCgp IHRoYXQgb3BlcmF0ZXMgb24gYSBTdHJpbmdJbmZvCmJ1ZmZlciB3aXRoIGV4cGxpY2l0IHBhcmFt ZXRlcnMsIHJlbW92aW5nIHRoZSBkZXBlbmRlbmN5IG9uIENvcHlUb1N0YXRlLgoKVGhpcyBlbmFi bGVzIG90aGVyIGNvZGUgcGF0aHMsIHN1Y2ggYXMgcG9zdGdyZXNfZmR3LCB0byByZXVzZSB0aGUg Q09QWQp0ZXh0IGZvcm1hdCBlc2NhcGluZyBsb2dpYyB3aXRob3V0IG5lZWRpbmcgdG8gY29uc3Ry dWN0IGEgZnVsbCBDb3B5VG9TdGF0ZS4KCkNvcHlBdHRyaWJ1dGVPdXRUZXh0KCkgbm93IGJlY29t ZXMgYSB0aGluIHdyYXBwZXIgdGhhdCBjYWxscwpDb3B5RXNjYXBlVGV4dCgpIHdpdGggdGhlIGFw cHJvcHJpYXRlIHZhbHVlcyBmcm9tIENvcHlUb1N0YXRlLgoKQWxzbyBpbnRyb2R1Y2UgQ29weVNl bmREYXRhQnVmKCkgYW5kIENvcHlTZW5kQ2hhckJ1ZigpIG1hY3JvcyBhcyBsb3ctbGV2ZWwKaGVs cGVycyB0aGF0IG9wZXJhdGUgZGlyZWN0bHkgb24gU3RyaW5nSW5mbyBidWZmZXJzLgoKQXV0aG9y OiBNYXRoZXVzIEFsY2FudGFyYSA8bXRocy5kZXZAcG0ubWU+CkRpc2N1c3Npb246IGh0dHBzOi8v d3d3LnBvc3RncmVzcWwub3JnL21lc3NhZ2UtaWQvZmxhdC9ERElaSjIxN09VREsuMlI1V0U0T0dM NVBUWSU0MGdtYWlsLmNvbQotLS0KIHNyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHl0by5jIHwgODUg KysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0KIHNyYy9pbmNsdWRlL2NvbW1hbmRz L2NvcHkuaCAgIHwgIDYgKysrCiAyIGZpbGVzIGNoYW5nZWQsIDcxIGluc2VydGlvbnMoKyksIDIw IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHl0by5j IGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weXRvLmMKaW5kZXggZmZlZDYzYTI5ODYuLmNlZWUw MDE0Y2ZjIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5dG8uYworKysgYi9z cmMvYmFja2VuZC9jb21tYW5kcy9jb3B5dG8uYwpAQCAtNTUzLDYgKzU1MywxMiBAQCBTZW5kQ29w eUVuZChDb3B5VG9TdGF0ZSBjc3RhdGUpCiAJcHFfcHV0ZW1wdHltZXNzYWdlKFBxTXNnX0NvcHlE b25lKTsKIH0KIAorI2RlZmluZSBDb3B5U2VuZENoYXJCdWYoYnVmLCBjKSBcCisJYXBwZW5kU3Ry aW5nSW5mb0NoYXJNYWNybyhidWYsIGMpCisKKyNkZWZpbmUgQ29weVNlbmREYXRhQnVmKGJ1Ziwg ZGF0YWJ1ZiwgZGF0YXNpemUpIFwKKwlhcHBlbmRCaW5hcnlTdHJpbmdJbmZvKGJ1ZiwgZGF0YWJ1 ZiwgZGF0YXNpemUpCisKIC8qLS0tLS0tLS0tLQogICogQ29weVNlbmREYXRhIHNlbmRzIG91dHB1 dCBkYXRhIHRvIHRoZSBkZXN0aW5hdGlvbiAoZmlsZSBvciBmcm9udGVuZCkKICAqIENvcHlTZW5k U3RyaW5nIGRvZXMgdGhlIHNhbWUgZm9yIG51bGwtdGVybWluYXRlZCBzdHJpbmdzCkBAIC01NjYs NyArNTcyLDcgQEAgU2VuZENvcHlFbmQoQ29weVRvU3RhdGUgY3N0YXRlKQogc3RhdGljIHZvaWQK IENvcHlTZW5kRGF0YShDb3B5VG9TdGF0ZSBjc3RhdGUsIGNvbnN0IHZvaWQgKmRhdGFidWYsIGlu dCBkYXRhc2l6ZSkKIHsKLQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZvKGNzdGF0ZS0+ZmVfbXNnYnVm LCBkYXRhYnVmLCBkYXRhc2l6ZSk7CisJQ29weVNlbmREYXRhQnVmKGNzdGF0ZS0+ZmVfbXNnYnVm LCBkYXRhYnVmLCBkYXRhc2l6ZSk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC01NzgsNyArNTg0LDcg QEAgQ29weVNlbmRTdHJpbmcoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpzdHIpCiBz dGF0aWMgdm9pZAogQ29weVNlbmRDaGFyKENvcHlUb1N0YXRlIGNzdGF0ZSwgY2hhciBjKQogewot CWFwcGVuZFN0cmluZ0luZm9DaGFyTWFjcm8oY3N0YXRlLT5mZV9tc2didWYsIGMpOworCUNvcHlT ZW5kQ2hhckJ1Zihjc3RhdGUtPmZlX21zZ2J1ZiwgYyk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0x NDE3LDE2ICsxNDIzLDQ0IEBAIENvcHlPbmVSb3dUbyhDb3B5VG9TdGF0ZSBjc3RhdGUsIFR1cGxl VGFibGVTbG90ICpzbG90KQogCQkJQ29weVNlbmREYXRhKGNzdGF0ZSwgc3RhcnQsIHB0ciAtIHN0 YXJ0KTsgXAogCX0gd2hpbGUgKDApCiAKLXN0YXRpYyB2b2lkCi1Db3B5QXR0cmlidXRlT3V0VGV4 dChDb3B5VG9TdGF0ZSBjc3RhdGUsIGNvbnN0IGNoYXIgKnN0cmluZykKKy8qIExpa2UgYWJvdmUs IGJ1dCBpdCB3b3JrcyB3aXRoIGEgc3RyaW5nIGJ1ZmZlciAqLworI2RlZmluZSBEVU1QU09GQVJf VE9fQlVGKCkgXAorCWRvIHsgXAorCQlpZiAocHRyID4gc3RhcnQpIFwKKwkJCUNvcHlTZW5kRGF0 YUJ1ZihidWYsIHN0YXJ0LCBwdHIgLSBzdGFydCk7IFwKKwl9IHdoaWxlICgwKQorCisKKy8qCisg KiBFc2NhcGUgYSBzdHJpbmcgZm9yIENPUFkgVEVYVCBmb3JtYXQgb3V0cHV0CisgKgorICogRXNj YXBlcyBjb250cm9sIGNoYXJhY3RlcnMsIGJhY2tzbGFzaGVzLCBhbmQgdGhlIGRlbGltaXRlciBj aGFyYWN0ZXIKKyAqIGFjY29yZGluZyB0byBDT1BZIFRFWFQgZm9ybWF0IHJ1bGVzLiBUaGUgZXNj YXBlZCBzdHJpbmcgaXMgYXBwZW5kZWQKKyAqIHRvICdidWYnLgorICoKKyAqIFBhcmFtZXRlcnM6 CisgKiAgIGJ1ZiAtIFN0cmluZ0luZm8gYnVmZmVyIHRvIGFwcGVuZCB0aGUgZXNjYXBlZCB0ZXh0 IHRvCisgKiAgIHN0cmluZyAtIHRoZSBpbnB1dCBzdHJpbmcgdG8gZXNjYXBlCisgKiAgIGRlbGlt YyAtIHRoZSBkZWxpbWl0ZXIgY2hhcmFjdGVyIHRoYXQgbXVzdCBiZSBlc2NhcGVkCisgKiAgIGZp bGVfZW5jb2RpbmcgLSB0YXJnZXQgZW5jb2RpbmcgZm9yIHRoZSBvdXRwdXQKKyAqICAgbmVlZF90 cmFuc2NvZGluZyAtIGlmIHRydWUsIGNvbnZlcnQgZnJvbSBzZXJ2ZXIgZW5jb2RpbmcgdG8gZmls ZV9lbmNvZGluZworICogICBlbmNvZGluZ19lbWJlZHNfYXNjaWkgLSBpZiB0cnVlLCB0aGUgZW5j b2RpbmcgbWF5IGhhdmUgQVNDSUkgYnl0ZXMgYXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAg ICAgbm9uLWZpcnN0IGJ5dGVzIG9mIG11bHRpLWJ5dGUgY2hhcmFjdGVycworICovCit2b2lkCitD b3B5RXNjYXBlVGV4dChTdHJpbmdJbmZvIGJ1ZiwKKwkJCSAgIGNvbnN0IGNoYXIgKnN0cmluZywK KwkJCSAgIGNoYXIgZGVsaW1jLAorCQkJICAgaW50IGZpbGVfZW5jb2RpbmcsCisJCQkgICBib29s IG5lZWRfdHJhbnNjb2RpbmcsCisJCQkgICBib29sIGVuY29kaW5nX2VtYmVkc19hc2NpaSkKIHsK IAljb25zdCBjaGFyICpwdHI7CiAJY29uc3QgY2hhciAqc3RhcnQ7CiAJY2hhcgkJYzsKLQljaGFy CQlkZWxpbWMgPSBjc3RhdGUtPm9wdHMuZGVsaW1bMF07CiAKLQlpZiAoY3N0YXRlLT5uZWVkX3Ry YW5zY29kaW5nKQotCQlwdHIgPSBwZ19zZXJ2ZXJfdG9fYW55KHN0cmluZywgc3RybGVuKHN0cmlu ZyksIGNzdGF0ZS0+ZmlsZV9lbmNvZGluZyk7CisJaWYgKG5lZWRfdHJhbnNjb2RpbmcpCisJCXB0 ciA9IHBnX3NlcnZlcl90b19hbnkoc3RyaW5nLCBzdHJsZW4oc3RyaW5nKSwgZmlsZV9lbmNvZGlu Zyk7CiAJZWxzZQogCQlwdHIgPSBzdHJpbmc7CiAKQEAgLTE0NDQsNyArMTQ3OCw3IEBAIENvcHlB dHRyaWJ1dGVPdXRUZXh0KENvcHlUb1N0YXRlIGNzdGF0ZSwgY29uc3QgY2hhciAqc3RyaW5nKQog CSAqIGl0J3Mgd29ydGggbWFraW5nIHR3byBjb3BpZXMgb2YgaXQgdG8gZ2V0IHRoZSBJU19ISUdI QklUX1NFVCgpIHRlc3Qgb3V0CiAJICogb2YgdGhlIG5vcm1hbCBzYWZlLWVuY29kaW5nIHBhdGgu CiAJICovCi0JaWYgKGNzdGF0ZS0+ZW5jb2RpbmdfZW1iZWRzX2FzY2lpKQorCWlmIChlbmNvZGlu Z19lbWJlZHNfYXNjaWkpCiAJewogCQlzdGFydCA9IHB0cjsKIAkJd2hpbGUgKChjID0gKnB0cikg IT0gJ1wwJykKQEAgLTE0ODcsMTkgKzE1MjEsMTkgQEAgQ29weUF0dHJpYnV0ZU91dFRleHQoQ29w eVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpzdHJpbmcpCiAJCQkJCQljb250aW51ZTsJLyog ZmFsbCB0byBlbmQgb2YgbG9vcCAqLwogCQkJCX0KIAkJCQkvKiBpZiB3ZSBnZXQgaGVyZSwgd2Ug bmVlZCB0byBjb252ZXJ0IHRoZSBjb250cm9sIGNoYXIgKi8KLQkJCQlEVU1QU09GQVIoKTsKLQkJ CQlDb3B5U2VuZENoYXIoY3N0YXRlLCAnXFwnKTsKLQkJCQlDb3B5U2VuZENoYXIoY3N0YXRlLCBj KTsKKwkJCQlEVU1QU09GQVJfVE9fQlVGKCk7CisJCQkJQ29weVNlbmRDaGFyQnVmKGJ1ZiwgJ1xc Jyk7CisJCQkJQ29weVNlbmRDaGFyQnVmKGJ1ZiwgYyk7CiAJCQkJc3RhcnQgPSArK3B0cjsJLyog ZG8gbm90IGluY2x1ZGUgY2hhciBpbiBuZXh0IHJ1biAqLwogCQkJfQogCQkJZWxzZSBpZiAoYyA9 PSAnXFwnIHx8IGMgPT0gZGVsaW1jKQogCQkJewotCQkJCURVTVBTT0ZBUigpOwotCQkJCUNvcHlT ZW5kQ2hhcihjc3RhdGUsICdcXCcpOworCQkJCURVTVBTT0ZBUl9UT19CVUYoKTsKKwkJCQlDb3B5 U2VuZENoYXJCdWYoYnVmLCAnXFwnKTsKIAkJCQlzdGFydCA9IHB0cisrOwkvKiB3ZSBpbmNsdWRl IGNoYXIgaW4gbmV4dCBydW4gKi8KIAkJCX0KIAkJCWVsc2UgaWYgKElTX0hJR0hCSVRfU0VUKGMp KQotCQkJCXB0ciArPSBwZ19lbmNvZGluZ19tYmxlbihjc3RhdGUtPmZpbGVfZW5jb2RpbmcsIHB0 cik7CisJCQkJcHRyICs9IHBnX2VuY29kaW5nX21ibGVuKGZpbGVfZW5jb2RpbmcsIHB0cik7CiAJ CQllbHNlCiAJCQkJcHRyKys7CiAJCX0KQEAgLTE1NDcsMTUgKzE1ODEsMTUgQEAgQ29weUF0dHJp YnV0ZU91dFRleHQoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpzdHJpbmcpCiAJCQkJ CQljb250aW51ZTsJLyogZmFsbCB0byBlbmQgb2YgbG9vcCAqLwogCQkJCX0KIAkJCQkvKiBpZiB3 ZSBnZXQgaGVyZSwgd2UgbmVlZCB0byBjb252ZXJ0IHRoZSBjb250cm9sIGNoYXIgKi8KLQkJCQlE VU1QU09GQVIoKTsKLQkJCQlDb3B5U2VuZENoYXIoY3N0YXRlLCAnXFwnKTsKLQkJCQlDb3B5U2Vu ZENoYXIoY3N0YXRlLCBjKTsKKwkJCQlEVU1QU09GQVJfVE9fQlVGKCk7CisJCQkJQ29weVNlbmRD aGFyQnVmKGJ1ZiwgJ1xcJyk7CisJCQkJQ29weVNlbmRDaGFyQnVmKGJ1ZiwgYyk7CiAJCQkJc3Rh cnQgPSArK3B0cjsJLyogZG8gbm90IGluY2x1ZGUgY2hhciBpbiBuZXh0IHJ1biAqLwogCQkJfQog CQkJZWxzZSBpZiAoYyA9PSAnXFwnIHx8IGMgPT0gZGVsaW1jKQogCQkJewotCQkJCURVTVBTT0ZB UigpOwotCQkJCUNvcHlTZW5kQ2hhcihjc3RhdGUsICdcXCcpOworCQkJCURVTVBTT0ZBUl9UT19C VUYoKTsKKwkJCQlDb3B5U2VuZENoYXJCdWYoYnVmLCAnXFwnKTsKIAkJCQlzdGFydCA9IHB0cisr OwkvKiB3ZSBpbmNsdWRlIGNoYXIgaW4gbmV4dCBydW4gKi8KIAkJCX0KIAkJCWVsc2UKQEAgLTE1 NjMsNyArMTU5NywxOCBAQCBDb3B5QXR0cmlidXRlT3V0VGV4dChDb3B5VG9TdGF0ZSBjc3RhdGUs IGNvbnN0IGNoYXIgKnN0cmluZykKIAkJfQogCX0KIAotCURVTVBTT0ZBUigpOworCURVTVBTT0ZB Ul9UT19CVUYoKTsKK30KKworc3RhdGljIHZvaWQKK0NvcHlBdHRyaWJ1dGVPdXRUZXh0KENvcHlU b1N0YXRlIGNzdGF0ZSwgY29uc3QgY2hhciAqc3RyaW5nKQoreworCUNvcHlFc2NhcGVUZXh0KGNz dGF0ZS0+ZmVfbXNnYnVmLAorCQkJCSAgIHN0cmluZywKKwkJCQkgICBjc3RhdGUtPm9wdHMuZGVs aW1bMF0sCisJCQkJICAgY3N0YXRlLT5maWxlX2VuY29kaW5nLAorCQkJCSAgIGNzdGF0ZS0+bmVl ZF90cmFuc2NvZGluZywKKwkJCQkgICBjc3RhdGUtPmVuY29kaW5nX2VtYmVkc19hc2NpaSk7CiB9 CiAKIC8qCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9jb21tYW5kcy9jb3B5LmggYi9zcmMvaW5j bHVkZS9jb21tYW5kcy9jb3B5LmgKaW5kZXggYWJlY2ZlNTEwOTguLjI3ZWU1OGM3ZmRiIDEwMDY0 NAotLS0gYS9zcmMvaW5jbHVkZS9jb21tYW5kcy9jb3B5LmgKKysrIGIvc3JjL2luY2x1ZGUvY29t bWFuZHMvY29weS5oCkBAIC0xMzYsNSArMTM2LDExIEBAIGV4dGVybiB2b2lkIEVuZENvcHlUbyhD b3B5VG9TdGF0ZSBjc3RhdGUpOwogZXh0ZXJuIHVpbnQ2NCBEb0NvcHlUbyhDb3B5VG9TdGF0ZSBj c3RhdGUpOwogZXh0ZXJuIExpc3QgKkNvcHlHZXRBdHRudW1zKFR1cGxlRGVzYyB0dXBEZXNjLCBS ZWxhdGlvbiByZWwsCiAJCQkJCQkJTGlzdCAqYXR0bmFtZWxpc3QpOworZXh0ZXJuIHZvaWQgQ29w eUVzY2FwZVRleHQoU3RyaW5nSW5mbyBidWYsCisJCQkJCQkgICBjb25zdCBjaGFyICpzdHJpbmcs CisJCQkJCQkgICBjaGFyIGRlbGltYywKKwkJCQkJCSAgIGludCBmaWxlX2VuY29kaW5nLAorCQkJ CQkJICAgYm9vbCBuZWVkX3RyYW5zY29kaW5nLAorCQkJCQkJICAgYm9vbCBlbmNvZGluZ19lbWJl ZHNfYXNjaWkpOwogCiAjZW5kaWYJCQkJCQkJLyogQ09QWV9IICovCi0tIAoyLjUwLjEgKEFwcGxl IEdpdC0xNTUpCgo= --0914b003dd872f83283d693efb1b4087ca3ae32bc3bf0fc70f456a8dd072 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=v15-0002-postgres_fdw-Use-COPY-as-remote-SQL-when-possibl.patch Content-Type: text/plain; charset=utf-8; name=v15-0002-postgres_fdw-Use-COPY-as-remote-SQL-when-possibl.patch RnJvbSBhNGNlMjM1NDQyZDM4ZWJmNzUxYzQ3MTFiZGQ0YjY4NWRiMGMzNWVmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXRoZXVzIEFsY2FudGFyYSA8bXRocy5kZXZAcG0ubWU+CkRh dGU6IFdlZCwgMjggSmFuIDIwMjYgMTk6NTU6NDggLTAzMDAKU3ViamVjdDogW1BBVENIIHYxNSAy LzJdIHBvc3RncmVzX2ZkdzogVXNlIENPUFkgYXMgcmVtb3RlIFNRTCB3aGVuIHBvc3NpYmxlCgpX aGVuIGEgdXNlciBleGVjdXRlcyBDT1BZIG9uIGEgZm9yZWlnbiB0YWJsZSwgcG9zdGdyZXNfZmR3 IHByZXZpb3VzbHkKc2VudCBJTlNFUlQgc3RhdGVtZW50cyB0byB0aGUgZm9yZWlnbiBzZXJ2ZXIu IFRoaXMgY29tbWl0IGVuYWJsZXMgdXNpbmcKdGhlIENPUFkgcHJvdG9jb2wgaW5zdGVhZCwgd2hp Y2ggaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgZm9yIGJ1bGsgaW5zZXJ0cy4KClRoZSBDT1BZIHBy b3RvY29sIGlzIHVzZWQgd2hlbiBjb3B5aW5nIGRhdGEgdG8gYSBmb3JlaWduIHRhYmxlIHRoYXQg aGFzCm5vIHRyaWdnZXJzLiBUcmlnZ2VycyBhcmUgZXhjbHVkZWQgYmVjYXVzZSB0aGV5IG1pZ2h0 IG1vZGlmeSB0aGUgaW5zZXJ0ZWQKcm93LCBhbmQgc2luY2UgQ09QWSBkb2VzIG5vdCBzdXBwb3J0 IGEgUkVUVVJOSU5HIGNsYXVzZSwgd2UgY2Fubm90CnN5bmNocm9uaXplIHRoZSBsb2NhbCBUdXBs ZVRhYmxlU2xvdCB3aXRoIHRob3NlIGNoYW5nZXMgZm9yIHVzZSBpbiBsb2NhbApBRlRFUiB0cmln Z2Vycy4KClRoaXMgdXNlcyB0aGUgQ29weUVzY2FwZVRleHQoKSBmdW5jdGlvbiBpbnRyb2R1Y2Vk IG9uIDA1MWI1NmI0Zjk1IHRvCnByb3Blcmx5IGVzY2FwZSB0ZXh0IHZhbHVlcyBmb3IgdGhlIENP UFkgcHJvdG9jb2wuCgpBdXRob3I6IE1hdGhldXMgQWxjYW50YXJhIDxtdGhzLmRldkBwbS5tZT4K UmV2aWV3ZWQtQnk6IFRvbWFzIFZvbmRyYSA8dG9tYXNAdm9uZHJhLm1lPgpSZXZpZXdlZC1CeTog SmFrdWIgV2FydGFrIDxqYWt1Yi53YXJ0YWtAZW50ZXJwcmlzZWRiLmNvbT4KUmV2aWV3ZWQtQnk6 IGppYW4gaGUgPGppYW4udW5pdmVyc2FsaXR5QGdtYWlsLmNvbT4KUmV2aWV3ZWQtQnk6IERld2Vp IERhaSA8ZGFpZGV3ZWkxOTcwQDE2My5jb20+ClJldmlld2VkLUJ5OiBNYXNhaGlrbyBTYXdhZGEg PHNhd2FkYS5tc2hrQGdtYWlsLmNvbT4KCkRpc2N1c3Npb246IGh0dHBzOi8vd3d3LnBvc3RncmVz cWwub3JnL21lc3NhZ2UtaWQvZmxhdC9ERElaSjIxN09VREsuMlI1V0U0T0dMNVBUWSU0MGdtYWls LmNvbQotLS0KIGNvbnRyaWIvcG9zdGdyZXNfZmR3L2RlcGFyc2UuYyAgICAgICAgICAgICAgICB8 ICA1NiArKysrKwogLi4uL3Bvc3RncmVzX2Zkdy9leHBlY3RlZC9wb3N0Z3Jlc19mZHcub3V0ICAg IHwgIDc1ICsrKysrKy0KIGNvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jICAgICAg ICAgICB8IDIwMiArKysrKysrKysrKysrKysrKy0KIGNvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3Rn cmVzX2Zkdy5oICAgICAgICAgICB8ICAgMSArCiBjb250cmliL3Bvc3RncmVzX2Zkdy9zcWwvcG9z dGdyZXNfZmR3LnNxbCAgICAgfCAgODIgKysrKysrKwogNSBmaWxlcyBjaGFuZ2VkLCA0MDcgaW5z ZXJ0aW9ucygrKSwgOSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9jb250cmliL3Bvc3RncmVz X2Zkdy9kZXBhcnNlLmMgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9kZXBhcnNlLmMKaW5kZXggMmRj YzZjOGFmMWIuLmIzNDc5MmU3ZGMxIDEwMDY0NAotLS0gYS9jb250cmliL3Bvc3RncmVzX2Zkdy9k ZXBhcnNlLmMKKysrIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvZGVwYXJzZS5jCkBAIC0yMTc3LDYg KzIxNzcsNjIgQEAgZGVwYXJzZUluc2VydFNxbChTdHJpbmdJbmZvIGJ1ZiwgUmFuZ2VUYmxFbnRy eSAqcnRlLAogCQkJCQkJIHdpdGhDaGVja09wdGlvbkxpc3QsIHJldHVybmluZ0xpc3QsIHJldHJp ZXZlZF9hdHRycyk7CiB9CiAKKy8qCisgKiAgQnVpbGQgYSBDT1BZIEZST00gU1RESU4gc3RhdGVt ZW50IHVzaW5nIHRoZSBURVhUIGZvcm1hdAorICovCit2b2lkCitkZXBhcnNlQ29weVNxbChTdHJp bmdJbmZvIGJ1ZiwgUmVsYXRpb24gcmVsLCBMaXN0ICp0YXJnZXRfYXR0cnMpCit7CisJT2lkCQkJ cmVsaWQgPSBSZWxhdGlvbkdldFJlbGlkKHJlbCk7CisJVHVwbGVEZXNjCXR1cGRlc2MgPSBSZWxh dGlvbkdldERlc2NyKHJlbCk7CisJYm9vbAkJZmlyc3QgPSB0cnVlOworCWludAkJCW5hdHRycyA9 IGxpc3RfbGVuZ3RoKHRhcmdldF9hdHRycyk7CisKKwlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIkNP UFkgIik7CisJZGVwYXJzZVJlbGF0aW9uKGJ1ZiwgcmVsKTsKKwlpZiAobmF0dHJzID4gMCkKKwkJ YXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnKCcpOworCisJZm9yZWFjaF9pbnQoYXR0bnVtLCB0 YXJnZXRfYXR0cnMpCisJeworCQlGb3JtX3BnX2F0dHJpYnV0ZSBhdHRyID0gVHVwbGVEZXNjQXR0 cih0dXBkZXNjLCBhdHRudW0gLSAxKTsKKwkJY2hhcgkgICAqY29sbmFtZTsKKwkJTGlzdAkgICAq b3B0aW9uczsKKwkJTGlzdENlbGwgICAqbGM7CisKKwkJaWYgKGF0dHItPmF0dGdlbmVyYXRlZCkK KwkJCWNvbnRpbnVlOworCisJCWlmICghZmlyc3QpCisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5n KGJ1ZiwgIiwgIik7CisKKwkJZmlyc3QgPSBmYWxzZTsKKworCQkvKiBVc2UgYXR0cmlidXRlIG5h bWUgb3IgY29sdW1uX25hbWUgb3B0aW9uLiAqLworCQljb2xuYW1lID0gTmFtZVN0cihhdHRyLT5h dHRuYW1lKTsKKwkJb3B0aW9ucyA9IEdldEZvcmVpZ25Db2x1bW5PcHRpb25zKHJlbGlkLCBhdHRu dW0pOworCQlmb3JlYWNoKGxjLCBvcHRpb25zKQorCQl7CisJCQlEZWZFbGVtICAgICpkZWYgPSAo RGVmRWxlbSAqKSBsZmlyc3QobGMpOworCisJCQlpZiAoc3RyY21wKGRlZi0+ZGVmbmFtZSwgImNv bHVtbl9uYW1lIikgPT0gMCkKKwkJCXsKKwkJCQljb2xuYW1lID0gZGVmR2V0U3RyaW5nKGRlZik7 CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1Ziwg cXVvdGVfaWRlbnRpZmllcihjb2xuYW1lKSk7CisJfQorCWlmIChuYXR0cnMgPiAwKQorCQlhcHBl bmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIikgRlJPTSBTVERJTiIpOworCWVsc2UKKwkJYXBwZW5k U3RyaW5nSW5mb1N0cmluZyhidWYsICIgRlJPTSBTVERJTiIpOworCisJYXBwZW5kU3RyaW5nSW5m b1N0cmluZyhidWYsICIgKEZPUk1BVCBURVhUKSIpOworfQorCisKIC8qCiAgKiByZWJ1aWxkIHJl bW90ZSBJTlNFUlQgc3RhdGVtZW50CiAgKgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wb3N0Z3Jlc19m ZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91dCBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2V4cGVj dGVkL3Bvc3RncmVzX2Zkdy5vdXQKaW5kZXggZTkwMjg5ZTRhYjEuLmFlNjU1NTQ1MDc0IDEwMDY0 NAotLS0gYS9jb250cmliL3Bvc3RncmVzX2Zkdy9leHBlY3RlZC9wb3N0Z3Jlc19mZHcub3V0Cisr KyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVzX2Zkdy5vdXQKQEAgLTc2 NTQsNiArNzY1NCwyOCBAQCBzZWxlY3QgKiBmcm9tIGdyZW0xOwogKDIgcm93cykKIAogZGVsZXRl IGZyb20gZ3JlbTE7CistLSB0ZXN0IHRoYXQgZmR3IGFsc28gdXNlIENPUFkgRlJPTSBhcyBhIHJl bW90ZSBzcWwKK3NldCBjbGllbnRfbWluX21lc3NhZ2VzIHRvICdsb2cnOworY3JlYXRlIGZ1bmN0 aW9uIGluc2VydF9vcl9jb3B5KCkgcmV0dXJucyB0cmlnZ2VyIGFzICQkCitkZWNsYXJlIHF1ZXJ5 IHRleHQ7CitiZWdpbgorICAgIHF1ZXJ5IDo9IGN1cnJlbnRfcXVlcnkoKTsKKyAgICByYWlzZSBu b3RpY2UgJyUnLCBxdWVyeTsKK3JldHVybiBuZXc7CitlbmQ7CiskJCBsYW5ndWFnZSBwbHBnc3Fs OworQ1JFQVRFIFRSSUdHRVIgdHJpZ19yb3dfYmVmb3JlCitCRUZPUkUgSU5TRVJUIE9SIFVQREFU RSBPUiBERUxFVEUgT04gZ2xvYzEKK0ZPUiBFQUNIIFJPVyBFWEVDVVRFIFBST0NFRFVSRSBpbnNl cnRfb3JfY29weSgpOworY29weSBncmVtMSBmcm9tIHN0ZGluOworTE9HOiAgcmVjZWl2ZWQgbWVz c2FnZSB2aWEgcmVtb3RlIGNvbm5lY3Rpb246IE5PVElDRTogIENPUFkgcHVibGljLmdsb2MxKGEp IEZST00gU1RESU4gKEZPUk1BVCBURVhUKQorZHJvcCB0cmlnZ2VyIHRyaWdfcm93X2JlZm9yZSBv biBnbG9jMTsKK3Jlc2V0IGNsaWVudF9taW5fbWVzc2FnZXM7CistLSB0ZXN0IHRoYXQgY29weSBk b2VzIG5vdCBmYWlsIHdpdGggY29sdW1uX25hbWUgYWxpYXMKK2NyZWF0ZSB0YWJsZSBnbG9jMih4 eHggaW50KTsKK2NyZWF0ZSBmb3JlaWduIHRhYmxlIGdyZW0yKGEgaW50KSBzZXJ2ZXIgbG9vcGJh Y2sgb3B0aW9ucyh0YWJsZV9uYW1lICdnbG9jMicpOworYWx0ZXIgZm9yZWlnbiB0YWJsZSBncmVt MiBhbHRlciBjb2x1bW4gYSBvcHRpb25zIChjb2x1bW5fbmFtZSAneHh4Jyk7Citjb3B5IGdyZW0y IGZyb20gc3RkaW47CiAtLSB0ZXN0IGJhdGNoIGluc2VydAogYWx0ZXIgc2VydmVyIGxvb3BiYWNr IG9wdGlvbnMgKGFkZCBiYXRjaF9zaXplICcxMCcpOwogZXhwbGFpbiAodmVyYm9zZSwgY29zdHMg b2ZmKQpAQCAtNzY3MSwxNiArNzY5MywxOCBAQCBpbnNlcnQgaW50byBncmVtMSAoYSkgdmFsdWVz ICgxKSwgKDIpOwogc2VsZWN0ICogZnJvbSBnbG9jMTsKICBhIHwgYiB8IGMgCiAtLS0rLS0tKy0t LQorIDMgfCA2IHwgIAogIDEgfCAyIHwgIAogIDIgfCA0IHwgIAotKDIgcm93cykKKygzIHJvd3Mp CiAKIHNlbGVjdCAqIGZyb20gZ3JlbTE7CiAgYSB8IGIgfCBjIAogLS0tKy0tLSstLS0KKyAzIHwg NiB8IDkKICAxIHwgMiB8IDMKICAyIHwgNCB8IDYKLSgyIHJvd3MpCisoMyByb3dzKQogCiBkZWxl dGUgZnJvbSBncmVtMTsKIC0tIGJhdGNoIGluc2VydCB3aXRoIGZvcmVpZ24gcGFydGl0aW9ucy4K QEAgLTc3MDUsNiArNzcyOSwxMiBAQCBzZWxlY3QgY291bnQoKikgZnJvbSB0YWJfYmF0Y2hfc2hh cmRlZDsKIGRyb3AgdGFibGUgdGFiX2JhdGNoX2xvY2FsOwogZHJvcCB0YWJsZSB0YWJfYmF0Y2hf c2hhcmRlZDsKIGRyb3AgdGFibGUgdGFiX2JhdGNoX3NoYXJkZWRfcDFfcmVtb3RlOworLS0gdGVz dCBiYXRjaCBpbnNlcnQgdXNpbmcgY29weQorc2V0IGNsaWVudF9taW5fbWVzc2FnZXMgdG8gJ2Rl YnVnMSc7Citjb3B5IGdyZW0xIGZyb20gc3RkaW47CitERUJVRzogIGZvcmVpZ24gbW9kaWZ5IHdp dGggQ09QWSBiYXRjaF9zaXplOiAxMAorREVCVUc6ICBmb3JlaWduIG1vZGlmeSB3aXRoIENPUFkg YmF0Y2hfc2l6ZTogMTAKK3Jlc2V0IGNsaWVudF9taW5fbWVzc2FnZXM7CiBhbHRlciBzZXJ2ZXIg bG9vcGJhY2sgb3B0aW9ucyAoZHJvcCBiYXRjaF9zaXplKTsKIC0tID09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC0tIHRl c3QgbG9jYWwgdHJpZ2dlcnMKQEAgLTk1OTUsNyArOTYyNSw4IEBAIGNvcHkgcmVtMiBmcm9tIHN0 ZGluOwogY29weSByZW0yIGZyb20gc3RkaW47IC0tIEVSUk9SCiBFUlJPUjogIG5ldyByb3cgZm9y IHJlbGF0aW9uICJsb2MyIiB2aW9sYXRlcyBjaGVjayBjb25zdHJhaW50ICJsb2MyX2YxcG9zaXRp dmUiCiBERVRBSUw6ICBGYWlsaW5nIHJvdyBjb250YWlucyAoLTEsIHh5enp5KS4KLUNPTlRFWFQ6 ICByZW1vdGUgU1FMIGNvbW1hbmQ6IElOU0VSVCBJTlRPIHB1YmxpYy5sb2MyKGYxLCBmMikgVkFM VUVTICgkMSwgJDIpCitDT05URVhUOiAgQ09QWSBsb2MyLCBsaW5lIDE6ICItMQl4eXp6eSIKK3Jl bW90ZSBTUUwgY29tbWFuZDogQ09QWSBwdWJsaWMubG9jMihmMSwgZjIpIEZST00gU1RESU4gKEZP Uk1BVCBURVhUKQogQ09QWSByZW0yLCBsaW5lIDE6ICItMQl4eXp6eSIKIHNlbGVjdCAqIGZyb20g cmVtMjsKICBmMSB8IGYyICAKQEAgLTk3NTIsNyArOTc4Myw4IEBAIGNvcHkgcmVtMiBmcm9tIHN0 ZGluOwogY29weSByZW0yIGZyb20gc3RkaW47IC0tIEVSUk9SCiBFUlJPUjogIG5ldyByb3cgZm9y IHJlbGF0aW9uICJsb2MyIiB2aW9sYXRlcyBjaGVjayBjb25zdHJhaW50ICJsb2MyX2YxcG9zaXRp dmUiCiBERVRBSUw6ICBGYWlsaW5nIHJvdyBjb250YWlucyAoLTEsIHh5enp5KS4KLUNPTlRFWFQ6 ICByZW1vdGUgU1FMIGNvbW1hbmQ6IElOU0VSVCBJTlRPIHB1YmxpYy5sb2MyKGYxLCBmMikgVkFM VUVTICgkMSwgJDIpCitDT05URVhUOiAgQ09QWSBsb2MyLCBsaW5lIDE6ICItMQl4eXp6eSIKK3Jl bW90ZSBTUUwgY29tbWFuZDogQ09QWSBwdWJsaWMubG9jMihmMSwgZjIpIEZST00gU1RESU4gKEZP Uk1BVCBURVhUKQogQ09QWSByZW0yCiBzZWxlY3QgKiBmcm9tIHJlbTI7CiAgZjEgfCBmMiAgCkBA IC05NzkxLDYgKzk4MjMsNDEgQEAgc2VsZWN0ICogZnJvbSByZW0yOwogCiBkcm9wIHRyaWdnZXIg dHJpZ19udWxsIG9uIGxvYzI7CiBkZWxldGUgZnJvbSByZW0yOworLS0gVGVzdCBDT1BZIEZST00g d2l0aCBjb2x1bW4gbGlzdCBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzCitjb3B5IHJlbTIgKGYxLCBm MikgZnJvbSBzdGRpbjsKK3NlbGVjdCAqIGZyb20gcmVtMjsKKyBmMSB8ICBmMiAgIAorLS0tLSst LS0tLS0tCisgIDEgfCBoZWxsbysKKyAgICB8IHdvcmxkCisoMSByb3cpCisKK2RlbGV0ZSBmcm9t IHJlbTI7CistLSBUZXN0IENPUFkgd2l0aCBOVUxMIGFuZCBzcGVjaWFsIGNoYXJhY3RlcnMKK2Nv cHkgcmVtMiBmcm9tIHN0ZGluOworc2VsZWN0ICogZnJvbSByZW0yOworIGYxIHwgZjIgIAorLS0t LSstLS0tLQorICAxIHwgCisgICAgfCBiYXIKKyAgMyB8IGEiYgorKDMgcm93cykKKworZGVsZXRl IGZyb20gcmVtMjsKKy0tIFRlc3QgdGhhdCBmbG9hdCBudW1iZXJzIGRvIG5vdCBsb29zZSBwcmVj aXNpb24gd2hlbiBzZW5kaW5nIHRvIHRoZSBmb3JlaWduCistLSBzZXJ2ZXIKK2NyZWF0ZSB0YWJs ZSBmKGEgZmxvYXQpOworY3JlYXRlIGZvcmVpZ24gdGFibGUgZl9mZHcoYSBmbG9hdCkgc2VydmVy IGxvb3BiYWNrIG9wdGlvbnModGFibGVfbmFtZSAnZicpOworc2V0IGV4dHJhX2Zsb2F0X2RpZ2l0 cyA9IDA7Citjb3B5IGZfZmR3IGZyb20gc3RkaW47CityZXNldCBleHRyYV9mbG9hdF9kaWdpdHM7 CitzZWxlY3QgKiBmcm9tIGY7CisgICAgICAgICBhICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyAxLjAwMDAwMDAwMDAwMDAwMDIKKygxIHJvdykKKworZHJvcCB0YWJsZSBmOwogLS0g Q2hlY2sgd2l0aCB6ZXJvLWNvbHVtbiBmb3JlaWduIHRhYmxlOyBiYXRjaCBpbnNlcnQgd2lsbCBi ZSBkaXNhYmxlZAogYWx0ZXIgdGFibGUgbG9jMiBkcm9wIGNvbHVtbiBmMTsKIGFsdGVyIHRhYmxl IGxvYzIgZHJvcCBjb2x1bW4gZjI7CmRpZmYgLS1naXQgYS9jb250cmliL3Bvc3RncmVzX2Zkdy9w b3N0Z3Jlc19mZHcuYyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jCmluZGV4 IDBhNTg5ZjhkYjc0Li43YmRlNDBmZmU5MiAxMDA2NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19m ZHcvcG9zdGdyZXNfZmR3LmMKKysrIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3 LmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlICJhY2Nlc3Mvc3lzYXR0ci5oIgogI2luY2x1 ZGUgImFjY2Vzcy90YWJsZS5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfb3BmYW1pbHkuaCIKKyNp bmNsdWRlICJjb21tYW5kcy9jb3B5LmgiCiAjaW5jbHVkZSAiY29tbWFuZHMvZGVmcmVtLmgiCiAj aW5jbHVkZSAiY29tbWFuZHMvZXhwbGFpbl9mb3JtYXQuaCIKICNpbmNsdWRlICJjb21tYW5kcy9l eHBsYWluX3N0YXRlLmgiCkBAIC0yNyw2ICsyOCw3IEBACiAjaW5jbHVkZSAiZXhlY3V0b3Ivc3Bp LmgiCiAjaW5jbHVkZSAiZm9yZWlnbi9mZHdhcGkuaCIKICNpbmNsdWRlICJmdW5jYXBpLmgiCisj aW5jbHVkZSAibWIvcGdfd2NoYXIuaCIKICNpbmNsdWRlICJtaXNjYWRtaW4uaCIKICNpbmNsdWRl ICJub2Rlcy9tYWtlZnVuY3MuaCIKICNpbmNsdWRlICJub2Rlcy9ub2RlRnVuY3MuaCIKQEAgLTY3 LDYgKzY5LDkgQEAgUEdfTU9EVUxFX01BR0lDX0VYVCgKIC8qIElmIG5vIHJlbW90ZSBlc3RpbWF0 ZXMsIGFzc3VtZSBhIHNvcnQgY29zdHMgMjAlIGV4dHJhICovCiAjZGVmaW5lIERFRkFVTFRfRkRX X1NPUlRfTVVMVElQTElFUiAxLjIKIAorLyogQnVmZmVyIHNpemUgdG8gc2VuZCBDT1BZIElOIGRh dGEqLworI2RlZmluZSBDT1BZQlVGU0laIDgxOTIKKwogLyoKICAqIEluZGV4ZXMgb2YgRkRXLXBy aXZhdGUgaW5mb3JtYXRpb24gc3RvcmVkIGluIGZkd19wcml2YXRlIGxpc3RzLgogICoKQEAgLTIw Miw2ICsyMDcsOCBAQCB0eXBlZGVmIHN0cnVjdCBQZ0Zkd01vZGlmeVN0YXRlCiAJYm9vbAkJaGFz X3JldHVybmluZzsJLyogaXMgdGhlcmUgYSBSRVRVUk5JTkcgY2xhdXNlPyAqLwogCUxpc3QJICAg KnJldHJpZXZlZF9hdHRyczsJLyogYXR0ciBudW1iZXJzIHJldHJpZXZlZCBieSBSRVRVUk5JTkcg Ki8KIAorCWJvb2wJCXVzZV9jb3B5OyAvKiB1c2UgQ09QWSBwcm90b2NvbCBmb3IgRXhlY0ZvcmVp Z25JbnNlcnQ/ICovCisKIAkvKiBpbmZvIGFib3V0IHBhcmFtZXRlcnMgZm9yIHByZXBhcmVkIHN0 YXRlbWVudCAqLwogCUF0dHJOdW1iZXIJY3RpZEF0dG5vOwkJLyogYXR0bnVtIG9mIGlucHV0IHJl c2p1bmsgY3RpZCBjb2x1bW4gKi8KIAlpbnQJCQlwX251bXM7CQkJLyogbnVtYmVyIG9mIHBhcmFt ZXRlcnMgdG8gdHJhbnNtaXQgKi8KQEAgLTc2MCw2ICs3NjcsMTMgQEAgc3RhdGljIHZvaWQgbWVy Z2VfZmR3X29wdGlvbnMoUGdGZHdSZWxhdGlvbkluZm8gKmZwaW5mbywKIAkJCQkJCQkgIGNvbnN0 IFBnRmR3UmVsYXRpb25JbmZvICpmcGluZm9fbywKIAkJCQkJCQkgIGNvbnN0IFBnRmR3UmVsYXRp b25JbmZvICpmcGluZm9faSk7CiBzdGF0aWMgaW50CWdldF9iYXRjaF9zaXplX29wdGlvbihSZWxh dGlvbiByZWwpOworc3RhdGljIFR1cGxlVGFibGVTbG90ICoqZXhlY3V0ZV9mb3JlaWduX21vZGlm eV91c2luZ19jb3B5KFBnRmR3TW9kaWZ5U3RhdGUgKmZtc3RhdGUsCisJCQkJCQkJCQkJCQkJCSAg VHVwbGVUYWJsZVNsb3QgKipzbG90cywKKwkJCQkJCQkJCQkJCQkJICBpbnQgKm51bVNsb3RzKTsK K3N0YXRpYyB2b2lkIGNvbnZlcnRfc2xvdF90b19jb3B5X3RleHQoU3RyaW5nSW5mbyBidWYsCisJ CQkJCQkJCQkgIFBnRmR3TW9kaWZ5U3RhdGUgKmZtc3RhdGUsCisJCQkJCQkJCQkgIFR1cGxlVGFi bGVTbG90ICpzbG90KTsKK3N0YXRpYyB2b2lkIGFwcGVuZFN0cmluZ0luZm9UZXh0KFN0cmluZ0lu Zm8gYnVmLCBjb25zdCBjaGFyICpzdHJpbmcpOwogCiAKIC8qCkBAIC0yMzgxLDExICsyMzk1LDEy IEBAIHBvc3RncmVzQmVnaW5Gb3JlaWduSW5zZXJ0KE1vZGlmeVRhYmxlU3RhdGUgKm10c3RhdGUs CiAJUmFuZ2VUYmxFbnRyeSAqcnRlOwogCVR1cGxlRGVzYwl0dXBkZXNjID0gUmVsYXRpb25HZXRE ZXNjcihyZWwpOwogCWludAkJCWF0dG51bTsKLQlpbnQJCQl2YWx1ZXNfZW5kX2xlbjsKKwlpbnQJ CQl2YWx1ZXNfZW5kX2xlbiA9IDA7CiAJU3RyaW5nSW5mb0RhdGEgc3FsOwogCUxpc3QJICAgKnRh cmdldEF0dHJzID0gTklMOwogCUxpc3QJICAgKnJldHJpZXZlZF9hdHRycyA9IE5JTDsKIAlib29s CQlkb05vdGhpbmcgPSBmYWxzZTsKKwlib29sCQl1c2VDb3B5ID0gZmFsc2U7CiAKIAkvKgogCSAq IElmIHRoZSBmb3JlaWduIHRhYmxlIHdlIGFyZSBhYm91dCB0byBpbnNlcnQgcm91dGVkIHJvd3Mg aW50byBpcyBhbHNvIGFuCkBAIC0yNDYzLDExICsyNDc4LDM4IEBAIHBvc3RncmVzQmVnaW5Gb3Jl aWduSW5zZXJ0KE1vZGlmeVRhYmxlU3RhdGUgKm10c3RhdGUsCiAJCXJ0ZSA9IGV4ZWNfcnRfZmV0 Y2gocmVzdWx0UmVsYXRpb24sIGVzdGF0ZSk7CiAJfQogCisJLyoKKwkgKiBXZSBjYW4gdXNlIENP UFkgZm9yIHJlbW90ZSBpbnNlcnRzIG9ubHkgaWYgYWxsIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u cworCSAqIGFyZSBtZXQ6CisJICoKKwkgKiBEaXJlY3QgRXhlY3V0aW9uOiBUaGUgY29tbWFuZCBp cyBhIENPUFkgRlJPTSBvbiB0aGUgZm9yZWlnbiB0YWJsZQorCSAqIGl0c2VsZiwgbm90IHBhcnQg b2YgYSBwYXJ0aXRpb25lZCB0YWJsZSdzIHR1cGxlIHJvdXRpbmcuCisJICoKKwkgKiBObyBMb2Nh bCBBRlRFUiBUcmlnZ2VyczogVGhlcmUgYXJlIG5vIEFGVEVSIFJPVyB0cmlnZ2VycyBkZWZpbmVk CisJICogbG9jYWxseSBvbiB0aGUgZm9yZWlnbiB0YWJsZS4KKwkgKgorCSAqIFJlbW90ZSB0cmln Z2VycyBtaWdodCBtb2RpZnkgdGhlIGluc2VydGVkIHJvdy4gQmVjYXVzZSB0aGUgQ09QWQorCSAq IHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgYSBSRVRVUk5JTkcgY2xhdXNlLCB3ZSBjYW5ub3Qg cmV0cmlldmUgdGhvc2UKKwkgKiBjaGFuZ2VzIHRvIHN5bmNocm9uaXplIHRoZSBsb2NhbCBUdXBs ZVRhYmxlU2xvdCByZXF1aXJlZCBieSBsb2NhbCBBRlRFUgorCSAqIHRyaWdnZXJzLgorCSAqLwor CWlmIChyZXN1bHRSZWxJbmZvLT5yaV9Sb290UmVzdWx0UmVsSW5mbyA9PSBOVUxMKQorCXsKKwkJ LyogVGhlcmUgaXMgbm8gUkVUVVJOSU5HIGNsYXVzZSBvbiBDT1BZICovCisJCUFzc2VydChyZXN1 bHRSZWxJbmZvLT5yaV9yZXR1cm5pbmdMaXN0ID09IE5JTCk7CisKKwkJdXNlQ29weSA9IChyZXN1 bHRSZWxJbmZvLT5yaV9UcmlnRGVzYyA9PSBOVUxMIHx8CisJCQkJICAgIXJlc3VsdFJlbEluZm8t PnJpX1RyaWdEZXNjLT50cmlnX2luc2VydF9hZnRlcl9yb3cpOworCX0KKwogCS8qIENvbnN0cnVj dCB0aGUgU1FMIGNvbW1hbmQgc3RyaW5nLiAqLwotCWRlcGFyc2VJbnNlcnRTcWwoJnNxbCwgcnRl LCByZXN1bHRSZWxhdGlvbiwgcmVsLCB0YXJnZXRBdHRycywgZG9Ob3RoaW5nLAotCQkJCQkgcmVz dWx0UmVsSW5mby0+cmlfV2l0aENoZWNrT3B0aW9ucywKLQkJCQkJIHJlc3VsdFJlbEluZm8tPnJp X3JldHVybmluZ0xpc3QsCi0JCQkJCSAmcmV0cmlldmVkX2F0dHJzLCAmdmFsdWVzX2VuZF9sZW4p OworCWlmICh1c2VDb3B5KQorCQlkZXBhcnNlQ29weVNxbCgmc3FsLCByZWwsIHRhcmdldEF0dHJz KTsKKwllbHNlCisJCWRlcGFyc2VJbnNlcnRTcWwoJnNxbCwgcnRlLCByZXN1bHRSZWxhdGlvbiwg cmVsLCB0YXJnZXRBdHRycywgZG9Ob3RoaW5nLAorCQkJCQkJIHJlc3VsdFJlbEluZm8tPnJpX1dp dGhDaGVja09wdGlvbnMsCisJCQkJCQkgcmVzdWx0UmVsSW5mby0+cmlfcmV0dXJuaW5nTGlzdCwK KwkJCQkJCSAmcmV0cmlldmVkX2F0dHJzLCAmdmFsdWVzX2VuZF9sZW4pOwogCiAJLyogQ29uc3Ry dWN0IGFuIGV4ZWN1dGlvbiBzdGF0ZS4gKi8KIAlmbXN0YXRlID0gY3JlYXRlX2ZvcmVpZ25fbW9k aWZ5KG10c3RhdGUtPnBzLnN0YXRlLApAQCAtMjQ4MCw2ICsyNTIyLDcgQEAgcG9zdGdyZXNCZWdp bkZvcmVpZ25JbnNlcnQoTW9kaWZ5VGFibGVTdGF0ZSAqbXRzdGF0ZSwKIAkJCQkJCQkJCXZhbHVl c19lbmRfbGVuLAogCQkJCQkJCQkJcmV0cmlldmVkX2F0dHJzICE9IE5JTCwKIAkJCQkJCQkJCXJl dHJpZXZlZF9hdHRycyk7CisJZm1zdGF0ZS0+dXNlX2NvcHkgPSB1c2VDb3B5OwogCiAJLyoKIAkg KiBJZiB0aGUgZ2l2ZW4gcmVzdWx0UmVsSW5mbyBhbHJlYWR5IGhhcyBQZ0Zkd01vZGlmeVN0YXRl IHNldCwgaXQgbWVhbnMKQEAgLTQzMDksNiArNDM1Miw5IEBAIGV4ZWN1dGVfZm9yZWlnbl9tb2Rp ZnkoRVN0YXRlICplc3RhdGUsCiAJCSAgIG9wZXJhdGlvbiA9PSBDTURfVVBEQVRFIHx8CiAJCSAg IG9wZXJhdGlvbiA9PSBDTURfREVMRVRFKTsKIAorCWlmIChmbXN0YXRlLT51c2VfY29weSkKKwkJ cmV0dXJuIGV4ZWN1dGVfZm9yZWlnbl9tb2RpZnlfdXNpbmdfY29weShmbXN0YXRlLCBzbG90cywg bnVtU2xvdHMpOworCiAJLyogRmlyc3QsIHByb2Nlc3MgYSBwZW5kaW5nIGFzeW5jaHJvbm91cyBy ZXF1ZXN0LCBpZiBhbnkuICovCiAJaWYgKGZtc3RhdGUtPmNvbm5fc3RhdGUtPnBlbmRpbmdBcmVx KQogCQlwcm9jZXNzX3BlbmRpbmdfcmVxdWVzdChmbXN0YXRlLT5jb25uX3N0YXRlLT5wZW5kaW5n QXJlcSk7CkBAIC04ODM1LDMgKzg4ODEsMTQ5IEBAIGdldF9iYXRjaF9zaXplX29wdGlvbihSZWxh dGlvbiByZWwpCiAKIAlyZXR1cm4gYmF0Y2hfc2l6ZTsKIH0KKworLyoKKyAqIGV4ZWN1dGVfZm9y ZWlnbl9tb2RpZnlfdXNpbmdfY29weQorICoJCVBlcmZvcm0gZm9yZWlnbi10YWJsZSBtb2RpZmlj YXRpb24gdXNpbmcgdGhlIENPUFkgY29tbWFuZC4KKyAqLworc3RhdGljIFR1cGxlVGFibGVTbG90 ICoqCitleGVjdXRlX2ZvcmVpZ25fbW9kaWZ5X3VzaW5nX2NvcHkoUGdGZHdNb2RpZnlTdGF0ZSAq Zm1zdGF0ZSwKKwkJCQkJCQkJICBUdXBsZVRhYmxlU2xvdCAqKnNsb3RzLAorCQkJCQkJCQkgIGlu dCAqbnVtU2xvdHMpCit7CisJUEdyZXN1bHQgICAqcmVzOworCVN0cmluZ0luZm9EYXRhIGNvcHlf ZGF0YTsKKwlpbnQJCQluX3Jvd3M7CisJaW50CQkJaTsKKwlpbnQJCQluZXN0bGV2ZWw7CisKKwlB c3NlcnQoZm1zdGF0ZS0+dXNlX2NvcHkgPT0gdHJ1ZSk7CisKKwllbG9nKERFQlVHMSwgImZvcmVp Z24gbW9kaWZ5IHdpdGggQ09QWSBiYXRjaF9zaXplOiAlZCIsIGZtc3RhdGUtPmJhdGNoX3NpemUp OworCisJLyogTWFrZSBzdXJlIGFueSBjb25zdGFudHMgaW4gdGhlIHNsb3RzIGFyZSBwcmludGVk IHBvcnRhYmx5ICovCisJbmVzdGxldmVsID0gc2V0X3RyYW5zbWlzc2lvbl9tb2RlcygpOworCisJ LyogU2VuZCBDT1BZIGNvbW1hbmQgKi8KKwlpZiAoIVBRc2VuZFF1ZXJ5KGZtc3RhdGUtPmNvbm4s IGZtc3RhdGUtPnF1ZXJ5KSkKKwkJcGdmZHdfcmVwb3J0X2Vycm9yKE5VTEwsIGZtc3RhdGUtPmNv bm4sIGZtc3RhdGUtPnF1ZXJ5KTsKKworCS8qIGdldCB0aGUgQ09QWSByZXN1bHQgKi8KKwlyZXMg PSBwZ2Zkd19nZXRfcmVzdWx0KGZtc3RhdGUtPmNvbm4pOworCWlmIChQUXJlc3VsdFN0YXR1cyhy ZXMpICE9IFBHUkVTX0NPUFlfSU4pCisJCXBnZmR3X3JlcG9ydF9lcnJvcihyZXMsIGZtc3RhdGUt PmNvbm4sIGZtc3RhdGUtPnF1ZXJ5KTsKKworCS8qIENsZWFuIHVwIHRoZSBDT1BZIGNvbW1hbmQg cmVzdWx0ICovCisJUFFjbGVhcihyZXMpOworCisJLyogQ29udmVydCB0aGUgVHVwbGVUYWJsZVNs b3QgZGF0YSBpbnRvIGEgVEVYVC1mb3JtYXR0ZWQgbGluZSAqLworCWluaXRTdHJpbmdJbmZvKCZj b3B5X2RhdGEpOworCWZvciAoaSA9IDA7IGkgPCAqbnVtU2xvdHM7IGkrKykKKwl7CisJCWNvbnZl cnRfc2xvdF90b19jb3B5X3RleHQoJmNvcHlfZGF0YSwgZm1zdGF0ZSwgc2xvdHNbaV0pOworCisJ CS8qCisJCSAqIFNlbmQgaW5pdGlhbCBDT1BZIGRhdGEgaWYgdGhlIGJ1ZmZlciByZWFjaGVzIHRo ZSBsaW1pdCB0byBhdm9pZAorCQkgKiBsYXJnZSBtZW1vcnkgdXNhZ2UuCisJCSAqLworCQlpZiAo Y29weV9kYXRhLmxlbiA+PSBDT1BZQlVGU0laKQorCQl7CisJCQlpZiAoUFFwdXRDb3B5RGF0YShm bXN0YXRlLT5jb25uLCBjb3B5X2RhdGEuZGF0YSwgY29weV9kYXRhLmxlbikgPD0gMCkKKwkJCQlw Z2Zkd19yZXBvcnRfZXJyb3IoTlVMTCwgZm1zdGF0ZS0+Y29ubiwgZm1zdGF0ZS0+cXVlcnkpOwor CQkJcmVzZXRTdHJpbmdJbmZvKCZjb3B5X2RhdGEpOworCQl9CisJfQorCisJLyogU2VuZCB0aGUg cmVtYWluaW5nIENPUFkgZGF0YSAqLworCWlmIChjb3B5X2RhdGEubGVuID4gMCkKKwl7CisJCWlm IChQUXB1dENvcHlEYXRhKGZtc3RhdGUtPmNvbm4sIGNvcHlfZGF0YS5kYXRhLCBjb3B5X2RhdGEu bGVuKSA8PSAwKQorCQkJcGdmZHdfcmVwb3J0X2Vycm9yKE5VTEwsIGZtc3RhdGUtPmNvbm4sIGZt c3RhdGUtPnF1ZXJ5KTsKKwl9CisKKwlwZnJlZShjb3B5X2RhdGEuZGF0YSk7CisKKwkvKiBFbmQg dGhlIENPUFkgb3BlcmF0aW9uICovCisJaWYgKFBRcHV0Q29weUVuZChmbXN0YXRlLT5jb25uLCBO VUxMKSA8IDAgfHwgUFFmbHVzaChmbXN0YXRlLT5jb25uKSkKKwkJcGdmZHdfcmVwb3J0X2Vycm9y KE5VTEwsIGZtc3RhdGUtPmNvbm4sIGZtc3RhdGUtPnF1ZXJ5KTsKKworCS8qCisJICogR2V0IHRo ZSByZXN1bHQsIGFuZCBjaGVjayBmb3Igc3VjY2Vzcy4KKwkgKi8KKwlyZXMgPSBwZ2Zkd19nZXRf cmVzdWx0KGZtc3RhdGUtPmNvbm4pOworCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVT X0NPTU1BTkRfT0spCisJCXBnZmR3X3JlcG9ydF9lcnJvcihyZXMsIGZtc3RhdGUtPmNvbm4sIGZt c3RhdGUtPnF1ZXJ5KTsKKworCW5fcm93cyA9IGF0b2koUFFjbWRUdXBsZXMocmVzKSk7CisKKwkv KiBBbmQgY2xlYW4gdXAgKi8KKwlQUWNsZWFyKHJlcyk7CisKKwlyZXNldF90cmFuc21pc3Npb25f bW9kZXMobmVzdGxldmVsKTsKKworCU1lbW9yeUNvbnRleHRSZXNldChmbXN0YXRlLT50ZW1wX2N4 dCk7CisKKwkqbnVtU2xvdHMgPSBuX3Jvd3M7CisKKwkvKgorCSAqIFJldHVybiBOVUxMIGlmIG5v dGhpbmcgd2FzIGluc2VydGVkIG9uIHRoZSByZW1vdGUgZW5kCisJICovCisJcmV0dXJuIChuX3Jv d3MgPiAwKSA/IHNsb3RzIDogTlVMTDsKK30KKworLyoKKyAqICBXcml0ZSB0YXJnZXQgYXR0cmli dXRlIHZhbHVlcyBmcm9tIGZtc3RhdGUgaW50byBidWYgYnVmZmVyIHRvIGJlIHNlbnQgYXMKKyAq ICBDT1BZIEZST00gU1RESU4gZGF0YQorICovCitzdGF0aWMgdm9pZAorY29udmVydF9zbG90X3Rv X2NvcHlfdGV4dChTdHJpbmdJbmZvIGJ1ZiwKKwkJCQkJCSAgUGdGZHdNb2RpZnlTdGF0ZSAqZm1z dGF0ZSwKKwkJCQkJCSAgVHVwbGVUYWJsZVNsb3QgKnNsb3QpCit7CisJVHVwbGVEZXNjCXR1cGRl c2MgPSBSZWxhdGlvbkdldERlc2NyKGZtc3RhdGUtPnJlbCk7CisJYm9vbAkJZmlyc3QgPSB0cnVl OworCWludAkJCWkgPSAwOworCisJZm9yZWFjaF9pbnQoYXR0bnVtLCBmbXN0YXRlLT50YXJnZXRf YXR0cnMpCisJeworCQlDb21wYWN0QXR0cmlidXRlICphdHRyID0gVHVwbGVEZXNjQ29tcGFjdEF0 dHIodHVwZGVzYywgYXR0bnVtIC0gMSk7CisJCURhdHVtCQlkYXR1bTsKKwkJYm9vbAkJaXNudWxs OworCisJCS8qIElnbm9yZSBnZW5lcmF0ZWQgY29sdW1uczsgdGhleSBhcmUgc2V0IHRvIERFRkFV TFQgKi8KKwkJaWYgKGF0dHItPmF0dGdlbmVyYXRlZCkKKwkJCWNvbnRpbnVlOworCisJCWlmICgh Zmlyc3QpCisJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhck1hY3JvKGJ1ZiwgJ1x0Jyk7CisJCWZpcnN0 ID0gZmFsc2U7CisKKwkJZGF0dW0gPSBzbG90X2dldGF0dHIoc2xvdCwgYXR0bnVtLCAmaXNudWxs KTsKKworCQlpZiAoaXNudWxsKQorCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICJcXE4i KTsKKwkJZWxzZQorCQl7CisJCQljb25zdCBjaGFyICp2YWx1ZSA9IE91dHB1dEZ1bmN0aW9uQ2Fs bCgmZm1zdGF0ZS0+cF9mbGluZm9baV0sCisJCQkJCQkJCQkJCQkgICBkYXR1bSk7CisKKwkJCS8q IEVzY2FwZSB0aGUgdmFsdWUgaWYgbmVlZGVkICovCisJCQlhcHBlbmRTdHJpbmdJbmZvVGV4dChi dWYsIHZhbHVlKTsKKwkJfQorCQlpKys7CisJfQorCisJYXBwZW5kU3RyaW5nSW5mb0NoYXJNYWNy byhidWYsICdcbicpOworfQorCisvKiBBcHBlbmQgYSBzdHJpbmcgdG8gYnVmLCBlc2NhcGluZyBz cGVjaWFsIGNoYXJhY3RlcnMgZm9yIENPUFkgVEVYVCBmb3JtYXQuICovCitzdGF0aWMgdm9pZAor YXBwZW5kU3RyaW5nSW5mb1RleHQoU3RyaW5nSW5mbyBidWYsIGNvbnN0IGNoYXIgKnN0cmluZykK K3sKKwlDb3B5RXNjYXBlVGV4dChidWYsCisJCQkJICAgc3RyaW5nLAorCQkJCSAgICdcdCcsCisJ CQkJICAgUEdfVVRGOCwKKwkJCQkgICBmYWxzZSwKKwkJCQkgICBmYWxzZSk7Cit9CmRpZmYgLS1n aXQgYS9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuaCBiL2NvbnRyaWIvcG9zdGdy ZXNfZmR3L3Bvc3RncmVzX2Zkdy5oCmluZGV4IGEyYmIxZmYzNTJjLi5mYzY5MjJkZGQ0ZiAxMDA2 NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmgKKysrIGIvY29udHJp Yi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmgKQEAgLTIwNCw2ICsyMDQsNyBAQCBleHRlcm4g dm9pZCByZWJ1aWxkSW5zZXJ0U3FsKFN0cmluZ0luZm8gYnVmLCBSZWxhdGlvbiByZWwsCiAJCQkJ CQkJIGNoYXIgKm9yaWdfcXVlcnksIExpc3QgKnRhcmdldF9hdHRycywKIAkJCQkJCQkgaW50IHZh bHVlc19lbmRfbGVuLCBpbnQgbnVtX3BhcmFtcywKIAkJCQkJCQkgaW50IG51bV9yb3dzKTsKK2V4 dGVybiB2b2lkIGRlcGFyc2VDb3B5U3FsKFN0cmluZ0luZm8gYnVmLCBSZWxhdGlvbiByZWwsIExp c3QgKnRhcmdldF9hdHRycyk7CiBleHRlcm4gdm9pZCBkZXBhcnNlVXBkYXRlU3FsKFN0cmluZ0lu Zm8gYnVmLCBSYW5nZVRibEVudHJ5ICpydGUsCiAJCQkJCQkJIEluZGV4IHJ0aW5kZXgsIFJlbGF0 aW9uIHJlbCwKIAkJCQkJCQkgTGlzdCAqdGFyZ2V0QXR0cnMsCmRpZmYgLS1naXQgYS9jb250cmli L3Bvc3RncmVzX2Zkdy9zcWwvcG9zdGdyZXNfZmR3LnNxbCBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3 L3NxbC9wb3N0Z3Jlc19mZHcuc3FsCmluZGV4IGRmYzU4YmViMGQyLi5kYjk1YjE0OGNhOCAxMDA2 NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvc3FsL3Bvc3RncmVzX2Zkdy5zcWwKKysrIGIv Y29udHJpYi9wb3N0Z3Jlc19mZHcvc3FsL3Bvc3RncmVzX2Zkdy5zcWwKQEAgLTE5NzAsNiArMTk3 MCwzNyBAQCBzZWxlY3QgKiBmcm9tIGdsb2MxOwogc2VsZWN0ICogZnJvbSBncmVtMTsKIGRlbGV0 ZSBmcm9tIGdyZW0xOwogCistLSB0ZXN0IHRoYXQgZmR3IGFsc28gdXNlIENPUFkgRlJPTSBhcyBh IHJlbW90ZSBzcWwKK3NldCBjbGllbnRfbWluX21lc3NhZ2VzIHRvICdsb2cnOworCitjcmVhdGUg ZnVuY3Rpb24gaW5zZXJ0X29yX2NvcHkoKSByZXR1cm5zIHRyaWdnZXIgYXMgJCQKK2RlY2xhcmUg cXVlcnkgdGV4dDsKK2JlZ2luCisgICAgcXVlcnkgOj0gY3VycmVudF9xdWVyeSgpOworICAgIHJh aXNlIG5vdGljZSAnJScsIHF1ZXJ5OworcmV0dXJuIG5ldzsKK2VuZDsKKyQkIGxhbmd1YWdlIHBs cGdzcWw7CisKK0NSRUFURSBUUklHR0VSIHRyaWdfcm93X2JlZm9yZQorQkVGT1JFIElOU0VSVCBP UiBVUERBVEUgT1IgREVMRVRFIE9OIGdsb2MxCitGT1IgRUFDSCBST1cgRVhFQ1VURSBQUk9DRURV UkUgaW5zZXJ0X29yX2NvcHkoKTsKKworY29weSBncmVtMSBmcm9tIHN0ZGluOworMworXC4KKwor ZHJvcCB0cmlnZ2VyIHRyaWdfcm93X2JlZm9yZSBvbiBnbG9jMTsKK3Jlc2V0IGNsaWVudF9taW5f bWVzc2FnZXM7CisKKy0tIHRlc3QgdGhhdCBjb3B5IGRvZXMgbm90IGZhaWwgd2l0aCBjb2x1bW5f bmFtZSBhbGlhcworY3JlYXRlIHRhYmxlIGdsb2MyKHh4eCBpbnQpOworY3JlYXRlIGZvcmVpZ24g dGFibGUgZ3JlbTIoYSBpbnQpIHNlcnZlciBsb29wYmFjayBvcHRpb25zKHRhYmxlX25hbWUgJ2ds b2MyJyk7CithbHRlciBmb3JlaWduIHRhYmxlIGdyZW0yIGFsdGVyIGNvbHVtbiBhIG9wdGlvbnMg KGNvbHVtbl9uYW1lICd4eHgnKTsKK2NvcHkgZ3JlbTIgZnJvbSBzdGRpbjsKKzEKK1wuCisKIC0t IHRlc3QgYmF0Y2ggaW5zZXJ0CiBhbHRlciBzZXJ2ZXIgbG9vcGJhY2sgb3B0aW9ucyAoYWRkIGJh dGNoX3NpemUgJzEwJyk7CiBleHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYpCkBAIC0xOTk2LDYg KzIwMjcsMjQgQEAgZHJvcCB0YWJsZSB0YWJfYmF0Y2hfbG9jYWw7CiBkcm9wIHRhYmxlIHRhYl9i YXRjaF9zaGFyZGVkOwogZHJvcCB0YWJsZSB0YWJfYmF0Y2hfc2hhcmRlZF9wMV9yZW1vdGU7CiAK Ky0tIHRlc3QgYmF0Y2ggaW5zZXJ0IHVzaW5nIGNvcHkKK3NldCBjbGllbnRfbWluX21lc3NhZ2Vz IHRvICdkZWJ1ZzEnOworY29weSBncmVtMSBmcm9tIHN0ZGluOworMQorMgorMworNAorNQorNgor NworOAorOQorMTAKKzExCisxMgorXC4KK3Jlc2V0IGNsaWVudF9taW5fbWVzc2FnZXM7CisKIGFs dGVyIHNlcnZlciBsb29wYmFjayBvcHRpb25zIChkcm9wIGJhdGNoX3NpemUpOwogCiAtLSA9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09CkBAIC0zMDYwLDYgKzMxMDksMzkgQEAgZHJvcCB0cmlnZ2VyIHRyaWdfbnVsbCBvbiBs b2MyOwogCiBkZWxldGUgZnJvbSByZW0yOwogCistLSBUZXN0IENPUFkgRlJPTSB3aXRoIGNvbHVt biBsaXN0IGFuZCBzcGVjaWFsIGNoYXJhY3RlcnMKK2NvcHkgcmVtMiAoZjEsIGYyKSBmcm9tIHN0 ZGluOworMQloZWxsb1xud29ybGQKK1wuCitzZWxlY3QgKiBmcm9tIHJlbTI7CisKK2RlbGV0ZSBm cm9tIHJlbTI7CisKKy0tIFRlc3QgQ09QWSB3aXRoIE5VTEwgYW5kIHNwZWNpYWwgY2hhcmFjdGVy cworY29weSByZW0yIGZyb20gc3RkaW47CisxCVxOCitcTgliYXIKKzMJYSJiCitcLgorc2VsZWN0 ICogZnJvbSByZW0yOworCitkZWxldGUgZnJvbSByZW0yOworCistLSBUZXN0IHRoYXQgZmxvYXQg bnVtYmVycyBkbyBub3QgbG9vc2UgcHJlY2lzaW9uIHdoZW4gc2VuZGluZyB0byB0aGUgZm9yZWln bgorLS0gc2VydmVyCitjcmVhdGUgdGFibGUgZihhIGZsb2F0KTsKK2NyZWF0ZSBmb3JlaWduIHRh YmxlIGZfZmR3KGEgZmxvYXQpIHNlcnZlciBsb29wYmFjayBvcHRpb25zKHRhYmxlX25hbWUgJ2Yn KTsKKworc2V0IGV4dHJhX2Zsb2F0X2RpZ2l0cyA9IDA7Citjb3B5IGZfZmR3IGZyb20gc3RkaW47 CisxLjAwMDAwMDAwMDAwMDAwMDIKK1wuCisKK3Jlc2V0IGV4dHJhX2Zsb2F0X2RpZ2l0czsKK3Nl bGVjdCAqIGZyb20gZjsKKworZHJvcCB0YWJsZSBmOworCiAtLSBDaGVjayB3aXRoIHplcm8tY29s dW1uIGZvcmVpZ24gdGFibGU7IGJhdGNoIGluc2VydCB3aWxsIGJlIGRpc2FibGVkCiBhbHRlciB0 YWJsZSBsb2MyIGRyb3AgY29sdW1uIGYxOwogYWx0ZXIgdGFibGUgbG9jMiBkcm9wIGNvbHVtbiBm MjsKLS0gCjIuNTAuMSAoQXBwbGUgR2l0LTE1NSkKCg== --0914b003dd872f83283d693efb1b4087ca3ae32bc3bf0fc70f456a8dd072--