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 1o6uto-0006gg-13 for pgsql-hackers@arkaria.postgresql.org; Thu, 30 Jun 2022 14:12:05 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1o6utk-0008KV-Vx for pgsql-hackers@arkaria.postgresql.org; Thu, 30 Jun 2022 14:12:00 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1o6utk-0008KK-9y for pgsql-hackers@lists.postgresql.org; Thu, 30 Jun 2022 14:12:00 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1o6utf-00031d-A6 for pgsql-hackers@lists.postgresql.org; Thu, 30 Jun 2022 14:11:59 +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 EA20421C0225; Thu, 30 Jun 2022 17:11:52 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1656598313; bh=iTr4q5MEcaAQKUWtSIxsK8ciEknaN9/JZ4vpU+x1XFM=; h=Date:Subject:To:Cc:References:From:In-Reply-To; b=UG5rLtp6ChPzNpEsafrA/WmV6uW5viEWqvuTQ9fOwDNf8tqr89dUoDRNHc9cTc9S7 95yuF8XYfzeXrgva0yAjsq4zBNw++QUBY8tfTVa5DtIMIcCjjcLPljN9u7rnyx7mow x9Gv6snqMPp56g1ZwRqUKzWcLLz1HVWYrkty7rAo= Content-Type: multipart/mixed; boundary="------------GcNEQILBO0PR5pXEPEcBnaL1" Message-ID: Date: Thu, 30 Jun 2022 19:11:51 +0500 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:91.0) Gecko/20100101 Thunderbird/91.10.0 Subject: Re: Removing unneeded self joins Content-Language: en-US To: Ronan Dunklau , Greg Stark Cc: Andres Freund , Laurenz Albe , Hywel Carver , PostgreSQL Hackers References: <64486b0b-0404-e39e-322d-0801154901f3@postgrespro.ru> <2537176.Lt9SDvczpP@aivenronan> <13021914.uLZWGnKmhe@aivenronan> From: Andrey Lepikhov Organization: Postgres Professional In-Reply-To: <13021914.uLZWGnKmhe@aivenronan> 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. --------------GcNEQILBO0PR5pXEPEcBnaL1 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 19/5/2022 16:47, Ronan Dunklau wrote: > I'll take a look at that one. New version of the patch, rebased on current master: 1. pgindent over the patch have passed. 2. number of changed files is reduced. 3. Some documentation and comments is added. -- regards, Andrey Lepikhov Postgres Professional --------------GcNEQILBO0PR5pXEPEcBnaL1 Content-Type: text/plain; charset=UTF-8; name="v35-0001-Remove-self-joins.patch" Content-Disposition: attachment; filename="v35-0001-Remove-self-joins.patch" Content-Transfer-Encoding: base64 RnJvbSA5Y2U3MWYxZDBmZmVmYTlkNzdlZGZhMzBmYzE4OWJjMDQyNWViYmJlIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmV5IFYuIExlcGlraG92IiA8YS5sZXBpa2hv dkBwb3N0Z3Jlc3Byby5ydT4KRGF0ZTogVGh1LCAxNSBKdWwgMjAyMSAxNToyNjoxMyArMDMw MApTdWJqZWN0OiBbUEFUQ0hdIFJlbW92ZSBzZWxmLWpvaW5zLgoKQSBTZWxmIEpvaW4gUmVt b3ZhbCAoU0pSKSBmZWF0dXJlIHJlbW92ZXMgaW5uZXIgam9pbiBvZiBwbGFuZSB0YWJsZSB0 byBpdHNlbGYKaW4gYSBxdWVyeSBwbGFuIGlmIGNhbiBiZSBwcm92ZWQgdGhhdCB0aGUgam9p biBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIHNjYW4uClRoZSBwcm9vZiBiYXNlZCBvbiBpbm5l cnJlbF9pc191bmlxdWUgbWFjaGluZXJ5LgoKV2UgY2FuIHJlbW92ZSBhIHNlbGYtam9pbiB3 aGVuIGZvciBlYWNoIG91dGVyIHJvdzoKMS4gQXQgbW9zdCBvbmUgaW5uZXIgcm93IG1hdGNo ZXMgdGhlIGpvaW4gY2xhdXNlcy4KMi4gSWYgdGhlIGpvaW4gdGFyZ2V0IGxpc3QgY29udGFp bnMgYW55IGlubmVyIHZhcnMsIGFuIGlubmVyIHJvdwptdXN0IGJlIChwaHlzaWNhbGx5KSB0 aGUgc2FtZSByb3cgYXMgdGhlIG91dGVyIG9uZS4KCkluIHRoaXMgcGF0Y2ggd2UgdXNlIFJv d2xleSdzIFsxXSBhcHByb2FjaCB0byBpZGVudGlmeSBhIHNlbGYtam9pbjoKMS4gQ29sbGVj dCBhbGwgbWVyZ2Vqb2luYWJsZSBqb2luIHF1YWxzIHdoaWNoIGxvb2sgbGlrZSBhLnggPSBi LngKMi4gQ2hlY2sgaW5uZXJyZWxfaXNfdW5pcXVlKCkgZm9yIHRoZSBxdWFsIGxpc3QgZnJv bSAoMSkuIElmIGl0CnJldHVybnMgdHJ1ZSwgdGhlbiBvdXRlciByb3cgbWF0Y2hlcyBvbmx5 IHRoZSBzYW1lIHJvdyBmcm9tIHRoZSBpbm5lcgpyZWxhdGlvbi4KMy4gSWYgdW5pcXVlbmVz cyBvZiBvdXRlciByZWxhdGlvbiBkZWR1Y2VzIGZyb20gYmFzZXJlc3RyaWN0aW5mbyBjbGF1 c2UgbGlrZQoneD1jb25zdCcgb24gdW5pcXVlIGZpZWxkKHMpLCBjaGVjayB0aGF0IGlubmVy IGhhcyB0aGUgc2FtZSBjbGF1c2Ugd2l0aCB0aGUKc2FtZSBjb25zdGFudChzKS4KNC4gQ29t cGFyZSBSb3dNYXJrcyBvZiBpbm5lciBhbmQgb3V0ZXIgcmVsYXRpb25zLiBUaGV5IG11c3Qg aGF2ZSB0aGUgc2FtZQpzdHJlbmd0aC4KClNvbWUgcmVncmVzc2lvbiB0ZXN0cyBjaGFuZ2Vk IGR1ZSB0byBzZWxmLWpvaW4gcmVtb3ZhbCBsb2dpYy4KClsxXSBodHRwczovL3d3dy5wb3N0 Z3Jlc3FsLm9yZy9tZXNzYWdlLWlkL3Jhdy9DQUFwSER2cGdnbkZNQzR5UC1qVU83UEtOJTNE ZlhlRXJXNWJPeGlzdkowSHZrSFFFWSUzRFd3JTQwbWFpbC5nbWFpbC5jb20KLS0tCiBkb2Mv c3JjL3NnbWwvY29uZmlnLnNnbWwgICAgICAgICAgICAgICAgICB8ICAgMTYgKwogc3JjL2Jh Y2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYyAgICAgfCAgIDM5ICsKIHNyYy9iYWNr ZW5kL29wdGltaXplci9wbGFuL2FuYWx5emVqb2lucy5jIHwgMTA0NSArKysrKysrKysrKysr KysrKysrKy0KIHNyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3BsYW5tYWluLmMgICAgIHwg ICAgNSArCiBzcmMvYmFja2VuZC91dGlscy9taXNjL2d1Yy5jICAgICAgICAgICAgICB8ICAg MTAgKwogc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BhdGhzLmggICAgICAgICAgICAgfCAgICAz ICsKIHNyYy9pbmNsdWRlL29wdGltaXplci9wbGFubWFpbi5oICAgICAgICAgIHwgICAgNiAr CiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2VxdWl2Y2xhc3Mub3V0ICB8ICAgMzIgKwog c3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dCAgICAgICAgfCAgNjg2ICsrKysr KysrKysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91dCAgICB8 ICAgIDMgKy0KIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2VxdWl2Y2xhc3Muc3FsICAgICAgIHwg ICAxNiArCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbCAgICAgICAgICAgICB8ICAz MDUgKysrKysrCiBzcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdCAgICAgICAgICB8 ICAgIDIgKwogMTMgZmlsZXMgY2hhbmdlZCwgMjE0MiBpbnNlcnRpb25zKCspLCAyNiBkZWxl dGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvY29uZmlnLnNnbWwgYi9kb2Mv c3JjL3NnbWwvY29uZmlnLnNnbWwKaW5kZXggNDg0NzhiMTAyNC4uMjIyNjExN2M2MiAxMDA2 NDQKLS0tIGEvZG9jL3NyYy9zZ21sL2NvbmZpZy5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9j b25maWcuc2dtbApAQCAtNTI4Nyw2ICs1Mjg3LDIyIEBAIEFOWSA8cmVwbGFjZWFibGUgY2xh c3M9InBhcmFtZXRlciI+bnVtX3N5bmM8L3JlcGxhY2VhYmxlPiAoIDxyZXBsYWNlYWJsZSBj bGFzcz0iCiAgICAgICA8L2xpc3RpdGVtPgogICAgICA8L3Zhcmxpc3RlbnRyeT4KIAorICAg ICA8dmFybGlzdGVudHJ5IGlkPSJndWMtZW5hYmxlX3NlbGZfam9pbl9yZW1vdmFsIiB4cmVm bGFiZWw9ImVuYWJsZV9zZWxmX2pvaW5fcmVtb3ZhbCI+CisgICAgICA8dGVybT48dmFybmFt ZT5lbmFibGVfc2VsZl9qb2luX3JlbW92YWw8L3Zhcm5hbWU+ICg8dHlwZT5ib29sZWFuPC90 eXBlPikKKyAgICAgIDxpbmRleHRlcm0+CisgICAgICAgPHByaW1hcnk+PHZhcm5hbWU+ZW5h YmxlX3NlbGZfam9pbl9yZW1vdmFsPC92YXJuYW1lPiBjb25maWd1cmF0aW9uIHBhcmFtZXRl cjwvcHJpbWFyeT4KKyAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgPC90ZXJtPgorICAgICAg PGxpc3RpdGVtPgorICAgICAgIDxwYXJhPgorICAgICAgICBFbmFibGVzIG9yIGRpc2FibGVz IHRoZSBxdWVyeSBwbGFubmVyJ3Mgb3B0aW1pemF0aW9uIHdoaWNoIGFuYWx5c2VzCisgICAg ICAgIHF1ZXJ5IHRyZWUgYW5kIHJlcGxhY2VzIHNlbGYgam9pbnMgd2l0aCBzZW1hbnRpY2Fs bHkgZXF1aXZhbGVudCBzaW5nbGUKKyAgICAgICAgc2NhbnMuIFRha2UgaW50byBjb25zaWRl cmF0aW9uIG9ubHkgcGxhaW4gdGFibGVzLgorICAgICAgICBUaGUgZGVmYXVsdCBpcyA8bGl0 ZXJhbD5vbjwvbGl0ZXJhbD4uCisgICAgICAgPC9wYXJhPgorICAgICAgPC9saXN0aXRlbT4K KyAgICAgPC92YXJsaXN0ZW50cnk+CisKICAgICAgPHZhcmxpc3RlbnRyeSBpZD0iZ3VjLWVu YWJsZS1zZXFzY2FuIiB4cmVmbGFiZWw9ImVuYWJsZV9zZXFzY2FuIj4KICAgICAgIDx0ZXJt Pjx2YXJuYW1lPmVuYWJsZV9zZXFzY2FuPC92YXJuYW1lPiAoPHR5cGU+Ym9vbGVhbjwvdHlw ZT4pCiAgICAgICA8aW5kZXh0ZXJtPgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1p emVyL3BhdGgvaW5keHBhdGguYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2luZHhw YXRoLmMKaW5kZXggMGVmNzBhZDdmMS4uMmViMDVjNzljZSAxMDA2NDQKLS0tIGEvc3JjL2Jh Y2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYworKysgYi9zcmMvYmFja2VuZC9vcHRp bWl6ZXIvcGF0aC9pbmR4cGF0aC5jCkBAIC0zNDk4LDggKzM0OTgsMjQgQEAgYm9vbAogcmVs YXRpb25faGFzX3VuaXF1ZV9pbmRleF9mb3IoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdElu Zm8gKnJlbCwKIAkJCQkJCQkgIExpc3QgKnJlc3RyaWN0bGlzdCwKIAkJCQkJCQkgIExpc3Qg KmV4cHJsaXN0LCBMaXN0ICpvcHJsaXN0KQoreworCXJldHVybiByZWxhdGlvbl9oYXNfdW5p cXVlX2luZGV4X2V4dChyb290LCByZWwsIHJlc3RyaWN0bGlzdCwKKwkJCQkJCQkJCQkgZXhw cmxpc3QsIG9wcmxpc3QsIE5VTEwpOworfQorCisvKgorICogcmVsYXRpb25faGFzX3VuaXF1 ZV9pbmRleF9leHQKKyAqIGlmIGV4dHJhX2NsYXVzZXMgaXNuJ3QgTlVMTCwgcmV0dXJuIGJh c2VyZXN0cmljdGluZm8gY2xhdXNlcyB3aGljaCB3ZXJlCisgKiB1c2VkIHRvIGRlcml2ZSB1 bmlxdWVuZXNzLgorICovCitib29sCityZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2V4dChQ bGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAorCQkJCQkJCSAgTGlzdCAqcmVz dHJpY3RsaXN0LAorCQkJCQkJCSAgTGlzdCAqZXhwcmxpc3QsIExpc3QgKm9wcmxpc3QsCisJ CQkJCQkJICBMaXN0ICoqZXh0cmFfY2xhdXNlcykKIHsKIAlMaXN0Q2VsbCAgICppYzsKKwlM aXN0CSAgICpleHByczsKIAogCUFzc2VydChsaXN0X2xlbmd0aChleHBybGlzdCkgPT0gbGlz dF9sZW5ndGgob3BybGlzdCkpOwogCkBAIC0zNTU0LDYgKzM1NzAsOCBAQCByZWxhdGlvbl9o YXNfdW5pcXVlX2luZGV4X2ZvcihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVs LAogCQlJbmRleE9wdEluZm8gKmluZCA9IChJbmRleE9wdEluZm8gKikgbGZpcnN0KGljKTsK IAkJaW50CQkJYzsKIAorCQlleHBycyA9IE5JTDsKKwogCQkvKgogCQkgKiBJZiB0aGUgaW5k ZXggaXMgbm90IHVuaXF1ZSwgb3Igbm90IGltbWVkaWF0ZWx5IGVuZm9yY2VkLCBvciBpZiBp dCdzCiAJCSAqIGEgcGFydGlhbCBpbmRleCB0aGF0IGRvZXNuJ3QgbWF0Y2ggdGhlIHF1ZXJ5 LCBpdCdzIHVzZWxlc3MgaGVyZS4KQEAgLTM2MDEsNiArMzYxOSwyMyBAQCByZWxhdGlvbl9o YXNfdW5pcXVlX2luZGV4X2ZvcihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVs LAogCQkJCWlmIChtYXRjaF9pbmRleF90b19vcGVyYW5kKHJleHByLCBjLCBpbmQpKQogCQkJ CXsKIAkJCQkJbWF0Y2hlZCA9IHRydWU7IC8qIGNvbHVtbiBpcyB1bmlxdWUgKi8KKworCQkJ CQlpZiAoYm1zX21lbWJlcnNoaXAocmluZm8tPmNsYXVzZV9yZWxpZHMpID09IEJNU19TSU5H TEVUT04pCisJCQkJCXsKKwkJCQkJCU1lbW9yeUNvbnRleHQgb2xkTWVtQ3R4ID0KKwkJCQkJ CU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhyb290LT5wbGFubmVyX2N4dCk7CisKKwkJCQkJCS8q CisJCQkJCQkgKiBBZGQgZmlsdGVyIGNsYXVzZSBpbnRvIGEgbGlzdCBhbGxvd2luZyBjYWxs ZXIgdG8KKwkJCQkJCSAqIGtub3cgaWYgdW5pcXVpbmVzcyBoYXZlIG1hZGUgbm90IG9ubHkg Ynkgam9pbgorCQkJCQkJICogY2xhdXNlcy4KKwkJCQkJCSAqLworCQkJCQkJQXNzZXJ0KGJt c19pc19lbXB0eShyaW5mby0+bGVmdF9yZWxpZHMpIHx8CisJCQkJCQkJICAgYm1zX2lzX2Vt cHR5KHJpbmZvLT5yaWdodF9yZWxpZHMpKTsKKwkJCQkJCWV4cHJzID0gbGFwcGVuZChleHBy cywgcmluZm8pOworCQkJCQkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZE1lbUN0eCk7CisJ CQkJCX0KKwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CkBAIC0zNjQzLDcgKzM2NzgsMTEg QEAgcmVsYXRpb25faGFzX3VuaXF1ZV9pbmRleF9mb3IoUGxhbm5lckluZm8gKnJvb3QsIFJl bE9wdEluZm8gKnJlbCwKIAogCQkvKiBNYXRjaGVkIGFsbCBrZXkgY29sdW1ucyBvZiB0aGlz IGluZGV4PyAqLwogCQlpZiAoYyA9PSBpbmQtPm5rZXljb2x1bW5zKQorCQl7CisJCQlpZiAo ZXh0cmFfY2xhdXNlcykKKwkJCQkqZXh0cmFfY2xhdXNlcyA9IGV4cHJzOwogCQkJcmV0dXJu IHRydWU7CisJCX0KIAl9CiAKIAlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9zcmMvYmFj a2VuZC9vcHRpbWl6ZXIvcGxhbi9hbmFseXplam9pbnMuYyBiL3NyYy9iYWNrZW5kL29wdGlt aXplci9wbGFuL2FuYWx5emVqb2lucy5jCmluZGV4IDMzN2Y0NzBkNTguLmI0NDUyNmIxYTEg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2FuYWx5emVqb2lucy5j CisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2FuYWx5emVqb2lucy5jCkBAIC0y Miw2ICsyMiw3IEBACiAgKi8KICNpbmNsdWRlICJwb3N0Z3Jlcy5oIgogCisjaW5jbHVkZSAi Y2F0YWxvZy9wZ19jbGFzcy5oIgogI2luY2x1ZGUgIm5vZGVzL25vZGVGdW5jcy5oIgogI2lu Y2x1ZGUgIm9wdGltaXplci9jbGF1c2VzLmgiCiAjaW5jbHVkZSAib3B0aW1pemVyL2pvaW5p bmZvLmgiCkBAIC0zMiwyMSArMzMsNDAgQEAKICNpbmNsdWRlICJvcHRpbWl6ZXIvdGxpc3Qu aCIKICNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKIAorLyoKKyAqIFVuaXF1ZVJlbElu Zm8gY2FjaGVzIGEgZmFjdCB0aGF0IGEgcmVsYXRpb24gaXMgdW5pcXVlIHdoZW4gYmVpbmcg am9pbmVkCisgKiB0byBvdGhlciByZWxhdGlvbihzKSBzcGVjaWZpZWQgYnkgb3V0ZXJyZWxp ZHMuCisgKiBleHRyYV9jbGF1c2VzIGNvbnRhaW5zIGFkZGl0aW9uYWwgY2xhdXNlcyBmcm9t IGEgYmFzZXJlc3RyaWN0aW5mbyBsaXN0IHRoYXQKKyAqIHdlcmUgdXNlZCB0byBwcm92ZSB1 bmlxdWVuZXNzLiBXZSBjYWNoZSBpdCBmb3IgU0ogY2hlY2tpbmcgcHJvY2VkdXJlOiBTSiBj YW4KKyAqIGJlIHJlbW92ZWQgaWYgb3V0ZXIgcmVsYXRpb24gY29udGFpbnMgc3RyaWN0bHkg dGhlIHNhbWUgc2V0IG9mIGNsYXVzZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IFVuaXF1ZVJl bEluZm8KK3sKKwlSZWxpZHMJCW91dGVycmVsaWRzOworCUxpc3QJICAgKmV4dHJhX2NsYXVz ZXM7Cit9IFVuaXF1ZVJlbEluZm87CisKK2Jvb2wJCWVuYWJsZV9zZWxmX2pvaW5fcmVtb3Zh bDsKKwogLyogbG9jYWwgZnVuY3Rpb25zICovCiBzdGF0aWMgYm9vbCBqb2luX2lzX3JlbW92 YWJsZShQbGFubmVySW5mbyAqcm9vdCwgU3BlY2lhbEpvaW5JbmZvICpzamluZm8pOwogc3Rh dGljIHZvaWQgcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQg cmVsaWQsCi0JCQkJCQkJCSAgUmVsaWRzIGpvaW5yZWxpZHMpOworCQkJCQkJCQkgIFJlbGlk cyBqb2lucmVsaWRzLCBpbnQgc3Vic3RfcmVsaWQpOwogc3RhdGljIExpc3QgKnJlbW92ZV9y ZWxfZnJvbV9qb2lubGlzdChMaXN0ICpqb2lubGlzdCwgaW50IHJlbGlkLCBpbnQgKm5yZW1v dmVkKTsKIHN0YXRpYyBib29sIHJlbF9zdXBwb3J0c19kaXN0aW5jdG5lc3MoUGxhbm5lcklu Zm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCk7CiBzdGF0aWMgYm9vbCByZWxfaXNfZGlzdGlu Y3RfZm9yKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCi0JCQkJCQkJCUxp c3QgKmNsYXVzZV9saXN0KTsKKwkJCQkJCQkJTGlzdCAqY2xhdXNlX2xpc3QsIExpc3QgKipl eHRyYV9jbGF1c2VzKTsKIHN0YXRpYyBPaWQJZGlzdGluY3RfY29sX3NlYXJjaChpbnQgY29s bm8sIExpc3QgKmNvbG5vcywgTGlzdCAqb3BpZHMpOwogc3RhdGljIGJvb2wgaXNfaW5uZXJy ZWxfdW5pcXVlX2ZvcihQbGFubmVySW5mbyAqcm9vdCwKIAkJCQkJCQkJICAgUmVsaWRzIGpv aW5yZWxpZHMsCiAJCQkJCQkJCSAgIFJlbGlkcyBvdXRlcnJlbGlkcywKIAkJCQkJCQkJICAg UmVsT3B0SW5mbyAqaW5uZXJyZWwsCiAJCQkJCQkJCSAgIEpvaW5UeXBlIGpvaW50eXBlLAot CQkJCQkJCQkgICBMaXN0ICpyZXN0cmljdGxpc3QpOworCQkJCQkJCQkgICBMaXN0ICpyZXN0 cmljdGxpc3QsCisJCQkJCQkJCSAgIExpc3QgKipleHRyYV9jbGF1c2VzKTsKK3N0YXRpYyB2 b2lkIGNoYW5nZV9yaW5mbyhSZXN0cmljdEluZm8gKnJpbmZvLCBJbmRleCBmcm9tLCBJbmRl eCB0byk7CitzdGF0aWMgQml0bWFwc2V0ICpjaGFuZ2VfcmVsaWQoUmVsaWRzIHJlbGlkcywg SW5kZXggb2xkSWQsIEluZGV4IG5ld0lkKTsKK3N0YXRpYyB2b2lkIGNoYW5nZV92YXJubyhF eHByICpleHByLCBJbmRleCBvbGRSZWxpZCwgSW5kZXggbmV3UmVsaWQpOwogCiAKIC8qCkBA IC04Niw3ICsxMDYsNyBAQCByZXN0YXJ0OgogCiAJCXJlbW92ZV9yZWxfZnJvbV9xdWVyeShy b290LCBpbm5lcnJlbGlkLAogCQkJCQkJCSAgYm1zX3VuaW9uKHNqaW5mby0+bWluX2xlZnRo YW5kLAotCQkJCQkJCQkJCXNqaW5mby0+bWluX3JpZ2h0aGFuZCkpOworCQkJCQkJCQkJCXNq aW5mby0+bWluX3JpZ2h0aGFuZCksIDApOwogCiAJCS8qIFdlIHZlcmlmeSB0aGF0IGV4YWN0 bHkgb25lIHJlZmVyZW5jZSBnZXRzIHJlbW92ZWQgZnJvbSBqb2lubGlzdCAqLwogCQlucmVt b3ZlZCA9IDA7CkBAIC0yODcsNyArMzA3LDcgQEAgam9pbl9pc19yZW1vdmFibGUoUGxhbm5l ckluZm8gKnJvb3QsIFNwZWNpYWxKb2luSW5mbyAqc2ppbmZvKQogCSAqIE5vdyB0aGF0IHdl IGhhdmUgdGhlIHJlbGV2YW50IGVxdWFsaXR5IGpvaW4gY2xhdXNlcywgdHJ5IHRvIHByb3Zl IHRoZQogCSAqIGlubmVycmVsIGRpc3RpbmN0LgogCSAqLwotCWlmIChyZWxfaXNfZGlzdGlu Y3RfZm9yKHJvb3QsIGlubmVycmVsLCBjbGF1c2VfbGlzdCkpCisJaWYgKHJlbF9pc19kaXN0 aW5jdF9mb3Iocm9vdCwgaW5uZXJyZWwsIGNsYXVzZV9saXN0LCBOVUxMKSkKIAkJcmV0dXJu IHRydWU7CiAKIAkvKgpAQCAtMzAwLDcgKzMyMCwxMCBAQCBqb2luX2lzX3JlbW92YWJsZShQ bGFubmVySW5mbyAqcm9vdCwgU3BlY2lhbEpvaW5JbmZvICpzamluZm8pCiAKIC8qCiAgKiBS ZW1vdmUgdGhlIHRhcmdldCByZWxpZCBmcm9tIHRoZSBwbGFubmVyJ3MgZGF0YSBzdHJ1Y3R1 cmVzLCBoYXZpbmcKLSAqIGRldGVybWluZWQgdGhhdCB0aGVyZSBpcyBubyBuZWVkIHRvIGlu Y2x1ZGUgaXQgaW4gdGhlIHF1ZXJ5LgorICogZGV0ZXJtaW5lZCB0aGF0IHRoZXJlIGlzIG5v IG5lZWQgdG8gaW5jbHVkZSBpdCBpbiB0aGUgcXVlcnkuIE9yIHJlcGxhY2UKKyAqIHdpdGgg YW5vdGhlciByZWxpZC4KKyAqIFRvIHJldXNhYmlsaXR5LCB0aGlzIHJvdXRpbmUgY2FuIHdv cmsgaW4gdHdvIG1vZGVzOiBkZWxldGUgcmVsaWQgZnJvbSBhIHBsYW4KKyAqIG9yIHJlcGxh Y2UgaXQuIEl0IGlzIHVzZWQgaW4gcmVwbGFjZSBtb2RlIGluIGEgc2VsZi1qb2luIHJlbW92 aW5nIHByb2Nlc3MuCiAgKgogICogV2UgYXJlIG5vdCB0ZXJyaWJseSB0aG9yb3VnaCBoZXJl LiAgV2UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGUgcmVsIGlzCiAgKiBubyBsb25nZXIgdHJl YXRlZCBhcyBhIGJhc2VyZWwsIGFuZCB0aGF0IGF0dHJpYnV0ZXMgb2Ygb3RoZXIgYmFzZXJl bHMKQEAgLTMwOSwxMyArMzMyLDE2IEBAIGpvaW5faXNfcmVtb3ZhYmxlKFBsYW5uZXJJbmZv ICpyb290LCBTcGVjaWFsSm9pbkluZm8gKnNqaW5mbykKICAqIGxpc3RzLCBidXQgb25seSBp ZiB0aGV5IGJlbG9uZyB0byB0aGUgb3V0ZXIgam9pbiBpZGVudGlmaWVkIGJ5IGpvaW5yZWxp ZHMuCiAgKi8KIHN0YXRpYyB2b2lkCi1yZW1vdmVfcmVsX2Zyb21fcXVlcnkoUGxhbm5lcklu Zm8gKnJvb3QsIGludCByZWxpZCwgUmVsaWRzIGpvaW5yZWxpZHMpCityZW1vdmVfcmVsX2Zy b21fcXVlcnkoUGxhbm5lckluZm8gKnJvb3QsIGludCByZWxpZCwgUmVsaWRzIGpvaW5yZWxp ZHMsCisJCQkJCSAgaW50IHN1YnN0X3JlbGlkKQogewogCVJlbE9wdEluZm8gKnJlbCA9IGZp bmRfYmFzZV9yZWwocm9vdCwgcmVsaWQpOwogCUxpc3QJICAgKmpvaW5pbmZvczsKIAlJbmRl eAkJcnRpOwogCUxpc3RDZWxsICAgKmw7CiAKKwlBc3NlcnQoc3Vic3RfcmVsaWQgPT0gMCB8 fCByZWxpZCAhPSBzdWJzdF9yZWxpZCk7CisKIAkvKgogCSAqIE1hcmsgdGhlIHJlbCBhcyAi ZGVhZCIgdG8gc2hvdyBpdCBpcyBubyBsb25nZXIgcGFydCBvZiB0aGUgam9pbiB0cmVlLgog CSAqIChSZW1vdmluZyBpdCBmcm9tIHRoZSBiYXNlcmVsIGFycmF5IGFsdG9nZXRoZXIgc2Vl bXMgdG9vIHJpc2t5LikKQEAgLTM0NSw4ICszNzEsMTEgQEAgcmVtb3ZlX3JlbF9mcm9tX3F1 ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQsIFJlbGlkcyBqb2lucmVsaWRzKQog CQkJIGF0dHJvZmYtLSkKIAkJewogCQkJb3RoZXJyZWwtPmF0dHJfbmVlZGVkW2F0dHJvZmZd ID0KLQkJCQlibXNfZGVsX21lbWJlcihvdGhlcnJlbC0+YXR0cl9uZWVkZWRbYXR0cm9mZl0s IHJlbGlkKTsKKwkJCQljaGFuZ2VfcmVsaWQob3RoZXJyZWwtPmF0dHJfbmVlZGVkW2F0dHJv ZmZdLCByZWxpZCwgc3Vic3RfcmVsaWQpOwogCQl9CisKKwkJLyogVXBkYXRlIGxhdGVyYWwg cmVmZXJlbmNlcy4gKi8KKwkJY2hhbmdlX3Zhcm5vKChFeHByICopIG90aGVycmVsLT5sYXRl cmFsX3ZhcnMsIHJlbGlkLCBzdWJzdF9yZWxpZCk7CiAJfQogCiAJLyoKQEAgLTM2MSwxMCAr MzkwLDEyIEBAIHJlbW92ZV9yZWxfZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50 IHJlbGlkLCBSZWxpZHMgam9pbnJlbGlkcykKIAl7CiAJCVNwZWNpYWxKb2luSW5mbyAqc2pp bmZvID0gKFNwZWNpYWxKb2luSW5mbyAqKSBsZmlyc3QobCk7CiAKLQkJc2ppbmZvLT5taW5f bGVmdGhhbmQgPSBibXNfZGVsX21lbWJlcihzamluZm8tPm1pbl9sZWZ0aGFuZCwgcmVsaWQp OwotCQlzamluZm8tPm1pbl9yaWdodGhhbmQgPSBibXNfZGVsX21lbWJlcihzamluZm8tPm1p bl9yaWdodGhhbmQsIHJlbGlkKTsKLQkJc2ppbmZvLT5zeW5fbGVmdGhhbmQgPSBibXNfZGVs X21lbWJlcihzamluZm8tPnN5bl9sZWZ0aGFuZCwgcmVsaWQpOwotCQlzamluZm8tPnN5bl9y aWdodGhhbmQgPSBibXNfZGVsX21lbWJlcihzamluZm8tPnN5bl9yaWdodGhhbmQsIHJlbGlk KTsKKwkJc2ppbmZvLT5taW5fbGVmdGhhbmQgPSBjaGFuZ2VfcmVsaWQoc2ppbmZvLT5taW5f bGVmdGhhbmQsIHJlbGlkLCBzdWJzdF9yZWxpZCk7CisJCXNqaW5mby0+bWluX3JpZ2h0aGFu ZCA9IGNoYW5nZV9yZWxpZChzamluZm8tPm1pbl9yaWdodGhhbmQsIHJlbGlkLCBzdWJzdF9y ZWxpZCk7CisJCXNqaW5mby0+c3luX2xlZnRoYW5kID0gY2hhbmdlX3JlbGlkKHNqaW5mby0+ c3luX2xlZnRoYW5kLCByZWxpZCwgc3Vic3RfcmVsaWQpOworCQlzamluZm8tPnN5bl9yaWdo dGhhbmQgPSBjaGFuZ2VfcmVsaWQoc2ppbmZvLT5zeW5fcmlnaHRoYW5kLCByZWxpZCwgc3Vi c3RfcmVsaWQpOworCisJCWNoYW5nZV92YXJubygoRXhwciAqKSBzamluZm8tPnNlbWlfcmhz X2V4cHJzLCByZWxpZCwgc3Vic3RfcmVsaWQpOwogCX0KIAogCS8qCkBAIC0zODUsMTYgKzQx NiwyOSBAQCByZW1vdmVfcmVsX2Zyb21fcXVlcnkoUGxhbm5lckluZm8gKnJvb3QsIGludCBy ZWxpZCwgUmVsaWRzIGpvaW5yZWxpZHMpCiAJewogCQlQbGFjZUhvbGRlckluZm8gKnBoaW5m byA9IChQbGFjZUhvbGRlckluZm8gKikgbGZpcnN0KGwpOwogCi0JCUFzc2VydCghYm1zX2lz X21lbWJlcihyZWxpZCwgcGhpbmZvLT5waF9sYXRlcmFsKSk7Ci0JCWlmIChibXNfaXNfc3Vi c2V0KHBoaW5mby0+cGhfbmVlZGVkLCBqb2lucmVsaWRzKSAmJgorCQlpZiAoc3Vic3RfcmVs aWQgPT0gMCAmJiBibXNfaXNfc3Vic2V0KHBoaW5mby0+cGhfbmVlZGVkLCBqb2lucmVsaWRz KSAmJgogCQkJYm1zX2lzX21lbWJlcihyZWxpZCwgcGhpbmZvLT5waF9ldmFsX2F0KSkKIAkJ CXJvb3QtPnBsYWNlaG9sZGVyX2xpc3QgPSBmb3JlYWNoX2RlbGV0ZV9jdXJyZW50KHJvb3Qt PnBsYWNlaG9sZGVyX2xpc3QsCiAJCQkJCQkJCQkJCQkJCQlsKTsKIAkJZWxzZQogCQl7Ci0J CQlwaGluZm8tPnBoX2V2YWxfYXQgPSBibXNfZGVsX21lbWJlcihwaGluZm8tPnBoX2V2YWxf YXQsIHJlbGlkKTsKKwkJCXBoaW5mby0+cGhfZXZhbF9hdCA9IGNoYW5nZV9yZWxpZChwaGlu Zm8tPnBoX2V2YWxfYXQsIHJlbGlkLCBzdWJzdF9yZWxpZCk7CiAJCQlBc3NlcnQoIWJtc19p c19lbXB0eShwaGluZm8tPnBoX2V2YWxfYXQpKTsKLQkJCXBoaW5mby0+cGhfbmVlZGVkID0g Ym1zX2RlbF9tZW1iZXIocGhpbmZvLT5waF9uZWVkZWQsIHJlbGlkKTsKKwkJCXBoaW5mby0+ cGhfbmVlZGVkID0gY2hhbmdlX3JlbGlkKHBoaW5mby0+cGhfbmVlZGVkLCByZWxpZCwgc3Vi c3RfcmVsaWQpOworCQkJQXNzZXJ0KHN1YnN0X3JlbGlkICE9IDAgfHwgIWJtc19pc19tZW1i ZXIocmVsaWQsIHBoaW5mby0+cGhfbGF0ZXJhbCkpOworCQkJcGhpbmZvLT5waF9sYXRlcmFs ID0gY2hhbmdlX3JlbGlkKHBoaW5mby0+cGhfbGF0ZXJhbCwgcmVsaWQsIHN1YnN0X3JlbGlk KTsKKwkJCXBoaW5mby0+cGhfdmFyLT5waHJlbHMgPSBjaGFuZ2VfcmVsaWQocGhpbmZvLT5w aF92YXItPnBocmVscywgcmVsaWQsIHN1YnN0X3JlbGlkKTsKKwkJfQorCX0KKworCWlmIChz dWJzdF9yZWxpZCAhPSAwKQorCXsKKwkJZm9yZWFjaChsLCByZWwtPmJhc2VyZXN0cmljdGlu Zm8pCisJCXsKKwkJCVJlc3RyaWN0SW5mbyAqcmluZm8gPSAoUmVzdHJpY3RJbmZvICopIGxm aXJzdChsKTsKKworCQkJY2hhbmdlX3JpbmZvKHJpbmZvLCByZWxpZCwgc3Vic3RfcmVsaWQp OworCQkJZGlzdHJpYnV0ZV9yZXN0cmljdGluZm9fdG9fcmVscyhyb290LCByaW5mbyk7CiAJ CX0KIAl9CiAKQEAgLTQxOSw2ICs0NjMsMTIgQEAgcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KFBs YW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQsIFJlbGlkcyBqb2lucmVsaWRzKQogCiAJCXJl bW92ZV9qb2luX2NsYXVzZV9mcm9tX3JlbHMocm9vdCwgcmluZm8sIHJpbmZvLT5yZXF1aXJl ZF9yZWxpZHMpOwogCisJCS8qCisJCSAqIHJlcGxhY2UgcmVsaWQgd2l0aCByZWxpZCBvZiBr ZWVwaW5nIHJlbGF0aW9uLiBBZnRlciB0aGF0LCB0aGlzCisJCSAqIHJlc3RyaWN0aW9uIGNh biBiZSBhdHRhY2hlZCB0byBrZWVwaW5nIHJlbGF0aW9uLgorCQkgKi8KKwkJY2hhbmdlX3Jp bmZvKHJpbmZvLCByZWxpZCwgc3Vic3RfcmVsaWQpOworCiAJCWlmIChSSU5GT19JU19QVVNI RURfRE9XTihyaW5mbywgam9pbnJlbGlkcykpCiAJCXsKIAkJCS8qIFJlY2hlY2sgdGhhdCBx dWFsIGRvZXNuJ3QgYWN0dWFsbHkgcmVmZXJlbmNlIHRoZSB0YXJnZXQgcmVsICovCkBAIC00 MzMsNiArNDgzLDggQEAgcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290 LCBpbnQgcmVsaWQsIFJlbGlkcyBqb2lucmVsaWRzKQogCQkJCQkJCQkJCQkJCXJlbGlkKTsK IAkJCWRpc3RyaWJ1dGVfcmVzdHJpY3RpbmZvX3RvX3JlbHMocm9vdCwgcmluZm8pOwogCQl9 CisJCWVsc2UgaWYgKHN1YnN0X3JlbGlkICE9IDApCisJCQlkaXN0cmlidXRlX3Jlc3RyaWN0 aW5mb190b19yZWxzKHJvb3QsIHJpbmZvKTsKIAl9CiAKIAkvKgpAQCAtNjM2LDkgKzY4OCwx NCBAQCByZWxfc3VwcG9ydHNfZGlzdGluY3RuZXNzKFBsYW5uZXJJbmZvICpyb290LCBSZWxP cHRJbmZvICpyZWwpCiAgKiBOb3RlIHRoYXQgdGhlIHBhc3NlZC1pbiBjbGF1c2VfbGlzdCBt YXkgYmUgZGVzdHJ1Y3RpdmVseSBtb2RpZmllZCEgIFRoaXMKICAqIGlzIE9LIGZvciBjdXJy ZW50IHVzZXMsIGJlY2F1c2UgdGhlIGNsYXVzZV9saXN0IGlzIGJ1aWx0IGJ5IHRoZSBjYWxs ZXIgZm9yCiAgKiB0aGUgc29sZSBwdXJwb3NlIG9mIHBhc3NpbmcgdG8gdGhpcyBmdW5jdGlv bi4KKyAqCisgKiBvdXRlcl9leHBycyBjb250YWlucyByaWdodCBzaWRlcyBvZiBiYXNlcmVz dHJpY3RpbmZvIGNsYXVzZXMgbG9va3MgbGlrZQorICogeCA9IGNvbnN0IGlmIGRpc3RpbmN0 bmVzcyBpcyBkZXJpdmVkIGZyb20gc3VjaCBjbGF1c2VzLCBub3Qgam9pbmluZm8gY2xhdXNl LgorICogUGFzcyBOVUxMIGZvciB0aGUgcGFyYW0gdmFsdWUsIGlmIGl0IGlzIG5vdCBpbnRl cmVzdGVkLgogICovCiBzdGF0aWMgYm9vbAotcmVsX2lzX2Rpc3RpbmN0X2ZvcihQbGFubmVy SW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLCBMaXN0ICpjbGF1c2VfbGlzdCkKK3JlbF9p c19kaXN0aW5jdF9mb3IoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwgTGlz dCAqY2xhdXNlX2xpc3QsCisJCQkJCUxpc3QgKipleHRyYV9jbGF1c2VzKQogewogCS8qCiAJ ICogV2UgY291bGQgc2tpcCBhIGNvdXBsZSBvZiB0ZXN0cyBoZXJlIGlmIHdlIGFzc3VtZSBh bGwgY2FsbGVycyBjaGVja2VkCkBAIC02NTEsMTAgKzcwOCwxMSBAQCByZWxfaXNfZGlzdGlu Y3RfZm9yKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsIExpc3QgKmNsYXVz ZV9saXN0KQogCXsKIAkJLyoKIAkJICogRXhhbWluZSB0aGUgaW5kZXhlcyB0byBzZWUgaWYg d2UgaGF2ZSBhIG1hdGNoaW5nIHVuaXF1ZSBpbmRleC4KLQkJICogcmVsYXRpb25faGFzX3Vu aXF1ZV9pbmRleF9mb3IgYXV0b21hdGljYWxseSBhZGRzIGFueSB1c2FibGUKKwkJICogcmVs YXRpb25faGFzX3VuaXF1ZV9pbmRleF9leHQgYXV0b21hdGljYWxseSBhZGRzIGFueSB1c2Fi bGUKIAkJICogcmVzdHJpY3Rpb24gY2xhdXNlcyBmb3IgdGhlIHJlbCwgc28gd2UgbmVlZG4n dCBkbyB0aGF0IGhlcmUuCiAJCSAqLwotCQlpZiAocmVsYXRpb25faGFzX3VuaXF1ZV9pbmRl eF9mb3Iocm9vdCwgcmVsLCBjbGF1c2VfbGlzdCwgTklMLCBOSUwpKQorCQlpZiAocmVsYXRp b25faGFzX3VuaXF1ZV9pbmRleF9leHQocm9vdCwgcmVsLCBjbGF1c2VfbGlzdCwgTklMLCBO SUwsCisJCQkJCQkJCQkJICBleHRyYV9jbGF1c2VzKSkKIAkJCXJldHVybiB0cnVlOwogCX0K IAllbHNlIGlmIChyZWwtPnJ0ZWtpbmQgPT0gUlRFX1NVQlFVRVJZKQpAQCAtOTY4LDkgKzEw MjYsMjEgQEAgaW5uZXJyZWxfaXNfdW5pcXVlKFBsYW5uZXJJbmZvICpyb290LAogCQkJCSAg IEpvaW5UeXBlIGpvaW50eXBlLAogCQkJCSAgIExpc3QgKnJlc3RyaWN0bGlzdCwKIAkJCQkg ICBib29sIGZvcmNlX2NhY2hlKQoreworCXJldHVybiBpbm5lcnJlbF9pc191bmlxdWVfZXh0 KHJvb3QsIGpvaW5yZWxpZHMsIG91dGVycmVsaWRzLCBpbm5lcnJlbCwKKwkJCQkJCQkJICBq b2ludHlwZSwgcmVzdHJpY3RsaXN0LCBmb3JjZV9jYWNoZSwgTlVMTCk7Cit9CisKK2Jvb2wK K2lubmVycmVsX2lzX3VuaXF1ZV9leHQoUGxhbm5lckluZm8gKnJvb3QsIFJlbGlkcyBqb2lu cmVsaWRzLCBSZWxpZHMgb3V0ZXJyZWxpZHMsCisJCQkJCSAgIFJlbE9wdEluZm8gKmlubmVy cmVsLCBKb2luVHlwZSBqb2ludHlwZSwKKwkJCQkJICAgTGlzdCAqcmVzdHJpY3RsaXN0LCBi b29sIGZvcmNlX2NhY2hlLAorCQkJCQkgICBMaXN0ICoqZXh0cmFfY2xhdXNlcykKIHsKIAlN ZW1vcnlDb250ZXh0IG9sZF9jb250ZXh0OwogCUxpc3RDZWxsICAgKmxjOworCVVuaXF1ZVJl bEluZm8gKnVuaXF1ZVJlbEluZm87CisJTGlzdAkgICAqb3V0ZXJfZXhwcnMgPSBOSUw7CiAK IAkvKiBDZXJ0YWlubHkgY2FuJ3QgcHJvdmUgdW5pcXVlbmVzcyB3aGVuIHRoZXJlIGFyZSBu byBqb2luY2xhdXNlcyAqLwogCWlmIChyZXN0cmljdGxpc3QgPT0gTklMKQpAQCAtOTkyLDEw ICsxMDYyLDE0IEBAIGlubmVycmVsX2lzX3VuaXF1ZShQbGFubmVySW5mbyAqcm9vdCwKIAkg Ki8KIAlmb3JlYWNoKGxjLCBpbm5lcnJlbC0+dW5pcXVlX2Zvcl9yZWxzKQogCXsKLQkJUmVs aWRzCQl1bmlxdWVfZm9yX3JlbHMgPSAoUmVsaWRzKSBsZmlyc3QobGMpOworCQl1bmlxdWVS ZWxJbmZvID0gKFVuaXF1ZVJlbEluZm8gKikgbGZpcnN0KGxjKTsKIAotCQlpZiAoYm1zX2lz X3N1YnNldCh1bmlxdWVfZm9yX3JlbHMsIG91dGVycmVsaWRzKSkKKwkJaWYgKGJtc19pc19z dWJzZXQodW5pcXVlUmVsSW5mby0+b3V0ZXJyZWxpZHMsIG91dGVycmVsaWRzKSkKKwkJewor CQkJaWYgKGV4dHJhX2NsYXVzZXMpCisJCQkJKmV4dHJhX2NsYXVzZXMgPSB1bmlxdWVSZWxJ bmZvLT5leHRyYV9jbGF1c2VzOwogCQkJcmV0dXJuIHRydWU7CQkvKiBTdWNjZXNzISAqLwor CQl9CiAJfQogCiAJLyoKQEAgLTEwMTIsNyArMTA4Niw3IEBAIGlubmVycmVsX2lzX3VuaXF1 ZShQbGFubmVySW5mbyAqcm9vdCwKIAogCS8qIE5vIGNhY2hlZCBpbmZvcm1hdGlvbiwgc28g dHJ5IHRvIG1ha2UgdGhlIHByb29mLiAqLwogCWlmIChpc19pbm5lcnJlbF91bmlxdWVfZm9y KHJvb3QsIGpvaW5yZWxpZHMsIG91dGVycmVsaWRzLCBpbm5lcnJlbCwKLQkJCQkJCQkgICBq b2ludHlwZSwgcmVzdHJpY3RsaXN0KSkKKwkJCQkJCQkgICBqb2ludHlwZSwgcmVzdHJpY3Rs aXN0LCAmb3V0ZXJfZXhwcnMpKQogCXsKIAkJLyoKIAkJICogQ2FjaGUgdGhlIHBvc2l0aXZl IHJlc3VsdCBmb3IgZnV0dXJlIHByb2JlcywgYmVpbmcgc3VyZSB0byBrZWVwIGl0CkBAIC0x MDI1LDEwICsxMDk5LDE1IEBAIGlubmVycmVsX2lzX3VuaXF1ZShQbGFubmVySW5mbyAqcm9v dCwKIAkJICogc3VwZXJzZXRzIG9mIHRoZW0gYW55d2F5LgogCQkgKi8KIAkJb2xkX2NvbnRl eHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8ocm9vdC0+cGxhbm5lcl9jeHQpOworCQl1bmlx dWVSZWxJbmZvID0gcGFsbG9jKHNpemVvZihVbmlxdWVSZWxJbmZvKSk7CisJCXVuaXF1ZVJl bEluZm8tPmV4dHJhX2NsYXVzZXMgPSBvdXRlcl9leHByczsKKwkJdW5pcXVlUmVsSW5mby0+ b3V0ZXJyZWxpZHMgPSBibXNfY29weShvdXRlcnJlbGlkcyk7CiAJCWlubmVycmVsLT51bmlx dWVfZm9yX3JlbHMgPSBsYXBwZW5kKGlubmVycmVsLT51bmlxdWVfZm9yX3JlbHMsCi0JCQkJ CQkJCQkJCWJtc19jb3B5KG91dGVycmVsaWRzKSk7CisJCQkJCQkJCQkJCXVuaXF1ZVJlbElu Zm8pOwogCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkX2NvbnRleHQpOwogCisJCWlmIChl eHRyYV9jbGF1c2VzKQorCQkJKmV4dHJhX2NsYXVzZXMgPSBvdXRlcl9leHByczsKIAkJcmV0 dXJuIHRydWU7CQkJLyogU3VjY2VzcyEgKi8KIAl9CiAJZWxzZQpAQCAtMTA3NCw3ICsxMTUz LDggQEAgaXNfaW5uZXJyZWxfdW5pcXVlX2ZvcihQbGFubmVySW5mbyAqcm9vdCwKIAkJCQkJ ICAgUmVsaWRzIG91dGVycmVsaWRzLAogCQkJCQkgICBSZWxPcHRJbmZvICppbm5lcnJlbCwK IAkJCQkJICAgSm9pblR5cGUgam9pbnR5cGUsCi0JCQkJCSAgIExpc3QgKnJlc3RyaWN0bGlz dCkKKwkJCQkJICAgTGlzdCAqcmVzdHJpY3RsaXN0LAorCQkJCQkgICBMaXN0ICoqZXh0cmFf Y2xhdXNlcykKIHsKIAlMaXN0CSAgICpjbGF1c2VfbGlzdCA9IE5JTDsKIAlMaXN0Q2VsbCAg ICpsYzsKQEAgLTExMTYsNSArMTE5Niw5MjAgQEAgaXNfaW5uZXJyZWxfdW5pcXVlX2ZvcihQ bGFubmVySW5mbyAqcm9vdCwKIAl9CiAKIAkvKiBMZXQgcmVsX2lzX2Rpc3RpbmN0X2Zvcigp IGRvIHRoZSBoYXJkIHdvcmsgKi8KLQlyZXR1cm4gcmVsX2lzX2Rpc3RpbmN0X2Zvcihyb290 LCBpbm5lcnJlbCwgY2xhdXNlX2xpc3QpOworCXJldHVybiByZWxfaXNfZGlzdGluY3RfZm9y KHJvb3QsIGlubmVycmVsLCBjbGF1c2VfbGlzdCwgZXh0cmFfY2xhdXNlcyk7Cit9CisKK3R5 cGVkZWYgc3RydWN0IENoYW5nZVZhcm5vQ29udGV4dAoreworCUluZGV4CQlvbGRSZWxpZDsK KwlJbmRleAkJbmV3UmVsaWQ7Cit9IENoYW5nZVZhcm5vQ29udGV4dDsKKworCitzdGF0aWMg Ym9vbAorY2hhbmdlX3Zhcm5vX3dhbGtlcihOb2RlICpub2RlLCBDaGFuZ2VWYXJub0NvbnRl eHQgKmNvbnRleHQpCit7CisJaWYgKG5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIGZhbHNlOwor CisJaWYgKElzQShub2RlLCBWYXIpKQorCXsKKwkJVmFyCQkgICAqdmFyID0gKFZhciAqKSBu b2RlOworCisJCWlmICh2YXItPnZhcm5vID09IGNvbnRleHQtPm9sZFJlbGlkKQorCQl7CisJ CQl2YXItPnZhcm5vID0gY29udGV4dC0+bmV3UmVsaWQ7CisJCQl2YXItPnZhcm5vc3luID0g Y29udGV4dC0+bmV3UmVsaWQ7CisJCQl2YXItPmxvY2F0aW9uID0gLTE7CisJCX0KKwkJZWxz ZSBpZiAodmFyLT52YXJubyA9PSBjb250ZXh0LT5uZXdSZWxpZCkKKwkJCXZhci0+bG9jYXRp b24gPSAtMTsKKworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmIChJc0Eobm9kZSwgUmVzdHJp Y3RJbmZvKSkKKwl7CisJCWNoYW5nZV9yaW5mbygoUmVzdHJpY3RJbmZvICopIG5vZGUsIGNv bnRleHQtPm9sZFJlbGlkLCBjb250ZXh0LT5uZXdSZWxpZCk7CisJCXJldHVybiBmYWxzZTsK Kwl9CisJcmV0dXJuIGV4cHJlc3Npb25fdHJlZV93YWxrZXIobm9kZSwgY2hhbmdlX3Zhcm5v X3dhbGtlciwgY29udGV4dCk7Cit9CisKKy8qCisgKiBGb3IgYWxsIFZhcnMgaW4gdGhlIGV4 cHJlc3Npb24gdGhhdCBoYXZlIHZhcm5vID0gb2xkUmVsaWQsIHNldAorICogdmFybm8gPSBu ZXdSZWxpZC4KKyAqLworc3RhdGljIHZvaWQKK2NoYW5nZV92YXJubyhFeHByICpleHByLCBJ bmRleCBvbGRSZWxpZCwgSW5kZXggbmV3UmVsaWQpCit7CisJQ2hhbmdlVmFybm9Db250ZXh0 IGNvbnRleHQ7CisKKwlpZiAobmV3UmVsaWQgPT0gMCkKKwkJcmV0dXJuOworCisJY29udGV4 dC5vbGRSZWxpZCA9IG9sZFJlbGlkOworCWNvbnRleHQubmV3UmVsaWQgPSBuZXdSZWxpZDsK KwljaGFuZ2VfdmFybm9fd2Fsa2VyKChOb2RlICopIGV4cHIsICZjb250ZXh0KTsKK30KKwor LyoKKyAqIFN1YnN0aXR1dGUgbmV3SWQgZm9yIG9sZElkIGluIHJlbGlkcy4KKyAqLworc3Rh dGljIEJpdG1hcHNldCAqCitjaGFuZ2VfcmVsaWQoUmVsaWRzIHJlbGlkcywgSW5kZXggb2xk SWQsIEluZGV4IG5ld0lkKQoreworCWlmIChuZXdJZCA9PSAwKQorCQkvKiBEZWxldGUgcmVs aWQgd2l0aG91dCBzdWJzdGl0dXRpb24uICovCisJCXJldHVybiBibXNfZGVsX21lbWJlcihy ZWxpZHMsIG9sZElkKTsKKworCWlmIChibXNfaXNfbWVtYmVyKG9sZElkLCByZWxpZHMpKQor CQlyZXR1cm4gYm1zX2FkZF9tZW1iZXIoYm1zX2RlbF9tZW1iZXIoYm1zX2NvcHkocmVsaWRz KSwgb2xkSWQpLCBuZXdJZCk7CisKKwlyZXR1cm4gcmVsaWRzOworfQorCitzdGF0aWMgdm9p ZAorY2hhbmdlX3JpbmZvKFJlc3RyaWN0SW5mbyAqcmluZm8sIEluZGV4IGZyb20sIEluZGV4 IHRvKQoreworCWJvb2wJCWlzX3JlcV9lcXVhbDsKKworCWlmICh0byA9PSAwKQorCQlyZXR1 cm47CisKKwlpc19yZXFfZXF1YWwgPSAocmluZm8tPnJlcXVpcmVkX3JlbGlkcyA9PSByaW5m by0+Y2xhdXNlX3JlbGlkcyk7CisKKwljaGFuZ2VfdmFybm8ocmluZm8tPmNsYXVzZSwgZnJv bSwgdG8pOworCWNoYW5nZV92YXJubyhyaW5mby0+b3JjbGF1c2UsIGZyb20sIHRvKTsKKwly aW5mby0+Y2xhdXNlX3JlbGlkcyA9IGNoYW5nZV9yZWxpZChyaW5mby0+Y2xhdXNlX3JlbGlk cywgZnJvbSwgdG8pOworCWlmIChpc19yZXFfZXF1YWwpCisJCXJpbmZvLT5yZXF1aXJlZF9y ZWxpZHMgPSByaW5mby0+Y2xhdXNlX3JlbGlkczsKKwllbHNlCisJCXJpbmZvLT5yZXF1aXJl ZF9yZWxpZHMgPSBjaGFuZ2VfcmVsaWQocmluZm8tPnJlcXVpcmVkX3JlbGlkcywgZnJvbSwg dG8pOworCXJpbmZvLT5sZWZ0X3JlbGlkcyA9IGNoYW5nZV9yZWxpZChyaW5mby0+bGVmdF9y ZWxpZHMsIGZyb20sIHRvKTsKKwlyaW5mby0+cmlnaHRfcmVsaWRzID0gY2hhbmdlX3JlbGlk KHJpbmZvLT5yaWdodF9yZWxpZHMsIGZyb20sIHRvKTsKKwlyaW5mby0+b3V0ZXJfcmVsaWRz ID0gY2hhbmdlX3JlbGlkKHJpbmZvLT5vdXRlcl9yZWxpZHMsIGZyb20sIHRvKTsKKwlyaW5m by0+bnVsbGFibGVfcmVsaWRzID0gY2hhbmdlX3JlbGlkKHJpbmZvLT5udWxsYWJsZV9yZWxp ZHMsIGZyb20sIHRvKTsKK30KKworLyoKKyAqIFVwZGF0ZSBFQyBtZW1iZXJzIHRvIHBvaW50 IHRvIHRoZSByZW1haW5pbmcgcmVsYXRpb24gaW5zdGVhZCBvZiB0aGUgcmVtb3ZlZAorICog b25lLCByZW1vdmluZyBkdXBsaWNhdGVzLgorICovCitzdGF0aWMgdm9pZAordXBkYXRlX2Vj X21lbWJlcnMoRXF1aXZhbGVuY2VDbGFzcyAqZWMsIEluZGV4IHRvUmVtb3ZlLCBJbmRleCB0 b0tlZXApCit7CisJaW50CQkJY291bnRlcjsKKworCWZvciAoY291bnRlciA9IDA7IGNvdW50 ZXIgPCBsaXN0X2xlbmd0aChlYy0+ZWNfbWVtYmVycyk7KQorCXsKKwkJTGlzdENlbGwgICAq Y2VsbCA9IGxpc3RfbnRoX2NlbGwoZWMtPmVjX21lbWJlcnMsIGNvdW50ZXIpOworCQlFcXVp dmFsZW5jZU1lbWJlciAqZW0gPSBsZmlyc3QoY2VsbCk7CisJCWludAkJCWNvdW50ZXIxOwor CisJCWlmICghYm1zX2lzX21lbWJlcih0b1JlbW92ZSwgZW0tPmVtX3JlbGlkcykpCisJCXsK KwkJCWNvdW50ZXIrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZW0tPmVtX3JlbGlkcyA9 IGNoYW5nZV9yZWxpZChlbS0+ZW1fcmVsaWRzLCB0b1JlbW92ZSwgdG9LZWVwKTsKKwkJLyog V2Ugb25seSBwcm9jZXNzIGlubmVyIGpvaW5zICovCisJCWNoYW5nZV92YXJubyhlbS0+ZW1f ZXhwciwgdG9SZW1vdmUsIHRvS2VlcCk7CisKKwkJLyoKKwkJICogQWZ0ZXIgd2Ugc3dpdGNo ZWQgdGhlIGVxdWl2YWxlbmNlIG1lbWJlciB0byB0aGUgcmVtYWluaW5nIHJlbGF0aW9uLAor CQkgKiBjaGVjayB0aGF0IGl0IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgZXhpc3RpbmcgbWVt YmVyLCBhbmQgaWYgaXQgaXMsCisJCSAqIGRlbGV0ZSBpdC4KKwkJICovCisJCWZvciAoY291 bnRlcjEgPSAwOyBjb3VudGVyMSA8IGxpc3RfbGVuZ3RoKGVjLT5lY19tZW1iZXJzKTsgY291 bnRlcjErKykKKwkJeworCQkJRXF1aXZhbGVuY2VNZW1iZXIgKm90aGVyOworCisJCQlpZiAo Y291bnRlcjEgPT0gY291bnRlcikKKwkJCQljb250aW51ZTsKKworCQkJb3RoZXIgPSBjYXN0 Tm9kZShFcXVpdmFsZW5jZU1lbWJlciwgbGlzdF9udGgoZWMtPmVjX21lbWJlcnMsIGNvdW50 ZXIxKSk7CisKKwkJCWlmIChlcXVhbChvdGhlci0+ZW1fZXhwciwgZW0tPmVtX2V4cHIpKQor CQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGNvdW50ZXIxIDwgbGlzdF9sZW5ndGgoZWMtPmVj X21lbWJlcnMpKQorCQkJZWMtPmVjX21lbWJlcnMgPSBsaXN0X2RlbGV0ZV9jZWxsKGVjLT5l Y19tZW1iZXJzLCBjZWxsKTsKKwkJZWxzZQorCQkJY291bnRlcisrOworCX0KK30KKworLyoK KyAqIFVwZGF0ZSBFQyBzb3VyY2VzIHRvIHBvaW50IHRvIHRoZSByZW1haW5pbmcgcmVsYXRp b24gaW5zdGVhZCBvZiB0aGUKKyAqIHJlbW92ZWQgb25lLgorICovCitzdGF0aWMgdm9pZAor dXBkYXRlX2VjX3NvdXJjZXMoTGlzdCAqKnNvdXJjZXMsIEluZGV4IHRvUmVtb3ZlLCBJbmRl eCB0b0tlZXApCit7CisJaW50CQkJY291bnRlcjsKKworCWZvciAoY291bnRlciA9IDA7IGNv dW50ZXIgPCBsaXN0X2xlbmd0aCgqc291cmNlcyk7KQorCXsKKwkJTGlzdENlbGwgICAqY2Vs bCA9IGxpc3RfbnRoX2NlbGwoKnNvdXJjZXMsIGNvdW50ZXIpOworCQlSZXN0cmljdEluZm8g KnJpbmZvID0gY2FzdE5vZGUoUmVzdHJpY3RJbmZvLCBsZmlyc3QoY2VsbCkpOworCQlpbnQJ CQljb3VudGVyMTsKKworCQlpZiAoIWJtc19pc19tZW1iZXIodG9SZW1vdmUsIHJpbmZvLT5y ZXF1aXJlZF9yZWxpZHMpKQorCQl7CisJCQljb3VudGVyKys7CisJCQljb250aW51ZTsKKwkJ fQorCisJCWNoYW5nZV92YXJubyhyaW5mby0+Y2xhdXNlLCB0b1JlbW92ZSwgdG9LZWVwKTsK KworCQkvKgorCQkgKiBBZnRlciBzd2l0Y2hpbmcgdGhlIGNsYXVzZSB0byB0aGUgcmVtYWlu aW5nIHJlbGF0aW9uLCBjaGVjayBpdCBmb3IKKwkJICogcmVkdW5kYW5jeSB3aXRoIGV4aXN0 aW5nIG9uZXMuIFdlIGRvbid0IGhhdmUgdG8gY2hlY2sgZm9yCisJCSAqIHJlZHVuZGFuY3kg d2l0aCBkZXJpdmVkIGNsYXVzZXMsIGJlY2F1c2Ugd2UndmUganVzdCBkZWxldGVkIHRoZW0u CisJCSAqLworCQlmb3IgKGNvdW50ZXIxID0gMDsgY291bnRlcjEgPCBsaXN0X2xlbmd0aCgq c291cmNlcyk7IGNvdW50ZXIxKyspCisJCXsKKwkJCVJlc3RyaWN0SW5mbyAqb3RoZXI7CisK KwkJCWlmIChjb3VudGVyMSA9PSBjb3VudGVyKQorCQkJCWNvbnRpbnVlOworCisJCQlvdGhl ciA9IGNhc3ROb2RlKFJlc3RyaWN0SW5mbywgbGlzdF9udGgoKnNvdXJjZXMsIGNvdW50ZXIx KSk7CisJCQlpZiAoZXF1YWwocmluZm8tPmNsYXVzZSwgb3RoZXItPmNsYXVzZSkpCisJCQkJ YnJlYWs7CisJCX0KKworCQlpZiAoY291bnRlcjEgPCBsaXN0X2xlbmd0aCgqc291cmNlcykp CisJCQkqc291cmNlcyA9IGxpc3RfZGVsZXRlX2NlbGwoKnNvdXJjZXMsIGNlbGwpOworCQll bHNlCisJCXsKKwkJCWNvdW50ZXIrKzsKKworCQkJLyogV2Ugd2lsbCBrZWVwIHRoaXMgUmVz dHJpY3RJbmZvLCBjb3JyZWN0IGl0cyByZWxpZHMuICovCisJCQljaGFuZ2VfcmluZm8ocmlu Zm8sIHRvUmVtb3ZlLCB0b0tlZXApOworCQl9CisJfQorfQorCisvKgorICogUmVtb3ZlIGEg cmVsYXRpb24gYWZ0ZXIgd2UgaGF2ZSBwcm92ZW4gdGhhdCBpdCBwYXJ0aWNpcGF0ZXMgb25s eSBpbiBhbgorICogdW5uZWVkZWQgdW5pcXVlIHNlbGYgam9pbi4KKyAqCisgKiBUaGUgam9p bmNsYXVzZXMgbGlzdCBpcyBkZXN0cnVjdGl2ZWx5IGNoYW5nZWQuCisgKi8KK3N0YXRpYyB2 b2lkCityZW1vdmVfc2VsZl9qb2luX3JlbChQbGFubmVySW5mbyAqcm9vdCwgUGxhblJvd01h cmsgKmttYXJrLCBQbGFuUm93TWFyayAqcm1hcmssCisJCQkJCSBSZWxPcHRJbmZvICp0b0tl ZXAsIFJlbE9wdEluZm8gKnRvUmVtb3ZlKQoreworCUxpc3RDZWxsICAgKmNlbGw7CisJaW50 CQkJaTsKKwlMaXN0CSAgICp0YXJnZXQgPSBOSUw7CisKKwkvKgorCSAqIEluY2x1ZGUgYWxs IGVjbGFzcyBtZW50aW9ucyBvZiByZW1vdmVkIHJlbGF0aW9uIGludG8gdGhlIGVjbGFzcwor CSAqIG1lbnRpb25zIG9mIGtlcHQgcmVsYXRpb24uCisJICovCisJdG9LZWVwLT5lY2xhc3Nf aW5kZXhlcyA9IGJtc19hZGRfbWVtYmVycyh0b1JlbW92ZS0+ZWNsYXNzX2luZGV4ZXMsCisJ CQkJCQkJCQkJCSB0b0tlZXAtPmVjbGFzc19pbmRleGVzKTsKKworCS8qCisJICogTm93LCBi YXNlcmVzdHJpY3RpbmZvIHJlcGxlbmlzaGVkIHdpdGggcmVzdHJpY3Rpb25zIGZyb20gcmVt b3ZpbmcKKwkgKiByZWxhdGlvbi4gSXQgaXMgbmVlZGVkIHRvIHJlbW92ZSBkdXBsaWNhdGVz IGFuZCByZXBsYWNlIGRlZ2VuZXJhdGVkCisJICogY2xhdXNlcyB3aXRoIGEgTnVsbFRlc3Qu CisJICovCisJZm9yZWFjaChjZWxsLCB0b0tlZXAtPmJhc2VyZXN0cmljdGluZm8pCisJewor CQlSZXN0cmljdEluZm8gKnJpbmZvID0gbGZpcnN0X25vZGUoUmVzdHJpY3RJbmZvLCBjZWxs KTsKKwkJTGlzdENlbGwgICAqb3RoZXJDZWxsID0gTlVMTDsKKworCQlBc3NlcnQoIWJtc19p c19tZW1iZXIodG9SZW1vdmUtPnJlbGlkLCByaW5mby0+Y2xhdXNlX3JlbGlkcykpOworCisJ CS8qCisJCSAqIElmIHRoaXMgY2xhdXNlIGlzIGEgbWVyZ2Vqb2luYWJsZSBlcXVhbGl0eSBj bGF1c2UgdGhhdCBjb21wYXJlcyBhCisJCSAqIHZhcmlhYmxlIHRvIGl0c2VsZiwgaS5lLiwg aGFzIHRoZSBmb3JtIG9mICJYPVgiLCByZXBsYWNlIGl0IHdpdGgKKwkJICogbnVsbCB0ZXN0 LgorCQkgKi8KKwkJaWYgKHJpbmZvLT5tZXJnZW9wZmFtaWxpZXMgJiYgSXNBKHJpbmZvLT5j bGF1c2UsIE9wRXhwcikpCisJCXsKKwkJCUV4cHIJICAgKmxlZnRPcDsKKwkJCUV4cHIJICAg KnJpZ2h0T3A7CisKKwkJCWxlZnRPcCA9IChFeHByICopIGdldF9sZWZ0b3AocmluZm8tPmNs YXVzZSk7CisJCQlyaWdodE9wID0gKEV4cHIgKikgZ2V0X3JpZ2h0b3AocmluZm8tPmNsYXVz ZSk7CisKKwkJCWlmIChsZWZ0T3AgIT0gTlVMTCAmJiBlcXVhbChsZWZ0T3AsIHJpZ2h0T3Ap KQorCQkJeworCQkJCU51bGxUZXN0ICAgKm51bGxUZXN0ID0gbWFrZU5vZGUoTnVsbFRlc3Qp OworCisJCQkJbnVsbFRlc3QtPmFyZyA9IGxlZnRPcDsKKwkJCQludWxsVGVzdC0+bnVsbHRl c3R0eXBlID0gSVNfTk9UX05VTEw7CisJCQkJbnVsbFRlc3QtPmFyZ2lzcm93ID0gZmFsc2U7 CisJCQkJbnVsbFRlc3QtPmxvY2F0aW9uID0gLTE7CisJCQkJcmluZm8tPmNsYXVzZSA9IChF eHByICopIG51bGxUZXN0OworCQkJfQorCQl9CisKKwkJLyogU2VhcmNoIGZvciBkdXBsaWNh dGVzLiAqLworCQlmb3JlYWNoKG90aGVyQ2VsbCwgdGFyZ2V0KQorCQl7CisJCQlSZXN0cmlj dEluZm8gKm90aGVyID0gbGZpcnN0X25vZGUoUmVzdHJpY3RJbmZvLCBvdGhlckNlbGwpOwor CisJCQlpZiAob3RoZXIgPT0gcmluZm8gfHwKKwkJCQkocmluZm8tPnBhcmVudF9lYyAhPSBO VUxMCisJCQkJICYmIG90aGVyLT5wYXJlbnRfZWMgPT0gcmluZm8tPnBhcmVudF9lYykKKwkJ CQl8fCBlcXVhbChyaW5mby0+Y2xhdXNlLCBvdGhlci0+Y2xhdXNlKSkKKwkJCXsKKwkJCQli cmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChvdGhlckNlbGwgIT0gTlVMTCkKKwkJCS8qIER1 cGxpY2F0ZSBmb3VuZCAqLworCQkJY29udGludWU7CisKKwkJdGFyZ2V0ID0gbGFwcGVuZCh0 YXJnZXQsIHJpbmZvKTsKKwl9CisKKwlsaXN0X2ZyZWUodG9LZWVwLT5iYXNlcmVzdHJpY3Rp bmZvKTsKKwl0b0tlZXAtPmJhc2VyZXN0cmljdGluZm8gPSB0YXJnZXQ7CisKKwkvKgorCSAq IFVwZGF0ZSB0aGUgZXF1aXZhbGVuY2UgY2xhc3NlcyB0aGF0IHJlZmVyZW5jZSB0aGUgcmVt b3ZlZCByZWxhdGlvbnMuCisJICovCisJZm9yZWFjaChjZWxsLCByb290LT5lcV9jbGFzc2Vz KQorCXsKKwkJRXF1aXZhbGVuY2VDbGFzcyAqZWMgPSBsZmlyc3QoY2VsbCk7CisKKwkJaWYg KCFibXNfaXNfbWVtYmVyKHRvUmVtb3ZlLT5yZWxpZCwgZWMtPmVjX3JlbGlkcykpCisJCXsK KwkJCS8qCisJCQkgKiBUaGlzIEVDIGRvZXNuJ3QgcmVmZXJlbmNlIHRoZSByZW1vdmVkIHJl bGF0aW9uLCBub3RoaW5nIHRvIGJlCisJCQkgKiBkb25lIGZvciBpdC4KKwkJCSAqLworCQkJ Y29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBVcGRhdGUgdGhlIEVDIG1lbWJlcnMgdG8g cmVmZXJlbmNlIHRoZSByZW1haW5pbmcgcmVsYXRpb24gaW5zdGVhZAorCQkgKiBvZiB0aGUg cmVtb3ZlZCBvbmUuCisJCSAqLworCQl1cGRhdGVfZWNfbWVtYmVycyhlYywgdG9SZW1vdmUt PnJlbGlkLCB0b0tlZXAtPnJlbGlkKTsKKwkJZWMtPmVjX3JlbGlkcyA9IGNoYW5nZV9yZWxp ZChlYy0+ZWNfcmVsaWRzLCB0b1JlbW92ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCisJ CS8qCisJCSAqIFdlIHdpbGwgbm93IHVwZGF0ZSBzb3VyY2UgYW5kIGRlcml2ZWQgY2xhdXNl cyBvZiB0aGUgRUMuCisJCSAqCisJCSAqIFJlc3RyaWN0aW9uIGNsYXVzZXMgZm9yIGJhc2Ug cmVsYXRpb25zIGFyZSBhbHJlYWR5IGRpc3RyaWJ1dGVkIHRvCisJCSAqIHRoZSByZXNwZWN0 aXZlIGJhc2VyZXN0cmljdGluZm8gbGlzdHMgKHNlZQorCQkgKiBnZW5lcmF0ZV9pbXBsaWVk X2VxdWFsaXRpZXMpLiBUaGUgYWJvdmUgY29kZSBoYXMgYWxyZWFkeSBwcm9jZXNzZWQKKwkJ ICogdGhpcyBsaXN0LCBhbmQgdXBkYXRlZCB0aGVzZSBjbGF1c2VzIHRvIHJlZmVyZW5jZSB0 aGUgcmVtYWluaW5nCisJCSAqIHJlbGF0aW9uLCBzbyB3ZSBjYW4gc2tpcCB0aGVtIGhlcmUg YmFzZWQgb24gdGhlaXIgcmVsaWRzLgorCQkgKgorCQkgKiBMaWtld2lzZSwgd2UgaGF2ZSBh bHJlYWR5IHByb2Nlc3NlZCB0aGUgam9pbiBjbGF1c2VzIHRoYXQgam9pbiB0aGUKKwkJICog cmVtb3ZlZCByZWxhdGlvbiB0byB0aGUgcmVtYWluaW5nIG9uZS4KKwkJICoKKwkJICogRmlu YWxseSwgdGhlcmUgYXJlIGpvaW4gY2xhdXNlcyB0aGF0IGpvaW4gdGhlIHJlbW92ZWQgcmVs YXRpb24gdG8KKwkJICogc29tZSB0aGlyZCByZWxhdGlvbi4gV2UgY2FuJ3QganVzdCBkZWxl dGUgdGhlIHNvdXJjZSBjbGF1c2VzIGFuZAorCQkgKiByZWdlbmVyYXRlIHRoZW0gZnJvbSB0 aGUgRUMsIGJlY2F1c2UgdGhlIGNvcnJlc3BvbmRpbmcgZXF1YWxpdHkKKwkJICogb3BlcmF0 b3JzIG1pZ2h0IGJlIG1pc3NpbmcgKHNlZSB0aGUgaGFuZGxpbmcgb2YgZWNfYnJva2VuKS4K KwkJICogVGhlcmVmb3JlLCB3ZSB3aWxsIHVwZGF0ZSB0aGUgcmVmZXJlbmNlcyBpbiB0aGUg c291cmNlIGNsYXVzZXMuCisJCSAqCisJCSAqIERlcml2ZWQgY2xhdXNlcyBjYW4gYmUgZ2Vu ZXJhdGVkIGFnYWluLCBzbyBpdCBpcyBzaW1wbGVyIHRvIGp1c3QKKwkJICogZGVsZXRlIHRo ZW0uCisJCSAqLworCQlsaXN0X2ZyZWUoZWMtPmVjX2Rlcml2ZXMpOworCQllYy0+ZWNfZGVy aXZlcyA9IE5VTEw7CisJCXVwZGF0ZV9lY19zb3VyY2VzKCZlYy0+ZWNfc291cmNlcywgdG9S ZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlkKTsKKwl9CisKKwkvKgorCSAqIFRyYW5zZmVy IHRoZSB0YXJnZXRsaXN0IGFuZCBhdHRyX25lZWRlZCBmbGFncy4KKwkgKi8KKwlBc3NlcnQo dG9SZW1vdmUtPnJlbHRhcmdldC0+c29ydGdyb3VwcmVmcyA9PSAwKTsKKworCWZvcmVhY2go Y2VsbCwgdG9SZW1vdmUtPnJlbHRhcmdldC0+ZXhwcnMpCisJeworCQlFeHByCSAgICpub2Rl ID0gbGZpcnN0KGNlbGwpOworCisJCWNoYW5nZV92YXJubyhub2RlLCB0b1JlbW92ZS0+cmVs aWQsIHRvS2VlcC0+cmVsaWQpOworCQlpZiAoIWxpc3RfbWVtYmVyKHRvS2VlcC0+cmVsdGFy Z2V0LT5leHBycywgbm9kZSkpCisJCQl0b0tlZXAtPnJlbHRhcmdldC0+ZXhwcnMgPSBsYXBw ZW5kKHRvS2VlcC0+cmVsdGFyZ2V0LT5leHBycywgbm9kZSk7CisJfQorCisJZm9yIChpID0g dG9LZWVwLT5taW5fYXR0cjsgaSA8PSB0b0tlZXAtPm1heF9hdHRyOyBpKyspCisJeworCQlp bnQJCQlhdHRubyA9IGkgLSB0b0tlZXAtPm1pbl9hdHRyOworCisJCXRvS2VlcC0+YXR0cl9u ZWVkZWRbYXR0bm9dID0gYm1zX2FkZF9tZW1iZXJzKHRvS2VlcC0+YXR0cl9uZWVkZWRbYXR0 bm9dLAorCQkJCQkJCQkJCQkJCSB0b1JlbW92ZS0+YXR0cl9uZWVkZWRbYXR0bm9dKTsKKwl9 CisKKwkvKgorCSAqIElmIHRoZSByZW1vdmVkIHJlbGF0aW9uIGhhcyBhIHJvdyBtYXJrLCB0 cmFuc2ZlciBpdCB0byB0aGUgcmVtYWluaW5nCisJICogb25lLgorCSAqCisJICogSWYgYm90 aCByZWxzIGhhdmUgcm93IG1hcmtzLCBqdXN0IGtlZXAgdGhlIG9uZSBjb3JyZXNwb25kaW5n IHRvIHRoZQorCSAqIHJlbWFpbmluZyByZWxhdGlvbiwgYmVjYXVzZSB3ZSB2ZXJpZmllZCBl YXJsaWVyIHRoYXQgdGhleSBoYXZlIHRoZSBzYW1lCisJICogc3RyZW5ndGguCisJICoKKwkg KiBBbHNvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzY3JhdGNoLT5yb3dfbWFya3MgY2FjaGUgaXMg dXAgdG8gZGF0ZSwgYmVjYXVzZQorCSAqIHdlIGFyZSBnb2luZyB0byB1c2UgaXQgZm9yIGZ1 cnRoZXIgam9pbiByZW1vdmFscy4KKwkgKi8KKwlpZiAocm1hcmspCisJeworCQlpZiAoa21h cmspCisJCXsKKwkJCUFzc2VydChrbWFyay0+bWFya1R5cGUgPT0gcm1hcmstPm1hcmtUeXBl KTsKKworCQkJLyoKKwkJCSAqIFhYWDogV2h5IGhlcmUgd2UgaGF2ZW4ndCBhbnkgZGlmZmVy ZW5jZXMgaW4gcmVtb3Zpbmcgcm1hcmsgb3IKKwkJCSAqIGttYXJrPworCQkJICovCisJCQly b290LT5yb3dNYXJrcyA9IGxpc3RfZGVsZXRlX3B0cihyb290LT5yb3dNYXJrcywgcm1hcmsp OworCQl9CisJCWVsc2UKKwkJeworCQkJLyogU2hvdWxkbid0IGhhdmUgaW5oZXJpdGFuY2Ug Y2hpbGRyZW4gaGVyZS4gKi8KKwkJCUFzc2VydChybWFyay0+cnRpID09IHJtYXJrLT5wcnRp KTsKKworCQkJcm1hcmstPnJ0aSA9IHJtYXJrLT5wcnRpID0gdG9LZWVwLT5yZWxpZDsKKwkJ fQorCX0KKworCS8qCisJICogQ2hhbmdlIHZhcm5vIGluIHNvbWUgc3BlY2lhbCBjYXNlcyB3 aXRoIG5vbi10cml2aWFsIFJhbmdlVGJsRW50cnkKKwkgKi8KKwlmb3JlYWNoKGNlbGwsIHJv b3QtPnBhcnNlLT5ydGFibGUpCisJeworCQlSYW5nZVRibEVudHJ5ICpydGUgPSBsZmlyc3Qo Y2VsbCk7CisKKwkJc3dpdGNoIChydGUtPnJ0ZWtpbmQpCisJCXsKKwkJCWNhc2UgUlRFX0ZV TkNUSU9OOgorCQkJCWNoYW5nZV92YXJubygoRXhwciAqKSBydGUtPmZ1bmN0aW9ucywgdG9S ZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlkKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUlRF X1RBQkxFRlVOQzoKKwkJCQljaGFuZ2VfdmFybm8oKEV4cHIgKikgcnRlLT50YWJsZWZ1bmMs IHRvUmVtb3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisJCQkJYnJlYWs7CisJCQljYXNl IFJURV9WQUxVRVM6CisJCQkJY2hhbmdlX3Zhcm5vKChFeHByICopIHJ0ZS0+dmFsdWVzX2xp c3RzLCB0b1JlbW92ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCQkJCWJyZWFrOworCQkJ ZGVmYXVsdDoKKwkJCQkvKiBubyBvcCAqLworCQkJCWJyZWFrOworCQl9CisJfQorCisJLyoK KwkgKiBSZXBsYWNlIHZhcm5vIGluIHJvb3QgdGFyZ2V0bGlzdCBhbmQgSEFWSU5HIGNsYXVz ZS4KKwkgKi8KKwljaGFuZ2VfdmFybm8oKEV4cHIgKikgcm9vdC0+cHJvY2Vzc2VkX3RsaXN0 LCB0b1JlbW92ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCWNoYW5nZV92YXJubygoRXhw ciAqKSByb290LT5wYXJzZS0+aGF2aW5nUXVhbCwgdG9SZW1vdmUtPnJlbGlkLCB0b0tlZXAt PnJlbGlkKTsKKworCS8qCisJICogVHJhbnNmZXIgam9pbiBhbmQgcmVzdHJpY3Rpb24gY2xh dXNlcyBmcm9tIHRoZSByZW1vdmVkIHJlbGF0aW9uIHRvIHRoZQorCSAqIHJlbWFpbmluZyBv bmUuIFdlIGNoYW5nZSB0aGUgVmFycyBvZiB0aGUgY2xhdXNlIHRvIHBvaW50IHRvIHRoZQor CSAqIHJlbWFpbmluZyByZWxhdGlvbiBpbnN0ZWFkIG9mIHRoZSByZW1vdmVkIG9uZS4gVGhl IGNsYXVzZXMgdGhhdCByZXF1aXJlCisJICogYSBzdWJzZXQgb2Ygam9pbnJlbGlkcyBiZWNv bWUgcmVzdHJpY3Rpb24gY2xhdXNlcyBvZiB0aGUgcmVtYWluaW5nCisJICogcmVsYXRpb24s IGFuZCBvdGhlcnMgcmVtYWluIGpvaW4gY2xhdXNlcy4gV2UgYXBwZW5kIHRoZW0gdG8KKwkg KiBiYXNlcmVzdHJpY3RpbmZvIGFuZCBqb2luaW5mbyByZXNwZWN0aXZlbHksIHRyeWluZyBu b3QgdG8gaW50cm9kdWNlCisJICogZHVwbGljYXRlcy4KKwkgKgorCSAqIFdlIGFsc28gaGF2 ZSB0byBwcm9jZXNzIHRoZSAnam9pbmNsYXVzZXMnIGxpc3QgaGVyZSwgYmVjYXVzZSBpdAor CSAqIGNvbnRhaW5zIEVDLWRlcml2ZWQgam9pbiBjbGF1c2VzIHdoaWNoIG11c3QgYmVjb21l IGZpbHRlciBjbGF1c2VzLiBJdAorCSAqIGlzIG5vdCBlbm91Z2ggdG8ganVzdCBjb3JyZWN0 IHRoZSBFQ3MsIGJlY2F1c2UgdGhlIEVDLWRlcml2ZWQKKwkgKiByZXN0cmljdGlvbnMgYXJl IGdlbmVyYXRlZCBiZWZvcmUgam9pbiByZW1vdmFsIChzZWUKKwkgKiBnZW5lcmF0ZV9iYXNl X2ltcGxpZWRfZXF1YWxpdGllcykuCisJICovCit9CisKKy8qCisgKiBzcGxpdF9zZWxmam9p bl9xdWFscworICoJCVByb2Nlc3NlcyAnam9pbnF1YWxzJyBidWlsZGluZyB0d28gbGlzdHMs IG9uZSB3aXRoIGEgbGlzdCBvZiBxdWFscworICoJCXdoZXJlIHRoZSBjb2x1bW5zL2V4cHJz IG9uIGVpdGhlciBzaWRlIG9mIHRoZSBqb2luIG1hdGNoIGFuZCBhbm90aGVyCisgKgkJbGlz dCBjb250YWluaW5nIHRoZSByZW1haW5pbmcgcXVhbHMuCisgKgorICogJ2pvaW5xdWFscycg bXVzdCBvbmx5IGNvbnRhaW4gcXVhbHMgZm9yIGEgUlRFX1JFTEFUSU9OIGJlaW5nIGpvaW5l ZCB0bworICogaXRzZWxmLgorICovCitzdGF0aWMgdm9pZAorc3BsaXRfc2VsZmpvaW5fcXVh bHMoUGxhbm5lckluZm8gKnJvb3QsIExpc3QgKmpvaW5xdWFscywgTGlzdCAqKnNlbGZqb2lu cXVhbHMsCisJCQkJCSBMaXN0ICoqb3RoZXJqb2lucXVhbHMpCit7CisJTGlzdENlbGwgICAq bGM7CisJTGlzdAkgICAqc2pvaW5xdWFscyA9IE5JTDsKKwlMaXN0CSAgICpvam9pbnF1YWxz ID0gTklMOworCisJZm9yZWFjaChsYywgam9pbnF1YWxzKQorCXsKKwkJUmVzdHJpY3RJbmZv ICpyaW5mbyA9IGxmaXJzdF9ub2RlKFJlc3RyaWN0SW5mbywgbGMpOworCQlPcEV4cHIJICAg KmV4cHI7CisJCUV4cHIJICAgKmxlZnRleHByOworCQlFeHByCSAgICpyaWdodGV4cHI7CisK KwkJLyogSW4gZ2VuZXJhbCwgY2xhdXNlIGxvb2tzIGxpa2UgRihhcmcxKSA9IEcoYXJnMikg PyAqLworCQlpZiAoIXJpbmZvLT5tZXJnZW9wZmFtaWxpZXMgfHwKKwkJCWJtc19udW1fbWVt YmVycyhyaW5mby0+Y2xhdXNlX3JlbGlkcykgIT0gMiB8fAorCQkJYm1zX251bV9tZW1iZXJz KHJpbmZvLT5sZWZ0X3JlbGlkcykgIT0gMSB8fAorCQkJYm1zX251bV9tZW1iZXJzKHJpbmZv LT5yaWdodF9yZWxpZHMpICE9IDEpCisJCXsKKwkJCW9qb2lucXVhbHMgPSBsYXBwZW5kKG9q b2lucXVhbHMsIHJpbmZvKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZXhwciA9IChPcEV4 cHIgKikgcmluZm8tPmNsYXVzZTsKKworCQlpZiAoIUlzQShleHByLCBPcEV4cHIpIHx8IGxp c3RfbGVuZ3RoKGV4cHItPmFyZ3MpICE9IDIpCisJCXsKKwkJCW9qb2lucXVhbHMgPSBsYXBw ZW5kKG9qb2lucXVhbHMsIHJpbmZvKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbGVmdGV4 cHIgPSAoRXhwciAqKSBjb3B5T2JqZWN0KGdldF9sZWZ0b3AocmluZm8tPmNsYXVzZSkpOwor CQlyaWdodGV4cHIgPSAoRXhwciAqKSBjb3B5T2JqZWN0KGdldF9yaWdodG9wKHJpbmZvLT5j bGF1c2UpKTsKKworCQkvKiBDYW4ndCBtYXRjaCBvZiB0aGUgZXhwcnMgYXJlIG5vdCBvZiB0 aGUgc2FtZSB0eXBlICovCisJCWlmIChsZWZ0ZXhwci0+dHlwZSAhPSByaWdodGV4cHItPnR5 cGUpCisJCXsKKwkJCW9qb2lucXVhbHMgPSBsYXBwZW5kKG9qb2lucXVhbHMsIHJpbmZvKTsK KwkJCWNvbnRpbnVlOworCQl9CisKKwkJY2hhbmdlX3Zhcm5vKHJpZ2h0ZXhwciwKKwkJCQkJ IGJtc19uZXh0X21lbWJlcihyaW5mby0+cmlnaHRfcmVsaWRzLCAtMSksCisJCQkJCSBibXNf bmV4dF9tZW1iZXIocmluZm8tPmxlZnRfcmVsaWRzLCAtMSkpOworCisJCWlmIChlcXVhbChs ZWZ0ZXhwciwgcmlnaHRleHByKSkKKwkJCXNqb2lucXVhbHMgPSBsYXBwZW5kKHNqb2lucXVh bHMsIHJpbmZvKTsKKwkJZWxzZQorCQkJb2pvaW5xdWFscyA9IGxhcHBlbmQob2pvaW5xdWFs cywgcmluZm8pOworCX0KKworCSpzZWxmam9pbnF1YWxzID0gc2pvaW5xdWFsczsKKwkqb3Ro ZXJqb2lucXVhbHMgPSBvam9pbnF1YWxzOworfQorCisvKgorICogQ2hlY2sgZm9yIGEgY2Fz ZSB3aGVuIHVuaXF1ZW5lc3MgW3BhcnRseV0gZGVyaXZlZCBmcm9tIGEgYmFzZXJlc3RyaWN0 aW5mbworICogY2xhdXNlLiBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSBhIGNoYW5jZSB0byByZXR1 cm4gb25seSBvbmUgcm93IChpZiBzdWNoCisgKiBjbGF1c2VzIG9uIGJvdGggc2lkZXMgb2Yg U0ogaXMgZXF1YWwpIG9yIG5vdGhpbmcgLSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQuCisgKi8K K3N0YXRpYyBib29sCittYXRjaF91bmlxdWVfY2xhdXNlcyhSZWxPcHRJbmZvICpvdXRlciwg TGlzdCAqdWNsYXVzZXMsIEluZGV4IHJlbGlkKQoreworCUxpc3RDZWxsICAgKmxjOworCisJ Zm9yZWFjaChsYywgdWNsYXVzZXMpCisJeworCQlSZXN0cmljdEluZm8gKnJpbmZvID0gbGZp cnN0X25vZGUoUmVzdHJpY3RJbmZvLCBsYyk7CisJCUV4cHIJICAgKmNsYXVzZTsKKwkJRXhw cgkgICAqYzE7CisJCWJvb2wJCW1hdGNoZWQgPSBmYWxzZTsKKwkJTGlzdENlbGwgICAqb2xj OworCisJCUFzc2VydChvdXRlci0+cmVsaWQgPiAwICYmIHJlbGlkID4gMCk7CisKKwkJLyog T25seSBmaWx0ZXJzIGxpa2UgeCA9PSBjb25zdCB3ZSBzaG91bGQgY29uc2lkZXIuICovCisJ CUFzc2VydChibXNfaXNfZW1wdHkocmluZm8tPmxlZnRfcmVsaWRzKSB8fAorCQkJICAgYm1z X2lzX2VtcHR5KHJpbmZvLT5yaWdodF9yZWxpZHMpKTsKKworCQljbGF1c2UgPSAoRXhwciAq KSBjb3B5T2JqZWN0KHJpbmZvLT5jbGF1c2UpOworCQljaGFuZ2VfdmFybm8oY2xhdXNlLCBy ZWxpZCwgb3V0ZXItPnJlbGlkKTsKKworCQljMSA9IChFeHByICopIChyaW5mby0+b3V0ZXJf aXNfbGVmdCA/CisJCQkJCSAgIGdldF9sZWZ0b3AoY2xhdXNlKSA6IGdldF9yaWdodG9wKGNs YXVzZSkpOworCQljbGF1c2UgPSAoRXhwciAqKSAocmluZm8tPm91dGVyX2lzX2xlZnQgPwor CQkJCQkJICAgZ2V0X3JpZ2h0b3AoY2xhdXNlKSA6IGdldF9sZWZ0b3AoY2xhdXNlKSk7CisK KwkJLyoKKwkJICogQ29tcGFyZSB0aGVzZSBsZWZ0IGFuZCByaWdodCBzaWRlcyB3aXRoIGNv cnJlc3BvbmRpbmcgc2lkZXMgb2YgdGhlCisJCSAqIG91dGVyJ3MgZmlsdGVycy4gSWYgbm8g b25lIGRldGVjdGVkIC0gcmV0dXJuIGltbWVkaWF0ZWx5LgorCQkgKi8KKwkJZm9yZWFjaChv bGMsIG91dGVyLT5iYXNlcmVzdHJpY3RpbmZvKQorCQl7CisJCQlSZXN0cmljdEluZm8gKm9y aW5mbyA9IGxmaXJzdF9ub2RlKFJlc3RyaWN0SW5mbywgb2xjKTsKKwkJCUV4cHIJICAgKm9j bGF1c2U7CisJCQlFeHByCSAgICpjMjsKKworCQkJaWYgKG9yaW5mby0+bWVyZ2VvcGZhbWls aWVzID09IE5JTCkKKwkJCQkvKiBEb24ndCBjb25zaWRlciBjbGF1c2VzIHdoaWNoIGFyZW4n dCBzaW1pbGFyIHRvICdGKFgpPUcoWSknICovCisJCQkJY29udGludWU7CisKKwkJCW9jbGF1 c2UgPSAoRXhwciAqKSAoYm1zX2lzX2VtcHR5KG9yaW5mby0+bGVmdF9yZWxpZHMpID8KKwkJ CQkJCQkJZ2V0X3JpZ2h0b3Aob3JpbmZvLT5jbGF1c2UpIDogZ2V0X2xlZnRvcChvcmluZm8t PmNsYXVzZSkpOworCQkJYzIgPSAoRXhwciAqKSAoYm1zX2lzX2VtcHR5KG9yaW5mby0+bGVm dF9yZWxpZHMpID8KKwkJCQkJCSAgIGdldF9sZWZ0b3Aob3JpbmZvLT5jbGF1c2UpIDogZ2V0 X3JpZ2h0b3Aob3JpbmZvLT5jbGF1c2UpKTsKKworCQkJaWYgKGVxdWFsKGNsYXVzZSwgb2Ns YXVzZSkgJiYgZXF1YWwoYzEsIGMyKSkKKwkJCXsKKwkJCQltYXRjaGVkID0gdHJ1ZTsKKwkJ CQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICghbWF0Y2hlZCkKKwkJCXJldHVybiBmYWxz ZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIEZpbmQgYW5kIHJlbW92ZSB1 bmlxdWUgc2VsZiBqb2lucyBpbiBhIGdyb3VwIG9mIGJhc2UgcmVsYXRpb25zIHRoYXQgaGF2 ZQorICogdGhlIHNhbWUgT2lkLgorICoKKyAqIFJldHVybnMgYSBzZXQgb2YgcmVsaWRzIHRo YXQgd2VyZSByZW1vdmVkLgorICovCitzdGF0aWMgUmVsaWRzCityZW1vdmVfc2VsZl9qb2lu c19vbmVfZ3JvdXAoUGxhbm5lckluZm8gKnJvb3QsIFJlbGlkcyByZWxpZHMpCit7CisJUmVs aWRzCQlqb2lucmVsaWRzID0gTlVMTDsKKwlSZWxpZHMJCXJlc3VsdCA9IE5VTEw7CisJaW50 CQkJazsJCQkJLyogSW5kZXggb2Yga2VwdCByZWxhdGlvbiAqLworCWludAkJCXIgPSAtMTsJ CQkvKiBJbmRleCBvZiByZW1vdmVkIHJlbGF0aW9uICovCisKKwlpZiAoYm1zX251bV9tZW1i ZXJzKHJlbGlkcykgPCAyKQorCQlyZXR1cm4gTlVMTDsKKworCXdoaWxlICgociA9IGJtc19u ZXh0X21lbWJlcihyZWxpZHMsIHIpKSA+IDApCisJeworCQlSZWxPcHRJbmZvICpvdXRlciA9 IHJvb3QtPnNpbXBsZV9yZWxfYXJyYXlbcl07CisKKwkJayA9IHI7CisKKwkJd2hpbGUgKChr ID0gYm1zX25leHRfbWVtYmVyKHJlbGlkcywgaykpID4gMCkKKwkJeworCQkJUmVsT3B0SW5m byAqaW5uZXIgPSByb290LT5zaW1wbGVfcmVsX2FycmF5W2tdOworCQkJTGlzdAkgICAqcmVz dHJpY3RsaXN0OworCQkJTGlzdAkgICAqc2VsZmpvaW5xdWFsczsKKwkJCUxpc3QJICAgKm90 aGVyam9pbnF1YWxzOworCQkJTGlzdENlbGwgICAqbGM7CisJCQlib29sCQlqaW5mb19jaGVj ayA9IHRydWU7CisJCQlQbGFuUm93TWFyayAqb21hcmsgPSBOVUxMOworCQkJUGxhblJvd01h cmsgKmltYXJrID0gTlVMTDsKKwkJCUxpc3QJICAgKnVjbGF1c2VzID0gTklMOworCisJCQkv KiBBIHNhbml0eSBjaGVjazogdGhlIHJlbGF0aW9ucyBoYXZlIHRoZSBzYW1lIE9pZC4gKi8K KwkJCUFzc2VydChyb290LT5zaW1wbGVfcnRlX2FycmF5W2tdLT5yZWxpZCA9PQorCQkJCSAg IHJvb3QtPnNpbXBsZV9ydGVfYXJyYXlbcl0tPnJlbGlkKTsKKworCQkJLyoKKwkJCSAqIEl0 IGlzIGltcG9zc2libGUgdG8gb3B0aW1pemUgdHdvIHJlbGF0aW9ucyBpZiB0aGV5IGJlbG9u ZyB0bworCQkJICogZGlmZmVyZW50IHJ1bGVzIG9mIG9yZGVyIHJlc3RyaWN0aW9uLiBPdGhl cndpc2UgcGxhbm5lciBjYW4ndAorCQkJICogYmUgYWJsZSB0byBmaW5kIGFueSB2YXJpYW50 cyBvZiBjb3JyZWN0IHF1ZXJ5IHBsYW4uCisJCQkgKi8KKwkJCWZvcmVhY2gobGMsIHJvb3Qt PmpvaW5faW5mb19saXN0KQorCQkJeworCQkJCVNwZWNpYWxKb2luSW5mbyAqaW5mbyA9IChT cGVjaWFsSm9pbkluZm8gKikgbGZpcnN0KGxjKTsKKworCQkJCWlmICgoYm1zX2lzX21lbWJl cihrLCBpbmZvLT5zeW5fbGVmdGhhbmQpIF4KKwkJCQkJIGJtc19pc19tZW1iZXIociwgaW5m by0+c3luX2xlZnRoYW5kKSkgfHwKKwkJCQkJKGJtc19pc19tZW1iZXIoaywgaW5mby0+c3lu X3JpZ2h0aGFuZCkgXgorCQkJCQkgYm1zX2lzX21lbWJlcihyLCBpbmZvLT5zeW5fcmlnaHRo YW5kKSkpCisJCQkJeworCQkJCQlqaW5mb19jaGVjayA9IGZhbHNlOworCQkJCQlicmVhazsK KwkJCQl9CisJCQl9CisKKwkJCWlmICghamluZm9fY2hlY2spCisJCQkJY29udGludWU7CisK KwkJCS8qIFJldXNlIGpvaW5yZWxpZHMgYml0c2V0IHRvIGF2b2lkIHJlYWxsb2NhdGlvbi4g Ki8KKwkJCWpvaW5yZWxpZHMgPSBibXNfZGVsX21lbWJlcnMoam9pbnJlbGlkcywgam9pbnJl bGlkcyk7CisKKwkJCS8qCisJCQkgKiBXZSBvbmx5IGRlYWwgd2l0aCBiYXNlIHJlbHMgaGVy ZSwgc28gdGhlaXIgcmVsaWRzIGJpdHNldAorCQkJICogY29udGFpbnMgb25seSBvbmUgbWVt YmVyIC0tIHRoZWlyIHJlbGlkLgorCQkJICovCisJCQlqb2lucmVsaWRzID0gYm1zX2FkZF9t ZW1iZXIoam9pbnJlbGlkcywgcik7CisJCQlqb2lucmVsaWRzID0gYm1zX2FkZF9tZW1iZXIo am9pbnJlbGlkcywgayk7CisKKwkJCS8qCisJCQkgKiBBdCB0aGlzIHN0YWdlIGpvaW5pbmZv IGxpc3RzIG9mIGlubmVyIGFuZCBvdXRlciBjYW4gY29udGFpbgorCQkJICogb25seSBjbGF1 c2VzLCByZXF1aXJlZCBmb3IgYSBzdXBlcmlvciBvdXRlciBqb2luIHRoYXQgY2FuJ3QKKwkJ CSAqIGluZmx1ZW5jZSBvbiB0aGlzIG9wdGltaXphdGlvbi4gU28sIHdlIGNhbiBhdm9pZCB0 byBjYWxsIHRoZQorCQkJICogYnVpbGRfam9pbnJlbF9yZXN0cmljdGxpc3QoKSByb3V0aW5l LgorCQkJICovCisJCQlyZXN0cmljdGxpc3QgPSBnZW5lcmF0ZV9qb2luX2ltcGxpZWRfZXF1 YWxpdGllcyhyb290LCBqb2lucmVsaWRzLAorCQkJCQkJCQkJCQkJCQkJb3V0ZXItPnJlbGlk cywKKwkJCQkJCQkJCQkJCQkJCWlubmVyKTsKKworCQkJLyoKKwkJCSAqIFByb2Nlc3MgcmVz dHJpY3RsaXN0IHRvIHNlcGVyYXRlIG91dCB0aGUgc2VsZiBqb2luIHF1YWxzIGZyb20KKwkJ CSAqIHRoZSBvdGhlciBxdWFscy4gZS5nIHggPSB4IGdvZXMgdG8gc2VsZmpvaW5xdWFscyBh bmQgYSA9IGIgdG8KKwkJCSAqIG90aGVyam9pbnF1YWxzLgorCQkJICovCisJCQlzcGxpdF9z ZWxmam9pbl9xdWFscyhyb290LCByZXN0cmljdGxpc3QsICZzZWxmam9pbnF1YWxzLAorCQkJ CQkJCQkgJm90aGVyam9pbnF1YWxzKTsKKworCQkJLyogSXMgaXQgYW4gdW5pcXVlIHNlbGYg am9pbj8gKi8KKworCQkJaWYgKGxpc3RfbGVuZ3RoKHNlbGZqb2lucXVhbHMpID09IDApCisJ CQl7CisJCQkJLyoKKwkJCQkgKiBYWFg6IHdlIHdvdWxkIGRldGVjdCBzZWxmLWpvaW4gd2l0 aG91dCBxdWFscyBsaWtlICd4PT14JyBpZgorCQkJCSAqIHdlIGhhZCBhbiBmb3JlaWduIGtl eSBjb25zdHJhaW50IG9uIHNvbWUgb2Ygb3RoZXIgcXVhbHMgYW5kCisJCQkJICogdGhpcyBq b2luIGhhdmVuJ3QgYW55IGNvbHVtbnMgZnJvbSB0aGUgb3V0ZXIgaW4gdGhlIHRhcmdldAor CQkJCSAqIGxpc3QuIEJ1dCBpdCBpcyBzdGlsbCBjb21wbGV4IHRhc2suCisJCQkJICovCisJ CQkJY29udGludWU7CisJCQl9CisKKwkJCS8qCisJCQkgKiBEZXRlcm1pbmUgaWYgdGhlIGlu bmVyIHRhYmxlIGNhbiBkdXBsaWNhdGUgb3V0ZXIgcm93cy4gIFdlIG11c3QKKwkJCSAqIGJ5 cGFzcyB0aGUgdW5pcXVlIHJlbCBjYWNoZSBoZXJlIHNpbmNlIHdlJ3JlIHBvc3NpYmx5IHVz aW5nIGEKKwkJCSAqIHN1YnNldCBvZiBqb2luIHF1YWxzLiBXZSBjYW4gdXNlICdmb3JjZV9j YWNoZScgPSB0cnVlIHdoZW4gYWxsCisJCQkgKiBqb2luIHF1YWxzIGFyZSBzZWxmam9pbiBx dWFscy4gIE90aGVyd2lzZSB3ZSBjb3VsZCBlbmQgdXAKKwkJCSAqIHB1dHRpbmcgZmFsc2Ug bmVnYXRpdmVzIGluIHRoZSBjYWNoZS4KKwkJCSAqLworCQkJaWYgKCFpbm5lcnJlbF9pc191 bmlxdWVfZXh0KHJvb3QsIGpvaW5yZWxpZHMsIG91dGVyLT5yZWxpZHMsCisJCQkJCQkJCQkJ aW5uZXIsIEpPSU5fSU5ORVIsIHNlbGZqb2lucXVhbHMsCisJCQkJCQkJCQkJbGlzdF9sZW5n dGgob3RoZXJqb2lucXVhbHMpID09IDAsCisJCQkJCQkJCQkJJnVjbGF1c2VzKSkKKwkJCQlj b250aW51ZTsKKworCQkJLyoKKwkJCSAqIFdlIGhhdmUgcHJvdmVuIHRoYXQgZm9yIGJvdGgg cmVsYXRpb25zLCB0aGUgc2FtZSB1bmlxdWUgaW5kZXgKKwkJCSAqIGd1YXJhbnRlZXMgdGhh dCB0aGVyZSBpcyBhdCBtb3N0IG9uZSByb3cgd2hlcmUgY29sdW1ucyBlcXVhbAorCQkJICog Z2l2ZW4gdmFsdWVzLiBUaGVzZSB2YWx1ZXMgbXVzdCBiZSB0aGUgc2FtZSBmb3IgYm90aCBy ZWxhdGlvbnMsCisJCQkgKiBvciBlbHNlIHdlIHdvbid0IG1hdGNoIHRoZSBzYW1lIHJvdyBv biBlYWNoIHNpZGUgb2Ygam9pbi4KKwkJCSAqLworCQkJaWYgKCFtYXRjaF91bmlxdWVfY2xh dXNlcyhvdXRlciwgdWNsYXVzZXMsIGlubmVyLT5yZWxpZCkpCisJCQkJY29udGludWU7CisK KwkJCS8qIFNlZSBmb3Igcm93IG1hcmtzLiAqLworCQkJZm9yZWFjaChsYywgcm9vdC0+cm93 TWFya3MpCisJCQl7CisJCQkJUGxhblJvd01hcmsgKnJvd01hcmsgPSAoUGxhblJvd01hcmsg KikgbGZpcnN0KGxjKTsKKworCQkJCWlmIChyb3dNYXJrLT5ydGkgPT0gaykKKwkJCQl7CisJ CQkJCUFzc2VydChpbWFyayA9PSBOVUxMKTsKKwkJCQkJaW1hcmsgPSByb3dNYXJrOworCQkJ CX0KKwkJCQllbHNlIGlmIChyb3dNYXJrLT5ydGkgPT0gcikKKwkJCQl7CisJCQkJCUFzc2Vy dChvbWFyayA9PSBOVUxMKTsKKwkJCQkJb21hcmsgPSByb3dNYXJrOworCQkJCX0KKworCQkJ CWlmIChvbWFyayAmJiBpbWFyaykKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qCisJCQkg KiBXZSBjYW4ndCByZW1vdmUgdGhlIGpvaW4gaWYgdGhlIHJlbGF0aW9ucyBoYXZlIHJvdyBt YXJrcyBvZgorCQkJICogZGlmZmVyZW50IHN0cmVuZ3RoIChlLmcuIG9uZSBpcyBsb2NrZWQg Rk9SIFVQREFURSBhbmQgYW5vdGhlcgorCQkJICoganVzdCBoYXMgUk9XX01BUktfUkVGRVJF TkNFIGZvciBFdmFsUGxhblF1YWwgcmVjaGVja2luZykuCisJCQkgKi8KKwkJCWlmIChvbWFy ayAmJiBpbWFyayAmJiBvbWFyay0+bWFya1R5cGUgIT0gaW1hcmstPm1hcmtUeXBlKQorCQkJ CWNvbnRpbnVlOworCisJCQkvKgorCQkJICogQmUgc2FmZSB0byBkbyBub3QgcmVtb3ZlIHRh YmxlIHBhcnRpY2lwYXRlZCBpbiBjb21wbGljYXRlZCBQSAorCQkJICovCisJCQlmb3JlYWNo KGxjLCByb290LT5wbGFjZWhvbGRlcl9saXN0KQorCQkJeworCQkJCVBsYWNlSG9sZGVySW5m byAqcGhpbmZvID0gKFBsYWNlSG9sZGVySW5mbyAqKSBsZmlyc3QobGMpOworCisJCQkJLyog dGhlcmUgaXNuJ3QgYW55IG90aGVyIHBsYWNlIHRvIGV2YWwgUEhWICovCisJCQkJaWYgKGJt c19pc19zdWJzZXQocGhpbmZvLT5waF9ldmFsX2F0LCBqb2lucmVsaWRzKSB8fAorCQkJCQli bXNfaXNfc3Vic2V0KHBoaW5mby0+cGhfbmVlZGVkLCBqb2lucmVsaWRzKSkKKwkJCQkJYnJl YWs7CisJCQl9CisKKwkJCWlmIChsYykKKwkJCQljb250aW51ZTsKKworCQkJLyoKKwkJCSAq IFdlIGNhbiByZW1vdmUgZWl0aGVyIHJlbGF0aW9uLCBzbyByZW1vdmUgdGhlIG91dGVyIG9u ZSwgdG8KKwkJCSAqIHNpbXBsaWZ5IHRoaXMgbG9vcC4KKwkJCSAqLworCisJCQkvKgorCQkJ ICogQXR0YWNoIHRoZSByZXN0cmljdGlvbnMgdG8gcmVtb3ZpbmcgcmVsYXRpb24gdG8gc2lt cGxpZnkgcmVsaWRzCisJCQkgKiByZXBsYWNpbmcgcHJvY2VkdXJlLiBqb2luaW5mbyBjbGF1 c2VzIG9mIHJlbW92aW5nIHJlbGF0aW9uIHdpbGwKKwkJCSAqIGJlIG1vdmVkIHRvIHRoZSBr ZWVwaW5nIGJ5IHRoZSByZW1vdmVfcmVsX2Zyb21fcXVlcnkoKS4KKwkJCSAqLworCQkJb3V0 ZXItPmJhc2VyZXN0cmljdGluZm8gPSBsaXN0X2NvbmNhdChvdXRlci0+YmFzZXJlc3RyaWN0 aW5mbywKKwkJCQkJCQkJCQkJCSAgcmVzdHJpY3RsaXN0KTsKKworCQkJLyogRmlyc3RseSwg cmVwbGFjZSBpbmRleCBvZiBleGNsdWRpbmcgcmVsYXRpb24gd2l0aCBrZWVwaW5nLiAqLwor CQkJcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KHJvb3QsIG91dGVyLT5yZWxpZCwgam9pbnJlbGlk cywgaW5uZXItPnJlbGlkKTsKKworCQkJLyogU2Vjb25kbHksIGZpeCByZXN0cmljdGlvbnMg b2Yga2VlcGluZyByZWxhdGlvbiAqLworCQkJcmVtb3ZlX3NlbGZfam9pbl9yZWwocm9vdCwg aW1hcmssIG9tYXJrLCBpbm5lciwgb3V0ZXIpOworCQkJcmVzdWx0ID0gYm1zX2FkZF9tZW1i ZXIocmVzdWx0LCByKTsKKworCQkJLyogV2UgcmVtb3ZlZCB0aGUgb3V0ZXIgcmVsYXRpb24s IHRyeSB0aGUgbmV4dCBvbmUuICovCisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBy ZXN1bHQ7Cit9CisKKy8qCisgKiBJdGVyYXRpdmVseSBmb3JtIGEgZ3JvdXAgb2YgcmVsYXRp b24gaW5kZXhlcyB3aXRoIHRoZSBzYW1lIG9pZCBhbmQgbGF1bmNoCisgKiB0aGUgcm91dGlu ZSB0aGF0IGRldGVjdHMgc2VsZi1qb2lucyBpbiB0aGlzIGdyb3VwIGFuZCByZW1vdmVzIGV4 Y2Vzc2l2ZQorICogcmFuZ2UgdGFibGUgZW50cmllcy4KKyAqCisgKiBBdCB0aGUgZW5kIG9m IGl0ZXJhdGlvbiwgZXhjbHVkZSB0aGUgZ3JvdXAgZnJvbSB0aGUgb3ZlcmFsbCByZWxpZHMg bGlzdC4KKyAqIFNvIGVhY2ggbmV4dCBpdGVyYXRpb24gb2YgdGhlIGN5Y2xlIHdpbGwgaW52 b2x2ZSBsZXNzIGFuZCBsZXNzIHZhbHVlIG9mCisgKiByZWxpZHMuCisgKi8KK3N0YXRpYyBS ZWxpZHMKK3JlbW92ZV9zZWxmX2pvaW5zX29uZV9sZXZlbChQbGFubmVySW5mbyAqcm9vdCwg UmVsaWRzIHJlbGlkcywgUmVsaWRzIFRvUmVtb3ZlKQoreworCXdoaWxlICghYm1zX2lzX2Vt cHR5KHJlbGlkcykpCisJeworCQlSZWxpZHMJCWdyb3VwID0gTlVMTDsKKwkJT2lkCQkJZ3Jv dXBPaWQ7CisJCWludAkJCWk7CisKKwkJaSA9IGJtc19maXJzdF9tZW1iZXIocmVsaWRzKTsK KwkJZ3JvdXBPaWQgPSByb290LT5zaW1wbGVfcnRlX2FycmF5W2ldLT5yZWxpZDsKKwkJQXNz ZXJ0KE9pZElzVmFsaWQoZ3JvdXBPaWQpKTsKKwkJZ3JvdXAgPSBibXNfYWRkX21lbWJlcihn cm91cCwgaSk7CisKKwkJLyogQ3JlYXRlIGdyb3VwIG9mIHJlbGF0aW9uIGluZGV4ZXMgd2l0 aCB0aGUgc2FtZSBvaWQuICovCisJCXdoaWxlICgoaSA9IGJtc19uZXh0X21lbWJlcihyZWxp ZHMsIGkpKSA+IDApCisJCXsKKwkJCVJhbmdlVGJsRW50cnkgKnJ0ZSA9IHJvb3QtPnNpbXBs ZV9ydGVfYXJyYXlbaV07CisKKwkJCUFzc2VydChPaWRJc1ZhbGlkKHJ0ZS0+cmVsaWQpKTsK KworCQkJaWYgKHJ0ZS0+cmVsaWQgPT0gZ3JvdXBPaWQpCisJCQkJZ3JvdXAgPSBibXNfYWRk X21lbWJlcihncm91cCwgaSk7CisJCX0KKworCQlyZWxpZHMgPSBibXNfZGVsX21lbWJlcnMo cmVsaWRzLCBncm91cCk7CisJCVRvUmVtb3ZlID0gYm1zX2FkZF9tZW1iZXJzKFRvUmVtb3Zl LAorCQkJCQkJCQkgICByZW1vdmVfc2VsZl9qb2luc19vbmVfZ3JvdXAocm9vdCwgZ3JvdXAp KTsKKwkJYm1zX2ZyZWUoZ3JvdXApOworCX0KKwlyZXR1cm4gVG9SZW1vdmU7Cit9CisKKy8q CisgKiBGb3IgZWFjaCBsZXZlbCBvZiBqb2lubGlzdCBmb3JtIGEgc2V0IG9mIGJhc2UgcmVs YXRpb25zIGFuZCBsYXVuY2ggdGhlCisgKiByb3V0aW5lIG9mIHRoZSBzZWxmLWpvaW4gcmVt b3ZhbCBvcHRpbWl6YXRpb24uIFJlY3Vyc2UgaW50byBzdWItam9pbmxpc3RzIHRvCisgKiBo YW5kbGUgZGVlcGVyIGxldmVscy4KKyAqLworc3RhdGljIFJlbGlkcworcmVtb3ZlX3NlbGZf am9pbnNfcmVjdXJzZShQbGFubmVySW5mbyAqcm9vdCwgTGlzdCAqam9pbmxpc3QsIFJlbGlk cyBUb1JlbW92ZSkKK3sKKwlMaXN0Q2VsbCAgICpsYzsKKwlSZWxpZHMJCXJlbGlkcyA9IE5V TEw7CisKKwkvKiBDb2xsZWN0IHRoZSBpZHMgb2YgYmFzZSByZWxhdGlvbnMgYXQgb25lIGxl dmVsIG9mIHRoZSBqb2luIHRyZWUuICovCisJZm9yZWFjaChsYywgam9pbmxpc3QpCisJewor CQlzd2l0Y2ggKCgoTm9kZSAqKSBsZmlyc3QobGMpKS0+dHlwZSkKKwkJeworCQkJY2FzZSBU X0xpc3Q6CisJCQkJLyogUmVjdXJzaXZlbHkgZ28gaW5zaWRlIHRoZSBzdWItam9pbmxpc3Qg Ki8KKwkJCQlUb1JlbW92ZSA9IHJlbW92ZV9zZWxmX2pvaW5zX3JlY3Vyc2Uocm9vdCwKKwkJ CQkJCQkJCQkJCQkgKExpc3QgKikgbGZpcnN0KGxjKSwKKwkJCQkJCQkJCQkJCQkgVG9SZW1v dmUpOworCQkJCWJyZWFrOworCQkJY2FzZSBUX1JhbmdlVGJsUmVmOgorCQkJCXsKKwkJCQkJ UmFuZ2VUYmxSZWYgKnJlZiA9IChSYW5nZVRibFJlZiAqKSBsZmlyc3QobGMpOworCQkJCQlS YW5nZVRibEVudHJ5ICpydGUgPSByb290LT5zaW1wbGVfcnRlX2FycmF5W3JlZi0+cnRpbmRl eF07CisKKwkJCQkJLyoKKwkJCQkJICogV2Ugb25seSBjYXJlIGFib3V0IGJhc2UgcmVsYXRp b25zIGZyb20gd2hpY2ggd2Ugc2VsZWN0CisJCQkJCSAqIHNvbWV0aGluZy4KKwkJCQkJICov CisJCQkJCWlmIChydGUtPnJ0ZWtpbmQgIT0gUlRFX1JFTEFUSU9OIHx8CisJCQkJCQlydGUt PnJlbGtpbmQgIT0gUkVMS0lORF9SRUxBVElPTiB8fAorCQkJCQkJcm9vdC0+c2ltcGxlX3Jl bF9hcnJheVtyZWYtPnJ0aW5kZXhdID09IE5VTEwpCisJCQkJCQlicmVhazsKKworCQkJCQlB c3NlcnQoIWJtc19pc19tZW1iZXIocmVmLT5ydGluZGV4LCByZWxpZHMpKTsKKwkJCQkJcmVs aWRzID0gYm1zX2FkZF9tZW1iZXIocmVsaWRzLCByZWYtPnJ0aW5kZXgpOworCisJCQkJCS8q CisJCQkJCSAqIExpbWl0IHRoZSBudW1iZXIgb2Ygam9pbnMgd2UgcHJvY2VzcyB0byBjb250 cm9sIHRoZQorCQkJCQkgKiBxdWFkcmF0aWMgYmVoYXZpb3IuCisJCQkJCSAqLworCQkJCQlp ZiAoYm1zX251bV9tZW1iZXJzKHJlbGlkcykgPiBqb2luX2NvbGxhcHNlX2xpbWl0KQorCQkJ CQkJYnJlYWs7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlBc3NlcnQo ZmFsc2UpOworCQl9CisJfQorCisJaWYgKGJtc19udW1fbWVtYmVycyhyZWxpZHMpID49IDIp CisJCVRvUmVtb3ZlID0gcmVtb3ZlX3NlbGZfam9pbnNfb25lX2xldmVsKHJvb3QsIHJlbGlk cywgVG9SZW1vdmUpOworCisJYm1zX2ZyZWUocmVsaWRzKTsKKwlyZXR1cm4gVG9SZW1vdmU7 Cit9CisKKy8qCisgKiBGaW5kIGFuZCByZW1vdmUgdXNlbGVzcyBzZWxmIGpvaW5zLgorICoK KyAqIFdlIHNlYXJjaCBmb3Igam9pbnMgd2hlcmUgdGhlIHNhbWUgcmVsYXRpb24gaXMgam9p bmVkIHRvIGl0c2VsZiBvbiBhbGwKKyAqIGNvbHVtbnMgb2Ygc29tZSB1bmlxdWUgaW5kZXgu IElmIHRoaXMgY29uZGl0aW9uIGhvbGRzLCB0aGVuLCBmb3IKKyAqIGVhY2ggb3V0ZXIgcm93 LCBvbmx5IG9uZSBpbm5lciByb3cgbWF0Y2hlcywgYW5kIGl0IGlzIHRoZSBzYW1lIHJvdwor ICogb2YgdGhlIHNhbWUgcmVsYXRpb24uIFRoaXMgYWxsb3dzIHVzIHRvIHJlbW92ZSB0aGUg am9pbiBhbmQgcmVwbGFjZQorICogaXQgd2l0aCBhIHNjYW4gdGhhdCBjb21iaW5lcyBXSEVS RSBjbGF1c2VzIGZyb20gYm90aCBzaWRlcy4gVGhlIGpvaW4KKyAqIGNsYXVzZXMgdGhlbXNl bHZlcyBhc3N1bWUgdGhlIGZvcm0gb2YgWCA9IFggYW5kIGNhbiBiZSByZXBsYWNlZCB3aXRo CisgKiBOT1QgTlVMTCBjbGF1c2VzLgorICoKKyAqIEZvciB0aGUgc2FrZSBvZiBzaW1wbGlj aXR5LCB3ZSBkb24ndCBhcHBseSB0aGlzIG9wdGltaXphdGlvbiB0byBzcGVjaWFsCisgKiBq b2lucy4gSGVyZSBpcyBhIGxpc3Qgb2Ygd2hhdCB3ZSBjb3VsZCBkbyBpbiBzb21lIHBhcnRp Y3VsYXIgY2FzZXM6CisgKiAnYSBhMSBzZW1pIGpvaW4gYSBhMic6IGlzIHJlZHVjZWQgdG8g aW5uZXIgYnkgcmVkdWNlX3VuaXF1ZV9zZW1pam9pbnMsCisgKiBhbmQgdGhlbiByZW1vdmVk IG5vcm1hbGx5LgorICogJ2EgYTEgYW50aSBqb2luIGEgYTInOiBjb3VsZCBzaW1wbGlmeSB0 byBhIHNjYW4gd2l0aCAnb3V0ZXIgcXVhbHMgQU5ECisgKiAoSVMgTlVMTCBvbiBqb2luIGNv bHVtbnMgT1IgTk9UIGlubmVyIHF1YWxzKScuCisgKiAnYSBhMSBsZWZ0IGpvaW4gYSBhMic6 IGNvdWxkIHNpbXBsaWZ5IHRvIGEgc2NhbiBsaWtlIGlubmVyLCBidXQgd2l0aG91dAorICog Tk9UIE5VTEwgY29uZGl0aW9ucyBvbiBqb2luIGNvbHVtbnMuCisgKiAnYSBhMSBsZWZ0IGpv aW4gKGEgYTIgam9pbiBiKSc6IGNhbid0IHNpbXBsaWZ5IHRoaXMsIGJlY2F1c2Ugam9pbiB0 byBiCisgKiBjYW4gYm90aCByZW1vdmUgcm93cyBhbmQgaW50cm9kdWNlIGR1cGxpY2F0ZXMu CisgKgorICogVG8gc2VhcmNoIGZvciByZW1vdmFibGUgam9pbnMsIHdlIG9yZGVyIGFsbCB0 aGUgcmVsYXRpb25zIG9uIHRoZWlyIE9pZCwKKyAqIGdvIG92ZXIgZWFjaCBzZXQgd2l0aCB0 aGUgc2FtZSBPaWQsIGFuZCBjb25zaWRlciBlYWNoIHBhaXIgb2YgcmVsYXRpb25zCisgKiBp biB0aGlzIHNldC4gV2UgY2hlY2sgdGhhdCBib3RoIHJlbGF0aW9uIGFyZSBtYWRlIHVuaXF1 ZSBieSB0aGUgc2FtZQorICogdW5pcXVlIGluZGV4IHdpdGggdGhlIHNhbWUgY2xhdXNlcy4K KyAqCisgKiBUbyByZW1vdmUgdGhlIGpvaW4sIHdlIG1hcmsgb25lIG9mIHRoZSBwYXJ0aWNp cGF0aW5nIHJlbGF0aW9ucyBhcworICogZGVhZCwgYW5kIHJld3JpdGUgYWxsIHJlZmVyZW5j ZXMgdG8gaXQgdG8gcG9pbnQgdG8gdGhlIHJlbWFpbmluZworICogcmVsYXRpb24uIFRoaXMg aW5jbHVkZXMgbW9kaWZ5aW5nIFJlc3RyaWN0SW5mb3MsIEVxdWl2YWxlbmNlQ2xhc3NlcyBh bmQKKyAqIEVxdWl2YWxlbmNlTWVtYmVycy4gV2UgYWxzbyBoYXZlIHRvIG1vZGlmeSB0aGUg cm93IG1hcmtzLiBUaGUgam9pbiBjbGF1c2VzCisgKiBvZiB0aGUgcmVtb3ZlZCByZWxhdGlv biBiZWNvbWUgZWl0aGVyIHJlc3RyaWN0aW9uIG9yIGpvaW4gY2xhdXNlcywgYmFzZWQgb24K KyAqIHdoZXRoZXIgdGhleSByZWZlcmVuY2UgYW55IHJlbGF0aW9ucyBub3QgcGFydGljaXBh dGluZyBpbiB0aGUgcmVtb3ZlZCBqb2luLgorICoKKyAqICd0YXJnZXRsaXN0JyBpcyB0aGUg dG9wLWxldmVsIHRhcmdldGxpc3Qgb2YgcXVlcnkuIElmIGl0IGhhcyBhbnkgcmVmZXJlbmNl cworICogdG8gdGhlIHJlbW92ZWQgcmVsYXRpb25zLCB3ZSB1cGRhdGUgdGhlbSB0byBwb2lu dCB0byB0aGUgcmVtYWluaW5nIG9uZXMuCisgKi8KK0xpc3QgKgorcmVtb3ZlX3VzZWxlc3Nf c2VsZl9qb2lucyhQbGFubmVySW5mbyAqcm9vdCwgTGlzdCAqam9pbmxpc3QpCit7CisJUmVs aWRzCQlUb1JlbW92ZSA9IE5VTEw7CisJaW50CQkJcmVsaWQgPSAtMTsKKworCWlmICghZW5h YmxlX3NlbGZfam9pbl9yZW1vdmFsKQorCQlyZXR1cm4gam9pbmxpc3Q7CisKKwkvKgorCSAq IE1lcmdlIHBhaXJzIG9mIHJlbGF0aW9ucyBwYXJ0aWNpcGF0ZWQgaW4gc2VsZi1qb2luLiBS ZW1vdmUgdW5uZWNlc3NhcnkKKwkgKiByYW5nZSB0YWJsZSBlbnRyaWVzLgorCSAqLworCVRv UmVtb3ZlID0gcmVtb3ZlX3NlbGZfam9pbnNfcmVjdXJzZShyb290LCBqb2lubGlzdCwgVG9S ZW1vdmUpOworCXdoaWxlICgocmVsaWQgPSBibXNfbmV4dF9tZW1iZXIoVG9SZW1vdmUsIHJl bGlkKSkgPj0gMCkKKwl7CisJCWludAkJCW5yZW1vdmVkID0gMDsKKworCQlqb2lubGlzdCA9 IHJlbW92ZV9yZWxfZnJvbV9qb2lubGlzdChqb2lubGlzdCwgcmVsaWQsICZucmVtb3ZlZCk7 CisJfQorCisJcmV0dXJuIGpvaW5saXN0OwogfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQv b3B0aW1pemVyL3BsYW4vcGxhbm1haW4uYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFu L3BsYW5tYWluLmMKaW5kZXggYzkyZGRkMjdlZC4uOGY2ZDVlNTYzOSAxMDA2NDQKLS0tIGEv c3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vcGxhbm1haW4uYworKysgYi9zcmMvYmFja2Vu ZC9vcHRpbWl6ZXIvcGxhbi9wbGFubWFpbi5jCkBAIC0yMjYsNiArMjI2LDExIEBAIHF1ZXJ5 X3BsYW5uZXIoUGxhbm5lckluZm8gKnJvb3QsCiAJICovCiAJcmVkdWNlX3VuaXF1ZV9zZW1p am9pbnMocm9vdCk7CiAKKwkvKgorCSAqIFJlbW92ZSBzZWxmIGpvaW5zIG9uIGEgdW5pcXVl IGNvbHVtbi4KKwkgKi8KKwlqb2lubGlzdCA9IHJlbW92ZV91c2VsZXNzX3NlbGZfam9pbnMo cm9vdCwgam9pbmxpc3QpOworCiAJLyoKIAkgKiBOb3cgZGlzdHJpYnV0ZSAicGxhY2Vob2xk ZXJzIiB0byBiYXNlIHJlbHMgYXMgbmVlZGVkLiAgVGhpcyBoYXMgdG8gYmUKIAkgKiBkb25l IGFmdGVyIGpvaW4gcmVtb3ZhbCBiZWNhdXNlIHJlbW92YWwgY291bGQgY2hhbmdlIHdoZXRo ZXIgYQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWMuYyBiL3NyYy9i YWNrZW5kL3V0aWxzL21pc2MvZ3VjLmMKaW5kZXggYTdjYzQ5ODk4Yi4uZGFkNzI2YTI0ZCAx MDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWMuYworKysgYi9zcmMvYmFj a2VuZC91dGlscy9taXNjL2d1Yy5jCkBAIC0xMjI0LDYgKzEyMjQsMTYgQEAgc3RhdGljIHN0 cnVjdCBjb25maWdfYm9vbCBDb25maWd1cmVOYW1lc0Jvb2xbXSA9CiAJCXRydWUsCiAJCU5V TEwsIE5VTEwsIE5VTEwKIAl9LAorCXsKKwkJeyJlbmFibGVfc2VsZl9qb2luX3JlbW92YWwi LCBQR0NfVVNFUlNFVCwgUVVFUllfVFVOSU5HX01FVEhPRCwKKwkJCWdldHRleHRfbm9vcCgi RW5hYmxlIHJlbW92YWwgb2YgdW5pcXVlIHNlbGYtam9pbnMuIiksCisJCQlOVUxMLAorCQkJ R1VDX0VYUExBSU4gfCBHVUNfTk9UX0lOX1NBTVBMRQorCQl9LAorCQkmZW5hYmxlX3NlbGZf am9pbl9yZW1vdmFsLAorCQl0cnVlLAorCQlOVUxMLCBOVUxMLCBOVUxMCisJfSwKIAl7CiAJ CXsiZ2VxbyIsIFBHQ19VU0VSU0VULCBRVUVSWV9UVU5JTkdfR0VRTywKIAkJCWdldHRleHRf bm9vcCgiRW5hYmxlcyBnZW5ldGljIHF1ZXJ5IG9wdGltaXphdGlvbi4iKSwKZGlmZiAtLWdp dCBhL3NyYy9pbmNsdWRlL29wdGltaXplci9wYXRocy5oIGIvc3JjL2luY2x1ZGUvb3B0aW1p emVyL3BhdGhzLmgKaW5kZXggYjZlMTM3Y2Y4My4uZDBkYTE3ZWEwNyAxMDA2NDQKLS0tIGEv c3JjL2luY2x1ZGUvb3B0aW1pemVyL3BhdGhzLmgKKysrIGIvc3JjL2luY2x1ZGUvb3B0aW1p emVyL3BhdGhzLmgKQEAgLTc2LDYgKzc2LDkgQEAgZXh0ZXJuIHZvaWQgY3JlYXRlX2luZGV4 X3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwpOwogZXh0ZXJuIGJv b2wgcmVsYXRpb25faGFzX3VuaXF1ZV9pbmRleF9mb3IoUGxhbm5lckluZm8gKnJvb3QsIFJl bE9wdEluZm8gKnJlbCwKIAkJCQkJCQkJCQkgIExpc3QgKnJlc3RyaWN0bGlzdCwKIAkJCQkJ CQkJCQkgIExpc3QgKmV4cHJsaXN0LCBMaXN0ICpvcHJsaXN0KTsKK2V4dGVybiBib29sIHJl bGF0aW9uX2hhc191bmlxdWVfaW5kZXhfZXh0KFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJ bmZvICpyZWwsCisJCQkJCQkJCQkJICBMaXN0ICpyZXN0cmljdGxpc3QsIExpc3QgKmV4cHJs aXN0LAorCQkJCQkJCQkJCSAgTGlzdCAqb3BybGlzdCwgTGlzdCAqKmV4dHJhX2NsYXVzZXMp OwogZXh0ZXJuIGJvb2wgaW5kZXhjb2xfaXNfYm9vbF9jb25zdGFudF9mb3JfcXVlcnkoUGxh bm5lckluZm8gKnJvb3QsCiAJCQkJCQkJCQkJCQlJbmRleE9wdEluZm8gKmluZGV4LAogCQkJ CQkJCQkJCQkJaW50IGluZGV4Y29sKTsKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wdGlt aXplci9wbGFubWFpbi5oIGIvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BsYW5tYWluLmgKaW5k ZXggYWRlMzJhNmY0NC4uOTI5ZWY5NzlkZiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3B0 aW1pemVyL3BsYW5tYWluLmgKKysrIGIvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BsYW5tYWlu LmgKQEAgLTIwLDYgKzIwLDcgQEAKIC8qIEdVQyBwYXJhbWV0ZXJzICovCiAjZGVmaW5lIERF RkFVTFRfQ1VSU09SX1RVUExFX0ZSQUNUSU9OIDAuMQogZXh0ZXJuIFBHRExMSU1QT1JUIGRv dWJsZSBjdXJzb3JfdHVwbGVfZnJhY3Rpb247CitleHRlcm4gUEdETExJTVBPUlQgYm9vbCBl bmFibGVfc2VsZl9qb2luX3JlbW92YWw7CiAKIC8qIHF1ZXJ5X3BsYW5uZXIgY2FsbGJhY2sg dG8gY29tcHV0ZSBxdWVyeV9wYXRoa2V5cyAqLwogdHlwZWRlZiB2b2lkICgqcXVlcnlfcGF0 aGtleXNfY2FsbGJhY2spIChQbGFubmVySW5mbyAqcm9vdCwgdm9pZCAqZXh0cmEpOwpAQCAt MTEzLDYgKzExNCwxMSBAQCBleHRlcm4gYm9vbCBxdWVyeV9pc19kaXN0aW5jdF9mb3IoUXVl cnkgKnF1ZXJ5LCBMaXN0ICpjb2xub3MsIExpc3QgKm9waWRzKTsKIGV4dGVybiBib29sIGlu bmVycmVsX2lzX3VuaXF1ZShQbGFubmVySW5mbyAqcm9vdCwKIAkJCQkJCQkgICBSZWxpZHMg am9pbnJlbGlkcywgUmVsaWRzIG91dGVycmVsaWRzLCBSZWxPcHRJbmZvICppbm5lcnJlbCwK IAkJCQkJCQkgICBKb2luVHlwZSBqb2ludHlwZSwgTGlzdCAqcmVzdHJpY3RsaXN0LCBib29s IGZvcmNlX2NhY2hlKTsKK2V4dGVybiBib29sIGlubmVycmVsX2lzX3VuaXF1ZV9leHQoUGxh bm5lckluZm8gKnJvb3QsIFJlbGlkcyBqb2lucmVsaWRzLAorCQkJCQkJCQkgICBSZWxpZHMg b3V0ZXJyZWxpZHMsIFJlbE9wdEluZm8gKmlubmVycmVsLAorCQkJCQkJCQkgICBKb2luVHlw ZSBqb2ludHlwZSwgTGlzdCAqcmVzdHJpY3RsaXN0LAorCQkJCQkJCQkgICBib29sIGZvcmNl X2NhY2hlLCBMaXN0ICoqdWNsYXVzZXMpOworZXh0ZXJuIExpc3QgKnJlbW92ZV91c2VsZXNz X3NlbGZfam9pbnMoUGxhbm5lckluZm8gKnJvb3QsIExpc3QgKmpvaW50cmVlKTsKIAogLyoK ICAqIHByb3RvdHlwZXMgZm9yIHBsYW4vc2V0cmVmcy5jCmRpZmYgLS1naXQgYS9zcmMvdGVz dC9yZWdyZXNzL2V4cGVjdGVkL2VxdWl2Y2xhc3Mub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9l eHBlY3RlZC9lcXVpdmNsYXNzLm91dAppbmRleCAxMjZmNzA0N2ZlLi5kZTcxNDQxMDUyIDEw MDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2VxdWl2Y2xhc3Mub3V0Cisr KyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZXF1aXZjbGFzcy5vdXQKQEAgLTQzMCw2 ICs0MzAsMzggQEAgZXhwbGFpbiAoY29zdHMgb2ZmKQogICAgRmlsdGVyOiAoKHVuaXF1ZTEg SVMgTk9UIE5VTEwpIEFORCAodW5pcXVlMiBJUyBOT1QgTlVMTCkpCiAoMiByb3dzKQogCist LSBUZXN0IHRoYXQgYnJva2VuIEVDcyBhcmUgcHJvY2Vzc2VkIGNvcnJlY3RseSBkdXJpbmcg c2VsZiBqb2luIHJlbW92YWwuCistLSBEaXNhYmxlIG1lcmdlIGpvaW5zIHNvIHRoYXQgd2Ug ZG9uJ3QgZ2V0IGFuIGVycm9yIGFib3V0IG1pc3NpbmcgY29tbXV0YXRvci4KKy0tIFRlc3Qg Ym90aCBvcmllbnRhdGlvbnMgb2YgdGhlIGpvaW4gY2xhdXNlLCBiZWNhdXNlIG9ubHkgb25l IG9mIHRoZW0gYnJlYWtzCistLSB0aGUgRUMuCitzZXQgZW5hYmxlX21lcmdlam9pbiB0byBv ZmY7CitleHBsYWluIChjb3N0cyBvZmYpCisgIHNlbGVjdCAqIGZyb20gZWMwIG0gam9pbiBl YzAgbiBvbiBtLmZmID0gbi5mZgorICBqb2luIGVjMSBwIG9uIG0uZmYgKyBuLmZmID0gcC5m MTsKKyAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9p biBGaWx0ZXI6ICgobi5mZiArIG4uZmYpID0gcC5mMSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBl YzEgcAorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gZWMw IG4KKyAgICAgICAgICAgICAgIEZpbHRlcjogKGZmIElTIE5PVCBOVUxMKQorKDYgcm93cykK KworZXhwbGFpbiAoY29zdHMgb2ZmKQorICBzZWxlY3QgKiBmcm9tIGVjMCBtIGpvaW4gZWMw IG4gb24gbS5mZiA9IG4uZmYKKyAgam9pbiBlYzEgcCBvbiBwLmYxOjppbnQ4ID0gKG0uZmYg KyBuLmZmKTo6aW50OGFsaWFzMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkg UExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExv b3AKKyAgIEpvaW4gRmlsdGVyOiAoKHAuZjEpOjpiaWdpbnQgPSAoKG4uZmYgKyBuLmZmKSk6 OmludDhhbGlhczEpCisgICAtPiAgU2VxIFNjYW4gb24gZWMxIHAKKyAgIC0+ICBNYXRlcmlh bGl6ZQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGVjMCBuCisgICAgICAgICAgICAgICBG aWx0ZXI6IChmZiBJUyBOT1QgTlVMTCkKKyg2IHJvd3MpCisKK3Jlc2V0IGVuYWJsZV9tZXJn ZWpvaW47CiAtLSB0aGlzIGNvdWxkIGJlIGNvbnZlcnRlZCwgYnV0IGlzbid0IGF0IHByZXNl bnQKIGV4cGxhaW4gKGNvc3RzIG9mZikKICAgc2VsZWN0ICogZnJvbSB0ZW5rMSB3aGVyZSB1 bmlxdWUxID0gdW5pcXVlMSBvciB1bmlxdWUyID0gdW5pcXVlMjsKZGlmZiAtLWdpdCBhL3Ny Yy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4 cGVjdGVkL2pvaW4ub3V0CmluZGV4IDI1MzhiZDZhNzkuLmQ0ZDdjMzkwYTEgMTAwNjQ0Ci0t LSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQKKysrIGIvc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC9qb2luLm91dApAQCAtNDkxOCw2ICs0OTE4LDY5MiBAQCBzZWxl Y3QgKiBmcm9tCiAtLS0tKy0tLS0rLS0tLSstLS0tCiAoMCByb3dzKQogCistLQorLS0gdGVz dCB0aGF0IHNlbWktIG9yIGlubmVyIHNlbGYtam9pbnMgb24gYSB1bmlxdWUgY29sdW1uIGFy ZSByZW1vdmVkCistLQorLS0gZW5hYmxlIG9ubHkgbmVzdGxvb3AgdG8gZ2V0IG1vcmUgcHJl ZGljdGFibGUgcGxhbnMKK3NldCBlbmFibGVfaGFzaGpvaW4gdG8gb2ZmOworc2V0IGVuYWJs ZV9tZXJnZWpvaW4gdG8gb2ZmOworY3JlYXRlIHRhYmxlIHNqIChhIGludCB1bmlxdWUsIGIg aW50LCBjIGludCB1bmlxdWUpOworaW5zZXJ0IGludG8gc2ogdmFsdWVzICgxLCBudWxsLCAy KSwgKG51bGwsIDIsIG51bGwpLCAoMiwgMSwgMSk7CithbmFseXplIHNqOworLS0gVHJpdmlh bCBzZWxmLWpvaW4gY2FzZS4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCBwLiogZnJv bSBzaiBwLCBzaiBxIHdoZXJlIHEuYSA9IHAuYSBhbmQgcS5iID0gcS5hIC0gMTsKKyAgICAg ICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHNq IHEKKyAgIEZpbHRlcjogKChhIElTIE5PVCBOVUxMKSBBTkQgKGIgPSAoYSAtIDEpKSkKKygy IHJvd3MpCisKK3NlbGVjdCBwLiogZnJvbSBzaiBwLCBzaiBxIHdoZXJlIHEuYSA9IHAuYSBh bmQgcS5iID0gcS5hIC0gMTsKKyBhIHwgYiB8IGMgCistLS0rLS0tKy0tLQorIDIgfCAxIHwg MQorKDEgcm93KQorCistLSBTZWxmLWpvaW4gcmVtb3ZhbCBwZXJmb3JtcyBhZnRlciBhIHN1 YnF1ZXJ5IHB1bGwtdXAgcHJvY2VzcyBhbmQgY291bGQgcmVtb3ZlCistLSBzdWNoIGtpbmQg b2Ygc2VsZi1qb2luIHRvby4gQ2hlY2sgdGhpcyBvcHRpb24uCitleHBsYWluIChjb3N0cyBv ZmYpCitzZWxlY3QgKiBmcm9tIHNqIHAKK3doZXJlIGV4aXN0cyAoc2VsZWN0ICogZnJvbSBz aiBxCisJCQkJd2hlcmUgcS5hID0gcC5hIGFuZCBxLmIgPCAxMCk7CisgICAgICAgICAgICAg ICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHNqIHEKKyAgIEZpbHRlcjogKChh IElTIE5PVCBOVUxMKSBBTkQgKGIgPCAxMCkpCisoMiByb3dzKQorCitzZWxlY3QgKiBmcm9t IHNqIHAgd2hlcmUgZXhpc3RzIChzZWxlY3QgKiBmcm9tIHNqIHEgd2hlcmUgcS5hID0gcC5h IGFuZCBxLmIgPCAxMCk7CisgYSB8IGIgfCBjIAorLS0tKy0tLSstLS0KKyAyIHwgMSB8IDEK KygxIHJvdykKKworLS0gRG9uJ3QgcmVtb3ZlIHNlbGYtam9pbiBmb3IgdGhlIGNhc2Ugb2Yg ZXF1YWxpdHkgb2YgdHdvIGRpZmZlcmVudCB1bmlxdWUgY29sdW1ucy4KK2V4cGxhaW4gKGNv c3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogdDEsIHNqIHQyIHdoZXJlIHQxLmEgPSB0Mi5j IGFuZCB0MS5iIGlzIG5vdCBudWxsOworICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBO ZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6ICh0MS5hID0gdDIuYykKKyAgIC0+ICBTZXEg U2NhbiBvbiBzaiB0MgorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgU2VxIFNj YW4gb24gc2ogdDEKKyAgICAgICAgICAgICAgIEZpbHRlcjogKGIgSVMgTk9UIE5VTEwpCiso NiByb3dzKQorCistLSBEZWdlbmVyYXRlZCBjYXNlLgorZXhwbGFpbiAoY29zdHMgb2ZmKQor c2VsZWN0ICogZnJvbQorCShzZWxlY3QgYSBhcyB4IGZyb20gc2ogd2hlcmUgZmFsc2UpIGFz IHExLAorCShzZWxlY3QgYSBhcyB5IGZyb20gc2ogd2hlcmUgZmFsc2UpIGFzIHEyCit3aGVy ZSBxMS54ID0gcTIueTsKKyAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgIAorLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUmVzdWx0CisgICBPbmUtVGltZSBG aWx0ZXI6IGZhbHNlCisgICAtPiAgU2VxIFNjYW4gb24gc2oKKyAgICAgICAgIEZpbHRlcjog KGEgSVMgTk9UIE5VTEwpCisoNCByb3dzKQorCistLSBXZSBjYW4ndCB1c2UgYSBjcm9zcy1F QyBnZW5lcmF0ZWQgc2VsZiBqb2luIHF1YWwgYmVjYXVzZSBvZiBjdXJyZW50IGxvZ2ljIG9m CistLSB0aGUgZ2VuZXJhdGVfam9pbl9pbXBsaWVkX2VxdWFsaXRpZXMgcm91dGluZS4KK2V4 cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogdDEsIHNqIHQyIHdoZXJlIHQx LmEgPSB0MS5iIGFuZCB0MS5iID0gdDIuYiBhbmQgdDIuYiA9IHQyLmE7CisgICAgICAgICAg UVVFUlkgUExBTiAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKHQxLmEgPSB0Mi5iKQorICAgLT4gIFNl cSBTY2FuIG9uIHNqIHQxCisgICAgICAgICBGaWx0ZXI6IChhID0gYikKKyAgIC0+ICBTZXEg U2NhbiBvbiBzaiB0MgorICAgICAgICAgRmlsdGVyOiAoYiA9IGEpCisoNiByb3dzKQorCitl eHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHQxLCBzaiB0Miwgc2ogdDMK K3doZXJlIHQxLmEgPSB0MS5iIGFuZCB0MS5iID0gdDIuYiBhbmQgdDIuYiA9IHQyLmEKKwlh bmQgdDEuYiA9IHQzLmIgYW5kIHQzLmIgPSB0My5hOworICAgICAgICAgICAgIFFVRVJZIFBM QU4gICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6ICh0MS5hID0gdDMuYikKKyAgIC0+ICBO ZXN0ZWQgTG9vcAorICAgICAgICAgSm9pbiBGaWx0ZXI6ICh0MS5hID0gdDIuYikKKyAgICAg ICAgIC0+ICBTZXEgU2NhbiBvbiBzaiB0MQorICAgICAgICAgICAgICAgRmlsdGVyOiAoYSA9 IGIpCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ogdDIKKyAgICAgICAgICAgICAgIEZp bHRlcjogKGIgPSBhKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIHQzCisgICAgICAgICBGaWx0 ZXI6IChiID0gYSkKKygxMCByb3dzKQorCistLSBEb3VibGUgc2VsZi1qb2luIHJlbW92YWwu CistLSBVc2UgYSBjb25kaXRpb24gb24gImIgKyAxIiwgbm90IG9uICJiIiwgZm9yIHRoZSBz ZWNvbmQgam9pbiwgc28gdGhhdAorLS0gdGhlIGVxdWl2YWxlbmNlIGNsYXNzIGlzIGRpZmZl cmVudCBmcm9tIHRoZSBmaXJzdCBvbmUsIGFuZCB3ZSBjYW4KKy0tIHRlc3QgdGhlIG5vbi1l YyBjb2RlIHBhdGguCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHQx IGpvaW4gc2ogdDIgb24gdDEuYSA9IHQyLmEgYW5kIHQxLmIgPSB0Mi5iCisJam9pbiBzaiB0 MyBvbiB0Mi5hID0gdDMuYSBhbmQgdDIuYiArIDEgPSB0My5iICsgMTsKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gc2ogdDMK KyAgIEZpbHRlcjogKChhIElTIE5PVCBOVUxMKSBBTkQgKGIgSVMgTk9UIE5VTEwpIEFORCAo KGIgKyAxKSBJUyBOT1QgTlVMTCkpCisoMiByb3dzKQorCistLSBzdWJzZWxlY3QgdGhhdCBy ZWZlcmVuY2VzIHRoZSByZW1vdmVkIHJlbGF0aW9uCitleHBsYWluIChjb3N0cyBvZmYpCitz ZWxlY3QgdDEuYSwgKHNlbGVjdCBhIGZyb20gc2ogd2hlcmUgYSA9IHQyLmEgYW5kIGEgPSB0 MS5hKQorZnJvbSBzaiB0MSwgc2ogdDIKK3doZXJlIHQxLmEgPSB0Mi5hOworICAgICAgICAg ICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBzaiB0MgorICAgRmlsdGVy OiAoYSBJUyBOT1QgTlVMTCkKKyAgIFN1YlBsYW4gMQorICAgICAtPiAgUmVzdWx0CisgICAg ICAgICAgIE9uZS1UaW1lIEZpbHRlcjogKHQyLmEgPSB0Mi5hKQorICAgICAgICAgICAtPiAg U2VxIFNjYW4gb24gc2oKKyAgICAgICAgICAgICAgICAgRmlsdGVyOiAoYSA9IHQyLmEpCiso NyByb3dzKQorCistLSBzZWxmLWpvaW4gdW5kZXIgb3V0ZXIgam9pbgorZXhwbGFpbiAoY29z dHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB4IGpvaW4gc2ogeSBvbiB4LmEgPSB5LmEKK2xl ZnQgam9pbiBpbnQ4X3RibCB6IG9uIHguYSA9IHoucTE7CisgICAgICAgICAgICAgUVVFUlkg UExBTiAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIE5lc3RlZCBMb29wIExlZnQgSm9pbgorICAgSm9pbiBGaWx0ZXI6ICh5LmEgPSB6LnEx KQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIHkKKyAgICAgICAgIEZpbHRlcjogKGEgSVMgTk9U IE5VTEwpCisgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBp bnQ4X3RibCB6CisoNiByb3dzKQorCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBm cm9tIHNqIHggam9pbiBzaiB5IG9uIHguYSA9IHkuYQorbGVmdCBqb2luIGludDhfdGJsIHog b24geS5hID0gei5xMTsKKyAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AgTGVm dCBKb2luCisgICBKb2luIEZpbHRlcjogKHkuYSA9IHoucTEpCisgICAtPiAgU2VxIFNjYW4g b24gc2ogeQorICAgICAgICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKyAgIC0+ICBNYXRl cmlhbGl6ZQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGludDhfdGJsIHoKKyg2IHJvd3Mp CisKK2V4cGxhaW4gKGNvc3RzIG9mZikKK1NFTEVDVCAqIEZST00gKAorICBTRUxFQ1QgdDEu KiwgdDIuYSBBUyBheCBGUk9NIHNqIHQxIEpPSU4gc2ogdDIKKyAgT04gKHQxLmEgPSB0Mi5h IEFORCB0MS5jKnQxLmMgPSB0Mi5jKzIgQU5EIHQyLmIgSVMgTlVMTCkKKykgQVMgcTEKK0xF RlQgSk9JTgorICAoU0VMRUNUIHQzLiogRlJPTSBzaiB0Mywgc2ogdDQgV0hFUkUgdDMuYyA9 IHQ0LmMpIEFTIHEyCitPTiBxMS5heCA9IHEyLmE7CisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wIExlZnQgSm9pbgorICAgSm9p biBGaWx0ZXI6ICh0Mi5hID0gdDQuYSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiB0MgorICAg ICAgICAgRmlsdGVyOiAoKGIgSVMgTlVMTCkgQU5EIChhIElTIE5PVCBOVUxMKSBBTkQgKChj ICogYykgPSAoYyArIDIpKSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiB0NAorICAgICAgICAg RmlsdGVyOiAoYyBJUyBOT1QgTlVMTCkKKyg2IHJvd3MpCisKKy0tIFRlc3QgdGhhdCBwbGFj ZWhvbGRlcnMgYXJlIHVwZGF0ZWQgY29ycmVjdGx5IGFmdGVyIGpvaW4gcmVtb3ZhbAorZXhw bGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSAodmFsdWVzICgxKSkgeAorbGVmdCBq b2luIChzZWxlY3QgY29hbGVzY2UoeS5xMSwgMSkgZnJvbSBpbnQ4X3RibCB5CisJcmlnaHQg am9pbiBzaiBqMSBpbm5lciBqb2luIHNqIGoyIG9uIGoxLmEgPSBqMi5hCisJb24gdHJ1ZSkg egorb24gdHJ1ZTsKKyAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAg IAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVk IExvb3AgTGVmdCBKb2luCisgICAtPiAgUmVzdWx0CisgICAtPiAgTmVzdGVkIExvb3AgTGVm dCBKb2luCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ogajIKKyAgICAgICAgICAgICAg IEZpbHRlcjogKGEgSVMgTk9UIE5VTEwpCisgICAgICAgICAtPiAgTWF0ZXJpYWxpemUKKyAg ICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBpbnQ4X3RibCB5CisoNyByb3dzKQorCist LQorLS0gU0pSIGNvcm5lciBjYXNlOiB1bmlxdWVuZXNzIG9mIGFuIGlubmVyIGlzIFtwYXJ0 aWFsbHldIGRlcml2ZWQgZnJvbQorLS0gYmFzZXJlc3RyaWN0aW5mbyBjbGF1c2VzLgorLS0g WFhYOiBXZSByZWFsbHkgc2hvdWxkIGFsbG93IFNKUiBmb3IgdGhlc2UgY29ybmVyIGNhc2Vz PworLS0KK0lOU0VSVCBJTlRPIHNqIFZBTFVFUyAoMywgMSwgMyk7CitleHBsYWluIChjb3N0 cyBvZmYpIC0tIERvbid0IHJlbW92ZSBTSgorCVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoy IFdIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMiBBTkQgajIuYSA9IDM7CisgICAgICAg ICAgUVVFUlkgUExBTiAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKGoxLmIgPSBqMi5iKQorICAgLT4g IFNlcSBTY2FuIG9uIHNqIGoxCisgICAgICAgICBGaWx0ZXI6IChhID0gMikKKyAgIC0+ICBT ZXEgU2NhbiBvbiBzaiBqMgorICAgICAgICAgRmlsdGVyOiAoYSA9IDMpCisoNiByb3dzKQor CitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorV0hFUkUgajEuYiA9IGoyLmIgQU5EIGox LmEgPSAyIEFORCBqMi5hID0gMzsgLS0gUmV0dXJuIG9uZSByb3cKKyBhIHwgYiB8IGMgfCBh IHwgYiB8IGMgCistLS0rLS0tKy0tLSstLS0rLS0tKy0tLQorIDIgfCAxIHwgMSB8IDMgfCAx IHwgMworKDEgcm93KQorCitleHBsYWluIChjb3N0cyBvZmYpIC0tIFJlbW92ZSBTSiwgZGVm aW5lIHVuaXF1ZW5lc3MgYnkgYSBjb25zdGFudAorCVNFTEVDVCAqIEZST00gc2ogajEsIHNq IGoyIFdIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMiBBTkQgajIuYSA9IDI7CisgICAg ICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBzaiBqMgorICAgRmls dGVyOiAoKGIgSVMgTk9UIE5VTEwpIEFORCAoYSA9IDIpKQorKDIgcm93cykKKworU0VMRUNU ICogRlJPTSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMiBB TkQgajIuYSA9IDI7IC0tIFJldHVybiBvbmUgcm93CisgYSB8IGIgfCBjIHwgYSB8IGIgfCBj IAorLS0tKy0tLSstLS0rLS0tKy0tLSstLS0KKyAyIHwgMSB8IDEgfCAyIHwgMSB8IDEKKygx IHJvdykKKworZXhwbGFpbiAodmVyYm9zZSwgY29zdHMgb2ZmKSAtLSBSZW1vdmUgU0osIGRl ZmluZSB1bmlxdWVuZXNzIGJ5IGEgY29uc3RhbnQgZXhwcmVzc2lvbgorCVNFTEVDVCAqIEZS T00gc2ogajEsIHNqIGoyCisgIFdIRVJFIGoxLmIgPSBqMi5iCisgICAgQU5EIGoxLmEgPSBF WFRSQUNUKERBWSBGUk9NIGN1cnJlbnRfdGltZXN0YW1wKDApKTo6aW50CisgICAgQU5EIEVY VFJBQ1QoREFZIEZST00gY3VycmVudF90aW1lc3RhbXAoMCkpOjppbnQgPSBqMi5hOworICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gcHVibGljLnNqIGoy CisgICBPdXRwdXQ6IGoyLmEsIGoyLmIsIGoyLmMsIGoyLmEsIGoyLmIsIGoyLmMKKyAgIEZp bHRlcjogKChqMi5iIElTIE5PVCBOVUxMKSBBTkQgKGoyLmEgPSAoRVhUUkFDVChkYXkgRlJP TSBDVVJSRU5UX1RJTUVTVEFNUCgwKSkpOjppbnRlZ2VyKSkKKygzIHJvd3MpCisKK1NFTEVD VCAqIEZST00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIuYgorICBBTkQgajEuYSA9 IEVYVFJBQ1QoREFZIEZST00gY3VycmVudF90aW1lc3RhbXAoMCkpOjppbnQKKyAgQU5EIEVY VFJBQ1QoREFZIEZST00gY3VycmVudF90aW1lc3RhbXAoMCkpOjppbnQgPSBqMi5hOyAtLSBS ZXR1cm4gb25lIGNvbHVtbgorIGEgfCBiIHwgYyB8IGEgfCBiIHwgYyAKKy0tLSstLS0rLS0t Ky0tLSstLS0rLS0tCisoMCByb3dzKQorCitleHBsYWluIChjb3N0cyBvZmYpIC0tIFJlbW92 ZSBTSgorCVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyIFdIRVJFIGoxLmIgPSBqMi5iIEFO RCBqMS5hID0gMSBBTkQgajIuYSA9IDE7CisgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAg ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyBTZXEgU2NhbiBvbiBzaiBqMgorICAgRmlsdGVyOiAoKGIgSVMgTk9UIE5VTEwpIEFO RCAoYSA9IDEpKQorKDIgcm93cykKKworU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKK1dI RVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMSBBTkQgajIuYSA9IDE7IC0tIFJldHVybiBu byByb3dzCisgYSB8IGIgfCBjIHwgYSB8IGIgfCBjIAorLS0tKy0tLSstLS0rLS0tKy0tLSst LS0KKygwIHJvd3MpCisKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gU2h1ZmZsZSBhIGNsYXVz ZS4gUmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEuYiA9 IGoyLmIgQU5EIDEgPSBqMS5hIEFORCBqMi5hID0gMTsKKyAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHNqIGoyCisgICBGaWx0ZXI6ICgoYiBJUyBOT1Qg TlVMTCkgQU5EIChhID0gMSkpCisoMiByb3dzKQorCitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBz aiBqMgorV0hFUkUgajEuYiA9IGoyLmIgQU5EIDEgPSBqMS5hIEFORCBqMi5hID0gMTsgLS0g UmV0dXJuIG5vIHJvd3MKKyBhIHwgYiB8IGMgfCBhIHwgYiB8IGMgCistLS0rLS0tKy0tLSst LS0rLS0tKy0tLQorKDAgcm93cykKKworLS0gRnVuY3Rpb25hbCBpbmRleAorQ1JFQVRFIFVO SVFVRSBJTkRFWCBzal9mbl9pZHggT04gc2ooKGEgKiBhKSk7CitleHBsYWluIChjb3N0cyBv ZmYpIC0tIFJlbW92ZSBTSgorCVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCisJV0hFUkUg ajEuYiA9IGoyLmIgQU5EIGoxLmEqajEuYSA9IDEgQU5EIGoyLmEqajIuYSA9IDE7CisgICAg ICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBz aiBqMgorICAgRmlsdGVyOiAoKGIgSVMgTk9UIE5VTEwpIEFORCAoKGEgKiBhKSA9IDEpKQor KDIgcm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBEb24ndCByZW1vdmUgU0oKKwlT RUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorCVdIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5h KmoxLmEgPSAxIEFORCBqMi5hKmoyLmEgPSAyOworICAgICAgICAgIFFVRVJZIFBMQU4gICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29w CisgICBKb2luIEZpbHRlcjogKGoxLmIgPSBqMi5iKQorICAgLT4gIFNlcSBTY2FuIG9uIHNq IGoxCisgICAgICAgICBGaWx0ZXI6ICgoYSAqIGEpID0gMSkKKyAgIC0+ICBTZXEgU2NhbiBv biBzaiBqMgorICAgICAgICAgRmlsdGVyOiAoKGEgKiBhKSA9IDIpCisoNiByb3dzKQorCist LSBNdWx0aXBsZSBmaWx0ZXJzCitDUkVBVEUgVU5JUVVFIElOREVYIHNqX3RlbXBfaWR4MSBP TiBzaihhLGIsYyk7CitleHBsYWluIChjb3N0cyBvZmYpIC0tIFJlbW92ZSBTSgorCVNFTEVD VCAqIEZST00gc2ogajEsIHNqIGoyCisJV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEgPSAy IEFORCBqMS5jID0gMyBBTkQgajIuYSA9IDIgQU5EIDMgPSBqMi5jOworICAgICAgICAgICAg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4g b24gc2ogajIKKyAgIEZpbHRlcjogKChiIElTIE5PVCBOVUxMKSBBTkQgKGEgPSAyKSBBTkQg KGMgPSAzKSkKKygyIHJvd3MpCisKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gRG9uJ3QgcmVt b3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKKwlXSEVSRSBqMS5iID0gajIu YiBBTkQgMiA9IGoxLmEgQU5EIGoxLmMgPSAzIEFORCBqMi5hID0gMSBBTkQgMyA9IGoyLmM7 CisgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZp bHRlcjogKGoxLmIgPSBqMi5iKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIGoxCisgICAgICAg ICBGaWx0ZXI6ICgoMiA9IGEpIEFORCAoYyA9IDMpKQorICAgLT4gIFNlcSBTY2FuIG9uIHNq IGoyCisgICAgICAgICBGaWx0ZXI6ICgoYyA9IDMpIEFORCAoYSA9IDEpKQorKDYgcm93cykK KworQ1JFQVRFIFVOSVFVRSBJTkRFWCBzal90ZW1wX2lkeCBPTiBzaihhLGIpOworZXhwbGFp biAoY29zdHMgb2ZmKSAtLSBEb24ndCByZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGox LCBzaiBqMiBXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSA9IDI7CisgICAgICAgICAgUVVF UlkgUExBTiAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5l c3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKGoxLmIgPSBqMi5iKQorICAgLT4gIFNlcSBT Y2FuIG9uIHNqIGoxCisgICAgICAgICBGaWx0ZXI6IChhID0gMikKKyAgIC0+ICBTZXEgU2Nh biBvbiBzaiBqMgorKDUgcm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBEb24ndCBy ZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMiBXSEVSRSBqMS5iID0gajIu YiBBTkQgMiA9IGoyLmE7CisgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRl cjogKGoxLmIgPSBqMi5iKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIGoyCisgICAgICAgICBG aWx0ZXI6ICgyID0gYSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBqMQorKDUgcm93cykKKwor ZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBEb24ndCByZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9N IHNqIGoxLCBzaiBqMiBXSEVSRSBqMS5iID0gajIuYiBBTkQgKGoxLmEgPSAxIE9SIGoyLmEg PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAg ICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmls dGVyOiAoKGoxLmIgPSBqMi5iKSBBTkQgKChqMS5hID0gMSkgT1IgKGoyLmEgPSAxKSkpCisg ICAtPiAgU2VxIFNjYW4gb24gc2ogajEKKyAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAg LT4gIFNlcSBTY2FuIG9uIHNqIGoyCisoNSByb3dzKQorCitEUk9QIElOREVYIHNqX2ZuX2lk eCwgc2pfdGVtcF9pZHgxLCBzal90ZW1wX2lkeDsKKy0tIFRlc3QgdGhhdCBPUiBwcmVkaWNh dGVkIGFyZSB1cGRhdGVkIGNvcnJlY3RseSBhZnRlciBqb2luIHJlbW92YWwKK0NSRUFURSBU QUJMRSB0YWJfd2l0aF9mbGFnICggaWQgSU5UIFBSSU1BUlkgS0VZLCBpc19mbGFnIFNNQUxM SU5UKTsKK0NSRUFURSBJTkRFWCBpZHhfdGVzdF9pc19mbGFnIE9OIHRhYl93aXRoX2ZsYWcg KGlzX2ZsYWcpOworZXhwbGFpbiAoY29zdHMgb2ZmKQorU0VMRUNUIENPVU5UKCopIEZST00g dGFiX3dpdGhfZmxhZworV0hFUkUKKwkoaXNfZmxhZyBJUyBOVUxMIE9SIGlzX2ZsYWcgPSAw KQorCUFORCBpZCBJTiAoU0VMRUNUIGlkIEZST00gdGFiX3dpdGhfZmxhZyBXSEVSRSBpZCBJ TiAoMiwgMykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkg UExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorIEFnZ3JlZ2F0ZQorICAgLT4gIEJpdG1hcCBIZWFwIFNjYW4g b24gdGFiX3dpdGhfZmxhZworICAgICAgICAgUmVjaGVjayBDb25kOiAoKGlkID0gQU5ZICgn ezIsM30nOjppbnRlZ2VyW10pKSBBTkQgKGlkIElTIE5PVCBOVUxMKSkKKyAgICAgICAgIEZp bHRlcjogKChpc19mbGFnIElTIE5VTEwpIE9SIChpc19mbGFnID0gMCkpCisgICAgICAgICAt PiAgQml0bWFwIEluZGV4IFNjYW4gb24gdGFiX3dpdGhfZmxhZ19wa2V5CisgICAgICAgICAg ICAgICBJbmRleCBDb25kOiAoKGlkID0gQU5ZICgnezIsM30nOjppbnRlZ2VyW10pKSBBTkQg KGlkIElTIE5PVCBOVUxMKSkKKyg2IHJvd3MpCisKK0RST1AgVEFCTEUgdGFiX3dpdGhfZmxh ZzsKKy0tIEhBVklORyBjbGF1c2UKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCBwLmIg ZnJvbSBzaiBwIGpvaW4gc2ogcSBvbiBwLmEgPSBxLmEgZ3JvdXAgYnkgcC5iIGhhdmluZyBz dW0ocC5hKSA9IDE7CisgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhhc2hBZ2dyZWdhdGUKKyAgIEdyb3Vw IEtleTogcS5iCisgICBGaWx0ZXI6IChzdW0ocS5hKSA9IDEpCisgICAtPiAgU2VxIFNjYW4g b24gc2ogcQorICAgICAgICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKyg1IHJvd3MpCisK Ky0tIHVwZGF0ZSBsYXRlcmFsIHJlZmVyZW5jZXMgYW5kIHJhbmdlIHRhYmxlIGVudHJ5IHJl ZmVyZW5jZQorZXhwbGFpbiAodmVyYm9zZSwgY29zdHMgb2ZmKQorc2VsZWN0IDEgZnJvbSAo c2VsZWN0IHguKiBmcm9tIHNqIHgsIHNqIHkgd2hlcmUgeC5hID0geS5hKSBxLAorICBsYXRl cmFsIGdlbmVyYXRlX3NlcmllcygxLCBxLmEpIGdzKGkpOworICAgICAgICAgICAgICAgICAg ICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAor ICAgT3V0cHV0OiAxCisgICAtPiAgU2VxIFNjYW4gb24gcHVibGljLnNqIHkKKyAgICAgICAg IE91dHB1dDogeS5hLCB5LmIsIHkuYworICAgICAgICAgRmlsdGVyOiAoeS5hIElTIE5PVCBO VUxMKQorICAgLT4gIEZ1bmN0aW9uIFNjYW4gb24gcGdfY2F0YWxvZy5nZW5lcmF0ZV9zZXJp ZXMgZ3MKKyAgICAgICAgIE91dHB1dDogZ3MuaQorICAgICAgICAgRnVuY3Rpb24gQ2FsbDog Z2VuZXJhdGVfc2VyaWVzKDEsIHkuYSkKKyg4IHJvd3MpCisKK2V4cGxhaW4gKHZlcmJvc2Us IGNvc3RzIG9mZikKK3NlbGVjdCAxIGZyb20gKHNlbGVjdCB5LiogZnJvbSBzaiB4LCBzaiB5 IHdoZXJlIHguYSA9IHkuYSkgcSwKKyAgbGF0ZXJhbCBnZW5lcmF0ZV9zZXJpZXMoMSwgcS5h KSBncyhpKTsKKyAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIE91dHB1dDogMQorICAgLT4gIFNlcSBT Y2FuIG9uIHB1YmxpYy5zaiB5CisgICAgICAgICBPdXRwdXQ6IHkuYSwgeS5iLCB5LmMKKyAg ICAgICAgIEZpbHRlcjogKHkuYSBJUyBOT1QgTlVMTCkKKyAgIC0+ICBGdW5jdGlvbiBTY2Fu IG9uIHBnX2NhdGFsb2cuZ2VuZXJhdGVfc2VyaWVzIGdzCisgICAgICAgICBPdXRwdXQ6IGdz LmkKKyAgICAgICAgIEZ1bmN0aW9uIENhbGw6IGdlbmVyYXRlX3NlcmllcygxLCB5LmEpCiso OCByb3dzKQorCistLSBUZXN0IHRoYXQgYSBub24tRUMtZGVyaXZlZCBqb2luIGNsYXVzZSBp cyBwcm9jZXNzZWQgY29ycmVjdGx5LiBVc2UgYW4KKy0tIG91dGVyIGpvaW4gc28gdGhhdCB3 ZSBjYW4ndCBmb3JtIGFuIEVDLgorZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3QgKiBmcm9t IHNqIHAgam9pbiBzaiBxIG9uIHAuYSA9IHEuYQorICBsZWZ0IGpvaW4gc2ogciBvbiBwLmEg KyBxLmEgPSByLmE7CisgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wIExlZnQg Sm9pbgorICAgSm9pbiBGaWx0ZXI6ICgocS5hICsgcS5hKSA9IHIuYSkKKyAgIC0+ICBTZXEg U2NhbiBvbiBzaiBxCisgICAgICAgICBGaWx0ZXI6IChhIElTIE5PVCBOVUxMKQorICAgLT4g IE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ogcgorKDYgcm93cykK KworLS0gRklYTUUgdGhpcyBjb25zdGFudCBmYWxzZSBmaWx0ZXIgZG9lc24ndCBsb29rIGdv b2QuIFNob3VsZCB3ZSBtZXJnZQorLS0gZXF1aXZhbGVuY2UgY2xhc3Nlcz8KK2V4cGxhaW4g KGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogcCwgc2ogcSB3aGVyZSBwLmEgPSBxLmEg YW5kIHAuYiA9IDEgYW5kIHEuYiA9IDI7CisgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQ TEFOICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBzaiBxCisgICBGaWx0 ZXI6ICgoYSBJUyBOT1QgTlVMTCkgQU5EIChiID0gMikgQU5EIChiID0gMSkpCisoMiByb3dz KQorCistLSBDaGVjayB0aGF0IGF0dHJfbmVlZGVkIGlzIHVwZGF0ZWQgY29ycmVjdGx5IGFm dGVyIHNlbGYtam9pbiByZW1vdmFsLiBJbiB0aGlzCistLSB0ZXN0LCB0aGUgam9pbiBvZiBq MSB3aXRoIGoyIGlzIHJlbW92ZWQuIGsxLmIgaXMgcmVxdWlyZWQgYXQgZWl0aGVyIGoxIG9y IGoyLgorLS0gSWYgdGhpcyBpbmZvIGlzIGxvc3QsIGpvaW4gdGFyZ2V0bGlzdCBmb3IgKGsx LCBrMikgd2lsbCBub3QgY29udGFpbiBrMS5iLgorLS0gVXNlIGluZGV4IHNjYW4gZm9yIGsx IHNvIHRoYXQgd2UgZG9uJ3QgZ2V0ICdiJyBmcm9tIHBoeXNpY2FsIHRsaXN0IHVzZWQgZm9y CistLSBzZXFzY2FuLiBBbHNvIGRpc2FibGUgcmVvcmRlcmluZyBvZiBqb2lucyBiZWNhdXNl IHRoaXMgdGVzdCBkZXBlbmRzIG9uIGEKKy0tIHBhcnRpY3VsYXIgam9pbiB0cmVlLgorY3Jl YXRlIHRhYmxlIHNrIChhIGludCwgYiBpbnQpOworY3JlYXRlIGluZGV4IG9uIHNrKGEpOwor c2V0IGpvaW5fY29sbGFwc2VfbGltaXQgdG8gMTsKK3NldCBlbmFibGVfc2Vxc2NhbiB0byBv ZmY7CitleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCAxIGZyb20KKwkoc2sgazEgam9pbiBz ayBrMiBvbiBrMS5hID0gazIuYSkKKwlqb2luIChzaiBqMSBqb2luIHNqIGoyIG9uIGoxLmEg PSBqMi5hKSBvbiBqMS5iID0gazEuYjsKKyAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBM QU4gICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRl cjogKGsxLmIgPSBqMi5iKQorICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICAtPiAgSW5k ZXggU2NhbiB1c2luZyBza19hX2lkeCBvbiBzayBrMQorICAgICAgICAgLT4gIEluZGV4IE9u bHkgU2NhbiB1c2luZyBza19hX2lkeCBvbiBzayBrMgorICAgICAgICAgICAgICAgSW5kZXgg Q29uZDogKGEgPSBrMS5hKQorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgSW5k ZXggU2NhbiB1c2luZyBzal9hX2tleSBvbiBzaiBqMgorICAgICAgICAgICAgICAgSW5kZXgg Q29uZDogKGEgSVMgTk9UIE5VTEwpCisoOSByb3dzKQorCitleHBsYWluIChjb3N0cyBvZmYp IHNlbGVjdCAxIGZyb20KKwkoc2sgazEgam9pbiBzayBrMiBvbiBrMS5hID0gazIuYSkKKwlq b2luIChzaiBqMSBqb2luIHNqIGoyIG9uIGoxLmEgPSBqMi5hKSBvbiBqMi5iID0gazEuYjsK KyAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKGsxLmIgPSBqMi5iKQorICAgLT4g IE5lc3RlZCBMb29wCisgICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyBza19hX2lkeCBv biBzayBrMQorICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyBza19hX2lkeCBv biBzayBrMgorICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGEgPSBrMS5hKQorICAgLT4g IE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyBzal9hX2tleSBv biBzaiBqMgorICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGEgSVMgTk9UIE5VTEwpCiso OSByb3dzKQorCityZXNldCBqb2luX2NvbGxhcHNlX2xpbWl0OworcmVzZXQgZW5hYmxlX3Nl cXNjYW47CistLSBDaGVjayB0aGF0IGNsYXVzZXMgZnJvbSB0aGUgam9pbiBmaWx0ZXIgbGlz dCBpcyBub3QgbG9zdCBvbiB0aGUgc2VsZi1qb2luIHJlbW92YWwKK0NSRUFURSBUQUJMRSBl bXAxICggaWQgU0VSSUFMIFBSSU1BUlkgS0VZIE5PVCBOVUxMLCBjb2RlIGludCk7CitleHBs YWluICh2ZXJib3NlLCBjb3N0cyBvZmYpCitTRUxFQ1QgKiBGUk9NIGVtcDEgZTEsIGVtcDEg ZTIgV0hFUkUgZTEuaWQgPSBlMi5pZCBBTkQgZTIuY29kZSA8PiBlMS5jb2RlOworICAgICAg ICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIFNlcSBTY2FuIG9uIHB1YmxpYy5lbXAxIGUyCisgICBPdXRwdXQ6IGUyLmlkLCBl Mi5jb2RlLCBlMi5pZCwgZTIuY29kZQorICAgRmlsdGVyOiAoKGUyLmlkIElTIE5PVCBOVUxM KSBBTkQgKGUyLmNvZGUgPD4gZTIuY29kZSkpCisoMyByb3dzKQorCistLSBXZSBjYW4gcmVt b3ZlIHRoZSBqb2luIGV2ZW4gaWYgd2UgZmluZCB0aGUgam9pbiBjYW4ndCBkdXBsaWNhdGUg cm93cyBhbmQKKy0tIHRoZSBiYXNlIHF1YWxzIG9mIGVhY2ggc2lkZSBhcmUgZGlmZmVyZW50 LiAgSW4gdGhlIGZvbGxvd2luZyBjYXNlIHdlIGVuZCB1cAorLS0gbW92aW5nIHF1YWxzIG92 ZXIgdG8gczEgdG8gbWFrZSBpdCBzbyBpdCBjYW4ndCBtYXRjaCBhbnkgcm93cy4KK2NyZWF0 ZSB0YWJsZSBzbChhIGludCwgYiBpbnQsIGMgaW50KTsKK2NyZWF0ZSB1bmlxdWUgaW5kZXgg b24gc2woYSwgYik7Cit2YWN1dW0gYW5hbHl6ZSBzbDsKKy0tIEJvdGggc2lkZXMgYXJlIHVu aXF1ZSwgYnV0IGJhc2UgcXVhbHMgYXJlIGRpZmZlcmVudAorZXhwbGFpbiAoY29zdHMgb2Zm KQorc2VsZWN0ICogZnJvbSBzbCB0MSwgc2wgdDIgd2hlcmUgdDEuYSA9IHQyLmEgYW5kIHQx LmIgPSAxIGFuZCB0Mi5iID0gMjsKKyAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4g RmlsdGVyOiAodDEuYSA9IHQyLmEpCisgICAtPiAgU2VxIFNjYW4gb24gc2wgdDEKKyAgICAg ICAgIEZpbHRlcjogKGIgPSAxKQorICAgLT4gIFNlcSBTY2FuIG9uIHNsIHQyCisgICAgICAg ICBGaWx0ZXI6IChiID0gMikKKyg2IHJvd3MpCisKKy0tIENoZWNrIE51bGxUZXN0IGluIGJh c2VyZXN0cmljdGluZm8gbGlzdAorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJv bSBzbCB0MSwgc2wgdDIKK3doZXJlIHQxLmEgPSB0Mi5hIGFuZCB0MS5iID0gMSBhbmQgdDIu YiA9IDIKKyAgYW5kIHQxLmMgSVMgTk9UIE5VTEwgYW5kIHQyLmMgSVMgTk9UIE5VTEwKKyAg YW5kIHQyLmIgSVMgTk9UIE5VTEwgYW5kIHQxLmIgSVMgTk9UIE5VTEwKKyAgYW5kIHQxLmEg SVMgTk9UIE5VTEwgYW5kIHQyLmEgSVMgTk9UIE5VTEw7CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5l c3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKHQxLmEgPSB0Mi5hKQorICAgLT4gIFNlcSBT Y2FuIG9uIHNsIHQxCisgICAgICAgICBGaWx0ZXI6ICgoYyBJUyBOT1QgTlVMTCkgQU5EIChi IElTIE5PVCBOVUxMKSBBTkQgKGEgSVMgTk9UIE5VTEwpIEFORCAoYiA9IDEpKQorICAgLT4g IFNlcSBTY2FuIG9uIHNsIHQyCisgICAgICAgICBGaWx0ZXI6ICgoYyBJUyBOT1QgTlVMTCkg QU5EIChiIElTIE5PVCBOVUxMKSBBTkQgKGEgSVMgTk9UIE5VTEwpIEFORCAoYiA9IDIpKQor KDYgcm93cykKKworZXhwbGFpbiAodmVyYm9zZSwgY29zdHMgb2ZmKQorc2VsZWN0ICogZnJv bSBzbCB0MSwgc2wgdDIKK3doZXJlIHQxLmIgPSB0Mi5iIGFuZCB0Mi5hID0gMyBhbmQgdDEu YSA9IDMKKyAgYW5kIHQxLmMgSVMgTk9UIE5VTEwgYW5kIHQyLmMgSVMgTk9UIE5VTEwKKyAg YW5kIHQyLmIgSVMgTk9UIE5VTEwgYW5kIHQxLmIgSVMgTk9UIE5VTEwKKyAgYW5kIHQxLmEg SVMgTk9UIE5VTEwgYW5kIHQyLmEgSVMgTk9UIE5VTEw7CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIFNlcSBTY2FuIG9uIHB1YmxpYy5zbCB0MgorICAgT3V0cHV0OiB0Mi5hLCB0 Mi5iLCB0Mi5jLCB0Mi5hLCB0Mi5iLCB0Mi5jCisgICBGaWx0ZXI6ICgodDIuYyBJUyBOT1Qg TlVMTCkgQU5EICh0Mi5iIElTIE5PVCBOVUxMKSBBTkQgKHQyLmEgSVMgTk9UIE5VTEwpIEFO RCAodDIuYSA9IDMpKQorKDMgcm93cykKKworLS0gSm9pbiBxdWFsIGlzbid0IG1lcmdlam9p bmFibGUsIGJ1dCBpbm5lciBpcyB1bmlxdWUuCitleHBsYWluIChDT1NUUyBPRkYpCitTRUxF Q1QgbjIuYSBGUk9NIHNqIG4xLCBzaiBuMiBXSEVSRSBuMS5hIDw+IG4yLmEgQU5EIG4yLmEg PSAxOworICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKG4xLmEg PD4gbjIuYSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBuMgorICAgICAgICAgRmlsdGVyOiAo YSA9IDEpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogbjEKKyg1IHJvd3MpCisKK2V4cGxhaW4g KENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00KKwkoU0VMRUNUIG4yLmEgRlJPTSBzaiBuMSwg c2ogbjIgV0hFUkUgbjEuYSA8PiBuMi5hKSBxMCwgc2wKK1dIRVJFIHEwLmEgPSAxOworICAg ICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKG4xLmEgPD4gbjIuYSkK KyAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNsCisgICAg ICAgICAtPiAgU2VxIFNjYW4gb24gc2ogbjIKKyAgICAgICAgICAgICAgIEZpbHRlcjogKGEg PSAxKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIG4xCisoNyByb3dzKQorCistLQorLS0tLSBP bmx5IG9uZSBzaWRlIGlzIHVucWl1ZQorLS1zZWxlY3QgKiBmcm9tIHNsIHQxLCBzbCB0MiB3 aGVyZSB0MS5hID0gdDIuYSBhbmQgdDEuYiA9IDE7CistLXNlbGVjdCAqIGZyb20gc2wgdDEs IHNsIHQyIHdoZXJlIHQxLmEgPSB0Mi5hIGFuZCB0Mi5iID0gMTsKKy0tCistLS0tIFNldmVy YWwgdW5pcXVlcyBpbmRleGVzIG1hdGNoLCBhbmQgd2Ugc2VsZWN0IGEgZGlmZmVyZW50IG9u ZQorLS0tLSBmb3IgZWFjaCBzaWRlLCBzbyB0aGUgam9pbiBpcyBub3QgcmVtb3ZlZAorLS1j cmVhdGUgdGFibGUgc20oYSBpbnQgdW5pcXVlLCBiIGludCB1bmlxdWUsIGMgaW50IHVuaXF1 ZSk7CistLWV4cGxhaW4gKGNvc3RzIG9mZikKKy0tc2VsZWN0ICogZnJvbSBzbSBtLCBzbSBu IHdoZXJlIG0uYSA9IG4uYiBhbmQgbS5jID0gbi5jOworLS1leHBsYWluIChjb3N0cyBvZmYp CistLXNlbGVjdCAqIGZyb20gc20gbSwgc20gbiB3aGVyZSBtLmEgPSBuLmMgYW5kIG0uYiA9 IG4uYjsKKy0tZXhwbGFpbiAoY29zdHMgb2ZmKQorLS1zZWxlY3QgKiBmcm9tIHNtIG0sIHNt IG4gd2hlcmUgbS5jID0gbi5iIGFuZCBtLmEgPSBuLmE7CistLSBDaGVjayBvcHRpbWl6YXRp b24gZGlzYWJsaW5nIGlmIGl0IHdpbGwgdmlvbGF0ZSBzcGVjaWFsIGpvaW4gY29uZGl0aW9u cy4KKy0tIFR3byBpZGVudGljYWwgam9pbmVkIHJlbGF0aW9ucyBzYXRpc2ZpZXMgc2VsZiBq b2luIHJlbW92YWwgY29uZGl0aW9ucyBidXQKKy0tIHN0YXkgaW4gZGlmZmVyZW50IHNwZWNp YWwgam9pbiBpbmZvcy4KK0NSRUFURSBUQUJMRSBzal90MSAoaWQgc2VyaWFsLCBhIGludCk7 CitDUkVBVEUgVEFCTEUgc2pfdDIgKGlkIHNlcmlhbCwgYSBpbnQpOworQ1JFQVRFIFRBQkxF IHNqX3QzIChpZCBzZXJpYWwsIGEgaW50KTsKK0NSRUFURSBUQUJMRSBzal90NCAoaWQgc2Vy aWFsLCBhIGludCk7CitDUkVBVEUgVU5JUVVFIElOREVYIE9OIHNqX3QzIFVTSU5HIGJ0cmVl IChhLGlkKTsKK0NSRUFURSBVTklRVUUgSU5ERVggT04gc2pfdDIgVVNJTkcgYnRyZWUgKGlk KTsKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gc2pfdDEKK0pPSU4gKAor CVNFTEVDVCBzal90Mi5pZCBBUyBpZCBGUk9NIHNqX3QyCisJV0hFUkUgRVhJU1RTCisJCSgK KwkJU0VMRUNUIFRSVUUgRlJPTSBzal90Myxzal90NCBXSEVSRSBzal90My5hID0gMSBBTkQg c2pfdDMuaWQgPSBzal90Mi5pZAorCQkpCisJKSB0MnQzdDQKK09OIHNqX3QxLmlkID0gdDJ0 M3Q0LmlkCitKT0lOICgKKwlTRUxFQ1Qgc2pfdDIuaWQgQVMgaWQgRlJPTSBzal90MgorCVdI RVJFIEVYSVNUUworCQkoCisJCVNFTEVDVCBUUlVFIEZST00gc2pfdDMsc2pfdDQgV0hFUkUg c2pfdDMuYSA9IDEgQU5EIHNqX3QzLmlkID0gc2pfdDIuaWQKKwkJKQorCSkgX3QydDN0NAor T04gc2pfdDEuaWQgPSBfdDJ0M3Q0LmlkOworICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisg ICBKb2luIEZpbHRlcjogKHNqX3QzLmlkID0gc2pfdDEuaWQpCisgICAtPiAgTmVzdGVkIExv b3AKKyAgICAgICAgIEpvaW4gRmlsdGVyOiAoc2pfdDMuaWQgPSBzal90Mi5pZCkKKyAgICAg ICAgIC0+ICBOZXN0ZWQgTG9vcCBTZW1pIEpvaW4KKyAgICAgICAgICAgICAgIC0+ICBOZXN0 ZWQgTG9vcAorICAgICAgICAgICAgICAgICAgICAgLT4gIEhhc2hBZ2dyZWdhdGUKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgIEdyb3VwIEtleTogc2pfdDMuaWQKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqX3Q0CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIC0+ICBCaXRtYXAgSGVhcCBTY2FuIG9uIHNqX3QzCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNoZWNrIENvbmQ6IChh ID0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ ICBCaXRtYXAgSW5kZXggU2NhbiBvbiBzal90M19hX2lkX2lkeAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGEgPSAx KQorICAgICAgICAgICAgICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyBzal90 Ml9pZF9pZHggb24gc2pfdDIgc2pfdDJfMQorICAgICAgICAgICAgICAgICAgICAgICAgICAg SW5kZXggQ29uZDogKGlkID0gc2pfdDMuaWQpCisgICAgICAgICAgICAgICAtPiAgTmVzdGVk IExvb3AKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcg c2pfdDNfYV9pZF9pZHggb24gc2pfdDMgc2pfdDNfMQorICAgICAgICAgICAgICAgICAgICAg ICAgICAgSW5kZXggQ29uZDogKChhID0gMSkgQU5EIChpZCA9IHNqX3QzLmlkKSkKKyAgICAg ICAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBzal90NCBzal90NF8xCisgICAgICAg ICAtPiAgSW5kZXggT25seSBTY2FuIHVzaW5nIHNqX3QyX2lkX2lkeCBvbiBzal90MgorICAg ICAgICAgICAgICAgSW5kZXggQ29uZDogKGlkID0gc2pfdDJfMS5pZCkKKyAgIC0+ICBTZXEg U2NhbiBvbiBzal90MQorKDI0IHJvd3MpCisKKy0tCistLSBUZXN0IFJvd01hcmtzLXJlbGF0 ZWQgY29kZQorLS0KKy0tIFRPRE86IFdoeSB0aGlzIHNlbGVjdCByZXR1cm5zIHR3byBjb2ll cyBvZiBjdGlkIGZpZWxkPyBTaG91bGQgd2UgZml4IGl0PworRVhQTEFJTiAoQ09TVFMgT0ZG KSAtLSBCb3RoIHNpZGVzIGhhdmUgZXhwbGljaXQgTG9ja1Jvd3MgbWFya3MKK1NFTEVDVCBh MS5hIEZST00gc2ogYTEsc2ogYTIgV0hFUkUgKGExLmE9YTIuYSkgRk9SIFVQREFURTsKKyAg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgTG9ja1Jvd3MKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBhMgorICAg ICAgICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKygzIHJvd3MpCisKK0VYUExBSU4gKENP U1RTIE9GRikgLS0gQSBSb3dNYXJrIGV4aXN0cyBmb3IgdGhlIHRhYmxlIGJlaW5nIGtlcHQK K1VQREFURSBzaiBzcSBTRVQgYiA9IDEgRlJPTSBzaiBhcyBzeiBXSEVSRSBzcS5hID0gc3ou YTsKKyAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgVXBkYXRlIG9uIHNqIHNxCisgICAtPiAgU2VxIFNjYW4g b24gc2ogc3oKKyAgICAgICAgIEZpbHRlcjogKGEgSVMgTk9UIE5VTEwpCisoMyByb3dzKQor CitDUkVBVEUgUlVMRSBzal9kZWxfcnVsZSBBUyBPTiBERUxFVEUgVE8gc2oKKyAgRE8gSU5T VEVBRAorICAgIFVQREFURSBzaiBTRVQgYSA9IDEgV0hFUkUgYSA9IG9sZC5hOworRVhQTEFJ TiAoQ09TVFMgT0ZGKSBERUxFVEUgRlJPTSBzajsgLS0gQSBSb3dNYXJrIGV4aXN0cyBmb3Ig dGhlIHRhYmxlIGJlaW5nIGRyb3BwZWQKKyAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgVXBkYXRlIG9uIHNq CisgICAtPiAgU2VxIFNjYW4gb24gc2oKKyAgICAgICAgIEZpbHRlcjogKGEgSVMgTk9UIE5V TEwpCisoMyByb3dzKQorCitEUk9QIFJVTEUgc2pfZGVsX3J1bGUgT04gc2ogQ0FTQ0FERTsK K3Jlc2V0IGVuYWJsZV9oYXNoam9pbjsKK3Jlc2V0IGVuYWJsZV9tZXJnZWpvaW47CiAtLQog LS0gVGVzdCBoaW50cyBnaXZlbiBvbiBpbmNvcnJlY3QgY29sdW1uIHJlZmVyZW5jZXMgYXJl IHVzZWZ1bAogLS0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3lz dmlld3Mub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zeXN2aWV3cy5vdXQKaW5k ZXggNGU3NzVhZjE3NS4uYzczNGQ1ZWNhNyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVz cy9leHBlY3RlZC9zeXN2aWV3cy5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3Rl ZC9zeXN2aWV3cy5vdXQKQEAgLTEyOSwxMCArMTI5LDExIEBAIHNlbGVjdCBuYW1lLCBzZXR0 aW5nIGZyb20gcGdfc2V0dGluZ3Mgd2hlcmUgbmFtZSBsaWtlICdlbmFibGUlJzsKICBlbmFi bGVfcGFydGl0aW9uX3BydW5pbmcgICAgICAgfCBvbgogIGVuYWJsZV9wYXJ0aXRpb253aXNl X2FnZ3JlZ2F0ZSB8IG9mZgogIGVuYWJsZV9wYXJ0aXRpb253aXNlX2pvaW4gICAgICB8IG9m ZgorIGVuYWJsZV9zZWxmX2pvaW5fcmVtb3ZhbCAgICAgICB8IG9uCiAgZW5hYmxlX3NlcXNj YW4gICAgICAgICAgICAgICAgIHwgb24KICBlbmFibGVfc29ydCAgICAgICAgICAgICAgICAg ICAgfCBvbgogIGVuYWJsZV90aWRzY2FuICAgICAgICAgICAgICAgICB8IG9uCi0oMjEgcm93 cykKKygyMiByb3dzKQogCiAtLSBUZXN0IHRoYXQgdGhlIHBnX3RpbWV6b25lX25hbWVzIGFu ZCBwZ190aW1lem9uZV9hYmJyZXZzIHZpZXdzIGFyZQogLS0gbW9yZS1vci1sZXNzIHdvcmtp bmcuICBXZSBjYW4ndCB0ZXN0IHRoZWlyIGNvbnRlbnRzIGluIGFueSBncmVhdCBkZXRhaWwK ZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2VxdWl2Y2xhc3Muc3FsIGIvc3Jj L3Rlc3QvcmVncmVzcy9zcWwvZXF1aXZjbGFzcy5zcWwKaW5kZXggMjQ3YjBhMzEwNS4uNzdk ZDk2NGViZiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZXF1aXZjbGFzcy5z cWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZXF1aXZjbGFzcy5zcWwKQEAgLTI1OSw2 ICsyNTksMjIgQEAgZHJvcCB1c2VyIHJlZ3Jlc3NfdXNlcl9lY3Rlc3Q7CiBleHBsYWluIChj b3N0cyBvZmYpCiAgIHNlbGVjdCAqIGZyb20gdGVuazEgd2hlcmUgdW5pcXVlMSA9IHVuaXF1 ZTEgYW5kIHVuaXF1ZTIgPSB1bmlxdWUyOwogCistLSBUZXN0IHRoYXQgYnJva2VuIEVDcyBh cmUgcHJvY2Vzc2VkIGNvcnJlY3RseSBkdXJpbmcgc2VsZiBqb2luIHJlbW92YWwuCistLSBE aXNhYmxlIG1lcmdlIGpvaW5zIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGFuIGVycm9yIGFib3V0 IG1pc3NpbmcgY29tbXV0YXRvci4KKy0tIFRlc3QgYm90aCBvcmllbnRhdGlvbnMgb2YgdGhl IGpvaW4gY2xhdXNlLCBiZWNhdXNlIG9ubHkgb25lIG9mIHRoZW0gYnJlYWtzCistLSB0aGUg RUMuCitzZXQgZW5hYmxlX21lcmdlam9pbiB0byBvZmY7CisKK2V4cGxhaW4gKGNvc3RzIG9m ZikKKyAgc2VsZWN0ICogZnJvbSBlYzAgbSBqb2luIGVjMCBuIG9uIG0uZmYgPSBuLmZmCisg IGpvaW4gZWMxIHAgb24gbS5mZiArIG4uZmYgPSBwLmYxOworCitleHBsYWluIChjb3N0cyBv ZmYpCisgIHNlbGVjdCAqIGZyb20gZWMwIG0gam9pbiBlYzAgbiBvbiBtLmZmID0gbi5mZgor ICBqb2luIGVjMSBwIG9uIHAuZjE6OmludDggPSAobS5mZiArIG4uZmYpOjppbnQ4YWxpYXMx OworCityZXNldCBlbmFibGVfbWVyZ2Vqb2luOworCiAtLSB0aGlzIGNvdWxkIGJlIGNvbnZl cnRlZCwgYnV0IGlzbid0IGF0IHByZXNlbnQKIGV4cGxhaW4gKGNvc3RzIG9mZikKICAgc2Vs ZWN0ICogZnJvbSB0ZW5rMSB3aGVyZSB1bmlxdWUxID0gdW5pcXVlMSBvciB1bmlxdWUyID0g dW5pcXVlMjsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pvaW4uc3FsIGIv c3JjL3Rlc3QvcmVncmVzcy9zcWwvam9pbi5zcWwKaW5kZXggYTI3YTcyMDg2ZS4uYWU0OTEx NWU4YSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvam9pbi5zcWwKKysrIGIv c3JjL3Rlc3QvcmVncmVzcy9zcWwvam9pbi5zcWwKQEAgLTE3NTMsNiArMTc1MywzMTEgQEAg c2VsZWN0ICogZnJvbQogc2VsZWN0ICogZnJvbQogICBpbnQ4X3RibCB4IGpvaW4gKGludDRf dGJsIHggY3Jvc3Mgam9pbiBpbnQ0X3RibCB5KGZmKSkgaiBvbiBxMSA9IGYxOyAtLSBvawog CistLQorLS0gdGVzdCB0aGF0IHNlbWktIG9yIGlubmVyIHNlbGYtam9pbnMgb24gYSB1bmlx dWUgY29sdW1uIGFyZSByZW1vdmVkCistLQorCistLSBlbmFibGUgb25seSBuZXN0bG9vcCB0 byBnZXQgbW9yZSBwcmVkaWN0YWJsZSBwbGFucworc2V0IGVuYWJsZV9oYXNoam9pbiB0byBv ZmY7CitzZXQgZW5hYmxlX21lcmdlam9pbiB0byBvZmY7CisKK2NyZWF0ZSB0YWJsZSBzaiAo YSBpbnQgdW5pcXVlLCBiIGludCwgYyBpbnQgdW5pcXVlKTsKK2luc2VydCBpbnRvIHNqIHZh bHVlcyAoMSwgbnVsbCwgMiksIChudWxsLCAyLCBudWxsKSwgKDIsIDEsIDEpOworYW5hbHl6 ZSBzajsKKworLS0gVHJpdmlhbCBzZWxmLWpvaW4gY2FzZS4KK2V4cGxhaW4gKGNvc3RzIG9m ZikKK3NlbGVjdCBwLiogZnJvbSBzaiBwLCBzaiBxIHdoZXJlIHEuYSA9IHAuYSBhbmQgcS5i ID0gcS5hIC0gMTsKK3NlbGVjdCBwLiogZnJvbSBzaiBwLCBzaiBxIHdoZXJlIHEuYSA9IHAu YSBhbmQgcS5iID0gcS5hIC0gMTsKKworLS0gU2VsZi1qb2luIHJlbW92YWwgcGVyZm9ybXMg YWZ0ZXIgYSBzdWJxdWVyeSBwdWxsLXVwIHByb2Nlc3MgYW5kIGNvdWxkIHJlbW92ZQorLS0g c3VjaCBraW5kIG9mIHNlbGYtam9pbiB0b28uIENoZWNrIHRoaXMgb3B0aW9uLgorZXhwbGFp biAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiBwCit3aGVyZSBleGlzdHMgKHNlbGVj dCAqIGZyb20gc2ogcQorCQkJCXdoZXJlIHEuYSA9IHAuYSBhbmQgcS5iIDwgMTApOworc2Vs ZWN0ICogZnJvbSBzaiBwIHdoZXJlIGV4aXN0cyAoc2VsZWN0ICogZnJvbSBzaiBxIHdoZXJl IHEuYSA9IHAuYSBhbmQgcS5iIDwgMTApOworCistLSBEb24ndCByZW1vdmUgc2VsZi1qb2lu IGZvciB0aGUgY2FzZSBvZiBlcXVhbGl0eSBvZiB0d28gZGlmZmVyZW50IHVuaXF1ZSBjb2x1 bW5zLgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB0MSwgc2ogdDIg d2hlcmUgdDEuYSA9IHQyLmMgYW5kIHQxLmIgaXMgbm90IG51bGw7CisKKy0tIERlZ2VuZXJh dGVkIGNhc2UuCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tCisJKHNlbGVj dCBhIGFzIHggZnJvbSBzaiB3aGVyZSBmYWxzZSkgYXMgcTEsCisJKHNlbGVjdCBhIGFzIHkg ZnJvbSBzaiB3aGVyZSBmYWxzZSkgYXMgcTIKK3doZXJlIHExLnggPSBxMi55OworCistLSBX ZSBjYW4ndCB1c2UgYSBjcm9zcy1FQyBnZW5lcmF0ZWQgc2VsZiBqb2luIHF1YWwgYmVjYXVz ZSBvZiBjdXJyZW50IGxvZ2ljIG9mCistLSB0aGUgZ2VuZXJhdGVfam9pbl9pbXBsaWVkX2Vx dWFsaXRpZXMgcm91dGluZS4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20g c2ogdDEsIHNqIHQyIHdoZXJlIHQxLmEgPSB0MS5iIGFuZCB0MS5iID0gdDIuYiBhbmQgdDIu YiA9IHQyLmE7CitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHQxLCBz aiB0Miwgc2ogdDMKK3doZXJlIHQxLmEgPSB0MS5iIGFuZCB0MS5iID0gdDIuYiBhbmQgdDIu YiA9IHQyLmEKKwlhbmQgdDEuYiA9IHQzLmIgYW5kIHQzLmIgPSB0My5hOworCistLSBEb3Vi bGUgc2VsZi1qb2luIHJlbW92YWwuCistLSBVc2UgYSBjb25kaXRpb24gb24gImIgKyAxIiwg bm90IG9uICJiIiwgZm9yIHRoZSBzZWNvbmQgam9pbiwgc28gdGhhdAorLS0gdGhlIGVxdWl2 YWxlbmNlIGNsYXNzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBmaXJzdCBvbmUsIGFuZCB3ZSBj YW4KKy0tIHRlc3QgdGhlIG5vbi1lYyBjb2RlIHBhdGguCitleHBsYWluIChjb3N0cyBvZmYp CitzZWxlY3QgKiBmcm9tIHNqIHQxIGpvaW4gc2ogdDIgb24gdDEuYSA9IHQyLmEgYW5kIHQx LmIgPSB0Mi5iCisJam9pbiBzaiB0MyBvbiB0Mi5hID0gdDMuYSBhbmQgdDIuYiArIDEgPSB0 My5iICsgMTsKKworLS0gc3Vic2VsZWN0IHRoYXQgcmVmZXJlbmNlcyB0aGUgcmVtb3ZlZCBy ZWxhdGlvbgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0IHQxLmEsIChzZWxlY3QgYSBm cm9tIHNqIHdoZXJlIGEgPSB0Mi5hIGFuZCBhID0gdDEuYSkKK2Zyb20gc2ogdDEsIHNqIHQy Cit3aGVyZSB0MS5hID0gdDIuYTsKKworLS0gc2VsZi1qb2luIHVuZGVyIG91dGVyIGpvaW4K K2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogeCBqb2luIHNqIHkgb24g eC5hID0geS5hCitsZWZ0IGpvaW4gaW50OF90YmwgeiBvbiB4LmEgPSB6LnExOworCitleHBs YWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHggam9pbiBzaiB5IG9uIHguYSA9 IHkuYQorbGVmdCBqb2luIGludDhfdGJsIHogb24geS5hID0gei5xMTsKKworZXhwbGFpbiAo Y29zdHMgb2ZmKQorU0VMRUNUICogRlJPTSAoCisgIFNFTEVDVCB0MS4qLCB0Mi5hIEFTIGF4 IEZST00gc2ogdDEgSk9JTiBzaiB0MgorICBPTiAodDEuYSA9IHQyLmEgQU5EIHQxLmMqdDEu YyA9IHQyLmMrMiBBTkQgdDIuYiBJUyBOVUxMKQorKSBBUyBxMQorTEVGVCBKT0lOCisgIChT RUxFQ1QgdDMuKiBGUk9NIHNqIHQzLCBzaiB0NCBXSEVSRSB0My5jID0gdDQuYykgQVMgcTIK K09OIHExLmF4ID0gcTIuYTsKKworLS0gVGVzdCB0aGF0IHBsYWNlaG9sZGVycyBhcmUgdXBk YXRlZCBjb3JyZWN0bHkgYWZ0ZXIgam9pbiByZW1vdmFsCitleHBsYWluIChjb3N0cyBvZmYp CitzZWxlY3QgKiBmcm9tICh2YWx1ZXMgKDEpKSB4CitsZWZ0IGpvaW4gKHNlbGVjdCBjb2Fs ZXNjZSh5LnExLCAxKSBmcm9tIGludDhfdGJsIHkKKwlyaWdodCBqb2luIHNqIGoxIGlubmVy IGpvaW4gc2ogajIgb24gajEuYSA9IGoyLmEKKwlvbiB0cnVlKSB6CitvbiB0cnVlOworCist LQorLS0gU0pSIGNvcm5lciBjYXNlOiB1bmlxdWVuZXNzIG9mIGFuIGlubmVyIGlzIFtwYXJ0 aWFsbHldIGRlcml2ZWQgZnJvbQorLS0gYmFzZXJlc3RyaWN0aW5mbyBjbGF1c2VzLgorLS0g WFhYOiBXZSByZWFsbHkgc2hvdWxkIGFsbG93IFNKUiBmb3IgdGhlc2UgY29ybmVyIGNhc2Vz PworLS0KKworSU5TRVJUIElOVE8gc2ogVkFMVUVTICgzLCAxLCAzKTsKKworZXhwbGFpbiAo Y29zdHMgb2ZmKSAtLSBEb24ndCByZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBz aiBqMiBXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSA9IDIgQU5EIGoyLmEgPSAzOworU0VM RUNUICogRlJPTSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0g MiBBTkQgajIuYSA9IDM7IC0tIFJldHVybiBvbmUgcm93CisKK2V4cGxhaW4gKGNvc3RzIG9m ZikgLS0gUmVtb3ZlIFNKLCBkZWZpbmUgdW5pcXVlbmVzcyBieSBhIGNvbnN0YW50CisJU0VM RUNUICogRlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEgPSAy IEFORCBqMi5hID0gMjsKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5i ID0gajIuYiBBTkQgajEuYSA9IDIgQU5EIGoyLmEgPSAyOyAtLSBSZXR1cm4gb25lIHJvdwor CitleHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYpIC0tIFJlbW92ZSBTSiwgZGVmaW5lIHVu aXF1ZW5lc3MgYnkgYSBjb25zdGFudCBleHByZXNzaW9uCisJU0VMRUNUICogRlJPTSBzaiBq MSwgc2ogajIKKyAgV0hFUkUgajEuYiA9IGoyLmIKKyAgICBBTkQgajEuYSA9IEVYVFJBQ1Qo REFZIEZST00gY3VycmVudF90aW1lc3RhbXAoMCkpOjppbnQKKyAgICBBTkQgRVhUUkFDVChE QVkgRlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSk6OmludCA9IGoyLmE7CitTRUxFQ1QgKiBG Uk9NIHNqIGoxLCBzaiBqMgorV0hFUkUgajEuYiA9IGoyLmIKKyAgQU5EIGoxLmEgPSBFWFRS QUNUKERBWSBGUk9NIGN1cnJlbnRfdGltZXN0YW1wKDApKTo6aW50CisgIEFORCBFWFRSQUNU KERBWSBGUk9NIGN1cnJlbnRfdGltZXN0YW1wKDApKTo6aW50ID0gajIuYTsgLS0gUmV0dXJu IG9uZSBjb2x1bW4KKworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBSZW1vdmUgU0oKKwlTRUxF Q1QgKiBGUk9NIHNqIGoxLCBzaiBqMiBXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSA9IDEg QU5EIGoyLmEgPSAxOworU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIg PSBqMi5iIEFORCBqMS5hID0gMSBBTkQgajIuYSA9IDE7IC0tIFJldHVybiBubyByb3dzCisK K2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gU2h1ZmZsZSBhIGNsYXVzZS4gUmVtb3ZlIFNKCisJ U0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIDEgPSBq MS5hIEFORCBqMi5hID0gMTsKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCitXSEVSRSBq MS5iID0gajIuYiBBTkQgMSA9IGoxLmEgQU5EIGoyLmEgPSAxOyAtLSBSZXR1cm4gbm8gcm93 cworCistLSBGdW5jdGlvbmFsIGluZGV4CitDUkVBVEUgVU5JUVVFIElOREVYIHNqX2ZuX2lk eCBPTiBzaigoYSAqIGEpKTsKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gUmVtb3ZlIFNKCisJ U0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKKwlXSEVSRSBqMS5iID0gajIuYiBBTkQgajEu YSpqMS5hID0gMSBBTkQgajIuYSpqMi5hID0gMTsKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0g RG9uJ3QgcmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKKwlXSEVSRSBq MS5iID0gajIuYiBBTkQgajEuYSpqMS5hID0gMSBBTkQgajIuYSpqMi5hID0gMjsKKworLS0g TXVsdGlwbGUgZmlsdGVycworQ1JFQVRFIFVOSVFVRSBJTkRFWCBzal90ZW1wX2lkeDEgT04g c2ooYSxiLGMpOworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBSZW1vdmUgU0oKKwlTRUxFQ1Qg KiBGUk9NIHNqIGoxLCBzaiBqMgorCVdIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMiBB TkQgajEuYyA9IDMgQU5EIGoyLmEgPSAyIEFORCAzID0gajIuYzsKK2V4cGxhaW4gKGNvc3Rz IG9mZikgLS0gRG9uJ3QgcmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIK KwlXSEVSRSBqMS5iID0gajIuYiBBTkQgMiA9IGoxLmEgQU5EIGoxLmMgPSAzIEFORCBqMi5h ID0gMSBBTkQgMyA9IGoyLmM7CisKK0NSRUFURSBVTklRVUUgSU5ERVggc2pfdGVtcF9pZHgg T04gc2ooYSxiKTsKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gRG9uJ3QgcmVtb3ZlIFNKCisJ U0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEg PSAyOworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBEb24ndCByZW1vdmUgU0oKKwlTRUxFQ1Qg KiBGUk9NIHNqIGoxLCBzaiBqMiBXSEVSRSBqMS5iID0gajIuYiBBTkQgMiA9IGoyLmE7Citl eHBsYWluIChjb3N0cyBvZmYpIC0tIERvbid0IHJlbW92ZSBTSgorCVNFTEVDVCAqIEZST00g c2ogajEsIHNqIGoyIFdIRVJFIGoxLmIgPSBqMi5iIEFORCAoajEuYSA9IDEgT1IgajIuYSA9 IDEpOworRFJPUCBJTkRFWCBzal9mbl9pZHgsIHNqX3RlbXBfaWR4MSwgc2pfdGVtcF9pZHg7 CisKKy0tIFRlc3QgdGhhdCBPUiBwcmVkaWNhdGVkIGFyZSB1cGRhdGVkIGNvcnJlY3RseSBh ZnRlciBqb2luIHJlbW92YWwKK0NSRUFURSBUQUJMRSB0YWJfd2l0aF9mbGFnICggaWQgSU5U IFBSSU1BUlkgS0VZLCBpc19mbGFnIFNNQUxMSU5UKTsKK0NSRUFURSBJTkRFWCBpZHhfdGVz dF9pc19mbGFnIE9OIHRhYl93aXRoX2ZsYWcgKGlzX2ZsYWcpOworZXhwbGFpbiAoY29zdHMg b2ZmKQorU0VMRUNUIENPVU5UKCopIEZST00gdGFiX3dpdGhfZmxhZworV0hFUkUKKwkoaXNf ZmxhZyBJUyBOVUxMIE9SIGlzX2ZsYWcgPSAwKQorCUFORCBpZCBJTiAoU0VMRUNUIGlkIEZS T00gdGFiX3dpdGhfZmxhZyBXSEVSRSBpZCBJTiAoMiwgMykpOworRFJPUCBUQUJMRSB0YWJf d2l0aF9mbGFnOworCistLSBIQVZJTkcgY2xhdXNlCitleHBsYWluIChjb3N0cyBvZmYpCitz ZWxlY3QgcC5iIGZyb20gc2ogcCBqb2luIHNqIHEgb24gcC5hID0gcS5hIGdyb3VwIGJ5IHAu YiBoYXZpbmcgc3VtKHAuYSkgPSAxOworCistLSB1cGRhdGUgbGF0ZXJhbCByZWZlcmVuY2Vz IGFuZCByYW5nZSB0YWJsZSBlbnRyeSByZWZlcmVuY2UKK2V4cGxhaW4gKHZlcmJvc2UsIGNv c3RzIG9mZikKK3NlbGVjdCAxIGZyb20gKHNlbGVjdCB4LiogZnJvbSBzaiB4LCBzaiB5IHdo ZXJlIHguYSA9IHkuYSkgcSwKKyAgbGF0ZXJhbCBnZW5lcmF0ZV9zZXJpZXMoMSwgcS5hKSBn cyhpKTsKKworZXhwbGFpbiAodmVyYm9zZSwgY29zdHMgb2ZmKQorc2VsZWN0IDEgZnJvbSAo c2VsZWN0IHkuKiBmcm9tIHNqIHgsIHNqIHkgd2hlcmUgeC5hID0geS5hKSBxLAorICBsYXRl cmFsIGdlbmVyYXRlX3NlcmllcygxLCBxLmEpIGdzKGkpOworCistLSBUZXN0IHRoYXQgYSBu b24tRUMtZGVyaXZlZCBqb2luIGNsYXVzZSBpcyBwcm9jZXNzZWQgY29ycmVjdGx5LiBVc2Ug YW4KKy0tIG91dGVyIGpvaW4gc28gdGhhdCB3ZSBjYW4ndCBmb3JtIGFuIEVDLgorZXhwbGFp biAoY29zdHMgb2ZmKSBzZWxlY3QgKiBmcm9tIHNqIHAgam9pbiBzaiBxIG9uIHAuYSA9IHEu YQorICBsZWZ0IGpvaW4gc2ogciBvbiBwLmEgKyBxLmEgPSByLmE7CisKKy0tIEZJWE1FIHRo aXMgY29uc3RhbnQgZmFsc2UgZmlsdGVyIGRvZXNuJ3QgbG9vayBnb29kLiBTaG91bGQgd2Ug bWVyZ2UKKy0tIGVxdWl2YWxlbmNlIGNsYXNzZXM/CitleHBsYWluIChjb3N0cyBvZmYpCitz ZWxlY3QgKiBmcm9tIHNqIHAsIHNqIHEgd2hlcmUgcC5hID0gcS5hIGFuZCBwLmIgPSAxIGFu ZCBxLmIgPSAyOworCistLSBDaGVjayB0aGF0IGF0dHJfbmVlZGVkIGlzIHVwZGF0ZWQgY29y cmVjdGx5IGFmdGVyIHNlbGYtam9pbiByZW1vdmFsLiBJbiB0aGlzCistLSB0ZXN0LCB0aGUg am9pbiBvZiBqMSB3aXRoIGoyIGlzIHJlbW92ZWQuIGsxLmIgaXMgcmVxdWlyZWQgYXQgZWl0 aGVyIGoxIG9yIGoyLgorLS0gSWYgdGhpcyBpbmZvIGlzIGxvc3QsIGpvaW4gdGFyZ2V0bGlz dCBmb3IgKGsxLCBrMikgd2lsbCBub3QgY29udGFpbiBrMS5iLgorLS0gVXNlIGluZGV4IHNj YW4gZm9yIGsxIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0ICdiJyBmcm9tIHBoeXNpY2FsIHRsaXN0 IHVzZWQgZm9yCistLSBzZXFzY2FuLiBBbHNvIGRpc2FibGUgcmVvcmRlcmluZyBvZiBqb2lu cyBiZWNhdXNlIHRoaXMgdGVzdCBkZXBlbmRzIG9uIGEKKy0tIHBhcnRpY3VsYXIgam9pbiB0 cmVlLgorY3JlYXRlIHRhYmxlIHNrIChhIGludCwgYiBpbnQpOworY3JlYXRlIGluZGV4IG9u IHNrKGEpOworc2V0IGpvaW5fY29sbGFwc2VfbGltaXQgdG8gMTsKK3NldCBlbmFibGVfc2Vx c2NhbiB0byBvZmY7CitleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCAxIGZyb20KKwkoc2sg azEgam9pbiBzayBrMiBvbiBrMS5hID0gazIuYSkKKwlqb2luIChzaiBqMSBqb2luIHNqIGoy IG9uIGoxLmEgPSBqMi5hKSBvbiBqMS5iID0gazEuYjsKK2V4cGxhaW4gKGNvc3RzIG9mZikg c2VsZWN0IDEgZnJvbQorCShzayBrMSBqb2luIHNrIGsyIG9uIGsxLmEgPSBrMi5hKQorCWpv aW4gKHNqIGoxIGpvaW4gc2ogajIgb24gajEuYSA9IGoyLmEpIG9uIGoyLmIgPSBrMS5iOwor cmVzZXQgam9pbl9jb2xsYXBzZV9saW1pdDsKK3Jlc2V0IGVuYWJsZV9zZXFzY2FuOworCist LSBDaGVjayB0aGF0IGNsYXVzZXMgZnJvbSB0aGUgam9pbiBmaWx0ZXIgbGlzdCBpcyBub3Qg bG9zdCBvbiB0aGUgc2VsZi1qb2luIHJlbW92YWwKK0NSRUFURSBUQUJMRSBlbXAxICggaWQg U0VSSUFMIFBSSU1BUlkgS0VZIE5PVCBOVUxMLCBjb2RlIGludCk7CitleHBsYWluICh2ZXJi b3NlLCBjb3N0cyBvZmYpCitTRUxFQ1QgKiBGUk9NIGVtcDEgZTEsIGVtcDEgZTIgV0hFUkUg ZTEuaWQgPSBlMi5pZCBBTkQgZTIuY29kZSA8PiBlMS5jb2RlOworCistLSBXZSBjYW4gcmVt b3ZlIHRoZSBqb2luIGV2ZW4gaWYgd2UgZmluZCB0aGUgam9pbiBjYW4ndCBkdXBsaWNhdGUg cm93cyBhbmQKKy0tIHRoZSBiYXNlIHF1YWxzIG9mIGVhY2ggc2lkZSBhcmUgZGlmZmVyZW50 LiAgSW4gdGhlIGZvbGxvd2luZyBjYXNlIHdlIGVuZCB1cAorLS0gbW92aW5nIHF1YWxzIG92 ZXIgdG8gczEgdG8gbWFrZSBpdCBzbyBpdCBjYW4ndCBtYXRjaCBhbnkgcm93cy4KK2NyZWF0 ZSB0YWJsZSBzbChhIGludCwgYiBpbnQsIGMgaW50KTsKK2NyZWF0ZSB1bmlxdWUgaW5kZXgg b24gc2woYSwgYik7Cit2YWN1dW0gYW5hbHl6ZSBzbDsKKworLS0gQm90aCBzaWRlcyBhcmUg dW5pcXVlLCBidXQgYmFzZSBxdWFscyBhcmUgZGlmZmVyZW50CitleHBsYWluIChjb3N0cyBv ZmYpCitzZWxlY3QgKiBmcm9tIHNsIHQxLCBzbCB0MiB3aGVyZSB0MS5hID0gdDIuYSBhbmQg dDEuYiA9IDEgYW5kIHQyLmIgPSAyOworCistLSBDaGVjayBOdWxsVGVzdCBpbiBiYXNlcmVz dHJpY3RpbmZvIGxpc3QKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2wg dDEsIHNsIHQyCit3aGVyZSB0MS5hID0gdDIuYSBhbmQgdDEuYiA9IDEgYW5kIHQyLmIgPSAy CisgIGFuZCB0MS5jIElTIE5PVCBOVUxMIGFuZCB0Mi5jIElTIE5PVCBOVUxMCisgIGFuZCB0 Mi5iIElTIE5PVCBOVUxMIGFuZCB0MS5iIElTIE5PVCBOVUxMCisgIGFuZCB0MS5hIElTIE5P VCBOVUxMIGFuZCB0Mi5hIElTIE5PVCBOVUxMOworZXhwbGFpbiAodmVyYm9zZSwgY29zdHMg b2ZmKQorc2VsZWN0ICogZnJvbSBzbCB0MSwgc2wgdDIKK3doZXJlIHQxLmIgPSB0Mi5iIGFu ZCB0Mi5hID0gMyBhbmQgdDEuYSA9IDMKKyAgYW5kIHQxLmMgSVMgTk9UIE5VTEwgYW5kIHQy LmMgSVMgTk9UIE5VTEwKKyAgYW5kIHQyLmIgSVMgTk9UIE5VTEwgYW5kIHQxLmIgSVMgTk9U IE5VTEwKKyAgYW5kIHQxLmEgSVMgTk9UIE5VTEwgYW5kIHQyLmEgSVMgTk9UIE5VTEw7CisK Ky0tIEpvaW4gcXVhbCBpc24ndCBtZXJnZWpvaW5hYmxlLCBidXQgaW5uZXIgaXMgdW5pcXVl LgorZXhwbGFpbiAoQ09TVFMgT0ZGKQorU0VMRUNUIG4yLmEgRlJPTSBzaiBuMSwgc2ogbjIg V0hFUkUgbjEuYSA8PiBuMi5hIEFORCBuMi5hID0gMTsKK2V4cGxhaW4gKENPU1RTIE9GRikK K1NFTEVDVCAqIEZST00KKwkoU0VMRUNUIG4yLmEgRlJPTSBzaiBuMSwgc2ogbjIgV0hFUkUg bjEuYSA8PiBuMi5hKSBxMCwgc2wKK1dIRVJFIHEwLmEgPSAxOworCistLQorLS0tLSBPbmx5 IG9uZSBzaWRlIGlzIHVucWl1ZQorLS1zZWxlY3QgKiBmcm9tIHNsIHQxLCBzbCB0MiB3aGVy ZSB0MS5hID0gdDIuYSBhbmQgdDEuYiA9IDE7CistLXNlbGVjdCAqIGZyb20gc2wgdDEsIHNs IHQyIHdoZXJlIHQxLmEgPSB0Mi5hIGFuZCB0Mi5iID0gMTsKKy0tCistLS0tIFNldmVyYWwg dW5pcXVlcyBpbmRleGVzIG1hdGNoLCBhbmQgd2Ugc2VsZWN0IGEgZGlmZmVyZW50IG9uZQor LS0tLSBmb3IgZWFjaCBzaWRlLCBzbyB0aGUgam9pbiBpcyBub3QgcmVtb3ZlZAorLS1jcmVh dGUgdGFibGUgc20oYSBpbnQgdW5pcXVlLCBiIGludCB1bmlxdWUsIGMgaW50IHVuaXF1ZSk7 CistLWV4cGxhaW4gKGNvc3RzIG9mZikKKy0tc2VsZWN0ICogZnJvbSBzbSBtLCBzbSBuIHdo ZXJlIG0uYSA9IG4uYiBhbmQgbS5jID0gbi5jOworLS1leHBsYWluIChjb3N0cyBvZmYpCist LXNlbGVjdCAqIGZyb20gc20gbSwgc20gbiB3aGVyZSBtLmEgPSBuLmMgYW5kIG0uYiA9IG4u YjsKKy0tZXhwbGFpbiAoY29zdHMgb2ZmKQorLS1zZWxlY3QgKiBmcm9tIHNtIG0sIHNtIG4g d2hlcmUgbS5jID0gbi5iIGFuZCBtLmEgPSBuLmE7CisKKy0tIENoZWNrIG9wdGltaXphdGlv biBkaXNhYmxpbmcgaWYgaXQgd2lsbCB2aW9sYXRlIHNwZWNpYWwgam9pbiBjb25kaXRpb25z LgorLS0gVHdvIGlkZW50aWNhbCBqb2luZWQgcmVsYXRpb25zIHNhdGlzZmllcyBzZWxmIGpv aW4gcmVtb3ZhbCBjb25kaXRpb25zIGJ1dAorLS0gc3RheSBpbiBkaWZmZXJlbnQgc3BlY2lh bCBqb2luIGluZm9zLgorQ1JFQVRFIFRBQkxFIHNqX3QxIChpZCBzZXJpYWwsIGEgaW50KTsK K0NSRUFURSBUQUJMRSBzal90MiAoaWQgc2VyaWFsLCBhIGludCk7CitDUkVBVEUgVEFCTEUg c2pfdDMgKGlkIHNlcmlhbCwgYSBpbnQpOworQ1JFQVRFIFRBQkxFIHNqX3Q0IChpZCBzZXJp YWwsIGEgaW50KTsKKworQ1JFQVRFIFVOSVFVRSBJTkRFWCBPTiBzal90MyBVU0lORyBidHJl ZSAoYSxpZCk7CitDUkVBVEUgVU5JUVVFIElOREVYIE9OIHNqX3QyIFVTSU5HIGJ0cmVlIChp ZCk7CisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gc2pfdDEKK0pPSU4g KAorCVNFTEVDVCBzal90Mi5pZCBBUyBpZCBGUk9NIHNqX3QyCisJV0hFUkUgRVhJU1RTCisJ CSgKKwkJU0VMRUNUIFRSVUUgRlJPTSBzal90Myxzal90NCBXSEVSRSBzal90My5hID0gMSBB TkQgc2pfdDMuaWQgPSBzal90Mi5pZAorCQkpCisJKSB0MnQzdDQKK09OIHNqX3QxLmlkID0g dDJ0M3Q0LmlkCitKT0lOICgKKwlTRUxFQ1Qgc2pfdDIuaWQgQVMgaWQgRlJPTSBzal90Mgor CVdIRVJFIEVYSVNUUworCQkoCisJCVNFTEVDVCBUUlVFIEZST00gc2pfdDMsc2pfdDQgV0hF UkUgc2pfdDMuYSA9IDEgQU5EIHNqX3QzLmlkID0gc2pfdDIuaWQKKwkJKQorCSkgX3QydDN0 NAorT04gc2pfdDEuaWQgPSBfdDJ0M3Q0LmlkOworCistLQorLS0gVGVzdCBSb3dNYXJrcy1y ZWxhdGVkIGNvZGUKKy0tCisKKy0tIFRPRE86IFdoeSB0aGlzIHNlbGVjdCByZXR1cm5zIHR3 byBjb2llcyBvZiBjdGlkIGZpZWxkPyBTaG91bGQgd2UgZml4IGl0PworRVhQTEFJTiAoQ09T VFMgT0ZGKSAtLSBCb3RoIHNpZGVzIGhhdmUgZXhwbGljaXQgTG9ja1Jvd3MgbWFya3MKK1NF TEVDVCBhMS5hIEZST00gc2ogYTEsc2ogYTIgV0hFUkUgKGExLmE9YTIuYSkgRk9SIFVQREFU RTsKKworRVhQTEFJTiAoQ09TVFMgT0ZGKSAtLSBBIFJvd01hcmsgZXhpc3RzIGZvciB0aGUg dGFibGUgYmVpbmcga2VwdAorVVBEQVRFIHNqIHNxIFNFVCBiID0gMSBGUk9NIHNqIGFzIHN6 IFdIRVJFIHNxLmEgPSBzei5hOworCitDUkVBVEUgUlVMRSBzal9kZWxfcnVsZSBBUyBPTiBE RUxFVEUgVE8gc2oKKyAgRE8gSU5TVEVBRAorICAgIFVQREFURSBzaiBTRVQgYSA9IDEgV0hF UkUgYSA9IG9sZC5hOworRVhQTEFJTiAoQ09TVFMgT0ZGKSBERUxFVEUgRlJPTSBzajsgLS0g QSBSb3dNYXJrIGV4aXN0cyBmb3IgdGhlIHRhYmxlIGJlaW5nIGRyb3BwZWQKK0RST1AgUlVM RSBzal9kZWxfcnVsZSBPTiBzaiBDQVNDQURFOworCityZXNldCBlbmFibGVfaGFzaGpvaW47 CityZXNldCBlbmFibGVfbWVyZ2Vqb2luOworCiAtLQogLS0gVGVzdCBoaW50cyBnaXZlbiBv biBpbmNvcnJlY3QgY29sdW1uIHJlZmVyZW5jZXMgYXJlIHVzZWZ1bAogLS0KZGlmZiAtLWdp dCBhL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0IGIvc3JjL3Rvb2xzL3BnaW5k ZW50L3R5cGVkZWZzLmxpc3QKaW5kZXggNGZiNzQ2OTMwYS4uZmFmMWQ4ZTBiYSAxMDA2NDQK LS0tIGEvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QKKysrIGIvc3JjL3Rvb2xz L3BnaW5kZW50L3R5cGVkZWZzLmxpc3QKQEAgLTM2Miw2ICszNjIsNyBAQCBDYXRhbG9nSWQK IENhdGFsb2dJZE1hcEVudHJ5CiBDYXRhbG9nSW5kZXhTdGF0ZQogQ2hhbmdlVmFyTm9kZXNf Y29udGV4dAorQ2hhbmdlVmFybm9Db250ZXh0CiBDaGVja1BvaW50CiBDaGVja1BvaW50U3Rt dAogQ2hlY2twb2ludFN0YXRzRGF0YQpAQCAtMzc1Nyw2ICszNzU4LDcgQEAgdW5pY29kZVN0 eWxlQ29sdW1uRm9ybWF0CiB1bmljb2RlU3R5bGVGb3JtYXQKIHVuaWNvZGVTdHlsZVJvd0Zv cm1hdAogdW5pY29kZV9saW5lc3R5bGUKK1VuaXF1ZVJlbEluZm8KIHVuaXRfY29udmVyc2lv bgogdW5sb2dnZWRfcmVsYXRpb25fZW50cnkKIHV0Zl9sb2NhbF9jb252ZXJzaW9uX2Z1bmMK LS0gCjIuMzcuMAoK --------------GcNEQILBO0PR5pXEPEcBnaL1--