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 1vqKfL-008uAu-1R for pgsql-bugs@arkaria.postgresql.org; Thu, 12 Feb 2026 00:34:44 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vqKfI-006OhI-35 for pgsql-bugs@arkaria.postgresql.org; Thu, 12 Feb 2026 00:34:41 +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 1vqKfI-006Oh9-1D for pgsql-bugs@lists.postgresql.org; Thu, 12 Feb 2026 00:34:41 +0000 Received: from mail-ot1-x330.google.com ([2607:f8b0:4864:20::330]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vqKfF-00000000Cfx-3o8h for pgsql-bugs@lists.postgresql.org; Thu, 12 Feb 2026 00:34:39 +0000 Received: by mail-ot1-x330.google.com with SMTP id 46e09a7af769-7d19bfe1190so2239538a34.1 for ; Wed, 11 Feb 2026 16:34:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1770856477; cv=none; d=google.com; s=arc-20240605; b=P6taX4N5dbwqogX7oauuKeRB6BMtmDsyNVqHEczetTdTU5IizIA8iNwLZKWE0mjaZn WByC/UY4H9wMzUf3jA7IyAiGfX7cEdUt//l9I7ibdoBUnw0ES02XlycYXNiD7cMmqSMj dNAuIVdp3Jao9/06F9ddbuN+lL1XSPmNKcdiVp1CAJo8uTc+SWSaTl3kucMUPoMWD4Jp BQhQNBKr5K/VSig1f2YtTVKb4SmOeEBz1J+9sdz+Aievg4vLYIQ+fJb5z9Cg1V9Wg1NU hurGalZWTx4bwxk0pGdsTXNJag+QW9RhtvdhStQOCO4jzywSRZ9lV4X+e9tRaS5TwkET FC7A== 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=rXmdQywMQ6Qe0g7L/PorwfDEexERVLUD2W/XvQnj/sc=; fh=UZ2RupGbXr1M5m4uTXiMQoSoiUlO7geb1q/gelp8Hy4=; b=DI0M/ncvXpQJq4k+Dt1LLWFXrtN+8dDX9MyHQoTLpQ4AR/6tF3Kg2s8tAJThmV6TL+ H1ENhtCWU5krvJ4AbeeY3SQBhYKMLtb9FQj9r9JhJN/XZpbCi+XNncUUiBP+IIQnObUO ho9g/LSeZ07HHxiUmgaPnoqgD6OL0xTBCG+FogEWSsGV1ONF8mIWPUpk9kRW0Ih+a1gb s3MQA6BS8lit1rq3kBR5a0CojgKZsLT4ePKDyeUm9qIR8oDCVlLjIlfPARmJlN7IbiX1 9edoOFaGsTLRxlWYaU9B4lxKFS3mn7kUpfkkGwV03QOoeYr94BWEAmW2j/mOdnt/sICd ckzg==; 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=20230601; t=1770856477; x=1771461277; 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=rXmdQywMQ6Qe0g7L/PorwfDEexERVLUD2W/XvQnj/sc=; b=bkyiAQGxHwymXuEIOezMPBZARMvAuoHEo/kcxOiZGD2JP7JlSqx0hxXur68Hss2ShZ LLD0LvrIY8T3Qhi9md/rwlHQAs0PDEHj8bqwcBH3WV+JyhslcN4g0KZId//PCwB8ZN/g /067iqmtDdnu3/N+0FfMg5WHJWcAEllKkXYfidu3la924rGAbFp6BqTqPUFqJY2S8uBq HGx7l4ikvy+9EIUO12xYFxz/A5bOqb4AhThWVI/XEN/BU//QuPklEHUxR/Gr8HZNaCQ5 /a43jjD2BXoIF3TYCnEV5/i5PvXr1z1rPJLbFo2P3RIOEqautsbo7AGHEjJWgJuNORaK QMtg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770856477; x=1771461277; 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=rXmdQywMQ6Qe0g7L/PorwfDEexERVLUD2W/XvQnj/sc=; b=hxk8e0+WQW73D363f1p3lcRr0Fx2fQV+fGTD3tabk1TACRNkLbW4t5PX4u2gM7i9ZD 760kgpCv+VEvd7kF++bJNEvkuy3B7PpezxAcfj9pjgM7EVIaA9+FGU7ljeJON5OYEvSw 94LkM/GeVcrdxEA40AwwKk4fn9l5Bt09R+8Pcl7hkv62AqpgoQnBqWZ+vq0SdFIpX2gK 6Wy46IFbIRzLhPAVgDQr0+rz0qdcAwYTWbDmjDZkBW1FtYE6FLnyJxmdkRkrXN4IGCpA 26mh+YzfmvAAswlcL+44Gs5fGP6jT/GA4VTpquQUCsh279kml+AlXOQVJlzHXB9La3Iv S6vA== X-Gm-Message-State: AOJu0YwY1GSUi6pmWoLF1ovzJEbyZtMHWi1WK+olEIK1lD+SQj2reBR7 yJ0xMbc3QnAudD+uyiSjN6JRFIkwsT/Ph8E9IA8f9jyD0uN+hvBnm+/+cFQg0tQj77GBYDAngwG Pu4qwCq5Z2UwH1ByQy/c2T5dWsQZeRJaJsm3CMFw= X-Gm-Gg: AZuq6aIam4Zo6HZL3xSruFIHM5p+iVk7JFNP3rwQ1x96/1cZ9Ctr9byjVb6X6+aRwQP Q+Wb0WxBuAzq0Xelvk+465/07H52+sPTzjICacNSixZ0ss+iPy5j8tzJfpDLwWYB3XAFX5EkgUp XmBwUVVHg4bD8sCynhhxxKGARGIUceFiti/8d3DO/0YQ8X45ZIbIDM872g4AI/JA83TB+wIJ2nW 3sN1DZZXrSeV/DvN5oY4dUvbLddaXHhuNrW5tggaKm50ExhdbIInwwGUTxujaJGsVxrkQ5RjyqC eJm4thewv3CGZ7+04NU3o1++teMzqw== X-Received: by 2002:a05:6820:f016:b0:664:8baa:fcb2 with SMTP id 006d021491bc7-675de7cccc2mr137985eaf.80.1770856476647; Wed, 11 Feb 2026 16:34:36 -0800 (PST) MIME-Version: 1.0 References: <40d694df-39fd-4a4a-9459-9d6489165f60@gogi.tv> In-Reply-To: From: surya poondla Date: Wed, 11 Feb 2026 16:34:25 -0800 X-Gm-Features: AZwV_Qjzp59TUO2O2TNDDSsRq6Ekx_QcCMX-3dFH9xv5wC3NGIOMW67UkPwCfTs Message-ID: Subject: Re: Two issues with REFRESH MATERIALIZED VIEW CONCURRENTLY To: Giuliano Gagliardi Cc: pgsql-bugs@lists.postgresql.org Content-Type: multipart/mixed; boundary="0000000000003d65e2064a95a7d6" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000003d65e2064a95a7d6 Content-Type: multipart/alternative; boundary="0000000000003d65df064a95a7d4" --0000000000003d65df064a95a7d4 Content-Type: text/plain; charset="UTF-8" Hi Giuliano, Regarding the issue 1, > > I noticed the following two issues while looking at the code that handles > REFRESH MATERIALIZED VIEW CONCURRENTLY (refresh_by_match_merge() in > matview.c): > > 1. > > At the beginning of the function, there is some code that checks for > duplicate > rows, but it does not catch the following case: > > CREATE TABLE t(a text, b text); > INSERT INTO t VALUES('test', null); > CREATE MATERIALIZED VIEW m AS SELECT * FROM t; > CREATE UNIQUE INDEX ON m(a); > INSERT INTO t VALUES('test', null); -- t now contains two identical rows > > REFRESH MATERIALIZED VIEW CONCURRENTLY m; > -> no error, but m still contains only one row! > REFRESH MATERIALIZED VIEW m; > -> error (as expected) > > Thank you for the pointers, I made a patch in refresh_by_match_merge() which reports an error in the REFRESH MATERIALIZED VIEW CONCURRENTLY case too. The issue was REFRESH MATERIALIZED VIEW CONCURRENTLY was incorrectly skipping duplicate detection for rows containing any NULL values. This was happening because the "WHERE newdata.* IS NOT NULL" condition returns false if any column contains NULL. My patch removes the "IS NOT NULL" preconditions from the duplicate detection query. The query now correctly checks all rows using the record equality operator (*=), which treats NULL as equal to NULL (i.e True). Here is the output with my patch: postgres=# CREATE TABLE t(a text, b text); CREATE TABLE postgres=# INSERT INTO t VALUES('test', null); INSERT 0 1 postgres=# postgres=# CREATE MATERIALIZED VIEW m AS SELECT * FROM t; SELECT 1 postgres=# postgres=# CREATE UNIQUE INDEX ON m(a); CREATE INDEX postgres=# SELECT * FROM m; a | b ------+--- test | (1 row) postgres=# SELECT * FROM t; a | b ------+--- test | (1 row) postgres=# INSERT INTO t VALUES('test', null); INSERT 0 1 postgres=# SELECT * FROM t; a | b ------+--- test | test | (2 rows) postgres=# SELECT * FROM m; a | b ------+--- test | (1 row) postgres=# REFRESH MATERIALIZED VIEW CONCURRENTLY m; 2026-02-11 15:57:46.751 PST [39510] ERROR: new data for materialized view "m" contains duplicate rows 2026-02-11 15:57:46.751 PST [39510] DETAIL: Row: (test,) 2026-02-11 15:57:46.751 PST [39510] STATEMENT: REFRESH MATERIALIZED VIEW CONCURRENTLY m; ERROR: new data for materialized view "m" contains duplicate rows DETAIL: Row: (test,) postgres=# postgres=# REFRESH MATERIALIZED VIEW m; 2026-02-11 15:57:55.877 PST [39510] ERROR: could not create unique index "m_a_idx" 2026-02-11 15:57:55.877 PST [39510] DETAIL: Key (a)=(test) is duplicated. 2026-02-11 15:57:55.877 PST [39510] STATEMENT: REFRESH MATERIALIZED VIEW m; ERROR: could not create unique index "m_a_idx" DETAIL: Key (a)=(test) is duplicated. postgres=# Regards, Surya Poondla --0000000000003d65df064a95a7d4 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi Giuliano,

Regarding the issue 1,
I noticed the = following two issues while looking at the code that handles
REFRESH MATE= RIALIZED VIEW CONCURRENTLY (refresh_by_match_merge() in matview.c):

= 1.

At the beginning of the function, there is some code that checks = for duplicate
rows, but it does not catch the following case:

CRE= ATE TABLE t(a text, b text);
INSERT INTO t VALUES('test', null);=
CREATE MATERIALIZED VIEW m AS SELECT * FROM t;
CREATE UNIQUE INDEX O= N m(a);
INSERT INTO t VALUES('test', null); -- t now contains tw= o identical rows

REFRESH MATERIALIZED VIEW CONCURRENTLY m;
=C2=A0= =C2=A0 =C2=A0-> no error, but m still contains only one row!
REFRESH= MATERIALIZED VIEW m;
=C2=A0 =C2=A0 =C2=A0-> error (as expected)
<= br>

Thank you for the pointers= , I made a patch in=C2=A0refresh_by_match_merge() which reports an error in= the=C2=A0REFRESH MATERIALIZED VIEW CONCURRENTLY case too.=C2=A0
=
The issue was REFRESH MATERIALIZED VIEW CONCURRENTLY was incorrectly sk= ipping duplicate detection for rows containing any NULL values. This was ha= ppening=C2=A0because=C2=A0the=C2=A0"WHERE newdata.* IS NOT NULL" = condition returns false if any column contains NULL.
My patch removes th= e "IS NOT NULL" preconditions from the duplicate detection query.= The query now correctly checks all rows using the record equality operator= (*=3D), which treats NULL as equal to NULL (i.e True).

Here is the = output with my patch:
postgres=3D# CREATE TABLE t(a text, b text);
CR= EATE TABLE
postgres=3D# =C2=A0 INSERT INTO t VALUES('test', null= );
INSERT 0 1
postgres=3D#
postgres=3D# =C2=A0 CREATE MATERIALIZED= VIEW m AS SELECT * FROM t;
SELECT 1
postgres=3D#
postgres=3D# CRE= ATE UNIQUE INDEX ON m(a);
CREATE INDEX
postgres=3D# SELECT * FROM m;<= br>=C2=A0 a =C2=A0 | b
------+---
=C2=A0test |
(1 row)

post= gres=3D# SELECT * FROM t;
=C2=A0 a =C2=A0 | b
------+---
=C2=A0tes= t |
(1 row)

postgres=3D# INSERT INTO t VALUES('test', nul= l);
INSERT 0 1
postgres=3D# SELECT * FROM t;
=C2=A0 a =C2=A0 | b------+---
=C2=A0test |
=C2=A0test |
(2 rows)

postgres=3D= # SELECT * FROM m;
=C2=A0 a =C2=A0 | b
------+---
=C2=A0test |
= (1 row)

postgres=3D# REFRESH MATERIALIZED VIEW CONCURRENTLY m;
20= 26-02-11 15:57:46.751 PST [39510] ERROR: =C2=A0new data for materialized vi= ew "m" contains duplicate rows
2026-02-11 15:57:46.751 PST [39= 510] DETAIL: =C2=A0Row: (test,)
2026-02-11 15:57:46.751 PST [39510] STAT= EMENT: =C2=A0REFRESH MATERIALIZED VIEW CONCURRENTLY m;
ERROR: =C2=A0new = data for materialized view "m" contains duplicate rows
DETAIL:= =C2=A0Row: (test,)
postgres=3D#
postgres=3D# REFRESH MATERIALIZED VI= EW m;
2026-02-11 15:57:55.877 PST [39510] ERROR: =C2=A0could not create = unique index "m_a_idx"
2026-02-11 15:57:55.877 PST [39510] DET= AIL: =C2=A0Key (a)=3D(test) is duplicated.
2026-02-11 15:57:55.877 PST [= 39510] STATEMENT: =C2=A0REFRESH MATERIALIZED VIEW m;
ERROR: =C2=A0could = not create unique index "m_a_idx"
DETAIL: =C2=A0Key (a)=3D(tes= t) is duplicated.
postgres=3D#

Regards,=C2=A0
Surya Poondla
--0000000000003d65df064a95a7d4-- --0000000000003d65e2064a95a7d6 Content-Type: application/octet-stream; name="0001-Fix-REFRESH-MATERIALIZED-VIEW-CONCURRENTLY-to-detect.patch" Content-Disposition: attachment; filename="0001-Fix-REFRESH-MATERIALIZED-VIEW-CONCURRENTLY-to-detect.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mliq3rzz0 RnJvbSBkMjZlMDg0ZWQwMGNkZTIxZDkxN2NkNGRjNTJmMmFiMTQ2N2ZkYzE5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBzcG9vbmRsYSA8c19wb29uZGxhQGFwcGxlLmNvbT4KRGF0ZTog V2VkLCAxMSBGZWIgMjAyNiAxNjowNjo1NiAtMDgwMApTdWJqZWN0OiBbUEFUQ0hdIEZpeCBSRUZS RVNIIE1BVEVSSUFMSVpFRCBWSUVXIENPTkNVUlJFTlRMWSB0byBkZXRlY3QgTlVMTAogY29udGFp bmluZyBkdXBsaWNhdGVzLgoKSXNzdWU6ClJFRlJFU0ggTUFURVJJQUxJWkVEIFZJRVcgQ09OQ1VS UkVOVExZIHdhcyBpbmNvcnJlY3RseSBza2lwcGluZyBkdXBsaWNhdGUKZGV0ZWN0aW9uIGZvciBy b3dzIGNvbnRhaW5pbmcgYW55IE5VTEwgdmFsdWVzLiBUaGlzIHdvdWxkIGNhdXNlIHRoZSByZWZy ZXNoCnRvIHNpbGVudGx5IHN1Y2NlZWQgd2hpbGUgbGVhdmluZyB0aGUgbWF0ZXJpYWxpemVkIHZp ZXcgd2l0aCBzdGFsZSBkYXRhLApyYXRoZXIgdGhhbiBwcm9wZXJseSByZXBvcnRpbmcgZHVwbGlj YXRlIHJvdyBlcnJvcnMuCgpUaGUgYnVnIG9jY3VycmVkIGJlY2F1c2UgdGhlIGR1cGxpY2F0ZSBj aGVjayB1c2VkICJXSEVSRSBuZXdkYXRhLiogSVMgTk9UIE5VTEwiCndoaWNoIHJldHVybnMgZmFs c2UgaWYgYW55IGNvbHVtbiBjb250YWlucyBOVUxMLiBXaGVuIGR1cGxpY2F0ZXMgZXhpc3RlZCBp bgpyb3dzIHdpdGggTlVMTHMgKGUuZy4sIHR3byByb3dzIG9mICgndGVzdCcsIE5VTEwpKSwgdGhl IGNoZWNrIHdhcyBza2lwcGVkCmVudGlyZWx5LiBUaGUgc3Vic2VxdWVudCBGVUxMIE9VVEVSIEpP SU4gd291bGQgdGhlbiBtYXRjaCBib3RoIGR1cGxpY2F0ZSByb3dzCnRvIHRoZSBzYW1lIG9sZCBy b3csIHByb2R1Y2luZyBhbiBlbXB0eSBkaWZmLCBjYXVzaW5nIG5vIHVwZGF0ZXMgdG8gYmUgYXBw bGllZC4KCkZpeDoKVGhlIGZpeCByZW1vdmVzIHRoZSAiSVMgTk9UIE5VTEwiIHByZWNvbmRpdGlv bnMgZnJvbSB0aGUgZHVwbGljYXRlIGRldGVjdGlvbgpxdWVyeS4gVGhlIHF1ZXJ5IG5vdyBjb3Jy ZWN0bHkgY2hlY2tzIGFsbCByb3dzIHVzaW5nIHRoZSByZWNvcmQgZXF1YWxpdHkKb3BlcmF0b3Ig KCo9KSwgd2hpY2ggdHJlYXRzIE5VTEwgYXMgZXF1YWwgdG8gTlVMTC4gVGhpcyBtYXRjaGVzIHRo ZSBzYW1lCmVxdWFsaXR5IHNlbWFudGljcyB1c2VkIGJ5IHRoZSBGVUxMIE9VVEVSIEpPSU4gaW4g dGhlIGRpZmYgcXVlcnksIGVuc3VyaW5nCmNvbnNpc3RlbnQgZHVwbGljYXRlIGRldGVjdGlvbi4K Ck5vdGU6ClRoZSBub24tY29uY3VycmVudCBSRUZSRVNIIHdhcyB1bmFmZmVjdGVkIHNpbmNlIGl0 IHJlYnVpbGRzIGluZGV4ZXMgZnJvbQpzY3JhdGNoLCB3aGljaCBwcm9wZXJseSBkZXRlY3RzIGR1 cGxpY2F0ZXMgZHVyaW5nIGluZGV4IGNyZWF0aW9uLgotLS0KIHNyYy9iYWNrZW5kL2NvbW1hbmRz L21hdHZpZXcuYyB8IDIwICsrKysrKysrKysrLS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgMTEg aW5zZXJ0aW9ucygrKSwgOSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9j b21tYW5kcy9tYXR2aWV3LmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9tYXR2aWV3LmMKaW5kZXgg ODFhNTVhMzNlZjIuLjZhYWY3YTY4YzIwIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5k cy9tYXR2aWV3LmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvbWF0dmlldy5jCkBAIC02MzUs MTEgKzYzNSwxMyBAQCByZWZyZXNoX2J5X21hdGNoX21lcmdlKE9pZCBtYXR2aWV3T2lkLCBPaWQg dGVtcE9pZCwgT2lkIHJlbG93bmVyLAogCQllbG9nKEVSUk9SLCAiU1BJX2V4ZWMgZmFpbGVkOiAl cyIsIHF1ZXJ5YnVmLmRhdGEpOwogCiAJLyoKLQkgKiBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRo ZXJlIGFyZSBub3QgZHVwbGljYXRlIHJvd3Mgd2l0aG91dCBOVUxMcyBpbgotCSAqIHRoZSBuZXcg ZGF0YSBzZXQgYmVmb3JlIHdlIGNhbiBjb3VudCBvbiB0aGUgImRpZmYiIHJlc3VsdHMuICBDaGVj ayBmb3IKLQkgKiB0aGF0IGluIGEgd2F5IHRoYXQgYWxsb3dzIHNob3dpbmcgdGhlIGZpcnN0IGR1 cGxpY2F0ZWQgcm93IGZvdW5kLiAgRXZlbgotCSAqIGFmdGVyIHdlIHBhc3MgdGhpcyB0ZXN0LCBh IHVuaXF1ZSBpbmRleCBvbiB0aGUgbWF0ZXJpYWxpemVkIHZpZXcgbWF5Ci0JICogZmluZCBhIGR1 cGxpY2F0ZSBrZXkgcHJvYmxlbS4KKwkgKiBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZXJlIGFy ZSBub3QgZHVwbGljYXRlIHJvd3MgaW4gdGhlIG5ldyBkYXRhIHNldAorCSAqIGJlZm9yZSB3ZSBj YW4gY291bnQgb24gdGhlICJkaWZmIiByZXN1bHRzLiAgQ2hlY2sgZm9yIHRoYXQgaW4gYSB3YXkK KwkgKiB0aGF0IGFsbG93cyBzaG93aW5nIHRoZSBmaXJzdCBkdXBsaWNhdGVkIHJvdyBmb3VuZC4g IFdlIGNoZWNrIGZvcgorCSAqIGR1cGxpY2F0ZXMgdXNpbmcgdGhlIHJlY29yZCBlcXVhbGl0eSBv cGVyYXRvciAoKj0pLCB3aGljaCB0cmVhdHMgTlVMTHMKKwkgKiBhcyBlcXVhbCB0byBlYWNoIG90 aGVyIC0gdGhlIHNhbWUgc2VtYW50aWNzIHVzZWQgYnkgdGhlIEZVTEwgT1VURVIgSk9JTgorCSAq IGluIHRoZSBkaWZmIHF1ZXJ5IGJlbG93LiAgRXZlbiBhZnRlciB3ZSBwYXNzIHRoaXMgdGVzdCwg YSB1bmlxdWUgaW5kZXgKKwkgKiBvbiB0aGUgbWF0ZXJpYWxpemVkIHZpZXcgbWF5IGZpbmQgYSBk dXBsaWNhdGUga2V5IHByb2JsZW0uCiAJICoKIAkgKiBOb3RlOiBoZXJlIGFuZCBiZWxvdywgd2Ug dXNlICJ0YWJsZW5hbWUuKjo6dGFibGVyb3d0eXBlIiBhcyBhIGhhY2sgdG8KIAkgKiBrZWVwICIu KiIgZnJvbSBiZWluZyBleHBhbmRlZCBpbnRvIG11bHRpcGxlIGNvbHVtbnMgaW4gYSBTRUxFQ1Qg bGlzdC4KQEAgLTY0OCw5ICs2NTAsOSBAQCByZWZyZXNoX2J5X21hdGNoX21lcmdlKE9pZCBtYXR2 aWV3T2lkLCBPaWQgdGVtcE9pZCwgT2lkIHJlbG93bmVyLAogCXJlc2V0U3RyaW5nSW5mbygmcXVl cnlidWYpOwogCWFwcGVuZFN0cmluZ0luZm8oJnF1ZXJ5YnVmLAogCQkJCQkgIlNFTEVDVCBuZXdk YXRhLio6OiVzIEZST00gJXMgbmV3ZGF0YSAiCi0JCQkJCSAiV0hFUkUgbmV3ZGF0YS4qIElTIE5P VCBOVUxMIEFORCBFWElTVFMgIgotCQkJCQkgIihTRUxFQ1QgMSBGUk9NICVzIG5ld2RhdGEyIFdI RVJFIG5ld2RhdGEyLiogSVMgTk9UIE5VTEwgIgotCQkJCQkgIkFORCBuZXdkYXRhMi4qIE9QRVJB VE9SKHBnX2NhdGFsb2cuKj0pIG5ld2RhdGEuKiAiCisJCQkJCSAiV0hFUkUgRVhJU1RTICIKKwkJ CQkJICIoU0VMRUNUIDEgRlJPTSAlcyBuZXdkYXRhMiAiCisJCQkJCSAiV0hFUkUgbmV3ZGF0YTIu KiBPUEVSQVRPUihwZ19jYXRhbG9nLio9KSBuZXdkYXRhLiogIgogCQkJCQkgIkFORCBuZXdkYXRh Mi5jdGlkIE9QRVJBVE9SKHBnX2NhdGFsb2cuPD4pICIKIAkJCQkJICJuZXdkYXRhLmN0aWQpIiwK IAkJCQkJIHRlbXBuYW1lLCB0ZW1wbmFtZSwgdGVtcG5hbWUpOwpAQCAtNjY3LDcgKzY2OSw3IEBA IHJlZnJlc2hfYnlfbWF0Y2hfbWVyZ2UoT2lkIG1hdHZpZXdPaWQsIE9pZCB0ZW1wT2lkLCBPaWQg cmVsb3duZXIsCiAJCSAqLwogCQllcmVwb3J0KEVSUk9SLAogCQkJCShlcnJjb2RlKEVSUkNPREVf Q0FSRElOQUxJVFlfVklPTEFUSU9OKSwKLQkJCQkgZXJybXNnKCJuZXcgZGF0YSBmb3IgbWF0ZXJp YWxpemVkIHZpZXcgXCIlc1wiIGNvbnRhaW5zIGR1cGxpY2F0ZSByb3dzIHdpdGhvdXQgYW55IG51 bGwgY29sdW1ucyIsCisJCQkJIGVycm1zZygibmV3IGRhdGEgZm9yIG1hdGVyaWFsaXplZCB2aWV3 IFwiJXNcIiBjb250YWlucyBkdXBsaWNhdGUgcm93cyIsCiAJCQkJCQlSZWxhdGlvbkdldFJlbGF0 aW9uTmFtZShtYXR2aWV3UmVsKSksCiAJCQkJIGVycmRldGFpbCgiUm93OiAlcyIsCiAJCQkJCQkg ICBTUElfZ2V0dmFsdWUoU1BJX3R1cHRhYmxlLT52YWxzWzBdLCBTUElfdHVwdGFibGUtPnR1cGRl c2MsIDEpKSkpOwotLSAKMi4zOS41IChBcHBsZSBHaXQtMTU0KQoK --0000000000003d65e2064a95a7d6--