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 1oSWy0-0006u5-0X for pgsql-hackers@arkaria.postgresql.org; Mon, 29 Aug 2022 05:05:45 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1oSWxx-0004j7-Tl for pgsql-hackers@arkaria.postgresql.org; Mon, 29 Aug 2022 05:05:41 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oSWxw-0004ix-Rz for pgsql-hackers@lists.postgresql.org; Mon, 29 Aug 2022 05:05:41 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by makus.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1oSWxp-00035K-7C for pgsql-hackers@lists.postgresql.org; Mon, 29 Aug 2022 05:05:39 +0000 Received: from [192.168.28.53] (cyclops.postgrespro.ru [93.174.131.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) by mail.postgrespro.ru (Postfix) with ESMTPSA id DFF7921C1D89; Mon, 29 Aug 2022 08:05:29 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1661749530; bh=SCKSw5pkYu1KnJm3r7x/JCNtqQ4gCSBtdhpaPI62+W4=; h=Date:Subject:To:Cc:References:From:In-Reply-To; b=bFoFmkMoPHwsRu2w0XGBBRy7dDqvSLMD1ld3lrr+rJ82CMy0+zwUJuL1lVXzUTdUF 9bLYv6NZQL5+uEyYuPtO0K9uD7emLkfN7082EmnG3NlYwxuAzTt4erzSxKmbOGN+mB ZZpeLEbQq8daCCtDYWOMGqurZzSjNuyaQ5mdKVfI= Content-Type: multipart/mixed; boundary="------------wiZ6WQKIx0zrwAxZucjNBijv" Message-ID: <0fd15c10-eaa5-51bd-b5c7-e635fe03a94d@postgrespro.ru> Date: Mon, 29 Aug 2022 10:05:29 +0500 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.11.0 Subject: Re: Removing unneeded self joins Content-Language: en-US To: Zhihong Yu , Ronan Dunklau Cc: Greg Stark , Andres Freund , Laurenz Albe , Hywel Carver , PostgreSQL Hackers References: <64486b0b-0404-e39e-322d-0801154901f3@postgrespro.ru> <13021914.uLZWGnKmhe@aivenronan> <2375492.jE0xQCEvom@aivenronan> 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. --------------wiZ6WQKIx0zrwAxZucjNBijv Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 8/29/22 04:39, Zhihong Yu wrote: > > > On Fri, Aug 26, 2022 at 3:02 PM Zhihong Yu > wrote: > > Hi, > For v36-0001-Remove-self-joins.patch : > > bq removes inner join of plane table to itself > > plane table -> plain table > > For relation_has_unique_index_ext(), it seems when extra_clauses > is NULL, there is no need to compute `exprs`. > > Cheers Done > > > For remove_self_joins_recurse(): > > +                   if (bms_num_members(relids) > join_collapse_limit) > +                       break; > > The above line just comes out of the switch statement. This check should > be done again between foreach and switch. > Otherwise the above check wouldn't achieve what you want. > > Cheers Thanks for highlighting the problem. I guess, usage either of join_collapse_limit or from_collapse_limit isn't practical here. That we really afraid here - many senseless search cycles of self-joins. And it may have higher limit than GUCs above. So I introduced a guc, called "self_join_search_limit" (so far undocumented) that is an explicit limit for a set of plain relations in FROM-list to search self-joins. -- Regards Andrey Lepikhov Postgres Professional --------------wiZ6WQKIx0zrwAxZucjNBijv Content-Type: text/x-patch; charset=UTF-8; name="v37-0001-Remove-self-joins.patch" Content-Disposition: attachment; filename="v37-0001-Remove-self-joins.patch" Content-Transfer-Encoding: base64 RnJvbSA2MjgzZDZlMjEyMTRlMzRkM2MxYTYzNTFmYTlmNmFjMWFlYjc1Y2U4IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmV5IFYuIExlcGlraG92IiA8YS5sZXBpa2hv dkBwb3N0Z3Jlc3Byby5ydT4KRGF0ZTogRnJpLCAyNiBBdWcgMjAyMiAxNToxNzo1MyArMDMw MApTdWJqZWN0OiBbUEFUQ0hdIFJlbW92ZSBzZWxmLWpvaW5zLgoKQSBTZWxmIEpvaW4gUmVt b3ZhbCAoU0pSKSBmZWF0dXJlIHJlbW92ZXMgaW5uZXIgam9pbiBvZiBwbGFpbiB0YWJsZSB0 byBpdHNlbGYKaW4gYSBxdWVyeSBwbGFuIGlmIGNhbiBiZSBwcm92ZWQgdGhhdCB0aGUgam9p biBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIHNjYW4uClRoZSBwcm9vZiBiYXNlZCBvbiBpbm5l cnJlbF9pc191bmlxdWUgbWFjaGluZXJ5LgoKV2UgY2FuIHJlbW92ZSBhIHNlbGYtam9pbiB3 aGVuIGZvciBlYWNoIG91dGVyIHJvdzoKMS4gQXQgbW9zdCBvbmUgaW5uZXIgcm93IG1hdGNo ZXMgdGhlIGpvaW4gY2xhdXNlcy4KMi4gSWYgdGhlIGpvaW4gdGFyZ2V0IGxpc3QgY29udGFp bnMgYW55IGlubmVyIHZhcnMsIGFuIGlubmVyIHJvdwptdXN0IGJlIChwaHlzaWNhbGx5KSB0 aGUgc2FtZSByb3cgYXMgdGhlIG91dGVyIG9uZS4KCkluIHRoaXMgcGF0Y2ggd2UgdXNlIFJv d2xleSdzIFsxXSBhcHByb2FjaCB0byBpZGVudGlmeSBhIHNlbGYtam9pbjoKMS4gQ29sbGVj dCBhbGwgbWVyZ2Vqb2luYWJsZSBqb2luIHF1YWxzIHdoaWNoIGxvb2sgbGlrZSBhLnggPSBi LngKMi4gQ2hlY2sgaW5uZXJyZWxfaXNfdW5pcXVlKCkgZm9yIHRoZSBxdWFsIGxpc3QgZnJv bSAoMSkuIElmIGl0CnJldHVybnMgdHJ1ZSwgdGhlbiBvdXRlciByb3cgbWF0Y2hlcyBvbmx5 IHRoZSBzYW1lIHJvdyBmcm9tIHRoZSBpbm5lcgpyZWxhdGlvbi4KMy4gSWYgdW5pcXVlbmVz cyBvZiBvdXRlciByZWxhdGlvbiBkZWR1Y2VzIGZyb20gYmFzZXJlc3RyaWN0aW5mbyBjbGF1 c2UgbGlrZQoneD1jb25zdCcgb24gdW5pcXVlIGZpZWxkKHMpLCBjaGVjayB0aGF0IGlubmVy IGhhcyB0aGUgc2FtZSBjbGF1c2Ugd2l0aCB0aGUKc2FtZSBjb25zdGFudChzKS4KNC4gQ29t cGFyZSBSb3dNYXJrcyBvZiBpbm5lciBhbmQgb3V0ZXIgcmVsYXRpb25zLiBUaGV5IG11c3Qg aGF2ZSB0aGUgc2FtZQpzdHJlbmd0aC4KClNvbWUgcmVncmVzc2lvbiB0ZXN0cyBjaGFuZ2Vk IGR1ZSB0byBzZWxmLWpvaW4gcmVtb3ZhbCBsb2dpYy4KClsxXSBodHRwczovL3d3dy5wb3N0 Z3Jlc3FsLm9yZy9tZXNzYWdlLWlkL3Jhdy9DQUFwSER2cGdnbkZNQzR5UC1qVU83UEtOJTNE ZlhlRXJXNWJPeGlzdkowSHZrSFFFWSUzRFd3JTQwbWFpbC5nbWFpbC5jb20KLS0tCiBkb2Mv c3JjL3NnbWwvY29uZmlnLnNnbWwgICAgICAgICAgICAgICAgICB8ICAgMTYgKwogc3JjL2Jh Y2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYyAgICAgfCAgIDM4ICsKIHNyYy9iYWNr ZW5kL29wdGltaXplci9wbGFuL2FuYWx5emVqb2lucy5jIHwgMTA0NiArKysrKysrKysrKysr KysrKysrKy0KIHNyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3BsYW5tYWluLmMgICAgIHwg ICAgNSArCiBzcmMvYmFja2VuZC91dGlscy9taXNjL2d1Yy5jICAgICAgICAgICAgICB8ICAg MjIgKwogc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BhdGhzLmggICAgICAgICAgICAgfCAgICAz ICsKIHNyYy9pbmNsdWRlL29wdGltaXplci9wbGFubWFpbi5oICAgICAgICAgIHwgICAgNyAr CiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2VxdWl2Y2xhc3Mub3V0ICB8ICAgMzIgKwog c3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dCAgICAgICAgfCAgNzc0ICsrKysr KysrKysrKysrKwogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zeXN2aWV3cy5vdXQgICAg fCAgICAzICstCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9lcXVpdmNsYXNzLnNxbCAgICAgICB8 ICAgMTYgKwogc3JjL3Rlc3QvcmVncmVzcy9zcWwvam9pbi5zcWwgICAgICAgICAgICAgfCAg MzQwICsrKysrKysKIHNyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0ICAgICAgICAg IHwgICAgMiArCiAxMyBmaWxlcyBjaGFuZ2VkLCAyMjc4IGluc2VydGlvbnMoKyksIDI2IGRl bGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9jb25maWcuc2dtbCBiL2Rv Yy9zcmMvc2dtbC9jb25maWcuc2dtbAppbmRleCBhNWNkNGU0NGM3Li4yY2ZiNjJmOTdmIDEw MDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvY29uZmlnLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21s L2NvbmZpZy5zZ21sCkBAIC01Mjk3LDYgKzUyOTcsMjIgQEAgQU5ZIDxyZXBsYWNlYWJsZSBj bGFzcz0icGFyYW1ldGVyIj5udW1fc3luYzwvcmVwbGFjZWFibGU+ICggPHJlcGxhY2VhYmxl IGNsYXNzPSIKICAgICAgIDwvbGlzdGl0ZW0+CiAgICAgIDwvdmFybGlzdGVudHJ5PgogCisg ICAgIDx2YXJsaXN0ZW50cnkgaWQ9Imd1Yy1lbmFibGVfc2VsZl9qb2luX3JlbW92YWwiIHhy ZWZsYWJlbD0iZW5hYmxlX3NlbGZfam9pbl9yZW1vdmFsIj4KKyAgICAgIDx0ZXJtPjx2YXJu YW1lPmVuYWJsZV9zZWxmX2pvaW5fcmVtb3ZhbDwvdmFybmFtZT4gKDx0eXBlPmJvb2xlYW48 L3R5cGU+KQorICAgICAgPGluZGV4dGVybT4KKyAgICAgICA8cHJpbWFyeT48dmFybmFtZT5l bmFibGVfc2VsZl9qb2luX3JlbW92YWw8L3Zhcm5hbWU+IGNvbmZpZ3VyYXRpb24gcGFyYW1l dGVyPC9wcmltYXJ5PgorICAgICAgPC9pbmRleHRlcm0+CisgICAgICA8L3Rlcm0+CisgICAg ICA8bGlzdGl0ZW0+CisgICAgICAgPHBhcmE+CisgICAgICAgIEVuYWJsZXMgb3IgZGlzYWJs ZXMgdGhlIHF1ZXJ5IHBsYW5uZXIncyBvcHRpbWl6YXRpb24gd2hpY2ggYW5hbHlzZXMKKyAg ICAgICAgcXVlcnkgdHJlZSBhbmQgcmVwbGFjZXMgc2VsZiBqb2lucyB3aXRoIHNlbWFudGlj YWxseSBlcXVpdmFsZW50IHNpbmdsZQorICAgICAgICBzY2Fucy4gVGFrZSBpbnRvIGNvbnNp ZGVyYXRpb24gb25seSBwbGFpbiB0YWJsZXMuCisgICAgICAgIFRoZSBkZWZhdWx0IGlzIDxs aXRlcmFsPm9uPC9saXRlcmFsPi4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L2xpc3RpdGVt PgorICAgICA8L3Zhcmxpc3RlbnRyeT4KKwogICAgICA8dmFybGlzdGVudHJ5IGlkPSJndWMt ZW5hYmxlLXNlcXNjYW4iIHhyZWZsYWJlbD0iZW5hYmxlX3NlcXNjYW4iPgogICAgICAgPHRl cm0+PHZhcm5hbWU+ZW5hYmxlX3NlcXNjYW48L3Zhcm5hbWU+ICg8dHlwZT5ib29sZWFuPC90 eXBlPikKICAgICAgIDxpbmRleHRlcm0+CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRp bWl6ZXIvcGF0aC9pbmR4cGF0aC5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvaW5k eHBhdGguYwppbmRleCAwNDVmZjJlNDg3Li5jNDFlNzI1NmJlIDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4cGF0aC5jCisrKyBiL3NyYy9iYWNrZW5kL29w dGltaXplci9wYXRoL2luZHhwYXRoLmMKQEAgLTM0OTUsNiArMzQ5NSwyMSBAQCBib29sCiBy ZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2ZvcihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0 SW5mbyAqcmVsLAogCQkJCQkJCSAgTGlzdCAqcmVzdHJpY3RsaXN0LAogCQkJCQkJCSAgTGlz dCAqZXhwcmxpc3QsIExpc3QgKm9wcmxpc3QpCit7CisJcmV0dXJuIHJlbGF0aW9uX2hhc191 bmlxdWVfaW5kZXhfZXh0KHJvb3QsIHJlbCwgcmVzdHJpY3RsaXN0LAorCQkJCQkJCQkJCSBl eHBybGlzdCwgb3BybGlzdCwgTlVMTCk7Cit9CisKKy8qCisgKiByZWxhdGlvbl9oYXNfdW5p cXVlX2luZGV4X2V4dAorICogaWYgZXh0cmFfY2xhdXNlcyBpc24ndCBOVUxMLCByZXR1cm4g YmFzZXJlc3RyaWN0aW5mbyBjbGF1c2VzIHdoaWNoIHdlcmUKKyAqIHVzZWQgdG8gZGVyaXZl IHVuaXF1ZW5lc3MuCisgKi8KK2Jvb2wKK3JlbGF0aW9uX2hhc191bmlxdWVfaW5kZXhfZXh0 KFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCisJCQkJCQkJICBMaXN0ICpy ZXN0cmljdGxpc3QsCisJCQkJCQkJICBMaXN0ICpleHBybGlzdCwgTGlzdCAqb3BybGlzdCwK KwkJCQkJCQkgIExpc3QgKipleHRyYV9jbGF1c2VzKQogewogCUxpc3RDZWxsICAgKmljOwog CkBAIC0zNTUwLDYgKzM1NjUsNyBAQCByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2ZvcihQ bGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCXsKIAkJSW5kZXhPcHRJbmZv ICppbmQgPSAoSW5kZXhPcHRJbmZvICopIGxmaXJzdChpYyk7CiAJCWludAkJCWM7CisJCUxp c3QJICAgKmV4cHJzID0gTklMOwogCiAJCS8qCiAJCSAqIElmIHRoZSBpbmRleCBpcyBub3Qg dW5pcXVlLCBvciBub3QgaW1tZWRpYXRlbHkgZW5mb3JjZWQsIG9yIGlmIGl0J3MKQEAgLTM1 OTgsNiArMzYxNCwyNCBAQCByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2ZvcihQbGFubmVy SW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCQkJCWlmIChtYXRjaF9pbmRleF90b19v cGVyYW5kKHJleHByLCBjLCBpbmQpKQogCQkJCXsKIAkJCQkJbWF0Y2hlZCA9IHRydWU7IC8q IGNvbHVtbiBpcyB1bmlxdWUgKi8KKworCQkJCQlpZiAoYm1zX21lbWJlcnNoaXAocmluZm8t PmNsYXVzZV9yZWxpZHMpID09IEJNU19TSU5HTEVUT04pCisJCQkJCXsKKwkJCQkJCU1lbW9y eUNvbnRleHQgb2xkTWVtQ3R4ID0KKwkJCQkJCQkJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhy b290LT5wbGFubmVyX2N4dCk7CisKKwkJCQkJCS8qCisJCQkJCQkgKiBBZGQgZmlsdGVyIGNs YXVzZSBpbnRvIGEgbGlzdCBhbGxvd2luZyBjYWxsZXIgdG8KKwkJCQkJCSAqIGtub3cgaWYg dW5pcXVpbmVzcyBoYXZlIG1hZGUgbm90IG9ubHkgYnkgam9pbgorCQkJCQkJICogY2xhdXNl cy4KKwkJCQkJCSAqLworCQkJCQkJQXNzZXJ0KGJtc19pc19lbXB0eShyaW5mby0+bGVmdF9y ZWxpZHMpIHx8CisJCQkJCQkJICAgYm1zX2lzX2VtcHR5KHJpbmZvLT5yaWdodF9yZWxpZHMp KTsKKwkJCQkJCWlmIChleHRyYV9jbGF1c2VzKQorCQkJCQkJCWV4cHJzID0gbGFwcGVuZChl eHBycywgcmluZm8pOworCQkJCQkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZE1lbUN0eCk7 CisJCQkJCX0KKwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CkBAIC0zNjQwLDcgKzM2NzQs MTEgQEAgcmVsYXRpb25faGFzX3VuaXF1ZV9pbmRleF9mb3IoUGxhbm5lckluZm8gKnJvb3Qs IFJlbE9wdEluZm8gKnJlbCwKIAogCQkvKiBNYXRjaGVkIGFsbCBrZXkgY29sdW1ucyBvZiB0 aGlzIGluZGV4PyAqLwogCQlpZiAoYyA9PSBpbmQtPm5rZXljb2x1bW5zKQorCQl7CisJCQlp ZiAoZXh0cmFfY2xhdXNlcykKKwkJCQkqZXh0cmFfY2xhdXNlcyA9IGV4cHJzOwogCQkJcmV0 dXJuIHRydWU7CisJCX0KIAl9CiAKIAlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9zcmMv YmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9hbmFseXplam9pbnMuYyBiL3NyYy9iYWNrZW5kL29w dGltaXplci9wbGFuL2FuYWx5emVqb2lucy5jCmluZGV4IGJiZWNhOWE5YWIuLjI3OTZmZWVm NzQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2FuYWx5emVqb2lu cy5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2FuYWx5emVqb2lucy5jCkBA IC0yMiw2ICsyMiw3IEBACiAgKi8KICNpbmNsdWRlICJwb3N0Z3Jlcy5oIgogCisjaW5jbHVk ZSAiY2F0YWxvZy9wZ19jbGFzcy5oIgogI2luY2x1ZGUgIm5vZGVzL25vZGVGdW5jcy5oIgog I2luY2x1ZGUgIm9wdGltaXplci9jbGF1c2VzLmgiCiAjaW5jbHVkZSAib3B0aW1pemVyL2pv aW5pbmZvLmgiCkBAIC0zMiwyMSArMzMsNDEgQEAKICNpbmNsdWRlICJvcHRpbWl6ZXIvdGxp c3QuaCIKICNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKIAorLyoKKyAqIFVuaXF1ZVJl bEluZm8gY2FjaGVzIGEgZmFjdCB0aGF0IGEgcmVsYXRpb24gaXMgdW5pcXVlIHdoZW4gYmVp bmcgam9pbmVkCisgKiB0byBvdGhlciByZWxhdGlvbihzKSBzcGVjaWZpZWQgYnkgb3V0ZXJy ZWxpZHMuCisgKiBleHRyYV9jbGF1c2VzIGNvbnRhaW5zIGFkZGl0aW9uYWwgY2xhdXNlcyBm cm9tIGEgYmFzZXJlc3RyaWN0aW5mbyBsaXN0IHRoYXQKKyAqIHdlcmUgdXNlZCB0byBwcm92 ZSB1bmlxdWVuZXNzLiBXZSBjYWNoZSBpdCBmb3IgU0ogY2hlY2tpbmcgcHJvY2VkdXJlOiBT SiBjYW4KKyAqIGJlIHJlbW92ZWQgaWYgb3V0ZXIgcmVsYXRpb24gY29udGFpbnMgc3RyaWN0 bHkgdGhlIHNhbWUgc2V0IG9mIGNsYXVzZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IFVuaXF1 ZVJlbEluZm8KK3sKKwlSZWxpZHMJCW91dGVycmVsaWRzOworCUxpc3QJICAgKmV4dHJhX2Ns YXVzZXM7Cit9IFVuaXF1ZVJlbEluZm87CisKK2Jvb2wJCWVuYWJsZV9zZWxmX2pvaW5fcmVt b3ZhbDsKK2ludAkJCXNlbGZfam9pbl9zZWFyY2hfbGltaXQ7CisKIC8qIGxvY2FsIGZ1bmN0 aW9ucyAqLwogc3RhdGljIGJvb2wgam9pbl9pc19yZW1vdmFibGUoUGxhbm5lckluZm8gKnJv b3QsIFNwZWNpYWxKb2luSW5mbyAqc2ppbmZvKTsKIHN0YXRpYyB2b2lkIHJlbW92ZV9yZWxf ZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLAotCQkJCQkJCQkgIFJl bGlkcyBqb2lucmVsaWRzKTsKKwkJCQkJCQkJICBSZWxpZHMgam9pbnJlbGlkcywgaW50IHN1 YnN0X3JlbGlkKTsKIHN0YXRpYyBMaXN0ICpyZW1vdmVfcmVsX2Zyb21fam9pbmxpc3QoTGlz dCAqam9pbmxpc3QsIGludCByZWxpZCwgaW50ICpucmVtb3ZlZCk7CiBzdGF0aWMgYm9vbCBy ZWxfc3VwcG9ydHNfZGlzdGluY3RuZXNzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZv ICpyZWwpOwogc3RhdGljIGJvb2wgcmVsX2lzX2Rpc3RpbmN0X2ZvcihQbGFubmVySW5mbyAq cm9vdCwgUmVsT3B0SW5mbyAqcmVsLAotCQkJCQkJCQlMaXN0ICpjbGF1c2VfbGlzdCk7CisJ CQkJCQkJCUxpc3QgKmNsYXVzZV9saXN0LCBMaXN0ICoqZXh0cmFfY2xhdXNlcyk7CiBzdGF0 aWMgT2lkCWRpc3RpbmN0X2NvbF9zZWFyY2goaW50IGNvbG5vLCBMaXN0ICpjb2xub3MsIExp c3QgKm9waWRzKTsKIHN0YXRpYyBib29sIGlzX2lubmVycmVsX3VuaXF1ZV9mb3IoUGxhbm5l ckluZm8gKnJvb3QsCiAJCQkJCQkJCSAgIFJlbGlkcyBqb2lucmVsaWRzLAogCQkJCQkJCQkg ICBSZWxpZHMgb3V0ZXJyZWxpZHMsCiAJCQkJCQkJCSAgIFJlbE9wdEluZm8gKmlubmVycmVs LAogCQkJCQkJCQkgICBKb2luVHlwZSBqb2ludHlwZSwKLQkJCQkJCQkJICAgTGlzdCAqcmVz dHJpY3RsaXN0KTsKKwkJCQkJCQkJICAgTGlzdCAqcmVzdHJpY3RsaXN0LAorCQkJCQkJCQkg ICBMaXN0ICoqZXh0cmFfY2xhdXNlcyk7CitzdGF0aWMgdm9pZCBjaGFuZ2VfcmluZm8oUmVz dHJpY3RJbmZvICpyaW5mbywgSW5kZXggZnJvbSwgSW5kZXggdG8pOworc3RhdGljIEJpdG1h cHNldCAqY2hhbmdlX3JlbGlkKFJlbGlkcyByZWxpZHMsIEluZGV4IG9sZElkLCBJbmRleCBu ZXdJZCk7CitzdGF0aWMgdm9pZCBjaGFuZ2VfdmFybm8oRXhwciAqZXhwciwgSW5kZXggb2xk UmVsaWQsIEluZGV4IG5ld1JlbGlkKTsKIAogCiAvKgpAQCAtODYsNyArMTA3LDcgQEAgcmVz dGFydDoKIAogCQlyZW1vdmVfcmVsX2Zyb21fcXVlcnkocm9vdCwgaW5uZXJyZWxpZCwKIAkJ CQkJCQkgIGJtc191bmlvbihzamluZm8tPm1pbl9sZWZ0aGFuZCwKLQkJCQkJCQkJCQlzamlu Zm8tPm1pbl9yaWdodGhhbmQpKTsKKwkJCQkJCQkJCQlzamluZm8tPm1pbl9yaWdodGhhbmQp LCAwKTsKIAogCQkvKiBXZSB2ZXJpZnkgdGhhdCBleGFjdGx5IG9uZSByZWZlcmVuY2UgZ2V0 cyByZW1vdmVkIGZyb20gam9pbmxpc3QgKi8KIAkJbnJlbW92ZWQgPSAwOwpAQCAtMjg3LDcg KzMwOCw3IEBAIGpvaW5faXNfcmVtb3ZhYmxlKFBsYW5uZXJJbmZvICpyb290LCBTcGVjaWFs Sm9pbkluZm8gKnNqaW5mbykKIAkgKiBOb3cgdGhhdCB3ZSBoYXZlIHRoZSByZWxldmFudCBl cXVhbGl0eSBqb2luIGNsYXVzZXMsIHRyeSB0byBwcm92ZSB0aGUKIAkgKiBpbm5lcnJlbCBk aXN0aW5jdC4KIAkgKi8KLQlpZiAocmVsX2lzX2Rpc3RpbmN0X2Zvcihyb290LCBpbm5lcnJl bCwgY2xhdXNlX2xpc3QpKQorCWlmIChyZWxfaXNfZGlzdGluY3RfZm9yKHJvb3QsIGlubmVy cmVsLCBjbGF1c2VfbGlzdCwgTlVMTCkpCiAJCXJldHVybiB0cnVlOwogCiAJLyoKQEAgLTMw MCw3ICszMjEsMTAgQEAgam9pbl9pc19yZW1vdmFibGUoUGxhbm5lckluZm8gKnJvb3QsIFNw ZWNpYWxKb2luSW5mbyAqc2ppbmZvKQogCiAvKgogICogUmVtb3ZlIHRoZSB0YXJnZXQgcmVs aWQgZnJvbSB0aGUgcGxhbm5lcidzIGRhdGEgc3RydWN0dXJlcywgaGF2aW5nCi0gKiBkZXRl cm1pbmVkIHRoYXQgdGhlcmUgaXMgbm8gbmVlZCB0byBpbmNsdWRlIGl0IGluIHRoZSBxdWVy eS4KKyAqIGRldGVybWluZWQgdGhhdCB0aGVyZSBpcyBubyBuZWVkIHRvIGluY2x1ZGUgaXQg aW4gdGhlIHF1ZXJ5LiBPciByZXBsYWNlCisgKiB3aXRoIGFub3RoZXIgcmVsaWQuCisgKiBU byByZXVzYWJpbGl0eSwgdGhpcyByb3V0aW5lIGNhbiB3b3JrIGluIHR3byBtb2RlczogZGVs ZXRlIHJlbGlkIGZyb20gYSBwbGFuCisgKiBvciByZXBsYWNlIGl0LiBJdCBpcyB1c2VkIGlu IHJlcGxhY2UgbW9kZSBpbiBhIHNlbGYtam9pbiByZW1vdmluZyBwcm9jZXNzLgogICoKICAq IFdlIGFyZSBub3QgdGVycmlibHkgdGhvcm91Z2ggaGVyZS4gIFdlIG11c3QgbWFrZSBzdXJl IHRoYXQgdGhlIHJlbCBpcwogICogbm8gbG9uZ2VyIHRyZWF0ZWQgYXMgYSBiYXNlcmVsLCBh bmQgdGhhdCBhdHRyaWJ1dGVzIG9mIG90aGVyIGJhc2VyZWxzCkBAIC0zMDksMTMgKzMzMywx NiBAQCBqb2luX2lzX3JlbW92YWJsZShQbGFubmVySW5mbyAqcm9vdCwgU3BlY2lhbEpvaW5J bmZvICpzamluZm8pCiAgKiBsaXN0cywgYnV0IG9ubHkgaWYgdGhleSBiZWxvbmcgdG8gdGhl IG91dGVyIGpvaW4gaWRlbnRpZmllZCBieSBqb2lucmVsaWRzLgogICovCiBzdGF0aWMgdm9p ZAotcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQs IFJlbGlkcyBqb2lucmVsaWRzKQorcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KFBsYW5uZXJJbmZv ICpyb290LCBpbnQgcmVsaWQsIFJlbGlkcyBqb2lucmVsaWRzLAorCQkJCQkgIGludCBzdWJz dF9yZWxpZCkKIHsKIAlSZWxPcHRJbmZvICpyZWwgPSBmaW5kX2Jhc2VfcmVsKHJvb3QsIHJl bGlkKTsKIAlMaXN0CSAgICpqb2luaW5mb3M7CiAJSW5kZXgJCXJ0aTsKIAlMaXN0Q2VsbCAg ICpsOwogCisJQXNzZXJ0KHN1YnN0X3JlbGlkID09IDAgfHwgcmVsaWQgIT0gc3Vic3RfcmVs aWQpOworCiAJLyoKIAkgKiBNYXJrIHRoZSByZWwgYXMgImRlYWQiIHRvIHNob3cgaXQgaXMg bm8gbG9uZ2VyIHBhcnQgb2YgdGhlIGpvaW4gdHJlZS4KIAkgKiAoUmVtb3ZpbmcgaXQgZnJv bSB0aGUgYmFzZXJlbCBhcnJheSBhbHRvZ2V0aGVyIHNlZW1zIHRvbyByaXNreS4pCkBAIC0z NDUsOCArMzcyLDExIEBAIHJlbW92ZV9yZWxfZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9v dCwgaW50IHJlbGlkLCBSZWxpZHMgam9pbnJlbGlkcykKIAkJCSBhdHRyb2ZmLS0pCiAJCXsK IAkJCW90aGVycmVsLT5hdHRyX25lZWRlZFthdHRyb2ZmXSA9Ci0JCQkJYm1zX2RlbF9tZW1i ZXIob3RoZXJyZWwtPmF0dHJfbmVlZGVkW2F0dHJvZmZdLCByZWxpZCk7CisJCQkJY2hhbmdl X3JlbGlkKG90aGVycmVsLT5hdHRyX25lZWRlZFthdHRyb2ZmXSwgcmVsaWQsIHN1YnN0X3Jl bGlkKTsKIAkJfQorCisJCS8qIFVwZGF0ZSBsYXRlcmFsIHJlZmVyZW5jZXMuICovCisJCWNo YW5nZV92YXJubygoRXhwciAqKSBvdGhlcnJlbC0+bGF0ZXJhbF92YXJzLCByZWxpZCwgc3Vi c3RfcmVsaWQpOwogCX0KIAogCS8qCkBAIC0zNjEsMTAgKzM5MSwxMiBAQCByZW1vdmVfcmVs X2Zyb21fcXVlcnkoUGxhbm5lckluZm8gKnJvb3QsIGludCByZWxpZCwgUmVsaWRzIGpvaW5y ZWxpZHMpCiAJewogCQlTcGVjaWFsSm9pbkluZm8gKnNqaW5mbyA9IChTcGVjaWFsSm9pbklu Zm8gKikgbGZpcnN0KGwpOwogCi0JCXNqaW5mby0+bWluX2xlZnRoYW5kID0gYm1zX2RlbF9t ZW1iZXIoc2ppbmZvLT5taW5fbGVmdGhhbmQsIHJlbGlkKTsKLQkJc2ppbmZvLT5taW5fcmln aHRoYW5kID0gYm1zX2RlbF9tZW1iZXIoc2ppbmZvLT5taW5fcmlnaHRoYW5kLCByZWxpZCk7 Ci0JCXNqaW5mby0+c3luX2xlZnRoYW5kID0gYm1zX2RlbF9tZW1iZXIoc2ppbmZvLT5zeW5f bGVmdGhhbmQsIHJlbGlkKTsKLQkJc2ppbmZvLT5zeW5fcmlnaHRoYW5kID0gYm1zX2RlbF9t ZW1iZXIoc2ppbmZvLT5zeW5fcmlnaHRoYW5kLCByZWxpZCk7CisJCXNqaW5mby0+bWluX2xl ZnRoYW5kID0gY2hhbmdlX3JlbGlkKHNqaW5mby0+bWluX2xlZnRoYW5kLCByZWxpZCwgc3Vi c3RfcmVsaWQpOworCQlzamluZm8tPm1pbl9yaWdodGhhbmQgPSBjaGFuZ2VfcmVsaWQoc2pp bmZvLT5taW5fcmlnaHRoYW5kLCByZWxpZCwgc3Vic3RfcmVsaWQpOworCQlzamluZm8tPnN5 bl9sZWZ0aGFuZCA9IGNoYW5nZV9yZWxpZChzamluZm8tPnN5bl9sZWZ0aGFuZCwgcmVsaWQs IHN1YnN0X3JlbGlkKTsKKwkJc2ppbmZvLT5zeW5fcmlnaHRoYW5kID0gY2hhbmdlX3JlbGlk KHNqaW5mby0+c3luX3JpZ2h0aGFuZCwgcmVsaWQsIHN1YnN0X3JlbGlkKTsKKworCQljaGFu Z2VfdmFybm8oKEV4cHIgKikgc2ppbmZvLT5zZW1pX3Joc19leHBycywgcmVsaWQsIHN1YnN0 X3JlbGlkKTsKIAl9CiAKIAkvKgpAQCAtMzg1LDggKzQxNyw3IEBAIHJlbW92ZV9yZWxfZnJv bV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLCBSZWxpZHMgam9pbnJlbGlk cykKIAl7CiAJCVBsYWNlSG9sZGVySW5mbyAqcGhpbmZvID0gKFBsYWNlSG9sZGVySW5mbyAq KSBsZmlyc3QobCk7CiAKLQkJQXNzZXJ0KCFibXNfaXNfbWVtYmVyKHJlbGlkLCBwaGluZm8t PnBoX2xhdGVyYWwpKTsKLQkJaWYgKGJtc19pc19zdWJzZXQocGhpbmZvLT5waF9uZWVkZWQs IGpvaW5yZWxpZHMpICYmCisJCWlmIChzdWJzdF9yZWxpZCA9PSAwICYmIGJtc19pc19zdWJz ZXQocGhpbmZvLT5waF9uZWVkZWQsIGpvaW5yZWxpZHMpICYmCiAJCQlibXNfaXNfbWVtYmVy KHJlbGlkLCBwaGluZm8tPnBoX2V2YWxfYXQpKQogCQl7CiAJCQlyb290LT5wbGFjZWhvbGRl cl9saXN0ID0gZm9yZWFjaF9kZWxldGVfY3VycmVudChyb290LT5wbGFjZWhvbGRlcl9saXN0 LApAQCAtMzk1LDkgKzQyNiwyMyBAQCByZW1vdmVfcmVsX2Zyb21fcXVlcnkoUGxhbm5lcklu Zm8gKnJvb3QsIGludCByZWxpZCwgUmVsaWRzIGpvaW5yZWxpZHMpCiAJCX0KIAkJZWxzZQog CQl7Ci0JCQlwaGluZm8tPnBoX2V2YWxfYXQgPSBibXNfZGVsX21lbWJlcihwaGluZm8tPnBo X2V2YWxfYXQsIHJlbGlkKTsKKwkJCXBoaW5mby0+cGhfZXZhbF9hdCA9IGNoYW5nZV9yZWxp ZChwaGluZm8tPnBoX2V2YWxfYXQsIHJlbGlkLCBzdWJzdF9yZWxpZCk7CiAJCQlBc3NlcnQo IWJtc19pc19lbXB0eShwaGluZm8tPnBoX2V2YWxfYXQpKTsKLQkJCXBoaW5mby0+cGhfbmVl ZGVkID0gYm1zX2RlbF9tZW1iZXIocGhpbmZvLT5waF9uZWVkZWQsIHJlbGlkKTsKKwkJCXBo aW5mby0+cGhfbmVlZGVkID0gY2hhbmdlX3JlbGlkKHBoaW5mby0+cGhfbmVlZGVkLCByZWxp ZCwgc3Vic3RfcmVsaWQpOworCQkJQXNzZXJ0KHN1YnN0X3JlbGlkICE9IDAgfHwgIWJtc19p c19tZW1iZXIocmVsaWQsIHBoaW5mby0+cGhfbGF0ZXJhbCkpOworCQkJcGhpbmZvLT5waF9s YXRlcmFsID0gY2hhbmdlX3JlbGlkKHBoaW5mby0+cGhfbGF0ZXJhbCwgcmVsaWQsIHN1YnN0 X3JlbGlkKTsKKwkJCXBoaW5mby0+cGhfdmFyLT5waHJlbHMgPSBjaGFuZ2VfcmVsaWQocGhp bmZvLT5waF92YXItPnBocmVscywgcmVsaWQsIHN1YnN0X3JlbGlkKTsKKwkJfQorCX0KKwor CWlmIChzdWJzdF9yZWxpZCAhPSAwKQorCXsKKwkJZm9yZWFjaChsLCByZWwtPmJhc2VyZXN0 cmljdGluZm8pCisJCXsKKwkJCVJlc3RyaWN0SW5mbyAqcmluZm8gPSAoUmVzdHJpY3RJbmZv ICopIGxmaXJzdChsKTsKKworCQkJY2hhbmdlX3JpbmZvKHJpbmZvLCByZWxpZCwgc3Vic3Rf cmVsaWQpOworCQkJZGlzdHJpYnV0ZV9yZXN0cmljdGluZm9fdG9fcmVscyhyb290LCByaW5m byk7CiAJCX0KIAl9CiAKQEAgLTQyMiw2ICs0NjcsMTIgQEAgcmVtb3ZlX3JlbF9mcm9tX3F1 ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQsIFJlbGlkcyBqb2lucmVsaWRzKQog CiAJCXJlbW92ZV9qb2luX2NsYXVzZV9mcm9tX3JlbHMocm9vdCwgcmluZm8sIHJpbmZvLT5y ZXF1aXJlZF9yZWxpZHMpOwogCisJCS8qCisJCSAqIHJlcGxhY2UgcmVsaWQgd2l0aCByZWxp ZCBvZiBrZWVwaW5nIHJlbGF0aW9uLiBBZnRlciB0aGF0LCB0aGlzCisJCSAqIHJlc3RyaWN0 aW9uIGNhbiBiZSBhdHRhY2hlZCB0byBrZWVwaW5nIHJlbGF0aW9uLgorCQkgKi8KKwkJY2hh bmdlX3JpbmZvKHJpbmZvLCByZWxpZCwgc3Vic3RfcmVsaWQpOworCiAJCWlmIChSSU5GT19J U19QVVNIRURfRE9XTihyaW5mbywgam9pbnJlbGlkcykpCiAJCXsKIAkJCS8qIFJlY2hlY2sg dGhhdCBxdWFsIGRvZXNuJ3QgYWN0dWFsbHkgcmVmZXJlbmNlIHRoZSB0YXJnZXQgcmVsICov CkBAIC00MzYsNiArNDg3LDggQEAgcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KFBsYW5uZXJJbmZv ICpyb290LCBpbnQgcmVsaWQsIFJlbGlkcyBqb2lucmVsaWRzKQogCQkJCQkJCQkJCQkJCXJl bGlkKTsKIAkJCWRpc3RyaWJ1dGVfcmVzdHJpY3RpbmZvX3RvX3JlbHMocm9vdCwgcmluZm8p OwogCQl9CisJCWVsc2UgaWYgKHN1YnN0X3JlbGlkICE9IDApCisJCQlkaXN0cmlidXRlX3Jl c3RyaWN0aW5mb190b19yZWxzKHJvb3QsIHJpbmZvKTsKIAl9CiAKIAkvKgpAQCAtNjM5LDkg KzY5MiwxNCBAQCByZWxfc3VwcG9ydHNfZGlzdGluY3RuZXNzKFBsYW5uZXJJbmZvICpyb290 LCBSZWxPcHRJbmZvICpyZWwpCiAgKiBOb3RlIHRoYXQgdGhlIHBhc3NlZC1pbiBjbGF1c2Vf bGlzdCBtYXkgYmUgZGVzdHJ1Y3RpdmVseSBtb2RpZmllZCEgIFRoaXMKICAqIGlzIE9LIGZv ciBjdXJyZW50IHVzZXMsIGJlY2F1c2UgdGhlIGNsYXVzZV9saXN0IGlzIGJ1aWx0IGJ5IHRo ZSBjYWxsZXIgZm9yCiAgKiB0aGUgc29sZSBwdXJwb3NlIG9mIHBhc3NpbmcgdG8gdGhpcyBm dW5jdGlvbi4KKyAqCisgKiBvdXRlcl9leHBycyBjb250YWlucyByaWdodCBzaWRlcyBvZiBi YXNlcmVzdHJpY3RpbmZvIGNsYXVzZXMgbG9va3MgbGlrZQorICogeCA9IGNvbnN0IGlmIGRp c3RpbmN0bmVzcyBpcyBkZXJpdmVkIGZyb20gc3VjaCBjbGF1c2VzLCBub3Qgam9pbmluZm8g Y2xhdXNlLgorICogUGFzcyBOVUxMIGZvciB0aGUgcGFyYW0gdmFsdWUsIGlmIGl0IGlzIG5v dCBpbnRlcmVzdGVkLgogICovCiBzdGF0aWMgYm9vbAotcmVsX2lzX2Rpc3RpbmN0X2ZvcihQ bGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLCBMaXN0ICpjbGF1c2VfbGlzdCkK K3JlbF9pc19kaXN0aW5jdF9mb3IoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJl bCwgTGlzdCAqY2xhdXNlX2xpc3QsCisJCQkJCUxpc3QgKipleHRyYV9jbGF1c2VzKQogewog CS8qCiAJICogV2UgY291bGQgc2tpcCBhIGNvdXBsZSBvZiB0ZXN0cyBoZXJlIGlmIHdlIGFz c3VtZSBhbGwgY2FsbGVycyBjaGVja2VkCkBAIC02NTQsMTAgKzcxMiwxMSBAQCByZWxfaXNf ZGlzdGluY3RfZm9yKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsIExpc3Qg KmNsYXVzZV9saXN0KQogCXsKIAkJLyoKIAkJICogRXhhbWluZSB0aGUgaW5kZXhlcyB0byBz ZWUgaWYgd2UgaGF2ZSBhIG1hdGNoaW5nIHVuaXF1ZSBpbmRleC4KLQkJICogcmVsYXRpb25f aGFzX3VuaXF1ZV9pbmRleF9mb3IgYXV0b21hdGljYWxseSBhZGRzIGFueSB1c2FibGUKKwkJ ICogcmVsYXRpb25faGFzX3VuaXF1ZV9pbmRleF9leHQgYXV0b21hdGljYWxseSBhZGRzIGFu eSB1c2FibGUKIAkJICogcmVzdHJpY3Rpb24gY2xhdXNlcyBmb3IgdGhlIHJlbCwgc28gd2Ug bmVlZG4ndCBkbyB0aGF0IGhlcmUuCiAJCSAqLwotCQlpZiAocmVsYXRpb25faGFzX3VuaXF1 ZV9pbmRleF9mb3Iocm9vdCwgcmVsLCBjbGF1c2VfbGlzdCwgTklMLCBOSUwpKQorCQlpZiAo cmVsYXRpb25faGFzX3VuaXF1ZV9pbmRleF9leHQocm9vdCwgcmVsLCBjbGF1c2VfbGlzdCwg TklMLCBOSUwsCisJCQkJCQkJCQkJICBleHRyYV9jbGF1c2VzKSkKIAkJCXJldHVybiB0cnVl OwogCX0KIAllbHNlIGlmIChyZWwtPnJ0ZWtpbmQgPT0gUlRFX1NVQlFVRVJZKQpAQCAtOTcx LDkgKzEwMzAsMjEgQEAgaW5uZXJyZWxfaXNfdW5pcXVlKFBsYW5uZXJJbmZvICpyb290LAog CQkJCSAgIEpvaW5UeXBlIGpvaW50eXBlLAogCQkJCSAgIExpc3QgKnJlc3RyaWN0bGlzdCwK IAkJCQkgICBib29sIGZvcmNlX2NhY2hlKQoreworCXJldHVybiBpbm5lcnJlbF9pc191bmlx dWVfZXh0KHJvb3QsIGpvaW5yZWxpZHMsIG91dGVycmVsaWRzLCBpbm5lcnJlbCwKKwkJCQkJ CQkJICBqb2ludHlwZSwgcmVzdHJpY3RsaXN0LCBmb3JjZV9jYWNoZSwgTlVMTCk7Cit9CisK K2Jvb2wKK2lubmVycmVsX2lzX3VuaXF1ZV9leHQoUGxhbm5lckluZm8gKnJvb3QsIFJlbGlk cyBqb2lucmVsaWRzLCBSZWxpZHMgb3V0ZXJyZWxpZHMsCisJCQkJCSAgIFJlbE9wdEluZm8g KmlubmVycmVsLCBKb2luVHlwZSBqb2ludHlwZSwKKwkJCQkJICAgTGlzdCAqcmVzdHJpY3Rs aXN0LCBib29sIGZvcmNlX2NhY2hlLAorCQkJCQkgICBMaXN0ICoqZXh0cmFfY2xhdXNlcykK IHsKIAlNZW1vcnlDb250ZXh0IG9sZF9jb250ZXh0OwogCUxpc3RDZWxsICAgKmxjOworCVVu aXF1ZVJlbEluZm8gKnVuaXF1ZVJlbEluZm87CisJTGlzdAkgICAqb3V0ZXJfZXhwcnMgPSBO SUw7CiAKIAkvKiBDZXJ0YWlubHkgY2FuJ3QgcHJvdmUgdW5pcXVlbmVzcyB3aGVuIHRoZXJl IGFyZSBubyBqb2luY2xhdXNlcyAqLwogCWlmIChyZXN0cmljdGxpc3QgPT0gTklMKQpAQCAt OTk1LDEwICsxMDY2LDE0IEBAIGlubmVycmVsX2lzX3VuaXF1ZShQbGFubmVySW5mbyAqcm9v dCwKIAkgKi8KIAlmb3JlYWNoKGxjLCBpbm5lcnJlbC0+dW5pcXVlX2Zvcl9yZWxzKQogCXsK LQkJUmVsaWRzCQl1bmlxdWVfZm9yX3JlbHMgPSAoUmVsaWRzKSBsZmlyc3QobGMpOworCQl1 bmlxdWVSZWxJbmZvID0gKFVuaXF1ZVJlbEluZm8gKikgbGZpcnN0KGxjKTsKIAotCQlpZiAo Ym1zX2lzX3N1YnNldCh1bmlxdWVfZm9yX3JlbHMsIG91dGVycmVsaWRzKSkKKwkJaWYgKGJt c19pc19zdWJzZXQodW5pcXVlUmVsSW5mby0+b3V0ZXJyZWxpZHMsIG91dGVycmVsaWRzKSkK KwkJeworCQkJaWYgKGV4dHJhX2NsYXVzZXMpCisJCQkJKmV4dHJhX2NsYXVzZXMgPSB1bmlx dWVSZWxJbmZvLT5leHRyYV9jbGF1c2VzOwogCQkJcmV0dXJuIHRydWU7CQkvKiBTdWNjZXNz ISAqLworCQl9CiAJfQogCiAJLyoKQEAgLTEwMTUsNyArMTA5MCw3IEBAIGlubmVycmVsX2lz X3VuaXF1ZShQbGFubmVySW5mbyAqcm9vdCwKIAogCS8qIE5vIGNhY2hlZCBpbmZvcm1hdGlv biwgc28gdHJ5IHRvIG1ha2UgdGhlIHByb29mLiAqLwogCWlmIChpc19pbm5lcnJlbF91bmlx dWVfZm9yKHJvb3QsIGpvaW5yZWxpZHMsIG91dGVycmVsaWRzLCBpbm5lcnJlbCwKLQkJCQkJ CQkgICBqb2ludHlwZSwgcmVzdHJpY3RsaXN0KSkKKwkJCQkJCQkgICBqb2ludHlwZSwgcmVz dHJpY3RsaXN0LCAmb3V0ZXJfZXhwcnMpKQogCXsKIAkJLyoKIAkJICogQ2FjaGUgdGhlIHBv c2l0aXZlIHJlc3VsdCBmb3IgZnV0dXJlIHByb2JlcywgYmVpbmcgc3VyZSB0byBrZWVwIGl0 CkBAIC0xMDI4LDEwICsxMTAzLDE1IEBAIGlubmVycmVsX2lzX3VuaXF1ZShQbGFubmVySW5m byAqcm9vdCwKIAkJICogc3VwZXJzZXRzIG9mIHRoZW0gYW55d2F5LgogCQkgKi8KIAkJb2xk X2NvbnRleHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8ocm9vdC0+cGxhbm5lcl9jeHQpOwor CQl1bmlxdWVSZWxJbmZvID0gcGFsbG9jKHNpemVvZihVbmlxdWVSZWxJbmZvKSk7CisJCXVu aXF1ZVJlbEluZm8tPmV4dHJhX2NsYXVzZXMgPSBvdXRlcl9leHByczsKKwkJdW5pcXVlUmVs SW5mby0+b3V0ZXJyZWxpZHMgPSBibXNfY29weShvdXRlcnJlbGlkcyk7CiAJCWlubmVycmVs LT51bmlxdWVfZm9yX3JlbHMgPSBsYXBwZW5kKGlubmVycmVsLT51bmlxdWVfZm9yX3JlbHMs Ci0JCQkJCQkJCQkJCWJtc19jb3B5KG91dGVycmVsaWRzKSk7CisJCQkJCQkJCQkJCXVuaXF1 ZVJlbEluZm8pOwogCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkX2NvbnRleHQpOwogCisJ CWlmIChleHRyYV9jbGF1c2VzKQorCQkJKmV4dHJhX2NsYXVzZXMgPSBvdXRlcl9leHByczsK IAkJcmV0dXJuIHRydWU7CQkJLyogU3VjY2VzcyEgKi8KIAl9CiAJZWxzZQpAQCAtMTA3Nyw3 ICsxMTU3LDggQEAgaXNfaW5uZXJyZWxfdW5pcXVlX2ZvcihQbGFubmVySW5mbyAqcm9vdCwK IAkJCQkJICAgUmVsaWRzIG91dGVycmVsaWRzLAogCQkJCQkgICBSZWxPcHRJbmZvICppbm5l cnJlbCwKIAkJCQkJICAgSm9pblR5cGUgam9pbnR5cGUsCi0JCQkJCSAgIExpc3QgKnJlc3Ry aWN0bGlzdCkKKwkJCQkJICAgTGlzdCAqcmVzdHJpY3RsaXN0LAorCQkJCQkgICBMaXN0ICoq ZXh0cmFfY2xhdXNlcykKIHsKIAlMaXN0CSAgICpjbGF1c2VfbGlzdCA9IE5JTDsKIAlMaXN0 Q2VsbCAgICpsYzsKQEAgLTExMTksNSArMTIwMCw5MjAgQEAgaXNfaW5uZXJyZWxfdW5pcXVl X2ZvcihQbGFubmVySW5mbyAqcm9vdCwKIAl9CiAKIAkvKiBMZXQgcmVsX2lzX2Rpc3RpbmN0 X2ZvcigpIGRvIHRoZSBoYXJkIHdvcmsgKi8KLQlyZXR1cm4gcmVsX2lzX2Rpc3RpbmN0X2Zv cihyb290LCBpbm5lcnJlbCwgY2xhdXNlX2xpc3QpOworCXJldHVybiByZWxfaXNfZGlzdGlu Y3RfZm9yKHJvb3QsIGlubmVycmVsLCBjbGF1c2VfbGlzdCwgZXh0cmFfY2xhdXNlcyk7Cit9 CisKK3R5cGVkZWYgc3RydWN0IENoYW5nZVZhcm5vQ29udGV4dAoreworCUluZGV4CQlvbGRS ZWxpZDsKKwlJbmRleAkJbmV3UmVsaWQ7Cit9IENoYW5nZVZhcm5vQ29udGV4dDsKKworCitz dGF0aWMgYm9vbAorY2hhbmdlX3Zhcm5vX3dhbGtlcihOb2RlICpub2RlLCBDaGFuZ2VWYXJu b0NvbnRleHQgKmNvbnRleHQpCit7CisJaWYgKG5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIGZh bHNlOworCisJaWYgKElzQShub2RlLCBWYXIpKQorCXsKKwkJVmFyCQkgICAqdmFyID0gKFZh ciAqKSBub2RlOworCisJCWlmICh2YXItPnZhcm5vID09IGNvbnRleHQtPm9sZFJlbGlkKQor CQl7CisJCQl2YXItPnZhcm5vID0gY29udGV4dC0+bmV3UmVsaWQ7CisJCQl2YXItPnZhcm5v c3luID0gY29udGV4dC0+bmV3UmVsaWQ7CisJCQl2YXItPmxvY2F0aW9uID0gLTE7CisJCX0K KwkJZWxzZSBpZiAodmFyLT52YXJubyA9PSBjb250ZXh0LT5uZXdSZWxpZCkKKwkJCXZhci0+ bG9jYXRpb24gPSAtMTsKKworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmIChJc0Eobm9kZSwg UmVzdHJpY3RJbmZvKSkKKwl7CisJCWNoYW5nZV9yaW5mbygoUmVzdHJpY3RJbmZvICopIG5v ZGUsIGNvbnRleHQtPm9sZFJlbGlkLCBjb250ZXh0LT5uZXdSZWxpZCk7CisJCXJldHVybiBm YWxzZTsKKwl9CisJcmV0dXJuIGV4cHJlc3Npb25fdHJlZV93YWxrZXIobm9kZSwgY2hhbmdl X3Zhcm5vX3dhbGtlciwgY29udGV4dCk7Cit9CisKKy8qCisgKiBGb3IgYWxsIFZhcnMgaW4g dGhlIGV4cHJlc3Npb24gdGhhdCBoYXZlIHZhcm5vID0gb2xkUmVsaWQsIHNldAorICogdmFy bm8gPSBuZXdSZWxpZC4KKyAqLworc3RhdGljIHZvaWQKK2NoYW5nZV92YXJubyhFeHByICpl eHByLCBJbmRleCBvbGRSZWxpZCwgSW5kZXggbmV3UmVsaWQpCit7CisJQ2hhbmdlVmFybm9D b250ZXh0IGNvbnRleHQ7CisKKwlpZiAobmV3UmVsaWQgPT0gMCkKKwkJcmV0dXJuOworCisJ Y29udGV4dC5vbGRSZWxpZCA9IG9sZFJlbGlkOworCWNvbnRleHQubmV3UmVsaWQgPSBuZXdS ZWxpZDsKKwljaGFuZ2VfdmFybm9fd2Fsa2VyKChOb2RlICopIGV4cHIsICZjb250ZXh0KTsK K30KKworLyoKKyAqIFN1YnN0aXR1dGUgbmV3SWQgZm9yIG9sZElkIGluIHJlbGlkcy4KKyAq Lworc3RhdGljIEJpdG1hcHNldCAqCitjaGFuZ2VfcmVsaWQoUmVsaWRzIHJlbGlkcywgSW5k ZXggb2xkSWQsIEluZGV4IG5ld0lkKQoreworCWlmIChuZXdJZCA9PSAwKQorCQkvKiBEZWxl dGUgcmVsaWQgd2l0aG91dCBzdWJzdGl0dXRpb24uICovCisJCXJldHVybiBibXNfZGVsX21l bWJlcihyZWxpZHMsIG9sZElkKTsKKworCWlmIChibXNfaXNfbWVtYmVyKG9sZElkLCByZWxp ZHMpKQorCQlyZXR1cm4gYm1zX2FkZF9tZW1iZXIoYm1zX2RlbF9tZW1iZXIoYm1zX2NvcHko cmVsaWRzKSwgb2xkSWQpLCBuZXdJZCk7CisKKwlyZXR1cm4gcmVsaWRzOworfQorCitzdGF0 aWMgdm9pZAorY2hhbmdlX3JpbmZvKFJlc3RyaWN0SW5mbyAqcmluZm8sIEluZGV4IGZyb20s IEluZGV4IHRvKQoreworCWJvb2wJCWlzX3JlcV9lcXVhbDsKKworCWlmICh0byA9PSAwKQor CQlyZXR1cm47CisKKwlpc19yZXFfZXF1YWwgPSAocmluZm8tPnJlcXVpcmVkX3JlbGlkcyA9 PSByaW5mby0+Y2xhdXNlX3JlbGlkcyk7CisKKwljaGFuZ2VfdmFybm8ocmluZm8tPmNsYXVz ZSwgZnJvbSwgdG8pOworCWNoYW5nZV92YXJubyhyaW5mby0+b3JjbGF1c2UsIGZyb20sIHRv KTsKKwlyaW5mby0+Y2xhdXNlX3JlbGlkcyA9IGNoYW5nZV9yZWxpZChyaW5mby0+Y2xhdXNl X3JlbGlkcywgZnJvbSwgdG8pOworCWlmIChpc19yZXFfZXF1YWwpCisJCXJpbmZvLT5yZXF1 aXJlZF9yZWxpZHMgPSByaW5mby0+Y2xhdXNlX3JlbGlkczsKKwllbHNlCisJCXJpbmZvLT5y ZXF1aXJlZF9yZWxpZHMgPSBjaGFuZ2VfcmVsaWQocmluZm8tPnJlcXVpcmVkX3JlbGlkcywg ZnJvbSwgdG8pOworCXJpbmZvLT5sZWZ0X3JlbGlkcyA9IGNoYW5nZV9yZWxpZChyaW5mby0+ bGVmdF9yZWxpZHMsIGZyb20sIHRvKTsKKwlyaW5mby0+cmlnaHRfcmVsaWRzID0gY2hhbmdl X3JlbGlkKHJpbmZvLT5yaWdodF9yZWxpZHMsIGZyb20sIHRvKTsKKwlyaW5mby0+b3V0ZXJf cmVsaWRzID0gY2hhbmdlX3JlbGlkKHJpbmZvLT5vdXRlcl9yZWxpZHMsIGZyb20sIHRvKTsK KwlyaW5mby0+bnVsbGFibGVfcmVsaWRzID0gY2hhbmdlX3JlbGlkKHJpbmZvLT5udWxsYWJs ZV9yZWxpZHMsIGZyb20sIHRvKTsKK30KKworLyoKKyAqIFVwZGF0ZSBFQyBtZW1iZXJzIHRv IHBvaW50IHRvIHRoZSByZW1haW5pbmcgcmVsYXRpb24gaW5zdGVhZCBvZiB0aGUgcmVtb3Zl ZAorICogb25lLCByZW1vdmluZyBkdXBsaWNhdGVzLgorICovCitzdGF0aWMgdm9pZAordXBk YXRlX2VjX21lbWJlcnMoRXF1aXZhbGVuY2VDbGFzcyAqZWMsIEluZGV4IHRvUmVtb3ZlLCBJ bmRleCB0b0tlZXApCit7CisJaW50CQkJY291bnRlcjsKKworCWZvciAoY291bnRlciA9IDA7 IGNvdW50ZXIgPCBsaXN0X2xlbmd0aChlYy0+ZWNfbWVtYmVycyk7KQorCXsKKwkJTGlzdENl bGwgICAqY2VsbCA9IGxpc3RfbnRoX2NlbGwoZWMtPmVjX21lbWJlcnMsIGNvdW50ZXIpOwor CQlFcXVpdmFsZW5jZU1lbWJlciAqZW0gPSBsZmlyc3QoY2VsbCk7CisJCWludAkJCWNvdW50 ZXIxOworCisJCWlmICghYm1zX2lzX21lbWJlcih0b1JlbW92ZSwgZW0tPmVtX3JlbGlkcykp CisJCXsKKwkJCWNvdW50ZXIrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZW0tPmVtX3Jl bGlkcyA9IGNoYW5nZV9yZWxpZChlbS0+ZW1fcmVsaWRzLCB0b1JlbW92ZSwgdG9LZWVwKTsK KwkJLyogV2Ugb25seSBwcm9jZXNzIGlubmVyIGpvaW5zICovCisJCWNoYW5nZV92YXJubyhl bS0+ZW1fZXhwciwgdG9SZW1vdmUsIHRvS2VlcCk7CisKKwkJLyoKKwkJICogQWZ0ZXIgd2Ug c3dpdGNoZWQgdGhlIGVxdWl2YWxlbmNlIG1lbWJlciB0byB0aGUgcmVtYWluaW5nIHJlbGF0 aW9uLAorCQkgKiBjaGVjayB0aGF0IGl0IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgZXhpc3Rp bmcgbWVtYmVyLCBhbmQgaWYgaXQgaXMsCisJCSAqIGRlbGV0ZSBpdC4KKwkJICovCisJCWZv ciAoY291bnRlcjEgPSAwOyBjb3VudGVyMSA8IGxpc3RfbGVuZ3RoKGVjLT5lY19tZW1iZXJz KTsgY291bnRlcjErKykKKwkJeworCQkJRXF1aXZhbGVuY2VNZW1iZXIgKm90aGVyOworCisJ CQlpZiAoY291bnRlcjEgPT0gY291bnRlcikKKwkJCQljb250aW51ZTsKKworCQkJb3RoZXIg PSBjYXN0Tm9kZShFcXVpdmFsZW5jZU1lbWJlciwgbGlzdF9udGgoZWMtPmVjX21lbWJlcnMs IGNvdW50ZXIxKSk7CisKKwkJCWlmIChlcXVhbChvdGhlci0+ZW1fZXhwciwgZW0tPmVtX2V4 cHIpKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGNvdW50ZXIxIDwgbGlzdF9sZW5ndGgo ZWMtPmVjX21lbWJlcnMpKQorCQkJZWMtPmVjX21lbWJlcnMgPSBsaXN0X2RlbGV0ZV9jZWxs KGVjLT5lY19tZW1iZXJzLCBjZWxsKTsKKwkJZWxzZQorCQkJY291bnRlcisrOworCX0KK30K KworLyoKKyAqIFVwZGF0ZSBFQyBzb3VyY2VzIHRvIHBvaW50IHRvIHRoZSByZW1haW5pbmcg cmVsYXRpb24gaW5zdGVhZCBvZiB0aGUKKyAqIHJlbW92ZWQgb25lLgorICovCitzdGF0aWMg dm9pZAordXBkYXRlX2VjX3NvdXJjZXMoTGlzdCAqKnNvdXJjZXMsIEluZGV4IHRvUmVtb3Zl LCBJbmRleCB0b0tlZXApCit7CisJaW50CQkJY291bnRlcjsKKworCWZvciAoY291bnRlciA9 IDA7IGNvdW50ZXIgPCBsaXN0X2xlbmd0aCgqc291cmNlcyk7KQorCXsKKwkJTGlzdENlbGwg ICAqY2VsbCA9IGxpc3RfbnRoX2NlbGwoKnNvdXJjZXMsIGNvdW50ZXIpOworCQlSZXN0cmlj dEluZm8gKnJpbmZvID0gY2FzdE5vZGUoUmVzdHJpY3RJbmZvLCBsZmlyc3QoY2VsbCkpOwor CQlpbnQJCQljb3VudGVyMTsKKworCQlpZiAoIWJtc19pc19tZW1iZXIodG9SZW1vdmUsIHJp bmZvLT5yZXF1aXJlZF9yZWxpZHMpKQorCQl7CisJCQljb3VudGVyKys7CisJCQljb250aW51 ZTsKKwkJfQorCisJCWNoYW5nZV92YXJubyhyaW5mby0+Y2xhdXNlLCB0b1JlbW92ZSwgdG9L ZWVwKTsKKworCQkvKgorCQkgKiBBZnRlciBzd2l0Y2hpbmcgdGhlIGNsYXVzZSB0byB0aGUg cmVtYWluaW5nIHJlbGF0aW9uLCBjaGVjayBpdCBmb3IKKwkJICogcmVkdW5kYW5jeSB3aXRo IGV4aXN0aW5nIG9uZXMuIFdlIGRvbid0IGhhdmUgdG8gY2hlY2sgZm9yCisJCSAqIHJlZHVu ZGFuY3kgd2l0aCBkZXJpdmVkIGNsYXVzZXMsIGJlY2F1c2Ugd2UndmUganVzdCBkZWxldGVk IHRoZW0uCisJCSAqLworCQlmb3IgKGNvdW50ZXIxID0gMDsgY291bnRlcjEgPCBsaXN0X2xl bmd0aCgqc291cmNlcyk7IGNvdW50ZXIxKyspCisJCXsKKwkJCVJlc3RyaWN0SW5mbyAqb3Ro ZXI7CisKKwkJCWlmIChjb3VudGVyMSA9PSBjb3VudGVyKQorCQkJCWNvbnRpbnVlOworCisJ CQlvdGhlciA9IGNhc3ROb2RlKFJlc3RyaWN0SW5mbywgbGlzdF9udGgoKnNvdXJjZXMsIGNv dW50ZXIxKSk7CisJCQlpZiAoZXF1YWwocmluZm8tPmNsYXVzZSwgb3RoZXItPmNsYXVzZSkp CisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoY291bnRlcjEgPCBsaXN0X2xlbmd0aCgqc291 cmNlcykpCisJCQkqc291cmNlcyA9IGxpc3RfZGVsZXRlX2NlbGwoKnNvdXJjZXMsIGNlbGwp OworCQllbHNlCisJCXsKKwkJCWNvdW50ZXIrKzsKKworCQkJLyogV2Ugd2lsbCBrZWVwIHRo aXMgUmVzdHJpY3RJbmZvLCBjb3JyZWN0IGl0cyByZWxpZHMuICovCisJCQljaGFuZ2Vfcmlu Zm8ocmluZm8sIHRvUmVtb3ZlLCB0b0tlZXApOworCQl9CisJfQorfQorCisvKgorICogUmVt b3ZlIGEgcmVsYXRpb24gYWZ0ZXIgd2UgaGF2ZSBwcm92ZW4gdGhhdCBpdCBwYXJ0aWNpcGF0 ZXMgb25seSBpbiBhbgorICogdW5uZWVkZWQgdW5pcXVlIHNlbGYgam9pbi4KKyAqCisgKiBU aGUgam9pbmNsYXVzZXMgbGlzdCBpcyBkZXN0cnVjdGl2ZWx5IGNoYW5nZWQuCisgKi8KK3N0 YXRpYyB2b2lkCityZW1vdmVfc2VsZl9qb2luX3JlbChQbGFubmVySW5mbyAqcm9vdCwgUGxh blJvd01hcmsgKmttYXJrLCBQbGFuUm93TWFyayAqcm1hcmssCisJCQkJCSBSZWxPcHRJbmZv ICp0b0tlZXAsIFJlbE9wdEluZm8gKnRvUmVtb3ZlKQoreworCUxpc3RDZWxsICAgKmNlbGw7 CisJaW50CQkJaTsKKwlMaXN0CSAgICp0YXJnZXQgPSBOSUw7CisKKwkvKgorCSAqIEluY2x1 ZGUgYWxsIGVjbGFzcyBtZW50aW9ucyBvZiByZW1vdmVkIHJlbGF0aW9uIGludG8gdGhlIGVj bGFzcworCSAqIG1lbnRpb25zIG9mIGtlcHQgcmVsYXRpb24uCisJICovCisJdG9LZWVwLT5l Y2xhc3NfaW5kZXhlcyA9IGJtc19hZGRfbWVtYmVycyh0b1JlbW92ZS0+ZWNsYXNzX2luZGV4 ZXMsCisJCQkJCQkJCQkJCSB0b0tlZXAtPmVjbGFzc19pbmRleGVzKTsKKworCS8qCisJICog Tm93LCBiYXNlcmVzdHJpY3RpbmZvIHJlcGxlbmlzaGVkIHdpdGggcmVzdHJpY3Rpb25zIGZy b20gcmVtb3ZpbmcKKwkgKiByZWxhdGlvbi4gSXQgaXMgbmVlZGVkIHRvIHJlbW92ZSBkdXBs aWNhdGVzIGFuZCByZXBsYWNlIGRlZ2VuZXJhdGVkCisJICogY2xhdXNlcyB3aXRoIGEgTnVs bFRlc3QuCisJICovCisJZm9yZWFjaChjZWxsLCB0b0tlZXAtPmJhc2VyZXN0cmljdGluZm8p CisJeworCQlSZXN0cmljdEluZm8gKnJpbmZvID0gbGZpcnN0X25vZGUoUmVzdHJpY3RJbmZv LCBjZWxsKTsKKwkJTGlzdENlbGwgICAqb3RoZXJDZWxsID0gTlVMTDsKKworCQlBc3NlcnQo IWJtc19pc19tZW1iZXIodG9SZW1vdmUtPnJlbGlkLCByaW5mby0+Y2xhdXNlX3JlbGlkcykp OworCisJCS8qCisJCSAqIElmIHRoaXMgY2xhdXNlIGlzIGEgbWVyZ2Vqb2luYWJsZSBlcXVh bGl0eSBjbGF1c2UgdGhhdCBjb21wYXJlcyBhCisJCSAqIHZhcmlhYmxlIHRvIGl0c2VsZiwg aS5lLiwgaGFzIHRoZSBmb3JtIG9mICJYPVgiLCByZXBsYWNlIGl0IHdpdGgKKwkJICogbnVs bCB0ZXN0LgorCQkgKi8KKwkJaWYgKHJpbmZvLT5tZXJnZW9wZmFtaWxpZXMgJiYgSXNBKHJp bmZvLT5jbGF1c2UsIE9wRXhwcikpCisJCXsKKwkJCUV4cHIJICAgKmxlZnRPcDsKKwkJCUV4 cHIJICAgKnJpZ2h0T3A7CisKKwkJCWxlZnRPcCA9IChFeHByICopIGdldF9sZWZ0b3Aocmlu Zm8tPmNsYXVzZSk7CisJCQlyaWdodE9wID0gKEV4cHIgKikgZ2V0X3JpZ2h0b3AocmluZm8t PmNsYXVzZSk7CisKKwkJCWlmIChsZWZ0T3AgIT0gTlVMTCAmJiBlcXVhbChsZWZ0T3AsIHJp Z2h0T3ApKQorCQkJeworCQkJCU51bGxUZXN0ICAgKm51bGxUZXN0ID0gbWFrZU5vZGUoTnVs bFRlc3QpOworCisJCQkJbnVsbFRlc3QtPmFyZyA9IGxlZnRPcDsKKwkJCQludWxsVGVzdC0+ bnVsbHRlc3R0eXBlID0gSVNfTk9UX05VTEw7CisJCQkJbnVsbFRlc3QtPmFyZ2lzcm93ID0g ZmFsc2U7CisJCQkJbnVsbFRlc3QtPmxvY2F0aW9uID0gLTE7CisJCQkJcmluZm8tPmNsYXVz ZSA9IChFeHByICopIG51bGxUZXN0OworCQkJfQorCQl9CisKKwkJLyogU2VhcmNoIGZvciBk dXBsaWNhdGVzLiAqLworCQlmb3JlYWNoKG90aGVyQ2VsbCwgdGFyZ2V0KQorCQl7CisJCQlS ZXN0cmljdEluZm8gKm90aGVyID0gbGZpcnN0X25vZGUoUmVzdHJpY3RJbmZvLCBvdGhlckNl bGwpOworCisJCQlpZiAob3RoZXIgPT0gcmluZm8gfHwKKwkJCQkocmluZm8tPnBhcmVudF9l YyAhPSBOVUxMCisJCQkJICYmIG90aGVyLT5wYXJlbnRfZWMgPT0gcmluZm8tPnBhcmVudF9l YykKKwkJCQl8fCBlcXVhbChyaW5mby0+Y2xhdXNlLCBvdGhlci0+Y2xhdXNlKSkKKwkJCXsK KwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChvdGhlckNlbGwgIT0gTlVMTCkKKwkJ CS8qIER1cGxpY2F0ZSBmb3VuZCAqLworCQkJY29udGludWU7CisKKwkJdGFyZ2V0ID0gbGFw cGVuZCh0YXJnZXQsIHJpbmZvKTsKKwl9CisKKwlsaXN0X2ZyZWUodG9LZWVwLT5iYXNlcmVz dHJpY3RpbmZvKTsKKwl0b0tlZXAtPmJhc2VyZXN0cmljdGluZm8gPSB0YXJnZXQ7CisKKwkv KgorCSAqIFVwZGF0ZSB0aGUgZXF1aXZhbGVuY2UgY2xhc3NlcyB0aGF0IHJlZmVyZW5jZSB0 aGUgcmVtb3ZlZCByZWxhdGlvbnMuCisJICovCisJZm9yZWFjaChjZWxsLCByb290LT5lcV9j bGFzc2VzKQorCXsKKwkJRXF1aXZhbGVuY2VDbGFzcyAqZWMgPSBsZmlyc3QoY2VsbCk7CisK KwkJaWYgKCFibXNfaXNfbWVtYmVyKHRvUmVtb3ZlLT5yZWxpZCwgZWMtPmVjX3JlbGlkcykp CisJCXsKKwkJCS8qCisJCQkgKiBUaGlzIEVDIGRvZXNuJ3QgcmVmZXJlbmNlIHRoZSByZW1v dmVkIHJlbGF0aW9uLCBub3RoaW5nIHRvIGJlCisJCQkgKiBkb25lIGZvciBpdC4KKwkJCSAq LworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBVcGRhdGUgdGhlIEVDIG1lbWJl cnMgdG8gcmVmZXJlbmNlIHRoZSByZW1haW5pbmcgcmVsYXRpb24gaW5zdGVhZAorCQkgKiBv ZiB0aGUgcmVtb3ZlZCBvbmUuCisJCSAqLworCQl1cGRhdGVfZWNfbWVtYmVycyhlYywgdG9S ZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlkKTsKKwkJZWMtPmVjX3JlbGlkcyA9IGNoYW5n ZV9yZWxpZChlYy0+ZWNfcmVsaWRzLCB0b1JlbW92ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQp OworCisJCS8qCisJCSAqIFdlIHdpbGwgbm93IHVwZGF0ZSBzb3VyY2UgYW5kIGRlcml2ZWQg Y2xhdXNlcyBvZiB0aGUgRUMuCisJCSAqCisJCSAqIFJlc3RyaWN0aW9uIGNsYXVzZXMgZm9y IGJhc2UgcmVsYXRpb25zIGFyZSBhbHJlYWR5IGRpc3RyaWJ1dGVkIHRvCisJCSAqIHRoZSBy ZXNwZWN0aXZlIGJhc2VyZXN0cmljdGluZm8gbGlzdHMgKHNlZQorCQkgKiBnZW5lcmF0ZV9p bXBsaWVkX2VxdWFsaXRpZXMpLiBUaGUgYWJvdmUgY29kZSBoYXMgYWxyZWFkeSBwcm9jZXNz ZWQKKwkJICogdGhpcyBsaXN0LCBhbmQgdXBkYXRlZCB0aGVzZSBjbGF1c2VzIHRvIHJlZmVy ZW5jZSB0aGUgcmVtYWluaW5nCisJCSAqIHJlbGF0aW9uLCBzbyB3ZSBjYW4gc2tpcCB0aGVt IGhlcmUgYmFzZWQgb24gdGhlaXIgcmVsaWRzLgorCQkgKgorCQkgKiBMaWtld2lzZSwgd2Ug aGF2ZSBhbHJlYWR5IHByb2Nlc3NlZCB0aGUgam9pbiBjbGF1c2VzIHRoYXQgam9pbiB0aGUK KwkJICogcmVtb3ZlZCByZWxhdGlvbiB0byB0aGUgcmVtYWluaW5nIG9uZS4KKwkJICoKKwkJ ICogRmluYWxseSwgdGhlcmUgYXJlIGpvaW4gY2xhdXNlcyB0aGF0IGpvaW4gdGhlIHJlbW92 ZWQgcmVsYXRpb24gdG8KKwkJICogc29tZSB0aGlyZCByZWxhdGlvbi4gV2UgY2FuJ3QganVz dCBkZWxldGUgdGhlIHNvdXJjZSBjbGF1c2VzIGFuZAorCQkgKiByZWdlbmVyYXRlIHRoZW0g ZnJvbSB0aGUgRUMsIGJlY2F1c2UgdGhlIGNvcnJlc3BvbmRpbmcgZXF1YWxpdHkKKwkJICog b3BlcmF0b3JzIG1pZ2h0IGJlIG1pc3NpbmcgKHNlZSB0aGUgaGFuZGxpbmcgb2YgZWNfYnJv a2VuKS4KKwkJICogVGhlcmVmb3JlLCB3ZSB3aWxsIHVwZGF0ZSB0aGUgcmVmZXJlbmNlcyBp biB0aGUgc291cmNlIGNsYXVzZXMuCisJCSAqCisJCSAqIERlcml2ZWQgY2xhdXNlcyBjYW4g YmUgZ2VuZXJhdGVkIGFnYWluLCBzbyBpdCBpcyBzaW1wbGVyIHRvIGp1c3QKKwkJICogZGVs ZXRlIHRoZW0uCisJCSAqLworCQlsaXN0X2ZyZWUoZWMtPmVjX2Rlcml2ZXMpOworCQllYy0+ ZWNfZGVyaXZlcyA9IE5VTEw7CisJCXVwZGF0ZV9lY19zb3VyY2VzKCZlYy0+ZWNfc291cmNl cywgdG9SZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlkKTsKKwl9CisKKwkvKgorCSAqIFRy YW5zZmVyIHRoZSB0YXJnZXRsaXN0IGFuZCBhdHRyX25lZWRlZCBmbGFncy4KKwkgKi8KKwlB c3NlcnQodG9SZW1vdmUtPnJlbHRhcmdldC0+c29ydGdyb3VwcmVmcyA9PSAwKTsKKworCWZv cmVhY2goY2VsbCwgdG9SZW1vdmUtPnJlbHRhcmdldC0+ZXhwcnMpCisJeworCQlFeHByCSAg ICpub2RlID0gbGZpcnN0KGNlbGwpOworCisJCWNoYW5nZV92YXJubyhub2RlLCB0b1JlbW92 ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCQlpZiAoIWxpc3RfbWVtYmVyKHRvS2VlcC0+ cmVsdGFyZ2V0LT5leHBycywgbm9kZSkpCisJCQl0b0tlZXAtPnJlbHRhcmdldC0+ZXhwcnMg PSBsYXBwZW5kKHRvS2VlcC0+cmVsdGFyZ2V0LT5leHBycywgbm9kZSk7CisJfQorCisJZm9y IChpID0gdG9LZWVwLT5taW5fYXR0cjsgaSA8PSB0b0tlZXAtPm1heF9hdHRyOyBpKyspCisJ eworCQlpbnQJCQlhdHRubyA9IGkgLSB0b0tlZXAtPm1pbl9hdHRyOworCisJCXRvS2VlcC0+ YXR0cl9uZWVkZWRbYXR0bm9dID0gYm1zX2FkZF9tZW1iZXJzKHRvS2VlcC0+YXR0cl9uZWVk ZWRbYXR0bm9dLAorCQkJCQkJCQkJCQkJCSB0b1JlbW92ZS0+YXR0cl9uZWVkZWRbYXR0bm9d KTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSByZW1vdmVkIHJlbGF0aW9uIGhhcyBhIHJvdyBt YXJrLCB0cmFuc2ZlciBpdCB0byB0aGUgcmVtYWluaW5nCisJICogb25lLgorCSAqCisJICog SWYgYm90aCByZWxzIGhhdmUgcm93IG1hcmtzLCBqdXN0IGtlZXAgdGhlIG9uZSBjb3JyZXNw b25kaW5nIHRvIHRoZQorCSAqIHJlbWFpbmluZyByZWxhdGlvbiwgYmVjYXVzZSB3ZSB2ZXJp ZmllZCBlYXJsaWVyIHRoYXQgdGhleSBoYXZlIHRoZSBzYW1lCisJICogc3RyZW5ndGguCisJ ICoKKwkgKiBBbHNvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzY3JhdGNoLT5yb3dfbWFya3MgY2Fj aGUgaXMgdXAgdG8gZGF0ZSwgYmVjYXVzZQorCSAqIHdlIGFyZSBnb2luZyB0byB1c2UgaXQg Zm9yIGZ1cnRoZXIgam9pbiByZW1vdmFscy4KKwkgKi8KKwlpZiAocm1hcmspCisJeworCQlp ZiAoa21hcmspCisJCXsKKwkJCUFzc2VydChrbWFyay0+bWFya1R5cGUgPT0gcm1hcmstPm1h cmtUeXBlKTsKKworCQkJLyoKKwkJCSAqIFhYWDogV2h5IGhlcmUgd2UgaGF2ZW4ndCBhbnkg ZGlmZmVyZW5jZXMgaW4gcmVtb3Zpbmcgcm1hcmsgb3IKKwkJCSAqIGttYXJrPworCQkJICov CisJCQlyb290LT5yb3dNYXJrcyA9IGxpc3RfZGVsZXRlX3B0cihyb290LT5yb3dNYXJrcywg cm1hcmspOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogU2hvdWxkbid0IGhhdmUgaW5oZXJp dGFuY2UgY2hpbGRyZW4gaGVyZS4gKi8KKwkJCUFzc2VydChybWFyay0+cnRpID09IHJtYXJr LT5wcnRpKTsKKworCQkJcm1hcmstPnJ0aSA9IHJtYXJrLT5wcnRpID0gdG9LZWVwLT5yZWxp ZDsKKwkJfQorCX0KKworCS8qCisJICogQ2hhbmdlIHZhcm5vIGluIHNvbWUgc3BlY2lhbCBj YXNlcyB3aXRoIG5vbi10cml2aWFsIFJhbmdlVGJsRW50cnkKKwkgKi8KKwlmb3JlYWNoKGNl bGwsIHJvb3QtPnBhcnNlLT5ydGFibGUpCisJeworCQlSYW5nZVRibEVudHJ5ICpydGUgPSBs Zmlyc3QoY2VsbCk7CisKKwkJc3dpdGNoIChydGUtPnJ0ZWtpbmQpCisJCXsKKwkJCWNhc2Ug UlRFX0ZVTkNUSU9OOgorCQkJCWNoYW5nZV92YXJubygoRXhwciAqKSBydGUtPmZ1bmN0aW9u cywgdG9SZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlkKTsKKwkJCQlicmVhazsKKwkJCWNh c2UgUlRFX1RBQkxFRlVOQzoKKwkJCQljaGFuZ2VfdmFybm8oKEV4cHIgKikgcnRlLT50YWJs ZWZ1bmMsIHRvUmVtb3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisJCQkJYnJlYWs7CisJ CQljYXNlIFJURV9WQUxVRVM6CisJCQkJY2hhbmdlX3Zhcm5vKChFeHByICopIHJ0ZS0+dmFs dWVzX2xpc3RzLCB0b1JlbW92ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCQkJCWJyZWFr OworCQkJZGVmYXVsdDoKKwkJCQkvKiBubyBvcCAqLworCQkJCWJyZWFrOworCQl9CisJfQor CisJLyoKKwkgKiBSZXBsYWNlIHZhcm5vIGluIHJvb3QgdGFyZ2V0bGlzdCBhbmQgSEFWSU5H IGNsYXVzZS4KKwkgKi8KKwljaGFuZ2VfdmFybm8oKEV4cHIgKikgcm9vdC0+cHJvY2Vzc2Vk X3RsaXN0LCB0b1JlbW92ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCWNoYW5nZV92YXJu bygoRXhwciAqKSByb290LT5wYXJzZS0+aGF2aW5nUXVhbCwgdG9SZW1vdmUtPnJlbGlkLCB0 b0tlZXAtPnJlbGlkKTsKKworCS8qCisJICogVHJhbnNmZXIgam9pbiBhbmQgcmVzdHJpY3Rp b24gY2xhdXNlcyBmcm9tIHRoZSByZW1vdmVkIHJlbGF0aW9uIHRvIHRoZQorCSAqIHJlbWFp bmluZyBvbmUuIFdlIGNoYW5nZSB0aGUgVmFycyBvZiB0aGUgY2xhdXNlIHRvIHBvaW50IHRv IHRoZQorCSAqIHJlbWFpbmluZyByZWxhdGlvbiBpbnN0ZWFkIG9mIHRoZSByZW1vdmVkIG9u ZS4gVGhlIGNsYXVzZXMgdGhhdCByZXF1aXJlCisJICogYSBzdWJzZXQgb2Ygam9pbnJlbGlk cyBiZWNvbWUgcmVzdHJpY3Rpb24gY2xhdXNlcyBvZiB0aGUgcmVtYWluaW5nCisJICogcmVs YXRpb24sIGFuZCBvdGhlcnMgcmVtYWluIGpvaW4gY2xhdXNlcy4gV2UgYXBwZW5kIHRoZW0g dG8KKwkgKiBiYXNlcmVzdHJpY3RpbmZvIGFuZCBqb2luaW5mbyByZXNwZWN0aXZlbHksIHRy eWluZyBub3QgdG8gaW50cm9kdWNlCisJICogZHVwbGljYXRlcy4KKwkgKgorCSAqIFdlIGFs c28gaGF2ZSB0byBwcm9jZXNzIHRoZSAnam9pbmNsYXVzZXMnIGxpc3QgaGVyZSwgYmVjYXVz ZSBpdAorCSAqIGNvbnRhaW5zIEVDLWRlcml2ZWQgam9pbiBjbGF1c2VzIHdoaWNoIG11c3Qg YmVjb21lIGZpbHRlciBjbGF1c2VzLiBJdAorCSAqIGlzIG5vdCBlbm91Z2ggdG8ganVzdCBj b3JyZWN0IHRoZSBFQ3MsIGJlY2F1c2UgdGhlIEVDLWRlcml2ZWQKKwkgKiByZXN0cmljdGlv bnMgYXJlIGdlbmVyYXRlZCBiZWZvcmUgam9pbiByZW1vdmFsIChzZWUKKwkgKiBnZW5lcmF0 ZV9iYXNlX2ltcGxpZWRfZXF1YWxpdGllcykuCisJICovCit9CisKKy8qCisgKiBzcGxpdF9z ZWxmam9pbl9xdWFscworICoJCVByb2Nlc3NlcyAnam9pbnF1YWxzJyBidWlsZGluZyB0d28g bGlzdHMsIG9uZSB3aXRoIGEgbGlzdCBvZiBxdWFscworICoJCXdoZXJlIHRoZSBjb2x1bW5z L2V4cHJzIG9uIGVpdGhlciBzaWRlIG9mIHRoZSBqb2luIG1hdGNoIGFuZCBhbm90aGVyCisg KgkJbGlzdCBjb250YWluaW5nIHRoZSByZW1haW5pbmcgcXVhbHMuCisgKgorICogJ2pvaW5x dWFscycgbXVzdCBvbmx5IGNvbnRhaW4gcXVhbHMgZm9yIGEgUlRFX1JFTEFUSU9OIGJlaW5n IGpvaW5lZCB0bworICogaXRzZWxmLgorICovCitzdGF0aWMgdm9pZAorc3BsaXRfc2VsZmpv aW5fcXVhbHMoUGxhbm5lckluZm8gKnJvb3QsIExpc3QgKmpvaW5xdWFscywgTGlzdCAqKnNl bGZqb2lucXVhbHMsCisJCQkJCSBMaXN0ICoqb3RoZXJqb2lucXVhbHMpCit7CisJTGlzdENl bGwgICAqbGM7CisJTGlzdAkgICAqc2pvaW5xdWFscyA9IE5JTDsKKwlMaXN0CSAgICpvam9p bnF1YWxzID0gTklMOworCisJZm9yZWFjaChsYywgam9pbnF1YWxzKQorCXsKKwkJUmVzdHJp Y3RJbmZvICpyaW5mbyA9IGxmaXJzdF9ub2RlKFJlc3RyaWN0SW5mbywgbGMpOworCQlPcEV4 cHIJICAgKmV4cHI7CisJCUV4cHIJICAgKmxlZnRleHByOworCQlFeHByCSAgICpyaWdodGV4 cHI7CisKKwkJLyogSW4gZ2VuZXJhbCwgY2xhdXNlIGxvb2tzIGxpa2UgRihhcmcxKSA9IEco YXJnMikgPyAqLworCQlpZiAoIXJpbmZvLT5tZXJnZW9wZmFtaWxpZXMgfHwKKwkJCWJtc19u dW1fbWVtYmVycyhyaW5mby0+Y2xhdXNlX3JlbGlkcykgIT0gMiB8fAorCQkJYm1zX251bV9t ZW1iZXJzKHJpbmZvLT5sZWZ0X3JlbGlkcykgIT0gMSB8fAorCQkJYm1zX251bV9tZW1iZXJz KHJpbmZvLT5yaWdodF9yZWxpZHMpICE9IDEpCisJCXsKKwkJCW9qb2lucXVhbHMgPSBsYXBw ZW5kKG9qb2lucXVhbHMsIHJpbmZvKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZXhwciA9 IChPcEV4cHIgKikgcmluZm8tPmNsYXVzZTsKKworCQlpZiAoIUlzQShleHByLCBPcEV4cHIp IHx8IGxpc3RfbGVuZ3RoKGV4cHItPmFyZ3MpICE9IDIpCisJCXsKKwkJCW9qb2lucXVhbHMg PSBsYXBwZW5kKG9qb2lucXVhbHMsIHJpbmZvKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJ bGVmdGV4cHIgPSAoRXhwciAqKSBjb3B5T2JqZWN0KGdldF9sZWZ0b3AocmluZm8tPmNsYXVz ZSkpOworCQlyaWdodGV4cHIgPSAoRXhwciAqKSBjb3B5T2JqZWN0KGdldF9yaWdodG9wKHJp bmZvLT5jbGF1c2UpKTsKKworCQkvKiBDYW4ndCBtYXRjaCBvZiB0aGUgZXhwcnMgYXJlIG5v dCBvZiB0aGUgc2FtZSB0eXBlICovCisJCWlmIChsZWZ0ZXhwci0+dHlwZSAhPSByaWdodGV4 cHItPnR5cGUpCisJCXsKKwkJCW9qb2lucXVhbHMgPSBsYXBwZW5kKG9qb2lucXVhbHMsIHJp bmZvKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJY2hhbmdlX3Zhcm5vKHJpZ2h0ZXhwciwK KwkJCQkJIGJtc19uZXh0X21lbWJlcihyaW5mby0+cmlnaHRfcmVsaWRzLCAtMSksCisJCQkJ CSBibXNfbmV4dF9tZW1iZXIocmluZm8tPmxlZnRfcmVsaWRzLCAtMSkpOworCisJCWlmIChl cXVhbChsZWZ0ZXhwciwgcmlnaHRleHByKSkKKwkJCXNqb2lucXVhbHMgPSBsYXBwZW5kKHNq b2lucXVhbHMsIHJpbmZvKTsKKwkJZWxzZQorCQkJb2pvaW5xdWFscyA9IGxhcHBlbmQob2pv aW5xdWFscywgcmluZm8pOworCX0KKworCSpzZWxmam9pbnF1YWxzID0gc2pvaW5xdWFsczsK Kwkqb3RoZXJqb2lucXVhbHMgPSBvam9pbnF1YWxzOworfQorCisvKgorICogQ2hlY2sgZm9y IGEgY2FzZSB3aGVuIHVuaXF1ZW5lc3MgW3BhcnRseV0gZGVyaXZlZCBmcm9tIGEgYmFzZXJl c3RyaWN0aW5mbworICogY2xhdXNlLiBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSBhIGNoYW5jZSB0 byByZXR1cm4gb25seSBvbmUgcm93IChpZiBzdWNoCisgKiBjbGF1c2VzIG9uIGJvdGggc2lk ZXMgb2YgU0ogaXMgZXF1YWwpIG9yIG5vdGhpbmcgLSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQu CisgKi8KK3N0YXRpYyBib29sCittYXRjaF91bmlxdWVfY2xhdXNlcyhSZWxPcHRJbmZvICpv dXRlciwgTGlzdCAqdWNsYXVzZXMsIEluZGV4IHJlbGlkKQoreworCUxpc3RDZWxsICAgKmxj OworCisJZm9yZWFjaChsYywgdWNsYXVzZXMpCisJeworCQlSZXN0cmljdEluZm8gICAqcmlu Zm8gPSBsZmlyc3Rfbm9kZShSZXN0cmljdEluZm8sIGxjKTsKKwkJRXhwcgkJICAgKmNsYXVz ZTsKKwkJTm9kZQkJICAgKmljbGF1c2U7CisJCU5vZGUJCSAgICpjMTsKKwkJYm9vbAkJCW1h dGNoZWQgPSBmYWxzZTsKKwkJTGlzdENlbGwJICAgKm9sYzsKKworCQlBc3NlcnQob3V0ZXIt PnJlbGlkID4gMCAmJiByZWxpZCA+IDApOworCisJCS8qIE9ubHkgZmlsdGVycyBsaWtlIGYo Ui54MSwuLi4sUi54TikgPT0gZXhwciB3ZSBzaG91bGQgY29uc2lkZXIuICovCisJCUFzc2Vy dChibXNfaXNfZW1wdHkocmluZm8tPmxlZnRfcmVsaWRzKSB8fAorCQkJICAgYm1zX2lzX2Vt cHR5KHJpbmZvLT5yaWdodF9yZWxpZHMpKTsKKworCQljbGF1c2UgPSAoRXhwciAqKSBjb3B5 T2JqZWN0KHJpbmZvLT5jbGF1c2UpOworCQljaGFuZ2VfdmFybm8oY2xhdXNlLCByZWxpZCwg b3V0ZXItPnJlbGlkKTsKKworCQljMSA9IChyaW5mby0+b3V0ZXJfaXNfbGVmdCA/IGdldF9s ZWZ0b3AoY2xhdXNlKSA6IGdldF9yaWdodG9wKGNsYXVzZSkpOworCQlpY2xhdXNlID0gKHJp bmZvLT5vdXRlcl9pc19sZWZ0ID8KKwkJCQkJCQkJCWdldF9yaWdodG9wKGNsYXVzZSkgOiBn ZXRfbGVmdG9wKGNsYXVzZSkpOworCisJCS8qCisJCSAqIENvbXBhcmUgdGhlc2UgbGVmdCBh bmQgcmlnaHQgc2lkZXMgd2l0aCBjb3JyZXNwb25kaW5nIHNpZGVzIG9mIHRoZQorCQkgKiBv dXRlcidzIGZpbHRlcnMuIElmIG5vIG9uZSBkZXRlY3RlZCAtIHJldHVybiBpbW1lZGlhdGVs eS4KKwkJICovCisJCWZvcmVhY2gob2xjLCBvdXRlci0+YmFzZXJlc3RyaWN0aW5mbykKKwkJ eworCQkJUmVzdHJpY3RJbmZvICpvcmluZm8gPSBsZmlyc3Rfbm9kZShSZXN0cmljdEluZm8s IG9sYyk7CisJCQlOb2RlCQkgKm9jbGF1c2U7CisJCQlOb2RlCQkgKmMyOworCisJCQlpZiAo b3JpbmZvLT5tZXJnZW9wZmFtaWxpZXMgPT0gTklMKQorCQkJCS8qIERvbid0IGNvbnNpZGVy IGNsYXVzZXMgd2hpY2ggYXJlbid0IHNpbWlsYXIgdG8gJ0YoWCk9RyhZKScgKi8KKwkJCQlj b250aW51ZTsKKworCQkJb2NsYXVzZSA9IChibXNfaXNfZW1wdHkob3JpbmZvLT5sZWZ0X3Jl bGlkcykgPworCQkJCQlnZXRfcmlnaHRvcChvcmluZm8tPmNsYXVzZSkgOiBnZXRfbGVmdG9w KG9yaW5mby0+Y2xhdXNlKSk7CisJCQljMiA9IChibXNfaXNfZW1wdHkob3JpbmZvLT5sZWZ0 X3JlbGlkcykgPworCQkJCSAgIGdldF9sZWZ0b3Aob3JpbmZvLT5jbGF1c2UpIDogZ2V0X3Jp Z2h0b3Aob3JpbmZvLT5jbGF1c2UpKTsKKworCQkJaWYgKGVxdWFsKGljbGF1c2UsIG9jbGF1 c2UpICYmIGVxdWFsKGMxLCBjMikpCisJCQl7CisJCQkJbWF0Y2hlZCA9IHRydWU7CisJCQkJ YnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIW1hdGNoZWQpCisJCQlyZXR1cm4gZmFsc2U7 CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBGaW5kIGFuZCByZW1vdmUgdW5p cXVlIHNlbGYgam9pbnMgaW4gYSBncm91cCBvZiBiYXNlIHJlbGF0aW9ucyB0aGF0IGhhdmUK KyAqIHRoZSBzYW1lIE9pZC4KKyAqCisgKiBSZXR1cm5zIGEgc2V0IG9mIHJlbGlkcyB0aGF0 IHdlcmUgcmVtb3ZlZC4KKyAqLworc3RhdGljIFJlbGlkcworcmVtb3ZlX3NlbGZfam9pbnNf b25lX2dyb3VwKFBsYW5uZXJJbmZvICpyb290LCBSZWxpZHMgcmVsaWRzKQoreworCVJlbGlk cwkJam9pbnJlbGlkcyA9IE5VTEw7CisJUmVsaWRzCQlyZXN1bHQgPSBOVUxMOworCWludAkJ CWs7CQkJCS8qIEluZGV4IG9mIGtlcHQgcmVsYXRpb24gKi8KKwlpbnQJCQlyID0gLTE7CQkJ LyogSW5kZXggb2YgcmVtb3ZlZCByZWxhdGlvbiAqLworCisJaWYgKGJtc19udW1fbWVtYmVy cyhyZWxpZHMpIDwgMikKKwkJcmV0dXJuIE5VTEw7CisKKwl3aGlsZSAoKHIgPSBibXNfbmV4 dF9tZW1iZXIocmVsaWRzLCByKSkgPiAwKQorCXsKKwkJUmVsT3B0SW5mbyAqb3V0ZXIgPSBy b290LT5zaW1wbGVfcmVsX2FycmF5W3JdOworCisJCWsgPSByOworCisJCXdoaWxlICgoayA9 IGJtc19uZXh0X21lbWJlcihyZWxpZHMsIGspKSA+IDApCisJCXsKKwkJCVJlbE9wdEluZm8g KmlubmVyID0gcm9vdC0+c2ltcGxlX3JlbF9hcnJheVtrXTsKKwkJCUxpc3QJICAgKnJlc3Ry aWN0bGlzdDsKKwkJCUxpc3QJICAgKnNlbGZqb2lucXVhbHM7CisJCQlMaXN0CSAgICpvdGhl cmpvaW5xdWFsczsKKwkJCUxpc3RDZWxsICAgKmxjOworCQkJYm9vbAkJamluZm9fY2hlY2sg PSB0cnVlOworCQkJUGxhblJvd01hcmsgKm9tYXJrID0gTlVMTDsKKwkJCVBsYW5Sb3dNYXJr ICppbWFyayA9IE5VTEw7CisJCQlMaXN0CSAgICp1Y2xhdXNlcyA9IE5JTDsKKworCQkJLyog QSBzYW5pdHkgY2hlY2s6IHRoZSByZWxhdGlvbnMgaGF2ZSB0aGUgc2FtZSBPaWQuICovCisJ CQlBc3NlcnQocm9vdC0+c2ltcGxlX3J0ZV9hcnJheVtrXS0+cmVsaWQgPT0KKwkJCQkgICBy b290LT5zaW1wbGVfcnRlX2FycmF5W3JdLT5yZWxpZCk7CisKKwkJCS8qCisJCQkgKiBJdCBp cyBpbXBvc3NpYmxlIHRvIG9wdGltaXplIHR3byByZWxhdGlvbnMgaWYgdGhleSBiZWxvbmcg dG8KKwkJCSAqIGRpZmZlcmVudCBydWxlcyBvZiBvcmRlciByZXN0cmljdGlvbi4gT3RoZXJ3 aXNlIHBsYW5uZXIgY2FuJ3QKKwkJCSAqIGJlIGFibGUgdG8gZmluZCBhbnkgdmFyaWFudHMg b2YgY29ycmVjdCBxdWVyeSBwbGFuLgorCQkJICovCisJCQlmb3JlYWNoKGxjLCByb290LT5q b2luX2luZm9fbGlzdCkKKwkJCXsKKwkJCQlTcGVjaWFsSm9pbkluZm8gKmluZm8gPSAoU3Bl Y2lhbEpvaW5JbmZvICopIGxmaXJzdChsYyk7CisKKwkJCQlpZiAoKGJtc19pc19tZW1iZXIo aywgaW5mby0+c3luX2xlZnRoYW5kKSBeCisJCQkJCSBibXNfaXNfbWVtYmVyKHIsIGluZm8t PnN5bl9sZWZ0aGFuZCkpIHx8CisJCQkJCShibXNfaXNfbWVtYmVyKGssIGluZm8tPnN5bl9y aWdodGhhbmQpIF4KKwkJCQkJIGJtc19pc19tZW1iZXIociwgaW5mby0+c3luX3JpZ2h0aGFu ZCkpKQorCQkJCXsKKwkJCQkJamluZm9fY2hlY2sgPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJ CQkJfQorCQkJfQorCisJCQlpZiAoIWppbmZvX2NoZWNrKQorCQkJCWNvbnRpbnVlOworCisJ CQkvKiBSZXVzZSBqb2lucmVsaWRzIGJpdHNldCB0byBhdm9pZCByZWFsbG9jYXRpb24uICov CisJCQlqb2lucmVsaWRzID0gYm1zX2RlbF9tZW1iZXJzKGpvaW5yZWxpZHMsIGpvaW5yZWxp ZHMpOworCisJCQkvKgorCQkJICogV2Ugb25seSBkZWFsIHdpdGggYmFzZSByZWxzIGhlcmUs IHNvIHRoZWlyIHJlbGlkcyBiaXRzZXQKKwkJCSAqIGNvbnRhaW5zIG9ubHkgb25lIG1lbWJl ciAtLSB0aGVpciByZWxpZC4KKwkJCSAqLworCQkJam9pbnJlbGlkcyA9IGJtc19hZGRfbWVt YmVyKGpvaW5yZWxpZHMsIHIpOworCQkJam9pbnJlbGlkcyA9IGJtc19hZGRfbWVtYmVyKGpv aW5yZWxpZHMsIGspOworCisJCQkvKgorCQkJICogQXQgdGhpcyBzdGFnZSBqb2luaW5mbyBs aXN0cyBvZiBpbm5lciBhbmQgb3V0ZXIgY2FuIGNvbnRhaW4KKwkJCSAqIG9ubHkgY2xhdXNl cywgcmVxdWlyZWQgZm9yIGEgc3VwZXJpb3Igb3V0ZXIgam9pbiB0aGF0IGNhbid0CisJCQkg KiBpbmZsdWVuY2Ugb24gdGhpcyBvcHRpbWl6YXRpb24uIFNvLCB3ZSBjYW4gYXZvaWQgdG8g Y2FsbCB0aGUKKwkJCSAqIGJ1aWxkX2pvaW5yZWxfcmVzdHJpY3RsaXN0KCkgcm91dGluZS4K KwkJCSAqLworCQkJcmVzdHJpY3RsaXN0ID0gZ2VuZXJhdGVfam9pbl9pbXBsaWVkX2VxdWFs aXRpZXMocm9vdCwgam9pbnJlbGlkcywKKwkJCQkJCQkJCQkJCQkJCW91dGVyLT5yZWxpZHMs CisJCQkJCQkJCQkJCQkJCQlpbm5lcik7CisKKwkJCS8qCisJCQkgKiBQcm9jZXNzIHJlc3Ry aWN0bGlzdCB0byBzZXBlcmF0ZSBvdXQgdGhlIHNlbGYgam9pbiBxdWFscyBmcm9tCisJCQkg KiB0aGUgb3RoZXIgcXVhbHMuIGUuZyB4ID0geCBnb2VzIHRvIHNlbGZqb2lucXVhbHMgYW5k IGEgPSBiIHRvCisJCQkgKiBvdGhlcmpvaW5xdWFscy4KKwkJCSAqLworCQkJc3BsaXRfc2Vs ZmpvaW5fcXVhbHMocm9vdCwgcmVzdHJpY3RsaXN0LCAmc2VsZmpvaW5xdWFscywKKwkJCQkJ CQkJICZvdGhlcmpvaW5xdWFscyk7CisKKwkJCS8qIElzIGl0IGFuIHVuaXF1ZSBzZWxmIGpv aW4/ICovCisKKwkJCWlmIChsaXN0X2xlbmd0aChzZWxmam9pbnF1YWxzKSA9PSAwKQorCQkJ eworCQkJCS8qCisJCQkJICogWFhYOiB3ZSB3b3VsZCBkZXRlY3Qgc2VsZi1qb2luIHdpdGhv dXQgcXVhbHMgbGlrZSAneD09eCcgaWYKKwkJCQkgKiB3ZSBoYWQgYW4gZm9yZWlnbiBrZXkg Y29uc3RyYWludCBvbiBzb21lIG9mIG90aGVyIHF1YWxzIGFuZAorCQkJCSAqIHRoaXMgam9p biBoYXZlbid0IGFueSBjb2x1bW5zIGZyb20gdGhlIG91dGVyIGluIHRoZSB0YXJnZXQKKwkJ CQkgKiBsaXN0LiBCdXQgaXQgaXMgc3RpbGwgY29tcGxleCB0YXNrLgorCQkJCSAqLworCQkJ CWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogRGV0ZXJtaW5lIGlmIHRoZSBpbm5l ciB0YWJsZSBjYW4gZHVwbGljYXRlIG91dGVyIHJvd3MuICBXZSBtdXN0CisJCQkgKiBieXBh c3MgdGhlIHVuaXF1ZSByZWwgY2FjaGUgaGVyZSBzaW5jZSB3ZSdyZSBwb3NzaWJseSB1c2lu ZyBhCisJCQkgKiBzdWJzZXQgb2Ygam9pbiBxdWFscy4gV2UgY2FuIHVzZSAnZm9yY2VfY2Fj aGUnID0gdHJ1ZSB3aGVuIGFsbAorCQkJICogam9pbiBxdWFscyBhcmUgc2VsZmpvaW4gcXVh bHMuICBPdGhlcndpc2Ugd2UgY291bGQgZW5kIHVwCisJCQkgKiBwdXR0aW5nIGZhbHNlIG5l Z2F0aXZlcyBpbiB0aGUgY2FjaGUuCisJCQkgKi8KKwkJCWlmICghaW5uZXJyZWxfaXNfdW5p cXVlX2V4dChyb290LCBqb2lucmVsaWRzLCBvdXRlci0+cmVsaWRzLAorCQkJCQkJCQkJCWlu bmVyLCBKT0lOX0lOTkVSLCBzZWxmam9pbnF1YWxzLAorCQkJCQkJCQkJCWxpc3RfbGVuZ3Ro KG90aGVyam9pbnF1YWxzKSA9PSAwLAorCQkJCQkJCQkJCSZ1Y2xhdXNlcykpCisJCQkJY29u dGludWU7CisKKwkJCS8qCisJCQkgKiBXZSBoYXZlIHByb3ZlbiB0aGF0IGZvciBib3RoIHJl bGF0aW9ucywgdGhlIHNhbWUgdW5pcXVlIGluZGV4CisJCQkgKiBndWFyYW50ZWVzIHRoYXQg dGhlcmUgaXMgYXQgbW9zdCBvbmUgcm93IHdoZXJlIGNvbHVtbnMgZXF1YWwKKwkJCSAqIGdp dmVuIHZhbHVlcy4gVGhlc2UgdmFsdWVzIG11c3QgYmUgdGhlIHNhbWUgZm9yIGJvdGggcmVs YXRpb25zLAorCQkJICogb3IgZWxzZSB3ZSB3b24ndCBtYXRjaCB0aGUgc2FtZSByb3cgb24g ZWFjaCBzaWRlIG9mIGpvaW4uCisJCQkgKi8KKwkJCWlmICghbWF0Y2hfdW5pcXVlX2NsYXVz ZXMob3V0ZXIsIHVjbGF1c2VzLCBpbm5lci0+cmVsaWQpKQorCQkJCWNvbnRpbnVlOworCisJ CQkvKiBTZWUgZm9yIHJvdyBtYXJrcy4gKi8KKwkJCWZvcmVhY2gobGMsIHJvb3QtPnJvd01h cmtzKQorCQkJeworCQkJCVBsYW5Sb3dNYXJrICpyb3dNYXJrID0gKFBsYW5Sb3dNYXJrICop IGxmaXJzdChsYyk7CisKKwkJCQlpZiAocm93TWFyay0+cnRpID09IGspCisJCQkJeworCQkJ CQlBc3NlcnQoaW1hcmsgPT0gTlVMTCk7CisJCQkJCWltYXJrID0gcm93TWFyazsKKwkJCQl9 CisJCQkJZWxzZSBpZiAocm93TWFyay0+cnRpID09IHIpCisJCQkJeworCQkJCQlBc3NlcnQo b21hcmsgPT0gTlVMTCk7CisJCQkJCW9tYXJrID0gcm93TWFyazsKKwkJCQl9CisKKwkJCQlp ZiAob21hcmsgJiYgaW1hcmspCisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICog V2UgY2FuJ3QgcmVtb3ZlIHRoZSBqb2luIGlmIHRoZSByZWxhdGlvbnMgaGF2ZSByb3cgbWFy a3Mgb2YKKwkJCSAqIGRpZmZlcmVudCBzdHJlbmd0aCAoZS5nLiBvbmUgaXMgbG9ja2VkIEZP UiBVUERBVEUgYW5kIGFub3RoZXIKKwkJCSAqIGp1c3QgaGFzIFJPV19NQVJLX1JFRkVSRU5D RSBmb3IgRXZhbFBsYW5RdWFsIHJlY2hlY2tpbmcpLgorCQkJICovCisJCQlpZiAob21hcmsg JiYgaW1hcmsgJiYgb21hcmstPm1hcmtUeXBlICE9IGltYXJrLT5tYXJrVHlwZSkKKwkJCQlj b250aW51ZTsKKworCQkJLyoKKwkJCSAqIEJlIHNhZmUgdG8gZG8gbm90IHJlbW92ZSB0YWJs ZSBwYXJ0aWNpcGF0ZWQgaW4gY29tcGxpY2F0ZWQgUEgKKwkJCSAqLworCQkJZm9yZWFjaChs Yywgcm9vdC0+cGxhY2Vob2xkZXJfbGlzdCkKKwkJCXsKKwkJCQlQbGFjZUhvbGRlckluZm8g KnBoaW5mbyA9IChQbGFjZUhvbGRlckluZm8gKikgbGZpcnN0KGxjKTsKKworCQkJCS8qIHRo ZXJlIGlzbid0IGFueSBvdGhlciBwbGFjZSB0byBldmFsIFBIViAqLworCQkJCWlmIChibXNf aXNfc3Vic2V0KHBoaW5mby0+cGhfZXZhbF9hdCwgam9pbnJlbGlkcykgfHwKKwkJCQkJYm1z X2lzX3N1YnNldChwaGluZm8tPnBoX25lZWRlZCwgam9pbnJlbGlkcykpCisJCQkJCWJyZWFr OworCQkJfQorCisJCQlpZiAobGMpCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBX ZSBjYW4gcmVtb3ZlIGVpdGhlciByZWxhdGlvbiwgc28gcmVtb3ZlIHRoZSBvdXRlciBvbmUs IHRvCisJCQkgKiBzaW1wbGlmeSB0aGlzIGxvb3AuCisJCQkgKi8KKworCQkJLyoKKwkJCSAq IEF0dGFjaCB0aGUgcmVzdHJpY3Rpb25zIHRvIHJlbW92aW5nIHJlbGF0aW9uIHRvIHNpbXBs aWZ5IHJlbGlkcworCQkJICogcmVwbGFjaW5nIHByb2NlZHVyZS4gam9pbmluZm8gY2xhdXNl cyBvZiByZW1vdmluZyByZWxhdGlvbiB3aWxsCisJCQkgKiBiZSBtb3ZlZCB0byB0aGUga2Vl cGluZyBieSB0aGUgcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KCkuCisJCQkgKi8KKwkJCW91dGVy LT5iYXNlcmVzdHJpY3RpbmZvID0gbGlzdF9jb25jYXQob3V0ZXItPmJhc2VyZXN0cmljdGlu Zm8sCisJCQkJCQkJCQkJCQkgIHJlc3RyaWN0bGlzdCk7CisKKwkJCS8qIEZpcnN0bHksIHJl cGxhY2UgaW5kZXggb2YgZXhjbHVkaW5nIHJlbGF0aW9uIHdpdGgga2VlcGluZy4gKi8KKwkJ CXJlbW92ZV9yZWxfZnJvbV9xdWVyeShyb290LCBvdXRlci0+cmVsaWQsIGpvaW5yZWxpZHMs IGlubmVyLT5yZWxpZCk7CisKKwkJCS8qIFNlY29uZGx5LCBmaXggcmVzdHJpY3Rpb25zIG9m IGtlZXBpbmcgcmVsYXRpb24gKi8KKwkJCXJlbW92ZV9zZWxmX2pvaW5fcmVsKHJvb3QsIGlt YXJrLCBvbWFyaywgaW5uZXIsIG91dGVyKTsKKwkJCXJlc3VsdCA9IGJtc19hZGRfbWVtYmVy KHJlc3VsdCwgcik7CisKKwkJCS8qIFdlIHJlbW92ZWQgdGhlIG91dGVyIHJlbGF0aW9uLCB0 cnkgdGhlIG5leHQgb25lLiAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVz dWx0OworfQorCisvKgorICogSXRlcmF0aXZlbHkgZm9ybSBhIGdyb3VwIG9mIHJlbGF0aW9u IGluZGV4ZXMgd2l0aCB0aGUgc2FtZSBvaWQgYW5kIGxhdW5jaAorICogdGhlIHJvdXRpbmUg dGhhdCBkZXRlY3RzIHNlbGYtam9pbnMgaW4gdGhpcyBncm91cCBhbmQgcmVtb3ZlcyBleGNl c3NpdmUKKyAqIHJhbmdlIHRhYmxlIGVudHJpZXMuCisgKgorICogQXQgdGhlIGVuZCBvZiBp dGVyYXRpb24sIGV4Y2x1ZGUgdGhlIGdyb3VwIGZyb20gdGhlIG92ZXJhbGwgcmVsaWRzIGxp c3QuCisgKiBTbyBlYWNoIG5leHQgaXRlcmF0aW9uIG9mIHRoZSBjeWNsZSB3aWxsIGludm9s dmUgbGVzcyBhbmQgbGVzcyB2YWx1ZSBvZgorICogcmVsaWRzLgorICovCitzdGF0aWMgUmVs aWRzCityZW1vdmVfc2VsZl9qb2luc19vbmVfbGV2ZWwoUGxhbm5lckluZm8gKnJvb3QsIFJl bGlkcyByZWxpZHMsIFJlbGlkcyBUb1JlbW92ZSkKK3sKKwl3aGlsZSAoIWJtc19pc19lbXB0 eShyZWxpZHMpKQorCXsKKwkJUmVsaWRzCQlncm91cCA9IE5VTEw7CisJCU9pZAkJCWdyb3Vw T2lkOworCQlpbnQJCQlpOworCisJCWkgPSBibXNfZmlyc3RfbWVtYmVyKHJlbGlkcyk7CisJ CWdyb3VwT2lkID0gcm9vdC0+c2ltcGxlX3J0ZV9hcnJheVtpXS0+cmVsaWQ7CisJCUFzc2Vy dChPaWRJc1ZhbGlkKGdyb3VwT2lkKSk7CisJCWdyb3VwID0gYm1zX2FkZF9tZW1iZXIoZ3Jv dXAsIGkpOworCisJCS8qIENyZWF0ZSBncm91cCBvZiByZWxhdGlvbiBpbmRleGVzIHdpdGgg dGhlIHNhbWUgb2lkLiAqLworCQl3aGlsZSAoKGkgPSBibXNfbmV4dF9tZW1iZXIocmVsaWRz LCBpKSkgPiAwKQorCQl7CisJCQlSYW5nZVRibEVudHJ5ICpydGUgPSByb290LT5zaW1wbGVf cnRlX2FycmF5W2ldOworCisJCQlBc3NlcnQoT2lkSXNWYWxpZChydGUtPnJlbGlkKSk7CisK KwkJCWlmIChydGUtPnJlbGlkID09IGdyb3VwT2lkKQorCQkJCWdyb3VwID0gYm1zX2FkZF9t ZW1iZXIoZ3JvdXAsIGkpOworCQl9CisKKwkJcmVsaWRzID0gYm1zX2RlbF9tZW1iZXJzKHJl bGlkcywgZ3JvdXApOworCQlUb1JlbW92ZSA9IGJtc19hZGRfbWVtYmVycyhUb1JlbW92ZSwK KwkJCQkJCQkJICAgcmVtb3ZlX3NlbGZfam9pbnNfb25lX2dyb3VwKHJvb3QsIGdyb3VwKSk7 CisJCWJtc19mcmVlKGdyb3VwKTsKKwl9CisJcmV0dXJuIFRvUmVtb3ZlOworfQorCisvKgor ICogRm9yIGVhY2ggbGV2ZWwgb2Ygam9pbmxpc3QgZm9ybSBhIHNldCBvZiBiYXNlIHJlbGF0 aW9ucyBhbmQgbGF1bmNoIHRoZQorICogcm91dGluZSBvZiB0aGUgc2VsZi1qb2luIHJlbW92 YWwgb3B0aW1pemF0aW9uLiBSZWN1cnNlIGludG8gc3ViLWpvaW5saXN0cyB0bworICogaGFu ZGxlIGRlZXBlciBsZXZlbHMuCisgKi8KK3N0YXRpYyBSZWxpZHMKK3JlbW92ZV9zZWxmX2pv aW5zX3JlY3Vyc2UoUGxhbm5lckluZm8gKnJvb3QsIExpc3QgKmpvaW5saXN0LCBSZWxpZHMg VG9SZW1vdmUpCit7CisJTGlzdENlbGwgICAqbGM7CisJUmVsaWRzCQlyZWxpZHMgPSBOVUxM OworCisJLyogQ29sbGVjdCB0aGUgaWRzIG9mIGJhc2UgcmVsYXRpb25zIGF0IG9uZSBsZXZl bCBvZiB0aGUgam9pbiB0cmVlLiAqLworCWZvcmVhY2gobGMsIGpvaW5saXN0KQorCXsKKwkJ c3dpdGNoICgoKE5vZGUgKikgbGZpcnN0KGxjKSktPnR5cGUpCisJCXsKKwkJCWNhc2UgVF9M aXN0OgorCQkJCS8qIFJlY3Vyc2l2ZWx5IGdvIGluc2lkZSB0aGUgc3ViLWpvaW5saXN0ICov CisJCQkJVG9SZW1vdmUgPSByZW1vdmVfc2VsZl9qb2luc19yZWN1cnNlKHJvb3QsCisJCQkJ CQkJCQkJCQkJIChMaXN0ICopIGxmaXJzdChsYyksCisJCQkJCQkJCQkJCQkJIFRvUmVtb3Zl KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVF9SYW5nZVRibFJlZjoKKwkJCQl7CisJCQkJCVJh bmdlVGJsUmVmICpyZWYgPSAoUmFuZ2VUYmxSZWYgKikgbGZpcnN0KGxjKTsKKwkJCQkJUmFu Z2VUYmxFbnRyeSAqcnRlID0gcm9vdC0+c2ltcGxlX3J0ZV9hcnJheVtyZWYtPnJ0aW5kZXhd OworCisJCQkJCS8qCisJCQkJCSAqIFdlIG9ubHkgY2FyZSBhYm91dCBiYXNlIHJlbGF0aW9u cyBmcm9tIHdoaWNoIHdlIHNlbGVjdAorCQkJCQkgKiBzb21ldGhpbmcuCisJCQkJCSAqLwor CQkJCQlpZiAocnRlLT5ydGVraW5kICE9IFJURV9SRUxBVElPTiB8fAorCQkJCQkJcnRlLT5y ZWxraW5kICE9IFJFTEtJTkRfUkVMQVRJT04gfHwKKwkJCQkJCXJvb3QtPnNpbXBsZV9yZWxf YXJyYXlbcmVmLT5ydGluZGV4XSA9PSBOVUxMKQorCQkJCQkJYnJlYWs7CisKKwkJCQkJQXNz ZXJ0KCFibXNfaXNfbWVtYmVyKHJlZi0+cnRpbmRleCwgcmVsaWRzKSk7CisJCQkJCXJlbGlk cyA9IGJtc19hZGRfbWVtYmVyKHJlbGlkcywgcmVmLT5ydGluZGV4KTsKKwkJCQl9CisJCQkJ YnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUFzc2VydChmYWxzZSk7CisJCX0KKworCQkvKgor CQkgKiBMaW1pdCB0aGUgbnVtYmVyIG9mIGpvaW5zIHdlIHByb2Nlc3MgdG8gY29udHJvbCB0 aGUKKwkJICogcXVhZHJhdGljIGJlaGF2aW9yLgorCQkgKi8KKwkJaWYgKGJtc19udW1fbWVt YmVycyhyZWxpZHMpID49IHNlbGZfam9pbl9zZWFyY2hfbGltaXQpCisJCQlicmVhazsKKwl9 CisKKwlpZiAoYm1zX251bV9tZW1iZXJzKHJlbGlkcykgPj0gMikKKwkJVG9SZW1vdmUgPSBy ZW1vdmVfc2VsZl9qb2luc19vbmVfbGV2ZWwocm9vdCwgcmVsaWRzLCBUb1JlbW92ZSk7CisK KwlibXNfZnJlZShyZWxpZHMpOworCXJldHVybiBUb1JlbW92ZTsKK30KKworLyoKKyAqIEZp bmQgYW5kIHJlbW92ZSB1c2VsZXNzIHNlbGYgam9pbnMuCisgKgorICogV2Ugc2VhcmNoIGZv ciBqb2lucyB3aGVyZSB0aGUgc2FtZSByZWxhdGlvbiBpcyBqb2luZWQgdG8gaXRzZWxmIG9u IGFsbAorICogY29sdW1ucyBvZiBzb21lIHVuaXF1ZSBpbmRleC4gSWYgdGhpcyBjb25kaXRp b24gaG9sZHMsIHRoZW4sIGZvcgorICogZWFjaCBvdXRlciByb3csIG9ubHkgb25lIGlubmVy IHJvdyBtYXRjaGVzLCBhbmQgaXQgaXMgdGhlIHNhbWUgcm93CisgKiBvZiB0aGUgc2FtZSBy ZWxhdGlvbi4gVGhpcyBhbGxvd3MgdXMgdG8gcmVtb3ZlIHRoZSBqb2luIGFuZCByZXBsYWNl CisgKiBpdCB3aXRoIGEgc2NhbiB0aGF0IGNvbWJpbmVzIFdIRVJFIGNsYXVzZXMgZnJvbSBi b3RoIHNpZGVzLiBUaGUgam9pbgorICogY2xhdXNlcyB0aGVtc2VsdmVzIGFzc3VtZSB0aGUg Zm9ybSBvZiBYID0gWCBhbmQgY2FuIGJlIHJlcGxhY2VkIHdpdGgKKyAqIE5PVCBOVUxMIGNs YXVzZXMuCisgKgorICogRm9yIHRoZSBzYWtlIG9mIHNpbXBsaWNpdHksIHdlIGRvbid0IGFw cGx5IHRoaXMgb3B0aW1pemF0aW9uIHRvIHNwZWNpYWwKKyAqIGpvaW5zLiBIZXJlIGlzIGEg bGlzdCBvZiB3aGF0IHdlIGNvdWxkIGRvIGluIHNvbWUgcGFydGljdWxhciBjYXNlczoKKyAq ICdhIGExIHNlbWkgam9pbiBhIGEyJzogaXMgcmVkdWNlZCB0byBpbm5lciBieSByZWR1Y2Vf dW5pcXVlX3NlbWlqb2lucywKKyAqIGFuZCB0aGVuIHJlbW92ZWQgbm9ybWFsbHkuCisgKiAn YSBhMSBhbnRpIGpvaW4gYSBhMic6IGNvdWxkIHNpbXBsaWZ5IHRvIGEgc2NhbiB3aXRoICdv dXRlciBxdWFscyBBTkQKKyAqIChJUyBOVUxMIG9uIGpvaW4gY29sdW1ucyBPUiBOT1QgaW5u ZXIgcXVhbHMpJy4KKyAqICdhIGExIGxlZnQgam9pbiBhIGEyJzogY291bGQgc2ltcGxpZnkg dG8gYSBzY2FuIGxpa2UgaW5uZXIsIGJ1dCB3aXRob3V0CisgKiBOT1QgTlVMTCBjb25kaXRp b25zIG9uIGpvaW4gY29sdW1ucy4KKyAqICdhIGExIGxlZnQgam9pbiAoYSBhMiBqb2luIGIp JzogY2FuJ3Qgc2ltcGxpZnkgdGhpcywgYmVjYXVzZSBqb2luIHRvIGIKKyAqIGNhbiBib3Ro IHJlbW92ZSByb3dzIGFuZCBpbnRyb2R1Y2UgZHVwbGljYXRlcy4KKyAqCisgKiBUbyBzZWFy Y2ggZm9yIHJlbW92YWJsZSBqb2lucywgd2Ugb3JkZXIgYWxsIHRoZSByZWxhdGlvbnMgb24g dGhlaXIgT2lkLAorICogZ28gb3ZlciBlYWNoIHNldCB3aXRoIHRoZSBzYW1lIE9pZCwgYW5k IGNvbnNpZGVyIGVhY2ggcGFpciBvZiByZWxhdGlvbnMKKyAqIGluIHRoaXMgc2V0LiBXZSBj aGVjayB0aGF0IGJvdGggcmVsYXRpb24gYXJlIG1hZGUgdW5pcXVlIGJ5IHRoZSBzYW1lCisg KiB1bmlxdWUgaW5kZXggd2l0aCB0aGUgc2FtZSBjbGF1c2VzLgorICoKKyAqIFRvIHJlbW92 ZSB0aGUgam9pbiwgd2UgbWFyayBvbmUgb2YgdGhlIHBhcnRpY2lwYXRpbmcgcmVsYXRpb25z IGFzCisgKiBkZWFkLCBhbmQgcmV3cml0ZSBhbGwgcmVmZXJlbmNlcyB0byBpdCB0byBwb2lu dCB0byB0aGUgcmVtYWluaW5nCisgKiByZWxhdGlvbi4gVGhpcyBpbmNsdWRlcyBtb2RpZnlp bmcgUmVzdHJpY3RJbmZvcywgRXF1aXZhbGVuY2VDbGFzc2VzIGFuZAorICogRXF1aXZhbGVu Y2VNZW1iZXJzLiBXZSBhbHNvIGhhdmUgdG8gbW9kaWZ5IHRoZSByb3cgbWFya3MuIFRoZSBq b2luIGNsYXVzZXMKKyAqIG9mIHRoZSByZW1vdmVkIHJlbGF0aW9uIGJlY29tZSBlaXRoZXIg cmVzdHJpY3Rpb24gb3Igam9pbiBjbGF1c2VzLCBiYXNlZCBvbgorICogd2hldGhlciB0aGV5 IHJlZmVyZW5jZSBhbnkgcmVsYXRpb25zIG5vdCBwYXJ0aWNpcGF0aW5nIGluIHRoZSByZW1v dmVkIGpvaW4uCisgKgorICogJ3RhcmdldGxpc3QnIGlzIHRoZSB0b3AtbGV2ZWwgdGFyZ2V0 bGlzdCBvZiBxdWVyeS4gSWYgaXQgaGFzIGFueSByZWZlcmVuY2VzCisgKiB0byB0aGUgcmVt b3ZlZCByZWxhdGlvbnMsIHdlIHVwZGF0ZSB0aGVtIHRvIHBvaW50IHRvIHRoZSByZW1haW5p bmcgb25lcy4KKyAqLworTGlzdCAqCityZW1vdmVfdXNlbGVzc19zZWxmX2pvaW5zKFBsYW5u ZXJJbmZvICpyb290LCBMaXN0ICpqb2lubGlzdCkKK3sKKwlSZWxpZHMJCVRvUmVtb3ZlID0g TlVMTDsKKwlpbnQJCQlyZWxpZCA9IC0xOworCisJaWYgKCFlbmFibGVfc2VsZl9qb2luX3Jl bW92YWwpCisJCXJldHVybiBqb2lubGlzdDsKKworCS8qCisJICogTWVyZ2UgcGFpcnMgb2Yg cmVsYXRpb25zIHBhcnRpY2lwYXRlZCBpbiBzZWxmLWpvaW4uIFJlbW92ZSB1bm5lY2Vzc2Fy eQorCSAqIHJhbmdlIHRhYmxlIGVudHJpZXMuCisJICovCisJVG9SZW1vdmUgPSByZW1vdmVf c2VsZl9qb2luc19yZWN1cnNlKHJvb3QsIGpvaW5saXN0LCBUb1JlbW92ZSk7CisJd2hpbGUg KChyZWxpZCA9IGJtc19uZXh0X21lbWJlcihUb1JlbW92ZSwgcmVsaWQpKSA+PSAwKQorCXsK KwkJaW50CQkJbnJlbW92ZWQgPSAwOworCisJCWpvaW5saXN0ID0gcmVtb3ZlX3JlbF9mcm9t X2pvaW5saXN0KGpvaW5saXN0LCByZWxpZCwgJm5yZW1vdmVkKTsKKwl9CisKKwlyZXR1cm4g am9pbmxpc3Q7CiB9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9w bGFubWFpbi5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vcGxhbm1haW4uYwppbmRl eCAyNDhjZGU0ZDliLi5mMzVkMWI2ZTU0IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9vcHRp bWl6ZXIvcGxhbi9wbGFubWFpbi5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFu L3BsYW5tYWluLmMKQEAgLTIyOCw2ICsyMjgsMTEgQEAgcXVlcnlfcGxhbm5lcihQbGFubmVy SW5mbyAqcm9vdCwKIAkgKi8KIAlyZWR1Y2VfdW5pcXVlX3NlbWlqb2lucyhyb290KTsKIAor CS8qCisJICogUmVtb3ZlIHNlbGYgam9pbnMgb24gYSB1bmlxdWUgY29sdW1uLgorCSAqLwor CWpvaW5saXN0ID0gcmVtb3ZlX3VzZWxlc3Nfc2VsZl9qb2lucyhyb290LCBqb2lubGlzdCk7 CisKIAkvKgogCSAqIE5vdyBkaXN0cmlidXRlICJwbGFjZWhvbGRlcnMiIHRvIGJhc2UgcmVs cyBhcyBuZWVkZWQuICBUaGlzIGhhcyB0byBiZQogCSAqIGRvbmUgYWZ0ZXIgam9pbiByZW1v dmFsIGJlY2F1c2UgcmVtb3ZhbCBjb3VsZCBjaGFuZ2Ugd2hldGhlciBhCmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC91dGlscy9taXNjL2d1Yy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlz Yy9ndWMuYwppbmRleCA5ZmJiZmIxYmU1Li4zNzA2YWFkYjg5IDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC91dGlscy9taXNjL2d1Yy5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL21pc2Mv Z3VjLmMKQEAgLTEyMjYsNiArMTIyNiwxNiBAQCBzdGF0aWMgc3RydWN0IGNvbmZpZ19ib29s IENvbmZpZ3VyZU5hbWVzQm9vbFtdID0KIAkJdHJ1ZSwKIAkJTlVMTCwgTlVMTCwgTlVMTAog CX0sCisJeworCQl7ImVuYWJsZV9zZWxmX2pvaW5fcmVtb3ZhbCIsIFBHQ19VU0VSU0VULCBR VUVSWV9UVU5JTkdfTUVUSE9ELAorCQkJZ2V0dGV4dF9ub29wKCJFbmFibGUgcmVtb3ZhbCBv ZiB1bmlxdWUgc2VsZi1qb2lucy4iKSwKKwkJCU5VTEwsCisJCQlHVUNfRVhQTEFJTiB8IEdV Q19OT1RfSU5fU0FNUExFCisJCX0sCisJCSZlbmFibGVfc2VsZl9qb2luX3JlbW92YWwsCisJ CXRydWUsCisJCU5VTEwsIE5VTEwsIE5VTEwKKwl9LAogCXsKIAkJeyJnZXFvIiwgUEdDX1VT RVJTRVQsIFFVRVJZX1RVTklOR19HRVFPLAogCQkJZ2V0dGV4dF9ub29wKCJFbmFibGVzIGdl bmV0aWMgcXVlcnkgb3B0aW1pemF0aW9uLiIpLApAQCAtMjI1MSw2ICsyMjYxLDE4IEBAIHN0 YXRpYyBzdHJ1Y3QgY29uZmlnX2ludCBDb25maWd1cmVOYW1lc0ludFtdID0KIAkJOCwgMSwg SU5UX01BWCwKIAkJTlVMTCwgTlVMTCwgTlVMTAogCX0sCisJeworCQl7InNlbGZfam9pbl9z ZWFyY2hfbGltaXQiLCBQR0NfVVNFUlNFVCwgUVVFUllfVFVOSU5HX09USEVSLAorCQkJZ2V0 dGV4dF9ub29wKCJNYXggc2l6ZSBvZiBhIGdyb3VwIG9mIHBsYWluIHRhYmxlcyB3aGVyZSBw bGFubmVyICIKKwkJCQkJCSAid2lsbCBsb29rdXAgZm9yIHNlbGYgam9pbnMuIiksCisJCQln ZXR0ZXh0X25vb3AoIklmIGEgbnVtYmVyIG9mIHRhYmxlcyBpbiBGUk9NLWxpc3QgaXMgZXhj ZWVkZWQgdGhpcyAiCisJCQkJCQkgImxpbWl0LCB0aGUgcGxhbm5lciB3aWxsIGlnbm9yZSB0 YWJsZXMgYmV5b25kIGl0LiIpLAorCQkJR1VDX0VYUExBSU4gfCBHVUNfTk9UX0lOX1NBTVBM RQorCQl9LAorCQkmc2VsZl9qb2luX3NlYXJjaF9saW1pdCwKKwkJMzIsIDEsIElOVF9NQVgs CisJCU5VTEwsIE5VTEwsIE5VTEwKKwl9LAogCXsKIAkJeyJnZXFvX3RocmVzaG9sZCIsIFBH Q19VU0VSU0VULCBRVUVSWV9UVU5JTkdfR0VRTywKIAkJCWdldHRleHRfbm9vcCgiU2V0cyB0 aGUgdGhyZXNob2xkIG9mIEZST00gaXRlbXMgYmV5b25kIHdoaWNoIEdFUU8gaXMgdXNlZC4i KSwKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wdGltaXplci9wYXRocy5oIGIvc3JjL2lu Y2x1ZGUvb3B0aW1pemVyL3BhdGhzLmgKaW5kZXggZDExY2RhYzdmOC4uZTVmNTQzOTg5NCAx MDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BhdGhzLmgKKysrIGIvc3JjL2lu Y2x1ZGUvb3B0aW1pemVyL3BhdGhzLmgKQEAgLTc2LDYgKzc2LDkgQEAgZXh0ZXJuIHZvaWQg Y3JlYXRlX2luZGV4X3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwp OwogZXh0ZXJuIGJvb2wgcmVsYXRpb25faGFzX3VuaXF1ZV9pbmRleF9mb3IoUGxhbm5lcklu Zm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJCQkJCQkJCQkgIExpc3QgKnJlc3RyaWN0 bGlzdCwKIAkJCQkJCQkJCQkgIExpc3QgKmV4cHJsaXN0LCBMaXN0ICpvcHJsaXN0KTsKK2V4 dGVybiBib29sIHJlbGF0aW9uX2hhc191bmlxdWVfaW5kZXhfZXh0KFBsYW5uZXJJbmZvICpy b290LCBSZWxPcHRJbmZvICpyZWwsCisJCQkJCQkJCQkJICBMaXN0ICpyZXN0cmljdGxpc3Qs IExpc3QgKmV4cHJsaXN0LAorCQkJCQkJCQkJCSAgTGlzdCAqb3BybGlzdCwgTGlzdCAqKmV4 dHJhX2NsYXVzZXMpOwogZXh0ZXJuIGJvb2wgaW5kZXhjb2xfaXNfYm9vbF9jb25zdGFudF9m b3JfcXVlcnkoUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJCQkJCQkJCQlJbmRleE9wdEluZm8g KmluZGV4LAogCQkJCQkJCQkJCQkJaW50IGluZGV4Y29sKTsKZGlmZiAtLWdpdCBhL3NyYy9p bmNsdWRlL29wdGltaXplci9wbGFubWFpbi5oIGIvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3Bs YW5tYWluLmgKaW5kZXggMTU2NmY0MzViMy4uMGQ5MWFmYjQ0OSAxMDA2NDQKLS0tIGEvc3Jj L2luY2x1ZGUvb3B0aW1pemVyL3BsYW5tYWluLmgKKysrIGIvc3JjL2luY2x1ZGUvb3B0aW1p emVyL3BsYW5tYWluLmgKQEAgLTIwLDYgKzIwLDggQEAKIC8qIEdVQyBwYXJhbWV0ZXJzICov CiAjZGVmaW5lIERFRkFVTFRfQ1VSU09SX1RVUExFX0ZSQUNUSU9OIDAuMQogZXh0ZXJuIFBH RExMSU1QT1JUIGRvdWJsZSBjdXJzb3JfdHVwbGVfZnJhY3Rpb247CitleHRlcm4gUEdETExJ TVBPUlQgYm9vbCBlbmFibGVfc2VsZl9qb2luX3JlbW92YWw7CitleHRlcm4gUEdETExJTVBP UlQgaW50IHNlbGZfam9pbl9zZWFyY2hfbGltaXQ7CiAKIC8qIHF1ZXJ5X3BsYW5uZXIgY2Fs bGJhY2sgdG8gY29tcHV0ZSBxdWVyeV9wYXRoa2V5cyAqLwogdHlwZWRlZiB2b2lkICgqcXVl cnlfcGF0aGtleXNfY2FsbGJhY2spIChQbGFubmVySW5mbyAqcm9vdCwgdm9pZCAqZXh0cmEp OwpAQCAtMTA3LDYgKzEwOSwxMSBAQCBleHRlcm4gYm9vbCBxdWVyeV9pc19kaXN0aW5jdF9m b3IoUXVlcnkgKnF1ZXJ5LCBMaXN0ICpjb2xub3MsIExpc3QgKm9waWRzKTsKIGV4dGVybiBi b29sIGlubmVycmVsX2lzX3VuaXF1ZShQbGFubmVySW5mbyAqcm9vdCwKIAkJCQkJCQkgICBS ZWxpZHMgam9pbnJlbGlkcywgUmVsaWRzIG91dGVycmVsaWRzLCBSZWxPcHRJbmZvICppbm5l cnJlbCwKIAkJCQkJCQkgICBKb2luVHlwZSBqb2ludHlwZSwgTGlzdCAqcmVzdHJpY3RsaXN0 LCBib29sIGZvcmNlX2NhY2hlKTsKK2V4dGVybiBib29sIGlubmVycmVsX2lzX3VuaXF1ZV9l eHQoUGxhbm5lckluZm8gKnJvb3QsIFJlbGlkcyBqb2lucmVsaWRzLAorCQkJCQkJCQkgICBS ZWxpZHMgb3V0ZXJyZWxpZHMsIFJlbE9wdEluZm8gKmlubmVycmVsLAorCQkJCQkJCQkgICBK b2luVHlwZSBqb2ludHlwZSwgTGlzdCAqcmVzdHJpY3RsaXN0LAorCQkJCQkJCQkgICBib29s IGZvcmNlX2NhY2hlLCBMaXN0ICoqdWNsYXVzZXMpOworZXh0ZXJuIExpc3QgKnJlbW92ZV91 c2VsZXNzX3NlbGZfam9pbnMoUGxhbm5lckluZm8gKnJvb3QsIExpc3QgKmpvaW50cmVlKTsK IAogLyoKICAqIHByb3RvdHlwZXMgZm9yIHBsYW4vc2V0cmVmcy5jCmRpZmYgLS1naXQgYS9z cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2VxdWl2Y2xhc3Mub3V0IGIvc3JjL3Rlc3QvcmVn cmVzcy9leHBlY3RlZC9lcXVpdmNsYXNzLm91dAppbmRleCAxMjZmNzA0N2ZlLi5kZTcxNDQx MDUyIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2VxdWl2Y2xhc3Mu b3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZXF1aXZjbGFzcy5vdXQKQEAg LTQzMCw2ICs0MzAsMzggQEAgZXhwbGFpbiAoY29zdHMgb2ZmKQogICAgRmlsdGVyOiAoKHVu aXF1ZTEgSVMgTk9UIE5VTEwpIEFORCAodW5pcXVlMiBJUyBOT1QgTlVMTCkpCiAoMiByb3dz KQogCistLSBUZXN0IHRoYXQgYnJva2VuIEVDcyBhcmUgcHJvY2Vzc2VkIGNvcnJlY3RseSBk dXJpbmcgc2VsZiBqb2luIHJlbW92YWwuCistLSBEaXNhYmxlIG1lcmdlIGpvaW5zIHNvIHRo YXQgd2UgZG9uJ3QgZ2V0IGFuIGVycm9yIGFib3V0IG1pc3NpbmcgY29tbXV0YXRvci4KKy0t IFRlc3QgYm90aCBvcmllbnRhdGlvbnMgb2YgdGhlIGpvaW4gY2xhdXNlLCBiZWNhdXNlIG9u bHkgb25lIG9mIHRoZW0gYnJlYWtzCistLSB0aGUgRUMuCitzZXQgZW5hYmxlX21lcmdlam9p biB0byBvZmY7CitleHBsYWluIChjb3N0cyBvZmYpCisgIHNlbGVjdCAqIGZyb20gZWMwIG0g am9pbiBlYzAgbiBvbiBtLmZmID0gbi5mZgorICBqb2luIGVjMSBwIG9uIG0uZmYgKyBuLmZm ID0gcC5mMTsKKyAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAor ICAgSm9pbiBGaWx0ZXI6ICgobi5mZiArIG4uZmYpID0gcC5mMSkKKyAgIC0+ICBTZXEgU2Nh biBvbiBlYzEgcAorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgU2VxIFNjYW4g b24gZWMwIG4KKyAgICAgICAgICAgICAgIEZpbHRlcjogKGZmIElTIE5PVCBOVUxMKQorKDYg cm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKQorICBzZWxlY3QgKiBmcm9tIGVjMCBtIGpv aW4gZWMwIG4gb24gbS5mZiA9IG4uZmYKKyAgam9pbiBlYzEgcCBvbiBwLmYxOjppbnQ4ID0g KG0uZmYgKyBuLmZmKTo6aW50OGFsaWFzMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg UVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVz dGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAoKHAuZjEpOjpiaWdpbnQgPSAoKG4uZmYgKyBu LmZmKSk6OmludDhhbGlhczEpCisgICAtPiAgU2VxIFNjYW4gb24gZWMxIHAKKyAgIC0+ICBN YXRlcmlhbGl6ZQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGVjMCBuCisgICAgICAgICAg ICAgICBGaWx0ZXI6IChmZiBJUyBOT1QgTlVMTCkKKyg2IHJvd3MpCisKK3Jlc2V0IGVuYWJs ZV9tZXJnZWpvaW47CiAtLSB0aGlzIGNvdWxkIGJlIGNvbnZlcnRlZCwgYnV0IGlzbid0IGF0 IHByZXNlbnQKIGV4cGxhaW4gKGNvc3RzIG9mZikKICAgc2VsZWN0ICogZnJvbSB0ZW5rMSB3 aGVyZSB1bmlxdWUxID0gdW5pcXVlMSBvciB1bmlxdWUyID0gdW5pcXVlMjsKZGlmZiAtLWdp dCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQgYi9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL2pvaW4ub3V0CmluZGV4IDJlZDJlNTQyYTQuLjJmNjJkMTdkZDQgMTAw NjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQKKysrIGIvc3Jj L3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dApAQCAtNDk4Miw2ICs0OTgyLDc4MCBA QCBzZWxlY3QgKiBmcm9tCiAtLS0tKy0tLS0rLS0tLSstLS0tCiAoMCByb3dzKQogCistLQor LS0gdGVzdCB0aGF0IHNlbWktIG9yIGlubmVyIHNlbGYtam9pbnMgb24gYSB1bmlxdWUgY29s dW1uIGFyZSByZW1vdmVkCistLQorLS0gZW5hYmxlIG9ubHkgbmVzdGxvb3AgdG8gZ2V0IG1v cmUgcHJlZGljdGFibGUgcGxhbnMKK3NldCBlbmFibGVfaGFzaGpvaW4gdG8gb2ZmOworc2V0 IGVuYWJsZV9tZXJnZWpvaW4gdG8gb2ZmOworY3JlYXRlIHRhYmxlIHNqIChhIGludCB1bmlx dWUsIGIgaW50LCBjIGludCB1bmlxdWUpOworaW5zZXJ0IGludG8gc2ogdmFsdWVzICgxLCBu dWxsLCAyKSwgKG51bGwsIDIsIG51bGwpLCAoMiwgMSwgMSk7CithbmFseXplIHNqOworLS0g VHJpdmlhbCBzZWxmLWpvaW4gY2FzZS4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCBw LiogZnJvbSBzaiBwLCBzaiBxIHdoZXJlIHEuYSA9IHAuYSBhbmQgcS5iID0gcS5hIC0gMTsK KyAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2Fu IG9uIHNqIHEKKyAgIEZpbHRlcjogKChhIElTIE5PVCBOVUxMKSBBTkQgKGIgPSAoYSAtIDEp KSkKKygyIHJvd3MpCisKK3NlbGVjdCBwLiogZnJvbSBzaiBwLCBzaiBxIHdoZXJlIHEuYSA9 IHAuYSBhbmQgcS5iID0gcS5hIC0gMTsKKyBhIHwgYiB8IGMgCistLS0rLS0tKy0tLQorIDIg fCAxIHwgMQorKDEgcm93KQorCistLSBTZWxmLWpvaW4gcmVtb3ZhbCBwZXJmb3JtcyBhZnRl ciBhIHN1YnF1ZXJ5IHB1bGwtdXAgcHJvY2VzcyBhbmQgY291bGQgcmVtb3ZlCistLSBzdWNo IGtpbmQgb2Ygc2VsZi1qb2luIHRvby4gQ2hlY2sgdGhpcyBvcHRpb24uCitleHBsYWluIChj b3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHAKK3doZXJlIGV4aXN0cyAoc2VsZWN0ICog ZnJvbSBzaiBxCisJCQkJd2hlcmUgcS5hID0gcC5hIGFuZCBxLmIgPCAxMCk7CisgICAgICAg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHNqIHEKKyAgIEZpbHRl cjogKChhIElTIE5PVCBOVUxMKSBBTkQgKGIgPCAxMCkpCisoMiByb3dzKQorCitzZWxlY3Qg KiBmcm9tIHNqIHAgd2hlcmUgZXhpc3RzIChzZWxlY3QgKiBmcm9tIHNqIHEgd2hlcmUgcS5h ID0gcC5hIGFuZCBxLmIgPCAxMCk7CisgYSB8IGIgfCBjIAorLS0tKy0tLSstLS0KKyAyIHwg MSB8IDEKKygxIHJvdykKKworLS0gRG9uJ3QgcmVtb3ZlIHNlbGYtam9pbiBmb3IgdGhlIGNh c2Ugb2YgZXF1YWxpdHkgb2YgdHdvIGRpZmZlcmVudCB1bmlxdWUgY29sdW1ucy4KK2V4cGxh aW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogdDEsIHNqIHQyIHdoZXJlIHQxLmEg PSB0Mi5jIGFuZCB0MS5iIGlzIG5vdCBudWxsOworICAgICAgICAgICAgICBRVUVSWSBQTEFO ICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6ICh0MS5hID0gdDIuYykKKyAgIC0+ ICBTZXEgU2NhbiBvbiBzaiB0MgorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAg U2VxIFNjYW4gb24gc2ogdDEKKyAgICAgICAgICAgICAgIEZpbHRlcjogKGIgSVMgTk9UIE5V TEwpCisoNiByb3dzKQorCistLSBEZWdlbmVyYXRlZCBjYXNlLgorZXhwbGFpbiAoY29zdHMg b2ZmKQorc2VsZWN0ICogZnJvbQorCShzZWxlY3QgYSBhcyB4IGZyb20gc2ogd2hlcmUgZmFs c2UpIGFzIHExLAorCShzZWxlY3QgYSBhcyB5IGZyb20gc2ogd2hlcmUgZmFsc2UpIGFzIHEy Cit3aGVyZSBxMS54ID0gcTIueTsKKyAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAg IAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUmVzdWx0CisgICBPbmUt VGltZSBGaWx0ZXI6IGZhbHNlCisgICAtPiAgU2VxIFNjYW4gb24gc2oKKyAgICAgICAgIEZp bHRlcjogKGEgSVMgTk9UIE5VTEwpCisoNCByb3dzKQorCistLSBXZSBjYW4ndCB1c2UgYSBj cm9zcy1FQyBnZW5lcmF0ZWQgc2VsZiBqb2luIHF1YWwgYmVjYXVzZSBvZiBjdXJyZW50IGxv Z2ljIG9mCistLSB0aGUgZ2VuZXJhdGVfam9pbl9pbXBsaWVkX2VxdWFsaXRpZXMgcm91dGlu ZS4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogdDEsIHNqIHQyIHdo ZXJlIHQxLmEgPSB0MS5iIGFuZCB0MS5iID0gdDIuYiBhbmQgdDIuYiA9IHQyLmE7CisgICAg ICAgICAgUVVFUlkgUExBTiAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKHQxLmEgPSB0Mi5iKQorICAg LT4gIFNlcSBTY2FuIG9uIHNqIHQxCisgICAgICAgICBGaWx0ZXI6IChhID0gYikKKyAgIC0+ ICBTZXEgU2NhbiBvbiBzaiB0MgorICAgICAgICAgRmlsdGVyOiAoYiA9IGEpCisoNiByb3dz KQorCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHQxLCBzaiB0Miwg c2ogdDMKK3doZXJlIHQxLmEgPSB0MS5iIGFuZCB0MS5iID0gdDIuYiBhbmQgdDIuYiA9IHQy LmEKKwlhbmQgdDEuYiA9IHQzLmIgYW5kIHQzLmIgPSB0My5hOworICAgICAgICAgICAgIFFV RVJZIFBMQU4gICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6ICh0MS5hID0gdDMuYikKKyAg IC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAgSm9pbiBGaWx0ZXI6ICh0MS5hID0gdDIuYikK KyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBzaiB0MQorICAgICAgICAgICAgICAgRmlsdGVy OiAoYSA9IGIpCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ogdDIKKyAgICAgICAgICAg ICAgIEZpbHRlcjogKGIgPSBhKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIHQzCisgICAgICAg ICBGaWx0ZXI6IChiID0gYSkKKygxMCByb3dzKQorCistLSBEb3VibGUgc2VsZi1qb2luIHJl bW92YWwuCistLSBVc2UgYSBjb25kaXRpb24gb24gImIgKyAxIiwgbm90IG9uICJiIiwgZm9y IHRoZSBzZWNvbmQgam9pbiwgc28gdGhhdAorLS0gdGhlIGVxdWl2YWxlbmNlIGNsYXNzIGlz IGRpZmZlcmVudCBmcm9tIHRoZSBmaXJzdCBvbmUsIGFuZCB3ZSBjYW4KKy0tIHRlc3QgdGhl IG5vbi1lYyBjb2RlIHBhdGguCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9t IHNqIHQxIGpvaW4gc2ogdDIgb24gdDEuYSA9IHQyLmEgYW5kIHQxLmIgPSB0Mi5iCisJam9p biBzaiB0MyBvbiB0Mi5hID0gdDMuYSBhbmQgdDIuYiArIDEgPSB0My5iICsgMTsKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24g c2ogdDMKKyAgIEZpbHRlcjogKChhIElTIE5PVCBOVUxMKSBBTkQgKGIgSVMgTk9UIE5VTEwp IEFORCAoKGIgKyAxKSBJUyBOT1QgTlVMTCkpCisoMiByb3dzKQorCistLSBzdWJzZWxlY3Qg dGhhdCByZWZlcmVuY2VzIHRoZSByZW1vdmVkIHJlbGF0aW9uCitleHBsYWluIChjb3N0cyBv ZmYpCitzZWxlY3QgdDEuYSwgKHNlbGVjdCBhIGZyb20gc2ogd2hlcmUgYSA9IHQyLmEgYW5k IGEgPSB0MS5hKQorZnJvbSBzaiB0MSwgc2ogdDIKK3doZXJlIHQxLmEgPSB0Mi5hOworICAg ICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBzaiB0MgorICAg RmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKyAgIFN1YlBsYW4gMQorICAgICAtPiAgUmVzdWx0 CisgICAgICAgICAgIE9uZS1UaW1lIEZpbHRlcjogKHQyLmEgPSB0Mi5hKQorICAgICAgICAg ICAtPiAgU2VxIFNjYW4gb24gc2oKKyAgICAgICAgICAgICAgICAgRmlsdGVyOiAoYSA9IHQy LmEpCisoNyByb3dzKQorCistLSBzZWxmLWpvaW4gdW5kZXIgb3V0ZXIgam9pbgorZXhwbGFp biAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB4IGpvaW4gc2ogeSBvbiB4LmEgPSB5 LmEKK2xlZnQgam9pbiBpbnQ4X3RibCB6IG9uIHguYSA9IHoucTE7CisgICAgICAgICAgICAg UVVFUlkgUExBTiAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIE5lc3RlZCBMb29wIExlZnQgSm9pbgorICAgSm9pbiBGaWx0ZXI6ICh5LmEg PSB6LnExKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIHkKKyAgICAgICAgIEZpbHRlcjogKGEg SVMgTk9UIE5VTEwpCisgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgIC0+ICBTZXEgU2Nh biBvbiBpbnQ4X3RibCB6CisoNiByb3dzKQorCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxl Y3QgKiBmcm9tIHNqIHggam9pbiBzaiB5IG9uIHguYSA9IHkuYQorbGVmdCBqb2luIGludDhf dGJsIHogb24geS5hID0gei5xMTsKKyAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExv b3AgTGVmdCBKb2luCisgICBKb2luIEZpbHRlcjogKHkuYSA9IHoucTEpCisgICAtPiAgU2Vx IFNjYW4gb24gc2ogeQorICAgICAgICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKyAgIC0+ ICBNYXRlcmlhbGl6ZQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGludDhfdGJsIHoKKyg2 IHJvd3MpCisKK2V4cGxhaW4gKGNvc3RzIG9mZikKK1NFTEVDVCAqIEZST00gKAorICBTRUxF Q1QgdDEuKiwgdDIuYSBBUyBheCBGUk9NIHNqIHQxIEpPSU4gc2ogdDIKKyAgT04gKHQxLmEg PSB0Mi5hIEFORCB0MS5jKnQxLmMgPSB0Mi5jKzIgQU5EIHQyLmIgSVMgTlVMTCkKKykgQVMg cTEKK0xFRlQgSk9JTgorICAoU0VMRUNUIHQzLiogRlJPTSBzaiB0Mywgc2ogdDQgV0hFUkUg dDMuYyA9IHQ0LmMpIEFTIHEyCitPTiBxMS5heCA9IHEyLmE7CisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wIExlZnQgSm9pbgor ICAgSm9pbiBGaWx0ZXI6ICh0Mi5hID0gdDQuYSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiB0 MgorICAgICAgICAgRmlsdGVyOiAoKGIgSVMgTlVMTCkgQU5EIChhIElTIE5PVCBOVUxMKSBB TkQgKChjICogYykgPSAoYyArIDIpKSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiB0NAorICAg ICAgICAgRmlsdGVyOiAoYyBJUyBOT1QgTlVMTCkKKyg2IHJvd3MpCisKKy0tIFRlc3QgdGhh dCBwbGFjZWhvbGRlcnMgYXJlIHVwZGF0ZWQgY29ycmVjdGx5IGFmdGVyIGpvaW4gcmVtb3Zh bAorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSAodmFsdWVzICgxKSkgeAor bGVmdCBqb2luIChzZWxlY3QgY29hbGVzY2UoeS5xMSwgMSkgZnJvbSBpbnQ4X3RibCB5CisJ cmlnaHQgam9pbiBzaiBqMSBpbm5lciBqb2luIHNqIGoyIG9uIGoxLmEgPSBqMi5hCisJb24g dHJ1ZSkgegorb24gdHJ1ZTsKKyAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg TmVzdGVkIExvb3AgTGVmdCBKb2luCisgICAtPiAgUmVzdWx0CisgICAtPiAgTmVzdGVkIExv b3AgTGVmdCBKb2luCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ogajIKKyAgICAgICAg ICAgICAgIEZpbHRlcjogKGEgSVMgTk9UIE5VTEwpCisgICAgICAgICAtPiAgTWF0ZXJpYWxp emUKKyAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBpbnQ4X3RibCB5CisoNyByb3dz KQorCistLQorLS0gU0pSIGNvcm5lciBjYXNlOiB1bmlxdWVuZXNzIG9mIGFuIGlubmVyIGlz IFtwYXJ0aWFsbHldIGRlcml2ZWQgZnJvbQorLS0gYmFzZXJlc3RyaWN0aW5mbyBjbGF1c2Vz LgorLS0gWFhYOiBXZSByZWFsbHkgc2hvdWxkIGFsbG93IFNKUiBmb3IgdGhlc2UgY29ybmVy IGNhc2VzPworLS0KK0lOU0VSVCBJTlRPIHNqIFZBTFVFUyAoMywgMSwgMyk7CitleHBsYWlu IChjb3N0cyBvZmYpIC0tIERvbid0IHJlbW92ZSBTSgorCVNFTEVDVCAqIEZST00gc2ogajEs IHNqIGoyIFdIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMiBBTkQgajIuYSA9IDM7Cisg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKGoxLmIgPSBqMi5iKQor ICAgLT4gIFNlcSBTY2FuIG9uIHNqIGoxCisgICAgICAgICBGaWx0ZXI6IChhID0gMikKKyAg IC0+ICBTZXEgU2NhbiBvbiBzaiBqMgorICAgICAgICAgRmlsdGVyOiAoYSA9IDMpCisoNiBy b3dzKQorCitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorV0hFUkUgajEuYiA9IGoyLmIg QU5EIGoxLmEgPSAyIEFORCBqMi5hID0gMzsgLS0gUmV0dXJuIG9uZSByb3cKKyBhIHwgYiB8 IGMgfCBhIHwgYiB8IGMgCistLS0rLS0tKy0tLSstLS0rLS0tKy0tLQorIDIgfCAxIHwgMSB8 IDMgfCAxIHwgMworKDEgcm93KQorCitleHBsYWluIChjb3N0cyBvZmYpIC0tIFJlbW92ZSBT SiwgZGVmaW5lIHVuaXF1ZW5lc3MgYnkgYSBjb25zdGFudAorCVNFTEVDVCAqIEZST00gc2og ajEsIHNqIGoyIFdIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMiBBTkQgajIuYSA9IDI7 CisgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBzaiBqMgor ICAgRmlsdGVyOiAoKGIgSVMgTk9UIE5VTEwpIEFORCAoYSA9IDIpKQorKDIgcm93cykKKwor U0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5h ID0gMiBBTkQgajIuYSA9IDI7IC0tIFJldHVybiBvbmUgcm93CisgYSB8IGIgfCBjIHwgYSB8 IGIgfCBjIAorLS0tKy0tLSstLS0rLS0tKy0tLSstLS0KKyAyIHwgMSB8IDEgfCAyIHwgMSB8 IDEKKygxIHJvdykKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTSBzaiBq MSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iCisgIEFORCBqMS5hID0gKEVYVFJBQ1QoRE9X IEZST00gY3VycmVudF90aW1lc3RhbXAoMCkpLzE1ICsgMyk6OmludAorICBBTkQgKEVYVFJB Q1QoRE9XIEZST00gY3VycmVudF90aW1lc3RhbXAoMCkpLzE1ICsgMyk6OmludCA9IGoyLmEK KzsgLS0gUmVtb3ZlIFNKLCBkZWZpbmUgdW5pcXVlbmVzcyBieSBhIGNvbnN0YW50IGV4cHJl c3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBv biBzaiBqMgorICAgRmlsdGVyOiAoKGIgSVMgTk9UIE5VTEwpIEFORCAoYSA9ICgoKEVYVFJB Q1QoZG93IEZST00gQ1VSUkVOVF9USU1FU1RBTVAoMCkpIC8gJzE1Jzo6bnVtZXJpYykgKyAn Myc6Om51bWVyaWMpKTo6aW50ZWdlcikpCisoMiByb3dzKQorCitTRUxFQ1QgKiBGUk9NIHNq IGoxLCBzaiBqMgorV0hFUkUgajEuYiA9IGoyLmIKKyAgQU5EIGoxLmEgPSAoRVhUUkFDVChE T1cgRlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSkvMTUgKyAzKTo6aW50CisgIEFORCAoRVhU UkFDVChET1cgRlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSkvMTUgKyAzKTo6aW50ID0gajIu YQorOyAtLSBSZXR1cm4gb25lIHJvdworIGEgfCBiIHwgYyB8IGEgfCBiIHwgYyAKKy0tLSst LS0rLS0tKy0tLSstLS0rLS0tCisgMyB8IDEgfCAzIHwgMyB8IDEgfCAzCisoMSByb3cpCisK K2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gUmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBq MSwgc2ogajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEgPSAxIEFORCBqMi5hID0gMTsK KyAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgCistLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHNqIGoyCisg ICBGaWx0ZXI6ICgoYiBJUyBOT1QgTlVMTCkgQU5EIChhID0gMSkpCisoMiByb3dzKQorCitT RUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEg PSAxIEFORCBqMi5hID0gMTsgLS0gUmV0dXJuIG5vIHJvd3MKKyBhIHwgYiB8IGMgfCBhIHwg YiB8IGMgCistLS0rLS0tKy0tLSstLS0rLS0tKy0tLQorKDAgcm93cykKKworZXhwbGFpbiAo Y29zdHMgb2ZmKSAtLSBTaHVmZmxlIGEgY2xhdXNlLiBSZW1vdmUgU0oKKwlTRUxFQ1QgKiBG Uk9NIHNqIGoxLCBzaiBqMiBXSEVSRSBqMS5iID0gajIuYiBBTkQgMSA9IGoxLmEgQU5EIGoy LmEgPSAxOworICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24g c2ogajIKKyAgIEZpbHRlcjogKChiIElTIE5PVCBOVUxMKSBBTkQgKGEgPSAxKSkKKygyIHJv d3MpCisKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIuYiBB TkQgMSA9IGoxLmEgQU5EIGoyLmEgPSAxOyAtLSBSZXR1cm4gbm8gcm93cworIGEgfCBiIHwg YyB8IGEgfCBiIHwgYyAKKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tCisoMCByb3dzKQorCist LSBGdW5jdGlvbmFsIGluZGV4CitDUkVBVEUgVU5JUVVFIElOREVYIHNqX2ZuX2lkeCBPTiBz aigoYSAqIGEpKTsKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gUmVtb3ZlIFNKCisJU0VMRUNU ICogRlJPTSBzaiBqMSwgc2ogajIKKwlXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSpqMS5h ID0gMSBBTkQgajIuYSpqMi5hID0gMTsKKyAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4g ICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHNqIGoyCisgICBGaWx0ZXI6ICgoYiBJUyBO T1QgTlVMTCkgQU5EICgoYSAqIGEpID0gMSkpCisoMiByb3dzKQorCitleHBsYWluIChjb3N0 cyBvZmYpIC0tIERvbid0IHJlbW92ZSBTSgorCVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoy CisJV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEqajEuYSA9IDEgQU5EIGoyLmEqajIuYSA9 IDI7CisgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAoajEuYiA9 IGoyLmIpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogajEKKyAgICAgICAgIEZpbHRlcjogKChh ICogYSkgPSAxKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIGoyCisgICAgICAgICBGaWx0ZXI6 ICgoYSAqIGEpID0gMikKKyg2IHJvd3MpCisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVD VCAqIEZST00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIuYgorICBBTkQgKGoxLmEq ajEuYSkgPSAoRVhUUkFDVChET1cgRlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSkvMTUgKyAz KTo6aW50CisgIEFORCAoRVhUUkFDVChET1cgRlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSkv MTUgKyAzKTo6aW50ID0gKGoyLmEqajIuYSkKKzsgLS0gUmVzdHJpY3Rpb24gY29udGFpbnMg ZXhwcmVzc2lvbnMgaW4gYm90aCBzaWRlcywgUmVtb3ZlIFNKLgorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExB TiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHNqIGoyCisg ICBGaWx0ZXI6ICgoYiBJUyBOT1QgTlVMTCkgQU5EICgoYSAqIGEpID0gKCgoRVhUUkFDVChk b3cgRlJPTSBDVVJSRU5UX1RJTUVTVEFNUCgwKSkgLyAnMTUnOjpudW1lcmljKSArICczJzo6 bnVtZXJpYykpOjppbnRlZ2VyKSkKKygyIHJvd3MpCisKK1NFTEVDVCAqIEZST00gc2ogajEs IHNqIGoyCitXSEVSRSBqMS5iID0gajIuYgorICBBTkQgKGoxLmEqajEuYSkgPSAoRVhUUkFD VChET1cgRlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSkvMTUgKyAzKTo6aW50CisgIEFORCAo RVhUUkFDVChET1cgRlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSkvMTUgKyAzKTo6aW50ID0g KGoyLmEqajIuYSkKKzsgLS0gRW1wdHkgc2V0IG9mIHJvd3Mgc2hvdWxkIGJlIHJldHVybmVk CisgYSB8IGIgfCBjIHwgYSB8IGIgfCBjIAorLS0tKy0tLSstLS0rLS0tKy0tLSstLS0KKygw IHJvd3MpCisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gc2ogajEsIHNq IGoyCitXSEVSRSBqMS5iID0gajIuYgorICBBTkQgKGoxLmEqajEuYSkgPSAocmFuZG9tKCkv MyArIDMpOjppbnQKKyAgQU5EIChyYW5kb20oKS8zICsgMyk6OmludCA9IChqMi5hKmoyLmEp Cis7IC0tIFJlc3RyaWN0aW9uIGNvbnRhaW5zIHZvbGF0aWxlIGZ1bmN0aW9uIC0gZGlzYWJs ZSBTSlIgZmVhdHVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKGoxLmIgPSBqMi5iKQorICAg LT4gIFNlcSBTY2FuIG9uIHNqIGoxCisgICAgICAgICBGaWx0ZXI6ICgoYSAqIGEpID0gKCgo cmFuZG9tKCkgLyAnMyc6OmRvdWJsZSBwcmVjaXNpb24pICsgJzMnOjpkb3VibGUgcHJlY2lz aW9uKSk6OmludGVnZXIpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogajIKKyAgICAgICAgIEZp bHRlcjogKCgoKHJhbmRvbSgpIC8gJzMnOjpkb3VibGUgcHJlY2lzaW9uKSArICczJzo6ZG91 YmxlIHByZWNpc2lvbikpOjppbnRlZ2VyID0gKGEgKiBhKSkKKyg2IHJvd3MpCisKK1NFTEVD VCAqIEZST00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIuYgorICBBTkQgKGoxLmEq ajEuYy8zKSA9IChyYW5kb20oKS8zICsgMyk6OmludAorICBBTkQgKHJhbmRvbSgpLzMgKyAz KTo6aW50ID0gKGoyLmEqajIuYy8zKQorOyAtLSBSZXR1cm4gb25lIHJvdworIGEgfCBiIHwg YyB8IGEgfCBiIHwgYyAKKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tCisgMyB8IDEgfCAzIHwg MyB8IDEgfCAzCisoMSByb3cpCisKKy0tIE11bHRpcGxlIGZpbHRlcnMKK0NSRUFURSBVTklR VUUgSU5ERVggc2pfdGVtcF9pZHgxIE9OIHNqKGEsYixjKTsKK2V4cGxhaW4gKGNvc3RzIG9m ZikgLS0gUmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKKwlXSEVSRSBq MS5iID0gajIuYiBBTkQgajEuYSA9IDIgQU5EIGoxLmMgPSAzIEFORCBqMi5hID0gMiBBTkQg MyA9IGoyLmM7CisgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBzaiBqMgorICAgRmlsdGVyOiAoKGIgSVMgTk9U IE5VTEwpIEFORCAoYSA9IDIpIEFORCAoYyA9IDMpKQorKDIgcm93cykKKworZXhwbGFpbiAo Y29zdHMgb2ZmKSAtLSBEb24ndCByZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBz aiBqMgorCVdIRVJFIGoxLmIgPSBqMi5iIEFORCAyID0gajEuYSBBTkQgajEuYyA9IDMgQU5E IGoyLmEgPSAxIEFORCAzID0gajIuYzsKKyAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg TmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAoajEuYiA9IGoyLmIpCisgICAtPiAgU2Vx IFNjYW4gb24gc2ogajEKKyAgICAgICAgIEZpbHRlcjogKCgyID0gYSkgQU5EIChjID0gMykp CisgICAtPiAgU2VxIFNjYW4gb24gc2ogajIKKyAgICAgICAgIEZpbHRlcjogKChjID0gMykg QU5EIChhID0gMSkpCisoNiByb3dzKQorCitDUkVBVEUgVU5JUVVFIElOREVYIHNqX3RlbXBf aWR4IE9OIHNqKGEsYik7CitleHBsYWluIChjb3N0cyBvZmYpIC0tIERvbid0IHJlbW92ZSBT SgorCVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyIFdIRVJFIGoxLmIgPSBqMi5iIEFORCBq MS5hID0gMjsKKyAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgIAorLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAoajEu YiA9IGoyLmIpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogajEKKyAgICAgICAgIEZpbHRlcjog KGEgPSAyKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIGoyCisoNSByb3dzKQorCitleHBsYWlu IChjb3N0cyBvZmYpIC0tIERvbid0IHJlbW92ZSBTSgorCVNFTEVDVCAqIEZST00gc2ogajEs IHNqIGoyIFdIRVJFIGoxLmIgPSBqMi5iIEFORCAyID0gajIuYTsKKyAgICAgICAgICBRVUVS WSBQTEFOICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVz dGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAoajEuYiA9IGoyLmIpCisgICAtPiAgU2VxIFNj YW4gb24gc2ogajIKKyAgICAgICAgIEZpbHRlcjogKDIgPSBhKQorICAgLT4gIFNlcSBTY2Fu IG9uIHNqIGoxCisoNSByb3dzKQorCitleHBsYWluIChjb3N0cyBvZmYpIC0tIERvbid0IHJl bW92ZSBTSgorCVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyIFdIRVJFIGoxLmIgPSBqMi5i IEFORCAoajEuYSA9IDEgT1IgajIuYSA9IDEpOworICAgICAgICAgICAgICAgICAgICAgICAg ICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBO ZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6ICgoajEuYiA9IGoyLmIpIEFORCAoKGoxLmEg PSAxKSBPUiAoajIuYSA9IDEpKSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBqMQorICAgLT4g IE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ogajIKKyg1IHJvd3Mp CisKK0RST1AgSU5ERVggc2pfZm5faWR4LCBzal90ZW1wX2lkeDEsIHNqX3RlbXBfaWR4Owor LS0gVGVzdCB0aGF0IE9SIHByZWRpY2F0ZWQgYXJlIHVwZGF0ZWQgY29ycmVjdGx5IGFmdGVy IGpvaW4gcmVtb3ZhbAorQ1JFQVRFIFRBQkxFIHRhYl93aXRoX2ZsYWcgKCBpZCBJTlQgUFJJ TUFSWSBLRVksIGlzX2ZsYWcgU01BTExJTlQpOworQ1JFQVRFIElOREVYIGlkeF90ZXN0X2lz X2ZsYWcgT04gdGFiX3dpdGhfZmxhZyAoaXNfZmxhZyk7CitleHBsYWluIChjb3N0cyBvZmYp CitTRUxFQ1QgQ09VTlQoKikgRlJPTSB0YWJfd2l0aF9mbGFnCitXSEVSRQorCShpc19mbGFn IElTIE5VTEwgT1IgaXNfZmxhZyA9IDApCisJQU5EIGlkIElOIChTRUxFQ1QgaWQgRlJPTSB0 YWJfd2l0aF9mbGFnIFdIRVJFIGlkIElOICgyLCAzKSk7CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQWdncmVnYXRlCisg ICAtPiAgQml0bWFwIEhlYXAgU2NhbiBvbiB0YWJfd2l0aF9mbGFnCisgICAgICAgICBSZWNo ZWNrIENvbmQ6ICgoaWQgPSBBTlkgKCd7MiwzfSc6OmludGVnZXJbXSkpIEFORCAoaWQgSVMg Tk9UIE5VTEwpKQorICAgICAgICAgRmlsdGVyOiAoKGlzX2ZsYWcgSVMgTlVMTCkgT1IgKGlz X2ZsYWcgPSAwKSkKKyAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiB0YWJfd2l0 aF9mbGFnX3BrZXkKKyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICgoaWQgPSBBTlkgKCd7 MiwzfSc6OmludGVnZXJbXSkpIEFORCAoaWQgSVMgTk9UIE5VTEwpKQorKDYgcm93cykKKwor RFJPUCBUQUJMRSB0YWJfd2l0aF9mbGFnOworLS0gSEFWSU5HIGNsYXVzZQorZXhwbGFpbiAo Y29zdHMgb2ZmKQorc2VsZWN0IHAuYiBmcm9tIHNqIHAgam9pbiBzaiBxIG9uIHAuYSA9IHEu YSBncm91cCBieSBwLmIgaGF2aW5nIHN1bShwLmEpID0gMTsKKyAgICAgICAgICAgUVVFUlkg UExBTiAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg SGFzaEFnZ3JlZ2F0ZQorICAgR3JvdXAgS2V5OiBxLmIKKyAgIEZpbHRlcjogKHN1bShxLmEp ID0gMSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBxCisgICAgICAgICBGaWx0ZXI6IChhIElT IE5PVCBOVUxMKQorKDUgcm93cykKKworLS0gdXBkYXRlIGxhdGVyYWwgcmVmZXJlbmNlcyBh bmQgcmFuZ2UgdGFibGUgZW50cnkgcmVmZXJlbmNlCitleHBsYWluICh2ZXJib3NlLCBjb3N0 cyBvZmYpCitzZWxlY3QgMSBmcm9tIChzZWxlY3QgeC4qIGZyb20gc2ogeCwgc2ogeSB3aGVy ZSB4LmEgPSB5LmEpIHEsCisgIGxhdGVyYWwgZ2VuZXJhdGVfc2VyaWVzKDEsIHEuYSkgZ3Mo aSk7CisgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAg ICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBPdXRwdXQ6IDEKKyAgIC0+ICBTZXEgU2NhbiBv biBwdWJsaWMuc2ogeQorICAgICAgICAgT3V0cHV0OiB5LmEsIHkuYiwgeS5jCisgICAgICAg ICBGaWx0ZXI6ICh5LmEgSVMgTk9UIE5VTEwpCisgICAtPiAgRnVuY3Rpb24gU2NhbiBvbiBw Z19jYXRhbG9nLmdlbmVyYXRlX3NlcmllcyBncworICAgICAgICAgT3V0cHV0OiBncy5pCisg ICAgICAgICBGdW5jdGlvbiBDYWxsOiBnZW5lcmF0ZV9zZXJpZXMoMSwgeS5hKQorKDggcm93 cykKKworZXhwbGFpbiAodmVyYm9zZSwgY29zdHMgb2ZmKQorc2VsZWN0IDEgZnJvbSAoc2Vs ZWN0IHkuKiBmcm9tIHNqIHgsIHNqIHkgd2hlcmUgeC5hID0geS5hKSBxLAorICBsYXRlcmFs IGdlbmVyYXRlX3NlcmllcygxLCBxLmEpIGdzKGkpOworICAgICAgICAgICAgICAgICAgICAg IFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAg T3V0cHV0OiAxCisgICAtPiAgU2VxIFNjYW4gb24gcHVibGljLnNqIHkKKyAgICAgICAgIE91 dHB1dDogeS5hLCB5LmIsIHkuYworICAgICAgICAgRmlsdGVyOiAoeS5hIElTIE5PVCBOVUxM KQorICAgLT4gIEZ1bmN0aW9uIFNjYW4gb24gcGdfY2F0YWxvZy5nZW5lcmF0ZV9zZXJpZXMg Z3MKKyAgICAgICAgIE91dHB1dDogZ3MuaQorICAgICAgICAgRnVuY3Rpb24gQ2FsbDogZ2Vu ZXJhdGVfc2VyaWVzKDEsIHkuYSkKKyg4IHJvd3MpCisKKy0tIFRlc3QgdGhhdCBhIG5vbi1F Qy1kZXJpdmVkIGpvaW4gY2xhdXNlIGlzIHByb2Nlc3NlZCBjb3JyZWN0bHkuIFVzZSBhbgor LS0gb3V0ZXIgam9pbiBzbyB0aGF0IHdlIGNhbid0IGZvcm0gYW4gRUMuCitleHBsYWluIChj b3N0cyBvZmYpIHNlbGVjdCAqIGZyb20gc2ogcCBqb2luIHNqIHEgb24gcC5hID0gcS5hCisg IGxlZnQgam9pbiBzaiByIG9uIHAuYSArIHEuYSA9IHIuYTsKKyAgICAgICAgICAgICBRVUVS WSBQTEFOICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCisgTmVzdGVkIExvb3AgTGVmdCBKb2luCisgICBKb2luIEZpbHRlcjogKChxLmEgKyBx LmEpID0gci5hKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIHEKKyAgICAgICAgIEZpbHRlcjog KGEgSVMgTk9UIE5VTEwpCisgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgIC0+ICBTZXEg U2NhbiBvbiBzaiByCisoNiByb3dzKQorCistLSBGSVhNRSB0aGlzIGNvbnN0YW50IGZhbHNl IGZpbHRlciBkb2Vzbid0IGxvb2sgZ29vZC4gU2hvdWxkIHdlIG1lcmdlCistLSBlcXVpdmFs ZW5jZSBjbGFzc2VzPworZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiBw LCBzaiBxIHdoZXJlIHAuYSA9IHEuYSBhbmQgcC5iID0gMSBhbmQgcS5iID0gMjsKKyAgICAg ICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNl cSBTY2FuIG9uIHNqIHEKKyAgIEZpbHRlcjogKChhIElTIE5PVCBOVUxMKSBBTkQgKGIgPSAy KSBBTkQgKGIgPSAxKSkKKygyIHJvd3MpCisKKy0tIENoZWNrIHRoYXQgYXR0cl9uZWVkZWQg aXMgdXBkYXRlZCBjb3JyZWN0bHkgYWZ0ZXIgc2VsZi1qb2luIHJlbW92YWwuIEluIHRoaXMK Ky0tIHRlc3QsIHRoZSBqb2luIG9mIGoxIHdpdGggajIgaXMgcmVtb3ZlZC4gazEuYiBpcyBy ZXF1aXJlZCBhdCBlaXRoZXIgajEgb3IgajIuCistLSBJZiB0aGlzIGluZm8gaXMgbG9zdCwg am9pbiB0YXJnZXRsaXN0IGZvciAoazEsIGsyKSB3aWxsIG5vdCBjb250YWluIGsxLmIuCist LSBVc2UgaW5kZXggc2NhbiBmb3IgazEgc28gdGhhdCB3ZSBkb24ndCBnZXQgJ2InIGZyb20g cGh5c2ljYWwgdGxpc3QgdXNlZCBmb3IKKy0tIHNlcXNjYW4uIEFsc28gZGlzYWJsZSByZW9y ZGVyaW5nIG9mIGpvaW5zIGJlY2F1c2UgdGhpcyB0ZXN0IGRlcGVuZHMgb24gYQorLS0gcGFy dGljdWxhciBqb2luIHRyZWUuCitjcmVhdGUgdGFibGUgc2sgKGEgaW50LCBiIGludCk7Citj cmVhdGUgaW5kZXggb24gc2soYSk7CitzZXQgam9pbl9jb2xsYXBzZV9saW1pdCB0byAxOwor c2V0IGVuYWJsZV9zZXFzY2FuIHRvIG9mZjsKK2V4cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0 IDEgZnJvbQorCShzayBrMSBqb2luIHNrIGsyIG9uIGsxLmEgPSBrMi5hKQorCWpvaW4gKHNq IGoxIGpvaW4gc2ogajIgb24gajEuYSA9IGoyLmEpIG9uIGoxLmIgPSBrMS5iOworICAgICAg ICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVz dGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAoazEuYiA9IGoyLmIpCisgICAtPiAgTmVzdGVk IExvb3AKKyAgICAgICAgIC0+ICBJbmRleCBTY2FuIHVzaW5nIHNrX2FfaWR4IG9uIHNrIGsx CisgICAgICAgICAtPiAgSW5kZXggT25seSBTY2FuIHVzaW5nIHNrX2FfaWR4IG9uIHNrIGsy CisgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoYSA9IGsxLmEpCisgICAtPiAgTWF0ZXJp YWxpemUKKyAgICAgICAgIC0+ICBJbmRleCBTY2FuIHVzaW5nIHNqX2Ffa2V5IG9uIHNqIGoy CisgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoYSBJUyBOT1QgTlVMTCkKKyg5IHJvd3Mp CisKK2V4cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0IDEgZnJvbQorCShzayBrMSBqb2luIHNr IGsyIG9uIGsxLmEgPSBrMi5hKQorCWpvaW4gKHNqIGoxIGpvaW4gc2ogajIgb24gajEuYSA9 IGoyLmEpIG9uIGoyLmIgPSBrMS5iOworICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExB TiAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVy OiAoazEuYiA9IGoyLmIpCisgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgIC0+ICBJbmRl eCBTY2FuIHVzaW5nIHNrX2FfaWR4IG9uIHNrIGsxCisgICAgICAgICAtPiAgSW5kZXggT25s eSBTY2FuIHVzaW5nIHNrX2FfaWR4IG9uIHNrIGsyCisgICAgICAgICAgICAgICBJbmRleCBD b25kOiAoYSA9IGsxLmEpCisgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgIC0+ICBJbmRl eCBTY2FuIHVzaW5nIHNqX2Ffa2V5IG9uIHNqIGoyCisgICAgICAgICAgICAgICBJbmRleCBD b25kOiAoYSBJUyBOT1QgTlVMTCkKKyg5IHJvd3MpCisKK3Jlc2V0IGpvaW5fY29sbGFwc2Vf bGltaXQ7CityZXNldCBlbmFibGVfc2Vxc2NhbjsKK3NldCBzZWxmX2pvaW5fc2VhcmNoX2xp bWl0IHRvIDE7CitleHBsYWluIChjb3N0cyBvZmYpIC0tIE5vIG9uZSBzZWxmIGpvaW4gc2hv dWxkIGJlIGNvbGxhcHNlZAorICBzZWxlY3QgajEuKiBmcm9tIHNqIGoxLCBzaiBqMiwgc2og ajMgd2hlcmUgKGoxLmEgPSBqMi5hKSBhbmQgKGoyLmEgPSBqMy5hKTsKKyAgICAgICAgICAg ICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6 IChqMS5hID0gajMuYSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBqMworICAgLT4gIE1hdGVy aWFsaXplCisgICAgICAgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgICAgICAgIEpvaW4g RmlsdGVyOiAoajEuYSA9IGoyLmEpCisgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24g c2ogajEKKyAgICAgICAgICAgICAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgICAgICAg ICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqIGoyCisoOSByb3dzKQorCitzZXQgc2VsZl9qb2lu X3NlYXJjaF9saW1pdCB0byAyOworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBDb2xsYXBzZSBv bmUgc2VsZiBqb2luCisgIHNlbGVjdCBqMS4qIGZyb20gc2ogajEsIHNqIGoyLCBzaiBqMyB3 aGVyZSAoajEuYSA9IGoyLmEpIGFuZCAoajIuYSA9IGozLmEpOworICAgICAgICAgICAgICBR VUVSWSBQTEFOICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6IChqMi5hID0gajMu YSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBqMworICAgLT4gIE1hdGVyaWFsaXplCisgICAg ICAgICAtPiAgU2VxIFNjYW4gb24gc2ogajIKKyAgICAgICAgICAgICAgIEZpbHRlcjogKGEg SVMgTk9UIE5VTEwpCisoNiByb3dzKQorCitzZXQgc2VsZl9qb2luX3NlYXJjaF9saW1pdCB0 byAzOworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBDb2xsYXBzZSBib3RoIHNlbGYgam9pbnMK KyAgc2VsZWN0IGoxLiogZnJvbSBzaiBqMSwgc2ogajIsIHNqIGozIHdoZXJlIChqMS5hID0g ajIuYSkgYW5kIChqMi5hID0gajMuYSk7CisgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHNqIGozCisgICBG aWx0ZXI6IChhIElTIE5PVCBOVUxMKQorKDIgcm93cykKKworcmVzZXQgc2VsZl9qb2luX3Nl YXJjaF9saW1pdDsKKy0tIENoZWNrIHRoYXQgY2xhdXNlcyBmcm9tIHRoZSBqb2luIGZpbHRl ciBsaXN0IGlzIG5vdCBsb3N0IG9uIHRoZSBzZWxmLWpvaW4gcmVtb3ZhbAorQ1JFQVRFIFRB QkxFIGVtcDEgKCBpZCBTRVJJQUwgUFJJTUFSWSBLRVkgTk9UIE5VTEwsIGNvZGUgaW50KTsK K2V4cGxhaW4gKHZlcmJvc2UsIGNvc3RzIG9mZikKK1NFTEVDVCAqIEZST00gZW1wMSBlMSwg ZW1wMSBlMiBXSEVSRSBlMS5pZCA9IGUyLmlkIEFORCBlMi5jb2RlIDw+IGUxLmNvZGU7Cisg ICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgU2VxIFNjYW4gb24gcHVibGljLmVtcDEgZTIKKyAgIE91dHB1dDogZTIu aWQsIGUyLmNvZGUsIGUyLmlkLCBlMi5jb2RlCisgICBGaWx0ZXI6ICgoZTIuaWQgSVMgTk9U IE5VTEwpIEFORCAoZTIuY29kZSA8PiBlMi5jb2RlKSkKKygzIHJvd3MpCisKKy0tIFdlIGNh biByZW1vdmUgdGhlIGpvaW4gZXZlbiBpZiB3ZSBmaW5kIHRoZSBqb2luIGNhbid0IGR1cGxp Y2F0ZSByb3dzIGFuZAorLS0gdGhlIGJhc2UgcXVhbHMgb2YgZWFjaCBzaWRlIGFyZSBkaWZm ZXJlbnQuICBJbiB0aGUgZm9sbG93aW5nIGNhc2Ugd2UgZW5kIHVwCistLSBtb3ZpbmcgcXVh bHMgb3ZlciB0byBzMSB0byBtYWtlIGl0IHNvIGl0IGNhbid0IG1hdGNoIGFueSByb3dzLgor Y3JlYXRlIHRhYmxlIHNsKGEgaW50LCBiIGludCwgYyBpbnQpOworY3JlYXRlIHVuaXF1ZSBp bmRleCBvbiBzbChhLCBiKTsKK3ZhY3V1bSBhbmFseXplIHNsOworLS0gQm90aCBzaWRlcyBh cmUgdW5pcXVlLCBidXQgYmFzZSBxdWFscyBhcmUgZGlmZmVyZW50CitleHBsYWluIChjb3N0 cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNsIHQxLCBzbCB0MiB3aGVyZSB0MS5hID0gdDIuYSBh bmQgdDEuYiA9IDEgYW5kIHQyLmIgPSAyOworICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAg Sm9pbiBGaWx0ZXI6ICh0MS5hID0gdDIuYSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzbCB0MQor ICAgICAgICAgRmlsdGVyOiAoYiA9IDEpCisgICAtPiAgU2VxIFNjYW4gb24gc2wgdDIKKyAg ICAgICAgIEZpbHRlcjogKGIgPSAyKQorKDYgcm93cykKKworLS0gQ2hlY2sgTnVsbFRlc3Qg aW4gYmFzZXJlc3RyaWN0aW5mbyBsaXN0CitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3Qg KiBmcm9tIHNsIHQxLCBzbCB0Mgord2hlcmUgdDEuYSA9IHQyLmEgYW5kIHQxLmIgPSAxIGFu ZCB0Mi5iID0gMgorICBhbmQgdDEuYyBJUyBOT1QgTlVMTCBhbmQgdDIuYyBJUyBOT1QgTlVM TAorICBhbmQgdDIuYiBJUyBOT1QgTlVMTCBhbmQgdDEuYiBJUyBOT1QgTlVMTAorICBhbmQg dDEuYSBJUyBOT1QgTlVMTCBhbmQgdDIuYSBJUyBOT1QgTlVMTDsKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAodDEuYSA9IHQyLmEpCisgICAtPiAg U2VxIFNjYW4gb24gc2wgdDEKKyAgICAgICAgIEZpbHRlcjogKChjIElTIE5PVCBOVUxMKSBB TkQgKGIgSVMgTk9UIE5VTEwpIEFORCAoYSBJUyBOT1QgTlVMTCkgQU5EIChiID0gMSkpCisg ICAtPiAgU2VxIFNjYW4gb24gc2wgdDIKKyAgICAgICAgIEZpbHRlcjogKChjIElTIE5PVCBO VUxMKSBBTkQgKGIgSVMgTk9UIE5VTEwpIEFORCAoYSBJUyBOT1QgTlVMTCkgQU5EIChiID0g MikpCisoNiByb3dzKQorCitleHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYpCitzZWxlY3Qg KiBmcm9tIHNsIHQxLCBzbCB0Mgord2hlcmUgdDEuYiA9IHQyLmIgYW5kIHQyLmEgPSAzIGFu ZCB0MS5hID0gMworICBhbmQgdDEuYyBJUyBOT1QgTlVMTCBhbmQgdDIuYyBJUyBOT1QgTlVM TAorICBhbmQgdDIuYiBJUyBOT1QgTlVMTCBhbmQgdDEuYiBJUyBOT1QgTlVMTAorICBhbmQg dDEuYSBJUyBOT1QgTlVMTCBhbmQgdDIuYSBJUyBOT1QgTlVMTDsKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gcHVibGljLnNsIHQyCisgICBPdXRwdXQ6IHQy LmEsIHQyLmIsIHQyLmMsIHQyLmEsIHQyLmIsIHQyLmMKKyAgIEZpbHRlcjogKCh0Mi5jIElT IE5PVCBOVUxMKSBBTkQgKHQyLmIgSVMgTk9UIE5VTEwpIEFORCAodDIuYSBJUyBOT1QgTlVM TCkgQU5EICh0Mi5hID0gMykpCisoMyByb3dzKQorCistLSBKb2luIHF1YWwgaXNuJ3QgbWVy Z2Vqb2luYWJsZSwgYnV0IGlubmVyIGlzIHVuaXF1ZS4KK2V4cGxhaW4gKENPU1RTIE9GRikK K1NFTEVDVCBuMi5hIEZST00gc2ogbjEsIHNqIG4yIFdIRVJFIG4xLmEgPD4gbjIuYSBBTkQg bjIuYSA9IDE7CisgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgCistLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAo bjEuYSA8PiBuMi5hKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIG4yCisgICAgICAgICBGaWx0 ZXI6IChhID0gMSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBuMQorKDUgcm93cykKKworZXhw bGFpbiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTQorCShTRUxFQ1QgbjIuYSBGUk9NIHNq IG4xLCBzaiBuMiBXSEVSRSBuMS5hIDw+IG4yLmEpIHEwLCBzbAorV0hFUkUgcTAuYSA9IDE7 CisgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAobjEuYSA8PiBu Mi5hKQorICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2wK KyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBzaiBuMgorICAgICAgICAgICAgICAgRmlsdGVy OiAoYSA9IDEpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogbjEKKyg3IHJvd3MpCisKKy0tCist LS0tIE9ubHkgb25lIHNpZGUgaXMgdW5xaXVlCistLXNlbGVjdCAqIGZyb20gc2wgdDEsIHNs IHQyIHdoZXJlIHQxLmEgPSB0Mi5hIGFuZCB0MS5iID0gMTsKKy0tc2VsZWN0ICogZnJvbSBz bCB0MSwgc2wgdDIgd2hlcmUgdDEuYSA9IHQyLmEgYW5kIHQyLmIgPSAxOworLS0KKy0tLS0g U2V2ZXJhbCB1bmlxdWVzIGluZGV4ZXMgbWF0Y2gsIGFuZCB3ZSBzZWxlY3QgYSBkaWZmZXJl bnQgb25lCistLS0tIGZvciBlYWNoIHNpZGUsIHNvIHRoZSBqb2luIGlzIG5vdCByZW1vdmVk CistLWNyZWF0ZSB0YWJsZSBzbShhIGludCB1bmlxdWUsIGIgaW50IHVuaXF1ZSwgYyBpbnQg dW5pcXVlKTsKKy0tZXhwbGFpbiAoY29zdHMgb2ZmKQorLS1zZWxlY3QgKiBmcm9tIHNtIG0s IHNtIG4gd2hlcmUgbS5hID0gbi5iIGFuZCBtLmMgPSBuLmM7CistLWV4cGxhaW4gKGNvc3Rz IG9mZikKKy0tc2VsZWN0ICogZnJvbSBzbSBtLCBzbSBuIHdoZXJlIG0uYSA9IG4uYyBhbmQg bS5iID0gbi5iOworLS1leHBsYWluIChjb3N0cyBvZmYpCistLXNlbGVjdCAqIGZyb20gc20g bSwgc20gbiB3aGVyZSBtLmMgPSBuLmIgYW5kIG0uYSA9IG4uYTsKKy0tIENoZWNrIG9wdGlt aXphdGlvbiBkaXNhYmxpbmcgaWYgaXQgd2lsbCB2aW9sYXRlIHNwZWNpYWwgam9pbiBjb25k aXRpb25zLgorLS0gVHdvIGlkZW50aWNhbCBqb2luZWQgcmVsYXRpb25zIHNhdGlzZmllcyBz ZWxmIGpvaW4gcmVtb3ZhbCBjb25kaXRpb25zIGJ1dAorLS0gc3RheSBpbiBkaWZmZXJlbnQg c3BlY2lhbCBqb2luIGluZm9zLgorQ1JFQVRFIFRBQkxFIHNqX3QxIChpZCBzZXJpYWwsIGEg aW50KTsKK0NSRUFURSBUQUJMRSBzal90MiAoaWQgc2VyaWFsLCBhIGludCk7CitDUkVBVEUg VEFCTEUgc2pfdDMgKGlkIHNlcmlhbCwgYSBpbnQpOworQ1JFQVRFIFRBQkxFIHNqX3Q0IChp ZCBzZXJpYWwsIGEgaW50KTsKK0NSRUFURSBVTklRVUUgSU5ERVggT04gc2pfdDMgVVNJTkcg YnRyZWUgKGEsaWQpOworQ1JFQVRFIFVOSVFVRSBJTkRFWCBPTiBzal90MiBVU0lORyBidHJl ZSAoaWQpOworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTSBzal90MQorSk9J TiAoCisJU0VMRUNUIHNqX3QyLmlkIEFTIGlkIEZST00gc2pfdDIKKwlXSEVSRSBFWElTVFMK KwkJKAorCQlTRUxFQ1QgVFJVRSBGUk9NIHNqX3QzLHNqX3Q0IFdIRVJFIHNqX3QzLmEgPSAx IEFORCBzal90My5pZCA9IHNqX3QyLmlkCisJCSkKKwkpIHQydDN0NAorT04gc2pfdDEuaWQg PSB0MnQzdDQuaWQKK0pPSU4gKAorCVNFTEVDVCBzal90Mi5pZCBBUyBpZCBGUk9NIHNqX3Qy CisJV0hFUkUgRVhJU1RTCisJCSgKKwkJU0VMRUNUIFRSVUUgRlJPTSBzal90Myxzal90NCBX SEVSRSBzal90My5hID0gMSBBTkQgc2pfdDMuaWQgPSBzal90Mi5pZAorCQkpCisJKSBfdDJ0 M3Q0CitPTiBzal90MS5pZCA9IF90MnQzdDQuaWQ7CisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExv b3AKKyAgIEpvaW4gRmlsdGVyOiAoc2pfdDMuaWQgPSBzal90MS5pZCkKKyAgIC0+ICBOZXN0 ZWQgTG9vcAorICAgICAgICAgSm9pbiBGaWx0ZXI6IChzal90My5pZCA9IHNqX3QyLmlkKQor ICAgICAgICAgLT4gIE5lc3RlZCBMb29wIFNlbWkgSm9pbgorICAgICAgICAgICAgICAgLT4g IE5lc3RlZCBMb29wCisgICAgICAgICAgICAgICAgICAgICAtPiAgSGFzaEFnZ3JlZ2F0ZQor ICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAgS2V5OiBzal90My5pZAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2pfdDQKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgLT4gIEJpdG1hcCBIZWFwIFNjYW4gb24gc2pfdDMKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY2hlY2sgQ29u ZDogKGEgPSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgLT4gIEJpdG1hcCBJbmRleCBTY2FuIG9uIHNqX3QzX2FfaWRfaWR4CisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAo YSA9IDEpCisgICAgICAgICAgICAgICAgICAgICAtPiAgSW5kZXggT25seSBTY2FuIHVzaW5n IHNqX3QyX2lkX2lkeCBvbiBzal90MiBzal90Ml8xCisgICAgICAgICAgICAgICAgICAgICAg ICAgICBJbmRleCBDb25kOiAoaWQgPSBzal90My5pZCkKKyAgICAgICAgICAgICAgIC0+ICBO ZXN0ZWQgTG9vcAorICAgICAgICAgICAgICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1 c2luZyBzal90M19hX2lkX2lkeCBvbiBzal90MyBzal90M18xCisgICAgICAgICAgICAgICAg ICAgICAgICAgICBJbmRleCBDb25kOiAoKGEgPSAxKSBBTkQgKGlkID0gc2pfdDMuaWQpKQor ICAgICAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqX3Q0IHNqX3Q0XzEKKyAg ICAgICAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgc2pfdDJfaWRfaWR4IG9uIHNqX3Qy CisgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoaWQgPSBzal90Ml8xLmlkKQorICAgLT4g IFNlcSBTY2FuIG9uIHNqX3QxCisoMjQgcm93cykKKworLS0KKy0tIFRlc3QgUm93TWFya3Mt cmVsYXRlZCBjb2RlCistLQorLS0gVE9ETzogV2h5IHRoaXMgc2VsZWN0IHJldHVybnMgdHdv IGNvaWVzIG9mIGN0aWQgZmllbGQ/IFNob3VsZCB3ZSBmaXggaXQ/CitFWFBMQUlOIChDT1NU UyBPRkYpIC0tIEJvdGggc2lkZXMgaGF2ZSBleHBsaWNpdCBMb2NrUm93cyBtYXJrcworU0VM RUNUIGExLmEgRlJPTSBzaiBhMSxzaiBhMiBXSEVSRSAoYTEuYT1hMi5hKSBGT1IgVVBEQVRF OworICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyBMb2NrUm93cworICAgLT4gIFNlcSBTY2FuIG9uIHNqIGEy CisgICAgICAgICBGaWx0ZXI6IChhIElTIE5PVCBOVUxMKQorKDMgcm93cykKKworRVhQTEFJ TiAoQ09TVFMgT0ZGKSAtLSBBIFJvd01hcmsgZXhpc3RzIGZvciB0aGUgdGFibGUgYmVpbmcg a2VwdAorVVBEQVRFIHNqIHNxIFNFVCBiID0gMSBGUk9NIHNqIGFzIHN6IFdIRVJFIHNxLmEg PSBzei5hOworICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgCistLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBVcGRhdGUgb24gc2ogc3EKKyAgIC0+ICBTZXEg U2NhbiBvbiBzaiBzegorICAgICAgICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKygzIHJv d3MpCisKK0NSRUFURSBSVUxFIHNqX2RlbF9ydWxlIEFTIE9OIERFTEVURSBUTyBzagorICBE TyBJTlNURUFECisgICAgVVBEQVRFIHNqIFNFVCBhID0gMSBXSEVSRSBhID0gb2xkLmE7CitF WFBMQUlOIChDT1NUUyBPRkYpIERFTEVURSBGUk9NIHNqOyAtLSBBIFJvd01hcmsgZXhpc3Rz IGZvciB0aGUgdGFibGUgYmVpbmcgZHJvcHBlZAorICAgICAgICAgICBRVUVSWSBQTEFOICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBVcGRhdGUg b24gc2oKKyAgIC0+ICBTZXEgU2NhbiBvbiBzagorICAgICAgICAgRmlsdGVyOiAoYSBJUyBO T1QgTlVMTCkKKygzIHJvd3MpCisKK0RST1AgUlVMRSBzal9kZWxfcnVsZSBPTiBzaiBDQVND QURFOworcmVzZXQgZW5hYmxlX2hhc2hqb2luOworcmVzZXQgZW5hYmxlX21lcmdlam9pbjsK IC0tCiAtLSBUZXN0IGhpbnRzIGdpdmVuIG9uIGluY29ycmVjdCBjb2x1bW4gcmVmZXJlbmNl cyBhcmUgdXNlZnVsCiAtLQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3Rl ZC9zeXN2aWV3cy5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91 dAppbmRleCA0ZTc3NWFmMTc1Li5jNzM0ZDVlY2E3IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4 cGVjdGVkL3N5c3ZpZXdzLm91dApAQCAtMTI5LDEwICsxMjksMTEgQEAgc2VsZWN0IG5hbWUs IHNldHRpbmcgZnJvbSBwZ19zZXR0aW5ncyB3aGVyZSBuYW1lIGxpa2UgJ2VuYWJsZSUnOwog IGVuYWJsZV9wYXJ0aXRpb25fcHJ1bmluZyAgICAgICB8IG9uCiAgZW5hYmxlX3BhcnRpdGlv bndpc2VfYWdncmVnYXRlIHwgb2ZmCiAgZW5hYmxlX3BhcnRpdGlvbndpc2Vfam9pbiAgICAg IHwgb2ZmCisgZW5hYmxlX3NlbGZfam9pbl9yZW1vdmFsICAgICAgIHwgb24KICBlbmFibGVf c2Vxc2NhbiAgICAgICAgICAgICAgICAgfCBvbgogIGVuYWJsZV9zb3J0ICAgICAgICAgICAg ICAgICAgICB8IG9uCiAgZW5hYmxlX3RpZHNjYW4gICAgICAgICAgICAgICAgIHwgb24KLSgy MSByb3dzKQorKDIyIHJvd3MpCiAKIC0tIFRlc3QgdGhhdCB0aGUgcGdfdGltZXpvbmVfbmFt ZXMgYW5kIHBnX3RpbWV6b25lX2FiYnJldnMgdmlld3MgYXJlCiAtLSBtb3JlLW9yLWxlc3Mg d29ya2luZy4gIFdlIGNhbid0IHRlc3QgdGhlaXIgY29udGVudHMgaW4gYW55IGdyZWF0IGRl dGFpbApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZXF1aXZjbGFzcy5zcWwg Yi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9lcXVpdmNsYXNzLnNxbAppbmRleCAyNDdiMGEzMTA1 Li43N2RkOTY0ZWJmIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9lcXVpdmNs YXNzLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9lcXVpdmNsYXNzLnNxbApAQCAt MjU5LDYgKzI1OSwyMiBAQCBkcm9wIHVzZXIgcmVncmVzc191c2VyX2VjdGVzdDsKIGV4cGxh aW4gKGNvc3RzIG9mZikKICAgc2VsZWN0ICogZnJvbSB0ZW5rMSB3aGVyZSB1bmlxdWUxID0g dW5pcXVlMSBhbmQgdW5pcXVlMiA9IHVuaXF1ZTI7CiAKKy0tIFRlc3QgdGhhdCBicm9rZW4g RUNzIGFyZSBwcm9jZXNzZWQgY29ycmVjdGx5IGR1cmluZyBzZWxmIGpvaW4gcmVtb3ZhbC4K Ky0tIERpc2FibGUgbWVyZ2Ugam9pbnMgc28gdGhhdCB3ZSBkb24ndCBnZXQgYW4gZXJyb3Ig YWJvdXQgbWlzc2luZyBjb21tdXRhdG9yLgorLS0gVGVzdCBib3RoIG9yaWVudGF0aW9ucyBv ZiB0aGUgam9pbiBjbGF1c2UsIGJlY2F1c2Ugb25seSBvbmUgb2YgdGhlbSBicmVha3MKKy0t IHRoZSBFQy4KK3NldCBlbmFibGVfbWVyZ2Vqb2luIHRvIG9mZjsKKworZXhwbGFpbiAoY29z dHMgb2ZmKQorICBzZWxlY3QgKiBmcm9tIGVjMCBtIGpvaW4gZWMwIG4gb24gbS5mZiA9IG4u ZmYKKyAgam9pbiBlYzEgcCBvbiBtLmZmICsgbi5mZiA9IHAuZjE7CisKK2V4cGxhaW4gKGNv c3RzIG9mZikKKyAgc2VsZWN0ICogZnJvbSBlYzAgbSBqb2luIGVjMCBuIG9uIG0uZmYgPSBu LmZmCisgIGpvaW4gZWMxIHAgb24gcC5mMTo6aW50OCA9IChtLmZmICsgbi5mZik6OmludDhh bGlhczE7CisKK3Jlc2V0IGVuYWJsZV9tZXJnZWpvaW47CisKIC0tIHRoaXMgY291bGQgYmUg Y29udmVydGVkLCBidXQgaXNuJ3QgYXQgcHJlc2VudAogZXhwbGFpbiAoY29zdHMgb2ZmKQog ICBzZWxlY3QgKiBmcm9tIHRlbmsxIHdoZXJlIHVuaXF1ZTEgPSB1bmlxdWUxIG9yIHVuaXF1 ZTIgPSB1bmlxdWUyOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvam9pbi5z cWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbAppbmRleCAyN2U3ZTc0MWExLi4x YzU5M2MxYTJmIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbAor KysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbApAQCAtMTc5Myw2ICsxNzkzLDM0 NiBAQCBzZWxlY3QgKiBmcm9tCiBzZWxlY3QgKiBmcm9tCiAgIGludDhfdGJsIHggam9pbiAo aW50NF90YmwgeCBjcm9zcyBqb2luIGludDRfdGJsIHkoZmYpKSBqIG9uIHExID0gZjE7IC0t IG9rCiAKKy0tCistLSB0ZXN0IHRoYXQgc2VtaS0gb3IgaW5uZXIgc2VsZi1qb2lucyBvbiBh IHVuaXF1ZSBjb2x1bW4gYXJlIHJlbW92ZWQKKy0tCisKKy0tIGVuYWJsZSBvbmx5IG5lc3Rs b29wIHRvIGdldCBtb3JlIHByZWRpY3RhYmxlIHBsYW5zCitzZXQgZW5hYmxlX2hhc2hqb2lu IHRvIG9mZjsKK3NldCBlbmFibGVfbWVyZ2Vqb2luIHRvIG9mZjsKKworY3JlYXRlIHRhYmxl IHNqIChhIGludCB1bmlxdWUsIGIgaW50LCBjIGludCB1bmlxdWUpOworaW5zZXJ0IGludG8g c2ogdmFsdWVzICgxLCBudWxsLCAyKSwgKG51bGwsIDIsIG51bGwpLCAoMiwgMSwgMSk7Cith bmFseXplIHNqOworCistLSBUcml2aWFsIHNlbGYtam9pbiBjYXNlLgorZXhwbGFpbiAoY29z dHMgb2ZmKQorc2VsZWN0IHAuKiBmcm9tIHNqIHAsIHNqIHEgd2hlcmUgcS5hID0gcC5hIGFu ZCBxLmIgPSBxLmEgLSAxOworc2VsZWN0IHAuKiBmcm9tIHNqIHAsIHNqIHEgd2hlcmUgcS5h ID0gcC5hIGFuZCBxLmIgPSBxLmEgLSAxOworCistLSBTZWxmLWpvaW4gcmVtb3ZhbCBwZXJm b3JtcyBhZnRlciBhIHN1YnF1ZXJ5IHB1bGwtdXAgcHJvY2VzcyBhbmQgY291bGQgcmVtb3Zl CistLSBzdWNoIGtpbmQgb2Ygc2VsZi1qb2luIHRvby4gQ2hlY2sgdGhpcyBvcHRpb24uCitl eHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHAKK3doZXJlIGV4aXN0cyAo c2VsZWN0ICogZnJvbSBzaiBxCisJCQkJd2hlcmUgcS5hID0gcC5hIGFuZCBxLmIgPCAxMCk7 CitzZWxlY3QgKiBmcm9tIHNqIHAgd2hlcmUgZXhpc3RzIChzZWxlY3QgKiBmcm9tIHNqIHEg d2hlcmUgcS5hID0gcC5hIGFuZCBxLmIgPCAxMCk7CisKKy0tIERvbid0IHJlbW92ZSBzZWxm LWpvaW4gZm9yIHRoZSBjYXNlIG9mIGVxdWFsaXR5IG9mIHR3byBkaWZmZXJlbnQgdW5pcXVl IGNvbHVtbnMuCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHQxLCBz aiB0MiB3aGVyZSB0MS5hID0gdDIuYyBhbmQgdDEuYiBpcyBub3QgbnVsbDsKKworLS0gRGVn ZW5lcmF0ZWQgY2FzZS4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20KKwko c2VsZWN0IGEgYXMgeCBmcm9tIHNqIHdoZXJlIGZhbHNlKSBhcyBxMSwKKwkoc2VsZWN0IGEg YXMgeSBmcm9tIHNqIHdoZXJlIGZhbHNlKSBhcyBxMgord2hlcmUgcTEueCA9IHEyLnk7CisK Ky0tIFdlIGNhbid0IHVzZSBhIGNyb3NzLUVDIGdlbmVyYXRlZCBzZWxmIGpvaW4gcXVhbCBi ZWNhdXNlIG9mIGN1cnJlbnQgbG9naWMgb2YKKy0tIHRoZSBnZW5lcmF0ZV9qb2luX2ltcGxp ZWRfZXF1YWxpdGllcyByb3V0aW5lLgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICog ZnJvbSBzaiB0MSwgc2ogdDIgd2hlcmUgdDEuYSA9IHQxLmIgYW5kIHQxLmIgPSB0Mi5iIGFu ZCB0Mi5iID0gdDIuYTsKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2og dDEsIHNqIHQyLCBzaiB0Mword2hlcmUgdDEuYSA9IHQxLmIgYW5kIHQxLmIgPSB0Mi5iIGFu ZCB0Mi5iID0gdDIuYQorCWFuZCB0MS5iID0gdDMuYiBhbmQgdDMuYiA9IHQzLmE7CisKKy0t IERvdWJsZSBzZWxmLWpvaW4gcmVtb3ZhbC4KKy0tIFVzZSBhIGNvbmRpdGlvbiBvbiAiYiAr IDEiLCBub3Qgb24gImIiLCBmb3IgdGhlIHNlY29uZCBqb2luLCBzbyB0aGF0CistLSB0aGUg ZXF1aXZhbGVuY2UgY2xhc3MgaXMgZGlmZmVyZW50IGZyb20gdGhlIGZpcnN0IG9uZSwgYW5k IHdlIGNhbgorLS0gdGVzdCB0aGUgbm9uLWVjIGNvZGUgcGF0aC4KK2V4cGxhaW4gKGNvc3Rz IG9mZikKK3NlbGVjdCAqIGZyb20gc2ogdDEgam9pbiBzaiB0MiBvbiB0MS5hID0gdDIuYSBh bmQgdDEuYiA9IHQyLmIKKwlqb2luIHNqIHQzIG9uIHQyLmEgPSB0My5hIGFuZCB0Mi5iICsg MSA9IHQzLmIgKyAxOworCistLSBzdWJzZWxlY3QgdGhhdCByZWZlcmVuY2VzIHRoZSByZW1v dmVkIHJlbGF0aW9uCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgdDEuYSwgKHNlbGVj dCBhIGZyb20gc2ogd2hlcmUgYSA9IHQyLmEgYW5kIGEgPSB0MS5hKQorZnJvbSBzaiB0MSwg c2ogdDIKK3doZXJlIHQxLmEgPSB0Mi5hOworCistLSBzZWxmLWpvaW4gdW5kZXIgb3V0ZXIg am9pbgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB4IGpvaW4gc2og eSBvbiB4LmEgPSB5LmEKK2xlZnQgam9pbiBpbnQ4X3RibCB6IG9uIHguYSA9IHoucTE7CisK K2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogeCBqb2luIHNqIHkgb24g eC5hID0geS5hCitsZWZ0IGpvaW4gaW50OF90YmwgeiBvbiB5LmEgPSB6LnExOworCitleHBs YWluIChjb3N0cyBvZmYpCitTRUxFQ1QgKiBGUk9NICgKKyAgU0VMRUNUIHQxLiosIHQyLmEg QVMgYXggRlJPTSBzaiB0MSBKT0lOIHNqIHQyCisgIE9OICh0MS5hID0gdDIuYSBBTkQgdDEu Yyp0MS5jID0gdDIuYysyIEFORCB0Mi5iIElTIE5VTEwpCispIEFTIHExCitMRUZUIEpPSU4K KyAgKFNFTEVDVCB0My4qIEZST00gc2ogdDMsIHNqIHQ0IFdIRVJFIHQzLmMgPSB0NC5jKSBB UyBxMgorT04gcTEuYXggPSBxMi5hOworCistLSBUZXN0IHRoYXQgcGxhY2Vob2xkZXJzIGFy ZSB1cGRhdGVkIGNvcnJlY3RseSBhZnRlciBqb2luIHJlbW92YWwKK2V4cGxhaW4gKGNvc3Rz IG9mZikKK3NlbGVjdCAqIGZyb20gKHZhbHVlcyAoMSkpIHgKK2xlZnQgam9pbiAoc2VsZWN0 IGNvYWxlc2NlKHkucTEsIDEpIGZyb20gaW50OF90YmwgeQorCXJpZ2h0IGpvaW4gc2ogajEg aW5uZXIgam9pbiBzaiBqMiBvbiBqMS5hID0gajIuYQorCW9uIHRydWUpIHoKK29uIHRydWU7 CisKKy0tCistLSBTSlIgY29ybmVyIGNhc2U6IHVuaXF1ZW5lc3Mgb2YgYW4gaW5uZXIgaXMg W3BhcnRpYWxseV0gZGVyaXZlZCBmcm9tCistLSBiYXNlcmVzdHJpY3RpbmZvIGNsYXVzZXMu CistLSBYWFg6IFdlIHJlYWxseSBzaG91bGQgYWxsb3cgU0pSIGZvciB0aGVzZSBjb3JuZXIg Y2FzZXM/CistLQorCitJTlNFUlQgSU5UTyBzaiBWQUxVRVMgKDMsIDEsIDMpOworCitleHBs YWluIChjb3N0cyBvZmYpIC0tIERvbid0IHJlbW92ZSBTSgorCVNFTEVDVCAqIEZST00gc2og ajEsIHNqIGoyIFdIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMiBBTkQgajIuYSA9IDM7 CitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorV0hFUkUgajEuYiA9IGoyLmIgQU5EIGox LmEgPSAyIEFORCBqMi5hID0gMzsgLS0gUmV0dXJuIG9uZSByb3cKKworZXhwbGFpbiAoY29z dHMgb2ZmKSAtLSBSZW1vdmUgU0osIGRlZmluZSB1bmlxdWVuZXNzIGJ5IGEgY29uc3RhbnQK KwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMiBXSEVSRSBqMS5iID0gajIuYiBBTkQgajEu YSA9IDIgQU5EIGoyLmEgPSAyOworU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKK1dIRVJF IGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMiBBTkQgajIuYSA9IDI7IC0tIFJldHVybiBvbmUg cm93CisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoy CitXSEVSRSBqMS5iID0gajIuYgorICBBTkQgajEuYSA9IChFWFRSQUNUKERPVyBGUk9NIGN1 cnJlbnRfdGltZXN0YW1wKDApKS8xNSArIDMpOjppbnQKKyAgQU5EIChFWFRSQUNUKERPVyBG Uk9NIGN1cnJlbnRfdGltZXN0YW1wKDApKS8xNSArIDMpOjppbnQgPSBqMi5hCis7IC0tIFJl bW92ZSBTSiwgZGVmaW5lIHVuaXF1ZW5lc3MgYnkgYSBjb25zdGFudCBleHByZXNzaW9uCitT RUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorV0hFUkUgajEuYiA9IGoyLmIKKyAgQU5EIGox LmEgPSAoRVhUUkFDVChET1cgRlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSkvMTUgKyAzKTo6 aW50CisgIEFORCAoRVhUUkFDVChET1cgRlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSkvMTUg KyAzKTo6aW50ID0gajIuYQorOyAtLSBSZXR1cm4gb25lIHJvdworCitleHBsYWluIChjb3N0 cyBvZmYpIC0tIFJlbW92ZSBTSgorCVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyIFdIRVJF IGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMSBBTkQgajIuYSA9IDE7CitTRUxFQ1QgKiBGUk9N IHNqIGoxLCBzaiBqMgorV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEgPSAxIEFORCBqMi5h ID0gMTsgLS0gUmV0dXJuIG5vIHJvd3MKKworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBTaHVm ZmxlIGEgY2xhdXNlLiBSZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMiBX SEVSRSBqMS5iID0gajIuYiBBTkQgMSA9IGoxLmEgQU5EIGoyLmEgPSAxOworU0VMRUNUICog RlJPTSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iIEFORCAxID0gajEuYSBBTkQg ajIuYSA9IDE7IC0tIFJldHVybiBubyByb3dzCisKKy0tIEZ1bmN0aW9uYWwgaW5kZXgKK0NS RUFURSBVTklRVUUgSU5ERVggc2pfZm5faWR4IE9OIHNqKChhICogYSkpOworZXhwbGFpbiAo Y29zdHMgb2ZmKSAtLSBSZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgor CVdIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hKmoxLmEgPSAxIEFORCBqMi5hKmoyLmEgPSAx OworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBEb24ndCByZW1vdmUgU0oKKwlTRUxFQ1QgKiBG Uk9NIHNqIGoxLCBzaiBqMgorCVdIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hKmoxLmEgPSAx IEFORCBqMi5hKmoyLmEgPSAyOworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJP TSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iCisgIEFORCAoajEuYSpqMS5hKSA9 IChFWFRSQUNUKERPVyBGUk9NIGN1cnJlbnRfdGltZXN0YW1wKDApKS8xNSArIDMpOjppbnQK KyAgQU5EIChFWFRSQUNUKERPVyBGUk9NIGN1cnJlbnRfdGltZXN0YW1wKDApKS8xNSArIDMp OjppbnQgPSAoajIuYSpqMi5hKQorOyAtLSBSZXN0cmljdGlvbiBjb250YWlucyBleHByZXNz aW9ucyBpbiBib3RoIHNpZGVzLCBSZW1vdmUgU0ouCitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBz aiBqMgorV0hFUkUgajEuYiA9IGoyLmIKKyAgQU5EIChqMS5hKmoxLmEpID0gKEVYVFJBQ1Qo RE9XIEZST00gY3VycmVudF90aW1lc3RhbXAoMCkpLzE1ICsgMyk6OmludAorICBBTkQgKEVY VFJBQ1QoRE9XIEZST00gY3VycmVudF90aW1lc3RhbXAoMCkpLzE1ICsgMyk6OmludCA9IChq Mi5hKmoyLmEpCis7IC0tIEVtcHR5IHNldCBvZiByb3dzIHNob3VsZCBiZSByZXR1cm5lZAor RVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKK1dIRVJF IGoxLmIgPSBqMi5iCisgIEFORCAoajEuYSpqMS5hKSA9IChyYW5kb20oKS8zICsgMyk6Omlu dAorICBBTkQgKHJhbmRvbSgpLzMgKyAzKTo6aW50ID0gKGoyLmEqajIuYSkKKzsgLS0gUmVz dHJpY3Rpb24gY29udGFpbnMgdm9sYXRpbGUgZnVuY3Rpb24gLSBkaXNhYmxlIFNKUiBmZWF0 dXJlLgorU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iCisg IEFORCAoajEuYSpqMS5jLzMpID0gKHJhbmRvbSgpLzMgKyAzKTo6aW50CisgIEFORCAocmFu ZG9tKCkvMyArIDMpOjppbnQgPSAoajIuYSpqMi5jLzMpCis7IC0tIFJldHVybiBvbmUgcm93 CisKKy0tIE11bHRpcGxlIGZpbHRlcnMKK0NSRUFURSBVTklRVUUgSU5ERVggc2pfdGVtcF9p ZHgxIE9OIHNqKGEsYixjKTsKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gUmVtb3ZlIFNKCisJ U0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKKwlXSEVSRSBqMS5iID0gajIuYiBBTkQgajEu YSA9IDIgQU5EIGoxLmMgPSAzIEFORCBqMi5hID0gMiBBTkQgMyA9IGoyLmM7CitleHBsYWlu IChjb3N0cyBvZmYpIC0tIERvbid0IHJlbW92ZSBTSgorCVNFTEVDVCAqIEZST00gc2ogajEs IHNqIGoyCisJV0hFUkUgajEuYiA9IGoyLmIgQU5EIDIgPSBqMS5hIEFORCBqMS5jID0gMyBB TkQgajIuYSA9IDEgQU5EIDMgPSBqMi5jOworCitDUkVBVEUgVU5JUVVFIElOREVYIHNqX3Rl bXBfaWR4IE9OIHNqKGEsYik7CitleHBsYWluIChjb3N0cyBvZmYpIC0tIERvbid0IHJlbW92 ZSBTSgorCVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyIFdIRVJFIGoxLmIgPSBqMi5iIEFO RCBqMS5hID0gMjsKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gRG9uJ3QgcmVtb3ZlIFNKCisJ U0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIDIgPSBq Mi5hOworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBEb24ndCByZW1vdmUgU0oKKwlTRUxFQ1Qg KiBGUk9NIHNqIGoxLCBzaiBqMiBXSEVSRSBqMS5iID0gajIuYiBBTkQgKGoxLmEgPSAxIE9S IGoyLmEgPSAxKTsKK0RST1AgSU5ERVggc2pfZm5faWR4LCBzal90ZW1wX2lkeDEsIHNqX3Rl bXBfaWR4OworCistLSBUZXN0IHRoYXQgT1IgcHJlZGljYXRlZCBhcmUgdXBkYXRlZCBjb3Jy ZWN0bHkgYWZ0ZXIgam9pbiByZW1vdmFsCitDUkVBVEUgVEFCTEUgdGFiX3dpdGhfZmxhZyAo IGlkIElOVCBQUklNQVJZIEtFWSwgaXNfZmxhZyBTTUFMTElOVCk7CitDUkVBVEUgSU5ERVgg aWR4X3Rlc3RfaXNfZmxhZyBPTiB0YWJfd2l0aF9mbGFnIChpc19mbGFnKTsKK2V4cGxhaW4g KGNvc3RzIG9mZikKK1NFTEVDVCBDT1VOVCgqKSBGUk9NIHRhYl93aXRoX2ZsYWcKK1dIRVJF CisJKGlzX2ZsYWcgSVMgTlVMTCBPUiBpc19mbGFnID0gMCkKKwlBTkQgaWQgSU4gKFNFTEVD VCBpZCBGUk9NIHRhYl93aXRoX2ZsYWcgV0hFUkUgaWQgSU4gKDIsIDMpKTsKK0RST1AgVEFC TEUgdGFiX3dpdGhfZmxhZzsKKworLS0gSEFWSU5HIGNsYXVzZQorZXhwbGFpbiAoY29zdHMg b2ZmKQorc2VsZWN0IHAuYiBmcm9tIHNqIHAgam9pbiBzaiBxIG9uIHAuYSA9IHEuYSBncm91 cCBieSBwLmIgaGF2aW5nIHN1bShwLmEpID0gMTsKKworLS0gdXBkYXRlIGxhdGVyYWwgcmVm ZXJlbmNlcyBhbmQgcmFuZ2UgdGFibGUgZW50cnkgcmVmZXJlbmNlCitleHBsYWluICh2ZXJi b3NlLCBjb3N0cyBvZmYpCitzZWxlY3QgMSBmcm9tIChzZWxlY3QgeC4qIGZyb20gc2ogeCwg c2ogeSB3aGVyZSB4LmEgPSB5LmEpIHEsCisgIGxhdGVyYWwgZ2VuZXJhdGVfc2VyaWVzKDEs IHEuYSkgZ3MoaSk7CisKK2V4cGxhaW4gKHZlcmJvc2UsIGNvc3RzIG9mZikKK3NlbGVjdCAx IGZyb20gKHNlbGVjdCB5LiogZnJvbSBzaiB4LCBzaiB5IHdoZXJlIHguYSA9IHkuYSkgcSwK KyAgbGF0ZXJhbCBnZW5lcmF0ZV9zZXJpZXMoMSwgcS5hKSBncyhpKTsKKworLS0gVGVzdCB0 aGF0IGEgbm9uLUVDLWRlcml2ZWQgam9pbiBjbGF1c2UgaXMgcHJvY2Vzc2VkIGNvcnJlY3Rs eS4gVXNlIGFuCistLSBvdXRlciBqb2luIHNvIHRoYXQgd2UgY2FuJ3QgZm9ybSBhbiBFQy4K K2V4cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0ICogZnJvbSBzaiBwIGpvaW4gc2ogcSBvbiBw LmEgPSBxLmEKKyAgbGVmdCBqb2luIHNqIHIgb24gcC5hICsgcS5hID0gci5hOworCistLSBG SVhNRSB0aGlzIGNvbnN0YW50IGZhbHNlIGZpbHRlciBkb2Vzbid0IGxvb2sgZ29vZC4gU2hv dWxkIHdlIG1lcmdlCistLSBlcXVpdmFsZW5jZSBjbGFzc2VzPworZXhwbGFpbiAoY29zdHMg b2ZmKQorc2VsZWN0ICogZnJvbSBzaiBwLCBzaiBxIHdoZXJlIHAuYSA9IHEuYSBhbmQgcC5i ID0gMSBhbmQgcS5iID0gMjsKKworLS0gQ2hlY2sgdGhhdCBhdHRyX25lZWRlZCBpcyB1cGRh dGVkIGNvcnJlY3RseSBhZnRlciBzZWxmLWpvaW4gcmVtb3ZhbC4gSW4gdGhpcworLS0gdGVz dCwgdGhlIGpvaW4gb2YgajEgd2l0aCBqMiBpcyByZW1vdmVkLiBrMS5iIGlzIHJlcXVpcmVk IGF0IGVpdGhlciBqMSBvciBqMi4KKy0tIElmIHRoaXMgaW5mbyBpcyBsb3N0LCBqb2luIHRh cmdldGxpc3QgZm9yIChrMSwgazIpIHdpbGwgbm90IGNvbnRhaW4gazEuYi4KKy0tIFVzZSBp bmRleCBzY2FuIGZvciBrMSBzbyB0aGF0IHdlIGRvbid0IGdldCAnYicgZnJvbSBwaHlzaWNh bCB0bGlzdCB1c2VkIGZvcgorLS0gc2Vxc2Nhbi4gQWxzbyBkaXNhYmxlIHJlb3JkZXJpbmcg b2Ygam9pbnMgYmVjYXVzZSB0aGlzIHRlc3QgZGVwZW5kcyBvbiBhCistLSBwYXJ0aWN1bGFy IGpvaW4gdHJlZS4KK2NyZWF0ZSB0YWJsZSBzayAoYSBpbnQsIGIgaW50KTsKK2NyZWF0ZSBp bmRleCBvbiBzayhhKTsKK3NldCBqb2luX2NvbGxhcHNlX2xpbWl0IHRvIDE7CitzZXQgZW5h YmxlX3NlcXNjYW4gdG8gb2ZmOworZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3QgMSBmcm9t CisJKHNrIGsxIGpvaW4gc2sgazIgb24gazEuYSA9IGsyLmEpCisJam9pbiAoc2ogajEgam9p biBzaiBqMiBvbiBqMS5hID0gajIuYSkgb24gajEuYiA9IGsxLmI7CitleHBsYWluIChjb3N0 cyBvZmYpIHNlbGVjdCAxIGZyb20KKwkoc2sgazEgam9pbiBzayBrMiBvbiBrMS5hID0gazIu YSkKKwlqb2luIChzaiBqMSBqb2luIHNqIGoyIG9uIGoxLmEgPSBqMi5hKSBvbiBqMi5iID0g azEuYjsKK3Jlc2V0IGpvaW5fY29sbGFwc2VfbGltaXQ7CityZXNldCBlbmFibGVfc2Vxc2Nh bjsKKworc2V0IHNlbGZfam9pbl9zZWFyY2hfbGltaXQgdG8gMTsKK2V4cGxhaW4gKGNvc3Rz IG9mZikgLS0gTm8gb25lIHNlbGYgam9pbiBzaG91bGQgYmUgY29sbGFwc2VkCisgIHNlbGVj dCBqMS4qIGZyb20gc2ogajEsIHNqIGoyLCBzaiBqMyB3aGVyZSAoajEuYSA9IGoyLmEpIGFu ZCAoajIuYSA9IGozLmEpOworc2V0IHNlbGZfam9pbl9zZWFyY2hfbGltaXQgdG8gMjsKK2V4 cGxhaW4gKGNvc3RzIG9mZikgLS0gQ29sbGFwc2Ugb25lIHNlbGYgam9pbgorICBzZWxlY3Qg ajEuKiBmcm9tIHNqIGoxLCBzaiBqMiwgc2ogajMgd2hlcmUgKGoxLmEgPSBqMi5hKSBhbmQg KGoyLmEgPSBqMy5hKTsKK3NldCBzZWxmX2pvaW5fc2VhcmNoX2xpbWl0IHRvIDM7CitleHBs YWluIChjb3N0cyBvZmYpIC0tIENvbGxhcHNlIGJvdGggc2VsZiBqb2lucworICBzZWxlY3Qg ajEuKiBmcm9tIHNqIGoxLCBzaiBqMiwgc2ogajMgd2hlcmUgKGoxLmEgPSBqMi5hKSBhbmQg KGoyLmEgPSBqMy5hKTsKK3Jlc2V0IHNlbGZfam9pbl9zZWFyY2hfbGltaXQ7CisKKy0tIENo ZWNrIHRoYXQgY2xhdXNlcyBmcm9tIHRoZSBqb2luIGZpbHRlciBsaXN0IGlzIG5vdCBsb3N0 IG9uIHRoZSBzZWxmLWpvaW4gcmVtb3ZhbAorQ1JFQVRFIFRBQkxFIGVtcDEgKCBpZCBTRVJJ QUwgUFJJTUFSWSBLRVkgTk9UIE5VTEwsIGNvZGUgaW50KTsKK2V4cGxhaW4gKHZlcmJvc2Us IGNvc3RzIG9mZikKK1NFTEVDVCAqIEZST00gZW1wMSBlMSwgZW1wMSBlMiBXSEVSRSBlMS5p ZCA9IGUyLmlkIEFORCBlMi5jb2RlIDw+IGUxLmNvZGU7CisKKy0tIFdlIGNhbiByZW1vdmUg dGhlIGpvaW4gZXZlbiBpZiB3ZSBmaW5kIHRoZSBqb2luIGNhbid0IGR1cGxpY2F0ZSByb3dz IGFuZAorLS0gdGhlIGJhc2UgcXVhbHMgb2YgZWFjaCBzaWRlIGFyZSBkaWZmZXJlbnQuICBJ biB0aGUgZm9sbG93aW5nIGNhc2Ugd2UgZW5kIHVwCistLSBtb3ZpbmcgcXVhbHMgb3ZlciB0 byBzMSB0byBtYWtlIGl0IHNvIGl0IGNhbid0IG1hdGNoIGFueSByb3dzLgorY3JlYXRlIHRh YmxlIHNsKGEgaW50LCBiIGludCwgYyBpbnQpOworY3JlYXRlIHVuaXF1ZSBpbmRleCBvbiBz bChhLCBiKTsKK3ZhY3V1bSBhbmFseXplIHNsOworCistLSBCb3RoIHNpZGVzIGFyZSB1bmlx dWUsIGJ1dCBiYXNlIHF1YWxzIGFyZSBkaWZmZXJlbnQKK2V4cGxhaW4gKGNvc3RzIG9mZikK K3NlbGVjdCAqIGZyb20gc2wgdDEsIHNsIHQyIHdoZXJlIHQxLmEgPSB0Mi5hIGFuZCB0MS5i ID0gMSBhbmQgdDIuYiA9IDI7CisKKy0tIENoZWNrIE51bGxUZXN0IGluIGJhc2VyZXN0cmlj dGluZm8gbGlzdAorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzbCB0MSwg c2wgdDIKK3doZXJlIHQxLmEgPSB0Mi5hIGFuZCB0MS5iID0gMSBhbmQgdDIuYiA9IDIKKyAg YW5kIHQxLmMgSVMgTk9UIE5VTEwgYW5kIHQyLmMgSVMgTk9UIE5VTEwKKyAgYW5kIHQyLmIg SVMgTk9UIE5VTEwgYW5kIHQxLmIgSVMgTk9UIE5VTEwKKyAgYW5kIHQxLmEgSVMgTk9UIE5V TEwgYW5kIHQyLmEgSVMgTk9UIE5VTEw7CitleHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYp CitzZWxlY3QgKiBmcm9tIHNsIHQxLCBzbCB0Mgord2hlcmUgdDEuYiA9IHQyLmIgYW5kIHQy LmEgPSAzIGFuZCB0MS5hID0gMworICBhbmQgdDEuYyBJUyBOT1QgTlVMTCBhbmQgdDIuYyBJ UyBOT1QgTlVMTAorICBhbmQgdDIuYiBJUyBOT1QgTlVMTCBhbmQgdDEuYiBJUyBOT1QgTlVM TAorICBhbmQgdDEuYSBJUyBOT1QgTlVMTCBhbmQgdDIuYSBJUyBOT1QgTlVMTDsKKworLS0g Sm9pbiBxdWFsIGlzbid0IG1lcmdlam9pbmFibGUsIGJ1dCBpbm5lciBpcyB1bmlxdWUuCitl eHBsYWluIChDT1NUUyBPRkYpCitTRUxFQ1QgbjIuYSBGUk9NIHNqIG4xLCBzaiBuMiBXSEVS RSBuMS5hIDw+IG4yLmEgQU5EIG4yLmEgPSAxOworZXhwbGFpbiAoQ09TVFMgT0ZGKQorU0VM RUNUICogRlJPTQorCShTRUxFQ1QgbjIuYSBGUk9NIHNqIG4xLCBzaiBuMiBXSEVSRSBuMS5h IDw+IG4yLmEpIHEwLCBzbAorV0hFUkUgcTAuYSA9IDE7CisKKy0tCistLS0tIE9ubHkgb25l IHNpZGUgaXMgdW5xaXVlCistLXNlbGVjdCAqIGZyb20gc2wgdDEsIHNsIHQyIHdoZXJlIHQx LmEgPSB0Mi5hIGFuZCB0MS5iID0gMTsKKy0tc2VsZWN0ICogZnJvbSBzbCB0MSwgc2wgdDIg d2hlcmUgdDEuYSA9IHQyLmEgYW5kIHQyLmIgPSAxOworLS0KKy0tLS0gU2V2ZXJhbCB1bmlx dWVzIGluZGV4ZXMgbWF0Y2gsIGFuZCB3ZSBzZWxlY3QgYSBkaWZmZXJlbnQgb25lCistLS0t IGZvciBlYWNoIHNpZGUsIHNvIHRoZSBqb2luIGlzIG5vdCByZW1vdmVkCistLWNyZWF0ZSB0 YWJsZSBzbShhIGludCB1bmlxdWUsIGIgaW50IHVuaXF1ZSwgYyBpbnQgdW5pcXVlKTsKKy0t ZXhwbGFpbiAoY29zdHMgb2ZmKQorLS1zZWxlY3QgKiBmcm9tIHNtIG0sIHNtIG4gd2hlcmUg bS5hID0gbi5iIGFuZCBtLmMgPSBuLmM7CistLWV4cGxhaW4gKGNvc3RzIG9mZikKKy0tc2Vs ZWN0ICogZnJvbSBzbSBtLCBzbSBuIHdoZXJlIG0uYSA9IG4uYyBhbmQgbS5iID0gbi5iOwor LS1leHBsYWluIChjb3N0cyBvZmYpCistLXNlbGVjdCAqIGZyb20gc20gbSwgc20gbiB3aGVy ZSBtLmMgPSBuLmIgYW5kIG0uYSA9IG4uYTsKKworLS0gQ2hlY2sgb3B0aW1pemF0aW9uIGRp c2FibGluZyBpZiBpdCB3aWxsIHZpb2xhdGUgc3BlY2lhbCBqb2luIGNvbmRpdGlvbnMuCist LSBUd28gaWRlbnRpY2FsIGpvaW5lZCByZWxhdGlvbnMgc2F0aXNmaWVzIHNlbGYgam9pbiBy ZW1vdmFsIGNvbmRpdGlvbnMgYnV0CistLSBzdGF5IGluIGRpZmZlcmVudCBzcGVjaWFsIGpv aW4gaW5mb3MuCitDUkVBVEUgVEFCTEUgc2pfdDEgKGlkIHNlcmlhbCwgYSBpbnQpOworQ1JF QVRFIFRBQkxFIHNqX3QyIChpZCBzZXJpYWwsIGEgaW50KTsKK0NSRUFURSBUQUJMRSBzal90 MyAoaWQgc2VyaWFsLCBhIGludCk7CitDUkVBVEUgVEFCTEUgc2pfdDQgKGlkIHNlcmlhbCwg YSBpbnQpOworCitDUkVBVEUgVU5JUVVFIElOREVYIE9OIHNqX3QzIFVTSU5HIGJ0cmVlIChh LGlkKTsKK0NSRUFURSBVTklRVUUgSU5ERVggT04gc2pfdDIgVVNJTkcgYnRyZWUgKGlkKTsK KworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTSBzal90MQorSk9JTiAoCisJ U0VMRUNUIHNqX3QyLmlkIEFTIGlkIEZST00gc2pfdDIKKwlXSEVSRSBFWElTVFMKKwkJKAor CQlTRUxFQ1QgVFJVRSBGUk9NIHNqX3QzLHNqX3Q0IFdIRVJFIHNqX3QzLmEgPSAxIEFORCBz al90My5pZCA9IHNqX3QyLmlkCisJCSkKKwkpIHQydDN0NAorT04gc2pfdDEuaWQgPSB0MnQz dDQuaWQKK0pPSU4gKAorCVNFTEVDVCBzal90Mi5pZCBBUyBpZCBGUk9NIHNqX3QyCisJV0hF UkUgRVhJU1RTCisJCSgKKwkJU0VMRUNUIFRSVUUgRlJPTSBzal90Myxzal90NCBXSEVSRSBz al90My5hID0gMSBBTkQgc2pfdDMuaWQgPSBzal90Mi5pZAorCQkpCisJKSBfdDJ0M3Q0CitP TiBzal90MS5pZCA9IF90MnQzdDQuaWQ7CisKKy0tCistLSBUZXN0IFJvd01hcmtzLXJlbGF0 ZWQgY29kZQorLS0KKworLS0gVE9ETzogV2h5IHRoaXMgc2VsZWN0IHJldHVybnMgdHdvIGNv aWVzIG9mIGN0aWQgZmllbGQ/IFNob3VsZCB3ZSBmaXggaXQ/CitFWFBMQUlOIChDT1NUUyBP RkYpIC0tIEJvdGggc2lkZXMgaGF2ZSBleHBsaWNpdCBMb2NrUm93cyBtYXJrcworU0VMRUNU IGExLmEgRlJPTSBzaiBhMSxzaiBhMiBXSEVSRSAoYTEuYT1hMi5hKSBGT1IgVVBEQVRFOwor CitFWFBMQUlOIChDT1NUUyBPRkYpIC0tIEEgUm93TWFyayBleGlzdHMgZm9yIHRoZSB0YWJs ZSBiZWluZyBrZXB0CitVUERBVEUgc2ogc3EgU0VUIGIgPSAxIEZST00gc2ogYXMgc3ogV0hF UkUgc3EuYSA9IHN6LmE7CisKK0NSRUFURSBSVUxFIHNqX2RlbF9ydWxlIEFTIE9OIERFTEVU RSBUTyBzagorICBETyBJTlNURUFECisgICAgVVBEQVRFIHNqIFNFVCBhID0gMSBXSEVSRSBh ID0gb2xkLmE7CitFWFBMQUlOIChDT1NUUyBPRkYpIERFTEVURSBGUk9NIHNqOyAtLSBBIFJv d01hcmsgZXhpc3RzIGZvciB0aGUgdGFibGUgYmVpbmcgZHJvcHBlZAorRFJPUCBSVUxFIHNq X2RlbF9ydWxlIE9OIHNqIENBU0NBREU7CisKK3Jlc2V0IGVuYWJsZV9oYXNoam9pbjsKK3Jl c2V0IGVuYWJsZV9tZXJnZWpvaW47CisKIC0tCiAtLSBUZXN0IGhpbnRzIGdpdmVuIG9uIGlu Y29ycmVjdCBjb2x1bW4gcmVmZXJlbmNlcyBhcmUgdXNlZnVsCiAtLQpkaWZmIC0tZ2l0IGEv c3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QgYi9zcmMvdG9vbHMvcGdpbmRlbnQv dHlwZWRlZnMubGlzdAppbmRleCBhNGE0ZTM1NmU1Li5jNjBiYjEyNDUxIDEwMDY0NAotLS0g YS9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdAorKysgYi9zcmMvdG9vbHMvcGdp bmRlbnQvdHlwZWRlZnMubGlzdApAQCAtMzYyLDYgKzM2Miw3IEBAIENhdGFsb2dJZAogQ2F0 YWxvZ0lkTWFwRW50cnkKIENhdGFsb2dJbmRleFN0YXRlCiBDaGFuZ2VWYXJOb2Rlc19jb250 ZXh0CitDaGFuZ2VWYXJub0NvbnRleHQKIENoZWNrUG9pbnQKIENoZWNrUG9pbnRTdG10CiBD aGVja3BvaW50U3RhdHNEYXRhCkBAIC0zNzY4LDYgKzM3NjksNyBAQCB1bmljb2RlU3R5bGVD b2x1bW5Gb3JtYXQKIHVuaWNvZGVTdHlsZUZvcm1hdAogdW5pY29kZVN0eWxlUm93Rm9ybWF0 CiB1bmljb2RlX2xpbmVzdHlsZQorVW5pcXVlUmVsSW5mbwogdW5pdF9jb252ZXJzaW9uCiB1 bmxvZ2dlZF9yZWxhdGlvbl9lbnRyeQogdXRmX2xvY2FsX2NvbnZlcnNpb25fZnVuYwotLSAK Mi4zNC4xCgo= --------------wiZ6WQKIx0zrwAxZucjNBijv--