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 1qydrD-009tE4-O7 for pgsql-hackers@arkaria.postgresql.org; Thu, 02 Nov 2023 20:00:00 +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 1qydrC-00FBiC-7L for pgsql-hackers@arkaria.postgresql.org; Thu, 02 Nov 2023 19:59:58 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qydrB-00FBi3-Ky for pgsql-hackers@lists.postgresql.org; Thu, 02 Nov 2023 19:59:57 +0000 Received: from mout.gmx.net ([212.227.15.19]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qydr3-003eY5-Dg for pgsql-hackers@postgresql.org; Thu, 02 Nov 2023 19:59:56 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.de; s=s31663417; t=1698955182; x=1699559982; i=stepan.rutz@gmx.de; bh=uPd6HhZbf+WJA8Rz+91MlqVHUii97Mq+rzxwkH67LeE=; h=X-UI-Sender-Class:Date:Subject:To:Cc:References:From: In-Reply-To; b=AC96DS8e6VpWD1V5ZsO3rOTt+pO8SrmPKq/iqH4j1e8tfFtZ58XO+aEIuCmASVIN bp6Ix/FP8+DiARr5GHAgXtlafHJcWmYhq7MveMQ4YGA/M7Kht/cvrRG3TMhrLGwNH 9CuZ/jRvlovPt+11Yivqe+LCs8xWfgE97p9cyXbj0vbQDv8+ShlJJwB8eok6k1cn3 8639xbTJ0QF1k5YadrncLulpEZ4FUIvtccw0bBCbpHNEdOssrPow1Dc9XRvUOXMVR my3SG+zmY9SrJ4Dbp+mvbGTDcIHulsFs0q2z9/4RU7+cieQWhxmAIDA/DeUtn9n0U 8Od2PTDmTyFcbthcYQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from [192.168.178.133] ([94.31.82.126]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MtOGa-1rIljU05Rm-00urRs; Thu, 02 Nov 2023 20:59:42 +0100 Content-Type: multipart/mixed; boundary="------------hz2wbE00Ke6TFJbCSfWyr5CN" Message-ID: <5f7fbfef-5daa-4b95-8c25-feeb861e42db@gmx.de> Date: Thu, 2 Nov 2023 20:59:41 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Detoasting optionally to make Explain-Analyze less misleading Content-Language: en-US, de-DE, de-DE-frami To: Tomas Vondra , Tom Lane , Matthias van de Meent Cc: pgsql-hackers@postgresql.org References: <2802772.1694532399@sss.pgh.pa.us> <03f952d6-b773-be93-e5d5-8f9ea9c2d461@gmx.de> <7b7d46b1-d6f7-eb10-55c9-aa45fce57781@enterprisedb.com> <9126b7da-204b-4701-8e2b-37fb824a0cf4@gmx.de> <78507aa1-f850-50cd-458a-3986d973d092@enterprisedb.com> From: stepan rutz In-Reply-To: <78507aa1-f850-50cd-458a-3986d973d092@enterprisedb.com> X-Provags-ID: V03:K1:DhYruRVILai/BvEq4Jq8hVoeAh6WhVcllp1cQCJmmjAF67FgytI 279J8waUNag5AHF+/BxumzBgbJVdpa+M0i6QoWnHvrGBteKZmoyHLUYXvtVy4d+CISUny+o SYMcUbH8I3uM7frkWAryl2zoSg7bUa7J/OxIFjJdhk9c11VMu+Svw424zdtR6bF1DBZwd3W dgKaMeAsCunlrKrCgd+GQ== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:jJnH3JeKJ3o=;eslAIR1NmdXMZ8X8irKH5J74x35 m9G/kGG4esVJv/UiMm7iCSWP29dlNOExtlleyRKs+DRP6RqDCIX9He4XA4B6ijemYXmpTbuBi 39+E2fBc/woRjR3AD/+nnwIq5g/gO06djP2LsZlCXry+H0DjYopUceBEio38A8B+6ulM3JnR9 oCFPvTs+oU/0t4PKAm5LU6xccR8+yhB/vTvI6dRsDNQtqYoSSjb9h8FA02oxz+Htpbu0QabxM pY+/ZH/r7HqIRJwm3nHkrgCqCtmJbwNfmWINInRMPUZ751Z8Jopzq5DtOdHWmRQUrVwzbuXvs ahm/YtEdH9QOMa77X4Yca1t1ONaKLH0TYNJI/u1ZEH6itYzDs7jgzY250SbE/XPQSbhy8AcsI Auq+/kLcx0Y3LxNKUlhh1HQQ0zM2OQADTetAaHXultqRV6l+EcYlPnTDEgl/AOhUp00ARQKVU YR7uLPGddOLKulx9D6oUmxpDDkI/jOb4xYuDC5D1fuq18G8yIS/NrRoNc+l804vLSMU4Zd/BY khjyqy5pOpWhqdRaKmkNn2VRGaohihxhXqp+g4Hx4BBhuzaPUV5sahl1FVk+W9AQgOoX7vBhl SsQcGZ/UCB7UMHZzjOhFhfdHHyTJl6zZ6/nrpytsDuTRyTL2+JMq+hxVf6AAgWAgf4ol63KJA luur2PrJ3g392DnAmIh0sN8zHzSVViEKWGllGiit2hs7CDoRMzTvMNOiKX0YfoHS2NnlvkHJ4 JC0IJLouI8Uj20rXsdCwNQR6Sti/c7DkaOyhSYXiz/oihlxiZqMfyrnxu4nsYt0BXyrz+ZdxZ 5NjMf2Dqu2Tw0e/y4zrirndUvZh4eLhg7xCfMS9fVsv5BnGxYJ4F0J/3slWWHvVa3rCU2Bc8l MP+wYakxyjieDPYAIauerJisqSz28N0NChvFFxZLxBBaIxArq41fJm97Q6BbCQPx8XYtwHP5N xJN+kYvwUQ3aBaf8MR+FT4GCk04= 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. --------------hz2wbE00Ke6TFJbCSfWyr5CN Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Hi Thomas, indeed by doing less the code also becomes trivial and ExplainPropertyInteger can be used as a oneliner. My intention was to actually get the realistic payload-bytes from the wire-protocol counted by the serialization option. I am also adding the protocol bits and the length of the data that is generated by serialization output-functions. So it should (hopefully) be the real numbers. Attached is a new revision of the patch that prints kB (floor'ed by integer-division by 1024). Maybe that is also misleading and bytes would be nicer (though harder to read). The output is now as follows: db1=3D# explain (analyze, serialize) select * from test; =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=A0Seq Scan on test=C2=A0 (cost=3D0.00..22.00 rows=3D1200 width=3D40) = (actual time=3D0.014..0.017 rows=3D1 loops=3D1) =C2=A0Planning Time: 0.245 ms =C2=A0Execution Time: 292.983 ms =C2=A0Serialized Bytes: 77039 kB (4 rows) Definately a lot nicer and controlled by=C2=A0 ExplainPropertyInteger in terms of formatting. The main motivation was to actually get a correct feeling for the execution time. Actually counting the bytes gives an impression of what would go over the wire. Only the big numbers matter here of course. Regards, Stepan On 02.11.23 20:32, Tomas Vondra wrote: > > On 11/2/23 20:09, stepan rutz wrote: >> Hi Thomas, >> >> you are right of course. Thanks! >> >> I have attached a new version of the patch that supports the syntax lik= e >> suggested. The previous patch was insonsistent in style indeed. >> >> explain (analyze, serialize) >> >> and >> >> explain (analyze, serialize binary) >> >> That doesn't make too much of a difference for most scenarios I am >> certain. However the the seralize option itself does. Mostly because it >> performs the detoasting and that was a trap for me in the past with jus= t >> plain analyze. >> >> >> Eg this scenario really is not too far fetched in a world where people >> have large JSONB values. >> >> >> db1=3D# create table test(id bigint, val text); >> >> db1=3D# insert into test(val) select string_agg(s::text, ',') from (sel= ect >> generate_series(1, 10_000_000) as s) as a1; >> >> now we have a cell that has roughly 80Mb in it. A large detoasting that >> will happen in reallife but in explain(analyze). >> >> and then... >> >> db1=3D# explain (analyze) select * from test; >> =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 >> -----------------------------------------------------------------------= ---------------------------- >> =C2=A0Seq Scan on test=C2=A0 (cost=3D0.00..22.00 rows=3D1200 width=3D4= 0) (actual >> time=3D0.018..0.020 rows=3D1 loops=3D1) >> =C2=A0Planning Time: 0.085 ms >> =C2=A0Execution Time: 0.044 ms >> (3 rows) >> >> db1=3D# explain (analyze, serialize) select * from test; >> =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 >> -----------------------------------------------------------------------= ---------------------------- >> =C2=A0Seq Scan on test=C2=A0 (cost=3D0.00..22.00 rows=3D1200 width=3D4= 0) (actual >> time=3D0.023..0.027 rows=3D1 loops=3D1) >> =C2=A0Planning Time: 0.077 ms >> =C2=A0Execution Time: 303.281 ms >> =C2=A0Serialized Bytes: 78888953 Bytes. Mode Text. Bandwidth 248.068 M= B/sec >> (4 rows) >> >> db1=3D# >> >> So the explain(analyze) does not process the ~80 MB in 0.044ms in any >> way of course. > Honestly, I see absolutely no point in printing this. I have little idea > what to do with the "bytes". We have to transfer this over network, but > surely there's other data not included in this sum, right? > > But the bandwidth seems pretty bogus/useless, as it's calculated from > execution time, which includes everything else, not just serialization. > So what does it say? It certainly does not include the network transfer. > > IMO we should either print nothing or just the bytes. I don't see the > point in printing the mode, which is determined by the command. > >> Actually I could print the serialized bytes using 1. grouping-separator= s >> (eg 78_888_953) or 2. in the way pg_size_pretty does it. >> >> If doing it the pg_size_pretty way I am uncertain if it would be ok to >> query the actual pg_size_pretty function via its (certainly frozen) oid >> of 3166 and do OidFunctionCall1(3166...) to invoke it. Otherwise I'd sa= y >> it would be nice if the code from that function would be made available >> as a utility function for all c-code.=C2=A0 Any suggestions on this top= ic? >> > I'm rather skeptical about this proposal, mostly because it makes it > harder to process the explain output in scripts etc. > > But more importantly, it's a completely separate matter from what this > patch does, so if you want to pursue this, I suggest you start a > separate thread. If you want to introduce separators, surely this is not > the only place that should do it (e.g. why not to do that for "rows" or > "cost" estimates)? > > BTW if you really want to print amount of memory, maybe print it in > kilobytes, like every other place in explain.c? Also, explain generally > prints stuff in "key: value" style (in text format). > > > regards > --------------hz2wbE00Ke6TFJbCSfWyr5CN Content-Type: text/x-patch; charset=UTF-8; name="0007_explain_analyze_and_serialize.patch" Content-Disposition: attachment; filename="0007_explain_analyze_and_serialize.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2V4cGxhaW4uYyBiL3NyYy9iYWNr ZW5kL2NvbW1hbmRzL2V4cGxhaW4uYwppbmRleCBmMWQ3MWJjNTRlLi5lNWFlYzdjYTU4IDEw MDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9leHBsYWluLmMKKysrIGIvc3JjL2Jh Y2tlbmQvY29tbWFuZHMvZXhwbGFpbi5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSAi bm9kZXMvbm9kZUZ1bmNzLmgiCiAjaW5jbHVkZSAicGFyc2VyL2FuYWx5emUuaCIKICNpbmNs dWRlICJwYXJzZXIvcGFyc2V0cmVlLmgiCisjaW5jbHVkZSAibWIvcGdfd2NoYXIuaCIKICNp bmNsdWRlICJyZXdyaXRlL3Jld3JpdGVIYW5kbGVyLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9i dWZtZ3IuaCIKICNpbmNsdWRlICJ0Y29wL3Rjb3Bwcm90LmgiCkBAIC0zMyw2ICszNCw3IEBA CiAjaW5jbHVkZSAidXRpbHMvZ3VjX3RhYmxlcy5oIgogI2luY2x1ZGUgInV0aWxzL2pzb24u aCIKICNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKKyNpbmNsdWRlICJ1dGlscy9udW1l cmljLmgiCiAjaW5jbHVkZSAidXRpbHMvcmVsLmgiCiAjaW5jbHVkZSAidXRpbHMvcnVsZXV0 aWxzLmgiCiAjaW5jbHVkZSAidXRpbHMvc25hcG1nci5oIgpAQCAtNDcsNyArNDksNiBAQCBF eHBsYWluT25lUXVlcnlfaG9va190eXBlIEV4cGxhaW5PbmVRdWVyeV9ob29rID0gTlVMTDsK IC8qIEhvb2sgZm9yIHBsdWdpbnMgdG8gZ2V0IGNvbnRyb2wgaW4gZXhwbGFpbl9nZXRfaW5k ZXhfbmFtZSgpICovCiBleHBsYWluX2dldF9pbmRleF9uYW1lX2hvb2tfdHlwZSBleHBsYWlu X2dldF9pbmRleF9uYW1lX2hvb2sgPSBOVUxMOwogCi0KIC8qIE9SLWFibGUgZmxhZ3MgZm9y IEV4cGxhaW5YTUxUYWcoKSAqLwogI2RlZmluZSBYX09QRU5JTkcgMAogI2RlZmluZSBYX0NM T1NJTkcgMQpAQCAtMTU0LDcgKzE1NSw4IEBAIHN0YXRpYyB2b2lkIEV4cGxhaW5KU09OTGlu ZUVuZGluZyhFeHBsYWluU3RhdGUgKmVzKTsKIHN0YXRpYyB2b2lkIEV4cGxhaW5ZQU1MTGlu ZVN0YXJ0aW5nKEV4cGxhaW5TdGF0ZSAqZXMpOwogc3RhdGljIHZvaWQgZXNjYXBlX3lhbWwo U3RyaW5nSW5mbyBidWYsIGNvbnN0IGNoYXIgKnN0cik7CiAKLQorc3RhdGljIERlc3RSZWNl aXZlciAqQ3JlYXRlU2VyaWFsaXplRGVzdFJlY2VpdmVyKGludDE2IGZvcm1hdCk7CitzdGF0 aWMgdWludDY0IEdldE51bWJlck9mU2VyaWFsaXplZEJ5dGVzKERlc3RSZWNlaXZlciAqZGVz dCk7CiAKIC8qCiAgKiBFeHBsYWluUXVlcnkgLQpAQCAtMTkyLDYgKzE5NCwyMyBAQCBFeHBs YWluUXVlcnkoUGFyc2VTdGF0ZSAqcHN0YXRlLCBFeHBsYWluU3RtdCAqc3RtdCwKIAkJCWVz LT5zZXR0aW5ncyA9IGRlZkdldEJvb2xlYW4ob3B0KTsKIAkJZWxzZSBpZiAoc3RyY21wKG9w dC0+ZGVmbmFtZSwgImdlbmVyaWNfcGxhbiIpID09IDApCiAJCQllcy0+Z2VuZXJpYyA9IGRl ZkdldEJvb2xlYW4ob3B0KTsKKwkJZWxzZSBpZiAoc3RyY21wKG9wdC0+ZGVmbmFtZSwgInNl cmlhbGl6ZSIpID09IDApCisJCXsKKwkJCWVzLT5zZXJpYWxpemUgPSB0cnVlOworCQkJLyog b3B0aW9uYWxseSBjaGVjayBmb3IgQklOQVJZIGFzIGFyZ3VtZW50ICovCisJCQlpZiAob3B0 LT5hcmcpCisJCQl7CisJCQkJY2hhciAqcCA9IGRlZkdldFN0cmluZyhvcHQpOworCQkJCWlm IChzdHJjbXAocCwgImJpbmFyeSIpID09IDApCisJCQkJCWVzLT5zZXJpYWxpemUgPSBlcy0+ c2VyaWFsaXplYmluYXJ5ID0gdHJ1ZTsKKwkJCQllbHNlCisJCQkJCWVyZXBvcnQoRVJST1Is CisJCQkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFKSwKKwkJ CQkJCSBlcnJtc2coInVucmVjb2duaXplZCB2YWx1ZSBmb3IgRVhQTEFJTiBvcHRpb24gXCIl c1wiOiBcIiVzXCIiLAorCQkJCQkJCQlvcHQtPmRlZm5hbWUsIHApLAorCQkJCQkJIHBhcnNl cl9lcnJwb3NpdGlvbihwc3RhdGUsIG9wdC0+bG9jYXRpb24pKSk7CisJCQl9CisJCX0KIAkJ ZWxzZSBpZiAoc3RyY21wKG9wdC0+ZGVmbmFtZSwgInRpbWluZyIpID09IDApCiAJCXsKIAkJ CXRpbWluZ19zZXQgPSB0cnVlOwpAQCAtMjQ0LDYgKzI2MywxMiBAQCBFeHBsYWluUXVlcnko UGFyc2VTdGF0ZSAqcHN0YXRlLCBFeHBsYWluU3RtdCAqc3RtdCwKIAkJCQkoZXJyY29kZShF UlJDT0RFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFKSwKIAkJCQkgZXJybXNnKCJFWFBMQUlO IG9wdGlvbiBUSU1JTkcgcmVxdWlyZXMgQU5BTFlaRSIpKSk7CiAKKwkvKiBjaGVjayB0aGF0 IHNlcmlhbGl6ZSBpcyB1c2VkIHdpdGggRVhQTEFJTiBBTkFMWVpFICovCisJaWYgKGVzLT5z ZXJpYWxpemUgJiYgIWVzLT5hbmFseXplKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJj b2RlKEVSUkNPREVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUUpLAorCQkJCSBlcnJtc2coIkVY UExBSU4gb3B0aW9uIFNFUklBTElaRSByZXF1aXJlcyBBTkFMWVpFIikpKTsKKwogCS8qIGNo ZWNrIHRoYXQgR0VORVJJQ19QTEFOIGlzIG5vdCB1c2VkIHdpdGggRVhQTEFJTiBBTkFMWVpF ICovCiAJaWYgKGVzLT5nZW5lcmljICYmIGVzLT5hbmFseXplKQogCQllcmVwb3J0KEVSUk9S LApAQCAtNTM1LDYgKzU2MCw3IEBAIEV4cGxhaW5PbmVQbGFuKFBsYW5uZWRTdG10ICpwbGFu bmVkc3RtdCwgSW50b0NsYXVzZSAqaW50bywgRXhwbGFpblN0YXRlICplcywKIAlkb3VibGUJ CXRvdGFsdGltZSA9IDA7CiAJaW50CQkJZWZsYWdzOwogCWludAkJCWluc3RydW1lbnRfb3B0 aW9uID0gMDsKKwlpbnQ2NAkJYnl0ZXNTZW5kID0gMDsKIAogCUFzc2VydChwbGFubmVkc3Rt dC0+Y29tbWFuZFR5cGUgIT0gQ01EX1VUSUxJVFkpOwogCkBAIC01NjUsOSArNTkxLDE1IEBA IEV4cGxhaW5PbmVQbGFuKFBsYW5uZWRTdG10ICpwbGFubmVkc3RtdCwgSW50b0NsYXVzZSAq aW50bywgRXhwbGFpblN0YXRlICplcywKIAkvKgogCSAqIE5vcm1hbGx5IHdlIGRpc2NhcmQg dGhlIHF1ZXJ5J3Mgb3V0cHV0LCBidXQgaWYgZXhwbGFpbmluZyBDUkVBVEUgVEFCTEUKIAkg KiBBUywgd2UnZCBiZXR0ZXIgdXNlIHRoZSBhcHByb3ByaWF0ZSB0dXBsZSByZWNlaXZlci4K KwkgKiBBbHNvIGlmIHdlIGNob29zZSB0byBzZXJpYWxpemUgZHVyaW5nIGV4cGxhaW4sIHdl IG5lZWQgdG8gc2VuZCB0aGUKKwkgKiB0dXBsZXMgdG8gYSBkZXN0LXJlY2VpdmVyIHRoYXQg cGVyZm9ybXMgc2VyaWFsaXppbmcKKwkgKiBpbnRvIHRoZSBwcm90b2NvbCByZWNlaXZpbmcg Zm9ybWF0LiB0aGlzIGltcGxpY2l0bHkgYWxzbyBkZXRvYXN0cworCSAqIHZhbHVlcy4KIAkg Ki8KIAlpZiAoaW50bykKIAkJZGVzdCA9IENyZWF0ZUludG9SZWxEZXN0UmVjZWl2ZXIoaW50 byk7CisJZWxzZSBpZiAoZXMtPmFuYWx5emUgJiYgZXMtPnNlcmlhbGl6ZSkKKwkJZGVzdCA9 IENyZWF0ZVNlcmlhbGl6ZURlc3RSZWNlaXZlcihlcy0+c2VyaWFsaXplYmluYXJ5ID8gMSA6 IDApOwogCWVsc2UKIAkJZGVzdCA9IE5vbmVfUmVjZWl2ZXI7CiAKQEAgLTYwNiw2ICs2Mzgs MTUgQEAgRXhwbGFpbk9uZVBsYW4oUGxhbm5lZFN0bXQgKnBsYW5uZWRzdG10LCBJbnRvQ2xh dXNlICppbnRvLCBFeHBsYWluU3RhdGUgKmVzLAogCQkvKiBydW4gY2xlYW51cCB0b28gKi8K IAkJRXhlY3V0b3JGaW5pc2gocXVlcnlEZXNjKTsKIAorCQlpZiAoZXMtPnNlcmlhbGl6ZSkK KwkJeworCQkJYnl0ZXNTZW5kID0gR2V0TnVtYmVyT2ZTZXJpYWxpemVkQnl0ZXMoZGVzdCk7 CisJCX0KKworCisJCS8qIGNhbGwgdGhlIGRlc3QgcmVjZWl2ZXIncyBkZXN0cm95IG1ldGhv ZCBldmVuIGR1cmluZyBleHBsYWluICovCisJCWRlc3QtPnJEZXN0cm95KGRlc3QpOworCiAJ CS8qIFdlIGNhbid0IHJ1biBFeGVjdXRvckVuZCAndGlsbCB3ZSdyZSBkb25lIHByaW50aW5n IHRoZSBzdGF0cy4uLiAqLwogCQl0b3RhbHRpbWUgKz0gZWxhcHNlZF90aW1lKCZzdGFydHRp bWUpOwogCX0KQEAgLTY3MSw2ICs3MTIsMTAgQEAgRXhwbGFpbk9uZVBsYW4oUGxhbm5lZFN0 bXQgKnBsYW5uZWRzdG10LCBJbnRvQ2xhdXNlICppbnRvLCBFeHBsYWluU3RhdGUgKmVzLAog CQlFeHBsYWluUHJvcGVydHlGbG9hdCgiRXhlY3V0aW9uIFRpbWUiLCAibXMiLCAxMDAwLjAg KiB0b3RhbHRpbWUsIDMsCiAJCQkJCQkJIGVzKTsKIAorCS8qIFByaW50IGluZm8gYWJvdXQg c2VyaWFsaXphdGlvbiBvZiBkYXRhICovCisJaWYgKGVzLT5zdW1tYXJ5ICYmIGVzLT5hbmFs eXplICYmIGVzLT5zZXJpYWxpemUpCisJCUV4cGxhaW5Qcm9wZXJ0eUludGVnZXIoIlNlcmlh bGl6ZWQgQnl0ZXMiLCAia0IiLCBieXRlc1NlbmQgLyAxMDI0LCBlcyk7CisKIAlFeHBsYWlu Q2xvc2VHcm91cCgiUXVlcnkiLCBOVUxMLCB0cnVlLCBlcyk7CiB9CiAKQEAgLTUwODIsMyAr NTEyNywyMzggQEAgZXNjYXBlX3lhbWwoU3RyaW5nSW5mbyBidWYsIGNvbnN0IGNoYXIgKnN0 cikKIHsKIAllc2NhcGVfanNvbihidWYsIHN0cik7CiB9CisKKworLyogU2VyaWFsaXppbmcg RGVzdFJlY2VpdmVyIGZ1bmN0aW9ucworICoKKyAqIEVYUExBSU4gKEFOQUxZWkUpICBzb21l dGltZXMgZ2l2ZXMgcmVzdWx0cyB0aGF0IHVucmVhbGlzdGljLgorICogRHVyaW5nIEVYUExB SU4oQU5BTFlaRSkgdGhlcmUgaXMgbm8gZGV0b2FzdGluZyBvZiB2YWx1ZXMuCisgKiBUaGF0 IG1lYW5zIHlvdSBnZXQgbm8gaWRlYSB3aGF0IHlvdXIgYWN0dWFsIHF1ZXJ5IHRpbWUgaXMg Z29pbmcKKyAqIHRvIGJlLCBub3Igd2hhdCB0aGUgYWN0dWFsIG92ZXJoZWFkIG9mIGRldG9h c3RpbmcgaXMuCisgKgorICogRVhQTEFJTiAoQU5BWUxaRSwgU0VSSUFMSVpFKSB3aWxsIHBl cmZvcm0gZGV0b2FzdGluZyBpbXBsaWNpdGx5IGFuZAorICogd2lsbCBhbHNvIGRvIGNvdW50 IHRoZSBudW1iZXIgb2YgYnl0ZXMgYmVpbmcgc2VuZCB0byB0aGUgY2xpZW50IGJ1dAorICog d2lsbCBub3QgYWN0dWFsbHkgc2VuZCB0aGVtLiBTRVJJQUxJWkUgdXNlcyB0ZXh0IGZvcm1h dCBmb3IgYWxsCisgKiBhdHRyaWJ1dGVzLgorICoKKyAqIEVYUExBSU4gKEFOQVlMWkUsIFNF UklBTElaRSBCSU5BUlkpIHNlcmlhbGl6ZXMgdXNpbmcgYmluYXJ5IGZvcm1hdC4KKyAqLwor CisvKiBhbiBhdHRyaWJ1dGUgaW5mbyBjYWNoZWQgZm9yIGVhY2ggY29sdW1uICovCit0eXBl ZGVmIHN0cnVjdAorewkJCQkJCQkJLyogUGVyLWF0dHJpYnV0ZSBpbmZvcm1hdGlvbiAqLwor CU9pZAkJCXR5cG91dHB1dDsJCS8qIE9pZCBmb3IgdGhlIHR5cGUncyB0ZXh0IG91dHB1dCBm biAqLworCU9pZAkJCXR5cHNlbmQ7CQkvKiBPaWQgZm9yIHRoZSB0eXBlJ3MgYmluYXJ5IG91 dHB1dCBmbiAqLworCWJvb2wJCXR5cGlzdmFybGVuYTsJLyogaXMgaXQgdmFybGVuYSAoaWUg cG9zc2libHkgdG9hc3RhYmxlKT8gKi8KKwlpbnQxNgkJZm9ybWF0OwkJCS8qIGZvcm1hdCBj b2RlIGZvciB0aGlzIGNvbHVtbiAqLworCUZtZ3JJbmZvCWZpbmZvOwkJCS8qIFByZWNvbXB1 dGVkIGNhbGwgaW5mbyBmb3Igb3V0cHV0IGZuICovCit9IFNlcmlhbGl6ZUF0dHJJbmZvOwor Cit0eXBlZGVmIHN0cnVjdAoreworCS8qIHJlY2VpdmVyIGZvciB0aGUgdHVwbGVzLCB0aGF0 IGp1c3Qgc2VyaWFsaXplcyAqLworCURlc3RSZWNlaXZlcgkJZGVzdFJlY2V2aWVyOworCU1l bW9yeUNvbnRleHQJCW1lbW9yeUNvbnRleHQ7CisJTWVtb3J5Q29udGV4dAkJb2xkTWVtb3J5 Q29udGV4dDsJLyogcmVzdG9yZSB0byBvbGQgd2hlbiBkb25lICovCisJaW50MTYJCQkJZm9y bWF0OwkJCQkvKiB0ZXh0IG9mIGJpbmFyeSAqLworCVR1cGxlRGVzYwkJCWF0dHJpbmZvOwor CWludAkJCQkJbmF0dHJzOworCXVpbnQ2NAkJCQlieXRlc1NlbmQ7CQkJLyogTnVtIG9mIGJ5 dGVzIG92ZXIgdGhlIHdpcmUgKi8KKwlTZXJpYWxpemVBdHRySW5mbwkqaW5mb3M7CQkJCS8q IENhY2hlZCBpbmZvIGFib3V0IGVhY2ggYXR0ciAqLworfSBTZXJpYWxpemVEZXN0UmVjZWl2 ZXI7CisKKy8qCisgKiBHZXQgdGhlIGxvb2t1cCBpbmZvIHRoYXQgdGhlIHJvdy1jYWxsYmFj ayBvZiB0aGUgcmVjZWl2ZXIgbmVlZHMuIHRoaXMgY29kZQorICogaXMgc2ltaWxhciB0byB0 aGUgY29kZSBmcm9tIHByaW50dXAuYyBleGNlcHQgdGhhdCBpdCBkb2Vzbid0IGRvIGFueSBh Y3R1YWwKKyAqIG91dHB1dC4KKyAqLworc3RhdGljIHZvaWQKK3NlcmlhbGl6ZV9wcmVwYXJl X2luZm8oU2VyaWFsaXplRGVzdFJlY2VpdmVyICpyZWNlaXZlciwgVHVwbGVEZXNjIHR5cGVp bmZvLAorCWludCBuYXR0cnMpCit7CisJaW50IGk7CisKKwkvKiBnZXQgcmlkIG9mIGFueSBv bGQgZGF0YSAqLworCWlmIChyZWNlaXZlci0+aW5mb3MpCisJCXBmcmVlKHJlY2VpdmVyLT5p bmZvcyk7CisJcmVjZWl2ZXItPmluZm9zID0gTlVMTDsKKworCXJlY2VpdmVyLT5hdHRyaW5m byA9IHR5cGVpbmZvOworCXJlY2VpdmVyLT5uYXR0cnMgPSBuYXR0cnM7CisJaWYgKG5hdHRy cyA8PSAwKQorCQlyZXR1cm47CisKKwlyZWNlaXZlci0+aW5mb3MgPSAoU2VyaWFsaXplQXR0 ckluZm8gKikgcGFsbG9jMCgKKwkJbmF0dHJzICogc2l6ZW9mKFNlcmlhbGl6ZUF0dHJJbmZv KSk7CisJZm9yIChpID0gMDsgaSA8IG5hdHRyczsgaSsrKQorCXsKKwkJU2VyaWFsaXplQXR0 ckluZm8gKmluZm8gPSAmKHJlY2VpdmVyLT5pbmZvc1tpXSk7CisJCUZvcm1fcGdfYXR0cmli dXRlIGF0dHIgPSBUdXBsZURlc2NBdHRyKHR5cGVpbmZvLCBpKTsKKwkJaW5mby0+Zm9ybWF0 ID0gcmVjZWl2ZXItPmZvcm1hdDsKKwkJaWYgKGluZm8tPmZvcm1hdCA9PSAwKQorCQl7CisJ CQlnZXRUeXBlT3V0cHV0SW5mbyhhdHRyLT5hdHR0eXBpZCwKKwkJCQkJCQkgICZpbmZvLT50 eXBvdXRwdXQsCisJCQkJCQkJICAmaW5mby0+dHlwaXN2YXJsZW5hKTsKKwkJCWZtZ3JfaW5m byhpbmZvLT50eXBvdXRwdXQsICZpbmZvLT5maW5mbyk7CisJCX0KKwkJZWxzZSBpZiAoaW5m by0+Zm9ybWF0ID09IDEpCisJCXsKKwkJCWdldFR5cGVCaW5hcnlPdXRwdXRJbmZvKGF0dHIt PmF0dHR5cGlkLAorCQkJCQkJCQkJJmluZm8tPnR5cHNlbmQsCisJCQkJCQkJCQkmaW5mby0+ dHlwaXN2YXJsZW5hKTsKKwkJCWZtZ3JfaW5mbyhpbmZvLT50eXBzZW5kLCAmaW5mby0+Zmlu Zm8pOworCQl9CisJCWVsc2UKKwkJCWVyZXBvcnQoRVJST1IsCisJCQkJCShlcnJjb2RlKEVS UkNPREVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUUpLAorCQkJCQkgZXJybXNnKCJ1bnN1cHBv cnRlZCBmb3JtYXQgY29kZTogJWQiLCBpbmZvLT5mb3JtYXQpKSk7CisJfQorfQorCisKKwor LyogdGhpcyBtZXRob2QgcmVjZWl2ZXMgdGhlIHR1cGxlcy9yZWNvcmRzIGR1cmluZyBleHBs YWluIChhbmFseXplLCBzZXJpYWxpemUpCisgKiBhbmQgc2VyaWFsaXplcyB0aGVtLgorICog dGhpcyBtZXRob2QgaXMgb3RoZXJ3aXNlIG5vdCBjYWxsZWQgYW5kIGl0cyBwdXJwb3NlIGlz IHRvIHNlcmlhbGl6ZSB0bworICogbWFrZSBhbmFseXplIG9wdGlvbmFsbHkgbW9yZSByZWFs aXN0aWMuIHNlcmlhbGl6YXRpb24gaW5jbHVkZXMgZGV0b2FzdGluZworICogYW5kIGludm9r aW5nIHRoZSB0eXBlJ3Mgb3V0cHV0IChvciBzZW5kKSBmdW5jdGlvbiwgd2hpY2ggaXMgd2hh dCBoYXBwZW5zCisgKiB3aGVuIHlvdSBhY3R1YWxseSBydW4gdGhlIHF1ZXJ5LiBib3RoIHN0 ZXBzIGNvc3QgdGltZSBhbmQgdGh1cworICogYW5hbHl6ZSBjYW4gYmUgdmVyeSBtaXNsZWFk aW5nIGlmIHRob3NlIHR3byBzdGVwcyBhcmUgb21pdHRlZC4KKyAqLworc3RhdGljIGJvb2wK K3NlcmlhbGl6ZUFuYWx5emVSZWNlaXZlKFR1cGxlVGFibGVTbG90ICpzbG90LCBEZXN0UmVj ZWl2ZXIgKnNlbGYpCit7CisJaW50IGk7CisJVHVwbGVEZXNjIHR1cGRlc2M7CisJU2VyaWFs aXplRGVzdFJlY2VpdmVyICpyZWNlaXZlciA9IChTZXJpYWxpemVEZXN0UmVjZWl2ZXIqKSBz ZWxmOworCisJdHVwZGVzYyAgPSBzbG90LT50dHNfdHVwbGVEZXNjcmlwdG9yOworCS8qIENh Y2hlIGF0dHJpYnV0ZSBpbmZvcyBhbmQgZnVuY3Rpb24gb2lkIGlmIG91dGRhdGVkICovCisJ aWYgKHJlY2VpdmVyLT5hdHRyaW5mbyAhPSB0dXBkZXNjIHx8IHJlY2VpdmVyLT5uYXR0cnMg IT0gdHVwZGVzYy0+bmF0dHMpCisJeworCQlzZXJpYWxpemVfcHJlcGFyZV9pbmZvKHJlY2Vp dmVyLCB0dXBkZXNjLCB0dXBkZXNjLT5uYXR0cyk7CisJfQorCisJLyogRmlsbCBhbGwgb2Yg dGhlIHNsb3QncyBhdHRyaWJ1dGVzLCB3ZSBjYW4gbm93IHVzZSBzbG90LT50dHNfdmFsdWVz CisJICogYW5kIGl0cyB0dHNfaXNudWxsIGFycmF5IHdoaWNoIHNob3VsZCBiZSBsb25nIGVu b3VnaCBldmVuIGlmIGFkZGVkCisJICogYSBudWxsLWNvbHVtbiB0byB0aGUgdGFibGUgKi8K KwlzbG90X2dldGFsbGF0dHJzKHNsb3QpOworCisJcmVjZWl2ZXItPm9sZE1lbW9yeUNvbnRl eHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oCisJCXJlY2VpdmVyLT5tZW1vcnlDb250ZXh0 KTsKKworCS8qIEl0ZXJhdGUgb3ZlciBhbGwgYXR0cmlidXRlcyBvZiB0aGUgdHVwbGUgYW5k IGludm9rZSB0aGUgb3V0cHV0IGZ1bmMKKwkgKiAob3Igc2VuZCBmdW5jdGlvbiBpbiBjYXNl IG9mIGEgYmluYXJ5IGZvcm1hdCkuIGNvbXBsZXRlbHkgaWdub3JlIHRoZQorCSAqIHJlc3Vs dC4gTWVtb3J5Q29udGV4dCBpcyBmcmVlJ2QgdmlhIHJlc2V0IGF0IHRoZSBlbmQgb2YgdGhl IHRoaXMKKwkgKiBwZXItdHVwbGUgY2FsbGJhY2sgYW55aG93LgorCSAqIE5PVEU6IHdoZW4g aW52b2tpbmcgdGhlIG91dHB1dCBmdW5jdGlvbiBkZXRvYXN0aW5nIGlzIGltcGxpY2l0bHkK KwkgKiBwZXJmb3JtZWQgd2hlbiBuZWVkZWQuCisJICovCisKKwlyZWNlaXZlci0+Ynl0ZXNT ZW5kICs9IDM7IC8qIHByb3RvY29sIG1lc3NhZ2UgdHlwZSBhbmQgYXR0cmlidXRlLWNvdW50 ICovCisJZm9yIChpID0gMDsgaSA8IHR1cGRlc2MtPm5hdHRzOyBpKyspCisJeworCQlTZXJp YWxpemVBdHRySW5mbyAqaW5mbyA9ICYocmVjZWl2ZXItPmluZm9zW2ldKTsKKwkJRGF0dW0g YXR0ciA9IHNsb3QtPnR0c192YWx1ZXNbaV07CisJCWlmIChzbG90LT50dHNfaXNudWxsW2ld KQorCQl7CisJCQlyZWNlaXZlci0+Ynl0ZXNTZW5kICs9IDQ7IC8qIG51bGwgaXMgc2VuZCBh cyAtMSBsZW5ndGggKi8KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChpbmZvLT5mb3JtYXQg PT0gMCkKKwkJCXsKKwkJCQkvKiBUZXh0IG91dHB1dCwgaWdub3JlIHRoZSByZXN1bHQgYnV0 IGNvdW50IGl0ICovCisJCQkJY2hhciogb3V0cHV0ID0gT3V0cHV0RnVuY3Rpb25DYWxsKCZp bmZvLT5maW5mbywgYXR0cik7CisJCQkJc2l6ZV90IG91dHB1dGxlbiA9IHN0cmxlbihvdXRw dXQpOworCQkJCS8qIGNvbnZlcnQgZnJvbSBzZXJ2ZXIgZW5jb2RpbmcgdG8gY2xpZW50IGVu Y29kaW5nIGlmIG5lZWRlZCAqLworCQkJCWNoYXIgKmNvbnZlcnRlZCA9IHBnX3NlcnZlcl90 b19jbGllbnQob3V0cHV0LCBvdXRwdXRsZW4pOworCQkJCWlmIChjb252ZXJ0ZWQgIT0gb3V0 cHV0KQorCQkJCXsKKwkJCQkJLyogY29udmVydGVkIGVuY29kaW5nLCBnZXQgbmV3IGxlbmd0 aCAqLworCQkJCQlvdXRwdXRsZW4gPSBzdHJsZW4oY29udmVydGVkKTsKKwkJCQkJcGZyZWUo Y29udmVydGVkKTsKKwkJCQl9CisJCQkJLyogYXBwZW5kIGxlbmd0aCB0aGF0IHdvdWxkIGhh dmUgZ29uZSBvdmVyIHRoZSB3aXJlLCA0CisJCQkJICogdGhlIG51bWJlciBvZiBwcmVjZWRp bmcgYnl0ZXMgdGhhdCBjb250YWluIHRoZSBsZW5ndGggKi8KKwkJCQlyZWNlaXZlci0+Ynl0 ZXNTZW5kICs9IDQgKyBvdXRwdXRsZW47CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyog QmluYXJ5IG91dHB1dCwgaWdub3JlIHRoZSByZXN1bHQgYnV0IGNvdW50IGl0CisJCQkJICog bGVuZ3RoIGlzIGluY2x1ZGVkIGluIHZhcnNpemUgKi8KKwkJCQlieXRlYSogYnl0ZXMgPSBT ZW5kRnVuY3Rpb25DYWxsKCZpbmZvLT5maW5mbywgYXR0cik7CisJCQkJdWludDY0IG4gPSBW QVJTSVpFKGJ5dGVzKTsKKwkJCQlyZWNlaXZlci0+Ynl0ZXNTZW5kICs9IG47CisJCQl9CisJ CX0KKwl9CisJTWVtb3J5Q29udGV4dFN3aXRjaFRvKHJlY2VpdmVyLT5vbGRNZW1vcnlDb250 ZXh0KTsKKwlNZW1vcnlDb250ZXh0UmVzZXQocmVjZWl2ZXItPm1lbW9yeUNvbnRleHQpOwor CXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZAorc2VyaWFsaXplQW5hbHl6ZVN0YXJ0 dXAoRGVzdFJlY2VpdmVyICpzZWxmLCBpbnQgb3BlcmF0aW9uLCBUdXBsZURlc2MgdHlwZWlu Zm8pCit7CisJU2VyaWFsaXplRGVzdFJlY2VpdmVyICpyZWNlaXZlciA9IChTZXJpYWxpemVE ZXN0UmVjZWl2ZXIqKSBzZWxmOworCWludCBpOworCS8qIG1lbW9yeSBjb250ZXh0IGZvciBv dXIgd29yayAqLworCXJlY2VpdmVyLT5tZW1vcnlDb250ZXh0ID0gQWxsb2NTZXRDb250ZXh0 Q3JlYXRlKEN1cnJlbnRNZW1vcnlDb250ZXh0LAorCQkiU2VyaWFsaXplVHVwbGVSZWNlaXZl IiwgQUxMT0NTRVRfREVGQVVMVF9TSVpFUyk7CisKKwkvKiBhY2NvdW50IGZvciB0aGUgYXR0 cmlidXRlIGhlYWRlcnMgZm9yIHNlbmQgYnl0ZXMgKi8KKwlyZWNlaXZlci0+Ynl0ZXNTZW5k ICs9IDM7IC8qIHByb3RvY29sIG1lc3NhZ2UgdHlwZSBhbmQgYXR0cmlidXRlLWNvdW50ICov CisJZm9yIChpID0gMDsgaSA8IHR5cGVpbmZvLT5uYXR0czsgKytpKQorCXsKKwkJRm9ybV9w Z19hdHRyaWJ1dGUgYXR0ID0gVHVwbGVEZXNjQXR0cih0eXBlaW5mbywgaSk7CisJCWNoYXIq IG5hbWUgPSBOYW1lU3RyKGF0dC0+YXR0bmFtZSk7CisJCXNpemVfdCBuYW1lbGVuID0gc3Ry bGVuKG5hbWUpOworCQkvKiBjb252ZXJ0IGZyb20gc2VydmVyIGVuY29kaW5nIHRvIGNsaWVu dCBlbmNvZGluZyBpZiBuZWVkZWQgKi8KKwkJY2hhciAqY29udmVydGVkID0gcGdfc2VydmVy X3RvX2NsaWVudChuYW1lLCBuYW1lbGVuKTsKKwkJaWYgKGNvbnZlcnRlZCAhPSBuYW1lKQor CQl7CisJCQluYW1lbGVuID0gc3RybGVuKGNvbnZlcnRlZCk7CisJCQlwZnJlZShjb252ZXJ0 ZWQpOworCQl9CisJCS8qIHNlZSBwcmludHR1cC5oIHdoeSB3ZSBhZGQgMTggYnl0ZXMgaGVy ZS4gVGhlc2UgYXJlIHRoZSBpbmZvcworCQkgKiBuZWVkZWQgZm9yIGVhY2ggYXR0cmlidXRl IHBsdXMgdGhlIGF0dHJpYnV0ZXMncyBuYW1lICovCisJCXJlY2VpdmVyLT5ieXRlc1NlbmQg Kz0gbmFtZWxlbiArIDEgKyAxODsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitzZXJpYWxpemVB bmFseXplQ2xlYW51cChEZXN0UmVjZWl2ZXIgKnNlbGYpCit7CisJU2VyaWFsaXplRGVzdFJl Y2VpdmVyICpyZWNlaXZlciA9IChTZXJpYWxpemVEZXN0UmVjZWl2ZXIqKSBzZWxmOworCU1l bW9yeUNvbnRleHREZWxldGUocmVjZWl2ZXItPm1lbW9yeUNvbnRleHQpOworfQorCitzdGF0 aWMgdm9pZAorc2VyaWFsaXplQW5hbHl6ZURlc3Ryb3koRGVzdFJlY2VpdmVyICpzZWxmKQor eworCXBmcmVlKHNlbGYpOworfQorCisvKiBmb3JtYXQgaXMgZWl0aGVyIDAgKHRleHQpIG9y IDEgKGJpbmFyeSkgKi8KK3N0YXRpYyBEZXN0UmVjZWl2ZXIgKkNyZWF0ZVNlcmlhbGl6ZURl c3RSZWNlaXZlcihpbnQxNiBmb3JtYXQpCit7CisJLyogQXR0ZW50aW9uIG11c3QgcGFsbG9j MCAobGlrZSBjYWxsb2MpIGhlcmUuCisJICogaW5mb3MgYW5kIG5hdHRycyBhcmUgZXhwZWN0 ZWQgdG8gYmUgMCBvciBOVUxMIGluaXRpYWxseSAqLworCVNlcmlhbGl6ZURlc3RSZWNlaXZl ciAqc2VsZiA9IChTZXJpYWxpemVEZXN0UmVjZWl2ZXIqKSBwYWxsb2MwKAorCQlzaXplb2Yo U2VyaWFsaXplRGVzdFJlY2VpdmVyKSk7CisJc2VsZi0+ZGVzdFJlY2V2aWVyLnJlY2VpdmVT bG90ID0gc2VyaWFsaXplQW5hbHl6ZVJlY2VpdmU7CisJc2VsZi0+ZGVzdFJlY2V2aWVyLnJT dGFydHVwID0gc2VyaWFsaXplQW5hbHl6ZVN0YXJ0dXA7CisJc2VsZi0+ZGVzdFJlY2V2aWVy LnJTaHV0ZG93biA9IHNlcmlhbGl6ZUFuYWx5emVDbGVhbnVwOworCXNlbGYtPmRlc3RSZWNl dmllci5yRGVzdHJveSA9IHNlcmlhbGl6ZUFuYWx5emVEZXN0cm95OworCXNlbGYtPmRlc3RS ZWNldmllci5teWRlc3QgPSBEZXN0Tm9uZTsKKwlzZWxmLT5mb3JtYXQgPSBmb3JtYXQ7CisJ cmV0dXJuIChEZXN0UmVjZWl2ZXIgKikgc2VsZjsKK30KKworc3RhdGljIHVpbnQ2NCBHZXRO dW1iZXJPZlNlcmlhbGl6ZWRCeXRlcyhEZXN0UmVjZWl2ZXIgKmRlc3QpCit7CisJU2VyaWFs aXplRGVzdFJlY2VpdmVyICpyZWNlaXZlciA9IChTZXJpYWxpemVEZXN0UmVjZWl2ZXIqKSBk ZXN0OworCXJldHVybiByZWNlaXZlci0+Ynl0ZXNTZW5kOworfQpkaWZmIC0tZ2l0IGEvc3Jj L2luY2x1ZGUvY29tbWFuZHMvZXhwbGFpbi5oIGIvc3JjL2luY2x1ZGUvY29tbWFuZHMvZXhw bGFpbi5oCmluZGV4IGY5NTI1ZmI1NzIuLmRmYTFiOTRjZWEgMTAwNjQ0Ci0tLSBhL3NyYy9p bmNsdWRlL2NvbW1hbmRzL2V4cGxhaW4uaAorKysgYi9zcmMvaW5jbHVkZS9jb21tYW5kcy9l eHBsYWluLmgKQEAgLTQ3LDYgKzQ3LDE2IEBAIHR5cGVkZWYgc3RydWN0IEV4cGxhaW5TdGF0 ZQogCWJvb2wJCXN1bW1hcnk7CQkvKiBwcmludCB0b3RhbCBwbGFubmluZyBhbmQgZXhlY3V0 aW9uIHRpbWluZyAqLwogCWJvb2wJCXNldHRpbmdzOwkJLyogcHJpbnQgbW9kaWZpZWQgc2V0 dGluZ3MgKi8KIAlib29sCQlnZW5lcmljOwkJLyogZ2VuZXJhdGUgYSBnZW5lcmljIHBsYW4g Ki8KKwlib29sCQlzZXJpYWxpemU7ICAgICAgLyogc2VyaWFsaXplIGFsbCB2YWx1ZXMsIG9u bHkgYXBwbGljYWJsZQorCQkJCQkJCQkgKiB3aGVuICJhbmFseXplIiBpcyBhY3RpdmUuIHNl cmlhbGl6aW5nCisJCQkJCQkJCSAqIGludm9rZXMgdGhlIHR5cGUncyBvdXRwdXQgZnVuY3Rp b24gaW4KKwkJCQkJCQkJICogdGhlIHNhbWUgd2F5IHByaW50dHVwLmMgZG9lcyB0aGVuIHR1 cGxlcworCQkJCQkJCQkgKiBhcmUgc2VuZCB0byB0aGUgY2xpZW50LiB0aGlzIGluY2x1ZGVz CisJCQkJCQkJCSAqIGRldG9hc3Rpbmcgb2YgdG9hc3RlZCB2YWx1ZXMgYW5kIG1ha2VzCisJ CQkJCQkJCSAqIEVYUExBSU4oQU5BTFlaRSxTRVJJQUxJWkUpIHJldHVybiByZWFsaXN0aWMK KwkJCQkJCQkJICogKGxvbmdlciBydW50aW1lcyAqLworCWJvb2wJCXNlcmlhbGl6ZWJpbmFy eTsvKiBzZXJpYWxpemUgaW4gYmluYXJ5IGZvcm1hdCAqLworCiAJRXhwbGFpbkZvcm1hdCBm b3JtYXQ7CQkvKiBvdXRwdXQgZm9ybWF0ICovCiAJLyogc3RhdGUgZm9yIG91dHB1dCBmb3Jt YXR0aW5nIC0tLSBub3QgcmVzZXQgZm9yIGVhY2ggbmV3IHBsYW4gdHJlZSAqLwogCWludAkJ CWluZGVudDsJCQkvKiBjdXJyZW50IGluZGVudGF0aW9uIGxldmVsICovCmRpZmYgLS1naXQg YS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2V4cGxhaW4ub3V0IGIvc3JjL3Rlc3QvcmVn cmVzcy9leHBlY3RlZC9leHBsYWluLm91dAppbmRleCA4MDk2NTVlMTZlLi4yNzIwYjE3OTIz IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2V4cGxhaW4ub3V0Cisr KyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZXhwbGFpbi5vdXQKQEAgLTU2MywzICs1 NjMsNDggQEAgc2VsZWN0IGV4cGxhaW5fZmlsdGVyKCdleHBsYWluICh2ZXJib3NlKSBzZWxl Y3QgKiBmcm9tIGludDhfdGJsIGk4Jyk7CiAgUXVlcnkgSWRlbnRpZmllcjogTgogKDMgcm93 cykKIAorLS0gVGVzdCB0aGF0IFNFUklBTElaRSBpcyBhY2NlcHRlZCBhcyBhIHBhcmFtZXRl ciB0byBleHBsYWluCistLSB0aW1pbmdzIGFyZSBmaWx0ZXJlZCBvdXQgYnkgZXhwbGFpbl9m aWx0ZXIKK2NyZWF0ZSB0YWJsZSB0ZXN0X3NlcmlhbGl6ZShpZCBiaWdzZXJpYWwsIHZhbCB0 ZXh0KTsKK3NlbGVjdCBleHBsYWluX2ZpbHRlcignZXhwbGFpbiAoYW5hbHl6ZSxzZXJpYWxp emUpIHNlbGVjdCAqIGZyb20gdGVzdF9zZXJpYWxpemUnKTsKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGxhaW5fZmlsdGVyICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHRlc3Rfc2VyaWFsaXplICAoY29z dD1OLk4uLk4uTiByb3dzPU4gd2lkdGg9TikgKGFjdHVhbCB0aW1lPU4uTi4uTi5OIHJvd3M9 TiBsb29wcz1OKQorIFBsYW5uaW5nIFRpbWU6IE4uTiBtcworIEV4ZWN1dGlvbiBUaW1lOiBO Lk4gbXMKKyBTZXJpYWxpemVkIEJ5dGVzOiBOIGtCCisoNCByb3dzKQorCitkcm9wIHRhYmxl IHRlc3Rfc2VyaWFsaXplOworLS0gVGVzdCB0aGF0IFNFUklBTElaRSBCSU5BUlkgaXMgYWNj ZXB0ZWQgYXMgYSBwYXJhbWV0ZXIgdG8gZXhwbGFpbgorY3JlYXRlIHRhYmxlIHRlc3Rfc2Vy aWFsaXplKGlkIGJpZ3NlcmlhbCwgdmFsIHRleHQpOworc2VsZWN0IGV4cGxhaW5fZmlsdGVy KCdleHBsYWluIChhbmFseXplLHNlcmlhbGl6ZSBiaW5hcnkpIHNlbGVjdCAqIGZyb20gdGVz dF9zZXJpYWxpemUnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGV4cGxhaW5fZmlsdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IFNlcSBTY2FuIG9uIHRlc3Rfc2VyaWFsaXplICAoY29zdD1OLk4uLk4uTiByb3dzPU4gd2lk dGg9TikgKGFjdHVhbCB0aW1lPU4uTi4uTi5OIHJvd3M9TiBsb29wcz1OKQorIFBsYW5uaW5n IFRpbWU6IE4uTiBtcworIEV4ZWN1dGlvbiBUaW1lOiBOLk4gbXMKKyBTZXJpYWxpemVkIEJ5 dGVzOiBOIGtCCisoNCByb3dzKQorCitkcm9wIHRhYmxlIHRlc3Rfc2VyaWFsaXplOworLS0g VGVzdCB0aGF0IF9TRVJJQUxJWkUgaW52YWxpZHBhcmFtZXRlcl8gaXMgbm90IGFjY2VwdGVk IGFzIGEgcGFyYW1ldGVyIHRvIGV4cGxhaW4KK2NyZWF0ZSB0YWJsZSB0ZXN0X3NlcmlhbGl6 ZShpZCBiaWdzZXJpYWwsIHZhbCB0ZXh0KTsKK3NlbGVjdCBleHBsYWluX2ZpbHRlcignZXhw bGFpbiAoYW5hbHl6ZSxzZXJpYWxpemUgaW52YWxpZHBhcmFtZXRlcikgc2VsZWN0ICogZnJv bSB0ZXN0X3NlcmlhbGl6ZScpOworRVJST1I6ICB1bnJlY29nbml6ZWQgdmFsdWUgZm9yIEVY UExBSU4gb3B0aW9uICJzZXJpYWxpemUiOiAiaW52YWxpZHBhcmFtZXRlciIKK0xJTkUgMTog c2VsZWN0IGV4cGxhaW5fZmlsdGVyKCdleHBsYWluIChhbmFseXplLHNlcmlhbGl6ZSBpbnZh bGlkcGFyLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAgXgorQ09OVEVYVDogIFBML3Bn U1FMIGZ1bmN0aW9uIGV4cGxhaW5fZmlsdGVyKHRleHQpIGxpbmUgNSBhdCBGT1Igb3ZlciBF WEVDVVRFIHN0YXRlbWVudAorZHJvcCB0YWJsZSB0ZXN0X3NlcmlhbGl6ZTsKKy0tIFRlc3Qg U0VSSUFMSVpFIGlzIF9ub3RfIGFjY2VwdGVkIGFzIGEgcGFyYW1ldGVyIHRvIGV4cGxhaW4g dW5sZXNzIEFOQUxZWkUgaXMgc3BlY2lmaWVkCitjcmVhdGUgdGFibGUgdGVzdF9zZXJpYWxp emUoaWQgYmlnc2VyaWFsLCB2YWwgdGV4dCk7CitzZWxlY3QgZXhwbGFpbl9maWx0ZXIoJ2V4 cGxhaW4gKHNlcmlhbGl6ZSkgc2VsZWN0ICogZnJvbSB0ZXN0X3NlcmlhbGl6ZScpOworRVJS T1I6ICBFWFBMQUlOIG9wdGlvbiBTRVJJQUxJWkUgcmVxdWlyZXMgQU5BTFlaRQorQ09OVEVY VDogIFBML3BnU1FMIGZ1bmN0aW9uIGV4cGxhaW5fZmlsdGVyKHRleHQpIGxpbmUgNSBhdCBG T1Igb3ZlciBFWEVDVVRFIHN0YXRlbWVudAorZHJvcCB0YWJsZSB0ZXN0X3NlcmlhbGl6ZTsK Ky0tIFRlc3QgU0VSSUFMSVpFQklOQVJZIGlzIF9ub3RfIGFjY2VwdGVkIGFzIGEgcGFyYW1l dGVyIHRvIGV4cGxhaW4gdW5sZXNzIEFOQUxZWkUgaXMgc3BlY2lmaWVkCitjcmVhdGUgdGFi bGUgdGVzdF9zZXJpYWxpemUoaWQgYmlnc2VyaWFsLCB2YWwgdGV4dCk7CitzZWxlY3QgZXhw bGFpbl9maWx0ZXIoJ2V4cGxhaW4gKHNlcmlhbGl6ZSBiaW5hcnkpIHNlbGVjdCAqIGZyb20g dGVzdF9zZXJpYWxpemUnKTsKK0VSUk9SOiAgRVhQTEFJTiBvcHRpb24gU0VSSUFMSVpFIHJl cXVpcmVzIEFOQUxZWkUKK0NPTlRFWFQ6ICBQTC9wZ1NRTCBmdW5jdGlvbiBleHBsYWluX2Zp bHRlcih0ZXh0KSBsaW5lIDUgYXQgRk9SIG92ZXIgRVhFQ1VURSBzdGF0ZW1lbnQKK2Ryb3Ag dGFibGUgdGVzdF9zZXJpYWxpemU7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3Nx bC9leHBsYWluLnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2V4cGxhaW4uc3FsCmluZGV4 IGI2YjdiZWFiMjcuLjRkYzEwMDY2YjUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mv c3FsL2V4cGxhaW4uc3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2V4cGxhaW4uc3Fs CkBAIC0xNTQsMyArMTU0LDI5IEBAIHNlbGVjdCBleHBsYWluX2ZpbHRlcignZXhwbGFpbiAo dmVyYm9zZSkgc2VsZWN0ICogZnJvbSB0MSB3aGVyZSBwZ190ZW1wLm15c2luKGYxCiAtLSBU ZXN0IGNvbXB1dGVfcXVlcnlfaWQKIHNldCBjb21wdXRlX3F1ZXJ5X2lkID0gb247CiBzZWxl Y3QgZXhwbGFpbl9maWx0ZXIoJ2V4cGxhaW4gKHZlcmJvc2UpIHNlbGVjdCAqIGZyb20gaW50 OF90YmwgaTgnKTsKKworLS0gVGVzdCB0aGF0IFNFUklBTElaRSBpcyBhY2NlcHRlZCBhcyBh IHBhcmFtZXRlciB0byBleHBsYWluCistLSB0aW1pbmdzIGFyZSBmaWx0ZXJlZCBvdXQgYnkg ZXhwbGFpbl9maWx0ZXIKK2NyZWF0ZSB0YWJsZSB0ZXN0X3NlcmlhbGl6ZShpZCBiaWdzZXJp YWwsIHZhbCB0ZXh0KTsKK3NlbGVjdCBleHBsYWluX2ZpbHRlcignZXhwbGFpbiAoYW5hbHl6 ZSxzZXJpYWxpemUpIHNlbGVjdCAqIGZyb20gdGVzdF9zZXJpYWxpemUnKTsKK2Ryb3AgdGFi bGUgdGVzdF9zZXJpYWxpemU7CisKKy0tIFRlc3QgdGhhdCBTRVJJQUxJWkUgQklOQVJZIGlz IGFjY2VwdGVkIGFzIGEgcGFyYW1ldGVyIHRvIGV4cGxhaW4KK2NyZWF0ZSB0YWJsZSB0ZXN0 X3NlcmlhbGl6ZShpZCBiaWdzZXJpYWwsIHZhbCB0ZXh0KTsKK3NlbGVjdCBleHBsYWluX2Zp bHRlcignZXhwbGFpbiAoYW5hbHl6ZSxzZXJpYWxpemUgYmluYXJ5KSBzZWxlY3QgKiBmcm9t IHRlc3Rfc2VyaWFsaXplJyk7Citkcm9wIHRhYmxlIHRlc3Rfc2VyaWFsaXplOworCistLSBU ZXN0IHRoYXQgX1NFUklBTElaRSBpbnZhbGlkcGFyYW1ldGVyXyBpcyBub3QgYWNjZXB0ZWQg YXMgYSBwYXJhbWV0ZXIgdG8gZXhwbGFpbgorY3JlYXRlIHRhYmxlIHRlc3Rfc2VyaWFsaXpl KGlkIGJpZ3NlcmlhbCwgdmFsIHRleHQpOworc2VsZWN0IGV4cGxhaW5fZmlsdGVyKCdleHBs YWluIChhbmFseXplLHNlcmlhbGl6ZSBpbnZhbGlkcGFyYW1ldGVyKSBzZWxlY3QgKiBmcm9t IHRlc3Rfc2VyaWFsaXplJyk7Citkcm9wIHRhYmxlIHRlc3Rfc2VyaWFsaXplOworCistLSBU ZXN0IFNFUklBTElaRSBpcyBfbm90XyBhY2NlcHRlZCBhcyBhIHBhcmFtZXRlciB0byBleHBs YWluIHVubGVzcyBBTkFMWVpFIGlzIHNwZWNpZmllZAorY3JlYXRlIHRhYmxlIHRlc3Rfc2Vy aWFsaXplKGlkIGJpZ3NlcmlhbCwgdmFsIHRleHQpOworc2VsZWN0IGV4cGxhaW5fZmlsdGVy KCdleHBsYWluIChzZXJpYWxpemUpIHNlbGVjdCAqIGZyb20gdGVzdF9zZXJpYWxpemUnKTsK K2Ryb3AgdGFibGUgdGVzdF9zZXJpYWxpemU7CisKKy0tIFRlc3QgU0VSSUFMSVpFQklOQVJZ IGlzIF9ub3RfIGFjY2VwdGVkIGFzIGEgcGFyYW1ldGVyIHRvIGV4cGxhaW4gdW5sZXNzIEFO QUxZWkUgaXMgc3BlY2lmaWVkCitjcmVhdGUgdGFibGUgdGVzdF9zZXJpYWxpemUoaWQgYmln c2VyaWFsLCB2YWwgdGV4dCk7CitzZWxlY3QgZXhwbGFpbl9maWx0ZXIoJ2V4cGxhaW4gKHNl cmlhbGl6ZSBiaW5hcnkpIHNlbGVjdCAqIGZyb20gdGVzdF9zZXJpYWxpemUnKTsKK2Ryb3Ag dGFibGUgdGVzdF9zZXJpYWxpemU7Cg== --------------hz2wbE00Ke6TFJbCSfWyr5CN--