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 1nGx4N-0008T8-0P for pgsql-hackers@arkaria.postgresql.org; Mon, 07 Feb 2022 06:00:11 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nGx4L-0002V4-PP for pgsql-hackers@arkaria.postgresql.org; Mon, 07 Feb 2022 06:00:09 +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 1nGx4L-0002Tz-5T for pgsql-hackers@lists.postgresql.org; Mon, 07 Feb 2022 06:00:09 +0000 Received: from frontdoor.pr.hu ([2a02:808:3:101:250:56ff:fe8e:1370]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nGx4F-0005Ha-Go for pgsql-hackers@lists.postgresql.org; Mon, 07 Feb 2022 06:00:08 +0000 Received: from [2a02:808:3:101::5] (helo=mail.pr.hu) by frontdoor.pr.hu with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1nGx4B-0004Zr-Ij; Mon, 07 Feb 2022 06:59:59 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=pr.hu; s=pr20170203; h=Cc:Subject:From:To:MIME-Version:Date:Message-ID:Content-Type: Sender:Reply-To:Content-Transfer-Encoding:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=GWG4wD9R+hNY99IjzKJCvLeDVyJ9EDGavEXt1gLk0VE=; b=GU3+OM3lErY1Sf4oekuHhlVv4J yExyJwXrmwD5sHmVmHuD0RZtYwhj7fB1sEtOaP3o1nLNjoxVEpN2vW+faz8Dqs3GfDm6gAzavmHD/ /PB5Bu8K+HZmzJ0F6buhmckTDl0wIlGSei3EYsZpJrXSugp6uSYjv+M+K7ZioyOiT6bWcaOwDJ4My 6UF1/R+2WtlPAetIAi16tjgSuoL6yOahUIKLVmbNuBO6mZip/I/bcZARQfF425a9O7lAEyu11GInj TsrNMDmI/vOwyR6I7ad7TJw8/VKNNAE0FmeFa2Np7a20Zku+YdDGwQn2/19rdqJzR70IFdApcTc58 ur0c9hLw==; Received: from host-87-242-32-51.prtelecom.hu ([87.242.32.51] helo=[192.168.1.2]) by mail.pr.hu with esmtpsa (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1nGx45-0001Xr-LA; Mon, 07 Feb 2022 06:59:57 +0100 Content-Type: multipart/mixed; boundary="------------iWnv8MyYf0X4pC0lv8uttm1u" Message-ID: <2818f875-0eda-7040-637d-801806fdaf60@pr.hu> Date: Mon, 7 Feb 2022 06:59:51 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.5.0 To: pgsql-hackers@lists.postgresql.org Content-Language: en-US From: =?UTF-8?B?QsO2c3rDtnJtw6lueWkgWm9sdMOhbg==?= Subject: [PATCH] Add UPDATE WHERE OFFSET IN clause Cc: postgres@cybertec.at X-Spam-Score: -10.1 (----------) X-Scan-Signature: b197d541a77d4180c7f09f92bd0db254 X-Spam-Tracer: backend.mail.pr.hu -10.1 20220207055957Z List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------iWnv8MyYf0X4pC0lv8uttm1u Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi! A couple of years ago I was working on PostgreSQL features and extensions. Some of them was in ECPG, mainly in the area of improving Informix compatibility. One of the patchsets I invented was the cursor readahead support to improve performance in ECPG which used FETCH N. This work was published at https://github.com/zboszor/ecpg-readahead/commits However, there was one use case for this patchset actually decreased performance, namely if the cursor was used to modify rows via UPDATE WHERE CURRENT OF. It was because the cursor position on the server side was different from the application so the ECPG readahead code had to use MOVE then UPDATE WHERE CURRENT OF. I brewed this idea for a while and yesterday I decided to do something about it and here's the (admittedly, limited) result. I added a new PostgreSQL extension to the UPDATE syntax: UPDATE ... WHERE OFFSET n IN cursor; This new syntax changes the feature disparity between FETCH N and UPDATE WHERE CURRENT OF that existed in PostgreSQL forever. I only implemented this for cursors that use SELECT FOR UPDATE. This part was quite straightforward to implement. The behaviour of this syntax is as follows: * the offset value may be 0 or negative, since it is a virtual index into the rows returned by the last FETCH statement and negative indexes are felt natural relative to the cursor position and the cursor direction * for offset value 0, the behaviour is identical to WHERE CURRENT OF * negative indexes allow UPDATEs on previous rows even if the cursor reached the end of the result set I need clues for how to extend this for cursors that aren't using FOR UPDATE queries, if it's possible at all. Please, review. Best regards, Zoltán Böszörményi --------------iWnv8MyYf0X4pC0lv8uttm1u Content-Type: text/x-patch; charset=UTF-8; name="0001-Add-UPDATE-.-WHERE-OFFSET-IN-clause.patch" Content-Disposition: attachment; filename="0001-Add-UPDATE-.-WHERE-OFFSET-IN-clause.patch" Content-Transfer-Encoding: base64 RnJvbSAyNjk2N2M3NTEwYzA5ZmU2MGQ1ZmU1NGJkMTdiYWU5MTk2NTRjNzVkIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiA9P1VURi04P3E/Wm9sdD1DMz1BMW49MjBCPUMzPUI2 c3o9QzM9QjZybT1DMz1BOW55aT89CiA8emJvc3pvckBnbWFpbC5jb20+CkRhdGU6IFN1biwg NiBGZWIgMjAyMiAxOTo0Nzo0NyArMDEwMApTdWJqZWN0OiBbUEFUQ0hdIEFkZCBVUERBVEUg Li4uIFdIRVJFIE9GRlNFVCBJTiBjbGF1c2UKClBvc3RncmVTUUwgaGFzIGFuIGV4dGVuc2lv biBmb3IgdGhlIGN1cnNvciBGRVRDSCBzdGF0ZW1lbnQKdG8gcmV0cmlldmUgbXVsdGlwbGUg cm93cyBhdCBvbmNlIGJ1dCBpdCBvbmx5IHN1cHBvcnRzIHVwZGF0aW5nCnRoZSBsYXN0IGZl dGNoZWQgcm93IHZpYSBhIGN1cnNvci4gVGhpcyBpcyBhIGZlYXR1cmUgZGlzcGFyaXR5LgoK VG8gcmVjdGlmeSB0aGlzLCBhZGQgdGhlIFVQREFURSAuLi4gV0hFUkUgT0ZGU0VUIElOIGNs YXVzZSB0bwpzdXBwb3J0IHVwZGF0aW5nIGFueSBvZiB0aGUgcm93cyByZXRyaWV2ZWQgaW4g dGhlIGxhc3QgRkVUQ0gKc3RhdGVtZW50LgotLS0KIGRvYy9zcmMvc2dtbC9yZWYvdXBkYXRl LnNnbWwgICAgICAgICAgfCAzMCArKysrKysrLS0KIHNyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4 ZWNDdXJyZW50LmMgICAgfCAyMSArKysrLS0KIHNyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNN YWluLmMgICAgICAgfCAgMiArLQogc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZUxvY2tSb3dz LmMgICB8ICA4ICsrLQogc3JjL2JhY2tlbmQvbm9kZXMvY29weWZ1bmNzLmMgICAgICAgICB8 ICAyICsKIHNyYy9iYWNrZW5kL25vZGVzL2VxdWFsZnVuY3MuYyAgICAgICAgfCAgMiArCiBz cmMvYmFja2VuZC9ub2Rlcy9vdXRmdW5jcy5jICAgICAgICAgIHwgIDIgKwogc3JjL2JhY2tl bmQvbm9kZXMvcmVhZGZ1bmNzLmMgICAgICAgICB8ICAyICsKIHNyYy9iYWNrZW5kL3BhcnNl ci9ncmFtLnkgICAgICAgICAgICAgfCAxMiArKysrCiBzcmMvaW5jbHVkZS9ub2Rlcy9leGVj bm9kZXMuaCAgICAgICAgIHwgMTAgKy0tCiBzcmMvaW5jbHVkZS9ub2Rlcy9wcmltbm9kZXMu aCAgICAgICAgIHwgIDIgKwogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9wb3J0YWxzLm91 dCB8IDkzICsrKysrKysrKysrKysrKysrKysrKysrKysrKwogc3JjL3Rlc3QvcmVncmVzcy9z cWwvcG9ydGFscy5zcWwgICAgICB8IDQ3ICsrKysrKysrKysrKysrCiAxMyBmaWxlcyBjaGFu Z2VkLCAyMTMgaW5zZXJ0aW9ucygrKSwgMjAgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEv ZG9jL3NyYy9zZ21sL3JlZi91cGRhdGUuc2dtbCBiL2RvYy9zcmMvc2dtbC9yZWYvdXBkYXRl LnNnbWwKaW5kZXggM2ZhNTRlNWY3MC4uNWMwOGVhZTIwMCAxMDA2NDQKLS0tIGEvZG9jL3Ny Yy9zZ21sL3JlZi91cGRhdGUuc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvcmVmL3VwZGF0ZS5z Z21sCkBAIC0yOCw3ICsyOCw3IEBAIFVQREFURSBbIE9OTFkgXSA8cmVwbGFjZWFibGUgY2xh c3M9InBhcmFtZXRlciI+dGFibGVfbmFtZTwvcmVwbGFjZWFibGU+IFsgKiBdIFsKICAgICAg ICAgICAoIDxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5jb2x1bW5fbmFtZTwvcmVw bGFjZWFibGU+IFssIC4uLl0gKSA9ICggPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIi PnN1Yi1TRUxFQ1Q8L3JlcGxhY2VhYmxlPiApCiAgICAgICAgIH0gWywgLi4uXQogICAgIFsg RlJPTSA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+ZnJvbV9pdGVtPC9yZXBsYWNl YWJsZT4gWywgLi4uXSBdCi0gICAgWyBXSEVSRSA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFt ZXRlciI+Y29uZGl0aW9uPC9yZXBsYWNlYWJsZT4gfCBXSEVSRSBDVVJSRU5UIE9GIDxyZXBs YWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5jdXJzb3JfbmFtZTwvcmVwbGFjZWFibGU+IF0K KyAgICBbIFdIRVJFIDxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5jb25kaXRpb248 L3JlcGxhY2VhYmxlPiB8IFdIRVJFIENVUlJFTlQgT0YgPHJlcGxhY2VhYmxlIGNsYXNzPSJw YXJhbWV0ZXIiPmN1cnNvcl9uYW1lPC9yZXBsYWNlYWJsZT4gfCBXSEVSRSBPRkZTRVQgPHJl cGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPm9mZnNldDwvcmVwbGFjZWFibGU+IE9GIDxy ZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5jdXJzb3JfbmFtZTwvcmVwbGFjZWFibGU+ IF0KICAgICBbIFJFVFVSTklORyAqIHwgPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIi Pm91dHB1dF9leHByZXNzaW9uPC9yZXBsYWNlYWJsZT4gWyBbIEFTIF0gPHJlcGxhY2VhYmxl IGNsYXNzPSJwYXJhbWV0ZXIiPm91dHB1dF9uYW1lPC9yZXBsYWNlYWJsZT4gXSBbLCAuLi5d IF0KIDwvc3lub3BzaXM+CiAgPC9yZWZzeW5vcHNpc2Rpdj4KQEAgLTE5OSwxMSArMTk5LDI2 IEBAIFVQREFURSBbIE9OTFkgXSA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+dGFi bGVfbmFtZTwvcmVwbGFjZWFibGU+IFsgKiBdIFsKICAgICA8bGlzdGl0ZW0+CiAgICAgIDxw YXJhPgogICAgICAgVGhlIG5hbWUgb2YgdGhlIGN1cnNvciB0byB1c2UgaW4gYSA8bGl0ZXJh bD5XSEVSRSBDVVJSRU5UIE9GPC9saXRlcmFsPgotICAgICAgY29uZGl0aW9uLiAgVGhlIHJv dyB0byBiZSB1cGRhdGVkIGlzIHRoZSBvbmUgbW9zdCByZWNlbnRseSBmZXRjaGVkCi0gICAg ICBmcm9tIHRoaXMgY3Vyc29yLiAgVGhlIGN1cnNvciBtdXN0IGJlIGEgbm9uLWdyb3VwaW5n Ci0gICAgICBxdWVyeSBvbiB0aGUgPGNvbW1hbmQ+VVBEQVRFPC9jb21tYW5kPidzIHRhcmdl dCB0YWJsZS4KLSAgICAgIE5vdGUgdGhhdCA8bGl0ZXJhbD5XSEVSRSBDVVJSRU5UIE9GPC9s aXRlcmFsPiBjYW5ub3QgYmUKLSAgICAgIHNwZWNpZmllZCB0b2dldGhlciB3aXRoIGEgQm9v bGVhbiBjb25kaXRpb24uICBTZWUKKyAgICAgIG9yIGluIGEgPGxpdGVyYWw+V0hFUkUgT0ZG U0VUIElOPC9saXRlcmFsPiBjb25kaXRpb24uCisgICAgICBUaGUgY3Vyc29yIG11c3QgYmUg YSBub24tZ3JvdXBpbmcgcXVlcnkgb24gdGhlCisgICAgICA8Y29tbWFuZD5VUERBVEU8L2Nv bW1hbmQ+J3MgdGFyZ2V0IHRhYmxlIGFuZCBhCisgICAgICA8bGl0ZXJhbD5GT1IgVVBEQVRF PC9saXRlcmFsPiBxdWVyeSBvbiB0aGUgc2FtZSB0YWJsZSB0byB1c2UgdGhlCisgICAgICA8 bGl0ZXJhbD5XSEVSRSBPRkZTRVQgSU48L2xpdGVyYWw+IGNvbmRpdGlvbgorICAgICA8L3Bh cmE+CisgICAgIDxwYXJhPgorICAgICAgVGhlIHJvdyB0byBiZSB1cGRhdGVkIGZvciA8bGl0 ZXJhbD5XSEVSRSBDVVJSRU5UIE9GPC9saXRlcmFsPgorICAgICAgaXMgdGhlIG9uZSBtb3N0 IHJlY2VudGx5IGZldGNoZWQgZnJvbSB0aGlzIGN1cnNvci4KKyAgICAgPC9wYXJhPgorICAg ICA8cGFyYT4KKyAgICAgIElmIG11bHRpcGxlIHJvd3Mgd2VyZSBmZXRjaGVkIGluIHRoZSBs YXN0IDxjb21tYW5kPkZFVENIPC9jb21tYW5kPgorICAgICAgc3RhdGVtZW50LCA8bGl0ZXJh bD5XSEVSRSBPRkZTRVQgSU48L2xpdGVyYWw+IG1heSBiZSB1c2VkIHdpdGggYQorICAgICAg bmVnYXRpdmUgb3IgemVybyBvZmZzZXQgdmFsdWUgcmVsYXRpdmUgdG8gdGhlIGN1cnNvcidz IGN1cnJlbnQgcG9zaXRpb24gYW5kCisgICAgICB0aGUgZGlyZWN0aW9uIG9mIHRoZSBsYXN0 IDxjb21tYW5kPkZFVENIPC9jb21tYW5kPiBzdGF0ZW1lbnQuCisgICAgICBaZXJvIG9mZnNl dCBpcyBpZGVudGljYWwgdG8gPGxpdGVyYWw+V0hFUkUgQ1VSUkVOVCBPRjwvbGl0ZXJhbD4u CisgICAgIDwvcGFyYT4KKyAgICAgPHBhcmE+CisgICAgICBOb3RlIHRoYXQgPGxpdGVyYWw+ V0hFUkUgQ1VSUkVOVCBPRjwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPldIRVJFIE9GRlNFVCBJ TjwvbGl0ZXJhbD4KKyAgICAgIGNhbm5vdCBiZSBzcGVjaWZpZWQgdG9nZXRoZXIgd2l0aCBh IEJvb2xlYW4gY29uZGl0aW9uLiAgU2VlCiAgICAgICA8eHJlZiBsaW5rZW5kPSJzcWwtZGVj bGFyZSIvPgogICAgICAgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgY3Vyc29y cyB3aXRoCiAgICAgICA8bGl0ZXJhbD5XSEVSRSBDVVJSRU5UIE9GPC9saXRlcmFsPi4KQEAg LTQ0Miw3ICs0NTcsOCBAQCBVUERBVEUgZmlsbXMgU0VUIGtpbmQgPSAnRHJhbWF0aWMnIFdI RVJFIENVUlJFTlQgT0YgY19maWxtczsKIAogICA8cGFyYT4KICAgIFRoaXMgY29tbWFuZCBj b25mb3JtcyB0byB0aGUgPGFjcm9ueW0+U1FMPC9hY3JvbnltPiBzdGFuZGFyZCwgZXhjZXB0 Ci0gICB0aGF0IHRoZSA8bGl0ZXJhbD5GUk9NPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+UkVU VVJOSU5HPC9saXRlcmFsPiBjbGF1c2VzCisgICB0aGF0IHRoZSA8bGl0ZXJhbD5GUk9NPC9s aXRlcmFsPiwgPGxpdGVyYWw+UkVUVVJOSU5HPC9saXRlcmFsPiBhbmQKKyAgIDxsaXRlcmFs PldIRVJFIE9GRlNFVCBJTjwvbGl0ZXJhbD4gY2xhdXNlcwogICAgYXJlIDxwcm9kdWN0bmFt ZT5Qb3N0Z3JlU1FMPC9wcm9kdWN0bmFtZT4gZXh0ZW5zaW9ucywgYXMgaXMgdGhlIGFiaWxp dHkKICAgIHRvIHVzZSA8bGl0ZXJhbD5XSVRIPC9saXRlcmFsPiB3aXRoIDxjb21tYW5kPlVQ REFURTwvY29tbWFuZD4uCiAgIDwvcGFyYT4KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2V4 ZWN1dG9yL2V4ZWNDdXJyZW50LmMgYi9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjQ3VycmVu dC5jCmluZGV4IGIzNGIxODBiYzQuLjY5MTJiYjJhMjUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL2V4ZWN1dG9yL2V4ZWNDdXJyZW50LmMKKysrIGIvc3JjL2JhY2tlbmQvZXhlY3V0b3Iv ZXhlY0N1cnJlbnQuYwpAQCAtMTMxLDE3ICsxMzEsMjIgQEAgZXhlY0N1cnJlbnRPZihDdXJy ZW50T2ZFeHByICpjZXhwciwKIAkJICogVGhlIGN1cnNvciBtdXN0IGhhdmUgYSBjdXJyZW50 IHJlc3VsdCByb3c6IHBlciB0aGUgU1FMIHNwZWMsIGl0J3MKIAkJICogYW4gZXJyb3IgaWYg bm90LgogCQkgKi8KLQkJaWYgKHBvcnRhbC0+YXRTdGFydCB8fCBwb3J0YWwtPmF0RW5kKQor CQlpZiAoKHBvcnRhbC0+YXRTdGFydCB8fCBwb3J0YWwtPmF0RW5kKSAmJiBjZXhwci0+Y3Vy c29yX29mZnNldCA9PSAwKQogCQkJZXJlcG9ydChFUlJPUiwKIAkJCQkJKGVycmNvZGUoRVJS Q09ERV9JTlZBTElEX0NVUlNPUl9TVEFURSksCiAJCQkJCSBlcnJtc2coImN1cnNvciBcIiVz XCIgaXMgbm90IHBvc2l0aW9uZWQgb24gYSByb3ciLAogCQkJCQkJCWN1cnNvcl9uYW1lKSkp OwogCiAJCS8qIFJldHVybiB0aGUgY3VycmVudGx5IHNjYW5uZWQgVElELCBpZiB0aGVyZSBp cyBvbmUgKi8KLQkJaWYgKEl0ZW1Qb2ludGVySXNWYWxpZCgmKGVybS0+Y3VyQ3RpZCkpKQot CQl7Ci0JCQkqY3VycmVudF90aWQgPSBlcm0tPmN1ckN0aWQ7Ci0JCQlyZXR1cm4gdHJ1ZTsK KwkJaWYgKGVybS0+Y3VyQ3RpZExpc3QpIHsKKwkJCWludCBjdXJzb3Jfb2Zmc2V0ID0gbGlz dF9sZW5ndGgoZXJtLT5jdXJDdGlkTGlzdCkgLSAxICsgY2V4cHItPmN1cnNvcl9vZmZzZXQg KyAoKHBvcnRhbC0+YXRTdGFydCB8fCBwb3J0YWwtPmF0RW5kKSA/IDEgOiAwKTsKKwkJCUxp c3RDZWxsICpjdGlkQ2VsbCA9IE5VTEw7CisJCQlpZiAoY3Vyc29yX29mZnNldCA+PSAwICYm IGN1cnNvcl9vZmZzZXQgPCBsaXN0X2xlbmd0aChlcm0tPmN1ckN0aWRMaXN0KSkKKwkJCQlj dGlkQ2VsbCA9IGxpc3RfbnRoX2NlbGwoZXJtLT5jdXJDdGlkTGlzdCwgY3Vyc29yX29mZnNl dCk7CisJCQlpZiAoY3RpZENlbGwgJiYgSXRlbVBvaW50ZXJJc1ZhbGlkKChJdGVtUG9pbnRl cikoY3RpZENlbGwtPnB0cl92YWx1ZSkpKSB7CisJCQkJKmN1cnJlbnRfdGlkID0gKihJdGVt UG9pbnRlcikoY3RpZENlbGwtPnB0cl92YWx1ZSk7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9 CiAJCX0KIAogCQkvKgpAQCAtMTYxLDYgKzE2NiwxMiBAQCBleGVjQ3VycmVudE9mKEN1cnJl bnRPZkV4cHIgKmNleHByLAogCQlTY2FuU3RhdGUgICpzY2Fuc3RhdGU7CiAJCWJvb2wJCXBl bmRpbmdfcmVzY2FuID0gZmFsc2U7CiAKKwkJaWYgKGNleHByLT5jdXJzb3JfaXNfb2Zmc2V0 b2YpCisJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURf Q1VSU09SX1NUQVRFKSwKKwkJCQkJIGVycm1zZygiY3Vyc29yIFwiJXNcIiBtdXN0IHVzZSBG T1IgVVBEQVRFIHRvIHVzZSBXSEVSRSBPRkZTRVQgSU4iLAorCQkJCQkJCWN1cnNvcl9uYW1l KSkpOworCiAJCXNjYW5zdGF0ZSA9IHNlYXJjaF9wbGFuX3RyZWUocXVlcnlEZXNjLT5wbGFu c3RhdGUsIHRhYmxlX29pZCwKIAkJCQkJCQkJCSAmcGVuZGluZ19yZXNjYW4pOwogCQlpZiAo IXNjYW5zdGF0ZSkKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNNYWlu LmMgYi9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjTWFpbi5jCmluZGV4IDU0OWQ5ZWI2OTYu LjU4YzRkYTBjZGMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNNYWlu LmMKKysrIGIvc3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhlY01haW4uYwpAQCAtODc5LDcgKzg3 OSw3IEBAIEluaXRQbGFuKFF1ZXJ5RGVzYyAqcXVlcnlEZXNjLCBpbnQgZWZsYWdzKQogCQkJ ZXJtLT5zdHJlbmd0aCA9IHJjLT5zdHJlbmd0aDsKIAkJCWVybS0+d2FpdFBvbGljeSA9IHJj LT53YWl0UG9saWN5OwogCQkJZXJtLT5lcm1BY3RpdmUgPSBmYWxzZTsKLQkJCUl0ZW1Qb2lu dGVyU2V0SW52YWxpZCgmKGVybS0+Y3VyQ3RpZCkpOworCQkJZXJtLT5jdXJDdGlkTGlzdCA9 IE5JTDsKIAkJCWVybS0+ZXJtRXh0cmEgPSBOVUxMOwogCiAJCQlBc3NlcnQoZXJtLT5ydGkg PiAwICYmIGVybS0+cnRpIDw9IGVzdGF0ZS0+ZXNfcmFuZ2VfdGFibGVfc2l6ZSAmJgpkaWZm IC0tZ2l0IGEvc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZUxvY2tSb3dzLmMgYi9zcmMvYmFj a2VuZC9leGVjdXRvci9ub2RlTG9ja1Jvd3MuYwppbmRleCAxYTlkYWIyNWRkLi5hMjVjMTkz ZDMzIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9leGVjdXRvci9ub2RlTG9ja1Jvd3MuYwor KysgYi9zcmMvYmFja2VuZC9leGVjdXRvci9ub2RlTG9ja1Jvd3MuYwpAQCAtNzksNiArNzks NyBAQCBsbmV4dDoKIAkJRGF0dW0JCWRhdHVtOwogCQlib29sCQlpc051bGw7CiAJCUl0ZW1Q b2ludGVyRGF0YSB0aWQ7CisJCUl0ZW1Qb2ludGVyICp0aWRfcHRyOwogCQlUTV9GYWlsdXJl RGF0YSB0bWZkOwogCQlMb2NrVHVwbGVNb2RlIGxvY2ttb2RlOwogCQlpbnQJCQlsb2NrZmxh Z3MgPSAwOwpAQCAtMTA3LDcgKzEwOCw4IEBAIGxuZXh0OgogCQkJewogCQkJCS8qIHRoaXMg Y2hpbGQgaXMgaW5hY3RpdmUgcmlnaHQgbm93ICovCiAJCQkJZXJtLT5lcm1BY3RpdmUgPSBm YWxzZTsKLQkJCQlJdGVtUG9pbnRlclNldEludmFsaWQoJihlcm0tPmN1ckN0aWQpKTsKKwkJ CQlsaXN0X2ZyZWVfZGVlcChlcm0tPmN1ckN0aWRMaXN0KTsKKwkJCQllcm0tPmN1ckN0aWRM aXN0ID0gTklMOwogCQkJCUV4ZWNDbGVhclR1cGxlKG1hcmtTbG90KTsKIAkJCQljb250aW51 ZTsKIAkJCX0KQEAgLTI0OSw3ICsyNTEsOSBAQCBsbmV4dDoKIAkJfQogCiAJCS8qIFJlbWVt YmVyIGxvY2tlZCB0dXBsZSdzIFRJRCBmb3IgRVBRIHRlc3RpbmcgYW5kIFdIRVJFIENVUlJF TlQgT0YgKi8KLQkJZXJtLT5jdXJDdGlkID0gdGlkOworCQl0aWRfcHRyID0gcGFsbG9jKHNp emVvZihJdGVtUG9pbnRlckRhdGEpKTsKKwkJbWVtY3B5KHRpZF9wdHIsICZ0aWQsIHNpemVv ZihJdGVtUG9pbnRlckRhdGEpKTsKKwkJZXJtLT5jdXJDdGlkTGlzdCA9IGxhcHBlbmQoZXJt LT5jdXJDdGlkTGlzdCwgdGlkX3B0cik7CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL3NyYy9i YWNrZW5kL25vZGVzL2NvcHlmdW5jcy5jIGIvc3JjL2JhY2tlbmQvbm9kZXMvY29weWZ1bmNz LmMKaW5kZXggNmJkOTViYmNlMi4uZTgwMGExYzNiYSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvbm9kZXMvY29weWZ1bmNzLmMKKysrIGIvc3JjL2JhY2tlbmQvbm9kZXMvY29weWZ1bmNz LmMKQEAgLTIxNzgsNiArMjE3OCw4IEBAIF9jb3B5Q3VycmVudE9mRXhwcihjb25zdCBDdXJy ZW50T2ZFeHByICpmcm9tKQogCUNPUFlfU0NBTEFSX0ZJRUxEKGN2YXJubyk7CiAJQ09QWV9T VFJJTkdfRklFTEQoY3Vyc29yX25hbWUpOwogCUNPUFlfU0NBTEFSX0ZJRUxEKGN1cnNvcl9w YXJhbSk7CisJQ09QWV9TQ0FMQVJfRklFTEQoY3Vyc29yX29mZnNldCk7CisJQ09QWV9TQ0FM QVJfRklFTEQoY3Vyc29yX2lzX29mZnNldG9mKTsKIAogCXJldHVybiBuZXdub2RlOwogfQpk aWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvbm9kZXMvZXF1YWxmdW5jcy5jIGIvc3JjL2JhY2tl bmQvbm9kZXMvZXF1YWxmdW5jcy5jCmluZGV4IDQxMjY1MTYyMjIuLjFjOWFhNmFlMjcgMTAw NjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL25vZGVzL2VxdWFsZnVuY3MuYworKysgYi9zcmMvYmFj a2VuZC9ub2Rlcy9lcXVhbGZ1bmNzLmMKQEAgLTc1Niw2ICs3NTYsOCBAQCBfZXF1YWxDdXJy ZW50T2ZFeHByKGNvbnN0IEN1cnJlbnRPZkV4cHIgKmEsIGNvbnN0IEN1cnJlbnRPZkV4cHIg KmIpCiAJQ09NUEFSRV9TQ0FMQVJfRklFTEQoY3Zhcm5vKTsKIAlDT01QQVJFX1NUUklOR19G SUVMRChjdXJzb3JfbmFtZSk7CiAJQ09NUEFSRV9TQ0FMQVJfRklFTEQoY3Vyc29yX3BhcmFt KTsKKwlDT01QQVJFX1NDQUxBUl9GSUVMRChjdXJzb3Jfb2Zmc2V0KTsKKwlDT01QQVJFX1ND QUxBUl9GSUVMRChjdXJzb3JfaXNfb2Zmc2V0b2YpOwogCiAJcmV0dXJuIHRydWU7CiB9CmRp ZmYgLS1naXQgYS9zcmMvYmFja2VuZC9ub2Rlcy9vdXRmdW5jcy5jIGIvc3JjL2JhY2tlbmQv bm9kZXMvb3V0ZnVuY3MuYwppbmRleCA2YmRhZDQ2MmM3Li40MWM2ZDEwYmE0IDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC9ub2Rlcy9vdXRmdW5jcy5jCisrKyBiL3NyYy9iYWNrZW5kL25v ZGVzL291dGZ1bmNzLmMKQEAgLTE2NjgsNiArMTY2OCw4IEBAIF9vdXRDdXJyZW50T2ZFeHBy KFN0cmluZ0luZm8gc3RyLCBjb25zdCBDdXJyZW50T2ZFeHByICpub2RlKQogCVdSSVRFX1VJ TlRfRklFTEQoY3Zhcm5vKTsKIAlXUklURV9TVFJJTkdfRklFTEQoY3Vyc29yX25hbWUpOwog CVdSSVRFX0lOVF9GSUVMRChjdXJzb3JfcGFyYW0pOworCVdSSVRFX0lOVF9GSUVMRChjdXJz b3Jfb2Zmc2V0KTsKKwlXUklURV9CT09MX0ZJRUxEKGN1cnNvcl9pc19vZmZzZXRvZik7CiB9 CiAKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9ub2Rlcy9yZWFkZnVu Y3MuYyBiL3NyYy9iYWNrZW5kL25vZGVzL3JlYWRmdW5jcy5jCmluZGV4IDNmNjhmN2MxOGQu LmY5NTNmNDA2ZDUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL25vZGVzL3JlYWRmdW5jcy5j CisrKyBiL3NyYy9iYWNrZW5kL25vZGVzL3JlYWRmdW5jcy5jCkBAIC0xMjY5LDYgKzEyNjks OCBAQCBfcmVhZEN1cnJlbnRPZkV4cHIodm9pZCkKIAlSRUFEX1VJTlRfRklFTEQoY3Zhcm5v KTsKIAlSRUFEX1NUUklOR19GSUVMRChjdXJzb3JfbmFtZSk7CiAJUkVBRF9JTlRfRklFTEQo Y3Vyc29yX3BhcmFtKTsKKwlSRUFEX0lOVF9GSUVMRChjdXJzb3Jfb2Zmc2V0KTsKKwlSRUFE X0JPT0xfRklFTEQoY3Vyc29yX2lzX29mZnNldG9mKTsKIAogCVJFQURfRE9ORSgpOwogfQpk aWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvcGFyc2VyL2dyYW0ueSBiL3NyYy9iYWNrZW5kL3Bh cnNlci9ncmFtLnkKaW5kZXggYzRmMzI0MjUwNi4uYWQxNGU2MmY3OCAxMDA2NDQKLS0tIGEv c3JjL2JhY2tlbmQvcGFyc2VyL2dyYW0ueQorKysgYi9zcmMvYmFja2VuZC9wYXJzZXIvZ3Jh bS55CkBAIC0xMjc1NCw2ICsxMjc1NCwxOCBAQCB3aGVyZV9vcl9jdXJyZW50X2NsYXVzZToK IAkJCQkJLyogY3Zhcm5vIGlzIGZpbGxlZCBpbiBieSBwYXJzZSBhbmFseXNpcyAqLwogCQkJ CQluLT5jdXJzb3JfbmFtZSA9ICQ0OwogCQkJCQluLT5jdXJzb3JfcGFyYW0gPSAwOworCQkJ CQluLT5jdXJzb3JfaXNfb2Zmc2V0b2YgPSBmYWxzZTsKKwkJCQkJbi0+Y3Vyc29yX29mZnNl dCA9IDA7CisJCQkJCSQkID0gKE5vZGUgKikgbjsKKwkJCQl9CisJCQl8IFdIRVJFIE9GRlNF VCBTaWduZWRJY29uc3QgSU5fUCBjdXJzb3JfbmFtZQorCQkJCXsKKwkJCQkJQ3VycmVudE9m RXhwciAqbiA9IG1ha2VOb2RlKEN1cnJlbnRPZkV4cHIpOworCQkJCQkvKiBjdmFybm8gaXMg ZmlsbGVkIGluIGJ5IHBhcnNlIGFuYWx5c2lzICovCisJCQkJCW4tPmN1cnNvcl9uYW1lID0g JDU7CisJCQkJCW4tPmN1cnNvcl9wYXJhbSA9IDA7CisJCQkJCW4tPmN1cnNvcl9pc19vZmZz ZXRvZiA9IHRydWU7CisJCQkJCW4tPmN1cnNvcl9vZmZzZXQgPSAkMzsKIAkJCQkJJCQgPSAo Tm9kZSAqKSBuOwogCQkJCX0KIAkJCXwgLypFTVBUWSovCQkJCQkJCQl7ICQkID0gTlVMTDsg fQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvbm9kZXMvZXhlY25vZGVzLmggYi9zcmMvaW5j bHVkZS9ub2Rlcy9leGVjbm9kZXMuaAppbmRleCBkZDk1ZGM0MGM3Li42NWZmYzE0OWNkIDEw MDY0NAotLS0gYS9zcmMvaW5jbHVkZS9ub2Rlcy9leGVjbm9kZXMuaAorKysgYi9zcmMvaW5j bHVkZS9ub2Rlcy9leGVjbm9kZXMuaApAQCAtNjY0LDEwICs2NjQsMTAgQEAgdHlwZWRlZiBz dHJ1Y3QgRVN0YXRlCiAgKiBzdWJxdWVyaWVzLWluLUZST00gd2lsbCBoYXZlIGFuIEV4ZWNS b3dNYXJrIHdpdGggcmVsYXRpb24gPT0gTlVMTC4gIFNlZQogICogUGxhblJvd01hcmsgZm9y IGRldGFpbHMgYWJvdXQgbW9zdCBvZiB0aGUgZmllbGRzLiAgSW4gYWRkaXRpb24gdG8gZmll bGRzCiAgKiBkaXJlY3RseSBkZXJpdmVkIGZyb20gUGxhblJvd01hcmssIHdlIHN0b3JlIGFu IGFjdGl2aXR5IGZsYWcgKHRvIGRlbm90ZQotICogaW5hY3RpdmUgY2hpbGRyZW4gb2YgaW5o ZXJpdGFuY2UgdHJlZXMpLCBjdXJDdGlkLCB3aGljaCBpcyB1c2VkIGJ5IHRoZQotICogV0hF UkUgQ1VSUkVOVCBPRiBjb2RlLCBhbmQgZXJtRXh0cmEsIHdoaWNoIGlzIGF2YWlsYWJsZSBm b3IgdXNlIGJ5IHRoZSBwbGFuCi0gKiBub2RlIHRoYXQgc291cmNlcyB0aGUgcmVsYXRpb24g KGUuZy4sIGZvciBhIGZvcmVpZ24gdGFibGUgdGhlIEZEVyBjYW4gdXNlCi0gKiBlcm1FeHRy YSB0byBob2xkIGluZm9ybWF0aW9uKS4KKyAqIGluYWN0aXZlIGNoaWxkcmVuIG9mIGluaGVy aXRhbmNlIHRyZWVzKSwgY3VyQ3RpZExpc3QsIHdoaWNoIGlzIHVzZWQgYnkgdGhlCisgKiBX SEVSRSBDVVJSRU5UIE9GL1dIRVJFIE9GRlNFVCBJTiBjb2RlLCBhbmQgZXJtRXh0cmEsIHdo aWNoIGlzIGF2YWlsYWJsZQorICogZm9yIHVzZSBieSB0aGUgcGxhbiBub2RlIHRoYXQgc291 cmNlcyB0aGUgcmVsYXRpb24gKGUuZy4sIGZvciBhIGZvcmVpZ24KKyAqIHRhYmxlIHRoZSBG RFcgY2FuIHVzZSBlcm1FeHRyYSB0byBob2xkIGluZm9ybWF0aW9uKS4KICAqCiAgKiBFU3Rh dGUtPmVzX3Jvd21hcmtzIGlzIGFuIGFycmF5IG9mIHRoZXNlIHN0cnVjdHMsIGluZGV4ZWQg YnkgUlQgaW5kZXgsCiAgKiB3aXRoIE5VTExzIGZvciBpcnJlbGV2YW50IFJUIGluZGV4ZXMu ICBlc19yb3dtYXJrcyBpdHNlbGYgaXMgTlVMTCBpZgpAQCAtNjg0LDcgKzY4NCw3IEBAIHR5 cGVkZWYgc3RydWN0IEV4ZWNSb3dNYXJrCiAJTG9ja0NsYXVzZVN0cmVuZ3RoIHN0cmVuZ3Ro OwkvKiBMb2NraW5nQ2xhdXNlJ3Mgc3RyZW5ndGgsIG9yIExDU19OT05FICovCiAJTG9ja1dh aXRQb2xpY3kgd2FpdFBvbGljeTsJLyogTk9XQUlUIGFuZCBTS0lQIExPQ0tFRCAqLwogCWJv b2wJCWVybUFjdGl2ZTsJCS8qIGlzIHRoaXMgbWFyayByZWxldmFudCBmb3IgY3VycmVudCB0 dXBsZT8gKi8KLQlJdGVtUG9pbnRlckRhdGEgY3VyQ3RpZDsJLyogY3RpZCBvZiBjdXJyZW50 bHkgbG9ja2VkIHR1cGxlLCBpZiBhbnkgKi8KKwlMaXN0CSAgICpjdXJDdGlkTGlzdDsJLyog bGlzdCBvZiBJdGVtUG9pbnRlckRhdGEsIGN0aWQgb2YgY3VycmVudGx5IGxvY2tlZCB0dXBs ZShzKSwgaWYgYW55ICovCiAJdm9pZAkgICAqZXJtRXh0cmE7CQkvKiBhdmFpbGFibGUgZm9y IHVzZSBieSByZWxhdGlvbiBzb3VyY2Ugbm9kZSAqLwogfSBFeGVjUm93TWFyazsKIApkaWZm IC0tZ2l0IGEvc3JjL2luY2x1ZGUvbm9kZXMvcHJpbW5vZGVzLmggYi9zcmMvaW5jbHVkZS9u b2Rlcy9wcmltbm9kZXMuaAppbmRleCBkYWI1YzRmZjVkLi4zOTliMTI3ZTVmIDEwMDY0NAot LS0gYS9zcmMvaW5jbHVkZS9ub2Rlcy9wcmltbm9kZXMuaAorKysgYi9zcmMvaW5jbHVkZS9u b2Rlcy9wcmltbm9kZXMuaApAQCAtMTM2Myw2ICsxMzYzLDggQEAgdHlwZWRlZiBzdHJ1Y3Qg Q3VycmVudE9mRXhwcgogCUluZGV4CQljdmFybm87CQkJLyogUlQgaW5kZXggb2YgdGFyZ2V0 IHJlbGF0aW9uICovCiAJY2hhcgkgICAqY3Vyc29yX25hbWU7CS8qIG5hbWUgb2YgcmVmZXJl bmNlZCBjdXJzb3IsIG9yIE5VTEwgKi8KIAlpbnQJCQljdXJzb3JfcGFyYW07CS8qIHJlZmN1 cnNvciBwYXJhbWV0ZXIgbnVtYmVyLCBvciAwICovCisJaW50CQkJY3Vyc29yX29mZnNldDsK Kwlib29sCQljdXJzb3JfaXNfb2Zmc2V0b2Y7CiB9IEN1cnJlbnRPZkV4cHI7CiAKIC8qCmRp ZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3BvcnRhbHMub3V0IGIvc3Jj L3Rlc3QvcmVncmVzcy9leHBlY3RlZC9wb3J0YWxzLm91dAppbmRleCA5ZGE3NDg3NmUxLi44 Y2U0MzBjZDQ3IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3BvcnRh bHMub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcG9ydGFscy5vdXQKQEAg LTE1MzYsMyArMTUzNiw5NiBAQCBmZXRjaCBiYWNrd2FyZCBhbGwgaW4gYzI7CiAoMyByb3dz KQogCiByb2xsYmFjazsKKy0tIENoZWNrIFdIRVJFIE9GRlNFVCBJTgorLS0gVGhlIGN1cnNv ciBlbmRzIHdpdGggbm8gY3VycmVudCByb3cKK2JlZ2luOworY3JlYXRlIHRhYmxlIGN1cnNv ciAoaWQgc2VyaWFsLCB0IHRleHQpOworaW5zZXJ0IGludG8gY3Vyc29yICh0KSB2YWx1ZXMg KCdhJyksKCdiJyksKCdjJyk7CitkZWNsYXJlIGMxIGN1cnNvciBmb3Igc2VsZWN0ICogZnJv bSBjdXJzb3Igb3JkZXIgYnkgaWQgZm9yIHVwZGF0ZTsKK2ZldGNoIGFsbCBmcm9tIGMxOwor IGlkIHwgdCAKKy0tLS0rLS0tCisgIDEgfCBhCisgIDIgfCBiCisgIDMgfCBjCisoMyByb3dz KQorCit1cGRhdGUgY3Vyc29yIHNldCB0PSdjYycgd2hlcmUgb2Zmc2V0IC0xIGluIGMxOwor dXBkYXRlIGN1cnNvciBzZXQgdD0nYmInIHdoZXJlIG9mZnNldCAtMiBpbiBjMTsKK3VwZGF0 ZSBjdXJzb3Igc2V0IHQ9J2FhJyB3aGVyZSBvZmZzZXQgLTMgaW4gYzE7CitzZWxlY3QgKiBm cm9tIGN1cnNvciBvcmRlciBieSBpZDsKKyBpZCB8IHQgIAorLS0tLSstLS0tCisgIDEgfCBh YQorICAyIHwgYmIKKyAgMyB8IGNjCisoMyByb3dzKQorCit1cGRhdGUgY3Vyc29yIHNldCB0 PSd4eCcgd2hlcmUgb2Zmc2V0IDAgaW4gYzE7CitFUlJPUjogIGN1cnNvciAiYzEiIGlzIG5v dCBwb3NpdGlvbmVkIG9uIGEgcm93Cityb2xsYmFjazsKKy0tIFRoZSBjdXJzb3IgZW5kcyB3 aXRoIGN1cnJlbnQgcm93CitiZWdpbjsKK2NyZWF0ZSB0YWJsZSBjdXJzb3IgKGlkIHNlcmlh bCwgdCB0ZXh0KTsKK2luc2VydCBpbnRvIGN1cnNvciAodCkgdmFsdWVzICgnYScpLCgnYicp LCgnYycpOworZGVjbGFyZSBjMSBjdXJzb3IgZm9yIHNlbGVjdCAqIGZyb20gY3Vyc29yIG9y ZGVyIGJ5IGlkIGZvciB1cGRhdGU7CitmZXRjaCAzIGZyb20gYzE7CisgaWQgfCB0IAorLS0t LSstLS0KKyAgMSB8IGEKKyAgMiB8IGIKKyAgMyB8IGMKKygzIHJvd3MpCisKK3VwZGF0ZSBj dXJzb3Igc2V0IHQ9J2NjJyB3aGVyZSBvZmZzZXQgMCBpbiBjMTsKK3VwZGF0ZSBjdXJzb3Ig c2V0IHQ9J2JiJyB3aGVyZSBvZmZzZXQgLTEgaW4gYzE7Cit1cGRhdGUgY3Vyc29yIHNldCB0 PSdhYScgd2hlcmUgb2Zmc2V0IC0yIGluIGMxOworc2VsZWN0ICogZnJvbSBjdXJzb3Igb3Jk ZXIgYnkgaWQ7CisgaWQgfCB0ICAKKy0tLS0rLS0tLQorICAxIHwgYWEKKyAgMiB8IGJiCisg IDMgfCBjYworKDMgcm93cykKKworcm9sbGJhY2s7CistLSBJbnZhbGlkIG9mZnNldHMKK2Jl Z2luOworY3JlYXRlIHRhYmxlIGN1cnNvciAoaWQgc2VyaWFsLCB0IHRleHQpOworaW5zZXJ0 IGludG8gY3Vyc29yICh0KSB2YWx1ZXMgKCdhJyksKCdiJyksKCdjJyk7CitkZWNsYXJlIGMx IGN1cnNvciBmb3Igc2VsZWN0ICogZnJvbSBjdXJzb3Igb3JkZXIgYnkgaWQgZm9yIHVwZGF0 ZTsKK2ZldGNoIDMgZnJvbSBjMTsKKyBpZCB8IHQgCistLS0tKy0tLQorICAxIHwgYQorICAy IHwgYgorICAzIHwgYworKDMgcm93cykKKwordXBkYXRlIGN1cnNvciBzZXQgdD0nY2MnIHdo ZXJlIG9mZnNldCAxMDAgaW4gYzE7Cit1cGRhdGUgY3Vyc29yIHNldCB0PSdiYicgd2hlcmUg b2Zmc2V0IC0xMDAgaW4gYzE7CitzZWxlY3QgKiBmcm9tIGN1cnNvciBvcmRlciBieSBpZDsK KyBpZCB8IHQgCistLS0tKy0tLQorICAxIHwgYQorICAyIHwgYgorICAzIHwgYworKDMgcm93 cykKKworcm9sbGJhY2s7CistLSBRdWVyeSB3aXRob3V0IEZPUiBVUERBVEUKK2JlZ2luOwor Y3JlYXRlIHRhYmxlIGN1cnNvciAoaWQgc2VyaWFsLCB0IHRleHQpOworaW5zZXJ0IGludG8g Y3Vyc29yICh0KSB2YWx1ZXMgKCdhJyksKCdiJyksKCdjJyk7CitkZWNsYXJlIGMxIGN1cnNv ciBmb3Igc2VsZWN0ICogZnJvbSBjdXJzb3Igb3JkZXIgYnkgaWQ7CitmZXRjaCAzIGZyb20g YzE7CisgaWQgfCB0IAorLS0tLSstLS0KKyAgMSB8IGEKKyAgMiB8IGIKKyAgMyB8IGMKKygz IHJvd3MpCisKK3VwZGF0ZSBjdXJzb3Igc2V0IHQ9J2NjJyB3aGVyZSBvZmZzZXQgMCBpbiBj MTsKK0VSUk9SOiAgY3Vyc29yICJjMSIgbXVzdCB1c2UgRk9SIFVQREFURSB0byB1c2UgV0hF UkUgT0ZGU0VUIElOCityb2xsYmFjazsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mv c3FsL3BvcnRhbHMuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcG9ydGFscy5zcWwKaW5k ZXggZWFkZjZlZDk0Mi4uMTk0NzgyNmY3MyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVz cy9zcWwvcG9ydGFscy5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcG9ydGFscy5z cWwKQEAgLTU4MSwzICs1ODEsNTAgQEAgZGVjbGFyZSBjMiBzY3JvbGwgY3Vyc29yIGZvciBz ZWxlY3QgZ2VuZXJhdGVfc2VyaWVzKDEsMykgYXMgZzsKIGZldGNoIGFsbCBpbiBjMjsKIGZl dGNoIGJhY2t3YXJkIGFsbCBpbiBjMjsKIHJvbGxiYWNrOworCistLSBDaGVjayBXSEVSRSBP RkZTRVQgSU4KKworLS0gVGhlIGN1cnNvciBlbmRzIHdpdGggbm8gY3VycmVudCByb3cKK2Jl Z2luOworY3JlYXRlIHRhYmxlIGN1cnNvciAoaWQgc2VyaWFsLCB0IHRleHQpOworaW5zZXJ0 IGludG8gY3Vyc29yICh0KSB2YWx1ZXMgKCdhJyksKCdiJyksKCdjJyk7CitkZWNsYXJlIGMx IGN1cnNvciBmb3Igc2VsZWN0ICogZnJvbSBjdXJzb3Igb3JkZXIgYnkgaWQgZm9yIHVwZGF0 ZTsKK2ZldGNoIGFsbCBmcm9tIGMxOwordXBkYXRlIGN1cnNvciBzZXQgdD0nY2MnIHdoZXJl IG9mZnNldCAtMSBpbiBjMTsKK3VwZGF0ZSBjdXJzb3Igc2V0IHQ9J2JiJyB3aGVyZSBvZmZz ZXQgLTIgaW4gYzE7Cit1cGRhdGUgY3Vyc29yIHNldCB0PSdhYScgd2hlcmUgb2Zmc2V0IC0z IGluIGMxOworc2VsZWN0ICogZnJvbSBjdXJzb3Igb3JkZXIgYnkgaWQ7Cit1cGRhdGUgY3Vy c29yIHNldCB0PSd4eCcgd2hlcmUgb2Zmc2V0IDAgaW4gYzE7Cityb2xsYmFjazsKKworLS0g VGhlIGN1cnNvciBlbmRzIHdpdGggY3VycmVudCByb3cKK2JlZ2luOworY3JlYXRlIHRhYmxl IGN1cnNvciAoaWQgc2VyaWFsLCB0IHRleHQpOworaW5zZXJ0IGludG8gY3Vyc29yICh0KSB2 YWx1ZXMgKCdhJyksKCdiJyksKCdjJyk7CitkZWNsYXJlIGMxIGN1cnNvciBmb3Igc2VsZWN0 ICogZnJvbSBjdXJzb3Igb3JkZXIgYnkgaWQgZm9yIHVwZGF0ZTsKK2ZldGNoIDMgZnJvbSBj MTsKK3VwZGF0ZSBjdXJzb3Igc2V0IHQ9J2NjJyB3aGVyZSBvZmZzZXQgMCBpbiBjMTsKK3Vw ZGF0ZSBjdXJzb3Igc2V0IHQ9J2JiJyB3aGVyZSBvZmZzZXQgLTEgaW4gYzE7Cit1cGRhdGUg Y3Vyc29yIHNldCB0PSdhYScgd2hlcmUgb2Zmc2V0IC0yIGluIGMxOworc2VsZWN0ICogZnJv bSBjdXJzb3Igb3JkZXIgYnkgaWQ7Cityb2xsYmFjazsKKworLS0gSW52YWxpZCBvZmZzZXRz CitiZWdpbjsKK2NyZWF0ZSB0YWJsZSBjdXJzb3IgKGlkIHNlcmlhbCwgdCB0ZXh0KTsKK2lu c2VydCBpbnRvIGN1cnNvciAodCkgdmFsdWVzICgnYScpLCgnYicpLCgnYycpOworZGVjbGFy ZSBjMSBjdXJzb3IgZm9yIHNlbGVjdCAqIGZyb20gY3Vyc29yIG9yZGVyIGJ5IGlkIGZvciB1 cGRhdGU7CitmZXRjaCAzIGZyb20gYzE7Cit1cGRhdGUgY3Vyc29yIHNldCB0PSdjYycgd2hl cmUgb2Zmc2V0IDEwMCBpbiBjMTsKK3VwZGF0ZSBjdXJzb3Igc2V0IHQ9J2JiJyB3aGVyZSBv ZmZzZXQgLTEwMCBpbiBjMTsKK3NlbGVjdCAqIGZyb20gY3Vyc29yIG9yZGVyIGJ5IGlkOwor cm9sbGJhY2s7CisKKy0tIFF1ZXJ5IHdpdGhvdXQgRk9SIFVQREFURQorYmVnaW47CitjcmVh dGUgdGFibGUgY3Vyc29yIChpZCBzZXJpYWwsIHQgdGV4dCk7CitpbnNlcnQgaW50byBjdXJz b3IgKHQpIHZhbHVlcyAoJ2EnKSwoJ2InKSwoJ2MnKTsKK2RlY2xhcmUgYzEgY3Vyc29yIGZv ciBzZWxlY3QgKiBmcm9tIGN1cnNvciBvcmRlciBieSBpZDsKK2ZldGNoIDMgZnJvbSBjMTsK K3VwZGF0ZSBjdXJzb3Igc2V0IHQ9J2NjJyB3aGVyZSBvZmZzZXQgMCBpbiBjMTsKK3JvbGxi YWNrOwotLSAKMi4zNC4xCgo= --------------iWnv8MyYf0X4pC0lv8uttm1u--