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 1qg1vL-00EBog-Rq for pgsql-hackers@arkaria.postgresql.org; Tue, 12 Sep 2023 11:51:22 +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 1qg1tR-007xlg-Ee for pgsql-hackers@arkaria.postgresql.org; Tue, 12 Sep 2023 11:49:21 +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 1qg1tQ-007xlQ-PT for pgsql-hackers@lists.postgresql.org; Tue, 12 Sep 2023 11:49:20 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1qg1tG-004dzp-Qc for pgsql-hackers@lists.postgresql.org; Tue, 12 Sep 2023 11:49:19 +0000 Received: from [10.10.20.89] (unknown [118.174.205.78]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) (Authenticated sender: a.lepikhov@postgrespro.ru) by mail.postgrespro.ru (Postfix/587) with ESMTPSA id 1B5D6E20E67; Tue, 12 Sep 2023 14:49:07 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1694519349; bh=GikVrAm9+yglpXEw3+MBdswOtsn+nc3fwdbI9buFVaw=; h=Message-ID:Date:User-Agent:Subject:From:To:Cc:References: In-Reply-To:From; b=bnsGt2okPsJUUdvUNsVgo85bzrkHWLccmtgU9X6sBk2UChcrc0IpJPvMU+lWgSK1V V4LWuQfAOGAdK8WNjoGI6M1hvC1T/GlMODGeA3JuwcbcYyfwwrU1C8W5SgXrNl2OG3 0wqqKIY89eVmsMo/Mq4KP8ybTjkirlQtokP8TMHkKrGkzCaJaVkrJU4AtxkkRA5uaC D4i7SHLH6cfcgeFnHmjsI6RPoXSkp6/JQl/9ItiXAmaOKU/UY94nTbiGwnygVDQDRp hFfzb0YxwtamB6wHvLzcEYcvTGeq2uwhsaSIET/f5Al0Z3zHkugQXBXGR2/QmEKx6s Foymz9M3hwjqQ== Content-Type: multipart/mixed; boundary="------------0wQakMQhi2gF5j09Y3uEAH9p" Message-ID: <05469e80-454b-41d7-d04f-421f42bbd4a9@postgrespro.ru> Date: Tue, 12 Sep 2023 18:49:05 +0700 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.15.0 Subject: Re: Removing unneeded self joins From: Andrey Lepikhov To: "Gregory Stark (as CFM)" , =?UTF-8?Q?Micha=c5=82_K=c5=82eczek?= Cc: PostgreSQL Hackers References: <64486b0b-0404-e39e-322d-0801154901f3@postgrespro.ru> <13021914.uLZWGnKmhe@aivenronan> <2375492.jE0xQCEvom@aivenronan> <0fd15c10-eaa5-51bd-b5c7-e635fe03a94d@postgrespro.ru> <20221206184643.zya44h5auv6f45zp@awork3.anarazel.de> <36579124-f9d9-a51e-38b3-af3511921c7e@postgrespro.ru> <88079CBD-B5BB-4C61-A68B-A8C67599E1C7@kleczek.org> Content-Language: en-US Organization: Postgres Professional In-Reply-To: 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. --------------0wQakMQhi2gF5j09Y3uEAH9p Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 5/7/2023 21:28, Andrey Lepikhov wrote: > Hi, > > During the significant code revision in v.41 I lost some replacement > operations. Here is the fix and extra tests to check this in the future. > Also, Tom added the JoinDomain structure five months ago, and I added > code to replace relids for that place too. > One more thing, I found out that we didn't replace SJs, defined by > baserestrictinfos if no one self-join clause have existed for the join. > Now, it is fixed, and the test has been added. > To understand changes readily, see the delta file in the attachment. Here is new patch in attachment. Rebased on current master and some minor gaffes are fixed. -- regards, Andrey Lepikhov Postgres Professional --------------0wQakMQhi2gF5j09Y3uEAH9p Content-Type: text/plain; charset=UTF-8; name="v43-0001-Remove-self-joins.patch" Content-Disposition: attachment; filename="v43-0001-Remove-self-joins.patch" Content-Transfer-Encoding: base64 RnJvbSA3MGJiNWNmM2QxMWIyNzk3ZjFhOWM3YjA0NzQwNDM1MTM1MjI5ZDI5IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmV5IFYuIExlcGlraG92IiA8YS5sZXBpa2hv dkBwb3N0Z3Jlc3Byby5ydT4KRGF0ZTogVHVlLCAxMiBTZXAgMjAyMyAxODoyNTo1MSArMDcw MApTdWJqZWN0OiBbUEFUQ0hdIFJlbW92ZSBzZWxmLWpvaW5zLgoKU2VsZiBKb2luIEVsaW1p bmF0aW9uIChTSkUpIGZlYXR1cmUgcmVtb3ZlcyBhbiBpbm5lciBqb2luIG9mIGEgcGxhaW4g dGFibGUgdG8KaXRzZWxmIGluIHRoZSBxdWVyeSB0cmVlIGlmIGlzIHByb3ZlZCB0aGF0IHRo ZSBqb2luIGNhbiBiZSByZXBsYWNlZCB3aXRoCmEgc2NhbiB3aXRob3V0IGltcGFjdCB0byB0 aGUgcXVlcnkgcmVzdWx0LgpTZWxmIGpvaW4gYW5kIGlubmVyIHJlbGF0aW9uIGFyZSByZXBs YWNlZCB3aXRoIHRoZSBvdXRlciBpbiBxdWVyeSwgZXF1aXZhbGVuY2UKY2xhc3NlcyBhbmQg cGxhbm5lciBpbmZvIHN0cnVjdHVyZXMuIEFsc28sIGlubmVyIHJlc3RyaWN0bGlzdCBtb3Zl cyB0byB0aGUKb3V0ZXIgb25lIHdpdGggcmVtb3ZpbmcgZHVwbGljYXRlZCBjbGF1c2VzLiBU aHVzLCB0aGlzIG9wdGltaXphdGlvbiByZWR1Y2VzCmxlbmd0aCBvZiByYW5nZSB0YWJsZSBs aXN0IChlc3BlY2lhbGx5IGl0IG1ha2Ugc2Vuc2UgZm9yIHBhcnRpdGlvbmVkIHJlbGF0aW9u cyksCnJlZHVjZXMgbnVtYmVyIG9mIHJlc3RyaWN0aW9uIGNsYXVzZXMgPT09IHNlbGVjdGl2 aXR5IGVzdGltYXRpb25zIGFuZApwb3RlbnRpYWxseSBjYW4gaW1wcm92ZSB0b3RhbCBwbGFu bmVyIHByZWRpY3Rpb24gZm9yIHRoZSBxdWVyeS4KClRoZSBTSkUgcHJvb2YgYmFzZWQgb24g aW5uZXJyZWxfaXNfdW5pcXVlIG1hY2hpbmVyeS4KCldlIGNhbiByZW1vdmUgYSBzZWxmLWpv aW4gd2hlbiBmb3IgZWFjaCBvdXRlciByb3c6CjEuIEF0IG1vc3Qgb25lIGlubmVyIHJvdyBt YXRjaGVzIHRoZSBqb2luIGNsYXVzZS4KMi4gRWFjaCBtYXRjaGVkIGlubmVyIHJvdyBtdXN0 IGJlIChwaHlzaWNhbGx5KSB0aGUgc2FtZSByb3cgYXMgdGhlIG91dGVyIG9uZS4KCkluIHRo aXMgcGF0Y2ggd2UgdXNlIHRoZSBuZXh0IGFwcHJvYWNoIHRvIGlkZW50aWZ5IGEgc2VsZi1q b2luOgoxLiBDb2xsZWN0IGFsbCBtZXJnZWpvaW5hYmxlIGpvaW4gcXVhbHMgd2hpY2ggbG9v ayBsaWtlIGEueCA9IGIueAoyLiBBZGQgdG8gdGhlIGxpc3QgYWJvdmUgYmFzZXJldHJpY3Rp bmZvIG9mIGlubmVyIHRhYmxlLgozLiBDaGVjayBpbm5lcnJlbF9pc191bmlxdWUoKSBmb3Ig dGhlIHF1YWwgbGlzdC4gSWYgaXQgcmV0dXJucyBmYWxzZSwgc2tpcCB0aGlzCnBhaXIgb2Yg am9pbmluZyB0YWJsZXMuCjQuIENoZWNrIHVuaXF1ZW5lc3MsIHByb3ZlZCBieSB0aGUgYmFz ZXJlc3RyaWN0aW5mbyBjbGF1c2VzLiBUbyBwcm92ZSBwb3NzaWJpbGl0eQpvZiB0aGUgc2Vs Zi1qb2luIGVsaW1pbmF0aW9uIGlubmVyIGFuZCBvdXRlciBjbGF1c2VzIG11c3QgaGF2ZSBl eGFjdCBtYXRjaC4KClJlbGF0aW9uIHJlcGxhY2VtZW50IHByb2NlZHVyZSBpcyBub3QgdHJp dmlhbCBhbmQgaXQgaXMgcGFydGx5IGNvbWJpbmVkIHdpdGggdGhlIG9uZSwKdXNlZCB0byBy ZW1vdmUgdXNlbGVzcyBsZWZ0IGpvaW5zLgoKVGVzdHMsIGNvdmVyaW5nIHRoaXMgZmVhdHVy ZSwgYWRkZWQgdG8gdGhlIGpvaW4uc3FsLgpTb21lIHJlZ3Jlc3Npb24gdGVzdHMgY2hhbmdl ZCBkdWUgdG8gc2VsZi1qb2luIHJlbW92YWwgbG9naWMuCi0tLQogZG9jL3NyYy9zZ21sL2Nv bmZpZy5zZ21sICAgICAgICAgICAgICAgICAgICAgIHwgICAxNiArCiBzcmMvYmFja2VuZC9v cHRpbWl6ZXIvcGF0aC9pbmR4cGF0aC5jICAgICAgICAgfCAgIDM4ICsKIHNyYy9iYWNrZW5k L29wdGltaXplci9wbGFuL2FuYWx5emVqb2lucy5jICAgICB8IDEwOTQgKysrKysrKysrKysr KysrKy0KIHNyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3BsYW5tYWluLmMgICAgICAgICB8 ICAgIDUgKwogc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWNfdGFibGVzLmMgICAgICAgICAg IHwgICAyMiArCiBzcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aHMuaCAgICAgICAgICAgICAg ICAgfCAgICAzICsKIHNyYy9pbmNsdWRlL29wdGltaXplci9wbGFubWFpbi5oICAgICAgICAg ICAgICB8ICAgIDcgKwogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9lcXVpdmNsYXNzLm91 dCAgICAgIHwgICAzMiArCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0ICAg ICAgICAgICAgfCAgODI0ICsrKysrKysrKysrKy0KIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvc3lzdmlld3Mub3V0ICAgICAgICB8ICAgIDMgKy0KIHNyYy90ZXN0L3JlZ3Jlc3MvZXhw ZWN0ZWQvdXBkYXRhYmxlX3ZpZXdzLm91dCB8ICAgMTcgKy0KIHNyYy90ZXN0L3JlZ3Jlc3Mv c3FsL2VxdWl2Y2xhc3Muc3FsICAgICAgICAgICB8ICAgMTYgKwogc3JjL3Rlc3QvcmVncmVz cy9zcWwvam9pbi5zcWwgICAgICAgICAgICAgICAgIHwgIDM2MCArKysrKysKIHNyYy90b29s cy9wZ2luZGVudC90eXBlZGVmcy5saXN0ICAgICAgICAgICAgICB8ICAgIDIgKwogMTQgZmls ZXMgY2hhbmdlZCwgMjM3NSBpbnNlcnRpb25zKCspLCA2NCBkZWxldGlvbnMoLSkKCmRpZmYg LS1naXQgYS9kb2Mvc3JjL3NnbWwvY29uZmlnLnNnbWwgYi9kb2Mvc3JjL3NnbWwvY29uZmln LnNnbWwKaW5kZXggNmJjMWIyMTVkYi4uNDNjMDdiMGQzYiAxMDA2NDQKLS0tIGEvZG9jL3Ny Yy9zZ21sL2NvbmZpZy5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9jb25maWcuc2dtbApAQCAt NTI5OSw2ICs1Mjk5LDIyIEBAIEFOWSA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+ bnVtX3N5bmM8L3JlcGxhY2VhYmxlPiAoIDxyZXBsYWNlYWJsZSBjbGFzcz0iCiAgICAgICA8 L2xpc3RpdGVtPgogICAgICA8L3Zhcmxpc3RlbnRyeT4KIAorICAgICA8dmFybGlzdGVudHJ5 IGlkPSJndWMtZW5hYmxlX3NlbGZfam9pbl9yZW1vdmFsIiB4cmVmbGFiZWw9ImVuYWJsZV9z ZWxmX2pvaW5fcmVtb3ZhbCI+CisgICAgICA8dGVybT48dmFybmFtZT5lbmFibGVfc2VsZl9q b2luX3JlbW92YWw8L3Zhcm5hbWU+ICg8dHlwZT5ib29sZWFuPC90eXBlPikKKyAgICAgIDxp bmRleHRlcm0+CisgICAgICAgPHByaW1hcnk+PHZhcm5hbWU+ZW5hYmxlX3NlbGZfam9pbl9y ZW1vdmFsPC92YXJuYW1lPiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcjwvcHJpbWFyeT4KKyAg ICAgIDwvaW5kZXh0ZXJtPgorICAgICAgPC90ZXJtPgorICAgICAgPGxpc3RpdGVtPgorICAg ICAgIDxwYXJhPgorICAgICAgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHF1ZXJ5IHBsYW5u ZXIncyBvcHRpbWl6YXRpb24gd2hpY2ggYW5hbHlzZXMKKyAgICAgICAgcXVlcnkgdHJlZSBh bmQgcmVwbGFjZXMgc2VsZiBqb2lucyB3aXRoIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHNp bmdsZQorICAgICAgICBzY2Fucy4gVGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gb25seSBwbGFp biB0YWJsZXMuCisgICAgICAgIFRoZSBkZWZhdWx0IGlzIDxsaXRlcmFsPm9uPC9saXRlcmFs Pi4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L2xpc3RpdGVtPgorICAgICA8L3Zhcmxpc3Rl bnRyeT4KKwogICAgICA8dmFybGlzdGVudHJ5IGlkPSJndWMtZW5hYmxlLXNlcXNjYW4iIHhy ZWZsYWJlbD0iZW5hYmxlX3NlcXNjYW4iPgogICAgICAgPHRlcm0+PHZhcm5hbWU+ZW5hYmxl X3NlcXNjYW48L3Zhcm5hbWU+ICg8dHlwZT5ib29sZWFuPC90eXBlPikKICAgICAgIDxpbmRl eHRlcm0+CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4cGF0 aC5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYwppbmRleCA2YTkz ZDc2N2E1Li41MDgyODVkMWVmIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIv cGF0aC9pbmR4cGF0aC5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2luZHhw YXRoLmMKQEAgLTM0OTQsNiArMzQ5NCwyMSBAQCBib29sCiByZWxhdGlvbl9oYXNfdW5pcXVl X2luZGV4X2ZvcihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCQkJCQkJ CSAgTGlzdCAqcmVzdHJpY3RsaXN0LAogCQkJCQkJCSAgTGlzdCAqZXhwcmxpc3QsIExpc3Qg Km9wcmxpc3QpCit7CisJcmV0dXJuIHJlbGF0aW9uX2hhc191bmlxdWVfaW5kZXhfZXh0KHJv b3QsIHJlbCwgcmVzdHJpY3RsaXN0LAorCQkJCQkJCQkJCSBleHBybGlzdCwgb3BybGlzdCwg TlVMTCk7Cit9CisKKy8qCisgKiByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2V4dAorICog aWYgZXh0cmFfY2xhdXNlcyBpc24ndCBOVUxMLCByZXR1cm4gYmFzZXJlc3RyaWN0aW5mbyBj bGF1c2VzIHdoaWNoIHdlcmUKKyAqIHVzZWQgdG8gZGVyaXZlIHVuaXF1ZW5lc3MuCisgKi8K K2Jvb2wKK3JlbGF0aW9uX2hhc191bmlxdWVfaW5kZXhfZXh0KFBsYW5uZXJJbmZvICpyb290 LCBSZWxPcHRJbmZvICpyZWwsCisJCQkJCQkJICBMaXN0ICpyZXN0cmljdGxpc3QsCisJCQkJ CQkJICBMaXN0ICpleHBybGlzdCwgTGlzdCAqb3BybGlzdCwKKwkJCQkJCQkgIExpc3QgKipl eHRyYV9jbGF1c2VzKQogewogCUxpc3RDZWxsICAgKmljOwogCkBAIC0zNTQ5LDYgKzM1NjQs NyBAQCByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2ZvcihQbGFubmVySW5mbyAqcm9vdCwg UmVsT3B0SW5mbyAqcmVsLAogCXsKIAkJSW5kZXhPcHRJbmZvICppbmQgPSAoSW5kZXhPcHRJ bmZvICopIGxmaXJzdChpYyk7CiAJCWludAkJCWM7CisJCUxpc3QJICAgKmV4cHJzID0gTklM OwogCiAJCS8qCiAJCSAqIElmIHRoZSBpbmRleCBpcyBub3QgdW5pcXVlLCBvciBub3QgaW1t ZWRpYXRlbHkgZW5mb3JjZWQsIG9yIGlmIGl0J3MKQEAgLTM2MDAsNiArMzYxNiwyNCBAQCBy ZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2ZvcihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0 SW5mbyAqcmVsLAogCQkJCWlmIChtYXRjaF9pbmRleF90b19vcGVyYW5kKHJleHByLCBjLCBp bmQpKQogCQkJCXsKIAkJCQkJbWF0Y2hlZCA9IHRydWU7IC8qIGNvbHVtbiBpcyB1bmlxdWUg Ki8KKworCQkJCQlpZiAoYm1zX21lbWJlcnNoaXAocmluZm8tPmNsYXVzZV9yZWxpZHMpID09 IEJNU19TSU5HTEVUT04pCisJCQkJCXsKKwkJCQkJCU1lbW9yeUNvbnRleHQgb2xkTWVtQ3R4 ID0KKwkJCQkJCQkJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhyb290LT5wbGFubmVyX2N4dCk7 CisKKwkJCQkJCS8qCisJCQkJCQkgKiBBZGQgZmlsdGVyIGNsYXVzZSBpbnRvIGEgbGlzdCBh bGxvd2luZyBjYWxsZXIgdG8KKwkJCQkJCSAqIGtub3cgaWYgdW5pcXVpbmVzcyBoYXZlIG1h ZGUgbm90IG9ubHkgYnkgam9pbgorCQkJCQkJICogY2xhdXNlcy4KKwkJCQkJCSAqLworCQkJ CQkJQXNzZXJ0KGJtc19pc19lbXB0eShyaW5mby0+bGVmdF9yZWxpZHMpIHx8CisJCQkJCQkJ ICAgYm1zX2lzX2VtcHR5KHJpbmZvLT5yaWdodF9yZWxpZHMpKTsKKwkJCQkJCWlmIChleHRy YV9jbGF1c2VzKQorCQkJCQkJCWV4cHJzID0gbGFwcGVuZChleHBycywgcmluZm8pOworCQkJ CQkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZE1lbUN0eCk7CisJCQkJCX0KKwogCQkJCQli cmVhazsKIAkJCQl9CiAJCQl9CkBAIC0zNjQyLDcgKzM2NzYsMTEgQEAgcmVsYXRpb25faGFz X3VuaXF1ZV9pbmRleF9mb3IoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwK IAogCQkvKiBNYXRjaGVkIGFsbCBrZXkgY29sdW1ucyBvZiB0aGlzIGluZGV4PyAqLwogCQlp ZiAoYyA9PSBpbmQtPm5rZXljb2x1bW5zKQorCQl7CisJCQlpZiAoZXh0cmFfY2xhdXNlcykK KwkJCQkqZXh0cmFfY2xhdXNlcyA9IGV4cHJzOwogCQkJcmV0dXJuIHRydWU7CisJCX0KIAl9 CiAKIAlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIv cGxhbi9hbmFseXplam9pbnMuYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2FuYWx5 emVqb2lucy5jCmluZGV4IDVmM2NjZTg3M2EuLmUwOTk1MWYzMmIgMTAwNjQ0Ci0tLSBhL3Ny Yy9iYWNrZW5kL29wdGltaXplci9wbGFuL2FuYWx5emVqb2lucy5jCisrKyBiL3NyYy9iYWNr ZW5kL29wdGltaXplci9wbGFuL2FuYWx5emVqb2lucy5jCkBAIC0yMiw2ICsyMiw4IEBACiAg Ki8KICNpbmNsdWRlICJwb3N0Z3Jlcy5oIgogCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19jbGFz cy5oIgorI2luY2x1ZGUgIm5vZGVzL21ha2VmdW5jcy5oIgogI2luY2x1ZGUgIm5vZGVzL25v ZGVGdW5jcy5oIgogI2luY2x1ZGUgIm9wdGltaXplci9jbGF1c2VzLmgiCiAjaW5jbHVkZSAi b3B0aW1pemVyL2pvaW5pbmZvLmgiCkBAIC0zMywxMCArMzUsMjcgQEAKICNpbmNsdWRlICJv cHRpbWl6ZXIvdGxpc3QuaCIKICNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKIAorLyoK KyAqIFVuaXF1ZVJlbEluZm8gY2FjaGVzIGEgZmFjdCB0aGF0IGEgcmVsYXRpb24gaXMgdW5p cXVlIHdoZW4gYmVpbmcgam9pbmVkCisgKiB0byBvdGhlciByZWxhdGlvbihzKSBzcGVjaWZp ZWQgYnkgb3V0ZXJyZWxpZHMuCisgKiBleHRyYV9jbGF1c2VzIGNvbnRhaW5zIGFkZGl0aW9u YWwgY2xhdXNlcyBmcm9tIGEgYmFzZXJlc3RyaWN0aW5mbyBsaXN0IHRoYXQKKyAqIHdlcmUg dXNlZCB0byBwcm92ZSB1bmlxdWVuZXNzLiBXZSBjYWNoZSBpdCBmb3IgU0ogY2hlY2tpbmcg cHJvY2VkdXJlOiBTSiBjYW4KKyAqIGJlIHJlbW92ZWQgaWYgb3V0ZXIgcmVsYXRpb24gY29u dGFpbnMgc3RyaWN0bHkgdGhlIHNhbWUgc2V0IG9mIGNsYXVzZXMuCisgKi8KK3R5cGVkZWYg c3RydWN0IFVuaXF1ZVJlbEluZm8KK3sKKwlSZWxpZHMJCW91dGVycmVsaWRzOworCUxpc3QJ ICAgKmV4dHJhX2NsYXVzZXM7Cit9IFVuaXF1ZVJlbEluZm87CisKK2Jvb2wJCWVuYWJsZV9z ZWxmX2pvaW5fcmVtb3ZhbDsKK2ludAkJCXNlbGZfam9pbl9zZWFyY2hfbGltaXQ7CisKIC8q IGxvY2FsIGZ1bmN0aW9ucyAqLwogc3RhdGljIGJvb2wgam9pbl9pc19yZW1vdmFibGUoUGxh bm5lckluZm8gKnJvb3QsIFNwZWNpYWxKb2luSW5mbyAqc2ppbmZvKTsKLXN0YXRpYyB2b2lk IHJlbW92ZV9yZWxfZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLAot CQkJCQkJCQkgIFNwZWNpYWxKb2luSW5mbyAqc2ppbmZvKTsKKworc3RhdGljIHZvaWQgcmVt b3ZlX2xlZnRqb2lucmVsX2Zyb21fcXVlcnkoUGxhbm5lckluZm8gKnJvb3QsIGludCByZWxp ZCwKKwkJCQkJCQkJCQkgIFNwZWNpYWxKb2luSW5mbyAqc2ppbmZvKTsKIHN0YXRpYyB2b2lk IHJlbW92ZV9yZWxfZnJvbV9yZXN0cmljdGluZm8oUmVzdHJpY3RJbmZvICpyaW5mbywKIAkJ CQkJCQkJCQkgaW50IHJlbGlkLCBpbnQgb2pyZWxpZCk7CiBzdGF0aWMgdm9pZCByZW1vdmVf cmVsX2Zyb21fZWNsYXNzKEVxdWl2YWxlbmNlQ2xhc3MgKmVjLApAQCAtNDQsMTQgKzYzLDE3 IEBAIHN0YXRpYyB2b2lkIHJlbW92ZV9yZWxfZnJvbV9lY2xhc3MoRXF1aXZhbGVuY2VDbGFz cyAqZWMsCiBzdGF0aWMgTGlzdCAqcmVtb3ZlX3JlbF9mcm9tX2pvaW5saXN0KExpc3QgKmpv aW5saXN0LCBpbnQgcmVsaWQsIGludCAqbnJlbW92ZWQpOwogc3RhdGljIGJvb2wgcmVsX3N1 cHBvcnRzX2Rpc3RpbmN0bmVzcyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVs KTsKIHN0YXRpYyBib29sIHJlbF9pc19kaXN0aW5jdF9mb3IoUGxhbm5lckluZm8gKnJvb3Qs IFJlbE9wdEluZm8gKnJlbCwKLQkJCQkJCQkJTGlzdCAqY2xhdXNlX2xpc3QpOworCQkJCQkJ CQlMaXN0ICpjbGF1c2VfbGlzdCwgTGlzdCAqKmV4dHJhX2NsYXVzZXMpOwogc3RhdGljIE9p ZAlkaXN0aW5jdF9jb2xfc2VhcmNoKGludCBjb2xubywgTGlzdCAqY29sbm9zLCBMaXN0ICpv cGlkcyk7CiBzdGF0aWMgYm9vbCBpc19pbm5lcnJlbF91bmlxdWVfZm9yKFBsYW5uZXJJbmZv ICpyb290LAogCQkJCQkJCQkgICBSZWxpZHMgam9pbnJlbGlkcywKIAkJCQkJCQkJICAgUmVs aWRzIG91dGVycmVsaWRzLAogCQkJCQkJCQkgICBSZWxPcHRJbmZvICppbm5lcnJlbCwKIAkJ CQkJCQkJICAgSm9pblR5cGUgam9pbnR5cGUsCi0JCQkJCQkJCSAgIExpc3QgKnJlc3RyaWN0 bGlzdCk7CisJCQkJCQkJCSAgIExpc3QgKnJlc3RyaWN0bGlzdCwKKwkJCQkJCQkJICAgTGlz dCAqKmV4dHJhX2NsYXVzZXMpOworc3RhdGljIEJpdG1hcHNldCAqcmVwbGFjZV9yZWxpZChS ZWxpZHMgcmVsaWRzLCBpbnQgb2xkSWQsIGludCBuZXdJZCk7CitzdGF0aWMgdm9pZCByZXBs YWNlX3Zhcm5vKE5vZGUgKm5vZGUsIGludCBmcm9tLCBpbnQgdG8pOwogCiAKIC8qCkBAIC04 OSw3ICsxMTEsNyBAQCByZXN0YXJ0OgogCQkgKi8KIAkJaW5uZXJyZWxpZCA9IGJtc19zaW5n bGV0b25fbWVtYmVyKHNqaW5mby0+bWluX3JpZ2h0aGFuZCk7CiAKLQkJcmVtb3ZlX3JlbF9m cm9tX3F1ZXJ5KHJvb3QsIGlubmVycmVsaWQsIHNqaW5mbyk7CisJCXJlbW92ZV9sZWZ0am9p bnJlbF9mcm9tX3F1ZXJ5KHJvb3QsIGlubmVycmVsaWQsIHNqaW5mbyk7CiAKIAkJLyogV2Ug dmVyaWZ5IHRoYXQgZXhhY3RseSBvbmUgcmVmZXJlbmNlIGdldHMgcmVtb3ZlZCBmcm9tIGpv aW5saXN0ICovCiAJCW5yZW1vdmVkID0gMDsKQEAgLTMwOCw3ICszMzAsNyBAQCBqb2luX2lz X3JlbW92YWJsZShQbGFubmVySW5mbyAqcm9vdCwgU3BlY2lhbEpvaW5JbmZvICpzamluZm8p CiAJICogTm93IHRoYXQgd2UgaGF2ZSB0aGUgcmVsZXZhbnQgZXF1YWxpdHkgam9pbiBjbGF1 c2VzLCB0cnkgdG8gcHJvdmUgdGhlCiAJICogaW5uZXJyZWwgZGlzdGluY3QuCiAJICovCi0J aWYgKHJlbF9pc19kaXN0aW5jdF9mb3Iocm9vdCwgaW5uZXJyZWwsIGNsYXVzZV9saXN0KSkK KwlpZiAocmVsX2lzX2Rpc3RpbmN0X2Zvcihyb290LCBpbm5lcnJlbCwgY2xhdXNlX2xpc3Qs IE5VTEwpKQogCQlyZXR1cm4gdHJ1ZTsKIAogCS8qCkBAIC0zMjgsMjEgKzM1MCwxNSBAQCBq b2luX2lzX3JlbW92YWJsZShQbGFubmVySW5mbyAqcm9vdCwgU3BlY2lhbEpvaW5JbmZvICpz amluZm8pCiAgKiB0aGUgcGxhbm5lcidzIGRhdGEgc3RydWN0dXJlcyB0aGF0IHdpbGwgYWN0 dWFsbHkgYmUgY29uc3VsdGVkIGxhdGVyLgogICovCiBzdGF0aWMgdm9pZAotcmVtb3ZlX3Jl bF9mcm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQsIFNwZWNpYWxKb2lu SW5mbyAqc2ppbmZvKQorcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5X2NvbW1vbihQbGFubmVySW5m byAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAorCQkJCQkJCSBpbnQgc3Vic3QsIFNwZWNpYWxK b2luSW5mbyAqc2ppbmZvLAorCQkJCQkJCSBSZWxpZHMgam9pbnJlbGlkcykKIHsKLQlSZWxP cHRJbmZvICpyZWwgPSBmaW5kX2Jhc2VfcmVsKHJvb3QsIHJlbGlkKTsKLQlpbnQJCQlvanJl bGlkID0gc2ppbmZvLT5vanJlbGlkOwotCVJlbGlkcwkJam9pbnJlbGlkczsKLQlSZWxpZHMJ CWpvaW5fcGx1c19jb21tdXRlOwotCUxpc3QJICAgKmpvaW5pbmZvczsKKwlpbnQJCQlyZWxp ZCA9IHJlbC0+cmVsaWQ7CisJaW50CQkJb2pyZWxpZCA9IChzamluZm8gIT0gTlVMTCkgPyBz amluZm8tPm9qcmVsaWQgOiAtMTsKIAlJbmRleAkJcnRpOwogCUxpc3RDZWxsICAgKmw7CiAK LQkvKiBDb21wdXRlIHRoZSByZWxpZCBzZXQgZm9yIHRoZSBqb2luIHdlIGFyZSBjb25zaWRl cmluZyAqLwotCWpvaW5yZWxpZHMgPSBibXNfdW5pb24oc2ppbmZvLT5taW5fbGVmdGhhbmQs IHNqaW5mby0+bWluX3JpZ2h0aGFuZCk7Ci0JQXNzZXJ0KG9qcmVsaWQgIT0gMCk7Ci0Jam9p bnJlbGlkcyA9IGJtc19hZGRfbWVtYmVyKGpvaW5yZWxpZHMsIG9qcmVsaWQpOwotCiAJLyoK IAkgKiBSZW1vdmUgcmVmZXJlbmNlcyB0byB0aGUgcmVsIGZyb20gb3RoZXIgYmFzZXJlbHMn IGF0dHJfbmVlZGVkIGFycmF5cy4KIAkgKi8KQEAgLTM2NiwxOSArMzgyLDIyIEBAIHJlbW92 ZV9yZWxfZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLCBTcGVjaWFs Sm9pbkluZm8gKnNqaW5mbykKIAkJCSBhdHRyb2ZmLS0pCiAJCXsKIAkJCW90aGVycmVsLT5h dHRyX25lZWRlZFthdHRyb2ZmXSA9Ci0JCQkJYm1zX2RlbF9tZW1iZXIob3RoZXJyZWwtPmF0 dHJfbmVlZGVkW2F0dHJvZmZdLCByZWxpZCk7CisJCQkJcmVwbGFjZV9yZWxpZChvdGhlcnJl bC0+YXR0cl9uZWVkZWRbYXR0cm9mZl0sIHJlbGlkLCBzdWJzdCk7CiAJCQlvdGhlcnJlbC0+ YXR0cl9uZWVkZWRbYXR0cm9mZl0gPQotCQkJCWJtc19kZWxfbWVtYmVyKG90aGVycmVsLT5h dHRyX25lZWRlZFthdHRyb2ZmXSwgb2pyZWxpZCk7CisJCQkJcmVwbGFjZV9yZWxpZChvdGhl cnJlbC0+YXR0cl9uZWVkZWRbYXR0cm9mZl0sIG9qcmVsaWQsIHN1YnN0KTsKIAkJfQorCisJ CS8qIFVwZGF0ZSBsYXRlcmFsIHJlZmVyZW5jZXMuICovCisJCXJlcGxhY2VfdmFybm8oKE5v ZGUgKikgb3RoZXJyZWwtPmxhdGVyYWxfdmFycywgcmVsaWQsIHN1YnN0KTsKIAl9CiAKIAkv KgogCSAqIFVwZGF0ZSBhbGxfYmFzZXJlbHMgYW5kIHJlbGF0ZWQgcmVsaWQgc2V0cy4KIAkg Ki8KLQlyb290LT5hbGxfYmFzZXJlbHMgPSBibXNfZGVsX21lbWJlcihyb290LT5hbGxfYmFz ZXJlbHMsIHJlbGlkKTsKLQlyb290LT5vdXRlcl9qb2luX3JlbHMgPSBibXNfZGVsX21lbWJl cihyb290LT5vdXRlcl9qb2luX3JlbHMsIG9qcmVsaWQpOwotCXJvb3QtPmFsbF9xdWVyeV9y ZWxzID0gYm1zX2RlbF9tZW1iZXIocm9vdC0+YWxsX3F1ZXJ5X3JlbHMsIHJlbGlkKTsKLQly b290LT5hbGxfcXVlcnlfcmVscyA9IGJtc19kZWxfbWVtYmVyKHJvb3QtPmFsbF9xdWVyeV9y ZWxzLCBvanJlbGlkKTsKKwlyb290LT5hbGxfYmFzZXJlbHMgPSByZXBsYWNlX3JlbGlkKHJv b3QtPmFsbF9iYXNlcmVscywgcmVsaWQsIHN1YnN0KTsKKwlyb290LT5vdXRlcl9qb2luX3Jl bHMgPSByZXBsYWNlX3JlbGlkKHJvb3QtPm91dGVyX2pvaW5fcmVscywgb2pyZWxpZCwgc3Vi c3QpOworCXJvb3QtPmFsbF9xdWVyeV9yZWxzID0gcmVwbGFjZV9yZWxpZChyb290LT5hbGxf cXVlcnlfcmVscywgcmVsaWQsIHN1YnN0KTsKKwlyb290LT5hbGxfcXVlcnlfcmVscyA9IHJl cGxhY2VfcmVsaWQocm9vdC0+YWxsX3F1ZXJ5X3JlbHMsIG9qcmVsaWQsIHN1YnN0KTsKIAog CS8qCiAJICogTGlrZXdpc2UgcmVtb3ZlIHJlZmVyZW5jZXMgZnJvbSBTcGVjaWFsSm9pbklu Zm8gZGF0YSBzdHJ1Y3R1cmVzLgpAQCAtMzkyLDE5ICs0MTEsMjEgQEAgcmVtb3ZlX3JlbF9m cm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQsIFNwZWNpYWxKb2luSW5m byAqc2ppbmZvKQogCXsKIAkJU3BlY2lhbEpvaW5JbmZvICpzamluZiA9IChTcGVjaWFsSm9p bkluZm8gKikgbGZpcnN0KGwpOwogCi0JCXNqaW5mLT5taW5fbGVmdGhhbmQgPSBibXNfZGVs X21lbWJlcihzamluZi0+bWluX2xlZnRoYW5kLCByZWxpZCk7Ci0JCXNqaW5mLT5taW5fcmln aHRoYW5kID0gYm1zX2RlbF9tZW1iZXIoc2ppbmYtPm1pbl9yaWdodGhhbmQsIHJlbGlkKTsK LQkJc2ppbmYtPnN5bl9sZWZ0aGFuZCA9IGJtc19kZWxfbWVtYmVyKHNqaW5mLT5zeW5fbGVm dGhhbmQsIHJlbGlkKTsKLQkJc2ppbmYtPnN5bl9yaWdodGhhbmQgPSBibXNfZGVsX21lbWJl cihzamluZi0+c3luX3JpZ2h0aGFuZCwgcmVsaWQpOwotCQlzamluZi0+bWluX2xlZnRoYW5k ID0gYm1zX2RlbF9tZW1iZXIoc2ppbmYtPm1pbl9sZWZ0aGFuZCwgb2pyZWxpZCk7Ci0JCXNq aW5mLT5taW5fcmlnaHRoYW5kID0gYm1zX2RlbF9tZW1iZXIoc2ppbmYtPm1pbl9yaWdodGhh bmQsIG9qcmVsaWQpOwotCQlzamluZi0+c3luX2xlZnRoYW5kID0gYm1zX2RlbF9tZW1iZXIo c2ppbmYtPnN5bl9sZWZ0aGFuZCwgb2pyZWxpZCk7Ci0JCXNqaW5mLT5zeW5fcmlnaHRoYW5k ID0gYm1zX2RlbF9tZW1iZXIoc2ppbmYtPnN5bl9yaWdodGhhbmQsIG9qcmVsaWQpOworCQlz amluZi0+bWluX2xlZnRoYW5kID0gcmVwbGFjZV9yZWxpZChzamluZi0+bWluX2xlZnRoYW5k LCByZWxpZCwgc3Vic3QpOworCQlzamluZi0+bWluX3JpZ2h0aGFuZCA9IHJlcGxhY2VfcmVs aWQoc2ppbmYtPm1pbl9yaWdodGhhbmQsIHJlbGlkLCBzdWJzdCk7CisJCXNqaW5mLT5zeW5f bGVmdGhhbmQgPSByZXBsYWNlX3JlbGlkKHNqaW5mLT5zeW5fbGVmdGhhbmQsIHJlbGlkLCBz dWJzdCk7CisJCXNqaW5mLT5zeW5fcmlnaHRoYW5kID0gcmVwbGFjZV9yZWxpZChzamluZi0+ c3luX3JpZ2h0aGFuZCwgcmVsaWQsIHN1YnN0KTsKKwkJc2ppbmYtPm1pbl9sZWZ0aGFuZCA9 IHJlcGxhY2VfcmVsaWQoc2ppbmYtPm1pbl9sZWZ0aGFuZCwgb2pyZWxpZCwgc3Vic3QpOwor CQlzamluZi0+bWluX3JpZ2h0aGFuZCA9IHJlcGxhY2VfcmVsaWQoc2ppbmYtPm1pbl9yaWdo dGhhbmQsIG9qcmVsaWQsIHN1YnN0KTsKKwkJc2ppbmYtPnN5bl9sZWZ0aGFuZCA9IHJlcGxh Y2VfcmVsaWQoc2ppbmYtPnN5bl9sZWZ0aGFuZCwgb2pyZWxpZCwgc3Vic3QpOworCQlzamlu Zi0+c3luX3JpZ2h0aGFuZCA9IHJlcGxhY2VfcmVsaWQoc2ppbmYtPnN5bl9yaWdodGhhbmQs IG9qcmVsaWQsIHN1YnN0KTsKIAkJLyogcmVsaWQgY2Fubm90IGFwcGVhciBpbiB0aGVzZSBm aWVsZHMsIGJ1dCBvanJlbGlkIGNhbjogKi8KLQkJc2ppbmYtPmNvbW11dGVfYWJvdmVfbCA9 IGJtc19kZWxfbWVtYmVyKHNqaW5mLT5jb21tdXRlX2Fib3ZlX2wsIG9qcmVsaWQpOwotCQlz amluZi0+Y29tbXV0ZV9hYm92ZV9yID0gYm1zX2RlbF9tZW1iZXIoc2ppbmYtPmNvbW11dGVf YWJvdmVfciwgb2pyZWxpZCk7Ci0JCXNqaW5mLT5jb21tdXRlX2JlbG93X2wgPSBibXNfZGVs X21lbWJlcihzamluZi0+Y29tbXV0ZV9iZWxvd19sLCBvanJlbGlkKTsKLQkJc2ppbmYtPmNv bW11dGVfYmVsb3dfciA9IGJtc19kZWxfbWVtYmVyKHNqaW5mLT5jb21tdXRlX2JlbG93X3Is IG9qcmVsaWQpOworCQlzamluZi0+Y29tbXV0ZV9hYm92ZV9sID0gcmVwbGFjZV9yZWxpZChz amluZi0+Y29tbXV0ZV9hYm92ZV9sLCBvanJlbGlkLCBzdWJzdCk7CisJCXNqaW5mLT5jb21t dXRlX2Fib3ZlX3IgPSByZXBsYWNlX3JlbGlkKHNqaW5mLT5jb21tdXRlX2Fib3ZlX3IsIG9q cmVsaWQsIHN1YnN0KTsKKwkJc2ppbmYtPmNvbW11dGVfYmVsb3dfbCA9IHJlcGxhY2VfcmVs aWQoc2ppbmYtPmNvbW11dGVfYmVsb3dfbCwgb2pyZWxpZCwgc3Vic3QpOworCQlzamluZi0+ Y29tbXV0ZV9iZWxvd19yID0gcmVwbGFjZV9yZWxpZChzamluZi0+Y29tbXV0ZV9iZWxvd19y LCBvanJlbGlkLCBzdWJzdCk7CisKKwkJcmVwbGFjZV92YXJubygoTm9kZSAqKSBzamluZi0+ c2VtaV9yaHNfZXhwcnMsIHJlbGlkLCBzdWJzdCk7CiAJfQogCiAJLyoKQEAgLTQzOCwxOCAr NDU5LDM5IEBAIHJlbW92ZV9yZWxfZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50 IHJlbGlkLCBTcGVjaWFsSm9pbkluZm8gKnNqaW5mbykKIAkJewogCQkJUGxhY2VIb2xkZXJW YXIgKnBodiA9IHBoaW5mby0+cGhfdmFyOwogCi0JCQlwaGluZm8tPnBoX2V2YWxfYXQgPSBi bXNfZGVsX21lbWJlcihwaGluZm8tPnBoX2V2YWxfYXQsIHJlbGlkKTsKLQkJCXBoaW5mby0+ cGhfZXZhbF9hdCA9IGJtc19kZWxfbWVtYmVyKHBoaW5mby0+cGhfZXZhbF9hdCwgb2pyZWxp ZCk7CisJCQlwaGluZm8tPnBoX2V2YWxfYXQgPSByZXBsYWNlX3JlbGlkKHBoaW5mby0+cGhf ZXZhbF9hdCwgcmVsaWQsIHN1YnN0KTsKKwkJCXBoaW5mby0+cGhfZXZhbF9hdCA9IHJlcGxh Y2VfcmVsaWQocGhpbmZvLT5waF9ldmFsX2F0LCBvanJlbGlkLCBzdWJzdCk7CiAJCQlBc3Nl cnQoIWJtc19pc19lbXB0eShwaGluZm8tPnBoX2V2YWxfYXQpKTsJLyogY2hlY2tlZCBwcmV2 aW91c2x5ICovCi0JCQlwaGluZm8tPnBoX25lZWRlZCA9IGJtc19kZWxfbWVtYmVyKHBoaW5m by0+cGhfbmVlZGVkLCByZWxpZCk7Ci0JCQlwaGluZm8tPnBoX25lZWRlZCA9IGJtc19kZWxf bWVtYmVyKHBoaW5mby0+cGhfbmVlZGVkLCBvanJlbGlkKTsKKwkJCXBoaW5mby0+cGhfbmVl ZGVkID0gcmVwbGFjZV9yZWxpZChwaGluZm8tPnBoX25lZWRlZCwgcmVsaWQsIHN1YnN0KTsK KwkJCXBoaW5mby0+cGhfbmVlZGVkID0gcmVwbGFjZV9yZWxpZChwaGluZm8tPnBoX25lZWRl ZCwgb2pyZWxpZCwgc3Vic3QpOwogCQkJLyogcGhfbmVlZGVkIG1pZ2h0IG9yIG1pZ2h0IG5v dCBiZWNvbWUgZW1wdHkgKi8KLQkJCXBodi0+cGhyZWxzID0gYm1zX2RlbF9tZW1iZXIocGh2 LT5waHJlbHMsIHJlbGlkKTsKLQkJCXBodi0+cGhyZWxzID0gYm1zX2RlbF9tZW1iZXIocGh2 LT5waHJlbHMsIG9qcmVsaWQpOworCQkJcGh2LT5waHJlbHMgPSByZXBsYWNlX3JlbGlkKHBo di0+cGhyZWxzLCByZWxpZCwgc3Vic3QpOworCQkJcGh2LT5waHJlbHMgPSByZXBsYWNlX3Jl bGlkKHBodi0+cGhyZWxzLCBvanJlbGlkLCBzdWJzdCk7CisJCQlwaGluZm8tPnBoX2xhdGVy YWwgPSByZXBsYWNlX3JlbGlkKHBoaW5mby0+cGhfbGF0ZXJhbCwgcmVsaWQsIHN1YnN0KTsK KwkJCXBoaW5mby0+cGhfdmFyLT5waHJlbHMgPSByZXBsYWNlX3JlbGlkKHBoaW5mby0+cGhf dmFyLT5waHJlbHMsIHJlbGlkLCBzdWJzdCk7CiAJCQlBc3NlcnQoIWJtc19pc19lbXB0eShw aHYtPnBocmVscykpOwogCQkJQXNzZXJ0KHBodi0+cGhudWxsaW5ncmVscyA9PSBOVUxMKTsg Lyogbm8gbmVlZCB0byBhZGp1c3QgKi8KIAkJfQogCX0KK30KKworc3RhdGljIHZvaWQKK3Jl bW92ZV9sZWZ0am9pbnJlbF9mcm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVs aWQsCisJCQkJCQkJICBTcGVjaWFsSm9pbkluZm8gKnNqaW5mbykKK3sKKwlMaXN0CSAgICpq b2luaW5mb3M7CisJaW50CQkJb2pyZWxpZCA9IHNqaW5mby0+b2pyZWxpZDsKKwlSZWxPcHRJ bmZvICpyZWwgPSBmaW5kX2Jhc2VfcmVsKHJvb3QsIHJlbGlkKTsKKwlSZWxpZHMJCWpvaW5f cGx1c19jb21tdXRlOworCVJlbGlkcwkJam9pbnJlbGlkczsKKwlMaXN0Q2VsbCAgICpsOwor CisJLyogQ29tcHV0ZSB0aGUgcmVsaWQgc2V0IGZvciB0aGUgam9pbiB3ZSBhcmUgY29uc2lk ZXJpbmcgKi8KKwlqb2lucmVsaWRzID0gYm1zX3VuaW9uKHNqaW5mby0+bWluX2xlZnRoYW5k LCBzamluZm8tPm1pbl9yaWdodGhhbmQpOworCUFzc2VydChvanJlbGlkICE9IDApOworCWpv aW5yZWxpZHMgPSBibXNfYWRkX21lbWJlcihqb2lucmVsaWRzLCBvanJlbGlkKTsKKworCXJl bW92ZV9yZWxfZnJvbV9xdWVyeV9jb21tb24ocm9vdCwgcmVsLCAtMSwgc2ppbmZvLCBqb2lu cmVsaWRzKTsKIAogCS8qCiAJICogUmVtb3ZlIGFueSBqb2lucXVhbHMgcmVmZXJlbmNpbmcg dGhlIHJlbCBmcm9tIHRoZSBqb2luaW5mbyBsaXN0cy4KQEAgLTg0NCw5ICs4ODYsMTQgQEAg cmVsX3N1cHBvcnRzX2Rpc3RpbmN0bmVzcyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5m byAqcmVsKQogICogTm90ZSB0aGF0IHRoZSBwYXNzZWQtaW4gY2xhdXNlX2xpc3QgbWF5IGJl IGRlc3RydWN0aXZlbHkgbW9kaWZpZWQhICBUaGlzCiAgKiBpcyBPSyBmb3IgY3VycmVudCB1 c2VzLCBiZWNhdXNlIHRoZSBjbGF1c2VfbGlzdCBpcyBidWlsdCBieSB0aGUgY2FsbGVyIGZv cgogICogdGhlIHNvbGUgcHVycG9zZSBvZiBwYXNzaW5nIHRvIHRoaXMgZnVuY3Rpb24uCisg KgorICogb3V0ZXJfZXhwcnMgY29udGFpbnMgcmlnaHQgc2lkZXMgb2YgYmFzZXJlc3RyaWN0 aW5mbyBjbGF1c2VzIGxvb2tzIGxpa2UKKyAqIHggPSBjb25zdCBpZiBkaXN0aW5jdG5lc3Mg aXMgZGVyaXZlZCBmcm9tIHN1Y2ggY2xhdXNlcywgbm90IGpvaW5pbmZvIGNsYXVzZS4KKyAq IFBhc3MgTlVMTCBmb3IgdGhlIHBhcmFtIHZhbHVlLCBpZiBpdCBpcyBub3QgaW50ZXJlc3Rl ZC4KICAqLwogc3RhdGljIGJvb2wKLXJlbF9pc19kaXN0aW5jdF9mb3IoUGxhbm5lckluZm8g KnJvb3QsIFJlbE9wdEluZm8gKnJlbCwgTGlzdCAqY2xhdXNlX2xpc3QpCityZWxfaXNfZGlz dGluY3RfZm9yKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsIExpc3QgKmNs YXVzZV9saXN0LAorCQkJCQlMaXN0ICoqZXh0cmFfY2xhdXNlcykKIHsKIAkvKgogCSAqIFdl IGNvdWxkIHNraXAgYSBjb3VwbGUgb2YgdGVzdHMgaGVyZSBpZiB3ZSBhc3N1bWUgYWxsIGNh bGxlcnMgY2hlY2tlZApAQCAtODU5LDEwICs5MDYsMTEgQEAgcmVsX2lzX2Rpc3RpbmN0X2Zv cihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLCBMaXN0ICpjbGF1c2VfbGlz dCkKIAl7CiAJCS8qCiAJCSAqIEV4YW1pbmUgdGhlIGluZGV4ZXMgdG8gc2VlIGlmIHdlIGhh dmUgYSBtYXRjaGluZyB1bmlxdWUgaW5kZXguCi0JCSAqIHJlbGF0aW9uX2hhc191bmlxdWVf aW5kZXhfZm9yIGF1dG9tYXRpY2FsbHkgYWRkcyBhbnkgdXNhYmxlCisJCSAqIHJlbGF0aW9u X2hhc191bmlxdWVfaW5kZXhfZXh0IGF1dG9tYXRpY2FsbHkgYWRkcyBhbnkgdXNhYmxlCiAJ CSAqIHJlc3RyaWN0aW9uIGNsYXVzZXMgZm9yIHRoZSByZWwsIHNvIHdlIG5lZWRuJ3QgZG8g dGhhdCBoZXJlLgogCQkgKi8KLQkJaWYgKHJlbGF0aW9uX2hhc191bmlxdWVfaW5kZXhfZm9y KHJvb3QsIHJlbCwgY2xhdXNlX2xpc3QsIE5JTCwgTklMKSkKKwkJaWYgKHJlbGF0aW9uX2hh c191bmlxdWVfaW5kZXhfZXh0KHJvb3QsIHJlbCwgY2xhdXNlX2xpc3QsIE5JTCwgTklMLAor CQkJCQkJCQkJCSAgZXh0cmFfY2xhdXNlcykpCiAJCQlyZXR1cm4gdHJ1ZTsKIAl9CiAJZWxz ZSBpZiAocmVsLT5ydGVraW5kID09IFJURV9TVUJRVUVSWSkKQEAgLTExNzYsOSArMTIyNCwy MSBAQCBpbm5lcnJlbF9pc191bmlxdWUoUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJICAgSm9p blR5cGUgam9pbnR5cGUsCiAJCQkJICAgTGlzdCAqcmVzdHJpY3RsaXN0LAogCQkJCSAgIGJv b2wgZm9yY2VfY2FjaGUpCit7CisJcmV0dXJuIGlubmVycmVsX2lzX3VuaXF1ZV9leHQocm9v dCwgam9pbnJlbGlkcywgb3V0ZXJyZWxpZHMsIGlubmVycmVsLAorCQkJCQkJCQkgIGpvaW50 eXBlLCByZXN0cmljdGxpc3QsIGZvcmNlX2NhY2hlLCBOVUxMKTsKK30KKworYm9vbAoraW5u ZXJyZWxfaXNfdW5pcXVlX2V4dChQbGFubmVySW5mbyAqcm9vdCwgUmVsaWRzIGpvaW5yZWxp ZHMsIFJlbGlkcyBvdXRlcnJlbGlkcywKKwkJCQkJICAgUmVsT3B0SW5mbyAqaW5uZXJyZWws IEpvaW5UeXBlIGpvaW50eXBlLAorCQkJCQkgICBMaXN0ICpyZXN0cmljdGxpc3QsIGJvb2wg Zm9yY2VfY2FjaGUsCisJCQkJCSAgIExpc3QgKipleHRyYV9jbGF1c2VzKQogewogCU1lbW9y eUNvbnRleHQgb2xkX2NvbnRleHQ7CiAJTGlzdENlbGwgICAqbGM7CisJVW5pcXVlUmVsSW5m byAqdW5pcXVlUmVsSW5mbzsKKwlMaXN0CSAgICpvdXRlcl9leHBycyA9IE5JTDsKIAogCS8q IENlcnRhaW5seSBjYW4ndCBwcm92ZSB1bmlxdWVuZXNzIHdoZW4gdGhlcmUgYXJlIG5vIGpv aW5jbGF1c2VzICovCiAJaWYgKHJlc3RyaWN0bGlzdCA9PSBOSUwpCkBAIC0xMjAwLDEwICsx MjYwLDE0IEBAIGlubmVycmVsX2lzX3VuaXF1ZShQbGFubmVySW5mbyAqcm9vdCwKIAkgKi8K IAlmb3JlYWNoKGxjLCBpbm5lcnJlbC0+dW5pcXVlX2Zvcl9yZWxzKQogCXsKLQkJUmVsaWRz CQl1bmlxdWVfZm9yX3JlbHMgPSAoUmVsaWRzKSBsZmlyc3QobGMpOworCQl1bmlxdWVSZWxJ bmZvID0gKFVuaXF1ZVJlbEluZm8gKikgbGZpcnN0KGxjKTsKIAotCQlpZiAoYm1zX2lzX3N1 YnNldCh1bmlxdWVfZm9yX3JlbHMsIG91dGVycmVsaWRzKSkKKwkJaWYgKGJtc19pc19zdWJz ZXQodW5pcXVlUmVsSW5mby0+b3V0ZXJyZWxpZHMsIG91dGVycmVsaWRzKSkKKwkJeworCQkJ aWYgKGV4dHJhX2NsYXVzZXMpCisJCQkJKmV4dHJhX2NsYXVzZXMgPSB1bmlxdWVSZWxJbmZv LT5leHRyYV9jbGF1c2VzOwogCQkJcmV0dXJuIHRydWU7CQkvKiBTdWNjZXNzISAqLworCQl9 CiAJfQogCiAJLyoKQEAgLTEyMjAsNyArMTI4NCw3IEBAIGlubmVycmVsX2lzX3VuaXF1ZShQ bGFubmVySW5mbyAqcm9vdCwKIAogCS8qIE5vIGNhY2hlZCBpbmZvcm1hdGlvbiwgc28gdHJ5 IHRvIG1ha2UgdGhlIHByb29mLiAqLwogCWlmIChpc19pbm5lcnJlbF91bmlxdWVfZm9yKHJv b3QsIGpvaW5yZWxpZHMsIG91dGVycmVsaWRzLCBpbm5lcnJlbCwKLQkJCQkJCQkgICBqb2lu dHlwZSwgcmVzdHJpY3RsaXN0KSkKKwkJCQkJCQkgICBqb2ludHlwZSwgcmVzdHJpY3RsaXN0 LCAmb3V0ZXJfZXhwcnMpKQogCXsKIAkJLyoKIAkJICogQ2FjaGUgdGhlIHBvc2l0aXZlIHJl c3VsdCBmb3IgZnV0dXJlIHByb2JlcywgYmVpbmcgc3VyZSB0byBrZWVwIGl0CkBAIC0xMjMz LDEwICsxMjk3LDE1IEBAIGlubmVycmVsX2lzX3VuaXF1ZShQbGFubmVySW5mbyAqcm9vdCwK IAkJICogc3VwZXJzZXRzIG9mIHRoZW0gYW55d2F5LgogCQkgKi8KIAkJb2xkX2NvbnRleHQg PSBNZW1vcnlDb250ZXh0U3dpdGNoVG8ocm9vdC0+cGxhbm5lcl9jeHQpOworCQl1bmlxdWVS ZWxJbmZvID0gcGFsbG9jKHNpemVvZihVbmlxdWVSZWxJbmZvKSk7CisJCXVuaXF1ZVJlbElu Zm8tPmV4dHJhX2NsYXVzZXMgPSBvdXRlcl9leHByczsKKwkJdW5pcXVlUmVsSW5mby0+b3V0 ZXJyZWxpZHMgPSBibXNfY29weShvdXRlcnJlbGlkcyk7CiAJCWlubmVycmVsLT51bmlxdWVf Zm9yX3JlbHMgPSBsYXBwZW5kKGlubmVycmVsLT51bmlxdWVfZm9yX3JlbHMsCi0JCQkJCQkJ CQkJCWJtc19jb3B5KG91dGVycmVsaWRzKSk7CisJCQkJCQkJCQkJCXVuaXF1ZVJlbEluZm8p OwogCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkX2NvbnRleHQpOwogCisJCWlmIChleHRy YV9jbGF1c2VzKQorCQkJKmV4dHJhX2NsYXVzZXMgPSBvdXRlcl9leHByczsKIAkJcmV0dXJu IHRydWU7CQkJLyogU3VjY2VzcyEgKi8KIAl9CiAJZWxzZQpAQCAtMTI4Miw3ICsxMzUxLDgg QEAgaXNfaW5uZXJyZWxfdW5pcXVlX2ZvcihQbGFubmVySW5mbyAqcm9vdCwKIAkJCQkJICAg UmVsaWRzIG91dGVycmVsaWRzLAogCQkJCQkgICBSZWxPcHRJbmZvICppbm5lcnJlbCwKIAkJ CQkJICAgSm9pblR5cGUgam9pbnR5cGUsCi0JCQkJCSAgIExpc3QgKnJlc3RyaWN0bGlzdCkK KwkJCQkJICAgTGlzdCAqcmVzdHJpY3RsaXN0LAorCQkJCQkgICBMaXN0ICoqZXh0cmFfY2xh dXNlcykKIHsKIAlMaXN0CSAgICpjbGF1c2VfbGlzdCA9IE5JTDsKIAlMaXN0Q2VsbCAgICps YzsKQEAgLTEzMjQsNSArMTM5NCw5MjkgQEAgaXNfaW5uZXJyZWxfdW5pcXVlX2ZvcihQbGFu bmVySW5mbyAqcm9vdCwKIAl9CiAKIAkvKiBMZXQgcmVsX2lzX2Rpc3RpbmN0X2ZvcigpIGRv IHRoZSBoYXJkIHdvcmsgKi8KLQlyZXR1cm4gcmVsX2lzX2Rpc3RpbmN0X2Zvcihyb290LCBp bm5lcnJlbCwgY2xhdXNlX2xpc3QpOworCXJldHVybiByZWxfaXNfZGlzdGluY3RfZm9yKHJv b3QsIGlubmVycmVsLCBjbGF1c2VfbGlzdCwgZXh0cmFfY2xhdXNlcyk7Cit9CisKK3R5cGVk ZWYgc3RydWN0IFJlcGxhY2VWYXJub0NvbnRleHQKK3sKKwlpbnQJZnJvbTsKKwlpbnQJdG87 Cit9IFJlcGxhY2VWYXJub0NvbnRleHQ7CisKK3N0YXRpYyBib29sCityZXBsYWNlX3Zhcm5v X3dhbGtlcihOb2RlICpub2RlLCBSZXBsYWNlVmFybm9Db250ZXh0ICpjdHgpCit7CisJaWYg KG5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKElzQShub2RlLCBWYXIp KQorCXsKKwkJVmFyICAgKnZhciA9IChWYXIgKikgbm9kZTsKKworCQlpZiAodmFyLT52YXJu byA9PSBjdHgtPmZyb20pCisJCXsKKwkJCXZhci0+dmFybm8gPSBjdHgtPnRvOworCQkJdmFy LT52YXJub3N5biA9IGN0eC0+dG87CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAo SXNBKG5vZGUsIFJlc3RyaWN0SW5mbykpCisJeworCQlSZXN0cmljdEluZm8gICAqcmluZm8g PSAoUmVzdHJpY3RJbmZvICopIG5vZGU7CisJCWludAkJCQlyZWxpZCA9IC0xOworCQlib29s CQkJaXNfcmVxX2VxdWFsID0KKwkJCQkJCQkocmluZm8tPnJlcXVpcmVkX3JlbGlkcyA9PSBy aW5mby0+Y2xhdXNlX3JlbGlkcyk7CisKKwkJaWYgKGJtc19pc19tZW1iZXIoY3R4LT5mcm9t LCByaW5mby0+Y2xhdXNlX3JlbGlkcykpCisJCXsKKwkJCXJlcGxhY2VfdmFybm8oKE5vZGUg KikgcmluZm8tPmNsYXVzZSwgY3R4LT5mcm9tLCBjdHgtPnRvKTsKKwkJCXJlcGxhY2VfdmFy bm8oKE5vZGUgKikgcmluZm8tPm9yY2xhdXNlLCBjdHgtPmZyb20sIGN0eC0+dG8pOworCQkJ cmluZm8tPmNsYXVzZV9yZWxpZHMgPSByZXBsYWNlX3JlbGlkKHJpbmZvLT5jbGF1c2VfcmVs aWRzLCBjdHgtPmZyb20sIGN0eC0+dG8pOworCQkJcmluZm8tPmxlZnRfcmVsaWRzID0gcmVw bGFjZV9yZWxpZChyaW5mby0+bGVmdF9yZWxpZHMsIGN0eC0+ZnJvbSwgY3R4LT50byk7CisJ CQlyaW5mby0+cmlnaHRfcmVsaWRzID0gcmVwbGFjZV9yZWxpZChyaW5mby0+cmlnaHRfcmVs aWRzLCBjdHgtPmZyb20sIGN0eC0+dG8pOworCQl9CisKKwkJaWYgKGlzX3JlcV9lcXVhbCkK KwkJCXJpbmZvLT5yZXF1aXJlZF9yZWxpZHMgPSByaW5mby0+Y2xhdXNlX3JlbGlkczsKKwkJ ZWxzZQorCQkJcmluZm8tPnJlcXVpcmVkX3JlbGlkcyA9IHJlcGxhY2VfcmVsaWQocmluZm8t PnJlcXVpcmVkX3JlbGlkcywgY3R4LT5mcm9tLCBjdHgtPnRvKTsKKworCQlyaW5mby0+b3V0 ZXJfcmVsaWRzID0gcmVwbGFjZV9yZWxpZChyaW5mby0+b3V0ZXJfcmVsaWRzLCBjdHgtPmZy b20sIGN0eC0+dG8pOworCQlyaW5mby0+aW5jb21wYXRpYmxlX3JlbGlkcyA9IHJlcGxhY2Vf cmVsaWQocmluZm8tPmluY29tcGF0aWJsZV9yZWxpZHMsIGN0eC0+ZnJvbSwgY3R4LT50byk7 CisKKwkJaWYgKHJpbmZvLT5tZXJnZW9wZmFtaWxpZXMgJiYKKwkJCWJtc19nZXRfc2luZ2xl dG9uX21lbWJlcihyaW5mby0+Y2xhdXNlX3JlbGlkcywgJnJlbGlkKSAmJgorCQkJcmVsaWQg PT0gY3R4LT50byAmJiBJc0EocmluZm8tPmNsYXVzZSwgT3BFeHByKSkKKwkJeworCQkJRXhw cgkgICAqbGVmdE9wOworCQkJRXhwcgkgICAqcmlnaHRPcDsKKworCQkJbGVmdE9wID0gKEV4 cHIgKikgZ2V0X2xlZnRvcChyaW5mby0+Y2xhdXNlKTsKKwkJCXJpZ2h0T3AgPSAoRXhwciAq KSBnZXRfcmlnaHRvcChyaW5mby0+Y2xhdXNlKTsKKworCQkJaWYgKGxlZnRPcCAhPSBOVUxM ICYmIGVxdWFsKGxlZnRPcCwgcmlnaHRPcCkpCisJCQl7CisJCQkJTnVsbFRlc3QgICAqbnRl c3QgPSBtYWtlTm9kZShOdWxsVGVzdCk7CisKKwkJCQludGVzdC0+YXJnID0gbGVmdE9wOwor CQkJCW50ZXN0LT5udWxsdGVzdHR5cGUgPSBJU19OT1RfTlVMTDsKKwkJCQludGVzdC0+YXJn aXNyb3cgPSBmYWxzZTsKKwkJCQludGVzdC0+bG9jYXRpb24gPSAtMTsKKwkJCQlyaW5mby0+ Y2xhdXNlID0gKEV4cHIgKikgbnRlc3Q7CisJCQkJcmluZm8tPm1lcmdlb3BmYW1pbGllcyA9 IE5JTDsKKwkJCX0KKwkJCUFzc2VydChyaW5mby0+b3JjbGF1c2UgPT0gTlVMTCk7CisJCX0K KworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiBleHByZXNzaW9uX3RyZWVfd2Fsa2Vy KG5vZGUsIHJlcGxhY2VfdmFybm9fd2Fsa2VyLCAodm9pZCAqKSBjdHgpOworfQorCisvKgor ICogUmVwbGFjZSBlYWNoIG9jY3VyZW5jZSBvZiByZW1vdmluZyByZWxpZCB3aXRoIHRoZSBr ZWVwaW5nIG9uZQorICovCitzdGF0aWMgdm9pZAorcmVwbGFjZV92YXJubyhOb2RlICpub2Rl LCBpbnQgZnJvbSAsIGludCB0bykKK3sKKwlSZXBsYWNlVmFybm9Db250ZXh0IGN0eDsKKwor CWlmICh0byA8PSAwKQorCQlyZXR1cm47CisKKwljdHguZnJvbSA9IGZyb207CisJY3R4LnRv ID0gdG87CisJcmVwbGFjZV92YXJub193YWxrZXIobm9kZSwgJmN0eCk7Cit9CisKKy8qCisg KiBTdWJzdGl0dXRlIG5ld0lkIGJ5IG9sZElkIGluIHJlbGlkcy4KKyAqLworc3RhdGljIEJp dG1hcHNldCAqCityZXBsYWNlX3JlbGlkKFJlbGlkcyByZWxpZHMsIGludCBvbGRJZCwgaW50 IG5ld0lkKQoreworCWlmIChvbGRJZCA8IDApCisJCXJldHVybiByZWxpZHM7CisKKwlpZiAo bmV3SWQgPCAwKQorCQkvKiBEZWxldGUgcmVsaWQgd2l0aG91dCBzdWJzdGl0dXRpb24uICov CisJCXJldHVybiBibXNfZGVsX21lbWJlcihyZWxpZHMsIG9sZElkKTsKKworCWlmIChibXNf aXNfbWVtYmVyKG9sZElkLCByZWxpZHMpKQorCQlyZXR1cm4gYm1zX2FkZF9tZW1iZXIoYm1z X2RlbF9tZW1iZXIoYm1zX2NvcHkocmVsaWRzKSwgb2xkSWQpLCBuZXdJZCk7CisKKwlyZXR1 cm4gcmVsaWRzOworfQorCisvKgorICogVXBkYXRlIEVDIG1lbWJlcnMgdG8gcG9pbnQgdG8g dGhlIHJlbWFpbmluZyByZWxhdGlvbiBpbnN0ZWFkIG9mIHRoZSByZW1vdmVkCisgKiBvbmUs IHJlbW92aW5nIGR1cGxpY2F0ZXMuCisgKgorICogUmVzdHJpY3Rpb24gY2xhdXNlcyBmb3Ig YmFzZSByZWxhdGlvbnMgYXJlIGFscmVhZHkgZGlzdHJpYnV0ZWQgdG8KKyAqIHRoZSByZXNw ZWN0aXZlIGJhc2VyZXN0cmljdGluZm8gbGlzdHMgKHNlZQorICogZ2VuZXJhdGVfaW1wbGll ZF9lcXVhbGl0aWVzKS4gVGhlIGFib3ZlIGNvZGUgaGFzIGFscmVhZHkgcHJvY2Vzc2VkCisg KiB0aGlzIGxpc3QsIGFuZCB1cGRhdGVkIHRoZXNlIGNsYXVzZXMgdG8gcmVmZXJlbmNlIHRo ZSByZW1haW5pbmcKKyAqIHJlbGF0aW9uLCBzbyB3ZSBjYW4gc2tpcCB0aGVtIGhlcmUgYmFz ZWQgb24gdGhlaXIgcmVsaWRzLgorICoKKyAqIExpa2V3aXNlLCB3ZSBoYXZlIGFscmVhZHkg cHJvY2Vzc2VkIHRoZSBqb2luIGNsYXVzZXMgdGhhdCBqb2luIHRoZQorICogcmVtb3ZlZCBy ZWxhdGlvbiB0byB0aGUgcmVtYWluaW5nIG9uZS4KKyAqCisgKiBGaW5hbGx5LCB0aGVyZSBh cmUgam9pbiBjbGF1c2VzIHRoYXQgam9pbiB0aGUgcmVtb3ZlZCByZWxhdGlvbiB0bworICog c29tZSB0aGlyZCByZWxhdGlvbi4gV2UgY2FuJ3QganVzdCBkZWxldGUgdGhlIHNvdXJjZSBj bGF1c2VzIGFuZAorICogcmVnZW5lcmF0ZSB0aGVtIGZyb20gdGhlIEVDLCBiZWNhdXNlIHRo ZSBjb3JyZXNwb25kaW5nIGVxdWFsaXR5CisgKiBvcGVyYXRvcnMgbWlnaHQgYmUgbWlzc2lu ZyAoc2VlIHRoZSBoYW5kbGluZyBvZiBlY19icm9rZW4pLgorICogVGhlcmVmb3JlLCB3ZSB3 aWxsIHVwZGF0ZSB0aGUgcmVmZXJlbmNlcyBpbiB0aGUgc291cmNlIGNsYXVzZXMuCisgKgor ICogRGVyaXZlZCBjbGF1c2VzIGNhbiBiZSBnZW5lcmF0ZWQgYWdhaW4sIHNvIGl0IGlzIHNp bXBsZXIgdG8ganVzdAorICogZGVsZXRlIHRoZW0uCisgKi8KK3N0YXRpYyB2b2lkCit1cGRh dGVfZWNsYXNzKEVxdWl2YWxlbmNlQ2xhc3MgKmVjLCBpbnQgZnJvbSwgaW50IHRvKQorewor CUxpc3QJICAgKm5ld19tZW1iZXJzID0gTklMOworCUxpc3QJICAgKm5ld19zb3VyY2VzID0g TklMOworCUxpc3RDZWxsICAgKmxjOworCUxpc3RDZWxsICAgKmxjMTsKKworCWZvcmVhY2go bGMsIGVjLT5lY19tZW1iZXJzKQorCXsKKwkJRXF1aXZhbGVuY2VNZW1iZXIgICplbSA9IGxm aXJzdF9ub2RlKEVxdWl2YWxlbmNlTWVtYmVyLCBsYyk7CisJCWJvb2wJCQkJaXNfcmVkdW5k YW50ID0gZmFsc2U7CisKKwkJaWYgKCFibXNfaXNfbWVtYmVyKGZyb20sIGVtLT5lbV9yZWxp ZHMpKQorCQl7CisJCQluZXdfbWVtYmVycyA9IGxhcHBlbmQobmV3X21lbWJlcnMsIGVtKTsK KwkJCWNvbnRpbnVlOworCQl9CisKKwkJZW0tPmVtX3JlbGlkcyA9IHJlcGxhY2VfcmVsaWQo ZW0tPmVtX3JlbGlkcywgZnJvbSwgdG8pOworCQllbS0+ZW1famRvbWFpbi0+amRfcmVsaWRz ID0gcmVwbGFjZV9yZWxpZChlbS0+ZW1famRvbWFpbi0+amRfcmVsaWRzLCBmcm9tLCB0byk7 CisKKwkJLyogV2Ugb25seSBwcm9jZXNzIGlubmVyIGpvaW5zICovCisJCXJlcGxhY2VfdmFy bm8oKE5vZGUgKikgZW0tPmVtX2V4cHIsIGZyb20sIHRvKTsKKworCQlmb3JlYWNoKGxjMSwg bmV3X21lbWJlcnMpCisJCXsKKwkJCUVxdWl2YWxlbmNlTWVtYmVyICAqb3RoZXIgPSBsZmly c3Rfbm9kZShFcXVpdmFsZW5jZU1lbWJlciwgbGMxKTsKKworCQkJaWYgKCFlcXVhbChlbS0+ ZW1fcmVsaWRzLCBvdGhlci0+ZW1fcmVsaWRzKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYg KGVxdWFsKGVtLT5lbV9leHByLCBvdGhlci0+ZW1fZXhwcikpCisJCQl7CisJCQkJaXNfcmVk dW5kYW50ID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICghaXNfcmVk dW5kYW50KQorCQkJbmV3X21lbWJlcnMgPSBsYXBwZW5kKG5ld19tZW1iZXJzLCBlbSk7CisJ fQorCisJbGlzdF9mcmVlKGVjLT5lY19tZW1iZXJzKTsKKwllYy0+ZWNfbWVtYmVycyA9IG5l d19tZW1iZXJzOworCisJbGlzdF9mcmVlKGVjLT5lY19kZXJpdmVzKTsKKwllYy0+ZWNfZGVy aXZlcyA9IE5VTEw7CisKKwkvKiBVcGRhdGUgRUMgc291cmNlIGV4cHJlc3Npb25zICovCisJ Zm9yZWFjaChsYywgZWMtPmVjX3NvdXJjZXMpCisJeworCQlSZXN0cmljdEluZm8gICAqcmlu Zm8gPSBsZmlyc3Rfbm9kZShSZXN0cmljdEluZm8sIGxjKTsKKwkJYm9vbAkJCWlzX3JlZHVu ZGFudCA9IGZhbHNlOworCisJCWlmICghYm1zX2lzX21lbWJlcihmcm9tLCByaW5mby0+cmVx dWlyZWRfcmVsaWRzKSkKKwkJeworCQkJbmV3X3NvdXJjZXMgPSBsYXBwZW5kKG5ld19zb3Vy Y2VzLCByaW5mbyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJlcGxhY2VfdmFybm8oKE5v ZGUgKikgcmluZm8sIGZyb20sIHRvKTsKKworCQkvKgorCQkgKiBBZnRlciBzd2l0Y2hpbmcg dGhlIGNsYXVzZSB0byB0aGUgcmVtYWluaW5nIHJlbGF0aW9uLCBjaGVjayBpdCBmb3IKKwkJ ICogcmVkdW5kYW5jeSB3aXRoIGV4aXN0aW5nIG9uZXMuIFdlIGRvbid0IGhhdmUgdG8gY2hl Y2sgZm9yCisJCSAqIHJlZHVuZGFuY3kgd2l0aCBkZXJpdmVkIGNsYXVzZXMsIGJlY2F1c2Ug d2UndmUganVzdCBkZWxldGVkIHRoZW0uCisJCSAqLworCQlmb3JlYWNoKGxjMSwgbmV3X3Nv dXJjZXMpCisJCXsKKwkJCVJlc3RyaWN0SW5mbyAgICpvdGhlciA9IGxmaXJzdF9ub2RlKFJl c3RyaWN0SW5mbywgbGMxKTsKKworCQkJaWYgKCFlcXVhbChyaW5mby0+Y2xhdXNlX3JlbGlk cywgb3RoZXItPmNsYXVzZV9yZWxpZHMpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoZXF1 YWwocmluZm8tPmNsYXVzZSwgb3RoZXItPmNsYXVzZSkpCisJCQl7CisJCQkJaXNfcmVkdW5k YW50ID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICghaXNfcmVkdW5k YW50KQorCQkJbmV3X3NvdXJjZXMgPSBsYXBwZW5kKG5ld19zb3VyY2VzLCByaW5mbyk7CisJ fQorCisJbGlzdF9mcmVlKGVjLT5lY19zb3VyY2VzKTsKKwllYy0+ZWNfc291cmNlcyA9IG5l d19zb3VyY2VzOworCWVjLT5lY19yZWxpZHMgPSByZXBsYWNlX3JlbGlkKGVjLT5lY19yZWxp ZHMsIGZyb20sIHRvKTsKK30KKworc3RhdGljIGJvb2wKK3NqZV93YWxrZXIoTm9kZSAqbm9k ZSwgUmVwbGFjZVZhcm5vQ29udGV4dCAqY3R4KQoreworCWlmIChub2RlID09IE5VTEwpCisJ CXJldHVybiBmYWxzZTsKKworCWlmIChJc0Eobm9kZSwgVmFyKSkKKwl7CisJCVZhciAqdmFy ID0gKFZhciAqKSBub2RlOworCisJCWlmICh2YXItPnZhcm5vID09IGN0eC0+ZnJvbSkKKwkJ eworCQkJdmFyLT52YXJubyA9IGN0eC0+dG87CisJCQl2YXItPnZhcm5vc3luID0gY3R4LT50 bzsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiBleHByZXNzaW9uX3RyZWVf d2Fsa2VyKG5vZGUsIHNqZV93YWxrZXIsICh2b2lkICopIGN0eCk7Cit9CisKKy8qCisgKiBS ZW1vdmUgYSByZWxhdGlvbiBhZnRlciB3ZSBoYXZlIHByb3ZlbiB0aGF0IGl0IHBhcnRpY2lw YXRlcyBvbmx5IGluIGFuCisgKiB1bm5lZWRlZCB1bmlxdWUgc2VsZiBqb2luLgorICoKKyAq IFJlcGxhY2UgYW55IGxpbmtzIGluIHBsYW5uZXIgaW5mbyBzdHJ1Y3R1cmVzLgorICoKKyAq IFRyYW5zZmVyIGpvaW4gYW5kIHJlc3RyaWN0aW9uIGNsYXVzZXMgZnJvbSB0aGUgcmVtb3Zl ZCByZWxhdGlvbiB0byB0aGUKKyAqIHJlbWFpbmluZyBvbmUuIFdlIGNoYW5nZSB0aGUgVmFy cyBvZiB0aGUgY2xhdXNlIHRvIHBvaW50IHRvIHRoZQorICogcmVtYWluaW5nIHJlbGF0aW9u IGluc3RlYWQgb2YgdGhlIHJlbW92ZWQgb25lLiBUaGUgY2xhdXNlcyB0aGF0IHJlcXVpcmUK KyAqIGEgc3Vic2V0IG9mIGpvaW5yZWxpZHMgYmVjb21lIHJlc3RyaWN0aW9uIGNsYXVzZXMg b2YgdGhlIHJlbWFpbmluZworICogcmVsYXRpb24sIGFuZCBvdGhlcnMgcmVtYWluIGpvaW4g Y2xhdXNlcy4gV2UgYXBwZW5kIHRoZW0gdG8KKyAqIGJhc2VyZXN0cmljdGluZm8gYW5kIGpv aW5pbmZvIHJlc3BlY3RpdmVseSwgdHJ5aW5nIG5vdCB0byBpbnRyb2R1Y2UKKyAqIGR1cGxp Y2F0ZXMuCisgKgorICogV2UgYWxzbyBoYXZlIHRvIHByb2Nlc3MgdGhlICdqb2luY2xhdXNl cycgbGlzdCBoZXJlLCBiZWNhdXNlIGl0CisgKiBjb250YWlucyBFQy1kZXJpdmVkIGpvaW4g Y2xhdXNlcyB3aGljaCBtdXN0IGJlY29tZSBmaWx0ZXIgY2xhdXNlcy4gSXQKKyAqIGlzIG5v dCBlbm91Z2ggdG8ganVzdCBjb3JyZWN0IHRoZSBFQ3MsIGJlY2F1c2UgdGhlIEVDLWRlcml2 ZWQKKyAqIHJlc3RyaWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJlZm9yZSBqb2luIHJlbW92YWwg KHNlZQorICogZ2VuZXJhdGVfYmFzZV9pbXBsaWVkX2VxdWFsaXRpZXMpLgorICovCitzdGF0 aWMgdm9pZAorcmVtb3ZlX3NlbGZfam9pbl9yZWwoUGxhbm5lckluZm8gKnJvb3QsIFBsYW5S b3dNYXJrICprbWFyaywgUGxhblJvd01hcmsgKnJtYXJrLAorCQkJCQkgUmVsT3B0SW5mbyAq dG9LZWVwLCBSZWxPcHRJbmZvICp0b1JlbW92ZSwKKwkJCQkJIExpc3QgKnJlc3RyaWN0bGlz dCkKK3sKKwlMaXN0CQkJICAgKmpvaW5pbmZvczsKKwlMaXN0Q2VsbAkJICAgKmxjOworCWlu dAkJCQkJaTsKKwlMaXN0CQkJICAgKmppbmZvX2NhbmRpZGF0ZXMgPSBOSUw7CisJTGlzdAkJ CSAgICpiaW5mb19jYW5kaWRhdGVzID0gTklMOworCVJlcGxhY2VWYXJub0NvbnRleHQJY3R4 ID0gey5mcm9tID0gdG9SZW1vdmUtPnJlbGlkLCAudG8gPSB0b0tlZXAtPnJlbGlkfTsKKwor CS8qCisJICogUmVwbGFjZSBpbmRleCBvZiByZW1vdmluZyB0YWJsZSB3aXRoIHRoZSBrZWVw aW5nIG9uZS4gVGhlIHRlY2huaXF1ZSBvZgorCSAqIHJlbW92aW5nL2Rpc3RyaWJ1dGluZyBy ZXN0cmljdGluZm8gaXMgdXNlZCBoZXJlIHRvIGF0dGFjaCBqdXN0IGFwcGVhcmVkCisJICog KGZvciBrZWVwaW5nIHJlbGF0aW9uKSBqb2luIGNsYXVzZXMgYW5kIGF2b2lkIG9mIGFkZGlu ZyBkdXBsaWNhdGVzIG9mCisJICogdGhvc2UgdGhhdCBhbHJlYWR5IGV4aXN0IGluIHRoZSBq b2luaW5mbyBsaXN0LgorCSAqLworCWpvaW5pbmZvcyA9IGxpc3RfY29weSh0b1JlbW92ZS0+ am9pbmluZm8pOworCWZvcmVhY2gobGMsIGpvaW5pbmZvcykKKwl7CisJCVJlc3RyaWN0SW5m byAqcmluZm8gPSBsZmlyc3Rfbm9kZShSZXN0cmljdEluZm8sIGxjKTsKKworCQlyZW1vdmVf am9pbl9jbGF1c2VfZnJvbV9yZWxzKHJvb3QsIHJpbmZvLCByaW5mby0+cmVxdWlyZWRfcmVs aWRzKTsKKwkJcmVwbGFjZV92YXJubygoTm9kZSAqKSByaW5mbywgdG9SZW1vdmUtPnJlbGlk LCB0b0tlZXAtPnJlbGlkKTsKKworCQlpZiAoYm1zX21lbWJlcnNoaXAocmluZm8tPnJlcXVp cmVkX3JlbGlkcykgPT0gQk1TX01VTFRJUExFKQorCQkJamluZm9fY2FuZGlkYXRlcyA9IGxh cHBlbmQoamluZm9fY2FuZGlkYXRlcywgcmluZm8pOworCQllbHNlCisJCQliaW5mb19jYW5k aWRhdGVzID0gbGFwcGVuZChiaW5mb19jYW5kaWRhdGVzLCByaW5mbyk7CisJfQorCisJLyoK KwkgKiBDb25jYXRlbmF0ZSByZXN0cmljdGxpc3QgdG8gdGhlIGxpc3Qgb2YgYmFzZSByZXN0 cmljdGlvbnMgb2YgdGhlIHJlbW92aW5nCisJICogdGFibGUganVzdCB0byBzaW1wbGlmeSBy ZXBsYWNlbWVudCBwcm9jZWR1cmU6IGFsbCBvZiB0aGVtIHdlcmVuJ3QKKwkgKiBjb25uZWN0 ZWQgdG8gYW55IGtlZXBpbmcgcmVsYXRpb25zIGFuZCBuZWVkIHRvIGJlIGFkZGVkIHRvIHNv bWUgcmVscy4KKwkgKi8KKwl0b1JlbW92ZS0+YmFzZXJlc3RyaWN0aW5mbyA9IGxpc3RfY29u Y2F0KHRvUmVtb3ZlLT5iYXNlcmVzdHJpY3RpbmZvLAorCQkJCQkJCQkJCQkgcmVzdHJpY3Rs aXN0KTsKKwlmb3JlYWNoKGxjLCB0b1JlbW92ZS0+YmFzZXJlc3RyaWN0aW5mbykKKwl7CisJ CVJlc3RyaWN0SW5mbyAgICpyaW5mbyA9IGxmaXJzdF9ub2RlKFJlc3RyaWN0SW5mbywgbGMp OworCisJCXJlcGxhY2VfdmFybm8oKE5vZGUgKikgcmluZm8sIHRvUmVtb3ZlLT5yZWxpZCwg dG9LZWVwLT5yZWxpZCk7CisKKwkJaWYgKGJtc19tZW1iZXJzaGlwKHJpbmZvLT5yZXF1aXJl ZF9yZWxpZHMpID09IEJNU19NVUxUSVBMRSkKKwkJCWppbmZvX2NhbmRpZGF0ZXMgPSBsYXBw ZW5kKGppbmZvX2NhbmRpZGF0ZXMsIHJpbmZvKTsKKwkJZWxzZQorCQkJYmluZm9fY2FuZGlk YXRlcyA9IGxhcHBlbmQoYmluZm9fY2FuZGlkYXRlcywgcmluZm8pOworCX0KKworCS8qCisJ ICogTm93LCBhZGQgYWxsIG5vbi1yZWR1bmRhbnQgY2xhdXNlcyB0byB0aGUga2VlcGluZyBy ZWxhdGlvbi4KKwkgKiBDb250cmFkaWN0b3J5IG9wZXJhdGlvbi4gT24gdGhlIG9uZSBzaWRl IHdlIHJlZHVjZSBsZW5ndGggb2YgcmVzdHJpY3QKKwkgKiBsaXN0cyB0aGF0IGNhbiBpbXBh Y3QgcGxhbm5pbmcgb3IgZXhlY3V0aW5nIHRpbWUuIEFkZGl0aW9uYWxseSwgd2UKKwkgKiBp bXByb3ZlIGFjY3VyYWN5IG9mIGNhcmRpbmFsaXR5IGVzdGltYXRpb24uIE9uIHRoZSBvdGhl ciBzaWRlLCBpdCBpcyBvbmUKKwkgKiBtb3JlIHBsYWNlIHdoaWNoIGNhbiBtYWtlIHBsYW5u aW5nIHRpbWUgbXVjaCBsb25nZXIgaW4gc3BlY2lmaWMgY2FzZXMuCisJICogSXQgd291bGQg aGF2ZSBiZWVuIGJldHRlciB0byBhdm9pZCBjYWxsaW5nIHRoZSBlcXVhbCgpIGZ1bmN0aW9u IGhlcmUsCisJICogYnV0IGl0J3Mgb25seSB3YXkgdG8gZGV0ZWN0IGR1cGxpY2F0ZWQgaW5l cXVhbGl0eSBleHByZXNzaW9ucy4KKwkgKi8KKworCWZvcmVhY2gobGMsIGJpbmZvX2NhbmRp ZGF0ZXMpCisJeworCQlSZXN0cmljdEluZm8gICAqcmluZm8gPSBsZmlyc3Rfbm9kZShSZXN0 cmljdEluZm8sIGxjKTsKKwkJTGlzdENlbGwJICAgKm9sYyA9IE5VTEw7CisJCWJvb2wJCQlp c19yZWR1bmRhbnQgPSBmYWxzZTsKKworCQlBc3NlcnQoIWJtc19pc19tZW1iZXIodG9SZW1v dmUtPnJlbGlkLCByaW5mby0+cmVxdWlyZWRfcmVsaWRzKSk7CisKKwkJZm9yZWFjaChvbGMs IHRvS2VlcC0+YmFzZXJlc3RyaWN0aW5mbykKKwkJeworCQkJUmVzdHJpY3RJbmZvICpzcmMg PSBsZmlyc3Rfbm9kZShSZXN0cmljdEluZm8sIG9sYyk7CisKKwkJCWlmICghYm1zX2VxdWFs KHNyYy0+Y2xhdXNlX3JlbGlkcywgcmluZm8tPmNsYXVzZV9yZWxpZHMpKQorCQkJCS8qIENv bnN0IGFuZCBub24tY29uc3QgZXhwcmVzc2lvbnMgY2FuJ3QgYmUgZXF1YWwgKi8KKwkJCQlj b250aW51ZTsKKworCQkJaWYgKHNyYyA9PSByaW5mbyB8fAorCQkJCShyaW5mby0+cGFyZW50 X2VjICE9IE5VTEwKKwkJCQkgJiYgc3JjLT5wYXJlbnRfZWMgPT0gcmluZm8tPnBhcmVudF9l YykKKwkJCQl8fCBlcXVhbChyaW5mby0+Y2xhdXNlLCBzcmMtPmNsYXVzZSkpCisJCQl7CisJ CQkJaXNfcmVkdW5kYW50ID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAo IWlzX3JlZHVuZGFudCkKKwkJCWRpc3RyaWJ1dGVfcmVzdHJpY3RpbmZvX3RvX3JlbHMocm9v dCwgcmluZm8pOworCX0KKwlmb3JlYWNoKGxjLCBqaW5mb19jYW5kaWRhdGVzKQorCXsKKwkJ UmVzdHJpY3RJbmZvICAgKnJpbmZvID0gbGZpcnN0X25vZGUoUmVzdHJpY3RJbmZvLCBsYyk7 CisJCUxpc3RDZWxsCSAgICpvbGMgPSBOVUxMOworCQlib29sCQkJaXNfcmVkdW5kYW50ID0g ZmFsc2U7CisKKwkJQXNzZXJ0KCFibXNfaXNfbWVtYmVyKHRvUmVtb3ZlLT5yZWxpZCwgcmlu Zm8tPnJlcXVpcmVkX3JlbGlkcykpOworCisJCWZvcmVhY2gob2xjLCB0b0tlZXAtPmpvaW5p bmZvKQorCQl7CisJCQlSZXN0cmljdEluZm8gKnNyYyA9IGxmaXJzdF9ub2RlKFJlc3RyaWN0 SW5mbywgb2xjKTsKKworCQkJaWYgKCFibXNfZXF1YWwoc3JjLT5jbGF1c2VfcmVsaWRzLCBy aW5mby0+Y2xhdXNlX3JlbGlkcykpCisJCQkJLyogQ2FuJ3QgY29tcGFyZSB0cml2aWFsbHkg ZGlmZmVyZW50IGNsYXVzZXMgKi8KKwkJCQljb250aW51ZTsKKworCQkJaWYgKHNyYyA9PSBy aW5mbyB8fAorCQkJCShyaW5mby0+cGFyZW50X2VjICE9IE5VTEwKKwkJCQkgJiYgc3JjLT5w YXJlbnRfZWMgPT0gcmluZm8tPnBhcmVudF9lYykKKwkJCQl8fCBlcXVhbChyaW5mby0+Y2xh dXNlLCBzcmMtPmNsYXVzZSkpCisJCQl7CisJCQkJaXNfcmVkdW5kYW50ID0gdHJ1ZTsKKwkJ CQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIWlzX3JlZHVuZGFudCkKKwkJCWRpc3RyaWJ1 dGVfcmVzdHJpY3RpbmZvX3RvX3JlbHMocm9vdCwgcmluZm8pOworCX0KKwlsaXN0X2ZyZWUo YmluZm9fY2FuZGlkYXRlcyk7CisJbGlzdF9mcmVlKGppbmZvX2NhbmRpZGF0ZXMpOworCisJ LyoKKwkgKiBBcnJhbmdlIGVxdWl2YWxlbmNlIGNsYXNzZXMsIG1lbnRpb25lZCByZW1vdmlu ZyB0YWJsZSwgd2l0aCB0aGUga2VlcGluZworCSAqIG9uZTogdmFybm8gb2YgcmVtb3ZpbiB0 YWJsZSBzaG91bGQgYmUgcmVwbGFjZWQgaW4gbWVtYmVycyBhbmQgc291cmNlcworCSAqIGxp c3RzLiBBbHNvLCByZW1vdmUgZHVwbGljYXRlZCBlbGVtZW50cyBpZiB0aGlzIHJlcGxhY2Vt ZW50IHByb2NlZHVyZQorCSAqIGNyZWF0ZWQgdGhlbS4KKwkgKi8KKwlpID0gLTE7CisJd2hp bGUgKChpID0gYm1zX25leHRfbWVtYmVyKHRvUmVtb3ZlLT5lY2xhc3NfaW5kZXhlcywgaSkp ID49IDApCisJeworCQlFcXVpdmFsZW5jZUNsYXNzICplYyA9IChFcXVpdmFsZW5jZUNsYXNz ICopIGxpc3RfbnRoKHJvb3QtPmVxX2NsYXNzZXMsIGkpOworCisJCXVwZGF0ZV9lY2xhc3Mo ZWMsIHRvUmVtb3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisJCXRvS2VlcC0+ZWNsYXNz X2luZGV4ZXMgPSBibXNfYWRkX21lbWJlcih0b0tlZXAtPmVjbGFzc19pbmRleGVzLCBpKTsK Kwl9CisKKwkvKgorCSAqIFRyYW5zZmVyIHRoZSB0YXJnZXRsaXN0IGFuZCBhdHRyX25lZWRl ZCBmbGFncy4KKwkgKi8KKworCWZvcmVhY2gobGMsIHRvUmVtb3ZlLT5yZWx0YXJnZXQtPmV4 cHJzKQorCXsKKwkJTm9kZSAgICpub2RlID0gbGZpcnN0KGxjKTsKKworCQlyZXBsYWNlX3Zh cm5vKG5vZGUsIHRvUmVtb3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisJCWlmICghbGlz dF9tZW1iZXIodG9LZWVwLT5yZWx0YXJnZXQtPmV4cHJzLCBub2RlKSkKKwkJCXRvS2VlcC0+ cmVsdGFyZ2V0LT5leHBycyA9IGxhcHBlbmQodG9LZWVwLT5yZWx0YXJnZXQtPmV4cHJzLCBu b2RlKTsKKwl9CisKKwlmb3IgKGkgPSB0b0tlZXAtPm1pbl9hdHRyOyBpIDw9IHRvS2VlcC0+ bWF4X2F0dHI7IGkrKykKKwl7CisJCWludAkJCWF0dG5vID0gaSAtIHRvS2VlcC0+bWluX2F0 dHI7CisKKwkJdG9SZW1vdmUtPmF0dHJfbmVlZGVkW2F0dG5vXSA9IHJlcGxhY2VfcmVsaWQo CisJCQkJCQkJCQkJCXRvUmVtb3ZlLT5hdHRyX25lZWRlZFthdHRub10sCisJCQkJCQkJCQkJ CXRvUmVtb3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisJCXRvS2VlcC0+YXR0cl9uZWVk ZWRbYXR0bm9dID0gYm1zX2FkZF9tZW1iZXJzKHRvS2VlcC0+YXR0cl9uZWVkZWRbYXR0bm9d LAorCQkJCQkJCQkJCQkJCSB0b1JlbW92ZS0+YXR0cl9uZWVkZWRbYXR0bm9dKTsKKwl9CisK KwkvKgorCSAqIElmIHRoZSByZW1vdmVkIHJlbGF0aW9uIGhhcyBhIHJvdyBtYXJrLCB0cmFu c2ZlciBpdCB0byB0aGUgcmVtYWluaW5nCisJICogb25lLgorCSAqCisJICogSWYgYm90aCBy ZWxzIGhhdmUgcm93IG1hcmtzLCBqdXN0IGtlZXAgdGhlIG9uZSBjb3JyZXNwb25kaW5nIHRv IHRoZQorCSAqIHJlbWFpbmluZyByZWxhdGlvbiwgYmVjYXVzZSB3ZSB2ZXJpZmllZCBlYXJs aWVyIHRoYXQgdGhleSBoYXZlIHRoZSBzYW1lCisJICogc3RyZW5ndGguCisJICovCisJaWYg KHJtYXJrKQorCXsKKwkJaWYgKGttYXJrKQorCQl7CisJCQlBc3NlcnQoa21hcmstPm1hcmtU eXBlID09IHJtYXJrLT5tYXJrVHlwZSk7CisKKwkJCXJvb3QtPnJvd01hcmtzID0gbGlzdF9k ZWxldGVfcHRyKHJvb3QtPnJvd01hcmtzLCBybWFyayk7CisJCX0KKwkJZWxzZQorCQl7CisJ CQkvKiBTaG91bGRuJ3QgaGF2ZSBpbmhlcml0YW5jZSBjaGlsZHJlbiBoZXJlLiAqLworCQkJ QXNzZXJ0KHJtYXJrLT5ydGkgPT0gcm1hcmstPnBydGkpOworCisJCQlybWFyay0+cnRpID0g cm1hcmstPnBydGkgPSB0b0tlZXAtPnJlbGlkOworCQl9CisJfQorCisJLyogUmVwbGFjZSB2 YXJubyBpbiBhbGwgdGhlIHF1ZXJ5IHN0cnVjdHVyZXMgKi8KKwlxdWVyeV90cmVlX3dhbGtl cihyb290LT5wYXJzZSwgc2plX3dhbGtlciwgJmN0eCwgUVRXX0VYQU1JTkVfU09SVEdST1VQ KTsKKworCS8qIEF0IGxhc3QsIHJlcGxhY2UgbGlua3MgaW4gdGhlIHBsYW5uZXIgaW5mbyAq LworCXJlbW92ZV9yZWxfZnJvbV9xdWVyeV9jb21tb24ocm9vdCwgdG9SZW1vdmUsIHRvS2Vl cC0+cmVsaWQsIE5VTEwsIE5VTEwpOworCS8qIHJlcGxhY2UgdmFybm8gaW4gcm9vdCB0YXJn ZXRsaXN0IGFuZCBIQVZJTkcgY2xhdXNlICovCisJcmVwbGFjZV92YXJubygoTm9kZSAqKSBy b290LT5wcm9jZXNzZWRfdGxpc3QsCisJCQkJICAgdG9SZW1vdmUtPnJlbGlkLCB0b0tlZXAt PnJlbGlkKTsKKwlyZXBsYWNlX3Zhcm5vKChOb2RlICopIHJvb3QtPnByb2Nlc3NlZF9ncm91 cENsYXVzZSwKKwkJCQkgICB0b1JlbW92ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCS8q IC4uLiBhbmQgcmVtb3ZlIHRoZSByZWwgZnJvbSB0aGUgYmFzZXJlbCBhcnJheSAqLworCXJv b3QtPnNpbXBsZV9yZWxfYXJyYXlbdG9SZW1vdmUtPnJlbGlkXSA9IE5VTEw7CisJcGZyZWUo dG9SZW1vdmUpOworfQorCisvKgorICogc3BsaXRfc2VsZmpvaW5fcXVhbHMKKyAqCQlQcm9j ZXNzZXMgJ2pvaW5xdWFscycgYnVpbGRpbmcgdHdvIGxpc3RzLCBvbmUgd2l0aCBhIGxpc3Qg b2YgcXVhbHMKKyAqCQl3aGVyZSB0aGUgY29sdW1ucy9leHBycyBvbiBlaXRoZXIgc2lkZSBv ZiB0aGUgam9pbiBtYXRjaCBhbmQgYW5vdGhlcgorICoJCWxpc3QgY29udGFpbmluZyB0aGUg cmVtYWluaW5nIHF1YWxzLgorICoKKyAqICdqb2lucXVhbHMnIG11c3Qgb25seSBjb250YWlu IHF1YWxzIGZvciBhIFJURV9SRUxBVElPTiBiZWluZyBqb2luZWQgdG8KKyAqIGl0c2VsZi4K KyAqLworc3RhdGljIHZvaWQKK3NwbGl0X3NlbGZqb2luX3F1YWxzKFBsYW5uZXJJbmZvICpy b290LCBMaXN0ICpqb2lucXVhbHMsIExpc3QgKipzZWxmam9pbnF1YWxzLAorCQkJCQkgTGlz dCAqKm90aGVyam9pbnF1YWxzLCBpbnQgZnJvbSwgaW50IHRvKQoreworCUxpc3RDZWxsICAg KmxjOworCUxpc3QJICAgKnNqb2lucXVhbHMgPSBOSUw7CisJTGlzdAkgICAqb2pvaW5xdWFs cyA9IE5JTDsKKworCWZvcmVhY2gobGMsIGpvaW5xdWFscykKKwl7CisJCVJlc3RyaWN0SW5m byAgICpyaW5mbyA9IGxmaXJzdF9ub2RlKFJlc3RyaWN0SW5mbywgbGMpOworCQlPcEV4cHIJ CSAgICpleHByOworCQlOb2RlCQkgICAqbGVmdGV4cHI7CisJCU5vZGUJCSAgICpyaWdodGV4 cHI7CisKKwkJLyogSW4gZ2VuZXJhbCwgY2xhdXNlIGxvb2tzIGxpa2UgRihhcmcxKSA9IEco YXJnMikgKi8KKwkJaWYgKCFyaW5mby0+bWVyZ2VvcGZhbWlsaWVzIHx8CisJCQlibXNfbnVt X21lbWJlcnMocmluZm8tPmNsYXVzZV9yZWxpZHMpICE9IDIgfHwKKwkJCWJtc19tZW1iZXJz aGlwKHJpbmZvLT5sZWZ0X3JlbGlkcykgIT0gQk1TX1NJTkdMRVRPTiB8fAorCQkJYm1zX21l bWJlcnNoaXAocmluZm8tPnJpZ2h0X3JlbGlkcykgIT0gQk1TX1NJTkdMRVRPTikKKwkJewor CQkJb2pvaW5xdWFscyA9IGxhcHBlbmQob2pvaW5xdWFscywgcmluZm8pOworCQkJY29udGlu dWU7CisJCX0KKworCQlleHByID0gKE9wRXhwciAqKSByaW5mby0+Y2xhdXNlOworCisJCWlm ICghSXNBKGV4cHIsIE9wRXhwcikgfHwgbGlzdF9sZW5ndGgoZXhwci0+YXJncykgIT0gMikK KwkJeworCQkJb2pvaW5xdWFscyA9IGxhcHBlbmQob2pvaW5xdWFscywgcmluZm8pOworCQkJ Y29udGludWU7CisJCX0KKworCQlsZWZ0ZXhwciA9IGdldF9sZWZ0b3AocmluZm8tPmNsYXVz ZSk7CisJCXJpZ2h0ZXhwciA9IGNvcHlPYmplY3QoZ2V0X3JpZ2h0b3AocmluZm8tPmNsYXVz ZSkpOworCisJCWlmIChsZWZ0ZXhwciAmJiBJc0EobGVmdGV4cHIsIFJlbGFiZWxUeXBlKSkK KwkJCWxlZnRleHByID0gKE5vZGUgKikgKChSZWxhYmVsVHlwZSAqKSBsZWZ0ZXhwciktPmFy ZzsKKwkJaWYgKHJpZ2h0ZXhwciAmJiBJc0EocmlnaHRleHByLCBSZWxhYmVsVHlwZSkpCisJ CQlyaWdodGV4cHIgPSAoTm9kZSAqKSAoKFJlbGFiZWxUeXBlICopIHJpZ2h0ZXhwciktPmFy ZzsKKworCQkvKgorCQkgKiBRdWl0ZSBleHBlbnNpdmUgb3BlcmF0aW9uLCBuYXJyb3dpbmcg dGhlIHVzZSBjYXNlLiBGb3IgZXhhbXBsZSwgd2hlbgorCQkgKiB3ZSBoYXZlIGNhc3Qgb2Yg dGhlIHNhbWUgdmFyIHRvIGRpZmZlcmVudCAoYnV0IGNvbXBhdGlibGUpIHR5cGVzLgorCQkg Ki8KKwkJcmVwbGFjZV92YXJubyhyaWdodGV4cHIsIGJtc19zaW5nbGV0b25fbWVtYmVyKHJp bmZvLT5yaWdodF9yZWxpZHMpLAorCQkJCQkgIGJtc19zaW5nbGV0b25fbWVtYmVyKHJpbmZv LT5sZWZ0X3JlbGlkcykpOworCisJCWlmIChlcXVhbChsZWZ0ZXhwciwgcmlnaHRleHByKSkK KwkJCXNqb2lucXVhbHMgPSBsYXBwZW5kKHNqb2lucXVhbHMsIHJpbmZvKTsKKwkJZWxzZQor CQkJb2pvaW5xdWFscyA9IGxhcHBlbmQob2pvaW5xdWFscywgcmluZm8pOworCX0KKworCSpz ZWxmam9pbnF1YWxzID0gc2pvaW5xdWFsczsKKwkqb3RoZXJqb2lucXVhbHMgPSBvam9pbnF1 YWxzOworfQorCisvKgorICogQ2hlY2sgZm9yIGEgY2FzZSB3aGVuIHVuaXF1ZW5lc3MgW3Bh cnRseV0gZGVyaXZlZCBmcm9tIGEgYmFzZXJlc3RyaWN0aW5mbworICogY2xhdXNlLiBJbiB0 aGlzIGNhc2Ugd2UgaGF2ZSBhIGNoYW5jZSB0byByZXR1cm4gb25seSBvbmUgcm93IChpZiBz dWNoCisgKiBjbGF1c2VzIG9uIGJvdGggc2lkZXMgb2YgU0ogaXMgZXF1YWwpIG9yIG5vdGhp bmcgLSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQuCisgKi8KK3N0YXRpYyBib29sCittYXRjaF91 bmlxdWVfY2xhdXNlcyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqb3V0ZXIsIExp c3QgKnVjbGF1c2VzLAorCQkJCQkgSW5kZXggcmVsaWQpCit7CisJTGlzdENlbGwgICAqbGM7 CisKKwlmb3JlYWNoKGxjLCB1Y2xhdXNlcykKKwl7CisJCVJlc3RyaWN0SW5mbyAgICpyaW5m byA9IGxmaXJzdF9ub2RlKFJlc3RyaWN0SW5mbywgbGMpOworCQlFeHByCQkgICAqY2xhdXNl OworCQlOb2RlCQkgICAqaWNsYXVzZTsKKwkJTm9kZQkJICAgKmMxOworCQlib29sCQkJbWF0 Y2hlZCA9IGZhbHNlOworCQlMaXN0Q2VsbAkgICAqb2xjOworCisJCUFzc2VydChvdXRlci0+ cmVsaWQgPiAwICYmIHJlbGlkID4gMCk7CisKKwkJLyogT25seSBmaWx0ZXJzIGxpa2UgZihS LngxLC4uLixSLnhOKSA9PSBleHByIHdlIHNob3VsZCBjb25zaWRlci4gKi8KKwkJQXNzZXJ0 KGJtc19pc19lbXB0eShyaW5mby0+bGVmdF9yZWxpZHMpIF4KKwkJCSAgIGJtc19pc19lbXB0 eShyaW5mby0+cmlnaHRfcmVsaWRzKSk7CisKKwkJY2xhdXNlID0gKEV4cHIgKikgY29weU9i amVjdChyaW5mby0+Y2xhdXNlKTsKKwkJcmVwbGFjZV92YXJubygoTm9kZSAqKSBjbGF1c2Us IHJlbGlkLCBvdXRlci0+cmVsaWQpOworCisJCWljbGF1c2UgPSBibXNfaXNfZW1wdHkocmlu Zm8tPmxlZnRfcmVsaWRzKSA/IGdldF9yaWdodG9wKGNsYXVzZSkgOgorCQkJCQkJCQkJCQkJ CSBnZXRfbGVmdG9wKGNsYXVzZSk7CisJCWMxID0gYm1zX2lzX2VtcHR5KHJpbmZvLT5sZWZ0 X3JlbGlkcykgPyBnZXRfbGVmdG9wKGNsYXVzZSkgOgorCQkJCQkJCQkJCQkJZ2V0X3JpZ2h0 b3AoY2xhdXNlKTsKKworCQkvKgorCQkgKiBDb21wYXJlIHRoZXNlIGxlZnQgYW5kIHJpZ2h0 IHNpZGVzIHdpdGggY29ycmVzcG9uZGluZyBzaWRlcyBvZiB0aGUKKwkJICogb3V0ZXIncyBm aWx0ZXJzLiBJZiBubyBvbmUgZGV0ZWN0ZWQgLSByZXR1cm4gaW1tZWRpYXRlbHkuCisJCSAq LworCQlmb3JlYWNoKG9sYywgb3V0ZXItPmJhc2VyZXN0cmljdGluZm8pCisJCXsKKwkJCVJl c3RyaWN0SW5mbyAqb3JpbmZvID0gbGZpcnN0X25vZGUoUmVzdHJpY3RJbmZvLCBvbGMpOwor CQkJTm9kZQkJICpvY2xhdXNlOworCQkJTm9kZQkJICpjMjsKKworCQkJaWYgKG9yaW5mby0+ bWVyZ2VvcGZhbWlsaWVzID09IE5JTCkKKwkJCQkvKiBEb24ndCBjb25zaWRlciBjbGF1c2Vz IHdoaWNoIGFyZW4ndCBzaW1pbGFyIHRvICdGKFgpPUcoWSknICovCisJCQkJY29udGludWU7 CisKKwkJCW9jbGF1c2UgPSBibXNfaXNfZW1wdHkob3JpbmZvLT5sZWZ0X3JlbGlkcykgPwor CQkJCQlnZXRfcmlnaHRvcChvcmluZm8tPmNsYXVzZSkgOiBnZXRfbGVmdG9wKG9yaW5mby0+ Y2xhdXNlKTsKKwkJCWMyID0gKGJtc19pc19lbXB0eShvcmluZm8tPmxlZnRfcmVsaWRzKSA/ CisJCQkJICAgZ2V0X2xlZnRvcChvcmluZm8tPmNsYXVzZSkgOiBnZXRfcmlnaHRvcChvcmlu Zm8tPmNsYXVzZSkpOworCisJCQlpZiAoZXF1YWwoaWNsYXVzZSwgb2NsYXVzZSkgJiYgZXF1 YWwoYzEsIGMyKSkKKwkJCXsKKwkJCQltYXRjaGVkID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJ CX0KKwkJfQorCisJCWlmICghbWF0Y2hlZCkKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwly ZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIEZpbmQgYW5kIHJlbW92ZSB1bmlxdWUgc2VsZiBq b2lucyBpbiBhIGdyb3VwIG9mIGJhc2UgcmVsYXRpb25zIHRoYXQgaGF2ZQorICogdGhlIHNh bWUgT2lkLgorICoKKyAqIFJldHVybnMgYSBzZXQgb2YgcmVsaWRzIHRoYXQgd2VyZSByZW1v dmVkLgorICovCitzdGF0aWMgUmVsaWRzCityZW1vdmVfc2VsZl9qb2luc19vbmVfZ3JvdXAo UGxhbm5lckluZm8gKnJvb3QsIFJlbGlkcyByZWxpZHMpCit7CisJUmVsaWRzCQlyZXN1bHQg PSBOVUxMOworCWludAkJCWs7CQkJCS8qIEluZGV4IG9mIGtlcHQgcmVsYXRpb24gKi8KKwlp bnQJCQlyID0gLTE7CQkJLyogSW5kZXggb2YgcmVtb3ZlZCByZWxhdGlvbiAqLworCisJd2hp bGUgKChyID0gYm1zX25leHRfbWVtYmVyKHJlbGlkcywgcikpID4gMCkKKwl7CisJCVJlbE9w dEluZm8gKmlubmVyID0gcm9vdC0+c2ltcGxlX3JlbF9hcnJheVtyXTsKKworCQlrID0gcjsK KworCQl3aGlsZSAoKGsgPSBibXNfbmV4dF9tZW1iZXIocmVsaWRzLCBrKSkgPiAwKQorCQl7 CisJCQlSZWxpZHMJCQlqb2lucmVsaWRzID0gTlVMTDsKKwkJCVJlbE9wdEluZm8JICAgKm91 dGVyID0gcm9vdC0+c2ltcGxlX3JlbF9hcnJheVtrXTsKKwkJCUxpc3QJCSAgICpyZXN0cmlj dGxpc3Q7CisJCQlMaXN0CQkgICAqc2VsZmpvaW5xdWFsczsKKwkJCUxpc3QJCSAgICpvdGhl cmpvaW5xdWFsczsKKwkJCUxpc3RDZWxsCSAgICpsYzsKKwkJCWJvb2wJCQlqaW5mb19jaGVj ayA9IHRydWU7CisJCQlQbGFuUm93TWFyawkgICAqb21hcmsgPSBOVUxMOworCQkJUGxhblJv d01hcmsJICAgKmltYXJrID0gTlVMTDsKKwkJCUxpc3QJCSAgICp1Y2xhdXNlcyA9IE5JTDsK KworCQkJLyogQSBzYW5pdHkgY2hlY2s6IHRoZSByZWxhdGlvbnMgaGF2ZSB0aGUgc2FtZSBP aWQuICovCisJCQlBc3NlcnQocm9vdC0+c2ltcGxlX3J0ZV9hcnJheVtrXS0+cmVsaWQgPT0K KwkJCQkgICByb290LT5zaW1wbGVfcnRlX2FycmF5W3JdLT5yZWxpZCk7CisKKwkJCS8qCisJ CQkgKiBJdCBpcyBpbXBvc3NpYmxlIHRvIGVsaW1pbmF0ZSBqb2luIG9mIHR3byByZWxhdGlv bnMgaWYgdGhleQorCQkJICogYmVsb25nIHRvIGRpZmZlcmVudCBydWxlcyBvZiBvcmRlci4g T3RoZXJ3aXNlIHBsYW5uZXIgY2FuJ3QKKwkJCSAqIGJlIGFibGUgdG8gZmluZCBhbnkgdmFy aWFudHMgb2YgY29ycmVjdCBxdWVyeSBwbGFuLgorCQkJICovCisJCQlmb3JlYWNoKGxjLCBy b290LT5qb2luX2luZm9fbGlzdCkKKwkJCXsKKwkJCQlTcGVjaWFsSm9pbkluZm8gKmluZm8g PSAoU3BlY2lhbEpvaW5JbmZvICopIGxmaXJzdChsYyk7CisKKwkJCQlpZiAoKGJtc19pc19t ZW1iZXIoaywgaW5mby0+c3luX2xlZnRoYW5kKSBeCisJCQkJCSBibXNfaXNfbWVtYmVyKHIs IGluZm8tPnN5bl9sZWZ0aGFuZCkpIHx8CisJCQkJCShibXNfaXNfbWVtYmVyKGssIGluZm8t PnN5bl9yaWdodGhhbmQpIF4KKwkJCQkJIGJtc19pc19tZW1iZXIociwgaW5mby0+c3luX3Jp Z2h0aGFuZCkpKQorCQkJCXsKKwkJCQkJamluZm9fY2hlY2sgPSBmYWxzZTsKKwkJCQkJYnJl YWs7CisJCQkJfQorCQkJfQorCQkJaWYgKCFqaW5mb19jaGVjaykKKwkJCQljb250aW51ZTsK KworCQkJLyoKKwkJCSAqIENoZWNrIFJvdyBNYXJrcyBlcXVpdmFsZW5jZS4KKwkJCSAqIFdl IGNhbid0IHJlbW92ZSB0aGUgam9pbiBpZiB0aGUgcmVsYXRpb25zIGhhdmUgcm93IG1hcmtz IG9mCisJCQkgKiBkaWZmZXJlbnQgc3RyZW5ndGggKGUuZy4gb25lIGlzIGxvY2tlZCBGT1Ig VVBEQVRFIGFuZCBhbm90aGVyCisJCQkgKiBqdXN0IGhhcyBST1dfTUFSS19SRUZFUkVOQ0Ug Zm9yIEV2YWxQbGFuUXVhbCByZWNoZWNraW5nKS4KKwkJCSAqLworCQkJZm9yZWFjaChsYywg cm9vdC0+cm93TWFya3MpCisJCQl7CisJCQkJUGxhblJvd01hcmsgKnJvd01hcmsgPSAoUGxh blJvd01hcmsgKikgbGZpcnN0KGxjKTsKKworCQkJCWlmIChyb3dNYXJrLT5ydGkgPT0gaykK KwkJCQl7CisJCQkJCUFzc2VydChpbWFyayA9PSBOVUxMKTsKKwkJCQkJaW1hcmsgPSByb3dN YXJrOworCQkJCX0KKwkJCQllbHNlIGlmIChyb3dNYXJrLT5ydGkgPT0gcikKKwkJCQl7CisJ CQkJCUFzc2VydChvbWFyayA9PSBOVUxMKTsKKwkJCQkJb21hcmsgPSByb3dNYXJrOworCQkJ CX0KKworCQkJCWlmIChvbWFyayAmJiBpbWFyaykKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlp ZiAob21hcmsgJiYgaW1hcmsgJiYgb21hcmstPm1hcmtUeXBlICE9IGltYXJrLT5tYXJrVHlw ZSkKKwkJCQljb250aW51ZTsKKworCQkJLyoKKwkJCSAqIFdlIG9ubHkgZGVhbCB3aXRoIGJh c2UgcmVscyBoZXJlLCBzbyB0aGVpciByZWxpZHMgYml0c2V0CisJCQkgKiBjb250YWlucyBv bmx5IG9uZSBtZW1iZXIgLS0gdGhlaXIgcmVsaWQuCisJCQkgKi8KKwkJCWpvaW5yZWxpZHMg PSBibXNfYWRkX21lbWJlcihqb2lucmVsaWRzLCByKTsKKwkJCWpvaW5yZWxpZHMgPSBibXNf YWRkX21lbWJlcihqb2lucmVsaWRzLCBrKTsKKworCQkJLyoKKwkJCSAqIEJlIHNhZmUgdG8g ZG8gbm90IHJlbW92ZSB0YWJsZSBwYXJ0aWNpcGF0ZWQgaW4gY29tcGxpY2F0ZWQgUEgKKwkJ CSAqLworCQkJZm9yZWFjaChsYywgcm9vdC0+cGxhY2Vob2xkZXJfbGlzdCkKKwkJCXsKKwkJ CQlQbGFjZUhvbGRlckluZm8gKnBoaW5mbyA9IChQbGFjZUhvbGRlckluZm8gKikgbGZpcnN0 KGxjKTsKKworCQkJCS8qIHRoZXJlIGlzbid0IGFueSBvdGhlciBwbGFjZSB0byBldmFsIFBI ViAqLworCQkJCWlmIChibXNfaXNfc3Vic2V0KHBoaW5mby0+cGhfZXZhbF9hdCwgam9pbnJl bGlkcykgfHwKKwkJCQkJYm1zX2lzX3N1YnNldChwaGluZm8tPnBoX25lZWRlZCwgam9pbnJl bGlkcykpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGxjKQorCQkJCWNvbnRpbnVlOwor CisJCQkvKgorCQkJICogQXQgdGhpcyBzdGFnZSBqb2luaW5mbyBsaXN0cyBvZiBpbm5lciBh bmQgb3V0ZXIgY2FuIGNvbnRhaW4KKwkJCSAqIG9ubHkgY2xhdXNlcywgcmVxdWlyZWQgZm9y IGEgc3VwZXJpb3Igb3V0ZXIgam9pbiB0aGF0IGNhbid0CisJCQkgKiBpbmZsdWVuY2Ugb24g dGhpcyBvcHRpbWl6YXRpb24uIFNvLCB3ZSBjYW4gYXZvaWQgdG8gY2FsbCB0aGUKKwkJCSAq IGJ1aWxkX2pvaW5yZWxfcmVzdHJpY3RsaXN0KCkgcm91dGluZS4KKwkJCSAqLworCQkJcmVz dHJpY3RsaXN0ID0gZ2VuZXJhdGVfam9pbl9pbXBsaWVkX2VxdWFsaXRpZXMocm9vdCwgam9p bnJlbGlkcywKKwkJCQkJCQkJCQkJCQkJCWlubmVyLT5yZWxpZHMsCisJCQkJCQkJCQkJCQkJ CQlvdXRlciwgTlVMTCk7CisKKwkJCS8qCisJCQkgKiBQcm9jZXNzIHJlc3RyaWN0bGlzdCB0 byBzZXBlcmF0ZSB0aGUgc2VsZiBqb2luIHF1YWxzIG91dCBvZgorCQkJICogdGhlIG90aGVy IHF1YWxzLiBlLmcgeCA9IHggZ29lcyB0byBzZWxmam9pbnF1YWxzIGFuZCBhID0gYiB0bwor CQkJICogb3RoZXJqb2lucXVhbHMuCisJCQkgKi8KKwkJCXNwbGl0X3NlbGZqb2luX3F1YWxz KHJvb3QsIHJlc3RyaWN0bGlzdCwgJnNlbGZqb2lucXVhbHMsCisJCQkJCQkJCSAmb3RoZXJq b2lucXVhbHMsIGlubmVyLT5yZWxpZCwgb3V0ZXItPnJlbGlkKTsKKworCQkJLyoKKwkJCSAq IFRvIGVuYWJsZSBTSkUgZm9yIHRoZSBvbmx5IGRlZ2VuZXJhdGUgY2FzZSB3aXRob3V0IGFu eSBzZWxmIGpvaW4KKwkJCSAqIGNsYXVzZXMgYXQgYWxsLCBhZGQgYmFzZXJlc3RyaWN0aW5m byB0byB0aGlzIGxpc3QuCisJCQkgKiBEZWdlbmVyYXRlIGNhc2Ugd29ya3Mgb25seSBpZiBi b3RoIHNpZGVzIGhhdmUgdGhlIHNhbWUgY2xhdXNlLiBTbworCQkJICogZG9lc24ndCBtYXR0 ZXIgd2hpY2ggc2lkZSB0byBhZGQuCisJCQkgKi8KKwkJCXNlbGZqb2lucXVhbHMgPSBsaXN0 X2NvbmNhdChzZWxmam9pbnF1YWxzLCBvdXRlci0+YmFzZXJlc3RyaWN0aW5mbyk7CisKKwkJ CS8qCisJCQkgKiBEZXRlcm1pbmUgaWYgdGhlIGlubmVyIHRhYmxlIGNhbiBkdXBsaWNhdGUg b3V0ZXIgcm93cy4gIFdlIG11c3QKKwkJCSAqIGJ5cGFzcyB0aGUgdW5pcXVlIHJlbCBjYWNo ZSBoZXJlIHNpbmNlIHdlJ3JlIHBvc3NpYmx5IHVzaW5nIGEKKwkJCSAqIHN1YnNldCBvZiBq b2luIHF1YWxzLiBXZSBjYW4gdXNlICdmb3JjZV9jYWNoZScgPSB0cnVlIHdoZW4gYWxsCisJ CQkgKiBqb2luIHF1YWxzIGFyZSBzZWxmam9pbiBxdWFscy4gIE90aGVyd2lzZSB3ZSBjb3Vs ZCBlbmQgdXAKKwkJCSAqIHB1dHRpbmcgZmFsc2UgbmVnYXRpdmVzIGluIHRoZSBjYWNoZS4K KwkJCSAqLworCQkJaWYgKCFpbm5lcnJlbF9pc191bmlxdWVfZXh0KHJvb3QsIGpvaW5yZWxp ZHMsIGlubmVyLT5yZWxpZHMsCisJCQkJCQkJCQkJb3V0ZXIsIEpPSU5fSU5ORVIsIHNlbGZq b2lucXVhbHMsCisJCQkJCQkJCQkJbGlzdF9sZW5ndGgob3RoZXJqb2lucXVhbHMpID09IDAs CisJCQkJCQkJCQkJJnVjbGF1c2VzKSkKKwkJCQljb250aW51ZTsKKworCQkJLyoKKwkJCSAq IFdlIGhhdmUgcHJvdmVuIHRoYXQgZm9yIGJvdGggcmVsYXRpb25zLCB0aGUgc2FtZSB1bmlx dWUgaW5kZXgKKwkJCSAqIGd1YXJhbnRlZXMgdGhhdCB0aGVyZSBpcyBhdCBtb3N0IG9uZSBy b3cgd2hlcmUgY29sdW1ucyBlcXVhbAorCQkJICogZ2l2ZW4gdmFsdWVzLiBUaGVzZSB2YWx1 ZXMgbXVzdCBiZSB0aGUgc2FtZSBmb3IgYm90aCByZWxhdGlvbnMsCisJCQkgKiBvciBlbHNl IHdlIHdvbid0IG1hdGNoIHRoZSBzYW1lIHJvdyBvbiBlYWNoIHNpZGUgb2YgdGhlIGpvaW4u CisJCQkgKi8KKwkJCWlmICghbWF0Y2hfdW5pcXVlX2NsYXVzZXMocm9vdCwgaW5uZXIsIHVj bGF1c2VzLCBvdXRlci0+cmVsaWQpKQorCQkJCWNvbnRpbnVlOworCisJCQkvKgorCQkJICog V2UgY2FuIHJlbW92ZSBlaXRoZXIgcmVsYXRpb24sIHNvIHJlbW92ZSB0aGUgaW5uZXIsIHRv CisJCQkgKiBzaW1wbGlmeSB0aGlzIGxvb3AuCisJCQkgKi8KKwkJCXJlbW92ZV9zZWxmX2pv aW5fcmVsKHJvb3QsIG9tYXJrLCBpbWFyaywgb3V0ZXIsIGlubmVyLCByZXN0cmljdGxpc3Qp OworCisJCQlyZXN1bHQgPSBibXNfYWRkX21lbWJlcihyZXN1bHQsIHIpOworCisJCQkvKiBX ZSByZW1vdmVkIHRoZSBvdXRlciByZWxhdGlvbiwgdHJ5IHRoZSBuZXh0IG9uZS4gKi8KKwkJ CWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIEdhdGhl ciBpbmRleGVzIG9mIGJhc2UgcmVsYXRpb25zIGZyb20gdGhlIGpvaW5saXN0IGFuZCB0cnkg dG8gZWxpbWluYXRlIHNlbGYKKyAqIGpvaW5zLiBUbyBhdm9pZCBjb21wbGV4aXR5LCBsaW1p dCB0aGUgbWF4IHBvd2VyIG9mIHRoaXMgc2V0IGJ5IGEgR1VDLgorICovCitzdGF0aWMgUmVs aWRzCityZW1vdmVfc2VsZl9qb2luc19yZWN1cnNlKFBsYW5uZXJJbmZvICpyb290LCBMaXN0 ICpqb2lubGlzdCwgUmVsaWRzIFRvUmVtb3ZlKQoreworCUxpc3RDZWxsICAgKmpsOworCVJl bGlkcwkJcmVsaWRzID0gTlVMTDsKKworCS8qIENvbGxlY3QgaW5kZXhlcyBvZiBiYXNlIHJl bGF0aW9ucyBvZiB0aGUgam9pbiB0cmVlICovCisJZm9yZWFjaChqbCwgam9pbmxpc3QpCisJ eworCQlOb2RlICAgKmpsbm9kZSA9IChOb2RlICopIGxmaXJzdChqbCk7CisKKwkJaWYgKElz QShqbG5vZGUsIFJhbmdlVGJsUmVmKSkKKwkJeworCQkJUmFuZ2VUYmxSZWYJICAgKnJlZiA9 IChSYW5nZVRibFJlZiAqKSBqbG5vZGU7CisJCQlSYW5nZVRibEVudHJ5ICAqcnRlID0gcm9v dC0+c2ltcGxlX3J0ZV9hcnJheVtyZWYtPnJ0aW5kZXhdOworCisJCQkvKgorCQkJICogV2Ug b25seSBjYXJlIGFib3V0IGJhc2UgcmVsYXRpb25zIGZyb20gd2hpY2ggd2Ugc2VsZWN0CisJ CQkgKiBzb21ldGhpbmcuCisJCQkgKi8KKwkJCWlmIChydGUtPnJ0ZWtpbmQgPT0gUlRFX1JF TEFUSU9OICYmCisJCQkJcnRlLT5yZWxraW5kID09IFJFTEtJTkRfUkVMQVRJT04gJiYKKwkJ CQlyb290LT5zaW1wbGVfcmVsX2FycmF5W3JlZi0+cnRpbmRleF0gIT0gTlVMTCkKKwkJCXsK KwkJCQlBc3NlcnQoIWJtc19pc19tZW1iZXIocmVmLT5ydGluZGV4LCByZWxpZHMpKTsKKwkJ CQlyZWxpZHMgPSBibXNfYWRkX21lbWJlcihyZWxpZHMsIHJlZi0+cnRpbmRleCk7CisJCQl9 CisJCX0KKwkJZWxzZSBpZiAoSXNBKGpsbm9kZSwgTGlzdCkpCisJCQkvKiBSZWN1cnNpdmVs eSBnbyBpbnNpZGUgdGhlIHN1Yi1qb2lubGlzdCAqLworCQkJVG9SZW1vdmUgPSByZW1vdmVf c2VsZl9qb2luc19yZWN1cnNlKHJvb3QsIChMaXN0ICopIGpsbm9kZSwKKwkJCQkJCQkJCQkJ CSBUb1JlbW92ZSk7CisJCWVsc2UKKwkJCWVsb2coRVJST1IsICJ1bnJlY29nbml6ZWQgam9p bmxpc3Qgbm9kZSB0eXBlOiAlZCIsCisJCQkJIChpbnQpIG5vZGVUYWcoamxub2RlKSk7CisK KwkJLyoKKwkJICogTGltaXQgdGhlIG51bWJlciBvZiBqb2lucyB3ZSBwcm9jZXNzIHRvIGNv bnRyb2wgdGhlCisJCSAqIHF1YWRyYXRpYyBiZWhhdmlvci4KKwkJICovCisJCWlmIChibXNf bnVtX21lbWJlcnMocmVsaWRzKSA+PSBzZWxmX2pvaW5fc2VhcmNoX2xpbWl0KQorCQkJYnJl YWs7CisJfQorCisJLyoKKwkgKiBJdGVyYXRpdmVseSBmb3JtIGEgZ3JvdXAgb2YgcmVsYXRp b24gaW5kZXhlcyB3aXRoIHRoZSBzYW1lIG9pZCBhbmQgbGF1bmNoCisJICogdGhlIHJvdXRp bmUgdGhhdCBkZXRlY3RzIHNlbGYtam9pbnMgaW4gdGhpcyBncm91cCBhbmQgcmVtb3ZlcyBl eGNlc3NpdmUKKwkgKiByYW5nZSB0YWJsZSBlbnRyaWVzLgorCSAqCisJICogQXQgdGhlIGVu ZCBvZiBpdGVyYXRpb24sIGV4Y2x1ZGUgdGhlIGdyb3VwIGZyb20gdGhlIG92ZXJhbGwgcmVs aWRzIGxpc3QuCisJICogU28gZWFjaCBuZXh0IGl0ZXJhdGlvbiBvZiB0aGUgY3ljbGUgd2ls bCBpbnZvbHZlIGxlc3MgYW5kIGxlc3MgdmFsdWUgb2YKKwkgKiByZWxpZHMuCisJICovCisJ aWYgKGJtc19udW1fbWVtYmVycyhyZWxpZHMpID49IDIpCisJeworCQlpbnQJCWkgPSAtMTsK KworCQl3aGlsZSAoKGkgPSBibXNfbmV4dF9tZW1iZXIocmVsaWRzLCBpKSkgPj0gMCkKKwkJ eworCQkJUmVsaWRzCWdyb3VwID0gTlVMTDsKKwkJCU9pZAkJZ3JvdXBPaWQ7CisJCQlpbnQJ CWogPSBpOworCisJCQlncm91cE9pZCA9IHJvb3QtPnNpbXBsZV9ydGVfYXJyYXlbaV0tPnJl bGlkOworCQkJQXNzZXJ0KE9pZElzVmFsaWQoZ3JvdXBPaWQpKTsKKwkJCWdyb3VwID0gYm1z X2FkZF9tZW1iZXIoZ3JvdXAsIGkpOworCisJCQkvKiBDcmVhdGUgZ3JvdXAgb2YgcmVsYXRp b24gaW5kZXhlcyB3aXRoIHRoZSBzYW1lIG9pZC4gKi8KKwkJCXdoaWxlICgoaiA9IGJtc19u ZXh0X21lbWJlcihyZWxpZHMsIGopKSA+PSAwKQorCQkJeworCQkJCVJhbmdlVGJsRW50cnkg KnJ0ZSA9IHJvb3QtPnNpbXBsZV9ydGVfYXJyYXlbal07CisKKwkJCQlBc3NlcnQoT2lkSXNW YWxpZChydGUtPnJlbGlkKSk7CisKKwkJCQlpZiAocnRlLT5yZWxpZCA9PSBncm91cE9pZCkK KwkJCQkJZ3JvdXAgPSBibXNfYWRkX21lbWJlcihncm91cCwgaik7CisJCQl9CisKKwkJCXJl bGlkcyA9IGJtc19kZWxfbWVtYmVycyhyZWxpZHMsIGdyb3VwKTsKKwkJCVRvUmVtb3ZlID0g Ym1zX2FkZF9tZW1iZXJzKFRvUmVtb3ZlLAorCQkJCQkJCQkJICAgcmVtb3ZlX3NlbGZfam9p bnNfb25lX2dyb3VwKHJvb3QsIGdyb3VwKSk7CisKKwkJCWJtc19mcmVlKGdyb3VwKTsKKwkJ fQorCisJCUFzc2VydChibXNfaXNfZW1wdHkocmVsaWRzKSk7CisJfQorCisJcmV0dXJuIFRv UmVtb3ZlOworfQorCisvKgorICogRmluZCBhbmQgcmVtb3ZlIHVzZWxlc3Mgc2VsZiBqb2lu cy4KKyAqCisgKiBTZWFyY2ggZm9yIGpvaW5zIHdoZXJlIGEgcmVsYXRpb24gaXMgam9pbmVk IHRvIGl0c2VsZi4gSWYgdGhlIGpvaW4gY2xhdXNlIGZvcgorICogZWFjaCB0dXBsZSBmcm9t IG9uZSBzaWRlIG9mIHRoZSBqb2luIGlzIHByb3ZlbiB0byBtYXRjaCB0aGUgc2FtZSBwaHlz aWNhbCByb3cKKyAqIChvciBub3RoaW5nKSBvbiB0aGUgb3RoZXIgc2lkZSwgdGhhdCBzZWxm LWpvaW4gY2FuIGJlIGVsaW1pbmF0ZWQgZnJvbSB0aGUKKyAqIHF1ZXJ5LgorICogU3VpdGFi bGUgam9pbiBjbGF1c2VzIGFzc3VtZSB0aGUgZm9ybSBvZiBYID0gWCBhbmQgY2FuIGJlIHJl cGxhY2VkIHdpdGgKKyAqIE5PVCBOVUxMIGNsYXVzZXMuCisgKgorICogRm9yIHRoZSBzYWtl IG9mIHNpbXBsaWNpdHksIHdlIGRvbid0IGFwcGx5IHRoaXMgb3B0aW1pemF0aW9uIHRvIHNw ZWNpYWwKKyAqIGpvaW5zLiBIZXJlIGlzIGEgbGlzdCBvZiB3aGF0IHdlIGNvdWxkIGRvIGlu IHNvbWUgcGFydGljdWxhciBjYXNlczoKKyAqICdhIGExIHNlbWkgam9pbiBhIGEyJzogaXMg cmVkdWNlZCB0byBpbm5lciBieSByZWR1Y2VfdW5pcXVlX3NlbWlqb2lucywKKyAqIGFuZCB0 aGVuIHJlbW92ZWQgbm9ybWFsbHkuCisgKiAnYSBhMSBhbnRpIGpvaW4gYSBhMic6IGNvdWxk IHNpbXBsaWZ5IHRvIGEgc2NhbiB3aXRoICdvdXRlciBxdWFscyBBTkQKKyAqIChJUyBOVUxM IG9uIGpvaW4gY29sdW1ucyBPUiBOT1QgaW5uZXIgcXVhbHMpJy4KKyAqICdhIGExIGxlZnQg am9pbiBhIGEyJzogY291bGQgc2ltcGxpZnkgdG8gYSBzY2FuIGxpa2UgaW5uZXIsIGJ1dCB3 aXRob3V0CisgKiBOT1QgTlVMTCBjb25kaXRpb25zIG9uIGpvaW4gY29sdW1ucy4KKyAqICdh IGExIGxlZnQgam9pbiAoYSBhMiBqb2luIGIpJzogY2FuJ3Qgc2ltcGxpZnkgdGhpcywgYmVj YXVzZSBqb2luIHRvIGIKKyAqIGNhbiBib3RoIHJlbW92ZSByb3dzIGFuZCBpbnRyb2R1Y2Ug ZHVwbGljYXRlcy4KKyAqCisgKiBUbyBzZWFyY2ggZm9yIHJlbW92YWJsZSBqb2lucywgd2Ug b3JkZXIgYWxsIHRoZSByZWxhdGlvbnMgb24gdGhlaXIgT2lkLAorICogZ28gb3ZlciBlYWNo IHNldCB3aXRoIHRoZSBzYW1lIE9pZCwgYW5kIGNvbnNpZGVyIGVhY2ggcGFpciBvZiByZWxh dGlvbnMKKyAqIGluIHRoaXMgc2V0LgorICoKKyAqIFRvIHJlbW92ZSB0aGUgam9pbiwgd2Ug bWFyayBvbmUgb2YgdGhlIHBhcnRpY2lwYXRpbmcgcmVsYXRpb25zIGFzCisgKiBkZWFkLCBh bmQgcmV3cml0ZSBhbGwgcmVmZXJlbmNlcyB0byBpdCB0byBwb2ludCB0byB0aGUgcmVtYWlu aW5nCisgKiByZWxhdGlvbi4gVGhpcyBpbmNsdWRlcyBtb2RpZnlpbmcgUmVzdHJpY3RJbmZv cywgRXF1aXZhbGVuY2VDbGFzc2VzIGFuZAorICogRXF1aXZhbGVuY2VNZW1iZXJzLiBXZSBh bHNvIGhhdmUgdG8gbW9kaWZ5IHRoZSByb3cgbWFya3MuIFRoZSBqb2luIGNsYXVzZXMKKyAq IG9mIHRoZSByZW1vdmVkIHJlbGF0aW9uIGJlY29tZSBlaXRoZXIgcmVzdHJpY3Rpb24gb3Ig am9pbiBjbGF1c2VzLCBiYXNlZCBvbgorICogd2hldGhlciB0aGV5IHJlZmVyZW5jZSBhbnkg cmVsYXRpb25zIG5vdCBwYXJ0aWNpcGF0aW5nIGluIHRoZSByZW1vdmVkIGpvaW4uCisgKgor ICogJ3RhcmdldGxpc3QnIGlzIHRoZSB0b3AtbGV2ZWwgdGFyZ2V0bGlzdCBvZiBxdWVyeS4g SWYgaXQgaGFzIGFueSByZWZlcmVuY2VzCisgKiB0byB0aGUgcmVtb3ZlZCByZWxhdGlvbnMs IHdlIHVwZGF0ZSB0aGVtIHRvIHBvaW50IHRvIHRoZSByZW1haW5pbmcgb25lcy4KKyAqLwor TGlzdCAqCityZW1vdmVfdXNlbGVzc19zZWxmX2pvaW5zKFBsYW5uZXJJbmZvICpyb290LCBM aXN0ICpqb2lubGlzdCkKK3sKKwlSZWxpZHMJVG9SZW1vdmUgPSBOVUxMOworCWludAkJcmVs aWQgPSAtMTsKKworCWlmICghZW5hYmxlX3NlbGZfam9pbl9yZW1vdmFsKQorCQlyZXR1cm4g am9pbmxpc3Q7CisKKwkvKgorCSAqIE1lcmdlIHBhaXJzIG9mIHJlbGF0aW9ucyBwYXJ0aWNp cGF0ZWQgaW4gc2VsZi1qb2luLiBSZW1vdmUgdW5uZWNlc3NhcnkKKwkgKiByYW5nZSB0YWJs ZSBlbnRyaWVzLgorCSAqLworCVRvUmVtb3ZlID0gcmVtb3ZlX3NlbGZfam9pbnNfcmVjdXJz ZShyb290LCBqb2lubGlzdCwgVG9SZW1vdmUpOworCisJaWYgKHVubGlrZWx5KFRvUmVtb3Zl ICE9IE5VTEwpKQorCXsKKwkJaW50CW5yZW1vdmVkID0gMDsKKworCQkvKiBBdCB0aGUgZW5k LCByZW1vdmUgb3JwaGFuZWQgcmVsYXRpb24gbGlua3MgKi8KKwkJd2hpbGUgKChyZWxpZCA9 IGJtc19uZXh0X21lbWJlcihUb1JlbW92ZSwgcmVsaWQpKSA+PSAwKQorCQkJam9pbmxpc3Qg PSByZW1vdmVfcmVsX2Zyb21fam9pbmxpc3Qoam9pbmxpc3QsIHJlbGlkLCAmbnJlbW92ZWQp OworCX0KKworCXJldHVybiBqb2lubGlzdDsKIH0KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L29wdGltaXplci9wbGFuL3BsYW5tYWluLmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxh bi9wbGFubWFpbi5jCmluZGV4IGZjYzBlYWNkMjUuLmJlNWVmNzlhZjMgMTAwNjQ0Ci0tLSBh L3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3BsYW5tYWluLmMKKysrIGIvc3JjL2JhY2tl bmQvb3B0aW1pemVyL3BsYW4vcGxhbm1haW4uYwpAQCAtMjMxLDYgKzIzMSwxMSBAQCBxdWVy eV9wbGFubmVyKFBsYW5uZXJJbmZvICpyb290LAogCSAqLwogCXJlZHVjZV91bmlxdWVfc2Vt aWpvaW5zKHJvb3QpOwogCisJLyoKKwkgKiBSZW1vdmUgc2VsZiBqb2lucyBvbiBhIHVuaXF1 ZSBjb2x1bW4uCisJICovCisJam9pbmxpc3QgPSByZW1vdmVfdXNlbGVzc19zZWxmX2pvaW5z KHJvb3QsIGpvaW5saXN0KTsKKwogCS8qCiAJICogTm93IGRpc3RyaWJ1dGUgInBsYWNlaG9s ZGVycyIgdG8gYmFzZSByZWxzIGFzIG5lZWRlZC4gIFRoaXMgaGFzIHRvIGJlCiAJICogZG9u ZSBhZnRlciBqb2luIHJlbW92YWwgYmVjYXVzZSByZW1vdmFsIGNvdWxkIGNoYW5nZSB3aGV0 aGVyIGEKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxlcy5j IGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWNfdGFibGVzLmMKaW5kZXggYmRiMjZlMmI3 Ny4uMjJhNDk4YmMyMSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWNf dGFibGVzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWNfdGFibGVzLmMKQEAg LTEwMjYsNiArMTAyNiwxNiBAQCBzdHJ1Y3QgY29uZmlnX2Jvb2wgQ29uZmlndXJlTmFtZXNC b29sW10gPQogCQl0cnVlLAogCQlOVUxMLCBOVUxMLCBOVUxMCiAJfSwKKwl7CisJCXsiZW5h YmxlX3NlbGZfam9pbl9yZW1vdmFsIiwgUEdDX1VTRVJTRVQsIFFVRVJZX1RVTklOR19NRVRI T0QsCisJCQlnZXR0ZXh0X25vb3AoIkVuYWJsZSByZW1vdmFsIG9mIHVuaXF1ZSBzZWxmLWpv aW5zLiIpLAorCQkJTlVMTCwKKwkJCUdVQ19FWFBMQUlOIHwgR1VDX05PVF9JTl9TQU1QTEUK KwkJfSwKKwkJJmVuYWJsZV9zZWxmX2pvaW5fcmVtb3ZhbCwKKwkJdHJ1ZSwKKwkJTlVMTCwg TlVMTCwgTlVMTAorCX0sCiAJewogCQl7ImdlcW8iLCBQR0NfVVNFUlNFVCwgUVVFUllfVFVO SU5HX0dFUU8sCiAJCQlnZXR0ZXh0X25vb3AoIkVuYWJsZXMgZ2VuZXRpYyBxdWVyeSBvcHRp bWl6YXRpb24uIiksCkBAIC0yMDY3LDYgKzIwNzcsMTggQEAgc3RydWN0IGNvbmZpZ19pbnQg Q29uZmlndXJlTmFtZXNJbnRbXSA9CiAJCTgsIDEsIElOVF9NQVgsCiAJCU5VTEwsIE5VTEws IE5VTEwKIAl9LAorCXsKKwkJeyJzZWxmX2pvaW5fc2VhcmNoX2xpbWl0IiwgUEdDX1VTRVJT RVQsIFFVRVJZX1RVTklOR19PVEhFUiwKKwkJCWdldHRleHRfbm9vcCgiTWF4IHNpemUgb2Yg YSBncm91cCBvZiBwbGFpbiB0YWJsZXMgd2hlcmUgcGxhbm5lciAiCisJCQkJCQkgIndpbGwg bG9va3VwIGZvciBzZWxmIGpvaW5zLiIpLAorCQkJZ2V0dGV4dF9ub29wKCJJZiBhIG51bWJl ciBvZiB0YWJsZXMgaW4gRlJPTS1saXN0IGlzIGV4Y2VlZGVkIHRoaXMgIgorCQkJCQkJICJs aW1pdCwgdGhlIHBsYW5uZXIgd2lsbCBpZ25vcmUgdGFibGVzIGJleW9uZCBpdC4iKSwKKwkJ CUdVQ19FWFBMQUlOIHwgR1VDX05PVF9JTl9TQU1QTEUKKwkJfSwKKwkJJnNlbGZfam9pbl9z ZWFyY2hfbGltaXQsCisJCTMyLCAxLCBJTlRfTUFYLAorCQlOVUxMLCBOVUxMLCBOVUxMCisJ fSwKIAl7CiAJCXsiZ2Vxb190aHJlc2hvbGQiLCBQR0NfVVNFUlNFVCwgUVVFUllfVFVOSU5H X0dFUU8sCiAJCQlnZXR0ZXh0X25vb3AoIlNldHMgdGhlIHRocmVzaG9sZCBvZiBGUk9NIGl0 ZW1zIGJleW9uZCB3aGljaCBHRVFPIGlzIHVzZWQuIiksCmRpZmYgLS1naXQgYS9zcmMvaW5j bHVkZS9vcHRpbWl6ZXIvcGF0aHMuaCBiL3NyYy9pbmNsdWRlL29wdGltaXplci9wYXRocy5o CmluZGV4IDUwYmMzYjUwM2EuLjM3ZjU3N2U5YjAgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRl L29wdGltaXplci9wYXRocy5oCisrKyBiL3NyYy9pbmNsdWRlL29wdGltaXplci9wYXRocy5o CkBAIC03NSw2ICs3NSw5IEBAIGV4dGVybiB2b2lkIGNyZWF0ZV9pbmRleF9wYXRocyhQbGFu bmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsKTsKIGV4dGVybiBib29sIHJlbGF0aW9u X2hhc191bmlxdWVfaW5kZXhfZm9yKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpy ZWwsCiAJCQkJCQkJCQkJICBMaXN0ICpyZXN0cmljdGxpc3QsCiAJCQkJCQkJCQkJICBMaXN0 ICpleHBybGlzdCwgTGlzdCAqb3BybGlzdCk7CitleHRlcm4gYm9vbCByZWxhdGlvbl9oYXNf dW5pcXVlX2luZGV4X2V4dChQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAor CQkJCQkJCQkJCSAgTGlzdCAqcmVzdHJpY3RsaXN0LCBMaXN0ICpleHBybGlzdCwKKwkJCQkJ CQkJCQkgIExpc3QgKm9wcmxpc3QsIExpc3QgKipleHRyYV9jbGF1c2VzKTsKIGV4dGVybiBi b29sIGluZGV4Y29sX2lzX2Jvb2xfY29uc3RhbnRfZm9yX3F1ZXJ5KFBsYW5uZXJJbmZvICpy b290LAogCQkJCQkJCQkJCQkJSW5kZXhPcHRJbmZvICppbmRleCwKIAkJCQkJCQkJCQkJCWlu dCBpbmRleGNvbCk7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGxhbm1h aW4uaCBiL3NyYy9pbmNsdWRlL29wdGltaXplci9wbGFubWFpbi5oCmluZGV4IDMxYzE4ODE3 NmIuLjVmNDVmZmRhNTcgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wdGltaXplci9wbGFu bWFpbi5oCisrKyBiL3NyYy9pbmNsdWRlL29wdGltaXplci9wbGFubWFpbi5oCkBAIC0yMCw2 ICsyMCw4IEBACiAvKiBHVUMgcGFyYW1ldGVycyAqLwogI2RlZmluZSBERUZBVUxUX0NVUlNP Ul9UVVBMRV9GUkFDVElPTiAwLjEKIGV4dGVybiBQR0RMTElNUE9SVCBkb3VibGUgY3Vyc29y X3R1cGxlX2ZyYWN0aW9uOworZXh0ZXJuIFBHRExMSU1QT1JUIGJvb2wgZW5hYmxlX3NlbGZf am9pbl9yZW1vdmFsOworZXh0ZXJuIFBHRExMSU1QT1JUIGludCBzZWxmX2pvaW5fc2VhcmNo X2xpbWl0OwogCiAvKiBxdWVyeV9wbGFubmVyIGNhbGxiYWNrIHRvIGNvbXB1dGUgcXVlcnlf cGF0aGtleXMgKi8KIHR5cGVkZWYgdm9pZCAoKnF1ZXJ5X3BhdGhrZXlzX2NhbGxiYWNrKSAo UGxhbm5lckluZm8gKnJvb3QsIHZvaWQgKmV4dHJhKTsKQEAgLTEwNCw2ICsxMDYsMTEgQEAg ZXh0ZXJuIGJvb2wgcXVlcnlfaXNfZGlzdGluY3RfZm9yKFF1ZXJ5ICpxdWVyeSwgTGlzdCAq Y29sbm9zLCBMaXN0ICpvcGlkcyk7CiBleHRlcm4gYm9vbCBpbm5lcnJlbF9pc191bmlxdWUo UGxhbm5lckluZm8gKnJvb3QsCiAJCQkJCQkJICAgUmVsaWRzIGpvaW5yZWxpZHMsIFJlbGlk cyBvdXRlcnJlbGlkcywgUmVsT3B0SW5mbyAqaW5uZXJyZWwsCiAJCQkJCQkJICAgSm9pblR5 cGUgam9pbnR5cGUsIExpc3QgKnJlc3RyaWN0bGlzdCwgYm9vbCBmb3JjZV9jYWNoZSk7Citl eHRlcm4gYm9vbCBpbm5lcnJlbF9pc191bmlxdWVfZXh0KFBsYW5uZXJJbmZvICpyb290LCBS ZWxpZHMgam9pbnJlbGlkcywKKwkJCQkJCQkJICAgUmVsaWRzIG91dGVycmVsaWRzLCBSZWxP cHRJbmZvICppbm5lcnJlbCwKKwkJCQkJCQkJICAgSm9pblR5cGUgam9pbnR5cGUsIExpc3Qg KnJlc3RyaWN0bGlzdCwKKwkJCQkJCQkJICAgYm9vbCBmb3JjZV9jYWNoZSwgTGlzdCAqKnVj bGF1c2VzKTsKK2V4dGVybiBMaXN0ICpyZW1vdmVfdXNlbGVzc19zZWxmX2pvaW5zKFBsYW5u ZXJJbmZvICpyb290LCBMaXN0ICpqb2ludHJlZSk7CiAKIC8qCiAgKiBwcm90b3R5cGVzIGZv ciBwbGFuL3NldHJlZnMuYwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3Rl ZC9lcXVpdmNsYXNzLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZXF1aXZjbGFz cy5vdXQKaW5kZXggMTI2ZjcwNDdmZS4uZGU3MTQ0MTA1MiAxMDA2NDQKLS0tIGEvc3JjL3Rl c3QvcmVncmVzcy9leHBlY3RlZC9lcXVpdmNsYXNzLm91dAorKysgYi9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL2VxdWl2Y2xhc3Mub3V0CkBAIC00MzAsNiArNDMwLDM4IEBAIGV4cGxh aW4gKGNvc3RzIG9mZikKICAgIEZpbHRlcjogKCh1bmlxdWUxIElTIE5PVCBOVUxMKSBBTkQg KHVuaXF1ZTIgSVMgTk9UIE5VTEwpKQogKDIgcm93cykKIAorLS0gVGVzdCB0aGF0IGJyb2tl biBFQ3MgYXJlIHByb2Nlc3NlZCBjb3JyZWN0bHkgZHVyaW5nIHNlbGYgam9pbiByZW1vdmFs LgorLS0gRGlzYWJsZSBtZXJnZSBqb2lucyBzbyB0aGF0IHdlIGRvbid0IGdldCBhbiBlcnJv ciBhYm91dCBtaXNzaW5nIGNvbW11dGF0b3IuCistLSBUZXN0IGJvdGggb3JpZW50YXRpb25z IG9mIHRoZSBqb2luIGNsYXVzZSwgYmVjYXVzZSBvbmx5IG9uZSBvZiB0aGVtIGJyZWFrcwor LS0gdGhlIEVDLgorc2V0IGVuYWJsZV9tZXJnZWpvaW4gdG8gb2ZmOworZXhwbGFpbiAoY29z dHMgb2ZmKQorICBzZWxlY3QgKiBmcm9tIGVjMCBtIGpvaW4gZWMwIG4gb24gbS5mZiA9IG4u ZmYKKyAgam9pbiBlYzEgcCBvbiBtLmZmICsgbi5mZiA9IHAuZjE7CisgICAgICAgICAgICAg ICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAoKG4uZmYg KyBuLmZmKSA9IHAuZjEpCisgICAtPiAgU2VxIFNjYW4gb24gZWMxIHAKKyAgIC0+ICBNYXRl cmlhbGl6ZQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGVjMCBuCisgICAgICAgICAgICAg ICBGaWx0ZXI6IChmZiBJUyBOT1QgTlVMTCkKKyg2IHJvd3MpCisKK2V4cGxhaW4gKGNvc3Rz IG9mZikKKyAgc2VsZWN0ICogZnJvbSBlYzAgbSBqb2luIGVjMCBuIG9uIG0uZmYgPSBuLmZm CisgIGpvaW4gZWMxIHAgb24gcC5mMTo6aW50OCA9IChtLmZmICsgbi5mZik6OmludDhhbGlh czE7CisgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAg ICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRl cjogKChwLmYxKTo6YmlnaW50ID0gKChuLmZmICsgbi5mZikpOjppbnQ4YWxpYXMxKQorICAg LT4gIFNlcSBTY2FuIG9uIGVjMSBwCisgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgIC0+ ICBTZXEgU2NhbiBvbiBlYzAgbgorICAgICAgICAgICAgICAgRmlsdGVyOiAoZmYgSVMgTk9U IE5VTEwpCisoNiByb3dzKQorCityZXNldCBlbmFibGVfbWVyZ2Vqb2luOwogLS0gdGhpcyBj b3VsZCBiZSBjb252ZXJ0ZWQsIGJ1dCBpc24ndCBhdCBwcmVzZW50CiBleHBsYWluIChjb3N0 cyBvZmYpCiAgIHNlbGVjdCAqIGZyb20gdGVuazEgd2hlcmUgdW5pcXVlMSA9IHVuaXF1ZTEg b3IgdW5pcXVlMiA9IHVuaXF1ZTI7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4 cGVjdGVkL2pvaW4ub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dApp bmRleCA5Yjg2MzhmMjg2Li4wMjdjMzU2YmNjIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL2pvaW4ub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQv am9pbi5vdXQKQEAgLTU4MDcsMTEgKzU4MDcsMTMgQEAgZXhwbGFpbiAoY29zdHMgb2ZmKQog c2VsZWN0IHAuKiBmcm9tCiAgIChwYXJlbnQgcCBsZWZ0IGpvaW4gY2hpbGQgYyBvbiAocC5r ID0gYy5rKSkgam9pbiBwYXJlbnQgeCBvbiBwLmsgPSB4LmsKICAgd2hlcmUgcC5rID0gMSBh bmQgcC5rID0gMjsKLSAgICAgICAgUVVFUlkgUExBTiAgICAgICAgCi0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KICBSZXN1bHQKICAgIE9uZS1UaW1lIEZpbHRlcjogZmFsc2UKLSgyIHJvd3MpCisg ICAtPiAgSW5kZXggU2NhbiB1c2luZyBwYXJlbnRfcGtleSBvbiBwYXJlbnQgeAorICAgICAg ICAgSW5kZXggQ29uZDogKGsgPSAxKQorKDQgcm93cykKIAogLS0gYnVnIDUyNTU6IHRoaXMg aXMgbm90IG9wdGltaXphYmxlIGJ5IGpvaW4gcmVtb3ZhbAogYmVnaW47CkBAIC02MTM0LDYg KzYxMzYsODIyIEBAIHNlbGVjdCAqIGZyb20KIC0tLS0rLS0tLSstLS0tKy0tLS0KICgwIHJv d3MpCiAKKy0tCistLSB0ZXN0IHRoYXQgc2VtaS0gb3IgaW5uZXIgc2VsZi1qb2lucyBvbiBh IHVuaXF1ZSBjb2x1bW4gYXJlIHJlbW92ZWQKKy0tCistLSBlbmFibGUgb25seSBuZXN0bG9v cCB0byBnZXQgbW9yZSBwcmVkaWN0YWJsZSBwbGFucworc2V0IGVuYWJsZV9oYXNoam9pbiB0 byBvZmY7CitzZXQgZW5hYmxlX21lcmdlam9pbiB0byBvZmY7CitjcmVhdGUgdGFibGUgc2og KGEgaW50IHVuaXF1ZSwgYiBpbnQsIGMgaW50IHVuaXF1ZSk7CitpbnNlcnQgaW50byBzaiB2 YWx1ZXMgKDEsIG51bGwsIDIpLCAobnVsbCwgMiwgbnVsbCksICgyLCAxLCAxKTsKK2FuYWx5 emUgc2o7CistLSBUcml2aWFsIHNlbGYtam9pbiBjYXNlLgorZXhwbGFpbiAoY29zdHMgb2Zm KQorc2VsZWN0IHAuKiBmcm9tIHNqIHAsIHNqIHEgd2hlcmUgcS5hID0gcC5hIGFuZCBxLmIg PSBxLmEgLSAxOworICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAg ICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgU2VxIFNjYW4gb24gc2ogcQorICAgRmlsdGVyOiAoKGEgSVMgTk9UIE5VTEwpIEFORCAo YiA9IChhIC0gMSkpKQorKDIgcm93cykKKworc2VsZWN0IHAuKiBmcm9tIHNqIHAsIHNqIHEg d2hlcmUgcS5hID0gcC5hIGFuZCBxLmIgPSBxLmEgLSAxOworIGEgfCBiIHwgYyAKKy0tLSst LS0rLS0tCisgMiB8IDEgfCAxCisoMSByb3cpCisKKy0tIFNlbGYtam9pbiByZW1vdmFsIHBl cmZvcm1zIGFmdGVyIGEgc3VicXVlcnkgcHVsbC11cCBwcm9jZXNzIGFuZCBjb3VsZCByZW1v dmUKKy0tIHN1Y2gga2luZCBvZiBzZWxmLWpvaW4gdG9vLiBDaGVjayB0aGlzIG9wdGlvbi4K K2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogcAord2hlcmUgZXhpc3Rz IChzZWxlY3QgKiBmcm9tIHNqIHEKKwkJCQl3aGVyZSBxLmEgPSBwLmEgYW5kIHEuYiA8IDEw KTsKKyAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgIAorLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gc2og cQorICAgRmlsdGVyOiAoKGEgSVMgTk9UIE5VTEwpIEFORCAoYiA8IDEwKSkKKygyIHJvd3Mp CisKK3NlbGVjdCAqIGZyb20gc2ogcCB3aGVyZSBleGlzdHMgKHNlbGVjdCAqIGZyb20gc2og cSB3aGVyZSBxLmEgPSBwLmEgYW5kIHEuYiA8IDEwKTsKKyBhIHwgYiB8IGMgCistLS0rLS0t Ky0tLQorIDIgfCAxIHwgMQorKDEgcm93KQorCistLSBEb24ndCByZW1vdmUgc2VsZi1qb2lu IGZvciB0aGUgY2FzZSBvZiBlcXVhbGl0eSBvZiB0d28gZGlmZmVyZW50IHVuaXF1ZSBjb2x1 bW5zLgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB0MSwgc2ogdDIg d2hlcmUgdDEuYSA9IHQyLmMgYW5kIHQxLmIgaXMgbm90IG51bGw7CisgICAgICAgICAgICAg IFFVRVJZIFBMQU4gICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKHQxLmEgPSB0 Mi5jKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIHQyCisgICAtPiAgTWF0ZXJpYWxpemUKKyAg ICAgICAgIC0+ICBTZXEgU2NhbiBvbiBzaiB0MQorICAgICAgICAgICAgICAgRmlsdGVyOiAo YiBJUyBOT1QgTlVMTCkKKyg2IHJvd3MpCisKKy0tIERlZ2VuZXJhdGVkIGNhc2UuCitleHBs YWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tCisJKHNlbGVjdCBhIGFzIHggZnJvbSBz aiB3aGVyZSBmYWxzZSkgYXMgcTEsCisJKHNlbGVjdCBhIGFzIHkgZnJvbSBzaiB3aGVyZSBm YWxzZSkgYXMgcTIKK3doZXJlIHExLnggPSBxMi55OworICAgICAgICAgICBRVUVSWSBQTEFO ICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSZXN1 bHQKKyAgIE9uZS1UaW1lIEZpbHRlcjogZmFsc2UKKyAgIC0+ICBTZXEgU2NhbiBvbiBzagor ICAgICAgICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKyg0IHJvd3MpCisKKy0tIFdlIGNh bid0IHVzZSBhIGNyb3NzLUVDIGdlbmVyYXRlZCBzZWxmIGpvaW4gcXVhbCBiZWNhdXNlIG9m IGN1cnJlbnQgbG9naWMgb2YKKy0tIHRoZSBnZW5lcmF0ZV9qb2luX2ltcGxpZWRfZXF1YWxp dGllcyByb3V0aW5lLgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB0 MSwgc2ogdDIgd2hlcmUgdDEuYSA9IHQxLmIgYW5kIHQxLmIgPSB0Mi5iIGFuZCB0Mi5iID0g dDIuYTsKKyAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAodDEuYSA9 IHQyLmIpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogdDEKKyAgICAgICAgIEZpbHRlcjogKGEg PSBiKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIHQyCisgICAgICAgICBGaWx0ZXI6IChiID0g YSkKKyg2IHJvd3MpCisKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2og dDEsIHNqIHQyLCBzaiB0Mword2hlcmUgdDEuYSA9IHQxLmIgYW5kIHQxLmIgPSB0Mi5iIGFu ZCB0Mi5iID0gdDIuYQorCWFuZCB0MS5iID0gdDMuYiBhbmQgdDMuYiA9IHQzLmE7CisgICAg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKHQxLmEg PSB0My5iKQorICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICBKb2luIEZpbHRlcjogKHQx LmEgPSB0Mi5iKQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqIHQxCisgICAgICAgICAg ICAgICBGaWx0ZXI6IChhID0gYikKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBzaiB0Mgor ICAgICAgICAgICAgICAgRmlsdGVyOiAoYiA9IGEpCisgICAtPiAgU2VxIFNjYW4gb24gc2og dDMKKyAgICAgICAgIEZpbHRlcjogKGIgPSBhKQorKDEwIHJvd3MpCisKKy0tIERvdWJsZSBz ZWxmLWpvaW4gcmVtb3ZhbC4KKy0tIFVzZSBhIGNvbmRpdGlvbiBvbiAiYiArIDEiLCBub3Qg b24gImIiLCBmb3IgdGhlIHNlY29uZCBqb2luLCBzbyB0aGF0CistLSB0aGUgZXF1aXZhbGVu Y2UgY2xhc3MgaXMgZGlmZmVyZW50IGZyb20gdGhlIGZpcnN0IG9uZSwgYW5kIHdlIGNhbgor LS0gdGVzdCB0aGUgbm9uLWVjIGNvZGUgcGF0aC4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3Nl bGVjdCAqIGZyb20gc2ogdDEgam9pbiBzaiB0MiBvbiB0MS5hID0gdDIuYSBhbmQgdDEuYiA9 IHQyLmIKKwlqb2luIHNqIHQzIG9uIHQyLmEgPSB0My5hIGFuZCB0Mi5iICsgMSA9IHQzLmIg KyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBT ZXEgU2NhbiBvbiBzaiB0MworICAgRmlsdGVyOiAoKGEgSVMgTk9UIE5VTEwpIEFORCAoYiBJ UyBOT1QgTlVMTCkgQU5EICgoYiArIDEpIElTIE5PVCBOVUxMKSkKKygyIHJvd3MpCisKKy0t IHN1YnNlbGVjdCB0aGF0IHJlZmVyZW5jZXMgdGhlIHJlbW92ZWQgcmVsYXRpb24KK2V4cGxh aW4gKGNvc3RzIG9mZikKK3NlbGVjdCB0MS5hLCAoc2VsZWN0IGEgZnJvbSBzaiB3aGVyZSBh ID0gdDIuYSBhbmQgYSA9IHQxLmEpCitmcm9tIHNqIHQxLCBzaiB0Mgord2hlcmUgdDEuYSA9 IHQyLmE7CisgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9u IHNqIHQyCisgICBGaWx0ZXI6IChhIElTIE5PVCBOVUxMKQorICAgU3ViUGxhbiAxCisgICAg IC0+ICBSZXN1bHQKKyAgICAgICAgICAgT25lLVRpbWUgRmlsdGVyOiAodDIuYSA9IHQyLmEp CisgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBzagorICAgICAgICAgICAgICAgICBGaWx0 ZXI6IChhID0gdDIuYSkKKyg3IHJvd3MpCisKKy0tIHNlbGYtam9pbiB1bmRlciBvdXRlciBq b2luCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHggam9pbiBzaiB5 IG9uIHguYSA9IHkuYQorbGVmdCBqb2luIGludDhfdGJsIHogb24geC5hID0gei5xMTsKKyAg ICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AgTGVmdCBKb2luCisgICBKb2luIEZp bHRlcjogKHkuYSA9IHoucTEpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogeQorICAgICAgICAg RmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKyAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAg LT4gIFNlcSBTY2FuIG9uIGludDhfdGJsIHoKKyg2IHJvd3MpCisKK2V4cGxhaW4gKGNvc3Rz IG9mZikKK3NlbGVjdCAqIGZyb20gc2ogeCBqb2luIHNqIHkgb24geC5hID0geS5hCitsZWZ0 IGpvaW4gaW50OF90YmwgeiBvbiB5LmEgPSB6LnExOworICAgICAgICAgICAgIFFVRVJZIFBM QU4gICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgIEpvaW4gRmlsdGVyOiAoeS5hID0gei5xMSkK KyAgIC0+ICBTZXEgU2NhbiBvbiBzaiB5CisgICAgICAgICBGaWx0ZXI6IChhIElTIE5PVCBO VUxMKQorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gaW50 OF90YmwgegorKDYgcm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKQorU0VMRUNUICogRlJP TSAoCisgIFNFTEVDVCB0MS4qLCB0Mi5hIEFTIGF4IEZST00gc2ogdDEgSk9JTiBzaiB0Mgor ICBPTiAodDEuYSA9IHQyLmEgQU5EIHQxLmMqdDEuYyA9IHQyLmMrMiBBTkQgdDIuYiBJUyBO VUxMKQorKSBBUyBxMQorTEVGVCBKT0lOCisgIChTRUxFQ1QgdDMuKiBGUk9NIHNqIHQzLCBz aiB0NCBXSEVSRSB0My5jID0gdDQuYykgQVMgcTIKK09OIHExLmF4ID0gcTIuYTsKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3Ag TGVmdCBKb2luCisgICBKb2luIEZpbHRlcjogKHQyLmEgPSB0NC5hKQorICAgLT4gIFNlcSBT Y2FuIG9uIHNqIHQyCisgICAgICAgICBGaWx0ZXI6ICgoYiBJUyBOVUxMKSBBTkQgKGEgSVMg Tk9UIE5VTEwpIEFORCAoKGMgKiBjKSA9IChjICsgMikpKQorICAgLT4gIFNlcSBTY2FuIG9u IHNqIHQ0CisgICAgICAgICBGaWx0ZXI6IChjIElTIE5PVCBOVUxMKQorKDYgcm93cykKKwor LS0gVGVzdCB0aGF0IHBsYWNlaG9sZGVycyBhcmUgdXBkYXRlZCBjb3JyZWN0bHkgYWZ0ZXIg am9pbiByZW1vdmFsCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tICh2YWx1 ZXMgKDEpKSB4CitsZWZ0IGpvaW4gKHNlbGVjdCBjb2FsZXNjZSh5LnExLCAxKSBmcm9tIGlu dDhfdGJsIHkKKwlyaWdodCBqb2luIHNqIGoxIGlubmVyIGpvaW4gc2ogajIgb24gajEuYSA9 IGoyLmEKKwlvbiB0cnVlKSB6CitvbiB0cnVlOworICAgICAgICAgICAgICAgIFFVRVJZIFBM QU4gICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgIC0+ICBSZXN1bHQKKyAgIC0+ ICBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBzaiBq MgorICAgICAgICAgICAgICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKyAgICAgICAgIC0+ ICBNYXRlcmlhbGl6ZQorICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGludDhfdGJs IHkKKyg3IHJvd3MpCisKKy0tIENoZWNrIHVwZGF0aW5nIG9mIExhdGVyYWwgbGlua3MgZnJv bSB0b3AtbGV2ZWwgcXVlcnkgdG8gdGhlIHJlbW92aW5nIHJlbGF0aW9uCitleHBsYWluIChD T1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIHBnX2FtIGFtIFdIRVJFIGFtLmFtbmFtZSBJTiAo CisgIFNFTEVDVCBjMS5yZWxuYW1lIEFTIHJlbG5hbWUKKyAgRlJPTSBwZ19jbGFzcyBjMQor ICAgIEpPSU4gcGdfY2xhc3MgYzIKKyAgICBPTiBjMS5vaWQ9YzIub2lkIEFORCBjMS5vaWQg PCAxMAorKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExv b3AgU2VtaSBKb2luCisgICBKb2luIEZpbHRlcjogKGFtLmFtbmFtZSA9IGMyLnJlbG5hbWUp CisgICAtPiAgU2VxIFNjYW4gb24gcGdfYW0gYW0KKyAgIC0+ICBNYXRlcmlhbGl6ZQorICAg ICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgcGdfY2xhc3Nfb2lkX2luZGV4IG9uIHBnX2Ns YXNzIGMyCisgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoKG9pZCA8ICcxMCc6Om9pZCkg QU5EIChvaWQgSVMgTk9UIE5VTEwpKQorKDYgcm93cykKKworLS0KKy0tIFNKUiBjb3JuZXIg Y2FzZTogdW5pcXVlbmVzcyBvZiBhbiBpbm5lciBpcyBbcGFydGlhbGx5XSBkZXJpdmVkIGZy b20KKy0tIGJhc2VyZXN0cmljdGluZm8gY2xhdXNlcy4KKy0tIFhYWDogV2UgcmVhbGx5IHNo b3VsZCBhbGxvdyBTSlIgZm9yIHRoZXNlIGNvcm5lciBjYXNlcz8KKy0tCitJTlNFUlQgSU5U TyBzaiBWQUxVRVMgKDMsIDEsIDMpOworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBEb24ndCBy ZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMiBXSEVSRSBqMS5iID0gajIu YiBBTkQgajEuYSA9IDIgQU5EIGoyLmEgPSAzOworICAgICAgICAgIFFVRVJZIFBMQU4gICAg ICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAor ICAgSm9pbiBGaWx0ZXI6IChqMS5iID0gajIuYikKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBq MQorICAgICAgICAgRmlsdGVyOiAoYSA9IDIpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogajIK KyAgICAgICAgIEZpbHRlcjogKGEgPSAzKQorKDYgcm93cykKKworU0VMRUNUICogRlJPTSBz aiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMiBBTkQgajIuYSA9 IDM7IC0tIFJldHVybiBvbmUgcm93CisgYSB8IGIgfCBjIHwgYSB8IGIgfCBjIAorLS0tKy0t LSstLS0rLS0tKy0tLSstLS0KKyAyIHwgMSB8IDEgfCAzIHwgMSB8IDMKKygxIHJvdykKKwor ZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBSZW1vdmUgU0osIGRlZmluZSB1bmlxdWVuZXNzIGJ5 IGEgY29uc3RhbnQKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMiBXSEVSRSBqMS5iID0g ajIuYiBBTkQgajEuYSA9IDIgQU5EIGoyLmEgPSAyOworICAgICAgICAgICAgICAgUVVFUlkg UExBTiAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgU2VxIFNjYW4gb24gc2ogajIKKyAgIEZpbHRlcjogKChiIElTIE5PVCBO VUxMKSBBTkQgKGEgPSAyKSkKKygyIHJvd3MpCisKK1NFTEVDVCAqIEZST00gc2ogajEsIHNq IGoyCitXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSA9IDIgQU5EIGoyLmEgPSAyOyAtLSBS ZXR1cm4gb25lIHJvdworIGEgfCBiIHwgYyB8IGEgfCBiIHwgYyAKKy0tLSstLS0rLS0tKy0t LSstLS0rLS0tCisgMiB8IDEgfCAxIHwgMiB8IDEgfCAxCisoMSByb3cpCisKK0VYUExBSU4g KENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0g ajIuYgorICBBTkQgajEuYSA9IChFWFRSQUNUKERPVyBGUk9NIGN1cnJlbnRfdGltZXN0YW1w KDApKS8xNSArIDMpOjppbnQKKyAgQU5EIChFWFRSQUNUKERPVyBGUk9NIGN1cnJlbnRfdGlt ZXN0YW1wKDApKS8xNSArIDMpOjppbnQgPSBqMi5hCis7IC0tIFJlbW92ZSBTSiwgZGVmaW5l IHVuaXF1ZW5lc3MgYnkgYSBjb25zdGFudCBleHByZXNzaW9uCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gc2ogajIKKyAgIEZpbHRlcjogKChi IElTIE5PVCBOVUxMKSBBTkQgKGEgPSAoKChFWFRSQUNUKGRvdyBGUk9NIENVUlJFTlRfVElN RVNUQU1QKDApKSAvICcxNSc6Om51bWVyaWMpICsgJzMnOjpudW1lcmljKSk6OmludGVnZXIp KQorKDIgcm93cykKKworU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIg PSBqMi5iCisgIEFORCBqMS5hID0gKEVYVFJBQ1QoRE9XIEZST00gY3VycmVudF90aW1lc3Rh bXAoMCkpLzE1ICsgMyk6OmludAorICBBTkQgKEVYVFJBQ1QoRE9XIEZST00gY3VycmVudF90 aW1lc3RhbXAoMCkpLzE1ICsgMyk6OmludCA9IGoyLmEKKzsgLS0gUmV0dXJuIG9uZSByb3cK KyBhIHwgYiB8IGMgfCBhIHwgYiB8IGMgCistLS0rLS0tKy0tLSstLS0rLS0tKy0tLQorIDMg fCAxIHwgMyB8IDMgfCAxIHwgMworKDEgcm93KQorCitleHBsYWluIChjb3N0cyBvZmYpIC0t IFJlbW92ZSBTSgorCVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyIFdIRVJFIGoxLmIgPSBq Mi5iIEFORCBqMS5hID0gMSBBTkQgajIuYSA9IDE7CisgICAgICAgICAgICAgICBRVUVSWSBQ TEFOICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBzaiBqMgorICAgRmlsdGVyOiAoKGIgSVMgTk9UIE5V TEwpIEFORCAoYSA9IDEpKQorKDIgcm93cykKKworU0VMRUNUICogRlJPTSBzaiBqMSwgc2og ajIKK1dIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMSBBTkQgajIuYSA9IDE7IC0tIFJl dHVybiBubyByb3dzCisgYSB8IGIgfCBjIHwgYSB8IGIgfCBjIAorLS0tKy0tLSstLS0rLS0t Ky0tLSstLS0KKygwIHJvd3MpCisKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gU2h1ZmZsZSBh IGNsYXVzZS4gUmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIgV0hFUkUg ajEuYiA9IGoyLmIgQU5EIDEgPSBqMS5hIEFORCBqMi5hID0gMTsKKyAgICAgICAgICAgICAg IFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHNqIGoyCisgICBGaWx0ZXI6ICgoYiBJ UyBOT1QgTlVMTCkgQU5EIChhID0gMSkpCisoMiByb3dzKQorCitTRUxFQ1QgKiBGUk9NIHNq IGoxLCBzaiBqMgorV0hFUkUgajEuYiA9IGoyLmIgQU5EIDEgPSBqMS5hIEFORCBqMi5hID0g MTsgLS0gUmV0dXJuIG5vIHJvd3MKKyBhIHwgYiB8IGMgfCBhIHwgYiB8IGMgCistLS0rLS0t Ky0tLSstLS0rLS0tKy0tLQorKDAgcm93cykKKworLS0gU0pFIENvcm5lciBjYXNlOiBhICdh Lng9YS54JyBjbGF1c2UsIGhhdmUgcmVwbGFjZWQgd2l0aCAnYS54IElTIE5PVCBOVUxMJwor LS0gYWZ0ZXIgU0ogZWxpbWluYXRpb24gaXQgc2hvdWxkbid0IGJlIGEgbWVyZ2Vqb2luYWJs ZSBjbGF1c2UuCitTRUxFQ1QgdDQuKgorRlJPTSAoU0VMRUNUIHQxLiosIHQyLmEgQVMgYTEg RlJPTSBzaiB0MSwgc2ogdDIgV0hFUkUgdDEuYiA9IHQyLmIpIEFTIHQzCitKT0lOIHNqIHQ0 IE9OICh0NC5hID0gdDMuYSkgV0hFUkUgdDMuYTEgPSA0MjsKKyBhIHwgYiB8IGMgCistLS0r LS0tKy0tLQorKDAgcm93cykKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIHQ0LioK K0ZST00gKFNFTEVDVCB0MS4qLCB0Mi5hIEFTIGExIEZST00gc2ogdDEsIHNqIHQyIFdIRVJF IHQxLmIgPSB0Mi5iKSBBUyB0MworSk9JTiBzaiB0NCBPTiAodDQuYSA9IHQzLmEpIFdIRVJF IHQzLmExID0gNDIKKzsgLS0gU0pzIG11c3QgYmUgcmVtb3ZlZC4KKyAgICAgICAgICAgUVVF UlkgUExBTiAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAodDEuYiA9IHQyLmIpCisgICAtPiAg U2VxIFNjYW4gb24gc2ogdDIKKyAgICAgICAgIEZpbHRlcjogKGEgPSA0MikKKyAgIC0+ICBT ZXEgU2NhbiBvbiBzaiB0MQorICAgICAgICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKyg2 IHJvd3MpCisKKy0tIEZ1bmN0aW9uYWwgaW5kZXgKK0NSRUFURSBVTklRVUUgSU5ERVggc2pf Zm5faWR4IE9OIHNqKChhICogYSkpOworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBSZW1vdmUg U0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorCVdIRVJFIGoxLmIgPSBqMi5iIEFO RCBqMS5hKmoxLmEgPSAxIEFORCBqMi5hKmoyLmEgPSAxOworICAgICAgICAgICAgICAgICAg UVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gc2ogajIKKyAgIEZpbHRl cjogKChiIElTIE5PVCBOVUxMKSBBTkQgKChhICogYSkgPSAxKSkKKygyIHJvd3MpCisKK2V4 cGxhaW4gKGNvc3RzIG9mZikgLS0gRG9uJ3QgcmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBz aiBqMSwgc2ogajIKKwlXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSpqMS5hID0gMSBBTkQg ajIuYSpqMi5hID0gMjsKKyAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0 ZXI6IChqMS5iID0gajIuYikKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBqMQorICAgICAgICAg RmlsdGVyOiAoKGEgKiBhKSA9IDEpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogajIKKyAgICAg ICAgIEZpbHRlcjogKChhICogYSkgPSAyKQorKDYgcm93cykKKworRVhQTEFJTiAoQ09TVFMg T0ZGKQorU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iCisg IEFORCAoajEuYSpqMS5hKSA9IChFWFRSQUNUKERPVyBGUk9NIGN1cnJlbnRfdGltZXN0YW1w KDApKS8xNSArIDMpOjppbnQKKyAgQU5EIChFWFRSQUNUKERPVyBGUk9NIGN1cnJlbnRfdGlt ZXN0YW1wKDApKS8xNSArIDMpOjppbnQgPSAoajIuYSpqMi5hKQorOyAtLSBSZXN0cmljdGlv biBjb250YWlucyBleHByZXNzaW9ucyBpbiBib3RoIHNpZGVzLCBSZW1vdmUgU0ouCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4g b24gc2ogajIKKyAgIEZpbHRlcjogKChiIElTIE5PVCBOVUxMKSBBTkQgKChhICogYSkgPSAo KChFWFRSQUNUKGRvdyBGUk9NIENVUlJFTlRfVElNRVNUQU1QKDApKSAvICcxNSc6Om51bWVy aWMpICsgJzMnOjpudW1lcmljKSk6OmludGVnZXIpKQorKDIgcm93cykKKworU0VMRUNUICog RlJPTSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iCisgIEFORCAoajEuYSpqMS5h KSA9IChFWFRSQUNUKERPVyBGUk9NIGN1cnJlbnRfdGltZXN0YW1wKDApKS8xNSArIDMpOjpp bnQKKyAgQU5EIChFWFRSQUNUKERPVyBGUk9NIGN1cnJlbnRfdGltZXN0YW1wKDApKS8xNSAr IDMpOjppbnQgPSAoajIuYSpqMi5hKQorOyAtLSBFbXB0eSBzZXQgb2Ygcm93cyBzaG91bGQg YmUgcmV0dXJuZWQKKyBhIHwgYiB8IGMgfCBhIHwgYiB8IGMgCistLS0rLS0tKy0tLSstLS0r LS0tKy0tLQorKDAgcm93cykKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJP TSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iCisgIEFORCAoajEuYSpqMS5hKSA9 IChyYW5kb20oKS8zICsgMyk6OmludAorICBBTkQgKHJhbmRvbSgpLzMgKyAzKTo6aW50ID0g KGoyLmEqajIuYSkKKzsgLS0gUmVzdHJpY3Rpb24gY29udGFpbnMgdm9sYXRpbGUgZnVuY3Rp b24gLSBkaXNhYmxlIFNKUiBmZWF0dXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAoajEuYiA9 IGoyLmIpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogajEKKyAgICAgICAgIEZpbHRlcjogKChh ICogYSkgPSAoKChyYW5kb20oKSAvICczJzo6ZG91YmxlIHByZWNpc2lvbikgKyAnMyc6OmRv dWJsZSBwcmVjaXNpb24pKTo6aW50ZWdlcikKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBqMgor ICAgICAgICAgRmlsdGVyOiAoKCgocmFuZG9tKCkgLyAnMyc6OmRvdWJsZSBwcmVjaXNpb24p ICsgJzMnOjpkb3VibGUgcHJlY2lzaW9uKSk6OmludGVnZXIgPSAoYSAqIGEpKQorKDYgcm93 cykKKworU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iCisg IEFORCAoajEuYSpqMS5jLzMpID0gKHJhbmRvbSgpLzMgKyAzKTo6aW50CisgIEFORCAocmFu ZG9tKCkvMyArIDMpOjppbnQgPSAoajIuYSpqMi5jLzMpCis7IC0tIFJldHVybiBvbmUgcm93 CisgYSB8IGIgfCBjIHwgYSB8IGIgfCBjIAorLS0tKy0tLSstLS0rLS0tKy0tLSstLS0KKyAz IHwgMSB8IDMgfCAzIHwgMSB8IDMKKygxIHJvdykKKworLS0gTXVsdGlwbGUgZmlsdGVycwor Q1JFQVRFIFVOSVFVRSBJTkRFWCBzal90ZW1wX2lkeDEgT04gc2ooYSxiLGMpOworZXhwbGFp biAoY29zdHMgb2ZmKSAtLSBSZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBq MgorCVdIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMiBBTkQgajEuYyA9IDMgQU5EIGoy LmEgPSAyIEFORCAzID0gajIuYzsKKyAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4g ICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHNqIGoyCisgICBGaWx0ZXI6 ICgoYiBJUyBOT1QgTlVMTCkgQU5EIChhID0gMikgQU5EIChjID0gMykpCisoMiByb3dzKQor CitleHBsYWluIChjb3N0cyBvZmYpIC0tIERvbid0IHJlbW92ZSBTSgorCVNFTEVDVCAqIEZS T00gc2ogajEsIHNqIGoyCisJV0hFUkUgajEuYiA9IGoyLmIgQU5EIDIgPSBqMS5hIEFORCBq MS5jID0gMyBBTkQgajIuYSA9IDEgQU5EIDMgPSBqMi5jOworICAgICAgICAgICAgICBRVUVS WSBQTEFOICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6IChqMS5iID0gajIuYikK KyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBqMQorICAgICAgICAgRmlsdGVyOiAoKDIgPSBhKSBB TkQgKGMgPSAzKSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBqMgorICAgICAgICAgRmlsdGVy OiAoKGMgPSAzKSBBTkQgKGEgPSAxKSkKKyg2IHJvd3MpCisKK0NSRUFURSBVTklRVUUgSU5E RVggc2pfdGVtcF9pZHggT04gc2ooYSxiKTsKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gRG9u J3QgcmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEuYiA9 IGoyLmIgQU5EIGoxLmEgPSAyOworICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBG aWx0ZXI6IChqMS5iID0gajIuYikKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBqMQorICAgICAg ICAgRmlsdGVyOiAoYSA9IDIpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogajIKKyg1IHJvd3Mp CisKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gRG9uJ3QgcmVtb3ZlIFNKCisJU0VMRUNUICog RlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIDIgPSBqMi5hOworICAg ICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6IChqMS5iID0gajIuYikKKyAg IC0+ICBTZXEgU2NhbiBvbiBzaiBqMgorICAgICAgICAgRmlsdGVyOiAoMiA9IGEpCisgICAt PiAgU2VxIFNjYW4gb24gc2ogajEKKyg1IHJvd3MpCisKK2V4cGxhaW4gKGNvc3RzIG9mZikg LS0gRG9uJ3QgcmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIgV0hFUkUg ajEuYiA9IGoyLmIgQU5EIChqMS5hID0gMSBPUiBqMi5hID0gMSk7CisgICAgICAgICAgICAg ICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKChqMS5iID0gajIuYikg QU5EICgoajEuYSA9IDEpIE9SIChqMi5hID0gMSkpKQorICAgLT4gIFNlcSBTY2FuIG9uIHNq IGoxCisgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBzaiBq MgorKDUgcm93cykKKworRFJPUCBJTkRFWCBzal9mbl9pZHgsIHNqX3RlbXBfaWR4MSwgc2pf dGVtcF9pZHg7CistLSBUZXN0IHRoYXQgT1IgcHJlZGljYXRlZCBhcmUgdXBkYXRlZCBjb3Jy ZWN0bHkgYWZ0ZXIgam9pbiByZW1vdmFsCitDUkVBVEUgVEFCTEUgdGFiX3dpdGhfZmxhZyAo IGlkIElOVCBQUklNQVJZIEtFWSwgaXNfZmxhZyBTTUFMTElOVCk7CitDUkVBVEUgSU5ERVgg aWR4X3Rlc3RfaXNfZmxhZyBPTiB0YWJfd2l0aF9mbGFnIChpc19mbGFnKTsKK2V4cGxhaW4g KGNvc3RzIG9mZikKK1NFTEVDVCBDT1VOVCgqKSBGUk9NIHRhYl93aXRoX2ZsYWcKK1dIRVJF CisJKGlzX2ZsYWcgSVMgTlVMTCBPUiBpc19mbGFnID0gMCkKKwlBTkQgaWQgSU4gKFNFTEVD VCBpZCBGUk9NIHRhYl93aXRoX2ZsYWcgV0hFUkUgaWQgSU4gKDIsIDMpKTsKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBB Z2dyZWdhdGUKKyAgIC0+ICBCaXRtYXAgSGVhcCBTY2FuIG9uIHRhYl93aXRoX2ZsYWcKKyAg ICAgICAgIFJlY2hlY2sgQ29uZDogKChpZCA9IEFOWSAoJ3syLDN9Jzo6aW50ZWdlcltdKSkg QU5EIChpZCBJUyBOT1QgTlVMTCkpCisgICAgICAgICBGaWx0ZXI6ICgoaXNfZmxhZyBJUyBO VUxMKSBPUiAoaXNfZmxhZyA9IDApKQorICAgICAgICAgLT4gIEJpdG1hcCBJbmRleCBTY2Fu IG9uIHRhYl93aXRoX2ZsYWdfcGtleQorICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKChp ZCA9IEFOWSAoJ3syLDN9Jzo6aW50ZWdlcltdKSkgQU5EIChpZCBJUyBOT1QgTlVMTCkpCiso NiByb3dzKQorCitEUk9QIFRBQkxFIHRhYl93aXRoX2ZsYWc7CistLSBIQVZJTkcgY2xhdXNl CitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgcC5iIGZyb20gc2ogcCBqb2luIHNqIHEg b24gcC5hID0gcS5hIGdyb3VwIGJ5IHAuYiBoYXZpbmcgc3VtKHAuYSkgPSAxOworICAgICAg ICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBIYXNoQWdncmVnYXRlCisgICBHcm91cCBLZXk6IHEuYgorICAgRmlsdGVy OiAoc3VtKHEuYSkgPSAxKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIHEKKyAgICAgICAgIEZp bHRlcjogKGEgSVMgTk9UIE5VTEwpCisoNSByb3dzKQorCistLSB1cGRhdGUgbGF0ZXJhbCBy ZWZlcmVuY2VzIGFuZCByYW5nZSB0YWJsZSBlbnRyeSByZWZlcmVuY2UKK2V4cGxhaW4gKHZl cmJvc2UsIGNvc3RzIG9mZikKK3NlbGVjdCAxIGZyb20gKHNlbGVjdCB4LiogZnJvbSBzaiB4 LCBzaiB5IHdoZXJlIHguYSA9IHkuYSkgcSwKKyAgbGF0ZXJhbCBnZW5lcmF0ZV9zZXJpZXMo MSwgcS5hKSBncyhpKTsKKyAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAg ICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIE91dHB1dDogMQorICAgLT4g IFNlcSBTY2FuIG9uIHB1YmxpYy5zaiB5CisgICAgICAgICBPdXRwdXQ6IHkuYSwgeS5iLCB5 LmMKKyAgICAgICAgIEZpbHRlcjogKHkuYSBJUyBOT1QgTlVMTCkKKyAgIC0+ICBGdW5jdGlv biBTY2FuIG9uIHBnX2NhdGFsb2cuZ2VuZXJhdGVfc2VyaWVzIGdzCisgICAgICAgICBPdXRw dXQ6IGdzLmkKKyAgICAgICAgIEZ1bmN0aW9uIENhbGw6IGdlbmVyYXRlX3NlcmllcygxLCB5 LmEpCisoOCByb3dzKQorCitleHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYpCitzZWxlY3Qg MSBmcm9tIChzZWxlY3QgeS4qIGZyb20gc2ogeCwgc2ogeSB3aGVyZSB4LmEgPSB5LmEpIHEs CisgIGxhdGVyYWwgZ2VuZXJhdGVfc2VyaWVzKDEsIHEuYSkgZ3MoaSk7CisgICAgICAgICAg ICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3Rl ZCBMb29wCisgICBPdXRwdXQ6IDEKKyAgIC0+ICBTZXEgU2NhbiBvbiBwdWJsaWMuc2ogeQor ICAgICAgICAgT3V0cHV0OiB5LmEsIHkuYiwgeS5jCisgICAgICAgICBGaWx0ZXI6ICh5LmEg SVMgTk9UIE5VTEwpCisgICAtPiAgRnVuY3Rpb24gU2NhbiBvbiBwZ19jYXRhbG9nLmdlbmVy YXRlX3NlcmllcyBncworICAgICAgICAgT3V0cHV0OiBncy5pCisgICAgICAgICBGdW5jdGlv biBDYWxsOiBnZW5lcmF0ZV9zZXJpZXMoMSwgeS5hKQorKDggcm93cykKKworLS0gVGVzdCB0 aGF0IGEgbm9uLUVDLWRlcml2ZWQgam9pbiBjbGF1c2UgaXMgcHJvY2Vzc2VkIGNvcnJlY3Rs eS4gVXNlIGFuCistLSBvdXRlciBqb2luIHNvIHRoYXQgd2UgY2FuJ3QgZm9ybSBhbiBFQy4K K2V4cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0ICogZnJvbSBzaiBwIGpvaW4gc2ogcSBvbiBw LmEgPSBxLmEKKyAgbGVmdCBqb2luIHNqIHIgb24gcC5hICsgcS5hID0gci5hOworICAgICAg ICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgIEpvaW4gRmlsdGVy OiAoKHEuYSArIHEuYSkgPSByLmEpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogcQorICAgICAg ICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKyAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAg ICAgLT4gIFNlcSBTY2FuIG9uIHNqIHIKKyg2IHJvd3MpCisKKy0tIEZJWE1FIHRoaXMgY29u c3RhbnQgZmFsc2UgZmlsdGVyIGRvZXNuJ3QgbG9vayBnb29kLiBTaG91bGQgd2UgbWVyZ2UK Ky0tIGVxdWl2YWxlbmNlIGNsYXNzZXM/CitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3Qg KiBmcm9tIHNqIHAsIHNqIHEgd2hlcmUgcC5hID0gcS5hIGFuZCBwLmIgPSAxIGFuZCBxLmIg PSAyOworICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAg ICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgU2VxIFNjYW4gb24gc2ogcQorICAgRmlsdGVyOiAoKGEgSVMgTk9UIE5VTEwp IEFORCAoYiA9IDIpIEFORCAoYiA9IDEpKQorKDIgcm93cykKKworLS0gQ2hlY2sgdGhhdCBh dHRyX25lZWRlZCBpcyB1cGRhdGVkIGNvcnJlY3RseSBhZnRlciBzZWxmLWpvaW4gcmVtb3Zh bC4gSW4gdGhpcworLS0gdGVzdCwgdGhlIGpvaW4gb2YgajEgd2l0aCBqMiBpcyByZW1vdmVk LiBrMS5iIGlzIHJlcXVpcmVkIGF0IGVpdGhlciBqMSBvciBqMi4KKy0tIElmIHRoaXMgaW5m byBpcyBsb3N0LCBqb2luIHRhcmdldGxpc3QgZm9yIChrMSwgazIpIHdpbGwgbm90IGNvbnRh aW4gazEuYi4KKy0tIFVzZSBpbmRleCBzY2FuIGZvciBrMSBzbyB0aGF0IHdlIGRvbid0IGdl dCAnYicgZnJvbSBwaHlzaWNhbCB0bGlzdCB1c2VkIGZvcgorLS0gc2Vxc2Nhbi4gQWxzbyBk aXNhYmxlIHJlb3JkZXJpbmcgb2Ygam9pbnMgYmVjYXVzZSB0aGlzIHRlc3QgZGVwZW5kcyBv biBhCistLSBwYXJ0aWN1bGFyIGpvaW4gdHJlZS4KK2NyZWF0ZSB0YWJsZSBzayAoYSBpbnQs IGIgaW50KTsKK2NyZWF0ZSBpbmRleCBvbiBzayhhKTsKK3NldCBqb2luX2NvbGxhcHNlX2xp bWl0IHRvIDE7CitzZXQgZW5hYmxlX3NlcXNjYW4gdG8gb2ZmOworZXhwbGFpbiAoY29zdHMg b2ZmKSBzZWxlY3QgMSBmcm9tCisJKHNrIGsxIGpvaW4gc2sgazIgb24gazEuYSA9IGsyLmEp CisJam9pbiAoc2ogajEgam9pbiBzaiBqMiBvbiBqMS5hID0gajIuYSkgb24gajEuYiA9IGsx LmI7CisgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6IChrMS5iID0gajIuYikKKyAg IC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgc2tfYV9p ZHggb24gc2sgazEKKyAgICAgICAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgc2tfYV9p ZHggb24gc2sgazIKKyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChhID0gazEuYSkKKyAg IC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgc2pfYV9r ZXkgb24gc2ogajIKKyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChhIElTIE5PVCBOVUxM KQorKDkgcm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3QgMSBmcm9tCisJKHNr IGsxIGpvaW4gc2sgazIgb24gazEuYSA9IGsyLmEpCisJam9pbiAoc2ogajEgam9pbiBzaiBq MiBvbiBqMS5hID0gajIuYSkgb24gajIuYiA9IGsxLmI7CisgICAgICAgICAgICAgICAgICAg ICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAg Sm9pbiBGaWx0ZXI6IChrMS5iID0gajIuYikKKyAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAg ICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgc2tfYV9pZHggb24gc2sgazEKKyAgICAgICAgIC0+ ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgc2tfYV9pZHggb24gc2sgazIKKyAgICAgICAgICAg ICAgIEluZGV4IENvbmQ6IChhID0gazEuYSkKKyAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAg ICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgc2pfYV9rZXkgb24gc2ogajIKKyAgICAgICAgICAg ICAgIEluZGV4IENvbmQ6IChhIElTIE5PVCBOVUxMKQorKDkgcm93cykKKworcmVzZXQgam9p bl9jb2xsYXBzZV9saW1pdDsKK3Jlc2V0IGVuYWJsZV9zZXFzY2FuOworc2V0IHNlbGZfam9p bl9zZWFyY2hfbGltaXQgdG8gMTsKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gTm8gb25lIHNl bGYgam9pbiBzaG91bGQgYmUgY29sbGFwc2VkCisgIHNlbGVjdCBqMS4qIGZyb20gc2ogajEs IHNqIGoyLCBzaiBqMyB3aGVyZSAoajEuYSA9IGoyLmEpIGFuZCAoajIuYSA9IGozLmEpOwor ICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBK b2luIEZpbHRlcjogKGoxLmEgPSBqMy5hKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIGozCisg ICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAg ICAgICAgSm9pbiBGaWx0ZXI6IChqMS5hID0gajIuYSkKKyAgICAgICAgICAgICAgIC0+ICBT ZXEgU2NhbiBvbiBzaiBqMQorICAgICAgICAgICAgICAgLT4gIE1hdGVyaWFsaXplCisgICAg ICAgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ogajIKKyg5IHJvd3MpCisKK3Nl dCBzZWxmX2pvaW5fc2VhcmNoX2xpbWl0IHRvIDI7CitleHBsYWluIChjb3N0cyBvZmYpIC0t IENvbGxhcHNlIG9uZSBzZWxmIGpvaW4KKyAgc2VsZWN0IGoxLiogZnJvbSBzaiBqMSwgc2og ajIsIHNqIGozIHdoZXJlIChqMS5hID0gajIuYSkgYW5kIChqMi5hID0gajMuYSk7CisgICAg ICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjog KGoyLmEgPSBqMy5hKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIGozCisgICAtPiAgTWF0ZXJp YWxpemUKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBzaiBqMgorICAgICAgICAgICAgICAg RmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKyg2IHJvd3MpCisKK3NldCBzZWxmX2pvaW5fc2Vh cmNoX2xpbWl0IHRvIDM7CitleHBsYWluIChjb3N0cyBvZmYpIC0tIENvbGxhcHNlIGJvdGgg c2VsZiBqb2lucworICBzZWxlY3QgajEuKiBmcm9tIHNqIGoxLCBzaiBqMiwgc2ogajMgd2hl cmUgKGoxLmEgPSBqMi5hKSBhbmQgKGoyLmEgPSBqMy5hKTsKKyAgICAgICAgUVVFUlkgUExB TiAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24g c2ogajMKKyAgIEZpbHRlcjogKGEgSVMgTk9UIE5VTEwpCisoMiByb3dzKQorCityZXNldCBz ZWxmX2pvaW5fc2VhcmNoX2xpbWl0OworLS0gQ2hlY2sgdGhhdCBjbGF1c2VzIGZyb20gdGhl IGpvaW4gZmlsdGVyIGxpc3QgaXMgbm90IGxvc3Qgb24gdGhlIHNlbGYtam9pbiByZW1vdmFs CitDUkVBVEUgVEFCTEUgZW1wMSAoIGlkIFNFUklBTCBQUklNQVJZIEtFWSBOT1QgTlVMTCwg Y29kZSBpbnQpOworZXhwbGFpbiAodmVyYm9zZSwgY29zdHMgb2ZmKQorU0VMRUNUICogRlJP TSBlbXAxIGUxLCBlbXAxIGUyIFdIRVJFIGUxLmlkID0gZTIuaWQgQU5EIGUyLmNvZGUgPD4g ZTEuY29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAg ICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBwdWJsaWMuZW1wMSBlMgorICAg T3V0cHV0OiBlMi5pZCwgZTIuY29kZSwgZTIuaWQsIGUyLmNvZGUKKyAgIEZpbHRlcjogKChl Mi5pZCBJUyBOT1QgTlVMTCkgQU5EIChlMi5jb2RlIDw+IGUyLmNvZGUpKQorKDMgcm93cykK KworLS0gV2UgY2FuIHJlbW92ZSB0aGUgam9pbiBldmVuIGlmIHdlIGZpbmQgdGhlIGpvaW4g Y2FuJ3QgZHVwbGljYXRlIHJvd3MgYW5kCistLSB0aGUgYmFzZSBxdWFscyBvZiBlYWNoIHNp ZGUgYXJlIGRpZmZlcmVudC4gIEluIHRoZSBmb2xsb3dpbmcgY2FzZSB3ZSBlbmQgdXAKKy0t IG1vdmluZyBxdWFscyBvdmVyIHRvIHMxIHRvIG1ha2UgaXQgc28gaXQgY2FuJ3QgbWF0Y2gg YW55IHJvd3MuCitjcmVhdGUgdGFibGUgc2woYSBpbnQsIGIgaW50LCBjIGludCk7CitjcmVh dGUgdW5pcXVlIGluZGV4IG9uIHNsKGEsIGIpOwordmFjdXVtIGFuYWx5emUgc2w7CistLSBC b3RoIHNpZGVzIGFyZSB1bmlxdWUsIGJ1dCBiYXNlIHF1YWxzIGFyZSBkaWZmZXJlbnQKK2V4 cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2wgdDEsIHNsIHQyIHdoZXJlIHQx LmEgPSB0Mi5hIGFuZCB0MS5iID0gMSBhbmQgdDIuYiA9IDI7CisgICAgICAgICAgUVVFUlkg UExBTiAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3Rl ZCBMb29wCisgICBKb2luIEZpbHRlcjogKHQxLmEgPSB0Mi5hKQorICAgLT4gIFNlcSBTY2Fu IG9uIHNsIHQxCisgICAgICAgICBGaWx0ZXI6IChiID0gMSkKKyAgIC0+ICBTZXEgU2NhbiBv biBzbCB0MgorICAgICAgICAgRmlsdGVyOiAoYiA9IDIpCisoNiByb3dzKQorCistLSBDaGVj ayBOdWxsVGVzdCBpbiBiYXNlcmVzdHJpY3RpbmZvIGxpc3QKK2V4cGxhaW4gKGNvc3RzIG9m ZikKK3NlbGVjdCAqIGZyb20gc2wgdDEsIHNsIHQyCit3aGVyZSB0MS5hID0gdDIuYSBhbmQg dDEuYiA9IDEgYW5kIHQyLmIgPSAyCisgIGFuZCB0MS5jIElTIE5PVCBOVUxMIGFuZCB0Mi5j IElTIE5PVCBOVUxMCisgIGFuZCB0Mi5iIElTIE5PVCBOVUxMIGFuZCB0MS5iIElTIE5PVCBO VUxMCisgIGFuZCB0MS5hIElTIE5PVCBOVUxMIGFuZCB0Mi5hIElTIE5PVCBOVUxMOworICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6ICh0MS5hID0gdDIu YSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzbCB0MQorICAgICAgICAgRmlsdGVyOiAoKGMgSVMg Tk9UIE5VTEwpIEFORCAoYiBJUyBOT1QgTlVMTCkgQU5EIChhIElTIE5PVCBOVUxMKSBBTkQg KGIgPSAxKSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzbCB0MgorICAgICAgICAgRmlsdGVyOiAo KGMgSVMgTk9UIE5VTEwpIEFORCAoYiBJUyBOT1QgTlVMTCkgQU5EIChhIElTIE5PVCBOVUxM KSBBTkQgKGIgPSAyKSkKKyg2IHJvd3MpCisKK2V4cGxhaW4gKHZlcmJvc2UsIGNvc3RzIG9m ZikKK3NlbGVjdCAqIGZyb20gc2wgdDEsIHNsIHQyCit3aGVyZSB0MS5iID0gdDIuYiBhbmQg dDIuYSA9IDMgYW5kIHQxLmEgPSAzCisgIGFuZCB0MS5jIElTIE5PVCBOVUxMIGFuZCB0Mi5j IElTIE5PVCBOVUxMCisgIGFuZCB0Mi5iIElTIE5PVCBOVUxMIGFuZCB0MS5iIElTIE5PVCBO VUxMCisgIGFuZCB0MS5hIElTIE5PVCBOVUxMIGFuZCB0Mi5hIElTIE5PVCBOVUxMOworICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBwdWJsaWMuc2wgdDIKKyAg IE91dHB1dDogdDIuYSwgdDIuYiwgdDIuYywgdDIuYSwgdDIuYiwgdDIuYworICAgRmlsdGVy OiAoKHQyLmMgSVMgTk9UIE5VTEwpIEFORCAodDIuYiBJUyBOT1QgTlVMTCkgQU5EICh0Mi5h IElTIE5PVCBOVUxMKSBBTkQgKHQyLmEgPSAzKSkKKygzIHJvd3MpCisKKy0tIEpvaW4gcXVh bCBpc24ndCBtZXJnZWpvaW5hYmxlLCBidXQgaW5uZXIgaXMgdW5pcXVlLgorZXhwbGFpbiAo Q09TVFMgT0ZGKQorU0VMRUNUIG4yLmEgRlJPTSBzaiBuMSwgc2ogbjIgV0hFUkUgbjEuYSA8 PiBuMi5hIEFORCBuMi5hID0gMTsKKyAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9p biBGaWx0ZXI6IChuMS5hIDw+IG4yLmEpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogbjIKKyAg ICAgICAgIEZpbHRlcjogKGEgPSAxKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIG4xCisoNSBy b3dzKQorCitleHBsYWluIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NCisJKFNFTEVDVCBu Mi5hIEZST00gc2ogbjEsIHNqIG4yIFdIRVJFIG4xLmEgPD4gbjIuYSkgcTAsIHNsCitXSEVS RSBxMC5hID0gMTsKKyAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6 IChuMS5hIDw+IG4yLmEpCisgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgIC0+ICBTZXEg U2NhbiBvbiBzbAorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqIG4yCisgICAgICAgICAg ICAgICBGaWx0ZXI6IChhID0gMSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBuMQorKDcgcm93 cykKKworLS0KKy0tLS0gT25seSBvbmUgc2lkZSBpcyB1bnFpdWUKKy0tc2VsZWN0ICogZnJv bSBzbCB0MSwgc2wgdDIgd2hlcmUgdDEuYSA9IHQyLmEgYW5kIHQxLmIgPSAxOworLS1zZWxl Y3QgKiBmcm9tIHNsIHQxLCBzbCB0MiB3aGVyZSB0MS5hID0gdDIuYSBhbmQgdDIuYiA9IDE7 CistLQorLS0tLSBTZXZlcmFsIHVuaXF1ZXMgaW5kZXhlcyBtYXRjaCwgYW5kIHdlIHNlbGVj dCBhIGRpZmZlcmVudCBvbmUKKy0tLS0gZm9yIGVhY2ggc2lkZSwgc28gdGhlIGpvaW4gaXMg bm90IHJlbW92ZWQKKy0tY3JlYXRlIHRhYmxlIHNtKGEgaW50IHVuaXF1ZSwgYiBpbnQgdW5p cXVlLCBjIGludCB1bmlxdWUpOworLS1leHBsYWluIChjb3N0cyBvZmYpCistLXNlbGVjdCAq IGZyb20gc20gbSwgc20gbiB3aGVyZSBtLmEgPSBuLmIgYW5kIG0uYyA9IG4uYzsKKy0tZXhw bGFpbiAoY29zdHMgb2ZmKQorLS1zZWxlY3QgKiBmcm9tIHNtIG0sIHNtIG4gd2hlcmUgbS5h ID0gbi5jIGFuZCBtLmIgPSBuLmI7CistLWV4cGxhaW4gKGNvc3RzIG9mZikKKy0tc2VsZWN0 ICogZnJvbSBzbSBtLCBzbSBuIHdoZXJlIG0uYyA9IG4uYiBhbmQgbS5hID0gbi5hOworLS0g Q2hlY2sgb3B0aW1pemF0aW9uIGRpc2FibGluZyBpZiBpdCB3aWxsIHZpb2xhdGUgc3BlY2lh bCBqb2luIGNvbmRpdGlvbnMuCistLSBUd28gaWRlbnRpY2FsIGpvaW5lZCByZWxhdGlvbnMg c2F0aXNmaWVzIHNlbGYgam9pbiByZW1vdmFsIGNvbmRpdGlvbnMgYnV0CistLSBzdGF5IGlu IGRpZmZlcmVudCBzcGVjaWFsIGpvaW4gaW5mb3MuCitDUkVBVEUgVEFCTEUgc2pfdDEgKGlk IHNlcmlhbCwgYSBpbnQpOworQ1JFQVRFIFRBQkxFIHNqX3QyIChpZCBzZXJpYWwsIGEgaW50 KTsKK0NSRUFURSBUQUJMRSBzal90MyAoaWQgc2VyaWFsLCBhIGludCk7CitDUkVBVEUgVEFC TEUgc2pfdDQgKGlkIHNlcmlhbCwgYSBpbnQpOworQ1JFQVRFIFVOSVFVRSBJTkRFWCBPTiBz al90MyBVU0lORyBidHJlZSAoYSxpZCk7CitDUkVBVEUgVU5JUVVFIElOREVYIE9OIHNqX3Qy IFVTSU5HIGJ0cmVlIChpZCk7CitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9N IHNqX3QxCitKT0lOICgKKwlTRUxFQ1Qgc2pfdDIuaWQgQVMgaWQgRlJPTSBzal90MgorCVdI RVJFIEVYSVNUUworCQkoCisJCVNFTEVDVCBUUlVFIEZST00gc2pfdDMsc2pfdDQgV0hFUkUg c2pfdDMuYSA9IDEgQU5EIHNqX3QzLmlkID0gc2pfdDIuaWQKKwkJKQorCSkgdDJ0M3Q0CitP TiBzal90MS5pZCA9IHQydDN0NC5pZAorSk9JTiAoCisJU0VMRUNUIHNqX3QyLmlkIEFTIGlk IEZST00gc2pfdDIKKwlXSEVSRSBFWElTVFMKKwkJKAorCQlTRUxFQ1QgVFJVRSBGUk9NIHNq X3QzLHNqX3Q0IFdIRVJFIHNqX3QzLmEgPSAxIEFORCBzal90My5pZCA9IHNqX3QyLmlkCisJ CSkKKwkpIF90MnQzdDQKK09OIHNqX3QxLmlkID0gX3QydDN0NC5pZDsKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6IChzal90My5pZCA9IHNqX3QxLmlkKQor ICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICBKb2luIEZpbHRlcjogKHNqX3QyLmlkID0g c2pfdDMuaWQpCisgICAgICAgICAtPiAgTmVzdGVkIExvb3AgU2VtaSBKb2luCisgICAgICAg ICAgICAgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBIYXNo QWdncmVnYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCBLZXk6IHNqX3Qz LmlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgTmVzdGVkIExvb3AKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBzal90NAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgQml0bWFwIEhlYXAgU2NhbiBv biBzal90MworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg UmVjaGVjayBDb25kOiAoYSA9IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gc2pfdDNfYV9pZF9pZHgK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElu ZGV4IENvbmQ6IChhID0gMSkKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBJbmRleCBPbmx5 IFNjYW4gdXNpbmcgc2pfdDJfaWRfaWR4IG9uIHNqX3QyIHNqX3QyXzEKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChpZCA9IHNqX3QzLmlkKQorICAgICAgICAg ICAgICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICAgICAgICAgICAgICAtPiAgSW5kZXgg T25seSBTY2FuIHVzaW5nIHNqX3QzX2FfaWRfaWR4IG9uIHNqX3QzIHNqX3QzXzEKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICgoYSA9IDEpIEFORCAoaWQgPSBz al90My5pZCkpCisgICAgICAgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2pfdDQg c2pfdDRfMQorICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyBzal90Ml9pZF9p ZHggb24gc2pfdDIKKyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChpZCA9IHNqX3QyXzEu aWQpCisgICAtPiAgU2VxIFNjYW4gb24gc2pfdDEKKygyNCByb3dzKQorCistLQorLS0gVGVz dCBSb3dNYXJrcy1yZWxhdGVkIGNvZGUKKy0tCistLSBUT0RPOiBXaHkgdGhpcyBzZWxlY3Qg cmV0dXJucyB0d28gY29waWVzIG9mIGN0aWQgZmllbGQ/IFNob3VsZCB3ZSBmaXggaXQ/CitF WFBMQUlOIChDT1NUUyBPRkYpIC0tIEJvdGggc2lkZXMgaGF2ZSBleHBsaWNpdCBMb2NrUm93 cyBtYXJrcworU0VMRUNUIGExLmEgRlJPTSBzaiBhMSxzaiBhMiBXSEVSRSAoYTEuYT1hMi5h KSBGT1IgVVBEQVRFOworICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBMb2NrUm93cworICAgLT4gIFNlcSBT Y2FuIG9uIHNqIGEyCisgICAgICAgICBGaWx0ZXI6IChhIElTIE5PVCBOVUxMKQorKDMgcm93 cykKKworRVhQTEFJTiAoQ09TVFMgT0ZGKSAtLSBBIFJvd01hcmsgZXhpc3RzIGZvciB0aGUg dGFibGUgYmVpbmcga2VwdAorVVBEQVRFIHNqIHNxIFNFVCBiID0gMSBGUk9NIHNqIGFzIHN6 IFdIRVJFIHNxLmEgPSBzei5hOworICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBVcGRhdGUgb24gc2ogc3EK KyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBzegorICAgICAgICAgRmlsdGVyOiAoYSBJUyBOT1Qg TlVMTCkKKygzIHJvd3MpCisKK0NSRUFURSBSVUxFIHNqX2RlbF9ydWxlIEFTIE9OIERFTEVU RSBUTyBzagorICBETyBJTlNURUFECisgICAgVVBEQVRFIHNqIFNFVCBhID0gMSBXSEVSRSBh ID0gb2xkLmE7CitFWFBMQUlOIChDT1NUUyBPRkYpIERFTEVURSBGUk9NIHNqOyAtLSBBIFJv d01hcmsgZXhpc3RzIGZvciB0aGUgdGFibGUgYmVpbmcgZHJvcHBlZAorICAgICAgICAgICBR VUVSWSBQTEFOICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyBVcGRhdGUgb24gc2oKKyAgIC0+ICBTZXEgU2NhbiBvbiBzagorICAgICAgICAgRmls dGVyOiAoYSBJUyBOT1QgTlVMTCkKKygzIHJvd3MpCisKK0RST1AgUlVMRSBzal9kZWxfcnVs ZSBPTiBzaiBDQVNDQURFOworcmVzZXQgZW5hYmxlX2hhc2hqb2luOworcmVzZXQgZW5hYmxl X21lcmdlam9pbjsKIC0tCiAtLSBUZXN0IGhpbnRzIGdpdmVuIG9uIGluY29ycmVjdCBjb2x1 bW4gcmVmZXJlbmNlcyBhcmUgdXNlZnVsCiAtLQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVn cmVzcy9leHBlY3RlZC9zeXN2aWV3cy5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVk L3N5c3ZpZXdzLm91dAppbmRleCBhYWU1ZDUxZTFjLi4yNzEzMTNlYmY4IDEwMDY0NAotLS0g YS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91dAorKysgYi9zcmMvdGVz dC9yZWdyZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91dApAQCAtMTI5LDEwICsxMjksMTEgQEAg c2VsZWN0IG5hbWUsIHNldHRpbmcgZnJvbSBwZ19zZXR0aW5ncyB3aGVyZSBuYW1lIGxpa2Ug J2VuYWJsZSUnOwogIGVuYWJsZV9wYXJ0aXRpb253aXNlX2FnZ3JlZ2F0ZSB8IG9mZgogIGVu YWJsZV9wYXJ0aXRpb253aXNlX2pvaW4gICAgICB8IG9mZgogIGVuYWJsZV9wcmVzb3J0ZWRf YWdncmVnYXRlICAgICB8IG9uCisgZW5hYmxlX3NlbGZfam9pbl9yZW1vdmFsICAgICAgIHwg b24KICBlbmFibGVfc2Vxc2NhbiAgICAgICAgICAgICAgICAgfCBvbgogIGVuYWJsZV9zb3J0 ICAgICAgICAgICAgICAgICAgICB8IG9uCiAgZW5hYmxlX3RpZHNjYW4gICAgICAgICAgICAg ICAgIHwgb24KLSgyMSByb3dzKQorKDIyIHJvd3MpCiAKIC0tIFRoZXJlIGFyZSBhbHdheXMg d2FpdCBldmVudCBkZXNjcmlwdGlvbnMgZm9yIHZhcmlvdXMgdHlwZXMuCiBzZWxlY3QgdHlw ZSwgY291bnQoKikgPiAwIGFzIG9rIEZST00gcGdfd2FpdF9ldmVudHMKZGlmZiAtLWdpdCBh L3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvdXBkYXRhYmxlX3ZpZXdzLm91dCBiL3NyYy90 ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvdXBkYXRhYmxlX3ZpZXdzLm91dAppbmRleCAxOTUwZTZm MjgxLi5hNzNjMWY5MGM0IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVk L3VwZGF0YWJsZV92aWV3cy5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC91 cGRhdGFibGVfdmlld3Mub3V0CkBAIC0yNDk5LDE2ICsyNDk5LDEzIEBAIFNFTEVDVCAqIEZS T00gcndfdmlldzE7CiAoMSByb3cpCiAKIEVYUExBSU4gKGNvc3RzIG9mZikgREVMRVRFIEZS T00gcndfdmlldzEgV0hFUkUgaWQgPSAxIEFORCBzbm9vcChkYXRhKTsKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KLSBVcGRhdGUgb24gYmFzZV90YmwgYmFzZV90YmxfMQotICAg LT4gIE5lc3RlZCBMb29wCi0gICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyBiYXNlX3Ri bF9wa2V5IG9uIGJhc2VfdGJsIGJhc2VfdGJsXzEKLSAgICAgICAgICAgICAgIEluZGV4IENv bmQ6IChpZCA9IDEpCi0gICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyBiYXNlX3RibF9w a2V5IG9uIGJhc2VfdGJsCi0gICAgICAgICAgICAgICBJbmRleCBDb25kOiAoaWQgPSAxKQot ICAgICAgICAgICAgICAgRmlsdGVyOiAoKE5PVCBkZWxldGVkKSBBTkQgc25vb3AoZGF0YSkp Ci0oNyByb3dzKQorICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgVXBkYXRlIG9uIGJhc2VfdGJsCisgICAtPiAgSW5kZXggU2NhbiB1c2luZyBi YXNlX3RibF9wa2V5IG9uIGJhc2VfdGJsCisgICAgICAgICBJbmRleCBDb25kOiAoaWQgPSAx KQorICAgICAgICAgRmlsdGVyOiAoKE5PVCBkZWxldGVkKSBBTkQgc25vb3AoZGF0YSkpCiso NCByb3dzKQogCiBERUxFVEUgRlJPTSByd192aWV3MSBXSEVSRSBpZCA9IDEgQU5EIHNub29w KGRhdGEpOwogTk9USUNFOiAgc25vb3BlZCB2YWx1ZTogUm93IDEKZGlmZiAtLWdpdCBhL3Ny Yy90ZXN0L3JlZ3Jlc3Mvc3FsL2VxdWl2Y2xhc3Muc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9z cWwvZXF1aXZjbGFzcy5zcWwKaW5kZXggMjQ3YjBhMzEwNS4uNzdkZDk2NGViZiAxMDA2NDQK LS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZXF1aXZjbGFzcy5zcWwKKysrIGIvc3JjL3Rl c3QvcmVncmVzcy9zcWwvZXF1aXZjbGFzcy5zcWwKQEAgLTI1OSw2ICsyNTksMjIgQEAgZHJv cCB1c2VyIHJlZ3Jlc3NfdXNlcl9lY3Rlc3Q7CiBleHBsYWluIChjb3N0cyBvZmYpCiAgIHNl bGVjdCAqIGZyb20gdGVuazEgd2hlcmUgdW5pcXVlMSA9IHVuaXF1ZTEgYW5kIHVuaXF1ZTIg PSB1bmlxdWUyOwogCistLSBUZXN0IHRoYXQgYnJva2VuIEVDcyBhcmUgcHJvY2Vzc2VkIGNv cnJlY3RseSBkdXJpbmcgc2VsZiBqb2luIHJlbW92YWwuCistLSBEaXNhYmxlIG1lcmdlIGpv aW5zIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGFuIGVycm9yIGFib3V0IG1pc3NpbmcgY29tbXV0 YXRvci4KKy0tIFRlc3QgYm90aCBvcmllbnRhdGlvbnMgb2YgdGhlIGpvaW4gY2xhdXNlLCBi ZWNhdXNlIG9ubHkgb25lIG9mIHRoZW0gYnJlYWtzCistLSB0aGUgRUMuCitzZXQgZW5hYmxl X21lcmdlam9pbiB0byBvZmY7CisKK2V4cGxhaW4gKGNvc3RzIG9mZikKKyAgc2VsZWN0ICog ZnJvbSBlYzAgbSBqb2luIGVjMCBuIG9uIG0uZmYgPSBuLmZmCisgIGpvaW4gZWMxIHAgb24g bS5mZiArIG4uZmYgPSBwLmYxOworCitleHBsYWluIChjb3N0cyBvZmYpCisgIHNlbGVjdCAq IGZyb20gZWMwIG0gam9pbiBlYzAgbiBvbiBtLmZmID0gbi5mZgorICBqb2luIGVjMSBwIG9u IHAuZjE6OmludDggPSAobS5mZiArIG4uZmYpOjppbnQ4YWxpYXMxOworCityZXNldCBlbmFi bGVfbWVyZ2Vqb2luOworCiAtLSB0aGlzIGNvdWxkIGJlIGNvbnZlcnRlZCwgYnV0IGlzbid0 IGF0IHByZXNlbnQKIGV4cGxhaW4gKGNvc3RzIG9mZikKICAgc2VsZWN0ICogZnJvbSB0ZW5r MSB3aGVyZSB1bmlxdWUxID0gdW5pcXVlMSBvciB1bmlxdWUyID0gdW5pcXVlMjsKZGlmZiAt LWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pvaW4uc3FsIGIvc3JjL3Rlc3QvcmVncmVz cy9zcWwvam9pbi5zcWwKaW5kZXggM2U1MDMyYjA0ZC4uMWE2NDM2MzgzNyAxMDA2NDQKLS0t IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvam9pbi5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVz cy9zcWwvam9pbi5zcWwKQEAgLTIzMDksNiArMjMwOSwzNjYgQEAgc2VsZWN0ICogZnJvbQog c2VsZWN0ICogZnJvbQogICBpbnQ4X3RibCB4IGpvaW4gKGludDRfdGJsIHggY3Jvc3Mgam9p biBpbnQ0X3RibCB5KGZmKSkgaiBvbiBxMSA9IGYxOyAtLSBvawogCistLQorLS0gdGVzdCB0 aGF0IHNlbWktIG9yIGlubmVyIHNlbGYtam9pbnMgb24gYSB1bmlxdWUgY29sdW1uIGFyZSBy ZW1vdmVkCistLQorCistLSBlbmFibGUgb25seSBuZXN0bG9vcCB0byBnZXQgbW9yZSBwcmVk aWN0YWJsZSBwbGFucworc2V0IGVuYWJsZV9oYXNoam9pbiB0byBvZmY7CitzZXQgZW5hYmxl X21lcmdlam9pbiB0byBvZmY7CisKK2NyZWF0ZSB0YWJsZSBzaiAoYSBpbnQgdW5pcXVlLCBi IGludCwgYyBpbnQgdW5pcXVlKTsKK2luc2VydCBpbnRvIHNqIHZhbHVlcyAoMSwgbnVsbCwg MiksIChudWxsLCAyLCBudWxsKSwgKDIsIDEsIDEpOworYW5hbHl6ZSBzajsKKworLS0gVHJp dmlhbCBzZWxmLWpvaW4gY2FzZS4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCBwLiog ZnJvbSBzaiBwLCBzaiBxIHdoZXJlIHEuYSA9IHAuYSBhbmQgcS5iID0gcS5hIC0gMTsKK3Nl bGVjdCBwLiogZnJvbSBzaiBwLCBzaiBxIHdoZXJlIHEuYSA9IHAuYSBhbmQgcS5iID0gcS5h IC0gMTsKKworLS0gU2VsZi1qb2luIHJlbW92YWwgcGVyZm9ybXMgYWZ0ZXIgYSBzdWJxdWVy eSBwdWxsLXVwIHByb2Nlc3MgYW5kIGNvdWxkIHJlbW92ZQorLS0gc3VjaCBraW5kIG9mIHNl bGYtam9pbiB0b28uIENoZWNrIHRoaXMgb3B0aW9uLgorZXhwbGFpbiAoY29zdHMgb2ZmKQor c2VsZWN0ICogZnJvbSBzaiBwCit3aGVyZSBleGlzdHMgKHNlbGVjdCAqIGZyb20gc2ogcQor CQkJCXdoZXJlIHEuYSA9IHAuYSBhbmQgcS5iIDwgMTApOworc2VsZWN0ICogZnJvbSBzaiBw IHdoZXJlIGV4aXN0cyAoc2VsZWN0ICogZnJvbSBzaiBxIHdoZXJlIHEuYSA9IHAuYSBhbmQg cS5iIDwgMTApOworCistLSBEb24ndCByZW1vdmUgc2VsZi1qb2luIGZvciB0aGUgY2FzZSBv ZiBlcXVhbGl0eSBvZiB0d28gZGlmZmVyZW50IHVuaXF1ZSBjb2x1bW5zLgorZXhwbGFpbiAo Y29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB0MSwgc2ogdDIgd2hlcmUgdDEuYSA9IHQy LmMgYW5kIHQxLmIgaXMgbm90IG51bGw7CisKKy0tIERlZ2VuZXJhdGVkIGNhc2UuCitleHBs YWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tCisJKHNlbGVjdCBhIGFzIHggZnJvbSBz aiB3aGVyZSBmYWxzZSkgYXMgcTEsCisJKHNlbGVjdCBhIGFzIHkgZnJvbSBzaiB3aGVyZSBm YWxzZSkgYXMgcTIKK3doZXJlIHExLnggPSBxMi55OworCistLSBXZSBjYW4ndCB1c2UgYSBj cm9zcy1FQyBnZW5lcmF0ZWQgc2VsZiBqb2luIHF1YWwgYmVjYXVzZSBvZiBjdXJyZW50IGxv Z2ljIG9mCistLSB0aGUgZ2VuZXJhdGVfam9pbl9pbXBsaWVkX2VxdWFsaXRpZXMgcm91dGlu ZS4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogdDEsIHNqIHQyIHdo ZXJlIHQxLmEgPSB0MS5iIGFuZCB0MS5iID0gdDIuYiBhbmQgdDIuYiA9IHQyLmE7CitleHBs YWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHQxLCBzaiB0Miwgc2ogdDMKK3do ZXJlIHQxLmEgPSB0MS5iIGFuZCB0MS5iID0gdDIuYiBhbmQgdDIuYiA9IHQyLmEKKwlhbmQg dDEuYiA9IHQzLmIgYW5kIHQzLmIgPSB0My5hOworCistLSBEb3VibGUgc2VsZi1qb2luIHJl bW92YWwuCistLSBVc2UgYSBjb25kaXRpb24gb24gImIgKyAxIiwgbm90IG9uICJiIiwgZm9y IHRoZSBzZWNvbmQgam9pbiwgc28gdGhhdAorLS0gdGhlIGVxdWl2YWxlbmNlIGNsYXNzIGlz IGRpZmZlcmVudCBmcm9tIHRoZSBmaXJzdCBvbmUsIGFuZCB3ZSBjYW4KKy0tIHRlc3QgdGhl IG5vbi1lYyBjb2RlIHBhdGguCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9t IHNqIHQxIGpvaW4gc2ogdDIgb24gdDEuYSA9IHQyLmEgYW5kIHQxLmIgPSB0Mi5iCisJam9p biBzaiB0MyBvbiB0Mi5hID0gdDMuYSBhbmQgdDIuYiArIDEgPSB0My5iICsgMTsKKworLS0g c3Vic2VsZWN0IHRoYXQgcmVmZXJlbmNlcyB0aGUgcmVtb3ZlZCByZWxhdGlvbgorZXhwbGFp biAoY29zdHMgb2ZmKQorc2VsZWN0IHQxLmEsIChzZWxlY3QgYSBmcm9tIHNqIHdoZXJlIGEg PSB0Mi5hIGFuZCBhID0gdDEuYSkKK2Zyb20gc2ogdDEsIHNqIHQyCit3aGVyZSB0MS5hID0g dDIuYTsKKworLS0gc2VsZi1qb2luIHVuZGVyIG91dGVyIGpvaW4KK2V4cGxhaW4gKGNvc3Rz IG9mZikKK3NlbGVjdCAqIGZyb20gc2ogeCBqb2luIHNqIHkgb24geC5hID0geS5hCitsZWZ0 IGpvaW4gaW50OF90YmwgeiBvbiB4LmEgPSB6LnExOworCitleHBsYWluIChjb3N0cyBvZmYp CitzZWxlY3QgKiBmcm9tIHNqIHggam9pbiBzaiB5IG9uIHguYSA9IHkuYQorbGVmdCBqb2lu IGludDhfdGJsIHogb24geS5hID0gei5xMTsKKworZXhwbGFpbiAoY29zdHMgb2ZmKQorU0VM RUNUICogRlJPTSAoCisgIFNFTEVDVCB0MS4qLCB0Mi5hIEFTIGF4IEZST00gc2ogdDEgSk9J TiBzaiB0MgorICBPTiAodDEuYSA9IHQyLmEgQU5EIHQxLmMqdDEuYyA9IHQyLmMrMiBBTkQg dDIuYiBJUyBOVUxMKQorKSBBUyBxMQorTEVGVCBKT0lOCisgIChTRUxFQ1QgdDMuKiBGUk9N IHNqIHQzLCBzaiB0NCBXSEVSRSB0My5jID0gdDQuYykgQVMgcTIKK09OIHExLmF4ID0gcTIu YTsKKworLS0gVGVzdCB0aGF0IHBsYWNlaG9sZGVycyBhcmUgdXBkYXRlZCBjb3JyZWN0bHkg YWZ0ZXIgam9pbiByZW1vdmFsCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9t ICh2YWx1ZXMgKDEpKSB4CitsZWZ0IGpvaW4gKHNlbGVjdCBjb2FsZXNjZSh5LnExLCAxKSBm cm9tIGludDhfdGJsIHkKKwlyaWdodCBqb2luIHNqIGoxIGlubmVyIGpvaW4gc2ogajIgb24g ajEuYSA9IGoyLmEKKwlvbiB0cnVlKSB6CitvbiB0cnVlOworCistLSBDaGVjayB1cGRhdGlu ZyBvZiBMYXRlcmFsIGxpbmtzIGZyb20gdG9wLWxldmVsIHF1ZXJ5IHRvIHRoZSByZW1vdmlu ZyByZWxhdGlvbgorZXhwbGFpbiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTSBwZ19hbSBh bSBXSEVSRSBhbS5hbW5hbWUgSU4gKAorICBTRUxFQ1QgYzEucmVsbmFtZSBBUyByZWxuYW1l CisgIEZST00gcGdfY2xhc3MgYzEKKyAgICBKT0lOIHBnX2NsYXNzIGMyCisgICAgT04gYzEu b2lkPWMyLm9pZCBBTkQgYzEub2lkIDwgMTAKKyk7CisKKy0tCistLSBTSlIgY29ybmVyIGNh c2U6IHVuaXF1ZW5lc3Mgb2YgYW4gaW5uZXIgaXMgW3BhcnRpYWxseV0gZGVyaXZlZCBmcm9t CistLSBiYXNlcmVzdHJpY3RpbmZvIGNsYXVzZXMuCistLSBYWFg6IFdlIHJlYWxseSBzaG91 bGQgYWxsb3cgU0pSIGZvciB0aGVzZSBjb3JuZXIgY2FzZXM/CistLQorCitJTlNFUlQgSU5U TyBzaiBWQUxVRVMgKDMsIDEsIDMpOworCitleHBsYWluIChjb3N0cyBvZmYpIC0tIERvbid0 IHJlbW92ZSBTSgorCVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyIFdIRVJFIGoxLmIgPSBq Mi5iIEFORCBqMS5hID0gMiBBTkQgajIuYSA9IDM7CitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBz aiBqMgorV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEgPSAyIEFORCBqMi5hID0gMzsgLS0g UmV0dXJuIG9uZSByb3cKKworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBSZW1vdmUgU0osIGRl ZmluZSB1bmlxdWVuZXNzIGJ5IGEgY29uc3RhbnQKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBz aiBqMiBXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSA9IDIgQU5EIGoyLmEgPSAyOworU0VM RUNUICogRlJPTSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0g MiBBTkQgajIuYSA9IDI7IC0tIFJldHVybiBvbmUgcm93CisKK0VYUExBSU4gKENPU1RTIE9G RikKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIuYgorICBB TkQgajEuYSA9IChFWFRSQUNUKERPVyBGUk9NIGN1cnJlbnRfdGltZXN0YW1wKDApKS8xNSAr IDMpOjppbnQKKyAgQU5EIChFWFRSQUNUKERPVyBGUk9NIGN1cnJlbnRfdGltZXN0YW1wKDAp KS8xNSArIDMpOjppbnQgPSBqMi5hCis7IC0tIFJlbW92ZSBTSiwgZGVmaW5lIHVuaXF1ZW5l c3MgYnkgYSBjb25zdGFudCBleHByZXNzaW9uCitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBq MgorV0hFUkUgajEuYiA9IGoyLmIKKyAgQU5EIGoxLmEgPSAoRVhUUkFDVChET1cgRlJPTSBj dXJyZW50X3RpbWVzdGFtcCgwKSkvMTUgKyAzKTo6aW50CisgIEFORCAoRVhUUkFDVChET1cg RlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSkvMTUgKyAzKTo6aW50ID0gajIuYQorOyAtLSBS ZXR1cm4gb25lIHJvdworCitleHBsYWluIChjb3N0cyBvZmYpIC0tIFJlbW92ZSBTSgorCVNF TEVDVCAqIEZST00gc2ogajEsIHNqIGoyIFdIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0g MSBBTkQgajIuYSA9IDE7CitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorV0hFUkUgajEu YiA9IGoyLmIgQU5EIGoxLmEgPSAxIEFORCBqMi5hID0gMTsgLS0gUmV0dXJuIG5vIHJvd3MK KworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBTaHVmZmxlIGEgY2xhdXNlLiBSZW1vdmUgU0oK KwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMiBXSEVSRSBqMS5iID0gajIuYiBBTkQgMSA9 IGoxLmEgQU5EIGoyLmEgPSAxOworU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKK1dIRVJF IGoxLmIgPSBqMi5iIEFORCAxID0gajEuYSBBTkQgajIuYSA9IDE7IC0tIFJldHVybiBubyBy b3dzCisKKy0tIFNKRSBDb3JuZXIgY2FzZTogYSAnYS54PWEueCcgY2xhdXNlLCBoYXZlIHJl cGxhY2VkIHdpdGggJ2EueCBJUyBOT1QgTlVMTCcKKy0tIGFmdGVyIFNKIGVsaW1pbmF0aW9u IGl0IHNob3VsZG4ndCBiZSBhIG1lcmdlam9pbmFibGUgY2xhdXNlLgorU0VMRUNUIHQ0LioK K0ZST00gKFNFTEVDVCB0MS4qLCB0Mi5hIEFTIGExIEZST00gc2ogdDEsIHNqIHQyIFdIRVJF IHQxLmIgPSB0Mi5iKSBBUyB0MworSk9JTiBzaiB0NCBPTiAodDQuYSA9IHQzLmEpIFdIRVJF IHQzLmExID0gNDI7CitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgdDQuKgorRlJPTSAo U0VMRUNUIHQxLiosIHQyLmEgQVMgYTEgRlJPTSBzaiB0MSwgc2ogdDIgV0hFUkUgdDEuYiA9 IHQyLmIpIEFTIHQzCitKT0lOIHNqIHQ0IE9OICh0NC5hID0gdDMuYSkgV0hFUkUgdDMuYTEg PSA0MgorOyAtLSBTSnMgbXVzdCBiZSByZW1vdmVkLgorCistLSBGdW5jdGlvbmFsIGluZGV4 CitDUkVBVEUgVU5JUVVFIElOREVYIHNqX2ZuX2lkeCBPTiBzaigoYSAqIGEpKTsKK2V4cGxh aW4gKGNvc3RzIG9mZikgLS0gUmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwgc2og ajIKKwlXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSpqMS5hID0gMSBBTkQgajIuYSpqMi5h ID0gMTsKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gRG9uJ3QgcmVtb3ZlIFNKCisJU0VMRUNU ICogRlJPTSBzaiBqMSwgc2ogajIKKwlXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSpqMS5h ID0gMSBBTkQgajIuYSpqMi5hID0gMjsKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAq IEZST00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIuYgorICBBTkQgKGoxLmEqajEu YSkgPSAoRVhUUkFDVChET1cgRlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSkvMTUgKyAzKTo6 aW50CisgIEFORCAoRVhUUkFDVChET1cgRlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSkvMTUg KyAzKTo6aW50ID0gKGoyLmEqajIuYSkKKzsgLS0gUmVzdHJpY3Rpb24gY29udGFpbnMgZXhw cmVzc2lvbnMgaW4gYm90aCBzaWRlcywgUmVtb3ZlIFNKLgorU0VMRUNUICogRlJPTSBzaiBq MSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iCisgIEFORCAoajEuYSpqMS5hKSA9IChFWFRS QUNUKERPVyBGUk9NIGN1cnJlbnRfdGltZXN0YW1wKDApKS8xNSArIDMpOjppbnQKKyAgQU5E IChFWFRSQUNUKERPVyBGUk9NIGN1cnJlbnRfdGltZXN0YW1wKDApKS8xNSArIDMpOjppbnQg PSAoajIuYSpqMi5hKQorOyAtLSBFbXB0eSBzZXQgb2Ygcm93cyBzaG91bGQgYmUgcmV0dXJu ZWQKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCitX SEVSRSBqMS5iID0gajIuYgorICBBTkQgKGoxLmEqajEuYSkgPSAocmFuZG9tKCkvMyArIDMp OjppbnQKKyAgQU5EIChyYW5kb20oKS8zICsgMyk6OmludCA9IChqMi5hKmoyLmEpCis7IC0t IFJlc3RyaWN0aW9uIGNvbnRhaW5zIHZvbGF0aWxlIGZ1bmN0aW9uIC0gZGlzYWJsZSBTSlIg ZmVhdHVyZS4KK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIu YgorICBBTkQgKGoxLmEqajEuYy8zKSA9IChyYW5kb20oKS8zICsgMyk6OmludAorICBBTkQg KHJhbmRvbSgpLzMgKyAzKTo6aW50ID0gKGoyLmEqajIuYy8zKQorOyAtLSBSZXR1cm4gb25l IHJvdworCistLSBNdWx0aXBsZSBmaWx0ZXJzCitDUkVBVEUgVU5JUVVFIElOREVYIHNqX3Rl bXBfaWR4MSBPTiBzaihhLGIsYyk7CitleHBsYWluIChjb3N0cyBvZmYpIC0tIFJlbW92ZSBT SgorCVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCisJV0hFUkUgajEuYiA9IGoyLmIgQU5E IGoxLmEgPSAyIEFORCBqMS5jID0gMyBBTkQgajIuYSA9IDIgQU5EIDMgPSBqMi5jOworZXhw bGFpbiAoY29zdHMgb2ZmKSAtLSBEb24ndCByZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNq IGoxLCBzaiBqMgorCVdIRVJFIGoxLmIgPSBqMi5iIEFORCAyID0gajEuYSBBTkQgajEuYyA9 IDMgQU5EIGoyLmEgPSAxIEFORCAzID0gajIuYzsKKworQ1JFQVRFIFVOSVFVRSBJTkRFWCBz al90ZW1wX2lkeCBPTiBzaihhLGIpOworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBEb24ndCBy ZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMiBXSEVSRSBqMS5iID0gajIu YiBBTkQgajEuYSA9IDI7CitleHBsYWluIChjb3N0cyBvZmYpIC0tIERvbid0IHJlbW92ZSBT SgorCVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyIFdIRVJFIGoxLmIgPSBqMi5iIEFORCAy ID0gajIuYTsKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gRG9uJ3QgcmVtb3ZlIFNKCisJU0VM RUNUICogRlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIChqMS5hID0g MSBPUiBqMi5hID0gMSk7CitEUk9QIElOREVYIHNqX2ZuX2lkeCwgc2pfdGVtcF9pZHgxLCBz al90ZW1wX2lkeDsKKworLS0gVGVzdCB0aGF0IE9SIHByZWRpY2F0ZWQgYXJlIHVwZGF0ZWQg Y29ycmVjdGx5IGFmdGVyIGpvaW4gcmVtb3ZhbAorQ1JFQVRFIFRBQkxFIHRhYl93aXRoX2Zs YWcgKCBpZCBJTlQgUFJJTUFSWSBLRVksIGlzX2ZsYWcgU01BTExJTlQpOworQ1JFQVRFIElO REVYIGlkeF90ZXN0X2lzX2ZsYWcgT04gdGFiX3dpdGhfZmxhZyAoaXNfZmxhZyk7CitleHBs YWluIChjb3N0cyBvZmYpCitTRUxFQ1QgQ09VTlQoKikgRlJPTSB0YWJfd2l0aF9mbGFnCitX SEVSRQorCShpc19mbGFnIElTIE5VTEwgT1IgaXNfZmxhZyA9IDApCisJQU5EIGlkIElOIChT RUxFQ1QgaWQgRlJPTSB0YWJfd2l0aF9mbGFnIFdIRVJFIGlkIElOICgyLCAzKSk7CitEUk9Q IFRBQkxFIHRhYl93aXRoX2ZsYWc7CisKKy0tIEhBVklORyBjbGF1c2UKK2V4cGxhaW4gKGNv c3RzIG9mZikKK3NlbGVjdCBwLmIgZnJvbSBzaiBwIGpvaW4gc2ogcSBvbiBwLmEgPSBxLmEg Z3JvdXAgYnkgcC5iIGhhdmluZyBzdW0ocC5hKSA9IDE7CisKKy0tIHVwZGF0ZSBsYXRlcmFs IHJlZmVyZW5jZXMgYW5kIHJhbmdlIHRhYmxlIGVudHJ5IHJlZmVyZW5jZQorZXhwbGFpbiAo dmVyYm9zZSwgY29zdHMgb2ZmKQorc2VsZWN0IDEgZnJvbSAoc2VsZWN0IHguKiBmcm9tIHNq IHgsIHNqIHkgd2hlcmUgeC5hID0geS5hKSBxLAorICBsYXRlcmFsIGdlbmVyYXRlX3Nlcmll cygxLCBxLmEpIGdzKGkpOworCitleHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYpCitzZWxl Y3QgMSBmcm9tIChzZWxlY3QgeS4qIGZyb20gc2ogeCwgc2ogeSB3aGVyZSB4LmEgPSB5LmEp IHEsCisgIGxhdGVyYWwgZ2VuZXJhdGVfc2VyaWVzKDEsIHEuYSkgZ3MoaSk7CisKKy0tIFRl c3QgdGhhdCBhIG5vbi1FQy1kZXJpdmVkIGpvaW4gY2xhdXNlIGlzIHByb2Nlc3NlZCBjb3Jy ZWN0bHkuIFVzZSBhbgorLS0gb3V0ZXIgam9pbiBzbyB0aGF0IHdlIGNhbid0IGZvcm0gYW4g RUMuCitleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCAqIGZyb20gc2ogcCBqb2luIHNqIHEg b24gcC5hID0gcS5hCisgIGxlZnQgam9pbiBzaiByIG9uIHAuYSArIHEuYSA9IHIuYTsKKwor LS0gRklYTUUgdGhpcyBjb25zdGFudCBmYWxzZSBmaWx0ZXIgZG9lc24ndCBsb29rIGdvb2Qu IFNob3VsZCB3ZSBtZXJnZQorLS0gZXF1aXZhbGVuY2UgY2xhc3Nlcz8KK2V4cGxhaW4gKGNv c3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogcCwgc2ogcSB3aGVyZSBwLmEgPSBxLmEgYW5k IHAuYiA9IDEgYW5kIHEuYiA9IDI7CisKKy0tIENoZWNrIHRoYXQgYXR0cl9uZWVkZWQgaXMg dXBkYXRlZCBjb3JyZWN0bHkgYWZ0ZXIgc2VsZi1qb2luIHJlbW92YWwuIEluIHRoaXMKKy0t IHRlc3QsIHRoZSBqb2luIG9mIGoxIHdpdGggajIgaXMgcmVtb3ZlZC4gazEuYiBpcyByZXF1 aXJlZCBhdCBlaXRoZXIgajEgb3IgajIuCistLSBJZiB0aGlzIGluZm8gaXMgbG9zdCwgam9p biB0YXJnZXRsaXN0IGZvciAoazEsIGsyKSB3aWxsIG5vdCBjb250YWluIGsxLmIuCistLSBV c2UgaW5kZXggc2NhbiBmb3IgazEgc28gdGhhdCB3ZSBkb24ndCBnZXQgJ2InIGZyb20gcGh5 c2ljYWwgdGxpc3QgdXNlZCBmb3IKKy0tIHNlcXNjYW4uIEFsc28gZGlzYWJsZSByZW9yZGVy aW5nIG9mIGpvaW5zIGJlY2F1c2UgdGhpcyB0ZXN0IGRlcGVuZHMgb24gYQorLS0gcGFydGlj dWxhciBqb2luIHRyZWUuCitjcmVhdGUgdGFibGUgc2sgKGEgaW50LCBiIGludCk7CitjcmVh dGUgaW5kZXggb24gc2soYSk7CitzZXQgam9pbl9jb2xsYXBzZV9saW1pdCB0byAxOworc2V0 IGVuYWJsZV9zZXFzY2FuIHRvIG9mZjsKK2V4cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0IDEg ZnJvbQorCShzayBrMSBqb2luIHNrIGsyIG9uIGsxLmEgPSBrMi5hKQorCWpvaW4gKHNqIGox IGpvaW4gc2ogajIgb24gajEuYSA9IGoyLmEpIG9uIGoxLmIgPSBrMS5iOworZXhwbGFpbiAo Y29zdHMgb2ZmKSBzZWxlY3QgMSBmcm9tCisJKHNrIGsxIGpvaW4gc2sgazIgb24gazEuYSA9 IGsyLmEpCisJam9pbiAoc2ogajEgam9pbiBzaiBqMiBvbiBqMS5hID0gajIuYSkgb24gajIu YiA9IGsxLmI7CityZXNldCBqb2luX2NvbGxhcHNlX2xpbWl0OworcmVzZXQgZW5hYmxlX3Nl cXNjYW47CisKK3NldCBzZWxmX2pvaW5fc2VhcmNoX2xpbWl0IHRvIDE7CitleHBsYWluIChj b3N0cyBvZmYpIC0tIE5vIG9uZSBzZWxmIGpvaW4gc2hvdWxkIGJlIGNvbGxhcHNlZAorICBz ZWxlY3QgajEuKiBmcm9tIHNqIGoxLCBzaiBqMiwgc2ogajMgd2hlcmUgKGoxLmEgPSBqMi5h KSBhbmQgKGoyLmEgPSBqMy5hKTsKK3NldCBzZWxmX2pvaW5fc2VhcmNoX2xpbWl0IHRvIDI7 CitleHBsYWluIChjb3N0cyBvZmYpIC0tIENvbGxhcHNlIG9uZSBzZWxmIGpvaW4KKyAgc2Vs ZWN0IGoxLiogZnJvbSBzaiBqMSwgc2ogajIsIHNqIGozIHdoZXJlIChqMS5hID0gajIuYSkg YW5kIChqMi5hID0gajMuYSk7CitzZXQgc2VsZl9qb2luX3NlYXJjaF9saW1pdCB0byAzOwor ZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBDb2xsYXBzZSBib3RoIHNlbGYgam9pbnMKKyAgc2Vs ZWN0IGoxLiogZnJvbSBzaiBqMSwgc2ogajIsIHNqIGozIHdoZXJlIChqMS5hID0gajIuYSkg YW5kIChqMi5hID0gajMuYSk7CityZXNldCBzZWxmX2pvaW5fc2VhcmNoX2xpbWl0OworCist LSBDaGVjayB0aGF0IGNsYXVzZXMgZnJvbSB0aGUgam9pbiBmaWx0ZXIgbGlzdCBpcyBub3Qg bG9zdCBvbiB0aGUgc2VsZi1qb2luIHJlbW92YWwKK0NSRUFURSBUQUJMRSBlbXAxICggaWQg U0VSSUFMIFBSSU1BUlkgS0VZIE5PVCBOVUxMLCBjb2RlIGludCk7CitleHBsYWluICh2ZXJi b3NlLCBjb3N0cyBvZmYpCitTRUxFQ1QgKiBGUk9NIGVtcDEgZTEsIGVtcDEgZTIgV0hFUkUg ZTEuaWQgPSBlMi5pZCBBTkQgZTIuY29kZSA8PiBlMS5jb2RlOworCistLSBXZSBjYW4gcmVt b3ZlIHRoZSBqb2luIGV2ZW4gaWYgd2UgZmluZCB0aGUgam9pbiBjYW4ndCBkdXBsaWNhdGUg cm93cyBhbmQKKy0tIHRoZSBiYXNlIHF1YWxzIG9mIGVhY2ggc2lkZSBhcmUgZGlmZmVyZW50 LiAgSW4gdGhlIGZvbGxvd2luZyBjYXNlIHdlIGVuZCB1cAorLS0gbW92aW5nIHF1YWxzIG92 ZXIgdG8gczEgdG8gbWFrZSBpdCBzbyBpdCBjYW4ndCBtYXRjaCBhbnkgcm93cy4KK2NyZWF0 ZSB0YWJsZSBzbChhIGludCwgYiBpbnQsIGMgaW50KTsKK2NyZWF0ZSB1bmlxdWUgaW5kZXgg b24gc2woYSwgYik7Cit2YWN1dW0gYW5hbHl6ZSBzbDsKKworLS0gQm90aCBzaWRlcyBhcmUg dW5pcXVlLCBidXQgYmFzZSBxdWFscyBhcmUgZGlmZmVyZW50CitleHBsYWluIChjb3N0cyBv ZmYpCitzZWxlY3QgKiBmcm9tIHNsIHQxLCBzbCB0MiB3aGVyZSB0MS5hID0gdDIuYSBhbmQg dDEuYiA9IDEgYW5kIHQyLmIgPSAyOworCistLSBDaGVjayBOdWxsVGVzdCBpbiBiYXNlcmVz dHJpY3RpbmZvIGxpc3QKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2wg dDEsIHNsIHQyCit3aGVyZSB0MS5hID0gdDIuYSBhbmQgdDEuYiA9IDEgYW5kIHQyLmIgPSAy CisgIGFuZCB0MS5jIElTIE5PVCBOVUxMIGFuZCB0Mi5jIElTIE5PVCBOVUxMCisgIGFuZCB0 Mi5iIElTIE5PVCBOVUxMIGFuZCB0MS5iIElTIE5PVCBOVUxMCisgIGFuZCB0MS5hIElTIE5P VCBOVUxMIGFuZCB0Mi5hIElTIE5PVCBOVUxMOworZXhwbGFpbiAodmVyYm9zZSwgY29zdHMg b2ZmKQorc2VsZWN0ICogZnJvbSBzbCB0MSwgc2wgdDIKK3doZXJlIHQxLmIgPSB0Mi5iIGFu ZCB0Mi5hID0gMyBhbmQgdDEuYSA9IDMKKyAgYW5kIHQxLmMgSVMgTk9UIE5VTEwgYW5kIHQy LmMgSVMgTk9UIE5VTEwKKyAgYW5kIHQyLmIgSVMgTk9UIE5VTEwgYW5kIHQxLmIgSVMgTk9U IE5VTEwKKyAgYW5kIHQxLmEgSVMgTk9UIE5VTEwgYW5kIHQyLmEgSVMgTk9UIE5VTEw7CisK Ky0tIEpvaW4gcXVhbCBpc24ndCBtZXJnZWpvaW5hYmxlLCBidXQgaW5uZXIgaXMgdW5pcXVl LgorZXhwbGFpbiAoQ09TVFMgT0ZGKQorU0VMRUNUIG4yLmEgRlJPTSBzaiBuMSwgc2ogbjIg V0hFUkUgbjEuYSA8PiBuMi5hIEFORCBuMi5hID0gMTsKK2V4cGxhaW4gKENPU1RTIE9GRikK K1NFTEVDVCAqIEZST00KKwkoU0VMRUNUIG4yLmEgRlJPTSBzaiBuMSwgc2ogbjIgV0hFUkUg bjEuYSA8PiBuMi5hKSBxMCwgc2wKK1dIRVJFIHEwLmEgPSAxOworCistLQorLS0tLSBPbmx5 IG9uZSBzaWRlIGlzIHVucWl1ZQorLS1zZWxlY3QgKiBmcm9tIHNsIHQxLCBzbCB0MiB3aGVy ZSB0MS5hID0gdDIuYSBhbmQgdDEuYiA9IDE7CistLXNlbGVjdCAqIGZyb20gc2wgdDEsIHNs IHQyIHdoZXJlIHQxLmEgPSB0Mi5hIGFuZCB0Mi5iID0gMTsKKy0tCistLS0tIFNldmVyYWwg dW5pcXVlcyBpbmRleGVzIG1hdGNoLCBhbmQgd2Ugc2VsZWN0IGEgZGlmZmVyZW50IG9uZQor LS0tLSBmb3IgZWFjaCBzaWRlLCBzbyB0aGUgam9pbiBpcyBub3QgcmVtb3ZlZAorLS1jcmVh dGUgdGFibGUgc20oYSBpbnQgdW5pcXVlLCBiIGludCB1bmlxdWUsIGMgaW50IHVuaXF1ZSk7 CistLWV4cGxhaW4gKGNvc3RzIG9mZikKKy0tc2VsZWN0ICogZnJvbSBzbSBtLCBzbSBuIHdo ZXJlIG0uYSA9IG4uYiBhbmQgbS5jID0gbi5jOworLS1leHBsYWluIChjb3N0cyBvZmYpCist LXNlbGVjdCAqIGZyb20gc20gbSwgc20gbiB3aGVyZSBtLmEgPSBuLmMgYW5kIG0uYiA9IG4u YjsKKy0tZXhwbGFpbiAoY29zdHMgb2ZmKQorLS1zZWxlY3QgKiBmcm9tIHNtIG0sIHNtIG4g d2hlcmUgbS5jID0gbi5iIGFuZCBtLmEgPSBuLmE7CisKKy0tIENoZWNrIG9wdGltaXphdGlv biBkaXNhYmxpbmcgaWYgaXQgd2lsbCB2aW9sYXRlIHNwZWNpYWwgam9pbiBjb25kaXRpb25z LgorLS0gVHdvIGlkZW50aWNhbCBqb2luZWQgcmVsYXRpb25zIHNhdGlzZmllcyBzZWxmIGpv aW4gcmVtb3ZhbCBjb25kaXRpb25zIGJ1dAorLS0gc3RheSBpbiBkaWZmZXJlbnQgc3BlY2lh bCBqb2luIGluZm9zLgorQ1JFQVRFIFRBQkxFIHNqX3QxIChpZCBzZXJpYWwsIGEgaW50KTsK K0NSRUFURSBUQUJMRSBzal90MiAoaWQgc2VyaWFsLCBhIGludCk7CitDUkVBVEUgVEFCTEUg c2pfdDMgKGlkIHNlcmlhbCwgYSBpbnQpOworQ1JFQVRFIFRBQkxFIHNqX3Q0IChpZCBzZXJp YWwsIGEgaW50KTsKKworQ1JFQVRFIFVOSVFVRSBJTkRFWCBPTiBzal90MyBVU0lORyBidHJl ZSAoYSxpZCk7CitDUkVBVEUgVU5JUVVFIElOREVYIE9OIHNqX3QyIFVTSU5HIGJ0cmVlIChp ZCk7CisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gc2pfdDEKK0pPSU4g KAorCVNFTEVDVCBzal90Mi5pZCBBUyBpZCBGUk9NIHNqX3QyCisJV0hFUkUgRVhJU1RTCisJ CSgKKwkJU0VMRUNUIFRSVUUgRlJPTSBzal90Myxzal90NCBXSEVSRSBzal90My5hID0gMSBB TkQgc2pfdDMuaWQgPSBzal90Mi5pZAorCQkpCisJKSB0MnQzdDQKK09OIHNqX3QxLmlkID0g dDJ0M3Q0LmlkCitKT0lOICgKKwlTRUxFQ1Qgc2pfdDIuaWQgQVMgaWQgRlJPTSBzal90Mgor CVdIRVJFIEVYSVNUUworCQkoCisJCVNFTEVDVCBUUlVFIEZST00gc2pfdDMsc2pfdDQgV0hF UkUgc2pfdDMuYSA9IDEgQU5EIHNqX3QzLmlkID0gc2pfdDIuaWQKKwkJKQorCSkgX3QydDN0 NAorT04gc2pfdDEuaWQgPSBfdDJ0M3Q0LmlkOworCistLQorLS0gVGVzdCBSb3dNYXJrcy1y ZWxhdGVkIGNvZGUKKy0tCisKKy0tIFRPRE86IFdoeSB0aGlzIHNlbGVjdCByZXR1cm5zIHR3 byBjb3BpZXMgb2YgY3RpZCBmaWVsZD8gU2hvdWxkIHdlIGZpeCBpdD8KK0VYUExBSU4gKENP U1RTIE9GRikgLS0gQm90aCBzaWRlcyBoYXZlIGV4cGxpY2l0IExvY2tSb3dzIG1hcmtzCitT RUxFQ1QgYTEuYSBGUk9NIHNqIGExLHNqIGEyIFdIRVJFIChhMS5hPWEyLmEpIEZPUiBVUERB VEU7CisKK0VYUExBSU4gKENPU1RTIE9GRikgLS0gQSBSb3dNYXJrIGV4aXN0cyBmb3IgdGhl IHRhYmxlIGJlaW5nIGtlcHQKK1VQREFURSBzaiBzcSBTRVQgYiA9IDEgRlJPTSBzaiBhcyBz eiBXSEVSRSBzcS5hID0gc3ouYTsKKworQ1JFQVRFIFJVTEUgc2pfZGVsX3J1bGUgQVMgT04g REVMRVRFIFRPIHNqCisgIERPIElOU1RFQUQKKyAgICBVUERBVEUgc2ogU0VUIGEgPSAxIFdI RVJFIGEgPSBvbGQuYTsKK0VYUExBSU4gKENPU1RTIE9GRikgREVMRVRFIEZST00gc2o7IC0t IEEgUm93TWFyayBleGlzdHMgZm9yIHRoZSB0YWJsZSBiZWluZyBkcm9wcGVkCitEUk9QIFJV TEUgc2pfZGVsX3J1bGUgT04gc2ogQ0FTQ0FERTsKKworcmVzZXQgZW5hYmxlX2hhc2hqb2lu OworcmVzZXQgZW5hYmxlX21lcmdlam9pbjsKKwogLS0KIC0tIFRlc3QgaGludHMgZ2l2ZW4g b24gaW5jb3JyZWN0IGNvbHVtbiByZWZlcmVuY2VzIGFyZSB1c2VmdWwKIC0tCmRpZmYgLS1n aXQgYS9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdCBiL3NyYy90b29scy9wZ2lu ZGVudC90eXBlZGVmcy5saXN0CmluZGV4IGYyYWY4NGQ3Y2EuLmZiYWQ5YzlhMmEgMTAwNjQ0 Ci0tLSBhL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CisrKyBiL3NyYy90b29s cy9wZ2luZGVudC90eXBlZGVmcy5saXN0CkBAIC0zNjcsNiArMzY3LDcgQEAgQ2F0YWxvZ0lk CiBDYXRhbG9nSWRNYXBFbnRyeQogQ2F0YWxvZ0luZGV4U3RhdGUKIENoYW5nZVZhck5vZGVz X2NvbnRleHQKK1JlcGxhY2VWYXJub0NvbnRleHQKIENoZWNrUG9pbnQKIENoZWNrUG9pbnRT dG10CiBDaGVja3BvaW50U3RhdHNEYXRhCkBAIC0zODMwLDYgKzM4MzEsNyBAQCB1bmljb2Rl U3R5bGVDb2x1bW5Gb3JtYXQKIHVuaWNvZGVTdHlsZUZvcm1hdAogdW5pY29kZVN0eWxlUm93 Rm9ybWF0CiB1bmljb2RlX2xpbmVzdHlsZQorVW5pcXVlUmVsSW5mbwogdW5pdF9jb252ZXJz aW9uCiB1bmxvZ2dlZF9yZWxhdGlvbl9lbnRyeQogdXRmX2xvY2FsX2NvbnZlcnNpb25fZnVu YwotLSAKMi40Mi4wCgo= --------------0wQakMQhi2gF5j09Y3uEAH9p--