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 1wQTW3-001aFR-07 for pgsql-hackers@arkaria.postgresql.org; Fri, 22 May 2026 17:18:31 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wQTVz-00Doei-1E for pgsql-hackers@arkaria.postgresql.org; Fri, 22 May 2026 17:18:28 +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 1wQTVy-00Doea-2W for pgsql-hackers@lists.postgresql.org; Fri, 22 May 2026 17:18:28 +0000 Received: from mail-dy1-x132c.google.com ([2607:f8b0:4864:20::132c]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wQTVx-00000000Ifw-3GNV for pgsql-hackers@postgresql.org; Fri, 22 May 2026 17:18:26 +0000 Received: by mail-dy1-x132c.google.com with SMTP id 5a478bee46e88-2f13ae64db1so538313eec.3 for ; Fri, 22 May 2026 10:18:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1779470304; cv=none; d=google.com; s=arc-20240605; b=i0r36fJJ/YJxroUdAJAZHq+hnXQQhH7ko1+d2TmYEHO16EjqPcr3zL11iot9tz/NJf jHTvmhZKNPBdXElD/D1k7OwynRyvYLKpDPr5Bjiq+XkAIQuh1wkkWTExhQ4aCDroFm5V MRrHSXF1E70bkesYt3BYKkQcVOLnnPBZAqtL1UtTU1mVsFCXzxs9RUYmoDlOYLVVcQ41 N/rdtmtI2XssoS5Rx5wRs+q5fwcGz/P+wfveBVJi8XIO6WXJ+2jYspzEc4qIpihL5Ujp EDz23dH0BcfZS97TgBH0lcsgJJINyTb0z57n08kTsKlMwgV9DfWJiKdwGwfggCGWQcsT pNgg== 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:mime-version:dkim-signature; bh=oVoS7Vowsub/B/PBDgJcUYi5CtVFeKI1IN36AtBBpYU=; fh=uGh4oi6d45xC7kod8QtsHBElc028b3z7ZDfP52LcQ/A=; b=eluprTPzxBFmeuJi4vb+X5uf7iUNFSgtyvPD6/mT61N3Pi48V/XRfrlULha8K/pZpA jOYADND4OiF4I6uL0g2Fq4gHtwFO6zkEhnHjDQLNxoPvtrhKXtozB9THJJPm9JOqkFbw +jFl8mPZQUr3CeMZc4uCTsA7e6f4iE0/JMCXrl3qU8jqsybnCzSK2pQXKTgjZOBR5257 2rmTw5nKaSiae2IUWw5xXP8zlA0rHgpUtJSvWZOkNGCX0Szzdf6zETEdHK0CY+ZmERqT mYqie5QpW3QTA0KBt31/MOxPde4DcLsQfTxWLOUdN9AOyTtrRymyR/d6RVvN+i5RTbtt FPuw==; darn=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=1779470304; x=1780075104; darn=postgresql.org; h=cc:to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=oVoS7Vowsub/B/PBDgJcUYi5CtVFeKI1IN36AtBBpYU=; b=S72SIvHLYY8hMxSN4axcu6LKbr5HjVv7bXXHdsWggLWHsEogUUv2bRDW7q3gx9Zm5u 7yFXblKmmRZ+mPFtw5pr6GOKeDRcVO2iO1fYyFN9Hdir6dWqJvEIUiuOtDKB3PFAit+r e+0B9o/mi3/9MY9PttEliyBPWJRD/F2EW6OZaqCu/8oZa+NIwUE1UnAtvtQaCyF1C94d r/qEYKDzNSUAJ5gIJWzXBZWlUYrjFZSqn3gEybI0B5HozVKQSQjSSl1NMNOeVbDnpN9S ypr/rUlvbzYT3qzKhWS9h11b0J4eVFcloxHIoNq+yEQ2Fxz7MrR+rZ5XTerad4FkbNaI ym3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779470304; x=1780075104; h=cc:to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=oVoS7Vowsub/B/PBDgJcUYi5CtVFeKI1IN36AtBBpYU=; b=L5IDUopgIjSuxEWut8fRpYmG6sgAP6mUQc+k3c2J/5m7Ss+MqK+rRfuDeTys9+V/lc ugzPa+Cp+//svRKVtPd4yG4v+wuQqsJMLB16pQL+ye03svSoR+J3kBy6OBTXayluMmk8 ribEpxAuXKzyYOPdU2DYdGnVzbwGZ+XCkXwXo99K4d9zBAtkLRM71r0dyvp9zN5OG0Wi Kwb25FiZSvEW5xpsUUDcpa2MMOS5gw9DlUcDq8nm+rJIbdc07hsX4LuhbMe7ZGWH0jgX Wczyb/WmXdBDCnjG5dqz2lUQfeE5r3N0NcMYdOBgRAloV0fFwv1er+BohaItGmllT9RI LaWQ== X-Gm-Message-State: AOJu0YxxXIMGIOpeyCM68Vmz59EBxhh4lS9+8D0PSwW872LHAQv/cQfF o9/EwTzM2m1QTx9Y9NV95++UXsMmuOyVYgNTotCWYmj4E1k5TgCHZrmEMAds0Rdc9IarxZZn8AB ZU531VbYq2+RtoMv9abwa9AGOGdlGd5zVoYgW X-Gm-Gg: Acq92OEl1E/uMP1d46LH+RunlctIDJVL1sYPorecPZ3Rql5S9GKCfcQqhnRuaCwqraz ir5GeTzIyVQZbCWmNf7qdmMsoOyrFkM7ioWnODs81zza3T20Zy8WvKF1uidIVIpHOTyY5NSecau S6bYxgRmuFWfEw0B3uQIjsTyY904CGCHvHk4sNhxaH3MgQ5CaNZjQ821aHK/VnBvrOHylSdBShz pmmvr09s/dnEa6tJc1mpHKRsgPWb6cRymw3FfcU/MC0c0yGgOhwNxvpIi6QjqCL/QBq6yPHA6xw 74VMDMOb5jdwkTCn0w== X-Received: by 2002:a05:7022:2527:b0:12b:f616:1a31 with SMTP id a92af1059eb24-1365fd85fb9mr721550c88.6.1779470304150; Fri, 22 May 2026 10:18:24 -0700 (PDT) MIME-Version: 1.0 From: Ethan Mertz Date: Fri, 22 May 2026 10:18:12 -0700 X-Gm-Features: AVHnY4I2ALkBx847N0o1oiTlR5blzPzsB4PNw0Z8haipWd0G6yPb8rnuvnCReDY Message-ID: Subject: [PATCH] Improving index selection for logical replication apply with replica identity full To: pgsql-hackers@postgresql.org Cc: "kuroda.hayato@fujitsu.com" , "onderkalaci@gmail.com" Content-Type: multipart/mixed; boundary="0000000000005ea0ed06526b37d4" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000005ea0ed06526b37d4 Content-Type: multipart/alternative; boundary="0000000000005ea0eb06526b37d2" --0000000000005ea0eb06526b37d2 Content-Type: text/plain; charset="UTF-8" Hello hackers, I'd like to reopen the discussion on index selection for logical replication apply for replica identity full. Since PostgreSQL 14, replica identity full is able to make use of existing indexes [1][2] (authors in CC) when replicating UPDATE or DELETE operations. Today, when identifying which index to use for the update or delete, the first suitable index is chosen by OID order, which generally corresponds to creation order. If the chosen index has low cardinality, the lookup may perform no better than a sequential scan. While avoiding replica identity full is generally recommended, some users need to maintain REPLICA IDENTITY FULL to support downstream logical consumers that require full row images. These users would also like performant PostgreSQL to PostgreSQL replication. I propose improving the index selection heuristic to prefer unique indexes, favoring those with fewer columns. Previous discussion in the linked threads avoided invoking the planner for full index selection; the heuristic I propose serves as a middle ground. A unique index guarantees that each tuple match requires at most one index scan, and among unique indexes, fewer columns means a narrower, more efficient lookup. I have attached a patch implementing this check. In addition, I've performed some simple performance testing of this patch: ``` CREATE TABLE cardinality_index_test ( id uuid NOT NULL DEFAULT gen_random_uuid(), is_active boolean NOT NULL DEFAULT true, payload text NOT NULL DEFAULT repeat('x', 200) ); CREATE INDEX idx_bad_low_cardinality ON cardinality_index_test (is_active); CREATE UNIQUE INDEX idx_good_unique ON cardinality_index_test (id); ``` With the patch, the time to replicate 1,000 point updates on a table size of 1,000,000 dropped from 53 seconds to under 1 second. Feedback welcome. Thanks, Ethan Mertz SDE, Amazon Web Services [1] https://www.postgresql.org/message-id/flat/CACawEhVLqmAAyPXdHEPv1ssU2c%3DdqOniiGz7G73HfyS7%2BnGV4w%40mail.gmail.com [2] https://www.postgresql.org/message-id/flat/TYAPR01MB58669D7414E59664E17A5827F522A%40TYAPR01MB5866.jpnprd01.prod.outlook.com --0000000000005ea0eb06526b37d2 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hello hackers, =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0

I= 9;d like to reopen the discussion on index selection for logical replicatio= n apply for replica identity full. Since PostgreSQL 14, replica identity fu= ll is able to make use of existing indexes [1][2] (authors in CC) when repl= icating UPDATE or DELETE=C2=A0operations.

Today, when identifyi= ng which index to use for the update or delete, the first suitable index is= chosen by OID order, which generally corresponds to creation order. If the= chosen index has low cardinality, the lookup may perform no better than a = sequential scan. While avoiding replica identity full is generally recommen= ded, some users need to maintain REPLICA IDENTITY FULL to support downstrea= m logical consumers that require full row images. These users would also li= ke performant PostgreSQL to PostgreSQL replication.

I propose = improving the index selection heuristic to prefer unique indexes, favoring = those with fewer columns. Previous discussion in the linked threads avoided= invoking the planner for full index selection; the heuristic I propose ser= ves as a middle ground. A unique index guarantees that each tuple match req= uires at most one index scan, and among unique indexes, fewer columns means= a narrower, more efficient lookup. I have attached a patch implementing th= is check.
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0
=
In addition, I've performed some simple performance testing o= f this patch:

```
CREATE TABLE cardinality_inde= x_test (
=C2=A0 =C2=A0 id =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0uuid NOT NUL= L DEFAULT gen_random_uuid(),
=C2=A0 =C2=A0 is_active =C2=A0 boolean NOT = NULL DEFAULT true,
=C2=A0 =C2=A0 payload =C2=A0 =C2=A0 text NOT NULL DEF= AULT repeat('x', 200)
);

CREATE INDEX idx_bad_low_cardina= lity ON cardinality_index_test=C2=A0(is_active);

CREATE UNIQUE INDEX= idx_good_unique ON cardinality_index_test=C2=A0(id);
```

With th= e patch, the time to replicate 1,000 point updates on a table size of 1,000= ,000 dropped from 53 seconds to under 1 second.

Feedback welcome.=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0
Thanks, =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0
Ethan Mertz
SDE, Amazon Web Services
=
[1]=C2=A0https://www.postgresql.org/message-id/flat/CACawEhVLqmAAyPXdHEPv1s= sU2c%3DdqOniiGz7G73HfyS7%2BnGV4w%40mail.gmail.com=C2=A0
[2]=C2=A0https://www.postgresql.org/message-id/flat/TYAPR01MB58669D7414E59664E17A58= 27F522A%40TYAPR01MB5866.jpnprd01.prod.outlook.com
--0000000000005ea0eb06526b37d2-- --0000000000005ea0ed06526b37d4 Content-Type: application/x-patch; name="v1-0001-Improve-index-selection-for-REPLICA-IDENTITY-FULL.patch" Content-Disposition: attachment; filename="v1-0001-Improve-index-selection-for-REPLICA-IDENTITY-FULL.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mph589oe0 RnJvbSAzYmZhY2MwNDI4MzA3ZjE4Zjc1M2JhYjExY2YxNDAwNzgxY2FmMDllIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBFdGhhbiBNZXJ0eiA8ZXRobWVydHpAYW1hem9uLmNvbT4KRGF0 ZTogVGh1LCAyMSBNYXkgMjAyNiAyMjo0MToxMyArMDAwMApTdWJqZWN0OiBbUEFUQ0ggdjFdIElt cHJvdmUgaW5kZXggc2VsZWN0aW9uIGZvciBSRVBMSUNBIElERU5USVRZIEZVTEwKCldoZW4gbXVs dGlwbGUgdXNhYmxlIGluZGV4ZXMgZXhpc3QgZm9yIGEgcmVsYXRpb24gd2l0aCBSRVBMSUNBIElE RU5USVRZCkZVTEwsIHRoZSBzdWJzY3JpYmVyIG5vdyBwcmVmZXJzIHVuaXF1ZSBpbmRleGVzIG92 ZXIgbm9uLXVuaXF1ZSBvbmVzCihzaW5jZSBhIHVuaXF1ZSBpbmRleCBndWFyYW50ZWVzIGF0IG1v c3Qgb25lIHR1cGxlIHBlciBpbmRleCBzY2FuKSwgYW5kCmFtb25nIGluZGV4ZXMgb2YgdGhlIHNh bWUgdW5pcXVlbmVzcywgcHJlZmVycyB0aG9zZSB3aXRoIGZld2VyIGtleQpjb2x1bW5zIGZvciBh IG5hcnJvd2VyLCBtb3JlIGVmZmljaWVudCBsb29rdXAuCgpQcmV2aW91c2x5LCB0aGUgZmlyc3Qg ZWxpZ2libGUgaW5kZXggZm91bmQgd2FzIHJldHVybmVkIHdpdGhvdXQKY29uc2lkZXJpbmcgd2hl dGhlciBhIGJldHRlciBjYW5kaWRhdGUgZXhpc3RlZC4gIFRoaXMgY291bGQgbGVhZCB0bwpzdWJv cHRpbWFsIGluZGV4IHVzYWdlIGR1cmluZyBsb2dpY2FsIHJlcGxpY2F0aW9uIGFwcGx5LCBwYXJ0 aWN1bGFybHkKd2hlbiBib3RoIHVuaXF1ZSBhbmQgbm9uLXVuaXF1ZSBpbmRleGVzIHdlcmUgYXZh aWxhYmxlLgoKUmVncmVzc2lvbiB0ZXN0cyBhcmUgaW5jbHVkZWQgdG8gdmVyaWZ5IHRoZSBzZWxl Y3Rpb24gbG9naWMuCi0tLQogc3JjL2JhY2tlbmQvcmVwbGljYXRpb24vbG9naWNhbC9yZWxhdGlv bi5jICAgIHwgMzQgKysrKysrKystLQogLi4uL3N1YnNjcmlwdGlvbi90LzAzMl9zdWJzY3JpYmVf dXNlX2luZGV4LnBsIHwgNjQgKysrKysrKysrKysrKysrKysrKwogMiBmaWxlcyBjaGFuZ2VkLCA5 NCBpbnNlcnRpb25zKCspLCA0IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L3JlcGxpY2F0aW9uL2xvZ2ljYWwvcmVsYXRpb24uYyBiL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9u L2xvZ2ljYWwvcmVsYXRpb24uYwppbmRleCAwYjFkODBiNWIwZi4uMjMzNGUwYzA0OWYgMTAwNjQ0 Ci0tLSBhL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2xvZ2ljYWwvcmVsYXRpb24uYworKysgYi9z cmMvYmFja2VuZC9yZXBsaWNhdGlvbi9sb2dpY2FsL3JlbGF0aW9uLmMKQEAgLTc4NCwyOCArNzg0 LDU0IEBAIGxvZ2ljYWxyZXBfcGFydGl0aW9uX29wZW4oTG9naWNhbFJlcFJlbE1hcEVudHJ5ICpy b290LAogICogV2UgZXhwZWN0IHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIFJFUExJQ0EgSURF TlRJVFkgRlVMTCBpcyBkZWZpbmVkIGZvcgogICogdGhlIHJlbW90ZSByZWxhdGlvbi4KICAqCisg KiBJZiBtdWx0aXBsZSB1c2FibGUgaW5kZXhlcyBleGlzdCwgcHJlZmVyZW5jZSBpcyBnaXZlbiB0 byB1bmlxdWUgaW5kZXhlcworICogKHNpbmNlIHRoZXkgZ3VhcmFudGVlIGF0IG1vc3Qgb25lIHR1 cGxlIHBlciBpbmRleCBzY2FuKSwgYW5kIGFtb25nIGluZGV4ZXMKKyAqIG9mIHRoZSBzYW1lIHVu aXF1ZW5lc3MsIHRob3NlIHdpdGggZmV3ZXIga2V5IGNvbHVtbnMgYXJlIHByZWZlcnJlZCBmb3Ig YQorICogbmFycm93ZXIsIG1vcmUgZWZmaWNpZW50IGxvb2t1cC4KKyAqCiAgKiBJZiBubyBzdWl0 YWJsZSBpbmRleCBpcyBmb3VuZCwgcmV0dXJucyBJbnZhbGlkT2lkLgogICovCiBzdGF0aWMgT2lk CiBGaW5kVXNhYmxlSW5kZXhGb3JSZXBsaWNhSWRlbnRpdHlGdWxsKFJlbGF0aW9uIGxvY2FscmVs LCBBdHRyTWFwICphdHRybWFwKQogewogCUxpc3QJICAgKmlkeGxpc3QgPSBSZWxhdGlvbkdldElu ZGV4TGlzdChsb2NhbHJlbCk7CisJT2lkCQkJYmVzdElkeCA9IEludmFsaWRPaWQ7CisJYm9vbAkJ YmVzdElzVW5pcXVlID0gZmFsc2U7CisJaW50CQkJYmVzdE5LZXlBdHRzID0gUEdfSU5UMzJfTUFY OwogCiAJZm9yZWFjaF9vaWQoaWR4b2lkLCBpZHhsaXN0KQogCXsKIAkJYm9vbAkJaXNVc2FibGVJ ZHg7CisJCWJvb2wJCWlzVW5pcXVlOworCQlpbnQJCQluS2V5QXR0czsKIAkJUmVsYXRpb24JaWR4 UmVsOwogCiAJCWlkeFJlbCA9IGluZGV4X29wZW4oaWR4b2lkLCBBY2Nlc3NTaGFyZUxvY2spOwog CQlpc1VzYWJsZUlkeCA9IElzSW5kZXhVc2FibGVGb3JSZXBsaWNhSWRlbnRpdHlGdWxsKGlkeFJl bCwgYXR0cm1hcCk7CisJCWlzVW5pcXVlID0gaWR4UmVsLT5yZF9pbmRleC0+aW5kaXN1bmlxdWU7 CisJCW5LZXlBdHRzID0gaWR4UmVsLT5yZF9pbmRleC0+aW5kbmtleWF0dHM7CiAJCWluZGV4X2Ns b3NlKGlkeFJlbCwgQWNjZXNzU2hhcmVMb2NrKTsKIAotCQkvKiBSZXR1cm4gdGhlIGZpcnN0IGVs aWdpYmxlIGluZGV4IGZvdW5kICovCi0JCWlmIChpc1VzYWJsZUlkeCkKLQkJCXJldHVybiBpZHhv aWQ7CisJCWlmICghaXNVc2FibGVJZHgpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBQcmVm ZXIgdW5pcXVlIGluZGV4ZXMgb3ZlciBub24tdW5pcXVlIG9uZXMsIHNpbmNlIGEgdW5pcXVlIGlu ZGV4CisJCSAqIGd1YXJhbnRlZXMgYXQgbW9zdCBvbmUgaW5kZXggc2NhbiBwZXIgdHVwbGUgbWF0 Y2guICBBbW9uZyBpbmRleGVzCisJCSAqIG9mIHRoZSBzYW1lIHVuaXF1ZW5lc3MsIHByZWZlciBm ZXdlciBrZXkgY29sdW1ucyBmb3IgYSBuYXJyb3dlciwKKwkJICogbW9yZSBlZmZpY2llbnQgbG9v a3VwLgorCQkgKi8KKwkJaWYgKGJlc3RJZHggPT0gSW52YWxpZE9pZCB8fAorCQkJKGlzVW5pcXVl ICYmICFiZXN0SXNVbmlxdWUpIHx8CisJCQkoaXNVbmlxdWUgPT0gYmVzdElzVW5pcXVlICYmIG5L ZXlBdHRzIDwgYmVzdE5LZXlBdHRzKSkKKwkJeworCQkJYmVzdElkeCA9IGlkeG9pZDsKKwkJCWJl c3RJc1VuaXF1ZSA9IGlzVW5pcXVlOworCQkJYmVzdE5LZXlBdHRzID0gbktleUF0dHM7CisJCX0K IAl9CiAKLQlyZXR1cm4gSW52YWxpZE9pZDsKKwlyZXR1cm4gYmVzdElkeDsKIH0KIAogLyoKZGlm ZiAtLWdpdCBhL3NyYy90ZXN0L3N1YnNjcmlwdGlvbi90LzAzMl9zdWJzY3JpYmVfdXNlX2luZGV4 LnBsIGIvc3JjL3Rlc3Qvc3Vic2NyaXB0aW9uL3QvMDMyX3N1YnNjcmliZV91c2VfaW5kZXgucGwK aW5kZXggYzc1NWMxYTc1MTguLjM2MzdiMGU5YWNhIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9zdWJz Y3JpcHRpb24vdC8wMzJfc3Vic2NyaWJlX3VzZV9pbmRleC5wbAorKysgYi9zcmMvdGVzdC9zdWJz Y3JpcHRpb24vdC8wMzJfc3Vic2NyaWJlX3VzZV9pbmRleC5wbApAQCAtNTQ3LDYgKzU0Nyw3MCBA QCAkbm9kZV9zdWJzY3JpYmVyLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgIkRST1AgVEFCTEUgdGVz dF9yZXBsaWNhX2lkX2Z1bGwiKTsKICMgVGVzdGNhc2UgZW5kOiBTdWJzY3JpcHRpb24gY2FuIHVz ZSBoYXNoIGluZGV4CiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKKyMgPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0KKyMgVGVzdGNhc2Ugc3RhcnQ6IEluZGV4IHNlbGVjdGlvbiBwcmVmZXJzIHVuaXF1ZSBp bmRleGVzIGFuZCBmZXdlciBrZXkgY29sdW1ucworIworCisjIGNyZWF0ZSB0YWJsZXMgcHViIGFu ZCBzdWIKKyRub2RlX3B1Ymxpc2hlci0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCisJIkNSRUFURSBU QUJMRSB0ZXN0X2lkeF9zZWxlY3QgKGEgaW50LCBiIGludCwgYyBpbnQpIik7Ciskbm9kZV9wdWJs aXNoZXItPnNhZmVfcHNxbCgncG9zdGdyZXMnLAorCSJBTFRFUiBUQUJMRSB0ZXN0X2lkeF9zZWxl Y3QgUkVQTElDQSBJREVOVElUWSBGVUxMIik7Ciskbm9kZV9zdWJzY3JpYmVyLT5zYWZlX3BzcWwo J3Bvc3RncmVzJywKKwkiQ1JFQVRFIFRBQkxFIHRlc3RfaWR4X3NlbGVjdCAoYSBpbnQsIGIgaW50 LCBjIGludCkiKTsKKworIyBjcmVhdGUgYSBub24tdW5pcXVlIGluZGV4IG9uIChhLCBiLCBjKSBh bmQgYSB1bmlxdWUgaW5kZXggb24gKGEsIGIpCisjIHRoZSB1bmlxdWUgaW5kZXggd2l0aCBmZXdl ciBjb2x1bW5zIHNob3VsZCBiZSBwcmVmZXJyZWQKKyRub2RlX3N1YnNjcmliZXItPnNhZmVfcHNx bCgncG9zdGdyZXMnLAorCSJDUkVBVEUgSU5ERVggdGVzdF9pZHhfc2VsZWN0X25vbnVuaXEgT04g dGVzdF9pZHhfc2VsZWN0KGEsIGIsIGMpIik7Ciskbm9kZV9zdWJzY3JpYmVyLT5zYWZlX3BzcWwo J3Bvc3RncmVzJywKKwkiQ1JFQVRFIFVOSVFVRSBJTkRFWCB0ZXN0X2lkeF9zZWxlY3RfdW5pcSBP TiB0ZXN0X2lkeF9zZWxlY3QoYSwgYikiKTsKKworIyBjcmVhdGUgcHViL3N1YgorJG5vZGVfcHVi bGlzaGVyLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKKwkiQ1JFQVRFIFBVQkxJQ0FUSU9OIHRhcF9w dWJfaWR4X3NlbGVjdCBGT1IgVEFCTEUgdGVzdF9pZHhfc2VsZWN0Iik7Ciskbm9kZV9zdWJzY3Jp YmVyLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKKwkiQ1JFQVRFIFNVQlNDUklQVElPTiB0YXBfc3Vi X2lkeF9zZWxlY3QgQ09OTkVDVElPTiAnJHB1Ymxpc2hlcl9jb25uc3RyIGFwcGxpY2F0aW9uX25h bWU9JGFwcG5hbWUnIFBVQkxJQ0FUSU9OIHRhcF9wdWJfaWR4X3NlbGVjdCIKKyk7CisKKyMgd2Fp dCBmb3IgaW5pdGlhbCB0YWJsZSBzeW5jaHJvbml6YXRpb24gdG8gZmluaXNoCiskbm9kZV9zdWJz Y3JpYmVyLT53YWl0X2Zvcl9zdWJzY3JpcHRpb25fc3luYygkbm9kZV9wdWJsaXNoZXIsICRhcHBu YW1lKTsKKworIyBpbnNlcnQgYW5kIHVwZGF0ZSBhIHJvdworJG5vZGVfcHVibGlzaGVyLT5zYWZl X3BzcWwoJ3Bvc3RncmVzJywKKwkiSU5TRVJUIElOVE8gdGVzdF9pZHhfc2VsZWN0IFZBTFVFUyAo MSwgMiwgMykiKTsKKyRub2RlX3B1Ymxpc2hlci0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCisJIlVQ REFURSB0ZXN0X2lkeF9zZWxlY3QgU0VUIGMgPSA0IFdIRVJFIGEgPSAxIik7CisKKyMgd2FpdCBm b3IgY2F0Y2h1cCBhbmQgdmVyaWZ5IHRoZSB1bmlxdWUgaW5kZXggd2FzIHVzZWQKKyRub2RlX3B1 Ymxpc2hlci0+d2FpdF9mb3JfY2F0Y2h1cCgkYXBwbmFtZSk7Ciskbm9kZV9zdWJzY3JpYmVyLT5w b2xsX3F1ZXJ5X3VudGlsKCdwb3N0Z3JlcycsCisJcXtzZWxlY3QgKGlkeF9zY2FuID0gMSkgZnJv bSBwZ19zdGF0X2FsbF9pbmRleGVzIHdoZXJlIGluZGV4cmVsbmFtZSA9ICd0ZXN0X2lkeF9zZWxl Y3RfdW5pcSc7fQorICApCisgIG9yIGRpZQorICAiVGltZWQgb3V0IHdoaWxlIHdhaXRpbmcgZm9y IHVuaXF1ZSBpbmRleCB0byBiZSB1c2VkIjsKKworIyB2ZXJpZnkgdGhlIG5vbi11bmlxdWUgaW5k ZXggd2FzIE5PVCB1c2VkCiskcmVzdWx0ID0gJG5vZGVfc3Vic2NyaWJlci0+c2FmZV9wc3FsKCdw b3N0Z3JlcycsCisJInNlbGVjdCBpZHhfc2NhbiBmcm9tIHBnX3N0YXRfYWxsX2luZGV4ZXMgd2hl cmUgaW5kZXhyZWxuYW1lID0gJ3Rlc3RfaWR4X3NlbGVjdF9ub251bmlxJyIpOworaXMoJHJlc3Vs dCwgcXEoMCksCisJJ25vbi11bmlxdWUgaW5kZXggc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4gdW5p cXVlIGluZGV4IGlzIGF2YWlsYWJsZScpOworCisjIHZlcmlmeSBjb3JyZWN0IGRhdGEKKyRyZXN1 bHQgPSAkbm9kZV9zdWJzY3JpYmVyLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKKwkic2VsZWN0IGMg ZnJvbSB0ZXN0X2lkeF9zZWxlY3Qgd2hlcmUgYSA9IDEiKTsKK2lzKCRyZXN1bHQsIHFxKDQpLAor CSdzdWJzY3JpYmVyIGhhcyBjb3JyZWN0IGRhdGEgYWZ0ZXIgdXBkYXRlIHZpYSBwcmVmZXJyZWQg dW5pcXVlIGluZGV4Jyk7CisKKyMgY2xlYW51cAorJG5vZGVfcHVibGlzaGVyLT5zYWZlX3BzcWwo J3Bvc3RncmVzJywgIkRST1AgUFVCTElDQVRJT04gdGFwX3B1Yl9pZHhfc2VsZWN0Iik7Ciskbm9k ZV9wdWJsaXNoZXItPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAiRFJPUCBUQUJMRSB0ZXN0X2lkeF9z ZWxlY3QiKTsKKyRub2RlX3N1YnNjcmliZXItPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAiRFJPUCBT VUJTQ1JJUFRJT04gdGFwX3N1Yl9pZHhfc2VsZWN0Iik7Ciskbm9kZV9zdWJzY3JpYmVyLT5zYWZl X3BzcWwoJ3Bvc3RncmVzJywgIkRST1AgVEFCTEUgdGVzdF9pZHhfc2VsZWN0Iik7CisKKyMgVGVz dGNhc2UgZW5kOiBJbmRleCBzZWxlY3Rpb24gcHJlZmVycyB1bmlxdWUgaW5kZXhlcyBhbmQgZmV3 ZXIga2V5IGNvbHVtbnMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwogJG5vZGVfc3Vic2NyaWJl ci0+c3RvcCgnZmFzdCcpOwogJG5vZGVfcHVibGlzaGVyLT5zdG9wKCdmYXN0Jyk7CiAKLS0gCjIu NDcuMwoK --0000000000005ea0ed06526b37d4--