From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Nick Edelen" Subject: [RFC/PATCH 1/4] rev-cache: basic implementation + full docs + tests Date: Fri, 03 Jul 2009 16:13:29 +0100 Message-ID: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=----------3cbU3E1dH9onv4j9AB9JJ8 Cc: "Junio C Hamano" , "Sam Vilain" , "Shawn O. Pearce" , "Johannes Schindelin" , "Andreas Ericsson" , "Jeff King" To: "git@vger.kernel.org" X-From: git-owner@vger.kernel.org Fri Jul 03 17:14:19 2009 Return-path: Envelope-to: gcvg-git-2@gmane.org Received: from vger.kernel.org ([209.132.176.167]) by lo.gmane.org with esmtp (Exim 4.50) id 1MMkSw-0005qe-0m for gcvg-git-2@gmane.org; Fri, 03 Jul 2009 17:14:19 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755378AbZGCPNo (ORCPT ); Fri, 3 Jul 2009 11:13:44 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751812AbZGCPNo (ORCPT ); Fri, 3 Jul 2009 11:13:44 -0400 Received: from mail-ew0-f215.google.com ([209.85.219.215]:58426 "EHLO mail-ew0-f215.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755010AbZGCPNm (ORCPT ); Fri, 3 Jul 2009 11:13:42 -0400 Received: by mail-ew0-f215.google.com with SMTP id 11so1142634ewy.37 for ; Fri, 03 Jul 2009 08:13:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:date:to:subject:from:cc :content-type:mime-version:message-id:user-agent; bh=rHKJH4t3K56ZPePXZJzfZlHYSnfLV8HnodYceQpaPe8=; b=gsZuVFAcUtrqBKSXn5VBGAmESmVNLF5r7OtC6IsMDSPxQmnJwJY0+JfGGO/W25yYkc 7MK11l3Yiol7y3e519FutsFUqSnULaIOZ9WVmPKnyLQ65lRsQXdSe86277JOn6hp5cMC EEQmxNlRSzrIqULlNhhDODvMYzjiDszmjmM3s= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=date:to:subject:from:cc:content-type:mime-version:message-id :user-agent; b=LLFLPtHmyK58uFF5wdoDoiT32CiakaEe4vz/KBG24iqjh7P+IsMFVSc3JCsSJ+Xxx4 xTpCSsZ5SCDmLBcKGLqBVj+ANN5oT8PKNqHjPbqr1Hf+U8vdiOmlZSIaxDq4cZW0eyMd o8e4W+qZdY92rKiQhaN3LGglD5euL2OObk1ws= Received: by 10.210.65.16 with SMTP id n16mr1081618eba.78.1246634023920; Fri, 03 Jul 2009 08:13:43 -0700 (PDT) Received: from sirnot (resnet-nat-217.ucs.ed.ac.uk [194.81.254.217]) by mx.google.com with ESMTPS id 10sm3026863eyz.41.2009.07.03.08.13.42 (version=TLSv1/SSLv3 cipher=RC4-MD5); Fri, 03 Jul 2009 08:13:43 -0700 (PDT) User-Agent: Opera Mail/9.63 (Win32) Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Archived-At: ------------3cbU3E1dH9onv4j9AB9JJ8 Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: 7bit Traversing objects is currently very costly, as every commit and tree must be loaded and parsed. Much time and energy could be saved by caching metadata and topological info in an efficient, easily accessible manner. Furthermore, this could improve git's interfacing potential, by providing a condensed summary of a repository's commit tree. This is the first of a series to implement such a revision caching mechanism, aptly named rev-cache. The series will provide: - a core API to manipulate and traverse caches - an integration into the internal revision walker - a porcelain front-end providing access to users and (shell) applications - a series of tests to verify/demonstrate correctness - documentation of the API, porcelain and core concepts In this particular patch provides: - minimal API: caching only commit topo data - minimal porcelain: add and walk cache slices - appropriate tests - full documentation Signed-off-by: Nick Edelen --- Documentation/technical/rev-cache.txt | 367 +++++++++++ Makefile | 2 + builtin-rev-cache.c | 197 ++++++ builtin.h | 1 + commit.c | 4 +- git.c | 1 + rev-cache.c | 1160 +++++++++++++++++++++++++++++++++ revision.c | 4 +- revision.h | 41 ++- t/t6015-rev-cache-list.sh | 100 +++ t/t6015-sha1-dump-diff.py | 36 + 11 files changed, 1909 insertions(+), 4 deletions(-) ------------3cbU3E1dH9onv4j9AB9JJ8 Content-Disposition: attachment; filename=patch_basic.diff Content-Type: application/octet-stream; name=patch_basic.diff Content-Transfer-Encoding: Base64 VHJhdmVyc2luZyBvYmplY3RzIGlzIGN1cnJlbnRseSB2ZXJ5IGNvc3RseSwgYXMg ZXZlcnkgY29tbWl0IGFuZCB0cmVlIG11c3QgYmUgbG9hZGVkIGFuZCBwYXJzZWQu ICBNdWNoIHRpbWUgYW5kIGVuZXJneSBjb3VsZCBiZSBzYXZlZCBieSBjYWNoaW5n IG1ldGFkYXRhIGFuZCB0b3BvbG9naWNhbCBpbmZvIGluIGFuIGVmZmljaWVudCwg ZWFzaWx5IGFjY2Vzc2libGUgbWFubmVyLiAgRnVydGhlcm1vcmUsIHRoaXMgY291 bGQgaW1wcm92ZSBnaXQncyBpbnRlcmZhY2luZyBwb3RlbnRpYWwsIGJ5IHByb3Zp ZGluZyBhIGNvbmRlbnNlZCBzdW1tYXJ5IG9mIGEgcmVwb3NpdG9yeSdzIGNvbW1p dCB0cmVlLgoKVGhpcyBpcyB0aGUgZmlyc3Qgb2YgYSBzZXJpZXMgdG8gaW1wbGVt ZW50IHN1Y2ggYSByZXZpc2lvbiBjYWNoaW5nIG1lY2hhbmlzbSwgYXB0bHkgbmFt ZWQgcmV2LWNhY2hlLiAgVGhlIHNlcmllcyB3aWxsIHByb3ZpZGU6CiAtIGEgY29y ZSBBUEkgdG8gbWFuaXB1bGF0ZSBhbmQgdHJhdmVyc2UgY2FjaGVzCiAtIGFuIGlu dGVncmF0aW9uIGludG8gdGhlIGludGVybmFsIHJldmlzaW9uIHdhbGtlcgogLSBh IHBvcmNlbGFpbiBmcm9udC1lbmQgcHJvdmlkaW5nIGFjY2VzcyB0byB1c2VycyBh bmQgKHNoZWxsKSBhcHBsaWNhdGlvbnMKIC0gYSBzZXJpZXMgb2YgdGVzdHMgdG8g dmVyaWZ5L2RlbW9uc3RyYXRlIGNvcnJlY3RuZXNzCiAtIGRvY3VtZW50YXRpb24g b2YgdGhlIEFQSSwgcG9yY2VsYWluIGFuZCBjb3JlIGNvbmNlcHRzCgpJbiB0aGlz IHBhcnRpY3VsYXIgcGF0Y2ggcHJvdmlkZXM6CiAtIG1pbmltYWwgQVBJOiBjYWNo aW5nIG9ubHkgY29tbWl0IHRvcG8gZGF0YQogLSBtaW5pbWFsIHBvcmNlbGFpbjog YWRkIGFuZCB3YWxrIGNhY2hlIHNsaWNlcwogLSBhcHByb3ByaWF0ZSB0ZXN0cwog LSBmdWxsIGRvY3VtZW50YXRpb24KClNpZ25lZC1vZmYtYnk6IE5pY2sgRWRlbGVu IDxzaXJub3RAZ21haWwuY29tPgoKLS0tCiBEb2N1bWVudGF0aW9uL3RlY2huaWNh bC9yZXYtY2FjaGUudHh0IHwgIDM2NyArKysrKysrKysrKwogTWFrZWZpbGUgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDIgKwogYnVpbHRpbi1yZXYt Y2FjaGUuYyAgICAgICAgICAgICAgICAgICB8ICAxOTcgKysrKysrCiBidWlsdGlu LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMSArCiBjb21taXQu YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNCArLQogZ2l0LmMg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDEgKwogcmV2LWNh Y2hlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDExNjAgKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrCiByZXZpc2lvbi5jICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgNCArLQogcmV2aXNpb24uaCAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICAgNDEgKystCiB0L3Q2MDE1LXJldi1jYWNoZS1s aXN0LnNoICAgICAgICAgICAgIHwgIDEwMCArKysKIHQvdDYwMTUtc2hhMS1kdW1w LWRpZmYucHkgICAgICAgICAgICAgfCAgIDM2ICsKIDExIGZpbGVzIGNoYW5nZWQs IDE5MDkgaW5zZXJ0aW9ucygrKSwgNCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQg YS9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9yZXYtY2FjaGUudHh0IGIvRG9jdW1l bnRhdGlvbi90ZWNobmljYWwvcmV2LWNhY2hlLnR4dApuZXcgZmlsZSBtb2RlIDEw MDc1NQppbmRleCAwMDAwMDAwLi5lOWZjOTFlCi0tLSAvZGV2L251bGwKKysrIGIv RG9jdW1lbnRhdGlvbi90ZWNobmljYWwvcmV2LWNhY2hlLnR4dApAQCAtMCwwICsx LDM2NyBAQAorcmV2LWNhY2hlCis9PT09PT09PT0KKworVGhlIHJldmlzaW9uIGNh Y2hlIEFQSSAoJ3Jldi1jYWNoZScpIHByb3ZpZGVzIGEgbWV0aG9kIGZvciBlZmZp Y2llbnRseSBzdG9yaW5nIAorYW5kIGFjY2Vzc2luZyBjb21taXQgYnJhbmNoIHNl Y3Rpb25zLiAgU3VjaCBicmFuY2ggc2xpY2VzIGFyZSBkZWZpbmVkIGJ5IGEgCitz ZXJpZXMgb2YgZW5kIChpbnRlcmVzdGluZykgYW5kIHN0YXJ0ICh1bmludGVyZXN0 aW5nKSBjb21taXRzLiAgRWFjaCBzbGljZSAKK2NvbnRhaW5zLCBwZXIgY29tbWl0 OgorCisqIEFsbCBpbnRyYS1zbGljZSB0b3BvbG9naWNhbCByZWxhdGlvbnMsIGVu Y29kZWQgaW50byBwYXRoICJjaGFubmVscyIuCisqIE9iamVjdCBtZXRhLWRhdGE6 IHR5cGUsIFNIQS0xLCBzaXplLCBkYXRlIChmb3IgY29tbWl0cykuCisqIE9iamVj dHMgaW50cm9kdWNlZCBpbiB0aGF0IGNvbW1pdCwgcmVsYXRpdmUgdG8gc2xpY2Ug KGllLiBvbmx5IGZvciBub24tc3RhcnQgCisgIGNvbW1pdHMpLgorCitTdG9yYWdl IGRhdGEgc3RydWN0dXJlcyBhcmUgbm90IGV4cG9ydGVkLCBpbiBwYXJ0IHRvIGtl ZXAgZ2l0J3MgZ2xvYmFsIHNjb3BlIAorY2xlYW4sIGJ1dCBsYXJnZWx5IGJlY2F1 c2UgdGhleSdyZSBwcmV0dHkgbXVjaCB1c2VsZXNzIG91dHNpZGUgcmV2LWNhY2hl LgorCisKK1RoZSBQb3JjZWxhaW4KKy0tLS0tLS0tLS0tLS0KK0ZvciBlYXN5IGFj Y2VzcyB0byAncmV2LWNhY2hlJyBmcm9tIHNjcmlwdHMgYW5kIG90aGVyIGdvb2Rp ZXMgdGhlcmUncyBhIAorZnJvbnQtZW5kIGNhbGxlZCAoc3VycHJpc2UhKSBgcmV2 LWNhY2hlYC4gIEN1cnJlbnRseSBpdCdzIHByZXR0eSBzaGl0LCBJJ20gbm90IAor Z29ubmEgbGllIHRvIHlvdSwgYnV0IGZvciBpbi1zbGljZSB0cmF2ZXJzYWxzIGl0 J3MgZmVjay1sb2FkcyBmYXN0ZXIgdGhhbiAKK2ByZXYtbGlzdGAuICBXaXRoIG1v cmUgb3V0cHV0IG1vZGVzIGFuZCBzdHVmZiBpdCBjb3VsZCBwb3RlbnRpYWxseSBi ZSB1c2VkIGJ5IAorYW55IChleHRlcm5hbCkgYXBwIGluIG5lZWQgb2YgcXVpY2sg ZGF0YS4KKworQXQgdGhlIG1vbWVudCBpdCBsb29rcyBsaWtlIHRoaXM6CisKK2Bn aXQtcmV2LWNhY2hlIENPTU1BTkQgW29wdGlvbnNdIFs8Y29tbWl0LWlkPi4uLl1g CisKK1dpdGggdGhlIGNvbW1hbmRzOgorCitgYWRkYDo6CisJQWRkIHJldmlzaW9u cyB0byB0aGUgY2FjaGUuICBSZWFkcyBjb21taXQgaWRzIGZyb20gc3RkaW4sIGZv cm1hdHRlZCBhczoKKwlgRU5EIEVORCAuLi4gXC0tbm90IFNUQVJUIFNUQVJUIC4u LmAKKysKK09wdGlvbnM6CisKK2BcLS1hbGxgOjogSW5jbHVkZSBhbGwgaGVhZHMg YXMgZW5kcy4KK2BcLS1mcmVzaGA6OiBFeGNsdWRlIGV2ZXJ5dGhpbmcgYWxyZWFk eSBpbiBhIGNhY2hlIHNsaWNlLgorYFwtLXN0ZGluYDo6IEFsc28gcmVhZCBjb21t aXQgaWRzIGZyb20gc3RkaW4gKHNlcGVyYXRlZCBieSBuZXdsaW5lLCBgXC0tbm90 YCAKK2Fsc28gdmFsaWQpLgorYFwtLWxlZ3NgOjogRW5zdXJlIGJyYW5jaCBoYXMg bm8gImRhbmdsaW5nIiBzdGFydHMgKGllLiBpcyBzZWxmLWNvbnRhaW5lZCkuCitg XC0tbm9vYmplY3RzYDo6IERvbid0IGluY2x1ZGUgbm9uLWNvbW1pdCBvYmplY3Rz LgorCitgd2Fsa2A6OgorCVdhbGsgYSBjYWNoZSBzbGljZSBiYXNlZCBvbiBzZXQg b2YgY29tbWl0czsgZm9ybWF0dGVkIGFzIGFkZC4KKysKK09wdGlvbnM6CisKK2Bc LS1vYmplY3RzYDo6IEluY2x1ZGUgbm9uLWNvbW1pdCBvYmplY3RzIGluIHRyYXZl cnNhbC4KKworYGZ1c2VgOjoKKwlDb2FndWxhdGUgc2V2ZXJhbCBjYWNoZSBzbGlj ZXMgaW50byBhIHNpbmdsZSBsYXJnZSBzbGljZS4KKysKK09wdGlvbnM6CisKK2Bc LS1hbGxgOjogSW5jbHVkZSBhbGwgb2JqZWN0cyBpbiByZXBvc2l0b3J5LiAgV2ls bCBvbmx5IHRyYXZlcnNlIGFzIG9mIGNhY2hlIAorZW5kcyBpZiB0aGlzIGlzIG5v dCBzcGVjaWZpZWQuCitgXC0tbm9vYmplY3RzYDo6IERvbid0IGluY2x1ZGUgbm9u LWNvbW1pdCBvYmplY3RzLgorYFwtLWlnbm9yZS1zaXplWz1OXWA6OiBEbyBub3Qg ZnVzZSBzbGljZXMgb2YgZmlsZSBzaXplID49IGBOYC4gIElmIGBOYCBpcyBub3Qg CitnaXZlbiB0aGUgY3V0b2ZmIHNpemUgZGVmYXVsdHMgdG8gfjVNQi4KKworYGlu ZGV4YDo6CisJUmVnZW5lcmF0ZSB0aGUgY2FjaGUgaW5kZXguCisKK1RoZSBBUEkK Ky0tLS0tLS0KKworVGhlIEFQSSBmb3IgJ3Jldi1jYWNoZScgaXMgcXVpdGUgc2lt cGxlLiAgWW91IGNhbiBmaW5kIHRoZSBmdW5jdGlvbiBwcm90b3R5cGVzIAoraW4g YHJldmlzaW9uLmhgLgorCitEYXRhIFN0cnVjdHVyZXMKK35+fn5+fn5+fn5+fn5+ fgorCitUaGUgYHJldl9jYWNoZV9pbmZvYCBzdHJ1Y3QgaG9sZHMgYWxsIHRoZSBv cHRpb25zIGFuZCBmbGFncyBmb3IgdGhlIEFQSS4KKworLS0tLQorc3RydWN0IHJl dl9jYWNoZV9pbmZvIHsKKwkvKiBnZW5lcmF0aW9uIGZsYWdzICovCisJdW5zaWdu ZWQgb2JqZWN0cyA6IDEsIAorCQlsZWdzIDogMSwgCisJCW1ha2VfaW5kZXggOiAx OworCQorCS8qIHRyYXZlcnNhbCBmbGFncyAqLworCXVuc2lnbmVkIHNhdmVfdW5p cXVlIDogMSwgCisJCWFkZF90b19wZW5kaW5nIDogMTsKKwkKKwkvKiBmdXNlIG9w dGlvbnMgKi8KKwl1bnNpZ25lZCBpbnQgaWdub3JlX3NpemU7Cit9OworLS0tLQor CitUaGUgZmllbGRzIHNob3VsZCBiZSBzZWxmLWV4cGxhbmF0b3J5LCBidXQganVz dCB0byBiZSBleHBsaWNpdDoKKworYG9iamVjdHNgOjogQWRkIG9iamVjdHMgdG8g c2xpY2UuCitgbGVnc2A6OiBNYWtlIHNsaWNlIGxlZ3MuCitgbWFrZV9pbmRleGA6 OiBJbnRlZ3JhdGUgbmV3bHktbWFkZSBzbGljZSBpbnRvIGluZGV4LgorYHNhdmVf dW5pcXVlYDo6IExvYWQgdW5pcXVlIG5vbi1jb21taXQgb2JqZWN0cyBpbnRvIGB1 bmlxdWVgIGZpZWxkIG9mIGVhY2ggCitgY29tbWl0YCBvYmplY3QuCitgYWRkX3Rv X3BlbmRpbmdgOjogQXBwZW5kIHVuaXF1ZSBub24tY29tbWl0IG9iamVjdHMgdG8g dGhlIGBwZW5kaW5nYCBvYmplY3QgCitsaXN0IGluIHRoZSBwYXNzZWQgYHJldl9p bmZvYCBpbnN0YW5jZS4KK2BpZ25vcmVfc2l6ZWA6OiBJZiBub24temVybywgaWdu b3JlIHNsaWNlcyB3aXRoIHNpemUgZ3JlYXRlciBvciBlcXVhbCB0byB0aGlzLgor CitGdW5jdGlvbnMKK35+fn5+fn5+fgorCitgaW5pdF9yY2lgOjoKKworCUluaXRp YXRlIGEgYHJldl9jYWNoZV9pbmZvYCBzdHJ1Y3QgdG8gZGVmYXVsdCBvcHRpb25z LiAgCisKK2BtYWtlX2NhY2hlX3NsaWNlYDo6CisKKwlDcmVhdGUgYSBjYWNoZSBi YXNlZCBvbiBhbiBhIGByZXZfaW5mb2AgaW5zdGFuY2Ugb3IgYGNvbW1pdF9saXN0 YCBzIG9mIAorCSJlbmRzIiBhbmQgInN0YXJ0cyIgKGRlZmF1bHRzIHRvIGxhdHRl ciBpZiBgcmV2X2luZm9gIHBvaW50ZXIgaXMgTlVMTCksIAorCWNvcHlpbmcgdGhl IGNhY2hlIFNIQS0xIGludG8gYSBwYXNzZWQgcG9pbnRlciBpZiBub24temVyby4g IEEgCisJYHJldl9jYWNoZV9pbmZvYCBzdHJ1Y3QgcG9pbnRlciBjYW4gYmUgcGFz c2VkIHRvIHNldCBvcHRpb25zLCB3aGlsZSAKKwlwYXNzaW5nIE5VTEwgd2lsbCBz ZXQgZGVmYXVsdCBvcHRpb25zLiAgQSBsYXN0IHBhcmFtZXRlciBjYW4gCisJb3B0 aW9uYWxseSByZWNpZXZlIHRoZSBmaW5hbCBjYWNoZSBoYXNoLgorCitgbWFrZV9j YWNoZV9pbmRleGA6OgorCisJQWRkIGEgc2xpY2UgdG8gdGhlIGNhY2hlIGluZGV4 LiAgUmVxdWlyZXMgYSBmaWxlIGRlc2NyaXB0b3IsIHRoZSBjYWNoZSAKKwloYXNo IGFuZCB0aGUgZmlsZSBzaXplLiAgTm90ZSB0aGF0IHRoaXMgaXMgbm9ybWFsbHkg Y2FsbGVkIGJ5IAorCWBtYWtlX2NhY2hlX3NsaWNlYCB1bmRlciB0aGUgYG1ha2Vf aW5kZXhgIG9wdGlvbi4KKworYGdldF9jYWNoZV9zbGljZWA6OgorCisJR2l2ZW4g YSBjb21taXQgU0hBLTEgYGdldF9jYWNoZV9zbGljZWAgd2lsbCBzZWFyY2ggdGhl IHNsaWNlIGluZGV4IGFuZCAKKwlyZXR1cm4sIGlmIGZvdW5kLCB0aGUgY2FjaGUt aWRlbnRpZnlpbmcgU0hBLTEuCisKK2B0cmF2ZXJzZV9jYWNoZV9zbGljZWA6Ogor CisJVHJhdmVyc2UgYSBzcGVjaWZpZWQgY2FjaGUgc2xpY2UgYmFzZWQgb246CisK KwkqIGByZXZfY2FjaGVfaW5mb2AgaW5zdGFuY2UgKG9wdGlvbmFsKQorCSogY2Fj aGUgU0hBLTEgaWRlbnRpZmllcgorCSogYHJldl9pbmZvYCBpbnN0YW5jZQorCSog YSBzdGFydGluZyBjb21taXQgYW5kIGNvbW1pdCB3b3JrIGxpc3QKKwkqIGRhdGUg b2Ygb2xkZXN0IGVuY291bnRlcmVkIGludGVyZXN0aW5nIGNvbW1pdAorCSogY3Vy cmVudCBgc2xvcGAgKHRoaXMgYW5kIGFib3ZlIG1haW5seSB1c2VkIGluIGludGVn cmF0aW9uIHdpdGggcmV2aXNpb24gCisJICB3YWxrZXIpCisJCisrCitUaGUgb3V0 cHV0IGlzIHNlbnQgdG8gYSBGSUxPIGBjb21taXRfbGlzdGAgInF1ZXVlIiwgd2hp bGUgYW55IHN0YXJ0IGNvbW1pdHMgYXJlIAorcGFzc2VkIGJhY2sgaW50byB0aGUg d29yayBsaXN0LiAgSWYgdGhlIHdhbGsgaXMgbm90IGNvbnRhaW5lZCB3aXRoaW4g dGhlIHNsaWNlLCAKK2NvbW1pdCBib3VuZGFyaWVzIGFyZSBhbHNvIGluc2VydGVk IGludG8gIndvcmsiLgorCitgZW5kc19mcm9tX3NsaWNlc2A6OgorCisJV2lsbCBt YXJrIGFsbCBlbmQtY29tbWl0cyBpbiB0aGUgc3BlY2lmaWVkIGNhY2hlIHNsaWNl cyB3aXRoIGEgZ2l2ZW4gZmxhZywgCisJYW5kIGFkZCB0aGVtIHRvIHRoZSByZXYg cGVuZGluZyBsaXN0LiAgV2lsbCBpbmNsdWRlIGFsbCBpZiBubyBzbGljZXMgYXJl IAorCXNwZWNpZmllZC4KKworYGNvYWd1bGF0ZV9jYWNoZV9zbGljZXNgOjoKKwor CUdlbmVyYXRlIGEgc2xpY2UgYmFzZWQgb24gdGhlIHBhc3NlZCBgcmV2X2luZm9g IGluc3RhbmNlLCByZXBsYWNpbmcgYWxsIAorCWVuY291bnRlcmVkIHNsaWNlcyB3 aXRoIG9uZSAobGFyZ2VyKSBzbGljZS4gIFRoZSBgaWdub3JlX3NpemVgIGZpZWxk IGluIAorCWByY2lgLCBpZiBub24temVybywgd2lsbCBkaWN0YXRlIHdoaWNoIGNh Y2hlIHNsaWNlIHNpemVzIHRvIGlnbm9yZSBpbiBib3RoIAorCXRyYXZlcnNhbCBh bmQgcmVwbGFjZW1lbnQuCisKK2ByZWdlbmVyYXRlX2luZGV4YDo6CisKKwlSZW1h a2UgY2FjaGUgaW5kZXguCisKK0V4YW1wbGUgVXNhZ2UKKy0tLS0tLS0tLS0tLS0K KworQSBmZXcgZXhhbXBsZXMgdG8gZGVtb25zdHJhdGUgdXNhZ2U6CisKKy5DcmVh dGluZyBhIHNsaWNlCistLS0tCisvKiBwcmV0ZW5kIHlvdSdyZSBhIHBvcmNlbGFp biBmb3IgcmV2LWNhY2hlIHJlYWRpbmcgZnJvbSB0aGUgY29tbWFuZCBsaW5lICov CitzdHJ1Y3QgcmV2X2luZm8gcmV2czsKK3N0cnVjdCByZXZfY2FjaGVfaW5mbyBy Y2k7CisKK2luaXRfcmV2aXNpb25zKCZyZXZzLCAwKTsKK2luaXRfcmNpKCZyY2kp OworCitmbGFncyA9IDA7Citmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJ aWYgKCFzdHJjbXAoYXJndltpXSwgIi0tbm90IikpCisJCWZsYWdzIF49IFVOSU5U RVJFU1RJTkc7CisJZWxzZSBpZighc3RyY21wKGFyZ3ZbaV0sICItLWZyZXNoIikp CisJCWVuZHNfZnJvbV9zbGljZXMoJnJldnMsIFVOSU5URVJFU1RJTkcsIDAsIDAp OworCWVsc2UKKwkJaGFuZGxlX3JldmlzaW9uX2FyZyhhcmd2W2ldLCAmcmV2cywg ZmxhZ3MsIDEpOworfQorCisvKiB3ZSB3YW50IHRvIGV4cGxpY2l0bHkgc2V0IGNl cnRhaW4gb3B0aW9ucyAqLworcmNpLm9iamVjdHMgPSAwOworCitpZiAoIW1ha2Vf Y2FjaGVfc2xpY2UoJnJjaSwgJnJldnMsIDAsIDAsIGNhY2hlX3NoYTEpKQorCXBy aW50ZigibWFkZSBzbGljZSEgIGl0J3MgY2FsbGVkICVzXG4iLCBzaGExX3RvX2hl eChjYWNoZV9zaGExKSk7CistLS0tCisKKy5UcmF2ZXJzaW5nIGEgc2xpY2UKKy0t LS0KKy8qIGxldCdzIHNheSB5b3UncmUgd2Fsa2luZyB0aGUgdHJlZSB3aXRoIGEg J3dvcmsnIGxpc3Qgb2YgY3VycmVudCBoZWFkcyBhbmQgYSAKKyAqIEZJTE8gb3V0 cHV0IGxpc3QgJ291dCcgKi8KK291dCA9IDA7CitvdXRwID0gJm91dDsKKword2hp bGUgKHdvcmspIHsKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBwb3BfY29tbWl0 KCZ3b3JrKTsKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmplY3QgPSAmY29tbWl0LT5vYmpl Y3Q7CisJdW5zaWduZWQgY2hhciAqY2FjaGVfc2hhMTsKKwkKKwlpZiAoY2FjaGVf c2hhMSA9IGdldF9jYWNoZV9zbGljZShvYmplY3QtPnNoYTEpKSB7CisJCS8qIG5v dGUgdGhhdCB0aGlzIHdpbGwgaW5zdGF0aWF0ZSBhbnkgdG9wby1yZWxhdGlvbnMg CisJCSAqIGFzIGl0IGdvZXMgKi8KKwkJaWYgKHRyYXZlcnNlX2NhY2hlX3NsaWNl KDAsIGNhY2hlX3NoYTEsICZyZXZzLCAKKwkJCWNvbW1pdCwgMCwgMCwgLyogdXNl IGRlZmF1bHRzICovCisJCQkmb3V0cCwgJndvcmspIDwgMCkKKwkJCWRpZSgiSSdt IG92ZXJyZWFjdGluZyB0byBhIG5vbi1mYXRhbCBjYWNoZSBlcnJvciIpOworCX0g ZWxzZSB7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50cyA9IGNvbW1pdC0+ cGFyZW50czsKKwkJCisJCXdoaWxlIChwYXJlbnRzKSB7CisJCQlzdHJ1Y3QgY29t bWl0ICpwID0gcGFyZW50cy0+aXRlbTsKKwkJCXN0cnVjdCBvYmplY3QgKnBvID0g JnAtPm9iamVjdDsKKwkJCQorCQkJcGFyZW50cyA9IHBhcmVudHMtPm5leHQ7CisJ CQlpZiAocG8tPmZsYWdzICYgVU5JTlRFUkVTVElORykKKwkJCQljb250aW51ZTsK KwkJCQorCQkJaWYgKG9iamVjdC0+ZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQkJ CXBvLT5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworCQkJZWxzZSBpZiAocG8tPmZs YWdzICYgU0VFTikKKwkJCQljb250aW51ZTsKKwkJCQorCQkJaWYgKCFwby0+cGFy c2VkKQorCQkJCXBhcnNlX2NvbW1pdChwKTsKKwkJCWluc2VydF9ieV9kYXRlKHAs ICZ3b3JrKTsKKwkJfQorCQkKKwkJaWYgKG9iamVjdC0+ZmxhZ3MgJiAoU0VFTiB8 IFVOSU5URVJFU1RJTkcpID09IDApCisJCQlvdXRwID0gJmNvbW1pdF9saXN0X2lu c2VydChjb21taXQsIG91dHApOworCQlvYmplY3QtPmZsYWdzIHw9IFNFRU47CisJ fQorfQorLS0tLQorCitTb21lIEludGVybmFscworLS0tLS0tLS0tLS0tLS0KKwor QWx0aG91Z2ggeW91IHJlYWxseSBkb24ndCBuZWVkIHRvIGtub3cgYW55dGhpbmcg YWJvdXQgaG93IHJldi1jYWNoZSBhY3R1YWxseSAKK2RvZXMgaXRzIG1hZ2ljIHNo aXp6LCBhIGJpdCBvZiBiYWNrZ3JvdW5kIG1heSBnbyBhIGxvbmcgd2F5IGlmIHlv dSdyZSB3YWRpbmcgCit0aHJvdWdoIHRoZSBzb3VyY2UuCisKK0ZpbGUgRm9ybWF0 cworfn5+fn5+fn5+fn5+CisKK0Egc2xpY2UgaGFzIGEgYmFzaWMgZml4ZWQtc2l6 ZSBoZWFkZXIsIGZvbGxvd2VkIGJ5IGEgY2VydGFpbiBudW1iZXIgb2Ygb2JqZWN0 IAorZW50cmllcy4gIENvbW1pdHMgYXJlIHNvcnRlZCBpbiB0b3BvLW9yZGVyLCBh bmQgZWFjaCBjb21taXQgZW50cnkgaXMgZm9sbG93ZWQgYnkgdGhlIG9iamVjdHMg YWRkZWQgaW4gdGhhdCBjb21taXQuCisKKy0tLS0KKyAgICAgICAgIC0tICstLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK2hlYWRlciAgICAgIHwgb2Jq ZWN0IG51bWJlciwgZXRjLi4uICAgICAgICAgIHwKKyAgICAgICAgIC0tICstLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK2NvbW1pdCAgICAgIHwgY29t bWl0IGluZm8gICAgICAgICAgICAgICAgICAgIHwKK2VudHJ5ICAgICAgIHwgcGF0 aCBkYXRhICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICstLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgIHwgdHJl ZS9ibG9iIGluZm8gICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICstLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgIHwgdHJl ZS9ibG9iIGluZm8gICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICstLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgIHwgLi4u ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgIC0tICstLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK2NvbW1pdCAgICAgIHwgY29t bWl0IGluZm8gICAgICAgICAgICAgICAgICAgIHwKK2VudHJ5ICAgICAgIHwgcGF0 aCBkYXRhICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICstLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgIHwgdHJl ZS9ibG9iIGluZm8gICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICstLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgIHwgLi4u ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgIC0tICstLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy4uLiAgICAgICAgIC4uLiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICstLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy0tLS0KKworVGhlIGluZGV4 IGlzIHNvbWV3aGF0IHNpbWlsYXIgdG8gcGFjay1maWxlIGluZGV4ZXMsIGNvbnRh aW5pbmcgYSBmYW5vdXQgdGFibGUgCithbmQgYSBsaXN0IG9mIGluZGV4IGVudHJp ZXMgc29ydGVkIGJ5IGhhc2guCisKKy0tLS0KKyAgICAgICAgIC0tICstLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK2hlYWRlciAgICAgIHwgb2JqZWN0 ICMsIGNhY2hlICMsIGV0Yy4gICAgICAgIHwKKyAgICAgICAgIC0tICstLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK2NhY2hlICAgICAgIHwgU0hBLTEg ICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3NoYTFzICAgICAgIHwgLi4uICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgIC0tICstLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK2Zhbm91dCAgICAgIHwgZmFub3V0 WzB4MDBdICAgICAgICAgICAgICAgICAgIHwKK3RhYmxlICAgICAgIH5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAgICAgICAgICAgIHwgZmFub3V0 WzB4ZmZdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgIC0tICstLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK2luZGV4ICAgICAgIHwgZW50cnkg U0hBLTEgICAgICAgICAgICAgICAgICAgIHwKK2VudHJpZXMgICAgIHwgY2FjaGUg c2hhMSBpbmRleCAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICstLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgIHwgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgIC4uLiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICstLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy0tLS0KKworQWxsIHRoZSByZWxh dmFudCBzdHJ1Y3R1cmVzIGFyZSByZWFkaWx5IGFjY2Vzc2libGUgaW4gYHJldi1j YWNoZS5jYAorCitNZWNoYW5pY3MKK35+fn5+fn5+fgorCitBIGxvdCBjYW4gb2Yg dGhlIG1lY2hhbmlzbSBiZSBzdW1tYXJpemVkIGluIHRoZSBgb2JqZWN0X2VudHJ5 YCBzdHJ1Y3Q6CisKKy0tLS0KK3N0cnVjdCBvYmplY3RfZW50cnkgeworCXVuc2ln bmVkIHR5cGUgOiAzOworCXVuc2lnbmVkIGlzX3N0YXJ0IDogMTsKKwl1bnNpZ25l ZCBpc19lbmQgOiAxOworCXVuc2lnbmVkIHVuaW50ZXJlc3RpbmcgOiAxOworCXVu c2lnbmVkIGluY2x1ZGUgOiAxOworCXVuc2lnbmVkIGZsYWdzIDogMTsKKwl1bnNp Z25lZCBjaGFyIHNoYTFbMjBdOworCQorCXVuc2lnbmVkIG1lcmdlX25yIDogNjsK Kwl1bnNpZ25lZCBzcGxpdF9uciA6IDc7CisJdW5zaWduZWQgc2l6ZV9zaXplIDog MzsKKwkKKwl1bnNpZ25lZCBsb25nIGRhdGU7CisJdW5zaWduZWQgc2hvcnQgcGF0 aDsKKwkKKwkvKiBtZXJnZSBwYXRocyAqLworCS8qIHNwbGl0IHBhdGhzICovCisJ Lyogc2l6ZSAqLworfTsKKy0tLS0KKworV2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRo ZSBgdW5pbnRlcmVzdGluZ2AgYW5kIGBpbmNsdWRlYCBmbGFncyAod2hpY2ggYXJl IAorcnVudGltZSBmbGFncyksIGl0J3MgcHJldHR5IG11Y2ggYSB2ZXJiYXRpbSBk ZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0IHN0b3JhZ2UuICAKK09iamVjdCBlbnRy aWVzLCBvbiBkaXNrIGFuZCBpbiBtZW1vcnksIGFyZSAqbm90KiBmaXhlZCBzaXpl cywgYXMgdGhleSByZXF1aXJlIAorZXh0cmEgc3BhY2UgdG8gZW5jb2RlIHRvcG8g YW5kIHNpemUgZGF0YS4KKworYHR5cGVgLCBgc2hhMWAgYW5kIGBkYXRlYCBhcmUg c2VsZi1leHBsYW5hdG9yeS4gIGBpc19zdGFydGAgbWVhbnMgdGhhdCBub3QgYWxs IAoraXRzIHBhcmVudHMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgc2xpY2UsIGFuZCBg aXNfZW5kYCBub3RlcyB0aGF0IGl0IGlzIG5vdCB0aGUgCitwYXJlbnQgb2YgYW55 dGhpbmcgaW4gdGhlIHNsaWNlLiAgYHNpemVfc2l6ZWAgdGVsbHMgdXMgaG93IG1h bnkgYnl0ZXMgdGhlIHNpemUgCit0YWtlcyB1cCAtLSBub3RlIHRoYXQgaXQgZG9z bid0IG5lZWQgYW55IHNwZWNpYWwgZW5jb2RpbmcuCisKK05vdyBjb21lcyB0aGUg aW50ZXJlc3RpbmcgYml0LiAgVG9wb2xvZ2ljYWwgcmVsYXRpb25zIGFyZSBlbmNv ZGVkIHZpYSBhIAorcGF0aC9jaGFubmVsIHN5c3RlbSwgd2hlcmUgZXZlcnkgYnJh bmNoIGlzIGFzc2lnbmVkIGFuIGlkZW50aWZpZXIsIHVuaXF1ZSAKK2R1cmluZyBp dHMgbGlmZS10aW1lIChhbmQgYSBiaXQgbG9uZ2VyKS4gIER1cmluZyB0cmF2ZXJz YWwgdGhlc2UgYXJlIGluZGljZXMgaW4gCithIGBwYXRoYCBhcnJheSwgcmV0YWlu aW5nIHRoZSBzdGF0dXMgb2YgZWFjaCBwYXRoLiAgSW50ZXJlc3RpbmcgcGF0aHMg aGF2ZSAKK2BJUEFUSGAsIHVuaW50ZXJlc3RpbmdzIG9uZXMgYFVQQVRIYCAod2hp Y2ggdHJ1bXBzIGBJUEFUSGApIGFuZCBpbmFjdGl2ZSBvbmVzIAorYDBgLgorCitP Yml2b3VzbHksIHRoZSBgcGF0aGAgZmllbGQgZGVsaW1pdHMgdGhlIGN1cnJlbnQg cGF0aCBpZC4gIEFueSBtZXJnZSBjb21taXQgCituZWVkcyB0byBvcGVuIG5ldyBw YXRocywgYW5kIGRvZXMgdGhpcyB2aWEgdGhlIGBtZXJnZSBwYXRoc2Agc2VjdGlv biBvZiBpdHMgCitlbnRyeS4gIExpa2V3aXNlIGJyYW5jaGluZyBjb21taXRzIGhh dmUgdG8gY2xvc2UgcGF0aHMgdmlhIGBzcGxpdCBwYXRoc2AsIAorYWx0aG91Z2gg dGhpcyBpcyBhIHNsaWdodCBiaXQgbW9yZSBjb21wbGljYXRlZDoKKworQmVjYXVz ZSB3ZSBhKSBuZWVkIHRvIHJlc3RvcmUgdG9wby1yZWxhdGlvbnMgYW5kIGIpIG5l ZWQgdG8ga2VlcCB0cmFjayBvZiAKK2JvdW5kYXJ5IGNvbW1pdHMsIGEgYGxhc3Rf b2JqZWN0c2AgbGlzdCBrZWVwcyB0cmFjayBvZiB0aGUgbGFzdCBjb21taXQgCitl bmNvdW50ZXJlZCBwZXIgcGF0aC4gIFRoaXMgbmVlZHMgdG8gYmUgYWxpdmUgdW50 aWwgYWxsIGl0cyBwYXJlbnRzIGhhdmUgYmVlbiAKK3NlZW4sIHNvIHBhdGggaWRz IGFyZSBhY3R1YWxseSB1bmlxdWUgdXAgdGhyb3VnaCBhIGJyYW5jaCdzIGxhc3Qg cGFyZW50LiAgU3VjaCAKK3VuaXF1ZW5lc3MgaXMgYWNoaWV2ZWQgYnkgInN0b3Bw aW5nIiBwYXRocyBhdCBhIG1lcmdlLCBhbmQgYSBjb3VudGVyIHN5c3RlbSB0byAK K2RvY3VtZW50IGhvdyBtYW55IHBhcmVudHMgaGF2ZSB5ZXQgdG8gYmUgc2Vlbi4K KworSWYgd2UgZG8gZW5jb3VudGVyIGEgYm91bmRhcnkgb3Igc3RhcnQgY29tbWl0 LCB3ZSBoYXZlIHRvIHJlc29ydCB0byBwYXJzaW5nIGl0IAorbWFudWFsbHk6IG91 ciBcJ29iamVjdCBkaWZmXCcgbGlzdHMgYXJlIG1hZGUgcmVsYXRpdmUgdG8gcGFy ZW50cyBpbiB0aGUgCitzbGljZSwgc28gd2lsbCBiZSB1c2VsZXNzIGlmIG5vdCBh bGwgcGFyZW50cyBhcmUgaW4gdGhlIHRyYXZlcnNhbCAoYm91bmRhcnkpIG9yIAor c2xpY2UgKHN0YXJ0KS4gIE5vcm1hbGx5IHdlIHdvdWxkIHVzZSBhIGBGQUNFX1ZB TFVFYCB0byBwcmV2ZW50IGBsaXN0LW9iamVjdHNgIAorZnJvbSBwYXJzaW5nIHRy ZWVzIGFuZCB3aGF0bm90LgorCisoTlNFKQpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUg Yi9NYWtlZmlsZQppbmRleCBjZGM0MGQwLi41MDk2YTkwIDEwMDY0NAotLS0gYS9N YWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtNTI5LDYgKzUyOSw3IEBAIExJQl9P QkpTICs9IHJlZmxvZy13YWxrLm8KIExJQl9PQkpTICs9IHJlZnMubwogTElCX09C SlMgKz0gcmVtb3RlLm8KIExJQl9PQkpTICs9IHJlcmVyZS5vCitMSUJfT0JKUyAr PSByZXYtY2FjaGUubwogTElCX09CSlMgKz0gcmV2aXNpb24ubwogTElCX09CSlMg Kz0gcnVuLWNvbW1hbmQubwogTElCX09CSlMgKz0gc2VydmVyLWluZm8ubwpAQCAt NjE5LDYgKzYyMCw3IEBAIEJVSUxUSU5fT0JKUyArPSBidWlsdGluLXJlZmxvZy5v CiBCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1yZW1vdGUubwogQlVJTFRJTl9PQkpT ICs9IGJ1aWx0aW4tcmVyZXJlLm8KIEJVSUxUSU5fT0JKUyArPSBidWlsdGluLXJl c2V0Lm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLXJldi1jYWNoZS5vCiBCVUlM VElOX09CSlMgKz0gYnVpbHRpbi1yZXYtbGlzdC5vCiBCVUlMVElOX09CSlMgKz0g YnVpbHRpbi1yZXYtcGFyc2UubwogQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tcmV2 ZXJ0Lm8KZGlmZiAtLWdpdCBhL2J1aWx0aW4tcmV2LWNhY2hlLmMgYi9idWlsdGlu LXJldi1jYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAu LjhkNjk2ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLXJldi1jYWNoZS5j CkBAIC0wLDAgKzEsMTk3IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRl ICJvYmplY3QuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJkaWZm LmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKworLyogcG9yY2VsYWluIGZvciBy ZXYtY2FjaGUuYyAqLworc3RhdGljIGludCBoYW5kbGVfYWRkKGludCBhcmdjLCBj b25zdCBjaGFyICphcmd2W10pIC8qIGFyZ3MgYmV5b25kIHRoaXMgY29tbWFuZCAq LworeworCXN0cnVjdCByZXZfaW5mbyByZXZzOworCXN0cnVjdCByZXZfY2FjaGVf aW5mbyByY2k7CisJY2hhciBkb3N0ZGluID0gMDsKKwl1bnNpZ25lZCBpbnQgZmxh Z3MgPSAwOworCWludCBpLCByZXR2YWw7CisJdW5zaWduZWQgY2hhciBjYWNoZV9z aGExWzIwXTsKKwkKKwlpbml0X3JldmlzaW9ucygmcmV2cywgMCk7CisJaW5pdF9y Y2koJnJjaSk7CisJCisJZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworCQlp ZiAoIXN0cmNtcChhcmd2W2ldLCAiLS1zdGRpbiIpKQorCQkJZG9zdGRpbiA9IDE7 CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tZnJlc2giKSkKKwkJCWVu ZHNfZnJvbV9zbGljZXMoJnJldnMsIFVOSU5URVJFU1RJTkcpOworCQllbHNlIGlm ICghc3RyY21wKGFyZ3ZbaV0sICItLW5vdCIpKQorCQkJZmxhZ3MgXj0gVU5JTlRF UkVTVElORzsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS1sZWdzIikp CisJCQlyY2kubGVncyA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwg Ii0tbm9vYmplY3RzIikpCisJCQlyY2kub2JqZWN0cyA9IDA7CisJCWVsc2UgaWYg KCFzdHJjbXAoYXJndltpXSwgIi0tYWxsIikpIHsKKwkJCWNvbnN0IGNoYXIgKmFy Z3NbMl07CisJCQlpbnQgYXJnbiA9IDA7CisJCQkKKwkJCWFyZ3NbYXJnbisrXSA9 ICJyZXYtbGlzdCI7CisJCQlhcmdzW2FyZ24rK10gPSAiLS1hbGwiOworCQkJc2V0 dXBfcmV2aXNpb25zKGFyZ24sIGFyZ3MsICZyZXZzLCAwKTsKKwkJfSBlbHNlCisJ CQloYW5kbGVfcmV2aXNpb25fYXJnKGFyZ3ZbaV0sICZyZXZzLCBmbGFncywgMSk7 CisJfQorCQorCWlmIChkb3N0ZGluKSB7CisJCWNoYXIgbGluZVsxMDAwXTsKKwkJ CisJCWZsYWdzID0gMDsKKwkJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5l KSwgc3RkaW4pKSB7CisJCQlpbnQgbGVuID0gc3RybGVuKGxpbmUpOworCQkJd2hp bGUgKGxlbiAmJiAobGluZVtsZW4gLSAxXSA9PSAnXG4nIHx8IGxpbmVbbGVuIC0g MV0gPT0gJ1xyJykpCisJCQkJbGluZVstLWxlbl0gPSAwOworCQkJCisJCQlpZiAo IWxlbikKKwkJCQlicmVhazsKKwkJCQorCQkJaWYgKCFzdHJjbXAobGluZSwgIi0t bm90IikpCisJCQkJZmxhZ3MgXj0gVU5JTlRFUkVTVElORzsKKwkJCWVsc2UKKwkJ CQloYW5kbGVfcmV2aXNpb25fYXJnKGxpbmUsICZyZXZzLCBmbGFncywgMSk7CisJ CX0KKwl9CisJCisJcmV0dmFsID0gbWFrZV9jYWNoZV9zbGljZSgmcmNpLCAmcmV2 cywgMCwgMCwgY2FjaGVfc2hhMSk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVy biByZXR2YWw7CisJCisJcHJpbnRmKCIlc1xuIiwgc2hhMV90b19oZXgoY2FjaGVf c2hhMSkpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV93 YWxrKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pCit7CisJc3RydWN0IGNv bW1pdCAqY29tbWl0OworCXN0cnVjdCByZXZfaW5mbyByZXZzOworCXN0cnVjdCBj b21taXRfbGlzdCAqcXVldWUsICp3b3JrLCAqKnFwOworCXVuc2lnbmVkIGNoYXIg KnNoYTFwLCAqc2hhMXB0OworCXVuc2lnbmVkIGxvbmcgZGF0ZSA9IDA7CisJdW5z aWduZWQgaW50IGZsYWdzID0gMDsKKwlpbnQgcmV0dmFsLCBzbG9wID0gNSwgaTsK KwkKKwlpbml0X3JldmlzaW9ucygmcmV2cywgMCk7CisJCisJZm9yIChpID0gMDsg aSA8IGFyZ2M7IGkrKykgeworCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS1ub3Qi KSkKKwkJCWZsYWdzIF49IFVOSU5URVJFU1RJTkc7CisJCWVsc2UgaWYgKCFzdHJj bXAoYXJndltpXSwgIi0tb2JqZWN0cyIpKQorCQkJcmV2cy50cmVlX29iamVjdHMg PSByZXZzLmJsb2Jfb2JqZWN0cyA9IDE7CisJCWVsc2UKKwkJCWhhbmRsZV9yZXZp c2lvbl9hcmcoYXJndltpXSwgJnJldnMsIGZsYWdzLCAxKTsKKwl9CisJCisJd29y ayA9IDA7CisJc2hhMXAgPSAwOworCWZvciAoaSA9IDA7IGkgPCByZXZzLnBlbmRp bmcubnI7IGkrKykgeworCQljb21taXQgPSBsb29rdXBfY29tbWl0KHJldnMucGVu ZGluZy5vYmplY3RzW2ldLml0ZW0tPnNoYTEpOworCQkKKwkJc2hhMXB0ID0gZ2V0 X2NhY2hlX3NsaWNlKGNvbW1pdCk7CisJCWlmICghc2hhMXB0KQorCQkJZGllKCIl czogbm90IGluIGEgY2FjaGUgc2xpY2UiLCBzaGExX3RvX2hleChjb21taXQtPm9i amVjdC5zaGExKSk7CisJCQorCQlpZiAoIWkpCisJCQlzaGExcCA9IHNoYTFwdDsK KwkJZWxzZSBpZiAoc2hhMXAgIT0gc2hhMXB0KQorCQkJZGllKCJ3YWxraW5nIHBv cmNlbGFpbiBpcyAvcGVyLyBjYWNoZSBzbGljZTsgY29tbWl0cyBjYW5ub3QgYmUg c3ByZWFkIG91dCBhbW91bmcgc2V2ZXJhbCIpOworCQkKKwkJaW5zZXJ0X2J5X2Rh dGUoY29tbWl0LCAmd29yayk7CisJfQorCQorCWlmICghc2hhMXApCisJCWRpZSgi bm90aGluZyB0byB0cmF2ZXJzZSEiKTsKKwkKKwlxdWV1ZSA9IDA7CisJcXAgPSAm cXVldWU7CisJY29tbWl0ID0gcG9wX2NvbW1pdCgmd29yayk7CisJcmV0dmFsID0g dHJhdmVyc2VfY2FjaGVfc2xpY2UoMCwgc2hhMXAsICZyZXZzLCBjb21taXQsICZk YXRlLCAmc2xvcCwgJnFwLCAmd29yayk7CisJaWYgKHJldHZhbCA8IDApCisJCXJl dHVybiByZXR2YWw7CisJCisJcHJpbnRmKCJxdWV1ZTpcbiIpOworCXdoaWxlICgo Y29tbWl0ID0gcG9wX2NvbW1pdCgmcXVldWUpKSAhPSAwKSB7CisJCXByaW50Zigi JXNcbiIsIHNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKwl9CisJ CisJcHJpbnRmKCJ3b3JrOlxuIik7CisJd2hpbGUgKChjb21taXQgPSBwb3BfY29t bWl0KCZ3b3JrKSkgIT0gMCkgeworCQlwcmludGYoIiVzXG4iLCBzaGExX3RvX2hl eChjb21taXQtPm9iamVjdC5zaGExKSk7CisJfQorCQorCXByaW50ZigicGVuZGlu ZzpcbiIpOworCWZvciAoaSA9IDA7IGkgPCByZXZzLnBlbmRpbmcubnI7IGkrKykg eworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSByZXZzLnBlbmRpbmcub2JqZWN0c1tp XS5pdGVtOworCQkKKwkJLyogdW5mb3J0dW5hdGVseSwgZGVzcGl0ZSBvdXIgY2Fy ZWZ1bCBnZW5lcmF0aW9uLCBvYmplY3QgZHVwbGljYXRpb24gKmlzKiBhIHBvc3Np YmlsaXR5Li4uCisJCSAqIChlZy4gc2FtZSBvYmplY3QgaW50cm9kdWNlZCBpbnRv IHR3byBkaWZmZXJlbnQgYnJhbmNoZXMpICovCisJCWlmIChvYmotPmZsYWdzICYg U0VFTikKKwkJCWNvbnRpbnVlOworCQkKKwkJcHJpbnRmKCIlc1xuIiwgc2hhMV90 b19oZXgocmV2cy5wZW5kaW5nLm9iamVjdHNbaV0uaXRlbS0+c2hhMSkpOworCQlv YmotPmZsYWdzIHw9IFNFRU47CisJfQorCQorCXJldHVybiAwOworfQorCitzdGF0 aWMgaW50IGhhbmRsZV9oZWxwKHZvaWQpCit7CisJY2hhciAqdXNhZ2UgPSAiXAor dXNhZ2U6XG5cCitnaXQtcmV2LWNhY2hlIENPTU1BTkQgW29wdGlvbnNdIFs8Y29t bWl0LWlkPi4uLl1cblwKK2NvbW1hbmRzOlxuXAorICBhZGQgICAgLSBhZGQgcmV2 aXNpb25zIHRvIHRoZSBjYWNoZS4gIHJlYWRzIGNvbW1pdCBpZHMgZnJvbSBzdGRp biwgXG5cCisgICAgICAgICAgIGZvcm1hdHRlZCBhczogRU5EIEVORCAuLi4gLS1u b3QgU1RBUlQgU1RBUlQgLi4uXG5cCisgICAgICAgICAgIG9wdGlvbnM6XG5cCisg ICAgICAgICAgICAtLWFsbCAgICAgICAgICAgICB1c2UgYWxsIGJyYW5jaCBoZWFk cyBhcyBlbmRzXG5cCisgICAgICAgICAgICAtLWZyZXNoICAgICAgICAgICBleGNs dWRlIGV2ZXJ5dGhpbmcgYWxyZWFkeSBpbiBhIGNhY2hlIHNsaWNlXG5cCisgICAg ICAgICAgICAtLXN0ZGluICAgICAgICAgICBhbHNvIHJlYWQgY29tbWl0IGlkcyBm cm9tIHN0ZGluIChzYW1lIGZvcm0gYXMgY21kKVxuXAorICAgICAgICAgICAgLS1s ZWdzICAgICAgICAgICAgZW5zdXJlIGJyYW5jaCBpcyBlbnRpcmVseSBzZWxmLWNv bnRhaW5lZFxuXAorICAgICAgICAgICAgLS1ub29iamVjdHMgICAgICAgZG9uJ3Qg YWRkIG5vbi1jb21taXQgb2JqZWN0cyB0byBzbGljZVxuXAorICB3YWxrICAgLSB3 YWxrIGEgY2FjaGUgc2xpY2UgYmFzZWQgb24gc2V0IG9mIGNvbW1pdHM7IGZvcm1h dHRlZCBhcyBhZGRcblwKKyAgICAgICAgICAgb3B0aW9uczpcblwKKyAgICAgICAg ICAgLS1vYmplY3RzICAgICAgICAgIGluY2x1ZGUgbm9uLWNvbW1pdCBvYmplY3Rz IGluIHRyYXZlcnNhbHNcblwKKyAgZnVzZSAgIC0gY29hZ3VsYXRlIGNhY2hlIHNs aWNlcyBpbnRvIGEgc2luZ2xlIGNhY2hlLlxuXAorICAgICAgICAgICBvcHRpb25z OlxuXAorICAgICAgICAgICAgLS1hbGwgICAgICAgICAgICAgaW5jbHVkZSBhbGwg b2JqZWN0cyBpbiByZXBvc2l0b3J5XG5cCisgICAgICAgICAgICAtLW5vb2JqZWN0 cyAgICAgICBkb24ndCBhZGQgbm9uLWNvbW1pdCBvYmplY3RzIHRvIHNsaWNlXG5c CisgICAgICAgICAgICAtLWlnbm9yZS1zaXplWz1OXSBpZ25vcmUgc2xpY2VzIG9m IHNpemUgPj0gTjsgZGVmYXVsdHMgdG8gfjVNQlxuXAorICBpbmRleCAgLSByZWdu ZXJhdGUgdGhlIGNhY2hlIGluZGV4LiI7CisJCisJcHV0cyh1c2FnZSk7CisJCisJ cmV0dXJuIDA7Cit9CisKK2ludCBjbWRfcmV2X2NhY2hlKGludCBhcmdjLCBjb25z dCBjaGFyICphcmd2W10sIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwljb25zdCBj aGFyICphcmc7CisJaW50IHI7CisJCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9j b25maWcsIE5VTEwpOworCQorCWlmIChhcmdjID4gMSkKKwkJYXJnID0gYXJndlsx XTsKKwllbHNlCisJCWFyZyA9ICIiOworCQorCWFyZ2MgLT0gMjsKKwlhcmd2ICs9 IDI7CisJaWYgKCFzdHJjbXAoYXJnLCAiYWRkIikpCisJCXIgPSBoYW5kbGVfYWRk KGFyZ2MsIGFyZ3YpOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAid2FsayIpKQor CQlyID0gaGFuZGxlX3dhbGsoYXJnYywgYXJndik7CisJZWxzZQorCQlyZXR1cm4g aGFuZGxlX2hlbHAoKTsKKwkKKwlmcHJpbnRmKHN0ZGVyciwgImZpbmFsIHJldHVy biB2YWx1ZTogJWRcbiIsIHIpOworCQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0 IGEvYnVpbHRpbi5oIGIvYnVpbHRpbi5oCmluZGV4IDIwNDI3ZDIuLjAwZWNjOWMg MTAwNjQ0Ci0tLSBhL2J1aWx0aW4uaAorKysgYi9idWlsdGluLmgKQEAgLTg3LDYg Kzg3LDcgQEAgZXh0ZXJuIGludCBjbWRfcmVtb3RlKGludCBhcmdjLCBjb25zdCBj aGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKIGV4dGVybiBpbnQgY21k X2NvbmZpZyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIg KnByZWZpeCk7CiBleHRlcm4gaW50IGNtZF9yZXJlcmUoaW50IGFyZ2MsIGNvbnN0 IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOwogZXh0ZXJuIGludCBj bWRfcmVzZXQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFy ICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfcmV2X2NhY2hlKGludCBhcmdjLCBj b25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKIGV4dGVybiBp bnQgY21kX3Jldl9saXN0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29u c3QgY2hhciAqcHJlZml4KTsKIGV4dGVybiBpbnQgY21kX3Jldl9wYXJzZShpbnQg YXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CiBl eHRlcm4gaW50IGNtZF9yZXZlcnQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2 LCBjb25zdCBjaGFyICpwcmVmaXgpOwpkaWZmIC0tZ2l0IGEvY29tbWl0LmMgYi9j b21taXQuYwppbmRleCBhYTNiMzViLi5iNDVhOTkxIDEwMDY0NAotLS0gYS9jb21t aXQuYworKysgYi9jb21taXQuYwpAQCAtMjU1LDcgKzI1NSw5IEBAIGludCBwYXJz ZV9jb21taXRfYnVmZmVyKHN0cnVjdCBjb21taXQgKml0ZW0sIHZvaWQgKmJ1ZmZl ciwgdW5zaWduZWQgbG9uZyBzaXplKQogCQkJICAgICBzaGExX3RvX2hleChpdGVt LT5vYmplY3Quc2hhMSkpOwogCWl0ZW0tPnRyZWUgPSBsb29rdXBfdHJlZShwYXJl bnQpOwogCWJ1ZnB0ciArPSA0NjsgLyogInRyZWUgIiArICJoZXggc2hhMSIgKyAi XG4iICovCi0JcHB0ciA9ICZpdGVtLT5wYXJlbnRzOworIAlwcHRyID0gJml0ZW0t PnBhcmVudHM7CisJd2hpbGUgKHBvcF9jb21taXQocHB0cikpCisJCTsgLyogY2xl YXIgYW55dGhpbmcgZnJvbSBjYWNoZSAqLwogCiAJZ3JhZnQgPSBsb29rdXBfY29t bWl0X2dyYWZ0KGl0ZW0tPm9iamVjdC5zaGExKTsKIAl3aGlsZSAoYnVmcHRyICsg NDggPCB0YWlsICYmICFtZW1jbXAoYnVmcHRyLCAicGFyZW50ICIsIDcpKSB7CmRp ZmYgLS1naXQgYS9naXQuYyBiL2dpdC5jCmluZGV4IGY0ZDUzZjQuLmY2YWZhNTcg MTAwNjQ0Ci0tLSBhL2dpdC5jCisrKyBiL2dpdC5jCkBAIC0zNDIsNiArMzQyLDcg QEAgc3RhdGljIHZvaWQgaGFuZGxlX2ludGVybmFsX2NvbW1hbmQoaW50IGFyZ2Ms IGNvbnN0IGNoYXIgKiphcmd2KQogCQl7ICJyZXBvLWNvbmZpZyIsIGNtZF9jb25m aWcgfSwKIAkJeyAicmVyZXJlIiwgY21kX3JlcmVyZSwgUlVOX1NFVFVQIH0sCiAJ CXsgInJlc2V0IiwgY21kX3Jlc2V0LCBSVU5fU0VUVVAgfSwKKwkJeyAicmV2LWNh Y2hlIiwgY21kX3Jldl9jYWNoZSwgUlVOX1NFVFVQIH0sIAogCQl7ICJyZXYtbGlz dCIsIGNtZF9yZXZfbGlzdCwgUlVOX1NFVFVQIH0sCiAJCXsgInJldi1wYXJzZSIs IGNtZF9yZXZfcGFyc2UgfSwKIAkJeyAicmV2ZXJ0IiwgY21kX3JldmVydCwgUlVO X1NFVFVQIHwgTkVFRF9XT1JLX1RSRUUgfSwKZGlmZiAtLWdpdCBhL3Jldi1jYWNo ZS5jIGIvcmV2LWNhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAw MDAwMC4uMWU3ZTcyOQotLS0gL2Rldi9udWxsCisrKyBiL3Jldi1jYWNoZS5jCkBA IC0wLDAgKzEsMTE2MCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAi b2JqZWN0LmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidHJlZS5o IgorI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNp bmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAicmV2 aXNpb24uaCIKKyNpbmNsdWRlICJydW4tY29tbWFuZC5oIgorCisKKy8qIHNpbmds ZSBpbmRleCBtYXBzIG9iamVjdHMgdG8gY2FjaGUgZmlsZXMgKi8KK3N0cnVjdCBp bmRleF9oZWFkZXIgeworCWNoYXIgc2lnbmF0dXJlWzhdOyAvKiBSRVZJTkRFWCAq LworCXVuc2lnbmVkIGNoYXIgdmVyc2lvbjsKKwl1aW50MzJfdCBvZnNfb2JqZWN0 czsKKwkKKwl1aW50MzJfdCBvYmplY3RzOworCXVuc2lnbmVkIGNoYXIgY2FjaGVz OworCXVpbnQzMl90IG1heF9kYXRlOworCQorCS8qIGFsbG9jYXRlZCBzcGFjZSBt YXkgYmUgYmlnZ2VyIHRoYW4gbmVjZXNzYXJ5IGZvciBwb3RlbnRpYWwgb2YgCisJ ZWFzeSB1cGRhdGluZyAoaWYsIGVnLiwgbGlzdCBpcyBzaW1wbHkgbG9hZGVkIGlu dG8gYSBoYXNobWFwKSAqLworCXVuc2lnbmVkIGNoYXIgY2FjaGVzX2J1ZmZlcjsK Kwl1bnNpZ25lZCBjaGFyICpjYWNoZV9zaGExczsKK307CisKK3N0cnVjdCBpbmRl eF9oZWFkZXJfb25kaXNrIHsKKwljaGFyIHNpZ25hdHVyZVs4XTsgLyogUkVWSU5E RVggKi8KKwl1bnNpZ25lZCBjaGFyIHZlcnNpb247CisJdWludDMyX3Qgb2ZzX29i amVjdHM7CisJCisJdWludDMyX3Qgb2JqZWN0czsKKwl1bnNpZ25lZCBjaGFyIGNh Y2hlczsKKwl1aW50MzJfdCBtYXhfZGF0ZTsKKwkKKwkvKiBhbGxvY2F0ZWQgc3Bh Y2UgbWF5IGJlIGJpZ2dlciB0aGFuIG5lY2Vzc2FyeSBmb3IgcG90ZW50aWFsIG9m IAorCWVhc3kgdXBkYXRpbmcgKGlmLCBlZy4sIGxpc3QgaXMgc2ltcGx5IGxvYWRl ZCBpbnRvIGEgaGFzaG1hcCkgKi8KKwl1bnNpZ25lZCBjaGFyIGNhY2hlc19idWZm ZXI7Cit9OworCitzdHJ1Y3QgaW5kZXhfZW50cnkgeworCXVuc2lnbmVkIGNoYXIg c2hhMVsyMF07CisJdW5zaWduZWQgaXNfZW5kIDogMTsKKwl1bnNpZ25lZCBjYWNo ZV9pbmRleCA6IDc7CisJdWludDMyX3QgcG9zOworfTsKKworCisvKiBzdHJ1Y3R1 cmUgZm9yIGFjdHVhbCBjYWNoZSBmaWxlICovCitzdHJ1Y3QgY2FjaGVfc2xpY2Vf aGVhZGVyIHsKKwljaGFyIHNpZ25hdHVyZVs4XTsgLyogUkVWQ0FDSEUgKi8KKwl1 bnNpZ25lZCBjaGFyIHZlcnNpb247CisJdWludDMyX3Qgb2ZzX29iamVjdHM7CisJ CisJdWludDMyX3Qgb2JqZWN0czsKKwl1aW50MTZfdCBwYXRoX25yOworCXVpbnQz Ml90IHNpemU7CisJCisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKK307CisKK3N0 cnVjdCBvYmplY3RfZW50cnkgeworCXVuc2lnbmVkIHR5cGUgOiAzOworCXVuc2ln bmVkIGlzX3N0YXJ0IDogMTsKKwl1bnNpZ25lZCBpc19lbmQgOiAxOworCXVuc2ln bmVkIHVuaW50ZXJlc3RpbmcgOiAxOworCXVuc2lnbmVkIGluY2x1ZGUgOiAxOwor CXVuc2lnbmVkIGZsYWdzIDogMTsgLyogdW51c2VkICovCisJdW5zaWduZWQgY2hh ciBzaGExWzIwXTsKKwkKKwl1bnNpZ25lZCBtZXJnZV9uciA6IDY7CisJdW5zaWdu ZWQgc3BsaXRfbnIgOiA3OworCXVuc2lnbmVkIHNpemVfc2l6ZSA6IDM7CisJCisJ dWludDMyX3QgZGF0ZTsKKwl1aW50MTZfdCBwYXRoOworCQorCS8qIG1lcmdlIHBh dGhzICovCisJLyogc3BsaXQgcGF0aHMgKi8KKwkvKiBzaXplICovCit9OworCisv KiBsaXN0IHJlc2VtYmxlcyBwYWNrIGluZGV4IGZvcm1hdCAqLworc3RhdGljIHVp bnQzMl90IGZhbm91dFsweGZmICsgMl07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFy ICppZHhfbWFwID0gMDsKK3N0YXRpYyBpbnQgaWR4X3NpemU7CitzdGF0aWMgc3Ry dWN0IGluZGV4X2hlYWRlciBpZHhfaGVhZDsKK3N0YXRpYyBjaGFyIG5vX2lkeCA9 IDA7CisKK3N0YXRpYyBzdHJ1Y3Qgc3RyYnVmICpnX2J1ZmZlcjsKKworI2RlZmlu ZSBTVVBQT1JURURfUkVWQ0FDSEVfVkVSU0lPTiAJCTEKKyNkZWZpbmUgU1VQUE9S VEVEX1JFVklOREVYX1ZFUlNJT04JCTEKKworI2RlZmluZSBQQVRIX1dJRFRICQlz aXplb2YodWludDE2X3QpCisjZGVmaW5lIFBBVEhfU0laRSh4KQkoUEFUSF9XSURU SCAqICh4KSkKKworI2RlZmluZSBPRV9TSVpFCQlzaXplb2Yoc3RydWN0IG9iamVj dF9lbnRyeSkKKyNkZWZpbmUgSUVfU0laRQkJc2l6ZW9mKHN0cnVjdCBpbmRleF9l bnRyeSkKKworI2RlZmluZSBPRV9DQVNUKHApCSgoc3RydWN0IG9iamVjdF9lbnRy eSAqKShwKSkKKyNkZWZpbmUgSUVfQ0FTVChwKQkoKHN0cnVjdCBpbmRleF9lbnRy eSAqKShwKSkKKworI2RlZmluZSBBQ1RVQUxfT0JKRUNUX0VOVFJZX1NJWkUoZSkJ CShPRV9TSVpFICsgUEFUSF9TSVpFKChlKS0+bWVyZ2VfbnIgKyAoZSktPnNwbGl0 X25yKSArIChlKS0+c2l6ZV9zaXplKQorCisjZGVmaW5lIFNMT1AJCTUKKworLyog aW5pdGlhbGl6YXRpb24gKi8KKworc3RhdGljIGludCBnZXRfaW5kZXhfaGVhZCh1 bnNpZ25lZCBjaGFyICptYXAsIGludCBsZW4sIHN0cnVjdCBpbmRleF9oZWFkZXIg KmhlYWQsIHVpbnQzMl90ICpmYW5vdXQpCit7CisJc3RydWN0IGluZGV4X2hlYWRl cl9vbmRpc2sgd2hlYWQ7CisJaW50IGksIGluZGV4ID0gc2l6ZW9mKHN0cnVjdCBp bmRleF9oZWFkZXJfb25kaXNrKTsKKwkKKwltZW1jcHkoJndoZWFkLCBtYXAsIHNp emVvZihzdHJ1Y3QgaW5kZXhfaGVhZGVyX29uZGlzaykpOworCWlmIChtZW1jbXAo d2hlYWQuc2lnbmF0dXJlLCAiUkVWSU5ERVgiLCA4KSB8fCB3aGVhZC52ZXJzaW9u ID4gU1VQUE9SVEVEX1JFVklOREVYX1ZFUlNJT04pCisJCXJldHVybiAtMTsKKwkK KwltZW1jcHkoaGVhZC0+c2lnbmF0dXJlLCAiUkVWSU5ERVgiLCA4KTsKKwloZWFk LT52ZXJzaW9uID0gd2hlYWQudmVyc2lvbjsKKwloZWFkLT5vZnNfb2JqZWN0cyA9 IG50b2hsKHdoZWFkLm9mc19vYmplY3RzKTsKKwloZWFkLT5vYmplY3RzID0gbnRv aGwod2hlYWQub2JqZWN0cyk7CisJaGVhZC0+Y2FjaGVzID0gd2hlYWQuY2FjaGVz OworCWhlYWQtPm1heF9kYXRlID0gbnRvaGwod2hlYWQubWF4X2RhdGUpOworCWhl YWQtPmNhY2hlc19idWZmZXIgPSB3aGVhZC5jYWNoZXNfYnVmZmVyOworCQorCWlm IChsZW4gPCBpbmRleCArIGhlYWQtPmNhY2hlc19idWZmZXIgKiAyMCArICgweDEw MCkgKiBzaXplb2YodWludDMyX3QpKQorCQlyZXR1cm4gLTI7CisJCisJaGVhZC0+ Y2FjaGVfc2hhMXMgPSB4bWFsbG9jKGhlYWQtPmNhY2hlc19idWZmZXIgKiAyMCk7 CisJbWVtY3B5KGhlYWQtPmNhY2hlX3NoYTFzLCBtYXAgKyBpbmRleCwgaGVhZC0+ Y2FjaGVzICogMjApOworCWluZGV4ICs9IGhlYWQtPmNhY2hlc19idWZmZXIgKiAy MDsKKwkKKwltZW1jcHkoZmFub3V0LCBtYXAgKyBpbmRleCwgMHgxMDAgKiBzaXpl b2YodWludDMyX3QpKTsKKwlmb3IgKGkgPSAwOyBpIDw9IDB4ZmY7IGkrKykKKwkJ ZmFub3V0W2ldID0gbnRvaGwoZmFub3V0W2ldKTsKKwlmYW5vdXRbMHgxMDBdID0g bGVuOworCQorCXJldHVybiAwOworfQorCisvKiBhZGRlZCBpbiBpbml0X2luZGV4 ICovCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhY2hlX3NsaWNlcyh2b2lkKQorewor CWlmIChpZHhfbWFwKSB7CisJCWZyZWUoaWR4X2hlYWQuY2FjaGVfc2hhMXMpOwor CQltdW5tYXAoaWR4X21hcCwgaWR4X3NpemUpOworCQlpZHhfbWFwID0gMDsKKwl9 CisJCit9CisKK3N0YXRpYyBpbnQgaW5pdF9pbmRleCh2b2lkKQoreworCWludCBm ZDsKKwlzdHJ1Y3Qgc3RhdCBmaTsKKwkKKwlmZCA9IG9wZW4oZ2l0X3BhdGgoInJl di1jYWNoZS9pbmRleCIpLCBPX1JET05MWSk7CisJaWYgKGZkID09IC0xIHx8IGZz dGF0KGZkLCAmZmkpKQorCQlnb3RvIGVuZDsKKwlpZiAoZmkuc3Rfc2l6ZSA8IHNp emVvZihzdHJ1Y3QgaW5kZXhfaGVhZGVyX29uZGlzaykpCisJCWdvdG8gZW5kOwor CQorCWlkeF9zaXplID0gZmkuc3Rfc2l6ZTsKKwlpZHhfbWFwID0geG1tYXAoMCwg aWR4X3NpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwljbG9z ZShmZCk7CisJaWYgKGlkeF9tYXAgPT0gTUFQX0ZBSUxFRCkKKwkJZ290byBlbmQ7 CisJaWYgKGdldF9pbmRleF9oZWFkKGlkeF9tYXAsIGZpLnN0X3NpemUsICZpZHhf aGVhZCwgZmFub3V0KSkKKwkJZ290byBlbmQ7CisJCisJYXRleGl0KGNsZWFudXBf Y2FjaGVfc2xpY2VzKTsKKwkKKwlyZXR1cm4gMDsKKwkKK2VuZDoKKwlpZHhfbWFw ID0gMDsKKwlub19pZHggPSAxOworCXJldHVybiAtMTsKK30KKworLyogdGhpcyBh c3N1bWVzIGluZGV4IGlzIGFscmVhZHkgbG9hZGVkICovCitzdGF0aWMgc3RydWN0 IGluZGV4X2VudHJ5ICpzZWFyY2hfaW5kZXgodW5zaWduZWQgY2hhciAqc2hhMSkK K3sKKwlpbnQgc3RhcnQsIGVuZCwgc3RhcnRpLCBlbmRpLCBpLCBsZW4sIHI7CisJ c3RydWN0IGluZGV4X2VudHJ5ICppZTsKKwkKKwlpZiAoIWlkeF9tYXApCisJCXJl dHVybiAwOworCQorCS8qIGJpbmFyeSBzZWFyY2ggKi8KKwlzdGFydCA9IGZhbm91 dFsoaW50KXNoYTFbMF1dOworCWVuZCA9IGZhbm91dFsoaW50KXNoYTFbMF0gKyAx XTsKKwlsZW4gPSAoZW5kIC0gc3RhcnQpIC8gSUVfU0laRTsKKwlpZiAoIWxlbiB8 fCBsZW4gKiBJRV9TSVpFICE9IGVuZCAtIHN0YXJ0KQorCQlyZXR1cm4gMDsKKwkK KwlzdGFydGkgPSAwOworCWVuZGkgPSBsZW4gLSAxOworCWZvciAoOzspIHsKKwkJ aSA9IChlbmRpICsgc3RhcnRpKSAvIDI7CisJCWllID0gSUVfQ0FTVChpZHhfbWFw ICsgc3RhcnQgKyBpICogSUVfU0laRSk7CisJCXIgPSBoYXNoY21wKHNoYTEsIGll LT5zaGExKTsKKwkJCisJCWlmIChyKSB7CisJCQlpZiAoc3RhcnRpICsgMSA9PSBl bmRpKSB7CisJCQkJc3RhcnRpKys7CisJCQkJY29udGludWU7CisJCQl9IGVsc2Ug aWYgKHN0YXJ0aSA9PSBlbmRpKQorCQkJCWJyZWFrOworCQkJCisJCQlpZiAociA+ IDApCisJCQkJc3RhcnRpID0gaTsKKwkJCWVsc2UgLyogciA8IDAgKi8KKwkJCQll bmRpID0gaTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gaWU7CisJfQorCQorCXJldHVy biAwOworfQorCit1bnNpZ25lZCBjaGFyICpnZXRfY2FjaGVfc2xpY2Uoc3RydWN0 IGNvbW1pdCAqY29tbWl0KQoreworCXN0cnVjdCBpbmRleF9lbnRyeSAqaWU7CisJ CisJaWYgKCFpZHhfbWFwKSB7CisJCWlmIChub19pZHgpCisJCQlyZXR1cm4gMDsK KwkJaW5pdF9pbmRleCgpOworCX0KKwkKKwlpZiAoY29tbWl0LT5kYXRlID4gaWR4 X2hlYWQubWF4X2RhdGUpCisJCXJldHVybiAwOworCQorCWllID0gc2VhcmNoX2lu ZGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpOworCQorCWlmIChpZSAmJiBpZS0+Y2Fj aGVfaW5kZXggPCBpZHhfaGVhZC5jYWNoZXMpCisJCXJldHVybiBpZHhfaGVhZC5j YWNoZV9zaGExcyArIGllLT5jYWNoZV9pbmRleCAqIDIwOworCQorCXJldHVybiAw OworfQorCisKKy8qIHRyYXZlcnNhbCAqLworCitzdGF0aWMgaW50IHNldHVwX3Ry YXZlcnNhbChzdHJ1Y3QgY2FjaGVfc2xpY2VfaGVhZGVyICpoZWFkLCB1bnNpZ25l ZCBjaGFyICptYXAsIHN0cnVjdCBjb21taXQgKmNvbW1pdCwgc3RydWN0IGNvbW1p dF9saXN0ICoqd29yaykKK3sKKwlzdHJ1Y3QgaW5kZXhfZW50cnkgKmllcDsKKwlz dHJ1Y3Qgb2JqZWN0X2VudHJ5ICpvZXA7CisJc3RydWN0IGNvbW1pdF9saXN0ICpw cmV2LCAqd3AsICoqd3BwOworCWludCByZXR2YWw7CisJCisJLyogcHJpbnRmKCJh ZGRpbmcgJXNcbiIsIHNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsg Ki8KKwlpZXAgPSBzZWFyY2hfaW5kZXgoY29tbWl0LT5vYmplY3Quc2hhMSk7CisJ b2VwID0gT0VfQ0FTVChtYXAgKyBudG9obChpZXAtPnBvcykpOworCW9lcC0+aW5j bHVkZSA9IDE7CisJcmV0dmFsID0gbnRvaGwoaWVwLT5wb3MpOworCQorCS8qIGlu Y2x1ZGUgYW55IG90aGVycyBpbiB0aGUgd29yayBhcnJheSAqLworCXByZXYgPSAw OworCXdwcCA9IHdvcms7CisJd3AgPSAqd29yazsKKwl3aGlsZSAod3ApIHsKKwkJ c3RydWN0IG9iamVjdCAqb2JqID0gJndwLT5pdGVtLT5vYmplY3Q7CisJCXN0cnVj dCBjb21taXQgKmNvOworCQlpbnQgdDsKKwkJCisJCWllcCA9IHNlYXJjaF9pbmRl eChvYmotPnNoYTEpOworCQlpZiAoIWllcCB8fCBoYXNoY21wKGlkeF9oZWFkLmNh Y2hlX3NoYTFzICsgaWVwLT5jYWNoZV9pbmRleCAqIDIwLCBoZWFkLT5zaGExKSkg eworCQkJcHJldiA9IHdwOworCQkJd3AgPSB3cC0+bmV4dDsKKwkJCXdwcCA9ICZ3 cDsKKyAJCQljb250aW51ZTsKKwkJfQorCQkKKwkJdCA9IG50b2hsKGllcC0+cG9z KTsKKwkJb2VwID0gT0VfQ0FTVChtYXAgKyB0KTsKKwkJCisJCW9lcC0+aW5jbHVk ZSA9IDE7CisJCW9lcC0+dW5pbnRlcmVzdGluZyA9ICEhKG9iai0+ZmxhZ3MgJiBV TklOVEVSRVNUSU5HKTsKKwkJaWYgKHQgPCByZXR2YWwpCisJCQlyZXR2YWwgPSB0 OworCQkKKwkJLyogcmVtb3ZlIGZyb20gd29yayBsaXN0ICovCisJCWNvID0gcG9w X2NvbW1pdCh3cHApOworCQl3cCA9ICp3cHA7CisJCWlmIChwcmV2KQorCQkJcHJl di0+bmV4dCA9IHdwOworCX0KKwkKKwlyZXR1cm4gcmV0dmFsOworfQorCisjZGVm aW5lIElQQVRICQkJCTB4NDAKKyNkZWZpbmUgVVBBVEgJCQkJMHg4MAorCisjZGVm aW5lIEdFVF9DT1VOVCh4KQkJKCh4KSAmIDB4M2YpCisjZGVmaW5lIFNFVF9DT1VO VCh4LCBzKQkJKCh4KSA9ICgoeCkgJiB+MHgzZikgfCAoKHMpICYgMHgzZikpCisK K3N0YXRpYyBpbnQgdHJhdmVyc2VfY2FjaGVfc2xpY2VfMShzdHJ1Y3QgY2FjaGVf c2xpY2VfaGVhZGVyICpoZWFkLCB1bnNpZ25lZCBjaGFyICptYXAsIAorCXN0cnVj dCByZXZfaW5mbyAqcmV2cywgc3RydWN0IGNvbW1pdCAqY29tbWl0LCAKKwl1bnNp Z25lZCBsb25nICpkYXRlX3NvX2ZhciwgaW50ICpzbG9wX3NvX2ZhciwgCisJc3Ry dWN0IGNvbW1pdF9saXN0ICoqKnF1ZXVlLCBzdHJ1Y3QgY29tbWl0X2xpc3QgKip3 b3JrKQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqaW5zZXJ0X2NhY2hlID0gMDsK KwlzdHJ1Y3QgY29tbWl0ICoqbGFzdF9vYmplY3RzLCAqY287CisJaW50IGksIHRv dGFsX3BhdGhfbnIgPSBoZWFkLT5wYXRoX25yLCByZXR2YWwgPSAtMTsKKwljaGFy IGNvbnN1bWVfY2hpbGRyZW4gPSAwOworCXVuc2lnbmVkIGNoYXIgKnBhdGhzOwor CQorCXBhdGhzID0geGNhbGxvYyh0b3RhbF9wYXRoX25yLCBQQVRIX1dJRFRIKTsK KwlsYXN0X29iamVjdHMgPSB4Y2FsbG9jKHRvdGFsX3BhdGhfbnIsIHNpemVvZihz dHJ1Y3QgY29tbWl0ICopKTsKKwkKKwlpID0gc2V0dXBfdHJhdmVyc2FsKGhlYWQs IG1hcCwgY29tbWl0LCB3b3JrKTsKKwkKKwkvKiBpIGFscmVhZHkgc2V0ICovCisJ d2hpbGUgKGkgPCBoZWFkLT5zaXplKSB7CisJCXN0cnVjdCBvYmplY3RfZW50cnkg KmVudHJ5ID0gT0VfQ0FTVChtYXAgKyBpKTsKKwkJaW50IHBhdGggPSBudG9ocyhl bnRyeS0+cGF0aCk7CisJCXN0cnVjdCBvYmplY3QgKm9iajsKKwkJaW50IGluZGV4 ID0gaTsKKwkJCisJCWkgKz0gQUNUVUFMX09CSkVDVF9FTlRSWV9TSVpFKGVudHJ5 KTsKKwkJCisJCS8qIGFkZCBleHRyYSBvYmplY3RzIGlmIG5lY2Vzc2FyeSAqLwor CQlpZiAoZW50cnktPnR5cGUgIT0gT0JKX0NPTU1JVCkKKwkJCWNvbnRpbnVlOwor CQllbHNlCisJCQljb25zdW1lX2NoaWxkcmVuID0gMDsKKwkJCisJCWlmIChwYXRo ID49IHRvdGFsX3BhdGhfbnIpCisJCQlnb3RvIGVuZDsKKwkJCisJCS8qIGluIG9u ZSBvZiBvdXIgYnJhbmNoZXM/IAorCQkgKiB1bmludGVyZXN0aW5nIHRydW1wcyBp bnRlcmVzdGluZyAqLworCQlpZiAoZW50cnktPmluY2x1ZGUpCisJCQlwYXRoc1tw YXRoXSB8PSBlbnRyeS0+dW5pbnRlcmVzdGluZyA/IFVQQVRIIDogSVBBVEg7CisJ CWVsc2UgaWYgKCFwYXRoc1twYXRoXSkKKwkJCWNvbnRpbnVlOworCQkKKwkJLyog ZGF0ZSBzdHVmZiAqLworCQlpZiAocmV2cy0+bWF4X2FnZSAhPSAtMSAmJiBudG9o bChlbnRyeS0+ZGF0ZSkgPCByZXZzLT5tYXhfYWdlKQorCQkJcGF0aHNbcGF0aF0g fD0gVVBBVEg7CisJCQorCQkvKiBsb29rdXAgb2JqZWN0ICovCisJCWNvID0gbG9v a3VwX2NvbW1pdChlbnRyeS0+c2hhMSk7CisJCW9iaiA9ICZjby0+b2JqZWN0Owor CQkKKwkJaWYgKG9iai0+ZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQkJcGF0aHNb cGF0aF0gfD0gVVBBVEg7CisJCQorCQlpZiAoKHBhdGhzW3BhdGhdICYgSVBBVEgp ICYmIChwYXRoc1twYXRoXSAmIFVQQVRIKSkgeworCQkJcGF0aHNbcGF0aF0gPSBV UEFUSDsKKwkJCQorCQkJLyogbWFyayBlZGdlICovCisJCQlpZiAobGFzdF9vYmpl Y3RzW3BhdGhdKSB7CisJCQkJcGFyc2VfY29tbWl0KGxhc3Rfb2JqZWN0c1twYXRo XSk7CisJCQkJCisJCQkJbGFzdF9vYmplY3RzW3BhdGhdLT5vYmplY3QuZmxhZ3Mg Jj0gfkZBQ0VfVkFMVUU7CisJCQkJbGFzdF9vYmplY3RzW3BhdGhdID0gMDsKKwkJ CX0KKwkJfQorCQkKKwkJLyogbm93IHdlIGdvdHRhIHJlLWFzc2VzcyB0aGUgd2hv bGUgaW50ZXJlc3RpbmcgdGhpbmcuLi4gKi8KKwkJZW50cnktPnVuaW50ZXJlc3Rp bmcgPSAhIShwYXRoc1twYXRoXSAmIFVQQVRIKTsKKwkJCisJCS8qIGZpcnN0IGNs b3NlIHBhdGhzICovCisJCWlmIChlbnRyeS0+c3BsaXRfbnIpIHsKKwkJCWludCBq LCBvZmYgPSBpbmRleCArIE9FX1NJWkUgKyBQQVRIX1NJWkUoZW50cnktPm1lcmdl X25yKTsKKwkJCQorCQkJZm9yIChqID0gMDsgaiA8IGVudHJ5LT5zcGxpdF9ucjsg aisrKSB7CisJCQkJdW5zaWduZWQgc2hvcnQgcCA9IG50b2hzKCoodW5zaWduZWQg c2hvcnQgKikobWFwICsgb2ZmICsgUEFUSF9TSVpFKGopKSk7CisJCQkJCisJCQkJ aWYgKHAgPj0gdG90YWxfcGF0aF9ucikKKwkJCQkJZ290byBlbmQ7CisJCQkJCisJ CQkJLyogYm91bmRhcnkgY29tbWl0PyAqLworCQkJCWlmICgocGF0aHNbcF0gJiBJ UEFUSCkgJiYgZW50cnktPnVuaW50ZXJlc3RpbmcpIHsKKwkJCQkJaWYgKGxhc3Rf b2JqZWN0c1twXSkgeworCQkJCQkJcGFyc2VfY29tbWl0KGxhc3Rfb2JqZWN0c1tw XSk7CisJCQkJCQkKKwkJCQkJCWxhc3Rfb2JqZWN0c1twXS0+b2JqZWN0LmZsYWdz ICY9IH5GQUNFX1ZBTFVFOworCQkJCQkJbGFzdF9vYmplY3RzW3BdID0gMDsKKwkJ CQkJfQorCQkJCX0gZWxzZSBpZiAobGFzdF9vYmplY3RzW3BdICYmICFsYXN0X29i amVjdHNbcF0tPm9iamVjdC5wYXJzZWQpCisJCQkJCWNvbW1pdF9saXN0X2luc2Vy dChjbywgJmxhc3Rfb2JqZWN0c1twXS0+cGFyZW50cyk7CisJCQkJCisJCQkJLyog Y2FuJ3QgY2xvc2UgYSBtZXJnZSBwYXRoIHVudGlsIGFsbCBhcmUgcGFyZW50cyBo YXZlIGJlZW4gZW5jb3VudGVyZWQgKi8KKwkJCQlpZiAoR0VUX0NPVU5UKHBhdGhz W3BdKSkgeworCQkJCQlTRVRfQ09VTlQocGF0aHNbcF0sIEdFVF9DT1VOVChwYXRo c1twXSkgLSAxKTsKKwkJCQkJCisJCQkJCWlmIChHRVRfQ09VTlQocGF0aHNbcF0p KQorCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJCQorCQkJCXBhdGhzW3BdID0g MDsKKwkJCQlsYXN0X29iamVjdHNbcF0gPSAwOworCQkJfQorCQl9CisJCQorCQkv KiBtYWtlIHRvcG8gcmVsYXRpb25zICovCisJCWlmIChsYXN0X29iamVjdHNbcGF0 aF0gJiYgIWxhc3Rfb2JqZWN0c1twYXRoXS0+b2JqZWN0LnBhcnNlZCkKKwkJCWNv bW1pdF9saXN0X2luc2VydChjbywgJmxhc3Rfb2JqZWN0c1twYXRoXS0+cGFyZW50 cyk7CisJCQorCQkvKiBpbml0aWFsaXplIGNvbW1pdCAqLworCQlpZiAoIWVudHJ5 LT5pc19zdGFydCkgeworCQkJY28tPmRhdGUgPSBudG9obChlbnRyeS0+ZGF0ZSk7 CisgCQkJb2JqLT5mbGFncyB8PSBBRERFRCB8IEZBQ0VfVkFMVUU7CisJCX0gZWxz ZQorCQkJcGFyc2VfY29tbWl0KGNvKTsKKwkJCisJCW9iai0+ZmxhZ3MgfD0gU0VF TjsKKyAJCQorIAkJaWYgKGVudHJ5LT51bmludGVyZXN0aW5nKQorIAkJCW9iai0+ ZmxhZ3MgfD0gVU5JTlRFUkVTVElORzsKKwkJCisJCS8qIHdlIG5lZWQgdG8ga25v dyB3aGF0IHRoZSBlZGdlcyBhcmUgKi8KKwkJbGFzdF9vYmplY3RzW3BhdGhdID0g Y287CisJCQorCQkvKiBhZGQgdG8gbGlzdCAqLworCQlpZiAoIShvYmotPmZsYWdz ICYgVU5JTlRFUkVTVElORykgfHwgcmV2cy0+c2hvd19hbGwpIHsKKwkJCWlmIChl bnRyeS0+aXNfc3RhcnQpCisJCQkJaW5zZXJ0X2J5X2RhdGVfY2FjaGVkKGNvLCB3 b3JrLCBpbnNlcnRfY2FjaGUsICZpbnNlcnRfY2FjaGUpOworCQkJZWxzZQorCQkJ CSpxdWV1ZSA9ICZjb21taXRfbGlzdF9pbnNlcnQoY28sICpxdWV1ZSktPm5leHQ7 CisJCQkKKwkJCS8qIGFkZCBjaGlsZHJlbiB0byBsaXN0IGFzIHdlbGwgKi8KKwkJ CWlmIChvYmotPmZsYWdzICYgVU5JTlRFUkVTVElORykKKwkJCQljb25zdW1lX2No aWxkcmVuID0gMDsKKwkJCWVsc2UgCisJCQkJY29uc3VtZV9jaGlsZHJlbiA9IDE7 CisJCX0KKwkJCisJCS8qIG9wZW4gcGFyZW50cyAqLworCQlpZiAoZW50cnktPm1l cmdlX25yKSB7CisJCQlpbnQgaiwgb2ZmID0gaW5kZXggKyBPRV9TSVpFOworCQkJ Y2hhciBmbGFnID0gZW50cnktPnVuaW50ZXJlc3RpbmcgPyBVUEFUSCA6IElQQVRI OworCQkJCisJCQlmb3IgKGogPSAwOyBqIDwgZW50cnktPm1lcmdlX25yOyBqKysp IHsKKwkJCQl1bnNpZ25lZCBzaG9ydCBwID0gbnRvaHMoKih1bnNpZ25lZCBzaG9y dCAqKShtYXAgKyBvZmYgKyBQQVRIX1NJWkUoaikpKTsKKwkJCQkKKwkJCQlpZiAo cCA+PSB0b3RhbF9wYXRoX25yKQorCQkJCQlnb3RvIGVuZDsKKwkJCQkKKwkJCQlp ZiAocGF0aHNbcF0gJiBmbGFnKQorCQkJCQljb250aW51ZTsKKwkJCQkKKwkJCQlw YXRoc1twXSB8PSBmbGFnOworCQkJfQorCQkJCisJCQkvKiBtYWtlIHN1cmUgd2Ug ZG9uJ3QgdXNlIHRoaXMgcGF0aCBiZWZvcmUgYWxsIG91ciBwYXJlbnRzIGhhdmUg aGFkIHRoZWlyIHNheSAqLworCQkJU0VUX0NPVU5UKHBhdGhzW3BhdGhdLCBlbnRy eS0+bWVyZ2VfbnIpOworCQl9CisJCQorCX0KKwkKKwlyZXR2YWwgPSAwOworCQor ZW5kOgorCWZyZWUocGF0aHMpOworCWZyZWUobGFzdF9vYmplY3RzKTsKKwkKKwly ZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGdldF9jYWNoZV9zbGljZV9o ZWFkZXIodW5zaWduZWQgY2hhciAqY2FjaGVfc2hhMSwgdW5zaWduZWQgY2hhciAq bWFwLCBpbnQgbGVuLCBzdHJ1Y3QgY2FjaGVfc2xpY2VfaGVhZGVyICpoZWFkKQor eworCWludCB0OworCQorCW1lbWNweShoZWFkLCBtYXAsIHNpemVvZihzdHJ1Y3Qg Y2FjaGVfc2xpY2VfaGVhZGVyKSk7CisJaGVhZC0+b2ZzX29iamVjdHMgPSBudG9o bChoZWFkLT5vZnNfb2JqZWN0cyk7CisJaGVhZC0+b2JqZWN0cyA9IG50b2hsKGhl YWQtPm9iamVjdHMpOworCWhlYWQtPnNpemUgPSBudG9obChoZWFkLT5zaXplKTsK KwloZWFkLT5wYXRoX25yID0gbnRvaHMoaGVhZC0+cGF0aF9ucik7CisJCisJaWYg KG1lbWNtcChoZWFkLT5zaWduYXR1cmUsICJSRVZDQUNIRSIsIDgpKQorCQlyZXR1 cm4gLTE7CisJaWYgKGhlYWQtPnZlcnNpb24gPiBTVVBQT1JURURfUkVWQ0FDSEVf VkVSU0lPTikKKwkJcmV0dXJuIC0yOworCWlmIChoYXNoY21wKGhlYWQtPnNoYTEs IGNhY2hlX3NoYTEpKQorCQlyZXR1cm4gLTM7CisJdCA9IHNpemVvZihzdHJ1Y3Qg Y2FjaGVfc2xpY2VfaGVhZGVyKTsKKwlpZiAodCAhPSBoZWFkLT5vZnNfb2JqZWN0 cyB8fCB0ID49IGxlbikKKwkJcmV0dXJuIC00OworCQorCWhlYWQtPnNpemUgPSBs ZW47CisJCisJcmV0dXJuIDA7Cit9CisKK2ludCB0cmF2ZXJzZV9jYWNoZV9zbGlj ZShzdHJ1Y3QgcmV2X2NhY2hlX2luZm8gKnJjaSwgdW5zaWduZWQgY2hhciAqY2Fj aGVfc2hhMSwgCisJc3RydWN0IHJldl9pbmZvICpyZXZzLCBzdHJ1Y3QgY29tbWl0 ICpjb21taXQsIAorCXVuc2lnbmVkIGxvbmcgKmRhdGVfc29fZmFyLCBpbnQgKnNs b3Bfc29fZmFyLCAKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKioqcXVldWUsIHN0cnVj dCBjb21taXRfbGlzdCAqKndvcmspCit7CisJaW50IGZkID0gLTEsIHJldHZhbCA9 IC0zOworCXN0cnVjdCBzdGF0IGZpOworCXN0cnVjdCBjYWNoZV9zbGljZV9oZWFk ZXIgaGVhZDsKKwl1bnNpZ25lZCBjaGFyICptYXAgPSBNQVBfRkFJTEVEOworCQor CS8qIHRoZSBpbmRleCBzaG91bGQndmUgYmVlbiBsb2FkZWQgYWxyZWFkeSB0byBm aW5kIGNhY2hlX3NoYTEsIGJ1dCBpdCdzIGdvb2QgCisJICogdG8gYmUgYWJzb2x1 dGVseSBzdXJlLi4uICovCisJaWYgKCFpZHhfbWFwKQorCQlpbml0X2luZGV4KCk7 CisJaWYgKCFpZHhfbWFwKQorCQlyZXR1cm4gLTE7CisJCisJbWVtc2V0KCZoZWFk LCAwLCBzaXplb2Yoc3RydWN0IGNhY2hlX3NsaWNlX2hlYWRlcikpOworCQorCWZk ID0gb3BlbihnaXRfcGF0aCgicmV2LWNhY2hlLyVzIiwgc2hhMV90b19oZXgoY2Fj aGVfc2hhMSkpLCBPX1JET05MWSk7CisJaWYgKGZkID09IC0xKQorCQlnb3RvIGVu ZDsKKwlpZiAoZnN0YXQoZmQsICZmaSkgfHwgZmkuc3Rfc2l6ZSA8IHNpemVvZihz dHJ1Y3QgY2FjaGVfc2xpY2VfaGVhZGVyKSkKKwkJZ290byBlbmQ7CisJCisJbWFw ID0geG1tYXAoMCwgZmkuc3Rfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwg TUFQX1BSSVZBVEUsIGZkLCAwKTsKKwlpZiAobWFwID09IE1BUF9GQUlMRUQpCisJ CWdvdG8gZW5kOworCWlmIChnZXRfY2FjaGVfc2xpY2VfaGVhZGVyKGNhY2hlX3No YTEsIG1hcCwgZmkuc3Rfc2l6ZSwgJmhlYWQpKQorCQlnb3RvIGVuZDsKKwkKKwly ZXR2YWwgPSB0cmF2ZXJzZV9jYWNoZV9zbGljZV8xKCZoZWFkLCBtYXAsIHJldnMs IGNvbW1pdCwgZGF0ZV9zb19mYXIsIHNsb3Bfc29fZmFyLCBxdWV1ZSwgd29yayk7 CisJCitlbmQ6CisJaWYgKG1hcCAhPSBNQVBfRkFJTEVEKQorCQltdW5tYXAobWFw LCBmaS5zdF9zaXplKTsKKwlpZiAoZmQgIT0gLTEpCisJCWNsb3NlKGZkKTsKKwkK KwlyZXR1cm4gcmV0dmFsOworfQorCisKKworLyogZ2VuZXJhdGlvbiAqLworCitz dHJ1Y3QgcGF0aF90cmFjayB7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCWlu dCBwYXRoOyAvKiBmb3IgZGVjcmVtZW50aW5nIHBhdGhzICovCisJc3RydWN0IHN0 cmJ1ZiBwYXRoX3N0cjsgLyogZm9yIGNsb3NpbmcgY2hpbGRyZW4gKi8KKwkKKwlz dHJ1Y3QgcGF0aF90cmFjayAqbmV4dCwgKnByZXY7Cit9OworCitzdGF0aWMgdW5z aWduZWQgY2hhciAqcGF0aHMgPSAwOworc3RhdGljIGludCBwYXRoX25yID0gMSwg cGF0aF9zeiA9IDA7CisKK3N0YXRpYyBzdHJ1Y3QgcGF0aF90cmFjayAqY2hpbGRy ZW5fdG9fY2xvc2UgPSAwLCAqcGF0aHNfdG9fZGVjID0gMDsKK3N0YXRpYyBzdHJ1 Y3QgcGF0aF90cmFjayAqcGF0aF90cmFja19hbGxvYyA9IDA7CisKKyNkZWZpbmUg UEFUSF9JTl9VU0UJCQkweDgwIC8qIGJpZ2dlc3QgYml0IHdlIGNhbiBnZXQgYXMg YSBjaGFyICovCisKK3N0YXRpYyBpbnQgZ2V0X25ld19wYXRoKHZvaWQpCit7CisJ aW50IGk7CisJCisJZm9yIChpID0gMTsgaSA8IHBhdGhfbnI7IGkrKykKKwkJaWYg KCFwYXRoc1tpXSkKKwkJCWJyZWFrOworCQorCWlmIChpID09IHBhdGhfbnIpIHsK KwkJaWYgKHBhdGhfbnIgPj0gcGF0aF9zeikgeworCQkJcGF0aF9zeiArPSA1MDsK KwkJCXBhdGhzID0geHJlYWxsb2MocGF0aHMsIHBhdGhfc3opOworCQkJbWVtc2V0 KHBhdGhzICsgcGF0aF9zeiAtIDUwLCAwLCA1MCk7CisJCX0KKwkJcGF0aF9ucisr OworCX0KKwkKKwlwYXRoc1tpXSA9IFBBVEhfSU5fVVNFOworCXJldHVybiBpOwor fQorCitzdGF0aWMgdm9pZCByZW1vdmVfcGF0aF90cmFjayhzdHJ1Y3QgcGF0aF90 cmFjayAqKnBwdCwgY2hhciB0b3RhbF9mcmVlKQoreworCXN0cnVjdCBwYXRoX3Ry YWNrICp0ID0gKnBwdDsKKwkKKwlpZiAodC0+bmV4dCkKKwkJdC0+bmV4dC0+cHJl diA9IHQtPnByZXY7CisJaWYgKHQtPnByZXYpCisJCXQtPnByZXYtPm5leHQgPSB0 LT5uZXh0OworCQorCXQgPSB0LT5uZXh0OworCQorCWlmICh0b3RhbF9mcmVlKQor CQlmcmVlKCpwcHQpOworCWVsc2UgeworCQkoKnBwdCktPm5leHQgPSBwYXRoX3Ry YWNrX2FsbG9jOworCQlwYXRoX3RyYWNrX2FsbG9jID0gKnBwdDsJCisJfQorCQor CSpwcHQgPSB0OworfQorCitzdGF0aWMgc3RydWN0IHBhdGhfdHJhY2sgKmZpbmRf cGF0aF90cmFjayhzdHJ1Y3QgcGF0aF90cmFjayAqaGVhZCwgc3RydWN0IGNvbW1p dCAqY29tbWl0KQoreworCXdoaWxlIChoZWFkKSB7CisJCWlmIChoZWFkLT5jb21t aXQgPT0gY29tbWl0KQorCQkJcmV0dXJuIGhlYWQ7CisJCWhlYWQgPSBoZWFkLT5u ZXh0OworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwYXRo X3RyYWNrICptYWtlX3BhdGhfdHJhY2soc3RydWN0IHBhdGhfdHJhY2sgKipoZWFk LCBzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJc3RydWN0IHBhdGhfdHJhY2sg KnB0OworCQorCWlmIChwYXRoX3RyYWNrX2FsbG9jKSB7CisJCXB0ID0gcGF0aF90 cmFja19hbGxvYzsKKwkJcGF0aF90cmFja19hbGxvYyA9IHB0LT5uZXh0OworCX0g ZWxzZQorCQlwdCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYXRoX3RyYWNrKSk7 CisJCisJbWVtc2V0KHB0LCAwLCBzaXplb2Yoc3RydWN0IHBhdGhfdHJhY2spKTsK KwlwdC0+Y29tbWl0ID0gY29tbWl0OworCQorCXB0LT5uZXh0ID0gKmhlYWQ7CisJ aWYgKCpoZWFkKQorCQkoKmhlYWQpLT5wcmV2ID0gcHQ7CisJKmhlYWQgPSBwdDsK KwkKKwlyZXR1cm4gcHQ7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9jaGlsZF90b19j bG9zZShzdHJ1Y3QgY29tbWl0ICpjb21taXQsIGludCBwYXRoKQoreworCXN0cnVj dCBwYXRoX3RyYWNrICpwdCA9IGZpbmRfcGF0aF90cmFjayhjaGlsZHJlbl90b19j bG9zZSwgY29tbWl0KTsKKwl1bnNpZ25lZCBzaG9ydCB3cml0ZV9wYXRoOworCQor CWlmICghcHQpIHsKKwkJcHQgPSBtYWtlX3BhdGhfdHJhY2soJmNoaWxkcmVuX3Rv X2Nsb3NlLCBjb21taXQpOworCQlzdHJidWZfaW5pdCgmcHQtPnBhdGhfc3RyLCAw KTsKKwl9CisJCisJd3JpdGVfcGF0aCA9IGh0b25zKCh1bnNpZ25lZCBzaG9ydClw YXRoKTsKKwlzdHJidWZfYWRkKCZwdC0+cGF0aF9zdHIsICZ3cml0ZV9wYXRoLCBQ QVRIX1dJRFRIKTsKK30KKworc3RhdGljIHZvaWQgYWRkX3BhdGhfdG9fZGVjKHN0 cnVjdCBjb21taXQgKmNvbW1pdCwgaW50IHBhdGgpCit7CisJbWFrZV9wYXRoX3Ry YWNrKCZwYXRoc190b19kZWMsIGNvbW1pdCk7CisJcGF0aHNfdG9fZGVjLT5wYXRo ID0gcGF0aDsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX3BhdGhzKHN0cnVjdCBj b21taXQgKmNvbW1pdCwgc3RydWN0IG9iamVjdF9lbnRyeSAqb2JqZWN0LCBzdHJ1 Y3Qgc3RyYnVmICptZXJnZV9zdHIsIHN0cnVjdCBzdHJidWYgKnNwbGl0X3N0cikK K3sKKwlpbnQgcGFyZW50X25yLCBvcGVuX3BhcmVudF9uciwgdGhpc19wYXRoOwor CXN0cnVjdCBjb21taXRfbGlzdCAqbGlzdDsKKwlzdHJ1Y3QgY29tbWl0ICpmaXJz dF9wYXJlbnQ7CisJc3RydWN0IHBhdGhfdHJhY2sgKipwcHQsICpwdDsKKwkKKwkv KiB3ZSBjYW4gb25seSByZS11c2UgYSBjbG9zZWQgcGF0aCBvbmNlIGFsbCBpdCdz IGNoaWxkcmVuIGhhdmUgYmVlbiBlbmNvdW50ZXJlZCwgCisJICogYXMgd2UgbmVl ZCB0byBrZWVwIHRyYWNrIG9mIGNvbW1pdCBib3VuZGFyaWVzICovCisJcHB0ID0g JnBhdGhzX3RvX2RlYzsKKwlwdCA9ICpwcHQ7CisJd2hpbGUgKHB0KSB7CisJCWlm IChwdC0+Y29tbWl0ID09IGNvbW1pdCkgeworCQkJaWYgKHBhdGhzW3B0LT5wYXRo XSAhPSBQQVRIX0lOX1VTRSkKKwkJCQlwYXRoc1twdC0+cGF0aF0tLTsKKwkJCXJl bW92ZV9wYXRoX3RyYWNrKHBwdCwgMCk7CisJCQlwdCA9ICpwcHQ7CisJCX0gZWxz ZSB7CisJCQlwdCA9IHB0LT5uZXh0OworCQkJcHB0ID0gJnB0OworCQl9CisJfQor CQorCS8qIHRoZSBjb21taXQgc3RydWN0IGhhcyBubyB3YXkgb2Yga2VlcGluZyB0 cmFjayBvZiBjaGlsZHJlbiAtLSBuZWNlc3NhcnkgZm9yIGNsb3NpbmcgCisJICog dW51c2VkIHBhdGhzIGFuZCB0cmFja2luZyBwYXRoIGJvdW5kYXJpZXMgLS0gc28g d2UgaGF2ZSB0byBkbyBpdCBoZXJlICovCisJcHB0ID0gJmNoaWxkcmVuX3RvX2Ns b3NlOworCXB0ID0gKnBwdDsKKwl3aGlsZSAocHQpIHsKKwkJaWYgKHB0LT5jb21t aXQgIT0gY29tbWl0KSB7CisJCQlwdCA9IHB0LT5uZXh0OworCQkJcHB0ID0gJnB0 OworCQkJY29udGludWU7CisJCX0KKwkJCisJCW9iamVjdC0+c3BsaXRfbnIgPSBw dC0+cGF0aF9zdHIubGVuIC8gUEFUSF9XSURUSDsKKwkJc3RyYnVmX2FkZChzcGxp dF9zdHIsIHB0LT5wYXRoX3N0ci5idWYsIHB0LT5wYXRoX3N0ci5sZW4pOworCQkK KwkJc3RyYnVmX3JlbGVhc2UoJnB0LT5wYXRoX3N0cik7CisJCXJlbW92ZV9wYXRo X3RyYWNrKHBwdCwgMCk7CisJCWJyZWFrOworCX0KKwkKKwkvKiBpbml0aWFsaXpl IG91ciBzZWxmISAqLworCWlmICghY29tbWl0LT5pbmRlZ3JlZSkgeworCQljb21t aXQtPmluZGVncmVlID0gZ2V0X25ld19wYXRoKCk7CisJCW9iamVjdC0+aXNfZW5k ID0gMTsKKwl9CisJCisJdGhpc19wYXRoID0gY29tbWl0LT5pbmRlZ3JlZTsKKwlw YXRoc1t0aGlzX3BhdGhdID0gUEFUSF9JTl9VU0U7CisJb2JqZWN0LT5wYXRoID0g aHRvbnModGhpc19wYXRoKTsKKwkKKwkvKiBjb3VudCBpbnRlcmVzdGluZyBwYXJl bnRzICovCisJcGFyZW50X25yID0gb3Blbl9wYXJlbnRfbnIgPSAwOworCWZpcnN0 X3BhcmVudCA9IDA7CisJZm9yIChsaXN0ID0gY29tbWl0LT5wYXJlbnRzOyBsaXN0 OyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlpZiAobGlzdC0+aXRlbS0+b2JqZWN0 LmZsYWdzICYgVU5JTlRFUkVTVElORykgeworCQkJb2JqZWN0LT5pc19zdGFydCA9 IDE7CisJCQljb250aW51ZTsKKwkJfQorCQkKKwkJcGFyZW50X25yKys7CisJCWlm ICghbGlzdC0+aXRlbS0+aW5kZWdyZWUpCisJCQlvcGVuX3BhcmVudF9ucisrOwor CQlpZiAoIWZpcnN0X3BhcmVudCkKKwkJCWZpcnN0X3BhcmVudCA9IGxpc3QtPml0 ZW07CisJfQorCQorCWlmICghcGFyZW50X25yKQorCQlyZXR1cm47CisJCisJaWYg KHBhcmVudF9uciA9PSAxICYmIG9wZW5fcGFyZW50X25yID09IDEpIHsKKwkJZmly c3RfcGFyZW50LT5pbmRlZ3JlZSA9IHRoaXNfcGF0aDsKKwkJcmV0dXJuOworCX0K KwkKKwkvKiBtYWtlIG1lcmdlIGxpc3QgKi8KKwlvYmplY3QtPm1lcmdlX25yID0g cGFyZW50X25yOworCXBhdGhzW3RoaXNfcGF0aF0gPSBwYXJlbnRfbnI7CisJCisJ Zm9yIChsaXN0ID0gY29tbWl0LT5wYXJlbnRzOyBsaXN0OyBsaXN0ID0gbGlzdC0+ bmV4dCkgeworCQlzdHJ1Y3QgY29tbWl0ICpwID0gbGlzdC0+aXRlbTsKKwkJdW5z aWduZWQgc2hvcnQgd3JpdGVfcGF0aDsKKwkJCisJCWlmIChwLT5vYmplY3QuZmxh Z3MgJiBVTklOVEVSRVNUSU5HKQorCQkJY29udGludWU7CisJCQorCQkvKiB1bmZv cnR1bmF0ZWx5IGR1ZSB0byBib3VuZGFyeSB0cmFja2luZyB3ZSBjYW4ndCByZS11 c2UgbWVyZ2UgcGF0aHMKKwkJICogKHVuYWJsZSB0byBndWFyYW50ZWUgbGFzdCBw YXJlbnQgcGF0aCA9IHRoaXMgLT4gbGFzdCB3b24ndCBhbHdheXMgYmUgYWJsZSB0 byAKKwkJICogc2V0IHRoaXMgYXMgYSBib3VuZGFyeSBvYmplY3QgKi8KKwkJaWYg KCFwLT5pbmRlZ3JlZSkKKwkJCXAtPmluZGVncmVlID0gZ2V0X25ld19wYXRoKCk7 CisJCQorCQl3cml0ZV9wYXRoID0gaHRvbnMoKHVuc2lnbmVkIHNob3J0KXAtPmlu ZGVncmVlKTsKKwkJc3RyYnVmX2FkZChtZXJnZV9zdHIsICZ3cml0ZV9wYXRoLCBQ QVRIX1dJRFRIKTsKKwkJCisJCS8qIG1ha2Ugc3VyZSBwYXRoIGlzIHByb3Blcmx5 IGVuZGVkICovCisJCWFkZF9jaGlsZF90b19jbG9zZShwLCB0aGlzX3BhdGgpOwor CQlhZGRfcGF0aF90b19kZWMocCwgdGhpc19wYXRoKTsKKwl9CisJCit9CisKKwor c3RhdGljIHZvaWQgYWRkX29iamVjdF9lbnRyeShjb25zdCB1bnNpZ25lZCBjaGFy ICpzaGExLCBpbnQgdHlwZSwgc3RydWN0IG9iamVjdF9lbnRyeSAqbm90aGlzb25l LCAKKwlzdHJ1Y3Qgc3RyYnVmICptZXJnZV9zdHIsIHN0cnVjdCBzdHJidWYgKnNw bGl0X3N0cikKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5IG9iamVjdDsKKwkKKwlp ZiAoIW5vdGhpc29uZSkgeworCQltZW1zZXQoJm9iamVjdCwgMCwgc2l6ZW9mKG9i amVjdCkpOworCQloYXNoY3B5KG9iamVjdC5zaGExLCBzaGExKTsKKwkJb2JqZWN0 LnR5cGUgPSB0eXBlOworCQkKKwkJaWYgKG1lcmdlX3N0cikKKwkJCW9iamVjdC5t ZXJnZV9uciA9IG1lcmdlX3N0ci0+bGVuIC8gUEFUSF9XSURUSDsKKwkJaWYgKHNw bGl0X3N0cikKKwkJCW9iamVjdC5zcGxpdF9uciA9IHNwbGl0X3N0ci0+bGVuIC8g UEFUSF9XSURUSDsKKwkJCisJCW5vdGhpc29uZSA9ICZvYmplY3Q7CisJfQorCQor CXN0cmJ1Zl9hZGQoZ19idWZmZXIsIG5vdGhpc29uZSwgc2l6ZW9mKG9iamVjdCkp OworCQorCWlmIChtZXJnZV9zdHIgJiYgbWVyZ2Vfc3RyLT5sZW4pCisJCXN0cmJ1 Zl9hZGQoZ19idWZmZXIsIG1lcmdlX3N0ci0+YnVmLCBtZXJnZV9zdHItPmxlbik7 CisJaWYgKHNwbGl0X3N0ciAmJiBzcGxpdF9zdHItPmxlbikKKwkJc3RyYnVmX2Fk ZChnX2J1ZmZlciwgc3BsaXRfc3RyLT5idWYsIHNwbGl0X3N0ci0+bGVuKTsKKwkK K30KKworc3RhdGljIHZvaWQgaW5pdF9yZXZjYWNoZV9kaXJlY3Rvcnkodm9pZCkK K3sKKwlzdHJ1Y3Qgc3RhdCBmaTsKKwkKKwlpZiAoc3RhdChnaXRfcGF0aCgicmV2 LWNhY2hlIiksICZmaSkgfHwgIVNfSVNESVIoZmkuc3RfbW9kZSkpCisJCWlmICht a2RpcihnaXRfcGF0aCgicmV2LWNhY2hlIiksIDA2NjYpKQorCQkJZGllKCJjYW4n dCBtYWtlIHJldi1jYWNoZSBkaXJlY3RvcnkiKTsKKwkKK30KKwordm9pZCBpbml0 X3JjaShzdHJ1Y3QgcmV2X2NhY2hlX2luZm8gKnJjaSkKK3sKKwlyY2ktPm9iamVj dHMgPSAxOworCXJjaS0+bGVncyA9IDA7CisJcmNpLT5tYWtlX2luZGV4ID0gMTsK KwkKKwlyY2ktPnNhdmVfdW5pcXVlID0gMDsKKwlyY2ktPmFkZF90b19wZW5kaW5n ID0gMTsKKwkKKwlyY2ktPmlnbm9yZV9zaXplID0gMDsKK30KKworaW50IG1ha2Vf Y2FjaGVfc2xpY2Uoc3RydWN0IHJldl9jYWNoZV9pbmZvICpyY2ksIAorCXN0cnVj dCByZXZfaW5mbyAqcmV2cywgc3RydWN0IGNvbW1pdF9saXN0ICoqZW5kcywgc3Ry dWN0IGNvbW1pdF9saXN0ICoqc3RhcnRzLCAKKwl1bnNpZ25lZCBjaGFyICpjYWNo ZV9zaGExKQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqbGlzdDsKKwlzdHJ1Y3Qg cmV2X2luZm8gdGhlcmV2czsKKwlzdHJ1Y3Qgc3RyYnVmIGJ1ZmZlciwgZW5kbGlz dCwgc3RhcnRsaXN0OworCXN0cnVjdCBjYWNoZV9zbGljZV9oZWFkZXIgaGVhZDsK KwlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisJdW5zaWduZWQgY2hhciBzaGExWzIw XTsKKwlzdHJ1Y3Qgc3RyYnVmIG1lcmdlX3BhdGhzLCBzcGxpdF9wYXRoczsKKwlp bnQgb2JqZWN0X25yLCB0b3RhbF9zeiwgZmQ7CisJY2hhciBmaWxlW1BBVEhfTUFY XSwgKm5ld2ZpbGU7CisJc3RydWN0IHJldl9jYWNoZV9pbmZvIGRlZl9yY2k7CisJ Z2l0X1NIQV9DVFggY3R4OworCQorCWlmICghcmNpKSB7CisJCXJjaSA9ICZkZWZf cmNpOworCQlpbml0X3JjaShyY2kpOworCX0KKwkKKwlpbml0X3JldmNhY2hlX2Rp cmVjdG9yeSgpOworCXN0cmNweShmaWxlLCBnaXRfcGF0aCgicmV2LWNhY2hlL1hY WFhYWCIpKTsKKwlmZCA9IHhta3N0ZW1wKGZpbGUpOworCQorCXN0cmJ1Zl9pbml0 KCZidWZmZXIsIDApOworCXN0cmJ1Zl9pbml0KCZlbmRsaXN0LCAwKTsKKwlzdHJi dWZfaW5pdCgmc3RhcnRsaXN0LCAwKTsKKwlzdHJidWZfaW5pdCgmbWVyZ2VfcGF0 aHMsIDApOworCXN0cmJ1Zl9pbml0KCZzcGxpdF9wYXRocywgMCk7CisJZ19idWZm ZXIgPSAmYnVmZmVyOworCQorCWlmICghcmV2cykgeworCQlyZXZzID0gJnRoZXJl dnM7CisJCWluaXRfcmV2aXNpb25zKHJldnMsIDApOworCQkKKwkJLyogd2UncmUg Z29ubmEgYXNzdW1lIG5vIG9uZSBlbHNlIGhhcyBhbHJlYWR5IHRyYXZlcnNlZCB0 aGlzLi4uICovCisJCWZvciAobGlzdCA9ICplbmRzOyBsaXN0OyBsaXN0ID0gbGlz dC0+bmV4dCkKKwkJCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCAmbGlzdC0+aXRl bS0+b2JqZWN0LCAwKTsKKwkJCisJCWZvciAobGlzdCA9ICpzdGFydHM7IGxpc3Q7 IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCQlsaXN0LT5pdGVtLT5vYmplY3QuZmxh Z3MgfD0gVU5JTlRFUkVTVElORzsKKwkJCWFkZF9wZW5kaW5nX29iamVjdChyZXZz LCAmbGlzdC0+aXRlbS0+b2JqZWN0LCAwKTsKKwkJfQorCX0KKwkKKwkvKiB3cml0 ZSBoZWFkIHBsYWNlaG9sZGVyICovCisJbWVtc2V0KCZoZWFkLCAwLCBzaXplb2Yo aGVhZCkpOworCWhlYWQub2ZzX29iamVjdHMgPSBodG9ubChzaXplb2YoaGVhZCkp OworCXh3cml0ZShmZCwgJmhlYWQsIHNpemVvZihoZWFkKSk7CisJCisJLyogaW5p dCByZXZpc2lvbnMhICovCisJcmV2cy0+dHJlZV9vYmplY3RzID0gMTsKKwlyZXZz LT5ibG9iX29iamVjdHMgPSAxOworCXJldnMtPnRvcG9fb3JkZXIgPSAxOworCXJl dnMtPmxpZm8gPSAxOworCQorCXNldHVwX3JldmlzaW9ucygwLCAwLCByZXZzLCAw KTsKKwlpZiAocHJlcGFyZV9yZXZpc2lvbl93YWxrKHJldnMpKQorCQlkaWUoImRp ZWQgcHJlcGFyaW5nIHJldmlzaW9uIHdhbGsiKTsKKwkKKwlvYmplY3RfbnIgPSB0 b3RhbF9zeiA9IDA7CisJd2hpbGUgKChjb21taXQgPSBnZXRfcmV2aXNpb24ocmV2 cykpICE9IDApIHsKKwkJc3RydWN0IG9iamVjdF9lbnRyeSBvYmplY3Q7CisJCQor CQlzdHJidWZfc2V0bGVuKCZtZXJnZV9wYXRocywgMCk7CisJCXN0cmJ1Zl9zZXRs ZW4oJnNwbGl0X3BhdGhzLCAwKTsKKwkJCisJCW1lbXNldCgmb2JqZWN0LCAwLCBz aXplb2Yob2JqZWN0KSk7CisJCW9iamVjdC50eXBlID0gT0JKX0NPTU1JVDsKKwkJ b2JqZWN0LmRhdGUgPSBodG9ubChjb21taXQtPmRhdGUpOworCQloYXNoY3B5KG9i amVjdC5zaGExLCBjb21taXQtPm9iamVjdC5zaGExKTsKKwkJCisJCWhhbmRsZV9w YXRocyhjb21taXQsICZvYmplY3QsICZtZXJnZV9wYXRocywgJnNwbGl0X3BhdGhz KTsKKwkJCisJCWlmIChvYmplY3QuaXNfc3RhcnQpCisJCQlzdHJidWZfYWRkKCZz dGFydGxpc3QsIG9iamVjdC5zaGExLCAyMCk7CisJCWlmIChvYmplY3QuaXNfZW5k KQorCQkJc3RyYnVmX2FkZCgmZW5kbGlzdCwgb2JqZWN0LnNoYTEsIDIwKTsKKwkJ CisJCWNvbW1pdC0+aW5kZWdyZWUgPSAwOworCQkKKwkJYWRkX29iamVjdF9lbnRy eSgwLCAwLCAmb2JqZWN0LCAmbWVyZ2VfcGF0aHMsICZzcGxpdF9wYXRocyk7CisJ CW9iamVjdF9ucisrOworCQkKKwkJLyogcHJpbnQgZXZlcnkgfjFNQiBvciBzbyAq LworCQlpZiAoYnVmZmVyLmxlbiA+IDEwMDAwMDApIHsKKwkJCXdyaXRlX2luX2Z1 bGwoZmQsIGJ1ZmZlci5idWYsIGJ1ZmZlci5sZW4pOworCQkJdG90YWxfc3ogKz0g YnVmZmVyLmxlbjsKKwkJCQorCQkJc3RyYnVmX3NldGxlbigmYnVmZmVyLCAwKTsK KwkJfQorCX0KKwkKKwlpZiAoYnVmZmVyLmxlbikgeworCQl3cml0ZV9pbl9mdWxs KGZkLCBidWZmZXIuYnVmLCBidWZmZXIubGVuKTsKKwkJdG90YWxfc3ogKz0gYnVm ZmVyLmxlbjsKKwl9CisJCisJLyogZ28gYWhlYWQgYSBmcmVlIHNvbWUgc3R1ZmYu Li4gKi8KKwlzdHJidWZfcmVsZWFzZSgmYnVmZmVyKTsKKwlzdHJidWZfcmVsZWFz ZSgmbWVyZ2VfcGF0aHMpOworCXN0cmJ1Zl9yZWxlYXNlKCZzcGxpdF9wYXRocyk7 CisJaWYgKHBhdGhfc3opCisJCWZyZWUocGF0aHMpOworCXdoaWxlIChwYXRoX3Ry YWNrX2FsbG9jKQorCQlyZW1vdmVfcGF0aF90cmFjaygmcGF0aF90cmFja19hbGxv YywgMSk7CisJCisJLyogdGhlIG1lYW5pbmcgb2YgdGhlIGhhc2ggbmFtZSBpcyBt b3JlIG9yIGxlc3MgaXJyZWxldmFudCwgaXQncyB0aGUgdW5pcXVlbmVzcyB0aGF0 IG1hdHRlcnMgKi8KKwlzdHJidWZfYWRkKCZzdGFydGxpc3QsIGVuZGxpc3QuYnVm LCBlbmRsaXN0Lmxlbik7CisJZ2l0X1NIQTFfSW5pdCgmY3R4KTsKKwlnaXRfU0hB MV9VcGRhdGUoJmN0eCwgc3RhcnRsaXN0LmJ1Ziwgc3RhcnRsaXN0Lmxlbik7CisJ Z2l0X1NIQTFfRmluYWwoc2hhMSwgJmN0eCk7CisJCisJLyogbm93IGFjdHVhbGx5 IGluaXRpYWxpemUgaGVhZGVyICovCisJc3RyY3B5KGhlYWQuc2lnbmF0dXJlLCAi UkVWQ0FDSEUiKTsKKwloZWFkLnZlcnNpb24gPSBTVVBQT1JURURfUkVWQ0FDSEVf VkVSU0lPTjsKKwkKKwloZWFkLm9iamVjdHMgPSBodG9ubChvYmplY3RfbnIpOwor CWhlYWQuc2l6ZSA9IGh0b25sKG50b2hsKGhlYWQub2ZzX29iamVjdHMpICsgdG90 YWxfc3opOworCWhlYWQucGF0aF9uciA9IGh0b25zKHBhdGhfbnIpOworCWhhc2hj cHkoaGVhZC5zaGExLCBzaGExKTsKKwkKKwkvKiBzb21lIGluZm8hICovCisJZnBy aW50ZihzdGRlcnIsICJvYmplY3RzOiAlZFxuIiwgb2JqZWN0X25yKTsKKwlmcHJp bnRmKHN0ZGVyciwgInBhdGhzOiAlZFxuIiwgcGF0aF9ucik7CisJCisJbHNlZWso ZmQsIDAsIFNFRUtfU0VUKTsKKwl4d3JpdGUoZmQsICZoZWFkLCBzaXplb2YoaGVh ZCkpOworCQorCWlmIChyY2ktPm1ha2VfaW5kZXggJiYgbWFrZV9jYWNoZV9pbmRl eChyY2ksIHNoYTEsIGZkLCBudG9obChoZWFkLnNpemUpKSA8IDApCisJCWRpZSgi Y2FuJ3QgdXBkYXRlIGluZGV4Iik7CisJCisJY2xvc2UoZmQpOworCQorCW5ld2Zp bGUgPSBnaXRfcGF0aCgicmV2LWNhY2hlLyVzIiwgc2hhMV90b19oZXgoc2hhMSkp OworCWlmIChyZW5hbWUoZmlsZSwgbmV3ZmlsZSkpCisJCWRpZSgiY2FuJ3QgbW92 ZSB0ZW1wIGZpbGUiKTsKKwkKKwkvKiBsZXQgb3VyIGNhbGxlciBrbm93IHdoYXQg d2UndmUganVzdCBtYWRlICovCisJaWYgKGNhY2hlX3NoYTEpCisJCWhhc2hjcHko Y2FjaGVfc2hhMSwgc2hhMSk7CisJCisJc3RyYnVmX3JlbGVhc2UoJnN0YXJ0bGlz dCk7CisJc3RyYnVmX3JlbGVhc2UoJmVuZGxpc3QpOworCQorCXJldHVybiAwOwor fQorCisKK3N0YXRpYyBpbnQgaW5kZXhfc29ydF9oYXNoKGNvbnN0IHZvaWQgKmEs IGNvbnN0IHZvaWQgKmIpCit7CisJcmV0dXJuIGhhc2hjbXAoSUVfQ0FTVChhKS0+ c2hhMSwgSUVfQ0FTVChiKS0+c2hhMSk7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVf Y2FjaGVfaW5kZXgoc3RydWN0IHN0cmJ1ZiAqYm9keSkKK3sKKwlzdHJ1Y3QgaW5k ZXhfaGVhZGVyX29uZGlzayB3aGVhZDsKKwlzdHJ1Y3QgbG9ja19maWxlICpsazsK KwlpbnQgZmQsIGk7CisJCisJLyogY2xlYXIgaW5kZXggbWFwIGlmIGxvYWRlZCAq LworCWlmIChpZHhfbWFwKSB7CisJCW11bm1hcChpZHhfbWFwLCBpZHhfc2l6ZSk7 CisJCWlkeF9tYXAgPSAwOworCX0KKwkKKwlsayA9IHhjYWxsb2Moc2l6ZW9mKHN0 cnVjdCBsb2NrX2ZpbGUpLCAxKTsKKwlmZCA9IGhvbGRfbG9ja19maWxlX2Zvcl91 cGRhdGUobGssIGdpdF9wYXRoKCJyZXYtY2FjaGUvaW5kZXgiKSwgMCk7CisJaWYg KGZkIDwgMCkgeworCQlmcmVlKGxrKTsKKwkJcmV0dXJuIC0xOworCX0KKwkKKwkv KiBlbmRpYW5uZXNzIHlheSEgKi8KKwltZW1zZXQoJndoZWFkLCAwLCBzaXplb2Yo d2hlYWQpKTsKKwltZW1jcHkod2hlYWQuc2lnbmF0dXJlLCAiUkVWSU5ERVgiLCA4 KTsKKwl3aGVhZC52ZXJzaW9uID0gaWR4X2hlYWQudmVyc2lvbjsKKwl3aGVhZC5v ZnNfb2JqZWN0cyA9IGh0b25sKGlkeF9oZWFkLm9mc19vYmplY3RzKTsKKwl3aGVh ZC5vYmplY3RzID0gaHRvbmwoaWR4X2hlYWQub2JqZWN0cyk7CisJd2hlYWQuY2Fj aGVzID0gaWR4X2hlYWQuY2FjaGVzOworCXdoZWFkLm1heF9kYXRlID0gaHRvbmwo aWR4X2hlYWQubWF4X2RhdGUpOworCXdoZWFkLmNhY2hlc19idWZmZXIgPSBpZHhf aGVhZC5jYWNoZXNfYnVmZmVyOworCQorCXdyaXRlKGZkLCAmd2hlYWQsIHNpemVv ZihzdHJ1Y3QgaW5kZXhfaGVhZGVyX29uZGlzaykpOworCXdyaXRlX2luX2Z1bGwo ZmQsIGlkeF9oZWFkLmNhY2hlX3NoYTFzLCBpZHhfaGVhZC5jYWNoZXNfYnVmZmVy ICogMjApOworCQorCWZvciAoaSA9IDA7IGkgPD0gMHhmZjsgaSsrKQorCQlmYW5v dXRbaV0gPSBodG9ubChmYW5vdXRbaV0pOworCXdyaXRlX2luX2Z1bGwoZmQsIGZh bm91dCwgMHgxMDAgKiBzaXplb2YodWludDMyX3QpKTsKKwkKKwl3cml0ZV9pbl9m dWxsKGZkLCBib2R5LT5idWYsIGJvZHktPmxlbik7CisJCisJaWYgKGNvbW1pdF9s b2NrX2ZpbGUobGspIDwgMCkKKwkJcmV0dXJuIC0yOworCQorCS8qIGxrIGZyZWVk IGJ5IGxvY2tmaWxlLmMgKi8KKwkKKwlyZXR1cm4gMDsKK30KKworaW50IG1ha2Vf Y2FjaGVfaW5kZXgoc3RydWN0IHJldl9jYWNoZV9pbmZvICpyY2ksIHVuc2lnbmVk IGNoYXIgKmNhY2hlX3NoYTEsIAorCWludCBmZCwgdW5zaWduZWQgaW50IHNpemUp Cit7CisJc3RydWN0IHN0cmJ1ZiBidWZmZXI7CisJaW50IGksIGNhY2hlX2luZGV4 LCBjdXI7CisJdW5zaWduZWQgY2hhciAqbWFwOworCXVuc2lnbmVkIGxvbmcgbWF4 X2RhdGU7CisJCisJaWYgKCFpZHhfbWFwKQorCQlpbml0X2luZGV4KCk7CisJCisJ bHNlZWsoZmQsIDAsIFNFRUtfU0VUKTsKKwltYXAgPSB4bW1hcCgwLCBzaXplLCBQ Uk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfUFJJVkFURSwgZmQsIDApOworCWlm IChtYXAgPT0gTUFQX0ZBSUxFRCkKKwkJcmV0dXJuIC0xOworCQorCXN0cmJ1Zl9p bml0KCZidWZmZXIsIDApOworCWlmIChpZHhfbWFwKSB7CisJCXN0cmJ1Zl9hZGQo JmJ1ZmZlciwgaWR4X21hcCArIGZhbm91dFswXSwgZmFub3V0WzB4MTAwXSAtIGZh bm91dFswXSk7CisJfSBlbHNlIHsKKwkJLyogbm90IGFuIHVwZGF0ZSAqLworCQlt ZW1zZXQoJmlkeF9oZWFkLCAwLCBzaXplb2Yoc3RydWN0IGluZGV4X2hlYWRlcikp OworCQlzdHJjcHkoaWR4X2hlYWQuc2lnbmF0dXJlLCAiUkVWSU5ERVgiKTsKKwkJ aWR4X2hlYWQudmVyc2lvbiA9IFNVUFBPUlRFRF9SRVZJTkRFWF9WRVJTSU9OOwor CQlpZHhfaGVhZC5vZnNfb2JqZWN0cyA9IHNpemVvZihzdHJ1Y3QgaW5kZXhfaGVh ZGVyX29uZGlzaykgKyAweDEwMCAqIHNpemVvZih1aW50MzJfdCk7CisJfQorCQor CS8qIGFyZSB3ZSByZW1ha2luZyBhIHNsaWNlPyAqLworCWZvciAoaSA9IDA7IGkg PCBpZHhfaGVhZC5jYWNoZXM7IGkrKykKKwkJaWYgKCFoYXNoY21wKGlkeF9oZWFk LmNhY2hlX3NoYTFzICsgaSAqIDIwLCBjYWNoZV9zaGExKSkKKwkJCWJyZWFrOwor CQorCWlmIChpID09IGlkeF9oZWFkLmNhY2hlcykgeworCQljYWNoZV9pbmRleCA9 IGlkeF9oZWFkLmNhY2hlcysrOworCQlpZiAoaWR4X2hlYWQuY2FjaGVzID49IGlk eF9oZWFkLmNhY2hlc19idWZmZXIpIHsKKwkJCS8qIHRoaXMgd2hvbGUgZGFuY2Ug aXMgYSBiaXQgdXNlbGVzcyBjdXJyZW50bHksIGJlY2F1c2Ugd2UgcmUtd3JpdGUg ZXZlcnl0aGluZyByZWdhcmRsZXNzLCAKKwkJCSAqIGJ1dCBsYXRlciBvbiB3ZSBt aWdodCBkZWNpZGUgdG8gdXNlIGEgaGFzaG1hcCBvciBzb21ldGhpbmcgZWxzZSB3 aGljaCBkb2VzIG5vdCByZXF1aXJlIAorCQkJICogYW55IHBhcnRpY3VsYXIgb24t ZGlzayBmb3JtYXQuICB0aGF0IHdvdWxkIGZyZWUgdXMgdXAgdG8gc2ltcGx5IGFw cGVuZCBuZXcgb2JqZWN0cyBhbmQgCisJCQkgKiB0d2VhayB0aGUgaGVhZGVyIGFj Y29yZGluZ2x5ICovCisJCQlpZHhfaGVhZC5jYWNoZXNfYnVmZmVyICs9IDIwOwor CQkJaWR4X2hlYWQuY2FjaGVfc2hhMXMgPSB4cmVhbGxvYyhpZHhfaGVhZC5jYWNo ZV9zaGExcywgaWR4X2hlYWQuY2FjaGVzX2J1ZmZlciAqIDIwKTsKKwkJCWlkeF9o ZWFkLm9mc19vYmplY3RzICs9IDIwICogMjA7CisJCX0KKwkJCisJCWhhc2hjcHko aWR4X2hlYWQuY2FjaGVfc2hhMXMgKyBjYWNoZV9pbmRleCAqIDIwLCBjYWNoZV9z aGExKTsKKwl9IGVsc2UKKwkJY2FjaGVfaW5kZXggPSBpOworCQorCWhhc2hjcHko aWR4X2hlYWQuY2FjaGVfc2hhMXMgKyBjYWNoZV9pbmRleCAqIDIwLCBjYWNoZV9z aGExKTsKKwkKKwlpID0gc2l6ZW9mKHN0cnVjdCBjYWNoZV9zbGljZV9oZWFkZXIp OyAvKiBvZmZzZXQgKi8KKwltYXhfZGF0ZSA9IGlkeF9oZWFkLm1heF9kYXRlOwor CXdoaWxlIChpIDwgc2l6ZSkgeworCQlzdHJ1Y3QgaW5kZXhfZW50cnkgaW5kZXhf ZW50cnksICplbnRyeTsKKwkJc3RydWN0IG9iamVjdF9lbnRyeSAqb2JqZWN0X2Vu dHJ5ID0gT0VfQ0FTVChtYXAgKyBpKTsKKwkJdW5zaWduZWQgbG9uZyBkYXRlOwor CQlpbnQgcG9zID0gaTsKKwkJCisJCWkgKz0gQUNUVUFMX09CSkVDVF9FTlRSWV9T SVpFKG9iamVjdF9lbnRyeSk7CisJCQorCQlpZiAob2JqZWN0X2VudHJ5LT50eXBl ICE9IE9CSl9DT01NSVQpCisJCQljb250aW51ZTsKKwkJCisJCS8qIGRvbid0IGlu Y2x1ZGUgc3RhcnRzOyBvdGhlcndpc2Ugd2UnbGwgZmluZCBvdXJzZWx2ZXMgaW4g bG9vcHMgKi8KKwkJaWYgKG9iamVjdF9lbnRyeS0+aXNfc3RhcnQpCisJCQljb250 aW51ZTsKKwkJCisJCS8qIGhhbmRsZSBpbmRleCBkdXBsaWNhdGlvbgorCQkgKiAt PiBrZWVwIG9sZCBjb3B5IHVubGVzcyBuZXcgb25lIGlzIGFuIGVuZCAtLSBiYXNl ZCBvbiBleHBlY3RlZCB1c2FnZSwgb2xkZXIgb25lcyB3aWxsIGJlIG1vcmUgCisJ CSAqIGxpa2VseSB0byBsZWFkIHRvIGdyZWF0ZXIgc2xpY2UgdHJhdmVyc2FscyB0 aGFuIG5ldyBvbmVzCisJCSAqIHNob3VsZCB3ZSBhbGxvdyBtb3JlIGludGVsbGln ZW50IG92ZXJyaWRpbmc/ICovCisJCWRhdGUgPSBudG9obChvYmplY3RfZW50cnkt PmRhdGUpOworCQlpZiAoZGF0ZSA+IGlkeF9oZWFkLm1heF9kYXRlKSB7CisgCQkJ ZW50cnkgPSAwOworCQkJaWYgKGRhdGUgPiBtYXhfZGF0ZSkKKwkJCQltYXhfZGF0 ZSA9IGRhdGU7CisJCX0gZWxzZQorCQkJZW50cnkgPSBzZWFyY2hfaW5kZXgob2Jq ZWN0X2VudHJ5LT5zaGExKTsKKwkJCisJCWlmIChlbnRyeSAmJiAhb2JqZWN0X2Vu dHJ5LT5pc19lbmQpCisJCQljb250aW51ZTsKKwkJZWxzZSBpZiAoZW50cnkpIC8q IG1tbSwgcG9pbnRlciBhcml0aG1ldGljLi4uIHRhc3R5ICovICAvKiAoZW50cnkt aWR4X21hcCA9IG9mZnNldCwgc28gY2FzdCBpcyB2YWxpZCkgKi8KKwkJCWVudHJ5 ID0gSUVfQ0FTVChidWZmZXIuYnVmICsgKHVuc2lnbmVkIGludCkoKHVuc2lnbmVk IGNoYXIgKillbnRyeSAtIGlkeF9tYXApIC0gZmFub3V0WzBdKTsKKwkJZWxzZQor CQkJZW50cnkgPSAmaW5kZXhfZW50cnk7CisJCQorCQltZW1zZXQoZW50cnksIDAs IHNpemVvZihpbmRleF9lbnRyeSkpOworCQloYXNoY3B5KGVudHJ5LT5zaGExLCBv YmplY3RfZW50cnktPnNoYTEpOworCQllbnRyeS0+aXNfZW5kID0gb2JqZWN0X2Vu dHJ5LT5pc19lbmQ7CisJCWVudHJ5LT5jYWNoZV9pbmRleCA9IGNhY2hlX2luZGV4 OworCQllbnRyeS0+cG9zID0gaHRvbmwocG9zKTsKKwkJCisJCWlmIChlbnRyeSA9 PSAmaW5kZXhfZW50cnkpIHsKKwkJCXN0cmJ1Zl9hZGQoJmJ1ZmZlciwgZW50cnks IHNpemVvZihpbmRleF9lbnRyeSkpOworCQkJaWR4X2hlYWQub2JqZWN0cysrOwor CQl9CisJCQorCX0KKwkKKwlpZHhfaGVhZC5tYXhfZGF0ZSA9IG1heF9kYXRlOwor CXFzb3J0KGJ1ZmZlci5idWYsIGJ1ZmZlci5sZW4gLyBJRV9TSVpFLCBJRV9TSVpF LCBpbmRleF9zb3J0X2hhc2gpOworCQorCS8qIGdlbmVyYXRlIGZhbm91dCAqLwor CWN1ciA9IDB4MDA7CisJZm9yIChpID0gMDsgaSA8IGJ1ZmZlci5sZW47IGkgKz0g SUVfU0laRSkgeworCQlzdHJ1Y3QgaW5kZXhfZW50cnkgKmVudHJ5ID0gSUVfQ0FT VChidWZmZXIuYnVmICsgaSk7CisJCQorCQl3aGlsZSAoY3VyIDw9IGVudHJ5LT5z aGExWzBdKQorCQkJZmFub3V0W2N1cisrXSA9IGkgKyBpZHhfaGVhZC5vZnNfb2Jq ZWN0czsKKwl9CisJCisJd2hpbGUgKGN1ciA8PSAweGZmKQorCQlmYW5vdXRbY3Vy KytdID0gaWR4X2hlYWQub2ZzX29iamVjdHMgKyBidWZmZXIubGVuOworCQorCS8q IEJPT00hICovCisJaWYgKHdyaXRlX2NhY2hlX2luZGV4KCZidWZmZXIpKQorCQly ZXR1cm4gLTE7CisJCisJbXVubWFwKG1hcCwgc2l6ZSk7CisJc3RyYnVmX3JlbGVh c2UoJmJ1ZmZlcik7CisJCisJLyogaWR4X21hcCBpcyB1bmxvYWRlZCB3aXRob3V0 IGNsZWFudXBfY2FjaGVfc2xpY2VzKCksIHNvIHJlZ2FyZGxlc3Mgb2YgcHJldmlv dXMgaW5kZXggZXhpc3RlbmNlIAorCSAqIHdlIGNhbiBzdGlsbCBmcmVlIHRoaXMg dXAgKi8KKwlmcmVlKGlkeF9oZWFkLmNhY2hlX3NoYTFzKTsKKwkKKwlyZXR1cm4g MDsKK30KKworCisvKiBhZGQgZW5kLWNvbW1pdHMgZnJvbSBlYWNoIGNhY2hlIHNs aWNlICh1bmludGVyZXN0aW5nbmVzcyB3aWxsIGJlIHByb3BvZ2F0ZWQpICovCit2 b2lkIGVuZHNfZnJvbV9zbGljZXMoc3RydWN0IHJldl9pbmZvICpyZXZzLCB1bnNp Z25lZCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCWlu dCBpOworCQorCWlmICghaWR4X21hcCkKKwkJaW5pdF9pbmRleCgpOworCWlmICgh aWR4X21hcCkKKwkJcmV0dXJuOworCQorCS8qIGhhdmVuJ3QgaW1wbGVtZW50ZWQg d2hpY2ggeWV0OyBubyBuZWVkIHJlYWxseS4uLiAqLworCWZvciAoaSA9IGlkeF9o ZWFkLm9mc19vYmplY3RzOyBpIDwgaWR4X3NpemU7IGkgKz0gSUVfU0laRSkgewor CQlzdHJ1Y3QgaW5kZXhfZW50cnkgKmVudHJ5ID0gSUVfQ0FTVChpZHhfbWFwICsg aSk7CisJCQorCQlpZiAoIWVudHJ5LT5pc19lbmQpCisJCQljb250aW51ZTsKKwkJ CisJCWNvbW1pdCA9IGxvb2t1cF9jb21taXQoZW50cnktPnNoYTEpOworCQlpZiAo IWNvbW1pdCkKKwkJCWNvbnRpbnVlOworCQkKKwkJY29tbWl0LT5vYmplY3QuZmxh Z3MgfD0gZmxhZ3M7CisJCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCAmY29tbWl0 LT5vYmplY3QsIDApOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL3JldmlzaW9uLmMg Yi9yZXZpc2lvbi5jCmluZGV4IGEzMTQzNGIuLmQ4NWFiYWUgMTAwNjQ0Ci0tLSBh L3JldmlzaW9uLmMKKysrIGIvcmV2aXNpb24uYwpAQCAtMzk2LDcgKzM5Niw3IEBA IHN0YXRpYyB2b2lkIHRyeV90b19zaW1wbGlmeV9jb21taXQoc3RydWN0IHJldl9p bmZvICpyZXZzLCBzdHJ1Y3QgY29tbWl0ICpjb21taXQpCiAJCQkJcHAgPSAmcGFy ZW50LT5uZXh0OwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJcGFyZW50LT5uZXh0 ID0gTlVMTDsKKwkJCXBhcmVudC0+bmV4dCA9IE5VTEw7IC8qIGlzIHRoaXMgbGVh a2luZyBtZW1vcnk/ICovCiAJCQljb21taXQtPnBhcmVudHMgPSBwYXJlbnQ7CiAJ CQljb21taXQtPm9iamVjdC5mbGFncyB8PSBUUkVFU0FNRTsKIAkJCXJldHVybjsK QEAgLTQzMiw3ICs0MzIsNyBAQCBzdGF0aWMgdm9pZCB0cnlfdG9fc2ltcGxpZnlf Y29tbWl0KHN0cnVjdCByZXZfaW5mbyAqcmV2cywgc3RydWN0IGNvbW1pdCAqY29t bWl0KQogCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFRSRUVTQU1FOwogfQogCi1z dGF0aWMgdm9pZCBpbnNlcnRfYnlfZGF0ZV9jYWNoZWQoc3RydWN0IGNvbW1pdCAq cCwgc3RydWN0IGNvbW1pdF9saXN0ICoqaGVhZCwKK3ZvaWQgaW5zZXJ0X2J5X2Rh dGVfY2FjaGVkKHN0cnVjdCBjb21taXQgKnAsIHN0cnVjdCBjb21taXRfbGlzdCAq KmhlYWQsCiAJCSAgICBzdHJ1Y3QgY29tbWl0X2xpc3QgKmNhY2hlZF9iYXNlLCBz dHJ1Y3QgY29tbWl0X2xpc3QgKipjYWNoZSkKIHsKIAlzdHJ1Y3QgY29tbWl0X2xp c3QgKm5ld19lbnRyeTsKZGlmZiAtLWdpdCBhL3JldmlzaW9uLmggYi9yZXZpc2lv bi5oCmluZGV4IGZiNzQ0OTIuLmU4N2Y0MWQgMTAwNjQ0Ci0tLSBhL3JldmlzaW9u LmgKKysrIGIvcmV2aXNpb24uaApAQCAtMTMsNyArMTMsOCBAQAogI2RlZmluZSBD SElMRF9TSE9XTgkoMXU8PDYpCiAjZGVmaW5lIEFEREVECQkoMXU8PDcpCS8qIFBh cmVudHMgYWxyZWFkeSBwYXJzZWQgYW5kIGFkZGVkPyAqLwogI2RlZmluZSBTWU1N RVRSSUNfTEVGVAkoMXU8PDgpCi0jZGVmaW5lIEFMTF9SRVZfRkxBR1MJKCgxdTw8 OSktMSkKKyNkZWZpbmUgRkFDRV9WQUxVRQkoMXU8PDkpCisjZGVmaW5lIEFMTF9S RVZfRkxBR1MJKCgxdTw8MTApLTEpCiAKIHN0cnVjdCByZXZfaW5mbzsKIHN0cnVj dCBsb2dfaW5mbzsKQEAgLTczLDYgKzc0LDEwIEBAIHN0cnVjdCByZXZfaW5mbyB7 CiAJCQlkZW5zZV9jb21iaW5lZF9tZXJnZXM6MSwKIAkJCWFsd2F5c19zaG93X2hl YWRlcjoxOwogCisJLyogcmV2LWNhY2hlIGZsYWdzICovCisJdW5zaWduZWQgaW50 IGZvcl9wYWNrOjEsIAorCQlkb250X2NhY2hlX21lOjE7CisKIAkvKiBGb3JtYXQg aW5mbyAqLwogCXVuc2lnbmVkIGludAlzaG93bl9vbmU6MSwKIAkJCXNob3dfbWVy Z2U6MSwKQEAgLTE2Nyw0ICsxNzIsMzggQEAgZW51bSBjb21taXRfYWN0aW9uIHsK IAogZXh0ZXJuIGVudW0gY29tbWl0X2FjdGlvbiBzaW1wbGlmeV9jb21taXQoc3Ry dWN0IHJldl9pbmZvICpyZXZzLCBzdHJ1Y3QgY29tbWl0ICpjb21taXQpOwogCitl eHRlcm4gdm9pZCBpbnNlcnRfYnlfZGF0ZV9jYWNoZWQoc3RydWN0IGNvbW1pdCAq cCwgc3RydWN0IGNvbW1pdF9saXN0ICoqaGVhZCwKKwkJICAgIHN0cnVjdCBjb21t aXRfbGlzdCAqY2FjaGVkX2Jhc2UsIHN0cnVjdCBjb21taXRfbGlzdCAqKmNhY2hl KTsKKworLyogcmV2LWNhY2hlLmMgKi8KKworc3RydWN0IHJldl9jYWNoZV9pbmZv IHsKKwkvKiBnZW5lcmF0aW9uIGZsYWdzICovCisJdW5zaWduZWQgb2JqZWN0cyA6 IDEsIAorCQlsZWdzIDogMSwgCisJCW1ha2VfaW5kZXggOiAxOworCQorCS8qIHRy YXZlcnNhbCBmbGFncyAqLworCXVuc2lnbmVkIHNhdmVfdW5pcXVlIDogMSwgCisJ CWFkZF90b19wZW5kaW5nIDogMTsKKwkKKwkvKiBmdXNlIG9wdGlvbnMgKi8KKwl1 bnNpZ25lZCBpbnQgaWdub3JlX3NpemU7Cit9OworCitleHRlcm4gdW5zaWduZWQg Y2hhciAqZ2V0X2NhY2hlX3NsaWNlKHN0cnVjdCBjb21taXQgKmNvbW1pdCk7Citl eHRlcm4gaW50IHRyYXZlcnNlX2NhY2hlX3NsaWNlKHN0cnVjdCByZXZfY2FjaGVf aW5mbyAqcmNpLCB1bnNpZ25lZCBjaGFyICpjYWNoZV9zaGExLCAKKwlzdHJ1Y3Qg cmV2X2luZm8gKnJldnMsIHN0cnVjdCBjb21taXQgKmNvbW1pdCwgCisJdW5zaWdu ZWQgbG9uZyAqZGF0ZV9zb19mYXIsIGludCAqc2xvcF9zb19mYXIsIAorCXN0cnVj dCBjb21taXRfbGlzdCAqKipxdWV1ZSwgc3RydWN0IGNvbW1pdF9saXN0ICoqd29y ayk7CisKK2V4dGVybiB2b2lkIGluaXRfcmNpKHN0cnVjdCByZXZfY2FjaGVfaW5m byAqcmNpKTsKK2V4dGVybiBpbnQgbWFrZV9jYWNoZV9zbGljZShzdHJ1Y3QgcmV2 X2NhY2hlX2luZm8gKnJjaSwgCisJc3RydWN0IHJldl9pbmZvICpyZXZzLCBzdHJ1 Y3QgY29tbWl0X2xpc3QgKiplbmRzLCBzdHJ1Y3QgY29tbWl0X2xpc3QgKipzdGFy dHMsIAorCXVuc2lnbmVkIGNoYXIgKmNhY2hlX3NoYTEpOworZXh0ZXJuIGludCBt YWtlX2NhY2hlX2luZGV4KHN0cnVjdCByZXZfY2FjaGVfaW5mbyAqcmNpLCB1bnNp Z25lZCBjaGFyICpjYWNoZV9zaGExLCAKKwlpbnQgZmQsIHVuc2lnbmVkIGludCBz aXplKTsKKworZXh0ZXJuIHZvaWQgZW5kc19mcm9tX3NsaWNlcyhzdHJ1Y3QgcmV2 X2luZm8gKnJldnMsIHVuc2lnbmVkIGludCBmbGFncyk7CisKICNlbmRpZgpkaWZm IC0tZ2l0IGEvdC90NjAxNS1yZXYtY2FjaGUtbGlzdC5zaCBiL3QvdDYwMTUtcmV2 LWNhY2hlLWxpc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAw MC4uZTYxZWNlNAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMTUtcmV2LWNhY2hl LWxpc3Quc2gKQEAgLTAsMCArMSwxMDAgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rl c2NyaXB0aW9uPSdnaXQgcmV2LWNhY2hlIHRlc3RzJworLiAuL3Rlc3QtbGliLnNo CisKK3NoYTFkaWZmPSJweXRob24gJFRFU1RfRElSRUNUT1JZL3Q2MDE1LXNoYTEt ZHVtcC1kaWZmLnB5IgorCisjIHdlIHdhbnQgYSB0b3RhbGx5IHdhY2tlZCBvdXQg YnJhbmNoIHN0cnVjdHVyZS4uLgorIyB3ZSBuZWVkIGJyYW5jaGluZyBhbmQgbWVy Z2luZyBvZiBzaXplcyB1cCB0aHJvdWdoIDMsIHRyZWUgCisjIGFkZGl0aW9uL2Rl bGV0aW9uLCBhbmQgZW5vdWdoIGJyYW5jaGluZyB0byBleGVyY2lzZSBwYXRoIAor IyByZXVzZQordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5pdCByZXBvJyAnCisJZWNo byBibGEgPmZpbGUgJiYgCisJZ2l0IGFkZCAuICYmIAorCWdpdCBjb21taXQgLW0g ImJsYSIgJiYgCisKKwlnaXQgYnJhbmNoIGIxICYmIAorCWdpdCBjaGVja291dCBi MSAmJiAKKwllY2hvIGJsdSA+ZmlsZTIgJiYgCisJbWtkaXIgZDEgJiYgCisJZWNo byBiYW5nID5kMS9maWxlZDEgJiYgCisJZ2l0IGFkZCAuICYmIAorCWdpdCBjb21t aXQgLW0gImJsdSIgJiYgCisJCisJZ2l0IGNoZWNrb3V0IG1hc3RlciAmJiAKKwln aXQgYnJhbmNoIGIyICYmIAorCWdpdCBjaGVja291dCBiMiAmJiAKKwllY2hvIGth cGxhYSA+PmZpbGUgJiYgCisJZ2l0IGNvbW1pdCAtYSAtbSAia2FwbGFhIiAmJiAK KwkKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmIAorCW1rZGlyIHNtb2tlICYmIAor CWVjaG8gb21nID5zbW9rZS9ib25nICYmIAorCWdpdCBhZGQgLiAmJiAKKwlnaXQg Y29tbWl0IC1tICJvbWciICYmIAorCQorCWdpdCBicmFuY2ggYjQgJiYgCisJZ2l0 IGNoZWNrb3V0IGI0ICYmIAorCWVjaG8gc2hhemFtID5maWxlOCAmJiAKKwlnaXQg YWRkIC4gJiYgCisJZ2l0IGNvbW1pdCAtbSAic2hhemFtIiAmJiAKKwlnaXQgbWVy Z2UgLW0gIm1lcmdlIGIyIiBiMiAmJiAKKwkKKwllY2hvIGJhbSA+c21va2UvcGlw ZSAmJiAKKwlnaXQgYWRkIC4KKwlnaXQgY29tbWl0IC1tICJiYW0iICYmIAorCQor CWdpdCBjaGVja291dCBtYXN0ZXIgJiYgCisJZWNobyBwb3cgPmZpbGU3ICYmIAor CWdpdCBhZGQgLiAmJiAKKwlnaXQgY29tbWl0IC1tICJwb3ciICYmIAorCWdpdCBt ZXJnZSAtbSAibWVyZ2UgYjQiIGI0ICYmIAorCisJZ2l0IGNoZWNrb3V0IGIxICYm IAorCWVjaG8gc3R1ZmYgPmQxL2ZpbGVkMSAmJiAKKwlnaXQgY29tbWl0IC1hIC1t ICJzdHVmZiIgJiYgCisKKwlnaXQgYnJhbmNoIGIxMSAmJiAKKwlnaXQgY2hlY2tv dXQgYjExICYmIAorCWVjaG8gd2F6enVwID5maWxlMyAmJgorCWdpdCBhZGQgZmls ZTMgJiYgCisJZ2l0IGNvbW1pdCAtbSAid2F6enVwIiAmJiAKKworCWdpdCBjaGVj a291dCBiMSAmJiAKKwlta2RpciBkMS9kMiAmJiAKKwllY2hvIGxvbCA+ZDEvZDIv ZmlsZWQyICYmIAorCWdpdCBhZGQgLiAmJiAKKwlnaXQgY29tbWl0IC1tICJsb2wi ICYmIAorCisJZ2l0IGNoZWNrb3V0IG1hc3RlciAmJiAKKwlnaXQgbWVyZ2UgLW0g InRyaXBsZSBtZXJnZSIgYjEgYjExICYmIAorCWdpdCBybSAtciBkMSAmJiAgCisJ Z2l0IGNvbW1pdCAtYSAtbSAib2ggbm9lcyIKKycKKworZ2l0LXJldi1saXN0IEhF QUQgLS1ub3QgSEVBRH4zID5wcm9wZXJfY29tbWl0X2xpc3RfbGltaXRlZAorZ2l0 LXJldi1saXN0IEhFQUQgPnByb3Blcl9jb21taXRfbGlzdAorCit0ZXN0X2V4cGVj dF9zdWNjZXNzICdtYWtlIGNhY2hlIHNsaWNlJyAnCisJZ2l0LXJldi1jYWNoZSBh ZGQgSEVBRCAyPm91dHB1dC5lcnIgJiYgCisJZ3JlcCAiZmluYWwgcmV0dXJuIHZh bHVlOiAwIiBvdXRwdXQuZXJyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Jl bWFrZSBjYWNoZSBzbGljZScgJworCWdpdC1yZXYtY2FjaGUgYWRkIC0tc2l6ZXMg SEVBRCAyPm91dHB1dC5lcnIgJiYgCisJZ3JlcCAiZmluYWwgcmV0dXJuIHZhbHVl OiAwIiBvdXRwdXQuZXJyCisnCisKKyNjaGVjayBjb3JlIG1lY2hhbmljcyBhbmQg cmV2LWxpc3QgaG9vayBmb3IgY29tbWl0cwordGVzdF9leHBlY3Rfc3VjY2VzcyAn dGVzdCByZXYtY2FjaGVzIHdhbGtlciBkaXJlY3RseSAobGltaXRlZCknICcKKwln aXQtcmV2LWNhY2hlIHdhbGsgSEVBRCAtLW5vdCBIRUFEfjMgPmxpc3QgJiYgCisJ dGVzdCAteiBgJHNoYTFkaWZmIGxpc3QgcHJvcGVyX2NvbW1pdF9saXN0X2xpbWl0 ZWRgCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Rlc3QgcmV2LWNhY2hlcyB3 YWxrZXIgZGlyZWN0bHkgKHVubGltaXRlZCknICcKKwlnaXQtcmV2LWNhY2hlIHdh bGsgSEVBRCA+bGlzdCAmJiAKKwl0ZXN0IC16IGAkc2hhMWRpZmYgbGlzdCBwcm9w ZXJfY29tbWl0X2xpc3RgCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90 NjAxNS1zaGExLWR1bXAtZGlmZi5weSBiL3QvdDYwMTUtc2hhMS1kdW1wLWRpZmYu cHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2ZjMzBlNwot LS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMTUtc2hhMS1kdW1wLWRpZmYucHkKQEAg LTAsMCArMSwzNiBAQAorCitpbXBvcnQgc3lzLCByZQorCitpZiBsZW4oc3lzLmFy Z3YpIDwgMyA6IAorCXN5cy5leGl0KDApCisKK2YgPSBvcGVuKHN5cy5hcmd2WzFd LCAncicpCitkaWN0ID0ge30KK2ZvciBsaW5lIGluIGYgOiAKKwlpZiBsZW4obGlu ZSkgPj0gNDAgYW5kIHJlLm1hdGNoKHInXlswLTlhLWZBLUZdezQwfScsIGxpbmVb OjQwXSkgIT0gTm9uZSA6IAorCQlkaWN0W2xpbmVbOjQwXV0gPSAxCisKK2YuY2xv c2UoKQorCitmID0gb3BlbihzeXMuYXJndlsyXSwgJ3InKQorZm9yIGxpbmUgaW4g ZiA6CisJaWYgbGVuKGxpbmUpIDwgNDAgOiAKKwkJY29udGludWUKKwkKKwloYXNo ID0gbGluZVs6NDBdCisJaWYgcmUubWF0Y2gocideWzAtOWEtZkEtRl17NDB9Jywg aGFzaCkgPT0gTm9uZSA6IAorCQljb250aW51ZQorCQorCWlmIGhhc2ggaW4gZGlj dCA6IAorCQlkaWN0W2hhc2hdIC09IDEKKwllbHNlIDogCisJCWRpY3RbaGFzaF0g PSAtMQorCitmLmNsb3NlKCkKKworZm9yIGsgaW4gZGljdC5rZXlzKCkgOiAKKwlp ZiBkaWN0W2tdID09IDAgOiAKKwkJZGVsIGRpY3Rba10KKworaWYgbGVuKGRpY3Qp IDogCisJcHJpbnQgZGljdAotLSAKdGc6ICg2MDY0NzVmLi4pIHQvcmV2Y2FjaGUv YmFzaWMgKGRlcGVuZHMgb246IG1hc3RlcikK ------------3cbU3E1dH9onv4j9AB9JJ8--