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 1lSO11-0008CB-Oj for pgsql-hackers@arkaria.postgresql.org; Fri, 02 Apr 2021 17:55:28 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1lSO10-0001tU-LK for pgsql-hackers@arkaria.postgresql.org; Fri, 02 Apr 2021 17:55:26 +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 1lSO10-0001tB-4E for pgsql-hackers@lists.postgresql.org; Fri, 02 Apr 2021 17:55:26 +0000 Received: from mxout2.routing.net ([2a03:2900:1:a::b]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lSO0v-00078y-Vs for pgsql-hackers@lists.postgresql.org; Fri, 02 Apr 2021 17:55:25 +0000 Received: from mxbox4.masterlogin.de (unknown [192.168.10.79]) by mxout2.routing.net (Postfix) with ESMTP id AE1725FC1E; Fri, 2 Apr 2021 17:55:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mailerdienst.de; s=20200217; t=1617386117; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=zy8iLMMb5khbXaDFEpgmK+YpXglimRHFnV5/APQ6BvQ=; b=UaK19NEs5gnqRKn0AwZec3gIFjaB5HxzYO05oZbDshaJa4IuuWCynkDOyll0qzWu3a6aZC TXgusN62MsnHmwq941SpJBFYfK7nqPW8WATWpuUpddzExHaPk1ktLj7OrVUp782V0SGjKs QTeMSHC4sKAWkaEgdKTEZw3Q0FHyDYs= Received: from remote.index.de (business-90-187-114-221.pool2.vodafone-ip.de [90.187.114.221]) by mxbox4.masterlogin.de (Postfix) with ESMTPSA id 3F402806E7; Fri, 2 Apr 2021 17:55:17 +0000 (UTC) Received: from acedia.index-gruppe.local (192.168.3.121) by acedia.index-gruppe.local (192.168.3.121) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2176.2; Fri, 2 Apr 2021 19:55:16 +0200 Received: from acedia.index-gruppe.local ([fe80::ecd1:5d0a:a834:dd56]) by acedia.index-gruppe.local ([fe80::ecd1:5d0a:a834:dd56%5]) with mapi id 15.01.2176.009; Fri, 2 Apr 2021 19:55:16 +0200 From: Arne Roland To: Alvaro Herrera CC: David Steele , Pg Hackers Subject: Re: Rename of triggers for partitioned tables Thread-Topic: Rename of triggers for partitioned tables Thread-Index: AQHWxEk1+rora/wutkWbcRQhC03q0KnbGQ2sgAAECBOATmSTgIBhAeKAgBDG6bOAACCNT4AAKOcAgAAj1kP///tHgIAEsSJngAHhzjA= Date: Fri, 2 Apr 2021 17:55:16 +0000 Message-ID: <4a0f161e127444e2aea52b325596645b@index.de> References: <6e04673973bf4922bf30fe22d5b0f067@index.de>,<20210329151657.GA423@alvherre.pgsql>,<14f5c62614554ac7b730fc1ee26db83d@index.de> In-Reply-To: <14f5c62614554ac7b730fc1ee26db83d@index.de> Accept-Language: en-US, de-DE Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-originating-ip: [10.255.1.33] Content-Type: multipart/mixed; boundary="_004_4a0f161e127444e2aea52b325596645bindexde_" MIME-Version: 1.0 X-Mail-ID: 0dde17f3-342c-4359-b171-b4b7144815e4 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --_004_4a0f161e127444e2aea52b325596645bindexde_ Content-Type: multipart/alternative; boundary="_000_4a0f161e127444e2aea52b325596645bindexde_" --_000_4a0f161e127444e2aea52b325596645bindexde_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi, attached a patch with some cleanup and a couple of test cases. The lookup i= s now done with the parentid and the renaming affects detached partitions a= s well. The test cases are not perfectly concise, but only add about 0.4 % to the t= otal runtime of regression tests at my machine. So I didn't bother to much.= They only consist of basic sql tests. Further feedback appreciated! Thank you! Regards Arne ________________________________ From: Arne Roland Sent: Thursday, April 1, 2021 4:38:59 PM To: Alvaro Herrera Cc: David Steele; Pg Hackers Subject: Re: Rename of triggers for partitioned tables Alvaro Herrera wrote: > I think the child cannot not have a corresponding trigger. If you try > to drop the trigger on child, it should say that it cannot be dropped > because the trigger on parent requires it. So I don't think there's any > case where altering name of trigger in parent would raise an user-facing > error. If you can't find the trigger in child, that's a case of catalog > corruption [...] Ah, I didn't know that. That changes my reasoning about that. I only knew, = that the alter table ... detach partition ... doesn't detach the child trig= ger from the partitioned trigger, but the the attach partition seem to add = one. Maybe we should be able to make sure that there is a one to one corres= pondence for child triggers and child partitions. Currently upon detaching we keep the trigger within the partitioned trigger= of the parent relation. (So the trigger remains in place and can only be d= ropped with the parent one.) Only we try to attach the partition again any = partitioned triggers are simply removed. One idea would be to detach partitioned triggers there in a similar manner = we detach partitioned indexes. That could give above guarantee. (At least i= f one would be willing to write a migration for that.) But then we can't te= ll anymore where the trigger stems from. That hence would break our attach/= detach workflow. I was annoyed by the inability to drop partitioned triggers from detached p= artitions, but it seems I just got a workaround. Ugh. This is a bit of a sidetrack discussion, but it is related. > Consider this. You have table p and partition p1. Add trigger t to p, > and do > ALTER TRIGGER t ON p1 RENAME TO q; > What I'm saying is that if you later do > ALTER TRIGGER t ON ONLY p RENAME TO r; > then the trigger on parent is changed, and the trigger on child stays q. > If you later do > ALTER TRIGGER r ON p RENAME TO s; > then triggers on both tables end up with name s. If we get into the mindset of expecting one trigger on the child, we have t= he following edge case: - The trigger is renamed. You seem to favor the silent rename in that case = over raising a notice (or even an error). I am not convinced a notice would= n't the better in that case. - The trigger is outside of partitioned table. That still means that the tr= igger might still be in the inheritance tree, but likely isn't. Should we r= ename it anyways, or skip that? Should be raise a notice about what we are = doing here? I think that would be helpful to the end user. > Hmm, ok, maybe this is sufficient, I didn't actually test it. I think > you do need to add a few test cases to ensure everything is sane. Make > sure to verify what happens if you have multi-level partitioning > (grandparent, parent, child) and you ALTER the one in the middle. Also > things like if parent has two children and one child has multiple > children. The test I had somewhere upwards this thread, already tested that. I am not sure how to add a test for pg_dump though. Can you point me to the= location in pg_regress for pg_dump? > Also, please make sure that it works correctly with INHERITS (legacy > inheritance). We probably don't want to cause recursion in that case. That works, but I will add a test to make sure it stays that way. Thank you= for your input! Regards Arne --_000_4a0f161e127444e2aea52b325596645bindexde_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable

Hi,


attached a patch with some cleanup and a couple of test cases. The looku= p is now done with the parentid and the renaming affects detached partition= s as well.


The test cases are not perfectly concise, but only add about 0.4 % to th= e total runtime of regression tests at my machine. So I didn't bother to mu= ch. They only consist of basic sql tests.


Further feedback appreciated! Thank you!


Regards

Arne



From: Arne Roland <A.Rol= and@index.de>
Sent: Thursday, April 1, 2021 4:38:59 PM
To: Alvaro Herrera
Cc: David Steele; Pg Hackers
Subject: Re: Rename of triggers for partitioned tables
 
Alvaro Herrera wrote:
> I think the child cannot not have a corresponding trigger.  = If you try
> to drop the trigger on child, it should say that it canno= t be dropped
> because the trigger on parent requires it.  So I don= 't think there's any
> case where altering name of trigger in parent would raise= an user-facing
> error.  If you can't find the trigger in child, that= 's a case of catalog
> corruption [...]

Ah, I didn't know that. That changes my reasoning about that. I only knew, = that the alter table ... detach partition ... doesn't detach the child trig= ger from the partitioned trigger, but the the attach partition seem to add = one. Maybe we should be able to make sure that there is a one to one correspondence for child triggers and= child partitions.

Currently upon detaching we keep the trigger withi= n the partitioned trigger of the parent relation. (So the trigger remains i= n place and can only be dropped with the parent one.) Only we try to attach= the partition again any partitioned triggers are simply removed.

One idea would be to detach partitioned trig= gers there in a similar manner we detach partitioned indexes. That co= uld give above guarantee. (At least if one would be willing to write a migr= ation for that.) But then we can't tell anymore where the trigger stems from. That hen= ce would break our attach/detach workflow.

I was annoyed by the inability t= o drop partitioned triggers from detached partitions, but it seems I just g= ot a workaround. Ugh.

This is a bit of a sidetrack dis= cussion, but it is related.

> Consider this.  You have table p and partition p1.  Add trig= ger t to p,
> and do
> ALTER TRIGGER t ON p1 RENAME TO q;

> What I'm saying is that if you later do
> ALTER TRIGGER t ON ONLY p RENAME TO r;
> then the trigger on parent is changed, and the trigger on child stays = q.
> If you later do
> ALTER TRIGGER r ON p RENAME TO s;
> then triggers on both tables end up with name s.

If we get into the mindset of expecting one trigger on the child, we have t= he following edge case:

- The trigger is renamed. You seem to favor the si= lent rename in that case over raising a notice (or even an error). I am not= convinced a notice wouldn't the better in that case.
- The trigger is outside of partitioned table. Tha= t still means that the trigger might still be in the inheritance tree, but = likely isn't. Should we rename it anyways, or skip that? Should be raise a = notice about what we are doing here? I think that would be helpful to the end user.

> Hmm, ok, maybe this is sufficient, I didn't actually test it.  I = think
> you do need to add a few test cases to ensure everything is sane. = ; Make
> sure to verify what happens if you have multi-level partitioning
> (grandparent, parent, child) and you ALTER the one in the middle. = ; Also
> things like if parent has two children and one child has multiple
> children.

The test I had somewhere upwards this thread, alre= ady tested that.

I am not sure how to add a test for pg_dump though= . Can you point me to the location in pg_regress for pg_dump?

> Also, please make sure that it works correctly with INHERITS (legacy > inheritance).  We probably don't want to cause recursion in that = case.

That works, but I will add a test to make sure it stays that way. Thank you= for your input!

Regards
Arne
--_000_4a0f161e127444e2aea52b325596645bindexde_-- --_004_4a0f161e127444e2aea52b325596645bindexde_ Content-Type: text/x-patch; name="recursive_tgrename.5.patch" Content-Description: recursive_tgrename.5.patch Content-Disposition: attachment; filename="recursive_tgrename.5.patch"; size=18447; creation-date="Fri, 02 Apr 2021 17:53:50 GMT"; modification-date="Fri, 02 Apr 2021 17:53:50 GMT" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3RyaWdnZXIuYyBiL3NyYy9iYWNrZW5k L2NvbW1hbmRzL3RyaWdnZXIuYwppbmRleCA3MzgzZDU5OTRlLi45NmNlZmVmN2M2IDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy90cmlnZ2VyLmMKKysrIGIvc3JjL2JhY2tlbmQvY29t bWFuZHMvdHJpZ2dlci5jCkBAIC0xMzI2LDcgKzEzMjYsNiBAQCBnZXRfdHJpZ2dlcl9vaWQoT2lk IHJlbGlkLCBjb25zdCBjaGFyICp0cmlnbmFtZSwgYm9vbCBtaXNzaW5nX29rKQogCiAJdGdzY2Fu ID0gc3lzdGFibGVfYmVnaW5zY2FuKHRncmVsLCBUcmlnZ2VyUmVsaWROYW1lSW5kZXhJZCwgdHJ1 ZSwKIAkJCQkJCQkJTlVMTCwgMiwgc2tleSk7Ci0KIAl0dXAgPSBzeXN0YWJsZV9nZXRuZXh0KHRn c2Nhbik7CiAKIAlpZiAoIUhlYXBUdXBsZUlzVmFsaWQodHVwKSkKQEAgLTEzNDgsMTIgKzEzNDcs OCBAQCBnZXRfdHJpZ2dlcl9vaWQoT2lkIHJlbGlkLCBjb25zdCBjaGFyICp0cmlnbmFtZSwgYm9v bCBtaXNzaW5nX29rKQogCXJldHVybiBvaWQ7CiB9CiAKLS8qCi0gKiBQZXJmb3JtIHBlcm1pc3Np b25zIGFuZCBpbnRlZ3JpdHkgY2hlY2tzIGJlZm9yZSBhY3F1aXJpbmcgYSByZWxhdGlvbiBsb2Nr LgotICovCiBzdGF0aWMgdm9pZAotUmFuZ2VWYXJDYWxsYmFja0ZvclJlbmFtZVRyaWdnZXIoY29u c3QgUmFuZ2VWYXIgKnJ2LCBPaWQgcmVsaWQsIE9pZCBvbGRyZWxpZCwKLQkJCQkJCQkJIHZvaWQg KmFyZykKK2NhbGxiYWNrRm9yUmVuYW1lVHJpZ2dlcihjaGFyICpyZWxuYW1lLCBPaWQgcmVsaWQp CiB7CiAJSGVhcFR1cGxlCXR1cGxlOwogCUZvcm1fcGdfY2xhc3MgZm9ybTsKQEAgLTEzNzAsMjUg KzEzNjUsMzYgQEAgUmFuZ2VWYXJDYWxsYmFja0ZvclJlbmFtZVRyaWdnZXIoY29uc3QgUmFuZ2VW YXIgKnJ2LCBPaWQgcmVsaWQsIE9pZCBvbGRyZWxpZCwKIAkJZXJlcG9ydChFUlJPUiwKIAkJCQko ZXJyY29kZShFUlJDT0RFX1dST05HX09CSkVDVF9UWVBFKSwKIAkJCQkgZXJybXNnKCJcIiVzXCIg aXMgbm90IGEgdGFibGUsIHZpZXcsIG9yIGZvcmVpZ24gdGFibGUiLAotCQkJCQkJcnYtPnJlbG5h bWUpKSk7CisJCQkJCQlyZWxuYW1lKSkpOwogCiAJLyogeW91IG11c3Qgb3duIHRoZSB0YWJsZSB0 byByZW5hbWUgb25lIG9mIGl0cyB0cmlnZ2VycyAqLwogCWlmICghcGdfY2xhc3Nfb3duZXJjaGVj ayhyZWxpZCwgR2V0VXNlcklkKCkpKQotCQlhY2xjaGVja19lcnJvcihBQ0xDSEVDS19OT1RfT1dO RVIsIGdldF9yZWxraW5kX29ianR5cGUoZ2V0X3JlbF9yZWxraW5kKHJlbGlkKSksIHJ2LT5yZWxu YW1lKTsKKwkJYWNsY2hlY2tfZXJyb3IoQUNMQ0hFQ0tfTk9UX09XTkVSLCBnZXRfcmVsa2luZF9v Ymp0eXBlKGdldF9yZWxfcmVsa2luZChyZWxpZCkpLCByZWxuYW1lKTsKIAlpZiAoIWFsbG93U3lz dGVtVGFibGVNb2RzICYmIElzU3lzdGVtQ2xhc3MocmVsaWQsIGZvcm0pKQogCQllcmVwb3J0KEVS Uk9SLAogCQkJCShlcnJjb2RlKEVSUkNPREVfSU5TVUZGSUNJRU5UX1BSSVZJTEVHRSksCiAJCQkJ IGVycm1zZygicGVybWlzc2lvbiBkZW5pZWQ6IFwiJXNcIiBpcyBhIHN5c3RlbSBjYXRhbG9nIiwK LQkJCQkJCXJ2LT5yZWxuYW1lKSkpOworCQkJCQkJcmVsbmFtZSkpKTsKIAogCVJlbGVhc2VTeXND YWNoZSh0dXBsZSk7CiB9CiAKIC8qCi0gKgkJcmVuYW1ldHJpZwkJLSBjaGFuZ2VzIHRoZSBuYW1l IG9mIGEgdHJpZ2dlciBvbiBhIHJlbGF0aW9uCisgKiBQZXJmb3JtIHBlcm1pc3Npb25zIGFuZCBp bnRlZ3JpdHkgY2hlY2tzIGJlZm9yZSBhY3F1aXJpbmcgYSByZWxhdGlvbiBsb2NrLgorICovCitz dGF0aWMgdm9pZAorUmFuZ2VWYXJDYWxsYmFja0ZvclJlbmFtZVRyaWdnZXIoY29uc3QgUmFuZ2VW YXIgKnJ2LCBPaWQgcmVsaWQsIE9pZCBvbGRyZWxpZCwKKwkJCQkJCQkJIHZvaWQgKmFyZykKK3sK KwljYWxsYmFja0ZvclJlbmFtZVRyaWdnZXIocnYtPnJlbG5hbWUsIHJlbGlkKTsKK30KKworLyoK KyAqCQlyZW5hbWVvbmx5dHJpZwkJLSBjaGFuZ2VzIHRoZSBuYW1lIG9mIGEgdHJpZ2dlciBvbiBh IHJlbGF0aW9uCiAgKgogICoJCXRyaWdnZXIgbmFtZSBpcyBjaGFuZ2VkIGluIHRyaWdnZXIgY2F0 YWxvZy4KICAqCQlObyByZWNvcmQgb2YgdGhlIHByZXZpb3VzIG5hbWUgaXMga2VwdC4KKyAqCQlU aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgcm93IGlzIGFscmVhZHkgbG9ja2VkCiAgKgog ICoJCWdldCBwcm9wZXIgcmVscmVsYXRpb24gZnJvbSByZWxhdGlvbiBjYXRhbG9nIChpZiBub3Qg YXJnKQogICoJCXNjYW4gdHJpZ2dlciBjYXRhbG9nCkBAIC0xMzk4LDQxICsxNDA0LDI3IEBAIFJh bmdlVmFyQ2FsbGJhY2tGb3JSZW5hbWVUcmlnZ2VyKGNvbnN0IFJhbmdlVmFyICpydiwgT2lkIHJl bGlkLCBPaWQgb2xkcmVsaWQsCiAgKgkJdXBkYXRlIHJvdyBpbiBjYXRhbG9nCiAgKi8KIE9iamVj dEFkZHJlc3MKLXJlbmFtZXRyaWcoUmVuYW1lU3RtdCAqc3RtdCkKK3JlbmFtZW9ubHl0cmlnKFJl bmFtZVN0bXQgKnN0bXQsIFJlbGF0aW9uIHRncmVsLCBPaWQgcmVsaWQsIE9pZCB0Z3BhcmVudCkK IHsKIAlPaWQJCQl0Z29pZDsKIAlSZWxhdGlvbgl0YXJnZXRyZWw7Ci0JUmVsYXRpb24JdGdyZWw7 CiAJSGVhcFR1cGxlCXR1cGxlOwogCVN5c1NjYW5EZXNjIHRnc2NhbjsKIAlTY2FuS2V5RGF0YSBr ZXlbMl07Ci0JT2lkCQkJcmVsaWQ7CiAJT2JqZWN0QWRkcmVzcyBhZGRyZXNzOworCWludAkJCW1h dGNoZWQ7CiAKLQkvKgotCSAqIExvb2sgdXAgbmFtZSwgY2hlY2sgcGVybWlzc2lvbnMsIGFuZCBh Y3F1aXJlIGxvY2sgKHdoaWNoIHdlIHdpbGwgTk9UCi0JICogcmVsZWFzZSB1bnRpbCBlbmQgb2Yg dHJhbnNhY3Rpb24pLgotCSAqLwotCXJlbGlkID0gUmFuZ2VWYXJHZXRSZWxpZEV4dGVuZGVkKHN0 bXQtPnJlbGF0aW9uLCBBY2Nlc3NFeGNsdXNpdmVMb2NrLAotCQkJCQkJCQkJIDAsCi0JCQkJCQkJ CQkgUmFuZ2VWYXJDYWxsYmFja0ZvclJlbmFtZVRyaWdnZXIsCi0JCQkJCQkJCQkgTlVMTCk7CiAK IAkvKiBIYXZlIGxvY2sgYWxyZWFkeSwgc28ganVzdCBuZWVkIHRvIGJ1aWxkIHJlbGNhY2hlIGVu dHJ5LiAqLwogCXRhcmdldHJlbCA9IHJlbGF0aW9uX29wZW4ocmVsaWQsIE5vTG9jayk7CiAKKwog CS8qCiAJICogU2NhbiBwZ190cmlnZ2VyIHR3aWNlIGZvciBleGlzdGluZyB0cmlnZ2VycyBvbiBy ZWxhdGlvbi4gIFdlIGRvIHRoaXMgaW4KIAkgKiBvcmRlciB0byBlbnN1cmUgYSB0cmlnZ2VyIGRv ZXMgbm90IGV4aXN0IHdpdGggbmV3bmFtZSAoVGhlIHVuaXF1ZSBpbmRleAogCSAqIG9uIHRncmVs aWQvdGduYW1lIHdvdWxkIGNvbXBsYWluIGFueXdheSkgYW5kIHRvIGVuc3VyZSBhIHRyaWdnZXIg ZG9lcwogCSAqIGV4aXN0IHdpdGggb2xkbmFtZS4KIAkgKgotCSAqIE5PVEUgdGhhdCB0aGlzIGlz IGNvb2wgb25seSBiZWNhdXNlIHdlIGhhdmUgQWNjZXNzRXhjbHVzaXZlTG9jayBvbiB0aGUKLQkg KiByZWxhdGlvbiwgc28gdGhlIHRyaWdnZXIgc2V0IHdvbid0IGJlIGNoYW5naW5nIHVuZGVybmVh dGggdXMuCi0JICovCi0JdGdyZWwgPSB0YWJsZV9vcGVuKFRyaWdnZXJSZWxhdGlvbklkLCBSb3dF eGNsdXNpdmVMb2NrKTsKLQotCS8qCiAJICogRmlyc3QgcGFzcyAtLSBsb29rIGZvciBuYW1lIGNv bmZsaWN0CiAJICovCiAJU2NhbktleUluaXQoJmtleVswXSwKQEAgLTE0NTMsMzQgKzE0NDUsNDgg QEAgcmVuYW1ldHJpZyhSZW5hbWVTdG10ICpzdG10KQogCXN5c3RhYmxlX2VuZHNjYW4odGdzY2Fu KTsKIAogCS8qCi0JICogU2Vjb25kIHBhc3MgLS0gbG9vayBmb3IgdHJpZ2dlciBleGlzdGluZyB3 aXRoIG9sZG5hbWUgYW5kIHVwZGF0ZQorCSAqIFNlY29uZCBwYXNzIC0tIGxvb2sgZm9yIHRyaWdn ZXIgZXhpc3RpbmcgYW5kIHVwZGF0ZSBpZiBwZ3BhcmVudCBpcworCSAqIG1hdGNoaW5nCiAJICov CiAJU2NhbktleUluaXQoJmtleVswXSwKIAkJCQlBbnVtX3BnX3RyaWdnZXJfdGdyZWxpZCwKIAkJ CQlCVEVxdWFsU3RyYXRlZ3lOdW1iZXIsIEZfT0lERVEsCiAJCQkJT2JqZWN0SWRHZXREYXR1bShy ZWxpZCkpOwotCVNjYW5LZXlJbml0KCZrZXlbMV0sCi0JCQkJQW51bV9wZ190cmlnZ2VyX3RnbmFt ZSwKLQkJCQlCVEVxdWFsU3RyYXRlZ3lOdW1iZXIsIEZfTkFNRUVRLAotCQkJCVBvaW50ZXJHZXRE YXR1bShzdG10LT5zdWJuYW1lKSk7CisKIAl0Z3NjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4odGdy ZWwsIFRyaWdnZXJSZWxpZE5hbWVJbmRleElkLCB0cnVlLAotCQkJCQkJCQlOVUxMLCAyLCBrZXkp OwotCWlmIChIZWFwVHVwbGVJc1ZhbGlkKHR1cGxlID0gc3lzdGFibGVfZ2V0bmV4dCh0Z3NjYW4p KSkKKwkJCQkJCQkJTlVMTCwgMSwga2V5KTsKKwltYXRjaGVkID0gMDsKKwl3aGlsZSAoSGVhcFR1 cGxlSXNWYWxpZCh0dXBsZSA9IHN5c3RhYmxlX2dldG5leHQodGdzY2FuKSkpCiAJewogCQlGb3Jt X3BnX3RyaWdnZXIgdHJpZ2Zvcm07CiAKKwkJdHJpZ2Zvcm0gPSAoRm9ybV9wZ190cmlnZ2VyKSBH RVRTVFJVQ1QodHVwbGUpOworCisJCS8qCisJCSAqIFNraXAgdHJpZ2dlcnMgdGhhdCBub3QgcmVs ZXZhbnQuIFJlbGV2YW50IGlzIHRoZSBwYXJlbnQgdHJpZ2dlciBhcworCQkgKiB3ZWxsIGFzIHBh cnRzIG9mIHRoZSBjdXJyZW50IGRpc3RyaWJ1dGVkIHRyaWdnZXIuCisJCSAqLworCQlpZiAodGdw YXJlbnQgPT0gMCAmJiBzdHJjbXAoc3RtdC0+c3VibmFtZSwgTmFtZVN0cih0cmlnZm9ybS0+dGdu YW1lKSkgfHwgdGdwYXJlbnQgJiYgdHJpZ2Zvcm0tPnRncGFyZW50aWQgIT0gdGdwYXJlbnQpCisJ CQljb250aW51ZTsKKworCQlpZiAoc3RyY21wKHN0bXQtPnN1Ym5hbWUsIE5hbWVTdHIodHJpZ2Zv cm0tPnRnbmFtZSkpKQorCQl7CisJCQllcmVwb3J0KE5PVElDRSwKKwkJCQkJKGVycm1zZygidHJp Z2dlciBcIiVzXCIgZm9yIHRhYmxlIFwiJXNcIiB3YXMgbm90IG5hbWVkIFwiJXNcIiwgcmVuYW1p bmcgYW55d2F5cyIsCisJCQkJCQkJTmFtZVN0cih0cmlnZm9ybS0+dGduYW1lKSwgUmVsYXRpb25H ZXRSZWxhdGlvbk5hbWUodGFyZ2V0cmVsKSwgc3RtdC0+c3VibmFtZSkpKTsKKwkJfQorCiAJCS8q CiAJCSAqIFVwZGF0ZSBwZ190cmlnZ2VyIHR1cGxlIHdpdGggbmV3IHRnbmFtZS4KIAkJICovCiAJ CXR1cGxlID0gaGVhcF9jb3B5dHVwbGUodHVwbGUpOwkvKiBuZWVkIGEgbW9kaWZpYWJsZSBjb3B5 ICovCiAJCXRyaWdmb3JtID0gKEZvcm1fcGdfdHJpZ2dlcikgR0VUU1RSVUNUKHR1cGxlKTsKLQkJ dGdvaWQgPSB0cmlnZm9ybS0+b2lkOwotCiAJCW5hbWVzdHJjcHkoJnRyaWdmb3JtLT50Z25hbWUs CiAJCQkJICAgc3RtdC0+bmV3bmFtZSk7Ci0KIAkJQ2F0YWxvZ1R1cGxlVXBkYXRlKHRncmVsLCAm dHVwbGUtPnRfc2VsZiwgdHVwbGUpOwogCisJCXRnb2lkID0gdHJpZ2Zvcm0tPm9pZDsKKwogCQlJ bnZva2VPYmplY3RQb3N0QWx0ZXJIb29rKFRyaWdnZXJSZWxhdGlvbklkLAogCQkJCQkJCQkgIHRn b2lkLCAwKTsKIApAQCAtMTQ5MCwyOSArMTQ5NiwxMTggQEAgcmVuYW1ldHJpZyhSZW5hbWVTdG10 ICpzdG10KQogCQkgKiBlbnRyaWVzLiAgKElkZWFsbHkgdGhpcyBzaG91bGQgaGFwcGVuIGF1dG9t YXRpY2FsbHkuLi4pCiAJCSAqLwogCQlDYWNoZUludmFsaWRhdGVSZWxjYWNoZSh0YXJnZXRyZWwp OworCQltYXRjaGVkKys7CiAJfQotCWVsc2UKKworCXN5c3RhYmxlX2VuZHNjYW4odGdzY2FuKTsK KworCS8qCisJICogVGhlcmUgYWx3YXlzIHNob3VsZCBiZSBleGFjdGx5IG9uZSBtYXRjaGluZyB0 cmlnZ2VyIG9uIHRoZSBjaGlsZAorCSAqIHBhcnRpdGlvbi4gSWYgdGhlcmUgaXNuJ3QgZmFpbCB3 aXRoIGFuIGVycm9yLgorCSAqLworCWlmICghbWF0Y2hlZCkKIAl7CiAJCWVyZXBvcnQoRVJST1Is Ci0JCQkJKGVycmNvZGUoRVJSQ09ERV9VTkRFRklORURfT0JKRUNUKSwKLQkJCQkgZXJybXNnKCJ0 cmlnZ2VyIFwiJXNcIiBmb3IgdGFibGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IiwKKwkJCQkoZXJy Y29kZShFUlJDT0RFX0RBVEFfQ09SUlVQVEVEKSwKKwkJCQkgZXJybXNnKCJ0cmlnZ2VyIFwiJXNc IiBmb3IgY2hpbGQgdGFibGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IiwKKwkJCQkJCXN0bXQtPnN1 Ym5hbWUsIFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHRhcmdldHJlbCkpKSk7CisJfQorCWlmICht YXRjaGVkID4gMSkKKwl7CisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9E QVRBX0NPUlJVUFRFRCksCisJCQkJIGVycm1zZygibXVsdGlwbGUgdHJpZ2dlcnMgbWF0Y2ggXCIl c1wiIGZvciB0YWJsZSBcIiVzXCIsIHRoaXMgbWlnaHQgaW5kaWNhdGUgYSBkYXRhIGNvcnJ1cHRp b24iLAogCQkJCQkJc3RtdC0+c3VibmFtZSwgUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUodGFyZ2V0 cmVsKSkpKTsKIAl9CiAKIAlPYmplY3RBZGRyZXNzU2V0KGFkZHJlc3MsIFRyaWdnZXJSZWxhdGlv bklkLCB0Z29pZCk7CiAKLQlzeXN0YWJsZV9lbmRzY2FuKHRnc2Nhbik7Ci0KLQl0YWJsZV9jbG9z ZSh0Z3JlbCwgUm93RXhjbHVzaXZlTG9jayk7CiAKIAkvKgogCSAqIENsb3NlIHJlbCwgYnV0IGtl ZXAgZXhjbHVzaXZlIGxvY2shCiAJICovCisJcmVsYXRpb25fY2xvc2UodGdyZWwsIE5vTG9jayk7 CiAJcmVsYXRpb25fY2xvc2UodGFyZ2V0cmVsLCBOb0xvY2spOwogCiAJcmV0dXJuIGFkZHJlc3M7 CiB9CiAKKy8qCisgKgkJcmVuYW1ldHJpZwkJLSBjaGFuZ2VzIHRoZSBuYW1lIG9mIGEgdHJpZ2dl ciBvbiBhIHBvc3NpYmx5IHBhcnRpdGlvbmVkIHJlbGF0aW9uIHJlY3VyaXN2ZWx5CisgKgorICoJ CSAgYWx0ZXIgbmFtZSBvZiBwYXJlbnQgdHJpZ2dlciB1c2luZyByZW5hbWVvbmx5dHJpZworICoJ CSAgcmVjdXJzaXZlIG92ZXIgY2hpbGRyZW4gYW5kIGNoYW5nZSB0aGVpciBuYW1lcyBpbiB0aGUg c2FtZSBtYW5uZXIKKyAqCisgKi8KK09iamVjdEFkZHJlc3MKK3JlbmFtZXRyaWdIZWxwZXIoUmVu YW1lU3RtdCAqc3RtdCwgT2lkIHRnb2lkLCBPaWQgcmVsaWQpCit7CisKKwlSZWxhdGlvbgl0Z3Jl bDsKKwlPYmplY3RBZGRyZXNzIHRnYWRkcmVzczsKKwlIZWFwVHVwbGUJdHVwbGU7CisJY2hhcgkJ cmVsa2luZDsKKworCS8qCisJICogTk9URSB0aGF0IHRoaXMgaXMgY29vbCBvbmx5IGJlY2F1c2Ug d2UgaGF2ZSBBY2Nlc3NFeGNsdXNpdmVMb2NrIG9uIHRoZQorCSAqIHJlbGF0aW9ucywgc28gbmVp dGhlciB0aGUgdHJpZ2dlciBzZXQgbm9yIHRoZSB0YWJsZSBpdHNlbGYgd2lsbCBiZQorCSAqIGNo YW5naW5nIHVuZGVybmVhdGggdXMuCisJICovCisJdGdyZWwgPSB0YWJsZV9vcGVuKFRyaWdnZXJS ZWxhdGlvbklkLCBSb3dFeGNsdXNpdmVMb2NrKTsKKworCS8qCisJICogVGhlIGxhc3QgY2FsbCBv ZiByZW5hbWV0cmlnIG9yIHJlbmFtZXRyaWdIZWxwZXIgYWxyZWFkeSBsb2NrZWQgdGhpcworCSAq IHJlbGF0aW9uLgorCSAqLworCXRnYWRkcmVzcyA9IHJlbmFtZW9ubHl0cmlnKHN0bXQsIHRncmVs LCByZWxpZCwgdGdvaWQpOworCisJLyoKKwkgKiBJbiBjYXNlIHdlIGhhdmUgYSBwYXJ0aW9uZWQg dGFibGUsIHdlIHRyYXZlcnNlIHRoZW0gYW5kIHJlbmFtZSBldmVyeQorCSAqIGRlcGVuZGVuZCB0 cmlnZ2VyLCB1bmxlc3MgT04gT05MWSB3YXMgc3BlY2lmaWVkLgorCSAqLworCXR1cGxlID0gU2Vh cmNoU3lzQ2FjaGUxKFJFTE9JRCwgT2JqZWN0SWRHZXREYXR1bShyZWxpZCkpOworCXJlbGtpbmQg PSAoKEZvcm1fcGdfY2xhc3MpIEdFVFNUUlVDVCh0dXBsZSkpLT5yZWxraW5kOworCVJlbGVhc2VT eXNDYWNoZSh0dXBsZSk7CQkvKiBXZSBhcmUgc3RpbGwgaG9sZGluZyB0aGUKKwkJCQkJCQkJICog QWNjZXNzRXhjbHVzaXZlTG9jay4gKi8KKwlpZiAoc3RtdC0+cmVsYXRpb24tPmluaCAmJiByZWxr aW5kID09IFJFTEtJTkRfUEFSVElUSU9ORURfVEFCTEUgJiYgaGFzX3N1YmNsYXNzKHJlbGlkKSkK Kwl7CisJCUxpc3RDZWxsICAgKmNoaWxkOworCQlMaXN0CSAgICpjaGlsZHJlbjsKKworCQkvKiBN YWtlIHN1cmUgaXQgc3RheXMgYSBjaGlsZCwgZXZlbiBpZiBpdCdzIGRldGFjaGVkLiAqLworCQlj aGlsZHJlbiA9IGZpbmRfaW5oZXJpdGFuY2VfY2hpbGRyZW4ocmVsaWQsIEFjY2Vzc0V4Y2x1c2l2 ZUxvY2ssIHRydWUpOworCisJCS8qCisJCSAqIGZpbmRfaW5oZXJpdGFuY2VfY2hpbGRyZW4gZG9l c24ndCB3b3JrIHJlY3Vyc2l2ZWx5LiB3ZSBjaGVjayBldmVyeQorCQkgKiBsYXllciBpbmRpdmlk dWFsbHkgdG8gZW5zdXJlIHRoYXQgdGhlIHRyaWdnZXIgb2YgdGhlIGNoaWxkIGlzCisJCSAqIG1h dGNoaW5nIGluIGNhc2UgaXQncyBhIHBhcnRpdGlvbmVkIHRhYmxlIGl0c2VsZi4KKwkJICovCisJ CWZvcmVhY2goY2hpbGQsIGNoaWxkcmVuKQorCQl7CisJCQlPaWQJCQljaGlsZHJlbGlkID0gbGZp cnN0X29pZChjaGlsZCk7CisKKwkJCWlmIChjaGlsZHJlbGlkID09IHJlbGlkKQorCQkJCWNvbnRp bnVlOworCQkJcmVuYW1ldHJpZ0hlbHBlcihzdG10LCB0Z2FkZHJlc3Mub2JqZWN0SWQsIGNoaWxk cmVsaWQpOworCQl9CisJfQorCXJldHVybiB0Z2FkZHJlc3M7Cit9CisKK09iamVjdEFkZHJlc3MK K3JlbmFtZXRyaWcoUmVuYW1lU3RtdCAqc3RtdCkKK3sKKwkvKgorCSAqIExvb2sgdXAgbmFtZSwg Y2hlY2sgcGVybWlzc2lvbnMsIGFuZCBhY3F1aXJlIGxvY2sgKHdoaWNoIHdlIHdpbGwgTk9UCisJ ICogcmVsZWFzZSB1bnRpbCBlbmQgb2YgdHJhbnNhY3Rpb24pLgorCSAqLworCXJldHVybiByZW5h bWV0cmlnSGVscGVyKHN0bXQsIDAsCisJCQkJCQkJUmFuZ2VWYXJHZXRSZWxpZEV4dGVuZGVkKHN0 bXQtPnJlbGF0aW9uLCBBY2Nlc3NFeGNsdXNpdmVMb2NrLAorCQkJCQkJCQkJCQkJCSAwLAorCQkJ CQkJCQkJCQkJCSBSYW5nZVZhckNhbGxiYWNrRm9yUmVuYW1lVHJpZ2dlciwKKwkJCQkJCQkJCQkJ CQkgTlVMTCkpOworCit9CiAKIC8qCiAgKiBFbmFibGVEaXNhYmxlVHJpZ2dlcigpCkBAIC00MzUw LDcgKzQ0NDUsNyBAQCBHZXRBZnRlclRyaWdnZXJzU3RvcmVTbG90KEFmdGVyVHJpZ2dlcnNUYWJs ZURhdGEgKnRhYmxlLAogCS8qIENyZWF0ZSBpdCBpZiBub3QgYWxyZWFkeSBkb25lLiAqLwogCWlm ICghdGFibGUtPnN0b3Jlc2xvdCkKIAl7Ci0JCU1lbW9yeUNvbnRleHQJb2xkY3h0OworCQlNZW1v cnlDb250ZXh0IG9sZGN4dDsKIAogCQkvKgogCQkgKiBXZSBvbmx5IG5lZWQgdGhpcyBzbG90IG9u bHkgdW50aWwgQWZ0ZXJUcmlnZ2VyRW5kUXVlcnksIGJ1dCBtYWtpbmcKZGlmZiAtLWdpdCBhL3Ny Yy9iYWNrZW5kL3BhcnNlci9ncmFtLnkgYi9zcmMvYmFja2VuZC9wYXJzZXIvZ3JhbS55CmluZGV4 IDdmZjM2YmM4NDIuLjg0ZTE3NDc0MDIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3BhcnNlci9n cmFtLnkKKysrIGIvc3JjL2JhY2tlbmQvcGFyc2VyL2dyYW0ueQpAQCAtODg1MSw3ICs4ODUxLDcg QEAgUmVuYW1lU3RtdDogQUxURVIgQUdHUkVHQVRFIGFnZ3JlZ2F0ZV93aXRoX2FyZ3R5cGVzIFJF TkFNRSBUTyBuYW1lCiAJCQkJCW4tPm1pc3Npbmdfb2sgPSBmYWxzZTsKIAkJCQkJJCQgPSAoTm9k ZSAqKW47CiAJCQkJfQotCQkJfCBBTFRFUiBUUklHR0VSIG5hbWUgT04gcXVhbGlmaWVkX25hbWUg UkVOQU1FIFRPIG5hbWUKKwkJCXwgQUxURVIgVFJJR0dFUiBuYW1lIE9OIHJlbGF0aW9uX2V4cHIg UkVOQU1FIFRPIG5hbWUKIAkJCQl7CiAJCQkJCVJlbmFtZVN0bXQgKm4gPSBtYWtlTm9kZShSZW5h bWVTdG10KTsKIAkJCQkJbi0+cmVuYW1lVHlwZSA9IE9CSkVDVF9UUklHR0VSOwpkaWZmIC0tZ2l0 IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3JpX3RyaWdnZXJzLmMgYi9zcmMvYmFja2VuZC91dGls cy9hZHQvcmlfdHJpZ2dlcnMuYwppbmRleCA3Yzc3YzMzOGNlLi45NjI2OWZjMmFkIDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQvcmlfdHJpZ2dlcnMuYworKysgYi9zcmMvYmFja2Vu ZC91dGlscy9hZHQvcmlfdHJpZ2dlcnMuYwpAQCAtMzk0LDggKzM5NCw4IEBAIFJJX0ZLZXlfY2hl Y2soVHJpZ2dlckRhdGEgKnRyaWdkYXRhKQogCSAqIE5vdyBjaGVjayB0aGF0IGZvcmVpZ24ga2V5 IGV4aXN0cyBpbiBQSyB0YWJsZQogCSAqCiAJICogWFhYIGRldGVjdE5ld1Jvd3MgbXVzdCBiZSB0 cnVlIHdoZW4gYSBwYXJ0aXRpb25lZCB0YWJsZSBpcyBvbiB0aGUKLQkgKiByZWZlcmVuY2VkIHNp ZGUuICBUaGUgcmVhc29uIGlzIHRoYXQgb3VyIHNuYXBzaG90IG11c3QgYmUgZnJlc2gKLQkgKiBp biBvcmRlciBmb3IgdGhlIGhhY2sgaW4gZmluZF9pbmhlcml0YW5jZV9jaGlsZHJlbigpIHRvIHdv cmsuCisJICogcmVmZXJlbmNlZCBzaWRlLiAgVGhlIHJlYXNvbiBpcyB0aGF0IG91ciBzbmFwc2hv dCBtdXN0IGJlIGZyZXNoIGluCisJICogb3JkZXIgZm9yIHRoZSBoYWNrIGluIGZpbmRfaW5oZXJp dGFuY2VfY2hpbGRyZW4oKSB0byB3b3JrLgogCSAqLwogCXJpX1BlcmZvcm1DaGVjayhyaWluZm8s ICZxa2V5LCBxcGxhbiwKIAkJCQkJZmtfcmVsLCBwa19yZWwsCmRpZmYgLS1naXQgYS9zcmMvaW5j bHVkZS9jb21tYW5kcy90cmlnZ2VyLmggYi9zcmMvaW5jbHVkZS9jb21tYW5kcy90cmlnZ2VyLmgK aW5kZXggOWU1NTdjZmJjZS4uOGRhYzIzZDk4MCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY29t bWFuZHMvdHJpZ2dlci5oCisrKyBiL3NyYy9pbmNsdWRlL2NvbW1hbmRzL3RyaWdnZXIuaApAQCAt MTU4LDYgKzE1OCwxMCBAQCBleHRlcm4gT2JqZWN0QWRkcmVzcyBDcmVhdGVUcmlnZ2VyKENyZWF0 ZVRyaWdTdG10ICpzdG10LCBjb25zdCBjaGFyICpxdWVyeVN0cmluZwogZXh0ZXJuIHZvaWQgUmVt b3ZlVHJpZ2dlckJ5SWQoT2lkIHRyaWdPaWQpOwogZXh0ZXJuIE9pZAlnZXRfdHJpZ2dlcl9vaWQo T2lkIHJlbGlkLCBjb25zdCBjaGFyICpuYW1lLCBib29sIG1pc3Npbmdfb2spOwogCitleHRlcm4g T2JqZWN0QWRkcmVzcyByZW5hbWVvbmx5dHJpZyhSZW5hbWVTdG10ICpzdG10LCBSZWxhdGlvbiB0 Z3JlbCwgT2lkIHJlbGlkLCBPaWQgdGdwYXJlbnQpOworCitleHRlcm4gT2JqZWN0QWRkcmVzcyBy ZW5hbWV0cmlnSGVscGVyKFJlbmFtZVN0bXQgKnN0bXQsIE9pZCB0Z29pZCwgT2lkIHJlbGlkKTsK KwogZXh0ZXJuIE9iamVjdEFkZHJlc3MgcmVuYW1ldHJpZyhSZW5hbWVTdG10ICpzdG10KTsKIAog ZXh0ZXJuIHZvaWQgRW5hYmxlRGlzYWJsZVRyaWdnZXIoUmVsYXRpb24gcmVsLCBjb25zdCBjaGFy ICp0Z25hbWUsCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3RyaWdnZXJz Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvdHJpZ2dlcnMub3V0CmluZGV4IGU4YWY5 YTk1ODkuLjBlMmUyNjdhMDUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQv dHJpZ2dlcnMub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvdHJpZ2dlcnMub3V0 CkBAIC0zMzQ5LDMgKzMzNDksMTE4IEBAIGZvciBlYWNoIHN0YXRlbWVudCBleGVjdXRlIGZ1bmN0 aW9uIHRyaWdnZXJfZnVuY3Rpb24xKCk7CiBkZWxldGUgZnJvbSBjb252c2xvdF90ZXN0X3BhcmVu dDsKIE5PVElDRTogIHRyaWdnZXIgPSBiZHRfdHJpZ2dlciwgb2xkX3RhYmxlID0gKDExMSx0dXR1 KSwgKDMxMSx0dXR1KQogZHJvcCB0YWJsZSBjb252c2xvdF90ZXN0X2NoaWxkLCBjb252c2xvdF90 ZXN0X3BhcmVudDsKKy0tCistLSBidWlsZCBhIG5lc3RlZCBwYXJ0aXRpb24gc2NoZW1lIGZvciB0 ZXN0aW5nCistLQorY3JlYXRlIHRhYmxlIGdyYW5kcGFyZW50IChpZCBpbnQsCitwcmltYXJ5IGtl eSAoaWQpKQorcGFydGl0aW9uIGJ5IHJhbmdlIChpZCk7CitjcmVhdGUgdGFibGUgbWlkZGxlCitw YXJ0aXRpb24gb2YgZ3JhbmRwYXJlbnQKK2ZvciB2YWx1ZXMgZnJvbSAoMSkKK3RvICgxMCkKK3Bh cnRpdGlvbiBieSByYW5nZSAoaWQpOworY3JlYXRlIHRhYmxlIGNoaQorcGFydGl0aW9uIG9mIG1p ZGRsZQorZm9yIHZhbHVlcyBmcm9tICgxKQordG8gKDUpOworY3JlYXRlIHRhYmxlIGNobworcGFy dGl0aW9uIG9mIG1pZGRsZQorZm9yIHZhbHVlcyBmcm9tICg2KQordG8gKDgpOworY3JlYXRlIGZ1 bmN0aW9uIGYgKCkKK3JldHVybnMgdHJpZ2dlciBhcyAKKyQkCitiZWdpbgorcmV0dXJuIG5ldzsK K2VuZDsKKyQkCitsYW5ndWFnZSBwbHBnc3FsOworY3JlYXRlIHRyaWdnZXIgYQorYWZ0ZXIgaW5z ZXJ0IG9uIGdyYW5kcGFyZW50Citmb3IgZWFjaCByb3cKK2V4ZWN1dGUgcHJvY2VkdXJlIGYoKTsK K3NlbGVjdCB0Z3JlbGlkOjpyZWdjbGFzcywgdGduYW1lLCAoc2VsZWN0IHRnbmFtZSBmcm9tIHBn X3RyaWdnZXIgdHIgd2hlcmUgdHIub2lkID0gcGdfdHJpZ2dlci50Z3BhcmVudGlkKSBwYXJlbnRf dGduYW1lCitmcm9tIHBnX3RyaWdnZXIgd2hlcmUgdGduYW1lIGluICgnYScpCitvcmRlciBieSB0 Z25hbWUsIHRncmVsaWQ6OnJlZ2NsYXNzOjp0ZXh0OworICAgdGdyZWxpZCAgIHwgdGduYW1lIHwg cGFyZW50X3RnbmFtZSAKKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tCisg Y2hpICAgICAgICAgfCBhICAgICAgfCBhCisgY2hvICAgICAgICAgfCBhICAgICAgfCBhCisgZ3Jh bmRwYXJlbnQgfCBhICAgICAgfCAKKyBtaWRkbGUgICAgICB8IGEgICAgICB8IGEKKyg0IHJvd3Mp CisKK2FsdGVyIHRyaWdnZXIgYSBvbiBncmFuZHBhcmVudCByZW5hbWUgdG8gYjsKK3NlbGVjdCB0 Z3JlbGlkOjpyZWdjbGFzcywgdGduYW1lLCAoc2VsZWN0IHRnbmFtZSBmcm9tIHBnX3RyaWdnZXIg dHIgd2hlcmUgdHIub2lkID0gcGdfdHJpZ2dlci50Z3BhcmVudGlkKSBwYXJlbnRfdGduYW1lCitm cm9tIHBnX3RyaWdnZXIgd2hlcmUgdGduYW1lIGluICgnYScsICdiJykKK29yZGVyIGJ5IHRnbmFt ZSwgdGdyZWxpZDo6cmVnY2xhc3M6OnRleHQ7CisgICB0Z3JlbGlkICAgfCB0Z25hbWUgfCBwYXJl bnRfdGduYW1lIAorLS0tLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0KKyBjaGkg ICAgICAgICB8IGIgICAgICB8IGIKKyBjaG8gICAgICAgICB8IGIgICAgICB8IGIKKyBncmFuZHBh cmVudCB8IGIgICAgICB8IAorIG1pZGRsZSAgICAgIHwgYiAgICAgIHwgYgorKDQgcm93cykKKwor YWx0ZXIgdHJpZ2dlciBiIG9uIG9ubHkgbWlkZGxlIHJlbmFtZSB0byBzb21ldGhpbmc7CitzZWxl Y3QgdGdyZWxpZDo6cmVnY2xhc3MsIHRnbmFtZSwgKHNlbGVjdCB0Z25hbWUgZnJvbSBwZ190cmln Z2VyIHRyIHdoZXJlIHRyLm9pZCA9IHBnX3RyaWdnZXIudGdwYXJlbnRpZCkgcGFyZW50X3RnbmFt ZQorZnJvbSBwZ190cmlnZ2VyIHdoZXJlIHRnbmFtZSBpbiAoJ3NvbWV0aGluZycsICdiJykKK29y ZGVyIGJ5IHRnbmFtZSwgdGdyZWxpZDo6cmVnY2xhc3M6OnRleHQ7CisgICB0Z3JlbGlkICAgfCAg dGduYW1lICAgfCBwYXJlbnRfdGduYW1lIAorLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0KKyBjaGkgICAgICAgICB8IGIgICAgICAgICB8IHNvbWV0aGluZworIGNobyAg ICAgICAgIHwgYiAgICAgICAgIHwgc29tZXRoaW5nCisgZ3JhbmRwYXJlbnQgfCBiICAgICAgICAg fCAKKyBtaWRkbGUgICAgICB8IHNvbWV0aGluZyB8IGIKKyg0IHJvd3MpCisKK2FsdGVyIHRyaWdn ZXIgc29tZXRoaW5nIG9uIG1pZGRsZSByZW5hbWUgdG8gc29tZV90cmlnZ2VyOworTk9USUNFOiAg dHJpZ2dlciAiYiIgZm9yIHRhYmxlICJjaGkiIHdhcyBub3QgbmFtZWQgInNvbWV0aGluZyIsIHJl bmFtaW5nIGFueXdheXMKK05PVElDRTogIHRyaWdnZXIgImIiIGZvciB0YWJsZSAiY2hvIiB3YXMg bm90IG5hbWVkICJzb21ldGhpbmciLCByZW5hbWluZyBhbnl3YXlzCitzZWxlY3QgdGdyZWxpZDo6 cmVnY2xhc3MsIHRnbmFtZSwgKHNlbGVjdCB0Z25hbWUgZnJvbSBwZ190cmlnZ2VyIHRyIHdoZXJl IHRyLm9pZCA9IHBnX3RyaWdnZXIudGdwYXJlbnRpZCkgcGFyZW50X3RnbmFtZQorZnJvbSBwZ190 cmlnZ2VyIHdoZXJlIHRnbmFtZSBpbiAoJ3NvbWVfdHJpZ2dlcicsICdiJywgJ3NvbWV0aGluZycp CitvcmRlciBieSB0Z25hbWUsIHRncmVsaWQ6OnJlZ2NsYXNzOjp0ZXh0OworICAgdGdyZWxpZCAg IHwgICAgdGduYW1lICAgIHwgcGFyZW50X3RnbmFtZSAKKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tCisgZ3JhbmRwYXJlbnQgfCBiICAgICAgICAgICAgfCAKKyBj aGkgICAgICAgICB8IHNvbWVfdHJpZ2dlciB8IHNvbWVfdHJpZ2dlcgorIGNobyAgICAgICAgIHwg c29tZV90cmlnZ2VyIHwgc29tZV90cmlnZ2VyCisgbWlkZGxlICAgICAgfCBzb21lX3RyaWdnZXIg fCBiCisoNCByb3dzKQorCistLQorLS0gQ2hlY2sgdGhhdCBjbGFzc2ljYWwgaW5oZXJpdGFuY2Ug aXMgdW5waGFzZWQgYnkgcmVuYW1pbmcgdHJpZ2dlcnMKKy0tCitjcmVhdGUgdGFibGUgaW5oIChp ZCBpbnQsCitwcmltYXJ5IGtleSAoaWQpKTsKK2FsdGVyIHRhYmxlIG1pZGRsZSBkZXRhY2ggcGFy dGl0aW9uIGNoaTsKK2FsdGVyIHRhYmxlIGNoaSBpbmhlcml0IGluaDsKK3NlbGVjdCB0Z3JlbGlk OjpyZWdjbGFzcywgdGduYW1lLCAoc2VsZWN0IHRnbmFtZSBmcm9tIHBnX3RyaWdnZXIgdHIgd2hl cmUgdHIub2lkID0gcGdfdHJpZ2dlci50Z3BhcmVudGlkKSBwYXJlbnRfdGduYW1lCitmcm9tIHBn X3RyaWdnZXIgd2hlcmUgdGdyZWxpZCA9ICdjaGknOjpyZWdjbGFzcworb3JkZXIgYnkgdGduYW1l LCB0Z3JlbGlkOjpyZWdjbGFzczo6dGV4dDsKKyB0Z3JlbGlkIHwgdGduYW1lIHwgcGFyZW50X3Rn bmFtZSAKKy0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0KKygwIHJvd3MpCisKK2Ny ZWF0ZSB0cmlnZ2VyIHVucmVsYXRlZAorYmVmb3JlIHVwZGF0ZSBvZiBpZCBvbiBpbmgKK2ZvciBl YWNoIHJvdworZXhlY3V0ZSBwcm9jZWR1cmUgZigpOworYWx0ZXIgdHJpZ2dlciB1bnJlbGF0ZWQg b24gaW5oIHJlbmFtZSB0byBzb21lX3RyaWdnZXI7CithbHRlciB0cmlnZ2VyIHNvbWVfdHJpZ2dl ciBvbiBpbmggcmVuYW1lIHRvIHRyaWdnZXJfbmFtZTsKK3NlbGVjdCB0Z3JlbGlkOjpyZWdjbGFz cywgdGduYW1lLCAoc2VsZWN0IHRnbmFtZSBmcm9tIHBnX3RyaWdnZXIgdHIgd2hlcmUgdHIub2lk ID0gcGdfdHJpZ2dlci50Z3BhcmVudGlkKSBwYXJlbnRfdGduYW1lCitmcm9tIHBnX3RyaWdnZXIg d2hlcmUgdGduYW1lIGluICgnc29tZV90cmlnZ2VyJywgJ3VucmVsYXRlZCcsICd0cmlnZ2VyX25h bWUnKQorb3JkZXIgYnkgdGduYW1lLCB0Z3JlbGlkOjpyZWdjbGFzczo6dGV4dDsKKyB0Z3JlbGlk IHwgICAgdGduYW1lICAgIHwgcGFyZW50X3RnbmFtZSAKKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0KKyBjaG8gICAgIHwgc29tZV90cmlnZ2VyIHwgc29tZV90cmlnZ2Vy CisgbWlkZGxlICB8IHNvbWVfdHJpZ2dlciB8IGIKKyBpbmggICAgIHwgdHJpZ2dlcl9uYW1lIHwg CisoMyByb3dzKQorCistLSBjbGVhbnVwCitkcm9wIHRhYmxlIGdyYW5kcGFyZW50OworZHJvcCB0 YWJsZSBjaGk7Citkcm9wIHRhYmxlIGluaDsKK2Ryb3AgZnVuY3Rpb24gZigpOwpkaWZmIC0tZ2l0 IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvdHJpZ2dlcnMuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9z cWwvdHJpZ2dlcnMuc3FsCmluZGV4IGI1MGY1MDAwNDUuLmYwNjU4NmZjYWUgMTAwNjQ0Ci0tLSBh L3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3RyaWdnZXJzLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNz L3NxbC90cmlnZ2Vycy5zcWwKQEAgLTI1MzUsMyArMjUzNSwxMDEgQEAgZm9yIGVhY2ggc3RhdGVt ZW50IGV4ZWN1dGUgZnVuY3Rpb24gdHJpZ2dlcl9mdW5jdGlvbjEoKTsKIGRlbGV0ZSBmcm9tIGNv bnZzbG90X3Rlc3RfcGFyZW50OwogCiBkcm9wIHRhYmxlIGNvbnZzbG90X3Rlc3RfY2hpbGQsIGNv bnZzbG90X3Rlc3RfcGFyZW50OworCistLQorLS0gYnVpbGQgYSBuZXN0ZWQgcGFydGl0aW9uIHNj aGVtZSBmb3IgdGVzdGluZworLS0KKworY3JlYXRlIHRhYmxlIGdyYW5kcGFyZW50IChpZCBpbnQs CitwcmltYXJ5IGtleSAoaWQpKQorcGFydGl0aW9uIGJ5IHJhbmdlIChpZCk7CisKK2NyZWF0ZSB0 YWJsZSBtaWRkbGUKK3BhcnRpdGlvbiBvZiBncmFuZHBhcmVudAorZm9yIHZhbHVlcyBmcm9tICgx KQordG8gKDEwKQorcGFydGl0aW9uIGJ5IHJhbmdlIChpZCk7CisKK2NyZWF0ZSB0YWJsZSBjaGkK K3BhcnRpdGlvbiBvZiBtaWRkbGUKK2ZvciB2YWx1ZXMgZnJvbSAoMSkKK3RvICg1KTsKKworY3Jl YXRlIHRhYmxlIGNobworcGFydGl0aW9uIG9mIG1pZGRsZQorZm9yIHZhbHVlcyBmcm9tICg2KQor dG8gKDgpOworCitjcmVhdGUgZnVuY3Rpb24gZiAoKQorcmV0dXJucyB0cmlnZ2VyIGFzIAorJCQK K2JlZ2luCityZXR1cm4gbmV3OworZW5kOworJCQKK2xhbmd1YWdlIHBscGdzcWw7CisKK2NyZWF0 ZSB0cmlnZ2VyIGEKK2FmdGVyIGluc2VydCBvbiBncmFuZHBhcmVudAorZm9yIGVhY2ggcm93Citl eGVjdXRlIHByb2NlZHVyZSBmKCk7CisKK3NlbGVjdCB0Z3JlbGlkOjpyZWdjbGFzcywgdGduYW1l LCAoc2VsZWN0IHRnbmFtZSBmcm9tIHBnX3RyaWdnZXIgdHIgd2hlcmUgdHIub2lkID0gcGdfdHJp Z2dlci50Z3BhcmVudGlkKSBwYXJlbnRfdGduYW1lCitmcm9tIHBnX3RyaWdnZXIgd2hlcmUgdGdu YW1lIGluICgnYScpCitvcmRlciBieSB0Z25hbWUsIHRncmVsaWQ6OnJlZ2NsYXNzOjp0ZXh0Owor CithbHRlciB0cmlnZ2VyIGEgb24gZ3JhbmRwYXJlbnQgcmVuYW1lIHRvIGI7CisKK3NlbGVjdCB0 Z3JlbGlkOjpyZWdjbGFzcywgdGduYW1lLCAoc2VsZWN0IHRnbmFtZSBmcm9tIHBnX3RyaWdnZXIg dHIgd2hlcmUgdHIub2lkID0gcGdfdHJpZ2dlci50Z3BhcmVudGlkKSBwYXJlbnRfdGduYW1lCitm cm9tIHBnX3RyaWdnZXIgd2hlcmUgdGduYW1lIGluICgnYScsICdiJykKK29yZGVyIGJ5IHRnbmFt ZSwgdGdyZWxpZDo6cmVnY2xhc3M6OnRleHQ7CisKK2FsdGVyIHRyaWdnZXIgYiBvbiBvbmx5IG1p ZGRsZSByZW5hbWUgdG8gc29tZXRoaW5nOworCitzZWxlY3QgdGdyZWxpZDo6cmVnY2xhc3MsIHRn bmFtZSwgKHNlbGVjdCB0Z25hbWUgZnJvbSBwZ190cmlnZ2VyIHRyIHdoZXJlIHRyLm9pZCA9IHBn X3RyaWdnZXIudGdwYXJlbnRpZCkgcGFyZW50X3RnbmFtZQorZnJvbSBwZ190cmlnZ2VyIHdoZXJl IHRnbmFtZSBpbiAoJ3NvbWV0aGluZycsICdiJykKK29yZGVyIGJ5IHRnbmFtZSwgdGdyZWxpZDo6 cmVnY2xhc3M6OnRleHQ7CisKK2FsdGVyIHRyaWdnZXIgc29tZXRoaW5nIG9uIG1pZGRsZSByZW5h bWUgdG8gc29tZV90cmlnZ2VyOworCitzZWxlY3QgdGdyZWxpZDo6cmVnY2xhc3MsIHRnbmFtZSwg KHNlbGVjdCB0Z25hbWUgZnJvbSBwZ190cmlnZ2VyIHRyIHdoZXJlIHRyLm9pZCA9IHBnX3RyaWdn ZXIudGdwYXJlbnRpZCkgcGFyZW50X3RnbmFtZQorZnJvbSBwZ190cmlnZ2VyIHdoZXJlIHRnbmFt ZSBpbiAoJ3NvbWVfdHJpZ2dlcicsICdiJywgJ3NvbWV0aGluZycpCitvcmRlciBieSB0Z25hbWUs IHRncmVsaWQ6OnJlZ2NsYXNzOjp0ZXh0OworCistLQorLS0gQ2hlY2sgdGhhdCBjbGFzc2ljYWwg aW5oZXJpdGFuY2UgaXMgdW5waGFzZWQgYnkgcmVuYW1pbmcgdHJpZ2dlcnMKKy0tCisKK2NyZWF0 ZSB0YWJsZSBpbmggKGlkIGludCwKK3ByaW1hcnkga2V5IChpZCkpOworCithbHRlciB0YWJsZSBt aWRkbGUgZGV0YWNoIHBhcnRpdGlvbiBjaGk7CisKK2FsdGVyIHRhYmxlIGNoaSBpbmhlcml0IGlu aDsKKworc2VsZWN0IHRncmVsaWQ6OnJlZ2NsYXNzLCB0Z25hbWUsIChzZWxlY3QgdGduYW1lIGZy b20gcGdfdHJpZ2dlciB0ciB3aGVyZSB0ci5vaWQgPSBwZ190cmlnZ2VyLnRncGFyZW50aWQpIHBh cmVudF90Z25hbWUKK2Zyb20gcGdfdHJpZ2dlciB3aGVyZSB0Z3JlbGlkID0gJ2NoaSc6OnJlZ2Ns YXNzCitvcmRlciBieSB0Z25hbWUsIHRncmVsaWQ6OnJlZ2NsYXNzOjp0ZXh0OworCitjcmVhdGUg dHJpZ2dlciB1bnJlbGF0ZWQKK2JlZm9yZSB1cGRhdGUgb2YgaWQgb24gaW5oCitmb3IgZWFjaCBy b3cKK2V4ZWN1dGUgcHJvY2VkdXJlIGYoKTsKKworYWx0ZXIgdHJpZ2dlciB1bnJlbGF0ZWQgb24g aW5oIHJlbmFtZSB0byBzb21lX3RyaWdnZXI7CisKK2FsdGVyIHRyaWdnZXIgc29tZV90cmlnZ2Vy IG9uIGluaCByZW5hbWUgdG8gdHJpZ2dlcl9uYW1lOworCitzZWxlY3QgdGdyZWxpZDo6cmVnY2xh c3MsIHRnbmFtZSwgKHNlbGVjdCB0Z25hbWUgZnJvbSBwZ190cmlnZ2VyIHRyIHdoZXJlIHRyLm9p ZCA9IHBnX3RyaWdnZXIudGdwYXJlbnRpZCkgcGFyZW50X3RnbmFtZQorZnJvbSBwZ190cmlnZ2Vy IHdoZXJlIHRnbmFtZSBpbiAoJ3NvbWVfdHJpZ2dlcicsICd1bnJlbGF0ZWQnLCAndHJpZ2dlcl9u YW1lJykKK29yZGVyIGJ5IHRnbmFtZSwgdGdyZWxpZDo6cmVnY2xhc3M6OnRleHQ7CisKKy0tIGNs ZWFudXAKKworZHJvcCB0YWJsZSBncmFuZHBhcmVudDsKKworZHJvcCB0YWJsZSBjaGk7CisKK2Ry b3AgdGFibGUgaW5oOworCitkcm9wIGZ1bmN0aW9uIGYoKTsK --_004_4a0f161e127444e2aea52b325596645bindexde_--