From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by gabe.freedesktop.org (Postfix) with ESMTPS id ECE256E5CC for ; Wed, 17 Mar 2021 14:46:47 +0000 (UTC) From: =?UTF-8?q?Zbigniew=20Kempczy=C5=84ski?= Date: Wed, 17 Mar 2021 15:45:43 +0100 Message-Id: <20210317144610.108372-9-zbigniew.kempczynski@intel.com> In-Reply-To: <20210317144610.108372-1-zbigniew.kempczynski@intel.com> References: <20210317144610.108372-1-zbigniew.kempczynski@intel.com> MIME-Version: 1.0 Subject: [igt-dev] [PATCH i-g-t v26 08/35] lib/intel_allocator: Add intel_allocator core List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: igt-dev@lists.freedesktop.org List-ID: Rm9yIGRpc2NyZXRlIGdlbnMgd2UgaGF2ZSB0byBjZWFzZSBvZiB1c2luZyByZWxvY2F0aW9ucyB3 aGVuIGJhdGNoCmJ1ZmZlcnMgYXJlIHN1Ym1pdHRlZCB0byBHUFUuIE9uIGNhcmRzIHdoaWNoIGhh dmUgcHBndHQgd2UgY2FuIHVzZQpzb2Z0cGluIGVzdGFibGlzaGluZyBhZGRyZXNzZXMgb24gb3Vy IG93bi4KCldlIGFkZGVkIHNpbXBsZSBhbGxvY2F0b3IgKHRha2VuIGZyb20gTWVzYTsgd29ya3Mg b24gbGlzdHMpIGFuZApyYW5kb20gYWxsb2NhdG9yIHRvIGV4ZXJjaXNlIGJhdGNoZXMgd2l0aCBk aWZmZXJlbnQgYWRkcmVzc2VzLiBBbGwKb2YgdGhhdCB3b3JrcyBmb3Igc2luZ2xlIFZNIChjb250 ZXh0KSBzbyB3ZSBoYXZlIHRvIGFkZCBhZGRpdGlvbmFsCmxheWVyIChpbnRlbF9hbGxvY2F0b3Ip IHRvIHN1cHBvcnQgbXVsdGlwcm9jZXNzaW5nIC8gbXVsdGl0aHJlYWRpbmcuCgpGb3IgbWFpbiBJ R1QgcHJvY2VzcyAoYWxzbyBmb3IgdGhyZWFkcyBjcmVhdGVkIGluIGl0KSBpbnRlbF9hbGxvY2F0 b3IKcmVzb2x2ZXMgYWRkcmVzc2VzICJsb2NhbGx5IiwganVzdCBieSBtdXRleGluZyBhY2Nlc3Mg dG8gZ2xvYmFsCmFsbG9jYXRvciBkYXRhIChjdHgvdm0gbWFwKS4gV2hlbiBmb3JrKCkgaXMgaW4g dXNlIGNoaWxkcmVuIGNhbm5vdAplc3RhYmxpc2ggYWRkcmVzc2VzIG9uIHRoZXkgb3duIGFuZCBo YXZlIHRvIGNvbnRhY3QgdG8gdGhlIHRocmVhZApzcGF3bmVkIHdpdGhpbiBtYWluIElHVCBwcm9j ZXNzLiBDdXJyZW50bHkgU3lzViBJUEMgbWVzc2FnZSBxdWV1ZSB3YXMKY2hvc2VuIGFzIGEgY29t bXVuaWNhdGlvbiBjaGFubmVsIGJldHdlZW4gY2hpbGRyZW4gYW5kIGFsbG9jYXRvciB0aHJlYWQu CkNoaWxkIGNhbGxzIHNhbWUgZnVuY3Rpb25zIGFzIG1haW4gSUdUIHByb2Nlc3MsIG9ubHkgY29t bXVuaWNhdGlvbiBwYXRoCndpbGwgYmUgY2hvc2VuIGluc3RlYWQgb2YgYWNxdWlyaW5nIGFkZHJl c3NlcyBsb2NhbGx5LgoKdjI6CgpBZGQgaW50ZWxfYWxsb2NhdG9yX29wZW5fZnVsbCgpIHRvIGFs bG93IHVzZXIgcGFzcyB2bSByYW5nZS4KQWRkIHN0cmF0ZWd5OiBOT05FLCBMT1dfVE9fSElHSCwg SElHSF9UT19MT1cgcGFzc2VkIHRvIGFsbG9jYXRvciBiYWNrZW5kLgoKdjM6CgpDaGlsZCBpcyBu b3cgYWJsZSB0byB1c2UgYWxsb2NhdG9yIGRpcmVjdGx5IGFzIHN0YW5kYWxvbmUuIEl0IG9ubHkg bmVlZAp0byBjYWxsIGludGVsX2FsbG9jYXRvcl9pbml0KCkgdG8gcmVpbml0aWFsaXplIGFwcHJv cHJpYXRlIHN0cnVjdHVyZXMuCgp2NDoKCkFkZCBwc2V1ZG8gYWxsb2NhdG9yIC0gSU5URUxfQUxM T0NBVE9SX1JFTE9DIHdoaWNoIGp1c3QgaW5jcmVtZW50cwpvZmZzZXRzIHRvIGF2b2lkIHVubmVj ZXNzYXJ5IGNvbmRpdGlvbmFsIGNvZGUuCgpTaWduZWQtb2ZmLWJ5OiBaYmlnbmlldyBLZW1wY3p5 xYRza2kgPHpiaWduaWV3LmtlbXBjenluc2tpQGludGVsLmNvbT4KU2lnbmVkLW9mZi1ieTogRG9t aW5payBHcnplZ29yemVrIDxkb21pbmlrLmdyemVnb3J6ZWtAaW50ZWwuY29tPgpDYzogQ2hyaXMg V2lsc29uIDxjaHJpc0BjaHJpcy13aWxzb24uY28udWs+CkNjOiBQZXRyaSBMYXR2YWxhIDxwZXRy aS5sYXR2YWxhQGludGVsLmNvbT4KLS0tCiAuLi4vaWd0LWdwdS10b29scy9pZ3QtZ3B1LXRvb2xz LWRvY3MueG1sICAgICAgfCAgICAxICsKIGxpYi9NYWtlZmlsZS5zb3VyY2VzICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAgIDYgKwogbGliL2lndF9jb3JlLmMgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAxNCArCiBsaWIvaW50ZWxfYWxsb2NhdG9yLmMgICAgICAgICAgICAg ICAgICAgICAgICAgfCAxMzE5ICsrKysrKysrKysrKysrKysrCiBsaWIvaW50ZWxfYWxsb2NhdG9y LmggICAgICAgICAgICAgICAgICAgICAgICAgfCAgMjIwICsrKwogbGliL2ludGVsX2FsbG9jYXRv cl9tc2djaGFubmVsLmMgICAgICAgICAgICAgIHwgIDE4NyArKysKIGxpYi9pbnRlbF9hbGxvY2F0 b3JfbXNnY2hhbm5lbC5oICAgICAgICAgICAgICB8ICAxNTYgKysKIGxpYi9tZXNvbi5idWlsZCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDUgKwogOCBmaWxlcyBjaGFuZ2VkLCAx OTA4IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIvaW50ZWxfYWxsb2NhdG9y LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIvaW50ZWxfYWxsb2NhdG9yLmgKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBsaWIvaW50ZWxfYWxsb2NhdG9yX21zZ2NoYW5uZWwuYwogY3JlYXRlIG1vZGUgMTAw NjQ0IGxpYi9pbnRlbF9hbGxvY2F0b3JfbXNnY2hhbm5lbC5oCgpkaWZmIC0tZ2l0IGEvZG9jcy9y ZWZlcmVuY2UvaWd0LWdwdS10b29scy9pZ3QtZ3B1LXRvb2xzLWRvY3MueG1sIGIvZG9jcy9yZWZl cmVuY2UvaWd0LWdwdS10b29scy9pZ3QtZ3B1LXRvb2xzLWRvY3MueG1sCmluZGV4IGJmNWFjNTQy OC4uMTkyZDFkZjdhIDEwMDY0NAotLS0gYS9kb2NzL3JlZmVyZW5jZS9pZ3QtZ3B1LXRvb2xzL2ln dC1ncHUtdG9vbHMtZG9jcy54bWwKKysrIGIvZG9jcy9yZWZlcmVuY2UvaWd0LWdwdS10b29scy9p Z3QtZ3B1LXRvb2xzLWRvY3MueG1sCkBAIC00Myw2ICs0Myw3IEBACiAgICAgPHhpOmluY2x1ZGUg aHJlZj0ieG1sL2lndF92YzQueG1sIi8+CiAgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2lndF92 Z2VtLnhtbCIvPgogICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9pZ3RfeDg2LnhtbCIvPgorICAg IDx4aTppbmNsdWRlIGhyZWY9InhtbC9pbnRlbF9hbGxvY2F0b3IueG1sIi8+CiAgICAgPHhpOmlu Y2x1ZGUgaHJlZj0ieG1sL2ludGVsX2JhdGNoYnVmZmVyLnhtbCIvPgogICAgIDx4aTppbmNsdWRl IGhyZWY9InhtbC9pbnRlbF9idWZvcHMueG1sIi8+CiAgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1s L2ludGVsX2NoaXBzZXQueG1sIi8+CmRpZmYgLS1naXQgYS9saWIvTWFrZWZpbGUuc291cmNlcyBi L2xpYi9NYWtlZmlsZS5zb3VyY2VzCmluZGV4IDg0ZmQ3YjQ5Yy4uZDExODc2Y2NlIDEwMDY0NAot LS0gYS9saWIvTWFrZWZpbGUuc291cmNlcworKysgYi9saWIvTWFrZWZpbGUuc291cmNlcwpAQCAt MTIxLDYgKzEyMSwxMiBAQCBsaWJfc291cmNlX2xpc3QgPQkgCVwKIAlzdXJmYWNlZm9ybWF0LmgJ CVwKIAlzd19zeW5jLmMJCVwKIAlzd19zeW5jLmgJCVwKKwlpbnRlbF9hbGxvY2F0b3IuYwlcCisJ aW50ZWxfYWxsb2NhdG9yLmgJXAorCWludGVsX2FsbG9jYXRvcl9yYW5kb20uYwlcCisJaW50ZWxf YWxsb2NhdG9yX3NpbXBsZS5jCVwKKwlpbnRlbF9hbGxvY2F0b3JfbXNnY2hhbm5lbC5jCVwKKwlp bnRlbF9hbGxvY2F0b3JfbXNnY2hhbm5lbC5oCVwKIAlpbnRlbF9hdXhfcGd0YWJsZS5jCVwKIAlp bnRlbF9yZWdfbWFwLmMJCVwKIAlpbnRlbF9pb3NmLmMJCVwKZGlmZiAtLWdpdCBhL2xpYi9pZ3Rf Y29yZS5jIGIvbGliL2lndF9jb3JlLmMKaW5kZXggMmI0MTgyZjE2Li42NTk3YWNmYWEgMTAwNjQ0 Ci0tLSBhL2xpYi9pZ3RfY29yZS5jCisrKyBiL2xpYi9pZ3RfY29yZS5jCkBAIC01OCw2ICs1OCw3 IEBACiAjaW5jbHVkZSA8Z2xpYi5oPgogCiAjaW5jbHVkZSAiZHJtdGVzdC5oIgorI2luY2x1ZGUg ImludGVsX2FsbG9jYXRvci5oIgogI2luY2x1ZGUgImludGVsX2NoaXBzZXQuaCIKICNpbmNsdWRl ICJpbnRlbF9pby5oIgogI2luY2x1ZGUgImlndF9kZWJ1Z2ZzLmgiCkBAIC0xNDEyLDYgKzE0MTMs MTkgQEAgX19ub3JldHVybiBzdGF0aWMgdm9pZCBleGl0X3N1YnRlc3QoY29uc3QgY2hhciAqcmVz dWx0KQogCX0KIAludW1fdGVzdF9jaGlsZHJlbiA9IDA7CiAKKwkvKgorCSAqIFdoZW4gdGVzdCBj b21wbGV0ZXMgLSBtb3N0bHkgaW4gZmFpbCBzdGF0ZSBpdCBjYW4gbGVhdmUgYWxsb2NhdGVkCisJ ICogb2JqZWN0cy4gQW4gYWxsb2NhdG9yIGlzIG5vdCBhbiBleGNlcHRpb24gYXMgaXQgaXMgZ2xv YmFsIElHVAorCSAqIGVudGl0eSBhbmQgd2hlbiB0ZXN0IHdpbGwgYWxsb2NhdGUgc29tZSByYW5n ZXMgYW5kIHRoZW4gaXQgd2lsbAorCSAqIGZhaWwgbm8gZnJlZS9jbG9zZSBsaWtlbHkgd2lsbCBi ZSBjYWxsZWQgKGNvbnRyb2xpbmcgcG90ZW50aWFsCisJICogZmFpbHMgYW5kIGNsZWFyaW5nIGJl Zm9yZSBhc3NlcnRpb25zIGluIElHVCBpcyBub3QgY29tbW9uKS4KKwkgKgorCSAqIFdlIGNhbGwg aW50ZWxfYWxsb2NhdG9yX2luaXQoKSB0aGVuIHRvIHByZXBhcmUgdGhlIGFsbG9jYXRvcgorCSAq IGluZnJhc3RydWN0dXJlIGZyb20gc2NyYXRjaCBmb3IgZWFjaCB0ZXN0LiBJbml0IGFsc28gcmVt b3ZlcworCSAqIHJlbW5hbnRzIGZyb20gcHJldmlvdXMgYWxsb2NhdG9yIHJ1biAoaWYgYW55KS4K KwkgKi8KKwlpbnRlbF9hbGxvY2F0b3JfaW5pdCgpOworCiAJaWYgKCFpbl9keW5hbWljX3N1YnRl c3QpCiAJCV9pZ3RfZHluYW1pY190ZXN0c19leGVjdXRlZCA9IC0xOwogCmRpZmYgLS1naXQgYS9s aWIvaW50ZWxfYWxsb2NhdG9yLmMgYi9saWIvaW50ZWxfYWxsb2NhdG9yLmMKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwLi5kZTg2YzU3ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9s aWIvaW50ZWxfYWxsb2NhdG9yLmMKQEAgLTAsMCArMSwxMzE5IEBACisvLyBTUERYLUxpY2Vuc2Ut SWRlbnRpZmllcjogTUlUCisvKgorICogQ29weXJpZ2h0IMKpIDIwMjEgSW50ZWwgQ29ycG9yYXRp b24KKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4K KyNpbmNsdWRlIDxzeXMvaXBjLmg+CisjaW5jbHVkZSA8c3lzL21zZy5oPgorI2luY2x1ZGUgPGZj bnRsLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1 ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgImlndC5oIgorI2lu Y2x1ZGUgImlndF9tYXAuaCIKKyNpbmNsdWRlICJpbnRlbF9hbGxvY2F0b3IuaCIKKyNpbmNsdWRl ICJpbnRlbF9hbGxvY2F0b3JfbXNnY2hhbm5lbC5oIgorCisvLyNkZWZpbmUgQUxMT0NEQkcKKyNp ZmRlZiBBTExPQ0RCRworI2RlZmluZSBhbGxvY19pbmZvIGlndF9pbmZvCisjZGVmaW5lIGFsbG9j X2RlYnVnIGlndF9kZWJ1Zworc3RhdGljIGNvbnN0IGNoYXIgKnJlcXR5cGVfc3RyW10gPSB7CisJ W1JFUV9TVE9QXQkJPSAic3RvcCIsCisJW1JFUV9PUEVOXQkJPSAib3BlbiIsCisJW1JFUV9PUEVO X0FTXQkJPSAib3BlbiBhcyIsCisJW1JFUV9DTE9TRV0JCT0gImNsb3NlIiwKKwlbUkVRX0FERFJF U1NfUkFOR0VdCT0gImFkZHJlc3MgcmFuZ2UiLAorCVtSRVFfQUxMT0NdCQk9ICJhbGxvYyIsCisJ W1JFUV9GUkVFXQkJPSAiZnJlZSIsCisJW1JFUV9JU19BTExPQ0FURURdCT0gImlzIGFsbG9jYXRl ZCIsCisJW1JFUV9SRVNFUlZFXQkJPSAicmVzZXJ2ZSIsCisJW1JFUV9VTlJFU0VSVkVdCQk9ICJ1 bnJlc2VydmUiLAorCVtSRVFfUkVTRVJWRV9JRl9OT1RfQUxMT0NBVEVEXSA9ICJyZXNlcnZlLWlu YSIsCisJW1JFUV9JU19SRVNFUlZFRF0JPSAiaXMgcmVzZXJ2ZWQiLAorfTsKK3N0YXRpYyBpbmxp bmUgY29uc3QgY2hhciAqcmVxc3RyKGVudW0gcmVxdHlwZSByZXF1ZXN0X3R5cGUpCit7CisJaWd0 X2Fzc2VydChyZXF1ZXN0X3R5cGUgPj0gUkVRX1NUT1AgJiYgcmVxdWVzdF90eXBlIDw9IFJFUV9J U19SRVNFUlZFRCk7CisJcmV0dXJuIHJlcXR5cGVfc3RyW3JlcXVlc3RfdHlwZV07Cit9CisjZWxz ZQorI2RlZmluZSBhbGxvY19pbmZvKC4uLikge30KKyNkZWZpbmUgYWxsb2NfZGVidWcoLi4uKSB7 fQorI2VuZGlmCisKK3N0cnVjdCBhbGxvY2F0b3IgeworCWludCBmZDsKKwl1aW50MzJfdCBjdHg7 CisJdWludDMyX3Qgdm07CisJc3RydWN0IGludGVsX2FsbG9jYXRvciAqaWFsOworCXVpbnQ2NF90 IGhhbmRsZTsKK307CisKK3N0cnVjdCBoYW5kbGVfZW50cnkgeworCXVpbnQ2NF90IGhhbmRsZTsK KwlzdHJ1Y3QgYWxsb2NhdG9yICphbDsKK307CisKK3N0cnVjdCBpbnRlbF9hbGxvY2F0b3IgKmlu dGVsX2FsbG9jYXRvcl9yZWxvY19jcmVhdGUoaW50IGZkKTsKK3N0cnVjdCBpbnRlbF9hbGxvY2F0 b3IgKmludGVsX2FsbG9jYXRvcl9yYW5kb21fY3JlYXRlKGludCBmZCk7CitzdHJ1Y3QgaW50ZWxf YWxsb2NhdG9yICppbnRlbF9hbGxvY2F0b3Jfc2ltcGxlX2NyZWF0ZShpbnQgZmQpOworc3RydWN0 IGludGVsX2FsbG9jYXRvciAqCitpbnRlbF9hbGxvY2F0b3Jfc2ltcGxlX2NyZWF0ZV9mdWxsKGlu dCBmZCwgdWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IGVuZCwKKwkJCQkgICBlbnVtIGFsbG9jYXRv cl9zdHJhdGVneSBzdHJhdGVneSk7CisKKy8qCisgKiBJbnN0ZWFkIG9mIHRyeWluZyB0byBmaW5k IGZpcnN0IGVtcHR5IGhhbmRsZSBqdXN0IGdldCBuZXcgb25lLiBBc3N1bWluZworICogb3VyIGNv dW50ZXIgaXMgaW5jcmVtZW50ZWQgMl4zMiB0aW1lcyBwZXIgc2Vjb25kICg0R0h6IGNsb2NrIGFu ZCBoYW5kbGUKKyAqIGFzc2lnbm1lbnQgdGFrZXMgc2luZ2xlIGNsb2NrKSA2NC1iaXQgY291bnRl ciB3b3VsZCB3cmFwIGFyb3VuZCBhZnRlcgorICogfjY4IHllYXJzLgorICoKKyAqICAgICAgICAg ICAgICAgICAgIGFsbG9jYXRvcgorICogaGFuZGxlcyAgICAgICAgICAgPGZkLCBjdHg+ICAgICAg ICAgICBpbnRlbCBhbGxvY2F0b3IKKyAqICstLS0tLSsgICAgICAgICAgICstLS0tLS0tLSsgICAg ICAgICAgKy0tLS0tLS0tLS0tLS0rCisgKiB8ICAxICArLS0tLS0tLS0tLT4rICBmZDogMyArLS0t LSstLS0tPisgZGF0YTogLi4uICAgfAorICogKy0tLS0tKyAgICAgICAgICAgfCBjdHg6IDEgfCAg ICB8ICAgICB8IHJlZmNvdW50OiAyIHwKKyAqIHwgIDIgICstLS0tLS0gICAgICstLS0tLS0tLSsg ICAgfCAgICAgKy0tLS0tLS0tLS0tLS0rCisgKiArLS0tLS0rICAgICArLS0tLT4rICBmZDogMyAr LS0tLSsKKyAqIHwgIDMgICstLSsgICAgICAgIHwgY3R4OiAxIHwgICAgICAgICAgaW50ZWwgYWxs b2NhdG9yCisgKiArLS0tLS0rICB8ICAgICAgICArLS0tLS0tLS0rICAgICAgICAgICstLS0tLS0t LS0tLS0tKworICogfCAuLi4gfCAgKy0tLS0tLS0+KyAgZmQ6IDMgKy0tLS0tLS0tLT4rIGRhdGE6 IC4uLiAgIHwKKyAqICstLS0tLSsgICAgICAgICAgIHwgY3R4OiAyIHwgICAgICAgICAgfCByZWZj b3VudDogMSB8CisgKiB8ICBuICArLS0tLS0tLS0rICArLS0tLS0tLS0rICAgICAgICAgICstLS0t LS0tLS0tLS0tKworICogKy0tLS0tKyAgICAgICAgfAorICogfCAuLi4gKy0tLS0tKyAgfCAgYWxs b2NhdG9yCisgKiArLS0tLS0rICAgICB8ICB8ICA8ZmQsIHZtPiAgICAgICAgICAgIGludGVsIGFs bG9jYXRvcgorICogfCAuLi4gKy0tKyAgfCAgfCAgKy0tLS0tLS0tKyAgICAgICAgICArLS0tLS0t LS0tLS0tLSsKKyAqICsgICAgICsgIHwgIHwgICstPisgIGZkOiAzICstLSstLSstLS0+KyBkYXRh OiAuLi4gICB8CisgKiAgICAgICAgICB8ICB8ICAgICB8ICB2bTogMSB8ICB8ICB8ICAgIHwgcmVm Y291bnQ6IDMgfAorICogICAgICAgICAgfCAgfCAgICAgKy0tLS0tLS0tKyAgfCAgfCAgICArLS0t LS0tLS0tLS0tLSsKKyAqICAgICAgICAgIHwgICstLS0tPisgIGZkOiAzICstLSsgIHwKKyAqICAg ICAgICAgIHwgICAgICAgIHwgIHZtOiAxIHwgICAgIHwKKyAqICAgICAgICAgIHwgICAgICAgICst LS0tLS0tLSsgICAgIHwKKyAqICAgICAgICAgICstLS0tLS0tPisgIGZkOiAzICstLS0tLSsKKyAq ICAgICAgICAgICAgICAgICAgIHwgIHZtOiAyIHwKKyAqICAgICAgICAgICAgICAgICAgICstLS0t LS0tLSsKKyAqLworc3RhdGljIF9BdG9taWModWludDY0X3QpIG5leHRfaGFuZGxlOworc3RhdGlj IHN0cnVjdCBpZ3RfbWFwICpoYW5kbGVzOworc3RhdGljIHN0cnVjdCBpZ3RfbWFwICpjdHhfbWFw Oworc3RhdGljIHN0cnVjdCBpZ3RfbWFwICp2bV9tYXA7CitzdGF0aWMgcHRocmVhZF9tdXRleF90 IG1hcF9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisjZGVmaW5lIEdFVF9NQVAo dm0pICgodm0pID8gdm1fbWFwIDogY3R4X21hcCkKKworc3RhdGljIGJvb2wgbXVsdGlwcm9jZXNz Oworc3RhdGljIHB0aHJlYWRfdCBhbGxvY2F0b3JfdGhyZWFkOworCitzdGF0aWMgYm9vbCB3YXJu X2lmX25vdF9lbXB0eTsKKworLyogRm9yIGFsbG9jYXRvciBwdXJwb3NlcyB3ZSBuZWVkIHRvIHRy YWNrIHBpZC90aWQgKi8KK3N0YXRpYyBwaWRfdCBhbGxvY2F0b3JfcGlkID0gLTE7CitleHRlcm4g cGlkX3QgY2hpbGRfcGlkOworZXh0ZXJuIF9fdGhyZWFkIHBpZF90IGNoaWxkX3RpZDsKKworLyoK KyAqIC0gZm9yIHBhcmVudCBwcm9jZXNzIHdlIGhhdmUgY2hpbGRfcGlkID09IC0xCisgKiAtIGZv ciBjaGlsZCB3aGljaCBjYWxscyBpbnRlbF9hbGxvY2F0b3JfaW5pdCgpIGFsbG9jYXRvcl9waWQg PT0gY2hpbGRfcGlkCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19zYW1lX3Byb2Nlc3Modm9p ZCkKK3sKKwlyZXR1cm4gY2hpbGRfcGlkID09IC0xIHx8IGFsbG9jYXRvcl9waWQgPT0gY2hpbGRf cGlkOworfQorCitzdGF0aWMgc3RydWN0IG1zZ19jaGFubmVsICpjaGFubmVsOworCitzdGF0aWMg aW50IHNlbmRfYWxsb2Nfc3RvcChzdHJ1Y3QgbXNnX2NoYW5uZWwgKm1zZ2NoYW4pCit7CisJc3Ry dWN0IGFsbG9jX3JlcSByZXEgPSB7MH07CisKKwlyZXEucmVxdWVzdF90eXBlID0gUkVRX1NUT1A7 CisKKwlyZXR1cm4gbXNnY2hhbi0+c2VuZF9yZXEobXNnY2hhbiwgJnJlcSk7Cit9CisKK3N0YXRp YyBpbnQgc2VuZF9yZXEoc3RydWN0IG1zZ19jaGFubmVsICptc2djaGFuLCBwaWRfdCB0aWQsCisJ CSAgICBzdHJ1Y3QgYWxsb2NfcmVxICpyZXF1ZXN0KQoreworCXJlcXVlc3QtPnRpZCA9IHRpZDsK KwlyZXR1cm4gbXNnY2hhbi0+c2VuZF9yZXEobXNnY2hhbiwgcmVxdWVzdCk7Cit9CisKK3N0YXRp YyBpbnQgcmVjdl9yZXEoc3RydWN0IG1zZ19jaGFubmVsICptc2djaGFuLCBzdHJ1Y3QgYWxsb2Nf cmVxICpyZXF1ZXN0KQoreworCXJldHVybiBtc2djaGFuLT5yZWN2X3JlcShtc2djaGFuLCByZXF1 ZXN0KTsKK30KKworc3RhdGljIGludCBzZW5kX3Jlc3Aoc3RydWN0IG1zZ19jaGFubmVsICptc2dj aGFuLAorCQkgICAgIHBpZF90IHRpZCwgc3RydWN0IGFsbG9jX3Jlc3AgKnJlc3BvbnNlKQorewor CXJlc3BvbnNlLT50aWQgPSB0aWQ7CisJcmV0dXJuIG1zZ2NoYW4tPnNlbmRfcmVzcChtc2djaGFu LCByZXNwb25zZSk7Cit9CisKK3N0YXRpYyBpbnQgcmVjdl9yZXNwKHN0cnVjdCBtc2dfY2hhbm5l bCAqbXNnY2hhbiwKKwkJICAgICBwaWRfdCB0aWQsIHN0cnVjdCBhbGxvY19yZXNwICpyZXNwb25z ZSkKK3sKKwlyZXNwb25zZS0+dGlkID0gdGlkOworCXJldHVybiBtc2djaGFuLT5yZWN2X3Jlc3Ao bXNnY2hhbiwgcmVzcG9uc2UpOworfQorCitzdGF0aWMgdWludDY0X3QgX19oYW5kbGVfY3JlYXRl KHN0cnVjdCBhbGxvY2F0b3IgKmFsKQoreworCXN0cnVjdCBoYW5kbGVfZW50cnkgKmggPSBtYWxs b2Moc2l6ZW9mKCpoKSk7CisKKwlpZ3RfYXNzZXJ0KGgpOworCWgtPmhhbmRsZSA9IGF0b21pY19m ZXRjaF9hZGQoJm5leHRfaGFuZGxlLCAxKTsKKwloLT5hbCA9IGFsOworCWlndF9tYXBfYWRkKGhh bmRsZXMsIGgsIGgpOworCisJcmV0dXJuIGgtPmhhbmRsZTsKK30KKworc3RhdGljIHZvaWQgX19o YW5kbGVfZGVzdHJveSh1aW50NjRfdCBoYW5kbGUpCit7CisJc3RydWN0IGhhbmRsZV9lbnRyeSAq aCwgaGUgPSB7IC5oYW5kbGUgPSBoYW5kbGUgfTsKKworCWggPSBpZ3RfbWFwX2ZpbmQoaGFuZGxl cywgJmhlKTsKKwlpZ3RfYXNzZXJ0KGgpOworCWlndF9tYXBfZGVsKGhhbmRsZXMsICZoZSk7CisJ ZnJlZShoKTsKK30KKworc3RhdGljIHN0cnVjdCBhbGxvY2F0b3IgKl9fYWxsb2NhdG9yX2ZpbmQo aW50IGZkLCB1aW50MzJfdCBjdHgsIHVpbnQzMl90IHZtKQoreworCXN0cnVjdCBhbGxvY2F0b3Ig YWwgPSB7IC5mZCA9IGZkLCAuY3R4ID0gY3R4LCAudm0gPSB2bSB9OworCXN0cnVjdCBpZ3RfbWFw ICptYXAgPSBHRVRfTUFQKHZtKTsKKworCXJldHVybiBpZ3RfbWFwX2ZpbmQobWFwLCAmYWwpOwor fQorCitzdGF0aWMgc3RydWN0IGFsbG9jYXRvciAqX19hbGxvY2F0b3JfZmluZF9ieV9oYW5kbGUo dWludDY0X3QgaGFuZGxlKQoreworCXN0cnVjdCBoYW5kbGVfZW50cnkgKmgsIGhlID0geyAuaGFu ZGxlID0gaGFuZGxlIH07CisKKwloID0gaWd0X21hcF9maW5kKGhhbmRsZXMsICZoZSk7CisJaWYg KCFoKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBoLT5hbDsKK30KKworc3RhdGljIHN0cnVj dCBhbGxvY2F0b3IgKl9fYWxsb2NhdG9yX2NyZWF0ZShpbnQgZmQsIHVpbnQzMl90IGN0eCwgdWlu dDMyX3Qgdm0sCisJCQkJCSAgICBzdHJ1Y3QgaW50ZWxfYWxsb2NhdG9yICppYWwpCit7CisJc3Ry dWN0IGlndF9tYXAgKm1hcCA9IEdFVF9NQVAodm0pOworCXN0cnVjdCBhbGxvY2F0b3IgKmFsID0g bWFsbG9jKHNpemVvZigqYWwpKTsKKworCWlndF9hc3NlcnQoYWwpOworCWlndF9hc3NlcnQoZmQg PT0gaWFsLT5mZCk7CisJYWwtPmZkID0gZmQ7CisJYWwtPmN0eCA9IGN0eDsKKwlhbC0+dm0gPSB2 bTsKKwlhbC0+aWFsID0gaWFsOworCisJaWd0X21hcF9hZGQobWFwLCBhbCwgYWwpOworCisJcmV0 dXJuIGFsOworfQorCitzdGF0aWMgdm9pZCBfX2FsbG9jYXRvcl9kZXN0cm95KHN0cnVjdCBhbGxv Y2F0b3IgKmFsKQoreworCXN0cnVjdCBpZ3RfbWFwICptYXAgPSBHRVRfTUFQKGFsLT52bSk7CisK KwlpZ3RfbWFwX2RlbChtYXAsIGFsKTsKKwlmcmVlKGFsKTsKK30KKworc3RhdGljIGludCBfX2Fs bG9jYXRvcl9nZXQoc3RydWN0IGFsbG9jYXRvciAqYWwpCit7CisJc3RydWN0IGludGVsX2FsbG9j YXRvciAqaWFsID0gYWwtPmlhbDsKKwlpbnQgcmVmY291bnQ7CisKKwlyZWZjb3VudCA9IGF0b21p Y19mZXRjaF9hZGQoJmlhbC0+cmVmY291bnQsIDEpOworCWlndF9hc3NlcnQocmVmY291bnQgPj0g MCk7CisKKwlyZXR1cm4gcmVmY291bnQ7Cit9CisKK3N0YXRpYyBib29sIF9fYWxsb2NhdG9yX3B1 dChzdHJ1Y3QgYWxsb2NhdG9yICphbCkKK3sKKwlzdHJ1Y3QgaW50ZWxfYWxsb2NhdG9yICppYWwg PSBhbC0+aWFsOworCWJvb2wgcmVsZWFzZWQgPSBmYWxzZTsKKwlpbnQgcmVmY291bnQ7CisKKwly ZWZjb3VudCA9IGF0b21pY19mZXRjaF9zdWIoJmlhbC0+cmVmY291bnQsIDEpOworCWlndF9hc3Nl cnQocmVmY291bnQgPj0gMSk7CisJaWYgKHJlZmNvdW50ID09IDEpIHsKKwkJaWYgKCFpYWwtPmlz X2VtcHR5KGlhbCkgJiYgd2Fybl9pZl9ub3RfZW1wdHkpCisJCQlpZ3Rfd2FybigiQWxsb2NhdG9y IG5vdCBjbGVhciBiZWZvcmUgZGVzdHJveSFcbiIpOworCisJCXJlbGVhc2VkID0gdHJ1ZTsKKwl9 CisKKwlyZXR1cm4gcmVsZWFzZWQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfYWxsb2NhdG9y ICppbnRlbF9hbGxvY2F0b3JfY3JlYXRlKGludCBmZCwKKwkJCQkJCSAgICAgIHVpbnQ2NF90IHN0 YXJ0LCB1aW50NjRfdCBlbmQsCisJCQkJCQkgICAgICB1aW50OF90IGFsbG9jYXRvcl90eXBlLAor CQkJCQkJICAgICAgdWludDhfdCBhbGxvY2F0b3Jfc3RyYXRlZ3kpCit7CisJc3RydWN0IGludGVs X2FsbG9jYXRvciAqaWFsID0gTlVMTDsKKworCXN3aXRjaCAoYWxsb2NhdG9yX3R5cGUpIHsKKwkv KgorCSAqIEZldyB3b3JkcyBvZiBleHBsYW5hdGlvbiBpcyByZXF1aXJlZCBoZXJlLgorCSAqCisJ ICogSU5URUxfQUxMT0NBVE9SX05PTkUgYWxsb3dzIGtlZXBpbmcgaW5mb3JtYXRpb24gaW4gdGhl IGNvZGUgKGludGVsLWJiCisJICogaXMgYW4gZXhhbXBsZSkgd2UncmUgbm90IHVzaW5nIElHVCBh bGxvY2F0b3IgaXRzZWxmIGFuZCBsaWtlbHkKKwkgKiB3ZSByZWx5IG9uIHJlbG9jYXRpb25zLgor CSAqIFNvIHRyeWluZyB0byBjcmVhdGUgTk9ORSBhbGxvY2F0b3IgZG9lc24ndCBtYWtlcyBzZW5z ZSBhbmQgYmVsb3cKKwkgKiBhc3NlcnRpb24gY2F0Y2hlcyBzdWNoIGludmFsaWQgdXNhZ2UuCisJ ICovCisJY2FzZSBJTlRFTF9BTExPQ0FUT1JfTk9ORToKKwkJaWd0X2Fzc2VydF9mKGFsbG9jYXRv cl90eXBlICE9IElOVEVMX0FMTE9DQVRPUl9OT05FLAorCQkJICAgICAiV2UgY2Fubm90IHVzZSBO T05FIGFsbG9jYXRvclxuIik7CisJCWJyZWFrOworCWNhc2UgSU5URUxfQUxMT0NBVE9SX1JFTE9D OgorCQlpYWwgPSBpbnRlbF9hbGxvY2F0b3JfcmVsb2NfY3JlYXRlKGZkKTsKKwkJYnJlYWs7CisJ Y2FzZSBJTlRFTF9BTExPQ0FUT1JfUkFORE9NOgorCQlpYWwgPSBpbnRlbF9hbGxvY2F0b3JfcmFu ZG9tX2NyZWF0ZShmZCk7CisJCWJyZWFrOworCWNhc2UgSU5URUxfQUxMT0NBVE9SX1NJTVBMRToK KwkJaWYgKCFzdGFydCAmJiAhZW5kKQorCQkJaWFsID0gaW50ZWxfYWxsb2NhdG9yX3NpbXBsZV9j cmVhdGUoZmQpOworCQllbHNlCisJCQlpYWwgPSBpbnRlbF9hbGxvY2F0b3Jfc2ltcGxlX2NyZWF0 ZV9mdWxsKGZkLCBzdGFydCwgZW5kLAorCQkJCQkJCQkgYWxsb2NhdG9yX3N0cmF0ZWd5KTsKKwkJ YnJlYWs7CisJZGVmYXVsdDoKKwkJaWd0X2Fzc2VydF9mKGlhbCwgIkFsbG9jYXRvciB0eXBlICVk IG5vdCBpbXBsZW1lbnRlZFxuIiwKKwkJCSAgICAgYWxsb2NhdG9yX3R5cGUpOworCQlicmVhazsK Kwl9CisKKwlpZ3RfYXNzZXJ0KGlhbCk7CisKKwlpYWwtPnR5cGUgPSBhbGxvY2F0b3JfdHlwZTsK KwlpYWwtPnN0cmF0ZWd5ID0gYWxsb2NhdG9yX3N0cmF0ZWd5OworCXB0aHJlYWRfbXV0ZXhfaW5p dCgmaWFsLT5tdXRleCwgTlVMTCk7CisKKwlyZXR1cm4gaWFsOworfQorCitzdGF0aWMgdm9pZCBp bnRlbF9hbGxvY2F0b3JfZGVzdHJveShzdHJ1Y3QgaW50ZWxfYWxsb2NhdG9yICppYWwpCit7CisJ YWxsb2NfaW5mbygiRGVzdHJveWluZyBhbGxvY2F0b3IgKGVtcHR5OiAlZClcbiIsIGlhbC0+aXNf ZW1wdHkoaWFsKSk7CisKKwlpYWwtPmRlc3Ryb3koaWFsKTsKK30KKworc3RhdGljIHN0cnVjdCBh bGxvY2F0b3IgKmFsbG9jYXRvcl9vcGVuKGludCBmZCwgdWludDMyX3QgY3R4LCB1aW50MzJfdCB2 bSwKKwkJCQkJdWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IGVuZCwKKwkJCQkJdWludDhfdCBhbGxv Y2F0b3JfdHlwZSwKKwkJCQkJdWludDhfdCBhbGxvY2F0b3Jfc3RyYXRlZ3kpCit7CisJc3RydWN0 IGludGVsX2FsbG9jYXRvciAqaWFsOworCXN0cnVjdCBhbGxvY2F0b3IgKmFsOworCWNvbnN0IGNo YXIgKmlkc3RyID0gdm0gPyAidm0iIDogImN0eCI7CisKKwlhbCA9IF9fYWxsb2NhdG9yX2ZpbmQo ZmQsIGN0eCwgdm0pOworCWlmICghYWwpIHsKKwkJYWxsb2NfaW5mbygiQWxsb2NhdG9yIGZkOiAl ZCwgY3R4OiAldSwgdm06ICV1LCA8MHglbGx4IDogMHglbGx4PiAiCisJCQkgICAgIm5vdCBmb3Vu ZCwgY3JlYXRpbmcgb25lXG4iLAorCQkJICAgIGZkLCBjdHgsIHZtLCAobG9uZyBsb25nKSBzdGFy dCwgKGxvbmcgbG9uZykgZW5kKTsKKwkJaWFsID0gaW50ZWxfYWxsb2NhdG9yX2NyZWF0ZShmZCwg c3RhcnQsIGVuZCwgYWxsb2NhdG9yX3R5cGUsCisJCQkJCSAgICAgYWxsb2NhdG9yX3N0cmF0ZWd5 KTsKKwkJYWwgPSBfX2FsbG9jYXRvcl9jcmVhdGUoZmQsIGN0eCwgdm0sIGlhbCk7CisJfSBlbHNl IHsKKwkJYWwgPSBfX2FsbG9jYXRvcl9jcmVhdGUoYWwtPmZkLCBhbC0+Y3R4LCBhbC0+dm0sIGFs LT5pYWwpOworCQlpYWwgPSBhbC0+aWFsOworCX0KKwlfX2FsbG9jYXRvcl9nZXQoYWwpOworCWFs LT5oYW5kbGUgPSBfX2hhbmRsZV9jcmVhdGUoYWwpOworCisJaWYgKGlhbC0+dHlwZSAhPSBhbGxv Y2F0b3JfdHlwZSkgeworCQlpZ3Rfd2FybigiQWxsb2NhdG9yIHR5cGUgbXVzdCBiZSBzYW1lIGZv ciBmZC8lc1xuIiwgaWRzdHIpOworCQlpYWwgPSBOVUxMOworCX0KKworCWlmIChpYWwtPnN0cmF0 ZWd5ICE9IGFsbG9jYXRvcl9zdHJhdGVneSkgeworCQlpZ3Rfd2FybigiQWxsb2NhdG9yIHN0cmF0 ZWd5IG11c3QgYmUgc2FtZSBvciBmZC8lc1xuIiwgaWRzdHIpOworCQlpYWwgPSBOVUxMOworCX0K KworCXJldHVybiBhbDsKK30KKworc3RhdGljIHN0cnVjdCBhbGxvY2F0b3IgKmFsbG9jYXRvcl9v cGVuX2FzKHN0cnVjdCBhbGxvY2F0b3IgKmJhc2UsCisJCQkJCSAgIHVpbnQzMl90IG5ld192bSkK K3sKKwlzdHJ1Y3QgYWxsb2NhdG9yICphbDsKKworCWFsID0gX19hbGxvY2F0b3JfY3JlYXRlKGJh c2UtPmZkLCBiYXNlLT5jdHgsIG5ld192bSwgYmFzZS0+aWFsKTsKKwlfX2FsbG9jYXRvcl9nZXQo YWwpOworCWFsLT5oYW5kbGUgPSBfX2hhbmRsZV9jcmVhdGUoYWwpOworCisJcmV0dXJuIGFsOwor fQorCitzdGF0aWMgYm9vbCBhbGxvY2F0b3JfY2xvc2UodWludDY0X3QgYWhuZCkKK3sKKwlzdHJ1 Y3QgYWxsb2NhdG9yICphbDsKKwlib29sIHJlbGVhc2VkLCBpc19lbXB0eSA9IGZhbHNlOworCisJ YWwgPSBfX2FsbG9jYXRvcl9maW5kX2J5X2hhbmRsZShhaG5kKTsKKwlpZiAoIWFsKSB7CisJCWln dF93YXJuKCJDYW5ub3QgZmluZCBoYW5kbGU6ICVsbHhcbiIsIChsb25nIGxvbmcpIGFobmQpOwor CQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmVsZWFzZWQgPSBfX2FsbG9jYXRvcl9wdXQoYWwpOwor CWlmIChyZWxlYXNlZCkgeworCQlpc19lbXB0eSA9IGFsLT5pYWwtPmlzX2VtcHR5KGFsLT5pYWwp OworCQlpbnRlbF9hbGxvY2F0b3JfZGVzdHJveShhbC0+aWFsKTsKKwl9CisJX19hbGxvY2F0b3Jf ZGVzdHJveShhbCk7CisJX19oYW5kbGVfZGVzdHJveShhaG5kKTsKKworCXJldHVybiBpc19lbXB0 eTsKK30KKworc3RhdGljIGludCBzZW5kX3JlcV9yZWN2X3Jlc3Aoc3RydWN0IG1zZ19jaGFubmVs ICptc2djaGFuLAorCQkJICAgICAgc3RydWN0IGFsbG9jX3JlcSAqcmVxdWVzdCwKKwkJCSAgICAg IHN0cnVjdCBhbGxvY19yZXNwICpyZXNwb25zZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc2Vu ZF9yZXEobXNnY2hhbiwgY2hpbGRfdGlkLCByZXF1ZXN0KTsKKwlpZiAocmV0IDwgMCkgeworCQlp Z3Rfd2FybigiRXJyb3Igc2VuZGluZyByZXF1ZXN0IFt0eXBlOiAlZF06IGVyciA9ICVkIFslc11c biIsCisJCQkgcmVxdWVzdC0+cmVxdWVzdF90eXBlLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsK KworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHJlY3ZfcmVzcChtc2djaGFuLCBjaGlsZF90 aWQsIHJlc3BvbnNlKTsKKwlpZiAocmV0IDwgMCkKKwkJaWd0X3dhcm4oIkVycm9yIHJlY2Vpdmlu ZyByZXNwb25zZSBbdHlwZTogJWRdOiBlcnIgPSAlZCBbJXNdXG4iLAorCQkJIHJlcXVlc3QtPnJl cXVlc3RfdHlwZSwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisKKwkvKgorCSAqIFRoaXMgaXMg bWFpbiBhc3N1bXB0aW9uIC0gd2UgcmVjZWl2ZSBtZXNzYWdlIHdoaWNoIHNpemUgbXVzdCBiZSA+ IDAuCisJICogSWYgdGhpcyBpcyBmdWxmaWxsZWQgd2UgcmV0dXJuIDAgYXMgYSBzdWNjZXNzLgor CSAqLworCWlmIChyZXQgPiAwKQorCQlyZXQgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworc3Rh dGljIGludCBoYW5kbGVfcmVxdWVzdChzdHJ1Y3QgYWxsb2NfcmVxICpyZXEsIHN0cnVjdCBhbGxv Y19yZXNwICpyZXNwKQoreworCWludCByZXQ7CisKKwltZW1zZXQocmVzcCwgMCwgc2l6ZW9mKCpy ZXNwKSk7CisKKwlpZiAoaXNfc2FtZV9wcm9jZXNzKCkpIHsKKwkJc3RydWN0IGludGVsX2FsbG9j YXRvciAqaWFsOworCQlzdHJ1Y3QgYWxsb2NhdG9yICphbDsKKwkJdWludDY0X3Qgc3RhcnQsIGVu ZCwgc2l6ZTsKKwkJdWludDMyX3QgY3R4LCB2bTsKKwkJYm9vbCBhbGxvY2F0ZWQsIHJlc2VydmVk LCB1bnJlc2VydmVkOworCQkvKiBVc2VkIHdoZW4gZGVidWcgaXMgb24sIHNvIGF2b2lkIGNvbXBp bGF0aW9uIHdhcm5pbmdzICovCisJCSh2b2lkKSBjdHg7CisJCSh2b2lkKSB2bTsKKworCQkvKgor CQkgKiBNdXRleCBvbmx5IHdvcmsgb24gYWxsb2NhdG9yIGluc3RhbmNlLCBub3Qgc3RvcC9vcGVu L2Nsb3NlCisJCSAqLworCQlpZiAocmVxLT5yZXF1ZXN0X3R5cGUgPiBSRVFfQ0xPU0UpIHsKKwkJ CS8qCisJCQkgKiBXZSBoYXZlIHRvIGxvY2sgbWFwIG11dGV4IGJlY2F1c2UgY29uY3VycmVudCBv cGVuCisJCQkgKiBjYW4gbGVhZCB0byByZXNpemluZyB0aGUgbWFwLgorCQkJICovCisJCQlwdGhy ZWFkX211dGV4X2xvY2soJm1hcF9tdXRleCk7CisJCQlhbCA9IF9fYWxsb2NhdG9yX2ZpbmRfYnlf aGFuZGxlKHJlcS0+YWxsb2NhdG9yX2hhbmRsZSk7CisJCQlwdGhyZWFkX211dGV4X3VubG9jaygm bWFwX211dGV4KTsKKwkJCWlndF9hc3NlcnQoYWwpOworCisJCQlpYWwgPSBhbC0+aWFsOworCQkJ aWd0X2Fzc2VydChpYWwpOworCisJCQlwdGhyZWFkX211dGV4X2xvY2soJmlhbC0+bXV0ZXgpOwor CQl9CisKKwkJc3dpdGNoIChyZXEtPnJlcXVlc3RfdHlwZSkgeworCQljYXNlIFJFUV9TVE9QOgor CQkJYWxsb2NfaW5mbygiPHN0b3A+XG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVRX09QRU46 CisJCQlwdGhyZWFkX211dGV4X2xvY2soJm1hcF9tdXRleCk7CisJCQlhbCA9IGFsbG9jYXRvcl9v cGVuKHJlcS0+b3Blbi5mZCwKKwkJCQkJICAgIHJlcS0+b3Blbi5jdHgsIHJlcS0+b3Blbi52bSwK KwkJCQkJICAgIHJlcS0+b3Blbi5zdGFydCwgcmVxLT5vcGVuLmVuZCwKKwkJCQkJICAgIHJlcS0+ b3Blbi5hbGxvY2F0b3JfdHlwZSwKKwkJCQkJICAgIHJlcS0+b3Blbi5hbGxvY2F0b3Jfc3RyYXRl Z3kpOworCQkJcmV0ID0gYXRvbWljX2xvYWQoJmFsLT5pYWwtPnJlZmNvdW50KTsKKwkJCXB0aHJl YWRfbXV0ZXhfdW5sb2NrKCZtYXBfbXV0ZXgpOworCisJCQlyZXNwLT5yZXNwb25zZV90eXBlID0g UkVTUF9PUEVOOworCQkJcmVzcC0+b3Blbi5hbGxvY2F0b3JfaGFuZGxlID0gYWwtPmhhbmRsZTsK KwkJCWFsbG9jX2luZm8oIjxvcGVuPiBbdGlkOiAlbGRdIGZkOiAlZCwgYWhuZDogJSIgUFJJeDY0 CisJCQkJICAgIiwgY3R4OiAldSwgdm06ICV1IgorCQkJCSAgICIsIGFsbG9jX3R5cGU6ICV1LCBy ZWZjbnQ6ICVkLT4lZFxuIiwKKwkJCQkgICAobG9uZykgcmVxLT50aWQsIHJlcS0+b3Blbi5mZCwg YWwtPmhhbmRsZSwKKwkJCQkgICByZXEtPm9wZW4uY3R4LAorCQkJCSAgIHJlcS0+b3Blbi52bSwg cmVxLT5vcGVuLmFsbG9jYXRvcl90eXBlLAorCQkJCSAgIHJldCAtIDEsIHJldCk7CisJCQlicmVh azsKKworCQljYXNlIFJFUV9PUEVOX0FTOgorCQkJLyogbG9jayBmaXJzdCB0byBhdm9pZCBjb25j dXJyZW50IGNsb3NlICovCisJCQlwdGhyZWFkX211dGV4X2xvY2soJm1hcF9tdXRleCk7CisKKwkJ CWFsID0gX19hbGxvY2F0b3JfZmluZF9ieV9oYW5kbGUocmVxLT5hbGxvY2F0b3JfaGFuZGxlKTsK KwkJCXJlc3AtPnJlc3BvbnNlX3R5cGUgPSBSRVNQX09QRU5fQVM7CisKKwkJCWlmICghYWwpIHsK KwkJCQlhbGxvY19pbmZvKCI8b3BlbiBhcz4gW3RpZDogJWxkXSBhaG5kOiAlIiBQUkl4NjQKKwkJ CQkJICAgIiAtPiBubyBoYW5kbGVcbiIsCisJCQkJCSAgIChsb25nKSByZXEtPnRpZCwgcmVxLT5h bGxvY2F0b3JfaGFuZGxlKTsKKwkJCQlwdGhyZWFkX211dGV4X3VubG9jaygmbWFwX211dGV4KTsK KwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKCFhbC0+dm0pIHsKKwkJCQlhbGxvY19pbmZvKCI8 b3BlbiBhcz4gW3RpZDogJWxkXSBhaG5kOiAlIiBQUkl4NjQKKwkJCQkJICAgIiAtPiBvbmx5IG9w ZW4gYXMgZm9yIDxmZCwgdm0+IGlzIHBvc3NpYmxlXG4iLAorCQkJCQkgICAobG9uZykgcmVxLT50 aWQsIHJlcS0+YWxsb2NhdG9yX2hhbmRsZSk7CisJCQkJcHRocmVhZF9tdXRleF91bmxvY2soJm1h cF9tdXRleCk7CisJCQkJYnJlYWs7CisJCQl9CisKKworCQkJYWwgPSBhbGxvY2F0b3Jfb3Blbl9h cyhhbCwgcmVxLT5vcGVuX2FzLm5ld192bSk7CisJCQlyZXQgPSBhdG9taWNfbG9hZCgmYWwtPmlh bC0+cmVmY291bnQpOworCQkJcHRocmVhZF9tdXRleF91bmxvY2soJm1hcF9tdXRleCk7CisKKwkJ CXJlc3AtPnJlc3BvbnNlX3R5cGUgPSBSRVNQX09QRU5fQVM7CisJCQlyZXNwLT5vcGVuLmFsbG9j YXRvcl9oYW5kbGUgPSBhbC0+aGFuZGxlOworCQkJYWxsb2NfaW5mbygiPG9wZW4gYXM+IFt0aWQ6 ICVsZF0gZmQ6ICVkLCBhaG5kOiAlIiBQUkl4NjQKKwkJCQkgICAiLCBjdHg6ICV1LCB2bTogJXUi CisJCQkJICAgIiwgYWxsb2NfdHlwZTogJXUsIHJlZmNudDogJWQtPiVkXG4iLAorCQkJCSAgIChs b25nKSByZXEtPnRpZCwgYWwtPmZkLCBhbC0+aGFuZGxlLAorCQkJCSAgIGFsLT5jdHgsIGFsLT52 bSwgYWwtPmlhbC0+dHlwZSwKKwkJCQkgICByZXQgLSAxLCByZXQpOworCQkJYnJlYWs7CisKKwkJ Y2FzZSBSRVFfQ0xPU0U6CisJCQlwdGhyZWFkX211dGV4X2xvY2soJm1hcF9tdXRleCk7CisJCQlh bCA9IF9fYWxsb2NhdG9yX2ZpbmRfYnlfaGFuZGxlKHJlcS0+YWxsb2NhdG9yX2hhbmRsZSk7CisJ CQlyZXNwLT5yZXNwb25zZV90eXBlID0gUkVTUF9DTE9TRTsKKworCQkJaWYgKCFhbCkgeworCQkJ CWFsbG9jX2luZm8oIjxjbG9zZT4gW3RpZDogJWxkXSBhaG5kOiAlIiBQUkl4NjQKKwkJCQkJICAg IiAtPiBubyBoYW5kbGVcbiIsCisJCQkJCSAgIChsb25nKSByZXEtPnRpZCwgcmVxLT5hbGxvY2F0 b3JfaGFuZGxlKTsKKwkJCQlwdGhyZWFkX211dGV4X3VubG9jaygmbWFwX211dGV4KTsKKwkJCQli cmVhazsKKwkJCX0KKworCQkJcmVzcC0+cmVzcG9uc2VfdHlwZSA9IFJFU1BfQ0xPU0U7CisJCQlj dHggPSBhbC0+Y3R4OworCQkJdm0gPSBhbC0+dm07CisKKwkJCXJldCA9IGF0b21pY19sb2FkKCZh bC0+aWFsLT5yZWZjb3VudCk7CisJCQlyZXNwLT5jbG9zZS5pc19lbXB0eSA9IGFsbG9jYXRvcl9j bG9zZShyZXEtPmFsbG9jYXRvcl9oYW5kbGUpOworCQkJcHRocmVhZF9tdXRleF91bmxvY2soJm1h cF9tdXRleCk7CisKKwkJCWFsbG9jX2luZm8oIjxjbG9zZT4gW3RpZDogJWxkXSBhaG5kOiAlIiBQ Ukl4NjQKKwkJCQkgICAiLCBjdHg6ICV1LCB2bTogJXUiCisJCQkJICAgIiwgaXNfZW1wdHk6ICVk LCByZWZjbnQ6ICVkLT4lZFxuIiwKKwkJCQkgICAobG9uZykgcmVxLT50aWQsIHJlcS0+YWxsb2Nh dG9yX2hhbmRsZSwKKwkJCQkgICBjdHgsIHZtLCByZXNwLT5jbG9zZS5pc19lbXB0eSwKKwkJCQkg ICByZXQsIGFsID8gcmV0IC0gMSA6IDApOworCisJCQlicmVhazsKKworCQljYXNlIFJFUV9BRERS RVNTX1JBTkdFOgorCQkJcmVzcC0+cmVzcG9uc2VfdHlwZSA9IFJFU1BfQUREUkVTU19SQU5HRTsK KwkJCWlhbC0+Z2V0X2FkZHJlc3NfcmFuZ2UoaWFsLCAmc3RhcnQsICZlbmQpOworCQkJcmVzcC0+ YWRkcmVzc19yYW5nZS5zdGFydCA9IHN0YXJ0OworCQkJcmVzcC0+YWRkcmVzc19yYW5nZS5lbmQg PSBlbmQ7CisJCQlhbGxvY19pbmZvKCI8YWRkcmVzcyByYW5nZT4gW3RpZDogJWxkXSBhaG5kOiAl IiBQUkl4NjQKKwkJCQkgICAiLCBjdHg6ICV1LCB2bTogJXUiCisJCQkJICAgIiwgc3RhcnQ6IDB4 JSIgUFJJeDY0ICIsIGVuZDogMHglIiBQUklkNjQgIlxuIiwKKwkJCQkgICAobG9uZykgcmVxLT50 aWQsIHJlcS0+YWxsb2NhdG9yX2hhbmRsZSwKKwkJCQkgICBhbC0+Y3R4LCBhbC0+dm0sIHN0YXJ0 LCBlbmQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRVFfQUxMT0M6CisJCQlyZXNwLT5yZXNwb25z ZV90eXBlID0gUkVTUF9BTExPQzsKKwkJCXJlc3AtPmFsbG9jLm9mZnNldCA9IGlhbC0+YWxsb2Mo aWFsLAorCQkJCQkJCXJlcS0+YWxsb2MuaGFuZGxlLAorCQkJCQkJCXJlcS0+YWxsb2Muc2l6ZSwK KwkJCQkJCQlyZXEtPmFsbG9jLmFsaWdubWVudCk7CisJCQlhbGxvY19pbmZvKCI8YWxsb2M+IFt0 aWQ6ICVsZF0gYWhuZDogJSIgUFJJeDY0CisJCQkJICAgIiwgY3R4OiAldSwgdm06ICV1LCBoYW5k bGU6ICV1IgorCQkJCSAgICIsIHNpemU6IDB4JSIgUFJJeDY0ICIsIG9mZnNldDogMHglIiBQUkl4 NjQKKwkJCQkgICAiLCBhbGlnbm1lbnQ6IDB4JSIgUFJJeDY0ICJcbiIsCisJCQkJICAgKGxvbmcp IHJlcS0+dGlkLCByZXEtPmFsbG9jYXRvcl9oYW5kbGUsCisJCQkJICAgYWwtPmN0eCwgYWwtPnZt LAorCQkJCSAgIHJlcS0+YWxsb2MuaGFuZGxlLCByZXEtPmFsbG9jLnNpemUsCisJCQkJICAgcmVz cC0+YWxsb2Mub2Zmc2V0LCByZXEtPmFsbG9jLmFsaWdubWVudCk7CisJCQlicmVhazsKKworCQlj YXNlIFJFUV9GUkVFOgorCQkJcmVzcC0+cmVzcG9uc2VfdHlwZSA9IFJFU1BfRlJFRTsKKwkJCXJl c3AtPmZyZWUuZnJlZWQgPSBpYWwtPmZyZWUoaWFsLCByZXEtPmZyZWUuaGFuZGxlKTsKKwkJCWFs bG9jX2luZm8oIjxmcmVlPiBbdGlkOiAlbGRdIGFobmQ6ICUiIFBSSXg2NAorCQkJCSAgICIsIGN0 eDogJXUsIHZtOiAldSIKKwkJCQkgICAiLCBoYW5kbGU6ICV1LCBmcmVlZDogJWRcbiIsCisJCQkJ ICAgKGxvbmcpIHJlcS0+dGlkLCByZXEtPmFsbG9jYXRvcl9oYW5kbGUsCisJCQkJICAgYWwtPmN0 eCwgYWwtPnZtLAorCQkJCSAgIHJlcS0+ZnJlZS5oYW5kbGUsIHJlc3AtPmZyZWUuZnJlZWQpOwor CQkJYnJlYWs7CisKKwkJY2FzZSBSRVFfSVNfQUxMT0NBVEVEOgorCQkJcmVzcC0+cmVzcG9uc2Vf dHlwZSA9IFJFU1BfSVNfQUxMT0NBVEVEOworCQkJYWxsb2NhdGVkID0gaWFsLT5pc19hbGxvY2F0 ZWQoaWFsLAorCQkJCQkJICAgICAgcmVxLT5pc19hbGxvY2F0ZWQuaGFuZGxlLAorCQkJCQkJICAg ICAgcmVxLT5pc19hbGxvY2F0ZWQuc2l6ZSwKKwkJCQkJCSAgICAgIHJlcS0+aXNfYWxsb2NhdGVk Lm9mZnNldCk7CisJCQlyZXNwLT5pc19hbGxvY2F0ZWQuYWxsb2NhdGVkID0gYWxsb2NhdGVkOwor CQkJYWxsb2NfaW5mbygiPGlzIGFsbG9jYXRlZD4gW3RpZDogJWxkXSBhaG5kOiAlIiBQUkl4NjQK KwkJCQkgICAiLCBjdHg6ICV1LCB2bTogJXUiCisJCQkJICAgIiwgb2Zmc2V0OiAweCUiIFBSSXg2 NAorCQkJCSAgICIsIGFsbG9jYXRlZDogJWRcbiIsIChsb25nKSByZXEtPnRpZCwKKwkJCQkgICBy ZXEtPmFsbG9jYXRvcl9oYW5kbGUsIGFsLT5jdHgsIGFsLT52bSwKKwkJCQkgICByZXEtPmlzX2Fs bG9jYXRlZC5vZmZzZXQsIGFsbG9jYXRlZCk7CisJCQlicmVhazsKKworCQljYXNlIFJFUV9SRVNF UlZFOgorCQkJcmVzcC0+cmVzcG9uc2VfdHlwZSA9IFJFU1BfUkVTRVJWRTsKKwkJCXJlc2VydmVk ID0gaWFsLT5yZXNlcnZlKGlhbCwKKwkJCQkJCXJlcS0+cmVzZXJ2ZS5oYW5kbGUsCisJCQkJCQly ZXEtPnJlc2VydmUuc3RhcnQsCisJCQkJCQlyZXEtPnJlc2VydmUuZW5kKTsKKwkJCXJlc3AtPnJl c2VydmUucmVzZXJ2ZWQgPSByZXNlcnZlZDsKKwkJCWFsbG9jX2luZm8oIjxyZXNlcnZlPiBbdGlk OiAlbGRdIGFobmQ6ICUiIFBSSXg2NAorCQkJCSAgICIsIGN0eDogJXUsIHZtOiAldSwgaGFuZGxl OiAldSIKKwkJCQkgICAiLCBzdGFydDogMHglIiBQUkl4NjQgIiwgZW5kOiAweCUiIFBSSXg2NAor CQkJCSAgICIsIHJlc2VydmVkOiAlZFxuIiwKKwkJCQkgICAobG9uZykgcmVxLT50aWQsIHJlcS0+ YWxsb2NhdG9yX2hhbmRsZSwKKwkJCQkgICBhbC0+Y3R4LCBhbC0+dm0sIHJlcS0+cmVzZXJ2ZS5o YW5kbGUsCisJCQkJICAgcmVxLT5yZXNlcnZlLnN0YXJ0LCByZXEtPnJlc2VydmUuZW5kLCByZXNl cnZlZCk7CisJCQlicmVhazsKKworCQljYXNlIFJFUV9VTlJFU0VSVkU6CisJCQlyZXNwLT5yZXNw b25zZV90eXBlID0gUkVTUF9VTlJFU0VSVkU7CisJCQl1bnJlc2VydmVkID0gaWFsLT51bnJlc2Vy dmUoaWFsLAorCQkJCQkJICAgIHJlcS0+dW5yZXNlcnZlLmhhbmRsZSwKKwkJCQkJCSAgICByZXEt PnVucmVzZXJ2ZS5zdGFydCwKKwkJCQkJCSAgICByZXEtPnVucmVzZXJ2ZS5lbmQpOworCQkJcmVz cC0+dW5yZXNlcnZlLnVucmVzZXJ2ZWQgPSB1bnJlc2VydmVkOworCQkJYWxsb2NfaW5mbygiPHVu cmVzZXJ2ZT4gW3RpZDogJWxkXSBhaG5kOiAlIiBQUkl4NjQKKwkJCQkgICAiLCBjdHg6ICV1LCB2 bTogJXUsIGhhbmRsZTogJXUiCisJCQkJICAgIiwgc3RhcnQ6IDB4JSIgUFJJeDY0ICIsIGVuZDog MHglIiBQUkl4NjQKKwkJCQkgICAiLCB1bnJlc2VydmVkOiAlZFxuIiwKKwkJCQkgICAobG9uZykg cmVxLT50aWQsIHJlcS0+YWxsb2NhdG9yX2hhbmRsZSwKKwkJCQkgICBhbC0+Y3R4LCBhbC0+dm0s IHJlcS0+dW5yZXNlcnZlLmhhbmRsZSwKKwkJCQkgICByZXEtPnVucmVzZXJ2ZS5zdGFydCwgcmVx LT51bnJlc2VydmUuZW5kLAorCQkJCSAgIHVucmVzZXJ2ZWQpOworCQkJYnJlYWs7CisKKwkJY2Fz ZSBSRVFfSVNfUkVTRVJWRUQ6CisJCQlyZXNwLT5yZXNwb25zZV90eXBlID0gUkVTUF9JU19SRVNF UlZFRDsKKwkJCXJlc2VydmVkID0gaWFsLT5pc19yZXNlcnZlZChpYWwsCisJCQkJCQkgICAgcmVx LT5pc19yZXNlcnZlZC5zdGFydCwKKwkJCQkJCSAgICByZXEtPmlzX3Jlc2VydmVkLmVuZCk7CisJ CQlyZXNwLT5pc19yZXNlcnZlZC5yZXNlcnZlZCA9IHJlc2VydmVkOworCQkJYWxsb2NfaW5mbygi PGlzIHJlc2VydmVkPiBbdGlkOiAlbGRdIGFobmQ6ICUiIFBSSXg2NAorCQkJCSAgICIsIGN0eDog JXUsIHZtOiAldSIKKwkJCQkgICAiLCBzdGFydDogMHglIiBQUkl4NjQgIiwgZW5kOiAweCUiIFBS SXg2NAorCQkJCSAgICIsIHJlc2VydmVkOiAlZFxuIiwKKwkJCQkgICAobG9uZykgcmVxLT50aWQs IHJlcS0+YWxsb2NhdG9yX2hhbmRsZSwKKwkJCQkgICBhbC0+Y3R4LCBhbC0+dm0sIHJlcS0+aXNf cmVzZXJ2ZWQuc3RhcnQsCisJCQkJICAgcmVxLT5pc19yZXNlcnZlZC5lbmQsIHJlc2VydmVkKTsK KwkJCWJyZWFrOworCisJCWNhc2UgUkVRX1JFU0VSVkVfSUZfTk9UX0FMTE9DQVRFRDoKKwkJCXJl c3AtPnJlc3BvbnNlX3R5cGUgPSBSRVNQX1JFU0VSVkVfSUZfTk9UX0FMTE9DQVRFRDsKKwkJCXNp emUgPSByZXEtPnJlc2VydmUuZW5kIC0gcmVxLT5yZXNlcnZlLnN0YXJ0OworCisJCQlhbGxvY2F0 ZWQgPSBpYWwtPmlzX2FsbG9jYXRlZChpYWwsIHJlcS0+cmVzZXJ2ZS5oYW5kbGUsCisJCQkJCQkg ICAgICBzaXplLCByZXEtPnJlc2VydmUuc3RhcnQpOworCQkJaWYgKGFsbG9jYXRlZCkgeworCQkJ CXJlc3AtPnJlc2VydmVfaWZfbm90X2FsbG9jYXRlZC5hbGxvY2F0ZWQgPSBhbGxvY2F0ZWQ7CisJ CQkJYWxsb2NfaW5mbygiPHJlc2VydmUgaWYgbm90IGFsbG9jYXRlZD4gW3RpZDogJWxkXSAiCisJ CQkJCSAgICJhaG5kOiAlIiBQUkl4NjQgIiwgY3R4OiAldSwgdm06ICV1IgorCQkJCQkgICAiLCBo YW5kbGU6ICV1LCBzaXplOiAweCVseCIKKwkJCQkJICAgIiwgc3RhcnQ6IDB4JSIgUFJJeDY0ICIs IGVuZDogMHglIiBQUkl4NjQKKwkJCQkJICAgIiwgYWxsb2NhdGVkOiAlZCwgcmVzZXJ2ZWQ6ICVk XG4iLAorCQkJCQkgICAobG9uZykgcmVxLT50aWQsIHJlcS0+YWxsb2NhdG9yX2hhbmRsZSwKKwkJ CQkJICAgYWwtPmN0eCwgYWwtPnZtLCByZXEtPnJlc2VydmUuaGFuZGxlLAorCQkJCQkgICAobG9u Zykgc2l6ZSwgcmVxLT5yZXNlcnZlLnN0YXJ0LAorCQkJCQkgICByZXEtPnJlc2VydmUuZW5kLCBh bGxvY2F0ZWQsIGZhbHNlKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcmVzZXJ2ZWQgPSBpYWwt PnJlc2VydmUoaWFsLAorCQkJCQkJcmVxLT5yZXNlcnZlLmhhbmRsZSwKKwkJCQkJCXJlcS0+cmVz ZXJ2ZS5zdGFydCwKKwkJCQkJCXJlcS0+cmVzZXJ2ZS5lbmQpOworCQkJcmVzcC0+cmVzZXJ2ZV9p Zl9ub3RfYWxsb2NhdGVkLnJlc2VydmVkID0gcmVzZXJ2ZWQ7CisJCQlhbGxvY19pbmZvKCI8cmVz ZXJ2ZSBpZiBub3QgYWxsb2NhdGVkPiBbdGlkOiAlbGRdICIKKwkJCQkgICAiYWhuZDogJSIgUFJJ eDY0ICIsIGN0eDogJXUsIHZtOiAldSIKKwkJCQkgICAiLCBoYW5kbGU6ICV1LCBzdGFydDogMHgl IiBQUkl4NjQgIiwgZW5kOiAweCUiIFBSSXg2NAorCQkJCSAgICIsIGFsbG9jYXRlZDogJWQsIHJl c2VydmVkOiAlZFxuIiwKKwkJCQkgICAobG9uZykgcmVxLT50aWQsIHJlcS0+YWxsb2NhdG9yX2hh bmRsZSwKKwkJCQkgICBhbC0+Y3R4LCBhbC0+dm0sCisJCQkJICAgcmVxLT5yZXNlcnZlLmhhbmRs ZSwKKwkJCQkgICByZXEtPnJlc2VydmUuc3RhcnQsIHJlcS0+cmVzZXJ2ZS5lbmQsCisJCQkJICAg ZmFsc2UsIHJlc2VydmVkKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHJlcS0+cmVxdWVzdF90 eXBlID4gUkVRX0NMT1NFKQorCQkJcHRocmVhZF9tdXRleF91bmxvY2soJmlhbC0+bXV0ZXgpOwor CisJCXJldHVybiAwOworCX0KKworCXJldCA9IHNlbmRfcmVxX3JlY3ZfcmVzcChjaGFubmVsLCBy ZXEsIHJlc3ApOworCisJaWYgKHJldCA8IDApCisJCWV4aXQoMCk7CisKKwlyZXR1cm4gcmV0Owor fQorCitzdGF0aWMgdm9pZCBraWxsX2NoaWxkcmVuKGludCBzaWcpCit7CisJc2lnaGFuZGxlcl90 IG9sZDsKKworCW9sZCA9IHNpZ25hbChzaWcsIFNJR19JR04pOworCWlndF9hc3NlcnQob2xkICE9 IFNJR19FUlIpOworCWtpbGwoLWdldHBncnAoKSwgc2lnKTsKKwlpZ3RfYXNzZXJ0KHNpZ25hbChz aWcsIG9sZCkgIT0gU0lHX0VSUik7Cit9CisKK3N0YXRpYyB2b2lkICphbGxvY2F0b3JfdGhyZWFk X2xvb3Aodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYWxsb2NfcmVxIHJlcTsKKwlzdHJ1Y3QgYWxs b2NfcmVzcCByZXNwOworCWludCByZXQ7CisJKHZvaWQpIGRhdGE7CisKKwlhbGxvY19pbmZvKCJB bGxvY2F0b3IgcGlkOiAlbGQsIHRpZDogJWxkXG4iLAorCQkgICAobG9uZykgYWxsb2NhdG9yX3Bp ZCwgKGxvbmcpIGdldHRpZCgpKTsKKwlhbGxvY19pbmZvKCJFbnRlcmluZyBhbGxvY2F0b3IgbG9v cFxuIik7CisKKwl3aGlsZSAoMSkgeworCQlyZXQgPSByZWN2X3JlcShjaGFubmVsLCAmcmVxKTsK KworCQlpZiAocmV0ID09IC0xKSB7CisJCQlpZ3Rfd2FybigiRXJyb3IgcmVjZWl2aW5nIHJlcXVl c3QgaW4gdGhyZWFkLCByZXQgPSAlZCBbJXNdXG4iLAorCQkJCSByZXQsIHN0cmVycm9yKGVycm5v KSk7CisJCQlraWxsX2NoaWxkcmVuKFNJR0lOVCk7CisJCQlyZXR1cm4gKHZvaWQgKikgLTE7CisJ CX0KKworCQkvKiBGYWtlIG1lc3NhZ2UgdG8gc3RvcCB0aGUgdGhyZWFkICovCisJCWlmIChyZXEu cmVxdWVzdF90eXBlID09IFJFUV9TVE9QKSB7CisJCQlhbGxvY19pbmZvKCI8c3RvcCByZXF1ZXN0 PlxuIik7CisJCQlicmVhazsKKwkJfQorCisJCXJldCA9IGhhbmRsZV9yZXF1ZXN0KCZyZXEsICZy ZXNwKTsKKwkJaWYgKHJldCkgeworCQkJaWd0X3dhcm4oIkVycm9yIGhhbmRsaW5nIHJlcXVlc3Qg aW4gdGhyZWFkLCByZXQgPSAlZCBbJXNdXG4iLAorCQkJCSByZXQsIHN0cmVycm9yKGVycm5vKSk7 CisJCQlicmVhazsKKwkJfQorCisJCXJldCA9IHNlbmRfcmVzcChjaGFubmVsLCByZXEudGlkLCAm cmVzcCk7CisJCWlmIChyZXQpIHsKKwkJCWlndF93YXJuKCJFcnJvciBzZW5kaW5nIHJlc3BvbnNl IGluIHRocmVhZCwgcmV0ID0gJWQgWyVzXVxuIiwKKwkJCQkgcmV0LCBzdHJlcnJvcihlcnJubykp OworCisJCQlraWxsX2NoaWxkcmVuKFNJR0lOVCk7CisJCQlyZXR1cm4gKHZvaWQgKikgLTE7CisJ CX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBpbnRlbF9hbGxvY2F0b3JfbXVs dGlwcm9jZXNzX3N0YXJ0OgorICoKKyAqIEZ1bmN0aW9uIHR1cm5zIG9uIGludGVsX2FsbG9jYXRv ciBtdWx0aXByb2Nlc3MgbW9kZSB3aGF0IG1lYW5zCisgKiBhbGwgYWxsb2NhdGlvbnMgZnJvbSBj aGlsZHJlbiBwcm9jZXNzZXMgYXJlIHBlcmZvcm1lZCBpbiBhIHNlcGFyYXRlIHRocmVhZAorICog d2l0aGluIG1haW4gaWd0IHByb2Nlc3MuIENoaWxkcmVuIGFyZSBhd2FyZSBvZiB0aGUgc2l0dWF0 aW9uIGFuZCB1c2UKKyAqIHNvbWUgaW50ZXJwcm9jZXNzIGNvbW11bmljYXRpb24gY2hhbm5lbCB0 byBzZW5kL3JlY2VpdmUgbWVzc2FnZXMKKyAqIChvcGVuLCBjbG9zZSwgYWxsb2MsIGZyZWUsIC4u LikgdG8vZnJvbSBhbGxvY2F0b3IgdGhyZWFkLgorICoKKyAqIE11c3QgYmUgdXNlZCB3aGVuIHlv dSB3YW50IHRvIHVzZSBhbiBhbGxvY2F0b3IgaW4gbm9uIHNpbmdsZS1wcm9jZXNzIGNvZGUuCisg KiBBbGwgYWxsb2NhdGlvbnMgaW4gdGhyZWFkcyBzcGF3bmVkIGluIG1haW4gaWd0IHByb2Nlc3Mg YXJlIGhhbmRsZWQgYnkKKyAqIG11dGV4aW5nLCBub3QgYnkgc2VuZGluZy9yZWNlaXZpbmcgbWVz c2FnZXMgdG8vZnJvbSBhbGxvY2F0b3IgdGhyZWFkLgorICoKKyAqIE5vdGUuIFRoaXMgZGVzdHJv eXMgYWxsIHByZXZpb3VzbHkgY3JlYXRlZCBhbGxvY2F0b3JzIGFuZCB0aGVpcnMgY29udGVudC4K KyAqLwordm9pZCBpbnRlbF9hbGxvY2F0b3JfbXVsdGlwcm9jZXNzX3N0YXJ0KHZvaWQpCit7CisJ YWxsb2NfaW5mbygiYWxsb2NhdG9yIG11bHRpcHJvY2VzcyBzdGFydFxuIik7CisKKwlpZ3RfYXNz ZXJ0X2YoY2hpbGRfcGlkID09IC0xLAorCQkgICAgICJBbGxvY2F0b3IgdGhyZWFkIGNhbiBiZSBz cGF3bmVkIG9ubHkgaW4gbWFpbiBJR1QgcHJvY2Vzc1xuIik7CisJaW50ZWxfYWxsb2NhdG9yX2lu aXQoKTsKKworCW11bHRpcHJvY2VzcyA9IHRydWU7CisJY2hhbm5lbC0+aW5pdChjaGFubmVsKTsK KworCXB0aHJlYWRfY3JlYXRlKCZhbGxvY2F0b3JfdGhyZWFkLCBOVUxMLAorCQkgICAgICAgYWxs b2NhdG9yX3RocmVhZF9sb29wLCBOVUxMKTsKK30KKworLyoqCisgKiBpbnRlbF9hbGxvY2F0b3Jf bXVsdGlwcm9jZXNzX3N0b3A6CisgKgorICogRnVuY3Rpb24gdHVybnMgb2ZmIGludGVsX2FsbG9j YXRvciBtdWx0aXByb2Nlc3MgbW9kZSB3aGF0IG1lYW5zCisgKiBzdG9wcGluZyBhbGxvY2F0b3Ig dGhyZWFkIGFuZCBkZWluaXRpYWxpemluZyBpdHMgZGF0YS4KKyAqLwordm9pZCBpbnRlbF9hbGxv Y2F0b3JfbXVsdGlwcm9jZXNzX3N0b3Aodm9pZCkKK3sKKwlhbGxvY19pbmZvKCJhbGxvY2F0b3Ig bXVsdGlwcm9jZXNzIHN0b3BcbiIpOworCisJaWYgKG11bHRpcHJvY2VzcykgeworCQlzZW5kX2Fs bG9jX3N0b3AoY2hhbm5lbCk7CisJCS8qIERlaW5pdCwgdGhpcyBzaG91bGQgc3RvcCBhbGwgYmxv Y2tlZCBzeXNjYWxscywgaWYgYW55ICovCisJCWNoYW5uZWwtPmRlaW5pdChjaGFubmVsKTsKKwkJ cHRocmVhZF9qb2luKGFsbG9jYXRvcl90aHJlYWQsIE5VTEwpOworCQkvKiBCdXQgd2UncmUgbm90 IHN1cmUgZG9lcyBjaGlsZCB3aWxsIHN0dWNrICovCisJCWtpbGxfY2hpbGRyZW4oU0lHSU5UKTsK KwkJaWd0X3dhaXRjaGlsZHJlbl90aW1lb3V0KDUsICJTdG9wcGluZyBjaGlsZHJlbiIpOworCQlt dWx0aXByb2Nlc3MgPSBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyB1aW50NjRfdCBfX2ludGVsX2Fs bG9jYXRvcl9vcGVuX2Z1bGwoaW50IGZkLCB1aW50MzJfdCBjdHgsCisJCQkJCSAgICB1aW50MzJf dCB2bSwKKwkJCQkJICAgIHVpbnQ2NF90IHN0YXJ0LCB1aW50NjRfdCBlbmQsCisJCQkJCSAgICB1 aW50OF90IGFsbG9jYXRvcl90eXBlLAorCQkJCQkgICAgZW51bSBhbGxvY2F0b3Jfc3RyYXRlZ3kg c3RyYXRlZ3kpCit7CisJc3RydWN0IGFsbG9jX3JlcSByZXEgPSB7IC5yZXF1ZXN0X3R5cGUgPSBS RVFfT1BFTiwKKwkJCQkgLm9wZW4uZmQgPSBmZCwKKwkJCQkgLm9wZW4uY3R4ID0gY3R4LAorCQkJ CSAub3Blbi52bSA9IHZtLAorCQkJCSAub3Blbi5zdGFydCA9IHN0YXJ0LAorCQkJCSAub3Blbi5l bmQgPSBlbmQsCisJCQkJIC5vcGVuLmFsbG9jYXRvcl90eXBlID0gYWxsb2NhdG9yX3R5cGUsCisJ CQkJIC5vcGVuLmFsbG9jYXRvcl9zdHJhdGVneSA9IHN0cmF0ZWd5IH07CisJc3RydWN0IGFsbG9j X3Jlc3AgcmVzcDsKKworCS8qIEdldCBjaGlsZF90aWQgb25seSBvbmNlIGF0IG9wZW4oKSAqLwor CWlmIChjaGlsZF90aWQgPT0gLTEpCisJCWNoaWxkX3RpZCA9IGdldHRpZCgpOworCisJaWd0X2Fz c2VydChoYW5kbGVfcmVxdWVzdCgmcmVxLCAmcmVzcCkgPT0gMCk7CisJaWd0X2Fzc2VydChyZXNw Lm9wZW4uYWxsb2NhdG9yX2hhbmRsZSk7CisJaWd0X2Fzc2VydChyZXNwLnJlc3BvbnNlX3R5cGUg PT0gUkVTUF9PUEVOKTsKKworCXJldHVybiByZXNwLm9wZW4uYWxsb2NhdG9yX2hhbmRsZTsKK30K KworLyoqCisgKiBpbnRlbF9hbGxvY2F0b3Jfb3Blbl9mdWxsOgorICogQGZkOiBpOTE1IGRlc2Ny aXB0b3IKKyAqIEBjdHg6IGNvbnRleHQKKyAqIEBzdGFydDogYWRkcmVzcyBvZiB0aGUgYmVnaW5u aW5nCisgKiBAZW5kOiBhZGRyZXNzIG9mIHRoZSBlbmQKKyAqIEBhbGxvY2F0b3JfdHlwZTogb25l IG9mIElOVEVMX0FMTE9DQVRPUl8qIGRlZmluZQorICogQHN0cmF0ZWd5OiBwYXNzZWQgdG8gdGhl IGFsbG9jYXRvciB0byBkZWZpbmUgdGhlIHN0cmF0ZWd5IChsaWtlIG9yZGVyCisgKiBvZiBhbGxv Y2F0aW9uLCBzZWUgbm90ZXMgYmVsb3cpLgorICoKKyAqIEZ1bmN0aW9uIG9wZW5zIGFuIGFsbG9j YXRvciBpbnN0YW5jZSB3aXRoaW4gPEBzdGFydCwgQGVuZCkgdm0gZm9yIGdpdmVuCisgKiBAZmQg YW5kIEBjdHggYW5kIHJldHVybnMgaXRzIGhhbmRsZS4gSWYgdGhlIGFsbG9jYXRvciBmb3Igc3Vj aCBwYWlyCisgKiBkb2Vzbid0IGV4aXN0IGl0IGlzIGNyZWF0ZWQgd2l0aCByZWZjb3VudCA9IDEu CisgKiBQYXJhbGxlbCBvcGVucyByZXR1cm5zIHNhbWUgaGFuZGxlIGJ1bXBpbmcgaXRzIHJlZmNv dW50LgorICoKKyAqIFJldHVybnM6IHVuaXF1ZSBoYW5kbGUgdG8gdGhlIGN1cnJlbnRseSBvcGVu ZWQgYWxsb2NhdG9yLgorICoKKyAqIE5vdGVzOgorICogU3RyYXRlZ3kgaXMgZ2VuZXJhbGx5IHVz ZWQgaW50ZXJuYWxseSBieSB0aGUgdW5kZXJseWluZyBhbGxvY2F0b3I6CisgKgorICogRm9yIFNJ TVBMRSBhbGxvY2F0b3I6CisgKiAtIEFMTE9DX1NUUkFURUdZX0hJR0hfVE9fTE9XIG1lYW5zIHRv cG1vc3QgYWRkcmVzc2VzIGFyZSBhbGxvY2F0ZWQgZmlyc3QsCisgKiAtIEFMTE9DX1NUUkFURUdZ X0xPV19UT19ISUdIIG9wcG9zaXRlLCBhbGxvY2F0aW9uIHN0YXJ0cyBmcm9tIGxvd2VzdAorICog ICBhZGRyZXNzZXMuCisgKgorICogRm9yIFJBTkRPTSBhbGxvY2F0b3I6CisgKiAtIG5vbmUgb2Yg c3RyYXRlZ3kgaXMgY3VycmVudGx5IGltcGxlbWVudGVkLgorICovCit1aW50NjRfdCBpbnRlbF9h bGxvY2F0b3Jfb3Blbl9mdWxsKGludCBmZCwgdWludDMyX3QgY3R4LAorCQkJCSAgIHVpbnQ2NF90 IHN0YXJ0LCB1aW50NjRfdCBlbmQsCisJCQkJICAgdWludDhfdCBhbGxvY2F0b3JfdHlwZSwKKwkJ CQkgICBlbnVtIGFsbG9jYXRvcl9zdHJhdGVneSBzdHJhdGVneSkKK3sKKwlyZXR1cm4gX19pbnRl bF9hbGxvY2F0b3Jfb3Blbl9mdWxsKGZkLCBjdHgsIDAsIHN0YXJ0LCBlbmQsCisJCQkJCSAgIGFs bG9jYXRvcl90eXBlLCBzdHJhdGVneSk7Cit9CisKK3VpbnQ2NF90IGludGVsX2FsbG9jYXRvcl9v cGVuX3ZtX2Z1bGwoaW50IGZkLCB1aW50MzJfdCB2bSwKKwkJCQkgICAgICB1aW50NjRfdCBzdGFy dCwgdWludDY0X3QgZW5kLAorCQkJCSAgICAgIHVpbnQ4X3QgYWxsb2NhdG9yX3R5cGUsCisJCQkJ ICAgICAgZW51bSBhbGxvY2F0b3Jfc3RyYXRlZ3kgc3RyYXRlZ3kpCit7CisJaWd0X2Fzc2VydCh2 bSAhPSAwKTsKKwlyZXR1cm4gX19pbnRlbF9hbGxvY2F0b3Jfb3Blbl9mdWxsKGZkLCAwLCB2bSwg c3RhcnQsIGVuZCwKKwkJCQkJICAgYWxsb2NhdG9yX3R5cGUsIHN0cmF0ZWd5KTsKK30KKworLyoq CisgKiBpbnRlbF9hbGxvY2F0b3Jfb3BlbjoKKyAqIEBmZDogaTkxNSBkZXNjcmlwdG9yCisgKiBA Y3R4OiBjb250ZXh0CisgKiBAYWxsb2NhdG9yX3R5cGU6IG9uZSBvZiBJTlRFTF9BTExPQ0FUT1Jf KiBkZWZpbmUKKyAqCisgKiBGdW5jdGlvbiBvcGVucyBhbiBhbGxvY2F0b3IgaW5zdGFuY2UgZm9y IGdpdmVuIEBmZCBhbmQgQGN0eCBhbmQgcmV0dXJucworICogaXRzIGhhbmRsZS4gSWYgdGhlIGFs bG9jYXRvciBmb3Igc3VjaCBwYWlyIGRvZXNuJ3QgZXhpc3QgaXQgaXMgY3JlYXRlZAorICogd2l0 aCByZWZjb3VudCA9IDEuIFBhcmFsbGVsIG9wZW5zIHJldHVybnMgc2FtZSBoYW5kbGUgYnVtcGlu ZyBpdHMgcmVmY291bnQuCisgKgorICogUmV0dXJuczogdW5pcXVlIGhhbmRsZSB0byB0aGUgY3Vy cmVudGx5IG9wZW5lZCBhbGxvY2F0b3IuCisgKgorICogTm90ZXM6IHdlIHBhc3MgQUxMT0NfU1RS QVRFR1lfSElHSF9UT19MT1cgYXMgZGVmYXVsdCwgcGxheWluZyB3aXRoIGhpZ2hlcgorICogYWRk cmVzc2VzIG1ha2VzIGVhc2llciB0byBmaW5kIGFkZHJlc3NpbmcgaXNzdWVzIChsaWtlIHBhc3Np bmcgbm9uLWNhbm9uaWNhbAorICogb2Zmc2V0cywgd2hpY2ggd29uJ3QgYmUgY2F0Y2hlZCB1bmxl c3MgNDctYml0IGlzIHNldCkuCisgKi8KK3VpbnQ2NF90IGludGVsX2FsbG9jYXRvcl9vcGVuKGlu dCBmZCwgdWludDMyX3QgY3R4LCB1aW50OF90IGFsbG9jYXRvcl90eXBlKQoreworCXJldHVybiBp bnRlbF9hbGxvY2F0b3Jfb3Blbl9mdWxsKGZkLCBjdHgsIDAsIDAsIGFsbG9jYXRvcl90eXBlLAor CQkJCQkgQUxMT0NfU1RSQVRFR1lfSElHSF9UT19MT1cpOworfQorCit1aW50NjRfdCBpbnRlbF9h bGxvY2F0b3Jfb3Blbl92bShpbnQgZmQsIHVpbnQzMl90IHZtLCB1aW50OF90IGFsbG9jYXRvcl90 eXBlKQoreworCXJldHVybiBpbnRlbF9hbGxvY2F0b3Jfb3Blbl92bV9mdWxsKGZkLCB2bSwgMCwg MCwgYWxsb2NhdG9yX3R5cGUsCisJCQkJCSAgICBBTExPQ19TVFJBVEVHWV9ISUdIX1RPX0xPVyk7 Cit9CisKK3VpbnQ2NF90IGludGVsX2FsbG9jYXRvcl9vcGVuX3ZtX2FzKHVpbnQ2NF90IGFsbG9j YXRvcl9oYW5kbGUsIHVpbnQzMl90IG5ld192bSkKK3sKKwlzdHJ1Y3QgYWxsb2NfcmVxIHJlcSA9 IHsgLnJlcXVlc3RfdHlwZSA9IFJFUV9PUEVOX0FTLAorCQkJCSAuYWxsb2NhdG9yX2hhbmRsZSA9 IGFsbG9jYXRvcl9oYW5kbGUsCisJCQkJIC5vcGVuX2FzLm5ld192bSA9IG5ld192bSB9OworCXN0 cnVjdCBhbGxvY19yZXNwIHJlc3A7CisKKwkvKiBHZXQgY2hpbGRfdGlkIG9ubHkgb25jZSBhdCBv cGVuKCkgKi8KKwlpZiAoY2hpbGRfdGlkID09IC0xKQorCQljaGlsZF90aWQgPSBnZXR0aWQoKTsK KworCWlndF9hc3NlcnQoaGFuZGxlX3JlcXVlc3QoJnJlcSwgJnJlc3ApID09IDApOworCWlndF9h c3NlcnQocmVzcC5vcGVuX2FzLmFsbG9jYXRvcl9oYW5kbGUpOworCWlndF9hc3NlcnQocmVzcC5y ZXNwb25zZV90eXBlID09IFJFU1BfT1BFTl9BUyk7CisKKwlyZXR1cm4gcmVzcC5vcGVuLmFsbG9j YXRvcl9oYW5kbGU7Cit9CisKKy8qKgorICogaW50ZWxfYWxsb2NhdG9yX2Nsb3NlOgorICogQGFs bG9jYXRvcl9oYW5kbGU6IGhhbmRsZSB0byB0aGUgYWxsb2NhdG9yIHRoYXQgd2lsbCBiZSBjbG9z ZWQKKyAqCisgKiBGdW5jdGlvbiBkZWNyZWFzZXMgYW4gYWxsb2NhdG9yIHJlZmNvdW50IGZvciB0 aGUgZ2l2ZW4gQGhhbmRsZS4KKyAqIFdoZW4gcmVmY291bnQgcmVhY2hlcyB6ZXJvIGFsbG9jYXRv ciBpcyBjbG9zZWQgKGRlc3Ryb3llZCkgYW5kIGFsbAorICogYWxsb2NhdGVkIC8gcmVzZXJ2ZWQg YXJlYXMgYXJlIGZyZWVkLgorICoKKyAqIFJldHVybnM6IHRydWUgaWYgY2xvc2VkIGFsbG9jYXRv ciB3YXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KKyAqLworYm9vbCBpbnRlbF9hbGxvY2F0b3Jf Y2xvc2UodWludDY0X3QgYWxsb2NhdG9yX2hhbmRsZSkKK3sKKwlzdHJ1Y3QgYWxsb2NfcmVxIHJl cSA9IHsgLnJlcXVlc3RfdHlwZSA9IFJFUV9DTE9TRSwKKwkJCQkgLmFsbG9jYXRvcl9oYW5kbGUg PSBhbGxvY2F0b3JfaGFuZGxlIH07CisJc3RydWN0IGFsbG9jX3Jlc3AgcmVzcDsKKworCWlndF9h c3NlcnQoaGFuZGxlX3JlcXVlc3QoJnJlcSwgJnJlc3ApID09IDApOworCWlndF9hc3NlcnQocmVz cC5yZXNwb25zZV90eXBlID09IFJFU1BfQ0xPU0UpOworCisJcmV0dXJuIHJlc3AuY2xvc2UuaXNf ZW1wdHk7Cit9CisKKy8qKgorICogaW50ZWxfYWxsb2NhdG9yX2dldF9hZGRyZXNzX3JhbmdlOgor ICogQGFsbG9jYXRvcl9oYW5kbGU6IGhhbmRsZSB0byBhbiBhbGxvY2F0b3IKKyAqIEBzdGFydHA6 IHBvaW50ZXIgdG8gdGhlIHZhcmlhYmxlIHdoZXJlIGZ1bmN0aW9uIHdyaXRlcyBzdGFydGluZyBv ZmZzZXQKKyAqIEBlbmRwOiBwb2ludGVyIHRvIHRoZSB2YXJpYWJsZSB3aGVyZSBmdW5jdGlvbiB3 cml0ZXMgZW5kaW5nIG9mZnNldAorICoKKyAqIEZ1bmN0aW9uIGZpbGxzIEBzdGFydHAsIEBlbmRw IHdpdGggcmVzcGVjdGl2ZWx5LCBzdGFydGluZyBhbmQgZW5kaW5nIG9mZnNldAorICogb2YgdGhl IGFsbG9jYXRvciB3b3JraW5nIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSByYW5nZS4KKyAqCisgKiBO b3RlLiBBbGxvY2F0b3JzIHdvcmtpbmcgcmFuZ2VzIGNhbiBkaWZmZXIgZGVwZW5kaW5nIG9uIHRo ZSBkZXZpY2Ugb3IKKyAqIHRoZSBhbGxvY2F0b3IgdHlwZSBzbyBiZWZvcmUgcmVzZXJ2aW5nIGEg c3BlY2lmaWMgb2Zmc2V0IGEgZ29vZCBwcmFjdGlzZQorICogaXMgdG8gZW5zdXJlIHRoYXQgYWRk cmVzcyBpcyBiZXR3ZWVuIGFjY2VwdGVkIHJhbmdlLgorICovCit2b2lkIGludGVsX2FsbG9jYXRv cl9nZXRfYWRkcmVzc19yYW5nZSh1aW50NjRfdCBhbGxvY2F0b3JfaGFuZGxlLAorCQkJCSAgICAg ICB1aW50NjRfdCAqc3RhcnRwLCB1aW50NjRfdCAqZW5kcCkKK3sKKwlzdHJ1Y3QgYWxsb2NfcmVx IHJlcSA9IHsgLnJlcXVlc3RfdHlwZSA9IFJFUV9BRERSRVNTX1JBTkdFLAorCQkJCSAuYWxsb2Nh dG9yX2hhbmRsZSA9IGFsbG9jYXRvcl9oYW5kbGUgfTsKKwlzdHJ1Y3QgYWxsb2NfcmVzcCByZXNw OworCisJaWd0X2Fzc2VydChoYW5kbGVfcmVxdWVzdCgmcmVxLCAmcmVzcCkgPT0gMCk7CisJaWd0 X2Fzc2VydChyZXNwLnJlc3BvbnNlX3R5cGUgPT0gUkVTUF9BRERSRVNTX1JBTkdFKTsKKworCWlm IChzdGFydHApCisJCSpzdGFydHAgPSByZXNwLmFkZHJlc3NfcmFuZ2Uuc3RhcnQ7CisKKwlpZiAo ZW5kcCkKKwkJKmVuZHAgPSByZXNwLmFkZHJlc3NfcmFuZ2UuZW5kOworfQorCisvKioKKyAqIGlu dGVsX2FsbG9jYXRvcl9hbGxvYzoKKyAqIEBhbGxvY2F0b3JfaGFuZGxlOiBoYW5kbGUgdG8gYW4g YWxsb2NhdG9yCisgKiBAaGFuZGxlOiBoYW5kbGUgdG8gYW4gb2JqZWN0CisgKiBAc2l6ZTogc2l6 ZSBvZiBhbiBvYmplY3QKKyAqIEBhbGlnbm1lbnQ6IGRldGVybWluZXMgb2JqZWN0IGFsaWdubWVu dAorICoKKyAqIEZ1bmN0aW9uIGZpbmRzIGFuZCByZXR1cm5zIHRoZSBtb3N0IHN1aXRhYmxlIG9m ZnNldCB3aXRoIGdpdmVuIEBhbGlnbm1lbnQKKyAqIGZvciBhbiBvYmplY3Qgd2l0aCBAc2l6ZSBp ZGVudGlmaWVkIGJ5IHRoZSBAaGFuZGxlLgorICoKKyAqIFJldHVybnM6IGN1cnJlbnRseSBhc3Np Z25lZCBhZGRyZXNzIGZvciBhIGdpdmVuIG9iamVjdC4gSWYgYW4gb2JqZWN0IHdhcworICogYWxy ZWFkeSBhbGxvY2F0ZWQgcmV0dXJucyBzYW1lIGFkZHJlc3MuCisgKi8KK3VpbnQ2NF90IGludGVs X2FsbG9jYXRvcl9hbGxvYyh1aW50NjRfdCBhbGxvY2F0b3JfaGFuZGxlLCB1aW50MzJfdCBoYW5k bGUsCisJCQkgICAgICAgdWludDY0X3Qgc2l6ZSwgdWludDY0X3QgYWxpZ25tZW50KQoreworCXN0 cnVjdCBhbGxvY19yZXEgcmVxID0geyAucmVxdWVzdF90eXBlID0gUkVRX0FMTE9DLAorCQkJCSAu YWxsb2NhdG9yX2hhbmRsZSA9IGFsbG9jYXRvcl9oYW5kbGUsCisJCQkJIC5hbGxvYy5oYW5kbGUg PSBoYW5kbGUsCisJCQkJIC5hbGxvYy5zaXplID0gc2l6ZSwKKwkJCQkgLmFsbG9jLmFsaWdubWVu dCA9IGFsaWdubWVudCB9OworCXN0cnVjdCBhbGxvY19yZXNwIHJlc3A7CisKKwlpZ3RfYXNzZXJ0 KGhhbmRsZV9yZXF1ZXN0KCZyZXEsICZyZXNwKSA9PSAwKTsKKwlpZ3RfYXNzZXJ0KHJlc3AucmVz cG9uc2VfdHlwZSA9PSBSRVNQX0FMTE9DKTsKKworCXJldHVybiByZXNwLmFsbG9jLm9mZnNldDsK K30KKworLyoqCisgKiBpbnRlbF9hbGxvY2F0b3JfZnJlZToKKyAqIEBhbGxvY2F0b3JfaGFuZGxl OiBoYW5kbGUgdG8gYW4gYWxsb2NhdG9yCisgKiBAaGFuZGxlOiBoYW5kbGUgdG8gYW4gb2JqZWN0 IHRvIGJlIGZyZWVkCisgKgorICogRnVuY3Rpb24gZnJlZSBvYmplY3QgaWRlbnRpZmllZCBieSB0 aGUgQGhhbmRsZSBpbiBhbGxvY2F0b3Igd2hhdCBtYWtlcyBpdAorICogb2Zmc2V0IGFnYWluIGFs bG9jYWJsZS4KKyAqCisgKiBOb3RlLiBSZXNlcnZlZCBvYmplY3RzIGNhbiBvbmx5IGJlIGZyZWVk IGJ5IGFuICNpbnRlbF9hbGxvY2F0b3JfdW5yZXNlcnZlCisgKiBmdW5jdGlvbi4KKyAqCisgKiBS ZXR1cm5zOiB0cnVlIGlmIHRoZSBvYmplY3Qgd2FzIHN1Y2Nlc3NmdWxseSBmcmVlZCwgb3RoZXJ3 aXNlIGZhbHNlLgorICovCitib29sIGludGVsX2FsbG9jYXRvcl9mcmVlKHVpbnQ2NF90IGFsbG9j YXRvcl9oYW5kbGUsIHVpbnQzMl90IGhhbmRsZSkKK3sKKwlzdHJ1Y3QgYWxsb2NfcmVxIHJlcSA9 IHsgLnJlcXVlc3RfdHlwZSA9IFJFUV9GUkVFLAorCQkJCSAuYWxsb2NhdG9yX2hhbmRsZSA9IGFs bG9jYXRvcl9oYW5kbGUsCisJCQkJIC5mcmVlLmhhbmRsZSA9IGhhbmRsZSB9OworCXN0cnVjdCBh bGxvY19yZXNwIHJlc3A7CisKKwlpZ3RfYXNzZXJ0KGhhbmRsZV9yZXF1ZXN0KCZyZXEsICZyZXNw KSA9PSAwKTsKKwlpZ3RfYXNzZXJ0KHJlc3AucmVzcG9uc2VfdHlwZSA9PSBSRVNQX0ZSRUUpOwor CisJcmV0dXJuIHJlc3AuZnJlZS5mcmVlZDsKK30KKworLyoqCisgKiBpbnRlbF9hbGxvY2F0b3Jf aXNfYWxsb2NhdGVkOgorICogQGFsbG9jYXRvcl9oYW5kbGU6IGhhbmRsZSB0byBhbiBhbGxvY2F0 b3IKKyAqIEBoYW5kbGU6IGhhbmRsZSB0byBhbiBvYmplY3QKKyAqIEBzaXplOiBzaXplIG9mIGFu IG9iamVjdAorICogQG9mZnNldDogYWRkcmVzcyBvZiBhbiBvYmplY3QKKyAqCisgKiBGdW5jdGlv biBjaGVja3Mgd2hldGhlciB0aGUgb2JqZWN0IGlkZW50aWZpZWQgYnkgdGhlIEBoYW5kbGUgYW5k IEBzaXplCisgKiBpcyBhbGxvY2F0ZWQgYXQgdGhlIEBvZmZzZXQuCisgKgorICogUmV0dXJuczog dHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGN1cnJlbnRseSBhbGxvY2F0ZWQgYXQgdGhlIEBvZmZzZXQs CisgKiBvdGhlcndpc2UgZmFsc2UuCisgKi8KK2Jvb2wgaW50ZWxfYWxsb2NhdG9yX2lzX2FsbG9j YXRlZCh1aW50NjRfdCBhbGxvY2F0b3JfaGFuZGxlLCB1aW50MzJfdCBoYW5kbGUsCisJCQkJICB1 aW50NjRfdCBzaXplLCB1aW50NjRfdCBvZmZzZXQpCit7CisJc3RydWN0IGFsbG9jX3JlcSByZXEg PSB7IC5yZXF1ZXN0X3R5cGUgPSBSRVFfSVNfQUxMT0NBVEVELAorCQkJCSAuYWxsb2NhdG9yX2hh bmRsZSA9IGFsbG9jYXRvcl9oYW5kbGUsCisJCQkJIC5pc19hbGxvY2F0ZWQuaGFuZGxlID0gaGFu ZGxlLAorCQkJCSAuaXNfYWxsb2NhdGVkLnNpemUgPSBzaXplLAorCQkJCSAuaXNfYWxsb2NhdGVk Lm9mZnNldCA9IG9mZnNldCB9OworCXN0cnVjdCBhbGxvY19yZXNwIHJlc3A7CisKKwlpZ3RfYXNz ZXJ0KGhhbmRsZV9yZXF1ZXN0KCZyZXEsICZyZXNwKSA9PSAwKTsKKwlpZ3RfYXNzZXJ0KHJlc3Au cmVzcG9uc2VfdHlwZSA9PSBSRVNQX0lTX0FMTE9DQVRFRCk7CisKKwlyZXR1cm4gcmVzcC5pc19h bGxvY2F0ZWQuYWxsb2NhdGVkOworfQorCisvKioKKyAqIGludGVsX2FsbG9jYXRvcl9yZXNlcnZl OgorICogQGFsbG9jYXRvcl9oYW5kbGU6IGhhbmRsZSB0byBhbiBhbGxvY2F0b3IKKyAqIEBoYW5k bGU6IGhhbmRsZSB0byBhbiBvYmplY3QKKyAqIEBzaXplOiBzaXplIG9mIGFuIG9iamVjdAorICog QG9mZnNldDogYWRkcmVzcyBvZiBhbiBvYmplY3QKKyAqCisgKiBGdW5jdGlvbiByZXNlcnZlcyBz cGFjZSB0aGF0IHN0YXJ0cyBhdCB0aGUgQG9mZnNldCBhbmQgaGFzIEBzaXplLgorICogT3B0aW9u YWxseSB3ZSBjYW4gcGFzcyBAaGFuZGxlIHRvIG1hcmsgdGhhdCBzcGFjZSBpcyBmb3IgYSBzcGVj aWZpYworICogb2JqZWN0LCBvdGhlcndpc2UgcGFzcyAtMS4KKyAqCisgKiBOb3RlLiBSZXNlcnZl ZCBzcGFjZSBpcyBpZGVudGlmaWVkIGJ5IG9mZnNldCBhbmQgc2l6ZSwgbm90IGEgaGFuZGxlLgor ICogU28gYW4gb2JqZWN0IGNhbiBoYXZlIG11bHRpcGxlIHJlc2VydmVkIHNwYWNlcyB3aXRoIGl0 cyBoYW5kbGUuCisgKgorICogUmV0dXJuczogdHJ1ZSBpZiBzcGFjZSBpcyBzdWNjZXNzZnVsbHkg cmVzZXJ2ZWQsIG90aGVyd2lzZSBmYWxzZS4KKyAqLworYm9vbCBpbnRlbF9hbGxvY2F0b3JfcmVz ZXJ2ZSh1aW50NjRfdCBhbGxvY2F0b3JfaGFuZGxlLCB1aW50MzJfdCBoYW5kbGUsCisJCQkgICAg IHVpbnQ2NF90IHNpemUsIHVpbnQ2NF90IG9mZnNldCkKK3sKKwlzdHJ1Y3QgYWxsb2NfcmVxIHJl cSA9IHsgLnJlcXVlc3RfdHlwZSA9IFJFUV9SRVNFUlZFLAorCQkJCSAuYWxsb2NhdG9yX2hhbmRs ZSA9IGFsbG9jYXRvcl9oYW5kbGUsCisJCQkJIC5yZXNlcnZlLmhhbmRsZSA9IGhhbmRsZSwKKwkJ CQkgLnJlc2VydmUuc3RhcnQgPSBvZmZzZXQsCisJCQkJIC5yZXNlcnZlLmVuZCA9IG9mZnNldCAr IHNpemUgfTsKKwlzdHJ1Y3QgYWxsb2NfcmVzcCByZXNwOworCisJaWd0X2Fzc2VydChoYW5kbGVf cmVxdWVzdCgmcmVxLCAmcmVzcCkgPT0gMCk7CisJaWd0X2Fzc2VydChyZXNwLnJlc3BvbnNlX3R5 cGUgPT0gUkVTUF9SRVNFUlZFKTsKKworCXJldHVybiByZXNwLnJlc2VydmUucmVzZXJ2ZWQ7Cit9 CisKKy8qKgorICogaW50ZWxfYWxsb2NhdG9yX3VucmVzZXJ2ZToKKyAqIEBhbGxvY2F0b3JfaGFu ZGxlOiBoYW5kbGUgdG8gYW4gYWxsb2NhdG9yCisgKiBAaGFuZGxlOiBoYW5kbGUgdG8gYW4gb2Jq ZWN0CisgKiBAc2l6ZTogc2l6ZSBvZiBhbiBvYmplY3QKKyAqIEBvZmZzZXQ6IGFkZHJlc3Mgb2Yg YW4gb2JqZWN0CisgKgorICogRnVuY3Rpb24gdW5yZXNlcnZlcyBzcGFjZSB0aGF0IHN0YXJ0cyBh dCB0aGUgQG9mZnNldCwgQHNpemUgYW5kIEBoYW5kbGUuCisgKgorICogTm90ZS4gQGhhbmRsZSwg QHNpemUgYW5kIEBvZmZzZXQgaGF2ZSB0byBtYXRjaCB0aG9zZSB1c2VkIGluIHJlc2VydmF0aW9u LgorICogaS5lLiBjaGVjayB3aXRoIHRoZSBzYW1lIG9mZnNldCBidXQgZXZlbiBzbWFsbGVyIHNp emUgd2lsbCBmYWlsLgorICoKKyAqIFJldHVybnM6IHRydWUgaWYgdGhlIHNwYWNlIGlzIHN1Y2Nl c3NmdWxseSB1bnJlc2VydmVkLCBvdGhlcndpc2UgZmFsc2UuCisgKi8KK2Jvb2wgaW50ZWxfYWxs b2NhdG9yX3VucmVzZXJ2ZSh1aW50NjRfdCBhbGxvY2F0b3JfaGFuZGxlLCB1aW50MzJfdCBoYW5k bGUsCisJCQkgICAgICAgdWludDY0X3Qgc2l6ZSwgdWludDY0X3Qgb2Zmc2V0KQoreworCXN0cnVj dCBhbGxvY19yZXEgcmVxID0geyAucmVxdWVzdF90eXBlID0gUkVRX1VOUkVTRVJWRSwKKwkJCQkg LmFsbG9jYXRvcl9oYW5kbGUgPSBhbGxvY2F0b3JfaGFuZGxlLAorCQkJCSAudW5yZXNlcnZlLmhh bmRsZSA9IGhhbmRsZSwKKwkJCQkgLnVucmVzZXJ2ZS5zdGFydCA9IG9mZnNldCwKKwkJCQkgLnVu cmVzZXJ2ZS5lbmQgPSBvZmZzZXQgKyBzaXplIH07CisJc3RydWN0IGFsbG9jX3Jlc3AgcmVzcDsK KworCWlndF9hc3NlcnQoaGFuZGxlX3JlcXVlc3QoJnJlcSwgJnJlc3ApID09IDApOworCWlndF9h c3NlcnQocmVzcC5yZXNwb25zZV90eXBlID09IFJFU1BfVU5SRVNFUlZFKTsKKworCXJldHVybiBy ZXNwLnVucmVzZXJ2ZS51bnJlc2VydmVkOworfQorCisvKioKKyAqIGludGVsX2FsbG9jYXRvcl9p c19yZXNlcnZlZDoKKyAqIEBhbGxvY2F0b3JfaGFuZGxlOiBoYW5kbGUgdG8gYW4gYWxsb2NhdG9y CisgKiBAc2l6ZTogc2l6ZSBvZiBhbiBvYmplY3QKKyAqIEBvZmZzZXQ6IGFkZHJlc3Mgb2YgYW4g b2JqZWN0CisgKgorICogRnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgc3BhY2Ugc3RhcnRpbmcgYXQg dGhlIEBvZmZzZXQgYW5kIEBzaXplIGlzCisgKiBjdXJyZW50bHkgdW5kZXIgcmVzZXJ2YXRpb24u CisgKgorICogTm90ZS4gQHNpemUgYW5kIEBvZmZzZXQgaGF2ZSB0byBtYXRjaCB0aG9zZSB1c2Vk IGluIHJlc2VydmF0aW9uLAorICogaS5lLiBjaGVjayB3aXRoIHRoZSBzYW1lIG9mZnNldCBidXQg ZXZlbiBzbWFsbGVyIHNpemUgd2lsbCBmYWlsLgorICoKKyAqIFJldHVybnM6IHRydWUgaWYgc3Bh Y2UgaXMgcmVzZXJ2ZWQsIG90aHdlcmlzZSBmYWxzZS4KKyAqLworYm9vbCBpbnRlbF9hbGxvY2F0 b3JfaXNfcmVzZXJ2ZWQodWludDY0X3QgYWxsb2NhdG9yX2hhbmRsZSwKKwkJCQkgdWludDY0X3Qg c2l6ZSwgdWludDY0X3Qgb2Zmc2V0KQoreworCXN0cnVjdCBhbGxvY19yZXEgcmVxID0geyAucmVx dWVzdF90eXBlID0gUkVRX0lTX1JFU0VSVkVELAorCQkJCSAuYWxsb2NhdG9yX2hhbmRsZSA9IGFs bG9jYXRvcl9oYW5kbGUsCisJCQkJIC5pc19yZXNlcnZlZC5zdGFydCA9IG9mZnNldCwKKwkJCQkg LmlzX3Jlc2VydmVkLmVuZCA9IG9mZnNldCArIHNpemUgfTsKKwlzdHJ1Y3QgYWxsb2NfcmVzcCBy ZXNwOworCisJaWd0X2Fzc2VydChoYW5kbGVfcmVxdWVzdCgmcmVxLCAmcmVzcCkgPT0gMCk7CisJ aWd0X2Fzc2VydChyZXNwLnJlc3BvbnNlX3R5cGUgPT0gUkVTUF9JU19SRVNFUlZFRCk7CisKKwly ZXR1cm4gcmVzcC5pc19yZXNlcnZlZC5yZXNlcnZlZDsKK30KKworLyoqCisgKiBpbnRlbF9hbGxv Y2F0b3JfcmVzZXJ2ZV9pZl9ub3RfYWxsb2NhdGVkOgorICogQGFsbG9jYXRvcl9oYW5kbGU6IGhh bmRsZSB0byBhbiBhbGxvY2F0b3IKKyAqIEBoYW5kbGU6IGhhbmRsZSB0byBhbiBvYmplY3QKKyAq IEBzaXplOiBzaXplIG9mIGFuIG9iamVjdAorICogQG9mZnNldDogYWRkcmVzcyBvZiBhbiBvYmpl Y3QKKyAqIEBpc19hbGxvY2F0ZWRwOiBpZiBub3QgTlVMTCBmdW5jdGlvbiB3cml0ZXMgdGhlcmUg b2JqZWN0IGFsbG9jYXRpb24gc3RhdHVzCisgKiAodHJ1ZS9mYWxzZSkKKyAqCisgKiBGdW5jdGlv biBjaGVja3Mgd2hldGhlciB0aGUgb2JqZWN0IGlkZW50aWZpZWQgYnkgdGhlIEBoYW5kbGUgYW5k IEBzaXplCisgKiBpcyBhbGxvY2F0ZWQgYXQgdGhlIEBvZmZzZXQgYW5kIHdyaXRlcyB0aGUgcmVz dWx0IHRvIEBpc19hbGxvY2F0ZWRwLgorICogSWYgaXQncyBub3QgaXQgcmVzZXJ2ZXMgaXQgYXQg dGhlIGdpdmVuIEBvZmZzZXQuCisgKgorICogUmV0dXJuczogdHJ1ZSBpZiB0aGUgc3BhY2UgZm9y IGFuIG9iamVjdCB3YXMgcmVzZXJ2ZWQsIG90aGVyd2lzZSBmYWxzZS4KKyAqLworYm9vbCBpbnRl bF9hbGxvY2F0b3JfcmVzZXJ2ZV9pZl9ub3RfYWxsb2NhdGVkKHVpbnQ2NF90IGFsbG9jYXRvcl9o YW5kbGUsCisJCQkJCSAgICAgIHVpbnQzMl90IGhhbmRsZSwKKwkJCQkJICAgICAgdWludDY0X3Qg c2l6ZSwgdWludDY0X3Qgb2Zmc2V0LAorCQkJCQkgICAgICBib29sICppc19hbGxvY2F0ZWRwKQor eworCXN0cnVjdCBhbGxvY19yZXEgcmVxID0geyAucmVxdWVzdF90eXBlID0gUkVRX1JFU0VSVkVf SUZfTk9UX0FMTE9DQVRFRCwKKwkJCQkgLmFsbG9jYXRvcl9oYW5kbGUgPSBhbGxvY2F0b3JfaGFu ZGxlLAorCQkJCSAucmVzZXJ2ZS5oYW5kbGUgPSBoYW5kbGUsCisJCQkJIC5yZXNlcnZlLnN0YXJ0 ID0gb2Zmc2V0LAorCQkJCSAucmVzZXJ2ZS5lbmQgPSBvZmZzZXQgKyBzaXplIH07CisJc3RydWN0 IGFsbG9jX3Jlc3AgcmVzcDsKKworCWlndF9hc3NlcnQoaGFuZGxlX3JlcXVlc3QoJnJlcSwgJnJl c3ApID09IDApOworCWlndF9hc3NlcnQocmVzcC5yZXNwb25zZV90eXBlID09IFJFU1BfUkVTRVJW RV9JRl9OT1RfQUxMT0NBVEVEKTsKKworCWlmIChpc19hbGxvY2F0ZWRwKQorCQkqaXNfYWxsb2Nh dGVkcCA9IHJlc3AucmVzZXJ2ZV9pZl9ub3RfYWxsb2NhdGVkLmFsbG9jYXRlZDsKKworCXJldHVy biByZXNwLnJlc2VydmVfaWZfbm90X2FsbG9jYXRlZC5yZXNlcnZlZDsKK30KKworLyoqCisgKiBp bnRlbF9hbGxvY2F0b3JfcHJpbnQ6CisgKiBAYWxsb2NhdG9yX2hhbmRsZTogaGFuZGxlIHRvIGFu IGFsbG9jYXRvcgorICoKKyAqIEZ1bmN0aW9uIHByaW50cyBzdGF0aXN0aWNzIGFuZCBjb250ZW50 IG9mIHRoZSBhbGxvY2F0b3IuCisgKiBNYWlubHkgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKyAq CisgKiBOb3RlLiBQcmludGluZyBwb3NzaWJsZSBvbmx5IGluIHRoZSBtYWluIHByb2Nlc3MuCisg KiovCit2b2lkIGludGVsX2FsbG9jYXRvcl9wcmludCh1aW50NjRfdCBhbGxvY2F0b3JfaGFuZGxl KQoreworCWlndF9hc3NlcnQoYWxsb2NhdG9yX2hhbmRsZSk7CisKKwlpZiAoIW11bHRpcHJvY2Vz cyB8fCBpc19zYW1lX3Byb2Nlc3MoKSkgeworCQlzdHJ1Y3QgaW50ZWxfYWxsb2NhdG9yICppYWwg PSBmcm9tX3VzZXJfcG9pbnRlcihhbGxvY2F0b3JfaGFuZGxlKTsKKworCQlwdGhyZWFkX211dGV4 X2xvY2soJm1hcF9tdXRleCk7CisJCWlhbC0+cHJpbnQoaWFsLCB0cnVlKTsKKwkJcHRocmVhZF9t dXRleF91bmxvY2soJm1hcF9tdXRleCk7CisJfSBlbHNlIHsKKwkJaWd0X3dhcm4oIlByaW50IHN0 YXRzIGlzIGluIG1haW4gcHJvY2VzcyBvbmx5XG4iKTsKKwl9Cit9CisKK3N0YXRpYyBib29sIGVx dWFsX2hhbmRsZXMoY29uc3Qgdm9pZCAqa2V5MSwgY29uc3Qgdm9pZCAqa2V5MikKK3sKKwljb25z dCBzdHJ1Y3QgaGFuZGxlX2VudHJ5ICpoMSA9IGtleTEsICpoMiA9IGtleTI7CisKKwlhbGxvY19k ZWJ1ZygiaDE6ICVsbHgsIGgyOiAlbGx4XG4iLAorCQkgICAobG9uZyBsb25nKSBoMS0+aGFuZGxl LCAobG9uZyBsb25nKSBoMi0+aGFuZGxlKTsKKworCXJldHVybiBoMS0+aGFuZGxlID09IGgyLT5o YW5kbGU7Cit9CisKK3N0YXRpYyBib29sIGVxdWFsX2N0eChjb25zdCB2b2lkICprZXkxLCBjb25z dCB2b2lkICprZXkyKQoreworCWNvbnN0IHN0cnVjdCBhbGxvY2F0b3IgKmExID0ga2V5MSwgKmEy ID0ga2V5MjsKKworCWFsbG9jX2RlYnVnKCJhMTogPGZkOiAlZCwgY3R4OiAldT4sIGEyIDxmZDog JWQsIGN0eDogJXU+XG4iLAorCQkgICBhMS0+ZmQsIGExLT5jdHgsIGEyLT5mZCwgYTItPmN0eCk7 CisKKwlyZXR1cm4gYTEtPmZkID09IGEyLT5mZCAmJiBhMS0+Y3R4ID09IGEyLT5jdHg7Cit9CisK K3N0YXRpYyBib29sIGVxdWFsX3ZtKGNvbnN0IHZvaWQgKmtleTEsIGNvbnN0IHZvaWQgKmtleTIp Cit7CisJY29uc3Qgc3RydWN0IGFsbG9jYXRvciAqYTEgPSBrZXkxLCAqYTIgPSBrZXkyOworCisJ YWxsb2NfZGVidWcoImExOiA8ZmQ6ICVkLCB2bTogJXU+LCBhMiA8ZmQ6ICVkLCB2bTogJXU+XG4i LAorCQkgICBhMS0+ZmQsIGExLT52bSwgYTItPmZkLCBhMi0+dm0pOworCisJcmV0dXJuIGExLT5m ZCA9PSBhMi0+ZmQgJiYgYTEtPnZtID09IGEyLT52bTsKK30KKworLyogIDJeNjMgKyAyXjYxIC0g Ml41NyArIDJeNTQgLSAyXjUxIC0gMl4xOCArIDEgKi8KKyNkZWZpbmUgR09MREVOX1JBVElPX1BS SU1FXzY0IDB4OWUzN2ZmZmZmZmZjMDAwMVVMTAorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGhh c2hfaGFuZGxlcyhjb25zdCB2b2lkICp2YWwsIHVuc2lnbmVkIGludCBiaXRzKQoreworCXVpbnQ2 NF90IGhhc2ggPSAoKHN0cnVjdCBoYW5kbGVfZW50cnkgKikgdmFsKS0+aGFuZGxlOworCisJaGFz aCA9IGhhc2ggKiBHT0xERU5fUkFUSU9fUFJJTUVfNjQ7CisJcmV0dXJuIGhhc2ggPj4gKDY0IC0g Yml0cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgaGFzaF9pbnN0YW5jZShjb25zdCB2 b2lkICp2YWwsIHVuc2lnbmVkIGludCBiaXRzKQoreworCXVpbnQ2NF90IGhhc2ggPSAoKHN0cnVj dCBhbGxvY2F0b3IgKikgdmFsKS0+ZmQ7CisKKwloYXNoID0gaGFzaCAqIEdPTERFTl9SQVRJT19Q UklNRV82NDsKKwlyZXR1cm4gaGFzaCA+PiAoNjQgLSBiaXRzKTsKK30KKworc3RhdGljIHZvaWQg X19mcmVlX21hcHMoc3RydWN0IGlndF9tYXAgKm1hcCwgYm9vbCBjbG9zZV9hbGxvY2F0b3JzKQor eworCXN0cnVjdCBpZ3RfbWFwX2VudHJ5ICpwb3M7CisJc3RydWN0IGlndF9obGlzdF9ub2RlICp0 bXA7CisJY29uc3Qgc3RydWN0IGhhbmRsZV9lbnRyeSAqaDsKKwlpbnQgaTsKKworCWlmICghbWFw KQorCQlyZXR1cm47CisKKwlpZiAoY2xvc2VfYWxsb2NhdG9ycykKKwkJaWd0X21hcF9mb3JfZWFj aF9zYWZlKG1hcCwgaSwgdG1wLCBwb3MpIHsKKwkJCWggPSBwb3MtPmtleTsKKwkJCWFsbG9jYXRv cl9jbG9zZShoLT5oYW5kbGUpOworCQl9CisKKwlpZ3RfbWFwX2ZyZWUobWFwKTsKKwlmcmVlKG1h cCk7Cit9CisKKy8qKgorICogaW50ZWxfYWxsb2NhdG9yX2luaXQ6CisgKgorICogRnVuY3Rpb24g aW5pdGlhbGl6ZXMgdGhlIGFsbG9jYXRvcnMgaW5mcmFzdHJ1Y3R1cmUuIFRoZSBzZWNvbmQgY2Fs bCB3aWxsCisgKiBvdmVycmlkZSBjdXJyZW50IGluZnJhIGFuZCBkZXN0cm95IGV4aXN0aW5nIHRo ZXJlIGFsbG9jYXRvcnMuIEl0IGlzIGNhbGxlZAorICogaW4gaWd0X2NvbnN0cnVjdG9yLgorICoq Lwordm9pZCBpbnRlbF9hbGxvY2F0b3JfaW5pdCh2b2lkKQoreworCWFsbG9jX2luZm8oIlByZXBh cmUgYW4gYWxsb2NhdG9yIGluZnJhc3RydWN0dXJlXG4iKTsKKworCWFsbG9jYXRvcl9waWQgPSBn ZXRwaWQoKTsKKwlhbGxvY19pbmZvKCJBbGxvY2F0b3IgcGlkOiAlbGRcbiIsIChsb25nKSBhbGxv Y2F0b3JfcGlkKTsKKworCV9fZnJlZV9tYXBzKGhhbmRsZXMsIHRydWUpOworCV9fZnJlZV9tYXBz KGN0eF9tYXAsIGZhbHNlKTsKKwlfX2ZyZWVfbWFwcyh2bV9tYXAsIGZhbHNlKTsKKworCWhhbmRs ZXMgPSBjYWxsb2Moc2l6ZW9mKCpoYW5kbGVzKSwgMSk7CisJaWd0X2Fzc2VydChoYW5kbGVzKTsK KworCWN0eF9tYXAgPSBjYWxsb2Moc2l6ZW9mKCpjdHhfbWFwKSwgMSk7CisJaWd0X2Fzc2VydChj dHhfbWFwKTsKKworCXZtX21hcCA9IGNhbGxvYyhzaXplb2YoKnZtX21hcCksIDEpOworCWlndF9h c3NlcnQodm1fbWFwKTsKKworCWF0b21pY19pbml0KCZuZXh0X2hhbmRsZSwgMSk7CisJX19pZ3Rf bWFwX2luaXQoaGFuZGxlcywgZXF1YWxfaGFuZGxlcywgaGFzaF9oYW5kbGVzLCA4KTsKKwlfX2ln dF9tYXBfaW5pdChjdHhfbWFwLCBlcXVhbF9jdHgsIGhhc2hfaW5zdGFuY2UsIDgpOworCV9faWd0 X21hcF9pbml0KHZtX21hcCwgZXF1YWxfdm0sIGhhc2hfaW5zdGFuY2UsIDgpOworCisJY2hhbm5l bCA9IGludGVsX2FsbG9jYXRvcl9nZXRfbXNnY2hhbm5lbChDSEFOTkVMX1NZU1ZJUENfTVNHUVVF VUUpOworfQorCitpZ3RfY29uc3RydWN0b3IgeworCWludGVsX2FsbG9jYXRvcl9pbml0KCk7Cit9 CmRpZmYgLS1naXQgYS9saWIvaW50ZWxfYWxsb2NhdG9yLmggYi9saWIvaW50ZWxfYWxsb2NhdG9y LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwLi5mMDc2NjMzMzQKLS0tIC9k ZXYvbnVsbAorKysgYi9saWIvaW50ZWxfYWxsb2NhdG9yLmgKQEAgLTAsMCArMSwyMjAgQEAKKy8v IFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAyMSBJ bnRlbCBDb3Jwb3JhdGlvbgorICovCisKKyNpZm5kZWYgX19JTlRFTF9BTExPQ0FUT1JfSF9fCisj ZGVmaW5lIF9fSU5URUxfQUxMT0NBVE9SX0hfXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5j bHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzdGRpbnQu aD4KKyNpbmNsdWRlIDxzdGRhdG9taWMuaD4KKworLyoqCisgKiBTRUNUSU9OOmludGVsX2FsbG9j YXRvcgorICogQHNob3J0X2Rlc2NyaXB0aW9uOiBpZ3QgaW1wbGVtZW50YXRpb24gb2YgYWxsb2Nh dG9yCisgKiBAdGl0bGU6IEludGVsIGFsbG9jYXRvcgorICogQGluY2x1ZGU6IGludGVsX2FsbG9j YXRvci5oCisgKgorICogIyBJbnRyb2R1Y3Rpb24KKyAqCisgKiBXaXRoIHRoZSBlcmEgb2YgZGlz Y3JldGUgY2FyZHMgd2UgcmVxdWVzdGVkIHRvIGFkb3B0IElHVCB0byBoYW5kbGUKKyAqIGFkZHJl c3NlcyBpbiB1c2Vyc3BhY2Ugb25seSAoc29mdHBpbiwgd2l0aG91dCBzdXBwb3J0IG9mIHJlbG9j YXRpb25zKS4KKyAqIFdyaXRpbmcgYW4gYWxsb2NhdG9yIGZvciBzaW5nbGUgcHVycG9zZSB3b3Vs ZCBiZSByZWxhdGl2ZWx5IGVhc3kKKyAqIGJ1dCBzdXBwb3J0aW5nIGRpZmZlcmVudCB0ZXN0cyB3 aXRoIGRpZmZlcmVudCByZXF1aXJlbWVudHMgYmVjYW1lCisgKiBxdWl0ZSBjb21wbGljYXRlZCB0 YXNrIHdoZXJlIGNvdXBsZSBvZiBzY2VuYXJpb3MgbWF5IGJlIG5vdCBjb3ZlcmVkIHlldC4KKyAq CisgKiAjIEFzc3VtcHRpb25zCisgKgorICogLSBBbGxvY2F0b3IgaGFzIHRvIHdvcmsgaW4gbXVs dGlwcm9jZXNzIC8gbXVsdGl0aHJlYWQgZW52aXJvbm1lbnQuCisgKiAtIEFsbG9jYXRvciBiYWNr ZW5kIChhbGdvcml0aG0pIHNob3VsZCBiZSBwbHVnYWJsZS4gQ3VycmVudGx5IHdlIHN1cHBvcnQK KyAqICAgU0lNUExFIChib3Jyb3dlZCBmcm9tIE1lc2EgYWxsb2NhdG9yKSwgUkVMT0MgKHBzZXVk byBhbGxvY2F0b3Igd2hpY2gKKyAqICAgcmV0dXJucyBpbmNyZW1lbnRlZCBhZGRyZXNzZXMgd2l0 aG91dCBjaGVja2luZyBvdmVybGFwcGluZykKKyAqICAgYW5kIFJBTkRPTSAocHNldWRvIGFsbG9j YXRvciB3aGljaCByYW5kb21pemUgYWRkcmVzc2VzIHdpdGhvdXQKKyAqICAgY2hlY2tpbmcgb3Zl cmxhcHBpbmcpLgorICogLSBIYXMgdG8gaW50ZWdyYXRlIGluIGludGVsLWJiIChvdXIgc2ltcGxl ciBsaWJkcm0gcmVwbGFjZW1lbnQgdXNlZCBpbgorICogICBjb3VwbGUgb2YgdGVzdHMpLgorICoK KyAqICMgSW1wbGVtZW50YXRpb24KKyAqCisgKiAjIyBTaW5nbGUgcHJvY2VzcyAoYWxsb3dzIG11 bHRpcGxlIHRocmVhZHMpCisgKgorICogRm9yIHNpbmdsZSBwcm9jZXNzIHdlIGRvbid0IG5lZWQg dG8gY3JlYXRlIGRlZGljYXRlZAorICogZW50aXR5IChraW5kIG9mIGFyYml0ZXIpIHRvIHNvbHZl IGFsbG9jYXRpb25zLiBTaW1wbGUgbG9ja2luZyBvdmVyCisgKiBhbGxvY2F0b3IgZGF0YSBzdHJ1 Y3R1cmUgaXMgZW5vdWdoLiBBcyBiYXNpYyB1c2FnZSBleGFtcGxlIHdvdWxkIGJlOgorICoKKyAq IHxbPCEtLSBsYW5ndWFnZT0iYyIgLS0+CisgKiBzdHJ1Y3Qgb2JqZWN0IHsKKyAqICAgICAgdWlu dDMyX3QgaGFuZGxlOworICogICAgICB1aW50NjRfdCBvZmZzZXQ7CisgKiAgICAgIHVpbnQ2NF90 IHNpemU7CisgKiB9OworICoKKyAqIHN0cnVjdCBvYmplY3Qgb2JqMSwgb2JqMjsKKyAqIHVpbnQ2 NF90IGFobmQsIHN0YXJ0cCwgZW5kcCwgc2l6ZSA9IDQwOTYsIGFsaWduID0gMSA8PCAxMzsKKyAq IGludCBmZCA9IC0xOworICoKKyAqIGZkID0gZHJtX29wZW5fZHJpdmVyKERSSVZFUl9JTlRFTCk7 CisgKiBhaG5kID0gaW50ZWxfYWxsb2NhdG9yX29wZW4oZmQsIDAsIElOVEVMX0FMTE9DQVRPUl9T SU1QTEUpOworICoKKyAqIG9iajEuaGFuZGxlID0gZ2VtX2NyZWF0ZSg0MDk2KTsKKyAqIG9iajIu aGFuZGxlID0gZ2VtX2NyZWF0ZSg0MDk2KTsKKyAqCisgKiAvLyBSZXNlcnZlIGhvbGUgZm9yIGFu IG9iamVjdCBpbiBnaXZlbiBhZGRyZXNzLgorICogLy8gSW4gdGhpcyBleGFtcGxlIHRoZSBmaXJz dCBwb3NzaWJsZSBhZGRyZXNzLgorICogaW50ZWxfYWxsb2NhdG9yX2dldF9hZGRyZXNzX3Jhbmdl KGFobmQsICZzdGFydHAsICZlbmRwKTsKKyAqIG9iajEub2Zmc2V0ID0gc3RhcnRwOworICogaWd0 X2Fzc2VydChpbnRlbF9hbGxvY2F0b3JfcmVzZXJ2ZShhaG5kLCBvYmoxLmhhbmRsZSwgc2l6ZSwg c3RhcnRwKSk7CisgKgorICogLy8gR2V0IHRoZSBtb3N0IHN1aXRhYmxlIG9mZnNldCBmb3IgdGhl IG9iamVjdC4gUHJlZmVycmVkIHdheS4KKyAqIG9iajIub2Zmc2V0ID0gaW50ZWxfYWxsb2NhdG9y X2FsbG9jKGFobmQsIG9iajIuaGFuZGxlLCBzaXplLCBhbGlnbik7CisgKgorICogIC4uLgorICoK KyAqIC8vIFJlc2VydmVkIGFkZHJlc3NlcyBjYW4gYmUgb25seSBmcmVlZCBieSB1bnJlc2VydmUu CisgKiBpbnRlbF9hbGxvY2F0b3JfdW5yZXNlcnZlKGFobmQsIG9iajEuaGFuZGxlLCBzaXplLCBv YmoxLm9mZnNldCk7CisgKiBpbnRlbF9hbGxvY2F0b3JfZnJlZShhaG5kLCBvYmoyLmhhbmRsZSk7 CisgKgorICogZ2VtX2Nsb3NlKG9iajEuaGFuZGxlKTsKKyAqIGdlbV9jbG9zZShvYmoyLmhhbmRs ZSk7CisgKiBdfAorICoKKyAqIERlc2NyaXB0aW9uOgorICogLSBhaG5kIGlzIGFsbG9jYXRvciBo YW5kbGUgKHZtIHNwYWNlIGhhbmRsZWQgYnkgaXQpCisgKiAtIHdlIGNhbGwgZ2V0X2FkZHJlc3Nf cmFuZ2UoKSB0byBnZXQgc3RhcnQvZW5kIHJhbmdlIHByb3ZpZGVkIGJ5IHRoZQorICogICBhbGxv Y2F0b3IgKHdlIGhhdmVuJ3Qgc3BlY2lmaWVkIGl0cyByYW5nZSBpbiBvcGVuIHNvIGFsbG9jYXRv ciBjb2RlIHdpbGwKKyAqICAgYXNzdW1lIHNvbWUgc2FmZSBhZGRyZXNzIHJhbmdlIC0gd2UgZG9u J3Qgd2FudCB0byBleGVyY2lzZSBzb21lIHBvdGVudGlhbAorICogICBIVyBidWdzIG9uIHRoZSBs YXN0IHBhZ2UpCisgKiAtIGFsbG9jKCkgLyBmcmVlKCkgcGFpciBqdXN0IGdldHMgYWRkcmVzcyBm b3IgZ2VtIG9iamVjdCBwcm9wb3NlZCBieSB0aGUKKyAqICAgYWxsb2NhdG9yCisgKiAtIHJlc2Vy dmUoKSAvIHVucmVzZXJ2ZSgpIHBhaXIgZ2l2ZXMgdXMgZnVsbCBjb250cm9sIG9mIGFjcXVpcmUv cmV0dXJuCisgKiAgIHJhbmdlIHdlJ3JlIGludGVyZXN0ZWQgaW4KKyAqCisgKiAjIyBNdWx0aXBs ZSBwcm9jZXNzZXMKKyAqCisgKiBXaGVuIHByb2Nlc3MgZm9ya3MgYW5kIGl0cyBjaGlsZCB1c2Vz IHNhbWUgZmQgdm0gaXRzIGFkZHJlc3Mgc3BhY2UgaXMgYWxzbworICogdGhlIHNhbWUuIFNvbWUg Y29vcmRpbmF0aW9uIC0gaW4gdGhpcyBjYXNlIGludGVycHJvY2VzcyBjb21tdW5pY2F0aW9uIC0K KyAqIGlzIHJlcXVpcmVkIHRvIGFzc2lnbiBwcm9wZXIgYWRkcmVzc2VzIGZvciBnZW0gb2JqZWN0 cyBhbmQgYXZvaWQgY29sbGlzaW9uLgorICogQWRkaXRpb25hbCB0aHJlYWQgaXMgc3Bhd25lZCBm b3Igc3VjaCBjYXNlIHRvIGNvdmVyIGNoaWxkIHByb2Nlc3NlcyBuZWVkcy4KKyAqIEl0IHVzZXMg c29tZSBmb3JtIG9mIGNvbW11bmljYXRpb24gY2hhbm5lbCB0byByZWNlaXZlLCBwZXJmb3JtIGFj dGlvbgorICogKGFsbG9jLCBmcmVlLi4uKSBhbmQgc2VuZCByZXNwb25zZSB0byByZXF1ZXN0aW5n IHByb2Nlc3MuIEN1cnJlbnRseQorICogU1lTVklQQyBtZXNzYWdlIHF1ZXVlIHdhcyBjaG9zZW4g Zm9yIHRoaXMgYnV0IGl0IGNhbiByZXBsYWNlZCBieSBvdGhlcgorICogbWVjaGFuaXNtLiBBbGxv Y2F0aW9uIHRlY2huaXF1ZXMgYXJlIHNhbWUgYXMgZm9yIHNpbmdsZSBwcm9jZXNzLCB3ZQorICog anVzdCBuZWVkIHRvIHdyYXAgc3VjaCBjb2RlIHdpdGg6CisgKgorICoKKyAqIHxbPCEtLSBsYW5n dWFnZT0iYyIgLS0+CisgKgorICoKKyAqIGludGVsX2FsbG9jYXRvcl9tdWx0aXByb2Nlc3Nfc3Rh cnQoKTsKKyAqCisgKiAuLi4gYWxsb2NhdGlvbiBjb2RlIChvcGVuLCBjbG9zZSwgYWxsb2MsIGZy ZWUsIC4uLikKKyAqCisgKiBpbnRlbF9hbGxvY2F0b3JfbXVsdGlwcm9jZXNzX3N0b3AoKTsKKyAq IF18CisgKgorICogQ2FsbGluZyBzdGFydCgpIHNwYXducyBhZGRpdGlvbmFsIGFsbG9jYXRvciB0 aHJlYWQgcmVhZHkgZm9yIGhhbmRsaW5nCisgKiBpbmNvbWluZyBhbGxvY2F0aW9uIHJlcXVlc3Rz IChvcGVuIC8gY2xvc2UgYXJlIGFsc28gcmVxdWVzdHMgaW4gdGhhdCBjYXNlKS4KKyAqCisgKiBD YWxsaW5nIHN0b3AoKSByZXF1ZXN0IHRvIHN0b3AgYWxsb2NhdG9yIHRocmVhZCB1bmJsb2NraW5n IGFsbCBwZW5kaW5nCisgKiBjaGlsZHJlbiAoaWYgYW55KS4KKyAqLworCitlbnVtIGFsbG9jYXRv cl9zdHJhdGVneSB7CisJQUxMT0NfU1RSQVRFR1lfTk9ORSwKKwlBTExPQ19TVFJBVEVHWV9MT1df VE9fSElHSCwKKwlBTExPQ19TVFJBVEVHWV9ISUdIX1RPX0xPVworfTsKKworc3RydWN0IGludGVs X2FsbG9jYXRvciB7CisJaW50IGZkOworCXVpbnQ4X3QgdHlwZTsKKwllbnVtIGFsbG9jYXRvcl9z dHJhdGVneSBzdHJhdGVneTsKKwlfQXRvbWljKGludDMyX3QpIHJlZmNvdW50OworCXB0aHJlYWRf bXV0ZXhfdCBtdXRleDsKKworCS8qIGFsbG9jYXRvcidzIHByaXZhdGUgc3RydWN0dXJlICovCisJ dm9pZCAqcHJpdjsKKworCXZvaWQgKCpnZXRfYWRkcmVzc19yYW5nZSkoc3RydWN0IGludGVsX2Fs bG9jYXRvciAqaWFsLAorCQkJCSAgdWludDY0X3QgKnN0YXJ0cCwgdWludDY0X3QgKmVuZHApOwor CXVpbnQ2NF90ICgqYWxsb2MpKHN0cnVjdCBpbnRlbF9hbGxvY2F0b3IgKmlhbCwgdWludDMyX3Qg aGFuZGxlLAorCQkJICB1aW50NjRfdCBzaXplLCB1aW50NjRfdCBhbGlnbm1lbnQpOworCWJvb2wg KCppc19hbGxvY2F0ZWQpKHN0cnVjdCBpbnRlbF9hbGxvY2F0b3IgKmlhbCwgdWludDMyX3QgaGFu ZGxlLAorCQkJICAgICB1aW50NjRfdCBzaXplLCB1aW50NjRfdCBhbGlnbm1lbnQpOworCWJvb2wg KCpyZXNlcnZlKShzdHJ1Y3QgaW50ZWxfYWxsb2NhdG9yICppYWwsCisJCQl1aW50MzJfdCBoYW5k bGUsIHVpbnQ2NF90IHN0YXJ0LCB1aW50NjRfdCBzaXplKTsKKwlib29sICgqdW5yZXNlcnZlKShz dHJ1Y3QgaW50ZWxfYWxsb2NhdG9yICppYWwsCisJCQkgIHVpbnQzMl90IGhhbmRsZSwgdWludDY0 X3Qgc3RhcnQsIHVpbnQ2NF90IHNpemUpOworCWJvb2wgKCppc19yZXNlcnZlZCkoc3RydWN0IGlu dGVsX2FsbG9jYXRvciAqaWFsLAorCQkJICAgIHVpbnQ2NF90IHN0YXJ0LCB1aW50NjRfdCBzaXpl KTsKKwlib29sICgqZnJlZSkoc3RydWN0IGludGVsX2FsbG9jYXRvciAqaWFsLCB1aW50MzJfdCBo YW5kbGUpOworCisJdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBpbnRlbF9hbGxvY2F0b3IgKmlhbCk7 CisKKwlib29sICgqaXNfZW1wdHkpKHN0cnVjdCBpbnRlbF9hbGxvY2F0b3IgKmlhbCk7CisKKwl2 b2lkICgqcHJpbnQpKHN0cnVjdCBpbnRlbF9hbGxvY2F0b3IgKmlhbCwgYm9vbCBmdWxsKTsKK307 CisKK3ZvaWQgaW50ZWxfYWxsb2NhdG9yX2luaXQodm9pZCk7Cit2b2lkIGludGVsX2FsbG9jYXRv cl9tdWx0aXByb2Nlc3Nfc3RhcnQodm9pZCk7Cit2b2lkIGludGVsX2FsbG9jYXRvcl9tdWx0aXBy b2Nlc3Nfc3RvcCh2b2lkKTsKKwordWludDY0X3QgaW50ZWxfYWxsb2NhdG9yX29wZW4oaW50IGZk LCB1aW50MzJfdCBjdHgsIHVpbnQ4X3QgYWxsb2NhdG9yX3R5cGUpOwordWludDY0X3QgaW50ZWxf YWxsb2NhdG9yX29wZW5fZnVsbChpbnQgZmQsIHVpbnQzMl90IGN0eCwKKwkJCQkgICB1aW50NjRf dCBzdGFydCwgdWludDY0X3QgZW5kLAorCQkJCSAgIHVpbnQ4X3QgYWxsb2NhdG9yX3R5cGUsCisJ CQkJICAgZW51bSBhbGxvY2F0b3Jfc3RyYXRlZ3kgc3RyYXRlZ3kpOwordWludDY0X3QgaW50ZWxf YWxsb2NhdG9yX29wZW5fdm0oaW50IGZkLCB1aW50MzJfdCB2bSwgdWludDhfdCBhbGxvY2F0b3Jf dHlwZSk7Cit1aW50NjRfdCBpbnRlbF9hbGxvY2F0b3Jfb3Blbl92bV9mdWxsKGludCBmZCwgdWlu dDMyX3Qgdm0sCisJCQkJICAgICAgdWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IGVuZCwKKwkJCQkg ICAgICB1aW50OF90IGFsbG9jYXRvcl90eXBlLAorCQkJCSAgICAgIGVudW0gYWxsb2NhdG9yX3N0 cmF0ZWd5IHN0cmF0ZWd5KTsKKwordWludDY0X3QgaW50ZWxfYWxsb2NhdG9yX29wZW5fdm1fYXMo dWludDY0X3QgYWxsb2NhdG9yX2hhbmRsZSwgdWludDMyX3QgbmV3X3ZtKTsKK2Jvb2wgaW50ZWxf YWxsb2NhdG9yX2Nsb3NlKHVpbnQ2NF90IGFsbG9jYXRvcl9oYW5kbGUpOwordm9pZCBpbnRlbF9h bGxvY2F0b3JfZ2V0X2FkZHJlc3NfcmFuZ2UodWludDY0X3QgYWxsb2NhdG9yX2hhbmRsZSwKKwkJ CQkgICAgICAgdWludDY0X3QgKnN0YXJ0cCwgdWludDY0X3QgKmVuZHApOwordWludDY0X3QgaW50 ZWxfYWxsb2NhdG9yX2FsbG9jKHVpbnQ2NF90IGFsbG9jYXRvcl9oYW5kbGUsIHVpbnQzMl90IGhh bmRsZSwKKwkJCSAgICAgICB1aW50NjRfdCBzaXplLCB1aW50NjRfdCBhbGlnbm1lbnQpOworYm9v bCBpbnRlbF9hbGxvY2F0b3JfZnJlZSh1aW50NjRfdCBhbGxvY2F0b3JfaGFuZGxlLCB1aW50MzJf dCBoYW5kbGUpOworYm9vbCBpbnRlbF9hbGxvY2F0b3JfaXNfYWxsb2NhdGVkKHVpbnQ2NF90IGFs bG9jYXRvcl9oYW5kbGUsIHVpbnQzMl90IGhhbmRsZSwKKwkJCQkgIHVpbnQ2NF90IHNpemUsIHVp bnQ2NF90IG9mZnNldCk7Citib29sIGludGVsX2FsbG9jYXRvcl9yZXNlcnZlKHVpbnQ2NF90IGFs bG9jYXRvcl9oYW5kbGUsIHVpbnQzMl90IGhhbmRsZSwKKwkJCSAgICAgdWludDY0X3Qgc2l6ZSwg dWludDY0X3Qgb2Zmc2V0KTsKK2Jvb2wgaW50ZWxfYWxsb2NhdG9yX3VucmVzZXJ2ZSh1aW50NjRf dCBhbGxvY2F0b3JfaGFuZGxlLCB1aW50MzJfdCBoYW5kbGUsCisJCQkgICAgICAgdWludDY0X3Qg c2l6ZSwgdWludDY0X3Qgb2Zmc2V0KTsKK2Jvb2wgaW50ZWxfYWxsb2NhdG9yX2lzX3Jlc2VydmVk KHVpbnQ2NF90IGFsbG9jYXRvcl9oYW5kbGUsCisJCQkJIHVpbnQ2NF90IHNpemUsIHVpbnQ2NF90 IG9mZnNldCk7Citib29sIGludGVsX2FsbG9jYXRvcl9yZXNlcnZlX2lmX25vdF9hbGxvY2F0ZWQo dWludDY0X3QgYWxsb2NhdG9yX2hhbmRsZSwKKwkJCQkJICAgICAgdWludDMyX3QgaGFuZGxlLAor CQkJCQkgICAgICB1aW50NjRfdCBzaXplLCB1aW50NjRfdCBvZmZzZXQsCisJCQkJCSAgICAgIGJv b2wgKmlzX2FsbG9jYXRlZHApOworCit2b2lkIGludGVsX2FsbG9jYXRvcl9wcmludCh1aW50NjRf dCBhbGxvY2F0b3JfaGFuZGxlKTsKKworI2RlZmluZSBJTlRFTF9BTExPQ0FUT1JfTk9ORSAgIDAK KyNkZWZpbmUgSU5URUxfQUxMT0NBVE9SX1JFTE9DICAxCisjZGVmaW5lIElOVEVMX0FMTE9DQVRP Ul9SQU5ET00gMgorI2RlZmluZSBJTlRFTF9BTExPQ0FUT1JfU0lNUExFIDMKKworI2RlZmluZSBH RU44X0dUVF9BRERSRVNTX1dJRFRIIDQ4CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3Qgc2lnbl9l eHRlbmQ2NCh1aW50NjRfdCB4LCBpbnQgaGlnaCkKK3sKKwlpbnQgc2hpZnQgPSA2MyAtIGhpZ2g7 CisKKwlyZXR1cm4gKGludDY0X3QpKHggPDwgc2hpZnQpID4+IHNoaWZ0OworfQorCitzdGF0aWMg aW5saW5lIHVpbnQ2NF90IENBTk9OSUNBTCh1aW50NjRfdCBvZmZzZXQpCit7CisJcmV0dXJuIHNp Z25fZXh0ZW5kNjQob2Zmc2V0LCBHRU44X0dUVF9BRERSRVNTX1dJRFRIIC0gMSk7Cit9CisKKyNk ZWZpbmUgREVDQU5PTklDQUwob2Zmc2V0KSAob2Zmc2V0ICYgKCgxdWxsIDw8IEdFTjhfR1RUX0FE RFJFU1NfV0lEVEgpIC0gMSkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2ludGVsX2FsbG9j YXRvcl9tc2djaGFubmVsLmMgYi9saWIvaW50ZWxfYWxsb2NhdG9yX21zZ2NoYW5uZWwuYwpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAuLjgyODBiYzRlYwotLS0gL2Rldi9udWxs CisrKyBiL2xpYi9pbnRlbF9hbGxvY2F0b3JfbXNnY2hhbm5lbC5jCkBAIC0wLDAgKzEsMTg3IEBA CisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCisvKgorICogQ29weXJpZ2h0IMKpIDIw MjEgSW50ZWwgQ29ycG9yYXRpb24KKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5j bHVkZSA8c3lzL2lwYy5oPgorI2luY2x1ZGUgPHN5cy9tc2cuaD4KKyNpbmNsdWRlIDxzeXMvc3Rh dC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSAiaWd0LmgiCisjaW5jbHVkZSAiaW50 ZWxfYWxsb2NhdG9yX21zZ2NoYW5uZWwuaCIKKworZXh0ZXJuIF9fdGhyZWFkIHBpZF90IGNoaWxk X3RpZDsKKworLyogLS0tLS0gU1lTVklQQyBNU0dRVUVVRSAtLS0tLSAqLworCisjZGVmaW5lIEZU T0tfSUdUX0FMTE9DQVRPUl9LRVkgIi90bXAvaWd0LmFsbG9jYXRvci5rZXkiCisjZGVmaW5lIEZU T0tfSUdUX0FMTE9DQVRPUl9QUk9KSUQgMjAyMAorCisjZGVmaW5lIEFMTE9DQVRPUl9SRVFVRVNU IDEKKworc3RydWN0IG1zZ3F1ZXVlX2RhdGEgeworCWtleV90IGtleTsKKwlpbnQgcXVldWU7Cit9 OworCitzdHJ1Y3QgbXNncXVldWVfYnVmIHsKKwlsb25nIG10eXBlOworCXVuaW9uIHsKKwkJc3Ry dWN0IGFsbG9jX3JlcSByZXF1ZXN0OworCQlzdHJ1Y3QgYWxsb2NfcmVzcCByZXNwb25zZTsKKwl9 IGRhdGE7Cit9OworCitzdGF0aWMgdm9pZCBtc2dxdWV1ZV9pbml0KHN0cnVjdCBtc2dfY2hhbm5l bCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgbXNncXVldWVfZGF0YSAqbXNnZGF0YTsKKwlzdHJ1Y3Qg bXNxaWRfZHMgcXN0YXQ7CisJa2V5X3Qga2V5OworCWludCBmZCwgcXVldWU7CisKKwlpZ3RfZGVi dWcoIkluaXQgbXNncXVldWVcbiIpOworCisJLyogQ3JlYXRlIGZ0b2sga2V5IG9ubHkgaWYgbm90 IGV4aXN0cyAqLworCWZkID0gb3BlbihGVE9LX0lHVF9BTExPQ0FUT1JfS0VZLCBPX0NSRUFUIHwg T19FWENMIHwgT19XUk9OTFksIDA2MDApOworCWlndF9hc3NlcnQoZmQgPj0gMCB8fCBlcnJubyA9 PSBFRVhJU1QpOworCWlmIChmZCA+PSAwKQorCQljbG9zZShmZCk7CisKKwlrZXkgPSBmdG9rKEZU T0tfSUdUX0FMTE9DQVRPUl9LRVksIEZUT0tfSUdUX0FMTE9DQVRPUl9QUk9KSUQpOworCWlndF9h c3NlcnQoa2V5ICE9IC0xKTsKKwlpZ3RfZGVidWcoIlF1ZXVlIGtleTogJXhcbiIsIChpbnQpIGtl eSk7CisKKwlxdWV1ZSA9IG1zZ2dldChrZXksIDApOworCWlmIChxdWV1ZSAhPSAtMSkgeworCQlp Z3RfYXNzZXJ0KG1zZ2N0bChxdWV1ZSwgSVBDX1NUQVQsICZxc3RhdCkgPT0gMCk7CisJCWlndF9k ZWJ1Zygib2xkIG1lc3NhZ2VzOiAlbHVcbiIsIHFzdGF0Lm1zZ19xbnVtKTsKKwkJaWd0X2Fzc2Vy dChtc2djdGwocXVldWUsIElQQ19STUlELCBOVUxMKSA9PSAwKTsKKwl9CisKKwlxdWV1ZSA9IG1z Z2dldChrZXksIElQQ19DUkVBVCk7CisJaWd0X2RlYnVnKCJtc2cgcXVldWU6ICVkXG4iLCBxdWV1 ZSk7CisKKwltc2dkYXRhID0gY2FsbG9jKDEsIHNpemVvZigqbXNnZGF0YSkpOworCWlndF9hc3Nl cnQobXNnZGF0YSk7CisJbXNnZGF0YS0+a2V5ID0ga2V5OworCW1zZ2RhdGEtPnF1ZXVlID0gcXVl dWU7CisJY2hhbm5lbC0+cHJpdiA9IG1zZ2RhdGE7Cit9CisKK3N0YXRpYyB2b2lkIG1zZ3F1ZXVl X2RlaW5pdChzdHJ1Y3QgbXNnX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IG1zZ3F1ZXVl X2RhdGEgKm1zZ2RhdGEgPSBjaGFubmVsLT5wcml2OworCisJaWd0X2RlYnVnKCJEZWluaXQgbXNn cXVldWVcbiIpOworCW1zZ2N0bChtc2dkYXRhLT5xdWV1ZSwgSVBDX1JNSUQsIE5VTEwpOworCWZy ZWUoY2hhbm5lbC0+cHJpdik7Cit9CisKK3N0YXRpYyBpbnQgbXNncXVldWVfc2VuZF9yZXEoc3Ry dWN0IG1zZ19jaGFubmVsICpjaGFubmVsLAorCQkJICAgICBzdHJ1Y3QgYWxsb2NfcmVxICpyZXF1 ZXN0KQoreworCXN0cnVjdCBtc2dxdWV1ZV9kYXRhICptc2dkYXRhID0gY2hhbm5lbC0+cHJpdjsK KwlzdHJ1Y3QgbXNncXVldWVfYnVmIGJ1ZiA9IHswfTsKKwlpbnQgcmV0OworCisJYnVmLm10eXBl ID0gQUxMT0NBVE9SX1JFUVVFU1Q7CisJYnVmLmRhdGEucmVxdWVzdC5yZXF1ZXN0X3R5cGUgPSAx OworCW1lbWNweSgmYnVmLmRhdGEucmVxdWVzdCwgcmVxdWVzdCwgc2l6ZW9mKCpyZXF1ZXN0KSk7 CisKK3JldHJ5OgorCXJldCA9IG1zZ3NuZChtc2dkYXRhLT5xdWV1ZSwgJmJ1Ziwgc2l6ZW9mKGJ1 ZikgLSBzaXplb2YobG9uZyksIDApOworCWlmIChyZXQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIp CisJCWdvdG8gcmV0cnk7CisKKwlpZiAocmV0ID09IC0xKQorCQlpZ3Rfd2FybigiRXJyb3I6ICVz XG4iLCBzdHJlcnJvcihlcnJubykpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBt c2dxdWV1ZV9yZWN2X3JlcShzdHJ1Y3QgbXNnX2NoYW5uZWwgKmNoYW5uZWwsCisJCQkgICAgIHN0 cnVjdCBhbGxvY19yZXEgKnJlcXVlc3QpCit7CisJc3RydWN0IG1zZ3F1ZXVlX2RhdGEgKm1zZ2Rh dGEgPSBjaGFubmVsLT5wcml2OworCXN0cnVjdCBtc2dxdWV1ZV9idWYgYnVmID0gezB9OworCWlu dCByZXQsIHNpemUgPSBzaXplb2YoYnVmKSAtIHNpemVvZihsb25nKTsKKworcmV0cnk6CisJcmV0 ID0gbXNncmN2KG1zZ2RhdGEtPnF1ZXVlLCAmYnVmLCBzaXplLCBBTExPQ0FUT1JfUkVRVUVTVCwg MCk7CisJaWYgKHJldCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikKKwkJZ290byByZXRyeTsKKwor CWlmIChyZXQgPT0gc2l6ZSkKKwkJbWVtY3B5KHJlcXVlc3QsICZidWYuZGF0YS5yZXF1ZXN0LCBz aXplb2YoKnJlcXVlc3QpKTsKKwllbHNlIGlmIChyZXQgPT0gLTEpCisJCWlndF93YXJuKCJFcnJv cjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMg aW50IG1zZ3F1ZXVlX3NlbmRfcmVzcChzdHJ1Y3QgbXNnX2NoYW5uZWwgKmNoYW5uZWwsCisJCQkg ICAgICBzdHJ1Y3QgYWxsb2NfcmVzcCAqcmVzcG9uc2UpCit7CisJc3RydWN0IG1zZ3F1ZXVlX2Rh dGEgKm1zZ2RhdGEgPSBjaGFubmVsLT5wcml2OworCXN0cnVjdCBtc2dxdWV1ZV9idWYgYnVmID0g ezB9OworCWludCByZXQ7CisKKwlidWYubXR5cGUgPSByZXNwb25zZS0+dGlkOworCW1lbWNweSgm YnVmLmRhdGEucmVzcG9uc2UsIHJlc3BvbnNlLCBzaXplb2YoKnJlc3BvbnNlKSk7CisKK3JldHJ5 OgorCXJldCA9IG1zZ3NuZChtc2dkYXRhLT5xdWV1ZSwgJmJ1Ziwgc2l6ZW9mKGJ1ZikgLSBzaXpl b2YobG9uZyksIDApOworCWlmIChyZXQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpCisJCWdvdG8g cmV0cnk7CisKKwlpZiAocmV0ID09IC0xKQorCQlpZ3Rfd2FybigiRXJyb3I6ICVzXG4iLCBzdHJl cnJvcihlcnJubykpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc2dxdWV1ZV9y ZWN2X3Jlc3Aoc3RydWN0IG1zZ19jaGFubmVsICpjaGFubmVsLAorCQkJICAgICAgc3RydWN0IGFs bG9jX3Jlc3AgKnJlc3BvbnNlKQoreworCXN0cnVjdCBtc2dxdWV1ZV9kYXRhICptc2dkYXRhID0g Y2hhbm5lbC0+cHJpdjsKKwlzdHJ1Y3QgbXNncXVldWVfYnVmIGJ1ZiA9IHswfTsKKwlpbnQgcmV0 LCBzaXplID0gc2l6ZW9mKGJ1ZikgLSBzaXplb2YobG9uZyk7CisKK3JldHJ5OgorCXJldCA9IG1z Z3Jjdihtc2dkYXRhLT5xdWV1ZSwgJmJ1Ziwgc2l6ZW9mKGJ1ZikgLSBzaXplb2YobG9uZyksCisJ CSAgICAgcmVzcG9uc2UtPnRpZCwgMCk7CisJaWYgKHJldCA9PSAtMSAmJiBlcnJubyA9PSBFSU5U UikKKwkJZ290byByZXRyeTsKKworCWlmIChyZXQgPT0gc2l6ZSkKKwkJbWVtY3B5KHJlc3BvbnNl LCAmYnVmLmRhdGEucmVzcG9uc2UsIHNpemVvZigqcmVzcG9uc2UpKTsKKwllbHNlIGlmIChyZXQg PT0gLTEpCisJCWlndF93YXJuKCJFcnJvcjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisKKwly ZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG1zZ19jaGFubmVsIG1zZ3F1ZXVlX2NoYW5u ZWwgPSB7CisJLnByaXYgPSBOVUxMLAorCS5pbml0ID0gbXNncXVldWVfaW5pdCwKKwkuZGVpbml0 ID0gbXNncXVldWVfZGVpbml0LAorCS5zZW5kX3JlcSA9IG1zZ3F1ZXVlX3NlbmRfcmVxLAorCS5y ZWN2X3JlcSA9IG1zZ3F1ZXVlX3JlY3ZfcmVxLAorCS5zZW5kX3Jlc3AgPSBtc2dxdWV1ZV9zZW5k X3Jlc3AsCisJLnJlY3ZfcmVzcCA9IG1zZ3F1ZXVlX3JlY3ZfcmVzcCwKK307CisKK3N0cnVjdCBt c2dfY2hhbm5lbCAqaW50ZWxfYWxsb2NhdG9yX2dldF9tc2djaGFubmVsKGVudW0gbXNnX2NoYW5u ZWxfdHlwZSB0eXBlKQoreworCXN0cnVjdCBtc2dfY2hhbm5lbCAqY2hhbm5lbCA9IE5VTEw7CisK Kwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIENIQU5ORUxfU1lTVklQQ19NU0dRVUVVRToKKwkJY2hh bm5lbCA9ICZtc2dxdWV1ZV9jaGFubmVsOworCX0KKworCWlndF9hc3NlcnQoY2hhbm5lbCk7CisK KwlyZXR1cm4gY2hhbm5lbDsKK30KZGlmZiAtLWdpdCBhL2xpYi9pbnRlbF9hbGxvY2F0b3JfbXNn Y2hhbm5lbC5oIGIvbGliL2ludGVsX2FsbG9jYXRvcl9tc2djaGFubmVsLmgKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwLi5hYzZlZGZiOWUKLS0tIC9kZXYvbnVsbAorKysgYi9s aWIvaW50ZWxfYWxsb2NhdG9yX21zZ2NoYW5uZWwuaApAQCAtMCwwICsxLDE1NiBAQAorLy8gU1BE WC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDIxIEludGVs IENvcnBvcmF0aW9uCisgKi8KKworI2lmbmRlZiBfX0lOVEVMX0FMTE9DQVRPUl9NU0dDSEFOTkVM X0hfXworI2RlZmluZSBfX0lOVEVMX0FMTE9DQVRPUl9NU0dDSEFOTkVMX0hfXworCisjaW5jbHVk ZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+ CisKK2VudW0gcmVxdHlwZSB7CisJUkVRX1NUT1AsCisJUkVRX09QRU4sCisJUkVRX09QRU5fQVMs CisJUkVRX0NMT1NFLAorCVJFUV9BRERSRVNTX1JBTkdFLAorCVJFUV9BTExPQywKKwlSRVFfRlJF RSwKKwlSRVFfSVNfQUxMT0NBVEVELAorCVJFUV9SRVNFUlZFLAorCVJFUV9VTlJFU0VSVkUsCisJ UkVRX1JFU0VSVkVfSUZfTk9UX0FMTE9DQVRFRCwKKwlSRVFfSVNfUkVTRVJWRUQsCit9OworCitl bnVtIHJlc3B0eXBlIHsKKwlSRVNQX09QRU4sCisJUkVTUF9PUEVOX0FTLAorCVJFU1BfQ0xPU0Us CisJUkVTUF9BRERSRVNTX1JBTkdFLAorCVJFU1BfQUxMT0MsCisJUkVTUF9GUkVFLAorCVJFU1Bf SVNfQUxMT0NBVEVELAorCVJFU1BfUkVTRVJWRSwKKwlSRVNQX1VOUkVTRVJWRSwKKwlSRVNQX0lT X1JFU0VSVkVELAorCVJFU1BfUkVTRVJWRV9JRl9OT1RfQUxMT0NBVEVELAorfTsKKworc3RydWN0 IGFsbG9jX3JlcSB7CisJZW51bSByZXF0eXBlIHJlcXVlc3RfdHlwZTsKKworCS8qIENvbW1vbiAq LworCXBpZF90IHRpZDsKKwl1aW50NjRfdCBhbGxvY2F0b3JfaGFuZGxlOworCisJdW5pb24gewor CQlzdHJ1Y3QgeworCQkJaW50IGZkOworCQkJdWludDMyX3QgY3R4OworCQkJdWludDMyX3Qgdm07 CisJCQl1aW50NjRfdCBzdGFydDsKKwkJCXVpbnQ2NF90IGVuZDsKKwkJCXVpbnQ4X3QgYWxsb2Nh dG9yX3R5cGU7CisJCQl1aW50OF90IGFsbG9jYXRvcl9zdHJhdGVneTsKKwkJfSBvcGVuOworCisJ CXN0cnVjdCB7CisJCQl1aW50MzJfdCBuZXdfdm07CisJCX0gb3Blbl9hczsKKworCQlzdHJ1Y3Qg eworCQkJdWludDMyX3QgaGFuZGxlOworCQkJdWludDY0X3Qgc2l6ZTsKKwkJCXVpbnQ2NF90IGFs aWdubWVudDsKKwkJfSBhbGxvYzsKKworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgaGFuZGxlOwor CQl9IGZyZWU7CisKKwkJc3RydWN0IHsKKwkJCXVpbnQzMl90IGhhbmRsZTsKKwkJCXVpbnQ2NF90 IHNpemU7CisJCQl1aW50NjRfdCBvZmZzZXQ7CisJCX0gaXNfYWxsb2NhdGVkOworCisJCXN0cnVj dCB7CisJCQl1aW50MzJfdCBoYW5kbGU7CisJCQl1aW50NjRfdCBzdGFydDsKKwkJCXVpbnQ2NF90 IGVuZDsKKwkJfSByZXNlcnZlLCB1bnJlc2VydmU7CisKKwkJc3RydWN0IHsKKwkJCXVpbnQ2NF90 IHN0YXJ0OworCQkJdWludDY0X3QgZW5kOworCQl9IGlzX3Jlc2VydmVkOworCisJfTsKK307CisK K3N0cnVjdCBhbGxvY19yZXNwIHsKKwllbnVtIHJlc3B0eXBlIHJlc3BvbnNlX3R5cGU7CisJcGlk X3QgdGlkOworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdWludDY0X3QgYWxsb2NhdG9yX2hh bmRsZTsKKwkJfSBvcGVuLCBvcGVuX2FzOworCisJCXN0cnVjdCB7CisJCQlib29sIGlzX2VtcHR5 OworCQl9IGNsb3NlOworCisJCXN0cnVjdCB7CisJCQl1aW50NjRfdCBzdGFydDsKKwkJCXVpbnQ2 NF90IGVuZDsKKwkJCXVpbnQ4X3QgZGlyZWN0aW9uOworCQl9IGFkZHJlc3NfcmFuZ2U7CisKKwkJ c3RydWN0IHsKKwkJCXVpbnQ2NF90IG9mZnNldDsKKwkJfSBhbGxvYzsKKworCQlzdHJ1Y3Qgewor CQkJYm9vbCBmcmVlZDsKKwkJfSBmcmVlOworCisJCXN0cnVjdCB7CisJCQlib29sIGFsbG9jYXRl ZDsKKwkJfSBpc19hbGxvY2F0ZWQ7CisKKwkJc3RydWN0IHsKKwkJCWJvb2wgcmVzZXJ2ZWQ7CisJ CX0gcmVzZXJ2ZSwgaXNfcmVzZXJ2ZWQ7CisKKwkJc3RydWN0IHsKKwkJCWJvb2wgdW5yZXNlcnZl ZDsKKwkJfSB1bnJlc2VydmU7CisKKwkJc3RydWN0IHsKKwkJCWJvb2wgYWxsb2NhdGVkOworCQkJ Ym9vbCByZXNlcnZlZDsKKwkJfSByZXNlcnZlX2lmX25vdF9hbGxvY2F0ZWQ7CisJfTsKK307CisK K3N0cnVjdCBtc2dfY2hhbm5lbCB7CisJdm9pZCAqcHJpdjsKKwl2b2lkICgqaW5pdCkoc3RydWN0 IG1zZ19jaGFubmVsICpjaGFubmVsKTsKKwl2b2lkICgqZGVpbml0KShzdHJ1Y3QgbXNnX2NoYW5u ZWwgKmNoYW5uZWwpOworCWludCAoKnNlbmRfcmVxKShzdHJ1Y3QgbXNnX2NoYW5uZWwgKmNoYW5u ZWwsIHN0cnVjdCBhbGxvY19yZXEgKnJlcXVlc3QpOworCWludCAoKnJlY3ZfcmVxKShzdHJ1Y3Qg bXNnX2NoYW5uZWwgKmNoYW5uZWwsIHN0cnVjdCBhbGxvY19yZXEgKnJlcXVlc3QpOworCWludCAo KnNlbmRfcmVzcCkoc3RydWN0IG1zZ19jaGFubmVsICpjaGFubmVsLCBzdHJ1Y3QgYWxsb2NfcmVz cCAqcmVzcG9uc2UpOworCWludCAoKnJlY3ZfcmVzcCkoc3RydWN0IG1zZ19jaGFubmVsICpjaGFu bmVsLCBzdHJ1Y3QgYWxsb2NfcmVzcCAqcmVzcG9uc2UpOworfTsKKworZW51bSBtc2dfY2hhbm5l bF90eXBlIHsKKwlDSEFOTkVMX1NZU1ZJUENfTVNHUVVFVUUKK307CisKK3N0cnVjdCBtc2dfY2hh bm5lbCAqaW50ZWxfYWxsb2NhdG9yX2dldF9tc2djaGFubmVsKGVudW0gbXNnX2NoYW5uZWxfdHlw ZSB0eXBlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvbWVzb24uYnVpbGQgYi9saWIvbWVz b24uYnVpbGQKaW5kZXggNzI1NGZhZWFjLi4yMTYyMzE3NjEgMTAwNjQ0Ci0tLSBhL2xpYi9tZXNv bi5idWlsZAorKysgYi9saWIvbWVzb24uYnVpbGQKQEAgLTM0LDYgKzM0LDExIEBAIGxpYl9zb3Vy Y2VzID0gWwogCSdpZ3RfdmdlbS5jJywKIAknaWd0X3g4Ni5jJywKIAknaW5zdGRvbmUuYycsCisJ J2ludGVsX2FsbG9jYXRvci5jJywKKwknaW50ZWxfYWxsb2NhdG9yX21zZ2NoYW5uZWwuYycsCisJ J2ludGVsX2FsbG9jYXRvcl9yYW5kb20uYycsCisJJ2ludGVsX2FsbG9jYXRvcl9yZWxvYy5jJywK KwknaW50ZWxfYWxsb2NhdG9yX3NpbXBsZS5jJywKIAknaW50ZWxfYmF0Y2hidWZmZXIuYycsCiAJ J2ludGVsX2J1Zm9wcy5jJywKIAknaW50ZWxfY2hpcHNldC5jJywKLS0gCjIuMjYuMAoKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KaWd0LWRldiBtYWlsaW5n IGxpc3QKaWd0LWRldkBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVz a3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pZ3QtZGV2Cg==