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 1qhF8W-001o2H-DI for pgsql-hackers@arkaria.postgresql.org; Fri, 15 Sep 2023 20:09:56 +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 1qhF8U-002w6g-9W for pgsql-hackers@arkaria.postgresql.org; Fri, 15 Sep 2023 20:09:54 +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 1qhF8T-002w6I-RB for pgsql-hackers@lists.postgresql.org; Fri, 15 Sep 2023 20:09:53 +0000 Received: from mout.gmx.net ([212.227.17.20]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qhF8M-005JEo-1t for pgsql-hackers@postgresql.org; Fri, 15 Sep 2023 20:09:53 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.de; s=s31663417; t=1694808582; x=1695413382; i=stepan.rutz@gmx.de; bh=kBUEDaT0L30yYr8tkG/osMjikLoJTuvD9GhggzL43N4=; h=X-UI-Sender-Class:Date:Subject:From:To:Cc:References:In-Reply-To; b=K17fQqzn7mUIwuWpo8bfJ7CuF8ofWj3rIqJcykzZDpisOuX632niFofMSp8pe1ThuHyz1CWcGjd icT+urKPSoRLoDvCzdo4z1Ygi478ZKcI1HGOAvLKWeDCzMlPjBdvly6OKaTs0PXYAgH+ykThMPXJT 5oC02qn6k6IK+mDqMuovV5LNlUr3utDO1PvfB8P4TWxumrCXCkR6WUYPryzVJ3ExPdjd8AdQfpE/n llWCuQCyjRIVzxJJ1jJekO05WK+DpXtmgMDLG1GSJFq9Y4o1j8Yv8eZ5n97A895BTxqLCXEMVgReM CODdYQSn6oQEoXuTp3HBtnh+NYaNmUBM/4sA== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from [192.168.178.119] ([94.31.82.126]) by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1N3bX1-1rhYph1u8R-010dP9; Fri, 15 Sep 2023 22:09:42 +0200 Content-Type: multipart/mixed; boundary="------------NUdG5i1urxYs1y9K5GTWAXMs" Message-ID: <03f952d6-b773-be93-e5d5-8f9ea9c2d461@gmx.de> Date: Fri, 15 Sep 2023 22:09:41 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.15.0 Subject: Re: Detoasting optionally to make Explain-Analyze less misleading Content-Language: en-US From: stepan rutz To: Tom Lane , Matthias van de Meent Cc: pgsql-hackers@postgresql.org References: <2802772.1694532399@sss.pgh.pa.us> In-Reply-To: X-Provags-ID: V03:K1:ZZfoRIM7hyiCU19T3cVc2C8PByXim7V9Iotj17B0qAfPRdMAo/S Jre7mgTx8guasjrHP+tsAxua6Bp4IkJpc/5BZWVfh+uU46tFV4CKXxnRMPHpX6iZnCYwYvc VvgO8V2giX0MT0GDueM9ciTO8Qysmwq1InQ5HkHb8BIZuB2WZIr5bXEMa+XSo3SJbbFWmta /P+A7tR6R4zRheW3Q3YnA== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:hjRRem8g71U=;ELkfE74PcoYfzymg8nKEnBsEZ5G Qmf5cHRytR8c/JfMrg94ou/Nbt/7tjPBLsmEjuemr+Vpojk4M7RKW09VwuuIkhuxCI+zabOAI DKb41Bq5g6ofyHcZmRUh3fj0DzWGHeYOrzMtfiaB8LaFWEDvbEbzGnJKjdPiRRHhgWA+j2hef i3wpV3iOlS3yypTgJPFBNbVPpwJZMFXrHOLFEQpE8eBV2arRfqRRwe7aGIH5zql4E1LlHDzLS 7F43NKrud5S+yysRXwf/0SLtA04jy6sw/MYFXm0AJesjTkHMxISJkg+KrNFOtPrjkOA8jsirE Z8irw/qKpUWM+MqNKTZzjZ4JSXTh4t0nfEfdtYK3elcf9kwkXHjvTnMXRaHQVNUaRFjreiYx1 qgpcTzit/l+L2KxB8b5V+nPBWR+V2KWOCYADhj8pfbtUM6CQzpdNiUBd5eh3/7b+4gYEzTbrp U5weuNhN9mP037cYWgvxXb7zeZKv7s71vc1C0fMQLm2lpjjBJkuHWmQhtKmMuAT5A0300oW81 TMsOIEMMFeifTjhnciPLoUNWThdhw8RstKZZn2nLkiOJ7M4BxjGMj97FKTbpbM9xRfmkf/+EJ wO1waMjYfEaryCGV4S/+5agkE1HZz8JD2ZVVQA0tSawxnkCJYJx4Pvh7iSZHJiGsFlMlErNew 3dxWm/Bko7rmutPTDgFuMHVSCiV5O/MZoSQLOfVpod+6yVJT1lK8hg7rq/TsI0NiyDuldV6ST oPQ3SYaMzldYaYT4V3L6hla2oauORLuvimAa78AydqWeZvnoYNPn1u/uRmLuEg4362OyCIU0k VR61AE+TdIZXeLdoeK4gbPVr1bx87syDX+XswMK5rXpLi/K4duiwqoD3wQcEM+b2wbQxZii8N hmNeZSCQZKGnjUekTwH7xEXlz9W7gnAFpABixJ8PgFOfAJUc7nFk29+HJbzYCzDJox8uadB8b TTEViFbPjlAA2Zq2e+URF0F7Co8= 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. --------------NUdG5i1urxYs1y9K5GTWAXMs Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Hi, please see a revised version yesterday's mail. The patch attached now provides the following: EXPLAIN(ANALYZE,SERIALIZE) and EXPLAIN(ANALYZE,SERIALIZEBINARY) and timing output. Both options perform the serialization during analyze and provide an additional output in the plan like this: template1=3D# explain (analyze,serialize) select * from t12 limit 1; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 QUERY PLAN =2D-----------------------------------------------------------------------= ------------------------------- =C2=A0... =C2=A0Serialized Bytes: 36 bytes =C2=A0Execution Time: 0.035 ms (5 rows) or also this template1=3D# explain (analyze,serialize) select * from t1; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 QUERY PLAN =2D-----------------------------------------------------------------------= --------------------- =C2=A0Seq Scan on t1=C2=A0 (cost=3D0.00..1.02 rows=3D2 width=3D19) (actua= l time=3D0.101..0.111 rows=3D5 loops=3D1) =C2=A0Planning Time: 0.850 ms =C2=A0Serialized Bytes: 85777978 bytes =C2=A0Execution Time: 354.284 ms (4 rows) Its tempting to divide Serialized-Bytes by Execution-Time to get an idea of the serialization bandwidth. This is /dev/null serialization though. The results are length-counted and then discarded. Since detoasting happens implicitly during serialization, the number of bytes becomes huge in this case and accounts for the detoasted lengths as well. I tried to get the number of bytes send for the protocol's messages and the attribute headers correctly. For the actual values I am quite sure I get the correct measures, as one can really tell by sending more values across. Null is 4 bytes on the wire interestingly. I didn't know that, but it makes sense, since its using the same prefix length-field as all values do. I have checked the JBDC driver and it uses binary and text formats depending on an attribute's type oid. So having the SERIALIZEBINARY option is not accurate, as in reality both formats can be occur for the same tuple. Please provide some feedback on the new patch and let me know if this makes sense. In general this kind of option for EXPLAIN is a good thing for sure. Greetings, Stepan On 14.09.23 21:27, stepan rutz wrote: > Hi Tom, Hi Matthias, > > you are right of course. I have looked at the code from printtup.c and > made a new version of the patch. > > Thanks for the MemoryContextReset hint too (@Matthias) > > This time is called=C2=A0 EXPLAIN(ANALYZE,SERIALIZE) (hey, it also sound= s > nicer phonetically) > > If the option SERIALIZE is active, the output functions are called and > they perform the detoasting, which I have even checked. > > So things are better this way, however I hardcoded the output option > "Text" (format=3D0). In printtup.c there is an incoming array which > applies Text (format=3D0) or Binary (format=3D1) for each column > individually. I am not sure whether this is even needed. I left in the > if-statement from printtup.c which calls the binary output method of a > given type. The result of the output is ignored and apparently free'd > because of the memory-context-reset at the end. > > Please also note, that I added a call to DestReceiver's rDestroy hook, > which was missing from explain.c before altogether. > > Feedback is appreciated. > > /Stepan > > > On 12.09.23 17:26, Tom Lane wrote: >> Matthias van de Meent writes: >>> Hmm, maybe we should measure the overhead of serializing the tuples >>> instead. >>> The difference between your patch and "serializing the tuples, but not >>> sending them" is that serializing also does the detoasting, but also >>> includes any time spent in the serialization functions of the type. So >>> an option "SERIALIZE" which measures all the time the server spent on >>> the query (except the final step of sending the bytes to the client) >>> would likely be more useful than "just" detoasting. >> +1, that was my immediate reaction to the proposal as well. Some >> output functions are far from cheap.=C2=A0 Doing only the detoast part >> seems like it's still misleading. >> >> Do we need to go as far as offering both text-output and binary-output >> options? >> >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 rega= rds, tom lane --------------NUdG5i1urxYs1y9K5GTWAXMs Content-Type: text/x-patch; charset=UTF-8; name="0004_explain_analyze_and_serialize.patch" Content-Disposition: attachment; filename="0004_explain_analyze_and_serialize.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2V4cGxhaW4uYyBiL3NyYy9iYWNr ZW5kL2NvbW1hbmRzL2V4cGxhaW4uYwppbmRleCA4NTcwYjE0ZjYyLi45MDkwZTBmMTE0IDEw MDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9leHBsYWluLmMKKysrIGIvc3JjL2Jh Y2tlbmQvY29tbWFuZHMvZXhwbGFpbi5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSAi bm9kZXMvbm9kZUZ1bmNzLmgiCiAjaW5jbHVkZSAicGFyc2VyL2FuYWx5emUuaCIKICNpbmNs dWRlICJwYXJzZXIvcGFyc2V0cmVlLmgiCisjaW5jbHVkZSAibWIvcGdfd2NoYXIuaCIKICNp bmNsdWRlICJyZXdyaXRlL3Jld3JpdGVIYW5kbGVyLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9i dWZtZ3IuaCIKICNpbmNsdWRlICJ0Y29wL3Rjb3Bwcm90LmgiCkBAIC00Nyw3ICs0OCw2IEBA IEV4cGxhaW5PbmVRdWVyeV9ob29rX3R5cGUgRXhwbGFpbk9uZVF1ZXJ5X2hvb2sgPSBOVUxM OwogLyogSG9vayBmb3IgcGx1Z2lucyB0byBnZXQgY29udHJvbCBpbiBleHBsYWluX2dldF9p bmRleF9uYW1lKCkgKi8KIGV4cGxhaW5fZ2V0X2luZGV4X25hbWVfaG9va190eXBlIGV4cGxh aW5fZ2V0X2luZGV4X25hbWVfaG9vayA9IE5VTEw7CiAKLQogLyogT1ItYWJsZSBmbGFncyBm b3IgRXhwbGFpblhNTFRhZygpICovCiAjZGVmaW5lIFhfT1BFTklORyAwCiAjZGVmaW5lIFhf Q0xPU0lORyAxCkBAIC0xNTQsNyArMTU0LDggQEAgc3RhdGljIHZvaWQgRXhwbGFpbkpTT05M aW5lRW5kaW5nKEV4cGxhaW5TdGF0ZSAqZXMpOwogc3RhdGljIHZvaWQgRXhwbGFpbllBTUxM aW5lU3RhcnRpbmcoRXhwbGFpblN0YXRlICplcyk7CiBzdGF0aWMgdm9pZCBlc2NhcGVfeWFt bChTdHJpbmdJbmZvIGJ1ZiwgY29uc3QgY2hhciAqc3RyKTsKIAotCitzdGF0aWMgRGVzdFJl Y2VpdmVyICpDcmVhdGVTZXJpYWxpemVEZXN0UmVjZWl2ZXIoaW50MTYgZm9ybWF0KTsKK3N0 YXRpYyB1aW50NjQgR2V0TnVtYmVyT2ZTZXJpYWxpemVkQnl0ZXMoRGVzdFJlY2VpdmVyICpk ZXN0KTsKIAogLyoKICAqIEV4cGxhaW5RdWVyeSAtCkBAIC0xOTIsNiArMTkzLDEyIEBAIEV4 cGxhaW5RdWVyeShQYXJzZVN0YXRlICpwc3RhdGUsIEV4cGxhaW5TdG10ICpzdG10LAogCQkJ ZXMtPnNldHRpbmdzID0gZGVmR2V0Qm9vbGVhbihvcHQpOwogCQllbHNlIGlmIChzdHJjbXAo b3B0LT5kZWZuYW1lLCAiZ2VuZXJpY19wbGFuIikgPT0gMCkKIAkJCWVzLT5nZW5lcmljID0g ZGVmR2V0Qm9vbGVhbihvcHQpOworCQllbHNlIGlmIChzdHJjbXAob3B0LT5kZWZuYW1lLCAi c2VyaWFsaXplIikgPT0gMCkKKwkJCWVzLT5zZXJpYWxpemUgPSBkZWZHZXRCb29sZWFuKG9w dCk7CisJCWVsc2UgaWYgKHN0cmNtcChvcHQtPmRlZm5hbWUsICJzZXJpYWxpemViaW5hcnki KSA9PSAwKQorCQl7CisJCQllcy0+c2VyaWFsaXplID0gZXMtPnNlcmlhbGl6ZWJpbmFyeSA9 IGRlZkdldEJvb2xlYW4ob3B0KTsKKwkJfQogCQllbHNlIGlmIChzdHJjbXAob3B0LT5kZWZu YW1lLCAidGltaW5nIikgPT0gMCkKIAkJewogCQkJdGltaW5nX3NldCA9IHRydWU7CkBAIC0y NDQsNiArMjUxLDE3IEBAIEV4cGxhaW5RdWVyeShQYXJzZVN0YXRlICpwc3RhdGUsIEV4cGxh aW5TdG10ICpzdG10LAogCQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9QQVJBTUVURVJf VkFMVUUpLAogCQkJCSBlcnJtc2coIkVYUExBSU4gb3B0aW9uIFRJTUlORyByZXF1aXJlcyBB TkFMWVpFIikpKTsKIAorCS8qIGNoZWNrIHRoYXQgc2VyaWFsaXplYmluYXJ5IGlzIHVzZWQg d2l0aCBFWFBMQUlOIEFOQUxZWkUgKi8KKwlpZiAoZXMtPnNlcmlhbGl6ZWJpbmFyeSAmJiAh ZXMtPmFuYWx5emUpCisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9J TlZBTElEX1BBUkFNRVRFUl9WQUxVRSksCisJCQkJIGVycm1zZygiRVhQTEFJTiBvcHRpb24g U0VSSUFMSVpFQklOQVJZIHJlcXVpcmVzIEFOQUxZWkUiKSkpOworCS8qIGNoZWNrIHRoYXQg c2VyaWFsaXplIGlzIHVzZWQgd2l0aCBFWFBMQUlOIEFOQUxZWkUgKi8KKwllbHNlIGlmIChl cy0+c2VyaWFsaXplICYmICFlcy0+YW5hbHl6ZSkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQko ZXJyY29kZShFUlJDT0RFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFKSwKKwkJCQkgZXJybXNn KCJFWFBMQUlOIG9wdGlvbiBTRVJJQUxJWkUgcmVxdWlyZXMgQU5BTFlaRSIpKSk7CisKIAkv KiBjaGVjayB0aGF0IEdFTkVSSUNfUExBTiBpcyBub3QgdXNlZCB3aXRoIEVYUExBSU4gQU5B TFlaRSAqLwogCWlmIChlcy0+Z2VuZXJpYyAmJiBlcy0+YW5hbHl6ZSkKIAkJZXJlcG9ydChF UlJPUiwKQEAgLTUzNSw2ICs1NTMsNyBAQCBFeHBsYWluT25lUGxhbihQbGFubmVkU3RtdCAq cGxhbm5lZHN0bXQsIEludG9DbGF1c2UgKmludG8sIEV4cGxhaW5TdGF0ZSAqZXMsCiAJZG91 YmxlCQl0b3RhbHRpbWUgPSAwOwogCWludAkJCWVmbGFnczsKIAlpbnQJCQlpbnN0cnVtZW50 X29wdGlvbiA9IDA7CisJdWludDY0CQlieXRlc1NlbmQgPSAwOwogCiAJQXNzZXJ0KHBsYW5u ZWRzdG10LT5jb21tYW5kVHlwZSAhPSBDTURfVVRJTElUWSk7CiAKQEAgLTU2NSw5ICs1ODQs MTUgQEAgRXhwbGFpbk9uZVBsYW4oUGxhbm5lZFN0bXQgKnBsYW5uZWRzdG10LCBJbnRvQ2xh dXNlICppbnRvLCBFeHBsYWluU3RhdGUgKmVzLAogCS8qCiAJICogTm9ybWFsbHkgd2UgZGlz Y2FyZCB0aGUgcXVlcnkncyBvdXRwdXQsIGJ1dCBpZiBleHBsYWluaW5nIENSRUFURSBUQUJM RQogCSAqIEFTLCB3ZSdkIGJldHRlciB1c2UgdGhlIGFwcHJvcHJpYXRlIHR1cGxlIHJlY2Vp dmVyLgorCSAqIEFsc28gaWYgd2UgY2hvb3NlIHRvIHNlcmlhbGl6ZSBkdXJpbmcgZXhwbGFp biwgd2UgbmVlZCB0byBzZW5kIHRoZQorCSAqIHR1cGxlcyB0byBhIGRlc3QtcmVjZWl2ZXIg dGhhdCBwZXJmb3JtcyBzZXJpYWxpemluZworCSAqIGludG8gdGhlIHByb3RvY29sIHJlY2Vp dmluZyBmb3JtYXQuIHRoaXMgaW1wbGljaXRseSBhbHNvIGRldG9hc3RzCisJICogdmFsdWVz LgogCSAqLwogCWlmIChpbnRvKQogCQlkZXN0ID0gQ3JlYXRlSW50b1JlbERlc3RSZWNlaXZl cihpbnRvKTsKKwllbHNlIGlmIChlcy0+YW5hbHl6ZSAmJiBlcy0+c2VyaWFsaXplKQorCQlk ZXN0ID0gQ3JlYXRlU2VyaWFsaXplRGVzdFJlY2VpdmVyKGVzLT5zZXJpYWxpemViaW5hcnkg PyAxIDogMCk7CiAJZWxzZQogCQlkZXN0ID0gTm9uZV9SZWNlaXZlcjsKIApAQCAtNjA2LDYg KzYzMSwxNSBAQCBFeHBsYWluT25lUGxhbihQbGFubmVkU3RtdCAqcGxhbm5lZHN0bXQsIElu dG9DbGF1c2UgKmludG8sIEV4cGxhaW5TdGF0ZSAqZXMsCiAJCS8qIHJ1biBjbGVhbnVwIHRv byAqLwogCQlFeGVjdXRvckZpbmlzaChxdWVyeURlc2MpOwogCisJCWlmIChlcy0+c2VyaWFs aXplKQorCQl7CisJCQlieXRlc1NlbmQgPSBHZXROdW1iZXJPZlNlcmlhbGl6ZWRCeXRlcyhk ZXN0KTsKKwkJfQorCisKKwkJLyogY2FsbCB0aGUgZGVzdCByZWNlaXZlcidzIGRlc3Ryb3kg bWV0aG9kIGV2ZW4gZHVyaW5nIGV4cGxhaW4gKi8KKwkJZGVzdC0+ckRlc3Ryb3koZGVzdCk7 CisKIAkJLyogV2UgY2FuJ3QgcnVuIEV4ZWN1dG9yRW5kICd0aWxsIHdlJ3JlIGRvbmUgcHJp bnRpbmcgdGhlIHN0YXRzLi4uICovCiAJCXRvdGFsdGltZSArPSBlbGFwc2VkX3RpbWUoJnN0 YXJ0dGltZSk7CiAJfQpAQCAtNjQzLDYgKzY3NywxMSBAQCBFeHBsYWluT25lUGxhbihQbGFu bmVkU3RtdCAqcGxhbm5lZHN0bXQsIEludG9DbGF1c2UgKmludG8sIEV4cGxhaW5TdGF0ZSAq ZXMsCiAJaWYgKGVzLT5jb3N0cykKIAkJRXhwbGFpblByaW50SklUU3VtbWFyeShlcywgcXVl cnlEZXNjKTsKIAorCWlmIChlcy0+YW5hbHl6ZSAmJiBlcy0+c2VyaWFsaXplKQorCXsKKwkJ RXhwbGFpblByb3BlcnR5VUludGVnZXIoIlNlcmlhbGl6ZWQgQnl0ZXMiLCAiYnl0ZXMiLCBi eXRlc1NlbmQsIGVzKTsKKwl9CisKIAkvKgogCSAqIENsb3NlIGRvd24gdGhlIHF1ZXJ5IGFu ZCBmcmVlIHJlc291cmNlcy4gIEluY2x1ZGUgdGltZSBmb3IgdGhpcyBpbiB0aGUKIAkgKiB0 b3RhbCBleGVjdXRpb24gdGltZSAoYWx0aG91Z2ggaXQgc2hvdWxkIGJlIHByZXR0eSBtaW5p bWFsKS4KQEAgLTUwNTIsMyArNTA5MSwyMzkgQEAgZXNjYXBlX3lhbWwoU3RyaW5nSW5mbyBi dWYsIGNvbnN0IGNoYXIgKnN0cikKIHsKIAllc2NhcGVfanNvbihidWYsIHN0cik7CiB9CisK KworLyogU2VyaWFsaXppbmcgRGVzdFJlY2VpdmVyIGZ1bmN0aW9ucworICoKKyAqIEVYUExB SU4gKEFOQUxZWkUpICBzb21ldGltZXMgZ2l2ZXMgcmVzdWx0cyB0aGF0IHVucmVhbGlzdGlj LgorICogRHVyaW5nIEVYUExBSU4oQU5BTFlaRSkgdGhlcmUgaXMgbm8gZGV0b2FzdGluZyBv ZiB2YWx1ZXMuCisgKiBUaGF0IG1lYW5zIHlvdSBnZXQgbm8gaWRlYSB3aGF0IHlvdXIgYWN0 dWFsIHF1ZXJ5IHRpbWUgaXMgZ29pbmcKKyAqIHRvIGJlLCBub3Igd2hhdCB0aGUgYWN0dWFs IG92ZXJoZWFkIG9mIGRldG9hc3RpbmcgaXMuCisgKgorICogRVhQTEFJTiAoQU5BWUxaRSwg U0VSSUFMSVpFKSB3aWxsIHBlcmZvcm0gZGV0b2FzdGluZyBpbXBsaWNpdGx5IGFuZAorICog d2lsbCBhbHNvIGRvIGNvdW50IHRoZSBudW1iZXIgb2YgYnl0ZXMgYmVpbmcgc2VuZCB0byB0 aGUgY2xpZW50IGJ1dAorICogd2lsbCBub3QgYWN0dWFsbHkgc2VuZCB0aGVtLiBTRVJJQUxJ WkUgdXNlcyB0ZXh0IGZvcm1hdCBmb3IgYWxsCisgKiBhdHRyaWJ1dGVzLgorICoKKyAqIEVY UExBSU4gKEFOQVlMWkUsIFNFUklBTElaRUJJTkFSWSkgc2VyaWFsaXplcyB1c2luZyBiaW5h cnkgZm9ybWF0LgorICovCisKKy8qIGFuIGF0dHJpYnV0ZSBpbmZvIGNhY2hlZCBmb3IgZWFj aCBjb2x1bW4gKi8KK3R5cGVkZWYgc3RydWN0Cit7CQkJCQkJCQkvKiBQZXItYXR0cmlidXRl IGluZm9ybWF0aW9uICovCisJT2lkCQkJdHlwb3V0cHV0OwkJLyogT2lkIGZvciB0aGUgdHlw ZSdzIHRleHQgb3V0cHV0IGZuICovCisJT2lkCQkJdHlwc2VuZDsJCS8qIE9pZCBmb3IgdGhl IHR5cGUncyBiaW5hcnkgb3V0cHV0IGZuICovCisJYm9vbAkJdHlwaXN2YXJsZW5hOwkvKiBp cyBpdCB2YXJsZW5hIChpZSBwb3NzaWJseSB0b2FzdGFibGUpPyAqLworCWludDE2CQlmb3Jt YXQ7CQkJLyogZm9ybWF0IGNvZGUgZm9yIHRoaXMgY29sdW1uICovCisJRm1nckluZm8JZmlu Zm87CQkJLyogUHJlY29tcHV0ZWQgY2FsbCBpbmZvIGZvciBvdXRwdXQgZm4gKi8KK30gU2Vy aWFsaXplQXR0ckluZm87CisKK3R5cGVkZWYgc3RydWN0Cit7CisJLyogcmVjZWl2ZXIgZm9y IHRoZSB0dXBsZXMsIHRoYXQganVzdCBzZXJpYWxpemVzICovCisJRGVzdFJlY2VpdmVyCQlk ZXN0UmVjZXZpZXI7CisJTWVtb3J5Q29udGV4dAkJbWVtb3J5Q29udGV4dDsKKwlNZW1vcnlD b250ZXh0CQlvbGRNZW1vcnlDb250ZXh0OwkvKiByZXN0b3JlIHRvIG9sZCB3aGVuIGRvbmUg Ki8KKwlpbnQxNgkJCQlmb3JtYXQ7CQkJCS8qIHRleHQgb2YgYmluYXJ5ICovCisJVHVwbGVE ZXNjCQkJYXR0cmluZm87CisJaW50CQkJCQluYXR0cnM7CisJdWludDY0CQkJCWJ5dGVzU2Vu ZDsJCQkvKiBOdW0gb2YgYnl0ZXMgb3ZlciB0aGUgd2lyZSAqLworCVNlcmlhbGl6ZUF0dHJJ bmZvCSppbmZvczsJCQkJLyogQ2FjaGVkIGluZm8gYWJvdXQgZWFjaCBhdHRyICovCit9IFNl cmlhbGl6ZURlc3RSZWNlaXZlcjsKKworLyoKKyAqIEdldCB0aGUgbG9va3VwIGluZm8gdGhh dCB0aGUgcm93LWNhbGxiYWNrIG9mIHRoZSByZWNlaXZlciBuZWVkcy4gdGhpcyBjb2RlCisg KiBpcyBzaW1pbGFyIHRvIHRoZSBjb2RlIGZyb20gcHJpbnR1cC5jIGV4Y2VwdCB0aGF0IGl0 IGRvZXNuJ3QgZG8gYW55IGFjdHVhbAorICogb3V0cHV0LgorICovCitzdGF0aWMgdm9pZAor c2VyaWFsaXplX3ByZXBhcmVfaW5mbyhTZXJpYWxpemVEZXN0UmVjZWl2ZXIgKnJlY2VpdmVy LCBUdXBsZURlc2MgdHlwZWluZm8sCisJaW50IG5hdHRycykKK3sKKwlpbnQgaTsKKworCS8q IGdldCByaWQgb2YgYW55IG9sZCBkYXRhICovCisJaWYgKHJlY2VpdmVyLT5pbmZvcykKKwkJ cGZyZWUocmVjZWl2ZXItPmluZm9zKTsKKwlyZWNlaXZlci0+aW5mb3MgPSBOVUxMOworCisJ cmVjZWl2ZXItPmF0dHJpbmZvID0gdHlwZWluZm87CisJcmVjZWl2ZXItPm5hdHRycyA9IG5h dHRyczsKKwlpZiAobmF0dHJzIDw9IDApCisJCXJldHVybjsKKworCXJlY2VpdmVyLT5pbmZv cyA9IChTZXJpYWxpemVBdHRySW5mbyAqKSBwYWxsb2MwKAorCQluYXR0cnMgKiBzaXplb2Yo U2VyaWFsaXplQXR0ckluZm8pKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmF0dHJzOyBpKyspCisJ eworCQlTZXJpYWxpemVBdHRySW5mbyAqaW5mbyA9ICYocmVjZWl2ZXItPmluZm9zW2ldKTsK KwkJRm9ybV9wZ19hdHRyaWJ1dGUgYXR0ciA9IFR1cGxlRGVzY0F0dHIodHlwZWluZm8sIGkp OworCQlpbmZvLT5mb3JtYXQgPSByZWNlaXZlci0+Zm9ybWF0OworCQlpZiAoaW5mby0+Zm9y bWF0ID09IDApCisJCXsKKwkJCWdldFR5cGVPdXRwdXRJbmZvKGF0dHItPmF0dHR5cGlkLAor CQkJCQkJCSAgJmluZm8tPnR5cG91dHB1dCwKKwkJCQkJCQkgICZpbmZvLT50eXBpc3Zhcmxl bmEpOworCQkJZm1ncl9pbmZvKGluZm8tPnR5cG91dHB1dCwgJmluZm8tPmZpbmZvKTsKKwkJ fQorCQllbHNlIGlmIChpbmZvLT5mb3JtYXQgPT0gMSkKKwkJeworCQkJZ2V0VHlwZUJpbmFy eU91dHB1dEluZm8oYXR0ci0+YXR0dHlwaWQsCisJCQkJCQkJCQkmaW5mby0+dHlwc2VuZCwK KwkJCQkJCQkJCSZpbmZvLT50eXBpc3ZhcmxlbmEpOworCQkJZm1ncl9pbmZvKGluZm8tPnR5 cHNlbmQsICZpbmZvLT5maW5mbyk7CisJCX0KKwkJZWxzZQorCQkJZXJlcG9ydChFUlJPUiwK KwkJCQkJKGVycmNvZGUoRVJSQ09ERV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSksCisJCQkJ CSBlcnJtc2coInVuc3VwcG9ydGVkIGZvcm1hdCBjb2RlOiAlZCIsIGluZm8tPmZvcm1hdCkp KTsKKwl9Cit9CisKKworCisvKiB0aGlzIG1ldGhvZCByZWNlaXZlcyB0aGUgdHVwbGVzL3Jl Y29yZHMgZHVyaW5nIGV4cGxhaW4gKGFuYWx5emUsIHNlcmlhbGl6ZSkKKyAqIGFuZCBzZXJp YWxpemVzIHRoZW0uCisgKiB0aGlzIG1ldGhvZCBpcyBvdGhlcndpc2Ugbm90IGNhbGxlZCBh bmQgaXRzIHB1cnBvc2UgaXMgdG8gc2VyaWFsaXplIHRvCisgKiBtYWtlIGFuYWx5emUgb3B0 aW9uYWxseSBtb3JlIHJlYWxpc3RpYy4gc2VyaWFsaXphdGlvbiBpbmNsdWRlcyBkZXRvYXN0 aW5nCisgKiBhbmQgaW52b2tpbmcgdGhlIHR5cGUncyBvdXRwdXQgKG9yIHNlbmQpIGZ1bmN0 aW9uLCB3aGljaCBpcyB3aGF0IGhhcHBlbnMKKyAqIHdoZW4geW91IGFjdHVhbGx5IHJ1biB0 aGUgcXVlcnkuIGJvdGggc3RlcHMgY29zdCB0aW1lIGFuZCB0aHVzCisgKiBhbmFseXplIGNh biBiZSB2ZXJ5IG1pc2xlYWRpbmcgaWYgdGhvc2UgdHdvIHN0ZXBzIGFyZSBvbWl0dGVkLgor ICovCitzdGF0aWMgYm9vbAorc2VyaWFsaXplQW5hbHl6ZVJlY2VpdmUoVHVwbGVUYWJsZVNs b3QgKnNsb3QsIERlc3RSZWNlaXZlciAqc2VsZikKK3sKKwlpbnQgaTsKKwlUdXBsZURlc2Mg dHVwZGVzYzsKKwlTZXJpYWxpemVEZXN0UmVjZWl2ZXIgKnJlY2VpdmVyID0gKFNlcmlhbGl6 ZURlc3RSZWNlaXZlciopIHNlbGY7CisKKwl0dXBkZXNjICA9IHNsb3QtPnR0c190dXBsZURl c2NyaXB0b3I7CisJLyogQ2FjaGUgYXR0cmlidXRlIGluZm9zIGFuZCBmdW5jdGlvbiBvaWQg aWYgb3V0ZGF0ZWQgKi8KKwlpZiAocmVjZWl2ZXItPmF0dHJpbmZvICE9IHR1cGRlc2MgfHwg cmVjZWl2ZXItPm5hdHRycyAhPSB0dXBkZXNjLT5uYXR0cykKKwl7CisJCXNlcmlhbGl6ZV9w cmVwYXJlX2luZm8ocmVjZWl2ZXIsIHR1cGRlc2MsIHR1cGRlc2MtPm5hdHRzKTsKKwl9CisK KwkvKiBGaWxsIGFsbCBvZiB0aGUgc2xvdCdzIGF0dHJpYnV0ZXMsIHdlIGNhbiBub3cgdXNl IHNsb3QtPnR0c192YWx1ZXMKKwkgKiBhbmQgaXRzIHR0c19pc251bGwgYXJyYXkgd2hpY2gg c2hvdWxkIGJlIGxvbmcgZW5vdWdoIGV2ZW4gaWYgYWRkZWQKKwkgKiBhIG51bGwtY29sdW1u IHRvIHRoZSB0YWJsZSAqLworCXNsb3RfZ2V0YWxsYXR0cnMoc2xvdCk7CisKKwlyZWNlaXZl ci0+b2xkTWVtb3J5Q29udGV4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbygKKwkJcmVjZWl2 ZXItPm1lbW9yeUNvbnRleHQpOworCisJLyogSXRlcmF0ZSBvdmVyIGFsbCBhdHRyaWJ1dGVz IG9mIHRoZSB0dXBsZSBhbmQgaW52b2tlIHRoZSBvdXRwdXQgZnVuYworCSAqIChvciBzZW5k IGZ1bmN0aW9uIGluIGNhc2Ugb2YgYSBiaW5hcnkgZm9ybWF0KS4gY29tcGxldGVseSBpZ25v cmUgdGhlCisJICogcmVzdWx0LiBNZW1vcnlDb250ZXh0IGlzIGZyZWUnZCB2aWEgcmVzZXQg YXQgdGhlIGVuZCBvZiB0aGUgdGhpcworCSAqIHBlci10dXBsZSBjYWxsYmFjayBhbnlob3cu CisJICogTk9URTogd2hlbiBpbnZva2luZyB0aGUgb3V0cHV0IGZ1bmN0aW9uIGRldG9hc3Rp bmcgaXMgaW1wbGljaXRseQorCSAqIHBlcmZvcm1lZCB3aGVuIG5lZWRlZC4gVGhpcyBhZGRz IG1ham9yIG92ZXJoZWFkIHRvIHBsYWluIAorCSAqIGV4cGxhaW4tYW5hbHl6ZSBhbmQgdGhp cyBpcyB3aGF0IGlzIGRlc2lyZWQgaGVyZS4KKwkgKi8KKworCXJlY2VpdmVyLT5ieXRlc1Nl bmQgKz0gMzsgLyogcHJvdG9jb2wgbWVzc2FnZSB0eXBlIGFuZCBhdHRyaWJ1dGUtY291bnQg Ki8KKwlmb3IgKGkgPSAwOyBpIDwgdHVwZGVzYy0+bmF0dHM7IGkrKykKKwl7CisJCVNlcmlh bGl6ZUF0dHJJbmZvICppbmZvID0gJihyZWNlaXZlci0+aW5mb3NbaV0pOworCQlEYXR1bSBh dHRyID0gc2xvdC0+dHRzX3ZhbHVlc1tpXTsKKwkJaWYgKHNsb3QtPnR0c19pc251bGxbaV0p CisJCXsKKwkJCXJlY2VpdmVyLT5ieXRlc1NlbmQgKz0gNDsgLyogbnVsbCBpcyBzZW5kIGFz IC0xIGxlbmd0aCAqLworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKGluZm8tPmZvcm1hdCA9 PSAwKQorCQkJeworCQkJCS8qIFRleHQgb3V0cHV0LCBpZ25vcmUgdGhlIHJlc3VsdCBidXQg Y291bnQgaXQgKi8KKwkJCQljaGFyKiBvdXRwdXQgPSBPdXRwdXRGdW5jdGlvbkNhbGwoJmlu Zm8tPmZpbmZvLCBhdHRyKTsKKwkJCQlzaXplX3Qgb3V0cHV0bGVuID0gc3RybGVuKG91dHB1 dCk7CisJCQkJLyogY29udmVydCBmcm9tIHNlcnZlciBlbmNvZGluZyB0byBjbGllbnQgZW5j b2RpbmcgaWYgbmVlZGVkICovCisJCQkJY2hhciAqY29udmVydGVkID0gcGdfc2VydmVyX3Rv X2NsaWVudChvdXRwdXQsIG91dHB1dGxlbik7CisJCQkJaWYgKGNvbnZlcnRlZCAhPSBvdXRw dXQpCisJCQkJeworCQkJCQkvKiBjb252ZXJ0ZWQgZW5jb2RpbmcsIGdldCBuZXcgbGVuZ3Ro ICovCisJCQkJCW91dHB1dGxlbiA9IHN0cmxlbihjb252ZXJ0ZWQpOworCQkJCQlwZnJlZShj b252ZXJ0ZWQpOworCQkJCX0KKwkJCQkvKiBhcHBlbmQgbGVuZ3RoIHRoYXQgd291bGQgaGF2 ZSBnb25lIG92ZXIgdGhlIHdpcmUsIDQKKwkJCQkgKiB0aGUgbnVtYmVyIG9mIHByZWNlZGlu ZyBieXRlcyB0aGF0IGNvbnRhaW4gdGhlIGxlbmd0aCAqLworCQkJCXJlY2VpdmVyLT5ieXRl c1NlbmQgKz0gNCArIG91dHB1dGxlbjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBC aW5hcnkgb3V0cHV0LCBpZ25vcmUgdGhlIHJlc3VsdCBidXQgY291bnQgaXQKKwkJCQkgKiBs ZW5ndGggaXMgaW5jbHVkZWQgaW4gdmFyc2l6ZSAqLworCQkJCWJ5dGVhKiBieXRlcyA9IFNl bmRGdW5jdGlvbkNhbGwoJmluZm8tPmZpbmZvLCBhdHRyKTsKKwkJCQl1aW50NjQgbiA9IFZB UlNJWkUoYnl0ZXMpOworCQkJCXJlY2VpdmVyLT5ieXRlc1NlbmQgKz0gbjsKKwkJCX0KKwkJ fQorCX0KKwlNZW1vcnlDb250ZXh0U3dpdGNoVG8ocmVjZWl2ZXItPm9sZE1lbW9yeUNvbnRl eHQpOworCU1lbW9yeUNvbnRleHRSZXNldChyZWNlaXZlci0+bWVtb3J5Q29udGV4dCk7CisJ cmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkCitzZXJpYWxpemVBbmFseXplU3RhcnR1 cChEZXN0UmVjZWl2ZXIgKnNlbGYsIGludCBvcGVyYXRpb24sIFR1cGxlRGVzYyB0eXBlaW5m bykKK3sKKwlTZXJpYWxpemVEZXN0UmVjZWl2ZXIgKnJlY2VpdmVyID0gKFNlcmlhbGl6ZURl c3RSZWNlaXZlciopIHNlbGY7CisJaW50IGk7CisJLyogbWVtb3J5IGNvbnRleHQgZm9yIG91 ciB3b3JrICovCisJcmVjZWl2ZXItPm1lbW9yeUNvbnRleHQgPSBBbGxvY1NldENvbnRleHRD cmVhdGUoQ3VycmVudE1lbW9yeUNvbnRleHQsCisJCSJTZXJpYWxpemVUdXBsZVJlY2VpdmUi LCBBTExPQ1NFVF9ERUZBVUxUX1NJWkVTKTsKKworCS8qIGFjY291bnQgZm9yIHRoZSBhdHRy aWJ1dGUgaGVhZGVycyBmb3Igc2VuZCBieXRlcyAqLworCXJlY2VpdmVyLT5ieXRlc1NlbmQg Kz0gMzsgLyogcHJvdG9jb2wgbWVzc2FnZSB0eXBlIGFuZCBhdHRyaWJ1dGUtY291bnQgKi8K Kwlmb3IgKGkgPSAwOyBpIDwgdHlwZWluZm8tPm5hdHRzOyArK2kpCisJeworCQlGb3JtX3Bn X2F0dHJpYnV0ZSBhdHQgPSBUdXBsZURlc2NBdHRyKHR5cGVpbmZvLCBpKTsKKwkJY2hhciog bmFtZSA9IE5hbWVTdHIoYXR0LT5hdHRuYW1lKTsKKwkJc2l6ZV90IG5hbWVsZW4gPSBzdHJs ZW4obmFtZSk7CisJCS8qIGNvbnZlcnQgZnJvbSBzZXJ2ZXIgZW5jb2RpbmcgdG8gY2xpZW50 IGVuY29kaW5nIGlmIG5lZWRlZCAqLworCQljaGFyICpjb252ZXJ0ZWQgPSBwZ19zZXJ2ZXJf dG9fY2xpZW50KG5hbWUsIG5hbWVsZW4pOworCQlpZiAoY29udmVydGVkICE9IG5hbWUpCisJ CXsKKwkJCW5hbWVsZW4gPSBzdHJsZW4oY29udmVydGVkKTsKKwkJCXBmcmVlKGNvbnZlcnRl ZCk7CisJCX0KKwkJLyogc2VlIHByaW50dHVwLmggd2h5IHdlIGFkZCAxOCBieXRlcyBoZXJl LiBUaGVzZSBhcmUgdGhlIGluZm9zCisJCSAqIG5lZWRlZCBmb3IgZWFjaCBhdHRyaWJ1dGUg cGx1cyB0aGUgYXR0cmlidXRlcydzIG5hbWUgKi8KKwkJcmVjZWl2ZXItPmJ5dGVzU2VuZCAr PSBuYW1lbGVuICsgMSArIDE4OworCX0KK30KKworc3RhdGljIHZvaWQKK3NlcmlhbGl6ZUFu YWx5emVDbGVhbnVwKERlc3RSZWNlaXZlciAqc2VsZikKK3sKKwlTZXJpYWxpemVEZXN0UmVj ZWl2ZXIgKnJlY2VpdmVyID0gKFNlcmlhbGl6ZURlc3RSZWNlaXZlciopIHNlbGY7CisJTWVt b3J5Q29udGV4dERlbGV0ZShyZWNlaXZlci0+bWVtb3J5Q29udGV4dCk7Cit9CisKK3N0YXRp YyB2b2lkCitzZXJpYWxpemVBbmFseXplRGVzdHJveShEZXN0UmVjZWl2ZXIgKnNlbGYpCit7 CisJcGZyZWUoc2VsZik7Cit9CisKKy8qIGZvcm1hdCBpcyBlaXRoZXIgMCAodGV4dCkgb3Ig MSAoYmluYXJ5KSAqLworc3RhdGljIERlc3RSZWNlaXZlciAqQ3JlYXRlU2VyaWFsaXplRGVz dFJlY2VpdmVyKGludDE2IGZvcm1hdCkKK3sKKwkvKiBBdHRlbnRpb24gbXVzdCBwYWxsb2Mw IChsaWtlIGNhbGxvYykgaGVyZS4KKwkgKiBpbmZvcyBhbmQgbmF0dHJzIGFyZSBleHBlY3Rl ZCB0byBiZSAwIG9yIE5VTEwgaW5pdGlhbGx5ICovCisJU2VyaWFsaXplRGVzdFJlY2VpdmVy ICpzZWxmID0gKFNlcmlhbGl6ZURlc3RSZWNlaXZlciopIHBhbGxvYzAoCisJCXNpemVvZihT ZXJpYWxpemVEZXN0UmVjZWl2ZXIpKTsKKwlzZWxmLT5kZXN0UmVjZXZpZXIucmVjZWl2ZVNs b3QgPSBzZXJpYWxpemVBbmFseXplUmVjZWl2ZTsKKwlzZWxmLT5kZXN0UmVjZXZpZXIuclN0 YXJ0dXAgPSBzZXJpYWxpemVBbmFseXplU3RhcnR1cDsKKwlzZWxmLT5kZXN0UmVjZXZpZXIu clNodXRkb3duID0gc2VyaWFsaXplQW5hbHl6ZUNsZWFudXA7CisJc2VsZi0+ZGVzdFJlY2V2 aWVyLnJEZXN0cm95ID0gc2VyaWFsaXplQW5hbHl6ZURlc3Ryb3k7CisJc2VsZi0+ZGVzdFJl Y2V2aWVyLm15ZGVzdCA9IERlc3ROb25lOworCXNlbGYtPmZvcm1hdCA9IGZvcm1hdDsKKwly ZXR1cm4gKERlc3RSZWNlaXZlciAqKSBzZWxmOworfQorCitzdGF0aWMgdWludDY0IEdldE51 bWJlck9mU2VyaWFsaXplZEJ5dGVzKERlc3RSZWNlaXZlciAqZGVzdCkKK3sKKwlTZXJpYWxp emVEZXN0UmVjZWl2ZXIgKnJlY2VpdmVyID0gKFNlcmlhbGl6ZURlc3RSZWNlaXZlciopIGRl c3Q7CisJcmV0dXJuIHJlY2VpdmVyLT5ieXRlc1NlbmQ7Cit9CmRpZmYgLS1naXQgYS9zcmMv aW5jbHVkZS9jb21tYW5kcy9leHBsYWluLmggYi9zcmMvaW5jbHVkZS9jb21tYW5kcy9leHBs YWluLmgKaW5kZXggM2QzZTYzMmEwYy4uNzc3Yzc1NzhjYyAxMDA2NDQKLS0tIGEvc3JjL2lu Y2x1ZGUvY29tbWFuZHMvZXhwbGFpbi5oCisrKyBiL3NyYy9pbmNsdWRlL2NvbW1hbmRzL2V4 cGxhaW4uaApAQCAtNDcsNiArNDcsMTYgQEAgdHlwZWRlZiBzdHJ1Y3QgRXhwbGFpblN0YXRl CiAJYm9vbAkJc3VtbWFyeTsJCS8qIHByaW50IHRvdGFsIHBsYW5uaW5nIGFuZCBleGVjdXRp b24gdGltaW5nICovCiAJYm9vbAkJc2V0dGluZ3M7CQkvKiBwcmludCBtb2RpZmllZCBzZXR0 aW5ncyAqLwogCWJvb2wJCWdlbmVyaWM7CQkvKiBnZW5lcmF0ZSBhIGdlbmVyaWMgcGxhbiAq LworCWJvb2wJCXNlcmlhbGl6ZTsgICAgICAvKiBzZXJpYWxpemUgYWxsIHZhbHVlcywgb25s eSBhcHBsaWNhYmxlCisJCQkJCQkJCSAqIHdoZW4gImFuYWx5emUiIGlzIGFjdGl2ZS4gc2Vy aWFsaXppbmcKKwkJCQkJCQkJICogaW52b2tlcyB0aGUgdHlwZSdzIG91dHB1dCBmdW5jdGlv biBpbgorCQkJCQkJCQkgKiB0aGUgc2FtZSB3YXkgcHJpbnR0dXAuYyBkb2VzIHRoZW4gdHVw bGVzCisJCQkJCQkJCSAqIGFyZSBzZW5kIHRvIHRoZSBjbGllbnQuIHRoaXMgaW5jbHVkZXMK KwkJCQkJCQkJICogZGV0b2FzdGluZyBvZiB0b2FzdGVkIHZhbHVlcyBhbmQgbWFrZXMKKwkJ CQkJCQkJICogRVhQTEFJTihBTkFMWVpFLFNFUklBTElaRSkgcmV0dXJuIHJlYWxpc3RpYwor CQkJCQkJCQkgKiAobG9uZ2VyIHJ1bnRpbWVzICovCisJYm9vbAkJc2VyaWFsaXplYmluYXJ5 Oy8qIHNlcmlhbGl6ZSBpbiBiaW5hcnkgZm9ybWF0ICovCisKIAlFeHBsYWluRm9ybWF0IGZv cm1hdDsJCS8qIG91dHB1dCBmb3JtYXQgKi8KIAkvKiBzdGF0ZSBmb3Igb3V0cHV0IGZvcm1h dHRpbmcgLS0tIG5vdCByZXNldCBmb3IgZWFjaCBuZXcgcGxhbiB0cmVlICovCiAJaW50CQkJ aW5kZW50OwkJCS8qIGN1cnJlbnQgaW5kZW50YXRpb24gbGV2ZWwgKi8KZGlmZiAtLWdpdCBh L3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZXhwbGFpbi5vdXQgYi9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL2V4cGxhaW4ub3V0CmluZGV4IDFhY2E3NzQ5MWIuLjc2ZTg5MzJhN2Mg MTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZXhwbGFpbi5vdXQKKysr IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9leHBsYWluLm91dApAQCAtNTU5LDMgKzU1 OSw0MCBAQCBzZWxlY3QgZXhwbGFpbl9maWx0ZXIoJ2V4cGxhaW4gKHZlcmJvc2UpIHNlbGVj dCAqIGZyb20gaW50OF90YmwgaTgnKTsKICBRdWVyeSBJZGVudGlmaWVyOiBOCiAoMyByb3dz KQogCistLSBUZXN0IHRoYXQgU0VSSUFMSVpFIGlzIGFjY2VwdGVkIGFzIGEgcGFyYW1ldGVy IHRvIGV4cGxhaW4KKy0tIHRpbWluZ3MgYXJlIGZpbHRlcmVkIG91dCBieSBleHBsYWluX2Zp bHRlcgorY3JlYXRlIHRhYmxlIHRlc3Rfc2VyaWFsaXplKGlkIGJpZ3NlcmlhbCwgdmFsIHRl eHQpOworc2VsZWN0IGV4cGxhaW5fZmlsdGVyKCdleHBsYWluIChhbmFseXplLHNlcmlhbGl6 ZSkgc2VsZWN0ICogZnJvbSB0ZXN0X3NlcmlhbGl6ZScpOworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgZXhwbGFpbl9maWx0ZXIgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gdGVzdF9zZXJpYWxpemUgIChjb3N0 PU4uTi4uTi5OIHJvd3M9TiB3aWR0aD1OKSAoYWN0dWFsIHRpbWU9Ti5OLi5OLk4gcm93cz1O IGxvb3BzPU4pCisgUGxhbm5pbmcgVGltZTogTi5OIG1zCisgU2VyaWFsaXplZCBCeXRlczog TiBieXRlcworIEV4ZWN1dGlvbiBUaW1lOiBOLk4gbXMKKyg0IHJvd3MpCisKK2Ryb3AgdGFi bGUgdGVzdF9zZXJpYWxpemU7CistLSBUZXN0IHRoYXQgU0VSSUFMSVpFQklOQVJZIGlzIGFj Y2VwdGVkIGFzIGEgcGFyYW1ldGVyIHRvIGV4cGxhaW4KK2NyZWF0ZSB0YWJsZSB0ZXN0X3Nl cmlhbGl6ZShpZCBiaWdzZXJpYWwsIHZhbCB0ZXh0KTsKK3NlbGVjdCBleHBsYWluX2ZpbHRl cignZXhwbGFpbiAoYW5hbHl6ZSxzZXJpYWxpemViaW5hcnkpIHNlbGVjdCAqIGZyb20gdGVz dF9zZXJpYWxpemUnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGV4cGxhaW5fZmlsdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IFNlcSBTY2FuIG9uIHRlc3Rfc2VyaWFsaXplICAoY29zdD1OLk4uLk4uTiByb3dzPU4gd2lk dGg9TikgKGFjdHVhbCB0aW1lPU4uTi4uTi5OIHJvd3M9TiBsb29wcz1OKQorIFBsYW5uaW5n IFRpbWU6IE4uTiBtcworIFNlcmlhbGl6ZWQgQnl0ZXM6IE4gYnl0ZXMKKyBFeGVjdXRpb24g VGltZTogTi5OIG1zCisoNCByb3dzKQorCitkcm9wIHRhYmxlIHRlc3Rfc2VyaWFsaXplOwor LS0gVGVzdCBTRVJJQUxJWkUgaXMgX25vdF8gYWNjZXB0ZWQgYXMgYSBwYXJhbWV0ZXIgdG8g ZXhwbGFpbiB1bmxlc3MgQU5BTFlaRSBpcyBzcGVjaWZpZWQKK2NyZWF0ZSB0YWJsZSB0ZXN0 X3NlcmlhbGl6ZShpZCBiaWdzZXJpYWwsIHZhbCB0ZXh0KTsKK3NlbGVjdCBleHBsYWluX2Zp bHRlcignZXhwbGFpbiAoc2VyaWFsaXplKSBzZWxlY3QgKiBmcm9tIHRlc3Rfc2VyaWFsaXpl Jyk7CitFUlJPUjogIEVYUExBSU4gb3B0aW9uIFNFUklBTElaRSByZXF1aXJlcyBBTkFMWVpF CitDT05URVhUOiAgUEwvcGdTUUwgZnVuY3Rpb24gZXhwbGFpbl9maWx0ZXIodGV4dCkgbGlu ZSA1IGF0IEZPUiBvdmVyIEVYRUNVVEUgc3RhdGVtZW50Citkcm9wIHRhYmxlIHRlc3Rfc2Vy aWFsaXplOworLS0gVGVzdCBTRVJJQUxJWkVCSU5BUlkgaXMgX25vdF8gYWNjZXB0ZWQgYXMg YSBwYXJhbWV0ZXIgdG8gZXhwbGFpbiB1bmxlc3MgQU5BTFlaRSBpcyBzcGVjaWZpZWQKK2Ny ZWF0ZSB0YWJsZSB0ZXN0X3NlcmlhbGl6ZShpZCBiaWdzZXJpYWwsIHZhbCB0ZXh0KTsKK3Nl bGVjdCBleHBsYWluX2ZpbHRlcignZXhwbGFpbiAoc2VyaWFsaXplYmluYXJ5KSBzZWxlY3Qg KiBmcm9tIHRlc3Rfc2VyaWFsaXplJyk7CitFUlJPUjogIEVYUExBSU4gb3B0aW9uIFNFUklB TElaRUJJTkFSWSByZXF1aXJlcyBBTkFMWVpFCitDT05URVhUOiAgUEwvcGdTUUwgZnVuY3Rp b24gZXhwbGFpbl9maWx0ZXIodGV4dCkgbGluZSA1IGF0IEZPUiBvdmVyIEVYRUNVVEUgc3Rh dGVtZW50Citkcm9wIHRhYmxlIHRlc3Rfc2VyaWFsaXplOwpkaWZmIC0tZ2l0IGEvc3JjL3Rl c3QvcmVncmVzcy9zcWwvZXhwbGFpbi5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9leHBs YWluLnNxbAppbmRleCBiNmI3YmVhYjI3Li5iZGFiYzBjMzZlIDEwMDY0NAotLS0gYS9zcmMv dGVzdC9yZWdyZXNzL3NxbC9leHBsYWluLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3Nx bC9leHBsYWluLnNxbApAQCAtMTU0LDMgKzE1NCwyNiBAQCBzZWxlY3QgZXhwbGFpbl9maWx0 ZXIoJ2V4cGxhaW4gKHZlcmJvc2UpIHNlbGVjdCAqIGZyb20gdDEgd2hlcmUgcGdfdGVtcC5t eXNpbihmMQogLS0gVGVzdCBjb21wdXRlX3F1ZXJ5X2lkCiBzZXQgY29tcHV0ZV9xdWVyeV9p ZCA9IG9uOwogc2VsZWN0IGV4cGxhaW5fZmlsdGVyKCdleHBsYWluICh2ZXJib3NlKSBzZWxl Y3QgKiBmcm9tIGludDhfdGJsIGk4Jyk7CisKKy0tIFRlc3QgdGhhdCBTRVJJQUxJWkUgaXMg YWNjZXB0ZWQgYXMgYSBwYXJhbWV0ZXIgdG8gZXhwbGFpbgorLS0gdGltaW5ncyBhcmUgZmls dGVyZWQgb3V0IGJ5IGV4cGxhaW5fZmlsdGVyCitjcmVhdGUgdGFibGUgdGVzdF9zZXJpYWxp emUoaWQgYmlnc2VyaWFsLCB2YWwgdGV4dCk7CitzZWxlY3QgZXhwbGFpbl9maWx0ZXIoJ2V4 cGxhaW4gKGFuYWx5emUsc2VyaWFsaXplKSBzZWxlY3QgKiBmcm9tIHRlc3Rfc2VyaWFsaXpl Jyk7Citkcm9wIHRhYmxlIHRlc3Rfc2VyaWFsaXplOworCistLSBUZXN0IHRoYXQgU0VSSUFM SVpFQklOQVJZIGlzIGFjY2VwdGVkIGFzIGEgcGFyYW1ldGVyIHRvIGV4cGxhaW4KK2NyZWF0 ZSB0YWJsZSB0ZXN0X3NlcmlhbGl6ZShpZCBiaWdzZXJpYWwsIHZhbCB0ZXh0KTsKK3NlbGVj dCBleHBsYWluX2ZpbHRlcignZXhwbGFpbiAoYW5hbHl6ZSxzZXJpYWxpemViaW5hcnkpIHNl bGVjdCAqIGZyb20gdGVzdF9zZXJpYWxpemUnKTsKK2Ryb3AgdGFibGUgdGVzdF9zZXJpYWxp emU7CisKKy0tIFRlc3QgU0VSSUFMSVpFIGlzIF9ub3RfIGFjY2VwdGVkIGFzIGEgcGFyYW1l dGVyIHRvIGV4cGxhaW4gdW5sZXNzIEFOQUxZWkUgaXMgc3BlY2lmaWVkCitjcmVhdGUgdGFi bGUgdGVzdF9zZXJpYWxpemUoaWQgYmlnc2VyaWFsLCB2YWwgdGV4dCk7CitzZWxlY3QgZXhw bGFpbl9maWx0ZXIoJ2V4cGxhaW4gKHNlcmlhbGl6ZSkgc2VsZWN0ICogZnJvbSB0ZXN0X3Nl cmlhbGl6ZScpOworZHJvcCB0YWJsZSB0ZXN0X3NlcmlhbGl6ZTsKKworLS0gVGVzdCBTRVJJ QUxJWkVCSU5BUlkgaXMgX25vdF8gYWNjZXB0ZWQgYXMgYSBwYXJhbWV0ZXIgdG8gZXhwbGFp biB1bmxlc3MgQU5BTFlaRSBpcyBzcGVjaWZpZWQKK2NyZWF0ZSB0YWJsZSB0ZXN0X3Nlcmlh bGl6ZShpZCBiaWdzZXJpYWwsIHZhbCB0ZXh0KTsKK3NlbGVjdCBleHBsYWluX2ZpbHRlcign ZXhwbGFpbiAoc2VyaWFsaXplYmluYXJ5KSBzZWxlY3QgKiBmcm9tIHRlc3Rfc2VyaWFsaXpl Jyk7Citkcm9wIHRhYmxlIHRlc3Rfc2VyaWFsaXplOworCisK --------------NUdG5i1urxYs1y9K5GTWAXMs--