Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1to6uv-006DFn-OS for pgsql-hackers@arkaria.postgresql.org; Fri, 28 Feb 2025 20:25:07 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1to6uw-00FCNa-Pv for pgsql-hackers@arkaria.postgresql.org; Fri, 28 Feb 2025 20:25:05 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1to6uw-00FCHY-3e for pgsql-hackers@lists.postgresql.org; Fri, 28 Feb 2025 20:25:04 +0000 Received: from lahtoruutu.iki.fi ([2a0b:5c81:1c1::37]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1to6uq-000EeQ-20 for pgsql-hackers@postgresql.org; Fri, 28 Feb 2025 20:25:04 +0000 Received: from [192.168.1.112] (iptv-hkibng21-58c090-167.dhcp.inet.fi [88.192.144.167]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: hlinnaka) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4Z4KSn5G2yz4BKGs; Fri, 28 Feb 2025 22:24:57 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1740774299; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=zmFmwEdTiIH6clg5TuCWVZudweCUbk0tvgxqzqCVdS4=; b=IVUad+ALlHncMryM4+JnCqj8ltBXf92YWvYfHFQFcQMFC5J4SEaPiU9kHqR0+Cik8cPgyQ jHPQtSrUDqMbj+c0edAv7z2D6tMcwilnwYfsUT9ZnuL82XEOaor5hnEc9x4OdkDieLe83h 65Ht/ttYn1rX6I9tyU0JQTETuYiHHE4JcZBfYi9hMTL6d750zcOIoOReQxEDrHkoqiB2To E8syuIXeWA1nEu5U2p17ESxwrri7MpsWbd1B0YNhKGpi5GARaF7/8zDWV2S/aYdxKASidd 10EVV/cK6p5qVYmXf/vLueU2+rFxGy6MuUoyxQxp8aB2LIJxHdh15ElG+ADadA== ARC-Seal: i=1; s=lahtoruutu; d=iki.fi; t=1740774299; a=rsa-sha256; cv=none; b=r7PSA3EiF6ontmCTlYPdrqC7x3xxvw7bkfqLNJFvxh7cLWViwb0ini6OPSCKEWNBNsYiY7 ejMW6MXNxNjaPwdVIsykD2nvAuJEJSpfKT/g9AlP6bSb1j0Tn6hmBU+uKS43EOiD6y3N2f bqD43KLbNcmEkDCyHi2woAi5/koh35T4NQNwLhL8172sStPrQLRKq4/fXsJoDPpXKl7a+A 6zoHjq7JJKxFSFQQLOwgDM7c8exTdgPrO3s056NTmJiCc95vBupyy1I28zhFsc6rl14TAO e6PSCO8wrVwhmASb6wHKAjY3EGRtfoqBqEyIFmlctKpnAyGc4QwfhsUPNutDSw== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=hlinnaka smtp.mailfrom=hlinnaka@iki.fi ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1740774299; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=zmFmwEdTiIH6clg5TuCWVZudweCUbk0tvgxqzqCVdS4=; b=fyMZz5pq92oGASIGqswxnPBNsi/PqGo8di2dc3fLnqm8+eaignX2rvK9kyUDdeTt8Wsg+Q zKGl6m7ubwSaMdOohdbinQ6CxszYmV69F472pd1k6s9MfYLBBwpZodRyYeC5aEl+NtKZZh vw5xvXpSrDsGfzZ5k0hA7pajD++3UpSRAEOWRtrnpPjyVAVSlVSryGYx7gePK44ec9G47R DrFn5soIxllJD3Huwg8aLxiOZWnZSteH3hRRWKVxBEbPWzHeK3ilHt2oH0kM6E2rz/1f90 0gGL7BgB716Ff9MdDHzLBoxBqQ040rUgwQR2GfOXMw/oa+p1ynNm+sjMl2IU2w== Content-Type: multipart/mixed; boundary="------------mVkSiBgK9Ifd07vj1V0lbHJ9" Message-ID: <8a507fb6-df28-49d3-81a5-ede180d7f0fb@iki.fi> Date: Fri, 28 Feb 2025 22:24:56 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Interrupts vs signals To: Andres Freund Cc: Thomas Munro , Michael Paquier , Robert Haas , Fujii Masao , pgsql-hackers References: <8a0ff52f-de8e-49d2-a3af-ea5bc12f5b97@iki.fi> <4ddab51d-e932-40c5-b6fa-18c52db0e082@iki.fi> Content-Language: en-US From: Heikki Linnakangas In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------mVkSiBgK9Ifd07vj1V0lbHJ9 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 28/01/2025 19:01, Andres Freund wrote: > On 2024-12-02 16:39:28 +0200, Heikki Linnakangas wrote: >> This also moves the WaitEventSet functions to a different source file, >> waiteventset.c. This separates the platform-dependent code waiting and >> signalling code from the platform-independent parts. > > I think this should be split into a separate commit. It's painful to verify > that code-movement didn't change anything else if there's lots of other > changes in the same commit. Here's a patch set to do just that, split WaitEventSet stuff to a separate source file. That's actually a pretty nice separation even without any of the rest of the patches. I noticed that the ShutdownLatchSupport() function is unused. The first patch removes it. The second patch makes it possible to use ModifyWaitEvent() to switch between WL_POSTMASTER_DEATH and WL_EXIT_ON_PM_DEATH. WaitLatch() used to modify WaitEventSet->exit_on_postmaster_death directly, now it uses ModifyWaitEvent() for that. That's needed because with the final patch, WaitLatch() is in a different source file than WaitEventSet, so it cannot directly modify its field anymore. The third patch is mechanical and moves existing code. The file header comments in the modified files are perhaps worth reviewing. They are also just existing text moved around, but there was some small decisions on what exactly should go where. I'll continue working on the other parts, but these patches seems ready for commit already. -- Heikki Linnakangas Neon (https://neon.tech) --------------mVkSiBgK9Ifd07vj1V0lbHJ9 Content-Type: text/x-patch; charset=UTF-8; name="0001-Remove-unused-ShutdownLatchSupport-function.patch" Content-Disposition: attachment; filename="0001-Remove-unused-ShutdownLatchSupport-function.patch" Content-Transfer-Encoding: base64 RnJvbSA1NTQwYTYzNWYyMTk4YzQxYTI2ZjM4YTYwNTdiYmYxNDZiOTI5MWQzIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBIZWlra2kgTGlubmFrYW5nYXMgPGhlaWtraS5saW5u YWthbmdhc0Bpa2kuZmk+CkRhdGU6IEZyaSwgMjggRmViIDIwMjUgMTY6NTY6NDggKzAyMDAK U3ViamVjdDogW1BBVENIIDEvM10gUmVtb3ZlIHVudXNlZCBTaHV0ZG93bkxhdGNoU3VwcG9y dCgpIGZ1bmN0aW9uCgpUaGUgb25seSBjYWxsZXIgd2FzIHJlbW92ZWQgaW4gY29tbWl0IDgw YThmOTViM2IuIEkgZG9uJ3QgZm9yZXNlZQpuZWVkaW5nIGl0IGFueSB0aW1lIHNvb24sIGFu ZCBJJ20gd29ya2luZyBvbiBzb21lIGJpZyBjaGFuZ2VzIGluIHRoaXMKYXJlYSwgc28gbGV0 J3MgcmVtb3ZlIGl0IG91dCBvZiB0aGUgd2F5LgotLS0KIHNyYy9iYWNrZW5kL3N0b3JhZ2Uv aXBjL2xhdGNoLmMgfCAyNyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHNyYy9pbmNs dWRlL3N0b3JhZ2UvbGF0Y2guaCAgICAgfCAgMSAtCiAyIGZpbGVzIGNoYW5nZWQsIDI4IGRl bGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL2xhdGNo LmMgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9sYXRjaC5jCmluZGV4IDQ1NzI2ODRmMjI0 Li5jZDA5YTEwZjNkMSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvbGF0 Y2guYworKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9sYXRjaC5jCkBAIC0zNjAsMzMg KzM2MCw2IEBAIEluaXRpYWxpemVMYXRjaFdhaXRTZXQodm9pZCkKIAlBc3NlcnQobGF0Y2hf cG9zID09IExhdGNoV2FpdFNldExhdGNoUG9zKTsKIH0KIAotdm9pZAotU2h1dGRvd25MYXRj aFN1cHBvcnQodm9pZCkKLXsKLSNpZiBkZWZpbmVkKFdBSVRfVVNFX1BPTEwpCi0JcHFzaWdu YWwoU0lHVVJHLCBTSUdfSUdOKTsKLSNlbmRpZgotCi0JaWYgKExhdGNoV2FpdFNldCkKLQl7 Ci0JCUZyZWVXYWl0RXZlbnRTZXQoTGF0Y2hXYWl0U2V0KTsKLQkJTGF0Y2hXYWl0U2V0ID0g TlVMTDsKLQl9Ci0KLSNpZiBkZWZpbmVkKFdBSVRfVVNFX1NFTEZfUElQRSkKLQljbG9zZShz ZWxmcGlwZV9yZWFkZmQpOwotCWNsb3NlKHNlbGZwaXBlX3dyaXRlZmQpOwotCXNlbGZwaXBl X3JlYWRmZCA9IC0xOwotCXNlbGZwaXBlX3dyaXRlZmQgPSAtMTsKLQlzZWxmcGlwZV9vd25l cl9waWQgPSBJbnZhbGlkUGlkOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFdBSVRfVVNFX1NJ R05BTEZEKQotCWNsb3NlKHNpZ25hbF9mZCk7Ci0Jc2lnbmFsX2ZkID0gLTE7Ci0jZW5kaWYK LX0KLQogLyoKICAqIEluaXRpYWxpemUgYSBwcm9jZXNzLWxvY2FsIGxhdGNoLgogICovCmRp ZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9zdG9yYWdlL2xhdGNoLmggYi9zcmMvaW5jbHVkZS9z dG9yYWdlL2xhdGNoLmgKaW5kZXggYmY1NjgxMjRkZjkuLjY2ZTdhNWI3YzA4IDEwMDY0NAot LS0gYS9zcmMvaW5jbHVkZS9zdG9yYWdlL2xhdGNoLmgKKysrIGIvc3JjL2luY2x1ZGUvc3Rv cmFnZS9sYXRjaC5oCkBAIC0xNzMsNyArMTczLDYgQEAgZXh0ZXJuIHZvaWQgT3duTGF0Y2go TGF0Y2ggKmxhdGNoKTsKIGV4dGVybiB2b2lkIERpc293bkxhdGNoKExhdGNoICpsYXRjaCk7 CiBleHRlcm4gdm9pZCBTZXRMYXRjaChMYXRjaCAqbGF0Y2gpOwogZXh0ZXJuIHZvaWQgUmVz ZXRMYXRjaChMYXRjaCAqbGF0Y2gpOwotZXh0ZXJuIHZvaWQgU2h1dGRvd25MYXRjaFN1cHBv cnQodm9pZCk7CiAKIGV4dGVybiBXYWl0RXZlbnRTZXQgKkNyZWF0ZVdhaXRFdmVudFNldChS ZXNvdXJjZU93bmVyIHJlc293bmVyLCBpbnQgbmV2ZW50cyk7CiBleHRlcm4gdm9pZCBGcmVl V2FpdEV2ZW50U2V0KFdhaXRFdmVudFNldCAqc2V0KTsKLS0gCjIuMzkuNQoK --------------mVkSiBgK9Ifd07vj1V0lbHJ9 Content-Type: text/x-patch; charset=UTF-8; name="0002-Use-ModifyWaitEvent-to-update-exit_on_postmaster_dea.patch" Content-Disposition: attachment; filename*0="0002-Use-ModifyWaitEvent-to-update-exit_on_postmaster_dea.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSAyZTY1MjMwNDg1ZDg0YjY4NTg1OGMxOTZmNWQ2NGI4M2JmZTNiYjk0IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBIZWlra2kgTGlubmFrYW5nYXMgPGhlaWtraS5saW5u YWthbmdhc0Bpa2kuZmk+CkRhdGU6IEZyaSwgMjggRmViIDIwMjUgMjE6MTk6MDggKzAyMDAK U3ViamVjdDogW1BBVENIIDIvM10gVXNlIE1vZGlmeVdhaXRFdmVudCB0byB1cGRhdGUgZXhp dF9vbl9wb3N0bWFzdGVyX2RlYXRoCgpUaGlzIGlzIGluIHByZXBhcmF0aW9uIGZvciBzcGxp dHRpbmcgV2FpdEV2ZW50U2V0IHJlbGF0ZWQgZnVuY3Rpb25zIHRvCmEgc2VwYXJhdGUgc291 cmNlIGZpbGUuIFRoYXQgd2lsbCBoaWRlIHRoZSBkZXRhaWxzIG9mIFdhaXRFdmVudFNldApm cm9tIFdhaXRMYXRjaCwgc28gaXQgbXVzdCB1c2UgYW4gZXhwb3NlZCBmdW5jdGlvbiBpbnN0 ZWFkIG9mCm1vZGlmeWluZyBXYWl0RXZlbnRTZXQtPmV4aXRfb25fcG9zdG1hc3Rlcl9kZWF0 aCBkaXJlY3RseS4KLS0tCiBzcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9sYXRjaC5jIHwgNDIg KysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgMzAg aW5zZXJ0aW9ucygrKSwgMTIgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tl bmQvc3RvcmFnZS9pcGMvbGF0Y2guYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL2xhdGNo LmMKaW5kZXggY2QwOWExMGYzZDEuLmFiNjAxYzc0OGY4IDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC9zdG9yYWdlL2lwYy9sYXRjaC5jCisrKyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBj L2xhdGNoLmMKQEAgLTE1NCw4ICsxNTQsOSBAQCBzdHJ1Y3QgV2FpdEV2ZW50U2V0CiAvKiBB IGNvbW1vbiBXYWl0RXZlbnRTZXQgdXNlZCB0byBpbXBsZW1lbnQgV2FpdExhdGNoKCkgKi8K IHN0YXRpYyBXYWl0RXZlbnRTZXQgKkxhdGNoV2FpdFNldDsKIAotLyogVGhlIHBvc2l0aW9u IG9mIHRoZSBsYXRjaCBpbiBMYXRjaFdhaXRTZXQuICovCisvKiBUaGUgcG9zaXRpb25zIG9m IHRoZSBsYXRjaCBhbmQgUE0gZGVhdGggZXZlbnRzIGluIExhdGNoV2FpdFNldCAqLwogI2Rl ZmluZSBMYXRjaFdhaXRTZXRMYXRjaFBvcyAwCisjZGVmaW5lIExhdGNoV2FpdFNldFBvc3Rt YXN0ZXJEZWF0aFBvcyAxCiAKICNpZm5kZWYgV0lOMzIKIC8qIEFyZSB3ZSBjdXJyZW50bHkg aW4gV2FpdExhdGNoPyBUaGUgc2lnbmFsIGhhbmRsZXIgd291bGQgbGlrZSB0byBrbm93LiAq LwpAQCAtMzUzLDExICszNTQsMTggQEAgSW5pdGlhbGl6ZUxhdGNoV2FpdFNldCh2b2lkKQog CUxhdGNoV2FpdFNldCA9IENyZWF0ZVdhaXRFdmVudFNldChOVUxMLCAyKTsKIAlsYXRjaF9w b3MgPSBBZGRXYWl0RXZlbnRUb1NldChMYXRjaFdhaXRTZXQsIFdMX0xBVENIX1NFVCwgUEdJ TlZBTElEX1NPQ0tFVCwKIAkJCQkJCQkJICBNeUxhdGNoLCBOVUxMKTsKLQlpZiAoSXNVbmRl clBvc3RtYXN0ZXIpCi0JCUFkZFdhaXRFdmVudFRvU2V0KExhdGNoV2FpdFNldCwgV0xfRVhJ VF9PTl9QTV9ERUFUSCwKLQkJCQkJCSAgUEdJTlZBTElEX1NPQ0tFVCwgTlVMTCwgTlVMTCk7 Ci0KIAlBc3NlcnQobGF0Y2hfcG9zID09IExhdGNoV2FpdFNldExhdGNoUG9zKTsKKworCS8q CisJICogV2FpdExhdGNoIHdpbGwgbW9kaWZ5IHRoaXMgdG8gV0xfRVhJVF9PTl9QTV9ERUFU SCBvcgorCSAqIFdMX1BPU1RNQVNURVJfREVBVEggb24gZWFjaCBjYWxsLgorCSAqLworCWlm IChJc1VuZGVyUG9zdG1hc3RlcikKKwl7CisJCWxhdGNoX3BvcyA9IEFkZFdhaXRFdmVudFRv U2V0KExhdGNoV2FpdFNldCwgV0xfRVhJVF9PTl9QTV9ERUFUSCwKKwkJCQkJCQkJCSAgUEdJ TlZBTElEX1NPQ0tFVCwgTlVMTCwgTlVMTCk7CisJCUFzc2VydChsYXRjaF9wb3MgPT0gTGF0 Y2hXYWl0U2V0UG9zdG1hc3RlckRlYXRoUG9zKTsKKwl9CiB9CiAKIC8qCkBAIC01MDUsOCAr NTEzLDE0IEBAIFdhaXRMYXRjaChMYXRjaCAqbGF0Y2gsIGludCB3YWtlRXZlbnRzLCBsb25n IHRpbWVvdXQsCiAJaWYgKCEod2FrZUV2ZW50cyAmIFdMX0xBVENIX1NFVCkpCiAJCWxhdGNo ID0gTlVMTDsKIAlNb2RpZnlXYWl0RXZlbnQoTGF0Y2hXYWl0U2V0LCBMYXRjaFdhaXRTZXRM YXRjaFBvcywgV0xfTEFUQ0hfU0VULCBsYXRjaCk7Ci0JTGF0Y2hXYWl0U2V0LT5leGl0X29u X3Bvc3RtYXN0ZXJfZGVhdGggPQotCQkoKHdha2VFdmVudHMgJiBXTF9FWElUX09OX1BNX0RF QVRIKSAhPSAwKTsKKworCS8qCisJICogVXBkYXRlIHRoZSBldmVudCBzZXQgZm9yIHdoZXRo ZXIgV0xfRVhJVF9PTl9QTV9ERUFUSCBvcgorCSAqIFdMX1BPU1RNQVNURVJfREVBVEggd2Fz IHJlcXVlc3RlZC4gIFRoaXMgaXMgYWxzbyBjaGVhcC4KKwkgKi8KKwlNb2RpZnlXYWl0RXZl bnQoTGF0Y2hXYWl0U2V0LCBMYXRjaFdhaXRTZXRQb3N0bWFzdGVyRGVhdGhQb3MsCisJCQkJ CSh3YWtlRXZlbnRzICYgKFdMX0VYSVRfT05fUE1fREVBVEggfCBXTF9QT1NUTUFTVEVSX0RF QVRIKSksCisJCQkJCTApOwogCiAJaWYgKFdhaXRFdmVudFNldFdhaXQoTGF0Y2hXYWl0U2V0 LAogCQkJCQkJICh3YWtlRXZlbnRzICYgV0xfVElNRU9VVCkgPyB0aW1lb3V0IDogLTEsCkBA IC0xMDM3LDE1ICsxMDUxLDE5IEBAIE1vZGlmeVdhaXRFdmVudChXYWl0RXZlbnRTZXQgKnNl dCwgaW50IHBvcywgdWludDMyIGV2ZW50cywgTGF0Y2ggKmxhdGNoKQogCQkoIShldmVudC0+ ZXZlbnRzICYgV0xfTEFUQ0hfU0VUKSB8fCBzZXQtPmxhdGNoID09IGxhdGNoKSkKIAkJcmV0 dXJuOwogCi0JaWYgKGV2ZW50LT5ldmVudHMgJiBXTF9MQVRDSF9TRVQgJiYKLQkJZXZlbnRz ICE9IGV2ZW50LT5ldmVudHMpCisJLyogQWxsb3cgc3dpdGNoaW5nIGJldHdlZW4gV0xfUE9T VE1BU1RFUl9ERUFUSCBhbmQgV0xfRVhJVF9PTl9QTV9ERUFUSCAqLworCWlmIChldmVudC0+ ZXZlbnRzICYgV0xfUE9TVE1BU1RFUl9ERUFUSCkKIAl7Ci0JCWVsb2coRVJST1IsICJjYW5u b3QgbW9kaWZ5IGxhdGNoIGV2ZW50Iik7CisJCWlmIChldmVudHMgIT0gV0xfUE9TVE1BU1RF Ul9ERUFUSCAmJiBldmVudHMgIT0gV0xfRVhJVF9PTl9QTV9ERUFUSCkKKwkJCWVsb2coRVJS T1IsICJjYW5ub3QgbW9kaWZ5IHBvc3RtYXN0ZXIgZGVhdGggZXZlbnQiKTsKKwkJc2V0LT5l eGl0X29uX3Bvc3RtYXN0ZXJfZGVhdGggPSAoKGV2ZW50cyAmIFdMX0VYSVRfT05fUE1fREVB VEgpICE9IDApOworCQlyZXR1cm47CiAJfQogCi0JaWYgKGV2ZW50LT5ldmVudHMgJiBXTF9Q T1NUTUFTVEVSX0RFQVRIKQorCWlmIChldmVudC0+ZXZlbnRzICYgV0xfTEFUQ0hfU0VUICYm CisJCWV2ZW50cyAhPSBldmVudC0+ZXZlbnRzKQogCXsKLQkJZWxvZyhFUlJPUiwgImNhbm5v dCBtb2RpZnkgcG9zdG1hc3RlciBkZWF0aCBldmVudCIpOworCQllbG9nKEVSUk9SLCAiY2Fu bm90IG1vZGlmeSBsYXRjaCBldmVudCIpOwogCX0KIAogCS8qIEZJWE1FOiB2YWxpZGF0ZSBl dmVudCBtYXNrICovCi0tIAoyLjM5LjUKCg== --------------mVkSiBgK9Ifd07vj1V0lbHJ9 Content-Type: text/x-patch; charset=UTF-8; name="0003-Split-WaitEventSet-functions-to-separate-source-file.patch" Content-Disposition: attachment; filename*0="0003-Split-WaitEventSet-functions-to-separate-source-file.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA3YmQwZDJmOThhMWI5ZDdhZDQwZjNmNzJjZDFjOTM0MzBjMWQ3Y2VlIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBIZWlra2kgTGlubmFrYW5nYXMgPGhlaWtraS5saW5u YWthbmdhc0Bpa2kuZmk+CkRhdGU6IEZyaSwgMjggRmViIDIwMjUgMTY6NDI6MTUgKzAyMDAK U3ViamVjdDogW1BBVENIIDMvM10gU3BsaXQgV2FpdEV2ZW50U2V0IGZ1bmN0aW9ucyB0byBz ZXBhcmF0ZSBzb3VyY2UgZmlsZQoKbGF0Y2guYyBub3cgb25seSBjb250YWlucyB0aGUgTGF0 Y2ggcmVsYXRlZCBmdW5jdGlvbnMsIHdoaWNoIGJ1aWxkIG9uCnRoZSBXYWl0RXZlbnRTZXQg YWJzdHJhY3Rpb24uIE1vc3Qgb2YgdGhlIHBsYXRmb3JtLWRlcGVuZGVudCBzdHVmZiBpcwpu b3cgaW4gd2FpdGV2ZW50c2V0LmMuCi0tLQogc3JjL2JhY2tlbmQvbGlicHEvcHFzaWduYWwu YyAgICAgICAgICAgfCAgICAyICstCiBzcmMvYmFja2VuZC9wb3N0bWFzdGVyL3Bvc3RtYXN0 ZXIuYyAgICB8ICAgIDIgKy0KIHNyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL01ha2VmaWxlICAg ICAgIHwgICAgMyArLQogc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvbGF0Y2guYyAgICAgICAg fCAxOTk5ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzcmMvYmFja2VuZC9zdG9yYWdlL2lw Yy9tZXNvbi5idWlsZCAgICB8ICAgIDEgKwogc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvd2Fp dGV2ZW50c2V0LmMgfCAyMDMzICsrKysrKysrKysrKysrKysrKysrKysrKwogc3JjL2JhY2tl bmQvdXRpbHMvaW5pdC9taXNjaW5pdC5jICAgICAgfCAgICA0ICstCiBzcmMvaW5jbHVkZS9z dG9yYWdlL2xhdGNoLmggICAgICAgICAgICB8ICAgNjYgKy0KIHNyYy9pbmNsdWRlL3N0b3Jh Z2Uvd2FpdGV2ZW50c2V0LmggICAgIHwgICA5NSArKwogOSBmaWxlcyBjaGFuZ2VkLCAyMTQ5 IGluc2VydGlvbnMoKyksIDIwNTYgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQg c3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvd2FpdGV2ZW50c2V0LmMKIGNyZWF0ZSBtb2RlIDEw MDY0NCBzcmMvaW5jbHVkZS9zdG9yYWdlL3dhaXRldmVudHNldC5oCgpkaWZmIC0tZ2l0IGEv c3JjL2JhY2tlbmQvbGlicHEvcHFzaWduYWwuYyBiL3NyYy9iYWNrZW5kL2xpYnBxL3Bxc2ln bmFsLmMKaW5kZXggMTc0MmU5MGVhOWUuLmQ4NjYzMDdhNGRjIDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC9saWJwcS9wcXNpZ25hbC5jCisrKyBiL3NyYy9iYWNrZW5kL2xpYnBxL3Bxc2ln bmFsLmMKQEAgLTQyLDcgKzQyLDcgQEAgcHFpbml0bWFzayh2b2lkKQogewogCXNpZ2VtcHR5 c2V0KCZVbkJsb2NrU2lnKTsKIAotCS8qIE5vdGU6IEluaXRpYWxpemVMYXRjaFN1cHBvcnQo KSBtb2RpZmllcyBVbkJsb2NrU2lnLiAqLworCS8qIE5vdGU6IEluaXRpYWxpemVXYWl0RXZl bnRTdXBwb3J0KCkgbW9kaWZpZXMgVW5CbG9ja1NpZy4gKi8KIAogCS8qIEZpcnN0IHNldCBh bGwgc2lnbmFscywgdGhlbiBjbGVhciBzb21lLiAqLwogCXNpZ2ZpbGxzZXQoJkJsb2NrU2ln KTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvcG9zdG1hc3Rlci5jIGIv c3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9wb3N0bWFzdGVyLmMKaW5kZXggNWRkM2I2YTRmZDQu LmQyYTdhN2FkZDZmIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL3Bvc3Rt YXN0ZXIuYworKysgYi9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL3Bvc3RtYXN0ZXIuYwpAQCAt NTQ4LDcgKzU0OCw3IEBAIFBvc3RtYXN0ZXJNYWluKGludCBhcmdjLCBjaGFyICphcmd2W10p CiAJcHFzaWduYWwoU0lHQ0hMRCwgaGFuZGxlX3BtX2NoaWxkX2V4aXRfc2lnbmFsKTsKIAog CS8qIFRoaXMgbWF5IGNvbmZpZ3VyZSBTSUdVUkcsIGRlcGVuZGluZyBvbiBwbGF0Zm9ybS4g Ki8KLQlJbml0aWFsaXplTGF0Y2hTdXBwb3J0KCk7CisJSW5pdGlhbGl6ZVdhaXRFdmVudFN1 cHBvcnQoKTsKIAlJbml0UHJvY2Vzc0xvY2FsTGF0Y2goKTsKIAogCS8qCmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9NYWtlZmlsZSBiL3NyYy9iYWNrZW5kL3N0b3Jh Z2UvaXBjL01ha2VmaWxlCmluZGV4IGQ4YTE2NTNlYjZhLi45YTA3ZjZlMWQ5MiAxMDA2NDQK LS0tIGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvTWFrZWZpbGUKKysrIGIvc3JjL2JhY2tl bmQvc3RvcmFnZS9pcGMvTWFrZWZpbGUKQEAgLTI1LDYgKzI1LDcgQEAgT0JKUyA9IFwKIAlz aWduYWxmdW5jcy5vIFwKIAlzaW52YWwubyBcCiAJc2ludmFsYWR0Lm8gXAotCXN0YW5kYnku bworCXN0YW5kYnkubyBcCisJd2FpdGV2ZW50c2V0Lm8KIAogaW5jbHVkZSAkKHRvcF9zcmNk aXIpL3NyYy9iYWNrZW5kL2NvbW1vbi5tawpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3Rv cmFnZS9pcGMvbGF0Y2guYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL2xhdGNoLmMKaW5k ZXggYWI2MDFjNzQ4ZjguLmFhZTBjZjc1NzdkIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9z dG9yYWdlL2lwYy9sYXRjaC5jCisrKyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL2xhdGNo LmMKQEAgLTMsMjUgKzMsMTAgQEAKICAqIGxhdGNoLmMKICAqCSAgUm91dGluZXMgZm9yIGlu dGVyLXByb2Nlc3MgbGF0Y2hlcwogICoKLSAqIFRoZSBwb2xsKCkgaW1wbGVtZW50YXRpb24g dXNlcyB0aGUgc28tY2FsbGVkIHNlbGYtcGlwZSB0cmljayB0byBvdmVyY29tZSB0aGUKLSAq IHJhY2UgY29uZGl0aW9uIGludm9sdmVkIHdpdGggcG9sbCgpIGFuZCBzZXR0aW5nIGEgZ2xv YmFsIGZsYWcgaW4gdGhlIHNpZ25hbAotICogaGFuZGxlci4gV2hlbiBhIGxhdGNoIGlzIHNl dCBhbmQgdGhlIGN1cnJlbnQgcHJvY2VzcyBpcyB3YWl0aW5nIGZvciBpdCwgdGhlCi0gKiBz aWduYWwgaGFuZGxlciB3YWtlcyB1cCB0aGUgcG9sbCgpIGluIFdhaXRMYXRjaCBieSB3cml0 aW5nIGEgYnl0ZSB0byBhIHBpcGUuCi0gKiBBIHNpZ25hbCBieSBpdHNlbGYgZG9lc24ndCBp bnRlcnJ1cHQgcG9sbCgpIG9uIGFsbCBwbGF0Zm9ybXMsIGFuZCBldmVuIG9uCi0gKiBwbGF0 Zm9ybXMgd2hlcmUgaXQgZG9lcywgYSBzaWduYWwgdGhhdCBhcnJpdmVzIGp1c3QgYmVmb3Jl IHRoZSBwb2xsKCkgY2FsbAotICogZG9lcyBub3QgcHJldmVudCBwb2xsKCkgZnJvbSBlbnRl cmluZyBzbGVlcC4gQW4gaW5jb21pbmcgYnl0ZSBvbiBhIHBpcGUKLSAqIGhvd2V2ZXIgcmVs aWFibHkgaW50ZXJydXB0cyB0aGUgc2xlZXAsIGFuZCBjYXVzZXMgcG9sbCgpIHRvIHJldHVy bgotICogaW1tZWRpYXRlbHkgZXZlbiBpZiB0aGUgc2lnbmFsIGFycml2ZXMgYmVmb3JlIHBv bGwoKSBiZWdpbnMuCi0gKgotICogVGhlIGVwb2xsKCkgaW1wbGVtZW50YXRpb24gb3ZlcmNv bWVzIHRoZSByYWNlIHdpdGggYSBkaWZmZXJlbnQgdGVjaG5pcXVlOiBpdAotICoga2VlcHMg U0lHVVJHIGJsb2NrZWQgYW5kIGNvbnN1bWVzIGZyb20gYSBzaWduYWxmZCgpIGRlc2NyaXB0 b3IgaW5zdGVhZC4gIFdlCi0gKiBkb24ndCBuZWVkIHRvIHJlZ2lzdGVyIGEgc2lnbmFsIGhh bmRsZXIgb3IgY3JlYXRlIG91ciBvd24gc2VsZi1waXBlLiAgV2UKLSAqIGFzc3VtZSB0aGF0 IGFueSBzeXN0ZW0gdGhhdCBoYXMgTGludXggZXBvbGwoKSBhbHNvIGhhcyBMaW51eCBzaWdu YWxmZCgpLgotICoKLSAqIFRoZSBrcXVldWUoKSBpbXBsZW1lbnRhdGlvbiB3YWl0cyBmb3Ig U0lHVVJHIHdpdGggRVZGSUxUX1NJR05BTC4KLSAqCi0gKiBUaGUgV2luZG93cyBpbXBsZW1l bnRhdGlvbiB1c2VzIFdpbmRvd3MgZXZlbnRzIHRoYXQgYXJlIGluaGVyaXRlZCBieSBhbGwK LSAqIHBvc3RtYXN0ZXIgY2hpbGQgcHJvY2Vzc2VzLiBUaGVyZSdzIG5vIG5lZWQgZm9yIHRo ZSBzZWxmLXBpcGUgdHJpY2sgdGhlcmUuCisgKiBUaGUgbGF0Y2ggaW50ZXJmYWNlIGlzIGEg cmVsaWFibGUgcmVwbGFjZW1lbnQgZm9yIHRoZSBjb21tb24gcGF0dGVybiBvZgorICogdXNp bmcgcGdfdXNsZWVwKCkgb3Igc2VsZWN0KCkgdG8gd2FpdCB1bnRpbCBhIHNpZ25hbCBhcnJp dmVzLCB3aGVyZSB0aGUKKyAqIHNpZ25hbCBoYW5kbGVyIHNldHMgYSBmbGFnIHZhcmlhYmxl LiAgU2VlIGxhdGNoLmggZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqIG9uIGhvdyB0byB1c2Ug dGhlbS4KICAqCiAgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTYtMjAyNSwgUG9zdGdy ZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKICAqIFBvcnRpb25zIENvcHlyaWdodCAo YykgMTk5NCwgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCkBAIC0z MywxMjQgKzE4LDEyIEBACiAgKi8KICNpbmNsdWRlICJwb3N0Z3Jlcy5oIgogCi0jaW5jbHVk ZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4K LSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpZmRlZiBIQVZFX1NZU19FUE9MTF9ICi0jaW5jbHVk ZSA8c3lzL2Vwb2xsLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19FVkVOVF9ICi0jaW5j bHVkZSA8c3lzL2V2ZW50Lmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19TSUdOQUxGRF9I Ci0jaW5jbHVkZSA8c3lzL3NpZ25hbGZkLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1BPTExf SAotI2luY2x1ZGUgPHBvbGwuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGlicHEvcHFzaWdu YWwuaCIKICNpbmNsdWRlICJtaXNjYWRtaW4uaCIKLSNpbmNsdWRlICJwZ3N0YXQuaCIKICNp bmNsdWRlICJwb3J0L2F0b21pY3MuaCIKLSNpbmNsdWRlICJwb3J0YWJpbGl0eS9pbnN0cl90 aW1lLmgiCi0jaW5jbHVkZSAicG9zdG1hc3Rlci9wb3N0bWFzdGVyLmgiCi0jaW5jbHVkZSAi c3RvcmFnZS9mZC5oIgotI2luY2x1ZGUgInN0b3JhZ2UvaXBjLmgiCiAjaW5jbHVkZSAic3Rv cmFnZS9sYXRjaC5oIgotI2luY2x1ZGUgInN0b3JhZ2UvcG1zaWduYWwuaCIKLSNpbmNsdWRl ICJ1dGlscy9tZW11dGlscy5oIgorI2luY2x1ZGUgInN0b3JhZ2Uvd2FpdGV2ZW50c2V0Lmgi CiAjaW5jbHVkZSAidXRpbHMvcmVzb3duZXIuaCIKIAotLyoKLSAqIFNlbGVjdCB0aGUgZmQg cmVhZGluZXNzIHByaW1pdGl2ZSB0byB1c2UuIE5vcm1hbGx5IHRoZSAibW9zdCBtb2Rlcm4i Ci0gKiBwcmltaXRpdmUgc3VwcG9ydGVkIGJ5IHRoZSBPUyB3aWxsIGJlIHVzZWQsIGJ1dCBm b3IgdGVzdGluZyBpdCBjYW4gYmUKLSAqIHVzZWZ1bCB0byBtYW51YWxseSBzcGVjaWZ5IHRo ZSB1c2VkIHByaW1pdGl2ZS4gIElmIGRlc2lyZWQsIGp1c3QgYWRkIGEKLSAqIGRlZmluZSBz b21ld2hlcmUgYmVmb3JlIHRoaXMgYmxvY2suCi0gKi8KLSNpZiBkZWZpbmVkKFdBSVRfVVNF X0VQT0xMKSB8fCBkZWZpbmVkKFdBSVRfVVNFX1BPTEwpIHx8IFwKLQlkZWZpbmVkKFdBSVRf VVNFX0tRVUVVRSkgfHwgZGVmaW5lZChXQUlUX1VTRV9XSU4zMikKLS8qIGRvbid0IG92ZXJ3 cml0ZSBtYW51YWwgY2hvaWNlICovCi0jZWxpZiBkZWZpbmVkKEhBVkVfU1lTX0VQT0xMX0gp Ci0jZGVmaW5lIFdBSVRfVVNFX0VQT0xMCi0jZWxpZiBkZWZpbmVkKEhBVkVfS1FVRVVFKQot I2RlZmluZSBXQUlUX1VTRV9LUVVFVUUKLSNlbGlmIGRlZmluZWQoSEFWRV9QT0xMKQotI2Rl ZmluZSBXQUlUX1VTRV9QT0xMCi0jZWxpZiBXSU4zMgotI2RlZmluZSBXQUlUX1VTRV9XSU4z MgotI2Vsc2UKLSNlcnJvciAibm8gd2FpdCBzZXQgaW1wbGVtZW50YXRpb24gYXZhaWxhYmxl IgotI2VuZGlmCi0KLS8qCi0gKiBCeSBkZWZhdWx0LCB3ZSB1c2UgYSBzZWxmLXBpcGUgd2l0 aCBwb2xsKCkgYW5kIGEgc2lnbmFsZmQgd2l0aCBlcG9sbCgpLCBpZgotICogYXZhaWxhYmxl LiAgRm9yIHRlc3RpbmcgdGhlIGNob2ljZSBjYW4gYWxzbyBiZSBtYW51YWxseSBzcGVjaWZp ZWQuCi0gKi8KLSNpZiBkZWZpbmVkKFdBSVRfVVNFX1BPTEwpIHx8IGRlZmluZWQoV0FJVF9V U0VfRVBPTEwpCi0jaWYgZGVmaW5lZChXQUlUX1VTRV9TRUxGX1BJUEUpIHx8IGRlZmluZWQo V0FJVF9VU0VfU0lHTkFMRkQpCi0vKiBkb24ndCBvdmVyd3JpdGUgbWFudWFsIGNob2ljZSAq LwotI2VsaWYgZGVmaW5lZChXQUlUX1VTRV9FUE9MTCkgJiYgZGVmaW5lZChIQVZFX1NZU19T SUdOQUxGRF9IKQotI2RlZmluZSBXQUlUX1VTRV9TSUdOQUxGRAotI2Vsc2UKLSNkZWZpbmUg V0FJVF9VU0VfU0VMRl9QSVBFCi0jZW5kaWYKLSNlbmRpZgotCi0vKiB0eXBlZGVmIGluIGxh dGNoLmggKi8KLXN0cnVjdCBXYWl0RXZlbnRTZXQKLXsKLQlSZXNvdXJjZU93bmVyIG93bmVy OwotCi0JaW50CQkJbmV2ZW50czsJCS8qIG51bWJlciBvZiByZWdpc3RlcmVkIGV2ZW50cyAq LwotCWludAkJCW5ldmVudHNfc3BhY2U7CS8qIG1heGltdW0gbnVtYmVyIG9mIGV2ZW50cyBp biB0aGlzIHNldCAqLwotCi0JLyoKLQkgKiBBcnJheSwgb2YgbmV2ZW50c19zcGFjZSBsZW5n dGgsIHN0b3JpbmcgdGhlIGRlZmluaXRpb24gb2YgZXZlbnRzIHRoaXMKLQkgKiBzZXQgaXMg d2FpdGluZyBmb3IuCi0JICovCi0JV2FpdEV2ZW50ICAqZXZlbnRzOwotCi0JLyoKLQkgKiBJ ZiBXTF9MQVRDSF9TRVQgaXMgc3BlY2lmaWVkIGluIGFueSB3YWl0IGV2ZW50LCBsYXRjaCBp cyBhIHBvaW50ZXIgdG8KLQkgKiBzYWlkIGxhdGNoLCBhbmQgbGF0Y2hfcG9zIHRoZSBvZmZz ZXQgaW4gdGhlIC0+ZXZlbnRzIGFycmF5LiBUaGlzIGlzCi0JICogdXNlZnVsIGJlY2F1c2Ug d2UgY2hlY2sgdGhlIHN0YXRlIG9mIHRoZSBsYXRjaCBiZWZvcmUgcGVyZm9ybWluZyBkb2lu ZwotCSAqIHN5c2NhbGxzIHJlbGF0ZWQgdG8gd2FpdGluZy4KLQkgKi8KLQlMYXRjaAkgICAq bGF0Y2g7Ci0JaW50CQkJbGF0Y2hfcG9zOwotCi0JLyoKLQkgKiBXTF9FWElUX09OX1BNX0RF QVRIIGlzIGNvbnZlcnRlZCB0byBXTF9QT1NUTUFTVEVSX0RFQVRILCBidXQgdGhpcyBmbGFn Ci0JICogaXMgc2V0IHNvIHRoYXQgd2UnbGwgZXhpdCBpbW1lZGlhdGVseSBpZiBwb3N0bWFz dGVyIGRlYXRoIGlzIGRldGVjdGVkLAotCSAqIGluc3RlYWQgb2YgcmV0dXJuaW5nLgotCSAq LwotCWJvb2wJCWV4aXRfb25fcG9zdG1hc3Rlcl9kZWF0aDsKLQotI2lmIGRlZmluZWQoV0FJ VF9VU0VfRVBPTEwpCi0JaW50CQkJZXBvbGxfZmQ7Ci0JLyogZXBvbGxfd2FpdCByZXR1cm5z IGV2ZW50cyBpbiBhIHVzZXIgcHJvdmlkZWQgYXJyYXlzLCBhbGxvY2F0ZSBvbmNlICovCi0J c3RydWN0IGVwb2xsX2V2ZW50ICplcG9sbF9yZXRfZXZlbnRzOwotI2VsaWYgZGVmaW5lZChX QUlUX1VTRV9LUVVFVUUpCi0JaW50CQkJa3F1ZXVlX2ZkOwotCS8qIGtldmVudCByZXR1cm5z IGV2ZW50cyBpbiBhIHVzZXIgcHJvdmlkZWQgYXJyYXlzLCBhbGxvY2F0ZSBvbmNlICovCi0J c3RydWN0IGtldmVudCAqa3F1ZXVlX3JldF9ldmVudHM7Ci0JYm9vbAkJcmVwb3J0X3Bvc3Rt YXN0ZXJfbm90X3J1bm5pbmc7Ci0jZWxpZiBkZWZpbmVkKFdBSVRfVVNFX1BPTEwpCi0JLyog cG9sbCBleHBlY3RzIGV2ZW50cyB0byBiZSB3YWl0ZWQgb24gZXZlcnkgcG9sbCgpIGNhbGws IHByZXBhcmUgb25jZSAqLwotCXN0cnVjdCBwb2xsZmQgKnBvbGxmZHM7Ci0jZWxpZiBkZWZp bmVkKFdBSVRfVVNFX1dJTjMyKQotCi0JLyoKLQkgKiBBcnJheSBvZiB3aW5kb3dzIGV2ZW50 cy4gVGhlIGZpcnN0IGVsZW1lbnQgYWx3YXlzIGNvbnRhaW5zCi0JICogcGd3aW4zMl9zaWdu YWxfZXZlbnQsIHNvIHRoZSByZW1haW5pbmcgZWxlbWVudHMgYXJlIG9mZnNldCBieSBvbmUg KGkuZS4KLQkgKiBldmVudC0+cG9zICsgMSkuCi0JICovCi0JSEFORExFCSAgICpoYW5kbGVz OwotI2VuZGlmCi19OwotCiAvKiBBIGNvbW1vbiBXYWl0RXZlbnRTZXQgdXNlZCB0byBpbXBs ZW1lbnQgV2FpdExhdGNoKCkgKi8KIHN0YXRpYyBXYWl0RXZlbnRTZXQgKkxhdGNoV2FpdFNl dDsKIApAQCAtMTU4LDE5MSArMzEsNiBAQCBzdGF0aWMgV2FpdEV2ZW50U2V0ICpMYXRjaFdh aXRTZXQ7CiAjZGVmaW5lIExhdGNoV2FpdFNldExhdGNoUG9zIDAKICNkZWZpbmUgTGF0Y2hX YWl0U2V0UG9zdG1hc3RlckRlYXRoUG9zIDEKIAotI2lmbmRlZiBXSU4zMgotLyogQXJlIHdl IGN1cnJlbnRseSBpbiBXYWl0TGF0Y2g/IFRoZSBzaWduYWwgaGFuZGxlciB3b3VsZCBsaWtl IHRvIGtub3cuICovCi1zdGF0aWMgdm9sYXRpbGUgc2lnX2F0b21pY190IHdhaXRpbmcgPSBm YWxzZTsKLSNlbmRpZgotCi0jaWZkZWYgV0FJVF9VU0VfU0lHTkFMRkQKLS8qIE9uIExpbnV4 LCB3ZSdsbCByZWNlaXZlIFNJR1VSRyB2aWEgYSBzaWduYWxmZCBmaWxlIGRlc2NyaXB0b3Iu ICovCi1zdGF0aWMgaW50CXNpZ25hbF9mZCA9IC0xOwotI2VuZGlmCi0KLSNpZmRlZiBXQUlU X1VTRV9TRUxGX1BJUEUKLS8qIFJlYWQgYW5kIHdyaXRlIGVuZHMgb2YgdGhlIHNlbGYtcGlw ZSAqLwotc3RhdGljIGludAlzZWxmcGlwZV9yZWFkZmQgPSAtMTsKLXN0YXRpYyBpbnQJc2Vs ZnBpcGVfd3JpdGVmZCA9IC0xOwotCi0vKiBQcm9jZXNzIG93bmluZyB0aGUgc2VsZi1waXBl IC0tLSBuZWVkZWQgZm9yIGNoZWNraW5nIHB1cnBvc2VzICovCi1zdGF0aWMgaW50CXNlbGZw aXBlX293bmVyX3BpZCA9IDA7Ci0KLS8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAq Lwotc3RhdGljIHZvaWQgbGF0Y2hfc2lndXJnX2hhbmRsZXIoU0lHTkFMX0FSR1MpOwotc3Rh dGljIHZvaWQgc2VuZFNlbGZQaXBlQnl0ZSh2b2lkKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5l ZChXQUlUX1VTRV9TRUxGX1BJUEUpIHx8IGRlZmluZWQoV0FJVF9VU0VfU0lHTkFMRkQpCi1z dGF0aWMgdm9pZCBkcmFpbih2b2lkKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChXQUlUX1VT RV9FUE9MTCkKLXN0YXRpYyB2b2lkIFdhaXRFdmVudEFkanVzdEVwb2xsKFdhaXRFdmVudFNl dCAqc2V0LCBXYWl0RXZlbnQgKmV2ZW50LCBpbnQgYWN0aW9uKTsKLSNlbGlmIGRlZmluZWQo V0FJVF9VU0VfS1FVRVVFKQotc3RhdGljIHZvaWQgV2FpdEV2ZW50QWRqdXN0S3F1ZXVlKFdh aXRFdmVudFNldCAqc2V0LCBXYWl0RXZlbnQgKmV2ZW50LCBpbnQgb2xkX2V2ZW50cyk7Ci0j ZWxpZiBkZWZpbmVkKFdBSVRfVVNFX1BPTEwpCi1zdGF0aWMgdm9pZCBXYWl0RXZlbnRBZGp1 c3RQb2xsKFdhaXRFdmVudFNldCAqc2V0LCBXYWl0RXZlbnQgKmV2ZW50KTsKLSNlbGlmIGRl ZmluZWQoV0FJVF9VU0VfV0lOMzIpCi1zdGF0aWMgdm9pZCBXYWl0RXZlbnRBZGp1c3RXaW4z MihXYWl0RXZlbnRTZXQgKnNldCwgV2FpdEV2ZW50ICpldmVudCk7Ci0jZW5kaWYKLQotc3Rh dGljIGlubGluZSBpbnQgV2FpdEV2ZW50U2V0V2FpdEJsb2NrKFdhaXRFdmVudFNldCAqc2V0 LCBpbnQgY3VyX3RpbWVvdXQsCi0JCQkJCQkJCQkJV2FpdEV2ZW50ICpvY2N1cnJlZF9ldmVu dHMsIGludCBuZXZlbnRzKTsKLQotLyogUmVzb3VyY2VPd25lciBzdXBwb3J0IHRvIGhvbGQg V2FpdEV2ZW50U2V0cyAqLwotc3RhdGljIHZvaWQgUmVzT3duZXJSZWxlYXNlV2FpdEV2ZW50 U2V0KERhdHVtIHJlcyk7Ci0KLXN0YXRpYyBjb25zdCBSZXNvdXJjZU93bmVyRGVzYyB3YWl0 X2V2ZW50X3NldF9yZXNvd25lcl9kZXNjID0KLXsKLQkubmFtZSA9ICJXYWl0RXZlbnRTZXQi LAotCS5yZWxlYXNlX3BoYXNlID0gUkVTT1VSQ0VfUkVMRUFTRV9BRlRFUl9MT0NLUywKLQku cmVsZWFzZV9wcmlvcml0eSA9IFJFTEVBU0VfUFJJT19XQUlURVZFTlRTRVRTLAotCS5SZWxl YXNlUmVzb3VyY2UgPSBSZXNPd25lclJlbGVhc2VXYWl0RXZlbnRTZXQsCi0JLkRlYnVnUHJp bnQgPSBOVUxMCi19OwotCi0vKiBDb252ZW5pZW5jZSB3cmFwcGVycyBvdmVyIFJlc291cmNl T3duZXJSZW1lbWJlci9Gb3JnZXQgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotUmVzb3VyY2VP d25lclJlbWVtYmVyV2FpdEV2ZW50U2V0KFJlc291cmNlT3duZXIgb3duZXIsIFdhaXRFdmVu dFNldCAqc2V0KQotewotCVJlc291cmNlT3duZXJSZW1lbWJlcihvd25lciwgUG9pbnRlckdl dERhdHVtKHNldCksICZ3YWl0X2V2ZW50X3NldF9yZXNvd25lcl9kZXNjKTsKLX0KLXN0YXRp YyBpbmxpbmUgdm9pZAotUmVzb3VyY2VPd25lckZvcmdldFdhaXRFdmVudFNldChSZXNvdXJj ZU93bmVyIG93bmVyLCBXYWl0RXZlbnRTZXQgKnNldCkKLXsKLQlSZXNvdXJjZU93bmVyRm9y Z2V0KG93bmVyLCBQb2ludGVyR2V0RGF0dW0oc2V0KSwgJndhaXRfZXZlbnRfc2V0X3Jlc293 bmVyX2Rlc2MpOwotfQotCi0KLS8qCi0gKiBJbml0aWFsaXplIHRoZSBwcm9jZXNzLWxvY2Fs IGxhdGNoIGluZnJhc3RydWN0dXJlLgotICoKLSAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgb25j ZSBkdXJpbmcgc3RhcnR1cCBvZiBhbnkgcHJvY2VzcyB0aGF0IGNhbiB3YWl0IG9uCi0gKiBs YXRjaGVzLCBiZWZvcmUgaXQgaXNzdWVzIGFueSBJbml0TGF0Y2goKSBvciBPd25MYXRjaCgp IGNhbGxzLgotICovCi12b2lkCi1Jbml0aWFsaXplTGF0Y2hTdXBwb3J0KHZvaWQpCi17Ci0j aWYgZGVmaW5lZChXQUlUX1VTRV9TRUxGX1BJUEUpCi0JaW50CQkJcGlwZWZkWzJdOwotCi0J aWYgKElzVW5kZXJQb3N0bWFzdGVyKQotCXsKLQkJLyoKLQkJICogV2UgbWlnaHQgaGF2ZSBp bmhlcml0ZWQgY29ubmVjdGlvbnMgdG8gYSBzZWxmLXBpcGUgY3JlYXRlZCBieSB0aGUKLQkJ ICogcG9zdG1hc3Rlci4gIEl0J3MgY3JpdGljYWwgdGhhdCBjaGlsZCBwcm9jZXNzZXMgY3Jl YXRlIHRoZWlyIG93bgotCQkgKiBzZWxmLXBpcGVzLCBvZiBjb3Vyc2UsIGFuZCB3ZSByZWFs bHkgd2FudCB0aGVtIHRvIGNsb3NlIHRoZQotCQkgKiBpbmhlcml0ZWQgRkRzIGZvciBzYWZl dHkncyBzYWtlLgotCQkgKi8KLQkJaWYgKHNlbGZwaXBlX293bmVyX3BpZCAhPSAwKQotCQl7 Ci0JCQkvKiBBc3NlcnQgd2UgZ28gdGhyb3VnaCBoZXJlIGJ1dCBvbmNlIGluIGEgY2hpbGQg cHJvY2VzcyAqLwotCQkJQXNzZXJ0KHNlbGZwaXBlX293bmVyX3BpZCAhPSBNeVByb2NQaWQp OwotCQkJLyogUmVsZWFzZSBwb3N0bWFzdGVyJ3MgcGlwZSBGRHM7IGlnbm9yZSBhbnkgZXJy b3IgKi8KLQkJCSh2b2lkKSBjbG9zZShzZWxmcGlwZV9yZWFkZmQpOwotCQkJKHZvaWQpIGNs b3NlKHNlbGZwaXBlX3dyaXRlZmQpOwotCQkJLyogQ2xlYW4gdXAsIGp1c3QgZm9yIHNhZmV0 eSdzIHNha2U7IHdlJ2xsIHNldCB0aGVzZSBiZWxvdyAqLwotCQkJc2VsZnBpcGVfcmVhZGZk ID0gc2VsZnBpcGVfd3JpdGVmZCA9IC0xOwotCQkJc2VsZnBpcGVfb3duZXJfcGlkID0gMDsK LQkJCS8qIEtlZXAgZmQuYydzIGFjY291bnRpbmcgc3RyYWlnaHQgKi8KLQkJCVJlbGVhc2VF eHRlcm5hbEZEKCk7Ci0JCQlSZWxlYXNlRXh0ZXJuYWxGRCgpOwotCQl9Ci0JCWVsc2UKLQkJ ewotCQkJLyoKLQkJCSAqIFBvc3RtYXN0ZXIgZGlkbid0IGNyZWF0ZSBhIHNlbGYtcGlwZSAu Li4gb3IgZWxzZSB3ZSdyZSBpbiBhbgotCQkJICogRVhFQ19CQUNLRU5EIGJ1aWxkLCBpbiB3 aGljaCBjYXNlIGl0IGRvZXNuJ3QgbWF0dGVyIHNpbmNlIHRoZQotCQkJICogcG9zdG1hc3Rl cidzIHBpcGUgRkRzIHdlcmUgY2xvc2VkIGJ5IHRoZSBhY3Rpb24gb2YgRkRfQ0xPRVhFQy4K LQkJCSAqIGZkLmMgd29uJ3QgaGF2ZSBzdGF0ZSB0byBjbGVhbiB1cCwgZWl0aGVyLgotCQkJ ICovCi0JCQlBc3NlcnQoc2VsZnBpcGVfcmVhZGZkID09IC0xKTsKLQkJfQotCX0KLQllbHNl Ci0JewotCQkvKiBJbiBwb3N0bWFzdGVyIG9yIHN0YW5kYWxvbmUgYmFja2VuZCwgYXNzZXJ0 IHdlIGRvIHRoaXMgYnV0IG9uY2UgKi8KLQkJQXNzZXJ0KHNlbGZwaXBlX3JlYWRmZCA9PSAt MSk7Ci0JCUFzc2VydChzZWxmcGlwZV9vd25lcl9waWQgPT0gMCk7Ci0JfQotCi0JLyoKLQkg KiBTZXQgdXAgdGhlIHNlbGYtcGlwZSB0aGF0IGFsbG93cyBhIHNpZ25hbCBoYW5kbGVyIHRv IHdha2UgdXAgdGhlCi0JICogcG9sbCgpL2Vwb2xsX3dhaXQoKSBpbiBXYWl0TGF0Y2guIE1h a2UgdGhlIHdyaXRlLWVuZCBub24tYmxvY2tpbmcsIHNvCi0JICogdGhhdCBTZXRMYXRjaCB3 b24ndCBibG9jayBpZiB0aGUgZXZlbnQgaGFzIGFscmVhZHkgYmVlbiBzZXQgbWFueSB0aW1l cwotCSAqIGZpbGxpbmcgdGhlIGtlcm5lbCBidWZmZXIuIE1ha2UgdGhlIHJlYWQtZW5kIG5v bi1ibG9ja2luZyB0b28sIHNvIHRoYXQKLQkgKiB3ZSBjYW4gZWFzaWx5IGNsZWFyIHRoZSBw aXBlIGJ5IHJlYWRpbmcgdW50aWwgRUFHQUlOIG9yIEVXT1VMREJMT0NLLgotCSAqIEFsc28s IG1ha2UgYm90aCBGRHMgY2xvc2Utb24tZXhlYywgc2luY2Ugd2Ugc3VyZWx5IGRvIG5vdCB3 YW50IGFueQotCSAqIGNoaWxkIHByb2Nlc3NlcyBtZXNzaW5nIHdpdGggdGhlbS4KLQkgKi8K LQlpZiAocGlwZShwaXBlZmQpIDwgMCkKLQkJZWxvZyhGQVRBTCwgInBpcGUoKSBmYWlsZWQ6 ICVtIik7Ci0JaWYgKGZjbnRsKHBpcGVmZFswXSwgRl9TRVRGTCwgT19OT05CTE9DSykgPT0g LTEpCi0JCWVsb2coRkFUQUwsICJmY250bChGX1NFVEZMKSBmYWlsZWQgb24gcmVhZC1lbmQg b2Ygc2VsZi1waXBlOiAlbSIpOwotCWlmIChmY250bChwaXBlZmRbMV0sIEZfU0VURkwsIE9f Tk9OQkxPQ0spID09IC0xKQotCQllbG9nKEZBVEFMLCAiZmNudGwoRl9TRVRGTCkgZmFpbGVk IG9uIHdyaXRlLWVuZCBvZiBzZWxmLXBpcGU6ICVtIik7Ci0JaWYgKGZjbnRsKHBpcGVmZFsw XSwgRl9TRVRGRCwgRkRfQ0xPRVhFQykgPT0gLTEpCi0JCWVsb2coRkFUQUwsICJmY250bChG X1NFVEZEKSBmYWlsZWQgb24gcmVhZC1lbmQgb2Ygc2VsZi1waXBlOiAlbSIpOwotCWlmIChm Y250bChwaXBlZmRbMV0sIEZfU0VURkQsIEZEX0NMT0VYRUMpID09IC0xKQotCQllbG9nKEZB VEFMLCAiZmNudGwoRl9TRVRGRCkgZmFpbGVkIG9uIHdyaXRlLWVuZCBvZiBzZWxmLXBpcGU6 ICVtIik7Ci0KLQlzZWxmcGlwZV9yZWFkZmQgPSBwaXBlZmRbMF07Ci0Jc2VsZnBpcGVfd3Jp dGVmZCA9IHBpcGVmZFsxXTsKLQlzZWxmcGlwZV9vd25lcl9waWQgPSBNeVByb2NQaWQ7Ci0K LQkvKiBUZWxsIGZkLmMgYWJvdXQgdGhlc2UgdHdvIGxvbmctbGl2ZWQgRkRzICovCi0JUmVz ZXJ2ZUV4dGVybmFsRkQoKTsKLQlSZXNlcnZlRXh0ZXJuYWxGRCgpOwotCi0JcHFzaWduYWwo U0lHVVJHLCBsYXRjaF9zaWd1cmdfaGFuZGxlcik7Ci0jZW5kaWYKLQotI2lmZGVmIFdBSVRf VVNFX1NJR05BTEZECi0Jc2lnc2V0X3QJc2lnbmFsZmRfbWFzazsKLQotCWlmIChJc1VuZGVy UG9zdG1hc3RlcikKLQl7Ci0JCS8qCi0JCSAqIEl0IHdvdWxkIHByb2JhYmx5IGJlIHNhZmUg dG8gcmUtdXNlIHRoZSBpbmhlcml0ZWQgc2lnbmFsZmQgc2luY2UKLQkJICogc2lnbmFsZmRz IG9ubHkgc2VlIHRoZSBjdXJyZW50IHByb2Nlc3MncyBwZW5kaW5nIHNpZ25hbHMsIGJ1dCBp dAotCQkgKiBzZWVtcyBsZXNzIHN1cnByaXNpbmcgdG8gY2xvc2UgaXQgYW5kIGNyZWF0ZSBv dXIgb3duLgotCQkgKi8KLQkJaWYgKHNpZ25hbF9mZCAhPSAtMSkKLQkJewotCQkJLyogUmVs ZWFzZSBwb3N0bWFzdGVyJ3Mgc2lnbmFsIEZEOyBpZ25vcmUgYW55IGVycm9yICovCi0JCQko dm9pZCkgY2xvc2Uoc2lnbmFsX2ZkKTsKLQkJCXNpZ25hbF9mZCA9IC0xOwotCQkJUmVsZWFz ZUV4dGVybmFsRkQoKTsKLQkJfQotCX0KLQotCS8qIEJsb2NrIFNJR1VSRywgYmVjYXVzZSB3 ZSdsbCByZWNlaXZlIGl0IHRocm91Z2ggYSBzaWduYWxmZC4gKi8KLQlzaWdhZGRzZXQoJlVu QmxvY2tTaWcsIFNJR1VSRyk7Ci0KLQkvKiBTZXQgdXAgdGhlIHNpZ25hbGZkIHRvIHJlY2Vp dmUgU0lHVVJHIG5vdGlmaWNhdGlvbnMuICovCi0Jc2lnZW1wdHlzZXQoJnNpZ25hbGZkX21h c2spOwotCXNpZ2FkZHNldCgmc2lnbmFsZmRfbWFzaywgU0lHVVJHKTsKLQlzaWduYWxfZmQg PSBzaWduYWxmZCgtMSwgJnNpZ25hbGZkX21hc2ssIFNGRF9OT05CTE9DSyB8IFNGRF9DTE9F WEVDKTsKLQlpZiAoc2lnbmFsX2ZkIDwgMCkKLQkJZWxvZyhGQVRBTCwgInNpZ25hbGZkKCkg ZmFpbGVkIik7Ci0JUmVzZXJ2ZUV4dGVybmFsRkQoKTsKLSNlbmRpZgotCi0jaWZkZWYgV0FJ VF9VU0VfS1FVRVVFCi0JLyogSWdub3JlIFNJR1VSRywgYmVjYXVzZSB3ZSdsbCByZWNlaXZl IGl0IHZpYSBrcXVldWUuICovCi0JcHFzaWduYWwoU0lHVVJHLCBTSUdfSUdOKTsKLSNlbmRp ZgotfQotCiB2b2lkCiBJbml0aWFsaXplTGF0Y2hXYWl0U2V0KHZvaWQpCiB7CkBAIC0zNzks MTMgKzY3LDcgQEAgSW5pdExhdGNoKExhdGNoICpsYXRjaCkKIAlsYXRjaC0+b3duZXJfcGlk ID0gTXlQcm9jUGlkOwogCWxhdGNoLT5pc19zaGFyZWQgPSBmYWxzZTsKIAotI2lmIGRlZmlu ZWQoV0FJVF9VU0VfU0VMRl9QSVBFKQotCS8qIEFzc2VydCBJbml0aWFsaXplTGF0Y2hTdXBw b3J0IGhhcyBiZWVuIGNhbGxlZCBpbiB0aGlzIHByb2Nlc3MgKi8KLQlBc3NlcnQoc2VsZnBp cGVfcmVhZGZkID49IDAgJiYgc2VsZnBpcGVfb3duZXJfcGlkID09IE15UHJvY1BpZCk7Ci0j ZWxpZiBkZWZpbmVkKFdBSVRfVVNFX1NJR05BTEZEKQotCS8qIEFzc2VydCBJbml0aWFsaXpl TGF0Y2hTdXBwb3J0IGhhcyBiZWVuIGNhbGxlZCBpbiB0aGlzIHByb2Nlc3MgKi8KLQlBc3Nl cnQoc2lnbmFsX2ZkID49IDApOwotI2VsaWYgZGVmaW5lZChXQUlUX1VTRV9XSU4zMikKKyNp ZmRlZiBXQUlUX1VTRV9XSU4zMgogCWxhdGNoLT5ldmVudCA9IENyZWF0ZUV2ZW50KE5VTEws IFRSVUUsIEZBTFNFLCBOVUxMKTsKIAlpZiAobGF0Y2gtPmV2ZW50ID09IE5VTEwpCiAJCWVs b2coRVJST1IsICJDcmVhdGVFdmVudCBmYWlsZWQ6IGVycm9yIGNvZGUgJWx1IiwgR2V0TGFz dEVycm9yKCkpOwpAQCAtNDQ4LDE0ICsxMzAsNiBAQCBPd25MYXRjaChMYXRjaCAqbGF0Y2gp CiAJLyogU2FuaXR5IGNoZWNrcyAqLwogCUFzc2VydChsYXRjaC0+aXNfc2hhcmVkKTsKIAot I2lmIGRlZmluZWQoV0FJVF9VU0VfU0VMRl9QSVBFKQotCS8qIEFzc2VydCBJbml0aWFsaXpl TGF0Y2hTdXBwb3J0IGhhcyBiZWVuIGNhbGxlZCBpbiB0aGlzIHByb2Nlc3MgKi8KLQlBc3Nl cnQoc2VsZnBpcGVfcmVhZGZkID49IDAgJiYgc2VsZnBpcGVfb3duZXJfcGlkID09IE15UHJv Y1BpZCk7Ci0jZWxpZiBkZWZpbmVkKFdBSVRfVVNFX1NJR05BTEZEKQotCS8qIEFzc2VydCBJ bml0aWFsaXplTGF0Y2hTdXBwb3J0IGhhcyBiZWVuIGNhbGxlZCBpbiB0aGlzIHByb2Nlc3Mg Ki8KLQlBc3NlcnQoc2lnbmFsX2ZkID49IDApOwotI2VuZGlmCi0KIAlvd25lcl9waWQgPSBs YXRjaC0+b3duZXJfcGlkOwogCWlmIChvd25lcl9waWQgIT0gMCkKIAkJZWxvZyhQQU5JQywg ImxhdGNoIGFscmVhZHkgb3duZWQgYnkgUElEICVkIiwgb3duZXJfcGlkKTsKQEAgLTY2OSwx NyArMzQzLDkgQEAgU2V0TGF0Y2goTGF0Y2ggKmxhdGNoKQogCWlmIChvd25lcl9waWQgPT0g MCkKIAkJcmV0dXJuOwogCWVsc2UgaWYgKG93bmVyX3BpZCA9PSBNeVByb2NQaWQpCi0Jewot I2lmIGRlZmluZWQoV0FJVF9VU0VfU0VMRl9QSVBFKQotCQlpZiAod2FpdGluZykKLQkJCXNl bmRTZWxmUGlwZUJ5dGUoKTsKLSNlbHNlCi0JCWlmICh3YWl0aW5nKQotCQkJa2lsbChNeVBy b2NQaWQsIFNJR1VSRyk7Ci0jZW5kaWYKLQl9CisJCVdha2V1cE15UHJvYygpOwogCWVsc2UK LQkJa2lsbChvd25lcl9waWQsIFNJR1VSRyk7CisJCVdha2V1cE90aGVyUHJvYyhvd25lcl9w aWQpOwogCiAjZWxzZQogCkBAIC03MjQsMTY1MiArMzkwLDMgQEAgUmVzZXRMYXRjaChMYXRj aCAqbGF0Y2gpCiAJICovCiAJcGdfbWVtb3J5X2JhcnJpZXIoKTsKIH0KLQotLyoKLSAqIENy ZWF0ZSBhIFdhaXRFdmVudFNldCB3aXRoIHNwYWNlIGZvciBuZXZlbnRzIGRpZmZlcmVudCBl dmVudHMgdG8gd2FpdCBmb3IuCi0gKgotICogVGhlc2UgZXZlbnRzIGNhbiB0aGVuIGJlIGVm ZmljaWVudGx5IHdhaXRlZCB1cG9uIHRvZ2V0aGVyLCB1c2luZwotICogV2FpdEV2ZW50U2V0 V2FpdCgpLgotICoKLSAqIFRoZSBXYWl0RXZlbnRTZXQgaXMgdHJhY2tlZCBieSB0aGUgZ2l2 ZW4gJ3Jlc293bmVyJy4gIFVzZSBOVUxMIGZvciBzZXNzaW9uCi0gKiBsaWZldGltZS4KLSAq LwotV2FpdEV2ZW50U2V0ICoKLUNyZWF0ZVdhaXRFdmVudFNldChSZXNvdXJjZU93bmVyIHJl c293bmVyLCBpbnQgbmV2ZW50cykKLXsKLQlXYWl0RXZlbnRTZXQgKnNldDsKLQljaGFyCSAg ICpkYXRhOwotCVNpemUJCXN6ID0gMDsKLQotCS8qCi0JICogVXNlIE1BWEFMSUdOIHNpemUv YWxpZ25tZW50IHRvIGd1YXJhbnRlZSB0aGF0IGxhdGVyIHVzZXMgb2YgbWVtb3J5IGFyZQot CSAqIGFsaWduZWQgY29ycmVjdGx5LiBFLmcuIGVwb2xsX2V2ZW50IG1pZ2h0IG5lZWQgOCBi eXRlIGFsaWdubWVudCBvbiBzb21lCi0JICogcGxhdGZvcm1zLCBidXQgZWFybGllciBhbGxv Y2F0aW9ucyBsaWtlIFdhaXRFdmVudFNldCBhbmQgV2FpdEV2ZW50Ci0JICogbWlnaHQgbm90 IGJlIHNpemVkIHRvIGd1YXJhbnRlZSB0aGF0IHdoZW4gcHVyZWx5IHVzaW5nIHNpemVvZigp LgotCSAqLwotCXN6ICs9IE1BWEFMSUdOKHNpemVvZihXYWl0RXZlbnRTZXQpKTsKLQlzeiAr PSBNQVhBTElHTihzaXplb2YoV2FpdEV2ZW50KSAqIG5ldmVudHMpOwotCi0jaWYgZGVmaW5l ZChXQUlUX1VTRV9FUE9MTCkKLQlzeiArPSBNQVhBTElHTihzaXplb2Yoc3RydWN0IGVwb2xs X2V2ZW50KSAqIG5ldmVudHMpOwotI2VsaWYgZGVmaW5lZChXQUlUX1VTRV9LUVVFVUUpCi0J c3ogKz0gTUFYQUxJR04oc2l6ZW9mKHN0cnVjdCBrZXZlbnQpICogbmV2ZW50cyk7Ci0jZWxp ZiBkZWZpbmVkKFdBSVRfVVNFX1BPTEwpCi0Jc3ogKz0gTUFYQUxJR04oc2l6ZW9mKHN0cnVj dCBwb2xsZmQpICogbmV2ZW50cyk7Ci0jZWxpZiBkZWZpbmVkKFdBSVRfVVNFX1dJTjMyKQot CS8qIG5lZWQgc3BhY2UgZm9yIHRoZSBwZ3dpbjMyX3NpZ25hbF9ldmVudCAqLwotCXN6ICs9 IE1BWEFMSUdOKHNpemVvZihIQU5ETEUpICogKG5ldmVudHMgKyAxKSk7Ci0jZW5kaWYKLQot CWlmIChyZXNvd25lciAhPSBOVUxMKQotCQlSZXNvdXJjZU93bmVyRW5sYXJnZShyZXNvd25l cik7Ci0KLQlkYXRhID0gKGNoYXIgKikgTWVtb3J5Q29udGV4dEFsbG9jWmVybyhUb3BNZW1v cnlDb250ZXh0LCBzeik7Ci0KLQlzZXQgPSAoV2FpdEV2ZW50U2V0ICopIGRhdGE7Ci0JZGF0 YSArPSBNQVhBTElHTihzaXplb2YoV2FpdEV2ZW50U2V0KSk7Ci0KLQlzZXQtPmV2ZW50cyA9 IChXYWl0RXZlbnQgKikgZGF0YTsKLQlkYXRhICs9IE1BWEFMSUdOKHNpemVvZihXYWl0RXZl bnQpICogbmV2ZW50cyk7Ci0KLSNpZiBkZWZpbmVkKFdBSVRfVVNFX0VQT0xMKQotCXNldC0+ ZXBvbGxfcmV0X2V2ZW50cyA9IChzdHJ1Y3QgZXBvbGxfZXZlbnQgKikgZGF0YTsKLQlkYXRh ICs9IE1BWEFMSUdOKHNpemVvZihzdHJ1Y3QgZXBvbGxfZXZlbnQpICogbmV2ZW50cyk7Ci0j ZWxpZiBkZWZpbmVkKFdBSVRfVVNFX0tRVUVVRSkKLQlzZXQtPmtxdWV1ZV9yZXRfZXZlbnRz ID0gKHN0cnVjdCBrZXZlbnQgKikgZGF0YTsKLQlkYXRhICs9IE1BWEFMSUdOKHNpemVvZihz dHJ1Y3Qga2V2ZW50KSAqIG5ldmVudHMpOwotI2VsaWYgZGVmaW5lZChXQUlUX1VTRV9QT0xM KQotCXNldC0+cG9sbGZkcyA9IChzdHJ1Y3QgcG9sbGZkICopIGRhdGE7Ci0JZGF0YSArPSBN QVhBTElHTihzaXplb2Yoc3RydWN0IHBvbGxmZCkgKiBuZXZlbnRzKTsKLSNlbGlmIGRlZmlu ZWQoV0FJVF9VU0VfV0lOMzIpCi0Jc2V0LT5oYW5kbGVzID0gKEhBTkRMRSkgZGF0YTsKLQlk YXRhICs9IE1BWEFMSUdOKHNpemVvZihIQU5ETEUpICogbmV2ZW50cyk7Ci0jZW5kaWYKLQot CXNldC0+bGF0Y2ggPSBOVUxMOwotCXNldC0+bmV2ZW50c19zcGFjZSA9IG5ldmVudHM7Ci0J c2V0LT5leGl0X29uX3Bvc3RtYXN0ZXJfZGVhdGggPSBmYWxzZTsKLQotCWlmIChyZXNvd25l ciAhPSBOVUxMKQotCXsKLQkJUmVzb3VyY2VPd25lclJlbWVtYmVyV2FpdEV2ZW50U2V0KHJl c293bmVyLCBzZXQpOwotCQlzZXQtPm93bmVyID0gcmVzb3duZXI7Ci0JfQotCi0jaWYgZGVm aW5lZChXQUlUX1VTRV9FUE9MTCkKLQlpZiAoIUFjcXVpcmVFeHRlcm5hbEZEKCkpCi0JCWVs b2coRVJST1IsICJBY3F1aXJlRXh0ZXJuYWxGRCwgZm9yIGVwb2xsX2NyZWF0ZTEsIGZhaWxl ZDogJW0iKTsKLQlzZXQtPmVwb2xsX2ZkID0gZXBvbGxfY3JlYXRlMShFUE9MTF9DTE9FWEVD KTsKLQlpZiAoc2V0LT5lcG9sbF9mZCA8IDApCi0JewotCQlSZWxlYXNlRXh0ZXJuYWxGRCgp OwotCQllbG9nKEVSUk9SLCAiZXBvbGxfY3JlYXRlMSBmYWlsZWQ6ICVtIik7Ci0JfQotI2Vs aWYgZGVmaW5lZChXQUlUX1VTRV9LUVVFVUUpCi0JaWYgKCFBY3F1aXJlRXh0ZXJuYWxGRCgp KQotCQllbG9nKEVSUk9SLCAiQWNxdWlyZUV4dGVybmFsRkQsIGZvciBrcXVldWUsIGZhaWxl ZDogJW0iKTsKLQlzZXQtPmtxdWV1ZV9mZCA9IGtxdWV1ZSgpOwotCWlmIChzZXQtPmtxdWV1 ZV9mZCA8IDApCi0JewotCQlSZWxlYXNlRXh0ZXJuYWxGRCgpOwotCQllbG9nKEVSUk9SLCAi a3F1ZXVlIGZhaWxlZDogJW0iKTsKLQl9Ci0JaWYgKGZjbnRsKHNldC0+a3F1ZXVlX2ZkLCBG X1NFVEZELCBGRF9DTE9FWEVDKSA9PSAtMSkKLQl7Ci0JCWludAkJCXNhdmVfZXJybm8gPSBl cnJubzsKLQotCQljbG9zZShzZXQtPmtxdWV1ZV9mZCk7Ci0JCVJlbGVhc2VFeHRlcm5hbEZE KCk7Ci0JCWVycm5vID0gc2F2ZV9lcnJubzsKLQkJZWxvZyhFUlJPUiwgImZjbnRsKEZfU0VU RkQpIGZhaWxlZCBvbiBrcXVldWUgZGVzY3JpcHRvcjogJW0iKTsKLQl9Ci0Jc2V0LT5yZXBv cnRfcG9zdG1hc3Rlcl9ub3RfcnVubmluZyA9IGZhbHNlOwotI2VsaWYgZGVmaW5lZChXQUlU X1VTRV9XSU4zMikKLQotCS8qCi0JICogVG8gaGFuZGxlIHNpZ25hbHMgd2hpbGUgd2FpdGlu Zywgd2UgbmVlZCB0byBhZGQgYSB3aW4zMiBzcGVjaWZpYyBldmVudC4KLQkgKiBXZSBhY2Nv dW50ZWQgZm9yIHRoZSBhZGRpdGlvbmFsIGV2ZW50IGF0IHRoZSB0b3Agb2YgdGhpcyByb3V0 aW5lLiBTZWUKLQkgKiBwb3J0L3dpbjMyL3NpZ25hbC5jIGZvciBtb3JlIGRldGFpbHMuCi0J ICoKLQkgKiBOb3RlOiBwZ3dpbjMyX3NpZ25hbF9ldmVudCBzaG91bGQgYmUgZmlyc3QgdG8g ZW5zdXJlIHRoYXQgaXQgd2lsbCBiZQotCSAqIHJlcG9ydGVkIHdoZW4gbXVsdGlwbGUgZXZl bnRzIGFyZSBzZXQuICBXZSB3YW50IHRvIGd1YXJhbnRlZSB0aGF0Ci0JICogcGVuZGluZyBz aWduYWxzIGFyZSBzZXJ2aWNlZC4KLQkgKi8KLQlzZXQtPmhhbmRsZXNbMF0gPSBwZ3dpbjMy X3NpZ25hbF9ldmVudDsKLQlTdGF0aWNBc3NlcnRTdG10KFdTQV9JTlZBTElEX0VWRU5UID09 IE5VTEwsICIiKTsKLSNlbmRpZgotCi0JcmV0dXJuIHNldDsKLX0KLQotLyoKLSAqIEZyZWUg YSBwcmV2aW91c2x5IGNyZWF0ZWQgV2FpdEV2ZW50U2V0LgotICoKLSAqIE5vdGU6IHByZWZl cmFibHksIHRoaXMgc2hvdWxkbid0IGhhdmUgdG8gZnJlZSBhbnkgcmVzb3VyY2VzIHRoYXQg Y291bGQgYmUKLSAqIGluaGVyaXRlZCBhY3Jvc3MgYW4gZXhlYygpLiAgSWYgaXQgZGlkLCB3 ZSdkIGxpa2VseSBsZWFrIHRob3NlIHJlc291cmNlcyBpbgotICogbWFueSBzY2VuYXJpb3Mu ICBGb3IgdGhlIGVwb2xsIGNhc2UsIHdlIGVuc3VyZSB0aGF0IGJ5IHNldHRpbmcgRVBPTExf Q0xPRVhFQwotICogd2hlbiB0aGUgRkQgaXMgY3JlYXRlZC4gIEZvciB0aGUgV2luZG93cyBj YXNlLCB3ZSBhc3N1bWUgdGhhdCB0aGUgaGFuZGxlcwotICogaW52b2x2ZWQgYXJlIG5vbi1p bmhlcml0YWJsZS4KLSAqLwotdm9pZAotRnJlZVdhaXRFdmVudFNldChXYWl0RXZlbnRTZXQg KnNldCkKLXsKLQlpZiAoc2V0LT5vd25lcikKLQl7Ci0JCVJlc291cmNlT3duZXJGb3JnZXRX YWl0RXZlbnRTZXQoc2V0LT5vd25lciwgc2V0KTsKLQkJc2V0LT5vd25lciA9IE5VTEw7Ci0J fQotCi0jaWYgZGVmaW5lZChXQUlUX1VTRV9FUE9MTCkKLQljbG9zZShzZXQtPmVwb2xsX2Zk KTsKLQlSZWxlYXNlRXh0ZXJuYWxGRCgpOwotI2VsaWYgZGVmaW5lZChXQUlUX1VTRV9LUVVF VUUpCi0JY2xvc2Uoc2V0LT5rcXVldWVfZmQpOwotCVJlbGVhc2VFeHRlcm5hbEZEKCk7Ci0j ZWxpZiBkZWZpbmVkKFdBSVRfVVNFX1dJTjMyKQotCWZvciAoV2FpdEV2ZW50ICpjdXJfZXZl bnQgPSBzZXQtPmV2ZW50czsKLQkJIGN1cl9ldmVudCA8IChzZXQtPmV2ZW50cyArIHNldC0+ bmV2ZW50cyk7Ci0JCSBjdXJfZXZlbnQrKykKLQl7Ci0JCWlmIChjdXJfZXZlbnQtPmV2ZW50 cyAmIFdMX0xBVENIX1NFVCkKLQkJewotCQkJLyogdXNlcyB0aGUgbGF0Y2gncyBIQU5ETEUg Ki8KLQkJfQotCQllbHNlIGlmIChjdXJfZXZlbnQtPmV2ZW50cyAmIFdMX1BPU1RNQVNURVJf REVBVEgpCi0JCXsKLQkJCS8qIHVzZXMgUG9zdG1hc3RlckhhbmRsZSAqLwotCQl9Ci0JCWVs c2UKLQkJewotCQkJLyogQ2xlYW4gdXAgdGhlIGV2ZW50IG9iamVjdCB3ZSBjcmVhdGVkIGZv ciB0aGUgc29ja2V0ICovCi0JCQlXU0FFdmVudFNlbGVjdChjdXJfZXZlbnQtPmZkLCBOVUxM LCAwKTsKLQkJCVdTQUNsb3NlRXZlbnQoc2V0LT5oYW5kbGVzW2N1cl9ldmVudC0+cG9zICsg MV0pOwotCQl9Ci0JfQotI2VuZGlmCi0KLQlwZnJlZShzZXQpOwotfQotCi0vKgotICogRnJl ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBXYWl0RXZlbnRTZXQgaW4gYSBjaGlsZCBwcm9jZXNz IGFmdGVyIGEgZm9yaygpLgotICovCi12b2lkCi1GcmVlV2FpdEV2ZW50U2V0QWZ0ZXJGb3Jr KFdhaXRFdmVudFNldCAqc2V0KQotewotI2lmIGRlZmluZWQoV0FJVF9VU0VfRVBPTEwpCi0J Y2xvc2Uoc2V0LT5lcG9sbF9mZCk7Ci0JUmVsZWFzZUV4dGVybmFsRkQoKTsKLSNlbGlmIGRl ZmluZWQoV0FJVF9VU0VfS1FVRVVFKQotCS8qIGtxdWV1ZXMgYXJlIG5vdCBub3JtYWxseSBp bmhlcml0ZWQgYnkgY2hpbGQgcHJvY2Vzc2VzICovCi0JUmVsZWFzZUV4dGVybmFsRkQoKTsK LSNlbmRpZgotCi0JcGZyZWUoc2V0KTsKLX0KLQotLyogLS0tCi0gKiBBZGQgYW4gZXZlbnQg dG8gdGhlIHNldC4gUG9zc2libGUgZXZlbnRzIGFyZToKLSAqIC0gV0xfTEFUQ0hfU0VUOiBX YWl0IGZvciB0aGUgbGF0Y2ggdG8gYmUgc2V0Ci0gKiAtIFdMX1BPU1RNQVNURVJfREVBVEg6 IFdhaXQgZm9yIHBvc3RtYXN0ZXIgdG8gZGllCi0gKiAtIFdMX1NPQ0tFVF9SRUFEQUJMRTog V2FpdCBmb3Igc29ja2V0IHRvIGJlY29tZSByZWFkYWJsZSwKLSAqCSBjYW4gYmUgY29tYmlu ZWQgaW4gb25lIGV2ZW50IHdpdGggb3RoZXIgV0xfU09DS0VUXyogZXZlbnRzCi0gKiAtIFdM X1NPQ0tFVF9XUklURUFCTEU6IFdhaXQgZm9yIHNvY2tldCB0byBiZWNvbWUgd3JpdGVhYmxl LAotICoJIGNhbiBiZSBjb21iaW5lZCB3aXRoIG90aGVyIFdMX1NPQ0tFVF8qIGV2ZW50cwot ICogLSBXTF9TT0NLRVRfQ09OTkVDVEVEOiBXYWl0IGZvciBzb2NrZXQgY29ubmVjdGlvbiB0 byBiZSBlc3RhYmxpc2hlZCwKLSAqCSBjYW4gYmUgY29tYmluZWQgd2l0aCBvdGhlciBXTF9T T0NLRVRfKiBldmVudHMgKG9uIG5vbi1XaW5kb3dzCi0gKgkgcGxhdGZvcm1zLCB0aGlzIGlz IHRoZSBzYW1lIGFzIFdMX1NPQ0tFVF9XUklURUFCTEUpCi0gKiAtIFdMX1NPQ0tFVF9BQ0NF UFQ6IFdhaXQgZm9yIG5ldyBjb25uZWN0aW9uIHRvIGEgc2VydmVyIHNvY2tldCwKLSAqCSBj YW4gYmUgY29tYmluZWQgd2l0aCBvdGhlciBXTF9TT0NLRVRfKiBldmVudHMgKG9uIG5vbi1X aW5kb3dzCi0gKgkgcGxhdGZvcm1zLCB0aGlzIGlzIHRoZSBzYW1lIGFzIFdMX1NPQ0tFVF9S RUFEQUJMRSkKLSAqIC0gV0xfU09DS0VUX0NMT1NFRDogV2FpdCBmb3Igc29ja2V0IHRvIGJl IGNsb3NlZCBieSByZW1vdGUgcGVlci4KLSAqIC0gV0xfRVhJVF9PTl9QTV9ERUFUSDogRXhp dCBpbW1lZGlhdGVseSBpZiB0aGUgcG9zdG1hc3RlciBkaWVzCi0gKgotICogUmV0dXJucyB0 aGUgb2Zmc2V0IGluIFdhaXRFdmVudFNldC0+ZXZlbnRzIChzdGFydGluZyBmcm9tIDApLCB3 aGljaCBjYW4gYmUKLSAqIHVzZWQgdG8gbW9kaWZ5IHByZXZpb3VzbHkgYWRkZWQgd2FpdCBl dmVudHMgdXNpbmcgTW9kaWZ5V2FpdEV2ZW50KCkuCi0gKgotICogSW4gdGhlIFdMX0xBVENI X1NFVCBjYXNlIHRoZSBsYXRjaCBtdXN0IGJlIG93bmVkIGJ5IHRoZSBjdXJyZW50IHByb2Nl c3MsCi0gKiBpLmUuIGl0IG11c3QgYmUgYSBwcm9jZXNzLWxvY2FsIGxhdGNoIGluaXRpYWxp emVkIHdpdGggSW5pdExhdGNoLCBvciBhCi0gKiBzaGFyZWQgbGF0Y2ggYXNzb2NpYXRlZCB3 aXRoIHRoZSBjdXJyZW50IHByb2Nlc3MgYnkgY2FsbGluZyBPd25MYXRjaC4KLSAqCi0gKiBJ biB0aGUgV0xfU09DS0VUX1JFQURBQkxFL1dSSVRFQUJMRS9DT05ORUNURUQvQUNDRVBUIGNh c2VzLCBFT0YgYW5kIGVycm9yCi0gKiBjb25kaXRpb25zIGNhdXNlIHRoZSBzb2NrZXQgdG8g YmUgcmVwb3J0ZWQgYXMgcmVhZGFibGUvd3JpdGFibGUvY29ubmVjdGVkLAotICogc28gdGhh dCB0aGUgY2FsbGVyIGNhbiBkZWFsIHdpdGggdGhlIGNvbmRpdGlvbi4KLSAqCi0gKiBUaGUg dXNlcl9kYXRhIHBvaW50ZXIgc3BlY2lmaWVkIGhlcmUgd2lsbCBiZSBzZXQgZm9yIHRoZSBl dmVudHMgcmV0dXJuZWQKLSAqIGJ5IFdhaXRFdmVudFNldFdhaXQoKSwgYWxsb3dpbmcgdG8g ZWFzaWx5IGFzc29jaWF0ZSBhZGRpdGlvbmFsIGRhdGEgd2l0aAotICogZXZlbnRzLgotICov Ci1pbnQKLUFkZFdhaXRFdmVudFRvU2V0KFdhaXRFdmVudFNldCAqc2V0LCB1aW50MzIgZXZl bnRzLCBwZ3NvY2tldCBmZCwgTGF0Y2ggKmxhdGNoLAotCQkJCSAgdm9pZCAqdXNlcl9kYXRh KQotewotCVdhaXRFdmVudCAgKmV2ZW50OwotCi0JLyogbm90IGVub3VnaCBzcGFjZSAqLwot CUFzc2VydChzZXQtPm5ldmVudHMgPCBzZXQtPm5ldmVudHNfc3BhY2UpOwotCi0JaWYgKGV2 ZW50cyA9PSBXTF9FWElUX09OX1BNX0RFQVRIKQotCXsKLQkJZXZlbnRzID0gV0xfUE9TVE1B U1RFUl9ERUFUSDsKLQkJc2V0LT5leGl0X29uX3Bvc3RtYXN0ZXJfZGVhdGggPSB0cnVlOwot CX0KLQotCWlmIChsYXRjaCkKLQl7Ci0JCWlmIChsYXRjaC0+b3duZXJfcGlkICE9IE15UHJv Y1BpZCkKLQkJCWVsb2coRVJST1IsICJjYW5ub3Qgd2FpdCBvbiBhIGxhdGNoIG93bmVkIGJ5 IGFub3RoZXIgcHJvY2VzcyIpOwotCQlpZiAoc2V0LT5sYXRjaCkKLQkJCWVsb2coRVJST1Is ICJjYW5ub3Qgd2FpdCBvbiBtb3JlIHRoYW4gb25lIGxhdGNoIik7Ci0JCWlmICgoZXZlbnRz ICYgV0xfTEFUQ0hfU0VUKSAhPSBXTF9MQVRDSF9TRVQpCi0JCQllbG9nKEVSUk9SLCAibGF0 Y2ggZXZlbnRzIG9ubHkgc3VwcG9ydCBiZWluZyBzZXQiKTsKLQl9Ci0JZWxzZQotCXsKLQkJ aWYgKGV2ZW50cyAmIFdMX0xBVENIX1NFVCkKLQkJCWVsb2coRVJST1IsICJjYW5ub3Qgd2Fp dCBvbiBsYXRjaCB3aXRob3V0IGEgc3BlY2lmaWVkIGxhdGNoIik7Ci0JfQotCi0JLyogd2Fp dGluZyBmb3Igc29ja2V0IHJlYWRpbmVzcyB3aXRob3V0IGEgc29ja2V0IGluZGljYXRlcyBh IGJ1ZyAqLwotCWlmIChmZCA9PSBQR0lOVkFMSURfU09DS0VUICYmIChldmVudHMgJiBXTF9T T0NLRVRfTUFTSykpCi0JCWVsb2coRVJST1IsICJjYW5ub3Qgd2FpdCBvbiBzb2NrZXQgZXZl bnQgd2l0aG91dCBhIHNvY2tldCIpOwotCi0JZXZlbnQgPSAmc2V0LT5ldmVudHNbc2V0LT5u ZXZlbnRzXTsKLQlldmVudC0+cG9zID0gc2V0LT5uZXZlbnRzKys7Ci0JZXZlbnQtPmZkID0g ZmQ7Ci0JZXZlbnQtPmV2ZW50cyA9IGV2ZW50czsKLQlldmVudC0+dXNlcl9kYXRhID0gdXNl cl9kYXRhOwotI2lmZGVmIFdJTjMyCi0JZXZlbnQtPnJlc2V0ID0gZmFsc2U7Ci0jZW5kaWYK LQotCWlmIChldmVudHMgPT0gV0xfTEFUQ0hfU0VUKQotCXsKLQkJc2V0LT5sYXRjaCA9IGxh dGNoOwotCQlzZXQtPmxhdGNoX3BvcyA9IGV2ZW50LT5wb3M7Ci0jaWYgZGVmaW5lZChXQUlU X1VTRV9TRUxGX1BJUEUpCi0JCWV2ZW50LT5mZCA9IHNlbGZwaXBlX3JlYWRmZDsKLSNlbGlm IGRlZmluZWQoV0FJVF9VU0VfU0lHTkFMRkQpCi0JCWV2ZW50LT5mZCA9IHNpZ25hbF9mZDsK LSNlbHNlCi0JCWV2ZW50LT5mZCA9IFBHSU5WQUxJRF9TT0NLRVQ7Ci0jaWZkZWYgV0FJVF9V U0VfRVBPTEwKLQkJcmV0dXJuIGV2ZW50LT5wb3M7Ci0jZW5kaWYKLSNlbmRpZgotCX0KLQll bHNlIGlmIChldmVudHMgPT0gV0xfUE9TVE1BU1RFUl9ERUFUSCkKLQl7Ci0jaWZuZGVmIFdJ TjMyCi0JCWV2ZW50LT5mZCA9IHBvc3RtYXN0ZXJfYWxpdmVfZmRzW1BPU1RNQVNURVJfRkRf V0FUQ0hdOwotI2VuZGlmCi0JfQotCi0JLyogcGVyZm9ybSB3YWl0IHByaW1pdGl2ZSBzcGVj aWZpYyBpbml0aWFsaXphdGlvbiwgaWYgbmVlZGVkICovCi0jaWYgZGVmaW5lZChXQUlUX1VT RV9FUE9MTCkKLQlXYWl0RXZlbnRBZGp1c3RFcG9sbChzZXQsIGV2ZW50LCBFUE9MTF9DVExf QUREKTsKLSNlbGlmIGRlZmluZWQoV0FJVF9VU0VfS1FVRVVFKQotCVdhaXRFdmVudEFkanVz dEtxdWV1ZShzZXQsIGV2ZW50LCAwKTsKLSNlbGlmIGRlZmluZWQoV0FJVF9VU0VfUE9MTCkK LQlXYWl0RXZlbnRBZGp1c3RQb2xsKHNldCwgZXZlbnQpOwotI2VsaWYgZGVmaW5lZChXQUlU X1VTRV9XSU4zMikKLQlXYWl0RXZlbnRBZGp1c3RXaW4zMihzZXQsIGV2ZW50KTsKLSNlbmRp ZgotCi0JcmV0dXJuIGV2ZW50LT5wb3M7Ci19Ci0KLS8qCi0gKiBDaGFuZ2UgdGhlIGV2ZW50 IG1hc2sgYW5kLCBpbiB0aGUgV0xfTEFUQ0hfU0VUIGNhc2UsIHRoZSBsYXRjaCBhc3NvY2lh dGVkCi0gKiB3aXRoIHRoZSBXYWl0RXZlbnQuICBUaGUgbGF0Y2ggbWF5IGJlIGNoYW5nZWQg dG8gTlVMTCB0byBkaXNhYmxlIHRoZSBsYXRjaAotICogdGVtcG9yYXJpbHksIGFuZCB0aGVu IHNldCBiYWNrIHRvIGEgbGF0Y2ggbGF0ZXIuCi0gKgotICogJ3BvcycgaXMgdGhlIGlkIHJl dHVybmVkIGJ5IEFkZFdhaXRFdmVudFRvU2V0LgotICovCi12b2lkCi1Nb2RpZnlXYWl0RXZl bnQoV2FpdEV2ZW50U2V0ICpzZXQsIGludCBwb3MsIHVpbnQzMiBldmVudHMsIExhdGNoICps YXRjaCkKLXsKLQlXYWl0RXZlbnQgICpldmVudDsKLSNpZiBkZWZpbmVkKFdBSVRfVVNFX0tR VUVVRSkKLQlpbnQJCQlvbGRfZXZlbnRzOwotI2VuZGlmCi0KLQlBc3NlcnQocG9zIDwgc2V0 LT5uZXZlbnRzKTsKLQotCWV2ZW50ID0gJnNldC0+ZXZlbnRzW3Bvc107Ci0jaWYgZGVmaW5l ZChXQUlUX1VTRV9LUVVFVUUpCi0Jb2xkX2V2ZW50cyA9IGV2ZW50LT5ldmVudHM7Ci0jZW5k aWYKLQotCS8qCi0JICogSWYgbmVpdGhlciB0aGUgZXZlbnQgbWFzayBub3IgdGhlIGFzc29j aWF0ZWQgbGF0Y2ggY2hhbmdlcywgcmV0dXJuCi0JICogZWFybHkuIFRoYXQncyBhbiBpbXBv cnRhbnQgb3B0aW1pemF0aW9uIGZvciBzb21lIHNvY2tldHMsIHdoZXJlCi0JICogTW9kaWZ5 V2FpdEV2ZW50IGlzIGZyZXF1ZW50bHkgdXNlZCB0byBzd2l0Y2ggZnJvbSB3YWl0aW5nIGZv ciByZWFkcyB0bwotCSAqIHdhaXRpbmcgb24gd3JpdGVzLgotCSAqLwotCWlmIChldmVudHMg PT0gZXZlbnQtPmV2ZW50cyAmJgotCQkoIShldmVudC0+ZXZlbnRzICYgV0xfTEFUQ0hfU0VU KSB8fCBzZXQtPmxhdGNoID09IGxhdGNoKSkKLQkJcmV0dXJuOwotCi0JLyogQWxsb3cgc3dp dGNoaW5nIGJldHdlZW4gV0xfUE9TVE1BU1RFUl9ERUFUSCBhbmQgV0xfRVhJVF9PTl9QTV9E RUFUSCAqLwotCWlmIChldmVudC0+ZXZlbnRzICYgV0xfUE9TVE1BU1RFUl9ERUFUSCkKLQl7 Ci0JCWlmIChldmVudHMgIT0gV0xfUE9TVE1BU1RFUl9ERUFUSCAmJiBldmVudHMgIT0gV0xf RVhJVF9PTl9QTV9ERUFUSCkKLQkJCWVsb2coRVJST1IsICJjYW5ub3QgbW9kaWZ5IHBvc3Rt YXN0ZXIgZGVhdGggZXZlbnQiKTsKLQkJc2V0LT5leGl0X29uX3Bvc3RtYXN0ZXJfZGVhdGgg PSAoKGV2ZW50cyAmIFdMX0VYSVRfT05fUE1fREVBVEgpICE9IDApOwotCQlyZXR1cm47Ci0J fQotCi0JaWYgKGV2ZW50LT5ldmVudHMgJiBXTF9MQVRDSF9TRVQgJiYKLQkJZXZlbnRzICE9 IGV2ZW50LT5ldmVudHMpCi0JewotCQllbG9nKEVSUk9SLCAiY2Fubm90IG1vZGlmeSBsYXRj aCBldmVudCIpOwotCX0KLQotCS8qIEZJWE1FOiB2YWxpZGF0ZSBldmVudCBtYXNrICovCi0J ZXZlbnQtPmV2ZW50cyA9IGV2ZW50czsKLQotCWlmIChldmVudHMgPT0gV0xfTEFUQ0hfU0VU KQotCXsKLQkJaWYgKGxhdGNoICYmIGxhdGNoLT5vd25lcl9waWQgIT0gTXlQcm9jUGlkKQot CQkJZWxvZyhFUlJPUiwgImNhbm5vdCB3YWl0IG9uIGEgbGF0Y2ggb3duZWQgYnkgYW5vdGhl ciBwcm9jZXNzIik7Ci0JCXNldC0+bGF0Y2ggPSBsYXRjaDsKLQotCQkvKgotCQkgKiBPbiBV bml4LCB3ZSBkb24ndCBuZWVkIHRvIG1vZGlmeSB0aGUga2VybmVsIG9iamVjdCBiZWNhdXNl IHRoZQotCQkgKiB1bmRlcmx5aW5nIHBpcGUgKGlmIHRoZXJlIGlzIG9uZSkgaXMgdGhlIHNh bWUgZm9yIGFsbCBsYXRjaGVzIHNvIHdlCi0JCSAqIGNhbiByZXR1cm4gaW1tZWRpYXRlbHku ICBPbiBXaW5kb3dzLCB3ZSBuZWVkIHRvIHVwZGF0ZSBvdXIgYXJyYXkgb2YKLQkJICogaGFu ZGxlcywgYnV0IHdlIGxlYXZlIHRoZSBvbGQgb25lIGluIHBsYWNlIGFuZCB0b2xlcmF0ZSBz cHVyaW91cwotCQkgKiB3YWtldXBzIGlmIHRoZSBsYXRjaCBpcyBkaXNhYmxlZC4KLQkJICov Ci0jaWYgZGVmaW5lZChXQUlUX1VTRV9XSU4zMikKLQkJaWYgKCFsYXRjaCkKLQkJCXJldHVy bjsKLSNlbHNlCi0JCXJldHVybjsKLSNlbmRpZgotCX0KLQotI2lmIGRlZmluZWQoV0FJVF9V U0VfRVBPTEwpCi0JV2FpdEV2ZW50QWRqdXN0RXBvbGwoc2V0LCBldmVudCwgRVBPTExfQ1RM X01PRCk7Ci0jZWxpZiBkZWZpbmVkKFdBSVRfVVNFX0tRVUVVRSkKLQlXYWl0RXZlbnRBZGp1 c3RLcXVldWUoc2V0LCBldmVudCwgb2xkX2V2ZW50cyk7Ci0jZWxpZiBkZWZpbmVkKFdBSVRf VVNFX1BPTEwpCi0JV2FpdEV2ZW50QWRqdXN0UG9sbChzZXQsIGV2ZW50KTsKLSNlbGlmIGRl ZmluZWQoV0FJVF9VU0VfV0lOMzIpCi0JV2FpdEV2ZW50QWRqdXN0V2luMzIoc2V0LCBldmVu dCk7Ci0jZW5kaWYKLX0KLQotI2lmIGRlZmluZWQoV0FJVF9VU0VfRVBPTEwpCi0vKgotICog YWN0aW9uIGNhbiBiZSBvbmUgb2YgRVBPTExfQ1RMX0FERCB8IEVQT0xMX0NUTF9NT0QgfCBF UE9MTF9DVExfREVMCi0gKi8KLXN0YXRpYyB2b2lkCi1XYWl0RXZlbnRBZGp1c3RFcG9sbChX YWl0RXZlbnRTZXQgKnNldCwgV2FpdEV2ZW50ICpldmVudCwgaW50IGFjdGlvbikKLXsKLQlz dHJ1Y3QgZXBvbGxfZXZlbnQgZXBvbGxfZXY7Ci0JaW50CQkJcmM7Ci0KLQkvKiBwb2ludGVy IHRvIG91ciBldmVudCwgcmV0dXJuZWQgYnkgZXBvbGxfd2FpdCAqLwotCWVwb2xsX2V2LmRh dGEucHRyID0gZXZlbnQ7Ci0JLyogYWx3YXlzIHdhaXQgZm9yIGVycm9ycyAqLwotCWVwb2xs X2V2LmV2ZW50cyA9IEVQT0xMRVJSIHwgRVBPTExIVVA7Ci0KLQkvKiBwcmVwYXJlIHBvbGxm ZCBlbnRyeSBvbmNlICovCi0JaWYgKGV2ZW50LT5ldmVudHMgPT0gV0xfTEFUQ0hfU0VUKQot CXsKLQkJQXNzZXJ0KHNldC0+bGF0Y2ggIT0gTlVMTCk7Ci0JCWVwb2xsX2V2LmV2ZW50cyB8 PSBFUE9MTElOOwotCX0KLQllbHNlIGlmIChldmVudC0+ZXZlbnRzID09IFdMX1BPU1RNQVNU RVJfREVBVEgpCi0JewotCQllcG9sbF9ldi5ldmVudHMgfD0gRVBPTExJTjsKLQl9Ci0JZWxz ZQotCXsKLQkJQXNzZXJ0KGV2ZW50LT5mZCAhPSBQR0lOVkFMSURfU09DS0VUKTsKLQkJQXNz ZXJ0KGV2ZW50LT5ldmVudHMgJiAoV0xfU09DS0VUX1JFQURBQkxFIHwKLQkJCQkJCQkJV0xf U09DS0VUX1dSSVRFQUJMRSB8Ci0JCQkJCQkJCVdMX1NPQ0tFVF9DTE9TRUQpKTsKLQotCQlp ZiAoZXZlbnQtPmV2ZW50cyAmIFdMX1NPQ0tFVF9SRUFEQUJMRSkKLQkJCWVwb2xsX2V2LmV2 ZW50cyB8PSBFUE9MTElOOwotCQlpZiAoZXZlbnQtPmV2ZW50cyAmIFdMX1NPQ0tFVF9XUklU RUFCTEUpCi0JCQllcG9sbF9ldi5ldmVudHMgfD0gRVBPTExPVVQ7Ci0JCWlmIChldmVudC0+ ZXZlbnRzICYgV0xfU09DS0VUX0NMT1NFRCkKLQkJCWVwb2xsX2V2LmV2ZW50cyB8PSBFUE9M TFJESFVQOwotCX0KLQotCS8qCi0JICogRXZlbiB0aG91Z2ggdW51c2VkLCB3ZSBhbHNvIHBh c3MgZXBvbGxfZXYgYXMgdGhlIGRhdGEgYXJndW1lbnQgaWYKLQkgKiBFUE9MTF9DVExfREVM IGlzIHBhc3NlZCBhcyBhY3Rpb24uICBUaGVyZSB1c2VkIHRvIGJlIGFuIGVwb2xsIGJ1Zwot CSAqIHJlcXVpcmluZyB0aGF0LCBhbmQgYWN0dWFsbHkgaXQgbWFrZXMgdGhlIGNvZGUgc2lt cGxlci4uLgotCSAqLwotCXJjID0gZXBvbGxfY3RsKHNldC0+ZXBvbGxfZmQsIGFjdGlvbiwg ZXZlbnQtPmZkLCAmZXBvbGxfZXYpOwotCi0JaWYgKHJjIDwgMCkKLQkJZXJlcG9ydChFUlJP UiwKLQkJCQkoZXJyY29kZV9mb3Jfc29ja2V0X2FjY2VzcygpLAotCQkJCSBlcnJtc2coIiVz KCkgZmFpbGVkOiAlbSIsCi0JCQkJCQkiZXBvbGxfY3RsIikpKTsKLX0KLSNlbmRpZgotCi0j aWYgZGVmaW5lZChXQUlUX1VTRV9QT0xMKQotc3RhdGljIHZvaWQKLVdhaXRFdmVudEFkanVz dFBvbGwoV2FpdEV2ZW50U2V0ICpzZXQsIFdhaXRFdmVudCAqZXZlbnQpCi17Ci0Jc3RydWN0 IHBvbGxmZCAqcG9sbGZkID0gJnNldC0+cG9sbGZkc1tldmVudC0+cG9zXTsKLQotCXBvbGxm ZC0+cmV2ZW50cyA9IDA7Ci0JcG9sbGZkLT5mZCA9IGV2ZW50LT5mZDsKLQotCS8qIHByZXBh cmUgcG9sbGZkIGVudHJ5IG9uY2UgKi8KLQlpZiAoZXZlbnQtPmV2ZW50cyA9PSBXTF9MQVRD SF9TRVQpCi0JewotCQlBc3NlcnQoc2V0LT5sYXRjaCAhPSBOVUxMKTsKLQkJcG9sbGZkLT5l dmVudHMgPSBQT0xMSU47Ci0JfQotCWVsc2UgaWYgKGV2ZW50LT5ldmVudHMgPT0gV0xfUE9T VE1BU1RFUl9ERUFUSCkKLQl7Ci0JCXBvbGxmZC0+ZXZlbnRzID0gUE9MTElOOwotCX0KLQll bHNlCi0JewotCQlBc3NlcnQoZXZlbnQtPmV2ZW50cyAmIChXTF9TT0NLRVRfUkVBREFCTEUg fAotCQkJCQkJCQlXTF9TT0NLRVRfV1JJVEVBQkxFIHwKLQkJCQkJCQkJV0xfU09DS0VUX0NM T1NFRCkpOwotCQlwb2xsZmQtPmV2ZW50cyA9IDA7Ci0JCWlmIChldmVudC0+ZXZlbnRzICYg V0xfU09DS0VUX1JFQURBQkxFKQotCQkJcG9sbGZkLT5ldmVudHMgfD0gUE9MTElOOwotCQlp ZiAoZXZlbnQtPmV2ZW50cyAmIFdMX1NPQ0tFVF9XUklURUFCTEUpCi0JCQlwb2xsZmQtPmV2 ZW50cyB8PSBQT0xMT1VUOwotI2lmZGVmIFBPTExSREhVUAotCQlpZiAoZXZlbnQtPmV2ZW50 cyAmIFdMX1NPQ0tFVF9DTE9TRUQpCi0JCQlwb2xsZmQtPmV2ZW50cyB8PSBQT0xMUkRIVVA7 Ci0jZW5kaWYKLQl9Ci0KLQlBc3NlcnQoZXZlbnQtPmZkICE9IFBHSU5WQUxJRF9TT0NLRVQp OwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFdBSVRfVVNFX0tRVUVVRSkKLQotLyoKLSAq IE9uIG1vc3QgQlNEIGZhbWlseSBzeXN0ZW1zLCB0aGUgdWRhdGEgbWVtYmVyIG9mIHN0cnVj dCBrZXZlbnQgaXMgb2YgdHlwZQotICogdm9pZCAqLCBzbyB3ZSBjb3VsZCBkaXJlY3RseSBj b252ZXJ0IHRvL2Zyb20gV2FpdEV2ZW50ICouICBVbmZvcnR1bmF0ZWx5LAotICogTmV0QlNE IGhhcyBpdCBhcyBpbnRwdHJfdCwgc28gaGVyZSB3ZSB3YWxscGFwZXIgb3ZlciB0aGF0IGRp ZmZlcmVuY2Ugd2l0aAotICogYW4gbHZhbHVlIGNhc3QuCi0gKi8KLSNkZWZpbmUgQWNjZXNz V2FpdEV2ZW50KGtfZXYpICgqKChXYWl0RXZlbnQgKiopKCYoa19ldiktPnVkYXRhKSkpCi0K LXN0YXRpYyBpbmxpbmUgdm9pZAotV2FpdEV2ZW50QWRqdXN0S3F1ZXVlQWRkKHN0cnVjdCBr ZXZlbnQgKmtfZXYsIGludCBmaWx0ZXIsIGludCBhY3Rpb24sCi0JCQkJCQkgV2FpdEV2ZW50 ICpldmVudCkKLXsKLQlrX2V2LT5pZGVudCA9IGV2ZW50LT5mZDsKLQlrX2V2LT5maWx0ZXIg PSBmaWx0ZXI7Ci0Ja19ldi0+ZmxhZ3MgPSBhY3Rpb247Ci0Ja19ldi0+ZmZsYWdzID0gMDsK LQlrX2V2LT5kYXRhID0gMDsKLQlBY2Nlc3NXYWl0RXZlbnQoa19ldikgPSBldmVudDsKLX0K LQotc3RhdGljIGlubGluZSB2b2lkCi1XYWl0RXZlbnRBZGp1c3RLcXVldWVBZGRQb3N0bWFz dGVyKHN0cnVjdCBrZXZlbnQgKmtfZXYsIFdhaXRFdmVudCAqZXZlbnQpCi17Ci0JLyogRm9y IG5vdyBwb3N0bWFzdGVyIGRlYXRoIGNhbiBvbmx5IGJlIGFkZGVkLCBub3QgcmVtb3ZlZC4g Ki8KLQlrX2V2LT5pZGVudCA9IFBvc3RtYXN0ZXJQaWQ7Ci0Ja19ldi0+ZmlsdGVyID0gRVZG SUxUX1BST0M7Ci0Ja19ldi0+ZmxhZ3MgPSBFVl9BREQ7Ci0Ja19ldi0+ZmZsYWdzID0gTk9U RV9FWElUOwotCWtfZXYtPmRhdGEgPSAwOwotCUFjY2Vzc1dhaXRFdmVudChrX2V2KSA9IGV2 ZW50OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLVdhaXRFdmVudEFkanVzdEtxdWV1ZUFk ZExhdGNoKHN0cnVjdCBrZXZlbnQgKmtfZXYsIFdhaXRFdmVudCAqZXZlbnQpCi17Ci0JLyog Rm9yIG5vdyBsYXRjaCBjYW4gb25seSBiZSBhZGRlZCwgbm90IHJlbW92ZWQuICovCi0Ja19l di0+aWRlbnQgPSBTSUdVUkc7Ci0Ja19ldi0+ZmlsdGVyID0gRVZGSUxUX1NJR05BTDsKLQlr X2V2LT5mbGFncyA9IEVWX0FERDsKLQlrX2V2LT5mZmxhZ3MgPSAwOwotCWtfZXYtPmRhdGEg PSAwOwotCUFjY2Vzc1dhaXRFdmVudChrX2V2KSA9IGV2ZW50OwotfQotCi0vKgotICogb2xk X2V2ZW50cyBpcyB0aGUgcHJldmlvdXMgZXZlbnQgbWFzaywgdXNlZCB0byBjb21wdXRlIHdo YXQgaGFzIGNoYW5nZWQuCi0gKi8KLXN0YXRpYyB2b2lkCi1XYWl0RXZlbnRBZGp1c3RLcXVl dWUoV2FpdEV2ZW50U2V0ICpzZXQsIFdhaXRFdmVudCAqZXZlbnQsIGludCBvbGRfZXZlbnRz KQotewotCWludAkJCXJjOwotCXN0cnVjdCBrZXZlbnQga19ldlsyXTsKLQlpbnQJCQljb3Vu dCA9IDA7Ci0JYm9vbAkJbmV3X2ZpbHRfcmVhZCA9IGZhbHNlOwotCWJvb2wJCW9sZF9maWx0 X3JlYWQgPSBmYWxzZTsKLQlib29sCQluZXdfZmlsdF93cml0ZSA9IGZhbHNlOwotCWJvb2wJ CW9sZF9maWx0X3dyaXRlID0gZmFsc2U7Ci0KLQlpZiAob2xkX2V2ZW50cyA9PSBldmVudC0+ ZXZlbnRzKQotCQlyZXR1cm47Ci0KLQlBc3NlcnQoZXZlbnQtPmV2ZW50cyAhPSBXTF9MQVRD SF9TRVQgfHwgc2V0LT5sYXRjaCAhPSBOVUxMKTsKLQlBc3NlcnQoZXZlbnQtPmV2ZW50cyA9 PSBXTF9MQVRDSF9TRVQgfHwKLQkJICAgZXZlbnQtPmV2ZW50cyA9PSBXTF9QT1NUTUFTVEVS X0RFQVRIIHx8Ci0JCSAgIChldmVudC0+ZXZlbnRzICYgKFdMX1NPQ0tFVF9SRUFEQUJMRSB8 Ci0JCQkJCQkJIFdMX1NPQ0tFVF9XUklURUFCTEUgfAotCQkJCQkJCSBXTF9TT0NLRVRfQ0xP U0VEKSkpOwotCi0JaWYgKGV2ZW50LT5ldmVudHMgPT0gV0xfUE9TVE1BU1RFUl9ERUFUSCkK LQl7Ci0JCS8qCi0JCSAqIFVubGlrZSBhbGwgdGhlIG90aGVyIGltcGxlbWVudGF0aW9ucywg d2UgZGV0ZWN0IHBvc3RtYXN0ZXIgZGVhdGgKLQkJICogdXNpbmcgcHJvY2VzcyBub3RpZmlj YXRpb24gaW5zdGVhZCBvZiB3YWl0aW5nIG9uIHRoZSBwb3N0bWFzdGVyCi0JCSAqIGFsaXZl IHBpcGUuCi0JCSAqLwotCQlXYWl0RXZlbnRBZGp1c3RLcXVldWVBZGRQb3N0bWFzdGVyKCZr X2V2W2NvdW50KytdLCBldmVudCk7Ci0JfQotCWVsc2UgaWYgKGV2ZW50LT5ldmVudHMgPT0g V0xfTEFUQ0hfU0VUKQotCXsKLQkJLyogV2UgZGV0ZWN0IGxhdGNoIHdha2V1cCB1c2luZyBh IHNpZ25hbCBldmVudC4gKi8KLQkJV2FpdEV2ZW50QWRqdXN0S3F1ZXVlQWRkTGF0Y2goJmtf ZXZbY291bnQrK10sIGV2ZW50KTsKLQl9Ci0JZWxzZQotCXsKLQkJLyoKLQkJICogV2UgbmVl ZCB0byBjb21wdXRlIHRoZSBhZGRzIGFuZCBkZWxldGVzIHJlcXVpcmVkIHRvIGdldCBmcm9t IHRoZQotCQkgKiBvbGQgZXZlbnQgbWFzayB0byB0aGUgbmV3IGV2ZW50IG1hc2ssIHNpbmNl IGtldmVudCB0cmVhdHMgcmVhZGFibGUKLQkJICogYW5kIHdyaXRhYmxlIGFzIHNlcGFyYXRl IGV2ZW50cy4KLQkJICovCi0JCWlmIChvbGRfZXZlbnRzICYgKFdMX1NPQ0tFVF9SRUFEQUJM RSB8IFdMX1NPQ0tFVF9DTE9TRUQpKQotCQkJb2xkX2ZpbHRfcmVhZCA9IHRydWU7Ci0JCWlm IChldmVudC0+ZXZlbnRzICYgKFdMX1NPQ0tFVF9SRUFEQUJMRSB8IFdMX1NPQ0tFVF9DTE9T RUQpKQotCQkJbmV3X2ZpbHRfcmVhZCA9IHRydWU7Ci0JCWlmIChvbGRfZXZlbnRzICYgV0xf U09DS0VUX1dSSVRFQUJMRSkKLQkJCW9sZF9maWx0X3dyaXRlID0gdHJ1ZTsKLQkJaWYgKGV2 ZW50LT5ldmVudHMgJiBXTF9TT0NLRVRfV1JJVEVBQkxFKQotCQkJbmV3X2ZpbHRfd3JpdGUg PSB0cnVlOwotCQlpZiAob2xkX2ZpbHRfcmVhZCAmJiAhbmV3X2ZpbHRfcmVhZCkKLQkJCVdh aXRFdmVudEFkanVzdEtxdWV1ZUFkZCgma19ldltjb3VudCsrXSwgRVZGSUxUX1JFQUQsIEVW X0RFTEVURSwKLQkJCQkJCQkJCSBldmVudCk7Ci0JCWVsc2UgaWYgKCFvbGRfZmlsdF9yZWFk ICYmIG5ld19maWx0X3JlYWQpCi0JCQlXYWl0RXZlbnRBZGp1c3RLcXVldWVBZGQoJmtfZXZb Y291bnQrK10sIEVWRklMVF9SRUFELCBFVl9BREQsCi0JCQkJCQkJCQkgZXZlbnQpOwotCQlp ZiAob2xkX2ZpbHRfd3JpdGUgJiYgIW5ld19maWx0X3dyaXRlKQotCQkJV2FpdEV2ZW50QWRq dXN0S3F1ZXVlQWRkKCZrX2V2W2NvdW50KytdLCBFVkZJTFRfV1JJVEUsIEVWX0RFTEVURSwK LQkJCQkJCQkJCSBldmVudCk7Ci0JCWVsc2UgaWYgKCFvbGRfZmlsdF93cml0ZSAmJiBuZXdf ZmlsdF93cml0ZSkKLQkJCVdhaXRFdmVudEFkanVzdEtxdWV1ZUFkZCgma19ldltjb3VudCsr XSwgRVZGSUxUX1dSSVRFLCBFVl9BREQsCi0JCQkJCQkJCQkgZXZlbnQpOwotCX0KLQotCS8q IEZvciBXTF9TT0NLRVRfUkVBRCAtPiBXTF9TT0NLRVRfQ0xPU0VELCBubyBjaGFuZ2UgbmVl ZGVkLiAqLwotCWlmIChjb3VudCA9PSAwKQotCQlyZXR1cm47Ci0KLQlBc3NlcnQoY291bnQg PD0gMik7Ci0KLQlyYyA9IGtldmVudChzZXQtPmtxdWV1ZV9mZCwgJmtfZXZbMF0sIGNvdW50 LCBOVUxMLCAwLCBOVUxMKTsKLQotCS8qCi0JICogV2hlbiBhZGRpbmcgdGhlIHBvc3RtYXN0 ZXIncyBwaWQsIHdlIGhhdmUgdG8gY29uc2lkZXIgdGhhdCBpdCBtaWdodAotCSAqIGFscmVh ZHkgaGF2ZSBleGl0ZWQgYW5kIHBlcmhhcHMgZXZlbiBiZWVuIHJlcGxhY2VkIGJ5IGFub3Ro ZXIgcHJvY2VzcwotCSAqIHdpdGggdGhlIHNhbWUgcGlkLiAgSWYgc28sIHdlIGhhdmUgdG8g ZGVmZXIgcmVwb3J0aW5nIHRoaXMgYXMgYW4gZXZlbnQKLQkgKiB1bnRpbCB0aGUgbmV4dCBj YWxsIHRvIFdhaXRFdmVudFNldFdhaXRCbG9jaygpLgotCSAqLwotCi0JaWYgKHJjIDwgMCkK LQl7Ci0JCWlmIChldmVudC0+ZXZlbnRzID09IFdMX1BPU1RNQVNURVJfREVBVEggJiYKLQkJ CShlcnJubyA9PSBFU1JDSCB8fCBlcnJubyA9PSBFQUNDRVMpKQotCQkJc2V0LT5yZXBvcnRf cG9zdG1hc3Rlcl9ub3RfcnVubmluZyA9IHRydWU7Ci0JCWVsc2UKLQkJCWVyZXBvcnQoRVJS T1IsCi0JCQkJCShlcnJjb2RlX2Zvcl9zb2NrZXRfYWNjZXNzKCksCi0JCQkJCSBlcnJtc2co IiVzKCkgZmFpbGVkOiAlbSIsCi0JCQkJCQkJImtldmVudCIpKSk7Ci0JfQotCWVsc2UgaWYg KGV2ZW50LT5ldmVudHMgPT0gV0xfUE9TVE1BU1RFUl9ERUFUSCAmJgotCQkJIFBvc3RtYXN0 ZXJQaWQgIT0gZ2V0cHBpZCgpICYmCi0JCQkgIVBvc3RtYXN0ZXJJc0FsaXZlKCkpCi0Jewot CQkvKgotCQkgKiBUaGUgZXh0cmEgUG9zdG1hc3RlcklzQWxpdmVJbnRlcm5hbCgpIGNoZWNr IHByZXZlbnRzIGZhbHNlIGFsYXJtcwotCQkgKiBvbiBzeXN0ZW1zIHRoYXQgZ2l2ZSBhIGRp ZmZlcmVudCB2YWx1ZSBmb3IgZ2V0cHBpZCgpIHdoaWxlIGJlaW5nCi0JCSAqIHRyYWNlZCBi eSBhIGRlYnVnZ2VyLgotCQkgKi8KLQkJc2V0LT5yZXBvcnRfcG9zdG1hc3Rlcl9ub3RfcnVu bmluZyA9IHRydWU7Ci0JfQotfQotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoV0FJVF9VU0Vf V0lOMzIpCi1zdGF0aWMgdm9pZAotV2FpdEV2ZW50QWRqdXN0V2luMzIoV2FpdEV2ZW50U2V0 ICpzZXQsIFdhaXRFdmVudCAqZXZlbnQpCi17Ci0JSEFORExFCSAgICpoYW5kbGUgPSAmc2V0 LT5oYW5kbGVzW2V2ZW50LT5wb3MgKyAxXTsKLQotCWlmIChldmVudC0+ZXZlbnRzID09IFdM X0xBVENIX1NFVCkKLQl7Ci0JCUFzc2VydChzZXQtPmxhdGNoICE9IE5VTEwpOwotCQkqaGFu ZGxlID0gc2V0LT5sYXRjaC0+ZXZlbnQ7Ci0JfQotCWVsc2UgaWYgKGV2ZW50LT5ldmVudHMg PT0gV0xfUE9TVE1BU1RFUl9ERUFUSCkKLQl7Ci0JCSpoYW5kbGUgPSBQb3N0bWFzdGVySGFu ZGxlOwotCX0KLQllbHNlCi0JewotCQlpbnQJCQlmbGFncyA9IEZEX0NMT1NFOwkvKiBhbHdh eXMgY2hlY2sgZm9yIGVycm9ycy9FT0YgKi8KLQotCQlpZiAoZXZlbnQtPmV2ZW50cyAmIFdM X1NPQ0tFVF9SRUFEQUJMRSkKLQkJCWZsYWdzIHw9IEZEX1JFQUQ7Ci0JCWlmIChldmVudC0+ ZXZlbnRzICYgV0xfU09DS0VUX1dSSVRFQUJMRSkKLQkJCWZsYWdzIHw9IEZEX1dSSVRFOwot CQlpZiAoZXZlbnQtPmV2ZW50cyAmIFdMX1NPQ0tFVF9DT05ORUNURUQpCi0JCQlmbGFncyB8 PSBGRF9DT05ORUNUOwotCQlpZiAoZXZlbnQtPmV2ZW50cyAmIFdMX1NPQ0tFVF9BQ0NFUFQp Ci0JCQlmbGFncyB8PSBGRF9BQ0NFUFQ7Ci0KLQkJaWYgKCpoYW5kbGUgPT0gV1NBX0lOVkFM SURfRVZFTlQpCi0JCXsKLQkJCSpoYW5kbGUgPSBXU0FDcmVhdGVFdmVudCgpOwotCQkJaWYg KCpoYW5kbGUgPT0gV1NBX0lOVkFMSURfRVZFTlQpCi0JCQkJZWxvZyhFUlJPUiwgImZhaWxl ZCB0byBjcmVhdGUgZXZlbnQgZm9yIHNvY2tldDogZXJyb3IgY29kZSAlZCIsCi0JCQkJCSBX U0FHZXRMYXN0RXJyb3IoKSk7Ci0JCX0KLQkJaWYgKFdTQUV2ZW50U2VsZWN0KGV2ZW50LT5m ZCwgKmhhbmRsZSwgZmxhZ3MpICE9IDApCi0JCQllbG9nKEVSUk9SLCAiZmFpbGVkIHRvIHNl dCB1cCBldmVudCBmb3Igc29ja2V0OiBlcnJvciBjb2RlICVkIiwKLQkJCQkgV1NBR2V0TGFz dEVycm9yKCkpOwotCi0JCUFzc2VydChldmVudC0+ZmQgIT0gUEdJTlZBTElEX1NPQ0tFVCk7 Ci0JfQotfQotI2VuZGlmCi0KLS8qCi0gKiBXYWl0IGZvciBldmVudHMgYWRkZWQgdG8gdGhl IHNldCB0byBoYXBwZW4sIG9yIHVudGlsIHRoZSB0aW1lb3V0IGlzCi0gKiByZWFjaGVkLiAg QXQgbW9zdCBuZXZlbnRzIG9jY3VycmVkIGV2ZW50cyBhcmUgcmV0dXJuZWQuCi0gKgotICog SWYgdGltZW91dCA9IC0xLCBibG9jayB1bnRpbCBhbiBldmVudCBvY2N1cnM7IGlmIDAsIGNo ZWNrIHNvY2tldHMgZm9yCi0gKiByZWFkaW5lc3MsIGJ1dCBkb24ndCBibG9jazsgaWYgPiAw LCBibG9jayBmb3IgYXQgbW9zdCB0aW1lb3V0IG1pbGxpc2Vjb25kcy4KLSAqCi0gKiBSZXR1 cm5zIHRoZSBudW1iZXIgb2YgZXZlbnRzIG9jY3VycmVkLCBvciAwIGlmIHRoZSB0aW1lb3V0 IHdhcyByZWFjaGVkLgotICoKLSAqIFJldHVybmVkIGV2ZW50cyB3aWxsIGhhdmUgdGhlIGZk LCBwb3MsIHVzZXJfZGF0YSBmaWVsZHMgc2V0IHRvIHRoZQotICogdmFsdWVzIGFzc29jaWF0 ZWQgd2l0aCB0aGUgcmVnaXN0ZXJlZCBldmVudC4KLSAqLwotaW50Ci1XYWl0RXZlbnRTZXRX YWl0KFdhaXRFdmVudFNldCAqc2V0LCBsb25nIHRpbWVvdXQsCi0JCQkJIFdhaXRFdmVudCAq b2NjdXJyZWRfZXZlbnRzLCBpbnQgbmV2ZW50cywKLQkJCQkgdWludDMyIHdhaXRfZXZlbnRf aW5mbykKLXsKLQlpbnQJCQlyZXR1cm5lZF9ldmVudHMgPSAwOwotCWluc3RyX3RpbWUJc3Rh cnRfdGltZTsKLQlpbnN0cl90aW1lCWN1cl90aW1lOwotCWxvbmcJCWN1cl90aW1lb3V0ID0g LTE7Ci0KLQlBc3NlcnQobmV2ZW50cyA+IDApOwotCi0JLyoKLQkgKiBJbml0aWFsaXplIHRp bWVvdXQgaWYgcmVxdWVzdGVkLiAgV2UgbXVzdCByZWNvcmQgdGhlIGN1cnJlbnQgdGltZSBz bwotCSAqIHRoYXQgd2UgY2FuIGRldGVybWluZSB0aGUgcmVtYWluaW5nIHRpbWVvdXQgaWYg aW50ZXJydXB0ZWQuCi0JICovCi0JaWYgKHRpbWVvdXQgPj0gMCkKLQl7Ci0JCUlOU1RSX1RJ TUVfU0VUX0NVUlJFTlQoc3RhcnRfdGltZSk7Ci0JCUFzc2VydCh0aW1lb3V0ID49IDAgJiYg dGltZW91dCA8PSBJTlRfTUFYKTsKLQkJY3VyX3RpbWVvdXQgPSB0aW1lb3V0OwotCX0KLQll bHNlCi0JCUlOU1RSX1RJTUVfU0VUX1pFUk8oc3RhcnRfdGltZSk7Ci0KLQlwZ3N0YXRfcmVw b3J0X3dhaXRfc3RhcnQod2FpdF9ldmVudF9pbmZvKTsKLQotI2lmbmRlZiBXSU4zMgotCXdh aXRpbmcgPSB0cnVlOwotI2Vsc2UKLQkvKiBFbnN1cmUgdGhhdCBzaWduYWxzIGFyZSBzZXJ2 aWNlZCBldmVuIGlmIGxhdGNoIGlzIGFscmVhZHkgc2V0ICovCi0JcGd3aW4zMl9kaXNwYXRj aF9xdWV1ZWRfc2lnbmFscygpOwotI2VuZGlmCi0Jd2hpbGUgKHJldHVybmVkX2V2ZW50cyA9 PSAwKQotCXsKLQkJaW50CQkJcmM7Ci0KLQkJLyoKLQkJICogQ2hlY2sgaWYgdGhlIGxhdGNo IGlzIHNldCBhbHJlYWR5IGZpcnN0LiAgSWYgc28sIHdlIGVpdGhlciBleGl0Ci0JCSAqIGlt bWVkaWF0ZWx5IG9yIGFzayB0aGUga2VybmVsIGZvciBmdXJ0aGVyIGV2ZW50cyBhdmFpbGFi bGUgcmlnaHQKLQkJICogbm93IHdpdGhvdXQgd2FpdGluZywgZGVwZW5kaW5nIG9uIGhvdyBt YW55IGV2ZW50cyB0aGUgY2FsbGVyIHdhbnRzLgotCQkgKgotCQkgKiBJZiBzb21lb25lIHNl dHMgdGhlIGxhdGNoIGJldHdlZW4gdGhpcyBhbmQgdGhlCi0JCSAqIFdhaXRFdmVudFNldFdh aXRCbG9jaygpIGJlbG93LCB0aGUgc2V0dGVyIHdpbGwgd3JpdGUgYSBieXRlIHRvIHRoZQot CQkgKiBwaXBlIChvciBzaWduYWwgdXMgYW5kIHRoZSBzaWduYWwgaGFuZGxlciB3aWxsIGRv IHRoYXQpLCBhbmQgdGhlCi0JCSAqIHJlYWRpbmVzcyByb3V0aW5lIHdpbGwgcmV0dXJuIGlt bWVkaWF0ZWx5LgotCQkgKgotCQkgKiBPbiB1bml4LCBJZiB0aGVyZSdzIGEgcGVuZGluZyBi eXRlIGluIHRoZSBzZWxmIHBpcGUsIHdlJ2xsIG5vdGljZQotCQkgKiB3aGVuZXZlciBibG9j a2luZy4gT25seSBjbGVhcmluZyB0aGUgcGlwZSBpbiB0aGF0IGNhc2UgYXZvaWRzCi0JCSAq IGhhdmluZyB0byBkcmFpbiBpdCBldmVyeSB0aW1lIFdhaXRMYXRjaE9yU29ja2V0KCkgaXMg dXNlZC4gU2hvdWxkCi0JCSAqIHRoZSBwaXBlLWJ1ZmZlciBmaWxsIHVwIHdlJ3JlIHN0aWxs IG9rLCBiZWNhdXNlIHRoZSBwaXBlIGlzIGluCi0JCSAqIG5vbmJsb2NraW5nIG1vZGUuIEl0 J3MgdW5saWtlbHkgZm9yIHRoYXQgdG8gaGFwcGVuLCBiZWNhdXNlIHRoZQotCQkgKiBzZWxm IHBpcGUgaXNuJ3QgZmlsbGVkIHVubGVzcyB3ZSdyZSBibG9ja2luZyAod2FpdGluZyA9IHRy dWUpLCBvcgotCQkgKiBmcm9tIGluc2lkZSBhIHNpZ25hbCBoYW5kbGVyIGluIGxhdGNoX3Np Z3VyZ19oYW5kbGVyKCkuCi0JCSAqCi0JCSAqIE9uIHdpbmRvd3MsIHdlJ2xsIGFsc28gbm90 aWNlIGlmIHRoZXJlJ3MgYSBwZW5kaW5nIGV2ZW50IGZvciB0aGUKLQkJICogbGF0Y2ggd2hl biBibG9ja2luZywgYnV0IHRoZXJlJ3Mgbm8gZGFuZ2VyIG9mIGFueXRoaW5nIGZpbGxpbmcg dXAsCi0JCSAqIGFzICJTZXR0aW5nIGFuIGV2ZW50IHRoYXQgaXMgYWxyZWFkeSBzZXQgaGFz IG5vIGVmZmVjdC4iLgotCQkgKgotCQkgKiBOb3RlOiB3ZSBhc3N1bWUgdGhhdCB0aGUga2Vy bmVsIGNhbGxzIGludm9sdmVkIGluIGxhdGNoIG1hbmFnZW1lbnQKLQkJICogd2lsbCBwcm92 aWRlIGFkZXF1YXRlIHN5bmNocm9uaXphdGlvbiBvbiBtYWNoaW5lcyB3aXRoIHdlYWsgbWVt b3J5Ci0JCSAqIG9yZGVyaW5nLCBzbyB0aGF0IHdlIGNhbm5vdCBtaXNzIHNlZWluZyBpc19z ZXQgaWYgYSBub3RpZmljYXRpb24KLQkJICogaGFzIGFscmVhZHkgYmVlbiBxdWV1ZWQuCi0J CSAqLwotCQlpZiAoc2V0LT5sYXRjaCAmJiAhc2V0LT5sYXRjaC0+aXNfc2V0KQotCQl7Ci0J CQkvKiBhYm91dCB0byBzbGVlcCBvbiBhIGxhdGNoICovCi0JCQlzZXQtPmxhdGNoLT5tYXli ZV9zbGVlcGluZyA9IHRydWU7Ci0JCQlwZ19tZW1vcnlfYmFycmllcigpOwotCQkJLyogYW5k IHJlY2hlY2sgKi8KLQkJfQotCi0JCWlmIChzZXQtPmxhdGNoICYmIHNldC0+bGF0Y2gtPmlz X3NldCkKLQkJewotCQkJb2NjdXJyZWRfZXZlbnRzLT5mZCA9IFBHSU5WQUxJRF9TT0NLRVQ7 Ci0JCQlvY2N1cnJlZF9ldmVudHMtPnBvcyA9IHNldC0+bGF0Y2hfcG9zOwotCQkJb2NjdXJy ZWRfZXZlbnRzLT51c2VyX2RhdGEgPQotCQkJCXNldC0+ZXZlbnRzW3NldC0+bGF0Y2hfcG9z XS51c2VyX2RhdGE7Ci0JCQlvY2N1cnJlZF9ldmVudHMtPmV2ZW50cyA9IFdMX0xBVENIX1NF VDsKLQkJCW9jY3VycmVkX2V2ZW50cysrOwotCQkJcmV0dXJuZWRfZXZlbnRzKys7Ci0KLQkJ CS8qIGNvdWxkIGhhdmUgYmVlbiBzZXQgYWJvdmUgKi8KLQkJCXNldC0+bGF0Y2gtPm1heWJl X3NsZWVwaW5nID0gZmFsc2U7Ci0KLQkJCWlmIChyZXR1cm5lZF9ldmVudHMgPT0gbmV2ZW50 cykKLQkJCQlicmVhazsJCQkvKiBvdXRwdXQgYnVmZmVyIGZ1bGwgYWxyZWFkeSAqLwotCi0J CQkvKgotCQkJICogRXZlbiB0aG91Z2ggd2UgYWxyZWFkeSBoYXZlIGFuIGV2ZW50LCB3ZSds bCBwb2xsIGp1c3Qgb25jZSB3aXRoCi0JCQkgKiB6ZXJvIHRpbWVvdXQgdG8gc2VlIHdoYXQg bm9uLWxhdGNoIGV2ZW50cyB3ZSBjYW4gZml0IGludG8gdGhlCi0JCQkgKiBvdXRwdXQgYnVm ZmVyIGF0IHRoZSBzYW1lIHRpbWUuCi0JCQkgKi8KLQkJCWN1cl90aW1lb3V0ID0gMDsKLQkJ CXRpbWVvdXQgPSAwOwotCQl9Ci0KLQkJLyoKLQkJICogV2FpdCBmb3IgZXZlbnRzIHVzaW5n IHRoZSByZWFkaW5lc3MgcHJpbWl0aXZlIGNob3NlbiBhdCB0aGUgdG9wIG9mCi0JCSAqIHRo aXMgZmlsZS4gSWYgLTEgaXMgcmV0dXJuZWQsIGEgdGltZW91dCBoYXMgb2NjdXJyZWQsIGlm IDAgd2UgaGF2ZQotCQkgKiB0byByZXRyeSwgZXZlcnl0aGluZyA+PSAxIGlzIHRoZSBudW1i ZXIgb2YgcmV0dXJuZWQgZXZlbnRzLgotCQkgKi8KLQkJcmMgPSBXYWl0RXZlbnRTZXRXYWl0 QmxvY2soc2V0LCBjdXJfdGltZW91dCwKLQkJCQkJCQkJICAgb2NjdXJyZWRfZXZlbnRzLCBu ZXZlbnRzIC0gcmV0dXJuZWRfZXZlbnRzKTsKLQotCQlpZiAoc2V0LT5sYXRjaCAmJgotCQkJ c2V0LT5sYXRjaC0+bWF5YmVfc2xlZXBpbmcpCi0JCQlzZXQtPmxhdGNoLT5tYXliZV9zbGVl cGluZyA9IGZhbHNlOwotCi0JCWlmIChyYyA9PSAtMSkKLQkJCWJyZWFrOwkJCQkvKiB0aW1l b3V0IG9jY3VycmVkICovCi0JCWVsc2UKLQkJCXJldHVybmVkX2V2ZW50cyArPSByYzsKLQot CQkvKiBJZiB3ZSdyZSBub3QgZG9uZSwgdXBkYXRlIGN1cl90aW1lb3V0IGZvciBuZXh0IGl0 ZXJhdGlvbiAqLwotCQlpZiAocmV0dXJuZWRfZXZlbnRzID09IDAgJiYgdGltZW91dCA+PSAw KQotCQl7Ci0JCQlJTlNUUl9USU1FX1NFVF9DVVJSRU5UKGN1cl90aW1lKTsKLQkJCUlOU1RS X1RJTUVfU1VCVFJBQ1QoY3VyX3RpbWUsIHN0YXJ0X3RpbWUpOwotCQkJY3VyX3RpbWVvdXQg PSB0aW1lb3V0IC0gKGxvbmcpIElOU1RSX1RJTUVfR0VUX01JTExJU0VDKGN1cl90aW1lKTsK LQkJCWlmIChjdXJfdGltZW91dCA8PSAwKQotCQkJCWJyZWFrOwotCQl9Ci0JfQotI2lmbmRl ZiBXSU4zMgotCXdhaXRpbmcgPSBmYWxzZTsKLSNlbmRpZgotCi0JcGdzdGF0X3JlcG9ydF93 YWl0X2VuZCgpOwotCi0JcmV0dXJuIHJldHVybmVkX2V2ZW50czsKLX0KLQotCi0jaWYgZGVm aW5lZChXQUlUX1VTRV9FUE9MTCkKLQotLyoKLSAqIFdhaXQgdXNpbmcgbGludXgncyBlcG9s bF93YWl0KDIpLgotICoKLSAqIFRoaXMgaXMgdGhlIHByZWZlcmFibGUgd2FpdCBtZXRob2Qs IGFzIHNldmVyYWwgcmVhZGluZXNzIG5vdGlmaWNhdGlvbnMgYXJlCi0gKiBkZWxpdmVyZWQs IHdpdGhvdXQgaGF2aW5nIHRvIGl0ZXJhdGUgdGhyb3VnaCBhbGwgb2Ygc2V0LT5ldmVudHMu IFRoZSByZXR1cm4KLSAqIGVwb2xsX2V2ZW50IHN0cnVjdCBjb250YWluIGEgcG9pbnRlciB0 byBvdXIgZXZlbnRzLCBtYWtpbmcgYXNzb2NpYXRpb24KLSAqIGVhc3kuCi0gKi8KLXN0YXRp YyBpbmxpbmUgaW50Ci1XYWl0RXZlbnRTZXRXYWl0QmxvY2soV2FpdEV2ZW50U2V0ICpzZXQs IGludCBjdXJfdGltZW91dCwKLQkJCQkJICBXYWl0RXZlbnQgKm9jY3VycmVkX2V2ZW50cywg aW50IG5ldmVudHMpCi17Ci0JaW50CQkJcmV0dXJuZWRfZXZlbnRzID0gMDsKLQlpbnQJCQly YzsKLQlXYWl0RXZlbnQgICpjdXJfZXZlbnQ7Ci0Jc3RydWN0IGVwb2xsX2V2ZW50ICpjdXJf ZXBvbGxfZXZlbnQ7Ci0KLQkvKiBTbGVlcCAqLwotCXJjID0gZXBvbGxfd2FpdChzZXQtPmVw b2xsX2ZkLCBzZXQtPmVwb2xsX3JldF9ldmVudHMsCi0JCQkJCU1pbihuZXZlbnRzLCBzZXQt Pm5ldmVudHNfc3BhY2UpLCBjdXJfdGltZW91dCk7Ci0KLQkvKiBDaGVjayByZXR1cm4gY29k ZSAqLwotCWlmIChyYyA8IDApCi0JewotCQkvKiBFSU5UUiBpcyBva2F5LCBvdGhlcndpc2Ug Y29tcGxhaW4gKi8KLQkJaWYgKGVycm5vICE9IEVJTlRSKQotCQl7Ci0JCQl3YWl0aW5nID0g ZmFsc2U7Ci0JCQllcmVwb3J0KEVSUk9SLAotCQkJCQkoZXJyY29kZV9mb3Jfc29ja2V0X2Fj Y2VzcygpLAotCQkJCQkgZXJybXNnKCIlcygpIGZhaWxlZDogJW0iLAotCQkJCQkJCSJlcG9s bF93YWl0IikpKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSBpZiAocmMgPT0gMCkK LQl7Ci0JCS8qIHRpbWVvdXQgZXhjZWVkZWQgKi8KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8q Ci0JICogQXQgbGVhc3Qgb25lIGV2ZW50IG9jY3VycmVkLCBpdGVyYXRlIG92ZXIgdGhlIHJl dHVybmVkIGVwb2xsIGV2ZW50cwotCSAqIHVudGlsIHRoZXkncmUgZWl0aGVyIGFsbCBwcm9j ZXNzZWQsIG9yIHdlJ3ZlIHJldHVybmVkIGFsbCB0aGUgZXZlbnRzCi0JICogdGhlIGNhbGxl ciBkZXNpcmVkLgotCSAqLwotCWZvciAoY3VyX2Vwb2xsX2V2ZW50ID0gc2V0LT5lcG9sbF9y ZXRfZXZlbnRzOwotCQkgY3VyX2Vwb2xsX2V2ZW50IDwgKHNldC0+ZXBvbGxfcmV0X2V2ZW50 cyArIHJjKSAmJgotCQkgcmV0dXJuZWRfZXZlbnRzIDwgbmV2ZW50czsKLQkJIGN1cl9lcG9s bF9ldmVudCsrKQotCXsKLQkJLyogZXBvbGwncyBkYXRhIHBvaW50ZXIgaXMgc2V0IHRvIHRo ZSBhc3NvY2lhdGVkIFdhaXRFdmVudCAqLwotCQljdXJfZXZlbnQgPSAoV2FpdEV2ZW50ICop IGN1cl9lcG9sbF9ldmVudC0+ZGF0YS5wdHI7Ci0KLQkJb2NjdXJyZWRfZXZlbnRzLT5wb3Mg PSBjdXJfZXZlbnQtPnBvczsKLQkJb2NjdXJyZWRfZXZlbnRzLT51c2VyX2RhdGEgPSBjdXJf ZXZlbnQtPnVzZXJfZGF0YTsKLQkJb2NjdXJyZWRfZXZlbnRzLT5ldmVudHMgPSAwOwotCi0J CWlmIChjdXJfZXZlbnQtPmV2ZW50cyA9PSBXTF9MQVRDSF9TRVQgJiYKLQkJCWN1cl9lcG9s bF9ldmVudC0+ZXZlbnRzICYgKEVQT0xMSU4gfCBFUE9MTEVSUiB8IEVQT0xMSFVQKSkKLQkJ ewotCQkJLyogRHJhaW4gdGhlIHNpZ25hbGZkLiAqLwotCQkJZHJhaW4oKTsKLQotCQkJaWYg KHNldC0+bGF0Y2ggJiYgc2V0LT5sYXRjaC0+bWF5YmVfc2xlZXBpbmcgJiYgc2V0LT5sYXRj aC0+aXNfc2V0KQotCQkJewotCQkJCW9jY3VycmVkX2V2ZW50cy0+ZmQgPSBQR0lOVkFMSURf U09DS0VUOwotCQkJCW9jY3VycmVkX2V2ZW50cy0+ZXZlbnRzID0gV0xfTEFUQ0hfU0VUOwot CQkJCW9jY3VycmVkX2V2ZW50cysrOwotCQkJCXJldHVybmVkX2V2ZW50cysrOwotCQkJfQot CQl9Ci0JCWVsc2UgaWYgKGN1cl9ldmVudC0+ZXZlbnRzID09IFdMX1BPU1RNQVNURVJfREVB VEggJiYKLQkJCQkgY3VyX2Vwb2xsX2V2ZW50LT5ldmVudHMgJiAoRVBPTExJTiB8IEVQT0xM RVJSIHwgRVBPTExIVVApKQotCQl7Ci0JCQkvKgotCQkJICogV2UgZXhwZWN0IGFuIEVQT0xM SFVQIHdoZW4gdGhlIHJlbW90ZSBlbmQgaXMgY2xvc2VkLCBidXQKLQkJCSAqIGJlY2F1c2Ug d2UgZG9uJ3QgZXhwZWN0IHRoZSBwaXBlIHRvIGJlY29tZSByZWFkYWJsZSBvciB0byBoYXZl Ci0JCQkgKiBhbnkgZXJyb3JzIGVpdGhlciwgdHJlYXQgdGhvc2UgY2FzZXMgYXMgcG9zdG1h c3RlciBkZWF0aCwgdG9vLgotCQkJICoKLQkJCSAqIEJlIHBhcmFub2lkIGFib3V0IGEgc3B1 cmlvdXMgZXZlbnQgc2lnbmFsaW5nIHRoZSBwb3N0bWFzdGVyIGFzCi0JCQkgKiBiZWluZyBk ZWFkLiAgVGhlcmUgaGF2ZSBiZWVuIHJlcG9ydHMgYWJvdXQgdGhhdCBoYXBwZW5pbmcgd2l0 aAotCQkJICogb2xkZXIgcHJpbWl0aXZlcyAoc2VsZWN0KDIpIHRvIGJlIHNwZWNpZmljKSwg YW5kIGEgc3B1cmlvdXMKLQkJCSAqIFdMX1BPU1RNQVNURVJfREVBVEggZXZlbnQgd291bGQg YmUgcGFpbmZ1bC4gUmUtY2hlY2tpbmcgZG9lc24ndAotCQkJICogY29zdCBtdWNoLgotCQkJ ICovCi0JCQlpZiAoIVBvc3RtYXN0ZXJJc0FsaXZlSW50ZXJuYWwoKSkKLQkJCXsKLQkJCQlp ZiAoc2V0LT5leGl0X29uX3Bvc3RtYXN0ZXJfZGVhdGgpCi0JCQkJCXByb2NfZXhpdCgxKTsK LQkJCQlvY2N1cnJlZF9ldmVudHMtPmZkID0gUEdJTlZBTElEX1NPQ0tFVDsKLQkJCQlvY2N1 cnJlZF9ldmVudHMtPmV2ZW50cyA9IFdMX1BPU1RNQVNURVJfREVBVEg7Ci0JCQkJb2NjdXJy ZWRfZXZlbnRzKys7Ci0JCQkJcmV0dXJuZWRfZXZlbnRzKys7Ci0JCQl9Ci0JCX0KLQkJZWxz ZSBpZiAoY3VyX2V2ZW50LT5ldmVudHMgJiAoV0xfU09DS0VUX1JFQURBQkxFIHwKLQkJCQkJ CQkJCSAgV0xfU09DS0VUX1dSSVRFQUJMRSB8Ci0JCQkJCQkJCQkgIFdMX1NPQ0tFVF9DTE9T RUQpKQotCQl7Ci0JCQlBc3NlcnQoY3VyX2V2ZW50LT5mZCAhPSBQR0lOVkFMSURfU09DS0VU KTsKLQotCQkJaWYgKChjdXJfZXZlbnQtPmV2ZW50cyAmIFdMX1NPQ0tFVF9SRUFEQUJMRSkg JiYKLQkJCQkoY3VyX2Vwb2xsX2V2ZW50LT5ldmVudHMgJiAoRVBPTExJTiB8IEVQT0xMRVJS IHwgRVBPTExIVVApKSkKLQkJCXsKLQkJCQkvKiBkYXRhIGF2YWlsYWJsZSBpbiBzb2NrZXQs IG9yIEVPRiAqLwotCQkJCW9jY3VycmVkX2V2ZW50cy0+ZXZlbnRzIHw9IFdMX1NPQ0tFVF9S RUFEQUJMRTsKLQkJCX0KLQotCQkJaWYgKChjdXJfZXZlbnQtPmV2ZW50cyAmIFdMX1NPQ0tF VF9XUklURUFCTEUpICYmCi0JCQkJKGN1cl9lcG9sbF9ldmVudC0+ZXZlbnRzICYgKEVQT0xM T1VUIHwgRVBPTExFUlIgfCBFUE9MTEhVUCkpKQotCQkJewotCQkJCS8qIHdyaXRhYmxlLCBv ciBFT0YgKi8KLQkJCQlvY2N1cnJlZF9ldmVudHMtPmV2ZW50cyB8PSBXTF9TT0NLRVRfV1JJ VEVBQkxFOwotCQkJfQotCi0JCQlpZiAoKGN1cl9ldmVudC0+ZXZlbnRzICYgV0xfU09DS0VU X0NMT1NFRCkgJiYKLQkJCQkoY3VyX2Vwb2xsX2V2ZW50LT5ldmVudHMgJiAoRVBPTExSREhV UCB8IEVQT0xMRVJSIHwgRVBPTExIVVApKSkKLQkJCXsKLQkJCQkvKiByZW1vdGUgcGVlciBz aHV0IGRvd24sIG9yIGVycm9yICovCi0JCQkJb2NjdXJyZWRfZXZlbnRzLT5ldmVudHMgfD0g V0xfU09DS0VUX0NMT1NFRDsKLQkJCX0KLQotCQkJaWYgKG9jY3VycmVkX2V2ZW50cy0+ZXZl bnRzICE9IDApCi0JCQl7Ci0JCQkJb2NjdXJyZWRfZXZlbnRzLT5mZCA9IGN1cl9ldmVudC0+ ZmQ7Ci0JCQkJb2NjdXJyZWRfZXZlbnRzKys7Ci0JCQkJcmV0dXJuZWRfZXZlbnRzKys7Ci0J CQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmV0dXJuZWRfZXZlbnRzOwotfQotCi0jZWxpZiBk ZWZpbmVkKFdBSVRfVVNFX0tRVUVVRSkKLQotLyoKLSAqIFdhaXQgdXNpbmcga2V2ZW50KDIp IG9uIEJTRC1mYW1pbHkgc3lzdGVtcyBhbmQgbWFjT1MuCi0gKgotICogRm9yIG5vdyB0aGlz IG1pcnJvcnMgdGhlIGVwb2xsIGNvZGUsIGJ1dCBpbiBmdXR1cmUgaXQgY291bGQgbW9kaWZ5 IHRoZSBmZAotICogc2V0IGluIHRoZSBzYW1lIGNhbGwgdG8ga2V2ZW50IGFzIGl0IHVzZXMg Zm9yIHdhaXRpbmcgaW5zdGVhZCBvZiBkb2luZyB0aGF0Ci0gKiB3aXRoIHNlcGFyYXRlIHN5 c3RlbSBjYWxscy4KLSAqLwotc3RhdGljIGludAotV2FpdEV2ZW50U2V0V2FpdEJsb2NrKFdh aXRFdmVudFNldCAqc2V0LCBpbnQgY3VyX3RpbWVvdXQsCi0JCQkJCSAgV2FpdEV2ZW50ICpv Y2N1cnJlZF9ldmVudHMsIGludCBuZXZlbnRzKQotewotCWludAkJCXJldHVybmVkX2V2ZW50 cyA9IDA7Ci0JaW50CQkJcmM7Ci0JV2FpdEV2ZW50ICAqY3VyX2V2ZW50OwotCXN0cnVjdCBr ZXZlbnQgKmN1cl9rcXVldWVfZXZlbnQ7Ci0Jc3RydWN0IHRpbWVzcGVjIHRpbWVvdXQ7Ci0J c3RydWN0IHRpbWVzcGVjICp0aW1lb3V0X3A7Ci0KLQlpZiAoY3VyX3RpbWVvdXQgPCAwKQot CQl0aW1lb3V0X3AgPSBOVUxMOwotCWVsc2UKLQl7Ci0JCXRpbWVvdXQudHZfc2VjID0gY3Vy X3RpbWVvdXQgLyAxMDAwOwotCQl0aW1lb3V0LnR2X25zZWMgPSAoY3VyX3RpbWVvdXQgJSAx MDAwKSAqIDEwMDAwMDA7Ci0JCXRpbWVvdXRfcCA9ICZ0aW1lb3V0OwotCX0KLQotCS8qCi0J ICogUmVwb3J0IHBvc3RtYXN0ZXIgZXZlbnRzIGRpc2NvdmVyZWQgYnkgV2FpdEV2ZW50QWRq dXN0S3F1ZXVlKCkgb3IgYW4KLQkgKiBlYXJsaWVyIGNhbGwgdG8gV2FpdEV2ZW50U2V0V2Fp dCgpLgotCSAqLwotCWlmICh1bmxpa2VseShzZXQtPnJlcG9ydF9wb3N0bWFzdGVyX25vdF9y dW5uaW5nKSkKLQl7Ci0JCWlmIChzZXQtPmV4aXRfb25fcG9zdG1hc3Rlcl9kZWF0aCkKLQkJ CXByb2NfZXhpdCgxKTsKLQkJb2NjdXJyZWRfZXZlbnRzLT5mZCA9IFBHSU5WQUxJRF9TT0NL RVQ7Ci0JCW9jY3VycmVkX2V2ZW50cy0+ZXZlbnRzID0gV0xfUE9TVE1BU1RFUl9ERUFUSDsK LQkJcmV0dXJuIDE7Ci0JfQotCi0JLyogU2xlZXAgKi8KLQlyYyA9IGtldmVudChzZXQtPmtx dWV1ZV9mZCwgTlVMTCwgMCwKLQkJCQlzZXQtPmtxdWV1ZV9yZXRfZXZlbnRzLAotCQkJCU1p bihuZXZlbnRzLCBzZXQtPm5ldmVudHNfc3BhY2UpLAotCQkJCXRpbWVvdXRfcCk7Ci0KLQkv KiBDaGVjayByZXR1cm4gY29kZSAqLwotCWlmIChyYyA8IDApCi0JewotCQkvKiBFSU5UUiBp cyBva2F5LCBvdGhlcndpc2UgY29tcGxhaW4gKi8KLQkJaWYgKGVycm5vICE9IEVJTlRSKQot CQl7Ci0JCQl3YWl0aW5nID0gZmFsc2U7Ci0JCQllcmVwb3J0KEVSUk9SLAotCQkJCQkoZXJy Y29kZV9mb3Jfc29ja2V0X2FjY2VzcygpLAotCQkJCQkgZXJybXNnKCIlcygpIGZhaWxlZDog JW0iLAotCQkJCQkJCSJrZXZlbnQiKSkpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQllbHNl IGlmIChyYyA9PSAwKQotCXsKLQkJLyogdGltZW91dCBleGNlZWRlZCAqLwotCQlyZXR1cm4g LTE7Ci0JfQotCi0JLyoKLQkgKiBBdCBsZWFzdCBvbmUgZXZlbnQgb2NjdXJyZWQsIGl0ZXJh dGUgb3ZlciB0aGUgcmV0dXJuZWQga3F1ZXVlIGV2ZW50cwotCSAqIHVudGlsIHRoZXkncmUg ZWl0aGVyIGFsbCBwcm9jZXNzZWQsIG9yIHdlJ3ZlIHJldHVybmVkIGFsbCB0aGUgZXZlbnRz Ci0JICogdGhlIGNhbGxlciBkZXNpcmVkLgotCSAqLwotCWZvciAoY3VyX2txdWV1ZV9ldmVu dCA9IHNldC0+a3F1ZXVlX3JldF9ldmVudHM7Ci0JCSBjdXJfa3F1ZXVlX2V2ZW50IDwgKHNl dC0+a3F1ZXVlX3JldF9ldmVudHMgKyByYykgJiYKLQkJIHJldHVybmVkX2V2ZW50cyA8IG5l dmVudHM7Ci0JCSBjdXJfa3F1ZXVlX2V2ZW50KyspCi0JewotCQkvKiBrZXZlbnQncyB1ZGF0 YSBwb2ludHMgdG8gdGhlIGFzc29jaWF0ZWQgV2FpdEV2ZW50ICovCi0JCWN1cl9ldmVudCA9 IEFjY2Vzc1dhaXRFdmVudChjdXJfa3F1ZXVlX2V2ZW50KTsKLQotCQlvY2N1cnJlZF9ldmVu dHMtPnBvcyA9IGN1cl9ldmVudC0+cG9zOwotCQlvY2N1cnJlZF9ldmVudHMtPnVzZXJfZGF0 YSA9IGN1cl9ldmVudC0+dXNlcl9kYXRhOwotCQlvY2N1cnJlZF9ldmVudHMtPmV2ZW50cyA9 IDA7Ci0KLQkJaWYgKGN1cl9ldmVudC0+ZXZlbnRzID09IFdMX0xBVENIX1NFVCAmJgotCQkJ Y3VyX2txdWV1ZV9ldmVudC0+ZmlsdGVyID09IEVWRklMVF9TSUdOQUwpCi0JCXsKLQkJCWlm IChzZXQtPmxhdGNoICYmIHNldC0+bGF0Y2gtPm1heWJlX3NsZWVwaW5nICYmIHNldC0+bGF0 Y2gtPmlzX3NldCkKLQkJCXsKLQkJCQlvY2N1cnJlZF9ldmVudHMtPmZkID0gUEdJTlZBTElE X1NPQ0tFVDsKLQkJCQlvY2N1cnJlZF9ldmVudHMtPmV2ZW50cyA9IFdMX0xBVENIX1NFVDsK LQkJCQlvY2N1cnJlZF9ldmVudHMrKzsKLQkJCQlyZXR1cm5lZF9ldmVudHMrKzsKLQkJCX0K LQkJfQotCQllbHNlIGlmIChjdXJfZXZlbnQtPmV2ZW50cyA9PSBXTF9QT1NUTUFTVEVSX0RF QVRIICYmCi0JCQkJIGN1cl9rcXVldWVfZXZlbnQtPmZpbHRlciA9PSBFVkZJTFRfUFJPQyAm JgotCQkJCSAoY3VyX2txdWV1ZV9ldmVudC0+ZmZsYWdzICYgTk9URV9FWElUKSAhPSAwKQot CQl7Ci0JCQkvKgotCQkJICogVGhlIGtlcm5lbCB3aWxsIHRlbGwgdGhpcyBrcXVldWUgb2Jq ZWN0IG9ubHkgb25jZSBhYm91dCB0aGUKLQkJCSAqIGV4aXQgb2YgdGhlIHBvc3RtYXN0ZXIs IHNvIGxldCdzIHJlbWVtYmVyIHRoYXQgZm9yIG5leHQgdGltZSBzbwotCQkJICogdGhhdCB3 ZSBwcm92aWRlIGxldmVsLXRyaWdnZXJlZCBzZW1hbnRpY3MuCi0JCQkgKi8KLQkJCXNldC0+ cmVwb3J0X3Bvc3RtYXN0ZXJfbm90X3J1bm5pbmcgPSB0cnVlOwotCi0JCQlpZiAoc2V0LT5l eGl0X29uX3Bvc3RtYXN0ZXJfZGVhdGgpCi0JCQkJcHJvY19leGl0KDEpOwotCQkJb2NjdXJy ZWRfZXZlbnRzLT5mZCA9IFBHSU5WQUxJRF9TT0NLRVQ7Ci0JCQlvY2N1cnJlZF9ldmVudHMt PmV2ZW50cyA9IFdMX1BPU1RNQVNURVJfREVBVEg7Ci0JCQlvY2N1cnJlZF9ldmVudHMrKzsK LQkJCXJldHVybmVkX2V2ZW50cysrOwotCQl9Ci0JCWVsc2UgaWYgKGN1cl9ldmVudC0+ZXZl bnRzICYgKFdMX1NPQ0tFVF9SRUFEQUJMRSB8Ci0JCQkJCQkJCQkgIFdMX1NPQ0tFVF9XUklU RUFCTEUgfAotCQkJCQkJCQkJICBXTF9TT0NLRVRfQ0xPU0VEKSkKLQkJewotCQkJQXNzZXJ0 KGN1cl9ldmVudC0+ZmQgPj0gMCk7Ci0KLQkJCWlmICgoY3VyX2V2ZW50LT5ldmVudHMgJiBX TF9TT0NLRVRfUkVBREFCTEUpICYmCi0JCQkJKGN1cl9rcXVldWVfZXZlbnQtPmZpbHRlciA9 PSBFVkZJTFRfUkVBRCkpCi0JCQl7Ci0JCQkJLyogcmVhZGFibGUsIG9yIEVPRiAqLwotCQkJ CW9jY3VycmVkX2V2ZW50cy0+ZXZlbnRzIHw9IFdMX1NPQ0tFVF9SRUFEQUJMRTsKLQkJCX0K LQotCQkJaWYgKChjdXJfZXZlbnQtPmV2ZW50cyAmIFdMX1NPQ0tFVF9DTE9TRUQpICYmCi0J CQkJKGN1cl9rcXVldWVfZXZlbnQtPmZpbHRlciA9PSBFVkZJTFRfUkVBRCkgJiYKLQkJCQko Y3VyX2txdWV1ZV9ldmVudC0+ZmxhZ3MgJiBFVl9FT0YpKQotCQkJewotCQkJCS8qIHRoZSBy ZW1vdGUgcGVlciBoYXMgc2h1dCBkb3duICovCi0JCQkJb2NjdXJyZWRfZXZlbnRzLT5ldmVu dHMgfD0gV0xfU09DS0VUX0NMT1NFRDsKLQkJCX0KLQotCQkJaWYgKChjdXJfZXZlbnQtPmV2 ZW50cyAmIFdMX1NPQ0tFVF9XUklURUFCTEUpICYmCi0JCQkJKGN1cl9rcXVldWVfZXZlbnQt PmZpbHRlciA9PSBFVkZJTFRfV1JJVEUpKQotCQkJewotCQkJCS8qIHdyaXRhYmxlLCBvciBF T0YgKi8KLQkJCQlvY2N1cnJlZF9ldmVudHMtPmV2ZW50cyB8PSBXTF9TT0NLRVRfV1JJVEVB QkxFOwotCQkJfQotCi0JCQlpZiAob2NjdXJyZWRfZXZlbnRzLT5ldmVudHMgIT0gMCkKLQkJ CXsKLQkJCQlvY2N1cnJlZF9ldmVudHMtPmZkID0gY3VyX2V2ZW50LT5mZDsKLQkJCQlvY2N1 cnJlZF9ldmVudHMrKzsKLQkJCQlyZXR1cm5lZF9ldmVudHMrKzsKLQkJCX0KLQkJfQotCX0K LQotCXJldHVybiByZXR1cm5lZF9ldmVudHM7Ci19Ci0KLSNlbGlmIGRlZmluZWQoV0FJVF9V U0VfUE9MTCkKLQotLyoKLSAqIFdhaXQgdXNpbmcgcG9sbCgyKS4KLSAqCi0gKiBUaGlzIGFs bG93cyB0byByZWNlaXZlIHJlYWRpbmVzcyBub3RpZmljYXRpb25zIGZvciBzZXZlcmFsIGV2 ZW50cyBhdCBvbmNlLAotICogYnV0IHJlcXVpcmVzIGl0ZXJhdGluZyB0aHJvdWdoIGFsbCBv ZiBzZXQtPnBvbGxmZHMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1XYWl0RXZlbnRTZXRX YWl0QmxvY2soV2FpdEV2ZW50U2V0ICpzZXQsIGludCBjdXJfdGltZW91dCwKLQkJCQkJICBX YWl0RXZlbnQgKm9jY3VycmVkX2V2ZW50cywgaW50IG5ldmVudHMpCi17Ci0JaW50CQkJcmV0 dXJuZWRfZXZlbnRzID0gMDsKLQlpbnQJCQlyYzsKLQlXYWl0RXZlbnQgICpjdXJfZXZlbnQ7 Ci0Jc3RydWN0IHBvbGxmZCAqY3VyX3BvbGxmZDsKLQotCS8qIFNsZWVwICovCi0JcmMgPSBw b2xsKHNldC0+cG9sbGZkcywgc2V0LT5uZXZlbnRzLCAoaW50KSBjdXJfdGltZW91dCk7Ci0K LQkvKiBDaGVjayByZXR1cm4gY29kZSAqLwotCWlmIChyYyA8IDApCi0JewotCQkvKiBFSU5U UiBpcyBva2F5LCBvdGhlcndpc2UgY29tcGxhaW4gKi8KLQkJaWYgKGVycm5vICE9IEVJTlRS KQotCQl7Ci0JCQl3YWl0aW5nID0gZmFsc2U7Ci0JCQllcmVwb3J0KEVSUk9SLAotCQkJCQko ZXJyY29kZV9mb3Jfc29ja2V0X2FjY2VzcygpLAotCQkJCQkgZXJybXNnKCIlcygpIGZhaWxl ZDogJW0iLAotCQkJCQkJCSJwb2xsIikpKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JZWxz ZSBpZiAocmMgPT0gMCkKLQl7Ci0JCS8qIHRpbWVvdXQgZXhjZWVkZWQgKi8KLQkJcmV0dXJu IC0xOwotCX0KLQotCWZvciAoY3VyX2V2ZW50ID0gc2V0LT5ldmVudHMsIGN1cl9wb2xsZmQg PSBzZXQtPnBvbGxmZHM7Ci0JCSBjdXJfZXZlbnQgPCAoc2V0LT5ldmVudHMgKyBzZXQtPm5l dmVudHMpICYmCi0JCSByZXR1cm5lZF9ldmVudHMgPCBuZXZlbnRzOwotCQkgY3VyX2V2ZW50 KyssIGN1cl9wb2xsZmQrKykKLQl7Ci0JCS8qIG5vIGFjdGl2aXR5IG9uIHRoaXMgRkQsIHNr aXAgKi8KLQkJaWYgKGN1cl9wb2xsZmQtPnJldmVudHMgPT0gMCkKLQkJCWNvbnRpbnVlOwot Ci0JCW9jY3VycmVkX2V2ZW50cy0+cG9zID0gY3VyX2V2ZW50LT5wb3M7Ci0JCW9jY3VycmVk X2V2ZW50cy0+dXNlcl9kYXRhID0gY3VyX2V2ZW50LT51c2VyX2RhdGE7Ci0JCW9jY3VycmVk X2V2ZW50cy0+ZXZlbnRzID0gMDsKLQotCQlpZiAoY3VyX2V2ZW50LT5ldmVudHMgPT0gV0xf TEFUQ0hfU0VUICYmCi0JCQkoY3VyX3BvbGxmZC0+cmV2ZW50cyAmIChQT0xMSU4gfCBQT0xM SFVQIHwgUE9MTEVSUiB8IFBPTExOVkFMKSkpCi0JCXsKLQkJCS8qIFRoZXJlJ3MgZGF0YSBp biB0aGUgc2VsZi1waXBlLCBjbGVhciBpdC4gKi8KLQkJCWRyYWluKCk7Ci0KLQkJCWlmIChz ZXQtPmxhdGNoICYmIHNldC0+bGF0Y2gtPm1heWJlX3NsZWVwaW5nICYmIHNldC0+bGF0Y2gt PmlzX3NldCkKLQkJCXsKLQkJCQlvY2N1cnJlZF9ldmVudHMtPmZkID0gUEdJTlZBTElEX1NP Q0tFVDsKLQkJCQlvY2N1cnJlZF9ldmVudHMtPmV2ZW50cyA9IFdMX0xBVENIX1NFVDsKLQkJ CQlvY2N1cnJlZF9ldmVudHMrKzsKLQkJCQlyZXR1cm5lZF9ldmVudHMrKzsKLQkJCX0KLQkJ fQotCQllbHNlIGlmIChjdXJfZXZlbnQtPmV2ZW50cyA9PSBXTF9QT1NUTUFTVEVSX0RFQVRI ICYmCi0JCQkJIChjdXJfcG9sbGZkLT5yZXZlbnRzICYgKFBPTExJTiB8IFBPTExIVVAgfCBQ T0xMRVJSIHwgUE9MTE5WQUwpKSkKLQkJewotCQkJLyoKLQkJCSAqIFdlIGV4cGVjdCBhbiBQ T0xMSFVQIHdoZW4gdGhlIHJlbW90ZSBlbmQgaXMgY2xvc2VkLCBidXQgYmVjYXVzZQotCQkJ ICogd2UgZG9uJ3QgZXhwZWN0IHRoZSBwaXBlIHRvIGJlY29tZSByZWFkYWJsZSBvciB0byBo YXZlIGFueQotCQkJICogZXJyb3JzIGVpdGhlciwgdHJlYXQgdGhvc2UgY2FzZXMgYXMgcG9z dG1hc3RlciBkZWF0aCwgdG9vLgotCQkJICoKLQkJCSAqIEJlIHBhcmFub2lkIGFib3V0IGEg c3B1cmlvdXMgZXZlbnQgc2lnbmFsaW5nIHRoZSBwb3N0bWFzdGVyIGFzCi0JCQkgKiBiZWlu ZyBkZWFkLiAgVGhlcmUgaGF2ZSBiZWVuIHJlcG9ydHMgYWJvdXQgdGhhdCBoYXBwZW5pbmcg d2l0aAotCQkJICogb2xkZXIgcHJpbWl0aXZlcyAoc2VsZWN0KDIpIHRvIGJlIHNwZWNpZmlj KSwgYW5kIGEgc3B1cmlvdXMKLQkJCSAqIFdMX1BPU1RNQVNURVJfREVBVEggZXZlbnQgd291 bGQgYmUgcGFpbmZ1bC4gUmUtY2hlY2tpbmcgZG9lc24ndAotCQkJICogY29zdCBtdWNoLgot CQkJICovCi0JCQlpZiAoIVBvc3RtYXN0ZXJJc0FsaXZlSW50ZXJuYWwoKSkKLQkJCXsKLQkJ CQlpZiAoc2V0LT5leGl0X29uX3Bvc3RtYXN0ZXJfZGVhdGgpCi0JCQkJCXByb2NfZXhpdCgx KTsKLQkJCQlvY2N1cnJlZF9ldmVudHMtPmZkID0gUEdJTlZBTElEX1NPQ0tFVDsKLQkJCQlv Y2N1cnJlZF9ldmVudHMtPmV2ZW50cyA9IFdMX1BPU1RNQVNURVJfREVBVEg7Ci0JCQkJb2Nj dXJyZWRfZXZlbnRzKys7Ci0JCQkJcmV0dXJuZWRfZXZlbnRzKys7Ci0JCQl9Ci0JCX0KLQkJ ZWxzZSBpZiAoY3VyX2V2ZW50LT5ldmVudHMgJiAoV0xfU09DS0VUX1JFQURBQkxFIHwKLQkJ CQkJCQkJCSAgV0xfU09DS0VUX1dSSVRFQUJMRSB8Ci0JCQkJCQkJCQkgIFdMX1NPQ0tFVF9D TE9TRUQpKQotCQl7Ci0JCQlpbnQJCQllcnJmbGFncyA9IFBPTExIVVAgfCBQT0xMRVJSIHwg UE9MTE5WQUw7Ci0KLQkJCUFzc2VydChjdXJfZXZlbnQtPmZkID49IFBHSU5WQUxJRF9TT0NL RVQpOwotCi0JCQlpZiAoKGN1cl9ldmVudC0+ZXZlbnRzICYgV0xfU09DS0VUX1JFQURBQkxF KSAmJgotCQkJCShjdXJfcG9sbGZkLT5yZXZlbnRzICYgKFBPTExJTiB8IGVycmZsYWdzKSkp Ci0JCQl7Ci0JCQkJLyogZGF0YSBhdmFpbGFibGUgaW4gc29ja2V0LCBvciBFT0YgKi8KLQkJ CQlvY2N1cnJlZF9ldmVudHMtPmV2ZW50cyB8PSBXTF9TT0NLRVRfUkVBREFCTEU7Ci0JCQl9 Ci0KLQkJCWlmICgoY3VyX2V2ZW50LT5ldmVudHMgJiBXTF9TT0NLRVRfV1JJVEVBQkxFKSAm JgotCQkJCShjdXJfcG9sbGZkLT5yZXZlbnRzICYgKFBPTExPVVQgfCBlcnJmbGFncykpKQot CQkJewotCQkJCS8qIHdyaXRlYWJsZSwgb3IgRU9GICovCi0JCQkJb2NjdXJyZWRfZXZlbnRz LT5ldmVudHMgfD0gV0xfU09DS0VUX1dSSVRFQUJMRTsKLQkJCX0KLQotI2lmZGVmIFBPTExS REhVUAotCQkJaWYgKChjdXJfZXZlbnQtPmV2ZW50cyAmIFdMX1NPQ0tFVF9DTE9TRUQpICYm Ci0JCQkJKGN1cl9wb2xsZmQtPnJldmVudHMgJiAoUE9MTFJESFVQIHwgZXJyZmxhZ3MpKSkK LQkJCXsKLQkJCQkvKiByZW1vdGUgcGVlciBjbG9zZWQsIG9yIGVycm9yICovCi0JCQkJb2Nj dXJyZWRfZXZlbnRzLT5ldmVudHMgfD0gV0xfU09DS0VUX0NMT1NFRDsKLQkJCX0KLSNlbmRp ZgotCi0JCQlpZiAob2NjdXJyZWRfZXZlbnRzLT5ldmVudHMgIT0gMCkKLQkJCXsKLQkJCQlv Y2N1cnJlZF9ldmVudHMtPmZkID0gY3VyX2V2ZW50LT5mZDsKLQkJCQlvY2N1cnJlZF9ldmVu dHMrKzsKLQkJCQlyZXR1cm5lZF9ldmVudHMrKzsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4g cmV0dXJuZWRfZXZlbnRzOwotfQotCi0jZWxpZiBkZWZpbmVkKFdBSVRfVVNFX1dJTjMyKQot Ci0vKgotICogV2FpdCB1c2luZyBXaW5kb3dzJyBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKCku ICBFYWNoIGNhbGwgb25seSAiY29uc3VtZXMiIG9uZQotICogZXZlbnQsIHNvIHdlIGtlZXAg Y2FsbGluZyB1bnRpbCB3ZSd2ZSBmaWxsZWQgdXAgb3VyIG91dHB1dCBidWZmZXIgdG8gbWF0 Y2gKLSAqIHRoZSBiZWhhdmlvciBvZiB0aGUgb3RoZXIgaW1wbGVtZW50YXRpb25zLgotICoK LSAqIGh0dHBzOi8vYmxvZ3MubXNkbi5taWNyb3NvZnQuY29tL29sZG5ld3RoaW5nLzIwMTUw NDA5LTAwLz9wPTQ0MjczCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1XYWl0RXZlbnRTZXRX YWl0QmxvY2soV2FpdEV2ZW50U2V0ICpzZXQsIGludCBjdXJfdGltZW91dCwKLQkJCQkJICBX YWl0RXZlbnQgKm9jY3VycmVkX2V2ZW50cywgaW50IG5ldmVudHMpCi17Ci0JaW50CQkJcmV0 dXJuZWRfZXZlbnRzID0gMDsKLQlEV09SRAkJcmM7Ci0JV2FpdEV2ZW50ICAqY3VyX2V2ZW50 OwotCi0JLyogUmVzZXQgYW55IHdhaXQgZXZlbnRzIHRoYXQgbmVlZCBpdCAqLwotCWZvciAo Y3VyX2V2ZW50ID0gc2V0LT5ldmVudHM7Ci0JCSBjdXJfZXZlbnQgPCAoc2V0LT5ldmVudHMg KyBzZXQtPm5ldmVudHMpOwotCQkgY3VyX2V2ZW50KyspCi0JewotCQlpZiAoY3VyX2V2ZW50 LT5yZXNldCkKLQkJewotCQkJV2FpdEV2ZW50QWRqdXN0V2luMzIoc2V0LCBjdXJfZXZlbnQp OwotCQkJY3VyX2V2ZW50LT5yZXNldCA9IGZhbHNlOwotCQl9Ci0KLQkJLyoKLQkJICogV2Ug YXNzb2NpYXRlIHRoZSBzb2NrZXQgd2l0aCBhIG5ldyBldmVudCBoYW5kbGUgZm9yIGVhY2gK LQkJICogV2FpdEV2ZW50U2V0LiAgRkRfQ0xPU0UgaXMgb25seSBnZW5lcmF0ZWQgb25jZSBp ZiB0aGUgb3RoZXIgZW5kCi0JCSAqIGNsb3NlcyBncmFjZWZ1bGx5LiAgVGhlcmVmb3JlIHdl IG1pZ2h0IG1pc3MgdGhlIEZEX0NMT1NFCi0JCSAqIG5vdGlmaWNhdGlvbiwgaWYgaXQgd2Fz IGRlbGl2ZXJlZCB0byBhbm90aGVyIGV2ZW50IGFmdGVyIHdlIHN0b3BwZWQKLQkJICogd2Fp dGluZyBmb3IgaXQuICBDbG9zZSB0aGF0IHJhY2UgYnkgcGVla2luZyBmb3IgRU9GIGFmdGVy IHNldHRpbmcKLQkJICogdXAgdGhpcyBoYW5kbGUgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25z LCBhbmQgYmVmb3JlIGVudGVyaW5nIHRoZQotCQkgKiBzbGVlcC4KLQkJICoKLQkJICogWFhY IElmIHdlIGhhZCBvbmUgZXZlbnQgaGFuZGxlIGZvciB0aGUgbGlmZXRpbWUgb2YgYSBzb2Nr ZXQsIHdlCi0JCSAqIHdvdWxkbid0IG5lZWQgdGhpcy4KLQkJICovCi0JCWlmIChjdXJfZXZl bnQtPmV2ZW50cyAmIFdMX1NPQ0tFVF9SRUFEQUJMRSkKLQkJewotCQkJY2hhcgkJYzsKLQkJ CVdTQUJVRgkJYnVmOwotCQkJRFdPUkQJCXJlY2VpdmVkOwotCQkJRFdPUkQJCWZsYWdzOwot Ci0JCQlidWYuYnVmID0gJmM7Ci0JCQlidWYubGVuID0gMTsKLQkJCWZsYWdzID0gTVNHX1BF RUs7Ci0JCQlpZiAoV1NBUmVjdihjdXJfZXZlbnQtPmZkLCAmYnVmLCAxLCAmcmVjZWl2ZWQs ICZmbGFncywgTlVMTCwgTlVMTCkgPT0gMCkKLQkJCXsKLQkJCQlvY2N1cnJlZF9ldmVudHMt PnBvcyA9IGN1cl9ldmVudC0+cG9zOwotCQkJCW9jY3VycmVkX2V2ZW50cy0+dXNlcl9kYXRh ID0gY3VyX2V2ZW50LT51c2VyX2RhdGE7Ci0JCQkJb2NjdXJyZWRfZXZlbnRzLT5ldmVudHMg PSBXTF9TT0NLRVRfUkVBREFCTEU7Ci0JCQkJb2NjdXJyZWRfZXZlbnRzLT5mZCA9IGN1cl9l dmVudC0+ZmQ7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBXaW5k b3dzIGRvZXMgbm90IGd1YXJhbnRlZSB0byBsb2cgYW4gRkRfV1JJVEUgbmV0d29yayBldmVu dAotCQkgKiBpbmRpY2F0aW5nIHRoYXQgbW9yZSBkYXRhIGNhbiBiZSBzZW50IHVubGVzcyB0 aGUgcHJldmlvdXMgc2VuZCgpCi0JCSAqIGZhaWxlZCB3aXRoIFdTQUVXT1VMREJMT0NLLiAg V2hpbGUgb3VyIGNhbGxlciBtaWdodCB3ZWxsIGhhdmUgbWFkZQotCQkgKiBzdWNoIGEgY2Fs bCwgd2UgY2Fubm90IGFzc3VtZSB0aGF0IGhlcmUuICBUaGVyZWZvcmUsIGlmIHdhaXRpbmcg Zm9yCi0JCSAqIHdyaXRlLXJlYWR5LCBmb3JjZSB0aGUgaXNzdWUgYnkgZG9pbmcgYSBkdW1t eSBzZW5kKCkuICBJZiB0aGUgZHVtbXkKLQkJICogc2VuZCgpIHN1Y2NlZWRzLCBhc3N1bWUg dGhhdCB0aGUgc29ja2V0IGlzIGluIGZhY3Qgd3JpdGUtcmVhZHksIGFuZAotCQkgKiByZXR1 cm4gaW1tZWRpYXRlbHkuICBBbHNvLCBpZiBpdCBmYWlscyB3aXRoIHNvbWV0aGluZyBvdGhl ciB0aGFuCi0JCSAqIFdTQUVXT1VMREJMT0NLLCByZXR1cm4gYSB3cml0ZS1yZWFkeSBpbmRp Y2F0aW9uIHRvIGxldCBvdXIgY2FsbGVyCi0JCSAqIGRlYWwgd2l0aCB0aGUgZXJyb3IgY29u ZGl0aW9uLgotCQkgKi8KLQkJaWYgKGN1cl9ldmVudC0+ZXZlbnRzICYgV0xfU09DS0VUX1dS SVRFQUJMRSkKLQkJewotCQkJY2hhcgkJYzsKLQkJCVdTQUJVRgkJYnVmOwotCQkJRFdPUkQJ CXNlbnQ7Ci0JCQlpbnQJCQlyOwotCi0JCQlidWYuYnVmID0gJmM7Ci0JCQlidWYubGVuID0g MDsKLQotCQkJciA9IFdTQVNlbmQoY3VyX2V2ZW50LT5mZCwgJmJ1ZiwgMSwgJnNlbnQsIDAs IE5VTEwsIE5VTEwpOwotCQkJaWYgKHIgPT0gMCB8fCBXU0FHZXRMYXN0RXJyb3IoKSAhPSBX U0FFV09VTERCTE9DSykKLQkJCXsKLQkJCQlvY2N1cnJlZF9ldmVudHMtPnBvcyA9IGN1cl9l dmVudC0+cG9zOwotCQkJCW9jY3VycmVkX2V2ZW50cy0+dXNlcl9kYXRhID0gY3VyX2V2ZW50 LT51c2VyX2RhdGE7Ci0JCQkJb2NjdXJyZWRfZXZlbnRzLT5ldmVudHMgPSBXTF9TT0NLRVRf V1JJVEVBQkxFOwotCQkJCW9jY3VycmVkX2V2ZW50cy0+ZmQgPSBjdXJfZXZlbnQtPmZkOwot CQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBTbGVlcC4KLQkgKgot CSAqIE5lZWQgdG8gd2FpdCBmb3IgLT5uZXZlbnRzICsgMSwgYmVjYXVzZSBzaWduYWwgaGFu ZGxlIGlzIGluIFswXS4KLQkgKi8KLQlyYyA9IFdhaXRGb3JNdWx0aXBsZU9iamVjdHMoc2V0 LT5uZXZlbnRzICsgMSwgc2V0LT5oYW5kbGVzLCBGQUxTRSwKLQkJCQkJCQkJY3VyX3RpbWVv dXQpOwotCi0JLyogQ2hlY2sgcmV0dXJuIGNvZGUgKi8KLQlpZiAocmMgPT0gV0FJVF9GQUlM RUQpCi0JCWVsb2coRVJST1IsICJXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKCkgZmFpbGVkOiBl cnJvciBjb2RlICVsdSIsCi0JCQkgR2V0TGFzdEVycm9yKCkpOwotCWVsc2UgaWYgKHJjID09 IFdBSVRfVElNRU9VVCkKLQl7Ci0JCS8qIHRpbWVvdXQgZXhjZWVkZWQgKi8KLQkJcmV0dXJu IC0xOwotCX0KLQotCWlmIChyYyA9PSBXQUlUX09CSkVDVF8wKQotCXsKLQkJLyogU2Vydmlj ZSBuZXdseS1hcnJpdmVkIHNpZ25hbHMgKi8KLQkJcGd3aW4zMl9kaXNwYXRjaF9xdWV1ZWRf c2lnbmFscygpOwotCQlyZXR1cm4gMDsJCQkJLyogcmV0cnkgKi8KLQl9Ci0KLQkvKgotCSAq IFdpdGggYW4gb2Zmc2V0IG9mIG9uZSwgZHVlIHRvIHRoZSBhbHdheXMgcHJlc2VudCBwZ3dp bjMyX3NpZ25hbF9ldmVudCwKLQkgKiB0aGUgaGFuZGxlIG9mZnNldCBkaXJlY3RseSBjb3Jy ZXNwb25kcyB0byBhIHdhaXQgZXZlbnQuCi0JICovCi0JY3VyX2V2ZW50ID0gKFdhaXRFdmVu dCAqKSAmc2V0LT5ldmVudHNbcmMgLSBXQUlUX09CSkVDVF8wIC0gMV07Ci0KLQlmb3IgKDs7 KQotCXsKLQkJaW50CQkJbmV4dF9wb3M7Ci0JCWludAkJCWNvdW50OwotCi0JCW9jY3VycmVk X2V2ZW50cy0+cG9zID0gY3VyX2V2ZW50LT5wb3M7Ci0JCW9jY3VycmVkX2V2ZW50cy0+dXNl cl9kYXRhID0gY3VyX2V2ZW50LT51c2VyX2RhdGE7Ci0JCW9jY3VycmVkX2V2ZW50cy0+ZXZl bnRzID0gMDsKLQotCQlpZiAoY3VyX2V2ZW50LT5ldmVudHMgPT0gV0xfTEFUQ0hfU0VUKQot CQl7Ci0JCQkvKgotCQkJICogV2UgY2Fubm90IHVzZSBzZXQtPmxhdGNoLT5ldmVudCB0byBy ZXNldCB0aGUgZmlyZWQgZXZlbnQgaWYgd2UKLQkJCSAqIGFyZW4ndCB3YWl0aW5nIG9uIHRo aXMgbGF0Y2ggbm93LgotCQkJICovCi0JCQlpZiAoIVJlc2V0RXZlbnQoc2V0LT5oYW5kbGVz W2N1cl9ldmVudC0+cG9zICsgMV0pKQotCQkJCWVsb2coRVJST1IsICJSZXNldEV2ZW50IGZh aWxlZDogZXJyb3IgY29kZSAlbHUiLCBHZXRMYXN0RXJyb3IoKSk7Ci0KLQkJCWlmIChzZXQt PmxhdGNoICYmIHNldC0+bGF0Y2gtPm1heWJlX3NsZWVwaW5nICYmIHNldC0+bGF0Y2gtPmlz X3NldCkKLQkJCXsKLQkJCQlvY2N1cnJlZF9ldmVudHMtPmZkID0gUEdJTlZBTElEX1NPQ0tF VDsKLQkJCQlvY2N1cnJlZF9ldmVudHMtPmV2ZW50cyA9IFdMX0xBVENIX1NFVDsKLQkJCQlv Y2N1cnJlZF9ldmVudHMrKzsKLQkJCQlyZXR1cm5lZF9ldmVudHMrKzsKLQkJCX0KLQkJfQot CQllbHNlIGlmIChjdXJfZXZlbnQtPmV2ZW50cyA9PSBXTF9QT1NUTUFTVEVSX0RFQVRIKQot CQl7Ci0JCQkvKgotCQkJICogUG9zdG1hc3RlciBhcHBhcmVudGx5IGRpZWQuICBTaW5jZSB0 aGUgY29uc2VxdWVuY2VzIG9mIGZhbHNlbHkKLQkJCSAqIHJldHVybmluZyBXTF9QT1NUTUFT VEVSX0RFQVRIIGNvdWxkIGJlIHByZXR0eSB1bnBsZWFzYW50LCB3ZQotCQkJICogdGFrZSB0 aGUgdHJvdWJsZSB0byBwb3NpdGl2ZWx5IHZlcmlmeSB0aGlzIHdpdGgKLQkJCSAqIFBvc3Rt YXN0ZXJJc0FsaXZlKCksIGV2ZW4gdGhvdWdoIHRoZXJlIGlzIG5vIGtub3duIHJlYXNvbiB0 bwotCQkJICogdGhpbmsgdGhhdCB0aGUgZXZlbnQgY291bGQgYmUgZmFsc2VseSBzZXQgb24g V2luZG93cy4KLQkJCSAqLwotCQkJaWYgKCFQb3N0bWFzdGVySXNBbGl2ZUludGVybmFsKCkp Ci0JCQl7Ci0JCQkJaWYgKHNldC0+ZXhpdF9vbl9wb3N0bWFzdGVyX2RlYXRoKQotCQkJCQlw cm9jX2V4aXQoMSk7Ci0JCQkJb2NjdXJyZWRfZXZlbnRzLT5mZCA9IFBHSU5WQUxJRF9TT0NL RVQ7Ci0JCQkJb2NjdXJyZWRfZXZlbnRzLT5ldmVudHMgPSBXTF9QT1NUTUFTVEVSX0RFQVRI OwotCQkJCW9jY3VycmVkX2V2ZW50cysrOwotCQkJCXJldHVybmVkX2V2ZW50cysrOwotCQkJ fQotCQl9Ci0JCWVsc2UgaWYgKGN1cl9ldmVudC0+ZXZlbnRzICYgV0xfU09DS0VUX01BU0sp Ci0JCXsKLQkJCVdTQU5FVFdPUktFVkVOVFMgcmVzRXZlbnRzOwotCQkJSEFORExFCQloYW5k bGUgPSBzZXQtPmhhbmRsZXNbY3VyX2V2ZW50LT5wb3MgKyAxXTsKLQotCQkJQXNzZXJ0KGN1 cl9ldmVudC0+ZmQpOwotCi0JCQlvY2N1cnJlZF9ldmVudHMtPmZkID0gY3VyX2V2ZW50LT5m ZDsKLQotCQkJWmVyb01lbW9yeSgmcmVzRXZlbnRzLCBzaXplb2YocmVzRXZlbnRzKSk7Ci0J CQlpZiAoV1NBRW51bU5ldHdvcmtFdmVudHMoY3VyX2V2ZW50LT5mZCwgaGFuZGxlLCAmcmVz RXZlbnRzKSAhPSAwKQotCQkJCWVsb2coRVJST1IsICJmYWlsZWQgdG8gZW51bWVyYXRlIG5l dHdvcmsgZXZlbnRzOiBlcnJvciBjb2RlICVkIiwKLQkJCQkJIFdTQUdldExhc3RFcnJvcigp KTsKLQkJCWlmICgoY3VyX2V2ZW50LT5ldmVudHMgJiBXTF9TT0NLRVRfUkVBREFCTEUpICYm Ci0JCQkJKHJlc0V2ZW50cy5sTmV0d29ya0V2ZW50cyAmIEZEX1JFQUQpKQotCQkJewotCQkJ CS8qIGRhdGEgYXZhaWxhYmxlIGluIHNvY2tldCAqLwotCQkJCW9jY3VycmVkX2V2ZW50cy0+ ZXZlbnRzIHw9IFdMX1NPQ0tFVF9SRUFEQUJMRTsKLQotCQkJCS8qLS0tLS0tCi0JCQkJICog V2FpdEZvck11bHRpcGxlT2JqZWN0cyBkb2Vzbid0IGd1YXJhbnRlZSB0aGF0IGEgcmVhZCBl dmVudAotCQkJCSAqIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGxhdGNoIGlzIHNldCBhdCB0 aGUgc2FtZSB0aW1lLiAgRXZlbgotCQkJCSAqIGlmIGl0IGRpZCwgdGhlIGNhbGxlciBtaWdo dCBkcm9wIHRoYXQgZXZlbnQgZXhwZWN0aW5nIGl0IHRvCi0JCQkJICogcmVvY2N1ciBvbiBu ZXh0IGNhbGwuICBTbywgd2UgbXVzdCBmb3JjZSB0aGUgZXZlbnQgdG8gYmUKLQkJCQkgKiBy ZXNldCBpZiB0aGlzIFdhaXRFdmVudFNldCBpcyB1c2VkIGFnYWluIGluIG9yZGVyIHRvIGF2 b2lkCi0JCQkJICogYW4gaW5kZWZpbml0ZSBoYW5nLgotCQkJCSAqCi0JCQkJICogUmVmZXIK LQkJCQkgKiBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRv d3MvZGVza3RvcC9tczc0MTU3Nih2PXZzLjg1KS5hc3B4Ci0JCQkJICogZm9yIHRoZSBiZWhh dmlvciBvZiBzb2NrZXQgZXZlbnRzLgotCQkJCSAqLS0tLS0tCi0JCQkJICovCi0JCQkJY3Vy X2V2ZW50LT5yZXNldCA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAoKGN1cl9ldmVudC0+ZXZlbnRz ICYgV0xfU09DS0VUX1dSSVRFQUJMRSkgJiYKLQkJCQkocmVzRXZlbnRzLmxOZXR3b3JrRXZl bnRzICYgRkRfV1JJVEUpKQotCQkJewotCQkJCS8qIHdyaXRlYWJsZSAqLwotCQkJCW9jY3Vy cmVkX2V2ZW50cy0+ZXZlbnRzIHw9IFdMX1NPQ0tFVF9XUklURUFCTEU7Ci0JCQl9Ci0JCQlp ZiAoKGN1cl9ldmVudC0+ZXZlbnRzICYgV0xfU09DS0VUX0NPTk5FQ1RFRCkgJiYKLQkJCQko cmVzRXZlbnRzLmxOZXR3b3JrRXZlbnRzICYgRkRfQ09OTkVDVCkpCi0JCQl7Ci0JCQkJLyog Y29ubmVjdGVkICovCi0JCQkJb2NjdXJyZWRfZXZlbnRzLT5ldmVudHMgfD0gV0xfU09DS0VU X0NPTk5FQ1RFRDsKLQkJCX0KLQkJCWlmICgoY3VyX2V2ZW50LT5ldmVudHMgJiBXTF9TT0NL RVRfQUNDRVBUKSAmJgotCQkJCShyZXNFdmVudHMubE5ldHdvcmtFdmVudHMgJiBGRF9BQ0NF UFQpKQotCQkJewotCQkJCS8qIGluY29taW5nIGNvbm5lY3Rpb24gY291bGQgYmUgYWNjZXB0 ZWQgKi8KLQkJCQlvY2N1cnJlZF9ldmVudHMtPmV2ZW50cyB8PSBXTF9TT0NLRVRfQUNDRVBU OwotCQkJfQotCQkJaWYgKHJlc0V2ZW50cy5sTmV0d29ya0V2ZW50cyAmIEZEX0NMT1NFKQot CQkJewotCQkJCS8qIEVPRi9lcnJvciwgc28gc2lnbmFsIGFsbCBjYWxsZXItcmVxdWVzdGVk IHNvY2tldCBmbGFncyAqLwotCQkJCW9jY3VycmVkX2V2ZW50cy0+ZXZlbnRzIHw9IChjdXJf ZXZlbnQtPmV2ZW50cyAmIFdMX1NPQ0tFVF9NQVNLKTsKLQkJCX0KLQotCQkJaWYgKG9jY3Vy cmVkX2V2ZW50cy0+ZXZlbnRzICE9IDApCi0JCQl7Ci0JCQkJb2NjdXJyZWRfZXZlbnRzKys7 Ci0JCQkJcmV0dXJuZWRfZXZlbnRzKys7Ci0JCQl9Ci0JCX0KLQotCQkvKiBJcyB0aGUgb3V0 cHV0IGJ1ZmZlciBmdWxsPyAqLwotCQlpZiAocmV0dXJuZWRfZXZlbnRzID09IG5ldmVudHMp Ci0JCQlicmVhazsKLQotCQkvKiBIYXZlIHdlIHJ1biBvdXQgb2YgcG9zc2libGUgZXZlbnRz PyAqLwotCQluZXh0X3BvcyA9IGN1cl9ldmVudC0+cG9zICsgMTsKLQkJaWYgKG5leHRfcG9z ID09IHNldC0+bmV2ZW50cykKLQkJCWJyZWFrOwotCi0JCS8qCi0JCSAqIFBvbGwgdGhlIHJl c3Qgb2YgdGhlIGV2ZW50IGhhbmRsZXMgaW4gdGhlIGFycmF5IHN0YXJ0aW5nIGF0Ci0JCSAq IG5leHRfcG9zIGJlaW5nIGNhcmVmdWwgdG8gc2tpcCBvdmVyIHRoZSBpbml0aWFsIHNpZ25h bCBoYW5kbGUgdG9vLgotCQkgKiBUaGlzIHRpbWUgd2UgdXNlIGEgemVybyB0aW1lb3V0Lgot CQkgKi8KLQkJY291bnQgPSBzZXQtPm5ldmVudHMgLSBuZXh0X3BvczsKLQkJcmMgPSBXYWl0 Rm9yTXVsdGlwbGVPYmplY3RzKGNvdW50LAotCQkJCQkJCQkJc2V0LT5oYW5kbGVzICsgMSAr IG5leHRfcG9zLAotCQkJCQkJCQkJZmFsc2UsCi0JCQkJCQkJCQkwKTsKLQotCQkvKgotCQkg KiBXZSBkb24ndCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGVycm9ycyBhbmQgV0FJVF9USU1FT1VU IGhlcmUgYmVjYXVzZQotCQkgKiB3ZSBhbHJlYWR5IGhhdmUgZXZlbnRzIHRvIHJlcG9ydC4K LQkJICovCi0JCWlmIChyYyA8IFdBSVRfT0JKRUNUXzAgfHwgcmMgPj0gV0FJVF9PQkpFQ1Rf MCArIGNvdW50KQotCQkJYnJlYWs7Ci0KLQkJLyogV2UgaGF2ZSBhbm90aGVyIGV2ZW50IHRv IGRlY29kZS4gKi8KLQkJY3VyX2V2ZW50ID0gJnNldC0+ZXZlbnRzW25leHRfcG9zICsgKHJj IC0gV0FJVF9PQkpFQ1RfMCldOwotCX0KLQotCXJldHVybiByZXR1cm5lZF9ldmVudHM7Ci19 Ci0jZW5kaWYKLQotLyoKLSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IGJ1aWxkIG9w dGlvbnMgY2FuIHJlcG9ydCBXTF9TT0NLRVRfQ0xPU0VELgotICovCi1ib29sCi1XYWl0RXZl bnRTZXRDYW5SZXBvcnRDbG9zZWQodm9pZCkKLXsKLSNpZiAoZGVmaW5lZChXQUlUX1VTRV9Q T0xMKSAmJiBkZWZpbmVkKFBPTExSREhVUCkpIHx8IFwKLQlkZWZpbmVkKFdBSVRfVVNFX0VQ T0xMKSB8fCBcCi0JZGVmaW5lZChXQUlUX1VTRV9LUVVFVUUpCi0JcmV0dXJuIHRydWU7Ci0j ZWxzZQotCXJldHVybiBmYWxzZTsKLSNlbmRpZgotfQotCi0vKgotICogR2V0IHRoZSBudW1i ZXIgb2Ygd2FpdCBldmVudHMgcmVnaXN0ZXJlZCBpbiBhIGdpdmVuIFdhaXRFdmVudFNldC4K LSAqLwotaW50Ci1HZXROdW1SZWdpc3RlcmVkV2FpdEV2ZW50cyhXYWl0RXZlbnRTZXQgKnNl dCkKLXsKLQlyZXR1cm4gc2V0LT5uZXZlbnRzOwotfQotCi0jaWYgZGVmaW5lZChXQUlUX1VT RV9TRUxGX1BJUEUpCi0KLS8qCi0gKiBTZXRMYXRjaCB1c2VzIFNJR1VSRyB0byB3YWtlIHVw IHRoZSBwcm9jZXNzIHdhaXRpbmcgb24gdGhlIGxhdGNoLgotICoKLSAqIFdha2UgdXAgV2Fp dExhdGNoLCBpZiB3ZSdyZSB3YWl0aW5nLgotICovCi1zdGF0aWMgdm9pZAotbGF0Y2hfc2ln dXJnX2hhbmRsZXIoU0lHTkFMX0FSR1MpCi17Ci0JaWYgKHdhaXRpbmcpCi0JCXNlbmRTZWxm UGlwZUJ5dGUoKTsKLX0KLQotLyogU2VuZCBvbmUgYnl0ZSB0byB0aGUgc2VsZi1waXBlLCB0 byB3YWtlIHVwIFdhaXRMYXRjaCAqLwotc3RhdGljIHZvaWQKLXNlbmRTZWxmUGlwZUJ5dGUo dm9pZCkKLXsKLQlpbnQJCQlyYzsKLQljaGFyCQlkdW1teSA9IDA7Ci0KLXJldHJ5OgotCXJj ID0gd3JpdGUoc2VsZnBpcGVfd3JpdGVmZCwgJmR1bW15LCAxKTsKLQlpZiAocmMgPCAwKQot CXsKLQkJLyogSWYgaW50ZXJydXB0ZWQgYnkgc2lnbmFsLCBqdXN0IHJldHJ5ICovCi0JCWlm IChlcnJubyA9PSBFSU5UUikKLQkJCWdvdG8gcmV0cnk7Ci0KLQkJLyoKLQkJICogSWYgdGhl IHBpcGUgaXMgZnVsbCwgd2UgZG9uJ3QgbmVlZCB0byByZXRyeSwgdGhlIGRhdGEgdGhhdCdz IHRoZXJlCi0JCSAqIGFscmVhZHkgaXMgZW5vdWdoIHRvIHdha2UgdXAgV2FpdExhdGNoLgot CQkgKi8KLQkJaWYgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykK LQkJCXJldHVybjsKLQotCQkvKgotCQkgKiBPb3BzLCB0aGUgd3JpdGUoKSBmYWlsZWQgZm9y IHNvbWUgb3RoZXIgcmVhc29uLiBXZSBtaWdodCBiZSBpbiBhCi0JCSAqIHNpZ25hbCBoYW5k bGVyLCBzbyBpdCdzIG5vdCBzYWZlIHRvIGVsb2coKS4gV2UgaGF2ZSBubyBjaG9pY2UgYnV0 Ci0JCSAqIHNpbGVudGx5IGlnbm9yZSB0aGUgZXJyb3IuCi0JCSAqLwotCQlyZXR1cm47Ci0J fQotfQotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoV0FJVF9VU0VfU0VMRl9QSVBFKSB8fCBk ZWZpbmVkKFdBSVRfVVNFX1NJR05BTEZEKQotCi0vKgotICogUmVhZCBhbGwgYXZhaWxhYmxl IGRhdGEgZnJvbSBzZWxmLXBpcGUgb3Igc2lnbmFsZmQuCi0gKgotICogTm90ZTogdGhpcyBp cyBvbmx5IGNhbGxlZCB3aGVuIHdhaXRpbmcgPSB0cnVlLiAgSWYgaXQgZmFpbHMgYW5kIGRv ZXNuJ3QKLSAqIHJldHVybiwgaXQgbXVzdCByZXNldCB0aGF0IGZsYWcgZmlyc3QgKHRob3Vn aCBpZGVhbGx5LCB0aGlzIHdpbGwgbmV2ZXIKLSAqIGhhcHBlbikuCi0gKi8KLXN0YXRpYyB2 b2lkCi1kcmFpbih2b2lkKQotewotCWNoYXIJCWJ1ZlsxMDI0XTsKLQlpbnQJCQlyYzsKLQlp bnQJCQlmZDsKLQotI2lmZGVmIFdBSVRfVVNFX1NFTEZfUElQRQotCWZkID0gc2VsZnBpcGVf cmVhZGZkOwotI2Vsc2UKLQlmZCA9IHNpZ25hbF9mZDsKLSNlbmRpZgotCi0JZm9yICg7OykK LQl7Ci0JCXJjID0gcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSk7Ci0JCWlmIChyYyA8IDAp Ci0JCXsKLQkJCWlmIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0sp Ci0JCQkJYnJlYWs7CQkJLyogdGhlIGRlc2NyaXB0b3IgaXMgZW1wdHkgKi8KLQkJCWVsc2Ug aWYgKGVycm5vID09IEVJTlRSKQotCQkJCWNvbnRpbnVlOwkJLyogcmV0cnkgKi8KLQkJCWVs c2UKLQkJCXsKLQkJCQl3YWl0aW5nID0gZmFsc2U7Ci0jaWZkZWYgV0FJVF9VU0VfU0VMRl9Q SVBFCi0JCQkJZWxvZyhFUlJPUiwgInJlYWQoKSBvbiBzZWxmLXBpcGUgZmFpbGVkOiAlbSIp OwotI2Vsc2UKLQkJCQllbG9nKEVSUk9SLCAicmVhZCgpIG9uIHNpZ25hbGZkIGZhaWxlZDog JW0iKTsKLSNlbmRpZgotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHJjID09IDApCi0JCXsKLQkJ CXdhaXRpbmcgPSBmYWxzZTsKLSNpZmRlZiBXQUlUX1VTRV9TRUxGX1BJUEUKLQkJCWVsb2co RVJST1IsICJ1bmV4cGVjdGVkIEVPRiBvbiBzZWxmLXBpcGUiKTsKLSNlbHNlCi0JCQllbG9n KEVSUk9SLCAidW5leHBlY3RlZCBFT0Ygb24gc2lnbmFsZmQiKTsKLSNlbmRpZgotCQl9Ci0J CWVsc2UgaWYgKHJjIDwgc2l6ZW9mKGJ1ZikpCi0JCXsKLQkJCS8qIHdlIHN1Y2Nlc3NmdWxs eSBkcmFpbmVkIHRoZSBwaXBlOyBubyBuZWVkIHRvIHJlYWQoKSBhZ2FpbiAqLwotCQkJYnJl YWs7Ci0JCX0KLQkJLyogZWxzZSBidWZmZXIgd2Fzbid0IGJpZyBlbm91Z2gsIHNvIHJlYWQg YWdhaW4gKi8KLQl9Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotUmVzT3duZXJSZWxl YXNlV2FpdEV2ZW50U2V0KERhdHVtIHJlcykKLXsKLQlXYWl0RXZlbnRTZXQgKnNldCA9IChX YWl0RXZlbnRTZXQgKikgRGF0dW1HZXRQb2ludGVyKHJlcyk7Ci0KLQlBc3NlcnQoc2V0LT5v d25lciAhPSBOVUxMKTsKLQlzZXQtPm93bmVyID0gTlVMTDsKLQlGcmVlV2FpdEV2ZW50U2V0 KHNldCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9tZXNvbi5i dWlsZCBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL21lc29uLmJ1aWxkCmluZGV4IDc0NzNi ZDFkZDczLi5iMWI3M2RhYzNiZSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9p cGMvbWVzb24uYnVpbGQKKysrIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvbWVzb24uYnVp bGQKQEAgLTE4LDUgKzE4LDYgQEAgYmFja2VuZF9zb3VyY2VzICs9IGZpbGVzKAogICAnc2lu dmFsLmMnLAogICAnc2ludmFsYWR0LmMnLAogICAnc3RhbmRieS5jJywKKyAgJ3dhaXRldmVu dHNldC5jJywKIAogKQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvd2Fp dGV2ZW50c2V0LmMgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy93YWl0ZXZlbnRzZXQuYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uMzVlODM2ZDMzOTgKLS0t IC9kZXYvbnVsbAorKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy93YWl0ZXZlbnRzZXQu YwpAQCAtMCwwICsxLDIwMzMgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIHdh aXRldmVudHNldC5jCisgKgkgIHBwb2xsKCkvcHNlbGVjdCgpIGxpa2UgYWJzdHJhY3Rpb24K KyAqCisgKiBXYWl0RXZlbnRzIGFyZSBhbiBhYnN0cmFjdGlvbiBmb3Igd2FpdGluZyBmb3Ig b25lIG9yIG1vcmUgZXZlbnRzIGF0IGEgdGltZS4KKyAqIFRoZSB3YWl0aW5nIGNhbiBiZSBk b25lIGluIGEgcmFjZSBmcmVlIGZhc2hpb24sIHNpbWlsYXIgcHBvbGwoKSBvcgorICogcHNl bGVjdCgpIChhcyBvcHBvc2VkIHRvIHBsYWluIHBvbGwoKS9zZWxlY3QoKSkuCisgKgorICog WW91IGNhbiB3YWl0IGZvcjoKKyAqIC0gYSBsYXRjaCBiZWluZyBzZXQgZnJvbSBhbm90aGVy IHByb2Nlc3Mgb3IgZnJvbSBzaWduYWwgaGFuZGxlciBpbiB0aGUgc2FtZQorICogICBwcm9j ZXNzIChXTF9MQVRDSF9TRVQpCisgKiAtIGRhdGEgdG8gYmVjb21lIHJlYWRhYmxlIG9yIHdy aXRlYWJsZSBvbiBhIHNvY2tldCAoV0xfU09DS0VUXyopCisgKiAtIHBvc3RtYXN0ZXIgZGVh dGggKFdMX1BPU1RNQVNURVJfREVBVEggb3IgV0xfRVhJVF9PTl9QTV9ERUFUSCkKKyAqIC0g dGltZW91dCAoV0xfVElNRU9VVCkKKyAqCisgKiBJbXBsZW1lbnRhdGlvbgorICogLS0tLS0t LS0tLS0tLS0KKyAqCisgKiBUaGUgcG9sbCgpIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIHNv LWNhbGxlZCBzZWxmLXBpcGUgdHJpY2sgdG8gb3ZlcmNvbWUgdGhlCisgKiByYWNlIGNvbmRp dGlvbiBpbnZvbHZlZCB3aXRoIHBvbGwoKSBhbmQgc2V0dGluZyBhIGdsb2JhbCBmbGFnIGlu IHRoZSBzaWduYWwKKyAqIGhhbmRsZXIuIFdoZW4gYSBsYXRjaCBpcyBzZXQgYW5kIHRoZSBj dXJyZW50IHByb2Nlc3MgaXMgd2FpdGluZyBmb3IgaXQsIHRoZQorICogc2lnbmFsIGhhbmRs ZXIgd2FrZXMgdXAgdGhlIHBvbGwoKSBpbiBXYWl0TGF0Y2ggYnkgd3JpdGluZyBhIGJ5dGUg dG8gYSBwaXBlLgorICogQSBzaWduYWwgYnkgaXRzZWxmIGRvZXNuJ3QgaW50ZXJydXB0IHBv bGwoKSBvbiBhbGwgcGxhdGZvcm1zLCBhbmQgZXZlbiBvbgorICogcGxhdGZvcm1zIHdoZXJl IGl0IGRvZXMsIGEgc2lnbmFsIHRoYXQgYXJyaXZlcyBqdXN0IGJlZm9yZSB0aGUgcG9sbCgp IGNhbGwKKyAqIGRvZXMgbm90IHByZXZlbnQgcG9sbCgpIGZyb20gZW50ZXJpbmcgc2xlZXAu IEFuIGluY29taW5nIGJ5dGUgb24gYSBwaXBlCisgKiBob3dldmVyIHJlbGlhYmx5IGludGVy cnVwdHMgdGhlIHNsZWVwLCBhbmQgY2F1c2VzIHBvbGwoKSB0byByZXR1cm4KKyAqIGltbWVk aWF0ZWx5IGV2ZW4gaWYgdGhlIHNpZ25hbCBhcnJpdmVzIGJlZm9yZSBwb2xsKCkgYmVnaW5z LgorICoKKyAqIFRoZSBlcG9sbCgpIGltcGxlbWVudGF0aW9uIG92ZXJjb21lcyB0aGUgcmFj ZSB3aXRoIGEgZGlmZmVyZW50IHRlY2huaXF1ZTogaXQKKyAqIGtlZXBzIFNJR1VSRyBibG9j a2VkIGFuZCBjb25zdW1lcyBmcm9tIGEgc2lnbmFsZmQoKSBkZXNjcmlwdG9yIGluc3RlYWQu ICBXZQorICogZG9uJ3QgbmVlZCB0byByZWdpc3RlciBhIHNpZ25hbCBoYW5kbGVyIG9yIGNy ZWF0ZSBvdXIgb3duIHNlbGYtcGlwZS4gIFdlCisgKiBhc3N1bWUgdGhhdCBhbnkgc3lzdGVt IHRoYXQgaGFzIExpbnV4IGVwb2xsKCkgYWxzbyBoYXMgTGludXggc2lnbmFsZmQoKS4KKyAq CisgKiBUaGUga3F1ZXVlKCkgaW1wbGVtZW50YXRpb24gd2FpdHMgZm9yIFNJR1VSRyB3aXRo IEVWRklMVF9TSUdOQUwuCisgKgorICogVGhlIFdpbmRvd3MgaW1wbGVtZW50YXRpb24gdXNl cyBXaW5kb3dzIGV2ZW50cyB0aGF0IGFyZSBpbmhlcml0ZWQgYnkgYWxsCisgKiBwb3N0bWFz dGVyIGNoaWxkIHByb2Nlc3Nlcy4gVGhlcmUncyBubyBuZWVkIGZvciB0aGUgc2VsZi1waXBl IHRyaWNrIHRoZXJlLgorICoKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5Ni0yMDI1 LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorICogUG9ydGlvbnMgQ29w eXJpZ2h0IChjKSAxOTk0LCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3Ju aWEKKyAqCisgKiBJREVOVElGSUNBVElPTgorICoJICBzcmMvYmFja2VuZC9zdG9yYWdlL2lw Yy93YWl0ZXZlbnRzZXQuYworICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5j bHVkZSAicG9zdGdyZXMuaCIKKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGlt aXRzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaWZk ZWYgSEFWRV9TWVNfRVBPTExfSAorI2luY2x1ZGUgPHN5cy9lcG9sbC5oPgorI2VuZGlmCisj aWZkZWYgSEFWRV9TWVNfRVZFTlRfSAorI2luY2x1ZGUgPHN5cy9ldmVudC5oPgorI2VuZGlm CisjaWZkZWYgSEFWRV9TWVNfU0lHTkFMRkRfSAorI2luY2x1ZGUgPHN5cy9zaWduYWxmZC5o PgorI2VuZGlmCisjaWZkZWYgSEFWRV9QT0xMX0gKKyNpbmNsdWRlIDxwb2xsLmg+CisjZW5k aWYKKworI2luY2x1ZGUgImxpYnBxL3Bxc2lnbmFsLmgiCisjaW5jbHVkZSAibWlzY2FkbWlu LmgiCisjaW5jbHVkZSAicGdzdGF0LmgiCisjaW5jbHVkZSAicG9ydC9hdG9taWNzLmgiCisj aW5jbHVkZSAicG9ydGFiaWxpdHkvaW5zdHJfdGltZS5oIgorI2luY2x1ZGUgInBvc3RtYXN0 ZXIvcG9zdG1hc3Rlci5oIgorI2luY2x1ZGUgInN0b3JhZ2UvZmQuaCIKKyNpbmNsdWRlICJz dG9yYWdlL2lwYy5oIgorI2luY2x1ZGUgInN0b3JhZ2UvcG1zaWduYWwuaCIKKyNpbmNsdWRl ICJzdG9yYWdlL2xhdGNoLmgiCisjaW5jbHVkZSAic3RvcmFnZS9wcm9jLmgiCisjaW5jbHVk ZSAic3RvcmFnZS93YWl0ZXZlbnRzZXQuaCIKKyNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5o IgorI2luY2x1ZGUgInV0aWxzL3Jlc293bmVyLmgiCisKKy8qCisgKiBTZWxlY3QgdGhlIGZk IHJlYWRpbmVzcyBwcmltaXRpdmUgdG8gdXNlLiBOb3JtYWxseSB0aGUgIm1vc3QgbW9kZXJu IgorICogcHJpbWl0aXZlIHN1cHBvcnRlZCBieSB0aGUgT1Mgd2lsbCBiZSB1c2VkLCBidXQg Zm9yIHRlc3RpbmcgaXQgY2FuIGJlCisgKiB1c2VmdWwgdG8gbWFudWFsbHkgc3BlY2lmeSB0 aGUgdXNlZCBwcmltaXRpdmUuICBJZiBkZXNpcmVkLCBqdXN0IGFkZCBhCisgKiBkZWZpbmUg c29tZXdoZXJlIGJlZm9yZSB0aGlzIGJsb2NrLgorICovCisjaWYgZGVmaW5lZChXQUlUX1VT RV9FUE9MTCkgfHwgZGVmaW5lZChXQUlUX1VTRV9QT0xMKSB8fCBcCisJZGVmaW5lZChXQUlU X1VTRV9LUVVFVUUpIHx8IGRlZmluZWQoV0FJVF9VU0VfV0lOMzIpCisvKiBkb24ndCBvdmVy d3JpdGUgbWFudWFsIGNob2ljZSAqLworI2VsaWYgZGVmaW5lZChIQVZFX1NZU19FUE9MTF9I KQorI2RlZmluZSBXQUlUX1VTRV9FUE9MTAorI2VsaWYgZGVmaW5lZChIQVZFX0tRVUVVRSkK KyNkZWZpbmUgV0FJVF9VU0VfS1FVRVVFCisjZWxpZiBkZWZpbmVkKEhBVkVfUE9MTCkKKyNk ZWZpbmUgV0FJVF9VU0VfUE9MTAorI2VsaWYgV0lOMzIKKyNkZWZpbmUgV0FJVF9VU0VfV0lO MzIKKyNlbHNlCisjZXJyb3IgIm5vIHdhaXQgc2V0IGltcGxlbWVudGF0aW9uIGF2YWlsYWJs ZSIKKyNlbmRpZgorCisvKgorICogQnkgZGVmYXVsdCwgd2UgdXNlIGEgc2VsZi1waXBlIHdp dGggcG9sbCgpIGFuZCBhIHNpZ25hbGZkIHdpdGggZXBvbGwoKSwgaWYKKyAqIGF2YWlsYWJs ZS4gIEZvciB0ZXN0aW5nIHRoZSBjaG9pY2UgY2FuIGFsc28gYmUgbWFudWFsbHkgc3BlY2lm aWVkLgorICovCisjaWYgZGVmaW5lZChXQUlUX1VTRV9QT0xMKSB8fCBkZWZpbmVkKFdBSVRf VVNFX0VQT0xMKQorI2lmIGRlZmluZWQoV0FJVF9VU0VfU0VMRl9QSVBFKSB8fCBkZWZpbmVk KFdBSVRfVVNFX1NJR05BTEZEKQorLyogZG9uJ3Qgb3ZlcndyaXRlIG1hbnVhbCBjaG9pY2Ug Ki8KKyNlbGlmIGRlZmluZWQoV0FJVF9VU0VfRVBPTEwpICYmIGRlZmluZWQoSEFWRV9TWVNf U0lHTkFMRkRfSCkKKyNkZWZpbmUgV0FJVF9VU0VfU0lHTkFMRkQKKyNlbHNlCisjZGVmaW5l IFdBSVRfVVNFX1NFTEZfUElQRQorI2VuZGlmCisjZW5kaWYKKworLyogdHlwZWRlZiBpbiB3 YWl0ZXZlbnRzZXQuaCAqLworc3RydWN0IFdhaXRFdmVudFNldAoreworCVJlc291cmNlT3du ZXIgb3duZXI7CisKKwlpbnQJCQluZXZlbnRzOwkJLyogbnVtYmVyIG9mIHJlZ2lzdGVyZWQg ZXZlbnRzICovCisJaW50CQkJbmV2ZW50c19zcGFjZTsJLyogbWF4aW11bSBudW1iZXIgb2Yg ZXZlbnRzIGluIHRoaXMgc2V0ICovCisKKwkvKgorCSAqIEFycmF5LCBvZiBuZXZlbnRzX3Nw YWNlIGxlbmd0aCwgc3RvcmluZyB0aGUgZGVmaW5pdGlvbiBvZiBldmVudHMgdGhpcworCSAq IHNldCBpcyB3YWl0aW5nIGZvci4KKwkgKi8KKwlXYWl0RXZlbnQgICpldmVudHM7CisKKwkv KgorCSAqIElmIFdMX0xBVENIX1NFVCBpcyBzcGVjaWZpZWQgaW4gYW55IHdhaXQgZXZlbnQs IGxhdGNoIGlzIGEgcG9pbnRlciB0bworCSAqIHNhaWQgbGF0Y2gsIGFuZCBsYXRjaF9wb3Mg dGhlIG9mZnNldCBpbiB0aGUgLT5ldmVudHMgYXJyYXkuIFRoaXMgaXMKKwkgKiB1c2VmdWwg YmVjYXVzZSB3ZSBjaGVjayB0aGUgc3RhdGUgb2YgdGhlIGxhdGNoIGJlZm9yZSBwZXJmb3Jt aW5nIGRvaW5nCisJICogc3lzY2FsbHMgcmVsYXRlZCB0byB3YWl0aW5nLgorCSAqLworCUxh dGNoCSAgICpsYXRjaDsKKwlpbnQJCQlsYXRjaF9wb3M7CisKKwkvKgorCSAqIFdMX0VYSVRf T05fUE1fREVBVEggaXMgY29udmVydGVkIHRvIFdMX1BPU1RNQVNURVJfREVBVEgsIGJ1dCB0 aGlzIGZsYWcKKwkgKiBpcyBzZXQgc28gdGhhdCB3ZSdsbCBleGl0IGltbWVkaWF0ZWx5IGlm IHBvc3RtYXN0ZXIgZGVhdGggaXMgZGV0ZWN0ZWQsCisJICogaW5zdGVhZCBvZiByZXR1cm5p bmcuCisJICovCisJYm9vbAkJZXhpdF9vbl9wb3N0bWFzdGVyX2RlYXRoOworCisjaWYgZGVm aW5lZChXQUlUX1VTRV9FUE9MTCkKKwlpbnQJCQllcG9sbF9mZDsKKwkvKiBlcG9sbF93YWl0 IHJldHVybnMgZXZlbnRzIGluIGEgdXNlciBwcm92aWRlZCBhcnJheXMsIGFsbG9jYXRlIG9u Y2UgKi8KKwlzdHJ1Y3QgZXBvbGxfZXZlbnQgKmVwb2xsX3JldF9ldmVudHM7CisjZWxpZiBk ZWZpbmVkKFdBSVRfVVNFX0tRVUVVRSkKKwlpbnQJCQlrcXVldWVfZmQ7CisJLyoga2V2ZW50 IHJldHVybnMgZXZlbnRzIGluIGEgdXNlciBwcm92aWRlZCBhcnJheXMsIGFsbG9jYXRlIG9u Y2UgKi8KKwlzdHJ1Y3Qga2V2ZW50ICprcXVldWVfcmV0X2V2ZW50czsKKwlib29sCQlyZXBv cnRfcG9zdG1hc3Rlcl9ub3RfcnVubmluZzsKKyNlbGlmIGRlZmluZWQoV0FJVF9VU0VfUE9M TCkKKwkvKiBwb2xsIGV4cGVjdHMgZXZlbnRzIHRvIGJlIHdhaXRlZCBvbiBldmVyeSBwb2xs KCkgY2FsbCwgcHJlcGFyZSBvbmNlICovCisJc3RydWN0IHBvbGxmZCAqcG9sbGZkczsKKyNl bGlmIGRlZmluZWQoV0FJVF9VU0VfV0lOMzIpCisKKwkvKgorCSAqIEFycmF5IG9mIHdpbmRv d3MgZXZlbnRzLiBUaGUgZmlyc3QgZWxlbWVudCBhbHdheXMgY29udGFpbnMKKwkgKiBwZ3dp bjMyX3NpZ25hbF9ldmVudCwgc28gdGhlIHJlbWFpbmluZyBlbGVtZW50cyBhcmUgb2Zmc2V0 IGJ5IG9uZSAoaS5lLgorCSAqIGV2ZW50LT5wb3MgKyAxKS4KKwkgKi8KKwlIQU5ETEUJICAg KmhhbmRsZXM7CisjZW5kaWYKK307CisKKyNpZm5kZWYgV0lOMzIKKy8qIEFyZSB3ZSBjdXJy ZW50bHkgaW4gV2FpdExhdGNoPyBUaGUgc2lnbmFsIGhhbmRsZXIgd291bGQgbGlrZSB0byBr bm93LiAqLworc3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCB3YWl0aW5nID0gZmFsc2U7 CisjZW5kaWYKKworI2lmZGVmIFdBSVRfVVNFX1NJR05BTEZECisvKiBPbiBMaW51eCwgd2Un bGwgcmVjZWl2ZSBTSUdVUkcgdmlhIGEgc2lnbmFsZmQgZmlsZSBkZXNjcmlwdG9yLiAqLwor c3RhdGljIGludAlzaWduYWxfZmQgPSAtMTsKKyNlbmRpZgorCisjaWZkZWYgV0FJVF9VU0Vf U0VMRl9QSVBFCisvKiBSZWFkIGFuZCB3cml0ZSBlbmRzIG9mIHRoZSBzZWxmLXBpcGUgKi8K K3N0YXRpYyBpbnQJc2VsZnBpcGVfcmVhZGZkID0gLTE7CitzdGF0aWMgaW50CXNlbGZwaXBl X3dyaXRlZmQgPSAtMTsKKworLyogUHJvY2VzcyBvd25pbmcgdGhlIHNlbGYtcGlwZSAtLS0g bmVlZGVkIGZvciBjaGVja2luZyBwdXJwb3NlcyAqLworc3RhdGljIGludAlzZWxmcGlwZV9v d25lcl9waWQgPSAwOworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK3N0 YXRpYyB2b2lkIGxhdGNoX3NpZ3VyZ19oYW5kbGVyKFNJR05BTF9BUkdTKTsKK3N0YXRpYyB2 b2lkIHNlbmRTZWxmUGlwZUJ5dGUodm9pZCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoV0FJ VF9VU0VfU0VMRl9QSVBFKSB8fCBkZWZpbmVkKFdBSVRfVVNFX1NJR05BTEZEKQorc3RhdGlj IHZvaWQgZHJhaW4odm9pZCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoV0FJVF9VU0VfRVBP TEwpCitzdGF0aWMgdm9pZCBXYWl0RXZlbnRBZGp1c3RFcG9sbChXYWl0RXZlbnRTZXQgKnNl dCwgV2FpdEV2ZW50ICpldmVudCwgaW50IGFjdGlvbik7CisjZWxpZiBkZWZpbmVkKFdBSVRf VVNFX0tRVUVVRSkKK3N0YXRpYyB2b2lkIFdhaXRFdmVudEFkanVzdEtxdWV1ZShXYWl0RXZl bnRTZXQgKnNldCwgV2FpdEV2ZW50ICpldmVudCwgaW50IG9sZF9ldmVudHMpOworI2VsaWYg ZGVmaW5lZChXQUlUX1VTRV9QT0xMKQorc3RhdGljIHZvaWQgV2FpdEV2ZW50QWRqdXN0UG9s bChXYWl0RXZlbnRTZXQgKnNldCwgV2FpdEV2ZW50ICpldmVudCk7CisjZWxpZiBkZWZpbmVk KFdBSVRfVVNFX1dJTjMyKQorc3RhdGljIHZvaWQgV2FpdEV2ZW50QWRqdXN0V2luMzIoV2Fp dEV2ZW50U2V0ICpzZXQsIFdhaXRFdmVudCAqZXZlbnQpOworI2VuZGlmCisKK3N0YXRpYyBp bmxpbmUgaW50IFdhaXRFdmVudFNldFdhaXRCbG9jayhXYWl0RXZlbnRTZXQgKnNldCwgaW50 IGN1cl90aW1lb3V0LAorCQkJCQkJCQkJCVdhaXRFdmVudCAqb2NjdXJyZWRfZXZlbnRzLCBp bnQgbmV2ZW50cyk7CisKKy8qIFJlc291cmNlT3duZXIgc3VwcG9ydCB0byBob2xkIFdhaXRF dmVudFNldHMgKi8KK3N0YXRpYyB2b2lkIFJlc093bmVyUmVsZWFzZVdhaXRFdmVudFNldChE YXR1bSByZXMpOworCitzdGF0aWMgY29uc3QgUmVzb3VyY2VPd25lckRlc2Mgd2FpdF9ldmVu dF9zZXRfcmVzb3duZXJfZGVzYyA9Cit7CisJLm5hbWUgPSAiV2FpdEV2ZW50U2V0IiwKKwku cmVsZWFzZV9waGFzZSA9IFJFU09VUkNFX1JFTEVBU0VfQUZURVJfTE9DS1MsCisJLnJlbGVh c2VfcHJpb3JpdHkgPSBSRUxFQVNFX1BSSU9fV0FJVEVWRU5UU0VUUywKKwkuUmVsZWFzZVJl c291cmNlID0gUmVzT3duZXJSZWxlYXNlV2FpdEV2ZW50U2V0LAorCS5EZWJ1Z1ByaW50ID0g TlVMTAorfTsKKworLyogQ29udmVuaWVuY2Ugd3JhcHBlcnMgb3ZlciBSZXNvdXJjZU93bmVy UmVtZW1iZXIvRm9yZ2V0ICovCitzdGF0aWMgaW5saW5lIHZvaWQKK1Jlc291cmNlT3duZXJS ZW1lbWJlcldhaXRFdmVudFNldChSZXNvdXJjZU93bmVyIG93bmVyLCBXYWl0RXZlbnRTZXQg KnNldCkKK3sKKwlSZXNvdXJjZU93bmVyUmVtZW1iZXIob3duZXIsIFBvaW50ZXJHZXREYXR1 bShzZXQpLCAmd2FpdF9ldmVudF9zZXRfcmVzb3duZXJfZGVzYyk7Cit9CitzdGF0aWMgaW5s aW5lIHZvaWQKK1Jlc291cmNlT3duZXJGb3JnZXRXYWl0RXZlbnRTZXQoUmVzb3VyY2VPd25l ciBvd25lciwgV2FpdEV2ZW50U2V0ICpzZXQpCit7CisJUmVzb3VyY2VPd25lckZvcmdldChv d25lciwgUG9pbnRlckdldERhdHVtKHNldCksICZ3YWl0X2V2ZW50X3NldF9yZXNvd25lcl9k ZXNjKTsKK30KKworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgcHJvY2Vzcy1sb2NhbCB3YWl0 IGV2ZW50IGluZnJhc3RydWN0dXJlLgorICoKKyAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgb25j ZSBkdXJpbmcgc3RhcnR1cCBvZiBhbnkgcHJvY2VzcyB0aGF0IGNhbiB3YWl0IG9uCisgKiBs YXRjaGVzLCBiZWZvcmUgaXQgaXNzdWVzIGFueSBJbml0TGF0Y2goKSBvciBPd25MYXRjaCgp IGNhbGxzLgorICovCit2b2lkCitJbml0aWFsaXplV2FpdEV2ZW50U3VwcG9ydCh2b2lkKQor eworI2lmIGRlZmluZWQoV0FJVF9VU0VfU0VMRl9QSVBFKQorCWludAkJCXBpcGVmZFsyXTsK KworCWlmIChJc1VuZGVyUG9zdG1hc3RlcikKKwl7CisJCS8qCisJCSAqIFdlIG1pZ2h0IGhh dmUgaW5oZXJpdGVkIGNvbm5lY3Rpb25zIHRvIGEgc2VsZi1waXBlIGNyZWF0ZWQgYnkgdGhl CisJCSAqIHBvc3RtYXN0ZXIuICBJdCdzIGNyaXRpY2FsIHRoYXQgY2hpbGQgcHJvY2Vzc2Vz IGNyZWF0ZSB0aGVpciBvd24KKwkJICogc2VsZi1waXBlcywgb2YgY291cnNlLCBhbmQgd2Ug cmVhbGx5IHdhbnQgdGhlbSB0byBjbG9zZSB0aGUKKwkJICogaW5oZXJpdGVkIEZEcyBmb3Ig c2FmZXR5J3Mgc2FrZS4KKwkJICovCisJCWlmIChzZWxmcGlwZV9vd25lcl9waWQgIT0gMCkK KwkJeworCQkJLyogQXNzZXJ0IHdlIGdvIHRocm91Z2ggaGVyZSBidXQgb25jZSBpbiBhIGNo aWxkIHByb2Nlc3MgKi8KKwkJCUFzc2VydChzZWxmcGlwZV9vd25lcl9waWQgIT0gTXlQcm9j UGlkKTsKKwkJCS8qIFJlbGVhc2UgcG9zdG1hc3RlcidzIHBpcGUgRkRzOyBpZ25vcmUgYW55 IGVycm9yICovCisJCQkodm9pZCkgY2xvc2Uoc2VsZnBpcGVfcmVhZGZkKTsKKwkJCSh2b2lk KSBjbG9zZShzZWxmcGlwZV93cml0ZWZkKTsKKwkJCS8qIENsZWFuIHVwLCBqdXN0IGZvciBz YWZldHkncyBzYWtlOyB3ZSdsbCBzZXQgdGhlc2UgYmVsb3cgKi8KKwkJCXNlbGZwaXBlX3Jl YWRmZCA9IHNlbGZwaXBlX3dyaXRlZmQgPSAtMTsKKwkJCXNlbGZwaXBlX293bmVyX3BpZCA9 IDA7CisJCQkvKiBLZWVwIGZkLmMncyBhY2NvdW50aW5nIHN0cmFpZ2h0ICovCisJCQlSZWxl YXNlRXh0ZXJuYWxGRCgpOworCQkJUmVsZWFzZUV4dGVybmFsRkQoKTsKKwkJfQorCQllbHNl CisJCXsKKwkJCS8qCisJCQkgKiBQb3N0bWFzdGVyIGRpZG4ndCBjcmVhdGUgYSBzZWxmLXBp cGUgLi4uIG9yIGVsc2Ugd2UncmUgaW4gYW4KKwkJCSAqIEVYRUNfQkFDS0VORCBidWlsZCwg aW4gd2hpY2ggY2FzZSBpdCBkb2Vzbid0IG1hdHRlciBzaW5jZSB0aGUKKwkJCSAqIHBvc3Rt YXN0ZXIncyBwaXBlIEZEcyB3ZXJlIGNsb3NlZCBieSB0aGUgYWN0aW9uIG9mIEZEX0NMT0VY RUMuCisJCQkgKiBmZC5jIHdvbid0IGhhdmUgc3RhdGUgdG8gY2xlYW4gdXAsIGVpdGhlci4K KwkJCSAqLworCQkJQXNzZXJ0KHNlbGZwaXBlX3JlYWRmZCA9PSAtMSk7CisJCX0KKwl9CisJ ZWxzZQorCXsKKwkJLyogSW4gcG9zdG1hc3RlciBvciBzdGFuZGFsb25lIGJhY2tlbmQsIGFz c2VydCB3ZSBkbyB0aGlzIGJ1dCBvbmNlICovCisJCUFzc2VydChzZWxmcGlwZV9yZWFkZmQg PT0gLTEpOworCQlBc3NlcnQoc2VsZnBpcGVfb3duZXJfcGlkID09IDApOworCX0KKworCS8q CisJICogU2V0IHVwIHRoZSBzZWxmLXBpcGUgdGhhdCBhbGxvd3MgYSBzaWduYWwgaGFuZGxl ciB0byB3YWtlIHVwIHRoZQorCSAqIHBvbGwoKS9lcG9sbF93YWl0KCkgaW4gV2FpdExhdGNo LiBNYWtlIHRoZSB3cml0ZS1lbmQgbm9uLWJsb2NraW5nLCBzbworCSAqIHRoYXQgU2V0TGF0 Y2ggd29uJ3QgYmxvY2sgaWYgdGhlIGV2ZW50IGhhcyBhbHJlYWR5IGJlZW4gc2V0IG1hbnkg dGltZXMKKwkgKiBmaWxsaW5nIHRoZSBrZXJuZWwgYnVmZmVyLiBNYWtlIHRoZSByZWFkLWVu ZCBub24tYmxvY2tpbmcgdG9vLCBzbyB0aGF0CisJICogd2UgY2FuIGVhc2lseSBjbGVhciB0 aGUgcGlwZSBieSByZWFkaW5nIHVudGlsIEVBR0FJTiBvciBFV09VTERCTE9DSy4KKwkgKiBB bHNvLCBtYWtlIGJvdGggRkRzIGNsb3NlLW9uLWV4ZWMsIHNpbmNlIHdlIHN1cmVseSBkbyBu b3Qgd2FudCBhbnkKKwkgKiBjaGlsZCBwcm9jZXNzZXMgbWVzc2luZyB3aXRoIHRoZW0uCisJ ICovCisJaWYgKHBpcGUocGlwZWZkKSA8IDApCisJCWVsb2coRkFUQUwsICJwaXBlKCkgZmFp bGVkOiAlbSIpOworCWlmIChmY250bChwaXBlZmRbMF0sIEZfU0VURkwsIE9fTk9OQkxPQ0sp ID09IC0xKQorCQllbG9nKEZBVEFMLCAiZmNudGwoRl9TRVRGTCkgZmFpbGVkIG9uIHJlYWQt ZW5kIG9mIHNlbGYtcGlwZTogJW0iKTsKKwlpZiAoZmNudGwocGlwZWZkWzFdLCBGX1NFVEZM LCBPX05PTkJMT0NLKSA9PSAtMSkKKwkJZWxvZyhGQVRBTCwgImZjbnRsKEZfU0VURkwpIGZh aWxlZCBvbiB3cml0ZS1lbmQgb2Ygc2VsZi1waXBlOiAlbSIpOworCWlmIChmY250bChwaXBl ZmRbMF0sIEZfU0VURkQsIEZEX0NMT0VYRUMpID09IC0xKQorCQllbG9nKEZBVEFMLCAiZmNu dGwoRl9TRVRGRCkgZmFpbGVkIG9uIHJlYWQtZW5kIG9mIHNlbGYtcGlwZTogJW0iKTsKKwlp ZiAoZmNudGwocGlwZWZkWzFdLCBGX1NFVEZELCBGRF9DTE9FWEVDKSA9PSAtMSkKKwkJZWxv ZyhGQVRBTCwgImZjbnRsKEZfU0VURkQpIGZhaWxlZCBvbiB3cml0ZS1lbmQgb2Ygc2VsZi1w aXBlOiAlbSIpOworCisJc2VsZnBpcGVfcmVhZGZkID0gcGlwZWZkWzBdOworCXNlbGZwaXBl X3dyaXRlZmQgPSBwaXBlZmRbMV07CisJc2VsZnBpcGVfb3duZXJfcGlkID0gTXlQcm9jUGlk OworCisJLyogVGVsbCBmZC5jIGFib3V0IHRoZXNlIHR3byBsb25nLWxpdmVkIEZEcyAqLwor CVJlc2VydmVFeHRlcm5hbEZEKCk7CisJUmVzZXJ2ZUV4dGVybmFsRkQoKTsKKworCXBxc2ln bmFsKFNJR1VSRywgbGF0Y2hfc2lndXJnX2hhbmRsZXIpOworI2VuZGlmCisKKyNpZmRlZiBX QUlUX1VTRV9TSUdOQUxGRAorCXNpZ3NldF90CXNpZ25hbGZkX21hc2s7CisKKwlpZiAoSXNV bmRlclBvc3RtYXN0ZXIpCisJeworCQkvKgorCQkgKiBJdCB3b3VsZCBwcm9iYWJseSBiZSBz YWZlIHRvIHJlLXVzZSB0aGUgaW5oZXJpdGVkIHNpZ25hbGZkIHNpbmNlCisJCSAqIHNpZ25h bGZkcyBvbmx5IHNlZSB0aGUgY3VycmVudCBwcm9jZXNzJ3MgcGVuZGluZyBzaWduYWxzLCBi dXQgaXQKKwkJICogc2VlbXMgbGVzcyBzdXJwcmlzaW5nIHRvIGNsb3NlIGl0IGFuZCBjcmVh dGUgb3VyIG93bi4KKwkJICovCisJCWlmIChzaWduYWxfZmQgIT0gLTEpCisJCXsKKwkJCS8q IFJlbGVhc2UgcG9zdG1hc3RlcidzIHNpZ25hbCBGRDsgaWdub3JlIGFueSBlcnJvciAqLwor CQkJKHZvaWQpIGNsb3NlKHNpZ25hbF9mZCk7CisJCQlzaWduYWxfZmQgPSAtMTsKKwkJCVJl bGVhc2VFeHRlcm5hbEZEKCk7CisJCX0KKwl9CisKKwkvKiBCbG9jayBTSUdVUkcsIGJlY2F1 c2Ugd2UnbGwgcmVjZWl2ZSBpdCB0aHJvdWdoIGEgc2lnbmFsZmQuICovCisJc2lnYWRkc2V0 KCZVbkJsb2NrU2lnLCBTSUdVUkcpOworCisJLyogU2V0IHVwIHRoZSBzaWduYWxmZCB0byBy ZWNlaXZlIFNJR1VSRyBub3RpZmljYXRpb25zLiAqLworCXNpZ2VtcHR5c2V0KCZzaWduYWxm ZF9tYXNrKTsKKwlzaWdhZGRzZXQoJnNpZ25hbGZkX21hc2ssIFNJR1VSRyk7CisJc2lnbmFs X2ZkID0gc2lnbmFsZmQoLTEsICZzaWduYWxmZF9tYXNrLCBTRkRfTk9OQkxPQ0sgfCBTRkRf Q0xPRVhFQyk7CisJaWYgKHNpZ25hbF9mZCA8IDApCisJCWVsb2coRkFUQUwsICJzaWduYWxm ZCgpIGZhaWxlZCIpOworCVJlc2VydmVFeHRlcm5hbEZEKCk7CisjZW5kaWYKKworI2lmZGVm IFdBSVRfVVNFX0tRVUVVRQorCS8qIElnbm9yZSBTSUdVUkcsIGJlY2F1c2Ugd2UnbGwgcmVj ZWl2ZSBpdCB2aWEga3F1ZXVlLiAqLworCXBxc2lnbmFsKFNJR1VSRywgU0lHX0lHTik7Cisj ZW5kaWYKK30KKworLyoKKyAqIENyZWF0ZSBhIFdhaXRFdmVudFNldCB3aXRoIHNwYWNlIGZv ciBuZXZlbnRzIGRpZmZlcmVudCBldmVudHMgdG8gd2FpdCBmb3IuCisgKgorICogVGhlc2Ug ZXZlbnRzIGNhbiB0aGVuIGJlIGVmZmljaWVudGx5IHdhaXRlZCB1cG9uIHRvZ2V0aGVyLCB1 c2luZworICogV2FpdEV2ZW50U2V0V2FpdCgpLgorICoKKyAqIFRoZSBXYWl0RXZlbnRTZXQg aXMgdHJhY2tlZCBieSB0aGUgZ2l2ZW4gJ3Jlc293bmVyJy4gIFVzZSBOVUxMIGZvciBzZXNz aW9uCisgKiBsaWZldGltZS4KKyAqLworV2FpdEV2ZW50U2V0ICoKK0NyZWF0ZVdhaXRFdmVu dFNldChSZXNvdXJjZU93bmVyIHJlc293bmVyLCBpbnQgbmV2ZW50cykKK3sKKwlXYWl0RXZl bnRTZXQgKnNldDsKKwljaGFyCSAgICpkYXRhOworCVNpemUJCXN6ID0gMDsKKworCS8qCisJ ICogVXNlIE1BWEFMSUdOIHNpemUvYWxpZ25tZW50IHRvIGd1YXJhbnRlZSB0aGF0IGxhdGVy IHVzZXMgb2YgbWVtb3J5IGFyZQorCSAqIGFsaWduZWQgY29ycmVjdGx5LiBFLmcuIGVwb2xs X2V2ZW50IG1pZ2h0IG5lZWQgOCBieXRlIGFsaWdubWVudCBvbiBzb21lCisJICogcGxhdGZv cm1zLCBidXQgZWFybGllciBhbGxvY2F0aW9ucyBsaWtlIFdhaXRFdmVudFNldCBhbmQgV2Fp dEV2ZW50CisJICogbWlnaHQgbm90IGJlIHNpemVkIHRvIGd1YXJhbnRlZSB0aGF0IHdoZW4g cHVyZWx5IHVzaW5nIHNpemVvZigpLgorCSAqLworCXN6ICs9IE1BWEFMSUdOKHNpemVvZihX YWl0RXZlbnRTZXQpKTsKKwlzeiArPSBNQVhBTElHTihzaXplb2YoV2FpdEV2ZW50KSAqIG5l dmVudHMpOworCisjaWYgZGVmaW5lZChXQUlUX1VTRV9FUE9MTCkKKwlzeiArPSBNQVhBTElH TihzaXplb2Yoc3RydWN0IGVwb2xsX2V2ZW50KSAqIG5ldmVudHMpOworI2VsaWYgZGVmaW5l ZChXQUlUX1VTRV9LUVVFVUUpCisJc3ogKz0gTUFYQUxJR04oc2l6ZW9mKHN0cnVjdCBrZXZl bnQpICogbmV2ZW50cyk7CisjZWxpZiBkZWZpbmVkKFdBSVRfVVNFX1BPTEwpCisJc3ogKz0g TUFYQUxJR04oc2l6ZW9mKHN0cnVjdCBwb2xsZmQpICogbmV2ZW50cyk7CisjZWxpZiBkZWZp bmVkKFdBSVRfVVNFX1dJTjMyKQorCS8qIG5lZWQgc3BhY2UgZm9yIHRoZSBwZ3dpbjMyX3Np Z25hbF9ldmVudCAqLworCXN6ICs9IE1BWEFMSUdOKHNpemVvZihIQU5ETEUpICogKG5ldmVu dHMgKyAxKSk7CisjZW5kaWYKKworCWlmIChyZXNvd25lciAhPSBOVUxMKQorCQlSZXNvdXJj ZU93bmVyRW5sYXJnZShyZXNvd25lcik7CisKKwlkYXRhID0gKGNoYXIgKikgTWVtb3J5Q29u dGV4dEFsbG9jWmVybyhUb3BNZW1vcnlDb250ZXh0LCBzeik7CisKKwlzZXQgPSAoV2FpdEV2 ZW50U2V0ICopIGRhdGE7CisJZGF0YSArPSBNQVhBTElHTihzaXplb2YoV2FpdEV2ZW50U2V0 KSk7CisKKwlzZXQtPmV2ZW50cyA9IChXYWl0RXZlbnQgKikgZGF0YTsKKwlkYXRhICs9IE1B WEFMSUdOKHNpemVvZihXYWl0RXZlbnQpICogbmV2ZW50cyk7CisKKyNpZiBkZWZpbmVkKFdB SVRfVVNFX0VQT0xMKQorCXNldC0+ZXBvbGxfcmV0X2V2ZW50cyA9IChzdHJ1Y3QgZXBvbGxf ZXZlbnQgKikgZGF0YTsKKwlkYXRhICs9IE1BWEFMSUdOKHNpemVvZihzdHJ1Y3QgZXBvbGxf ZXZlbnQpICogbmV2ZW50cyk7CisjZWxpZiBkZWZpbmVkKFdBSVRfVVNFX0tRVUVVRSkKKwlz ZXQtPmtxdWV1ZV9yZXRfZXZlbnRzID0gKHN0cnVjdCBrZXZlbnQgKikgZGF0YTsKKwlkYXRh ICs9IE1BWEFMSUdOKHNpemVvZihzdHJ1Y3Qga2V2ZW50KSAqIG5ldmVudHMpOworI2VsaWYg ZGVmaW5lZChXQUlUX1VTRV9QT0xMKQorCXNldC0+cG9sbGZkcyA9IChzdHJ1Y3QgcG9sbGZk ICopIGRhdGE7CisJZGF0YSArPSBNQVhBTElHTihzaXplb2Yoc3RydWN0IHBvbGxmZCkgKiBu ZXZlbnRzKTsKKyNlbGlmIGRlZmluZWQoV0FJVF9VU0VfV0lOMzIpCisJc2V0LT5oYW5kbGVz ID0gKEhBTkRMRSkgZGF0YTsKKwlkYXRhICs9IE1BWEFMSUdOKHNpemVvZihIQU5ETEUpICog bmV2ZW50cyk7CisjZW5kaWYKKworCXNldC0+bGF0Y2ggPSBOVUxMOworCXNldC0+bmV2ZW50 c19zcGFjZSA9IG5ldmVudHM7CisJc2V0LT5leGl0X29uX3Bvc3RtYXN0ZXJfZGVhdGggPSBm YWxzZTsKKworCWlmIChyZXNvd25lciAhPSBOVUxMKQorCXsKKwkJUmVzb3VyY2VPd25lclJl bWVtYmVyV2FpdEV2ZW50U2V0KHJlc293bmVyLCBzZXQpOworCQlzZXQtPm93bmVyID0gcmVz b3duZXI7CisJfQorCisjaWYgZGVmaW5lZChXQUlUX1VTRV9FUE9MTCkKKwlpZiAoIUFjcXVp cmVFeHRlcm5hbEZEKCkpCisJCWVsb2coRVJST1IsICJBY3F1aXJlRXh0ZXJuYWxGRCwgZm9y IGVwb2xsX2NyZWF0ZTEsIGZhaWxlZDogJW0iKTsKKwlzZXQtPmVwb2xsX2ZkID0gZXBvbGxf Y3JlYXRlMShFUE9MTF9DTE9FWEVDKTsKKwlpZiAoc2V0LT5lcG9sbF9mZCA8IDApCisJewor CQlSZWxlYXNlRXh0ZXJuYWxGRCgpOworCQllbG9nKEVSUk9SLCAiZXBvbGxfY3JlYXRlMSBm YWlsZWQ6ICVtIik7CisJfQorI2VsaWYgZGVmaW5lZChXQUlUX1VTRV9LUVVFVUUpCisJaWYg KCFBY3F1aXJlRXh0ZXJuYWxGRCgpKQorCQllbG9nKEVSUk9SLCAiQWNxdWlyZUV4dGVybmFs RkQsIGZvciBrcXVldWUsIGZhaWxlZDogJW0iKTsKKwlzZXQtPmtxdWV1ZV9mZCA9IGtxdWV1 ZSgpOworCWlmIChzZXQtPmtxdWV1ZV9mZCA8IDApCisJeworCQlSZWxlYXNlRXh0ZXJuYWxG RCgpOworCQllbG9nKEVSUk9SLCAia3F1ZXVlIGZhaWxlZDogJW0iKTsKKwl9CisJaWYgKGZj bnRsKHNldC0+a3F1ZXVlX2ZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKSA9PSAtMSkKKwl7CisJ CWludAkJCXNhdmVfZXJybm8gPSBlcnJubzsKKworCQljbG9zZShzZXQtPmtxdWV1ZV9mZCk7 CisJCVJlbGVhc2VFeHRlcm5hbEZEKCk7CisJCWVycm5vID0gc2F2ZV9lcnJubzsKKwkJZWxv ZyhFUlJPUiwgImZjbnRsKEZfU0VURkQpIGZhaWxlZCBvbiBrcXVldWUgZGVzY3JpcHRvcjog JW0iKTsKKwl9CisJc2V0LT5yZXBvcnRfcG9zdG1hc3Rlcl9ub3RfcnVubmluZyA9IGZhbHNl OworI2VsaWYgZGVmaW5lZChXQUlUX1VTRV9XSU4zMikKKworCS8qCisJICogVG8gaGFuZGxl IHNpZ25hbHMgd2hpbGUgd2FpdGluZywgd2UgbmVlZCB0byBhZGQgYSB3aW4zMiBzcGVjaWZp YyBldmVudC4KKwkgKiBXZSBhY2NvdW50ZWQgZm9yIHRoZSBhZGRpdGlvbmFsIGV2ZW50IGF0 IHRoZSB0b3Agb2YgdGhpcyByb3V0aW5lLiBTZWUKKwkgKiBwb3J0L3dpbjMyL3NpZ25hbC5j IGZvciBtb3JlIGRldGFpbHMuCisJICoKKwkgKiBOb3RlOiBwZ3dpbjMyX3NpZ25hbF9ldmVu dCBzaG91bGQgYmUgZmlyc3QgdG8gZW5zdXJlIHRoYXQgaXQgd2lsbCBiZQorCSAqIHJlcG9y dGVkIHdoZW4gbXVsdGlwbGUgZXZlbnRzIGFyZSBzZXQuICBXZSB3YW50IHRvIGd1YXJhbnRl ZSB0aGF0CisJICogcGVuZGluZyBzaWduYWxzIGFyZSBzZXJ2aWNlZC4KKwkgKi8KKwlzZXQt PmhhbmRsZXNbMF0gPSBwZ3dpbjMyX3NpZ25hbF9ldmVudDsKKwlTdGF0aWNBc3NlcnRTdG10 KFdTQV9JTlZBTElEX0VWRU5UID09IE5VTEwsICIiKTsKKyNlbmRpZgorCisJcmV0dXJuIHNl dDsKK30KKworLyoKKyAqIEZyZWUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgV2FpdEV2ZW50U2V0 LgorICoKKyAqIE5vdGU6IHByZWZlcmFibHksIHRoaXMgc2hvdWxkbid0IGhhdmUgdG8gZnJl ZSBhbnkgcmVzb3VyY2VzIHRoYXQgY291bGQgYmUKKyAqIGluaGVyaXRlZCBhY3Jvc3MgYW4g ZXhlYygpLiAgSWYgaXQgZGlkLCB3ZSdkIGxpa2VseSBsZWFrIHRob3NlIHJlc291cmNlcyBp bgorICogbWFueSBzY2VuYXJpb3MuICBGb3IgdGhlIGVwb2xsIGNhc2UsIHdlIGVuc3VyZSB0 aGF0IGJ5IHNldHRpbmcgRVBPTExfQ0xPRVhFQworICogd2hlbiB0aGUgRkQgaXMgY3JlYXRl ZC4gIEZvciB0aGUgV2luZG93cyBjYXNlLCB3ZSBhc3N1bWUgdGhhdCB0aGUgaGFuZGxlcwor ICogaW52b2x2ZWQgYXJlIG5vbi1pbmhlcml0YWJsZS4KKyAqLwordm9pZAorRnJlZVdhaXRF dmVudFNldChXYWl0RXZlbnRTZXQgKnNldCkKK3sKKwlpZiAoc2V0LT5vd25lcikKKwl7CisJ CVJlc291cmNlT3duZXJGb3JnZXRXYWl0RXZlbnRTZXQoc2V0LT5vd25lciwgc2V0KTsKKwkJ c2V0LT5vd25lciA9IE5VTEw7CisJfQorCisjaWYgZGVmaW5lZChXQUlUX1VTRV9FUE9MTCkK KwljbG9zZShzZXQtPmVwb2xsX2ZkKTsKKwlSZWxlYXNlRXh0ZXJuYWxGRCgpOworI2VsaWYg ZGVmaW5lZChXQUlUX1VTRV9LUVVFVUUpCisJY2xvc2Uoc2V0LT5rcXVldWVfZmQpOworCVJl bGVhc2VFeHRlcm5hbEZEKCk7CisjZWxpZiBkZWZpbmVkKFdBSVRfVVNFX1dJTjMyKQorCWZv ciAoV2FpdEV2ZW50ICpjdXJfZXZlbnQgPSBzZXQtPmV2ZW50czsKKwkJIGN1cl9ldmVudCA8 IChzZXQtPmV2ZW50cyArIHNldC0+bmV2ZW50cyk7CisJCSBjdXJfZXZlbnQrKykKKwl7CisJ CWlmIChjdXJfZXZlbnQtPmV2ZW50cyAmIFdMX0xBVENIX1NFVCkKKwkJeworCQkJLyogdXNl cyB0aGUgbGF0Y2gncyBIQU5ETEUgKi8KKwkJfQorCQllbHNlIGlmIChjdXJfZXZlbnQtPmV2 ZW50cyAmIFdMX1BPU1RNQVNURVJfREVBVEgpCisJCXsKKwkJCS8qIHVzZXMgUG9zdG1hc3Rl ckhhbmRsZSAqLworCQl9CisJCWVsc2UKKwkJeworCQkJLyogQ2xlYW4gdXAgdGhlIGV2ZW50 IG9iamVjdCB3ZSBjcmVhdGVkIGZvciB0aGUgc29ja2V0ICovCisJCQlXU0FFdmVudFNlbGVj dChjdXJfZXZlbnQtPmZkLCBOVUxMLCAwKTsKKwkJCVdTQUNsb3NlRXZlbnQoc2V0LT5oYW5k bGVzW2N1cl9ldmVudC0+cG9zICsgMV0pOworCQl9CisJfQorI2VuZGlmCisKKwlwZnJlZShz ZXQpOworfQorCisvKgorICogRnJlZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBXYWl0RXZlbnRT ZXQgaW4gYSBjaGlsZCBwcm9jZXNzIGFmdGVyIGEgZm9yaygpLgorICovCit2b2lkCitGcmVl V2FpdEV2ZW50U2V0QWZ0ZXJGb3JrKFdhaXRFdmVudFNldCAqc2V0KQoreworI2lmIGRlZmlu ZWQoV0FJVF9VU0VfRVBPTEwpCisJY2xvc2Uoc2V0LT5lcG9sbF9mZCk7CisJUmVsZWFzZUV4 dGVybmFsRkQoKTsKKyNlbGlmIGRlZmluZWQoV0FJVF9VU0VfS1FVRVVFKQorCS8qIGtxdWV1 ZXMgYXJlIG5vdCBub3JtYWxseSBpbmhlcml0ZWQgYnkgY2hpbGQgcHJvY2Vzc2VzICovCisJ UmVsZWFzZUV4dGVybmFsRkQoKTsKKyNlbmRpZgorCisJcGZyZWUoc2V0KTsKK30KKworLyog LS0tCisgKiBBZGQgYW4gZXZlbnQgdG8gdGhlIHNldC4gUG9zc2libGUgZXZlbnRzIGFyZToK KyAqIC0gV0xfTEFUQ0hfU0VUOiBXYWl0IGZvciB0aGUgbGF0Y2ggdG8gYmUgc2V0CisgKiAt IFdMX1BPU1RNQVNURVJfREVBVEg6IFdhaXQgZm9yIHBvc3RtYXN0ZXIgdG8gZGllCisgKiAt IFdMX1NPQ0tFVF9SRUFEQUJMRTogV2FpdCBmb3Igc29ja2V0IHRvIGJlY29tZSByZWFkYWJs ZSwKKyAqCSBjYW4gYmUgY29tYmluZWQgaW4gb25lIGV2ZW50IHdpdGggb3RoZXIgV0xfU09D S0VUXyogZXZlbnRzCisgKiAtIFdMX1NPQ0tFVF9XUklURUFCTEU6IFdhaXQgZm9yIHNvY2tl dCB0byBiZWNvbWUgd3JpdGVhYmxlLAorICoJIGNhbiBiZSBjb21iaW5lZCB3aXRoIG90aGVy IFdMX1NPQ0tFVF8qIGV2ZW50cworICogLSBXTF9TT0NLRVRfQ09OTkVDVEVEOiBXYWl0IGZv ciBzb2NrZXQgY29ubmVjdGlvbiB0byBiZSBlc3RhYmxpc2hlZCwKKyAqCSBjYW4gYmUgY29t YmluZWQgd2l0aCBvdGhlciBXTF9TT0NLRVRfKiBldmVudHMgKG9uIG5vbi1XaW5kb3dzCisg KgkgcGxhdGZvcm1zLCB0aGlzIGlzIHRoZSBzYW1lIGFzIFdMX1NPQ0tFVF9XUklURUFCTEUp CisgKiAtIFdMX1NPQ0tFVF9BQ0NFUFQ6IFdhaXQgZm9yIG5ldyBjb25uZWN0aW9uIHRvIGEg c2VydmVyIHNvY2tldCwKKyAqCSBjYW4gYmUgY29tYmluZWQgd2l0aCBvdGhlciBXTF9TT0NL RVRfKiBldmVudHMgKG9uIG5vbi1XaW5kb3dzCisgKgkgcGxhdGZvcm1zLCB0aGlzIGlzIHRo ZSBzYW1lIGFzIFdMX1NPQ0tFVF9SRUFEQUJMRSkKKyAqIC0gV0xfU09DS0VUX0NMT1NFRDog V2FpdCBmb3Igc29ja2V0IHRvIGJlIGNsb3NlZCBieSByZW1vdGUgcGVlci4KKyAqIC0gV0xf RVhJVF9PTl9QTV9ERUFUSDogRXhpdCBpbW1lZGlhdGVseSBpZiB0aGUgcG9zdG1hc3RlciBk aWVzCisgKgorICogUmV0dXJucyB0aGUgb2Zmc2V0IGluIFdhaXRFdmVudFNldC0+ZXZlbnRz IChzdGFydGluZyBmcm9tIDApLCB3aGljaCBjYW4gYmUKKyAqIHVzZWQgdG8gbW9kaWZ5IHBy ZXZpb3VzbHkgYWRkZWQgd2FpdCBldmVudHMgdXNpbmcgTW9kaWZ5V2FpdEV2ZW50KCkuCisg KgorICogSW4gdGhlIFdMX0xBVENIX1NFVCBjYXNlIHRoZSBsYXRjaCBtdXN0IGJlIG93bmVk IGJ5IHRoZSBjdXJyZW50IHByb2Nlc3MsCisgKiBpLmUuIGl0IG11c3QgYmUgYSBwcm9jZXNz LWxvY2FsIGxhdGNoIGluaXRpYWxpemVkIHdpdGggSW5pdExhdGNoLCBvciBhCisgKiBzaGFy ZWQgbGF0Y2ggYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IHByb2Nlc3MgYnkgY2FsbGlu ZyBPd25MYXRjaC4KKyAqCisgKiBJbiB0aGUgV0xfU09DS0VUX1JFQURBQkxFL1dSSVRFQUJM RS9DT05ORUNURUQvQUNDRVBUIGNhc2VzLCBFT0YgYW5kIGVycm9yCisgKiBjb25kaXRpb25z IGNhdXNlIHRoZSBzb2NrZXQgdG8gYmUgcmVwb3J0ZWQgYXMgcmVhZGFibGUvd3JpdGFibGUv Y29ubmVjdGVkLAorICogc28gdGhhdCB0aGUgY2FsbGVyIGNhbiBkZWFsIHdpdGggdGhlIGNv bmRpdGlvbi4KKyAqCisgKiBUaGUgdXNlcl9kYXRhIHBvaW50ZXIgc3BlY2lmaWVkIGhlcmUg d2lsbCBiZSBzZXQgZm9yIHRoZSBldmVudHMgcmV0dXJuZWQKKyAqIGJ5IFdhaXRFdmVudFNl dFdhaXQoKSwgYWxsb3dpbmcgdG8gZWFzaWx5IGFzc29jaWF0ZSBhZGRpdGlvbmFsIGRhdGEg d2l0aAorICogZXZlbnRzLgorICovCitpbnQKK0FkZFdhaXRFdmVudFRvU2V0KFdhaXRFdmVu dFNldCAqc2V0LCB1aW50MzIgZXZlbnRzLCBwZ3NvY2tldCBmZCwgTGF0Y2ggKmxhdGNoLAor CQkJCSAgdm9pZCAqdXNlcl9kYXRhKQoreworCVdhaXRFdmVudCAgKmV2ZW50OworCisJLyog bm90IGVub3VnaCBzcGFjZSAqLworCUFzc2VydChzZXQtPm5ldmVudHMgPCBzZXQtPm5ldmVu dHNfc3BhY2UpOworCisJaWYgKGV2ZW50cyA9PSBXTF9FWElUX09OX1BNX0RFQVRIKQorCXsK KwkJZXZlbnRzID0gV0xfUE9TVE1BU1RFUl9ERUFUSDsKKwkJc2V0LT5leGl0X29uX3Bvc3Rt YXN0ZXJfZGVhdGggPSB0cnVlOworCX0KKworCWlmIChsYXRjaCkKKwl7CisJCWlmIChsYXRj aC0+b3duZXJfcGlkICE9IE15UHJvY1BpZCkKKwkJCWVsb2coRVJST1IsICJjYW5ub3Qgd2Fp dCBvbiBhIGxhdGNoIG93bmVkIGJ5IGFub3RoZXIgcHJvY2VzcyIpOworCQlpZiAoc2V0LT5s YXRjaCkKKwkJCWVsb2coRVJST1IsICJjYW5ub3Qgd2FpdCBvbiBtb3JlIHRoYW4gb25lIGxh dGNoIik7CisJCWlmICgoZXZlbnRzICYgV0xfTEFUQ0hfU0VUKSAhPSBXTF9MQVRDSF9TRVQp CisJCQllbG9nKEVSUk9SLCAibGF0Y2ggZXZlbnRzIG9ubHkgc3VwcG9ydCBiZWluZyBzZXQi KTsKKwl9CisJZWxzZQorCXsKKwkJaWYgKGV2ZW50cyAmIFdMX0xBVENIX1NFVCkKKwkJCWVs b2coRVJST1IsICJjYW5ub3Qgd2FpdCBvbiBsYXRjaCB3aXRob3V0IGEgc3BlY2lmaWVkIGxh dGNoIik7CisJfQorCisJLyogd2FpdGluZyBmb3Igc29ja2V0IHJlYWRpbmVzcyB3aXRob3V0 IGEgc29ja2V0IGluZGljYXRlcyBhIGJ1ZyAqLworCWlmIChmZCA9PSBQR0lOVkFMSURfU09D S0VUICYmIChldmVudHMgJiBXTF9TT0NLRVRfTUFTSykpCisJCWVsb2coRVJST1IsICJjYW5u b3Qgd2FpdCBvbiBzb2NrZXQgZXZlbnQgd2l0aG91dCBhIHNvY2tldCIpOworCisJZXZlbnQg PSAmc2V0LT5ldmVudHNbc2V0LT5uZXZlbnRzXTsKKwlldmVudC0+cG9zID0gc2V0LT5uZXZl bnRzKys7CisJZXZlbnQtPmZkID0gZmQ7CisJZXZlbnQtPmV2ZW50cyA9IGV2ZW50czsKKwll dmVudC0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworI2lmZGVmIFdJTjMyCisJZXZlbnQtPnJl c2V0ID0gZmFsc2U7CisjZW5kaWYKKworCWlmIChldmVudHMgPT0gV0xfTEFUQ0hfU0VUKQor CXsKKwkJc2V0LT5sYXRjaCA9IGxhdGNoOworCQlzZXQtPmxhdGNoX3BvcyA9IGV2ZW50LT5w b3M7CisjaWYgZGVmaW5lZChXQUlUX1VTRV9TRUxGX1BJUEUpCisJCWV2ZW50LT5mZCA9IHNl bGZwaXBlX3JlYWRmZDsKKyNlbGlmIGRlZmluZWQoV0FJVF9VU0VfU0lHTkFMRkQpCisJCWV2 ZW50LT5mZCA9IHNpZ25hbF9mZDsKKyNlbHNlCisJCWV2ZW50LT5mZCA9IFBHSU5WQUxJRF9T T0NLRVQ7CisjaWZkZWYgV0FJVF9VU0VfRVBPTEwKKwkJcmV0dXJuIGV2ZW50LT5wb3M7Cisj ZW5kaWYKKyNlbmRpZgorCX0KKwllbHNlIGlmIChldmVudHMgPT0gV0xfUE9TVE1BU1RFUl9E RUFUSCkKKwl7CisjaWZuZGVmIFdJTjMyCisJCWV2ZW50LT5mZCA9IHBvc3RtYXN0ZXJfYWxp dmVfZmRzW1BPU1RNQVNURVJfRkRfV0FUQ0hdOworI2VuZGlmCisJfQorCisJLyogcGVyZm9y bSB3YWl0IHByaW1pdGl2ZSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiwgaWYgbmVlZGVkICov CisjaWYgZGVmaW5lZChXQUlUX1VTRV9FUE9MTCkKKwlXYWl0RXZlbnRBZGp1c3RFcG9sbChz ZXQsIGV2ZW50LCBFUE9MTF9DVExfQUREKTsKKyNlbGlmIGRlZmluZWQoV0FJVF9VU0VfS1FV RVVFKQorCVdhaXRFdmVudEFkanVzdEtxdWV1ZShzZXQsIGV2ZW50LCAwKTsKKyNlbGlmIGRl ZmluZWQoV0FJVF9VU0VfUE9MTCkKKwlXYWl0RXZlbnRBZGp1c3RQb2xsKHNldCwgZXZlbnQp OworI2VsaWYgZGVmaW5lZChXQUlUX1VTRV9XSU4zMikKKwlXYWl0RXZlbnRBZGp1c3RXaW4z MihzZXQsIGV2ZW50KTsKKyNlbmRpZgorCisJcmV0dXJuIGV2ZW50LT5wb3M7Cit9CisKKy8q CisgKiBDaGFuZ2UgdGhlIGV2ZW50IG1hc2sgYW5kLCBpbiB0aGUgV0xfTEFUQ0hfU0VUIGNh c2UsIHRoZSBsYXRjaCBhc3NvY2lhdGVkCisgKiB3aXRoIHRoZSBXYWl0RXZlbnQuICBUaGUg bGF0Y2ggbWF5IGJlIGNoYW5nZWQgdG8gTlVMTCB0byBkaXNhYmxlIHRoZSBsYXRjaAorICog dGVtcG9yYXJpbHksIGFuZCB0aGVuIHNldCBiYWNrIHRvIGEgbGF0Y2ggbGF0ZXIuCisgKgor ICogJ3BvcycgaXMgdGhlIGlkIHJldHVybmVkIGJ5IEFkZFdhaXRFdmVudFRvU2V0LgorICov Cit2b2lkCitNb2RpZnlXYWl0RXZlbnQoV2FpdEV2ZW50U2V0ICpzZXQsIGludCBwb3MsIHVp bnQzMiBldmVudHMsIExhdGNoICpsYXRjaCkKK3sKKwlXYWl0RXZlbnQgICpldmVudDsKKyNp ZiBkZWZpbmVkKFdBSVRfVVNFX0tRVUVVRSkKKwlpbnQJCQlvbGRfZXZlbnRzOworI2VuZGlm CisKKwlBc3NlcnQocG9zIDwgc2V0LT5uZXZlbnRzKTsKKworCWV2ZW50ID0gJnNldC0+ZXZl bnRzW3Bvc107CisjaWYgZGVmaW5lZChXQUlUX1VTRV9LUVVFVUUpCisJb2xkX2V2ZW50cyA9 IGV2ZW50LT5ldmVudHM7CisjZW5kaWYKKworCS8qCisJICogSWYgbmVpdGhlciB0aGUgZXZl bnQgbWFzayBub3IgdGhlIGFzc29jaWF0ZWQgbGF0Y2ggY2hhbmdlcywgcmV0dXJuCisJICog ZWFybHkuIFRoYXQncyBhbiBpbXBvcnRhbnQgb3B0aW1pemF0aW9uIGZvciBzb21lIHNvY2tl dHMsIHdoZXJlCisJICogTW9kaWZ5V2FpdEV2ZW50IGlzIGZyZXF1ZW50bHkgdXNlZCB0byBz d2l0Y2ggZnJvbSB3YWl0aW5nIGZvciByZWFkcyB0bworCSAqIHdhaXRpbmcgb24gd3JpdGVz LgorCSAqLworCWlmIChldmVudHMgPT0gZXZlbnQtPmV2ZW50cyAmJgorCQkoIShldmVudC0+ ZXZlbnRzICYgV0xfTEFUQ0hfU0VUKSB8fCBzZXQtPmxhdGNoID09IGxhdGNoKSkKKwkJcmV0 dXJuOworCisJLyogQWxsb3cgc3dpdGNoaW5nIGJldHdlZW4gV0xfUE9TVE1BU1RFUl9ERUFU SCBhbmQgV0xfRVhJVF9PTl9QTV9ERUFUSCAqLworCWlmIChldmVudC0+ZXZlbnRzICYgV0xf UE9TVE1BU1RFUl9ERUFUSCkKKwl7CisJCWlmIChldmVudHMgIT0gV0xfUE9TVE1BU1RFUl9E RUFUSCAmJiBldmVudHMgIT0gV0xfRVhJVF9PTl9QTV9ERUFUSCkKKwkJCWVsb2coRVJST1Is ICJjYW5ub3QgbW9kaWZ5IHBvc3RtYXN0ZXIgZGVhdGggZXZlbnQiKTsKKwkJc2V0LT5leGl0 X29uX3Bvc3RtYXN0ZXJfZGVhdGggPQkoKGV2ZW50cyAmIFdMX0VYSVRfT05fUE1fREVBVEgp ICE9IDApOworCQlyZXR1cm47CisJfQorCisJaWYgKGV2ZW50LT5ldmVudHMgJiBXTF9MQVRD SF9TRVQgJiYKKwkJZXZlbnRzICE9IGV2ZW50LT5ldmVudHMpCisJeworCQllbG9nKEVSUk9S LCAiY2Fubm90IG1vZGlmeSBsYXRjaCBldmVudCIpOworCX0KKworCS8qIEZJWE1FOiB2YWxp ZGF0ZSBldmVudCBtYXNrICovCisJZXZlbnQtPmV2ZW50cyA9IGV2ZW50czsKKworCWlmIChl dmVudHMgPT0gV0xfTEFUQ0hfU0VUKQorCXsKKwkJaWYgKGxhdGNoICYmIGxhdGNoLT5vd25l cl9waWQgIT0gTXlQcm9jUGlkKQorCQkJZWxvZyhFUlJPUiwgImNhbm5vdCB3YWl0IG9uIGEg bGF0Y2ggb3duZWQgYnkgYW5vdGhlciBwcm9jZXNzIik7CisJCXNldC0+bGF0Y2ggPSBsYXRj aDsKKworCQkvKgorCQkgKiBPbiBVbml4LCB3ZSBkb24ndCBuZWVkIHRvIG1vZGlmeSB0aGUg a2VybmVsIG9iamVjdCBiZWNhdXNlIHRoZQorCQkgKiB1bmRlcmx5aW5nIHBpcGUgKGlmIHRo ZXJlIGlzIG9uZSkgaXMgdGhlIHNhbWUgZm9yIGFsbCBsYXRjaGVzIHNvIHdlCisJCSAqIGNh biByZXR1cm4gaW1tZWRpYXRlbHkuICBPbiBXaW5kb3dzLCB3ZSBuZWVkIHRvIHVwZGF0ZSBv dXIgYXJyYXkgb2YKKwkJICogaGFuZGxlcywgYnV0IHdlIGxlYXZlIHRoZSBvbGQgb25lIGlu IHBsYWNlIGFuZCB0b2xlcmF0ZSBzcHVyaW91cworCQkgKiB3YWtldXBzIGlmIHRoZSBsYXRj aCBpcyBkaXNhYmxlZC4KKwkJICovCisjaWYgZGVmaW5lZChXQUlUX1VTRV9XSU4zMikKKwkJ aWYgKCFsYXRjaCkKKwkJCXJldHVybjsKKyNlbHNlCisJCXJldHVybjsKKyNlbmRpZgorCX0K KworI2lmIGRlZmluZWQoV0FJVF9VU0VfRVBPTEwpCisJV2FpdEV2ZW50QWRqdXN0RXBvbGwo c2V0LCBldmVudCwgRVBPTExfQ1RMX01PRCk7CisjZWxpZiBkZWZpbmVkKFdBSVRfVVNFX0tR VUVVRSkKKwlXYWl0RXZlbnRBZGp1c3RLcXVldWUoc2V0LCBldmVudCwgb2xkX2V2ZW50cyk7 CisjZWxpZiBkZWZpbmVkKFdBSVRfVVNFX1BPTEwpCisJV2FpdEV2ZW50QWRqdXN0UG9sbChz ZXQsIGV2ZW50KTsKKyNlbGlmIGRlZmluZWQoV0FJVF9VU0VfV0lOMzIpCisJV2FpdEV2ZW50 QWRqdXN0V2luMzIoc2V0LCBldmVudCk7CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQoV0FJ VF9VU0VfRVBPTEwpCisvKgorICogYWN0aW9uIGNhbiBiZSBvbmUgb2YgRVBPTExfQ1RMX0FE RCB8IEVQT0xMX0NUTF9NT0QgfCBFUE9MTF9DVExfREVMCisgKi8KK3N0YXRpYyB2b2lkCitX YWl0RXZlbnRBZGp1c3RFcG9sbChXYWl0RXZlbnRTZXQgKnNldCwgV2FpdEV2ZW50ICpldmVu dCwgaW50IGFjdGlvbikKK3sKKwlzdHJ1Y3QgZXBvbGxfZXZlbnQgZXBvbGxfZXY7CisJaW50 CQkJcmM7CisKKwkvKiBwb2ludGVyIHRvIG91ciBldmVudCwgcmV0dXJuZWQgYnkgZXBvbGxf d2FpdCAqLworCWVwb2xsX2V2LmRhdGEucHRyID0gZXZlbnQ7CisJLyogYWx3YXlzIHdhaXQg Zm9yIGVycm9ycyAqLworCWVwb2xsX2V2LmV2ZW50cyA9IEVQT0xMRVJSIHwgRVBPTExIVVA7 CisKKwkvKiBwcmVwYXJlIHBvbGxmZCBlbnRyeSBvbmNlICovCisJaWYgKGV2ZW50LT5ldmVu dHMgPT0gV0xfTEFUQ0hfU0VUKQorCXsKKwkJQXNzZXJ0KHNldC0+bGF0Y2ggIT0gTlVMTCk7 CisJCWVwb2xsX2V2LmV2ZW50cyB8PSBFUE9MTElOOworCX0KKwllbHNlIGlmIChldmVudC0+ ZXZlbnRzID09IFdMX1BPU1RNQVNURVJfREVBVEgpCisJeworCQllcG9sbF9ldi5ldmVudHMg fD0gRVBPTExJTjsKKwl9CisJZWxzZQorCXsKKwkJQXNzZXJ0KGV2ZW50LT5mZCAhPSBQR0lO VkFMSURfU09DS0VUKTsKKwkJQXNzZXJ0KGV2ZW50LT5ldmVudHMgJiAoV0xfU09DS0VUX1JF QURBQkxFIHwKKwkJCQkJCQkJV0xfU09DS0VUX1dSSVRFQUJMRSB8CisJCQkJCQkJCVdMX1NP Q0tFVF9DTE9TRUQpKTsKKworCQlpZiAoZXZlbnQtPmV2ZW50cyAmIFdMX1NPQ0tFVF9SRUFE QUJMRSkKKwkJCWVwb2xsX2V2LmV2ZW50cyB8PSBFUE9MTElOOworCQlpZiAoZXZlbnQtPmV2 ZW50cyAmIFdMX1NPQ0tFVF9XUklURUFCTEUpCisJCQllcG9sbF9ldi5ldmVudHMgfD0gRVBP TExPVVQ7CisJCWlmIChldmVudC0+ZXZlbnRzICYgV0xfU09DS0VUX0NMT1NFRCkKKwkJCWVw b2xsX2V2LmV2ZW50cyB8PSBFUE9MTFJESFVQOworCX0KKworCS8qCisJICogRXZlbiB0aG91 Z2ggdW51c2VkLCB3ZSBhbHNvIHBhc3MgZXBvbGxfZXYgYXMgdGhlIGRhdGEgYXJndW1lbnQg aWYKKwkgKiBFUE9MTF9DVExfREVMIGlzIHBhc3NlZCBhcyBhY3Rpb24uICBUaGVyZSB1c2Vk IHRvIGJlIGFuIGVwb2xsIGJ1ZworCSAqIHJlcXVpcmluZyB0aGF0LCBhbmQgYWN0dWFsbHkg aXQgbWFrZXMgdGhlIGNvZGUgc2ltcGxlci4uLgorCSAqLworCXJjID0gZXBvbGxfY3RsKHNl dC0+ZXBvbGxfZmQsIGFjdGlvbiwgZXZlbnQtPmZkLCAmZXBvbGxfZXYpOworCisJaWYgKHJj IDwgMCkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZV9mb3Jfc29ja2V0X2FjY2Vz cygpLAorCQkJCSBlcnJtc2coIiVzKCkgZmFpbGVkOiAlbSIsCisJCQkJCQkiZXBvbGxfY3Rs IikpKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChXQUlUX1VTRV9QT0xMKQorc3RhdGlj IHZvaWQKK1dhaXRFdmVudEFkanVzdFBvbGwoV2FpdEV2ZW50U2V0ICpzZXQsIFdhaXRFdmVu dCAqZXZlbnQpCit7CisJc3RydWN0IHBvbGxmZCAqcG9sbGZkID0gJnNldC0+cG9sbGZkc1tl dmVudC0+cG9zXTsKKworCXBvbGxmZC0+cmV2ZW50cyA9IDA7CisJcG9sbGZkLT5mZCA9IGV2 ZW50LT5mZDsKKworCS8qIHByZXBhcmUgcG9sbGZkIGVudHJ5IG9uY2UgKi8KKwlpZiAoZXZl bnQtPmV2ZW50cyA9PSBXTF9MQVRDSF9TRVQpCisJeworCQlBc3NlcnQoc2V0LT5sYXRjaCAh PSBOVUxMKTsKKwkJcG9sbGZkLT5ldmVudHMgPSBQT0xMSU47CisJfQorCWVsc2UgaWYgKGV2 ZW50LT5ldmVudHMgPT0gV0xfUE9TVE1BU1RFUl9ERUFUSCkKKwl7CisJCXBvbGxmZC0+ZXZl bnRzID0gUE9MTElOOworCX0KKwllbHNlCisJeworCQlBc3NlcnQoZXZlbnQtPmV2ZW50cyAm IChXTF9TT0NLRVRfUkVBREFCTEUgfAorCQkJCQkJCQlXTF9TT0NLRVRfV1JJVEVBQkxFIHwK KwkJCQkJCQkJV0xfU09DS0VUX0NMT1NFRCkpOworCQlwb2xsZmQtPmV2ZW50cyA9IDA7CisJ CWlmIChldmVudC0+ZXZlbnRzICYgV0xfU09DS0VUX1JFQURBQkxFKQorCQkJcG9sbGZkLT5l dmVudHMgfD0gUE9MTElOOworCQlpZiAoZXZlbnQtPmV2ZW50cyAmIFdMX1NPQ0tFVF9XUklU RUFCTEUpCisJCQlwb2xsZmQtPmV2ZW50cyB8PSBQT0xMT1VUOworI2lmZGVmIFBPTExSREhV UAorCQlpZiAoZXZlbnQtPmV2ZW50cyAmIFdMX1NPQ0tFVF9DTE9TRUQpCisJCQlwb2xsZmQt PmV2ZW50cyB8PSBQT0xMUkRIVVA7CisjZW5kaWYKKwl9CisKKwlBc3NlcnQoZXZlbnQtPmZk ICE9IFBHSU5WQUxJRF9TT0NLRVQpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdBSVRf VVNFX0tRVUVVRSkKKworLyoKKyAqIE9uIG1vc3QgQlNEIGZhbWlseSBzeXN0ZW1zLCB0aGUg dWRhdGEgbWVtYmVyIG9mIHN0cnVjdCBrZXZlbnQgaXMgb2YgdHlwZQorICogdm9pZCAqLCBz byB3ZSBjb3VsZCBkaXJlY3RseSBjb252ZXJ0IHRvL2Zyb20gV2FpdEV2ZW50ICouICBVbmZv cnR1bmF0ZWx5LAorICogTmV0QlNEIGhhcyBpdCBhcyBpbnRwdHJfdCwgc28gaGVyZSB3ZSB3 YWxscGFwZXIgb3ZlciB0aGF0IGRpZmZlcmVuY2Ugd2l0aAorICogYW4gbHZhbHVlIGNhc3Qu CisgKi8KKyNkZWZpbmUgQWNjZXNzV2FpdEV2ZW50KGtfZXYpICgqKChXYWl0RXZlbnQgKiop KCYoa19ldiktPnVkYXRhKSkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorV2FpdEV2ZW50QWRq dXN0S3F1ZXVlQWRkKHN0cnVjdCBrZXZlbnQgKmtfZXYsIGludCBmaWx0ZXIsIGludCBhY3Rp b24sCisJCQkJCQkgV2FpdEV2ZW50ICpldmVudCkKK3sKKwlrX2V2LT5pZGVudCA9IGV2ZW50 LT5mZDsKKwlrX2V2LT5maWx0ZXIgPSBmaWx0ZXI7CisJa19ldi0+ZmxhZ3MgPSBhY3Rpb247 CisJa19ldi0+ZmZsYWdzID0gMDsKKwlrX2V2LT5kYXRhID0gMDsKKwlBY2Nlc3NXYWl0RXZl bnQoa19ldikgPSBldmVudDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitXYWl0RXZlbnRB ZGp1c3RLcXVldWVBZGRQb3N0bWFzdGVyKHN0cnVjdCBrZXZlbnQgKmtfZXYsIFdhaXRFdmVu dCAqZXZlbnQpCit7CisJLyogRm9yIG5vdyBwb3N0bWFzdGVyIGRlYXRoIGNhbiBvbmx5IGJl IGFkZGVkLCBub3QgcmVtb3ZlZC4gKi8KKwlrX2V2LT5pZGVudCA9IFBvc3RtYXN0ZXJQaWQ7 CisJa19ldi0+ZmlsdGVyID0gRVZGSUxUX1BST0M7CisJa19ldi0+ZmxhZ3MgPSBFVl9BREQ7 CisJa19ldi0+ZmZsYWdzID0gTk9URV9FWElUOworCWtfZXYtPmRhdGEgPSAwOworCUFjY2Vz c1dhaXRFdmVudChrX2V2KSA9IGV2ZW50OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK1dh aXRFdmVudEFkanVzdEtxdWV1ZUFkZExhdGNoKHN0cnVjdCBrZXZlbnQgKmtfZXYsIFdhaXRF dmVudCAqZXZlbnQpCit7CisJLyogRm9yIG5vdyBsYXRjaCBjYW4gb25seSBiZSBhZGRlZCwg bm90IHJlbW92ZWQuICovCisJa19ldi0+aWRlbnQgPSBTSUdVUkc7CisJa19ldi0+ZmlsdGVy ID0gRVZGSUxUX1NJR05BTDsKKwlrX2V2LT5mbGFncyA9IEVWX0FERDsKKwlrX2V2LT5mZmxh Z3MgPSAwOworCWtfZXYtPmRhdGEgPSAwOworCUFjY2Vzc1dhaXRFdmVudChrX2V2KSA9IGV2 ZW50OworfQorCisvKgorICogb2xkX2V2ZW50cyBpcyB0aGUgcHJldmlvdXMgZXZlbnQgbWFz aywgdXNlZCB0byBjb21wdXRlIHdoYXQgaGFzIGNoYW5nZWQuCisgKi8KK3N0YXRpYyB2b2lk CitXYWl0RXZlbnRBZGp1c3RLcXVldWUoV2FpdEV2ZW50U2V0ICpzZXQsIFdhaXRFdmVudCAq ZXZlbnQsIGludCBvbGRfZXZlbnRzKQoreworCWludAkJCXJjOworCXN0cnVjdCBrZXZlbnQg a19ldlsyXTsKKwlpbnQJCQljb3VudCA9IDA7CisJYm9vbAkJbmV3X2ZpbHRfcmVhZCA9IGZh bHNlOworCWJvb2wJCW9sZF9maWx0X3JlYWQgPSBmYWxzZTsKKwlib29sCQluZXdfZmlsdF93 cml0ZSA9IGZhbHNlOworCWJvb2wJCW9sZF9maWx0X3dyaXRlID0gZmFsc2U7CisKKwlpZiAo b2xkX2V2ZW50cyA9PSBldmVudC0+ZXZlbnRzKQorCQlyZXR1cm47CisKKwlBc3NlcnQoZXZl bnQtPmV2ZW50cyAhPSBXTF9MQVRDSF9TRVQgfHwgc2V0LT5sYXRjaCAhPSBOVUxMKTsKKwlB c3NlcnQoZXZlbnQtPmV2ZW50cyA9PSBXTF9MQVRDSF9TRVQgfHwKKwkJICAgZXZlbnQtPmV2 ZW50cyA9PSBXTF9QT1NUTUFTVEVSX0RFQVRIIHx8CisJCSAgIChldmVudC0+ZXZlbnRzICYg KFdMX1NPQ0tFVF9SRUFEQUJMRSB8CisJCQkJCQkJIFdMX1NPQ0tFVF9XUklURUFCTEUgfAor CQkJCQkJCSBXTF9TT0NLRVRfQ0xPU0VEKSkpOworCisJaWYgKGV2ZW50LT5ldmVudHMgPT0g V0xfUE9TVE1BU1RFUl9ERUFUSCkKKwl7CisJCS8qCisJCSAqIFVubGlrZSBhbGwgdGhlIG90 aGVyIGltcGxlbWVudGF0aW9ucywgd2UgZGV0ZWN0IHBvc3RtYXN0ZXIgZGVhdGgKKwkJICog dXNpbmcgcHJvY2VzcyBub3RpZmljYXRpb24gaW5zdGVhZCBvZiB3YWl0aW5nIG9uIHRoZSBw b3N0bWFzdGVyCisJCSAqIGFsaXZlIHBpcGUuCisJCSAqLworCQlXYWl0RXZlbnRBZGp1c3RL cXVldWVBZGRQb3N0bWFzdGVyKCZrX2V2W2NvdW50KytdLCBldmVudCk7CisJfQorCWVsc2Ug aWYgKGV2ZW50LT5ldmVudHMgPT0gV0xfTEFUQ0hfU0VUKQorCXsKKwkJLyogV2UgZGV0ZWN0 IGxhdGNoIHdha2V1cCB1c2luZyBhIHNpZ25hbCBldmVudC4gKi8KKwkJV2FpdEV2ZW50QWRq dXN0S3F1ZXVlQWRkTGF0Y2goJmtfZXZbY291bnQrK10sIGV2ZW50KTsKKwl9CisJZWxzZQor CXsKKwkJLyoKKwkJICogV2UgbmVlZCB0byBjb21wdXRlIHRoZSBhZGRzIGFuZCBkZWxldGVz IHJlcXVpcmVkIHRvIGdldCBmcm9tIHRoZQorCQkgKiBvbGQgZXZlbnQgbWFzayB0byB0aGUg bmV3IGV2ZW50IG1hc2ssIHNpbmNlIGtldmVudCB0cmVhdHMgcmVhZGFibGUKKwkJICogYW5k IHdyaXRhYmxlIGFzIHNlcGFyYXRlIGV2ZW50cy4KKwkJICovCisJCWlmIChvbGRfZXZlbnRz ICYgKFdMX1NPQ0tFVF9SRUFEQUJMRSB8IFdMX1NPQ0tFVF9DTE9TRUQpKQorCQkJb2xkX2Zp bHRfcmVhZCA9IHRydWU7CisJCWlmIChldmVudC0+ZXZlbnRzICYgKFdMX1NPQ0tFVF9SRUFE QUJMRSB8IFdMX1NPQ0tFVF9DTE9TRUQpKQorCQkJbmV3X2ZpbHRfcmVhZCA9IHRydWU7CisJ CWlmIChvbGRfZXZlbnRzICYgV0xfU09DS0VUX1dSSVRFQUJMRSkKKwkJCW9sZF9maWx0X3dy aXRlID0gdHJ1ZTsKKwkJaWYgKGV2ZW50LT5ldmVudHMgJiBXTF9TT0NLRVRfV1JJVEVBQkxF KQorCQkJbmV3X2ZpbHRfd3JpdGUgPSB0cnVlOworCQlpZiAob2xkX2ZpbHRfcmVhZCAmJiAh bmV3X2ZpbHRfcmVhZCkKKwkJCVdhaXRFdmVudEFkanVzdEtxdWV1ZUFkZCgma19ldltjb3Vu dCsrXSwgRVZGSUxUX1JFQUQsIEVWX0RFTEVURSwKKwkJCQkJCQkJCSBldmVudCk7CisJCWVs c2UgaWYgKCFvbGRfZmlsdF9yZWFkICYmIG5ld19maWx0X3JlYWQpCisJCQlXYWl0RXZlbnRB ZGp1c3RLcXVldWVBZGQoJmtfZXZbY291bnQrK10sIEVWRklMVF9SRUFELCBFVl9BREQsCisJ CQkJCQkJCQkgZXZlbnQpOworCQlpZiAob2xkX2ZpbHRfd3JpdGUgJiYgIW5ld19maWx0X3dy aXRlKQorCQkJV2FpdEV2ZW50QWRqdXN0S3F1ZXVlQWRkKCZrX2V2W2NvdW50KytdLCBFVkZJ TFRfV1JJVEUsIEVWX0RFTEVURSwKKwkJCQkJCQkJCSBldmVudCk7CisJCWVsc2UgaWYgKCFv bGRfZmlsdF93cml0ZSAmJiBuZXdfZmlsdF93cml0ZSkKKwkJCVdhaXRFdmVudEFkanVzdEtx dWV1ZUFkZCgma19ldltjb3VudCsrXSwgRVZGSUxUX1dSSVRFLCBFVl9BREQsCisJCQkJCQkJ CQkgZXZlbnQpOworCX0KKworCS8qIEZvciBXTF9TT0NLRVRfUkVBRCAtPiBXTF9TT0NLRVRf Q0xPU0VELCBubyBjaGFuZ2UgbmVlZGVkLiAqLworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1 cm47CisKKwlBc3NlcnQoY291bnQgPD0gMik7CisKKwlyYyA9IGtldmVudChzZXQtPmtxdWV1 ZV9mZCwgJmtfZXZbMF0sIGNvdW50LCBOVUxMLCAwLCBOVUxMKTsKKworCS8qCisJICogV2hl biBhZGRpbmcgdGhlIHBvc3RtYXN0ZXIncyBwaWQsIHdlIGhhdmUgdG8gY29uc2lkZXIgdGhh dCBpdCBtaWdodAorCSAqIGFscmVhZHkgaGF2ZSBleGl0ZWQgYW5kIHBlcmhhcHMgZXZlbiBi ZWVuIHJlcGxhY2VkIGJ5IGFub3RoZXIgcHJvY2VzcworCSAqIHdpdGggdGhlIHNhbWUgcGlk LiAgSWYgc28sIHdlIGhhdmUgdG8gZGVmZXIgcmVwb3J0aW5nIHRoaXMgYXMgYW4gZXZlbnQK KwkgKiB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIFdhaXRFdmVudFNldFdhaXRCbG9jaygpLgor CSAqLworCisJaWYgKHJjIDwgMCkKKwl7CisJCWlmIChldmVudC0+ZXZlbnRzID09IFdMX1BP U1RNQVNURVJfREVBVEggJiYKKwkJCShlcnJubyA9PSBFU1JDSCB8fCBlcnJubyA9PSBFQUND RVMpKQorCQkJc2V0LT5yZXBvcnRfcG9zdG1hc3Rlcl9ub3RfcnVubmluZyA9IHRydWU7CisJ CWVsc2UKKwkJCWVyZXBvcnQoRVJST1IsCisJCQkJCShlcnJjb2RlX2Zvcl9zb2NrZXRfYWNj ZXNzKCksCisJCQkJCSBlcnJtc2coIiVzKCkgZmFpbGVkOiAlbSIsCisJCQkJCQkJImtldmVu dCIpKSk7CisJfQorCWVsc2UgaWYgKGV2ZW50LT5ldmVudHMgPT0gV0xfUE9TVE1BU1RFUl9E RUFUSCAmJgorCQkJIFBvc3RtYXN0ZXJQaWQgIT0gZ2V0cHBpZCgpICYmCisJCQkgIVBvc3Rt YXN0ZXJJc0FsaXZlKCkpCisJeworCQkvKgorCQkgKiBUaGUgZXh0cmEgUG9zdG1hc3Rlcklz QWxpdmVJbnRlcm5hbCgpIGNoZWNrIHByZXZlbnRzIGZhbHNlIGFsYXJtcworCQkgKiBvbiBz eXN0ZW1zIHRoYXQgZ2l2ZSBhIGRpZmZlcmVudCB2YWx1ZSBmb3IgZ2V0cHBpZCgpIHdoaWxl IGJlaW5nCisJCSAqIHRyYWNlZCBieSBhIGRlYnVnZ2VyLgorCQkgKi8KKwkJc2V0LT5yZXBv cnRfcG9zdG1hc3Rlcl9ub3RfcnVubmluZyA9IHRydWU7CisJfQorfQorCisjZW5kaWYKKwor I2lmIGRlZmluZWQoV0FJVF9VU0VfV0lOMzIpCitzdGF0aWMgdm9pZAorV2FpdEV2ZW50QWRq dXN0V2luMzIoV2FpdEV2ZW50U2V0ICpzZXQsIFdhaXRFdmVudCAqZXZlbnQpCit7CisJSEFO RExFCSAgICpoYW5kbGUgPSAmc2V0LT5oYW5kbGVzW2V2ZW50LT5wb3MgKyAxXTsKKworCWlm IChldmVudC0+ZXZlbnRzID09IFdMX0xBVENIX1NFVCkKKwl7CisJCUFzc2VydChzZXQtPmxh dGNoICE9IE5VTEwpOworCQkqaGFuZGxlID0gc2V0LT5sYXRjaC0+ZXZlbnQ7CisJfQorCWVs c2UgaWYgKGV2ZW50LT5ldmVudHMgPT0gV0xfUE9TVE1BU1RFUl9ERUFUSCkKKwl7CisJCSpo YW5kbGUgPSBQb3N0bWFzdGVySGFuZGxlOworCX0KKwllbHNlCisJeworCQlpbnQJCQlmbGFn cyA9IEZEX0NMT1NFOwkvKiBhbHdheXMgY2hlY2sgZm9yIGVycm9ycy9FT0YgKi8KKworCQlp ZiAoZXZlbnQtPmV2ZW50cyAmIFdMX1NPQ0tFVF9SRUFEQUJMRSkKKwkJCWZsYWdzIHw9IEZE X1JFQUQ7CisJCWlmIChldmVudC0+ZXZlbnRzICYgV0xfU09DS0VUX1dSSVRFQUJMRSkKKwkJ CWZsYWdzIHw9IEZEX1dSSVRFOworCQlpZiAoZXZlbnQtPmV2ZW50cyAmIFdMX1NPQ0tFVF9D T05ORUNURUQpCisJCQlmbGFncyB8PSBGRF9DT05ORUNUOworCQlpZiAoZXZlbnQtPmV2ZW50 cyAmIFdMX1NPQ0tFVF9BQ0NFUFQpCisJCQlmbGFncyB8PSBGRF9BQ0NFUFQ7CisKKwkJaWYg KCpoYW5kbGUgPT0gV1NBX0lOVkFMSURfRVZFTlQpCisJCXsKKwkJCSpoYW5kbGUgPSBXU0FD cmVhdGVFdmVudCgpOworCQkJaWYgKCpoYW5kbGUgPT0gV1NBX0lOVkFMSURfRVZFTlQpCisJ CQkJZWxvZyhFUlJPUiwgImZhaWxlZCB0byBjcmVhdGUgZXZlbnQgZm9yIHNvY2tldDogZXJy b3IgY29kZSAlZCIsCisJCQkJCSBXU0FHZXRMYXN0RXJyb3IoKSk7CisJCX0KKwkJaWYgKFdT QUV2ZW50U2VsZWN0KGV2ZW50LT5mZCwgKmhhbmRsZSwgZmxhZ3MpICE9IDApCisJCQllbG9n KEVSUk9SLCAiZmFpbGVkIHRvIHNldCB1cCBldmVudCBmb3Igc29ja2V0OiBlcnJvciBjb2Rl ICVkIiwKKwkJCQkgV1NBR2V0TGFzdEVycm9yKCkpOworCisJCUFzc2VydChldmVudC0+ZmQg IT0gUEdJTlZBTElEX1NPQ0tFVCk7CisJfQorfQorI2VuZGlmCisKKy8qCisgKiBXYWl0IGZv ciBldmVudHMgYWRkZWQgdG8gdGhlIHNldCB0byBoYXBwZW4sIG9yIHVudGlsIHRoZSB0aW1l b3V0IGlzCisgKiByZWFjaGVkLiAgQXQgbW9zdCBuZXZlbnRzIG9jY3VycmVkIGV2ZW50cyBh cmUgcmV0dXJuZWQuCisgKgorICogSWYgdGltZW91dCA9IC0xLCBibG9jayB1bnRpbCBhbiBl dmVudCBvY2N1cnM7IGlmIDAsIGNoZWNrIHNvY2tldHMgZm9yCisgKiByZWFkaW5lc3MsIGJ1 dCBkb24ndCBibG9jazsgaWYgPiAwLCBibG9jayBmb3IgYXQgbW9zdCB0aW1lb3V0IG1pbGxp c2Vjb25kcy4KKyAqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZXZlbnRzIG9jY3VycmVk LCBvciAwIGlmIHRoZSB0aW1lb3V0IHdhcyByZWFjaGVkLgorICoKKyAqIFJldHVybmVkIGV2 ZW50cyB3aWxsIGhhdmUgdGhlIGZkLCBwb3MsIHVzZXJfZGF0YSBmaWVsZHMgc2V0IHRvIHRo ZQorICogdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVnaXN0ZXJlZCBldmVudC4KKyAq LworaW50CitXYWl0RXZlbnRTZXRXYWl0KFdhaXRFdmVudFNldCAqc2V0LCBsb25nIHRpbWVv dXQsCisJCQkJIFdhaXRFdmVudCAqb2NjdXJyZWRfZXZlbnRzLCBpbnQgbmV2ZW50cywKKwkJ CQkgdWludDMyIHdhaXRfZXZlbnRfaW5mbykKK3sKKwlpbnQJCQlyZXR1cm5lZF9ldmVudHMg PSAwOworCWluc3RyX3RpbWUJc3RhcnRfdGltZTsKKwlpbnN0cl90aW1lCWN1cl90aW1lOwor CWxvbmcJCWN1cl90aW1lb3V0ID0gLTE7CisKKwlBc3NlcnQobmV2ZW50cyA+IDApOworCisJ LyoKKwkgKiBJbml0aWFsaXplIHRpbWVvdXQgaWYgcmVxdWVzdGVkLiAgV2UgbXVzdCByZWNv cmQgdGhlIGN1cnJlbnQgdGltZSBzbworCSAqIHRoYXQgd2UgY2FuIGRldGVybWluZSB0aGUg cmVtYWluaW5nIHRpbWVvdXQgaWYgaW50ZXJydXB0ZWQuCisJICovCisJaWYgKHRpbWVvdXQg Pj0gMCkKKwl7CisJCUlOU1RSX1RJTUVfU0VUX0NVUlJFTlQoc3RhcnRfdGltZSk7CisJCUFz c2VydCh0aW1lb3V0ID49IDAgJiYgdGltZW91dCA8PSBJTlRfTUFYKTsKKwkJY3VyX3RpbWVv dXQgPSB0aW1lb3V0OworCX0KKwllbHNlCisJCUlOU1RSX1RJTUVfU0VUX1pFUk8oc3RhcnRf dGltZSk7CisKKwlwZ3N0YXRfcmVwb3J0X3dhaXRfc3RhcnQod2FpdF9ldmVudF9pbmZvKTsK KworI2lmbmRlZiBXSU4zMgorCXdhaXRpbmcgPSB0cnVlOworI2Vsc2UKKwkvKiBFbnN1cmUg dGhhdCBzaWduYWxzIGFyZSBzZXJ2aWNlZCBldmVuIGlmIGxhdGNoIGlzIGFscmVhZHkgc2V0 ICovCisJcGd3aW4zMl9kaXNwYXRjaF9xdWV1ZWRfc2lnbmFscygpOworI2VuZGlmCisJd2hp bGUgKHJldHVybmVkX2V2ZW50cyA9PSAwKQorCXsKKwkJaW50CQkJcmM7CisKKwkJLyoKKwkJ ICogQ2hlY2sgaWYgdGhlIGxhdGNoIGlzIHNldCBhbHJlYWR5IGZpcnN0LiAgSWYgc28sIHdl IGVpdGhlciBleGl0CisJCSAqIGltbWVkaWF0ZWx5IG9yIGFzayB0aGUga2VybmVsIGZvciBm dXJ0aGVyIGV2ZW50cyBhdmFpbGFibGUgcmlnaHQKKwkJICogbm93IHdpdGhvdXQgd2FpdGlu ZywgZGVwZW5kaW5nIG9uIGhvdyBtYW55IGV2ZW50cyB0aGUgY2FsbGVyIHdhbnRzLgorCQkg KgorCQkgKiBJZiBzb21lb25lIHNldHMgdGhlIGxhdGNoIGJldHdlZW4gdGhpcyBhbmQgdGhl CisJCSAqIFdhaXRFdmVudFNldFdhaXRCbG9jaygpIGJlbG93LCB0aGUgc2V0dGVyIHdpbGwg d3JpdGUgYSBieXRlIHRvIHRoZQorCQkgKiBwaXBlIChvciBzaWduYWwgdXMgYW5kIHRoZSBz aWduYWwgaGFuZGxlciB3aWxsIGRvIHRoYXQpLCBhbmQgdGhlCisJCSAqIHJlYWRpbmVzcyBy b3V0aW5lIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LgorCQkgKgorCQkgKiBPbiB1bml4LCBJ ZiB0aGVyZSdzIGEgcGVuZGluZyBieXRlIGluIHRoZSBzZWxmIHBpcGUsIHdlJ2xsIG5vdGlj ZQorCQkgKiB3aGVuZXZlciBibG9ja2luZy4gT25seSBjbGVhcmluZyB0aGUgcGlwZSBpbiB0 aGF0IGNhc2UgYXZvaWRzCisJCSAqIGhhdmluZyB0byBkcmFpbiBpdCBldmVyeSB0aW1lIFdh aXRMYXRjaE9yU29ja2V0KCkgaXMgdXNlZC4gU2hvdWxkCisJCSAqIHRoZSBwaXBlLWJ1ZmZl ciBmaWxsIHVwIHdlJ3JlIHN0aWxsIG9rLCBiZWNhdXNlIHRoZSBwaXBlIGlzIGluCisJCSAq IG5vbmJsb2NraW5nIG1vZGUuIEl0J3MgdW5saWtlbHkgZm9yIHRoYXQgdG8gaGFwcGVuLCBi ZWNhdXNlIHRoZQorCQkgKiBzZWxmIHBpcGUgaXNuJ3QgZmlsbGVkIHVubGVzcyB3ZSdyZSBi bG9ja2luZyAod2FpdGluZyA9IHRydWUpLCBvcgorCQkgKiBmcm9tIGluc2lkZSBhIHNpZ25h bCBoYW5kbGVyIGluIGxhdGNoX3NpZ3VyZ19oYW5kbGVyKCkuCisJCSAqCisJCSAqIE9uIHdp bmRvd3MsIHdlJ2xsIGFsc28gbm90aWNlIGlmIHRoZXJlJ3MgYSBwZW5kaW5nIGV2ZW50IGZv ciB0aGUKKwkJICogbGF0Y2ggd2hlbiBibG9ja2luZywgYnV0IHRoZXJlJ3Mgbm8gZGFuZ2Vy IG9mIGFueXRoaW5nIGZpbGxpbmcgdXAsCisJCSAqIGFzICJTZXR0aW5nIGFuIGV2ZW50IHRo YXQgaXMgYWxyZWFkeSBzZXQgaGFzIG5vIGVmZmVjdC4iLgorCQkgKgorCQkgKiBOb3RlOiB3 ZSBhc3N1bWUgdGhhdCB0aGUga2VybmVsIGNhbGxzIGludm9sdmVkIGluIGxhdGNoIG1hbmFn ZW1lbnQKKwkJICogd2lsbCBwcm92aWRlIGFkZXF1YXRlIHN5bmNocm9uaXphdGlvbiBvbiBt YWNoaW5lcyB3aXRoIHdlYWsgbWVtb3J5CisJCSAqIG9yZGVyaW5nLCBzbyB0aGF0IHdlIGNh bm5vdCBtaXNzIHNlZWluZyBpc19zZXQgaWYgYSBub3RpZmljYXRpb24KKwkJICogaGFzIGFs cmVhZHkgYmVlbiBxdWV1ZWQuCisJCSAqLworCQlpZiAoc2V0LT5sYXRjaCAmJiAhc2V0LT5s YXRjaC0+aXNfc2V0KQorCQl7CisJCQkvKiBhYm91dCB0byBzbGVlcCBvbiBhIGxhdGNoICov CisJCQlzZXQtPmxhdGNoLT5tYXliZV9zbGVlcGluZyA9IHRydWU7CisJCQlwZ19tZW1vcnlf YmFycmllcigpOworCQkJLyogYW5kIHJlY2hlY2sgKi8KKwkJfQorCisJCWlmIChzZXQtPmxh dGNoICYmIHNldC0+bGF0Y2gtPmlzX3NldCkKKwkJeworCQkJb2NjdXJyZWRfZXZlbnRzLT5m ZCA9IFBHSU5WQUxJRF9TT0NLRVQ7CisJCQlvY2N1cnJlZF9ldmVudHMtPnBvcyA9IHNldC0+ bGF0Y2hfcG9zOworCQkJb2NjdXJyZWRfZXZlbnRzLT51c2VyX2RhdGEgPQorCQkJCXNldC0+ ZXZlbnRzW3NldC0+bGF0Y2hfcG9zXS51c2VyX2RhdGE7CisJCQlvY2N1cnJlZF9ldmVudHMt PmV2ZW50cyA9IFdMX0xBVENIX1NFVDsKKwkJCW9jY3VycmVkX2V2ZW50cysrOworCQkJcmV0 dXJuZWRfZXZlbnRzKys7CisKKwkJCS8qIGNvdWxkIGhhdmUgYmVlbiBzZXQgYWJvdmUgKi8K KwkJCXNldC0+bGF0Y2gtPm1heWJlX3NsZWVwaW5nID0gZmFsc2U7CisKKwkJCWlmIChyZXR1 cm5lZF9ldmVudHMgPT0gbmV2ZW50cykKKwkJCQlicmVhazsJCQkvKiBvdXRwdXQgYnVmZmVy IGZ1bGwgYWxyZWFkeSAqLworCisJCQkvKgorCQkJICogRXZlbiB0aG91Z2ggd2UgYWxyZWFk eSBoYXZlIGFuIGV2ZW50LCB3ZSdsbCBwb2xsIGp1c3Qgb25jZSB3aXRoCisJCQkgKiB6ZXJv IHRpbWVvdXQgdG8gc2VlIHdoYXQgbm9uLWxhdGNoIGV2ZW50cyB3ZSBjYW4gZml0IGludG8g dGhlCisJCQkgKiBvdXRwdXQgYnVmZmVyIGF0IHRoZSBzYW1lIHRpbWUuCisJCQkgKi8KKwkJ CWN1cl90aW1lb3V0ID0gMDsKKwkJCXRpbWVvdXQgPSAwOworCQl9CisKKwkJLyoKKwkJICog V2FpdCBmb3IgZXZlbnRzIHVzaW5nIHRoZSByZWFkaW5lc3MgcHJpbWl0aXZlIGNob3NlbiBh dCB0aGUgdG9wIG9mCisJCSAqIHRoaXMgZmlsZS4gSWYgLTEgaXMgcmV0dXJuZWQsIGEgdGlt ZW91dCBoYXMgb2NjdXJyZWQsIGlmIDAgd2UgaGF2ZQorCQkgKiB0byByZXRyeSwgZXZlcnl0 aGluZyA+PSAxIGlzIHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgZXZlbnRzLgorCQkgKi8KKwkJ cmMgPSBXYWl0RXZlbnRTZXRXYWl0QmxvY2soc2V0LCBjdXJfdGltZW91dCwKKwkJCQkJCQkJ ICAgb2NjdXJyZWRfZXZlbnRzLCBuZXZlbnRzIC0gcmV0dXJuZWRfZXZlbnRzKTsKKworCQlp ZiAoc2V0LT5sYXRjaCAmJgorCQkJc2V0LT5sYXRjaC0+bWF5YmVfc2xlZXBpbmcpCisJCQlz ZXQtPmxhdGNoLT5tYXliZV9zbGVlcGluZyA9IGZhbHNlOworCisJCWlmIChyYyA9PSAtMSkK KwkJCWJyZWFrOwkJCQkvKiB0aW1lb3V0IG9jY3VycmVkICovCisJCWVsc2UKKwkJCXJldHVy bmVkX2V2ZW50cyArPSByYzsKKworCQkvKiBJZiB3ZSdyZSBub3QgZG9uZSwgdXBkYXRlIGN1 cl90aW1lb3V0IGZvciBuZXh0IGl0ZXJhdGlvbiAqLworCQlpZiAocmV0dXJuZWRfZXZlbnRz ID09IDAgJiYgdGltZW91dCA+PSAwKQorCQl7CisJCQlJTlNUUl9USU1FX1NFVF9DVVJSRU5U KGN1cl90aW1lKTsKKwkJCUlOU1RSX1RJTUVfU1VCVFJBQ1QoY3VyX3RpbWUsIHN0YXJ0X3Rp bWUpOworCQkJY3VyX3RpbWVvdXQgPSB0aW1lb3V0IC0gKGxvbmcpIElOU1RSX1RJTUVfR0VU X01JTExJU0VDKGN1cl90aW1lKTsKKwkJCWlmIChjdXJfdGltZW91dCA8PSAwKQorCQkJCWJy ZWFrOworCQl9CisJfQorI2lmbmRlZiBXSU4zMgorCXdhaXRpbmcgPSBmYWxzZTsKKyNlbmRp ZgorCisJcGdzdGF0X3JlcG9ydF93YWl0X2VuZCgpOworCisJcmV0dXJuIHJldHVybmVkX2V2 ZW50czsKK30KKworCisjaWYgZGVmaW5lZChXQUlUX1VTRV9FUE9MTCkKKworLyoKKyAqIFdh aXQgdXNpbmcgbGludXgncyBlcG9sbF93YWl0KDIpLgorICoKKyAqIFRoaXMgaXMgdGhlIHBy ZWZlcmFibGUgd2FpdCBtZXRob2QsIGFzIHNldmVyYWwgcmVhZGluZXNzIG5vdGlmaWNhdGlv bnMgYXJlCisgKiBkZWxpdmVyZWQsIHdpdGhvdXQgaGF2aW5nIHRvIGl0ZXJhdGUgdGhyb3Vn aCBhbGwgb2Ygc2V0LT5ldmVudHMuIFRoZSByZXR1cm4KKyAqIGVwb2xsX2V2ZW50IHN0cnVj dCBjb250YWluIGEgcG9pbnRlciB0byBvdXIgZXZlbnRzLCBtYWtpbmcgYXNzb2NpYXRpb24K KyAqIGVhc3kuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitXYWl0RXZlbnRTZXRXYWl0Qmxv Y2soV2FpdEV2ZW50U2V0ICpzZXQsIGludCBjdXJfdGltZW91dCwKKwkJCQkJICBXYWl0RXZl bnQgKm9jY3VycmVkX2V2ZW50cywgaW50IG5ldmVudHMpCit7CisJaW50CQkJcmV0dXJuZWRf ZXZlbnRzID0gMDsKKwlpbnQJCQlyYzsKKwlXYWl0RXZlbnQgICpjdXJfZXZlbnQ7CisJc3Ry dWN0IGVwb2xsX2V2ZW50ICpjdXJfZXBvbGxfZXZlbnQ7CisKKwkvKiBTbGVlcCAqLworCXJj ID0gZXBvbGxfd2FpdChzZXQtPmVwb2xsX2ZkLCBzZXQtPmVwb2xsX3JldF9ldmVudHMsCisJ CQkJCU1pbihuZXZlbnRzLCBzZXQtPm5ldmVudHNfc3BhY2UpLCBjdXJfdGltZW91dCk7CisK KwkvKiBDaGVjayByZXR1cm4gY29kZSAqLworCWlmIChyYyA8IDApCisJeworCQkvKiBFSU5U UiBpcyBva2F5LCBvdGhlcndpc2UgY29tcGxhaW4gKi8KKwkJaWYgKGVycm5vICE9IEVJTlRS KQorCQl7CisJCQl3YWl0aW5nID0gZmFsc2U7CisJCQllcmVwb3J0KEVSUk9SLAorCQkJCQko ZXJyY29kZV9mb3Jfc29ja2V0X2FjY2VzcygpLAorCQkJCQkgZXJybXNnKCIlcygpIGZhaWxl ZDogJW0iLAorCQkJCQkJCSJlcG9sbF93YWl0IikpKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9 CisJZWxzZSBpZiAocmMgPT0gMCkKKwl7CisJCS8qIHRpbWVvdXQgZXhjZWVkZWQgKi8KKwkJ cmV0dXJuIC0xOworCX0KKworCS8qCisJICogQXQgbGVhc3Qgb25lIGV2ZW50IG9jY3VycmVk LCBpdGVyYXRlIG92ZXIgdGhlIHJldHVybmVkIGVwb2xsIGV2ZW50cworCSAqIHVudGlsIHRo ZXkncmUgZWl0aGVyIGFsbCBwcm9jZXNzZWQsIG9yIHdlJ3ZlIHJldHVybmVkIGFsbCB0aGUg ZXZlbnRzCisJICogdGhlIGNhbGxlciBkZXNpcmVkLgorCSAqLworCWZvciAoY3VyX2Vwb2xs X2V2ZW50ID0gc2V0LT5lcG9sbF9yZXRfZXZlbnRzOworCQkgY3VyX2Vwb2xsX2V2ZW50IDwg KHNldC0+ZXBvbGxfcmV0X2V2ZW50cyArIHJjKSAmJgorCQkgcmV0dXJuZWRfZXZlbnRzIDwg bmV2ZW50czsKKwkJIGN1cl9lcG9sbF9ldmVudCsrKQorCXsKKwkJLyogZXBvbGwncyBkYXRh IHBvaW50ZXIgaXMgc2V0IHRvIHRoZSBhc3NvY2lhdGVkIFdhaXRFdmVudCAqLworCQljdXJf ZXZlbnQgPSAoV2FpdEV2ZW50ICopIGN1cl9lcG9sbF9ldmVudC0+ZGF0YS5wdHI7CisKKwkJ b2NjdXJyZWRfZXZlbnRzLT5wb3MgPSBjdXJfZXZlbnQtPnBvczsKKwkJb2NjdXJyZWRfZXZl bnRzLT51c2VyX2RhdGEgPSBjdXJfZXZlbnQtPnVzZXJfZGF0YTsKKwkJb2NjdXJyZWRfZXZl bnRzLT5ldmVudHMgPSAwOworCisJCWlmIChjdXJfZXZlbnQtPmV2ZW50cyA9PSBXTF9MQVRD SF9TRVQgJiYKKwkJCWN1cl9lcG9sbF9ldmVudC0+ZXZlbnRzICYgKEVQT0xMSU4gfCBFUE9M TEVSUiB8IEVQT0xMSFVQKSkKKwkJeworCQkJLyogRHJhaW4gdGhlIHNpZ25hbGZkLiAqLwor CQkJZHJhaW4oKTsKKworCQkJaWYgKHNldC0+bGF0Y2ggJiYgc2V0LT5sYXRjaC0+bWF5YmVf c2xlZXBpbmcgJiYgc2V0LT5sYXRjaC0+aXNfc2V0KQorCQkJeworCQkJCW9jY3VycmVkX2V2 ZW50cy0+ZmQgPSBQR0lOVkFMSURfU09DS0VUOworCQkJCW9jY3VycmVkX2V2ZW50cy0+ZXZl bnRzID0gV0xfTEFUQ0hfU0VUOworCQkJCW9jY3VycmVkX2V2ZW50cysrOworCQkJCXJldHVy bmVkX2V2ZW50cysrOworCQkJfQorCQl9CisJCWVsc2UgaWYgKGN1cl9ldmVudC0+ZXZlbnRz ID09IFdMX1BPU1RNQVNURVJfREVBVEggJiYKKwkJCQkgY3VyX2Vwb2xsX2V2ZW50LT5ldmVu dHMgJiAoRVBPTExJTiB8IEVQT0xMRVJSIHwgRVBPTExIVVApKQorCQl7CisJCQkvKgorCQkJ ICogV2UgZXhwZWN0IGFuIEVQT0xMSFVQIHdoZW4gdGhlIHJlbW90ZSBlbmQgaXMgY2xvc2Vk LCBidXQKKwkJCSAqIGJlY2F1c2Ugd2UgZG9uJ3QgZXhwZWN0IHRoZSBwaXBlIHRvIGJlY29t ZSByZWFkYWJsZSBvciB0byBoYXZlCisJCQkgKiBhbnkgZXJyb3JzIGVpdGhlciwgdHJlYXQg dGhvc2UgY2FzZXMgYXMgcG9zdG1hc3RlciBkZWF0aCwgdG9vLgorCQkJICoKKwkJCSAqIEJl IHBhcmFub2lkIGFib3V0IGEgc3B1cmlvdXMgZXZlbnQgc2lnbmFsaW5nIHRoZSBwb3N0bWFz dGVyIGFzCisJCQkgKiBiZWluZyBkZWFkLiAgVGhlcmUgaGF2ZSBiZWVuIHJlcG9ydHMgYWJv dXQgdGhhdCBoYXBwZW5pbmcgd2l0aAorCQkJICogb2xkZXIgcHJpbWl0aXZlcyAoc2VsZWN0 KDIpIHRvIGJlIHNwZWNpZmljKSwgYW5kIGEgc3B1cmlvdXMKKwkJCSAqIFdMX1BPU1RNQVNU RVJfREVBVEggZXZlbnQgd291bGQgYmUgcGFpbmZ1bC4gUmUtY2hlY2tpbmcgZG9lc24ndAor CQkJICogY29zdCBtdWNoLgorCQkJICovCisJCQlpZiAoIVBvc3RtYXN0ZXJJc0FsaXZlSW50 ZXJuYWwoKSkKKwkJCXsKKwkJCQlpZiAoc2V0LT5leGl0X29uX3Bvc3RtYXN0ZXJfZGVhdGgp CisJCQkJCXByb2NfZXhpdCgxKTsKKwkJCQlvY2N1cnJlZF9ldmVudHMtPmZkID0gUEdJTlZB TElEX1NPQ0tFVDsKKwkJCQlvY2N1cnJlZF9ldmVudHMtPmV2ZW50cyA9IFdMX1BPU1RNQVNU RVJfREVBVEg7CisJCQkJb2NjdXJyZWRfZXZlbnRzKys7CisJCQkJcmV0dXJuZWRfZXZlbnRz Kys7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoY3VyX2V2ZW50LT5ldmVudHMgJiAoV0xfU09D S0VUX1JFQURBQkxFIHwKKwkJCQkJCQkJCSAgV0xfU09DS0VUX1dSSVRFQUJMRSB8CisJCQkJ CQkJCQkgIFdMX1NPQ0tFVF9DTE9TRUQpKQorCQl7CisJCQlBc3NlcnQoY3VyX2V2ZW50LT5m ZCAhPSBQR0lOVkFMSURfU09DS0VUKTsKKworCQkJaWYgKChjdXJfZXZlbnQtPmV2ZW50cyAm IFdMX1NPQ0tFVF9SRUFEQUJMRSkgJiYKKwkJCQkoY3VyX2Vwb2xsX2V2ZW50LT5ldmVudHMg JiAoRVBPTExJTiB8IEVQT0xMRVJSIHwgRVBPTExIVVApKSkKKwkJCXsKKwkJCQkvKiBkYXRh IGF2YWlsYWJsZSBpbiBzb2NrZXQsIG9yIEVPRiAqLworCQkJCW9jY3VycmVkX2V2ZW50cy0+ ZXZlbnRzIHw9IFdMX1NPQ0tFVF9SRUFEQUJMRTsKKwkJCX0KKworCQkJaWYgKChjdXJfZXZl bnQtPmV2ZW50cyAmIFdMX1NPQ0tFVF9XUklURUFCTEUpICYmCisJCQkJKGN1cl9lcG9sbF9l dmVudC0+ZXZlbnRzICYgKEVQT0xMT1VUIHwgRVBPTExFUlIgfCBFUE9MTEhVUCkpKQorCQkJ eworCQkJCS8qIHdyaXRhYmxlLCBvciBFT0YgKi8KKwkJCQlvY2N1cnJlZF9ldmVudHMtPmV2 ZW50cyB8PSBXTF9TT0NLRVRfV1JJVEVBQkxFOworCQkJfQorCisJCQlpZiAoKGN1cl9ldmVu dC0+ZXZlbnRzICYgV0xfU09DS0VUX0NMT1NFRCkgJiYKKwkJCQkoY3VyX2Vwb2xsX2V2ZW50 LT5ldmVudHMgJiAoRVBPTExSREhVUCB8IEVQT0xMRVJSIHwgRVBPTExIVVApKSkKKwkJCXsK KwkJCQkvKiByZW1vdGUgcGVlciBzaHV0IGRvd24sIG9yIGVycm9yICovCisJCQkJb2NjdXJy ZWRfZXZlbnRzLT5ldmVudHMgfD0gV0xfU09DS0VUX0NMT1NFRDsKKwkJCX0KKworCQkJaWYg KG9jY3VycmVkX2V2ZW50cy0+ZXZlbnRzICE9IDApCisJCQl7CisJCQkJb2NjdXJyZWRfZXZl bnRzLT5mZCA9IGN1cl9ldmVudC0+ZmQ7CisJCQkJb2NjdXJyZWRfZXZlbnRzKys7CisJCQkJ cmV0dXJuZWRfZXZlbnRzKys7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0dXJuZWRf ZXZlbnRzOworfQorCisjZWxpZiBkZWZpbmVkKFdBSVRfVVNFX0tRVUVVRSkKKworLyoKKyAq IFdhaXQgdXNpbmcga2V2ZW50KDIpIG9uIEJTRC1mYW1pbHkgc3lzdGVtcyBhbmQgbWFjT1Mu CisgKgorICogRm9yIG5vdyB0aGlzIG1pcnJvcnMgdGhlIGVwb2xsIGNvZGUsIGJ1dCBpbiBm dXR1cmUgaXQgY291bGQgbW9kaWZ5IHRoZSBmZAorICogc2V0IGluIHRoZSBzYW1lIGNhbGwg dG8ga2V2ZW50IGFzIGl0IHVzZXMgZm9yIHdhaXRpbmcgaW5zdGVhZCBvZiBkb2luZyB0aGF0 CisgKiB3aXRoIHNlcGFyYXRlIHN5c3RlbSBjYWxscy4KKyAqLworc3RhdGljIGludAorV2Fp dEV2ZW50U2V0V2FpdEJsb2NrKFdhaXRFdmVudFNldCAqc2V0LCBpbnQgY3VyX3RpbWVvdXQs CisJCQkJCSAgV2FpdEV2ZW50ICpvY2N1cnJlZF9ldmVudHMsIGludCBuZXZlbnRzKQorewor CWludAkJCXJldHVybmVkX2V2ZW50cyA9IDA7CisJaW50CQkJcmM7CisJV2FpdEV2ZW50ICAq Y3VyX2V2ZW50OworCXN0cnVjdCBrZXZlbnQgKmN1cl9rcXVldWVfZXZlbnQ7CisJc3RydWN0 IHRpbWVzcGVjIHRpbWVvdXQ7CisJc3RydWN0IHRpbWVzcGVjICp0aW1lb3V0X3A7CisKKwlp ZiAoY3VyX3RpbWVvdXQgPCAwKQorCQl0aW1lb3V0X3AgPSBOVUxMOworCWVsc2UKKwl7CisJ CXRpbWVvdXQudHZfc2VjID0gY3VyX3RpbWVvdXQgLyAxMDAwOworCQl0aW1lb3V0LnR2X25z ZWMgPSAoY3VyX3RpbWVvdXQgJSAxMDAwKSAqIDEwMDAwMDA7CisJCXRpbWVvdXRfcCA9ICZ0 aW1lb3V0OworCX0KKworCS8qCisJICogUmVwb3J0IHBvc3RtYXN0ZXIgZXZlbnRzIGRpc2Nv dmVyZWQgYnkgV2FpdEV2ZW50QWRqdXN0S3F1ZXVlKCkgb3IgYW4KKwkgKiBlYXJsaWVyIGNh bGwgdG8gV2FpdEV2ZW50U2V0V2FpdCgpLgorCSAqLworCWlmICh1bmxpa2VseShzZXQtPnJl cG9ydF9wb3N0bWFzdGVyX25vdF9ydW5uaW5nKSkKKwl7CisJCWlmIChzZXQtPmV4aXRfb25f cG9zdG1hc3Rlcl9kZWF0aCkKKwkJCXByb2NfZXhpdCgxKTsKKwkJb2NjdXJyZWRfZXZlbnRz LT5mZCA9IFBHSU5WQUxJRF9TT0NLRVQ7CisJCW9jY3VycmVkX2V2ZW50cy0+ZXZlbnRzID0g V0xfUE9TVE1BU1RFUl9ERUFUSDsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogU2xlZXAgKi8K KwlyYyA9IGtldmVudChzZXQtPmtxdWV1ZV9mZCwgTlVMTCwgMCwKKwkJCQlzZXQtPmtxdWV1 ZV9yZXRfZXZlbnRzLAorCQkJCU1pbihuZXZlbnRzLCBzZXQtPm5ldmVudHNfc3BhY2UpLAor CQkJCXRpbWVvdXRfcCk7CisKKwkvKiBDaGVjayByZXR1cm4gY29kZSAqLworCWlmIChyYyA8 IDApCisJeworCQkvKiBFSU5UUiBpcyBva2F5LCBvdGhlcndpc2UgY29tcGxhaW4gKi8KKwkJ aWYgKGVycm5vICE9IEVJTlRSKQorCQl7CisJCQl3YWl0aW5nID0gZmFsc2U7CisJCQllcmVw b3J0KEVSUk9SLAorCQkJCQkoZXJyY29kZV9mb3Jfc29ja2V0X2FjY2VzcygpLAorCQkJCQkg ZXJybXNnKCIlcygpIGZhaWxlZDogJW0iLAorCQkJCQkJCSJrZXZlbnQiKSkpOworCQl9CisJ CXJldHVybiAwOworCX0KKwllbHNlIGlmIChyYyA9PSAwKQorCXsKKwkJLyogdGltZW91dCBl eGNlZWRlZCAqLworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBBdCBsZWFzdCBvbmUg ZXZlbnQgb2NjdXJyZWQsIGl0ZXJhdGUgb3ZlciB0aGUgcmV0dXJuZWQga3F1ZXVlIGV2ZW50 cworCSAqIHVudGlsIHRoZXkncmUgZWl0aGVyIGFsbCBwcm9jZXNzZWQsIG9yIHdlJ3ZlIHJl dHVybmVkIGFsbCB0aGUgZXZlbnRzCisJICogdGhlIGNhbGxlciBkZXNpcmVkLgorCSAqLwor CWZvciAoY3VyX2txdWV1ZV9ldmVudCA9IHNldC0+a3F1ZXVlX3JldF9ldmVudHM7CisJCSBj dXJfa3F1ZXVlX2V2ZW50IDwgKHNldC0+a3F1ZXVlX3JldF9ldmVudHMgKyByYykgJiYKKwkJ IHJldHVybmVkX2V2ZW50cyA8IG5ldmVudHM7CisJCSBjdXJfa3F1ZXVlX2V2ZW50KyspCisJ eworCQkvKiBrZXZlbnQncyB1ZGF0YSBwb2ludHMgdG8gdGhlIGFzc29jaWF0ZWQgV2FpdEV2 ZW50ICovCisJCWN1cl9ldmVudCA9IEFjY2Vzc1dhaXRFdmVudChjdXJfa3F1ZXVlX2V2ZW50 KTsKKworCQlvY2N1cnJlZF9ldmVudHMtPnBvcyA9IGN1cl9ldmVudC0+cG9zOworCQlvY2N1 cnJlZF9ldmVudHMtPnVzZXJfZGF0YSA9IGN1cl9ldmVudC0+dXNlcl9kYXRhOworCQlvY2N1 cnJlZF9ldmVudHMtPmV2ZW50cyA9IDA7CisKKwkJaWYgKGN1cl9ldmVudC0+ZXZlbnRzID09 IFdMX0xBVENIX1NFVCAmJgorCQkJY3VyX2txdWV1ZV9ldmVudC0+ZmlsdGVyID09IEVWRklM VF9TSUdOQUwpCisJCXsKKwkJCWlmIChzZXQtPmxhdGNoICYmIHNldC0+bGF0Y2gtPm1heWJl X3NsZWVwaW5nICYmIHNldC0+bGF0Y2gtPmlzX3NldCkKKwkJCXsKKwkJCQlvY2N1cnJlZF9l dmVudHMtPmZkID0gUEdJTlZBTElEX1NPQ0tFVDsKKwkJCQlvY2N1cnJlZF9ldmVudHMtPmV2 ZW50cyA9IFdMX0xBVENIX1NFVDsKKwkJCQlvY2N1cnJlZF9ldmVudHMrKzsKKwkJCQlyZXR1 cm5lZF9ldmVudHMrKzsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChjdXJfZXZlbnQtPmV2ZW50 cyA9PSBXTF9QT1NUTUFTVEVSX0RFQVRIICYmCisJCQkJIGN1cl9rcXVldWVfZXZlbnQtPmZp bHRlciA9PSBFVkZJTFRfUFJPQyAmJgorCQkJCSAoY3VyX2txdWV1ZV9ldmVudC0+ZmZsYWdz ICYgTk9URV9FWElUKSAhPSAwKQorCQl7CisJCQkvKgorCQkJICogVGhlIGtlcm5lbCB3aWxs IHRlbGwgdGhpcyBrcXVldWUgb2JqZWN0IG9ubHkgb25jZSBhYm91dCB0aGUKKwkJCSAqIGV4 aXQgb2YgdGhlIHBvc3RtYXN0ZXIsIHNvIGxldCdzIHJlbWVtYmVyIHRoYXQgZm9yIG5leHQg dGltZSBzbworCQkJICogdGhhdCB3ZSBwcm92aWRlIGxldmVsLXRyaWdnZXJlZCBzZW1hbnRp Y3MuCisJCQkgKi8KKwkJCXNldC0+cmVwb3J0X3Bvc3RtYXN0ZXJfbm90X3J1bm5pbmcgPSB0 cnVlOworCisJCQlpZiAoc2V0LT5leGl0X29uX3Bvc3RtYXN0ZXJfZGVhdGgpCisJCQkJcHJv Y19leGl0KDEpOworCQkJb2NjdXJyZWRfZXZlbnRzLT5mZCA9IFBHSU5WQUxJRF9TT0NLRVQ7 CisJCQlvY2N1cnJlZF9ldmVudHMtPmV2ZW50cyA9IFdMX1BPU1RNQVNURVJfREVBVEg7CisJ CQlvY2N1cnJlZF9ldmVudHMrKzsKKwkJCXJldHVybmVkX2V2ZW50cysrOworCQl9CisJCWVs c2UgaWYgKGN1cl9ldmVudC0+ZXZlbnRzICYgKFdMX1NPQ0tFVF9SRUFEQUJMRSB8CisJCQkJ CQkJCQkgIFdMX1NPQ0tFVF9XUklURUFCTEUgfAorCQkJCQkJCQkJICBXTF9TT0NLRVRfQ0xP U0VEKSkKKwkJeworCQkJQXNzZXJ0KGN1cl9ldmVudC0+ZmQgPj0gMCk7CisKKwkJCWlmICgo Y3VyX2V2ZW50LT5ldmVudHMgJiBXTF9TT0NLRVRfUkVBREFCTEUpICYmCisJCQkJKGN1cl9r cXVldWVfZXZlbnQtPmZpbHRlciA9PSBFVkZJTFRfUkVBRCkpCisJCQl7CisJCQkJLyogcmVh ZGFibGUsIG9yIEVPRiAqLworCQkJCW9jY3VycmVkX2V2ZW50cy0+ZXZlbnRzIHw9IFdMX1NP Q0tFVF9SRUFEQUJMRTsKKwkJCX0KKworCQkJaWYgKChjdXJfZXZlbnQtPmV2ZW50cyAmIFdM X1NPQ0tFVF9DTE9TRUQpICYmCisJCQkJKGN1cl9rcXVldWVfZXZlbnQtPmZpbHRlciA9PSBF VkZJTFRfUkVBRCkgJiYKKwkJCQkoY3VyX2txdWV1ZV9ldmVudC0+ZmxhZ3MgJiBFVl9FT0Yp KQorCQkJeworCQkJCS8qIHRoZSByZW1vdGUgcGVlciBoYXMgc2h1dCBkb3duICovCisJCQkJ b2NjdXJyZWRfZXZlbnRzLT5ldmVudHMgfD0gV0xfU09DS0VUX0NMT1NFRDsKKwkJCX0KKwor CQkJaWYgKChjdXJfZXZlbnQtPmV2ZW50cyAmIFdMX1NPQ0tFVF9XUklURUFCTEUpICYmCisJ CQkJKGN1cl9rcXVldWVfZXZlbnQtPmZpbHRlciA9PSBFVkZJTFRfV1JJVEUpKQorCQkJewor CQkJCS8qIHdyaXRhYmxlLCBvciBFT0YgKi8KKwkJCQlvY2N1cnJlZF9ldmVudHMtPmV2ZW50 cyB8PSBXTF9TT0NLRVRfV1JJVEVBQkxFOworCQkJfQorCisJCQlpZiAob2NjdXJyZWRfZXZl bnRzLT5ldmVudHMgIT0gMCkKKwkJCXsKKwkJCQlvY2N1cnJlZF9ldmVudHMtPmZkID0gY3Vy X2V2ZW50LT5mZDsKKwkJCQlvY2N1cnJlZF9ldmVudHMrKzsKKwkJCQlyZXR1cm5lZF9ldmVu dHMrKzsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByZXR1cm5lZF9ldmVudHM7Cit9CisK KyNlbGlmIGRlZmluZWQoV0FJVF9VU0VfUE9MTCkKKworLyoKKyAqIFdhaXQgdXNpbmcgcG9s bCgyKS4KKyAqCisgKiBUaGlzIGFsbG93cyB0byByZWNlaXZlIHJlYWRpbmVzcyBub3RpZmlj YXRpb25zIGZvciBzZXZlcmFsIGV2ZW50cyBhdCBvbmNlLAorICogYnV0IHJlcXVpcmVzIGl0 ZXJhdGluZyB0aHJvdWdoIGFsbCBvZiBzZXQtPnBvbGxmZHMuCisgKi8KK3N0YXRpYyBpbmxp bmUgaW50CitXYWl0RXZlbnRTZXRXYWl0QmxvY2soV2FpdEV2ZW50U2V0ICpzZXQsIGludCBj dXJfdGltZW91dCwKKwkJCQkJICBXYWl0RXZlbnQgKm9jY3VycmVkX2V2ZW50cywgaW50IG5l dmVudHMpCit7CisJaW50CQkJcmV0dXJuZWRfZXZlbnRzID0gMDsKKwlpbnQJCQlyYzsKKwlX YWl0RXZlbnQgICpjdXJfZXZlbnQ7CisJc3RydWN0IHBvbGxmZCAqY3VyX3BvbGxmZDsKKwor CS8qIFNsZWVwICovCisJcmMgPSBwb2xsKHNldC0+cG9sbGZkcywgc2V0LT5uZXZlbnRzLCAo aW50KSBjdXJfdGltZW91dCk7CisKKwkvKiBDaGVjayByZXR1cm4gY29kZSAqLworCWlmIChy YyA8IDApCisJeworCQkvKiBFSU5UUiBpcyBva2F5LCBvdGhlcndpc2UgY29tcGxhaW4gKi8K KwkJaWYgKGVycm5vICE9IEVJTlRSKQorCQl7CisJCQl3YWl0aW5nID0gZmFsc2U7CisJCQll cmVwb3J0KEVSUk9SLAorCQkJCQkoZXJyY29kZV9mb3Jfc29ja2V0X2FjY2VzcygpLAorCQkJ CQkgZXJybXNnKCIlcygpIGZhaWxlZDogJW0iLAorCQkJCQkJCSJwb2xsIikpKTsKKwkJfQor CQlyZXR1cm4gMDsKKwl9CisJZWxzZSBpZiAocmMgPT0gMCkKKwl7CisJCS8qIHRpbWVvdXQg ZXhjZWVkZWQgKi8KKwkJcmV0dXJuIC0xOworCX0KKworCWZvciAoY3VyX2V2ZW50ID0gc2V0 LT5ldmVudHMsIGN1cl9wb2xsZmQgPSBzZXQtPnBvbGxmZHM7CisJCSBjdXJfZXZlbnQgPCAo c2V0LT5ldmVudHMgKyBzZXQtPm5ldmVudHMpICYmCisJCSByZXR1cm5lZF9ldmVudHMgPCBu ZXZlbnRzOworCQkgY3VyX2V2ZW50KyssIGN1cl9wb2xsZmQrKykKKwl7CisJCS8qIG5vIGFj dGl2aXR5IG9uIHRoaXMgRkQsIHNraXAgKi8KKwkJaWYgKGN1cl9wb2xsZmQtPnJldmVudHMg PT0gMCkKKwkJCWNvbnRpbnVlOworCisJCW9jY3VycmVkX2V2ZW50cy0+cG9zID0gY3VyX2V2 ZW50LT5wb3M7CisJCW9jY3VycmVkX2V2ZW50cy0+dXNlcl9kYXRhID0gY3VyX2V2ZW50LT51 c2VyX2RhdGE7CisJCW9jY3VycmVkX2V2ZW50cy0+ZXZlbnRzID0gMDsKKworCQlpZiAoY3Vy X2V2ZW50LT5ldmVudHMgPT0gV0xfTEFUQ0hfU0VUICYmCisJCQkoY3VyX3BvbGxmZC0+cmV2 ZW50cyAmIChQT0xMSU4gfCBQT0xMSFVQIHwgUE9MTEVSUiB8IFBPTExOVkFMKSkpCisJCXsK KwkJCS8qIFRoZXJlJ3MgZGF0YSBpbiB0aGUgc2VsZi1waXBlLCBjbGVhciBpdC4gKi8KKwkJ CWRyYWluKCk7CisKKwkJCWlmIChzZXQtPmxhdGNoICYmIHNldC0+bGF0Y2gtPm1heWJlX3Ns ZWVwaW5nICYmIHNldC0+bGF0Y2gtPmlzX3NldCkKKwkJCXsKKwkJCQlvY2N1cnJlZF9ldmVu dHMtPmZkID0gUEdJTlZBTElEX1NPQ0tFVDsKKwkJCQlvY2N1cnJlZF9ldmVudHMtPmV2ZW50 cyA9IFdMX0xBVENIX1NFVDsKKwkJCQlvY2N1cnJlZF9ldmVudHMrKzsKKwkJCQlyZXR1cm5l ZF9ldmVudHMrKzsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChjdXJfZXZlbnQtPmV2ZW50cyA9 PSBXTF9QT1NUTUFTVEVSX0RFQVRIICYmCisJCQkJIChjdXJfcG9sbGZkLT5yZXZlbnRzICYg KFBPTExJTiB8IFBPTExIVVAgfCBQT0xMRVJSIHwgUE9MTE5WQUwpKSkKKwkJeworCQkJLyoK KwkJCSAqIFdlIGV4cGVjdCBhbiBQT0xMSFVQIHdoZW4gdGhlIHJlbW90ZSBlbmQgaXMgY2xv c2VkLCBidXQgYmVjYXVzZQorCQkJICogd2UgZG9uJ3QgZXhwZWN0IHRoZSBwaXBlIHRvIGJl Y29tZSByZWFkYWJsZSBvciB0byBoYXZlIGFueQorCQkJICogZXJyb3JzIGVpdGhlciwgdHJl YXQgdGhvc2UgY2FzZXMgYXMgcG9zdG1hc3RlciBkZWF0aCwgdG9vLgorCQkJICoKKwkJCSAq IEJlIHBhcmFub2lkIGFib3V0IGEgc3B1cmlvdXMgZXZlbnQgc2lnbmFsaW5nIHRoZSBwb3N0 bWFzdGVyIGFzCisJCQkgKiBiZWluZyBkZWFkLiAgVGhlcmUgaGF2ZSBiZWVuIHJlcG9ydHMg YWJvdXQgdGhhdCBoYXBwZW5pbmcgd2l0aAorCQkJICogb2xkZXIgcHJpbWl0aXZlcyAoc2Vs ZWN0KDIpIHRvIGJlIHNwZWNpZmljKSwgYW5kIGEgc3B1cmlvdXMKKwkJCSAqIFdMX1BPU1RN QVNURVJfREVBVEggZXZlbnQgd291bGQgYmUgcGFpbmZ1bC4gUmUtY2hlY2tpbmcgZG9lc24n dAorCQkJICogY29zdCBtdWNoLgorCQkJICovCisJCQlpZiAoIVBvc3RtYXN0ZXJJc0FsaXZl SW50ZXJuYWwoKSkKKwkJCXsKKwkJCQlpZiAoc2V0LT5leGl0X29uX3Bvc3RtYXN0ZXJfZGVh dGgpCisJCQkJCXByb2NfZXhpdCgxKTsKKwkJCQlvY2N1cnJlZF9ldmVudHMtPmZkID0gUEdJ TlZBTElEX1NPQ0tFVDsKKwkJCQlvY2N1cnJlZF9ldmVudHMtPmV2ZW50cyA9IFdMX1BPU1RN QVNURVJfREVBVEg7CisJCQkJb2NjdXJyZWRfZXZlbnRzKys7CisJCQkJcmV0dXJuZWRfZXZl bnRzKys7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoY3VyX2V2ZW50LT5ldmVudHMgJiAoV0xf U09DS0VUX1JFQURBQkxFIHwKKwkJCQkJCQkJCSAgV0xfU09DS0VUX1dSSVRFQUJMRSB8CisJ CQkJCQkJCQkgIFdMX1NPQ0tFVF9DTE9TRUQpKQorCQl7CisJCQlpbnQJCQllcnJmbGFncyA9 IFBPTExIVVAgfCBQT0xMRVJSIHwgUE9MTE5WQUw7CisKKwkJCUFzc2VydChjdXJfZXZlbnQt PmZkID49IFBHSU5WQUxJRF9TT0NLRVQpOworCisJCQlpZiAoKGN1cl9ldmVudC0+ZXZlbnRz ICYgV0xfU09DS0VUX1JFQURBQkxFKSAmJgorCQkJCShjdXJfcG9sbGZkLT5yZXZlbnRzICYg KFBPTExJTiB8IGVycmZsYWdzKSkpCisJCQl7CisJCQkJLyogZGF0YSBhdmFpbGFibGUgaW4g c29ja2V0LCBvciBFT0YgKi8KKwkJCQlvY2N1cnJlZF9ldmVudHMtPmV2ZW50cyB8PSBXTF9T T0NLRVRfUkVBREFCTEU7CisJCQl9CisKKwkJCWlmICgoY3VyX2V2ZW50LT5ldmVudHMgJiBX TF9TT0NLRVRfV1JJVEVBQkxFKSAmJgorCQkJCShjdXJfcG9sbGZkLT5yZXZlbnRzICYgKFBP TExPVVQgfCBlcnJmbGFncykpKQorCQkJeworCQkJCS8qIHdyaXRlYWJsZSwgb3IgRU9GICov CisJCQkJb2NjdXJyZWRfZXZlbnRzLT5ldmVudHMgfD0gV0xfU09DS0VUX1dSSVRFQUJMRTsK KwkJCX0KKworI2lmZGVmIFBPTExSREhVUAorCQkJaWYgKChjdXJfZXZlbnQtPmV2ZW50cyAm IFdMX1NPQ0tFVF9DTE9TRUQpICYmCisJCQkJKGN1cl9wb2xsZmQtPnJldmVudHMgJiAoUE9M TFJESFVQIHwgZXJyZmxhZ3MpKSkKKwkJCXsKKwkJCQkvKiByZW1vdGUgcGVlciBjbG9zZWQs IG9yIGVycm9yICovCisJCQkJb2NjdXJyZWRfZXZlbnRzLT5ldmVudHMgfD0gV0xfU09DS0VU X0NMT1NFRDsKKwkJCX0KKyNlbmRpZgorCisJCQlpZiAob2NjdXJyZWRfZXZlbnRzLT5ldmVu dHMgIT0gMCkKKwkJCXsKKwkJCQlvY2N1cnJlZF9ldmVudHMtPmZkID0gY3VyX2V2ZW50LT5m ZDsKKwkJCQlvY2N1cnJlZF9ldmVudHMrKzsKKwkJCQlyZXR1cm5lZF9ldmVudHMrKzsKKwkJ CX0KKwkJfQorCX0KKwlyZXR1cm4gcmV0dXJuZWRfZXZlbnRzOworfQorCisjZWxpZiBkZWZp bmVkKFdBSVRfVVNFX1dJTjMyKQorCisvKgorICogV2FpdCB1c2luZyBXaW5kb3dzJyBXYWl0 Rm9yTXVsdGlwbGVPYmplY3RzKCkuICBFYWNoIGNhbGwgb25seSAiY29uc3VtZXMiIG9uZQor ICogZXZlbnQsIHNvIHdlIGtlZXAgY2FsbGluZyB1bnRpbCB3ZSd2ZSBmaWxsZWQgdXAgb3Vy IG91dHB1dCBidWZmZXIgdG8gbWF0Y2gKKyAqIHRoZSBiZWhhdmlvciBvZiB0aGUgb3RoZXIg aW1wbGVtZW50YXRpb25zLgorICoKKyAqIGh0dHBzOi8vYmxvZ3MubXNkbi5taWNyb3NvZnQu Y29tL29sZG5ld3RoaW5nLzIwMTUwNDA5LTAwLz9wPTQ0MjczCisgKi8KK3N0YXRpYyBpbmxp bmUgaW50CitXYWl0RXZlbnRTZXRXYWl0QmxvY2soV2FpdEV2ZW50U2V0ICpzZXQsIGludCBj dXJfdGltZW91dCwKKwkJCQkJICBXYWl0RXZlbnQgKm9jY3VycmVkX2V2ZW50cywgaW50IG5l dmVudHMpCit7CisJaW50CQkJcmV0dXJuZWRfZXZlbnRzID0gMDsKKwlEV09SRAkJcmM7CisJ V2FpdEV2ZW50ICAqY3VyX2V2ZW50OworCisJLyogUmVzZXQgYW55IHdhaXQgZXZlbnRzIHRo YXQgbmVlZCBpdCAqLworCWZvciAoY3VyX2V2ZW50ID0gc2V0LT5ldmVudHM7CisJCSBjdXJf ZXZlbnQgPCAoc2V0LT5ldmVudHMgKyBzZXQtPm5ldmVudHMpOworCQkgY3VyX2V2ZW50Kysp CisJeworCQlpZiAoY3VyX2V2ZW50LT5yZXNldCkKKwkJeworCQkJV2FpdEV2ZW50QWRqdXN0 V2luMzIoc2V0LCBjdXJfZXZlbnQpOworCQkJY3VyX2V2ZW50LT5yZXNldCA9IGZhbHNlOwor CQl9CisKKwkJLyoKKwkJICogV2UgYXNzb2NpYXRlIHRoZSBzb2NrZXQgd2l0aCBhIG5ldyBl dmVudCBoYW5kbGUgZm9yIGVhY2gKKwkJICogV2FpdEV2ZW50U2V0LiAgRkRfQ0xPU0UgaXMg b25seSBnZW5lcmF0ZWQgb25jZSBpZiB0aGUgb3RoZXIgZW5kCisJCSAqIGNsb3NlcyBncmFj ZWZ1bGx5LiAgVGhlcmVmb3JlIHdlIG1pZ2h0IG1pc3MgdGhlIEZEX0NMT1NFCisJCSAqIG5v dGlmaWNhdGlvbiwgaWYgaXQgd2FzIGRlbGl2ZXJlZCB0byBhbm90aGVyIGV2ZW50IGFmdGVy IHdlIHN0b3BwZWQKKwkJICogd2FpdGluZyBmb3IgaXQuICBDbG9zZSB0aGF0IHJhY2UgYnkg cGVla2luZyBmb3IgRU9GIGFmdGVyIHNldHRpbmcKKwkJICogdXAgdGhpcyBoYW5kbGUgdG8g cmVjZWl2ZSBub3RpZmljYXRpb25zLCBhbmQgYmVmb3JlIGVudGVyaW5nIHRoZQorCQkgKiBz bGVlcC4KKwkJICoKKwkJICogWFhYIElmIHdlIGhhZCBvbmUgZXZlbnQgaGFuZGxlIGZvciB0 aGUgbGlmZXRpbWUgb2YgYSBzb2NrZXQsIHdlCisJCSAqIHdvdWxkbid0IG5lZWQgdGhpcy4K KwkJICovCisJCWlmIChjdXJfZXZlbnQtPmV2ZW50cyAmIFdMX1NPQ0tFVF9SRUFEQUJMRSkK KwkJeworCQkJY2hhcgkJYzsKKwkJCVdTQUJVRgkJYnVmOworCQkJRFdPUkQJCXJlY2VpdmVk OworCQkJRFdPUkQJCWZsYWdzOworCisJCQlidWYuYnVmID0gJmM7CisJCQlidWYubGVuID0g MTsKKwkJCWZsYWdzID0gTVNHX1BFRUs7CisJCQlpZiAoV1NBUmVjdihjdXJfZXZlbnQtPmZk LCAmYnVmLCAxLCAmcmVjZWl2ZWQsICZmbGFncywgTlVMTCwgTlVMTCkgPT0gMCkKKwkJCXsK KwkJCQlvY2N1cnJlZF9ldmVudHMtPnBvcyA9IGN1cl9ldmVudC0+cG9zOworCQkJCW9jY3Vy cmVkX2V2ZW50cy0+dXNlcl9kYXRhID0gY3VyX2V2ZW50LT51c2VyX2RhdGE7CisJCQkJb2Nj dXJyZWRfZXZlbnRzLT5ldmVudHMgPSBXTF9TT0NLRVRfUkVBREFCTEU7CisJCQkJb2NjdXJy ZWRfZXZlbnRzLT5mZCA9IGN1cl9ldmVudC0+ZmQ7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJ CX0KKworCQkvKgorCQkgKiBXaW5kb3dzIGRvZXMgbm90IGd1YXJhbnRlZSB0byBsb2cgYW4g RkRfV1JJVEUgbmV0d29yayBldmVudAorCQkgKiBpbmRpY2F0aW5nIHRoYXQgbW9yZSBkYXRh IGNhbiBiZSBzZW50IHVubGVzcyB0aGUgcHJldmlvdXMgc2VuZCgpCisJCSAqIGZhaWxlZCB3 aXRoIFdTQUVXT1VMREJMT0NLLiAgV2hpbGUgb3VyIGNhbGxlciBtaWdodCB3ZWxsIGhhdmUg bWFkZQorCQkgKiBzdWNoIGEgY2FsbCwgd2UgY2Fubm90IGFzc3VtZSB0aGF0IGhlcmUuICBU aGVyZWZvcmUsIGlmIHdhaXRpbmcgZm9yCisJCSAqIHdyaXRlLXJlYWR5LCBmb3JjZSB0aGUg aXNzdWUgYnkgZG9pbmcgYSBkdW1teSBzZW5kKCkuICBJZiB0aGUgZHVtbXkKKwkJICogc2Vu ZCgpIHN1Y2NlZWRzLCBhc3N1bWUgdGhhdCB0aGUgc29ja2V0IGlzIGluIGZhY3Qgd3JpdGUt cmVhZHksIGFuZAorCQkgKiByZXR1cm4gaW1tZWRpYXRlbHkuICBBbHNvLCBpZiBpdCBmYWls cyB3aXRoIHNvbWV0aGluZyBvdGhlciB0aGFuCisJCSAqIFdTQUVXT1VMREJMT0NLLCByZXR1 cm4gYSB3cml0ZS1yZWFkeSBpbmRpY2F0aW9uIHRvIGxldCBvdXIgY2FsbGVyCisJCSAqIGRl YWwgd2l0aCB0aGUgZXJyb3IgY29uZGl0aW9uLgorCQkgKi8KKwkJaWYgKGN1cl9ldmVudC0+ ZXZlbnRzICYgV0xfU09DS0VUX1dSSVRFQUJMRSkKKwkJeworCQkJY2hhcgkJYzsKKwkJCVdT QUJVRgkJYnVmOworCQkJRFdPUkQJCXNlbnQ7CisJCQlpbnQJCQlyOworCisJCQlidWYuYnVm ID0gJmM7CisJCQlidWYubGVuID0gMDsKKworCQkJciA9IFdTQVNlbmQoY3VyX2V2ZW50LT5m ZCwgJmJ1ZiwgMSwgJnNlbnQsIDAsIE5VTEwsIE5VTEwpOworCQkJaWYgKHIgPT0gMCB8fCBX U0FHZXRMYXN0RXJyb3IoKSAhPSBXU0FFV09VTERCTE9DSykKKwkJCXsKKwkJCQlvY2N1cnJl ZF9ldmVudHMtPnBvcyA9IGN1cl9ldmVudC0+cG9zOworCQkJCW9jY3VycmVkX2V2ZW50cy0+ dXNlcl9kYXRhID0gY3VyX2V2ZW50LT51c2VyX2RhdGE7CisJCQkJb2NjdXJyZWRfZXZlbnRz LT5ldmVudHMgPSBXTF9TT0NLRVRfV1JJVEVBQkxFOworCQkJCW9jY3VycmVkX2V2ZW50cy0+ ZmQgPSBjdXJfZXZlbnQtPmZkOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCisJ LyoKKwkgKiBTbGVlcC4KKwkgKgorCSAqIE5lZWQgdG8gd2FpdCBmb3IgLT5uZXZlbnRzICsg MSwgYmVjYXVzZSBzaWduYWwgaGFuZGxlIGlzIGluIFswXS4KKwkgKi8KKwlyYyA9IFdhaXRG b3JNdWx0aXBsZU9iamVjdHMoc2V0LT5uZXZlbnRzICsgMSwgc2V0LT5oYW5kbGVzLCBGQUxT RSwKKwkJCQkJCQkJY3VyX3RpbWVvdXQpOworCisJLyogQ2hlY2sgcmV0dXJuIGNvZGUgKi8K KwlpZiAocmMgPT0gV0FJVF9GQUlMRUQpCisJCWVsb2coRVJST1IsICJXYWl0Rm9yTXVsdGlw bGVPYmplY3RzKCkgZmFpbGVkOiBlcnJvciBjb2RlICVsdSIsCisJCQkgR2V0TGFzdEVycm9y KCkpOworCWVsc2UgaWYgKHJjID09IFdBSVRfVElNRU9VVCkKKwl7CisJCS8qIHRpbWVvdXQg ZXhjZWVkZWQgKi8KKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChyYyA9PSBXQUlUX09CSkVD VF8wKQorCXsKKwkJLyogU2VydmljZSBuZXdseS1hcnJpdmVkIHNpZ25hbHMgKi8KKwkJcGd3 aW4zMl9kaXNwYXRjaF9xdWV1ZWRfc2lnbmFscygpOworCQlyZXR1cm4gMDsJCQkJLyogcmV0 cnkgKi8KKwl9CisKKwkvKgorCSAqIFdpdGggYW4gb2Zmc2V0IG9mIG9uZSwgZHVlIHRvIHRo ZSBhbHdheXMgcHJlc2VudCBwZ3dpbjMyX3NpZ25hbF9ldmVudCwKKwkgKiB0aGUgaGFuZGxl IG9mZnNldCBkaXJlY3RseSBjb3JyZXNwb25kcyB0byBhIHdhaXQgZXZlbnQuCisJICovCisJ Y3VyX2V2ZW50ID0gKFdhaXRFdmVudCAqKSAmc2V0LT5ldmVudHNbcmMgLSBXQUlUX09CSkVD VF8wIC0gMV07CisKKwlmb3IgKDs7KQorCXsKKwkJaW50CQkJbmV4dF9wb3M7CisJCWludAkJ CWNvdW50OworCisJCW9jY3VycmVkX2V2ZW50cy0+cG9zID0gY3VyX2V2ZW50LT5wb3M7CisJ CW9jY3VycmVkX2V2ZW50cy0+dXNlcl9kYXRhID0gY3VyX2V2ZW50LT51c2VyX2RhdGE7CisJ CW9jY3VycmVkX2V2ZW50cy0+ZXZlbnRzID0gMDsKKworCQlpZiAoY3VyX2V2ZW50LT5ldmVu dHMgPT0gV0xfTEFUQ0hfU0VUKQorCQl7CisJCQkvKgorCQkJICogV2UgY2Fubm90IHVzZSBz ZXQtPmxhdGNoLT5ldmVudCB0byByZXNldCB0aGUgZmlyZWQgZXZlbnQgaWYgd2UKKwkJCSAq IGFyZW4ndCB3YWl0aW5nIG9uIHRoaXMgbGF0Y2ggbm93LgorCQkJICovCisJCQlpZiAoIVJl c2V0RXZlbnQoc2V0LT5oYW5kbGVzW2N1cl9ldmVudC0+cG9zICsgMV0pKQorCQkJCWVsb2co RVJST1IsICJSZXNldEV2ZW50IGZhaWxlZDogZXJyb3IgY29kZSAlbHUiLCBHZXRMYXN0RXJy b3IoKSk7CisKKwkJCWlmIChzZXQtPmxhdGNoICYmIHNldC0+bGF0Y2gtPm1heWJlX3NsZWVw aW5nICYmIHNldC0+bGF0Y2gtPmlzX3NldCkKKwkJCXsKKwkJCQlvY2N1cnJlZF9ldmVudHMt PmZkID0gUEdJTlZBTElEX1NPQ0tFVDsKKwkJCQlvY2N1cnJlZF9ldmVudHMtPmV2ZW50cyA9 IFdMX0xBVENIX1NFVDsKKwkJCQlvY2N1cnJlZF9ldmVudHMrKzsKKwkJCQlyZXR1cm5lZF9l dmVudHMrKzsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChjdXJfZXZlbnQtPmV2ZW50cyA9PSBX TF9QT1NUTUFTVEVSX0RFQVRIKQorCQl7CisJCQkvKgorCQkJICogUG9zdG1hc3RlciBhcHBh cmVudGx5IGRpZWQuICBTaW5jZSB0aGUgY29uc2VxdWVuY2VzIG9mIGZhbHNlbHkKKwkJCSAq IHJldHVybmluZyBXTF9QT1NUTUFTVEVSX0RFQVRIIGNvdWxkIGJlIHByZXR0eSB1bnBsZWFz YW50LCB3ZQorCQkJICogdGFrZSB0aGUgdHJvdWJsZSB0byBwb3NpdGl2ZWx5IHZlcmlmeSB0 aGlzIHdpdGgKKwkJCSAqIFBvc3RtYXN0ZXJJc0FsaXZlKCksIGV2ZW4gdGhvdWdoIHRoZXJl IGlzIG5vIGtub3duIHJlYXNvbiB0bworCQkJICogdGhpbmsgdGhhdCB0aGUgZXZlbnQgY291 bGQgYmUgZmFsc2VseSBzZXQgb24gV2luZG93cy4KKwkJCSAqLworCQkJaWYgKCFQb3N0bWFz dGVySXNBbGl2ZUludGVybmFsKCkpCisJCQl7CisJCQkJaWYgKHNldC0+ZXhpdF9vbl9wb3N0 bWFzdGVyX2RlYXRoKQorCQkJCQlwcm9jX2V4aXQoMSk7CisJCQkJb2NjdXJyZWRfZXZlbnRz LT5mZCA9IFBHSU5WQUxJRF9TT0NLRVQ7CisJCQkJb2NjdXJyZWRfZXZlbnRzLT5ldmVudHMg PSBXTF9QT1NUTUFTVEVSX0RFQVRIOworCQkJCW9jY3VycmVkX2V2ZW50cysrOworCQkJCXJl dHVybmVkX2V2ZW50cysrOworCQkJfQorCQl9CisJCWVsc2UgaWYgKGN1cl9ldmVudC0+ZXZl bnRzICYgV0xfU09DS0VUX01BU0spCisJCXsKKwkJCVdTQU5FVFdPUktFVkVOVFMgcmVzRXZl bnRzOworCQkJSEFORExFCQloYW5kbGUgPSBzZXQtPmhhbmRsZXNbY3VyX2V2ZW50LT5wb3Mg KyAxXTsKKworCQkJQXNzZXJ0KGN1cl9ldmVudC0+ZmQpOworCisJCQlvY2N1cnJlZF9ldmVu dHMtPmZkID0gY3VyX2V2ZW50LT5mZDsKKworCQkJWmVyb01lbW9yeSgmcmVzRXZlbnRzLCBz aXplb2YocmVzRXZlbnRzKSk7CisJCQlpZiAoV1NBRW51bU5ldHdvcmtFdmVudHMoY3VyX2V2 ZW50LT5mZCwgaGFuZGxlLCAmcmVzRXZlbnRzKSAhPSAwKQorCQkJCWVsb2coRVJST1IsICJm YWlsZWQgdG8gZW51bWVyYXRlIG5ldHdvcmsgZXZlbnRzOiBlcnJvciBjb2RlICVkIiwKKwkJ CQkJIFdTQUdldExhc3RFcnJvcigpKTsKKwkJCWlmICgoY3VyX2V2ZW50LT5ldmVudHMgJiBX TF9TT0NLRVRfUkVBREFCTEUpICYmCisJCQkJKHJlc0V2ZW50cy5sTmV0d29ya0V2ZW50cyAm IEZEX1JFQUQpKQorCQkJeworCQkJCS8qIGRhdGEgYXZhaWxhYmxlIGluIHNvY2tldCAqLwor CQkJCW9jY3VycmVkX2V2ZW50cy0+ZXZlbnRzIHw9IFdMX1NPQ0tFVF9SRUFEQUJMRTsKKwor CQkJCS8qLS0tLS0tCisJCQkJICogV2FpdEZvck11bHRpcGxlT2JqZWN0cyBkb2Vzbid0IGd1 YXJhbnRlZSB0aGF0IGEgcmVhZCBldmVudAorCQkJCSAqIHdpbGwgYmUgcmV0dXJuZWQgaWYg dGhlIGxhdGNoIGlzIHNldCBhdCB0aGUgc2FtZSB0aW1lLiAgRXZlbgorCQkJCSAqIGlmIGl0 IGRpZCwgdGhlIGNhbGxlciBtaWdodCBkcm9wIHRoYXQgZXZlbnQgZXhwZWN0aW5nIGl0IHRv CisJCQkJICogcmVvY2N1ciBvbiBuZXh0IGNhbGwuICBTbywgd2UgbXVzdCBmb3JjZSB0aGUg ZXZlbnQgdG8gYmUKKwkJCQkgKiByZXNldCBpZiB0aGlzIFdhaXRFdmVudFNldCBpcyB1c2Vk IGFnYWluIGluIG9yZGVyIHRvIGF2b2lkCisJCQkJICogYW4gaW5kZWZpbml0ZSBoYW5nLgor CQkJCSAqCisJCQkJICogUmVmZXIKKwkJCQkgKiBodHRwczovL21zZG4ubWljcm9zb2Z0LmNv bS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9tczc0MTU3Nih2PXZzLjg1KS5hc3B4 CisJCQkJICogZm9yIHRoZSBiZWhhdmlvciBvZiBzb2NrZXQgZXZlbnRzLgorCQkJCSAqLS0t LS0tCisJCQkJICovCisJCQkJY3VyX2V2ZW50LT5yZXNldCA9IHRydWU7CisJCQl9CisJCQlp ZiAoKGN1cl9ldmVudC0+ZXZlbnRzICYgV0xfU09DS0VUX1dSSVRFQUJMRSkgJiYKKwkJCQko cmVzRXZlbnRzLmxOZXR3b3JrRXZlbnRzICYgRkRfV1JJVEUpKQorCQkJeworCQkJCS8qIHdy aXRlYWJsZSAqLworCQkJCW9jY3VycmVkX2V2ZW50cy0+ZXZlbnRzIHw9IFdMX1NPQ0tFVF9X UklURUFCTEU7CisJCQl9CisJCQlpZiAoKGN1cl9ldmVudC0+ZXZlbnRzICYgV0xfU09DS0VU X0NPTk5FQ1RFRCkgJiYKKwkJCQkocmVzRXZlbnRzLmxOZXR3b3JrRXZlbnRzICYgRkRfQ09O TkVDVCkpCisJCQl7CisJCQkJLyogY29ubmVjdGVkICovCisJCQkJb2NjdXJyZWRfZXZlbnRz LT5ldmVudHMgfD0gV0xfU09DS0VUX0NPTk5FQ1RFRDsKKwkJCX0KKwkJCWlmICgoY3VyX2V2 ZW50LT5ldmVudHMgJiBXTF9TT0NLRVRfQUNDRVBUKSAmJgorCQkJCShyZXNFdmVudHMubE5l dHdvcmtFdmVudHMgJiBGRF9BQ0NFUFQpKQorCQkJeworCQkJCS8qIGluY29taW5nIGNvbm5l Y3Rpb24gY291bGQgYmUgYWNjZXB0ZWQgKi8KKwkJCQlvY2N1cnJlZF9ldmVudHMtPmV2ZW50 cyB8PSBXTF9TT0NLRVRfQUNDRVBUOworCQkJfQorCQkJaWYgKHJlc0V2ZW50cy5sTmV0d29y a0V2ZW50cyAmIEZEX0NMT1NFKQorCQkJeworCQkJCS8qIEVPRi9lcnJvciwgc28gc2lnbmFs IGFsbCBjYWxsZXItcmVxdWVzdGVkIHNvY2tldCBmbGFncyAqLworCQkJCW9jY3VycmVkX2V2 ZW50cy0+ZXZlbnRzIHw9IChjdXJfZXZlbnQtPmV2ZW50cyAmIFdMX1NPQ0tFVF9NQVNLKTsK KwkJCX0KKworCQkJaWYgKG9jY3VycmVkX2V2ZW50cy0+ZXZlbnRzICE9IDApCisJCQl7CisJ CQkJb2NjdXJyZWRfZXZlbnRzKys7CisJCQkJcmV0dXJuZWRfZXZlbnRzKys7CisJCQl9CisJ CX0KKworCQkvKiBJcyB0aGUgb3V0cHV0IGJ1ZmZlciBmdWxsPyAqLworCQlpZiAocmV0dXJu ZWRfZXZlbnRzID09IG5ldmVudHMpCisJCQlicmVhazsKKworCQkvKiBIYXZlIHdlIHJ1biBv dXQgb2YgcG9zc2libGUgZXZlbnRzPyAqLworCQluZXh0X3BvcyA9IGN1cl9ldmVudC0+cG9z ICsgMTsKKwkJaWYgKG5leHRfcG9zID09IHNldC0+bmV2ZW50cykKKwkJCWJyZWFrOworCisJ CS8qCisJCSAqIFBvbGwgdGhlIHJlc3Qgb2YgdGhlIGV2ZW50IGhhbmRsZXMgaW4gdGhlIGFy cmF5IHN0YXJ0aW5nIGF0CisJCSAqIG5leHRfcG9zIGJlaW5nIGNhcmVmdWwgdG8gc2tpcCBv dmVyIHRoZSBpbml0aWFsIHNpZ25hbCBoYW5kbGUgdG9vLgorCQkgKiBUaGlzIHRpbWUgd2Ug dXNlIGEgemVybyB0aW1lb3V0LgorCQkgKi8KKwkJY291bnQgPSBzZXQtPm5ldmVudHMgLSBu ZXh0X3BvczsKKwkJcmMgPSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKGNvdW50LAorCQkJCQkJ CQkJc2V0LT5oYW5kbGVzICsgMSArIG5leHRfcG9zLAorCQkJCQkJCQkJZmFsc2UsCisJCQkJ CQkJCQkwKTsKKworCQkvKgorCQkgKiBXZSBkb24ndCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGVy cm9ycyBhbmQgV0FJVF9USU1FT1VUIGhlcmUgYmVjYXVzZQorCQkgKiB3ZSBhbHJlYWR5IGhh dmUgZXZlbnRzIHRvIHJlcG9ydC4KKwkJICovCisJCWlmIChyYyA8IFdBSVRfT0JKRUNUXzAg fHwgcmMgPj0gV0FJVF9PQkpFQ1RfMCArIGNvdW50KQorCQkJYnJlYWs7CisKKwkJLyogV2Ug aGF2ZSBhbm90aGVyIGV2ZW50IHRvIGRlY29kZS4gKi8KKwkJY3VyX2V2ZW50ID0gJnNldC0+ ZXZlbnRzW25leHRfcG9zICsgKHJjIC0gV0FJVF9PQkpFQ1RfMCldOworCX0KKworCXJldHVy biByZXR1cm5lZF9ldmVudHM7Cit9CisjZW5kaWYKKworLyoKKyAqIFJldHVybiB3aGV0aGVy IHRoZSBjdXJyZW50IGJ1aWxkIG9wdGlvbnMgY2FuIHJlcG9ydCBXTF9TT0NLRVRfQ0xPU0VE LgorICovCitib29sCitXYWl0RXZlbnRTZXRDYW5SZXBvcnRDbG9zZWQodm9pZCkKK3sKKyNp ZiAoZGVmaW5lZChXQUlUX1VTRV9QT0xMKSAmJiBkZWZpbmVkKFBPTExSREhVUCkpIHx8IFwK KwlkZWZpbmVkKFdBSVRfVVNFX0VQT0xMKSB8fCBcCisJZGVmaW5lZChXQUlUX1VTRV9LUVVF VUUpCisJcmV0dXJuIHRydWU7CisjZWxzZQorCXJldHVybiBmYWxzZTsKKyNlbmRpZgorfQor CisvKgorICogR2V0IHRoZSBudW1iZXIgb2Ygd2FpdCBldmVudHMgcmVnaXN0ZXJlZCBpbiBh IGdpdmVuIFdhaXRFdmVudFNldC4KKyAqLworaW50CitHZXROdW1SZWdpc3RlcmVkV2FpdEV2 ZW50cyhXYWl0RXZlbnRTZXQgKnNldCkKK3sKKwlyZXR1cm4gc2V0LT5uZXZlbnRzOworfQor CisjaWYgZGVmaW5lZChXQUlUX1VTRV9TRUxGX1BJUEUpCisKKy8qCisgKiBTZXRMYXRjaCB1 c2VzIFNJR1VSRyB0byB3YWtlIHVwIHRoZSBwcm9jZXNzIHdhaXRpbmcgb24gdGhlIGxhdGNo LgorICoKKyAqIFdha2UgdXAgV2FpdExhdGNoLCBpZiB3ZSdyZSB3YWl0aW5nLgorICovCitz dGF0aWMgdm9pZAorbGF0Y2hfc2lndXJnX2hhbmRsZXIoU0lHTkFMX0FSR1MpCit7CisJaWYg KHdhaXRpbmcpCisJCXNlbmRTZWxmUGlwZUJ5dGUoKTsKK30KKworLyogU2VuZCBvbmUgYnl0 ZSB0byB0aGUgc2VsZi1waXBlLCB0byB3YWtlIHVwIFdhaXRMYXRjaCAqLworc3RhdGljIHZv aWQKK3NlbmRTZWxmUGlwZUJ5dGUodm9pZCkKK3sKKwlpbnQJCQlyYzsKKwljaGFyCQlkdW1t eSA9IDA7CisKK3JldHJ5OgorCXJjID0gd3JpdGUoc2VsZnBpcGVfd3JpdGVmZCwgJmR1bW15 LCAxKTsKKwlpZiAocmMgPCAwKQorCXsKKwkJLyogSWYgaW50ZXJydXB0ZWQgYnkgc2lnbmFs LCBqdXN0IHJldHJ5ICovCisJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCWdvdG8gcmV0cnk7 CisKKwkJLyoKKwkJICogSWYgdGhlIHBpcGUgaXMgZnVsbCwgd2UgZG9uJ3QgbmVlZCB0byBy ZXRyeSwgdGhlIGRhdGEgdGhhdCdzIHRoZXJlCisJCSAqIGFscmVhZHkgaXMgZW5vdWdoIHRv IHdha2UgdXAgV2FpdExhdGNoLgorCQkgKi8KKwkJaWYgKGVycm5vID09IEVBR0FJTiB8fCBl cnJubyA9PSBFV09VTERCTE9DSykKKwkJCXJldHVybjsKKworCQkvKgorCQkgKiBPb3BzLCB0 aGUgd3JpdGUoKSBmYWlsZWQgZm9yIHNvbWUgb3RoZXIgcmVhc29uLiBXZSBtaWdodCBiZSBp biBhCisJCSAqIHNpZ25hbCBoYW5kbGVyLCBzbyBpdCdzIG5vdCBzYWZlIHRvIGVsb2coKS4g V2UgaGF2ZSBubyBjaG9pY2UgYnV0CisJCSAqIHNpbGVudGx5IGlnbm9yZSB0aGUgZXJyb3Iu CisJCSAqLworCQlyZXR1cm47CisJfQorfQorCisjZW5kaWYKKworI2lmIGRlZmluZWQoV0FJ VF9VU0VfU0VMRl9QSVBFKSB8fCBkZWZpbmVkKFdBSVRfVVNFX1NJR05BTEZEKQorCisvKgor ICogUmVhZCBhbGwgYXZhaWxhYmxlIGRhdGEgZnJvbSBzZWxmLXBpcGUgb3Igc2lnbmFsZmQu CisgKgorICogTm90ZTogdGhpcyBpcyBvbmx5IGNhbGxlZCB3aGVuIHdhaXRpbmcgPSB0cnVl LiAgSWYgaXQgZmFpbHMgYW5kIGRvZXNuJ3QKKyAqIHJldHVybiwgaXQgbXVzdCByZXNldCB0 aGF0IGZsYWcgZmlyc3QgKHRob3VnaCBpZGVhbGx5LCB0aGlzIHdpbGwgbmV2ZXIKKyAqIGhh cHBlbikuCisgKi8KK3N0YXRpYyB2b2lkCitkcmFpbih2b2lkKQoreworCWNoYXIJCWJ1Zlsx MDI0XTsKKwlpbnQJCQlyYzsKKwlpbnQJCQlmZDsKKworI2lmZGVmIFdBSVRfVVNFX1NFTEZf UElQRQorCWZkID0gc2VsZnBpcGVfcmVhZGZkOworI2Vsc2UKKwlmZCA9IHNpZ25hbF9mZDsK KyNlbmRpZgorCisJZm9yICg7OykKKwl7CisJCXJjID0gcmVhZChmZCwgYnVmLCBzaXplb2Yo YnVmKSk7CisJCWlmIChyYyA8IDApCisJCXsKKwkJCWlmIChlcnJubyA9PSBFQUdBSU4gfHwg ZXJybm8gPT0gRVdPVUxEQkxPQ0spCisJCQkJYnJlYWs7CQkJLyogdGhlIGRlc2NyaXB0b3Ig aXMgZW1wdHkgKi8KKwkJCWVsc2UgaWYgKGVycm5vID09IEVJTlRSKQorCQkJCWNvbnRpbnVl OwkJLyogcmV0cnkgKi8KKwkJCWVsc2UKKwkJCXsKKwkJCQl3YWl0aW5nID0gZmFsc2U7Cisj aWZkZWYgV0FJVF9VU0VfU0VMRl9QSVBFCisJCQkJZWxvZyhFUlJPUiwgInJlYWQoKSBvbiBz ZWxmLXBpcGUgZmFpbGVkOiAlbSIpOworI2Vsc2UKKwkJCQllbG9nKEVSUk9SLCAicmVhZCgp IG9uIHNpZ25hbGZkIGZhaWxlZDogJW0iKTsKKyNlbmRpZgorCQkJfQorCQl9CisJCWVsc2Ug aWYgKHJjID09IDApCisJCXsKKwkJCXdhaXRpbmcgPSBmYWxzZTsKKyNpZmRlZiBXQUlUX1VT RV9TRUxGX1BJUEUKKwkJCWVsb2coRVJST1IsICJ1bmV4cGVjdGVkIEVPRiBvbiBzZWxmLXBp cGUiKTsKKyNlbHNlCisJCQllbG9nKEVSUk9SLCAidW5leHBlY3RlZCBFT0Ygb24gc2lnbmFs ZmQiKTsKKyNlbmRpZgorCQl9CisJCWVsc2UgaWYgKHJjIDwgc2l6ZW9mKGJ1ZikpCisJCXsK KwkJCS8qIHdlIHN1Y2Nlc3NmdWxseSBkcmFpbmVkIHRoZSBwaXBlOyBubyBuZWVkIHRvIHJl YWQoKSBhZ2FpbiAqLworCQkJYnJlYWs7CisJCX0KKwkJLyogZWxzZSBidWZmZXIgd2Fzbid0 IGJpZyBlbm91Z2gsIHNvIHJlYWQgYWdhaW4gKi8KKwl9Cit9CisKKyNlbmRpZgorCitzdGF0 aWMgdm9pZAorUmVzT3duZXJSZWxlYXNlV2FpdEV2ZW50U2V0KERhdHVtIHJlcykKK3sKKwlX YWl0RXZlbnRTZXQgKnNldCA9IChXYWl0RXZlbnRTZXQgKikgRGF0dW1HZXRQb2ludGVyKHJl cyk7CisKKwlBc3NlcnQoc2V0LT5vd25lciAhPSBOVUxMKTsKKwlzZXQtPm93bmVyID0gTlVM TDsKKwlGcmVlV2FpdEV2ZW50U2V0KHNldCk7Cit9CisKKy8qCisgKiBXYWtlIHVwIG15IHBy b2Nlc3MgaWYgaXQncyBjdXJyZW50bHkgd2FpdGluZyBvbiBhIFdhaXRFdmVudFNldC4KKyAq CisgKiBOQjogYmUgc3VyZSB0byBzYXZlIGFuZCByZXN0b3JlIGVycm5vIGFyb3VuZCBpdC4g IChUaGF0J3Mgc3RhbmRhcmQgcHJhY3RpY2UKKyAqIGluIG1vc3Qgc2lnbmFsIGhhbmRsZXJz LCBvZiBjb3Vyc2UsIGJ1dCB3ZSB1c2VkIHRvIG9taXQgaXQgaW4gaGFuZGxlcnMgdGhhdAor ICogb25seSBzZXQgYSBmbGFnLikgWFhYCisgICoKKyAqIE5COiB0aGlzIGZ1bmN0aW9uIGlz IGNhbGxlZCBmcm9tIGNyaXRpY2FsIHNlY3Rpb25zIGFuZCBzaWduYWwgaGFuZGxlcnMgc28K KyAqIHRocm93aW5nIGFuIGVycm9yIGlzIG5vdCBhIGdvb2QgaWRlYS4KKyAqLwordm9pZAor V2FrZXVwTXlQcm9jKHZvaWQpCit7CisjaWYgZGVmaW5lZChXQUlUX1VTRV9TRUxGX1BJUEUp CisJaWYgKHdhaXRpbmcpCisJCXNlbmRTZWxmUGlwZUJ5dGUoKTsKKyNlbHNlCisJaWYgKHdh aXRpbmcpCisJCWtpbGwoTXlQcm9jUGlkLCBTSUdVUkcpOworI2VuZGlmCit9CisKKy8qCisg KiBXYWtlIHVwIGFub3RoZXIgcHJvY2VzcyBpZiBpdCdzIGN1cnJlbnRseSB3YWl0aW5nLgor ICovCit2b2lkCitXYWtldXBPdGhlclByb2MoaW50IHBpZCkKK3sKKwlraWxsKHBpZCwgU0lH VVJHKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2luaXQvbWlzY2luaXQu YyBiL3NyYy9iYWNrZW5kL3V0aWxzL2luaXQvbWlzY2luaXQuYwppbmRleCAwMzQ3ZmMxMTA5 Mi4uZGMzNTIxNDU3YzcgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2luaXQvbWlz Y2luaXQuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9pbml0L21pc2Npbml0LmMKQEAgLTEy Nyw3ICsxMjcsNyBAQCBJbml0UG9zdG1hc3RlckNoaWxkKHZvaWQpCiAjZW5kaWYKIAogCS8q IEluaXRpYWxpemUgcHJvY2Vzcy1sb2NhbCBsYXRjaCBzdXBwb3J0ICovCi0JSW5pdGlhbGl6 ZUxhdGNoU3VwcG9ydCgpOworCUluaXRpYWxpemVXYWl0RXZlbnRTdXBwb3J0KCk7CiAJSW5p dFByb2Nlc3NMb2NhbExhdGNoKCk7CiAJSW5pdGlhbGl6ZUxhdGNoV2FpdFNldCgpOwogCkBA IC0xODgsNyArMTg4LDcgQEAgSW5pdFN0YW5kYWxvbmVQcm9jZXNzKGNvbnN0IGNoYXIgKmFy Z3YwKQogCUluaXRQcm9jZXNzR2xvYmFscygpOwogCiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNz LWxvY2FsIGxhdGNoIHN1cHBvcnQgKi8KLQlJbml0aWFsaXplTGF0Y2hTdXBwb3J0KCk7CisJ SW5pdGlhbGl6ZVdhaXRFdmVudFN1cHBvcnQoKTsKIAlJbml0UHJvY2Vzc0xvY2FsTGF0Y2go KTsKIAlJbml0aWFsaXplTGF0Y2hXYWl0U2V0KCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9pbmNs dWRlL3N0b3JhZ2UvbGF0Y2guaCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2UvbGF0Y2guaAppbmRl eCA2NmU3YTViN2MwOC4uNWFmMzI2MjFjMGQgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3N0 b3JhZ2UvbGF0Y2guaAorKysgYi9zcmMvaW5jbHVkZS9zdG9yYWdlL2xhdGNoLmgKQEAgLTg0 LDEwICs4NCwxMSBAQAogICogdXNlIG9mIGFueSBnZW5lcmljIGhhbmRsZXIuCiAgKgogICoK LSAqIFdhaXRFdmVudFNldHMgYWxsb3cgdG8gd2FpdCBmb3IgbGF0Y2hlcyBiZWluZyBzZXQg YW5kIGFkZGl0aW9uYWwgZXZlbnRzIC0KLSAqIHBvc3RtYXN0ZXIgZHlpbmcgYW5kIHNvY2tl dCByZWFkaW5lc3Mgb2Ygc2V2ZXJhbCBzb2NrZXRzIGN1cnJlbnRseSAtIGF0IHRoZQotICog c2FtZSB0aW1lLiAgT24gbWFueSBwbGF0Zm9ybXMgdXNpbmcgYSBsb25nIGxpdmVkIGV2ZW50 IHNldCBpcyBtb3JlCi0gKiBlZmZpY2llbnQgdGhhbiB1c2luZyBXYWl0TGF0Y2ggb3IgV2Fp dExhdGNoT3JTb2NrZXQuCisgKiBTZWUgYWxzbyBXYWl0RXZlbnRTZXRzIGluIHdhaXRldmVu dHNldC5oLiBUaGV5IGFsbG93IHRvIHdhaXQgZm9yIGxhdGNoZXMKKyAqIGJlaW5nIHNldCBh bmQgYWRkaXRpb25hbCBldmVudHMgLSBwb3N0bWFzdGVyIGR5aW5nIGFuZCBzb2NrZXQgcmVh ZGluZXNzIG9mCisgKiBzZXZlcmFsIHNvY2tldHMgY3VycmVudGx5IC0gYXQgdGhlIHNhbWUg dGltZS4gIE9uIG1hbnkgcGxhdGZvcm1zIHVzaW5nIGEKKyAqIGxvbmcgbGl2ZWQgZXZlbnQg c2V0IGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gdXNpbmcgV2FpdExhdGNoIG9yCisgKiBXYWl0 TGF0Y2hPclNvY2tldC4KICAqCiAgKgogICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk2 LTIwMjUsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3VwCkBAIC0xMDIsNiAr MTAzLDcgQEAKIAogI2luY2x1ZGUgPHNpZ25hbC5oPgogCisjaW5jbHVkZSAic3RvcmFnZS93 YWl0ZXZlbnRzZXQuaCIKICNpbmNsdWRlICJ1dGlscy9yZXNvd25lci5oIgogCiAvKgpAQCAt MTIwLDUzICsxMjIsOSBAQCB0eXBlZGVmIHN0cnVjdCBMYXRjaAogI2VuZGlmCiB9IExhdGNo OwogCi0vKgotICogQml0bWFza3MgZm9yIGV2ZW50cyB0aGF0IG1heSB3YWtlLXVwIFdhaXRM YXRjaCgpLCBXYWl0TGF0Y2hPclNvY2tldCgpLCBvcgotICogV2FpdEV2ZW50U2V0V2FpdCgp LgotICovCi0jZGVmaW5lIFdMX0xBVENIX1NFVAkJICgxIDw8IDApCi0jZGVmaW5lIFdMX1NP Q0tFVF9SRUFEQUJMRQkgKDEgPDwgMSkKLSNkZWZpbmUgV0xfU09DS0VUX1dSSVRFQUJMRSAg KDEgPDwgMikKLSNkZWZpbmUgV0xfVElNRU9VVAkJCSAoMSA8PCAzKQkvKiBub3QgZm9yIFdh aXRFdmVudFNldFdhaXQoKSAqLwotI2RlZmluZSBXTF9QT1NUTUFTVEVSX0RFQVRIICAoMSA8 PCA0KQotI2RlZmluZSBXTF9FWElUX09OX1BNX0RFQVRICSAoMSA8PCA1KQotI2lmZGVmIFdJ TjMyCi0jZGVmaW5lIFdMX1NPQ0tFVF9DT05ORUNURUQgICgxIDw8IDYpCi0jZWxzZQotLyog YXZvaWQgaGF2aW5nIHRvIGRlYWwgd2l0aCBjYXNlIG9uIHBsYXRmb3JtcyBub3QgcmVxdWly aW5nIGl0ICovCi0jZGVmaW5lIFdMX1NPQ0tFVF9DT05ORUNURUQgIFdMX1NPQ0tFVF9XUklU RUFCTEUKLSNlbmRpZgotI2RlZmluZSBXTF9TT0NLRVRfQ0xPU0VEIAkgKDEgPDwgNykKLSNp ZmRlZiBXSU4zMgotI2RlZmluZSBXTF9TT0NLRVRfQUNDRVBUCSAoMSA8PCA4KQotI2Vsc2UK LS8qIGF2b2lkIGhhdmluZyB0byBkZWFsIHdpdGggY2FzZSBvbiBwbGF0Zm9ybXMgbm90IHJl cXVpcmluZyBpdCAqLwotI2RlZmluZSBXTF9TT0NLRVRfQUNDRVBUCVdMX1NPQ0tFVF9SRUFE QUJMRQotI2VuZGlmCi0jZGVmaW5lIFdMX1NPQ0tFVF9NQVNLCQkoV0xfU09DS0VUX1JFQURB QkxFIHwgXAotCQkJCQkJCSBXTF9TT0NLRVRfV1JJVEVBQkxFIHwgXAotCQkJCQkJCSBXTF9T T0NLRVRfQ09OTkVDVEVEIHwgXAotCQkJCQkJCSBXTF9TT0NLRVRfQUNDRVBUIHwgXAotCQkJ CQkJCSBXTF9TT0NLRVRfQ0xPU0VEKQotCi10eXBlZGVmIHN0cnVjdCBXYWl0RXZlbnQKLXsK LQlpbnQJCQlwb3M7CQkJLyogcG9zaXRpb24gaW4gdGhlIGV2ZW50IGRhdGEgc3RydWN0dXJl ICovCi0JdWludDMyCQlldmVudHM7CQkJLyogdHJpZ2dlcmVkIGV2ZW50cyAqLwotCXBnc29j a2V0CWZkOwkJCQkvKiBzb2NrZXQgZmQgYXNzb2NpYXRlZCB3aXRoIGV2ZW50ICovCi0Jdm9p ZAkgICAqdXNlcl9kYXRhOwkJLyogcG9pbnRlciBwcm92aWRlZCBpbiBBZGRXYWl0RXZlbnRU b1NldCAqLwotI2lmZGVmIFdJTjMyCi0JYm9vbAkJcmVzZXQ7CQkJLyogSXMgcmVzZXQgb2Yg dGhlIGV2ZW50IHJlcXVpcmVkPyAqLwotI2VuZGlmCi19IFdhaXRFdmVudDsKLQotLyogZm9y d2FyZCBkZWNsYXJhdGlvbiB0byBhdm9pZCBleHBvc2luZyBsYXRjaC5jIGltcGxlbWVudGF0 aW9uIGRldGFpbHMgKi8KLXR5cGVkZWYgc3RydWN0IFdhaXRFdmVudFNldCBXYWl0RXZlbnRT ZXQ7Ci0KIC8qCiAgKiBwcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgaW4gbGF0Y2guYwogICov Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplTGF0Y2hTdXBwb3J0KHZvaWQpOwogZXh0ZXJuIHZv aWQgSW5pdExhdGNoKExhdGNoICpsYXRjaCk7CiBleHRlcm4gdm9pZCBJbml0U2hhcmVkTGF0 Y2goTGF0Y2ggKmxhdGNoKTsKIGV4dGVybiB2b2lkIE93bkxhdGNoKExhdGNoICpsYXRjaCk7 CkBAIC0xNzQsMjIgKzEzMiwxMCBAQCBleHRlcm4gdm9pZCBEaXNvd25MYXRjaChMYXRjaCAq bGF0Y2gpOwogZXh0ZXJuIHZvaWQgU2V0TGF0Y2goTGF0Y2ggKmxhdGNoKTsKIGV4dGVybiB2 b2lkIFJlc2V0TGF0Y2goTGF0Y2ggKmxhdGNoKTsKIAotZXh0ZXJuIFdhaXRFdmVudFNldCAq Q3JlYXRlV2FpdEV2ZW50U2V0KFJlc291cmNlT3duZXIgcmVzb3duZXIsIGludCBuZXZlbnRz KTsKLWV4dGVybiB2b2lkIEZyZWVXYWl0RXZlbnRTZXQoV2FpdEV2ZW50U2V0ICpzZXQpOwot ZXh0ZXJuIHZvaWQgRnJlZVdhaXRFdmVudFNldEFmdGVyRm9yayhXYWl0RXZlbnRTZXQgKnNl dCk7Ci1leHRlcm4gaW50CUFkZFdhaXRFdmVudFRvU2V0KFdhaXRFdmVudFNldCAqc2V0LCB1 aW50MzIgZXZlbnRzLCBwZ3NvY2tldCBmZCwKLQkJCQkJCQkgIExhdGNoICpsYXRjaCwgdm9p ZCAqdXNlcl9kYXRhKTsKLWV4dGVybiB2b2lkIE1vZGlmeVdhaXRFdmVudChXYWl0RXZlbnRT ZXQgKnNldCwgaW50IHBvcywgdWludDMyIGV2ZW50cywgTGF0Y2ggKmxhdGNoKTsKLQotZXh0 ZXJuIGludAlXYWl0RXZlbnRTZXRXYWl0KFdhaXRFdmVudFNldCAqc2V0LCBsb25nIHRpbWVv dXQsCi0JCQkJCQkJIFdhaXRFdmVudCAqb2NjdXJyZWRfZXZlbnRzLCBpbnQgbmV2ZW50cywK LQkJCQkJCQkgdWludDMyIHdhaXRfZXZlbnRfaW5mbyk7CiBleHRlcm4gaW50CVdhaXRMYXRj aChMYXRjaCAqbGF0Y2gsIGludCB3YWtlRXZlbnRzLCBsb25nIHRpbWVvdXQsCiAJCQkJCSAg dWludDMyIHdhaXRfZXZlbnRfaW5mbyk7CiBleHRlcm4gaW50CVdhaXRMYXRjaE9yU29ja2V0 KExhdGNoICpsYXRjaCwgaW50IHdha2VFdmVudHMsCiAJCQkJCQkJICBwZ3NvY2tldCBzb2Nr LCBsb25nIHRpbWVvdXQsIHVpbnQzMiB3YWl0X2V2ZW50X2luZm8pOwogZXh0ZXJuIHZvaWQg SW5pdGlhbGl6ZUxhdGNoV2FpdFNldCh2b2lkKTsKLWV4dGVybiBpbnQJR2V0TnVtUmVnaXN0 ZXJlZFdhaXRFdmVudHMoV2FpdEV2ZW50U2V0ICpzZXQpOwotZXh0ZXJuIGJvb2wgV2FpdEV2 ZW50U2V0Q2FuUmVwb3J0Q2xvc2VkKHZvaWQpOwogCiAjZW5kaWYJCQkJCQkJLyogTEFUQ0hf SCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvc3RvcmFnZS93YWl0ZXZlbnRzZXQuaCBi L3NyYy9pbmNsdWRlL3N0b3JhZ2Uvd2FpdGV2ZW50c2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMDAwMDAuLjAyMjk2MGZlODg4Ci0tLSAvZGV2L251bGwKKysrIGIv c3JjL2luY2x1ZGUvc3RvcmFnZS93YWl0ZXZlbnRzZXQuaApAQCAtMCwwICsxLDk1IEBACisv Ki0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiB3YWl0ZXZlbnRzZXQuaAorICoJCXBwb2xs KCkgLyBwc2VsZWN0KCkgbGlrZSBpbnRlcmZhY2UgZm9yIHdhaXRpbmcgZm9yIGV2ZW50cwor ICoKKyAqIFdhaXRFdmVudFNldHMgYWxsb3cgdG8gd2FpdCBmb3IgbGF0Y2hlcyBiZWluZyBz ZXQgYW5kIGFkZGl0aW9uYWwgZXZlbnRzIC0KKyAqIHBvc3RtYXN0ZXIgZHlpbmcgYW5kIHNv Y2tldCByZWFkaW5lc3Mgb2Ygc2V2ZXJhbCBzb2NrZXRzIGN1cnJlbnRseSAtIGF0IHRoZQor ICogc2FtZSB0aW1lLiAgT24gbWFueSBwbGF0Zm9ybXMgdXNpbmcgYSBsb25nIGxpdmVkIGV2 ZW50IHNldCBpcyBtb3JlCisgKiBlZmZpY2llbnQgdGhhbiB1c2luZyBXYWl0SW50ZXJydXB0 IG9yIFdhaXRJbnRlcnJ1cHRPclNvY2tldC4KKyAqCisgKiBXYWl0RXZlbnRTZXRXYWl0IGlu Y2x1ZGVzIGEgcHJvdmlzaW9uIGZvciB0aW1lb3V0cyAod2hpY2ggc2hvdWxkIGJlIGF2b2lk ZWQKKyAqIHdoZW4gcG9zc2libGUsIGFzIHRoZXkgaW5jdXIgZXh0cmEgb3ZlcmhlYWQpIGFu ZCBhIHByb3Zpc2lvbiBmb3IgcG9zdG1hc3RlcgorICogY2hpbGQgcHJvY2Vzc2VzIHRvIHdh a2UgdXAgaW1tZWRpYXRlbHkgb24gcG9zdG1hc3RlciBkZWF0aC4gIFNlZQorICogc3RvcmFn ZS9pcGMvd2FpdGV2ZW50c2V0LmMgZm9yIGRldGFpbGVkIHNwZWNpZmljYXRpb25zIGZvciB0 aGUgZXhwb3J0ZWQKKyAqIGZ1bmN0aW9ucy4KKyAqCisgKgorICogUG9ydGlvbnMgQ29weXJp Z2h0IChjKSAxOTk2LTIwMjQsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3Vw CisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTQsIFJlZ2VudHMgb2YgdGhlIFVuaXZl cnNpdHkgb2YgQ2FsaWZvcm5pYQorICoKKyAqIHNyYy9pbmNsdWRlL3N0b3JhZ2Uvd2FpdGV2 ZW50c2V0LmgKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmbmRlZiBXQUlU RVZFTlRTRVRfSAorI2RlZmluZSBXQUlURVZFTlRTRVRfSAorCisjaW5jbHVkZSAidXRpbHMv cmVzb3duZXIuaCIKKworLyoKKyAqIEJpdG1hc2tzIGZvciBldmVudHMgdGhhdCBtYXkgd2Fr ZS11cCBXYWl0TGF0Y2goKSwgV2FpdExhdGNoT3JTb2NrZXQoKSwgb3IKKyAqIFdhaXRFdmVu dFNldFdhaXQoKS4KKyAqLworI2RlZmluZSBXTF9MQVRDSF9TRVQJCSAoMSA8PCAwKQorI2Rl ZmluZSBXTF9TT0NLRVRfUkVBREFCTEUJICgxIDw8IDEpCisjZGVmaW5lIFdMX1NPQ0tFVF9X UklURUFCTEUgICgxIDw8IDIpCisjZGVmaW5lIFdMX1RJTUVPVVQJCQkgKDEgPDwgMykJLyog bm90IGZvciBXYWl0RXZlbnRTZXRXYWl0KCkgKi8KKyNkZWZpbmUgV0xfUE9TVE1BU1RFUl9E RUFUSCAgKDEgPDwgNCkKKyNkZWZpbmUgV0xfRVhJVF9PTl9QTV9ERUFUSAkgKDEgPDwgNSkK KyNpZmRlZiBXSU4zMgorI2RlZmluZSBXTF9TT0NLRVRfQ09OTkVDVEVEICAoMSA8PCA2KQor I2Vsc2UKKy8qIGF2b2lkIGhhdmluZyB0byBkZWFsIHdpdGggY2FzZSBvbiBwbGF0Zm9ybXMg bm90IHJlcXVpcmluZyBpdCAqLworI2RlZmluZSBXTF9TT0NLRVRfQ09OTkVDVEVEICBXTF9T T0NLRVRfV1JJVEVBQkxFCisjZW5kaWYKKyNkZWZpbmUgV0xfU09DS0VUX0NMT1NFRCAJICgx IDw8IDcpCisjaWZkZWYgV0lOMzIKKyNkZWZpbmUgV0xfU09DS0VUX0FDQ0VQVAkgKDEgPDwg OCkKKyNlbHNlCisvKiBhdm9pZCBoYXZpbmcgdG8gZGVhbCB3aXRoIGNhc2Ugb24gcGxhdGZv cm1zIG5vdCByZXF1aXJpbmcgaXQgKi8KKyNkZWZpbmUgV0xfU09DS0VUX0FDQ0VQVAlXTF9T T0NLRVRfUkVBREFCTEUKKyNlbmRpZgorI2RlZmluZSBXTF9TT0NLRVRfTUFTSwkJKFdMX1NP Q0tFVF9SRUFEQUJMRSB8IFwKKwkJCQkJCQkgV0xfU09DS0VUX1dSSVRFQUJMRSB8IFwKKwkJ CQkJCQkgV0xfU09DS0VUX0NPTk5FQ1RFRCB8IFwKKwkJCQkJCQkgV0xfU09DS0VUX0FDQ0VQ VCB8IFwKKwkJCQkJCQkgV0xfU09DS0VUX0NMT1NFRCkKKwordHlwZWRlZiBzdHJ1Y3QgV2Fp dEV2ZW50Cit7CisJaW50CQkJcG9zOwkJCS8qIHBvc2l0aW9uIGluIHRoZSBldmVudCBkYXRh IHN0cnVjdHVyZSAqLworCXVpbnQzMgkJZXZlbnRzOwkJCS8qIHRyaWdnZXJlZCBldmVudHMg Ki8KKwlwZ3NvY2tldAlmZDsJCQkJLyogc29ja2V0IGZkIGFzc29jaWF0ZWQgd2l0aCBldmVu dCAqLworCXZvaWQJICAgKnVzZXJfZGF0YTsJCS8qIHBvaW50ZXIgcHJvdmlkZWQgaW4gQWRk V2FpdEV2ZW50VG9TZXQgKi8KKyNpZmRlZiBXSU4zMgorCWJvb2wJCXJlc2V0OwkJCS8qIElz IHJlc2V0IG9mIHRoZSBldmVudCByZXF1aXJlZD8gKi8KKyNlbmRpZgorfSBXYWl0RXZlbnQ7 CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zIHRvIGF2b2lkIGV4cG9zaW5nIHdhaXRldmVu dHNldC5jIGltcGxlbWVudGF0aW9uIGRldGFpbHMgKi8KK3R5cGVkZWYgc3RydWN0IFdhaXRF dmVudFNldCBXYWl0RXZlbnRTZXQ7CisKK3R5cGVkZWYgc3RydWN0IExhdGNoIExhdGNoOwor CisvKgorICogcHJvdG90eXBlcyBmb3IgZnVuY3Rpb25zIGluIHdhaXRldmVudHNldC5jCisg Ki8KK2V4dGVybiB2b2lkIEluaXRpYWxpemVXYWl0RXZlbnRTdXBwb3J0KHZvaWQpOworCitl eHRlcm4gV2FpdEV2ZW50U2V0ICpDcmVhdGVXYWl0RXZlbnRTZXQoUmVzb3VyY2VPd25lciBy ZXNvd25lciwgaW50IG5ldmVudHMpOworZXh0ZXJuIHZvaWQgRnJlZVdhaXRFdmVudFNldChX YWl0RXZlbnRTZXQgKnNldCk7CitleHRlcm4gdm9pZCBGcmVlV2FpdEV2ZW50U2V0QWZ0ZXJG b3JrKFdhaXRFdmVudFNldCAqc2V0KTsKK2V4dGVybiBpbnQJQWRkV2FpdEV2ZW50VG9TZXQo V2FpdEV2ZW50U2V0ICpzZXQsIHVpbnQzMiBldmVudHMsIHBnc29ja2V0IGZkLAorCQkJCQkJ CSAgTGF0Y2ggKmxhdGNoLCB2b2lkICp1c2VyX2RhdGEpOworZXh0ZXJuIHZvaWQgTW9kaWZ5 V2FpdEV2ZW50KFdhaXRFdmVudFNldCAqc2V0LCBpbnQgcG9zLCB1aW50MzIgZXZlbnRzLCBM YXRjaCAqbGF0Y2gpOworZXh0ZXJuIGludAlXYWl0RXZlbnRTZXRXYWl0KFdhaXRFdmVudFNl dCAqc2V0LCBsb25nIHRpbWVvdXQsCisJCQkJCQkJIFdhaXRFdmVudCAqb2NjdXJyZWRfZXZl bnRzLCBpbnQgbmV2ZW50cywKKwkJCQkJCQkgdWludDMyIHdhaXRfZXZlbnRfaW5mbyk7Citl eHRlcm4gaW50CUdldE51bVJlZ2lzdGVyZWRXYWl0RXZlbnRzKFdhaXRFdmVudFNldCAqc2V0 KTsKK2V4dGVybiBib29sIFdhaXRFdmVudFNldENhblJlcG9ydENsb3NlZCh2b2lkKTsKKwor ZXh0ZXJuIHZvaWQgV2FrZXVwTXlQcm9jKHZvaWQpOworZXh0ZXJuIHZvaWQgV2FrZXVwT3Ro ZXJQcm9jKGludCBwaWQpOworCisjZW5kaWYJCQkJCQkJLyogV0FJVEVWRU5UU0VUX0ggKi8K LS0gCjIuMzkuNQoK --------------mVkSiBgK9Ifd07vj1V0lbHJ9--