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.94.2) (envelope-from ) id 1s3lQM-00FUIy-5v for pgsql-hackers@arkaria.postgresql.org; Sun, 05 May 2024 23:37:42 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1s3lQI-00986p-N5 for pgsql-hackers@arkaria.postgresql.org; Sun, 05 May 2024 23:37:39 +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.94.2) (envelope-from ) id 1s3lQI-00986h-8Y for pgsql-hackers@lists.postgresql.org; Sun, 05 May 2024 23:37:39 +0000 Received: from mail-lf1-x12b.google.com ([2a00:1450:4864:20::12b]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1s3lQF-001kAe-8k for pgsql-hackers@postgresql.org; Sun, 05 May 2024 23:37:38 +0000 Received: by mail-lf1-x12b.google.com with SMTP id 2adb3069b0e04-51aa6a8e49aso1837504e87.3 for ; Sun, 05 May 2024 16:37:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1714952253; x=1715557053; darn=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=s2Lj4rcSomI5I1+EZ23nkAgm2RLkmAgBtjt/7XOXekQ=; b=eYmXMvhx2tuAEJdDkhIj57H4puysLxSs6kZSibXf9uh56MpeoXFm7eiHkQ1MMW1f4D 5LysLNQBqu1iuMV57FoP/eMeaklXPDle7XWmpKtCWU3Fa16cGTMSS3GpXhZB8m1rh2vs CNH72W0MskV9y0p3u6VAxIjKFP766mvHMBejOMapGIUXgTAhn5yb16QJISSBPXpkPilV SuYqBwDtSMfCM+ecvytykTpgVjF4vscPDB+j0jGZCTpxITcl6+sS+DuC5W1mKPEQrM2k EE/hYAnxIzMWTOVuQPRaanEVlOvv8vZlyWlV8ktWdHNZ+ES2nF7vQf7rvZpmq+o18DFS dwAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714952253; x=1715557053; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=s2Lj4rcSomI5I1+EZ23nkAgm2RLkmAgBtjt/7XOXekQ=; b=uxpdICEGO8r32iEDdCP8pwZ1W7TgZuu6k7exs+lYAHJxESu5WcHbyKgEpZtjd00SDq ExQvDHJlvk+KgHWlc59XGxdLPVmwRPrAVtqwV2G0MC/tga/dlIAbiIuqsUx6f7V/CUC6 oKRn1CnA70uApRlnuV5IkFMGYRhD+SI9NOlGmOHWNIhh71JYTBSTWXOQSr3qSRDonKsc NlneOT+SCbQQ9DB8LC1OyMnboGt2ekgOjjUtYGBx6RLKMyP7C3Q9hVtMr2o/KXa2dPUr fm7d5tDKEiuOEXxqAbMbg7mu5Bze4j/YBfN+eSpbM/iMQJk8sAYcmWHrezZjTYLkpUZ5 WMCQ== X-Forwarded-Encrypted: i=1; AJvYcCUgkHW/lvlpzJbVVcqOo06i0DJcggYrBxGmUzxS7seI/a+sYs9YeFApR8Jo5uVbcDoFzOcHUCCuUz7UV7SEUJAvrqq89pFXXee7uQbV X-Gm-Message-State: AOJu0Yyw/cs2ixwAE9V6mkdBt9umHV3sOhENzE6ScIqGPciOis6ytXDM SMLhO/sWonJe1FyyTdtGhv657jAQh4Ct27ZPGDKC+vd7TpK9wHxy5RM3GRWkhZRgNjtEH/oNZAq 2XshKpnhuV+fC8GpwczrbQN80IcLcFT5L X-Google-Smtp-Source: AGHT+IF1BsJJObJL91/oW9Gcd0SeljP4x+U3uMzVoIl1aYXpfRZNHVHcn6YQwydAS36LVq3uXx3oTrIcRROk4UxeKC8= X-Received: by 2002:a05:6512:714:b0:51b:e46c:19fc with SMTP id b20-20020a056512071400b0051be46c19fcmr4550569lfs.58.1714952253062; Sun, 05 May 2024 16:37:33 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Michail Nikolaev Date: Mon, 6 May 2024 01:37:20 +0200 Message-ID: Subject: Re: Revisiting {CREATE INDEX, REINDEX} CONCURRENTLY improvements To: Matthias van de Meent Cc: Melanie Plageman , PostgreSQL Hackers , Andrey Borodin Content-Type: multipart/mixed; boundary="000000000000da3a570617bd6f87" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000da3a570617bd6f87 Content-Type: multipart/alternative; boundary="000000000000da3a560617bd6f85" --000000000000da3a560617bd6f85 Content-Type: text/plain; charset="UTF-8" Hello, Matthias! I just realized there is a much simpler and safe way to deal with the problem. So, d9d076222f5b94a85e0e318339cfc44b8f26022d(1) had a bug because the scan was not protected by a snapshot. At the same time, we want this snapshot to affect not all the relations, but only a subset of them. And there is already a proper way to achieve that - different types of visibility horizons! So, to resolve the issue, we just need to create a separated horizon value for such situation as building an index concurrently. For now, let's name it `VISHORIZON_BUILD_INDEX_CONCURRENTLY` for example. By default, its value is equal to `VISHORIZON_DATA`. But in some cases it "stops" propagating forward while concurrent index is building, like this: h->create_index_concurrently_oldest_nonremovable =TransactionIdOlder(h->create_index_concurrently_oldest_nonremovable, xmin); if (!(statusFlags & PROC_IN_SAFE_IC)) h->data_oldest_nonremovable = TransactionIdOlder(h->data_oldest_nonremovable, xmin); The `PROC_IN_SAFE_IC` marks backend xmin as ignored by `VISHORIZON_DATA` but not by `VISHORIZON_BUILD_INDEX_CONCURRENTLY`. After, we need to use appropriate horizon for relations which are processed by `PROC_IN_SAFE_IC` backends. There are a few ways to do it, we may start prototyping with `rd_indexisbuilding` from previous message: static inline GlobalVisHorizonKind GlobalVisHorizonKindForRel(Relation rel) ........ if (rel != NULL && rel->rd_indexvalid && rel->rd_indexisbuilding) return VISHORIZON_BUILD_INDEX_CONCURRENTLY; There are few more moments need to be considered: * Does it move the horizon backwards? It is allowed for the horizon to move backwards (like said in `ComputeXidHorizons`) but anyway - in that case the horizon for particular relations just starts to lag behind the horizon for other relations. Invariant is like that: `VISHORIZON_BUILD_INDEX_CONCURRENTLY` <= `VISHORIZON_DATA` <= `VISHORIZON_CATALOG` <= `VISHORIZON_SHARED`. * What is about old cached versions of `Relation` objects without `rd_indexisbuilding` yet set? This is not a problem because once the backend registers a new index, it waits for all transactions without that knowledge to end (`WaitForLockers`). So, new ones will also get information about new horizon for that particular relation. * What is about TOAST? To keep TOAST horizon aligned with relation building the index, we may do the next thing (as first implementation iteration): else if (rel != NULL && ((rel->rd_indexvalid && rel->rd_indexisbuilding) || IsToastRelation(rel))) return VISHORIZON_BUILD_INDEX_CONCURRENTLY; For the normal case, `VISHORIZON_BUILD_INDEX_CONCURRENTLY` is equal to `VISHORIZON_DATA` - nothing is changed at all. But while the concurrent index is building, the TOAST horizon is guaranteed to be aligned with its parent relation. And yes, it is better to find an easy way to affect only TOAST relations related to the relation with index building in progress. New horizon adds some complexity, but not too much, in my opinion. I am pretty sure it is worth being done because the ability to rebuild indexes without performance degradation is an extremely useful feature. Things to be improved: * better way to track relations with concurrent indexes being built (with mechanics to understood what index build was failed) * better way to affect TOAST tables only related to concurrent index build * better naming Patch prototype in attachment. Also, maybe it is worth committing test separately - it was based on Andrey Borodin work (2). The test fails well in the case of incorrect implementation. [1]: https://github.com/postgres/postgres/commit/d9d076222f5b94a85e0e318339cfc44b8f26022d#diff-8879f0173be303070ab7931db7c757c96796d84402640b9e386a4150ed97b179R1779-R1793 [2]: https://github.com/x4m/postgres_g/commit/d0651e7d0d14862d5a4dac076355 --000000000000da3a560617bd6f85 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hello, Matthias!

I just realized there is a much si= mpler and safe way to deal with the problem.

So, d9d076222f5b94a85e0= e318339cfc44b8f26022d(1) had a bug because the scan was not protected by a = snapshot. At the same time, we want this snapshot to affect not all the rel= ations, but only a subset of them. And there is already a proper way to ach= ieve that - different types of visibility horizons!

So, to resolve t= he issue, we just need to create a separated horizon value for such situati= on as building an index concurrently.

For now, let's name it `VI= SHORIZON_BUILD_INDEX_CONCURRENTLY` for example. By default, its value is eq= ual to `VISHORIZON_DATA`. But in some cases it "stops" propagatin= g forward while concurrent index is building, like this:

=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 h->create_index_concurrently_oldest_nonr= emovable =3DTransactionIdOlder(h->create_index_concurrently_oldest_nonre= movable, xmin);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0if (!(sta= tusFlags & PROC_IN_SAFE_IC))
=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=A0h->data_oldest_n= onremovable =3D TransactionIdOlder(h->data_oldest_nonremovable, xmin);
The `PROC_IN_SAFE_IC` marks backend xmin as ignored by `VISHORIZON_DA= TA` but not by `VISHORIZON_BUILD_INDEX_CONCURRENTLY`.

After, we need= to use appropriate horizon for relations which are processed by `PROC_IN_S= AFE_IC` backends. There are a few ways to do it, we may start prototyping w= ith `rd_indexisbuilding` from previous message:

=C2=A0 =C2=A0 =C2=A0= =C2=A0 static inline GlobalVisHorizonKind
=C2=A0 =C2=A0 =C2=A0 =C2=A0 G= lobalVisHorizonKindForRel(Relation rel)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 ....= ....
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (rel !=3D NULL &&a= mp; rel->rd_indexvalid && rel->rd_indexisbuilding)
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return VISHO= RIZON_BUILD_INDEX_CONCURRENTLY;


There are few more moments need = to be considered:

* Does it move the horizon backwards?

It i= s allowed for the horizon to move backwards (like said in `ComputeXidHorizo= ns`) but anyway - in that case the horizon for particular relations just st= arts to lag behind the horizon for other relations.
Invariant is like th= at: `VISHORIZON_BUILD_INDEX_CONCURRENTLY` <=3D `VISHORIZON_DATA` <=3D= `VISHORIZON_CATALOG` <=3D `VISHORIZON_SHARED`.

* What is about o= ld cached versions of `Relation` objects without `rd_indexisbuilding` yet s= et?

This is not a problem because once the backend registers = a new index, it waits for all transactions without that knowledge to end (`= WaitForLockers`). So, new ones will also get information about new horizon = for that particular relation.

* What is about TOAST?
To keep TOAS= T horizon aligned with relation building the index, we may do the next thin= g (as first implementation iteration):

=C2=A0 =C2=A0 =C2=A0 =C2=A0 e= lse if (rel !=3D NULL && ((rel->rd_indexvalid && rel->= ;rd_indexisbuilding) || IsToastRelation(rel)))
=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return VISHORIZON_BUILD_INDEX_CONCURRENTLY;=

For the normal case, `VISHORIZON_BUILD_INDEX_CONCURRENTLY` is equal= to `VISHORIZON_DATA` - nothing is changed at all. But while the concurrent= index is building, the TOAST horizon is guaranteed to be aligned with its = parent relation. And yes, it is better to find an easy way to affect only T= OAST relations related to the relation with index building in progress.
=
New horizon adds some complexity, but not too much, in my opinion. I am= pretty sure it is worth being done because the ability to rebuild indexes = without performance degradation is an extremely useful feature.
T= hings to be improved:
* better way to track relations with concurrent in= dexes being built (with mechanics to understood what index build was failed= )
* better way to affect TOAST tables only related to concurrent index b= uild
* better naming

Patch prototype in attachment.
Also, mayb= e it is worth committing test separately - it was based on Andrey Borodin w= ork (2). The test fails well in the case of incorrect implementation.
[1]: https://github.com/postgres/postgres/com= mit/d9d076222f5b94a85e0e318339cfc44b8f26022d#diff-8879f0173be303070ab7931db= 7c757c96796d84402640b9e386a4150ed97b179R1779-R1793
[2]: https= ://github.com/x4m/postgres_g/commit/d0651e7d0d14862d5a4dac076355
--000000000000da3a560617bd6f85-- --000000000000da3a570617bd6f87 Content-Type: text/x-patch; charset="US-ASCII"; name="v1-0001-WIP-fix-d9d076222f5b-VACUUM-ignore-indexing-opera.patch" Content-Disposition: attachment; filename="v1-0001-WIP-fix-d9d076222f5b-VACUUM-ignore-indexing-opera.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lvu69ttl0 RnJvbSBiNDYzZGQxODBhYjU4MjBhYzViNDE0NGZmMjI2MjJiMmE2MzQwYjA5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBua2V5IDxtaWNoYWlsLm5pa29sYWV2QGdtYWlsLmNvbT4KRGF0 ZTogTW9uLCA2IE1heSAyMDI0IDAxOjA4OjQ5ICswMjAwClN1YmplY3Q6IFtQQVRDSCB2MV0gV0lQ OiBmaXggZDlkMDc2MjIyZjViICJWQUNVVU06IGlnbm9yZSBpbmRleGluZyBvcGVyYXRpb25zCiB3 aXRoIENPTkNVUlJFTlRMWSIgd2hpY2ggd2FzIHJldmVydGVkIGJ5IGUyOGJiODg1MTk2OS4KCklu dHJvZHVjZSBuZXcgdHlwZSBvZiB2aXNpYmlsaXR5IGhvcml6b24gdG8gYmUgdXNlZCBmb3IgcmVs YXRpb24gd2l0aCBjb25jdXJyZW50bHkgYnVpbGQgaW5kZXhlcyAoaW4gdGhlIGNhc2Ugb2YgInNh ZmUiIGluZGV4KS4KLS0tCiBzcmMvYmFja2VuZC9jYXRhbG9nL2luZGV4LmMgICAgICAgICAgICAg IHwgICAzICsKIHNyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL3Byb2NhcnJheS5jICAgICAgfCAgNzIg KysrKysrKysrKy0KIHNyYy9iYWNrZW5kL3V0aWxzL2NhY2hlL3JlbGNhY2hlLmMgICAgICAgfCAg IDYgKwogc3JjL2Jpbi9wZ19hbWNoZWNrL3QvMDA2X2NvbmN1cnJlbnRseS5wbCB8IDE1NSArKysr KysrKysrKysrKysrKysrKysrKwogc3JjL2luY2x1ZGUvdXRpbHMvcmVsLmggICAgICAgICAgICAg ICAgICB8ICAgMSArCiA1IGZpbGVzIGNoYW5nZWQsIDIzMSBpbnNlcnRpb25zKCspLCA2IGRlbGV0 aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy9iaW4vcGdfYW1jaGVjay90LzAwNl9jb25j dXJyZW50bHkucGwKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jYXRhbG9nL2luZGV4LmMgYi9z cmMvYmFja2VuZC9jYXRhbG9nL2luZGV4LmMKaW5kZXggNWE4NTY4YzU1Yy4uNmFkOTI1NGQ0OSAx MDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY2F0YWxvZy9pbmRleC5jCisrKyBiL3NyYy9iYWNrZW5k L2NhdGFsb2cvaW5kZXguYwpAQCAtMzMyMCw2ICszMzIwLDkgQEAgdmFsaWRhdGVfaW5kZXgoT2lk IGhlYXBJZCwgT2lkIGluZGV4SWQsIFNuYXBzaG90IHNuYXBzaG90KQogCiAJLyogT3BlbiBhbmQg bG9jayB0aGUgcGFyZW50IGhlYXAgcmVsYXRpb24gKi8KIAloZWFwUmVsYXRpb24gPSB0YWJsZV9v cGVuKGhlYXBJZCwgU2hhcmVVcGRhdGVFeGNsdXNpdmVMb2NrKTsKKwkvKiBMb2FkIGluZm9ybWF0 aW9uIGFib3V0IHRoZSBidWlsZGluZyBpbmRleGVzICovCisJUmVsYXRpb25HZXRJbmRleExpc3Qo aGVhcFJlbGF0aW9uKTsKKwlBc3NlcnQoaGVhcFJlbGF0aW9uLT5yZF9pbmRleGlzYnVpbGRpbmcp OwogCiAJLyoKIAkgKiBTd2l0Y2ggdG8gdGhlIHRhYmxlIG93bmVyJ3MgdXNlcmlkLCBzbyB0aGF0 IGFueSBpbmRleCBmdW5jdGlvbnMgYXJlIHJ1bgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3Rv cmFnZS9pcGMvcHJvY2FycmF5LmMgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9wcm9jYXJyYXku YwppbmRleCAxYTgzYzQyMjBiLi5hMmZlMTczYmI2IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9z dG9yYWdlL2lwYy9wcm9jYXJyYXkuYworKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9wcm9j YXJyYXkuYwpAQCAtMjM2LDYgKzIzNiwxMiBAQCB0eXBlZGVmIHN0cnVjdCBDb21wdXRlWGlkSG9y aXpvbnNSZXN1bHQKIAkgKi8KIAlUcmFuc2FjdGlvbklkIGRhdGFfb2xkZXN0X25vbnJlbW92YWJs ZTsKIAorCS8qCisJICogT2xkZXN0IHhpZCBmb3Igd2hpY2ggZGVsZXRlZCB0dXBsZXMgbmVlZCB0 byBiZSByZXRhaW5lZCBpbiBub3JtYWwgdXNlcgorCSAqIGRlZmluZWQgdGFibGVzIHdpdGggaW5k ZXggYnVpbGRpbmcgaW4gcHJvZ3Jlc3MuCisJICovCisJVHJhbnNhY3Rpb25JZCBjcmVhdGVfaW5k ZXhfY29uY3VycmVudGx5X29sZGVzdF9ub25yZW1vdmFibGU7CisKIAkvKgogCSAqIE9sZGVzdCB4 aWQgZm9yIHdoaWNoIGRlbGV0ZWQgdHVwbGVzIG5lZWQgdG8gYmUgcmV0YWluZWQgaW4gdGhpcwog CSAqIHNlc3Npb24ncyB0ZW1wb3JhcnkgdGFibGVzLgpAQCAtMjUxLDYgKzI1Nyw3IEBAIHR5cGVk ZWYgZW51bSBHbG9iYWxWaXNIb3Jpem9uS2luZAogCVZJU0hPUklaT05fU0hBUkVELAogCVZJU0hP UklaT05fQ0FUQUxPRywKIAlWSVNIT1JJWk9OX0RBVEEsCisJVklTSE9SSVpPTl9CVUlMRF9JTkRF WF9DT05DVVJSRU5UTFksCiAJVklTSE9SSVpPTl9URU1QLAogfSBHbG9iYWxWaXNIb3Jpem9uS2lu ZDsKIApAQCAtMjk3LDYgKzMwNCw3IEBAIHN0YXRpYyBUcmFuc2FjdGlvbklkIHN0YW5kYnlTbmFw c2hvdFBlbmRpbmdYbWluOwogc3RhdGljIEdsb2JhbFZpc1N0YXRlIEdsb2JhbFZpc1NoYXJlZFJl bHM7CiBzdGF0aWMgR2xvYmFsVmlzU3RhdGUgR2xvYmFsVmlzQ2F0YWxvZ1JlbHM7CiBzdGF0aWMg R2xvYmFsVmlzU3RhdGUgR2xvYmFsVmlzRGF0YVJlbHM7CitzdGF0aWMgR2xvYmFsVmlzU3RhdGUg R2xvYmFsVmlzQnVpbGRJbmRleENvbmN1cnJlbnRseVJlbHM7CiBzdGF0aWMgR2xvYmFsVmlzU3Rh dGUgR2xvYmFsVmlzVGVtcFJlbHM7CiAKIC8qCkBAIC0xNzI3LDkgKzE3MzUsNiBAQCBDb21wdXRl WGlkSG9yaXpvbnMoQ29tcHV0ZVhpZEhvcml6b25zUmVzdWx0ICpoKQogCWJvb2wJCWluX3JlY292 ZXJ5ID0gUmVjb3ZlcnlJblByb2dyZXNzKCk7CiAJVHJhbnNhY3Rpb25JZCAqb3RoZXJfeGlkcyA9 IFByb2NHbG9iYWwtPnhpZHM7CiAKLQkvKiBpbmZlcnJlZCBhZnRlciBQcm9jQXJyYXlMb2NrIGlz IHJlbGVhc2VkICovCi0JaC0+Y2F0YWxvZ19vbGRlc3Rfbm9ucmVtb3ZhYmxlID0gSW52YWxpZFRy YW5zYWN0aW9uSWQ7Ci0KIAlMV0xvY2tBY3F1aXJlKFByb2NBcnJheUxvY2ssIExXX1NIQVJFRCk7 CiAKIAloLT5sYXRlc3RfY29tcGxldGVkID0gVHJhbnNhbVZhcmlhYmxlcy0+bGF0ZXN0Q29tcGxl dGVkWGlkOwpAQCAtMTc0OSw3ICsxNzU0LDkgQEAgQ29tcHV0ZVhpZEhvcml6b25zKENvbXB1dGVY aWRIb3Jpem9uc1Jlc3VsdCAqaCkKIAogCQloLT5vbGRlc3RfY29uc2lkZXJlZF9ydW5uaW5nID0g aW5pdGlhbDsKIAkJaC0+c2hhcmVkX29sZGVzdF9ub25yZW1vdmFibGUgPSBpbml0aWFsOworCQlo LT5jYXRhbG9nX29sZGVzdF9ub25yZW1vdmFibGUgPSBpbml0aWFsOwogCQloLT5kYXRhX29sZGVz dF9ub25yZW1vdmFibGUgPSBpbml0aWFsOworCQloLT5jcmVhdGVfaW5kZXhfY29uY3VycmVudGx5 X29sZGVzdF9ub25yZW1vdmFibGUgPSBpbml0aWFsOwogCiAJCS8qCiAJCSAqIE9ubHkgbW9kaWZp Y2F0aW9ucyBtYWRlIGJ5IHRoaXMgYmFja2VuZCBhZmZlY3QgdGhlIGhvcml6b24gZm9yCkBAIC0x ODQ3LDExICsxODU0LDI4IEBAIENvbXB1dGVYaWRIb3Jpem9ucyhDb21wdXRlWGlkSG9yaXpvbnNS ZXN1bHQgKmgpCiAJCQkoc3RhdHVzRmxhZ3MgJiBQUk9DX0FGRkVDVFNfQUxMX0hPUklaT05TKSB8 fAogCQkJaW5fcmVjb3ZlcnkpCiAJCXsKLQkJCWgtPmRhdGFfb2xkZXN0X25vbnJlbW92YWJsZSA9 Ci0JCQkJVHJhbnNhY3Rpb25JZE9sZGVyKGgtPmRhdGFfb2xkZXN0X25vbnJlbW92YWJsZSwgeG1p bik7CisJCQloLT5jcmVhdGVfaW5kZXhfY29uY3VycmVudGx5X29sZGVzdF9ub25yZW1vdmFibGUg PQorCQkJCQlUcmFuc2FjdGlvbklkT2xkZXIoaC0+Y3JlYXRlX2luZGV4X2NvbmN1cnJlbnRseV9v bGRlc3Rfbm9ucmVtb3ZhYmxlLCB4bWluKTsKKworCQkJaWYgKCEoc3RhdHVzRmxhZ3MgJiBQUk9D X0lOX1NBRkVfSUMpKQorCQkJCWgtPmRhdGFfb2xkZXN0X25vbnJlbW92YWJsZSA9CisJCQkJCVRy YW5zYWN0aW9uSWRPbGRlcihoLT5kYXRhX29sZGVzdF9ub25yZW1vdmFibGUsIHhtaW4pOworCisJ CQkvKiBDYXRhbG9nIHRhYmxlcyBuZWVkIHRvIGNvbnNpZGVyIGFsbCBiYWNrZW5kcyBpbiB0aGlz IGRiICovCisJCQloLT5jYXRhbG9nX29sZGVzdF9ub25yZW1vdmFibGUgPQorCQkJCVRyYW5zYWN0 aW9uSWRPbGRlcihoLT5jYXRhbG9nX29sZGVzdF9ub25yZW1vdmFibGUsIHhtaW4pOworCiAJCX0K IAl9CiAKKwkvKiBjYXRhbG9nIGhvcml6b24gc2hvdWxkIG5ldmVyIGJlIGxhdGVyIHRoYW4gZGF0 YSAqLworCUFzc2VydChUcmFuc2FjdGlvbklkUHJlY2VkZXNPckVxdWFscyhoLT5jYXRhbG9nX29s ZGVzdF9ub25yZW1vdmFibGUsCisJCQkJCQkJCQkJIGgtPmRhdGFfb2xkZXN0X25vbnJlbW92YWJs ZSkpOworCisJLyogZGF0YSBob3Jpem9uIHNob3VsZCBuZXZlciBiZSBsYXRlciB0aGFuIGluZGV4 IGJ1aWxkaW5nIGhvcml6b24gKi8KKwlBc3NlcnQoVHJhbnNhY3Rpb25JZFByZWNlZGVzT3JFcXVh bHMoaC0+Y3JlYXRlX2luZGV4X2NvbmN1cnJlbnRseV9vbGRlc3Rfbm9ucmVtb3ZhYmxlLAorCQkJ CQkJCQkJCSBoLT5kYXRhX29sZGVzdF9ub25yZW1vdmFibGUpKTsKKwogCS8qCiAJICogSWYgaW4g cmVjb3ZlcnkgZmV0Y2ggb2xkZXN0IHhpZCBpbiBLbm93bkFzc2lnbmVkWGlkcywgd2lsbCBiZSBh cHBsaWVkCiAJICogYWZ0ZXIgbG9jayBpcyByZWxlYXNlZC4KQEAgLTE4NzMsNiArMTg5NywxMCBA QCBDb21wdXRlWGlkSG9yaXpvbnMoQ29tcHV0ZVhpZEhvcml6b25zUmVzdWx0ICpoKQogCQkJVHJh bnNhY3Rpb25JZE9sZGVyKGgtPnNoYXJlZF9vbGRlc3Rfbm9ucmVtb3ZhYmxlLCBrYXhtaW4pOwog CQloLT5kYXRhX29sZGVzdF9ub25yZW1vdmFibGUgPQogCQkJVHJhbnNhY3Rpb25JZE9sZGVyKGgt PmRhdGFfb2xkZXN0X25vbnJlbW92YWJsZSwga2F4bWluKTsKKwkJaC0+Y3JlYXRlX2luZGV4X2Nv bmN1cnJlbnRseV9vbGRlc3Rfbm9ucmVtb3ZhYmxlID0KKwkJCQlUcmFuc2FjdGlvbklkT2xkZXIo aC0+Y3JlYXRlX2luZGV4X2NvbmN1cnJlbnRseV9vbGRlc3Rfbm9ucmVtb3ZhYmxlLCBrYXhtaW4p OworCQloLT5jYXRhbG9nX29sZGVzdF9ub25yZW1vdmFibGUgPQorCQkJVHJhbnNhY3Rpb25JZE9s ZGVyKGgtPmNhdGFsb2dfb2xkZXN0X25vbnJlbW92YWJsZSwga2F4bWluKTsKIAkJLyogdGVtcCBy ZWxhdGlvbnMgY2Fubm90IGJlIGFjY2Vzc2VkIGluIHJlY292ZXJ5ICovCiAJfQogCkBAIC0xODgw LDYgKzE5MDgsOCBAQCBDb21wdXRlWGlkSG9yaXpvbnMoQ29tcHV0ZVhpZEhvcml6b25zUmVzdWx0 ICpoKQogCQkJCQkJCQkJCSBoLT5zaGFyZWRfb2xkZXN0X25vbnJlbW92YWJsZSkpOwogCUFzc2Vy dChUcmFuc2FjdGlvbklkUHJlY2VkZXNPckVxdWFscyhoLT5zaGFyZWRfb2xkZXN0X25vbnJlbW92 YWJsZSwKIAkJCQkJCQkJCQkgaC0+ZGF0YV9vbGRlc3Rfbm9ucmVtb3ZhYmxlKSk7CisJQXNzZXJ0 KFRyYW5zYWN0aW9uSWRQcmVjZWRlc09yRXF1YWxzKGgtPnNoYXJlZF9vbGRlc3Rfbm9ucmVtb3Zh YmxlLAorCQkJCQkJCQkJCSBoLT5jcmVhdGVfaW5kZXhfY29uY3VycmVudGx5X29sZGVzdF9ub25y ZW1vdmFibGUpKTsKIAogCS8qCiAJICogQ2hlY2sgd2hldGhlciB0aGVyZSBhcmUgcmVwbGljYXRp b24gc2xvdHMgcmVxdWlyaW5nIGFuIG9sZGVyIHhtaW4uCkBAIC0xODg4LDYgKzE5MTgsOCBAQCBD b21wdXRlWGlkSG9yaXpvbnMoQ29tcHV0ZVhpZEhvcml6b25zUmVzdWx0ICpoKQogCQlUcmFuc2Fj dGlvbklkT2xkZXIoaC0+c2hhcmVkX29sZGVzdF9ub25yZW1vdmFibGUsIGgtPnNsb3RfeG1pbik7 CiAJaC0+ZGF0YV9vbGRlc3Rfbm9ucmVtb3ZhYmxlID0KIAkJVHJhbnNhY3Rpb25JZE9sZGVyKGgt PmRhdGFfb2xkZXN0X25vbnJlbW92YWJsZSwgaC0+c2xvdF94bWluKTsKKwloLT5jcmVhdGVfaW5k ZXhfY29uY3VycmVudGx5X29sZGVzdF9ub25yZW1vdmFibGUgPQorCQkJVHJhbnNhY3Rpb25JZE9s ZGVyKGgtPmNyZWF0ZV9pbmRleF9jb25jdXJyZW50bHlfb2xkZXN0X25vbnJlbW92YWJsZSwgaC0+ c2xvdF94bWluKTsKIAogCS8qCiAJICogVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIGNhdGFs b2cgLyBkYXRhIGhvcml6b25zIGlzIHRoYXQgdGhlIHNsb3QncwpAQCAtMTkwMCw3ICsxOTMyLDkg QEAgQ29tcHV0ZVhpZEhvcml6b25zKENvbXB1dGVYaWRIb3Jpem9uc1Jlc3VsdCAqaCkKIAloLT5z aGFyZWRfb2xkZXN0X25vbnJlbW92YWJsZSA9CiAJCVRyYW5zYWN0aW9uSWRPbGRlcihoLT5zaGFy ZWRfb2xkZXN0X25vbnJlbW92YWJsZSwKIAkJCQkJCSAgIGgtPnNsb3RfY2F0YWxvZ194bWluKTsK LQloLT5jYXRhbG9nX29sZGVzdF9ub25yZW1vdmFibGUgPSBoLT5kYXRhX29sZGVzdF9ub25yZW1v dmFibGU7CisJaC0+Y2F0YWxvZ19vbGRlc3Rfbm9ucmVtb3ZhYmxlID0KKwkJVHJhbnNhY3Rpb25J ZE9sZGVyKGgtPmNhdGFsb2dfb2xkZXN0X25vbnJlbW92YWJsZSwKKwkJCQkJCSAgIGgtPnNsb3Rf eG1pbik7CiAJaC0+Y2F0YWxvZ19vbGRlc3Rfbm9ucmVtb3ZhYmxlID0KIAkJVHJhbnNhY3Rpb25J ZE9sZGVyKGgtPmNhdGFsb2dfb2xkZXN0X25vbnJlbW92YWJsZSwKIAkJCQkJCSAgIGgtPnNsb3Rf Y2F0YWxvZ194bWluKTsKQEAgLTE5MTgsNiArMTk1Miw5IEBAIENvbXB1dGVYaWRIb3Jpem9ucyhD b21wdXRlWGlkSG9yaXpvbnNSZXN1bHQgKmgpCiAJaC0+b2xkZXN0X2NvbnNpZGVyZWRfcnVubmlu ZyA9CiAJCVRyYW5zYWN0aW9uSWRPbGRlcihoLT5vbGRlc3RfY29uc2lkZXJlZF9ydW5uaW5nLAog CQkJCQkJICAgaC0+ZGF0YV9vbGRlc3Rfbm9ucmVtb3ZhYmxlKTsKKwloLT5vbGRlc3RfY29uc2lk ZXJlZF9ydW5uaW5nID0KKwkJCVRyYW5zYWN0aW9uSWRPbGRlcihoLT5vbGRlc3RfY29uc2lkZXJl ZF9ydW5uaW5nLAorCQkJCQkJCSAgIGgtPmNyZWF0ZV9pbmRleF9jb25jdXJyZW50bHlfb2xkZXN0 X25vbnJlbW92YWJsZSk7CiAKIAkvKgogCSAqIHNoYXJlZCBob3Jpem9ucyBoYXZlIHRvIGJlIGF0 IGxlYXN0IGFzIG9sZCBhcyB0aGUgb2xkZXN0IHZpc2libGUgaW4KQEAgLTE5MjUsNiArMTk2Miw4 IEBAIENvbXB1dGVYaWRIb3Jpem9ucyhDb21wdXRlWGlkSG9yaXpvbnNSZXN1bHQgKmgpCiAJICov CiAJQXNzZXJ0KFRyYW5zYWN0aW9uSWRQcmVjZWRlc09yRXF1YWxzKGgtPnNoYXJlZF9vbGRlc3Rf bm9ucmVtb3ZhYmxlLAogCQkJCQkJCQkJCSBoLT5kYXRhX29sZGVzdF9ub25yZW1vdmFibGUpKTsK KwlBc3NlcnQoVHJhbnNhY3Rpb25JZFByZWNlZGVzT3JFcXVhbHMoaC0+c2hhcmVkX29sZGVzdF9u b25yZW1vdmFibGUsCisJCQkJCQkJCQkJIGgtPmNyZWF0ZV9pbmRleF9jb25jdXJyZW50bHlfb2xk ZXN0X25vbnJlbW92YWJsZSkpOwogCUFzc2VydChUcmFuc2FjdGlvbklkUHJlY2VkZXNPckVxdWFs cyhoLT5zaGFyZWRfb2xkZXN0X25vbnJlbW92YWJsZSwKIAkJCQkJCQkJCQkgaC0+Y2F0YWxvZ19v bGRlc3Rfbm9ucmVtb3ZhYmxlKSk7CiAKQEAgLTE5MzgsNiArMTk3Nyw4IEBAIENvbXB1dGVYaWRI b3Jpem9ucyhDb21wdXRlWGlkSG9yaXpvbnNSZXN1bHQgKmgpCiAJCQkJCQkJCQkJIGgtPmNhdGFs b2dfb2xkZXN0X25vbnJlbW92YWJsZSkpOwogCUFzc2VydChUcmFuc2FjdGlvbklkUHJlY2VkZXNP ckVxdWFscyhoLT5vbGRlc3RfY29uc2lkZXJlZF9ydW5uaW5nLAogCQkJCQkJCQkJCSBoLT5kYXRh X29sZGVzdF9ub25yZW1vdmFibGUpKTsKKwlBc3NlcnQoVHJhbnNhY3Rpb25JZFByZWNlZGVzT3JF cXVhbHMoaC0+b2xkZXN0X2NvbnNpZGVyZWRfcnVubmluZywKKwkJCQkJCQkJCQkgaC0+Y3JlYXRl X2luZGV4X2NvbmN1cnJlbnRseV9vbGRlc3Rfbm9ucmVtb3ZhYmxlKSk7CiAJQXNzZXJ0KFRyYW5z YWN0aW9uSWRQcmVjZWRlc09yRXF1YWxzKGgtPm9sZGVzdF9jb25zaWRlcmVkX3J1bm5pbmcsCiAJ CQkJCQkJCQkJIGgtPnRlbXBfb2xkZXN0X25vbnJlbW92YWJsZSkpOwogCUFzc2VydCghVHJhbnNh Y3Rpb25JZElzVmFsaWQoaC0+c2xvdF94bWluKSB8fApAQCAtMTk3Miw2ICsyMDEzLDggQEAgR2xv YmFsVmlzSG9yaXpvbktpbmRGb3JSZWwoUmVsYXRpb24gcmVsKQogCWVsc2UgaWYgKElzQ2F0YWxv Z1JlbGF0aW9uKHJlbCkgfHwKIAkJCSBSZWxhdGlvbklzQWNjZXNzaWJsZUluTG9naWNhbERlY29k aW5nKHJlbCkpCiAJCXJldHVybiBWSVNIT1JJWk9OX0NBVEFMT0c7CisJZWxzZSBpZiAocmVsICE9 IE5VTEwgJiYgKChyZWwtPnJkX2luZGV4dmFsaWQgJiYgcmVsLT5yZF9pbmRleGlzYnVpbGRpbmcp IHx8IElzVG9hc3RSZWxhdGlvbihyZWwpKSkKKwkJcmV0dXJuIFZJU0hPUklaT05fQlVJTERfSU5E RVhfQ09OQ1VSUkVOVExZOwogCWVsc2UgaWYgKCFSRUxBVElPTl9JU19MT0NBTChyZWwpKQogCQly ZXR1cm4gVklTSE9SSVpPTl9EQVRBOwogCWVsc2UKQEAgLTIwMDQsNiArMjA0Nyw4IEBAIEdldE9s ZGVzdE5vblJlbW92YWJsZVRyYW5zYWN0aW9uSWQoUmVsYXRpb24gcmVsKQogCQkJcmV0dXJuIGhv cml6b25zLmNhdGFsb2dfb2xkZXN0X25vbnJlbW92YWJsZTsKIAkJY2FzZSBWSVNIT1JJWk9OX0RB VEE6CiAJCQlyZXR1cm4gaG9yaXpvbnMuZGF0YV9vbGRlc3Rfbm9ucmVtb3ZhYmxlOworCQljYXNl IFZJU0hPUklaT05fQlVJTERfSU5ERVhfQ09OQ1VSUkVOVExZOgorCQkJcmV0dXJuIGhvcml6b25z LmNyZWF0ZV9pbmRleF9jb25jdXJyZW50bHlfb2xkZXN0X25vbnJlbW92YWJsZTsKIAkJY2FzZSBW SVNIT1JJWk9OX1RFTVA6CiAJCQlyZXR1cm4gaG9yaXpvbnMudGVtcF9vbGRlc3Rfbm9ucmVtb3Zh YmxlOwogCX0KQEAgLTI0NTQsNiArMjQ5OSw5IEBAIEdldFNuYXBzaG90RGF0YShTbmFwc2hvdCBz bmFwc2hvdCkKIAkJR2xvYmFsVmlzRGF0YVJlbHMuZGVmaW5pdGVseV9uZWVkZWQgPQogCQkJRnVs bFRyYW5zYWN0aW9uSWROZXdlcihkZWZfdmlzX2Z4aWRfZGF0YSwKIAkJCQkJCQkJICAgR2xvYmFs VmlzRGF0YVJlbHMuZGVmaW5pdGVseV9uZWVkZWQpOworCQlHbG9iYWxWaXNCdWlsZEluZGV4Q29u Y3VycmVudGx5UmVscy5kZWZpbml0ZWx5X25lZWRlZCA9CisJCQkJRnVsbFRyYW5zYWN0aW9uSWRO ZXdlcihkZWZfdmlzX2Z4aWRfZGF0YSwKKwkJCQkJCQkJCSAgIEdsb2JhbFZpc0J1aWxkSW5kZXhD b25jdXJyZW50bHlSZWxzLmRlZmluaXRlbHlfbmVlZGVkKTsKIAkJLyogU2VlIHRlbXBfb2xkZXN0 X25vbnJlbW92YWJsZSBjb21wdXRhdGlvbiBpbiBDb21wdXRlWGlkSG9yaXpvbnMoKSAqLwogCQlp ZiAoVHJhbnNhY3Rpb25JZElzTm9ybWFsKG15eGlkKSkKIAkJCUdsb2JhbFZpc1RlbXBSZWxzLmRl ZmluaXRlbHlfbmVlZGVkID0KQEAgLTI0NzgsNiArMjUyNiw5IEBAIEdldFNuYXBzaG90RGF0YShT bmFwc2hvdCBzbmFwc2hvdCkKIAkJR2xvYmFsVmlzQ2F0YWxvZ1JlbHMubWF5YmVfbmVlZGVkID0K IAkJCUZ1bGxUcmFuc2FjdGlvbklkTmV3ZXIoR2xvYmFsVmlzQ2F0YWxvZ1JlbHMubWF5YmVfbmVl ZGVkLAogCQkJCQkJCQkgICBvbGRlc3RmeGlkKTsKKwkJR2xvYmFsVmlzQnVpbGRJbmRleENvbmN1 cnJlbnRseVJlbHMubWF5YmVfbmVlZGVkID0KKwkJCQlGdWxsVHJhbnNhY3Rpb25JZE5ld2VyKEds b2JhbFZpc0J1aWxkSW5kZXhDb25jdXJyZW50bHlSZWxzLm1heWJlX25lZWRlZCwKKwkJCQkJCQkJ CSAgIG9sZGVzdGZ4aWQpOwogCQlHbG9iYWxWaXNEYXRhUmVscy5tYXliZV9uZWVkZWQgPQogCQkJ RnVsbFRyYW5zYWN0aW9uSWROZXdlcihHbG9iYWxWaXNEYXRhUmVscy5tYXliZV9uZWVkZWQsCiAJ CQkJCQkJCSAgIG9sZGVzdGZ4aWQpOwpAQCAtNDEwNiw2ICs0MTU3LDkgQEAgR2xvYmFsVmlzVGVz dEZvcihSZWxhdGlvbiByZWwpCiAJCWNhc2UgVklTSE9SSVpPTl9EQVRBOgogCQkJc3RhdGUgPSAm R2xvYmFsVmlzRGF0YVJlbHM7CiAJCQlicmVhazsKKwkJY2FzZSBWSVNIT1JJWk9OX0JVSUxEX0lO REVYX0NPTkNVUlJFTlRMWToKKwkJCXN0YXRlID0gJkdsb2JhbFZpc0J1aWxkSW5kZXhDb25jdXJy ZW50bHlSZWxzOworCQkJYnJlYWs7CiAJCWNhc2UgVklTSE9SSVpPTl9URU1QOgogCQkJc3RhdGUg PSAmR2xvYmFsVmlzVGVtcFJlbHM7CiAJCQlicmVhazsKQEAgLTQxNTgsNiArNDIxMiw5IEBAIEds b2JhbFZpc1VwZGF0ZUFwcGx5KENvbXB1dGVYaWRIb3Jpem9uc1Jlc3VsdCAqaG9yaXpvbnMpCiAJ R2xvYmFsVmlzRGF0YVJlbHMubWF5YmVfbmVlZGVkID0KIAkJRnVsbFhpZFJlbGF0aXZlVG8oaG9y aXpvbnMtPmxhdGVzdF9jb21wbGV0ZWQsCiAJCQkJCQkgIGhvcml6b25zLT5kYXRhX29sZGVzdF9u b25yZW1vdmFibGUpOworCUdsb2JhbFZpc0J1aWxkSW5kZXhDb25jdXJyZW50bHlSZWxzLm1heWJl X25lZWRlZCA9CisJCQlGdWxsWGlkUmVsYXRpdmVUbyhob3Jpem9ucy0+bGF0ZXN0X2NvbXBsZXRl ZCwKKwkJCQkJCQkgIGhvcml6b25zLT5jcmVhdGVfaW5kZXhfY29uY3VycmVudGx5X29sZGVzdF9u b25yZW1vdmFibGUpOwogCUdsb2JhbFZpc1RlbXBSZWxzLm1heWJlX25lZWRlZCA9CiAJCUZ1bGxY aWRSZWxhdGl2ZVRvKGhvcml6b25zLT5sYXRlc3RfY29tcGxldGVkLAogCQkJCQkJICBob3Jpem9u cy0+dGVtcF9vbGRlc3Rfbm9ucmVtb3ZhYmxlKTsKQEAgLTQxNzYsNiArNDIzMyw5IEBAIEdsb2Jh bFZpc1VwZGF0ZUFwcGx5KENvbXB1dGVYaWRIb3Jpem9uc1Jlc3VsdCAqaG9yaXpvbnMpCiAJR2xv YmFsVmlzRGF0YVJlbHMuZGVmaW5pdGVseV9uZWVkZWQgPQogCQlGdWxsVHJhbnNhY3Rpb25JZE5l d2VyKEdsb2JhbFZpc0RhdGFSZWxzLm1heWJlX25lZWRlZCwKIAkJCQkJCQkgICBHbG9iYWxWaXNE YXRhUmVscy5kZWZpbml0ZWx5X25lZWRlZCk7CisJR2xvYmFsVmlzQnVpbGRJbmRleENvbmN1cnJl bnRseVJlbHMuZGVmaW5pdGVseV9uZWVkZWQgPQorCQkJRnVsbFRyYW5zYWN0aW9uSWROZXdlcihH bG9iYWxWaXNCdWlsZEluZGV4Q29uY3VycmVudGx5UmVscy5tYXliZV9uZWVkZWQsCisJCQkJCQkJ CSAgIEdsb2JhbFZpc0J1aWxkSW5kZXhDb25jdXJyZW50bHlSZWxzLmRlZmluaXRlbHlfbmVlZGVk KTsKIAlHbG9iYWxWaXNUZW1wUmVscy5kZWZpbml0ZWx5X25lZWRlZCA9IEdsb2JhbFZpc1RlbXBS ZWxzLm1heWJlX25lZWRlZDsKIAogCUNvbXB1dGVYaWRIb3Jpem9uc1Jlc3VsdExhc3RYbWluID0g UmVjZW50WG1pbjsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2NhY2hlL3JlbGNhY2hl LmMgYi9zcmMvYmFja2VuZC91dGlscy9jYWNoZS9yZWxjYWNoZS5jCmluZGV4IDI2MmM5ODc4ZGQu LjY3N2JhNjEyMDUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2NhY2hlL3JlbGNhY2hl LmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvY2FjaGUvcmVsY2FjaGUuYwpAQCAtNDc2OSw2ICs0 NzY5LDcgQEAgUmVsYXRpb25HZXRJbmRleExpc3QoUmVsYXRpb24gcmVsYXRpb24pCiAJT2lkCQkJ cGtleUluZGV4ID0gSW52YWxpZE9pZDsKIAlPaWQJCQljYW5kaWRhdGVJbmRleCA9IEludmFsaWRP aWQ7CiAJYm9vbAkJcGtkZWZlcnJhYmxlID0gZmFsc2U7CisJYm9vbCAJCWluZGV4aXNidWlsZGlu ZyA9IGZhbHNlOwogCU1lbW9yeUNvbnRleHQgb2xkY3h0OwogCiAJLyogUXVpY2sgZXhpdCBpZiB3 ZSBhbHJlYWR5IGNvbXB1dGVkIHRoZSBsaXN0LiAqLwpAQCAtNDgwOSw2ICs0ODEwLDEwIEBAIFJl bGF0aW9uR2V0SW5kZXhMaXN0KFJlbGF0aW9uIHJlbGF0aW9uKQogCQkvKiBhZGQgaW5kZXgncyBP SUQgdG8gcmVzdWx0IGxpc3QgKi8KIAkJcmVzdWx0ID0gbGFwcGVuZF9vaWQocmVzdWx0LCBpbmRl eC0+aW5kZXhyZWxpZCk7CiAKKwkJLyogY29uc2lkZXIgaW5kZXggYXMgYnVpbGRpbmcgaWYgaXQg aXMgcmVhZHkgYnV0IG5vdCB5ZXQgdmFsaWQgKi8KKwkJaWYgKGluZGV4LT5pbmRpc3JlYWR5ICYm ICFpbmRleC0+aW5kaXN2YWxpZCkKKwkJCWluZGV4aXNidWlsZGluZyA9IHRydWU7CisKIAkJLyoK IAkJICogTm9uLXVuaXF1ZSBvciBwcmVkaWNhdGUgaW5kZXhlcyBhcmVuJ3QgaW50ZXJlc3Rpbmcg Zm9yIGVpdGhlciBvaWQKIAkJICogaW5kZXhlcyBvciByZXBsaWNhdGlvbiBpZGVudGl0eSBpbmRl eGVzLCBzbyBkb24ndCBjaGVjayB0aGVtLgpAQCAtNDg2OSw2ICs0ODc0LDcgQEAgUmVsYXRpb25H ZXRJbmRleExpc3QoUmVsYXRpb24gcmVsYXRpb24pCiAJcmVsYXRpb24tPnJkX2luZGV4bGlzdCA9 IGxpc3RfY29weShyZXN1bHQpOwogCXJlbGF0aW9uLT5yZF9wa2luZGV4ID0gcGtleUluZGV4Owog CXJlbGF0aW9uLT5yZF9pc3BrZGVmZXJyYWJsZSA9IHBrZGVmZXJyYWJsZTsKKwlyZWxhdGlvbi0+ cmRfaW5kZXhpc2J1aWxkaW5nID0gaW5kZXhpc2J1aWxkaW5nOwogCWlmIChyZXBsaWRlbnQgPT0g UkVQTElDQV9JREVOVElUWV9ERUZBVUxUICYmIE9pZElzVmFsaWQocGtleUluZGV4KSAmJiAhcGtk ZWZlcnJhYmxlKQogCQlyZWxhdGlvbi0+cmRfcmVwbGlkaW5kZXggPSBwa2V5SW5kZXg7CiAJZWxz ZSBpZiAocmVwbGlkZW50ID09IFJFUExJQ0FfSURFTlRJVFlfSU5ERVggJiYgT2lkSXNWYWxpZChj YW5kaWRhdGVJbmRleCkpCmRpZmYgLS1naXQgYS9zcmMvYmluL3BnX2FtY2hlY2svdC8wMDZfY29u Y3VycmVudGx5LnBsIGIvc3JjL2Jpbi9wZ19hbWNoZWNrL3QvMDA2X2NvbmN1cnJlbnRseS5wbApu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi43YjhhZmVlYWQ1Ci0tLSAvZGV2 L251bGwKKysrIGIvc3JjL2Jpbi9wZ19hbWNoZWNrL3QvMDA2X2NvbmN1cnJlbnRseS5wbApAQCAt MCwwICsxLDE1NSBAQAorCisjIENvcHlyaWdodCAoYykgMjAyNCwgUG9zdGdyZVNRTCBHbG9iYWwg RGV2ZWxvcG1lbnQgR3JvdXAKKworIyBUZXN0IFJFSU5ERVggQ09OQ1VSUkVOVExZIHdpdGggY29u Y3VycmVudCBtb2RpZmljYXRpb25zIGFuZCBIT1QgdXBkYXRlcwordXNlIHN0cmljdDsKK3VzZSB3 YXJuaW5nczsKKwordXNlIENvbmZpZzsKK3VzZSBFcnJubzsKKwordXNlIFBvc3RncmVTUUw6OlRl c3Q6OkNsdXN0ZXI7Cit1c2UgUG9zdGdyZVNRTDo6VGVzdDo6VXRpbHM7Cit1c2UgVGltZTo6SGlS ZXMgcXcodXNsZWVwKTsKK3VzZSBJUEM6OlN5c1Y7Cit1c2UgdGhyZWFkczsKK3VzZSBUZXN0OjpN b3JlOwordXNlIFRlc3Q6OkJ1aWxkZXI7CisKK2lmICgkQCB8fCAkd2luZG93c19vcykKK3sKKwlw bGFuIHNraXBfYWxsID0+ICdGb3JrIGFuZCBzaGFyZWQgbWVtb3J5IGFyZSBub3Qgc3VwcG9ydGVk IGJ5IHRoaXMgcGxhdGZvcm0nOworfQorCisjIFRPRE86IHJlZmFjdG9yIHRvIGh0dHBzOi8vbWV0 YWNwYW4ub3JnL3BvZC9JUEMlM0ElM0FTaGFyZWFibGUKK215ICgkcGlkLCAkc2htZW1faWQsICRz aG1lbV9rZXksICAkc2htZW1fc2l6ZSk7CitldmFsICdzdWIgSVBDX0NSRUFUIHswMDAxMDAwfScg dW5sZXNzIGRlZmluZWQgJklQQ19DUkVBVDsKKyRzaG1lbV9zaXplID0gNDsKKyRzaG1lbV9rZXkg PSByYW5kKDEwMDAwMDApOworJHNobWVtX2lkID0gc2htZ2V0KCRzaG1lbV9rZXksICRzaG1lbV9z aXplLCAmSVBDX0NSRUFUIHwgMDc3Nykgb3IgZGllICJDYW4ndCBzaG1nZXQ6ICQhIjsKK3NobXdy aXRlKCRzaG1lbV9pZCwgIndhaXQiLCAwLCAkc2htZW1fc2l6ZSkgb3IgZGllICJDYW4ndCBzaG13 cml0ZTogJCEiOworCitteSAkcHNxbF90aW1lb3V0ID0gSVBDOjpSdW46OnRpbWVyKCRQb3N0Z3Jl U1FMOjpUZXN0OjpVdGlsczo6dGltZW91dF9kZWZhdWx0KTsKKyMKKyMgVGVzdCBzZXQtdXAKKyMK K215ICgkbm9kZSwgJHJlc3VsdCk7Ciskbm9kZSA9IFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXIt Pm5ldygnUkNfdGVzdCcpOworJG5vZGUtPmluaXQ7Ciskbm9kZS0+YXBwZW5kX2NvbmYoJ3Bvc3Rn cmVzcWwuY29uZicsCisJJ2xvY2tfdGltZW91dCA9ICcgLiAoMTAwMCAqICRQb3N0Z3JlU1FMOjpU ZXN0OjpVdGlsczo6dGltZW91dF9kZWZhdWx0KSk7Ciskbm9kZS0+YXBwZW5kX2NvbmYoJ3Bvc3Rn cmVzcWwuY29uZicsICdmc3luYyA9IG9mZicpOworJG5vZGUtPnN0YXJ0OworJG5vZGUtPnNhZmVf cHNxbCgncG9zdGdyZXMnLCBxKENSRUFURSBFWFRFTlNJT04gYW1jaGVjaykpOworJG5vZGUtPnNh ZmVfcHNxbCgncG9zdGdyZXMnLCBxKENSRUFURSBUQUJMRSB0YmwoaSBpbnQgcHJpbWFyeSBrZXks CisJCQkJCQkJCWMxIG1vbmV5IGRlZmF1bHQgMCxjMiBtb25leSBkZWZhdWx0IDAsCisJCQkJCQkJ CWMzIG1vbmV5IGRlZmF1bHQgMCwgdXBkYXRlZF9hdCB0aW1lc3RhbXApKSk7Ciskbm9kZS0+c2Fm ZV9wc3FsKCdwb3N0Z3JlcycsIHEoQ1JFQVRFIElOREVYIGlkeCBPTiB0YmwoaSkpKTsKKworbXkg JGJ1aWxkZXIgPSBUZXN0OjpNb3JlLT5idWlsZGVyOworJGJ1aWxkZXItPnVzZV9udW1iZXJzKDAp OworJGJ1aWxkZXItPm5vX3BsYW4oKTsKKworbXkgJGNoaWxkICA9ICRidWlsZGVyLT5jaGlsZCgi cGdfYmVuY2giKTsKKworaWYoIWRlZmluZWQoJHBpZCA9IGZvcmsoKSkpIHsKKwkjIGZvcmsgcmV0 dXJuZWQgdW5kZWYsIHNvIHVuc3VjY2Vzc2Z1bAorCWRpZSAiQ2Fubm90IGZvcmsgYSBjaGlsZDog JCEiOworfSBlbHNpZiAoJHBpZCA9PSAwKSB7CisKKwkkbm9kZS0+cGdiZW5jaCgKKwkJJy0tbm8t dmFjdXVtIC0tY2xpZW50PTUgLS10cmFuc2FjdGlvbnM9MjUwMDAnLAorCQkwLAorCQlbcXJ7YWN0 dWFsbHkgcHJvY2Vzc2VkfV0sCisJCVtxcnteJH1dLAorCQknY29uY3VycmVudCBJTlNFUlRzLCBV UERBVEVTIGFuZCBSQycsCisJCXsKKwkJCScwMDJfcGdiZW5jaF9jb25jdXJyZW50X3RyYW5zYWN0 aW9uX2luc2VydHMnID0+IHEoCisJCQkJQkVHSU47CisJCQkJSU5TRVJUIElOVE8gdGJsIFZBTFVF UyhyYW5kb20oKSoxMDAwMCwwLDAsMCxub3coKSkKKwkJCQkJb24gY29uZmxpY3QoaSkgZG8gdXBk YXRlIHNldCB1cGRhdGVkX2F0ID0gbm93KCk7CisJCQkJSU5TRVJUIElOVE8gdGJsIFZBTFVFUyhy YW5kb20oKSoxMDAwMCwwLDAsMCxub3coKSkKKwkJCQkJb24gY29uZmxpY3QoaSkgZG8gdXBkYXRl IHNldCB1cGRhdGVkX2F0ID0gbm93KCk7CisJCQkJSU5TRVJUIElOVE8gdGJsIFZBTFVFUyhyYW5k b20oKSoxMDAwMCwwLDAsMCxub3coKSkKKwkJCQkJb24gY29uZmxpY3QoaSkgZG8gdXBkYXRlIHNl dCB1cGRhdGVkX2F0ID0gbm93KCk7CisJCQkJSU5TRVJUIElOVE8gdGJsIFZBTFVFUyhyYW5kb20o KSoxMDAwMCwwLDAsMCxub3coKSkKKwkJCQkJb24gY29uZmxpY3QoaSkgZG8gdXBkYXRlIHNldCB1 cGRhdGVkX2F0ID0gbm93KCk7CisKKwkJCQlJTlNFUlQgSU5UTyB0YmwgVkFMVUVTKHJhbmRvbSgp KjEwMDAwLDAsMCwwLG5vdygpKQorCQkJCQlvbiBjb25mbGljdChpKSBkbyB1cGRhdGUgc2V0IHVw ZGF0ZWRfYXQgPSBub3coKTsKKwkJCQlDT01NSVQ7CisJCQkgICksCisJCQkjIEVuc3VyZSBzb21l IEhPVCB1cGRhdGVzIGhhcHBlbgorCQkJJzAwMl9wZ2JlbmNoX2NvbmN1cnJlbnRfdHJhbnNhY3Rp b25fdXBkYXRlcycgPT4gcSgKKwkJCQlCRUdJTjsKKwkJCQlJTlNFUlQgSU5UTyB0YmwgVkFMVUVT KHJhbmRvbSgpKjEwMDAsMCwwLDAsbm93KCkpCisJCQkJCW9uIGNvbmZsaWN0KGkpIGRvIHVwZGF0 ZSBzZXQgdXBkYXRlZF9hdCA9IG5vdygpOworCQkJCUlOU0VSVCBJTlRPIHRibCBWQUxVRVMocmFu ZG9tKCkqMTAwMCwwLDAsMCxub3coKSkKKwkJCQkJb24gY29uZmxpY3QoaSkgZG8gdXBkYXRlIHNl dCB1cGRhdGVkX2F0ID0gbm93KCk7CisJCQkJSU5TRVJUIElOVE8gdGJsIFZBTFVFUyhyYW5kb20o KSoxMDAwLDAsMCwwLG5vdygpKQorCQkJCQlvbiBjb25mbGljdChpKSBkbyB1cGRhdGUgc2V0IHVw ZGF0ZWRfYXQgPSBub3coKTsKKwkJCQlJTlNFUlQgSU5UTyB0YmwgVkFMVUVTKHJhbmRvbSgpKjEw MDAsMCwwLDAsbm93KCkpCisJCQkJCW9uIGNvbmZsaWN0KGkpIGRvIHVwZGF0ZSBzZXQgdXBkYXRl ZF9hdCA9IG5vdygpOworCisJCQkJSU5TRVJUIElOVE8gdGJsIFZBTFVFUyhyYW5kb20oKSoxMDAw LDAsMCwwLG5vdygpKQorCQkJCQlvbiBjb25mbGljdChpKSBkbyB1cGRhdGUgc2V0IHVwZGF0ZWRf YXQgPSBub3coKTsKKwkJCQlDT01NSVQ7CisJCQkgICkKKwkJfSk7CisKKwlpZiAoJGNoaWxkLT5p c19wYXNzaW5nKCkpIHsKKwkJc2htd3JpdGUoJHNobWVtX2lkLCAiZG9uZSIsIDAsICRzaG1lbV9z aXplKSBvciBkaWUgIkNhbid0IHNobXdyaXRlOiAkISI7CisJfSBlbHNlIHsKKwkJc2htd3JpdGUo JHNobWVtX2lkLCAiZmFpbCIsIDAsICRzaG1lbV9zaXplKSBvciBkaWUgIkNhbid0IHNobXdyaXRl OiAkISI7CisJfQorCisJc2xlZXAoMSk7Cit9IGVsc2UgeworCW15ICRwZ19iZW5jaF9mb3JrX2Zs YWc7CisJc2htcmVhZCgkc2htZW1faWQsICRwZ19iZW5jaF9mb3JrX2ZsYWcsIDAsICRzaG1lbV9z aXplKSBvciBkaWUgIkNhbid0IHNobXJlYWQ6ICQhIjsKKworCXN1YnRlc3QgJ3JlaW5kZXggcnVu IHN1YnRlc3QnID0+IHN1YiB7CisJCWlzKCRwZ19iZW5jaF9mb3JrX2ZsYWcsICJ3YWl0IiwgInBn X2JlbmNoX2ZvcmtfZmxhZyBpcyBjb3JyZWN0Iik7CisKKwkJbXkgJXBzcWwgPSAoc3RkaW4gPT4g JycsIHN0ZG91dCA9PiAnJywgc3RkZXJyID0+ICcnKTsKKwkJJHBzcWx7cnVufSA9IElQQzo6UnVu OjpzdGFydCgKKwkJCVsgJ3BzcWwnLCAnLVhBJywgJy1mJywgJy0nLCAnLWQnLCAkbm9kZS0+Y29u bnN0cigncG9zdGdyZXMnKSBdLAorCQkJJzwnLAorCQkJXCRwc3Fse3N0ZGlufSwKKwkJCSc+JywK KwkJCVwkcHNxbHtzdGRvdXR9LAorCQkJJzI+JywKKwkJCVwkcHNxbHtzdGRlcnJ9LAorCQkJJHBz cWxfdGltZW91dCk7CisKKwkJbXkgKCRyZXN1bHQsICRzdGRvdXQsICRzdGRlcnIpOworCQl3aGls ZSAoMSkKKwkJeworCisJCQkoJHJlc3VsdCwgJHN0ZG91dCwgJHN0ZGVycikgPSAkbm9kZS0+cHNx bCgncG9zdGdyZXMnLCBxKFJFSU5ERVggSU5ERVggQ09OQ1VSUkVOVExZIGlkeDspKTsKKwkJCWlz KCRyZXN1bHQsICcwJywgJ1JFSU5ERVggaXMgY29ycmVjdCcpOworCisJCQkoJHJlc3VsdCwgJHN0 ZG91dCwgJHN0ZGVycikgPSAkbm9kZS0+cHNxbCgncG9zdGdyZXMnLCBxKFNFTEVDVCBidF9pbmRl eF9wYXJlbnRfY2hlY2soJ2lkeCcsIHRydWUsIHRydWUpOykpOworCQkJaXMoJHJlc3VsdCwgJzAn LCAnYnRfaW5kZXhfY2hlY2sgaXMgY29ycmVjdCcpOworIAkJCWlmICgkcmVzdWx0KQorIAkJCXsK KwkJCQlkaWFnKCRzdGRlcnIpOworIAkJCX0KKworCQkJc2htcmVhZCgkc2htZW1faWQsICRwZ19i ZW5jaF9mb3JrX2ZsYWcsIDAsICRzaG1lbV9zaXplKSBvciBkaWUgIkNhbid0IHNobXJlYWQ6ICQh IjsKKwkJCWxhc3QgaWYgJHBnX2JlbmNoX2ZvcmtfZmxhZyBuZSAid2FpdCI7CisJCX0KKworCQkj IGV4cGxpY2l0bHkgc2h1dCBkb3duIHBzcWwgaW5zdGFuY2VzIGdyYWNlZnVsbHkKKyAgICAgICAg JHBzcWx7c3RkaW59IC49ICJcXHFcbiI7CisgICAgICAgICRwc3Fse3J1bn0tPmZpbmlzaDsKKwor CQlpcygkcGdfYmVuY2hfZm9ya19mbGFnLCAiZG9uZSIsICJwZ19iZW5jaF9mb3JrX2ZsYWcgaXMg Y29ycmVjdCIpOworCX07CisKKworCSRjaGlsZC0+ZmluYWxpemUoKTsKKwkkY2hpbGQtPnN1bW1h cnkoKTsKKwkkbm9kZS0+c3RvcDsKKwlkb25lX3Rlc3RpbmcoKTsKK30KZGlmZiAtLWdpdCBhL3Ny Yy9pbmNsdWRlL3V0aWxzL3JlbC5oIGIvc3JjL2luY2x1ZGUvdXRpbHMvcmVsLmgKaW5kZXggODcw MDIwNDk1My4uYTllMmQxYmVhYiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvdXRpbHMvcmVsLmgK KysrIGIvc3JjL2luY2x1ZGUvdXRpbHMvcmVsLmgKQEAgLTE1Miw2ICsxNTIsNyBAQCB0eXBlZGVm IHN0cnVjdCBSZWxhdGlvbkRhdGEKIAlMaXN0CSAgICpyZF9pbmRleGxpc3Q7CS8qIGxpc3Qgb2Yg T0lEcyBvZiBpbmRleGVzIG9uIHJlbGF0aW9uICovCiAJT2lkCQkJcmRfcGtpbmRleDsJCS8qIE9J RCBvZiAoZGVmZXJyYWJsZT8pIHByaW1hcnkga2V5LCBpZiBhbnkgKi8KIAlib29sCQlyZF9pc3Br ZGVmZXJyYWJsZTsJLyogaXMgcmRfcGtpbmRleCBhIGRlZmVycmFibGUgUEs/ICovCisJYm9vbAkJ cmRfaW5kZXhpc2J1aWxkaW5nOyAvKiBpcyBpbmRleCBidWlsZGluZyBpbiBwcm9ncmVzcyBmb3Ig cmVsYXRpb24gKi8KIAlPaWQJCQlyZF9yZXBsaWRpbmRleDsgLyogT0lEIG9mIHJlcGxpY2EgaWRl bnRpdHkgaW5kZXgsIGlmIGFueSAqLwogCiAJLyogZGF0YSBtYW5hZ2VkIGJ5IFJlbGF0aW9uR2V0 U3RhdEV4dExpc3Q6ICovCi0tIAoyLjM0LjEKCg== --000000000000da3a570617bd6f87--