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 1nQ5Ti-0006lZ-JM for pgsql-hackers@arkaria.postgresql.org; Fri, 04 Mar 2022 10:48:17 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nQ5Th-0003di-GE for pgsql-hackers@arkaria.postgresql.org; Fri, 04 Mar 2022 10:48:05 +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 1nQ5Th-0003dZ-1e for pgsql-hackers@lists.postgresql.org; Fri, 04 Mar 2022 10:48:05 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nQ5TX-0007q0-Tb for pgsql-hackers@lists.postgresql.org; Fri, 04 Mar 2022 10:48:04 +0000 Received: from [172.20.10.3] (unknown [193.143.64.8]) (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 1666621CB491; Fri, 4 Mar 2022 13:47:49 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1646390869; bh=QUKlMhD6jQoiu+9rlVcpgUu26244mOBYpqG6Sz09P08=; h=Date:Subject:To:Cc:References:From:In-Reply-To; b=WVQNT4stzVom9Xim8a5vMkD4a9dyPTV8ludO+dIZsjLwfC6q//w/Ujq+OTEwI0hXp vogEjpnBS9G7mwyJM74BHfTndOOvTzrqPlzjBA+Tamyms9cxUP75vDufR1UNQP0s56 sWyVGQKg1UgTMi97XwLfYph9iP9y4bBYxnT4poyk= Content-Type: multipart/mixed; boundary="------------mxj9vgKwbTKZF5jTaRicuQln" Message-ID: <13a0026b-46eb-cbfa-6dbb-4bc2ce210c27@postgrespro.ru> Date: Fri, 4 Mar 2022 15:47:47 +0500 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:91.0) Gecko/20100101 Thunderbird/91.6.1 Subject: Re: Removing unneeded self joins Content-Language: en-US To: Greg Stark , Ronan Dunklau Cc: Laurenz Albe , Hywel Carver , PostgreSQL Hackers , Konstantin Knizhnik References: <64486b0b-0404-e39e-322d-0801154901f3@postgrespro.ru> <2a6e540a-4c9f-9402-2e02-71e35fcd4dd1@postgrespro.ru> <4911774.fQZKmtWmdp@aivenronan> From: Andrey Lepikhov Organization: Postgres Professional In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------mxj9vgKwbTKZF5jTaRicuQln Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 1/3/2022 03:03, Greg Stark wrote: > On Thu, 1 Jul 2021 at 02:38, Ronan Dunklau wrote: >> >> Well in some cases they can't, when the query is not emitting redundant >> predicates by itself but they are added by something else like a view or a RLS >> policy. >> Maybe it would be worth it to allow spending a bit more time planning for >> those cases ? > > Yeah, I'm generally in favour of doing more work in the optimizer to > save query authors work writing queries. > > My question is whether it handles cases like: > > select b.x,c.y > from t > join t2 as b on (b.id = t.id) > join t2 as c on (c.id = t.id) > > That is, if you join against the same table twice on the same qual. > Does the EC mechanism turn this into a qual on b.id = c.id and then > turn this into a self-join that can be removed? Yes, the self-join removal machinery uses EC mechanism as usual to get all join clauses. So, this case works (See demo in attachment). Also, in new version of the patch I fixed one stupid bug: checking a self-join candidate expression operator - we can remove only expressions like F(arg1) = G(arg2). -- regards, Andrey Lepikhov Postgres Professional --------------mxj9vgKwbTKZF5jTaRicuQln Content-Type: text/plain; charset=UTF-8; name="v30-0001-Remove-self-joins.patch" Content-Disposition: attachment; filename="v30-0001-Remove-self-joins.patch" Content-Transfer-Encoding: base64 RnJvbSA3MDM5ODM2MWEwYTBkOWM2YzNjN2RkZDFmZDMwNWFjMTExMzhlN2IxIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmV5IFYuIExlcGlraG92IiA8YS5sZXBpa2hv dkBwb3N0Z3Jlc3Byby5ydT4KRGF0ZTogVGh1LCAxNSBKdWwgMjAyMSAxNToyNjoxMyArMDMw MApTdWJqZWN0OiBbUEFUQ0hdIFJlbW92ZSBzZWxmLWpvaW5zLgoKUmVtb3ZlIGlubmVyIGpv aW5zIG9mIGEgcmVsYXRpb24gdG8gaXRzZWxmIGlmIGNvdWxkIHByb3ZlIHRoYXQgdGhlIGpv aW4KY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBzY2FuLiBXZSBjYW4gcHJvdmUgdGhlIHVuaXF1 ZW5lc3MKdXNpbmcgdGhlIGV4aXN0aW5nIGlubmVycmVsX2lzX3VuaXF1ZSBtYWNoaW5lcnku CgpXZSBjYW4gcmVtb3ZlIGEgc2VsZi1qb2luIHdoZW4gZm9yIGVhY2ggb3V0ZXIgcm93Ogox LiBBdCBtb3N0IG9uZSBpbm5lciByb3cgbWF0Y2hlcyB0aGUgam9pbiBjbGF1c2VzLgoyLiBJ ZiB0aGUgam9pbiB0YXJnZXQgbGlzdCBjb250YWlucyBhbnkgaW5uZXIgdmFycywgYW4gaW5u ZXIgcm93Cm11c3QgYmUgKHBoeXNpY2FsbHkpIHRoZSBzYW1lIHJvdyBhcyB0aGUgb3V0ZXIg b25lLgoKSW4gdGhpcyBwYXRjaCB3ZSB1c2UgUm93bGV5J3MgWzFdIGFwcHJvYWNoIHRvIGlk ZW50aWZ5IGEgc2VsZi1qb2luOgoxLiBDb2xsZWN0IGFsbCBtZXJnZWpvaW5hYmxlIGpvaW4g cXVhbHMgd2hpY2ggbG9vayBsaWtlIGEueCA9IGIueAoyLiBDaGVjayBpbm5lcnJlbF9pc191 bmlxdWUoKSBmb3IgdGhlIHF1YWwgbGlzdCBmcm9tICgxKS4gSWYgaXQKcmV0dXJucyB0cnVl LCB0aGVuIG91dGVyIHJvdyBtYXRjaGVzIG9ubHkgdGhlIHNhbWUgcm93IGZyb20gdGhlIGlu bmVyCnJlbGF0aW9uLiBTbyBwcm92ZWQsIHRoYXQgdGhpcyBqb2luIGlzIHNlbGYtam9pbiBh bmQgY2FuIGJlIHJlcGxhY2VkIGJ5CmEgc2Nhbi4KClNvbWUgcmVncmVzc2lvbiB0ZXN0cyBj aGFuZ2VkIGR1ZSB0byBzZWxmLWpvaW4gcmVtb3ZhbCBsb2dpYy4KClsxXSBodHRwczovL3d3 dy5wb3N0Z3Jlc3FsLm9yZy9tZXNzYWdlLWlkL3Jhdy9DQUFwSER2cGdnbkZNQzR5UC1qVU83 UEtOJTNEZlhlRXJXNWJPeGlzdkowSHZrSFFFWSUzRFd3JTQwbWFpbC5nbWFpbC5jb20KLS0t CiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9hbmFseXplam9pbnMuYyB8IDg4OCArKysr KysrKysrKysrKysrKysrKystCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9wbGFubWFp bi5jICAgICB8ICAgNSArCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9qb2luaW5mby5j ICAgICB8ICAgMyArCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9yZWxub2RlLmMgICAg ICB8ICAyNiArLQogc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWMuYyAgICAgICAgICAgICAg fCAgMTAgKwogc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BhdGhub2RlLmggICAgICAgICAgfCAg IDQgKwogc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BsYW5tYWluLmggICAgICAgICAgfCAgIDIg Kwogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9lcXVpdmNsYXNzLm91dCAgfCAgMzIgKwog c3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dCAgICAgICAgfCA0MjYgKysrKysr KysrKysKIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3lzdmlld3Mub3V0ICAgIHwgICAz ICstCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9lcXVpdmNsYXNzLnNxbCAgICAgICB8ICAxNiAr CiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbCAgICAgICAgICAgICB8IDE5NyArKysr KwogMTIgZmlsZXMgY2hhbmdlZCwgMTU4MyBpbnNlcnRpb25zKCspLCAyOSBkZWxldGlvbnMo LSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9hbmFseXplam9p bnMuYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2FuYWx5emVqb2lucy5jCmluZGV4 IDMzN2Y0NzBkNTguLmM1YWM4ZTJiZDQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGlt aXplci9wbGFuL2FuYWx5emVqb2lucy5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9w bGFuL2FuYWx5emVqb2lucy5jCkBAIC0yMiw2ICsyMiw3IEBACiAgKi8KICNpbmNsdWRlICJw b3N0Z3Jlcy5oIgogCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19jbGFzcy5oIgogI2luY2x1ZGUg Im5vZGVzL25vZGVGdW5jcy5oIgogI2luY2x1ZGUgIm9wdGltaXplci9jbGF1c2VzLmgiCiAj aW5jbHVkZSAib3B0aW1pemVyL2pvaW5pbmZvLmgiCkBAIC0zMiwxMCArMzMsMTIgQEAKICNp bmNsdWRlICJvcHRpbWl6ZXIvdGxpc3QuaCIKICNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUu aCIKIAorYm9vbCBlbmFibGVfc2VsZl9qb2luX3JlbW92YWw7CisKIC8qIGxvY2FsIGZ1bmN0 aW9ucyAqLwogc3RhdGljIGJvb2wgam9pbl9pc19yZW1vdmFibGUoUGxhbm5lckluZm8gKnJv b3QsIFNwZWNpYWxKb2luSW5mbyAqc2ppbmZvKTsKIHN0YXRpYyB2b2lkIHJlbW92ZV9yZWxf ZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLAotCQkJCQkJCQkgIFJl bGlkcyBqb2lucmVsaWRzKTsKKwkJCQkJCQkJICBSZWxpZHMgam9pbnJlbGlkcywgaW50IHN1 YnN0X3JlbGlkKTsKIHN0YXRpYyBMaXN0ICpyZW1vdmVfcmVsX2Zyb21fam9pbmxpc3QoTGlz dCAqam9pbmxpc3QsIGludCByZWxpZCwgaW50ICpucmVtb3ZlZCk7CiBzdGF0aWMgYm9vbCBy ZWxfc3VwcG9ydHNfZGlzdGluY3RuZXNzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZv ICpyZWwpOwogc3RhdGljIGJvb2wgcmVsX2lzX2Rpc3RpbmN0X2ZvcihQbGFubmVySW5mbyAq cm9vdCwgUmVsT3B0SW5mbyAqcmVsLApAQCAtNDcsNiArNTAsOSBAQCBzdGF0aWMgYm9vbCBp c19pbm5lcnJlbF91bmlxdWVfZm9yKFBsYW5uZXJJbmZvICpyb290LAogCQkJCQkJCQkgICBS ZWxPcHRJbmZvICppbm5lcnJlbCwKIAkJCQkJCQkJICAgSm9pblR5cGUgam9pbnR5cGUsCiAJ CQkJCQkJCSAgIExpc3QgKnJlc3RyaWN0bGlzdCk7CitzdGF0aWMgdm9pZCBjaGFuZ2Vfcmlu Zm8oUmVzdHJpY3RJbmZvKiByaW5mbywgSW5kZXggZnJvbSwgSW5kZXggdG8pOworc3RhdGlj IEJpdG1hcHNldCogY2hhbmdlX3JlbGlkKFJlbGlkcyByZWxpZHMsIEluZGV4IG9sZElkLCBJ bmRleCBuZXdJZCk7CitzdGF0aWMgdm9pZCBjaGFuZ2VfdmFybm8oRXhwciAqZXhwciwgSW5k ZXggb2xkUmVsaWQsIEluZGV4IG5ld1JlbGlkKTsKIAogCiAvKgpAQCAtODYsNyArOTIsNyBA QCByZXN0YXJ0OgogCiAJCXJlbW92ZV9yZWxfZnJvbV9xdWVyeShyb290LCBpbm5lcnJlbGlk LAogCQkJCQkJCSAgYm1zX3VuaW9uKHNqaW5mby0+bWluX2xlZnRoYW5kLAotCQkJCQkJCQkJ CXNqaW5mby0+bWluX3JpZ2h0aGFuZCkpOworCQkJCQkJCQkJCXNqaW5mby0+bWluX3JpZ2h0 aGFuZCksIDApOwogCiAJCS8qIFdlIHZlcmlmeSB0aGF0IGV4YWN0bHkgb25lIHJlZmVyZW5j ZSBnZXRzIHJlbW92ZWQgZnJvbSBqb2lubGlzdCAqLwogCQlucmVtb3ZlZCA9IDA7CkBAIC0z MDAsNyArMzA2LDEwIEBAIGpvaW5faXNfcmVtb3ZhYmxlKFBsYW5uZXJJbmZvICpyb290LCBT cGVjaWFsSm9pbkluZm8gKnNqaW5mbykKIAogLyoKICAqIFJlbW92ZSB0aGUgdGFyZ2V0IHJl bGlkIGZyb20gdGhlIHBsYW5uZXIncyBkYXRhIHN0cnVjdHVyZXMsIGhhdmluZwotICogZGV0 ZXJtaW5lZCB0aGF0IHRoZXJlIGlzIG5vIG5lZWQgdG8gaW5jbHVkZSBpdCBpbiB0aGUgcXVl cnkuCisgKiBkZXRlcm1pbmVkIHRoYXQgdGhlcmUgaXMgbm8gbmVlZCB0byBpbmNsdWRlIGl0 IGluIHRoZSBxdWVyeS4gT3IgcmVwbGFjZQorICogd2l0aCBhbm90aGVyIHJlbGlkLgorICog VG8gcmV1c2FiaWxpdHksIHRoaXMgcm91dGluZSBjYW4gd29yayBpbiB0d28gbW9kZXM6IGRl bGV0ZSByZWxpZCBmcm9tIGEgcGxhbgorICogb3IgcmVwbGFjZSBpdC4gSXQgaXMgdXNlZCBp biByZXBsYWNlIG1vZGUgaW4gYSBzZWxmLWpvaW4gcmVtb3ZpbmcgcHJvY2Vzcy4KICAqCiAg KiBXZSBhcmUgbm90IHRlcnJpYmx5IHRob3JvdWdoIGhlcmUuICBXZSBtdXN0IG1ha2Ugc3Vy ZSB0aGF0IHRoZSByZWwgaXMKICAqIG5vIGxvbmdlciB0cmVhdGVkIGFzIGEgYmFzZXJlbCwg YW5kIHRoYXQgYXR0cmlidXRlcyBvZiBvdGhlciBiYXNlcmVscwpAQCAtMzA5LDEzICszMTgs MTYgQEAgam9pbl9pc19yZW1vdmFibGUoUGxhbm5lckluZm8gKnJvb3QsIFNwZWNpYWxKb2lu SW5mbyAqc2ppbmZvKQogICogbGlzdHMsIGJ1dCBvbmx5IGlmIHRoZXkgYmVsb25nIHRvIHRo ZSBvdXRlciBqb2luIGlkZW50aWZpZWQgYnkgam9pbnJlbGlkcy4KICAqLwogc3RhdGljIHZv aWQKLXJlbW92ZV9yZWxfZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlk LCBSZWxpZHMgam9pbnJlbGlkcykKK3JlbW92ZV9yZWxfZnJvbV9xdWVyeShQbGFubmVySW5m byAqcm9vdCwgaW50IHJlbGlkLCBSZWxpZHMgam9pbnJlbGlkcywKKwkJCQkJICBpbnQgc3Vi c3RfcmVsaWQpCiB7CiAJUmVsT3B0SW5mbyAqcmVsID0gZmluZF9iYXNlX3JlbChyb290LCBy ZWxpZCk7CiAJTGlzdAkgICAqam9pbmluZm9zOwogCUluZGV4CQlydGk7CiAJTGlzdENlbGwg ICAqbDsKIAorCUFzc2VydChzdWJzdF9yZWxpZCA9PSAwIHx8IHJlbGlkICE9IHN1YnN0X3Jl bGlkKTsKKwogCS8qCiAJICogTWFyayB0aGUgcmVsIGFzICJkZWFkIiB0byBzaG93IGl0IGlz IG5vIGxvbmdlciBwYXJ0IG9mIHRoZSBqb2luIHRyZWUuCiAJICogKFJlbW92aW5nIGl0IGZy b20gdGhlIGJhc2VyZWwgYXJyYXkgYWx0b2dldGhlciBzZWVtcyB0b28gcmlza3kuKQpAQCAt MzQ1LDggKzM1NywxMSBAQCByZW1vdmVfcmVsX2Zyb21fcXVlcnkoUGxhbm5lckluZm8gKnJv b3QsIGludCByZWxpZCwgUmVsaWRzIGpvaW5yZWxpZHMpCiAJCQkgYXR0cm9mZi0tKQogCQl7 CiAJCQlvdGhlcnJlbC0+YXR0cl9uZWVkZWRbYXR0cm9mZl0gPQotCQkJCWJtc19kZWxfbWVt YmVyKG90aGVycmVsLT5hdHRyX25lZWRlZFthdHRyb2ZmXSwgcmVsaWQpOworCQkJCWNoYW5n ZV9yZWxpZChvdGhlcnJlbC0+YXR0cl9uZWVkZWRbYXR0cm9mZl0sIHJlbGlkLCBzdWJzdF9y ZWxpZCk7CiAJCX0KKworCQkvKiBVcGRhdGUgbGF0ZXJhbCByZWZlcmVuY2VzLiAqLworCQlj aGFuZ2VfdmFybm8oKEV4cHIqKW90aGVycmVsLT5sYXRlcmFsX3ZhcnMsIHJlbGlkLCBzdWJz dF9yZWxpZCk7CiAJfQogCiAJLyoKQEAgLTM2MSwxMCArMzc2LDEyIEBAIHJlbW92ZV9yZWxf ZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLCBSZWxpZHMgam9pbnJl bGlkcykKIAl7CiAJCVNwZWNpYWxKb2luSW5mbyAqc2ppbmZvID0gKFNwZWNpYWxKb2luSW5m byAqKSBsZmlyc3QobCk7CiAKLQkJc2ppbmZvLT5taW5fbGVmdGhhbmQgPSBibXNfZGVsX21l bWJlcihzamluZm8tPm1pbl9sZWZ0aGFuZCwgcmVsaWQpOwotCQlzamluZm8tPm1pbl9yaWdo dGhhbmQgPSBibXNfZGVsX21lbWJlcihzamluZm8tPm1pbl9yaWdodGhhbmQsIHJlbGlkKTsK LQkJc2ppbmZvLT5zeW5fbGVmdGhhbmQgPSBibXNfZGVsX21lbWJlcihzamluZm8tPnN5bl9s ZWZ0aGFuZCwgcmVsaWQpOwotCQlzamluZm8tPnN5bl9yaWdodGhhbmQgPSBibXNfZGVsX21l bWJlcihzamluZm8tPnN5bl9yaWdodGhhbmQsIHJlbGlkKTsKKwkJc2ppbmZvLT5taW5fbGVm dGhhbmQgPSBjaGFuZ2VfcmVsaWQoc2ppbmZvLT5taW5fbGVmdGhhbmQsIHJlbGlkLCBzdWJz dF9yZWxpZCk7CisJCXNqaW5mby0+bWluX3JpZ2h0aGFuZCA9IGNoYW5nZV9yZWxpZChzamlu Zm8tPm1pbl9yaWdodGhhbmQsIHJlbGlkLCBzdWJzdF9yZWxpZCk7CisJCXNqaW5mby0+c3lu X2xlZnRoYW5kID0gY2hhbmdlX3JlbGlkKHNqaW5mby0+c3luX2xlZnRoYW5kLCByZWxpZCwg c3Vic3RfcmVsaWQpOworCQlzamluZm8tPnN5bl9yaWdodGhhbmQgPSBjaGFuZ2VfcmVsaWQo c2ppbmZvLT5zeW5fcmlnaHRoYW5kLCByZWxpZCwgc3Vic3RfcmVsaWQpOworCisJCWNoYW5n ZV92YXJubygoRXhwciopc2ppbmZvLT5zZW1pX3Joc19leHBycywgcmVsaWQsIHN1YnN0X3Jl bGlkKTsKIAl9CiAKIAkvKgpAQCAtMzg1LDE2ICs0MDIsMjkgQEAgcmVtb3ZlX3JlbF9mcm9t X3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQsIFJlbGlkcyBqb2lucmVsaWRz KQogCXsKIAkJUGxhY2VIb2xkZXJJbmZvICpwaGluZm8gPSAoUGxhY2VIb2xkZXJJbmZvICop IGxmaXJzdChsKTsKIAotCQlBc3NlcnQoIWJtc19pc19tZW1iZXIocmVsaWQsIHBoaW5mby0+ cGhfbGF0ZXJhbCkpOwotCQlpZiAoYm1zX2lzX3N1YnNldChwaGluZm8tPnBoX25lZWRlZCwg am9pbnJlbGlkcykgJiYKKwkJaWYgKHN1YnN0X3JlbGlkID09IDAgJiYgYm1zX2lzX3N1YnNl dChwaGluZm8tPnBoX25lZWRlZCwgam9pbnJlbGlkcykgJiYKIAkJCWJtc19pc19tZW1iZXIo cmVsaWQsIHBoaW5mby0+cGhfZXZhbF9hdCkpCiAJCQlyb290LT5wbGFjZWhvbGRlcl9saXN0 ID0gZm9yZWFjaF9kZWxldGVfY3VycmVudChyb290LT5wbGFjZWhvbGRlcl9saXN0LAogCQkJ CQkJCQkJCQkJCQkJbCk7CiAJCWVsc2UKIAkJewotCQkJcGhpbmZvLT5waF9ldmFsX2F0ID0g Ym1zX2RlbF9tZW1iZXIocGhpbmZvLT5waF9ldmFsX2F0LCByZWxpZCk7CisJCQlwaGluZm8t PnBoX2V2YWxfYXQgPSBjaGFuZ2VfcmVsaWQocGhpbmZvLT5waF9ldmFsX2F0LCByZWxpZCwg c3Vic3RfcmVsaWQpOwogCQkJQXNzZXJ0KCFibXNfaXNfZW1wdHkocGhpbmZvLT5waF9ldmFs X2F0KSk7Ci0JCQlwaGluZm8tPnBoX25lZWRlZCA9IGJtc19kZWxfbWVtYmVyKHBoaW5mby0+ cGhfbmVlZGVkLCByZWxpZCk7CisJCQlwaGluZm8tPnBoX25lZWRlZCA9IGNoYW5nZV9yZWxp ZChwaGluZm8tPnBoX25lZWRlZCwgcmVsaWQsIHN1YnN0X3JlbGlkKTsKKwkJCUFzc2VydChz dWJzdF9yZWxpZCAhPSAwIHx8ICFibXNfaXNfbWVtYmVyKHJlbGlkLCBwaGluZm8tPnBoX2xh dGVyYWwpKTsKKwkJCXBoaW5mby0+cGhfbGF0ZXJhbCA9IGNoYW5nZV9yZWxpZChwaGluZm8t PnBoX2xhdGVyYWwsIHJlbGlkLCBzdWJzdF9yZWxpZCk7CisJCQlwaGluZm8tPnBoX3Zhci0+ cGhyZWxzID0gY2hhbmdlX3JlbGlkKHBoaW5mby0+cGhfdmFyLT5waHJlbHMsIHJlbGlkLCBz dWJzdF9yZWxpZCk7CisJCX0KKwl9CisKKwlpZiAoc3Vic3RfcmVsaWQgIT0gMCkKKwl7CisJ CWZvcmVhY2gobCwgcmVsLT5iYXNlcmVzdHJpY3RpbmZvKQorCQl7CisJCQlSZXN0cmljdElu Zm8gKnJpbmZvID0gKFJlc3RyaWN0SW5mbyAqKSBsZmlyc3QobCk7CisKKwkJCWNoYW5nZV9y aW5mbyhyaW5mbywgcmVsaWQsIHN1YnN0X3JlbGlkKTsKKwkJCWRpc3RyaWJ1dGVfcmVzdHJp Y3RpbmZvX3RvX3JlbHMocm9vdCwgcmluZm8pOwogCQl9CiAJfQogCkBAIC00MTgsNiArNDQ4 LDcgQEAgcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVs aWQsIFJlbGlkcyBqb2lucmVsaWRzKQogCQlSZXN0cmljdEluZm8gKnJpbmZvID0gKFJlc3Ry aWN0SW5mbyAqKSBsZmlyc3QobCk7CiAKIAkJcmVtb3ZlX2pvaW5fY2xhdXNlX2Zyb21fcmVs cyhyb290LCByaW5mbywgcmluZm8tPnJlcXVpcmVkX3JlbGlkcyk7CisJCWNoYW5nZV9yaW5m byhyaW5mbywgcmVsaWQsIHN1YnN0X3JlbGlkKTsKIAogCQlpZiAoUklORk9fSVNfUFVTSEVE X0RPV04ocmluZm8sIGpvaW5yZWxpZHMpKQogCQl7CkBAIC00MzMsNiArNDY0LDggQEAgcmVt b3ZlX3JlbF9mcm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQsIFJlbGlk cyBqb2lucmVsaWRzKQogCQkJCQkJCQkJCQkJCXJlbGlkKTsKIAkJCWRpc3RyaWJ1dGVfcmVz dHJpY3RpbmZvX3RvX3JlbHMocm9vdCwgcmluZm8pOwogCQl9CisJCWVsc2UgaWYgKHN1YnN0 X3JlbGlkICE9IDApCisJCQlkaXN0cmlidXRlX3Jlc3RyaWN0aW5mb190b19yZWxzKHJvb3Qs IHJpbmZvKTsKIAl9CiAKIAkvKgpAQCAtMTExOCwzICsxMTUxLDgzMiBAQCBpc19pbm5lcnJl bF91bmlxdWVfZm9yKFBsYW5uZXJJbmZvICpyb290LAogCS8qIExldCByZWxfaXNfZGlzdGlu Y3RfZm9yKCkgZG8gdGhlIGhhcmQgd29yayAqLwogCXJldHVybiByZWxfaXNfZGlzdGluY3Rf Zm9yKHJvb3QsIGlubmVycmVsLCBjbGF1c2VfbGlzdCk7CiB9CisKK3R5cGVkZWYgc3RydWN0 IENoYW5nZVZhcm5vQ29udGV4dAoreworCUluZGV4IG9sZFJlbGlkOworCUluZGV4IG5ld1Jl bGlkOworfSBDaGFuZ2VWYXJub0NvbnRleHQ7CisKKworc3RhdGljIGJvb2wKK2NoYW5nZV92 YXJub193YWxrZXIoTm9kZSAqbm9kZSwgQ2hhbmdlVmFybm9Db250ZXh0ICpjb250ZXh0KQor eworCWlmIChub2RlID09IE5VTEwpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChJc0Eobm9k ZSwgVmFyKSkKKwl7CisJCVZhciogdmFyID0gKFZhciopbm9kZTsKKwkJaWYgKHZhci0+dmFy bm8gPT0gY29udGV4dC0+b2xkUmVsaWQpCisJCXsKKwkJCXZhci0+dmFybm8gPSBjb250ZXh0 LT5uZXdSZWxpZDsKKwkJCXZhci0+dmFybm9zeW4gPSBjb250ZXh0LT5uZXdSZWxpZDsKKwkJ CXZhci0+bG9jYXRpb24gPSAtMTsKKwkJfQorCQllbHNlIGlmICh2YXItPnZhcm5vID09IGNv bnRleHQtPm5ld1JlbGlkKQorCQkJdmFyLT5sb2NhdGlvbiA9IC0xOworCisJCXJldHVybiBm YWxzZTsKKwl9CisJaWYgKElzQShub2RlLCBSZXN0cmljdEluZm8pKQorCXsKKwkJY2hhbmdl X3JpbmZvKChSZXN0cmljdEluZm8qKW5vZGUsIGNvbnRleHQtPm9sZFJlbGlkLCBjb250ZXh0 LT5uZXdSZWxpZCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIGV4cHJlc3Npb25f dHJlZV93YWxrZXIobm9kZSwgY2hhbmdlX3Zhcm5vX3dhbGtlciwgY29udGV4dCk7Cit9CisK Ky8qCisgKiBGb3IgYWxsIFZhcnMgaW4gdGhlIGV4cHJlc3Npb24gdGhhdCBoYXZlIHZhcm5v ID0gb2xkUmVsaWQsIHNldAorICogdmFybm8gPSBuZXdSZWxpZC4KKyAqLworc3RhdGljIHZv aWQKK2NoYW5nZV92YXJubyhFeHByICpleHByLCBJbmRleCBvbGRSZWxpZCwgSW5kZXggbmV3 UmVsaWQpCit7CisJQ2hhbmdlVmFybm9Db250ZXh0IGNvbnRleHQ7CisKKwlpZiAobmV3UmVs aWQgPT0gMCkKKwkJcmV0dXJuOworCisJY29udGV4dC5vbGRSZWxpZCA9IG9sZFJlbGlkOwor CWNvbnRleHQubmV3UmVsaWQgPSBuZXdSZWxpZDsKKwljaGFuZ2VfdmFybm9fd2Fsa2VyKChO b2RlICopIGV4cHIsICZjb250ZXh0KTsKK30KKworLyoKKyAqIFN1YnN0aXR1dGUgbmV3SWQg Zm9yIG9sZElkIGluIHJlbGlkcy4KKyAqLworc3RhdGljIEJpdG1hcHNldCoKK2NoYW5nZV9y ZWxpZChSZWxpZHMgcmVsaWRzLCBJbmRleCBvbGRJZCwgSW5kZXggbmV3SWQpCit7CisJaWYg KG5ld0lkID09IDApCisJCS8qIERlbGV0ZSByZWxpZCB3aXRob3V0IHN1YnN0aXR1dGlvbi4g Ki8KKwkJcmV0dXJuIGJtc19kZWxfbWVtYmVyKHJlbGlkcywgb2xkSWQpOworCisJaWYgKGJt c19pc19tZW1iZXIob2xkSWQsIHJlbGlkcykpCisJCXJldHVybiBibXNfYWRkX21lbWJlcihi bXNfZGVsX21lbWJlcihibXNfY29weShyZWxpZHMpLCBvbGRJZCksIG5ld0lkKTsKKworCXJl dHVybiByZWxpZHM7Cit9CisKK3N0YXRpYyB2b2lkCitjaGFuZ2VfcmluZm8oUmVzdHJpY3RJ bmZvKiByaW5mbywgSW5kZXggZnJvbSwgSW5kZXggdG8pCit7CisJYm9vbCBpc19yZXFfZXF1 YWw7CisKKwlpZiAodG8gPT0gMCkKKwkJcmV0dXJuOworCisJaXNfcmVxX2VxdWFsID0KKwkJ KHJpbmZvLT5yZXF1aXJlZF9yZWxpZHMgPT0gcmluZm8tPmNsYXVzZV9yZWxpZHMpID8gdHJ1 ZSA6IGZhbHNlOworCisJY2hhbmdlX3Zhcm5vKHJpbmZvLT5jbGF1c2UsIGZyb20sIHRvKTsK KwljaGFuZ2VfdmFybm8ocmluZm8tPm9yY2xhdXNlLCBmcm9tLCB0byk7CisJcmluZm8tPmNs YXVzZV9yZWxpZHMgPSBjaGFuZ2VfcmVsaWQocmluZm8tPmNsYXVzZV9yZWxpZHMsIGZyb20s IHRvKTsKKwlpZiAoaXNfcmVxX2VxdWFsKQorCQlyaW5mby0+cmVxdWlyZWRfcmVsaWRzID0g cmluZm8tPmNsYXVzZV9yZWxpZHM7CisJZWxzZQorCQlyaW5mby0+cmVxdWlyZWRfcmVsaWRz ID0gY2hhbmdlX3JlbGlkKHJpbmZvLT5yZXF1aXJlZF9yZWxpZHMsIGZyb20sIHRvKTsKKwly aW5mby0+bGVmdF9yZWxpZHMgPSBjaGFuZ2VfcmVsaWQocmluZm8tPmxlZnRfcmVsaWRzLCBm cm9tLCB0byk7CisJcmluZm8tPnJpZ2h0X3JlbGlkcyA9IGNoYW5nZV9yZWxpZChyaW5mby0+ cmlnaHRfcmVsaWRzLCBmcm9tLCB0byk7CisJcmluZm8tPm91dGVyX3JlbGlkcyA9IGNoYW5n ZV9yZWxpZChyaW5mby0+b3V0ZXJfcmVsaWRzLCBmcm9tLCB0byk7CisJcmluZm8tPm51bGxh YmxlX3JlbGlkcyA9IGNoYW5nZV9yZWxpZChyaW5mby0+bnVsbGFibGVfcmVsaWRzLCBmcm9t LCB0byk7Cit9CisKKy8qCisgKiBVcGRhdGUgRUMgbWVtYmVycyB0byBwb2ludCB0byB0aGUg cmVtYWluaW5nIHJlbGF0aW9uIGluc3RlYWQgb2YgdGhlIHJlbW92ZWQKKyAqIG9uZSwgcmVt b3ZpbmcgZHVwbGljYXRlcy4KKyAqLworc3RhdGljIHZvaWQKK3VwZGF0ZV9lY19tZW1iZXJz KEVxdWl2YWxlbmNlQ2xhc3MgKmVjLCBJbmRleCB0b1JlbW92ZSwgSW5kZXggdG9LZWVwKQor eworCWludAkJCWNvdW50ZXI7CisKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgbGlz dF9sZW5ndGgoZWMtPmVjX21lbWJlcnMpOyApCisJeworCQlMaXN0Q2VsbAkJCSpjZWxsID0g bGlzdF9udGhfY2VsbChlYy0+ZWNfbWVtYmVycywgY291bnRlcik7CisJCUVxdWl2YWxlbmNl TWVtYmVyCSplbSA9IGxmaXJzdChjZWxsKTsKKwkJaW50CQkJCQljb3VudGVyMTsKKworCQlp ZiAoIWJtc19pc19tZW1iZXIodG9SZW1vdmUsIGVtLT5lbV9yZWxpZHMpKQorCQl7CisJCQlj b3VudGVyKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWVtLT5lbV9yZWxpZHMgPSBjaGFu Z2VfcmVsaWQoZW0tPmVtX3JlbGlkcywgdG9SZW1vdmUsIHRvS2VlcCk7CisJCS8qIFdlIG9u bHkgcHJvY2VzcyBpbm5lciBqb2lucyAqLworCQljaGFuZ2VfdmFybm8oZW0tPmVtX2V4cHIs IHRvUmVtb3ZlLCB0b0tlZXApOworCisJCS8qCisJCSAqIEFmdGVyIHdlIHN3aXRjaGVkIHRo ZSBlcXVpdmFsZW5jZSBtZW1iZXIgdG8gdGhlIHJlbWFpbmluZyByZWxhdGlvbiwKKwkJICog Y2hlY2sgdGhhdCBpdCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGV4aXN0aW5nIG1lbWJlciwg YW5kIGlmIGl0CisJCSAqIGlzLCBkZWxldGUgaXQuCisJCSAqLworCQlmb3IgKGNvdW50ZXIx ID0gMDsgY291bnRlcjEgPCBsaXN0X2xlbmd0aChlYy0+ZWNfbWVtYmVycyk7IGNvdW50ZXIx KyspCisJCXsKKwkJCUVxdWl2YWxlbmNlTWVtYmVyCSpvdGhlcjsKKworCQkJaWYgKGNvdW50 ZXIxID09IGNvdW50ZXIpCisJCQkJY29udGludWU7CisKKwkJCW90aGVyID0gY2FzdE5vZGUo RXF1aXZhbGVuY2VNZW1iZXIsIGxpc3RfbnRoKGVjLT5lY19tZW1iZXJzLCBjb3VudGVyMSkp OworCisJCQlpZiAoZXF1YWwob3RoZXItPmVtX2V4cHIsIGVtLT5lbV9leHByKSkKKwkJCQli cmVhazsKKwkJfQorCisJCWlmIChjb3VudGVyMSA8IGxpc3RfbGVuZ3RoKGVjLT5lY19tZW1i ZXJzKSkKKwkJCWVjLT5lY19tZW1iZXJzID0gbGlzdF9kZWxldGVfY2VsbChlYy0+ZWNfbWVt YmVycywgY2VsbCk7CisJCWVsc2UKKwkJCWNvdW50ZXIrKzsKKwl9Cit9CisKKy8qCisgKiBV cGRhdGUgRUMgc291cmNlcyB0byBwb2ludCB0byB0aGUgcmVtYWluaW5nIHJlbGF0aW9uIGlu c3RlYWQgb2YgdGhlCisgKiByZW1vdmVkIG9uZS4KKyAqLworc3RhdGljIHZvaWQKK3VwZGF0 ZV9lY19zb3VyY2VzKExpc3QgKipzb3VyY2VzLCBJbmRleCB0b1JlbW92ZSwgSW5kZXggdG9L ZWVwKQoreworCWludAkJCWNvdW50ZXI7CisKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVy IDwgbGlzdF9sZW5ndGgoKnNvdXJjZXMpOyApCisJeworCQlMaXN0Q2VsbAkJKmNlbGwgPSBs aXN0X250aF9jZWxsKCpzb3VyY2VzLCBjb3VudGVyKTsKKwkJUmVzdHJpY3RJbmZvCSpyaW5m byA9IGNhc3ROb2RlKFJlc3RyaWN0SW5mbywgbGZpcnN0KGNlbGwpKTsKKwkJaW50CQkJCWNv dW50ZXIxOworCisJCWlmICghYm1zX2lzX21lbWJlcih0b1JlbW92ZSwgcmluZm8tPnJlcXVp cmVkX3JlbGlkcykpCisJCXsKKwkJCWNvdW50ZXIrKzsKKwkJCWNvbnRpbnVlOworCQl9CisK KwkJY2hhbmdlX3Zhcm5vKHJpbmZvLT5jbGF1c2UsIHRvUmVtb3ZlLCB0b0tlZXApOworCisJ CS8qCisJCSAqIEFmdGVyIHN3aXRjaGluZyB0aGUgY2xhdXNlIHRvIHRoZSByZW1haW5pbmcg cmVsYXRpb24sIGNoZWNrIGl0IGZvcgorCQkgKiByZWR1bmRhbmN5IHdpdGggZXhpc3Rpbmcg b25lcy4gV2UgZG9uJ3QgaGF2ZSB0byBjaGVjayBmb3IKKwkJICogcmVkdW5kYW5jeSB3aXRo IGRlcml2ZWQgY2xhdXNlcywgYmVjYXVzZSB3ZSd2ZSBqdXN0IGRlbGV0ZWQgdGhlbS4KKwkJ ICovCisJCWZvciAoY291bnRlcjEgPSAwOyBjb3VudGVyMSA8IGxpc3RfbGVuZ3RoKCpzb3Vy Y2VzKTsgY291bnRlcjErKykKKwkJeworCQkJUmVzdHJpY3RJbmZvICpvdGhlcjsKKworCQkJ aWYgKGNvdW50ZXIxID09IGNvdW50ZXIpCisJCQkJY29udGludWU7CisKKwkJCW90aGVyID0g Y2FzdE5vZGUoUmVzdHJpY3RJbmZvLCBsaXN0X250aCgqc291cmNlcywgY291bnRlcjEpKTsK KwkJCWlmIChlcXVhbChyaW5mby0+Y2xhdXNlLCBvdGhlci0+Y2xhdXNlKSkKKwkJCQlicmVh azsKKwkJfQorCisJCWlmIChjb3VudGVyMSA8IGxpc3RfbGVuZ3RoKCpzb3VyY2VzKSkKKwkJ CSpzb3VyY2VzID0gbGlzdF9kZWxldGVfY2VsbCgqc291cmNlcywgY2VsbCk7CisJCWVsc2UK KwkJeworCQkJY291bnRlcisrOworCisJCQkvKiBXZSB3aWxsIGtlZXAgdGhpcyBSZXN0cmlj dEluZm8sIGNvcnJlY3QgaXRzIHJlbGlkcy4gKi8KKwkJCWNoYW5nZV9yaW5mbyhyaW5mbywg dG9SZW1vdmUsIHRvS2VlcCk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBSZW1vdmUgYSByZWxh dGlvbiBhZnRlciB3ZSBoYXZlIHByb3ZlbiB0aGF0IGl0IHBhcnRpY2lwYXRlcyBvbmx5IGlu IGFuCisgKiB1bm5lZWRlZCB1bmlxdWUgc2VsZiBqb2luLgorICoKKyAqIFRoZSBqb2luY2xh dXNlcyBsaXN0IGlzIGRlc3RydWN0aXZlbHkgY2hhbmdlZC4KKyAqLworc3RhdGljIHZvaWQK K3JlbW92ZV9zZWxmX2pvaW5fcmVsKFBsYW5uZXJJbmZvICpyb290LCBQbGFuUm93TWFyayAq a21hcmssIFBsYW5Sb3dNYXJrICpybWFyaywKKwkJCQkJIFJlbE9wdEluZm8gKnRvS2VlcCwg UmVsT3B0SW5mbyAqdG9SZW1vdmUpCit7CisJTGlzdENlbGwgKmNlbGw7CisJaW50IGk7CisJ TGlzdCAqdGFyZ2V0ID0gTklMOworCisJLyoKKwkgKiBJbmNsdWRlIGFsbCBlY2xhc3MgbWVu dGlvbnMgb2YgcmVtb3ZlZCByZWxhdGlvbiBpbnRvIHRoZSBlY2xhc3MgbWVudGlvbnMKKwkg KiBvZiBrZXB0IHJlbGF0aW9uLgorCSAqLworCXRvS2VlcC0+ZWNsYXNzX2luZGV4ZXMgPSBi bXNfYWRkX21lbWJlcnModG9SZW1vdmUtPmVjbGFzc19pbmRleGVzLAorCQkJCQkJCQkJCQkJ CQl0b0tlZXAtPmVjbGFzc19pbmRleGVzKTsKKworCS8qCisJICogTm93LCBiYXNlcmVzdHJp Y3RpbmZvIHJlcGxlbmlzaGVkIHdpdGggcmVzdHJpY3Rpb25zIGZyb20gcmVtb3ZpbmcKKwkg KiByZWxhdGlvbi4gSXQgaXMgbmVlZGVkIHRvIHJlbW92ZSBkdXBsaWNhdGVzIGFuZCByZXBs YWNlIGRlZ2VuZXJhdGVkCisJICogY2xhdXNlcyB3aXRoIGEgTnVsbFRlc3QuCisJICovCisJ Zm9yZWFjaChjZWxsLCB0b0tlZXAtPmJhc2VyZXN0cmljdGluZm8pCisJeworCQlSZXN0cmlj dEluZm8gKnJpbmZvID0gbGZpcnN0X25vZGUoUmVzdHJpY3RJbmZvLCBjZWxsKTsKKwkJTGlz dENlbGwgKm90aGVyQ2VsbDsKKworCQlBc3NlcnQoIWJtc19pc19tZW1iZXIodG9SZW1vdmUt PnJlbGlkLCByaW5mby0+Y2xhdXNlX3JlbGlkcykpOworCisJCS8qCisJCSAqIElmIHRoaXMg Y2xhdXNlIGlzIGEgbWVyZ2Vqb2luYWJsZSBlcXVhbGl0eSBjbGF1c2UgdGhhdCBjb21wYXJl cyBhCisJCSAqIHZhcmlhYmxlIHRvIGl0c2VsZiwgaS5lLiwgaGFzIHRoZSBmb3JtIG9mICJY PVgiLCByZXBsYWNlIGl0IHdpdGgKKwkJICogbnVsbCB0ZXN0LgorCQkgKi8KKwkJaWYgKHJp bmZvLT5tZXJnZW9wZmFtaWxpZXMgJiYgSXNBKHJpbmZvLT5jbGF1c2UsIE9wRXhwcikpCisJ CXsKKwkJCUV4cHIgKmxlZnRPcDsKKwkJCUV4cHIgKnJpZ2h0T3A7CisKKwkJCWxlZnRPcCA9 IChFeHByICopIGdldF9sZWZ0b3AocmluZm8tPmNsYXVzZSk7CisJCQlyaWdodE9wID0gKEV4 cHIgKikgZ2V0X3JpZ2h0b3AocmluZm8tPmNsYXVzZSk7CisKKwkJCWlmIChsZWZ0T3AgIT0g TlVMTCAmJiBlcXVhbChsZWZ0T3AsIHJpZ2h0T3ApKQorCQkJeworCQkJCU51bGxUZXN0ICpu dWxsVGVzdCA9IG1ha2VOb2RlKE51bGxUZXN0KTsKKwkJCQludWxsVGVzdC0+YXJnID0gbGVm dE9wOworCQkJCW51bGxUZXN0LT5udWxsdGVzdHR5cGUgPSBJU19OT1RfTlVMTDsKKwkJCQlu dWxsVGVzdC0+YXJnaXNyb3cgPSBmYWxzZTsKKwkJCQludWxsVGVzdC0+bG9jYXRpb24gPSAt MTsKKwkJCQlyaW5mby0+Y2xhdXNlID0gKEV4cHIgKikgbnVsbFRlc3Q7CisJCQl9CisJCX0K KworCQkvKiBTZWFyY2ggZm9yIGR1cGxpY2F0ZXMuICovCisJCWZvcmVhY2gob3RoZXJDZWxs LCB0YXJnZXQpCisJCXsKKwkJCVJlc3RyaWN0SW5mbyAqb3RoZXIgPSBsZmlyc3Rfbm9kZShS ZXN0cmljdEluZm8sIG90aGVyQ2VsbCk7CisKKwkJCWlmIChvdGhlciA9PSByaW5mbyB8fAor CQkJCShyaW5mby0+cGFyZW50X2VjICE9IE5VTEwKKwkJCQkgJiYgb3RoZXItPnBhcmVudF9l YyA9PSByaW5mby0+cGFyZW50X2VjKQorCQkJCSB8fCBlcXVhbChyaW5mby0+Y2xhdXNlLCBv dGhlci0+Y2xhdXNlKSkKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChv dGhlckNlbGwgIT0gTlVMTCkKKwkJCS8qIER1cGxpY2F0ZSBmb3VuZCAqLworCQkJY29udGlu dWU7CisKKwkJdGFyZ2V0ID0gbGFwcGVuZCh0YXJnZXQsIHJpbmZvKTsKKwl9CisKKwlsaXN0 X2ZyZWUodG9LZWVwLT5iYXNlcmVzdHJpY3RpbmZvKTsKKwl0b0tlZXAtPmJhc2VyZXN0cmlj dGluZm8gPSB0YXJnZXQ7CisKKwkvKgorCSAqIFVwZGF0ZSB0aGUgZXF1aXZhbGVuY2UgY2xh c3NlcyB0aGF0IHJlZmVyZW5jZSB0aGUgcmVtb3ZlZCByZWxhdGlvbnMuCisJICovCisJZm9y ZWFjaChjZWxsLCByb290LT5lcV9jbGFzc2VzKQorCXsKKwkJRXF1aXZhbGVuY2VDbGFzcyAq ZWMgPSBsZmlyc3QoY2VsbCk7CisKKwkJaWYgKCFibXNfaXNfbWVtYmVyKHRvUmVtb3ZlLT5y ZWxpZCwgZWMtPmVjX3JlbGlkcykpCisJCXsKKwkJCS8qCisJCQkgKiBUaGlzIEVDIGRvZXNu J3QgcmVmZXJlbmNlIHRoZSByZW1vdmVkIHJlbGF0aW9uLCBub3RoaW5nIHRvIGJlCisJCQkg KiBkb25lIGZvciBpdC4KKwkJCSAqLworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkg KiBVcGRhdGUgdGhlIEVDIG1lbWJlcnMgdG8gcmVmZXJlbmNlIHRoZSByZW1haW5pbmcgcmVs YXRpb24gaW5zdGVhZAorCQkgKiBvZiB0aGUgcmVtb3ZlZCBvbmUuCisJCSAqLworCQl1cGRh dGVfZWNfbWVtYmVycyhlYywgdG9SZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlkKTsKKwkJ ZWMtPmVjX3JlbGlkcyA9IGNoYW5nZV9yZWxpZChlYy0+ZWNfcmVsaWRzLCB0b1JlbW92ZS0+ cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCisJCS8qCisJCSAqIFdlIHdpbGwgbm93IHVwZGF0 ZSBzb3VyY2UgYW5kIGRlcml2ZWQgY2xhdXNlcyBvZiB0aGUgRUMuCisJCSAqCisJCSAqIFJl c3RyaWN0aW9uIGNsYXVzZXMgZm9yIGJhc2UgcmVsYXRpb25zIGFyZSBhbHJlYWR5IGRpc3Ry aWJ1dGVkIHRvCisJCSAqIHRoZSByZXNwZWN0aXZlIGJhc2VyZXN0cmljdGluZm8gbGlzdHMg KHNlZQorCQkgKiBnZW5lcmF0ZV9pbXBsaWVkX2VxdWFsaXRpZXMpLiBUaGUgYWJvdmUgY29k ZSBoYXMgYWxyZWFkeSBwcm9jZXNzZWQKKwkJICogdGhpcyBsaXN0LCBhbmQgdXBkYXRlZCB0 aGVzZSBjbGF1c2VzIHRvIHJlZmVyZW5jZSB0aGUgcmVtYWluaW5nCisJCSAqIHJlbGF0aW9u LCBzbyB3ZSBjYW4gc2tpcCB0aGVtIGhlcmUgYmFzZWQgb24gdGhlaXIgcmVsaWRzLgorCQkg KgorCQkgKiBMaWtld2lzZSwgd2UgaGF2ZSBhbHJlYWR5IHByb2Nlc3NlZCB0aGUgam9pbiBj bGF1c2VzIHRoYXQgam9pbiB0aGUKKwkJICogcmVtb3ZlZCByZWxhdGlvbiB0byB0aGUgcmVt YWluaW5nIG9uZS4KKwkJICoKKwkJICogRmluYWxseSwgdGhlcmUgYXJlIGpvaW4gY2xhdXNl cyB0aGF0IGpvaW4gdGhlIHJlbW92ZWQgcmVsYXRpb24gdG8KKwkJICogc29tZSB0aGlyZCBy ZWxhdGlvbi4gV2UgY2FuJ3QganVzdCBkZWxldGUgdGhlIHNvdXJjZSBjbGF1c2VzIGFuZAor CQkgKiByZWdlbmVyYXRlIHRoZW0gZnJvbSB0aGUgRUMsIGJlY2F1c2UgdGhlIGNvcnJlc3Bv bmRpbmcgZXF1YWxpdHkKKwkJICogb3BlcmF0b3JzIG1pZ2h0IGJlIG1pc3NpbmcgKHNlZSB0 aGUgaGFuZGxpbmcgb2YgZWNfYnJva2VuKS4KKwkJICogVGhlcmVmb3JlLCB3ZSB3aWxsIHVw ZGF0ZSB0aGUgcmVmZXJlbmNlcyBpbiB0aGUgc291cmNlIGNsYXVzZXMuCisJCSAqCisJCSAq IERlcml2ZWQgY2xhdXNlcyBjYW4gYmUgZ2VuZXJhdGVkIGFnYWluLCBzbyBpdCBpcyBzaW1w bGVyIHRvIGp1c3QKKwkJICogZGVsZXRlIHRoZW0uCisJCSAqLworCQlsaXN0X2ZyZWUoZWMt PmVjX2Rlcml2ZXMpOworCQllYy0+ZWNfZGVyaXZlcyA9IE5VTEw7CisJCXVwZGF0ZV9lY19z b3VyY2VzKCZlYy0+ZWNfc291cmNlcywgdG9SZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlk KTsKKwl9CisKKwkvKgorCSAqIFRyYW5zZmVyIHRoZSB0YXJnZXRsaXN0IGFuZCBhdHRyX25l ZWRlZCBmbGFncy4KKwkgKi8KKwlBc3NlcnQodG9SZW1vdmUtPnJlbHRhcmdldC0+c29ydGdy b3VwcmVmcyA9PSAwKTsKKworCWZvcmVhY2ggKGNlbGwsIHRvUmVtb3ZlLT5yZWx0YXJnZXQt PmV4cHJzKQorCXsKKwkJRXhwciAqbm9kZSA9IGxmaXJzdChjZWxsKTsKKwkJY2hhbmdlX3Zh cm5vKG5vZGUsIHRvUmVtb3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisJCWlmICghbGlz dF9tZW1iZXIodG9LZWVwLT5yZWx0YXJnZXQtPmV4cHJzLCBub2RlKSkKKwkJCXRvS2VlcC0+ cmVsdGFyZ2V0LT5leHBycyA9IGxhcHBlbmQodG9LZWVwLT5yZWx0YXJnZXQtPmV4cHJzLCBu b2RlKTsKKwl9CisKKwlmb3IgKGkgPSB0b0tlZXAtPm1pbl9hdHRyOyBpIDw9IHRvS2VlcC0+ bWF4X2F0dHI7IGkrKykKKwl7CisJCWludCBhdHRubyA9IGkgLSB0b0tlZXAtPm1pbl9hdHRy OworCQl0b0tlZXAtPmF0dHJfbmVlZGVkW2F0dG5vXSA9IGJtc19hZGRfbWVtYmVycyh0b0tl ZXAtPmF0dHJfbmVlZGVkW2F0dG5vXSwKKwkJCQkJCQkJCQkJCQkgdG9SZW1vdmUtPmF0dHJf bmVlZGVkW2F0dG5vXSk7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgcmVtb3ZlZCByZWxhdGlv biBoYXMgYSByb3cgbWFyaywgdHJhbnNmZXIgaXQgdG8gdGhlIHJlbWFpbmluZworCSAqIG9u ZS4KKwkgKgorCSAqIElmIGJvdGggcmVscyBoYXZlIHJvdyBtYXJrcywganVzdCBrZWVwIHRo ZSBvbmUgY29ycmVzcG9uZGluZyB0byB0aGUKKwkgKiByZW1haW5pbmcgcmVsYXRpb24sIGJl Y2F1c2Ugd2UgdmVyaWZpZWQgZWFybGllciB0aGF0IHRoZXkgaGF2ZSB0aGUgc2FtZQorCSAq IHN0cmVuZ3RoLgorCSAqCisJICogQWxzbyBtYWtlIHN1cmUgdGhhdCB0aGUgc2NyYXRjaC0+ cm93X21hcmtzIGNhY2hlIGlzIHVwIHRvIGRhdGUsIGJlY2F1c2UKKwkgKiB3ZSBhcmUgZ29p bmcgdG8gdXNlIGl0IGZvciBmdXJ0aGVyIGpvaW4gcmVtb3ZhbHMuCisJICovCisJaWYgKHJt YXJrKQorCXsKKwkJaWYgKGttYXJrKQorCQl7CisJCQlBc3NlcnQoa21hcmstPm1hcmtUeXBl ID09IHJtYXJrLT5tYXJrVHlwZSk7CisKKwkJCXJvb3QtPnJvd01hcmtzID0gbGlzdF9kZWxl dGVfcHRyKHJvb3QtPnJvd01hcmtzLCBrbWFyayk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkv KiBTaG91bGRuJ3QgaGF2ZSBpbmhlcml0YW5jZSBjaGlsZHJlbiBoZXJlLiAqLworCQkJQXNz ZXJ0KGttYXJrLT5ydGkgPT0ga21hcmstPnBydGkpOworCisJCQlybWFyay0+cnRpID0gdG9L ZWVwLT5yZWxpZDsKKwkJCXJtYXJrLT5wcnRpID0gdG9LZWVwLT5yZWxpZDsKKwkJfQorCX0K KworCS8qCisJICogQ2hhbmdlIHZhcm5vIGluIHNvbWUgc3BlY2lhbCBjYXNlcyB3aXRoIG5v bi10cml2aWFsIFJhbmdlVGJsRW50cnkKKwkgKi8KKwlmb3JlYWNoKGNlbGwsIHJvb3QtPnBh cnNlLT5ydGFibGUpCisJeworCQlSYW5nZVRibEVudHJ5ICpydGUJPSBsZmlyc3QoY2VsbCk7 CisKKwkJc3dpdGNoKHJ0ZS0+cnRla2luZCkKKwkJeworCQkJY2FzZSBSVEVfRlVOQ1RJT046 CisJCQkJY2hhbmdlX3Zhcm5vKChFeHByKilydGUtPmZ1bmN0aW9ucywgdG9SZW1vdmUtPnJl bGlkLCB0b0tlZXAtPnJlbGlkKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUlRFX1RBQkxFRlVO QzoKKwkJCQljaGFuZ2VfdmFybm8oKEV4cHIqKXJ0ZS0+dGFibGVmdW5jLCB0b1JlbW92ZS0+ cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCQkJCWJyZWFrOworCQkJY2FzZSBSVEVfVkFMVUVT OgorCQkJCWNoYW5nZV92YXJubygoRXhwciopcnRlLT52YWx1ZXNfbGlzdHMsIHRvUmVtb3Zl LT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJ CS8qIG5vIG9wICovCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIFJlcGxhY2Ug dmFybm8gaW4gcm9vdCB0YXJnZXRsaXN0IGFuZCBIQVZJTkcgY2xhdXNlLgorCSAqLworCWNo YW5nZV92YXJubygoRXhwciAqKSByb290LT5wcm9jZXNzZWRfdGxpc3QsIHRvUmVtb3ZlLT5y ZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisJY2hhbmdlX3Zhcm5vKChFeHByICopIHJvb3QtPnBh cnNlLT5oYXZpbmdRdWFsLCB0b1JlbW92ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCisJ LyoKKwkgKiBUcmFuc2ZlciBqb2luIGFuZCByZXN0cmljdGlvbiBjbGF1c2VzIGZyb20gdGhl IHJlbW92ZWQgcmVsYXRpb24gdG8gdGhlCisJICogcmVtYWluaW5nIG9uZS4gV2UgY2hhbmdl IHRoZSBWYXJzIG9mIHRoZSBjbGF1c2UgdG8gcG9pbnQgdG8gdGhlCisJICogcmVtYWluaW5n IHJlbGF0aW9uIGluc3RlYWQgb2YgdGhlIHJlbW92ZWQgb25lLiBUaGUgY2xhdXNlcyB0aGF0 IHJlcXVpcmUKKwkgKiBhIHN1YnNldCBvZiBqb2lucmVsaWRzIGJlY29tZSByZXN0cmljdGlv biBjbGF1c2VzIG9mIHRoZSByZW1haW5pbmcKKwkgKiByZWxhdGlvbiwgYW5kIG90aGVycyBy ZW1haW4gam9pbiBjbGF1c2VzLiBXZSBhcHBlbmQgdGhlbSB0bworCSAqIGJhc2VyZXN0cmlj dGluZm8gYW5kIGpvaW5pbmZvIHJlc3BlY3RpdmVseSwgdHJ5aW5nIG5vdCB0byBpbnRyb2R1 Y2UKKwkgKiBkdXBsaWNhdGVzLgorCSAqCisJICogV2UgYWxzbyBoYXZlIHRvIHByb2Nlc3Mg dGhlICdqb2luY2xhdXNlcycgbGlzdCBoZXJlLCBiZWNhdXNlIGl0CisJICogY29udGFpbnMg RUMtZGVyaXZlZCBqb2luIGNsYXVzZXMgd2hpY2ggbXVzdCBiZWNvbWUgZmlsdGVyIGNsYXVz ZXMuIEl0CisJICogaXMgbm90IGVub3VnaCB0byBqdXN0IGNvcnJlY3QgdGhlIEVDcywgYmVj YXVzZSB0aGUgRUMtZGVyaXZlZAorCSAqIHJlc3RyaWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJl Zm9yZSBqb2luIHJlbW92YWwgKHNlZQorCSAqIGdlbmVyYXRlX2Jhc2VfaW1wbGllZF9lcXVh bGl0aWVzKS4KKwkgKi8KK30KKworLyoKKyAqIHNwbGl0X3NlbGZqb2luX3F1YWxzCisgKgkJ UHJvY2Vzc2VzICdqb2lucXVhbHMnIGJ1aWxkaW5nIHR3byBsaXN0cywgb25lIHdpdGggYSBs aXN0IG9mIHF1YWxzCisgKgkJd2hlcmUgdGhlIGNvbHVtbnMvZXhwcnMgb24gZWl0aGVyIHNp ZGUgb2YgdGhlIGpvaW4gbWF0Y2ggYW5kIGFub3RoZXIKKyAqCQlsaXN0IGNvbnRhaW5pbmcg dGhlIHJlbWFpbmluZyBxdWFscy4KKyAqCisgKiAnam9pbnF1YWxzJyBtdXN0IG9ubHkgY29u dGFpbiBxdWFscyBmb3IgYSBSVEVfUkVMQVRJT04gYmVpbmcgam9pbmVkIHRvCisgKiBpdHNl bGYuCisgKi8KK3N0YXRpYyB2b2lkCitzcGxpdF9zZWxmam9pbl9xdWFscyhQbGFubmVySW5m byAqcm9vdCwgTGlzdCAqam9pbnF1YWxzLCBMaXN0ICoqc2VsZmpvaW5xdWFscywKKwkJCQkJ IExpc3QgKipvdGhlcmpvaW5xdWFscykKK3sKKwlMaXN0Q2VsbCAqbGM7CisJTGlzdAkgKnNq b2lucXVhbHMgPSBOSUw7CisJTGlzdAkgKm9qb2lucXVhbHMgPSBOSUw7CisKKwlmb3JlYWNo KGxjLCBqb2lucXVhbHMpCisJeworCQlSZXN0cmljdEluZm8JKnJpbmZvID0gbGZpcnN0X25v ZGUoUmVzdHJpY3RJbmZvLCBsYyk7CisJCU9wRXhwcgkJCSpleHByOworCQlFeHByCQkJKmxl ZnRleHByOworCQlFeHByCQkJKnJpZ2h0ZXhwcjsKKworCQkvKiBJbiBnZW5lcmFsLCBjbGF1 c2UgbG9va3MgbGlrZSBGKGFyZzEpID0gRyhhcmcyKSA/ICovCisJCWlmICghcmluZm8tPm1l cmdlb3BmYW1pbGllcyB8fAorCQkJYm1zX251bV9tZW1iZXJzKHJpbmZvLT5jbGF1c2VfcmVs aWRzKSAhPSAyIHx8CisJCQlibXNfbnVtX21lbWJlcnMocmluZm8tPmxlZnRfcmVsaWRzKSAh PSAxIHx8CisJCQlibXNfbnVtX21lbWJlcnMocmluZm8tPnJpZ2h0X3JlbGlkcykgIT0gMSkK KwkJeworCQkJb2pvaW5xdWFscyA9IGxhcHBlbmQob2pvaW5xdWFscywgcmluZm8pOworCQkJ Y29udGludWU7CisJCX0KKworCQlleHByID0gKE9wRXhwciAqKSByaW5mby0+Y2xhdXNlOwor CisJCWlmICghSXNBKGV4cHIsIE9wRXhwcikgfHwgbGlzdF9sZW5ndGgoZXhwci0+YXJncykg IT0gMikKKwkJeworCQkJb2pvaW5xdWFscyA9IGxhcHBlbmQob2pvaW5xdWFscywgcmluZm8p OworCQkJY29udGludWU7CisJCX0KKworCQlsZWZ0ZXhwciA9IChFeHByICopIGNvcHlPYmpl Y3QoZ2V0X2xlZnRvcChyaW5mby0+Y2xhdXNlKSk7CisJCXJpZ2h0ZXhwciA9IChFeHByICop IGNvcHlPYmplY3QoZ2V0X3JpZ2h0b3AocmluZm8tPmNsYXVzZSkpOworCisJCS8qIENhbid0 IG1hdGNoIG9mIHRoZSBleHBycyBhcmUgbm90IG9mIHRoZSBzYW1lIHR5cGUgKi8KKwkJaWYg KGxlZnRleHByLT50eXBlICE9IHJpZ2h0ZXhwci0+dHlwZSkKKwkJeworCQkJb2pvaW5xdWFs cyA9IGxhcHBlbmQob2pvaW5xdWFscywgcmluZm8pOworCQkJY29udGludWU7CisJCX0KKwor CQljaGFuZ2VfdmFybm8ocmlnaHRleHByLAorCQkJCQkgYm1zX25leHRfbWVtYmVyKHJpbmZv LT5yaWdodF9yZWxpZHMsIC0xKSwKKwkJCQkJIGJtc19uZXh0X21lbWJlcihyaW5mby0+bGVm dF9yZWxpZHMsIC0xKSk7CisKKwkJaWYgKGVxdWFsKGxlZnRleHByLCByaWdodGV4cHIpKQor CQkJc2pvaW5xdWFscyA9IGxhcHBlbmQoc2pvaW5xdWFscywgcmluZm8pOworCQllbHNlCisJ CQlvam9pbnF1YWxzID0gbGFwcGVuZChvam9pbnF1YWxzLCByaW5mbyk7CisJfQorCisJKnNl bGZqb2lucXVhbHMgPSBzam9pbnF1YWxzOworCSpvdGhlcmpvaW5xdWFscyA9IG9qb2lucXVh bHM7Cit9CisKKy8qCisgKiBGaW5kIGFuZCByZW1vdmUgdW5pcXVlIHNlbGYgam9pbnMgaW4g YSBncm91cCBvZiBiYXNlIHJlbGF0aW9ucyB0aGF0IGhhdmUKKyAqIHRoZSBzYW1lIE9pZC4K KyAqCisgKiBSZXR1cm5zIGEgc2V0IG9mIHJlbGlkcyB0aGF0IHdlcmUgcmVtb3ZlZC4KKyAq Lworc3RhdGljIFJlbGlkcworcmVtb3ZlX3NlbGZfam9pbnNfb25lX2dyb3VwKFBsYW5uZXJJ bmZvICpyb290LCBSZWxpZHMgcmVsaWRzKQoreworCVJlbGlkcyBqb2lucmVsaWRzID0gTlVM TDsKKwlSZWxpZHMgcmVzdWx0ID0gTlVMTDsKKwlpbnQgazsgLyogSW5kZXggb2Yga2VwdCBy ZWxhdGlvbiAqLworCWludCByID0gLTE7IC8qIEluZGV4IG9mIHJlbW92ZWQgcmVsYXRpb24g Ki8KKworCWlmIChibXNfbnVtX21lbWJlcnMocmVsaWRzKSA8IDIpCisJCXJldHVybiBOVUxM OworCisJd2hpbGUgKChyID0gYm1zX25leHRfbWVtYmVyKHJlbGlkcywgcikpID4gMCkKKwl7 CisJCVJlbE9wdEluZm8gKm91dGVyID0gcm9vdC0+c2ltcGxlX3JlbF9hcnJheVtyXTsKKwkJ ayA9IHI7CisKKwkJd2hpbGUgKChrID0gYm1zX25leHRfbWVtYmVyKHJlbGlkcywgaykpID4g MCkKKwkJeworCQkJUmVsT3B0SW5mbwkqaW5uZXIgPSByb290LT5zaW1wbGVfcmVsX2FycmF5 W2tdOworCQkJTGlzdAkgICAqcmVzdHJpY3RsaXN0OworCQkJTGlzdAkgICAqc2VsZmpvaW5x dWFsczsKKwkJCUxpc3QJICAgKm90aGVyam9pbnF1YWxzOworCQkJTGlzdENlbGwJKmxjOwor CQkJYm9vbAkJamluZm9fY2hlY2sgPSB0cnVlOworCQkJUGxhblJvd01hcmsJKm9tYXJrID0g TlVMTDsKKwkJCVBsYW5Sb3dNYXJrCSppbWFyayA9IE5VTEw7CisKKwkJCS8qIEEgc2FuaXR5 IGNoZWNrOiB0aGUgcmVsYXRpb25zIGhhdmUgdGhlIHNhbWUgT2lkLiAqLworCQkJQXNzZXJ0 KHJvb3QtPnNpbXBsZV9ydGVfYXJyYXlba10tPnJlbGlkID09CisJCQkJICAgcm9vdC0+c2lt cGxlX3J0ZV9hcnJheVtyXS0+cmVsaWQpOworCisJCQkvKgorCQkJICogSXQgaXMgaW1wb3Nz aWJsZSB0byBvcHRpbWl6ZSB0d28gcmVsYXRpb25zIGlmIHRoZXkgYmVsb25nIHRvCisJCQkg KiBkaWZmZXJlbnQgcnVsZXMgb2Ygb3JkZXIgcmVzdHJpY3Rpb24uIE90aGVyd2lzZSBwbGFu bmVyIGNhbid0CisJCQkgKiBiZSBhYmxlIHRvIGZpbmQgYW55IHZhcmlhbnRzIG9mIGNvcnJl Y3QgcXVlcnkgcGxhbi4KKwkJCSAqLworCQkJZm9yZWFjaChsYywgcm9vdC0+am9pbl9pbmZv X2xpc3QpCisJCQl7CisJCQkJU3BlY2lhbEpvaW5JbmZvICppbmZvID0gKFNwZWNpYWxKb2lu SW5mbyAqKSBsZmlyc3QobGMpOworCisJCQkJaWYgKGJtc19pc19tZW1iZXIoaywgaW5mby0+ c3luX2xlZnRoYW5kKSAmJgorCQkJCQkhYm1zX2lzX21lbWJlcihyLCBpbmZvLT5zeW5fbGVm dGhhbmQpKQorCQkJCQlqaW5mb19jaGVjayA9IGZhbHNlOworCQkJCWVsc2UgaWYgKGJtc19p c19tZW1iZXIoaywgaW5mby0+c3luX3JpZ2h0aGFuZCkgJiYKKwkJCQkJIWJtc19pc19tZW1i ZXIociwgaW5mby0+c3luX3JpZ2h0aGFuZCkpCisJCQkJCWppbmZvX2NoZWNrID0gZmFsc2U7 CisJCQkJZWxzZSBpZiAoYm1zX2lzX21lbWJlcihyLCBpbmZvLT5zeW5fbGVmdGhhbmQpICYm CisJCQkJCSFibXNfaXNfbWVtYmVyKGssIGluZm8tPnN5bl9sZWZ0aGFuZCkpCisJCQkJCWpp bmZvX2NoZWNrID0gZmFsc2U7CisJCQkJZWxzZSBpZiAoYm1zX2lzX21lbWJlcihyLCBpbmZv LT5zeW5fcmlnaHRoYW5kKSAmJgorCQkJCQkhYm1zX2lzX21lbWJlcihrLCBpbmZvLT5zeW5f cmlnaHRoYW5kKSkKKwkJCQkJamluZm9fY2hlY2sgPSBmYWxzZTsKKworCQkJCWlmICghamlu Zm9fY2hlY2spCisJCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoIWppbmZvX2NoZWNrKQor CQkJCWNvbnRpbnVlOworCisJCQkvKiBSZXVzZSBqb2lucmVsaWRzIGJpdHNldCB0byBhdm9p ZCByZWFsbG9jYXRpb24uICovCisJCQlqb2lucmVsaWRzID0gYm1zX2RlbF9tZW1iZXJzKGpv aW5yZWxpZHMsIGpvaW5yZWxpZHMpOworCisJCQkvKgorCQkJICogV2Ugb25seSBkZWFsIHdp dGggYmFzZSByZWxzIGhlcmUsIHNvIHRoZWlyIHJlbGlkcyBiaXRzZXQKKwkJCSAqIGNvbnRh aW5zIG9ubHkgb25lIG1lbWJlciAtLSB0aGVpciByZWxpZC4KKwkJCSAqLworCQkJam9pbnJl bGlkcyA9IGJtc19hZGRfbWVtYmVyKGpvaW5yZWxpZHMsIHIpOworCQkJam9pbnJlbGlkcyA9 IGJtc19hZGRfbWVtYmVyKGpvaW5yZWxpZHMsIGspOworCisJCQkvKiBJcyBpdCBhIHVuaXF1 ZSBzZWxmIGpvaW4/ICovCisJCQlyZXN0cmljdGxpc3QgPSBidWlsZF9qb2lucmVsX3Jlc3Ry aWN0bGlzdChyb290LCBqb2lucmVsaWRzLCBvdXRlciwKKwkJCQkJCQkJCQkJCQkgIGlubmVy KTsKKworCQkJLyoKKwkJCSAqIFByb2Nlc3MgcmVzdHJpY3RsaXN0IHRvIHNlcGVyYXRlIG91 dCB0aGUgc2VsZiBqb2luIHF1YWxzIGZyb20KKwkJCSAqIHRoZSBvdGhlciBxdWFscy4gZS5n IHggPSB4IGdvZXMgdG8gc2VsZmpvaW5xdWFscyBhbmQgYSA9IGIgdG8KKwkJCSAqIG90aGVy am9pbnF1YWxzLgorCQkJICovCisJCQlzcGxpdF9zZWxmam9pbl9xdWFscyhyb290LCByZXN0 cmljdGxpc3QsICZzZWxmam9pbnF1YWxzLAorCQkJCQkJCQkgJm90aGVyam9pbnF1YWxzKTsK KworCQkJaWYgKGxpc3RfbGVuZ3RoKHNlbGZqb2lucXVhbHMpID09IDApCisJCQl7CisJCQkJ LyoKKwkJCQkgKiBYWFg6CisJCQkJICogd2Ugd291bGQgZGV0ZWN0IHNlbGYtam9pbiB3aXRo b3V0IHF1YWxzIGxpa2UgJ3g9PXgnIGlmIHdlIGhhZAorCQkJCSAqIGFuIGZvcmVpZ24ga2V5 IGNvbnN0cmFpbnQgb24gc29tZSBvZiBvdGhlciBxdWFscyBhbmQgdGhpcyBqb2luCisJCQkJ ICogaGF2ZW4ndCBhbnkgY29sdW1ucyBmcm9tIHRoZSBvdXRlciBpbiB0aGUgdGFyZ2V0IGxp c3QuCisJCQkJICogQnV0IGl0IGlzIHN0aWxsIGNvbXBsZXggdGFzay4KKwkJCQkgKi8KKwkJ CQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIERldGVybWluZSBpZiB0aGUgaW5u ZXIgdGFibGUgY2FuIGR1cGxpY2F0ZSBvdXRlciByb3dzLiAgV2UgbXVzdAorCQkJICogYnlw YXNzIHRoZSB1bmlxdWUgcmVsIGNhY2hlIGhlcmUgc2luY2Ugd2UncmUgcG9zc2libHkgdXNp bmcgYQorCQkJICogc3Vic2V0IG9mIGpvaW4gcXVhbHMuIFdlIGNhbiB1c2UgJ2ZvcmNlX2Nh Y2hlJyA9IHRydWUgd2hlbiBhbGwKKwkJCSAqIGpvaW4gcXVhbHMgYXJlIHNlbGZqb2luIHF1 YWxzLiAgT3RoZXJ3aXNlIHdlIGNvdWxkIGVuZCB1cAorCQkJICogcHV0dGluZyBmYWxzZSBu ZWdhdGl2ZXMgaW4gdGhlIGNhY2hlLgorCQkJICovCisJCQlpZiAoIWlubmVycmVsX2lzX3Vu aXF1ZShyb290LCBqb2lucmVsaWRzLCBvdXRlci0+cmVsaWRzLAorCQkJCQkJCQkJaW5uZXIs IEpPSU5fSU5ORVIsIHNlbGZqb2lucXVhbHMsCisJCQkJCQkJCQlsaXN0X2xlbmd0aChvdGhl cmpvaW5xdWFscykgPT0gMCkpCisJCQkJY29udGludWU7CisKKwkJCS8qIFNlZSBmb3Igcm93 IG1hcmtzLiAqLworCQkJZm9yZWFjaCAobGMsIHJvb3QtPnJvd01hcmtzKQorCQkJeworCQkJ CVBsYW5Sb3dNYXJrICpyb3dNYXJrID0gKFBsYW5Sb3dNYXJrICopIGxmaXJzdChsYyk7CisK KwkJCQlpZiAocm93TWFyay0+cnRpID09IGspCisJCQkJeworCQkJCQlBc3NlcnQoaW1hcmsg PT0gTlVMTCk7CisJCQkJCWltYXJrID0gcm93TWFyazsKKwkJCQl9CisJCQkJZWxzZSBpZiAo cm93TWFyay0+cnRpID09IHIpCisJCQkJeworCQkJCQlBc3NlcnQob21hcmsgPT0gTlVMTCk7 CisJCQkJCW9tYXJrID0gcm93TWFyazsKKwkJCQl9CisKKwkJCQlpZiAob21hcmsgJiYgaW1h cmspCisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICogV2UgY2FuJ3QgcmVtb3Zl IHRoZSBqb2luIGlmIHRoZSByZWxhdGlvbnMgaGF2ZSByb3cgbWFya3Mgb2YKKwkJCSAqIGRp ZmZlcmVudCBzdHJlbmd0aCAoZS5nLiBvbmUgaXMgbG9ja2VkIEZPUiBVUERBVEUgYW5kIGFu b3RoZXIKKwkJCSAqIGp1c3QgaGFzIFJPV19NQVJLX1JFRkVSRU5DRSBmb3IgRXZhbFBsYW5R dWFsIHJlY2hlY2tpbmcpLgorCQkJICovCisJCQlpZiAob21hcmsgJiYgaW1hcmsgJiYgb21h cmstPm1hcmtUeXBlICE9IGltYXJrLT5tYXJrVHlwZSkKKwkJCQljb250aW51ZTsKKworCQkJ LyoKKwkJCSAqIEJlIHNhZmUgdG8gZG8gbm90IHJlbW92ZSB0YWJsZSBwYXJ0aWNpcGF0ZWQg aW4gY29tcGxpY2F0ZWQgUEgKKwkJCSAqLworCQkJZm9yZWFjaChsYywgcm9vdC0+cGxhY2Vo b2xkZXJfbGlzdCkKKwkJCXsKKwkJCQlQbGFjZUhvbGRlckluZm8gKnBoaW5mbyA9IChQbGFj ZUhvbGRlckluZm8gKikgbGZpcnN0KGxjKTsKKworCQkJCS8qIHRoZXJlIGlzbid0IGFueSBv dGhlciBwbGFjZSB0byBldmFsIFBIViAqLworCQkJCWlmIChibXNfaXNfc3Vic2V0KHBoaW5m by0+cGhfZXZhbF9hdCwgam9pbnJlbGlkcykgfHwKKwkJCQkJYm1zX2lzX3N1YnNldChwaGlu Zm8tPnBoX25lZWRlZCwgam9pbnJlbGlkcykpCisJCQkJCWJyZWFrOworCQkJfQorCisJCQlp ZiAobGMpCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBXZSBjYW4gcmVtb3ZlIGVp dGhlciByZWxhdGlvbiwgc28gcmVtb3ZlIHRoZSBvdXRlciBvbmUsIHRvCisJCQkgKiBzaW1w bGlmeSB0aGlzIGxvb3AuCisJCQkgKi8KKworCQkJLyoKKwkJCSAqIEFkZCBqb2luIHJlc3Ry aWN0aW9ucyB0byBqb2luaW5mbyBvZiByZW1vdmluZyByZWxhdGlvbiB0byBzaW1wbGlmeQor CQkJICogdGhlIHJlbGlkcyByZXBsYWNpbmcgcHJvY2VkdXJlLgorCQkJICovCisJCQlvdXRl ci0+am9pbmluZm8gPSBsaXN0X2NvbmNhdChvdXRlci0+am9pbmluZm8sIHJlc3RyaWN0bGlz dCk7CisKKwkJCS8qIEZpcnN0bHksIHJlcGxhY2UgaW5kZXggb2YgZXhjbHVkaW5nIHJlbGF0 aW9uIHdpdGgga2VlcGluZy4gKi8KKwkJCXJlbW92ZV9yZWxfZnJvbV9xdWVyeShyb290LCBv dXRlci0+cmVsaWQsIGpvaW5yZWxpZHMsIGlubmVyLT5yZWxpZCk7CisKKwkJCS8qIFNlY29u ZGx5LCBmaXggcmVzdHJpY3Rpb25zIG9mIGtlZXBpbmcgcmVsYXRpb24gKi8KKwkJCXJlbW92 ZV9zZWxmX2pvaW5fcmVsKHJvb3QsIGltYXJrLCBvbWFyaywgaW5uZXIsIG91dGVyKTsKKwkJ CXJlc3VsdCA9IGJtc19hZGRfbWVtYmVyKHJlc3VsdCwgcik7CisKKwkJCS8qIFdlIHJlbW92 ZWQgdGhlIG91dGVyIHJlbGF0aW9uLCB0cnkgdGhlIG5leHQgb25lLiAqLworCQkJYnJlYWs7 CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogSXRlcmF0aXZlbHkg Zm9ybSBhIGdyb3VwIG9mIHJlbGF0aW9uIGluZGV4ZXMgd2l0aCB0aGUgc2FtZSBvaWQgYW5k IGxhdW5jaAorICogdGhlIHJvdXRpbmUgdGhhdCBkZXRlY3RzIHNlbGYtam9pbnMgaW4gdGhp cyBncm91cCBhbmQgcmVtb3ZlcyBleGNlc3NpdmUKKyAqIHJhbmdlIHRhYmxlIGVudHJpZXMu CisgKgorICogQXQgdGhlIGVuZCBvZiBpdGVyYXRpb24sIGV4Y2x1ZGUgdGhlIGdyb3VwIGZy b20gdGhlIG92ZXJhbGwgcmVsaWRzIGxpc3QuCisgKiBTbyBlYWNoIG5leHQgaXRlcmF0aW9u IG9mIHRoZSBjeWNsZSB3aWxsIGludm9sdmUgbGVzcyBhbmQgbGVzcyB2YWx1ZSBvZgorICog cmVsaWRzLgorICovCitzdGF0aWMgUmVsaWRzCityZW1vdmVfc2VsZl9qb2luc19vbmVfbGV2 ZWwoUGxhbm5lckluZm8gKnJvb3QsIFJlbGlkcyByZWxpZHMsIFJlbGlkcyBUb1JlbW92ZSkK K3sKKwl3aGlsZSAoIWJtc19pc19lbXB0eShyZWxpZHMpKQorCXsKKwkJUmVsaWRzIGdyb3Vw ID0gTlVMTDsKKwkJT2lkIGdyb3VwT2lkOworCQlpbnQgaTsKKworCQlpID0gYm1zX2ZpcnN0 X21lbWJlcihyZWxpZHMpOworCQlncm91cE9pZCA9IHJvb3QtPnNpbXBsZV9ydGVfYXJyYXlb aV0tPnJlbGlkOworCQlBc3NlcnQoT2lkSXNWYWxpZChncm91cE9pZCkpOworCQlncm91cCA9 IGJtc19hZGRfbWVtYmVyKGdyb3VwLCBpKTsKKworCQkvKiBDcmVhdGUgZ3JvdXAgb2YgcmVs YXRpb24gaW5kZXhlcyB3aXRoIHRoZSBzYW1lIG9pZC4gKi8KKwkJd2hpbGUgKChpID0gYm1z X25leHRfbWVtYmVyKHJlbGlkcywgaSkpID4gMCkKKwkJeworCQkJUmFuZ2VUYmxFbnRyeSAq cnRlID0gcm9vdC0+c2ltcGxlX3J0ZV9hcnJheVtpXTsKKworCQkJQXNzZXJ0KE9pZElzVmFs aWQocnRlLT5yZWxpZCkpOworCisJCQlpZiAocnRlLT5yZWxpZCA9PSBncm91cE9pZCkKKwkJ CQlncm91cCA9IGJtc19hZGRfbWVtYmVyKGdyb3VwLCBpKTsKKwkJfQorCisJCXJlbGlkcyA9 IGJtc19kZWxfbWVtYmVycyhyZWxpZHMsIGdyb3VwKTsKKwkJVG9SZW1vdmUgPSBibXNfYWRk X21lbWJlcnMoVG9SZW1vdmUsCisJCQkJCQkJCSAgIHJlbW92ZV9zZWxmX2pvaW5zX29uZV9n cm91cChyb290LCBncm91cCkpOworCQlibXNfZnJlZShncm91cCk7CisJfQorCXJldHVybiBU b1JlbW92ZTsKK30KKworLyoKKyAqIEZvciBlYWNoIGxldmVsIG9mIGpvaW5saXN0IGZvcm0g YSBzZXQgb2YgYmFzZSByZWxhdGlvbnMgYW5kIGxhdW5jaCB0aGUKKyAqIHJvdXRpbmUgb2Yg dGhlIHNlbGYtam9pbiByZW1vdmFsIG9wdGltaXphdGlvbi4gUmVjdXJzZSBpbnRvIHN1Yi1q b2lubGlzdHMgdG8KKyAqIGhhbmRsZSBkZWVwZXIgbGV2ZWxzLgorICovCitzdGF0aWMgUmVs aWRzCityZW1vdmVfc2VsZl9qb2luc19yZWN1cnNlKFBsYW5uZXJJbmZvICpyb290LCBMaXN0 ICpqb2lubGlzdCwgUmVsaWRzIFRvUmVtb3ZlKQoreworCUxpc3RDZWxsICpsYzsKKwlSZWxp ZHMgcmVsaWRzID0gTlVMTDsKKworCS8qIENvbGxlY3QgdGhlIGlkcyBvZiBiYXNlIHJlbGF0 aW9ucyBhdCBvbmUgbGV2ZWwgb2YgdGhlIGpvaW4gdHJlZS4gKi8KKwlmb3JlYWNoIChsYywg am9pbmxpc3QpCisJeworCQlzd2l0Y2ggKCgoTm9kZSAqKSBsZmlyc3QobGMpKS0+dHlwZSkK KwkJeworCQkJY2FzZSBUX0xpc3Q6CisJCQkJLyogUmVjdXJzaXZlbHkgZ28gaW5zaWRlIHRo ZSBzdWItam9pbmxpc3QgKi8KKwkJCQlUb1JlbW92ZSA9IHJlbW92ZV9zZWxmX2pvaW5zX3Jl Y3Vyc2Uocm9vdCwKKwkJCQkJCQkJCQkJCQkgKExpc3QgKikgbGZpcnN0KGxjKSwKKwkJCQkJ CQkJCQkJCQkgVG9SZW1vdmUpOworCQkJCWJyZWFrOworCQkJY2FzZSBUX1JhbmdlVGJsUmVm OgorCQkJeworCQkJCVJhbmdlVGJsUmVmICpyZWYgPSAoUmFuZ2VUYmxSZWYgKikgbGZpcnN0 KGxjKTsKKwkJCQlSYW5nZVRibEVudHJ5ICpydGUgPSByb290LT5zaW1wbGVfcnRlX2FycmF5 W3JlZi0+cnRpbmRleF07CisKKwkJCQkvKgorCQkJCSAqIFdlIG9ubHkgY2FyZSBhYm91dCBi YXNlIHJlbGF0aW9ucyBmcm9tIHdoaWNoIHdlIHNlbGVjdAorCQkJCSAqIHNvbWV0aGluZy4K KwkJCQkgKi8KKwkJCQlpZiAocnRlLT5ydGVraW5kICE9IFJURV9SRUxBVElPTiB8fAorCQkJ CQlydGUtPnJlbGtpbmQgIT0gUkVMS0lORF9SRUxBVElPTiB8fAorCQkJCQlyb290LT5zaW1w bGVfcmVsX2FycmF5W3JlZi0+cnRpbmRleF0gPT0gTlVMTCkKKwkJCQkJYnJlYWs7CisKKwkJ CQlBc3NlcnQoIWJtc19pc19tZW1iZXIocmVmLT5ydGluZGV4LCByZWxpZHMpKTsKKwkJCQly ZWxpZHMgPSBibXNfYWRkX21lbWJlcihyZWxpZHMsIHJlZi0+cnRpbmRleCk7CisKKwkJCQkv KgorCQkJCSAqIExpbWl0IHRoZSBudW1iZXIgb2Ygam9pbnMgd2UgcHJvY2VzcyB0byBjb250 cm9sIHRoZSBxdWFkcmF0aWMKKwkJCQkgKiBiZWhhdmlvci4KKwkJCQkgKi8KKwkJCQlpZiAo Ym1zX251bV9tZW1iZXJzKHJlbGlkcykgPiBqb2luX2NvbGxhcHNlX2xpbWl0KQorCQkJCQli cmVhazsKKwkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQXNzZXJ0KGZhbHNl KTsKKwkJfQorCX0KKworCWlmIChibXNfbnVtX21lbWJlcnMocmVsaWRzKSA+PSAyKQorCQlU b1JlbW92ZSA9IHJlbW92ZV9zZWxmX2pvaW5zX29uZV9sZXZlbChyb290LCByZWxpZHMsIFRv UmVtb3ZlKTsKKworCWJtc19mcmVlKHJlbGlkcyk7CisJcmV0dXJuIFRvUmVtb3ZlOworfQor CisvKgorICogRmluZCBhbmQgcmVtb3ZlIHVzZWxlc3Mgc2VsZiBqb2lucy4KKyAqCisgKiBX ZSBzZWFyY2ggZm9yIGpvaW5zIHdoZXJlIHRoZSBzYW1lIHJlbGF0aW9uIGlzIGpvaW5lZCB0 byBpdHNlbGYgb24gYWxsCisgKiBjb2x1bW5zIG9mIHNvbWUgdW5pcXVlIGluZGV4LiBJZiB0 aGlzIGNvbmRpdGlvbiBob2xkcywgdGhlbiwgZm9yCisgKiBlYWNoIG91dGVyIHJvdywgb25s eSBvbmUgaW5uZXIgcm93IG1hdGNoZXMsIGFuZCBpdCBpcyB0aGUgc2FtZSByb3cKKyAqIG9m IHRoZSBzYW1lIHJlbGF0aW9uLiBUaGlzIGFsbG93cyB1cyB0byByZW1vdmUgdGhlIGpvaW4g YW5kIHJlcGxhY2UKKyAqIGl0IHdpdGggYSBzY2FuIHRoYXQgY29tYmluZXMgV0hFUkUgY2xh dXNlcyBmcm9tIGJvdGggc2lkZXMuIFRoZSBqb2luCisgKiBjbGF1c2VzIHRoZW1zZWx2ZXMg YXNzdW1lIHRoZSBmb3JtIG9mIFggPSBYIGFuZCBjYW4gYmUgcmVwbGFjZWQgd2l0aAorICog Tk9UIE5VTEwgY2xhdXNlcy4KKyAqCisgKiBGb3IgdGhlIHNha2Ugb2Ygc2ltcGxpY2l0eSwg d2UgZG9uJ3QgYXBwbHkgdGhpcyBvcHRpbWl6YXRpb24gdG8gc3BlY2lhbAorICogam9pbnMu IEhlcmUgaXMgYSBsaXN0IG9mIHdoYXQgd2UgY291bGQgZG8gaW4gc29tZSBwYXJ0aWN1bGFy IGNhc2VzOgorICogJ2EgYTEgc2VtaSBqb2luIGEgYTInOiBpcyByZWR1Y2VkIHRvIGlubmVy IGJ5IHJlZHVjZV91bmlxdWVfc2VtaWpvaW5zLAorICogYW5kIHRoZW4gcmVtb3ZlZCBub3Jt YWxseS4KKyAqICdhIGExIGFudGkgam9pbiBhIGEyJzogY291bGQgc2ltcGxpZnkgdG8gYSBz Y2FuIHdpdGggJ291dGVyIHF1YWxzIEFORAorICogKElTIE5VTEwgb24gam9pbiBjb2x1bW5z IE9SIE5PVCBpbm5lciBxdWFscyknLgorICogJ2EgYTEgbGVmdCBqb2luIGEgYTInOiBjb3Vs ZCBzaW1wbGlmeSB0byBhIHNjYW4gbGlrZSBpbm5lciwgYnV0IHdpdGhvdXQKKyAqIE5PVCBO VUxMIGNvbmRpdGlvbnMgb24gam9pbiBjb2x1bW5zLgorICogJ2EgYTEgbGVmdCBqb2luIChh IGEyIGpvaW4gYiknOiBjYW4ndCBzaW1wbGlmeSB0aGlzLCBiZWNhdXNlIGpvaW4gdG8gYgor ICogY2FuIGJvdGggcmVtb3ZlIHJvd3MgYW5kIGludHJvZHVjZSBkdXBsaWNhdGVzLgorICoK KyAqIFRvIHNlYXJjaCBmb3IgcmVtb3ZhYmxlIGpvaW5zLCB3ZSBvcmRlciBhbGwgdGhlIHJl bGF0aW9ucyBvbiB0aGVpciBPaWQsCisgKiBnbyBvdmVyIGVhY2ggc2V0IHdpdGggdGhlIHNh bWUgT2lkLCBhbmQgY29uc2lkZXIgZWFjaCBwYWlyIG9mIHJlbGF0aW9ucworICogaW4gdGhp cyBzZXQuIFdlIGNoZWNrIHRoYXQgYm90aCByZWxhdGlvbiBhcmUgbWFkZSB1bmlxdWUgYnkg dGhlIHNhbWUKKyAqIHVuaXF1ZSBpbmRleCB3aXRoIHRoZSBzYW1lIGNsYXVzZXMuCisgKgor ICogVG8gcmVtb3ZlIHRoZSBqb2luLCB3ZSBtYXJrIG9uZSBvZiB0aGUgcGFydGljaXBhdGlu ZyByZWxhdGlvbnMgYXMKKyAqIGRlYWQsIGFuZCByZXdyaXRlIGFsbCByZWZlcmVuY2VzIHRv IGl0IHRvIHBvaW50IHRvIHRoZSByZW1haW5pbmcKKyAqIHJlbGF0aW9uLiBUaGlzIGluY2x1 ZGVzIG1vZGlmeWluZyBSZXN0cmljdEluZm9zLCBFcXVpdmFsZW5jZUNsYXNzZXMgYW5kCisg KiBFcXVpdmFsZW5jZU1lbWJlcnMuIFdlIGFsc28gaGF2ZSB0byBtb2RpZnkgdGhlIHJvdyBt YXJrcy4gVGhlIGpvaW4gY2xhdXNlcworICogb2YgdGhlIHJlbW92ZWQgcmVsYXRpb24gYmVj b21lIGVpdGhlciByZXN0cmljdGlvbiBvciBqb2luIGNsYXVzZXMsIGJhc2VkIG9uCisgKiB3 aGV0aGVyIHRoZXkgcmVmZXJlbmNlIGFueSByZWxhdGlvbnMgbm90IHBhcnRpY2lwYXRpbmcg aW4gdGhlIHJlbW92ZWQgam9pbi4KKyAqCisgKiAndGFyZ2V0bGlzdCcgaXMgdGhlIHRvcC1s ZXZlbCB0YXJnZXRsaXN0IG9mIHF1ZXJ5LiBJZiBpdCBoYXMgYW55IHJlZmVyZW5jZXMKKyAq IHRvIHRoZSByZW1vdmVkIHJlbGF0aW9ucywgd2UgdXBkYXRlIHRoZW0gdG8gcG9pbnQgdG8g dGhlIHJlbWFpbmluZyBvbmVzLgorICovCitMaXN0ICoKK3JlbW92ZV91c2VsZXNzX3NlbGZf am9pbnMoUGxhbm5lckluZm8gKnJvb3QsIExpc3QgKmpvaW5saXN0KQoreworCVJlbGlkcyBU b1JlbW92ZSA9IE5VTEw7CisJaW50IHJlbGlkID0gLTE7CisKKwlpZiAoIWVuYWJsZV9zZWxm X2pvaW5fcmVtb3ZhbCkKKwkJcmV0dXJuIGpvaW5saXN0OworCisJLyoKKwkgKiBNZXJnZSBw YWlycyBvZiByZWxhdGlvbnMgcGFydGljaXBhdGVkIGluIHNlbGYtam9pbi4gUmVtb3ZlCisJ ICogdW5uZWNlc3NhcnkgcmFuZ2UgdGFibGUgZW50cmllcy4KKwkgKi8KKwlUb1JlbW92ZSA9 IHJlbW92ZV9zZWxmX2pvaW5zX3JlY3Vyc2Uocm9vdCwgam9pbmxpc3QsIFRvUmVtb3ZlKTsK Kwl3aGlsZSAoKHJlbGlkID0gYm1zX25leHRfbWVtYmVyKFRvUmVtb3ZlLCByZWxpZCkpID49 IDApCisJeworCQlpbnQgbnJlbW92ZWQgPSAwOworCQlqb2lubGlzdCA9IHJlbW92ZV9yZWxf ZnJvbV9qb2lubGlzdChqb2lubGlzdCwgcmVsaWQsICZucmVtb3ZlZCk7CisJfQorCisJcmV0 dXJuIGpvaW5saXN0OworfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3Bs YW4vcGxhbm1haW4uYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3BsYW5tYWluLmMK aW5kZXggYzkyZGRkMjdlZC4uOGY2ZDVlNTYzOSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQv b3B0aW1pemVyL3BsYW4vcGxhbm1haW4uYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIv cGxhbi9wbGFubWFpbi5jCkBAIC0yMjYsNiArMjI2LDExIEBAIHF1ZXJ5X3BsYW5uZXIoUGxh bm5lckluZm8gKnJvb3QsCiAJICovCiAJcmVkdWNlX3VuaXF1ZV9zZW1pam9pbnMocm9vdCk7 CiAKKwkvKgorCSAqIFJlbW92ZSBzZWxmIGpvaW5zIG9uIGEgdW5pcXVlIGNvbHVtbi4KKwkg Ki8KKwlqb2lubGlzdCA9IHJlbW92ZV91c2VsZXNzX3NlbGZfam9pbnMocm9vdCwgam9pbmxp c3QpOworCiAJLyoKIAkgKiBOb3cgZGlzdHJpYnV0ZSAicGxhY2Vob2xkZXJzIiB0byBiYXNl IHJlbHMgYXMgbmVlZGVkLiAgVGhpcyBoYXMgdG8gYmUKIAkgKiBkb25lIGFmdGVyIGpvaW4g cmVtb3ZhbCBiZWNhdXNlIHJlbW92YWwgY291bGQgY2hhbmdlIHdoZXRoZXIgYQpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvam9pbmluZm8uYyBiL3NyYy9iYWNr ZW5kL29wdGltaXplci91dGlsL2pvaW5pbmZvLmMKaW5kZXggZDRjZmZkYjE5OC4uZGQzZTMy M2YyMSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvam9pbmluZm8u YworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9qb2luaW5mby5jCkBAIC0xMzAs NiArMTMwLDkgQEAgcmVtb3ZlX2pvaW5fY2xhdXNlX2Zyb21fcmVscyhQbGFubmVySW5mbyAq cm9vdCwKIAl7CiAJCVJlbE9wdEluZm8gKnJlbCA9IGZpbmRfYmFzZV9yZWwocm9vdCwgY3Vy X3JlbGlkKTsKIAorCQlpZiAoIWxpc3RfbWVtYmVyX3B0cihyZWwtPmpvaW5pbmZvLCByZXN0 cmljdGluZm8pKQorCQkJY29udGludWU7CisKIAkJLyoKIAkJICogUmVtb3ZlIHRoZSByZXN0 cmljdGluZm8gZnJvbSB0aGUgbGlzdC4gIFBvaW50ZXIgY29tcGFyaXNvbiBpcwogCQkgKiBz dWZmaWNpZW50LgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcmVs bm9kZS5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcmVsbm9kZS5jCmluZGV4IDUy MDQwOWY0YmEuLjJlNzNjYWNjMGQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXpl ci91dGlsL3JlbG5vZGUuYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9yZWxu b2RlLmMKQEAgLTQwLDE0ICs0MCwxMCBAQCB0eXBlZGVmIHN0cnVjdCBKb2luSGFzaEVudHJ5 CiAKIHN0YXRpYyB2b2lkIGJ1aWxkX2pvaW5yZWxfdGxpc3QoUGxhbm5lckluZm8gKnJvb3Qs IFJlbE9wdEluZm8gKmpvaW5yZWwsCiAJCQkJCQkJCVJlbE9wdEluZm8gKmlucHV0X3JlbCk7 Ci1zdGF0aWMgTGlzdCAqYnVpbGRfam9pbnJlbF9yZXN0cmljdGxpc3QoUGxhbm5lckluZm8g KnJvb3QsCi0JCQkJCQkJCQkJUmVsT3B0SW5mbyAqam9pbnJlbCwKLQkJCQkJCQkJCQlSZWxP cHRJbmZvICpvdXRlcl9yZWwsCi0JCQkJCQkJCQkJUmVsT3B0SW5mbyAqaW5uZXJfcmVsKTsK IHN0YXRpYyB2b2lkIGJ1aWxkX2pvaW5yZWxfam9pbmxpc3QoUmVsT3B0SW5mbyAqam9pbnJl bCwKIAkJCQkJCQkJICAgUmVsT3B0SW5mbyAqb3V0ZXJfcmVsLAogCQkJCQkJCQkgICBSZWxP cHRJbmZvICppbm5lcl9yZWwpOwotc3RhdGljIExpc3QgKnN1YmJ1aWxkX2pvaW5yZWxfcmVz dHJpY3RsaXN0KFJlbE9wdEluZm8gKmpvaW5yZWwsCitzdGF0aWMgTGlzdCAqc3ViYnVpbGRf am9pbnJlbF9yZXN0cmljdGxpc3QoUmVsaWRzIGpvaW5yZWxpZHMsCiAJCQkJCQkJCQkJICAg TGlzdCAqam9pbmluZm9fbGlzdCwKIAkJCQkJCQkJCQkgICBMaXN0ICpuZXdfcmVzdHJpY3Rs aXN0KTsKIHN0YXRpYyBMaXN0ICpzdWJidWlsZF9qb2lucmVsX2pvaW5saXN0KFJlbE9wdElu Zm8gKmpvaW5yZWwsCkBAIC02MDAsNyArNTk2LDcgQEAgYnVpbGRfam9pbl9yZWwoUGxhbm5l ckluZm8gKnJvb3QsCiAJCSAqLwogCQlpZiAocmVzdHJpY3RsaXN0X3B0cikKIAkJCSpyZXN0 cmljdGxpc3RfcHRyID0gYnVpbGRfam9pbnJlbF9yZXN0cmljdGxpc3Qocm9vdCwKLQkJCQkJ CQkJCQkJCQkJICAgam9pbnJlbCwKKwkJCQkJCQkJCQkJCQkJICAgam9pbnJlbC0+cmVsaWRz LAogCQkJCQkJCQkJCQkJCQkgICBvdXRlcl9yZWwsCiAJCQkJCQkJCQkJCQkJCSAgIGlubmVy X3JlbCk7CiAJCXJldHVybiBqb2lucmVsOwpAQCAtNzA3LDcgKzcwMyw3IEBAIGJ1aWxkX2pv aW5fcmVsKFBsYW5uZXJJbmZvICpyb290LAogCSAqIGNhbGxlciBtaWdodCBvciBtaWdodCBu b3QgbmVlZCB0aGUgcmVzdHJpY3RsaXN0LCBidXQgSSBuZWVkIGl0IGFueXdheQogCSAqIGZv ciBzZXRfam9pbnJlbF9zaXplX2VzdGltYXRlcygpLikKIAkgKi8KLQlyZXN0cmljdGxpc3Qg PSBidWlsZF9qb2lucmVsX3Jlc3RyaWN0bGlzdChyb290LCBqb2lucmVsLAorCXJlc3RyaWN0 bGlzdCA9IGJ1aWxkX2pvaW5yZWxfcmVzdHJpY3RsaXN0KHJvb3QsIGpvaW5yZWwtPnJlbGlk cywKIAkJCQkJCQkJCQkJICBvdXRlcl9yZWwsIGlubmVyX3JlbCk7CiAJaWYgKHJlc3RyaWN0 bGlzdF9wdHIpCiAJCSpyZXN0cmljdGxpc3RfcHRyID0gcmVzdHJpY3RsaXN0OwpAQCAtMTA1 OSw3ICsxMDU1LDcgQEAgYnVpbGRfam9pbnJlbF90bGlzdChQbGFubmVySW5mbyAqcm9vdCwg UmVsT3B0SW5mbyAqam9pbnJlbCwKICAqCSAgdGhlIHZhcmlvdXMgam9pbmxpc3QgZW50cmll cyB1bHRpbWF0ZWx5IHJlZmVyIHRvIFJlc3RyaWN0SW5mb3MKICAqCSAgcHVzaGVkIGludG8g dGhlbSBieSBkaXN0cmlidXRlX3Jlc3RyaWN0aW5mb190b19yZWxzKCkuCiAgKgotICogJ2pv aW5yZWwnIGlzIGEgam9pbiByZWxhdGlvbiBub2RlCisgKiAnam9pbnJlbGlkcycgaXMgYSBq b2luIHJlbGF0aW9uIGlkIHNldAogICogJ291dGVyX3JlbCcgYW5kICdpbm5lcl9yZWwnIGFy ZSBhIHBhaXIgb2YgcmVsYXRpb25zIHRoYXQgY2FuIGJlIGpvaW5lZAogICoJCXRvIGZvcm0g am9pbnJlbC4KICAqCkBAIC0xMDcyLDkgKzEwNjgsOSBAQCBidWlsZF9qb2lucmVsX3RsaXN0 KFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpqb2lucmVsLAogICogUmVzdHJpY3RJ bmZvIG5vZGVzIGFyZSBubyBsb25nZXIgY29udGV4dC1kZXBlbmRlbnQuICBJbnN0ZWFkLCBq dXN0IGluY2x1ZGUKICAqIHRoZSBvcmlnaW5hbCBub2RlcyBpbiB0aGUgbGlzdHMgbWFkZSBm b3IgdGhlIGpvaW4gcmVsYXRpb24uCiAgKi8KLXN0YXRpYyBMaXN0ICoKK0xpc3QgKgogYnVp bGRfam9pbnJlbF9yZXN0cmljdGxpc3QoUGxhbm5lckluZm8gKnJvb3QsCi0JCQkJCQkgICBS ZWxPcHRJbmZvICpqb2lucmVsLAorCQkJCQkJICAgUmVsaWRzIGpvaW5yZWxpZHMsCiAJCQkJ CQkgICBSZWxPcHRJbmZvICpvdXRlcl9yZWwsCiAJCQkJCQkgICBSZWxPcHRJbmZvICppbm5l cl9yZWwpCiB7CkBAIC0xMDg1LDggKzEwODEsOCBAQCBidWlsZF9qb2lucmVsX3Jlc3RyaWN0 bGlzdChQbGFubmVySW5mbyAqcm9vdCwKIAkgKiBlbGltaW5hdGluZyBhbnkgZHVwbGljYXRl cyAoaW1wb3J0YW50IHNpbmNlIHdlIHdpbGwgc2VlIG1hbnkgb2YgdGhlCiAJICogc2FtZSBj bGF1c2VzIGFycml2aW5nIGZyb20gYm90aCBpbnB1dCByZWxhdGlvbnMpLgogCSAqLwotCXJl c3VsdCA9IHN1YmJ1aWxkX2pvaW5yZWxfcmVzdHJpY3RsaXN0KGpvaW5yZWwsIG91dGVyX3Jl bC0+am9pbmluZm8sIE5JTCk7Ci0JcmVzdWx0ID0gc3ViYnVpbGRfam9pbnJlbF9yZXN0cmlj dGxpc3Qoam9pbnJlbCwgaW5uZXJfcmVsLT5qb2luaW5mbywgcmVzdWx0KTsKKwlyZXN1bHQg PSBzdWJidWlsZF9qb2lucmVsX3Jlc3RyaWN0bGlzdChqb2lucmVsaWRzLCBvdXRlcl9yZWwt PmpvaW5pbmZvLCBOSUwpOworCXJlc3VsdCA9IHN1YmJ1aWxkX2pvaW5yZWxfcmVzdHJpY3Rs aXN0KGpvaW5yZWxpZHMsIGlubmVyX3JlbC0+am9pbmluZm8sIHJlc3VsdCk7CiAKIAkvKgog CSAqIEFkZCBvbiBhbnkgY2xhdXNlcyBkZXJpdmVkIGZyb20gRXF1aXZhbGVuY2VDbGFzc2Vz LiAgVGhlc2UgY2Fubm90IGJlCkBAIC0xMDk1LDcgKzEwOTEsNyBAQCBidWlsZF9qb2lucmVs X3Jlc3RyaWN0bGlzdChQbGFubmVySW5mbyAqcm9vdCwKIAkgKi8KIAlyZXN1bHQgPSBsaXN0 X2NvbmNhdChyZXN1bHQsCiAJCQkJCQkgZ2VuZXJhdGVfam9pbl9pbXBsaWVkX2VxdWFsaXRp ZXMocm9vdCwKLQkJCQkJCQkJCQkJCQkJICBqb2lucmVsLT5yZWxpZHMsCisJCQkJCQkJCQkJ CQkJCSAgam9pbnJlbGlkcywKIAkJCQkJCQkJCQkJCQkJICBvdXRlcl9yZWwtPnJlbGlkcywK IAkJCQkJCQkJCQkJCQkJICBpbm5lcl9yZWwpKTsKIApAQCAtMTEyMSw3ICsxMTE3LDcgQEAg YnVpbGRfam9pbnJlbF9qb2lubGlzdChSZWxPcHRJbmZvICpqb2lucmVsLAogfQogCiBzdGF0 aWMgTGlzdCAqCi1zdWJidWlsZF9qb2lucmVsX3Jlc3RyaWN0bGlzdChSZWxPcHRJbmZvICpq b2lucmVsLAorc3ViYnVpbGRfam9pbnJlbF9yZXN0cmljdGxpc3QoUmVsaWRzIGpvaW5yZWxp ZHMsCiAJCQkJCQkJICBMaXN0ICpqb2luaW5mb19saXN0LAogCQkJCQkJCSAgTGlzdCAqbmV3 X3Jlc3RyaWN0bGlzdCkKIHsKQEAgLTExMzEsNyArMTEyNyw3IEBAIHN1YmJ1aWxkX2pvaW5y ZWxfcmVzdHJpY3RsaXN0KFJlbE9wdEluZm8gKmpvaW5yZWwsCiAJewogCQlSZXN0cmljdElu Zm8gKnJpbmZvID0gKFJlc3RyaWN0SW5mbyAqKSBsZmlyc3QobCk7CiAKLQkJaWYgKGJtc19p c19zdWJzZXQocmluZm8tPnJlcXVpcmVkX3JlbGlkcywgam9pbnJlbC0+cmVsaWRzKSkKKwkJ aWYgKGJtc19pc19zdWJzZXQocmluZm8tPnJlcXVpcmVkX3JlbGlkcywgam9pbnJlbGlkcykp CiAJCXsKIAkJCS8qCiAJCQkgKiBUaGlzIGNsYXVzZSBiZWNvbWVzIGEgcmVzdHJpY3Rpb24g Y2xhdXNlIGZvciB0aGUgam9pbnJlbCwgc2luY2UKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L3V0aWxzL21pc2MvZ3VjLmMgYi9zcmMvYmFja2VuZC91dGlscy9taXNjL2d1Yy5jCmluZGV4 IDFlMzY1MDE4NGIuLjFiNjc0ZDU5ODcgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxz L21pc2MvZ3VjLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWMuYwpAQCAtMTE3 OCw2ICsxMTc4LDE2IEBAIHN0YXRpYyBzdHJ1Y3QgY29uZmlnX2Jvb2wgQ29uZmlndXJlTmFt ZXNCb29sW10gPQogCQl0cnVlLAogCQlOVUxMLCBOVUxMLCBOVUxMCiAJfSwKKwl7CisJCXsi ZW5hYmxlX3NlbGZfam9pbl9yZW1vdmFsIiwgUEdDX1VTRVJTRVQsIFFVRVJZX1RVTklOR19N RVRIT0QsCisJCQlnZXR0ZXh0X25vb3AoIkVuYWJsZSByZW1vdmFsIG9mIHVuaXF1ZSBzZWxm LWpvaW5zLiIpLAorCQkJTlVMTCwKKwkJCUdVQ19FWFBMQUlOCisJCX0sCisJCSZlbmFibGVf c2VsZl9qb2luX3JlbW92YWwsCisJCXRydWUsCisJCU5VTEwsIE5VTEwsIE5VTEwKKwl9LAog CXsKIAkJeyJnZXFvIiwgUEdDX1VTRVJTRVQsIFFVRVJZX1RVTklOR19HRVFPLAogCQkJZ2V0 dGV4dF9ub29wKCJFbmFibGVzIGdlbmV0aWMgcXVlcnkgb3B0aW1pemF0aW9uLiIpLApkaWZm IC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BhdGhub2RlLmggYi9zcmMvaW5jbHVk ZS9vcHRpbWl6ZXIvcGF0aG5vZGUuaAppbmRleCA2MjBlZWRhMmQ2Li4xZWZmYTk3MjFhIDEw MDY0NAotLS0gYS9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aG5vZGUuaAorKysgYi9zcmMv aW5jbHVkZS9vcHRpbWl6ZXIvcGF0aG5vZGUuaApAQCAtMzA3LDYgKzMwNywxMCBAQCBleHRl cm4gUmVsT3B0SW5mbyAqYnVpbGRfam9pbl9yZWwoUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJ CQkJCSAgUmVsT3B0SW5mbyAqaW5uZXJfcmVsLAogCQkJCQkJCQkgIFNwZWNpYWxKb2luSW5m byAqc2ppbmZvLAogCQkJCQkJCQkgIExpc3QgKipyZXN0cmljdGxpc3RfcHRyKTsKK2V4dGVy biBMaXN0ICpidWlsZF9qb2lucmVsX3Jlc3RyaWN0bGlzdChQbGFubmVySW5mbyAqcm9vdCwK KwkJCQkJCSAgIFJlbGlkcyBqb2lucmVsaWRzLAorCQkJCQkJICAgUmVsT3B0SW5mbyAqb3V0 ZXJfcmVsLAorCQkJCQkJICAgUmVsT3B0SW5mbyAqaW5uZXJfcmVsKTsKIGV4dGVybiBSZWxp ZHMgbWluX2pvaW5fcGFyYW1ldGVyaXphdGlvbihQbGFubmVySW5mbyAqcm9vdCwKIAkJCQkJ CQkJCQlSZWxpZHMgam9pbnJlbGlkcywKIAkJCQkJCQkJCQlSZWxPcHRJbmZvICpvdXRlcl9y ZWwsCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGxhbm1haW4uaCBiL3Ny Yy9pbmNsdWRlL29wdGltaXplci9wbGFubWFpbi5oCmluZGV4IDU0YTBkNGMxODguLjA1NGI3 N2UwODcgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wdGltaXplci9wbGFubWFpbi5oCisr KyBiL3NyYy9pbmNsdWRlL29wdGltaXplci9wbGFubWFpbi5oCkBAIC0yMCw2ICsyMCw3IEBA CiAvKiBHVUMgcGFyYW1ldGVycyAqLwogI2RlZmluZSBERUZBVUxUX0NVUlNPUl9UVVBMRV9G UkFDVElPTiAwLjEKIGV4dGVybiBkb3VibGUgY3Vyc29yX3R1cGxlX2ZyYWN0aW9uOworZXh0 ZXJuIGJvb2wgZW5hYmxlX3NlbGZfam9pbl9yZW1vdmFsOwogCiAvKiBxdWVyeV9wbGFubmVy IGNhbGxiYWNrIHRvIGNvbXB1dGUgcXVlcnlfcGF0aGtleXMgKi8KIHR5cGVkZWYgdm9pZCAo KnF1ZXJ5X3BhdGhrZXlzX2NhbGxiYWNrKSAoUGxhbm5lckluZm8gKnJvb3QsIHZvaWQgKmV4 dHJhKTsKQEAgLTEwNyw2ICsxMDgsNyBAQCBleHRlcm4gYm9vbCBxdWVyeV9pc19kaXN0aW5j dF9mb3IoUXVlcnkgKnF1ZXJ5LCBMaXN0ICpjb2xub3MsIExpc3QgKm9waWRzKTsKIGV4dGVy biBib29sIGlubmVycmVsX2lzX3VuaXF1ZShQbGFubmVySW5mbyAqcm9vdCwKIAkJCQkJCQkg ICBSZWxpZHMgam9pbnJlbGlkcywgUmVsaWRzIG91dGVycmVsaWRzLCBSZWxPcHRJbmZvICpp bm5lcnJlbCwKIAkJCQkJCQkgICBKb2luVHlwZSBqb2ludHlwZSwgTGlzdCAqcmVzdHJpY3Rs aXN0LCBib29sIGZvcmNlX2NhY2hlKTsKK2V4dGVybiBMaXN0ICogcmVtb3ZlX3VzZWxlc3Nf c2VsZl9qb2lucyhQbGFubmVySW5mbyAqcm9vdCwgTGlzdCAqam9pbnRyZWUpOwogCiAvKgog ICogcHJvdG90eXBlcyBmb3IgcGxhbi9zZXRyZWZzLmMKZGlmZiAtLWdpdCBhL3NyYy90ZXN0 L3JlZ3Jlc3MvZXhwZWN0ZWQvZXF1aXZjbGFzcy5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4 cGVjdGVkL2VxdWl2Y2xhc3Mub3V0CmluZGV4IDEyNmY3MDQ3ZmUuLmRlNzE0NDEwNTIgMTAw NjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZXF1aXZjbGFzcy5vdXQKKysr IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9lcXVpdmNsYXNzLm91dApAQCAtNDMwLDYg KzQzMCwzOCBAQCBleHBsYWluIChjb3N0cyBvZmYpCiAgICBGaWx0ZXI6ICgodW5pcXVlMSBJ UyBOT1QgTlVMTCkgQU5EICh1bmlxdWUyIElTIE5PVCBOVUxMKSkKICgyIHJvd3MpCiAKKy0t IFRlc3QgdGhhdCBicm9rZW4gRUNzIGFyZSBwcm9jZXNzZWQgY29ycmVjdGx5IGR1cmluZyBz ZWxmIGpvaW4gcmVtb3ZhbC4KKy0tIERpc2FibGUgbWVyZ2Ugam9pbnMgc28gdGhhdCB3ZSBk b24ndCBnZXQgYW4gZXJyb3IgYWJvdXQgbWlzc2luZyBjb21tdXRhdG9yLgorLS0gVGVzdCBi b3RoIG9yaWVudGF0aW9ucyBvZiB0aGUgam9pbiBjbGF1c2UsIGJlY2F1c2Ugb25seSBvbmUg b2YgdGhlbSBicmVha3MKKy0tIHRoZSBFQy4KK3NldCBlbmFibGVfbWVyZ2Vqb2luIHRvIG9m ZjsKK2V4cGxhaW4gKGNvc3RzIG9mZikKKyAgc2VsZWN0ICogZnJvbSBlYzAgbSBqb2luIGVj MCBuIG9uIG0uZmYgPSBuLmZmCisgIGpvaW4gZWMxIHAgb24gbS5mZiArIG4uZmYgPSBwLmYx OworICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2lu IEZpbHRlcjogKChuLmZmICsgbi5mZikgPSBwLmYxKQorICAgLT4gIFNlcSBTY2FuIG9uIGVj MSBwCisgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBlYzAg bgorICAgICAgICAgICAgICAgRmlsdGVyOiAoZmYgSVMgTk9UIE5VTEwpCisoNiByb3dzKQor CitleHBsYWluIChjb3N0cyBvZmYpCisgIHNlbGVjdCAqIGZyb20gZWMwIG0gam9pbiBlYzAg biBvbiBtLmZmID0gbi5mZgorICBqb2luIGVjMSBwIG9uIHAuZjE6OmludDggPSAobS5mZiAr IG4uZmYpOjppbnQ4YWxpYXMxOworICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQ TEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9v cAorICAgSm9pbiBGaWx0ZXI6ICgocC5mMSk6OmJpZ2ludCA9ICgobi5mZiArIG4uZmYpKTo6 aW50OGFsaWFzMSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBlYzEgcAorICAgLT4gIE1hdGVyaWFs aXplCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gZWMwIG4KKyAgICAgICAgICAgICAgIEZp bHRlcjogKGZmIElTIE5PVCBOVUxMKQorKDYgcm93cykKKworcmVzZXQgZW5hYmxlX21lcmdl am9pbjsKIC0tIHRoaXMgY291bGQgYmUgY29udmVydGVkLCBidXQgaXNuJ3QgYXQgcHJlc2Vu dAogZXhwbGFpbiAoY29zdHMgb2ZmKQogICBzZWxlY3QgKiBmcm9tIHRlbmsxIHdoZXJlIHVu aXF1ZTEgPSB1bmlxdWUxIG9yIHVuaXF1ZTIgPSB1bmlxdWUyOwpkaWZmIC0tZ2l0IGEvc3Jj L3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhw ZWN0ZWQvam9pbi5vdXQKaW5kZXggMTljYWViYWJkMC4uNGU5ZmQyMzY3YyAxMDA2NDQKLS0t IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dAorKysgYi9zcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0CkBAIC00OTIyLDYgKzQ5MjIsNDMyIEBAIHNlbGVj dCAqIGZyb20KIC0tLS0rLS0tLSstLS0tKy0tLS0KICgwIHJvd3MpCiAKKy0tCistLSB0ZXN0 IHRoYXQgc2VtaS0gb3IgaW5uZXIgc2VsZi1qb2lucyBvbiBhIHVuaXF1ZSBjb2x1bW4gYXJl IHJlbW92ZWQKKy0tCistLSBlbmFibGUgb25seSBuZXN0bG9vcCB0byBnZXQgbW9yZSBwcmVk aWN0YWJsZSBwbGFucworc2V0IGVuYWJsZV9oYXNoam9pbiB0byBvZmY7CitzZXQgZW5hYmxl X21lcmdlam9pbiB0byBvZmY7CitjcmVhdGUgdGFibGUgc2ogKGEgaW50IHVuaXF1ZSwgYiBp bnQsIGMgaW50IHVuaXF1ZSk7CitpbnNlcnQgaW50byBzaiB2YWx1ZXMgKDEsIG51bGwsIDIp LCAobnVsbCwgMiwgbnVsbCksICgyLCAxLCAxKTsKK2FuYWx5emUgc2o7CistLSBUcml2aWFs IHNlbGYtam9pbiBjYXNlLgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0IHAuKiBmcm9t IHNqIHAsIHNqIHEgd2hlcmUgcS5hID0gcC5hIGFuZCBxLmIgPSBxLmEgLSAxOworICAgICAg ICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gc2og cQorICAgRmlsdGVyOiAoKGEgSVMgTk9UIE5VTEwpIEFORCAoYiA9IChhIC0gMSkpKQorKDIg cm93cykKKworc2VsZWN0IHAuKiBmcm9tIHNqIHAsIHNqIHEgd2hlcmUgcS5hID0gcC5hIGFu ZCBxLmIgPSBxLmEgLSAxOworIGEgfCBiIHwgYyAKKy0tLSstLS0rLS0tCisgMiB8IDEgfCAx CisoMSByb3cpCisKKy0tIFNlbGYtam9pbiByZW1vdmFsIHBlcmZvcm1zIGFmdGVyIGEgc3Vi cXVlcnkgcHVsbC11cCBwcm9jZXNzIGFuZCBjb3VsZCByZW1vdmUKKy0tIHN1Y2gga2luZCBv ZiBzZWxmLWpvaW4gdG9vLiBDaGVjayB0aGlzIG9wdGlvbi4KK2V4cGxhaW4gKGNvc3RzIG9m ZikKK3NlbGVjdCAqIGZyb20gc2ogcAord2hlcmUgZXhpc3RzIChzZWxlY3QgKiBmcm9tIHNq IHEKKwkJCQl3aGVyZSBxLmEgPSBwLmEgYW5kIHEuYiA8IDEwKTsKKyAgICAgICAgICAgICAg ICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gc2ogcQorICAgRmlsdGVyOiAoKGEg SVMgTk9UIE5VTEwpIEFORCAoYiA8IDEwKSkKKygyIHJvd3MpCisKK3NlbGVjdCAqIGZyb20g c2ogcCB3aGVyZSBleGlzdHMgKHNlbGVjdCAqIGZyb20gc2ogcSB3aGVyZSBxLmEgPSBwLmEg YW5kIHEuYiA8IDEwKTsKKyBhIHwgYiB8IGMgCistLS0rLS0tKy0tLQorIDIgfCAxIHwgMQor KDEgcm93KQorCistLSBEb24ndCByZW1vdmUgc2VsZi1qb2luIGZvciB0aGUgY2FzZSBvZiBl cXVhbGl0eSBvZiB0d28gZGlmZmVyZW50IHVuaXF1ZSBjb2x1bW5zLgorZXhwbGFpbiAoY29z dHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB0MSwgc2ogdDIgd2hlcmUgdDEuYSA9IHQyLmMg YW5kIHQxLmIgaXMgbm90IG51bGw7CisgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5l c3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKHQxLmEgPSB0Mi5jKQorICAgLT4gIFNlcSBT Y2FuIG9uIHNqIHQyCisgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgIC0+ICBTZXEgU2Nh biBvbiBzaiB0MQorICAgICAgICAgICAgICAgRmlsdGVyOiAoYiBJUyBOT1QgTlVMTCkKKyg2 IHJvd3MpCisKKy0tIERlZ2VuZXJhdGVkIGNhc2UuCitleHBsYWluIChjb3N0cyBvZmYpCitz ZWxlY3QgKiBmcm9tCisJKHNlbGVjdCBhIGFzIHggZnJvbSBzaiB3aGVyZSBmYWxzZSkgYXMg cTEsCisJKHNlbGVjdCBhIGFzIHkgZnJvbSBzaiB3aGVyZSBmYWxzZSkgYXMgcTIKK3doZXJl IHExLnggPSBxMi55OworICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSZXN1bHQKKyAgIE9uZS1UaW1lIEZp bHRlcjogZmFsc2UKKyAgIC0+ICBTZXEgU2NhbiBvbiBzagorICAgICAgICAgRmlsdGVyOiAo YSBJUyBOT1QgTlVMTCkKKyg0IHJvd3MpCisKKy0tIFdlIGNhbid0IHVzZSBhIGNyb3NzLUVD IGdlbmVyYXRlZCBzZWxmIGpvaW4gcXVhbCBiZWNhdXNlIG9mIGN1cnJlbnQgbG9naWMgb2YK Ky0tIHRoZSBnZW5lcmF0ZV9qb2luX2ltcGxpZWRfZXF1YWxpdGllcyByb3V0aW5lLgorZXhw bGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB0MSwgc2ogdDIgd2hlcmUgdDEu YSA9IHQxLmIgYW5kIHQxLmIgPSB0Mi5iIGFuZCB0Mi5iID0gdDIuYTsKKyAgICAgICAgICBR VUVSWSBQTEFOICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg TmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAodDEuYSA9IHQyLmIpCisgICAtPiAgU2Vx IFNjYW4gb24gc2ogdDEKKyAgICAgICAgIEZpbHRlcjogKGEgPSBiKQorICAgLT4gIFNlcSBT Y2FuIG9uIHNqIHQyCisgICAgICAgICBGaWx0ZXI6IChiID0gYSkKKyg2IHJvd3MpCisKK2V4 cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogdDEsIHNqIHQyLCBzaiB0Mwor d2hlcmUgdDEuYSA9IHQxLmIgYW5kIHQxLmIgPSB0Mi5iIGFuZCB0Mi5iID0gdDIuYQorCWFu ZCB0MS5iID0gdDMuYiBhbmQgdDMuYiA9IHQzLmE7CisgICAgICAgICAgICAgUVVFUlkgUExB TiAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKHQxLmEgPSB0My5iKQorICAgLT4gIE5l c3RlZCBMb29wCisgICAgICAgICBKb2luIEZpbHRlcjogKHQxLmEgPSB0Mi5iKQorICAgICAg ICAgLT4gIFNlcSBTY2FuIG9uIHNqIHQxCisgICAgICAgICAgICAgICBGaWx0ZXI6IChhID0g YikKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBzaiB0MgorICAgICAgICAgICAgICAgRmls dGVyOiAoYiA9IGEpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogdDMKKyAgICAgICAgIEZpbHRl cjogKGIgPSBhKQorKDEwIHJvd3MpCisKKy0tIERvdWJsZSBzZWxmLWpvaW4gcmVtb3ZhbC4K Ky0tIFVzZSBhIGNvbmRpdGlvbiBvbiAiYiArIDEiLCBub3Qgb24gImIiLCBmb3IgdGhlIHNl Y29uZCBqb2luLCBzbyB0aGF0CistLSB0aGUgZXF1aXZhbGVuY2UgY2xhc3MgaXMgZGlmZmVy ZW50IGZyb20gdGhlIGZpcnN0IG9uZSwgYW5kIHdlIGNhbgorLS0gdGVzdCB0aGUgbm9uLWVj IGNvZGUgcGF0aC4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogdDEg am9pbiBzaiB0MiBvbiB0MS5hID0gdDIuYSBhbmQgdDEuYiA9IHQyLmIKKwlqb2luIHNqIHQz IG9uIHQyLmEgPSB0My5hIGFuZCB0Mi5iICsgMSA9IHQzLmIgKyAxOworICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBzaiB0Mwor ICAgRmlsdGVyOiAoKGEgSVMgTk9UIE5VTEwpIEFORCAoYiBJUyBOT1QgTlVMTCkgQU5EICgo YiArIDEpIElTIE5PVCBOVUxMKSkKKygyIHJvd3MpCisKKy0tIHN1YnNlbGVjdCB0aGF0IHJl ZmVyZW5jZXMgdGhlIHJlbW92ZWQgcmVsYXRpb24KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3Nl bGVjdCB0MS5hLCAoc2VsZWN0IGEgZnJvbSBzaiB3aGVyZSBhID0gdDIuYSBhbmQgYSA9IHQx LmEpCitmcm9tIHNqIHQxLCBzaiB0Mgord2hlcmUgdDEuYSA9IHQyLmE7CisgICAgICAgICAg ICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHNqIHQyCisgICBGaWx0ZXI6 IChhIElTIE5PVCBOVUxMKQorICAgU3ViUGxhbiAxCisgICAgIC0+ICBSZXN1bHQKKyAgICAg ICAgICAgT25lLVRpbWUgRmlsdGVyOiAodDIuYSA9IHQyLmEpCisgICAgICAgICAgIC0+ICBT ZXEgU2NhbiBvbiBzagorICAgICAgICAgICAgICAgICBGaWx0ZXI6IChhID0gdDIuYSkKKyg3 IHJvd3MpCisKKy0tIHNlbGYtam9pbiB1bmRlciBvdXRlciBqb2luCitleHBsYWluIChjb3N0 cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHggam9pbiBzaiB5IG9uIHguYSA9IHkuYQorbGVm dCBqb2luIGludDhfdGJsIHogb24geC5hID0gei5xMTsKKyAgICAgICAgICAgICBRVUVSWSBQ TEFOICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgTmVzdGVkIExvb3AgTGVmdCBKb2luCisgICBKb2luIEZpbHRlcjogKHkuYSA9IHoucTEp CisgICAtPiAgU2VxIFNjYW4gb24gc2ogeQorICAgICAgICAgRmlsdGVyOiAoYSBJUyBOT1Qg TlVMTCkKKyAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGlu dDhfdGJsIHoKKyg2IHJvd3MpCisKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZy b20gc2ogeCBqb2luIHNqIHkgb24geC5hID0geS5hCitsZWZ0IGpvaW4gaW50OF90YmwgeiBv biB5LmEgPSB6LnExOworICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBMZWZ0 IEpvaW4KKyAgIEpvaW4gRmlsdGVyOiAoeS5hID0gei5xMSkKKyAgIC0+ICBTZXEgU2NhbiBv biBzaiB5CisgICAgICAgICBGaWx0ZXI6IChhIElTIE5PVCBOVUxMKQorICAgLT4gIE1hdGVy aWFsaXplCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gaW50OF90YmwgegorKDYgcm93cykK KworLS0gVGVzdCB0aGF0IHBsYWNlaG9sZGVycyBhcmUgdXBkYXRlZCBjb3JyZWN0bHkgYWZ0 ZXIgam9pbiByZW1vdmFsCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tICh2 YWx1ZXMgKDEpKSB4CitsZWZ0IGpvaW4gKHNlbGVjdCBjb2FsZXNjZSh5LnExLCAxKSBmcm9t IGludDhfdGJsIHkKKwlyaWdodCBqb2luIHNqIGoxIGlubmVyIGpvaW4gc2ogajIgb24gajEu YSA9IGoyLmEKKwlvbiB0cnVlKSB6CitvbiB0cnVlOworICAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgIC0+ICBSZXN1bHQKKyAg IC0+ICBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBz aiBqMgorICAgICAgICAgICAgICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKyAgICAgICAg IC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGludDhf dGJsIHkKKyg3IHJvd3MpCisKKy0tIFRlc3QgdGhhdCBPUiBwcmVkaWNhdGVkIGFyZSB1cGRh dGVkIGNvcnJlY3RseSBhZnRlciBqb2luIHJlbW92YWwKK0NSRUFURSBUQUJMRSB0YWJfd2l0 aF9mbGFnICggaWQgSU5UIFBSSU1BUlkgS0VZLCBpc19mbGFnIFNNQUxMSU5UKTsKK0NSRUFU RSBJTkRFWCBpZHhfdGVzdF9pc19mbGFnIE9OIHRhYl93aXRoX2ZsYWcgKGlzX2ZsYWcpOwor ZXhwbGFpbiAoY29zdHMgb2ZmKQorU0VMRUNUIENPVU5UKCopIEZST00gdGFiX3dpdGhfZmxh ZyBXSEVSRSAoaXNfZmxhZyBJUyBOVUxMIE9SIGlzX2ZsYWcgPSAwKSBBTkQgaWQgSU4gKFNF TEVDVCBpZCBGUk9NIHRhYl93aXRoX2ZsYWcgV0hFUkUgaWQgSU4gKDIsIDMpKTsKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBBZ2dyZWdhdGUKKyAgIC0+ICBCaXRtYXAgSGVhcCBTY2FuIG9uIHRhYl93aXRoX2ZsYWcK KyAgICAgICAgIFJlY2hlY2sgQ29uZDogKChpZCA9IEFOWSAoJ3syLDN9Jzo6aW50ZWdlcltd KSkgQU5EIChpZCBJUyBOT1QgTlVMTCkpCisgICAgICAgICBGaWx0ZXI6ICgoaXNfZmxhZyBJ UyBOVUxMKSBPUiAoaXNfZmxhZyA9IDApKQorICAgICAgICAgLT4gIEJpdG1hcCBJbmRleCBT Y2FuIG9uIHRhYl93aXRoX2ZsYWdfcGtleQorICAgICAgICAgICAgICAgSW5kZXggQ29uZDog KChpZCA9IEFOWSAoJ3syLDN9Jzo6aW50ZWdlcltdKSkgQU5EIChpZCBJUyBOT1QgTlVMTCkp CisoNiByb3dzKQorCitEUk9QIFRBQkxFIHRhYl93aXRoX2ZsYWc7CistLSBIQVZJTkcgY2xh dXNlCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgcC5iIGZyb20gc2ogcCBqb2luIHNq IHEgb24gcC5hID0gcS5hIGdyb3VwIGJ5IHAuYiBoYXZpbmcgc3VtKHAuYSkgPSAxOworICAg ICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBIYXNoQWdncmVnYXRlCisgICBHcm91cCBLZXk6IHEuYgorICAgRmls dGVyOiAoc3VtKHEuYSkgPSAxKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIHEKKyAgICAgICAg IEZpbHRlcjogKGEgSVMgTk9UIE5VTEwpCisoNSByb3dzKQorCistLSB1cGRhdGUgbGF0ZXJh bCByZWZlcmVuY2VzIGFuZCByYW5nZSB0YWJsZSBlbnRyeSByZWZlcmVuY2UKK2V4cGxhaW4g KHZlcmJvc2UsIGNvc3RzIG9mZikKK3NlbGVjdCAxIGZyb20gKHNlbGVjdCB4LiogZnJvbSBz aiB4LCBzaiB5IHdoZXJlIHguYSA9IHkuYSkgcSwKKyAgbGF0ZXJhbCBnZW5lcmF0ZV9zZXJp ZXMoMSwgcS5hKSBncyhpKTsKKyAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAg ICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIE91dHB1dDogMQorICAg LT4gIFNlcSBTY2FuIG9uIHB1YmxpYy5zaiB5CisgICAgICAgICBPdXRwdXQ6IHkuYSwgeS5i LCB5LmMKKyAgICAgICAgIEZpbHRlcjogKHkuYSBJUyBOT1QgTlVMTCkKKyAgIC0+ICBGdW5j dGlvbiBTY2FuIG9uIHBnX2NhdGFsb2cuZ2VuZXJhdGVfc2VyaWVzIGdzCisgICAgICAgICBP dXRwdXQ6IGdzLmkKKyAgICAgICAgIEZ1bmN0aW9uIENhbGw6IGdlbmVyYXRlX3Nlcmllcygx LCB5LmEpCisoOCByb3dzKQorCitleHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYpCitzZWxl Y3QgMSBmcm9tIChzZWxlY3QgeS4qIGZyb20gc2ogeCwgc2ogeSB3aGVyZSB4LmEgPSB5LmEp IHEsCisgIGxhdGVyYWwgZ2VuZXJhdGVfc2VyaWVzKDEsIHEuYSkgZ3MoaSk7CisgICAgICAg ICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5l c3RlZCBMb29wCisgICBPdXRwdXQ6IDEKKyAgIC0+ICBTZXEgU2NhbiBvbiBwdWJsaWMuc2og eQorICAgICAgICAgT3V0cHV0OiB5LmEsIHkuYiwgeS5jCisgICAgICAgICBGaWx0ZXI6ICh5 LmEgSVMgTk9UIE5VTEwpCisgICAtPiAgRnVuY3Rpb24gU2NhbiBvbiBwZ19jYXRhbG9nLmdl bmVyYXRlX3NlcmllcyBncworICAgICAgICAgT3V0cHV0OiBncy5pCisgICAgICAgICBGdW5j dGlvbiBDYWxsOiBnZW5lcmF0ZV9zZXJpZXMoMSwgeS5hKQorKDggcm93cykKKworLS0gVGVz dCB0aGF0IGEgbm9uLUVDLWRlcml2ZWQgam9pbiBjbGF1c2UgaXMgcHJvY2Vzc2VkIGNvcnJl Y3RseS4gVXNlIGFuCistLSBvdXRlciBqb2luIHNvIHRoYXQgd2UgY2FuJ3QgZm9ybSBhbiBF Qy4KK2V4cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0ICogZnJvbSBzaiBwIGpvaW4gc2ogcSBv biBwLmEgPSBxLmEKKyAgbGVmdCBqb2luIHNqIHIgb24gcC5hICsgcS5hID0gci5hOworICAg ICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgIEpvaW4gRmls dGVyOiAoKHEuYSArIHEuYSkgPSByLmEpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogcQorICAg ICAgICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKyAgIC0+ICBNYXRlcmlhbGl6ZQorICAg ICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqIHIKKyg2IHJvd3MpCisKKy0tIEZJWE1FIHRoaXMg Y29uc3RhbnQgZmFsc2UgZmlsdGVyIGRvZXNuJ3QgbG9vayBnb29kLiBTaG91bGQgd2UgbWVy Z2UKKy0tIGVxdWl2YWxlbmNlIGNsYXNzZXM/CitleHBsYWluIChjb3N0cyBvZmYpCitzZWxl Y3QgKiBmcm9tIHNqIHAsIHNqIHEgd2hlcmUgcC5hID0gcS5hIGFuZCBwLmIgPSAxIGFuZCBx LmIgPSAyOworICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgU2VxIFNjYW4gb24gc2ogcQorICAgRmlsdGVyOiAoKGEgSVMgTk9UIE5V TEwpIEFORCAoYiA9IDIpIEFORCAoYiA9IDEpKQorKDIgcm93cykKKworLS0gQ2hlY2sgdGhh dCBhdHRyX25lZWRlZCBpcyB1cGRhdGVkIGNvcnJlY3RseSBhZnRlciBzZWxmLWpvaW4gcmVt b3ZhbC4gSW4gdGhpcworLS0gdGVzdCwgdGhlIGpvaW4gb2YgajEgd2l0aCBqMiBpcyByZW1v dmVkLiBrMS5iIGlzIHJlcXVpcmVkIGF0IGVpdGhlciBqMSBvciBqMi4KKy0tIElmIHRoaXMg aW5mbyBpcyBsb3N0LCBqb2luIHRhcmdldGxpc3QgZm9yIChrMSwgazIpIHdpbGwgbm90IGNv bnRhaW4gazEuYi4KKy0tIFVzZSBpbmRleCBzY2FuIGZvciBrMSBzbyB0aGF0IHdlIGRvbid0 IGdldCAnYicgZnJvbSBwaHlzaWNhbCB0bGlzdCB1c2VkIGZvcgorLS0gc2Vxc2Nhbi4gQWxz byBkaXNhYmxlIHJlb3JkZXJpbmcgb2Ygam9pbnMgYmVjYXVzZSB0aGlzIHRlc3QgZGVwZW5k cyBvbiBhCistLSBwYXJ0aWN1bGFyIGpvaW4gdHJlZS4KK2NyZWF0ZSB0YWJsZSBzayAoYSBp bnQsIGIgaW50KTsKK2NyZWF0ZSBpbmRleCBvbiBzayhhKTsKK3NldCBqb2luX2NvbGxhcHNl X2xpbWl0IHRvIDE7CitzZXQgZW5hYmxlX3NlcXNjYW4gdG8gb2ZmOworZXhwbGFpbiAoY29z dHMgb2ZmKSBzZWxlY3QgMSBmcm9tCisJKHNrIGsxIGpvaW4gc2sgazIgb24gazEuYSA9IGsy LmEpCisJam9pbiAoc2ogajEgam9pbiBzaiBqMiBvbiBqMS5hID0gajIuYSkgb24gajEuYiA9 IGsxLmI7CisgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6IChrMS5iID0gajIuYikK KyAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgc2tf YV9pZHggb24gc2sgazEKKyAgICAgICAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgc2tf YV9pZHggb24gc2sgazIKKyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChhID0gazEuYSkK KyAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgc2pf YV9rZXkgb24gc2ogajIKKyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChhIElTIE5PVCBO VUxMKQorKDkgcm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3QgMSBmcm9tCisJ KHNrIGsxIGpvaW4gc2sgazIgb24gazEuYSA9IGsyLmEpCisJam9pbiAoc2ogajEgam9pbiBz aiBqMiBvbiBqMS5hID0gajIuYSkgb24gajIuYiA9IGsxLmI7CisgICAgICAgICAgICAgICAg ICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAor ICAgSm9pbiBGaWx0ZXI6IChrMS5iID0gajIuYikKKyAgIC0+ICBOZXN0ZWQgTG9vcAorICAg ICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgc2tfYV9pZHggb24gc2sgazEKKyAgICAgICAg IC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgc2tfYV9pZHggb24gc2sgazIKKyAgICAgICAg ICAgICAgIEluZGV4IENvbmQ6IChhID0gazEuYSkKKyAgIC0+ICBNYXRlcmlhbGl6ZQorICAg ICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgc2pfYV9rZXkgb24gc2ogajIKKyAgICAgICAg ICAgICAgIEluZGV4IENvbmQ6IChhIElTIE5PVCBOVUxMKQorKDkgcm93cykKKworcmVzZXQg am9pbl9jb2xsYXBzZV9saW1pdDsKK3Jlc2V0IGVuYWJsZV9zZXFzY2FuOworLS0gQ2hlY2sg dGhhdCBjbGF1c2VzIGZyb20gdGhlIGpvaW4gZmlsdGVyIGxpc3QgaXMgbm90IGxvc3Qgb24g dGhlIHNlbGYtam9pbiByZW1vdmFsCitDUkVBVEUgVEFCTEUgZW1wMSAoIGlkIFNFUklBTCBQ UklNQVJZIEtFWSBOT1QgTlVMTCwgY29kZSBpbnQpOworZXhwbGFpbiAodmVyYm9zZSwgY29z dHMgb2ZmKQorU0VMRUNUICogRlJPTSBlbXAxIGUxLCBlbXAxIGUyIFdIRVJFIGUxLmlkID0g ZTIuaWQgQU5EIGUyLmNvZGUgPD4gZTEuY29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAg IFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBv biBwdWJsaWMuZW1wMSBlMgorICAgT3V0cHV0OiBlMi5pZCwgZTIuY29kZSwgZTIuaWQsIGUy LmNvZGUKKyAgIEZpbHRlcjogKChlMi5pZCBJUyBOT1QgTlVMTCkgQU5EIChlMi5jb2RlIDw+ IGUyLmNvZGUpKQorKDMgcm93cykKKworLS0gV2UgY2FuIHJlbW92ZSB0aGUgam9pbiBldmVu IGlmIHdlIGZpbmQgdGhlIGpvaW4gY2FuJ3QgZHVwbGljYXRlIHJvd3MgYW5kCistLSB0aGUg YmFzZSBxdWFscyBvZiBlYWNoIHNpZGUgYXJlIGRpZmZlcmVudC4gIEluIHRoZSBmb2xsb3dp bmcgY2FzZSB3ZSBlbmQgdXAKKy0tIG1vdmluZyBxdWFscyBvdmVyIHRvIHMxIHRvIG1ha2Ug aXQgc28gaXQgY2FuJ3QgbWF0Y2ggYW55IHJvd3MuCitjcmVhdGUgdGFibGUgc2woYSBpbnQs IGIgaW50KTsKK2NyZWF0ZSB1bmlxdWUgaW5kZXggb24gc2woYSwgYik7Cit2YWN1dW0gYW5h bHl6ZSBzbDsKKy0tIEJvdGggc2lkZXMgYXJlIHVuaXF1ZSwgYnV0IGJhc2UgcXVhbHMgYXJl IGRpZmZlcmVudAorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzbCB0MSwg c2wgdDIgd2hlcmUgdDEuYSA9IHQyLmEgYW5kIHQxLmIgPSAxIGFuZCB0Mi5iID0gMjsKKyAg ICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IFNlcSBTY2FuIG9uIHNsIHQyCisgICBGaWx0ZXI6ICgoYSBJUyBOT1QgTlVMTCkgQU5EIChi ID0gMikgQU5EIChiID0gMSkpCisoMiByb3dzKQorCistLSBKb2luIHF1YWwgaXNuJ3QgbWVy Z2Vqb2luYWJsZSwgYnV0IGlubmVyIGlzIHVuaXF1ZS4KK2V4cGxhaW4gKENPU1RTIE9GRikK K1NFTEVDVCBuMi5hIEZST00gc2ogbjEsIHNqIG4yIFdIRVJFIG4xLmEgPD4gbjIuYSBBTkQg bjIuYSA9IDE7CisgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgCistLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAo bjEuYSA8PiBuMi5hKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIG4yCisgICAgICAgICBGaWx0 ZXI6IChhID0gMSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBuMQorKDUgcm93cykKKworZXhw bGFpbiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTQorCShTRUxFQ1QgbjIuYSBGUk9NIHNq IG4xLCBzaiBuMiBXSEVSRSBuMS5hIDw+IG4yLmEpIHEwLCBzbAorV0hFUkUgcTAuYSA9IDE7 CisgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAobjEuYSA8PiBu Mi5hKQorICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2wK KyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBzaiBuMgorICAgICAgICAgICAgICAgRmlsdGVy OiAoYSA9IDEpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogbjEKKyg3IHJvd3MpCisKKy0tCist LS0tIE9ubHkgb25lIHNpZGUgaXMgdW5xaXVlCistLXNlbGVjdCAqIGZyb20gc2wgdDEsIHNs IHQyIHdoZXJlIHQxLmEgPSB0Mi5hIGFuZCB0MS5iID0gMTsKKy0tc2VsZWN0ICogZnJvbSBz bCB0MSwgc2wgdDIgd2hlcmUgdDEuYSA9IHQyLmEgYW5kIHQyLmIgPSAxOworLS0KKy0tLS0g U2V2ZXJhbCB1bmlxdWVzIGluZGV4ZXMgbWF0Y2gsIGFuZCB3ZSBzZWxlY3QgYSBkaWZmZXJl bnQgb25lCistLS0tIGZvciBlYWNoIHNpZGUsIHNvIHRoZSBqb2luIGlzIG5vdCByZW1vdmVk CistLWNyZWF0ZSB0YWJsZSBzbShhIGludCB1bmlxdWUsIGIgaW50IHVuaXF1ZSwgYyBpbnQg dW5pcXVlKTsKKy0tZXhwbGFpbiAoY29zdHMgb2ZmKQorLS1zZWxlY3QgKiBmcm9tIHNtIG0s IHNtIG4gd2hlcmUgbS5hID0gbi5iIGFuZCBtLmMgPSBuLmM7CistLWV4cGxhaW4gKGNvc3Rz IG9mZikKKy0tc2VsZWN0ICogZnJvbSBzbSBtLCBzbSBuIHdoZXJlIG0uYSA9IG4uYyBhbmQg bS5iID0gbi5iOworLS1leHBsYWluIChjb3N0cyBvZmYpCistLXNlbGVjdCAqIGZyb20gc20g bSwgc20gbiB3aGVyZSBtLmMgPSBuLmIgYW5kIG0uYSA9IG4uYTsKKy0tIENoZWNrIG9wdGlt aXphdGlvbiBkaXNhYmxpbmcgaWYgaXQgd2lsbCB2aW9sYXRlIHNwZWNpYWwgam9pbiBjb25k aXRpb25zLgorLS0gVHdvIGlkZW50aWNhbCBqb2luZWQgcmVsYXRpb25zIHNhdGlzZmllcyBz ZWxmIGpvaW4gcmVtb3ZhbCBjb25kaXRpb25zIGJ1dAorLS0gc3RheSBpbiBkaWZmZXJlbnQg c3BlY2lhbCBqb2luIGluZm9zLgorQ1JFQVRFIFRBQkxFIHNqX3QxIChpZCBzZXJpYWwsIGEg aW50KTsKK0NSRUFURSBUQUJMRSBzal90MiAoaWQgc2VyaWFsLCBhIGludCk7CitDUkVBVEUg VEFCTEUgc2pfdDMgKGlkIHNlcmlhbCwgYSBpbnQpOworQ1JFQVRFIFRBQkxFIHNqX3Q0IChp ZCBzZXJpYWwsIGEgaW50KTsKK0NSRUFURSBVTklRVUUgSU5ERVggT04gc2pfdDMgVVNJTkcg YnRyZWUgKGEsaWQpOworQ1JFQVRFIFVOSVFVRSBJTkRFWCBPTiBzal90MiBVU0lORyBidHJl ZSAoaWQpOworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTSBzal90MQorSk9J TiAoCisJU0VMRUNUIHNqX3QyLmlkIEFTIGlkIEZST00gc2pfdDIKKwlXSEVSRSBFWElTVFMK KwkJKAorCQlTRUxFQ1QgVFJVRSBGUk9NIHNqX3QzLHNqX3Q0IFdIRVJFIHNqX3QzLmEgPSAx IEFORCBzal90My5pZCA9IHNqX3QyLmlkCisJCSkKKwkpIHQydDN0NAorT04gc2pfdDEuaWQg PSB0MnQzdDQuaWQKK0pPSU4gKAorCVNFTEVDVCBzal90Mi5pZCBBUyBpZCBGUk9NIHNqX3Qy CisJV0hFUkUgRVhJU1RTCisJCSgKKwkJU0VMRUNUIFRSVUUgRlJPTSBzal90Myxzal90NCBX SEVSRSBzal90My5hID0gMSBBTkQgc2pfdDMuaWQgPSBzal90Mi5pZAorCQkpCisJKSBfdDJ0 M3Q0CitPTiBzal90MS5pZCA9IF90MnQzdDQuaWQ7CisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExv b3AKKyAgIEpvaW4gRmlsdGVyOiAoc2pfdDMuaWQgPSBzal90MS5pZCkKKyAgIC0+ICBOZXN0 ZWQgTG9vcAorICAgICAgICAgSm9pbiBGaWx0ZXI6IChzal90My5pZCA9IHNqX3QyLmlkKQor ICAgICAgICAgLT4gIE5lc3RlZCBMb29wIFNlbWkgSm9pbgorICAgICAgICAgICAgICAgLT4g IE5lc3RlZCBMb29wCisgICAgICAgICAgICAgICAgICAgICAtPiAgSGFzaEFnZ3JlZ2F0ZQor ICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAgS2V5OiBzal90My5pZAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2pfdDQKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgLT4gIEJpdG1hcCBIZWFwIFNjYW4gb24gc2pfdDMKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY2hlY2sgQ29u ZDogKGEgPSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgLT4gIEJpdG1hcCBJbmRleCBTY2FuIG9uIHNqX3QzX2FfaWRfaWR4CisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAo YSA9IDEpCisgICAgICAgICAgICAgICAgICAgICAtPiAgSW5kZXggT25seSBTY2FuIHVzaW5n IHNqX3QyX2lkX2lkeCBvbiBzal90MiBzal90Ml8xCisgICAgICAgICAgICAgICAgICAgICAg ICAgICBJbmRleCBDb25kOiAoaWQgPSBzal90My5pZCkKKyAgICAgICAgICAgICAgIC0+ICBO ZXN0ZWQgTG9vcAorICAgICAgICAgICAgICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1 c2luZyBzal90M19hX2lkX2lkeCBvbiBzal90MyBzal90M18xCisgICAgICAgICAgICAgICAg ICAgICAgICAgICBJbmRleCBDb25kOiAoKGEgPSAxKSBBTkQgKGlkID0gc2pfdDMuaWQpKQor ICAgICAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqX3Q0IHNqX3Q0XzEKKyAg ICAgICAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgc2pfdDJfaWRfaWR4IG9uIHNqX3Qy CisgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoaWQgPSBzal90Ml8xLmlkKQorICAgLT4g IFNlcSBTY2FuIG9uIHNqX3QxCisoMjQgcm93cykKKworcmVzZXQgZW5hYmxlX2hhc2hqb2lu OworcmVzZXQgZW5hYmxlX21lcmdlam9pbjsKIC0tCiAtLSBUZXN0IGhpbnRzIGdpdmVuIG9u IGluY29ycmVjdCBjb2x1bW4gcmVmZXJlbmNlcyBhcmUgdXNlZnVsCiAtLQpkaWZmIC0tZ2l0 IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zeXN2aWV3cy5vdXQgYi9zcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91dAppbmRleCA0NDJlZWIxZTNmLi5mYzViZTYy ODU2IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91 dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91dApAQCAtMTE5 LDEwICsxMTksMTEgQEAgc2VsZWN0IG5hbWUsIHNldHRpbmcgZnJvbSBwZ19zZXR0aW5ncyB3 aGVyZSBuYW1lIGxpa2UgJ2VuYWJsZSUnOwogIGVuYWJsZV9wYXJ0aXRpb25fcHJ1bmluZyAg ICAgICB8IG9uCiAgZW5hYmxlX3BhcnRpdGlvbndpc2VfYWdncmVnYXRlIHwgb2ZmCiAgZW5h YmxlX3BhcnRpdGlvbndpc2Vfam9pbiAgICAgIHwgb2ZmCisgZW5hYmxlX3NlbGZfam9pbl9y ZW1vdmFsICAgICAgIHwgb24KICBlbmFibGVfc2Vxc2NhbiAgICAgICAgICAgICAgICAgfCBv bgogIGVuYWJsZV9zb3J0ICAgICAgICAgICAgICAgICAgICB8IG9uCiAgZW5hYmxlX3RpZHNj YW4gICAgICAgICAgICAgICAgIHwgb24KLSgyMCByb3dzKQorKDIxIHJvd3MpCiAKIC0tIFRl c3QgdGhhdCB0aGUgcGdfdGltZXpvbmVfbmFtZXMgYW5kIHBnX3RpbWV6b25lX2FiYnJldnMg dmlld3MgYXJlCiAtLSBtb3JlLW9yLWxlc3Mgd29ya2luZy4gIFdlIGNhbid0IHRlc3QgdGhl aXIgY29udGVudHMgaW4gYW55IGdyZWF0IGRldGFpbApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qv cmVncmVzcy9zcWwvZXF1aXZjbGFzcy5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9lcXVp dmNsYXNzLnNxbAppbmRleCAyNDdiMGEzMTA1Li43N2RkOTY0ZWJmIDEwMDY0NAotLS0gYS9z cmMvdGVzdC9yZWdyZXNzL3NxbC9lcXVpdmNsYXNzLnNxbAorKysgYi9zcmMvdGVzdC9yZWdy ZXNzL3NxbC9lcXVpdmNsYXNzLnNxbApAQCAtMjU5LDYgKzI1OSwyMiBAQCBkcm9wIHVzZXIg cmVncmVzc191c2VyX2VjdGVzdDsKIGV4cGxhaW4gKGNvc3RzIG9mZikKICAgc2VsZWN0ICog ZnJvbSB0ZW5rMSB3aGVyZSB1bmlxdWUxID0gdW5pcXVlMSBhbmQgdW5pcXVlMiA9IHVuaXF1 ZTI7CiAKKy0tIFRlc3QgdGhhdCBicm9rZW4gRUNzIGFyZSBwcm9jZXNzZWQgY29ycmVjdGx5 IGR1cmluZyBzZWxmIGpvaW4gcmVtb3ZhbC4KKy0tIERpc2FibGUgbWVyZ2Ugam9pbnMgc28g dGhhdCB3ZSBkb24ndCBnZXQgYW4gZXJyb3IgYWJvdXQgbWlzc2luZyBjb21tdXRhdG9yLgor LS0gVGVzdCBib3RoIG9yaWVudGF0aW9ucyBvZiB0aGUgam9pbiBjbGF1c2UsIGJlY2F1c2Ug b25seSBvbmUgb2YgdGhlbSBicmVha3MKKy0tIHRoZSBFQy4KK3NldCBlbmFibGVfbWVyZ2Vq b2luIHRvIG9mZjsKKworZXhwbGFpbiAoY29zdHMgb2ZmKQorICBzZWxlY3QgKiBmcm9tIGVj MCBtIGpvaW4gZWMwIG4gb24gbS5mZiA9IG4uZmYKKyAgam9pbiBlYzEgcCBvbiBtLmZmICsg bi5mZiA9IHAuZjE7CisKK2V4cGxhaW4gKGNvc3RzIG9mZikKKyAgc2VsZWN0ICogZnJvbSBl YzAgbSBqb2luIGVjMCBuIG9uIG0uZmYgPSBuLmZmCisgIGpvaW4gZWMxIHAgb24gcC5mMTo6 aW50OCA9IChtLmZmICsgbi5mZik6OmludDhhbGlhczE7CisKK3Jlc2V0IGVuYWJsZV9tZXJn ZWpvaW47CisKIC0tIHRoaXMgY291bGQgYmUgY29udmVydGVkLCBidXQgaXNuJ3QgYXQgcHJl c2VudAogZXhwbGFpbiAoY29zdHMgb2ZmKQogICBzZWxlY3QgKiBmcm9tIHRlbmsxIHdoZXJl IHVuaXF1ZTEgPSB1bmlxdWUxIG9yIHVuaXF1ZTIgPSB1bmlxdWUyOwpkaWZmIC0tZ2l0IGEv c3JjL3Rlc3QvcmVncmVzcy9zcWwvam9pbi5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9q b2luLnNxbAppbmRleCA2ZGQwMWIwMjJlLi5hN2MwOWQyNTczIDEwMDY0NAotLS0gYS9zcmMv dGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9q b2luLnNxbApAQCAtMTc1Myw2ICsxNzUzLDIwMyBAQCBzZWxlY3QgKiBmcm9tCiBzZWxlY3Qg KiBmcm9tCiAgIGludDhfdGJsIHggam9pbiAoaW50NF90YmwgeCBjcm9zcyBqb2luIGludDRf dGJsIHkoZmYpKSBqIG9uIHExID0gZjE7IC0tIG9rCiAKKy0tCistLSB0ZXN0IHRoYXQgc2Vt aS0gb3IgaW5uZXIgc2VsZi1qb2lucyBvbiBhIHVuaXF1ZSBjb2x1bW4gYXJlIHJlbW92ZWQK Ky0tCisKKy0tIGVuYWJsZSBvbmx5IG5lc3Rsb29wIHRvIGdldCBtb3JlIHByZWRpY3RhYmxl IHBsYW5zCitzZXQgZW5hYmxlX2hhc2hqb2luIHRvIG9mZjsKK3NldCBlbmFibGVfbWVyZ2Vq b2luIHRvIG9mZjsKKworY3JlYXRlIHRhYmxlIHNqIChhIGludCB1bmlxdWUsIGIgaW50LCBj IGludCB1bmlxdWUpOworaW5zZXJ0IGludG8gc2ogdmFsdWVzICgxLCBudWxsLCAyKSwgKG51 bGwsIDIsIG51bGwpLCAoMiwgMSwgMSk7CithbmFseXplIHNqOworCistLSBUcml2aWFsIHNl bGYtam9pbiBjYXNlLgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0IHAuKiBmcm9tIHNq IHAsIHNqIHEgd2hlcmUgcS5hID0gcC5hIGFuZCBxLmIgPSBxLmEgLSAxOworc2VsZWN0IHAu KiBmcm9tIHNqIHAsIHNqIHEgd2hlcmUgcS5hID0gcC5hIGFuZCBxLmIgPSBxLmEgLSAxOwor CistLSBTZWxmLWpvaW4gcmVtb3ZhbCBwZXJmb3JtcyBhZnRlciBhIHN1YnF1ZXJ5IHB1bGwt dXAgcHJvY2VzcyBhbmQgY291bGQgcmVtb3ZlCistLSBzdWNoIGtpbmQgb2Ygc2VsZi1qb2lu IHRvby4gQ2hlY2sgdGhpcyBvcHRpb24uCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3Qg KiBmcm9tIHNqIHAKK3doZXJlIGV4aXN0cyAoc2VsZWN0ICogZnJvbSBzaiBxCisJCQkJd2hl cmUgcS5hID0gcC5hIGFuZCBxLmIgPCAxMCk7CitzZWxlY3QgKiBmcm9tIHNqIHAgd2hlcmUg ZXhpc3RzIChzZWxlY3QgKiBmcm9tIHNqIHEgd2hlcmUgcS5hID0gcC5hIGFuZCBxLmIgPCAx MCk7CisKKy0tIERvbid0IHJlbW92ZSBzZWxmLWpvaW4gZm9yIHRoZSBjYXNlIG9mIGVxdWFs aXR5IG9mIHR3byBkaWZmZXJlbnQgdW5pcXVlIGNvbHVtbnMuCitleHBsYWluIChjb3N0cyBv ZmYpCitzZWxlY3QgKiBmcm9tIHNqIHQxLCBzaiB0MiB3aGVyZSB0MS5hID0gdDIuYyBhbmQg dDEuYiBpcyBub3QgbnVsbDsKKworLS0gRGVnZW5lcmF0ZWQgY2FzZS4KK2V4cGxhaW4gKGNv c3RzIG9mZikKK3NlbGVjdCAqIGZyb20KKwkoc2VsZWN0IGEgYXMgeCBmcm9tIHNqIHdoZXJl IGZhbHNlKSBhcyBxMSwKKwkoc2VsZWN0IGEgYXMgeSBmcm9tIHNqIHdoZXJlIGZhbHNlKSBh cyBxMgord2hlcmUgcTEueCA9IHEyLnk7CisKKy0tIFdlIGNhbid0IHVzZSBhIGNyb3NzLUVD IGdlbmVyYXRlZCBzZWxmIGpvaW4gcXVhbCBiZWNhdXNlIG9mIGN1cnJlbnQgbG9naWMgb2YK Ky0tIHRoZSBnZW5lcmF0ZV9qb2luX2ltcGxpZWRfZXF1YWxpdGllcyByb3V0aW5lLgorZXhw bGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB0MSwgc2ogdDIgd2hlcmUgdDEu YSA9IHQxLmIgYW5kIHQxLmIgPSB0Mi5iIGFuZCB0Mi5iID0gdDIuYTsKK2V4cGxhaW4gKGNv c3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogdDEsIHNqIHQyLCBzaiB0Mword2hlcmUgdDEu YSA9IHQxLmIgYW5kIHQxLmIgPSB0Mi5iIGFuZCB0Mi5iID0gdDIuYQorCWFuZCB0MS5iID0g dDMuYiBhbmQgdDMuYiA9IHQzLmE7CisKKy0tIERvdWJsZSBzZWxmLWpvaW4gcmVtb3ZhbC4K Ky0tIFVzZSBhIGNvbmRpdGlvbiBvbiAiYiArIDEiLCBub3Qgb24gImIiLCBmb3IgdGhlIHNl Y29uZCBqb2luLCBzbyB0aGF0CistLSB0aGUgZXF1aXZhbGVuY2UgY2xhc3MgaXMgZGlmZmVy ZW50IGZyb20gdGhlIGZpcnN0IG9uZSwgYW5kIHdlIGNhbgorLS0gdGVzdCB0aGUgbm9uLWVj IGNvZGUgcGF0aC4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogdDEg am9pbiBzaiB0MiBvbiB0MS5hID0gdDIuYSBhbmQgdDEuYiA9IHQyLmIKKwlqb2luIHNqIHQz IG9uIHQyLmEgPSB0My5hIGFuZCB0Mi5iICsgMSA9IHQzLmIgKyAxOworCistLSBzdWJzZWxl Y3QgdGhhdCByZWZlcmVuY2VzIHRoZSByZW1vdmVkIHJlbGF0aW9uCitleHBsYWluIChjb3N0 cyBvZmYpCitzZWxlY3QgdDEuYSwgKHNlbGVjdCBhIGZyb20gc2ogd2hlcmUgYSA9IHQyLmEg YW5kIGEgPSB0MS5hKQorZnJvbSBzaiB0MSwgc2ogdDIKK3doZXJlIHQxLmEgPSB0Mi5hOwor CistLSBzZWxmLWpvaW4gdW5kZXIgb3V0ZXIgam9pbgorZXhwbGFpbiAoY29zdHMgb2ZmKQor c2VsZWN0ICogZnJvbSBzaiB4IGpvaW4gc2ogeSBvbiB4LmEgPSB5LmEKK2xlZnQgam9pbiBp bnQ4X3RibCB6IG9uIHguYSA9IHoucTE7CisKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVj dCAqIGZyb20gc2ogeCBqb2luIHNqIHkgb24geC5hID0geS5hCitsZWZ0IGpvaW4gaW50OF90 YmwgeiBvbiB5LmEgPSB6LnExOworCistLSBUZXN0IHRoYXQgcGxhY2Vob2xkZXJzIGFyZSB1 cGRhdGVkIGNvcnJlY3RseSBhZnRlciBqb2luIHJlbW92YWwKK2V4cGxhaW4gKGNvc3RzIG9m ZikKK3NlbGVjdCAqIGZyb20gKHZhbHVlcyAoMSkpIHgKK2xlZnQgam9pbiAoc2VsZWN0IGNv YWxlc2NlKHkucTEsIDEpIGZyb20gaW50OF90YmwgeQorCXJpZ2h0IGpvaW4gc2ogajEgaW5u ZXIgam9pbiBzaiBqMiBvbiBqMS5hID0gajIuYQorCW9uIHRydWUpIHoKK29uIHRydWU7CisK Ky0tIFRlc3QgdGhhdCBPUiBwcmVkaWNhdGVkIGFyZSB1cGRhdGVkIGNvcnJlY3RseSBhZnRl ciBqb2luIHJlbW92YWwKK0NSRUFURSBUQUJMRSB0YWJfd2l0aF9mbGFnICggaWQgSU5UIFBS SU1BUlkgS0VZLCBpc19mbGFnIFNNQUxMSU5UKTsKK0NSRUFURSBJTkRFWCBpZHhfdGVzdF9p c19mbGFnIE9OIHRhYl93aXRoX2ZsYWcgKGlzX2ZsYWcpOworZXhwbGFpbiAoY29zdHMgb2Zm KQorU0VMRUNUIENPVU5UKCopIEZST00gdGFiX3dpdGhfZmxhZyBXSEVSRSAoaXNfZmxhZyBJ UyBOVUxMIE9SIGlzX2ZsYWcgPSAwKSBBTkQgaWQgSU4gKFNFTEVDVCBpZCBGUk9NIHRhYl93 aXRoX2ZsYWcgV0hFUkUgaWQgSU4gKDIsIDMpKTsKK0RST1AgVEFCTEUgdGFiX3dpdGhfZmxh ZzsKKworLS0gSEFWSU5HIGNsYXVzZQorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0IHAu YiBmcm9tIHNqIHAgam9pbiBzaiBxIG9uIHAuYSA9IHEuYSBncm91cCBieSBwLmIgaGF2aW5n IHN1bShwLmEpID0gMTsKKworLS0gdXBkYXRlIGxhdGVyYWwgcmVmZXJlbmNlcyBhbmQgcmFu Z2UgdGFibGUgZW50cnkgcmVmZXJlbmNlCitleHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYp CitzZWxlY3QgMSBmcm9tIChzZWxlY3QgeC4qIGZyb20gc2ogeCwgc2ogeSB3aGVyZSB4LmEg PSB5LmEpIHEsCisgIGxhdGVyYWwgZ2VuZXJhdGVfc2VyaWVzKDEsIHEuYSkgZ3MoaSk7CisK K2V4cGxhaW4gKHZlcmJvc2UsIGNvc3RzIG9mZikKK3NlbGVjdCAxIGZyb20gKHNlbGVjdCB5 LiogZnJvbSBzaiB4LCBzaiB5IHdoZXJlIHguYSA9IHkuYSkgcSwKKyAgbGF0ZXJhbCBnZW5l cmF0ZV9zZXJpZXMoMSwgcS5hKSBncyhpKTsKKworLS0gVGVzdCB0aGF0IGEgbm9uLUVDLWRl cml2ZWQgam9pbiBjbGF1c2UgaXMgcHJvY2Vzc2VkIGNvcnJlY3RseS4gVXNlIGFuCistLSBv dXRlciBqb2luIHNvIHRoYXQgd2UgY2FuJ3QgZm9ybSBhbiBFQy4KK2V4cGxhaW4gKGNvc3Rz IG9mZikgc2VsZWN0ICogZnJvbSBzaiBwIGpvaW4gc2ogcSBvbiBwLmEgPSBxLmEKKyAgbGVm dCBqb2luIHNqIHIgb24gcC5hICsgcS5hID0gci5hOworCistLSBGSVhNRSB0aGlzIGNvbnN0 YW50IGZhbHNlIGZpbHRlciBkb2Vzbid0IGxvb2sgZ29vZC4gU2hvdWxkIHdlIG1lcmdlCist LSBlcXVpdmFsZW5jZSBjbGFzc2VzPworZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICog ZnJvbSBzaiBwLCBzaiBxIHdoZXJlIHAuYSA9IHEuYSBhbmQgcC5iID0gMSBhbmQgcS5iID0g MjsKKworLS0gQ2hlY2sgdGhhdCBhdHRyX25lZWRlZCBpcyB1cGRhdGVkIGNvcnJlY3RseSBh ZnRlciBzZWxmLWpvaW4gcmVtb3ZhbC4gSW4gdGhpcworLS0gdGVzdCwgdGhlIGpvaW4gb2Yg ajEgd2l0aCBqMiBpcyByZW1vdmVkLiBrMS5iIGlzIHJlcXVpcmVkIGF0IGVpdGhlciBqMSBv ciBqMi4KKy0tIElmIHRoaXMgaW5mbyBpcyBsb3N0LCBqb2luIHRhcmdldGxpc3QgZm9yIChr MSwgazIpIHdpbGwgbm90IGNvbnRhaW4gazEuYi4KKy0tIFVzZSBpbmRleCBzY2FuIGZvciBr MSBzbyB0aGF0IHdlIGRvbid0IGdldCAnYicgZnJvbSBwaHlzaWNhbCB0bGlzdCB1c2VkIGZv cgorLS0gc2Vxc2Nhbi4gQWxzbyBkaXNhYmxlIHJlb3JkZXJpbmcgb2Ygam9pbnMgYmVjYXVz ZSB0aGlzIHRlc3QgZGVwZW5kcyBvbiBhCistLSBwYXJ0aWN1bGFyIGpvaW4gdHJlZS4KK2Ny ZWF0ZSB0YWJsZSBzayAoYSBpbnQsIGIgaW50KTsKK2NyZWF0ZSBpbmRleCBvbiBzayhhKTsK K3NldCBqb2luX2NvbGxhcHNlX2xpbWl0IHRvIDE7CitzZXQgZW5hYmxlX3NlcXNjYW4gdG8g b2ZmOworZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3QgMSBmcm9tCisJKHNrIGsxIGpvaW4g c2sgazIgb24gazEuYSA9IGsyLmEpCisJam9pbiAoc2ogajEgam9pbiBzaiBqMiBvbiBqMS5h ID0gajIuYSkgb24gajEuYiA9IGsxLmI7CitleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCAx IGZyb20KKwkoc2sgazEgam9pbiBzayBrMiBvbiBrMS5hID0gazIuYSkKKwlqb2luIChzaiBq MSBqb2luIHNqIGoyIG9uIGoxLmEgPSBqMi5hKSBvbiBqMi5iID0gazEuYjsKK3Jlc2V0IGpv aW5fY29sbGFwc2VfbGltaXQ7CityZXNldCBlbmFibGVfc2Vxc2NhbjsKKworLS0gQ2hlY2sg dGhhdCBjbGF1c2VzIGZyb20gdGhlIGpvaW4gZmlsdGVyIGxpc3QgaXMgbm90IGxvc3Qgb24g dGhlIHNlbGYtam9pbiByZW1vdmFsCitDUkVBVEUgVEFCTEUgZW1wMSAoIGlkIFNFUklBTCBQ UklNQVJZIEtFWSBOT1QgTlVMTCwgY29kZSBpbnQpOworZXhwbGFpbiAodmVyYm9zZSwgY29z dHMgb2ZmKQorU0VMRUNUICogRlJPTSBlbXAxIGUxLCBlbXAxIGUyIFdIRVJFIGUxLmlkID0g ZTIuaWQgQU5EIGUyLmNvZGUgPD4gZTEuY29kZTsKKworLS0gV2UgY2FuIHJlbW92ZSB0aGUg am9pbiBldmVuIGlmIHdlIGZpbmQgdGhlIGpvaW4gY2FuJ3QgZHVwbGljYXRlIHJvd3MgYW5k CistLSB0aGUgYmFzZSBxdWFscyBvZiBlYWNoIHNpZGUgYXJlIGRpZmZlcmVudC4gIEluIHRo ZSBmb2xsb3dpbmcgY2FzZSB3ZSBlbmQgdXAKKy0tIG1vdmluZyBxdWFscyBvdmVyIHRvIHMx IHRvIG1ha2UgaXQgc28gaXQgY2FuJ3QgbWF0Y2ggYW55IHJvd3MuCitjcmVhdGUgdGFibGUg c2woYSBpbnQsIGIgaW50KTsKK2NyZWF0ZSB1bmlxdWUgaW5kZXggb24gc2woYSwgYik7Cit2 YWN1dW0gYW5hbHl6ZSBzbDsKKworLS0gQm90aCBzaWRlcyBhcmUgdW5pcXVlLCBidXQgYmFz ZSBxdWFscyBhcmUgZGlmZmVyZW50CitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBm cm9tIHNsIHQxLCBzbCB0MiB3aGVyZSB0MS5hID0gdDIuYSBhbmQgdDEuYiA9IDEgYW5kIHQy LmIgPSAyOworCistLSBKb2luIHF1YWwgaXNuJ3QgbWVyZ2Vqb2luYWJsZSwgYnV0IGlubmVy IGlzIHVuaXF1ZS4KK2V4cGxhaW4gKENPU1RTIE9GRikKK1NFTEVDVCBuMi5hIEZST00gc2og bjEsIHNqIG4yIFdIRVJFIG4xLmEgPD4gbjIuYSBBTkQgbjIuYSA9IDE7CitleHBsYWluIChD T1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NCisJKFNFTEVDVCBuMi5hIEZST00gc2ogbjEsIHNq IG4yIFdIRVJFIG4xLmEgPD4gbjIuYSkgcTAsIHNsCitXSEVSRSBxMC5hID0gMTsKKworLS0K Ky0tLS0gT25seSBvbmUgc2lkZSBpcyB1bnFpdWUKKy0tc2VsZWN0ICogZnJvbSBzbCB0MSwg c2wgdDIgd2hlcmUgdDEuYSA9IHQyLmEgYW5kIHQxLmIgPSAxOworLS1zZWxlY3QgKiBmcm9t IHNsIHQxLCBzbCB0MiB3aGVyZSB0MS5hID0gdDIuYSBhbmQgdDIuYiA9IDE7CistLQorLS0t LSBTZXZlcmFsIHVuaXF1ZXMgaW5kZXhlcyBtYXRjaCwgYW5kIHdlIHNlbGVjdCBhIGRpZmZl cmVudCBvbmUKKy0tLS0gZm9yIGVhY2ggc2lkZSwgc28gdGhlIGpvaW4gaXMgbm90IHJlbW92 ZWQKKy0tY3JlYXRlIHRhYmxlIHNtKGEgaW50IHVuaXF1ZSwgYiBpbnQgdW5pcXVlLCBjIGlu dCB1bmlxdWUpOworLS1leHBsYWluIChjb3N0cyBvZmYpCistLXNlbGVjdCAqIGZyb20gc20g bSwgc20gbiB3aGVyZSBtLmEgPSBuLmIgYW5kIG0uYyA9IG4uYzsKKy0tZXhwbGFpbiAoY29z dHMgb2ZmKQorLS1zZWxlY3QgKiBmcm9tIHNtIG0sIHNtIG4gd2hlcmUgbS5hID0gbi5jIGFu ZCBtLmIgPSBuLmI7CistLWV4cGxhaW4gKGNvc3RzIG9mZikKKy0tc2VsZWN0ICogZnJvbSBz bSBtLCBzbSBuIHdoZXJlIG0uYyA9IG4uYiBhbmQgbS5hID0gbi5hOworCistLSBDaGVjayBv cHRpbWl6YXRpb24gZGlzYWJsaW5nIGlmIGl0IHdpbGwgdmlvbGF0ZSBzcGVjaWFsIGpvaW4g Y29uZGl0aW9ucy4KKy0tIFR3byBpZGVudGljYWwgam9pbmVkIHJlbGF0aW9ucyBzYXRpc2Zp ZXMgc2VsZiBqb2luIHJlbW92YWwgY29uZGl0aW9ucyBidXQKKy0tIHN0YXkgaW4gZGlmZmVy ZW50IHNwZWNpYWwgam9pbiBpbmZvcy4KK0NSRUFURSBUQUJMRSBzal90MSAoaWQgc2VyaWFs LCBhIGludCk7CitDUkVBVEUgVEFCTEUgc2pfdDIgKGlkIHNlcmlhbCwgYSBpbnQpOworQ1JF QVRFIFRBQkxFIHNqX3QzIChpZCBzZXJpYWwsIGEgaW50KTsKK0NSRUFURSBUQUJMRSBzal90 NCAoaWQgc2VyaWFsLCBhIGludCk7CisKK0NSRUFURSBVTklRVUUgSU5ERVggT04gc2pfdDMg VVNJTkcgYnRyZWUgKGEsaWQpOworQ1JFQVRFIFVOSVFVRSBJTkRFWCBPTiBzal90MiBVU0lO RyBidHJlZSAoaWQpOworCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIHNq X3QxCitKT0lOICgKKwlTRUxFQ1Qgc2pfdDIuaWQgQVMgaWQgRlJPTSBzal90MgorCVdIRVJF IEVYSVNUUworCQkoCisJCVNFTEVDVCBUUlVFIEZST00gc2pfdDMsc2pfdDQgV0hFUkUgc2pf dDMuYSA9IDEgQU5EIHNqX3QzLmlkID0gc2pfdDIuaWQKKwkJKQorCSkgdDJ0M3Q0CitPTiBz al90MS5pZCA9IHQydDN0NC5pZAorSk9JTiAoCisJU0VMRUNUIHNqX3QyLmlkIEFTIGlkIEZS T00gc2pfdDIKKwlXSEVSRSBFWElTVFMKKwkJKAorCQlTRUxFQ1QgVFJVRSBGUk9NIHNqX3Qz LHNqX3Q0IFdIRVJFIHNqX3QzLmEgPSAxIEFORCBzal90My5pZCA9IHNqX3QyLmlkCisJCSkK KwkpIF90MnQzdDQKK09OIHNqX3QxLmlkID0gX3QydDN0NC5pZDsKKworcmVzZXQgZW5hYmxl X2hhc2hqb2luOworcmVzZXQgZW5hYmxlX21lcmdlam9pbjsKKwogLS0KIC0tIFRlc3QgaGlu dHMgZ2l2ZW4gb24gaW5jb3JyZWN0IGNvbHVtbiByZWZlcmVuY2VzIGFyZSB1c2VmdWwKIC0t Ci0tIAoyLjI1LjEKCg== --------------mxj9vgKwbTKZF5jTaRicuQln Content-Type: application/sql; name="ec_usage_demo.sql" Content-Disposition: attachment; filename="ec_usage_demo.sql" Content-Transfer-Encoding: base64 RFJPUCBUQUJMRSBJRiBFWElTVFMgdCx0MiBDQVNDQURFOwpDUkVBVEUgVEFCTEUgdCAoaWQg aW50KTsKQ1JFQVRFIFRBQkxFIHQyIChpZCBpbnQgVU5JUVVFLCB4IHZhcmNoYXIoMjApLCB5 IGJpZ2ludCk7CkFOQUxZWkU7CgpFWFBMQUlOIChDT1NUUyBPRkYpCnNlbGVjdCBiLngsYy55 CiAgZnJvbSB0CiAgIGpvaW4gdDIgYXMgYiBvbiAoYi5pZCA9IHQuaWQpCiAgICAgIGpvaW4g dDIgYXMgYyBvbiAoYy5pZCA9IHQuaWQpOwoKLyoKIE5lc3RlZCBMb29wCiAgIEpvaW4gRmls dGVyOiAodC5pZCA9IGMuaWQpCiAgIC0+ICBTZXEgU2NhbiBvbiB0CiAgIC0+ICBTZXEgU2Nh biBvbiB0MiBjCiAgICAgICAgIEZpbHRlcjogKGlkIElTIE5PVCBOVUxMKQooNSByb3dzKQoq Lw== --------------mxj9vgKwbTKZF5jTaRicuQln--