From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: [PATCH i-g-t 7/9] tests/perf_pmu: Tests for i915 PMU API Date: Tue, 10 Oct 2017 10:30:06 +0100 Message-ID: <20171010093008.22804-8-tvrtko.ursulin@linux.intel.com> References: <20171010093008.22804-1-tvrtko.ursulin@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm0-x243.google.com (mail-wm0-x243.google.com [IPv6:2a00:1450:400c:c09::243]) by gabe.freedesktop.org (Postfix) with ESMTPS id 1BFB26E3EE for ; Tue, 10 Oct 2017 09:30:21 +0000 (UTC) Received: by mail-wm0-x243.google.com with SMTP id q132so3371356wmd.2 for ; Tue, 10 Oct 2017 02:30:21 -0700 (PDT) In-Reply-To: <20171010093008.22804-1-tvrtko.ursulin@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org RnJvbTogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KCkEgYnVuY2gg b2YgdGVzdHMgZm9yIHRoZSBuZXcgaTkxNSBQTVUgZmVhdHVyZS4KClBhcnRzIG9mIHRoZSBjb2Rl IHdlcmUgaW5pdGlhbHkgc2tldGNoZWQgYnkgRG1pdHJ5IFJvZ296aGtpbi4KCnYyOiAoTW9zdCBz dWdnZXN0aW9ucyBieSBDaHJpcyBXaWxzb24pCiAqIEFkZCBuZXcgY2xhc3MvaW5zdGFuY2UgYmFz ZWQgZW5naW5lIGxpc3QuCiAqIEFkZCBnZW1faGFzX2VuZ2luZS9nZW1fcmVxdWlyZV9lbmdpbmUg dG8gd29yayB3aXRoIGNsYXNzL2luc3RhbmNlLgogKiBVc2UgdGhlIGFib3ZlIHR3byB0aHJvdWdo b3V0IHRoZSB0ZXN0LgogKiBTaG9ydGVuIHRlc3RzIHRvIDEwMG1zIGJ1c3kgYmF0Y2hlcywgc2Vl bXMgZW5vdWdoLgogKiBBZGQgcXVldWVkIGNvdW50ZXIgc2FuaXR5IGNoZWNrcy4KICogVXNlIGln dF9uc2VjX2VsYXBzZWQuCiAqIFNraXAgb24gcGVyZiAtRU5PREVWIGluIHNvbWUgdGVzdHMgaW5z dGVhZCBvZiBlbWJlZGRpbmcga25vd2xlZGdlIGxvY2FsbHkuCiAqIEZpeCBtdWx0aSBvcmRlcmlu ZyBmb3IgYnVzeSBhY2NvdW50aW5nLgogKiBVc2UgbmV3IGd1cmFudGVlZF91c2xlZXAgd2hlbiBz bGVlcCB0aW1lIGlzIGFzc2VydGVkIG9uLgogKiBDaGVjayBmb3Igbm8gcXVldWVkIHdoZW4gaWRs ZS9idXN5LgogKiBBZGQgcXVldWVkIGNvdW50ZXIgaW5pdCB0ZXN0LgogKiBBZGQgcXVldWVkIHRl c3RzLgogKiBDb25zb2xpZGF0ZSBhbmQgaW5jcmVhc2UgbXVsdGlwbGUgYnVzeSBlbmdpbmVzIHRl c3RzIHRvIG1vc3QtYnVzeSBhbmQKICAgYWxsLWJ1c3kgdGVzdHMuCiAqIEd1YXJhbnR0ZSBpbnRl cnJ1cHRzIGJ5IHVzaW5nIGZlbmNlcy4KICogVGVzdCBSQzYgdmlhIGZvcmNld2FrZS4KCnYzOgog KiBUd2VhayBhc3NlcnQgaW4gaW50ZXJydXB0cyBzdWJ0ZXN0LgogKiBTcHJpbmtsZSBvZiBjb21t ZW50cy4KICogRml4IG11bHRpLWNsaWVudCB0ZXN0IHdoaWNoIGdvdCBicm9rZW4gaW4gdjIuCgp2 NDoKICogTWVhc3VyZWQgaW5zdGVhZCBvZiBndWFyYW50ZWVkIHNsZWVwLgogKiBNaXNzaW5nIHN5 bmMgaW4gbm9fc2VtYS4KICogTG9nIGJ1c3luZXNzIGJlZm9yZSBhc3NlcnRzIGZvciBkZWJ1Zy4K ICogYWNjZXNzKDIpIGluc3RlYWQgb2Ygb3BlbigyKSB0byBkZXRlcm1pbmUgaWYgY3B1MCBpcyBo b3RwbHVnZ2FibGUuCiAqIFRlc3QgZnJlcXVlbmN5IHJlcG9ydGluZyB2aWEgbWluL21heCBzZXR0 aW5nIGluc3RlYWQgYXNzdW1pbmcuCiAgIF5eIEFsbCBhYm92ZSBzdWdnZXN0ZWQgYnkgQ2hyaXMg V2lsc29uLiBeXgogKiBEcm9wIHF1ZXVlZCBzdWJ0ZXN0cyB0byBtYXRjaCBpOTE1LgogKiBVc2Ug bG9uZyBiYXRjaGVzIHdpdGggZmVuY2VzIHRvIGVuc3VyZSBpbnRlcnJ1cHRzLgogKiBUZXN0IHJl bmRlciBub2RlIGFzIHdlbGwuCgp2NToKICogQWRkIHRvIG1lc29uIGJ1aWxkLiAoUGV0cmkgTGF0 dmFsYSkKICogVXNlIDFlTiBjb25zdGFudHMuIChDaHJpcyBXaWxzb24pCiAqIEFkZCB0ZXN0cyBm b3Igc2VtYXBob3JlIGFuZCBldmVudCB3YWl0aW5nLgoKU2lnbmVkLW9mZi1ieTogVHZydGtvIFVy c3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KQ2M6IENocmlzIFdpbHNvbiA8Y2hyaXNA Y2hyaXMtd2lsc29uLmNvLnVrPgpDYzogRG1pdHJ5IFJvZ296aGtpbiA8ZG1pdHJ5LnYucm9nb3po a2luQGludGVsLmNvbT4KLS0tCiBsaWIvaWd0X2d0LmMgICAgICAgICAgIHwgICA1MCArKwogbGli L2lndF9ndC5oICAgICAgICAgICB8ICAgMzggKysKIGxpYi9pZ3RfcGVyZi5oICAgICAgICAgfCAg ICA5ICstCiB0ZXN0cy9NYWtlZmlsZS5hbSAgICAgIHwgICAgMSArCiB0ZXN0cy9NYWtlZmlsZS5z b3VyY2VzIHwgICAgMSArCiB0ZXN0cy9tZXNvbi5idWlsZCAgICAgIHwgICAgMSArCiB0ZXN0cy9w ZXJmX3BtdS5jICAgICAgIHwgMTIzOCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysKIDcgZmlsZXMgY2hhbmdlZCwgMTMzMCBpbnNlcnRpb25zKCspLCA4IGRl bGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHRlc3RzL3BlcmZfcG11LmMKCmRpZmYgLS1n aXQgYS9saWIvaWd0X2d0LmMgYi9saWIvaWd0X2d0LmMKaW5kZXggYjNmM2IzODA5ZWVlLi40Yzc1 ODExZmIxYjMgMTAwNjQ0Ci0tLSBhL2xpYi9pZ3RfZ3QuYworKysgYi9saWIvaWd0X2d0LmMKQEAg LTU2OCwzICs1NjgsNTMgQEAgYm9vbCBnZW1fY2FuX3N0b3JlX2R3b3JkKGludCBmZCwgdW5zaWdu ZWQgaW50IGVuZ2luZSkKIAogCXJldHVybiB0cnVlOwogfQorCitjb25zdCBzdHJ1Y3QgaW50ZWxf ZXhlY3V0aW9uX2VuZ2luZTIgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZXMyW10gPSB7CisJeyAicmNz MCIsIEk5MTVfRU5HSU5FX0NMQVNTX1JFTkRFUiwgMCB9LAorCXsgImJjczAiLCBJOTE1X0VOR0lO RV9DTEFTU19DT1BZLCAwIH0sCisJeyAidmNzMCIsIEk5MTVfRU5HSU5FX0NMQVNTX1ZJREVPLCAw IH0sCisJeyAidmNzMSIsIEk5MTVfRU5HSU5FX0NMQVNTX1ZJREVPLCAxIH0sCisJeyAidmVjczAi LCBJOTE1X0VOR0lORV9DTEFTU19WSURFT19FTkhBTkNFLCAwIH0sCit9OworCit1bnNpZ25lZCBp bnQKK2dlbV9jbGFzc19pbnN0YW5jZV90b19lYl9mbGFncyhpbnQgZ2VtX2ZkLAorCQkJICAgICAg IGVudW0gZHJtX2k5MTVfZ2VtX2VuZ2luZV9jbGFzcyBjbGFzcywKKwkJCSAgICAgICB1bnNpZ25l ZCBpbnQgaW5zdGFuY2UpCit7CisJaWYgKGNsYXNzICE9IEk5MTVfRU5HSU5FX0NMQVNTX1ZJREVP KQorCQlpZ3RfYXNzZXJ0KGluc3RhbmNlID09IDApOworCWVsc2UKKwkJaWd0X2Fzc2VydChpbnN0 YW5jZSA+PSAwICYmIGluc3RhbmNlIDw9IDEpOworCisJc3dpdGNoIChjbGFzcykgeworCWNhc2Ug STkxNV9FTkdJTkVfQ0xBU1NfUkVOREVSOgorCQlyZXR1cm4gSTkxNV9FWEVDX1JFTkRFUjsKKwlj YXNlIEk5MTVfRU5HSU5FX0NMQVNTX0NPUFk6CisJCXJldHVybiBJOTE1X0VYRUNfQkxUOworCWNh c2UgSTkxNV9FTkdJTkVfQ0xBU1NfVklERU86CisJCWlmIChpbnN0YW5jZSA9PSAwKSB7CisJCQlp ZiAoZ2VtX2hhc19ic2QyKGdlbV9mZCkpCisJCQkJcmV0dXJuIEk5MTVfRVhFQ19CU0QgfCBJOTE1 X0VYRUNfQlNEX1JJTkcxOworCQkJZWxzZQorCQkJCXJldHVybiBJOTE1X0VYRUNfQlNEOworCisJ CX0gZWxzZSB7CisJCQlyZXR1cm4gSTkxNV9FWEVDX0JTRCB8IEk5MTVfRVhFQ19CU0RfUklORzI7 CisJCX0KKwljYXNlIEk5MTVfRU5HSU5FX0NMQVNTX1ZJREVPX0VOSEFOQ0U6CisJCXJldHVybiBJ OTE1X0VYRUNfVkVCT1g7CisJY2FzZSBJOTE1X0VOR0lORV9DTEFTU19PVEhFUjoKKwlkZWZhdWx0 OgorCQlpZ3RfYXNzZXJ0KDApOworCX07Cit9CisKK2Jvb2wgZ2VtX2hhc19lbmdpbmUoaW50IGdl bV9mZCwKKwkJICAgIGVudW0gZHJtX2k5MTVfZ2VtX2VuZ2luZV9jbGFzcyBjbGFzcywKKwkJICAg IHVuc2lnbmVkIGludCBpbnN0YW5jZSkKK3sKKwlyZXR1cm4gZ2VtX2hhc19yaW5nKGdlbV9mZCwK KwkJCSAgICBnZW1fY2xhc3NfaW5zdGFuY2VfdG9fZWJfZmxhZ3MoZ2VtX2ZkLCBjbGFzcywKKwkJ CQkJCQkgICBpbnN0YW5jZSkpOworfQpkaWZmIC0tZ2l0IGEvbGliL2lndF9ndC5oIGIvbGliL2ln dF9ndC5oCmluZGV4IDI1NzljYmQzN2JlNy4uZmI2N2FlMWE3ZDFmIDEwMDY0NAotLS0gYS9saWIv aWd0X2d0LmgKKysrIGIvbGliL2lndF9ndC5oCkBAIC0yNSw2ICsyNSw3IEBACiAjZGVmaW5lIElH VF9HVF9ICiAKICNpbmNsdWRlICJpZ3RfZGVidWdmcy5oIgorI2luY2x1ZGUgImlndF9jb3JlLmgi CiAKIHZvaWQgaWd0X3JlcXVpcmVfaGFuZ19yaW5nKGludCBmZCwgaW50IHJpbmcpOwogCkBAIC04 MCw0ICs4MSw0MSBAQCBleHRlcm4gY29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUg ewogCiBib29sIGdlbV9jYW5fc3RvcmVfZHdvcmQoaW50IGZkLCB1bnNpZ25lZCBpbnQgZW5naW5l KTsKIAorZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbnRlbF9leGVjdXRpb25fZW5naW5lMiB7CisJY29u c3QgY2hhciAqbmFtZTsKKwlpbnQgY2xhc3M7CisJaW50IGluc3RhbmNlOworfSBpbnRlbF9leGVj dXRpb25fZW5naW5lczJbXTsKKworI2RlZmluZSBmb3JfZWFjaF9lbmdpbmVfY2xhc3NfaW5zdGFu Y2UoZmRfXywgZV9fKSBcCisJZm9yICgoZV9fKSA9IGludGVsX2V4ZWN1dGlvbl9lbmdpbmVzMjtc CisJICAgICAoZV9fKS0+bmFtZTsgXAorCSAgICAgKGVfXykrKykKKworZW51bSBkcm1faTkxNV9n ZW1fZW5naW5lX2NsYXNzIHsKKwlJOTE1X0VOR0lORV9DTEFTU19PVEhFUiA9IDAsCisJSTkxNV9F TkdJTkVfQ0xBU1NfUkVOREVSID0gMSwKKwlJOTE1X0VOR0lORV9DTEFTU19DT1BZID0gMiwKKwlJ OTE1X0VOR0lORV9DTEFTU19WSURFTyA9IDMsCisJSTkxNV9FTkdJTkVfQ0xBU1NfVklERU9fRU5I QU5DRSA9IDQsCisJSTkxNV9FTkdJTkVfQ0xBU1NfTUFYIC8qIG5vbi1BQkkgKi8KK307CisKK3Vu c2lnbmVkIGludAorZ2VtX2NsYXNzX2luc3RhbmNlX3RvX2ViX2ZsYWdzKGludCBnZW1fZmQsCisJ CQkgICAgICAgZW51bSBkcm1faTkxNV9nZW1fZW5naW5lX2NsYXNzIGNsYXNzLAorCQkJICAgICAg IHVuc2lnbmVkIGludCBpbnN0YW5jZSk7CisKK2Jvb2wgZ2VtX2hhc19lbmdpbmUoaW50IGdlbV9m ZCwKKwkJICAgIGVudW0gZHJtX2k5MTVfZ2VtX2VuZ2luZV9jbGFzcyBjbGFzcywKKwkJICAgIHVu c2lnbmVkIGludCBpbnN0YW5jZSk7CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgZ2VtX3JlcXVpcmVf ZW5naW5lKGludCBnZW1fZmQsCisJCQllbnVtIGRybV9pOTE1X2dlbV9lbmdpbmVfY2xhc3MgY2xh c3MsCisJCQl1bnNpZ25lZCBpbnQgaW5zdGFuY2UpCit7CisJaWd0X3JlcXVpcmUoZ2VtX2hhc19l bmdpbmUoZ2VtX2ZkLCBjbGFzcywgaW5zdGFuY2UpKTsKK30KKwogI2VuZGlmIC8qIElHVF9HVF9I ICovCmRpZmYgLS1naXQgYS9saWIvaWd0X3BlcmYuaCBiL2xpYi9pZ3RfcGVyZi5oCmluZGV4IGIx ZjUyNTczOWM2OS4uNTQyOGZlYjBjNzQ2IDEwMDY0NAotLS0gYS9saWIvaWd0X3BlcmYuaAorKysg Yi9saWIvaWd0X3BlcmYuaApAQCAtMjksMTQgKzI5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3Bl cmZfZXZlbnQuaD4KIAotZW51bSBkcm1faTkxNV9nZW1fZW5naW5lX2NsYXNzIHsKLQlJOTE1X0VO R0lORV9DTEFTU19PVEhFUiA9IDAsCi0JSTkxNV9FTkdJTkVfQ0xBU1NfUkVOREVSID0gMSwKLQlJ OTE1X0VOR0lORV9DTEFTU19DT1BZID0gMiwKLQlJOTE1X0VOR0lORV9DTEFTU19WSURFTyA9IDMs Ci0JSTkxNV9FTkdJTkVfQ0xBU1NfVklERU9fRU5IQU5DRSA9IDQsCi0JSTkxNV9FTkdJTkVfQ0xB U1NfTUFYIC8qIG5vbi1BQkkgKi8KLX07CisjaW5jbHVkZSAiaWd0X2d0LmgiCiAKIGVudW0gZHJt X2k5MTVfcG11X2VuZ2luZV9zYW1wbGUgewogCUk5MTVfU0FNUExFX0JVU1kgPSAwLApkaWZmIC0t Z2l0IGEvdGVzdHMvTWFrZWZpbGUuYW0gYi90ZXN0cy9NYWtlZmlsZS5hbQppbmRleCA4OWE5NzAx NTM5OTIuLjE3ZWUxYmUwOGQ4YSAxMDA2NDQKLS0tIGEvdGVzdHMvTWFrZWZpbGUuYW0KKysrIGIv dGVzdHMvTWFrZWZpbGUuYW0KQEAgLTEzMSw2ICsxMzEsNyBAQCBnZW43X2ZvcmNld2FrZV9tdF9D RkxBR1MgPSAkKEFNX0NGTEFHUykgJChUSFJFQURfQ0ZMQUdTKQogZ2VuN19mb3JjZXdha2VfbXRf TERBREQgPSAkKExEQUREKSAtbHB0aHJlYWQKIGdlbV91c2VycHRyX2JsaXRzX0NGTEFHUyA9ICQo QU1fQ0ZMQUdTKSAkKFRIUkVBRF9DRkxBR1MpCiBnZW1fdXNlcnB0cl9ibGl0c19MREFERCA9ICQo TERBREQpIC1scHRocmVhZAorcGVyZl9wbXVfTERBREQgPSAkKExEQUREKSAkKHRvcF9idWlsZGRp cikvbGliL2xpYmlndF9wZXJmLmxhCiAKIGdlbV93YWl0X0xEQUREID0gJChMREFERCkgLWxydAog a21zX2ZsaXBfTERBREQgPSAkKExEQUREKSAtbHJ0IC1scHRocmVhZApkaWZmIC0tZ2l0IGEvdGVz dHMvTWFrZWZpbGUuc291cmNlcyBiL3Rlc3RzL01ha2VmaWxlLnNvdXJjZXMKaW5kZXggYzRkMzIw ZWJjNjFiLi43NDRlZWVhYjllZjQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL01ha2VmaWxlLnNvdXJjZXMK KysrIGIvdGVzdHMvTWFrZWZpbGUuc291cmNlcwpAQCAtMjE3LDYgKzIxNyw3IEBAIFRFU1RTX3By b2dzID0gXAogCWttc192YmxhbmsgXAogCW1ldGFfdGVzdCBcCiAJcGVyZiBcCisJcGVyZl9wbXUg XAogCXBtX2JhY2tsaWdodCBcCiAJcG1fbHBzcCBcCiAJcG1fcmM2X3Jlc2lkZW5jeSBcCmRpZmYg LS1naXQgYS90ZXN0cy9tZXNvbi5idWlsZCBiL3Rlc3RzL21lc29uLmJ1aWxkCmluZGV4IDZjYjM1 ODRhNGRkOS4uMTJkNTcwNmZhYWViIDEwMDY0NAotLS0gYS90ZXN0cy9tZXNvbi5idWlsZAorKysg Yi90ZXN0cy9tZXNvbi5idWlsZApAQCAtMTk3LDYgKzE5Nyw3IEBAIHRlc3RfcHJvZ3MgPSBbCiAJ J2ttc192YmxhbmsnLAogCSdtZXRhX3Rlc3QnLAogCSdwZXJmJywKKwkncGVyZl9wbXUnLAogCSdw bV9iYWNrbGlnaHQnLAogCSdwbV9scHNwJywKIAkncG1fcmM2X3Jlc2lkZW5jeScsCmRpZmYgLS1n aXQgYS90ZXN0cy9wZXJmX3BtdS5jIGIvdGVzdHMvcGVyZl9wbXUuYwpuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmJhM2QxMjQ2OTFhYwotLS0gL2Rldi9udWxsCisrKyBi L3Rlc3RzL3BlcmZfcG11LmMKQEAgLTAsMCArMSwxMjM4IEBACisvKgorICogQ29weXJpZ2h0IMKp IDIwMTcgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFu dGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBv ZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAi U29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rp b24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBj b3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICog YW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25z IHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3Qg dG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQg bm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAq IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlh bCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQ Uk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9S CisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVT IE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF IEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMg T1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1Ig T1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRP UlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElP TiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBU SEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxz dGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVk ZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+ CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNpbmNsdWRl IDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+Cisj aW5jbHVkZSA8cG9sbC5oPgorCisjaW5jbHVkZSAiaWd0LmgiCisjaW5jbHVkZSAiaWd0X2NvcmUu aCIKKyNpbmNsdWRlICJpZ3RfcGVyZi5oIgorI2luY2x1ZGUgImlndF9zeXNmcy5oIgorCitJR1Rf VEVTVF9ERVNDUklQVElPTigiVGVzdCB0aGUgaTkxNSBwbXUgcGVyZiBpbnRlcmZhY2UiKTsKKwor Y29uc3QgZG91YmxlIHRvbGVyYW5jZSA9IDAuMDNmOworY29uc3QgdW5zaWduZWQgbG9uZyBiYXRj aF9kdXJhdGlvbl9ucyA9IDEwMCAqIDEwMDAgKiAxMDAwOworCitzdGF0aWMgaW50IG9wZW5fcG11 KHVpbnQ2NF90IGNvbmZpZykKK3sKKwlpbnQgZmQ7CisKKwlmZCA9IHBlcmZfaTkxNV9vcGVuKGNv bmZpZyk7CisJaWd0X3JlcXVpcmUoZmQgPj0gMCB8fCAoZmQgPCAwICYmIGVycm5vICE9IEVOT0RF VikpOworCWlndF9hc3NlcnQoZmQgPj0gMCk7CisKKwlyZXR1cm4gZmQ7Cit9CisKK3N0YXRpYyBp bnQgb3Blbl9ncm91cCh1aW50NjRfdCBjb25maWcsIGludCBncm91cCkKK3sKKwlpbnQgZmQ7CisK KwlmZCA9IHBlcmZfaTkxNV9vcGVuX2dyb3VwKGNvbmZpZywgZ3JvdXApOworCWlndF9yZXF1aXJl KGZkID49IDAgfHwgKGZkIDwgMCAmJiBlcnJubyAhPSBFTk9ERVYpKTsKKwlpZ3RfYXNzZXJ0KGZk ID49IDApOworCisJcmV0dXJuIGZkOworfQorCitzdGF0aWMgdm9pZAoraW5pdChpbnQgZ2VtX2Zk LCBjb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIgKmUsIHVpbnQ4X3Qgc2FtcGxl KQoreworCWludCBmZDsKKworCWZkID0gb3Blbl9wbXUoX19JOTE1X1BNVV9FTkdJTkUoZS0+Y2xh c3MsIGUtPmluc3RhbmNlLCBzYW1wbGUpKTsKKworCWNsb3NlKGZkKTsKK30KKworc3RhdGljIHVp bnQ2NF90IHBtdV9yZWFkX3NpbmdsZShpbnQgZmQpCit7CisJdWludDY0X3QgZGF0YVsyXTsKKwor CWlndF9hc3NlcnRfZXEocmVhZChmZCwgZGF0YSwgc2l6ZW9mKGRhdGEpKSwgc2l6ZW9mKGRhdGEp KTsKKworCXJldHVybiBkYXRhWzBdOworfQorCitzdGF0aWMgdm9pZCBwbXVfcmVhZF9tdWx0aShp bnQgZmQsIHVuc2lnbmVkIGludCBudW0sIHVpbnQ2NF90ICp2YWwpCit7CisJdWludDY0X3QgYnVm WzIgKyBudW1dOworCXVuc2lnbmVkIGludCBpOworCisJaWd0X2Fzc2VydF9lcShyZWFkKGZkLCBi dWYsIHNpemVvZihidWYpKSwgc2l6ZW9mKGJ1ZikpOworCisJZm9yIChpID0gMDsgaSA8IG51bTsg aSsrKQorCQl2YWxbaV0gPSBidWZbMiArIGldOworfQorCisjZGVmaW5lIGFzc2VydF93aXRoaW5f ZXBzaWxvbih4LCByZWYsIHRvbGVyYW5jZSkgXAorCWlndF9hc3NlcnRfZigoZG91YmxlKSh4KSA8 PSAoMS4wICsgdG9sZXJhbmNlKSAqIChkb3VibGUpcmVmICYmIFwKKwkJICAgICAoZG91YmxlKSh4 KSA+PSAoMS4wIC0gdG9sZXJhbmNlKSAqIChkb3VibGUpcmVmLCBcCisJCSAgICAgIiclcycgIT0g JyVzJyAoJWYgbm90IHdpdGhpbiAlZiUlIHRvbGVyYW5jZSBvZiAlZilcbiIsXAorCQkgICAgICN4 LCAjcmVmLCAoZG91YmxlKXgsIHRvbGVyYW5jZSAqIDEwMC4wLCAoZG91YmxlKXJlZikKKworLyoK KyAqIEhlbHBlciBmb3IgY2FzZXMgd2hlcmUgd2UgYXNzZXJ0IG9uIHRpbWUgc3BlbnQgc2xlZXBp bmcgKGRpcmVjdGx5IG9yCisgKiBpbmRpcmVjdGx5KSwgc28gbWFrZSBpdCBtb3JlIHJvYnVzdCBi eSBlbnN1cmluZyB0aGUgc3lzdGVtIHNsZWVwIHRpbWUKKyAqIGlzIHdpdGhpbiB0ZXN0IHRvbGVy YW5jZSB0byBzdGFydCB3aXRoLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IG1lYXN1cmVkX3Vz bGVlcCh1bnNpZ25lZCBpbnQgdXNlYykKK3sKKwl1aW50NjRfdCBzbGVwdCA9IDA7CisKKwl3aGls ZSAodXNlYyA+IDApIHsKKwkJc3RydWN0IHRpbWVzcGVjIHN0YXJ0ID0geyB9OworCQl1aW50NjRf dCB0aGlzX3NsZWVwOworCisJCWlndF9uc2VjX2VsYXBzZWQoJnN0YXJ0KTsKKwkJdXNsZWVwKHVz ZWMpOworCQl0aGlzX3NsZWVwID0gaWd0X25zZWNfZWxhcHNlZCgmc3RhcnQpOworCQlzbGVwdCAr PSB0aGlzX3NsZWVwOworCQlpZiAodGhpc19zbGVlcCA+IHVzZWMgKiAxMDAwKQorCQkJYnJlYWs7 CisJCXVzZWMgLT0gdGhpc19zbGVlcDsKKwl9CisKKwlyZXR1cm4gc2xlcHQ7Cit9CisKK3N0YXRp YyB1bnNpZ25lZCBpbnQgZTJyaW5nKGludCBnZW1fZmQsIGNvbnN0IHN0cnVjdCBpbnRlbF9leGVj dXRpb25fZW5naW5lMiAqZSkKK3sKKwlyZXR1cm4gZ2VtX2NsYXNzX2luc3RhbmNlX3RvX2ViX2Zs YWdzKGdlbV9mZCwgZS0+Y2xhc3MsIGUtPmluc3RhbmNlKTsKK30KKworc3RhdGljIHZvaWQKK3Np bmdsZShpbnQgZ2VtX2ZkLCBjb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIgKmUs IGJvb2wgYnVzeSkKK3sKKwlkb3VibGUgcmVmID0gYnVzeSA/IGJhdGNoX2R1cmF0aW9uX25zIDog MC4wZjsKKwlpZ3Rfc3Bpbl90ICpzcGluOworCXVpbnQ2NF90IHZhbDsKKwlpbnQgZmQ7CisKKwlm ZCA9IG9wZW5fcG11KEk5MTVfUE1VX0VOR0lORV9CVVNZKGUtPmNsYXNzLCBlLT5pbnN0YW5jZSkp OworCisJaWYgKGJ1c3kpIHsKKwkJc3BpbiA9IGlndF9zcGluX2JhdGNoX25ldyhnZW1fZmQsIDAs IGUycmluZyhnZW1fZmQsIGUpLCAwKTsKKwkJaWd0X3NwaW5fYmF0Y2hfc2V0X3RpbWVvdXQoc3Bp biwgYmF0Y2hfZHVyYXRpb25fbnMpOworCX0gZWxzZSB7CisJCXVzbGVlcChiYXRjaF9kdXJhdGlv bl9ucyAvIDEwMDApOworCX0KKworCWlmIChidXN5KQorCQlnZW1fc3luYyhnZW1fZmQsIHNwaW4t PmhhbmRsZSk7CisKKwl2YWwgPSBwbXVfcmVhZF9zaW5nbGUoZmQpOworCisJYXNzZXJ0X3dpdGhp bl9lcHNpbG9uKHZhbCwgcmVmLCB0b2xlcmFuY2UpOworCisJaWYgKGJ1c3kpCisJCWlndF9zcGlu X2JhdGNoX2ZyZWUoZ2VtX2ZkLCBzcGluKTsKKwljbG9zZShmZCk7Cit9CisKK3N0YXRpYyB2b2lk IGxvZ19idXN5KGludCBmZCwgdW5zaWduZWQgaW50IG51bV9lbmdpbmVzLCB1aW50NjRfdCAqdmFs KQoreworCWNoYXIgYnVmWzEwMjRdOworCWludCByZW0gPSBzaXplb2YoYnVmKTsKKwl1bnNpZ25l ZCBpbnQgaTsKKwljaGFyICpwID0gYnVmOworCisJZm9yIChpID0gMDsgaSA8IG51bV9lbmdpbmVz OyBpKyspIHsKKwkJaW50IGxlbjsKKworCQlsZW4gPSBzbnByaW50ZihwLCByZW0sICIldT0lIiBQ Ukl1NjQgIlxuIiwgIGksIHZhbFtpXSk7CisJCWlndF9hc3NlcnQobGVuID4gMCk7CisJCXJlbSAt PSBsZW47CisJCXAgKz0gbGVuOworCX0KKworCWlndF9pbmZvKCIlcyIsIGJ1Zik7Cit9CisKK3N0 YXRpYyB2b2lkCitidXN5X2NoZWNrX2FsbChpbnQgZ2VtX2ZkLCBjb25zdCBzdHJ1Y3QgaW50ZWxf ZXhlY3V0aW9uX2VuZ2luZTIgKmUsCisJICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBudW1fZW5n aW5lcykKK3sKKwljb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIgKmVfOworCXVp bnQ2NF90IHZhbFtudW1fZW5naW5lc107CisJaW50IGZkW251bV9lbmdpbmVzXTsKKwlpZ3Rfc3Bp bl90ICpzcGluOworCXVuc2lnbmVkIGludCBidXN5X2lkeCwgaTsKKworCWkgPSAwOworCWZkWzBd ID0gLTE7CisJZm9yX2VhY2hfZW5naW5lX2NsYXNzX2luc3RhbmNlKGZkLCBlXykgeworCQlpZiAo IWdlbV9oYXNfZW5naW5lKGdlbV9mZCwgZV8tPmNsYXNzLCBlXy0+aW5zdGFuY2UpKQorCQkJY29u dGludWU7CisJCWVsc2UgaWYgKGUgPT0gZV8pCisJCQlidXN5X2lkeCA9IGk7CisKKwkJZmRbaSsr XSA9IG9wZW5fZ3JvdXAoSTkxNV9QTVVfRU5HSU5FX0JVU1koZV8tPmNsYXNzLAorCQkJCQkJCSAg ZV8tPmluc3RhbmNlKSwKKwkJCQkgICAgIGZkWzBdKTsKKwl9CisKKwlzcGluID0gaWd0X3NwaW5f YmF0Y2hfbmV3KGdlbV9mZCwgMCwgZTJyaW5nKGdlbV9mZCwgZSksIDApOworCWlndF9zcGluX2Jh dGNoX3NldF90aW1lb3V0KHNwaW4sIGJhdGNoX2R1cmF0aW9uX25zKTsKKworCWdlbV9zeW5jKGdl bV9mZCwgc3Bpbi0+aGFuZGxlKTsKKworCXBtdV9yZWFkX211bHRpKGZkWzBdLCBudW1fZW5naW5l cywgdmFsKTsKKwlsb2dfYnVzeShmZFswXSwgbnVtX2VuZ2luZXMsIHZhbCk7CisKKwlhc3NlcnRf d2l0aGluX2Vwc2lsb24odmFsW2J1c3lfaWR4XSwgYmF0Y2hfZHVyYXRpb25fbnMsIHRvbGVyYW5j ZSk7CisJZm9yIChpID0gMDsgaSA8IG51bV9lbmdpbmVzOyBpKyspIHsKKwkJaWYgKGkgPT0gYnVz eV9pZHgpCisJCQljb250aW51ZTsKKwkJYXNzZXJ0X3dpdGhpbl9lcHNpbG9uKHZhbFtpXSwgMC4w ZiwgdG9sZXJhbmNlKTsKKwl9CisKKwlpZ3Rfc3Bpbl9iYXRjaF9mcmVlKGdlbV9mZCwgc3Bpbik7 CisJY2xvc2UoZmRbMF0pOworfQorCitzdGF0aWMgdm9pZAorbW9zdF9idXN5X2NoZWNrX2FsbChp bnQgZ2VtX2ZkLCBjb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIgKmUsCisJCSAg ICBjb25zdCB1bnNpZ25lZCBpbnQgbnVtX2VuZ2luZXMpCit7CisJY29uc3Qgc3RydWN0IGludGVs X2V4ZWN1dGlvbl9lbmdpbmUyICplXzsKKwl1aW50NjRfdCB2YWxbbnVtX2VuZ2luZXNdOworCWlu dCBmZFtudW1fZW5naW5lc107CisJaWd0X3NwaW5fdCAqc3BpbltudW1fZW5naW5lc107CisJdW5z aWduZWQgaW50IGlkbGVfaWR4LCBpOworCisJZ2VtX3JlcXVpcmVfZW5naW5lKGdlbV9mZCwgZS0+ Y2xhc3MsIGUtPmluc3RhbmNlKTsKKworCWkgPSAwOworCWZkWzBdID0gLTE7CisJZm9yX2VhY2hf ZW5naW5lX2NsYXNzX2luc3RhbmNlKGZkLCBlXykgeworCQlpZiAoIWdlbV9oYXNfZW5naW5lKGdl bV9mZCwgZV8tPmNsYXNzLCBlXy0+aW5zdGFuY2UpKQorCQkJY29udGludWU7CisKKwkJZmRbaV0g PSBvcGVuX2dyb3VwKEk5MTVfUE1VX0VOR0lORV9CVVNZKGVfLT5jbGFzcywKKwkJCQkJCQllXy0+ aW5zdGFuY2UpLAorCQkJCSAgIGZkWzBdKTsKKworCQlpZiAoZSA9PSBlXykgeworCQkJaWRsZV9p ZHggPSBpOworCQl9IGVsc2UgeworCQkJc3BpbltpXSA9IGlndF9zcGluX2JhdGNoX25ldyhnZW1f ZmQsIDAsCisJCQkJCQkgICAgIGUycmluZyhnZW1fZmQsIGVfKSwgMCk7CisJCQlpZ3Rfc3Bpbl9i YXRjaF9zZXRfdGltZW91dChzcGluW2ldLCBiYXRjaF9kdXJhdGlvbl9ucyk7CisJCX0KKworCQlp Kys7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9lbmdpbmVzOyBpKyspIHsKKwkJaWYgKGkg IT0gaWRsZV9pZHgpCisJCQlnZW1fc3luYyhnZW1fZmQsIHNwaW5baV0tPmhhbmRsZSk7CisJfQor CisJcG11X3JlYWRfbXVsdGkoZmRbMF0sIG51bV9lbmdpbmVzLCB2YWwpOworCWxvZ19idXN5KGZk WzBdLCBudW1fZW5naW5lcywgdmFsKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fZW5naW5lczsg aSsrKSB7CisJCWlmIChpID09IGlkbGVfaWR4KQorCQkJYXNzZXJ0X3dpdGhpbl9lcHNpbG9uKHZh bFtpXSwgMC4wZiwgdG9sZXJhbmNlKTsKKwkJZWxzZQorCQkJYXNzZXJ0X3dpdGhpbl9lcHNpbG9u KHZhbFtpXSwgYmF0Y2hfZHVyYXRpb25fbnMsCisJCQkJCSAgICAgIHRvbGVyYW5jZSk7CisJfQor CisJZm9yIChpID0gMDsgaSA8IG51bV9lbmdpbmVzOyBpKyspIHsKKwkJaWYgKGkgIT0gaWRsZV9p ZHgpCisJCQlpZ3Rfc3Bpbl9iYXRjaF9mcmVlKGdlbV9mZCwgc3BpbltpXSk7CisJfQorCWNsb3Nl KGZkWzBdKTsKK30KKworc3RhdGljIHZvaWQKK2FsbF9idXN5X2NoZWNrX2FsbChpbnQgZ2VtX2Zk LCBjb25zdCB1bnNpZ25lZCBpbnQgbnVtX2VuZ2luZXMpCit7CisJY29uc3Qgc3RydWN0IGludGVs X2V4ZWN1dGlvbl9lbmdpbmUyICplOworCXVpbnQ2NF90IHZhbFtudW1fZW5naW5lc107CisJaW50 IGZkW251bV9lbmdpbmVzXTsKKwlpZ3Rfc3Bpbl90ICpzcGluW251bV9lbmdpbmVzXTsKKwl1bnNp Z25lZCBpbnQgaTsKKworCWkgPSAwOworCWZkWzBdID0gLTE7CisJZm9yX2VhY2hfZW5naW5lX2Ns YXNzX2luc3RhbmNlKGZkLCBlKSB7CisJCWlmICghZ2VtX2hhc19lbmdpbmUoZ2VtX2ZkLCBlLT5j bGFzcywgZS0+aW5zdGFuY2UpKQorCQkJY29udGludWU7CisKKwkJZmRbaV0gPSBvcGVuX2dyb3Vw KEk5MTVfUE1VX0VOR0lORV9CVVNZKGUtPmNsYXNzLCBlLT5pbnN0YW5jZSksCisJCQkJICAgZmRb MF0pOworCisJCXNwaW5baV0gPSBpZ3Rfc3Bpbl9iYXRjaF9uZXcoZ2VtX2ZkLCAwLCBlMnJpbmco Z2VtX2ZkLCBlKSwgMCk7CisJCWlndF9zcGluX2JhdGNoX3NldF90aW1lb3V0KHNwaW5baV0sIGJh dGNoX2R1cmF0aW9uX25zKTsKKworCQlpKys7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9l bmdpbmVzOyBpKyspCisJCWdlbV9zeW5jKGdlbV9mZCwgc3BpbltpXS0+aGFuZGxlKTsKKworCXBt dV9yZWFkX211bHRpKGZkWzBdLCBudW1fZW5naW5lcywgdmFsKTsKKwlsb2dfYnVzeShmZFswXSwg bnVtX2VuZ2luZXMsIHZhbCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VuZ2luZXM7IGkrKykK KwkJYXNzZXJ0X3dpdGhpbl9lcHNpbG9uKHZhbFtpXSwgYmF0Y2hfZHVyYXRpb25fbnMsIHRvbGVy YW5jZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VuZ2luZXM7IGkrKykKKwkJaWd0X3NwaW5f YmF0Y2hfZnJlZShnZW1fZmQsIHNwaW5baV0pOworCWNsb3NlKGZkWzBdKTsKK30KKworc3RhdGlj IHZvaWQKK25vX3NlbWEoaW50IGdlbV9mZCwgY29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9l bmdpbmUyICplLCBib29sIGJ1c3kpCit7CisJaWd0X3NwaW5fdCAqc3BpbjsKKwl1aW50NjRfdCB2 YWxbMl07CisJaW50IGZkOworCisJZmQgPSBvcGVuX2dyb3VwKEk5MTVfUE1VX0VOR0lORV9TRU1B KGUtPmNsYXNzLCBlLT5pbnN0YW5jZSksIC0xKTsKKwlvcGVuX2dyb3VwKEk5MTVfUE1VX0VOR0lO RV9XQUlUKGUtPmNsYXNzLCBlLT5pbnN0YW5jZSksIGZkKTsKKworCWlmIChidXN5KSB7CisJCXNw aW4gPSBpZ3Rfc3Bpbl9iYXRjaF9uZXcoZ2VtX2ZkLCAwLCBlMnJpbmcoZ2VtX2ZkLCBlKSwgMCk7 CisJCWlndF9zcGluX2JhdGNoX3NldF90aW1lb3V0KHNwaW4sIGJhdGNoX2R1cmF0aW9uX25zKTsK Kwl9IGVsc2UgeworCQl1c2xlZXAoYmF0Y2hfZHVyYXRpb25fbnMgLyAxMDAwKTsKKwl9CisKKwlp ZiAoYnVzeSkKKwkJZ2VtX3N5bmMoZ2VtX2ZkLCBzcGluLT5oYW5kbGUpOworCisJcG11X3JlYWRf bXVsdGkoZmQsIDIsIHZhbCk7CisKKwlhc3NlcnRfd2l0aGluX2Vwc2lsb24odmFsWzBdLCAwLjBm LCB0b2xlcmFuY2UpOworCWFzc2VydF93aXRoaW5fZXBzaWxvbih2YWxbMV0sIDAuMGYsIHRvbGVy YW5jZSk7CisKKwlpZiAoYnVzeSkKKwkJaWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW4p OworCWNsb3NlKGZkKTsKK30KKworI2RlZmluZSBNSV9JTlNUUihvcGNvZGUsIGZsYWdzKSAoKChv cGNvZGUpIDw8IDIzKSB8IChmbGFncykpCisjZGVmaW5lIE1JX1NFTUFQSE9SRV9XQUlUCU1JX0lO U1RSKDB4MWMsIDIpIC8qIEdFTjgrICovCisjZGVmaW5lICAgTUlfU0VNQVBIT1JFX1BPTEwJCSgx PDwxNSkKKyNkZWZpbmUgICBNSV9TRU1BUEhPUkVfU0FEX0dURV9TREQJKDE8PDEyKQorCitzdGF0 aWMgdm9pZAorc2VtYV93YWl0KGludCBnZW1fZmQsIGNvbnN0IHN0cnVjdCBpbnRlbF9leGVjdXRp b25fZW5naW5lMiAqZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkg cmVsb2MgPSB7IH07CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiBlYiA9IHsgfTsK KwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiBvYmpbMl07CisJdWludDMyX3QgYmJf aGFuZGxlLCBvYmpfaGFuZGxlOworCXVuc2lnbmVkIGxvbmcgc2xlcHQ7CisJdWludDMyX3QgKm9i al9wdHI7CisJdWludDMyX3QgYmF0Y2hbNl07CisJdWludDY0X3QgdmFsWzJdOworCWludCBmZDsK KworCWlndF9yZXF1aXJlKGludGVsX2dlbihpbnRlbF9nZXRfZHJtX2RldmlkKGdlbV9mZCkpID49 IDgpOworCisJLyoqCisJICogU2V0dXAgdXAgYSBiYXRjaGJ1ZmZlciB3aXRoIGEgcG9sbGluZyBz ZW1hcGhvcmUgd2FpdCBjb21tYW5kIHdoaWNoCisJICogd2lsbCB3YWl0IG9uIGFuIHZhbHVlIGlu IGEgc2hhcmVkIGJvIHRvIGNoYW5nZS4gVGhpcyB3YXkgd2UgYXJlIGFibGUKKwkgKiB0byBjb250 cm9sIGhvdyBtdWNoIHRpbWUgd2Ugd2lsbCBzcGVuZCBpbiB0aGlzIGJiLgorCSAqLworCisJYmJf aGFuZGxlID0gZ2VtX2NyZWF0ZShnZW1fZmQsIDQwOTYpOworCW9ial9oYW5kbGUgPSBnZW1fY3Jl YXRlKGdlbV9mZCwgNDA5Nik7CisKKwlvYmpfcHRyID0gZ2VtX21tYXBfX3djKGdlbV9mZCwgb2Jq X2hhbmRsZSwgMCwgNDA5NiwgUFJPVF9XUklURSk7CisKKwliYXRjaFswXSA9IE1JX1NFTUFQSE9S RV9XQUlUIHwKKwkJICAgTUlfU0VNQVBIT1JFX1BPTEwgfAorCQkgICBNSV9TRU1BUEhPUkVfU0FE X0dURV9TREQ7CisJYmF0Y2hbMV0gPSAxOworCWJhdGNoWzJdID0gMHgwOworCWJhdGNoWzNdID0g MHgwOworCWJhdGNoWzRdID0gTUlfTk9PUDsKKwliYXRjaFs1XSA9IE1JX0JBVENIX0JVRkZFUl9F TkQ7CisKKwlnZW1fd3JpdGUoZ2VtX2ZkLCBiYl9oYW5kbGUsIDAsIGJhdGNoLCBzaXplb2YoYmF0 Y2gpKTsKKworCXJlbG9jLnRhcmdldF9oYW5kbGUgPSBvYmpfaGFuZGxlOworCXJlbG9jLm9mZnNl dCA9IDIgKiBzaXplb2YodWludDMyX3QpOworCXJlbG9jLnJlYWRfZG9tYWlucyA9IEk5MTVfR0VN X0RPTUFJTl9SRU5ERVI7CisKKwltZW1zZXQob2JqLCAwLCBzaXplb2Yob2JqKSk7CisKKwlvYmpb MF0uaGFuZGxlID0gb2JqX2hhbmRsZTsKKworCW9ialsxXS5oYW5kbGUgPSBiYl9oYW5kbGU7CisJ b2JqWzFdLnJlbG9jYXRpb25fY291bnQgPSAxOworCW9ialsxXS5yZWxvY3NfcHRyID0gdG9fdXNl cl9wb2ludGVyKCZyZWxvYyk7CisKKwllYi5idWZmZXJfY291bnQgPSAyOworCWViLmJ1ZmZlcnNf cHRyID0gdG9fdXNlcl9wb2ludGVyKG9iaik7CisJZWIuZmxhZ3MgPSBlMnJpbmcoZ2VtX2ZkLCBl KTsKKworCS8qKgorCSAqIFN0YXJ0IHRoZSBzZW1hcGhvcmUgd2FpdCBQTVUgYW5kIGFmdGVyIHNv bWUga25vd24gdGltZSBsZXQgdGhlIGFib3ZlCisJICogc2VtYXBob3JlIHdhaXQgY29tbWFuZCBm aW5pc2guIFRoZW4gY2hlY2sgdGhhdCB0aGUgUE1VIGlzIHJlcG9ydGluZworCSAqIHRvIGV4cGVj dGVkIHRpbWUgc3BlbnQgaW4gc2VtYXBob3JlIHdhaXQgc3RhdGUuCisJICovCisKKwlmZCA9IG9w ZW5fcG11KEk5MTVfUE1VX0VOR0lORV9TRU1BKGUtPmNsYXNzLCBlLT5pbnN0YW5jZSkpOworCisJ dmFsWzBdID0gcG11X3JlYWRfc2luZ2xlKGZkKTsKKworCWdlbV9leGVjYnVmKGdlbV9mZCwgJmVi KTsKKworCXNsZXB0ID0gbWVhc3VyZWRfdXNsZWVwKDFlNSk7CisKKwkqb2JqX3B0ciA9IDE7CisK KwlnZW1fc3luYyhnZW1fZmQsIGJiX2hhbmRsZSk7CisKKwl2YWxbMV0gPSBwbXVfcmVhZF9zaW5n bGUoZmQpOworCisJbXVubWFwKG9ial9wdHIsIDQwOTYpOworCWdlbV9jbG9zZShnZW1fZmQsIG9i al9oYW5kbGUpOworCWdlbV9jbG9zZShnZW1fZmQsIGJiX2hhbmRsZSk7CisJY2xvc2UoZmQpOwor CisJYXNzZXJ0X3dpdGhpbl9lcHNpbG9uKHZhbFsxXSAtIHZhbFswXSwgc2xlcHQsIHRvbGVyYW5j ZSk7Cit9CisKKyNkZWZpbmUgICBNSV9XQUlUX0ZPUl9QSVBFX0NfVkJMQU5LICgxPDwyMSkKKyNk ZWZpbmUgICBNSV9XQUlUX0ZPUl9QSVBFX0JfVkJMQU5LICgxPDwxMSkKKyNkZWZpbmUgICBNSV9X QUlUX0ZPUl9QSVBFX0FfVkJMQU5LICgxPDwzKQorCit0eXBlZGVmIHN0cnVjdCB7CisJaWd0X2Rp c3BsYXlfdCBkaXNwbGF5OworCXN0cnVjdCBpZ3RfZmIgcHJpbWFyeV9mYjsKKwlpZ3Rfb3V0cHV0 X3QgKm91dHB1dDsKKwllbnVtIHBpcGUgcGlwZTsKK30gZGF0YV90OworCitzdGF0aWMgdm9pZCBw cmVwYXJlX2NydGMoZGF0YV90ICpkYXRhLCBpbnQgZmQsIGlndF9vdXRwdXRfdCAqb3V0cHV0KQor eworCWRybU1vZGVNb2RlSW5mbyAqbW9kZTsKKwlpZ3RfZGlzcGxheV90ICpkaXNwbGF5ID0gJmRh dGEtPmRpc3BsYXk7CisJaWd0X3BsYW5lX3QgKnByaW1hcnk7CisKKwkvKiBzZWxlY3QgdGhlIHBp cGUgd2Ugd2FudCB0byB1c2UgKi8KKwlpZ3Rfb3V0cHV0X3NldF9waXBlKG91dHB1dCwgZGF0YS0+ cGlwZSk7CisKKwkvKiBjcmVhdGUgYW5kIHNldCB0aGUgcHJpbWFyeSBwbGFuZSBmYiAqLworCW1v ZGUgPSBpZ3Rfb3V0cHV0X2dldF9tb2RlKG91dHB1dCk7CisJaWd0X2NyZWF0ZV9jb2xvcl9mYihm ZCwgbW9kZS0+aGRpc3BsYXksIG1vZGUtPnZkaXNwbGF5LAorCQkJICAgIERSTV9GT1JNQVRfWFJH Qjg4ODgsCisJCQkgICAgTE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9ORSwKKwkJCSAgICAwLjAsIDAu MCwgMC4wLAorCQkJICAgICZkYXRhLT5wcmltYXJ5X2ZiKTsKKworCXByaW1hcnkgPSBpZ3Rfb3V0 cHV0X2dldF9wbGFuZV90eXBlKG91dHB1dCwgRFJNX1BMQU5FX1RZUEVfUFJJTUFSWSk7CisJaWd0 X3BsYW5lX3NldF9mYihwcmltYXJ5LCAmZGF0YS0+cHJpbWFyeV9mYik7CisKKwlpZ3RfZGlzcGxh eV9jb21taXQoZGlzcGxheSk7CisKKwlpZ3Rfd2FpdF9mb3JfdmJsYW5rKGZkLCBkYXRhLT5waXBl KTsKK30KKworc3RhdGljIHZvaWQgY2xlYW51cF9jcnRjKGRhdGFfdCAqZGF0YSwgaW50IGZkLCBp Z3Rfb3V0cHV0X3QgKm91dHB1dCkKK3sKKwlpZ3RfZGlzcGxheV90ICpkaXNwbGF5ID0gJmRhdGEt PmRpc3BsYXk7CisJaWd0X3BsYW5lX3QgKnByaW1hcnk7CisKKwlpZ3RfcmVtb3ZlX2ZiKGZkLCAm ZGF0YS0+cHJpbWFyeV9mYik7CisKKwlwcmltYXJ5ID0gaWd0X291dHB1dF9nZXRfcGxhbmVfdHlw ZShvdXRwdXQsIERSTV9QTEFORV9UWVBFX1BSSU1BUlkpOworCWlndF9wbGFuZV9zZXRfZmIocHJp bWFyeSwgTlVMTCk7CisKKwlpZ3Rfb3V0cHV0X3NldF9waXBlKG91dHB1dCwgUElQRV9BTlkpOwor CWlndF9kaXNwbGF5X2NvbW1pdChkaXNwbGF5KTsKK30KKworc3RhdGljIGludCB3YWl0X3ZibGFu ayhpbnQgZmQsIHVuaW9uIGRybV93YWl0X3ZibGFuayAqdmJsKQoreworCWludCBlcnI7CisKKwll cnIgPSAwOworCWlmIChpZ3RfaW9jdGwoZmQsIERSTV9JT0NUTF9XQUlUX1ZCTEFOSywgdmJsKSkK KwkJZXJyID0gLWVycm5vOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQKK2V2ZW50 X3dhaXQoaW50IGdlbV9mZCwgY29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUyICpl KQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyIG9iaiA9IHsgfTsKKwlzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyIGViID0geyB9OworCWRhdGFfdCBkYXRhOworCWln dF9kaXNwbGF5X3QgKmRpc3BsYXkgPSAmZGF0YS5kaXNwbGF5OworCWNvbnN0IHVpbnQzMl90IERF UlJNUiA9IDB4NDQwNTA7CisJdW5zaWduZWQgaW50IHZhbGlkX3Rlc3RzID0gMDsKKwl1aW50MzJf dCBiYXRjaFs4XSwgKmI7CisJaWd0X291dHB1dF90ICpvdXRwdXQ7CisJdWludDMyX3QgYmJfaGFu ZGxlOworCXVpbnQzMl90IHJlZzsKKwllbnVtIHBpcGUgcDsKKwlpbnQgZmQ7CisKKwlpZ3RfcmVx dWlyZShpbnRlbF9nZW4oaW50ZWxfZ2V0X2RybV9kZXZpZChnZW1fZmQpKSA+PSA2KTsKKwlpZ3Rf cmVxdWlyZShpbnRlbF9yZWdpc3Rlcl9hY2Nlc3NfaW5pdChpbnRlbF9nZXRfcGNpX2RldmljZSgp LAorCQkJCQkgICAgICAgZmFsc2UsIGdlbV9mZCkgPT0gMCk7CisKKwkvKioKKwkgKiBXZSB3aWxs IHVzZSB0aGUgZGlzcGxheSB0byByZW5kZXIgZXZlbnQgZm9yd2FyaW5kIHNvIG5lZWQgdG8KKwkg KiBwcm9ncmFtIHRoZSBERVJSTVIgcmVnaXN0ZXIgYW5kIHJlc3RvcmUgaXQgYXQgZXhpdC4KKwkg KgorCSAqIFdlIHdpbGwgZW1pdCBhIE1JX1dBSVRfRk9SX0VWRU5UIGxpc3RlbmluZyBmb3IgdmJs YW5rIGV2ZW50cywKKwkgKiBoYXZlIGEgYmFja2dyb3VuZCBoZWxwZXIgdG8gaW5kaXJlY3RseSBl bmFibGUgdmJsYW5rIGlycXMsIGFuZAorCSAqIGxpc3RlbiB0byB0aGUgcmVjb3JkZWQgdGltZSBz cGVudCBpbiBlbmdpbmUgd2FpdCBzdGF0ZSBhcyByZXBvcnRlZAorCSAqIGJ5IHRoZSBQTVUuCisJ ICovCisJcmVnID0gaW50ZWxfcmVnaXN0ZXJfcmVhZChERVJSTVIpOworCisJa21zdGVzdF9zZXRf dnRfZ3JhcGhpY3NfbW9kZSgpOworCWlndF9kaXNwbGF5X2luaXQoJmRhdGEuZGlzcGxheSwgZ2Vt X2ZkKTsKKworCWJiX2hhbmRsZSA9IGdlbV9jcmVhdGUoZ2VtX2ZkLCA0MDk2KTsKKworCWIgPSBi YXRjaDsKKwkqYisrID0gTUlfTE9BRF9SRUdJU1RFUl9JTU07CisJKmIrKyA9IERFUlJNUjsKKwkq YisrID0gcmVnICYgfigoMSA8PCAzKSB8ICgxIDw8IDExKSB8ICgxIDw8IDIxKSk7CisJKmIrKyA9 IE1JX1dBSVRfRk9SX0VWRU5UIHwgTUlfV0FJVF9GT1JfUElQRV9BX1ZCTEFOSzsKKwkqYisrID0g TUlfTE9BRF9SRUdJU1RFUl9JTU07CisJKmIrKyA9IERFUlJNUjsKKwkqYisrID0gcmVnOworCSpi KysgPSBNSV9CQVRDSF9CVUZGRVJfRU5EOworCisJb2JqLmhhbmRsZSA9IGJiX2hhbmRsZTsKKwor CWViLmJ1ZmZlcl9jb3VudCA9IDE7CisJZWIuYnVmZmVyc19wdHIgPSB0b191c2VyX3BvaW50ZXIo Jm9iaik7CisJZWIuZmxhZ3MgPSBlMnJpbmcoZ2VtX2ZkLCBlKSB8IEk5MTVfRVhFQ19TRUNVUkU7 CisKKwlmb3JfZWFjaF9waXBlX3dpdGhfdmFsaWRfb3V0cHV0KGRpc3BsYXksIHAsIG91dHB1dCkg eworCQlzdHJ1Y3QgaWd0X2hlbHBlcl9wcm9jZXNzIHdhaXRlciA9IHsgfTsKKwkJY29uc3QgdW5z aWduZWQgaW50IGZyYW1lcyA9IDM7CisJCXVuc2lnbmVkIGludCBmcmFtZTsKKwkJdWludDY0X3Qg dmFsWzJdOworCisJCWJhdGNoWzNdID0gTUlfV0FJVF9GT1JfRVZFTlQ7CisJCXN3aXRjaCAocCkg eworCQljYXNlIFBJUEVfQToKKwkJCWJhdGNoWzNdIHw9IE1JX1dBSVRfRk9SX1BJUEVfQV9WQkxB Tks7CisJCQlicmVhazsKKwkJY2FzZSBQSVBFX0I6CisJCQliYXRjaFszXSB8PSBNSV9XQUlUX0ZP Ul9QSVBFX0JfVkJMQU5LOworCQkJYnJlYWs7CisJCWNhc2UgUElQRV9DOgorCQkJYmF0Y2hbM10g fD0gTUlfV0FJVF9GT1JfUElQRV9DX1ZCTEFOSzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJ Y29udGludWU7CisJCX0KKworCQlnZW1fd3JpdGUoZ2VtX2ZkLCBiYl9oYW5kbGUsIDAsIGJhdGNo LCBzaXplb2YoYmF0Y2gpKTsKKworCQlkYXRhLnBpcGUgPSBwOworCQlwcmVwYXJlX2NydGMoJmRh dGEsIGdlbV9mZCwgb3V0cHV0KTsKKworCQlmZCA9IG9wZW5fcG11KEk5MTVfUE1VX0VOR0lORV9X QUlUKGUtPmNsYXNzLCBlLT5pbnN0YW5jZSkpOworCisJCXZhbFswXSA9IHBtdV9yZWFkX3Npbmds ZShmZCk7CisKKwkJaWd0X2ZvcmtfaGVscGVyKCZ3YWl0ZXIpIHsKKwkJCWNvbnN0IHVpbnQzMl90 IHBpcGVfaWRfZmxhZyA9CisJCQkJCWttc3Rlc3RfZ2V0X3ZibF9mbGFnKGRhdGEucGlwZSk7CisK KwkJCWZvciAoOzspIHsKKwkJCQl1bmlvbiBkcm1fd2FpdF92YmxhbmsgdmJsID0geyB9OworCisJ CQkJdmJsLnJlcXVlc3QudHlwZSA9IERSTV9WQkxBTktfUkVMQVRJVkU7CisJCQkJdmJsLnJlcXVl c3QudHlwZSB8PSBwaXBlX2lkX2ZsYWc7CisJCQkJdmJsLnJlcXVlc3Quc2VxdWVuY2UgPSAxOwor CQkJCWlndF9hc3NlcnRfZXEod2FpdF92YmxhbmsoZ2VtX2ZkLCAmdmJsKSwgMCk7CisJCQl9CisJ CX0KKworCQlmb3IgKGZyYW1lID0gMDsgZnJhbWUgPCBmcmFtZXM7IGZyYW1lKyspIHsKKwkJCWdl bV9leGVjYnVmKGdlbV9mZCwgJmViKTsKKwkJCWdlbV9zeW5jKGdlbV9mZCwgYmJfaGFuZGxlKTsK KwkJfQorCisJCWlndF9zdG9wX2hlbHBlcigmd2FpdGVyKTsKKworCQl2YWxbMV0gPSBwbXVfcmVh ZF9zaW5nbGUoZmQpOworCisJCWNsb3NlKGZkKTsKKworCQljbGVhbnVwX2NydGMoJmRhdGEsIGdl bV9mZCwgb3V0cHV0KTsKKwkJdmFsaWRfdGVzdHMrKzsKKworCQlpZ3RfYXNzZXJ0KHZhbFsxXSAt IHZhbFswXSA+IDApOworCX0KKworCWdlbV9jbG9zZShnZW1fZmQsIGJiX2hhbmRsZSk7CisKKwlp bnRlbF9yZWdpc3Rlcl9hY2Nlc3NfZmluaSgpOworCisJaWd0X3JlcXVpcmVfZih2YWxpZF90ZXN0 cywKKwkJICAgICAgIm5vIHZhbGlkIGNydGMvY29ubmVjdG9yIGNvbWJpbmF0aW9ucyBmb3VuZFxu Iik7Cit9CisKK3N0YXRpYyB2b2lkCittdWx0aV9jbGllbnQoaW50IGdlbV9mZCwgY29uc3Qgc3Ry dWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUyICplKQoreworCXVpbnQ2NF90IGNvbmZpZyA9IEk5 MTVfUE1VX0VOR0lORV9CVVNZKGUtPmNsYXNzLCBlLT5pbnN0YW5jZSk7CisJdW5zaWduZWQgaW50 IHNsZXB0OworCWlndF9zcGluX3QgKnNwaW47CisJdWludDY0X3QgdmFsWzJdOworCWludCBmZFsy XTsKKworCWZkWzBdID0gb3Blbl9wbXUoY29uZmlnKTsKKworCXNwaW4gPSBpZ3Rfc3Bpbl9iYXRj aF9uZXcoZ2VtX2ZkLCAwLCBlMnJpbmcoZ2VtX2ZkLCBlKSwgMCk7CisJaWd0X3NwaW5fYmF0Y2hf c2V0X3RpbWVvdXQoc3BpbiwgYmF0Y2hfZHVyYXRpb25fbnMpOworCisJdXNsZWVwKGJhdGNoX2R1 cmF0aW9uX25zIC8gMzAwMCk7CisKKwkvKgorCSAqIFNlY29uZCBQTVUgY2xpZW50IHdoaWNoIGlz IGluaXRpYWxpemVkIGFmdGVyIHRoZSBmaXJzdCBvbmUsCisJICogYW5kIGV4aXN0cyBiZWZvcmUg aXQsIHNob3VsZCBub3QgYWZmZWN0IGFjY291bnRpbmcgYXMgcmVwb3J0ZWQKKwkgKiBpbiB0aGUg Zmlyc3QgY2xpZW50LgorCSAqLworCWZkWzFdID0gb3Blbl9wbXUoY29uZmlnKTsKKwlzbGVwdCA9 IG1lYXN1cmVkX3VzbGVlcChiYXRjaF9kdXJhdGlvbl9ucyAvIDMwMDApOworCXZhbFsxXSA9IHBt dV9yZWFkX3NpbmdsZShmZFsxXSk7CisJY2xvc2UoZmRbMV0pOworCisJZ2VtX3N5bmMoZ2VtX2Zk LCBzcGluLT5oYW5kbGUpOworCisJdmFsWzBdID0gcG11X3JlYWRfc2luZ2xlKGZkWzBdKTsKKwor CWFzc2VydF93aXRoaW5fZXBzaWxvbih2YWxbMF0sIGJhdGNoX2R1cmF0aW9uX25zLCB0b2xlcmFu Y2UpOworCWFzc2VydF93aXRoaW5fZXBzaWxvbih2YWxbMV0sIHNsZXB0LCB0b2xlcmFuY2UpOwor CisJaWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW4pOworCWNsb3NlKGZkWzBdKTsKK30K KworLyoqCisgKiBUZXN0cyB0aGF0IGk5MTUgUE1VIGNvcmVjdGx5IGVycm9ycyBvdXQgaW4gaW52 YWxpZCBpbml0aWFsaXphdGlvbi4KKyAqIGk5MTUgUE1VIGlzIHVuY29yZSBQTVUsIHRodXM6Cisg KiAgLSBzYW1wbGluZyBwZXJpb2QgaXMgbm90IHN1cHBvcnRlZAorICogIC0gcGlkID4gMCBpcyBu b3Qgc3VwcG9ydGVkIHNpbmNlIHdlIGNhbid0IGNvdW50IHBlci1wcm9jZXNzICh3ZSBjb3VudAor ICogICAgcGVyIHdob2xlIHN5c3RlbSkKKyAqICAtIGNwdSAhPSAwIGlzIG5vdCBzdXBwb3J0ZWQg c2luY2UgaTkxNSBQTVUgZXhwb3NlcyBjcHVtYXNrIGZvciBDUFUwCisgKi8KK3N0YXRpYyB2b2lk IGludmFsaWRfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgYXR0cjsKKwlp bnQgcGlkLCBjcHU7CisKKyNkZWZpbmUgQVRUUl9JTklUKCkgXAorZG8geyBcCisJbWVtc2V0KCZh dHRyLCAwLCBzaXplb2YgKGF0dHIpKTsgXAorCWF0dHIuY29uZmlnID0gSTkxNV9QTVVfRU5HSU5F X0JVU1koSTkxNV9FTkdJTkVfQ0xBU1NfUkVOREVSLCAwKTsgXAorCWF0dHIudHlwZSA9IGk5MTVf dHlwZV9pZCgpOyBcCisJaWd0X2Fzc2VydChhdHRyLnR5cGUgIT0gMCk7IFwKK30gd2hpbGUoMCkK KworCUFUVFJfSU5JVCgpOworCWF0dHIuc2FtcGxlX3BlcmlvZCA9IDEwMDsKKwlwaWQgPSAtMTsK KwljcHUgPSAwOworCWlndF9hc3NlcnRfZXEocGVyZl9ldmVudF9vcGVuKCZhdHRyLCBwaWQsIGNw dSwgLTEsIDApLCAtMSk7CisJaWd0X2Fzc2VydF9lcShlcnJubywgRUlOVkFMKTsKKworCUFUVFJf SU5JVCgpOworCXBpZCA9IDA7CisJY3B1ID0gMDsKKwlpZ3RfYXNzZXJ0X2VxKHBlcmZfZXZlbnRf b3BlbigmYXR0ciwgcGlkLCBjcHUsIC0xLCAwKSwgLTEpOworCWlndF9hc3NlcnRfZXEoZXJybm8s IEVJTlZBTCk7CisKKwlBVFRSX0lOSVQoKTsKKwlwaWQgPSAtMTsKKwljcHUgPSAxOworCWlndF9h c3NlcnRfZXEocGVyZl9ldmVudF9vcGVuKCZhdHRyLCBwaWQsIGNwdSwgLTEsIDApLCAtMSk7CisJ aWd0X2Fzc2VydF9lcShlcnJubywgRU5PREVWKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9vdGhl cih1bnNpZ25lZCBpbnQgaSwgYm9vbCB2YWxpZCkKK3sKKwlpbnQgZmQ7CisKKwlmZCA9IHBlcmZf aTkxNV9vcGVuKF9fSTkxNV9QTVVfT1RIRVIoaSkpOworCWlndF9yZXF1aXJlKCEoZmQgPCAwICYm IGVycm5vID09IEVOT0RFVikpOworCWlmICh2YWxpZCkgeworCQlpZ3RfYXNzZXJ0KGZkID49IDAp OworCX0gZWxzZSB7CisJCWlndF9hc3NlcnQoZmQgPCAwKTsKKwkJcmV0dXJuOworCX0KKworCWNs b3NlKGZkKTsKK30KKworc3RhdGljIHZvaWQgcmVhZF9vdGhlcih1bnNpZ25lZCBpbnQgaSwgYm9v bCB2YWxpZCkKK3sKKwlpbnQgZmQ7CisKKwlmZCA9IHBlcmZfaTkxNV9vcGVuKF9fSTkxNV9QTVVf T1RIRVIoaSkpOworCWlndF9yZXF1aXJlKCEoZmQgPCAwICYmIGVycm5vID09IEVOT0RFVikpOwor CWlmICh2YWxpZCkgeworCQlpZ3RfYXNzZXJ0KGZkID49IDApOworCX0gZWxzZSB7CisJCWlndF9h c3NlcnQoZmQgPCAwKTsKKwkJcmV0dXJuOworCX0KKworCSh2b2lkKXBtdV9yZWFkX3NpbmdsZShm ZCk7CisKKwljbG9zZShmZCk7Cit9CisKK3N0YXRpYyBib29sIGNwdTBfaG90cGx1Z19zdXBwb3J0 KHZvaWQpCit7CisJcmV0dXJuIGFjY2VzcygiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1MC9v bmxpbmUiLCBXX09LKSA9PSAwOworfQorCitzdGF0aWMgdm9pZCBjcHVfaG90cGx1ZyhpbnQgZ2Vt X2ZkKQoreworCXN0cnVjdCB0aW1lc3BlYyBzdGFydCA9IHsgfTsKKwlpZ3Rfc3Bpbl90ICpzcGlu OworCXVpbnQ2NF90IHZhbCwgcmVmOworCWludCBmZDsKKworCWlndF9yZXF1aXJlKGNwdTBfaG90 cGx1Z19zdXBwb3J0KCkpOworCisJc3BpbiA9IGlndF9zcGluX2JhdGNoX25ldyhnZW1fZmQsIDAs IEk5MTVfRVhFQ19SRU5ERVIsIDApOworCWZkID0gcGVyZl9pOTE1X29wZW4oSTkxNV9QTVVfRU5H SU5FX0JVU1koSTkxNV9FTkdJTkVfQ0xBU1NfUkVOREVSLCAwKSk7CisJaWd0X2Fzc2VydChmZCA+ PSAwKTsKKworCWlndF9uc2VjX2VsYXBzZWQoJnN0YXJ0KTsKKworCS8qCisJICogVG9nZ2xlIG9u bGluZSBzdGF0dXMgb2YgYWxsIHRoZSBDUFVzIGluIGEgY2hpbGQgcHJvY2VzcyBhbmQgZW5zdXJl CisJICogdGhpcyBoYXMgbm90IGFmZmVjdGVkIGJ1c3luZXNzIHN0YXRzIGluIHRoZSBwYXJlbnQu CisJICovCisJaWd0X2ZvcmsoY2hpbGQsIDEpIHsKKwkJaW50IGNwdSA9IDA7CisKKwkJZm9yICg7 OykgeworCQkJY2hhciBuYW1lWzEyOF07CisJCQlpbnQgY3B1ZmQ7CisKKwkJCXNwcmludGYobmFt ZSwgIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSVkL29ubGluZSIsCisJCQkJY3B1KTsKKwkJ CWNwdWZkID0gb3BlbihuYW1lLCBPX1dST05MWSk7CisJCQlpZiAoY3B1ZmQgPT0gLTEpIHsKKwkJ CQlpZ3RfYXNzZXJ0KGNwdSA+IDApOworCQkJCWJyZWFrOworCQkJfQorCQkJaWd0X2Fzc2VydF9l cSh3cml0ZShjcHVmZCwgIjAiLCAyKSwgMik7CisKKwkJCXVzbGVlcCgxMDAwICogMTAwMCk7CisK KwkJCWlndF9hc3NlcnRfZXEod3JpdGUoY3B1ZmQsICIxIiwgMiksIDIpOworCisJCQljbG9zZShj cHVmZCk7CisJCQljcHUrKzsKKwkJfQorCX0KKworCWlndF93YWl0Y2hpbGRyZW4oKTsKKworCWln dF9zcGluX2JhdGNoX2VuZChzcGluKTsKKwlnZW1fc3luYyhnZW1fZmQsIHNwaW4tPmhhbmRsZSk7 CisKKwlyZWYgPSBpZ3RfbnNlY19lbGFwc2VkKCZzdGFydCk7CisJdmFsID0gcG11X3JlYWRfc2lu Z2xlKGZkKTsKKworCWFzc2VydF93aXRoaW5fZXBzaWxvbih2YWwsIHJlZiwgdG9sZXJhbmNlKTsK KworCWlndF9zcGluX2JhdGNoX2ZyZWUoZ2VtX2ZkLCBzcGluKTsKKwljbG9zZShmZCk7Cit9CisK K3N0YXRpYyB1bnNpZ25lZCBsb25nIGNhbGlicmF0ZV9ub3AoaW50IGZkLCBjb25zdCB1bnNpZ25l ZCBpbnQgY2FsaWJyYXRpb25fdXMpCit7CisJY29uc3QgdW5zaWduZWQgaW50IGNhbF9taW5fdXMg PSBjYWxpYnJhdGlvbl91cyAqIDM7CisJY29uc3QgdW5zaWduZWQgaW50IHRvbGVyYW5jZV9wY3Qg PSAxMDsKKwljb25zdCB1aW50MzJfdCBiYmUgPSAweGEgPDwgMjM7CisJY29uc3QgdW5zaWduZWQg aW50IGxvb3BzID0gMTc7CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgb2JqID0g e307CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiBlYiA9CisJCXsgLmJ1ZmZlcl9j b3VudCA9IDEsIC5idWZmZXJzX3B0ciA9ICh1aW50cHRyX3QpJm9ian07CisJc3RydWN0IHRpbWVz cGVjIHRfYmVnaW4gPSB7IH07CisJbG9uZyBzaXplLCBsYXN0X3NpemU7CisJdW5zaWduZWQgbG9u ZyBuczsKKworCWlndF9uc2VjX2VsYXBzZWQoJnRfYmVnaW4pOworCisJc2l6ZSA9IDI1NiAqIDEw MjQ7CisJZG8geworCQlzdHJ1Y3QgdGltZXNwZWMgdF9zdGFydCA9IHsgfTsKKworCQlvYmouaGFu ZGxlID0gZ2VtX2NyZWF0ZShmZCwgc2l6ZSk7CisJCWdlbV93cml0ZShmZCwgb2JqLmhhbmRsZSwg c2l6ZSAtIHNpemVvZihiYmUpLCAmYmJlLAorCQkJICBzaXplb2YoYmJlKSk7CisJCWdlbV9leGVj YnVmKGZkLCAmZWIpOworCQlnZW1fc3luYyhmZCwgb2JqLmhhbmRsZSk7CisKKwkJaWd0X25zZWNf ZWxhcHNlZCgmdF9zdGFydCk7CisKKwkJZm9yIChpbnQgbG9vcCA9IDA7IGxvb3AgPCBsb29wczsg bG9vcCsrKQorCQkJZ2VtX2V4ZWNidWYoZmQsICZlYik7CisJCWdlbV9zeW5jKGZkLCBvYmouaGFu ZGxlKTsKKworCQlucyA9IGlndF9uc2VjX2VsYXBzZWQoJnRfc3RhcnQpOworCisJCWdlbV9jbG9z ZShmZCwgb2JqLmhhbmRsZSk7CisKKwkJbGFzdF9zaXplID0gc2l6ZTsKKwkJc2l6ZSA9IGNhbGli cmF0aW9uX3VzICogMTAwMCAqIHNpemUgKiBsb29wcyAvIG5zOworCQlzaXplID0gQUxJR04oc2l6 ZSwgc2l6ZW9mKHVpbnQzMl90KSk7CisJfSB3aGlsZSAoaWd0X25zZWNfZWxhcHNlZCgmdF9iZWdp bikgLyAxMDAwIDwgY2FsX21pbl91cyB8fAorCQkgYWJzKHNpemUgLSBsYXN0X3NpemUpID4gKHNp emUgKiB0b2xlcmFuY2VfcGN0IC8gMTAwKSk7CisKKwlyZXR1cm4gc2l6ZSAvIHNpemVvZih1aW50 MzJfdCk7Cit9CisKK3N0YXRpYyBpbnQgY2hhaW5fbm9wKGludCBnZW1fZmQsIHVuc2lnbmVkIGxv bmcgc3osIGludCBpbl9mZW5jZSwgYm9vbCBzeW5jKQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1f ZXhlY19vYmplY3QyIG9iaiA9IHt9OworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlcjIg ZWIgPQorCQl7IC5idWZmZXJfY291bnQgPSAxLCAuYnVmZmVyc19wdHIgPSAodWludHB0cl90KSZv Ymp9OworCWNvbnN0IHVpbnQzMl90IGJiZSA9IDB4YSA8PCAyMzsKKworCXN6ID0gQUxJR04oc3os IHNpemVvZih1aW50MzJfdCkpOworCisJb2JqLmhhbmRsZSA9IGdlbV9jcmVhdGUoZ2VtX2ZkLCBz eik7CisJZ2VtX3dyaXRlKGdlbV9mZCwgb2JqLmhhbmRsZSwgc3ogLSBzaXplb2YoYmJlKSwgJmJi ZSwgc2l6ZW9mKGJiZSkpOworCisJZWIuZmxhZ3MgPSBJOTE1X0VYRUNfUkVOREVSIHwgSTkxNV9F WEVDX0ZFTkNFX09VVDsKKworCWlmIChpbl9mZW5jZSA+PSAwKSB7CisJCWViLmZsYWdzIHw9IEk5 MTVfRVhFQ19GRU5DRV9JTjsKKwkJZWIucnN2ZDIgPSBpbl9mZW5jZTsKKwl9CisKKwlnZW1fZXhl Y2J1Zl93cihnZW1fZmQsICZlYik7CisKKwlpZiAoc3luYykKKwkJZ2VtX3N5bmMoZ2VtX2ZkLCBv YmouaGFuZGxlKTsKKworCWdlbV9jbG9zZShnZW1fZmQsIG9iai5oYW5kbGUpOworCWlmIChpbl9m ZW5jZSA+PSAwKQorCQljbG9zZShpbl9mZW5jZSk7CisKKwlyZXR1cm4gZWIucnN2ZDIgPj4gMzI7 Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2ludGVycnVwdHMoaW50IGdlbV9mZCkKK3sKKwljb25z dCB1bnNpZ25lZCBpbnQgY2FsaWJyYXRpb25fdXMgPSAyNTAwMDA7CisJY29uc3QgdW5zaWduZWQg aW50IGJhdGNoX2xlbl91cyA9IDEwMDAwMDsKKwljb25zdCB1bnNpZ25lZCBpbnQgYmF0Y2hfY291 bnQgPSAzZTYgLyBiYXRjaF9sZW5fdXM7CisJdWludDY0X3QgaWRsZSwgYnVzeSwgcHJldjsKKwl1 bnNpZ25lZCBsb25nIGNhbCwgc3o7CisJaW50IGZkLCBmZW5jZSA9IC0xOworCXVuc2lnbmVkIGlu dCBpOworCisJY2FsID0gY2FsaWJyYXRlX25vcChnZW1fZmQsIGNhbGlicmF0aW9uX3VzKTsKKwlz eiA9IGJhdGNoX2xlbl91cyAqIGNhbCAvIGNhbGlicmF0aW9uX3VzOworCisJZmQgPSBvcGVuX3Bt dShJOTE1X1BNVV9JTlRFUlJVUFRTKTsKKworCWdlbV9xdWllc2NlbnRfZ3B1KGdlbV9mZCk7CisK KwkvKiBXYWl0IGZvciBpZGxlIHN0YXRlLiAqLworCXByZXYgPSBwbXVfcmVhZF9zaW5nbGUoZmQp OworCWlkbGUgPSBwcmV2ICsgMTsKKwl3aGlsZSAoaWRsZSAhPSBwcmV2KSB7CisJCXVzbGVlcCgx ZTYpOworCQlwcmV2ID0gaWRsZTsKKwkJaWRsZSA9IHBtdV9yZWFkX3NpbmdsZShmZCk7CisJfQor CisJaWd0X2Fzc2VydF9lcShpZGxlIC0gcHJldiwgMCk7CisKKwkvKiBTZW5kIHNvbWUgbm8tb3Ag YmF0Y2hlcyB3aXRoIGNoYWluZWQgZmVuY2VzIHRvIGVuc3VyZSBpbnRlcnJ1cHRzLiAqLworCWZv ciAoaSA9IDE7IGkgPD0gYmF0Y2hfY291bnQ7IGkrKykKKwkJZmVuY2UgPSBjaGFpbl9ub3AoZ2Vt X2ZkLCBzeiwgZmVuY2UsCisJCQkJICBpIDwgYmF0Y2hfY291bnQgPyBmYWxzZSA6IHRydWUpOwor CisJY2xvc2UoZmVuY2UpOworCisJLyogQ2hlY2sgYXQgbGVhc3QgYXMgbWFueSBpbnRlcnJ1cHRz IGhhcyBiZWVuIGdlbmVyYXRlZC4gKi8KKwlidXN5ID0gcG11X3JlYWRfc2luZ2xlKGZkKTsKKwlp Z3RfYXNzZXJ0KGJ1c3kgPj0gYmF0Y2hfY291bnQpOworCisJY2xvc2UoZmQpOworfQorCitzdGF0 aWMgdm9pZAordGVzdF9mcmVxdWVuY3koaW50IGdlbV9mZCkKK3sKKwljb25zdCB1aW50NjRfdCBk dXJhdGlvbl9ucyA9IDJlOTsKKwl1aW50MzJfdCBtaW5fZnJlcSwgbWF4X2ZyZXEsIGJvb3N0X2Zy ZXE7CisJdWludDY0X3QgbWluWzJdLCBtYXhbMl0sIHN0YXJ0WzJdOworCWlndF9zcGluX3QgKnNw aW47CisJaW50IGZkLCBzeXNmczsKKworCXN5c2ZzID0gaWd0X3N5c2ZzX29wZW4oZ2VtX2ZkLCBO VUxMKTsKKwlpZ3RfcmVxdWlyZShzeXNmcyA+PSAwKTsKKworCW1pbl9mcmVxID0gaWd0X3N5c2Zz X2dldF91MzIoc3lzZnMsICJndF9SUG5fZnJlcV9taHoiKTsKKwltYXhfZnJlcSA9IGlndF9zeXNm c19nZXRfdTMyKHN5c2ZzLCAiZ3RfUlAwX2ZyZXFfbWh6Iik7CisJYm9vc3RfZnJlcSA9IGlndF9z eXNmc19nZXRfdTMyKHN5c2ZzLCAiZ3RfYm9vc3RfZnJlcV9taHoiKTsKKwlpZ3RfcmVxdWlyZSht aW5fZnJlcSA+IDAgJiYgbWF4X2ZyZXEgPiAwICYmIGJvb3N0X2ZyZXEgPiAwKTsKKwlpZ3RfcmVx dWlyZShtYXhfZnJlcSA+IG1pbl9mcmVxKTsKKwlpZ3RfcmVxdWlyZShib29zdF9mcmVxID4gbWlu X2ZyZXEpOworCisJZmQgPSBvcGVuX2dyb3VwKEk5MTVfUE1VX1JFUVVFU1RFRF9GUkVRVUVOQ1ks IC0xKTsKKwlvcGVuX2dyb3VwKEk5MTVfUE1VX0FDVFVBTF9GUkVRVUVOQ1ksIGZkKTsKKworCS8q CisJICogU2V0IEdQVSB0byBtaW4gZnJlcXVlbmN5IGFuZCByZWFkIFBNVSBjb3VudGVycy4KKwkg Ki8KKwlpZ3RfcmVxdWlyZShpZ3Rfc3lzZnNfc2V0X3UzMihzeXNmcywgImd0X21heF9mcmVxX21o eiIsIG1pbl9mcmVxKSk7CisJaWd0X3JlcXVpcmUoaWd0X3N5c2ZzX2dldF91MzIoc3lzZnMsICJn dF9tYXhfZnJlcV9taHoiKSA9PSBtaW5fZnJlcSk7CisJaWd0X3JlcXVpcmUoaWd0X3N5c2ZzX3Nl dF91MzIoc3lzZnMsICJndF9ib29zdF9mcmVxX21oeiIsIG1pbl9mcmVxKSk7CisJaWd0X3JlcXVp cmUoaWd0X3N5c2ZzX2dldF91MzIoc3lzZnMsICJndF9ib29zdF9mcmVxX21oeiIpID09IG1pbl9m cmVxKTsKKworCXBtdV9yZWFkX211bHRpKGZkLCAyLCBzdGFydCk7CisKKwlzcGluID0gaWd0X3Nw aW5fYmF0Y2hfbmV3KGdlbV9mZCwgMCwgSTkxNV9FWEVDX1JFTkRFUiwgMCk7CisJaWd0X3NwaW5f YmF0Y2hfc2V0X3RpbWVvdXQoc3BpbiwgZHVyYXRpb25fbnMpOworCWdlbV9zeW5jKGdlbV9mZCwg c3Bpbi0+aGFuZGxlKTsKKworCXBtdV9yZWFkX211bHRpKGZkLCAyLCBtaW4pOworCW1pblswXSAt PSBzdGFydFswXTsKKwltaW5bMV0gLT0gc3RhcnRbMV07CisKKwlpZ3Rfc3Bpbl9iYXRjaF9mcmVl KGdlbV9mZCwgc3Bpbik7CisKKwl1c2xlZXAoMWU2KTsKKworCS8qCisJICogU2V0IEdQVSB0byBt YXggZnJlcXVlbmN5IGFuZCByZWFkIFBNVSBjb3VudGVycy4KKwkgKi8KKwlpZ3RfcmVxdWlyZShp Z3Rfc3lzZnNfc2V0X3UzMihzeXNmcywgImd0X21heF9mcmVxX21oeiIsIG1heF9mcmVxKSk7CisJ aWd0X3JlcXVpcmUoaWd0X3N5c2ZzX2dldF91MzIoc3lzZnMsICJndF9tYXhfZnJlcV9taHoiKSA9 PSBtYXhfZnJlcSk7CisJaWd0X3JlcXVpcmUoaWd0X3N5c2ZzX3NldF91MzIoc3lzZnMsICJndF9i b29zdF9mcmVxX21oeiIsIGJvb3N0X2ZyZXEpKTsKKwlpZ3RfcmVxdWlyZShpZ3Rfc3lzZnNfZ2V0 X3UzMihzeXNmcywgImd0X2Jvb3N0X2ZyZXFfbWh6IikgPT0gYm9vc3RfZnJlcSk7CisKKwlpZ3Rf cmVxdWlyZShpZ3Rfc3lzZnNfc2V0X3UzMihzeXNmcywgImd0X21pbl9mcmVxX21oeiIsIG1heF9m cmVxKSk7CisJaWd0X3JlcXVpcmUoaWd0X3N5c2ZzX2dldF91MzIoc3lzZnMsICJndF9taW5fZnJl cV9taHoiKSA9PSBtYXhfZnJlcSk7CisKKwlwbXVfcmVhZF9tdWx0aShmZCwgMiwgc3RhcnQpOwor CisJc3BpbiA9IGlndF9zcGluX2JhdGNoX25ldyhnZW1fZmQsIDAsIEk5MTVfRVhFQ19SRU5ERVIs IDApOworCWlndF9zcGluX2JhdGNoX3NldF90aW1lb3V0KHNwaW4sIGR1cmF0aW9uX25zKTsKKwln ZW1fc3luYyhnZW1fZmQsIHNwaW4tPmhhbmRsZSk7CisKKwlwbXVfcmVhZF9tdWx0aShmZCwgMiwg bWF4KTsKKwltYXhbMF0gLT0gc3RhcnRbMF07CisJbWF4WzFdIC09IHN0YXJ0WzFdOworCisJaWd0 X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW4pOworCisJLyoKKwkgKiBSZXN0b3JlIG1pbi9t YXguCisJICovCisJaWd0X3JlcXVpcmUoaWd0X3N5c2ZzX3NldF91MzIoc3lzZnMsICJndF9taW5f ZnJlcV9taHoiLCBtaW5fZnJlcSkpOworCWlndF9yZXF1aXJlKGlndF9zeXNmc19nZXRfdTMyKHN5 c2ZzLCAiZ3RfbWluX2ZyZXFfbWh6IikgPT0gbWluX2ZyZXEpOworCisJY2xvc2UoZmQpOworCisJ aWd0X2Fzc2VydChtaW5bMF0gPCBtYXhbMF0pOworCWlndF9hc3NlcnQobWluWzFdIDwgbWF4WzFd KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmM2KGludCBnZW1fZmQpCit7CisJaW50NjRfdCBk dXJhdGlvbl9ucyA9IDIgKiAxMDAwICogMTAwMCAqIDEwMDA7CisJdWludDY0X3QgaWRsZSwgYnVz eSwgcHJldjsKKwl1bnNpZ25lZCBpbnQgc2xlcHQ7CisJaW50IGZkLCBmdzsKKworCWZkID0gb3Bl bl9wbXUoSTkxNV9QTVVfUkM2X1JFU0lERU5DWSk7CisKKwlnZW1fcXVpZXNjZW50X2dwdShnZW1f ZmQpOworCXVzbGVlcCgxZTYpOworCisJLyogR28gaWRsZSBhbmQgY2hlY2sgZnVsbCBSQzYuICov CisJcHJldiA9IHBtdV9yZWFkX3NpbmdsZShmZCk7CisJc2xlcHQgPSBtZWFzdXJlZF91c2xlZXAo ZHVyYXRpb25fbnMgLyAxMDAwKTsKKwlpZGxlID0gcG11X3JlYWRfc2luZ2xlKGZkKTsKKworCWFz c2VydF93aXRoaW5fZXBzaWxvbihpZGxlIC0gcHJldiwgc2xlcHQsIHRvbGVyYW5jZSk7CisKKwkv KiBXYWtlIHVwIGRldmljZSBhbmQgY2hlY2sgbm8gUkM2LiAqLworCWZ3ID0gaWd0X29wZW5fZm9y Y2V3YWtlX2hhbmRsZShnZW1fZmQpOworCWlndF9hc3NlcnQoZncgPj0gMCk7CisKKwlwcmV2ID0g cG11X3JlYWRfc2luZ2xlKGZkKTsKKwl1c2xlZXAoZHVyYXRpb25fbnMgLyAxMDAwKTsKKwlidXN5 ID0gcG11X3JlYWRfc2luZ2xlKGZkKTsKKworCWFzc2VydF93aXRoaW5fZXBzaWxvbihidXN5IC0g cHJldiwgMC4wLCB0b2xlcmFuY2UpOworCisJY2xvc2UoZncpOworCWNsb3NlKGZkKTsKK30KKwor c3RhdGljIHZvaWQKK3Rlc3RfcmM2cChpbnQgZ2VtX2ZkKQoreworCWludDY0X3QgZHVyYXRpb25f bnMgPSAyICogMTAwMCAqIDEwMDAgKiAxMDAwOworCXVuc2lnbmVkIGludCBudW1fcG11ID0gMTsK Kwl1aW50NjRfdCBpZGxlWzNdLCBidXN5WzNdLCBwcmV2WzNdOworCXVuc2lnbmVkIGludCBzbGVw dCwgaTsKKwlpbnQgZmQsIHJldCwgZnc7CisKKwlmZCA9IG9wZW5fZ3JvdXAoSTkxNV9QTVVfUkM2 X1JFU0lERU5DWSwgLTEpOworCXJldCA9IHBlcmZfaTkxNV9vcGVuX2dyb3VwKEk5MTVfUE1VX1JD NnBfUkVTSURFTkNZLCBmZCk7CisJaWYgKHJldCA+IDApIHsKKwkJbnVtX3BtdSsrOworCQlyZXQg PSBwZXJmX2k5MTVfb3Blbl9ncm91cChJOTE1X1BNVV9SQzZwcF9SRVNJREVOQ1ksIGZkKTsKKwkJ aWYgKHJldCA+IDApCisJCQludW1fcG11Kys7CisJfQorCisJaWd0X3JlcXVpcmUobnVtX3BtdSA9 PSAzKTsKKworCWdlbV9xdWllc2NlbnRfZ3B1KGdlbV9mZCk7CisJdXNsZWVwKDFlNik7CisKKwkv KiBHbyBpZGxlIGFuZCBjaGVjayBmdWxsIFJDNi4gKi8KKwlwbXVfcmVhZF9tdWx0aShmZCwgbnVt X3BtdSwgcHJldik7CisJc2xlcHQgPSBtZWFzdXJlZF91c2xlZXAoZHVyYXRpb25fbnMgLyAxMDAw KTsKKwlwbXVfcmVhZF9tdWx0aShmZCwgbnVtX3BtdSwgaWRsZSk7CisKKwlmb3IgKGkgPSAwOyBp IDwgbnVtX3BtdTsgaSsrKQorCQlhc3NlcnRfd2l0aGluX2Vwc2lsb24oaWRsZVtpXSAtIHByZXZb aV0sIHNsZXB0LCB0b2xlcmFuY2UpOworCisJLyogV2FrZSB1cCBkZXZpY2UgYW5kIGNoZWNrIG5v IFJDNi4gKi8KKwlmdyA9IGlndF9vcGVuX2ZvcmNld2FrZV9oYW5kbGUoZ2VtX2ZkKTsKKwlpZ3Rf YXNzZXJ0KGZ3ID49IDApOworCisJcG11X3JlYWRfbXVsdGkoZmQsIG51bV9wbXUsIHByZXYpOwor CXVzbGVlcChkdXJhdGlvbl9ucyAvIDEwMDApOworCXBtdV9yZWFkX211bHRpKGZkLCBudW1fcG11 LCBidXN5KTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcG11OyBpKyspCisJCWFzc2VydF93aXRo aW5fZXBzaWxvbihidXN5W2ldIC0gcHJldltpXSwgMC4wLCB0b2xlcmFuY2UpOworCisJY2xvc2Uo ZncpOworCWNsb3NlKGZkKTsKK30KKworaWd0X21haW4KK3sKKwljb25zdCB1bnNpZ25lZCBpbnQg bnVtX290aGVyX21ldHJpY3MgPQorCQkJCUk5MTVfUE1VX0xBU1QgLSBfX0k5MTVfUE1VX09USEVS KDApICsgMTsKKwl1bnNpZ25lZCBpbnQgbnVtX2VuZ2luZXMgPSAwOworCWludCBmZCA9IC0xOwor CWNvbnN0IHN0cnVjdCBpbnRlbF9leGVjdXRpb25fZW5naW5lMiAqZTsKKwl1bnNpZ25lZCBpbnQg aTsKKworCWlndF9maXh0dXJlIHsKKwkJZmQgPSBkcm1fb3Blbl9kcml2ZXJfbWFzdGVyKERSSVZF Ul9JTlRFTCk7CisKKwkJaWd0X3JlcXVpcmVfZ2VtKGZkKTsKKwkJaWd0X3JlcXVpcmUoaTkxNV90 eXBlX2lkKCkgPiAwKTsKKworCQlmb3JfZWFjaF9lbmdpbmVfY2xhc3NfaW5zdGFuY2UoZmQsIGUp IHsKKwkJCWlmIChnZW1faGFzX2VuZ2luZShmZCwgZS0+Y2xhc3MsIGUtPmluc3RhbmNlKSkKKwkJ CQludW1fZW5naW5lcysrOworCQl9CisJfQorCisJLyoqCisJICogVGVzdCBpbnZhbGlkIGFjY2Vz cyB2aWEgcGVyZiBBUEkgaXMgcmVqZWN0ZWQuCisJICovCisJaWd0X3N1YnRlc3QoImludmFsaWQt aW5pdCIpCisJCWludmFsaWRfaW5pdCgpOworCisJZm9yX2VhY2hfZW5naW5lX2NsYXNzX2luc3Rh bmNlKGZkLCBlKSB7CisJCS8qKgorCQkgKiBUZXN0IHRoYXQgYSBzaW5nbGUgZW5naW5lIG1ldHJp YyBjYW4gYmUgaW5pdGlhbGl6ZWQuCisJCSAqLworCQlpZ3Rfc3VidGVzdF9mKCJpbml0LWJ1c3kt JXMiLCBlLT5uYW1lKQorCQkJaW5pdChmZCwgZSwgSTkxNV9TQU1QTEVfQlVTWSk7CisKKwkJaWd0 X3N1YnRlc3RfZigiaW5pdC13YWl0LSVzIiwgZS0+bmFtZSkKKwkJCWluaXQoZmQsIGUsIEk5MTVf U0FNUExFX1dBSVQpOworCisJCWlndF9zdWJ0ZXN0X2YoImluaXQtc2VtYS0lcyIsIGUtPm5hbWUp CisJCQlpbml0KGZkLCBlLCBJOTE1X1NBTVBMRV9TRU1BKTsKKworCQkvKioKKwkJICogVGVzdCB0 aGF0IGVuZ2luZXMgc2hvdyBubyBsb2FkIHdoZW4gaWRsZS4KKwkJICovCisJCWlndF9zdWJ0ZXN0 X2YoImlkbGUtJXMiLCBlLT5uYW1lKQorCQkJc2luZ2xlKGZkLCBlLCBmYWxzZSk7CisKKwkJLyoq CisJCSAqIFRlc3QgdGhhdCBhIHNpbmdsZSBlbmdpbmUgcmVwb3J0cyBsb2FkIGNvcnJlY3RseS4K KwkJICovCisJCWlndF9zdWJ0ZXN0X2YoImJ1c3ktJXMiLCBlLT5uYW1lKQorCQkJc2luZ2xlKGZk LCBlLCB0cnVlKTsKKworCQkvKioKKwkJICogVGVzdCB0aGF0IHdoZW4gb25lIGVuZ2luZSBpcyBs b2FkZWQgb3RoZXIgcmVwb3J0IG5vIGxvYWQuCisJCSAqLworCQlpZ3Rfc3VidGVzdF9mKCJidXN5 LWNoZWNrLWFsbC0lcyIsIGUtPm5hbWUpCisJCQlidXN5X2NoZWNrX2FsbChmZCwgZSwgbnVtX2Vu Z2luZXMpOworCisJCS8qKgorCQkgKiBUZXN0IHRoYXQgd2hlbiBhbGwgZXhjZXB0IG9uZSBlbmdp bmUgYXJlIGxvYWRlZCBhbGwgbG9hZHMKKwkJICogYXJlIGNvcnJlY3RseSByZXBvcnRlZC4KKwkJ ICovCisJCWlndF9zdWJ0ZXN0X2YoIm1vc3QtYnVzeS1jaGVjay1hbGwtJXMiLCBlLT5uYW1lKQor CQkJbW9zdF9idXN5X2NoZWNrX2FsbChmZCwgZSwgbnVtX2VuZ2luZXMpOworCisJCS8qKgorCQkg KiBUZXN0IHRoYXQgc2VtcGhvcmUgY291bnRlcnMgcmVwb3J0IG5vIGFjdGl2aXR5IG9uIGlkbGUK KwkJICogb3IgYnVzeSBlbmdpbmVzLgorCQkgKi8KKwkJaWd0X3N1YnRlc3RfZigiaWRsZS1uby1z ZW1hcGhvcmVzLSVzIiwgZS0+bmFtZSkKKwkJCW5vX3NlbWEoZmQsIGUsIGZhbHNlKTsKKworCQlp Z3Rfc3VidGVzdF9mKCJidXN5LW5vLXNlbWFwaG9yZXMtJXMiLCBlLT5uYW1lKQorCQkJbm9fc2Vt YShmZCwgZSwgdHJ1ZSk7CisKKwkJLyoqCisJCSAqIFRlc3QgdGhhdCBzZW1hcGhvcmUgd2FpdHMg YXJlIGNvcnJlY3RseSByZXBvcnRlZC4KKwkJICovCisJCWlndF9zdWJ0ZXN0X2YoInNlbWFwaG9y ZS13YWl0LSVzIiwgZS0+bmFtZSkKKwkJCXNlbWFfd2FpdChmZCwgZSk7CisKKwkJLyoqCisJCSAq IFRlc3QgdGhhdCBldmVudCB3YWl0cyBhcmUgY29ycmVjdGx5IHJlcG9ydGVkLgorCQkgKi8KKwkJ aWYgKGUtPmNsYXNzID09IEk5MTVfRU5HSU5FX0NMQVNTX1JFTkRFUikKKwkJCWlndF9zdWJ0ZXN0 X2YoImV2ZW50LXdhaXQtJXMiLCBlLT5uYW1lKQorCQkJCWV2ZW50X3dhaXQoZmQsIGUpOworCisJ CS8qKgorCQkgKiBDaGVjayB0aGF0IHR3byBwZXJmIGNsaWVudHMgZG8gbm90IGluZmx1ZW5jZSBl YWNoIG90aGVycworCQkgKiBvYnNlcnZhdGlvbnMuCisJCSAqLworCQlpZ3Rfc3VidGVzdF9mKCJt dWx0aS1jbGllbnQtJXMiLCBlLT5uYW1lKQorCQkJbXVsdGlfY2xpZW50KGZkLCBlKTsKKwl9CisK KwkvKioKKwkgKiBUZXN0IHRoYXQgd2hlbiBhbGwgZW5naW5lcyBhcmUgbG9hZGVkIGFsbCBsb2Fk cyBhcmUKKwkgKiBjb3JyZWN0bHkgcmVwb3J0ZWQuCisJICovCisJaWd0X3N1YnRlc3QoImFsbC1i dXN5LWNoZWNrLWFsbCIpCisJCWFsbF9idXN5X2NoZWNrX2FsbChmZCwgbnVtX2VuZ2luZXMpOwor CisJLyoqCisJICogVGVzdCB0aGF0IG5vbi1lbmdpbmUgY291bnRlcnMgY2FuIGJlIGluaXRpYWxp emVkIGFuZCByZWFkLiBBcGFydAorCSAqIGZyb20gdGhlIGludmFsaWQgbWV0cmljIHdoaWNoIHNo b3VsZCBmYWlsLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fb3RoZXJfbWV0cmljcyArIDE7 IGkrKykgeworCQlpZ3Rfc3VidGVzdF9mKCJvdGhlci1pbml0LSV1IiwgaSkKKwkJCWluaXRfb3Ro ZXIoaSwgaSA8IG51bV9vdGhlcl9tZXRyaWNzKTsKKworCQlpZ3Rfc3VidGVzdF9mKCJvdGhlci1y ZWFkLSV1IiwgaSkKKwkJCXJlYWRfb3RoZXIoaSwgaSA8IG51bV9vdGhlcl9tZXRyaWNzKTsKKwl9 CisKKwkvKioKKwkgKiBUZXN0IGNvdW50ZXJzIGFyZSBub3QgYWZmZWN0ZWQgYnkgQ1BVIG9mZmxp bmUvb25saW5lIGV2ZW50cy4KKwkgKi8KKwlpZ3Rfc3VidGVzdCgiY3B1LWhvdHBsdWciKQorCQlj cHVfaG90cGx1ZyhmZCk7CisKKwkvKioKKwkgKiBUZXN0IEdQVSBmcmVxdWVuY3kuCisJICovCisJ aWd0X3N1YnRlc3QoImZyZXF1ZW5jeSIpCisJCXRlc3RfZnJlcXVlbmN5KGZkKTsKKworCS8qKgor CSAqIFRlc3QgaW50ZXJydXB0IGNvdW50IHJlcG9ydGluZy4KKwkgKi8KKwlpZ3Rfc3VidGVzdCgi aW50ZXJydXB0cyIpCisJCXRlc3RfaW50ZXJydXB0cyhmZCk7CisKKwkvKioKKwkgKiBUZXN0IFJD NiByZXNpZGVuY3kgcmVwb3J0aW5nLgorCSAqLworCWlndF9zdWJ0ZXN0KCJyYzYiKQorCQl0ZXN0 X3JjNihmZCk7CisKKwkvKioKKwkgKiBUZXN0IFJDNnAgcmVzaWRlbmN5IHJlcG9ydGluZy4KKwkg Ki8KKwlpZ3Rfc3VidGVzdCgicmM2cCIpCisJCXRlc3RfcmM2cChmZCk7CisKKwkvKioKKwkgKiBD aGVjayByZW5kZXIgbm9kZXMgYXJlIGNvdW50ZWQuCisJICovCisJaWd0X3N1YnRlc3RfZ3JvdXAg eworCQlpbnQgcmVuZGVyX2ZkOworCisJCWlndF9maXh0dXJlIHsKKwkJCXJlbmRlcl9mZCA9IGRy bV9vcGVuX2RyaXZlcl9yZW5kZXIoRFJJVkVSX0lOVEVMKTsKKwkJCWlndF9yZXF1aXJlX2dlbShy ZW5kZXJfZmQpOworCisJCQlnZW1fcXVpZXNjZW50X2dwdShmZCk7CisJCX0KKworCQlmb3JfZWFj aF9lbmdpbmVfY2xhc3NfaW5zdGFuY2UoZmQsIGUpIHsKKwkJCWlndF9zdWJ0ZXN0X2YoInJlbmRl ci1ub2RlLWJ1c3ktJXMiLCBlLT5uYW1lKQorCQkJCXNpbmdsZShmZCwgZSwgdHJ1ZSk7CisJCX0K KworCQlpZ3RfZml4dHVyZSB7CisJCQljbG9zZShyZW5kZXJfZmQpOworCQl9CisJfQorfQotLSAK Mi45LjUKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCklu dGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRw czovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=