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 1w7qQs-005kdt-26 for pgsql-hackers@arkaria.postgresql.org; Wed, 01 Apr 2026 07:56:11 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w7qQq-00FuFJ-2x for pgsql-hackers@arkaria.postgresql.org; Wed, 01 Apr 2026 07:56:09 +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 1w7qQq-00FuF5-17 for pgsql-hackers@lists.postgresql.org; Wed, 01 Apr 2026 07:56:09 +0000 Received: from mail-qk1-x731.google.com ([2607:f8b0:4864:20::731]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w7qQn-000000026Wq-3Zhg for pgsql-hackers@postgresql.org; Wed, 01 Apr 2026 07:56:07 +0000 Received: by mail-qk1-x731.google.com with SMTP id af79cd13be357-8cfc085395fso680915285a.2 for ; Wed, 01 Apr 2026 00:56:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1775030165; cv=none; d=google.com; s=arc-20240605; b=iUDaFl8AO/UA5mTMR6QbcMUy/OU2y8+yAksDIOADAFiuCPBXjsmkwz/IdcE8wQACK4 Ce1GSionQN2ekbJKFSLVU7YLnhgCmYLt0Tf2ctQdPE/YglOPIrkV3+Zj5q6KEbRJBufw qeSmfA7BufGXgqOdVAQYgeiEQql/YuZOdy9mb4J6loFr1JvLSLA1Wi9vMH7yJ7gpLkzy JWdOsPRD95cdimIqEGA+KPl7RUcFhLhrTodF91urENadFvRU2QQni6E7sUo3ifAV8HUn ADbknFALqv6caawT0e/y4QhBAG/vsIB0L4V2LrblbliJUqCVMvtRQBe1MilfLoc+k13N LLpQ== 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=RxzocncfZ/n98IFXg0Jy2a3hC7nxD0c+85dWDDgKfRs=; fh=Lf72zBtJwIKGDsob/I1fTfmNlIRWDk2TWHxRX8QxymQ=; b=Hj3mRCVqGay3BavzpeEcP6puHysoowyvHNe1kXp6jyxs2cPngpNkU2jT/EomcPUOoo Ghi0UFKDoXuElahULcQOrQiVT06G+sD+yWfECyS+UGNlcyaOq7zv+U+F8OtBWjUBbGTf obMAEirQlF2Ad9H6I67EMc1RU/wIpx3HCY+PYfhN4pCk1CjIHeBzMD9yUGbrQ/Vxwlm/ SFczM248gZe8IrqQD/7yQaaMBV5gov8W0uX16z2P76PTxLFEPgOYl+EQ9KZWWVaUoRCh HPxz20uIRimPnCb0AzST2jHSymzJXpE0rjBwb5Y9LOizDUmWAkg+htzzReFatP9p8Jc8 H8sg==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fittl.com; s=google; t=1775030165; x=1775634965; 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=RxzocncfZ/n98IFXg0Jy2a3hC7nxD0c+85dWDDgKfRs=; b=QQW+WRzdOo6at/2eSdJWcqaFGazCBTiBW+e4hkTpcZKt+kUm9lqUW4dMBtyqD/rcyE HV6PwN52XDpiK0N2Z/6q9wVkrXC0hMaV42xZ2EPtlhjMQDuEMVPisDfka0BuNKnOu6H9 wV/ovqA0htRaC5U4EOqb/ovYQZGFbqCL7T17A= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775030165; x=1775634965; 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=RxzocncfZ/n98IFXg0Jy2a3hC7nxD0c+85dWDDgKfRs=; b=WnoYnQ9HYMGfqZLv6IJtbWJgEeKJKYUgmzOXVyHRuHsrmW0U2OxEyIArE3f8c+Tc71 38LXUVhNpyzncoI3K50tIjIhcSIrqDE6ufJGRRdumMNZdv5ENdm29MXgtPUzWxZftuPI mCrzHc5hOsSUyJRlezcbvYP+Bi44UcQj+8/uCXPbLC0kRCv+CtXMnqyRvBGAaUUDeygx FCbyhXokkzLh7bfnrOgZRrgVXn+e2+4evmLRRUW8ej1LAVAcinR+UIyd/izOkLdlXaAo GjCH/XCyuTRy0vLwxhqcBqDyzWKlHVJZCGz6EuneK1UAf8jKwqF85un0Hh5RjCcXQZ1E 6n1g== X-Forwarded-Encrypted: i=1; AJvYcCWoS22k/comrIfe6dv2WPcqg/pyPKMuEglHsvun5mPsYiAYIl3aF2FWh7eNe1+RuTsXAfjNuy6qCCpIazwk@postgresql.org X-Gm-Message-State: AOJu0YyP5BD9Sx/XFTIHBTLxMskREmq1seKDFhSBPqruVQhSfxgS/ttH ae2Pdt8KpKwRISD1JgreifiBxMUySa05kqBfG7KNLdjDF6x8rdx3GDVPOugHCCa91IkC9FptPM3 udVGUohNr55wqVG4mMRHiAk1jXopNb9Rc84SpJN91 X-Gm-Gg: ATEYQzxVla8q/fSpT3v9ZgcnGOTtLYoapX6l/7GfGiF+15yruZGdwnDMb5Qf4ol1rkH fYKmlFOrHV1IGkF819cUaVIJx9cXRfhyJTiz+zISjpK6ythkO3GvPL9/r7B8jMDWAu+UO5kqNLg puwteXVKY/xsF/pB6x3QfNR+IZuWBWwQ7edPwnrXUitrNFEybWT1C2nz3klP8Y1qSXNol+3NhgR VBpAsTCIcIX/b8g3pWgFGQslBj59xHt1kyvp7lR0ugxqoN2LxHIheqeUiKiRQ9vt5seGSzL2AVy eRgT8ZKL6P9pmJDmM8G8SOiwGtsTM/SxAQuK91/X3vJUtrbUrzQ= X-Received: by 2002:a05:620a:2682:b0:8cf:e946:b2d4 with SMTP id af79cd13be357-8d1b5c365e1mr393917885a.69.1775030164901; Wed, 01 Apr 2026 00:56:04 -0700 (PDT) MIME-Version: 1.0 References: <8437F4D0-9DFB-4045-9318-CC3C5BA2E267@paquier.xyz> In-Reply-To: From: Lukas Fittl Date: Wed, 1 Apr 2026 00:55:28 -0700 X-Gm-Features: AQROBzC7WgOlXi5PbpM1PHxoHz9gntVGgyJs3TFwhX4GQ-RiSfDeIKF4I42PUfM Message-ID: Subject: Re: Refactor query normalization into core query jumbling To: Sami Imseih Cc: Michael Paquier , zengman , pgsql-hackers , Julien Rouhaud Content-Type: multipart/mixed; boundary="0000000000007260fa064e616a59" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000007260fa064e616a59 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, Mar 31, 2026 at 7:54=E2=80=AFPM Sami Imseih w= rote: > > > I'm +-0 regarding this routine, but I can also see your point about how= it's > > useful to give at least the option to extensions to have a > > recomputation of the Const lengths, the same way as PGSS. What are > > the extensions that would use that? > > https://github.com/search?q=3Dfill_in_constant_lengths&type=3Dcode > > A few well-known extensions/tools out there based on a Github search. See attached a v9 that extracts ComputeConstantLengths from Sami's v7 for easier discussion. I've done an updated test with pg_stat_monitor [0] and pg_tracing [1] with that, and that has both extensions passing regressions tests. I've also looked but not tested a third extension (sql_firewall) and that looks like it should just work as well. Its worth noting that pg_tracing had a secondary use case for its fill_in_constant_lengths function, which is to find the first non-comment token in a query (to skip over leading comments). Not having that causes a small regression test difference. The maintainers will have to decide whether its worth keeping their own function, but I think that doesn't invalidate the utility of having this in core to me. Thanks, Lukas [0]: https://github.com/lfittl/pg_stat_monitor/commit/054f347344a380f7a59cb= 444685db71301669c61 [1]: https://github.com/lfittl/pg_tracing/commit/d48a36c9a2c8fc284cf63ec116= 1558b90d8b44ef --=20 Lukas Fittl --0000000000007260fa064e616a59 Content-Type: application/octet-stream; name="v9-0001-Make-JumbleState-const-in-post_parse_analyze-hook.patch" Content-Disposition: attachment; filename="v9-0001-Make-JumbleState-const-in-post_parse_analyze-hook.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mnfr3f1e0 RnJvbSA5NWY3NWRlODE0NjIxZWNmNWFkNWI1YzdkMWE2MTQ0MGRjMjcyNTdlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNaWNoYWVsIFBhcXVpZXIgPG1pY2hhZWxAcGFxdWllci54eXo+ CkRhdGU6IEZyaSwgMjcgTWFyIDIwMjYgMTQ6MTM6MDAgKzA5MDAKU3ViamVjdDogW1BBVENIIHY5 XSBNYWtlIEp1bWJsZVN0YXRlIGNvbnN0IGluIHBvc3RfcGFyc2VfYW5hbHl6ZSBob29rCgpDaGFu Z2UgdGhlIHBvc3RfcGFyc2VfYW5hbHl6ZV9ob29rX3R5cGUgc2lnbmF0dXJlIHRvIHRha2UgYSBj b25zdApKdW1ibGVTdGF0ZSBwYXJhbWV0ZXIsIHByZXZlbnRpbmcgaG9va3MgZnJvbSBtb2RpZnlp bmcgdGhlIGp1bWJsZQpzdGF0ZSBkdXJpbmcgcXVlcnkgYW5hbHlzaXMuIFRoaXMgaW1wcm92ZXMg QVBJIHNhZmV0eSBieSBtYWtpbmcgaXQKY2xlYXIgdGhhdCBob29rcyBzaG91bGQgb25seSByZWFk IGZyb20gdGhlIGp1bWJsZSBzdGF0ZSwgbm90IG1vZGlmeQppdC4KClRvIGFpZCBleHRlbnNpb25z IHRvIHVzZSB0aGUgQVBJIGNvcnJlY3RseSwgaW50cm9kdWNlIGEgbmV3IGhlbHBlcgpmdW5jdGlv biBDb21wdXRlQ29uc3RhbnRMZW5ndGhzKCkgdGhhdCB0YWtlcyB0aGUgY29uc3QgSnVtYmxlU3Rh dGUgYXMKaW5wdXQsIGFuZCByZXR1cm5zIGEgbmV3bHkgYWxsb2NhdGVkIExvY2F0aW9uTGVuIGFy cmF5IHdpdGggY29uc3RhbnQKbGVuZ3RocyBmaWxsZWQgaW4uIFJlcGxhY2UgdGhlIGZpbGxfaW5f Y29uc3RhbnRfbGVuZ3RocyBmdW5jdGlvbiBpbgpwZ19zdGF0X3N0YXRlbWVudHMgd2l0aCBpdC4K CkRpc2N1c3Npb246IGh0dHBzOi8vcG9zdGdyLmVzL20vQ0FBNVJaMHRacDVxVTBpa1pFRXFKbnh2 ZFNOR2gxRFd2ODBzYi1rNFFBVW1pTW9PcF9RQG1haWwuZ21haWwuY29tCi0tLQogLi4uL3BnX3N0 YXRfc3RhdGVtZW50cy9wZ19zdGF0X3N0YXRlbWVudHMuYyAgIHwgMTc2ICsrLS0tLS0tLS0tLS0t LS0tLQogc3JjL2JhY2tlbmQvbm9kZXMvcXVlcnlqdW1ibGVmdW5jcy5jICAgICAgICAgIHwgMTQ4 ICsrKysrKysrKysrKysrKwogc3JjL2luY2x1ZGUvbm9kZXMvcXVlcnlqdW1ibGUuaCAgICAgICAg ICAgICAgIHwgICAzICsKIHNyYy9pbmNsdWRlL3BhcnNlci9hbmFseXplLmggICAgICAgICAgICAg ICAgICB8ICAgMiArLQogNCBmaWxlcyBjaGFuZ2VkLCAxNzIgaW5zZXJ0aW9ucygrKSwgMTU3IGRl bGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0 YXRfc3RhdGVtZW50cy5jIGIvY29udHJpYi9wZ19zdGF0X3N0YXRlbWVudHMvcGdfc3RhdF9zdGF0 ZW1lbnRzLmMKaW5kZXggNzk3NTQ3NmI4OTAuLjAzYTgwMWQ5MTE0IDEwMDY0NAotLS0gYS9jb250 cmliL3BnX3N0YXRfc3RhdGVtZW50cy9wZ19zdGF0X3N0YXRlbWVudHMuYworKysgYi9jb250cmli L3BnX3N0YXRfc3RhdGVtZW50cy9wZ19zdGF0X3N0YXRlbWVudHMuYwpAQCAtNTAsNyArNTAsNiBA QAogI2luY2x1ZGUgImFjY2Vzcy9odHVwX2RldGFpbHMuaCIKICNpbmNsdWRlICJhY2Nlc3MvcGFy YWxsZWwuaCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX2F1dGhpZC5oIgotI2luY2x1ZGUgImNvbW1v bi9pbnQuaCIKICNpbmNsdWRlICJleGVjdXRvci9pbnN0cnVtZW50LmgiCiAjaW5jbHVkZSAiZnVu Y2FwaS5oIgogI2luY2x1ZGUgImppdC9qaXQuaCIKQEAgLTU5LDcgKzU4LDYgQEAKICNpbmNsdWRl ICJub2Rlcy9xdWVyeWp1bWJsZS5oIgogI2luY2x1ZGUgIm9wdGltaXplci9wbGFubmVyLmgiCiAj aW5jbHVkZSAicGFyc2VyL2FuYWx5emUuaCIKLSNpbmNsdWRlICJwYXJzZXIvc2Nhbm5lci5oIgog I2luY2x1ZGUgInBnc3RhdC5oIgogI2luY2x1ZGUgInN0b3JhZ2UvZmQuaCIKICNpbmNsdWRlICJz dG9yYWdlL2lwYy5oIgpAQCAtMzM1LDcgKzMzMyw3IEBAIHN0YXRpYyB2b2lkIHBnc3Nfc2htZW1f cmVxdWVzdCh2b2lkKTsKIHN0YXRpYyB2b2lkIHBnc3Nfc2htZW1fc3RhcnR1cCh2b2lkKTsKIHN0 YXRpYyB2b2lkIHBnc3Nfc2htZW1fc2h1dGRvd24oaW50IGNvZGUsIERhdHVtIGFyZyk7CiBzdGF0 aWMgdm9pZCBwZ3NzX3Bvc3RfcGFyc2VfYW5hbHl6ZShQYXJzZVN0YXRlICpwc3RhdGUsIFF1ZXJ5 ICpxdWVyeSwKLQkJCQkJCQkJCUp1bWJsZVN0YXRlICpqc3RhdGUpOworCQkJCQkJCQkJY29uc3Qg SnVtYmxlU3RhdGUgKmpzdGF0ZSk7CiBzdGF0aWMgUGxhbm5lZFN0bXQgKnBnc3NfcGxhbm5lcihR dWVyeSAqcGFyc2UsCiAJCQkJCQkJCSBjb25zdCBjaGFyICpxdWVyeV9zdHJpbmcsCiAJCQkJCQkJ CSBpbnQgY3Vyc29yT3B0aW9ucywKQEAgLTM1OSw3ICszNTcsNyBAQCBzdGF0aWMgdm9pZCBwZ3Nz X3N0b3JlKGNvbnN0IGNoYXIgKnF1ZXJ5LCBpbnQ2NCBxdWVyeUlkLAogCQkJCQkgICBjb25zdCBC dWZmZXJVc2FnZSAqYnVmdXNhZ2UsCiAJCQkJCSAgIGNvbnN0IFdhbFVzYWdlICp3YWx1c2FnZSwK IAkJCQkJICAgY29uc3Qgc3RydWN0IEppdEluc3RydW1lbnRhdGlvbiAqaml0dXNhZ2UsCi0JCQkJ CSAgIEp1bWJsZVN0YXRlICpqc3RhdGUsCisJCQkJCSAgIGNvbnN0IEp1bWJsZVN0YXRlICpqc3Rh dGUsCiAJCQkJCSAgIGludCBwYXJhbGxlbF93b3JrZXJzX3RvX2xhdW5jaCwKIAkJCQkJICAgaW50 IHBhcmFsbGVsX3dvcmtlcnNfbGF1bmNoZWQsCiAJCQkJCSAgIFBsYW5uZWRTdG10T3JpZ2luIHBs YW5PcmlnaW4pOwpAQCAtMzc4LDEyICszNzYsOSBAQCBzdGF0aWMgY2hhciAqcXRleHRfZmV0Y2go U2l6ZSBxdWVyeV9vZmZzZXQsIGludCBxdWVyeV9sZW4sCiBzdGF0aWMgYm9vbCBuZWVkX2djX3F0 ZXh0cyh2b2lkKTsKIHN0YXRpYyB2b2lkIGdjX3F0ZXh0cyh2b2lkKTsKIHN0YXRpYyBUaW1lc3Rh bXBUeiBlbnRyeV9yZXNldChPaWQgdXNlcmlkLCBPaWQgZGJpZCwgaW50NjQgcXVlcnlpZCwgYm9v bCBtaW5tYXhfb25seSk7Ci1zdGF0aWMgY2hhciAqZ2VuZXJhdGVfbm9ybWFsaXplZF9xdWVyeShK dW1ibGVTdGF0ZSAqanN0YXRlLCBjb25zdCBjaGFyICpxdWVyeSwKK3N0YXRpYyBjaGFyICpnZW5l cmF0ZV9ub3JtYWxpemVkX3F1ZXJ5KGNvbnN0IEp1bWJsZVN0YXRlICpqc3RhdGUsCisJCQkJCQkJ CQkgICBjb25zdCBjaGFyICpxdWVyeSwKIAkJCQkJCQkJCSAgIGludCBxdWVyeV9sb2MsIGludCAq cXVlcnlfbGVuX3ApOwotc3RhdGljIHZvaWQgZmlsbF9pbl9jb25zdGFudF9sZW5ndGhzKEp1bWJs ZVN0YXRlICpqc3RhdGUsIGNvbnN0IGNoYXIgKnF1ZXJ5LAotCQkJCQkJCQkJIGludCBxdWVyeV9s b2MpOwotc3RhdGljIGludAljb21wX2xvY2F0aW9uKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQg KmIpOwotCiAKIC8qCiAgKiBNb2R1bGUgbG9hZCBjYWxsYmFjawpAQCAtODQxLDcgKzgzNiw3IEBA IGVycm9yOgogICogUG9zdC1wYXJzZS1hbmFseXNpcyBob29rOiBtYXJrIHF1ZXJ5IHdpdGggYSBx dWVyeUlkCiAgKi8KIHN0YXRpYyB2b2lkCi1wZ3NzX3Bvc3RfcGFyc2VfYW5hbHl6ZShQYXJzZVN0 YXRlICpwc3RhdGUsIFF1ZXJ5ICpxdWVyeSwgSnVtYmxlU3RhdGUgKmpzdGF0ZSkKK3Bnc3NfcG9z dF9wYXJzZV9hbmFseXplKFBhcnNlU3RhdGUgKnBzdGF0ZSwgUXVlcnkgKnF1ZXJ5LCBjb25zdCBK dW1ibGVTdGF0ZSAqanN0YXRlKQogewogCWlmIChwcmV2X3Bvc3RfcGFyc2VfYW5hbHl6ZV9ob29r KQogCQlwcmV2X3Bvc3RfcGFyc2VfYW5hbHl6ZV9ob29rKHBzdGF0ZSwgcXVlcnksIGpzdGF0ZSk7 CkBAIC0xMjk4LDcgKzEyOTMsNyBAQCBwZ3NzX3N0b3JlKGNvbnN0IGNoYXIgKnF1ZXJ5LCBpbnQ2 NCBxdWVyeUlkLAogCQkgICBjb25zdCBCdWZmZXJVc2FnZSAqYnVmdXNhZ2UsCiAJCSAgIGNvbnN0 IFdhbFVzYWdlICp3YWx1c2FnZSwKIAkJICAgY29uc3Qgc3RydWN0IEppdEluc3RydW1lbnRhdGlv biAqaml0dXNhZ2UsCi0JCSAgIEp1bWJsZVN0YXRlICpqc3RhdGUsCisJCSAgIGNvbnN0IEp1bWJs ZVN0YXRlICpqc3RhdGUsCiAJCSAgIGludCBwYXJhbGxlbF93b3JrZXJzX3RvX2xhdW5jaCwKIAkJ ICAgaW50IHBhcmFsbGVsX3dvcmtlcnNfbGF1bmNoZWQsCiAJCSAgIFBsYW5uZWRTdG10T3JpZ2lu IHBsYW5PcmlnaW4pCkBAIC0yODQ5LDcgKzI4NDQsNyBAQCByZWxlYXNlX2xvY2s6CiAgKiBSZXR1 cm5zIGEgcGFsbG9jJ2Qgc3RyaW5nLgogICovCiBzdGF0aWMgY2hhciAqCi1nZW5lcmF0ZV9ub3Jt YWxpemVkX3F1ZXJ5KEp1bWJsZVN0YXRlICpqc3RhdGUsIGNvbnN0IGNoYXIgKnF1ZXJ5LAorZ2Vu ZXJhdGVfbm9ybWFsaXplZF9xdWVyeShjb25zdCBKdW1ibGVTdGF0ZSAqanN0YXRlLCBjb25zdCBj aGFyICpxdWVyeSwKIAkJCQkJCSAgaW50IHF1ZXJ5X2xvYywgaW50ICpxdWVyeV9sZW5fcCkKIHsK IAljaGFyCSAgICpub3JtX3F1ZXJ5OwpAQCAtMjg2MSwxMiArMjg1NiwxNCBAQCBnZW5lcmF0ZV9u b3JtYWxpemVkX3F1ZXJ5KEp1bWJsZVN0YXRlICpqc3RhdGUsIGNvbnN0IGNoYXIgKnF1ZXJ5LAog CQkJCWxhc3Rfb2ZmID0gMCwJLyogT2Zmc2V0IGZyb20gc3RhcnQgZm9yIHByZXZpb3VzIHRvayAq LwogCQkJCWxhc3RfdG9rX2xlbiA9IDA7CS8qIExlbmd0aCAoaW4gYnl0ZXMpIG9mIHRoYXQgdG9r ICovCiAJaW50CQkJbnVtX2NvbnN0YW50c19yZXBsYWNlZCA9IDA7CisJTG9jYXRpb25MZW4gKmxv Y3MgPSBOVUxMOwogCiAJLyoKLQkgKiBHZXQgY29uc3RhbnRzJyBsZW5ndGhzIChjb3JlIHN5c3Rl bSBvbmx5IGdpdmVzIHVzIGxvY2F0aW9ucykuICBOb3RlCi0JICogdGhpcyBhbHNvIGVuc3VyZXMg dGhlIGl0ZW1zIGFyZSBzb3J0ZWQgYnkgbG9jYXRpb24uCisJICogRGV0ZXJtaW5lIGNvbnN0YW50 cycgbGVuZ3RocyAoY29yZSBzeXN0ZW0gb25seSBnaXZlcyB1cyBsb2NhdGlvbnMpLCBhbmQKKwkg KiByZXR1cm4gYSBzb3J0ZWQgY29weSBvZiBqc3RhdGUncyBMb2NhdGlvbkxlbiBkYXRhIHdpdGgg bGVuZ3RocyBmaWxsZWQKKwkgKiBpbi4KIAkgKi8KLQlmaWxsX2luX2NvbnN0YW50X2xlbmd0aHMo anN0YXRlLCBxdWVyeSwgcXVlcnlfbG9jKTsKKwlsb2NzID0gQ29tcHV0ZUNvbnN0YW50TGVuZ3Ro cyhqc3RhdGUsIHF1ZXJ5LCBxdWVyeV9sb2MpOwogCiAJLyoKIAkgKiBBbGxvdyBmb3IgJG4gc3lt Ym9scyB0byBiZSBsb25nZXIgdGhhbiB0aGUgY29uc3RhbnRzIHRoZXkgcmVwbGFjZS4KQEAgLTI4 OTIsMTUgKzI4ODksMTUgQEAgZ2VuZXJhdGVfbm9ybWFsaXplZF9xdWVyeShKdW1ibGVTdGF0ZSAq anN0YXRlLCBjb25zdCBjaGFyICpxdWVyeSwKIAkJICogdGhlIHBhcmFtZXRlciBpbiB0aGUgbmV4 dCBpdGVyYXRpb24gKG9yIGFmdGVyIHRoZSBsb29wIGlzIGRvbmUpLAogCQkgKiB3aGljaCBpcyBh IGJpdCBvZGQgYnV0IHNlZW1zIHRvIHdvcmsgb2theSBpbiBtb3N0IGNhc2VzLgogCQkgKi8KLQkJ aWYgKGpzdGF0ZS0+Y2xvY2F0aW9uc1tpXS5leHRlcm5fcGFyYW0gJiYgIWpzdGF0ZS0+aGFzX3Nx dWFzaGVkX2xpc3RzKQorCQlpZiAobG9jc1tpXS5leHRlcm5fcGFyYW0gJiYgIWpzdGF0ZS0+aGFz X3NxdWFzaGVkX2xpc3RzKQogCQkJY29udGludWU7CiAKLQkJb2ZmID0ganN0YXRlLT5jbG9jYXRp b25zW2ldLmxvY2F0aW9uOworCQlvZmYgPSBsb2NzW2ldLmxvY2F0aW9uOwogCiAJCS8qIEFkanVz dCByZWNvcmRlZCBsb2NhdGlvbiBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggcGFydGlhbCBzdHJpbmcg Ki8KIAkJb2ZmIC09IHF1ZXJ5X2xvYzsKIAotCQl0b2tfbGVuID0ganN0YXRlLT5jbG9jYXRpb25z W2ldLmxlbmd0aDsKKwkJdG9rX2xlbiA9IGxvY3NbaV0ubGVuZ3RoOwogCiAJCWlmICh0b2tfbGVu IDwgMCkKIAkJCWNvbnRpbnVlOwkJCS8qIGlnbm9yZSBhbnkgZHVwbGljYXRlcyAqLwpAQCAtMjkx OSw3ICsyOTE2LDcgQEAgZ2VuZXJhdGVfbm9ybWFsaXplZF9xdWVyeShKdW1ibGVTdGF0ZSAqanN0 YXRlLCBjb25zdCBjaGFyICpxdWVyeSwKIAkJICovCiAJCW5fcXVlcl9sb2MgKz0gc3ByaW50Zihu b3JtX3F1ZXJ5ICsgbl9xdWVyX2xvYywgIiQlZCVzIiwKIAkJCQkJCQkgIG51bV9jb25zdGFudHNf cmVwbGFjZWQgKyAxICsganN0YXRlLT5oaWdoZXN0X2V4dGVybl9wYXJhbV9pZCwKLQkJCQkJCQkg IGpzdGF0ZS0+Y2xvY2F0aW9uc1tpXS5zcXVhc2hlZCA/ICIgLyosIC4uLiAqLyIgOiAiIik7CisJ CQkJCQkJICBsb2NzW2ldLnNxdWFzaGVkID8gIiAvKiwgLi4uICovIiA6ICIiKTsKIAkJbnVtX2Nv bnN0YW50c19yZXBsYWNlZCsrOwogCiAJCS8qIG1vdmUgZm9yd2FyZCAqLwpAQCAtMjkyOCw2ICsy OTI1LDEwIEBAIGdlbmVyYXRlX25vcm1hbGl6ZWRfcXVlcnkoSnVtYmxlU3RhdGUgKmpzdGF0ZSwg Y29uc3QgY2hhciAqcXVlcnksCiAJCWxhc3RfdG9rX2xlbiA9IHRva19sZW47CiAJfQogCisJLyog Q2xlYW4gdXAsIGlmIG5lZWRlZCAqLworCWlmIChsb2NzKQorCQlwZnJlZShsb2NzKTsKKwogCS8q CiAJICogV2UndmUgY29waWVkIHVwIHVudGlsIHRoZSBsYXN0IGlnbm9yYWJsZSBjb25zdGFudC4g IENvcHkgb3ZlciB0aGUKIAkgKiByZW1haW5pbmcgYnl0ZXMgb2YgdGhlIG9yaWdpbmFsIHF1ZXJ5 IHN0cmluZy4KQEAgLTI5NDQsMTQwICsyOTQ1LDMgQEAgZ2VuZXJhdGVfbm9ybWFsaXplZF9xdWVy eShKdW1ibGVTdGF0ZSAqanN0YXRlLCBjb25zdCBjaGFyICpxdWVyeSwKIAkqcXVlcnlfbGVuX3Ag PSBuX3F1ZXJfbG9jOwogCXJldHVybiBub3JtX3F1ZXJ5OwogfQotCi0vKgotICogR2l2ZW4gYSB2 YWxpZCBTUUwgc3RyaW5nIGFuZCBhbiBhcnJheSBvZiBjb25zdGFudC1sb2NhdGlvbiByZWNvcmRz LAotICogZmlsbCBpbiB0aGUgdGV4dHVhbCBsZW5ndGhzIG9mIHRob3NlIGNvbnN0YW50cy4KLSAq Ci0gKiBUaGUgY29uc3RhbnRzIG1heSB1c2UgYW55IGFsbG93ZWQgY29uc3RhbnQgc3ludGF4LCBz dWNoIGFzIGZsb2F0IGxpdGVyYWxzLAotICogYml0LXN0cmluZ3MsIHNpbmdsZS1xdW90ZWQgc3Ry aW5ncyBhbmQgZG9sbGFyLXF1b3RlZCBzdHJpbmdzLiAgVGhpcyBpcwotICogYWNjb21wbGlzaGVk IGJ5IHVzaW5nIHRoZSBwdWJsaWMgQVBJIGZvciB0aGUgY29yZSBzY2FubmVyLgotICoKLSAqIEl0 IGlzIHRoZSBjYWxsZXIncyBqb2IgdG8gZW5zdXJlIHRoYXQgdGhlIHN0cmluZyBpcyBhIHZhbGlk IFNRTCBzdGF0ZW1lbnQKLSAqIHdpdGggY29uc3RhbnRzIGF0IHRoZSBpbmRpY2F0ZWQgbG9jYXRp b25zLiAgU2luY2UgaW4gcHJhY3RpY2UgdGhlIHN0cmluZwotICogaGFzIGFscmVhZHkgYmVlbiBw YXJzZWQsIGFuZCB0aGUgbG9jYXRpb25zIHRoYXQgdGhlIGNhbGxlciBwcm92aWRlcyB3aWxsCi0g KiBoYXZlIG9yaWdpbmF0ZWQgZnJvbSB3aXRoaW4gdGhlIGF1dGhvcml0YXRpdmUgcGFyc2VyLCB0 aGlzIHNob3VsZCBub3QgYmUKLSAqIGEgcHJvYmxlbS4KLSAqCi0gKiBNdWx0aXBsZSBjb25zdGFu dHMgY2FuIGhhdmUgdGhlIHNhbWUgbG9jYXRpb24uICBXZSByZXNldCBsZW5ndGhzIG9mIHRob3Nl Ci0gKiBwYXN0IHRoZSBmaXJzdCB0byAtMSBzbyB0aGF0IHRoZXkgY2FuIGxhdGVyIGJlIGlnbm9y ZWQuCi0gKgotICogSWYgcXVlcnlfbG9jID4gMCwgdGhlbiAicXVlcnkiIGhhcyBiZWVuIGFkdmFu Y2VkIGJ5IHRoYXQgbXVjaCBjb21wYXJlZCB0bwotICogdGhlIG9yaWdpbmFsIHN0cmluZyBzdGFy dCwgc28gd2UgbmVlZCB0byB0cmFuc2xhdGUgdGhlIHByb3ZpZGVkIGxvY2F0aW9ucwotICogdG8g Y29tcGVuc2F0ZS4gIChUaGlzIGxldHMgdXMgYXZvaWQgcmUtc2Nhbm5pbmcgc3RhdGVtZW50cyBi ZWZvcmUgdGhlIG9uZQotICogb2YgaW50ZXJlc3QsIHNvIGl0J3Mgd29ydGggZG9pbmcuKQotICoK LSAqIE4uQi4gVGhlcmUgaXMgYW4gYXNzdW1wdGlvbiB0aGF0IGEgJy0nIGNoYXJhY3RlciBhdCBh IENvbnN0IGxvY2F0aW9uIGJlZ2lucwotICogYSBuZWdhdGl2ZSBudW1lcmljIGNvbnN0YW50LiAg VGhpcyBwcmVjbHVkZXMgdGhlcmUgZXZlciBiZWluZyBhbm90aGVyCi0gKiByZWFzb24gZm9yIGEg Y29uc3RhbnQgdG8gc3RhcnQgd2l0aCBhICctJy4KLSAqLwotc3RhdGljIHZvaWQKLWZpbGxfaW5f Y29uc3RhbnRfbGVuZ3RocyhKdW1ibGVTdGF0ZSAqanN0YXRlLCBjb25zdCBjaGFyICpxdWVyeSwK LQkJCQkJCSBpbnQgcXVlcnlfbG9jKQotewotCUxvY2F0aW9uTGVuICpsb2NzOwotCWNvcmVfeXlz Y2FuX3QgeXlzY2FubmVyOwotCWNvcmVfeXlfZXh0cmFfdHlwZSB5eWV4dHJhOwotCWNvcmVfWVlT VFlQRSB5eWx2YWw7Ci0JWVlMVFlQRQkJeXlsbG9jOwotCi0JLyoKLQkgKiBTb3J0IHRoZSByZWNv cmRzIGJ5IGxvY2F0aW9uIHNvIHRoYXQgd2UgY2FuIHByb2Nlc3MgdGhlbSBpbiBvcmRlciB3aGls ZQotCSAqIHNjYW5uaW5nIHRoZSBxdWVyeSB0ZXh0LgotCSAqLwotCWlmIChqc3RhdGUtPmNsb2Nh dGlvbnNfY291bnQgPiAxKQotCQlxc29ydChqc3RhdGUtPmNsb2NhdGlvbnMsIGpzdGF0ZS0+Y2xv Y2F0aW9uc19jb3VudCwKLQkJCSAgc2l6ZW9mKExvY2F0aW9uTGVuKSwgY29tcF9sb2NhdGlvbik7 Ci0JbG9jcyA9IGpzdGF0ZS0+Y2xvY2F0aW9uczsKLQotCS8qIGluaXRpYWxpemUgdGhlIGZsZXgg c2Nhbm5lciAtLS0gc2hvdWxkIG1hdGNoIHJhd19wYXJzZXIoKSAqLwotCXl5c2Nhbm5lciA9IHNj YW5uZXJfaW5pdChxdWVyeSwKLQkJCQkJCQkgJnl5ZXh0cmEsCi0JCQkJCQkJICZTY2FuS2V5d29y ZHMsCi0JCQkJCQkJIFNjYW5LZXl3b3JkVG9rZW5zKTsKLQotCS8qIFNlYXJjaCBmb3IgZWFjaCBj b25zdGFudCwgaW4gc2VxdWVuY2UgKi8KLQlmb3IgKGludCBpID0gMDsgaSA8IGpzdGF0ZS0+Y2xv Y2F0aW9uc19jb3VudDsgaSsrKQotCXsKLQkJaW50CQkJbG9jOwotCQlpbnQJCQl0b2s7Ci0KLQkJ LyogSWdub3JlIGNvbnN0YW50cyBhZnRlciB0aGUgZmlyc3Qgb25lIGluIHRoZSBzYW1lIGxvY2F0 aW9uICovCi0JCWlmIChpID4gMCAmJiBsb2NzW2ldLmxvY2F0aW9uID09IGxvY3NbaSAtIDFdLmxv Y2F0aW9uKQotCQl7Ci0JCQlsb2NzW2ldLmxlbmd0aCA9IC0xOwotCQkJY29udGludWU7Ci0JCX0K LQotCQlpZiAobG9jc1tpXS5zcXVhc2hlZCkKLQkJCWNvbnRpbnVlOwkJCS8qIHNxdWFzaGFibGUg bGlzdCwgaWdub3JlICovCi0KLQkJLyogQWRqdXN0IHJlY29yZGVkIGxvY2F0aW9uIGlmIHdlJ3Jl IGRlYWxpbmcgd2l0aCBwYXJ0aWFsIHN0cmluZyAqLwotCQlsb2MgPSBsb2NzW2ldLmxvY2F0aW9u IC0gcXVlcnlfbG9jOwotCQlBc3NlcnQobG9jID49IDApOwotCi0JCS8qCi0JCSAqIFdlIGhhdmUg YSB2YWxpZCBsb2NhdGlvbiBmb3IgYSBjb25zdGFudCB0aGF0J3Mgbm90IGEgZHVwZS4gTGV4Ci0J CSAqIHRva2VucyB1bnRpbCB3ZSBmaW5kIHRoZSBkZXNpcmVkIGNvbnN0YW50LgotCQkgKi8KLQkJ Zm9yICg7OykKLQkJewotCQkJdG9rID0gY29yZV95eWxleCgmeXlsdmFsLCAmeXlsbG9jLCB5eXNj YW5uZXIpOwotCi0JCQkvKiBXZSBzaG91bGQgbm90IGhpdCBlbmQtb2Ytc3RyaW5nLCBidXQgaWYg d2UgZG8sIGJlaGF2ZSBzYW5lbHkgKi8KLQkJCWlmICh0b2sgPT0gMCkKLQkJCQlicmVhazsJCQkv KiBvdXQgb2YgaW5uZXIgZm9yLWxvb3AgKi8KLQotCQkJLyoKLQkJCSAqIFdlIHNob3VsZCBmaW5k IHRoZSB0b2tlbiBwb3NpdGlvbiBleGFjdGx5LCBidXQgaWYgd2Ugc29tZWhvdwotCQkJICogcnVu IHBhc3QgaXQsIHdvcmsgd2l0aCB0aGF0LgotCQkJICovCi0JCQlpZiAoeXlsbG9jID49IGxvYykK LQkJCXsKLQkJCQlpZiAocXVlcnlbbG9jXSA9PSAnLScpCi0JCQkJewotCQkJCQkvKgotCQkJCQkg KiBJdCdzIGEgbmVnYXRpdmUgdmFsdWUgLSB0aGlzIGlzIHRoZSBvbmUgYW5kIG9ubHkgY2FzZQot CQkJCQkgKiB3aGVyZSB3ZSByZXBsYWNlIG1vcmUgdGhhbiBhIHNpbmdsZSB0b2tlbi4KLQkJCQkJ ICoKLQkJCQkJICogRG8gbm90IGNvbXBlbnNhdGUgZm9yIHRoZSBjb3JlIHN5c3RlbSdzIHNwZWNp YWwtY2FzZQotCQkJCQkgKiBhZGp1c3RtZW50IG9mIGxvY2F0aW9uIHRvIHRoYXQgb2YgdGhlIGxl YWRpbmcgJy0nCi0JCQkJCSAqIG9wZXJhdG9yIGluIHRoZSBldmVudCBvZiBhIG5lZ2F0aXZlIGNv bnN0YW50LiAgSXQgaXMKLQkJCQkJICogYWxzbyB1c2VmdWwgZm9yIG91ciBwdXJwb3NlcyB0byBz dGFydCBmcm9tIHRoZSBtaW51cwotCQkJCQkgKiBzeW1ib2wuICBJbiB0aGlzIHdheSwgcXVlcmll cyBsaWtlICJzZWxlY3QgKiBmcm9tIGZvbwotCQkJCQkgKiB3aGVyZSBiYXIgPSAxIiBhbmQgInNl bGVjdCAqIGZyb20gZm9vIHdoZXJlIGJhciA9IC0yIgotCQkJCQkgKiB3aWxsIGhhdmUgaWRlbnRp Y2FsIG5vcm1hbGl6ZWQgcXVlcnkgc3RyaW5ncy4KLQkJCQkJICovCi0JCQkJCXRvayA9IGNvcmVf eXlsZXgoJnl5bHZhbCwgJnl5bGxvYywgeXlzY2FubmVyKTsKLQkJCQkJaWYgKHRvayA9PSAwKQot CQkJCQkJYnJlYWs7CS8qIG91dCBvZiBpbm5lciBmb3ItbG9vcCAqLwotCQkJCX0KLQotCQkJCS8q Ci0JCQkJICogV2Ugbm93IHJlbHkgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBmbGV4IGhhcyBwbGFj ZWQgYSB6ZXJvCi0JCQkJICogYnl0ZSBhZnRlciB0aGUgdGV4dCBvZiB0aGUgY3VycmVudCB0b2tl biBpbiBzY2FuYnVmLgotCQkJCSAqLwotCQkJCWxvY3NbaV0ubGVuZ3RoID0gc3RybGVuKHl5ZXh0 cmEuc2NhbmJ1ZiArIGxvYyk7Ci0JCQkJYnJlYWs7CQkJLyogb3V0IG9mIGlubmVyIGZvci1sb29w ICovCi0JCQl9Ci0JCX0KLQotCQkvKiBJZiB3ZSBoaXQgZW5kLW9mLXN0cmluZywgZ2l2ZSB1cCwg bGVhdmluZyByZW1haW5pbmcgbGVuZ3RocyAtMSAqLwotCQlpZiAodG9rID09IDApCi0JCQlicmVh azsKLQl9Ci0KLQlzY2FubmVyX2ZpbmlzaCh5eXNjYW5uZXIpOwotfQotCi0vKgotICogY29tcF9s b2NhdGlvbjogY29tcGFyYXRvciBmb3IgcXNvcnRpbmcgTG9jYXRpb25MZW4gc3RydWN0cyBieSBs b2NhdGlvbgotICovCi1zdGF0aWMgaW50Ci1jb21wX2xvY2F0aW9uKGNvbnN0IHZvaWQgKmEsIGNv bnN0IHZvaWQgKmIpCi17Ci0JaW50CQkJbCA9ICgoY29uc3QgTG9jYXRpb25MZW4gKikgYSktPmxv Y2F0aW9uOwotCWludAkJCXIgPSAoKGNvbnN0IExvY2F0aW9uTGVuICopIGIpLT5sb2NhdGlvbjsK LQotCXJldHVybiBwZ19jbXBfczMyKGwsIHIpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQv bm9kZXMvcXVlcnlqdW1ibGVmdW5jcy5jIGIvc3JjL2JhY2tlbmQvbm9kZXMvcXVlcnlqdW1ibGVm dW5jcy5jCmluZGV4IDg3ZGI4ZGMxYTMyLi5lY2ZiZDViZDAzNSAxMDA2NDQKLS0tIGEvc3JjL2Jh Y2tlbmQvbm9kZXMvcXVlcnlqdW1ibGVmdW5jcy5jCisrKyBiL3NyYy9iYWNrZW5kL25vZGVzL3F1 ZXJ5anVtYmxlZnVuY3MuYwpAQCAtNDAsMTAgKzQwLDEyIEBACiAjaW5jbHVkZSAiYWNjZXNzL3Ry YW5zYW0uaCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX3Byb2MuaCIKICNpbmNsdWRlICJjb21tb24v aGFzaGZuLmgiCisjaW5jbHVkZSAiY29tbW9uL2ludC5oIgogI2luY2x1ZGUgIm1pc2NhZG1pbi5o IgogI2luY2x1ZGUgIm5vZGVzL25vZGVGdW5jcy5oIgogI2luY2x1ZGUgIm5vZGVzL3F1ZXJ5anVt YmxlLmgiCiAjaW5jbHVkZSAidXRpbHMvbHN5c2NhY2hlLmgiCisjaW5jbHVkZSAicGFyc2VyL3Nj YW5uZXIuaCIKICNpbmNsdWRlICJwYXJzZXIvc2NhbnN1cC5oIgogCiAjZGVmaW5lIEpVTUJMRV9T SVpFCQkJCTEwMjQJLyogcXVlcnkgc2VyaWFsaXphdGlvbiBidWZmZXIgc2l6ZSAqLwpAQCAtNzcz LDMgKzc3NSwxNDkgQEAgX2p1bWJsZVJhbmdlVGJsRW50cnlfZXJlZihKdW1ibGVTdGF0ZSAqanN0 YXRlLAogCSAqLwogCUpVTUJMRV9TVFJJTkcoYWxpYXNuYW1lKTsKIH0KKworLyoKKyAqIENvbXBM b2NhdGlvbjogY29tcGFyYXRvciBmb3IgcXNvcnRpbmcgTG9jYXRpb25MZW4gc3RydWN0cyBieSBs b2NhdGlvbgorICovCitzdGF0aWMgaW50CitDb21wTG9jYXRpb24oY29uc3Qgdm9pZCAqYSwgY29u c3Qgdm9pZCAqYikKK3sKKwlpbnQJCQlsID0gKChjb25zdCBMb2NhdGlvbkxlbiAqKSBhKS0+bG9j YXRpb247CisJaW50CQkJciA9ICgoY29uc3QgTG9jYXRpb25MZW4gKikgYiktPmxvY2F0aW9uOwor CisJcmV0dXJuIHBnX2NtcF9zMzIobCwgcik7Cit9CisKKy8qCisgKiBHaXZlbiBhIHZhbGlkIFNR TCBzdHJpbmcgYW5kIGFuIGFycmF5IG9mIGNvbnN0YW50LWxvY2F0aW9uIHJlY29yZHMsIHJldHVy bgorICogdGhlIHRleHR1YWwgbGVuZ3RocyBvZiB0aG9zZSBjb25zdGFudHMgaW4gYSBuZXdseSBh bGxvY2F0ZWQgTG9jYXRpb25MZW4KKyAqIGFycmF5LCBvciBOVUxMIGlmIHRoZXJlIGFyZSBubyBj b25zdGFudHMuIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eQorICogdG8gcGZyZWUg dGhlIHJlc3VsdCwgaWYgbmVjZXNzYXJ5LgorICoKKyAqIFRoZSBjb25zdGFudHMgbWF5IHVzZSBh bnkgYWxsb3dlZCBjb25zdGFudCBzeW50YXgsIHN1Y2ggYXMgZmxvYXQgbGl0ZXJhbHMsCisgKiBi aXQtc3RyaW5ncywgc2luZ2xlLXF1b3RlZCBzdHJpbmdzIGFuZCBkb2xsYXItcXVvdGVkIHN0cmlu Z3MuICBUaGlzIGlzCisgKiBhY2NvbXBsaXNoZWQgYnkgdXNpbmcgdGhlIHB1YmxpYyBBUEkgZm9y IHRoZSBjb3JlIHNjYW5uZXIuCisgKgorICogTXVsdGlwbGUgY29uc3RhbnRzIGNhbiBoYXZlIHRo ZSBzYW1lIGxvY2F0aW9uLiAgV2UgcmVzZXQgbGVuZ3RocyBvZiB0aG9zZQorICogcGFzdCB0aGUg Zmlyc3QgdG8gLTEgc28gdGhhdCB0aGV5IGNhbiBsYXRlciBiZSBpZ25vcmVkLgorICoKKyAqIElm IHF1ZXJ5X2xvYyA+IDAsIHRoZW4gInF1ZXJ5IiBoYXMgYmVlbiBhZHZhbmNlZCBieSB0aGF0IG11 Y2ggY29tcGFyZWQgdG8KKyAqIHRoZSBvcmlnaW5hbCBzdHJpbmcgc3RhcnQsIGFzIGlzIHRoZSBj YXNlIHdpdGggbXVsdGktc3RhdGVtZW50IHN0cmluZ3MsIHNvCisgKiB3ZSBuZWVkIHRvIHRyYW5z bGF0ZSB0aGUgcHJvdmlkZWQgbG9jYXRpb25zIHRvIGNvbXBlbnNhdGUuICAoVGhpcyBsZXRzIHVz CisgKiBhdm9pZCByZS1zY2FubmluZyBzdGF0ZW1lbnRzIGJlZm9yZSB0aGUgb25lIG9mIGludGVy ZXN0LCBzbyBpdCdzIHdvcnRoIGRvaW5nLikKKyAqCisgKiBOLkIuIFRoZXJlIGlzIGFuIGFzc3Vt cHRpb24gdGhhdCBhICctJyBjaGFyYWN0ZXIgYXQgYSBDb25zdCBsb2NhdGlvbiBiZWdpbnMKKyAq IGEgbmVnYXRpdmUgbnVtZXJpYyBjb25zdGFudC4gIFRoaXMgcHJlY2x1ZGVzIHRoZXJlIGV2ZXIg YmVpbmcgYW5vdGhlcgorICogcmVhc29uIGZvciBhIGNvbnN0YW50IHRvIHN0YXJ0IHdpdGggYSAn LScuCisgKi8KK0xvY2F0aW9uTGVuICoKK0NvbXB1dGVDb25zdGFudExlbmd0aHMoY29uc3QgSnVt YmxlU3RhdGUgKmpzdGF0ZSwgY29uc3QgY2hhciAqcXVlcnksCisJCQkJCSAgIGludCBxdWVyeV9s b2MpCit7CisJTG9jYXRpb25MZW4gKmxvY3M7CisJY29yZV95eXNjYW5fdCB5eXNjYW5uZXI7CisJ Y29yZV95eV9leHRyYV90eXBlIHl5ZXh0cmE7CisJY29yZV9ZWVNUWVBFIHl5bHZhbDsKKwlZWUxU WVBFCQl5eWxsb2M7CisKKwlpZiAoanN0YXRlLT5jbG9jYXRpb25zX2NvdW50ID09IDApCisJCXJl dHVybiBOVUxMOworCisJLyogQ29weSBjb25zdGFudCBsb2NhdGlvbnMgdG8gYXZvaWQgbW9kaWZ5 aW5nIGpzdGF0ZSAqLworCWxvY3MgPSBwYWxsb2NfYXJyYXkoTG9jYXRpb25MZW4sIGpzdGF0ZS0+ Y2xvY2F0aW9uc19jb3VudCk7CisJbWVtY3B5KGxvY3MsIGpzdGF0ZS0+Y2xvY2F0aW9ucywganN0 YXRlLT5jbG9jYXRpb25zX2NvdW50ICogc2l6ZW9mKExvY2F0aW9uTGVuKSk7CisKKwkvKgorCSAq IFNvcnQgdGhlIHJlY29yZHMgYnkgbG9jYXRpb24gc28gdGhhdCB3ZSBjYW4gcHJvY2VzcyB0aGVt IGluIG9yZGVyIHdoaWxlCisJICogc2Nhbm5pbmcgdGhlIHF1ZXJ5IHRleHQuCisJICovCisJaWYg KGpzdGF0ZS0+Y2xvY2F0aW9uc19jb3VudCA+IDEpCisJCXFzb3J0KGxvY3MsIGpzdGF0ZS0+Y2xv Y2F0aW9uc19jb3VudCwKKwkJCSAgc2l6ZW9mKExvY2F0aW9uTGVuKSwgQ29tcExvY2F0aW9uKTsK KworCS8qIGluaXRpYWxpemUgdGhlIGZsZXggc2Nhbm5lciAtLS0gc2hvdWxkIG1hdGNoIHJhd19w YXJzZXIoKSAqLworCXl5c2Nhbm5lciA9IHNjYW5uZXJfaW5pdChxdWVyeSwKKwkJCQkJCQkgJnl5 ZXh0cmEsCisJCQkJCQkJICZTY2FuS2V5d29yZHMsCisJCQkJCQkJIFNjYW5LZXl3b3JkVG9rZW5z KTsKKworCS8qIFNlYXJjaCBmb3IgZWFjaCBjb25zdGFudCwgaW4gc2VxdWVuY2UgKi8KKwlmb3Ig KGludCBpID0gMDsgaSA8IGpzdGF0ZS0+Y2xvY2F0aW9uc19jb3VudDsgaSsrKQorCXsKKwkJaW50 CQkJbG9jOworCQlpbnQJCQl0b2s7CisKKwkJLyogSWdub3JlIGNvbnN0YW50cyBhZnRlciB0aGUg Zmlyc3Qgb25lIGluIHRoZSBzYW1lIGxvY2F0aW9uICovCisJCWlmIChpID4gMCAmJiBsb2NzW2ld LmxvY2F0aW9uID09IGxvY3NbaSAtIDFdLmxvY2F0aW9uKQorCQl7CisJCQlsb2NzW2ldLmxlbmd0 aCA9IC0xOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobG9jc1tpXS5zcXVhc2hlZCkKKwkJ CWNvbnRpbnVlOwkJCS8qIHNxdWFzaGFibGUgbGlzdCwgaWdub3JlICovCisKKwkJLyoKKwkJICog QWRqdXN0IHRoZSBjb25zdGFudCdzIGxvY2F0aW9uIHVzaW5nIHRoZSBwcm92aWRlZCBzdGFydGlu ZyBsb2NhdGlvbgorCQkgKiBvZiB0aGUgY3VycmVudCBzdGF0ZW1lbnQuIFRoaXMgYWxsb3dzIHVz IHRvIGF2b2lkIHNjYW5uaW5nIGEKKwkJICogbXVsdGktc3RhdGVtZW50IHN0cmluZyBmcm9tIHRo ZSBiZWdpbm5pbmcuCisJCSAqLworCQlsb2MgPSBsb2NzW2ldLmxvY2F0aW9uIC0gcXVlcnlfbG9j OworCQlBc3NlcnQobG9jID49IDApOworCisJCS8qCisJCSAqIFdlIGhhdmUgYSB2YWxpZCBsb2Nh dGlvbiBmb3IgYSBjb25zdGFudCB0aGF0J3Mgbm90IGEgZHVwZS4gTGV4CisJCSAqIHRva2VucyB1 bnRpbCB3ZSBmaW5kIHRoZSBkZXNpcmVkIGNvbnN0YW50LgorCQkgKi8KKwkJZm9yICg7OykKKwkJ eworCQkJdG9rID0gY29yZV95eWxleCgmeXlsdmFsLCAmeXlsbG9jLCB5eXNjYW5uZXIpOworCisJ CQkvKiBXZSBzaG91bGQgbm90IGhpdCBlbmQtb2Ytc3RyaW5nLCBidXQgaWYgd2UgZG8sIGJlaGF2 ZSBzYW5lbHkgKi8KKwkJCWlmICh0b2sgPT0gMCkKKwkJCQlicmVhazsJCQkvKiBvdXQgb2YgaW5u ZXIgZm9yLWxvb3AgKi8KKworCQkJLyoKKwkJCSAqIFdlIHNob3VsZCBmaW5kIHRoZSB0b2tlbiBw b3NpdGlvbiBleGFjdGx5LCBidXQgaWYgd2Ugc29tZWhvdworCQkJICogcnVuIHBhc3QgaXQsIHdv cmsgd2l0aCB0aGF0LgorCQkJICovCisJCQlpZiAoeXlsbG9jID49IGxvYykKKwkJCXsKKwkJCQlp ZiAocXVlcnlbbG9jXSA9PSAnLScpCisJCQkJeworCQkJCQkvKgorCQkJCQkgKiBJdCdzIGEgbmVn YXRpdmUgdmFsdWUgLSB0aGlzIGlzIHRoZSBvbmUgYW5kIG9ubHkgY2FzZQorCQkJCQkgKiB3aGVy ZSB3ZSByZXBsYWNlIG1vcmUgdGhhbiBhIHNpbmdsZSB0b2tlbi4KKwkJCQkJICoKKwkJCQkJICog RG8gbm90IGNvbXBlbnNhdGUgZm9yIHRoZSBzcGVjaWFsLWNhc2UgYWRqdXN0bWVudCBvZgorCQkJ CQkgKiBsb2NhdGlvbiB0byB0aGF0IG9mIHRoZSBsZWFkaW5nICctJyBvcGVyYXRvciBpbiB0aGUK KwkJCQkJICogZXZlbnQgb2YgYSBuZWdhdGl2ZSBjb25zdGFudCAoc2VlIGRvTmVnYXRlKCkgaW4K KwkJCQkJICogZ3JhbS55KS4gIEl0IGlzIGFsc28gdXNlZnVsIGZvciBvdXIgcHVycG9zZXMgdG8g c3RhcnQKKwkJCQkJICogZnJvbSB0aGUgbWludXMgc3ltYm9sLiAgSW4gdGhpcyB3YXksIHF1ZXJp ZXMgbGlrZQorCQkJCQkgKiAic2VsZWN0ICogZnJvbSBmb28gd2hlcmUgYmFyID0gMSIgYW5kICJz ZWxlY3QgKiBmcm9tCisJCQkJCSAqIGZvbyB3aGVyZSBiYXIgPSAtMiIgd2lsbCBoYXZlIGlkZW50 aWNhbCBub3JtYWxpemVkCisJCQkJCSAqIHF1ZXJ5IHN0cmluZ3MuCisJCQkJCSAqLworCQkJCQl0 b2sgPSBjb3JlX3l5bGV4KCZ5eWx2YWwsICZ5eWxsb2MsIHl5c2Nhbm5lcik7CisJCQkJCWlmICh0 b2sgPT0gMCkKKwkJCQkJCWJyZWFrOwkvKiBvdXQgb2YgaW5uZXIgZm9yLWxvb3AgKi8KKwkJCQl9 CisKKwkJCQkvKgorCQkJCSAqIFdlIG5vdyByZWx5IG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgZmxl eCBoYXMgcGxhY2VkIGEgemVybworCQkJCSAqIGJ5dGUgYWZ0ZXIgdGhlIHRleHQgb2YgdGhlIGN1 cnJlbnQgdG9rZW4gaW4gc2NhbmJ1Zi4KKwkJCQkgKi8KKwkJCQlsb2NzW2ldLmxlbmd0aCA9IHN0 cmxlbih5eWV4dHJhLnNjYW5idWYgKyBsb2MpOworCQkJCWJyZWFrOwkJCS8qIG91dCBvZiBpbm5l ciBmb3ItbG9vcCAqLworCQkJfQorCQl9CisKKwkJLyogSWYgd2UgaGl0IGVuZC1vZi1zdHJpbmcs IGdpdmUgdXAsIGxlYXZpbmcgcmVtYWluaW5nIGxlbmd0aHMgLTEgKi8KKwkJaWYgKHRvayA9PSAw KQorCQkJYnJlYWs7CisJfQorCisJc2Nhbm5lcl9maW5pc2goeXlzY2FubmVyKTsKKworCXJldHVy biBsb2NzOworfQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvbm9kZXMvcXVlcnlqdW1ibGUuaCBi L3NyYy9pbmNsdWRlL25vZGVzL3F1ZXJ5anVtYmxlLmgKaW5kZXggOWY4MTg5MzAwM2MuLmYzMzE0 NDliYTc4IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9ub2Rlcy9xdWVyeWp1bWJsZS5oCisrKyBi L3NyYy9pbmNsdWRlL25vZGVzL3F1ZXJ5anVtYmxlLmgKQEAgLTkxLDYgKzkxLDkgQEAgZXh0ZXJu IFBHRExMSU1QT1JUIGludCBjb21wdXRlX3F1ZXJ5X2lkOwogCiAKIGV4dGVybiBjb25zdCBjaGFy ICpDbGVhblF1ZXJ5dGV4dChjb25zdCBjaGFyICpxdWVyeSwgaW50ICpsb2NhdGlvbiwgaW50ICps ZW4pOworZXh0ZXJuIExvY2F0aW9uTGVuICpDb21wdXRlQ29uc3RhbnRMZW5ndGhzKGNvbnN0IEp1 bWJsZVN0YXRlICpqc3RhdGUsCisJCQkJCQkJCQkJICAgY29uc3QgY2hhciAqcXVlcnksCisJCQkJ CQkJCQkJICAgaW50IHF1ZXJ5X2xvYyk7CiBleHRlcm4gSnVtYmxlU3RhdGUgKkp1bWJsZVF1ZXJ5 KFF1ZXJ5ICpxdWVyeSk7CiBleHRlcm4gdm9pZCBFbmFibGVRdWVyeUlkKHZvaWQpOwogCmRpZmYg LS1naXQgYS9zcmMvaW5jbHVkZS9wYXJzZXIvYW5hbHl6ZS5oIGIvc3JjL2luY2x1ZGUvcGFyc2Vy L2FuYWx5emUuaAppbmRleCBlMTAyNzBmZjBmZi4uYjJkYjZmYTRlOGMgMTAwNjQ0Ci0tLSBhL3Ny Yy9pbmNsdWRlL3BhcnNlci9hbmFseXplLmgKKysrIGIvc3JjL2luY2x1ZGUvcGFyc2VyL2FuYWx5 emUuaApAQCAtMjEsNyArMjEsNyBAQAogLyogSG9vayBmb3IgcGx1Z2lucyB0byBnZXQgY29udHJv bCBhdCBlbmQgb2YgcGFyc2UgYW5hbHlzaXMgKi8KIHR5cGVkZWYgdm9pZCAoKnBvc3RfcGFyc2Vf YW5hbHl6ZV9ob29rX3R5cGUpIChQYXJzZVN0YXRlICpwc3RhdGUsCiAJCQkJCQkJCQkJCSAgUXVl cnkgKnF1ZXJ5LAotCQkJCQkJCQkJCQkgIEp1bWJsZVN0YXRlICpqc3RhdGUpOworCQkJCQkJCQkJ CQkgIGNvbnN0IEp1bWJsZVN0YXRlICpqc3RhdGUpOwogZXh0ZXJuIFBHRExMSU1QT1JUIHBvc3Rf cGFyc2VfYW5hbHl6ZV9ob29rX3R5cGUgcG9zdF9wYXJzZV9hbmFseXplX2hvb2s7CiAKIAotLSAK Mi40Ny4xCgo= --0000000000007260fa064e616a59--