Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tRW4h-00A5KY-0t for pgsql-hackers@arkaria.postgresql.org; Sat, 28 Dec 2024 12:37:48 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1tRW3h-0001vL-Fr for pgsql-hackers@arkaria.postgresql.org; Sat, 28 Dec 2024 12:36:45 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tRW3g-0001uc-Tz for pgsql-hackers@lists.postgresql.org; Sat, 28 Dec 2024 12:36:44 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tRW3c-0022Hi-7u for pgsql-hackers@lists.postgresql.org; Sat, 28 Dec 2024 12:36:43 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1735389398; bh=wMOfZoUMtuKI4Hu+s7VhAw/giOVVXSu7gwx/fewoQd8=; h=Message-ID:Date:User-Agent:Subject:To:Cc:References:From: In-Reply-To:From; b=40xoP5lKK1fofaXX3ZFYgY8XLw/xbKKomOvAFxdTtDReNdkmNXImTURP2opgQUEbg gDJeB8J4Zu82LwBeJ2RRcHl3nD6YIsXugunWi66cDoaCHFCpBk9wsS5SARSR9V3Sc8 m/6eNR+QOoF/nusIRV4+4KLQneBRSXt8Cju/3xRaV1xl9SMCVciBkz0zBHBExFnyW+ km0d/NLscKCcuDeekr300BoaU0b5969mp3xSA+JqfsHckSvKfSHp8SCl3ACTOesHl/ zOO5w9U2Krxzk09t06Seim8pmf+QNToGLs5ncSIOdr3a0uGk0XGFGG4UlIlM0dK5Iy YY0ZUssAvYmnA== Received: from [172.30.48.146] (unknown [172.30.48.146]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: a.melnikov@postgrespro.ru) by mail.postgrespro.ru (Postfix/587) with ESMTPSA id 1D0656015D; Sat, 28 Dec 2024 15:36:38 +0300 (MSK) Content-Type: multipart/mixed; boundary="------------2l4fCsYu0fSS590AQA7xs3rS" Message-ID: <600384a7-09bc-41f8-a38c-2f3d2195054b@postgrespro.ru> Date: Sat, 28 Dec 2024 15:36:37 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Add the ability to limit the amount of memory that can be allocated to backends. To: Tomas Vondra , James Hunter , Tomas Vondra Cc: Andres Freund , Andrei Lepikhov , Stephen Frost , reid.thompson@crunchydata.com, Arne Roland , "pgsql-hackers@lists.postgresql.org" , vignesh C , Justin Pryzby , Ibrar Ahmed , "stephen.frost" References: <7912c911af51d5cf28c611190bf3d463b9209343.camel@crunchydata.com> <4edafedc0f8acb12a2979088ac1317bd7dd42145.camel@crunchydata.com> <268e0ac7-8a81-4d65-8b40-b62c4b3f1bf9@postgrespro.ru> <48548d40-634b-4943-a737-3c9d95eacf06@postgrespro.ru> <8fcb4406-49f5-4069-b8e9-197a38004ddd@postgrespro.ru> <20231024024435.yaqrajcchcliwhjl@awork3.anarazel.de> <98646b96-6dcf-8d8a-3daf-837f25f8b1e3@enterprisedb.com> <1c5f1856-817d-45e5-8e1a-acd95c6dd335@enterprisedb.com> <25e68736-00ff-4346-b432-4cda836743f3@vondra.me> Content-Language: en-US From: "Anton A. Melnikov" In-Reply-To: <25e68736-00ff-4346-b432-4cda836743f3@vondra.me> X-KSMG-AntiPhishing: NotDetected, bases: 2024/12/28 10:51:00 X-KSMG-AntiSpam-Interceptor-Info: not scanned X-KSMG-AntiSpam-Status: not scanned, disabled by settings X-KSMG-AntiVirus: Kaspersky Secure Mail Gateway, version 2.1.0.7854, bases: 2024/12/28 09:06:00 #26924529 X-KSMG-AntiVirus-Status: NotDetected, skipped X-KSMG-LinksScanning: not scanned, disabled by settings X-KSMG-Message-Action: skipped X-KSMG-Rule-ID: 1 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. --------------2l4fCsYu0fSS590AQA7xs3rS Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi! On 28.12.2024 04:48, Tomas Vondra wrote: > On 12/27/24 20:14, James Hunter wrote: >> Reviving this thread, because I am thinking about something related -- >> please ignore the "On Fri, Dec 27, 2024" date, this seems to be an >> artifact of me re-sending the message, from the list archive. The >> original message was from January 28, 2024. >> >> On Fri, Dec 27, 2024 at 11:02 AM Tomas Vondra >> wrote: >>> >>> Firstly, I agree with the goal of having a way to account for memory >>> used by the backends, and also ability to enforce some sort of limit. >>> It's difficult to track the memory at the OS level (interpreting RSS >>> values is not trivial), and work_mem is not sufficient to enforce a >>> backend-level limit, not even talking about a global limit. >>> >>> But as I said earlier, it seems quite strange to start by introducing >>> some sort of global limit, combining memory for all backends. I do >>> understand that the intent is to have such global limit in order to >>> prevent issues with the OOM killer and/or not to interfere with other >>> stuff running on the same machine. And while I'm not saying we should >>> not have such limit, every time I wished to have a memory limit it was a >>> backend-level one. Ideally a workmem-like limit that would "adjust" the >>> work_mem values used by the optimizer (but that's not what this patch >>> aims to do), or at least a backstop in case something goes wrong (say, a >>> memory leak, OLTP application issuing complex queries, etc.). >> >> I think what Tomas suggests is the right strategy. I'm also interested in this topic. And agreed that it's best to move from the limit for a separate backend to the global one. In more details let me suggest the following steps or parts: 1) realize memory limitation for a separate backend independent from the work_mem GUC; 2) add workmem-like limit that would "adjust" the work_mem values used by the optimize as Thomas suggested; 3) add global limit for all backends. As for p.1 there is a patch that was originally suggested by my colleague Maxim Orlov and which i modified for the current master. This patch introduces the only max_backend_memory GUC that specifies the maximum amount of memory that can be allocated to a backend. Zero value means no limit. If the allocated memory size is exceeded, a standard "out of memory" error will be issued. Also the patch introduces the pg_get_backend_memory_contexts_total_bytes() function, which allows to know how many bytes have already been allocated to the process in contexts. And in the build with asserts it adds the pg_get_backend_memory_allocation_stats() function that allows to get additional information about memory allocations for debug purposes. >> This strategy solves the ongoing problem of how to set work_mem, if >> some queries have lots of operators and others don't -- now we just >> set backend_work_mem, as a limit on the entire query's total work_mem. >> And a bit of integration with the optimizer will allow us to >> distribute the total backend_work_mem to individual execution nodes, >> with the goal of minimizing spilling, without exceeding the >> backend_work_mem limit. As for p.2 maybe one can set a maximum number of parallel sort or hash table operations before writing to disk instead of absolute value in the work_mem GUC? E.g. introduce а max_query_operations GUC or a variable in such a way that old work_mem will be equal to max_backend_memory divided by max_query_operations. What do you think about such approach? With the best wishes, -- Anton A. Melnikov Postgres Professional: http://www.postgrespro.com The Russian Postgres Company --------------2l4fCsYu0fSS590AQA7xs3rS Content-Type: text/x-patch; charset=UTF-8; name="0001-v1-limit-backend-heap-memory-allocation.patch" Content-Disposition: attachment; filename="0001-v1-limit-backend-heap-memory-allocation.patch" Content-Transfer-Encoding: base64 RnJvbSA4ZWMzNTQ4NjA0YmY2YTFmNWY0YzI5MDQ5NTg0M2U3MDgwZDA5NjYwIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW50b24gQS4gTWVsbmlrb3YiIDxhLm1lbG5pa292 QHBvc3RncmVzcHJvLnJ1PgpEYXRlOiBTYXQsIDI4IERlYyAyMDI0IDEyOjQ3OjI0ICswMzAw ClN1YmplY3Q6IFtQQVRDSF0gICAgIExpbWl0IGJhY2tlbmQgaGVhcCBtZW1vcnkgYWxsb2Nh dGlvbgoKICAgIFRoaXMgcGVyLWJhY2tlbmQgR1VDIGNhbiBsaW1pdCB0aGUgYW1vdW50IG9m IGhlYXAgYWxsb2NhdGVkCiAgICBtZW1vcnkuICBVcG9uIHJlYWNoaW5nIHRoaXMgbGltaXQg Im91dCBvZiBtZW1vcnkiIGVycm9yIHdpbGwKICAgIGJlIHRyaWdnZXJlZC4KCiAgICBHVUMg aXMgZGlhYmxlZCBieSBkZWZhdWx0LgoKICAgIEF1dGhvcnM6IE1heGltIE9ybG92IDxvcmxv dm1nQGdtYWlsLmNvbT4sIEFudG9uIEEuIE1lbG5pa292IDxhLm1lbG5pa292QHBvc3RncmVz cHJvLnJ1PgotLS0KIGRvYy9zcmMvc2dtbC9jb25maWcuc2dtbCAgICAgICAgICAgICAgICAg ICAgICB8ICAxNyArCiBzcmMvYmFja2VuZC91dGlscy9hY3Rpdml0eS9iYWNrZW5kX3N0YXR1 cy5jICAgfCAzMzUgKysrKysrKysrKysrKysrKysrCiBzcmMvYmFja2VuZC91dGlscy9taXNj L2d1Y190YWJsZXMuYyAgICAgICAgICAgfCAgMTAgKwogc3JjL2JhY2tlbmQvdXRpbHMvbWlz Yy9wb3N0Z3Jlc3FsLmNvbmYuc2FtcGxlIHwgICAxICsKIHNyYy9iYWNrZW5kL3V0aWxzL21t Z3IvYXNldC5jICAgICAgICAgICAgICAgICB8ICAzNiArLQogc3JjL2JhY2tlbmQvdXRpbHMv bW1nci9nZW5lcmF0aW9uLmMgICAgICAgICAgIHwgIDE4ICstCiBzcmMvYmFja2VuZC91dGls cy9tbWdyL3NsYWIuYyAgICAgICAgICAgICAgICAgfCAgMTcgKy0KIHNyYy9pbmNsdWRlL2Nh dGFsb2cvcGdfcHJvYy5kYXQgICAgICAgICAgICAgICB8ICAxNCArCiBzcmMvaW5jbHVkZS91 dGlscy9iYWNrZW5kX3N0YXR1cy5oICAgICAgICAgICAgfCAgMTAgKwogc3JjL3Rlc3QvbW9k dWxlcy9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgIHwgICA0ICsKIC4uLi9tb2R1bGVz L3Rlc3RfYmFja2VuZF9tZW1vcnkvLmdpdGlnbm9yZSAgICB8ICAgNCArCiBzcmMvdGVzdC9t b2R1bGVzL3Rlc3RfYmFja2VuZF9tZW1vcnkvTWFrZWZpbGUgfCAgMTQgKwogc3JjL3Rlc3Qv bW9kdWxlcy90ZXN0X2JhY2tlbmRfbWVtb3J5L1JFQURNRSAgIHwgICAxICsKIC4uLi90LzAw MV9tYXhfYmFja2VuZF9tZW1vcnkucGwgICAgICAgICAgICAgICB8ICA4NSArKysrKwogMTQg ZmlsZXMgY2hhbmdlZCwgNTQwIGluc2VydGlvbnMoKyksIDI2IGRlbGV0aW9ucygtKQogY3Jl YXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L21vZHVsZXMvdGVzdF9iYWNrZW5kX21lbW9yeS8u Z2l0aWdub3JlCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2Jh Y2tlbmRfbWVtb3J5L01ha2VmaWxlCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvbW9k dWxlcy90ZXN0X2JhY2tlbmRfbWVtb3J5L1JFQURNRQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNy Yy90ZXN0L21vZHVsZXMvdGVzdF9iYWNrZW5kX21lbW9yeS90LzAwMV9tYXhfYmFja2VuZF9t ZW1vcnkucGwKCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvY29uZmlnLnNnbWwgYi9kb2Mv c3JjL3NnbWwvY29uZmlnLnNnbWwKaW5kZXggZmJkZDZjZTU3NC4uNDA5OWQ2ZTFhOCAxMDA2 NDQKLS0tIGEvZG9jL3NyYy9zZ21sL2NvbmZpZy5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9j b25maWcuc2dtbApAQCAtMjMzNyw2ICsyMzM3LDIzIEBAIGluY2x1ZGVfZGlyICdjb25mLmQn CiAgICAgICA8L2xpc3RpdGVtPgogICAgICA8L3Zhcmxpc3RlbnRyeT4KIAorICAgIDx2YXJs aXN0ZW50cnkgaWQ9Imd1Yy1tYXgtYmFja2VuZC1tZW1vcnkiIHhyZWZsYWJlbD0ibWF4X2Jh Y2tlbmRfbWVtb3J5Ij4KKyAgICAgIDx0ZXJtPjx2YXJuYW1lPm1heF9iYWNrZW5kX21lbW9y eTwvdmFybmFtZT4gKDx0eXBlPmludGVnZXI8L3R5cGU+KQorICAgICAgPGluZGV4dGVybT4K KyAgICAgICA8cHJpbWFyeT48dmFybmFtZT5tYXhfYmFja2VuZF9tZW1vcnk8L3Zhcm5hbWU+ IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyPC9wcmltYXJ5PgorICAgICAgPC9pbmRleHRlcm0+ CisgICAgICA8L3Rlcm0+CisgICAgICA8bGlzdGl0ZW0+CisgICAgICAgPHBhcmE+CisgICAg ICAgIFNwZWNpZmllcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHRoYXQgY2FuIGJl IGFsbG9jYXRlZCB0byBhIGJhY2tlbmQuCisgICAgICAgIFplcm8gbWVhbnMgbm8gbGltaXQu CisgICAgICAgPC9wYXJhPgorICAgICAgIDxwYXJhPgorICAgICAgICBEZWZhdWx0OiAwCisg ICAgICAgPC9wYXJhPgorICAgICAgPC9saXN0aXRlbT4KKyAgICAgPC92YXJsaXN0ZW50cnk+ CisKICAgICAgPC92YXJpYWJsZWxpc3Q+CiAgICAgIDwvc2VjdDI+CiAKZGlmZiAtLWdpdCBh L3NyYy9iYWNrZW5kL3V0aWxzL2FjdGl2aXR5L2JhY2tlbmRfc3RhdHVzLmMgYi9zcmMvYmFj a2VuZC91dGlscy9hY3Rpdml0eS9iYWNrZW5kX3N0YXR1cy5jCmluZGV4IGJmMzNlMzNhNGUu LmE0MWYwMDRjZjcgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FjdGl2aXR5L2Jh Y2tlbmRfc3RhdHVzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvYmFja2Vu ZF9zdGF0dXMuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgInBvc3RncmVzLmgiCiAK ICNpbmNsdWRlICJhY2Nlc3MveGFjdC5oIgorI2luY2x1ZGUgImZ1bmNhcGkuaCIKICNpbmNs dWRlICJsaWJwcS9saWJwcS1iZS5oIgogI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgogI2luY2x1 ZGUgInBnX3RyYWNlLmgiCkBAIC0yMCw2ICsyMSw3IEBACiAjaW5jbHVkZSAic3RvcmFnZS9w cm9jLmgiCQkvKiBmb3IgTXlQcm9jICovCiAjaW5jbHVkZSAic3RvcmFnZS9wcm9jYXJyYXku aCIKICNpbmNsdWRlICJ1dGlscy9hc2NpaS5oIgorI2luY2x1ZGUgInV0aWxzL2J1aWx0aW5z LmgiCiAjaW5jbHVkZSAidXRpbHMvZ3VjLmgiCQkJLyogZm9yIGFwcGxpY2F0aW9uX25hbWUg Ki8KICNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgogCkBAIC03Myw2ICs3NSwxNyBAQCBz dGF0aWMgdm9pZCBwZ3N0YXRfYmVzaHV0ZG93bl9ob29rKGludCBjb2RlLCBEYXR1bSBhcmcp Owogc3RhdGljIHZvaWQgcGdzdGF0X3JlYWRfY3VycmVudF9zdGF0dXModm9pZCk7CiBzdGF0 aWMgdm9pZCBwZ3N0YXRfc2V0dXBfYmFja2VuZF9zdGF0dXNfY29udGV4dCh2b2lkKTsKIAor LyoKKyAqIFRvdGFsIG1lbW9yeSBzaXplIGFsbG9jYXRlZCBieSBiYWNrZW5kLgorICovCitz dGF0aWMgU2l6ZSBteV9hbGxvY2F0ZWRfYnl0ZXMgPSAwOworCisvKgorICogR1VDIHZhcmlh YmxlCisgKgorICogTWF4IGJhY2tlbmQgbWVtb3J5IGFsbG9jYXRpb24gYWxsb3dlZCAoTUIp LiAwID0gZGlzYWJsZWQKKyAqLworaW50IG1heF9iYWNrZW5kX21lbW9yeV9zaXplX21iID0g MDsKIAogLyoKICAqIFJlcG9ydCBzaGFyZWQtbWVtb3J5IHNwYWNlIG5lZWRlZCBieSBCYWNr ZW5kU3RhdHVzU2htZW1Jbml0LgpAQCAtMTIyMiwzICsxMjM1LDMyNSBAQCBwZ3N0YXRfY2xp cF9hY3Rpdml0eShjb25zdCBjaGFyICpyYXdfYWN0aXZpdHkpCiAKIAlyZXR1cm4gYWN0aXZp dHk7CiB9CisKKyNpZmRlZiBVU0VfQVNTRVJUX0NIRUNLSU5HCisvKgorICogU2luZ2xlIG1l bW9yeSBhbGxvY2F0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdAoreworCXZvaWQgICAqYWRk cjsKKwlTaXplCXNpemU7CisJYm9vbAlkZWxldGVkOworfSBIZWFwQmxvY2s7CisKKy8qCisg KiBEeW5hbWljIGFycmF5IG9mIGFsbCBhbGxvY2F0ZWQgbWVtb3J5LgorICovCit0eXBlZGVm IHN0cnVjdAoreworCUhlYXBCbG9jawkgICAqYmxvY2tzOworCVNpemUJCQlzaXplOworCVNp emUJCQljYXBhY2l0eTsKKwlTaXplCQkJbmRlbGV0ZWQ7Cit9IEhlYXBCbG9ja1N0YXQ7CisK K3N0YXRpYyBIZWFwQmxvY2tTdGF0IGhlYXBzdGF0ID0KK3sKKwkuYmxvY2tzID0gTlVMTCwK Kwkuc2l6ZSA9IDAsCisJLmNhcGFjaXR5ID0gMCwKKwkubmRlbGV0ZWQgPSAwCit9OworCisv KgorICogRXh0ZW5kIGhlYXBzdGF0IGFsbG9jYXRpb24gc3RhdCBhcnJheS4KKyAqLworc3Rh dGljIGlubGluZSB2b2lkCitIZWFwQmxvY2tTdGF0RXh0ZW5kKHZvaWQpCit7CisJaWYgKGhl YXBzdGF0LmNhcGFjaXR5ID09IDApCisJeworI2RlZmluZSBJTklUX01FTU9SWV9DQVBBQ0lU WSAxMDI0CisJCWhlYXBzdGF0LmNhcGFjaXR5ID0gSU5JVF9NRU1PUllfQ0FQQUNJVFk7CisJ CWhlYXBzdGF0LmJsb2NrcyA9IChIZWFwQmxvY2sgKikgbWFsbG9jKGhlYXBzdGF0LmNhcGFj aXR5ICoKKwkJCQkJCQkJCQkJc2l6ZW9mKGhlYXBzdGF0LmJsb2Nrc1swXSkpOworCX0KKwll bHNlIGlmIChoZWFwc3RhdC5jYXBhY2l0eSA9PSBoZWFwc3RhdC5zaXplKQorCXsKKwkJaGVh cHN0YXQuY2FwYWNpdHkgKj0gMjsKKwkJaGVhcHN0YXQuYmxvY2tzID0gKEhlYXBCbG9jayAq KSByZWFsbG9jKGhlYXBzdGF0LmJsb2NrcywKKwkJCQkJCQkJCQkJIGhlYXBzdGF0LmNhcGFj aXR5ICoKKwkJCQkJCQkJCQkJIHNpemVvZihoZWFwc3RhdC5ibG9ja3NbMF0pKTsKKwl9Cit9 CisKKy8qCisgKiBDb21wYXJlIEhlYXBCbG9ja3MuIFB1dCBub3QgZGVsZXRlZCBpbiB0aGUg YmVnaW5uaW5nIG9mIGFuIGFycmF5LgorICovCitzdGF0aWMgaW50CitIZWFwQmxvY2tDbXAo Y29uc3Qgdm9pZCAqcCwgY29uc3Qgdm9pZCAqcSkKK3sKKwljb25zdCBIZWFwQmxvY2sgICAg KmEgPSAoY29uc3QgSGVhcEJsb2NrICopIHAsCisJCQkJCSAgICpiID0gKGNvbnN0IEhlYXBC bG9jayAqKSBxOworCWludAkJCQkJYXJnMSA9IGEtPmRlbGV0ZWQsCisJCQkJCQlhcmcyID0g Yi0+ZGVsZXRlZDsKKworCWlmIChhcmcxIDwgYXJnMikKKwkJcmV0dXJuIC0xOworCWlmIChh cmcxID4gYXJnMikKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQdXQg YWxsIG5vdCBkZWxldGVkIGl0ZW1zIGluIHRoZSBiZWdpbm5pbmcuCisgKi8KK3N0YXRpYyB2 b2lkCitIZWFwQmxvY2tTdGF0Q29tcGFjdGlmeSh2b2lkKQoreworCWlmIChoZWFwc3RhdC5u ZGVsZXRlZCA8IGhlYXBzdGF0LnNpemUgLyAyKQorCQlyZXR1cm47CisKKwlxc29ydChoZWFw c3RhdC5ibG9ja3MsIGhlYXBzdGF0LnNpemUsIHNpemVvZihoZWFwc3RhdC5ibG9ja3NbMF0p LCBIZWFwQmxvY2tDbXApOworCWhlYXBzdGF0LnNpemUgLT0gaGVhcHN0YXQubmRlbGV0ZWQ7 CisJaGVhcHN0YXQubmRlbGV0ZWQgPSAwOworfQorCisvKgorICogUHVzaCBuZXcgbWVtb3J5 IGFsbG9jYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCitIZWFwQmxvY2tTdGF0UHVzaCh2b2lk ICpwdHIsIFNpemUgc2l6ZSkKK3sKKwlTaXplCWk7CisKKwlIZWFwQmxvY2tTdGF0RXh0ZW5k KCk7CisJSGVhcEJsb2NrU3RhdENvbXBhY3RpZnkoKTsKKworCWZvciAoaSA9IDA7IGkgPCBo ZWFwc3RhdC5zaXplOyArK2kpCisJCUFzc2VydChoZWFwc3RhdC5ibG9ja3NbaV0uZGVsZXRl ZCB8fCBoZWFwc3RhdC5ibG9ja3NbaV0uYWRkciAhPSBwdHIpOworCisJQXNzZXJ0KGhlYXBz dGF0Lm5kZWxldGVkIDw9IGhlYXBzdGF0LnNpemUpOworCisJLyogVHJ5IHRvIGZpbmQgZGVs ZXRlZCBpdGVtIHRvIHJldXNlIGl0Li4uICovCisJZm9yIChpID0gMDsgaSA8IGhlYXBzdGF0 LnNpemU7ICsraSkKKwl7CisJCWlmIChoZWFwc3RhdC5ibG9ja3NbaV0uZGVsZXRlZCA9PSB0 cnVlKQorCQl7CisJCQloZWFwc3RhdC5ibG9ja3NbaV0uYWRkciA9IHB0cjsKKwkJCWhlYXBz dGF0LmJsb2Nrc1tpXS5zaXplID0gc2l6ZTsKKwkJCWhlYXBzdGF0LmJsb2Nrc1tpXS5kZWxl dGVkID0gZmFsc2U7CisJCQktLWhlYXBzdGF0Lm5kZWxldGVkOworCQkJQXNzZXJ0KGhlYXBz dGF0Lm5kZWxldGVkIDw9IGhlYXBzdGF0LnNpemUpOworCQkJcmV0dXJuOworCQl9CisJfQor CisJLyogLi4uIG5vIGVtcHR5IHBsYWNlcywgYXBwZW5kISAqLworCWhlYXBzdGF0LmJsb2Nr c1tpXS5hZGRyID0gcHRyOworCWhlYXBzdGF0LmJsb2Nrc1tpXS5zaXplID0gc2l6ZTsKKwlo ZWFwc3RhdC5ibG9ja3NbaV0uZGVsZXRlZCA9IGZhbHNlOworCisJKytoZWFwc3RhdC5zaXpl OworfQorCisvKgorICogUG9wIG1lbW9yeSBhbGxvY2F0aW9uLgorICovCitzdGF0aWMgU2l6 ZQorSGVhcEJsb2NrU3RhdFBvcCh2b2lkICpwdHIpCit7CisJU2l6ZQlpOworCisJZm9yIChp ID0gMDsgaSA8IGhlYXBzdGF0LnNpemU7ICsraSkKKwl7CisJCWlmIChoZWFwc3RhdC5ibG9j a3NbaV0uYWRkciA9PSBwdHIpCisJCXsKKwkJCUFzc2VydChoZWFwc3RhdC5ibG9ja3NbaV0u ZGVsZXRlZCA9PSBmYWxzZSk7CisJCQloZWFwc3RhdC5ibG9ja3NbaV0uZGVsZXRlZCA9IHRy dWU7CisJCQkrK2hlYXBzdGF0Lm5kZWxldGVkOworCQkJQXNzZXJ0KGhlYXBzdGF0Lm5kZWxl dGVkIDw9IGhlYXBzdGF0LnNpemUpOworCQkJcmV0dXJuIGhlYXBzdGF0LmJsb2Nrc1tpXS5z aXplOworCQl9CisJfQorCisJLyogc2hvdWxkIG5vdCBnZXQgaGVyZS4uLiAqLworCUFzc2Vy dChpICE9IGhlYXBzdGF0LnNpemUpOworCXJldHVybiAwOworfQorI2VuZGlmIC8qIFVTRV9B U1NFUlRfQ0hFQ0tJTkcgKi8KKworLyoKKyAqIENvdW50IGJhY2tlbmQgYWxsb2NhdGVkIG1l bW9yeS4KKyAqIElmIGxpbWl0IGlzIHNldCAobWF4X2JhY2tlbmRfbWVtb3J5X3NpemVfbWIp IGFuZCBjaGVjaz10cnVlLCB0aGVuIG5lZWQgdG8KKyAqIGNoZWNrIG15X2FsbG9jYXRlZF9i eXRlcyBmb3IgZ29pbmcgYmV5b25kIHRoZSBsaW1pdC4KKyAqLworc3RhdGljIGJvb2wKK3Bn c3RhdF9hbGxvYyhTaXplIHNpemUsIGJvb2wgY2hlY2spCit7CisJLyogRXhjbHVkZSBhdXhp bGlhcnkgcHJvY2Vzc2VzIGZyb20gdGhlIGNoZWNrICovCisJc3dpdGNoIChNeUJhY2tlbmRU eXBlKQorCXsKKwkJY2FzZSBCX1NUQVJUVVA6CisJCWNhc2UgQl9BUkNISVZFUjoKKwkJY2Fz ZSBCX0JHX1dSSVRFUjoKKwkJY2FzZSBCX0NIRUNLUE9JTlRFUjoKKwkJY2FzZSBCX1dBTF9X UklURVI6CisJCWNhc2UgQl9XQUxfUkVDRUlWRVI6CisJCWNhc2UgQl9XQUxfU1VNTUFSSVpF UjoKKwkJCXJldHVybiB0cnVlOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJbXlf YWxsb2NhdGVkX2J5dGVzICs9IHNpemU7CisKKwlpZiAobWF4X2JhY2tlbmRfbWVtb3J5X3Np emVfbWIgPT0gMCB8fCAhY2hlY2spCisJCXJldHVybiB0cnVlOworCisJLyogQ2hlY2sgZm9y IGdvaW5nIGJleW9uZCB0aGUgbGltaXQgKi8KKyNkZWZpbmUgVE9fQllURVMobWIpCSgoU2l6 ZSkobWIpICogMTAyNCAqIDEwMjQpCisJaWYgKG15X2FsbG9jYXRlZF9ieXRlcyA+IFRPX0JZ VEVTKG1heF9iYWNrZW5kX21lbW9yeV9zaXplX21iKSkKKwl7CisJCW15X2FsbG9jYXRlZF9i eXRlcyAtPSBzaXplOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9 CisKKy8qCisgKiBDb3VudCBkZWFsbG9jYXRlZCBiYWNrZW5kIG1lbW9yeS4KKyAqLworc3Rh dGljIHZvaWQKK3Bnc3RhdF9mcmVlKFNpemUgc2l6ZSkKK3sKKwkvKiBFeGNsdWRlIGF1eGls aWFyeSBwcm9jZXNzZXMgZnJvbSB0aGUgY2hlY2sgKi8KKwlzd2l0Y2ggKE15QmFja2VuZFR5 cGUpCisJeworCQljYXNlIEJfU1RBUlRVUDoKKwkJY2FzZSBCX0FSQ0hJVkVSOgorCQljYXNl IEJfQkdfV1JJVEVSOgorCQljYXNlIEJfQ0hFQ0tQT0lOVEVSOgorCQljYXNlIEJfV0FMX1dS SVRFUjoKKwkJY2FzZSBCX1dBTF9SRUNFSVZFUjoKKwkJY2FzZSBCX1dBTF9TVU1NQVJJWkVS OgorCQkJcmV0dXJuOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJQXNzZXJ0KG15 X2FsbG9jYXRlZF9ieXRlcyA+PSBzaXplKTsKKwlteV9hbGxvY2F0ZWRfYnl0ZXMgLT0gc2l6 ZTsKK30KKworLyoKKyAqIG1hbGxvYygpIHdpdGggYnl0ZXMgY291bnRlcgorICovCit2b2lk ICoKK21hbGxvY19hbmRfY291bnQoU2l6ZSBzaXplKQoreworCXZvaWQgICAqcHRyOworCisJ aWYgKCFwZ3N0YXRfYWxsb2Moc2l6ZSwgdHJ1ZSkpCisJCXJldHVybiBOVUxMOworCisJcHRy ID0gbWFsbG9jKHNpemUpOworCWlmIChwdHIgPT0gTlVMTCkKKwkJcGdzdGF0X2ZyZWUoc2l6 ZSk7CisjaWZkZWYgVVNFX0FTU0VSVF9DSEVDS0lORworCWVsc2UKKwkJSGVhcEJsb2NrU3Rh dFB1c2gocHRyLCBzaXplKTsKKyNlbmRpZgorCisJcmV0dXJuIHB0cjsKK30KKworLyoKKyAq IHJlYWxsb2MoKSB3aXRoIGJ5dGVzIGNvdW50ZXIKKyAqLwordm9pZCAqCityZWFsbG9jX2Fu ZF9jb3VudCh2b2lkICpwdHIsIFNpemUgbmV3X3NpemUsIFNpemUgb2xkX3NpemUpCit7CisJ QXNzZXJ0KG9sZF9zaXplID09IEhlYXBCbG9ja1N0YXRQb3AocHRyKSk7CisKKwlwZ3N0YXRf ZnJlZShvbGRfc2l6ZSk7CisKKwlpZiAoIXBnc3RhdF9hbGxvYyhuZXdfc2l6ZSwgdHJ1ZSkp CisJeworCQkvKiBOZXcgYnVmZmVyIGNhbiBub3QgYmUgYWxsb2NlZCwgc28gbmVlZCB0byBy ZXN0b3JlIG9sZCBvbmUgKi8KKwkJcGdzdGF0X2FsbG9jKG9sZF9zaXplLCBmYWxzZSk7Cisj aWZkZWYgVVNFX0FTU0VSVF9DSEVDS0lORworCQlIZWFwQmxvY2tTdGF0UHVzaChwdHIsIG9s ZF9zaXplKTsKKyNlbmRpZgorCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwdHIgPSByZWFsbG9j KHB0ciwgbmV3X3NpemUpOworCWlmIChwdHIgPT0gTlVMTCkKKwkJcGdzdGF0X2ZyZWUobmV3 X3NpemUpOworI2lmZGVmIFVTRV9BU1NFUlRfQ0hFQ0tJTkcKKwllbHNlCisJCUhlYXBCbG9j a1N0YXRQdXNoKHB0ciwgbmV3X3NpemUpOworI2VuZGlmCisKKwlyZXR1cm4gcHRyOworfQor CisvKgorICogZnJlZSgpIHdpdGggYnl0ZXMgY291bnRlcgorICovCit2b2lkCitmcmVlX2Fu ZF9jb3VudCh2b2lkICpwdHIsIFNpemUgc2l6ZSkKK3sKKyNpZmRlZiBVU0VfQVNTRVJUX0NI RUNLSU5HCisJQXNzZXJ0KHNpemUgPT0gSGVhcEJsb2NrU3RhdFBvcChwdHIpKTsKKyNlbmRp ZgorCisJcGdzdGF0X2ZyZWUoc2l6ZSk7CisJZnJlZShwdHIpOworfQorCisvKgorICogcGdf Z2V0X2JhY2tlbmRfbWVtb3J5X2NvbnRleHRzX3RvdGFsX2J5dGVzCisgKgkJVG90YWwgYW1v dW50IG9mIGJ5dGVzIGluIGFsbCBhbGxvY2F0ZWQgY29udGV4dHMuCisgKi8KK0RhdHVtCitw Z19nZXRfYmFja2VuZF9tZW1vcnlfY29udGV4dHNfdG90YWxfYnl0ZXMoUEdfRlVOQ1RJT05f QVJHUykKK3sKKwlQR19SRVRVUk5fSU5UNjQobXlfYWxsb2NhdGVkX2J5dGVzKTsKK30KKwor LyoKKyAqIHBnX2dldF9iYWNrZW5kX21lbW9yeV9hbGxvY2F0aW9uX3N0YXRzCisgKgkJU1FM IFNSRiBzaG93aW5nIGJhY2tlbmQgYWxsb2NhdGVkIG1lbW9yeS4KKyAqLworRGF0dW0KK3Bn X2dldF9iYWNrZW5kX21lbW9yeV9hbGxvY2F0aW9uX3N0YXRzKFBHX0ZVTkNUSU9OX0FSR1Mp Cit7CisjaWZkZWYgVVNFX0FTU0VSVF9DSEVDS0lORworI2RlZmluZSBNRU1PUllfQUxMT0NB VElPTl9DT0xTIDMKKwlSZXR1cm5TZXRJbmZvICAqcnNpbmZvID0gKFJldHVyblNldEluZm8g KikgZmNpbmZvLT5yZXN1bHRpbmZvOworCURhdHVtCQkJdmFsdWVzW01FTU9SWV9BTExPQ0FU SU9OX0NPTFNdOworCWJvb2wJCQludWxsc1tNRU1PUllfQUxMT0NBVElPTl9DT0xTXTsKKwlT aXplCQkJaTsKKwljaGFyCQkJdGV4dFsxNl07CisKKwlJbml0TWF0ZXJpYWxpemVkU1JGKGZj aW5mbywgMCk7CisKKwltZW1zZXQobnVsbHMsIDAsIHNpemVvZihudWxscykpOworCWZvciAo aSA9IDA7IGkgPCBoZWFwc3RhdC5zaXplOyArK2kpCisJeworCQlwZ19zbnByaW50Zih0ZXh0 LCBzaXplb2YodGV4dCksICIlcCIsIGhlYXBzdGF0LmJsb2Nrc1tpXS5hZGRyKTsKKwkJdmFs dWVzWzBdID0gQ1N0cmluZ0dldFRleHREYXR1bSh0ZXh0KTsKKwkJdmFsdWVzWzFdID0gSW50 NjRHZXREYXR1bShoZWFwc3RhdC5ibG9ja3NbaV0uc2l6ZSk7CisJCXZhbHVlc1syXSA9IEJv b2xHZXREYXR1bShoZWFwc3RhdC5ibG9ja3NbaV0uZGVsZXRlZCk7CisJCXR1cGxlc3RvcmVf cHV0dmFsdWVzKHJzaW5mby0+c2V0UmVzdWx0LCByc2luZm8tPnNldERlc2MsIHZhbHVlcywg bnVsbHMpOworCX0KKyNlbHNlCisJZWxvZyhFUlJPUiwgInRoaXMgb25seSB3b3JrcyBmb3Ig YnVpbGRzIHdpdGggYXNzZXJ0cyBlbmFibGVkIik7CisjZW5kaWYKKworCXJldHVybiAoRGF0 dW0pIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9taXNjL2d1Y190YWJs ZXMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxlcy5jCmluZGV4IDhjZjFh ZmJhZDIuLmY4ODhkNDE3ZGUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL21pc2Mv Z3VjX3RhYmxlcy5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxlcy5j CkBAIC0zNzMyLDYgKzM3MzIsMTYgQEAgc3RydWN0IGNvbmZpZ19pbnQgQ29uZmlndXJlTmFt ZXNJbnRbXSA9CiAJCVNDUkFNX1NIQV8yNTZfREVGQVVMVF9JVEVSQVRJT05TLCAxLCBJTlRf TUFYLAogCQlOVUxMLCBOVUxMLCBOVUxMCiAJfSwKKwl7CisJCXsibWF4X2JhY2tlbmRfbWVt b3J5IiwgUEdDX1NVX0JBQ0tFTkQsIFJFU09VUkNFU19NRU0sCisJCQlnZXR0ZXh0X25vb3Ao IlJlc3RyaWN0IHRvdGFsIGJhY2tlbmQgbWVtb3J5IGFsbG9jYXRpb25zIHRvIHRoaXMgbWF4 IChyb3VuZGVkIHVwIHRvIHRoZSBuZWFyZXN0IE1CKS4iKSwKKwkJCU5VTEwsCisJCQlHVUNf VU5JVF9NQgorCQl9LAorCQkmbWF4X2JhY2tlbmRfbWVtb3J5X3NpemVfbWIsCisJCTAsIDAs IElOVF9NQVgsCisJCU5VTEwsIE5VTEwsIE5VTEwKKwl9LAogCiAJLyogRW5kLW9mLWxpc3Qg bWFya2VyICovCiAJewpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9wb3N0 Z3Jlc3FsLmNvbmYuc2FtcGxlIGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9wb3N0Z3Jlc3Fs LmNvbmYuc2FtcGxlCmluZGV4IGEyYWM3NTc1Y2EuLjE4NTQ2MDFjYTkgMTAwNjQ0Ci0tLSBh L3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvcG9zdGdyZXNxbC5jb25mLnNhbXBsZQorKysgYi9z cmMvYmFja2VuZC91dGlscy9taXNjL3Bvc3RncmVzcWwuY29uZi5zYW1wbGUKQEAgLTE3MSw2 ICsxNzEsNyBAQAogI3NlcmlhbGl6YWJsZV9idWZmZXJzID0gMzIJCSMgbWVtb3J5IGZvciBw Z19zZXJpYWwKICNzdWJ0cmFuc2FjdGlvbl9idWZmZXJzID0gMAkJIyBtZW1vcnkgZm9yIHBn X3N1YnRyYW5zICgwID0gYXV0bykKICN0cmFuc2FjdGlvbl9idWZmZXJzID0gMAkJIyBtZW1v cnkgZm9yIHBnX3hhY3QgKDAgPSBhdXRvKQorI21heF9iYWNrZW5kX21lbW9yeSA9IDAJCQkj IGxpbWl0IGFtb3VudCBvZiBwZXItYmFja2VuZCBhbGxvY2F0ZWQgbWVtb3J5IGluIG1lZ2Fi eXRlcwogCiAjIC0gRGlzayAtCiAKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL21t Z3IvYXNldC5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvbW1nci9hc2V0LmMKaW5kZXggZGVkZTMw ZGQ4Ni4uZTMwNGRhN2MzYyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvbW1nci9h c2V0LmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvbW1nci9hc2V0LmMKQEAgLTQ3LDYgKzQ3 LDcgQEAKICNpbmNsdWRlICJwb3N0Z3Jlcy5oIgogCiAjaW5jbHVkZSAicG9ydC9wZ19iaXR1 dGlscy5oIgorI2luY2x1ZGUgInV0aWxzL2JhY2tlbmRfc3RhdHVzLmgiCiAjaW5jbHVkZSAi dXRpbHMvbWVtZGVidWcuaCIKICNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgogI2luY2x1 ZGUgInV0aWxzL21lbXV0aWxzX2ludGVybmFsLmgiCkBAIC00NDEsNyArNDQyLDcgQEAgQWxs b2NTZXRDb250ZXh0Q3JlYXRlSW50ZXJuYWwoTWVtb3J5Q29udGV4dCBwYXJlbnQsCiAJICog QWxsb2NhdGUgdGhlIGluaXRpYWwgYmxvY2suICBVbmxpa2Ugb3RoZXIgYXNldC5jIGJsb2Nr cywgaXQgc3RhcnRzIHdpdGgKIAkgKiB0aGUgY29udGV4dCBoZWFkZXIgYW5kIGl0cyBibG9j ayBoZWFkZXIgZm9sbG93cyB0aGF0LgogCSAqLwotCXNldCA9IChBbGxvY1NldCkgbWFsbG9j KGZpcnN0QmxvY2tTaXplKTsKKwlzZXQgPSAoQWxsb2NTZXQpIG1hbGxvY19hbmRfY291bnQo Zmlyc3RCbG9ja1NpemUpOwogCWlmIChzZXQgPT0gTlVMTCkKIAl7CiAJCWlmIChUb3BNZW1v cnlDb250ZXh0KQpAQCAtNTc5LDEzICs1ODAsMTYgQEAgQWxsb2NTZXRSZXNldChNZW1vcnlD b250ZXh0IGNvbnRleHQpCiAJCX0KIAkJZWxzZQogCQl7CisJCQlTaXplCWRlYWxsb2NhdGlv bl9zaXplOworCiAJCQkvKiBOb3JtYWwgY2FzZSwgcmVsZWFzZSB0aGUgYmxvY2sgKi8KLQkJ CWNvbnRleHQtPm1lbV9hbGxvY2F0ZWQgLT0gYmxvY2stPmVuZHB0ciAtICgoY2hhciAqKSBi bG9jayk7CisJCQlkZWFsbG9jYXRpb25fc2l6ZSA9IGJsb2NrLT5lbmRwdHIgLSAoKGNoYXIg KikgYmxvY2spOworCQkJY29udGV4dC0+bWVtX2FsbG9jYXRlZCAtPSBkZWFsbG9jYXRpb25f c2l6ZTsKIAogI2lmZGVmIENMT0JCRVJfRlJFRURfTUVNT1JZCiAJCQl3aXBlX21lbShibG9j aywgYmxvY2stPmZyZWVwdHIgLSAoKGNoYXIgKikgYmxvY2spKTsKICNlbmRpZgotCQkJZnJl ZShibG9jayk7CisJCQlmcmVlX2FuZF9jb3VudChibG9jaywgZGVhbGxvY2F0aW9uX3NpemUp OwogCQl9CiAJCWJsb2NrID0gbmV4dDsKIAl9CkBAIC02NDksNyArNjUzLDcgQEAgQWxsb2NT ZXREZWxldGUoTWVtb3J5Q29udGV4dCBjb250ZXh0KQogCQkJCWZyZWVsaXN0LT5udW1fZnJl ZS0tOwogCiAJCQkJLyogQWxsIHRoYXQgcmVtYWlucyBpcyB0byBmcmVlIHRoZSBoZWFkZXIv aW5pdGlhbCBibG9jayAqLwotCQkJCWZyZWUob2xkc2V0KTsKKwkJCQlmcmVlX2FuZF9jb3Vu dChvbGRzZXQsIG9sZHNldC0+aGVhZGVyLm1lbV9hbGxvY2F0ZWQpOwogCQkJfQogCQkJQXNz ZXJ0KGZyZWVsaXN0LT5udW1fZnJlZSA9PSAwKTsKIAkJfQpAQCAtNjY2LDE2ICs2NzAsMjAg QEAgQWxsb2NTZXREZWxldGUoTWVtb3J5Q29udGV4dCBjb250ZXh0KQogCXdoaWxlIChibG9j ayAhPSBOVUxMKQogCXsKIAkJQWxsb2NCbG9jawluZXh0ID0gYmxvY2stPm5leHQ7CisJCVNp emUJCWRlYWxsb2NhdGlvbl9zaXplID0gMDsKIAogCQlpZiAoIUlzS2VlcGVyQmxvY2soc2V0 LCBibG9jaykpCi0JCQljb250ZXh0LT5tZW1fYWxsb2NhdGVkIC09IGJsb2NrLT5lbmRwdHIg LSAoKGNoYXIgKikgYmxvY2spOworCQl7CisJCQlkZWFsbG9jYXRpb25fc2l6ZSA9IGJsb2Nr LT5lbmRwdHIgLSAoKGNoYXIgKikgYmxvY2spOworCQkJY29udGV4dC0+bWVtX2FsbG9jYXRl ZCAtPSBkZWFsbG9jYXRpb25fc2l6ZTsKKwkJfQogCiAjaWZkZWYgQ0xPQkJFUl9GUkVFRF9N RU1PUlkKIAkJd2lwZV9tZW0oYmxvY2ssIGJsb2NrLT5mcmVlcHRyIC0gKChjaGFyICopIGJs b2NrKSk7CiAjZW5kaWYKIAogCQlpZiAoIUlzS2VlcGVyQmxvY2soc2V0LCBibG9jaykpCi0J CQlmcmVlKGJsb2NrKTsKKwkJCWZyZWVfYW5kX2NvdW50KGJsb2NrLCBkZWFsbG9jYXRpb25f c2l6ZSk7CiAKIAkJYmxvY2sgPSBuZXh0OwogCX0KQEAgLTY4Myw3ICs2OTEsNyBAQCBBbGxv Y1NldERlbGV0ZShNZW1vcnlDb250ZXh0IGNvbnRleHQpCiAJQXNzZXJ0KGNvbnRleHQtPm1l bV9hbGxvY2F0ZWQgPT0ga2VlcGVyc2l6ZSk7CiAKIAkvKiBGaW5hbGx5LCBmcmVlIHRoZSBj b250ZXh0IGhlYWRlciwgaW5jbHVkaW5nIHRoZSBrZWVwZXIgYmxvY2sgKi8KLQlmcmVlKHNl dCk7CisJZnJlZV9hbmRfY291bnQoc2V0LCBrZWVwZXJzaXplKTsKIH0KIAogLyoKQEAgLTcx Miw3ICs3MjAsNyBAQCBBbGxvY1NldEFsbG9jTGFyZ2UoTWVtb3J5Q29udGV4dCBjb250ZXh0 LCBTaXplIHNpemUsIGludCBmbGFncykKICNlbmRpZgogCiAJYmxrc2l6ZSA9IGNodW5rX3Np emUgKyBBTExPQ19CTE9DS0hEUlNaICsgQUxMT0NfQ0hVTktIRFJTWjsKLQlibG9jayA9IChB bGxvY0Jsb2NrKSBtYWxsb2MoYmxrc2l6ZSk7CisJYmxvY2sgPSAoQWxsb2NCbG9jaykgbWFs bG9jX2FuZF9jb3VudChibGtzaXplKTsKIAlpZiAoYmxvY2sgPT0gTlVMTCkKIAkJcmV0dXJu IE1lbW9yeUNvbnRleHRBbGxvY2F0aW9uRmFpbHVyZShjb250ZXh0LCBzaXplLCBmbGFncyk7 CiAKQEAgLTkwNSw3ICs5MTMsNyBAQCBBbGxvY1NldEFsbG9jRnJvbU5ld0Jsb2NrKE1lbW9y eUNvbnRleHQgY29udGV4dCwgU2l6ZSBzaXplLCBpbnQgZmxhZ3MsCiAJCWJsa3NpemUgPDw9 IDE7CiAKIAkvKiBUcnkgdG8gYWxsb2NhdGUgaXQgKi8KLQlibG9jayA9IChBbGxvY0Jsb2Nr KSBtYWxsb2MoYmxrc2l6ZSk7CisJYmxvY2sgPSAoQWxsb2NCbG9jaykgbWFsbG9jX2FuZF9j b3VudChibGtzaXplKTsKIAogCS8qCiAJICogV2UgY291bGQgYmUgYXNraW5nIGZvciBwcmV0 dHkgYmlnIGJsb2NrcyBoZXJlLCBzbyBjb3BlIGlmIG1hbGxvYyBmYWlscy4KQEAgLTkxNiw3 ICs5MjQsNyBAQCBBbGxvY1NldEFsbG9jRnJvbU5ld0Jsb2NrKE1lbW9yeUNvbnRleHQgY29u dGV4dCwgU2l6ZSBzaXplLCBpbnQgZmxhZ3MsCiAJCWJsa3NpemUgPj49IDE7CiAJCWlmIChi bGtzaXplIDwgcmVxdWlyZWRfc2l6ZSkKIAkJCWJyZWFrOwotCQlibG9jayA9IChBbGxvY0Js b2NrKSBtYWxsb2MoYmxrc2l6ZSk7CisJCWJsb2NrID0gKEFsbG9jQmxvY2spIG1hbGxvY19h bmRfY291bnQoYmxrc2l6ZSk7CiAJfQogCiAJaWYgKGJsb2NrID09IE5VTEwpCkBAIC0xMDcx LDYgKzEwNzksNyBAQCBBbGxvY1NldEZyZWUodm9pZCAqcG9pbnRlcikKIAl7CiAJCS8qIFJl bGVhc2Ugc2luZ2xlLWNodW5rIGJsb2NrLiAqLwogCQlBbGxvY0Jsb2NrCWJsb2NrID0gRXh0 ZXJuYWxDaHVua0dldEJsb2NrKGNodW5rKTsKKwkJU2l6ZQkJZGVhbGxvY2F0aW9uX3NpemU7 CiAKIAkJLyoKIAkJICogVHJ5IHRvIHZlcmlmeSB0aGF0IHdlIGhhdmUgYSBzYW5lIGJsb2Nr IHBvaW50ZXI6IHRoZSBibG9jayBoZWFkZXIKQEAgLTEwOTksMTIgKzExMDgsMTMgQEAgQWxs b2NTZXRGcmVlKHZvaWQgKnBvaW50ZXIpCiAJCWlmIChibG9jay0+bmV4dCkKIAkJCWJsb2Nr LT5uZXh0LT5wcmV2ID0gYmxvY2stPnByZXY7CiAKLQkJc2V0LT5oZWFkZXIubWVtX2FsbG9j YXRlZCAtPSBibG9jay0+ZW5kcHRyIC0gKChjaGFyICopIGJsb2NrKTsKKwkJZGVhbGxvY2F0 aW9uX3NpemUgPSBibG9jay0+ZW5kcHRyIC0gKChjaGFyICopIGJsb2NrKTsKKwkJc2V0LT5o ZWFkZXIubWVtX2FsbG9jYXRlZCAtPSBkZWFsbG9jYXRpb25fc2l6ZTsKIAogI2lmZGVmIENM T0JCRVJfRlJFRURfTUVNT1JZCiAJCXdpcGVfbWVtKGJsb2NrLCBibG9jay0+ZnJlZXB0ciAt ICgoY2hhciAqKSBibG9jaykpOwogI2VuZGlmCi0JCWZyZWUoYmxvY2spOworCQlmcmVlX2Fu ZF9jb3VudChibG9jaywgZGVhbGxvY2F0aW9uX3NpemUpOwogCX0KIAllbHNlCiAJewpAQCAt MTIyMyw3ICsxMjMzLDcgQEAgQWxsb2NTZXRSZWFsbG9jKHZvaWQgKnBvaW50ZXIsIFNpemUg c2l6ZSwgaW50IGZsYWdzKQogCQlibGtzaXplID0gY2hrc2l6ZSArIEFMTE9DX0JMT0NLSERS U1ogKyBBTExPQ19DSFVOS0hEUlNaOwogCQlvbGRibGtzaXplID0gYmxvY2stPmVuZHB0ciAt ICgoY2hhciAqKSBibG9jayk7CiAKLQkJYmxvY2sgPSAoQWxsb2NCbG9jaykgcmVhbGxvYyhi bG9jaywgYmxrc2l6ZSk7CisJCWJsb2NrID0gKEFsbG9jQmxvY2spIHJlYWxsb2NfYW5kX2Nv dW50KGJsb2NrLCBibGtzaXplLCBvbGRibGtzaXplKTsKIAkJaWYgKGJsb2NrID09IE5VTEwp CiAJCXsKIAkJCS8qIERpc2FsbG93IGFjY2VzcyB0byB0aGUgY2h1bmsgaGVhZGVyLiAqLwpk aWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvbW1nci9nZW5lcmF0aW9uLmMgYi9zcmMv YmFja2VuZC91dGlscy9tbWdyL2dlbmVyYXRpb24uYwppbmRleCAwMjM4YzExMWQyLi5jN2Vj MTM4MTEwIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9tbWdyL2dlbmVyYXRpb24u YworKysgYi9zcmMvYmFja2VuZC91dGlscy9tbWdyL2dlbmVyYXRpb24uYwpAQCAtMzcsNiAr MzcsNyBAQAogCiAjaW5jbHVkZSAibGliL2lsaXN0LmgiCiAjaW5jbHVkZSAicG9ydC9wZ19i aXR1dGlscy5oIgorI2luY2x1ZGUgInV0aWxzL2JhY2tlbmRfc3RhdHVzLmgiCiAjaW5jbHVk ZSAidXRpbHMvbWVtZGVidWcuaCIKICNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgogI2lu Y2x1ZGUgInV0aWxzL21lbXV0aWxzX2ludGVybmFsLmgiCkBAIC0yMDYsNyArMjA3LDcgQEAg R2VuZXJhdGlvbkNvbnRleHRDcmVhdGUoTWVtb3J5Q29udGV4dCBwYXJlbnQsCiAJICogQWxs b2NhdGUgdGhlIGluaXRpYWwgYmxvY2suICBVbmxpa2Ugb3RoZXIgZ2VuZXJhdGlvbi5jIGJs b2NrcywgaXQKIAkgKiBzdGFydHMgd2l0aCB0aGUgY29udGV4dCBoZWFkZXIgYW5kIGl0cyBi bG9jayBoZWFkZXIgZm9sbG93cyB0aGF0LgogCSAqLwotCXNldCA9IChHZW5lcmF0aW9uQ29u dGV4dCAqKSBtYWxsb2MoYWxsb2NTaXplKTsKKwlzZXQgPSAoR2VuZXJhdGlvbkNvbnRleHQg KikgbWFsbG9jX2FuZF9jb3VudChhbGxvY1NpemUpOwogCWlmIChzZXQgPT0gTlVMTCkKIAl7 CiAJCU1lbW9yeUNvbnRleHRTdGF0cyhUb3BNZW1vcnlDb250ZXh0KTsKQEAgLTMzMCw3ICsz MzEsNyBAQCBHZW5lcmF0aW9uRGVsZXRlKE1lbW9yeUNvbnRleHQgY29udGV4dCkKIAkvKiBS ZXNldCB0byByZWxlYXNlIGFsbCByZWxlYXNhYmxlIEdlbmVyYXRpb25CbG9ja3MgKi8KIAlH ZW5lcmF0aW9uUmVzZXQoY29udGV4dCk7CiAJLyogQW5kIGZyZWUgdGhlIGNvbnRleHQgaGVh ZGVyIGFuZCBrZWVwZXIgYmxvY2sgKi8KLQlmcmVlKGNvbnRleHQpOworCWZyZWVfYW5kX2Nv dW50KGNvbnRleHQsIGNvbnRleHQtPm1lbV9hbGxvY2F0ZWQgKyBNQVhBTElHTihzaXplb2Yo R2VuZXJhdGlvbkNvbnRleHQpKSk7CiB9CiAKIC8qCkBAIC0zNjEsNyArMzYyLDcgQEAgR2Vu ZXJhdGlvbkFsbG9jTGFyZ2UoTWVtb3J5Q29udGV4dCBjb250ZXh0LCBTaXplIHNpemUsIGlu dCBmbGFncykKIAlyZXF1aXJlZF9zaXplID0gY2h1bmtfc2l6ZSArIEdlbmVyYXRpb25fQ0hV TktIRFJTWjsKIAlibGtzaXplID0gcmVxdWlyZWRfc2l6ZSArIEdlbmVyYXRpb25fQkxPQ0tI RFJTWjsKIAotCWJsb2NrID0gKEdlbmVyYXRpb25CbG9jayAqKSBtYWxsb2MoYmxrc2l6ZSk7 CisJYmxvY2sgPSAoR2VuZXJhdGlvbkJsb2NrICopIG1hbGxvY19hbmRfY291bnQoYmxrc2l6 ZSk7CiAJaWYgKGJsb2NrID09IE5VTEwpCiAJCXJldHVybiBNZW1vcnlDb250ZXh0QWxsb2Nh dGlvbkZhaWx1cmUoY29udGV4dCwgc2l6ZSwgZmxhZ3MpOwogCkBAIC00ODIsNyArNDgzLDcg QEAgR2VuZXJhdGlvbkFsbG9jRnJvbU5ld0Jsb2NrKE1lbW9yeUNvbnRleHQgY29udGV4dCwg U2l6ZSBzaXplLCBpbnQgZmxhZ3MsCiAJaWYgKGJsa3NpemUgPCByZXF1aXJlZF9zaXplKQog CQlibGtzaXplID0gcGdfbmV4dHBvd2VyMl9zaXplX3QocmVxdWlyZWRfc2l6ZSk7CiAKLQli bG9jayA9IChHZW5lcmF0aW9uQmxvY2sgKikgbWFsbG9jKGJsa3NpemUpOworCWJsb2NrID0g KEdlbmVyYXRpb25CbG9jayAqKSBtYWxsb2NfYW5kX2NvdW50KGJsa3NpemUpOwogCiAJaWYg KGJsb2NrID09IE5VTEwpCiAJCXJldHVybiBNZW1vcnlDb250ZXh0QWxsb2NhdGlvbkZhaWx1 cmUoY29udGV4dCwgc2l6ZSwgZmxhZ3MpOwpAQCAtNjYzLDYgKzY2NCw5IEBAIEdlbmVyYXRp b25CbG9ja0ZyZWVCeXRlcyhHZW5lcmF0aW9uQmxvY2sgKmJsb2NrKQogc3RhdGljIGlubGlu ZSB2b2lkCiBHZW5lcmF0aW9uQmxvY2tGcmVlKEdlbmVyYXRpb25Db250ZXh0ICpzZXQsIEdl bmVyYXRpb25CbG9jayAqYmxvY2spCiB7CisJLyogSGF2ZSB0byBzdG9yZSB0aGUgdmFsdWUg bG9jYWxseSwgYmxvY2sgd2lsbCBiZSB3aXBlZC4gKi8KKwlTaXplCWJsa3NpemUgPSBibG9j ay0+Ymxrc2l6ZTsKKwogCS8qIE1ha2Ugc3VyZSBub2JvZHkgdHJpZXMgdG8gZnJlZSB0aGUg a2VlcGVyIGJsb2NrICovCiAJQXNzZXJ0KCFJc0tlZXBlckJsb2NrKHNldCwgYmxvY2spKTsK IAkvKiBXZSBzaG91bGRuJ3QgYmUgZnJlZWluZyB0aGUgZnJlZWJsb2NrIGVpdGhlciAqLwpA QCAtNjcxLDEzICs2NzUsMTMgQEAgR2VuZXJhdGlvbkJsb2NrRnJlZShHZW5lcmF0aW9uQ29u dGV4dCAqc2V0LCBHZW5lcmF0aW9uQmxvY2sgKmJsb2NrKQogCS8qIHJlbGVhc2UgdGhlIGJs b2NrIGZyb20gdGhlIGxpc3Qgb2YgYmxvY2tzICovCiAJZGxpc3RfZGVsZXRlKCZibG9jay0+ bm9kZSk7CiAKLQkoKE1lbW9yeUNvbnRleHQpIHNldCktPm1lbV9hbGxvY2F0ZWQgLT0gYmxv Y2stPmJsa3NpemU7CisJKChNZW1vcnlDb250ZXh0KSBzZXQpLT5tZW1fYWxsb2NhdGVkIC09 IGJsa3NpemU7CiAKICNpZmRlZiBDTE9CQkVSX0ZSRUVEX01FTU9SWQotCXdpcGVfbWVtKGJs b2NrLCBibG9jay0+Ymxrc2l6ZSk7CisJd2lwZV9tZW0oYmxvY2ssIGJsa3NpemUpOwogI2Vu ZGlmCiAKLQlmcmVlKGJsb2NrKTsKKwlmcmVlX2FuZF9jb3VudChibG9jaywgYmxrc2l6ZSk7 CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9tbWdyL3NsYWIuYyBi L3NyYy9iYWNrZW5kL3V0aWxzL21tZ3Ivc2xhYi5jCmluZGV4IDNlMTVkNTk2ODMuLmI4YmFl YTZjOTggMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL21tZ3Ivc2xhYi5jCisrKyBi L3NyYy9iYWNrZW5kL3V0aWxzL21tZ3Ivc2xhYi5jCkBAIC02OSw2ICs2OSw3IEBACiAjaW5j bHVkZSAicG9zdGdyZXMuaCIKIAogI2luY2x1ZGUgImxpYi9pbGlzdC5oIgorI2luY2x1ZGUg InV0aWxzL2JhY2tlbmRfc3RhdHVzLmgiCiAjaW5jbHVkZSAidXRpbHMvbWVtZGVidWcuaCIK ICNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgogI2luY2x1ZGUgInV0aWxzL21lbXV0aWxz X2ludGVybmFsLmgiCkBAIC0zNjEsNyArMzYyLDcgQEAgU2xhYkNvbnRleHRDcmVhdGUoTWVt b3J5Q29udGV4dCBwYXJlbnQsCiAKIAogCi0Jc2xhYiA9IChTbGFiQ29udGV4dCAqKSBtYWxs b2MoU2xhYl9DT05URVhUX0hEUlNaKGNodW5rc1BlckJsb2NrKSk7CisJc2xhYiA9IChTbGFi Q29udGV4dCAqKSBtYWxsb2NfYW5kX2NvdW50KFNsYWJfQ09OVEVYVF9IRFJTWihjaHVua3NQ ZXJCbG9jaykpOwogCWlmIChzbGFiID09IE5VTEwpCiAJewogCQlNZW1vcnlDb250ZXh0U3Rh dHMoVG9wTWVtb3J5Q29udGV4dCk7CkBAIC00NTEsNyArNDUyLDcgQEAgU2xhYlJlc2V0KE1l bW9yeUNvbnRleHQgY29udGV4dCkKICNpZmRlZiBDTE9CQkVSX0ZSRUVEX01FTU9SWQogCQl3 aXBlX21lbShibG9jaywgc2xhYi0+YmxvY2tTaXplKTsKICNlbmRpZgotCQlmcmVlKGJsb2Nr KTsKKwkJZnJlZV9hbmRfY291bnQoYmxvY2ssIHNsYWItPmJsb2NrU2l6ZSk7CiAJCWNvbnRl eHQtPm1lbV9hbGxvY2F0ZWQgLT0gc2xhYi0+YmxvY2tTaXplOwogCX0KIApAQCAtNDY3LDcg KzQ2OCw3IEBAIFNsYWJSZXNldChNZW1vcnlDb250ZXh0IGNvbnRleHQpCiAjaWZkZWYgQ0xP QkJFUl9GUkVFRF9NRU1PUlkKIAkJCXdpcGVfbWVtKGJsb2NrLCBzbGFiLT5ibG9ja1NpemUp OwogI2VuZGlmCi0JCQlmcmVlKGJsb2NrKTsKKwkJCWZyZWVfYW5kX2NvdW50KGJsb2NrLCBz bGFiLT5ibG9ja1NpemUpOwogCQkJY29udGV4dC0+bWVtX2FsbG9jYXRlZCAtPSBzbGFiLT5i bG9ja1NpemU7CiAJCX0KIAl9CkBAIC00ODQsMTAgKzQ4NSwxNCBAQCBTbGFiUmVzZXQoTWVt b3J5Q29udGV4dCBjb250ZXh0KQogdm9pZAogU2xhYkRlbGV0ZShNZW1vcnlDb250ZXh0IGNv bnRleHQpCiB7CisjaWZkZWYgTUVNT1JZX0NPTlRFWFRfQ0hFQ0tJTkcKKwlTbGFiQ29udGV4 dCAqc2xhYiA9IChTbGFiQ29udGV4dCAqKSBjb250ZXh0OworI2VuZGlmCisKIAkvKiBSZXNl dCB0byByZWxlYXNlIGFsbCB0aGUgU2xhYkJsb2NrcyAqLwogCVNsYWJSZXNldChjb250ZXh0 KTsKIAkvKiBBbmQgZnJlZSB0aGUgY29udGV4dCBoZWFkZXIgKi8KLQlmcmVlKGNvbnRleHQp OworCWZyZWVfYW5kX2NvdW50KGNvbnRleHQsIFNsYWJfQ09OVEVYVF9IRFJTWihzbGFiLT5j aHVua3NQZXJCbG9jaykpOwogfQogCiAvKgpAQCAtNTYyLDcgKzU2Nyw3IEBAIFNsYWJBbGxv Y0Zyb21OZXdCbG9jayhNZW1vcnlDb250ZXh0IGNvbnRleHQsIFNpemUgc2l6ZSwgaW50IGZs YWdzKQogCX0KIAllbHNlCiAJewotCQlibG9jayA9IChTbGFiQmxvY2sgKikgbWFsbG9jKHNs YWItPmJsb2NrU2l6ZSk7CisJCWJsb2NrID0gKFNsYWJCbG9jayAqKSBtYWxsb2NfYW5kX2Nv dW50KHNsYWItPmJsb2NrU2l6ZSk7CiAKIAkJaWYgKHVubGlrZWx5KGJsb2NrID09IE5VTEwp KQogCQkJcmV0dXJuIE1lbW9yeUNvbnRleHRBbGxvY2F0aW9uRmFpbHVyZShjb250ZXh0LCBz aXplLCBmbGFncyk7CkBAIC03OTUsNyArODAwLDcgQEAgU2xhYkZyZWUodm9pZCAqcG9pbnRl cikKICNpZmRlZiBDTE9CQkVSX0ZSRUVEX01FTU9SWQogCQkJd2lwZV9tZW0oYmxvY2ssIHNs YWItPmJsb2NrU2l6ZSk7CiAjZW5kaWYKLQkJCWZyZWUoYmxvY2spOworCQkJZnJlZV9hbmRf Y291bnQoYmxvY2ssIHNsYWItPmJsb2NrU2l6ZSk7CiAJCQlzbGFiLT5oZWFkZXIubWVtX2Fs bG9jYXRlZCAtPSBzbGFiLT5ibG9ja1NpemU7CiAJCX0KIApkaWZmIC0tZ2l0IGEvc3JjL2lu Y2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdCBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJv Yy5kYXQKaW5kZXggMmRjYzJkNDJkYS4uMTZkZDRhMGQ5NyAxMDA2NDQKLS0tIGEvc3JjL2lu Y2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3Bn X3Byb2MuZGF0CkBAIC04NDQyLDYgKzg0NDIsMjAgQEAKICAgcHJvYXJnbW9kZXMgPT4gJ3tv LG8sbyxvLG8sbyxvLG8sbyxvfScsCiAgIHByb2FyZ25hbWVzID0+ICd7bmFtZSwgaWRlbnQs IHR5cGUsIGxldmVsLCBwYXRoLCB0b3RhbF9ieXRlcywgdG90YWxfbmJsb2NrcywgZnJlZV9i eXRlcywgZnJlZV9jaHVua3MsIHVzZWRfYnl0ZXN9JywKICAgcHJvc3JjID0+ICdwZ19nZXRf YmFja2VuZF9tZW1vcnlfY29udGV4dHMnIH0sCit7IG9pZCA9PiAnODA4NScsCisgIGRlc2Ny ID0+ICdnZXQgdGhlIGFsbG9jYXRlZCBtZW1vcnkgaW4gYWxsIG1lbW9yeSBjb250ZXh0cyBv ZiBsb2NhbCBiYWNrZW5kJywKKyAgcHJvbmFtZSA9PiAncGdfZ2V0X2JhY2tlbmRfbWVtb3J5 X2NvbnRleHRzX3RvdGFsX2J5dGVzJywgcHJvdm9sYXRpbGUgPT4gJ3YnLAorICBwcm9wYXJh bGxlbCA9PiAncicsIHByb3JldHR5cGUgPT4gJ2ludDgnLCBwcm9hcmd0eXBlcyA9PiAnJywK KyAgcHJvc3JjID0+ICdwZ19nZXRfYmFja2VuZF9tZW1vcnlfY29udGV4dHNfdG90YWxfYnl0 ZXMnIH0sCit7IG9pZCA9PiAnODAwNScsCisgIGRlc2NyID0+ICdpbmZvcm1hdGlvbiBhYm91 dCBtZW1vcnkgYWxsb2NhdGlvbiBvZiBsb2NhbCBiYWNrZW5kJywKKyAgcHJvbmFtZSA9PiAn cGdfZ2V0X2JhY2tlbmRfbWVtb3J5X2FsbG9jYXRpb25fc3RhdHMnLCBwcm9yb3dzID0+ICcx MDI0JywKKyAgcHJvcmV0c2V0ID0+ICd0JywgcHJvdm9sYXRpbGUgPT4gJ3YnLCBwcm9wYXJh bGxlbCA9PiAncicsCisgIHByb3JldHR5cGUgPT4gJ3JlY29yZCcsIHByb2FyZ3R5cGVzID0+ ICcnLAorICBwcm9hbGxhcmd0eXBlcyA9PiAne3RleHQsaW50OCxib29sfScsCisgIHByb2Fy Z21vZGVzID0+ICd7byxvLG99JywKKyAgcHJvYXJnbmFtZXMgPT4gJ3twb2ludGVyLCBzaXpl LCBkZWxldGVkfScsCisgIHByb3NyYyA9PiAncGdfZ2V0X2JhY2tlbmRfbWVtb3J5X2FsbG9j YXRpb25fc3RhdHMnIH0sCiAKICMgbG9nZ2luZyBtZW1vcnkgY29udGV4dHMgb2YgdGhlIHNw ZWNpZmllZCBiYWNrZW5kCiB7IG9pZCA9PiAnNDU0MycsIGRlc2NyID0+ICdsb2cgbWVtb3J5 IGNvbnRleHRzIG9mIHRoZSBzcGVjaWZpZWQgYmFja2VuZCcsCmRpZmYgLS1naXQgYS9zcmMv aW5jbHVkZS91dGlscy9iYWNrZW5kX3N0YXR1cy5oIGIvc3JjL2luY2x1ZGUvdXRpbHMvYmFj a2VuZF9zdGF0dXMuaAppbmRleCA0ZThiMzlhNjZkLi4yNmI5MzM4YjJmIDEwMDY0NAotLS0g YS9zcmMvaW5jbHVkZS91dGlscy9iYWNrZW5kX3N0YXR1cy5oCisrKyBiL3NyYy9pbmNsdWRl L3V0aWxzL2JhY2tlbmRfc3RhdHVzLmgKQEAgLTExLDYgKzExLDcgQEAKICNkZWZpbmUgQkFD S0VORF9TVEFUVVNfSAogCiAjaW5jbHVkZSAiZGF0YXR5cGUvdGltZXN0YW1wLmgiCisjaW5j bHVkZSAiZm1nci5oIgogI2luY2x1ZGUgImxpYnBxL3BxY29tbS5oIgogI2luY2x1ZGUgIm1p c2NhZG1pbi5oIgkJCS8qIGZvciBCYWNrZW5kVHlwZSAqLwogI2luY2x1ZGUgInN0b3JhZ2Uv cHJvY251bWJlci5oIgpAQCAtMjg1LDYgKzI4Niw3IEBAIHR5cGVkZWYgc3RydWN0IExvY2Fs UGdCYWNrZW5kU3RhdHVzCiAgKi8KIGV4dGVybiBQR0RMTElNUE9SVCBib29sIHBnc3RhdF90 cmFja19hY3Rpdml0aWVzOwogZXh0ZXJuIFBHRExMSU1QT1JUIGludCBwZ3N0YXRfdHJhY2tf YWN0aXZpdHlfcXVlcnlfc2l6ZTsKK2V4dGVybiBQR0RMTElNUE9SVCBpbnQgbWF4X2JhY2tl bmRfbWVtb3J5X3NpemVfbWI7CiAKIAogLyogLS0tLS0tLS0tLQpAQCAtMzM3LDUgKzMzOSwx MyBAQCBleHRlcm4gTG9jYWxQZ0JhY2tlbmRTdGF0dXMgKnBnc3RhdF9nZXRfbG9jYWxfYmVl bnRyeV9ieV9wcm9jX251bWJlcihQcm9jTnVtYmVyCiBleHRlcm4gTG9jYWxQZ0JhY2tlbmRT dGF0dXMgKnBnc3RhdF9nZXRfbG9jYWxfYmVlbnRyeV9ieV9pbmRleChpbnQgaWR4KTsKIGV4 dGVybiBjaGFyICpwZ3N0YXRfY2xpcF9hY3Rpdml0eShjb25zdCBjaGFyICpyYXdfYWN0aXZp dHkpOwogCisvKgorICogRnVjdGlvbnMgdG8gY291bnQgbWVtb3J5CisgKi8KK2V4dGVybiB2 b2lkICptYWxsb2NfYW5kX2NvdW50KFNpemUgc2l6ZSk7CitleHRlcm4gdm9pZCAqcmVhbGxv Y19hbmRfY291bnQodm9pZCAqcHRyLCBTaXplIG5ld19zaXplLCBTaXplIG9sZF9zaXplKTsK K2V4dGVybiB2b2lkIGZyZWVfYW5kX2NvdW50KHZvaWQgKnB0ciwgU2l6ZSBzaXplKTsKK2V4 dGVybiBEYXR1bSBwZ19nZXRfYmFja2VuZF9tZW1vcnlfY29udGV4dHNfdG90YWxfYnl0ZXMo UEdfRlVOQ1RJT05fQVJHUyk7CitleHRlcm4gRGF0dW0gcGdfZ2V0X2JhY2tlbmRfbWVtb3J5 X2FsbG9jYXRpb25fc3RhdHMoUEdfRlVOQ1RJT05fQVJHUyk7CiAKICNlbmRpZgkJCQkJCQkv KiBCQUNLRU5EX1NUQVRVU19IICovCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL01h a2VmaWxlIGIvc3JjL3Rlc3QvbW9kdWxlcy9NYWtlZmlsZQppbmRleCBjMGQzY2YwZTE0Li5m MDExZjI5YjI3IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9tb2R1bGVzL01ha2VmaWxlCisrKyBi L3NyYy90ZXN0L21vZHVsZXMvTWFrZWZpbGUKQEAgLTU0LDYgKzU0LDEwIEBAIGVsc2UKIEFM V0FZU19TVUJESVJTICs9IHNzbF9wYXNzcGhyYXNlX2NhbGxiYWNrCiBlbmRpZgogCitpZm5l cSAodGVzdF9iYWNrZW5kX21lbW9yeSwkKGZpbHRlciB0ZXN0X2JhY2tlbmRfbWVtb3J5LCQo UEdfVEVTVF9TS0lQKSkpCitTVUJESVJTICs9IHRlc3RfYmFja2VuZF9tZW1vcnkKK2VuZGlm CisKICMgVGVzdCBydW5zIGFuIExEQVAgc2VydmVyLCBzbyBvbmx5IHJ1biBpZiBsZGFwIGlz IGluIFBHX1RFU1RfRVhUUkEKIGlmZXEgKCQod2l0aF9sZGFwKSx5ZXMpCiBpZm5lcSAoLCQo ZmlsdGVyIGxkYXAsJChQR19URVNUX0VYVFJBKSkpCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9t b2R1bGVzL3Rlc3RfYmFja2VuZF9tZW1vcnkvLmdpdGlnbm9yZSBiL3NyYy90ZXN0L21vZHVs ZXMvdGVzdF9iYWNrZW5kX21lbW9yeS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAwMDAuLjVkY2IzZmY5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMv dGVzdC9tb2R1bGVzL3Rlc3RfYmFja2VuZF9tZW1vcnkvLmdpdGlnbm9yZQpAQCAtMCwwICsx LDQgQEAKKyMgR2VuZXJhdGVkIHN1YmRpcmVjdG9yaWVzCisvbG9nLworL3Jlc3VsdHMvCisv dG1wX2NoZWNrLwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2JhY2tlbmRf bWVtb3J5L01ha2VmaWxlIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2JhY2tlbmRfbWVtb3J5 L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAuLmM2YWZh ZWRkMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfYmFja2Vu ZF9tZW1vcnkvTWFrZWZpbGUKQEAgLTAsMCArMSwxNCBAQAorIyBzcmMvdGVzdC9tb2R1bGVz L3Rlc3RfYmFja2VuZF9tZW1vcnkvTWFrZWZpbGUKKworVEFQX1RFU1RTID0gMQorCitpZmRl ZiBVU0VfUEdYUworUEdfQ09ORklHID0gcGdfY29uZmlnCitQR1hTIDo9ICQoc2hlbGwgJChQ R19DT05GSUcpIC0tcGd4cykKK2luY2x1ZGUgJChQR1hTKQorZWxzZQorc3ViZGlyID0gc3Jj L3Rlc3QvbW9kdWxlcy90ZXN0X2JhY2tlbmRfbWVtb3J5Cit0b3BfYnVpbGRkaXIgPSAuLi8u Li8uLi8uLgoraW5jbHVkZSAkKHRvcF9idWlsZGRpcikvc3JjL01ha2VmaWxlLmdsb2JhbAor aW5jbHVkZSAkKHRvcF9zcmNkaXIpL2NvbnRyaWIvY29udHJpYi1nbG9iYWwubWsKK2VuZGlm CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfYmFja2VuZF9tZW1vcnkvUkVB RE1FIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2JhY2tlbmRfbWVtb3J5L1JFQURNRQpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi45NWZmZTJjNDM4Ci0tLSAvZGV2 L251bGwKKysrIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2JhY2tlbmRfbWVtb3J5L1JFQURN RQpAQCAtMCwwICsxIEBACitUaGlzIGRpcmVjdG9yeSBjb250YWluIHRlc3RzIGZvciBtYXhf YmFja2VuZF9tZW1vcnkgR1VDCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3Rf YmFja2VuZF9tZW1vcnkvdC8wMDFfbWF4X2JhY2tlbmRfbWVtb3J5LnBsIGIvc3JjL3Rlc3Qv bW9kdWxlcy90ZXN0X2JhY2tlbmRfbWVtb3J5L3QvMDAxX21heF9iYWNrZW5kX21lbW9yeS5w bApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi5jNDc5ZjZlYzRmCi0t LSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2JhY2tlbmRfbWVtb3J5 L3QvMDAxX21heF9iYWNrZW5kX21lbW9yeS5wbApAQCAtMCwwICsxLDg1IEBACisjIFRlc3Rz IHRvIGNoZWNrIGJhY2tlbmQgbWVtb3J5IGxpbWl0IChtYXhfYmFja2VuZF9tZW1vcnkgR1VD KQorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIFBvc3RncmVTUUw6OlRlc3Q6 OkNsdXN0ZXI7Cit1c2UgUG9zdGdyZVNRTDo6VGVzdDo6VXRpbHM7Cit1c2UgVGVzdDo6TW9y ZTsKKworbXkgJG5vZGUgPSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyLT5uZXcoJ21haW4n KTsKKyRub2RlLT5pbml0OworJG5vZGUtPnN0YXJ0OworCisjIEluaXRpYWxpemUgYmFja2Vu ZCBtZW1vcnkgbGltaXQKKyRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgcXF7CisJQUxU RVIgU1lTVEVNIFNFVCBtYXhfYmFja2VuZF9tZW1vcnkgPSAxNTsKKwlTRUxFQ1QgcGdfcmVs b2FkX2NvbmYoKTsKK30pOworCisjIENoZWNrIGJhY2tlbmQgbWVtb3J5IGxpbWl0IGFmdGVy IFNFVC4KK215ICRwc3FsX3N0ZG91dDsKKyRwc3FsX3N0ZG91dCA9ICRub2RlLT5zYWZlX3Bz cWwoJ3Bvc3RncmVzJywKKwkJCQkJCQkJIlNFTEVDVCBjdXJyZW50X3NldHRpbmcoJ21heF9i YWNrZW5kX21lbW9yeScpOyIpOworaXMoJHBzcWxfc3Rkb3V0LCAnMTVNQicsICJtYXhfYmFj a2VuZF9tZW1vcnkgaXMgU0VUIGNvcnJlY3RseSIpOworCisjIENyZWF0ZSB0ZXN0IHRhYmxl IGFuZCBmdW5jdGlvbi4KKyRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgcXsKKwlDUkVB VEUgVEFCTEUgdGVzdCh0IHRleHQpOworCUlOU0VSVCBJTlRPIHRlc3QgVkFMVUVTIChyZXBl YXQoJzEyMzQ1Njc4OTAnLCA0MDAwMDApKTsKKworCS0tIFJlY3Vyc2l2ZSBmdW5jdGlvbiB0 aGF0IHNob3VsZCBjYXVzZSBvdmVyZmxvdworCUNSRUFURSBGVU5DVElPTiB0ZXN0X2Z1bmMo KSBSRVRVUk5TIHZvaWQgTEFOR1VBR0UgcGxwZ3NxbCBBUyAkJAorCURFQ0xBUkUKKwkJYnQg dGV4dDsKKwlCRUdJTgorCQlTRUxFQ1QgdCB8fCAneCcgRlJPTSB0ZXN0IElOVE8gYnQ7CisJ CVBFUkZPUk0gdGVzdF9mdW5jKCk7CisJRU5EOworJCQ7Cit9KTsKKworIyBDYWxsIGZ1bmN0 aW9uICJ0ZXN0X2Z1bmMiIHNldmVyYWwgdGltZXMgZm9yIG1lbW9yeSBsZWFrIGNoZWNrLgor bXkgJHBzcWxfc3Rkb3V0X2ZpcnN0OworZm9yIChteSAkaSA9IDA7ICRpIDwgNDsgJGkrKykK K3sKKwkjIENhbGwgZnVuY3Rpb24gYW5kIGNoZWNrIHRoYXQgaXQgZmluaXNoZXMgd2l0aCAn b3V0IG9mIG1lbW9yeScgZXJyb3IuCisJbXkgKCRyZXQsICRzdGRvdXQsICRzdGRlcnIpID0g JG5vZGUtPnBzcWwoJ3Bvc3RncmVzJywKKwkJCQkJCQkJCQkJICAiU0VMRUNUIHRlc3RfZnVu YygpOyIpOworCWlzKCRyZXQsIDMsICdyZWN1cnNpdmUgZnVuY3Rpb24gY2FsbCBjYXVzZXMg b3ZlcmZsb3cnKTsKKwlsaWtlKCRzdGRlcnIsIHFyL291dCBvZiBtZW1vcnkvLCAnZXhwZWN0 ZWQgb3V0IG9mIG1lbW9yeSBlcnJvcicpOworCisJJHBzcWxfc3Rkb3V0ID0gJG5vZGUtPnNh ZmVfcHNxbCgncG9zdGdyZXMnLAorCQkJCQkJCQkJIlNFTEVDVCBwZ19nZXRfYmFja2VuZF9t ZW1vcnlfY29udGV4dHNfdG90YWxfYnl0ZXMoKTsiKTsKKwlpZiAoJGkgZXEgMCkKKwl7CisJ CSMgU3RvcmUgZmlyc3QgdmFsdWUgb2YgYmFja2VuZF9tZW1vcnlfY29udGV4dHNfdG90YWxf Ynl0ZXMuCisJCSRwc3FsX3N0ZG91dF9maXJzdCA9ICRwc3FsX3N0ZG91dDsKKwkJaXMoJHBz cWxfc3Rkb3V0X2ZpcnN0ID4gMCwgMSwKKwkJICAgImJhY2tlbmQgaGFzIGFsbG9jYXRlZCAk cHNxbF9zdGRvdXRfZmlyc3QgKGdyZWF0ZXIgdGhhbiAwKSBieXRlcyIpOworCQluZXh0Owor CX0KKwkjIENoZWNrIG90aGVyIHZhbHVlcyBvZiBiYWNrZW5kX21lbW9yeV9jb250ZXh0c190 b3RhbF9ieXRlcy4KKwkjIFRoZXkgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIGZpcnN0IHZhbHVl LgorCWlzKCRwc3FsX3N0ZG91dCwgJHBzcWxfc3Rkb3V0X2ZpcnN0LCAibWVtb3J5IGRvZXMg bm90IGxlYWsiKTsKK30KKworIyBEcm9wIHRlc3QgdGFibGUgYW5kIGZ1bmN0aW9uLgorJG5v ZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCBxeworCURST1AgRlVOQ1RJT04gdGVzdF9mdW5j KCk7CisJRFJPUCBUQUJMRSB0ZXN0OworfSk7CisKKyMgRGVpbml0aWFsaXplIGJhY2tlbmQg bWVtb3J5IGxpbWl0LgorJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCBxeworCUFMVEVS IFNZU1RFTSBSRVNFVCBtYXhfYmFja2VuZF9tZW1vcnk7CisJU0VMRUNUIHBnX3JlbG9hZF9j b25mKCk7Cit9KTsKKworIyBDaGVjayBiYWNrZW5kIG1lbW9yeSBsaW1pdCBhZnRlciBSRVNF VC4KKyRwc3FsX3N0ZG91dCA9ICRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKKwkJCQkJ CQkJIlNFTEVDVCBjdXJyZW50X3NldHRpbmcoJ21heF9iYWNrZW5kX21lbW9yeScpOyIpOwor aXMoJHBzcWxfc3Rkb3V0LCAnMCcsICJtYXhfYmFja2VuZF9tZW1vcnkgaXMgUkVTRVQgY29y cmVjdGx5Iik7CisKKyRub2RlLT5zdG9wOworCitkb25lX3Rlc3RpbmcoKTsKLS0gCjIuNDcu MQoK --------------2l4fCsYu0fSS590AQA7xs3rS--