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 1w5UH6-003IXa-19 for pgsql-hackers@arkaria.postgresql.org; Wed, 25 Mar 2026 19:52:20 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w5UG4-00GBfD-2x for pgsql-hackers@arkaria.postgresql.org; Wed, 25 Mar 2026 19:51:17 +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 1w5UG4-00GBf5-1n for pgsql-hackers@lists.postgresql.org; Wed, 25 Mar 2026 19:51:17 +0000 Received: from mail-pl1-x635.google.com ([2607:f8b0:4864:20::635]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w5UG2-000000017uz-1DCu for pgsql-hackers@lists.postgresql.org; Wed, 25 Mar 2026 19:51:16 +0000 Received: by mail-pl1-x635.google.com with SMTP id d9443c01a7336-2b0abdde280so1962015ad.1 for ; Wed, 25 Mar 2026 12:51:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1774468272; cv=none; d=google.com; s=arc-20240605; b=ULzE9M1eG1APbq9S2tnI/ngiT6OYtDDlWS/3aGHx00lCbjXLPyfLCAkKuhRB12S6OR OYV8vfeTFPLbW/OxBAkXcI+wV1SFN6QNoQvH2aIY5nB6oZoNKNi+uBoObiOp7Jyd3gse TgIgrtebPWODI1n7btDrpbPHgTerheo2OPsklINNVGZOPUTwe8W2Ta2ocZ62nT8ZYvUF Rk7Ljy/oNANI8FT4QiLanycOa0f51qhJgnf1lC06+JNa0W2WQ2p2tuUyi29QGhkYfapU 62KjOKZbOnq5nDTHz6oP/Pik206czAd52CzYfZViPewl75qwk9v7hzAqejembu7QPS8w yjtQ== 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=HC4eXqLKc5Bj5FhhhBb1X/d+uUs6UDVhbRDjNXLYoMI=; fh=eL7DjuqwxWiuYdO11QNufGyZy4K2CU6M+Z7o6g5j7lc=; b=CuEsv8gErqW81frmP0+TseeoOH/ZH+5jbrshMO9KfMO8v7YJOLC7BiHCRmgqZ8tfAA 4MrBE38Zvs7MaLKoC/y2WVM4reO54kJrmnc0AXSZ5b8xDQUYr55ZHedya3R/xrMkcta3 toUNUGbLl3QeudlyHo2gjBOJ6dfsiP5+mEnvlEvsg8DOT4YV89fJJSyTPc5e8eycGnXf WQBkeSrWKdyuj/Twg2HDTQqgp7AExH0F2rk7oDO2jFRjliItgg8iAV2EK86V9Wfp7HZr /lbxHo4KkD/SgFXSgl/WkqhTezeIExE3g3jlBtV8wce9pB9NcXtbm9oX3Ud1moA6R1yn ZKGg==; 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=1774468272; x=1775073072; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=HC4eXqLKc5Bj5FhhhBb1X/d+uUs6UDVhbRDjNXLYoMI=; b=tBbQF22XdsoJCa8FfXlG770aPmFm5yHKF6BDTIrVAVLrBqIeByZtipWVwgguUJMKwQ LwVnZS6PGS9Xf7ejJ/nPZlRjoFW+Yel9/BavvR7uCzpmqehB1Y0XNjEvjuSxclO0XshD DdJBLpSUhcm9hM0ymb5IeAkNeDuQKYBxqKQ7lnqdXAvyfG/juoN60rm0s5FVujbLtfrq XuYmLrHuEp/bciCDbHJ8KCEepKUHyBqUS6acMuW6AjFwP2IKo31f1vPVFUkuC8FnVm3f mnBqSLrWX+8k0xNmQBZDBRSLOfyK6mN7bMINNPR3W3faE5FL1f09ASBwvtBN5aUAMNaV tRZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774468272; x=1775073072; 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=HC4eXqLKc5Bj5FhhhBb1X/d+uUs6UDVhbRDjNXLYoMI=; b=jjlWPg4D7rRaYtUqXgrkc1orRbtYbu0zYyVC76u6WS4LWMTjNJBnEthgDNuKqr233s yRlUFdixa4qL1yTnDqjrmKNYHe2nruKl/5WkoGyvB3wmb24RF9XlmgrNB4hw2i+MHJPg SdYeev1ASTcemErqEE7XA8i8aD51SWWkpoXj0xyen9/ScwYvlj1rHDCs54sw8UOiITMw M5brNpNJnAcFliwFq/Dmk63EHMhINGRRgJe2Q6BpOnjUTiXqfIr827576rCBhnVTlL4/ 3B1IuF+mj/3xfOzayYGaU0nxa6qdffK7fVuz1mYvoAwSUZQ9cooiX/5x/yuhooLGQF3Q i1mw== X-Gm-Message-State: AOJu0YzD42dood0Fr3gL+g8J0Hh0B/2r9ibQHdOTUL3li8kQH77aam5J 3quD+500MHo7Q+oJnKu+Zba7ob8Ims9xoVOPwt5xjf/eWFESHXzIhVjcUCl6/BKxuTSelory2A8 7ApGU5LFzXKZgqtuzw7eQzPeQlcl4ZmgzhuCjr0I= X-Gm-Gg: ATEYQzxFtmTAnMFQqjRcAtM32wFptWAx1oY6Q8Ape4VMwC84UIGCaNXbMtjamJqwAT0 +xZQP4/M+0ukhUSDj7CWsYvky/kpg+mCskN3oLB1AngF94BeMkP2Anc/m62juDImnqUqZDZDH8g mQDkBrQSChSjR7ZgDFlAO3jrnd99bC6h5wm1Tu/jYZGz6G1Tfyl4Ngpf2K3XAeS6sewklKmoKaC SFjF6Y8L53/nAEbScPZRUPFIp2/Gwf1UHb3gHGvh6fgpqUeU9InbDHCZskTZkLzGcwe4Defk02z f86f8sJp9TF0vgqix/8ePHKLjyf7sg3rTRZtkJlBFL6O0rXppx64kml5uQeAezBMee7ZDp5057m 96EW+Fg== X-Received: by 2002:a17:902:f609:b0:2b0:b2b4:1444 with SMTP id d9443c01a7336-2b0b2b418bcmr45773585ad.49.1774468272090; Wed, 25 Mar 2026 12:51:12 -0700 (PDT) MIME-Version: 1.0 From: Roberto Mello Date: Wed, 25 Mar 2026 13:50:45 -0600 X-Gm-Features: AQROBzBJpVoxASXMt-S-YIzlpsAF-gLtdPZSPjZdQ95cFR2p2TRboSoh14d2pRA Message-ID: Subject: pg_publication_tables: return NULL attnames when no column list is specified To: PostgreSQL Developers Content-Type: multipart/mixed; boundary="000000000000062be4064dde97ae" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000062be4064dde97ae Content-Type: multipart/alternative; boundary="000000000000062be3064dde97ac" --000000000000062be3064dde97ac Content-Type: text/plain; charset="UTF-8" Hi, When a table is added to a publication without a column list: ALTER PUBLICATION my_pub ADD TABLE my_table; Any new column added to my_table will automatically be replicated. The underlying catalog (pg_publication_rel.prattrs) stores NULL for this case. When a table is added with an explicit column list: ALTER PUBLICATION my_pub ADD TABLE my_table (id, name, status); New columns will NOT be replicated until the publication is explicitly altered. The catalog stores an int2vector of the specified attribute numbers. The problem is that pg_get_publication_tables() in pg_publication.c (the set-returning function backing the pg_publication_tables view) erases this distinction. When prattrs is NULL, it opens the table, iterates all eligible attributes, and builds a synthetic int2vector of all current columns. The view then shows the same attnames output for both cases. | Scenario | prattrs in catalog | attrs from SRF | attnames in view | |--------------------------|--------------------|---------------------|------------------| | column list (a, b) | {1, 2 } | {1,2} | {a, b} | | No column list | NULL | {1,2,3,...} (synth) | {a, b, c, ...} | | FOR ALL TABLES/IN SCHEMA | no catalog row | {1,2,3,...} (synth) | {a, b, c, ...} | This is a problem for operations: schema migrations that add columns to published tables may or may not replicate depending on how the publication was originally defined, and the only way to check is querying pg_publication_rel directly. Additionally, tablesync.c has a workaround heuristic that tries to reverse this synthesis by comparing array_length(gpt.attrs, 1) against c.relnatts. This heuristic is buggy: relnatts counts all user attributes including dropped columns, but the synthesized list excludes dropped columns and conditionally excludes generated columns. So for any table with a dropped column, the heuristic incorrectly treats "no column list" as if an explicit list were specified. The problematic code is the result of commits that incrementally built on each other, with later ones introducing workarounds for side effects of earlier ones: 1. fd0b9dcebda (06/2022) Amit Kapila (author: Hou Zhijie) Prohibit combining publications with different column lists Added the subscriber-side check that prevents combining publications with different column lists for the same table. The subscriber runs SELECT DISTINCT gpt.attrs and expects at most one row. To handle the fact that pg_get_publication_tables() returned NULL for no-column-list publications (which would always be distinct from any explicit list), this commit introduced the relnatts heuristic in tablesync.c: CASE WHEN (array_length(gpt.attrs, 1) = c.relnatts) THEN NULL ELSE gpt.attrs END The idea was: if the SRF returns a synthesized list whose length equals relnatts, it must be the "all columns" case, so collapse it back to NULL. But at this point the SRF didn't synthesize anything yet, so the heuristic was anticipating the next commit. 2. b7ae0395369 (01/2023) Amit Kapila (author: Shi yu) Ignore dropped and generated columns from the column list This is the commit that introduced the synthesis loop. It "solved" a problem where a table in two publications (one with a column list naming all columns, one without a column list) was erroring with "cannot use different column lists" because one returned NULL and the other returned an int2vector. The fix was to synthesize a column list when none was specified, filtering out dropped and generated columns, so that both publications would produce identical int2vectors and DISTINCT would collapse them to one row. But this synthesis made it impossible to distinguish "all columns" from "explicit list of all columns" in the view. And the relnatts heuristic from fd0b9dcebda - which was supposed to reverse the synthesis - was broken from the start because relnatts includes dropped columns while the synthesized list excludes them. The synthesis in b7ae0395369 tried to make "no column list" and "explicit list of all columns" look identical. But they have genuinely different semantics: - No column list (NULL): all current and future columns are replicated. ALTER TABLE ADD COLUMN automatically replicates the new column. - Explicit full list: only the named columns are replicated. New columns are NOT replicated until the publication is explicitly altered. By making them indistinguishable, the synthesis hid a real conflict from users who had a table in two publications with different column semantics on the same subscription. I am proposing a fix that restores the distinction and correctly (IMO) surfaces this conflict. The fix is to stop synthesizing the full column list in pg_get_publication_tables(). When prattrs is NULL in the catalog, let attrs remain NULL in the SRF output. Remove the buggy CASE WHEN heuristic in tablesync.c since it is no longer needed. There is one scenario where there is a change for users: one pub no list + one pub explicit all columns. Anyone with that specific configuration will see a new error on the next tablesync or subscription refresh after upgrading. The fix for those users is to either remove the explicit column list from the second publication (making both "all columns"), or keep the difference and use separate subscriptions. AFAICT this is safe except for the change in behavior I describe above. psql and pg_dump query pg_publication_rel directly and not the affected view. New subscriber talking to old publisher still works (old pub synthesizes a list, new sub handles it). Old subscriber talking to new publisher also works (the old CASE WHEN evaluates array_length(NULL, 1) which returns NULL, falling through to the ELSE branch returning NULL). Attached is a patch with the fix, including updates to documentation, 7 updated regression tests where existing expected outputs where attnames changes from {a} to NULL, and added new test cases that verify both cases are distinguishable in the same query. Roberto Mello Snowflake --000000000000062be3064dde97ac Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi,

When a table is added to a publication without = a column list:

ALTER PUBLICATION my_pub ADD TABLE my_table;

A= ny new column added to my_table will automatically be replicated. The
un= derlying catalog (pg_publication_rel.prattrs) stores NULL for this case.
When a table is added with an explicit column list:

ALTER PUBLI= CATION my_pub ADD TABLE my_table (id, name, status);

New columns wil= l NOT be replicated until the publication is explicitly altered.
The cat= alog stores an int2vector of the specified attribute numbers.

The pr= oblem is that pg_get_publication_tables() in pg_publication.c (the set-retu= rning
function backing the pg_publication_tables view) erases this disti= nction.
When prattrs is NULL, it opens the table, iterates all eligible = attributes,
and builds a synthetic int2vector of all current columns. Th= e view then shows
the same attnames output for both cases.

| Scen= ario =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | prattrs in c= atalog | attrs from SRF =C2=A0 =C2=A0 =C2=A0| attnames in view |
|------= --------------------|--------------------|---------------------|-----------= -------|
| column list (a, b) =C2=A0 =C2=A0 =C2=A0 | {1, 2 =C2=A0} =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | {1,2} =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 | {a, b} =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 |
| No column = list =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | NULL =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 | {1,2,3,...} (synth) | {a, b, c, ...} =C2=A0 |
| F= OR ALL TABLES/IN SCHEMA | no catalog row =C2=A0 =C2=A0 | {1,2,3,...} (synth= ) | {a, b, c, ...} =C2=A0 |

This is a problem for operations: schema= migrations that add columns to published
tables may or may not replicat= e depending on how the publication was originally
defined, and the only = way to check is querying pg_publication_rel directly.

Additionally, = tablesync.c has a workaround heuristic that tries to reverse
this synthe= sis by comparing array_length(gpt.attrs, 1) against c.relnatts.
This heu= ristic is buggy: relnatts counts all user attributes including dropped
c= olumns, but the synthesized list excludes dropped columns and conditionally=
excludes generated columns. So for any table with a dropped column, the=
heuristic incorrectly treats "no column list" as if an explic= it list were
specified.

The problematic code is the result of com= mits that incrementally
built on each other, with later ones introducing= workarounds for side effects
of earlier ones:

1. fd0b9dcebda (06= /2022) Amit Kapila (author: Hou Zhijie)
Prohibit combining publications = with different column lists

Added the subscriber-side check that pre= vents combining publications with
different column lists for the same ta= ble. The subscriber runs
SELECT DISTINCT gpt.attrs and expects at most o= ne row. To handle the fact
that pg_get_publication_tables() returned NUL= L for no-column-list
publications (which would always be distinct from a= ny explicit list), this
commit introduced the relnatts heuristic in tabl= esync.c:

CASE WHEN (array_length(gpt.attrs, 1) =3D c.relnatts)
= =C2=A0 =C2=A0 =C2=A0THEN NULL ELSE gpt.attrs END

The idea was: if th= e SRF returns a synthesized list whose length equals
relnatts, it must b= e the "all columns" case, so collapse it back to NULL.
But at = this point the SRF didn't synthesize anything yet, so the heuristic was= anticipating the next commit.

2. b7ae0395369 (01/2023) Amit Kapila = (author: Shi yu)
Ignore dropped and generated columns from the column li= st

This is the commit that introduced the synthesis loop. It "s= olved" a problem
where a table in two publications (one with a colu= mn list naming all columns,
one without a column list) was erroring with= "cannot use different column lists"
because one returned NULL= and the other returned an int2vector. The fix was
to synthesize a colum= n list when none was specified, filtering out dropped
and generated colu= mns, so that both publications would produce identical
int2vectors and D= ISTINCT would collapse them to one row.

But this synthesis made it i= mpossible to distinguish "all columns" from
"explicit lis= t of all columns" in the view. And the relnatts heuristic from
fd0b= 9dcebda - which was supposed to reverse the synthesis - was broken from
= the start because relnatts includes dropped columns while the synthesized l= ist
excludes them.

The synthesis in b7ae0395369 tried to make &qu= ot;no column list" and "explicit list
of all columns" loo= k identical. But they have genuinely different
semantics:

- No co= lumn list (NULL): all current and future columns are replicated.
=C2=A0 = ALTER TABLE ADD COLUMN automatically replicates the new column.
- Explic= it full list: only the named columns are replicated. New columns
=C2=A0 = are NOT replicated until the publication is explicitly altered.

By m= aking them indistinguishable, the synthesis hid a real conflict from users<= br>who had a table in two publications with different column semantics on t= he
same subscription. I am proposing a fix that restores the distinction= and correctly
(IMO) surfaces this conflict.

The fix is to stop s= ynthesizing the full column list in pg_get_publication_tables().
When pr= attrs is NULL in the catalog, let attrs remain NULL in the SRF output.
R= emove the buggy CASE WHEN heuristic in tablesync.c since it is no longerneeded.

There is one scenario where there is a change for users: on= e pub no list + one pub explicit all columns.=C2=A0Anyone with that specifi= c configuration will see a new error on the
next tablesync or subscript= ion refresh after upgrading. The fix for those users is to=C2=A0
= either remove the explicit column list from the second publication (making = both "all
columns"), or keep the difference and use sep= arate subscriptions.

AFAICT this is safe exce= pt for the change in behavior I describe above. psql and pg_dump query pg_p= ublication_rel directly and not the affected view. New subscriber
talking to old publisher still works (old pub synthesizes a list, new sub = handles it).
Old subscriber talking to new publisher also works (= the old CASE WHEN evaluates
array_length(NULL, 1) which returns N= ULL, falling through to the ELSE branch
returning NULL).

Attached is a patch with the fix, including updates to doc= umentation, 7 updated
regression tests where existing expected ou= tputs where attnames changes from
{a} to NULL, and added new test= cases that verify both cases are distinguishable in
the same que= ry.

Roberto Mello
Snowflake
<= /div> --000000000000062be3064dde97ac-- --000000000000062be4064dde97ae Content-Type: application/octet-stream; name="v1-0001-Fix-pg_publication_tables-to-return-NULL-attnames.patch" Content-Disposition: attachment; filename="v1-0001-Fix-pg_publication_tables-to-return-NULL-attnames.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mn6gfvkt0 RnJvbSA3ZjI1ODEzOTU1NjdiNzZlZmQ4NTk3NWQyMTMzZWUyYzQ4NGYxOGZmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBSb2JlcnRvIE1lbGxvIDxyb2JlcnRvLm1lbGxvQGdtYWlsLmNv bT4KRGF0ZTogVHVlLCAyNCBNYXIgMjAyNiAxOToyMDoxMCAtMDYwMApTdWJqZWN0OiBbUEFUQ0gg djFdIEZpeCBwZ19wdWJsaWNhdGlvbl90YWJsZXMgdG8gcmV0dXJuIE5VTEwgYXR0bmFtZXMgZm9y CiBhbGwtY29sdW1uIHB1YmxpY2F0aW9ucwoKUHJldmlvdXNseSBwZ19nZXRfcHVibGljYXRpb25f dGFibGVzKCkgc3ludGhlc2l6ZWQgYSBjb2x1bW4gbGlzdCBldmVuCndoZW4gbm8gZXhwbGljaXQg Y29sdW1uIGxpc3Qgd2FzIHNwZWNpZmllZCBpbiB0aGUgcHVibGljYXRpb24uIFRoaXMgbWFkZQpp dCBpbXBvc3NpYmxlIGZvciBjb25zdW1lcnMgb2YgcGdfcHVibGljYXRpb25fdGFibGVzIHRvIGRp c3Rpbmd1aXNoCmJldHdlZW4gImFsbCBjb2x1bW5zIGFyZSBwdWJsaXNoZWQiIChuZXcgY29sdW1u cyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUKcmVwbGljYXRlZCkgYW5kIGFuIGV4cGxpY2l0IGNvbHVt biBsaXN0IChvbmx5IGxpc3RlZCBjb2x1bW5zIGFyZQpyZXBsaWNhdGVkKS4KCldvcnNlLCB0aGUg c3Vic2NyaWJlci1zaWRlIHdvcmthcm91bmQgaW4gZmV0Y2hfcmVtb3RlX3RhYmxlX2luZm8oKQpj b21wYXJlZCBhcnJheV9sZW5ndGgoZ3B0LmF0dHJzLCAxKSBhZ2FpbnN0IHBnX2NsYXNzLnJlbG5h dHRzIHRvIGRldGVjdAp0aGUgImFsbCBjb2x1bW5zIiBjYXNlLCBidXQgcmVsbmF0dHMgaW5jbHVk ZXMgZHJvcHBlZCBjb2x1bW5zIHdoaWxlIHRoZQpzeW50aGVzaXplZCBsaXN0IGV4Y2x1ZGVkIHRo ZW0sIHNvIHRhYmxlcyB3aXRoIGRyb3BwZWQgY29sdW1ucyB3ZXJlCm1pc2lkZW50aWZpZWQgYXMg aGF2aW5nIGFuIGV4cGxpY2l0IGNvbHVtbiBsaXN0LgoKRml4IGJ5IHNpbXBseSBsZWF2aW5nIGF0 dHJzIGFzIE5VTEwgd2hlbiBubyBjb2x1bW4gbGlzdCB3YXMgc3BlY2lmaWVkCihwcmF0dHJzIGlz IE5VTEwpIGluIHRoZSBwdWJsaWNhdGlvbiBjYXRhbG9nLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0 aApob3cgcHJhdHRycyBpdHNlbGYgaXMgc3RvcmVkIGFuZCByZW1vdmVzIHRoZSBuZWVkIGZvciB0 aGUgcmVsbmF0dHMKaGV1cmlzdGljIGluIHRhYmxlc3luYy5jLgoKVGhlIHJlYWwgcmVwbGljYXRp b24gY29sdW1uIGZpbHRlcmluZyAod2hpY2ggbXVzdCBhY2NvdW50IGZvciBkcm9wcGVkCmNvbHVt bnMsIGdlbmVyYXRlZCBjb2x1bW5zLCBhbmQgcHViLT5wdWJnZW5jb2xzX3R5cGUpIGlzIHBlcmZv cm1lZApkb3duc3RyZWFtIGluIHBnb3V0cHV0LmMgYnkgcHViX2Zvcm1fY29sc19tYXAoKSBhbmQK Y2hlY2tfYW5kX2ZldGNoX2NvbHVtbl9saXN0KCksIGJvdGggb2Ygd2hpY2ggYXJlIHVuY2hhbmdl ZCBieSB0aGlzCnBhdGNoLgoKLS0tCiBkb2Mvc3JjL3NnbWwvc3lzdGVtLXZpZXdzLnNnbWwgICAg ICAgICAgICAgIHwgIDkgKystLQogc3JjL2JhY2tlbmQvY2F0YWxvZy9wZ19wdWJsaWNhdGlvbi5j ICAgICAgICB8IDUyICsrKystLS0tLS0tLS0tLS0tLS0KIHNyYy9iYWNrZW5kL3JlcGxpY2F0aW9u L2xvZ2ljYWwvdGFibGVzeW5jLmMgfCAgOSArKy0tCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVk L3B1YmxpY2F0aW9uLm91dCAgIHwgNTcgKysrKysrKysrKysrKysrKysrLS0tCiBzcmMvdGVzdC9y ZWdyZXNzL3NxbC9wdWJsaWNhdGlvbi5zcWwgICAgICAgIHwgMzQgKysrKysrKysrKysrCiA1IGZp bGVzIGNoYW5nZWQsIDEwMiBpbnNlcnRpb25zKCspLCA1OSBkZWxldGlvbnMoLSkKCmRpZmYgLS1n aXQgYS9kb2Mvc3JjL3NnbWwvc3lzdGVtLXZpZXdzLnNnbWwgYi9kb2Mvc3JjL3NnbWwvc3lzdGVt LXZpZXdzLnNnbWwKaW5kZXggOWVlMWEyYmZjNmEuLjZjOTI2ODYwZTQxIDEwMDY0NAotLS0gYS9k b2Mvc3JjL3NnbWwvc3lzdGVtLXZpZXdzLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL3N5c3RlbS12 aWV3cy5zZ21sCkBAIC0yNzEyLDkgKzI3MTIsMTIgQEAgU0VMRUNUICogRlJPTSBwZ19sb2NrcyBw bCBMRUZUIEpPSU4gcGdfcHJlcGFyZWRfeGFjdHMgcHB4CiAgICAgICAgKHJlZmVyZW5jZXMgPGxp bmsgbGlua2VuZD0iY2F0YWxvZy1wZy1hdHRyaWJ1dGUiPjxzdHJ1Y3RuYW1lPnBnX2F0dHJpYnV0 ZTwvc3RydWN0bmFtZT48L2xpbms+LjxzdHJ1Y3RmaWVsZD5hdHRuYW1lPC9zdHJ1Y3RmaWVsZD4p CiAgICAgICA8L3BhcmE+CiAgICAgICA8cGFyYT4KLSAgICAgICBOYW1lcyBvZiB0YWJsZSBjb2x1 bW5zIGluY2x1ZGVkIGluIHRoZSBwdWJsaWNhdGlvbi4gVGhpcyBjb250YWlucyBhbGwKLSAgICAg ICB0aGUgY29sdW1ucyBvZiB0aGUgdGFibGUgd2hlbiB0aGUgdXNlciBkaWRuJ3Qgc3BlY2lmeSB0 aGUgY29sdW1uIGxpc3QKLSAgICAgICBmb3IgdGhlIHRhYmxlLgorICAgICAgIE5hbWVzIG9mIHRo ZSB0YWJsZSBjb2x1bW5zIGluY2x1ZGVkIGluIHRoZSBwdWJsaWNhdGlvbiwgb3IgTlVMTCBpZgor ICAgICAgIG5vIGV4cGxpY2l0IGNvbHVtbiBsaXN0IHdhcyBzcGVjaWZpZWQgZm9yIHRoZSB0YWJs ZS4gIFdoZW4gTlVMTCwgYWxsCisgICAgICAgY3VycmVudCBhbmQgZnV0dXJlIGNvbHVtbnMgb2Yg dGhlIHRhYmxlIGFyZSBwdWJsaXNoZWQ7IG5ldyBjb2x1bW5zCisgICAgICAgYWRkZWQgdG8gdGhl IHRhYmxlIHdpbGwgYXV0b21hdGljYWxseSBiZSByZXBsaWNhdGVkLiAgV2hlbiBub24tTlVMTCwK KyAgICAgICBvbmx5IHRoZSBsaXN0ZWQgY29sdW1ucyBhcmUgcmVwbGljYXRlZCwgYW5kIG5ld2x5 IGFkZGVkIGNvbHVtbnMgd2lsbAorICAgICAgIG5vdCBhcHBlYXIgdW50aWwgdGhlIHB1YmxpY2F0 aW9uIGlzIGV4cGxpY2l0bHkgYWx0ZXJlZC4KICAgICAgIDwvcGFyYT48L2VudHJ5PgogICAgICA8 L3Jvdz4KCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jYXRhbG9nL3BnX3B1YmxpY2F0aW9uLmMg Yi9zcmMvYmFja2VuZC9jYXRhbG9nL3BnX3B1YmxpY2F0aW9uLmMKaW5kZXggYzkyZmYzZjUxYzMu LmEyZmE0OTA2ZjA4IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jYXRhbG9nL3BnX3B1YmxpY2F0 aW9uLmMKKysrIGIvc3JjL2JhY2tlbmQvY2F0YWxvZy9wZ19wdWJsaWNhdGlvbi5jCkBAIC0xNDM5 LDQ5ICsxNDM5LDE1IEBAIHBnX2dldF9wdWJsaWNhdGlvbl90YWJsZXMoUEdfRlVOQ1RJT05fQVJH UykKIAkJCW51bGxzWzNdID0gdHJ1ZTsKIAkJfQoKLQkJLyogU2hvdyBhbGwgY29sdW1ucyB3aGVu IHRoZSBjb2x1bW4gbGlzdCBpcyBub3Qgc3BlY2lmaWVkLiAqLwotCQlpZiAobnVsbHNbMl0pCi0J CXsKLQkJCVJlbGF0aW9uCXJlbCA9IHRhYmxlX29wZW4ocmVsaWQsIEFjY2Vzc1NoYXJlTG9jayk7 Ci0JCQlpbnQJCQluYXR0bnVtcyA9IDA7Ci0JCQlpbnQxNgkgICAqYXR0bnVtczsKLQkJCVR1cGxl RGVzYwlkZXNjID0gUmVsYXRpb25HZXREZXNjcihyZWwpOwotCQkJaW50CQkJaTsKLQotCQkJYXR0 bnVtcyA9IHBhbGxvY19hcnJheShpbnQxNiwgZGVzYy0+bmF0dHMpOwotCi0JCQlmb3IgKGkgPSAw OyBpIDwgZGVzYy0+bmF0dHM7IGkrKykKLQkJCXsKLQkJCQlGb3JtX3BnX2F0dHJpYnV0ZSBhdHQg PSBUdXBsZURlc2NBdHRyKGRlc2MsIGkpOwotCi0JCQkJaWYgKGF0dC0+YXR0aXNkcm9wcGVkKQot CQkJCQljb250aW51ZTsKLQotCQkJCWlmIChhdHQtPmF0dGdlbmVyYXRlZCkKLQkJCQl7Ci0JCQkJ CS8qIFdlIG9ubHkgc3VwcG9ydCByZXBsaWNhdGlvbiBvZiBTVE9SRUQgZ2VuZXJhdGVkIGNvbHMu ICovCi0JCQkJCWlmIChhdHQtPmF0dGdlbmVyYXRlZCAhPSBBVFRSSUJVVEVfR0VORVJBVEVEX1NU T1JFRCkKLQkJCQkJCWNvbnRpbnVlOwotCi0JCQkJCS8qCi0JCQkJCSAqIFVzZXIgaGFzbid0IHJl cXVlc3RlZCB0byByZXBsaWNhdGUgU1RPUkVEIGdlbmVyYXRlZAotCQkJCQkgKiBjb2xzLgotCQkJ CQkgKi8KLQkJCQkJaWYgKHB1Yi0+cHViZ2VuY29sc190eXBlICE9IFBVQkxJU0hfR0VOQ09MU19T VE9SRUQpCi0JCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlhdHRudW1zW25hdHRudW1zKytd ID0gYXR0LT5hdHRudW07Ci0JCQl9Ci0KLQkJCWlmIChuYXR0bnVtcyA+IDApCi0JCQl7Ci0JCQkJ dmFsdWVzWzJdID0gUG9pbnRlckdldERhdHVtKGJ1aWxkaW50MnZlY3RvcihhdHRudW1zLCBuYXR0 bnVtcykpOwotCQkJCW51bGxzWzJdID0gZmFsc2U7Ci0JCQl9Ci0KLQkJCXRhYmxlX2Nsb3NlKHJl bCwgQWNjZXNzU2hhcmVMb2NrKTsKLQkJfQorCQkvKgorCQkgKiBXaGVuIG5vIGNvbHVtbiBsaXN0 IGlzIHNwZWNpZmllZCAocHJhdHRycyBpcyBOVUxMKSwgd2UgbGVhdmUKKwkJICogYXR0cnMgYXMg TlVMTCByYXRoZXIgdGhhbiBzeW50aGVzaXppbmcgYSBsaXN0IG9mIGFsbCBjdXJyZW50CisJCSAq IGNvbHVtbnMuICBUaGlzIGFsbG93cyBjb25zdW1lcnMgb2YgcGdfcHVibGljYXRpb25fdGFibGVz IHRvCisJCSAqIGRpc3Rpbmd1aXNoIGJldHdlZW4gImFsbCBjb2x1bW5zIGFyZSBwdWJsaXNoZWQi IChhdHRycyBJUworCQkgKiBOVUxMIC0gbmV3IGNvbHVtbnMgd2lsbCBhdXRvbWF0aWNhbGx5IGJl IHJlcGxpY2F0ZWQpIGFuZCBhbgorCQkgKiBleHBsaWNpdCBjb2x1bW4gbGlzdCAoYXR0cnMgSVMg Tk9UIE5VTEwgLSBvbmx5IGxpc3RlZCBjb2x1bW5zCisJCSAqIGFyZSByZXBsaWNhdGVkKS4KKwkJ ICovCgogCQlyZXR0dXBsZSA9IGhlYXBfZm9ybV90dXBsZShmdW5jY3R4LT50dXBsZV9kZXNjLCB2 YWx1ZXMsIG51bGxzKTsKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9sb2dp Y2FsL3RhYmxlc3luYy5jIGIvc3JjL2JhY2tlbmQvcmVwbGljYXRpb24vbG9naWNhbC90YWJsZXN5 bmMuYwppbmRleCBmNDlhNDg1MmVjYi4uNWY2ZDg5MmU1OTUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL3JlcGxpY2F0aW9uL2xvZ2ljYWwvdGFibGVzeW5jLmMKKysrIGIvc3JjL2JhY2tlbmQvcmVw bGljYXRpb24vbG9naWNhbC90YWJsZXN5bmMuYwpAQCAtNzk5LDEzICs3OTksMTAgQEAgZmV0Y2hf cmVtb3RlX3RhYmxlX2luZm8oY2hhciAqbnNwbmFtZSwgY2hhciAqcmVsbmFtZSwgTG9naWNhbFJl cFJlbGF0aW9uICpscmVsLAogCQkgKi8KIAkJcmVzZXRTdHJpbmdJbmZvKCZjbWQpOwogCQlhcHBl bmRTdHJpbmdJbmZvKCZjbWQsCi0JCQkJCQkgIlNFTEVDVCBESVNUSU5DVCIKLQkJCQkJCSAiICAo Q0FTRSBXSEVOIChhcnJheV9sZW5ndGgoZ3B0LmF0dHJzLCAxKSA9IGMucmVsbmF0dHMpIgotCQkJ CQkJICIgICBUSEVOIE5VTEwgRUxTRSBncHQuYXR0cnMgRU5EKSIKKwkJCQkJCSAiU0VMRUNUIERJ U1RJTkNUIGdwdC5hdHRycyIKIAkJCQkJCSAiICBGUk9NIHBnX3B1YmxpY2F0aW9uIHAsIgotCQkJ CQkJICIgIExBVEVSQUwgcGdfZ2V0X3B1YmxpY2F0aW9uX3RhYmxlcyhwLnB1Ym5hbWUpIGdwdCwi Ci0JCQkJCQkgIiAgcGdfY2xhc3MgYyIKLQkJCQkJCSAiIFdIRVJFIGdwdC5yZWxpZCA9ICV1IEFO RCBjLm9pZCA9IGdwdC5yZWxpZCIKKwkJCQkJCSAiICBMQVRFUkFMIHBnX2dldF9wdWJsaWNhdGlv bl90YWJsZXMocC5wdWJuYW1lKSBncHQiCisJCQkJCQkgIiBXSEVSRSBncHQucmVsaWQgPSAldSIK IAkJCQkJCSAiICAgQU5EIHAucHVibmFtZSBJTiAoICVzICkiLAogCQkJCQkJIGxyZWwtPnJlbW90 ZWlkLAogCQkJCQkJIHB1Yl9uYW1lcy0+ZGF0YSk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL3B1YmxpY2F0aW9uLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQv cHVibGljYXRpb24ub3V0CmluZGV4IGEyMjBmNDhiMjg1Li4wMTFjNjAyNjgxNiAxMDA2NDQKLS0t IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9wdWJsaWNhdGlvbi5vdXQKKysrIGIvc3JjL3Rl c3QvcmVncmVzcy9leHBlY3RlZC9wdWJsaWNhdGlvbi5vdXQKQEAgLTIwNzIsNyArMjA3Miw3IEBA IENSRUFURSBQVUJMSUNBVElPTiBwdWIgRk9SIFRBQkxFUyBJTiBTQ0hFTUEgc2NoMiBXSVRIIChQ VUJMSVNIX1ZJQV9QQVJUSVRJT05fUk9PCiBTRUxFQ1QgKiBGUk9NIHBnX3B1YmxpY2F0aW9uX3Rh YmxlczsKICBwdWJuYW1lIHwgc2NoZW1hbmFtZSB8IHRhYmxlbmFtZSAgfCBhdHRuYW1lcyB8IHJv d2ZpbHRlcgogLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSst LS0tLS0tLS0tLQotIHB1YiAgICAgfCBzY2gyICAgICAgIHwgdGJsMV9wYXJ0MSB8IHthfSAgICAg IHwKKyBwdWIgICAgIHwgc2NoMiAgICAgICB8IHRibDFfcGFydDEgfCAgICAgICAgICB8CiAoMSBy b3cpCgogRFJPUCBQVUJMSUNBVElPTiBwdWI7CkBAIC0yMDgxLDcgKzIwODEsNyBAQCBDUkVBVEUg UFVCTElDQVRJT04gcHViIEZPUiBUQUJMRSBzY2gyLnRibDFfcGFydDEgV0lUSCAoUFVCTElTSF9W SUFfUEFSVElUSU9OX1JPTwogU0VMRUNUICogRlJPTSBwZ19wdWJsaWNhdGlvbl90YWJsZXM7CiAg cHVibmFtZSB8IHNjaGVtYW5hbWUgfCB0YWJsZW5hbWUgIHwgYXR0bmFtZXMgfCByb3dmaWx0ZXIK IC0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0t LS0KLSBwdWIgICAgIHwgc2NoMiAgICAgICB8IHRibDFfcGFydDEgfCB7YX0gICAgICB8CisgcHVi ICAgICB8IHNjaDIgICAgICAgfCB0YmwxX3BhcnQxIHwgICAgICAgICAgfAogKDEgcm93KQoKIC0t IFRhYmxlIHB1YmxpY2F0aW9uIHRoYXQgaW5jbHVkZXMgYm90aCB0aGUgcGFyZW50IHRhYmxlIGFu ZCB0aGUgY2hpbGQgdGFibGUKQEAgLTIwODksNyArMjA4OSw3IEBAIEFMVEVSIFBVQkxJQ0FUSU9O IHB1YiBBREQgVEFCTEUgc2NoMS50YmwxOwogU0VMRUNUICogRlJPTSBwZ19wdWJsaWNhdGlvbl90 YWJsZXM7CiAgcHVibmFtZSB8IHNjaGVtYW5hbWUgfCB0YWJsZW5hbWUgfCBhdHRuYW1lcyB8IHJv d2ZpbHRlcgogLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0t LS0tLS0tLS0tCi0gcHViICAgICB8IHNjaDEgICAgICAgfCB0YmwxICAgICAgfCB7YX0gICAgICB8 CisgcHViICAgICB8IHNjaDEgICAgICAgfCB0YmwxICAgICAgfCAgICAgICAgICB8CiAoMSByb3cp CgogRFJPUCBQVUJMSUNBVElPTiBwdWI7CkBAIC0yMDk4LDcgKzIwOTgsNyBAQCBDUkVBVEUgUFVC TElDQVRJT04gcHViIEZPUiBUQUJMRVMgSU4gU0NIRU1BIHNjaDIgV0lUSCAoUFVCTElTSF9WSUFf UEFSVElUSU9OX1JPTwogU0VMRUNUICogRlJPTSBwZ19wdWJsaWNhdGlvbl90YWJsZXM7CiAgcHVi bmFtZSB8IHNjaGVtYW5hbWUgfCB0YWJsZW5hbWUgIHwgYXR0bmFtZXMgfCByb3dmaWx0ZXIKIC0t LS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0K LSBwdWIgICAgIHwgc2NoMiAgICAgICB8IHRibDFfcGFydDEgfCB7YX0gICAgICB8CisgcHViICAg ICB8IHNjaDIgICAgICAgfCB0YmwxX3BhcnQxIHwgICAgICAgICAgfAogKDEgcm93KQoKIERST1Ag UFVCTElDQVRJT04gcHViOwpAQCAtMjEwNyw3ICsyMTA3LDcgQEAgQ1JFQVRFIFBVQkxJQ0FUSU9O IHB1YiBGT1IgVEFCTEUgc2NoMi50YmwxX3BhcnQxIFdJVEggKFBVQkxJU0hfVklBX1BBUlRJVElP Tl9ST08KIFNFTEVDVCAqIEZST00gcGdfcHVibGljYXRpb25fdGFibGVzOwogIHB1Ym5hbWUgfCBz Y2hlbWFuYW1lIHwgdGFibGVuYW1lICB8IGF0dG5hbWVzIHwgcm93ZmlsdGVyCiAtLS0tLS0tLS0r LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tCi0gcHViICAg ICB8IHNjaDIgICAgICAgfCB0YmwxX3BhcnQxIHwge2F9ICAgICAgfAorIHB1YiAgICAgfCBzY2gy ICAgICAgIHwgdGJsMV9wYXJ0MSB8ICAgICAgICAgIHwKICgxIHJvdykKCiAtLSBUYWJsZSBwdWJs aWNhdGlvbiB0aGF0IGluY2x1ZGVzIGJvdGggdGhlIHBhcmVudCB0YWJsZSBhbmQgdGhlIGNoaWxk IHRhYmxlCkBAIC0yMTE1LDcgKzIxMTUsNyBAQCBBTFRFUiBQVUJMSUNBVElPTiBwdWIgQUREIFRB QkxFIHNjaDEudGJsMTsKIFNFTEVDVCAqIEZST00gcGdfcHVibGljYXRpb25fdGFibGVzOwogIHB1 Ym5hbWUgfCBzY2hlbWFuYW1lIHwgdGFibGVuYW1lICB8IGF0dG5hbWVzIHwgcm93ZmlsdGVyCiAt LS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0t Ci0gcHViICAgICB8IHNjaDIgICAgICAgfCB0YmwxX3BhcnQxIHwge2F9ICAgICAgfAorIHB1YiAg ICAgfCBzY2gyICAgICAgIHwgdGJsMV9wYXJ0MSB8ICAgICAgICAgIHwKICgxIHJvdykKCiBEUk9Q IFBVQkxJQ0FUSU9OIHB1YjsKQEAgLTIxMzAsNyArMjEzMCw3IEBAIENSRUFURSBQVUJMSUNBVElP TiBwdWIgRk9SIFRBQkxFUyBJTiBTQ0hFTUEgc2NoMSBXSVRIIChQVUJMSVNIX1ZJQV9QQVJUSVRJ T05fUk9PCiBTRUxFQ1QgKiBGUk9NIHBnX3B1YmxpY2F0aW9uX3RhYmxlczsKICBwdWJuYW1lIHwg c2NoZW1hbmFtZSB8IHRhYmxlbmFtZSB8IGF0dG5hbWVzIHwgcm93ZmlsdGVyCiAtLS0tLS0tLS0r LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0KLSBwdWIgICAg IHwgc2NoMSAgICAgICB8IHRibDEgICAgICB8IHthfSAgICAgIHwKKyBwdWIgICAgIHwgc2NoMSAg ICAgICB8IHRibDEgICAgICB8ICAgICAgICAgIHwKICgxIHJvdykKCiBSRVNFVCBjbGllbnRfbWlu X21lc3NhZ2VzOwpAQCAtMjEzOSw2ICsyMTM5LDQ5IEBAIERST1AgVEFCTEUgc2NoMS50YmwxOwog RFJPUCBTQ0hFTUEgc2NoMSBjYXNjYWRlOwogRFJPUCBTQ0hFTUEgc2NoMiBjYXNjYWRlOwogLS0g PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cist LSBUZXN0IHRoYXQgcGdfcHVibGljYXRpb25fdGFibGVzIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiB0 YWJsZXMgd2l0aAorLS0gYW4gZXhwbGljaXQgY29sdW1uIGxpc3QgYW5kIHRhYmxlcyB3aXRob3V0 IG9uZSAoYXR0bmFtZXMgc2hvdWxkIGJlCistLSBOVUxMIHdoZW4gbm8gY29sdW1uIGxpc3Qgd2Fz IHNwZWNpZmllZCkuCitDUkVBVEUgVEFCTEUgcHViX2NvbF90ZXN0IChpZCBpbnQsIG5hbWUgdGV4 dCwgc3RhdHVzIHRleHQpOworQ1JFQVRFIFBVQkxJQ0FUSU9OIHB1Yl9ub2NvbHMgRk9SIFRBQkxF IHB1Yl9jb2xfdGVzdDsKK0NSRUFURSBQVUJMSUNBVElPTiBwdWJfY29scyBGT1IgVEFCTEUgcHVi X2NvbF90ZXN0IChpZCwgbmFtZSk7CistLSBXaXRob3V0IGNvbHVtbiBsaXN0OiBhdHRuYW1lcyBz aG91bGQgYmUgTlVMTAorU0VMRUNUIHB1Ym5hbWUsIGF0dG5hbWVzIElTIE5VTEwgQVMgYWxsX2Nv bHVtbnMgRlJPTSBwZ19wdWJsaWNhdGlvbl90YWJsZXMKKyAgV0hFUkUgdGFibGVuYW1lID0gJ3B1 Yl9jb2xfdGVzdCcgT1JERVIgQlkgcHVibmFtZTsKKyAgcHVibmFtZSAgIHwgYWxsX2NvbHVtbnMK Ky0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tCisgcHViX2NvbHMgICB8IGYKKyBwdWJfbm9jb2xz IHwgdAorKDIgcm93cykKKworLS0gV2l0aCBjb2x1bW4gbGlzdDogYXR0bmFtZXMgc2hvdWxkIGxp c3Qgc3BlY2lmaWMgY29sdW1ucworU0VMRUNUIHB1Ym5hbWUsIGF0dG5hbWVzIEZST00gcGdfcHVi bGljYXRpb25fdGFibGVzCisgIFdIRVJFIHRhYmxlbmFtZSA9ICdwdWJfY29sX3Rlc3QnIEFORCBh dHRuYW1lcyBJUyBOT1QgTlVMTCBPUkRFUiBCWSBwdWJuYW1lOworIHB1Ym5hbWUgIHwgYXR0bmFt ZXMKKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0KKyBwdWJfY29scyB8IHtpZCxuYW1lfQorKDEgcm93 KQorCitEUk9QIFBVQkxJQ0FUSU9OIHB1Yl9ub2NvbHM7CitEUk9QIFBVQkxJQ0FUSU9OIHB1Yl9j b2xzOworRFJPUCBUQUJMRSBwdWJfY29sX3Rlc3Q7CistLSBUZXN0IHRoYXQgYSB0YWJsZSB3aXRo IGEgZHJvcHBlZCBjb2x1bW4gc3RpbGwgc2hvd3MgYXR0bmFtZXMgYXMgTlVMTAorLS0gd2hlbiBu byBleHBsaWNpdCBjb2x1bW4gbGlzdCB3YXMgc3BlY2lmaWVkLiAgVGhlIG9sZCBpbXBsZW1lbnRh dGlvbgorLS0gY29tcGFyZWQgdGhlIHN5bnRoZXNpemVkIGNvbHVtbiBjb3VudCBhZ2FpbnN0IHJl bG5hdHRzLCBidXQgcmVsbmF0dHMKKy0tIGluY2x1ZGVzIGRyb3BwZWQgY29sdW1ucywgc28gdGhl IGhldXJpc3RpYyB3YXMgd3JvbmcgZm9yIHRoaXMgY2FzZS4KK0NSRUFURSBUQUJMRSBwdWJfZHJv cHBlZF90ZXN0IChpZCBpbnQsIGRyb3BwZWRfY29sIHRleHQsIG5hbWUgdGV4dCk7CitBTFRFUiBU QUJMRSBwdWJfZHJvcHBlZF90ZXN0IERST1AgQ09MVU1OIGRyb3BwZWRfY29sOworQ1JFQVRFIFBV QkxJQ0FUSU9OIHB1Yl9kcm9wcGVkIEZPUiBUQUJMRSBwdWJfZHJvcHBlZF90ZXN0OworU0VMRUNU IHB1Ym5hbWUsIGF0dG5hbWVzIElTIE5VTEwgQVMgYWxsX2NvbHVtbnMgRlJPTSBwZ19wdWJsaWNh dGlvbl90YWJsZXMKKyAgV0hFUkUgdGFibGVuYW1lID0gJ3B1Yl9kcm9wcGVkX3Rlc3QnOworICAg cHVibmFtZSAgIHwgYWxsX2NvbHVtbnMKKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLQorIHB1 Yl9kcm9wcGVkIHwgdAorKDEgcm93KQorCitEUk9QIFBVQkxJQ0FUSU9OIHB1Yl9kcm9wcGVkOwor RFJPUCBUQUJMRSBwdWJfZHJvcHBlZF90ZXN0OworLS0gPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAtLSBUZXN0IHRoZSAncHVibGlzaF9nZW5l cmF0ZWRfY29sdW1ucycgcGFyYW1ldGVyIHdpdGggdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAtLSAn c3RvcmVkJywgJ25vbmUnLgogU0VUIGNsaWVudF9taW5fbWVzc2FnZXMgPSAnRVJST1InOwpkaWZm IC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcHVibGljYXRpb24uc3FsIGIvc3JjL3Rlc3Qv cmVncmVzcy9zcWwvcHVibGljYXRpb24uc3FsCmluZGV4IDIyZTBhMzBiNWM3Li4wZjNjNDQzYTE4 MCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcHVibGljYXRpb24uc3FsCisrKyBi L3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3B1YmxpY2F0aW9uLnNxbApAQCAtMTMyNyw2ICsxMzI3LDQw IEBAIERST1AgU0NIRU1BIHNjaDEgY2FzY2FkZTsKIERST1AgU0NIRU1BIHNjaDIgY2FzY2FkZTsK IC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQoKKy0tIFRlc3QgdGhhdCBwZ19wdWJsaWNhdGlvbl90YWJsZXMgZGlzdGluZ3Vpc2hlcyBiZXR3 ZWVuIHRhYmxlcyB3aXRoCistLSBhbiBleHBsaWNpdCBjb2x1bW4gbGlzdCBhbmQgdGFibGVzIHdp dGhvdXQgb25lIChhdHRuYW1lcyBzaG91bGQgYmUKKy0tIE5VTEwgd2hlbiBubyBjb2x1bW4gbGlz dCB3YXMgc3BlY2lmaWVkKS4KK0NSRUFURSBUQUJMRSBwdWJfY29sX3Rlc3QgKGlkIGludCwgbmFt ZSB0ZXh0LCBzdGF0dXMgdGV4dCk7CitDUkVBVEUgUFVCTElDQVRJT04gcHViX25vY29scyBGT1Ig VEFCTEUgcHViX2NvbF90ZXN0OworQ1JFQVRFIFBVQkxJQ0FUSU9OIHB1Yl9jb2xzIEZPUiBUQUJM RSBwdWJfY29sX3Rlc3QgKGlkLCBuYW1lKTsKKworLS0gV2l0aG91dCBjb2x1bW4gbGlzdDogYXR0 bmFtZXMgc2hvdWxkIGJlIE5VTEwKK1NFTEVDVCBwdWJuYW1lLCBhdHRuYW1lcyBJUyBOVUxMIEFT IGFsbF9jb2x1bW5zIEZST00gcGdfcHVibGljYXRpb25fdGFibGVzCisgIFdIRVJFIHRhYmxlbmFt ZSA9ICdwdWJfY29sX3Rlc3QnIE9SREVSIEJZIHB1Ym5hbWU7CisKKy0tIFdpdGggY29sdW1uIGxp c3Q6IGF0dG5hbWVzIHNob3VsZCBsaXN0IHNwZWNpZmljIGNvbHVtbnMKK1NFTEVDVCBwdWJuYW1l LCBhdHRuYW1lcyBGUk9NIHBnX3B1YmxpY2F0aW9uX3RhYmxlcworICBXSEVSRSB0YWJsZW5hbWUg PSAncHViX2NvbF90ZXN0JyBBTkQgYXR0bmFtZXMgSVMgTk9UIE5VTEwgT1JERVIgQlkgcHVibmFt ZTsKKworRFJPUCBQVUJMSUNBVElPTiBwdWJfbm9jb2xzOworRFJPUCBQVUJMSUNBVElPTiBwdWJf Y29sczsKK0RST1AgVEFCTEUgcHViX2NvbF90ZXN0OworCistLSBUZXN0IHRoYXQgYSB0YWJsZSB3 aXRoIGEgZHJvcHBlZCBjb2x1bW4gc3RpbGwgc2hvd3MgYXR0bmFtZXMgYXMgTlVMTAorLS0gd2hl biBubyBleHBsaWNpdCBjb2x1bW4gbGlzdCB3YXMgc3BlY2lmaWVkLiAgVGhlIG9sZCBpbXBsZW1l bnRhdGlvbgorLS0gY29tcGFyZWQgdGhlIHN5bnRoZXNpemVkIGNvbHVtbiBjb3VudCBhZ2FpbnN0 IHJlbG5hdHRzLCBidXQgcmVsbmF0dHMKKy0tIGluY2x1ZGVzIGRyb3BwZWQgY29sdW1ucywgc28g dGhlIGhldXJpc3RpYyB3YXMgd3JvbmcgZm9yIHRoaXMgY2FzZS4KK0NSRUFURSBUQUJMRSBwdWJf ZHJvcHBlZF90ZXN0IChpZCBpbnQsIGRyb3BwZWRfY29sIHRleHQsIG5hbWUgdGV4dCk7CitBTFRF UiBUQUJMRSBwdWJfZHJvcHBlZF90ZXN0IERST1AgQ09MVU1OIGRyb3BwZWRfY29sOworQ1JFQVRF IFBVQkxJQ0FUSU9OIHB1Yl9kcm9wcGVkIEZPUiBUQUJMRSBwdWJfZHJvcHBlZF90ZXN0OworCitT RUxFQ1QgcHVibmFtZSwgYXR0bmFtZXMgSVMgTlVMTCBBUyBhbGxfY29sdW1ucyBGUk9NIHBnX3B1 YmxpY2F0aW9uX3RhYmxlcworICBXSEVSRSB0YWJsZW5hbWUgPSAncHViX2Ryb3BwZWRfdGVzdCc7 CisKK0RST1AgUFVCTElDQVRJT04gcHViX2Ryb3BwZWQ7CitEUk9QIFRBQkxFIHB1Yl9kcm9wcGVk X3Rlc3Q7CistLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KKwogLS0gVGVzdCB0aGUgJ3B1Ymxpc2hfZ2VuZXJhdGVkX2NvbHVtbnMnIHBhcmFt ZXRlciB3aXRoIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogLS0gJ3N0b3JlZCcsICdub25lJy4KIFNF VCBjbGllbnRfbWluX21lc3NhZ2VzID0gJ0VSUk9SJzsKCmJhc2UtY29tbWl0OiA3YmFhMzljNDY4 ZmExZDcwM2Q1MGNkNjk3ZTlkZDA1ZjY4MzFhZTM4Ci0tCjIuNTAuMSAoQXBwbGUgR2l0LTE1NSkK Cg== --000000000000062be4064dde97ae--