Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFBhr-0002lO-Vr for pgsql-hackers@arkaria.postgresql.org; Fri, 30 Jun 2023 10:50:29 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1qFBhq-0001L2-PA for pgsql-hackers@arkaria.postgresql.org; Fri, 30 Jun 2023 10:50:26 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFBhq-0001Kt-5v for pgsql-hackers@lists.postgresql.org; Fri, 30 Jun 2023 10:50:26 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1qFBhl-001LaQ-Uz for pgsql-hackers@lists.postgresql.org; Fri, 30 Jun 2023 10:50:25 +0000 Received: from [192.168.28.143] (unknown [192.168.28.143]) (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 9D7F5E21014; Fri, 30 Jun 2023 13:50:20 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1688122221; bh=EmVrpzffLyrrmAOtrph/EcbzGjJeOyx4lc9OA3j5ySw=; h=Message-ID:Date:User-Agent:Subject:To:Cc:References:From: In-Reply-To:From; b=kiq6rS7iKOYvPI4wqcRlrcM2EbTG6+7AkMHC6LhJF6SzMgKfcz901Ws8Rhrhaqyjs egaHtqC0g0OookzNKtFGZ6SUEGZt/CM+xYi7e26+Vna6MRCFUV7PXLdEye0+7sMPty ULezQNfAj2I6ud8iMh6Krkhw73I6feNhBCsY56iEpW3NaxGK7L2zrL8NNbWmXbM/S2 uyJRRXX0yi+0QGmzzWUa6e1tamfK7BthgXOZVy5RSkOCUysa88VYi+SUwNeChVk2yk DRCfdSs/3ZPLI7UiZLEoNeLkL8AlJYxdwH+ouLX097AgsGCOz4eBZ0hjMYGkGLIQqy /6pcrcki3+eYg== Content-Type: multipart/mixed; boundary="------------ClsdSi9vJeol4jRDt18kcQCC" Message-ID: Date: Fri, 30 Jun 2023 16:50:19 +0600 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.12.0 Subject: Re: Removing unneeded self joins 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 From: Andrey Lepikhov 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. --------------ClsdSi9vJeol4jRDt18kcQCC Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 4/4/2023 02:30, Gregory Stark (as CFM) wrote: > On Mon, 6 Mar 2023 at 00:30, Michał Kłeczek wrote: >> >> Hi All, >> >> I just wanted to ask about the status and plans for this patch. >> I can see it being stuck at “Waiting for Author” status in several commit tests. > > Sadly it seems to now be badly in need of a rebase. There are large > hunks failing in the guts of analyzejoins.c as well as minor failures > elsewhere and lots of offsets which need to be reviewed. > > I think given the lack of activity it's out of time for this release > at this point. I'm moving it ahead to the next CF. Hi, Version 41 is heavily remade of the feature: 1. In previous versions, I tried to reuse remove_rel_from_query() for both left and self-join removal. But for now, I realized that it is a bit different procedures which treat different operations. In this patch, only common stages of the PlannerInfo fixing process are united in one function. 2. Transferring clauses from the removing table to keeping one is more transparent now and contains comments. 3. Equivalence classes update procedure was changed according to David's commit 3373c71. As I see, Tom has added remove_rel_from_eclass since the last v.40 version, and it looks pretty similar to the update_eclass routine in this patch. It passes regression tests, but some questions are still open: 1. Should we look for duplicated or redundant clauses (the same for eclasses) during the clause transfer procedure? On the one side, we reduce the length of restrict lists that can impact planning or executing time. Additionally, we improve the accuracy of cardinality estimation. On the other side, it is one more place that can make planning time much longer in specific cases. It would have been better to avoid calling the equal() function here, but it's the only way to detect duplicated inequality expressions. 2. Could we reuse ChangeVarNodes instead of sje_walker(), merge remove_rel_from_restrictinfo with replace_varno? 3. Also, I still don't finish with the split_selfjoin_quals: some improvements could be made. -- regards, Andrey Lepikhov Postgres Professional --------------ClsdSi9vJeol4jRDt18kcQCC Content-Type: text/plain; charset=UTF-8; name="v41-0001-Remove-self-joins.patch" Content-Disposition: attachment; filename="v41-0001-Remove-self-joins.patch" Content-Transfer-Encoding: base64 RnJvbSA0YTM0MmI5Nzg5ZjViZTIwOTMxOGMxM2ZiN2VjMzM2ZmNiZDJhZWU1IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZXkgTGVwaWtob3YgPGEubGVwaWtob3ZAcG9z dGdyZXNwcm8ucnU+CkRhdGU6IE1vbiwgMTUgTWF5IDIwMjMgMDk6MDQ6NTEgKzA1MDAKU3Vi amVjdDogW1BBVENIXSBSZW1vdmUgc2VsZi1qb2lucy4KCkEgU2VsZiBKb2luIEVsaW1pbmF0 aW9uIChTSkUpIGZlYXR1cmUgcmVtb3ZlcyBpbm5lciBqb2luIG9mIHBsYWluIHRhYmxlIHRv IGl0c2VsZgppbiBhIHF1ZXJ5IHRyZWUgaWYgY2FuIGJlIHByb3ZlZCB0aGF0IHRoZSBqb2lu IGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgc2Nhbi4KVGhlIHByb29mIGJhc2VkIG9uIGlubmVy cmVsX2lzX3VuaXF1ZSBtYWNoaW5lcnkuCgpXZSBjYW4gcmVtb3ZlIGEgc2VsZi1qb2luIHdo ZW4gZm9yIGVhY2ggb3V0ZXIgcm93OgoxLiBBdCBtb3N0IG9uZSBpbm5lciByb3cgbWF0Y2hl cyB0aGUgam9pbiBjbGF1c2UuCjIuIElmIHRoZSBqb2luIHRhcmdldCBsaXN0IGNvbnRhaW5z IGFueSBpbm5lciB2YXJzLCBhbiBpbm5lciByb3cKbXVzdCBiZSAocGh5c2ljYWxseSkgdGhl IHNhbWUgcm93IGFzIHRoZSBvdXRlciBvbmUuCgpJbiB0aGlzIHBhdGNoIHdlIHVzZSB0aGUg bmV4dCBhcHByb2FjaCB0byBpZGVudGlmeSBhIHNlbGYtam9pbjoKMS4gQ29sbGVjdCBhbGwg bWVyZ2Vqb2luYWJsZSBqb2luIHF1YWxzIHdoaWNoIGxvb2sgbGlrZSBhLnggPSBiLngKMi4g Q2hlY2sgaW5uZXJyZWxfaXNfdW5pcXVlKCkgZm9yIHRoZSBxdWFsIGxpc3QgZnJvbSAoMSku IElmIGl0CnJldHVybnMgdHJ1ZSwgdGhlbiBvdXRlciByb3cgbWF0Y2hlcyBvbmx5IHRoZSBz YW1lIHJvdyBmcm9tIHRoZSBpbm5lcgpyZWxhdGlvbi4KMy4gSWYgdW5pcXVlbmVzcyBvZiBv dXRlciByZWxhdGlvbiBpcyBkZWR1Y2VkIGZyb20gYmFzZXJlc3RyaWN0aW5mbyBjbGF1c2Ug bGlrZQoneD1jb25zdCcgb24gdW5pcXVlIGZpZWxkKHMpLCBjaGVjayB3aGF0IHRoZSBpbm5l ciBoYXMgdGhlIHNhbWUgY2xhdXNlIHdpdGggdGhlCnNhbWUgY29uc3RhbnQocykuCjQuIENv bXBhcmUgUm93TWFya3Mgb2YgaW5uZXIgYW5kIG91dGVyIHJlbGF0aW9ucy4gVGhleSBtdXN0 IGhhdmUgdGhlIHNhbWUKc3RyZW5ndGguCgpTb21lIHJlZ3Jlc3Npb24gdGVzdHMgY2hhbmdl ZCBkdWUgdG8gc2VsZi1qb2luIHJlbW92YWwgbG9naWMuCi0tLQogZG9jL3NyYy9zZ21sL2Nv bmZpZy5zZ21sICAgICAgICAgICAgICAgICAgfCAgIDE2ICsKIHNyYy9iYWNrZW5kL29wdGlt aXplci9wYXRoL2luZHhwYXRoLmMgICAgIHwgICAzOCArCiBzcmMvYmFja2VuZC9vcHRpbWl6 ZXIvcGxhbi9hbmFseXplam9pbnMuYyB8IDEwNzcgKysrKysrKysrKysrKysrKysrKystCiBz cmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9wbGFubWFpbi5jICAgICB8ICAgIDUgKwogc3Jj L2JhY2tlbmQvdXRpbHMvbWlzYy9ndWNfdGFibGVzLmMgICAgICAgfCAgIDIyICsKIHNyYy9p bmNsdWRlL29wdGltaXplci9wYXRocy5oICAgICAgICAgICAgIHwgICAgMyArCiBzcmMvaW5j bHVkZS9vcHRpbWl6ZXIvcGxhbm1haW4uaCAgICAgICAgICB8ICAgIDcgKwogc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC9lcXVpdmNsYXNzLm91dCAgfCAgIDMyICsKIHNyYy90ZXN0L3Jl Z3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQgICAgICAgIHwgIDc5OCArKysrKysrKysrKysrKysK IHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3lzdmlld3Mub3V0ICAgIHwgICAgMyArLQog c3JjL3Rlc3QvcmVncmVzcy9zcWwvZXF1aXZjbGFzcy5zcWwgICAgICAgfCAgIDE2ICsKIHNy Yy90ZXN0L3JlZ3Jlc3Mvc3FsL2pvaW4uc3FsICAgICAgICAgICAgIHwgIDM1MSArKysrKysr CiBzcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdCAgICAgICAgICB8ICAgIDIgKwog MTMgZmlsZXMgY2hhbmdlZCwgMjMxOSBpbnNlcnRpb25zKCspLCA1MSBkZWxldGlvbnMoLSkK CmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvY29uZmlnLnNnbWwgYi9kb2Mvc3JjL3NnbWwv Y29uZmlnLnNnbWwKaW5kZXggNjI2MmNiN2JiMi4uNjgyMTVlMTA5MyAxMDA2NDQKLS0tIGEv ZG9jL3NyYy9zZ21sL2NvbmZpZy5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9jb25maWcuc2dt bApAQCAtNTQxOSw2ICs1NDE5LDIyIEBAIEFOWSA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFt ZXRlciI+bnVtX3N5bmM8L3JlcGxhY2VhYmxlPiAoIDxyZXBsYWNlYWJsZSBjbGFzcz0iCiAg ICAgICA8L2xpc3RpdGVtPgogICAgICA8L3Zhcmxpc3RlbnRyeT4KIAorICAgICA8dmFybGlz dGVudHJ5IGlkPSJndWMtZW5hYmxlX3NlbGZfam9pbl9yZW1vdmFsIiB4cmVmbGFiZWw9ImVu YWJsZV9zZWxmX2pvaW5fcmVtb3ZhbCI+CisgICAgICA8dGVybT48dmFybmFtZT5lbmFibGVf c2VsZl9qb2luX3JlbW92YWw8L3Zhcm5hbWU+ICg8dHlwZT5ib29sZWFuPC90eXBlPikKKyAg ICAgIDxpbmRleHRlcm0+CisgICAgICAgPHByaW1hcnk+PHZhcm5hbWU+ZW5hYmxlX3NlbGZf am9pbl9yZW1vdmFsPC92YXJuYW1lPiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcjwvcHJpbWFy eT4KKyAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgPC90ZXJtPgorICAgICAgPGxpc3RpdGVt PgorICAgICAgIDxwYXJhPgorICAgICAgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHF1ZXJ5 IHBsYW5uZXIncyBvcHRpbWl6YXRpb24gd2hpY2ggYW5hbHlzZXMKKyAgICAgICAgcXVlcnkg dHJlZSBhbmQgcmVwbGFjZXMgc2VsZiBqb2lucyB3aXRoIHNlbWFudGljYWxseSBlcXVpdmFs ZW50IHNpbmdsZQorICAgICAgICBzY2Fucy4gVGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gb25s eSBwbGFpbiB0YWJsZXMuCisgICAgICAgIFRoZSBkZWZhdWx0IGlzIDxsaXRlcmFsPm9uPC9s aXRlcmFsPi4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L2xpc3RpdGVtPgorICAgICA8L3Zh cmxpc3RlbnRyeT4KKwogICAgICA8dmFybGlzdGVudHJ5IGlkPSJndWMtZW5hYmxlLXNlcXNj YW4iIHhyZWZsYWJlbD0iZW5hYmxlX3NlcXNjYW4iPgogICAgICAgPHRlcm0+PHZhcm5hbWU+ ZW5hYmxlX3NlcXNjYW48L3Zhcm5hbWU+ICg8dHlwZT5ib29sZWFuPC90eXBlPikKICAgICAg IDxpbmRleHRlcm0+CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9p bmR4cGF0aC5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYwppbmRl eCAwMDY1Yzg5OTJiLi41N2JkYzY4MTFmIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9vcHRp bWl6ZXIvcGF0aC9pbmR4cGF0aC5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRo L2luZHhwYXRoLmMKQEAgLTM0OTEsNiArMzQ5MSwyMSBAQCBib29sCiByZWxhdGlvbl9oYXNf dW5pcXVlX2luZGV4X2ZvcihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAog CQkJCQkJCSAgTGlzdCAqcmVzdHJpY3RsaXN0LAogCQkJCQkJCSAgTGlzdCAqZXhwcmxpc3Qs IExpc3QgKm9wcmxpc3QpCit7CisJcmV0dXJuIHJlbGF0aW9uX2hhc191bmlxdWVfaW5kZXhf ZXh0KHJvb3QsIHJlbCwgcmVzdHJpY3RsaXN0LAorCQkJCQkJCQkJCSBleHBybGlzdCwgb3By bGlzdCwgTlVMTCk7Cit9CisKKy8qCisgKiByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2V4 dAorICogaWYgZXh0cmFfY2xhdXNlcyBpc24ndCBOVUxMLCByZXR1cm4gYmFzZXJlc3RyaWN0 aW5mbyBjbGF1c2VzIHdoaWNoIHdlcmUKKyAqIHVzZWQgdG8gZGVyaXZlIHVuaXF1ZW5lc3Mu CisgKi8KK2Jvb2wKK3JlbGF0aW9uX2hhc191bmlxdWVfaW5kZXhfZXh0KFBsYW5uZXJJbmZv ICpyb290LCBSZWxPcHRJbmZvICpyZWwsCisJCQkJCQkJICBMaXN0ICpyZXN0cmljdGxpc3Qs CisJCQkJCQkJICBMaXN0ICpleHBybGlzdCwgTGlzdCAqb3BybGlzdCwKKwkJCQkJCQkgIExp c3QgKipleHRyYV9jbGF1c2VzKQogewogCUxpc3RDZWxsICAgKmljOwogCkBAIC0zNTQ2LDYg KzM1NjEsNyBAQCByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2ZvcihQbGFubmVySW5mbyAq cm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCXsKIAkJSW5kZXhPcHRJbmZvICppbmQgPSAoSW5k ZXhPcHRJbmZvICopIGxmaXJzdChpYyk7CiAJCWludAkJCWM7CisJCUxpc3QJICAgKmV4cHJz ID0gTklMOwogCiAJCS8qCiAJCSAqIElmIHRoZSBpbmRleCBpcyBub3QgdW5pcXVlLCBvciBu b3QgaW1tZWRpYXRlbHkgZW5mb3JjZWQsIG9yIGlmIGl0J3MKQEAgLTM1OTcsNiArMzYxMywy NCBAQCByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2ZvcihQbGFubmVySW5mbyAqcm9vdCwg UmVsT3B0SW5mbyAqcmVsLAogCQkJCWlmIChtYXRjaF9pbmRleF90b19vcGVyYW5kKHJleHBy LCBjLCBpbmQpKQogCQkJCXsKIAkJCQkJbWF0Y2hlZCA9IHRydWU7IC8qIGNvbHVtbiBpcyB1 bmlxdWUgKi8KKworCQkJCQlpZiAoYm1zX21lbWJlcnNoaXAocmluZm8tPmNsYXVzZV9yZWxp ZHMpID09IEJNU19TSU5HTEVUT04pCisJCQkJCXsKKwkJCQkJCU1lbW9yeUNvbnRleHQgb2xk TWVtQ3R4ID0KKwkJCQkJCQkJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhyb290LT5wbGFubmVy X2N4dCk7CisKKwkJCQkJCS8qCisJCQkJCQkgKiBBZGQgZmlsdGVyIGNsYXVzZSBpbnRvIGEg bGlzdCBhbGxvd2luZyBjYWxsZXIgdG8KKwkJCQkJCSAqIGtub3cgaWYgdW5pcXVpbmVzcyBo YXZlIG1hZGUgbm90IG9ubHkgYnkgam9pbgorCQkJCQkJICogY2xhdXNlcy4KKwkJCQkJCSAq LworCQkJCQkJQXNzZXJ0KGJtc19pc19lbXB0eShyaW5mby0+bGVmdF9yZWxpZHMpIHx8CisJ CQkJCQkJICAgYm1zX2lzX2VtcHR5KHJpbmZvLT5yaWdodF9yZWxpZHMpKTsKKwkJCQkJCWlm IChleHRyYV9jbGF1c2VzKQorCQkJCQkJCWV4cHJzID0gbGFwcGVuZChleHBycywgcmluZm8p OworCQkJCQkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZE1lbUN0eCk7CisJCQkJCX0KKwog CQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CkBAIC0zNjM5LDcgKzM2NzMsMTEgQEAgcmVsYXRp b25faGFzX3VuaXF1ZV9pbmRleF9mb3IoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8g KnJlbCwKIAogCQkvKiBNYXRjaGVkIGFsbCBrZXkgY29sdW1ucyBvZiB0aGlzIGluZGV4PyAq LwogCQlpZiAoYyA9PSBpbmQtPm5rZXljb2x1bW5zKQorCQl7CisJCQlpZiAoZXh0cmFfY2xh dXNlcykKKwkJCQkqZXh0cmFfY2xhdXNlcyA9IGV4cHJzOwogCQkJcmV0dXJuIHRydWU7CisJ CX0KIAl9CiAKIAlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRp bWl6ZXIvcGxhbi9hbmFseXplam9pbnMuYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFu L2FuYWx5emVqb2lucy5jCmluZGV4IDVmM2NjZTg3M2EuLjRmOTFjM2E4ZWQgMTAwNjQ0Ci0t LSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2FuYWx5emVqb2lucy5jCisrKyBiL3Ny Yy9iYWNrZW5kL29wdGltaXplci9wbGFuL2FuYWx5emVqb2lucy5jCkBAIC0yMiw2ICsyMiw4 IEBACiAgKi8KICNpbmNsdWRlICJwb3N0Z3Jlcy5oIgogCisjaW5jbHVkZSAiY2F0YWxvZy9w Z19jbGFzcy5oIgorI2luY2x1ZGUgIm5vZGVzL21ha2VmdW5jcy5oIgogI2luY2x1ZGUgIm5v ZGVzL25vZGVGdW5jcy5oIgogI2luY2x1ZGUgIm9wdGltaXplci9jbGF1c2VzLmgiCiAjaW5j bHVkZSAib3B0aW1pemVyL2pvaW5pbmZvLmgiCkBAIC0zMywxMCArMzUsMjcgQEAKICNpbmNs dWRlICJvcHRpbWl6ZXIvdGxpc3QuaCIKICNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUuaCIK IAorLyoKKyAqIFVuaXF1ZVJlbEluZm8gY2FjaGVzIGEgZmFjdCB0aGF0IGEgcmVsYXRpb24g aXMgdW5pcXVlIHdoZW4gYmVpbmcgam9pbmVkCisgKiB0byBvdGhlciByZWxhdGlvbihzKSBz cGVjaWZpZWQgYnkgb3V0ZXJyZWxpZHMuCisgKiBleHRyYV9jbGF1c2VzIGNvbnRhaW5zIGFk ZGl0aW9uYWwgY2xhdXNlcyBmcm9tIGEgYmFzZXJlc3RyaWN0aW5mbyBsaXN0IHRoYXQKKyAq IHdlcmUgdXNlZCB0byBwcm92ZSB1bmlxdWVuZXNzLiBXZSBjYWNoZSBpdCBmb3IgU0ogY2hl Y2tpbmcgcHJvY2VkdXJlOiBTSiBjYW4KKyAqIGJlIHJlbW92ZWQgaWYgb3V0ZXIgcmVsYXRp b24gY29udGFpbnMgc3RyaWN0bHkgdGhlIHNhbWUgc2V0IG9mIGNsYXVzZXMuCisgKi8KK3R5 cGVkZWYgc3RydWN0IFVuaXF1ZVJlbEluZm8KK3sKKwlSZWxpZHMJCW91dGVycmVsaWRzOwor CUxpc3QJICAgKmV4dHJhX2NsYXVzZXM7Cit9IFVuaXF1ZVJlbEluZm87CisKK2Jvb2wJCWVu YWJsZV9zZWxmX2pvaW5fcmVtb3ZhbDsKK2ludAkJCXNlbGZfam9pbl9zZWFyY2hfbGltaXQ7 CisKIC8qIGxvY2FsIGZ1bmN0aW9ucyAqLwogc3RhdGljIGJvb2wgam9pbl9pc19yZW1vdmFi bGUoUGxhbm5lckluZm8gKnJvb3QsIFNwZWNpYWxKb2luSW5mbyAqc2ppbmZvKTsKLXN0YXRp YyB2b2lkIHJlbW92ZV9yZWxfZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJl bGlkLAotCQkJCQkJCQkgIFNwZWNpYWxKb2luSW5mbyAqc2ppbmZvKTsKKworc3RhdGljIHZv aWQgcmVtb3ZlX2xlZnRqb2lucmVsX2Zyb21fcXVlcnkoUGxhbm5lckluZm8gKnJvb3QsIGlu dCByZWxpZCwKKwkJCQkJCQkJCQkgIFNwZWNpYWxKb2luSW5mbyAqc2ppbmZvKTsKIHN0YXRp YyB2b2lkIHJlbW92ZV9yZWxfZnJvbV9yZXN0cmljdGluZm8oUmVzdHJpY3RJbmZvICpyaW5m bywKIAkJCQkJCQkJCQkgaW50IHJlbGlkLCBpbnQgb2pyZWxpZCk7CiBzdGF0aWMgdm9pZCBy ZW1vdmVfcmVsX2Zyb21fZWNsYXNzKEVxdWl2YWxlbmNlQ2xhc3MgKmVjLApAQCAtNDQsMTQg KzYzLDE3IEBAIHN0YXRpYyB2b2lkIHJlbW92ZV9yZWxfZnJvbV9lY2xhc3MoRXF1aXZhbGVu Y2VDbGFzcyAqZWMsCiBzdGF0aWMgTGlzdCAqcmVtb3ZlX3JlbF9mcm9tX2pvaW5saXN0KExp c3QgKmpvaW5saXN0LCBpbnQgcmVsaWQsIGludCAqbnJlbW92ZWQpOwogc3RhdGljIGJvb2wg cmVsX3N1cHBvcnRzX2Rpc3RpbmN0bmVzcyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5m byAqcmVsKTsKIHN0YXRpYyBib29sIHJlbF9pc19kaXN0aW5jdF9mb3IoUGxhbm5lckluZm8g KnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKLQkJCQkJCQkJTGlzdCAqY2xhdXNlX2xpc3QpOwor CQkJCQkJCQlMaXN0ICpjbGF1c2VfbGlzdCwgTGlzdCAqKmV4dHJhX2NsYXVzZXMpOwogc3Rh dGljIE9pZAlkaXN0aW5jdF9jb2xfc2VhcmNoKGludCBjb2xubywgTGlzdCAqY29sbm9zLCBM aXN0ICpvcGlkcyk7CiBzdGF0aWMgYm9vbCBpc19pbm5lcnJlbF91bmlxdWVfZm9yKFBsYW5u ZXJJbmZvICpyb290LAogCQkJCQkJCQkgICBSZWxpZHMgam9pbnJlbGlkcywKIAkJCQkJCQkJ ICAgUmVsaWRzIG91dGVycmVsaWRzLAogCQkJCQkJCQkgICBSZWxPcHRJbmZvICppbm5lcnJl bCwKIAkJCQkJCQkJICAgSm9pblR5cGUgam9pbnR5cGUsCi0JCQkJCQkJCSAgIExpc3QgKnJl c3RyaWN0bGlzdCk7CisJCQkJCQkJCSAgIExpc3QgKnJlc3RyaWN0bGlzdCwKKwkJCQkJCQkJ ICAgTGlzdCAqKmV4dHJhX2NsYXVzZXMpOworc3RhdGljIEJpdG1hcHNldCAqcmVwbGFjZV9y ZWxpZChSZWxpZHMgcmVsaWRzLCBpbnQgb2xkSWQsIGludCBuZXdJZCk7CitzdGF0aWMgdm9p ZCByZXBsYWNlX3Zhcm5vKE5vZGUgKm5vZGUsIGludCBmcm9tLCBpbnQgdG8pOwogCiAKIC8q CkBAIC04OSw3ICsxMTEsNyBAQCByZXN0YXJ0OgogCQkgKi8KIAkJaW5uZXJyZWxpZCA9IGJt c19zaW5nbGV0b25fbWVtYmVyKHNqaW5mby0+bWluX3JpZ2h0aGFuZCk7CiAKLQkJcmVtb3Zl X3JlbF9mcm9tX3F1ZXJ5KHJvb3QsIGlubmVycmVsaWQsIHNqaW5mbyk7CisJCXJlbW92ZV9s ZWZ0am9pbnJlbF9mcm9tX3F1ZXJ5KHJvb3QsIGlubmVycmVsaWQsIHNqaW5mbyk7CiAKIAkJ LyogV2UgdmVyaWZ5IHRoYXQgZXhhY3RseSBvbmUgcmVmZXJlbmNlIGdldHMgcmVtb3ZlZCBm cm9tIGpvaW5saXN0ICovCiAJCW5yZW1vdmVkID0gMDsKQEAgLTMwOCw3ICszMzAsNyBAQCBq b2luX2lzX3JlbW92YWJsZShQbGFubmVySW5mbyAqcm9vdCwgU3BlY2lhbEpvaW5JbmZvICpz amluZm8pCiAJICogTm93IHRoYXQgd2UgaGF2ZSB0aGUgcmVsZXZhbnQgZXF1YWxpdHkgam9p biBjbGF1c2VzLCB0cnkgdG8gcHJvdmUgdGhlCiAJICogaW5uZXJyZWwgZGlzdGluY3QuCiAJ ICovCi0JaWYgKHJlbF9pc19kaXN0aW5jdF9mb3Iocm9vdCwgaW5uZXJyZWwsIGNsYXVzZV9s aXN0KSkKKwlpZiAocmVsX2lzX2Rpc3RpbmN0X2Zvcihyb290LCBpbm5lcnJlbCwgY2xhdXNl X2xpc3QsIE5VTEwpKQogCQlyZXR1cm4gdHJ1ZTsKIAogCS8qCkBAIC0zMjgsMjEgKzM1MCwx NSBAQCBqb2luX2lzX3JlbW92YWJsZShQbGFubmVySW5mbyAqcm9vdCwgU3BlY2lhbEpvaW5J bmZvICpzamluZm8pCiAgKiB0aGUgcGxhbm5lcidzIGRhdGEgc3RydWN0dXJlcyB0aGF0IHdp bGwgYWN0dWFsbHkgYmUgY29uc3VsdGVkIGxhdGVyLgogICovCiBzdGF0aWMgdm9pZAotcmVt b3ZlX3JlbF9mcm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQsIFNwZWNp YWxKb2luSW5mbyAqc2ppbmZvKQorcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5X2NvbW1vbihQbGFu bmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAorCQkJCQkJCSBpbnQgc3Vic3QsIFNw ZWNpYWxKb2luSW5mbyAqc2ppbmZvLAorCQkJCQkJCSBSZWxpZHMgam9pbnJlbGlkcykKIHsK LQlSZWxPcHRJbmZvICpyZWwgPSBmaW5kX2Jhc2VfcmVsKHJvb3QsIHJlbGlkKTsKLQlpbnQJ CQlvanJlbGlkID0gc2ppbmZvLT5vanJlbGlkOwotCVJlbGlkcwkJam9pbnJlbGlkczsKLQlS ZWxpZHMJCWpvaW5fcGx1c19jb21tdXRlOwotCUxpc3QJICAgKmpvaW5pbmZvczsKKwlpbnQJ CQlyZWxpZCA9IHJlbC0+cmVsaWQ7CisJaW50CQkJb2pyZWxpZCA9IChzamluZm8gIT0gTlVM TCkgPyBzamluZm8tPm9qcmVsaWQgOiAtMTsKIAlJbmRleAkJcnRpOwogCUxpc3RDZWxsICAg Kmw7CiAKLQkvKiBDb21wdXRlIHRoZSByZWxpZCBzZXQgZm9yIHRoZSBqb2luIHdlIGFyZSBj b25zaWRlcmluZyAqLwotCWpvaW5yZWxpZHMgPSBibXNfdW5pb24oc2ppbmZvLT5taW5fbGVm dGhhbmQsIHNqaW5mby0+bWluX3JpZ2h0aGFuZCk7Ci0JQXNzZXJ0KG9qcmVsaWQgIT0gMCk7 Ci0Jam9pbnJlbGlkcyA9IGJtc19hZGRfbWVtYmVyKGpvaW5yZWxpZHMsIG9qcmVsaWQpOwot CiAJLyoKIAkgKiBSZW1vdmUgcmVmZXJlbmNlcyB0byB0aGUgcmVsIGZyb20gb3RoZXIgYmFz ZXJlbHMnIGF0dHJfbmVlZGVkIGFycmF5cy4KIAkgKi8KQEAgLTM2NiwxOSArMzgyLDIyIEBA IHJlbW92ZV9yZWxfZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLCBT cGVjaWFsSm9pbkluZm8gKnNqaW5mbykKIAkJCSBhdHRyb2ZmLS0pCiAJCXsKIAkJCW90aGVy cmVsLT5hdHRyX25lZWRlZFthdHRyb2ZmXSA9Ci0JCQkJYm1zX2RlbF9tZW1iZXIob3RoZXJy ZWwtPmF0dHJfbmVlZGVkW2F0dHJvZmZdLCByZWxpZCk7CisJCQkJcmVwbGFjZV9yZWxpZChv dGhlcnJlbC0+YXR0cl9uZWVkZWRbYXR0cm9mZl0sIHJlbGlkLCBzdWJzdCk7CiAJCQlvdGhl cnJlbC0+YXR0cl9uZWVkZWRbYXR0cm9mZl0gPQotCQkJCWJtc19kZWxfbWVtYmVyKG90aGVy cmVsLT5hdHRyX25lZWRlZFthdHRyb2ZmXSwgb2pyZWxpZCk7CisJCQkJcmVwbGFjZV9yZWxp ZChvdGhlcnJlbC0+YXR0cl9uZWVkZWRbYXR0cm9mZl0sIG9qcmVsaWQsIHN1YnN0KTsKIAkJ fQorCisJCS8qIFVwZGF0ZSBsYXRlcmFsIHJlZmVyZW5jZXMuICovCisJCXJlcGxhY2VfdmFy bm8oKE5vZGUgKikgb3RoZXJyZWwtPmxhdGVyYWxfdmFycywgcmVsaWQsIHN1YnN0KTsKIAl9 CiAKIAkvKgogCSAqIFVwZGF0ZSBhbGxfYmFzZXJlbHMgYW5kIHJlbGF0ZWQgcmVsaWQgc2V0 cy4KIAkgKi8KLQlyb290LT5hbGxfYmFzZXJlbHMgPSBibXNfZGVsX21lbWJlcihyb290LT5h bGxfYmFzZXJlbHMsIHJlbGlkKTsKLQlyb290LT5vdXRlcl9qb2luX3JlbHMgPSBibXNfZGVs X21lbWJlcihyb290LT5vdXRlcl9qb2luX3JlbHMsIG9qcmVsaWQpOwotCXJvb3QtPmFsbF9x dWVyeV9yZWxzID0gYm1zX2RlbF9tZW1iZXIocm9vdC0+YWxsX3F1ZXJ5X3JlbHMsIHJlbGlk KTsKLQlyb290LT5hbGxfcXVlcnlfcmVscyA9IGJtc19kZWxfbWVtYmVyKHJvb3QtPmFsbF9x dWVyeV9yZWxzLCBvanJlbGlkKTsKKwlyb290LT5hbGxfYmFzZXJlbHMgPSByZXBsYWNlX3Jl bGlkKHJvb3QtPmFsbF9iYXNlcmVscywgcmVsaWQsIHN1YnN0KTsKKwlyb290LT5vdXRlcl9q b2luX3JlbHMgPSByZXBsYWNlX3JlbGlkKHJvb3QtPm91dGVyX2pvaW5fcmVscywgb2pyZWxp ZCwgc3Vic3QpOworCXJvb3QtPmFsbF9xdWVyeV9yZWxzID0gcmVwbGFjZV9yZWxpZChyb290 LT5hbGxfcXVlcnlfcmVscywgcmVsaWQsIHN1YnN0KTsKKwlyb290LT5hbGxfcXVlcnlfcmVs cyA9IHJlcGxhY2VfcmVsaWQocm9vdC0+YWxsX3F1ZXJ5X3JlbHMsIG9qcmVsaWQsIHN1YnN0 KTsKIAogCS8qCiAJICogTGlrZXdpc2UgcmVtb3ZlIHJlZmVyZW5jZXMgZnJvbSBTcGVjaWFs Sm9pbkluZm8gZGF0YSBzdHJ1Y3R1cmVzLgpAQCAtMzkyLDE5ICs0MTEsMTkgQEAgcmVtb3Zl X3JlbF9mcm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQsIFNwZWNpYWxK b2luSW5mbyAqc2ppbmZvKQogCXsKIAkJU3BlY2lhbEpvaW5JbmZvICpzamluZiA9IChTcGVj aWFsSm9pbkluZm8gKikgbGZpcnN0KGwpOwogCi0JCXNqaW5mLT5taW5fbGVmdGhhbmQgPSBi bXNfZGVsX21lbWJlcihzamluZi0+bWluX2xlZnRoYW5kLCByZWxpZCk7Ci0JCXNqaW5mLT5t aW5fcmlnaHRoYW5kID0gYm1zX2RlbF9tZW1iZXIoc2ppbmYtPm1pbl9yaWdodGhhbmQsIHJl bGlkKTsKLQkJc2ppbmYtPnN5bl9sZWZ0aGFuZCA9IGJtc19kZWxfbWVtYmVyKHNqaW5mLT5z eW5fbGVmdGhhbmQsIHJlbGlkKTsKLQkJc2ppbmYtPnN5bl9yaWdodGhhbmQgPSBibXNfZGVs X21lbWJlcihzamluZi0+c3luX3JpZ2h0aGFuZCwgcmVsaWQpOwotCQlzamluZi0+bWluX2xl ZnRoYW5kID0gYm1zX2RlbF9tZW1iZXIoc2ppbmYtPm1pbl9sZWZ0aGFuZCwgb2pyZWxpZCk7 Ci0JCXNqaW5mLT5taW5fcmlnaHRoYW5kID0gYm1zX2RlbF9tZW1iZXIoc2ppbmYtPm1pbl9y aWdodGhhbmQsIG9qcmVsaWQpOwotCQlzamluZi0+c3luX2xlZnRoYW5kID0gYm1zX2RlbF9t ZW1iZXIoc2ppbmYtPnN5bl9sZWZ0aGFuZCwgb2pyZWxpZCk7Ci0JCXNqaW5mLT5zeW5fcmln aHRoYW5kID0gYm1zX2RlbF9tZW1iZXIoc2ppbmYtPnN5bl9yaWdodGhhbmQsIG9qcmVsaWQp OworCQlzamluZi0+bWluX2xlZnRoYW5kID0gcmVwbGFjZV9yZWxpZChzamluZi0+bWluX2xl ZnRoYW5kLCByZWxpZCwgc3Vic3QpOworCQlzamluZi0+bWluX3JpZ2h0aGFuZCA9IHJlcGxh Y2VfcmVsaWQoc2ppbmYtPm1pbl9yaWdodGhhbmQsIHJlbGlkLCBzdWJzdCk7CisJCXNqaW5m LT5zeW5fbGVmdGhhbmQgPSByZXBsYWNlX3JlbGlkKHNqaW5mLT5zeW5fbGVmdGhhbmQsIHJl bGlkLCBzdWJzdCk7CisJCXNqaW5mLT5zeW5fcmlnaHRoYW5kID0gcmVwbGFjZV9yZWxpZChz amluZi0+c3luX3JpZ2h0aGFuZCwgcmVsaWQsIHN1YnN0KTsKKwkJc2ppbmYtPm1pbl9sZWZ0 aGFuZCA9IHJlcGxhY2VfcmVsaWQoc2ppbmYtPm1pbl9sZWZ0aGFuZCwgb2pyZWxpZCwgc3Vi c3QpOworCQlzamluZi0+bWluX3JpZ2h0aGFuZCA9IHJlcGxhY2VfcmVsaWQoc2ppbmYtPm1p bl9yaWdodGhhbmQsIG9qcmVsaWQsIHN1YnN0KTsKKwkJc2ppbmYtPnN5bl9sZWZ0aGFuZCA9 IHJlcGxhY2VfcmVsaWQoc2ppbmYtPnN5bl9sZWZ0aGFuZCwgb2pyZWxpZCwgc3Vic3QpOwor CQlzamluZi0+c3luX3JpZ2h0aGFuZCA9IHJlcGxhY2VfcmVsaWQoc2ppbmYtPnN5bl9yaWdo dGhhbmQsIG9qcmVsaWQsIHN1YnN0KTsKIAkJLyogcmVsaWQgY2Fubm90IGFwcGVhciBpbiB0 aGVzZSBmaWVsZHMsIGJ1dCBvanJlbGlkIGNhbjogKi8KLQkJc2ppbmYtPmNvbW11dGVfYWJv dmVfbCA9IGJtc19kZWxfbWVtYmVyKHNqaW5mLT5jb21tdXRlX2Fib3ZlX2wsIG9qcmVsaWQp OwotCQlzamluZi0+Y29tbXV0ZV9hYm92ZV9yID0gYm1zX2RlbF9tZW1iZXIoc2ppbmYtPmNv bW11dGVfYWJvdmVfciwgb2pyZWxpZCk7Ci0JCXNqaW5mLT5jb21tdXRlX2JlbG93X2wgPSBi bXNfZGVsX21lbWJlcihzamluZi0+Y29tbXV0ZV9iZWxvd19sLCBvanJlbGlkKTsKLQkJc2pp bmYtPmNvbW11dGVfYmVsb3dfciA9IGJtc19kZWxfbWVtYmVyKHNqaW5mLT5jb21tdXRlX2Jl bG93X3IsIG9qcmVsaWQpOworCQlzamluZi0+Y29tbXV0ZV9hYm92ZV9sID0gcmVwbGFjZV9y ZWxpZChzamluZi0+Y29tbXV0ZV9hYm92ZV9sLCBvanJlbGlkLCBzdWJzdCk7CisJCXNqaW5m LT5jb21tdXRlX2Fib3ZlX3IgPSByZXBsYWNlX3JlbGlkKHNqaW5mLT5jb21tdXRlX2Fib3Zl X3IsIG9qcmVsaWQsIHN1YnN0KTsKKwkJc2ppbmYtPmNvbW11dGVfYmVsb3dfbCA9IHJlcGxh Y2VfcmVsaWQoc2ppbmYtPmNvbW11dGVfYmVsb3dfbCwgb2pyZWxpZCwgc3Vic3QpOworCQlz amluZi0+Y29tbXV0ZV9iZWxvd19yID0gcmVwbGFjZV9yZWxpZChzamluZi0+Y29tbXV0ZV9i ZWxvd19yLCBvanJlbGlkLCBzdWJzdCk7CiAJfQogCiAJLyoKQEAgLTQzOCwxOCArNDU3LDM3 IEBAIHJlbW92ZV9yZWxfZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlk LCBTcGVjaWFsSm9pbkluZm8gKnNqaW5mbykKIAkJewogCQkJUGxhY2VIb2xkZXJWYXIgKnBo diA9IHBoaW5mby0+cGhfdmFyOwogCi0JCQlwaGluZm8tPnBoX2V2YWxfYXQgPSBibXNfZGVs X21lbWJlcihwaGluZm8tPnBoX2V2YWxfYXQsIHJlbGlkKTsKLQkJCXBoaW5mby0+cGhfZXZh bF9hdCA9IGJtc19kZWxfbWVtYmVyKHBoaW5mby0+cGhfZXZhbF9hdCwgb2pyZWxpZCk7CisJ CQlwaGluZm8tPnBoX2V2YWxfYXQgPSByZXBsYWNlX3JlbGlkKHBoaW5mby0+cGhfZXZhbF9h dCwgcmVsaWQsIHN1YnN0KTsKKwkJCXBoaW5mby0+cGhfZXZhbF9hdCA9IHJlcGxhY2VfcmVs aWQocGhpbmZvLT5waF9ldmFsX2F0LCBvanJlbGlkLCBzdWJzdCk7CiAJCQlBc3NlcnQoIWJt c19pc19lbXB0eShwaGluZm8tPnBoX2V2YWxfYXQpKTsJLyogY2hlY2tlZCBwcmV2aW91c2x5 ICovCi0JCQlwaGluZm8tPnBoX25lZWRlZCA9IGJtc19kZWxfbWVtYmVyKHBoaW5mby0+cGhf bmVlZGVkLCByZWxpZCk7Ci0JCQlwaGluZm8tPnBoX25lZWRlZCA9IGJtc19kZWxfbWVtYmVy KHBoaW5mby0+cGhfbmVlZGVkLCBvanJlbGlkKTsKKwkJCXBoaW5mby0+cGhfbmVlZGVkID0g cmVwbGFjZV9yZWxpZChwaGluZm8tPnBoX25lZWRlZCwgcmVsaWQsIHN1YnN0KTsKKwkJCXBo aW5mby0+cGhfbmVlZGVkID0gcmVwbGFjZV9yZWxpZChwaGluZm8tPnBoX25lZWRlZCwgb2py ZWxpZCwgc3Vic3QpOwogCQkJLyogcGhfbmVlZGVkIG1pZ2h0IG9yIG1pZ2h0IG5vdCBiZWNv bWUgZW1wdHkgKi8KLQkJCXBodi0+cGhyZWxzID0gYm1zX2RlbF9tZW1iZXIocGh2LT5waHJl bHMsIHJlbGlkKTsKLQkJCXBodi0+cGhyZWxzID0gYm1zX2RlbF9tZW1iZXIocGh2LT5waHJl bHMsIG9qcmVsaWQpOworCQkJcGh2LT5waHJlbHMgPSByZXBsYWNlX3JlbGlkKHBodi0+cGhy ZWxzLCByZWxpZCwgc3Vic3QpOworCQkJcGh2LT5waHJlbHMgPSByZXBsYWNlX3JlbGlkKHBo di0+cGhyZWxzLCBvanJlbGlkLCBzdWJzdCk7CiAJCQlBc3NlcnQoIWJtc19pc19lbXB0eShw aHYtPnBocmVscykpOwogCQkJQXNzZXJ0KHBodi0+cGhudWxsaW5ncmVscyA9PSBOVUxMKTsg Lyogbm8gbmVlZCB0byBhZGp1c3QgKi8KIAkJfQogCX0KK30KKworc3RhdGljIHZvaWQKK3Jl bW92ZV9sZWZ0am9pbnJlbF9mcm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVs aWQsCisJCQkJCQkJICBTcGVjaWFsSm9pbkluZm8gKnNqaW5mbykKK3sKKwlMaXN0CSAgICpq b2luaW5mb3M7CisJaW50CQkJb2pyZWxpZCA9IHNqaW5mby0+b2pyZWxpZDsKKwlSZWxPcHRJ bmZvICpyZWwgPSBmaW5kX2Jhc2VfcmVsKHJvb3QsIHJlbGlkKTsKKwlSZWxpZHMJCWpvaW5f cGx1c19jb21tdXRlOworCVJlbGlkcwkJam9pbnJlbGlkczsKKwlMaXN0Q2VsbCAgICpsOwor CisJLyogQ29tcHV0ZSB0aGUgcmVsaWQgc2V0IGZvciB0aGUgam9pbiB3ZSBhcmUgY29uc2lk ZXJpbmcgKi8KKwlqb2lucmVsaWRzID0gYm1zX3VuaW9uKHNqaW5mby0+bWluX2xlZnRoYW5k LCBzamluZm8tPm1pbl9yaWdodGhhbmQpOworCUFzc2VydChvanJlbGlkICE9IDApOworCWpv aW5yZWxpZHMgPSBibXNfYWRkX21lbWJlcihqb2lucmVsaWRzLCBvanJlbGlkKTsKKworCXJl bW92ZV9yZWxfZnJvbV9xdWVyeV9jb21tb24ocm9vdCwgcmVsLCAtMSwgc2ppbmZvLCBqb2lu cmVsaWRzKTsKIAogCS8qCiAJICogUmVtb3ZlIGFueSBqb2lucXVhbHMgcmVmZXJlbmNpbmcg dGhlIHJlbCBmcm9tIHRoZSBqb2luaW5mbyBsaXN0cy4KQEAgLTg0NCw5ICs4ODIsMTQgQEAg cmVsX3N1cHBvcnRzX2Rpc3RpbmN0bmVzcyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5m byAqcmVsKQogICogTm90ZSB0aGF0IHRoZSBwYXNzZWQtaW4gY2xhdXNlX2xpc3QgbWF5IGJl IGRlc3RydWN0aXZlbHkgbW9kaWZpZWQhICBUaGlzCiAgKiBpcyBPSyBmb3IgY3VycmVudCB1 c2VzLCBiZWNhdXNlIHRoZSBjbGF1c2VfbGlzdCBpcyBidWlsdCBieSB0aGUgY2FsbGVyIGZv cgogICogdGhlIHNvbGUgcHVycG9zZSBvZiBwYXNzaW5nIHRvIHRoaXMgZnVuY3Rpb24uCisg KgorICogb3V0ZXJfZXhwcnMgY29udGFpbnMgcmlnaHQgc2lkZXMgb2YgYmFzZXJlc3RyaWN0 aW5mbyBjbGF1c2VzIGxvb2tzIGxpa2UKKyAqIHggPSBjb25zdCBpZiBkaXN0aW5jdG5lc3Mg aXMgZGVyaXZlZCBmcm9tIHN1Y2ggY2xhdXNlcywgbm90IGpvaW5pbmZvIGNsYXVzZS4KKyAq IFBhc3MgTlVMTCBmb3IgdGhlIHBhcmFtIHZhbHVlLCBpZiBpdCBpcyBub3QgaW50ZXJlc3Rl ZC4KICAqLwogc3RhdGljIGJvb2wKLXJlbF9pc19kaXN0aW5jdF9mb3IoUGxhbm5lckluZm8g KnJvb3QsIFJlbE9wdEluZm8gKnJlbCwgTGlzdCAqY2xhdXNlX2xpc3QpCityZWxfaXNfZGlz dGluY3RfZm9yKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsIExpc3QgKmNs YXVzZV9saXN0LAorCQkJCQlMaXN0ICoqZXh0cmFfY2xhdXNlcykKIHsKIAkvKgogCSAqIFdl IGNvdWxkIHNraXAgYSBjb3VwbGUgb2YgdGVzdHMgaGVyZSBpZiB3ZSBhc3N1bWUgYWxsIGNh bGxlcnMgY2hlY2tlZApAQCAtODU5LDEwICs5MDIsMTEgQEAgcmVsX2lzX2Rpc3RpbmN0X2Zv cihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLCBMaXN0ICpjbGF1c2VfbGlz dCkKIAl7CiAJCS8qCiAJCSAqIEV4YW1pbmUgdGhlIGluZGV4ZXMgdG8gc2VlIGlmIHdlIGhh dmUgYSBtYXRjaGluZyB1bmlxdWUgaW5kZXguCi0JCSAqIHJlbGF0aW9uX2hhc191bmlxdWVf aW5kZXhfZm9yIGF1dG9tYXRpY2FsbHkgYWRkcyBhbnkgdXNhYmxlCisJCSAqIHJlbGF0aW9u X2hhc191bmlxdWVfaW5kZXhfZXh0IGF1dG9tYXRpY2FsbHkgYWRkcyBhbnkgdXNhYmxlCiAJ CSAqIHJlc3RyaWN0aW9uIGNsYXVzZXMgZm9yIHRoZSByZWwsIHNvIHdlIG5lZWRuJ3QgZG8g dGhhdCBoZXJlLgogCQkgKi8KLQkJaWYgKHJlbGF0aW9uX2hhc191bmlxdWVfaW5kZXhfZm9y KHJvb3QsIHJlbCwgY2xhdXNlX2xpc3QsIE5JTCwgTklMKSkKKwkJaWYgKHJlbGF0aW9uX2hh c191bmlxdWVfaW5kZXhfZXh0KHJvb3QsIHJlbCwgY2xhdXNlX2xpc3QsIE5JTCwgTklMLAor CQkJCQkJCQkJCSAgZXh0cmFfY2xhdXNlcykpCiAJCQlyZXR1cm4gdHJ1ZTsKIAl9CiAJZWxz ZSBpZiAocmVsLT5ydGVraW5kID09IFJURV9TVUJRVUVSWSkKQEAgLTExNzYsOSArMTIyMCwy MSBAQCBpbm5lcnJlbF9pc191bmlxdWUoUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJICAgSm9p blR5cGUgam9pbnR5cGUsCiAJCQkJICAgTGlzdCAqcmVzdHJpY3RsaXN0LAogCQkJCSAgIGJv b2wgZm9yY2VfY2FjaGUpCit7CisJcmV0dXJuIGlubmVycmVsX2lzX3VuaXF1ZV9leHQocm9v dCwgam9pbnJlbGlkcywgb3V0ZXJyZWxpZHMsIGlubmVycmVsLAorCQkJCQkJCQkgIGpvaW50 eXBlLCByZXN0cmljdGxpc3QsIGZvcmNlX2NhY2hlLCBOVUxMKTsKK30KKworYm9vbAoraW5u ZXJyZWxfaXNfdW5pcXVlX2V4dChQbGFubmVySW5mbyAqcm9vdCwgUmVsaWRzIGpvaW5yZWxp ZHMsIFJlbGlkcyBvdXRlcnJlbGlkcywKKwkJCQkJICAgUmVsT3B0SW5mbyAqaW5uZXJyZWws IEpvaW5UeXBlIGpvaW50eXBlLAorCQkJCQkgICBMaXN0ICpyZXN0cmljdGxpc3QsIGJvb2wg Zm9yY2VfY2FjaGUsCisJCQkJCSAgIExpc3QgKipleHRyYV9jbGF1c2VzKQogewogCU1lbW9y eUNvbnRleHQgb2xkX2NvbnRleHQ7CiAJTGlzdENlbGwgICAqbGM7CisJVW5pcXVlUmVsSW5m byAqdW5pcXVlUmVsSW5mbzsKKwlMaXN0CSAgICpvdXRlcl9leHBycyA9IE5JTDsKIAogCS8q IENlcnRhaW5seSBjYW4ndCBwcm92ZSB1bmlxdWVuZXNzIHdoZW4gdGhlcmUgYXJlIG5vIGpv aW5jbGF1c2VzICovCiAJaWYgKHJlc3RyaWN0bGlzdCA9PSBOSUwpCkBAIC0xMjAwLDEwICsx MjU2LDE0IEBAIGlubmVycmVsX2lzX3VuaXF1ZShQbGFubmVySW5mbyAqcm9vdCwKIAkgKi8K IAlmb3JlYWNoKGxjLCBpbm5lcnJlbC0+dW5pcXVlX2Zvcl9yZWxzKQogCXsKLQkJUmVsaWRz CQl1bmlxdWVfZm9yX3JlbHMgPSAoUmVsaWRzKSBsZmlyc3QobGMpOworCQl1bmlxdWVSZWxJ bmZvID0gKFVuaXF1ZVJlbEluZm8gKikgbGZpcnN0KGxjKTsKIAotCQlpZiAoYm1zX2lzX3N1 YnNldCh1bmlxdWVfZm9yX3JlbHMsIG91dGVycmVsaWRzKSkKKwkJaWYgKGJtc19pc19zdWJz ZXQodW5pcXVlUmVsSW5mby0+b3V0ZXJyZWxpZHMsIG91dGVycmVsaWRzKSkKKwkJeworCQkJ aWYgKGV4dHJhX2NsYXVzZXMpCisJCQkJKmV4dHJhX2NsYXVzZXMgPSB1bmlxdWVSZWxJbmZv LT5leHRyYV9jbGF1c2VzOwogCQkJcmV0dXJuIHRydWU7CQkvKiBTdWNjZXNzISAqLworCQl9 CiAJfQogCiAJLyoKQEAgLTEyMjAsNyArMTI4MCw3IEBAIGlubmVycmVsX2lzX3VuaXF1ZShQ bGFubmVySW5mbyAqcm9vdCwKIAogCS8qIE5vIGNhY2hlZCBpbmZvcm1hdGlvbiwgc28gdHJ5 IHRvIG1ha2UgdGhlIHByb29mLiAqLwogCWlmIChpc19pbm5lcnJlbF91bmlxdWVfZm9yKHJv b3QsIGpvaW5yZWxpZHMsIG91dGVycmVsaWRzLCBpbm5lcnJlbCwKLQkJCQkJCQkgICBqb2lu dHlwZSwgcmVzdHJpY3RsaXN0KSkKKwkJCQkJCQkgICBqb2ludHlwZSwgcmVzdHJpY3RsaXN0 LCAmb3V0ZXJfZXhwcnMpKQogCXsKIAkJLyoKIAkJICogQ2FjaGUgdGhlIHBvc2l0aXZlIHJl c3VsdCBmb3IgZnV0dXJlIHByb2JlcywgYmVpbmcgc3VyZSB0byBrZWVwIGl0CkBAIC0xMjMz LDEwICsxMjkzLDE1IEBAIGlubmVycmVsX2lzX3VuaXF1ZShQbGFubmVySW5mbyAqcm9vdCwK IAkJICogc3VwZXJzZXRzIG9mIHRoZW0gYW55d2F5LgogCQkgKi8KIAkJb2xkX2NvbnRleHQg PSBNZW1vcnlDb250ZXh0U3dpdGNoVG8ocm9vdC0+cGxhbm5lcl9jeHQpOworCQl1bmlxdWVS ZWxJbmZvID0gcGFsbG9jKHNpemVvZihVbmlxdWVSZWxJbmZvKSk7CisJCXVuaXF1ZVJlbElu Zm8tPmV4dHJhX2NsYXVzZXMgPSBvdXRlcl9leHByczsKKwkJdW5pcXVlUmVsSW5mby0+b3V0 ZXJyZWxpZHMgPSBibXNfY29weShvdXRlcnJlbGlkcyk7CiAJCWlubmVycmVsLT51bmlxdWVf Zm9yX3JlbHMgPSBsYXBwZW5kKGlubmVycmVsLT51bmlxdWVfZm9yX3JlbHMsCi0JCQkJCQkJ CQkJCWJtc19jb3B5KG91dGVycmVsaWRzKSk7CisJCQkJCQkJCQkJCXVuaXF1ZVJlbEluZm8p OwogCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkX2NvbnRleHQpOwogCisJCWlmIChleHRy YV9jbGF1c2VzKQorCQkJKmV4dHJhX2NsYXVzZXMgPSBvdXRlcl9leHByczsKIAkJcmV0dXJu IHRydWU7CQkJLyogU3VjY2VzcyEgKi8KIAl9CiAJZWxzZQpAQCAtMTI4Miw3ICsxMzQ3LDgg QEAgaXNfaW5uZXJyZWxfdW5pcXVlX2ZvcihQbGFubmVySW5mbyAqcm9vdCwKIAkJCQkJICAg UmVsaWRzIG91dGVycmVsaWRzLAogCQkJCQkgICBSZWxPcHRJbmZvICppbm5lcnJlbCwKIAkJ CQkJICAgSm9pblR5cGUgam9pbnR5cGUsCi0JCQkJCSAgIExpc3QgKnJlc3RyaWN0bGlzdCkK KwkJCQkJICAgTGlzdCAqcmVzdHJpY3RsaXN0LAorCQkJCQkgICBMaXN0ICoqZXh0cmFfY2xh dXNlcykKIHsKIAlMaXN0CSAgICpjbGF1c2VfbGlzdCA9IE5JTDsKIAlMaXN0Q2VsbCAgICps YzsKQEAgLTEzMjQsNSArMTM5MCw5MTYgQEAgaXNfaW5uZXJyZWxfdW5pcXVlX2ZvcihQbGFu bmVySW5mbyAqcm9vdCwKIAl9CiAKIAkvKiBMZXQgcmVsX2lzX2Rpc3RpbmN0X2ZvcigpIGRv IHRoZSBoYXJkIHdvcmsgKi8KLQlyZXR1cm4gcmVsX2lzX2Rpc3RpbmN0X2Zvcihyb290LCBp bm5lcnJlbCwgY2xhdXNlX2xpc3QpOworCXJldHVybiByZWxfaXNfZGlzdGluY3RfZm9yKHJv b3QsIGlubmVycmVsLCBjbGF1c2VfbGlzdCwgZXh0cmFfY2xhdXNlcyk7Cit9CisKK3R5cGVk ZWYgc3RydWN0IFJlcGxhY2VWYXJub0NvbnRleHQKK3sKKwlpbnQJCQkJZnJvbTsKKwlpbnQJ CQkJdG87Cit9IFJlcGxhY2VWYXJub0NvbnRleHQ7CisKK3N0YXRpYyBib29sCityZXBsYWNl X3Zhcm5vX3dhbGtlcihOb2RlICpub2RlLCBSZXBsYWNlVmFybm9Db250ZXh0ICpjdHgpCit7 CisJaWYgKG5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKElzQShub2Rl LCBWYXIpKQorCXsKKwkJVmFyICAgKnZhciA9IChWYXIgKikgbm9kZTsKKworCQlpZiAodmFy LT52YXJubyA9PSBjdHgtPmZyb20pCisJCXsKKwkJCXZhci0+dmFybm8gPSBjdHgtPnRvOwor CQkJdmFyLT52YXJub3N5biA9IGN0eC0+dG87CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0K KwlpZiAoSXNBKG5vZGUsIFJlc3RyaWN0SW5mbykpCisJeworCQlSZXN0cmljdEluZm8gICAq cmluZm8gPSAoUmVzdHJpY3RJbmZvICopIG5vZGU7CisJCWludAkJCQlyZWxpZCA9IC0xOwor CQlib29sCQkJaXNfcmVxX2VxdWFsID0KKwkJCQkJCQkocmluZm8tPnJlcXVpcmVkX3JlbGlk cyA9PSByaW5mby0+Y2xhdXNlX3JlbGlkcyk7CisKKwkJaWYgKGJtc19pc19tZW1iZXIoY3R4 LT5mcm9tLCByaW5mby0+Y2xhdXNlX3JlbGlkcykpCisJCXsKKwkJCXJlcGxhY2VfdmFybm8o KE5vZGUgKikgcmluZm8tPmNsYXVzZSwgY3R4LT5mcm9tLCBjdHgtPnRvKTsKKwkJCXJlcGxh Y2VfdmFybm8oKE5vZGUgKikgcmluZm8tPm9yY2xhdXNlLCBjdHgtPmZyb20sIGN0eC0+dG8p OworCQkJcmluZm8tPmNsYXVzZV9yZWxpZHMgPSByZXBsYWNlX3JlbGlkKHJpbmZvLT5jbGF1 c2VfcmVsaWRzLCBjdHgtPmZyb20sIGN0eC0+dG8pOworCQkJcmluZm8tPmxlZnRfcmVsaWRz ID0gcmVwbGFjZV9yZWxpZChyaW5mby0+bGVmdF9yZWxpZHMsIGN0eC0+ZnJvbSwgY3R4LT50 byk7CisJCQlyaW5mby0+cmlnaHRfcmVsaWRzID0gcmVwbGFjZV9yZWxpZChyaW5mby0+cmln aHRfcmVsaWRzLCBjdHgtPmZyb20sIGN0eC0+dG8pOworCQl9CisKKwkJaWYgKGlzX3JlcV9l cXVhbCkKKwkJCXJpbmZvLT5yZXF1aXJlZF9yZWxpZHMgPSByaW5mby0+Y2xhdXNlX3JlbGlk czsKKwkJZWxzZQorCQkJcmluZm8tPnJlcXVpcmVkX3JlbGlkcyA9IHJlcGxhY2VfcmVsaWQo cmluZm8tPnJlcXVpcmVkX3JlbGlkcywgY3R4LT5mcm9tLCBjdHgtPnRvKTsKKworCQlyaW5m by0+b3V0ZXJfcmVsaWRzID0gcmVwbGFjZV9yZWxpZChyaW5mby0+b3V0ZXJfcmVsaWRzLCBj dHgtPmZyb20sIGN0eC0+dG8pOworCQlyaW5mby0+aW5jb21wYXRpYmxlX3JlbGlkcyA9IHJl cGxhY2VfcmVsaWQocmluZm8tPmluY29tcGF0aWJsZV9yZWxpZHMsIGN0eC0+ZnJvbSwgY3R4 LT50byk7CisKKwkJaWYgKHJpbmZvLT5tZXJnZW9wZmFtaWxpZXMgJiYKKwkJCWJtc19nZXRf c2luZ2xldG9uX21lbWJlcihyaW5mby0+Y2xhdXNlX3JlbGlkcywgJnJlbGlkKSAmJgorCQkJ cmVsaWQgPT0gY3R4LT50byAmJiBJc0EocmluZm8tPmNsYXVzZSwgT3BFeHByKSkKKwkJewor CQkJRXhwcgkgICAqbGVmdE9wOworCQkJRXhwcgkgICAqcmlnaHRPcDsKKworCQkJbGVmdE9w ID0gKEV4cHIgKikgZ2V0X2xlZnRvcChyaW5mby0+Y2xhdXNlKTsKKwkJCXJpZ2h0T3AgPSAo RXhwciAqKSBnZXRfcmlnaHRvcChyaW5mby0+Y2xhdXNlKTsKKworCQkJaWYgKGxlZnRPcCAh PSBOVUxMICYmIGVxdWFsKGxlZnRPcCwgcmlnaHRPcCkpCisJCQl7CisJCQkJTnVsbFRlc3Qg ICAqbnRlc3QgPSBtYWtlTm9kZShOdWxsVGVzdCk7CisKKwkJCQludGVzdC0+YXJnID0gbGVm dE9wOworCQkJCW50ZXN0LT5udWxsdGVzdHR5cGUgPSBJU19OT1RfTlVMTDsKKwkJCQludGVz dC0+YXJnaXNyb3cgPSBmYWxzZTsKKwkJCQludGVzdC0+bG9jYXRpb24gPSAtMTsKKwkJCQly aW5mby0+Y2xhdXNlID0gKEV4cHIgKikgbnRlc3Q7CisJCQkJcmluZm8tPm1lcmdlb3BmYW1p bGllcyA9IE5JTDsKKwkJCX0KKwkJCUFzc2VydChyaW5mby0+b3JjbGF1c2UgPT0gTlVMTCk7 CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiBleHByZXNzaW9uX3RyZWVf d2Fsa2VyKG5vZGUsIHJlcGxhY2VfdmFybm9fd2Fsa2VyLCAodm9pZCAqKSBjdHgpOworfQor CisvKgorICogUmVwbGFjZSBlYWNoIG9jY3VyZW5jZSBvZiByZW1vdmluZyByZWxpZCB3aXRo IHRoZSBrZWVwaW5nIG9uZQorICovCitzdGF0aWMgdm9pZAorcmVwbGFjZV92YXJubyhOb2Rl ICpub2RlLCBpbnQgZnJvbSAsIGludCB0bykKK3sKKwlSZXBsYWNlVmFybm9Db250ZXh0IGN0 eDsKKworCWlmICh0byA8PSAwKQorCQlyZXR1cm47CisKKwljdHguZnJvbSA9IGZyb207CisJ Y3R4LnRvID0gdG87CisJcmVwbGFjZV92YXJub193YWxrZXIobm9kZSwgJmN0eCk7Cit9CisK Ky8qCisgKiBTdWJzdGl0dXRlIG5ld0lkIGJ5IG9sZElkIGluIHJlbGlkcy4KKyAqLworc3Rh dGljIEJpdG1hcHNldCAqCityZXBsYWNlX3JlbGlkKFJlbGlkcyByZWxpZHMsIGludCBvbGRJ ZCwgaW50IG5ld0lkKQoreworCWlmIChvbGRJZCA8IDApCisJCXJldHVybiByZWxpZHM7CisK KwlpZiAobmV3SWQgPCAwKQorCQkvKiBEZWxldGUgcmVsaWQgd2l0aG91dCBzdWJzdGl0dXRp b24uICovCisJCXJldHVybiBibXNfZGVsX21lbWJlcihyZWxpZHMsIG9sZElkKTsKKworCWlm IChibXNfaXNfbWVtYmVyKG9sZElkLCByZWxpZHMpKQorCQlyZXR1cm4gYm1zX2FkZF9tZW1i ZXIoYm1zX2RlbF9tZW1iZXIoYm1zX2NvcHkocmVsaWRzKSwgb2xkSWQpLCBuZXdJZCk7CisK KwlyZXR1cm4gcmVsaWRzOworfQorCisvKgorICogVXBkYXRlIEVDIG1lbWJlcnMgdG8gcG9p bnQgdG8gdGhlIHJlbWFpbmluZyByZWxhdGlvbiBpbnN0ZWFkIG9mIHRoZSByZW1vdmVkCisg KiBvbmUsIHJlbW92aW5nIGR1cGxpY2F0ZXMuCisgKgorICogUmVzdHJpY3Rpb24gY2xhdXNl cyBmb3IgYmFzZSByZWxhdGlvbnMgYXJlIGFscmVhZHkgZGlzdHJpYnV0ZWQgdG8KKyAqIHRo ZSByZXNwZWN0aXZlIGJhc2VyZXN0cmljdGluZm8gbGlzdHMgKHNlZQorICogZ2VuZXJhdGVf aW1wbGllZF9lcXVhbGl0aWVzKS4gVGhlIGFib3ZlIGNvZGUgaGFzIGFscmVhZHkgcHJvY2Vz c2VkCisgKiB0aGlzIGxpc3QsIGFuZCB1cGRhdGVkIHRoZXNlIGNsYXVzZXMgdG8gcmVmZXJl bmNlIHRoZSByZW1haW5pbmcKKyAqIHJlbGF0aW9uLCBzbyB3ZSBjYW4gc2tpcCB0aGVtIGhl cmUgYmFzZWQgb24gdGhlaXIgcmVsaWRzLgorICoKKyAqIExpa2V3aXNlLCB3ZSBoYXZlIGFs cmVhZHkgcHJvY2Vzc2VkIHRoZSBqb2luIGNsYXVzZXMgdGhhdCBqb2luIHRoZQorICogcmVt b3ZlZCByZWxhdGlvbiB0byB0aGUgcmVtYWluaW5nIG9uZS4KKyAqCisgKiBGaW5hbGx5LCB0 aGVyZSBhcmUgam9pbiBjbGF1c2VzIHRoYXQgam9pbiB0aGUgcmVtb3ZlZCByZWxhdGlvbiB0 bworICogc29tZSB0aGlyZCByZWxhdGlvbi4gV2UgY2FuJ3QganVzdCBkZWxldGUgdGhlIHNv dXJjZSBjbGF1c2VzIGFuZAorICogcmVnZW5lcmF0ZSB0aGVtIGZyb20gdGhlIEVDLCBiZWNh dXNlIHRoZSBjb3JyZXNwb25kaW5nIGVxdWFsaXR5CisgKiBvcGVyYXRvcnMgbWlnaHQgYmUg bWlzc2luZyAoc2VlIHRoZSBoYW5kbGluZyBvZiBlY19icm9rZW4pLgorICogVGhlcmVmb3Jl LCB3ZSB3aWxsIHVwZGF0ZSB0aGUgcmVmZXJlbmNlcyBpbiB0aGUgc291cmNlIGNsYXVzZXMu CisgKgorICogRGVyaXZlZCBjbGF1c2VzIGNhbiBiZSBnZW5lcmF0ZWQgYWdhaW4sIHNvIGl0 IGlzIHNpbXBsZXIgdG8ganVzdAorICogZGVsZXRlIHRoZW0uCisgKi8KK3N0YXRpYyB2b2lk Cit1cGRhdGVfZWNsYXNzKEVxdWl2YWxlbmNlQ2xhc3MgKmVjLCBpbnQgZnJvbSwgaW50IHRv KQoreworCUxpc3QJICAgKm5ld19tZW1iZXJzID0gTklMOworCUxpc3QJICAgKm5ld19zb3Vy Y2VzID0gTklMOworCUxpc3RDZWxsICAgKmxjOworCisJZm9yZWFjaChsYywgZWMtPmVjX21l bWJlcnMpCisJeworCQlFcXVpdmFsZW5jZU1lbWJlciAgKmVtID0gbGZpcnN0X25vZGUoRXF1 aXZhbGVuY2VNZW1iZXIsIGxjKTsKKwkJYm9vbAkJCQlpc19yZWR1bmRhbnQgPSBmYWxzZTsK KworCQlpZiAoIWJtc19pc19tZW1iZXIoZnJvbSwgZW0tPmVtX3JlbGlkcykpCisJCXsKKwkJ CW5ld19tZW1iZXJzID0gbGFwcGVuZChuZXdfbWVtYmVycywgZW0pOworCQkJY29udGludWU7 CisJCX0KKworCQllbS0+ZW1fcmVsaWRzID0gcmVwbGFjZV9yZWxpZChlbS0+ZW1fcmVsaWRz LCBmcm9tLCB0byk7CisKKwkJLyogV2Ugb25seSBwcm9jZXNzIGlubmVyIGpvaW5zICovCisJ CXJlcGxhY2VfdmFybm8oKE5vZGUgKikgZW0tPmVtX2V4cHIsIGZyb20sIHRvKTsKKworCQlm b3JlYWNoKGxjLCBuZXdfbWVtYmVycykKKwkJeworCQkJRXF1aXZhbGVuY2VNZW1iZXIgICpv dGhlciA9IGxmaXJzdF9ub2RlKEVxdWl2YWxlbmNlTWVtYmVyLCBsYyk7CisKKwkJCWlmICgh ZXF1YWwoZW0tPmVtX3JlbGlkcywgb3RoZXItPmVtX3JlbGlkcykpCisJCQkJY29udGludWU7 CisKKwkJCWlmIChlcXVhbChlbS0+ZW1fZXhwciwgb3RoZXItPmVtX2V4cHIpKQorCQkJewor CQkJCWlzX3JlZHVuZGFudCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlp ZiAoIWlzX3JlZHVuZGFudCkKKwkJCW5ld19tZW1iZXJzID0gbGFwcGVuZChuZXdfbWVtYmVy cywgZW0pOworCX0KKwlsaXN0X2ZyZWUoZWMtPmVjX21lbWJlcnMpOworCWVjLT5lY19tZW1i ZXJzID0gbmV3X21lbWJlcnM7CisKKwlsaXN0X2ZyZWUoZWMtPmVjX2Rlcml2ZXMpOworCWVj LT5lY19kZXJpdmVzID0gTlVMTDsKKworCS8qIFVwZGF0ZSBFQyBzb3VyY2UgZXhwcmVzc2lv bnMgKi8KKwlmb3JlYWNoKGxjLCBlYy0+ZWNfc291cmNlcykKKwl7CisJCVJlc3RyaWN0SW5m byAgICpyaW5mbyA9IGxmaXJzdF9ub2RlKFJlc3RyaWN0SW5mbywgbGMpOworCQlib29sCQkJ aXNfcmVkdW5kYW50ID0gZmFsc2U7CisKKwkJaWYgKCFibXNfaXNfbWVtYmVyKGZyb20sIHJp bmZvLT5yZXF1aXJlZF9yZWxpZHMpKQorCQl7CisJCQluZXdfc291cmNlcyA9IGxhcHBlbmQo bmV3X3NvdXJjZXMsIHJpbmZvKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmVwbGFjZV92 YXJubygoTm9kZSAqKSByaW5mbywgZnJvbSwgdG8pOworCisJCS8qCisJCSAqIEFmdGVyIHN3 aXRjaGluZyB0aGUgY2xhdXNlIHRvIHRoZSByZW1haW5pbmcgcmVsYXRpb24sIGNoZWNrIGl0 IGZvcgorCQkgKiByZWR1bmRhbmN5IHdpdGggZXhpc3Rpbmcgb25lcy4gV2UgZG9uJ3QgaGF2 ZSB0byBjaGVjayBmb3IKKwkJICogcmVkdW5kYW5jeSB3aXRoIGRlcml2ZWQgY2xhdXNlcywg YmVjYXVzZSB3ZSd2ZSBqdXN0IGRlbGV0ZWQgdGhlbS4KKwkJICovCisJCWZvcmVhY2gobGMs IG5ld19zb3VyY2VzKQorCQl7CisJCQlSZXN0cmljdEluZm8gICAqb3RoZXIgPSBsZmlyc3Rf bm9kZShSZXN0cmljdEluZm8sIGxjKTsKKworCQkJaWYgKCFlcXVhbChyaW5mby0+Y2xhdXNl X3JlbGlkcywgb3RoZXItPmNsYXVzZV9yZWxpZHMpKQorCQkJCWNvbnRpbnVlOworCisJCQlp ZiAoZXF1YWwocmluZm8tPmNsYXVzZSwgb3RoZXItPmNsYXVzZSkpCisJCQl7CisJCQkJaXNf cmVkdW5kYW50ID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICghaXNf cmVkdW5kYW50KQorCQkJbmV3X3NvdXJjZXMgPSBsYXBwZW5kKG5ld19zb3VyY2VzLCByaW5m byk7CisJfQorCisJbGlzdF9mcmVlKGVjLT5lY19zb3VyY2VzKTsKKwllYy0+ZWNfc291cmNl cyA9IG5ld19zb3VyY2VzOworCWVjLT5lY19yZWxpZHMgPSByZXBsYWNlX3JlbGlkKGVjLT5l Y19yZWxpZHMsIGZyb20sIHRvKTsKK30KKworc3RhdGljIGJvb2wKK3NqZV93YWxrZXIoTm9k ZSAqbm9kZSwgUmVwbGFjZVZhcm5vQ29udGV4dCAqY3R4KQoreworCWlmIChub2RlID09IE5V TEwpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChJc0Eobm9kZSwgVmFyKSkKKwl7CisJCVZh ciAqdmFyID0gKFZhciAqKSBub2RlOworCisJCWlmICh2YXItPnZhcm5vID09IGN0eC0+ZnJv bSkKKwkJeworCQkJdmFyLT52YXJubyA9IGN0eC0+dG87CisJCQl2YXItPnZhcm5vc3luID0g Y3R4LT50bzsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiBleHByZXNzaW9u X3RyZWVfd2Fsa2VyKG5vZGUsIHNqZV93YWxrZXIsICh2b2lkICopIGN0eCk7Cit9CisKKy8q CisgKiBSZW1vdmUgYSByZWxhdGlvbiBhZnRlciB3ZSBoYXZlIHByb3ZlbiB0aGF0IGl0IHBh cnRpY2lwYXRlcyBvbmx5IGluIGFuCisgKiB1bm5lZWRlZCB1bmlxdWUgc2VsZiBqb2luLgor ICoKKyAqIFJlcGxhY2UgYW55IGxpbmtzIGluIHBsYW5uZXIgaW5mbyBzdHJ1Y3R1cmVzLgor ICoKKyAqIFRyYW5zZmVyIGpvaW4gYW5kIHJlc3RyaWN0aW9uIGNsYXVzZXMgZnJvbSB0aGUg cmVtb3ZlZCByZWxhdGlvbiB0byB0aGUKKyAqIHJlbWFpbmluZyBvbmUuIFdlIGNoYW5nZSB0 aGUgVmFycyBvZiB0aGUgY2xhdXNlIHRvIHBvaW50IHRvIHRoZQorICogcmVtYWluaW5nIHJl bGF0aW9uIGluc3RlYWQgb2YgdGhlIHJlbW92ZWQgb25lLiBUaGUgY2xhdXNlcyB0aGF0IHJl cXVpcmUKKyAqIGEgc3Vic2V0IG9mIGpvaW5yZWxpZHMgYmVjb21lIHJlc3RyaWN0aW9uIGNs YXVzZXMgb2YgdGhlIHJlbWFpbmluZworICogcmVsYXRpb24sIGFuZCBvdGhlcnMgcmVtYWlu IGpvaW4gY2xhdXNlcy4gV2UgYXBwZW5kIHRoZW0gdG8KKyAqIGJhc2VyZXN0cmljdGluZm8g YW5kIGpvaW5pbmZvIHJlc3BlY3RpdmVseSwgdHJ5aW5nIG5vdCB0byBpbnRyb2R1Y2UKKyAq IGR1cGxpY2F0ZXMuCisgKgorICogV2UgYWxzbyBoYXZlIHRvIHByb2Nlc3MgdGhlICdqb2lu Y2xhdXNlcycgbGlzdCBoZXJlLCBiZWNhdXNlIGl0CisgKiBjb250YWlucyBFQy1kZXJpdmVk IGpvaW4gY2xhdXNlcyB3aGljaCBtdXN0IGJlY29tZSBmaWx0ZXIgY2xhdXNlcy4gSXQKKyAq IGlzIG5vdCBlbm91Z2ggdG8ganVzdCBjb3JyZWN0IHRoZSBFQ3MsIGJlY2F1c2UgdGhlIEVD LWRlcml2ZWQKKyAqIHJlc3RyaWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJlZm9yZSBqb2luIHJl bW92YWwgKHNlZQorICogZ2VuZXJhdGVfYmFzZV9pbXBsaWVkX2VxdWFsaXRpZXMpLgorICov CitzdGF0aWMgdm9pZAorcmVtb3ZlX3NlbGZfam9pbl9yZWwoUGxhbm5lckluZm8gKnJvb3Qs IFBsYW5Sb3dNYXJrICprbWFyaywgUGxhblJvd01hcmsgKnJtYXJrLAorCQkJCQkgUmVsT3B0 SW5mbyAqdG9LZWVwLCBSZWxPcHRJbmZvICp0b1JlbW92ZSwKKwkJCQkJIExpc3QgKnJlc3Ry aWN0bGlzdCkKK3sKKwlMaXN0CQkJICAgKmpvaW5pbmZvczsKKwlMaXN0Q2VsbAkJICAgKmxj OworCWludAkJCQkJaTsKKwlMaXN0CQkJICAgKmppbmZvX2NhbmRpZGF0ZXMgPSBOSUw7CisJ TGlzdAkJCSAgICpiaW5mb19jYW5kaWRhdGVzID0gTklMOworCVJlcGxhY2VWYXJub0NvbnRl eHQJY3R4ID0gey5mcm9tID0gdG9SZW1vdmUtPnJlbGlkLCAudG8gPSB0b0tlZXAtPnJlbGlk fTsKKworCS8qCisJICogUmVwbGFjZSBpbmRleCBvZiByZW1vdmluZyB0YWJsZSB3aXRoIHRo ZSBrZWVwaW5nIG9uZS4gVGhlIHRlY2huaXF1ZSBvZgorCSAqIHJlbW92aW5nL2Rpc3RyaWJ1 dGluZyByZXN0cmljdGluZm8gaXMgdXNlZCBoZXJlIHRvIGF0dGFjaCBqdXN0IGFwcGVhcmVk CisJICogKGZvciBrZWVwaW5nIHJlbGF0aW9uKSBqb2luIGNsYXVzZXMgYW5kIGF2b2lkIG9m IGFkZGluZyBkdXBsaWNhdGVzIG9mCisJICogdGhvc2UgdGhhdCBhbHJlYWR5IGV4aXN0IGlu IHRoZSBqb2luaW5mbyBsaXN0LgorCSAqLworCWpvaW5pbmZvcyA9IGxpc3RfY29weSh0b1Jl bW92ZS0+am9pbmluZm8pOworCWZvcmVhY2gobGMsIGpvaW5pbmZvcykKKwl7CisJCVJlc3Ry aWN0SW5mbyAqcmluZm8gPSBsZmlyc3Rfbm9kZShSZXN0cmljdEluZm8sIGxjKTsKKworCQly ZW1vdmVfam9pbl9jbGF1c2VfZnJvbV9yZWxzKHJvb3QsIHJpbmZvLCByaW5mby0+cmVxdWly ZWRfcmVsaWRzKTsKKwkJcmVwbGFjZV92YXJubygoTm9kZSAqKSByaW5mbywgdG9SZW1vdmUt PnJlbGlkLCB0b0tlZXAtPnJlbGlkKTsKKworCQlpZiAoYm1zX21lbWJlcnNoaXAocmluZm8t PnJlcXVpcmVkX3JlbGlkcykgPT0gQk1TX01VTFRJUExFKQorCQkJamluZm9fY2FuZGlkYXRl cyA9IGxhcHBlbmQoamluZm9fY2FuZGlkYXRlcywgcmluZm8pOworCQllbHNlCisJCQliaW5m b19jYW5kaWRhdGVzID0gbGFwcGVuZChiaW5mb19jYW5kaWRhdGVzLCByaW5mbyk7CisJfQor CisJLyoKKwkgKiBDb25jYXRlbmF0ZSByZXN0cmljdGxpc3QgdG8gdGhlIGxpc3Qgb2YgYmFz ZSByZXN0cmljdGlvbnMgb2YgdGhlIHJlbW92aW5nCisJICogdGFibGUganVzdCB0byBzaW1w bGlmeSByZXBsYWNlbWVudCBwcm9jZWR1cmU6IGFsbCBvZiB0aGVtIHdlcmVuJ3QKKwkgKiBj b25uZWN0ZWQgdG8gYW55IGtlZXBpbmcgcmVsYXRpb25zIGFuZCBuZWVkIHRvIGJlIGFkZGVk IHRvIHNvbWUgcmVscy4KKwkgKi8KKwl0b1JlbW92ZS0+YmFzZXJlc3RyaWN0aW5mbyA9IGxp c3RfY29uY2F0KHRvUmVtb3ZlLT5iYXNlcmVzdHJpY3RpbmZvLAorCQkJCQkJCQkJCQkgcmVz dHJpY3RsaXN0KTsKKwlmb3JlYWNoKGxjLCB0b1JlbW92ZS0+YmFzZXJlc3RyaWN0aW5mbykK Kwl7CisJCVJlc3RyaWN0SW5mbyAgICpyaW5mbyA9IGxmaXJzdF9ub2RlKFJlc3RyaWN0SW5m bywgbGMpOworCisJCXJlcGxhY2VfdmFybm8oKE5vZGUgKikgcmluZm8sIHRvUmVtb3ZlLT5y ZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisKKwkJaWYgKGJtc19tZW1iZXJzaGlwKHJpbmZvLT5y ZXF1aXJlZF9yZWxpZHMpID09IEJNU19NVUxUSVBMRSkKKwkJCWppbmZvX2NhbmRpZGF0ZXMg PSBsYXBwZW5kKGppbmZvX2NhbmRpZGF0ZXMsIHJpbmZvKTsKKwkJZWxzZQorCQkJYmluZm9f Y2FuZGlkYXRlcyA9IGxhcHBlbmQoYmluZm9fY2FuZGlkYXRlcywgcmluZm8pOworCX0KKwor CS8qCisJICogTm93LCBhZGQgYWxsIG5vbi1yZWR1bmRhbnQgY2xhdXNlcyB0byB0aGUga2Vl cGluZyByZWxhdGlvbi4KKwkgKiBDb250cmFkaWN0b3J5IG9wZXJhdGlvbi4gT24gdGhlIG9u ZSBzaWRlIHdlIHJlZHVjZSBsZW5ndGggb2YgcmVzdHJpY3QKKwkgKiBsaXN0cyB0aGF0IGNh biBpbXBhY3QgcGxhbm5pbmcgb3IgZXhlY3V0aW5nIHRpbWUuIEFkZGl0aW9uYWxseSwgd2UK KwkgKiBpbXByb3ZlIGFjY3VyYWN5IG9mIGNhcmRpbmFsaXR5IGVzdGltYXRpb24uIE9uIHRo ZSBvdGhlciBzaWRlLCBpdCBpcyBvbmUKKwkgKiBtb3JlIHBsYWNlIHdoaWNoIGNhbiBtYWtl IHBsYW5uaW5nIHRpbWUgbXVjaCBsb25nZXIgaW4gc3BlY2lmaWMgY2FzZXMuCisJICogSXQg d291bGQgaGF2ZSBiZWVuIGJldHRlciB0byBhdm9pZCBjYWxsaW5nIHRoZSBlcXVhbCgpIGZ1 bmN0aW9uIGhlcmUsCisJICogYnV0IGl0J3Mgb25seSB3YXkgdG8gZGV0ZWN0IGR1cGxpY2F0 ZWQgaW5lcXVhbGl0eSBleHByZXNzaW9ucy4KKwkgKi8KKworCWZvcmVhY2gobGMsIGJpbmZv X2NhbmRpZGF0ZXMpCisJeworCQlSZXN0cmljdEluZm8gICAqcmluZm8gPSBsZmlyc3Rfbm9k ZShSZXN0cmljdEluZm8sIGxjKTsKKwkJTGlzdENlbGwJICAgKm9sYyA9IE5VTEw7CisJCWJv b2wJCQlpc19yZWR1bmRhbnQgPSBmYWxzZTsKKworCQlBc3NlcnQoIWJtc19pc19tZW1iZXIo dG9SZW1vdmUtPnJlbGlkLCByaW5mby0+cmVxdWlyZWRfcmVsaWRzKSk7CisKKwkJZm9yZWFj aChvbGMsIHRvS2VlcC0+YmFzZXJlc3RyaWN0aW5mbykKKwkJeworCQkJUmVzdHJpY3RJbmZv ICpzcmMgPSBsZmlyc3Rfbm9kZShSZXN0cmljdEluZm8sIG9sYyk7CisKKwkJCWlmICghYm1z X2VxdWFsKHNyYy0+Y2xhdXNlX3JlbGlkcywgcmluZm8tPmNsYXVzZV9yZWxpZHMpKQorCQkJ CS8qIENvbnN0IGFuZCBub24tY29uc3QgZXhwcmVzc2lvbnMgY2FuJ3QgYmUgZXF1YWwgKi8K KwkJCQljb250aW51ZTsKKworCQkJaWYgKHNyYyA9PSByaW5mbyB8fAorCQkJCShyaW5mby0+ cGFyZW50X2VjICE9IE5VTEwKKwkJCQkgJiYgc3JjLT5wYXJlbnRfZWMgPT0gcmluZm8tPnBh cmVudF9lYykKKwkJCQl8fCBlcXVhbChyaW5mby0+Y2xhdXNlLCBzcmMtPmNsYXVzZSkpCisJ CQl7CisJCQkJaXNfcmVkdW5kYW50ID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQor CQlpZiAoIWlzX3JlZHVuZGFudCkKKwkJCWRpc3RyaWJ1dGVfcmVzdHJpY3RpbmZvX3RvX3Jl bHMocm9vdCwgcmluZm8pOworCX0KKwlmb3JlYWNoKGxjLCBqaW5mb19jYW5kaWRhdGVzKQor CXsKKwkJUmVzdHJpY3RJbmZvICAgKnJpbmZvID0gbGZpcnN0X25vZGUoUmVzdHJpY3RJbmZv LCBsYyk7CisJCUxpc3RDZWxsCSAgICpvbGMgPSBOVUxMOworCQlib29sCQkJaXNfcmVkdW5k YW50ID0gZmFsc2U7CisKKwkJQXNzZXJ0KCFibXNfaXNfbWVtYmVyKHRvUmVtb3ZlLT5yZWxp ZCwgcmluZm8tPnJlcXVpcmVkX3JlbGlkcykpOworCisJCWZvcmVhY2gob2xjLCB0b0tlZXAt PmpvaW5pbmZvKQorCQl7CisJCQlSZXN0cmljdEluZm8gKnNyYyA9IGxmaXJzdF9ub2RlKFJl c3RyaWN0SW5mbywgb2xjKTsKKworCQkJaWYgKCFibXNfZXF1YWwoc3JjLT5jbGF1c2VfcmVs aWRzLCByaW5mby0+Y2xhdXNlX3JlbGlkcykpCisJCQkJLyogQ2FuJ3QgY29tcGFyZSB0cml2 aWFsbHkgZGlmZmVyZW50IGNsYXVzZXMgKi8KKwkJCQljb250aW51ZTsKKworCQkJaWYgKHNy YyA9PSByaW5mbyB8fAorCQkJCShyaW5mby0+cGFyZW50X2VjICE9IE5VTEwKKwkJCQkgJiYg c3JjLT5wYXJlbnRfZWMgPT0gcmluZm8tPnBhcmVudF9lYykKKwkJCQl8fCBlcXVhbChyaW5m by0+Y2xhdXNlLCBzcmMtPmNsYXVzZSkpCisJCQl7CisJCQkJaXNfcmVkdW5kYW50ID0gdHJ1 ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIWlzX3JlZHVuZGFudCkKKwkJCWRp c3RyaWJ1dGVfcmVzdHJpY3RpbmZvX3RvX3JlbHMocm9vdCwgcmluZm8pOworCX0KKwlsaXN0 X2ZyZWUoYmluZm9fY2FuZGlkYXRlcyk7CisJbGlzdF9mcmVlKGppbmZvX2NhbmRpZGF0ZXMp OworCisJLyoKKwkgKiBBcnJhbmdlIGVxdWl2YWxlbmNlIGNsYXNzZXMsIG1lbnRpb25lZCBy ZW1vdmluZyB0YWJsZSwgd2l0aCB0aGUga2VlcGluZworCSAqIG9uZTogdmFybm8gb2YgcmVt b3ZpbiB0YWJsZSBzaG91bGQgYmUgcmVwbGFjZWQgaW4gbWVtYmVycyBhbmQgc291cmNlcwor CSAqIGxpc3RzLiBBbHNvLCByZW1vdmUgZHVwbGljYXRlZCBlbGVtZW50cyBpZiB0aGlzIHJl cGxhY2VtZW50IHByb2NlZHVyZQorCSAqIGNyZWF0ZWQgdGhlbS4KKwkgKi8KKwlpID0gLTE7 CisJd2hpbGUgKChpID0gYm1zX25leHRfbWVtYmVyKHRvUmVtb3ZlLT5lY2xhc3NfaW5kZXhl cywgaSkpID49IDApCisJeworCQlFcXVpdmFsZW5jZUNsYXNzICplYyA9IChFcXVpdmFsZW5j ZUNsYXNzICopIGxpc3RfbnRoKHJvb3QtPmVxX2NsYXNzZXMsIGkpOworCisJCXVwZGF0ZV9l Y2xhc3MoZWMsIHRvUmVtb3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisJCXRvS2VlcC0+ ZWNsYXNzX2luZGV4ZXMgPSBibXNfYWRkX21lbWJlcih0b0tlZXAtPmVjbGFzc19pbmRleGVz LCBpKTsKKwl9CisKKwkvKgorCSAqIFRyYW5zZmVyIHRoZSB0YXJnZXRsaXN0IGFuZCBhdHRy X25lZWRlZCBmbGFncy4KKwkgKi8KKworCWZvcmVhY2gobGMsIHRvUmVtb3ZlLT5yZWx0YXJn ZXQtPmV4cHJzKQorCXsKKwkJTm9kZSAgICpub2RlID0gbGZpcnN0KGxjKTsKKworCQlyZXBs YWNlX3Zhcm5vKG5vZGUsIHRvUmVtb3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisJCWlm ICghbGlzdF9tZW1iZXIodG9LZWVwLT5yZWx0YXJnZXQtPmV4cHJzLCBub2RlKSkKKwkJCXRv S2VlcC0+cmVsdGFyZ2V0LT5leHBycyA9IGxhcHBlbmQodG9LZWVwLT5yZWx0YXJnZXQtPmV4 cHJzLCBub2RlKTsKKwl9CisKKwlmb3IgKGkgPSB0b0tlZXAtPm1pbl9hdHRyOyBpIDw9IHRv S2VlcC0+bWF4X2F0dHI7IGkrKykKKwl7CisJCWludAkJCWF0dG5vID0gaSAtIHRvS2VlcC0+ bWluX2F0dHI7CisKKwkJdG9SZW1vdmUtPmF0dHJfbmVlZGVkW2F0dG5vXSA9IHJlcGxhY2Vf cmVsaWQoCisJCQkJCQkJCQkJCXRvUmVtb3ZlLT5hdHRyX25lZWRlZFthdHRub10sCisJCQkJ CQkJCQkJCXRvUmVtb3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisJCXRvS2VlcC0+YXR0 cl9uZWVkZWRbYXR0bm9dID0gYm1zX2FkZF9tZW1iZXJzKHRvS2VlcC0+YXR0cl9uZWVkZWRb YXR0bm9dLAorCQkJCQkJCQkJCQkJCSB0b1JlbW92ZS0+YXR0cl9uZWVkZWRbYXR0bm9dKTsK Kwl9CisKKwkvKgorCSAqIElmIHRoZSByZW1vdmVkIHJlbGF0aW9uIGhhcyBhIHJvdyBtYXJr LCB0cmFuc2ZlciBpdCB0byB0aGUgcmVtYWluaW5nCisJICogb25lLgorCSAqCisJICogSWYg Ym90aCByZWxzIGhhdmUgcm93IG1hcmtzLCBqdXN0IGtlZXAgdGhlIG9uZSBjb3JyZXNwb25k aW5nIHRvIHRoZQorCSAqIHJlbWFpbmluZyByZWxhdGlvbiwgYmVjYXVzZSB3ZSB2ZXJpZmll ZCBlYXJsaWVyIHRoYXQgdGhleSBoYXZlIHRoZSBzYW1lCisJICogc3RyZW5ndGguCisJICov CisJaWYgKHJtYXJrKQorCXsKKwkJaWYgKGttYXJrKQorCQl7CisJCQlBc3NlcnQoa21hcmst Pm1hcmtUeXBlID09IHJtYXJrLT5tYXJrVHlwZSk7CisKKwkJCXJvb3QtPnJvd01hcmtzID0g bGlzdF9kZWxldGVfcHRyKHJvb3QtPnJvd01hcmtzLCBybWFyayk7CisJCX0KKwkJZWxzZQor CQl7CisJCQkvKiBTaG91bGRuJ3QgaGF2ZSBpbmhlcml0YW5jZSBjaGlsZHJlbiBoZXJlLiAq LworCQkJQXNzZXJ0KHJtYXJrLT5ydGkgPT0gcm1hcmstPnBydGkpOworCisJCQlybWFyay0+ cnRpID0gcm1hcmstPnBydGkgPSB0b0tlZXAtPnJlbGlkOworCQl9CisJfQorCisJLyogUmVw bGFjZSB2YXJubyBpbiBhbGwgdGhlIHF1ZXJ5IHN0cnVjdHVyZXMgKi8KKwlxdWVyeV90cmVl X3dhbGtlcihyb290LT5wYXJzZSwgc2plX3dhbGtlciwgJmN0eCwgUVRXX0VYQU1JTkVfU09S VEdST1VQKTsKKworCS8qIEF0IGxhc3QsIHJlcGxhY2UgbGlua3MgaW4gdGhlIHBsYW5uZXIg aW5mbyAqLworCXJlbW92ZV9yZWxfZnJvbV9xdWVyeV9jb21tb24ocm9vdCwgdG9SZW1vdmUs IHRvS2VlcC0+cmVsaWQsIE5VTEwsIE5VTEwpOworCS8qIHJlcGxhY2UgdmFybm8gaW4gcm9v dCB0YXJnZXRsaXN0IGFuZCBIQVZJTkcgY2xhdXNlICovCisJcmVwbGFjZV92YXJubygoTm9k ZSAqKSByb290LT5wcm9jZXNzZWRfdGxpc3QsCisJCQkJICAgdG9SZW1vdmUtPnJlbGlkLCB0 b0tlZXAtPnJlbGlkKTsKKwlyZXBsYWNlX3Zhcm5vKChOb2RlICopIHJvb3QtPnByb2Nlc3Nl ZF9ncm91cENsYXVzZSwKKwkJCQkgICB0b1JlbW92ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQp OworCS8qIC4uLiBhbmQgcmVtb3ZlIHRoZSByZWwgZnJvbSB0aGUgYmFzZXJlbCBhcnJheSAq LworCXJvb3QtPnNpbXBsZV9yZWxfYXJyYXlbdG9SZW1vdmUtPnJlbGlkXSA9IE5VTEw7CisJ cGZyZWUodG9SZW1vdmUpOworfQorCisvKgorICogc3BsaXRfc2VsZmpvaW5fcXVhbHMKKyAq CQlQcm9jZXNzZXMgJ2pvaW5xdWFscycgYnVpbGRpbmcgdHdvIGxpc3RzLCBvbmUgd2l0aCBh IGxpc3Qgb2YgcXVhbHMKKyAqCQl3aGVyZSB0aGUgY29sdW1ucy9leHBycyBvbiBlaXRoZXIg c2lkZSBvZiB0aGUgam9pbiBtYXRjaCBhbmQgYW5vdGhlcgorICoJCWxpc3QgY29udGFpbmlu ZyB0aGUgcmVtYWluaW5nIHF1YWxzLgorICoKKyAqICdqb2lucXVhbHMnIG11c3Qgb25seSBj b250YWluIHF1YWxzIGZvciBhIFJURV9SRUxBVElPTiBiZWluZyBqb2luZWQgdG8KKyAqIGl0 c2VsZi4KKyAqLworc3RhdGljIHZvaWQKK3NwbGl0X3NlbGZqb2luX3F1YWxzKFBsYW5uZXJJ bmZvICpyb290LCBMaXN0ICpqb2lucXVhbHMsIExpc3QgKipzZWxmam9pbnF1YWxzLAorCQkJ CQkgTGlzdCAqKm90aGVyam9pbnF1YWxzLCBpbnQgZnJvbSwgaW50IHRvKQoreworCUxpc3RD ZWxsICAgKmxjOworCUxpc3QJICAgKnNqb2lucXVhbHMgPSBOSUw7CisJTGlzdAkgICAqb2pv aW5xdWFscyA9IE5JTDsKKworCWZvcmVhY2gobGMsIGpvaW5xdWFscykKKwl7CisJCVJlc3Ry aWN0SW5mbyAgICpyaW5mbyA9IGxmaXJzdF9ub2RlKFJlc3RyaWN0SW5mbywgbGMpOworCQlP cEV4cHIJCSAgICpleHByOworCQlOb2RlCQkgICAqbGVmdGV4cHI7CisJCU5vZGUJCSAgICpy aWdodGV4cHI7CisKKwkJLyogSW4gZ2VuZXJhbCwgY2xhdXNlIGxvb2tzIGxpa2UgRihhcmcx KSA9IEcoYXJnMikgKi8KKwkJaWYgKCFyaW5mby0+bWVyZ2VvcGZhbWlsaWVzIHx8CisJCQli bXNfbnVtX21lbWJlcnMocmluZm8tPmNsYXVzZV9yZWxpZHMpICE9IDIgfHwKKwkJCWJtc19u dW1fbWVtYmVycyhyaW5mby0+bGVmdF9yZWxpZHMpICE9IDEgfHwKKwkJCWJtc19udW1fbWVt YmVycyhyaW5mby0+cmlnaHRfcmVsaWRzKSAhPSAxKQorCQl7CisJCQlvam9pbnF1YWxzID0g bGFwcGVuZChvam9pbnF1YWxzLCByaW5mbyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWV4 cHIgPSAoT3BFeHByICopIHJpbmZvLT5jbGF1c2U7CisKKwkJaWYgKCFJc0EoZXhwciwgT3BF eHByKSB8fCBsaXN0X2xlbmd0aChleHByLT5hcmdzKSAhPSAyKQorCQl7CisJCQlvam9pbnF1 YWxzID0gbGFwcGVuZChvam9pbnF1YWxzLCByaW5mbyk7CisJCQljb250aW51ZTsKKwkJfQor CisJCWxlZnRleHByID0gZ2V0X2xlZnRvcChyaW5mby0+Y2xhdXNlKTsKKwkJcmlnaHRleHBy ID0gY29weU9iamVjdChnZXRfcmlnaHRvcChyaW5mby0+Y2xhdXNlKSk7CisKKwkJaWYgKGxl ZnRleHByICYmIElzQShsZWZ0ZXhwciwgUmVsYWJlbFR5cGUpKQorCQkJbGVmdGV4cHIgPSAo Tm9kZSAqKSAoKFJlbGFiZWxUeXBlICopIGxlZnRleHByKS0+YXJnOworCQlpZiAocmlnaHRl eHByICYmIElzQShyaWdodGV4cHIsIFJlbGFiZWxUeXBlKSkKKwkJCXJpZ2h0ZXhwciA9IChO b2RlICopICgoUmVsYWJlbFR5cGUgKikgcmlnaHRleHByKS0+YXJnOworCisJCS8qCisJCSAq IFF1aXRlIGV4cGVuc2l2ZSBvcGVyYXRpb24sIG5hcnJvd2luZyB0aGUgdXNlIGNhc2UuIEZv ciBleGFtcGxlLCB3aGVuCisJCSAqIHdlIGhhdmUgY2FzdCBvZiB0aGUgc2FtZSB2YXIgdG8g ZGlmZmVyZW50IChidXQgY29tcGF0aWJsZSkgdHlwZXMuCisJCSAqLworCQlyZXBsYWNlX3Zh cm5vKHJpZ2h0ZXhwciwgYm1zX3NpbmdsZXRvbl9tZW1iZXIocmluZm8tPnJpZ2h0X3JlbGlk cyksCisJCQkJCSAgYm1zX3NpbmdsZXRvbl9tZW1iZXIocmluZm8tPmxlZnRfcmVsaWRzKSk7 CisKKwkJaWYgKGVxdWFsKGxlZnRleHByLCByaWdodGV4cHIpKQorCQkJc2pvaW5xdWFscyA9 IGxhcHBlbmQoc2pvaW5xdWFscywgcmluZm8pOworCQllbHNlCisJCQlvam9pbnF1YWxzID0g bGFwcGVuZChvam9pbnF1YWxzLCByaW5mbyk7CisJfQorCisJKnNlbGZqb2lucXVhbHMgPSBz am9pbnF1YWxzOworCSpvdGhlcmpvaW5xdWFscyA9IG9qb2lucXVhbHM7Cit9CisKKy8qCisg KiBDaGVjayBmb3IgYSBjYXNlIHdoZW4gdW5pcXVlbmVzcyBbcGFydGx5XSBkZXJpdmVkIGZy b20gYSBiYXNlcmVzdHJpY3RpbmZvCisgKiBjbGF1c2UuIEluIHRoaXMgY2FzZSB3ZSBoYXZl IGEgY2hhbmNlIHRvIHJldHVybiBvbmx5IG9uZSByb3cgKGlmIHN1Y2gKKyAqIGNsYXVzZXMg b24gYm90aCBzaWRlcyBvZiBTSiBpcyBlcXVhbCkgb3Igbm90aGluZyAtIGlmIHRoZXkgYXJl IGRpZmZlcmVudC4KKyAqLworc3RhdGljIGJvb2wKK21hdGNoX3VuaXF1ZV9jbGF1c2VzKFBs YW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpvdXRlciwgTGlzdCAqdWNsYXVzZXMsIElu ZGV4IHJlbGlkKQoreworCUxpc3RDZWxsICAgKmxjOworCisJZm9yZWFjaChsYywgdWNsYXVz ZXMpCisJeworCQlSZXN0cmljdEluZm8gICAqcmluZm8gPSBsZmlyc3Rfbm9kZShSZXN0cmlj dEluZm8sIGxjKTsKKwkJRXhwcgkJICAgKmNsYXVzZTsKKwkJTm9kZQkJICAgKmljbGF1c2U7 CisJCU5vZGUJCSAgICpjMTsKKwkJYm9vbAkJCW1hdGNoZWQgPSBmYWxzZTsKKwkJTGlzdENl bGwJICAgKm9sYzsKKworCQlBc3NlcnQob3V0ZXItPnJlbGlkID4gMCAmJiByZWxpZCA+IDAp OworCisJCS8qIE9ubHkgZmlsdGVycyBsaWtlIGYoUi54MSwuLi4sUi54TikgPT0gZXhwciB3 ZSBzaG91bGQgY29uc2lkZXIuICovCisJCUFzc2VydChibXNfaXNfZW1wdHkocmluZm8tPmxl ZnRfcmVsaWRzKSB8fAorCQkJICAgYm1zX2lzX2VtcHR5KHJpbmZvLT5yaWdodF9yZWxpZHMp KTsKKworCQljbGF1c2UgPSAoRXhwciAqKSBjb3B5T2JqZWN0KHJpbmZvLT5jbGF1c2UpOwor CQlyZXBsYWNlX3Zhcm5vKChOb2RlICopIGNsYXVzZSwgcmVsaWQsIG91dGVyLT5yZWxpZCk7 CisKKwkJYzEgPSAocmluZm8tPm91dGVyX2lzX2xlZnQgPyBnZXRfbGVmdG9wKGNsYXVzZSkg OiBnZXRfcmlnaHRvcChjbGF1c2UpKTsKKwkJaWNsYXVzZSA9IChyaW5mby0+b3V0ZXJfaXNf bGVmdCA/CisJCQkJCQkJCQlnZXRfcmlnaHRvcChjbGF1c2UpIDogZ2V0X2xlZnRvcChjbGF1 c2UpKTsKKworCQkvKgorCQkgKiBDb21wYXJlIHRoZXNlIGxlZnQgYW5kIHJpZ2h0IHNpZGVz IHdpdGggY29ycmVzcG9uZGluZyBzaWRlcyBvZiB0aGUKKwkJICogb3V0ZXIncyBmaWx0ZXJz LiBJZiBubyBvbmUgZGV0ZWN0ZWQgLSByZXR1cm4gaW1tZWRpYXRlbHkuCisJCSAqLworCQlm b3JlYWNoKG9sYywgb3V0ZXItPmJhc2VyZXN0cmljdGluZm8pCisJCXsKKwkJCVJlc3RyaWN0 SW5mbyAqb3JpbmZvID0gbGZpcnN0X25vZGUoUmVzdHJpY3RJbmZvLCBvbGMpOworCQkJTm9k ZQkJICpvY2xhdXNlOworCQkJTm9kZQkJICpjMjsKKworCQkJaWYgKG9yaW5mby0+bWVyZ2Vv cGZhbWlsaWVzID09IE5JTCkKKwkJCQkvKiBEb24ndCBjb25zaWRlciBjbGF1c2VzIHdoaWNo IGFyZW4ndCBzaW1pbGFyIHRvICdGKFgpPUcoWSknICovCisJCQkJY29udGludWU7CisKKwkJ CW9jbGF1c2UgPSAoYm1zX2lzX2VtcHR5KG9yaW5mby0+bGVmdF9yZWxpZHMpID8KKwkJCQkJ Z2V0X3JpZ2h0b3Aob3JpbmZvLT5jbGF1c2UpIDogZ2V0X2xlZnRvcChvcmluZm8tPmNsYXVz ZSkpOworCQkJYzIgPSAoYm1zX2lzX2VtcHR5KG9yaW5mby0+bGVmdF9yZWxpZHMpID8KKwkJ CQkgICBnZXRfbGVmdG9wKG9yaW5mby0+Y2xhdXNlKSA6IGdldF9yaWdodG9wKG9yaW5mby0+ Y2xhdXNlKSk7CisKKwkJCWlmIChlcXVhbChpY2xhdXNlLCBvY2xhdXNlKSAmJiBlcXVhbChj MSwgYzIpKQorCQkJeworCQkJCW1hdGNoZWQgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQor CQl9CisKKwkJaWYgKCFtYXRjaGVkKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVy biB0cnVlOworfQorCisvKgorICogRmluZCBhbmQgcmVtb3ZlIHVuaXF1ZSBzZWxmIGpvaW5z IGluIGEgZ3JvdXAgb2YgYmFzZSByZWxhdGlvbnMgdGhhdCBoYXZlCisgKiB0aGUgc2FtZSBP aWQuCisgKgorICogUmV0dXJucyBhIHNldCBvZiByZWxpZHMgdGhhdCB3ZXJlIHJlbW92ZWQu CisgKi8KK3N0YXRpYyBSZWxpZHMKK3JlbW92ZV9zZWxmX2pvaW5zX29uZV9ncm91cChQbGFu bmVySW5mbyAqcm9vdCwgUmVsaWRzIHJlbGlkcykKK3sKKwlSZWxpZHMJCXJlc3VsdCA9IE5V TEw7CisJaW50CQkJazsJCQkJLyogSW5kZXggb2Yga2VwdCByZWxhdGlvbiAqLworCWludAkJ CXIgPSAtMTsJCQkvKiBJbmRleCBvZiByZW1vdmVkIHJlbGF0aW9uICovCisKKwl3aGlsZSAo KHIgPSBibXNfbmV4dF9tZW1iZXIocmVsaWRzLCByKSkgPiAwKQorCXsKKwkJUmVsT3B0SW5m byAqaW5uZXIgPSByb290LT5zaW1wbGVfcmVsX2FycmF5W3JdOworCisJCWsgPSByOworCisJ CXdoaWxlICgoayA9IGJtc19uZXh0X21lbWJlcihyZWxpZHMsIGspKSA+IDApCisJCXsKKwkJ CVJlbGlkcwkJCWpvaW5yZWxpZHMgPSBOVUxMOworCQkJUmVsT3B0SW5mbwkgICAqb3V0ZXIg PSByb290LT5zaW1wbGVfcmVsX2FycmF5W2tdOworCQkJTGlzdAkJICAgKnJlc3RyaWN0bGlz dDsKKwkJCUxpc3QJCSAgICpzZWxmam9pbnF1YWxzOworCQkJTGlzdAkJICAgKm90aGVyam9p bnF1YWxzOworCQkJTGlzdENlbGwJICAgKmxjOworCQkJYm9vbAkJCWppbmZvX2NoZWNrID0g dHJ1ZTsKKwkJCVBsYW5Sb3dNYXJrCSAgICpvbWFyayA9IE5VTEw7CisJCQlQbGFuUm93TWFy awkgICAqaW1hcmsgPSBOVUxMOworCQkJTGlzdAkJICAgKnVjbGF1c2VzID0gTklMOworCisJ CQkvKiBBIHNhbml0eSBjaGVjazogdGhlIHJlbGF0aW9ucyBoYXZlIHRoZSBzYW1lIE9pZC4g Ki8KKwkJCUFzc2VydChyb290LT5zaW1wbGVfcnRlX2FycmF5W2tdLT5yZWxpZCA9PQorCQkJ CSAgIHJvb3QtPnNpbXBsZV9ydGVfYXJyYXlbcl0tPnJlbGlkKTsKKworCQkJLyoKKwkJCSAq IEl0IGlzIGltcG9zc2libGUgdG8gZWxpbWluYXRlIGpvaW4gb2YgdHdvIHJlbGF0aW9ucyBp ZiB0aGV5CisJCQkgKiBiZWxvbmcgdG8gZGlmZmVyZW50IHJ1bGVzIG9mIG9yZGVyLiBPdGhl cndpc2UgcGxhbm5lciBjYW4ndAorCQkJICogYmUgYWJsZSB0byBmaW5kIGFueSB2YXJpYW50 cyBvZiBjb3JyZWN0IHF1ZXJ5IHBsYW4uCisJCQkgKi8KKwkJCWZvcmVhY2gobGMsIHJvb3Qt PmpvaW5faW5mb19saXN0KQorCQkJeworCQkJCVNwZWNpYWxKb2luSW5mbyAqaW5mbyA9IChT cGVjaWFsSm9pbkluZm8gKikgbGZpcnN0KGxjKTsKKworCQkJCWlmICgoYm1zX2lzX21lbWJl cihrLCBpbmZvLT5zeW5fbGVmdGhhbmQpIF4KKwkJCQkJIGJtc19pc19tZW1iZXIociwgaW5m by0+c3luX2xlZnRoYW5kKSkgfHwKKwkJCQkJKGJtc19pc19tZW1iZXIoaywgaW5mby0+c3lu X3JpZ2h0aGFuZCkgXgorCQkJCQkgYm1zX2lzX21lbWJlcihyLCBpbmZvLT5zeW5fcmlnaHRo YW5kKSkpCisJCQkJeworCQkJCQlqaW5mb19jaGVjayA9IGZhbHNlOworCQkJCQlicmVhazsK KwkJCQl9CisJCQl9CisJCQlpZiAoIWppbmZvX2NoZWNrKQorCQkJCWNvbnRpbnVlOworCisJ CQkvKgorCQkJICogQ2hlY2sgUm93IE1hcmtzIGVxdWl2YWxlbmNlLgorCQkJICogV2UgY2Fu J3QgcmVtb3ZlIHRoZSBqb2luIGlmIHRoZSByZWxhdGlvbnMgaGF2ZSByb3cgbWFya3Mgb2YK KwkJCSAqIGRpZmZlcmVudCBzdHJlbmd0aCAoZS5nLiBvbmUgaXMgbG9ja2VkIEZPUiBVUERB VEUgYW5kIGFub3RoZXIKKwkJCSAqIGp1c3QgaGFzIFJPV19NQVJLX1JFRkVSRU5DRSBmb3Ig RXZhbFBsYW5RdWFsIHJlY2hlY2tpbmcpLgorCQkJICovCisJCQlmb3JlYWNoKGxjLCByb290 LT5yb3dNYXJrcykKKwkJCXsKKwkJCQlQbGFuUm93TWFyayAqcm93TWFyayA9IChQbGFuUm93 TWFyayAqKSBsZmlyc3QobGMpOworCisJCQkJaWYgKHJvd01hcmstPnJ0aSA9PSBrKQorCQkJ CXsKKwkJCQkJQXNzZXJ0KGltYXJrID09IE5VTEwpOworCQkJCQlpbWFyayA9IHJvd01hcms7 CisJCQkJfQorCQkJCWVsc2UgaWYgKHJvd01hcmstPnJ0aSA9PSByKQorCQkJCXsKKwkJCQkJ QXNzZXJ0KG9tYXJrID09IE5VTEwpOworCQkJCQlvbWFyayA9IHJvd01hcms7CisJCQkJfQor CisJCQkJaWYgKG9tYXJrICYmIGltYXJrKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChv bWFyayAmJiBpbWFyayAmJiBvbWFyay0+bWFya1R5cGUgIT0gaW1hcmstPm1hcmtUeXBlKQor CQkJCWNvbnRpbnVlOworCisJCQkvKgorCQkJICogV2Ugb25seSBkZWFsIHdpdGggYmFzZSBy ZWxzIGhlcmUsIHNvIHRoZWlyIHJlbGlkcyBiaXRzZXQKKwkJCSAqIGNvbnRhaW5zIG9ubHkg b25lIG1lbWJlciAtLSB0aGVpciByZWxpZC4KKwkJCSAqLworCQkJam9pbnJlbGlkcyA9IGJt c19hZGRfbWVtYmVyKGpvaW5yZWxpZHMsIHIpOworCQkJam9pbnJlbGlkcyA9IGJtc19hZGRf bWVtYmVyKGpvaW5yZWxpZHMsIGspOworCisJCQkvKgorCQkJICogQmUgc2FmZSB0byBkbyBu b3QgcmVtb3ZlIHRhYmxlIHBhcnRpY2lwYXRlZCBpbiBjb21wbGljYXRlZCBQSAorCQkJICov CisJCQlmb3JlYWNoKGxjLCByb290LT5wbGFjZWhvbGRlcl9saXN0KQorCQkJeworCQkJCVBs YWNlSG9sZGVySW5mbyAqcGhpbmZvID0gKFBsYWNlSG9sZGVySW5mbyAqKSBsZmlyc3QobGMp OworCisJCQkJLyogdGhlcmUgaXNuJ3QgYW55IG90aGVyIHBsYWNlIHRvIGV2YWwgUEhWICov CisJCQkJaWYgKGJtc19pc19zdWJzZXQocGhpbmZvLT5waF9ldmFsX2F0LCBqb2lucmVsaWRz KSB8fAorCQkJCQlibXNfaXNfc3Vic2V0KHBoaW5mby0+cGhfbmVlZGVkLCBqb2lucmVsaWRz KSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAobGMpCisJCQkJY29udGludWU7CisKKwkJ CS8qCisJCQkgKiBBdCB0aGlzIHN0YWdlIGpvaW5pbmZvIGxpc3RzIG9mIGlubmVyIGFuZCBv dXRlciBjYW4gY29udGFpbgorCQkJICogb25seSBjbGF1c2VzLCByZXF1aXJlZCBmb3IgYSBz dXBlcmlvciBvdXRlciBqb2luIHRoYXQgY2FuJ3QKKwkJCSAqIGluZmx1ZW5jZSBvbiB0aGlz IG9wdGltaXphdGlvbi4gU28sIHdlIGNhbiBhdm9pZCB0byBjYWxsIHRoZQorCQkJICogYnVp bGRfam9pbnJlbF9yZXN0cmljdGxpc3QoKSByb3V0aW5lLgorCQkJICovCisJCQlyZXN0cmlj dGxpc3QgPSBnZW5lcmF0ZV9qb2luX2ltcGxpZWRfZXF1YWxpdGllcyhyb290LCBqb2lucmVs aWRzLAorCQkJCQkJCQkJCQkJCQkJaW5uZXItPnJlbGlkcywKKwkJCQkJCQkJCQkJCQkJCW91 dGVyLCAwKTsKKworCQkJLyoKKwkJCSAqIFByb2Nlc3MgcmVzdHJpY3RsaXN0IHRvIHNlcGVy YXRlIHRoZSBzZWxmIGpvaW4gcXVhbHMgb3V0IG9mCisJCQkgKiB0aGUgb3RoZXIgcXVhbHMu IGUuZyB4ID0geCBnb2VzIHRvIHNlbGZqb2lucXVhbHMgYW5kIGEgPSBiIHRvCisJCQkgKiBv dGhlcmpvaW5xdWFscy4KKwkJCSAqLworCQkJc3BsaXRfc2VsZmpvaW5fcXVhbHMocm9vdCwg cmVzdHJpY3RsaXN0LCAmc2VsZmpvaW5xdWFscywKKwkJCQkJCQkJICZvdGhlcmpvaW5xdWFs cywgaW5uZXItPnJlbGlkLCBvdXRlci0+cmVsaWQpOworCisJCQkvKgorCQkJICogRGV0ZXJt aW5lIGlmIHRoZSBpbm5lciB0YWJsZSBjYW4gZHVwbGljYXRlIG91dGVyIHJvd3MuICBXZSBt dXN0CisJCQkgKiBieXBhc3MgdGhlIHVuaXF1ZSByZWwgY2FjaGUgaGVyZSBzaW5jZSB3ZSdy ZSBwb3NzaWJseSB1c2luZyBhCisJCQkgKiBzdWJzZXQgb2Ygam9pbiBxdWFscy4gV2UgY2Fu IHVzZSAnZm9yY2VfY2FjaGUnID0gdHJ1ZSB3aGVuIGFsbAorCQkJICogam9pbiBxdWFscyBh cmUgc2VsZmpvaW4gcXVhbHMuICBPdGhlcndpc2Ugd2UgY291bGQgZW5kIHVwCisJCQkgKiBw dXR0aW5nIGZhbHNlIG5lZ2F0aXZlcyBpbiB0aGUgY2FjaGUuCisJCQkgKi8KKwkJCWlmICgh aW5uZXJyZWxfaXNfdW5pcXVlX2V4dChyb290LCBqb2lucmVsaWRzLCBpbm5lci0+cmVsaWRz LAorCQkJCQkJCQkJCW91dGVyLCBKT0lOX0lOTkVSLCBzZWxmam9pbnF1YWxzLAorCQkJCQkJ CQkJCWxpc3RfbGVuZ3RoKG90aGVyam9pbnF1YWxzKSA9PSAwLAorCQkJCQkJCQkJCSZ1Y2xh dXNlcykpCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBXZSBoYXZlIHByb3ZlbiB0 aGF0IGZvciBib3RoIHJlbGF0aW9ucywgdGhlIHNhbWUgdW5pcXVlIGluZGV4CisJCQkgKiBn dWFyYW50ZWVzIHRoYXQgdGhlcmUgaXMgYXQgbW9zdCBvbmUgcm93IHdoZXJlIGNvbHVtbnMg ZXF1YWwKKwkJCSAqIGdpdmVuIHZhbHVlcy4gVGhlc2UgdmFsdWVzIG11c3QgYmUgdGhlIHNh bWUgZm9yIGJvdGggcmVsYXRpb25zLAorCQkJICogb3IgZWxzZSB3ZSB3b24ndCBtYXRjaCB0 aGUgc2FtZSByb3cgb24gZWFjaCBzaWRlIG9mIHRoZSBqb2luLgorCQkJICovCisJCQlpZiAo IW1hdGNoX3VuaXF1ZV9jbGF1c2VzKHJvb3QsIGlubmVyLCB1Y2xhdXNlcywgb3V0ZXItPnJl bGlkKSkKKwkJCQljb250aW51ZTsKKworCQkJLyoKKwkJCSAqIFdlIGNhbiByZW1vdmUgZWl0 aGVyIHJlbGF0aW9uLCBzbyByZW1vdmUgdGhlIGlubmVyLCB0bworCQkJICogc2ltcGxpZnkg dGhpcyBsb29wLgorCQkJICovCisJCQlyZW1vdmVfc2VsZl9qb2luX3JlbChyb290LCBvbWFy aywgaW1hcmssIG91dGVyLCBpbm5lciwgcmVzdHJpY3RsaXN0KTsKKworCQkJcmVzdWx0ID0g Ym1zX2FkZF9tZW1iZXIocmVzdWx0LCByKTsKKworCQkJLyogV2UgcmVtb3ZlZCB0aGUgb3V0 ZXIgcmVsYXRpb24sIHRyeSB0aGUgbmV4dCBvbmUuICovCisJCQlicmVhazsKKwkJfQorCX0K KworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBHYXRoZXIgaW5kZXhlcyBvZiBiYXNl IHJlbGF0aW9ucyBmcm9tIHRoZSBqb2lubGlzdCBhbmQgdHJ5IHRvIGVsaW1pbmF0ZSBzZWxm CisgKiBqb2lucy4gVG8gYXZvaWQgY29tcGxleGl0eSwgbGltaXQgdGhlIG1heCBwb3dlciBv ZiB0aGlzIHNldCBieSBhIEdVQy4KKyAqLworc3RhdGljIFJlbGlkcworcmVtb3ZlX3NlbGZf am9pbnNfcmVjdXJzZShQbGFubmVySW5mbyAqcm9vdCwgTGlzdCAqam9pbmxpc3QsIFJlbGlk cyBUb1JlbW92ZSkKK3sKKwlMaXN0Q2VsbCAgICpqbDsKKwlSZWxpZHMJCXJlbGlkcyA9IE5V TEw7CisKKwkvKiBDb2xsZWN0IGluZGV4ZXMgb2YgYmFzZSByZWxhdGlvbnMgb2YgdGhlIGpv aW4gdHJlZSAqLworCWZvcmVhY2goamwsIGpvaW5saXN0KQorCXsKKwkJTm9kZSAgICpqbG5v ZGUgPSAoTm9kZSAqKSBsZmlyc3QoamwpOworCisJCWlmIChJc0Eoamxub2RlLCBSYW5nZVRi bFJlZikpCisJCXsKKwkJCVJhbmdlVGJsUmVmCSAgICpyZWYgPSAoUmFuZ2VUYmxSZWYgKikg amxub2RlOworCQkJUmFuZ2VUYmxFbnRyeSAgKnJ0ZSA9IHJvb3QtPnNpbXBsZV9ydGVfYXJy YXlbcmVmLT5ydGluZGV4XTsKKworCQkJLyoKKwkJCSAqIFdlIG9ubHkgY2FyZSBhYm91dCBi YXNlIHJlbGF0aW9ucyBmcm9tIHdoaWNoIHdlIHNlbGVjdAorCQkJICogc29tZXRoaW5nLgor CQkJICovCisJCQlpZiAocnRlLT5ydGVraW5kID09IFJURV9SRUxBVElPTiAmJgorCQkJCXJ0 ZS0+cmVsa2luZCA9PSBSRUxLSU5EX1JFTEFUSU9OICYmCisJCQkJcm9vdC0+c2ltcGxlX3Jl bF9hcnJheVtyZWYtPnJ0aW5kZXhdICE9IE5VTEwpCisJCQl7CisJCQkJQXNzZXJ0KCFibXNf aXNfbWVtYmVyKHJlZi0+cnRpbmRleCwgcmVsaWRzKSk7CisJCQkJcmVsaWRzID0gYm1zX2Fk ZF9tZW1iZXIocmVsaWRzLCByZWYtPnJ0aW5kZXgpOworCQkJfQorCQl9CisJCWVsc2UgaWYg KElzQShqbG5vZGUsIExpc3QpKQorCQkJLyogUmVjdXJzaXZlbHkgZ28gaW5zaWRlIHRoZSBz dWItam9pbmxpc3QgKi8KKwkJCVRvUmVtb3ZlID0gcmVtb3ZlX3NlbGZfam9pbnNfcmVjdXJz ZShyb290LCAoTGlzdCAqKSBqbG5vZGUsCisJCQkJCQkJCQkJCQkgVG9SZW1vdmUpOworCQll bHNlCisJCQllbG9nKEVSUk9SLCAidW5yZWNvZ25pemVkIGpvaW5saXN0IG5vZGUgdHlwZTog JWQiLAorCQkJCSAoaW50KSBub2RlVGFnKGpsbm9kZSkpOworCisJCS8qCisJCSAqIExpbWl0 IHRoZSBudW1iZXIgb2Ygam9pbnMgd2UgcHJvY2VzcyB0byBjb250cm9sIHRoZQorCQkgKiBx dWFkcmF0aWMgYmVoYXZpb3IuCisJCSAqLworCQlpZiAoYm1zX251bV9tZW1iZXJzKHJlbGlk cykgPj0gc2VsZl9qb2luX3NlYXJjaF9saW1pdCkKKwkJCWJyZWFrOworCX0KKworCS8qCisJ ICogSXRlcmF0aXZlbHkgZm9ybSBhIGdyb3VwIG9mIHJlbGF0aW9uIGluZGV4ZXMgd2l0aCB0 aGUgc2FtZSBvaWQgYW5kIGxhdW5jaAorCSAqIHRoZSByb3V0aW5lIHRoYXQgZGV0ZWN0cyBz ZWxmLWpvaW5zIGluIHRoaXMgZ3JvdXAgYW5kIHJlbW92ZXMgZXhjZXNzaXZlCisJICogcmFu Z2UgdGFibGUgZW50cmllcy4KKwkgKgorCSAqIEF0IHRoZSBlbmQgb2YgaXRlcmF0aW9uLCBl eGNsdWRlIHRoZSBncm91cCBmcm9tIHRoZSBvdmVyYWxsIHJlbGlkcyBsaXN0LgorCSAqIFNv IGVhY2ggbmV4dCBpdGVyYXRpb24gb2YgdGhlIGN5Y2xlIHdpbGwgaW52b2x2ZSBsZXNzIGFu ZCBsZXNzIHZhbHVlIG9mCisJICogcmVsaWRzLgorCSAqLworCWlmIChibXNfbnVtX21lbWJl cnMocmVsaWRzKSA+PSAyKQorCXsKKwkJaW50CQlpID0gLTE7CisKKwkJd2hpbGUgKChpID0g Ym1zX25leHRfbWVtYmVyKHJlbGlkcywgaSkpID49IDApCisJCXsKKwkJCVJlbGlkcwlncm91 cCA9IE5VTEw7CisJCQlPaWQJCWdyb3VwT2lkOworCQkJaW50CQlqID0gaTsKKworCQkJZ3Jv dXBPaWQgPSByb290LT5zaW1wbGVfcnRlX2FycmF5W2ldLT5yZWxpZDsKKwkJCUFzc2VydChP aWRJc1ZhbGlkKGdyb3VwT2lkKSk7CisJCQlncm91cCA9IGJtc19hZGRfbWVtYmVyKGdyb3Vw LCBpKTsKKworCQkJLyogQ3JlYXRlIGdyb3VwIG9mIHJlbGF0aW9uIGluZGV4ZXMgd2l0aCB0 aGUgc2FtZSBvaWQuICovCisJCQl3aGlsZSAoKGogPSBibXNfbmV4dF9tZW1iZXIocmVsaWRz LCBqKSkgPj0gMCkKKwkJCXsKKwkJCQlSYW5nZVRibEVudHJ5ICpydGUgPSByb290LT5zaW1w bGVfcnRlX2FycmF5W2pdOworCisJCQkJQXNzZXJ0KE9pZElzVmFsaWQocnRlLT5yZWxpZCkp OworCisJCQkJaWYgKHJ0ZS0+cmVsaWQgPT0gZ3JvdXBPaWQpCisJCQkJCWdyb3VwID0gYm1z X2FkZF9tZW1iZXIoZ3JvdXAsIGopOworCQkJfQorCisJCQlyZWxpZHMgPSBibXNfZGVsX21l bWJlcnMocmVsaWRzLCBncm91cCk7CisJCQlUb1JlbW92ZSA9IGJtc19hZGRfbWVtYmVycyhU b1JlbW92ZSwKKwkJCQkJCQkJCSAgIHJlbW92ZV9zZWxmX2pvaW5zX29uZV9ncm91cChyb290 LCBncm91cCkpOworCisJCQlibXNfZnJlZShncm91cCk7CisJCX0KKworCQlBc3NlcnQoYm1z X2lzX2VtcHR5KHJlbGlkcykpOworCX0KKworCXJldHVybiBUb1JlbW92ZTsKK30KKworLyoK KyAqIEZpbmQgYW5kIHJlbW92ZSB1c2VsZXNzIHNlbGYgam9pbnMuCisgKgorICogU2VhcmNo IGZvciBqb2lucyB3aGVyZSBhIHJlbGF0aW9uIGlzIGpvaW5lZCB0byBpdHNlbGYuIElmIHRo ZSBqb2luIGNsYXVzZSBmb3IKKyAqIGVhY2ggdHVwbGUgZnJvbSBvbmUgc2lkZSBvZiB0aGUg am9pbiBpcyBwcm92ZW4gdG8gbWF0Y2ggdGhlIHNhbWUgcGh5c2ljYWwgcm93CisgKiAob3Ig bm90aGluZykgb24gdGhlIG90aGVyIHNpZGUsIHRoYXQgc2VsZi1qb2luIGNhbiBiZSBlbGlt aW5hdGVkIGZyb20gdGhlCisgKiBxdWVyeS4KKyAqIFN1aXRhYmxlIGpvaW4gY2xhdXNlcyBh c3N1bWUgdGhlIGZvcm0gb2YgWCA9IFggYW5kIGNhbiBiZSByZXBsYWNlZCB3aXRoCisgKiBO T1QgTlVMTCBjbGF1c2VzLgorICoKKyAqIEZvciB0aGUgc2FrZSBvZiBzaW1wbGljaXR5LCB3 ZSBkb24ndCBhcHBseSB0aGlzIG9wdGltaXphdGlvbiB0byBzcGVjaWFsCisgKiBqb2lucy4g SGVyZSBpcyBhIGxpc3Qgb2Ygd2hhdCB3ZSBjb3VsZCBkbyBpbiBzb21lIHBhcnRpY3VsYXIg Y2FzZXM6CisgKiAnYSBhMSBzZW1pIGpvaW4gYSBhMic6IGlzIHJlZHVjZWQgdG8gaW5uZXIg YnkgcmVkdWNlX3VuaXF1ZV9zZW1pam9pbnMsCisgKiBhbmQgdGhlbiByZW1vdmVkIG5vcm1h bGx5LgorICogJ2EgYTEgYW50aSBqb2luIGEgYTInOiBjb3VsZCBzaW1wbGlmeSB0byBhIHNj YW4gd2l0aCAnb3V0ZXIgcXVhbHMgQU5ECisgKiAoSVMgTlVMTCBvbiBqb2luIGNvbHVtbnMg T1IgTk9UIGlubmVyIHF1YWxzKScuCisgKiAnYSBhMSBsZWZ0IGpvaW4gYSBhMic6IGNvdWxk IHNpbXBsaWZ5IHRvIGEgc2NhbiBsaWtlIGlubmVyLCBidXQgd2l0aG91dAorICogTk9UIE5V TEwgY29uZGl0aW9ucyBvbiBqb2luIGNvbHVtbnMuCisgKiAnYSBhMSBsZWZ0IGpvaW4gKGEg YTIgam9pbiBiKSc6IGNhbid0IHNpbXBsaWZ5IHRoaXMsIGJlY2F1c2Ugam9pbiB0byBiCisg KiBjYW4gYm90aCByZW1vdmUgcm93cyBhbmQgaW50cm9kdWNlIGR1cGxpY2F0ZXMuCisgKgor ICogVG8gc2VhcmNoIGZvciByZW1vdmFibGUgam9pbnMsIHdlIG9yZGVyIGFsbCB0aGUgcmVs YXRpb25zIG9uIHRoZWlyIE9pZCwKKyAqIGdvIG92ZXIgZWFjaCBzZXQgd2l0aCB0aGUgc2Ft ZSBPaWQsIGFuZCBjb25zaWRlciBlYWNoIHBhaXIgb2YgcmVsYXRpb25zCisgKiBpbiB0aGlz IHNldC4KKyAqCisgKiBUbyByZW1vdmUgdGhlIGpvaW4sIHdlIG1hcmsgb25lIG9mIHRoZSBw YXJ0aWNpcGF0aW5nIHJlbGF0aW9ucyBhcworICogZGVhZCwgYW5kIHJld3JpdGUgYWxsIHJl ZmVyZW5jZXMgdG8gaXQgdG8gcG9pbnQgdG8gdGhlIHJlbWFpbmluZworICogcmVsYXRpb24u IFRoaXMgaW5jbHVkZXMgbW9kaWZ5aW5nIFJlc3RyaWN0SW5mb3MsIEVxdWl2YWxlbmNlQ2xh c3NlcyBhbmQKKyAqIEVxdWl2YWxlbmNlTWVtYmVycy4gV2UgYWxzbyBoYXZlIHRvIG1vZGlm eSB0aGUgcm93IG1hcmtzLiBUaGUgam9pbiBjbGF1c2VzCisgKiBvZiB0aGUgcmVtb3ZlZCBy ZWxhdGlvbiBiZWNvbWUgZWl0aGVyIHJlc3RyaWN0aW9uIG9yIGpvaW4gY2xhdXNlcywgYmFz ZWQgb24KKyAqIHdoZXRoZXIgdGhleSByZWZlcmVuY2UgYW55IHJlbGF0aW9ucyBub3QgcGFy dGljaXBhdGluZyBpbiB0aGUgcmVtb3ZlZCBqb2luLgorICoKKyAqICd0YXJnZXRsaXN0JyBp cyB0aGUgdG9wLWxldmVsIHRhcmdldGxpc3Qgb2YgcXVlcnkuIElmIGl0IGhhcyBhbnkgcmVm ZXJlbmNlcworICogdG8gdGhlIHJlbW92ZWQgcmVsYXRpb25zLCB3ZSB1cGRhdGUgdGhlbSB0 byBwb2ludCB0byB0aGUgcmVtYWluaW5nIG9uZXMuCisgKi8KK0xpc3QgKgorcmVtb3ZlX3Vz ZWxlc3Nfc2VsZl9qb2lucyhQbGFubmVySW5mbyAqcm9vdCwgTGlzdCAqam9pbmxpc3QpCit7 CisJUmVsaWRzCVRvUmVtb3ZlID0gTlVMTDsKKwlpbnQJCXJlbGlkID0gLTE7CisKKwlpZiAo IWVuYWJsZV9zZWxmX2pvaW5fcmVtb3ZhbCkKKwkJcmV0dXJuIGpvaW5saXN0OworCisJLyoK KwkgKiBNZXJnZSBwYWlycyBvZiByZWxhdGlvbnMgcGFydGljaXBhdGVkIGluIHNlbGYtam9p bi4gUmVtb3ZlIHVubmVjZXNzYXJ5CisJICogcmFuZ2UgdGFibGUgZW50cmllcy4KKwkgKi8K KwlUb1JlbW92ZSA9IHJlbW92ZV9zZWxmX2pvaW5zX3JlY3Vyc2Uocm9vdCwgam9pbmxpc3Qs IFRvUmVtb3ZlKTsKKworCWlmICh1bmxpa2VseShUb1JlbW92ZSAhPSBOVUxMKSkKKwl7CisJ CWludAlucmVtb3ZlZCA9IDA7CisKKwkJLyogQXQgdGhlIGVuZCwgcmVtb3ZlIG9ycGhhbmVk IHJlbGF0aW9uIGxpbmtzICovCisJCXdoaWxlICgocmVsaWQgPSBibXNfbmV4dF9tZW1iZXIo VG9SZW1vdmUsIHJlbGlkKSkgPj0gMCkKKwkJCWpvaW5saXN0ID0gcmVtb3ZlX3JlbF9mcm9t X2pvaW5saXN0KGpvaW5saXN0LCByZWxpZCwgJm5yZW1vdmVkKTsKKwl9CisKKwlyZXR1cm4g am9pbmxpc3Q7CiB9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9w bGFubWFpbi5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vcGxhbm1haW4uYwppbmRl eCA3YWZkNDM0YzYwLi43NDhlMmEzZWM4IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9vcHRp bWl6ZXIvcGxhbi9wbGFubWFpbi5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFu L3BsYW5tYWluLmMKQEAgLTIyOCw2ICsyMjgsMTEgQEAgcXVlcnlfcGxhbm5lcihQbGFubmVy SW5mbyAqcm9vdCwKIAkgKi8KIAlyZWR1Y2VfdW5pcXVlX3NlbWlqb2lucyhyb290KTsKIAor CS8qCisJICogUmVtb3ZlIHNlbGYgam9pbnMgb24gYSB1bmlxdWUgY29sdW1uLgorCSAqLwor CWpvaW5saXN0ID0gcmVtb3ZlX3VzZWxlc3Nfc2VsZl9qb2lucyhyb290LCBqb2lubGlzdCk7 CisKIAkvKgogCSAqIE5vdyBkaXN0cmlidXRlICJwbGFjZWhvbGRlcnMiIHRvIGJhc2UgcmVs cyBhcyBuZWVkZWQuICBUaGlzIGhhcyB0byBiZQogCSAqIGRvbmUgYWZ0ZXIgam9pbiByZW1v dmFsIGJlY2F1c2UgcmVtb3ZhbCBjb3VsZCBjaGFuZ2Ugd2hldGhlciBhCmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC91dGlscy9taXNjL2d1Y190YWJsZXMuYyBiL3NyYy9iYWNrZW5kL3V0 aWxzL21pc2MvZ3VjX3RhYmxlcy5jCmluZGV4IDcxZTI3ZjhlYjAuLjRjMWQ0MDAzZjEgMTAw NjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxlcy5jCisrKyBiL3Ny Yy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxlcy5jCkBAIC0xMDE3LDYgKzEwMTcsMTYg QEAgc3RydWN0IGNvbmZpZ19ib29sIENvbmZpZ3VyZU5hbWVzQm9vbFtdID0KIAkJdHJ1ZSwK IAkJTlVMTCwgTlVMTCwgTlVMTAogCX0sCisJeworCQl7ImVuYWJsZV9zZWxmX2pvaW5fcmVt b3ZhbCIsIFBHQ19VU0VSU0VULCBRVUVSWV9UVU5JTkdfTUVUSE9ELAorCQkJZ2V0dGV4dF9u b29wKCJFbmFibGUgcmVtb3ZhbCBvZiB1bmlxdWUgc2VsZi1qb2lucy4iKSwKKwkJCU5VTEws CisJCQlHVUNfRVhQTEFJTiB8IEdVQ19OT1RfSU5fU0FNUExFCisJCX0sCisJCSZlbmFibGVf c2VsZl9qb2luX3JlbW92YWwsCisJCXRydWUsCisJCU5VTEwsIE5VTEwsIE5VTEwKKwl9LAog CXsKIAkJeyJnZXFvIiwgUEdDX1VTRVJTRVQsIFFVRVJZX1RVTklOR19HRVFPLAogCQkJZ2V0 dGV4dF9ub29wKCJFbmFibGVzIGdlbmV0aWMgcXVlcnkgb3B0aW1pemF0aW9uLiIpLApAQCAt MjA2NCw2ICsyMDc0LDE4IEBAIHN0cnVjdCBjb25maWdfaW50IENvbmZpZ3VyZU5hbWVzSW50 W10gPQogCQk4LCAxLCBJTlRfTUFYLAogCQlOVUxMLCBOVUxMLCBOVUxMCiAJfSwKKwl7CisJ CXsic2VsZl9qb2luX3NlYXJjaF9saW1pdCIsIFBHQ19VU0VSU0VULCBRVUVSWV9UVU5JTkdf T1RIRVIsCisJCQlnZXR0ZXh0X25vb3AoIk1heCBzaXplIG9mIGEgZ3JvdXAgb2YgcGxhaW4g dGFibGVzIHdoZXJlIHBsYW5uZXIgIgorCQkJCQkJICJ3aWxsIGxvb2t1cCBmb3Igc2VsZiBq b2lucy4iKSwKKwkJCWdldHRleHRfbm9vcCgiSWYgYSBudW1iZXIgb2YgdGFibGVzIGluIEZS T00tbGlzdCBpcyBleGNlZWRlZCB0aGlzICIKKwkJCQkJCSAibGltaXQsIHRoZSBwbGFubmVy IHdpbGwgaWdub3JlIHRhYmxlcyBiZXlvbmQgaXQuIiksCisJCQlHVUNfRVhQTEFJTiB8IEdV Q19OT1RfSU5fU0FNUExFCisJCX0sCisJCSZzZWxmX2pvaW5fc2VhcmNoX2xpbWl0LAorCQkz MiwgMSwgSU5UX01BWCwKKwkJTlVMTCwgTlVMTCwgTlVMTAorCX0sCiAJewogCQl7ImdlcW9f dGhyZXNob2xkIiwgUEdDX1VTRVJTRVQsIFFVRVJZX1RVTklOR19HRVFPLAogCQkJZ2V0dGV4 dF9ub29wKCJTZXRzIHRoZSB0aHJlc2hvbGQgb2YgRlJPTSBpdGVtcyBiZXlvbmQgd2hpY2gg R0VRTyBpcyB1c2VkLiIpLApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3Bh dGhzLmggYi9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aHMuaAppbmRleCA1MGJjM2I1MDNh Li4zN2Y1NzdlOWIwIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aHMu aAorKysgYi9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aHMuaApAQCAtNzUsNiArNzUsOSBA QCBleHRlcm4gdm9pZCBjcmVhdGVfaW5kZXhfcGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFJl bE9wdEluZm8gKnJlbCk7CiBleHRlcm4gYm9vbCByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4 X2ZvcihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCQkJCQkJCQkJCSAg TGlzdCAqcmVzdHJpY3RsaXN0LAogCQkJCQkJCQkJCSAgTGlzdCAqZXhwcmxpc3QsIExpc3Qg Km9wcmxpc3QpOworZXh0ZXJuIGJvb2wgcmVsYXRpb25faGFzX3VuaXF1ZV9pbmRleF9leHQo UGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKKwkJCQkJCQkJCQkgIExpc3Qg KnJlc3RyaWN0bGlzdCwgTGlzdCAqZXhwcmxpc3QsCisJCQkJCQkJCQkJICBMaXN0ICpvcHJs aXN0LCBMaXN0ICoqZXh0cmFfY2xhdXNlcyk7CiBleHRlcm4gYm9vbCBpbmRleGNvbF9pc19i b29sX2NvbnN0YW50X2Zvcl9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwKIAkJCQkJCQkJCQkJ CUluZGV4T3B0SW5mbyAqaW5kZXgsCiAJCQkJCQkJCQkJCQlpbnQgaW5kZXhjb2wpOwpkaWZm IC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BsYW5tYWluLmggYi9zcmMvaW5jbHVk ZS9vcHRpbWl6ZXIvcGxhbm1haW4uaAppbmRleCA1ZmM5MDA3MzdkLi5kMjZjMGQzZWE1IDEw MDY0NAotLS0gYS9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGxhbm1haW4uaAorKysgYi9zcmMv aW5jbHVkZS9vcHRpbWl6ZXIvcGxhbm1haW4uaApAQCAtMjAsNiArMjAsOCBAQAogLyogR1VD IHBhcmFtZXRlcnMgKi8KICNkZWZpbmUgREVGQVVMVF9DVVJTT1JfVFVQTEVfRlJBQ1RJT04g MC4xCiBleHRlcm4gUEdETExJTVBPUlQgZG91YmxlIGN1cnNvcl90dXBsZV9mcmFjdGlvbjsK K2V4dGVybiBQR0RMTElNUE9SVCBib29sIGVuYWJsZV9zZWxmX2pvaW5fcmVtb3ZhbDsKK2V4 dGVybiBQR0RMTElNUE9SVCBpbnQgc2VsZl9qb2luX3NlYXJjaF9saW1pdDsKIAogLyogcXVl cnlfcGxhbm5lciBjYWxsYmFjayB0byBjb21wdXRlIHF1ZXJ5X3BhdGhrZXlzICovCiB0eXBl ZGVmIHZvaWQgKCpxdWVyeV9wYXRoa2V5c19jYWxsYmFjaykgKFBsYW5uZXJJbmZvICpyb290 LCB2b2lkICpleHRyYSk7CkBAIC0xMDQsNiArMTA2LDExIEBAIGV4dGVybiBib29sIHF1ZXJ5 X2lzX2Rpc3RpbmN0X2ZvcihRdWVyeSAqcXVlcnksIExpc3QgKmNvbG5vcywgTGlzdCAqb3Bp ZHMpOwogZXh0ZXJuIGJvb2wgaW5uZXJyZWxfaXNfdW5pcXVlKFBsYW5uZXJJbmZvICpyb290 LAogCQkJCQkJCSAgIFJlbGlkcyBqb2lucmVsaWRzLCBSZWxpZHMgb3V0ZXJyZWxpZHMsIFJl bE9wdEluZm8gKmlubmVycmVsLAogCQkJCQkJCSAgIEpvaW5UeXBlIGpvaW50eXBlLCBMaXN0 ICpyZXN0cmljdGxpc3QsIGJvb2wgZm9yY2VfY2FjaGUpOworZXh0ZXJuIGJvb2wgaW5uZXJy ZWxfaXNfdW5pcXVlX2V4dChQbGFubmVySW5mbyAqcm9vdCwgUmVsaWRzIGpvaW5yZWxpZHMs CisJCQkJCQkJCSAgIFJlbGlkcyBvdXRlcnJlbGlkcywgUmVsT3B0SW5mbyAqaW5uZXJyZWws CisJCQkJCQkJCSAgIEpvaW5UeXBlIGpvaW50eXBlLCBMaXN0ICpyZXN0cmljdGxpc3QsCisJ CQkJCQkJCSAgIGJvb2wgZm9yY2VfY2FjaGUsIExpc3QgKip1Y2xhdXNlcyk7CitleHRlcm4g TGlzdCAqcmVtb3ZlX3VzZWxlc3Nfc2VsZl9qb2lucyhQbGFubmVySW5mbyAqcm9vdCwgTGlz dCAqam9pbnRyZWUpOwogCiAvKgogICogcHJvdG90eXBlcyBmb3IgcGxhbi9zZXRyZWZzLmMK ZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZXF1aXZjbGFzcy5vdXQg Yi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2VxdWl2Y2xhc3Mub3V0CmluZGV4IDEyNmY3 MDQ3ZmUuLmRlNzE0NDEwNTIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvZXF1aXZjbGFzcy5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9lcXVp dmNsYXNzLm91dApAQCAtNDMwLDYgKzQzMCwzOCBAQCBleHBsYWluIChjb3N0cyBvZmYpCiAg ICBGaWx0ZXI6ICgodW5pcXVlMSBJUyBOT1QgTlVMTCkgQU5EICh1bmlxdWUyIElTIE5PVCBO VUxMKSkKICgyIHJvd3MpCiAKKy0tIFRlc3QgdGhhdCBicm9rZW4gRUNzIGFyZSBwcm9jZXNz ZWQgY29ycmVjdGx5IGR1cmluZyBzZWxmIGpvaW4gcmVtb3ZhbC4KKy0tIERpc2FibGUgbWVy Z2Ugam9pbnMgc28gdGhhdCB3ZSBkb24ndCBnZXQgYW4gZXJyb3IgYWJvdXQgbWlzc2luZyBj b21tdXRhdG9yLgorLS0gVGVzdCBib3RoIG9yaWVudGF0aW9ucyBvZiB0aGUgam9pbiBjbGF1 c2UsIGJlY2F1c2Ugb25seSBvbmUgb2YgdGhlbSBicmVha3MKKy0tIHRoZSBFQy4KK3NldCBl bmFibGVfbWVyZ2Vqb2luIHRvIG9mZjsKK2V4cGxhaW4gKGNvc3RzIG9mZikKKyAgc2VsZWN0 ICogZnJvbSBlYzAgbSBqb2luIGVjMCBuIG9uIG0uZmYgPSBuLmZmCisgIGpvaW4gZWMxIHAg b24gbS5mZiArIG4uZmYgPSBwLmYxOworICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKChuLmZmICsgbi5mZikgPSBwLmYxKQor ICAgLT4gIFNlcSBTY2FuIG9uIGVjMSBwCisgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAg IC0+ICBTZXEgU2NhbiBvbiBlYzAgbgorICAgICAgICAgICAgICAgRmlsdGVyOiAoZmYgSVMg Tk9UIE5VTEwpCisoNiByb3dzKQorCitleHBsYWluIChjb3N0cyBvZmYpCisgIHNlbGVjdCAq IGZyb20gZWMwIG0gam9pbiBlYzAgbiBvbiBtLmZmID0gbi5mZgorICBqb2luIGVjMSBwIG9u IHAuZjE6OmludDggPSAobS5mZiArIG4uZmYpOjppbnQ4YWxpYXMxOworICAgICAgICAgICAg ICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6ICgocC5mMSk6OmJpZ2lu dCA9ICgobi5mZiArIG4uZmYpKTo6aW50OGFsaWFzMSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBl YzEgcAorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gZWMw IG4KKyAgICAgICAgICAgICAgIEZpbHRlcjogKGZmIElTIE5PVCBOVUxMKQorKDYgcm93cykK KworcmVzZXQgZW5hYmxlX21lcmdlam9pbjsKIC0tIHRoaXMgY291bGQgYmUgY29udmVydGVk LCBidXQgaXNuJ3QgYXQgcHJlc2VudAogZXhwbGFpbiAoY29zdHMgb2ZmKQogICBzZWxlY3Qg KiBmcm9tIHRlbmsxIHdoZXJlIHVuaXF1ZTEgPSB1bmlxdWUxIG9yIHVuaXF1ZTIgPSB1bmlx dWUyOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dCBi L3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQKaW5kZXggOWI4NjM4ZjI4Ni4u YjFmNDNmNmZmOCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2lu Lm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0CkBAIC02MTM0 LDYgKzYxMzQsODA0IEBAIHNlbGVjdCAqIGZyb20KIC0tLS0rLS0tLSstLS0tKy0tLS0KICgw IHJvd3MpCiAKKy0tCistLSB0ZXN0IHRoYXQgc2VtaS0gb3IgaW5uZXIgc2VsZi1qb2lucyBv biBhIHVuaXF1ZSBjb2x1bW4gYXJlIHJlbW92ZWQKKy0tCistLSBlbmFibGUgb25seSBuZXN0 bG9vcCB0byBnZXQgbW9yZSBwcmVkaWN0YWJsZSBwbGFucworc2V0IGVuYWJsZV9oYXNoam9p biB0byBvZmY7CitzZXQgZW5hYmxlX21lcmdlam9pbiB0byBvZmY7CitjcmVhdGUgdGFibGUg c2ogKGEgaW50IHVuaXF1ZSwgYiBpbnQsIGMgaW50IHVuaXF1ZSk7CitpbnNlcnQgaW50byBz aiB2YWx1ZXMgKDEsIG51bGwsIDIpLCAobnVsbCwgMiwgbnVsbCksICgyLCAxLCAxKTsKK2Fu YWx5emUgc2o7CistLSBUcml2aWFsIHNlbGYtam9pbiBjYXNlLgorZXhwbGFpbiAoY29zdHMg b2ZmKQorc2VsZWN0IHAuKiBmcm9tIHNqIHAsIHNqIHEgd2hlcmUgcS5hID0gcC5hIGFuZCBx LmIgPSBxLmEgLSAxOworICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCisgU2VxIFNjYW4gb24gc2ogcQorICAgRmlsdGVyOiAoKGEgSVMgTk9UIE5VTEwpIEFO RCAoYiA9IChhIC0gMSkpKQorKDIgcm93cykKKworc2VsZWN0IHAuKiBmcm9tIHNqIHAsIHNq IHEgd2hlcmUgcS5hID0gcC5hIGFuZCBxLmIgPSBxLmEgLSAxOworIGEgfCBiIHwgYyAKKy0t LSstLS0rLS0tCisgMiB8IDEgfCAxCisoMSByb3cpCisKKy0tIFNlbGYtam9pbiByZW1vdmFs IHBlcmZvcm1zIGFmdGVyIGEgc3VicXVlcnkgcHVsbC11cCBwcm9jZXNzIGFuZCBjb3VsZCBy ZW1vdmUKKy0tIHN1Y2gga2luZCBvZiBzZWxmLWpvaW4gdG9vLiBDaGVjayB0aGlzIG9wdGlv bi4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogcAord2hlcmUgZXhp c3RzIChzZWxlY3QgKiBmcm9tIHNqIHEKKwkJCQl3aGVyZSBxLmEgPSBwLmEgYW5kIHEuYiA8 IDEwKTsKKyAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgIAorLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24g c2ogcQorICAgRmlsdGVyOiAoKGEgSVMgTk9UIE5VTEwpIEFORCAoYiA8IDEwKSkKKygyIHJv d3MpCisKK3NlbGVjdCAqIGZyb20gc2ogcCB3aGVyZSBleGlzdHMgKHNlbGVjdCAqIGZyb20g c2ogcSB3aGVyZSBxLmEgPSBwLmEgYW5kIHEuYiA8IDEwKTsKKyBhIHwgYiB8IGMgCistLS0r LS0tKy0tLQorIDIgfCAxIHwgMQorKDEgcm93KQorCistLSBEb24ndCByZW1vdmUgc2VsZi1q b2luIGZvciB0aGUgY2FzZSBvZiBlcXVhbGl0eSBvZiB0d28gZGlmZmVyZW50IHVuaXF1ZSBj b2x1bW5zLgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB0MSwgc2og dDIgd2hlcmUgdDEuYSA9IHQyLmMgYW5kIHQxLmIgaXMgbm90IG51bGw7CisgICAgICAgICAg ICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKHQxLmEg PSB0Mi5jKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIHQyCisgICAtPiAgTWF0ZXJpYWxpemUK KyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBzaiB0MQorICAgICAgICAgICAgICAgRmlsdGVy OiAoYiBJUyBOT1QgTlVMTCkKKyg2IHJvd3MpCisKKy0tIERlZ2VuZXJhdGVkIGNhc2UuCitl eHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tCisJKHNlbGVjdCBhIGFzIHggZnJv bSBzaiB3aGVyZSBmYWxzZSkgYXMgcTEsCisJKHNlbGVjdCBhIGFzIHkgZnJvbSBzaiB3aGVy ZSBmYWxzZSkgYXMgcTIKK3doZXJlIHExLnggPSBxMi55OworICAgICAgICAgICBRVUVSWSBQ TEFOICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBS ZXN1bHQKKyAgIE9uZS1UaW1lIEZpbHRlcjogZmFsc2UKKyAgIC0+ICBTZXEgU2NhbiBvbiBz agorICAgICAgICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKyg0IHJvd3MpCisKKy0tIFdl IGNhbid0IHVzZSBhIGNyb3NzLUVDIGdlbmVyYXRlZCBzZWxmIGpvaW4gcXVhbCBiZWNhdXNl IG9mIGN1cnJlbnQgbG9naWMgb2YKKy0tIHRoZSBnZW5lcmF0ZV9qb2luX2ltcGxpZWRfZXF1 YWxpdGllcyByb3V0aW5lLgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBz aiB0MSwgc2ogdDIgd2hlcmUgdDEuYSA9IHQxLmIgYW5kIHQxLmIgPSB0Mi5iIGFuZCB0Mi5i ID0gdDIuYTsKKyAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgIAorLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAodDEu YSA9IHQyLmIpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogdDEKKyAgICAgICAgIEZpbHRlcjog KGEgPSBiKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIHQyCisgICAgICAgICBGaWx0ZXI6IChi ID0gYSkKKyg2IHJvd3MpCisKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20g c2ogdDEsIHNqIHQyLCBzaiB0Mword2hlcmUgdDEuYSA9IHQxLmIgYW5kIHQxLmIgPSB0Mi5i IGFuZCB0Mi5iID0gdDIuYQorCWFuZCB0MS5iID0gdDMuYiBhbmQgdDMuYiA9IHQzLmE7Cisg ICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKHQx LmEgPSB0My5iKQorICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICBKb2luIEZpbHRlcjog KHQxLmEgPSB0Mi5iKQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqIHQxCisgICAgICAg ICAgICAgICBGaWx0ZXI6IChhID0gYikKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBzaiB0 MgorICAgICAgICAgICAgICAgRmlsdGVyOiAoYiA9IGEpCisgICAtPiAgU2VxIFNjYW4gb24g c2ogdDMKKyAgICAgICAgIEZpbHRlcjogKGIgPSBhKQorKDEwIHJvd3MpCisKKy0tIERvdWJs ZSBzZWxmLWpvaW4gcmVtb3ZhbC4KKy0tIFVzZSBhIGNvbmRpdGlvbiBvbiAiYiArIDEiLCBu b3Qgb24gImIiLCBmb3IgdGhlIHNlY29uZCBqb2luLCBzbyB0aGF0CistLSB0aGUgZXF1aXZh bGVuY2UgY2xhc3MgaXMgZGlmZmVyZW50IGZyb20gdGhlIGZpcnN0IG9uZSwgYW5kIHdlIGNh bgorLS0gdGVzdCB0aGUgbm9uLWVjIGNvZGUgcGF0aC4KK2V4cGxhaW4gKGNvc3RzIG9mZikK K3NlbGVjdCAqIGZyb20gc2ogdDEgam9pbiBzaiB0MiBvbiB0MS5hID0gdDIuYSBhbmQgdDEu YiA9IHQyLmIKKwlqb2luIHNqIHQzIG9uIHQyLmEgPSB0My5hIGFuZCB0Mi5iICsgMSA9IHQz LmIgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBTZXEgU2NhbiBvbiBzaiB0MworICAgRmlsdGVyOiAoKGEgSVMgTk9UIE5VTEwpIEFORCAo YiBJUyBOT1QgTlVMTCkgQU5EICgoYiArIDEpIElTIE5PVCBOVUxMKSkKKygyIHJvd3MpCisK Ky0tIHN1YnNlbGVjdCB0aGF0IHJlZmVyZW5jZXMgdGhlIHJlbW92ZWQgcmVsYXRpb24KK2V4 cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCB0MS5hLCAoc2VsZWN0IGEgZnJvbSBzaiB3aGVy ZSBhID0gdDIuYSBhbmQgYSA9IHQxLmEpCitmcm9tIHNqIHQxLCBzaiB0Mgord2hlcmUgdDEu YSA9IHQyLmE7CisgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2Fu IG9uIHNqIHQyCisgICBGaWx0ZXI6IChhIElTIE5PVCBOVUxMKQorICAgU3ViUGxhbiAxCisg ICAgIC0+ICBSZXN1bHQKKyAgICAgICAgICAgT25lLVRpbWUgRmlsdGVyOiAodDIuYSA9IHQy LmEpCisgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBzagorICAgICAgICAgICAgICAgICBG aWx0ZXI6IChhID0gdDIuYSkKKyg3IHJvd3MpCisKKy0tIHNlbGYtam9pbiB1bmRlciBvdXRl ciBqb2luCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHggam9pbiBz aiB5IG9uIHguYSA9IHkuYQorbGVmdCBqb2luIGludDhfdGJsIHogb24geC5hID0gei5xMTsK KyAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AgTGVmdCBKb2luCisgICBKb2lu IEZpbHRlcjogKHkuYSA9IHoucTEpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogeQorICAgICAg ICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKyAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAg ICAgLT4gIFNlcSBTY2FuIG9uIGludDhfdGJsIHoKKyg2IHJvd3MpCisKK2V4cGxhaW4gKGNv c3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogeCBqb2luIHNqIHkgb24geC5hID0geS5hCits ZWZ0IGpvaW4gaW50OF90YmwgeiBvbiB5LmEgPSB6LnExOworICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgIEpvaW4gRmlsdGVyOiAoeS5hID0gei5x MSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiB5CisgICAgICAgICBGaWx0ZXI6IChhIElTIE5P VCBOVUxMKQorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24g aW50OF90YmwgegorKDYgcm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKQorU0VMRUNUICog RlJPTSAoCisgIFNFTEVDVCB0MS4qLCB0Mi5hIEFTIGF4IEZST00gc2ogdDEgSk9JTiBzaiB0 MgorICBPTiAodDEuYSA9IHQyLmEgQU5EIHQxLmMqdDEuYyA9IHQyLmMrMiBBTkQgdDIuYiBJ UyBOVUxMKQorKSBBUyBxMQorTEVGVCBKT0lOCisgIChTRUxFQ1QgdDMuKiBGUk9NIHNqIHQz LCBzaiB0NCBXSEVSRSB0My5jID0gdDQuYykgQVMgcTIKK09OIHExLmF4ID0gcTIuYTsKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExv b3AgTGVmdCBKb2luCisgICBKb2luIEZpbHRlcjogKHQyLmEgPSB0NC5hKQorICAgLT4gIFNl cSBTY2FuIG9uIHNqIHQyCisgICAgICAgICBGaWx0ZXI6ICgoYiBJUyBOVUxMKSBBTkQgKGEg SVMgTk9UIE5VTEwpIEFORCAoKGMgKiBjKSA9IChjICsgMikpKQorICAgLT4gIFNlcSBTY2Fu IG9uIHNqIHQ0CisgICAgICAgICBGaWx0ZXI6IChjIElTIE5PVCBOVUxMKQorKDYgcm93cykK KworLS0gVGVzdCB0aGF0IHBsYWNlaG9sZGVycyBhcmUgdXBkYXRlZCBjb3JyZWN0bHkgYWZ0 ZXIgam9pbiByZW1vdmFsCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tICh2 YWx1ZXMgKDEpKSB4CitsZWZ0IGpvaW4gKHNlbGVjdCBjb2FsZXNjZSh5LnExLCAxKSBmcm9t IGludDhfdGJsIHkKKwlyaWdodCBqb2luIHNqIGoxIGlubmVyIGpvaW4gc2ogajIgb24gajEu YSA9IGoyLmEKKwlvbiB0cnVlKSB6CitvbiB0cnVlOworICAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgIC0+ICBSZXN1bHQKKyAg IC0+ICBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBz aiBqMgorICAgICAgICAgICAgICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKyAgICAgICAg IC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGludDhf dGJsIHkKKyg3IHJvd3MpCisKKy0tCistLSBTSlIgY29ybmVyIGNhc2U6IHVuaXF1ZW5lc3Mg b2YgYW4gaW5uZXIgaXMgW3BhcnRpYWxseV0gZGVyaXZlZCBmcm9tCistLSBiYXNlcmVzdHJp Y3RpbmZvIGNsYXVzZXMuCistLSBYWFg6IFdlIHJlYWxseSBzaG91bGQgYWxsb3cgU0pSIGZv ciB0aGVzZSBjb3JuZXIgY2FzZXM/CistLQorSU5TRVJUIElOVE8gc2ogVkFMVUVTICgzLCAx LCAzKTsKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gRG9uJ3QgcmVtb3ZlIFNKCisJU0VMRUNU ICogRlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEgPSAyIEFO RCBqMi5hID0gMzsKKyAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAo ajEuYiA9IGoyLmIpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogajEKKyAgICAgICAgIEZpbHRl cjogKGEgPSAyKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIGoyCisgICAgICAgICBGaWx0ZXI6 IChhID0gMykKKyg2IHJvd3MpCisKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCitXSEVS RSBqMS5iID0gajIuYiBBTkQgajEuYSA9IDIgQU5EIGoyLmEgPSAzOyAtLSBSZXR1cm4gb25l IHJvdworIGEgfCBiIHwgYyB8IGEgfCBiIHwgYyAKKy0tLSstLS0rLS0tKy0tLSstLS0rLS0t CisgMiB8IDEgfCAxIHwgMyB8IDEgfCAzCisoMSByb3cpCisKK2V4cGxhaW4gKGNvc3RzIG9m ZikgLS0gUmVtb3ZlIFNKLCBkZWZpbmUgdW5pcXVlbmVzcyBieSBhIGNvbnN0YW50CisJU0VM RUNUICogRlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEgPSAy IEFORCBqMi5hID0gMjsKKyAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBT Y2FuIG9uIHNqIGoyCisgICBGaWx0ZXI6ICgoYiBJUyBOT1QgTlVMTCkgQU5EIChhID0gMikp CisoMiByb3dzKQorCitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorV0hFUkUgajEuYiA9 IGoyLmIgQU5EIGoxLmEgPSAyIEFORCBqMi5hID0gMjsgLS0gUmV0dXJuIG9uZSByb3cKKyBh IHwgYiB8IGMgfCBhIHwgYiB8IGMgCistLS0rLS0tKy0tLSstLS0rLS0tKy0tLQorIDIgfCAx IHwgMSB8IDIgfCAxIHwgMQorKDEgcm93KQorCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxF Q1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorV0hFUkUgajEuYiA9IGoyLmIKKyAgQU5EIGoxLmEg PSAoRVhUUkFDVChET1cgRlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSkvMTUgKyAzKTo6aW50 CisgIEFORCAoRVhUUkFDVChET1cgRlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSkvMTUgKyAz KTo6aW50ID0gajIuYQorOyAtLSBSZW1vdmUgU0osIGRlZmluZSB1bmlxdWVuZXNzIGJ5IGEg Y29uc3RhbnQgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIFNlcSBTY2FuIG9uIHNqIGoyCisgICBGaWx0ZXI6ICgoYiBJUyBOT1QgTlVMTCkgQU5E IChhID0gKCgoRVhUUkFDVChkb3cgRlJPTSBDVVJSRU5UX1RJTUVTVEFNUCgwKSkgLyAnMTUn OjpudW1lcmljKSArICczJzo6bnVtZXJpYykpOjppbnRlZ2VyKSkKKygyIHJvd3MpCisKK1NF TEVDVCAqIEZST00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIuYgorICBBTkQgajEu YSA9IChFWFRSQUNUKERPVyBGUk9NIGN1cnJlbnRfdGltZXN0YW1wKDApKS8xNSArIDMpOjpp bnQKKyAgQU5EIChFWFRSQUNUKERPVyBGUk9NIGN1cnJlbnRfdGltZXN0YW1wKDApKS8xNSAr IDMpOjppbnQgPSBqMi5hCis7IC0tIFJldHVybiBvbmUgcm93CisgYSB8IGIgfCBjIHwgYSB8 IGIgfCBjIAorLS0tKy0tLSstLS0rLS0tKy0tLSstLS0KKyAzIHwgMSB8IDMgfCAzIHwgMSB8 IDMKKygxIHJvdykKKworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBSZW1vdmUgU0oKKwlTRUxF Q1QgKiBGUk9NIHNqIGoxLCBzaiBqMiBXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSA9IDEg QU5EIGoyLmEgPSAxOworICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAg ICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNj YW4gb24gc2ogajIKKyAgIEZpbHRlcjogKChiIElTIE5PVCBOVUxMKSBBTkQgKGEgPSAxKSkK KygyIHJvd3MpCisKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0g ajIuYiBBTkQgajEuYSA9IDEgQU5EIGoyLmEgPSAxOyAtLSBSZXR1cm4gbm8gcm93cworIGEg fCBiIHwgYyB8IGEgfCBiIHwgYyAKKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tCisoMCByb3dz KQorCitleHBsYWluIChjb3N0cyBvZmYpIC0tIFNodWZmbGUgYSBjbGF1c2UuIFJlbW92ZSBT SgorCVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyIFdIRVJFIGoxLmIgPSBqMi5iIEFORCAx ID0gajEuYSBBTkQgajIuYSA9IDE7CisgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBTZXEgU2NhbiBvbiBzaiBqMgorICAgRmlsdGVyOiAoKGIgSVMgTk9UIE5VTEwpIEFORCAo YSA9IDEpKQorKDIgcm93cykKKworU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKK1dIRVJF IGoxLmIgPSBqMi5iIEFORCAxID0gajEuYSBBTkQgajIuYSA9IDE7IC0tIFJldHVybiBubyBy b3dzCisgYSB8IGIgfCBjIHwgYSB8IGIgfCBjIAorLS0tKy0tLSstLS0rLS0tKy0tLSstLS0K KygwIHJvd3MpCisKKy0tIFNKRSBDb3JuZXIgY2FzZTogYSAnYS54PWEueCcgY2xhdXNlLCBo YXZlIHJlcGxhY2VkIHdpdGggJ2EueCBJUyBOT1QgTlVMTCcKKy0tIGFmdGVyIFNKIGVsaW1p bmF0aW9uIGl0IHNob3VsZG4ndCBiZSBhIG1lcmdlam9pbmFibGUgY2xhdXNlLgorU0VMRUNU IHQ0LioKK0ZST00gKFNFTEVDVCB0MS4qLCB0Mi5hIEFTIGExIEZST00gc2ogdDEsIHNqIHQy IFdIRVJFIHQxLmIgPSB0Mi5iKSBBUyB0MworSk9JTiBzaiB0NCBPTiAodDQuYSA9IHQzLmEp IFdIRVJFIHQzLmExID0gNDI7CisgYSB8IGIgfCBjIAorLS0tKy0tLSstLS0KKygwIHJvd3Mp CisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCB0NC4qCitGUk9NIChTRUxFQ1QgdDEu KiwgdDIuYSBBUyBhMSBGUk9NIHNqIHQxLCBzaiB0MiBXSEVSRSB0MS5iID0gdDIuYikgQVMg dDMKK0pPSU4gc2ogdDQgT04gKHQ0LmEgPSB0My5hKSBXSEVSRSB0My5hMSA9IDQyCis7IC0t IFNKcyBtdXN0IGJlIHJlbW92ZWQuCisgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAg ICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisg ICBKb2luIEZpbHRlcjogKHQxLmIgPSB0Mi5iKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIHQy CisgICAgICAgICBGaWx0ZXI6IChhID0gNDIpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogdDEK KyAgICAgICAgIEZpbHRlcjogKGEgSVMgTk9UIE5VTEwpCisoNiByb3dzKQorCistLSBGdW5j dGlvbmFsIGluZGV4CitDUkVBVEUgVU5JUVVFIElOREVYIHNqX2ZuX2lkeCBPTiBzaigoYSAq IGEpKTsKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gUmVtb3ZlIFNKCisJU0VMRUNUICogRlJP TSBzaiBqMSwgc2ogajIKKwlXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSpqMS5hID0gMSBB TkQgajIuYSpqMi5hID0gMTsKKyAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAg ICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIFNlcSBTY2FuIG9uIHNqIGoyCisgICBGaWx0ZXI6ICgoYiBJUyBOT1QgTlVM TCkgQU5EICgoYSAqIGEpID0gMSkpCisoMiByb3dzKQorCitleHBsYWluIChjb3N0cyBvZmYp IC0tIERvbid0IHJlbW92ZSBTSgorCVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCisJV0hF UkUgajEuYiA9IGoyLmIgQU5EIGoxLmEqajEuYSA9IDEgQU5EIGoyLmEqajIuYSA9IDI7Cisg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAoajEuYiA9IGoyLmIp CisgICAtPiAgU2VxIFNjYW4gb24gc2ogajEKKyAgICAgICAgIEZpbHRlcjogKChhICogYSkg PSAxKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIGoyCisgICAgICAgICBGaWx0ZXI6ICgoYSAq IGEpID0gMikKKyg2IHJvd3MpCisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZS T00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIuYgorICBBTkQgKGoxLmEqajEuYSkg PSAoRVhUUkFDVChET1cgRlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSkvMTUgKyAzKTo6aW50 CisgIEFORCAoRVhUUkFDVChET1cgRlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSkvMTUgKyAz KTo6aW50ID0gKGoyLmEqajIuYSkKKzsgLS0gUmVzdHJpY3Rpb24gY29udGFpbnMgZXhwcmVz c2lvbnMgaW4gYm90aCBzaWRlcywgUmVtb3ZlIFNKLgorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHNqIGoyCisgICBGaWx0 ZXI6ICgoYiBJUyBOT1QgTlVMTCkgQU5EICgoYSAqIGEpID0gKCgoRVhUUkFDVChkb3cgRlJP TSBDVVJSRU5UX1RJTUVTVEFNUCgwKSkgLyAnMTUnOjpudW1lcmljKSArICczJzo6bnVtZXJp YykpOjppbnRlZ2VyKSkKKygyIHJvd3MpCisKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoy CitXSEVSRSBqMS5iID0gajIuYgorICBBTkQgKGoxLmEqajEuYSkgPSAoRVhUUkFDVChET1cg RlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSkvMTUgKyAzKTo6aW50CisgIEFORCAoRVhUUkFD VChET1cgRlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSkvMTUgKyAzKTo6aW50ID0gKGoyLmEq ajIuYSkKKzsgLS0gRW1wdHkgc2V0IG9mIHJvd3Mgc2hvdWxkIGJlIHJldHVybmVkCisgYSB8 IGIgfCBjIHwgYSB8IGIgfCBjIAorLS0tKy0tLSstLS0rLS0tKy0tLSstLS0KKygwIHJvd3Mp CisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCitX SEVSRSBqMS5iID0gajIuYgorICBBTkQgKGoxLmEqajEuYSkgPSAocmFuZG9tKCkvMyArIDMp OjppbnQKKyAgQU5EIChyYW5kb20oKS8zICsgMyk6OmludCA9IChqMi5hKmoyLmEpCis7IC0t IFJlc3RyaWN0aW9uIGNvbnRhaW5zIHZvbGF0aWxlIGZ1bmN0aW9uIC0gZGlzYWJsZSBTSlIg ZmVhdHVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKGoxLmIgPSBqMi5iKQorICAgLT4gIFNl cSBTY2FuIG9uIHNqIGoxCisgICAgICAgICBGaWx0ZXI6ICgoYSAqIGEpID0gKCgocmFuZG9t KCkgLyAnMyc6OmRvdWJsZSBwcmVjaXNpb24pICsgJzMnOjpkb3VibGUgcHJlY2lzaW9uKSk6 OmludGVnZXIpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogajIKKyAgICAgICAgIEZpbHRlcjog KCgoKHJhbmRvbSgpIC8gJzMnOjpkb3VibGUgcHJlY2lzaW9uKSArICczJzo6ZG91YmxlIHBy ZWNpc2lvbikpOjppbnRlZ2VyID0gKGEgKiBhKSkKKyg2IHJvd3MpCisKK1NFTEVDVCAqIEZS T00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIuYgorICBBTkQgKGoxLmEqajEuYy8z KSA9IChyYW5kb20oKS8zICsgMyk6OmludAorICBBTkQgKHJhbmRvbSgpLzMgKyAzKTo6aW50 ID0gKGoyLmEqajIuYy8zKQorOyAtLSBSZXR1cm4gb25lIHJvdworIGEgfCBiIHwgYyB8IGEg fCBiIHwgYyAKKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tCisgMyB8IDEgfCAzIHwgMyB8IDEg fCAzCisoMSByb3cpCisKKy0tIE11bHRpcGxlIGZpbHRlcnMKK0NSRUFURSBVTklRVUUgSU5E RVggc2pfdGVtcF9pZHgxIE9OIHNqKGEsYixjKTsKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0g UmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKKwlXSEVSRSBqMS5iID0g ajIuYiBBTkQgajEuYSA9IDIgQU5EIGoxLmMgPSAzIEFORCBqMi5hID0gMiBBTkQgMyA9IGoy LmM7CisgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyBTZXEgU2NhbiBvbiBzaiBqMgorICAgRmlsdGVyOiAoKGIgSVMgTk9UIE5VTEwp IEFORCAoYSA9IDIpIEFORCAoYyA9IDMpKQorKDIgcm93cykKKworZXhwbGFpbiAoY29zdHMg b2ZmKSAtLSBEb24ndCByZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgor CVdIRVJFIGoxLmIgPSBqMi5iIEFORCAyID0gajEuYSBBTkQgajEuYyA9IDMgQU5EIGoyLmEg PSAxIEFORCAzID0gajIuYzsKKyAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVk IExvb3AKKyAgIEpvaW4gRmlsdGVyOiAoajEuYiA9IGoyLmIpCisgICAtPiAgU2VxIFNjYW4g b24gc2ogajEKKyAgICAgICAgIEZpbHRlcjogKCgyID0gYSkgQU5EIChjID0gMykpCisgICAt PiAgU2VxIFNjYW4gb24gc2ogajIKKyAgICAgICAgIEZpbHRlcjogKChjID0gMykgQU5EIChh ID0gMSkpCisoNiByb3dzKQorCitDUkVBVEUgVU5JUVVFIElOREVYIHNqX3RlbXBfaWR4IE9O IHNqKGEsYik7CitleHBsYWluIChjb3N0cyBvZmYpIC0tIERvbid0IHJlbW92ZSBTSgorCVNF TEVDVCAqIEZST00gc2ogajEsIHNqIGoyIFdIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0g MjsKKyAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAoajEuYiA9IGoy LmIpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogajEKKyAgICAgICAgIEZpbHRlcjogKGEgPSAy KQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIGoyCisoNSByb3dzKQorCitleHBsYWluIChjb3N0 cyBvZmYpIC0tIERvbid0IHJlbW92ZSBTSgorCVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoy IFdIRVJFIGoxLmIgPSBqMi5iIEFORCAyID0gajIuYTsKKyAgICAgICAgICBRVUVSWSBQTEFO ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExv b3AKKyAgIEpvaW4gRmlsdGVyOiAoajEuYiA9IGoyLmIpCisgICAtPiAgU2VxIFNjYW4gb24g c2ogajIKKyAgICAgICAgIEZpbHRlcjogKDIgPSBhKQorICAgLT4gIFNlcSBTY2FuIG9uIHNq IGoxCisoNSByb3dzKQorCitleHBsYWluIChjb3N0cyBvZmYpIC0tIERvbid0IHJlbW92ZSBT SgorCVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyIFdIRVJFIGoxLmIgPSBqMi5iIEFORCAo ajEuYSA9IDEgT1IgajIuYSA9IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVS WSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQg TG9vcAorICAgSm9pbiBGaWx0ZXI6ICgoajEuYiA9IGoyLmIpIEFORCAoKGoxLmEgPSAxKSBP UiAoajIuYSA9IDEpKSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBqMQorICAgLT4gIE1hdGVy aWFsaXplCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ogajIKKyg1IHJvd3MpCisKK0RS T1AgSU5ERVggc2pfZm5faWR4LCBzal90ZW1wX2lkeDEsIHNqX3RlbXBfaWR4OworLS0gVGVz dCB0aGF0IE9SIHByZWRpY2F0ZWQgYXJlIHVwZGF0ZWQgY29ycmVjdGx5IGFmdGVyIGpvaW4g cmVtb3ZhbAorQ1JFQVRFIFRBQkxFIHRhYl93aXRoX2ZsYWcgKCBpZCBJTlQgUFJJTUFSWSBL RVksIGlzX2ZsYWcgU01BTExJTlQpOworQ1JFQVRFIElOREVYIGlkeF90ZXN0X2lzX2ZsYWcg T04gdGFiX3dpdGhfZmxhZyAoaXNfZmxhZyk7CitleHBsYWluIChjb3N0cyBvZmYpCitTRUxF Q1QgQ09VTlQoKikgRlJPTSB0YWJfd2l0aF9mbGFnCitXSEVSRQorCShpc19mbGFnIElTIE5V TEwgT1IgaXNfZmxhZyA9IDApCisJQU5EIGlkIElOIChTRUxFQ1QgaWQgRlJPTSB0YWJfd2l0 aF9mbGFnIFdIRVJFIGlkIElOICgyLCAzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQWdncmVnYXRlCisgICAtPiAg Qml0bWFwIEhlYXAgU2NhbiBvbiB0YWJfd2l0aF9mbGFnCisgICAgICAgICBSZWNoZWNrIENv bmQ6ICgoaWQgPSBBTlkgKCd7MiwzfSc6OmludGVnZXJbXSkpIEFORCAoaWQgSVMgTk9UIE5V TEwpKQorICAgICAgICAgRmlsdGVyOiAoKGlzX2ZsYWcgSVMgTlVMTCkgT1IgKGlzX2ZsYWcg PSAwKSkKKyAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiB0YWJfd2l0aF9mbGFn X3BrZXkKKyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICgoaWQgPSBBTlkgKCd7MiwzfSc6 OmludGVnZXJbXSkpIEFORCAoaWQgSVMgTk9UIE5VTEwpKQorKDYgcm93cykKKworRFJPUCBU QUJMRSB0YWJfd2l0aF9mbGFnOworLS0gSEFWSU5HIGNsYXVzZQorZXhwbGFpbiAoY29zdHMg b2ZmKQorc2VsZWN0IHAuYiBmcm9tIHNqIHAgam9pbiBzaiBxIG9uIHAuYSA9IHEuYSBncm91 cCBieSBwLmIgaGF2aW5nIHN1bShwLmEpID0gMTsKKyAgICAgICAgICAgUVVFUlkgUExBTiAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgSGFzaEFn Z3JlZ2F0ZQorICAgR3JvdXAgS2V5OiBxLmIKKyAgIEZpbHRlcjogKHN1bShxLmEpID0gMSkK KyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBxCisgICAgICAgICBGaWx0ZXI6IChhIElTIE5PVCBO VUxMKQorKDUgcm93cykKKworLS0gdXBkYXRlIGxhdGVyYWwgcmVmZXJlbmNlcyBhbmQgcmFu Z2UgdGFibGUgZW50cnkgcmVmZXJlbmNlCitleHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYp CitzZWxlY3QgMSBmcm9tIChzZWxlY3QgeC4qIGZyb20gc2ogeCwgc2ogeSB3aGVyZSB4LmEg PSB5LmEpIHEsCisgIGxhdGVyYWwgZ2VuZXJhdGVfc2VyaWVzKDEsIHEuYSkgZ3MoaSk7Cisg ICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIE5lc3RlZCBMb29wCisgICBPdXRwdXQ6IDEKKyAgIC0+ICBTZXEgU2NhbiBvbiBwdWJs aWMuc2ogeQorICAgICAgICAgT3V0cHV0OiB5LmEsIHkuYiwgeS5jCisgICAgICAgICBGaWx0 ZXI6ICh5LmEgSVMgTk9UIE5VTEwpCisgICAtPiAgRnVuY3Rpb24gU2NhbiBvbiBwZ19jYXRh bG9nLmdlbmVyYXRlX3NlcmllcyBncworICAgICAgICAgT3V0cHV0OiBncy5pCisgICAgICAg ICBGdW5jdGlvbiBDYWxsOiBnZW5lcmF0ZV9zZXJpZXMoMSwgeS5hKQorKDggcm93cykKKwor ZXhwbGFpbiAodmVyYm9zZSwgY29zdHMgb2ZmKQorc2VsZWN0IDEgZnJvbSAoc2VsZWN0IHku KiBmcm9tIHNqIHgsIHNqIHkgd2hlcmUgeC5hID0geS5hKSBxLAorICBsYXRlcmFsIGdlbmVy YXRlX3NlcmllcygxLCBxLmEpIGdzKGkpOworICAgICAgICAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgT3V0cHV0 OiAxCisgICAtPiAgU2VxIFNjYW4gb24gcHVibGljLnNqIHkKKyAgICAgICAgIE91dHB1dDog eS5hLCB5LmIsIHkuYworICAgICAgICAgRmlsdGVyOiAoeS5hIElTIE5PVCBOVUxMKQorICAg LT4gIEZ1bmN0aW9uIFNjYW4gb24gcGdfY2F0YWxvZy5nZW5lcmF0ZV9zZXJpZXMgZ3MKKyAg ICAgICAgIE91dHB1dDogZ3MuaQorICAgICAgICAgRnVuY3Rpb24gQ2FsbDogZ2VuZXJhdGVf c2VyaWVzKDEsIHkuYSkKKyg4IHJvd3MpCisKKy0tIFRlc3QgdGhhdCBhIG5vbi1FQy1kZXJp dmVkIGpvaW4gY2xhdXNlIGlzIHByb2Nlc3NlZCBjb3JyZWN0bHkuIFVzZSBhbgorLS0gb3V0 ZXIgam9pbiBzbyB0aGF0IHdlIGNhbid0IGZvcm0gYW4gRUMuCitleHBsYWluIChjb3N0cyBv ZmYpIHNlbGVjdCAqIGZyb20gc2ogcCBqb2luIHNqIHEgb24gcC5hID0gcS5hCisgIGxlZnQg am9pbiBzaiByIG9uIHAuYSArIHEuYSA9IHIuYTsKKyAgICAgICAgICAgICBRVUVSWSBQTEFO ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg TmVzdGVkIExvb3AgTGVmdCBKb2luCisgICBKb2luIEZpbHRlcjogKChxLmEgKyBxLmEpID0g ci5hKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIHEKKyAgICAgICAgIEZpbHRlcjogKGEgSVMg Tk9UIE5VTEwpCisgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBv biBzaiByCisoNiByb3dzKQorCistLSBGSVhNRSB0aGlzIGNvbnN0YW50IGZhbHNlIGZpbHRl ciBkb2Vzbid0IGxvb2sgZ29vZC4gU2hvdWxkIHdlIG1lcmdlCistLSBlcXVpdmFsZW5jZSBj bGFzc2VzPworZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiBwLCBzaiBx IHdoZXJlIHAuYSA9IHEuYSBhbmQgcC5iID0gMSBhbmQgcS5iID0gMjsKKyAgICAgICAgICAg ICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2Fu IG9uIHNqIHEKKyAgIEZpbHRlcjogKChhIElTIE5PVCBOVUxMKSBBTkQgKGIgPSAyKSBBTkQg KGIgPSAxKSkKKygyIHJvd3MpCisKKy0tIENoZWNrIHRoYXQgYXR0cl9uZWVkZWQgaXMgdXBk YXRlZCBjb3JyZWN0bHkgYWZ0ZXIgc2VsZi1qb2luIHJlbW92YWwuIEluIHRoaXMKKy0tIHRl c3QsIHRoZSBqb2luIG9mIGoxIHdpdGggajIgaXMgcmVtb3ZlZC4gazEuYiBpcyByZXF1aXJl ZCBhdCBlaXRoZXIgajEgb3IgajIuCistLSBJZiB0aGlzIGluZm8gaXMgbG9zdCwgam9pbiB0 YXJnZXRsaXN0IGZvciAoazEsIGsyKSB3aWxsIG5vdCBjb250YWluIGsxLmIuCistLSBVc2Ug aW5kZXggc2NhbiBmb3IgazEgc28gdGhhdCB3ZSBkb24ndCBnZXQgJ2InIGZyb20gcGh5c2lj YWwgdGxpc3QgdXNlZCBmb3IKKy0tIHNlcXNjYW4uIEFsc28gZGlzYWJsZSByZW9yZGVyaW5n IG9mIGpvaW5zIGJlY2F1c2UgdGhpcyB0ZXN0IGRlcGVuZHMgb24gYQorLS0gcGFydGljdWxh ciBqb2luIHRyZWUuCitjcmVhdGUgdGFibGUgc2sgKGEgaW50LCBiIGludCk7CitjcmVhdGUg aW5kZXggb24gc2soYSk7CitzZXQgam9pbl9jb2xsYXBzZV9saW1pdCB0byAxOworc2V0IGVu YWJsZV9zZXFzY2FuIHRvIG9mZjsKK2V4cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0IDEgZnJv bQorCShzayBrMSBqb2luIHNrIGsyIG9uIGsxLmEgPSBrMi5hKQorCWpvaW4gKHNqIGoxIGpv aW4gc2ogajIgb24gajEuYSA9IGoyLmEpIG9uIGoxLmIgPSBrMS5iOworICAgICAgICAgICAg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExv b3AKKyAgIEpvaW4gRmlsdGVyOiAoazEuYiA9IGoyLmIpCisgICAtPiAgTmVzdGVkIExvb3AK KyAgICAgICAgIC0+ICBJbmRleCBTY2FuIHVzaW5nIHNrX2FfaWR4IG9uIHNrIGsxCisgICAg ICAgICAtPiAgSW5kZXggT25seSBTY2FuIHVzaW5nIHNrX2FfaWR4IG9uIHNrIGsyCisgICAg ICAgICAgICAgICBJbmRleCBDb25kOiAoYSA9IGsxLmEpCisgICAtPiAgTWF0ZXJpYWxpemUK KyAgICAgICAgIC0+ICBJbmRleCBTY2FuIHVzaW5nIHNqX2Ffa2V5IG9uIHNqIGoyCisgICAg ICAgICAgICAgICBJbmRleCBDb25kOiAoYSBJUyBOT1QgTlVMTCkKKyg5IHJvd3MpCisKK2V4 cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0IDEgZnJvbQorCShzayBrMSBqb2luIHNrIGsyIG9u IGsxLmEgPSBrMi5hKQorCWpvaW4gKHNqIGoxIGpvaW4gc2ogajIgb24gajEuYSA9IGoyLmEp IG9uIGoyLmIgPSBrMS5iOworICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAoazEu YiA9IGoyLmIpCisgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgIC0+ICBJbmRleCBTY2Fu IHVzaW5nIHNrX2FfaWR4IG9uIHNrIGsxCisgICAgICAgICAtPiAgSW5kZXggT25seSBTY2Fu IHVzaW5nIHNrX2FfaWR4IG9uIHNrIGsyCisgICAgICAgICAgICAgICBJbmRleCBDb25kOiAo YSA9IGsxLmEpCisgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgIC0+ICBJbmRleCBTY2Fu IHVzaW5nIHNqX2Ffa2V5IG9uIHNqIGoyCisgICAgICAgICAgICAgICBJbmRleCBDb25kOiAo YSBJUyBOT1QgTlVMTCkKKyg5IHJvd3MpCisKK3Jlc2V0IGpvaW5fY29sbGFwc2VfbGltaXQ7 CityZXNldCBlbmFibGVfc2Vxc2NhbjsKK3NldCBzZWxmX2pvaW5fc2VhcmNoX2xpbWl0IHRv IDE7CitleHBsYWluIChjb3N0cyBvZmYpIC0tIE5vIG9uZSBzZWxmIGpvaW4gc2hvdWxkIGJl IGNvbGxhcHNlZAorICBzZWxlY3QgajEuKiBmcm9tIHNqIGoxLCBzaiBqMiwgc2ogajMgd2hl cmUgKGoxLmEgPSBqMi5hKSBhbmQgKGoyLmEgPSBqMy5hKTsKKyAgICAgICAgICAgICAgICBR VUVSWSBQTEFOICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6IChqMS5h ID0gajMuYSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBqMworICAgLT4gIE1hdGVyaWFsaXpl CisgICAgICAgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgICAgICAgIEpvaW4gRmlsdGVy OiAoajEuYSA9IGoyLmEpCisgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ogajEK KyAgICAgICAgICAgICAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgICAgICAgICAgICAg LT4gIFNlcSBTY2FuIG9uIHNqIGoyCisoOSByb3dzKQorCitzZXQgc2VsZl9qb2luX3NlYXJj aF9saW1pdCB0byAyOworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBDb2xsYXBzZSBvbmUgc2Vs ZiBqb2luCisgIHNlbGVjdCBqMS4qIGZyb20gc2ogajEsIHNqIGoyLCBzaiBqMyB3aGVyZSAo ajEuYSA9IGoyLmEpIGFuZCAoajIuYSA9IGozLmEpOworICAgICAgICAgICAgICBRVUVSWSBQ TEFOICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6IChqMi5hID0gajMuYSkKKyAg IC0+ICBTZXEgU2NhbiBvbiBzaiBqMworICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAt PiAgU2VxIFNjYW4gb24gc2ogajIKKyAgICAgICAgICAgICAgIEZpbHRlcjogKGEgSVMgTk9U IE5VTEwpCisoNiByb3dzKQorCitzZXQgc2VsZl9qb2luX3NlYXJjaF9saW1pdCB0byAzOwor ZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBDb2xsYXBzZSBib3RoIHNlbGYgam9pbnMKKyAgc2Vs ZWN0IGoxLiogZnJvbSBzaiBqMSwgc2ogajIsIHNqIGozIHdoZXJlIChqMS5hID0gajIuYSkg YW5kIChqMi5hID0gajMuYSk7CisgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHNqIGozCisgICBGaWx0ZXI6 IChhIElTIE5PVCBOVUxMKQorKDIgcm93cykKKworcmVzZXQgc2VsZl9qb2luX3NlYXJjaF9s aW1pdDsKKy0tIENoZWNrIHRoYXQgY2xhdXNlcyBmcm9tIHRoZSBqb2luIGZpbHRlciBsaXN0 IGlzIG5vdCBsb3N0IG9uIHRoZSBzZWxmLWpvaW4gcmVtb3ZhbAorQ1JFQVRFIFRBQkxFIGVt cDEgKCBpZCBTRVJJQUwgUFJJTUFSWSBLRVkgTk9UIE5VTEwsIGNvZGUgaW50KTsKK2V4cGxh aW4gKHZlcmJvc2UsIGNvc3RzIG9mZikKK1NFTEVDVCAqIEZST00gZW1wMSBlMSwgZW1wMSBl MiBXSEVSRSBlMS5pZCA9IGUyLmlkIEFORCBlMi5jb2RlIDw+IGUxLmNvZGU7CisgICAgICAg ICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCisgU2VxIFNjYW4gb24gcHVibGljLmVtcDEgZTIKKyAgIE91dHB1dDogZTIuaWQsIGUy LmNvZGUsIGUyLmlkLCBlMi5jb2RlCisgICBGaWx0ZXI6ICgoZTIuaWQgSVMgTk9UIE5VTEwp IEFORCAoZTIuY29kZSA8PiBlMi5jb2RlKSkKKygzIHJvd3MpCisKKy0tIFdlIGNhbiByZW1v dmUgdGhlIGpvaW4gZXZlbiBpZiB3ZSBmaW5kIHRoZSBqb2luIGNhbid0IGR1cGxpY2F0ZSBy b3dzIGFuZAorLS0gdGhlIGJhc2UgcXVhbHMgb2YgZWFjaCBzaWRlIGFyZSBkaWZmZXJlbnQu ICBJbiB0aGUgZm9sbG93aW5nIGNhc2Ugd2UgZW5kIHVwCistLSBtb3ZpbmcgcXVhbHMgb3Zl ciB0byBzMSB0byBtYWtlIGl0IHNvIGl0IGNhbid0IG1hdGNoIGFueSByb3dzLgorY3JlYXRl IHRhYmxlIHNsKGEgaW50LCBiIGludCwgYyBpbnQpOworY3JlYXRlIHVuaXF1ZSBpbmRleCBv biBzbChhLCBiKTsKK3ZhY3V1bSBhbmFseXplIHNsOworLS0gQm90aCBzaWRlcyBhcmUgdW5p cXVlLCBidXQgYmFzZSBxdWFscyBhcmUgZGlmZmVyZW50CitleHBsYWluIChjb3N0cyBvZmYp CitzZWxlY3QgKiBmcm9tIHNsIHQxLCBzbCB0MiB3aGVyZSB0MS5hID0gdDIuYSBhbmQgdDEu YiA9IDEgYW5kIHQyLmIgPSAyOworICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBG aWx0ZXI6ICh0MS5hID0gdDIuYSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzbCB0MQorICAgICAg ICAgRmlsdGVyOiAoYiA9IDEpCisgICAtPiAgU2VxIFNjYW4gb24gc2wgdDIKKyAgICAgICAg IEZpbHRlcjogKGIgPSAyKQorKDYgcm93cykKKworLS0gQ2hlY2sgTnVsbFRlc3QgaW4gYmFz ZXJlc3RyaWN0aW5mbyBsaXN0CitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9t IHNsIHQxLCBzbCB0Mgord2hlcmUgdDEuYSA9IHQyLmEgYW5kIHQxLmIgPSAxIGFuZCB0Mi5i ID0gMgorICBhbmQgdDEuYyBJUyBOT1QgTlVMTCBhbmQgdDIuYyBJUyBOT1QgTlVMTAorICBh bmQgdDIuYiBJUyBOT1QgTlVMTCBhbmQgdDEuYiBJUyBOT1QgTlVMTAorICBhbmQgdDEuYSBJ UyBOT1QgTlVMTCBhbmQgdDIuYSBJUyBOT1QgTlVMTDsKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVz dGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAodDEuYSA9IHQyLmEpCisgICAtPiAgU2VxIFNj YW4gb24gc2wgdDEKKyAgICAgICAgIEZpbHRlcjogKChjIElTIE5PVCBOVUxMKSBBTkQgKGIg SVMgTk9UIE5VTEwpIEFORCAoYSBJUyBOT1QgTlVMTCkgQU5EIChiID0gMSkpCisgICAtPiAg U2VxIFNjYW4gb24gc2wgdDIKKyAgICAgICAgIEZpbHRlcjogKChjIElTIE5PVCBOVUxMKSBB TkQgKGIgSVMgTk9UIE5VTEwpIEFORCAoYSBJUyBOT1QgTlVMTCkgQU5EIChiID0gMikpCiso NiByb3dzKQorCitleHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9t IHNsIHQxLCBzbCB0Mgord2hlcmUgdDEuYiA9IHQyLmIgYW5kIHQyLmEgPSAzIGFuZCB0MS5h ID0gMworICBhbmQgdDEuYyBJUyBOT1QgTlVMTCBhbmQgdDIuYyBJUyBOT1QgTlVMTAorICBh bmQgdDIuYiBJUyBOT1QgTlVMTCBhbmQgdDEuYiBJUyBOT1QgTlVMTAorICBhbmQgdDEuYSBJ UyBOT1QgTlVMTCBhbmQgdDIuYSBJUyBOT1QgTlVMTDsKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgU2VxIFNjYW4gb24gcHVibGljLnNsIHQyCisgICBPdXRwdXQ6IHQyLmEsIHQy LmIsIHQyLmMsIHQyLmEsIHQyLmIsIHQyLmMKKyAgIEZpbHRlcjogKCh0Mi5jIElTIE5PVCBO VUxMKSBBTkQgKHQyLmIgSVMgTk9UIE5VTEwpIEFORCAodDIuYSBJUyBOT1QgTlVMTCkgQU5E ICh0Mi5hID0gMykpCisoMyByb3dzKQorCistLSBKb2luIHF1YWwgaXNuJ3QgbWVyZ2Vqb2lu YWJsZSwgYnV0IGlubmVyIGlzIHVuaXF1ZS4KK2V4cGxhaW4gKENPU1RTIE9GRikKK1NFTEVD VCBuMi5hIEZST00gc2ogbjEsIHNqIG4yIFdIRVJFIG4xLmEgPD4gbjIuYSBBTkQgbjIuYSA9 IDE7CisgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAobjEuYSA8 PiBuMi5hKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIG4yCisgICAgICAgICBGaWx0ZXI6IChh ID0gMSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBuMQorKDUgcm93cykKKworZXhwbGFpbiAo Q09TVFMgT0ZGKQorU0VMRUNUICogRlJPTQorCShTRUxFQ1QgbjIuYSBGUk9NIHNqIG4xLCBz aiBuMiBXSEVSRSBuMS5hIDw+IG4yLmEpIHEwLCBzbAorV0hFUkUgcTAuYSA9IDE7CisgICAg ICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAobjEuYSA8PiBuMi5hKQor ICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2wKKyAgICAg ICAgIC0+ICBTZXEgU2NhbiBvbiBzaiBuMgorICAgICAgICAgICAgICAgRmlsdGVyOiAoYSA9 IDEpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogbjEKKyg3IHJvd3MpCisKKy0tCistLS0tIE9u bHkgb25lIHNpZGUgaXMgdW5xaXVlCistLXNlbGVjdCAqIGZyb20gc2wgdDEsIHNsIHQyIHdo ZXJlIHQxLmEgPSB0Mi5hIGFuZCB0MS5iID0gMTsKKy0tc2VsZWN0ICogZnJvbSBzbCB0MSwg c2wgdDIgd2hlcmUgdDEuYSA9IHQyLmEgYW5kIHQyLmIgPSAxOworLS0KKy0tLS0gU2V2ZXJh bCB1bmlxdWVzIGluZGV4ZXMgbWF0Y2gsIGFuZCB3ZSBzZWxlY3QgYSBkaWZmZXJlbnQgb25l CistLS0tIGZvciBlYWNoIHNpZGUsIHNvIHRoZSBqb2luIGlzIG5vdCByZW1vdmVkCistLWNy ZWF0ZSB0YWJsZSBzbShhIGludCB1bmlxdWUsIGIgaW50IHVuaXF1ZSwgYyBpbnQgdW5pcXVl KTsKKy0tZXhwbGFpbiAoY29zdHMgb2ZmKQorLS1zZWxlY3QgKiBmcm9tIHNtIG0sIHNtIG4g d2hlcmUgbS5hID0gbi5iIGFuZCBtLmMgPSBuLmM7CistLWV4cGxhaW4gKGNvc3RzIG9mZikK Ky0tc2VsZWN0ICogZnJvbSBzbSBtLCBzbSBuIHdoZXJlIG0uYSA9IG4uYyBhbmQgbS5iID0g bi5iOworLS1leHBsYWluIChjb3N0cyBvZmYpCistLXNlbGVjdCAqIGZyb20gc20gbSwgc20g biB3aGVyZSBtLmMgPSBuLmIgYW5kIG0uYSA9IG4uYTsKKy0tIENoZWNrIG9wdGltaXphdGlv biBkaXNhYmxpbmcgaWYgaXQgd2lsbCB2aW9sYXRlIHNwZWNpYWwgam9pbiBjb25kaXRpb25z LgorLS0gVHdvIGlkZW50aWNhbCBqb2luZWQgcmVsYXRpb25zIHNhdGlzZmllcyBzZWxmIGpv aW4gcmVtb3ZhbCBjb25kaXRpb25zIGJ1dAorLS0gc3RheSBpbiBkaWZmZXJlbnQgc3BlY2lh bCBqb2luIGluZm9zLgorQ1JFQVRFIFRBQkxFIHNqX3QxIChpZCBzZXJpYWwsIGEgaW50KTsK K0NSRUFURSBUQUJMRSBzal90MiAoaWQgc2VyaWFsLCBhIGludCk7CitDUkVBVEUgVEFCTEUg c2pfdDMgKGlkIHNlcmlhbCwgYSBpbnQpOworQ1JFQVRFIFRBQkxFIHNqX3Q0IChpZCBzZXJp YWwsIGEgaW50KTsKK0NSRUFURSBVTklRVUUgSU5ERVggT04gc2pfdDMgVVNJTkcgYnRyZWUg KGEsaWQpOworQ1JFQVRFIFVOSVFVRSBJTkRFWCBPTiBzal90MiBVU0lORyBidHJlZSAoaWQp OworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTSBzal90MQorSk9JTiAoCisJ U0VMRUNUIHNqX3QyLmlkIEFTIGlkIEZST00gc2pfdDIKKwlXSEVSRSBFWElTVFMKKwkJKAor CQlTRUxFQ1QgVFJVRSBGUk9NIHNqX3QzLHNqX3Q0IFdIRVJFIHNqX3QzLmEgPSAxIEFORCBz al90My5pZCA9IHNqX3QyLmlkCisJCSkKKwkpIHQydDN0NAorT04gc2pfdDEuaWQgPSB0MnQz dDQuaWQKK0pPSU4gKAorCVNFTEVDVCBzal90Mi5pZCBBUyBpZCBGUk9NIHNqX3QyCisJV0hF UkUgRVhJU1RTCisJCSgKKwkJU0VMRUNUIFRSVUUgRlJPTSBzal90Myxzal90NCBXSEVSRSBz al90My5hID0gMSBBTkQgc2pfdDMuaWQgPSBzal90Mi5pZAorCQkpCisJKSBfdDJ0M3Q0CitP TiBzal90MS5pZCA9IF90MnQzdDQuaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAg IEpvaW4gRmlsdGVyOiAoc2pfdDMuaWQgPSBzal90MS5pZCkKKyAgIC0+ICBOZXN0ZWQgTG9v cAorICAgICAgICAgSm9pbiBGaWx0ZXI6IChzal90Mi5pZCA9IHNqX3QzLmlkKQorICAgICAg ICAgLT4gIE5lc3RlZCBMb29wIFNlbWkgSm9pbgorICAgICAgICAgICAgICAgLT4gIE5lc3Rl ZCBMb29wCisgICAgICAgICAgICAgICAgICAgICAtPiAgSGFzaEFnZ3JlZ2F0ZQorICAgICAg ICAgICAgICAgICAgICAgICAgICAgR3JvdXAgS2V5OiBzal90My5pZAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2pfdDQKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgLT4gIEJpdG1hcCBIZWFwIFNjYW4gb24gc2pfdDMKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY2hlY2sgQ29uZDogKGEg PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4g IEJpdG1hcCBJbmRleCBTY2FuIG9uIHNqX3QzX2FfaWRfaWR4CisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoYSA9IDEp CisgICAgICAgICAgICAgICAgICAgICAtPiAgSW5kZXggT25seSBTY2FuIHVzaW5nIHNqX3Qy X2lkX2lkeCBvbiBzal90MiBzal90Ml8xCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJ bmRleCBDb25kOiAoaWQgPSBzal90My5pZCkKKyAgICAgICAgICAgICAgIC0+ICBOZXN0ZWQg TG9vcAorICAgICAgICAgICAgICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyBz al90M19hX2lkX2lkeCBvbiBzal90MyBzal90M18xCisgICAgICAgICAgICAgICAgICAgICAg ICAgICBJbmRleCBDb25kOiAoKGEgPSAxKSBBTkQgKGlkID0gc2pfdDMuaWQpKQorICAgICAg ICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqX3Q0IHNqX3Q0XzEKKyAgICAgICAg IC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgc2pfdDJfaWRfaWR4IG9uIHNqX3QyCisgICAg ICAgICAgICAgICBJbmRleCBDb25kOiAoaWQgPSBzal90Ml8xLmlkKQorICAgLT4gIFNlcSBT Y2FuIG9uIHNqX3QxCisoMjQgcm93cykKKworLS0KKy0tIFRlc3QgUm93TWFya3MtcmVsYXRl ZCBjb2RlCistLQorLS0gVE9ETzogV2h5IHRoaXMgc2VsZWN0IHJldHVybnMgdHdvIGNvcGll cyBvZiBjdGlkIGZpZWxkPyBTaG91bGQgd2UgZml4IGl0PworRVhQTEFJTiAoQ09TVFMgT0ZG KSAtLSBCb3RoIHNpZGVzIGhhdmUgZXhwbGljaXQgTG9ja1Jvd3MgbWFya3MKK1NFTEVDVCBh MS5hIEZST00gc2ogYTEsc2ogYTIgV0hFUkUgKGExLmE9YTIuYSkgRk9SIFVQREFURTsKKyAg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgTG9ja1Jvd3MKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBhMgorICAg ICAgICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKygzIHJvd3MpCisKK0VYUExBSU4gKENP U1RTIE9GRikgLS0gQSBSb3dNYXJrIGV4aXN0cyBmb3IgdGhlIHRhYmxlIGJlaW5nIGtlcHQK K1VQREFURSBzaiBzcSBTRVQgYiA9IDEgRlJPTSBzaiBhcyBzeiBXSEVSRSBzcS5hID0gc3ou YTsKKyAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgVXBkYXRlIG9uIHNqIHNxCisgICAtPiAgU2VxIFNjYW4g b24gc2ogc3oKKyAgICAgICAgIEZpbHRlcjogKGEgSVMgTk9UIE5VTEwpCisoMyByb3dzKQor CitDUkVBVEUgUlVMRSBzal9kZWxfcnVsZSBBUyBPTiBERUxFVEUgVE8gc2oKKyAgRE8gSU5T VEVBRAorICAgIFVQREFURSBzaiBTRVQgYSA9IDEgV0hFUkUgYSA9IG9sZC5hOworRVhQTEFJ TiAoQ09TVFMgT0ZGKSBERUxFVEUgRlJPTSBzajsgLS0gQSBSb3dNYXJrIGV4aXN0cyBmb3Ig dGhlIHRhYmxlIGJlaW5nIGRyb3BwZWQKKyAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgVXBkYXRlIG9uIHNq CisgICAtPiAgU2VxIFNjYW4gb24gc2oKKyAgICAgICAgIEZpbHRlcjogKGEgSVMgTk9UIE5V TEwpCisoMyByb3dzKQorCitEUk9QIFJVTEUgc2pfZGVsX3J1bGUgT04gc2ogQ0FTQ0FERTsK K3Jlc2V0IGVuYWJsZV9oYXNoam9pbjsKK3Jlc2V0IGVuYWJsZV9tZXJnZWpvaW47CiAtLQog LS0gVGVzdCBoaW50cyBnaXZlbiBvbiBpbmNvcnJlY3QgY29sdW1uIHJlZmVyZW5jZXMgYXJl IHVzZWZ1bAogLS0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3lz dmlld3Mub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zeXN2aWV3cy5vdXQKaW5k ZXggMDAxYzZlN2ViOS4uMzA2MjY4NjYxNiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVz cy9leHBlY3RlZC9zeXN2aWV3cy5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3Rl ZC9zeXN2aWV3cy5vdXQKQEAgLTEyOSwxMCArMTI5LDExIEBAIHNlbGVjdCBuYW1lLCBzZXR0 aW5nIGZyb20gcGdfc2V0dGluZ3Mgd2hlcmUgbmFtZSBsaWtlICdlbmFibGUlJzsKICBlbmFi bGVfcGFydGl0aW9ud2lzZV9hZ2dyZWdhdGUgfCBvZmYKICBlbmFibGVfcGFydGl0aW9ud2lz ZV9qb2luICAgICAgfCBvZmYKICBlbmFibGVfcHJlc29ydGVkX2FnZ3JlZ2F0ZSAgICAgfCBv bgorIGVuYWJsZV9zZWxmX2pvaW5fcmVtb3ZhbCAgICAgICB8IG9uCiAgZW5hYmxlX3NlcXNj YW4gICAgICAgICAgICAgICAgIHwgb24KICBlbmFibGVfc29ydCAgICAgICAgICAgICAgICAg ICAgfCBvbgogIGVuYWJsZV90aWRzY2FuICAgICAgICAgICAgICAgICB8IG9uCi0oMjEgcm93 cykKKygyMiByb3dzKQogCiAtLSBUZXN0IHRoYXQgdGhlIHBnX3RpbWV6b25lX25hbWVzIGFu ZCBwZ190aW1lem9uZV9hYmJyZXZzIHZpZXdzIGFyZQogLS0gbW9yZS1vci1sZXNzIHdvcmtp bmcuICBXZSBjYW4ndCB0ZXN0IHRoZWlyIGNvbnRlbnRzIGluIGFueSBncmVhdCBkZXRhaWwK ZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2VxdWl2Y2xhc3Muc3FsIGIvc3Jj L3Rlc3QvcmVncmVzcy9zcWwvZXF1aXZjbGFzcy5zcWwKaW5kZXggMjQ3YjBhMzEwNS4uNzdk ZDk2NGViZiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZXF1aXZjbGFzcy5z cWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZXF1aXZjbGFzcy5zcWwKQEAgLTI1OSw2 ICsyNTksMjIgQEAgZHJvcCB1c2VyIHJlZ3Jlc3NfdXNlcl9lY3Rlc3Q7CiBleHBsYWluIChj b3N0cyBvZmYpCiAgIHNlbGVjdCAqIGZyb20gdGVuazEgd2hlcmUgdW5pcXVlMSA9IHVuaXF1 ZTEgYW5kIHVuaXF1ZTIgPSB1bmlxdWUyOwogCistLSBUZXN0IHRoYXQgYnJva2VuIEVDcyBh cmUgcHJvY2Vzc2VkIGNvcnJlY3RseSBkdXJpbmcgc2VsZiBqb2luIHJlbW92YWwuCistLSBE aXNhYmxlIG1lcmdlIGpvaW5zIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGFuIGVycm9yIGFib3V0 IG1pc3NpbmcgY29tbXV0YXRvci4KKy0tIFRlc3QgYm90aCBvcmllbnRhdGlvbnMgb2YgdGhl IGpvaW4gY2xhdXNlLCBiZWNhdXNlIG9ubHkgb25lIG9mIHRoZW0gYnJlYWtzCistLSB0aGUg RUMuCitzZXQgZW5hYmxlX21lcmdlam9pbiB0byBvZmY7CisKK2V4cGxhaW4gKGNvc3RzIG9m ZikKKyAgc2VsZWN0ICogZnJvbSBlYzAgbSBqb2luIGVjMCBuIG9uIG0uZmYgPSBuLmZmCisg IGpvaW4gZWMxIHAgb24gbS5mZiArIG4uZmYgPSBwLmYxOworCitleHBsYWluIChjb3N0cyBv ZmYpCisgIHNlbGVjdCAqIGZyb20gZWMwIG0gam9pbiBlYzAgbiBvbiBtLmZmID0gbi5mZgor ICBqb2luIGVjMSBwIG9uIHAuZjE6OmludDggPSAobS5mZiArIG4uZmYpOjppbnQ4YWxpYXMx OworCityZXNldCBlbmFibGVfbWVyZ2Vqb2luOworCiAtLSB0aGlzIGNvdWxkIGJlIGNvbnZl cnRlZCwgYnV0IGlzbid0IGF0IHByZXNlbnQKIGV4cGxhaW4gKGNvc3RzIG9mZikKICAgc2Vs ZWN0ICogZnJvbSB0ZW5rMSB3aGVyZSB1bmlxdWUxID0gdW5pcXVlMSBvciB1bmlxdWUyID0g dW5pcXVlMjsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pvaW4uc3FsIGIv c3JjL3Rlc3QvcmVncmVzcy9zcWwvam9pbi5zcWwKaW5kZXggM2U1MDMyYjA0ZC4uYTE3MGE5 YmJkMCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvam9pbi5zcWwKKysrIGIv c3JjL3Rlc3QvcmVncmVzcy9zcWwvam9pbi5zcWwKQEAgLTIzMDksNiArMjMwOSwzNTcgQEAg c2VsZWN0ICogZnJvbQogc2VsZWN0ICogZnJvbQogICBpbnQ4X3RibCB4IGpvaW4gKGludDRf dGJsIHggY3Jvc3Mgam9pbiBpbnQ0X3RibCB5KGZmKSkgaiBvbiBxMSA9IGYxOyAtLSBvawog CistLQorLS0gdGVzdCB0aGF0IHNlbWktIG9yIGlubmVyIHNlbGYtam9pbnMgb24gYSB1bmlx dWUgY29sdW1uIGFyZSByZW1vdmVkCistLQorCistLSBlbmFibGUgb25seSBuZXN0bG9vcCB0 byBnZXQgbW9yZSBwcmVkaWN0YWJsZSBwbGFucworc2V0IGVuYWJsZV9oYXNoam9pbiB0byBv ZmY7CitzZXQgZW5hYmxlX21lcmdlam9pbiB0byBvZmY7CisKK2NyZWF0ZSB0YWJsZSBzaiAo YSBpbnQgdW5pcXVlLCBiIGludCwgYyBpbnQgdW5pcXVlKTsKK2luc2VydCBpbnRvIHNqIHZh bHVlcyAoMSwgbnVsbCwgMiksIChudWxsLCAyLCBudWxsKSwgKDIsIDEsIDEpOworYW5hbHl6 ZSBzajsKKworLS0gVHJpdmlhbCBzZWxmLWpvaW4gY2FzZS4KK2V4cGxhaW4gKGNvc3RzIG9m ZikKK3NlbGVjdCBwLiogZnJvbSBzaiBwLCBzaiBxIHdoZXJlIHEuYSA9IHAuYSBhbmQgcS5i ID0gcS5hIC0gMTsKK3NlbGVjdCBwLiogZnJvbSBzaiBwLCBzaiBxIHdoZXJlIHEuYSA9IHAu YSBhbmQgcS5iID0gcS5hIC0gMTsKKworLS0gU2VsZi1qb2luIHJlbW92YWwgcGVyZm9ybXMg YWZ0ZXIgYSBzdWJxdWVyeSBwdWxsLXVwIHByb2Nlc3MgYW5kIGNvdWxkIHJlbW92ZQorLS0g c3VjaCBraW5kIG9mIHNlbGYtam9pbiB0b28uIENoZWNrIHRoaXMgb3B0aW9uLgorZXhwbGFp biAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiBwCit3aGVyZSBleGlzdHMgKHNlbGVj dCAqIGZyb20gc2ogcQorCQkJCXdoZXJlIHEuYSA9IHAuYSBhbmQgcS5iIDwgMTApOworc2Vs ZWN0ICogZnJvbSBzaiBwIHdoZXJlIGV4aXN0cyAoc2VsZWN0ICogZnJvbSBzaiBxIHdoZXJl IHEuYSA9IHAuYSBhbmQgcS5iIDwgMTApOworCistLSBEb24ndCByZW1vdmUgc2VsZi1qb2lu IGZvciB0aGUgY2FzZSBvZiBlcXVhbGl0eSBvZiB0d28gZGlmZmVyZW50IHVuaXF1ZSBjb2x1 bW5zLgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB0MSwgc2ogdDIg d2hlcmUgdDEuYSA9IHQyLmMgYW5kIHQxLmIgaXMgbm90IG51bGw7CisKKy0tIERlZ2VuZXJh dGVkIGNhc2UuCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tCisJKHNlbGVj dCBhIGFzIHggZnJvbSBzaiB3aGVyZSBmYWxzZSkgYXMgcTEsCisJKHNlbGVjdCBhIGFzIHkg ZnJvbSBzaiB3aGVyZSBmYWxzZSkgYXMgcTIKK3doZXJlIHExLnggPSBxMi55OworCistLSBX ZSBjYW4ndCB1c2UgYSBjcm9zcy1FQyBnZW5lcmF0ZWQgc2VsZiBqb2luIHF1YWwgYmVjYXVz ZSBvZiBjdXJyZW50IGxvZ2ljIG9mCistLSB0aGUgZ2VuZXJhdGVfam9pbl9pbXBsaWVkX2Vx dWFsaXRpZXMgcm91dGluZS4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20g c2ogdDEsIHNqIHQyIHdoZXJlIHQxLmEgPSB0MS5iIGFuZCB0MS5iID0gdDIuYiBhbmQgdDIu YiA9IHQyLmE7CitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHQxLCBz aiB0Miwgc2ogdDMKK3doZXJlIHQxLmEgPSB0MS5iIGFuZCB0MS5iID0gdDIuYiBhbmQgdDIu YiA9IHQyLmEKKwlhbmQgdDEuYiA9IHQzLmIgYW5kIHQzLmIgPSB0My5hOworCistLSBEb3Vi bGUgc2VsZi1qb2luIHJlbW92YWwuCistLSBVc2UgYSBjb25kaXRpb24gb24gImIgKyAxIiwg bm90IG9uICJiIiwgZm9yIHRoZSBzZWNvbmQgam9pbiwgc28gdGhhdAorLS0gdGhlIGVxdWl2 YWxlbmNlIGNsYXNzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBmaXJzdCBvbmUsIGFuZCB3ZSBj YW4KKy0tIHRlc3QgdGhlIG5vbi1lYyBjb2RlIHBhdGguCitleHBsYWluIChjb3N0cyBvZmYp CitzZWxlY3QgKiBmcm9tIHNqIHQxIGpvaW4gc2ogdDIgb24gdDEuYSA9IHQyLmEgYW5kIHQx LmIgPSB0Mi5iCisJam9pbiBzaiB0MyBvbiB0Mi5hID0gdDMuYSBhbmQgdDIuYiArIDEgPSB0 My5iICsgMTsKKworLS0gc3Vic2VsZWN0IHRoYXQgcmVmZXJlbmNlcyB0aGUgcmVtb3ZlZCBy ZWxhdGlvbgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0IHQxLmEsIChzZWxlY3QgYSBm cm9tIHNqIHdoZXJlIGEgPSB0Mi5hIGFuZCBhID0gdDEuYSkKK2Zyb20gc2ogdDEsIHNqIHQy Cit3aGVyZSB0MS5hID0gdDIuYTsKKworLS0gc2VsZi1qb2luIHVuZGVyIG91dGVyIGpvaW4K K2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogeCBqb2luIHNqIHkgb24g eC5hID0geS5hCitsZWZ0IGpvaW4gaW50OF90YmwgeiBvbiB4LmEgPSB6LnExOworCitleHBs YWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHggam9pbiBzaiB5IG9uIHguYSA9 IHkuYQorbGVmdCBqb2luIGludDhfdGJsIHogb24geS5hID0gei5xMTsKKworZXhwbGFpbiAo Y29zdHMgb2ZmKQorU0VMRUNUICogRlJPTSAoCisgIFNFTEVDVCB0MS4qLCB0Mi5hIEFTIGF4 IEZST00gc2ogdDEgSk9JTiBzaiB0MgorICBPTiAodDEuYSA9IHQyLmEgQU5EIHQxLmMqdDEu YyA9IHQyLmMrMiBBTkQgdDIuYiBJUyBOVUxMKQorKSBBUyBxMQorTEVGVCBKT0lOCisgIChT RUxFQ1QgdDMuKiBGUk9NIHNqIHQzLCBzaiB0NCBXSEVSRSB0My5jID0gdDQuYykgQVMgcTIK K09OIHExLmF4ID0gcTIuYTsKKworLS0gVGVzdCB0aGF0IHBsYWNlaG9sZGVycyBhcmUgdXBk YXRlZCBjb3JyZWN0bHkgYWZ0ZXIgam9pbiByZW1vdmFsCitleHBsYWluIChjb3N0cyBvZmYp CitzZWxlY3QgKiBmcm9tICh2YWx1ZXMgKDEpKSB4CitsZWZ0IGpvaW4gKHNlbGVjdCBjb2Fs ZXNjZSh5LnExLCAxKSBmcm9tIGludDhfdGJsIHkKKwlyaWdodCBqb2luIHNqIGoxIGlubmVy IGpvaW4gc2ogajIgb24gajEuYSA9IGoyLmEKKwlvbiB0cnVlKSB6CitvbiB0cnVlOworCist LQorLS0gU0pSIGNvcm5lciBjYXNlOiB1bmlxdWVuZXNzIG9mIGFuIGlubmVyIGlzIFtwYXJ0 aWFsbHldIGRlcml2ZWQgZnJvbQorLS0gYmFzZXJlc3RyaWN0aW5mbyBjbGF1c2VzLgorLS0g WFhYOiBXZSByZWFsbHkgc2hvdWxkIGFsbG93IFNKUiBmb3IgdGhlc2UgY29ybmVyIGNhc2Vz PworLS0KKworSU5TRVJUIElOVE8gc2ogVkFMVUVTICgzLCAxLCAzKTsKKworZXhwbGFpbiAo Y29zdHMgb2ZmKSAtLSBEb24ndCByZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBz aiBqMiBXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSA9IDIgQU5EIGoyLmEgPSAzOworU0VM RUNUICogRlJPTSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0g MiBBTkQgajIuYSA9IDM7IC0tIFJldHVybiBvbmUgcm93CisKK2V4cGxhaW4gKGNvc3RzIG9m ZikgLS0gUmVtb3ZlIFNKLCBkZWZpbmUgdW5pcXVlbmVzcyBieSBhIGNvbnN0YW50CisJU0VM RUNUICogRlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEgPSAy IEFORCBqMi5hID0gMjsKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5i ID0gajIuYiBBTkQgajEuYSA9IDIgQU5EIGoyLmEgPSAyOyAtLSBSZXR1cm4gb25lIHJvdwor CitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorV0hF UkUgajEuYiA9IGoyLmIKKyAgQU5EIGoxLmEgPSAoRVhUUkFDVChET1cgRlJPTSBjdXJyZW50 X3RpbWVzdGFtcCgwKSkvMTUgKyAzKTo6aW50CisgIEFORCAoRVhUUkFDVChET1cgRlJPTSBj dXJyZW50X3RpbWVzdGFtcCgwKSkvMTUgKyAzKTo6aW50ID0gajIuYQorOyAtLSBSZW1vdmUg U0osIGRlZmluZSB1bmlxdWVuZXNzIGJ5IGEgY29uc3RhbnQgZXhwcmVzc2lvbgorU0VMRUNU ICogRlJPTSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iCisgIEFORCBqMS5hID0g KEVYVFJBQ1QoRE9XIEZST00gY3VycmVudF90aW1lc3RhbXAoMCkpLzE1ICsgMyk6OmludAor ICBBTkQgKEVYVFJBQ1QoRE9XIEZST00gY3VycmVudF90aW1lc3RhbXAoMCkpLzE1ICsgMyk6 OmludCA9IGoyLmEKKzsgLS0gUmV0dXJuIG9uZSByb3cKKworZXhwbGFpbiAoY29zdHMgb2Zm KSAtLSBSZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMiBXSEVSRSBqMS5i ID0gajIuYiBBTkQgajEuYSA9IDEgQU5EIGoyLmEgPSAxOworU0VMRUNUICogRlJPTSBzaiBq MSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMSBBTkQgajIuYSA9IDE7 IC0tIFJldHVybiBubyByb3dzCisKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gU2h1ZmZsZSBh IGNsYXVzZS4gUmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIgV0hFUkUg ajEuYiA9IGoyLmIgQU5EIDEgPSBqMS5hIEFORCBqMi5hID0gMTsKK1NFTEVDVCAqIEZST00g c2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIuYiBBTkQgMSA9IGoxLmEgQU5EIGoyLmEg PSAxOyAtLSBSZXR1cm4gbm8gcm93cworCistLSBTSkUgQ29ybmVyIGNhc2U6IGEgJ2EueD1h LngnIGNsYXVzZSwgaGF2ZSByZXBsYWNlZCB3aXRoICdhLnggSVMgTk9UIE5VTEwnCistLSBh ZnRlciBTSiBlbGltaW5hdGlvbiBpdCBzaG91bGRuJ3QgYmUgYSBtZXJnZWpvaW5hYmxlIGNs YXVzZS4KK1NFTEVDVCB0NC4qCitGUk9NIChTRUxFQ1QgdDEuKiwgdDIuYSBBUyBhMSBGUk9N IHNqIHQxLCBzaiB0MiBXSEVSRSB0MS5iID0gdDIuYikgQVMgdDMKK0pPSU4gc2ogdDQgT04g KHQ0LmEgPSB0My5hKSBXSEVSRSB0My5hMSA9IDQyOworRVhQTEFJTiAoQ09TVFMgT0ZGKQor U0VMRUNUIHQ0LioKK0ZST00gKFNFTEVDVCB0MS4qLCB0Mi5hIEFTIGExIEZST00gc2ogdDEs IHNqIHQyIFdIRVJFIHQxLmIgPSB0Mi5iKSBBUyB0MworSk9JTiBzaiB0NCBPTiAodDQuYSA9 IHQzLmEpIFdIRVJFIHQzLmExID0gNDIKKzsgLS0gU0pzIG11c3QgYmUgcmVtb3ZlZC4KKwor LS0gRnVuY3Rpb25hbCBpbmRleAorQ1JFQVRFIFVOSVFVRSBJTkRFWCBzal9mbl9pZHggT04g c2ooKGEgKiBhKSk7CitleHBsYWluIChjb3N0cyBvZmYpIC0tIFJlbW92ZSBTSgorCVNFTEVD VCAqIEZST00gc2ogajEsIHNqIGoyCisJV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEqajEu YSA9IDEgQU5EIGoyLmEqajIuYSA9IDE7CitleHBsYWluIChjb3N0cyBvZmYpIC0tIERvbid0 IHJlbW92ZSBTSgorCVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCisJV0hFUkUgajEuYiA9 IGoyLmIgQU5EIGoxLmEqajEuYSA9IDEgQU5EIGoyLmEqajIuYSA9IDI7CitFWFBMQUlOIChD T1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorV0hFUkUgajEuYiA9IGoy LmIKKyAgQU5EIChqMS5hKmoxLmEpID0gKEVYVFJBQ1QoRE9XIEZST00gY3VycmVudF90aW1l c3RhbXAoMCkpLzE1ICsgMyk6OmludAorICBBTkQgKEVYVFJBQ1QoRE9XIEZST00gY3VycmVu dF90aW1lc3RhbXAoMCkpLzE1ICsgMyk6OmludCA9IChqMi5hKmoyLmEpCis7IC0tIFJlc3Ry aWN0aW9uIGNvbnRhaW5zIGV4cHJlc3Npb25zIGluIGJvdGggc2lkZXMsIFJlbW92ZSBTSi4K K1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIuYgorICBBTkQg KGoxLmEqajEuYSkgPSAoRVhUUkFDVChET1cgRlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSkv MTUgKyAzKTo6aW50CisgIEFORCAoRVhUUkFDVChET1cgRlJPTSBjdXJyZW50X3RpbWVzdGFt cCgwKSkvMTUgKyAzKTo6aW50ID0gKGoyLmEqajIuYSkKKzsgLS0gRW1wdHkgc2V0IG9mIHJv d3Mgc2hvdWxkIGJlIHJldHVybmVkCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBG Uk9NIHNqIGoxLCBzaiBqMgorV0hFUkUgajEuYiA9IGoyLmIKKyAgQU5EIChqMS5hKmoxLmEp ID0gKHJhbmRvbSgpLzMgKyAzKTo6aW50CisgIEFORCAocmFuZG9tKCkvMyArIDMpOjppbnQg PSAoajIuYSpqMi5hKQorOyAtLSBSZXN0cmljdGlvbiBjb250YWlucyB2b2xhdGlsZSBmdW5j dGlvbiAtIGRpc2FibGUgU0pSIGZlYXR1cmUuCitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBq MgorV0hFUkUgajEuYiA9IGoyLmIKKyAgQU5EIChqMS5hKmoxLmMvMykgPSAocmFuZG9tKCkv MyArIDMpOjppbnQKKyAgQU5EIChyYW5kb20oKS8zICsgMyk6OmludCA9IChqMi5hKmoyLmMv MykKKzsgLS0gUmV0dXJuIG9uZSByb3cKKworLS0gTXVsdGlwbGUgZmlsdGVycworQ1JFQVRF IFVOSVFVRSBJTkRFWCBzal90ZW1wX2lkeDEgT04gc2ooYSxiLGMpOworZXhwbGFpbiAoY29z dHMgb2ZmKSAtLSBSZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorCVdI RVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMiBBTkQgajEuYyA9IDMgQU5EIGoyLmEgPSAy IEFORCAzID0gajIuYzsKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gRG9uJ3QgcmVtb3ZlIFNK CisJU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKKwlXSEVSRSBqMS5iID0gajIuYiBBTkQg MiA9IGoxLmEgQU5EIGoxLmMgPSAzIEFORCBqMi5hID0gMSBBTkQgMyA9IGoyLmM7CisKK0NS RUFURSBVTklRVUUgSU5ERVggc2pfdGVtcF9pZHggT04gc2ooYSxiKTsKK2V4cGxhaW4gKGNv c3RzIG9mZikgLS0gRG9uJ3QgcmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwgc2og ajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEgPSAyOworZXhwbGFpbiAoY29zdHMgb2Zm KSAtLSBEb24ndCByZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMiBXSEVS RSBqMS5iID0gajIuYiBBTkQgMiA9IGoyLmE7CitleHBsYWluIChjb3N0cyBvZmYpIC0tIERv bid0IHJlbW92ZSBTSgorCVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyIFdIRVJFIGoxLmIg PSBqMi5iIEFORCAoajEuYSA9IDEgT1IgajIuYSA9IDEpOworRFJPUCBJTkRFWCBzal9mbl9p ZHgsIHNqX3RlbXBfaWR4MSwgc2pfdGVtcF9pZHg7CisKKy0tIFRlc3QgdGhhdCBPUiBwcmVk aWNhdGVkIGFyZSB1cGRhdGVkIGNvcnJlY3RseSBhZnRlciBqb2luIHJlbW92YWwKK0NSRUFU RSBUQUJMRSB0YWJfd2l0aF9mbGFnICggaWQgSU5UIFBSSU1BUlkgS0VZLCBpc19mbGFnIFNN QUxMSU5UKTsKK0NSRUFURSBJTkRFWCBpZHhfdGVzdF9pc19mbGFnIE9OIHRhYl93aXRoX2Zs YWcgKGlzX2ZsYWcpOworZXhwbGFpbiAoY29zdHMgb2ZmKQorU0VMRUNUIENPVU5UKCopIEZS T00gdGFiX3dpdGhfZmxhZworV0hFUkUKKwkoaXNfZmxhZyBJUyBOVUxMIE9SIGlzX2ZsYWcg PSAwKQorCUFORCBpZCBJTiAoU0VMRUNUIGlkIEZST00gdGFiX3dpdGhfZmxhZyBXSEVSRSBp ZCBJTiAoMiwgMykpOworRFJPUCBUQUJMRSB0YWJfd2l0aF9mbGFnOworCistLSBIQVZJTkcg Y2xhdXNlCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgcC5iIGZyb20gc2ogcCBqb2lu IHNqIHEgb24gcC5hID0gcS5hIGdyb3VwIGJ5IHAuYiBoYXZpbmcgc3VtKHAuYSkgPSAxOwor CistLSB1cGRhdGUgbGF0ZXJhbCByZWZlcmVuY2VzIGFuZCByYW5nZSB0YWJsZSBlbnRyeSBy ZWZlcmVuY2UKK2V4cGxhaW4gKHZlcmJvc2UsIGNvc3RzIG9mZikKK3NlbGVjdCAxIGZyb20g KHNlbGVjdCB4LiogZnJvbSBzaiB4LCBzaiB5IHdoZXJlIHguYSA9IHkuYSkgcSwKKyAgbGF0 ZXJhbCBnZW5lcmF0ZV9zZXJpZXMoMSwgcS5hKSBncyhpKTsKKworZXhwbGFpbiAodmVyYm9z ZSwgY29zdHMgb2ZmKQorc2VsZWN0IDEgZnJvbSAoc2VsZWN0IHkuKiBmcm9tIHNqIHgsIHNq IHkgd2hlcmUgeC5hID0geS5hKSBxLAorICBsYXRlcmFsIGdlbmVyYXRlX3NlcmllcygxLCBx LmEpIGdzKGkpOworCistLSBUZXN0IHRoYXQgYSBub24tRUMtZGVyaXZlZCBqb2luIGNsYXVz ZSBpcyBwcm9jZXNzZWQgY29ycmVjdGx5LiBVc2UgYW4KKy0tIG91dGVyIGpvaW4gc28gdGhh dCB3ZSBjYW4ndCBmb3JtIGFuIEVDLgorZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3QgKiBm cm9tIHNqIHAgam9pbiBzaiBxIG9uIHAuYSA9IHEuYQorICBsZWZ0IGpvaW4gc2ogciBvbiBw LmEgKyBxLmEgPSByLmE7CisKKy0tIEZJWE1FIHRoaXMgY29uc3RhbnQgZmFsc2UgZmlsdGVy IGRvZXNuJ3QgbG9vayBnb29kLiBTaG91bGQgd2UgbWVyZ2UKKy0tIGVxdWl2YWxlbmNlIGNs YXNzZXM/CitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHAsIHNqIHEg d2hlcmUgcC5hID0gcS5hIGFuZCBwLmIgPSAxIGFuZCBxLmIgPSAyOworCistLSBDaGVjayB0 aGF0IGF0dHJfbmVlZGVkIGlzIHVwZGF0ZWQgY29ycmVjdGx5IGFmdGVyIHNlbGYtam9pbiBy ZW1vdmFsLiBJbiB0aGlzCistLSB0ZXN0LCB0aGUgam9pbiBvZiBqMSB3aXRoIGoyIGlzIHJl bW92ZWQuIGsxLmIgaXMgcmVxdWlyZWQgYXQgZWl0aGVyIGoxIG9yIGoyLgorLS0gSWYgdGhp cyBpbmZvIGlzIGxvc3QsIGpvaW4gdGFyZ2V0bGlzdCBmb3IgKGsxLCBrMikgd2lsbCBub3Qg Y29udGFpbiBrMS5iLgorLS0gVXNlIGluZGV4IHNjYW4gZm9yIGsxIHNvIHRoYXQgd2UgZG9u J3QgZ2V0ICdiJyBmcm9tIHBoeXNpY2FsIHRsaXN0IHVzZWQgZm9yCistLSBzZXFzY2FuLiBB bHNvIGRpc2FibGUgcmVvcmRlcmluZyBvZiBqb2lucyBiZWNhdXNlIHRoaXMgdGVzdCBkZXBl bmRzIG9uIGEKKy0tIHBhcnRpY3VsYXIgam9pbiB0cmVlLgorY3JlYXRlIHRhYmxlIHNrIChh IGludCwgYiBpbnQpOworY3JlYXRlIGluZGV4IG9uIHNrKGEpOworc2V0IGpvaW5fY29sbGFw c2VfbGltaXQgdG8gMTsKK3NldCBlbmFibGVfc2Vxc2NhbiB0byBvZmY7CitleHBsYWluIChj b3N0cyBvZmYpIHNlbGVjdCAxIGZyb20KKwkoc2sgazEgam9pbiBzayBrMiBvbiBrMS5hID0g azIuYSkKKwlqb2luIChzaiBqMSBqb2luIHNqIGoyIG9uIGoxLmEgPSBqMi5hKSBvbiBqMS5i ID0gazEuYjsKK2V4cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0IDEgZnJvbQorCShzayBrMSBq b2luIHNrIGsyIG9uIGsxLmEgPSBrMi5hKQorCWpvaW4gKHNqIGoxIGpvaW4gc2ogajIgb24g ajEuYSA9IGoyLmEpIG9uIGoyLmIgPSBrMS5iOworcmVzZXQgam9pbl9jb2xsYXBzZV9saW1p dDsKK3Jlc2V0IGVuYWJsZV9zZXFzY2FuOworCitzZXQgc2VsZl9qb2luX3NlYXJjaF9saW1p dCB0byAxOworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBObyBvbmUgc2VsZiBqb2luIHNob3Vs ZCBiZSBjb2xsYXBzZWQKKyAgc2VsZWN0IGoxLiogZnJvbSBzaiBqMSwgc2ogajIsIHNqIGoz IHdoZXJlIChqMS5hID0gajIuYSkgYW5kIChqMi5hID0gajMuYSk7CitzZXQgc2VsZl9qb2lu X3NlYXJjaF9saW1pdCB0byAyOworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBDb2xsYXBzZSBv bmUgc2VsZiBqb2luCisgIHNlbGVjdCBqMS4qIGZyb20gc2ogajEsIHNqIGoyLCBzaiBqMyB3 aGVyZSAoajEuYSA9IGoyLmEpIGFuZCAoajIuYSA9IGozLmEpOworc2V0IHNlbGZfam9pbl9z ZWFyY2hfbGltaXQgdG8gMzsKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gQ29sbGFwc2UgYm90 aCBzZWxmIGpvaW5zCisgIHNlbGVjdCBqMS4qIGZyb20gc2ogajEsIHNqIGoyLCBzaiBqMyB3 aGVyZSAoajEuYSA9IGoyLmEpIGFuZCAoajIuYSA9IGozLmEpOworcmVzZXQgc2VsZl9qb2lu X3NlYXJjaF9saW1pdDsKKworLS0gQ2hlY2sgdGhhdCBjbGF1c2VzIGZyb20gdGhlIGpvaW4g ZmlsdGVyIGxpc3QgaXMgbm90IGxvc3Qgb24gdGhlIHNlbGYtam9pbiByZW1vdmFsCitDUkVB VEUgVEFCTEUgZW1wMSAoIGlkIFNFUklBTCBQUklNQVJZIEtFWSBOT1QgTlVMTCwgY29kZSBp bnQpOworZXhwbGFpbiAodmVyYm9zZSwgY29zdHMgb2ZmKQorU0VMRUNUICogRlJPTSBlbXAx IGUxLCBlbXAxIGUyIFdIRVJFIGUxLmlkID0gZTIuaWQgQU5EIGUyLmNvZGUgPD4gZTEuY29k ZTsKKworLS0gV2UgY2FuIHJlbW92ZSB0aGUgam9pbiBldmVuIGlmIHdlIGZpbmQgdGhlIGpv aW4gY2FuJ3QgZHVwbGljYXRlIHJvd3MgYW5kCistLSB0aGUgYmFzZSBxdWFscyBvZiBlYWNo IHNpZGUgYXJlIGRpZmZlcmVudC4gIEluIHRoZSBmb2xsb3dpbmcgY2FzZSB3ZSBlbmQgdXAK Ky0tIG1vdmluZyBxdWFscyBvdmVyIHRvIHMxIHRvIG1ha2UgaXQgc28gaXQgY2FuJ3QgbWF0 Y2ggYW55IHJvd3MuCitjcmVhdGUgdGFibGUgc2woYSBpbnQsIGIgaW50LCBjIGludCk7Citj cmVhdGUgdW5pcXVlIGluZGV4IG9uIHNsKGEsIGIpOwordmFjdXVtIGFuYWx5emUgc2w7CisK Ky0tIEJvdGggc2lkZXMgYXJlIHVuaXF1ZSwgYnV0IGJhc2UgcXVhbHMgYXJlIGRpZmZlcmVu dAorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzbCB0MSwgc2wgdDIgd2hl cmUgdDEuYSA9IHQyLmEgYW5kIHQxLmIgPSAxIGFuZCB0Mi5iID0gMjsKKworLS0gQ2hlY2sg TnVsbFRlc3QgaW4gYmFzZXJlc3RyaWN0aW5mbyBsaXN0CitleHBsYWluIChjb3N0cyBvZmYp CitzZWxlY3QgKiBmcm9tIHNsIHQxLCBzbCB0Mgord2hlcmUgdDEuYSA9IHQyLmEgYW5kIHQx LmIgPSAxIGFuZCB0Mi5iID0gMgorICBhbmQgdDEuYyBJUyBOT1QgTlVMTCBhbmQgdDIuYyBJ UyBOT1QgTlVMTAorICBhbmQgdDIuYiBJUyBOT1QgTlVMTCBhbmQgdDEuYiBJUyBOT1QgTlVM TAorICBhbmQgdDEuYSBJUyBOT1QgTlVMTCBhbmQgdDIuYSBJUyBOT1QgTlVMTDsKK2V4cGxh aW4gKHZlcmJvc2UsIGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2wgdDEsIHNsIHQyCit3 aGVyZSB0MS5iID0gdDIuYiBhbmQgdDIuYSA9IDMgYW5kIHQxLmEgPSAzCisgIGFuZCB0MS5j IElTIE5PVCBOVUxMIGFuZCB0Mi5jIElTIE5PVCBOVUxMCisgIGFuZCB0Mi5iIElTIE5PVCBO VUxMIGFuZCB0MS5iIElTIE5PVCBOVUxMCisgIGFuZCB0MS5hIElTIE5PVCBOVUxMIGFuZCB0 Mi5hIElTIE5PVCBOVUxMOworCistLSBKb2luIHF1YWwgaXNuJ3QgbWVyZ2Vqb2luYWJsZSwg YnV0IGlubmVyIGlzIHVuaXF1ZS4KK2V4cGxhaW4gKENPU1RTIE9GRikKK1NFTEVDVCBuMi5h IEZST00gc2ogbjEsIHNqIG4yIFdIRVJFIG4xLmEgPD4gbjIuYSBBTkQgbjIuYSA9IDE7Citl eHBsYWluIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NCisJKFNFTEVDVCBuMi5hIEZST00g c2ogbjEsIHNqIG4yIFdIRVJFIG4xLmEgPD4gbjIuYSkgcTAsIHNsCitXSEVSRSBxMC5hID0g MTsKKworLS0KKy0tLS0gT25seSBvbmUgc2lkZSBpcyB1bnFpdWUKKy0tc2VsZWN0ICogZnJv bSBzbCB0MSwgc2wgdDIgd2hlcmUgdDEuYSA9IHQyLmEgYW5kIHQxLmIgPSAxOworLS1zZWxl Y3QgKiBmcm9tIHNsIHQxLCBzbCB0MiB3aGVyZSB0MS5hID0gdDIuYSBhbmQgdDIuYiA9IDE7 CistLQorLS0tLSBTZXZlcmFsIHVuaXF1ZXMgaW5kZXhlcyBtYXRjaCwgYW5kIHdlIHNlbGVj dCBhIGRpZmZlcmVudCBvbmUKKy0tLS0gZm9yIGVhY2ggc2lkZSwgc28gdGhlIGpvaW4gaXMg bm90IHJlbW92ZWQKKy0tY3JlYXRlIHRhYmxlIHNtKGEgaW50IHVuaXF1ZSwgYiBpbnQgdW5p cXVlLCBjIGludCB1bmlxdWUpOworLS1leHBsYWluIChjb3N0cyBvZmYpCistLXNlbGVjdCAq IGZyb20gc20gbSwgc20gbiB3aGVyZSBtLmEgPSBuLmIgYW5kIG0uYyA9IG4uYzsKKy0tZXhw bGFpbiAoY29zdHMgb2ZmKQorLS1zZWxlY3QgKiBmcm9tIHNtIG0sIHNtIG4gd2hlcmUgbS5h ID0gbi5jIGFuZCBtLmIgPSBuLmI7CistLWV4cGxhaW4gKGNvc3RzIG9mZikKKy0tc2VsZWN0 ICogZnJvbSBzbSBtLCBzbSBuIHdoZXJlIG0uYyA9IG4uYiBhbmQgbS5hID0gbi5hOworCist LSBDaGVjayBvcHRpbWl6YXRpb24gZGlzYWJsaW5nIGlmIGl0IHdpbGwgdmlvbGF0ZSBzcGVj aWFsIGpvaW4gY29uZGl0aW9ucy4KKy0tIFR3byBpZGVudGljYWwgam9pbmVkIHJlbGF0aW9u cyBzYXRpc2ZpZXMgc2VsZiBqb2luIHJlbW92YWwgY29uZGl0aW9ucyBidXQKKy0tIHN0YXkg aW4gZGlmZmVyZW50IHNwZWNpYWwgam9pbiBpbmZvcy4KK0NSRUFURSBUQUJMRSBzal90MSAo aWQgc2VyaWFsLCBhIGludCk7CitDUkVBVEUgVEFCTEUgc2pfdDIgKGlkIHNlcmlhbCwgYSBp bnQpOworQ1JFQVRFIFRBQkxFIHNqX3QzIChpZCBzZXJpYWwsIGEgaW50KTsKK0NSRUFURSBU QUJMRSBzal90NCAoaWQgc2VyaWFsLCBhIGludCk7CisKK0NSRUFURSBVTklRVUUgSU5ERVgg T04gc2pfdDMgVVNJTkcgYnRyZWUgKGEsaWQpOworQ1JFQVRFIFVOSVFVRSBJTkRFWCBPTiBz al90MiBVU0lORyBidHJlZSAoaWQpOworCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1Qg KiBGUk9NIHNqX3QxCitKT0lOICgKKwlTRUxFQ1Qgc2pfdDIuaWQgQVMgaWQgRlJPTSBzal90 MgorCVdIRVJFIEVYSVNUUworCQkoCisJCVNFTEVDVCBUUlVFIEZST00gc2pfdDMsc2pfdDQg V0hFUkUgc2pfdDMuYSA9IDEgQU5EIHNqX3QzLmlkID0gc2pfdDIuaWQKKwkJKQorCSkgdDJ0 M3Q0CitPTiBzal90MS5pZCA9IHQydDN0NC5pZAorSk9JTiAoCisJU0VMRUNUIHNqX3QyLmlk IEFTIGlkIEZST00gc2pfdDIKKwlXSEVSRSBFWElTVFMKKwkJKAorCQlTRUxFQ1QgVFJVRSBG Uk9NIHNqX3QzLHNqX3Q0IFdIRVJFIHNqX3QzLmEgPSAxIEFORCBzal90My5pZCA9IHNqX3Qy LmlkCisJCSkKKwkpIF90MnQzdDQKK09OIHNqX3QxLmlkID0gX3QydDN0NC5pZDsKKworLS0K Ky0tIFRlc3QgUm93TWFya3MtcmVsYXRlZCBjb2RlCistLQorCistLSBUT0RPOiBXaHkgdGhp cyBzZWxlY3QgcmV0dXJucyB0d28gY29waWVzIG9mIGN0aWQgZmllbGQ/IFNob3VsZCB3ZSBm aXggaXQ/CitFWFBMQUlOIChDT1NUUyBPRkYpIC0tIEJvdGggc2lkZXMgaGF2ZSBleHBsaWNp dCBMb2NrUm93cyBtYXJrcworU0VMRUNUIGExLmEgRlJPTSBzaiBhMSxzaiBhMiBXSEVSRSAo YTEuYT1hMi5hKSBGT1IgVVBEQVRFOworCitFWFBMQUlOIChDT1NUUyBPRkYpIC0tIEEgUm93 TWFyayBleGlzdHMgZm9yIHRoZSB0YWJsZSBiZWluZyBrZXB0CitVUERBVEUgc2ogc3EgU0VU IGIgPSAxIEZST00gc2ogYXMgc3ogV0hFUkUgc3EuYSA9IHN6LmE7CisKK0NSRUFURSBSVUxF IHNqX2RlbF9ydWxlIEFTIE9OIERFTEVURSBUTyBzagorICBETyBJTlNURUFECisgICAgVVBE QVRFIHNqIFNFVCBhID0gMSBXSEVSRSBhID0gb2xkLmE7CitFWFBMQUlOIChDT1NUUyBPRkYp IERFTEVURSBGUk9NIHNqOyAtLSBBIFJvd01hcmsgZXhpc3RzIGZvciB0aGUgdGFibGUgYmVp bmcgZHJvcHBlZAorRFJPUCBSVUxFIHNqX2RlbF9ydWxlIE9OIHNqIENBU0NBREU7CisKK3Jl c2V0IGVuYWJsZV9oYXNoam9pbjsKK3Jlc2V0IGVuYWJsZV9tZXJnZWpvaW47CisKIC0tCiAt LSBUZXN0IGhpbnRzIGdpdmVuIG9uIGluY29ycmVjdCBjb2x1bW4gcmVmZXJlbmNlcyBhcmUg dXNlZnVsCiAtLQpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxp c3QgYi9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdAppbmRleCAyNjA4NTQ3NDdi Li5lZGJlNjc4N2QwIDEwMDY0NAotLS0gYS9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMu bGlzdAorKysgYi9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdApAQCAtMzY2LDYg KzM2Niw3IEBAIENhdGFsb2dJZAogQ2F0YWxvZ0lkTWFwRW50cnkKIENhdGFsb2dJbmRleFN0 YXRlCiBDaGFuZ2VWYXJOb2Rlc19jb250ZXh0CitSZXBsYWNlVmFybm9Db250ZXh0CiBDaGVj a1BvaW50CiBDaGVja1BvaW50U3RtdAogQ2hlY2twb2ludFN0YXRzRGF0YQpAQCAtMzgyMiw2 ICszODIzLDcgQEAgdW5pY29kZVN0eWxlQ29sdW1uRm9ybWF0CiB1bmljb2RlU3R5bGVGb3Jt YXQKIHVuaWNvZGVTdHlsZVJvd0Zvcm1hdAogdW5pY29kZV9saW5lc3R5bGUKK1VuaXF1ZVJl bEluZm8KIHVuaXRfY29udmVyc2lvbgogdW5sb2dnZWRfcmVsYXRpb25fZW50cnkKIHV0Zl9s b2NhbF9jb252ZXJzaW9uX2Z1bmMKLS0gCjIuNDEuMAoK --------------ClsdSi9vJeol4jRDt18kcQCC--