Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oq2v5-0005iI-Er for pgsql-hackers@arkaria.postgresql.org; Wed, 02 Nov 2022 01:51:56 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1oq2u4-00022R-Ts for pgsql-hackers@arkaria.postgresql.org; Wed, 02 Nov 2022 01:50:52 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oq2u4-00022I-4Q for pgsql-hackers@lists.postgresql.org; Wed, 02 Nov 2022 01:50:52 +0000 Received: from mxout.index.de ([185.11.139.159]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oq2tv-0002qc-KY for pgsql-hackers@postgresql.org; Wed, 02 Nov 2022 01:50:51 +0000 Received: from remote.index.de (unknown [217.110.204.106]) by mxout.index.de (Postfix) with ESMTP id E85E45FED9; Wed, 2 Nov 2022 01:50:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=index.de; s=dkim; t=1667353840; bh=hY/naISe78IH7sLm5z3Rz9uz155nODiB0Ca2HexKW60=; h=From:To:CC:Subject:Date:References:In-Reply-To:From; b=V6ROBdyFpwBQsPSLyeEFColfW84cphrIZJSpd3KUihXGNMsDJCWaK8hrqZQj8B2hz 1zNPLWW6Hgq2F8TWeKXGqdejFApzqLJPRPxHMA+TiO1yxDm9oGXhjWTDMq1fQLgSW7 iIfpkfjruSZLVGBHGXZMpRwO9m9L7Leouu12qft6PvlNmEvYheCn1MXHDJSQKtc2Bf Ga8GwWxlhsbPbDh6fSdSacgVEjEZoW0CKfYANEAjFUTrH/s3CN7i9vmAc2uWZWlA/Q kTOLMGE7QmUI3WEjJbMR1X55ycS/w2ky+dWXziPAspZZLwMsm4bzQHx/fAqA+AynNs HsCGpCTGA33FA== Received: from acedia.index-gruppe.local (192.168.54.121) by invidia.index-gruppe.local (192.168.54.140) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.13; Wed, 2 Nov 2022 02:50:39 +0100 Received: from acedia.index-gruppe.local (192.168.54.121) by acedia.index-gruppe.local (192.168.54.121) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.13; Wed, 2 Nov 2022 02:50:39 +0100 Received: from acedia.index-gruppe.local ([fe80::f147:cf9d:2d7e:efad]) by acedia.index-gruppe.local ([fe80::f147:cf9d:2d7e:efad%13]) with mapi id 15.01.2507.013; Wed, 2 Nov 2022 02:50:38 +0100 From: Arne Roland To: David Rowley CC: Amit Langote , pgsql-hackers , Zhihong Yu , Alvaro Herrera , Julien Rouhaud Subject: Re: missing indexes in indexlist with partitioned tables Thread-Topic: missing indexes in indexlist with partitioned tables Thread-Index: AQHXsJoeXw6ojQG4NkOLdiX4KUBdD6vkTOpcgIAWJQCAA2SO7oAAbRh////16wCAADDYxYAAo/oAgABsDQCAAiIn7oAADRXl///25gCAAD4kxoAIQqeAgAnMh4CBIEebGIBFWqsAgAZz6YCAABQ2gIAAAgsAgAO9bJmAEBeNgIAFtfYr Date: Wed, 2 Nov 2022 01:50:38 +0000 Message-ID: <99fad49d2cd341f38bcbf62e495eb510@index.de> References: <20220118065750.v5zigpuisljc6jmk@jrouhaud> <202201181324.idvthmrhbtf5@alvherre.pgsql>, In-Reply-To: Accept-Language: en-US, de-DE Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-originating-ip: [89.247.174.44] Content-Type: multipart/mixed; boundary="_004_99fad49d2cd341f38bcbf62e495eb510indexde_" MIME-Version: 1.0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --_004_99fad49d2cd341f38bcbf62e495eb510indexde_ Content-Type: multipart/alternative; boundary="_000_99fad49d2cd341f38bcbf62e495eb510indexde_" --_000_99fad49d2cd341f38bcbf62e495eb510indexde_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi! I mainly changed the comments, the Assert and some casing. > From: David Rowley > Sent: Monday, October 3, 2022 00:51 > > * In the header comment in get_relation_info(), I don't think we need > to mention join removals explicitly. At a stretch, maybe mentioning > "unique proofs" might be ok, but "various optimizations" might be > better. If you mention "join removal", I fear that will just become > outdated too quickly as further optimisations are added. Likewise for > the comment about "join pruning" you've added in the function body. > FWIW, we call these "join removals" anyway. I made them a little bit more vague. I also updated the description of inde= xlist in general. > * I think we should put RelationGetNumberOfBlocks() back to what it > was and just ensure we don't call that for partitioned indexes in > get_relation_info(). (Yes, I know that was my change) I don't think it's relevant who did it. I don't see much importance either = way. I reverted it to the old state. > * I can't quite figure out why you're doing "DROP TABLE a CASCADE;" in > inherits.sql. You've not changed anything else in that file. Did you > mean to do this in join.sql? The problem I encountered, was that simple copy of the test wasn't possible= , because the tables were named the same way. It seemed intuitive to me to = make the tests , such that there are no side-effects. I added a comment to = the creation of those tables to make clear, that there are intended side ef= fects by not dropping those tables. > * The new test in join.sql. I understand that you've mostly copied the > test from another place in the file and adjusted it to use a > partitioned table. However, I don't really think you need to INSERT > any data into those tables. I also think that using the table name of > "a" is dangerous as it could conflict with another table by the same > name in a parallel run of the tests. The non-partitioned version is a > TEMP table. Also, it's slightly painful to look at the inconsistent > capitalisation of SQL keywords in those queries you've added, again, I > understand those are copied from above, but I see no need to duplicate > the inconsistencies. Perhaps it's fine to copy the upper case > keywords in the DDL and keep all lowercase in the queries. Also, I > think you probably should just add a single simple join removal test > for partitioned tables. You're not exercising any code that the > non-partitioned case isn't by adding any additional tests. All that I > think is worth testing here is ensuring nobody thinks that partitioned > tables can get away with an empty indexlist again. I am not sure, how thorough the tests on partitioned tables need to be. I g= uess, I will turn up more issues in production, than any test will be able = to cover. As a general sentiment, I wouldn't agree. The empty indexlist isn't the onl= y interesting thing to test. The more we add optimizations, the more non tr= ivial intersections of those start to break things again, we have fixed. A = notable part of the complexity of the optimizer stems from the fact, that w= e apply most transformations in a fixed order. We obviously have to do that= for performance reasons. But as long as we have that, we are prone to have= cases where the ordering breaks part. Partitioned tables are a prominent c= ases here, because we always have the appendrel. I removed some test cases here to half the amount of partitioned tables nee= ded here. I don't see the value in having one simple explain less. But I do= not have strong feelings about this. Are there any further opinions? > * I had a bit of a 2nd thought on the test change in > partition_join.sql. I know I added the "c" column so that join > removals didn't apply. I'm now thinking it's probably better to just > change the queries to use JOIN ON rather than JOIN USING. Also, apply > the correct alias to the ORDER BY. This method should save from > slowing the test down due to the additional column. We have some > pretty slow buildfarm machines that this might actually make a > meaningful difference to. There is no real point in changing this, because we can just access the col= umn that is hidden anyways to make the join removal impossible. That is sort of the tick my version v6 was going for. Tbh I don't care much= either way as long as the test still tests for the fractional merge append= . I just switched back. Afaiac creating and dropping a table is sort of the worst thing we can do, = when thinking about tests. There is just so much work involved there. If I = am concerned about test runtimes, I'd try to minimize that. This is even mo= re true regarding tests for partitioned tables. To get a parted table with = two partitions, we always have to create three tables. I do think there is = a lot of potential to speed up the test times with that, but I'd suggest to= handle that in a different thread. > Thanks again for working on this. Thank you for your input! Arne --_000_99fad49d2cd341f38bcbf62e495eb510indexde_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Hi!

I mainly changed the comments, the Assert and some casing.

> From: David Rowley <dgrowleyml@gmail.com>
> Sent: Monday, October 3, 2022 00:51
>
> * In the header comment in get_relation_info(), I don't think we need<= br> > to mention join removals explicitly. At a stretch, maybe mentioning > "unique proofs" might be ok, but "various optimizations= " might be
> better. If you mention "join removal", I fear that will just= become
> outdated too quickly as further optimisations are added.  Likewis= e for
> the comment about "join pruning" you've added in the functio= n body.
> FWIW, we call these "join removals" anyway.

I made them a little bit more vague. I also updated the description of inde= xlist in general.

> * I think we should put RelationGetNumberOfBlocks() back to what it > was and just ensure we don't call that for partitioned indexes in
> get_relation_info(). (Yes, I know that was my change)

I don't think it's relevant who did it. I don't see much importance either = way. I reverted it to the old state.

> * I can't quite figure out why you're doing "DROP TABLE a CASCADE= ;" in
> inherits.sql.  You've not changed anything else in that file. Did= you
> mean to do this in join.sql?

The problem I encountered, was that simple copy of the test wasn't possible= , because the tables were named the same way. It seemed intuitive to me to = make the tests , such that there are no side-effects. I added a comment to = the creation of those tables to make clear, that there are intended side effects by not dropping those tab= les.

> * The new test in join.sql. I understand that you've mostly copied the=
> test from another place in the file and adjusted it to use a
> partitioned table. However, I don't really think you need to INSERT > any data into those tables. I also think that using the table name of<= br> > "a" is dangerous as it could conflict with another table by = the same
> name in a parallel run of the tests.  The non-partitioned version= is a
> TEMP table.  Also, it's slightly painful to look at the inconsist= ent
> capitalisation of SQL keywords in those queries you've added, again, I=
> understand those are copied from above, but I see no need to duplicate=
> the inconsistencies.  Perhaps it's fine to copy the upper case > keywords in the DDL and keep all lowercase in the queries.  Also,= I
> think you probably should just add a single simple join removal test > for partitioned tables.  You're not exercising any code that the<= br> > non-partitioned case isn't by adding any additional tests.  All t= hat I
> think is worth testing here is ensuring nobody thinks that partitioned=
> tables can get away with an empty indexlist again.

I am not sure, how thorough the tests on partitioned tables need to be. I g= uess, I will turn up more issues in production, than any test will be able = to cover.

As a general sentiment, I wouldn't agree. The empty indexlist isn't the onl= y interesting thing to test. The more we add optimizations, the more non tr= ivial intersections of those start to break things again, we have fixed. A = notable part of the complexity of the optimizer stems from the fact, that we apply most transformations in a= fixed order. We obviously have to do that for performance reasons. But as = long as we have that, we are prone to have cases where the ordering breaks = part. Partitioned tables are a prominent cases here, because we always have the appendrel.

I removed some test cases here to half the amount of partitioned table= s needed here. I don't see the value in having one simple explain less. But= I do not have strong feelings about this. Are there any further opinions?<= br>
> * I had a bit of a 2nd thought on the test change in
> partition_join.sql.  I know I added the "c" column so t= hat join
> removals didn't apply. I'm now thinking it's probably better to just > change the queries to use JOIN ON rather than JOIN USING. Also, apply<= br> > the correct alias to the ORDER BY.   This method should save= from
> slowing the test down due to the additional column. We have some
> pretty slow buildfarm machines that this might actually make a
> meaningful difference to.

There is no real point in changing this, because we can just access the col= umn that is hidden anyways to make the join removal impossible.
That is sort of the tick my version v6 was going for. Tbh I don't care much= either way as long as the test still tests for the fractional merge append= . I just switched back.

Afaiac creating and dropping a table is sort of the worst thing we can do, = when thinking about tests. There is just so much work involved there. If I = am concerned about test runtimes, I'd try to minimize that. This is even mo= re true regarding tests for partitioned tables. To get a parted table with two partitions, we always have to creat= e three tables. I do think there is a lot of potential to speed up the test= times with that, but I'd suggest to handle that in a different thread.

> Thanks again for working on this.

Thank you for your input!

Arne

--_000_99fad49d2cd341f38bcbf62e495eb510indexde_-- --_004_99fad49d2cd341f38bcbf62e495eb510indexde_ Content-Type: text/x-patch; name="v9_indexlist_contains_partitioned_indexes-0001-indexlist.patch" Content-Description: v9_indexlist_contains_partitioned_indexes-0001-indexlist.patch Content-Disposition: attachment; filename="v9_indexlist_contains_partitioned_indexes-0001-indexlist.patch"; size=22534; creation-date="Mon, 31 Oct 2022 09:56:38 GMT"; modification-date="Mon, 31 Oct 2022 09:56:38 GMT" Content-Transfer-Encoding: base64 RnJvbSAwZjhmMTNlMWZjYzNjNmM4ZjBjYjgxMjgwMWQyMTU0NzY2NmEyMjI5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBcm5lIDxhcm9AaW5kZXguZGU+CkRhdGU6IE1vbiwgMzEgT2N0 IDIwMjIgMjA6MjQ6MDAgKzAxMDAKU3ViamVjdDogW1BBVENIIHY5X2luZGV4bGlzdF9jb250YWlu c19wYXJ0aXRpb25lZF9pbmRleGVzXSBpbmRleGxpc3QKCi0tLQogc3JjL2JhY2tlbmQvb3B0aW1p emVyL3V0aWwvcGxhbmNhdC5jICAgICAgICAgfCAyMjYgKysrKysrKysrKy0tLS0tLS0tLQogc3Jj L2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMgICAgICAgICAgICAgfCAgIDQgKwogc3JjL2lu Y2x1ZGUvbm9kZXMvcGF0aG5vZGVzLmggICAgICAgICAgICAgICAgfCAgMTEgKy0KIHNyYy90ZXN0 L3JlZ3Jlc3MvZXhwZWN0ZWQvaW5oZXJpdC5vdXQgICAgICAgIHwgICAyICsKIHNyYy90ZXN0L3Jl Z3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQgICAgICAgICAgIHwgIDUyICsrKystCiBzcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL3BhcnRpdGlvbl9qb2luLm91dCB8ICAgNiArLQogc3JjL3Rlc3QvcmVn cmVzcy9zcWwvaW5oZXJpdC5zcWwgICAgICAgICAgICAgfCAgIDQgKwogc3JjL3Rlc3QvcmVncmVz cy9zcWwvam9pbi5zcWwgICAgICAgICAgICAgICAgfCAgMzQgKystCiBzcmMvdGVzdC9yZWdyZXNz L3NxbC9wYXJ0aXRpb25fam9pbi5zcWwgICAgICB8ICAgNiArLQogOSBmaWxlcyBjaGFuZ2VkLCAy MzEgaW5zZXJ0aW9ucygrKSwgMTE0IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNr ZW5kL29wdGltaXplci91dGlsL3BsYW5jYXQuYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci91dGls L3BsYW5jYXQuYwppbmRleCA5ZGVmZTM3ODM2Li5mMjMxYzVhYmJiIDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9wbGFuY2F0LmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1p emVyL3V0aWwvcGxhbmNhdC5jCkBAIC0xMDYsMTAgKzEwNiwxMiBAQCBzdGF0aWMgdm9pZCBzZXRf YmFzZXJlbF9wYXJ0aXRpb25fY29uc3RyYWludChSZWxhdGlvbiByZWxhdGlvbiwKICAqIGNhc2Vz IHRoZXNlIGFyZSBsZWZ0IGFzIHplcm9lcywgYnV0IHNvbWV0aW1lcyB3ZSBuZWVkIHRvIGNvbXB1 dGUgYXR0cgogICogd2lkdGhzIGhlcmUsIGFuZCB3ZSBtYXkgYXMgd2VsbCBjYWNoZSB0aGUgcmVz dWx0cyBmb3IgY29zdHNpemUuYy4KICAqCi0gKiBJZiBpbmhwYXJlbnQgaXMgdHJ1ZSwgYWxsIHdl IG5lZWQgdG8gZG8gaXMgc2V0IHVwIHRoZSBhdHRyIGFycmF5czoKLSAqIHRoZSBSZWxPcHRJbmZv IGFjdHVhbGx5IHJlcHJlc2VudHMgdGhlIGFwcGVuZHJlbCBmb3JtZWQgYnkgYW4gaW5oZXJpdGFu Y2UKLSAqIHRyZWUsIGFuZCBzbyB0aGUgcGFyZW50IHJlbCdzIHBoeXNpY2FsIHNpemUgYW5kIGlu ZGV4IGluZm9ybWF0aW9uIGlzbid0Ci0gKiBpbXBvcnRhbnQgZm9yIGl0LgorICogSWYgaW5ocGFy ZW50IGlzIHRydWUsIHdlIGRvbid0IGNhcmUgYWJvdXQgcGh5c2ljYWwgc2l6ZSwgaW5kZXggYW0K KyAqIGFuZCBlc3RpbWF0ZXMuCisgKiBXZSBzdGlsbCBuZWVkIGluZGV4IHVuaXF1ZW5lc3MgZm9y IGpvaW4gcmVtb3ZhbC4KKyAqIFdoZW4gaXQgY29tZXMgdG8gdGhlIHBhdGgsIHRoZSBSZWxPcHRJ bmZvIGFjdHVhbGx5IHJlcHJlc2VudHMKKyAqIHRoZSBhcHBlbmRyZWwgZm9ybWVkIGJ5IGFuIGlu aGVyaXRhbmNlIHRyZWUsIGFuZCBzbyB0aGUgcGFyZW50CisgKiByZWwncyBwaHlzaWNhbCBzaXpl IGlzbid0IGltcG9ydGFudCBmb3IgaXQuCiAgKi8KIHZvaWQKIGdldF9yZWxhdGlvbl9pbmZvKFBs YW5uZXJJbmZvICpyb290LCBPaWQgcmVsYXRpb25PYmplY3RJZCwgYm9vbCBpbmhwYXJlbnQsCkBA IC0xNzUsMTAgKzE3NywxMiBAQCBnZXRfcmVsYXRpb25faW5mbyhQbGFubmVySW5mbyAqcm9vdCwg T2lkIHJlbGF0aW9uT2JqZWN0SWQsIGJvb2wgaW5ocGFyZW50LAogCiAJLyoKIAkgKiBNYWtlIGxp c3Qgb2YgaW5kZXhlcy4gIElnbm9yZSBpbmRleGVzIG9uIHN5c3RlbSBjYXRhbG9ncyBpZiB0b2xk IHRvLgotCSAqIERvbid0IGJvdGhlciB3aXRoIGluZGV4ZXMgZm9yIGFuIGluaGVyaXRhbmNlIHBh cmVudCwgZWl0aGVyLgorCSAqIERvbid0IGJvdGhlciB3aXRoIGluZGV4ZXMgZnJvbSB0cmFkaXRp b25hbCBpbmhlcml0YW5jZSBwYXJlbnRzLgorCSAqIFdlIGNhcmUgYWJvdXQgcGFydGl0aW9uZWQg aW5kZXhlcyBmb3IgZnVydGhlciBvcHRpbWlzYXRpb25zLCBsaWtlIGpvaW4KKwkgKiByZW1vdmFs LCBldmVuIGlmIHdlIGRvbid0IGhhdmUgYW55IGFtIGZvciB0aGVtLgogCSAqLwotCWlmIChpbmhw YXJlbnQgfHwKLQkJKElnbm9yZVN5c3RlbUluZGV4ZXMgJiYgSXNTeXN0ZW1SZWxhdGlvbihyZWxh dGlvbikpKQorCWlmICgoaW5ocGFyZW50ICYmIHJlbGF0aW9uLT5yZF9yZWwtPnJlbGtpbmQgIT0g UkVMS0lORF9QQVJUSVRJT05FRF9UQUJMRSkKKwkJfHwgKElnbm9yZVN5c3RlbUluZGV4ZXMgJiYg SXNTeXN0ZW1SZWxhdGlvbihyZWxhdGlvbikpKQogCQloYXNpbmRleCA9IGZhbHNlOwogCWVsc2UK IAkJaGFzaW5kZXggPSByZWxhdGlvbi0+cmRfcmVsLT5yZWxoYXNpbmRleDsKQEAgLTIwOSw4ICsy MTMsOCBAQCBnZXRfcmVsYXRpb25faW5mbyhQbGFubmVySW5mbyAqcm9vdCwgT2lkIHJlbGF0aW9u T2JqZWN0SWQsIGJvb2wgaW5ocGFyZW50LAogCQkJSW5kZXhBbVJvdXRpbmUgKmFtcm91dGluZTsK IAkJCUluZGV4T3B0SW5mbyAqaW5mbzsKIAkJCWludAkJCW5jb2x1bW5zLAotCQkJCQkJbmtleWNv bHVtbnM7Ci0JCQlpbnQJCQlpOworCQkJCQkJbmtleWNvbHVtbnMsCisJCQkJCQlpOwogCiAJCQkv KgogCQkJICogRXh0cmFjdCBpbmZvIGZyb20gdGhlIHJlbGF0aW9uIGRlc2NyaXB0b3IgZm9yIHRo ZSBpbmRleC4KQEAgLTIzMSwxNiArMjM1LDYgQEAgZ2V0X3JlbGF0aW9uX2luZm8oUGxhbm5lcklu Zm8gKnJvb3QsIE9pZCByZWxhdGlvbk9iamVjdElkLCBib29sIGluaHBhcmVudCwKIAkJCQljb250 aW51ZTsKIAkJCX0KIAotCQkJLyoKLQkJCSAqIElnbm9yZSBwYXJ0aXRpb25lZCBpbmRleGVzLCBz aW5jZSB0aGV5IGFyZSBub3QgdXNhYmxlIGZvcgotCQkJICogcXVlcmllcy4KLQkJCSAqLwotCQkJ aWYgKGluZGV4UmVsYXRpb24tPnJkX3JlbC0+cmVsa2luZCA9PSBSRUxLSU5EX1BBUlRJVElPTkVE X0lOREVYKQotCQkJewotCQkJCWluZGV4X2Nsb3NlKGluZGV4UmVsYXRpb24sIE5vTG9jayk7Ci0J CQkJY29udGludWU7Ci0JCQl9Ci0KIAkJCS8qCiAJCQkgKiBJZiB0aGUgaW5kZXggaXMgdmFsaWQs IGJ1dCBjYW5ub3QgeWV0IGJlIHVzZWQsIGlnbm9yZSBpdDsgYnV0CiAJCQkgKiBtYXJrIHRoZSBw bGFuIHdlIGFyZSBnZW5lcmF0aW5nIGFzIHRyYW5zaWVudC4gU2VlCkBAIC0yODUsMTA4ICsyNzks MTMzIEBAIGdldF9yZWxhdGlvbl9pbmZvKFBsYW5uZXJJbmZvICpyb290LCBPaWQgcmVsYXRpb25P YmplY3RJZCwgYm9vbCBpbmhwYXJlbnQsCiAKIAkJCWluZm8tPnJlbGFtID0gaW5kZXhSZWxhdGlv bi0+cmRfcmVsLT5yZWxhbTsKIAotCQkJLyogV2UgY29weSBqdXN0IHRoZSBmaWVsZHMgd2UgbmVl ZCwgbm90IGFsbCBvZiByZF9pbmRhbSAqLwotCQkJYW1yb3V0aW5lID0gaW5kZXhSZWxhdGlvbi0+ cmRfaW5kYW07Ci0JCQlpbmZvLT5hbWNhbm9yZGVyYnlvcCA9IGFtcm91dGluZS0+YW1jYW5vcmRl cmJ5b3A7Ci0JCQlpbmZvLT5hbW9wdGlvbmFsa2V5ID0gYW1yb3V0aW5lLT5hbW9wdGlvbmFsa2V5 OwotCQkJaW5mby0+YW1zZWFyY2hhcnJheSA9IGFtcm91dGluZS0+YW1zZWFyY2hhcnJheTsKLQkJ CWluZm8tPmFtc2VhcmNobnVsbHMgPSBhbXJvdXRpbmUtPmFtc2VhcmNobnVsbHM7Ci0JCQlpbmZv LT5hbWNhbnBhcmFsbGVsID0gYW1yb3V0aW5lLT5hbWNhbnBhcmFsbGVsOwotCQkJaW5mby0+YW1o YXNnZXR0dXBsZSA9IChhbXJvdXRpbmUtPmFtZ2V0dHVwbGUgIT0gTlVMTCk7Ci0JCQlpbmZvLT5h bWhhc2dldGJpdG1hcCA9IGFtcm91dGluZS0+YW1nZXRiaXRtYXAgIT0gTlVMTCAmJgotCQkJCXJl bGF0aW9uLT5yZF90YWJsZWFtLT5zY2FuX2JpdG1hcF9uZXh0X2Jsb2NrICE9IE5VTEw7Ci0JCQlp bmZvLT5hbWNhbm1hcmtwb3MgPSAoYW1yb3V0aW5lLT5hbW1hcmtwb3MgIT0gTlVMTCAmJgotCQkJ CQkJCQkgIGFtcm91dGluZS0+YW1yZXN0cnBvcyAhPSBOVUxMKTsKLQkJCWluZm8tPmFtY29zdGVz dGltYXRlID0gYW1yb3V0aW5lLT5hbWNvc3Rlc3RpbWF0ZTsKLQkJCUFzc2VydChpbmZvLT5hbWNv c3Rlc3RpbWF0ZSAhPSBOVUxMKTsKLQotCQkJLyogRmV0Y2ggaW5kZXggb3BjbGFzcyBvcHRpb25z ICovCi0JCQlpbmZvLT5vcGNsYXNzb3B0aW9ucyA9IFJlbGF0aW9uR2V0SW5kZXhBdHRPcHRpb25z KGluZGV4UmVsYXRpb24sIHRydWUpOwotCiAJCQkvKgotCQkJICogRmV0Y2ggdGhlIG9yZGVyaW5n IGluZm9ybWF0aW9uIGZvciB0aGUgaW5kZXgsIGlmIGFueS4KKwkJCSAqIFdlIGRvbid0IGhhdmUg YW0gZm9yIHBhcnRpdGlvbmVkIGluZGV4ZXMsIHRoZXJlZm9yZSB3ZSBza2lwCisJCQkgKiBnYXRo ZXJpbmcgdGhlIGluZm8uIFRoaXMgaXMgb2ssIGJlY2F1c2Ugd2UgZG9uJ3QgdXNlCisJCQkgKiBw YXJ0aXRpb25lZCBpbmRleGVzIGluIHBhdGhzLiBXZSByZXNvbHZlIGluaGVyaXRhbmNlIGJlZm9y ZQorCQkJICogZ2VuZXJhdGluZyBwYXRocy4KIAkJCSAqLwotCQkJaWYgKGluZm8tPnJlbGFtID09 IEJUUkVFX0FNX09JRCkKKwkJCWlmIChpbmRleFJlbGF0aW9uLT5yZF9yZWwtPnJlbGtpbmQgIT0g UkVMS0lORF9QQVJUSVRJT05FRF9JTkRFWCkKIAkJCXsKKwkJCQkvKiBXZSBjb3B5IGp1c3QgdGhl IGZpZWxkcyB3ZSBuZWVkLCBub3QgYWxsIG9mIHJkX2luZGFtICovCisJCQkJYW1yb3V0aW5lID0g aW5kZXhSZWxhdGlvbi0+cmRfaW5kYW07CisJCQkJaW5mby0+YW1jYW5vcmRlcmJ5b3AgPSBhbXJv dXRpbmUtPmFtY2Fub3JkZXJieW9wOworCQkJCWluZm8tPmFtb3B0aW9uYWxrZXkgPSBhbXJvdXRp bmUtPmFtb3B0aW9uYWxrZXk7CisJCQkJaW5mby0+YW1zZWFyY2hhcnJheSA9IGFtcm91dGluZS0+ YW1zZWFyY2hhcnJheTsKKwkJCQlpbmZvLT5hbXNlYXJjaG51bGxzID0gYW1yb3V0aW5lLT5hbXNl YXJjaG51bGxzOworCQkJCWluZm8tPmFtY2FucGFyYWxsZWwgPSBhbXJvdXRpbmUtPmFtY2FucGFy YWxsZWw7CisJCQkJaW5mby0+YW1oYXNnZXR0dXBsZSA9IChhbXJvdXRpbmUtPmFtZ2V0dHVwbGUg IT0gTlVMTCk7CisJCQkJaW5mby0+YW1oYXNnZXRiaXRtYXAgPSBhbXJvdXRpbmUtPmFtZ2V0Yml0 bWFwICE9IE5VTEwgJiYKKwkJCQkJcmVsYXRpb24tPnJkX3RhYmxlYW0tPnNjYW5fYml0bWFwX25l eHRfYmxvY2sgIT0gTlVMTDsKKwkJCQlpbmZvLT5hbWNhbm1hcmtwb3MgPSAoYW1yb3V0aW5lLT5h bW1hcmtwb3MgIT0gTlVMTCAmJgorCQkJCQlhbXJvdXRpbmUtPmFtcmVzdHJwb3MgIT0gTlVMTCk7 CisJCQkJaW5mby0+YW1jb3N0ZXN0aW1hdGUgPSBhbXJvdXRpbmUtPmFtY29zdGVzdGltYXRlOwor CQkJCUFzc2VydChpbmZvLT5hbWNvc3Rlc3RpbWF0ZSAhPSBOVUxMKTsKKworCQkJCS8qIEZldGNo IGluZGV4IG9wY2xhc3Mgb3B0aW9ucyAqLworCQkJCWluZm8tPm9wY2xhc3NvcHRpb25zID0gUmVs YXRpb25HZXRJbmRleEF0dE9wdGlvbnMoaW5kZXhSZWxhdGlvbiwgdHJ1ZSk7CisKIAkJCQkvKgot CQkJCSAqIElmIGl0J3MgYSBidHJlZSBpbmRleCwgd2UgY2FuIHVzZSBpdHMgb3BmYW1pbHkgT0lE cwotCQkJCSAqIGRpcmVjdGx5IGFzIHRoZSBzb3J0IG9yZGVyaW5nIG9wZmFtaWx5IE9JRHMuCisJ CQkJICogRmV0Y2ggdGhlIG9yZGVyaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgaW5kZXgsIGlmIGFu eS4KIAkJCQkgKi8KLQkJCQlBc3NlcnQoYW1yb3V0aW5lLT5hbWNhbm9yZGVyKTsKLQotCQkJCWlu Zm8tPnNvcnRvcGZhbWlseSA9IGluZm8tPm9wZmFtaWx5OwotCQkJCWluZm8tPnJldmVyc2Vfc29y dCA9IChib29sICopIHBhbGxvYyhzaXplb2YoYm9vbCkgKiBua2V5Y29sdW1ucyk7Ci0JCQkJaW5m by0+bnVsbHNfZmlyc3QgPSAoYm9vbCAqKSBwYWxsb2Moc2l6ZW9mKGJvb2wpICogbmtleWNvbHVt bnMpOwotCi0JCQkJZm9yIChpID0gMDsgaSA8IG5rZXljb2x1bW5zOyBpKyspCisJCQkJaWYgKGlu Zm8tPnJlbGFtID09IEJUUkVFX0FNX09JRCkKIAkJCQl7Ci0JCQkJCWludDE2CQlvcHQgPSBpbmRl eFJlbGF0aW9uLT5yZF9pbmRvcHRpb25baV07CisJCQkJCS8qCisJCQkJCSAqIElmIGl0J3MgYSBi dHJlZSBpbmRleCwgd2UgY2FuIHVzZSBpdHMgb3BmYW1pbHkgT0lEcworCQkJCQkgKiBkaXJlY3Rs eSBhcyB0aGUgc29ydCBvcmRlcmluZyBvcGZhbWlseSBPSURzLgorCQkJCQkgKi8KKwkJCQkJQXNz ZXJ0KGFtcm91dGluZS0+YW1jYW5vcmRlcik7CiAKLQkJCQkJaW5mby0+cmV2ZXJzZV9zb3J0W2ld ID0gKG9wdCAmIElORE9QVElPTl9ERVNDKSAhPSAwOwotCQkJCQlpbmZvLT5udWxsc19maXJzdFtp XSA9IChvcHQgJiBJTkRPUFRJT05fTlVMTFNfRklSU1QpICE9IDA7Ci0JCQkJfQotCQkJfQotCQkJ ZWxzZSBpZiAoYW1yb3V0aW5lLT5hbWNhbm9yZGVyKQotCQkJewotCQkJCS8qCi0JCQkJICogT3Ro ZXJ3aXNlLCBpZGVudGlmeSB0aGUgY29ycmVzcG9uZGluZyBidHJlZSBvcGZhbWlsaWVzIGJ5Ci0J CQkJICogdHJ5aW5nIHRvIG1hcCB0aGlzIGluZGV4J3MgIjwiIG9wZXJhdG9ycyBpbnRvIGJ0cmVl LiAgU2luY2UKLQkJCQkgKiAiPCIgdW5pcXVlbHkgZGVmaW5lcyB0aGUgYmVoYXZpb3Igb2YgYSBz b3J0IG9yZGVyLCB0aGlzIGlzCi0JCQkJICogYSBzdWZmaWNpZW50IHRlc3QuCi0JCQkJICoKLQkJ CQkgKiBYWFggVGhpcyBtZXRob2QgaXMgcmF0aGVyIHNsb3cgYW5kIGFsc28gcmVxdWlyZXMgdGhl Ci0JCQkJICogdW5kZXNpcmFibGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBvdGhlciBpbmRleCBBTSBu dW1iZXJzIGl0cwotCQkJCSAqIHN0cmF0ZWdpZXMgdGhlIHNhbWUgYXMgYnRyZWUuICBJdCdkIGJl IGJldHRlciB0byBoYXZlIGEgd2F5Ci0JCQkJICogdG8gZXhwbGljaXRseSBkZWNsYXJlIHRoZSBj b3JyZXNwb25kaW5nIGJ0cmVlIG9wZmFtaWx5IGZvcgotCQkJCSAqIGVhY2ggb3BmYW1pbHkgb2Yg dGhlIG90aGVyIGluZGV4IHR5cGUuICBCdXQgZ2l2ZW4gdGhlIGxhY2sKLQkJCQkgKiBvZiBjdXJy ZW50IG9yIGZvcmVzZWVhYmxlIGFtY2Fub3JkZXIgaW5kZXggdHlwZXMsIGl0J3Mgbm90Ci0JCQkJ ICogd29ydGggZXhwZW5kaW5nIG1vcmUgZWZmb3J0IG9uIG5vdy4KLQkJCQkgKi8KLQkJCQlpbmZv LT5zb3J0b3BmYW1pbHkgPSAoT2lkICopIHBhbGxvYyhzaXplb2YoT2lkKSAqIG5rZXljb2x1bW5z KTsKLQkJCQlpbmZvLT5yZXZlcnNlX3NvcnQgPSAoYm9vbCAqKSBwYWxsb2Moc2l6ZW9mKGJvb2wp ICogbmtleWNvbHVtbnMpOwotCQkJCWluZm8tPm51bGxzX2ZpcnN0ID0gKGJvb2wgKikgcGFsbG9j KHNpemVvZihib29sKSAqIG5rZXljb2x1bW5zKTsKKwkJCQkJaW5mby0+c29ydG9wZmFtaWx5ID0g aW5mby0+b3BmYW1pbHk7CisJCQkJCWluZm8tPnJldmVyc2Vfc29ydCA9IChib29sICopcGFsbG9j KHNpemVvZihib29sKSAqIG5rZXljb2x1bW5zKTsKKwkJCQkJaW5mby0+bnVsbHNfZmlyc3QgPSAo Ym9vbCAqKXBhbGxvYyhzaXplb2YoYm9vbCkgKiBua2V5Y29sdW1ucyk7CiAKLQkJCQlmb3IgKGkg PSAwOyBpIDwgbmtleWNvbHVtbnM7IGkrKykKLQkJCQl7Ci0JCQkJCWludDE2CQlvcHQgPSBpbmRl eFJlbGF0aW9uLT5yZF9pbmRvcHRpb25baV07Ci0JCQkJCU9pZAkJCWx0b3ByOwotCQkJCQlPaWQJ CQlidG9wZmFtaWx5OwotCQkJCQlPaWQJCQlidG9wY2ludHlwZTsKLQkJCQkJaW50MTYJCWJ0c3Ry YXRlZ3k7Ci0KLQkJCQkJaW5mby0+cmV2ZXJzZV9zb3J0W2ldID0gKG9wdCAmIElORE9QVElPTl9E RVNDKSAhPSAwOwotCQkJCQlpbmZvLT5udWxsc19maXJzdFtpXSA9IChvcHQgJiBJTkRPUFRJT05f TlVMTFNfRklSU1QpICE9IDA7Ci0KLQkJCQkJbHRvcHIgPSBnZXRfb3BmYW1pbHlfbWVtYmVyKGlu Zm8tPm9wZmFtaWx5W2ldLAotCQkJCQkJCQkJCQkJaW5mby0+b3BjaW50eXBlW2ldLAotCQkJCQkJ CQkJCQkJaW5mby0+b3BjaW50eXBlW2ldLAotCQkJCQkJCQkJCQkJQlRMZXNzU3RyYXRlZ3lOdW1i ZXIpOwotCQkJCQlpZiAoT2lkSXNWYWxpZChsdG9wcikgJiYKLQkJCQkJCWdldF9vcmRlcmluZ19v cF9wcm9wZXJ0aWVzKGx0b3ByLAotCQkJCQkJCQkJCQkJICAgJmJ0b3BmYW1pbHksCi0JCQkJCQkJ CQkJCQkgICAmYnRvcGNpbnR5cGUsCi0JCQkJCQkJCQkJCQkgICAmYnRzdHJhdGVneSkgJiYKLQkJ CQkJCWJ0b3BjaW50eXBlID09IGluZm8tPm9wY2ludHlwZVtpXSAmJgotCQkJCQkJYnRzdHJhdGVn eSA9PSBCVExlc3NTdHJhdGVneU51bWJlcikKKwkJCQkJZm9yIChpID0gMDsgaSA8IG5rZXljb2x1 bW5zOyBpKyspCiAJCQkJCXsKLQkJCQkJCS8qIFN1Y2Nlc3NmdWwgbWFwcGluZyAqLwotCQkJCQkJ aW5mby0+c29ydG9wZmFtaWx5W2ldID0gYnRvcGZhbWlseTsKKwkJCQkJCWludDE2CQlvcHQgPSBp bmRleFJlbGF0aW9uLT5yZF9pbmRvcHRpb25baV07CisKKwkJCQkJCWluZm8tPnJldmVyc2Vfc29y dFtpXSA9IChvcHQgJiBJTkRPUFRJT05fREVTQykgIT0gMDsKKwkJCQkJCWluZm8tPm51bGxzX2Zp cnN0W2ldID0gKG9wdCAmIElORE9QVElPTl9OVUxMU19GSVJTVCkgIT0gMDsKIAkJCQkJfQotCQkJ CQllbHNlCisJCQkJfQorCQkJCWVsc2UgaWYgKGFtcm91dGluZS0+YW1jYW5vcmRlcikKKwkJCQl7 CisJCQkJCS8qCisJCQkJCSAqIE90aGVyd2lzZSwgaWRlbnRpZnkgdGhlIGNvcnJlc3BvbmRpbmcg YnRyZWUgb3BmYW1pbGllcyBieQorCQkJCQkgKiB0cnlpbmcgdG8gbWFwIHRoaXMgaW5kZXgncyAi PCIgb3BlcmF0b3JzIGludG8gYnRyZWUuICBTaW5jZQorCQkJCQkgKiAiPCIgdW5pcXVlbHkgZGVm aW5lcyB0aGUgYmVoYXZpb3Igb2YgYSBzb3J0IG9yZGVyLCB0aGlzIGlzCisJCQkJCSAqIGEgc3Vm ZmljaWVudCB0ZXN0LgorCQkJCQkgKgorCQkJCQkgKiBYWFggVGhpcyBtZXRob2QgaXMgcmF0aGVy IHNsb3cgYW5kIGFsc28gcmVxdWlyZXMgdGhlCisJCQkJCSAqIHVuZGVzaXJhYmxlIGFzc3VtcHRp b24gdGhhdCB0aGUgb3RoZXIgaW5kZXggQU0gbnVtYmVycyBpdHMKKwkJCQkJICogc3RyYXRlZ2ll cyB0aGUgc2FtZSBhcyBidHJlZS4gIEl0J2QgYmUgYmV0dGVyIHRvIGhhdmUgYSB3YXkKKwkJCQkJ ICogdG8gZXhwbGljaXRseSBkZWNsYXJlIHRoZSBjb3JyZXNwb25kaW5nIGJ0cmVlIG9wZmFtaWx5 IGZvcgorCQkJCQkgKiBlYWNoIG9wZmFtaWx5IG9mIHRoZSBvdGhlciBpbmRleCB0eXBlLiAgQnV0 IGdpdmVuIHRoZSBsYWNrCisJCQkJCSAqIG9mIGN1cnJlbnQgb3IgZm9yZXNlZWFibGUgYW1jYW5v cmRlciBpbmRleCB0eXBlcywgaXQncyBub3QKKwkJCQkJICogd29ydGggZXhwZW5kaW5nIG1vcmUg ZWZmb3J0IG9uIG5vdy4KKwkJCQkJICovCisJCQkJCWluZm8tPnNvcnRvcGZhbWlseSA9IChPaWQg KilwYWxsb2Moc2l6ZW9mKE9pZCkgKiBua2V5Y29sdW1ucyk7CisJCQkJCWluZm8tPnJldmVyc2Vf c29ydCA9IChib29sICopcGFsbG9jKHNpemVvZihib29sKSAqIG5rZXljb2x1bW5zKTsKKwkJCQkJ aW5mby0+bnVsbHNfZmlyc3QgPSAoYm9vbCAqKXBhbGxvYyhzaXplb2YoYm9vbCkgKiBua2V5Y29s dW1ucyk7CisKKwkJCQkJZm9yIChpID0gMDsgaSA8IG5rZXljb2x1bW5zOyBpKyspCiAJCQkJCXsK LQkJCQkJCS8qIEZhaWwgLi4uIHF1aWV0bHkgdHJlYXQgaW5kZXggYXMgdW5vcmRlcmVkICovCi0J CQkJCQlpbmZvLT5zb3J0b3BmYW1pbHkgPSBOVUxMOwotCQkJCQkJaW5mby0+cmV2ZXJzZV9zb3J0 ID0gTlVMTDsKLQkJCQkJCWluZm8tPm51bGxzX2ZpcnN0ID0gTlVMTDsKLQkJCQkJCWJyZWFrOwor CQkJCQkJaW50MTYJCW9wdCA9IGluZGV4UmVsYXRpb24tPnJkX2luZG9wdGlvbltpXTsKKwkJCQkJ CU9pZAkJCWx0b3ByOworCQkJCQkJT2lkCQkJYnRvcGZhbWlseTsKKwkJCQkJCU9pZAkJCWJ0b3Bj aW50eXBlOworCQkJCQkJaW50MTYJCWJ0c3RyYXRlZ3k7CisKKwkJCQkJCWluZm8tPnJldmVyc2Vf c29ydFtpXSA9IChvcHQgJiBJTkRPUFRJT05fREVTQykgIT0gMDsKKwkJCQkJCWluZm8tPm51bGxz X2ZpcnN0W2ldID0gKG9wdCAmIElORE9QVElPTl9OVUxMU19GSVJTVCkgIT0gMDsKKworCQkJCQkJ bHRvcHIgPSBnZXRfb3BmYW1pbHlfbWVtYmVyKGluZm8tPm9wZmFtaWx5W2ldLAorCQkJCQkJCWlu Zm8tPm9wY2ludHlwZVtpXSwKKwkJCQkJCQlpbmZvLT5vcGNpbnR5cGVbaV0sCisJCQkJCQkJQlRM ZXNzU3RyYXRlZ3lOdW1iZXIpOworCQkJCQkJaWYgKE9pZElzVmFsaWQobHRvcHIpICYmCisJCQkJ CQkJZ2V0X29yZGVyaW5nX29wX3Byb3BlcnRpZXMobHRvcHIsCisJCQkJCQkJCSZidG9wZmFtaWx5 LAorCQkJCQkJCQkmYnRvcGNpbnR5cGUsCisJCQkJCQkJCSZidHN0cmF0ZWd5KSAmJgorCQkJCQkJ CWJ0b3BjaW50eXBlID09IGluZm8tPm9wY2ludHlwZVtpXSAmJgorCQkJCQkJCWJ0c3RyYXRlZ3kg PT0gQlRMZXNzU3RyYXRlZ3lOdW1iZXIpCisJCQkJCQl7CisJCQkJCQkJLyogU3VjY2Vzc2Z1bCBt YXBwaW5nICovCisJCQkJCQkJaW5mby0+c29ydG9wZmFtaWx5W2ldID0gYnRvcGZhbWlseTsKKwkJ CQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQkvKiBGYWlsIC4uLiBxdWlldGx5IHRy ZWF0IGluZGV4IGFzIHVub3JkZXJlZCAqLworCQkJCQkJCWluZm8tPnNvcnRvcGZhbWlseSA9IE5V TEw7CisJCQkJCQkJaW5mby0+cmV2ZXJzZV9zb3J0ID0gTlVMTDsKKwkJCQkJCQlpbmZvLT5udWxs c19maXJzdCA9IE5VTEw7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CisJ CQkJZWxzZQorCQkJCXsKKwkJCQkJaW5mby0+c29ydG9wZmFtaWx5ID0gTlVMTDsKKwkJCQkJaW5m by0+cmV2ZXJzZV9zb3J0ID0gTlVMTDsKKwkJCQkJaW5mby0+bnVsbHNfZmlyc3QgPSBOVUxMOwor CQkJCX0KIAkJCX0KIAkJCWVsc2UKIAkJCXsKIAkJCQlpbmZvLT5zb3J0b3BmYW1pbHkgPSBOVUxM OwogCQkJCWluZm8tPnJldmVyc2Vfc29ydCA9IE5VTEw7CiAJCQkJaW5mby0+bnVsbHNfZmlyc3Qg PSBOVUxMOworCisJCQkJaW5mby0+YW1jYW5vcmRlcmJ5b3AgPSBmYWxzZTsKKwkJCQlpbmZvLT5h bW9wdGlvbmFsa2V5ID0gZmFsc2U7CisJCQkJaW5mby0+YW1zZWFyY2hhcnJheSA9IGZhbHNlOwor CQkJCWluZm8tPmFtc2VhcmNobnVsbHMgPSBmYWxzZTsKKwkJCQlpbmZvLT5hbWNhbnBhcmFsbGVs ID0gZmFsc2U7CisJCQkJaW5mby0+YW1oYXNnZXR0dXBsZSA9IGZhbHNlOworCQkJCWluZm8tPmFt aGFzZ2V0Yml0bWFwID0gZmFsc2U7CisJCQkJaW5mby0+YW1jYW5tYXJrcG9zID0gZmFsc2U7CisJ CQkJaW5mby0+YW1jb3N0ZXN0aW1hdGUgPSBOVUxMOwogCQkJfQogCiAJCQkvKgpAQCAtNDMzLDcg KzQ1Miw4IEBAIGdldF9yZWxhdGlvbl9pbmZvKFBsYW5uZXJJbmZvICpyb290LCBPaWQgcmVsYXRp b25PYmplY3RJZCwgYm9vbCBpbmhwYXJlbnQsCiAJCQkJCWluZm8tPnR1cGxlcyA9IHJlbC0+dHVw bGVzOwogCQkJfQogCi0JCQlpZiAoaW5mby0+cmVsYW0gPT0gQlRSRUVfQU1fT0lEKQorCQkJaWYg KGluZm8tPnJlbGFtID09IEJUUkVFX0FNX09JRCAmJgorCQkJCWluZGV4UmVsYXRpb24tPnJkX3Jl bC0+cmVsa2luZCAhPSBSRUxLSU5EX1BBUlRJVElPTkVEX0lOREVYKQogCQkJewogCQkJCS8qIEZv ciBidHJlZXMsIGdldCB0cmVlIGhlaWdodCB3aGlsZSB3ZSBoYXZlIHRoZSBpbmRleCBvcGVuICov CiAJCQkJaW5mby0+dHJlZV9oZWlnaHQgPSBfYnRfZ2V0cm9vdGhlaWdodChpbmRleFJlbGF0aW9u KTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jIGIvc3JjL2Jh Y2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMKaW5kZXggNjllMGZiOThmNS4uMmI1NDNiNzE5OSAx MDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMKKysrIGIvc3JjL2Jh Y2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMKQEAgLTU5NjMsNiArNTk2MywxMCBAQCBnZXRfYWN0 dWFsX3ZhcmlhYmxlX3JhbmdlKFBsYW5uZXJJbmZvICpyb290LCBWYXJpYWJsZVN0YXREYXRhICp2 YXJkYXRhLAogCXJ0ZSA9IHJvb3QtPnNpbXBsZV9ydGVfYXJyYXlbcmVsLT5yZWxpZF07CiAJQXNz ZXJ0KHJ0ZS0+cnRla2luZCA9PSBSVEVfUkVMQVRJT04pOwogCisJLyogaWdub3JlIHBhcnRpdGlv bmVkIHRhYmxlcy4gIEFueSBpbmRleGVzIGhlcmUgYXJlIG5vdCByZWFsIGluZGV4ZXMgKi8KKwlp ZiAocnRlLT5yZWxraW5kID09IFJFTEtJTkRfUEFSVElUSU9ORURfVEFCTEUpCisJCXJldHVybiBm YWxzZTsKKwogCS8qIFNlYXJjaCB0aHJvdWdoIHRoZSBpbmRleGVzIHRvIHNlZSBpZiBhbnkgbWF0 Y2ggb3VyIHByb2JsZW0gKi8KIAlmb3JlYWNoKGxjLCByZWwtPmluZGV4bGlzdCkKIAl7CmRpZmYg LS1naXQgYS9zcmMvaW5jbHVkZS9ub2Rlcy9wYXRobm9kZXMuaCBiL3NyYy9pbmNsdWRlL25vZGVz L3BhdGhub2Rlcy5oCmluZGV4IDA5MzQyZDEyOGQuLmE2ZWM1MjVkYTcgMTAwNjQ0Ci0tLSBhL3Ny Yy9pbmNsdWRlL25vZGVzL3BhdGhub2Rlcy5oCisrKyBiL3NyYy9pbmNsdWRlL25vZGVzL3BhdGhu b2Rlcy5oCkBAIC02MjgsNyArNjI4LDcgQEAgdHlwZWRlZiBzdHJ1Y3QgUGFydGl0aW9uU2NoZW1l RGF0YSAqUGFydGl0aW9uU2NoZW1lOwogICoJCWxhdGVyYWxfcmVsaWRzIC0gcmVxdWlyZWQgb3V0 ZXIgcmVscyBmb3IgTEFURVJBTCwgYXMgYSBSZWxpZHMgc2V0CiAgKgkJCShpbmNsdWRlcyBib3Ro IGRpcmVjdCBhbmQgaW5kaXJlY3QgbGF0ZXJhbCByZWZlcmVuY2VzKQogICoKLSAqIElmIHRoZSBy ZWxhdGlvbiBpcyBhIGJhc2UgcmVsYXRpb24gaXQgd2lsbCBoYXZlIHRoZXNlIGZpZWxkcyBzZXQ6 CisgKiBJZiB0aGUgcmVsYXRpb24gaXMgYSBiYXNlIHJlbGF0aW9uLCBpdCB3aWxsIGhhdmUgdGhl c2UgZmllbGRzIHNldDoKICAqCiAgKgkJcmVsaWQgLSBSVEUgaW5kZXggKHRoaXMgaXMgcmVkdW5k YW50IHdpdGggdGhlIHJlbGlkcyBmaWVsZCwgYnV0CiAgKgkJCQlpcyBwcm92aWRlZCBmb3IgY29u dmVuaWVuY2Ugb2YgYWNjZXNzKQpAQCAtNjQzLDggKzY0Myw2IEBAIHR5cGVkZWYgc3RydWN0IFBh cnRpdGlvblNjaGVtZURhdGEgKlBhcnRpdGlvblNjaGVtZTsKICAqCQkJCQkgICBWYXJzIGFuZCBQ bGFjZUhvbGRlclZhcnMpCiAgKgkJbGF0ZXJhbF9yZWZlcmVuY2VycyAtIHJlbGlkcyBvZiByZWxz IHRoYXQgcmVmZXJlbmNlIHRoaXMgb25lIGxhdGVyYWxseQogICoJCQkJKGluY2x1ZGVzIGJvdGgg ZGlyZWN0IGFuZCBpbmRpcmVjdCBsYXRlcmFsIHJlZmVyZW5jZXMpCi0gKgkJaW5kZXhsaXN0IC0g bGlzdCBvZiBJbmRleE9wdEluZm8gbm9kZXMgZm9yIHJlbGF0aW9uJ3MgaW5kZXhlcwotICoJCQkJ CShhbHdheXMgTklMIGlmIGl0J3Mgbm90IGEgdGFibGUpCiAgKgkJcGFnZXMgLSBudW1iZXIgb2Yg ZGlzayBwYWdlcyBpbiByZWxhdGlvbiAoemVybyBpZiBub3QgYSB0YWJsZSkKICAqCQl0dXBsZXMg LSBudW1iZXIgb2YgdHVwbGVzIGluIHJlbGF0aW9uIChub3QgY29uc2lkZXJpbmcgcmVzdHJpY3Rp b25zKQogICoJCWFsbHZpc2ZyYWMgLSBmcmFjdGlvbiBvZiBkaXNrIHBhZ2VzIHRoYXQgYXJlIG1h cmtlZCBhbGwtdmlzaWJsZQpAQCAtNjYwLDYgKzY1OCwxMyBAQCB0eXBlZGVmIHN0cnVjdCBQYXJ0 aXRpb25TY2hlbWVEYXRhICpQYXJ0aXRpb25TY2hlbWU7CiAgKgkJRm9yIG90aGVycmVscyB0aGF0 IGFyZSBhcHBlbmRyZWwgbWVtYmVycywgdGhlc2UgZmllbGRzIGFyZSBmaWxsZWQKICAqCQlpbiBq dXN0IGFzIGZvciBhIGJhc2VyZWwsIGV4Y2VwdCB3ZSBkb24ndCBib3RoZXIgd2l0aCBsYXRlcmFs X3ZhcnMuCiAgKgorICogSWYgdGhlIHJlbGF0aW9uIGlzIGVpdGhlciBhIGJhc2UgcmVsYXRpb24g b3IgYSBwYXJ0aXRpb25lZCB0YWJsZSwgaXQgd2lsbCBoYXZlIGEgc2V0OgorICoJCWluZGV4bGlz dCAtIGxpc3Qgb2YgSW5kZXhPcHRJbmZvIG5vZGVzIGZvciByZWxhdGlvbidzIGluZGV4ZXMKKyAq CQkgICAgICAgICAgICAgICAgICAgICAgICAoZm9yIHBhdGl0aW9uZWQgaW5kZXhlcyBub3QgYWxs IG9mIHRoZQorICoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleE9wdEluZm8gZmll bGRzIGFyZSBzZXQsIHNpbmNlIHRoZXkKKyAqCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAg Y2FuJ3QgYmUgYWNjZXNzZWQpCisgKgkJCQkJKGFsd2F5cyBOSUwgaWYgaXQncyBub3QgYSB0YWJs ZSkKKyAqCiAgKiBJZiB0aGUgcmVsYXRpb24gaXMgZWl0aGVyIGEgZm9yZWlnbiB0YWJsZSBvciBh IGpvaW4gb2YgZm9yZWlnbiB0YWJsZXMgdGhhdAogICogYWxsIGJlbG9uZyB0byB0aGUgc2FtZSBm b3JlaWduIHNlcnZlciBhbmQgYXJlIGFzc2lnbmVkIHRvIHRoZSBzYW1lIHVzZXIgdG8KICAqIGNo ZWNrIGFjY2VzcyBwZXJtaXNzaW9ucyBhcyAoY2YgY2hlY2tBc1VzZXIpLCB0aGVzZSBmaWVsZHMg d2lsbCBiZSBzZXQ6CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2luaGVy aXQub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9pbmhlcml0Lm91dAppbmRleCAyZDQ5 ZTc2NWRlLi44MGZjNzZlZDMyIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVk L2luaGVyaXQub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvaW5oZXJpdC5vdXQK QEAgLTEsNiArMSw4IEBACiAtLQogLS0gVGVzdCBpbmhlcml0YW5jZSBmZWF0dXJlcwogLS0KKy0t IFhYWCBUaGVzZSB0YWJsZXMgYXJlIG5vdCBkcm9wcGVkLiBXaHk/CistLSBYWFggQXJlIHRoZXkg bmVlZGVkIGZvciBsYXRlciB0ZXN0cz8gRm9yIGR1bXAtcmVzdG9yZT8gRHJvcHBpbmcgdGhlbSBk b2Vzbid0IGZhaWwgYW55IHRlc3QgZnJvbSBjaGVjay13b3JsZC4KIENSRUFURSBUQUJMRSBhIChh YSBURVhUKTsKIENSRUFURSBUQUJMRSBiIChiYiBURVhUKSBJTkhFUklUUyAoYSk7CiBDUkVBVEUg VEFCTEUgYyAoY2MgVEVYVCkgSU5IRVJJVFMgKGEpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVn cmVzcy9leHBlY3RlZC9qb2luLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5v dXQKaW5kZXggOWI2OWE4YzEyMi4uZmYyMzgwODAxMyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVn cmVzcy9leHBlY3RlZC9qb2luLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pv aW4ub3V0CkBAIC00NTg4LDcgKzQ1ODgsOCBAQCBzZWxlY3QgYS5xMiwgYi5xMQogcmVzZXQgZW5h YmxlX2hhc2hqb2luOwogcmVzZXQgZW5hYmxlX25lc3Rsb29wOwogLS0KLS0tIHRlc3Qgam9pbiBy ZW1vdmFsCistLSB0ZXN0IGpvaW4gcmVtb3ZhbCBmb3IgcGxhaW4gdGFibGVzCistLSB3ZSBoYXZl IGFsbW9zdCB0aGUgc21hcmUgdGVzdHMgZm9yIHBhcnRpdGlvbmVkIHRhYmxlcyBiZWxvdwogLS0K IGJlZ2luOwogQ1JFQVRFIFRFTVAgVEFCTEUgYSAoaWQgaW50IFBSSU1BUlkgS0VZLCBiX2lkIGlu dCk7CkBAIC00NzIwLDYgKzQ3MjEsNTUgQEAgc2VsZWN0IDEgZnJvbSAoc2VsZWN0IGEuaWQgRlJP TSBhIGxlZnQgam9pbiBiIG9uIGEuYl9pZCA9IGIuaWQpIHEsCiAgICAgICAgICBGaWx0ZXI6IChh LmlkID0gaSkKICg0IHJvd3MpCiAKK3JvbGxiYWNrOworLS0KKy0tIHRlc3Qgam9pbiByZW1vdmFs IGZvciBwYXJ0aXRpb25lZCB0YWJsZXMKKy0tIHRoaXMgaXMgYW5hbG9nIHRvIHRoZSBub24gcGFy dGl0aW9uZWQgY2FzZSBhYm92ZQorLS0KK2JlZ2luOworQ1JFQVRFIFRBQkxFIGJfcCAoaWQgaW50 IFBSSU1BUlkgS0VZLCBjX2lkIGludCkgcGFydGl0aW9uIGJ5IHJhbmdlKGlkKTsKK0NSRUFURSBU QUJMRSBiX20gcGFydGl0aW9uIG9mIGJfcCBmb3IgdmFsdWVzIGZyb20gKDApIHRvICgxMCkgcGFy dGl0aW9uIGJ5IHJhbmdlKGlkKTsKK0NSRUFURSBUQUJMRSBiX2MgcGFydGl0aW9uIG9mIGJfbSBm b3IgdmFsdWVzIGZyb20gKDApIHRvICgxMCk7CitDUkVBVEUgVEFCTEUgY19wIChpZCBpbnQgUFJJ TUFSWSBLRVkpIHBhcnRpdGlvbiBieSByYW5nZShpZCk7CitDUkVBVEUgVEFCTEUgY19tIHBhcnRp dGlvbiBvZiBjX3AgZm9yIHZhbHVlcyBmcm9tICgwKSB0byAoMTApIHBhcnRpdGlvbiBieSByYW5n ZShpZCk7CitDUkVBVEUgVEFCTEUgY19jIHBhcnRpdGlvbiBvZiBjX20gZm9yIHZhbHVlcyBmcm9t ICgwKSB0byAoMTApOworSU5TRVJUIElOVE8gYl9wIFZBTFVFUyAoMCwgMCksICgxLCBOVUxMKTsK K0lOU0VSVCBJTlRPIGNfcCBWQUxVRVMgKDApLCAoMSk7CistLSBhbGwgdGhyZWUgY2FzZXMgc2hv dWxkIGJlIG9wdGltaXphYmxlIGludG8gYSBzaW1wbGUgc2Vxc2NhbgorRVhQTEFJTiAoQ09TVFMg T0ZGKSBTRUxFQ1QgYjAuKiBGUk9NIGJfcCBiMCBMRUZUIEpPSU4gYl9wIGIgT04gYjAuY19pZCA9 IGIuaWQ7CisgICAgIFFVRVJZIFBMQU4gICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEg U2NhbiBvbiBiX2MgYjAKKygxIHJvdykKKworRVhQTEFJTiAoQ09TVFMgT0ZGKSBTRUxFQ1QgYi4q IEZST00gYl9wIGIgTEVGVCBKT0lOIGNfcCBjIE9OIGIuY19pZCA9IGMuaWQ7CisgICAgUVVFUlkg UExBTiAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gYl9jIGIKKygxIHJv dykKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorICBTRUxFQ1QgYjAuKiBGUk9NIGJfcCBiMCBMRUZU IEpPSU4gKGJfcCBiIExFRlQgSk9JTiBjX3AgYyBvbiBiLmNfaWQgPSBjLmlkKQorICBPTiAoYjAu Y19pZCA9IGIuaWQpOworICAgICBRVUVSWSBQTEFOICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t CisgU2VxIFNjYW4gb24gYl9jIGIwCisoMSByb3cpCisKKy0tIGNoZWNrIG9wdGltaXphdGlvbiBv ZiBvdXRlciBqb2luIHdpdGhpbiBhbm90aGVyIHNwZWNpYWwgam9pbgorRVhQTEFJTiAoQ09TVFMg T0ZGKQorc2VsZWN0IGlkIGZyb20gYl9wIGIwIFdIRVJFIGlkIGluICgKKwlTRUxFQ1QgYi5pZCBG Uk9NIGJfcCBiIExFRlQgSk9JTiBjX3AgYyBvbiBiLmlkID0gYy5pZAorKTsKKyAgICAgICAgICBR VUVSWSBQTEFOICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBI YXNoIEpvaW4KKyAgIEhhc2ggQ29uZDogKGIwLmlkID0gYi5pZCkKKyAgIC0+ICBTZXEgU2NhbiBv biBiX2MgYjAKKyAgIC0+ICBIYXNoCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gYl9jIGIKKyg1 IHJvd3MpCisKIHJvbGxiYWNrOwogY3JlYXRlIHRlbXAgdGFibGUgcGFyZW50IChrIGludCBwcmlt YXJ5IGtleSwgcGQgaW50KTsKIGNyZWF0ZSB0ZW1wIHRhYmxlIGNoaWxkIChrIGludCB1bmlxdWUs IGNkIGludCk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3BhcnRpdGlv bl9qb2luLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcGFydGl0aW9uX2pvaW4ub3V0 CmluZGV4IGIyMGZhY2MxOWYuLmRkOGFkMWM3MWEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jl c3MvZXhwZWN0ZWQvcGFydGl0aW9uX2pvaW4ub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhw ZWN0ZWQvcGFydGl0aW9uX2pvaW4ub3V0CkBAIC00ODY3LDEzICs0ODY3LDEzIEBAIENSRUFURSBU QUJMRSBmcmFjdF90IChpZCBCSUdJTlQsIFBSSU1BUlkgS0VZIChpZCkpIFBBUlRJVElPTiBCWSBS QU5HRSAoaWQpOwogQ1JFQVRFIFRBQkxFIGZyYWN0X3QwIFBBUlRJVElPTiBPRiBmcmFjdF90IEZP UiBWQUxVRVMgRlJPTSAoJzAnKSBUTyAoJzEwMDAnKTsKIENSRUFURSBUQUJMRSBmcmFjdF90MSBQ QVJUSVRJT04gT0YgZnJhY3RfdCBGT1IgVkFMVUVTIEZST00gKCcxMDAwJykgVE8gKCcyMDAwJyk7 CiAtLSBpbnNlcnQgZGF0YQotSU5TRVJUIElOVE8gZnJhY3RfdCAoaWQpIChTRUxFQ1QgZ2VuZXJh dGVfc2VyaWVzKDAsIDE5OTkpKTsKK0lOU0VSVCBJTlRPIGZyYWN0X3QgKGlkKSBTRUxFQ1QgaSBG Uk9NIGdlbmVyYXRlX3NlcmllcygwLCAxOTk5KSBpOwogQU5BTFlaRSBmcmFjdF90OwogLS0gdmVy aWZ5IHBsYW47IG5lc3RlZCBpbmRleCBvbmx5IHNjYW5zCiBTRVQgbWF4X3BhcmFsbGVsX3dvcmtl cnNfcGVyX2dhdGhlciA9IDA7CiBTRVQgZW5hYmxlX3BhcnRpdGlvbndpc2Vfam9pbiA9IG9uOwog RVhQTEFJTiAoQ09TVFMgT0ZGKQotU0VMRUNUICogRlJPTSBmcmFjdF90IHggTEVGVCBKT0lOIGZy YWN0X3QgeSBVU0lORyAoaWQpIE9SREVSIEJZIGlkIEFTQyBMSU1JVCAxMDsKK1NFTEVDVCB4Lmlk LCB5LmlkIEZST00gZnJhY3RfdCB4IExFRlQgSk9JTiBmcmFjdF90IHkgVVNJTkcgKGlkKSBPUkRF UiBCWSB4LmlkIEFTQyBMSU1JVCAxMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFV RVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAtLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQog IExpbWl0CkBAIC00ODkwLDcgKzQ4OTAsNyBAQCBTRUxFQ1QgKiBGUk9NIGZyYWN0X3QgeCBMRUZU IEpPSU4gZnJhY3RfdCB5IFVTSU5HIChpZCkgT1JERVIgQlkgaWQgQVNDIExJTUlUIDEwOwogKDEx IHJvd3MpCiAKIEVYUExBSU4gKENPU1RTIE9GRikKLVNFTEVDVCAqIEZST00gZnJhY3RfdCB4IExF RlQgSk9JTiBmcmFjdF90IHkgVVNJTkcgKGlkKSBPUkRFUiBCWSBpZCBERVNDIExJTUlUIDEwOwor U0VMRUNUIHguaWQsIHkuaWQgRlJPTSBmcmFjdF90IHggTEVGVCBKT0lOIGZyYWN0X3QgeSBVU0lO RyAoaWQpIE9SREVSIEJZIHguaWQgREVTQyBMSU1JVCAxMDsKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIExpbWl0CmRpZmYgLS1naXQgYS9zcmMvdGVz dC9yZWdyZXNzL3NxbC9pbmhlcml0LnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2luaGVyaXQu c3FsCmluZGV4IDE5NWFlZGI1ZmYuLjY5NjAwYmIwNjggMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3Jl Z3Jlc3Mvc3FsL2luaGVyaXQuc3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2luaGVyaXQu c3FsCkBAIC0xLDYgKzEsMTAgQEAKIC0tCiAtLSBUZXN0IGluaGVyaXRhbmNlIGZlYXR1cmVzCiAt LQorCistLSBYWFggVGhlc2UgdGFibGVzIGFyZSBub3QgZHJvcHBlZC4gV2h5PworLS0gWFhYIEFy ZSB0aGV5IG5lZWRlZCBmb3IgbGF0ZXIgdGVzdHM/IEZvciBkdW1wLXJlc3RvcmU/IERyb3BwaW5n IHRoZW0gZG9lc24ndCBmYWlsIGFueSB0ZXN0IGZyb20gY2hlY2std29ybGQuCisKIENSRUFURSBU QUJMRSBhIChhYSBURVhUKTsKIENSRUFURSBUQUJMRSBiIChiYiBURVhUKSBJTkhFUklUUyAoYSk7 CiBDUkVBVEUgVEFCTEUgYyAoY2MgVEVYVCkgSU5IRVJJVFMgKGEpOwpkaWZmIC0tZ2l0IGEvc3Jj L3Rlc3QvcmVncmVzcy9zcWwvam9pbi5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNx bAppbmRleCAyN2U3ZTc0MWExLi4yNGExOGQ4M2I4IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdy ZXNzL3NxbC9qb2luLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbApAQCAt MTU3OSw3ICsxNTc5LDggQEAgcmVzZXQgZW5hYmxlX2hhc2hqb2luOwogcmVzZXQgZW5hYmxlX25l c3Rsb29wOwogCiAtLQotLS0gdGVzdCBqb2luIHJlbW92YWwKKy0tIHRlc3Qgam9pbiByZW1vdmFs IGZvciBwbGFpbiB0YWJsZXMKKy0tIHdlIGhhdmUgYWxtb3N0IHRoZSBzbWFyZSB0ZXN0cyBmb3Ig cGFydGl0aW9uZWQgdGFibGVzIGJlbG93CiAtLQogCiBiZWdpbjsKQEAgLTE2NDgsNiArMTY0OSwz NyBAQCBzZWxlY3QgMSBmcm9tIChzZWxlY3QgYS5pZCBGUk9NIGEgbGVmdCBqb2luIGIgb24gYS5i X2lkID0gYi5pZCkgcSwKIAogcm9sbGJhY2s7CiAKKy0tCistLSB0ZXN0IGpvaW4gcmVtb3ZhbCBm b3IgcGFydGl0aW9uZWQgdGFibGVzCistLSB0aGlzIGlzIGFuYWxvZyB0byB0aGUgbm9uIHBhcnRp dGlvbmVkIGNhc2UgYWJvdmUKKy0tCisKK2JlZ2luOworCitDUkVBVEUgVEFCTEUgYl9wIChpZCBp bnQgUFJJTUFSWSBLRVksIGNfaWQgaW50KSBwYXJ0aXRpb24gYnkgcmFuZ2UoaWQpOworQ1JFQVRF IFRBQkxFIGJfbSBwYXJ0aXRpb24gb2YgYl9wIGZvciB2YWx1ZXMgZnJvbSAoMCkgdG8gKDEwKSBw YXJ0aXRpb24gYnkgcmFuZ2UoaWQpOworQ1JFQVRFIFRBQkxFIGJfYyBwYXJ0aXRpb24gb2YgYl9t IGZvciB2YWx1ZXMgZnJvbSAoMCkgdG8gKDEwKTsKK0NSRUFURSBUQUJMRSBjX3AgKGlkIGludCBQ UklNQVJZIEtFWSkgcGFydGl0aW9uIGJ5IHJhbmdlKGlkKTsKK0NSRUFURSBUQUJMRSBjX20gcGFy dGl0aW9uIG9mIGNfcCBmb3IgdmFsdWVzIGZyb20gKDApIHRvICgxMCkgcGFydGl0aW9uIGJ5IHJh bmdlKGlkKTsKK0NSRUFURSBUQUJMRSBjX2MgcGFydGl0aW9uIG9mIGNfbSBmb3IgdmFsdWVzIGZy b20gKDApIHRvICgxMCk7CitJTlNFUlQgSU5UTyBiX3AgVkFMVUVTICgwLCAwKSwgKDEsIE5VTEwp OworSU5TRVJUIElOVE8gY19wIFZBTFVFUyAoMCksICgxKTsKKworLS0gYWxsIHRocmVlIGNhc2Vz IHNob3VsZCBiZSBvcHRpbWl6YWJsZSBpbnRvIGEgc2ltcGxlIHNlcXNjYW4KK0VYUExBSU4gKENP U1RTIE9GRikgU0VMRUNUIGIwLiogRlJPTSBiX3AgYjAgTEVGVCBKT0lOIGJfcCBiIE9OIGIwLmNf aWQgPSBiLmlkOworRVhQTEFJTiAoQ09TVFMgT0ZGKSBTRUxFQ1QgYi4qIEZST00gYl9wIGIgTEVG VCBKT0lOIGNfcCBjIE9OIGIuY19pZCA9IGMuaWQ7CitFWFBMQUlOIChDT1NUUyBPRkYpCisgIFNF TEVDVCBiMC4qIEZST00gYl9wIGIwIExFRlQgSk9JTiAoYl9wIGIgTEVGVCBKT0lOIGNfcCBjIG9u IGIuY19pZCA9IGMuaWQpCisgIE9OIChiMC5jX2lkID0gYi5pZCk7CisKKy0tIGNoZWNrIG9wdGlt aXphdGlvbiBvZiBvdXRlciBqb2luIHdpdGhpbiBhbm90aGVyIHNwZWNpYWwgam9pbgorRVhQTEFJ TiAoQ09TVFMgT0ZGKQorc2VsZWN0IGlkIGZyb20gYl9wIGIwIFdIRVJFIGlkIGluICgKKwlTRUxF Q1QgYi5pZCBGUk9NIGJfcCBiIExFRlQgSk9JTiBjX3AgYyBvbiBiLmlkID0gYy5pZAorKTsKKwor cm9sbGJhY2s7CisKIGNyZWF0ZSB0ZW1wIHRhYmxlIHBhcmVudCAoayBpbnQgcHJpbWFyeSBrZXks IHBkIGludCk7CiBjcmVhdGUgdGVtcCB0YWJsZSBjaGlsZCAoayBpbnQgdW5pcXVlLCBjZCBpbnQp OwogaW5zZXJ0IGludG8gcGFyZW50IHZhbHVlcyAoMSwgMTApLCAoMiwgMjApLCAoMywgMzApOwpk aWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcGFydGl0aW9uX2pvaW4uc3FsIGIvc3Jj L3Rlc3QvcmVncmVzcy9zcWwvcGFydGl0aW9uX2pvaW4uc3FsCmluZGV4IDY3ZjUwNjM2MWYuLjk0 ZjQ4YTdjNTEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3BhcnRpdGlvbl9qb2lu LnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9wYXJ0aXRpb25fam9pbi5zcWwKQEAgLTEx NDksNyArMTE0OSw3IEBAIENSRUFURSBUQUJMRSBmcmFjdF90MCBQQVJUSVRJT04gT0YgZnJhY3Rf dCBGT1IgVkFMVUVTIEZST00gKCcwJykgVE8gKCcxMDAwJyk7CiBDUkVBVEUgVEFCTEUgZnJhY3Rf dDEgUEFSVElUSU9OIE9GIGZyYWN0X3QgRk9SIFZBTFVFUyBGUk9NICgnMTAwMCcpIFRPICgnMjAw MCcpOwogCiAtLSBpbnNlcnQgZGF0YQotSU5TRVJUIElOVE8gZnJhY3RfdCAoaWQpIChTRUxFQ1Qg Z2VuZXJhdGVfc2VyaWVzKDAsIDE5OTkpKTsKK0lOU0VSVCBJTlRPIGZyYWN0X3QgKGlkKSBTRUxF Q1QgaSBGUk9NIGdlbmVyYXRlX3NlcmllcygwLCAxOTk5KSBpOwogQU5BTFlaRSBmcmFjdF90Owog CiAtLSB2ZXJpZnkgcGxhbjsgbmVzdGVkIGluZGV4IG9ubHkgc2NhbnMKQEAgLTExNTcsMTAgKzEx NTcsMTAgQEAgU0VUIG1heF9wYXJhbGxlbF93b3JrZXJzX3Blcl9nYXRoZXIgPSAwOwogU0VUIGVu YWJsZV9wYXJ0aXRpb253aXNlX2pvaW4gPSBvbjsKIAogRVhQTEFJTiAoQ09TVFMgT0ZGKQotU0VM RUNUICogRlJPTSBmcmFjdF90IHggTEVGVCBKT0lOIGZyYWN0X3QgeSBVU0lORyAoaWQpIE9SREVS IEJZIGlkIEFTQyBMSU1JVCAxMDsKK1NFTEVDVCB4LmlkLCB5LmlkIEZST00gZnJhY3RfdCB4IExF RlQgSk9JTiBmcmFjdF90IHkgVVNJTkcgKGlkKSBPUkRFUiBCWSB4LmlkIEFTQyBMSU1JVCAxMDsK IAogRVhQTEFJTiAoQ09TVFMgT0ZGKQotU0VMRUNUICogRlJPTSBmcmFjdF90IHggTEVGVCBKT0lO IGZyYWN0X3QgeSBVU0lORyAoaWQpIE9SREVSIEJZIGlkIERFU0MgTElNSVQgMTA7CitTRUxFQ1Qg eC5pZCwgeS5pZCBGUk9NIGZyYWN0X3QgeCBMRUZUIEpPSU4gZnJhY3RfdCB5IFVTSU5HIChpZCkg T1JERVIgQlkgeC5pZCBERVNDIExJTUlUIDEwOwogCiAtLSBjbGVhbnVwCiBEUk9QIFRBQkxFIGZy YWN0X3Q7Ci0tIAoyLjM1LjMKCg== --_004_99fad49d2cd341f38bcbf62e495eb510indexde_--