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 1wEPc0-003yND-1r for pgsql-hackers@arkaria.postgresql.org; Sun, 19 Apr 2026 10:42:49 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wEPbz-00EyKw-1m for pgsql-hackers@arkaria.postgresql.org; Sun, 19 Apr 2026 10:42:47 +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 1wEPbz-00EyKo-0W for pgsql-hackers@lists.postgresql.org; Sun, 19 Apr 2026 10:42:47 +0000 Received: from mail-qv1-xf32.google.com ([2607:f8b0:4864:20::f32]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wEPbw-00000001xfZ-2cll for pgsql-hackers@lists.postgresql.org; Sun, 19 Apr 2026 10:42:46 +0000 Received: by mail-qv1-xf32.google.com with SMTP id 6a1803df08f44-8ac9ef74131so34899116d6.1 for ; Sun, 19 Apr 2026 03:42:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1776595361; cv=none; d=google.com; s=arc-20240605; b=ZoMR26QNlB1dk+2Rs3LsBU/03wJsKk+xEwpnPT67K2RrL6KM1SXnXGc6HS4JvZf/QF iTawaB+JQeyB/doO/sxMQiTj7li5qQfdoWTN6w+xb5iXu/yzAR1jVPR8ny/Avhx0CUWm Y5mk6KMnIggzLkXu+/VayFJ9aHKNanCHoTVh66lb4iwckhyU8kcXn5lQZGO5LiU65gD5 x3D85v+U01PcEMg6kZ0v3UJagZ5w6Eax+W6S8bgZwab6WMiFjPuIsEr8fNX0bKnrp4zr xsmenib3dOce7xSwZUdk7nPToHzMold6I57hcRd04BGaGrZjBA8XHlSaGZLt9gr4Q8hA iIXA== 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=9PEhOJiabJSVLobPEwwdMo+4rIJYXAftjnwlq97M7mQ=; fh=PDhzRmLFhJQgKl2kpY6iqaoiggk+rKjB8rXL7ERgOws=; b=WJFYhHppyacsq1jWUhvkCl7aSe89YQInTHdlz0Pe9X00Y+7IDRxg5AC9PnKG3h9V8n brXTG67U51IOv55Sxuy+2/m5vTWGzF1QQttmJl5BB9tNIjMBeYI0/bXPbsqZOKa5diwW ybmk4TEx2H4iZGxg9KryrPJQZi3pFZ50B+Yv2baUz/11T3T5B5llAmAFn2PRbLO7RkO5 0GQfdZfT1zNc8hEBb3EqQv0mSRAI67UvAjRelOEtTIOW3vvKkn40zbcEx3scnXoOoZw8 oRrAIVQ2ac5Q/F0LN9jjUCUZJi7zW+zn3sGEaVYzVrySLuIwDhskrFpWI8ioQfJlyvo8 QL2Q==; 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=1776595361; x=1777200161; 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=9PEhOJiabJSVLobPEwwdMo+4rIJYXAftjnwlq97M7mQ=; b=KmOm1jjwsE/wwRfFLjqIdV3Nye9vh1UNikrgy2m2ObSfQzXr2H3WUaVfwFocp3ZZRb 6GNA60a8J4uxIm86Jc+IqyrK0MfrcoPsrZ06OVNCeKeElWdEM5zWHCoUVcr1/dK11M8e w2jcOU21UBpSQvY4sKyPbpmI1iQOnyTEvgyz7xOApd0XE64vuV+vwhiJr6z6I6wU/OOT Mf2lIMrdhB2WneA1swjNThxhWGhmJVkXHR3eP+6Y83hmoqSsNnuW2nxZp5/y4yrX69Rd YlDZvunuVXODm7tSnDPPg6OQ97aFjc/cMpOMG8SguQxB9r+6OSsECcC0iDevu7k8TSzb kRwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776595361; x=1777200161; 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=9PEhOJiabJSVLobPEwwdMo+4rIJYXAftjnwlq97M7mQ=; b=H6vA0k98VDrBM3kUa5RiJgzte4YfXwbiplVubvdOP0Hp40wCNaVBAxGpGpAPKZTvFt rWg1GJ8L+FKOs94kHdnUpNQl//6Omuj/EWx4U+eQbilF/xUETvp7YSoXYyZhztOuxZXY GforO8sU+CpJ8cfYx2UBU+cRAMAcw1TFHmX4lq07wEdMaHYJcCO9APMRbpI/CUeeIJMx lc7fBhmHxiTyJ2usB0j5VmJZiiMDNXZL6TmsJrB8GvShp861Rs0FGsIo12VIzxhPmlSD HzRdrxiTROGK2B1ZwbPYp8NBQPZ0t02Du/flltO5Z+hruhSUzjgIreM3nloP8Odehvdb gybA== X-Gm-Message-State: AOJu0Yy2SMEmFxPKIJqdo80RjV5dSLxmkC5nfuDlLNg8SP6V7GzRtnfA ucng19zGygxmY7IkrvTZu3ks1Uj22jnqbr+ld4sQkla6poSgZxTS3jE5+u4lW5HyclgeoUg0vSY jmrsqDZnr+zQubbJsDMDUruuRrRlbNOs= X-Gm-Gg: AeBDievoM/fKBjHuB+ECT9LF7ipZkx+ccZ9uBaqNjLwG/7Uo1DZSSb41ac6TNFiP20S UusSMOmZ0Ri8EPB3zXAGiPnlm+V/vDFGGdHQyfSKLL6hh3kEwZJscLIxMCU2o4no+Y4WBYtfnEw JihOgHS9Z///ts6cogsXpUb4c9r9IUzV25c66odZE4BUHMSp6e3R94R2zYod101SuVoShs1Q+tM PYDRRTw8m8fG34OyNClTsnM+4vcye+k9IzpD0qZmxOLbnB5w82lAYFWzg7Kktnx3syT7vHX4oM3 Yelpp+Y4KLQe8IPkW5YBEm/MUgoA93WZious5meEYDdBTqnx62yxnATd5Jjyvbo= X-Received: by 2002:a05:6214:27ee:b0:8ae:5f29:eff3 with SMTP id 6a1803df08f44-8b02816cd80mr153956996d6.36.1776595360873; Sun, 19 Apr 2026 03:42:40 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Dean Rasheed Date: Sun, 19 Apr 2026 11:42:28 +0100 X-Gm-Features: AQROBzDXt46D9FvUbp6ruaLK9DJ6oC3uesMDxadLFaxdyGIpyLBEM86Ash_Tu8U Message-ID: Subject: Re: [BUG]: WHERE CURRENT OF cursor fail on tables that have virtual generated columns To: SATYANARAYANA NARLAPURAM Cc: PostgreSQL Hackers Content-Type: multipart/mixed; boundary="000000000000657594064fcdd717" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000657594064fcdd717 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Fri, 17 Apr 2026 at 21:04, SATYANARAYANA NARLAPURAM wrote: > > Hi hackers, > > UPDATE and DELETE with WHERE CURRENT OF cursor fail on tables that have v= irtual generated columns, erroring with "WHERE CURRENT OF on a view is not = implemented" even though the target is a regular table, not a view. > Nice catch! > Analysis: > The bug stems from replace_rte_variables_mutator() in rewriteManip.c, whi= ch unconditionally errors on any CurrentOfExpr referencing the target relat= ion. This appears to a check designed for view rewriting, where WHERE CURRE= NT OF cannot be translated through a view. However, virtual generated colum= n (VGC) expansion also routes through this mutator. The rewriter's expand_g= enerated_columns_internal() calls ReplaceVarsFromTargetList(), and the plan= ner's expand_virtual_generated_columns() calls pullup_replace_vars(), which= calls replace_rte_variables(). Since virtual generated columns use same mu= tator, while expanding virtual generated columns returns the same error eve= n though the table is not a view and the cursor position is perfectly valid= . > > The fix adds bool error_on_current_of to replace_rte_variables_context. T= he existing replace_rte_variables() is refactored into a static replace_rte= _variables_internal() that accepts the flag, with two public wrappers: repl= ace_rte_variables() (passes true, preserving existing behavior) and replace= _rte_variables_ext() (exposes the flag). The same pattern is applied to Rep= laceVarsFromTargetList() / ReplaceVarsFromTargetListExtended(). In replace_= rte_variables_mutator(), the CurrentOfExpr error is now conditional on cont= ext->error_on_current_of. The two VGC expansion call sites pass false; all = other callers pass true. The down side of this approach is that it is addin= g additional public API. > Hmm, it seems to me that a much simpler fix is to check for use of WHERE CURRENT OF on a view at parse time, and throw the error there. Then the problematic rewriter check can simply be removed, as in the attached v2 patch. Regards, Dean --000000000000657594064fcdd717 Content-Type: text/x-patch; charset="US-ASCII"; name="v2-0001-vgc-where-current-of-fix.patch" Content-Disposition: attachment; filename="v2-0001-vgc-where-current-of-fix.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mo5mwg6b0 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3BhcnNlci9hbmFseXplLmMgYi9zcmMvYmFja2VuZC9w YXJzZXIvYW5hbHl6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZGVlZDkuLmQ5ODQ1 MzUKLS0tIGEvc3JjL2JhY2tlbmQvcGFyc2VyL2FuYWx5emUuYworKysgYi9zcmMvYmFja2VuZC9w YXJzZXIvYW5hbHl6ZS5jCkBAIC01OTUsNiArNTk1LDE0IEBAIHRyYW5zZm9ybURlbGV0ZVN0bXQo UGFyc2VTdGF0ZSAqcHN0YXRlLAogCQkJCQkJCQkJCSBBQ0xfREVMRVRFKTsKIAluc2l0ZW0gPSBw c3RhdGUtPnBfdGFyZ2V0X25zaXRlbTsKIAorCS8qIGRpc2FsbG93IERFTEVURSAuLi4gV0hFUkUg Q1VSUkVOVCBPRiBvbiBhIHZpZXcgKi8KKwlpZiAoc3RtdC0+d2hlcmVDbGF1c2UgJiYKKwkJSXNB KHN0bXQtPndoZXJlQ2xhdXNlLCBDdXJyZW50T2ZFeHByKSAmJgorCQlwc3RhdGUtPnBfdGFyZ2V0 X3JlbGF0aW9uLT5yZF9yZWwtPnJlbGtpbmQgPT0gUkVMS0lORF9WSUVXKQorCQllcmVwb3J0KEVS Uk9SLAorCQkJCWVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAorCQkJCWVy cm1zZygiV0hFUkUgQ1VSUkVOVCBPRiBvbiBhIHZpZXcgaXMgbm90IGltcGxlbWVudGVkIikpOwor CiAJLyogdGhlcmUncyBubyBESVNUSU5DVCBpbiBERUxFVEUgKi8KIAlxcnktPmRpc3RpbmN0Q2xh dXNlID0gTklMOwogCkBAIC0yODY4LDYgKzI4NzYsMTQgQEAgdHJhbnNmb3JtVXBkYXRlU3RtdChQ YXJzZVN0YXRlICpwc3RhdGUsCiAJCQkJCQkJCQkJIHRydWUsCiAJCQkJCQkJCQkJIEFDTF9VUERB VEUpOwogCisJLyogZGlzYWxsb3cgVVBEQVRFIC4uLiBXSEVSRSBDVVJSRU5UIE9GIG9uIGEgdmll dyAqLworCWlmIChzdG10LT53aGVyZUNsYXVzZSAmJgorCQlJc0Eoc3RtdC0+d2hlcmVDbGF1c2Us IEN1cnJlbnRPZkV4cHIpICYmCisJCXBzdGF0ZS0+cF90YXJnZXRfcmVsYXRpb24tPnJkX3JlbC0+ cmVsa2luZCA9PSBSRUxLSU5EX1ZJRVcpCisJCWVyZXBvcnQoRVJST1IsCisJCQkJZXJyY29kZShF UlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCisJCQkJZXJybXNnKCJXSEVSRSBDVVJSRU5U IE9GIG9uIGEgdmlldyBpcyBub3QgaW1wbGVtZW50ZWQiKSk7CisKIAlpZiAoc3RtdC0+Zm9yUG9y dGlvbk9mKQogCQlxcnktPmZvclBvcnRpb25PZiA9IHRyYW5zZm9ybUZvclBvcnRpb25PZkNsYXVz ZShwc3RhdGUsCiAJCQkJCQkJCQkJCQkJCXFyeS0+cmVzdWx0UmVsYXRpb24sCmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC9yZXdyaXRlL3Jld3JpdGVNYW5pcC5jIGIvc3JjL2JhY2tlbmQvcmV3cml0 ZS9yZXdyaXRlTWFuaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmY0YWEwLi45YWE3 ZWY2Ci0tLSBhL3NyYy9iYWNrZW5kL3Jld3JpdGUvcmV3cml0ZU1hbmlwLmMKKysrIGIvc3JjL2Jh Y2tlbmQvcmV3cml0ZS9yZXdyaXRlTWFuaXAuYwpAQCAtMTUxNCwyNSArMTUxNCw2IEBAIHJlcGxh Y2VfcnRlX3ZhcmlhYmxlc19tdXRhdG9yKE5vZGUgKm5vZGUKIAkJfQogCQkvKiBvdGhlcndpc2Ug ZmFsbCB0aHJvdWdoIHRvIGNvcHkgdGhlIHZhciBub3JtYWxseSAqLwogCX0KLQllbHNlIGlmIChJ c0Eobm9kZSwgQ3VycmVudE9mRXhwcikpCi0JewotCQlDdXJyZW50T2ZFeHByICpjZXhwciA9IChD dXJyZW50T2ZFeHByICopIG5vZGU7Ci0KLQkJaWYgKGNleHByLT5jdmFybm8gPT0gY29udGV4dC0+ dGFyZ2V0X3Zhcm5vICYmCi0JCQljb250ZXh0LT5zdWJsZXZlbHNfdXAgPT0gMCkKLQkJewotCQkJ LyoKLQkJCSAqIFdlIGdldCBoZXJlIGlmIGEgV0hFUkUgQ1VSUkVOVCBPRiBleHByZXNzaW9uIHR1 cm5zIG91dCB0byBhcHBseQotCQkJICogdG8gYSB2aWV3LiAgU29tZWRheSB3ZSBtaWdodCBiZSBh YmxlIHRvIHRyYW5zbGF0ZSB0aGUKLQkJCSAqIGV4cHJlc3Npb24gdG8gYXBwbHkgdG8gYW4gdW5k ZXJseWluZyB0YWJsZSBvZiB0aGUgdmlldywgYnV0Ci0JCQkgKiByaWdodCBub3cgaXQncyBub3Qg aW1wbGVtZW50ZWQuCi0JCQkgKi8KLQkJCWVyZXBvcnQoRVJST1IsCi0JCQkJCShlcnJjb2RlKEVS UkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKLQkJCQkJIGVycm1zZygiV0hFUkUgQ1VSUkVO VCBPRiBvbiBhIHZpZXcgaXMgbm90IGltcGxlbWVudGVkIikpKTsKLQkJfQotCQkvKiBvdGhlcndp c2UgZmFsbCB0aHJvdWdoIHRvIGNvcHkgdGhlIGV4cHIgbm9ybWFsbHkgKi8KLQl9CiAJZWxzZSBp ZiAoSXNBKG5vZGUsIFF1ZXJ5KSkKIAl7CiAJCS8qIFJlY3Vyc2UgaW50byBSVEUgc3VicXVlcnkg b3Igbm90LXlldC1wbGFubmVkIHN1Ymxpbmsgc3VicXVlcnkgKi8KZGlmZiAtLWdpdCBhL3NyYy90 ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZ2VuZXJhdGVkX3ZpcnR1YWwub3V0IGIvc3JjL3Rlc3QvcmVn cmVzcy9leHBlY3RlZC9nZW5lcmF0ZWRfdmlydHVhbC5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggZmM0MWM0OC4uYzIzOGVmOAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2dl bmVyYXRlZF92aXJ0dWFsLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2dlbmVy YXRlZF92aXJ0dWFsLm91dApAQCAtMTcyMywzICsxNzIzLDQzIEBAIHNlbGVjdCAqIGZyb20gZ3Rl c3QzMyB3aGVyZSBiIGlzIG51bGw7CiAKIHJlc2V0IGNvbnN0cmFpbnRfZXhjbHVzaW9uOwogZHJv cCB0YWJsZSBndGVzdDMzOworY3JlYXRlIHRhYmxlIGd0ZXN0X2N1cnNvciAoaWQgaW50IHByaW1h cnkga2V5LCBhIGludCwgYiBpbnQgZ2VuZXJhdGVkIGFsd2F5cyBhcyAoYSAqIDIpIHZpcnR1YWwp OworaW5zZXJ0IGludG8gZ3Rlc3RfY3Vyc29yIHZhbHVlcyAoMSwgMTApLCAoMiwgMjApLCAoMywg MzApOworLS0gVVBEQVRFIHZpYSBjdXJzb3IKK2JlZ2luOworZGVjbGFyZSBjdXIxIGN1cnNvciBm b3Igc2VsZWN0ICogZnJvbSBndGVzdF9jdXJzb3Igb3JkZXIgYnkgaWQgZm9yIHVwZGF0ZTsKK2Zl dGNoIDEgZnJvbSBjdXIxOworIGlkIHwgYSAgfCBiICAKKy0tLS0rLS0tLSstLS0tCisgIDEgfCAx MCB8IDIwCisoMSByb3cpCisKK3VwZGF0ZSBndGVzdF9jdXJzb3Igc2V0IGEgPSA5OSB3aGVyZSBj dXJyZW50IG9mIGN1cjE7CitzZWxlY3QgKiBmcm9tIGd0ZXN0X2N1cnNvciBvcmRlciBieSBpZDsK KyBpZCB8IGEgIHwgIGIgIAorLS0tLSstLS0tKy0tLS0tCisgIDEgfCA5OSB8IDE5OAorICAyIHwg MjAgfCAgNDAKKyAgMyB8IDMwIHwgIDYwCisoMyByb3dzKQorCitjb21taXQ7CistLSBERUxFVEUg dmlhIGN1cnNvcgorYmVnaW47CitkZWNsYXJlIGN1cjIgY3Vyc29yIGZvciBzZWxlY3QgKiBmcm9t IGd0ZXN0X2N1cnNvciBvcmRlciBieSBpZCBmb3IgdXBkYXRlOworZmV0Y2ggMSBmcm9tIGN1cjI7 CisgaWQgfCBhICB8ICBiICAKKy0tLS0rLS0tLSstLS0tLQorICAxIHwgOTkgfCAxOTgKKygxIHJv dykKKworZGVsZXRlIGZyb20gZ3Rlc3RfY3Vyc29yIHdoZXJlIGN1cnJlbnQgb2YgY3VyMjsKK3Nl bGVjdCAqIGZyb20gZ3Rlc3RfY3Vyc29yIG9yZGVyIGJ5IGlkOworIGlkIHwgYSAgfCBiICAKKy0t LS0rLS0tLSstLS0tCisgIDIgfCAyMCB8IDQwCisgIDMgfCAzMCB8IDYwCisoMiByb3dzKQorCitj b21taXQ7Citkcm9wIHRhYmxlIGd0ZXN0X2N1cnNvcjsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jl Z3Jlc3Mvc3FsL2dlbmVyYXRlZF92aXJ0dWFsLnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2dl bmVyYXRlZF92aXJ0dWFsLnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjMyNDEzLi41 YmFiN2QzCi0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2dlbmVyYXRlZF92aXJ0dWFsLnNxbAor KysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9nZW5lcmF0ZWRfdmlydHVhbC5zcWwKQEAgLTkwNiwz ICs5MDYsMjQgQEAgc2VsZWN0ICogZnJvbSBndGVzdDMzIHdoZXJlIGIgaXMgbnVsbDsKIAogcmVz ZXQgY29uc3RyYWludF9leGNsdXNpb247CiBkcm9wIHRhYmxlIGd0ZXN0MzM7CisKK2NyZWF0ZSB0 YWJsZSBndGVzdF9jdXJzb3IgKGlkIGludCBwcmltYXJ5IGtleSwgYSBpbnQsIGIgaW50IGdlbmVy YXRlZCBhbHdheXMgYXMgKGEgKiAyKSB2aXJ0dWFsKTsKK2luc2VydCBpbnRvIGd0ZXN0X2N1cnNv ciB2YWx1ZXMgKDEsIDEwKSwgKDIsIDIwKSwgKDMsIDMwKTsKKworLS0gVVBEQVRFIHZpYSBjdXJz b3IKK2JlZ2luOworZGVjbGFyZSBjdXIxIGN1cnNvciBmb3Igc2VsZWN0ICogZnJvbSBndGVzdF9j dXJzb3Igb3JkZXIgYnkgaWQgZm9yIHVwZGF0ZTsKK2ZldGNoIDEgZnJvbSBjdXIxOwordXBkYXRl IGd0ZXN0X2N1cnNvciBzZXQgYSA9IDk5IHdoZXJlIGN1cnJlbnQgb2YgY3VyMTsKK3NlbGVjdCAq IGZyb20gZ3Rlc3RfY3Vyc29yIG9yZGVyIGJ5IGlkOworY29tbWl0OworCistLSBERUxFVEUgdmlh IGN1cnNvcgorYmVnaW47CitkZWNsYXJlIGN1cjIgY3Vyc29yIGZvciBzZWxlY3QgKiBmcm9tIGd0 ZXN0X2N1cnNvciBvcmRlciBieSBpZCBmb3IgdXBkYXRlOworZmV0Y2ggMSBmcm9tIGN1cjI7Citk ZWxldGUgZnJvbSBndGVzdF9jdXJzb3Igd2hlcmUgY3VycmVudCBvZiBjdXIyOworc2VsZWN0ICog ZnJvbSBndGVzdF9jdXJzb3Igb3JkZXIgYnkgaWQ7Citjb21taXQ7CisKK2Ryb3AgdGFibGUgZ3Rl c3RfY3Vyc29yOwo= --000000000000657594064fcdd717--