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 1m42g0-0004PD-Ul for pgsql-hackers@arkaria.postgresql.org; Thu, 15 Jul 2021 14:49:26 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1m42fy-0004fu-Vc for pgsql-hackers@arkaria.postgresql.org; Thu, 15 Jul 2021 14:49:22 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1m42fy-0004fg-14 for pgsql-hackers@lists.postgresql.org; Thu, 15 Jul 2021 14:49:22 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by makus.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1m42fs-0000Xu-9n for pgsql-hackers@lists.postgresql.org; Thu, 15 Jul 2021 14:49:20 +0000 Received: from Andreys-MacBook-Pro.local (cyclops.postgrespro.ru [93.174.131.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) by mail.postgrespro.ru (Postfix) with ESMTPSA id 55B2421CA2FA; Thu, 15 Jul 2021 17:49:13 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1626360553; bh=t8jRCsjBAl101GnhbKPM/xZvmNX+CKLdJkLHDUhU+40=; h=Subject:To:Cc:References:From:Date:In-Reply-To; b=CseMlYiXNCj/EtGnr329bx4Dp7bIpkyGqDgLaJQryOK1LMeW3QDBCp9+9iUfVwSer R9pRCJs3DPpIG5STUNyvpt+WDK0fEBqCqBo7raqh3B1BPXRR3U8gxOC6mVjEoD9Bk+ RQnCW8wlnUIAjP12Ew334/vfHGoploJUQiDLRjP4= Subject: Re: Removing unneeded self joins To: Hywel Carver Cc: pgsql-hackers@lists.postgresql.org References: <64486b0b-0404-e39e-322d-0801154901f3@postgrespro.ru> <21e15759-dba5-2d2b-dd03-06943ad40378@postgrespro.ru> <161553990603.28624.7702383984090736980.pgcf@coridan.postgresql.org> <2a6e540a-4c9f-9402-2e02-71e35fcd4dd1@postgrespro.ru> <4b69ea09-5047-cd8a-a0d7-de1f12120433@postgrespro.ru> From: Andrey Lepikhov Organization: Postgres Professional Message-ID: Date: Thu, 15 Jul 2021 17:49:11 +0300 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.12.0 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------6BEFA584A5E0C765570892A9" Content-Language: en-US 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. --------------6BEFA584A5E0C765570892A9 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit On 6/7/21 13:49, Hywel Carver wrote: > On Mon, Jul 5, 2021 at 2:20 PM Andrey Lepikhov > > wrote: > Looking through the email chain, a previous version of this patch added > ~0.6% to planning time in the worst case tested - does that meet the > "essentially free" requirement? I think these tests weren't full coverage of possible use cases. It will depend on a number of relations in the query. For the JOIN of partitioned tables, for example, the overhead could grow. But in the context of overall planning time this overhead will be small till the large number of relations. Also, we made this feature optional to solve possible problems. Rebased on 768ea9bcf9 -- regards, Andrey Lepikhov Postgres Professional --------------6BEFA584A5E0C765570892A9 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="v28-0001-Remove-self-joins.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="v28-0001-Remove-self-joins.patch" RnJvbSA2ZjlkMTFlYzY0YjViOGUyMzA0MTU2ZGVhZWE3ODQyZTBmZDc3YzNlIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmV5IFYuIExlcGlraG92IiA8YS5sZXBpa2hv dkBwb3N0Z3Jlc3Byby5ydT4KRGF0ZTogVGh1LCAxNSBKdWwgMjAyMSAxNToyNjoxMyArMDMw MApTdWJqZWN0OiBbUEFUQ0hdIFJlbW92ZSBzZWxmLWpvaW5zLgoKUmVtb3ZlIGlubmVyIGpv aW5zIG9mIGEgcmVsYXRpb24gdG8gaXRzZWxmIGlmIGNvdWxkIHByb3ZlIHRoYXQgdGhlIGpv aW4KY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBzY2FuLiBXZSBjYW4gcHJvb2YgdGhlIHVuaXF1 ZW5lc3MKdXNpbmcgdGhlIGV4aXN0aW5nIGlubmVycmVsX2lzX3VuaXF1ZSBtYWNoaW5lcnku CgpXZSBjYW4gcmVtb3ZlIGEgc2VsZi1qb2luIHdoZW4gZm9yIGVhY2ggb3V0ZXIgcm93Ogox LiBBdCBtb3N0IG9uZSBpbm5lciByb3cgbWF0Y2hlcyB0aGUgam9pbiBjbGF1c2VzLgoyLiBJ ZiB0aGUgam9pbiB0YXJnZXQgbGlzdCBjb250YWlucyBhbnkgaW5uZXIgdmFycywgYW4gaW5u ZXIgcm93Cm11c3QgYmUgKHBoeXNpY2FsbHkpIHRoZSBzYW1lIHJvdyBhcyB0aGUgb3V0ZXIg b25lLgoKSW4gdGhpcyBwYXRjaCB3ZSB1c2UgUm93bGV5J3MgWzFdIGFwcHJvYWNoIHRvIGlk ZW50aWZ5IGEgc2VsZi1qb2luOgoxLiBDb2xsZWN0IGFsbCBtZXJnZWpvaW5hYmxlIGpvaW4g cXVhbHMgbG9va3MgbGlrZSBhLnggPSBiLngKMi4gQ2hlY2sgaW5uZXJyZWxfaXNfdW5pcXVl KCkgZm9yIHRoZSBxdWFsIGxpc3QgZnJvbSAoMSkuIElmIGl0CnJldHVybnMgdHJ1ZSwgdGhl biBvdXRlciByb3cgbWF0Y2hlcyBvbmx5IHRoZSBzYW1lIHJvdyBmcm9tIHRoZSBpbm5lcgpy ZWxhdGlvbi4gU28gcHJvdmVkLCB0aGF0IHRoaXMgam9pbiBpcyBzZWxmLWpvaW4gYW5kIGNh biBiZSByZXBsYWNlZCBieQphIHNjYW4uCgpTb21lIHJlZ3Jlc3Npb24gdGVzdHMgY2hhbmdl ZCBkdWUgdG8gc2VsZi1qb2luIHJlbW92YWwgbG9naWMuCgpbMV0gaHR0cHM6Ly93d3cucG9z dGdyZXNxbC5vcmcvbWVzc2FnZS1pZC9yYXcvQ0FBcEhEdnBnZ25GTUM0eVAtalVPN1BLTiUz RGZYZUVyVzViT3hpc3ZKMEh2a0hRRVklM0RXdyU0MG1haWwuZ21haWwuY29tCi0tLQogc3Jj L2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vYW5hbHl6ZWpvaW5zLmMgfCA4OTAgKysrKysrKysr KysrKysrKysrKysrLQogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vcGxhbm1haW4uYyAg ICAgfCAgIDUgKwogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvam9pbmluZm8uYyAgICAg fCAgIDMgKwogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcmVsbm9kZS5jICAgICAgfCAg MjYgKy0KIHNyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjLmMgICAgICAgICAgICAgIHwgIDEw ICsKIHNyYy9pbmNsdWRlL29wdGltaXplci9wYXRobm9kZS5oICAgICAgICAgIHwgICA0ICsK IHNyYy9pbmNsdWRlL29wdGltaXplci9wbGFubWFpbi5oICAgICAgICAgIHwgICAyICsKIHNy Yy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZXF1aXZjbGFzcy5vdXQgIHwgIDMyICsKIHNyYy90 ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQgICAgICAgIHwgMzk5ICsrKysrKysrKysK IHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3lzdmlld3Mub3V0ICAgIHwgICAzICstCiBz cmMvdGVzdC9yZWdyZXNzL3NxbC9lcXVpdmNsYXNzLnNxbCAgICAgICB8ICAxNiArCiBzcmMv dGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbCAgICAgICAgICAgICB8IDE4OSArKysrKwogMTIg ZmlsZXMgY2hhbmdlZCwgMTU1MCBpbnNlcnRpb25zKCspLCAyOSBkZWxldGlvbnMoLSkKCmRp ZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9hbmFseXplam9pbnMuYyBi L3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2FuYWx5emVqb2lucy5jCmluZGV4IDM3ZWI2 NGJjZWYuLmE4ZTYzOGY2ZTcgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9w bGFuL2FuYWx5emVqb2lucy5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2Fu YWx5emVqb2lucy5jCkBAIC0yMiw2ICsyMiw3IEBACiAgKi8KICNpbmNsdWRlICJwb3N0Z3Jl cy5oIgogCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19jbGFzcy5oIgogI2luY2x1ZGUgIm5vZGVz L25vZGVGdW5jcy5oIgogI2luY2x1ZGUgIm9wdGltaXplci9jbGF1c2VzLmgiCiAjaW5jbHVk ZSAib3B0aW1pemVyL2pvaW5pbmZvLmgiCkBAIC0zMiwxMCArMzMsMTIgQEAKICNpbmNsdWRl ICJvcHRpbWl6ZXIvdGxpc3QuaCIKICNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKIAor Ym9vbCBlbmFibGVfc2VsZl9qb2luX3JlbW92YWw7CisKIC8qIGxvY2FsIGZ1bmN0aW9ucyAq Lwogc3RhdGljIGJvb2wgam9pbl9pc19yZW1vdmFibGUoUGxhbm5lckluZm8gKnJvb3QsIFNw ZWNpYWxKb2luSW5mbyAqc2ppbmZvKTsKIHN0YXRpYyB2b2lkIHJlbW92ZV9yZWxfZnJvbV9x dWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLAotCQkJCQkJCQkgIFJlbGlkcyBq b2lucmVsaWRzKTsKKwkJCQkJCQkJICBSZWxpZHMgam9pbnJlbGlkcywgaW50IHN1YnN0X3Jl bGlkKTsKIHN0YXRpYyBMaXN0ICpyZW1vdmVfcmVsX2Zyb21fam9pbmxpc3QoTGlzdCAqam9p bmxpc3QsIGludCByZWxpZCwgaW50ICpucmVtb3ZlZCk7CiBzdGF0aWMgYm9vbCByZWxfc3Vw cG9ydHNfZGlzdGluY3RuZXNzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwp Owogc3RhdGljIGJvb2wgcmVsX2lzX2Rpc3RpbmN0X2ZvcihQbGFubmVySW5mbyAqcm9vdCwg UmVsT3B0SW5mbyAqcmVsLApAQCAtNDcsNiArNTAsOSBAQCBzdGF0aWMgYm9vbCBpc19pbm5l cnJlbF91bmlxdWVfZm9yKFBsYW5uZXJJbmZvICpyb290LAogCQkJCQkJCQkgICBSZWxPcHRJ bmZvICppbm5lcnJlbCwKIAkJCQkJCQkJICAgSm9pblR5cGUgam9pbnR5cGUsCiAJCQkJCQkJ CSAgIExpc3QgKnJlc3RyaWN0bGlzdCk7CitzdGF0aWMgdm9pZCBjaGFuZ2VfcmluZm8oUmVz dHJpY3RJbmZvKiByaW5mbywgSW5kZXggZnJvbSwgSW5kZXggdG8pOworc3RhdGljIEJpdG1h cHNldCogY2hhbmdlX3JlbGlkKFJlbGlkcyByZWxpZHMsIEluZGV4IG9sZElkLCBJbmRleCBu ZXdJZCk7CitzdGF0aWMgdm9pZCBjaGFuZ2VfdmFybm8oRXhwciAqZXhwciwgSW5kZXggb2xk UmVsaWQsIEluZGV4IG5ld1JlbGlkKTsKIAogCiAvKgpAQCAtODYsNyArOTIsNyBAQCByZXN0 YXJ0OgogCiAJCXJlbW92ZV9yZWxfZnJvbV9xdWVyeShyb290LCBpbm5lcnJlbGlkLAogCQkJ CQkJCSAgYm1zX3VuaW9uKHNqaW5mby0+bWluX2xlZnRoYW5kLAotCQkJCQkJCQkJCXNqaW5m by0+bWluX3JpZ2h0aGFuZCkpOworCQkJCQkJCQkJCXNqaW5mby0+bWluX3JpZ2h0aGFuZCks IDApOwogCiAJCS8qIFdlIHZlcmlmeSB0aGF0IGV4YWN0bHkgb25lIHJlZmVyZW5jZSBnZXRz IHJlbW92ZWQgZnJvbSBqb2lubGlzdCAqLwogCQlucmVtb3ZlZCA9IDA7CkBAIC0zMDAsNyAr MzA2LDEwIEBAIGpvaW5faXNfcmVtb3ZhYmxlKFBsYW5uZXJJbmZvICpyb290LCBTcGVjaWFs Sm9pbkluZm8gKnNqaW5mbykKIAogLyoKICAqIFJlbW92ZSB0aGUgdGFyZ2V0IHJlbGlkIGZy b20gdGhlIHBsYW5uZXIncyBkYXRhIHN0cnVjdHVyZXMsIGhhdmluZwotICogZGV0ZXJtaW5l ZCB0aGF0IHRoZXJlIGlzIG5vIG5lZWQgdG8gaW5jbHVkZSBpdCBpbiB0aGUgcXVlcnkuCisg KiBkZXRlcm1pbmVkIHRoYXQgdGhlcmUgaXMgbm8gbmVlZCB0byBpbmNsdWRlIGl0IGluIHRo ZSBxdWVyeS4gT3IgcmVwbGFjZQorICogd2l0aCBhbm90aGVyIHJlbGlkLgorICogVG8gcmV1 c2FiaWxpdHksIHRoaXMgcm91dGluZSBjYW4gd29yayBpbiB0d28gbW9kZXM6IGRlbGV0ZSBy ZWxpZCBmcm9tIGEgcGxhbgorICogb3IgcmVwbGFjZSBpdC4gSXQgaXMgdXNlZCBpbiByZXBs YWNlIG1vZGUgaW4gYSBzZWxmLWpvaW4gcmVtb3ZpbmcgcHJvY2Vzcy4KICAqCiAgKiBXZSBh cmUgbm90IHRlcnJpYmx5IHRob3JvdWdoIGhlcmUuICBXZSBtdXN0IG1ha2Ugc3VyZSB0aGF0 IHRoZSByZWwgaXMKICAqIG5vIGxvbmdlciB0cmVhdGVkIGFzIGEgYmFzZXJlbCwgYW5kIHRo YXQgYXR0cmlidXRlcyBvZiBvdGhlciBiYXNlcmVscwpAQCAtMzA5LDEzICszMTgsMTYgQEAg am9pbl9pc19yZW1vdmFibGUoUGxhbm5lckluZm8gKnJvb3QsIFNwZWNpYWxKb2luSW5mbyAq c2ppbmZvKQogICogbGlzdHMsIGJ1dCBvbmx5IGlmIHRoZXkgYmVsb25nIHRvIHRoZSBvdXRl ciBqb2luIGlkZW50aWZpZWQgYnkgam9pbnJlbGlkcy4KICAqLwogc3RhdGljIHZvaWQKLXJl bW92ZV9yZWxfZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLCBSZWxp ZHMgam9pbnJlbGlkcykKK3JlbW92ZV9yZWxfZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9v dCwgaW50IHJlbGlkLCBSZWxpZHMgam9pbnJlbGlkcywKKwkJCQkJICBpbnQgc3Vic3RfcmVs aWQpCiB7CiAJUmVsT3B0SW5mbyAqcmVsID0gZmluZF9iYXNlX3JlbChyb290LCByZWxpZCk7 CiAJTGlzdAkgICAqam9pbmluZm9zOwogCUluZGV4CQlydGk7CiAJTGlzdENlbGwgICAqbDsK IAorCUFzc2VydChzdWJzdF9yZWxpZCA9PSAwIHx8IHJlbGlkICE9IHN1YnN0X3JlbGlkKTsK KwogCS8qCiAJICogTWFyayB0aGUgcmVsIGFzICJkZWFkIiB0byBzaG93IGl0IGlzIG5vIGxv bmdlciBwYXJ0IG9mIHRoZSBqb2luIHRyZWUuCiAJICogKFJlbW92aW5nIGl0IGZyb20gdGhl IGJhc2VyZWwgYXJyYXkgYWx0b2dldGhlciBzZWVtcyB0b28gcmlza3kuKQpAQCAtMzQ1LDgg KzM1NywxMSBAQCByZW1vdmVfcmVsX2Zyb21fcXVlcnkoUGxhbm5lckluZm8gKnJvb3QsIGlu dCByZWxpZCwgUmVsaWRzIGpvaW5yZWxpZHMpCiAJCQkgYXR0cm9mZi0tKQogCQl7CiAJCQlv dGhlcnJlbC0+YXR0cl9uZWVkZWRbYXR0cm9mZl0gPQotCQkJCWJtc19kZWxfbWVtYmVyKG90 aGVycmVsLT5hdHRyX25lZWRlZFthdHRyb2ZmXSwgcmVsaWQpOworCQkJCWNoYW5nZV9yZWxp ZChvdGhlcnJlbC0+YXR0cl9uZWVkZWRbYXR0cm9mZl0sIHJlbGlkLCBzdWJzdF9yZWxpZCk7 CiAJCX0KKworCQkvKiBVcGRhdGUgbGF0ZXJhbCByZWZlcmVuY2VzLiAqLworCQljaGFuZ2Vf dmFybm8oKEV4cHIqKW90aGVycmVsLT5sYXRlcmFsX3ZhcnMsIHJlbGlkLCBzdWJzdF9yZWxp ZCk7CiAJfQogCiAJLyoKQEAgLTM2MSwxMCArMzc2LDEyIEBAIHJlbW92ZV9yZWxfZnJvbV9x dWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLCBSZWxpZHMgam9pbnJlbGlkcykK IAl7CiAJCVNwZWNpYWxKb2luSW5mbyAqc2ppbmZvID0gKFNwZWNpYWxKb2luSW5mbyAqKSBs Zmlyc3QobCk7CiAKLQkJc2ppbmZvLT5taW5fbGVmdGhhbmQgPSBibXNfZGVsX21lbWJlcihz amluZm8tPm1pbl9sZWZ0aGFuZCwgcmVsaWQpOwotCQlzamluZm8tPm1pbl9yaWdodGhhbmQg PSBibXNfZGVsX21lbWJlcihzamluZm8tPm1pbl9yaWdodGhhbmQsIHJlbGlkKTsKLQkJc2pp bmZvLT5zeW5fbGVmdGhhbmQgPSBibXNfZGVsX21lbWJlcihzamluZm8tPnN5bl9sZWZ0aGFu ZCwgcmVsaWQpOwotCQlzamluZm8tPnN5bl9yaWdodGhhbmQgPSBibXNfZGVsX21lbWJlcihz amluZm8tPnN5bl9yaWdodGhhbmQsIHJlbGlkKTsKKwkJc2ppbmZvLT5taW5fbGVmdGhhbmQg PSBjaGFuZ2VfcmVsaWQoc2ppbmZvLT5taW5fbGVmdGhhbmQsIHJlbGlkLCBzdWJzdF9yZWxp ZCk7CisJCXNqaW5mby0+bWluX3JpZ2h0aGFuZCA9IGNoYW5nZV9yZWxpZChzamluZm8tPm1p bl9yaWdodGhhbmQsIHJlbGlkLCBzdWJzdF9yZWxpZCk7CisJCXNqaW5mby0+c3luX2xlZnRo YW5kID0gY2hhbmdlX3JlbGlkKHNqaW5mby0+c3luX2xlZnRoYW5kLCByZWxpZCwgc3Vic3Rf cmVsaWQpOworCQlzamluZm8tPnN5bl9yaWdodGhhbmQgPSBjaGFuZ2VfcmVsaWQoc2ppbmZv LT5zeW5fcmlnaHRoYW5kLCByZWxpZCwgc3Vic3RfcmVsaWQpOworCisJCWNoYW5nZV92YXJu bygoRXhwciopc2ppbmZvLT5zZW1pX3Joc19leHBycywgcmVsaWQsIHN1YnN0X3JlbGlkKTsK IAl9CiAKIAkvKgpAQCAtMzg1LDE2ICs0MDIsMjkgQEAgcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5 KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQsIFJlbGlkcyBqb2lucmVsaWRzKQogCXsK IAkJUGxhY2VIb2xkZXJJbmZvICpwaGluZm8gPSAoUGxhY2VIb2xkZXJJbmZvICopIGxmaXJz dChsKTsKIAotCQlBc3NlcnQoIWJtc19pc19tZW1iZXIocmVsaWQsIHBoaW5mby0+cGhfbGF0 ZXJhbCkpOwotCQlpZiAoYm1zX2lzX3N1YnNldChwaGluZm8tPnBoX25lZWRlZCwgam9pbnJl bGlkcykgJiYKKwkJaWYgKHN1YnN0X3JlbGlkID09IDAgJiYgYm1zX2lzX3N1YnNldChwaGlu Zm8tPnBoX25lZWRlZCwgam9pbnJlbGlkcykgJiYKIAkJCWJtc19pc19tZW1iZXIocmVsaWQs IHBoaW5mby0+cGhfZXZhbF9hdCkpCiAJCQlyb290LT5wbGFjZWhvbGRlcl9saXN0ID0gZm9y ZWFjaF9kZWxldGVfY3VycmVudChyb290LT5wbGFjZWhvbGRlcl9saXN0LAogCQkJCQkJCQkJ CQkJCQkJbCk7CiAJCWVsc2UKIAkJewotCQkJcGhpbmZvLT5waF9ldmFsX2F0ID0gYm1zX2Rl bF9tZW1iZXIocGhpbmZvLT5waF9ldmFsX2F0LCByZWxpZCk7CisJCQlwaGluZm8tPnBoX2V2 YWxfYXQgPSBjaGFuZ2VfcmVsaWQocGhpbmZvLT5waF9ldmFsX2F0LCByZWxpZCwgc3Vic3Rf cmVsaWQpOwogCQkJQXNzZXJ0KCFibXNfaXNfZW1wdHkocGhpbmZvLT5waF9ldmFsX2F0KSk7 Ci0JCQlwaGluZm8tPnBoX25lZWRlZCA9IGJtc19kZWxfbWVtYmVyKHBoaW5mby0+cGhfbmVl ZGVkLCByZWxpZCk7CisJCQlwaGluZm8tPnBoX25lZWRlZCA9IGNoYW5nZV9yZWxpZChwaGlu Zm8tPnBoX25lZWRlZCwgcmVsaWQsIHN1YnN0X3JlbGlkKTsKKwkJCUFzc2VydChzdWJzdF9y ZWxpZCAhPSAwIHx8ICFibXNfaXNfbWVtYmVyKHJlbGlkLCBwaGluZm8tPnBoX2xhdGVyYWwp KTsKKwkJCXBoaW5mby0+cGhfbGF0ZXJhbCA9IGNoYW5nZV9yZWxpZChwaGluZm8tPnBoX2xh dGVyYWwsIHJlbGlkLCBzdWJzdF9yZWxpZCk7CisJCQlwaGluZm8tPnBoX3Zhci0+cGhyZWxz ID0gY2hhbmdlX3JlbGlkKHBoaW5mby0+cGhfdmFyLT5waHJlbHMsIHJlbGlkLCBzdWJzdF9y ZWxpZCk7CisJCX0KKwl9CisKKwlpZiAoc3Vic3RfcmVsaWQgIT0gMCkKKwl7CisJCWZvcmVh Y2gobCwgcmVsLT5iYXNlcmVzdHJpY3RpbmZvKQorCQl7CisJCQlSZXN0cmljdEluZm8gKnJp bmZvID0gKFJlc3RyaWN0SW5mbyAqKSBsZmlyc3QobCk7CisKKwkJCWNoYW5nZV9yaW5mbyhy aW5mbywgcmVsaWQsIHN1YnN0X3JlbGlkKTsKKwkJCWRpc3RyaWJ1dGVfcmVzdHJpY3RpbmZv X3RvX3JlbHMocm9vdCwgcmluZm8pOwogCQl9CiAJfQogCkBAIC00MTgsNiArNDQ4LDcgQEAg cmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQsIFJl bGlkcyBqb2lucmVsaWRzKQogCQlSZXN0cmljdEluZm8gKnJpbmZvID0gKFJlc3RyaWN0SW5m byAqKSBsZmlyc3QobCk7CiAKIAkJcmVtb3ZlX2pvaW5fY2xhdXNlX2Zyb21fcmVscyhyb290 LCByaW5mbywgcmluZm8tPnJlcXVpcmVkX3JlbGlkcyk7CisJCWNoYW5nZV9yaW5mbyhyaW5m bywgcmVsaWQsIHN1YnN0X3JlbGlkKTsKIAogCQlpZiAoUklORk9fSVNfUFVTSEVEX0RPV04o cmluZm8sIGpvaW5yZWxpZHMpKQogCQl7CkBAIC00MzMsNiArNDY0LDggQEAgcmVtb3ZlX3Jl bF9mcm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQsIFJlbGlkcyBqb2lu cmVsaWRzKQogCQkJCQkJCQkJCQkJCXJlbGlkKTsKIAkJCWRpc3RyaWJ1dGVfcmVzdHJpY3Rp bmZvX3RvX3JlbHMocm9vdCwgcmluZm8pOwogCQl9CisJCWVsc2UgaWYgKHN1YnN0X3JlbGlk ICE9IDApCisJCQlkaXN0cmlidXRlX3Jlc3RyaWN0aW5mb190b19yZWxzKHJvb3QsIHJpbmZv KTsKIAl9CiAKIAkvKgpAQCAtMTExOCwzICsxMTUxLDgzNCBAQCBpc19pbm5lcnJlbF91bmlx dWVfZm9yKFBsYW5uZXJJbmZvICpyb290LAogCS8qIExldCByZWxfaXNfZGlzdGluY3RfZm9y KCkgZG8gdGhlIGhhcmQgd29yayAqLwogCXJldHVybiByZWxfaXNfZGlzdGluY3RfZm9yKHJv b3QsIGlubmVycmVsLCBjbGF1c2VfbGlzdCk7CiB9CisKK3R5cGVkZWYgc3RydWN0IENoYW5n ZVZhcm5vQ29udGV4dAoreworCUluZGV4IG9sZFJlbGlkOworCUluZGV4IG5ld1JlbGlkOwor fSBDaGFuZ2VWYXJub0NvbnRleHQ7CisKKworc3RhdGljIGJvb2wKK2NoYW5nZV92YXJub193 YWxrZXIoTm9kZSAqbm9kZSwgQ2hhbmdlVmFybm9Db250ZXh0ICpjb250ZXh0KQoreworCWlm IChub2RlID09IE5VTEwpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChJc0Eobm9kZSwgVmFy KSkKKwl7CisJCVZhciogdmFyID0gKFZhciopbm9kZTsKKwkJaWYgKHZhci0+dmFybm8gPT0g Y29udGV4dC0+b2xkUmVsaWQpCisJCXsKKwkJCXZhci0+dmFybm8gPSBjb250ZXh0LT5uZXdS ZWxpZDsKKwkJCXZhci0+dmFybm9zeW4gPSBjb250ZXh0LT5uZXdSZWxpZDsKKwkJCXZhci0+ bG9jYXRpb24gPSAtMTsKKwkJfQorCQllbHNlIGlmICh2YXItPnZhcm5vID09IGNvbnRleHQt Pm5ld1JlbGlkKQorCQkJdmFyLT5sb2NhdGlvbiA9IC0xOworCisJCXJldHVybiBmYWxzZTsK Kwl9CisJaWYgKElzQShub2RlLCBSZXN0cmljdEluZm8pKQorCXsKKwkJY2hhbmdlX3JpbmZv KChSZXN0cmljdEluZm8qKW5vZGUsIGNvbnRleHQtPm9sZFJlbGlkLCBjb250ZXh0LT5uZXdS ZWxpZCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIGV4cHJlc3Npb25fdHJlZV93 YWxrZXIobm9kZSwgY2hhbmdlX3Zhcm5vX3dhbGtlciwgY29udGV4dCk7Cit9CisKKy8qCisg KiBGb3IgYWxsIFZhcnMgaW4gdGhlIGV4cHJlc3Npb24gdGhhdCBoYXZlIHZhcm5vID0gb2xk UmVsaWQsIHNldAorICogdmFybm8gPSBuZXdSZWxpZC4KKyAqLworc3RhdGljIHZvaWQKK2No YW5nZV92YXJubyhFeHByICpleHByLCBJbmRleCBvbGRSZWxpZCwgSW5kZXggbmV3UmVsaWQp Cit7CisJQ2hhbmdlVmFybm9Db250ZXh0IGNvbnRleHQ7CisKKwlpZiAobmV3UmVsaWQgPT0g MCkKKwkJcmV0dXJuOworCisJY29udGV4dC5vbGRSZWxpZCA9IG9sZFJlbGlkOworCWNvbnRl eHQubmV3UmVsaWQgPSBuZXdSZWxpZDsKKwljaGFuZ2VfdmFybm9fd2Fsa2VyKChOb2RlICop IGV4cHIsICZjb250ZXh0KTsKK30KKworLyoKKyAqIFN1YnN0aXR1dGUgbmV3SWQgZm9yIG9s ZElkIGluIHJlbGlkcy4KKyAqLworc3RhdGljIEJpdG1hcHNldCoKK2NoYW5nZV9yZWxpZChS ZWxpZHMgcmVsaWRzLCBJbmRleCBvbGRJZCwgSW5kZXggbmV3SWQpCit7CisJaWYgKG5ld0lk ID09IDApCisJCS8qIERlbGV0ZSByZWxpZCB3aXRob3V0IHN1YnN0aXR1dGlvbi4gKi8KKwkJ cmV0dXJuIGJtc19kZWxfbWVtYmVyKHJlbGlkcywgb2xkSWQpOworCisJaWYgKGJtc19pc19t ZW1iZXIob2xkSWQsIHJlbGlkcykpCisJCXJldHVybiBibXNfYWRkX21lbWJlcihibXNfZGVs X21lbWJlcihibXNfY29weShyZWxpZHMpLCBvbGRJZCksIG5ld0lkKTsKKworCXJldHVybiBy ZWxpZHM7Cit9CisKK3N0YXRpYyB2b2lkCitjaGFuZ2VfcmluZm8oUmVzdHJpY3RJbmZvKiBy aW5mbywgSW5kZXggZnJvbSwgSW5kZXggdG8pCit7CisJYm9vbCBpc19yZXFfZXF1YWw7CisK KwlpZiAodG8gPT0gMCkKKwkJcmV0dXJuOworCisJaXNfcmVxX2VxdWFsID0KKwkJKHJpbmZv LT5yZXF1aXJlZF9yZWxpZHMgPT0gcmluZm8tPmNsYXVzZV9yZWxpZHMpID8gdHJ1ZSA6IGZh bHNlOworCisJY2hhbmdlX3Zhcm5vKHJpbmZvLT5jbGF1c2UsIGZyb20sIHRvKTsKKwljaGFu Z2VfdmFybm8ocmluZm8tPm9yY2xhdXNlLCBmcm9tLCB0byk7CisJcmluZm8tPmNsYXVzZV9y ZWxpZHMgPSBjaGFuZ2VfcmVsaWQocmluZm8tPmNsYXVzZV9yZWxpZHMsIGZyb20sIHRvKTsK KwlpZiAoaXNfcmVxX2VxdWFsKQorCQlyaW5mby0+cmVxdWlyZWRfcmVsaWRzID0gcmluZm8t PmNsYXVzZV9yZWxpZHM7CisJZWxzZQorCQlyaW5mby0+cmVxdWlyZWRfcmVsaWRzID0gY2hh bmdlX3JlbGlkKHJpbmZvLT5yZXF1aXJlZF9yZWxpZHMsIGZyb20sIHRvKTsKKwlyaW5mby0+ bGVmdF9yZWxpZHMgPSBjaGFuZ2VfcmVsaWQocmluZm8tPmxlZnRfcmVsaWRzLCBmcm9tLCB0 byk7CisJcmluZm8tPnJpZ2h0X3JlbGlkcyA9IGNoYW5nZV9yZWxpZChyaW5mby0+cmlnaHRf cmVsaWRzLCBmcm9tLCB0byk7CisJcmluZm8tPm91dGVyX3JlbGlkcyA9IGNoYW5nZV9yZWxp ZChyaW5mby0+b3V0ZXJfcmVsaWRzLCBmcm9tLCB0byk7CisJcmluZm8tPm51bGxhYmxlX3Jl bGlkcyA9IGNoYW5nZV9yZWxpZChyaW5mby0+bnVsbGFibGVfcmVsaWRzLCBmcm9tLCB0byk7 Cit9CisKKy8qCisgKiBVcGRhdGUgRUMgbWVtYmVycyB0byBwb2ludCB0byB0aGUgcmVtYWlu aW5nIHJlbGF0aW9uIGluc3RlYWQgb2YgdGhlIHJlbW92ZWQKKyAqIG9uZSwgcmVtb3Zpbmcg ZHVwbGljYXRlcy4KKyAqLworc3RhdGljIHZvaWQKK3VwZGF0ZV9lY19tZW1iZXJzKEVxdWl2 YWxlbmNlQ2xhc3MgKmVjLCBJbmRleCB0b1JlbW92ZSwgSW5kZXggdG9LZWVwKQoreworCWlu dAkJCWNvdW50ZXI7CisKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgbGlzdF9sZW5n dGgoZWMtPmVjX21lbWJlcnMpOyApCisJeworCQlMaXN0Q2VsbAkJCSpjZWxsID0gbGlzdF9u dGhfY2VsbChlYy0+ZWNfbWVtYmVycywgY291bnRlcik7CisJCUVxdWl2YWxlbmNlTWVtYmVy CSplbSA9IGxmaXJzdChjZWxsKTsKKwkJaW50CQkJCQljb3VudGVyMTsKKworCQlpZiAoIWJt c19pc19tZW1iZXIodG9SZW1vdmUsIGVtLT5lbV9yZWxpZHMpKQorCQl7CisJCQljb3VudGVy Kys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWVtLT5lbV9yZWxpZHMgPSBjaGFuZ2VfcmVs aWQoZW0tPmVtX3JlbGlkcywgdG9SZW1vdmUsIHRvS2VlcCk7CisJCS8qIFdlIG9ubHkgcHJv Y2VzcyBpbm5lciBqb2lucyAqLworCQljaGFuZ2VfdmFybm8oZW0tPmVtX2V4cHIsIHRvUmVt b3ZlLCB0b0tlZXApOworCisJCS8qCisJCSAqIEFmdGVyIHdlIHN3aXRjaGVkIHRoZSBlcXVp dmFsZW5jZSBtZW1iZXIgdG8gdGhlIHJlbWFpbmluZyByZWxhdGlvbiwKKwkJICogY2hlY2sg dGhhdCBpdCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGV4aXN0aW5nIG1lbWJlciwgYW5kIGlm IGl0CisJCSAqIGlzLCBkZWxldGUgaXQuCisJCSAqLworCQlmb3IgKGNvdW50ZXIxID0gMDsg Y291bnRlcjEgPCBsaXN0X2xlbmd0aChlYy0+ZWNfbWVtYmVycyk7IGNvdW50ZXIxKyspCisJ CXsKKwkJCUVxdWl2YWxlbmNlTWVtYmVyCSpvdGhlcjsKKworCQkJaWYgKGNvdW50ZXIxID09 IGNvdW50ZXIpCisJCQkJY29udGludWU7CisKKwkJCW90aGVyID0gY2FzdE5vZGUoRXF1aXZh bGVuY2VNZW1iZXIsIGxpc3RfbnRoKGVjLT5lY19tZW1iZXJzLCBjb3VudGVyMSkpOworCisJ CQlpZiAoZXF1YWwob3RoZXItPmVtX2V4cHIsIGVtLT5lbV9leHByKSkKKwkJCQlicmVhazsK KwkJfQorCisJCWlmIChjb3VudGVyMSA8IGxpc3RfbGVuZ3RoKGVjLT5lY19tZW1iZXJzKSkK KwkJCWVjLT5lY19tZW1iZXJzID0gbGlzdF9kZWxldGVfY2VsbChlYy0+ZWNfbWVtYmVycywg Y2VsbCk7CisJCWVsc2UKKwkJCWNvdW50ZXIrKzsKKwl9Cit9CisKKy8qCisgKiBVcGRhdGUg RUMgc291cmNlcyB0byBwb2ludCB0byB0aGUgcmVtYWluaW5nIHJlbGF0aW9uIGluc3RlYWQg b2YgdGhlCisgKiByZW1vdmVkIG9uZS4KKyAqLworc3RhdGljIHZvaWQKK3VwZGF0ZV9lY19z b3VyY2VzKExpc3QgKipzb3VyY2VzLCBJbmRleCB0b1JlbW92ZSwgSW5kZXggdG9LZWVwKQor eworCWludAkJCWNvdW50ZXI7CisJaW50IGNjPTA7CisKKwlmb3IgKGNvdW50ZXIgPSAwOyBj b3VudGVyIDwgbGlzdF9sZW5ndGgoKnNvdXJjZXMpOyApCisJeworCQlMaXN0Q2VsbAkJKmNl bGwgPSBsaXN0X250aF9jZWxsKCpzb3VyY2VzLCBjb3VudGVyKTsKKwkJUmVzdHJpY3RJbmZv CSpyaW5mbyA9IGNhc3ROb2RlKFJlc3RyaWN0SW5mbywgbGZpcnN0KGNlbGwpKTsKKwkJaW50 CQkJCWNvdW50ZXIxOworCisJCWlmICghYm1zX2lzX21lbWJlcih0b1JlbW92ZSwgcmluZm8t PnJlcXVpcmVkX3JlbGlkcykpCisJCXsKKwkJCWNvdW50ZXIrKzsKKwkJCWNvbnRpbnVlOwor CQl9CisKKwkJY2hhbmdlX3Zhcm5vKHJpbmZvLT5jbGF1c2UsIHRvUmVtb3ZlLCB0b0tlZXAp OworCisJCS8qCisJCSAqIEFmdGVyIHN3aXRjaGluZyB0aGUgY2xhdXNlIHRvIHRoZSByZW1h aW5pbmcgcmVsYXRpb24sIGNoZWNrIGl0IGZvcgorCQkgKiByZWR1bmRhbmN5IHdpdGggZXhp c3Rpbmcgb25lcy4gV2UgZG9uJ3QgaGF2ZSB0byBjaGVjayBmb3IKKwkJICogcmVkdW5kYW5j eSB3aXRoIGRlcml2ZWQgY2xhdXNlcywgYmVjYXVzZSB3ZSd2ZSBqdXN0IGRlbGV0ZWQgdGhl bS4KKwkJICovCisJCWZvciAoY291bnRlcjEgPSAwOyBjb3VudGVyMSA8IGxpc3RfbGVuZ3Ro KCpzb3VyY2VzKTsgY291bnRlcjErKykKKwkJeworCQkJUmVzdHJpY3RJbmZvICpvdGhlcjsK KworCQkJaWYgKGNvdW50ZXIxID09IGNvdW50ZXIpCisJCQkJY29udGludWU7CisKKwkJCW90 aGVyID0gY2FzdE5vZGUoUmVzdHJpY3RJbmZvLCBsaXN0X250aCgqc291cmNlcywgY291bnRl cjEpKTsKKwkJCWlmIChlcXVhbChyaW5mby0+Y2xhdXNlLCBvdGhlci0+Y2xhdXNlKSkKKwkJ CQlicmVhazsKKwkJfQorCisJCWlmIChjb3VudGVyMSA8IGxpc3RfbGVuZ3RoKCpzb3VyY2Vz KSkKKwkJeworCQkJKnNvdXJjZXMgPSBsaXN0X2RlbGV0ZV9jZWxsKCpzb3VyY2VzLCBjZWxs KTsKKwkJCWNjKys7CisJCX0KKwkJZWxzZQorCQl7CisJCQljb3VudGVyKys7CisKKwkJCS8q IFdlIHdpbGwga2VlcCB0aGlzIFJlc3RyaWN0SW5mbywgY29ycmVjdCBpdHMgcmVsaWRzLiAq LworCQkJY2hhbmdlX3JpbmZvKHJpbmZvLCB0b1JlbW92ZSwgdG9LZWVwKTsKKwkJfQorCX0K K30KKworLyoKKyAqIFJlbW92ZSBhIHJlbGF0aW9uIGFmdGVyIHdlIGhhdmUgcHJvdmVuIHRo YXQgaXQgcGFydGljaXBhdGVzIG9ubHkgaW4gYW4KKyAqIHVubmVlZGVkIHVuaXF1ZSBzZWxm IGpvaW4uCisgKgorICogVGhlIGpvaW5jbGF1c2VzIGxpc3QgaXMgZGVzdHJ1Y3RpdmVseSBj aGFuZ2VkLgorICovCitzdGF0aWMgdm9pZAorcmVtb3ZlX3NlbGZfam9pbl9yZWwoUGxhbm5l ckluZm8gKnJvb3QsIFBsYW5Sb3dNYXJrICprbWFyaywgUGxhblJvd01hcmsgKnJtYXJrLAor CQkJCQkgUmVsT3B0SW5mbyAqdG9LZWVwLCBSZWxPcHRJbmZvICp0b1JlbW92ZSkKK3sKKwlM aXN0Q2VsbCAqY2VsbDsKKwlpbnQgaTsKKwlMaXN0ICp0YXJnZXQgPSBOSUw7CisKKwkvKgor CSAqIEluY2x1ZGUgYWxsIGVjbGFzcyBtZW50aW9ucyBvZiByZW1vdmVkIHJlbGF0aW9uIGlu dG8gdGhlIGVjbGFzcyBtZW50aW9ucworCSAqIG9mIGtlcHQgcmVsYXRpb24uCisJICovCisJ dG9LZWVwLT5lY2xhc3NfaW5kZXhlcyA9IGJtc19hZGRfbWVtYmVycyh0b1JlbW92ZS0+ZWNs YXNzX2luZGV4ZXMsCisJCQkJCQkJCQkJCQkJCXRvS2VlcC0+ZWNsYXNzX2luZGV4ZXMpOwor CisJLyoKKwkgKiBOb3csIGJhc2VyZXN0cmljdGluZm8gcmVwbGVuaXNoZWQgd2l0aCByZXN0 cmljdGlvbnMgZnJvbSByZW1vdmluZworCSAqIHJlbGF0aW9uLiBJdCBpcyBuZWVkZWQgdG8g cmVtb3ZlIGR1cGxpY2F0ZXMgYW5kIHJlcGxhY2UgZGVnZW5lcmF0ZWQKKwkgKiBjbGF1c2Vz IHdpdGggYSBOdWxsVGVzdC4KKwkgKi8KKwlmb3JlYWNoKGNlbGwsIHRvS2VlcC0+YmFzZXJl c3RyaWN0aW5mbykKKwl7CisJCVJlc3RyaWN0SW5mbyAqcmluZm8gPSBsZmlyc3Rfbm9kZShS ZXN0cmljdEluZm8sIGNlbGwpOworCQlMaXN0Q2VsbCAqb3RoZXJDZWxsOworCisJCUFzc2Vy dCghYm1zX2lzX21lbWJlcih0b1JlbW92ZS0+cmVsaWQsIHJpbmZvLT5jbGF1c2VfcmVsaWRz KSk7CisKKwkJLyoKKwkJICogSWYgdGhpcyBjbGF1c2UgaXMgYSBtZXJnZWpvaW5hYmxlIGVx dWFsaXR5IGNsYXVzZSB0aGF0IGNvbXBhcmVzIGEKKwkJICogdmFyaWFibGUgdG8gaXRzZWxm LCBpLmUuLCBoYXMgdGhlIGZvcm0gb2YgIlg9WCIsIHJlcGxhY2UgaXQgd2l0aAorCQkgKiBu dWxsIHRlc3QuCisJCSAqLworCQlpZiAocmluZm8tPm1lcmdlb3BmYW1pbGllcyAmJiBJc0Eo cmluZm8tPmNsYXVzZSwgT3BFeHByKSkKKwkJeworCQkJRXhwciAqbGVmdE9wOworCQkJRXhw ciAqcmlnaHRPcDsKKworCQkJbGVmdE9wID0gKEV4cHIgKikgZ2V0X2xlZnRvcChyaW5mby0+ Y2xhdXNlKTsKKwkJCXJpZ2h0T3AgPSAoRXhwciAqKSBnZXRfcmlnaHRvcChyaW5mby0+Y2xh dXNlKTsKKworCQkJaWYgKGxlZnRPcCAhPSBOVUxMICYmIGVxdWFsKGxlZnRPcCwgcmlnaHRP cCkpCisJCQl7CisJCQkJTnVsbFRlc3QgKm51bGxUZXN0ID0gbWFrZU5vZGUoTnVsbFRlc3Qp OworCQkJCW51bGxUZXN0LT5hcmcgPSBsZWZ0T3A7CisJCQkJbnVsbFRlc3QtPm51bGx0ZXN0 dHlwZSA9IElTX05PVF9OVUxMOworCQkJCW51bGxUZXN0LT5hcmdpc3JvdyA9IGZhbHNlOwor CQkJCW51bGxUZXN0LT5sb2NhdGlvbiA9IC0xOworCQkJCXJpbmZvLT5jbGF1c2UgPSAoRXhw ciAqKSBudWxsVGVzdDsKKwkJCX0KKwkJfQorCisJCS8qIFNlYXJjaCBmb3IgZHVwbGljYXRl cy4gKi8KKwkJZm9yZWFjaChvdGhlckNlbGwsIHRhcmdldCkKKwkJeworCQkJUmVzdHJpY3RJ bmZvICpvdGhlciA9IGxmaXJzdF9ub2RlKFJlc3RyaWN0SW5mbywgb3RoZXJDZWxsKTsKKwor CQkJaWYgKG90aGVyID09IHJpbmZvIHx8CisJCQkJKHJpbmZvLT5wYXJlbnRfZWMgIT0gTlVM TAorCQkJCSAmJiBvdGhlci0+cGFyZW50X2VjID09IHJpbmZvLT5wYXJlbnRfZWMpCisJCQkJ IHx8IGVxdWFsKHJpbmZvLT5jbGF1c2UsIG90aGVyLT5jbGF1c2UpKQorCQkJeworCQkJCWJy ZWFrOworCQkJfQorCQl9CisKKwkJaWYgKG90aGVyQ2VsbCAhPSBOVUxMKQorCQkJLyogRHVw bGljYXRlIGZvdW5kICovCisJCQljb250aW51ZTsKKworCQl0YXJnZXQgPSBsYXBwZW5kKHRh cmdldCwgcmluZm8pOworCX0KKworCWxpc3RfZnJlZSh0b0tlZXAtPmJhc2VyZXN0cmljdGlu Zm8pOworCXRvS2VlcC0+YmFzZXJlc3RyaWN0aW5mbyA9IHRhcmdldDsKKworCS8qCisJICog VXBkYXRlIHRoZSBlcXVpdmFsZW5jZSBjbGFzc2VzIHRoYXQgcmVmZXJlbmNlIHRoZSByZW1v dmVkIHJlbGF0aW9ucy4KKwkgKi8KKwlmb3JlYWNoKGNlbGwsIHJvb3QtPmVxX2NsYXNzZXMp CisJeworCQlFcXVpdmFsZW5jZUNsYXNzICplYyA9IGxmaXJzdChjZWxsKTsKKworCQlpZiAo IWJtc19pc19tZW1iZXIodG9SZW1vdmUtPnJlbGlkLCBlYy0+ZWNfcmVsaWRzKSkKKwkJewor CQkJLyoKKwkJCSAqIFRoaXMgRUMgZG9lc24ndCByZWZlcmVuY2UgdGhlIHJlbW92ZWQgcmVs YXRpb24sIG5vdGhpbmcgdG8gYmUKKwkJCSAqIGRvbmUgZm9yIGl0LgorCQkJICovCisJCQlj b250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIFVwZGF0ZSB0aGUgRUMgbWVtYmVycyB0byBy ZWZlcmVuY2UgdGhlIHJlbWFpbmluZyByZWxhdGlvbiBpbnN0ZWFkCisJCSAqIG9mIHRoZSBy ZW1vdmVkIG9uZS4KKwkJICovCisJCXVwZGF0ZV9lY19tZW1iZXJzKGVjLCB0b1JlbW92ZS0+ cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCQllYy0+ZWNfcmVsaWRzID0gY2hhbmdlX3JlbGlk KGVjLT5lY19yZWxpZHMsIHRvUmVtb3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisKKwkJ LyoKKwkJICogV2Ugd2lsbCBub3cgdXBkYXRlIHNvdXJjZSBhbmQgZGVyaXZlZCBjbGF1c2Vz IG9mIHRoZSBFQy4KKwkJICoKKwkJICogUmVzdHJpY3Rpb24gY2xhdXNlcyBmb3IgYmFzZSBy ZWxhdGlvbnMgYXJlIGFscmVhZHkgZGlzdHJpYnV0ZWQgdG8KKwkJICogdGhlIHJlc3BlY3Rp dmUgYmFzZXJlc3RyaWN0aW5mbyBsaXN0cyAoc2VlCisJCSAqIGdlbmVyYXRlX2ltcGxpZWRf ZXF1YWxpdGllcykuIFRoZSBhYm92ZSBjb2RlIGhhcyBhbHJlYWR5IHByb2Nlc3NlZAorCQkg KiB0aGlzIGxpc3QsIGFuZCB1cGRhdGVkIHRoZXNlIGNsYXVzZXMgdG8gcmVmZXJlbmNlIHRo ZSByZW1haW5pbmcKKwkJICogcmVsYXRpb24sIHNvIHdlIGNhbiBza2lwIHRoZW0gaGVyZSBi YXNlZCBvbiB0aGVpciByZWxpZHMuCisJCSAqCisJCSAqIExpa2V3aXNlLCB3ZSBoYXZlIGFs cmVhZHkgcHJvY2Vzc2VkIHRoZSBqb2luIGNsYXVzZXMgdGhhdCBqb2luIHRoZQorCQkgKiBy ZW1vdmVkIHJlbGF0aW9uIHRvIHRoZSByZW1haW5pbmcgb25lLgorCQkgKgorCQkgKiBGaW5h bGx5LCB0aGVyZSBhcmUgam9pbiBjbGF1c2VzIHRoYXQgam9pbiB0aGUgcmVtb3ZlZCByZWxh dGlvbiB0bworCQkgKiBzb21lIHRoaXJkIHJlbGF0aW9uLiBXZSBjYW4ndCBqdXN0IGRlbGV0 ZSB0aGUgc291cmNlIGNsYXVzZXMgYW5kCisJCSAqIHJlZ2VuZXJhdGUgdGhlbSBmcm9tIHRo ZSBFQywgYmVjYXVzZSB0aGUgY29ycmVzcG9uZGluZyBlcXVhbGl0eQorCQkgKiBvcGVyYXRv cnMgbWlnaHQgYmUgbWlzc2luZyAoc2VlIHRoZSBoYW5kbGluZyBvZiBlY19icm9rZW4pLgor CQkgKiBUaGVyZWZvcmUsIHdlIHdpbGwgdXBkYXRlIHRoZSByZWZlcmVuY2VzIGluIHRoZSBz b3VyY2UgY2xhdXNlcy4KKwkJICoKKwkJICogRGVyaXZlZCBjbGF1c2VzIGNhbiBiZSBnZW5l cmF0ZWQgYWdhaW4sIHNvIGl0IGlzIHNpbXBsZXIgdG8ganVzdAorCQkgKiBkZWxldGUgdGhl bS4KKwkJICovCisJCWxpc3RfZnJlZShlYy0+ZWNfZGVyaXZlcyk7CisJCWVjLT5lY19kZXJp dmVzID0gTlVMTDsKKwkJdXBkYXRlX2VjX3NvdXJjZXMoJmVjLT5lY19zb3VyY2VzLCB0b1Jl bW92ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCX0KKworCS8qCisJICogVHJhbnNmZXIg dGhlIHRhcmdldGxpc3QgYW5kIGF0dHJfbmVlZGVkIGZsYWdzLgorCSAqLworCUFzc2VydCh0 b1JlbW92ZS0+cmVsdGFyZ2V0LT5zb3J0Z3JvdXByZWZzID09IDApOworCisJZm9yZWFjaCAo Y2VsbCwgdG9SZW1vdmUtPnJlbHRhcmdldC0+ZXhwcnMpCisJeworCQlFeHByICpub2RlID0g bGZpcnN0KGNlbGwpOworCQljaGFuZ2VfdmFybm8obm9kZSwgdG9SZW1vdmUtPnJlbGlkLCB0 b0tlZXAtPnJlbGlkKTsKKwkJaWYgKCFsaXN0X21lbWJlcih0b0tlZXAtPnJlbHRhcmdldC0+ ZXhwcnMsIG5vZGUpKQorCQkJdG9LZWVwLT5yZWx0YXJnZXQtPmV4cHJzID0gbGFwcGVuZCh0 b0tlZXAtPnJlbHRhcmdldC0+ZXhwcnMsIG5vZGUpOworCX0KKworCWZvciAoaSA9IHRvS2Vl cC0+bWluX2F0dHI7IGkgPD0gdG9LZWVwLT5tYXhfYXR0cjsgaSsrKQorCXsKKwkJaW50IGF0 dG5vID0gaSAtIHRvS2VlcC0+bWluX2F0dHI7CisJCXRvS2VlcC0+YXR0cl9uZWVkZWRbYXR0 bm9dID0gYm1zX2FkZF9tZW1iZXJzKHRvS2VlcC0+YXR0cl9uZWVkZWRbYXR0bm9dLAorCQkJ CQkJCQkJCQkJCSB0b1JlbW92ZS0+YXR0cl9uZWVkZWRbYXR0bm9dKTsKKwl9CisKKwkvKgor CSAqIElmIHRoZSByZW1vdmVkIHJlbGF0aW9uIGhhcyBhIHJvdyBtYXJrLCB0cmFuc2ZlciBp dCB0byB0aGUgcmVtYWluaW5nCisJICogb25lLgorCSAqCisJICogSWYgYm90aCByZWxzIGhh dmUgcm93IG1hcmtzLCBqdXN0IGtlZXAgdGhlIG9uZSBjb3JyZXNwb25kaW5nIHRvIHRoZQor CSAqIHJlbWFpbmluZyByZWxhdGlvbiwgYmVjYXVzZSB3ZSB2ZXJpZmllZCBlYXJsaWVyIHRo YXQgdGhleSBoYXZlIHRoZSBzYW1lCisJICogc3RyZW5ndGguCisJICoKKwkgKiBBbHNvIG1h a2Ugc3VyZSB0aGF0IHRoZSBzY3JhdGNoLT5yb3dfbWFya3MgY2FjaGUgaXMgdXAgdG8gZGF0 ZSwgYmVjYXVzZQorCSAqIHdlIGFyZSBnb2luZyB0byB1c2UgaXQgZm9yIGZ1cnRoZXIgam9p biByZW1vdmFscy4KKwkgKi8KKwlpZiAocm1hcmspCisJeworCQlpZiAoa21hcmspCisJCXsK KwkJCUFzc2VydChrbWFyay0+bWFya1R5cGUgPT0gcm1hcmstPm1hcmtUeXBlKTsKKworCQkJ cm9vdC0+cm93TWFya3MgPSBsaXN0X2RlbGV0ZV9wdHIocm9vdC0+cm93TWFya3MsIGttYXJr KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIFNob3VsZG4ndCBoYXZlIGluaGVyaXRhbmNl IGNoaWxkcmVuIGhlcmUuICovCisJCQlBc3NlcnQoa21hcmstPnJ0aSA9PSBrbWFyay0+cHJ0 aSk7CisKKwkJCXJtYXJrLT5ydGkgPSB0b0tlZXAtPnJlbGlkOworCQkJcm1hcmstPnBydGkg PSB0b0tlZXAtPnJlbGlkOworCQl9CisJfQorCisJLyoKKwkgKiBDaGFuZ2UgdmFybm8gaW4g c29tZSBzcGVjaWFsIGNhc2VzIHdpdGggbm9uLXRyaXZpYWwgUmFuZ2VUYmxFbnRyeQorCSAq LworCWZvcmVhY2goY2VsbCwgcm9vdC0+cGFyc2UtPnJ0YWJsZSkKKwl7CisJCVJhbmdlVGJs RW50cnkgKnJ0ZQk9IGxmaXJzdChjZWxsKTsKKworCQlzd2l0Y2gocnRlLT5ydGVraW5kKQor CQl7CisJCQljYXNlIFJURV9GVU5DVElPTjoKKwkJCQljaGFuZ2VfdmFybm8oKEV4cHIqKXJ0 ZS0+ZnVuY3Rpb25zLCB0b1JlbW92ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCQkJCWJy ZWFrOworCQkJY2FzZSBSVEVfVEFCTEVGVU5DOgorCQkJCWNoYW5nZV92YXJubygoRXhwciop cnRlLT50YWJsZWZ1bmMsIHRvUmVtb3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisJCQkJ YnJlYWs7CisJCQljYXNlIFJURV9WQUxVRVM6CisJCQkJY2hhbmdlX3Zhcm5vKChFeHByKily dGUtPnZhbHVlc19saXN0cywgdG9SZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlkKTsKKwkJ CQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLyogbm8gb3AgKi8KKwkJCQlicmVhazsKKwkJ fQorCX0KKworCS8qCisJICogUmVwbGFjZSB2YXJubyBpbiByb290IHRhcmdldGxpc3QgYW5k IEhBVklORyBjbGF1c2UuCisJICovCisJY2hhbmdlX3Zhcm5vKChFeHByICopIHJvb3QtPnBy b2Nlc3NlZF90bGlzdCwgdG9SZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlkKTsKKwljaGFu Z2VfdmFybm8oKEV4cHIgKikgcm9vdC0+cGFyc2UtPmhhdmluZ1F1YWwsIHRvUmVtb3ZlLT5y ZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisKKwkvKgorCSAqIFRyYW5zZmVyIGpvaW4gYW5kIHJl c3RyaWN0aW9uIGNsYXVzZXMgZnJvbSB0aGUgcmVtb3ZlZCByZWxhdGlvbiB0byB0aGUKKwkg KiByZW1haW5pbmcgb25lLiBXZSBjaGFuZ2UgdGhlIFZhcnMgb2YgdGhlIGNsYXVzZSB0byBw b2ludCB0byB0aGUKKwkgKiByZW1haW5pbmcgcmVsYXRpb24gaW5zdGVhZCBvZiB0aGUgcmVt b3ZlZCBvbmUuIFRoZSBjbGF1c2VzIHRoYXQgcmVxdWlyZQorCSAqIGEgc3Vic2V0IG9mIGpv aW5yZWxpZHMgYmVjb21lIHJlc3RyaWN0aW9uIGNsYXVzZXMgb2YgdGhlIHJlbWFpbmluZwor CSAqIHJlbGF0aW9uLCBhbmQgb3RoZXJzIHJlbWFpbiBqb2luIGNsYXVzZXMuIFdlIGFwcGVu ZCB0aGVtIHRvCisJICogYmFzZXJlc3RyaWN0aW5mbyBhbmQgam9pbmluZm8gcmVzcGVjdGl2 ZWx5LCB0cnlpbmcgbm90IHRvIGludHJvZHVjZQorCSAqIGR1cGxpY2F0ZXMuCisJICoKKwkg KiBXZSBhbHNvIGhhdmUgdG8gcHJvY2VzcyB0aGUgJ2pvaW5jbGF1c2VzJyBsaXN0IGhlcmUs IGJlY2F1c2UgaXQKKwkgKiBjb250YWlucyBFQy1kZXJpdmVkIGpvaW4gY2xhdXNlcyB3aGlj aCBtdXN0IGJlY29tZSBmaWx0ZXIgY2xhdXNlcy4gSXQKKwkgKiBpcyBub3QgZW5vdWdoIHRv IGp1c3QgY29ycmVjdCB0aGUgRUNzLCBiZWNhdXNlIHRoZSBFQy1kZXJpdmVkCisJICogcmVz dHJpY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYmVmb3JlIGpvaW4gcmVtb3ZhbCAoc2VlCisJICog Z2VuZXJhdGVfYmFzZV9pbXBsaWVkX2VxdWFsaXRpZXMpLgorCSAqLworfQorCisvKgorICog c3BsaXRfc2VsZmpvaW5fcXVhbHMKKyAqCQlQcm9jZXNzZXMgJ2pvaW5xdWFscycgYnVpbGRp bmcgdHdvIGxpc3RzLCBvbmUgd2l0aCBhIGxpc3Qgb2YgcXVhbHMKKyAqCQl3aGVyZSB0aGUg Y29sdW1ucy9leHBycyBvbiBlaXRoZXIgc2lkZSBvZiB0aGUgam9pbiBtYXRjaCBhbmQgYW5v dGhlcgorICoJCWxpc3QgY29udGFpbmluZyB0aGUgcmVtYWluaW5nIHF1YWxzLgorICoKKyAq ICdqb2lucXVhbHMnIG11c3Qgb25seSBjb250YWluIHF1YWxzIGZvciBhIFJURV9SRUxBVElP TiBiZWluZyBqb2luZWQgdG8KKyAqIGl0c2VsZi4KKyAqLworc3RhdGljIHZvaWQKK3NwbGl0 X3NlbGZqb2luX3F1YWxzKFBsYW5uZXJJbmZvICpyb290LCBMaXN0ICpqb2lucXVhbHMsIExp c3QgKipzZWxmam9pbnF1YWxzLAorCQkJCQkgTGlzdCAqKm90aGVyam9pbnF1YWxzKQorewor CUxpc3RDZWxsICpsYzsKKwlMaXN0CSAqc2pvaW5xdWFscyA9IE5JTDsKKwlMaXN0CSAqcmpv aW5xdWFscyA9IE5JTDsKKworCWZvcmVhY2gobGMsIGpvaW5xdWFscykKKwl7CisJCVJlc3Ry aWN0SW5mbwkqcmluZm8gPSAoUmVzdHJpY3RJbmZvICopIGxmaXJzdChsYyk7CisJCU9wRXhw cgkJCSpleHByOworCQlFeHByCQkJKmxlZnRleHByOworCQlFeHByCQkJKnJpZ2h0ZXhwcjsK KworCQlpZiAoYm1zX251bV9tZW1iZXJzKHJpbmZvLT5jbGF1c2VfcmVsaWRzKSAhPSAyIHx8 CisJCQlibXNfbnVtX21lbWJlcnMocmluZm8tPmxlZnRfcmVsaWRzKSAhPSAxIHx8CisJCQli bXNfbnVtX21lbWJlcnMocmluZm8tPnJpZ2h0X3JlbGlkcykgIT0gMSkKKwkJeworCQkJcmpv aW5xdWFscyA9IGxhcHBlbmQocmpvaW5xdWFscywgcmluZm8pOworCQkJY29udGludWU7CisJ CX0KKworCQlleHByID0gKE9wRXhwciAqKSByaW5mby0+Y2xhdXNlOworCisJCWlmICghSXNB KGV4cHIsIE9wRXhwcikgfHwgbGlzdF9sZW5ndGgoZXhwci0+YXJncykgIT0gMikKKwkJewor CQkJcmpvaW5xdWFscyA9IGxhcHBlbmQocmpvaW5xdWFscywgcmluZm8pOworCQkJY29udGlu dWU7CisJCX0KKworCQlsZWZ0ZXhwciA9IChFeHByICopIGNvcHlPYmplY3QoZ2V0X2xlZnRv cChyaW5mby0+Y2xhdXNlKSk7CisJCXJpZ2h0ZXhwciA9IChFeHByICopIGNvcHlPYmplY3Qo Z2V0X3JpZ2h0b3AocmluZm8tPmNsYXVzZSkpOworCisJCS8qIENhbid0IG1hdGNoIG9mIHRo ZSBleHBycyBhcmUgbm90IG9mIHRoZSBzYW1lIHR5cGUgKi8KKwkJaWYgKGxlZnRleHByLT50 eXBlICE9IHJpZ2h0ZXhwci0+dHlwZSkKKwkJeworCQkJcmpvaW5xdWFscyA9IGxhcHBlbmQo cmpvaW5xdWFscywgcmluZm8pOworCQkJY29udGludWU7CisJCX0KKworCQljaGFuZ2VfdmFy bm8ocmlnaHRleHByLAorCQkJCQkgYm1zX25leHRfbWVtYmVyKHJpbmZvLT5yaWdodF9yZWxp ZHMsIC0xKSwKKwkJCQkJIGJtc19uZXh0X21lbWJlcihyaW5mby0+bGVmdF9yZWxpZHMsIC0x KSk7CisKKwkJaWYgKGVxdWFsKGxlZnRleHByLCByaWdodGV4cHIpKQorCQkJc2pvaW5xdWFs cyA9IGxhcHBlbmQoc2pvaW5xdWFscywgcmluZm8pOworCQllbHNlCisJCQlyam9pbnF1YWxz ID0gbGFwcGVuZChyam9pbnF1YWxzLCByaW5mbyk7CisJfQorCisJKnNlbGZqb2lucXVhbHMg PSBzam9pbnF1YWxzOworCSpvdGhlcmpvaW5xdWFscyA9IHJqb2lucXVhbHM7Cit9CisKKy8q CisgKiBGaW5kIGFuZCByZW1vdmUgdW5pcXVlIHNlbGYgam9pbnMgaW4gYSBncm91cCBvZiBi YXNlIHJlbGF0aW9ucyB0aGF0IGhhdmUKKyAqIHRoZSBzYW1lIE9pZC4KKyAqCisgKiBSZXR1 cm5zIGEgc2V0IG9mIHJlbGlkcyB0aGF0IHdlcmUgcmVtb3ZlZC4KKyAqLworc3RhdGljIFJl bGlkcworcmVtb3ZlX3NlbGZfam9pbnNfb25lX2dyb3VwKFBsYW5uZXJJbmZvICpyb290LCBS ZWxpZHMgcmVsaWRzKQoreworCVJlbGlkcyBqb2lucmVsaWRzID0gTlVMTDsKKwlSZWxpZHMg cmVzdWx0ID0gTlVMTDsKKwlpbnQgazsgLyogSW5kZXggb2Yga2VwdCByZWxhdGlvbiAqLwor CWludCByID0gLTE7IC8qIEluZGV4IG9mIHJlbW92ZWQgcmVsYXRpb24gKi8KKworCWlmIChi bXNfbnVtX21lbWJlcnMocmVsaWRzKSA8IDIpCisJCXJldHVybiBOVUxMOworCisJd2hpbGUg KChyID0gYm1zX25leHRfbWVtYmVyKHJlbGlkcywgcikpID4gMCkKKwl7CisJCVJlbE9wdElu Zm8gKm91dGVyID0gcm9vdC0+c2ltcGxlX3JlbF9hcnJheVtyXTsKKwkJayA9IHI7CisKKwkJ d2hpbGUgKChrID0gYm1zX25leHRfbWVtYmVyKHJlbGlkcywgaykpID4gMCkKKwkJeworCQkJ UmVsT3B0SW5mbwkqaW5uZXIgPSByb290LT5zaW1wbGVfcmVsX2FycmF5W2tdOworCQkJTGlz dAkgICAqcmVzdHJpY3RsaXN0OworCQkJTGlzdAkgICAqc2VsZmpvaW5xdWFsczsKKwkJCUxp c3QJICAgKm90aGVyam9pbnF1YWxzOworCQkJTGlzdENlbGwJKmxjOworCQkJYm9vbAkJamlu Zm9fY2hlY2sgPSB0cnVlOworCQkJUGxhblJvd01hcmsJKm9tYXJrID0gTlVMTDsKKwkJCVBs YW5Sb3dNYXJrCSppbWFyayA9IE5VTEw7CisKKwkJCS8qIEEgc2FuaXR5IGNoZWNrOiB0aGUg cmVsYXRpb25zIGhhdmUgdGhlIHNhbWUgT2lkLiAqLworCQkJQXNzZXJ0KHJvb3QtPnNpbXBs ZV9ydGVfYXJyYXlba10tPnJlbGlkID09CisJCQkJICAgcm9vdC0+c2ltcGxlX3J0ZV9hcnJh eVtyXS0+cmVsaWQpOworCisJCQkvKgorCQkJICogSXQgaXMgaW1wb3NzaWJsZSB0byBvcHRp bWl6ZSB0d28gcmVsYXRpb25zIGlmIHRoZXkgYmVsb25nIHRvCisJCQkgKiBkaWZmZXJlbnQg cnVsZXMgb2Ygb3JkZXIgcmVzdHJpY3Rpb24uIE90aGVyd2lzZSBwbGFubmVyIGNhbid0CisJ CQkgKiBiZSBhYmxlIHRvIGZpbmQgYW55IHZhcmlhbnRzIG9mIGNvcnJlY3QgcXVlcnkgcGxh bi4KKwkJCSAqLworCQkJZm9yZWFjaChsYywgcm9vdC0+am9pbl9pbmZvX2xpc3QpCisJCQl7 CisJCQkJU3BlY2lhbEpvaW5JbmZvICppbmZvID0gKFNwZWNpYWxKb2luSW5mbyAqKSBsZmly c3QobGMpOworCisJCQkJaWYgKGJtc19pc19tZW1iZXIoaywgaW5mby0+c3luX2xlZnRoYW5k KSAmJgorCQkJCQkhYm1zX2lzX21lbWJlcihyLCBpbmZvLT5zeW5fbGVmdGhhbmQpKQorCQkJ CQlqaW5mb19jaGVjayA9IGZhbHNlOworCisJCQkJaWYgKGJtc19pc19tZW1iZXIoaywgaW5m by0+c3luX3JpZ2h0aGFuZCkgJiYKKwkJCQkJIWJtc19pc19tZW1iZXIociwgaW5mby0+c3lu X3JpZ2h0aGFuZCkpCisJCQkJCWppbmZvX2NoZWNrID0gZmFsc2U7CisKKwkJCQlpZiAoYm1z X2lzX21lbWJlcihyLCBpbmZvLT5zeW5fbGVmdGhhbmQpICYmCisJCQkJCSFibXNfaXNfbWVt YmVyKGssIGluZm8tPnN5bl9sZWZ0aGFuZCkpCisJCQkJCWppbmZvX2NoZWNrID0gZmFsc2U7 CisKKwkJCQlpZiAoYm1zX2lzX21lbWJlcihyLCBpbmZvLT5zeW5fcmlnaHRoYW5kKSAmJgor CQkJCQkhYm1zX2lzX21lbWJlcihrLCBpbmZvLT5zeW5fcmlnaHRoYW5kKSkKKwkJCQkJamlu Zm9fY2hlY2sgPSBmYWxzZTsKKworCQkJCWlmICghamluZm9fY2hlY2spCisJCQkJCWJyZWFr OworCQkJfQorCisJCQlpZiAoIWppbmZvX2NoZWNrKQorCQkJCWNvbnRpbnVlOworCisJCQkv KiBSZXVzZSBqb2lucmVsaWRzIGJpdHNldCB0byBhdm9pZCByZWFsbG9jYXRpb24uICovCisJ CQlqb2lucmVsaWRzID0gYm1zX2RlbF9tZW1iZXJzKGpvaW5yZWxpZHMsIGpvaW5yZWxpZHMp OworCisJCQkvKgorCQkJICogV2Ugb25seSBkZWFsIHdpdGggYmFzZSByZWxzIGhlcmUsIHNv IHRoZWlyIHJlbGlkcyBiaXRzZXQKKwkJCSAqIGNvbnRhaW5zIG9ubHkgb25lIG1lbWJlciAt LSB0aGVpciByZWxpZC4KKwkJCSAqLworCQkJam9pbnJlbGlkcyA9IGJtc19hZGRfbWVtYmVy KGpvaW5yZWxpZHMsIHIpOworCQkJam9pbnJlbGlkcyA9IGJtc19hZGRfbWVtYmVyKGpvaW5y ZWxpZHMsIGspOworCisJCQkvKiBJcyBpdCBhIHVuaXF1ZSBzZWxmIGpvaW4/ICovCisJCQly ZXN0cmljdGxpc3QgPSBidWlsZF9qb2lucmVsX3Jlc3RyaWN0bGlzdChyb290LCBqb2lucmVs aWRzLCBvdXRlciwKKwkJCQkJCQkJCQkJCQkgIGlubmVyKTsKKworCQkJLyoKKwkJCSAqIFBy b2Nlc3MgcmVzdHJpY3RsaXN0IHRvIHNlcGVyYXRlIG91dCB0aGUgc2VsZiBqb2luIHF1YWxz IGZyb20KKwkJCSAqIHRoZSBvdGhlciBxdWFscy4gZS5nIHggPSB4IGdvZXMgdG8gc2VsZmpv aW5xdWFscyBhbmQgYSA9IGIgdG8KKwkJCSAqIG90aGVyam9pbnF1YWxzLgorCQkJICovCisJ CQlzcGxpdF9zZWxmam9pbl9xdWFscyhyb290LCByZXN0cmljdGxpc3QsICZzZWxmam9pbnF1 YWxzLAorCQkJCQkJCQkgJm90aGVyam9pbnF1YWxzKTsKKworCQkJaWYgKGxpc3RfbGVuZ3Ro KHNlbGZqb2lucXVhbHMpID09IDApCisJCQl7CisJCQkJLyoKKwkJCQkgKiBYWFg6CisJCQkJ ICogd2Ugd291bGQgZGV0ZWN0IHNlbGYtam9pbiB3aXRob3V0IHF1YWxzIGxpa2UgJ3g9PXgn IGlmIHdlIGhhZAorCQkJCSAqIGFuIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgb24gc29tZSBv ZiBvdGhlciBxdWFscyBhbmQgdGhpcyBqb2luCisJCQkJICogaGF2ZW4ndCBhbnkgY29sdW1u cyBmcm9tIHRoZSBvdXRlciBpbiB0aGUgdGFyZ2V0IGxpc3QuCisJCQkJICogQnV0IGl0IGlz IHN0aWxsIGNvbXBsZXggdGFzay4KKwkJCQkgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwor CQkJLyoKKwkJCSAqIERldGVybWluZSBpZiB0aGUgaW5uZXIgdGFibGUgY2FuIGR1cGxpY2F0 ZSBvdXRlciByb3dzLiAgV2UgbXVzdAorCQkJICogYnlwYXNzIHRoZSB1bmlxdWUgcmVsIGNh Y2hlIGhlcmUgc2luY2Ugd2UncmUgcG9zc2libHkgdXNpbmcgYQorCQkJICogc3Vic2V0IG9m IGpvaW4gcXVhbHMuIFdlIGNhbiB1c2UgJ2ZvcmNlX2NhY2hlJyA9IHRydWUgd2hlbiBhbGwK KwkJCSAqIGpvaW4gcXVhbHMgYXJlIHNlbGZqb2luIHF1YWxzLiAgT3RoZXJ3aXNlIHdlIGNv dWxkIGVuZCB1cAorCQkJICogcHV0dGluZyBmYWxzZSBuZWdhdGl2ZXMgaW4gdGhlIGNhY2hl LgorCQkJICovCisJCQllbHNlIGlmICghaW5uZXJyZWxfaXNfdW5pcXVlKHJvb3QsIGpvaW5y ZWxpZHMsIG91dGVyLT5yZWxpZHMsCisJCQkJCQkJCQkJIGlubmVyLCBKT0lOX0lOTkVSLCBz ZWxmam9pbnF1YWxzLAorCQkJCQkJCQkJCSBsaXN0X2xlbmd0aChvdGhlcmpvaW5xdWFscykg PT0gMCkpCisJCQkJY29udGludWU7CisKKwkJCS8qIFNlZSBmb3Igcm93IG1hcmtzLiAqLwor CQkJZm9yZWFjaCAobGMsIHJvb3QtPnJvd01hcmtzKQorCQkJeworCQkJCVBsYW5Sb3dNYXJr ICpyb3dNYXJrID0gKFBsYW5Sb3dNYXJrICopIGxmaXJzdChsYyk7CisKKwkJCQlpZiAocm93 TWFyay0+cnRpID09IGspCisJCQkJeworCQkJCQlBc3NlcnQoaW1hcmsgPT0gTlVMTCk7CisJ CQkJCWltYXJrID0gcm93TWFyazsKKwkJCQl9CisJCQkJZWxzZSBpZiAocm93TWFyay0+cnRp ID09IHIpCisJCQkJeworCQkJCQlBc3NlcnQob21hcmsgPT0gTlVMTCk7CisJCQkJCW9tYXJr ID0gcm93TWFyazsKKwkJCQl9CisJCQl9CisKKwkJCS8qCisJCQkgKiBXZSBjYW4ndCByZW1v dmUgdGhlIGpvaW4gaWYgdGhlIHJlbGF0aW9ucyBoYXZlIHJvdyBtYXJrcyBvZgorCQkJICog ZGlmZmVyZW50IHN0cmVuZ3RoIChlLmcuIG9uZSBpcyBsb2NrZWQgRk9SIFVQREFURSBhbmQg YW5vdGhlcgorCQkJICoganVzdCBoYXMgUk9XX01BUktfUkVGRVJFTkNFIGZvciBFdmFsUGxh blF1YWwgcmVjaGVja2luZykuCisJCQkgKi8KKwkJCWlmIChvbWFyayAmJiBpbWFyayAmJiBv bWFyay0+bWFya1R5cGUgIT0gaW1hcmstPm1hcmtUeXBlKQorCQkJCWNvbnRpbnVlOworCisJ CQkvKgorCQkJICogQmUgc2FmZSB0byBkbyBub3QgcmVtb3ZlIHRhYmxlIHBhcnRpY2lwYXRl ZCBpbiBjb21wbGljYXRlZCBQSAorCQkJICovCisJCQlmb3JlYWNoKGxjLCByb290LT5wbGFj ZWhvbGRlcl9saXN0KQorCQkJeworCQkJCVBsYWNlSG9sZGVySW5mbyAqcGhpbmZvID0gKFBs YWNlSG9sZGVySW5mbyAqKSBsZmlyc3QobGMpOworCisJCQkJLyogdGhlcmUgaXNuJ3QgYW55 IG90aGVyIHBsYWNlIHRvIGV2YWwgUEhWICovCisJCQkJaWYgKGJtc19pc19zdWJzZXQocGhp bmZvLT5waF9ldmFsX2F0LCBqb2lucmVsaWRzKSB8fAorCQkJCQlibXNfaXNfc3Vic2V0KHBo aW5mby0+cGhfbmVlZGVkLCBqb2lucmVsaWRzKSkKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJ CWlmIChsYykKKwkJCQljb250aW51ZTsKKworCQkJLyoKKwkJCSAqIFdlIGNhbiByZW1vdmUg ZWl0aGVyIHJlbGF0aW9uLCBzbyByZW1vdmUgdGhlIG91dGVyIG9uZSwgdG8KKwkJCSAqIHNp bXBsaWZ5IHRoaXMgbG9vcC4KKwkJCSAqLworCisJCQkvKgorCQkJICogQWRkIGpvaW4gcmVz dHJpY3Rpb25zIHRvIGpvaW5pbmZvIG9mIHJlbW92aW5nIHJlbGF0aW9uIHRvIHNpbXBsaWZ5 CisJCQkgKiB0aGUgcmVsaWRzIHJlcGxhY2luZyBwcm9jZWR1cmUuCisJCQkgKi8KKwkJCW91 dGVyLT5qb2luaW5mbyA9IGxpc3RfY29uY2F0KG91dGVyLT5qb2luaW5mbywgcmVzdHJpY3Rs aXN0KTsKKworCQkJLyogRmlyc3RseSwgcmVwbGFjZSBpbmRleCBvZiBleGNsdWRpbmcgcmVs YXRpb24gd2l0aCBrZWVwaW5nLiAqLworCQkJcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KHJvb3Qs IG91dGVyLT5yZWxpZCwgam9pbnJlbGlkcywgaW5uZXItPnJlbGlkKTsKKworCQkJLyogU2Vj b25kbHksIGZpeCByZXN0cmljdGlvbnMgb2Yga2VlcGluZyByZWxhdGlvbiAqLworCQkJcmVt b3ZlX3NlbGZfam9pbl9yZWwocm9vdCwgaW1hcmssIG9tYXJrLCBpbm5lciwgb3V0ZXIpOwor CQkJcmVzdWx0ID0gYm1zX2FkZF9tZW1iZXIocmVzdWx0LCByKTsKKworCQkJLyogV2UgcmVt b3ZlZCB0aGUgb3V0ZXIgcmVsYXRpb24sIHRyeSB0aGUgbmV4dCBvbmUuICovCisJCQlicmVh azsKKwkJfQorCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBJdGVyYXRpdmVs eSBmb3JtIGEgZ3JvdXAgb2YgcmVsYXRpb24gaW5kZXhlcyB3aXRoIHRoZSBzYW1lIG9pZCBh bmQgbGF1bmNoCisgKiB0aGUgcm91dGluZSB0aGF0IGRldGVjdHMgc2VsZi1qb2lucyBpbiB0 aGlzIGdyb3VwIGFuZCByZW1vdmVzIGV4Y2Vzc2l2ZQorICogcmFuZ2UgdGFibGUgZW50cmll cy4KKyAqCisgKiBBdCB0aGUgZW5kIG9mIGl0ZXJhdGlvbiwgZXhjbHVkZSB0aGUgZ3JvdXAg ZnJvbSB0aGUgb3ZlcmFsbCByZWxpZHMgbGlzdC4KKyAqIFNvIGVhY2ggbmV4dCBpdGVyYXRp b24gb2YgdGhlIGN5Y2xlIHdpbGwgaW52b2x2ZSBsZXNzIGFuZCBsZXNzIHZhbHVlIG9mCisg KiByZWxpZHMuCisgKi8KK3N0YXRpYyBSZWxpZHMKK3JlbW92ZV9zZWxmX2pvaW5zX29uZV9s ZXZlbChQbGFubmVySW5mbyAqcm9vdCwgUmVsaWRzIHJlbGlkcywgUmVsaWRzIFRvUmVtb3Zl KQoreworCXdoaWxlICghYm1zX2lzX2VtcHR5KHJlbGlkcykpCisJeworCQlSZWxpZHMgZ3Jv dXAgPSBOVUxMOworCQlPaWQgZ3JvdXBPaWQ7CisJCWludCBpOworCisJCWkgPSBibXNfZmly c3RfbWVtYmVyKHJlbGlkcyk7CisJCWdyb3VwT2lkID0gcm9vdC0+c2ltcGxlX3J0ZV9hcnJh eVtpXS0+cmVsaWQ7CisJCUFzc2VydChPaWRJc1ZhbGlkKGdyb3VwT2lkKSk7CisJCWdyb3Vw ID0gYm1zX2FkZF9tZW1iZXIoZ3JvdXAsIGkpOworCisJCS8qIENyZWF0ZSBncm91cCBvZiBy ZWxhdGlvbiBpbmRleGVzIHdpdGggdGhlIHNhbWUgb2lkLiAqLworCQl3aGlsZSAoKGkgPSBi bXNfbmV4dF9tZW1iZXIocmVsaWRzLCBpKSkgPiAwKQorCQl7CisJCQlSYW5nZVRibEVudHJ5 ICpydGUgPSByb290LT5zaW1wbGVfcnRlX2FycmF5W2ldOworCisJCQlBc3NlcnQoT2lkSXNW YWxpZChydGUtPnJlbGlkKSk7CisKKwkJCWlmIChydGUtPnJlbGlkID09IGdyb3VwT2lkKQor CQkJCWdyb3VwID0gYm1zX2FkZF9tZW1iZXIoZ3JvdXAsIGkpOworCQl9CisKKwkJcmVsaWRz ID0gYm1zX2RlbF9tZW1iZXJzKHJlbGlkcywgZ3JvdXApOworCQlUb1JlbW92ZSA9IGJtc19h ZGRfbWVtYmVycyhUb1JlbW92ZSwKKwkJCQkJCQkJICAgcmVtb3ZlX3NlbGZfam9pbnNfb25l X2dyb3VwKHJvb3QsIGdyb3VwKSk7CisJCWJtc19mcmVlKGdyb3VwKTsKKwl9CisJcmV0dXJu IFRvUmVtb3ZlOworfQorCisvKgorICogRm9yIGVhY2ggbGV2ZWwgb2Ygam9pbmxpc3QgZm9y bSBhIHNldCBvZiBiYXNlIHJlbGF0aW9ucyBhbmQgbGF1bmNoIHRoZQorICogcm91dGluZSBv ZiB0aGUgc2VsZi1qb2luIHJlbW92YWwgb3B0aW1pemF0aW9uLiBSZWN1cnNlIGludG8gc3Vi LWpvaW5saXN0cyB0bworICogaGFuZGxlIGRlZXBlciBsZXZlbHMuCisgKi8KK3N0YXRpYyBS ZWxpZHMKK3JlbW92ZV9zZWxmX2pvaW5zX3JlY3Vyc2UoUGxhbm5lckluZm8gKnJvb3QsIExp c3QgKmpvaW5saXN0LCBSZWxpZHMgVG9SZW1vdmUpCit7CisJTGlzdENlbGwgKmxjOworCVJl bGlkcyByZWxpZHMgPSBOVUxMOworCisJLyogQ29sbGVjdCB0aGUgaWRzIG9mIGJhc2UgcmVs YXRpb25zIGF0IG9uZSBsZXZlbCBvZiB0aGUgam9pbiB0cmVlLiAqLworCWZvcmVhY2ggKGxj LCBqb2lubGlzdCkKKwl7CisJCXN3aXRjaCAoKChOb2RlICopIGxmaXJzdChsYykpLT50eXBl KQorCQl7CisJCQljYXNlIFRfTGlzdDoKKwkJCQkvKiBSZWN1cnNpdmVseSBnbyBpbnNpZGUg dGhlIHN1Yi1qb2lubGlzdCAqLworCQkJCVRvUmVtb3ZlID0gcmVtb3ZlX3NlbGZfam9pbnNf cmVjdXJzZShyb290LAorCQkJCQkJCQkJCQkJCSAoTGlzdCAqKSBsZmlyc3QobGMpLAorCQkJ CQkJCQkJCQkJCSBUb1JlbW92ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRfUmFuZ2VUYmxS ZWY6CisJCQl7CisJCQkJUmFuZ2VUYmxSZWYgKnJlZiA9IChSYW5nZVRibFJlZiAqKSBsZmly c3QobGMpOworCQkJCVJhbmdlVGJsRW50cnkgKnJ0ZSA9IHJvb3QtPnNpbXBsZV9ydGVfYXJy YXlbcmVmLT5ydGluZGV4XTsKKworCQkJCS8qCisJCQkJICogV2Ugb25seSBjYXJlIGFib3V0 IGJhc2UgcmVsYXRpb25zIGZyb20gd2hpY2ggd2Ugc2VsZWN0CisJCQkJICogc29tZXRoaW5n LgorCQkJCSAqLworCQkJCWlmIChydGUtPnJ0ZWtpbmQgIT0gUlRFX1JFTEFUSU9OIHx8CisJ CQkJCXJ0ZS0+cmVsa2luZCAhPSBSRUxLSU5EX1JFTEFUSU9OIHx8CisJCQkJCXJvb3QtPnNp bXBsZV9yZWxfYXJyYXlbcmVmLT5ydGluZGV4XSA9PSBOVUxMKQorCQkJCQlicmVhazsKKwor CQkJCUFzc2VydCghYm1zX2lzX21lbWJlcihyZWYtPnJ0aW5kZXgsIHJlbGlkcykpOworCQkJ CXJlbGlkcyA9IGJtc19hZGRfbWVtYmVyKHJlbGlkcywgcmVmLT5ydGluZGV4KTsKKworCQkJ CS8qCisJCQkJICogTGltaXQgdGhlIG51bWJlciBvZiBqb2lucyB3ZSBwcm9jZXNzIHRvIGNv bnRyb2wgdGhlIHF1YWRyYXRpYworCQkJCSAqIGJlaGF2aW9yLgorCQkJCSAqLworCQkJCWlm IChibXNfbnVtX21lbWJlcnMocmVsaWRzKSA+IGpvaW5fY29sbGFwc2VfbGltaXQpCisJCQkJ CWJyZWFrOworCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlBc3NlcnQoZmFs c2UpOworCQl9CisJfQorCisJaWYgKGJtc19udW1fbWVtYmVycyhyZWxpZHMpID49IDIpCisJ CVRvUmVtb3ZlID0gcmVtb3ZlX3NlbGZfam9pbnNfb25lX2xldmVsKHJvb3QsIHJlbGlkcywg VG9SZW1vdmUpOworCisJYm1zX2ZyZWUocmVsaWRzKTsKKwlyZXR1cm4gVG9SZW1vdmU7Cit9 CisKKy8qCisgKiBGaW5kIGFuZCByZW1vdmUgdXNlbGVzcyBzZWxmIGpvaW5zLgorICoKKyAq IFdlIHNlYXJjaCBmb3Igam9pbnMgd2hlcmUgdGhlIHNhbWUgcmVsYXRpb24gaXMgam9pbmVk IHRvIGl0c2VsZiBvbiBhbGwKKyAqIGNvbHVtbnMgb2Ygc29tZSB1bmlxdWUgaW5kZXguIElm IHRoaXMgY29uZGl0aW9uIGhvbGRzLCB0aGVuLCBmb3IKKyAqIGVhY2ggb3V0ZXIgcm93LCBv bmx5IG9uZSBpbm5lciByb3cgbWF0Y2hlcywgYW5kIGl0IGlzIHRoZSBzYW1lIHJvdworICog b2YgdGhlIHNhbWUgcmVsYXRpb24uIFRoaXMgYWxsb3dzIHVzIHRvIHJlbW92ZSB0aGUgam9p biBhbmQgcmVwbGFjZQorICogaXQgd2l0aCBhIHNjYW4gdGhhdCBjb21iaW5lcyBXSEVSRSBj bGF1c2VzIGZyb20gYm90aCBzaWRlcy4gVGhlIGpvaW4KKyAqIGNsYXVzZXMgdGhlbXNlbHZl cyBhc3N1bWUgdGhlIGZvcm0gb2YgWCA9IFggYW5kIGNhbiBiZSByZXBsYWNlZCB3aXRoCisg KiBOT1QgTlVMTCBjbGF1c2VzLgorICoKKyAqIEZvciB0aGUgc2FrZSBvZiBzaW1wbGljaXR5 LCB3ZSBkb24ndCBhcHBseSB0aGlzIG9wdGltaXphdGlvbiB0byBzcGVjaWFsCisgKiBqb2lu cy4gSGVyZSBpcyBhIGxpc3Qgb2Ygd2hhdCB3ZSBjb3VsZCBkbyBpbiBzb21lIHBhcnRpY3Vs YXIgY2FzZXM6CisgKiAnYSBhMSBzZW1pIGpvaW4gYSBhMic6IGlzIHJlZHVjZWQgdG8gaW5u ZXIgYnkgcmVkdWNlX3VuaXF1ZV9zZW1pam9pbnMsCisgKiBhbmQgdGhlbiByZW1vdmVkIG5v cm1hbGx5LgorICogJ2EgYTEgYW50aSBqb2luIGEgYTInOiBjb3VsZCBzaW1wbGlmeSB0byBh IHNjYW4gd2l0aCAnb3V0ZXIgcXVhbHMgQU5ECisgKiAoSVMgTlVMTCBvbiBqb2luIGNvbHVt bnMgT1IgTk9UIGlubmVyIHF1YWxzKScuCisgKiAnYSBhMSBsZWZ0IGpvaW4gYSBhMic6IGNv dWxkIHNpbXBsaWZ5IHRvIGEgc2NhbiBsaWtlIGlubmVyLCBidXQgd2l0aG91dAorICogTk9U IE5VTEwgY29uZGl0aW9ucyBvbiBqb2luIGNvbHVtbnMuCisgKiAnYSBhMSBsZWZ0IGpvaW4g KGEgYTIgam9pbiBiKSc6IGNhbid0IHNpbXBsaWZ5IHRoaXMsIGJlY2F1c2Ugam9pbiB0byBi CisgKiBjYW4gYm90aCByZW1vdmUgcm93cyBhbmQgaW50cm9kdWNlIGR1cGxpY2F0ZXMuCisg KgorICogVG8gc2VhcmNoIGZvciByZW1vdmFibGUgam9pbnMsIHdlIG9yZGVyIGFsbCB0aGUg cmVsYXRpb25zIG9uIHRoZWlyIE9pZCwKKyAqIGdvIG92ZXIgZWFjaCBzZXQgd2l0aCB0aGUg c2FtZSBPaWQsIGFuZCBjb25zaWRlciBlYWNoIHBhaXIgb2YgcmVsYXRpb25zCisgKiBpbiB0 aGlzIHNldC4gV2UgY2hlY2sgdGhhdCBib3RoIHJlbGF0aW9uIGFyZSBtYWRlIHVuaXF1ZSBi eSB0aGUgc2FtZQorICogdW5pcXVlIGluZGV4IHdpdGggdGhlIHNhbWUgY2xhdXNlcy4KKyAq CisgKiBUbyByZW1vdmUgdGhlIGpvaW4sIHdlIG1hcmsgb25lIG9mIHRoZSBwYXJ0aWNpcGF0 aW5nIHJlbGF0aW9ucyBhcworICogZGVhZCwgYW5kIHJld3JpdGUgYWxsIHJlZmVyZW5jZXMg dG8gaXQgdG8gcG9pbnQgdG8gdGhlIHJlbWFpbmluZworICogcmVsYXRpb24uIFRoaXMgaW5j bHVkZXMgbW9kaWZ5aW5nIFJlc3RyaWN0SW5mb3MsIEVxdWl2YWxlbmNlQ2xhc3NlcyBhbmQK KyAqIEVxdWl2YWxlbmNlTWVtYmVycy4gV2UgYWxzbyBoYXZlIHRvIG1vZGlmeSB0aGUgcm93 IG1hcmtzLiBUaGUgam9pbiBjbGF1c2VzCisgKiBvZiB0aGUgcmVtb3ZlZCByZWxhdGlvbiBi ZWNvbWUgZWl0aGVyIHJlc3RyaWN0aW9uIG9yIGpvaW4gY2xhdXNlcywgYmFzZWQgb24KKyAq IHdoZXRoZXIgdGhleSByZWZlcmVuY2UgYW55IHJlbGF0aW9ucyBub3QgcGFydGljaXBhdGlu ZyBpbiB0aGUgcmVtb3ZlZCBqb2luLgorICoKKyAqICd0YXJnZXRsaXN0JyBpcyB0aGUgdG9w LWxldmVsIHRhcmdldGxpc3Qgb2YgcXVlcnkuIElmIGl0IGhhcyBhbnkgcmVmZXJlbmNlcwor ICogdG8gdGhlIHJlbW92ZWQgcmVsYXRpb25zLCB3ZSB1cGRhdGUgdGhlbSB0byBwb2ludCB0 byB0aGUgcmVtYWluaW5nIG9uZXMuCisgKi8KK0xpc3QgKgorcmVtb3ZlX3VzZWxlc3Nfc2Vs Zl9qb2lucyhQbGFubmVySW5mbyAqcm9vdCwgTGlzdCAqam9pbmxpc3QpCit7CisJUmVsaWRz IFRvUmVtb3ZlID0gTlVMTDsKKwlpbnQgcmVsaWQgPSAtMTsKKworCWlmICghZW5hYmxlX3Nl bGZfam9pbl9yZW1vdmFsKQorCQlyZXR1cm4gam9pbmxpc3Q7CisKKwkvKgorCSAqIE1lcmdl IHBhaXJzIG9mIHJlbGF0aW9ucyBwYXJ0aWNpcGF0ZWQgaW4gc2VsZi1qb2luLiBSZW1vdmUK KwkgKiB1bm5lY2Vzc2FyeSByYW5nZSB0YWJsZSBlbnRyaWVzLgorCSAqLworCVRvUmVtb3Zl ID0gcmVtb3ZlX3NlbGZfam9pbnNfcmVjdXJzZShyb290LCBqb2lubGlzdCwgVG9SZW1vdmUp OworCXdoaWxlICgocmVsaWQgPSBibXNfbmV4dF9tZW1iZXIoVG9SZW1vdmUsIHJlbGlkKSkg Pj0gMCkKKwl7CisJCWludCBucmVtb3ZlZCA9IDA7CisJCWpvaW5saXN0ID0gcmVtb3ZlX3Jl bF9mcm9tX2pvaW5saXN0KGpvaW5saXN0LCByZWxpZCwgJm5yZW1vdmVkKTsKKwl9CisKKwly ZXR1cm4gam9pbmxpc3Q7Cit9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIv cGxhbi9wbGFubWFpbi5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vcGxhbm1haW4u YwppbmRleCAyNzNhYzBhY2Y3Li4yOGE1NWIwZjQyIDEwMDY0NAotLS0gYS9zcmMvYmFja2Vu ZC9vcHRpbWl6ZXIvcGxhbi9wbGFubWFpbi5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXpl ci9wbGFuL3BsYW5tYWluLmMKQEAgLTIyNiw2ICsyMjYsMTEgQEAgcXVlcnlfcGxhbm5lcihQ bGFubmVySW5mbyAqcm9vdCwKIAkgKi8KIAlyZWR1Y2VfdW5pcXVlX3NlbWlqb2lucyhyb290 KTsKIAorCS8qCisJICogUmVtb3ZlIHNlbGYgam9pbnMgb24gYSB1bmlxdWUgY29sdW1uLgor CSAqLworCWpvaW5saXN0ID0gcmVtb3ZlX3VzZWxlc3Nfc2VsZl9qb2lucyhyb290LCBqb2lu bGlzdCk7CisKIAkvKgogCSAqIE5vdyBkaXN0cmlidXRlICJwbGFjZWhvbGRlcnMiIHRvIGJh c2UgcmVscyBhcyBuZWVkZWQuICBUaGlzIGhhcyB0byBiZQogCSAqIGRvbmUgYWZ0ZXIgam9p biByZW1vdmFsIGJlY2F1c2UgcmVtb3ZhbCBjb3VsZCBjaGFuZ2Ugd2hldGhlciBhCmRpZmYg LS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9qb2luaW5mby5jIGIvc3JjL2Jh Y2tlbmQvb3B0aW1pemVyL3V0aWwvam9pbmluZm8uYwppbmRleCA3MTc4MDhiMDM3Li4zODU5 YjQ4NDNhIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9qb2luaW5m by5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL2pvaW5pbmZvLmMKQEAgLTEz MCw2ICsxMzAsOSBAQCByZW1vdmVfam9pbl9jbGF1c2VfZnJvbV9yZWxzKFBsYW5uZXJJbmZv ICpyb290LAogCXsKIAkJUmVsT3B0SW5mbyAqcmVsID0gZmluZF9iYXNlX3JlbChyb290LCBj dXJfcmVsaWQpOwogCisJCWlmICghbGlzdF9tZW1iZXJfcHRyKHJlbC0+am9pbmluZm8sIHJl c3RyaWN0aW5mbykpCisJCQljb250aW51ZTsKKwogCQkvKgogCQkgKiBSZW1vdmUgdGhlIHJl c3RyaWN0aW5mbyBmcm9tIHRoZSBsaXN0LiAgUG9pbnRlciBjb21wYXJpc29uIGlzCiAJCSAq IHN1ZmZpY2llbnQuCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9y ZWxub2RlLmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9yZWxub2RlLmMKaW5kZXgg ZTEwNWE0ZDVmMS4uOGFhODk5Mzc0OSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1p emVyL3V0aWwvcmVsbm9kZS5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3Jl bG5vZGUuYwpAQCAtNDAsMTQgKzQwLDEwIEBAIHR5cGVkZWYgc3RydWN0IEpvaW5IYXNoRW50 cnkKIAogc3RhdGljIHZvaWQgYnVpbGRfam9pbnJlbF90bGlzdChQbGFubmVySW5mbyAqcm9v dCwgUmVsT3B0SW5mbyAqam9pbnJlbCwKIAkJCQkJCQkJUmVsT3B0SW5mbyAqaW5wdXRfcmVs KTsKLXN0YXRpYyBMaXN0ICpidWlsZF9qb2lucmVsX3Jlc3RyaWN0bGlzdChQbGFubmVySW5m byAqcm9vdCwKLQkJCQkJCQkJCQlSZWxPcHRJbmZvICpqb2lucmVsLAotCQkJCQkJCQkJCVJl bE9wdEluZm8gKm91dGVyX3JlbCwKLQkJCQkJCQkJCQlSZWxPcHRJbmZvICppbm5lcl9yZWwp Owogc3RhdGljIHZvaWQgYnVpbGRfam9pbnJlbF9qb2lubGlzdChSZWxPcHRJbmZvICpqb2lu cmVsLAogCQkJCQkJCQkgICBSZWxPcHRJbmZvICpvdXRlcl9yZWwsCiAJCQkJCQkJCSAgIFJl bE9wdEluZm8gKmlubmVyX3JlbCk7Ci1zdGF0aWMgTGlzdCAqc3ViYnVpbGRfam9pbnJlbF9y ZXN0cmljdGxpc3QoUmVsT3B0SW5mbyAqam9pbnJlbCwKK3N0YXRpYyBMaXN0ICpzdWJidWls ZF9qb2lucmVsX3Jlc3RyaWN0bGlzdChSZWxpZHMgam9pbnJlbGlkcywKIAkJCQkJCQkJCQkg ICBMaXN0ICpqb2luaW5mb19saXN0LAogCQkJCQkJCQkJCSAgIExpc3QgKm5ld19yZXN0cmlj dGxpc3QpOwogc3RhdGljIExpc3QgKnN1YmJ1aWxkX2pvaW5yZWxfam9pbmxpc3QoUmVsT3B0 SW5mbyAqam9pbnJlbCwKQEAgLTU5OSw3ICs1OTUsNyBAQCBidWlsZF9qb2luX3JlbChQbGFu bmVySW5mbyAqcm9vdCwKIAkJICovCiAJCWlmIChyZXN0cmljdGxpc3RfcHRyKQogCQkJKnJl c3RyaWN0bGlzdF9wdHIgPSBidWlsZF9qb2lucmVsX3Jlc3RyaWN0bGlzdChyb290LAotCQkJ CQkJCQkJCQkJCQkgICBqb2lucmVsLAorCQkJCQkJCQkJCQkJCQkgICBqb2lucmVsLT5yZWxp ZHMsCiAJCQkJCQkJCQkJCQkJCSAgIG91dGVyX3JlbCwKIAkJCQkJCQkJCQkJCQkJICAgaW5u ZXJfcmVsKTsKIAkJcmV0dXJuIGpvaW5yZWw7CkBAIC03MDUsNyArNzAxLDcgQEAgYnVpbGRf am9pbl9yZWwoUGxhbm5lckluZm8gKnJvb3QsCiAJICogY2FsbGVyIG1pZ2h0IG9yIG1pZ2h0 IG5vdCBuZWVkIHRoZSByZXN0cmljdGxpc3QsIGJ1dCBJIG5lZWQgaXQgYW55d2F5CiAJICog Zm9yIHNldF9qb2lucmVsX3NpemVfZXN0aW1hdGVzKCkuKQogCSAqLwotCXJlc3RyaWN0bGlz dCA9IGJ1aWxkX2pvaW5yZWxfcmVzdHJpY3RsaXN0KHJvb3QsIGpvaW5yZWwsCisJcmVzdHJp Y3RsaXN0ID0gYnVpbGRfam9pbnJlbF9yZXN0cmljdGxpc3Qocm9vdCwgam9pbnJlbC0+cmVs aWRzLAogCQkJCQkJCQkJCQkgIG91dGVyX3JlbCwgaW5uZXJfcmVsKTsKIAlpZiAocmVzdHJp Y3RsaXN0X3B0cikKIAkJKnJlc3RyaWN0bGlzdF9wdHIgPSByZXN0cmljdGxpc3Q7CkBAIC0x MDU2LDcgKzEwNTIsNyBAQCBidWlsZF9qb2lucmVsX3RsaXN0KFBsYW5uZXJJbmZvICpyb290 LCBSZWxPcHRJbmZvICpqb2lucmVsLAogICoJICB0aGUgdmFyaW91cyBqb2lubGlzdCBlbnRy aWVzIHVsdGltYXRlbHkgcmVmZXIgdG8gUmVzdHJpY3RJbmZvcwogICoJICBwdXNoZWQgaW50 byB0aGVtIGJ5IGRpc3RyaWJ1dGVfcmVzdHJpY3RpbmZvX3RvX3JlbHMoKS4KICAqCi0gKiAn am9pbnJlbCcgaXMgYSBqb2luIHJlbGF0aW9uIG5vZGUKKyAqICdqb2lucmVsaWRzJyBpcyBh IGpvaW4gcmVsYXRpb24gaWQgc2V0CiAgKiAnb3V0ZXJfcmVsJyBhbmQgJ2lubmVyX3JlbCcg YXJlIGEgcGFpciBvZiByZWxhdGlvbnMgdGhhdCBjYW4gYmUgam9pbmVkCiAgKgkJdG8gZm9y bSBqb2lucmVsLgogICoKQEAgLTEwNjksOSArMTA2NSw5IEBAIGJ1aWxkX2pvaW5yZWxfdGxp c3QoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKmpvaW5yZWwsCiAgKiBSZXN0cmlj dEluZm8gbm9kZXMgYXJlIG5vIGxvbmdlciBjb250ZXh0LWRlcGVuZGVudC4gIEluc3RlYWQs IGp1c3QgaW5jbHVkZQogICogdGhlIG9yaWdpbmFsIG5vZGVzIGluIHRoZSBsaXN0cyBtYWRl IGZvciB0aGUgam9pbiByZWxhdGlvbi4KICAqLwotc3RhdGljIExpc3QgKgorTGlzdCAqCiBi dWlsZF9qb2lucmVsX3Jlc3RyaWN0bGlzdChQbGFubmVySW5mbyAqcm9vdCwKLQkJCQkJCSAg IFJlbE9wdEluZm8gKmpvaW5yZWwsCisJCQkJCQkgICBSZWxpZHMgam9pbnJlbGlkcywKIAkJ CQkJCSAgIFJlbE9wdEluZm8gKm91dGVyX3JlbCwKIAkJCQkJCSAgIFJlbE9wdEluZm8gKmlu bmVyX3JlbCkKIHsKQEAgLTEwODIsOCArMTA3OCw4IEBAIGJ1aWxkX2pvaW5yZWxfcmVzdHJp Y3RsaXN0KFBsYW5uZXJJbmZvICpyb290LAogCSAqIGVsaW1pbmF0aW5nIGFueSBkdXBsaWNh dGVzIChpbXBvcnRhbnQgc2luY2Ugd2Ugd2lsbCBzZWUgbWFueSBvZiB0aGUKIAkgKiBzYW1l IGNsYXVzZXMgYXJyaXZpbmcgZnJvbSBib3RoIGlucHV0IHJlbGF0aW9ucykuCiAJICovCi0J cmVzdWx0ID0gc3ViYnVpbGRfam9pbnJlbF9yZXN0cmljdGxpc3Qoam9pbnJlbCwgb3V0ZXJf cmVsLT5qb2luaW5mbywgTklMKTsKLQlyZXN1bHQgPSBzdWJidWlsZF9qb2lucmVsX3Jlc3Ry aWN0bGlzdChqb2lucmVsLCBpbm5lcl9yZWwtPmpvaW5pbmZvLCByZXN1bHQpOworCXJlc3Vs dCA9IHN1YmJ1aWxkX2pvaW5yZWxfcmVzdHJpY3RsaXN0KGpvaW5yZWxpZHMsIG91dGVyX3Jl bC0+am9pbmluZm8sIE5JTCk7CisJcmVzdWx0ID0gc3ViYnVpbGRfam9pbnJlbF9yZXN0cmlj dGxpc3Qoam9pbnJlbGlkcywgaW5uZXJfcmVsLT5qb2luaW5mbywgcmVzdWx0KTsKIAogCS8q CiAJICogQWRkIG9uIGFueSBjbGF1c2VzIGRlcml2ZWQgZnJvbSBFcXVpdmFsZW5jZUNsYXNz ZXMuICBUaGVzZSBjYW5ub3QgYmUKQEAgLTEwOTIsNyArMTA4OCw3IEBAIGJ1aWxkX2pvaW5y ZWxfcmVzdHJpY3RsaXN0KFBsYW5uZXJJbmZvICpyb290LAogCSAqLwogCXJlc3VsdCA9IGxp c3RfY29uY2F0KHJlc3VsdCwKIAkJCQkJCSBnZW5lcmF0ZV9qb2luX2ltcGxpZWRfZXF1YWxp dGllcyhyb290LAotCQkJCQkJCQkJCQkJCQkgIGpvaW5yZWwtPnJlbGlkcywKKwkJCQkJCQkJ CQkJCQkJICBqb2lucmVsaWRzLAogCQkJCQkJCQkJCQkJCQkgIG91dGVyX3JlbC0+cmVsaWRz LAogCQkJCQkJCQkJCQkJCQkgIGlubmVyX3JlbCkpOwogCkBAIC0xMTE4LDcgKzExMTQsNyBA QCBidWlsZF9qb2lucmVsX2pvaW5saXN0KFJlbE9wdEluZm8gKmpvaW5yZWwsCiB9CiAKIHN0 YXRpYyBMaXN0ICoKLXN1YmJ1aWxkX2pvaW5yZWxfcmVzdHJpY3RsaXN0KFJlbE9wdEluZm8g KmpvaW5yZWwsCitzdWJidWlsZF9qb2lucmVsX3Jlc3RyaWN0bGlzdChSZWxpZHMgam9pbnJl bGlkcywKIAkJCQkJCQkgIExpc3QgKmpvaW5pbmZvX2xpc3QsCiAJCQkJCQkJICBMaXN0ICpu ZXdfcmVzdHJpY3RsaXN0KQogewpAQCAtMTEyOCw3ICsxMTI0LDcgQEAgc3ViYnVpbGRfam9p bnJlbF9yZXN0cmljdGxpc3QoUmVsT3B0SW5mbyAqam9pbnJlbCwKIAl7CiAJCVJlc3RyaWN0 SW5mbyAqcmluZm8gPSAoUmVzdHJpY3RJbmZvICopIGxmaXJzdChsKTsKIAotCQlpZiAoYm1z X2lzX3N1YnNldChyaW5mby0+cmVxdWlyZWRfcmVsaWRzLCBqb2lucmVsLT5yZWxpZHMpKQor CQlpZiAoYm1zX2lzX3N1YnNldChyaW5mby0+cmVxdWlyZWRfcmVsaWRzLCBqb2lucmVsaWRz KSkKIAkJewogCQkJLyoKIAkJCSAqIFRoaXMgY2xhdXNlIGJlY29tZXMgYSByZXN0cmljdGlv biBjbGF1c2UgZm9yIHRoZSBqb2lucmVsLCBzaW5jZQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tl bmQvdXRpbHMvbWlzYy9ndWMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjLmMKaW5k ZXggYTJlMGY4ZGU3ZS4uNTg3YWZiZmZhYSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRp bHMvbWlzYy9ndWMuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9taXNjL2d1Yy5jCkBAIC0x MTY5LDYgKzExNjksMTYgQEAgc3RhdGljIHN0cnVjdCBjb25maWdfYm9vbCBDb25maWd1cmVO YW1lc0Jvb2xbXSA9CiAJCXRydWUsCiAJCU5VTEwsIE5VTEwsIE5VTEwKIAl9LAorCXsKKwkJ eyJlbmFibGVfc2VsZl9qb2luX3JlbW92YWwiLCBQR0NfVVNFUlNFVCwgUVVFUllfVFVOSU5H X01FVEhPRCwKKwkJCWdldHRleHRfbm9vcCgiRW5hYmxlIHJlbW92YWwgb2YgdW5pcXVlIHNl bGYtam9pbnMuIiksCisJCQlOVUxMLAorCQkJR1VDX0VYUExBSU4KKwkJfSwKKwkJJmVuYWJs ZV9zZWxmX2pvaW5fcmVtb3ZhbCwKKwkJdHJ1ZSwKKwkJTlVMTCwgTlVMTCwgTlVMTAorCX0s CiAJewogCQl7ImdlcW8iLCBQR0NfVVNFUlNFVCwgUVVFUllfVFVOSU5HX0dFUU8sCiAJCQln ZXR0ZXh0X25vb3AoIkVuYWJsZXMgZ2VuZXRpYyBxdWVyeSBvcHRpbWl6YXRpb24uIiksCmRp ZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aG5vZGUuaCBiL3NyYy9pbmNs dWRlL29wdGltaXplci9wYXRobm9kZS5oCmluZGV4IGY3MDRkMzk5ODAuLjY5NGY1ZTgxOTcg MTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wdGltaXplci9wYXRobm9kZS5oCisrKyBiL3Ny Yy9pbmNsdWRlL29wdGltaXplci9wYXRobm9kZS5oCkBAIC0zMDYsNiArMzA2LDEwIEBAIGV4 dGVybiBSZWxPcHRJbmZvICpidWlsZF9qb2luX3JlbChQbGFubmVySW5mbyAqcm9vdCwKIAkJ CQkJCQkJICBSZWxPcHRJbmZvICppbm5lcl9yZWwsCiAJCQkJCQkJCSAgU3BlY2lhbEpvaW5J bmZvICpzamluZm8sCiAJCQkJCQkJCSAgTGlzdCAqKnJlc3RyaWN0bGlzdF9wdHIpOworZXh0 ZXJuIExpc3QgKmJ1aWxkX2pvaW5yZWxfcmVzdHJpY3RsaXN0KFBsYW5uZXJJbmZvICpyb290 LAorCQkJCQkJICAgUmVsaWRzIGpvaW5yZWxpZHMsCisJCQkJCQkgICBSZWxPcHRJbmZvICpv dXRlcl9yZWwsCisJCQkJCQkgICBSZWxPcHRJbmZvICppbm5lcl9yZWwpOwogZXh0ZXJuIFJl bGlkcyBtaW5fam9pbl9wYXJhbWV0ZXJpemF0aW9uKFBsYW5uZXJJbmZvICpyb290LAogCQkJ CQkJCQkJCVJlbGlkcyBqb2lucmVsaWRzLAogCQkJCQkJCQkJCVJlbE9wdEluZm8gKm91dGVy X3JlbCwKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wdGltaXplci9wbGFubWFpbi5oIGIv c3JjL2luY2x1ZGUvb3B0aW1pemVyL3BsYW5tYWluLmgKaW5kZXggYmYxYWRmYzUyYS4uNjI5 YmRhNGIwYiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BsYW5tYWluLmgK KysrIGIvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BsYW5tYWluLmgKQEAgLTIwLDYgKzIwLDcg QEAKIC8qIEdVQyBwYXJhbWV0ZXJzICovCiAjZGVmaW5lIERFRkFVTFRfQ1VSU09SX1RVUExF X0ZSQUNUSU9OIDAuMQogZXh0ZXJuIGRvdWJsZSBjdXJzb3JfdHVwbGVfZnJhY3Rpb247Citl eHRlcm4gYm9vbCBlbmFibGVfc2VsZl9qb2luX3JlbW92YWw7CiAKIC8qIHF1ZXJ5X3BsYW5u ZXIgY2FsbGJhY2sgdG8gY29tcHV0ZSBxdWVyeV9wYXRoa2V5cyAqLwogdHlwZWRlZiB2b2lk ICgqcXVlcnlfcGF0aGtleXNfY2FsbGJhY2spIChQbGFubmVySW5mbyAqcm9vdCwgdm9pZCAq ZXh0cmEpOwpAQCAtMTA3LDYgKzEwOCw3IEBAIGV4dGVybiBib29sIHF1ZXJ5X2lzX2Rpc3Rp bmN0X2ZvcihRdWVyeSAqcXVlcnksIExpc3QgKmNvbG5vcywgTGlzdCAqb3BpZHMpOwogZXh0 ZXJuIGJvb2wgaW5uZXJyZWxfaXNfdW5pcXVlKFBsYW5uZXJJbmZvICpyb290LAogCQkJCQkJ CSAgIFJlbGlkcyBqb2lucmVsaWRzLCBSZWxpZHMgb3V0ZXJyZWxpZHMsIFJlbE9wdEluZm8g KmlubmVycmVsLAogCQkJCQkJCSAgIEpvaW5UeXBlIGpvaW50eXBlLCBMaXN0ICpyZXN0cmlj dGxpc3QsIGJvb2wgZm9yY2VfY2FjaGUpOworZXh0ZXJuIExpc3QgKiByZW1vdmVfdXNlbGVz c19zZWxmX2pvaW5zKFBsYW5uZXJJbmZvICpyb290LCBMaXN0ICpqb2ludHJlZSk7CiAKIC8q CiAgKiBwcm90b3R5cGVzIGZvciBwbGFuL3NldHJlZnMuYwpkaWZmIC0tZ2l0IGEvc3JjL3Rl c3QvcmVncmVzcy9leHBlY3RlZC9lcXVpdmNsYXNzLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3Mv ZXhwZWN0ZWQvZXF1aXZjbGFzcy5vdXQKaW5kZXggMTI2ZjcwNDdmZS4uZGU3MTQ0MTA1MiAx MDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9lcXVpdmNsYXNzLm91dAor KysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2VxdWl2Y2xhc3Mub3V0CkBAIC00MzAs NiArNDMwLDM4IEBAIGV4cGxhaW4gKGNvc3RzIG9mZikKICAgIEZpbHRlcjogKCh1bmlxdWUx IElTIE5PVCBOVUxMKSBBTkQgKHVuaXF1ZTIgSVMgTk9UIE5VTEwpKQogKDIgcm93cykKIAor LS0gVGVzdCB0aGF0IGJyb2tlbiBFQ3MgYXJlIHByb2Nlc3NlZCBjb3JyZWN0bHkgZHVyaW5n IHNlbGYgam9pbiByZW1vdmFsLgorLS0gRGlzYWJsZSBtZXJnZSBqb2lucyBzbyB0aGF0IHdl IGRvbid0IGdldCBhbiBlcnJvciBhYm91dCBtaXNzaW5nIGNvbW11dGF0b3IuCistLSBUZXN0 IGJvdGggb3JpZW50YXRpb25zIG9mIHRoZSBqb2luIGNsYXVzZSwgYmVjYXVzZSBvbmx5IG9u ZSBvZiB0aGVtIGJyZWFrcworLS0gdGhlIEVDLgorc2V0IGVuYWJsZV9tZXJnZWpvaW4gdG8g b2ZmOworZXhwbGFpbiAoY29zdHMgb2ZmKQorICBzZWxlY3QgKiBmcm9tIGVjMCBtIGpvaW4g ZWMwIG4gb24gbS5mZiA9IG4uZmYKKyAgam9pbiBlYzEgcCBvbiBtLmZmICsgbi5mZiA9IHAu ZjE7CisgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgCistLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpv aW4gRmlsdGVyOiAoKG4uZmYgKyBuLmZmKSA9IHAuZjEpCisgICAtPiAgU2VxIFNjYW4gb24g ZWMxIHAKKyAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGVj MCBuCisgICAgICAgICAgICAgICBGaWx0ZXI6IChmZiBJUyBOT1QgTlVMTCkKKyg2IHJvd3Mp CisKK2V4cGxhaW4gKGNvc3RzIG9mZikKKyAgc2VsZWN0ICogZnJvbSBlYzAgbSBqb2luIGVj MCBuIG9uIG0uZmYgPSBuLmZmCisgIGpvaW4gZWMxIHAgb24gcC5mMTo6aW50OCA9IChtLmZm ICsgbi5mZik6OmludDhhbGlhczE7CisgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBM b29wCisgICBKb2luIEZpbHRlcjogKChwLmYxKTo6YmlnaW50ID0gKChuLmZmICsgbi5mZikp OjppbnQ4YWxpYXMxKQorICAgLT4gIFNlcSBTY2FuIG9uIGVjMSBwCisgICAtPiAgTWF0ZXJp YWxpemUKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBlYzAgbgorICAgICAgICAgICAgICAg RmlsdGVyOiAoZmYgSVMgTk9UIE5VTEwpCisoNiByb3dzKQorCityZXNldCBlbmFibGVfbWVy Z2Vqb2luOwogLS0gdGhpcyBjb3VsZCBiZSBjb252ZXJ0ZWQsIGJ1dCBpc24ndCBhdCBwcmVz ZW50CiBleHBsYWluIChjb3N0cyBvZmYpCiAgIHNlbGVjdCAqIGZyb20gdGVuazEgd2hlcmUg dW5pcXVlMSA9IHVuaXF1ZTEgb3IgdW5pcXVlMiA9IHVuaXF1ZTI7CmRpZmYgLS1naXQgYS9z cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9l eHBlY3RlZC9qb2luLm91dAppbmRleCBmMzU4OWQwZGJiLi4wOTk0OTUyMDgwIDEwMDY0NAot LS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0CisrKyBiL3NyYy90ZXN0 L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQKQEAgLTQ4ODgsNiArNDg4OCw0MDUgQEAgc2Vs ZWN0ICogZnJvbQogLS0tLSstLS0tKy0tLS0rLS0tLQogKDAgcm93cykKIAorLS0KKy0tIHRl c3QgdGhhdCBzZW1pLSBvciBpbm5lciBzZWxmLWpvaW5zIG9uIGEgdW5pcXVlIGNvbHVtbiBh cmUgcmVtb3ZlZAorLS0KKy0tIGVuYWJsZSBvbmx5IG5lc3Rsb29wIHRvIGdldCBtb3JlIHBy ZWRpY3RhYmxlIHBsYW5zCitzZXQgZW5hYmxlX2hhc2hqb2luIHRvIG9mZjsKK3NldCBlbmFi bGVfbWVyZ2Vqb2luIHRvIG9mZjsKK2NyZWF0ZSB0YWJsZSBzaiAoYSBpbnQgdW5pcXVlLCBi IGludCwgYyBpbnQgdW5pcXVlKTsKK2luc2VydCBpbnRvIHNqIHZhbHVlcyAoMSwgbnVsbCwg MiksIChudWxsLCAyLCBudWxsKSwgKDIsIDEsIDEpOworYW5hbHl6ZSBzajsKKy0tIFRyaXZp YWwgc2VsZi1qb2luIGNhc2UuCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgcC4qIGZy b20gc2ogcCwgc2ogcSB3aGVyZSBxLmEgPSBwLmEgYW5kIHEuYiA9IHEuYSAtIDE7CisgICAg ICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBz aiBxCisgICBGaWx0ZXI6ICgoYSBJUyBOT1QgTlVMTCkgQU5EIChiID0gKGEgLSAxKSkpCiso MiByb3dzKQorCitzZWxlY3QgcC4qIGZyb20gc2ogcCwgc2ogcSB3aGVyZSBxLmEgPSBwLmEg YW5kIHEuYiA9IHEuYSAtIDE7CisgYSB8IGIgfCBjIAorLS0tKy0tLSstLS0KKyAyIHwgMSB8 IDEKKygxIHJvdykKKworLS0gU2VsZi1qb2luIHJlbW92YWwgcGVyZm9ybXMgYWZ0ZXIgYSBz dWJxdWVyeSBwdWxsLXVwIHByb2Nlc3MgYW5kIGNvdWxkIHJlbW92ZQorLS0gc3VjaCBraW5k IG9mIHNlbGYtam9pbiB0b28uIENoZWNrIHRoaXMgb3B0aW9uLgorZXhwbGFpbiAoY29zdHMg b2ZmKQorc2VsZWN0ICogZnJvbSBzaiBwCit3aGVyZSBleGlzdHMgKHNlbGVjdCAqIGZyb20g c2ogcQorCQkJCXdoZXJlIHEuYSA9IHAuYSBhbmQgcS5iIDwgMTApOworICAgICAgICAgICAg ICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBzaiBxCisgICBGaWx0ZXI6ICgo YSBJUyBOT1QgTlVMTCkgQU5EIChiIDwgMTApKQorKDIgcm93cykKKworc2VsZWN0ICogZnJv bSBzaiBwIHdoZXJlIGV4aXN0cyAoc2VsZWN0ICogZnJvbSBzaiBxIHdoZXJlIHEuYSA9IHAu YSBhbmQgcS5iIDwgMTApOworIGEgfCBiIHwgYyAKKy0tLSstLS0rLS0tCisgMiB8IDEgfCAx CisoMSByb3cpCisKKy0tIERvbid0IHJlbW92ZSBzZWxmLWpvaW4gZm9yIHRoZSBjYXNlIG9m IGVxdWFsaXR5IG9mIHR3byBkaWZmZXJlbnQgdW5pcXVlIGNvbHVtbnMuCitleHBsYWluIChj b3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHQxLCBzaiB0MiB3aGVyZSB0MS5hID0gdDIu YyBhbmQgdDEuYiBpcyBub3QgbnVsbDsKKyAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg TmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAodDEuYSA9IHQyLmMpCisgICAtPiAgU2Vx IFNjYW4gb24gc2ogdDIKKyAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgLT4gIFNlcSBT Y2FuIG9uIHNqIHQxCisgICAgICAgICAgICAgICBGaWx0ZXI6IChiIElTIE5PVCBOVUxMKQor KDYgcm93cykKKworLS0gRGVnZW5lcmF0ZWQgY2FzZS4KK2V4cGxhaW4gKGNvc3RzIG9mZikK K3NlbGVjdCAqIGZyb20KKwkoc2VsZWN0IGEgYXMgeCBmcm9tIHNqIHdoZXJlIGZhbHNlKSBh cyBxMSwKKwkoc2VsZWN0IGEgYXMgeSBmcm9tIHNqIHdoZXJlIGZhbHNlKSBhcyBxMgord2hl cmUgcTEueCA9IHEyLnk7CisgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFJlc3VsdAorICAgT25lLVRpbWUg RmlsdGVyOiBmYWxzZQorICAgLT4gIFNlcSBTY2FuIG9uIHNqCisgICAgICAgICBGaWx0ZXI6 IChhIElTIE5PVCBOVUxMKQorKDQgcm93cykKKworLS0gV2UgY2FuJ3QgdXNlIGEgY3Jvc3Mt RUMgZ2VuZXJhdGVkIHNlbGYgam9pbiBxdWFsIGJlY2F1c2Ugb2YgY3VycmVudCBsb2dpYyBv ZgorLS0gdGhlIGdlbmVyYXRlX2pvaW5faW1wbGllZF9lcXVhbGl0aWVzIHJvdXRpbmUuCitl eHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHQxLCBzaiB0MiB3aGVyZSB0 MS5hID0gdDEuYiBhbmQgdDEuYiA9IHQyLmIgYW5kIHQyLmIgPSB0Mi5hOworICAgICAgICAg IFFVRVJZIFBMQU4gICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6ICh0MS5hID0gdDIuYikKKyAgIC0+ICBT ZXEgU2NhbiBvbiBzaiB0MQorICAgICAgICAgRmlsdGVyOiAoYSA9IGIpCisgICAtPiAgU2Vx IFNjYW4gb24gc2ogdDIKKyAgICAgICAgIEZpbHRlcjogKGIgPSBhKQorKDYgcm93cykKKwor ZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB0MSwgc2ogdDIsIHNqIHQz Cit3aGVyZSB0MS5hID0gdDEuYiBhbmQgdDEuYiA9IHQyLmIgYW5kIHQyLmIgPSB0Mi5hCisJ YW5kIHQxLmIgPSB0My5iIGFuZCB0My5iID0gdDMuYTsKKyAgICAgICAgICAgICBRVUVSWSBQ TEFOICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAodDEuYSA9IHQzLmIpCisgICAtPiAg TmVzdGVkIExvb3AKKyAgICAgICAgIEpvaW4gRmlsdGVyOiAodDEuYSA9IHQyLmIpCisgICAg ICAgICAtPiAgU2VxIFNjYW4gb24gc2ogdDEKKyAgICAgICAgICAgICAgIEZpbHRlcjogKGEg PSBiKQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqIHQyCisgICAgICAgICAgICAgICBG aWx0ZXI6IChiID0gYSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiB0MworICAgICAgICAgRmls dGVyOiAoYiA9IGEpCisoMTAgcm93cykKKworLS0gRG91YmxlIHNlbGYtam9pbiByZW1vdmFs LgorLS0gVXNlIGEgY29uZGl0aW9uIG9uICJiICsgMSIsIG5vdCBvbiAiYiIsIGZvciB0aGUg c2Vjb25kIGpvaW4sIHNvIHRoYXQKKy0tIHRoZSBlcXVpdmFsZW5jZSBjbGFzcyBpcyBkaWZm ZXJlbnQgZnJvbSB0aGUgZmlyc3Qgb25lLCBhbmQgd2UgY2FuCistLSB0ZXN0IHRoZSBub24t ZWMgY29kZSBwYXRoLgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB0 MSBqb2luIHNqIHQyIG9uIHQxLmEgPSB0Mi5hIGFuZCB0MS5iID0gdDIuYgorCWpvaW4gc2og dDMgb24gdDIuYSA9IHQzLmEgYW5kIHQyLmIgKyAxID0gdDMuYiArIDE7CisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHNqIHQz CisgICBGaWx0ZXI6ICgoYSBJUyBOT1QgTlVMTCkgQU5EIChiIElTIE5PVCBOVUxMKSBBTkQg KChiICsgMSkgSVMgTk9UIE5VTEwpKQorKDIgcm93cykKKworLS0gc3Vic2VsZWN0IHRoYXQg cmVmZXJlbmNlcyB0aGUgcmVtb3ZlZCByZWxhdGlvbgorZXhwbGFpbiAoY29zdHMgb2ZmKQor c2VsZWN0IHQxLmEsIChzZWxlY3QgYSBmcm9tIHNqIHdoZXJlIGEgPSB0Mi5hIGFuZCBhID0g dDEuYSkKK2Zyb20gc2ogdDEsIHNqIHQyCit3aGVyZSB0MS5hID0gdDIuYTsKKyAgICAgICAg ICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gc2ogdDIKKyAgIEZpbHRl cjogKGEgSVMgTk9UIE5VTEwpCisgICBTdWJQbGFuIDEKKyAgICAgLT4gIFJlc3VsdAorICAg ICAgICAgICBPbmUtVGltZSBGaWx0ZXI6ICh0Mi5hID0gdDIuYSkKKyAgICAgICAgICAgLT4g IFNlcSBTY2FuIG9uIHNqCisgICAgICAgICAgICAgICAgIEZpbHRlcjogKGEgPSB0Mi5hKQor KDcgcm93cykKKworLS0gc2VsZi1qb2luIHVuZGVyIG91dGVyIGpvaW4KK2V4cGxhaW4gKGNv c3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogeCBqb2luIHNqIHkgb24geC5hID0geS5hCits ZWZ0IGpvaW4gaW50OF90YmwgeiBvbiB4LmEgPSB6LnExOworICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgIEpvaW4gRmlsdGVyOiAoeS5hID0gei5x MSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiB5CisgICAgICAgICBGaWx0ZXI6IChhIElTIE5P VCBOVUxMKQorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24g aW50OF90YmwgegorKDYgcm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICog ZnJvbSBzaiB4IGpvaW4gc2ogeSBvbiB4LmEgPSB5LmEKK2xlZnQgam9pbiBpbnQ4X3RibCB6 IG9uIHkuYSA9IHoucTE7CisgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wIExl ZnQgSm9pbgorICAgSm9pbiBGaWx0ZXI6ICh5LmEgPSB6LnExKQorICAgLT4gIFNlcSBTY2Fu IG9uIHNqIHkKKyAgICAgICAgIEZpbHRlcjogKGEgSVMgTk9UIE5VTEwpCisgICAtPiAgTWF0 ZXJpYWxpemUKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBpbnQ4X3RibCB6CisoNiByb3dz KQorCistLSBUZXN0IHRoYXQgcGxhY2Vob2xkZXJzIGFyZSB1cGRhdGVkIGNvcnJlY3RseSBh ZnRlciBqb2luIHJlbW92YWwKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20g KHZhbHVlcyAoMSkpIHgKK2xlZnQgam9pbiAoc2VsZWN0IGNvYWxlc2NlKHkucTEsIDEpIGZy b20gaW50OF90YmwgeQorCXJpZ2h0IGpvaW4gc2ogajEgaW5uZXIgam9pbiBzaiBqMiBvbiBq MS5hID0gajIuYQorCW9uIHRydWUpIHoKK29uIHRydWU7CisgICAgICAgICAgICAgICAgUVVF UlkgUExBTiAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wIExlZnQgSm9pbgorICAgLT4gIFJlc3VsdAor ICAgLT4gIE5lc3RlZCBMb29wIExlZnQgSm9pbgorICAgICAgICAgLT4gIFNlcSBTY2FuIG9u IHNqIGoyCisgICAgICAgICAgICAgICBGaWx0ZXI6IChhIElTIE5PVCBOVUxMKQorICAgICAg ICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gaW50 OF90YmwgeQorKDcgcm93cykKKworLS0gVGVzdCB0aGF0IE9SIHByZWRpY2F0ZWQgYXJlIHVw ZGF0ZWQgY29ycmVjdGx5IGFmdGVyIGpvaW4gcmVtb3ZhbAorQ1JFQVRFIFRBQkxFIHRhYl93 aXRoX2ZsYWcgKCBpZCBJTlQgUFJJTUFSWSBLRVksIGlzX2ZsYWcgU01BTExJTlQpOworQ1JF QVRFIElOREVYIGlkeF90ZXN0X2lzX2ZsYWcgT04gdGFiX3dpdGhfZmxhZyAoaXNfZmxhZyk7 CitleHBsYWluIChjb3N0cyBvZmYpCitTRUxFQ1QgQ09VTlQoKikgRlJPTSB0YWJfd2l0aF9m bGFnIFdIRVJFIChpc19mbGFnIElTIE5VTEwgT1IgaXNfZmxhZyA9IDApIEFORCBpZCBJTiAo U0VMRUNUIGlkIEZST00gdGFiX3dpdGhfZmxhZyBXSEVSRSBpZCBJTiAoMiwgMykpOworICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIEFnZ3JlZ2F0ZQorICAgLT4gIEJpdG1hcCBIZWFwIFNjYW4gb24gdGFiX3dpdGhfZmxh ZworICAgICAgICAgUmVjaGVjayBDb25kOiAoKGlkID0gQU5ZICgnezIsM30nOjppbnRlZ2Vy W10pKSBBTkQgKGlkIElTIE5PVCBOVUxMKSkKKyAgICAgICAgIEZpbHRlcjogKChpc19mbGFn IElTIE5VTEwpIE9SIChpc19mbGFnID0gMCkpCisgICAgICAgICAtPiAgQml0bWFwIEluZGV4 IFNjYW4gb24gdGFiX3dpdGhfZmxhZ19wa2V5CisgICAgICAgICAgICAgICBJbmRleCBDb25k OiAoKGlkID0gQU5ZICgnezIsM30nOjppbnRlZ2VyW10pKSBBTkQgKGlkIElTIE5PVCBOVUxM KSkKKyg2IHJvd3MpCisKK0RST1AgVEFCTEUgdGFiX3dpdGhfZmxhZzsKKy0tIEhBVklORyBj bGF1c2UKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCBwLmIgZnJvbSBzaiBwIGpvaW4g c2ogcSBvbiBwLmEgPSBxLmEgZ3JvdXAgYnkgcC5iIGhhdmluZyBzdW0ocC5hKSA9IDE7Cisg ICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorIEhhc2hBZ2dyZWdhdGUKKyAgIEdyb3VwIEtleTogcS5iCisgICBG aWx0ZXI6IChzdW0ocS5hKSA9IDEpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogcQorICAgICAg ICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKyg1IHJvd3MpCisKKy0tIHVwZGF0ZSBsYXRl cmFsIHJlZmVyZW5jZXMgYW5kIHJhbmdlIHRhYmxlIGVudHJ5IHJlZmVyZW5jZQorZXhwbGFp biAodmVyYm9zZSwgY29zdHMgb2ZmKQorc2VsZWN0IDEgZnJvbSAoc2VsZWN0IHguKiBmcm9t IHNqIHgsIHNqIHkgd2hlcmUgeC5hID0geS5hKSBxLAorICBsYXRlcmFsIGdlbmVyYXRlX3Nl cmllcygxLCBxLmEpIGdzKGkpOworICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4g ICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgT3V0cHV0OiAxCisg ICAtPiAgU2VxIFNjYW4gb24gcHVibGljLnNqIHkKKyAgICAgICAgIE91dHB1dDogeS5hLCB5 LmIsIHkuYworICAgICAgICAgRmlsdGVyOiAoeS5hIElTIE5PVCBOVUxMKQorICAgLT4gIEZ1 bmN0aW9uIFNjYW4gb24gcGdfY2F0YWxvZy5nZW5lcmF0ZV9zZXJpZXMgZ3MKKyAgICAgICAg IE91dHB1dDogZ3MuaQorICAgICAgICAgRnVuY3Rpb24gQ2FsbDogZ2VuZXJhdGVfc2VyaWVz KDEsIHkuYSkKKyg4IHJvd3MpCisKK2V4cGxhaW4gKHZlcmJvc2UsIGNvc3RzIG9mZikKK3Nl bGVjdCAxIGZyb20gKHNlbGVjdCB5LiogZnJvbSBzaiB4LCBzaiB5IHdoZXJlIHguYSA9IHku YSkgcSwKKyAgbGF0ZXJhbCBnZW5lcmF0ZV9zZXJpZXMoMSwgcS5hKSBncyhpKTsKKyAgICAg ICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgIAorLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg TmVzdGVkIExvb3AKKyAgIE91dHB1dDogMQorICAgLT4gIFNlcSBTY2FuIG9uIHB1YmxpYy5z aiB5CisgICAgICAgICBPdXRwdXQ6IHkuYSwgeS5iLCB5LmMKKyAgICAgICAgIEZpbHRlcjog KHkuYSBJUyBOT1QgTlVMTCkKKyAgIC0+ICBGdW5jdGlvbiBTY2FuIG9uIHBnX2NhdGFsb2cu Z2VuZXJhdGVfc2VyaWVzIGdzCisgICAgICAgICBPdXRwdXQ6IGdzLmkKKyAgICAgICAgIEZ1 bmN0aW9uIENhbGw6IGdlbmVyYXRlX3NlcmllcygxLCB5LmEpCisoOCByb3dzKQorCistLSBU ZXN0IHRoYXQgYSBub24tRUMtZGVyaXZlZCBqb2luIGNsYXVzZSBpcyBwcm9jZXNzZWQgY29y cmVjdGx5LiBVc2UgYW4KKy0tIG91dGVyIGpvaW4gc28gdGhhdCB3ZSBjYW4ndCBmb3JtIGFu IEVDLgorZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3QgKiBmcm9tIHNqIHAgam9pbiBzaiBx IG9uIHAuYSA9IHEuYQorICBsZWZ0IGpvaW4gc2ogciBvbiBwLmEgKyBxLmEgPSByLmE7Cisg ICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wIExlZnQgSm9pbgorICAgSm9pbiBG aWx0ZXI6ICgocS5hICsgcS5hKSA9IHIuYSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBxCisg ICAgICAgICBGaWx0ZXI6IChhIElTIE5PVCBOVUxMKQorICAgLT4gIE1hdGVyaWFsaXplCisg ICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ogcgorKDYgcm93cykKKworLS0gRklYTUUgdGhp cyBjb25zdGFudCBmYWxzZSBmaWx0ZXIgZG9lc24ndCBsb29rIGdvb2QuIFNob3VsZCB3ZSBt ZXJnZQorLS0gZXF1aXZhbGVuY2UgY2xhc3Nlcz8KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3Nl bGVjdCAqIGZyb20gc2ogcCwgc2ogcSB3aGVyZSBwLmEgPSBxLmEgYW5kIHAuYiA9IDEgYW5k IHEuYiA9IDI7CisgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBzaiBxCisgICBGaWx0ZXI6ICgoYSBJUyBOT1Qg TlVMTCkgQU5EIChiID0gMikgQU5EIChiID0gMSkpCisoMiByb3dzKQorCistLSBDaGVjayB0 aGF0IGF0dHJfbmVlZGVkIGlzIHVwZGF0ZWQgY29ycmVjdGx5IGFmdGVyIHNlbGYtam9pbiBy ZW1vdmFsLiBJbiB0aGlzCistLSB0ZXN0LCB0aGUgam9pbiBvZiBqMSB3aXRoIGoyIGlzIHJl bW92ZWQuIGsxLmIgaXMgcmVxdWlyZWQgYXQgZWl0aGVyIGoxIG9yIGoyLgorLS0gSWYgdGhp cyBpbmZvIGlzIGxvc3QsIGpvaW4gdGFyZ2V0bGlzdCBmb3IgKGsxLCBrMikgd2lsbCBub3Qg Y29udGFpbiBrMS5iLgorLS0gVXNlIGluZGV4IHNjYW4gZm9yIGsxIHNvIHRoYXQgd2UgZG9u J3QgZ2V0ICdiJyBmcm9tIHBoeXNpY2FsIHRsaXN0IHVzZWQgZm9yCistLSBzZXFzY2FuLiBB bHNvIGRpc2FibGUgcmVvcmRlcmluZyBvZiBqb2lucyBiZWNhdXNlIHRoaXMgdGVzdCBkZXBl bmRzIG9uIGEKKy0tIHBhcnRpY3VsYXIgam9pbiB0cmVlLgorY3JlYXRlIHRhYmxlIHNrIChh IGludCwgYiBpbnQpOworY3JlYXRlIGluZGV4IG9uIHNrKGEpOworc2V0IGpvaW5fY29sbGFw c2VfbGltaXQgdG8gMTsKK3NldCBlbmFibGVfc2Vxc2NhbiB0byBvZmY7CitleHBsYWluIChj b3N0cyBvZmYpIHNlbGVjdCAxIGZyb20KKwkoc2sgazEgam9pbiBzayBrMiBvbiBrMS5hID0g azIuYSkKKwlqb2luIChzaiBqMSBqb2luIHNqIGoyIG9uIGoxLmEgPSBqMi5hKSBvbiBqMS5i ID0gazEuYjsKKyAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKGsxLmIgPSBqMi5i KQorICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyBz a19hX2lkeCBvbiBzayBrMQorICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyBz a19hX2lkeCBvbiBzayBrMgorICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGEgPSBrMS5h KQorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyBz al9hX2tleSBvbiBzaiBqMgorICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGEgSVMgTk9U IE5VTEwpCisoOSByb3dzKQorCitleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCAxIGZyb20K Kwkoc2sgazEgam9pbiBzayBrMiBvbiBrMS5hID0gazIuYSkKKwlqb2luIChzaiBqMSBqb2lu IHNqIGoyIG9uIGoxLmEgPSBqMi5hKSBvbiBqMi5iID0gazEuYjsKKyAgICAgICAgICAgICAg ICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29w CisgICBKb2luIEZpbHRlcjogKGsxLmIgPSBqMi5iKQorICAgLT4gIE5lc3RlZCBMb29wCisg ICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyBza19hX2lkeCBvbiBzayBrMQorICAgICAg ICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyBza19hX2lkeCBvbiBzayBrMgorICAgICAg ICAgICAgICAgSW5kZXggQ29uZDogKGEgPSBrMS5hKQorICAgLT4gIE1hdGVyaWFsaXplCisg ICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyBzal9hX2tleSBvbiBzaiBqMgorICAgICAg ICAgICAgICAgSW5kZXggQ29uZDogKGEgSVMgTk9UIE5VTEwpCisoOSByb3dzKQorCityZXNl dCBqb2luX2NvbGxhcHNlX2xpbWl0OworcmVzZXQgZW5hYmxlX3NlcXNjYW47CistLSBDaGVj ayB0aGF0IGNsYXVzZXMgZnJvbSB0aGUgam9pbiBmaWx0ZXIgbGlzdCBpcyBub3QgbG9zdCBv biB0aGUgc2VsZi1qb2luIHJlbW92YWwKK0NSRUFURSBUQUJMRSBlbXAxICggaWQgU0VSSUFM IFBSSU1BUlkgS0VZIE5PVCBOVUxMLCBjb2RlIGludCk7CitleHBsYWluICh2ZXJib3NlLCBj b3N0cyBvZmYpCitTRUxFQ1QgKiBGUk9NIGVtcDEgZTEsIGVtcDEgZTIgV0hFUkUgZTEuaWQg PSBlMi5pZCBBTkQgZTIuY29kZSA8PiBlMS5jb2RlOworICAgICAgICAgICAgICAgICAgICAg ICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2Fu IG9uIHB1YmxpYy5lbXAxIGUyCisgICBPdXRwdXQ6IGUyLmlkLCBlMi5jb2RlLCBlMi5pZCwg ZTIuY29kZQorICAgRmlsdGVyOiAoKGUyLmlkIElTIE5PVCBOVUxMKSBBTkQgKGUyLmNvZGUg PD4gZTIuY29kZSkpCisoMyByb3dzKQorCistLSBXZSBjYW4gcmVtb3ZlIHRoZSBqb2luIGV2 ZW4gaWYgd2UgZmluZCB0aGUgam9pbiBjYW4ndCBkdXBsaWNhdGUgcm93cyBhbmQKKy0tIHRo ZSBiYXNlIHF1YWxzIG9mIGVhY2ggc2lkZSBhcmUgZGlmZmVyZW50LiAgSW4gdGhlIGZvbGxv d2luZyBjYXNlIHdlIGVuZCB1cAorLS0gbW92aW5nIHF1YWxzIG92ZXIgdG8gczEgdG8gbWFr ZSBpdCBzbyBpdCBjYW4ndCBtYXRjaCBhbnkgcm93cy4KK2NyZWF0ZSB0YWJsZSBzbChhIGlu dCwgYiBpbnQpOworY3JlYXRlIHVuaXF1ZSBpbmRleCBvbiBzbChhLCBiKTsKK3ZhY3V1bSBh bmFseXplIHNsOworLS0gQm90aCBzaWRlcyBhcmUgdW5pcXVlLCBidXQgYmFzZSBxdWFscyBh cmUgZGlmZmVyZW50CitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNsIHQx LCBzbCB0MiB3aGVyZSB0MS5hID0gdDIuYSBhbmQgdDEuYiA9IDEgYW5kIHQyLmIgPSAyOwor ICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgU2VxIFNjYW4gb24gc2wgdDIKKyAgIEZpbHRlcjogKChhIElTIE5PVCBOVUxMKSBBTkQg KGIgPSAyKSBBTkQgKGIgPSAxKSkKKygyIHJvd3MpCisKKy0tCistLS0tIE9ubHkgb25lIHNp ZGUgaXMgdW5xaXVlCistLXNlbGVjdCAqIGZyb20gc2wgdDEsIHNsIHQyIHdoZXJlIHQxLmEg PSB0Mi5hIGFuZCB0MS5iID0gMTsKKy0tc2VsZWN0ICogZnJvbSBzbCB0MSwgc2wgdDIgd2hl cmUgdDEuYSA9IHQyLmEgYW5kIHQyLmIgPSAxOworLS0KKy0tLS0gU2V2ZXJhbCB1bmlxdWVz IGluZGV4ZXMgbWF0Y2gsIGFuZCB3ZSBzZWxlY3QgYSBkaWZmZXJlbnQgb25lCistLS0tIGZv ciBlYWNoIHNpZGUsIHNvIHRoZSBqb2luIGlzIG5vdCByZW1vdmVkCistLWNyZWF0ZSB0YWJs ZSBzbShhIGludCB1bmlxdWUsIGIgaW50IHVuaXF1ZSwgYyBpbnQgdW5pcXVlKTsKKy0tZXhw bGFpbiAoY29zdHMgb2ZmKQorLS1zZWxlY3QgKiBmcm9tIHNtIG0sIHNtIG4gd2hlcmUgbS5h ID0gbi5iIGFuZCBtLmMgPSBuLmM7CistLWV4cGxhaW4gKGNvc3RzIG9mZikKKy0tc2VsZWN0 ICogZnJvbSBzbSBtLCBzbSBuIHdoZXJlIG0uYSA9IG4uYyBhbmQgbS5iID0gbi5iOworLS1l eHBsYWluIChjb3N0cyBvZmYpCistLXNlbGVjdCAqIGZyb20gc20gbSwgc20gbiB3aGVyZSBt LmMgPSBuLmIgYW5kIG0uYSA9IG4uYTsKKy0tIENoZWNrIG9wdGltaXphdGlvbiBkaXNhYmxp bmcgaWYgaXQgd2lsbCB2aW9sYXRlIHNwZWNpYWwgam9pbiBjb25kaXRpb25zLgorLS0gVHdv IGlkZW50aWNhbCBqb2luZWQgcmVsYXRpb25zIHNhdGlzZmllcyBzZWxmIGpvaW4gcmVtb3Zh bCBjb25kaXRpb25zIGJ1dAorLS0gc3RheSBpbiBkaWZmZXJlbnQgc3BlY2lhbCBqb2luIGlu Zm9zLgorQ1JFQVRFIFRBQkxFIHNqX3QxIChpZCBzZXJpYWwsIGEgaW50KTsKK0NSRUFURSBU QUJMRSBzal90MiAoaWQgc2VyaWFsLCBhIGludCk7CitDUkVBVEUgVEFCTEUgc2pfdDMgKGlk IHNlcmlhbCwgYSBpbnQpOworQ1JFQVRFIFRBQkxFIHNqX3Q0IChpZCBzZXJpYWwsIGEgaW50 KTsKK0NSRUFURSBVTklRVUUgSU5ERVggT04gc2pfdDMgVVNJTkcgYnRyZWUgKGEsaWQpOwor Q1JFQVRFIFVOSVFVRSBJTkRFWCBPTiBzal90MiBVU0lORyBidHJlZSAoaWQpOworRVhQTEFJ TiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTSBzal90MQorSk9JTiAoCisJU0VMRUNUIHNq X3QyLmlkIEFTIGlkIEZST00gc2pfdDIKKwlXSEVSRSBFWElTVFMKKwkJKAorCQlTRUxFQ1Qg VFJVRSBGUk9NIHNqX3QzLHNqX3Q0IFdIRVJFIHNqX3QzLmEgPSAxIEFORCBzal90My5pZCA9 IHNqX3QyLmlkCisJCSkKKwkpIHQydDN0NAorT04gc2pfdDEuaWQgPSB0MnQzdDQuaWQKK0pP SU4gKAorCVNFTEVDVCBzal90Mi5pZCBBUyBpZCBGUk9NIHNqX3QyCisJV0hFUkUgRVhJU1RT CisJCSgKKwkJU0VMRUNUIFRSVUUgRlJPTSBzal90Myxzal90NCBXSEVSRSBzal90My5hID0g MSBBTkQgc2pfdDMuaWQgPSBzal90Mi5pZAorCQkpCisJKSBfdDJ0M3Q0CitPTiBzal90MS5p ZCA9IF90MnQzdDQuaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg UVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmls dGVyOiAoc2pfdDMuaWQgPSBzal90MS5pZCkKKyAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAg ICAgSm9pbiBGaWx0ZXI6IChzal90My5pZCA9IHNqX3QyLmlkKQorICAgICAgICAgLT4gIE5l c3RlZCBMb29wIFNlbWkgSm9pbgorICAgICAgICAgICAgICAgLT4gIE5lc3RlZCBMb29wCisg ICAgICAgICAgICAgICAgICAgICAtPiAgSGFzaEFnZ3JlZ2F0ZQorICAgICAgICAgICAgICAg ICAgICAgICAgICAgR3JvdXAgS2V5OiBzal90My5pZAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAtPiAgU2VxIFNjYW4gb24gc2pfdDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgLT4gIEJpdG1hcCBIZWFwIFNjYW4gb24gc2pfdDMKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY2hlY2sgQ29uZDogKGEgPSAxKQorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIEJpdG1hcCBJ bmRleCBTY2FuIG9uIHNqX3QzX2FfaWRfaWR4CisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoYSA9IDEpCisgICAgICAg ICAgICAgICAgICAgICAtPiAgSW5kZXggT25seSBTY2FuIHVzaW5nIHNqX3QyX2lkX2lkeCBv biBzal90MiBzal90Ml8xCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCBDb25k OiAoaWQgPSBzal90My5pZCkKKyAgICAgICAgICAgICAgIC0+ICBOZXN0ZWQgTG9vcAorICAg ICAgICAgICAgICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyBzal90M19hX2lk X2lkeCBvbiBzal90MyBzal90M18xCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRl eCBDb25kOiAoKGEgPSAxKSBBTkQgKGlkID0gc2pfdDMuaWQpKQorICAgICAgICAgICAgICAg ICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqX3Q0IHNqX3Q0XzEKKyAgICAgICAgIC0+ICBJbmRl eCBPbmx5IFNjYW4gdXNpbmcgc2pfdDJfaWRfaWR4IG9uIHNqX3QyCisgICAgICAgICAgICAg ICBJbmRleCBDb25kOiAoaWQgPSBzal90Ml8xLmlkKQorICAgLT4gIFNlcSBTY2FuIG9uIHNq X3QxCisoMjQgcm93cykKKworcmVzZXQgZW5hYmxlX2hhc2hqb2luOworcmVzZXQgZW5hYmxl X21lcmdlam9pbjsKIC0tCiAtLSBUZXN0IGhpbnRzIGdpdmVuIG9uIGluY29ycmVjdCBjb2x1 bW4gcmVmZXJlbmNlcyBhcmUgdXNlZnVsCiAtLQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVn cmVzcy9leHBlY3RlZC9zeXN2aWV3cy5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVk L3N5c3ZpZXdzLm91dAppbmRleCA2ZTU0ZjNlMTVlLi5kNDQ5ZDgwYzdhIDEwMDY0NAotLS0g YS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91dAorKysgYi9zcmMvdGVz dC9yZWdyZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91dApAQCAtMTEyLDEwICsxMTIsMTEgQEAg c2VsZWN0IG5hbWUsIHNldHRpbmcgZnJvbSBwZ19zZXR0aW5ncyB3aGVyZSBuYW1lIGxpa2Ug J2VuYWJsZSUnOwogIGVuYWJsZV9wYXJ0aXRpb25fcHJ1bmluZyAgICAgICB8IG9uCiAgZW5h YmxlX3BhcnRpdGlvbndpc2VfYWdncmVnYXRlIHwgb2ZmCiAgZW5hYmxlX3BhcnRpdGlvbndp c2Vfam9pbiAgICAgIHwgb2ZmCisgZW5hYmxlX3NlbGZfam9pbl9yZW1vdmFsICAgICAgIHwg b24KICBlbmFibGVfc2Vxc2NhbiAgICAgICAgICAgICAgICAgfCBvbgogIGVuYWJsZV9zb3J0 ICAgICAgICAgICAgICAgICAgICB8IG9uCiAgZW5hYmxlX3RpZHNjYW4gICAgICAgICAgICAg ICAgIHwgb24KLSgyMCByb3dzKQorKDIxIHJvd3MpCiAKIC0tIFRlc3QgdGhhdCB0aGUgcGdf dGltZXpvbmVfbmFtZXMgYW5kIHBnX3RpbWV6b25lX2FiYnJldnMgdmlld3MgYXJlCiAtLSBt b3JlLW9yLWxlc3Mgd29ya2luZy4gIFdlIGNhbid0IHRlc3QgdGhlaXIgY29udGVudHMgaW4g YW55IGdyZWF0IGRldGFpbApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZXF1 aXZjbGFzcy5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9lcXVpdmNsYXNzLnNxbAppbmRl eCAyNDdiMGEzMTA1Li43N2RkOTY0ZWJmIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNz L3NxbC9lcXVpdmNsYXNzLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9lcXVpdmNs YXNzLnNxbApAQCAtMjU5LDYgKzI1OSwyMiBAQCBkcm9wIHVzZXIgcmVncmVzc191c2VyX2Vj dGVzdDsKIGV4cGxhaW4gKGNvc3RzIG9mZikKICAgc2VsZWN0ICogZnJvbSB0ZW5rMSB3aGVy ZSB1bmlxdWUxID0gdW5pcXVlMSBhbmQgdW5pcXVlMiA9IHVuaXF1ZTI7CiAKKy0tIFRlc3Qg dGhhdCBicm9rZW4gRUNzIGFyZSBwcm9jZXNzZWQgY29ycmVjdGx5IGR1cmluZyBzZWxmIGpv aW4gcmVtb3ZhbC4KKy0tIERpc2FibGUgbWVyZ2Ugam9pbnMgc28gdGhhdCB3ZSBkb24ndCBn ZXQgYW4gZXJyb3IgYWJvdXQgbWlzc2luZyBjb21tdXRhdG9yLgorLS0gVGVzdCBib3RoIG9y aWVudGF0aW9ucyBvZiB0aGUgam9pbiBjbGF1c2UsIGJlY2F1c2Ugb25seSBvbmUgb2YgdGhl bSBicmVha3MKKy0tIHRoZSBFQy4KK3NldCBlbmFibGVfbWVyZ2Vqb2luIHRvIG9mZjsKKwor ZXhwbGFpbiAoY29zdHMgb2ZmKQorICBzZWxlY3QgKiBmcm9tIGVjMCBtIGpvaW4gZWMwIG4g b24gbS5mZiA9IG4uZmYKKyAgam9pbiBlYzEgcCBvbiBtLmZmICsgbi5mZiA9IHAuZjE7CisK K2V4cGxhaW4gKGNvc3RzIG9mZikKKyAgc2VsZWN0ICogZnJvbSBlYzAgbSBqb2luIGVjMCBu IG9uIG0uZmYgPSBuLmZmCisgIGpvaW4gZWMxIHAgb24gcC5mMTo6aW50OCA9IChtLmZmICsg bi5mZik6OmludDhhbGlhczE7CisKK3Jlc2V0IGVuYWJsZV9tZXJnZWpvaW47CisKIC0tIHRo aXMgY291bGQgYmUgY29udmVydGVkLCBidXQgaXNuJ3QgYXQgcHJlc2VudAogZXhwbGFpbiAo Y29zdHMgb2ZmKQogICBzZWxlY3QgKiBmcm9tIHRlbmsxIHdoZXJlIHVuaXF1ZTEgPSB1bmlx dWUxIG9yIHVuaXF1ZTIgPSB1bmlxdWUyOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVz cy9zcWwvam9pbi5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbAppbmRleCBj YjFjMjMwOTE0Li41OWI2ZWEyYTYzIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3Nx bC9qb2luLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbApAQCAtMTcz Nyw2ICsxNzM3LDE5NSBAQCBzZWxlY3QgKiBmcm9tCiBzZWxlY3QgKiBmcm9tCiAgIGludDhf dGJsIHggam9pbiAoaW50NF90YmwgeCBjcm9zcyBqb2luIGludDRfdGJsIHkoZmYpKSBqIG9u IHExID0gZjE7IC0tIG9rCiAKKy0tCistLSB0ZXN0IHRoYXQgc2VtaS0gb3IgaW5uZXIgc2Vs Zi1qb2lucyBvbiBhIHVuaXF1ZSBjb2x1bW4gYXJlIHJlbW92ZWQKKy0tCisKKy0tIGVuYWJs ZSBvbmx5IG5lc3Rsb29wIHRvIGdldCBtb3JlIHByZWRpY3RhYmxlIHBsYW5zCitzZXQgZW5h YmxlX2hhc2hqb2luIHRvIG9mZjsKK3NldCBlbmFibGVfbWVyZ2Vqb2luIHRvIG9mZjsKKwor Y3JlYXRlIHRhYmxlIHNqIChhIGludCB1bmlxdWUsIGIgaW50LCBjIGludCB1bmlxdWUpOwor aW5zZXJ0IGludG8gc2ogdmFsdWVzICgxLCBudWxsLCAyKSwgKG51bGwsIDIsIG51bGwpLCAo MiwgMSwgMSk7CithbmFseXplIHNqOworCistLSBUcml2aWFsIHNlbGYtam9pbiBjYXNlLgor ZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0IHAuKiBmcm9tIHNqIHAsIHNqIHEgd2hlcmUg cS5hID0gcC5hIGFuZCBxLmIgPSBxLmEgLSAxOworc2VsZWN0IHAuKiBmcm9tIHNqIHAsIHNq IHEgd2hlcmUgcS5hID0gcC5hIGFuZCBxLmIgPSBxLmEgLSAxOworCistLSBTZWxmLWpvaW4g cmVtb3ZhbCBwZXJmb3JtcyBhZnRlciBhIHN1YnF1ZXJ5IHB1bGwtdXAgcHJvY2VzcyBhbmQg Y291bGQgcmVtb3ZlCistLSBzdWNoIGtpbmQgb2Ygc2VsZi1qb2luIHRvby4gQ2hlY2sgdGhp cyBvcHRpb24uCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHAKK3do ZXJlIGV4aXN0cyAoc2VsZWN0ICogZnJvbSBzaiBxCisJCQkJd2hlcmUgcS5hID0gcC5hIGFu ZCBxLmIgPCAxMCk7CitzZWxlY3QgKiBmcm9tIHNqIHAgd2hlcmUgZXhpc3RzIChzZWxlY3Qg KiBmcm9tIHNqIHEgd2hlcmUgcS5hID0gcC5hIGFuZCBxLmIgPCAxMCk7CisKKy0tIERvbid0 IHJlbW92ZSBzZWxmLWpvaW4gZm9yIHRoZSBjYXNlIG9mIGVxdWFsaXR5IG9mIHR3byBkaWZm ZXJlbnQgdW5pcXVlIGNvbHVtbnMuCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBm cm9tIHNqIHQxLCBzaiB0MiB3aGVyZSB0MS5hID0gdDIuYyBhbmQgdDEuYiBpcyBub3QgbnVs bDsKKworLS0gRGVnZW5lcmF0ZWQgY2FzZS4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVj dCAqIGZyb20KKwkoc2VsZWN0IGEgYXMgeCBmcm9tIHNqIHdoZXJlIGZhbHNlKSBhcyBxMSwK Kwkoc2VsZWN0IGEgYXMgeSBmcm9tIHNqIHdoZXJlIGZhbHNlKSBhcyBxMgord2hlcmUgcTEu eCA9IHEyLnk7CisKKy0tIFdlIGNhbid0IHVzZSBhIGNyb3NzLUVDIGdlbmVyYXRlZCBzZWxm IGpvaW4gcXVhbCBiZWNhdXNlIG9mIGN1cnJlbnQgbG9naWMgb2YKKy0tIHRoZSBnZW5lcmF0 ZV9qb2luX2ltcGxpZWRfZXF1YWxpdGllcyByb3V0aW5lLgorZXhwbGFpbiAoY29zdHMgb2Zm KQorc2VsZWN0ICogZnJvbSBzaiB0MSwgc2ogdDIgd2hlcmUgdDEuYSA9IHQxLmIgYW5kIHQx LmIgPSB0Mi5iIGFuZCB0Mi5iID0gdDIuYTsKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVj dCAqIGZyb20gc2ogdDEsIHNqIHQyLCBzaiB0Mword2hlcmUgdDEuYSA9IHQxLmIgYW5kIHQx LmIgPSB0Mi5iIGFuZCB0Mi5iID0gdDIuYQorCWFuZCB0MS5iID0gdDMuYiBhbmQgdDMuYiA9 IHQzLmE7CisKKy0tIERvdWJsZSBzZWxmLWpvaW4gcmVtb3ZhbC4KKy0tIFVzZSBhIGNvbmRp dGlvbiBvbiAiYiArIDEiLCBub3Qgb24gImIiLCBmb3IgdGhlIHNlY29uZCBqb2luLCBzbyB0 aGF0CistLSB0aGUgZXF1aXZhbGVuY2UgY2xhc3MgaXMgZGlmZmVyZW50IGZyb20gdGhlIGZp cnN0IG9uZSwgYW5kIHdlIGNhbgorLS0gdGVzdCB0aGUgbm9uLWVjIGNvZGUgcGF0aC4KK2V4 cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogdDEgam9pbiBzaiB0MiBvbiB0 MS5hID0gdDIuYSBhbmQgdDEuYiA9IHQyLmIKKwlqb2luIHNqIHQzIG9uIHQyLmEgPSB0My5h IGFuZCB0Mi5iICsgMSA9IHQzLmIgKyAxOworCistLSBzdWJzZWxlY3QgdGhhdCByZWZlcmVu Y2VzIHRoZSByZW1vdmVkIHJlbGF0aW9uCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3Qg dDEuYSwgKHNlbGVjdCBhIGZyb20gc2ogd2hlcmUgYSA9IHQyLmEgYW5kIGEgPSB0MS5hKQor ZnJvbSBzaiB0MSwgc2ogdDIKK3doZXJlIHQxLmEgPSB0Mi5hOworCistLSBzZWxmLWpvaW4g dW5kZXIgb3V0ZXIgam9pbgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBz aiB4IGpvaW4gc2ogeSBvbiB4LmEgPSB5LmEKK2xlZnQgam9pbiBpbnQ4X3RibCB6IG9uIHgu YSA9IHoucTE7CisKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogeCBq b2luIHNqIHkgb24geC5hID0geS5hCitsZWZ0IGpvaW4gaW50OF90YmwgeiBvbiB5LmEgPSB6 LnExOworCistLSBUZXN0IHRoYXQgcGxhY2Vob2xkZXJzIGFyZSB1cGRhdGVkIGNvcnJlY3Rs eSBhZnRlciBqb2luIHJlbW92YWwKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZy b20gKHZhbHVlcyAoMSkpIHgKK2xlZnQgam9pbiAoc2VsZWN0IGNvYWxlc2NlKHkucTEsIDEp IGZyb20gaW50OF90YmwgeQorCXJpZ2h0IGpvaW4gc2ogajEgaW5uZXIgam9pbiBzaiBqMiBv biBqMS5hID0gajIuYQorCW9uIHRydWUpIHoKK29uIHRydWU7CisKKy0tIFRlc3QgdGhhdCBP UiBwcmVkaWNhdGVkIGFyZSB1cGRhdGVkIGNvcnJlY3RseSBhZnRlciBqb2luIHJlbW92YWwK K0NSRUFURSBUQUJMRSB0YWJfd2l0aF9mbGFnICggaWQgSU5UIFBSSU1BUlkgS0VZLCBpc19m bGFnIFNNQUxMSU5UKTsKK0NSRUFURSBJTkRFWCBpZHhfdGVzdF9pc19mbGFnIE9OIHRhYl93 aXRoX2ZsYWcgKGlzX2ZsYWcpOworZXhwbGFpbiAoY29zdHMgb2ZmKQorU0VMRUNUIENPVU5U KCopIEZST00gdGFiX3dpdGhfZmxhZyBXSEVSRSAoaXNfZmxhZyBJUyBOVUxMIE9SIGlzX2Zs YWcgPSAwKSBBTkQgaWQgSU4gKFNFTEVDVCBpZCBGUk9NIHRhYl93aXRoX2ZsYWcgV0hFUkUg aWQgSU4gKDIsIDMpKTsKK0RST1AgVEFCTEUgdGFiX3dpdGhfZmxhZzsKKworLS0gSEFWSU5H IGNsYXVzZQorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0IHAuYiBmcm9tIHNqIHAgam9p biBzaiBxIG9uIHAuYSA9IHEuYSBncm91cCBieSBwLmIgaGF2aW5nIHN1bShwLmEpID0gMTsK KworLS0gdXBkYXRlIGxhdGVyYWwgcmVmZXJlbmNlcyBhbmQgcmFuZ2UgdGFibGUgZW50cnkg cmVmZXJlbmNlCitleHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYpCitzZWxlY3QgMSBmcm9t IChzZWxlY3QgeC4qIGZyb20gc2ogeCwgc2ogeSB3aGVyZSB4LmEgPSB5LmEpIHEsCisgIGxh dGVyYWwgZ2VuZXJhdGVfc2VyaWVzKDEsIHEuYSkgZ3MoaSk7CisKK2V4cGxhaW4gKHZlcmJv c2UsIGNvc3RzIG9mZikKK3NlbGVjdCAxIGZyb20gKHNlbGVjdCB5LiogZnJvbSBzaiB4LCBz aiB5IHdoZXJlIHguYSA9IHkuYSkgcSwKKyAgbGF0ZXJhbCBnZW5lcmF0ZV9zZXJpZXMoMSwg cS5hKSBncyhpKTsKKworLS0gVGVzdCB0aGF0IGEgbm9uLUVDLWRlcml2ZWQgam9pbiBjbGF1 c2UgaXMgcHJvY2Vzc2VkIGNvcnJlY3RseS4gVXNlIGFuCistLSBvdXRlciBqb2luIHNvIHRo YXQgd2UgY2FuJ3QgZm9ybSBhbiBFQy4KK2V4cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0ICog ZnJvbSBzaiBwIGpvaW4gc2ogcSBvbiBwLmEgPSBxLmEKKyAgbGVmdCBqb2luIHNqIHIgb24g cC5hICsgcS5hID0gci5hOworCistLSBGSVhNRSB0aGlzIGNvbnN0YW50IGZhbHNlIGZpbHRl ciBkb2Vzbid0IGxvb2sgZ29vZC4gU2hvdWxkIHdlIG1lcmdlCistLSBlcXVpdmFsZW5jZSBj bGFzc2VzPworZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiBwLCBzaiBx IHdoZXJlIHAuYSA9IHEuYSBhbmQgcC5iID0gMSBhbmQgcS5iID0gMjsKKworLS0gQ2hlY2sg dGhhdCBhdHRyX25lZWRlZCBpcyB1cGRhdGVkIGNvcnJlY3RseSBhZnRlciBzZWxmLWpvaW4g cmVtb3ZhbC4gSW4gdGhpcworLS0gdGVzdCwgdGhlIGpvaW4gb2YgajEgd2l0aCBqMiBpcyBy ZW1vdmVkLiBrMS5iIGlzIHJlcXVpcmVkIGF0IGVpdGhlciBqMSBvciBqMi4KKy0tIElmIHRo aXMgaW5mbyBpcyBsb3N0LCBqb2luIHRhcmdldGxpc3QgZm9yIChrMSwgazIpIHdpbGwgbm90 IGNvbnRhaW4gazEuYi4KKy0tIFVzZSBpbmRleCBzY2FuIGZvciBrMSBzbyB0aGF0IHdlIGRv bid0IGdldCAnYicgZnJvbSBwaHlzaWNhbCB0bGlzdCB1c2VkIGZvcgorLS0gc2Vxc2Nhbi4g QWxzbyBkaXNhYmxlIHJlb3JkZXJpbmcgb2Ygam9pbnMgYmVjYXVzZSB0aGlzIHRlc3QgZGVw ZW5kcyBvbiBhCistLSBwYXJ0aWN1bGFyIGpvaW4gdHJlZS4KK2NyZWF0ZSB0YWJsZSBzayAo YSBpbnQsIGIgaW50KTsKK2NyZWF0ZSBpbmRleCBvbiBzayhhKTsKK3NldCBqb2luX2NvbGxh cHNlX2xpbWl0IHRvIDE7CitzZXQgZW5hYmxlX3NlcXNjYW4gdG8gb2ZmOworZXhwbGFpbiAo Y29zdHMgb2ZmKSBzZWxlY3QgMSBmcm9tCisJKHNrIGsxIGpvaW4gc2sgazIgb24gazEuYSA9 IGsyLmEpCisJam9pbiAoc2ogajEgam9pbiBzaiBqMiBvbiBqMS5hID0gajIuYSkgb24gajEu YiA9IGsxLmI7CitleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCAxIGZyb20KKwkoc2sgazEg am9pbiBzayBrMiBvbiBrMS5hID0gazIuYSkKKwlqb2luIChzaiBqMSBqb2luIHNqIGoyIG9u IGoxLmEgPSBqMi5hKSBvbiBqMi5iID0gazEuYjsKK3Jlc2V0IGpvaW5fY29sbGFwc2VfbGlt aXQ7CityZXNldCBlbmFibGVfc2Vxc2NhbjsKKworLS0gQ2hlY2sgdGhhdCBjbGF1c2VzIGZy b20gdGhlIGpvaW4gZmlsdGVyIGxpc3QgaXMgbm90IGxvc3Qgb24gdGhlIHNlbGYtam9pbiBy ZW1vdmFsCitDUkVBVEUgVEFCTEUgZW1wMSAoIGlkIFNFUklBTCBQUklNQVJZIEtFWSBOT1Qg TlVMTCwgY29kZSBpbnQpOworZXhwbGFpbiAodmVyYm9zZSwgY29zdHMgb2ZmKQorU0VMRUNU ICogRlJPTSBlbXAxIGUxLCBlbXAxIGUyIFdIRVJFIGUxLmlkID0gZTIuaWQgQU5EIGUyLmNv ZGUgPD4gZTEuY29kZTsKKworLS0gV2UgY2FuIHJlbW92ZSB0aGUgam9pbiBldmVuIGlmIHdl IGZpbmQgdGhlIGpvaW4gY2FuJ3QgZHVwbGljYXRlIHJvd3MgYW5kCistLSB0aGUgYmFzZSBx dWFscyBvZiBlYWNoIHNpZGUgYXJlIGRpZmZlcmVudC4gIEluIHRoZSBmb2xsb3dpbmcgY2Fz ZSB3ZSBlbmQgdXAKKy0tIG1vdmluZyBxdWFscyBvdmVyIHRvIHMxIHRvIG1ha2UgaXQgc28g aXQgY2FuJ3QgbWF0Y2ggYW55IHJvd3MuCitjcmVhdGUgdGFibGUgc2woYSBpbnQsIGIgaW50 KTsKK2NyZWF0ZSB1bmlxdWUgaW5kZXggb24gc2woYSwgYik7Cit2YWN1dW0gYW5hbHl6ZSBz bDsKKworLS0gQm90aCBzaWRlcyBhcmUgdW5pcXVlLCBidXQgYmFzZSBxdWFscyBhcmUgZGlm ZmVyZW50CitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNsIHQxLCBzbCB0 MiB3aGVyZSB0MS5hID0gdDIuYSBhbmQgdDEuYiA9IDEgYW5kIHQyLmIgPSAyOworCistLQor LS0tLSBPbmx5IG9uZSBzaWRlIGlzIHVucWl1ZQorLS1zZWxlY3QgKiBmcm9tIHNsIHQxLCBz bCB0MiB3aGVyZSB0MS5hID0gdDIuYSBhbmQgdDEuYiA9IDE7CistLXNlbGVjdCAqIGZyb20g c2wgdDEsIHNsIHQyIHdoZXJlIHQxLmEgPSB0Mi5hIGFuZCB0Mi5iID0gMTsKKy0tCistLS0t IFNldmVyYWwgdW5pcXVlcyBpbmRleGVzIG1hdGNoLCBhbmQgd2Ugc2VsZWN0IGEgZGlmZmVy ZW50IG9uZQorLS0tLSBmb3IgZWFjaCBzaWRlLCBzbyB0aGUgam9pbiBpcyBub3QgcmVtb3Zl ZAorLS1jcmVhdGUgdGFibGUgc20oYSBpbnQgdW5pcXVlLCBiIGludCB1bmlxdWUsIGMgaW50 IHVuaXF1ZSk7CistLWV4cGxhaW4gKGNvc3RzIG9mZikKKy0tc2VsZWN0ICogZnJvbSBzbSBt LCBzbSBuIHdoZXJlIG0uYSA9IG4uYiBhbmQgbS5jID0gbi5jOworLS1leHBsYWluIChjb3N0 cyBvZmYpCistLXNlbGVjdCAqIGZyb20gc20gbSwgc20gbiB3aGVyZSBtLmEgPSBuLmMgYW5k IG0uYiA9IG4uYjsKKy0tZXhwbGFpbiAoY29zdHMgb2ZmKQorLS1zZWxlY3QgKiBmcm9tIHNt IG0sIHNtIG4gd2hlcmUgbS5jID0gbi5iIGFuZCBtLmEgPSBuLmE7CisKKy0tIENoZWNrIG9w dGltaXphdGlvbiBkaXNhYmxpbmcgaWYgaXQgd2lsbCB2aW9sYXRlIHNwZWNpYWwgam9pbiBj b25kaXRpb25zLgorLS0gVHdvIGlkZW50aWNhbCBqb2luZWQgcmVsYXRpb25zIHNhdGlzZmll cyBzZWxmIGpvaW4gcmVtb3ZhbCBjb25kaXRpb25zIGJ1dAorLS0gc3RheSBpbiBkaWZmZXJl bnQgc3BlY2lhbCBqb2luIGluZm9zLgorQ1JFQVRFIFRBQkxFIHNqX3QxIChpZCBzZXJpYWws IGEgaW50KTsKK0NSRUFURSBUQUJMRSBzal90MiAoaWQgc2VyaWFsLCBhIGludCk7CitDUkVB VEUgVEFCTEUgc2pfdDMgKGlkIHNlcmlhbCwgYSBpbnQpOworQ1JFQVRFIFRBQkxFIHNqX3Q0 IChpZCBzZXJpYWwsIGEgaW50KTsKKworQ1JFQVRFIFVOSVFVRSBJTkRFWCBPTiBzal90MyBV U0lORyBidHJlZSAoYSxpZCk7CitDUkVBVEUgVU5JUVVFIElOREVYIE9OIHNqX3QyIFVTSU5H IGJ0cmVlIChpZCk7CisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gc2pf dDEKK0pPSU4gKAorCVNFTEVDVCBzal90Mi5pZCBBUyBpZCBGUk9NIHNqX3QyCisJV0hFUkUg RVhJU1RTCisJCSgKKwkJU0VMRUNUIFRSVUUgRlJPTSBzal90Myxzal90NCBXSEVSRSBzal90 My5hID0gMSBBTkQgc2pfdDMuaWQgPSBzal90Mi5pZAorCQkpCisJKSB0MnQzdDQKK09OIHNq X3QxLmlkID0gdDJ0M3Q0LmlkCitKT0lOICgKKwlTRUxFQ1Qgc2pfdDIuaWQgQVMgaWQgRlJP TSBzal90MgorCVdIRVJFIEVYSVNUUworCQkoCisJCVNFTEVDVCBUUlVFIEZST00gc2pfdDMs c2pfdDQgV0hFUkUgc2pfdDMuYSA9IDEgQU5EIHNqX3QzLmlkID0gc2pfdDIuaWQKKwkJKQor CSkgX3QydDN0NAorT04gc2pfdDEuaWQgPSBfdDJ0M3Q0LmlkOworCityZXNldCBlbmFibGVf aGFzaGpvaW47CityZXNldCBlbmFibGVfbWVyZ2Vqb2luOworCiAtLQogLS0gVGVzdCBoaW50 cyBnaXZlbiBvbiBpbmNvcnJlY3QgY29sdW1uIHJlZmVyZW5jZXMgYXJlIHVzZWZ1bAogLS0K LS0gCjIuMzEuMQoK --------------6BEFA584A5E0C765570892A9--