ZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9LY29uZmlnIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL0tjb25maWcKaW5kZXggOGQyZWJjNy4uM2U2N2UwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL0tjb25maWcKQEAgLTQzMCw2ICs0MzAsMTkgQEAKIAogCSAgTW9zdCBwZW9wbGUgd2lsbCBzYXkgTi4KIAorY29uZmlnIFc4MzY5N0hGX1dEVAorICAgICAgICB0cmlzdGF0ZSAiVzgzNjk3SEYgV2F0Y2hkb2cgVGltZXIiCisgICAgICAgIGRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CisgICAgICAgIC0tLWhlbHAtLS0KKyAgICAgICAgICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBoYXJkd2FyZSB3YXRjaGRvZyBvbiB0aGUgVzgzNjk3SEYgY2hpcHNldAorICAgICAgICAgIFRoaXMgd2F0Y2hkb2cgc2ltcGx5IHdhdGNoZXMgeW91ciBrZXJuZWwgdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3QgZnJlZXplLCAKKyAgICAgICAgICBhbmQgaWYgaXQgZG9lcywgaXQgcmVib290cyB5b3VyIGNvbXB1dGVyIGFmdGVyIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZS4KKworICAgICAgICAgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorICAgICAgICAgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB3ODM2OTdoZl93ZHQuCisKKyAgICAgICAgICBNb3N0IHBlb3BsZSB3aWxsIHNheSBOLgorCiBjb25maWcgVzgzODc3Rl9XRFQKIAl0cmlzdGF0ZSAiVzgzODc3RiAoRU1BQ1MpIFdhdGNoZG9nIFRpbWVyIgogCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvTWFrZWZpbGUKaW5kZXggNjMwNTI2Zi4uZWUzNDc0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9NYWtlZmlsZQpAQCAtNTUsNiArNTUsNyBAQAogb2JqLSQoQ09ORklHX0NQVTVfV0RUKSArPSBjcHU1d2R0Lm8KIG9iai0kKENPTkZJR19TTVNDMzdCNzg3X1dEVCkgKz0gc21zYzM3Yjc4N193ZHQubwogb2JqLSQoQ09ORklHX1c4MzYyN0hGX1dEVCkgKz0gdzgzNjI3aGZfd2R0Lm8KK29iai0kKENPTkZJR19XODM2OTdIRl9XRFQpICs9IHc4MzY5N2hmX3dkdC5vCiBvYmotJChDT05GSUdfVzgzODc3Rl9XRFQpICs9IHc4Mzg3N2Zfd2R0Lm8KIG9iai0kKENPTkZJR19XODM5NzdGX1dEVCkgKz0gdzgzOTc3Zl93ZHQubwogb2JqLSQoQ09ORklHX01BQ0haX1dEVCkgKz0gbWFjaHp3ZC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvdzgzNjk3aGZfd2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvdzgzNjk3aGZfd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY2NjEyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy93ODM2OTdoZl93ZHQuYwpAQCAtMCwwICsxLDM2NyBAQAorLyoKKyAqCXc4MzY5N2hmIFdEVCBkcml2ZXIKKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDYgTWFyY3VzIEp1bmtlciA8anVua2VyQGFuZHVyYXMuZGU+CisgKgorICoJQmFzZWQgb24gdzgzNjI3aGZfd2R0LmMgYWR2YW50ZWNod2R0LmMgd2hpY2ggaXMgYmFzZWQgb24gd2R0LmMuCisgKglPcmlnaW5hbCBjb3B5cmlnaHQgbWVzc2FnZXM6CisgKgorICogICAgIChjKSBDb3B5cmlnaHQgMjAwMyBQ4WRyYWlnIEJyYWR5IDxQQGRyYWlnQnJhZHkuY29tPgorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwMC0yMDAxIE1hcmVrIE1pY2hhbGtpZXdpY3ogPG1hcmVrbUBsaW51eC5vcmcucGw+CisgKgorICoJKGMpIENvcHlyaWdodCAxOTk2IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+LCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoJCQkJaHR0cDovL3d3dy5yZWRoYXQuY29tCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglOZWl0aGVyIE1hcmN1cyBKdW5rZXIgbm9yIEFORFVSQVMgQUcgYWRtaXQgbGlhYmlsaXR5IG5vciBwcm92aWRlCisgKgl3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQKKyAqCSJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2RlZmluZSBXQVRDSERPR19OQU1FICJ3ODM2OTdoZiBXRFQiCisjZGVmaW5lIFBGWCBXQVRDSERPR19OQU1FICI6ICIKKyNkZWZpbmUgV0FUQ0hET0dfVElNRU9VVCA2MAkJLyogNjAgc2VjIGRlZmF1bHQgdGltZW91dCAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3ZHRfaXNfb3BlbjsKK3N0YXRpYyBjaGFyIGV4cGVjdF9jbG9zZTsKKworLyogWW91IG11c3Qgc2V0IHRoaXMgLSB0aGVyZSBpcyBubyBzYW5lIHdheSB0byBwcm9iZSBmb3IgdGhpcyBib2FyZC4gKi8KK3N0YXRpYyBpbnQgd2R0X2lvID0gMHgyRTsKK21vZHVsZV9wYXJhbSh3ZHRfaW8sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHdkdF9pbywgInc4MzY5N2hmIFdEVCBpbyBwb3J0IChkZWZhdWx0IDB4MkUpIik7CisKK3N0YXRpYyBpbnQgdGltZW91dCA9IFdBVENIRE9HX1RJTUVPVVQ7CS8qIGluIHNlY29uZHMgKi8KK21vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0aW1lb3V0LCAiV2F0Y2hkb2cgdGltZW91dCBpbiBzZWNvbmRzLiAxPD0gdGltZW91dCA8PTYzLCBkZWZhdWx0PSIgX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX1RJTUVPVVQpICIuIik7CisKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSBXQVRDSERPR19OT1dBWU9VVDsKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9Q09ORklHX1dBVENIRE9HX05PV0FZT1VUKSIpOworCisvKgorICoJS2VybmVsIG1ldGhvZHMuCisgKi8KKworI2RlZmluZSBXRFRfRUZFUiAod2R0X2lvKzApICAgLyogRXh0ZW5kZWQgRnVuY3Rpb24gRW5hYmxlIFJlZ2lzdGVycyAqLworI2RlZmluZSBXRFRfRUZJUiAod2R0X2lvKzApICAgLyogRXh0ZW5kZWQgRnVuY3Rpb24gSW5kZXggUmVnaXN0ZXIgKHNhbWUgYXMgRUZFUikgKi8KKyNkZWZpbmUgV0RUX0VGRFIgKFdEVF9FRklSKzEpIC8qIEV4dGVuZGVkIEZ1bmN0aW9uIERhdGEgUmVnaXN0ZXIgKi8KKworc3RhdGljIHZvaWQKK3c4MzY5N2hmX3NlbGVjdF93ZF9yZWdpc3Rlcih2b2lkKQoreworCW91dGJfcCgweDg3LCBXRFRfRUZFUik7IC8qIEVudGVyIGV4dGVuZGVkIGZ1bmN0aW9uIG1vZGUgKi8KKwlvdXRiX3AoMHg4NywgV0RUX0VGRVIpOyAvKiBBZ2FpbiBhY2NvcmRpbmcgdG8gbWFudWFsICovCisKKwlvdXRiX3AoMHgyOSwgV0RUX0VGRVIpOyAvKiBzZWxlY3QgQ1IyOSAqLworCW91dGJfcCgweDIwLCBXRFRfRUZEUik7IC8qIHNlbGVjdCBXRFRPICovCisKKwlvdXRiX3AoMHgwNywgV0RUX0VGRVIpOyAvKiBwb2ludCB0byBsb2dpY2FsIGRldmljZSBudW1iZXIgcmVnICovCisJb3V0Yl9wKDB4MDgsIFdEVF9FRkRSKTsgLyogc2VsZWN0IGxvZ2ljYWwgZGV2aWNlIDggKEdQSU8yKSAqLworCW91dGJfcCgweDMwLCBXRFRfRUZFUik7IC8qIHNlbGVjdCBDUjMwICovCisJb3V0Yl9wKDB4MDEsIFdEVF9FRkRSKTsgLyogc2V0IGJpdCAwIHRvIGFjdGl2YXRlIEdQSU8yICovCit9CisKK3N0YXRpYyB2b2lkCit3ODM2OTdoZl91bnNlbGVjdF93ZF9yZWdpc3Rlcih2b2lkKQoreworCW91dGJfcCgweEFBLCBXRFRfRUZFUik7IC8qIExlYXZlIGV4dGVuZGVkIGZ1bmN0aW9uIG1vZGUgKi8KK30KKworLyogdHlhbiBtb3RoZXJib2FyZHMgc2VlbSB0byBzZXQgRjUgdG8gMHg0QyA/CisgKiBTbyBleHBsaWNpdGx5IGluaXQgdG8gYXBwcm9wcmlhdGUgdmFsdWUuICovCitzdGF0aWMgdm9pZAordzgzNjk3aGZfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgdDsKKworCXc4MzY5N2hmX3NlbGVjdF93ZF9yZWdpc3RlcigpOworCisJb3V0Yl9wKDB4RjMsIFdEVF9FRkVSKTsgLyogU2VsZWN0IENSRjMgKi8KKworCXQ9aW5iX3AoV0RUX0VGRFIpOyAgICAgIC8qIHJlYWQgQ1JGNiAqLworCWlmICh0ICE9IDApIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJXYXRjaGRvZyBhbHJlYWR5IHJ1bm5pbmcuIFJlc2V0dGluZyB0aW1lb3V0IHRvICVkIHNlY1xuIiwgdGltZW91dCk7CisJCW91dGJfcCh0aW1lb3V0LCBXRFRfRUZEUik7ICAgIC8qIFdyaXRlIGJhY2sgdG8gQ1JGNiAqLworCX0KKwlvdXRiX3AoMHhGNCwgV0RUX0VGRVIpOyAvKiBTZWxlY3QgQ1JGNCAqLworCXQ9aW5iX3AoV0RUX0VGRFIpOyAgICAgIC8qIHJlYWQgQ1JGNCAqLworCXQmPX4weDBDOyAgICAgICAgICAgICAgIC8qIHNldCBzZWNvbmQgbW9kZSAmIGRpc2FibGUga2V5Ym9hcmQgdHVybmluZyBvZmYgd2F0Y2hkb2cgKi8KKwlvdXRiX3AodCwgV0RUX0VGRFIpOyAgICAvKiBXcml0ZSBiYWNrIHRvIENSRjUgKi8KKworCXc4MzY5N2hmX3Vuc2VsZWN0X3dkX3JlZ2lzdGVyKCk7Cit9CisKK3N0YXRpYyB2b2lkCit3ZHRfY3RybChpbnQgdGltZW91dCkKK3sKKwl3ODM2OTdoZl9zZWxlY3Rfd2RfcmVnaXN0ZXIoKTsKKworCW91dGJfcCgweEY0LCBXRFRfRUZFUik7ICAgIC8qIFNlbGVjdCBDUkY0ICovCisJb3V0Yl9wKHRpbWVvdXQsIFdEVF9FRkRSKTsgLyogV3JpdGUgVGltZW91dCBjb3VudGVyIHRvIENSRjQgKi8KKworCXc4MzY5N2hmX3Vuc2VsZWN0X3dkX3JlZ2lzdGVyKCk7Cit9CisKK3N0YXRpYyBpbnQKK3dkdF9waW5nKHZvaWQpCit7CisJd2R0X2N0cmwodGltZW91dCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3dkdF9kaXNhYmxlKHZvaWQpCit7CisJd2R0X2N0cmwoMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3dkdF9zZXRfaGVhcnRiZWF0KGludCB0KQoreworCWlmICgodCA8IDEpIHx8ICh0ID4gNjMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRpbWVvdXQgPSB0OworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAord2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpZiAoY291bnQpIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCWV4cGVjdF9jbG9zZSA9IDA7CisKKwkJCWZvciAoaSA9IDA7IGkgIT0gY291bnQ7IGkrKykgeworCQkJCWNoYXIgYzsKKwkJCQlpZiAoZ2V0X3VzZXIoYywgYnVmK2kpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCWV4cGVjdF9jbG9zZSA9IDQyOworCQkJfQorCQl9CisJCXdkdF9waW5nKCk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludAord2R0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCSAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisJaW50IG5ld190aW1lb3V0OworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8IFdESU9GX01BR0lDQ0xPU0UsCisJCS5maXJtd2FyZV92ZXJzaW9uID0gMSwKKwkJLmlkZW50aXR5ID0gIlc4MzY5N0hGIFdEVCIsCisJfTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCSAgaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpKQorCSAgICByZXR1cm4gLUVGQVVMVDsKKwkgIGJyZWFrOworCisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCSAgcmV0dXJuIHB1dF91c2VyKDAsIHApOworCisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJICB3ZHRfcGluZygpOworCSAgYnJlYWs7CisKKwljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJICBpZiAoZ2V0X3VzZXIobmV3X3RpbWVvdXQsIHApKQorCQkgIHJldHVybiAtRUZBVUxUOworCSAgaWYgKHdkdF9zZXRfaGVhcnRiZWF0KG5ld190aW1lb3V0KSkKKwkJICByZXR1cm4gLUVJTlZBTDsKKwkgIHdkdF9waW5nKCk7CisJICAvKiBGYWxsICovCisKKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJICByZXR1cm4gcHV0X3VzZXIodGltZW91dCwgcCk7CisKKwljYXNlIFdESU9DX1NFVE9QVElPTlM6CisJeworCSAgaW50IG9wdGlvbnMsIHJldHZhbCA9IC1FSU5WQUw7CisKKwkgIGlmIChnZXRfdXNlcihvcHRpb25zLCBwKSkKKwkgICAgcmV0dXJuIC1FRkFVTFQ7CisKKwkgIGlmIChvcHRpb25zICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKKwkgICAgd2R0X2Rpc2FibGUoKTsKKwkgICAgcmV0dmFsID0gMDsKKwkgIH0KKworCSAgaWYgKG9wdGlvbnMgJiBXRElPU19FTkFCTEVDQVJEKSB7CisJICAgIHdkdF9waW5nKCk7CisJICAgIHJldHZhbCA9IDA7CisJICB9CisKKwkgIHJldHVybiByZXR2YWw7CisJfQorCisJZGVmYXVsdDoKKwkgIHJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit3ZHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmd2R0X2lzX29wZW4pKQorCQlyZXR1cm4gLUVCVVNZOworCS8qCisJICoJQWN0aXZhdGUKKwkgKi8KKworCXdkdF9waW5nKCk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50Cit3ZHRfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGV4cGVjdF9jbG9zZSA9PSA0MikgeworCQl3ZHRfZGlzYWJsZSgpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0NSSVQgUEZYICJVbmV4cGVjdGVkIGNsb3NlLCBub3Qgc3RvcHBpbmcgd2F0Y2hkb2chXG4iKTsKKwkJd2R0X3BpbmcoKTsKKwl9CisJZXhwZWN0X2Nsb3NlID0gMDsKKwljbGVhcl9iaXQoMCwgJndkdF9pc19vcGVuKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCU5vdGlmaWVyIGZvciBzeXN0ZW0gZG93bgorICovCisKK3N0YXRpYyBpbnQKK3dkdF9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLAorCXZvaWQgKnVudXNlZCkKK3sKKwlpZiAoY29kZSA9PSBTWVNfRE9XTiB8fCBjb2RlID09IFNZU19IQUxUKSB7CisJCS8qIFR1cm4gdGhlIFdEVCBvZmYgKi8KKwkJd2R0X2Rpc2FibGUoKTsKKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKgorICoJS2VybmVsIEludGVyZmFjZXMKKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3ZHRfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLndyaXRlCQk9IHdkdF93cml0ZSwKKwkuaW9jdGwJCT0gd2R0X2lvY3RsLAorCS5vcGVuCQk9IHdkdF9vcGVuLAorCS5yZWxlYXNlCT0gd2R0X2Nsb3NlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHdkdF9taXNjZGV2ID0geworCS5taW5vciA9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lID0gIndhdGNoZG9nIiwKKwkuZm9wcyA9ICZ3ZHRfZm9wcywKK307CisKKy8qCisgKglUaGUgV0RUIG5lZWRzIHRvIGxlYXJuIGFib3V0IHNvZnQgc2h1dGRvd25zIGluIG9yZGVyIHRvCisgKgl0dXJuIHRoZSB0aW1lYm9tYiByZWdpc3RlcnMgb2ZmLgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgd2R0X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gd2R0X25vdGlmeV9zeXMsCit9OworCitzdGF0aWMgaW50IF9faW5pdAord2R0X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcHJpbnRrKEtFUk5fSU5GTyAiV0RUIGRyaXZlciBmb3IgdGhlIFdpbmJvbmQoVE0pIFc4MzY5N0hGIFN1cGVyIEkvTyBjaGlwIGluaXRpYWxpc2luZy5cbiIpOworCisJaWYgKHdkdF9zZXRfaGVhcnRiZWF0KHRpbWVvdXQpKSB7CisJCXdkdF9zZXRfaGVhcnRiZWF0KFdBVENIRE9HX1RJTUVPVVQpOworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggInRpbWVvdXQgdmFsdWUgbXVzdCBiZSAxPD10aW1lb3V0PD02MywgdXNpbmcgJWRcbiIsCisJCQlXQVRDSERPR19USU1FT1VUKTsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHdkdF9pbywgMSwgV0FUQ0hET0dfTkFNRSkpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIkkvTyBhZGRyZXNzIDB4JTA0eCBhbHJlYWR5IGluIHVzZVxuIiwKKwkJCXdkdF9pbyk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCXc4MzY5N2hmX2luaXQoKTsKKworCXJldCA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciByZWJvb3Qgbm90aWZpZXIgKGVycj0lZClcbiIsCisJCQlyZXQpOworCQlnb3RvIHVucmVnX3JlZ2lvbnM7CisJfQorCisJcmV0ID0gbWlzY19yZWdpc3Rlcigmd2R0X21pc2NkZXYpOworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCisJCQlXQVRDSERPR19NSU5PUiwgcmV0KTsKKwkJZ290byB1bnJlZ19yZWJvb3Q7CisJfQorCisJcHJpbnRrIChLRVJOX0lORk8gUEZYICJpbml0aWFsaXplZC4gdGltZW91dD0lZCBzZWMgKG5vd2F5b3V0PSVkKVxuIiwKKwkJdGltZW91dCwgbm93YXlvdXQpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK3VucmVnX3JlYm9vdDoKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKK3VucmVnX3JlZ2lvbnM6CisJcmVsZWFzZV9yZWdpb24od2R0X2lvLCAxKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHZvaWQgX19leGl0Cit3ZHRfZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3Rlcigmd2R0X21pc2NkZXYpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOworCXJlbGVhc2VfcmVnaW9uKHdkdF9pbywxKTsKK30KKworbW9kdWxlX2luaXQod2R0X2luaXQpOworbW9kdWxlX2V4aXQod2R0X2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJNYXJjdXMgSnVua2VyIDxqdW5rZXJAYW5kdXJhcy5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigidzgzNjk3aGYgV0RUIGRyaXZlciIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwo=