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 1wDgXw-003F0H-1x for pgsql-hackers@arkaria.postgresql.org; Fri, 17 Apr 2026 10:35:37 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wDgXu-009Uhy-1H for pgsql-hackers@arkaria.postgresql.org; Fri, 17 Apr 2026 10:35:34 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wDgXu-009Uhp-05 for pgsql-hackers@lists.postgresql.org; Fri, 17 Apr 2026 10:35:34 +0000 Received: from mail-qk1-x72c.google.com ([2607:f8b0:4864:20::72c]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wDgXr-00000001dmM-3eiy for pgsql-hackers@lists.postgresql.org; Fri, 17 Apr 2026 10:35:33 +0000 Received: by mail-qk1-x72c.google.com with SMTP id af79cd13be357-8d736211595so29418385a.0 for ; Fri, 17 Apr 2026 03:35:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1776422129; cv=none; d=google.com; s=arc-20240605; b=jdbQWLscuy6jUANbKjyLEDiXyXHYxGgr04rQTMG4HlHEV1wk+BF8fs3hhuc9tTsCDt 7fv0jMy/KKFswo8yu36x9JKTKQ0sT38BiiO9Z7c82StgcUOScYPICdDSVimFrYDoaxGl KyCw8z7dxraJoK1ugvBKZz4Wt5Uoatpc769qcJXZnM2ttjJu+aiN4e5+tfREqXwTLWQI IrCSFSfO/sCsr/6Qjw3bVTEIil75fjhfV8Psqs7REMPQOZarYhuH0wkG1bMcS5TMX7pF BYzFlMYHe1soxK8jhORGeLUpqpYho77d72qG8D4f2PoHcTOdGlSKh5CKjT0yPT7oIykz 9CUA== 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=pCwba6hbXnLmPO1GPQA14ySoDvpJ8nG4aFvYID7hWfc=; fh=/I73sdlWVZB+w6oUSl6HbHgHU5A1QNIrqj0m+gYfwwQ=; b=Dt3LtKXmSvWwM5eExlLPUmNUNbpSud3VrKJN4fqsY4ej5qhivstk2qS/zYH3zKOCof zDtqf/PMV1P1u3wCuHXYEzGZwH/l8n8YDQ2NC+RuME0H+y6P7yHNzBLDy4xeBn/092pZ SwpHMLMkiQ88BXDBW6Hz3LY7jXdqgij7amjsDXwNvejggmQbmyed5aQtPaOYDFWlMZ0x ag0NxFuAY4Y3iJ8XidtBlLJGS2ocq9Okmf6OATXAmnxtYGcqkBDXPCWTFQFZU34p5cul rRnLAVmLml2RUyzK9/1A4AMZIcZcpCsFqyofxK4XFyOmu3nZRAl9wvHav+iVH76iAuzl dNqQ==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776422129; x=1777026929; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=pCwba6hbXnLmPO1GPQA14ySoDvpJ8nG4aFvYID7hWfc=; b=nAmGacpDJ/4U9KRXU3VxbYXnj2z/yWC6AaHKuJttFIz5e0LsXhitnrdxl97QkUJrL3 iMexMEFYME3AVlPjW9PsGwboYgg0AFP+VAa+awhHnBJHmzsM3hRkTwXJ57iENsNgxQy8 3X3Jjwc+T7sNYEMy4K0mBrd2mSenaf9Cqp+tU1bYBB9EHFSFjWAghsQwxmkqK8tGYyPV 2WklnP5ekiFM6eqQeMuQv4iGbxNafo3iuGUAr0xsf3MKrg8LNKO3+gUhBD/09cczRQYM sVLnsxB3Dx/67Y3hAK5qgaf9OxAM98p3HxTlANqWrxF+7mDxMat3Okoih2O+ihiFdxti zXEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776422129; x=1777026929; 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=pCwba6hbXnLmPO1GPQA14ySoDvpJ8nG4aFvYID7hWfc=; b=Mn33J5k/T7foBYmLiPorZ29v1KddqBRlqPpJUi5oO7hNzbzk3HqNBnkFtH+dczNQbX l001U7anLH8sTvFZrG8LmJA6B4VfrNIeSe96qemS6819JXMt/dugLN5eBhYwHX9gKm7c u4XXrX7rUHLpe18jPS4WtetfxycGNW51bC3j9TxiPH0CQozc8Oukv5u04GVQXssL/FBh iy9Y9NT4cwGAC1R1ao1qKh/C0+Pv8Jh7cwa1fUCpIrtHjfNX77P3hWbXJDyHboS6XGl5 gEg+Y/nvkU7bdhCp47z61K6JwZgyLTrIBFZEQAi6UP1BklVcwJWRX9tqzsj9miYIubku eWkA== X-Forwarded-Encrypted: i=1; AFNElJ+s9Bs+2ysogXtJ0vlFOJ5eVqNQAgQGcuCae+qxjRsHraC1ULO1BpVaaamVdO7k/62dfzFFShj/17KCqpVo@lists.postgresql.org X-Gm-Message-State: AOJu0Yzi4s56gmsjZgNofTnQ7idlcoxw4LMscm1AQyvWIREn1VgQOAvm 6vnam6RoWkParZ4s2ll+2iqjLSG4r7YX5+37E2BOelYAnoX42Id7U5608GN8urDx0mV4eypi0Yf EyzfJzRA+rFgGaBxcbRVu8Qa86BINDTA= X-Gm-Gg: AeBDiesrkhafHKlOAlCavaptkIBLOSXtxvn1brn05MKP81Zsy3gapwH5Sg7Yzv7kv7L +349myhcLDVSFtTiPWU2v442u89lf9NeeHWOKgwDi0v940EuxT2UNqLGN+dhFPPG4BrlQoj6QaR m60CSF18+MEUzCn+/Dgs7ipZhwGDsN+UMMFA5cT+SJvgJpH57vV+P+Xtt8uF58o98HxsOkqUteH fPT0Dn64SgJK/n86rEMQTuiNOXTwMf46qUhU5gmRoFoDbjSODRO+ux4AV+ieVPOYCBSPPNevsbl ogqlFbl5re1vO2WUaLX0q4O2pOMZrVqSNnYp+1cC9FUcUiDmr2p2 X-Received: by 2002:a05:6214:3913:b0:8a0:6d76:325a with SMTP id 6a1803df08f44-8b028072f8amr35670866d6.20.1776422129136; Fri, 17 Apr 2026 03:35:29 -0700 (PDT) MIME-Version: 1.0 References: <22B4A33A-99F3-46F5-BE0C-426A9E1D9ABA@gmail.com> <8D1CD3EB-BF72-4C73-AF24-D88581AC01BE@gmail.com> In-Reply-To: <8D1CD3EB-BF72-4C73-AF24-D88581AC01BE@gmail.com> From: Dean Rasheed Date: Fri, 17 Apr 2026 11:35:17 +0100 X-Gm-Features: AQROBzAnbvZ7W-4BIxJzPG5Osav6cnDZxJ62PWaoUCGpe6yd-rq5dlvEAOaBfxM Message-ID: Subject: Re: Bug: Rule actions see wrong values for generated columns (NEW.gen reads OLD value) To: Chao Li Cc: Richard Guo , SATYANARAYANA NARLAPURAM , PostgreSQL Hackers , Peter Eisentraut Content-Type: multipart/mixed; boundary="000000000000fb0609064fa58129" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000fb0609064fa58129 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, 14 Apr 2026 at 07:29, Chao Li wrote: > > > On Apr 14, 2026, at 11:27, Richard Guo wrote: > > > > It could be made to work by pre-resolving the generation expressions' > > base column Vars before adding them to the UPDATE's targetlist. For > > each generated column, we'd call ReplaceVarsFromTargetList on the > > generation expression to resolve its base column Vars, then add the > > fully resolved expression to the targetlist. But this seems to add > > code complexity. And I'm not sure about the performance difference > > between these two approaches. I expect that rule action trees are > > typically small. > > > My implementation has pre-resolved the generation expressions, that=E2=80= =99s why all tests passed. But I agree my change is heavier as I had to add= a new static helper function. > > If we think rule actions are usually small enough that the extra full-tre= e pass would not be an issue, then v1 may be preferable for simplicity. > > My only comment on v1 is the typo in generated_virtual.sql where =E2=80= =9CSTORED=E2=80=9D should be =E2=80=9CVIRTUAL=E2=80=9D. > I don't quite buy the argument that the rule action is typically small. We have no idea how big it might be. Note that, at that point in the code, sub_action is the combination of both the original query and the rule action. I do accept though that rules are not widely used, and that it's not worth optimising too much, if it means a lot of extra complexity. However, IMO, it is slightly simpler and neater to put the expanded generated columns in the replacement list used by ReplaceVarsFromTargetList() on sub_action. In the attached v2 patch, I've done that by refactoring expand_generated_columns_internal(), renaming it to get_generated_columns(), and making it just return the list of generated column expressions, rather than doing the rewrite -- I never particularly liked the separation of concerns between expand_generated_columns_internal() and expand_generated_columns_in_expr(), especially after the rest of the code expanding virtual generated columns was moved out of the rewriter, so that expand_generated_columns_in_expr() became the only caller of expand_generated_columns_internal(). Doing this simplifies the function, since it's no longer necessary to pass it node, rte, and result_relation. With that change, all rewriteRuleAction() needs to do is get the generated columns, rewrite any new.attribute references in them, and then use that list plus the original target list as the replacement list when rewriting sub_action. It is a slightly bigger patch overall, but it feels a little neater and more logical to me, but I accept that that's a subjective thing. Note: I included a minor comment update needed for build_generation_expression(), and the test fix noted above. Regards, Dean --000000000000fb0609064fa58129 Content-Type: text/x-patch; charset="US-ASCII"; name="v2-0001-Fix-incorrect-NEW-references-to-generated-columns.patch" Content-Disposition: attachment; filename="v2-0001-Fix-incorrect-NEW-references-to-generated-columns.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mo2rp1oe0 RnJvbSAyZTM2ZWUzMjdhNzk3MTYxMGFjMzk1NDE4YzllMjJiZjgxNDU4NTBkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBEZWFuIFJhc2hlZWQgPGRlYW4uYS5yYXNoZWVkQGdtYWlsLmNv bT4KRGF0ZTogRnJpLCAxNyBBcHIgMjAyNiAxMDozMDoxNCArMDEwMApTdWJqZWN0OiBbUEFUQ0gg djJdIEZpeCBpbmNvcnJlY3QgTkVXIHJlZmVyZW5jZXMgdG8gZ2VuZXJhdGVkIGNvbHVtbnMgaW4g cnVsZQogYWN0aW9ucy4KCi0tLQogc3JjL2JhY2tlbmQvcmV3cml0ZS9yZXdyaXRlSGFuZGxlci5j ICAgICAgICAgIHwgMTAwICsrKysrKysrKysrKy0tLS0tLQogLi4uL3JlZ3Jlc3MvZXhwZWN0ZWQv Z2VuZXJhdGVkX3N0b3JlZC5vdXQgICAgIHwgIDE4ICsrKysKIC4uLi9yZWdyZXNzL2V4cGVjdGVk L2dlbmVyYXRlZF92aXJ0dWFsLm91dCAgICB8ICAxOCArKysrCiBzcmMvdGVzdC9yZWdyZXNzL3Nx bC9nZW5lcmF0ZWRfc3RvcmVkLnNxbCAgICAgfCAgMTIgKysrCiBzcmMvdGVzdC9yZWdyZXNzL3Nx bC9nZW5lcmF0ZWRfdmlydHVhbC5zcWwgICAgfCAgMTIgKysrCiA1IGZpbGVzIGNoYW5nZWQsIDEy NSBpbnNlcnRpb25zKCspLCAzNSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2Vu ZC9yZXdyaXRlL3Jld3JpdGVIYW5kbGVyLmMgYi9zcmMvYmFja2VuZC9yZXdyaXRlL3Jld3JpdGVI YW5kbGVyLmMKaW5kZXggMDIxYzczZjFiNjcuLmNkOTUwZmQ0YTA3IDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC9yZXdyaXRlL3Jld3JpdGVIYW5kbGVyLmMKKysrIGIvc3JjL2JhY2tlbmQvcmV3cml0 ZS9yZXdyaXRlSGFuZGxlci5jCkBAIC05Nyw4ICs5Nyw3IEBAIHN0YXRpYyBMaXN0ICptYXRjaExv Y2tzKENtZFR5cGUgZXZlbnQsIFJlbGF0aW9uIHJlbGF0aW9uLAogCQkJCQkJaW50IHZhcm5vLCBR dWVyeSAqcGFyc2V0cmVlLCBib29sICpoYXNVcGRhdGUpOwogc3RhdGljIFF1ZXJ5ICpmaXJlUklS cnVsZXMoUXVlcnkgKnBhcnNldHJlZSwgTGlzdCAqYWN0aXZlUklScyk7CiBzdGF0aWMgQml0bWFw c2V0ICphZGp1c3Rfdmlld19jb2x1bW5fc2V0KEJpdG1hcHNldCAqY29scywgTGlzdCAqdGFyZ2V0 bGlzdCk7Ci1zdGF0aWMgTm9kZSAqZXhwYW5kX2dlbmVyYXRlZF9jb2x1bW5zX2ludGVybmFsKE5v ZGUgKm5vZGUsIFJlbGF0aW9uIHJlbCwgaW50IHJ0X2luZGV4LAotCQkJCQkJCQkJCQkgICBSYW5n ZVRibEVudHJ5ICpydGUsIGludCByZXN1bHRfcmVsYXRpb24pOworc3RhdGljIExpc3QgKmdldF9n ZW5lcmF0ZWRfY29sdW1ucyhSZWxhdGlvbiByZWwsIGludCBydF9pbmRleCwgYm9vbCBpbmNsdWRl X3N0b3JlZCk7CiAKIAogLyoKQEAgLTY0MiwxMiArNjQxLDQ2IEBAIHJld3JpdGVSdWxlQWN0aW9u KFF1ZXJ5ICpwYXJzZXRyZWUsCiAJaWYgKChldmVudCA9PSBDTURfSU5TRVJUIHx8IGV2ZW50ID09 IENNRF9VUERBVEUpICYmCiAJCXN1Yl9hY3Rpb24tPmNvbW1hbmRUeXBlICE9IENNRF9VVElMSVRZ KQogCXsKKwkJUmFuZ2VUYmxFbnRyeSAqbmV3X3J0ZSA9IHJ0X2ZldGNoKG5ld192YXJubywgc3Vi X2FjdGlvbi0+cnRhYmxlKTsKKwkJUmVsYXRpb24JbmV3X3JlbDsKKwkJTGlzdAkgICAqZ2VuX2Nv bHM7CisKKwkJLyoKKwkJICogVGhlIHRhcmdldCBsaXN0IGRvZXMgbm90IGNvbnRhaW4gZW50cmll cyBmb3IgZ2VuZXJhdGVkIGNvbHVtbnMKKwkJICogKHRoZXkgYXJlIHJlbW92ZWQgYnkgcmV3cml0 ZVRhcmdldExpc3RJVSksIHNvIHdlIG11c3QgYnVpbGQgZW50cmllcworCQkgKiBmb3IgdGhlbSBo ZXJlLCBzbyB0aGF0IG5ldy5nZW5fY29sIGNhbiBiZSByZXdyaXR0ZW4gY29ycmVjdGx5LgorCQkg Ki8KKwkJbmV3X3JlbCA9IHJlbGF0aW9uX29wZW4obmV3X3J0ZS0+cmVsaWQsIE5vTG9jayk7CisJ CWdlbl9jb2xzID0gZ2V0X2dlbmVyYXRlZF9jb2x1bW5zKG5ld19yZWwsIG5ld192YXJubywgdHJ1 ZSk7CisJCXJlbGF0aW9uX2Nsb3NlKG5ld19yZWwsIE5vTG9jayk7CisKKwkJLyoKKwkJICogVGhl IGdlbmVyYXRlZCBjb2x1bW4gZXhwcmVzc2lvbnMgdHlwaWNhbGx5IHJlZmVyIHRvIG5ldy5hdHRy aWJ1dGUsCisJCSAqIHNvIHRoZXkgbXVzdCBiZSByZXdyaXR0ZW4gYmVmb3JlIHRoZXkgY2FuIGJl IHVzZWQgYXMgcmVwbGFjZW1lbnRzLgorCQkgKi8KKwkJZ2VuX2NvbHMgPSAoTGlzdCAqKQorCQkJ UmVwbGFjZVZhcnNGcm9tVGFyZ2V0TGlzdCgoTm9kZSAqKSBnZW5fY29scywKKwkJCQkJCQkJCSAg bmV3X3Zhcm5vLAorCQkJCQkJCQkJICAwLAorCQkJCQkJCQkJICBuZXdfcnRlLAorCQkJCQkJCQkJ ICBwYXJzZXRyZWUtPnRhcmdldExpc3QsCisJCQkJCQkJCQkgIHN1Yl9hY3Rpb24tPnJlc3VsdFJl bGF0aW9uLAorCQkJCQkJCQkJICAoZXZlbnQgPT0gQ01EX1VQREFURSkgPworCQkJCQkJCQkJICBS RVBMQUNFVkFSU19DSEFOR0VfVkFSTk8gOgorCQkJCQkJCQkJICBSRVBMQUNFVkFSU19TVUJTVElU VVRFX05VTEwsCisJCQkJCQkJCQkgIGN1cnJlbnRfdmFybm8sCisJCQkJCQkJCQkgIE5VTEwpOwor CisJCS8qCisJCSAqIE5vdyByZXdyaXRlIG5ldy5hdHRyaWJ1dGUgaW4gc3ViX2FjdGlvbiwgdXNp bmcgYm90aCB0aGUgdGFyZ2V0IGxpc3QKKwkJICogYW5kIHRoZSByZXdyaXR0ZW4gZ2VuZXJhdGVk IGNvbHVtbiBleHByZXNzaW9ucy4KKwkJICovCiAJCXN1Yl9hY3Rpb24gPSAoUXVlcnkgKikKIAkJ CVJlcGxhY2VWYXJzRnJvbVRhcmdldExpc3QoKE5vZGUgKikgc3ViX2FjdGlvbiwKIAkJCQkJCQkJ CSAgbmV3X3Zhcm5vLAogCQkJCQkJCQkJICAwLAotCQkJCQkJCQkJICBydF9mZXRjaChuZXdfdmFy bm8sIHN1Yl9hY3Rpb24tPnJ0YWJsZSksCi0JCQkJCQkJCQkgIHBhcnNldHJlZS0+dGFyZ2V0TGlz dCwKKwkJCQkJCQkJCSAgbmV3X3J0ZSwKKwkJCQkJCQkJCSAgbGlzdF9jb25jYXQoZ2VuX2NvbHMs IHBhcnNldHJlZS0+dGFyZ2V0TGlzdCksCiAJCQkJCQkJCQkgIHN1Yl9hY3Rpb24tPnJlc3VsdFJl bGF0aW9uLAogCQkJCQkJCQkJICAoZXZlbnQgPT0gQ01EX1VQREFURSkgPwogCQkJCQkJCQkJICBS RVBMQUNFVkFSU19DSEFOR0VfVkFSTk8gOgpAQCAtNDUzMCwzNiArNDU2MywzMSBAQCBSZXdyaXRl UXVlcnkoUXVlcnkgKnBhcnNldHJlZSwgTGlzdCAqcmV3cml0ZV9ldmVudHMsIGludCBvcmlnX3J0 X2xlbmd0aCwKIAogCiAvKgotICogRXhwYW5kIHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbnMKLSAq Ci0gKiBJZiB0aGUgdGFibGUgY29udGFpbnMgdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1ucywgYnVp bGQgYSB0YXJnZXQgbGlzdAotICogY29udGFpbmluZyB0aGUgZXhwYW5kZWQgZXhwcmVzc2lvbnMg YW5kIHVzZSBSZXBsYWNlVmFyc0Zyb21UYXJnZXRMaXN0KCkgdG8KLSAqIGRvIHRoZSByZXBsYWNl bWVudHMuCisgKiBHZXQgYSB0YWJsZSdzIGdlbmVyYXRlZCBjb2x1bW5zCiAgKgotICogVmFycyBt YXRjaGluZyBydF9pbmRleCBhdCB0aGUgY3VycmVudCBxdWVyeSBsZXZlbCBhcmUgcmVwbGFjZWQg YnkgdGhlCi0gKiB2aXJ0dWFsIGdlbmVyYXRlZCBjb2x1bW4gZXhwcmVzc2lvbnMgZnJvbSByZWws IGlmIHRoZXJlIGFyZSBhbnkuCisgKiBJZiBpbmNsdWRlX3N0b3JlZCBpcyB0cnVlLCBib3RoIHN0 b3JlZCBhbmQgdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1ucyBhcmUKKyAqIHJldHVybmVkLiAgT3Ro ZXJ3aXNlLCBvbmx5IHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbnMgYXJlIHJldHVybmVkLgogICoK LSAqIFRoZSBjYWxsZXIgbXVzdCBhbHNvIHByb3ZpZGUgcnRlLCB0aGUgUlRFIGRlc2NyaWJpbmcg dGhlIHRhcmdldCByZWxhdGlvbiwKLSAqIGluIG9yZGVyIHRvIGhhbmRsZSBhbnkgd2hvbGUtcm93 IFZhcnMgcmVmZXJlbmNpbmcgdGhlIHRhcmdldCwgYW5kCi0gKiByZXN1bHRfcmVsYXRpb24sIHRo ZSBpbmRleCBvZiB0aGUgcmVzdWx0IHJlbGF0aW9uLCBpZiB0aGlzIGlzIHBhcnQgb2YgYW4KLSAq IElOU0VSVC9VUERBVEUvREVMRVRFL01FUkdFIHF1ZXJ5LgorICogUmV0dXJucyBhIGxpc3Qgb2Yg VGFyZ2V0RW50cnksIG9uZSBmb3IgZWFjaCBnZW5lcmF0ZWQgY29sdW1uLCBjb250YWluaW5nCisg KiB0aGUgYXR0cmlidXRlIG51bWJlcnMgYW5kIGdlbmVyYXRpb24gZXhwcmVzc2lvbnMuCiAgKi8K LXN0YXRpYyBOb2RlICoKLWV4cGFuZF9nZW5lcmF0ZWRfY29sdW1uc19pbnRlcm5hbChOb2RlICpu b2RlLCBSZWxhdGlvbiByZWwsIGludCBydF9pbmRleCwKLQkJCQkJCQkJICBSYW5nZVRibEVudHJ5 ICpydGUsIGludCByZXN1bHRfcmVsYXRpb24pCitzdGF0aWMgTGlzdCAqCitnZXRfZ2VuZXJhdGVk X2NvbHVtbnMoUmVsYXRpb24gcmVsLCBpbnQgcnRfaW5kZXgsIGJvb2wgaW5jbHVkZV9zdG9yZWQp CiB7CisJTGlzdAkgICAqZ2VuX2NvbHMgPSBOSUw7CiAJVHVwbGVEZXNjCXR1cGRlc2M7CiAKIAl0 dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihyZWwpOwotCWlmICh0dXBkZXNjLT5jb25zdHIgJiYg dHVwZGVzYy0+Y29uc3RyLT5oYXNfZ2VuZXJhdGVkX3ZpcnR1YWwpCisJaWYgKHR1cGRlc2MtPmNv bnN0ciAmJgorCQkodHVwZGVzYy0+Y29uc3RyLT5oYXNfZ2VuZXJhdGVkX3ZpcnR1YWwgfHwKKwkJ IChpbmNsdWRlX3N0b3JlZCAmJiB0dXBkZXNjLT5jb25zdHItPmhhc19nZW5lcmF0ZWRfc3RvcmVk KSkpCiAJewotCQlMaXN0CSAgICp0bGlzdCA9IE5JTDsKLQogCQlmb3IgKGludCBpID0gMDsgaSA8 IHR1cGRlc2MtPm5hdHRzOyBpKyspCiAJCXsKIAkJCUZvcm1fcGdfYXR0cmlidXRlIGF0dHIgPSBU dXBsZURlc2NBdHRyKHR1cGRlc2MsIGkpOwogCi0JCQlpZiAoYXR0ci0+YXR0Z2VuZXJhdGVkID09 IEFUVFJJQlVURV9HRU5FUkFURURfVklSVFVBTCkKKwkJCWlmIChhdHRyLT5hdHRnZW5lcmF0ZWQg PT0gQVRUUklCVVRFX0dFTkVSQVRFRF9WSVJUVUFMIHx8CisJCQkJKGluY2x1ZGVfc3RvcmVkICYm IGF0dHItPmF0dGdlbmVyYXRlZCA9PSBBVFRSSUJVVEVfR0VORVJBVEVEX1NUT1JFRCkpCiAJCQl7 CiAJCQkJTm9kZQkgICAqZGVmZXhwcjsKIAkJCQlUYXJnZXRFbnRyeSAqdGU7CkBAIC00NTY4LDE5 ICs0NTk2LDEyIEBAIGV4cGFuZF9nZW5lcmF0ZWRfY29sdW1uc19pbnRlcm5hbChOb2RlICpub2Rl LCBSZWxhdGlvbiByZWwsIGludCBydF9pbmRleCwKIAkJCQlDaGFuZ2VWYXJOb2RlcyhkZWZleHBy LCAxLCBydF9pbmRleCwgMCk7CiAKIAkJCQl0ZSA9IG1ha2VUYXJnZXRFbnRyeSgoRXhwciAqKSBk ZWZleHByLCBpICsgMSwgMCwgZmFsc2UpOwotCQkJCXRsaXN0ID0gbGFwcGVuZCh0bGlzdCwgdGUp OworCQkJCWdlbl9jb2xzID0gbGFwcGVuZChnZW5fY29scywgdGUpOwogCQkJfQogCQl9Ci0KLQkJ QXNzZXJ0KGxpc3RfbGVuZ3RoKHRsaXN0KSA+IDApOwotCi0JCW5vZGUgPSBSZXBsYWNlVmFyc0Zy b21UYXJnZXRMaXN0KG5vZGUsIHJ0X2luZGV4LCAwLCBydGUsIHRsaXN0LAotCQkJCQkJCQkJCSBy ZXN1bHRfcmVsYXRpb24sCi0JCQkJCQkJCQkJIFJFUExBQ0VWQVJTX0NIQU5HRV9WQVJOTywgcnRf aW5kZXgsCi0JCQkJCQkJCQkJIE5VTEwpOwogCX0KIAotCXJldHVybiBub2RlOworCXJldHVybiBn ZW5fY29sczsKIH0KIAogLyoKQEAgLTQ1OTcsNiArNDYxOCw3IEBAIGV4cGFuZF9nZW5lcmF0ZWRf Y29sdW1uc19pbl9leHByKE5vZGUgKm5vZGUsIFJlbGF0aW9uIHJlbCwgaW50IHJ0X2luZGV4KQog CWlmICh0dXBkZXNjLT5jb25zdHIgJiYgdHVwZGVzYy0+Y29uc3RyLT5oYXNfZ2VuZXJhdGVkX3Zp cnR1YWwpCiAJewogCQlSYW5nZVRibEVudHJ5ICpydGU7CisJCUxpc3QJICAgKnZjb2xzOwogCiAJ CXJ0ZSA9IG1ha2VOb2RlKFJhbmdlVGJsRW50cnkpOwogCQkvKiBlcmVmIG5lZWRzIHRvIGJlIHNl dCwgYnV0IHRoZSBhY3R1YWwgbmFtZSBkb2Vzbid0IG1hdHRlciAqLwpAQCAtNDYwNCwxNCArNDYy NiwxOSBAQCBleHBhbmRfZ2VuZXJhdGVkX2NvbHVtbnNfaW5fZXhwcihOb2RlICpub2RlLCBSZWxh dGlvbiByZWwsIGludCBydF9pbmRleCkKIAkJcnRlLT5ydGVraW5kID0gUlRFX1JFTEFUSU9OOwog CQlydGUtPnJlbGlkID0gUmVsYXRpb25HZXRSZWxpZChyZWwpOwogCi0JCW5vZGUgPSBleHBhbmRf Z2VuZXJhdGVkX2NvbHVtbnNfaW50ZXJuYWwobm9kZSwgcmVsLCBydF9pbmRleCwgcnRlLCAwKTsK KwkJdmNvbHMgPSBnZXRfZ2VuZXJhdGVkX2NvbHVtbnMocmVsLCBydF9pbmRleCwgZmFsc2UpOwor CisJCWlmICh2Y29scykKKwkJCW5vZGUgPSBSZXBsYWNlVmFyc0Zyb21UYXJnZXRMaXN0KG5vZGUs IHJ0X2luZGV4LCAwLCBydGUsIHZjb2xzLCAwLAorCQkJCQkJCQkJCQkgUkVQTEFDRVZBUlNfQ0hB TkdFX1ZBUk5PLCBydF9pbmRleCwKKwkJCQkJCQkJCQkJIE5VTEwpOwogCX0KIAogCXJldHVybiBu b2RlOwogfQogCiAvKgotICogQnVpbGQgdGhlIGdlbmVyYXRpb24gZXhwcmVzc2lvbiBmb3IgdGhl IHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbi4KKyAqIEJ1aWxkIHRoZSBnZW5lcmF0aW9uIGV4cHJl c3Npb24gZm9yIGEgZ2VuZXJhdGVkIGNvbHVtbi4KICAqCiAgKiBFcnJvciBvdXQgaWYgdGhlcmUg aXMgbm8gZ2VuZXJhdGlvbiBleHByZXNzaW9uIGZvdW5kIGZvciB0aGUgZ2l2ZW4gY29sdW1uLgog ICovCkBAIC00NjIzLDggKzQ2NTAsMTEgQEAgYnVpbGRfZ2VuZXJhdGlvbl9leHByZXNzaW9uKFJl bGF0aW9uIHJlbCwgaW50IGF0dHJubykKIAlOb2RlCSAgICpkZWZleHByOwogCU9pZAkJCWF0dGNv bGxpZDsKIAotCUFzc2VydChyZF9hdHQtPmNvbnN0ciAmJiByZF9hdHQtPmNvbnN0ci0+aGFzX2dl bmVyYXRlZF92aXJ0dWFsKTsKLQlBc3NlcnQoYXR0X3R1cC0+YXR0Z2VuZXJhdGVkID09IEFUVFJJ QlVURV9HRU5FUkFURURfVklSVFVBTCk7CisJQXNzZXJ0KHJkX2F0dC0+Y29uc3RyICYmCisJCSAg IChyZF9hdHQtPmNvbnN0ci0+aGFzX2dlbmVyYXRlZF92aXJ0dWFsIHx8CisJCQlyZF9hdHQtPmNv bnN0ci0+aGFzX2dlbmVyYXRlZF9zdG9yZWQpKTsKKwlBc3NlcnQoYXR0X3R1cC0+YXR0Z2VuZXJh dGVkID09IEFUVFJJQlVURV9HRU5FUkFURURfVklSVFVBTCB8fAorCQkgICBhdHRfdHVwLT5hdHRn ZW5lcmF0ZWQgPT0gQVRUUklCVVRFX0dFTkVSQVRFRF9TVE9SRUQpOwogCiAJZGVmZXhwciA9IGJ1 aWxkX2NvbHVtbl9kZWZhdWx0KHJlbCwgYXR0cm5vKTsKIAlpZiAoZGVmZXhwciA9PSBOVUxMKQpk aWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9nZW5lcmF0ZWRfc3RvcmVkLm91 dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZ2VuZXJhdGVkX3N0b3JlZC5vdXQKaW5kZXgg NGQzMjljNjA5OTQuLjQzNTM1NTYxYTk4IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4 cGVjdGVkL2dlbmVyYXRlZF9zdG9yZWQub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvZ2VuZXJhdGVkX3N0b3JlZC5vdXQKQEAgLTE2MDQsNiArMTYwNCwyNCBAQCBDUkVBVEUgVEFC TEUgZ3Rlc3QyOGIgKExJS0UgZ3Rlc3QyOGEgSU5DTFVESU5HIEdFTkVSQVRFRCk7CiAgYyAgICAg IHwgaW50ZWdlciB8ICAgICAgICAgICB8ICAgICAgICAgIHwgCiAgeCAgICAgIHwgaW50ZWdlciB8 ICAgICAgICAgICB8ICAgICAgICAgIHwgZ2VuZXJhdGVkIGFsd2F5cyBhcyAoYiAqIDIpIHN0b3Jl ZAogCistLSBydWxlIGFjdGlvbnMgcmVmZXJyaW5nIHRvIGdlbmVyYXRlZCBjb2x1bW5zOgorLS0g TkVXLmIgaW4gYSBydWxlIGFjdGlvbiBzaG91bGQgcmVmbGVjdCB0aGUgZ2VuZXJhdGVkIGNvbHVt bidzIG5ldyB2YWx1ZQorQ1JFQVRFIFRBQkxFIGd0ZXN0X3J1bGUgKGEgaW50LCBiIGludCBHRU5F UkFURUQgQUxXQVlTIEFTIChhICogMikgU1RPUkVEKTsKK0NSRUFURSBUQUJMRSBndGVzdF9ydWxl X2xvZyAob3AgdGV4dCwgb2xkX2IgaW50LCBuZXdfYiBpbnQpOworQ1JFQVRFIFJVTEUgZ3Rlc3Rf cnVsZV91cGQgQVMgT04gVVBEQVRFIFRPIGd0ZXN0X3J1bGUKKyAgRE8gQUxTTyBJTlNFUlQgSU5U TyBndGVzdF9ydWxlX2xvZyBWQUxVRVMgKCdVUEQnLCBPTEQuYiwgTkVXLmIpOworQ1JFQVRFIFJV TEUgZ3Rlc3RfcnVsZV9pbnMgQVMgT04gSU5TRVJUIFRPIGd0ZXN0X3J1bGUKKyAgRE8gQUxTTyBJ TlNFUlQgSU5UTyBndGVzdF9ydWxlX2xvZyBWQUxVRVMgKCdJTlMnLCBOVUxMLCBORVcuYik7CitJ TlNFUlQgSU5UTyBndGVzdF9ydWxlIChhKSBWQUxVRVMgKDEpOworVVBEQVRFIGd0ZXN0X3J1bGUg U0VUIGEgPSAxMDsKK1NFTEVDVCAqIEZST00gZ3Rlc3RfcnVsZV9sb2c7Cisgb3AgIHwgb2xkX2Ig fCBuZXdfYiAKKy0tLS0tKy0tLS0tLS0rLS0tLS0tLQorIElOUyB8ICAgICAgIHwgICAgIDIKKyBV UEQgfCAgICAgMiB8ICAgIDIwCisoMiByb3dzKQorCitEUk9QIFRBQkxFIGd0ZXN0X3J1bGUsIGd0 ZXN0X3J1bGVfbG9nOwogLS0gc2FuaXR5IGNoZWNrIG9mIHN5c3RlbSBjYXRhbG9nCiBTRUxFQ1Qg YXR0cmVsaWQsIGF0dG5hbWUsIGF0dGdlbmVyYXRlZCBGUk9NIHBnX2F0dHJpYnV0ZSBXSEVSRSBh dHRnZW5lcmF0ZWQgTk9UIElOICgnJywgJ3MnLCAndicpOwogIGF0dHJlbGlkIHwgYXR0bmFtZSB8 IGF0dGdlbmVyYXRlZCAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZ2Vu ZXJhdGVkX3ZpcnR1YWwub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9nZW5lcmF0ZWRf dmlydHVhbC5vdXQKaW5kZXggZmM0MWM0ODBkNDAuLmNkNDgyZDZlZTAzIDEwMDY0NAotLS0gYS9z cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2dlbmVyYXRlZF92aXJ0dWFsLm91dAorKysgYi9zcmMv dGVzdC9yZWdyZXNzL2V4cGVjdGVkL2dlbmVyYXRlZF92aXJ0dWFsLm91dApAQCAtMTUyNiw2ICsx NTI2LDI0IEBAIENSRUFURSBUQUJMRSBndGVzdDI4YiAoTElLRSBndGVzdDI4YSBJTkNMVURJTkcg R0VORVJBVEVEKTsKICBjICAgICAgfCBpbnRlZ2VyIHwgICAgICAgICAgIHwgICAgICAgICAgfCAK ICB4ICAgICAgfCBpbnRlZ2VyIHwgICAgICAgICAgIHwgICAgICAgICAgfCBnZW5lcmF0ZWQgYWx3 YXlzIGFzIChiICogMikKIAorLS0gcnVsZSBhY3Rpb25zIHJlZmVycmluZyB0byBnZW5lcmF0ZWQg Y29sdW1uczoKKy0tIE5FVy5iIGluIGEgcnVsZSBhY3Rpb24gc2hvdWxkIHJlZmxlY3QgdGhlIGdl bmVyYXRlZCBjb2x1bW4ncyBuZXcgdmFsdWUKK0NSRUFURSBUQUJMRSBndGVzdF9ydWxlIChhIGlu dCwgYiBpbnQgR0VORVJBVEVEIEFMV0FZUyBBUyAoYSAqIDIpIFZJUlRVQUwpOworQ1JFQVRFIFRB QkxFIGd0ZXN0X3J1bGVfbG9nIChvcCB0ZXh0LCBvbGRfYiBpbnQsIG5ld19iIGludCk7CitDUkVB VEUgUlVMRSBndGVzdF9ydWxlX3VwZCBBUyBPTiBVUERBVEUgVE8gZ3Rlc3RfcnVsZQorICBETyBB TFNPIElOU0VSVCBJTlRPIGd0ZXN0X3J1bGVfbG9nIFZBTFVFUyAoJ1VQRCcsIE9MRC5iLCBORVcu Yik7CitDUkVBVEUgUlVMRSBndGVzdF9ydWxlX2lucyBBUyBPTiBJTlNFUlQgVE8gZ3Rlc3RfcnVs ZQorICBETyBBTFNPIElOU0VSVCBJTlRPIGd0ZXN0X3J1bGVfbG9nIFZBTFVFUyAoJ0lOUycsIE5V TEwsIE5FVy5iKTsKK0lOU0VSVCBJTlRPIGd0ZXN0X3J1bGUgKGEpIFZBTFVFUyAoMSk7CitVUERB VEUgZ3Rlc3RfcnVsZSBTRVQgYSA9IDEwOworU0VMRUNUICogRlJPTSBndGVzdF9ydWxlX2xvZzsK KyBvcCAgfCBvbGRfYiB8IG5ld19iIAorLS0tLS0rLS0tLS0tLSstLS0tLS0tCisgSU5TIHwgICAg ICAgfCAgICAgMgorIFVQRCB8ICAgICAyIHwgICAgMjAKKygyIHJvd3MpCisKK0RST1AgVEFCTEUg Z3Rlc3RfcnVsZSwgZ3Rlc3RfcnVsZV9sb2c7CiAtLSBzYW5pdHkgY2hlY2sgb2Ygc3lzdGVtIGNh dGFsb2cKIFNFTEVDVCBhdHRyZWxpZCwgYXR0bmFtZSwgYXR0Z2VuZXJhdGVkIEZST00gcGdfYXR0 cmlidXRlIFdIRVJFIGF0dGdlbmVyYXRlZCBOT1QgSU4gKCcnLCAncycsICd2Jyk7CiAgYXR0cmVs aWQgfCBhdHRuYW1lIHwgYXR0Z2VuZXJhdGVkIApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVz cy9zcWwvZ2VuZXJhdGVkX3N0b3JlZC5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9nZW5lcmF0 ZWRfc3RvcmVkLnNxbAppbmRleCAxMDY0ODM5ZGNkMi4uNzk1YzdlNGNkNjYgMTAwNjQ0Ci0tLSBh L3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2dlbmVyYXRlZF9zdG9yZWQuc3FsCisrKyBiL3NyYy90ZXN0 L3JlZ3Jlc3Mvc3FsL2dlbmVyYXRlZF9zdG9yZWQuc3FsCkBAIC04MDEsNiArODAxLDE4IEBAIENS RUFURSBUQUJMRSBndGVzdDI4YiAoTElLRSBndGVzdDI4YSBJTkNMVURJTkcgR0VORVJBVEVEKTsK IAogXGQgZ3Rlc3QyOCoKIAorLS0gcnVsZSBhY3Rpb25zIHJlZmVycmluZyB0byBnZW5lcmF0ZWQg Y29sdW1uczoKKy0tIE5FVy5iIGluIGEgcnVsZSBhY3Rpb24gc2hvdWxkIHJlZmxlY3QgdGhlIGdl bmVyYXRlZCBjb2x1bW4ncyBuZXcgdmFsdWUKK0NSRUFURSBUQUJMRSBndGVzdF9ydWxlIChhIGlu dCwgYiBpbnQgR0VORVJBVEVEIEFMV0FZUyBBUyAoYSAqIDIpIFNUT1JFRCk7CitDUkVBVEUgVEFC TEUgZ3Rlc3RfcnVsZV9sb2cgKG9wIHRleHQsIG9sZF9iIGludCwgbmV3X2IgaW50KTsKK0NSRUFU RSBSVUxFIGd0ZXN0X3J1bGVfdXBkIEFTIE9OIFVQREFURSBUTyBndGVzdF9ydWxlCisgIERPIEFM U08gSU5TRVJUIElOVE8gZ3Rlc3RfcnVsZV9sb2cgVkFMVUVTICgnVVBEJywgT0xELmIsIE5FVy5i KTsKK0NSRUFURSBSVUxFIGd0ZXN0X3J1bGVfaW5zIEFTIE9OIElOU0VSVCBUTyBndGVzdF9ydWxl CisgIERPIEFMU08gSU5TRVJUIElOVE8gZ3Rlc3RfcnVsZV9sb2cgVkFMVUVTICgnSU5TJywgTlVM TCwgTkVXLmIpOworSU5TRVJUIElOVE8gZ3Rlc3RfcnVsZSAoYSkgVkFMVUVTICgxKTsKK1VQREFU RSBndGVzdF9ydWxlIFNFVCBhID0gMTA7CitTRUxFQ1QgKiBGUk9NIGd0ZXN0X3J1bGVfbG9nOwor RFJPUCBUQUJMRSBndGVzdF9ydWxlLCBndGVzdF9ydWxlX2xvZzsKIAogLS0gc2FuaXR5IGNoZWNr IG9mIHN5c3RlbSBjYXRhbG9nCiBTRUxFQ1QgYXR0cmVsaWQsIGF0dG5hbWUsIGF0dGdlbmVyYXRl ZCBGUk9NIHBnX2F0dHJpYnV0ZSBXSEVSRSBhdHRnZW5lcmF0ZWQgTk9UIElOICgnJywgJ3MnLCAn dicpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZ2VuZXJhdGVkX3ZpcnR1YWwu c3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZ2VuZXJhdGVkX3ZpcnR1YWwuc3FsCmluZGV4IDli MzI0MTNlM2E5Li4zN2I1YWYyNDk3ZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwv Z2VuZXJhdGVkX3ZpcnR1YWwuc3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2dlbmVyYXRl ZF92aXJ0dWFsLnNxbApAQCAtODE0LDYgKzgxNCwxOCBAQCBDUkVBVEUgVEFCTEUgZ3Rlc3QyOGIg KExJS0UgZ3Rlc3QyOGEgSU5DTFVESU5HIEdFTkVSQVRFRCk7CiAKIFxkIGd0ZXN0MjgqCiAKKy0t IHJ1bGUgYWN0aW9ucyByZWZlcnJpbmcgdG8gZ2VuZXJhdGVkIGNvbHVtbnM6CistLSBORVcuYiBp biBhIHJ1bGUgYWN0aW9uIHNob3VsZCByZWZsZWN0IHRoZSBnZW5lcmF0ZWQgY29sdW1uJ3MgbmV3 IHZhbHVlCitDUkVBVEUgVEFCTEUgZ3Rlc3RfcnVsZSAoYSBpbnQsIGIgaW50IEdFTkVSQVRFRCBB TFdBWVMgQVMgKGEgKiAyKSBWSVJUVUFMKTsKK0NSRUFURSBUQUJMRSBndGVzdF9ydWxlX2xvZyAo b3AgdGV4dCwgb2xkX2IgaW50LCBuZXdfYiBpbnQpOworQ1JFQVRFIFJVTEUgZ3Rlc3RfcnVsZV91 cGQgQVMgT04gVVBEQVRFIFRPIGd0ZXN0X3J1bGUKKyAgRE8gQUxTTyBJTlNFUlQgSU5UTyBndGVz dF9ydWxlX2xvZyBWQUxVRVMgKCdVUEQnLCBPTEQuYiwgTkVXLmIpOworQ1JFQVRFIFJVTEUgZ3Rl c3RfcnVsZV9pbnMgQVMgT04gSU5TRVJUIFRPIGd0ZXN0X3J1bGUKKyAgRE8gQUxTTyBJTlNFUlQg SU5UTyBndGVzdF9ydWxlX2xvZyBWQUxVRVMgKCdJTlMnLCBOVUxMLCBORVcuYik7CitJTlNFUlQg SU5UTyBndGVzdF9ydWxlIChhKSBWQUxVRVMgKDEpOworVVBEQVRFIGd0ZXN0X3J1bGUgU0VUIGEg PSAxMDsKK1NFTEVDVCAqIEZST00gZ3Rlc3RfcnVsZV9sb2c7CitEUk9QIFRBQkxFIGd0ZXN0X3J1 bGUsIGd0ZXN0X3J1bGVfbG9nOwogCiAtLSBzYW5pdHkgY2hlY2sgb2Ygc3lzdGVtIGNhdGFsb2cK IFNFTEVDVCBhdHRyZWxpZCwgYXR0bmFtZSwgYXR0Z2VuZXJhdGVkIEZST00gcGdfYXR0cmlidXRl IFdIRVJFIGF0dGdlbmVyYXRlZCBOT1QgSU4gKCcnLCAncycsICd2Jyk7Ci0tIAoyLjQzLjAKCg== --000000000000fb0609064fa58129--