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 1pyzaq-0002rP-KI for pgsql-hackers@arkaria.postgresql.org; Tue, 16 May 2023 18:40:17 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1pyzap-0004A3-8X for pgsql-hackers@arkaria.postgresql.org; Tue, 16 May 2023 18:40:15 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1pyzao-00049u-4D for pgsql-hackers@lists.postgresql.org; Tue, 16 May 2023 18:40:14 +0000 Received: from wnew2-smtp.messagingengine.com ([64.147.123.27]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1pyzah-000Bus-TL for pgsql-hackers@postgresql.org; Tue, 16 May 2023 18:40:13 +0000 Received: from compute2.internal (compute2.nyi.internal [10.202.2.46]) by mailnew.west.internal (Postfix) with ESMTP id ECB5D2B06A47; Tue, 16 May 2023 14:40:04 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute2.internal (MEProxy); Tue, 16 May 2023 14:40:05 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:sender:subject :subject:to:to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender :x-sasl-enc; s=fm1; t=1684262404; x=1684269604; bh=t1LWCQYR62cGB Mk0d73VTJcpKP64o5Owa7IU6hNXKVA=; b=nAWKvwK/TLIOfaGuwrXTswHrx+Jtw RlXm9jki8w4dAVOZgkDQLylZQZmBbPu8if2kX55r+46m122NE5tzq2T55RykoDhn pQxFixIxjiBahFqtdrRvK6U1JS521nzazbiN5eB83xaigm4IW2Hr37VVX4WdTeuS rbuT5/VLSQEyugmcGms1dDTg5Ro68WLNDg/l5YXz0hClr1l/qInbf4SYGhiYpG4v iUQHmf7RObVKENEI1StUaC2UOtWXHJYVxVRha7D0dM0YtklLsNeBg8O6PlMnFQlH hjvXjVVpb+8jj+00Bh2OoOttvQnp8zsyFJkpz2180iY+CLL2NDbIR0yQw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvhedrfeehledguddvjecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfgh necuuegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd enucfjughrpegtkfffgggfuffvvehfhfgjsehmtderredtfeejnecuhfhrohhmpefrvght vghrucfgihhsvghnthhrrghuthcuoehpvghtvghrrdgvihhsvghnthhrrghuthesvghnth gvrhhprhhishgvuggsrdgtohhmqeenucggtffrrghtthgvrhhnpeeutdekheeuhedtvdfg ffehleetfefhieefudeitdffiedtledujefhjedufeffffenucevlhhushhtvghrufhiii gvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehpvghtvghrrdgvihhsvghnthhrrghu thesvghnthgvrhhprhhishgvuggsrdgtohhm X-ME-Proxy: Feedback-ID: i131946ab:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Tue, 16 May 2023 14:40:03 -0400 (EDT) Content-Type: multipart/mixed; boundary="------------HYvm3BBfHDVSMJ6vqyqP07Pt" Message-ID: Date: Tue, 16 May 2023 20:40:01 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.10.1 Subject: Re: smgrzeroextend clarification Content-Language: en-US To: Andres Freund Cc: pgsql-hackers References: <22fed8ba-01c3-2008-a256-4ea912d68fab@enterprisedb.com> <20230510181049.ad5vw6kijqd2y274@awork3.anarazel.de> From: Peter Eisentraut In-Reply-To: <20230510181049.ad5vw6kijqd2y274@awork3.anarazel.de> 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. --------------HYvm3BBfHDVSMJ6vqyqP07Pt Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 10.05.23 20:10, Andres Freund wrote: >> So if you want to understand what smgrzeroextend() does, you need to >> mentally combine the documentation of three different functions. Could we >> write documentation for each function that stands on its own? And document >> the function arguments, like what does blocknum and nblocks mean? > I guess it couldn't hurt. But if we go down that route, we basically need to > rewrite all the function headers in smgr.c, I think. I took a stab at this, going through the function comments in smgr.c and md.c and try to make some things easier to follow. - Took at out the weird leading tabs in the older comments. - Rephrased some comments so that smgr.c is more like an API documentation and md.c documents what that particular instance of that API does. - Move the *extend and *zeroextend functions to a more sensible place among all the functions. Especially since *write and *extend are very similar, it makes sense to have them close together. This way, it's also easier to follow "this function is like that function" comments. - Also moved mdwriteback(), which was in some completely odd place. - Added comments for function arguments that were previously not documented. - Reworded the comments for *extend and *zeroextend to make more sense relative to each other. - I left this for smgrzeroextend(): FIXME: why both blocknum and nblocks Like, what happens when blocknum is not the block right after the last existing block? Do you get an implicit POSIX hole between the end of the file and the specified block and then an explicit hole for the next nblocks? We should be clear here what the designer of this API intended. The name smgrzeroextend is not great. The "zero" isn't what distinguishes it from smgrextend. --------------HYvm3BBfHDVSMJ6vqyqP07Pt Content-Type: text/plain; charset=UTF-8; name="0001-WIP-Improve-smgr-source-code-comments.patch" Content-Disposition: attachment; filename="0001-WIP-Improve-smgr-source-code-comments.patch" Content-Transfer-Encoding: base64 RnJvbSBmYWRkNzJhZmNmNzhhNTVhMmNmZDMyMjE3YjMxN2YxN2E5MTQ3OTYyIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBQZXRlciBFaXNlbnRyYXV0IDxwZXRlckBlaXNlbnRy YXV0Lm9yZz4KRGF0ZTogVHVlLCAxNiBNYXkgMjAyMyAxNjoxMDo0OCArMDIwMApTdWJqZWN0 OiBbUEFUQ0hdIFdJUDogSW1wcm92ZSBzbWdyIHNvdXJjZSBjb2RlIGNvbW1lbnRzCgotLS0K IHNyYy9iYWNrZW5kL3N0b3JhZ2Uvc21nci9tZC5jICAgfCA1MDEgKysrKysrKysrKysrKysr Ky0tLS0tLS0tLS0tLS0tLS0KIHNyYy9iYWNrZW5kL3N0b3JhZ2Uvc21nci9zbWdyLmMgfCAy NTEgKysrKysrKystLS0tLS0tLQogc3JjL2luY2x1ZGUvc3RvcmFnZS9tZC5oICAgICAgICB8 ICAgOCArLQogc3JjL2luY2x1ZGUvc3RvcmFnZS9zbWdyLmggICAgICB8ICAgOCArLQogNCBm aWxlcyBjaGFuZ2VkLCAzODIgaW5zZXJ0aW9ucygrKSwgMzg2IGRlbGV0aW9ucygtKQoKZGlm ZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2Uvc21nci9tZC5jIGIvc3JjL2JhY2tlbmQv c3RvcmFnZS9zbWdyL21kLmMKaW5kZXggZTk4MmE4ZGQ3Zi4uNDExNWEyNGIzZiAxMDA2NDQK LS0tIGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9zbWdyL21kLmMKKysrIGIvc3JjL2JhY2tlbmQv c3RvcmFnZS9zbWdyL21kLmMKQEAgLTE1NCw3ICsxNTQsNyBAQCBfbWRmZF9vcGVuX2ZsYWdz KHZvaWQpCiB9CiAKIC8qCi0gKgltZGluaXQoKSAtLSBJbml0aWFsaXplIHByaXZhdGUgc3Rh dGUgZm9yIG1hZ25ldGljIGRpc2sgc3RvcmFnZSBtYW5hZ2VyLgorICogbWRpbml0KCkgLS0g SW5pdGlhbGl6ZSBwcml2YXRlIHN0YXRlIGZvciBtYWduZXRpYyBkaXNrIHN0b3JhZ2UgbWFu YWdlci4KICAqLwogdm9pZAogbWRpbml0KHZvaWQpCkBAIC0xNjUsNyArMTY1LDcgQEAgbWRp bml0KHZvaWQpCiB9CiAKIC8qCi0gKgltZGV4aXN0cygpIC0tIERvZXMgdGhlIHBoeXNpY2Fs IGZpbGUgZXhpc3Q/CisgKiBtZGV4aXN0cygpIC0tIERvZXMgdGhlIHBoeXNpY2FsIGZpbGUg ZXhpc3Q/CiAgKgogICogTm90ZTogdGhpcyB3aWxsIHJldHVybiB0cnVlIGZvciBsaW5nZXJp bmcgZmlsZXMsIHdpdGggcGVuZGluZyBkZWxldGlvbnMKICAqLwpAQCAtMTg0LDcgKzE4NCw3 IEBAIG1kZXhpc3RzKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0pCiB9 CiAKIC8qCi0gKgltZGNyZWF0ZSgpIC0tIENyZWF0ZSBhIG5ldyByZWxhdGlvbiBvbiBtYWdu ZXRpYyBkaXNrLgorICogbWRjcmVhdGUoKSAtLSBDcmVhdGUgYSBuZXcgcmVsYXRpb24gb24g bWFnbmV0aWMgZGlzay4KICAqCiAgKiBJZiBpc1JlZG8gaXMgdHJ1ZSwgaXQncyBva2F5IGZv ciB0aGUgcmVsYXRpb24gdG8gZXhpc3QgYWxyZWFkeS4KICAqLwpAQCAtMjQyLDcgKzI0Miw3 IEBAIG1kY3JlYXRlKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0sIGJv b2wgaXNSZWRvKQogfQogCiAvKgotICoJbWR1bmxpbmsoKSAtLSBVbmxpbmsgYSByZWxhdGlv bi4KKyAqIG1kdW5saW5rKCkgLS0gVW5saW5rIGEgcmVsYXRpb24uCiAgKgogICogTm90ZSB0 aGF0IHdlJ3JlIHBhc3NlZCBhIFJlbEZpbGVMb2NhdG9yQmFja2VuZCAtLS0gYnkgdGhlIHRp bWUgdGhpcyBpcyBjYWxsZWQsCiAgKiB0aGVyZSB3b24ndCBiZSBhbiBTTWdyUmVsYXRpb24g aGFzaHRhYmxlIGVudHJ5IGFueW1vcmUuCkBAIC00NDcsMTgzICs0NDcsNyBAQCBtZHVubGlu a2ZvcmsoUmVsRmlsZUxvY2F0b3JCYWNrZW5kIHJsb2NhdG9yLCBGb3JrTnVtYmVyIGZvcmtu dW0sIGJvb2wgaXNSZWRvKQogfQogCiAvKgotICoJbWRleHRlbmQoKSAtLSBBZGQgYSBibG9j ayB0byB0aGUgc3BlY2lmaWVkIHJlbGF0aW9uLgotICoKLSAqCQlUaGUgc2VtYW50aWNzIGFy ZSBuZWFybHkgdGhlIHNhbWUgYXMgbWR3cml0ZSgpOiB3cml0ZSBhdCB0aGUKLSAqCQlzcGVj aWZpZWQgcG9zaXRpb24uICBIb3dldmVyLCB0aGlzIGlzIHRvIGJlIHVzZWQgZm9yIHRoZSBj YXNlIG9mCi0gKgkJZXh0ZW5kaW5nIGEgcmVsYXRpb24gKGkuZS4sIGJsb2NrbnVtIGlzIGF0 IG9yIGJleW9uZCB0aGUgY3VycmVudAotICoJCUVPRikuICBOb3RlIHRoYXQgd2UgYXNzdW1l IHdyaXRpbmcgYSBibG9jayBiZXlvbmQgY3VycmVudCBFT0YKLSAqCQljYXVzZXMgaW50ZXJ2 ZW5pbmcgZmlsZSBzcGFjZSB0byBiZWNvbWUgZmlsbGVkIHdpdGggemVyb2VzLgotICovCi12 b2lkCi1tZGV4dGVuZChTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtLCBC bG9ja051bWJlciBibG9ja251bSwKLQkJIGNvbnN0IHZvaWQgKmJ1ZmZlciwgYm9vbCBza2lw RnN5bmMpCi17Ci0Jb2ZmX3QJCXNlZWtwb3M7Ci0JaW50CQkJbmJ5dGVzOwotCU1kZmRWZWMg ICAgKnY7Ci0KLQkvKiBJZiB0aGlzIGJ1aWxkIHN1cHBvcnRzIGRpcmVjdCBJL08sIHRoZSBi dWZmZXIgbXVzdCBiZSBJL08gYWxpZ25lZC4gKi8KLQlpZiAoUEdfT19ESVJFQ1QgIT0gMCAm JiBQR19JT19BTElHTl9TSVpFIDw9IEJMQ0tTWikKLQkJQXNzZXJ0KCh1aW50cHRyX3QpIGJ1 ZmZlciA9PSBUWVBFQUxJR04oUEdfSU9fQUxJR05fU0laRSwgYnVmZmVyKSk7Ci0KLQkvKiBU aGlzIGFzc2VydCBpcyB0b28gZXhwZW5zaXZlIHRvIGhhdmUgb24gbm9ybWFsbHkgLi4uICov Ci0jaWZkZWYgQ0hFQ0tfV1JJVEVfVlNfRVhURU5ECi0JQXNzZXJ0KGJsb2NrbnVtID49IG1k bmJsb2NrcyhyZWxuLCBmb3JrbnVtKSk7Ci0jZW5kaWYKLQotCS8qCi0JICogSWYgYSByZWxh dGlvbiBtYW5hZ2VzIHRvIGdyb3cgdG8gMl4zMi0xIGJsb2NrcywgcmVmdXNlIHRvIGV4dGVu ZCBpdCBhbnkKLQkgKiBtb3JlIC0tLSB3ZSBtdXN0bid0IGNyZWF0ZSBhIGJsb2NrIHdob3Nl IG51bWJlciBhY3R1YWxseSBpcwotCSAqIEludmFsaWRCbG9ja051bWJlci4gIChOb3RlIHRo YXQgdGhpcyBmYWlsdXJlIHNob3VsZCBiZSB1bnJlYWNoYWJsZQotCSAqIGJlY2F1c2Ugb2Yg dXBzdHJlYW0gY2hlY2tzIGluIGJ1Zm1nci5jLikKLQkgKi8KLQlpZiAoYmxvY2tudW0gPT0g SW52YWxpZEJsb2NrTnVtYmVyKQotCQllcmVwb3J0KEVSUk9SLAotCQkJCShlcnJjb2RlKEVS UkNPREVfUFJPR1JBTV9MSU1JVF9FWENFRURFRCksCi0JCQkJIGVycm1zZygiY2Fubm90IGV4 dGVuZCBmaWxlIFwiJXNcIiBiZXlvbmQgJXUgYmxvY2tzIiwKLQkJCQkJCXJlbHBhdGgocmVs bi0+c21ncl9ybG9jYXRvciwgZm9ya251bSksCi0JCQkJCQlJbnZhbGlkQmxvY2tOdW1iZXIp KSk7Ci0KLQl2ID0gX21kZmRfZ2V0c2VnKHJlbG4sIGZvcmtudW0sIGJsb2NrbnVtLCBza2lw RnN5bmMsIEVYVEVOU0lPTl9DUkVBVEUpOwotCi0Jc2Vla3BvcyA9IChvZmZfdCkgQkxDS1Na ICogKGJsb2NrbnVtICUgKChCbG9ja051bWJlcikgUkVMU0VHX1NJWkUpKTsKLQotCUFzc2Vy dChzZWVrcG9zIDwgKG9mZl90KSBCTENLU1ogKiBSRUxTRUdfU0laRSk7Ci0KLQlpZiAoKG5i eXRlcyA9IEZpbGVXcml0ZSh2LT5tZGZkX3ZmZCwgYnVmZmVyLCBCTENLU1osIHNlZWtwb3Ms IFdBSVRfRVZFTlRfREFUQV9GSUxFX0VYVEVORCkpICE9IEJMQ0tTWikKLQl7Ci0JCWlmIChu Ynl0ZXMgPCAwKQotCQkJZXJlcG9ydChFUlJPUiwKLQkJCQkJKGVycmNvZGVfZm9yX2ZpbGVf YWNjZXNzKCksCi0JCQkJCSBlcnJtc2coImNvdWxkIG5vdCBleHRlbmQgZmlsZSBcIiVzXCI6 ICVtIiwKLQkJCQkJCQlGaWxlUGF0aE5hbWUodi0+bWRmZF92ZmQpKSwKLQkJCQkJIGVycmhp bnQoIkNoZWNrIGZyZWUgZGlzayBzcGFjZS4iKSkpOwotCQkvKiBzaG9ydCB3cml0ZTogY29t cGxhaW4gYXBwcm9wcmlhdGVseSAqLwotCQllcmVwb3J0KEVSUk9SLAotCQkJCShlcnJjb2Rl KEVSUkNPREVfRElTS19GVUxMKSwKLQkJCQkgZXJybXNnKCJjb3VsZCBub3QgZXh0ZW5kIGZp bGUgXCIlc1wiOiB3cm90ZSBvbmx5ICVkIG9mICVkIGJ5dGVzIGF0IGJsb2NrICV1IiwKLQkJ CQkJCUZpbGVQYXRoTmFtZSh2LT5tZGZkX3ZmZCksCi0JCQkJCQluYnl0ZXMsIEJMQ0tTWiwg YmxvY2tudW0pLAotCQkJCSBlcnJoaW50KCJDaGVjayBmcmVlIGRpc2sgc3BhY2UuIikpKTsK LQl9Ci0KLQlpZiAoIXNraXBGc3luYyAmJiAhU21ncklzVGVtcChyZWxuKSkKLQkJcmVnaXN0 ZXJfZGlydHlfc2VnbWVudChyZWxuLCBmb3JrbnVtLCB2KTsKLQotCUFzc2VydChfbWRuYmxv Y2tzKHJlbG4sIGZvcmtudW0sIHYpIDw9ICgoQmxvY2tOdW1iZXIpIFJFTFNFR19TSVpFKSk7 Ci19Ci0KLS8qCi0gKgltZHplcm9leHRlbmQoKSAtLSBBZGQgbmV3IHplcm9lZCBvdXQgYmxv Y2tzIHRvIHRoZSBzcGVjaWZpZWQgcmVsYXRpb24uCi0gKgotICoJCVNpbWlsYXIgdG8gbWRl eHRlbmQoKSwgZXhjZXB0IHRoZSByZWxhdGlvbiBjYW4gYmUgZXh0ZW5kZWQgYnkgbXVsdGlw bGUKLSAqCQlibG9ja3MgYXQgb25jZSBhbmQgdGhlIGFkZGVkIGJsb2NrcyB3aWxsIGJlIGZp bGxlZCB3aXRoIHplcm9lcy4KLSAqLwotdm9pZAotbWR6ZXJvZXh0ZW5kKFNNZ3JSZWxhdGlv biByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0sCi0JCQkgQmxvY2tOdW1iZXIgYmxvY2tudW0s IGludCBuYmxvY2tzLCBib29sIHNraXBGc3luYykKLXsKLQlNZGZkVmVjICAgICp2OwotCUJs b2NrTnVtYmVyIGN1cmJsb2NrbnVtID0gYmxvY2tudW07Ci0JaW50CQkJcmVtYmxvY2tzID0g bmJsb2NrczsKLQotCUFzc2VydChuYmxvY2tzID4gMCk7Ci0KLQkvKiBUaGlzIGFzc2VydCBp cyB0b28gZXhwZW5zaXZlIHRvIGhhdmUgb24gbm9ybWFsbHkgLi4uICovCi0jaWZkZWYgQ0hF Q0tfV1JJVEVfVlNfRVhURU5ECi0JQXNzZXJ0KGJsb2NrbnVtID49IG1kbmJsb2NrcyhyZWxu LCBmb3JrbnVtKSk7Ci0jZW5kaWYKLQotCS8qCi0JICogSWYgYSByZWxhdGlvbiBtYW5hZ2Vz IHRvIGdyb3cgdG8gMl4zMi0xIGJsb2NrcywgcmVmdXNlIHRvIGV4dGVuZCBpdCBhbnkKLQkg KiBtb3JlIC0tLSB3ZSBtdXN0bid0IGNyZWF0ZSBhIGJsb2NrIHdob3NlIG51bWJlciBhY3R1 YWxseSBpcwotCSAqIEludmFsaWRCbG9ja051bWJlciBvciBsYXJnZXIuCi0JICovCi0JaWYg KCh1aW50NjQpIGJsb2NrbnVtICsgbmJsb2NrcyA+PSAodWludDY0KSBJbnZhbGlkQmxvY2tO dW1iZXIpCi0JCWVyZXBvcnQoRVJST1IsCi0JCQkJKGVycmNvZGUoRVJSQ09ERV9QUk9HUkFN X0xJTUlUX0VYQ0VFREVEKSwKLQkJCQkgZXJybXNnKCJjYW5ub3QgZXh0ZW5kIGZpbGUgXCIl c1wiIGJleW9uZCAldSBibG9ja3MiLAotCQkJCQkJcmVscGF0aChyZWxuLT5zbWdyX3Jsb2Nh dG9yLCBmb3JrbnVtKSwKLQkJCQkJCUludmFsaWRCbG9ja051bWJlcikpKTsKLQotCXdoaWxl IChyZW1ibG9ja3MgPiAwKQotCXsKLQkJQmxvY2tOdW1iZXIJc2Vnc3RhcnRibG9jayA9IGN1 cmJsb2NrbnVtICUgKChCbG9ja051bWJlcikgUkVMU0VHX1NJWkUpOwotCQlvZmZfdAkJc2Vl a3BvcyA9IChvZmZfdCkgQkxDS1NaICogc2Vnc3RhcnRibG9jazsKLQkJaW50CQkJbnVtYmxv Y2tzOwotCi0JCWlmIChzZWdzdGFydGJsb2NrICsgcmVtYmxvY2tzID4gUkVMU0VHX1NJWkUp Ci0JCQludW1ibG9ja3MgPSBSRUxTRUdfU0laRSAtIHNlZ3N0YXJ0YmxvY2s7Ci0JCWVsc2UK LQkJCW51bWJsb2NrcyA9IHJlbWJsb2NrczsKLQotCQl2ID0gX21kZmRfZ2V0c2VnKHJlbG4s IGZvcmtudW0sIGN1cmJsb2NrbnVtLCBza2lwRnN5bmMsIEVYVEVOU0lPTl9DUkVBVEUpOwot Ci0JCUFzc2VydChzZWdzdGFydGJsb2NrIDwgUkVMU0VHX1NJWkUpOwotCQlBc3NlcnQoc2Vn c3RhcnRibG9jayArIG51bWJsb2NrcyA8PSBSRUxTRUdfU0laRSk7Ci0KLQkJLyoKLQkJICog SWYgYXZhaWxhYmxlIGFuZCB1c2VmdWwsIHVzZSBwb3NpeF9mYWxsb2NhdGUoKSAodmlhIEZp bGVBbGxvY2F0ZSgpKQotCQkgKiB0byBleHRlbmQgdGhlIHJlbGF0aW9uLiBUaGF0J3Mgb2Z0 ZW4gbW9yZSBlZmZpY2llbnQgdGhhbiB1c2luZwotCQkgKiB3cml0ZSgpLCBhcyBpdCBjb21t b25seSB3b24ndCBjYXVzZSB0aGUga2VybmVsIHRvIGFsbG9jYXRlIHBhZ2UKLQkJICogY2Fj aGUgc3BhY2UgZm9yIHRoZSBleHRlbmRlZCBwYWdlcy4KLQkJICoKLQkJICogSG93ZXZlciwg d2UgZG9uJ3QgdXNlIEZpbGVBbGxvY2F0ZSgpIGZvciBzbWFsbCBleHRlbnNpb25zLCBhcyBp dAotCQkgKiBkZWZlYXRzIGRlbGF5ZWQgYWxsb2NhdGlvbiBvbiBzb21lIGZpbGVzeXN0ZW1z LiBOb3QgY2xlYXIgd2hlcmUKLQkJICogdGhhdCBkZWNpc2lvbiBzaG91bGQgYmUgbWFkZSB0 aG91Z2g/IEZvciBub3cganVzdCB1c2UgYSBjdXRvZmYgb2YKLQkJICogOCwgYW55dGhpbmcg YmV0d2VlbiA0IGFuZCA4IHdvcmtlZCBPSyBpbiBzb21lIGxvY2FsIHRlc3RpbmcuCi0JCSAq LwotCQlpZiAobnVtYmxvY2tzID4gOCkKLQkJewotCQkJaW50CQkJcmV0OwotCi0JCQlyZXQg PSBGaWxlRmFsbG9jYXRlKHYtPm1kZmRfdmZkLAotCQkJCQkJCQlzZWVrcG9zLCAob2ZmX3Qp IEJMQ0tTWiAqIG51bWJsb2NrcywKLQkJCQkJCQkJV0FJVF9FVkVOVF9EQVRBX0ZJTEVfRVhU RU5EKTsKLQkJCWlmIChyZXQgIT0gMCkKLQkJCXsKLQkJCQllcmVwb3J0KEVSUk9SLAotCQkJ CQkJZXJyY29kZV9mb3JfZmlsZV9hY2Nlc3MoKSwKLQkJCQkJCWVycm1zZygiY291bGQgbm90 IGV4dGVuZCBmaWxlIFwiJXNcIiB3aXRoIEZpbGVGYWxsb2NhdGUoKTogJW0iLAotCQkJCQkJ CSAgIEZpbGVQYXRoTmFtZSh2LT5tZGZkX3ZmZCkpLAotCQkJCQkJZXJyaGludCgiQ2hlY2sg ZnJlZSBkaXNrIHNwYWNlLiIpKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCWludAkJ CXJldDsKLQotCQkJLyoKLQkJCSAqIEV2ZW4gaWYgd2UgZG9uJ3Qgd2FudCB0byB1c2UgZmFs bG9jYXRlLCB3ZSBjYW4gc3RpbGwgZXh0ZW5kIGEKLQkJCSAqIGJpdCBtb3JlIGVmZmljaWVu dGx5IHRoYW4gd3JpdGluZyBlYWNoIDhrQiBibG9jayBpbmRpdmlkdWFsbHkuCi0JCQkgKiBw Z19wd3JpdGVfemVyb3MoKSAodmlhIEZpbGVaZXJvKCkpIHVzZXMKLQkJCSAqIHBnX3B3cml0 ZXZfd2l0aF9yZXRyeSgpIHRvIGF2b2lkIG11bHRpcGxlIHdyaXRlcyBvciBuZWVkaW5nIGEK LQkJCSAqIHplcm9lZCBidWZmZXIgZm9yIHRoZSB3aG9sZSBsZW5ndGggb2YgdGhlIGV4dGVu c2lvbi4KLQkJCSAqLwotCQkJcmV0ID0gRmlsZVplcm8odi0+bWRmZF92ZmQsCi0JCQkJCQkg ICBzZWVrcG9zLCAob2ZmX3QpIEJMQ0tTWiAqIG51bWJsb2NrcywKLQkJCQkJCSAgIFdBSVRf RVZFTlRfREFUQV9GSUxFX0VYVEVORCk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQllcmVwb3J0 KEVSUk9SLAotCQkJCQkJZXJyY29kZV9mb3JfZmlsZV9hY2Nlc3MoKSwKLQkJCQkJCWVycm1z ZygiY291bGQgbm90IGV4dGVuZCBmaWxlIFwiJXNcIjogJW0iLAotCQkJCQkJCSAgIEZpbGVQ YXRoTmFtZSh2LT5tZGZkX3ZmZCkpLAotCQkJCQkJZXJyaGludCgiQ2hlY2sgZnJlZSBkaXNr IHNwYWNlLiIpKTsKLQkJfQotCi0JCWlmICghc2tpcEZzeW5jICYmICFTbWdySXNUZW1wKHJl bG4pKQotCQkJcmVnaXN0ZXJfZGlydHlfc2VnbWVudChyZWxuLCBmb3JrbnVtLCB2KTsKLQot CQlBc3NlcnQoX21kbmJsb2NrcyhyZWxuLCBmb3JrbnVtLCB2KSA8PSAoKEJsb2NrTnVtYmVy KSBSRUxTRUdfU0laRSkpOwotCi0JCXJlbWJsb2NrcyAtPSBudW1ibG9ja3M7Ci0JCWN1cmJs b2NrbnVtICs9IG51bWJsb2NrczsKLQl9Ci19Ci0KLS8qCi0gKgltZG9wZW5mb3JrKCkgLS0g T3BlbiBvbmUgZm9yayBvZiB0aGUgc3BlY2lmaWVkIHJlbGF0aW9uLgorICogbWRvcGVuZm9y aygpIC0tIE9wZW4gb25lIGZvcmsgb2YgdGhlIHNwZWNpZmllZCByZWxhdGlvbi4KICAqCiAg KiBOb3RlIHdlIG9ubHkgb3BlbiB0aGUgZmlyc3Qgc2VnbWVudCwgd2hlbiB0aGVyZSBhcmUg bXVsdGlwbGUgc2VnbWVudHMuCiAgKgpAQCAtNjczLDcgKzQ5Nyw3IEBAIG1kb3BlbmZvcmso U01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSwgaW50IGJlaGF2aW9yKQog fQogCiAvKgotICogIG1kb3BlbigpIC0tIEluaXRpYWxpemUgbmV3bHktb3BlbmVkIHJlbGF0 aW9uLgorICogbWRvcGVuKCkgLS0gSW5pdGlhbGl6ZSBuZXdseS1vcGVuZWQgcmVsYXRpb24u CiAgKi8KIHZvaWQKIG1kb3BlbihTTWdyUmVsYXRpb24gcmVsbikKQEAgLTY4NCw3ICs1MDgs NyBAQCBtZG9wZW4oU01nclJlbGF0aW9uIHJlbG4pCiB9CiAKIC8qCi0gKgltZGNsb3NlKCkg LS0gQ2xvc2UgdGhlIHNwZWNpZmllZCByZWxhdGlvbiwgaWYgaXQgaXNuJ3QgY2xvc2VkIGFs cmVhZHkuCisgKiBtZGNsb3NlKCkgLS0gQ2xvc2UgdGhlIHNwZWNpZmllZCByZWxhdGlvbiwg aWYgaXQgaXNuJ3QgY2xvc2VkIGFscmVhZHkuCiAgKi8KIHZvaWQKIG1kY2xvc2UoU01nclJl bGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSkKQEAgLTcwNyw3ICs1MzEsNyBAQCBt ZGNsb3NlKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0pCiB9CiAKIC8q Ci0gKgltZHByZWZldGNoKCkgLS0gSW5pdGlhdGUgYXN5bmNocm9ub3VzIHJlYWQgb2YgdGhl IHNwZWNpZmllZCBibG9jayBvZiBhIHJlbGF0aW9uCisgKiBtZHByZWZldGNoKCkgLS0gSW5p dGlhdGUgYXN5bmNocm9ub3VzIHJlYWQgb2YgdGhlIHNwZWNpZmllZCBibG9jayBvZiBhIHJl bGF0aW9uCiAgKi8KIGJvb2wKIG1kcHJlZmV0Y2goU01nclJlbGF0aW9uIHJlbG4sIEZvcmtO dW1iZXIgZm9ya251bSwgQmxvY2tOdW1iZXIgYmxvY2tudW0pCkBAIC03MzQsNjQgKzU1OCw3 IEBAIG1kcHJlZmV0Y2goU01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSwg QmxvY2tOdW1iZXIgYmxvY2tudW0pCiB9CiAKIC8qCi0gKiBtZHdyaXRlYmFjaygpIC0tIFRl bGwgdGhlIGtlcm5lbCB0byB3cml0ZSBwYWdlcyBiYWNrIHRvIHN0b3JhZ2UuCi0gKgotICog VGhpcyBhY2NlcHRzIGEgcmFuZ2Ugb2YgYmxvY2tzIGJlY2F1c2UgZmx1c2hpbmcgc2V2ZXJh bCBwYWdlcyBhdCBvbmNlIGlzCi0gKiBjb25zaWRlcmFibHkgbW9yZSBlZmZpY2llbnQgdGhh biBkb2luZyBzbyBpbmRpdmlkdWFsbHkuCi0gKi8KLXZvaWQKLW1kd3JpdGViYWNrKFNNZ3JS ZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0sCi0JCQlCbG9ja051bWJlciBibG9j a251bSwgQmxvY2tOdW1iZXIgbmJsb2NrcykKLXsKLQlBc3NlcnQoKGlvX2RpcmVjdF9mbGFn cyAmIElPX0RJUkVDVF9EQVRBKSA9PSAwKTsKLQotCS8qCi0JICogSXNzdWUgZmx1c2ggcmVx dWVzdHMgaW4gYXMgZmV3IHJlcXVlc3RzIGFzIHBvc3NpYmxlOyBoYXZlIHRvIHNwbGl0IGF0 Ci0JICogc2VnbWVudCBib3VuZGFyaWVzIHRob3VnaCwgc2luY2UgdGhvc2UgYXJlIGFjdHVh bGx5IHNlcGFyYXRlIGZpbGVzLgotCSAqLwotCXdoaWxlIChuYmxvY2tzID4gMCkKLQl7Ci0J CUJsb2NrTnVtYmVyIG5mbHVzaCA9IG5ibG9ja3M7Ci0JCW9mZl90CQlzZWVrcG9zOwotCQlN ZGZkVmVjICAgICp2OwotCQlpbnQJCQlzZWdudW1fc3RhcnQsCi0JCQkJCXNlZ251bV9lbmQ7 Ci0KLQkJdiA9IF9tZGZkX2dldHNlZyhyZWxuLCBmb3JrbnVtLCBibG9ja251bSwgdHJ1ZSAv KiBub3QgdXNlZCAqLyAsCi0JCQkJCQkgRVhURU5TSU9OX0RPTlRfT1BFTik7Ci0KLQkJLyoK LQkJICogV2UgbWlnaHQgYmUgZmx1c2hpbmcgYnVmZmVycyBvZiBhbHJlYWR5IHJlbW92ZWQg cmVsYXRpb25zLCB0aGF0J3MKLQkJICogb2ssIGp1c3QgaWdub3JlIHRoYXQgY2FzZS4gIElm IHRoZSBzZWdtZW50IGZpbGUgd2Fzbid0IG9wZW4gYWxyZWFkeQotCQkgKiAoaWUgZnJvbSBh IHJlY2VudCBtZHdyaXRlKCkpLCB0aGVuIHdlIGRvbid0IHdhbnQgdG8gcmUtb3BlbiBpdCwg dG8KLQkJICogYXZvaWQgYSByYWNlIHdpdGggUFJPQ1NJR05BTF9CQVJSSUVSX1NNR1JSRUxF QVNFIHRoYXQgbWlnaHQgbGVhdmUKLQkJICogdXMgd2l0aCBhIGRlc2NyaXB0b3IgdG8gYSBm aWxlIHRoYXQgaXMgYWJvdXQgdG8gYmUgdW5saW5rZWQuCi0JCSAqLwotCQlpZiAoIXYpCi0J CQlyZXR1cm47Ci0KLQkJLyogY29tcHV0ZSBvZmZzZXQgaW5zaWRlIHRoZSBjdXJyZW50IHNl Z21lbnQgKi8KLQkJc2VnbnVtX3N0YXJ0ID0gYmxvY2tudW0gLyBSRUxTRUdfU0laRTsKLQot CQkvKiBjb21wdXRlIG51bWJlciBvZiBkZXNpcmVkIHdyaXRlcyB3aXRoaW4gdGhlIGN1cnJl bnQgc2VnbWVudCAqLwotCQlzZWdudW1fZW5kID0gKGJsb2NrbnVtICsgbmJsb2NrcyAtIDEp IC8gUkVMU0VHX1NJWkU7Ci0JCWlmIChzZWdudW1fc3RhcnQgIT0gc2VnbnVtX2VuZCkKLQkJ CW5mbHVzaCA9IFJFTFNFR19TSVpFIC0gKGJsb2NrbnVtICUgKChCbG9ja051bWJlcikgUkVM U0VHX1NJWkUpKTsKLQotCQlBc3NlcnQobmZsdXNoID49IDEpOwotCQlBc3NlcnQobmZsdXNo IDw9IG5ibG9ja3MpOwotCi0JCXNlZWtwb3MgPSAob2ZmX3QpIEJMQ0tTWiAqIChibG9ja251 bSAlICgoQmxvY2tOdW1iZXIpIFJFTFNFR19TSVpFKSk7Ci0KLQkJRmlsZVdyaXRlYmFjayh2 LT5tZGZkX3ZmZCwgc2Vla3BvcywgKG9mZl90KSBCTENLU1ogKiBuZmx1c2gsIFdBSVRfRVZF TlRfREFUQV9GSUxFX0ZMVVNIKTsKLQotCQluYmxvY2tzIC09IG5mbHVzaDsKLQkJYmxvY2tu dW0gKz0gbmZsdXNoOwotCX0KLX0KLQotLyoKLSAqCW1kcmVhZCgpIC0tIFJlYWQgdGhlIHNw ZWNpZmllZCBibG9jayBmcm9tIGEgcmVsYXRpb24uCisgKiBtZHJlYWQoKSAtLSBSZWFkIHRo ZSBzcGVjaWZpZWQgYmxvY2sgZnJvbSBhIHJlbGF0aW9uLgogICovCiB2b2lkCiBtZHJlYWQo U01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSwgQmxvY2tOdW1iZXIgYmxv Y2tudW0sCkBAIC04NTYsMTEgKzYyMyw3IEBAIG1kcmVhZChTTWdyUmVsYXRpb24gcmVsbiwg Rm9ya051bWJlciBmb3JrbnVtLCBCbG9ja051bWJlciBibG9ja251bSwKIH0KIAogLyoKLSAq CW1kd3JpdGUoKSAtLSBXcml0ZSB0aGUgc3VwcGxpZWQgYmxvY2sgYXQgdGhlIGFwcHJvcHJp YXRlIGxvY2F0aW9uLgotICoKLSAqCQlUaGlzIGlzIHRvIGJlIHVzZWQgb25seSBmb3IgdXBk YXRpbmcgYWxyZWFkeS1leGlzdGluZyBibG9ja3Mgb2YgYQotICoJCXJlbGF0aW9uIChpZSwg dGhvc2UgYmVmb3JlIHRoZSBjdXJyZW50IEVPRikuICBUbyBleHRlbmQgYSByZWxhdGlvbiwK LSAqCQl1c2UgbWRleHRlbmQoKS4KKyAqIG1kd3JpdGUoKSAtLSBXcml0ZSB0aGUgc3VwcGxp ZWQgYmxvY2sgYXQgdGhlIGFwcHJvcHJpYXRlIGxvY2F0aW9uLgogICovCiB2b2lkCiBtZHdy aXRlKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0sIEJsb2NrTnVtYmVy IGJsb2NrbnVtLApAQCAtOTI0LDEyICs2ODcsMjQyIEBAIG1kd3JpdGUoU01nclJlbGF0aW9u IHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSwgQmxvY2tOdW1iZXIgYmxvY2tudW0sCiB9CiAK IC8qCi0gKgltZG5ibG9ja3MoKSAtLSBHZXQgdGhlIG51bWJlciBvZiBibG9ja3Mgc3RvcmVk IGluIGEgcmVsYXRpb24uCisgKiBtZGV4dGVuZCgpIC0tIEFkZCBhIGJsb2NrIHRvIHRoZSBz cGVjaWZpZWQgcmVsYXRpb24uCisgKgorICogVGhpcyBpcyB0byBiZSB1c2VkIGZvciB0aGUg Y2FzZSBvZiBleHRlbmRpbmcgYSByZWxhdGlvbiAoaS5lLiwgYmxvY2tudW0gaXMKKyAqIGF0 IG9yIGJleW9uZCB0aGUgY3VycmVudCBFT0YpLiAgTm90ZSB0aGF0IHdyaXRpbmcgYSBibG9j ayBiZXlvbmQgY3VycmVudAorICogRU9GIG11c3QgY2F1c2UgdGhlIGludGVydmVuaW5nIGZp bGUgc3BhY2UgdG8gYmVjb21lIGZpbGxlZCB3aXRoIHplcm9lcy4KKyAqIFRoZSBQT1NJWCBm aWxlIHN5c3RlbSBBUElzIGRvIHRoYXQgYXV0b21hdGljYWxseSwgc28gd2UgZG9uJ3QgbmVl ZCB0byBkbworICogYW55dGhpbmcgYWJvdXQgdGhhdC4KKyAqLwordm9pZAorbWRleHRlbmQo U01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSwgQmxvY2tOdW1iZXIgYmxv Y2tudW0sCisJCSBjb25zdCB2b2lkICpidWZmZXIsIGJvb2wgc2tpcEZzeW5jKQoreworCW9m Zl90CQlzZWVrcG9zOworCWludAkJCW5ieXRlczsKKwlNZGZkVmVjICAgICp2OworCisJLyog SWYgdGhpcyBidWlsZCBzdXBwb3J0cyBkaXJlY3QgSS9PLCB0aGUgYnVmZmVyIG11c3QgYmUg SS9PIGFsaWduZWQuICovCisJaWYgKFBHX09fRElSRUNUICE9IDAgJiYgUEdfSU9fQUxJR05f U0laRSA8PSBCTENLU1opCisJCUFzc2VydCgodWludHB0cl90KSBidWZmZXIgPT0gVFlQRUFM SUdOKFBHX0lPX0FMSUdOX1NJWkUsIGJ1ZmZlcikpOworCisJLyogVGhpcyBhc3NlcnQgaXMg dG9vIGV4cGVuc2l2ZSB0byBoYXZlIG9uIG5vcm1hbGx5IC4uLiAqLworI2lmZGVmIENIRUNL X1dSSVRFX1ZTX0VYVEVORAorCUFzc2VydChibG9ja251bSA+PSBtZG5ibG9ja3MocmVsbiwg Zm9ya251bSkpOworI2VuZGlmCisKKwkvKgorCSAqIElmIGEgcmVsYXRpb24gbWFuYWdlcyB0 byBncm93IHRvIDJeMzItMSBibG9ja3MsIHJlZnVzZSB0byBleHRlbmQgaXQgYW55CisJICog bW9yZSAtLS0gd2UgbXVzdG4ndCBjcmVhdGUgYSBibG9jayB3aG9zZSBudW1iZXIgYWN0dWFs bHkgaXMKKwkgKiBJbnZhbGlkQmxvY2tOdW1iZXIuICAoTm90ZSB0aGF0IHRoaXMgZmFpbHVy ZSBzaG91bGQgYmUgdW5yZWFjaGFibGUKKwkgKiBiZWNhdXNlIG9mIHVwc3RyZWFtIGNoZWNr cyBpbiBidWZtZ3IuYy4pCisJICovCisJaWYgKGJsb2NrbnVtID09IEludmFsaWRCbG9ja051 bWJlcikKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX1BST0dSQU1f TElNSVRfRVhDRUVERUQpLAorCQkJCSBlcnJtc2coImNhbm5vdCBleHRlbmQgZmlsZSBcIiVz XCIgYmV5b25kICV1IGJsb2NrcyIsCisJCQkJCQlyZWxwYXRoKHJlbG4tPnNtZ3JfcmxvY2F0 b3IsIGZvcmtudW0pLAorCQkJCQkJSW52YWxpZEJsb2NrTnVtYmVyKSkpOworCisJdiA9IF9t ZGZkX2dldHNlZyhyZWxuLCBmb3JrbnVtLCBibG9ja251bSwgc2tpcEZzeW5jLCBFWFRFTlNJ T05fQ1JFQVRFKTsKKworCXNlZWtwb3MgPSAob2ZmX3QpIEJMQ0tTWiAqIChibG9ja251bSAl ICgoQmxvY2tOdW1iZXIpIFJFTFNFR19TSVpFKSk7CisKKwlBc3NlcnQoc2Vla3BvcyA8IChv ZmZfdCkgQkxDS1NaICogUkVMU0VHX1NJWkUpOworCisJaWYgKChuYnl0ZXMgPSBGaWxlV3Jp dGUodi0+bWRmZF92ZmQsIGJ1ZmZlciwgQkxDS1NaLCBzZWVrcG9zLCBXQUlUX0VWRU5UX0RB VEFfRklMRV9FWFRFTkQpKSAhPSBCTENLU1opCisJeworCQlpZiAobmJ5dGVzIDwgMCkKKwkJ CWVyZXBvcnQoRVJST1IsCisJCQkJCShlcnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLAorCQkJ CQkgZXJybXNnKCJjb3VsZCBub3QgZXh0ZW5kIGZpbGUgXCIlc1wiOiAlbSIsCisJCQkJCQkJ RmlsZVBhdGhOYW1lKHYtPm1kZmRfdmZkKSksCisJCQkJCSBlcnJoaW50KCJDaGVjayBmcmVl IGRpc2sgc3BhY2UuIikpKTsKKwkJLyogc2hvcnQgd3JpdGU6IGNvbXBsYWluIGFwcHJvcHJp YXRlbHkgKi8KKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX0RJU0tf RlVMTCksCisJCQkJIGVycm1zZygiY291bGQgbm90IGV4dGVuZCBmaWxlIFwiJXNcIjogd3Jv dGUgb25seSAlZCBvZiAlZCBieXRlcyBhdCBibG9jayAldSIsCisJCQkJCQlGaWxlUGF0aE5h bWUodi0+bWRmZF92ZmQpLAorCQkJCQkJbmJ5dGVzLCBCTENLU1osIGJsb2NrbnVtKSwKKwkJ CQkgZXJyaGludCgiQ2hlY2sgZnJlZSBkaXNrIHNwYWNlLiIpKSk7CisJfQorCisJaWYgKCFz a2lwRnN5bmMgJiYgIVNtZ3JJc1RlbXAocmVsbikpCisJCXJlZ2lzdGVyX2RpcnR5X3NlZ21l bnQocmVsbiwgZm9ya251bSwgdik7CisKKwlBc3NlcnQoX21kbmJsb2NrcyhyZWxuLCBmb3Jr bnVtLCB2KSA8PSAoKEJsb2NrTnVtYmVyKSBSRUxTRUdfU0laRSkpOworfQorCisvKgorICog bWR6ZXJvZXh0ZW5kKCkgLS0gQWRkIG5ldyB6ZXJvZWQgb3V0IGJsb2NrcyB0byB0aGUgc3Bl Y2lmaWVkIHJlbGF0aW9uLgorICovCit2b2lkCittZHplcm9leHRlbmQoU01nclJlbGF0aW9u IHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSwKKwkJCSBCbG9ja051bWJlciBibG9ja251bSwg aW50IG5ibG9ja3MsIGJvb2wgc2tpcEZzeW5jKQoreworCU1kZmRWZWMgICAgKnY7CisJQmxv Y2tOdW1iZXIgY3VyYmxvY2tudW0gPSBibG9ja251bTsKKwlpbnQJCQlyZW1ibG9ja3MgPSBu YmxvY2tzOworCisJQXNzZXJ0KG5ibG9ja3MgPiAwKTsKKworCS8qIFRoaXMgYXNzZXJ0IGlz IHRvbyBleHBlbnNpdmUgdG8gaGF2ZSBvbiBub3JtYWxseSAuLi4gKi8KKyNpZmRlZiBDSEVD S19XUklURV9WU19FWFRFTkQKKwlBc3NlcnQoYmxvY2tudW0gPj0gbWRuYmxvY2tzKHJlbG4s IGZvcmtudW0pKTsKKyNlbmRpZgorCisJLyoKKwkgKiBJZiBhIHJlbGF0aW9uIG1hbmFnZXMg dG8gZ3JvdyB0byAyXjMyLTEgYmxvY2tzLCByZWZ1c2UgdG8gZXh0ZW5kIGl0IGFueQorCSAq IG1vcmUgLS0tIHdlIG11c3RuJ3QgY3JlYXRlIGEgYmxvY2sgd2hvc2UgbnVtYmVyIGFjdHVh bGx5IGlzCisJICogSW52YWxpZEJsb2NrTnVtYmVyIG9yIGxhcmdlci4KKwkgKi8KKwlpZiAo KHVpbnQ2NCkgYmxvY2tudW0gKyBuYmxvY2tzID49ICh1aW50NjQpIEludmFsaWRCbG9ja051 bWJlcikKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX1BST0dSQU1f TElNSVRfRVhDRUVERUQpLAorCQkJCSBlcnJtc2coImNhbm5vdCBleHRlbmQgZmlsZSBcIiVz XCIgYmV5b25kICV1IGJsb2NrcyIsCisJCQkJCQlyZWxwYXRoKHJlbG4tPnNtZ3JfcmxvY2F0 b3IsIGZvcmtudW0pLAorCQkJCQkJSW52YWxpZEJsb2NrTnVtYmVyKSkpOworCisJd2hpbGUg KHJlbWJsb2NrcyA+IDApCisJeworCQlCbG9ja051bWJlcglzZWdzdGFydGJsb2NrID0gY3Vy YmxvY2tudW0gJSAoKEJsb2NrTnVtYmVyKSBSRUxTRUdfU0laRSk7CisJCW9mZl90CQlzZWVr cG9zID0gKG9mZl90KSBCTENLU1ogKiBzZWdzdGFydGJsb2NrOworCQlpbnQJCQludW1ibG9j a3M7CisKKwkJaWYgKHNlZ3N0YXJ0YmxvY2sgKyByZW1ibG9ja3MgPiBSRUxTRUdfU0laRSkK KwkJCW51bWJsb2NrcyA9IFJFTFNFR19TSVpFIC0gc2Vnc3RhcnRibG9jazsKKwkJZWxzZQor CQkJbnVtYmxvY2tzID0gcmVtYmxvY2tzOworCisJCXYgPSBfbWRmZF9nZXRzZWcocmVsbiwg Zm9ya251bSwgY3VyYmxvY2tudW0sIHNraXBGc3luYywgRVhURU5TSU9OX0NSRUFURSk7CisK KwkJQXNzZXJ0KHNlZ3N0YXJ0YmxvY2sgPCBSRUxTRUdfU0laRSk7CisJCUFzc2VydChzZWdz dGFydGJsb2NrICsgbnVtYmxvY2tzIDw9IFJFTFNFR19TSVpFKTsKKworCQkvKgorCQkgKiBJ ZiBhdmFpbGFibGUgYW5kIHVzZWZ1bCwgdXNlIHBvc2l4X2ZhbGxvY2F0ZSgpICh2aWEgRmls ZUFsbG9jYXRlKCkpCisJCSAqIHRvIGV4dGVuZCB0aGUgcmVsYXRpb24uIFRoYXQncyBvZnRl biBtb3JlIGVmZmljaWVudCB0aGFuIHVzaW5nCisJCSAqIHdyaXRlKCksIGFzIGl0IGNvbW1v bmx5IHdvbid0IGNhdXNlIHRoZSBrZXJuZWwgdG8gYWxsb2NhdGUgcGFnZQorCQkgKiBjYWNo ZSBzcGFjZSBmb3IgdGhlIGV4dGVuZGVkIHBhZ2VzLgorCQkgKgorCQkgKiBIb3dldmVyLCB3 ZSBkb24ndCB1c2UgRmlsZUFsbG9jYXRlKCkgZm9yIHNtYWxsIGV4dGVuc2lvbnMsIGFzIGl0 CisJCSAqIGRlZmVhdHMgZGVsYXllZCBhbGxvY2F0aW9uIG9uIHNvbWUgZmlsZXN5c3RlbXMu IE5vdCBjbGVhciB3aGVyZQorCQkgKiB0aGF0IGRlY2lzaW9uIHNob3VsZCBiZSBtYWRlIHRo b3VnaD8gRm9yIG5vdyBqdXN0IHVzZSBhIGN1dG9mZiBvZgorCQkgKiA4LCBhbnl0aGluZyBi ZXR3ZWVuIDQgYW5kIDggd29ya2VkIE9LIGluIHNvbWUgbG9jYWwgdGVzdGluZy4KKwkJICov CisJCWlmIChudW1ibG9ja3MgPiA4KQorCQl7CisJCQlpbnQJCQlyZXQ7CisKKwkJCXJldCA9 IEZpbGVGYWxsb2NhdGUodi0+bWRmZF92ZmQsCisJCQkJCQkJCXNlZWtwb3MsIChvZmZfdCkg QkxDS1NaICogbnVtYmxvY2tzLAorCQkJCQkJCQlXQUlUX0VWRU5UX0RBVEFfRklMRV9FWFRF TkQpOworCQkJaWYgKHJldCAhPSAwKQorCQkJeworCQkJCWVyZXBvcnQoRVJST1IsCisJCQkJ CQllcnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLAorCQkJCQkJZXJybXNnKCJjb3VsZCBub3Qg ZXh0ZW5kIGZpbGUgXCIlc1wiIHdpdGggRmlsZUZhbGxvY2F0ZSgpOiAlbSIsCisJCQkJCQkJ ICAgRmlsZVBhdGhOYW1lKHYtPm1kZmRfdmZkKSksCisJCQkJCQllcnJoaW50KCJDaGVjayBm cmVlIGRpc2sgc3BhY2UuIikpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaW50CQkJ cmV0OworCisJCQkvKgorCQkJICogRXZlbiBpZiB3ZSBkb24ndCB3YW50IHRvIHVzZSBmYWxs b2NhdGUsIHdlIGNhbiBzdGlsbCBleHRlbmQgYQorCQkJICogYml0IG1vcmUgZWZmaWNpZW50 bHkgdGhhbiB3cml0aW5nIGVhY2ggOGtCIGJsb2NrIGluZGl2aWR1YWxseS4KKwkJCSAqIHBn X3B3cml0ZV96ZXJvcygpICh2aWEgRmlsZVplcm8oKSkgdXNlcworCQkJICogcGdfcHdyaXRl dl93aXRoX3JldHJ5KCkgdG8gYXZvaWQgbXVsdGlwbGUgd3JpdGVzIG9yIG5lZWRpbmcgYQor CQkJICogemVyb2VkIGJ1ZmZlciBmb3IgdGhlIHdob2xlIGxlbmd0aCBvZiB0aGUgZXh0ZW5z aW9uLgorCQkJICovCisJCQlyZXQgPSBGaWxlWmVybyh2LT5tZGZkX3ZmZCwKKwkJCQkJCSAg IHNlZWtwb3MsIChvZmZfdCkgQkxDS1NaICogbnVtYmxvY2tzLAorCQkJCQkJICAgV0FJVF9F VkVOVF9EQVRBX0ZJTEVfRVhURU5EKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWVyZXBvcnQo RVJST1IsCisJCQkJCQllcnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLAorCQkJCQkJZXJybXNn KCJjb3VsZCBub3QgZXh0ZW5kIGZpbGUgXCIlc1wiOiAlbSIsCisJCQkJCQkJICAgRmlsZVBh dGhOYW1lKHYtPm1kZmRfdmZkKSksCisJCQkJCQllcnJoaW50KCJDaGVjayBmcmVlIGRpc2sg c3BhY2UuIikpOworCQl9CisKKwkJaWYgKCFza2lwRnN5bmMgJiYgIVNtZ3JJc1RlbXAocmVs bikpCisJCQlyZWdpc3Rlcl9kaXJ0eV9zZWdtZW50KHJlbG4sIGZvcmtudW0sIHYpOworCisJ CUFzc2VydChfbWRuYmxvY2tzKHJlbG4sIGZvcmtudW0sIHYpIDw9ICgoQmxvY2tOdW1iZXIp IFJFTFNFR19TSVpFKSk7CisKKwkJcmVtYmxvY2tzIC09IG51bWJsb2NrczsKKwkJY3VyYmxv Y2tudW0gKz0gbnVtYmxvY2tzOworCX0KK30KKworLyoKKyAqIG1kd3JpdGViYWNrKCkgLS0g VGVsbCB0aGUga2VybmVsIHRvIHdyaXRlIHBhZ2VzIGJhY2sgdG8gc3RvcmFnZS4KKyAqCisg KiBUaGlzIGFjY2VwdHMgYSByYW5nZSBvZiBibG9ja3MgYmVjYXVzZSBmbHVzaGluZyBzZXZl cmFsIHBhZ2VzIGF0IG9uY2UgaXMKKyAqIGNvbnNpZGVyYWJseSBtb3JlIGVmZmljaWVudCB0 aGFuIGRvaW5nIHNvIGluZGl2aWR1YWxseS4KKyAqLwordm9pZAorbWR3cml0ZWJhY2soU01n clJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSwKKwkJCUJsb2NrTnVtYmVyIGJs b2NrbnVtLCBCbG9ja051bWJlciBuYmxvY2tzKQoreworCUFzc2VydCgoaW9fZGlyZWN0X2Zs YWdzICYgSU9fRElSRUNUX0RBVEEpID09IDApOworCisJLyoKKwkgKiBJc3N1ZSBmbHVzaCBy ZXF1ZXN0cyBpbiBhcyBmZXcgcmVxdWVzdHMgYXMgcG9zc2libGU7IGhhdmUgdG8gc3BsaXQg YXQKKwkgKiBzZWdtZW50IGJvdW5kYXJpZXMgdGhvdWdoLCBzaW5jZSB0aG9zZSBhcmUgYWN0 dWFsbHkgc2VwYXJhdGUgZmlsZXMuCisJICovCisJd2hpbGUgKG5ibG9ja3MgPiAwKQorCXsK KwkJQmxvY2tOdW1iZXIgbmZsdXNoID0gbmJsb2NrczsKKwkJb2ZmX3QJCXNlZWtwb3M7CisJ CU1kZmRWZWMgICAgKnY7CisJCWludAkJCXNlZ251bV9zdGFydCwKKwkJCQkJc2VnbnVtX2Vu ZDsKKworCQl2ID0gX21kZmRfZ2V0c2VnKHJlbG4sIGZvcmtudW0sIGJsb2NrbnVtLCB0cnVl IC8qIG5vdCB1c2VkICovICwKKwkJCQkJCSBFWFRFTlNJT05fRE9OVF9PUEVOKTsKKworCQkv KgorCQkgKiBXZSBtaWdodCBiZSBmbHVzaGluZyBidWZmZXJzIG9mIGFscmVhZHkgcmVtb3Zl ZCByZWxhdGlvbnMsIHRoYXQncworCQkgKiBvaywganVzdCBpZ25vcmUgdGhhdCBjYXNlLiAg SWYgdGhlIHNlZ21lbnQgZmlsZSB3YXNuJ3Qgb3BlbiBhbHJlYWR5CisJCSAqIChpZSBmcm9t IGEgcmVjZW50IG1kd3JpdGUoKSksIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byByZS1vcGVuIGl0 LCB0bworCQkgKiBhdm9pZCBhIHJhY2Ugd2l0aCBQUk9DU0lHTkFMX0JBUlJJRVJfU01HUlJF TEVBU0UgdGhhdCBtaWdodCBsZWF2ZQorCQkgKiB1cyB3aXRoIGEgZGVzY3JpcHRvciB0byBh IGZpbGUgdGhhdCBpcyBhYm91dCB0byBiZSB1bmxpbmtlZC4KKwkJICovCisJCWlmICghdikK KwkJCXJldHVybjsKKworCQkvKiBjb21wdXRlIG9mZnNldCBpbnNpZGUgdGhlIGN1cnJlbnQg c2VnbWVudCAqLworCQlzZWdudW1fc3RhcnQgPSBibG9ja251bSAvIFJFTFNFR19TSVpFOwor CisJCS8qIGNvbXB1dGUgbnVtYmVyIG9mIGRlc2lyZWQgd3JpdGVzIHdpdGhpbiB0aGUgY3Vy cmVudCBzZWdtZW50ICovCisJCXNlZ251bV9lbmQgPSAoYmxvY2tudW0gKyBuYmxvY2tzIC0g MSkgLyBSRUxTRUdfU0laRTsKKwkJaWYgKHNlZ251bV9zdGFydCAhPSBzZWdudW1fZW5kKQor CQkJbmZsdXNoID0gUkVMU0VHX1NJWkUgLSAoYmxvY2tudW0gJSAoKEJsb2NrTnVtYmVyKSBS RUxTRUdfU0laRSkpOworCisJCUFzc2VydChuZmx1c2ggPj0gMSk7CisJCUFzc2VydChuZmx1 c2ggPD0gbmJsb2Nrcyk7CisKKwkJc2Vla3BvcyA9IChvZmZfdCkgQkxDS1NaICogKGJsb2Nr bnVtICUgKChCbG9ja051bWJlcikgUkVMU0VHX1NJWkUpKTsKKworCQlGaWxlV3JpdGViYWNr KHYtPm1kZmRfdmZkLCBzZWVrcG9zLCAob2ZmX3QpIEJMQ0tTWiAqIG5mbHVzaCwgV0FJVF9F VkVOVF9EQVRBX0ZJTEVfRkxVU0gpOworCisJCW5ibG9ja3MgLT0gbmZsdXNoOworCQlibG9j a251bSArPSBuZmx1c2g7CisJfQorfQorCisvKgorICogbWRuYmxvY2tzKCkgLS0gR2V0IHRo ZSBudW1iZXIgb2YgYmxvY2tzIHN0b3JlZCBpbiBhIHJlbGF0aW9uLgogICoKLSAqCQlJbXBv cnRhbnQgc2lkZSBlZmZlY3Q6IGFsbCBhY3RpdmUgc2VnbWVudHMgb2YgdGhlIHJlbGF0aW9u IGFyZSBvcGVuZWQKLSAqCQlhbmQgYWRkZWQgdG8gdGhlIG1kX3NlZ19mZHMgYXJyYXkuICBJ ZiB0aGlzIHJvdXRpbmUgaGFzIG5vdCBiZWVuCi0gKgkJY2FsbGVkLCB0aGVuIG9ubHkgc2Vn bWVudHMgdXAgdG8gdGhlIGxhc3Qgb25lIGFjdHVhbGx5IHRvdWNoZWQKLSAqCQlhcmUgcHJl c2VudCBpbiB0aGUgYXJyYXkuCisgKiBJbXBvcnRhbnQgc2lkZSBlZmZlY3Q6IGFsbCBhY3Rp dmUgc2VnbWVudHMgb2YgdGhlIHJlbGF0aW9uIGFyZSBvcGVuZWQKKyAqIGFuZCBhZGRlZCB0 byB0aGUgbWRfc2VnX2ZkcyBhcnJheS4gIElmIHRoaXMgcm91dGluZSBoYXMgbm90IGJlZW4K KyAqIGNhbGxlZCwgdGhlbiBvbmx5IHNlZ21lbnRzIHVwIHRvIHRoZSBsYXN0IG9uZSBhY3R1 YWxseSB0b3VjaGVkCisgKiBhcmUgcHJlc2VudCBpbiB0aGUgYXJyYXkuCiAgKi8KIEJsb2Nr TnVtYmVyCiBtZG5ibG9ja3MoU01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251 bSkKQEAgLTk4Niw3ICs5NzksNyBAQCBtZG5ibG9ja3MoU01nclJlbGF0aW9uIHJlbG4sIEZv cmtOdW1iZXIgZm9ya251bSkKIH0KIAogLyoKLSAqCW1kdHJ1bmNhdGUoKSAtLSBUcnVuY2F0 ZSByZWxhdGlvbiB0byBzcGVjaWZpZWQgbnVtYmVyIG9mIGJsb2Nrcy4KKyAqIG1kdHJ1bmNh dGUoKSAtLSBUcnVuY2F0ZSByZWxhdGlvbiB0byBzcGVjaWZpZWQgbnVtYmVyIG9mIGJsb2Nr cy4KICAqLwogdm9pZAogbWR0cnVuY2F0ZShTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJl ciBmb3JrbnVtLCBCbG9ja051bWJlciBuYmxvY2tzKQpAQCAtMTA4MCw3ICsxMDczLDcgQEAg bWR0cnVuY2F0ZShTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtLCBCbG9j a051bWJlciBuYmxvY2tzKQogfQogCiAvKgotICoJbWRpbW1lZHN5bmMoKSAtLSBJbW1lZGlh dGVseSBzeW5jIGEgcmVsYXRpb24gdG8gc3RhYmxlIHN0b3JhZ2UuCisgKiBtZGltbWVkc3lu YygpIC0tIEltbWVkaWF0ZWx5IHN5bmMgYSByZWxhdGlvbiB0byBzdGFibGUgc3RvcmFnZS4K ICAqCiAgKiBOb3RlIHRoYXQgb25seSB3cml0ZXMgYWxyZWFkeSBpc3N1ZWQgYXJlIHN5bmNl ZDsgdGhpcyByb3V0aW5lIGtub3dzCiAgKiBub3RoaW5nIG9mIGRpcnR5IGJ1ZmZlcnMgdGhh dCBtYXkgZXhpc3QgaW5zaWRlIHRoZSBidWZmZXIgbWFuYWdlci4gIFdlCmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC9zdG9yYWdlL3NtZ3Ivc21nci5jIGIvc3JjL2JhY2tlbmQvc3RvcmFn ZS9zbWdyL3NtZ3IuYwppbmRleCA3MGQwZDU3MGIxLi5kOTgzYTMwNDc1IDEwMDY0NAotLS0g YS9zcmMvYmFja2VuZC9zdG9yYWdlL3NtZ3Ivc21nci5jCisrKyBiL3NyYy9iYWNrZW5kL3N0 b3JhZ2Uvc21nci9zbWdyLmMKQEAgLTMwLDcgKzMwLDkgQEAKIAogLyoKICAqIFRoaXMgc3Ry dWN0IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIGRlZmluZXMgdGhlIEFQSSBiZXR3ZWVuIHNtZ3Iu YyBhbmQKLSAqIGFueSBpbmRpdmlkdWFsIHN0b3JhZ2UgbWFuYWdlciBtb2R1bGUuICBOb3Rl IHRoYXQgc21nciBzdWJmdW5jdGlvbnMgYXJlCisgKiBhbnkgaW5kaXZpZHVhbCBzdG9yYWdl IG1hbmFnZXIgbW9kdWxlLgorICoKKyAqIE5vdGUgdGhhdCBzbWdyIHN1YmZ1bmN0aW9ucyBh cmUKICAqIGdlbmVyYWxseSBleHBlY3RlZCB0byByZXBvcnQgcHJvYmxlbXMgdmlhIGVsb2co RVJST1IpLiAgQW4gZXhjZXB0aW9uIGlzCiAgKiB0aGF0IHNtZ3JfdW5saW5rIHNob3VsZCB1 c2UgZWxvZyhXQVJOSU5HKSwgcmF0aGVyIHRoYW4gZXJyb3Jpbmcgb3V0LAogICogYmVjYXVz ZSB3ZSBub3JtYWxseSB1bmxpbmsgcmVsYXRpb25zIGR1cmluZyBwb3N0LWNvbW1pdC9hYm9y dCBjbGVhbnVwLApAQCAtNDksMTYgKzUxLDE2IEBAIHR5cGVkZWYgc3RydWN0IGZfc21ncgog CWJvb2wJCSgqc21ncl9leGlzdHMpIChTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBm b3JrbnVtKTsKIAl2b2lkCQkoKnNtZ3JfdW5saW5rKSAoUmVsRmlsZUxvY2F0b3JCYWNrZW5k IHJsb2NhdG9yLCBGb3JrTnVtYmVyIGZvcmtudW0sCiAJCQkJCQkJCWJvb2wgaXNSZWRvKTsK LQl2b2lkCQkoKnNtZ3JfZXh0ZW5kKSAoU01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIg Zm9ya251bSwKLQkJCQkJCQkJQmxvY2tOdW1iZXIgYmxvY2tudW0sIGNvbnN0IHZvaWQgKmJ1 ZmZlciwgYm9vbCBza2lwRnN5bmMpOwotCXZvaWQJCSgqc21ncl96ZXJvZXh0ZW5kKSAoU01n clJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSwKLQkJCQkJCQkJCUJsb2NrTnVt YmVyIGJsb2NrbnVtLCBpbnQgbmJsb2NrcywgYm9vbCBza2lwRnN5bmMpOwogCWJvb2wJCSgq c21ncl9wcmVmZXRjaCkgKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0s CiAJCQkJCQkJCSAgQmxvY2tOdW1iZXIgYmxvY2tudW0pOwogCXZvaWQJCSgqc21ncl9yZWFk KSAoU01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSwKIAkJCQkJCQkgIEJs b2NrTnVtYmVyIGJsb2NrbnVtLCB2b2lkICpidWZmZXIpOwogCXZvaWQJCSgqc21ncl93cml0 ZSkgKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0sCiAJCQkJCQkJICAg QmxvY2tOdW1iZXIgYmxvY2tudW0sIGNvbnN0IHZvaWQgKmJ1ZmZlciwgYm9vbCBza2lwRnN5 bmMpOworCXZvaWQJCSgqc21ncl9leHRlbmQpIChTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051 bWJlciBmb3JrbnVtLAorCQkJCQkJCQlCbG9ja051bWJlciBibG9ja251bSwgY29uc3Qgdm9p ZCAqYnVmZmVyLCBib29sIHNraXBGc3luYyk7CisJdm9pZAkJKCpzbWdyX3plcm9leHRlbmQp IChTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtLAorCQkJCQkJCQkJQmxv Y2tOdW1iZXIgYmxvY2tudW0sIGludCBuYmxvY2tzLCBib29sIHNraXBGc3luYyk7CiAJdm9p ZAkJKCpzbWdyX3dyaXRlYmFjaykgKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZv cmtudW0sCiAJCQkJCQkJCSAgIEJsb2NrTnVtYmVyIGJsb2NrbnVtLCBCbG9ja051bWJlciBu YmxvY2tzKTsKIAlCbG9ja051bWJlciAoKnNtZ3JfbmJsb2NrcykgKFNNZ3JSZWxhdGlvbiBy ZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0pOwpAQCAtMTA0LDggKzEwNiw3IEBAIHN0YXRpYyB2 b2lkIHNtZ3JzaHV0ZG93bihpbnQgY29kZSwgRGF0dW0gYXJnKTsKIAogCiAvKgotICoJc21n cmluaXQoKSwgc21ncnNodXRkb3duKCkgLS0gSW5pdGlhbGl6ZSBvciBzaHV0IGRvd24gc3Rv cmFnZQotICoJCQkJCQkJCSAgbWFuYWdlcnMuCisgKiBzbWdyaW5pdCgpIC0tIEluaXRpYWxp emUgc3RvcmFnZSBtYW5hZ2Vycy4KICAqCiAgKiBOb3RlOiBzbWdyaW5pdCBpcyBjYWxsZWQg ZHVyaW5nIGJhY2tlbmQgc3RhcnR1cCAobm9ybWFsIG9yIHN0YW5kYWxvbmUKICAqIGNhc2Up LCAqbm90KiBkdXJpbmcgcG9zdG1hc3RlciBzdGFydC4gIFRoZXJlZm9yZSwgYW55IHJlc291 cmNlcyBjcmVhdGVkCkBAIC0xNDIsOSArMTQzLDExIEBAIHNtZ3JzaHV0ZG93bihpbnQgY29k ZSwgRGF0dW0gYXJnKQogfQogCiAvKgotICoJc21ncm9wZW4oKSAtLSBSZXR1cm4gYW4gU01n clJlbGF0aW9uIG9iamVjdCwgY3JlYXRpbmcgaXQgaWYgbmVlZCBiZS4KKyAqIHNtZ3JvcGVu KCkgLS0gUmV0dXJuIGFuIFNNZ3JSZWxhdGlvbiBvYmplY3QsIGNyZWF0aW5nIGl0IGlmIG5l ZWQgYmUuCisgKgorICogImJhY2tlbmQiIGlzIGZvciB0ZW1wb3JhcnkgdGFibGVzLCBvdGhl cndpc2UgSW52YWxpZEJhY2tlbmRJZC4KICAqCi0gKgkJVGhpcyBkb2VzIG5vdCBhdHRlbXB0 IHRvIGFjdHVhbGx5IG9wZW4gdGhlIHVuZGVybHlpbmcgZmlsZS4KKyAqIFRoaXMgZG9lcyBu b3QgYXR0ZW1wdCB0byBhY3R1YWxseSBvcGVuIHRoZSB1bmRlcmx5aW5nIGZpbGUuCiAgKi8K IFNNZ3JSZWxhdGlvbgogc21ncm9wZW4oUmVsRmlsZUxvY2F0b3IgcmxvY2F0b3IsIEJhY2tl bmRJZCBiYWNrZW5kKQpAQCAtMjQ1LDcgKzI0OCw3IEBAIHNtZ3JjbGVhcm93bmVyKFNNZ3JS ZWxhdGlvbiAqb3duZXIsIFNNZ3JSZWxhdGlvbiByZWxuKQogfQogCiAvKgotICoJc21ncmV4 aXN0cygpIC0tIERvZXMgdGhlIHVuZGVybHlpbmcgZmlsZSBmb3IgYSBmb3JrIGV4aXN0Pwor ICogc21ncmV4aXN0cygpIC0tIERvZXMgdGhlIHVuZGVybHlpbmcgZmlsZSBmb3IgYSBmb3Jr IGV4aXN0PwogICovCiBib29sCiBzbWdyZXhpc3RzKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3Jr TnVtYmVyIGZvcmtudW0pCkBAIC0yNTQsNyArMjU3LDcgQEAgc21ncmV4aXN0cyhTTWdyUmVs YXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtKQogfQogCiAvKgotICoJc21ncmNsb3Nl KCkgLS0gQ2xvc2UgYW5kIGRlbGV0ZSBhbiBTTWdyUmVsYXRpb24gb2JqZWN0LgorICogc21n cmNsb3NlKCkgLS0gQ2xvc2UgYW5kIGRlbGV0ZSBhbiBTTWdyUmVsYXRpb24gb2JqZWN0Lgog ICovCiB2b2lkCiBzbWdyY2xvc2UoU01nclJlbGF0aW9uIHJlbG4pCkBAIC0yODQsOSArMjg3 LDkgQEAgc21ncmNsb3NlKFNNZ3JSZWxhdGlvbiByZWxuKQogfQogCiAvKgotICoJc21ncnJl bGVhc2UoKSAtLSBSZWxlYXNlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGlzIG9iamVjdC4K KyAqIHNtZ3JyZWxlYXNlKCkgLS0gUmVsZWFzZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhp cyBvYmplY3QuCiAgKgotICoJVGhlIG9iamVjdCByZW1haW5zIHZhbGlkLgorICogVGhlIG9i amVjdCByZW1haW5zIHZhbGlkLgogICovCiB2b2lkCiBzbWdycmVsZWFzZShTTWdyUmVsYXRp b24gcmVsbikKQEAgLTI5OSw5ICszMDIsOSBAQCBzbWdycmVsZWFzZShTTWdyUmVsYXRpb24g cmVsbikKIH0KIAogLyoKLSAqCXNtZ3JyZWxlYXNlYWxsKCkgLS0gUmVsZWFzZSByZXNvdXJj ZXMgdXNlZCBieSBhbGwgb2JqZWN0cy4KKyAqIHNtZ3JyZWxlYXNlYWxsKCkgLS0gUmVsZWFz ZSByZXNvdXJjZXMgdXNlZCBieSBhbGwgb2JqZWN0cy4KICAqCi0gKglUaGlzIGlzIGNhbGxl ZCBmb3IgUFJPQ1NJR05BTF9CQVJSSUVSX1NNR1JSRUxFQVNFLgorICogVGhpcyBpcyBjYWxs ZWQgZm9yIFBST0NTSUdOQUxfQkFSUklFUl9TTUdSUkVMRUFTRS4KICAqLwogdm9pZAogc21n cnJlbGVhc2VhbGwodm9pZCkKQEAgLTMyMCw3ICszMjMsNyBAQCBzbWdycmVsZWFzZWFsbCh2 b2lkKQogfQogCiAvKgotICoJc21ncmNsb3NlYWxsKCkgLS0gQ2xvc2UgYWxsIGV4aXN0aW5n IFNNZ3JSZWxhdGlvbiBvYmplY3RzLgorICogc21ncmNsb3NlYWxsKCkgLS0gQ2xvc2UgYWxs IGV4aXN0aW5nIFNNZ3JSZWxhdGlvbiBvYmplY3RzLgogICovCiB2b2lkCiBzbWdyY2xvc2Vh bGwodm9pZCkKQEAgLTMzOSw4ICszNDIsOCBAQCBzbWdyY2xvc2VhbGwodm9pZCkKIH0KIAog LyoKLSAqCXNtZ3JjbG9zZXJlbGxvY2F0b3IoKSAtLSBDbG9zZSBTTWdyUmVsYXRpb24gb2Jq ZWN0IGZvciBnaXZlbiBSZWxGaWxlTG9jYXRvciwKLSAqCQkJCQkgICBpZiBvbmUgZXhpc3Rz LgorICogc21ncmNsb3NlcmVsbG9jYXRvcigpIC0tIENsb3NlIFNNZ3JSZWxhdGlvbiBvYmpl Y3QgZm9yIGdpdmVuCisgKgkJCQkJCQlSZWxGaWxlTG9jYXRvciwgaWYgb25lIGV4aXN0cy4K ICAqCiAgKiBUaGlzIGhhcyB0aGUgc2FtZSBlZmZlY3RzIGFzIHNtZ3JjbG9zZShzbWdyb3Bl bihybG9jYXRvcikpLCBidXQgaXQgYXZvaWRzCiAgKiB1c2VsZXNzbHkgY3JlYXRpbmcgYSBo YXNodGFibGUgZW50cnkgb25seSB0byBkcm9wIGl0IGFnYWluIHdoZW4gbm8KQEAgLTM2Mywx MSArMzY2LDEzIEBAIHNtZ3JjbG9zZXJlbGxvY2F0b3IoUmVsRmlsZUxvY2F0b3JCYWNrZW5k IHJsb2NhdG9yKQogfQogCiAvKgotICoJc21ncmNyZWF0ZSgpIC0tIENyZWF0ZSBhIG5ldyBy ZWxhdGlvbi4KKyAqIHNtZ3JjcmVhdGUoKSAtLSBDcmVhdGUgYSBuZXcgcmVsYXRpb24uCiAg KgotICoJCUdpdmVuIGFuIGFscmVhZHktY3JlYXRlZCAoYnV0IHByZXN1bWFibHkgdW51c2Vk KSBTTWdyUmVsYXRpb24sCi0gKgkJY2F1c2UgdGhlIHVuZGVybHlpbmcgZGlzayBmaWxlIG9y IG90aGVyIHN0b3JhZ2UgZm9yIHRoZSBmb3JrCi0gKgkJdG8gYmUgY3JlYXRlZC4KKyAqIEdp dmVuIGFuIGFscmVhZHktY3JlYXRlZCAoYnV0IHByZXN1bWFibHkgdW51c2VkKSBTTWdyUmVs YXRpb24sIGNhdXNlIHRoZQorICogdW5kZXJseWluZyBkaXNrIGZpbGUgb3Igb3RoZXIgc3Rv cmFnZSBmb3IgdGhlIGZvcmsgdG8gYmUgY3JlYXRlZC4KKyAqCisgKiBpc1JlZG8gaXMgdHJ1 ZSBkdXJpbmcgcmVjb3ZlcnkuICBJbiB0aGF0IGNhc2UsIHRoZSB1bmRlcmx5aW5nIHN0b3Jh Z2UgbWF5CisgKiBhbHJlYWR5IGV4aXN0LgogICovCiB2b2lkCiBzbWdyY3JlYXRlKFNNZ3JS ZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0sIGJvb2wgaXNSZWRvKQpAQCAtMzc2 LDEzICszODEsMTMgQEAgc21ncmNyZWF0ZShTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJl ciBmb3JrbnVtLCBib29sIGlzUmVkbykKIH0KIAogLyoKLSAqCXNtZ3Jkb3N5bmNhbGwoKSAt LSBJbW1lZGlhdGVseSBzeW5jIGFsbCBmb3JrcyBvZiBhbGwgZ2l2ZW4gcmVsYXRpb25zCisg KiBzbWdyZG9zeW5jYWxsKCkgLS0gSW1tZWRpYXRlbHkgc3luYyBhbGwgZm9ya3Mgb2YgYWxs IGdpdmVuIHJlbGF0aW9ucwogICoKLSAqCQlBbGwgZm9ya3Mgb2YgYWxsIGdpdmVuIHJlbGF0 aW9ucyBhcmUgc3luY2VkIG91dCB0byB0aGUgc3RvcmUuCisgKiBBbGwgZm9ya3Mgb2YgYWxs IGdpdmVuIHJlbGF0aW9ucyBhcmUgc3luY2VkIG91dCB0byB0aGUgc3RvcmUuCiAgKgotICoJ CVRoaXMgaXMgZXF1aXZhbGVudCB0byBGbHVzaFJlbGF0aW9uQnVmZmVycygpIGZvciBlYWNo IHNtZ3IgcmVsYXRpb24sCi0gKgkJdGhlbiBjYWxsaW5nIHNtZ3JpbW1lZHN5bmMoKSBmb3Ig YWxsIGZvcmtzIG9mIGVhY2ggcmVsYXRpb24sIGJ1dCBpdCdzCi0gKgkJc2lnbmlmaWNhbnRs eSBxdWlja2VyIHNvIHNob3VsZCBiZSBwcmVmZXJyZWQgd2hlbiBwb3NzaWJsZS4KKyAqIFRo aXMgaXMgZXF1aXZhbGVudCB0byBGbHVzaFJlbGF0aW9uQnVmZmVycygpIGZvciBlYWNoIHNt Z3IgcmVsYXRpb24sIHRoZW4KKyAqIGNhbGxpbmcgc21ncmltbWVkc3luYygpIGZvciBhbGwg Zm9ya3Mgb2YgZWFjaCByZWxhdGlvbiwgYnV0IGl0J3MKKyAqIHNpZ25pZmljYW50bHkgcXVp Y2tlciBzbyBzaG91bGQgYmUgcHJlZmVycmVkIHdoZW4gcG9zc2libGUuCiAgKi8KIHZvaWQK IHNtZ3Jkb3N5bmNhbGwoU01nclJlbGF0aW9uICpyZWxzLCBpbnQgbnJlbHMpCkBAIC00MTEs MTQgKzQxNiwxMyBAQCBzbWdyZG9zeW5jYWxsKFNNZ3JSZWxhdGlvbiAqcmVscywgaW50IG5y ZWxzKQogfQogCiAvKgotICoJc21ncmRvdW5saW5rYWxsKCkgLS0gSW1tZWRpYXRlbHkgdW5s aW5rIGFsbCBmb3JrcyBvZiBhbGwgZ2l2ZW4gcmVsYXRpb25zCisgKiBzbWdyZG91bmxpbmth bGwoKSAtLSBJbW1lZGlhdGVseSB1bmxpbmsgYWxsIGZvcmtzIG9mIGFsbCBnaXZlbiByZWxh dGlvbnMKICAqCi0gKgkJQWxsIGZvcmtzIG9mIGFsbCBnaXZlbiByZWxhdGlvbnMgYXJlIHJl bW92ZWQgZnJvbSB0aGUgc3RvcmUuICBUaGlzCi0gKgkJc2hvdWxkIG5vdCBiZSB1c2VkIGR1 cmluZyB0cmFuc2FjdGlvbmFsIG9wZXJhdGlvbnMsIHNpbmNlIGl0IGNhbid0IGJlCi0gKgkJ dW5kb25lLgorICogQWxsIGZvcmtzIG9mIGFsbCBnaXZlbiByZWxhdGlvbnMgYXJlIHJlbW92 ZWQgZnJvbSB0aGUgc3RvcmUuICBUaGlzIHNob3VsZAorICogbm90IGJlIHVzZWQgZHVyaW5n IHRyYW5zYWN0aW9uYWwgb3BlcmF0aW9ucywgc2luY2UgaXQgY2FuJ3QgYmUgdW5kb25lLgog ICoKLSAqCQlJZiBpc1JlZG8gaXMgdHJ1ZSwgaXQgaXMgb2theSBmb3IgdGhlIHVuZGVybHlp bmcgZmlsZShzKSB0byBiZSBnb25lCi0gKgkJYWxyZWFkeS4KKyAqIElmIGlzUmVkbyBpcyB0 cnVlLCBpdCBpcyBva2F5IGZvciB0aGUgdW5kZXJseWluZyBmaWxlKHMpIHRvIGJlIGdvbmUK KyAqIGFscmVhZHkuCiAgKi8KIHZvaWQKIHNtZ3Jkb3VubGlua2FsbChTTWdyUmVsYXRpb24g KnJlbHMsIGludCBucmVscywgYm9vbCBpc1JlZG8pCkBAIC00ODMsMTUgKzQ4Nyw2NCBAQCBz bWdyZG91bmxpbmthbGwoU01nclJlbGF0aW9uICpyZWxzLCBpbnQgbnJlbHMsIGJvb2wgaXNS ZWRvKQogCXBmcmVlKHJsb2NhdG9ycyk7CiB9CiAKKy8qCisgKiBzbWdycHJlZmV0Y2goKSAt LSBJbml0aWF0ZSBhc3luY2hyb25vdXMgcmVhZCBvZiB0aGUgc3BlY2lmaWVkIGJsb2NrIG9m IGEgcmVsYXRpb24uCisgKgorICogSW4gcmVjb3Zlcnkgb25seSwgdGhpcyBjYW4gcmV0dXJu IGZhbHNlIHRvIGluZGljYXRlIHRoYXQgYSBmaWxlIGRvZXNuJ3QKKyAqIGV4aXN0IChwcmVz dW1hYmx5IGl0IGhhcyBiZWVuIGRyb3BwZWQgYnkgYSBsYXRlciBXQUwgcmVjb3JkKS4KKyAq LworYm9vbAorc21ncnByZWZldGNoKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZv cmtudW0sIEJsb2NrTnVtYmVyIGJsb2NrbnVtKQoreworCXJldHVybiBzbWdyc3dbcmVsbi0+ c21ncl93aGljaF0uc21ncl9wcmVmZXRjaChyZWxuLCBmb3JrbnVtLCBibG9ja251bSk7Cit9 CisKKy8qCisgKiBzbWdycmVhZCgpIC0tIHJlYWQgYSBwYXJ0aWN1bGFyIGJsb2NrIGZyb20g YSByZWxhdGlvbiBpbnRvIHRoZSBzdXBwbGllZAorICoJCQkJIGJ1ZmZlci4KKyAqCisgKiBU aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gdGhlIGJ1ZmZlciBtYW5hZ2VyIGluIG9yZGVy IHRvIGluc3RhbnRpYXRlCisgKiBwYWdlcyBpbiB0aGUgc2hhcmVkIGJ1ZmZlciBjYWNoZS4g IEFsbCBzdG9yYWdlIG1hbmFnZXJzIHJldHVybiBwYWdlcyBpbiB0aGUKKyAqIGZvcm1hdCB0 aGF0IFBPU1RHUkVTIGV4cGVjdHMuCisgKi8KK3ZvaWQKK3NtZ3JyZWFkKFNNZ3JSZWxhdGlv biByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0sIEJsb2NrTnVtYmVyIGJsb2NrbnVtLAorCQkg dm9pZCAqYnVmZmVyKQoreworCXNtZ3Jzd1tyZWxuLT5zbWdyX3doaWNoXS5zbWdyX3JlYWQo cmVsbiwgZm9ya251bSwgYmxvY2tudW0sIGJ1ZmZlcik7Cit9CisKKy8qCisgKiBzbWdyd3Jp dGUoKSAtLSBXcml0ZSB0aGUgc3VwcGxpZWQgYnVmZmVyIG91dC4KKyAqCisgKiBUaGlzIGlz IHRvIGJlIHVzZWQgb25seSBmb3IgdXBkYXRpbmcgYWxyZWFkeS1leGlzdGluZyBibG9ja3Mg b2YgYSByZWxhdGlvbgorICogKGllLCB0aG9zZSBiZWZvcmUgdGhlIGN1cnJlbnQgRU9GKS4g IFRvIGV4dGVuZCBhIHJlbGF0aW9uLCB1c2UKKyAqIHNtZ3JleHRlbmQoKS4KKyAqCisgKiBU aGlzIGlzIG5vdCBhIHN5bmNocm9ub3VzIHdyaXRlIC0tIHRoZSBibG9jayBpcyBub3QgbmVj ZXNzYXJpbHkgb24gZGlzayBhdAorICogcmV0dXJuLCBvbmx5IGR1bXBlZCBvdXQgdG8gdGhl IGtlcm5lbC4gIEhvd2V2ZXIsIHByb3Zpc2lvbnMgd2lsbCBiZSBtYWRlIHRvCisgKiBmc3lu YyB0aGUgd3JpdGUgYmVmb3JlIHRoZSBuZXh0IGNoZWNrcG9pbnQuCisgKgorICogc2tpcEZz eW5jIGluZGljYXRlcyB0aGF0IHRoZSBjYWxsZXIgd2lsbCBtYWtlIG90aGVyIHByb3Zpc2lv bnMgdG8gZnN5bmMgdGhlCisgKiByZWxhdGlvbiwgc28gd2UgbmVlZG4ndCBib3RoZXIuICBU ZW1wb3JhcnkgcmVsYXRpb25zIGFsc28gZG8gbm90IHJlcXVpcmUKKyAqIGZzeW5jLgorICov Cit2b2lkCitzbWdyd3JpdGUoU01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251 bSwgQmxvY2tOdW1iZXIgYmxvY2tudW0sCisJCSAgY29uc3Qgdm9pZCAqYnVmZmVyLCBib29s IHNraXBGc3luYykKK3sKKwlzbWdyc3dbcmVsbi0+c21ncl93aGljaF0uc21ncl93cml0ZShy ZWxuLCBmb3JrbnVtLCBibG9ja251bSwKKwkJCQkJCQkJCQlidWZmZXIsIHNraXBGc3luYyk7 Cit9CiAKIC8qCi0gKglzbWdyZXh0ZW5kKCkgLS0gQWRkIGEgbmV3IGJsb2NrIHRvIGEgZmls ZS4KKyAqIHNtZ3JleHRlbmQoKSAtLSBBZGQgYSBuZXcgYmxvY2sgdG8gYSBmaWxlLgogICoK LSAqCQlUaGUgc2VtYW50aWNzIGFyZSBuZWFybHkgdGhlIHNhbWUgYXMgc21ncndyaXRlKCk6 IHdyaXRlIGF0IHRoZQotICoJCXNwZWNpZmllZCBwb3NpdGlvbi4gIEhvd2V2ZXIsIHRoaXMg aXMgdG8gYmUgdXNlZCBmb3IgdGhlIGNhc2Ugb2YKLSAqCQlleHRlbmRpbmcgYSByZWxhdGlv biAoaS5lLiwgYmxvY2tudW0gaXMgYXQgb3IgYmV5b25kIHRoZSBjdXJyZW50Ci0gKgkJRU9G KS4gIE5vdGUgdGhhdCB3ZSBhc3N1bWUgd3JpdGluZyBhIGJsb2NrIGJleW9uZCBjdXJyZW50 IEVPRgotICoJCWNhdXNlcyBpbnRlcnZlbmluZyBmaWxlIHNwYWNlIHRvIGJlY29tZSBmaWxs ZWQgd2l0aCB6ZXJvZXMuCisgKiBUaGUgc2VtYW50aWNzIGFyZSBuZWFybHkgdGhlIHNhbWUg YXMgc21ncndyaXRlKCk6IHdyaXRlIGF0IHRoZSBzcGVjaWZpZWQKKyAqIHBvc2l0aW9uLiAg SG93ZXZlciwgdGhpcyBpcyB0byBiZSB1c2VkIGZvciB0aGUgY2FzZSBvZiBleHRlbmRpbmcg YSByZWxhdGlvbgorICogKGkuZS4sIGJsb2NrbnVtIGlzIGF0IG9yIGJleW9uZCB0aGUgY3Vy cmVudCBFT0YpLiAgV3JpdGluZyBhIGJsb2NrIGJleW9uZAorICogY3VycmVudCBFT0YgbXVz dCBjYXVzZSB0aGUgaW50ZXJ2ZW5pbmcgZmlsZSBzcGFjZSB0byBiZWNvbWUgZmlsbGVkIHdp dGgKKyAqIHplcm9lcy4KICAqLwogdm9pZAogc21ncmV4dGVuZChTTWdyUmVsYXRpb24gcmVs biwgRm9ya051bWJlciBmb3JrbnVtLCBCbG9ja051bWJlciBibG9ja251bSwKQEAgLTUxMiwx MSArNTY1LDEzIEBAIHNtZ3JleHRlbmQoU01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIg Zm9ya251bSwgQmxvY2tOdW1iZXIgYmxvY2tudW0sCiB9CiAKIC8qCi0gKglzbWdyemVyb2V4 dGVuZCgpIC0tIEFkZCBuZXcgemVyb2VkIG91dCBibG9ja3MgdG8gYSBmaWxlLgorICogc21n cnplcm9leHRlbmQoKSAtLSBBZGQgbmV3IHplcm9lZCBvdXQgYmxvY2tzIHRvIGEgZmlsZS4K KyAqCisgKiBFeHRlbmQgdGhlIHJlbGF0aW9uIGJ5IHRoZSBnaXZlbiBudW1iZXIgb2YgYmxv Y2tzLCB3aGljaCB3aWxsIGJlIGZpbGxlZAorICogd2l0aCB6ZXJvZXMuICBUaGlzIGlzIHNp bWlsYXIgdG8gc21ncmV4dGVuZCgpIGJ1dCBvbmx5IGV4dGVuZHMgYW5kIGRvZXMgbm90Cisg KiB3cml0ZSBhIGJ1ZmZlciBvZiBkYXRhLgogICoKLSAqCQlTaW1pbGFyIHRvIHNtZ3JleHRl bmQoKSwgZXhjZXB0IHRoZSByZWxhdGlvbiBjYW4gYmUgZXh0ZW5kZWQgYnkKLSAqCQltdWx0 aXBsZSBibG9ja3MgYXQgb25jZSBhbmQgdGhlIGFkZGVkIGJsb2NrcyB3aWxsIGJlIGZpbGxl ZCB3aXRoCi0gKgkJemVyb2VzLgorICogRklYTUU6IHdoeSBib3RoIGJsb2NrbnVtIGFuZCBu YmxvY2tzCiAgKi8KIHZvaWQKIHNtZ3J6ZXJvZXh0ZW5kKFNNZ3JSZWxhdGlvbiByZWxuLCBG b3JrTnVtYmVyIGZvcmtudW0sIEJsb2NrTnVtYmVyIGJsb2NrbnVtLApAQCAtNTM3LDYwICs1 OTIsOCBAQCBzbWdyemVyb2V4dGVuZChTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBm b3JrbnVtLCBCbG9ja051bWJlciBibG9ja251bSwKIH0KIAogLyoKLSAqCXNtZ3JwcmVmZXRj aCgpIC0tIEluaXRpYXRlIGFzeW5jaHJvbm91cyByZWFkIG9mIHRoZSBzcGVjaWZpZWQgYmxv Y2sgb2YgYSByZWxhdGlvbi4KLSAqCi0gKgkJSW4gcmVjb3Zlcnkgb25seSwgdGhpcyBjYW4g cmV0dXJuIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgYSBmaWxlCi0gKgkJZG9lc24ndAlleGlz dCAocHJlc3VtYWJseSBpdCBoYXMgYmVlbiBkcm9wcGVkIGJ5IGEgbGF0ZXIgV0FMCi0gKgkJ cmVjb3JkKS4KLSAqLwotYm9vbAotc21ncnByZWZldGNoKFNNZ3JSZWxhdGlvbiByZWxuLCBG b3JrTnVtYmVyIGZvcmtudW0sIEJsb2NrTnVtYmVyIGJsb2NrbnVtKQotewotCXJldHVybiBz bWdyc3dbcmVsbi0+c21ncl93aGljaF0uc21ncl9wcmVmZXRjaChyZWxuLCBmb3JrbnVtLCBi bG9ja251bSk7Ci19Ci0KLS8qCi0gKglzbWdycmVhZCgpIC0tIHJlYWQgYSBwYXJ0aWN1bGFy IGJsb2NrIGZyb20gYSByZWxhdGlvbiBpbnRvIHRoZSBzdXBwbGllZAotICoJCQkJICBidWZm ZXIuCi0gKgotICoJCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSB0aGUgYnVmZmVyIG1h bmFnZXIgaW4gb3JkZXIgdG8KLSAqCQlpbnN0YW50aWF0ZSBwYWdlcyBpbiB0aGUgc2hhcmVk IGJ1ZmZlciBjYWNoZS4gIEFsbCBzdG9yYWdlIG1hbmFnZXJzCi0gKgkJcmV0dXJuIHBhZ2Vz IGluIHRoZSBmb3JtYXQgdGhhdCBQT1NUR1JFUyBleHBlY3RzLgotICovCi12b2lkCi1zbWdy cmVhZChTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtLCBCbG9ja051bWJl ciBibG9ja251bSwKLQkJIHZvaWQgKmJ1ZmZlcikKLXsKLQlzbWdyc3dbcmVsbi0+c21ncl93 aGljaF0uc21ncl9yZWFkKHJlbG4sIGZvcmtudW0sIGJsb2NrbnVtLCBidWZmZXIpOwotfQot Ci0vKgotICoJc21ncndyaXRlKCkgLS0gV3JpdGUgdGhlIHN1cHBsaWVkIGJ1ZmZlciBvdXQu Ci0gKgotICoJCVRoaXMgaXMgdG8gYmUgdXNlZCBvbmx5IGZvciB1cGRhdGluZyBhbHJlYWR5 LWV4aXN0aW5nIGJsb2NrcyBvZiBhCi0gKgkJcmVsYXRpb24gKGllLCB0aG9zZSBiZWZvcmUg dGhlIGN1cnJlbnQgRU9GKS4gIFRvIGV4dGVuZCBhIHJlbGF0aW9uLAotICoJCXVzZSBzbWdy ZXh0ZW5kKCkuCi0gKgotICoJCVRoaXMgaXMgbm90IGEgc3luY2hyb25vdXMgd3JpdGUgLS0g dGhlIGJsb2NrIGlzIG5vdCBuZWNlc3NhcmlseQotICoJCW9uIGRpc2sgYXQgcmV0dXJuLCBv bmx5IGR1bXBlZCBvdXQgdG8gdGhlIGtlcm5lbC4gIEhvd2V2ZXIsCi0gKgkJcHJvdmlzaW9u cyB3aWxsIGJlIG1hZGUgdG8gZnN5bmMgdGhlIHdyaXRlIGJlZm9yZSB0aGUgbmV4dCBjaGVj a3BvaW50LgotICoKLSAqCQlza2lwRnN5bmMgaW5kaWNhdGVzIHRoYXQgdGhlIGNhbGxlciB3 aWxsIG1ha2Ugb3RoZXIgcHJvdmlzaW9ucyB0bwotICoJCWZzeW5jIHRoZSByZWxhdGlvbiwg c28gd2UgbmVlZG4ndCBib3RoZXIuICBUZW1wb3JhcnkgcmVsYXRpb25zIGFsc28KLSAqCQlk byBub3QgcmVxdWlyZSBmc3luYy4KLSAqLwotdm9pZAotc21ncndyaXRlKFNNZ3JSZWxhdGlv biByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0sIEJsb2NrTnVtYmVyIGJsb2NrbnVtLAotCQkg IGNvbnN0IHZvaWQgKmJ1ZmZlciwgYm9vbCBza2lwRnN5bmMpCi17Ci0Jc21ncnN3W3JlbG4t PnNtZ3Jfd2hpY2hdLnNtZ3Jfd3JpdGUocmVsbiwgZm9ya251bSwgYmxvY2tudW0sCi0JCQkJ CQkJCQkJYnVmZmVyLCBza2lwRnN5bmMpOwotfQotCi0KLS8qCi0gKglzbWdyd3JpdGViYWNr KCkgLS0gVHJpZ2dlciBrZXJuZWwgd3JpdGViYWNrIGZvciB0aGUgc3VwcGxpZWQgcmFuZ2Ug b2YKLSAqCQkJCQkgICBibG9ja3MuCisgKiBzbWdyd3JpdGViYWNrKCkgLS0gVHJpZ2dlciBr ZXJuZWwgd3JpdGViYWNrIGZvciB0aGUgc3VwcGxpZWQgcmFuZ2Ugb2YKKyAqCQkJCQkgIGJs b2Nrcy4KICAqLwogdm9pZAogc21ncndyaXRlYmFjayhTTWdyUmVsYXRpb24gcmVsbiwgRm9y a051bWJlciBmb3JrbnVtLCBCbG9ja051bWJlciBibG9ja251bSwKQEAgLTYwMSw4ICs2MDQs OCBAQCBzbWdyd3JpdGViYWNrKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtu dW0sIEJsb2NrTnVtYmVyIGJsb2NrbnVtLAogfQogCiAvKgotICoJc21ncm5ibG9ja3MoKSAt LSBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBibG9ja3MgaW4gdGhlCi0gKgkJCQkJIHN1cHBs aWVkIHJlbGF0aW9uLgorICogc21ncm5ibG9ja3MoKSAtLSBDYWxjdWxhdGUgdGhlIG51bWJl ciBvZiBibG9ja3MgaW4gdGhlCisgKgkJCQkJc3VwcGxpZWQgcmVsYXRpb24uCiAgKi8KIEJs b2NrTnVtYmVyCiBzbWdybmJsb2NrcyhTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBm b3JrbnVtKQpAQCAtNjIyLDggKzYyNSw4IEBAIHNtZ3JuYmxvY2tzKFNNZ3JSZWxhdGlvbiBy ZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0pCiB9CiAKIC8qCi0gKglzbWdybmJsb2Nrc19jYWNo ZWQoKSAtLSBHZXQgdGhlIGNhY2hlZCBudW1iZXIgb2YgYmxvY2tzIGluIHRoZSBzdXBwbGll ZAotICoJCQkJCQkJcmVsYXRpb24uCisgKiBzbWdybmJsb2Nrc19jYWNoZWQoKSAtLSBHZXQg dGhlIGNhY2hlZCBudW1iZXIgb2YgYmxvY2tzIGluIHRoZSBzdXBwbGllZAorICoJCQkJCQkg ICByZWxhdGlvbi4KICAqCiAgKiBSZXR1cm5zIGFuIEludmFsaWRCbG9ja051bWJlciB3aGVu IG5vdCBpbiByZWNvdmVyeSBhbmQgd2hlbiB0aGUgcmVsYXRpb24KICAqIGZvcmsgc2l6ZSBp cyBub3QgY2FjaGVkLgpAQCAtNjQyLDggKzY0NSw4IEBAIHNtZ3JuYmxvY2tzX2NhY2hlZChT TWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtKQogfQogCiAvKgotICoJc21n cnRydW5jYXRlKCkgLS0gVHJ1bmNhdGUgdGhlIGdpdmVuIGZvcmtzIG9mIHN1cHBsaWVkIHJl bGF0aW9uIHRvCi0gKgkJCQkJICBlYWNoIHNwZWNpZmllZCBudW1iZXJzIG9mIGJsb2Nrcwor ICogc21ncnRydW5jYXRlKCkgLS0gVHJ1bmNhdGUgdGhlIGdpdmVuIGZvcmtzIG9mIHN1cHBs aWVkIHJlbGF0aW9uIHRvCisgKgkJCQkJIGVhY2ggc3BlY2lmaWVkIG51bWJlcnMgb2YgYmxv Y2tzCiAgKgogICogVGhlIHRydW5jYXRpb24gaXMgZG9uZSBpbW1lZGlhdGVseSwgc28gdGhp cyBjYW4ndCBiZSByb2xsZWQgYmFjay4KICAqCkBAIC02OTQsMjcgKzY5NywyNyBAQCBzbWdy dHJ1bmNhdGUoU01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgKmZvcmtudW0sIGludCBu Zm9ya3MsIEJsb2NrTnVtYmVyICpuYgogfQogCiAvKgotICoJc21ncmltbWVkc3luYygpIC0t IEZvcmNlIHRoZSBzcGVjaWZpZWQgcmVsYXRpb24gdG8gc3RhYmxlIHN0b3JhZ2UuCi0gKgot ICoJCVN5bmNocm9ub3VzbHkgZm9yY2UgYWxsIHByZXZpb3VzIHdyaXRlcyB0byB0aGUgc3Bl Y2lmaWVkIHJlbGF0aW9uCi0gKgkJZG93biB0byBkaXNrLgotICoKLSAqCQlUaGlzIGlzIHVz ZWZ1bCBmb3IgYnVpbGRpbmcgY29tcGxldGVseSBuZXcgcmVsYXRpb25zIChlZywgbmV3Ci0g KgkJaW5kZXhlcykuICBJbnN0ZWFkIG9mIGluY3JlbWVudGFsbHkgV0FMLWxvZ2dpbmcgdGhl IGluZGV4IGJ1aWxkCi0gKgkJc3RlcHMsIHdlIGNhbiBqdXN0IHdyaXRlIGNvbXBsZXRlZCBp bmRleCBwYWdlcyB0byBkaXNrIHdpdGggc21ncndyaXRlCi0gKgkJb3Igc21ncmV4dGVuZCwg YW5kIHRoZW4gZnN5bmMgdGhlIGNvbXBsZXRlZCBpbmRleCBmaWxlIGJlZm9yZQotICoJCWNv bW1pdHRpbmcgdGhlIHRyYW5zYWN0aW9uLiAgKFRoaXMgaXMgc3VmZmljaWVudCBmb3IgcHVy cG9zZXMgb2YKLSAqCQljcmFzaCByZWNvdmVyeSwgc2luY2UgaXQgZWZmZWN0aXZlbHkgZHVw bGljYXRlcyBmb3JjaW5nIGEgY2hlY2twb2ludAotICoJCWZvciB0aGUgY29tcGxldGVkIGlu ZGV4LiAgQnV0IGl0IGlzICpub3QqIHN1ZmZpY2llbnQgaWYgb25lIHdpc2hlcwotICoJCXRv IHVzZSB0aGUgV0FMIGxvZyBmb3IgUElUUiBvciByZXBsaWNhdGlvbiBwdXJwb3NlczogaW4g dGhhdCBjYXNlCi0gKgkJd2UgaGF2ZSB0byBtYWtlIFdBTCBlbnRyaWVzIGFzIHdlbGwuKQot ICoKLSAqCQlUaGUgcHJlY2VkaW5nIHdyaXRlcyBzaG91bGQgc3BlY2lmeSBza2lwRnN5bmMg PSB0cnVlIHRvIGF2b2lkCi0gKgkJZHVwbGljYXRpdmUgZnN5bmNzLgotICoKLSAqCQlOb3Rl IHRoYXQgeW91IG5lZWQgdG8gZG8gRmx1c2hSZWxhdGlvbkJ1ZmZlcnMoKSBmaXJzdCBpZiB0 aGVyZSBpcwotICoJCWFueSBwb3NzaWJpbGl0eSB0aGF0IHRoZXJlIGFyZSBkaXJ0eSBidWZm ZXJzIGZvciB0aGUgcmVsYXRpb247Ci0gKgkJb3RoZXJ3aXNlIHRoZSBzeW5jIGlzIG5vdCB2 ZXJ5IG1lYW5pbmdmdWwuCisgKiBzbWdyaW1tZWRzeW5jKCkgLS0gRm9yY2UgdGhlIHNwZWNp ZmllZCByZWxhdGlvbiB0byBzdGFibGUgc3RvcmFnZS4KKyAqCisgKiBTeW5jaHJvbm91c2x5 IGZvcmNlIGFsbCBwcmV2aW91cyB3cml0ZXMgdG8gdGhlIHNwZWNpZmllZCByZWxhdGlvbgor ICogZG93biB0byBkaXNrLgorICoKKyAqIFRoaXMgaXMgdXNlZnVsIGZvciBidWlsZGluZyBj b21wbGV0ZWx5IG5ldyByZWxhdGlvbnMgKGVnLCBuZXcKKyAqIGluZGV4ZXMpLiAgSW5zdGVh ZCBvZiBpbmNyZW1lbnRhbGx5IFdBTC1sb2dnaW5nIHRoZSBpbmRleCBidWlsZAorICogc3Rl cHMsIHdlIGNhbiBqdXN0IHdyaXRlIGNvbXBsZXRlZCBpbmRleCBwYWdlcyB0byBkaXNrIHdp dGggc21ncndyaXRlCisgKiBvciBzbWdyZXh0ZW5kLCBhbmQgdGhlbiBmc3luYyB0aGUgY29t cGxldGVkIGluZGV4IGZpbGUgYmVmb3JlCisgKiBjb21taXR0aW5nIHRoZSB0cmFuc2FjdGlv bi4gIChUaGlzIGlzIHN1ZmZpY2llbnQgZm9yIHB1cnBvc2VzIG9mCisgKiBjcmFzaCByZWNv dmVyeSwgc2luY2UgaXQgZWZmZWN0aXZlbHkgZHVwbGljYXRlcyBmb3JjaW5nIGEgY2hlY2tw b2ludAorICogZm9yIHRoZSBjb21wbGV0ZWQgaW5kZXguICBCdXQgaXQgaXMgKm5vdCogc3Vm ZmljaWVudCBpZiBvbmUgd2lzaGVzCisgKiB0byB1c2UgdGhlIFdBTCBsb2cgZm9yIFBJVFIg b3IgcmVwbGljYXRpb24gcHVycG9zZXM6IGluIHRoYXQgY2FzZQorICogd2UgaGF2ZSB0byBt YWtlIFdBTCBlbnRyaWVzIGFzIHdlbGwuKQorICoKKyAqIFRoZSBwcmVjZWRpbmcgd3JpdGVz IHNob3VsZCBzcGVjaWZ5IHNraXBGc3luYyA9IHRydWUgdG8gYXZvaWQKKyAqIGR1cGxpY2F0 aXZlIGZzeW5jcy4KKyAqCisgKiBOb3RlIHRoYXQgeW91IG5lZWQgdG8gZG8gRmx1c2hSZWxh dGlvbkJ1ZmZlcnMoKSBmaXJzdCBpZiB0aGVyZSBpcworICogYW55IHBvc3NpYmlsaXR5IHRo YXQgdGhlcmUgYXJlIGRpcnR5IGJ1ZmZlcnMgZm9yIHRoZSByZWxhdGlvbjsKKyAqIG90aGVy d2lzZSB0aGUgc3luYyBpcyBub3QgdmVyeSBtZWFuaW5nZnVsLgogICovCiB2b2lkCiBzbWdy aW1tZWRzeW5jKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0pCmRpZmYg LS1naXQgYS9zcmMvaW5jbHVkZS9zdG9yYWdlL21kLmggYi9zcmMvaW5jbHVkZS9zdG9yYWdl L21kLmgKaW5kZXggOTQxODc5ZWU2YS4uOGFmMzRlNDE1NSAxMDA2NDQKLS0tIGEvc3JjL2lu Y2x1ZGUvc3RvcmFnZS9tZC5oCisrKyBiL3NyYy9pbmNsdWRlL3N0b3JhZ2UvbWQuaApAQCAt MjYsMTYgKzI2LDE2IEBAIGV4dGVybiB2b2lkIG1kY2xvc2UoU01nclJlbGF0aW9uIHJlbG4s IEZvcmtOdW1iZXIgZm9ya251bSk7CiBleHRlcm4gdm9pZCBtZGNyZWF0ZShTTWdyUmVsYXRp b24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtLCBib29sIGlzUmVkbyk7CiBleHRlcm4gYm9v bCBtZGV4aXN0cyhTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtKTsKIGV4 dGVybiB2b2lkIG1kdW5saW5rKFJlbEZpbGVMb2NhdG9yQmFja2VuZCBybG9jYXRvciwgRm9y a051bWJlciBmb3JrbnVtLCBib29sIGlzUmVkbyk7Ci1leHRlcm4gdm9pZCBtZGV4dGVuZChT TWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtLAotCQkJCQkgQmxvY2tOdW1i ZXIgYmxvY2tudW0sIGNvbnN0IHZvaWQgKmJ1ZmZlciwgYm9vbCBza2lwRnN5bmMpOwotZXh0 ZXJuIHZvaWQgbWR6ZXJvZXh0ZW5kKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZv cmtudW0sCi0JCQkJCQkgQmxvY2tOdW1iZXIgYmxvY2tudW0sIGludCBuYmxvY2tzLCBib29s IHNraXBGc3luYyk7CiBleHRlcm4gYm9vbCBtZHByZWZldGNoKFNNZ3JSZWxhdGlvbiByZWxu LCBGb3JrTnVtYmVyIGZvcmtudW0sCiAJCQkJCSAgIEJsb2NrTnVtYmVyIGJsb2NrbnVtKTsK IGV4dGVybiB2b2lkIG1kcmVhZChTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3Jr bnVtLCBCbG9ja051bWJlciBibG9ja251bSwKIAkJCQkgICB2b2lkICpidWZmZXIpOwogZXh0 ZXJuIHZvaWQgbWR3cml0ZShTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVt LAogCQkJCQlCbG9ja051bWJlciBibG9ja251bSwgY29uc3Qgdm9pZCAqYnVmZmVyLCBib29s IHNraXBGc3luYyk7CitleHRlcm4gdm9pZCBtZGV4dGVuZChTTWdyUmVsYXRpb24gcmVsbiwg Rm9ya051bWJlciBmb3JrbnVtLAorCQkJCQkgQmxvY2tOdW1iZXIgYmxvY2tudW0sIGNvbnN0 IHZvaWQgKmJ1ZmZlciwgYm9vbCBza2lwRnN5bmMpOworZXh0ZXJuIHZvaWQgbWR6ZXJvZXh0 ZW5kKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0sCisJCQkJCQkgQmxv Y2tOdW1iZXIgYmxvY2tudW0sIGludCBuYmxvY2tzLCBib29sIHNraXBGc3luYyk7CiBleHRl cm4gdm9pZCBtZHdyaXRlYmFjayhTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3Jr bnVtLAogCQkJCQkJQmxvY2tOdW1iZXIgYmxvY2tudW0sIEJsb2NrTnVtYmVyIG5ibG9ja3Mp OwogZXh0ZXJuIEJsb2NrTnVtYmVyIG1kbmJsb2NrcyhTTWdyUmVsYXRpb24gcmVsbiwgRm9y a051bWJlciBmb3JrbnVtKTsKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3N0b3JhZ2Uvc21n ci5oIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9zbWdyLmgKaW5kZXggYTlhMTc5YWFiYS4uODk2 NTEyZjFiYyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9zbWdyLmgKKysrIGIv c3JjL2luY2x1ZGUvc3RvcmFnZS9zbWdyLmgKQEAgLTkwLDE2ICs5MCwxNiBAQCBleHRlcm4g dm9pZCBzbWdycmVsZWFzZWFsbCh2b2lkKTsKIGV4dGVybiB2b2lkIHNtZ3JjcmVhdGUoU01n clJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSwgYm9vbCBpc1JlZG8pOwogZXh0 ZXJuIHZvaWQgc21ncmRvc3luY2FsbChTTWdyUmVsYXRpb24gKnJlbHMsIGludCBucmVscyk7 CiBleHRlcm4gdm9pZCBzbWdyZG91bmxpbmthbGwoU01nclJlbGF0aW9uICpyZWxzLCBpbnQg bnJlbHMsIGJvb2wgaXNSZWRvKTsKLWV4dGVybiB2b2lkIHNtZ3JleHRlbmQoU01nclJlbGF0 aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSwKLQkJCQkJICAgQmxvY2tOdW1iZXIgYmxv Y2tudW0sIGNvbnN0IHZvaWQgKmJ1ZmZlciwgYm9vbCBza2lwRnN5bmMpOwotZXh0ZXJuIHZv aWQgc21ncnplcm9leHRlbmQoU01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251 bSwKLQkJCQkJCSAgIEJsb2NrTnVtYmVyIGJsb2NrbnVtLCBpbnQgbmJsb2NrcywgYm9vbCBz a2lwRnN5bmMpOwogZXh0ZXJuIGJvb2wgc21ncnByZWZldGNoKFNNZ3JSZWxhdGlvbiByZWxu LCBGb3JrTnVtYmVyIGZvcmtudW0sCiAJCQkJCQkgQmxvY2tOdW1iZXIgYmxvY2tudW0pOwog ZXh0ZXJuIHZvaWQgc21ncnJlYWQoU01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9y a251bSwKIAkJCQkJIEJsb2NrTnVtYmVyIGJsb2NrbnVtLCB2b2lkICpidWZmZXIpOwogZXh0 ZXJuIHZvaWQgc21ncndyaXRlKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtu dW0sCiAJCQkJCSAgQmxvY2tOdW1iZXIgYmxvY2tudW0sIGNvbnN0IHZvaWQgKmJ1ZmZlciwg Ym9vbCBza2lwRnN5bmMpOworZXh0ZXJuIHZvaWQgc21ncmV4dGVuZChTTWdyUmVsYXRpb24g cmVsbiwgRm9ya051bWJlciBmb3JrbnVtLAorCQkJCQkgICBCbG9ja051bWJlciBibG9ja251 bSwgY29uc3Qgdm9pZCAqYnVmZmVyLCBib29sIHNraXBGc3luYyk7CitleHRlcm4gdm9pZCBz bWdyemVyb2V4dGVuZChTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtLAor CQkJCQkJICAgQmxvY2tOdW1iZXIgYmxvY2tudW0sIGludCBuYmxvY2tzLCBib29sIHNraXBG c3luYyk7CiBleHRlcm4gdm9pZCBzbWdyd3JpdGViYWNrKFNNZ3JSZWxhdGlvbiByZWxuLCBG b3JrTnVtYmVyIGZvcmtudW0sCiAJCQkJCQkgIEJsb2NrTnVtYmVyIGJsb2NrbnVtLCBCbG9j a051bWJlciBuYmxvY2tzKTsKIGV4dGVybiBCbG9ja051bWJlciBzbWdybmJsb2NrcyhTTWdy UmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtKTsKLS0gCjIuNDAuMQoK --------------HYvm3BBfHDVSMJ6vqyqP07Pt--