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 1vw33o-00HOAg-1J for pgsql-hackers@arkaria.postgresql.org; Fri, 27 Feb 2026 18:59:36 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vw33n-005poA-0d for pgsql-hackers@arkaria.postgresql.org; Fri, 27 Feb 2026 18:59:35 +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 1vw33m-005pnd-24 for pgsql-hackers@lists.postgresql.org; Fri, 27 Feb 2026 18:59:34 +0000 Received: from mail-yw1-x1135.google.com ([2607:f8b0:4864:20::1135]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vw33j-00000001Xzh-2KPy for pgsql-hackers@postgresql.org; Fri, 27 Feb 2026 18:59:33 +0000 Received: by mail-yw1-x1135.google.com with SMTP id 00721157ae682-793fdbb8d3aso28486787b3.3 for ; Fri, 27 Feb 2026 10:59:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1772218772; cv=none; d=google.com; s=arc-20240605; b=SNPIQ3bUDzdBnRelV0RcmKjc7YFeNp0Iayx0DKY3l4XI//XpXJOgLM7PU/AxdgOWv2 lmlKsKsnhvNrOS1y5rHzp+MRTkec5kRS8bYtPDf7HQsar7BLIA4uwrhQeaie1pThPEu2 JKJCEal74FJh7bKs1H+tC2Ni+eNkoPvhKBOJFn/Z0IB0zasTdsINYFZ1dMQMrh+j+JGd wYCWZH0ySbxJ3DWLPhCSEkQaHcj3xXRP/5Etjc5RBX+GR4+CbTPAr5EeQg/T2ik05sZG Xyu0tPr85Lj+rZWCmcfHkqkhABhT8OVTKDTk5J2f4MZn6UxNY/UUjZXdjkvafVUpjJT1 MfIA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=rv0dXDjuyvw+TjcaVE/Bi1pLf3EUhzkDBCKBlO7FrP8=; fh=33OU7BWuulPFH378PdKTnpeW+jw3IP20DTmpLDeQ3pE=; b=UuNsBHN44jliw7c1tgMZ2YaCsmqzVxKMS2Xi8iM0MeWuGAkCm2TMDLE6/gMDETvgig jw244l+jTXnOfTD9x7K0QACcaLX6kt7FNw33uoDmSbq8T1LTDb6Ey8QsamidUXzUbQ2t BuyaHcx0mDi54uN/UIxcfb/Yn070EGRhKCd/EJlCwjMpd7xAjjgXdF+NQoXkJD95RVkx mmK7g8Em0gj0IoNNvELRfWkxk2xNhD1wm2TihH8I9vhO+N8h+qSJ56Y4C1vlXPGv/SpK jB8gkHUt2YOIR6yMQQZeCy8um3QOHLfNmVAuCzG/Tpif0ZO+TY2cQAuiNqMSh9toFxGm 40mA==; 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=20230601; t=1772218772; x=1772823572; darn=postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=rv0dXDjuyvw+TjcaVE/Bi1pLf3EUhzkDBCKBlO7FrP8=; b=aIXE0bjbFXER4li0LZ+4dX+Q0i2UNZQtIzHjVtXWJPq+c7a13yLxQOSx6LG686B4Ug AolotvAg1CIkZPb/q0GTzgQBuZQ7Art1ubycHGW2/jfBk3IJvqnyf2ojTFVEkS7/vpuc ovBdp3q78flWLaxmIoJrQSrJ9sCucChwCpIGPmD3/FQDiH8/8dm4GXvEpDVNdz636AaL XPm6GbMnghtwz2K9ouyMCGnJHtSe5xTlaQdV9fVbKucW2C0eJNyh5INxlQpzzCv4ARs/ hNYtnQzhK51R5Gnun4r9ezOwZ6TT663q11ry22NhkkmsRn3qWoT/wYyiZmkkbOiS9nsG SJxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772218772; x=1772823572; h=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=rv0dXDjuyvw+TjcaVE/Bi1pLf3EUhzkDBCKBlO7FrP8=; b=uYsI3QXF7rYmFxW/BgpyTFVcftZUIKIKHhrnfLz+sfnFWIVIxOsB45j/8UcleUPL8B DXYRqu7peCZ8YWmJUWQfUyEn/FGEKhYepJI0b67+b9a2lY5DRo+qLZP9H1xkj+TDEeXi N1mjQIrxWJqC09cIj1EIuQ/aWRRzKPzVRZLN9PgnzR4NawsPlo7aXuJ+3X+F2483RW7d oQUBCSKfn7O4fnp7jJqaHPMzEC6TTU5WebTqR6PAymKbs7rofahovZA/OhECNB+DSY5T kKagMuvmvUOBFtq/wTZtHflZ44KWGSuj/mnuhEYsPfkfLz+exWg1/RTzH2kfmA42nc5Z qPuA== X-Gm-Message-State: AOJu0YxTW5OEJ1A3cLjZbZGS6Uy6wky9YFs+VKn9oGIbSGaKRZI1ZD6Z wQu7IjFvObwY8EEpLani/GLMVCY1Vv2s5UHEXaKgp/UiarLudMcSpkDRgLMfLqofmASsKomlRin RL1io5x/MKNLF9ewRbmBywuuQmRevBRlnjnTSQBNe8Q== X-Gm-Gg: ATEYQzzxKhh7vh+u3kkqVNwGC85ey7D/J1BcG8gSyqUHfEdc8ZM4wQPy7U2rihN3Ac+ ZjJXgicNHrX2YQm+E5IzCrwNCxRIBQ47ESNO0a+EmBj6phwg6C3jBchRSWaaSlP+PaopJi6Y0Zm sELe0ITigcgnRbxKMLntkRmvFOIhBz4blV528PNzQzH7VbOLlotYCZwjiVBpPo3yCJgBBqDQJZh A+jhPaphsc9S0mppCK0X3nt2+MJSFPs2sCABPi7Ot30yslIdLhj7+fWWbZWorxn8XhTTT4AiDyY 7/OAjg== X-Received: by 2002:a05:690c:680c:b0:798:3051:2f25 with SMTP id 00721157ae682-7988563db1fmr36841277b3.59.1772218771806; Fri, 27 Feb 2026 10:59:31 -0800 (PST) MIME-Version: 1.0 From: Ayush Tiwari Date: Sat, 28 Feb 2026 00:29:20 +0530 X-Gm-Features: AaiRm52EpB9RWkH8M0LO3hvKO1gkN6BygrnPvrlugQ5R0n4gWoDOncZUKX6SBBY Message-ID: Subject: tid_blockno() and tid_offset() accessor functions To: pgsql-hackers@postgresql.org Content-Type: multipart/mixed; boundary="0000000000005be1f4064bd2d6fe" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000005be1f4064bd2d6fe Content-Type: multipart/alternative; boundary="0000000000005be1f4064bd2d6fc" --0000000000005be1f4064bd2d6fc Content-Type: text/plain; charset="UTF-8" Hi hackers, As of now we don't have any built-in way to extract the block and offset components from a TID. When people need to group by page (like for bloat analysis) or filter by specific blocks, they usually end up using the `ctid::text::point` hack: SELECT (ctid::text::point)[0]::bigint AS blockno, (ctid::text::point)[1]::int AS offset FROM my_table; This works, but it's pretty clunky, relies on the text representation, and isn't great if you're trying to parse TIDs outside of SQL. The attached patch adds two simple accessor functions: - `tid_blockno(tid) -> bigint` - `tid_offset(tid) -> integer` A couple of quick notes on the implementation I went for: - `tid_blockno` returns `int8` since `BlockNumber` is `uint32` and could overflow `int4`. - `tid_offset` returns `int4` since `OffsetNumber` is `uint16`. - Both are marked leakproof and strict. - I used the `NoCheck` macros from `itemptr.h` so they safely handle user-supplied literals like `(0,0)`. Please let me know what you think! Regards, Ayush --0000000000005be1f4064bd2d6fc Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi hackers,

As of now we don't have any built-i= n way to extract the block and offset components from a TID. When people ne= ed to group by page (like for bloat analysis) or filter by specific blocks,= they usually end up using the `ctid::text::point` hack:

=C2=A0 =C2= =A0 SELECT (ctid::text::point)[0]::bigint AS blockno,
=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0(ctid::text::point)[1]::int =C2=A0 =C2=A0AS offset<= br>=C2=A0 =C2=A0 FROM my_table;

This works, but it's pretty clun= ky, relies on the text representation, and isn't great if you're tr= ying to parse TIDs outside of SQL.

The attached patch adds two simpl= e accessor functions:
- `tid_blockno(tid) -> bigint`
- `tid_offset= (tid) -> integer`

A couple of quick notes on the implementation I= went for:
- `tid_blockno` returns `int8` since `BlockNumber` is `uint32= ` and could overflow `int4`.
- `tid_offset` returns `int4` since `Offset= Number` is `uint16`.
- Both are marked leakproof and strict.
- I used= the `NoCheck` macros from `itemptr.h` so they safely handle user-supplied = literals like `(0,0)`.

Please let me know what you think!

Reg= ards,
Ayush
--0000000000005be1f4064bd2d6fc-- --0000000000005be1f4064bd2d6fe Content-Type: application/octet-stream; name="0001-Add-tid_blockno-and-tid_offset-accessor-functions.patch" Content-Disposition: attachment; filename="0001-Add-tid_blockno-and-tid_offset-accessor-functions.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mm5977690 RnJvbSAwMmI2NTI2NDBlM2VlYmViNTc1ZGUxYTFmMzZmYjUwMTNjZGYwNTg1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBeXVzaCBUaXdhcmkgPGF5dXNodGl3YXJpLnNsZzAxQGdtYWls LmNvbT4KRGF0ZTogRnJpLCAyNyBGZWIgMjAyNiAxODo0ODoxMSArMDAwMApTdWJqZWN0OiBbUEFU Q0ggdjFdIEFkZCB0aWRfYmxvY2tubygpIGFuZCB0aWRfb2Zmc2V0KCkgYWNjZXNzb3IgZnVuY3Rp b25zCgpBZGQgdHdvIG5ldyBidWlsdC1pbiBTUUwgZnVuY3Rpb25zIHRvIGV4dHJhY3QgdGhlIGNv bXBvbmVudHMgb2YgYSB0aWQKKHR1cGxlIGlkZW50aWZpZXIpIHZhbHVlOgoKICB0aWRfYmxvY2tu byh0aWQpIC0+IGJpZ2ludCAgIC0tIGV4dHJhY3QgYmxvY2sgbnVtYmVyCiAgdGlkX29mZnNldCh0 aWQpICAtPiBpbnRlZ2VyICAtLSBleHRyYWN0IG9mZnNldCBudW1iZXIKClRoZXNlIHByb3ZpZGUg YSBjbGVhbiwgZWZmaWNpZW50IGFsdGVybmF0aXZlIHRvIHRoZSBjb21tb24gd29ya2Fyb3VuZApv ZiBjdGlkOjp0ZXh0Ojpwb2ludCBmb3IgZGVjb21wb3NpbmcgVElEIHZhbHVlcy4gVGhlIHRleHQt YmFzZWQgaGFjawppcyBmcmFnaWxlLCBpbmVmZmljaWVudCwgYW5kIHVuYXZhaWxhYmxlIG91dHNp ZGUgb2YgU1FMIGNvbnRleHRzLgoKdGlkX2Jsb2Nrbm8oKSByZXR1cm5zIGludDggKGJpZ2ludCkg YmVjYXVzZSBCbG9ja051bWJlciBpcyB1aW50MzIsCndoaWNoIGV4Y2VlZHMgdGhlIHJhbmdlIG9m IGludDQuIHRpZF9vZmZzZXQoKSByZXR1cm5zIGludDQgKGludGVnZXIpCmJlY2F1c2UgT2Zmc2V0 TnVtYmVyIGlzIHVpbnQxNiwgd2hpY2ggZml0cyBzYWZlbHkgaW4gaW50NC4KCkJvdGggZnVuY3Rp b25zIHVzZSB0aGUgTm9DaGVjayBhY2Nlc3NvciB2YXJpYW50cyBmcm9tIGl0ZW1wdHIuaCwKYXJl IG1hcmtlZCBsZWFrcHJvb2YsIGFuZCBpbmNsdWRlIHJlZ3Jlc3Npb24gdGVzdHMgY292ZXJpbmcg dHlwaWNhbAp2YWx1ZXMsIGJvdW5kYXJ5IGNvbmRpdGlvbnMsIE5VTEwgaGFuZGxpbmcsIGFuZCBy b3VuZC10cmlwIGlkZW50aXR5LgotLS0KIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC90aWQuYyAgICAg ICAgICAgICAgfCAzMSArKysrKysrKysrKwogc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRh dCAgICAgICAgICB8ICA2ICsrKwogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9vcHJfc2FuaXR5 Lm91dCB8ICAyICsKIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvdGlkLm91dCAgICAgICAgfCA2 NiArKysrKysrKysrKysrKysrKysrKysrKysKIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3RpZC5zcWwg ICAgICAgICAgICAgfCAyMSArKysrKysrKwogNSBmaWxlcyBjaGFuZ2VkLCAxMjYgaW5zZXJ0aW9u cygrKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC90aWQuYyBiL3NyYy9iYWNr ZW5kL3V0aWxzL2FkdC90aWQuYwppbmRleCAwNzI0OGI2OWU1Ny4uZmJmMjlhZmFjMTAgMTAwNjQ0 Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC90aWQuYworKysgYi9zcmMvYmFja2VuZC91dGls cy9hZHQvdGlkLmMKQEAgLTI4MCw2ICsyODAsMzcgQEAgaGFzaHRpZGV4dGVuZGVkKFBHX0ZVTkNU SU9OX0FSR1MpCiB9CiAKIAorLyoKKyAqCVRJRCBhY2Nlc3NvciBmdW5jdGlvbnMKKyAqLworCisv KgorICogdGlkX2Jsb2Nrbm8gLSBleHRyYWN0IHRoZSBibG9jayBudW1iZXIgZnJvbSBhIFRJRAor ICoKKyAqIFJldHVybnMgaW50OCBiZWNhdXNlIEJsb2NrTnVtYmVyIGlzIHVpbnQzMiwgd2hpY2gg ZXhjZWVkcyB0aGUgcmFuZ2Ugb2YgaW50NC4KKyAqLworRGF0dW0KK3RpZF9ibG9ja25vKFBHX0ZV TkNUSU9OX0FSR1MpCit7CisJSXRlbVBvaW50ZXIgdGlkID0gUEdfR0VUQVJHX0lURU1QT0lOVEVS KDApOworCisJUEdfUkVUVVJOX0lOVDY0KChpbnQ2NCkgSXRlbVBvaW50ZXJHZXRCbG9ja051bWJl ck5vQ2hlY2sodGlkKSk7Cit9CisKKy8qCisgKiB0aWRfb2Zmc2V0IC0gZXh0cmFjdCB0aGUgb2Zm c2V0IG51bWJlciBmcm9tIGEgVElECisgKgorICogUmV0dXJucyBpbnQ0IGJlY2F1c2UgT2Zmc2V0 TnVtYmVyIGlzIHVpbnQxNiwgd2hpY2ggZml0cyBpbiBpbnQ0LgorICovCitEYXR1bQordGlkX29m ZnNldChQR19GVU5DVElPTl9BUkdTKQoreworCUl0ZW1Qb2ludGVyIHRpZCA9IFBHX0dFVEFSR19J VEVNUE9JTlRFUigwKTsKKworCVBHX1JFVFVSTl9JTlQzMigoaW50MzIpIEl0ZW1Qb2ludGVyR2V0 T2Zmc2V0TnVtYmVyTm9DaGVjayh0aWQpKTsKK30KKworCiAvKgogICoJRnVuY3Rpb25zIHRvIGdl dCBsYXRlc3QgdGlkIG9mIGEgc3BlY2lmaWVkIHR1cGxlLgogICoKZGlmZiAtLWdpdCBhL3NyYy9p bmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2Mu ZGF0CmluZGV4IGRhYzQwOTkyY2JjLi5mYzBmZGM2Y2QxYiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1 ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2Mu ZGF0CkBAIC0yNzQ3LDYgKzI3NDcsMTIgQEAKIHsgb2lkID0+ICcyNzk2JywgZGVzY3IgPT4gJ3Nt YWxsZXIgb2YgdHdvJywKICAgcHJvbmFtZSA9PiAndGlkc21hbGxlcicsIHByb3JldHR5cGUgPT4g J3RpZCcsIHByb2FyZ3R5cGVzID0+ICd0aWQgdGlkJywKICAgcHJvc3JjID0+ICd0aWRzbWFsbGVy JyB9LAoreyBvaWQgPT4gJzk5NDknLCBkZXNjciA9PiAnZXh0cmFjdCBibG9jayBudW1iZXIgZnJv bSB0aWQnLAorICBwcm9uYW1lID0+ICd0aWRfYmxvY2tubycsIHByb2xlYWtwcm9vZiA9PiAndCcs IHByb3JldHR5cGUgPT4gJ2ludDgnLAorICBwcm9hcmd0eXBlcyA9PiAndGlkJywgcHJvc3JjID0+ ICd0aWRfYmxvY2tubycgfSwKK3sgb2lkID0+ICc5OTUwJywgZGVzY3IgPT4gJ2V4dHJhY3Qgb2Zm c2V0IG51bWJlciBmcm9tIHRpZCcsCisgIHByb25hbWUgPT4gJ3RpZF9vZmZzZXQnLCBwcm9sZWFr cHJvb2YgPT4gJ3QnLCBwcm9yZXR0eXBlID0+ICdpbnQ0JywKKyAgcHJvYXJndHlwZXMgPT4gJ3Rp ZCcsIHByb3NyYyA9PiAndGlkX29mZnNldCcgfSwKIHsgb2lkID0+ICcyMjMzJywgZGVzY3IgPT4g J2hhc2gnLAogICBwcm9uYW1lID0+ICdoYXNodGlkJywgcHJvcmV0dHlwZSA9PiAnaW50NCcsIHBy b2FyZ3R5cGVzID0+ICd0aWQnLAogICBwcm9zcmMgPT4gJ2hhc2h0aWQnIH0sCmRpZmYgLS1naXQg YS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL29wcl9zYW5pdHkub3V0IGIvc3JjL3Rlc3QvcmVn cmVzcy9leHBlY3RlZC9vcHJfc2FuaXR5Lm91dAppbmRleCA2ZmY0ZDdlZTkwMS4uMDA1ZDk5MDU4 ZjYgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvb3ByX3Nhbml0eS5vdXQK KysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9vcHJfc2FuaXR5Lm91dApAQCAtODg3LDYg Kzg4Nyw4IEBAIG9pZDhsZShvaWQ4LG9pZDgpCiBvaWQ4Z3Qob2lkOCxvaWQ4KQogb2lkOGdlKG9p ZDgsb2lkOCkKIGJ0b2lkOGNtcChvaWQ4LG9pZDgpCit0aWRfYmxvY2tubyh0aWQpCit0aWRfb2Zm c2V0KHRpZCkKIC0tIENoZWNrIHRoYXQgZnVuY3Rpb25zIHdpdGhvdXQgYXJndW1lbnQgYXJlIG5v dCBtYXJrZWQgYXMgbGVha3Byb29mLgogU0VMRUNUIHAxLm9pZDo6cmVncHJvY2VkdXJlCiBGUk9N IHBnX3Byb2MgcDEgSk9JTiBwZ19uYW1lc3BhY2UgcG4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jl Z3Jlc3MvZXhwZWN0ZWQvdGlkLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvdGlkLm91 dAppbmRleCAwODNjODNhMWUxYi4uNGUyMTAxNGM4MWYgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3Jl Z3Jlc3MvZXhwZWN0ZWQvdGlkLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3Rp ZC5vdXQKQEAgLTQyLDYgKzQyLDU3IEBAIFNFTEVDVCAqIEZST00gcGdfaW5wdXRfZXJyb3JfaW5m bygnKDAsLTEpJywgJ3RpZCcpOwogIGludmFsaWQgaW5wdXQgc3ludGF4IGZvciB0eXBlIHRpZDog IigwLC0xKSIgfCAgICAgICAgfCAgICAgIHwgMjJQMDIKICgxIHJvdykKIAorLS0gdGVzdHMgZm9y IHRpZF9ibG9ja25vKCkgYW5kIHRpZF9vZmZzZXQoKQorU0VMRUNUIHRpZF9ibG9ja25vKCcoMCww KSc6OnRpZCksIHRpZF9vZmZzZXQoJygwLDApJzo6dGlkKTsKKyB0aWRfYmxvY2tubyB8IHRpZF9v ZmZzZXQgCistLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLQorICAgICAgICAgICAwIHwgICAgICAg ICAgMAorKDEgcm93KQorCitTRUxFQ1QgdGlkX2Jsb2Nrbm8oJygwLDEpJzo6dGlkKSwgdGlkX29m ZnNldCgnKDAsMSknOjp0aWQpOworIHRpZF9ibG9ja25vIHwgdGlkX29mZnNldCAKKy0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tCisgICAgICAgICAgIDAgfCAgICAgICAgICAxCisoMSByb3cpCisK K1NFTEVDVCB0aWRfYmxvY2tubygnKDQyLDcpJzo6dGlkKSwgdGlkX29mZnNldCgnKDQyLDcpJzo6 dGlkKTsKKyB0aWRfYmxvY2tubyB8IHRpZF9vZmZzZXQgCistLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLQorICAgICAgICAgIDQyIHwgICAgICAgICAgNworKDEgcm93KQorCistLSBtYXggdmFsdWVz OiBibG9ja25vIHVpbnQzMiBtYXgsIG9mZnNldCB1aW50MTYgbWF4CitTRUxFQ1QgdGlkX2Jsb2Nr bm8oJyg0Mjk0OTY3Mjk1LDY1NTM1KSc6OnRpZCksIHRpZF9vZmZzZXQoJyg0Mjk0OTY3Mjk1LDY1 NTM1KSc6OnRpZCk7CisgdGlkX2Jsb2Nrbm8gfCB0aWRfb2Zmc2V0IAorLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0KKyAgNDI5NDk2NzI5NSB8ICAgICAgNjU1MzUKKygxIHJvdykKKworLS0gKC0x LDApIHdyYXBzIHRvIGJsb2Nrbm8gNDI5NDk2NzI5NQorU0VMRUNUIHRpZF9ibG9ja25vKCcoLTEs MCknOjp0aWQpOworIHRpZF9ibG9ja25vIAorLS0tLS0tLS0tLS0tLQorICA0Mjk0OTY3Mjk1Ciso MSByb3cpCisKKy0tIE5VTEwgaGFuZGxpbmcgKHN0cmljdCBmdW5jdGlvbnMpCitTRUxFQ1QgdGlk X2Jsb2Nrbm8oTlVMTDo6dGlkKSwgdGlkX29mZnNldChOVUxMOjp0aWQpOworIHRpZF9ibG9ja25v IHwgdGlkX29mZnNldCAKKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAg fCAgICAgICAgICAgCisoMSByb3cpCisKKy0tIHJvdW5kLXRyaXA6IGJsb2Nrbm8gKyBvZmZzZXQg cmVjb25zdHJ1Y3QgdGhlIG9yaWdpbmFsIFRJRAorU0VMRUNUIHQsIHRpZF9ibG9ja25vKHQpLCB0 aWRfb2Zmc2V0KHQpLAorICAgICAgIGZvcm1hdCgnKCVzLCVzKScsIHRpZF9ibG9ja25vKHQpLCB0 aWRfb2Zmc2V0KHQpKTo6dGlkID0gdCBBUyByb3VuZHRyaXBfb2sKK0ZST00gKFZBTFVFUyAoJygw LDApJzo6dGlkKSwgKCcoMSw0MiknOjp0aWQpLCAoJyg0Mjk0OTY3Mjk1LDY1NTM1KSc6OnRpZCkp IEFTIHYodCk7CisgICAgICAgICB0ICAgICAgICAgIHwgdGlkX2Jsb2Nrbm8gfCB0aWRfb2Zmc2V0 IHwgcm91bmR0cmlwX29rIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0KKyAoMCwwKSAgICAgICAgICAgICAgfCAgICAgICAgICAg MCB8ICAgICAgICAgIDAgfCB0CisgKDEsNDIpICAgICAgICAgICAgIHwgICAgICAgICAgIDEgfCAg ICAgICAgIDQyIHwgdAorICg0Mjk0OTY3Mjk1LDY1NTM1KSB8ICA0Mjk0OTY3Mjk1IHwgICAgICA2 NTUzNSB8IHQKKygzIHJvd3MpCisKIC0tIHRlc3RzIGZvciBmdW5jdGlvbnMgcmVsYXRlZCB0byBU SUQgaGFuZGxpbmcKIENSRUFURSBUQUJMRSB0aWRfdGFiIChhIGludCk7CiAtLSBtaW4oKSBhbmQg bWF4KCkgZm9yIFRJRHMKQEAgLTU4LDYgKzEwOSwyMSBAQCBTRUxFQ1QgbWF4KGN0aWQpIEZST00g dGlkX3RhYjsKICAoMCwyKQogKDEgcm93KQogCistLSB0aWRfYmxvY2tubygpIGFuZCB0aWRfb2Zm c2V0KCkgd2l0aCByZWFsIHRhYmxlIGN0aWQKK1NFTEVDVCBjdGlkLCB0aWRfYmxvY2tubyhjdGlk KSwgdGlkX29mZnNldChjdGlkKSBGUk9NIHRpZF90YWI7CisgY3RpZCAgfCB0aWRfYmxvY2tubyB8 IHRpZF9vZmZzZXQgCistLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tCisgKDAsMSkg fCAgICAgICAgICAgMCB8ICAgICAgICAgIDEKKyAoMCwyKSB8ICAgICAgICAgICAwIHwgICAgICAg ICAgMgorKDIgcm93cykKKworLS0gdXNlIGluIFdIRVJFIGNsYXVzZQorU0VMRUNUIGN0aWQgRlJP TSB0aWRfdGFiIFdIRVJFIHRpZF9ibG9ja25vKGN0aWQpID0gMCBBTkQgdGlkX29mZnNldChjdGlk KSA9IDE7CisgY3RpZCAgCistLS0tLS0tCisgKDAsMSkKKygxIHJvdykKKwogVFJVTkNBVEUgdGlk X3RhYjsKIC0tIFRlc3RzIGZvciBjdXJydGlkMigpIHdpdGggdmFyaW91cyByZWxhdGlvbiBraW5k cwogLS0gTWF0ZXJpYWxpemVkIHZpZXcKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3Fs L3RpZC5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC90aWQuc3FsCmluZGV4IDI2MDJlMjBlYjVh Li43NTM3MDgzM2NkMCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvdGlkLnNxbAor KysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC90aWQuc3FsCkBAIC0xNiw2ICsxNiwyMiBAQCBTRUxF Q1QgcGdfaW5wdXRfaXNfdmFsaWQoJygwLC0xKScsICd0aWQnKTsKIFNFTEVDVCAqIEZST00gcGdf aW5wdXRfZXJyb3JfaW5mbygnKDAsLTEpJywgJ3RpZCcpOwogCiAKKy0tIHRlc3RzIGZvciB0aWRf YmxvY2tubygpIGFuZCB0aWRfb2Zmc2V0KCkKK1NFTEVDVCB0aWRfYmxvY2tubygnKDAsMCknOjp0 aWQpLCB0aWRfb2Zmc2V0KCcoMCwwKSc6OnRpZCk7CitTRUxFQ1QgdGlkX2Jsb2Nrbm8oJygwLDEp Jzo6dGlkKSwgdGlkX29mZnNldCgnKDAsMSknOjp0aWQpOworU0VMRUNUIHRpZF9ibG9ja25vKCco NDIsNyknOjp0aWQpLCB0aWRfb2Zmc2V0KCcoNDIsNyknOjp0aWQpOworLS0gbWF4IHZhbHVlczog YmxvY2tubyB1aW50MzIgbWF4LCBvZmZzZXQgdWludDE2IG1heAorU0VMRUNUIHRpZF9ibG9ja25v KCcoNDI5NDk2NzI5NSw2NTUzNSknOjp0aWQpLCB0aWRfb2Zmc2V0KCcoNDI5NDk2NzI5NSw2NTUz NSknOjp0aWQpOworLS0gKC0xLDApIHdyYXBzIHRvIGJsb2Nrbm8gNDI5NDk2NzI5NQorU0VMRUNU IHRpZF9ibG9ja25vKCcoLTEsMCknOjp0aWQpOworLS0gTlVMTCBoYW5kbGluZyAoc3RyaWN0IGZ1 bmN0aW9ucykKK1NFTEVDVCB0aWRfYmxvY2tubyhOVUxMOjp0aWQpLCB0aWRfb2Zmc2V0KE5VTEw6 OnRpZCk7CistLSByb3VuZC10cmlwOiBibG9ja25vICsgb2Zmc2V0IHJlY29uc3RydWN0IHRoZSBv cmlnaW5hbCBUSUQKK1NFTEVDVCB0LCB0aWRfYmxvY2tubyh0KSwgdGlkX29mZnNldCh0KSwKKyAg ICAgICBmb3JtYXQoJyglcywlcyknLCB0aWRfYmxvY2tubyh0KSwgdGlkX29mZnNldCh0KSk6OnRp ZCA9IHQgQVMgcm91bmR0cmlwX29rCitGUk9NIChWQUxVRVMgKCcoMCwwKSc6OnRpZCksICgnKDEs NDIpJzo6dGlkKSwgKCcoNDI5NDk2NzI5NSw2NTUzNSknOjp0aWQpKSBBUyB2KHQpOworCisKIC0t IHRlc3RzIGZvciBmdW5jdGlvbnMgcmVsYXRlZCB0byBUSUQgaGFuZGxpbmcKIAogQ1JFQVRFIFRB QkxFIHRpZF90YWIgKGEgaW50KTsKQEAgLTI0LDYgKzQwLDExIEBAIENSRUFURSBUQUJMRSB0aWRf dGFiIChhIGludCk7CiBJTlNFUlQgSU5UTyB0aWRfdGFiIFZBTFVFUyAoMSksICgyKTsKIFNFTEVD VCBtaW4oY3RpZCkgRlJPTSB0aWRfdGFiOwogU0VMRUNUIG1heChjdGlkKSBGUk9NIHRpZF90YWI7 CisKKy0tIHRpZF9ibG9ja25vKCkgYW5kIHRpZF9vZmZzZXQoKSB3aXRoIHJlYWwgdGFibGUgY3Rp ZAorU0VMRUNUIGN0aWQsIHRpZF9ibG9ja25vKGN0aWQpLCB0aWRfb2Zmc2V0KGN0aWQpIEZST00g dGlkX3RhYjsKKy0tIHVzZSBpbiBXSEVSRSBjbGF1c2UKK1NFTEVDVCBjdGlkIEZST00gdGlkX3Rh YiBXSEVSRSB0aWRfYmxvY2tubyhjdGlkKSA9IDAgQU5EIHRpZF9vZmZzZXQoY3RpZCkgPSAxOwog VFJVTkNBVEUgdGlkX3RhYjsKIAogLS0gVGVzdHMgZm9yIGN1cnJ0aWQyKCkgd2l0aCB2YXJpb3Vz IHJlbGF0aW9uIGtpbmRzCi0tIAoyLjQ1LjQKCg== --0000000000005be1f4064bd2d6fe--