ZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MWUwZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlCkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKK0VYVFJBX0FGTEFHUwk6PSAtdHJhZGl0aW9uYWwKKworb2JqLXkJOj0gIGJpdG1hcC5vIHRyYXBzLm8gdGltZS5vIHByb2Nlc3MubyBcCisgICAgICAgICAgICBzZXR1cC5vIHN5c19zMzkwLm8gcHRyYWNlLm8gc2lnbmFsLm8gY3BjbWQubyBlYmNkaWMubyBcCisgICAgICAgICAgICBzZW1hcGhvcmUubyBzMzkwX2V4dC5vIGRlYnVnLm8gcHJvZmlsZS5vIGlycS5vCisKK2V4dHJhLSQoQ09ORklHX0FSQ0hfUzM5MF8zMSkJKz0gaGVhZC5vIAorZXh0cmEtJChDT05GSUdfQVJDSF9TMzkwWCkJKz0gaGVhZDY0Lm8gCitleHRyYS15CQkJCSs9IGluaXRfdGFzay5vIHZtbGludXgubGRzCisKK29iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gczM5MF9rc3ltcy5vIG1vZHVsZS5vCitvYmotJChDT05GSUdfU01QKQkJKz0gc21wLm8KKworb2JqLSQoQ09ORklHX1MzOTBfU1VQUE9SVCkJKz0gY29tcGF0X2xpbnV4Lm8gY29tcGF0X3NpZ25hbC5vIFwKKwkJCQkJY29tcGF0X2lvY3RsLm8gY29tcGF0X3dyYXBwZXIubyBcCisJCQkJCWNvbXBhdF9leGVjX2RvbWFpbi5vCitvYmotJChDT05GSUdfQklORk1UX0VMRjMyKQkrPSBiaW5mbXRfZWxmMzIubworCitvYmotJChDT05GSUdfQVJDSF9TMzkwXzMxKQkrPSBlbnRyeS5vIHJlaXBsLm8KK29iai0kKENPTkZJR19BUkNIX1MzOTBYKQkrPSBlbnRyeTY0Lm8gcmVpcGw2NC5vCisKK29iai0kKENPTkZJR19WSVJUX1RJTUVSKQkrPSB2dGltZS5vCisKKyMKKyMgVGhpcyBpcyBqdXN0IHRvIGdldCB0aGUgZGVwZW5kZW5jaWVzLi4uCisjCitiaW5mbXRfZWxmMzIubzoJJChUT1BESVIpL2ZzL2JpbmZtdF9lbGYuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9zMzkwL2tlcm5lbC9hc20tb2Zmc2V0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNzAxOGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIEdlbmVyYXRlIGRlZmluaXRpb25zIG5lZWRlZCBieSBhc3NlbWJseSBsYW5ndWFnZSBtb2R1bGVzLgorICogVGhpcyBjb2RlIGdlbmVyYXRlcyByYXcgYXNtIG91dHB1dCB3aGljaCBpcyBwb3N0LXByb2Nlc3NlZCB0byBleHRyYWN0CisgKiBhbmQgZm9ybWF0IHRoZSByZXF1aXJlZCBkYXRhLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisvKiBVc2UgbWFya2VyIGlmIHlvdSBuZWVkIHRvIHNlcGFyYXRlIHRoZSB2YWx1ZXMgbGF0ZXIgKi8KKworI2RlZmluZSBERUZJTkUoc3ltLCB2YWwsIG1hcmtlcikgXAorCWFzbSB2b2xhdGlsZSgiXG4tPiIgI3N5bSAiICUwICIgI3ZhbCAiICIgI21hcmtlciA6IDogImkiICh2YWwpKQorCisjZGVmaW5lIEJMQU5LKCkgYXNtIHZvbGF0aWxlKCJcbi0+IiA6IDogKQorCitpbnQgbWFpbih2b2lkKQoreworCURFRklORShfX1RIUkVBRF9pbmZvLCBvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRocmVhZF9pbmZvKSwpOworCURFRklORShfX1RIUkVBRF9rc3AsIG9mZnNldG9mKHN0cnVjdCB0YXNrX3N0cnVjdCwgdGhyZWFkLmtzcCksKTsKKwlERUZJTkUoX19USFJFQURfcGVyLCBvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRocmVhZC5wZXJfaW5mbyksKTsKKwlERUZJTkUoX19USFJFQURfbW1fc2VnbWVudCwKKwkgICAgICAgb2Zmc2V0b2Yoc3RydWN0IHRhc2tfc3RydWN0LCB0aHJlYWQubW1fc2VnbWVudCksKTsKKwlCTEFOSygpOworCURFRklORShfX1RBU0tfcGlkLCBvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIHBpZCksKTsKKwlCTEFOSygpOworCURFRklORShfX1BFUl9hdG1pZCwgb2Zmc2V0b2YocGVyX3N0cnVjdCwgbG93Y29yZS53b3Jkcy5wZXJjX2F0bWlkKSwpOworCURFRklORShfX1BFUl9hZGRyZXNzLCBvZmZzZXRvZihwZXJfc3RydWN0LCBsb3djb3JlLndvcmRzLmFkZHJlc3MpLCk7CisJREVGSU5FKF9fUEVSX2FjY2Vzc19pZCwgb2Zmc2V0b2YocGVyX3N0cnVjdCwgbG93Y29yZS53b3Jkcy5hY2Nlc3NfaWQpLCk7CisJQkxBTksoKTsKKwlERUZJTkUoX19USV90YXNrLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIHRhc2spLCk7CisJREVGSU5FKF9fVElfZG9tYWluLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIGV4ZWNfZG9tYWluKSwpOworCURFRklORShfX1RJX2ZsYWdzLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIGZsYWdzKSwpOworCURFRklORShfX1RJX2NwdSwgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBjcHUpLCk7CisJREVGSU5FKF9fVElfcHJlY291bnQsIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgcHJlZW1wdF9jb3VudCksKTsKKwlCTEFOSygpOworCURFRklORShfX1BUX0FSR1MsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBhcmdzKSwpOworCURFRklORShfX1BUX1BTVywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHBzdyksKTsKKwlERUZJTkUoX19QVF9HUFJTLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgZ3BycyksKTsKKwlERUZJTkUoX19QVF9PUklHX0dQUjIsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBvcmlnX2dwcjIpLCk7CisJREVGSU5FKF9fUFRfSUxDLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgaWxjKSwpOworCURFRklORShfX1BUX1RSQVAsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCB0cmFwKSwpOworCURFRklORShfX1BUX1NJWkUsIHNpemVvZihzdHJ1Y3QgcHRfcmVncyksKTsKKwlCTEFOSygpOworCURFRklORShfX1NGX0JBQ0tDSEFJTiwgb2Zmc2V0b2Yoc3RydWN0IHN0YWNrX2ZyYW1lLCBiYWNrX2NoYWluKSwpOworCURFRklORShfX1NGX0dQUlMsIG9mZnNldG9mKHN0cnVjdCBzdGFja19mcmFtZSwgZ3BycyksKTsKKwlERUZJTkUoX19TRl9FTVBUWSwgb2Zmc2V0b2Yoc3RydWN0IHN0YWNrX2ZyYW1lLCBlbXB0eTEpLCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2JpbmZtdF9lbGYzMi5jIGIvYXJjaC9zMzkwL2tlcm5lbC9iaW5mbXRfZWxmMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2JhNTg5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9iaW5mbXRfZWxmMzIuYwpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIFN1cHBvcnQgZm9yIDMyLWJpdCBMaW51eCBmb3IgUzM5MCBFTEYgYmluYXJpZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCBJQk0gQ29ycG9yYXRpb24KKyAqIEF1dGhvcihzKTogR2VyaGFyZCBUb25uICh0b25AZGUuaWJtLmNvbSkKKyAqCisgKiBIZWF2aWx5IGluc3BpcmVkIGJ5IHRoZSAzMi1iaXQgU3BhcmMgY29tcGF0IGNvZGUgd2hpY2ggaXMKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggSmFrdWIgSmVsaW5layAgIChqakB1bHRyYS5saW51eC5jeikKKyAqLworCisjZGVmaW5lIF9fQVNNUzM5MF9FTEZfSAorCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCisvKgorICogVGhlc2UgYXJlIHVzZWQgdG8gc2V0IHBhcmFtZXRlcnMgaW4gdGhlIGNvcmUgZHVtcHMuCisgKi8KKyNkZWZpbmUgRUxGX0NMQVNTCUVMRkNMQVNTMzIKKyNkZWZpbmUgRUxGX0RBVEEJRUxGREFUQTJNU0IKKyNkZWZpbmUgRUxGX0FSQ0gJRU1fUzM5MAorCisvKgorICogVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB3ZSBkb24ndCBsb2FkIHNvbWV0aGluZyBmb3IgdGhlIHdyb25nIGFyY2hpdGVjdHVyZS4KKyAqLworI2RlZmluZSBlbGZfY2hlY2tfYXJjaCh4KSBcCisJKCgoeCktPmVfbWFjaGluZSA9PSBFTV9TMzkwIHx8ICh4KS0+ZV9tYWNoaW5lID09IEVNX1MzOTBfT0xEKSBcCisgICAgICAgICAmJiAoeCktPmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRl9DTEFTUykKKworLyogRUxGIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIE5VTV9HUFJTICAgICAgMTYKKyNkZWZpbmUgTlVNX0ZQUlMgICAgICAxNgorI2RlZmluZSBOVU1fQUNSUyAgICAgIDE2ICAgIAorCisvKiBGb3IgU1ZSNC9TMzkwIHRoZSBmdW5jdGlvbiBwb2ludGVyIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBgYXRleGl0YCBpcworICAgcGFzc2VkIGluIFIxNC4gKi8KKyNkZWZpbmUgRUxGX1BMQVRfSU5JVChfciwgbG9hZF9hZGRyKSBcCisJZG8geyBcCisJCV9yLT5ncHJzWzE0XSA9IDA7IFwKKwl9IHdoaWxlKDApCisKKyNkZWZpbmUgVVNFX0VMRl9DT1JFX0RVTVAKKyNkZWZpbmUgRUxGX0VYRUNfUEFHRVNJWkUgICAgICAgNDA5NgorCisvKiBUaGlzIGlzIHRoZSBsb2NhdGlvbiB0aGF0IGFuIEVUX0RZTiBwcm9ncmFtIGlzIGxvYWRlZCBpZiBleGVjJ2VkLiAgVHlwaWNhbAorICAgdXNlIG9mIHRoaXMgaXMgdG8gaW52b2tlICIuL2xkLnNvIHNvbWVwcm9nIiB0byB0ZXN0IG91dCBhIG5ldyB2ZXJzaW9uIG9mCisgICB0aGUgbG9hZGVyLiAgV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBvdXQgb2YgdGhlIHdheSBvZiB0aGUgcHJvZ3JhbQorICAgdGhhdCBpdCB3aWxsICJleGVjIiwgYW5kIHRoYXQgdGhlcmUgaXMgc3VmZmljaWVudCByb29tIGZvciB0aGUgYnJrLiAgKi8KKworI2RlZmluZSBFTEZfRVRfRFlOX0JBU0UgICAgICAgICAoVEFTS19TSVpFIC8gMyAqIDIpCisKKy8qIFdvdywgdGhlICJtYWluIiBhcmNoIG5lZWRzIGFyY2ggZGVwZW5kZW50IGZ1bmN0aW9ucyB0b28uLiA6KSAqLworCisvKiByZWdzIGlzIHN0cnVjdCBwdF9yZWdzLCBwcl9yZWcgaXMgZWxmX2dyZWdzZXRfdCAod2hpY2ggaXMKKyAgIG5vdyBzdHJ1Y3RfdXNlcl9yZWdzLCB0aGV5IGFyZSBkaWZmZXJlbnQpICovCisKKyNkZWZpbmUgRUxGX0NPUkVfQ09QWV9SRUdTKHByX3JlZywgcmVncykgZHVtcF9yZWdzMzIocmVncywgJnByX3JlZyk7CisKKyNkZWZpbmUgRUxGX0NPUkVfQ09QWV9UQVNLX1JFR1ModHNrLCByZWdzKSBkdW1wX3Rhc2tfcmVnczMyKHRzaywgcmVncykKKworI2RlZmluZSBFTEZfQ09SRV9DT1BZX0ZQUkVHUyh0c2ssIGZwcmVncykgZHVtcF90YXNrX2ZwdSh0c2ssIGZwcmVncykKKworLyogVGhpcyB5aWVsZHMgYSBtYXNrIHRoYXQgdXNlciBwcm9ncmFtcyBjYW4gdXNlIHRvIGZpZ3VyZSBvdXQgd2hhdAorICAgaW5zdHJ1Y3Rpb24gc2V0IHRoaXMgQ1BVIHN1cHBvcnRzLiAqLworCisjZGVmaW5lIEVMRl9IV0NBUCAoMCkKKworLyogVGhpcyB5aWVsZHMgYSBzdHJpbmcgdGhhdCBsZC5zbyB3aWxsIHVzZSB0byBsb2FkIGltcGxlbWVudGF0aW9uCisgICBzcGVjaWZpYyBsaWJyYXJpZXMgZm9yIG9wdGltaXphdGlvbi4gIFRoaXMgaXMgbW9yZSBzcGVjaWZpYyBpbgorICAgaW50ZW50IHRoYW4gcG9raW5nIGF0IHVuYW1lIG9yIC9wcm9jL2NwdWluZm8uCisKKyAgIEZvciB0aGUgbW9tZW50LCB3ZSBoYXZlIG9ubHkgb3B0aW1pemF0aW9ucyBmb3IgdGhlIEludGVsIGdlbmVyYXRpb25zLAorICAgYnV0IHRoYXQgY291bGQgY2hhbmdlLi4uICovCisKKyNkZWZpbmUgRUxGX1BMQVRGT1JNIChOVUxMKQorCisjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCwgaWJjczIpCQkJXAorZG8gewkJCQkJCQlcCisJaWYgKGliY3MyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlzZXRfcGVyc29uYWxpdHkoUEVSX1NWUjQpOyAgICAgICAgICAgICAgXAorCWVsc2UgaWYgKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICE9IFBFUl9MSU5VWDMyKSAgIFwKKwkJc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWCk7ICAgICAgICAgICAgIFwKKwlzZXRfdGhyZWFkX2ZsYWcoVElGXzMxQklUKTsJCQlcCit9IHdoaWxlICgwKQorCisjaW5jbHVkZSAiY29tcGF0X2xpbnV4LmgiCisKK3R5cGVkZWYgX3MzOTBfZnBfcmVnczMyIGVsZl9mcHJlZ3NldF90OworCit0eXBlZGVmIHN0cnVjdAoreworCQorCV9wc3dfdDMyCXBzdzsKKwlfX3UzMgkJZ3Byc1tfX05VTV9HUFJTXTsgCisJX191MzIJCWFjcnNbX19OVU1fQUNSU107IAorCV9fdTMyCQlvcmlnX2dwcjI7Cit9IHMzOTBfcmVnczMyOwordHlwZWRlZiBzMzkwX3JlZ3MzMiBlbGZfZ3JlZ3NldF90OworCitzdGF0aWMgaW5saW5lIGludCBkdW1wX3JlZ3MzMihzdHJ1Y3QgcHRfcmVncyAqcHRyZWdzLCBlbGZfZ3JlZ3NldF90ICpyZWdzKQoreworCWludCBpOworCisJbWVtY3B5KCZyZWdzLT5wc3cubWFzaywgJnB0cmVncy0+cHN3Lm1hc2ssIDQpOworCW1lbWNweSgmcmVncy0+cHN3LmFkZHIsIChjaGFyICopJnB0cmVncy0+cHN3LmFkZHIgKyA0LCA0KTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0dQUlM7IGkrKykKKwkJcmVncy0+Z3Byc1tpXSA9IHB0cmVncy0+Z3Byc1tpXTsKKwlzYXZlX2FjY2Vzc19yZWdzKHJlZ3MtPmFjcnMpOworCXJlZ3MtPm9yaWdfZ3ByMiA9IHB0cmVncy0+b3JpZ19ncHIyOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBkdW1wX3Rhc2tfcmVnczMyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBlbGZfZ3JlZ3NldF90ICpyZWdzKQoreworCXN0cnVjdCBwdF9yZWdzICpwdHJlZ3MgPSBfX0tTVEtfUFRSRUdTKHRzayk7CisJaW50IGk7CisKKwltZW1jcHkoJnJlZ3MtPnBzdy5tYXNrLCAmcHRyZWdzLT5wc3cubWFzaywgNCk7CisJbWVtY3B5KCZyZWdzLT5wc3cuYWRkciwgKGNoYXIgKikmcHRyZWdzLT5wc3cuYWRkciArIDQsIDQpOworCWZvciAoaSA9IDA7IGkgPCBOVU1fR1BSUzsgaSsrKQorCQlyZWdzLT5ncHJzW2ldID0gcHRyZWdzLT5ncHJzW2ldOworCW1lbWNweShyZWdzLT5hY3JzLCB0c2stPnRocmVhZC5hY3JzLCBzaXplb2YocmVncy0+YWNycykpOworCXJlZ3MtPm9yaWdfZ3ByMiA9IHB0cmVncy0+b3JpZ19ncHIyOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBkdW1wX3Rhc2tfZnB1KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBlbGZfZnByZWdzZXRfdCAqZnByZWdzKQoreworCWlmICh0c2sgPT0gY3VycmVudCkKKwkJc2F2ZV9mcF9yZWdzKChzMzkwX2ZwX3JlZ3MgKikgZnByZWdzKTsKKwllbHNlCisJCW1lbWNweShmcHJlZ3MsICZ0c2stPnRocmVhZC5mcF9yZWdzLCBzaXplb2YoZWxmX2ZwcmVnc2V0X3QpKTsKKwlyZXR1cm4gMTsKK30KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGZjb3JlLmg+CisjaW5jbHVkZSA8bGludXgvYmluZm10cy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorCisjZGVmaW5lIGVsZl9wcnN0YXR1cyBlbGZfcHJzdGF0dXMzMgorc3RydWN0IGVsZl9wcnN0YXR1czMyCit7CisJc3RydWN0IGVsZl9zaWdpbmZvIHByX2luZm87CS8qIEluZm8gYXNzb2NpYXRlZCB3aXRoIHNpZ25hbCAqLworCXNob3J0CXByX2N1cnNpZzsJCS8qIEN1cnJlbnQgc2lnbmFsICovCisJdTMyCXByX3NpZ3BlbmQ7CS8qIFNldCBvZiBwZW5kaW5nIHNpZ25hbHMgKi8KKwl1MzIJcHJfc2lnaG9sZDsJLyogU2V0IG9mIGhlbGQgc2lnbmFscyAqLworCXBpZF90CXByX3BpZDsKKwlwaWRfdAlwcl9wcGlkOworCXBpZF90CXByX3BncnA7CisJcGlkX3QJcHJfc2lkOworCXN0cnVjdCBjb21wYXRfdGltZXZhbCBwcl91dGltZTsJLyogVXNlciB0aW1lICovCisJc3RydWN0IGNvbXBhdF90aW1ldmFsIHByX3N0aW1lOwkvKiBTeXN0ZW0gdGltZSAqLworCXN0cnVjdCBjb21wYXRfdGltZXZhbCBwcl9jdXRpbWU7CS8qIEN1bXVsYXRpdmUgdXNlciB0aW1lICovCisJc3RydWN0IGNvbXBhdF90aW1ldmFsIHByX2NzdGltZTsJLyogQ3VtdWxhdGl2ZSBzeXN0ZW0gdGltZSAqLworCWVsZl9ncmVnc2V0X3QgcHJfcmVnOwkvKiBHUCByZWdpc3RlcnMgKi8KKwlpbnQgcHJfZnB2YWxpZDsJCS8qIFRydWUgaWYgbWF0aCBjby1wcm9jZXNzb3IgYmVpbmcgdXNlZC4gICovCit9OworCisjZGVmaW5lIGVsZl9wcnBzaW5mbyBlbGZfcHJwc2luZm8zMgorc3RydWN0IGVsZl9wcnBzaW5mbzMyCit7CisJY2hhcglwcl9zdGF0ZTsJLyogbnVtZXJpYyBwcm9jZXNzIHN0YXRlICovCisJY2hhcglwcl9zbmFtZTsJLyogY2hhciBmb3IgcHJfc3RhdGUgKi8KKwljaGFyCXByX3pvbWI7CS8qIHpvbWJpZSAqLworCWNoYXIJcHJfbmljZTsJLyogbmljZSB2YWwgKi8KKwl1MzIJcHJfZmxhZzsJLyogZmxhZ3MgKi8KKwl1MTYJcHJfdWlkOworCXUxNglwcl9naWQ7CisJcGlkX3QJcHJfcGlkLCBwcl9wcGlkLCBwcl9wZ3JwLCBwcl9zaWQ7CisJLyogTG90cyBtaXNzaW5nICovCisJY2hhcglwcl9mbmFtZVsxNl07CS8qIGZpbGVuYW1lIG9mIGV4ZWN1dGFibGUgKi8KKwljaGFyCXByX3BzYXJnc1tFTEZfUFJBUkdTWl07CS8qIGluaXRpYWwgcGFydCBvZiBhcmcgbGlzdCAqLworfTsKKworI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KKworI3VuZGVmIE5FV19UT19PTERfVUlECisjdW5kZWYgTkVXX1RPX09MRF9HSUQKKyNkZWZpbmUgTkVXX1RPX09MRF9VSUQodWlkKSAoKHVpZCkgPiA2NTUzNSkgPyAodTE2KW92ZXJmbG93dWlkIDogKHUxNikodWlkKQorI2RlZmluZSBORVdfVE9fT0xEX0dJRChnaWQpICgoZ2lkKSA+IDY1NTM1KSA/ICh1MTYpb3ZlcmZsb3dnaWQgOiAodTE2KShnaWQpIAorCisjZGVmaW5lIGVsZl9hZGRyX3QJdTMyCisvKgorI2RlZmluZSBpbml0X2VsZl9iaW5mbXQgaW5pdF9lbGYzMl9iaW5mbXQKKyovCisKKyN1bmRlZiBzdGFydF90aHJlYWQKKyNkZWZpbmUgc3RhcnRfdGhyZWFkICAgICAgICAgICAgICAgICAgICBzdGFydF90aHJlYWQzMSAKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJCaW5hcnkgZm9ybWF0IGxvYWRlciBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIDMyYml0IExpbnV4IGZvciBTMzkwIGJpbmFyaWVzLCIKKyAgICAgICAgICAgICAgICAgICAiIENvcHlyaWdodCAyMDAwIElCTSBDb3Jwb3JhdGlvbiIpOyAKK01PRFVMRV9BVVRIT1IoIkdlcmhhcmQgVG9ubiA8dG9uQGRlLmlibS5jb20+Iik7CisKKyN1bmRlZiBNT0RVTEVfREVTQ1JJUFRJT04KKyN1bmRlZiBNT0RVTEVfQVVUSE9SCisKKyN1bmRlZiBjcHV0aW1lX3RvX3RpbWV2YWwKKyNkZWZpbmUgY3B1dGltZV90b190aW1ldmFsIGNwdXRpbWVfdG9fY29tcGF0X3RpbWV2YWwKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQKK2NwdXRpbWVfdG9fY29tcGF0X3RpbWV2YWwoY29uc3QgY3B1dGltZV90IGNwdXRpbWUsIHN0cnVjdCBjb21wYXRfdGltZXZhbCAqdmFsdWUpCit7CisJdmFsdWUtPnR2X3VzZWMgPSBjcHV0aW1lICUgMTAwMDAwMDsKKwl2YWx1ZS0+dHZfc2VjID0gY3B1dGltZSAvIDEwMDAwMDA7Cit9CisKKyNpbmNsdWRlICIuLi8uLi8uLi9mcy9iaW5mbXRfZWxmLmMiCisKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvYml0bWFwLlMgYi9hcmNoL3MzOTAva2VybmVsL2JpdG1hcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYjQxZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL2JpdG1hcC5TCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiAgYXJjaC9zMzkwL2tlcm5lbC9iaXRtYXAuUworICogICAgQml0bWFwcyBmb3Igc2V0X2JpdCwgY2xlYXJfYml0LCB0ZXN0X2FuZF9zZXRfYml0LCAuLi4KKyAqICAgIFNlZSBpbmNsdWRlL2FzbS1zMzkwL3tiaXRvcHMuaHxwb3NpeF90eXBlcy5ofSBmb3IgZGV0YWlscworICoKKyAqICBTMzkwIHZlcnNpb24KKyAqICAgIENvcHlyaWdodCAoQykgMTk5OSBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwgSUJNIENvcnBvcmF0aW9uCisgKiAgICBBdXRob3Iocyk6IE1hcnRpbiBTY2h3aWRlZnNreSAoc2Nod2lkZWZza3lAZGUuaWJtLmNvbSksCisgKi8KKworICAgICAgICAgLmdsb2JsIF9vaV9iaXRtYXAKK19vaV9iaXRtYXA6CisgICAgICAgICAuYnl0ZSAgMHgwMSwweDAyLDB4MDQsMHgwOCwweDEwLDB4MjAsMHg0MCwweDgwCisKKyAgICAgICAgIC5nbG9ibCBfbmlfYml0bWFwCitfbmlfYml0bWFwOgorICAgICAgICAgLmJ5dGUgIDB4RkUsMHhGRCwweEZCLDB4RjcsMHhFRiwweERGLDB4QkYsMHg3RgorCisgICAgICAgICAuZ2xvYmwgX3piX2ZpbmRtYXAKK196Yl9maW5kbWFwOgorICAgICAgICAgLmJ5dGUgIDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQKKyAgICAgICAgIC5ieXRlICAwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw1CisgICAgICAgICAuYnl0ZSAgMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCAKKyAgICAgICAgIC5ieXRlICAwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw2CisgICAgICAgICAuYnl0ZSAgMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNAorICAgICAgICAgLmJ5dGUgIDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDUKKyAgICAgICAgIC5ieXRlICAwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw0CisgICAgICAgICAuYnl0ZSAgMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNworICAgICAgICAgLmJ5dGUgIDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQKKyAgICAgICAgIC5ieXRlICAwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw1CisgICAgICAgICAuYnl0ZSAgMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNAorICAgICAgICAgLmJ5dGUgIDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDYKKyAgICAgICAgIC5ieXRlICAwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw0CisgICAgICAgICAuYnl0ZSAgMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNQorICAgICAgICAgLmJ5dGUgIDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQKKyAgICAgICAgIC5ieXRlICAwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw4CisKKyAgICAgICAgIC5nbG9ibCBfc2JfZmluZG1hcAorX3NiX2ZpbmRtYXA6CisgICAgICAgICAuYnl0ZSAgOCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMAorICAgICAgICAgLmJ5dGUgIDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAKKyAgICAgICAgIC5ieXRlICA1LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwCisgICAgICAgICAuYnl0ZSAgNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMAorICAgICAgICAgLmJ5dGUgIDYsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAKKyAgICAgICAgIC5ieXRlICA0LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwCisgICAgICAgICAuYnl0ZSAgNSwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMAorICAgICAgICAgLmJ5dGUgIDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAKKyAgICAgICAgIC5ieXRlICA3LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwCisgICAgICAgICAuYnl0ZSAgNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMAorICAgICAgICAgLmJ5dGUgIDUsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAKKyAgICAgICAgIC5ieXRlICA0LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwCisgICAgICAgICAuYnl0ZSAgNiwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMAorICAgICAgICAgLmJ5dGUgIDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAKKyAgICAgICAgIC5ieXRlICA1LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwCisgICAgICAgICAuYnl0ZSAgNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMAorCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9leGVjX2RvbWFpbi5jIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfZXhlY19kb21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWQyN2M0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfZXhlY19kb21haW4uYwpAQCAtMCwwICsxLDMwIEBACisvKgorICogU3VwcG9ydCBmb3IgMzItYml0IExpbnV4IGZvciBTMzkwIHBlcnNvbmFsaXR5LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwgSUJNIENvcnBvcmF0aW9uCisgKiBBdXRob3Iocyk6IEdlcmhhcmQgVG9ubiAodG9uQGRlLmlibS5jb20pCisgKgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworc3RydWN0IGV4ZWNfZG9tYWluIHMzOTBfZXhlY19kb21haW47CisKK3N0YXRpYyBpbnQgX19pbml0CitzMzkwX2luaXQgKHZvaWQpCit7CisJczM5MF9leGVjX2RvbWFpbi5uYW1lID0gIkxpbnV4L3MzOTAiOworCXMzOTBfZXhlY19kb21haW4uaGFuZGxlciA9IE5VTEw7CisJczM5MF9leGVjX2RvbWFpbi5wZXJzX2xvdyA9IFBFUl9MSU5VWDMyOworCXMzOTBfZXhlY19kb21haW4ucGVyc19oaWdoID0gUEVSX0xJTlVYMzI7CisJczM5MF9leGVjX2RvbWFpbi5zaWduYWxfbWFwID0gZGVmYXVsdF9leGVjX2RvbWFpbi5zaWduYWxfbWFwOworCXMzOTBfZXhlY19kb21haW4uc2lnbmFsX2ludm1hcCA9IGRlZmF1bHRfZXhlY19kb21haW4uc2lnbmFsX2ludm1hcDsKKwlyZWdpc3Rlcl9leGVjX2RvbWFpbigmczM5MF9leGVjX2RvbWFpbik7CisJcmV0dXJuIDA7Cit9CisKK19faW5pdGNhbGwoczM5MF9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2lvY3RsLmMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9pb2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NTcxZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9pb2N0bC5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBpb2N0bDMyLmM6IENvbnZlcnNpb24gYmV0d2VlbiAzMmJpdCBhbmQgNjRiaXQgbmF0aXZlIGlvY3Rscy4KKyAqCisgKiAgUzM5MCB2ZXJzaW9uCisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMyBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwgSUJNIENvcnBvcmF0aW9uCisgKiAgICBBdXRob3Iocyk6IEdlcmhhcmQgVG9ubiAodG9uQGRlLmlibS5jb20pCisgKiAgICAgICAgICAgICAgIEFybmQgQmVyZ21hbm4gKGFybmRiQGRlLmlibS5jb20pCisgKgorICogT3JpZ2luYWwgaW1wbGVtZW50YXRpb24gZnJvbSAzMi1iaXQgU3BhcmMgY29tcGF0IGNvZGUgd2hpY2ggaXMKKyAqIENvcHlyaWdodCAoQykgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBXcml0dGVuIGJ5IFVsZiBDYXJsc3NvbiAodWxmY0BlbmdyLnNnaS5jb20pIAorICovCisKKyNpbmNsdWRlICJjb21wYXRfbGludXguaCIKKyNkZWZpbmUgSU5DTFVERVMKKyNkZWZpbmUgQ09ERQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZzL2NvbXBhdF9pb2N0bC5jIgorI2luY2x1ZGUgPGFzbS9kYXNkLmg+CisjaW5jbHVkZSA8YXNtL3RhcGUzOTAuaD4KKworc3RhdGljIGludCBkb19pb2N0bDMyX3BvaW50ZXIodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCXVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgZmlsZSAqZikKK3sKKwlyZXR1cm4gc3lzX2lvY3RsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKWNvbXBhdF9wdHIoYXJnKSk7Cit9CisKK3N0YXRpYyBpbnQgZG9faW9jdGwzMl91bG9uZyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJdW5zaWduZWQgbG9uZyBhcmcsIHN0cnVjdCBmaWxlICpmKQoreworCXJldHVybiBzeXNfaW9jdGwoZmQsIGNtZCwgYXJnKTsKK30KKworI2RlZmluZSBDT01QQVRJQkxFX0lPQ1RMKGNtZCkJCUhBTkRMRV9JT0NUTCgoY21kKSwoaW9jdGxfdHJhbnNfaGFuZGxlcl90KWRvX2lvY3RsMzJfcG9pbnRlcikKKyNkZWZpbmUgVUxPTkdfSU9DVEwoY21kKQkJSEFORExFX0lPQ1RMKChjbWQpLChpb2N0bF90cmFuc19oYW5kbGVyX3QpZG9faW9jdGwzMl91bG9uZykKKyNkZWZpbmUgSEFORExFX0lPQ1RMKGNtZCxoYW5kbGVyKQl7IChjbWQpLCAoaW9jdGxfdHJhbnNfaGFuZGxlcl90KShoYW5kbGVyKSwgTlVMTCB9LAorCitzdHJ1Y3QgaW9jdGxfdHJhbnMgaW9jdGxfc3RhcnRbXSA9IHsKKy8qIGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudCBpb2N0bHMgKi8KKyNpbmNsdWRlIDxsaW51eC9jb21wYXRfaW9jdGwuaD4KKyNkZWZpbmUgREVDTEFSRVMKKyNpbmNsdWRlICIuLi8uLi8uLi9mcy9jb21wYXRfaW9jdGwuYyIKKworLyogczM5MCBvbmx5IGlvY3RscyAqLworI2lmIGRlZmluZWQoQ09ORklHX0RBU0QpIHx8IGRlZmluZWQoQ09ORklHX0RBU0RfTU9EVUxFKQorQ09NUEFUSUJMRV9JT0NUTChEQVNEQVBJVkVSKQorQ09NUEFUSUJMRV9JT0NUTChCSU9EQVNERElTQUJMRSkKK0NPTVBBVElCTEVfSU9DVEwoQklPREFTREVOQUJMRSkKK0NPTVBBVElCTEVfSU9DVEwoQklPREFTRFJTUlYpCitDT01QQVRJQkxFX0lPQ1RMKEJJT0RBU0RSTFNFKQorQ09NUEFUSUJMRV9JT0NUTChCSU9EQVNEU0xDSykKK0NPTVBBVElCTEVfSU9DVEwoQklPREFTRElORk8pCitDT01QQVRJQkxFX0lPQ1RMKEJJT0RBU0RJTkZPMikKK0NPTVBBVElCTEVfSU9DVEwoQklPREFTREZNVCkKK0NPTVBBVElCTEVfSU9DVEwoQklPREFTRFBSUlNUKQorQ09NUEFUSUJMRV9JT0NUTChCSU9EQVNEUVVJRVNDRSkKK0NPTVBBVElCTEVfSU9DVEwoQklPREFTRFJFU1VNRSkKK0NPTVBBVElCTEVfSU9DVEwoQklPREFTRFBSUkQpCitDT01QQVRJQkxFX0lPQ1RMKEJJT0RBU0RQU1JEKQorQ09NUEFUSUJMRV9JT0NUTChCSU9EQVNER0FUVFIpCitDT01QQVRJQkxFX0lPQ1RMKEJJT0RBU0RTQVRUUikKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TMzkwX1RBUEUpIHx8IGRlZmluZWQoQ09ORklHX1MzOTBfVEFQRV9NT0RVTEUpCitDT01QQVRJQkxFX0lPQ1RMKFRBUEUzOTBfRElTUExBWSkKKyNlbmRpZgorCisvKiBzMzkwIGRvZXNuJ3QgbmVlZCBoYW5kbGVycyBoZXJlICovCitDT01QQVRJQkxFX0lPQ1RMKFRJT0NHU0VSSUFMKQorQ09NUEFUSUJMRV9JT0NUTChUSU9DU1NFUklBTCkKK307CisKK2ludCBpb2N0bF90YWJsZV9zaXplID0gQVJSQVlfU0laRShpb2N0bF9zdGFydCk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTQwNTYyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYwpAQCAtMCwwICsxLDEwNDUgQEAKKy8qCisgKiAgYXJjaC9zMzkweC9rZXJuZWwvbGludXgzMi5jCisgKgorICogIFMzOTAgdmVyc2lvbgorICogICAgQ29weXJpZ2h0IChDKSAyMDAwIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCBJQk0gQ29ycG9yYXRpb24KKyAqICAgIEF1dGhvcihzKTogTWFydGluIFNjaHdpZGVmc2t5IChzY2h3aWRlZnNreUBkZS5pYm0uY29tKSwKKyAqICAgICAgICAgICAgICAgR2VyaGFyZCBUb25uICh0b25AZGUuaWJtLmNvbSkgICAKKyAqICAgICAgICAgICAgICAgVGhvbWFzIFNwYXR6aWVyICh0c3BhdEBkZS5pYm0uY29tKQorICoKKyAqICBDb252ZXJzaW9uIGJldHdlZW4gMzFiaXQgYW5kIDY0Yml0IG5hdGl2ZSBzeXNjYWxscy4KKyAqCisgKiBIZWF2aWx5IGluc3BpcmVkIGJ5IHRoZSAzMi1iaXQgU3BhcmMgY29tcGF0IGNvZGUgd2hpY2ggaXMgCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsMTk5OCBKYWt1YiBKZWxpbmVrIChqakBzdW5zaXRlLm1mZi5jdW5pLmN6KQorICogQ29weXJpZ2h0IChDKSAxOTk3IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKKyAqCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPiAKKyNpbmNsdWRlIDxsaW51eC9tbS5oPiAKKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+IAorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Jlc291cmNlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXMuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbS5oPgorI2luY2x1ZGUgPGxpbnV4L21zZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NobS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC94ZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaWNtcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaXBjLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlIDxuZXQvc2NtLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2luY2x1ZGUgImNvbXBhdF9saW51eC5oIgorCisgCisvKiBGb3IgdGhpcyBzb3VyY2UgZmlsZSwgd2Ugd2FudCBvdmVyZmxvdyBoYW5kbGluZy4gKi8KKworI3VuZGVmIGhpZ2gybG93dWlkCisjdW5kZWYgaGlnaDJsb3dnaWQKKyN1bmRlZiBsb3cyaGlnaHVpZAorI3VuZGVmIGxvdzJoaWdoZ2lkCisjdW5kZWYgU0VUX1VJRDE2CisjdW5kZWYgU0VUX0dJRDE2CisjdW5kZWYgTkVXX1RPX09MRF9VSUQKKyN1bmRlZiBORVdfVE9fT0xEX0dJRAorI3VuZGVmIFNFVF9PTERTVEFUX1VJRAorI3VuZGVmIFNFVF9PTERTVEFUX0dJRAorI3VuZGVmIFNFVF9TVEFUX1VJRAorI3VuZGVmIFNFVF9TVEFUX0dJRAorCisjZGVmaW5lIGhpZ2gybG93dWlkKHVpZCkgKCh1aWQpID4gNjU1MzUpID8gKHUxNilvdmVyZmxvd3VpZCA6ICh1MTYpKHVpZCkKKyNkZWZpbmUgaGlnaDJsb3dnaWQoZ2lkKSAoKGdpZCkgPiA2NTUzNSkgPyAodTE2KW92ZXJmbG93Z2lkIDogKHUxNikoZ2lkKQorI2RlZmluZSBsb3cyaGlnaHVpZCh1aWQpICgodWlkKSA9PSAodTE2KS0xKSA/ICh1aWRfdCktMSA6ICh1aWRfdCkodWlkKQorI2RlZmluZSBsb3cyaGlnaGdpZChnaWQpICgoZ2lkKSA9PSAodTE2KS0xKSA/IChnaWRfdCktMSA6IChnaWRfdCkoZ2lkKQorI2RlZmluZSBTRVRfVUlEMTYodmFyLCB1aWQpCXZhciA9IGhpZ2gybG93dWlkKHVpZCkKKyNkZWZpbmUgU0VUX0dJRDE2KHZhciwgZ2lkKQl2YXIgPSBoaWdoMmxvd2dpZChnaWQpCisjZGVmaW5lIE5FV19UT19PTERfVUlEKHVpZCkJaGlnaDJsb3d1aWQodWlkKQorI2RlZmluZSBORVdfVE9fT0xEX0dJRChnaWQpCWhpZ2gybG93Z2lkKGdpZCkKKyNkZWZpbmUgU0VUX09MRFNUQVRfVUlEKHN0YXQsIHVpZCkJKHN0YXQpLnN0X3VpZCA9IGhpZ2gybG93dWlkKHVpZCkKKyNkZWZpbmUgU0VUX09MRFNUQVRfR0lEKHN0YXQsIGdpZCkJKHN0YXQpLnN0X2dpZCA9IGhpZ2gybG93Z2lkKGdpZCkKKyNkZWZpbmUgU0VUX1NUQVRfVUlEKHN0YXQsIHVpZCkJCShzdGF0KS5zdF91aWQgPSBoaWdoMmxvd3VpZCh1aWQpCisjZGVmaW5lIFNFVF9TVEFUX0dJRChzdGF0LCBnaWQpCQkoc3RhdCkuc3RfZ2lkID0gaGlnaDJsb3dnaWQoZ2lkKQorCithc21saW5rYWdlIGxvbmcgc3lzMzJfY2hvd24xNihjb25zdCBjaGFyICogZmlsZW5hbWUsIHUxNiB1c2VyLCB1MTYgZ3JvdXApCit7CisJcmV0dXJuIHN5c19jaG93bihmaWxlbmFtZSwgbG93MmhpZ2h1aWQodXNlciksIGxvdzJoaWdoZ2lkKGdyb3VwKSk7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXMzMl9sY2hvd24xNihjb25zdCBjaGFyICogZmlsZW5hbWUsIHUxNiB1c2VyLCB1MTYgZ3JvdXApCit7CisJcmV0dXJuIHN5c19sY2hvd24oZmlsZW5hbWUsIGxvdzJoaWdodWlkKHVzZXIpLCBsb3cyaGlnaGdpZChncm91cCkpOworfQorCithc21saW5rYWdlIGxvbmcgc3lzMzJfZmNob3duMTYodW5zaWduZWQgaW50IGZkLCB1MTYgdXNlciwgdTE2IGdyb3VwKQoreworCXJldHVybiBzeXNfZmNob3duKGZkLCBsb3cyaGlnaHVpZCh1c2VyKSwgbG93MmhpZ2hnaWQoZ3JvdXApKTsKK30KKworYXNtbGlua2FnZSBsb25nIHN5czMyX3NldHJlZ2lkMTYodTE2IHJnaWQsIHUxNiBlZ2lkKQoreworCXJldHVybiBzeXNfc2V0cmVnaWQobG93MmhpZ2hnaWQocmdpZCksIGxvdzJoaWdoZ2lkKGVnaWQpKTsKK30KKworYXNtbGlua2FnZSBsb25nIHN5czMyX3NldGdpZDE2KHUxNiBnaWQpCit7CisJcmV0dXJuIHN5c19zZXRnaWQoKGdpZF90KWdpZCk7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXMzMl9zZXRyZXVpZDE2KHUxNiBydWlkLCB1MTYgZXVpZCkKK3sKKwlyZXR1cm4gc3lzX3NldHJldWlkKGxvdzJoaWdodWlkKHJ1aWQpLCBsb3cyaGlnaHVpZChldWlkKSk7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXMzMl9zZXR1aWQxNih1MTYgdWlkKQoreworCXJldHVybiBzeXNfc2V0dWlkKCh1aWRfdCl1aWQpOworfQorCithc21saW5rYWdlIGxvbmcgc3lzMzJfc2V0cmVzdWlkMTYodTE2IHJ1aWQsIHUxNiBldWlkLCB1MTYgc3VpZCkKK3sKKwlyZXR1cm4gc3lzX3NldHJlc3VpZChsb3cyaGlnaHVpZChydWlkKSwgbG93MmhpZ2h1aWQoZXVpZCksCisJCWxvdzJoaWdodWlkKHN1aWQpKTsKK30KKworYXNtbGlua2FnZSBsb25nIHN5czMyX2dldHJlc3VpZDE2KHUxNiAqcnVpZCwgdTE2ICpldWlkLCB1MTYgKnN1aWQpCit7CisJaW50IHJldHZhbDsKKworCWlmICghKHJldHZhbCA9IHB1dF91c2VyKGhpZ2gybG93dWlkKGN1cnJlbnQtPnVpZCksIHJ1aWQpKSAmJgorCSAgICAhKHJldHZhbCA9IHB1dF91c2VyKGhpZ2gybG93dWlkKGN1cnJlbnQtPmV1aWQpLCBldWlkKSkpCisJCXJldHZhbCA9IHB1dF91c2VyKGhpZ2gybG93dWlkKGN1cnJlbnQtPnN1aWQpLCBzdWlkKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXMzMl9zZXRyZXNnaWQxNih1MTYgcmdpZCwgdTE2IGVnaWQsIHUxNiBzZ2lkKQoreworCXJldHVybiBzeXNfc2V0cmVzZ2lkKGxvdzJoaWdoZ2lkKHJnaWQpLCBsb3cyaGlnaGdpZChlZ2lkKSwKKwkJbG93MmhpZ2hnaWQoc2dpZCkpOworfQorCithc21saW5rYWdlIGxvbmcgc3lzMzJfZ2V0cmVzZ2lkMTYodTE2ICpyZ2lkLCB1MTYgKmVnaWQsIHUxNiAqc2dpZCkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKCEocmV0dmFsID0gcHV0X3VzZXIoaGlnaDJsb3dnaWQoY3VycmVudC0+Z2lkKSwgcmdpZCkpICYmCisJICAgICEocmV0dmFsID0gcHV0X3VzZXIoaGlnaDJsb3dnaWQoY3VycmVudC0+ZWdpZCksIGVnaWQpKSkKKwkJcmV0dmFsID0gcHV0X3VzZXIoaGlnaDJsb3dnaWQoY3VycmVudC0+c2dpZCksIHNnaWQpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworYXNtbGlua2FnZSBsb25nIHN5czMyX3NldGZzdWlkMTYodTE2IHVpZCkKK3sKKwlyZXR1cm4gc3lzX3NldGZzdWlkKCh1aWRfdCl1aWQpOworfQorCithc21saW5rYWdlIGxvbmcgc3lzMzJfc2V0ZnNnaWQxNih1MTYgZ2lkKQoreworCXJldHVybiBzeXNfc2V0ZnNnaWQoKGdpZF90KWdpZCk7Cit9CisKK3N0YXRpYyBpbnQgZ3JvdXBzMTZfdG9fdXNlcih1MTYgKmdyb3VwbGlzdCwgc3RydWN0IGdyb3VwX2luZm8gKmdyb3VwX2luZm8pCit7CisJaW50IGk7CisJdTE2IGdyb3VwOworCisJZm9yIChpID0gMDsgaSA8IGdyb3VwX2luZm8tPm5ncm91cHM7IGkrKykgeworCQlncm91cCA9ICh1MTYpR1JPVVBfQVQoZ3JvdXBfaW5mbywgaSk7CisJCWlmIChwdXRfdXNlcihncm91cCwgZ3JvdXBsaXN0K2kpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3JvdXBzMTZfZnJvbV91c2VyKHN0cnVjdCBncm91cF9pbmZvICpncm91cF9pbmZvLCB1MTYgKmdyb3VwbGlzdCkKK3sKKwlpbnQgaTsKKwl1MTYgZ3JvdXA7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ3JvdXBfaW5mby0+bmdyb3VwczsgaSsrKSB7CisJCWlmIChnZXRfdXNlcihncm91cCwgZ3JvdXBsaXN0K2kpKQorCQkJcmV0dXJuICAtRUZBVUxUOworCQlHUk9VUF9BVChncm91cF9pbmZvLCBpKSA9IChnaWRfdClncm91cDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworYXNtbGlua2FnZSBsb25nIHN5czMyX2dldGdyb3VwczE2KGludCBnaWRzZXRzaXplLCB1MTYgKmdyb3VwbGlzdCkKK3sKKwlpbnQgaTsKKworCWlmIChnaWRzZXRzaXplIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlnZXRfZ3JvdXBfaW5mbyhjdXJyZW50LT5ncm91cF9pbmZvKTsKKwlpID0gY3VycmVudC0+Z3JvdXBfaW5mby0+bmdyb3VwczsKKwlpZiAoZ2lkc2V0c2l6ZSkgeworCQlpZiAoaSA+IGdpZHNldHNpemUpIHsKKwkJCWkgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGdyb3VwczE2X3RvX3VzZXIoZ3JvdXBsaXN0LCBjdXJyZW50LT5ncm91cF9pbmZvKSkgeworCQkJaSA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KK291dDoKKwlwdXRfZ3JvdXBfaW5mbyhjdXJyZW50LT5ncm91cF9pbmZvKTsKKwlyZXR1cm4gaTsKK30KKworYXNtbGlua2FnZSBsb25nIHN5czMyX3NldGdyb3VwczE2KGludCBnaWRzZXRzaXplLCB1MTYgKmdyb3VwbGlzdCkKK3sKKwlzdHJ1Y3QgZ3JvdXBfaW5mbyAqZ3JvdXBfaW5mbzsKKwlpbnQgcmV0dmFsOworCisJaWYgKCFjYXBhYmxlKENBUF9TRVRHSUQpKQorCQlyZXR1cm4gLUVQRVJNOworCWlmICgodW5zaWduZWQpZ2lkc2V0c2l6ZSA+IE5HUk9VUFNfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWdyb3VwX2luZm8gPSBncm91cHNfYWxsb2MoZ2lkc2V0c2l6ZSk7CisJaWYgKCFncm91cF9pbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR2YWwgPSBncm91cHMxNl9mcm9tX3VzZXIoZ3JvdXBfaW5mbywgZ3JvdXBsaXN0KTsKKwlpZiAocmV0dmFsKSB7CisJCXB1dF9ncm91cF9pbmZvKGdyb3VwX2luZm8pOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXJldHZhbCA9IHNldF9jdXJyZW50X2dyb3Vwcyhncm91cF9pbmZvKTsKKwlwdXRfZ3JvdXBfaW5mbyhncm91cF9pbmZvKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXMzMl9nZXR1aWQxNih2b2lkKQoreworCXJldHVybiBoaWdoMmxvd3VpZChjdXJyZW50LT51aWQpOworfQorCithc21saW5rYWdlIGxvbmcgc3lzMzJfZ2V0ZXVpZDE2KHZvaWQpCit7CisJcmV0dXJuIGhpZ2gybG93dWlkKGN1cnJlbnQtPmV1aWQpOworfQorCithc21saW5rYWdlIGxvbmcgc3lzMzJfZ2V0Z2lkMTYodm9pZCkKK3sKKwlyZXR1cm4gaGlnaDJsb3dnaWQoY3VycmVudC0+Z2lkKTsKK30KKworYXNtbGlua2FnZSBsb25nIHN5czMyX2dldGVnaWQxNih2b2lkKQoreworCXJldHVybiBoaWdoMmxvd2dpZChjdXJyZW50LT5lZ2lkKTsKK30KKworLyogMzItYml0IHRpbWV2YWwgYW5kIHJlbGF0ZWQgZmxvdHNhbS4gICovCisKK3N0YXRpYyBpbmxpbmUgbG9uZyBnZXRfdHYzMihzdHJ1Y3QgdGltZXZhbCAqbywgc3RydWN0IGNvbXBhdF90aW1ldmFsICppKQoreworCXJldHVybiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdHYzMiwgc2l6ZW9mKCp0djMyKSkgfHwKKwkJKF9fZ2V0X3VzZXIoby0+dHZfc2VjLCAmaS0+dHZfc2VjKSB8fAorCQkgX19nZXRfdXNlcihvLT50dl91c2VjLCAmaS0+dHZfdXNlYykpKTsKK30KKworc3RhdGljIGlubGluZSBsb25nIHB1dF90djMyKHN0cnVjdCBjb21wYXRfdGltZXZhbCAqbywgc3RydWN0IHRpbWV2YWwgKmkpCit7CisJcmV0dXJuICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgbywgc2l6ZW9mKCpvKSkgfHwKKwkJKF9fcHV0X3VzZXIoaS0+dHZfc2VjLCAmby0+dHZfc2VjKSB8fAorCQkgX19wdXRfdXNlcihpLT50dl91c2VjLCAmby0+dHZfdXNlYykpKTsKK30KKworLyoKKyAqIHN5czMyX2lwYygpIGlzIHRoZSBkZS1tdWx0aXBsZXhlciBmb3IgdGhlIFN5c1YgSVBDIGNhbGxzIGluIDMyYml0IGVtdWxhdGlvbi4KKyAqCisgKiBUaGlzIGlzIHJlYWxseSBob3JyaWJseSB1Z2x5LgorICovCithc21saW5rYWdlIGxvbmcgc3lzMzJfaXBjKHUzMiBjYWxsLCBpbnQgZmlyc3QsIGludCBzZWNvbmQsIGludCB0aGlyZCwgdTMyIHB0cikKK3sKKwlpZiAoY2FsbCA+PiAxNikJCS8qIGhhY2sgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljYWxsICY9IDB4ZmZmZjsKKworCXN3aXRjaCAoY2FsbCkgeworCWNhc2UgU0VNVElNRURPUDoKKwkJcmV0dXJuIGNvbXBhdF9zeXNfc2VtdGltZWRvcChmaXJzdCwgY29tcGF0X3B0cihwdHIpLAorCQkJCQkgICAgIHNlY29uZCwgY29tcGF0X3B0cih0aGlyZCkpOworCWNhc2UgU0VNT1A6CisJCS8qIHN0cnVjdCBzZW1idWYgaXMgdGhlIHNhbWUgb24gMzIgYW5kIDY0Yml0IDopKSAqLworCQlyZXR1cm4gc3lzX3NlbXRpbWVkb3AoZmlyc3QsIGNvbXBhdF9wdHIocHRyKSwKKwkJCQkgICAgICBzZWNvbmQsIE5VTEwpOworCWNhc2UgU0VNR0VUOgorCQlyZXR1cm4gc3lzX3NlbWdldChmaXJzdCwgc2Vjb25kLCB0aGlyZCk7CisJY2FzZSBTRU1DVEw6CisJCXJldHVybiBjb21wYXRfc3lzX3NlbWN0bChmaXJzdCwgc2Vjb25kLCB0aGlyZCwKKwkJCQkJIGNvbXBhdF9wdHIocHRyKSk7CisJY2FzZSBNU0dTTkQ6CisJCXJldHVybiBjb21wYXRfc3lzX21zZ3NuZChmaXJzdCwgc2Vjb25kLCB0aGlyZCwKKwkJCQkJIGNvbXBhdF9wdHIocHRyKSk7CisJY2FzZSBNU0dSQ1Y6CisJCXJldHVybiBjb21wYXRfc3lzX21zZ3JjdihmaXJzdCwgc2Vjb25kLCAwLCB0aGlyZCwKKwkJCQkJIDAsIGNvbXBhdF9wdHIocHRyKSk7CisJY2FzZSBNU0dHRVQ6CisJCXJldHVybiBzeXNfbXNnZ2V0KChrZXlfdCkgZmlyc3QsIHNlY29uZCk7CisJY2FzZSBNU0dDVEw6CisJCXJldHVybiBjb21wYXRfc3lzX21zZ2N0bChmaXJzdCwgc2Vjb25kLCBjb21wYXRfcHRyKHB0cikpOworCWNhc2UgU0hNQVQ6CisJCXJldHVybiBjb21wYXRfc3lzX3NobWF0KGZpcnN0LCBzZWNvbmQsIHRoaXJkLAorCQkJCQkwLCBjb21wYXRfcHRyKHB0cikpOworCWNhc2UgU0hNRFQ6CisJCXJldHVybiBzeXNfc2htZHQoY29tcGF0X3B0cihwdHIpKTsKKwljYXNlIFNITUdFVDoKKwkJcmV0dXJuIHN5c19zaG1nZXQoZmlyc3QsICh1bnNpZ25lZClzZWNvbmQsIHRoaXJkKTsKKwljYXNlIFNITUNUTDoKKwkJcmV0dXJuIGNvbXBhdF9zeXNfc2htY3RsKGZpcnN0LCBzZWNvbmQsIGNvbXBhdF9wdHIocHRyKSk7CisJfQorCisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXMzMl90cnVuY2F0ZTY0KGNvbnN0IGNoYXIgKiBwYXRoLCB1bnNpZ25lZCBsb25nIGhpZ2gsIHVuc2lnbmVkIGxvbmcgbG93KQoreworCWlmICgoaW50KWhpZ2ggPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlCisJCXJldHVybiBzeXNfdHJ1bmNhdGUocGF0aCwgKGhpZ2ggPDwgMzIpIHwgbG93KTsKK30KKworYXNtbGlua2FnZSBsb25nIHN5czMyX2Z0cnVuY2F0ZTY0KHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgbG9uZyBoaWdoLCB1bnNpZ25lZCBsb25nIGxvdykKK3sKKwlpZiAoKGludCloaWdoIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZQorCQlyZXR1cm4gc3lzX2Z0cnVuY2F0ZShmZCwgKGhpZ2ggPDwgMzIpIHwgbG93KTsKK30KKworaW50IGNwX2NvbXBhdF9zdGF0KHN0cnVjdCBrc3RhdCAqc3RhdCwgc3RydWN0IGNvbXBhdF9zdGF0ICpzdGF0YnVmKQoreworCWludCBlcnI7CisKKwlpZiAoIW9sZF92YWxpZF9kZXYoc3RhdC0+ZGV2KSB8fCAhb2xkX3ZhbGlkX2RldihzdGF0LT5yZGV2KSkKKwkJcmV0dXJuIC1FT1ZFUkZMT1c7CisKKwllcnIgPSBwdXRfdXNlcihvbGRfZW5jb2RlX2RldihzdGF0LT5kZXYpLCAmc3RhdGJ1Zi0+c3RfZGV2KTsKKwllcnIgfD0gcHV0X3VzZXIoc3RhdC0+aW5vLCAmc3RhdGJ1Zi0+c3RfaW5vKTsKKwllcnIgfD0gcHV0X3VzZXIoc3RhdC0+bW9kZSwgJnN0YXRidWYtPnN0X21vZGUpOworCWVyciB8PSBwdXRfdXNlcihzdGF0LT5ubGluaywgJnN0YXRidWYtPnN0X25saW5rKTsKKwllcnIgfD0gcHV0X3VzZXIoaGlnaDJsb3d1aWQoc3RhdC0+dWlkKSwgJnN0YXRidWYtPnN0X3VpZCk7CisJZXJyIHw9IHB1dF91c2VyKGhpZ2gybG93Z2lkKHN0YXQtPmdpZCksICZzdGF0YnVmLT5zdF9naWQpOworCWVyciB8PSBwdXRfdXNlcihvbGRfZW5jb2RlX2RldihzdGF0LT5yZGV2KSwgJnN0YXRidWYtPnN0X3JkZXYpOworCWVyciB8PSBwdXRfdXNlcihzdGF0LT5zaXplLCAmc3RhdGJ1Zi0+c3Rfc2l6ZSk7CisJZXJyIHw9IHB1dF91c2VyKHN0YXQtPmF0aW1lLnR2X3NlYywgJnN0YXRidWYtPnN0X2F0aW1lKTsKKwllcnIgfD0gcHV0X3VzZXIoc3RhdC0+YXRpbWUudHZfbnNlYywgJnN0YXRidWYtPnN0X2F0aW1lX25zZWMpOworCWVyciB8PSBwdXRfdXNlcihzdGF0LT5tdGltZS50dl9zZWMsICZzdGF0YnVmLT5zdF9tdGltZSk7CisJZXJyIHw9IHB1dF91c2VyKHN0YXQtPm10aW1lLnR2X25zZWMsICZzdGF0YnVmLT5zdF9tdGltZV9uc2VjKTsKKwllcnIgfD0gcHV0X3VzZXIoc3RhdC0+Y3RpbWUudHZfc2VjLCAmc3RhdGJ1Zi0+c3RfY3RpbWUpOworCWVyciB8PSBwdXRfdXNlcihzdGF0LT5jdGltZS50dl9uc2VjLCAmc3RhdGJ1Zi0+c3RfY3RpbWVfbnNlYyk7CisJZXJyIHw9IHB1dF91c2VyKHN0YXQtPmJsa3NpemUsICZzdGF0YnVmLT5zdF9ibGtzaXplKTsKKwllcnIgfD0gcHV0X3VzZXIoc3RhdC0+YmxvY2tzLCAmc3RhdGJ1Zi0+c3RfYmxvY2tzKTsKKy8qIGZpeG1lCisJZXJyIHw9IHB1dF91c2VyKDAsICZzdGF0YnVmLT5fX3VudXNlZDRbMF0pOworCWVyciB8PSBwdXRfdXNlcigwLCAmc3RhdGJ1Zi0+X191bnVzZWQ0WzFdKTsKKyovCisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IHN5c2luZm8zMiB7CisgICAgICAgIHMzMiB1cHRpbWU7CisgICAgICAgIHUzMiBsb2Fkc1szXTsKKyAgICAgICAgdTMyIHRvdGFscmFtOworICAgICAgICB1MzIgZnJlZXJhbTsKKyAgICAgICAgdTMyIHNoYXJlZHJhbTsKKyAgICAgICAgdTMyIGJ1ZmZlcnJhbTsKKyAgICAgICAgdTMyIHRvdGFsc3dhcDsKKyAgICAgICAgdTMyIGZyZWVzd2FwOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBwcm9jczsKKwl1bnNpZ25lZCBzaG9ydCBwYWRzOworCXUzMiB0b3RhbGhpZ2g7CisJdTMyIGZyZWVoaWdoOworCXVuc2lnbmVkIGludCBtZW1fdW5pdDsKKyAgICAgICAgY2hhciBfZls4XTsKK307CisKK2FzbWxpbmthZ2UgbG9uZyBzeXMzMl9zeXNpbmZvKHN0cnVjdCBzeXNpbmZvMzIgX191c2VyICppbmZvKQoreworCXN0cnVjdCBzeXNpbmZvIHM7CisJaW50IHJldCwgZXJyOworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMgKCk7CisJCisJc2V0X2ZzIChLRVJORUxfRFMpOworCXJldCA9IHN5c19zeXNpbmZvKCZzKTsKKwlzZXRfZnMgKG9sZF9mcyk7CisJZXJyID0gcHV0X3VzZXIgKHMudXB0aW1lLCAmaW5mby0+dXB0aW1lKTsKKwllcnIgfD0gX19wdXRfdXNlciAocy5sb2Fkc1swXSwgJmluZm8tPmxvYWRzWzBdKTsKKwllcnIgfD0gX19wdXRfdXNlciAocy5sb2Fkc1sxXSwgJmluZm8tPmxvYWRzWzFdKTsKKwllcnIgfD0gX19wdXRfdXNlciAocy5sb2Fkc1syXSwgJmluZm8tPmxvYWRzWzJdKTsKKwllcnIgfD0gX19wdXRfdXNlciAocy50b3RhbHJhbSwgJmluZm8tPnRvdGFscmFtKTsKKwllcnIgfD0gX19wdXRfdXNlciAocy5mcmVlcmFtLCAmaW5mby0+ZnJlZXJhbSk7CisJZXJyIHw9IF9fcHV0X3VzZXIgKHMuc2hhcmVkcmFtLCAmaW5mby0+c2hhcmVkcmFtKTsKKwllcnIgfD0gX19wdXRfdXNlciAocy5idWZmZXJyYW0sICZpbmZvLT5idWZmZXJyYW0pOworCWVyciB8PSBfX3B1dF91c2VyIChzLnRvdGFsc3dhcCwgJmluZm8tPnRvdGFsc3dhcCk7CisJZXJyIHw9IF9fcHV0X3VzZXIgKHMuZnJlZXN3YXAsICZpbmZvLT5mcmVlc3dhcCk7CisJZXJyIHw9IF9fcHV0X3VzZXIgKHMucHJvY3MsICZpbmZvLT5wcm9jcyk7CisJZXJyIHw9IF9fcHV0X3VzZXIgKHMudG90YWxoaWdoLCAmaW5mby0+dG90YWxoaWdoKTsKKwllcnIgfD0gX19wdXRfdXNlciAocy5mcmVlaGlnaCwgJmluZm8tPmZyZWVoaWdoKTsKKwllcnIgfD0gX19wdXRfdXNlciAocy5tZW1fdW5pdCwgJmluZm8tPm1lbV91bml0KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gcmV0OworfQorCithc21saW5rYWdlIGxvbmcgc3lzMzJfc2NoZWRfcnJfZ2V0X2ludGVydmFsKGNvbXBhdF9waWRfdCBwaWQsCisJCQkJc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKmludGVydmFsKQoreworCXN0cnVjdCB0aW1lc3BlYyB0OworCWludCByZXQ7CisJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcyAoKTsKKwkKKwlzZXRfZnMgKEtFUk5FTF9EUyk7CisJcmV0ID0gc3lzX3NjaGVkX3JyX2dldF9pbnRlcnZhbChwaWQsICZ0KTsKKwlzZXRfZnMgKG9sZF9mcyk7CisJaWYgKHB1dF9jb21wYXRfdGltZXNwZWMoJnQsIGludGVydmFsKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIHJldDsKK30KKworYXNtbGlua2FnZSBsb25nIHN5czMyX3J0X3NpZ3Byb2NtYXNrKGludCBob3csIGNvbXBhdF9zaWdzZXRfdCBfX3VzZXIgKnNldCwKKwkJCWNvbXBhdF9zaWdzZXRfdCBfX3VzZXIgKm9zZXQsIHNpemVfdCBzaWdzZXRzaXplKQoreworCXNpZ3NldF90IHM7CisJY29tcGF0X3NpZ3NldF90IHMzMjsKKwlpbnQgcmV0OworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKwkKKwlpZiAoc2V0KSB7CisJCWlmIChjb3B5X2Zyb21fdXNlciAoJnMzMiwgc2V0LCBzaXplb2YoY29tcGF0X3NpZ3NldF90KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc3dpdGNoIChfTlNJR19XT1JEUykgeworCQljYXNlIDQ6IHMuc2lnWzNdID0gczMyLnNpZ1s2XSB8ICgoKGxvbmcpczMyLnNpZ1s3XSkgPDwgMzIpOworCQljYXNlIDM6IHMuc2lnWzJdID0gczMyLnNpZ1s0XSB8ICgoKGxvbmcpczMyLnNpZ1s1XSkgPDwgMzIpOworCQljYXNlIDI6IHMuc2lnWzFdID0gczMyLnNpZ1syXSB8ICgoKGxvbmcpczMyLnNpZ1szXSkgPDwgMzIpOworCQljYXNlIDE6IHMuc2lnWzBdID0gczMyLnNpZ1swXSB8ICgoKGxvbmcpczMyLnNpZ1sxXSkgPDwgMzIpOworCQl9CisJfQorCXNldF9mcyAoS0VSTkVMX0RTKTsKKwlyZXQgPSBzeXNfcnRfc2lncHJvY21hc2soaG93LCBzZXQgPyAmcyA6IE5VTEwsIG9zZXQgPyAmcyA6IE5VTEwsIHNpZ3NldHNpemUpOworCXNldF9mcyAob2xkX2ZzKTsKKwlpZiAocmV0KSByZXR1cm4gcmV0OworCWlmIChvc2V0KSB7CisJCXN3aXRjaCAoX05TSUdfV09SRFMpIHsKKwkJY2FzZSA0OiBzMzIuc2lnWzddID0gKHMuc2lnWzNdID4+IDMyKTsgczMyLnNpZ1s2XSA9IHMuc2lnWzNdOworCQljYXNlIDM6IHMzMi5zaWdbNV0gPSAocy5zaWdbMl0gPj4gMzIpOyBzMzIuc2lnWzRdID0gcy5zaWdbMl07CisJCWNhc2UgMjogczMyLnNpZ1szXSA9IChzLnNpZ1sxXSA+PiAzMik7IHMzMi5zaWdbMl0gPSBzLnNpZ1sxXTsKKwkJY2FzZSAxOiBzMzIuc2lnWzFdID0gKHMuc2lnWzBdID4+IDMyKTsgczMyLnNpZ1swXSA9IHMuc2lnWzBdOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIgKG9zZXQsICZzMzIsIHNpemVvZihjb21wYXRfc2lnc2V0X3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gMDsKK30KKworYXNtbGlua2FnZSBsb25nIHN5czMyX3J0X3NpZ3BlbmRpbmcoY29tcGF0X3NpZ3NldF90IF9fdXNlciAqc2V0LAorCQkJCXNpemVfdCBzaWdzZXRzaXplKQoreworCXNpZ3NldF90IHM7CisJY29tcGF0X3NpZ3NldF90IHMzMjsKKwlpbnQgcmV0OworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKwkJCisJc2V0X2ZzIChLRVJORUxfRFMpOworCXJldCA9IHN5c19ydF9zaWdwZW5kaW5nKCZzLCBzaWdzZXRzaXplKTsKKwlzZXRfZnMgKG9sZF9mcyk7CisJaWYgKCFyZXQpIHsKKwkJc3dpdGNoIChfTlNJR19XT1JEUykgeworCQljYXNlIDQ6IHMzMi5zaWdbN10gPSAocy5zaWdbM10gPj4gMzIpOyBzMzIuc2lnWzZdID0gcy5zaWdbM107CisJCWNhc2UgMzogczMyLnNpZ1s1XSA9IChzLnNpZ1syXSA+PiAzMik7IHMzMi5zaWdbNF0gPSBzLnNpZ1syXTsKKwkJY2FzZSAyOiBzMzIuc2lnWzNdID0gKHMuc2lnWzFdID4+IDMyKTsgczMyLnNpZ1syXSA9IHMuc2lnWzFdOworCQljYXNlIDE6IHMzMi5zaWdbMV0gPSAocy5zaWdbMF0gPj4gMzIpOyBzMzIuc2lnWzBdID0gcy5zaWdbMF07CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlciAoc2V0LCAmczMyLCBzaXplb2YoY29tcGF0X3NpZ3NldF90KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworYXNtbGlua2FnZSBsb25nCitzeXMzMl9ydF9zaWdxdWV1ZWluZm8oaW50IHBpZCwgaW50IHNpZywgY29tcGF0X3NpZ2luZm9fdCBfX3VzZXIgKnVpbmZvKQoreworCXNpZ2luZm9fdCBpbmZvOworCWludCByZXQ7CisJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOworCQorCWlmIChjb3B5X3NpZ2luZm9fZnJvbV91c2VyMzIoJmluZm8sIHVpbmZvKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc2V0X2ZzIChLRVJORUxfRFMpOworCXJldCA9IHN5c19ydF9zaWdxdWV1ZWluZm8ocGlkLCBzaWcsICZpbmZvKTsKKwlzZXRfZnMgKG9sZF9mcyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHN5czMyX2V4ZWN2ZSgpIGV4ZWN1dGVzIGEgbmV3IHByb2dyYW0gYWZ0ZXIgdGhlIGFzbSBzdHViIGhhcyBzZXQKKyAqIHRoaW5ncyB1cCBmb3IgdXMuICBUaGlzIHNob3VsZCBiYXNpY2FsbHkgZG8gd2hhdCBJIHdhbnQgaXQgdG8uCisgKi8KK2FzbWxpbmthZ2UgbG9uZworc3lzMzJfZXhlY3ZlKHN0cnVjdCBwdF9yZWdzIHJlZ3MpCit7CisgICAgICAgIGludCBlcnJvcjsKKyAgICAgICAgY2hhciAqIGZpbGVuYW1lOworCisgICAgICAgIGZpbGVuYW1lID0gZ2V0bmFtZShjb21wYXRfcHRyKHJlZ3Mub3JpZ19ncHIyKSk7CisgICAgICAgIGVycm9yID0gUFRSX0VSUihmaWxlbmFtZSk7CisgICAgICAgIGlmIChJU19FUlIoZmlsZW5hbWUpKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICBlcnJvciA9IGNvbXBhdF9kb19leGVjdmUoZmlsZW5hbWUsIGNvbXBhdF9wdHIocmVncy5ncHJzWzNdKSwKKwkJCQkgY29tcGF0X3B0cihyZWdzLmdwcnNbNF0pLCAmcmVncyk7CisJaWYgKGVycm9yID09IDApCisJeworCQl0YXNrX2xvY2soY3VycmVudCk7CisJCWN1cnJlbnQtPnB0cmFjZSAmPSB+UFRfRFRSQUNFOworCQl0YXNrX3VubG9jayhjdXJyZW50KTsKKwkJY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjPTA7CisJCV9fYXNtX18gX192b2xhdGlsZV9fCisJCSAgICAgICAgKCJzciAgMCwwXG5cdCIKKwkJICAgICAgICAgInNmcGMgMCwwXG5cdCIKKwkJCSA6IDogOiIwIik7CisJfQorICAgICAgICBwdXRuYW1lKGZpbGVuYW1lKTsKK291dDoKKyAgICAgICAgcmV0dXJuIGVycm9yOworfQorCisKKyNpZmRlZiBDT05GSUdfTU9EVUxFUworCithc21saW5rYWdlIGxvbmcKK3N5czMyX2luaXRfbW9kdWxlKHZvaWQgX191c2VyICp1bW9kLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJY29uc3QgY2hhciBfX3VzZXIgKnVhcmdzKQoreworCXJldHVybiBzeXNfaW5pdF9tb2R1bGUodW1vZCwgbGVuLCB1YXJncyk7Cit9CisKK2FzbWxpbmthZ2UgbG9uZworc3lzMzJfZGVsZXRlX21vZHVsZShjb25zdCBjaGFyIF9fdXNlciAqbmFtZV91c2VyLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIHN5c19kZWxldGVfbW9kdWxlKG5hbWVfdXNlciwgZmxhZ3MpOworfQorCisjZWxzZSAvKiBDT05GSUdfTU9EVUxFUyAqLworCithc21saW5rYWdlIGxvbmcKK3N5czMyX2luaXRfbW9kdWxlKHZvaWQgX191c2VyICp1bW9kLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJY29uc3QgY2hhciBfX3VzZXIgKnVhcmdzKQoreworCXJldHVybiAtRU5PU1lTOworfQorCithc21saW5rYWdlIGxvbmcKK3N5czMyX2RlbGV0ZV9tb2R1bGUoY29uc3QgY2hhciBfX3VzZXIgKm5hbWVfdXNlciwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXJldHVybiAtRU5PU1lTOworfQorCisjZW5kaWYgIC8qIENPTkZJR19NT0RVTEVTICovCisKKy8qIFRyYW5zbGF0aW9ucyBkdWUgdG8gdGltZV90IHNpemUgZGlmZmVyZW5jZXMuICBXaGljaCBhZmZlY3RzIGFsbAorICAgc29ydHMgb2YgdGhpbmdzLCBsaWtlIHRpbWV2YWwgYW5kIGl0aW1lcnZhbC4gICovCisKK2V4dGVybiBzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6OworCithc21saW5rYWdlIGxvbmcgc3lzMzJfZ2V0dGltZW9mZGF5KHN0cnVjdCBjb21wYXRfdGltZXZhbCAqdHYsIHN0cnVjdCB0aW1lem9uZSAqdHopCit7CisJaWYgKHR2KSB7CisJCXN0cnVjdCB0aW1ldmFsIGt0djsKKwkJZG9fZ2V0dGltZW9mZGF5KCZrdHYpOworCQlpZiAocHV0X3R2MzIodHYsICZrdHYpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWlmICh0eikgeworCQlpZiAoY29weV90b191c2VyKHR6LCAmc3lzX3R6LCBzaXplb2Yoc3lzX3R6KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBnZXRfdHMzMihzdHJ1Y3QgdGltZXNwZWMgKm8sIHN0cnVjdCBjb21wYXRfdGltZXZhbCAqaSkKK3sKKwlsb25nIHVzZWM7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgaSwgc2l6ZW9mKCppKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChfX2dldF91c2VyKG8tPnR2X3NlYywgJmktPnR2X3NlYykpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChfX2dldF91c2VyKHVzZWMsICZpLT50dl91c2VjKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJby0+dHZfbnNlYyA9IHVzZWMgKiAxMDAwOworCXJldHVybiAwOworfQorCithc21saW5rYWdlIGxvbmcgc3lzMzJfc2V0dGltZW9mZGF5KHN0cnVjdCBjb21wYXRfdGltZXZhbCAqdHYsIHN0cnVjdCB0aW1lem9uZSAqdHopCit7CisJc3RydWN0IHRpbWVzcGVjIGt0czsKKwlzdHJ1Y3QgdGltZXpvbmUga3R6OworCisgCWlmICh0dikgeworCQlpZiAoZ2V0X3RzMzIoJmt0cywgdHYpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWlmICh0eikgeworCQlpZiAoY29weV9mcm9tX3VzZXIoJmt0eiwgdHosIHNpemVvZihrdHopKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiBkb19zeXNfc2V0dGltZW9mZGF5KHR2ID8gJmt0cyA6IE5VTEwsIHR6ID8gJmt0eiA6IE5VTEwpOworfQorCisvKiBUaGVzZSBhcmUgaGVyZSBqdXN0IGluIGNhc2Ugc29tZSBvbGQgc3BhcmMzMiBiaW5hcnkgY2FsbHMgaXQuICovCithc21saW5rYWdlIGxvbmcgc3lzMzJfcGF1c2Uodm9pZCkKK3sKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwlzY2hlZHVsZSgpOworCXJldHVybiAtRVJFU1RBUlROT0hBTkQ7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXMzMl9wcmVhZDY0KHVuc2lnbmVkIGludCBmZCwgY2hhciAqdWJ1ZiwKKwkJCQlzaXplX3QgY291bnQsIHUzMiBwb3NoaSwgdTMyIHBvc2xvKQoreworCWlmICgoY29tcGF0X3NzaXplX3QpIGNvdW50IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHN5c19wcmVhZDY0KGZkLCB1YnVmLCBjb3VudCwgKChsb2ZmX3QpQUEocG9zaGkpIDw8IDMyKSB8IEFBKHBvc2xvKSk7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXMzMl9wd3JpdGU2NCh1bnNpZ25lZCBpbnQgZmQsIGNvbnN0IGNoYXIgKnVidWYsCisJCQkJc2l6ZV90IGNvdW50LCB1MzIgcG9zaGksIHUzMiBwb3NsbykKK3sKKwlpZiAoKGNvbXBhdF9zc2l6ZV90KSBjb3VudCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBzeXNfcHdyaXRlNjQoZmQsIHVidWYsIGNvdW50LCAoKGxvZmZfdClBQShwb3NoaSkgPDwgMzIpIHwgQUEocG9zbG8pKTsKK30KKworYXNtbGlua2FnZSBjb21wYXRfc3NpemVfdCBzeXMzMl9yZWFkYWhlYWQoaW50IGZkLCB1MzIgb2ZmaGksIHUzMiBvZmZsbywgczMyIGNvdW50KQoreworCXJldHVybiBzeXNfcmVhZGFoZWFkKGZkLCAoKGxvZmZfdClBQShvZmZoaSkgPDwgMzIpIHwgQUEob2ZmbG8pLCBjb3VudCk7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXMzMl9zZW5kZmlsZShpbnQgb3V0X2ZkLCBpbnQgaW5fZmQsIGNvbXBhdF9vZmZfdCAqb2Zmc2V0LCBzaXplX3QgY291bnQpCit7CisJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOworCWludCByZXQ7CisJb2ZmX3Qgb2Y7CisJCisJaWYgKG9mZnNldCAmJiBnZXRfdXNlcihvZiwgb2Zmc2V0KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCQorCXNldF9mcyhLRVJORUxfRFMpOworCXJldCA9IHN5c19zZW5kZmlsZShvdXRfZmQsIGluX2ZkLCBvZmZzZXQgPyAmb2YgOiBOVUxMLCBjb3VudCk7CisJc2V0X2ZzKG9sZF9mcyk7CisJCisJaWYgKCFyZXQgJiYgb2Zmc2V0ICYmIHB1dF91c2VyKG9mLCBvZmZzZXQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkJCisJcmV0dXJuIHJldDsKK30KKworYXNtbGlua2FnZSBsb25nIHN5czMyX3NlbmRmaWxlNjQoaW50IG91dF9mZCwgaW50IGluX2ZkLAorCQkJCWNvbXBhdF9sb2ZmX3QgKm9mZnNldCwgczMyIGNvdW50KQoreworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKwlpbnQgcmV0OworCWxvZmZfdCBsb2Y7CisJCisJaWYgKG9mZnNldCAmJiBnZXRfdXNlcihsb2YsIG9mZnNldCkpCisJCXJldHVybiAtRUZBVUxUOworCQkKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwlyZXQgPSBzeXNfc2VuZGZpbGU2NChvdXRfZmQsIGluX2ZkLCBvZmZzZXQgPyAmbG9mIDogTlVMTCwgY291bnQpOworCXNldF9mcyhvbGRfZnMpOworCQorCWlmIChvZmZzZXQgJiYgcHV0X3VzZXIobG9mLCBvZmZzZXQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkJCisJcmV0dXJuIHJldDsKK30KKworLyogSGFuZGxlIGFkanRpbWV4IGNvbXBhdGliaWxpdHkuICovCisKK3N0cnVjdCB0aW1leDMyIHsKKwl1MzIgbW9kZXM7CisJczMyIG9mZnNldCwgZnJlcSwgbWF4ZXJyb3IsIGVzdGVycm9yOworCXMzMiBzdGF0dXMsIGNvbnN0YW50LCBwcmVjaXNpb24sIHRvbGVyYW5jZTsKKwlzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgdGltZTsKKwlzMzIgdGljazsKKwlzMzIgcHBzZnJlcSwgaml0dGVyLCBzaGlmdCwgc3RhYmlsOworCXMzMiBqaXRjbnQsIGNhbGNudCwgZXJyY250LCBzdGJjbnQ7CisJczMyICA6MzI7IHMzMiAgOjMyOyBzMzIgIDozMjsgczMyICA6MzI7CisJczMyICA6MzI7IHMzMiAgOjMyOyBzMzIgIDozMjsgczMyICA6MzI7CisJczMyICA6MzI7IHMzMiAgOjMyOyBzMzIgIDozMjsgczMyICA6MzI7Cit9OworCitleHRlcm4gaW50IGRvX2FkanRpbWV4KHN0cnVjdCB0aW1leCAqKTsKKworYXNtbGlua2FnZSBsb25nIHN5czMyX2FkanRpbWV4KHN0cnVjdCB0aW1leDMyICp1dHApCit7CisJc3RydWN0IHRpbWV4IHR4YzsKKwlpbnQgcmV0OworCisJbWVtc2V0KCZ0eGMsIDAsIHNpemVvZihzdHJ1Y3QgdGltZXgpKTsKKworCWlmKGdldF91c2VyKHR4Yy5tb2RlcywgJnV0cC0+bW9kZXMpIHx8CisJICAgX19nZXRfdXNlcih0eGMub2Zmc2V0LCAmdXRwLT5vZmZzZXQpIHx8CisJICAgX19nZXRfdXNlcih0eGMuZnJlcSwgJnV0cC0+ZnJlcSkgfHwKKwkgICBfX2dldF91c2VyKHR4Yy5tYXhlcnJvciwgJnV0cC0+bWF4ZXJyb3IpIHx8CisJICAgX19nZXRfdXNlcih0eGMuZXN0ZXJyb3IsICZ1dHAtPmVzdGVycm9yKSB8fAorCSAgIF9fZ2V0X3VzZXIodHhjLnN0YXR1cywgJnV0cC0+c3RhdHVzKSB8fAorCSAgIF9fZ2V0X3VzZXIodHhjLmNvbnN0YW50LCAmdXRwLT5jb25zdGFudCkgfHwKKwkgICBfX2dldF91c2VyKHR4Yy5wcmVjaXNpb24sICZ1dHAtPnByZWNpc2lvbikgfHwKKwkgICBfX2dldF91c2VyKHR4Yy50b2xlcmFuY2UsICZ1dHAtPnRvbGVyYW5jZSkgfHwKKwkgICBfX2dldF91c2VyKHR4Yy50aW1lLnR2X3NlYywgJnV0cC0+dGltZS50dl9zZWMpIHx8CisJICAgX19nZXRfdXNlcih0eGMudGltZS50dl91c2VjLCAmdXRwLT50aW1lLnR2X3VzZWMpIHx8CisJICAgX19nZXRfdXNlcih0eGMudGljaywgJnV0cC0+dGljaykgfHwKKwkgICBfX2dldF91c2VyKHR4Yy5wcHNmcmVxLCAmdXRwLT5wcHNmcmVxKSB8fAorCSAgIF9fZ2V0X3VzZXIodHhjLmppdHRlciwgJnV0cC0+aml0dGVyKSB8fAorCSAgIF9fZ2V0X3VzZXIodHhjLnNoaWZ0LCAmdXRwLT5zaGlmdCkgfHwKKwkgICBfX2dldF91c2VyKHR4Yy5zdGFiaWwsICZ1dHAtPnN0YWJpbCkgfHwKKwkgICBfX2dldF91c2VyKHR4Yy5qaXRjbnQsICZ1dHAtPmppdGNudCkgfHwKKwkgICBfX2dldF91c2VyKHR4Yy5jYWxjbnQsICZ1dHAtPmNhbGNudCkgfHwKKwkgICBfX2dldF91c2VyKHR4Yy5lcnJjbnQsICZ1dHAtPmVycmNudCkgfHwKKwkgICBfX2dldF91c2VyKHR4Yy5zdGJjbnQsICZ1dHAtPnN0YmNudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0ID0gZG9fYWRqdGltZXgoJnR4Yyk7CisKKwlpZihwdXRfdXNlcih0eGMubW9kZXMsICZ1dHAtPm1vZGVzKSB8fAorCSAgIF9fcHV0X3VzZXIodHhjLm9mZnNldCwgJnV0cC0+b2Zmc2V0KSB8fAorCSAgIF9fcHV0X3VzZXIodHhjLmZyZXEsICZ1dHAtPmZyZXEpIHx8CisJICAgX19wdXRfdXNlcih0eGMubWF4ZXJyb3IsICZ1dHAtPm1heGVycm9yKSB8fAorCSAgIF9fcHV0X3VzZXIodHhjLmVzdGVycm9yLCAmdXRwLT5lc3RlcnJvcikgfHwKKwkgICBfX3B1dF91c2VyKHR4Yy5zdGF0dXMsICZ1dHAtPnN0YXR1cykgfHwKKwkgICBfX3B1dF91c2VyKHR4Yy5jb25zdGFudCwgJnV0cC0+Y29uc3RhbnQpIHx8CisJICAgX19wdXRfdXNlcih0eGMucHJlY2lzaW9uLCAmdXRwLT5wcmVjaXNpb24pIHx8CisJICAgX19wdXRfdXNlcih0eGMudG9sZXJhbmNlLCAmdXRwLT50b2xlcmFuY2UpIHx8CisJICAgX19wdXRfdXNlcih0eGMudGltZS50dl9zZWMsICZ1dHAtPnRpbWUudHZfc2VjKSB8fAorCSAgIF9fcHV0X3VzZXIodHhjLnRpbWUudHZfdXNlYywgJnV0cC0+dGltZS50dl91c2VjKSB8fAorCSAgIF9fcHV0X3VzZXIodHhjLnRpY2ssICZ1dHAtPnRpY2spIHx8CisJICAgX19wdXRfdXNlcih0eGMucHBzZnJlcSwgJnV0cC0+cHBzZnJlcSkgfHwKKwkgICBfX3B1dF91c2VyKHR4Yy5qaXR0ZXIsICZ1dHAtPmppdHRlcikgfHwKKwkgICBfX3B1dF91c2VyKHR4Yy5zaGlmdCwgJnV0cC0+c2hpZnQpIHx8CisJICAgX19wdXRfdXNlcih0eGMuc3RhYmlsLCAmdXRwLT5zdGFiaWwpIHx8CisJICAgX19wdXRfdXNlcih0eGMuaml0Y250LCAmdXRwLT5qaXRjbnQpIHx8CisJICAgX19wdXRfdXNlcih0eGMuY2FsY250LCAmdXRwLT5jYWxjbnQpIHx8CisJICAgX19wdXRfdXNlcih0eGMuZXJyY250LCAmdXRwLT5lcnJjbnQpIHx8CisJICAgX19wdXRfdXNlcih0eGMuc3RiY250LCAmdXRwLT5zdGJjbnQpKQorCQlyZXQgPSAtRUZBVUxUOworCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19TWVNDVEwKK3N0cnVjdCBfX3N5c2N0bF9hcmdzMzIgeworCXUzMiBuYW1lOworCWludCBubGVuOworCXUzMiBvbGR2YWw7CisJdTMyIG9sZGxlbnA7CisJdTMyIG5ld3ZhbDsKKwl1MzIgbmV3bGVuOworCXUzMiBfX3VudXNlZFs0XTsKK307CisKK2FzbWxpbmthZ2UgbG9uZyBzeXMzMl9zeXNjdGwoc3RydWN0IF9fc3lzY3RsX2FyZ3MzMiAqYXJncykKK3sKKwlzdHJ1Y3QgX19zeXNjdGxfYXJnczMyIHRtcDsKKwlpbnQgZXJyb3I7CisJc2l6ZV90IG9sZGxlbiwgKm9sZGxlbnAgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgYWRkciA9ICgoKGxvbmcpJmFyZ3MtPl9fdW51c2VkWzBdKSArIDcpICYgfjc7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwgYXJncywgc2l6ZW9mKHRtcCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICh0bXAub2xkdmFsICYmIHRtcC5vbGRsZW5wKSB7CisJCS8qIER1aCwgdGhpcyBpcyB1Z2x5IGFuZCBtaWdodCBub3Qgd29yayBpZiBzeXNjdGxfYXJncworCQkgICBpcyBpbiByZWFkLW9ubHkgbWVtb3J5LCBidXQgZG9fc3lzY3RsIGRvZXMgaW5kaXJlY3RseQorCQkgICBhIGxvdCBvZiB1YWNjZXNzIGluIGJvdGggZGlyZWN0aW9ucyBhbmQgd2UnZCBoYXZlIHRvCisJCSAgIGJhc2ljYWxseSBjb3B5IHRoZSB3aG9sZSBzeXNjdGwuYyBoZXJlLCBhbmQKKwkJICAgZ2xpYmMncyBfX3N5c2N0bCB1c2VzIHJ3IG1lbW9yeSBmb3IgdGhlIHN0cnVjdHVyZQorCQkgICBhbnl3YXkuICAqLworCQlpZiAoZ2V0X3VzZXIob2xkbGVuLCAodTMyICopQSh0bXAub2xkbGVucCkpIHx8CisJCSAgICBwdXRfdXNlcihvbGRsZW4sIChzaXplX3QgKilhZGRyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlvbGRsZW5wID0gKHNpemVfdCAqKWFkZHI7CisJfQorCisJbG9ja19rZXJuZWwoKTsKKwllcnJvciA9IGRvX3N5c2N0bCgoaW50ICopQSh0bXAubmFtZSksIHRtcC5ubGVuLCAodm9pZCAqKUEodG1wLm9sZHZhbCksCisJCQkgIG9sZGxlbnAsICh2b2lkICopQSh0bXAubmV3dmFsKSwgdG1wLm5ld2xlbik7CisJdW5sb2NrX2tlcm5lbCgpOworCWlmIChvbGRsZW5wKSB7CisJCWlmICghZXJyb3IpIHsKKwkJCWlmIChnZXRfdXNlcihvbGRsZW4sIChzaXplX3QgKilhZGRyKSB8fAorCQkJICAgIHB1dF91c2VyKG9sZGxlbiwgKHUzMiAqKUEodG1wLm9sZGxlbnApKSkKKwkJCQllcnJvciA9IC1FRkFVTFQ7CisJCX0KKwkJY29weV90b191c2VyKGFyZ3MtPl9fdW51c2VkLCB0bXAuX191bnVzZWQsIHNpemVvZih0bXAuX191bnVzZWQpKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorI2VuZGlmCisKK3N0cnVjdCBzdGF0NjRfZW11MzEgeworCXVuc2lnbmVkIGxvbmcgbG9uZyAgc3RfZGV2OworCXVuc2lnbmVkIGludCAgICBfX3BhZDE7CisjZGVmaW5lIFNUQVQ2NF9IQVNfQlJPS0VOX1NUX0lOTyAgICAgICAgMQorCXUzMiAgICAgICAgICAgICBfX3N0X2lubzsKKwl1bnNpZ25lZCBpbnQgICAgc3RfbW9kZTsKKwl1bnNpZ25lZCBpbnQgICAgc3Rfbmxpbms7CisJdTMyICAgICAgICAgICAgIHN0X3VpZDsKKwl1MzIgICAgICAgICAgICAgc3RfZ2lkOworCXVuc2lnbmVkIGxvbmcgbG9uZyAgc3RfcmRldjsKKwl1bnNpZ25lZCBpbnQgICAgX19wYWQzOworCWxvbmcgICAgICAgICAgICBzdF9zaXplOworCXUzMiAgICAgICAgICAgICBzdF9ibGtzaXplOworCXVuc2lnbmVkIGNoYXIgICBfX3BhZDRbNF07CisJdTMyICAgICAgICAgICAgIF9fcGFkNTsgICAgIC8qIGZ1dHVyZSBwb3NzaWJsZSBzdF9ibG9ja3MgaGlnaCBiaXRzICovCisJdTMyICAgICAgICAgICAgIHN0X2Jsb2NrczsgIC8qIE51bWJlciA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkLiAqLworCXUzMiAgICAgICAgICAgICBzdF9hdGltZTsKKwl1MzIgICAgICAgICAgICAgX19wYWQ2OworCXUzMiAgICAgICAgICAgICBzdF9tdGltZTsKKwl1MzIgICAgICAgICAgICAgX19wYWQ3OworCXUzMiAgICAgICAgICAgICBzdF9jdGltZTsKKwl1MzIgICAgICAgICAgICAgX19wYWQ4OyAgICAgLyogd2lsbCBiZSBoaWdoIDMyIGJpdHMgb2YgY3RpbWUgc29tZWRheSAqLworCXVuc2lnbmVkIGxvbmcgICBzdF9pbm87Cit9OwkKKworc3RhdGljIGludCBjcF9zdGF0NjQoc3RydWN0IHN0YXQ2NF9lbXUzMSAqdWJ1Ziwgc3RydWN0IGtzdGF0ICpzdGF0KQoreworCXN0cnVjdCBzdGF0NjRfZW11MzEgdG1wOworCisJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKworCXRtcC5zdF9kZXYgPSBodWdlX2VuY29kZV9kZXYoc3RhdC0+ZGV2KTsKKwl0bXAuc3RfaW5vID0gc3RhdC0+aW5vOworCXRtcC5fX3N0X2lubyA9ICh1MzIpc3RhdC0+aW5vOworCXRtcC5zdF9tb2RlID0gc3RhdC0+bW9kZTsKKwl0bXAuc3RfbmxpbmsgPSAodW5zaWduZWQgaW50KXN0YXQtPm5saW5rOworCXRtcC5zdF91aWQgPSBzdGF0LT51aWQ7CisJdG1wLnN0X2dpZCA9IHN0YXQtPmdpZDsKKwl0bXAuc3RfcmRldiA9IGh1Z2VfZW5jb2RlX2RldihzdGF0LT5yZGV2KTsKKwl0bXAuc3Rfc2l6ZSA9IHN0YXQtPnNpemU7CisJdG1wLnN0X2Jsa3NpemUgPSAodTMyKXN0YXQtPmJsa3NpemU7CisJdG1wLnN0X2Jsb2NrcyA9ICh1MzIpc3RhdC0+YmxvY2tzOworCXRtcC5zdF9hdGltZSA9ICh1MzIpc3RhdC0+YXRpbWUudHZfc2VjOworCXRtcC5zdF9tdGltZSA9ICh1MzIpc3RhdC0+bXRpbWUudHZfc2VjOworCXRtcC5zdF9jdGltZSA9ICh1MzIpc3RhdC0+Y3RpbWUudHZfc2VjOworCisJcmV0dXJuIGNvcHlfdG9fdXNlcih1YnVmLCZ0bXAsc2l6ZW9mKHRtcCkpID8gLUVGQVVMVCA6IDA7IAorfQorCithc21saW5rYWdlIGxvbmcgc3lzMzJfc3RhdDY0KGNoYXIgKiBmaWxlbmFtZSwgc3RydWN0IHN0YXQ2NF9lbXUzMSAqIHN0YXRidWYpCit7CisJc3RydWN0IGtzdGF0IHN0YXQ7CisJaW50IHJldCA9IHZmc19zdGF0KGZpbGVuYW1lLCAmc3RhdCk7CisJaWYgKCFyZXQpCisJCXJldCA9IGNwX3N0YXQ2NChzdGF0YnVmLCAmc3RhdCk7CisJcmV0dXJuIHJldDsKK30KKworYXNtbGlua2FnZSBsb25nIHN5czMyX2xzdGF0NjQoY2hhciAqIGZpbGVuYW1lLCBzdHJ1Y3Qgc3RhdDY0X2VtdTMxICogc3RhdGJ1ZikKK3sKKwlzdHJ1Y3Qga3N0YXQgc3RhdDsKKwlpbnQgcmV0ID0gdmZzX2xzdGF0KGZpbGVuYW1lLCAmc3RhdCk7CisJaWYgKCFyZXQpCisJCXJldCA9IGNwX3N0YXQ2NChzdGF0YnVmLCAmc3RhdCk7CisJcmV0dXJuIHJldDsKK30KKworYXNtbGlua2FnZSBsb25nIHN5czMyX2ZzdGF0NjQodW5zaWduZWQgbG9uZyBmZCwgc3RydWN0IHN0YXQ2NF9lbXUzMSAqIHN0YXRidWYpCit7CisJc3RydWN0IGtzdGF0IHN0YXQ7CisJaW50IHJldCA9IHZmc19mc3RhdChmZCwgJnN0YXQpOworCWlmICghcmV0KQorCQlyZXQgPSBjcF9zdGF0NjQoc3RhdGJ1ZiwgJnN0YXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBMaW51eC9pMzg2IGRpZG4ndCB1c2UgdG8gYmUgYWJsZSB0byBoYW5kbGUgbW9yZSB0aGFuCisgKiA0IHN5c3RlbSBjYWxsIHBhcmFtZXRlcnMsIHNvIHRoZXNlIHN5c3RlbSBjYWxscyB1c2VkIGEgbWVtb3J5CisgKiBibG9jayBmb3IgcGFyYW1ldGVyIHBhc3NpbmcuLgorICovCisKK3N0cnVjdCBtbWFwX2FyZ19zdHJ1Y3RfZW11MzEgeworCXUzMglhZGRyOworCXUzMglsZW47CisJdTMyCXByb3Q7CisJdTMyCWZsYWdzOworCXUzMglmZDsKKwl1MzIJb2Zmc2V0OworfTsKKworLyogY29tbW9uIGNvZGUgZm9yIG9sZCBhbmQgbmV3IG1tYXBzICovCitzdGF0aWMgaW5saW5lIGxvbmcgZG9fbW1hcDIoCisJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwl1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKK3sKKwlzdHJ1Y3QgZmlsZSAqIGZpbGUgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZXJyb3IgPSAtRUJBREY7CisKKwlmbGFncyAmPSB+KE1BUF9FWEVDVVRBQkxFIHwgTUFQX0RFTllXUklURSk7CisJaWYgKCEoZmxhZ3MgJiBNQVBfQU5PTllNT1VTKSkgeworCQlmaWxlID0gZmdldChmZCk7CisJCWlmICghZmlsZSkKKwkJCWdvdG8gb3V0OworCX0KKworCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJZXJyb3IgPSBkb19tbWFwX3Bnb2ZmKGZpbGUsIGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIHBnb2ZmKTsKKwlpZiAoIUlTX0VSUigodm9pZCAqKSBlcnJvcikgJiYgZXJyb3IgKyBsZW4gPj0gMHg4MDAwMDAwMFVMTCkgeworCQkvKiBSZXN1bHQgaXMgb3V0IG9mIGJvdW5kcy4gICovCisJCWRvX211bm1hcChjdXJyZW50LT5tbSwgYWRkciwgbGVuKTsKKwkJZXJyb3IgPSAtRU5PTUVNOworCX0KKwl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKworCWlmIChmaWxlKQorCQlmcHV0KGZpbGUpOworb3V0OiAgICAKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nCitvbGQzMl9tbWFwKHN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3RfZW11MzEgKmFyZykKK3sKKwlzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0X2VtdTMxIGE7CisJaW50IGVycm9yID0gLUVGQVVMVDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmYSwgYXJnLCBzaXplb2YoYSkpKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gLUVJTlZBTDsKKwlpZiAoYS5vZmZzZXQgJiB+UEFHRV9NQVNLKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gZG9fbW1hcDIoYS5hZGRyLCBhLmxlbiwgYS5wcm90LCBhLmZsYWdzLCBhLmZkLCBhLm9mZnNldCA+PiBQQUdFX1NISUZUKTsgCitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCithc21saW5rYWdlIGxvbmcgCitzeXMzMl9tbWFwMihzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0X2VtdTMxICphcmcpCit7CisJc3RydWN0IG1tYXBfYXJnX3N0cnVjdF9lbXUzMSBhOworCWludCBlcnJvciA9IC1FRkFVTFQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmEsIGFyZywgc2l6ZW9mKGEpKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkb19tbWFwMihhLmFkZHIsIGEubGVuLCBhLnByb3QsIGEuZmxhZ3MsIGEuZmQsIGEub2Zmc2V0KTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXMzMl9yZWFkKHVuc2lnbmVkIGludCBmZCwgY2hhciAqIGJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWlmICgoY29tcGF0X3NzaXplX3QpIGNvdW50IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7IAorCisJcmV0dXJuIHN5c19yZWFkKGZkLCBidWYsIGNvdW50KTsKK30KKworYXNtbGlua2FnZSBsb25nIHN5czMyX3dyaXRlKHVuc2lnbmVkIGludCBmZCwgY2hhciAqIGJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWlmICgoY29tcGF0X3NzaXplX3QpIGNvdW50IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7IAorCisJcmV0dXJuIHN5c193cml0ZShmZCwgYnVmLCBjb3VudCk7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXMzMl9jbG9uZShzdHJ1Y3QgcHRfcmVncyByZWdzKQoreworICAgICAgICB1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzOworICAgICAgICB1bnNpZ25lZCBsb25nIG5ld3NwOworCWludCAqcGFyZW50X3RpZHB0ciwgKmNoaWxkX3RpZHB0cjsKKworICAgICAgICBjbG9uZV9mbGFncyA9IHJlZ3MuZ3Byc1szXSAmIDB4ZmZmZmZmZmZVTDsKKyAgICAgICAgbmV3c3AgPSByZWdzLm9yaWdfZ3ByMiAmIDB4N2ZmZmZmZmZVTDsKKwlwYXJlbnRfdGlkcHRyID0gKGludCAqKSAocmVncy5ncHJzWzRdICYgMHg3ZmZmZmZmZlVMKTsKKwljaGlsZF90aWRwdHIgPSAoaW50ICopIChyZWdzLmdwcnNbNV0gJiAweDdmZmZmZmZmVUwpOworICAgICAgICBpZiAoIW5ld3NwKQorICAgICAgICAgICAgICAgIG5ld3NwID0gcmVncy5ncHJzWzE1XTsKKyAgICAgICAgcmV0dXJuIGRvX2ZvcmsoY2xvbmVfZmxhZ3MsIG5ld3NwLCAmcmVncywgMCwKKwkJICAgICAgIHBhcmVudF90aWRwdHIsIGNoaWxkX3RpZHB0cik7Cit9CisKKy8qCisgKiBXcmFwcGVyIGZ1bmN0aW9uIGZvciBzeXNfdGltZXJfY3JlYXRlLgorICovCitleHRlcm4gYXNtbGlua2FnZSBsb25nCitzeXNfdGltZXJfY3JlYXRlKGNsb2NraWRfdCwgc3RydWN0IHNpZ2V2ZW50ICosIHRpbWVyX3QgKik7CisKK2FzbWxpbmthZ2UgbG9uZworc3lzMzJfdGltZXJfY3JlYXRlKGNsb2NraWRfdCB3aGljaF9jbG9jaywgc3RydWN0IGNvbXBhdF9zaWdldmVudCAqc2UzMiwKKwkJdGltZXJfdCAqdGltZXJfaWQpCit7CisJc3RydWN0IHNpZ2V2ZW50IHNlOworCXRpbWVyX3Qga3RpbWVyX2lkOworCW1tX3NlZ21lbnRfdCBvbGRfZnM7CisJbG9uZyByZXQ7CisKKwlpZiAoc2UzMiA9PSBOVUxMKQorCQlyZXR1cm4gc3lzX3RpbWVyX2NyZWF0ZSh3aGljaF9jbG9jaywgTlVMTCwgdGltZXJfaWQpOworCisJaWYgKGdldF9jb21wYXRfc2lnZXZlbnQoJnNlLCBzZTMyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlvbGRfZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwlyZXQgPSBzeXNfdGltZXJfY3JlYXRlKHdoaWNoX2Nsb2NrLCAmc2UsICZrdGltZXJfaWQpOworCXNldF9mcyhvbGRfZnMpOworCisJaWYgKCFyZXQpCisJCXJldCA9IHB1dF91c2VyIChrdGltZXJfaWQsIHRpbWVyX2lkKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5oIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjMzZGNmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguaApAQCAtMCwwICsxLDE5NyBAQAorI2lmbmRlZiBfQVNNX1MzOTBYX1MzOTBfSAorI2RlZmluZSBfQVNNX1MzOTBYX1MzOTBfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9leHBvcnQuaD4KKworLyogTWFjcm8gdGhhdCBtYXNrcyB0aGUgaGlnaCBvcmRlciBiaXQgb2YgYW4gMzIgYml0IHBvaW50ZXIgYW5kIGNvbnZlcnRzIGl0Ki8KKy8qICAgICAgIHRvIGEgNjQgYml0IHBvaW50ZXIgKi8KKyNkZWZpbmUgQShfX3gpICgodW5zaWduZWQgbG9uZykoKF9feCkgJiAweDdGRkZGRkZGVUwpKQorI2RlZmluZSBBQShfX3gpCQkJCVwKKwkoKHVuc2lnbmVkIGxvbmcpKF9feCkpCisKKy8qIE5vdyAzMmJpdCBjb21wYXRpYmlsaXR5IHR5cGVzICovCitzdHJ1Y3QgaXBjX2tsdWRnZV8zMiB7CisgICAgICAgIF9fdTMyICAgbXNncDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb2ludGVyICAgICAgICAgICAgICAqLworICAgICAgICBfX3MzMiAgIG1zZ3R5cDsKK307CisKK3N0cnVjdCBvbGRfc2lnYWN0aW9uMzIgeworICAgICAgIF9fdTMyCQkJc2FfaGFuZGxlcjsJLyogUmVhbGx5IGEgcG9pbnRlciwgYnV0IG5lZWQgdG8gZGVhbCB3aXRoIDMyIGJpdHMgKi8KKyAgICAgICBjb21wYXRfb2xkX3NpZ3NldF90CXNhX21hc2s7CS8qIEEgMzIgYml0IG1hc2sgKi8KKyAgICAgICBfX3UzMgkJCXNhX2ZsYWdzOworICAgICAgIF9fdTMyCQkJc2FfcmVzdG9yZXI7CS8qIEFub3RoZXIgMzIgYml0IHBvaW50ZXIgKi8KK307CisgCit0eXBlZGVmIHN0cnVjdCBjb21wYXRfc2lnaW5mbyB7CisJaW50CXNpX3NpZ25vOworCWludAlzaV9lcnJubzsKKwlpbnQJc2lfY29kZTsKKworCXVuaW9uIHsKKwkJaW50IF9wYWRbKCgxMjgvc2l6ZW9mKGludCkpIC0gMyldOworCisJCS8qIGtpbGwoKSAqLworCQlzdHJ1Y3QgeworCQkJcGlkX3QJX3BpZDsJLyogc2VuZGVyJ3MgcGlkICovCisJCQl1aWRfdAlfdWlkOwkvKiBzZW5kZXIncyB1aWQgKi8KKwkJfSBfa2lsbDsKKworCQkvKiBQT1NJWC4xYiB0aW1lcnMgKi8KKwkJc3RydWN0IHsKKwkJCXRpbWVyX3QgX3RpZDsJCS8qIHRpbWVyIGlkICovCisJCQlpbnQgX292ZXJydW47CQkvKiBvdmVycnVuIGNvdW50ICovCisJCQljb21wYXRfc2lndmFsX3QgX3NpZ3ZhbDsJLyogc2FtZSBhcyBiZWxvdyAqLworCQkJaW50IF9zeXNfcHJpdmF0ZTsgICAgICAgLyogbm90IHRvIGJlIHBhc3NlZCB0byB1c2VyICovCisJCX0gX3RpbWVyOworCisJCS8qIFBPU0lYLjFiIHNpZ25hbHMgKi8KKwkJc3RydWN0IHsKKwkJCXBpZF90CQkJX3BpZDsJLyogc2VuZGVyJ3MgcGlkICovCisJCQl1aWRfdAkJCV91aWQ7CS8qIHNlbmRlcidzIHVpZCAqLworCQkJY29tcGF0X3NpZ3ZhbF90CQlfc2lndmFsOworCQl9IF9ydDsKKworCQkvKiBTSUdDSExEICovCisJCXN0cnVjdCB7CisJCQlwaWRfdAkJCV9waWQ7CS8qIHdoaWNoIGNoaWxkICovCisJCQl1aWRfdAkJCV91aWQ7CS8qIHNlbmRlcidzIHVpZCAqLworCQkJaW50CQkJX3N0YXR1czsvKiBleGl0IGNvZGUgKi8KKwkJCWNvbXBhdF9jbG9ja190CQlfdXRpbWU7CisJCQljb21wYXRfY2xvY2tfdAkJX3N0aW1lOworCQl9IF9zaWdjaGxkOworCisJCS8qIFNJR0lMTCwgU0lHRlBFLCBTSUdTRUdWLCBTSUdCVVMgKi8KKwkJc3RydWN0IHsKKwkJCV9fdTMyCV9hZGRyOwkvKiBmYXVsdGluZyBpbnNuL21lbW9yeSByZWYuIC0gcG9pbnRlciAqLworCQl9IF9zaWdmYXVsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCS8qIFNJR1BPTEwgKi8KKwkJc3RydWN0IHsKKwkJCWludAlfYmFuZDsJLyogUE9MTF9JTiwgUE9MTF9PVVQsIFBPTExfTVNHICovCisJCQlpbnQJX2ZkOworCQl9IF9zaWdwb2xsOworCX0gX3NpZmllbGRzOworfSBjb21wYXRfc2lnaW5mb190OworCisvKgorICogSG93IHRoZXNlIGZpZWxkcyBhcmUgdG8gYmUgYWNjZXNzZWQuCisgKi8KKyNkZWZpbmUgc2lfcGlkCQlfc2lmaWVsZHMuX2tpbGwuX3BpZAorI2RlZmluZSBzaV91aWQJCV9zaWZpZWxkcy5fa2lsbC5fdWlkCisjZGVmaW5lIHNpX3N0YXR1cwlfc2lmaWVsZHMuX3NpZ2NobGQuX3N0YXR1cworI2RlZmluZSBzaV91dGltZQlfc2lmaWVsZHMuX3NpZ2NobGQuX3V0aW1lCisjZGVmaW5lIHNpX3N0aW1lCV9zaWZpZWxkcy5fc2lnY2hsZC5fc3RpbWUKKyNkZWZpbmUgc2lfdmFsdWUJX3NpZmllbGRzLl9ydC5fc2lndmFsCisjZGVmaW5lIHNpX2ludAkJX3NpZmllbGRzLl9ydC5fc2lndmFsLnNpdmFsX2ludAorI2RlZmluZSBzaV9wdHIJCV9zaWZpZWxkcy5fcnQuX3NpZ3ZhbC5zaXZhbF9wdHIKKyNkZWZpbmUgc2lfYWRkcgkJX3NpZmllbGRzLl9zaWdmYXVsdC5fYWRkcgorI2RlZmluZSBzaV9iYW5kCQlfc2lmaWVsZHMuX3NpZ3BvbGwuX2JhbmQKKyNkZWZpbmUgc2lfZmQJCV9zaWZpZWxkcy5fc2lncG9sbC5fZmQgICAgCisjZGVmaW5lIHNpX3RpZAkJX3NpZmllbGRzLl90aW1lci5fdGlkCisjZGVmaW5lIHNpX292ZXJydW4JX3NpZmllbGRzLl90aW1lci5fb3ZlcnJ1bgorCisvKiBhc20vc2lnY29udGV4dC5oICovCit0eXBlZGVmIHVuaW9uCit7CisJX191NjQgICBkOworCV9fdTMyICAgZjsgCit9IGZyZWdfdDMyOworCit0eXBlZGVmIHN0cnVjdAoreworCXVuc2lnbmVkIGludAlmcGM7CisJZnJlZ190MzIJZnByc1tfX05VTV9GUFJTXTsgICAgICAgICAgICAgIAorfSBfczM5MF9mcF9yZWdzMzI7CisKK3R5cGVkZWYgc3RydWN0IAoreworICAgICAgICBfX3UzMiAgIG1hc2s7CisgICAgICAgIF9fdTMyCWFkZHI7Cit9IF9wc3dfdDMyIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpKSk7CisKKyNkZWZpbmUgUFNXMzJfTUFTS19QRVIJCTB4NDAwMDAwMDBVTAorI2RlZmluZSBQU1czMl9NQVNLX0RBVAkJMHgwNDAwMDAwMFVMCisjZGVmaW5lIFBTVzMyX01BU0tfSU8JCTB4MDIwMDAwMDBVTAorI2RlZmluZSBQU1czMl9NQVNLX0VYVAkJMHgwMTAwMDAwMFVMCisjZGVmaW5lIFBTVzMyX01BU0tfS0VZCQkweDAwRjAwMDAwVUwKKyNkZWZpbmUgUFNXMzJfTUFTS19NQ0hFQ0sJMHgwMDA0MDAwMFVMCisjZGVmaW5lIFBTVzMyX01BU0tfV0FJVAkJMHgwMDAyMDAwMFVMCisjZGVmaW5lIFBTVzMyX01BU0tfUFNUQVRFCTB4MDAwMTAwMDBVTAorI2RlZmluZSBQU1czMl9NQVNLX0FTQwkJMHgwMDAwQzAwMFVMCisjZGVmaW5lIFBTVzMyX01BU0tfQ0MJCTB4MDAwMDMwMDBVTAorI2RlZmluZSBQU1czMl9NQVNLX1BNCQkweDAwMDAwZjAwVUwKKworI2RlZmluZSBQU1czMl9BRERSX0FNT0RFMzEJMHg4MDAwMDAwMFVMCisjZGVmaW5lIFBTVzMyX0FERFJfSU5TTgkJMHg3RkZGRkZGRlVMCisKKyNkZWZpbmUgUFNXMzJfQkFTRV9CSVRTCQkweDAwMDgwMDAwVUwKKworI2RlZmluZSBQU1czMl9BU0NfUFJJTUFSWQkweDAwMDAwMDAwVUwKKyNkZWZpbmUgUFNXMzJfQVNDX0FDQ1JFRwkweDAwMDA0MDAwVUwKKyNkZWZpbmUgUFNXMzJfQVNDX1NFQ09OREFSWQkweDAwMDA4MDAwVUwKKyNkZWZpbmUgUFNXMzJfQVNDX0hPTUUJCTB4MDAwMEMwMDBVTAorCisjZGVmaW5lIFBTVzMyX1VTRVJfQklUUwkoUFNXMzJfQkFTRV9CSVRTIHwgUFNXMzJfTUFTS19EQVQgfCBQU1czMl9BU0NfSE9NRSB8IFwKKwkJCSBQU1czMl9NQVNLX0lPIHwgUFNXMzJfTUFTS19FWFQgfCBQU1czMl9NQVNLX01DSEVDSyB8IFwKKwkJCSBQU1czMl9NQVNLX1BTVEFURSkKKworI2RlZmluZSBQU1czMl9NQVNLX01FUkdFKENVUlJFTlQsTkVXKSBcCisgICAgICAgICgoKENVUlJFTlQpICYgfihQU1czMl9NQVNLX0NDfFBTVzMyX01BU0tfUE0pKSB8IFwKKyAgICAgICAgICgoTkVXKSAmIChQU1czMl9NQVNLX0NDfFBTVzMyX01BU0tfUE0pKSkKKworCit0eXBlZGVmIHN0cnVjdAoreworCV9wc3dfdDMyCXBzdzsKKwlfX3UzMgkJZ3Byc1tfX05VTV9HUFJTXTsKKwlfX3UzMgkJYWNyc1tfX05VTV9BQ1JTXTsKK30gX3MzOTBfcmVnc19jb21tb24zMjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKwlfczM5MF9yZWdzX2NvbW1vbjMyIHJlZ3M7CisJX3MzOTBfZnBfcmVnczMyICAgICBmcHJlZ3M7Cit9IF9zaWdyZWdzMzI7CisKKyNkZWZpbmUgX1NJR0NPTlRFWFRfTlNJRzMyCTY0CisjZGVmaW5lIF9TSUdDT05URVhUX05TSUdfQlBXMzIJMzIKKyNkZWZpbmUgX19TSUdOQUxfRlJBTUVTSVpFMzIJOTYKKyNkZWZpbmUgX1NJR01BU0tfQ09QWV9TSVpFMzIJKHNpemVvZih1MzIpKjIpCisKK3N0cnVjdCBzaWdjb250ZXh0MzIKK3sKKwlfX3UzMglvbGRtYXNrW19DT01QQVRfTlNJR19XT1JEU107CisJX191MzIJc3JlZ3M7CQkJCS8qIHBvaW50ZXIgKi8KK307CisKKy8qIGFzbS9zaWduYWwuaCAqLworc3RydWN0IHNpZ2FjdGlvbjMyIHsKKwlfX3UzMgkJc2FfaGFuZGxlcjsJCS8qIHBvaW50ZXIgKi8KKwlfX3UzMgkJc2FfZmxhZ3M7CisgICAgICAgIF9fdTMyCQlzYV9yZXN0b3JlcjsJCS8qIHBvaW50ZXIgKi8KKwljb21wYXRfc2lnc2V0X3QJc2FfbWFzazsgICAgICAgIC8qIG1hc2sgbGFzdCBmb3IgZXh0ZW5zaWJpbGl0eSAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fdTMyCQkJc3Nfc3A7CQkvKiBwb2ludGVyICovCisJaW50CQkJc3NfZmxhZ3M7CisJY29tcGF0X3NpemVfdAkJc3Nfc2l6ZTsKK30gc3RhY2tfdDMyOworCisvKiBhc20vdWNvbnRleHQuaCAqLworc3RydWN0IHVjb250ZXh0MzIgeworCV9fdTMyCQkJdWNfZmxhZ3M7CisJX191MzIJCQl1Y19saW5rOwkvKiBwb2ludGVyICovCQorCXN0YWNrX3QzMgkJdWNfc3RhY2s7CisJX3NpZ3JlZ3MzMgkJdWNfbWNvbnRleHQ7CisJY29tcGF0X3NpZ3NldF90CQl1Y19zaWdtYXNrOwkvKiBtYXNrIGxhc3QgZm9yIGV4dGVuc2liaWxpdHkgKi8KK307CisKKyNlbmRpZiAvKiBfQVNNX1MzOTBYX1MzOTBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfcHRyYWNlLmggYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9wdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTlhZWY5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfcHRyYWNlLmgKQEAgLTAsMCArMSw4MyBAQAorI2lmbmRlZiBfUFRSQUNFMzJfSAorI2RlZmluZSBfUFRSQUNFMzJfSAorCisjaW5jbHVkZSAiY29tcGF0X2xpbnV4LmgiICAvKiBuZWVkZWQgZm9yIF9wc3dfdDMyICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX3UzMiBjclszXTsKK30gcGVyX2NyX3dvcmRzMzI7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX3UxNiAgICAgICAgICBwZXJjX2F0bWlkOyAgICAgICAgICAvKiAweDA5NiAqLworCV9fdTMyICAgICAgICAgIGFkZHJlc3M7ICAgICAgICAgICAgIC8qIDB4MDk4ICovCisJX191OCAgICAgICAgICAgYWNjZXNzX2lkOyAgICAgICAgICAgLyogMHgwYTEgKi8KK30gcGVyX2xvd2NvcmVfd29yZHMzMjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuaW9uIHsKKwkJcGVyX2NyX3dvcmRzMzIgICB3b3JkczsKKwl9IGNvbnRyb2xfcmVnczsKKwkvKgorCSAqIFVzZSB0aGVzZSBmbGFncyBpbnN0ZWFkIG9mIHNldHRpbmcgZW1faW5zdHJ1Y3Rpb25fZmV0Y2gKKwkgKiBkaXJlY3RseSB0aGV5IGFyZSB1c2VkIHNvIHRoYXQgc2luZ2xlIHN0ZXBwaW5nIGNhbiBiZQorCSAqIHN3aXRjaGVkIG9uICYgb2ZmIHdoaWxlIG5vdCBhZmZlY3Rpbmcgb3RoZXIgdHJhY2luZworCSAqLworCXVuc2lnbmVkICBzaW5nbGVfc3RlcCAgICAgICA6IDE7CisJdW5zaWduZWQgIGluc3RydWN0aW9uX2ZldGNoIDogMTsKKwl1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgOiAzMDsKKwkvKgorCSAqIFRoZXNlIGFkZHJlc3NlcyBhcmUgY29waWVkIGludG8gY3IxMCAmIGNyMTEgaWYgc2luZ2xlCisJICogc3RlcHBpbmcgaXMgc3dpdGNoZWQgb2ZmCisJICovCisJX191MzIgICAgIHN0YXJ0aW5nX2FkZHI7CisJX191MzIgICAgIGVuZGluZ19hZGRyOworCXVuaW9uIHsKKwkJcGVyX2xvd2NvcmVfd29yZHMzMiB3b3JkczsKKwl9IGxvd2NvcmU7IAorfSBwZXJfc3RydWN0MzI7CisKK3N0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0MzIKK3sKKwlfcHN3X3QzMiBwc3c7CisJdTMyIGdwcnNbTlVNX0dQUlNdOworCXUzMiBhY3JzW05VTV9BQ1JTXTsKKwl1MzIgb3JpZ19ncHIyOworCXMzOTBfZnBfcmVncyBmcF9yZWdzOworCS8qCisJICogVGhlc2UgcGVyIHJlZ2lzdGVycyBhcmUgaW4gaGVyZSBzbyB0aGF0IGdkYiBjYW4gbW9kaWZ5IHRoZW0KKwkgKiBpdHNlbGYgYXMgdGhlcmUgaXMgbm8gIm9mZmljaWFsIiBwdHJhY2UgaW50ZXJmYWNlIGZvciBoYXJkd2FyZQorCSAqIHdhdGNocG9pbnRzLiBUaGlzIGlzIHRoZSB3YXkgaW50ZWwgZG9lcyBpdC4KKwkgKi8KKwlwZXJfc3RydWN0MzIgcGVyX2luZm87CisJdTMyICBpZWVlX2luc3RydWN0aW9uX3BvaW50ZXI7IAorCS8qIFVzZWQgdG8gZ2l2ZSBmYWlsaW5nIGluc3RydWN0aW9uIGJhY2sgdG8gdXNlciBmb3IgaWVlZSBleGNlcHRpb25zICovCit9OworCitzdHJ1Y3QgdXNlcjMyIHsKKwkvKiBXZSBzdGFydCB3aXRoIHRoZSByZWdpc3RlcnMsIHRvIG1pbWljIHRoZSB3YXkgdGhhdCAibWVtb3J5IgorCSAgIGlzIHJldHVybmVkIGZyb20gdGhlIHB0cmFjZSgzLC4uLikgZnVuY3Rpb24uICAqLworCXN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0MzIgcmVnczsgLyogV2hlcmUgdGhlIHJlZ2lzdGVycyBhcmUgYWN0dWFsbHkgc3RvcmVkICovCisJLyogVGhlIHJlc3Qgb2YgdGhpcyBqdW5rIGlzIHRvIGhlbHAgZ2RiIGZpZ3VyZSBvdXQgd2hhdCBnb2VzIHdoZXJlICovCisJdTMyIHVfdHNpemU7CQkvKiBUZXh0IHNlZ21lbnQgc2l6ZSAocGFnZXMpLiAqLworCXUzMiB1X2RzaXplOwkgICAgICAgIC8qIERhdGEgc2VnbWVudCBzaXplIChwYWdlcykuICovCisJdTMyIHVfc3NpemU7CSAgICAgICAgLyogU3RhY2sgc2VnbWVudCBzaXplIChwYWdlcykuICovCisJdTMyIHN0YXJ0X2NvZGU7ICAgICAgICAgLyogU3RhcnRpbmcgdmlydHVhbCBhZGRyZXNzIG9mIHRleHQuICovCisJdTMyIHN0YXJ0X3N0YWNrOwkvKiBTdGFydGluZyB2aXJ0dWFsIGFkZHJlc3Mgb2Ygc3RhY2sgYXJlYS4KKwkJCQkgICBUaGlzIGlzIGFjdHVhbGx5IHRoZSBib3R0b20gb2YgdGhlIHN0YWNrLAorCQkJCSAgIHRoZSB0b3Agb2YgdGhlIHN0YWNrIGlzIGFsd2F5cyBmb3VuZCBpbiB0aGUKKwkJCQkgICBlc3AgcmVnaXN0ZXIuICAqLworCXMzMiBzaWduYWw7ICAgICAJIC8qIFNpZ25hbCB0aGF0IGNhdXNlZCB0aGUgY29yZSBkdW1wLiAqLworCXUzMiB1X2FyMDsgICAgICAgICAgICAgICAvKiBVc2VkIGJ5IGdkYiB0byBoZWxwIGZpbmQgdGhlIHZhbHVlcyBmb3IgKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIHJlZ2lzdGVycy4gKi8KKwl1MzIgbWFnaWM7CQkgLyogVG8gdW5pcXVlbHkgaWRlbnRpZnkgYSBjb3JlIGZpbGUgKi8KKwljaGFyIHVfY29tbVszMl07CSAvKiBVc2VyIGNvbW1hbmQgdGhhdCB3YXMgcmVzcG9uc2libGUgKi8KK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisJX191MzIgICBsZW47CisJX191MzIgICBrZXJuZWxfYWRkcjsKKwlfX3UzMiAgIHByb2Nlc3NfYWRkcjsKK30gcHRyYWNlX2FyZWFfZW11MzE7CisKKyNlbmRpZiAvKiBfUFRSQUNFMzJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfc2lnbmFsLmMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDVkNjVhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfc2lnbmFsLmMKQEAgLTAsMCArMSw2NDggQEAKKy8qCisgKiAgYXJjaC9zMzkwL2tlcm5lbC9zaWduYWwzMi5jCisgKgorICogIFMzOTAgdmVyc2lvbgorICogICAgQ29weXJpZ2h0IChDKSAyMDAwIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCBJQk0gQ29ycG9yYXRpb24KKyAqICAgIEF1dGhvcihzKTogRGVuaXMgSm9zZXBoIEJhcnJvdyAoZGpiYXJyb3dAZGUuaWJtLmNvbSxiYXJyb3dfZGpAeWFob28uY29tKQorICogICAgICAgICAgICAgICBHZXJoYXJkIFRvbm4gKHRvbkBkZS5pYm0uY29tKSAgICAgICAgICAgICAgICAgIAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIDE5OTctMTEtMjggIE1vZGlmaWVkIGZvciBQT1NJWC4xYiBzaWduYWxzIGJ5IFJpY2hhcmQgSGVuZGVyc29uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvYmluZm10cy5oPgorI2luY2x1ZGUgPGFzbS91Y29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2xvd2NvcmUuaD4KKyNpbmNsdWRlICJjb21wYXRfbGludXguaCIKKyNpbmNsdWRlICJjb21wYXRfcHRyYWNlLmgiCisKKyNkZWZpbmUgX0JMT0NLQUJMRSAofihzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSkpCisKK3R5cGVkZWYgc3RydWN0IAoreworCV9fdTggY2FsbGVlX3VzZWRfc3RhY2tbX19TSUdOQUxfRlJBTUVTSVpFMzJdOworCXN0cnVjdCBzaWdjb250ZXh0MzIgc2M7CisJX3NpZ3JlZ3MzMiBzcmVnczsKKwlpbnQgc2lnbm87CisJX191OCByZXRjb2RlW1MzOTBfU1lTQ0FMTF9TSVpFXTsKK30gc2lnZnJhbWUzMjsKKwordHlwZWRlZiBzdHJ1Y3QgCit7CisJX191OCBjYWxsZWVfdXNlZF9zdGFja1tfX1NJR05BTF9GUkFNRVNJWkUzMl07CisJX191OCByZXRjb2RlW1MzOTBfU1lTQ0FMTF9TSVpFXTsKKwljb21wYXRfc2lnaW5mb190IGluZm87CisJc3RydWN0IHVjb250ZXh0MzIgdWM7Cit9IHJ0X3NpZ2ZyYW1lMzI7CisKK2FzbWxpbmthZ2UgaW50IEZBU1RDQUxMKGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc2lnc2V0X3QgKm9sZHNldCkpOworCitpbnQgY29weV9zaWdpbmZvX3RvX3VzZXIzMihjb21wYXRfc2lnaW5mb190IF9fdXNlciAqdG8sIHNpZ2luZm9fdCAqZnJvbSkKK3sKKwlpbnQgZXJyOworCisJaWYgKCFhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdG8sIHNpemVvZihjb21wYXRfc2lnaW5mb190KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogSWYgeW91IGNoYW5nZSBzaWdpbmZvX3Qgc3RydWN0dXJlLCBwbGVhc2UgYmUgc3VyZQorCSAgIHRoaXMgY29kZSBpcyBmaXhlZCBhY2NvcmRpbmdseS4KKwkgICBJdCBzaG91bGQgbmV2ZXIgY29weSBhbnkgcGFkIGNvbnRhaW5lZCBpbiB0aGUgc3RydWN0dXJlCisJICAgdG8gYXZvaWQgc2VjdXJpdHkgbGVha3MsIGJ1dCBtdXN0IGNvcHkgdGhlIGdlbmVyaWMKKwkgICAzIGludHMgcGx1cyB0aGUgcmVsZXZhbnQgdW5pb24gbWVtYmVyLiAgCisJICAgVGhpcyByb3V0aW5lIG11c3QgY29udmVydCBzaWdpbmZvIGZyb20gNjRiaXQgdG8gMzJiaXQgYXMgd2VsbAorCSAgIGF0IHRoZSBzYW1lIHRpbWUuICAqLworCWVyciA9IF9fcHV0X3VzZXIoZnJvbS0+c2lfc2lnbm8sICZ0by0+c2lfc2lnbm8pOworCWVyciB8PSBfX3B1dF91c2VyKGZyb20tPnNpX2Vycm5vLCAmdG8tPnNpX2Vycm5vKTsKKwllcnIgfD0gX19wdXRfdXNlcigoc2hvcnQpZnJvbS0+c2lfY29kZSwgJnRvLT5zaV9jb2RlKTsKKwlpZiAoZnJvbS0+c2lfY29kZSA8IDApCisJCWVyciB8PSBfX2NvcHlfdG9fdXNlcigmdG8tPl9zaWZpZWxkcy5fcGFkLCAmZnJvbS0+X3NpZmllbGRzLl9wYWQsIFNJX1BBRF9TSVpFKTsKKwllbHNlIHsKKwkJc3dpdGNoIChmcm9tLT5zaV9jb2RlID4+IDE2KSB7CisJCWNhc2UgX19TSV9SVCA+PiAxNjogLyogVGhpcyBpcyBub3QgZ2VuZXJhdGVkIGJ5IHRoZSBrZXJuZWwgYXMgb2Ygbm93LiAgKi8KKwkJY2FzZSBfX1NJX01FU0dRID4+IDE2OgorCQkJZXJyIHw9IF9fcHV0X3VzZXIoZnJvbS0+c2lfaW50LCAmdG8tPnNpX2ludCk7CisJCQkvKiBmYWxsdGhyb3VnaCAqLworCQljYXNlIF9fU0lfS0lMTCA+PiAxNjoKKwkJCWVyciB8PSBfX3B1dF91c2VyKGZyb20tPnNpX3BpZCwgJnRvLT5zaV9waWQpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZnJvbS0+c2lfdWlkLCAmdG8tPnNpX3VpZCk7CisJCQlicmVhazsKKwkJY2FzZSBfX1NJX0NITEQgPj4gMTY6CisJCQllcnIgfD0gX19wdXRfdXNlcihmcm9tLT5zaV9waWQsICZ0by0+c2lfcGlkKTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGZyb20tPnNpX3VpZCwgJnRvLT5zaV91aWQpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZnJvbS0+c2lfdXRpbWUsICZ0by0+c2lfdXRpbWUpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZnJvbS0+c2lfc3RpbWUsICZ0by0+c2lfc3RpbWUpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZnJvbS0+c2lfc3RhdHVzLCAmdG8tPnNpX3N0YXR1cyk7CisJCQlicmVhazsKKwkJY2FzZSBfX1NJX0ZBVUxUID4+IDE2OgorCQkJZXJyIHw9IF9fcHV0X3VzZXIoKHVuc2lnbmVkIGxvbmcpIGZyb20tPnNpX2FkZHIsCisJCQkJCSAgJnRvLT5zaV9hZGRyKTsKKwkJCWJyZWFrOworCQljYXNlIF9fU0lfUE9MTCA+PiAxNjoKKwkJCWVyciB8PSBfX3B1dF91c2VyKGZyb20tPnNpX2JhbmQsICZ0by0+c2lfYmFuZCk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmcm9tLT5zaV9mZCwgJnRvLT5zaV9mZCk7CisJCQlicmVhazsKKwkJY2FzZSBfX1NJX1RJTUVSID4+IDE2OgorCQkJZXJyIHw9IF9fcHV0X3VzZXIoZnJvbS0+c2lfdGlkLCAmdG8tPnNpX3RpZCk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmcm9tLT5zaV9vdmVycnVuLCAmdG8tPnNpX292ZXJydW4pOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZnJvbS0+c2lfaW50LCAmdG8tPnNpX2ludCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBlcnI7Cit9CisKK2ludCBjb3B5X3NpZ2luZm9fZnJvbV91c2VyMzIoc2lnaW5mb190ICp0bywgY29tcGF0X3NpZ2luZm9fdCBfX3VzZXIgKmZyb20pCit7CisJaW50IGVycjsKKwl1MzIgdG1wOworCisJaWYgKCFhY2Nlc3Nfb2sgKFZFUklGWV9SRUFELCBmcm9tLCBzaXplb2YoY29tcGF0X3NpZ2luZm9fdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVyciA9IF9fZ2V0X3VzZXIodG8tPnNpX3NpZ25vLCAmZnJvbS0+c2lfc2lnbm8pOworCWVyciB8PSBfX2dldF91c2VyKHRvLT5zaV9lcnJubywgJmZyb20tPnNpX2Vycm5vKTsKKwllcnIgfD0gX19nZXRfdXNlcih0by0+c2lfY29kZSwgJmZyb20tPnNpX2NvZGUpOworCisJaWYgKHRvLT5zaV9jb2RlIDwgMCkKKwkJZXJyIHw9IF9fY29weV9mcm9tX3VzZXIoJnRvLT5fc2lmaWVsZHMuX3BhZCwgJmZyb20tPl9zaWZpZWxkcy5fcGFkLCBTSV9QQURfU0laRSk7CisJZWxzZSB7CisJCXN3aXRjaCAodG8tPnNpX2NvZGUgPj4gMTYpIHsKKwkJY2FzZSBfX1NJX1JUID4+IDE2OiAvKiBUaGlzIGlzIG5vdCBnZW5lcmF0ZWQgYnkgdGhlIGtlcm5lbCBhcyBvZiBub3cuICAqLworCQljYXNlIF9fU0lfTUVTR1EgPj4gMTY6CisJCQllcnIgfD0gX19nZXRfdXNlcih0by0+c2lfaW50LCAmZnJvbS0+c2lfaW50KTsKKwkJCS8qIGZhbGx0aHJvdWdoICovCisJCWNhc2UgX19TSV9LSUxMID4+IDE2OgorCQkJZXJyIHw9IF9fZ2V0X3VzZXIodG8tPnNpX3BpZCwgJmZyb20tPnNpX3BpZCk7CisJCQllcnIgfD0gX19nZXRfdXNlcih0by0+c2lfdWlkLCAmZnJvbS0+c2lfdWlkKTsKKwkJCWJyZWFrOworCQljYXNlIF9fU0lfQ0hMRCA+PiAxNjoKKwkJCWVyciB8PSBfX2dldF91c2VyKHRvLT5zaV9waWQsICZmcm9tLT5zaV9waWQpOworCQkJZXJyIHw9IF9fZ2V0X3VzZXIodG8tPnNpX3VpZCwgJmZyb20tPnNpX3VpZCk7CisJCQllcnIgfD0gX19nZXRfdXNlcih0by0+c2lfdXRpbWUsICZmcm9tLT5zaV91dGltZSk7CisJCQllcnIgfD0gX19nZXRfdXNlcih0by0+c2lfc3RpbWUsICZmcm9tLT5zaV9zdGltZSk7CisJCQllcnIgfD0gX19nZXRfdXNlcih0by0+c2lfc3RhdHVzLCAmZnJvbS0+c2lfc3RhdHVzKTsKKwkJCWJyZWFrOworCQljYXNlIF9fU0lfRkFVTFQgPj4gMTY6CisJCQllcnIgfD0gX19nZXRfdXNlcih0bXAsICZmcm9tLT5zaV9hZGRyKTsKKwkJCXRvLT5zaV9hZGRyID0gKHZvaWQgKikodTY0KSAodG1wICYgUFNXMzJfQUREUl9JTlNOKTsKKwkJCWJyZWFrOworCQljYXNlIF9fU0lfUE9MTCA+PiAxNjoKKwkJCWVyciB8PSBfX2dldF91c2VyKHRvLT5zaV9iYW5kLCAmZnJvbS0+c2lfYmFuZCk7CisJCQllcnIgfD0gX19nZXRfdXNlcih0by0+c2lfZmQsICZmcm9tLT5zaV9mZCk7CisJCQlicmVhazsKKwkJY2FzZSBfX1NJX1RJTUVSID4+IDE2OgorCQkJZXJyIHw9IF9fZ2V0X3VzZXIodG8tPnNpX3RpZCwgJmZyb20tPnNpX3RpZCk7CisJCQllcnIgfD0gX19nZXRfdXNlcih0by0+c2lfb3ZlcnJ1biwgJmZyb20tPnNpX292ZXJydW4pOworCQkJZXJyIHw9IF9fZ2V0X3VzZXIodG8tPnNpX2ludCwgJmZyb20tPnNpX2ludCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBBdG9taWNhbGx5IHN3YXAgaW4gdGhlIG5ldyBzaWduYWwgbWFzaywgYW5kIHdhaXQgZm9yIGEgc2lnbmFsLgorICovCithc21saW5rYWdlIGludAorc3lzMzJfc2lnc3VzcGVuZChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsaW50IGhpc3RvcnkwLCBpbnQgaGlzdG9yeTEsIG9sZF9zaWdzZXRfdCBtYXNrKQoreworCXNpZ3NldF90IHNhdmVzZXQ7CisKKwltYXNrICY9IF9CTE9DS0FCTEU7CisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJc2F2ZXNldCA9IGN1cnJlbnQtPmJsb2NrZWQ7CisJc2lnaW5pdHNldCgmY3VycmVudC0+YmxvY2tlZCwgbWFzayk7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCXJlZ3MtPmdwcnNbMl0gPSAtRUlOVFI7CisKKwl3aGlsZSAoMSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZSgpOworCQlpZiAoZG9fc2lnbmFsKHJlZ3MsICZzYXZlc2V0KSkKKwkJCXJldHVybiAtRUlOVFI7CisJfQorfQorCithc21saW5rYWdlIGludAorc3lzMzJfcnRfc2lnc3VzcGVuZChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGNvbXBhdF9zaWdzZXRfdCBfX3VzZXIgKnVuZXdzZXQsCisJCQkJCQkJCXNpemVfdCBzaWdzZXRzaXplKQoreworCXNpZ3NldF90IHNhdmVzZXQsIG5ld3NldDsKKwljb21wYXRfc2lnc2V0X3Qgc2V0MzI7CisKKwkvKiBYWFg6IERvbid0IHByZWNsdWRlIGhhbmRsaW5nIGRpZmZlcmVudCBzaXplZCBzaWdzZXRfdCdzLiAgKi8KKwlpZiAoc2lnc2V0c2l6ZSAhPSBzaXplb2Yoc2lnc2V0X3QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc2V0MzIsIHVuZXdzZXQsIHNpemVvZihzZXQzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlzd2l0Y2ggKF9OU0lHX1dPUkRTKSB7CisJY2FzZSA0OiBuZXdzZXQuc2lnWzNdID0gc2V0MzIuc2lnWzZdICsgKCgobG9uZylzZXQzMi5zaWdbN10pIDw8IDMyKTsKKwljYXNlIDM6IG5ld3NldC5zaWdbMl0gPSBzZXQzMi5zaWdbNF0gKyAoKChsb25nKXNldDMyLnNpZ1s1XSkgPDwgMzIpOworCWNhc2UgMjogbmV3c2V0LnNpZ1sxXSA9IHNldDMyLnNpZ1syXSArICgoKGxvbmcpc2V0MzIuc2lnWzNdKSA8PCAzMik7CisJY2FzZSAxOiBuZXdzZXQuc2lnWzBdID0gc2V0MzIuc2lnWzBdICsgKCgobG9uZylzZXQzMi5zaWdbMV0pIDw8IDMyKTsKKwl9CisgICAgICAgIHNpZ2RlbHNldG1hc2soJm5ld3NldCwgfl9CTE9DS0FCTEUpOworCisgICAgICAgIHNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworICAgICAgICBzYXZlc2V0ID0gY3VycmVudC0+YmxvY2tlZDsKKyAgICAgICAgY3VycmVudC0+YmxvY2tlZCA9IG5ld3NldDsKKyAgICAgICAgcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKyAgICAgICAgcmVncy0+Z3Byc1syXSA9IC1FSU5UUjsKKworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisgICAgICAgICAgICAgICAgc2NoZWR1bGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoZG9fc2lnbmFsKHJlZ3MsICZzYXZlc2V0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVFI7CisgICAgICAgIH0KK30KKworYXNtbGlua2FnZSBsb25nCitzeXMzMl9zaWdhY3Rpb24oaW50IHNpZywgY29uc3Qgc3RydWN0IG9sZF9zaWdhY3Rpb24zMiBfX3VzZXIgKmFjdCwKKwkJIHN0cnVjdCBvbGRfc2lnYWN0aW9uMzIgX191c2VyICpvYWN0KQoreworICAgICAgICBzdHJ1Y3Qga19zaWdhY3Rpb24gbmV3X2thLCBvbGRfa2E7CisJdW5zaWduZWQgbG9uZyBzYV9oYW5kbGVyLCBzYV9yZXN0b3JlcjsKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICBpZiAoYWN0KSB7CisJCWNvbXBhdF9vbGRfc2lnc2V0X3QgbWFzazsKKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGFjdCwgc2l6ZW9mKCphY3QpKSB8fAorCQkgICAgX19nZXRfdXNlcihzYV9oYW5kbGVyLCAmYWN0LT5zYV9oYW5kbGVyKSB8fAorCQkgICAgX19nZXRfdXNlcihzYV9yZXN0b3JlciwgJmFjdC0+c2FfcmVzdG9yZXIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCW5ld19rYS5zYS5zYV9oYW5kbGVyID0gKF9fc2lnaGFuZGxlcl90KSBzYV9oYW5kbGVyOworCQluZXdfa2Euc2Euc2FfcmVzdG9yZXIgPSAodm9pZCAoKikodm9pZCkpIHNhX3Jlc3RvcmVyOworCQlfX2dldF91c2VyKG5ld19rYS5zYS5zYV9mbGFncywgJmFjdC0+c2FfZmxhZ3MpOworCQlfX2dldF91c2VyKG1hc2ssICZhY3QtPnNhX21hc2spOworCQlzaWdpbml0c2V0KCZuZXdfa2Euc2Euc2FfbWFzaywgbWFzayk7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBkb19zaWdhY3Rpb24oc2lnLCBhY3QgPyAmbmV3X2thIDogTlVMTCwgb2FjdCA/ICZvbGRfa2EgOiBOVUxMKTsKKworCWlmICghcmV0ICYmIG9hY3QpIHsKKwkJc2FfaGFuZGxlciA9ICh1bnNpZ25lZCBsb25nKSBvbGRfa2Euc2Euc2FfaGFuZGxlcjsKKwkJc2FfcmVzdG9yZXIgPSAodW5zaWduZWQgbG9uZykgb2xkX2thLnNhLnNhX3Jlc3RvcmVyOworCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIG9hY3QsIHNpemVvZigqb2FjdCkpIHx8CisJCSAgICBfX3B1dF91c2VyKHNhX2hhbmRsZXIsICZvYWN0LT5zYV9oYW5kbGVyKSB8fAorCQkgICAgX19wdXRfdXNlcihzYV9yZXN0b3JlciwgJm9hY3QtPnNhX3Jlc3RvcmVyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9mbGFncywgJm9hY3QtPnNhX2ZsYWdzKTsKKwkJX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfbWFzay5zaWdbMF0sICZvYWN0LT5zYV9tYXNrKTsKKyAgICAgICAgfQorCisJcmV0dXJuIHJldDsKK30KKworaW50Citkb19zaWdhY3Rpb24oaW50IHNpZywgY29uc3Qgc3RydWN0IGtfc2lnYWN0aW9uICphY3QsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqb2FjdCk7CisKK2FzbWxpbmthZ2UgbG9uZworc3lzMzJfcnRfc2lnYWN0aW9uKGludCBzaWcsIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24zMiBfX3VzZXIgKmFjdCwKKwkgICBzdHJ1Y3Qgc2lnYWN0aW9uMzIgX191c2VyICpvYWN0LCAgc2l6ZV90IHNpZ3NldHNpemUpCit7CisJc3RydWN0IGtfc2lnYWN0aW9uIG5ld19rYSwgb2xkX2thOworCXVuc2lnbmVkIGxvbmcgc2FfaGFuZGxlcjsKKwlpbnQgcmV0OworCWNvbXBhdF9zaWdzZXRfdCBzZXQzMjsKKworCS8qIFhYWDogRG9uJ3QgcHJlY2x1ZGUgaGFuZGxpbmcgZGlmZmVyZW50IHNpemVkIHNpZ3NldF90J3MuICAqLworCWlmIChzaWdzZXRzaXplICE9IHNpemVvZihjb21wYXRfc2lnc2V0X3QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChhY3QpIHsKKwkJcmV0ID0gZ2V0X3VzZXIoc2FfaGFuZGxlciwgJmFjdC0+c2FfaGFuZGxlcik7CisJCXJldCB8PSBfX2NvcHlfZnJvbV91c2VyKCZzZXQzMiwgJmFjdC0+c2FfbWFzaywKKwkJCQkJc2l6ZW9mKGNvbXBhdF9zaWdzZXRfdCkpOworCQlzd2l0Y2ggKF9OU0lHX1dPUkRTKSB7CisJCWNhc2UgNDogbmV3X2thLnNhLnNhX21hc2suc2lnWzNdID0gc2V0MzIuc2lnWzZdCisJCQkJfCAoKChsb25nKXNldDMyLnNpZ1s3XSkgPDwgMzIpOworCQljYXNlIDM6IG5ld19rYS5zYS5zYV9tYXNrLnNpZ1syXSA9IHNldDMyLnNpZ1s0XQorCQkJCXwgKCgobG9uZylzZXQzMi5zaWdbNV0pIDw8IDMyKTsKKwkJY2FzZSAyOiBuZXdfa2Euc2Euc2FfbWFzay5zaWdbMV0gPSBzZXQzMi5zaWdbMl0KKwkJCQl8ICgoKGxvbmcpc2V0MzIuc2lnWzNdKSA8PCAzMik7CisJCWNhc2UgMTogbmV3X2thLnNhLnNhX21hc2suc2lnWzBdID0gc2V0MzIuc2lnWzBdCisJCQkJfCAoKChsb25nKXNldDMyLnNpZ1sxXSkgPDwgMzIpOworCQl9CisJCXJldCB8PSBfX2dldF91c2VyKG5ld19rYS5zYS5zYV9mbGFncywgJmFjdC0+c2FfZmxhZ3MpOworCQkKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtRUZBVUxUOworCQluZXdfa2Euc2Euc2FfaGFuZGxlciA9IChfX3NpZ2hhbmRsZXJfdCkgc2FfaGFuZGxlcjsKKwl9CisKKwlyZXQgPSBkb19zaWdhY3Rpb24oc2lnLCBhY3QgPyAmbmV3X2thIDogTlVMTCwgb2FjdCA/ICZvbGRfa2EgOiBOVUxMKTsKKworCWlmICghcmV0ICYmIG9hY3QpIHsKKwkJc3dpdGNoIChfTlNJR19XT1JEUykgeworCQljYXNlIDQ6CisJCQlzZXQzMi5zaWdbN10gPSAob2xkX2thLnNhLnNhX21hc2suc2lnWzNdID4+IDMyKTsKKwkJCXNldDMyLnNpZ1s2XSA9IG9sZF9rYS5zYS5zYV9tYXNrLnNpZ1szXTsKKwkJY2FzZSAzOgorCQkJc2V0MzIuc2lnWzVdID0gKG9sZF9rYS5zYS5zYV9tYXNrLnNpZ1syXSA+PiAzMik7CisJCQlzZXQzMi5zaWdbNF0gPSBvbGRfa2Euc2Euc2FfbWFzay5zaWdbMl07CisJCWNhc2UgMjoKKwkJCXNldDMyLnNpZ1szXSA9IChvbGRfa2Euc2Euc2FfbWFzay5zaWdbMV0gPj4gMzIpOworCQkJc2V0MzIuc2lnWzJdID0gb2xkX2thLnNhLnNhX21hc2suc2lnWzFdOworCQljYXNlIDE6CisJCQlzZXQzMi5zaWdbMV0gPSAob2xkX2thLnNhLnNhX21hc2suc2lnWzBdID4+IDMyKTsKKwkJCXNldDMyLnNpZ1swXSA9IG9sZF9rYS5zYS5zYV9tYXNrLnNpZ1swXTsKKwkJfQorCQlyZXQgPSBwdXRfdXNlcigodW5zaWduZWQgbG9uZylvbGRfa2Euc2Euc2FfaGFuZGxlciwgJm9hY3QtPnNhX2hhbmRsZXIpOworCQlyZXQgfD0gX19jb3B5X3RvX3VzZXIoJm9hY3QtPnNhX21hc2ssICZzZXQzMiwKKwkJCQkgICAgICBzaXplb2YoY29tcGF0X3NpZ3NldF90KSk7CisJCXJldCB8PSBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9mbGFncywgJm9hY3QtPnNhX2ZsYWdzKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCithc21saW5rYWdlIGxvbmcKK3N5czMyX3NpZ2FsdHN0YWNrKGNvbnN0IHN0YWNrX3QzMiBfX3VzZXIgKnVzcywgc3RhY2tfdDMyIF9fdXNlciAqdW9zcywKKwkJCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdGFja190IGtzcywga29zczsKKwl1bnNpZ25lZCBsb25nIHNzX3NwOworCWludCByZXQsIGVyciA9IDA7CisJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOworCisJaWYgKHVzcykgeworCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdXNzLCBzaXplb2YoKnVzcykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWVyciB8PSBfX2dldF91c2VyKHNzX3NwLCAmdXNzLT5zc19zcCk7CisJCWVyciB8PSBfX2dldF91c2VyKGtzcy5zc19zaXplLCAmdXNzLT5zc19zaXplKTsKKwkJZXJyIHw9IF9fZ2V0X3VzZXIoa3NzLnNzX2ZsYWdzLCAmdXNzLT5zc19mbGFncyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJa3NzLnNzX3NwID0gKHZvaWQgKikgc3Nfc3A7CisJfQorCisJc2V0X2ZzIChLRVJORUxfRFMpOworCXJldCA9IGRvX3NpZ2FsdHN0YWNrKChzdGFja190IF9fdXNlciAqKSAodXNzID8gJmtzcyA6IE5VTEwpLAorCQkJICAgICAoc3RhY2tfdCBfX3VzZXIgKikgKHVvc3MgPyAma29zcyA6IE5VTEwpLAorCQkJICAgICByZWdzLT5ncHJzWzE1XSk7CisJc2V0X2ZzIChvbGRfZnMpOworCisJaWYgKCFyZXQgJiYgdW9zcykgeworCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVvc3MsIHNpemVvZigqdW9zcykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXNzX3NwID0gKHVuc2lnbmVkIGxvbmcpIGtvc3Muc3Nfc3A7CisJCWVyciB8PSBfX3B1dF91c2VyKHNzX3NwLCAmdW9zcy0+c3Nfc3ApOworCQllcnIgfD0gX19wdXRfdXNlcihrb3NzLnNzX3NpemUsICZ1b3NzLT5zc19zaXplKTsKKwkJZXJyIHw9IF9fcHV0X3VzZXIoa29zcy5zc19mbGFncywgJnVvc3MtPnNzX2ZsYWdzKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNhdmVfc2lncmVnczMyKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBfc2lncmVnczMyIF9fdXNlciAqc3JlZ3MpCit7CisJX3MzOTBfcmVnc19jb21tb24zMiByZWdzMzI7CisJaW50IGVyciwgaTsKKworCXJlZ3MzMi5wc3cubWFzayA9IFBTVzMyX01BU0tfTUVSR0UoUFNXMzJfVVNFUl9CSVRTLAorCQkJCQkgICAoX191MzIpKHJlZ3MtPnBzdy5tYXNrID4+IDMyKSk7CisJcmVnczMyLnBzdy5hZGRyID0gUFNXMzJfQUREUl9BTU9ERTMxIHwgKF9fdTMyKSByZWdzLT5wc3cuYWRkcjsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0dQUlM7IGkrKykKKwkJcmVnczMyLmdwcnNbaV0gPSAoX191MzIpIHJlZ3MtPmdwcnNbaV07CisJc2F2ZV9hY2Nlc3NfcmVncyhjdXJyZW50LT50aHJlYWQuYWNycyk7CisJbWVtY3B5KHJlZ3MzMi5hY3JzLCBjdXJyZW50LT50aHJlYWQuYWNycywgc2l6ZW9mKHJlZ3MzMi5hY3JzKSk7CisJZXJyID0gX19jb3B5X3RvX3VzZXIoJnNyZWdzLT5yZWdzLCAmcmVnczMyLCBzaXplb2YocmVnczMyKSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlzYXZlX2ZwX3JlZ3MoJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzKTsKKwkvKiBzMzkwX2ZwX3JlZ3MgYW5kIF9zMzkwX2ZwX3JlZ3MzMiBhcmUgdGhlIHNhbWUgISAqLworCXJldHVybiBfX2NvcHlfdG9fdXNlcigmc3JlZ3MtPmZwcmVncywgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLAorCQkJICAgICAgc2l6ZW9mKF9zMzkwX2ZwX3JlZ3MzMikpOworfQorCitzdGF0aWMgaW50IHJlc3RvcmVfc2lncmVnczMyKHN0cnVjdCBwdF9yZWdzICpyZWdzLF9zaWdyZWdzMzIgX191c2VyICpzcmVncykKK3sKKwlfczM5MF9yZWdzX2NvbW1vbjMyIHJlZ3MzMjsKKwlpbnQgZXJyLCBpOworCisJLyogQWx3eXMgbWFrZSBhbnkgcGVuZGluZyByZXN0YXJ0ZWQgc3lzdGVtIGNhbGwgcmV0dXJuIC1FSU5UUiAqLworCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+cmVzdGFydF9ibG9jay5mbiA9IGRvX25vX3Jlc3RhcnRfc3lzY2FsbDsKKworCWVyciA9IF9fY29weV9mcm9tX3VzZXIoJnJlZ3MzMiwgJnNyZWdzLT5yZWdzLCBzaXplb2YocmVnczMyKSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlyZWdzLT5wc3cubWFzayA9IFBTV19NQVNLX01FUkdFKHJlZ3MtPnBzdy5tYXNrLAorCQkJCSAgICAgICAgKF9fdTY0KXJlZ3MzMi5wc3cubWFzayA8PCAzMik7CisJcmVncy0+cHN3LmFkZHIgPSAoX191NjQpKHJlZ3MzMi5wc3cuYWRkciAmIFBTVzMyX0FERFJfSU5TTik7CisJZm9yIChpID0gMDsgaSA8IE5VTV9HUFJTOyBpKyspCisJCXJlZ3MtPmdwcnNbaV0gPSAoX191NjQpIHJlZ3MzMi5ncHJzW2ldOworCW1lbWNweShjdXJyZW50LT50aHJlYWQuYWNycywgcmVnczMyLmFjcnMsIHNpemVvZihjdXJyZW50LT50aHJlYWQuYWNycykpOworCXJlc3RvcmVfYWNjZXNzX3JlZ3MoY3VycmVudC0+dGhyZWFkLmFjcnMpOworCisJZXJyID0gX19jb3B5X2Zyb21fdXNlcigmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MsICZzcmVncy0+ZnByZWdzLAorCQkJICAgICAgIHNpemVvZihfczM5MF9mcF9yZWdzMzIpKTsKKwljdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJj0gRlBDX1ZBTElEX01BU0s7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJlc3RvcmVfZnBfcmVncygmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MpOworCXJlZ3MtPnRyYXAgPSAtMTsJLyogZGlzYWJsZSBzeXNjYWxsIGNoZWNrcyAqLworCXJldHVybiAwOworfQorCithc21saW5rYWdlIGxvbmcgc3lzMzJfc2lncmV0dXJuKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNpZ2ZyYW1lMzIgX191c2VyICpmcmFtZSA9IChzaWdmcmFtZTMyIF9fdXNlciAqKXJlZ3MtPmdwcnNbMTVdOworCXNpZ3NldF90IHNldDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQorCQlnb3RvIGJhZGZyYW1lOworCWlmIChfX2NvcHlfZnJvbV91c2VyKCZzZXQuc2lnLCAmZnJhbWUtPnNjLm9sZG1hc2ssIF9TSUdNQVNLX0NPUFlfU0laRTMyKSkKKwkJZ290byBiYWRmcmFtZTsKKworCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWN1cnJlbnQtPmJsb2NrZWQgPSBzZXQ7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJaWYgKHJlc3RvcmVfc2lncmVnczMyKHJlZ3MsICZmcmFtZS0+c3JlZ3MpKQorCQlnb3RvIGJhZGZyYW1lOworCisJcmV0dXJuIHJlZ3MtPmdwcnNbMl07CisKK2JhZGZyYW1lOgorCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKKwlyZXR1cm4gMDsKK30KKworYXNtbGlua2FnZSBsb25nIHN5czMyX3J0X3NpZ3JldHVybihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlydF9zaWdmcmFtZTMyIF9fdXNlciAqZnJhbWUgPSAocnRfc2lnZnJhbWUzMiBfX3VzZXIgKilyZWdzLT5ncHJzWzE1XTsKKwlzaWdzZXRfdCBzZXQ7CisJc3RhY2tfdCBzdDsKKwlfX3UzMiBzc19zcDsKKwlpbnQgZXJyOworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQorCQlnb3RvIGJhZGZyYW1lOworCWlmIChfX2NvcHlfZnJvbV91c2VyKCZzZXQsICZmcmFtZS0+dWMudWNfc2lnbWFzaywgc2l6ZW9mKHNldCkpKQorCQlnb3RvIGJhZGZyYW1lOworCisJc2lnZGVsc2V0bWFzaygmc2V0LCB+X0JMT0NLQUJMRSk7CisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJY3VycmVudC0+YmxvY2tlZCA9IHNldDsKKwlyZWNhbGNfc2lncGVuZGluZygpOworCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisKKwlpZiAocmVzdG9yZV9zaWdyZWdzMzIocmVncywgJmZyYW1lLT51Yy51Y19tY29udGV4dCkpCisJCWdvdG8gYmFkZnJhbWU7CisKKwllcnIgPSBfX2dldF91c2VyKHNzX3NwLCAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX3NwKTsKKwlzdC5zc19zcCA9ICh2b2lkICopIEEoKHVuc2lnbmVkIGxvbmcpc3Nfc3ApOworCWVyciB8PSBfX2dldF91c2VyKHN0LnNzX3NpemUsICZmcmFtZS0+dWMudWNfc3RhY2suc3Nfc2l6ZSk7CisJZXJyIHw9IF9fZ2V0X3VzZXIoc3Quc3NfZmxhZ3MsICZmcmFtZS0+dWMudWNfc3RhY2suc3NfZmxhZ3MpOworCWlmIChlcnIpCisJCWdvdG8gYmFkZnJhbWU7IAorCisJLyogSXQgaXMgbW9yZSBkaWZmaWN1bHQgdG8gYXZvaWQgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHRoYW4gdG8KKwkgICBjYWxsIGl0IGFuZCBpZ25vcmUgZXJyb3JzLiAgKi8KKwlzZXRfZnMgKEtFUk5FTF9EUyk7CisJZG9fc2lnYWx0c3RhY2soKHN0YWNrX3QgX191c2VyICopJnN0LCBOVUxMLCByZWdzLT5ncHJzWzE1XSk7CisJc2V0X2ZzIChvbGRfZnMpOworCisJcmV0dXJuIHJlZ3MtPmdwcnNbMl07CisKK2JhZGZyYW1lOgorICAgICAgICBmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CisgICAgICAgIHJldHVybiAwOworfQkKKworLyoKKyAqIFNldCB1cCBhIHNpZ25hbCBmcmFtZS4KKyAqLworCisKKy8qCisgKiBEZXRlcm1pbmUgd2hpY2ggc3RhY2sgdG8gdXNlLi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fdXNlciAqCitnZXRfc2lnZnJhbWUoc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBzaXplX3QgZnJhbWVfc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHNwOworCisJLyogRGVmYXVsdCB0byB1c2luZyBub3JtYWwgc3RhY2sgKi8KKwlzcCA9ICh1bnNpZ25lZCBsb25nKSBBKHJlZ3MtPmdwcnNbMTVdKTsKKworCS8qIFRoaXMgaXMgdGhlIFgvT3BlbiBzYW5jdGlvbmVkIHNpZ25hbCBzdGFjayBzd2l0Y2hpbmcuICAqLworCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9PTlNUQUNLKSB7CisJCWlmICghIG9uX3NpZ19zdGFjayhzcCkpCisJCQlzcCA9IGN1cnJlbnQtPnNhc19zc19zcCArIGN1cnJlbnQtPnNhc19zc19zaXplOworCX0KKworCS8qIFRoaXMgaXMgdGhlIGxlZ2FjeSBzaWduYWwgc3RhY2sgc3dpdGNoaW5nLiAqLworCWVsc2UgaWYgKCF1c2VyX21vZGUocmVncykgJiYKKwkJICEoa2EtPnNhLnNhX2ZsYWdzICYgU0FfUkVTVE9SRVIpICYmCisJCSBrYS0+c2Euc2FfcmVzdG9yZXIpIHsKKwkJc3AgPSAodW5zaWduZWQgbG9uZykga2EtPnNhLnNhX3Jlc3RvcmVyOworCX0KKworCXJldHVybiAodm9pZCBfX3VzZXIgKikoKHNwIC0gZnJhbWVfc2l6ZSkgJiAtOHVsKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbWFwX3NpZ25hbChpbnQgc2lnKQoreworCWlmIChjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluCisJICAgICYmIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXAKKwkgICAgJiYgc2lnIDwgMzIpCisJCXJldHVybiBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwW3NpZ107CisgICAgICAgIGVsc2UKKwkJcmV0dXJuIHNpZzsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfZnJhbWUzMihpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAorCQkJc2lnc2V0X3QgKnNldCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXNpZ2ZyYW1lMzIgX191c2VyICpmcmFtZSA9IGdldF9zaWdmcmFtZShrYSwgcmVncywgc2l6ZW9mKHNpZ2ZyYW1lMzIpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBzaXplb2Yoc2lnZnJhbWUzMikpKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKworCWlmIChfX2NvcHlfdG9fdXNlcigmZnJhbWUtPnNjLm9sZG1hc2ssICZzZXQtPnNpZywgX1NJR01BU0tfQ09QWV9TSVpFMzIpKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKworCWlmIChzYXZlX3NpZ3JlZ3MzMihyZWdzLCAmZnJhbWUtPnNyZWdzKSkKKwkJZ290byBnaXZlX3NpZ3NlZ3Y7CisJaWYgKF9fcHV0X3VzZXIoKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+c3JlZ3MsICZmcmFtZS0+c2Muc3JlZ3MpKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKworCS8qIFNldCB1cCB0byByZXR1cm4gZnJvbSB1c2Vyc3BhY2UuICBJZiBwcm92aWRlZCwgdXNlIGEgc3R1YgorCSAgIGFscmVhZHkgaW4gdXNlcnNwYWNlLiAgKi8KKwlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfUkVTVE9SRVIpIHsKKwkJcmVncy0+Z3Byc1sxNF0gPSAoX191NjQpIGthLT5zYS5zYV9yZXN0b3JlcjsKKwl9IGVsc2UgeworCQlyZWdzLT5ncHJzWzE0XSA9IChfX3U2NCkgZnJhbWUtPnJldGNvZGU7CisJCWlmIChfX3B1dF91c2VyKFMzOTBfU1lTQ0FMTF9PUENPREUgfCBfX05SX3NpZ3JldHVybiwKKwkJICAgICAgICAgICAgICAgKHUxNiBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUpKSkKKwkJCWdvdG8gZ2l2ZV9zaWdzZWd2OworICAgICAgICB9CisKKwkvKiBTZXQgdXAgYmFja2NoYWluLiAqLworCWlmIChfX3B1dF91c2VyKHJlZ3MtPmdwcnNbMTVdLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSBmcmFtZSkpCisJCWdvdG8gZ2l2ZV9zaWdzZWd2OworCisJLyogU2V0IHVwIHJlZ2lzdGVycyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KKwlyZWdzLT5ncHJzWzE1XSA9IChfX3U2NCkgZnJhbWU7CisJcmVncy0+cHN3LmFkZHIgPSAoX191NjQpIGthLT5zYS5zYV9oYW5kbGVyOworCisJcmVncy0+Z3Byc1syXSA9IG1hcF9zaWduYWwoc2lnKTsKKwlyZWdzLT5ncHJzWzNdID0gKF9fdTY0KSAmZnJhbWUtPnNjOworCisJLyogV2UgZm9yZ290IHRvIGluY2x1ZGUgdGhlc2UgaW4gdGhlIHNpZ2NvbnRleHQuCisJICAgVG8gYXZvaWQgYnJlYWtpbmcgYmluYXJ5IGNvbXBhdGliaWxpdHksIHRoZXkgYXJlIHBhc3NlZCBhcyBhcmdzLiAqLworCXJlZ3MtPmdwcnNbNF0gPSBjdXJyZW50LT50aHJlYWQudHJhcF9ubzsKKwlyZWdzLT5ncHJzWzVdID0gY3VycmVudC0+dGhyZWFkLnByb3RfYWRkcjsKKworCS8qIFBsYWNlIHNpZ25hbCBudW1iZXIgb24gc3RhY2sgdG8gYWxsb3cgYmFja3RyYWNlIGZyb20gaGFuZGxlci4gICovCisJaWYgKF9fcHV0X3VzZXIocmVncy0+Z3Byc1syXSwgKGludCBfX3VzZXIgKikgJmZyYW1lLT5zaWdubykpCisJCWdvdG8gZ2l2ZV9zaWdzZWd2OworCXJldHVybjsKKworZ2l2ZV9zaWdzZWd2OgorCWZvcmNlX3NpZ3NlZ3Yoc2lnLCBjdXJyZW50KTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfcnRfZnJhbWUzMihpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdpbmZvX3QgKmluZm8sCisJCQkgICBzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJaW50IGVyciA9IDA7CisJcnRfc2lnZnJhbWUzMiBfX3VzZXIgKmZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGthLCByZWdzLCBzaXplb2YocnRfc2lnZnJhbWUzMikpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZnJhbWUsIHNpemVvZihydF9zaWdmcmFtZTMyKSkpCisJCWdvdG8gZ2l2ZV9zaWdzZWd2OworCisJaWYgKGNvcHlfc2lnaW5mb190b191c2VyMzIoJmZyYW1lLT5pbmZvLCBpbmZvKSkKKwkJZ290byBnaXZlX3NpZ3NlZ3Y7CisKKwkvKiBDcmVhdGUgdGhlIHVjb250ZXh0LiAgKi8KKwllcnIgfD0gX19wdXRfdXNlcigwLCAmZnJhbWUtPnVjLnVjX2ZsYWdzKTsKKwllcnIgfD0gX19wdXRfdXNlcigwLCAmZnJhbWUtPnVjLnVjX2xpbmspOworCWVyciB8PSBfX3B1dF91c2VyKGN1cnJlbnQtPnNhc19zc19zcCwgJmZyYW1lLT51Yy51Y19zdGFjay5zc19zcCk7CisJZXJyIHw9IF9fcHV0X3VzZXIoc2FzX3NzX2ZsYWdzKHJlZ3MtPmdwcnNbMTVdKSwKKwkgICAgICAgICAgICAgICAgICAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX2ZsYWdzKTsKKwllcnIgfD0gX19wdXRfdXNlcihjdXJyZW50LT5zYXNfc3Nfc2l6ZSwgJmZyYW1lLT51Yy51Y19zdGFjay5zc19zaXplKTsKKwllcnIgfD0gc2F2ZV9zaWdyZWdzMzIocmVncywgJmZyYW1lLT51Yy51Y19tY29udGV4dCk7CisJZXJyIHw9IF9fY29weV90b191c2VyKCZmcmFtZS0+dWMudWNfc2lnbWFzaywgc2V0LCBzaXplb2YoKnNldCkpOworCWlmIChlcnIpCisJCWdvdG8gZ2l2ZV9zaWdzZWd2OworCisJLyogU2V0IHVwIHRvIHJldHVybiBmcm9tIHVzZXJzcGFjZS4gIElmIHByb3ZpZGVkLCB1c2UgYSBzdHViCisJICAgYWxyZWFkeSBpbiB1c2Vyc3BhY2UuICAqLworCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9SRVNUT1JFUikgeworCQlyZWdzLT5ncHJzWzE0XSA9IChfX3U2NCkga2EtPnNhLnNhX3Jlc3RvcmVyOworCX0gZWxzZSB7CisJCXJlZ3MtPmdwcnNbMTRdID0gKF9fdTY0KSBmcmFtZS0+cmV0Y29kZTsKKwkJZXJyIHw9IF9fcHV0X3VzZXIoUzM5MF9TWVNDQUxMX09QQ09ERSB8IF9fTlJfcnRfc2lncmV0dXJuLAorCQkgICAgICAgICAgICAgICAgICAodTE2IF9fdXNlciAqKShmcmFtZS0+cmV0Y29kZSkpOworCX0KKworCS8qIFNldCB1cCBiYWNrY2hhaW4uICovCisJaWYgKF9fcHV0X3VzZXIocmVncy0+Z3Byc1sxNV0sICh1bnNpZ25lZCBpbnQgX191c2VyICopIGZyYW1lKSkKKwkJZ290byBnaXZlX3NpZ3NlZ3Y7CisKKwkvKiBTZXQgdXAgcmVnaXN0ZXJzIGZvciBzaWduYWwgaGFuZGxlciAqLworCXJlZ3MtPmdwcnNbMTVdID0gKF9fdTY0KSBmcmFtZTsKKwlyZWdzLT5wc3cuYWRkciA9IChfX3U2NCkga2EtPnNhLnNhX2hhbmRsZXI7CisKKwlyZWdzLT5ncHJzWzJdID0gbWFwX3NpZ25hbChzaWcpOworCXJlZ3MtPmdwcnNbM10gPSAoX191NjQpICZmcmFtZS0+aW5mbzsKKwlyZWdzLT5ncHJzWzRdID0gKF9fdTY0KSAmZnJhbWUtPnVjOworCXJldHVybjsKKworZ2l2ZV9zaWdzZWd2OgorCWZvcmNlX3NpZ3NlZ3Yoc2lnLCBjdXJyZW50KTsKK30KKworLyoKKyAqIE9LLCB3ZSdyZSBpbnZva2luZyBhIGhhbmRsZXIKKyAqLwkKKwordm9pZAoraGFuZGxlX3NpZ25hbDMyKHVuc2lnbmVkIGxvbmcgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAorCQlzaWdpbmZvX3QgKmluZm8sIHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwkvKiBTZXQgdXAgdGhlIHN0YWNrIGZyYW1lICovCisJaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX1NJR0lORk8pCisJCXNldHVwX3J0X2ZyYW1lMzIoc2lnLCBrYSwgaW5mbywgb2xkc2V0LCByZWdzKTsKKwllbHNlCisJCXNldHVwX2ZyYW1lMzIoc2lnLCBrYSwgb2xkc2V0LCByZWdzKTsKKworCWlmICghKGthLT5zYS5zYV9mbGFncyAmIFNBX05PREVGRVIpKSB7CisJCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCQlzaWdvcnNldHMoJmN1cnJlbnQtPmJsb2NrZWQsJmN1cnJlbnQtPmJsb2NrZWQsJmthLT5zYS5zYV9tYXNrKTsKKwkJc2lnYWRkc2V0KCZjdXJyZW50LT5ibG9ja2VkLHNpZyk7CisJCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJfQorfQorCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLlMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E2MDdiMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUwpAQCAtMCwwICsxLDE0NDMgQEAKKy8qCisqICBhcmNoL3MzOTAva2VybmVsL3N5c193cmFwcGVyMzEuUworKiAgICB3cmFwcGVyIGZvciAzMSBiaXQgY29tcGF0aWJsZSBzeXN0ZW0gY2FsbHMuCisqCisqICBTMzkwIHZlcnNpb24KKyogICAgQ29weXJpZ2h0IChDKSAyMDAwIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCBJQk0gQ29ycG9yYXRpb24KKyogICAgQXV0aG9yKHMpOiBHZXJoYXJkIFRvbm4gKHRvbkBkZS5pYm0uY29tKSwKKyogICAgICAgICAgICAgICBUaG9tYXMgU3BhdHppZXIgKHRzcGF0QGRlLmlibS5jb20pCisqLyAKKworCS5nbG9ibCAgc3lzMzJfZXhpdF93cmFwcGVyIAorc3lzMzJfZXhpdF93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgaW50CisJamcJc3lzX2V4aXQJCSMgYnJhbmNoIHRvIHN5c19leGl0CisgICAgCisJLmdsb2JsICBzeXMzMl9yZWFkX3dyYXBwZXIgCitzeXMzMl9yZWFkX3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CisJbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCisJbGxnZnIJJXI0LCVyNAkJCSMgc2l6ZV90CisJamcJc3lzMzJfcmVhZAkJIyBicmFuY2ggdG8gc3lzX3JlYWQKKworCS5nbG9ibCAgc3lzMzJfd3JpdGVfd3JhcHBlciAKK3N5czMyX3dyaXRlX3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CisJbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciAqCisJbGxnZnIJJXI0LCVyNAkJCSMgc2l6ZV90CisJamcJc3lzMzJfd3JpdGUJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX29wZW5fd3JhcHBlciAKK3N5czMyX29wZW5fd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKKwlsZ2ZyCSVyMywlcjMJCQkjIGludAorCWxnZnIJJXI0LCVyNAkJCSMgaW50CisJamcJc3lzX29wZW4JCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX2Nsb3NlX3dyYXBwZXIgCitzeXMzMl9jbG9zZV93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAorCWpnCXN5c19jbG9zZQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfY3JlYXRfd3JhcHBlciAKK3N5czMyX2NyZWF0X3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCisJbGdmcgklcjMsJXIzCQkJIyBpbnQKKwlqZwlzeXNfY3JlYXQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX2xpbmtfd3JhcHBlciAKK3N5czMyX2xpbmtfd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKKwlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKKwlqZwlzeXNfbGluawkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfdW5saW5rX3dyYXBwZXIgCitzeXMzMl91bmxpbmtfd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKKwlqZwlzeXNfdW5saW5rCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9jaGRpcl93cmFwcGVyIAorc3lzMzJfY2hkaXJfd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKKwlqZwlzeXNfY2hkaXIJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX3RpbWVfd3JhcHBlciAKK3N5czMyX3RpbWVfd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyBpbnQgKgorCWpnCWNvbXBhdF9zeXNfdGltZQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfbWtub2Rfd3JhcHBlciAKK3N5czMyX21rbm9kX3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCisJbGdmcgklcjMsJXIzCQkJIyBpbnQgCisJbGxnZnIJJXI0LCVyNAkJCSMgZGV2CisJamcJc3lzX21rbm9kCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9jaG1vZF93cmFwcGVyIAorc3lzMzJfY2htb2Rfd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKKwlsbGdmcgklcjMsJXIzCQkJIyBtb2RlX3QKKwlqZwlzeXNfY2htb2QJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX2xjaG93bjE2X3dyYXBwZXIgCitzeXMzMl9sY2hvd24xNl93cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgorCWxsZ2ZyCSVyMywlcjMJCQkjIF9fa2VybmVsX29sZF91aWRfZW11MzFfdCAKKwlsbGdmcgklcjQsJXI0CQkJIyBfX2tlcm5lbF9vbGRfdWlkX2VtdTMxX3QgCisJamcJc3lzMzJfbGNob3duMTYJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX2xzZWVrX3dyYXBwZXIgCitzeXMzMl9sc2Vla193cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAorCWxnZnIJJXIzLCVyMwkJCSMgb2ZmX3QKKwlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBpbnQKKwlqZwlzeXNfbHNlZWsJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKyNzeXMzMl9nZXRwaWRfd3JhcHBlcgkJCQkjIHZvaWQgCisKKwkuZ2xvYmwgIHN5czMyX21vdW50X3dyYXBwZXIgCitzeXMzMl9tb3VudF93cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgorCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgorCWxsZ3RyCSVyNCwlcjQJCQkjIGNoYXIgKgorCWxsZ2ZyCSVyNSwlcjUJCQkjIHVuc2lnbmVkIGxvbmcKKwlsbGd0cgklcjYsJXI2CQkJIyB2b2lkICoKKwlqZwljb21wYXRfc3lzX21vdW50CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX29sZHVtb3VudF93cmFwcGVyIAorc3lzMzJfb2xkdW1vdW50X3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCisJamcJc3lzX29sZHVtb3VudAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfc2V0dWlkMTZfd3JhcHBlciAKK3N5czMyX3NldHVpZDE2X3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgX19rZXJuZWxfb2xkX3VpZF9lbXUzMV90IAorCWpnCXN5czMyX3NldHVpZDE2CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisjc3lzMzJfZ2V0dWlkMTZfd3JhcHBlcgkJCSMgdm9pZCAKKworCS5nbG9ibCAgc3lzMzJfcHRyYWNlX3dyYXBwZXIgCitzeXMzMl9wdHJhY2Vfd3JhcHBlcjoKKwlsZ2ZyCSVyMiwlcjIJCQkjIGxvbmcKKwlsZ2ZyCSVyMywlcjMJCQkjIGxvbmcKKwlsbGd0cgklcjQsJXI0CQkJIyBsb25nCisJbGxnZnIJJXI1LCVyNQkJCSMgbG9uZworCWpnCXN5c19wdHJhY2UJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX2FsYXJtX3dyYXBwZXIgCitzeXMzMl9hbGFybV93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAorCWpnCXN5c19hbGFybQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworI3N5czMyX3BhdXNlX3dyYXBwZXIJCQkjIHZvaWQgCisKKwkuZ2xvYmwgIGNvbXBhdF9zeXNfdXRpbWVfd3JhcHBlciAKK2NvbXBhdF9zeXNfdXRpbWVfd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKKwlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgY29tcGF0X3V0aW1idWYgKgorCWpnCWNvbXBhdF9zeXNfdXRpbWUJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfYWNjZXNzX3dyYXBwZXIgCitzeXMzMl9hY2Nlc3Nfd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKKwlsZ2ZyCSVyMywlcjMJCQkjIGludAorCWpnCXN5c19hY2Nlc3MJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX25pY2Vfd3JhcHBlciAKK3N5czMyX25pY2Vfd3JhcHBlcjoKKwlsZ2ZyCSVyMiwlcjIJCQkjIGludAorCWpnCXN5c19uaWNlCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisjc3lzMzJfc3luY193cmFwcGVyCQkJIyB2b2lkIAorCisJLmdsb2JsICBzeXMzMl9raWxsX3dyYXBwZXIgCitzeXMzMl9raWxsX3dyYXBwZXI6CisJbGdmcgklcjIsJXIyCQkJIyBpbnQKKwlsZ2ZyCSVyMywlcjMJCQkjIGludAorCWpnCXN5c19raWxsCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9yZW5hbWVfd3JhcHBlciAKK3N5czMyX3JlbmFtZV93cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgorCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgorCWpnCXN5c19yZW5hbWUJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX21rZGlyX3dyYXBwZXIgCitzeXMzMl9ta2Rpcl93cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgorCWxnZnIJJXIzLCVyMwkJCSMgaW50CisJamcJc3lzX21rZGlyCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9ybWRpcl93cmFwcGVyIAorc3lzMzJfcm1kaXJfd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKKwlqZwlzeXNfcm1kaXIJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX2R1cF93cmFwcGVyIAorc3lzMzJfZHVwX3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CisJamcJc3lzX2R1cAkJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX3BpcGVfd3JhcHBlciAKK3N5czMyX3BpcGVfd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyB1MzIgKgorCWpnCXN5c19waXBlCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBjb21wYXRfc3lzX3RpbWVzX3dyYXBwZXIgCitjb21wYXRfc3lzX3RpbWVzX3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgc3RydWN0IGNvbXBhdF90bXMgKgorCWpnCWNvbXBhdF9zeXNfdGltZXMJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfYnJrX3dyYXBwZXIgCitzeXMzMl9icmtfd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nCisJamcJc3lzX2JyawkJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX3NldGdpZDE2X3dyYXBwZXIgCitzeXMzMl9zZXRnaWQxNl93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIF9fa2VybmVsX29sZF9naWRfZW11MzFfdCAKKwlqZwlzeXMzMl9zZXRnaWQxNgkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworI3N5czMyX2dldGdpZDE2X3dyYXBwZXIJCQkjIHZvaWQgCisKKwkuZ2xvYmwgc3lzMzJfc2lnbmFsX3dyYXBwZXIKK3N5czMyX3NpZ25hbF93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgaW50IAorCWxsZ3RyCSVyMywlcjMJCQkjIF9fc2lnaGFuZGxlcl90CisJamcJc3lzX3NpZ25hbAorCisjc3lzMzJfZ2V0ZXVpZDE2X3dyYXBwZXIJCSMgdm9pZCAKKworI3N5czMyX2dldGVnaWQxNl93cmFwcGVyCQkjIHZvaWQgCisKKwkuZ2xvYmwgIHN5czMyX2FjY3Rfd3JhcHBlciAKK3N5czMyX2FjY3Rfd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKKwlqZwlzeXNfYWNjdAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfdW1vdW50X3dyYXBwZXIgCitzeXMzMl91bW91bnRfd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKKwlsZ2ZyCSVyMywlcjMJCQkjIGludAorCWpnCXN5c191bW91bnQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIGNvbXBhdF9zeXNfaW9jdGxfd3JhcHBlcgorY29tcGF0X3N5c19pb2N0bF93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAorCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGludAorCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGludAorCWpnCWNvbXBhdF9zeXNfaW9jdGwJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgY29tcGF0X3N5c19mY250bF93cmFwcGVyIAorY29tcGF0X3N5c19mY250bF93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAorCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGludCAKKwlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBsb25nCisJamcJY29tcGF0X3N5c19mY250bAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9zZXRwZ2lkX3dyYXBwZXIgCitzeXMzMl9zZXRwZ2lkX3dyYXBwZXI6CisJbGdmcgklcjIsJXIyCQkJIyBwaWRfdAorCWxnZnIJJXIzLCVyMwkJCSMgcGlkX3QKKwlqZwlzeXNfc2V0cGdpZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfdW1hc2tfd3JhcHBlciAKK3N5czMyX3VtYXNrX3dyYXBwZXI6CisJbGdmcgklcjIsJXIyCQkJIyBpbnQKKwlqZwlzeXNfdW1hc2sJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX2Nocm9vdF93cmFwcGVyIAorc3lzMzJfY2hyb290X3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCisJamcJc3lzX2Nocm9vdAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCBzeXMzMl91c3RhdF93cmFwcGVyCitzeXMzMl91c3RhdF93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIGRldl90IAorCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCB1c3RhdCAqCisJamcJc3lzX3VzdGF0CisKKwkuZ2xvYmwgIHN5czMyX2R1cDJfd3JhcHBlciAKK3N5czMyX2R1cDJfd3JhcHBlcjoKKwlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKKwlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBpbnQKKwlqZwlzeXNfZHVwMgkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworI3N5czMyX2dldHBwaWRfd3JhcHBlcgkJCSMgdm9pZCAKKworI3N5czMyX2dldHBncnBfd3JhcHBlcgkJCSMgdm9pZCAKKworI3N5czMyX3NldHNpZF93cmFwcGVyCQkJIyB2b2lkIAorCisJLmdsb2JsICBzeXMzMl9zaWdhY3Rpb25fd3JhcHBlcgorc3lzMzJfc2lnYWN0aW9uX3dyYXBwZXI6CisJbGdmcgklcjIsJXIyCQkJIyBpbnQgCisJbGxndHIJJXIzLCVyMwkJCSMgY29uc3Qgc3RydWN0IG9sZF9zaWdhY3Rpb24gKgorCWxsZ3RyCSVyNCwlcjQJCQkjIHN0cnVjdCBvbGRfc2lnYWN0aW9uMzIgKgorCWpnCXN5czMyX3NpZ2FjdGlvbgkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfc2V0cmV1aWQxNl93cmFwcGVyIAorc3lzMzJfc2V0cmV1aWQxNl93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIF9fa2VybmVsX29sZF91aWRfZW11MzFfdCAKKwlsbGdmcgklcjMsJXIzCQkJIyBfX2tlcm5lbF9vbGRfdWlkX2VtdTMxX3QgCisJamcJc3lzMzJfc2V0cmV1aWQxNgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9zZXRyZWdpZDE2X3dyYXBwZXIgCitzeXMzMl9zZXRyZWdpZDE2X3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgX19rZXJuZWxfb2xkX2dpZF9lbXUzMV90IAorCWxsZ2ZyCSVyMywlcjMJCQkjIF9fa2VybmVsX29sZF9naWRfZW11MzFfdCAKKwlqZwlzeXMzMl9zZXRyZWdpZDE2CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKyNzeXMzMl9zaWdzdXNwZW5kX3dyYXBwZXIJCSMgZG9uZSBpbiBzaWdzdXNwZW5kX2dsdWUgCisKKwkuZ2xvYmwgIGNvbXBhdF9zeXNfc2lncGVuZGluZ193cmFwcGVyIAorY29tcGF0X3N5c19zaWdwZW5kaW5nX3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgY29tcGF0X29sZF9zaWdzZXRfdCAqCisJamcJY29tcGF0X3N5c19zaWdwZW5kaW5nCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX3NldGhvc3RuYW1lX3dyYXBwZXIgCitzeXMzMl9zZXRob3N0bmFtZV93cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgorCWxnZnIJJXIzLCVyMwkJCSMgaW50CisJamcJc3lzX3NldGhvc3RuYW1lCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBjb21wYXRfc3lzX3NldHJsaW1pdF93cmFwcGVyIAorY29tcGF0X3N5c19zZXRybGltaXRfd3JhcHBlcjoKKwlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKKwlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgcmxpbWl0X2VtdTMxICoKKwlqZwljb21wYXRfc3lzX3NldHJsaW1pdAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBjb21wYXRfc3lzX29sZF9nZXRybGltaXRfd3JhcHBlciAKK2NvbXBhdF9zeXNfb2xkX2dldHJsaW1pdF93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAorCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBybGltaXRfZW11MzEgKgorCWpnCWNvbXBhdF9zeXNfb2xkX2dldHJsaW1pdCAjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBjb21wYXRfc3lzX2dldHJsaW1pdF93cmFwcGVyIAorY29tcGF0X3N5c19nZXRybGltaXRfd3JhcHBlcjoKKwlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKKwlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgcmxpbWl0X2VtdTMxICoKKwlqZwljb21wYXRfc3lzX2dldHJsaW1pdAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9tbWFwMl93cmFwcGVyIAorc3lzMzJfbW1hcDJfd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyBzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0X2VtdTMxICoKKwlqZwlzeXMzMl9tbWFwMgkJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIGNvbXBhdF9zeXNfZ2V0cnVzYWdlX3dyYXBwZXIgCitjb21wYXRfc3lzX2dldHJ1c2FnZV93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgaW50CisJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHJ1c2FnZV9lbXUzMSAqCisJamcJY29tcGF0X3N5c19nZXRydXNhZ2UJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfZ2V0dGltZW9mZGF5X3dyYXBwZXIgCitzeXMzMl9nZXR0aW1lb2ZkYXlfd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyBzdHJ1Y3QgdGltZXZhbF9lbXUzMSAqCisJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHRpbWV6b25lICoKKwlqZwlzeXMzMl9nZXR0aW1lb2ZkYXkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfc2V0dGltZW9mZGF5X3dyYXBwZXIgCitzeXMzMl9zZXR0aW1lb2ZkYXlfd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyBzdHJ1Y3QgdGltZXZhbF9lbXUzMSAqCisJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHRpbWV6b25lICoKKwlqZwlzeXMzMl9zZXR0aW1lb2ZkYXkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfZ2V0Z3JvdXBzMTZfd3JhcHBlciAKK3N5czMyX2dldGdyb3VwczE2X3dyYXBwZXI6CisJbGdmcgklcjIsJXIyCQkJIyBpbnQKKwlsbGd0cgklcjMsJXIzCQkJIyBfX2tlcm5lbF9vbGRfZ2lkX2VtdTMxX3QgKgorCWpnCXN5czMyX2dldGdyb3VwczE2CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX3NldGdyb3VwczE2X3dyYXBwZXIgCitzeXMzMl9zZXRncm91cHMxNl93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgaW50CisJbGxndHIJJXIzLCVyMwkJCSMgX19rZXJuZWxfb2xkX2dpZF9lbXUzMV90ICoKKwlqZwlzeXMzMl9zZXRncm91cHMxNgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9zeW1saW5rX3dyYXBwZXIgCitzeXMzMl9zeW1saW5rX3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCisJbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciAqCisJamcJc3lzX3N5bWxpbmsJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX3JlYWRsaW5rX3dyYXBwZXIgCitzeXMzMl9yZWFkbGlua193cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgorCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgorCWxnZnIJJXI0LCVyNAkJCSMgaW50CisJamcJc3lzX3JlYWRsaW5rCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl91c2VsaWJfd3JhcHBlciAKK3N5czMyX3VzZWxpYl93cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgorCWpnCXN5c191c2VsaWIJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX3N3YXBvbl93cmFwcGVyIAorc3lzMzJfc3dhcG9uX3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCisJbGdmcgklcjMsJXIzCQkJIyBpbnQKKwlqZwlzeXNfc3dhcG9uCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9yZWJvb3Rfd3JhcHBlciAKK3N5czMyX3JlYm9vdF93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgaW50CisJbGdmcgklcjMsJXIzCQkJIyBpbnQKKwlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBpbnQKKwlsbGd0cgklcjUsJXI1CQkJIyB2b2lkICoKKwlqZwlzeXNfcmVib290CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBvbGQzMl9yZWFkZGlyX3dyYXBwZXIgCitvbGQzMl9yZWFkZGlyX3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CisJbGxndHIJJXIzLCVyMwkJCSMgdm9pZCAqCisJbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgaW50CisJamcJY29tcGF0X3N5c19vbGRfcmVhZGRpcgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBvbGQzMl9tbWFwX3dyYXBwZXIgCitvbGQzMl9tbWFwX3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgc3RydWN0IG1tYXBfYXJnX3N0cnVjdF9lbXUzMSAqCisJamcJb2xkMzJfbW1hcAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfbXVubWFwX3dyYXBwZXIgCitzeXMzMl9tdW5tYXBfd3JhcHBlcjoKKwlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nCisJbGxnZnIJJXIzLCVyMwkJCSMgc2l6ZV90IAorCWpnCXN5c19tdW5tYXAJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX3RydW5jYXRlX3dyYXBwZXIgCitzeXMzMl90cnVuY2F0ZV93cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgorCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGxvbmcKKwlqZwlzeXNfdHJ1bmNhdGUJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX2Z0cnVuY2F0ZV93cmFwcGVyIAorc3lzMzJfZnRydW5jYXRlX3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CisJbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgbG9uZworCWpnCXN5c19mdHJ1bmNhdGUJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX2ZjaG1vZF93cmFwcGVyIAorc3lzMzJfZmNobW9kX3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CisJbGxnZnIJJXIzLCVyMwkJCSMgbW9kZV90CisJamcJc3lzX2ZjaG1vZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfZmNob3duMTZfd3JhcHBlciAKK3N5czMyX2ZjaG93bjE2X3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CisJbGxnZnIJJXIzLCVyMwkJCSMgY29tcGF0X3VpZF90CisJbGxnZnIJJXI0LCVyNAkJCSMgY29tcGF0X3VpZF90CisJamcJc3lzMzJfZmNob3duMTYJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX2dldHByaW9yaXR5X3dyYXBwZXIgCitzeXMzMl9nZXRwcmlvcml0eV93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgaW50CisJbGdmcgklcjMsJXIzCQkJIyBpbnQKKwlqZwlzeXNfZ2V0cHJpb3JpdHkJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX3NldHByaW9yaXR5X3dyYXBwZXIgCitzeXMzMl9zZXRwcmlvcml0eV93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgaW50CisJbGdmcgklcjMsJXIzCQkJIyBpbnQKKwlsZ2ZyCSVyNCwlcjQJCQkjIGludAorCWpnCXN5c19zZXRwcmlvcml0eQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgY29tcGF0X3N5c19zdGF0ZnNfd3JhcHBlciAKK2NvbXBhdF9zeXNfc3RhdGZzX3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCisJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF9zdGF0ZnMgKgorCWpnCWNvbXBhdF9zeXNfc3RhdGZzCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIGNvbXBhdF9zeXNfZnN0YXRmc193cmFwcGVyIAorY29tcGF0X3N5c19mc3RhdGZzX3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CisJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF9zdGF0ZnMgKgorCWpnCWNvbXBhdF9zeXNfZnN0YXRmcwkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBjb21wYXRfc3lzX3NvY2tldGNhbGxfd3JhcHBlciAKK2NvbXBhdF9zeXNfc29ja2V0Y2FsbF93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgaW50CisJbGxndHIJJXIzLCVyMwkJCSMgdTMyICoKKwlqZwljb21wYXRfc3lzX3NvY2tldGNhbGwJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfc3lzbG9nX3dyYXBwZXIgCitzeXMzMl9zeXNsb2dfd3JhcHBlcjoKKwlsZ2ZyCSVyMiwlcjIJCQkjIGludAorCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgorCWxnZnIJJXI0LCVyNAkJCSMgaW50CisJamcJc3lzX3N5c2xvZwkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgY29tcGF0X3N5c19zZXRpdGltZXJfd3JhcHBlciAKK2NvbXBhdF9zeXNfc2V0aXRpbWVyX3dyYXBwZXI6CisJbGdmcgklcjIsJXIyCQkJIyBpbnQKKwlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgaXRpbWVydmFsX2VtdTMxICoKKwlsbGd0cgklcjQsJXI0CQkJIyBzdHJ1Y3QgaXRpbWVydmFsX2VtdTMxICoKKwlqZwljb21wYXRfc3lzX3NldGl0aW1lcgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBjb21wYXRfc3lzX2dldGl0aW1lcl93cmFwcGVyIAorY29tcGF0X3N5c19nZXRpdGltZXJfd3JhcHBlcjoKKwlsZ2ZyCSVyMiwlcjIJCQkjIGludAorCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBpdGltZXJ2YWxfZW11MzEgKgorCWpnCWNvbXBhdF9zeXNfZ2V0aXRpbWVyCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIGNvbXBhdF9zeXNfbmV3c3RhdF93cmFwcGVyIAorY29tcGF0X3N5c19uZXdzdGF0X3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCisJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHN0YXRfZW11MzEgKgorCWpnCWNvbXBhdF9zeXNfbmV3c3RhdAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBjb21wYXRfc3lzX25ld2xzdGF0X3dyYXBwZXIgCitjb21wYXRfc3lzX25ld2xzdGF0X3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCisJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHN0YXRfZW11MzEgKgorCWpnCWNvbXBhdF9zeXNfbmV3bHN0YXQJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgY29tcGF0X3N5c19uZXdmc3RhdF93cmFwcGVyIAorY29tcGF0X3N5c19uZXdmc3RhdF93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAorCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBzdGF0X2VtdTMxICoKKwlqZwljb21wYXRfc3lzX25ld2ZzdGF0CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKyNzeXMzMl92aGFuZ3VwX3dyYXBwZXIJCQkjIHZvaWQgCisKKwkuZ2xvYmwgIGNvbXBhdF9zeXNfd2FpdDRfd3JhcHBlciAKK2NvbXBhdF9zeXNfd2FpdDRfd3JhcHBlcjoKKwlsZ2ZyCSVyMiwlcjIJCQkjIHBpZF90CisJbGxndHIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50ICoKKwlsZ2ZyCSVyNCwlcjQJCQkjIGludAorCWxsZ3RyCSVyNSwlcjUJCQkjIHN0cnVjdCBydXNhZ2UgKgorCWpnCWNvbXBhdF9zeXNfd2FpdDQJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfc3dhcG9mZl93cmFwcGVyIAorc3lzMzJfc3dhcG9mZl93cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgorCWpnCXN5c19zd2Fwb2ZmCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9zeXNpbmZvX3dyYXBwZXIgCitzeXMzMl9zeXNpbmZvX3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgc3RydWN0IHN5c2luZm9fZW11MzEgKgorCWpnCXN5czMyX3N5c2luZm8JCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX2lwY193cmFwcGVyIAorc3lzMzJfaXBjX3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgdWludAorCWxnZnIJJXIzLCVyMwkJCSMgaW50CisJbGdmcgklcjQsJXI0CQkJIyBpbnQKKwlsZ2ZyCSVyNSwlcjUJCQkjIGludAorCWxsZ2ZyCSVyNiwlcjYJCQkjIHUzMgorCWpnCXN5czMyX2lwYwkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfZnN5bmNfd3JhcHBlciAKK3N5czMyX2ZzeW5jX3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CisJamcJc3lzX2ZzeW5jCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisjc3lzMzJfc2lncmV0dXJuX3dyYXBwZXIJCSMgZG9uZSBpbiBzaWdyZXR1cm5fZ2x1ZSAKKworI3N5czMyX2Nsb25lX3dyYXBwZXIJCQkjIGRvbmUgaW4gY2xvbmVfZ2x1ZSAKKworCS5nbG9ibCAgc3lzMzJfc2V0ZG9tYWlubmFtZV93cmFwcGVyIAorc3lzMzJfc2V0ZG9tYWlubmFtZV93cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgorCWxnZnIJJXIzLCVyMwkJCSMgaW50CisJamcJc3lzX3NldGRvbWFpbm5hbWUJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfbmV3dW5hbWVfd3JhcHBlciAKK3N5czMyX25ld3VuYW1lX3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgc3RydWN0IG5ld191dHNuYW1lICoKKwlqZwlzMzkweF9uZXd1bmFtZQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfYWRqdGltZXhfd3JhcHBlciAKK3N5czMyX2FkanRpbWV4X3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgc3RydWN0IHRpbWV4X2VtdTMxICoKKwlqZwlzeXMzMl9hZGp0aW1leAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfbXByb3RlY3Rfd3JhcHBlciAKK3N5czMyX21wcm90ZWN0X3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgdW5zaWduZWQgbG9uZyAoYWN0dWFsbHkgcG9pbnRlcgorCWxsZ2ZyCSVyMywlcjMJCQkjIHNpemVfdAorCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcKKwlqZwlzeXNfbXByb3RlY3QJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIGNvbXBhdF9zeXNfc2lncHJvY21hc2tfd3JhcHBlciAKK2NvbXBhdF9zeXNfc2lncHJvY21hc2tfd3JhcHBlcjoKKwlsZ2ZyCSVyMiwlcjIJCQkjIGludAorCWxsZ3RyCSVyMywlcjMJCQkjIGNvbXBhdF9vbGRfc2lnc2V0X3QgKgorCWxsZ3RyCSVyNCwlcjQJCQkjIGNvbXBhdF9vbGRfc2lnc2V0X3QgKgorCWpnCWNvbXBhdF9zeXNfc2lncHJvY21hc2sJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX2luaXRfbW9kdWxlX3dyYXBwZXIgCitzeXMzMl9pbml0X21vZHVsZV93cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIHZvaWQgKgorCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGxvbmcKKwlsbGd0cgklcjQsJXI0CQkJIyBjaGFyICoKKwlqZwlzeXMzMl9pbml0X21vZHVsZQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9kZWxldGVfbW9kdWxlX3dyYXBwZXIgCitzeXMzMl9kZWxldGVfbW9kdWxlX3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCisJbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50CisJamcJc3lzMzJfZGVsZXRlX21vZHVsZQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9xdW90YWN0bF93cmFwcGVyIAorc3lzMzJfcXVvdGFjdGxfd3JhcHBlcjoKKwlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKKwlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKKwlsbGdmcgklcjQsJXI0CQkJIyBxaWRfdAorCWxsZ3RyCSVyNSwlcjUJCQkjIGNhZGRyX3QKKwlqZwlzeXNfcXVvdGFjdGwJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX2dldHBnaWRfd3JhcHBlciAKK3N5czMyX2dldHBnaWRfd3JhcHBlcjoKKwlsZ2ZyCSVyMiwlcjIJCQkjIHBpZF90CisJamcJc3lzX2dldHBnaWQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX2ZjaGRpcl93cmFwcGVyIAorc3lzMzJfZmNoZGlyX3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CisJamcJc3lzX2ZjaGRpcgkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfYmRmbHVzaF93cmFwcGVyIAorc3lzMzJfYmRmbHVzaF93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgaW50CisJbGdmcgklcjMsJXIzCQkJIyBsb25nCisJamcJc3lzX2JkZmx1c2gJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX3N5c2ZzX3dyYXBwZXIgCitzeXMzMl9zeXNmc193cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgaW50CisJbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgbG9uZworCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcKKwlqZwlzeXNfc3lzZnMJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX3BlcnNvbmFsaXR5X3dyYXBwZXIgCitzeXMzMl9wZXJzb25hbGl0eV93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGxvbmcKKwlqZwlzMzkweF9wZXJzb25hbGl0eQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9zZXRmc3VpZDE2X3dyYXBwZXIgCitzeXMzMl9zZXRmc3VpZDE2X3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgX19rZXJuZWxfb2xkX3VpZF9lbXUzMV90IAorCWpnCXN5czMyX3NldGZzdWlkMTYJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfc2V0ZnNnaWQxNl93cmFwcGVyIAorc3lzMzJfc2V0ZnNnaWQxNl93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIF9fa2VybmVsX29sZF9naWRfZW11MzFfdCAKKwlqZwlzeXMzMl9zZXRmc2dpZDE2CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX2xsc2Vla193cmFwcGVyIAorc3lzMzJfbGxzZWVrX3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CisJbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgbG9uZworCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcKKwlsbGd0cgklcjUsJXI1CQkJIyBsb2ZmX3QgKgorCWxsZ2ZyCSVyNiwlcjYJCQkjIHVuc2lnbmVkIGludAorCWpnCXN5c19sbHNlZWsJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX2dldGRlbnRzX3dyYXBwZXIgCitzeXMzMl9nZXRkZW50c193cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAorCWxsZ3RyCSVyMywlcjMJCQkjIHZvaWQgKgorCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGludAorCWpnCWNvbXBhdF9zeXNfZ2V0ZGVudHMJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgY29tcGF0X3N5c19zZWxlY3Rfd3JhcHBlcgorY29tcGF0X3N5c19zZWxlY3Rfd3JhcHBlcjoKKwlsZ2ZyCSVyMiwlcjIJCQkjIGludAorCWxsZ3RyCSVyMywlcjMJCQkjIGNvbXBhdF9mZF9zZXQgKgorCWxsZ3RyCSVyNCwlcjQJCQkjIGNvbXBhdF9mZF9zZXQgKgorCWxsZ3RyCSVyNSwlcjUJCQkjIGNvbXBhdF9mZF9zZXQgKgorCWxsZ3RyCSVyNiwlcjYJCQkjIHN0cnVjdCBjb21wYXRfdGltZXZhbCAqCisJamcJY29tcGF0X3N5c19zZWxlY3QJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfZmxvY2tfd3JhcHBlciAKK3N5czMyX2Zsb2NrX3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CisJbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50CisJamcJc3lzX2Zsb2NrCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9tc3luY193cmFwcGVyIAorc3lzMzJfbXN5bmNfd3JhcHBlcjoKKwlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nCisJbGxnZnIJJXIzLCVyMwkJCSMgc2l6ZV90CisJbGdmcgklcjQsJXI0CQkJIyBpbnQKKwlqZwlzeXNfbXN5bmMJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIGNvbXBhdF9zeXNfcmVhZHZfd3JhcHBlcgorY29tcGF0X3N5c19yZWFkdl93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgaW50CisJbGxndHIJJXIzLCVyMwkJCSMgY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyAqCisJbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgbG9uZworCWpnCWNvbXBhdF9zeXNfcmVhZHYJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgY29tcGF0X3N5c193cml0ZXZfd3JhcHBlcgorY29tcGF0X3N5c193cml0ZXZfd3JhcHBlcjoKKwlsZ2ZyCSVyMiwlcjIJCQkjIGludAorCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgKgorCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcKKwlqZwljb21wYXRfc3lzX3dyaXRldgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9nZXRzaWRfd3JhcHBlciAKK3N5czMyX2dldHNpZF93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgcGlkX3QKKwlqZwlzeXNfZ2V0c2lkCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9mZGF0YXN5bmNfd3JhcHBlciAKK3N5czMyX2ZkYXRhc3luY193cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAorCWpnCXN5c19mZGF0YXN5bmMJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKyNzeXMzMl9zeXNjdGxfd3JhcHBlcgkJCSMgdGJkIAorCisJLmdsb2JsICBzeXMzMl9tbG9ja193cmFwcGVyIAorc3lzMzJfbWxvY2tfd3JhcHBlcjoKKwlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nCisJbGxnZnIJJXIzLCVyMwkJCSMgc2l6ZV90CisJamcJc3lzX21sb2NrCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9tdW5sb2NrX3dyYXBwZXIgCitzeXMzMl9tdW5sb2NrX3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgbG9uZworCWxsZ2ZyCSVyMywlcjMJCQkjIHNpemVfdAorCWpnCXN5c19tdW5sb2NrCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9tbG9ja2FsbF93cmFwcGVyIAorc3lzMzJfbWxvY2thbGxfd3JhcHBlcjoKKwlsZ2ZyCSVyMiwlcjIJCQkjIGludAorCWpnCXN5c19tbG9ja2FsbAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworI3N5czMyX211bmxvY2thbGxfd3JhcHBlcgkJIyB2b2lkIAorCisJLmdsb2JsICBzeXMzMl9zY2hlZF9zZXRwYXJhbV93cmFwcGVyIAorc3lzMzJfc2NoZWRfc2V0cGFyYW1fd3JhcHBlcjoKKwlsZ2ZyCSVyMiwlcjIJCQkjIHBpZF90CisJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHNjaGVkX3BhcmFtICoKKwlqZwlzeXNfc2NoZWRfc2V0cGFyYW0JIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfc2NoZWRfZ2V0cGFyYW1fd3JhcHBlciAKK3N5czMyX3NjaGVkX2dldHBhcmFtX3dyYXBwZXI6CisJbGdmcgklcjIsJXIyCQkJIyBwaWRfdAorCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBzY2hlZF9wYXJhbSAqCisJamcJc3lzX3NjaGVkX2dldHBhcmFtCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX3NjaGVkX3NldHNjaGVkdWxlcl93cmFwcGVyIAorc3lzMzJfc2NoZWRfc2V0c2NoZWR1bGVyX3dyYXBwZXI6CisJbGdmcgklcjIsJXIyCQkJIyBwaWRfdAorCWxnZnIJJXIzLCVyMwkJCSMgaW50CisJbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IHNjaGVkX3BhcmFtICoKKwlqZwlzeXNfc2NoZWRfc2V0c2NoZWR1bGVyCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX3NjaGVkX2dldHNjaGVkdWxlcl93cmFwcGVyIAorc3lzMzJfc2NoZWRfZ2V0c2NoZWR1bGVyX3dyYXBwZXI6CisJbGdmcgklcjIsJXIyCQkJIyBwaWRfdAorCWpnCXN5c19zY2hlZF9nZXRzY2hlZHVsZXIJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworI3N5czMyX3NjaGVkX3lpZWxkX3dyYXBwZXIJCSMgdm9pZCAKKworCS5nbG9ibCAgc3lzMzJfc2NoZWRfZ2V0X3ByaW9yaXR5X21heF93cmFwcGVyIAorc3lzMzJfc2NoZWRfZ2V0X3ByaW9yaXR5X21heF93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgaW50CisJamcJc3lzX3NjaGVkX2dldF9wcmlvcml0eV9tYXgJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbl93cmFwcGVyIAorc3lzMzJfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbl93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgaW50CisJamcJc3lzX3NjaGVkX2dldF9wcmlvcml0eV9taW4JIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfc2NoZWRfcnJfZ2V0X2ludGVydmFsX3dyYXBwZXIgCitzeXMzMl9zY2hlZF9ycl9nZXRfaW50ZXJ2YWxfd3JhcHBlcjoKKwlsZ2ZyCSVyMiwlcjIJCQkjIHBpZF90CisJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF90aW1lc3BlYyAqCisJamcJc3lzMzJfc2NoZWRfcnJfZ2V0X2ludGVydmFsCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIGNvbXBhdF9zeXNfbmFub3NsZWVwX3dyYXBwZXIgCitjb21wYXRfc3lzX25hbm9zbGVlcF93cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgKgorCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgKgorCWpnCWNvbXBhdF9zeXNfbmFub3NsZWVwCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9tcmVtYXBfd3JhcHBlciAKK3N5czMyX21yZW1hcF93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGxvbmcKKwlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBsb25nCisJbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgbG9uZworCWxsZ2ZyCSVyNSwlcjUJCQkjIHVuc2lnbmVkIGxvbmcKKwlsbGdmcgklcjYsJXI2CQkJIyB1bnNpZ25lZCBsb25nCisJamcJc3lzX21yZW1hcAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfc2V0cmVzdWlkMTZfd3JhcHBlciAKK3N5czMyX3NldHJlc3VpZDE2X3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgX19rZXJuZWxfb2xkX3VpZF9lbXUzMV90IAorCWxsZ2ZyCSVyMywlcjMJCQkjIF9fa2VybmVsX29sZF91aWRfZW11MzFfdCAKKwlsbGdmcgklcjQsJXI0CQkJIyBfX2tlcm5lbF9vbGRfdWlkX2VtdTMxX3QgCisJamcJc3lzMzJfc2V0cmVzdWlkMTYJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfZ2V0cmVzdWlkMTZfd3JhcHBlciAKK3N5czMyX2dldHJlc3VpZDE2X3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgX19rZXJuZWxfb2xkX3VpZF9lbXUzMV90ICoKKwlsbGd0cgklcjMsJXIzCQkJIyBfX2tlcm5lbF9vbGRfdWlkX2VtdTMxX3QgKgorCWxsZ3RyCSVyNCwlcjQJCQkjIF9fa2VybmVsX29sZF91aWRfZW11MzFfdCAqCisJamcJc3lzMzJfZ2V0cmVzdWlkMTYJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfcG9sbF93cmFwcGVyIAorc3lzMzJfcG9sbF93cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIHN0cnVjdCBwb2xsZmQgKiAKKwlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBpbnQgCisJbGdmcgklcjQsJXI0CQkJIyBsb25nIAorCWpnCXN5c19wb2xsCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBjb21wYXRfc3lzX25mc3NlcnZjdGxfd3JhcHBlcgorY29tcGF0X3N5c19uZnNzZXJ2Y3RsX3dyYXBwZXI6CisJbGdmcgklcjIsJXIyCQkJIyBpbnQgCisJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF9uZnNjdGxfYXJnKgorCWxsZ3RyCSVyNCwlcjQJCQkjIHVuaW9uIGNvbXBhdF9uZnNjdGxfcmVzKgorCWpnCWNvbXBhdF9zeXNfbmZzc2VydmN0bAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9zZXRyZXNnaWQxNl93cmFwcGVyIAorc3lzMzJfc2V0cmVzZ2lkMTZfd3JhcHBlcjoKKwlsbGdmcgklcjIsJXIyCQkJIyBfX2tlcm5lbF9vbGRfZ2lkX2VtdTMxX3QgCisJbGxnZnIJJXIzLCVyMwkJCSMgX19rZXJuZWxfb2xkX2dpZF9lbXUzMV90IAorCWxsZ2ZyCSVyNCwlcjQJCQkjIF9fa2VybmVsX29sZF9naWRfZW11MzFfdCAKKwlqZwlzeXMzMl9zZXRyZXNnaWQxNgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9nZXRyZXNnaWQxNl93cmFwcGVyIAorc3lzMzJfZ2V0cmVzZ2lkMTZfd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyBfX2tlcm5lbF9vbGRfZ2lkX2VtdTMxX3QgKgorCWxsZ3RyCSVyMywlcjMJCQkjIF9fa2VybmVsX29sZF9naWRfZW11MzFfdCAqCisJbGxndHIJJXI0LCVyNAkJCSMgX19rZXJuZWxfb2xkX2dpZF9lbXUzMV90ICoKKwlqZwlzeXMzMl9nZXRyZXNnaWQxNgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9wcmN0bF93cmFwcGVyIAorc3lzMzJfcHJjdGxfd3JhcHBlcjoKKwlsZ2ZyCSVyMiwlcjIJCQkjIGludAorCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGxvbmcKKwlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBsb25nCisJbGxnZnIJJXI1LCVyNQkJCSMgdW5zaWduZWQgbG9uZworCWxsZ2ZyCSVyNiwlcjYJCQkjIHVuc2lnbmVkIGxvbmcKKwlqZwlzeXNfcHJjdGwJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKyNzeXMzMl9ydF9zaWdyZXR1cm5fd3JhcHBlcgkJIyBkb25lIGluIHJ0X3NpZ3JldHVybl9nbHVlIAorCisJLmdsb2JsICBzeXMzMl9ydF9zaWdhY3Rpb25fd3JhcHBlciAKK3N5czMyX3J0X3NpZ2FjdGlvbl93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgaW50CisJbGxndHIJJXIzLCVyMwkJCSMgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbl9lbXUzMSAqCisJbGxndHIJJXI0LCVyNAkJCSMgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbl9lbXUzMSAqCisJbGxnZnIJJXI1LCVyNQkJCSMgc2l6ZV90CisJamcJc3lzMzJfcnRfc2lnYWN0aW9uCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX3J0X3NpZ3Byb2NtYXNrX3dyYXBwZXIgCitzeXMzMl9ydF9zaWdwcm9jbWFza193cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgaW50CisJbGxndHIJJXIzLCVyMwkJCSMgb2xkX3NpZ3NldF9lbXUzMSAqCisJbGxndHIJJXI0LCVyNAkJCSMgb2xkX3NpZ3NldF9lbXUzMSAqCisJbGxnZnIJJXI1LCVyNQkJCSMgc2l6ZV90CisJamcJc3lzMzJfcnRfc2lncHJvY21hc2sJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfcnRfc2lncGVuZGluZ193cmFwcGVyIAorc3lzMzJfcnRfc2lncGVuZGluZ193cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIHNpZ3NldF9lbXUzMSAqCisJbGxnZnIJJXIzLCVyMwkJCSMgc2l6ZV90CisJamcJc3lzMzJfcnRfc2lncGVuZGluZwkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBjb21wYXRfc3lzX3J0X3NpZ3RpbWVkd2FpdF93cmFwcGVyCitjb21wYXRfc3lzX3J0X3NpZ3RpbWVkd2FpdF93cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IHNpZ3NldF9lbXUzMV90ICoKKwlsbGd0cgklcjMsJXIzCQkJIyBzaWdpbmZvX2VtdTMxX3QgKgorCWxsZ3RyCSVyNCwlcjQJCQkjIGNvbnN0IHN0cnVjdCBjb21wYXRfdGltZXNwZWMgKgorCWxsZ2ZyCSVyNSwlcjUJCQkjIHNpemVfdAorCWpnCWNvbXBhdF9zeXNfcnRfc2lndGltZWR3YWl0CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX3J0X3NpZ3F1ZXVlaW5mb193cmFwcGVyIAorc3lzMzJfcnRfc2lncXVldWVpbmZvX3dyYXBwZXI6CisJbGdmcgklcjIsJXIyCQkJIyBpbnQKKwlsZ2ZyCSVyMywlcjMJCQkjIGludAorCWxsZ3RyCSVyNCwlcjQJCQkjIHNpZ2luZm9fZW11MzFfdCAqCisJamcJc3lzMzJfcnRfc2lncXVldWVpbmZvCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKyNzeXMzMl9ydF9zaWdzdXNwZW5kX3dyYXBwZXIJCSMgZG9uZSBpbiBydF9zaWdzdXNwZW5kX2dsdWUgCisKKwkuZ2xvYmwgIHN5czMyX3ByZWFkNjRfd3JhcHBlciAKK3N5czMyX3ByZWFkNjRfd3JhcHBlcjoKKwlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKKwlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKKwlsbGdmcgklcjQsJXI0CQkJIyBzaXplX3QKKwlsbGdmcgklcjUsJXI1CQkJIyB1MzIKKwlsbGdmcgklcjYsJXI2CQkJIyB1MzIKKwlqZwlzeXMzMl9wcmVhZDY0CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9wd3JpdGU2NF93cmFwcGVyIAorc3lzMzJfcHdyaXRlNjRfd3JhcHBlcjoKKwlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKKwlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKKwlsbGdmcgklcjQsJXI0CQkJIyBzaXplX3QKKwlsbGdmcgklcjUsJXI1CQkJIyB1MzIKKwlsbGdmcgklcjYsJXI2CQkJIyB1MzIKKwlqZwlzeXMzMl9wd3JpdGU2NAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfY2hvd24xNl93cmFwcGVyIAorc3lzMzJfY2hvd24xNl93cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgorCWxsZ2ZyCSVyMywlcjMJCQkjIF9fa2VybmVsX29sZF91aWRfZW11MzFfdCAKKwlsbGdmcgklcjQsJXI0CQkJIyBfX2tlcm5lbF9vbGRfZ2lkX2VtdTMxX3QgCisJamcJc3lzMzJfY2hvd24xNgkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfZ2V0Y3dkX3dyYXBwZXIgCitzeXMzMl9nZXRjd2Rfd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKKwlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBsb25nCisJamcJc3lzX2dldGN3ZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfY2FwZ2V0X3dyYXBwZXIgCitzeXMzMl9jYXBnZXRfd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyBjYXBfdXNlcl9oZWFkZXJfdAorCWxsZ3RyCSVyMywlcjMJCQkjIGNhcF91c2VyX2RhdGFfdAorCWpnCXN5c19jYXBnZXQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX2NhcHNldF93cmFwcGVyIAorc3lzMzJfY2Fwc2V0X3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgY2FwX3VzZXJfaGVhZGVyX3QKKwlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjYXBfdXNlcl9kYXRhX3QKKwlqZwlzeXNfY2Fwc2V0CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsIHN5czMyX3NpZ2FsdHN0YWNrX3dyYXBwZXIKK3N5czMyX3NpZ2FsdHN0YWNrX3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgY29uc3Qgc3RhY2tfZW11MzFfdCAqIAorCWxsZ3RyCSVyMywlcjMJCQkjIHN0YWNrX2VtdTMxX3QgKiAKKwlqZwlzeXMzMl9zaWdhbHRzdGFjaworCisJLmdsb2JsICBzeXMzMl9zZW5kZmlsZV93cmFwcGVyIAorc3lzMzJfc2VuZGZpbGVfd3JhcHBlcjoKKwlsZ2ZyCSVyMiwlcjIJCQkjIGludAorCWxnZnIJJXIzLCVyMwkJCSMgaW50CisJbGxndHIJJXI0LCVyNAkJCSMgX19rZXJuZWxfb2ZmX2VtdTMxX3QgKgorCWxsZ2ZyCSVyNSwlcjUJCQkjIHNpemVfdAorCWpnCXN5czMyX3NlbmRmaWxlCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisjc3lzMzJfdmZvcmtfd3JhcHBlcgkJCSMgZG9uZSBpbiB2Zm9ya19nbHVlIAorCisJLmdsb2JsICBzeXMzMl90cnVuY2F0ZTY0X3dyYXBwZXIgCitzeXMzMl90cnVuY2F0ZTY0X3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCisJbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgbG9uZworCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcKKwlqZwlzeXMzMl90cnVuY2F0ZTY0CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX2Z0cnVuY2F0ZTY0X3dyYXBwZXIgCitzeXMzMl9mdHJ1bmNhdGU2NF93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAorCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGxvbmcKKwlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBsb25nCisJamcJc3lzMzJfZnRydW5jYXRlNjQJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCBzeXMzMl9sY2hvd25fd3JhcHBlcgkKK3N5czMyX2xjaG93bl93cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgorCWxsZ2ZyCSVyMywlcjMJCQkjIHVpZF90CisJbGxnZnIJJXI0LCVyNAkJCSMgZ2lkX3QKKwlqZwlzeXNfbGNob3duCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisjc3lzMzJfZ2V0dWlkX3dyYXBwZXIJCQkjIHZvaWQJCQkgCisjc3lzMzJfZ2V0Z2lkX3dyYXBwZXIJCQkjIHZvaWQgCisjc3lzMzJfZ2V0ZXVpZF93cmFwcGVyCQkJIyB2b2lkIAorI3N5czMyX2dldGVnaWRfd3JhcHBlcgkJCSMgdm9pZCAKKworCS5nbG9ibCBzeXMzMl9zZXRyZXVpZF93cmFwcGVyCitzeXMzMl9zZXRyZXVpZF93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIHVpZF90CisJbGxnZnIJJXIzLCVyMwkJCSMgdWlkX3QKKwlqZwlzeXNfc2V0cmV1aWQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgc3lzMzJfc2V0cmVnaWRfd3JhcHBlcgorc3lzMzJfc2V0cmVnaWRfd3JhcHBlcjoKKwlsbGdmcgklcjIsJXIyCQkJIyBnaWRfdAorCWxsZ2ZyCSVyMywlcjMJCQkjIGdpZF90CisJamcJc3lzX3NldHJlZ2lkCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9nZXRncm91cHNfd3JhcHBlciAKK3N5czMyX2dldGdyb3Vwc193cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgaW50CisJbGxndHIJJXIzLCVyMwkJCSMgZ2lkX3QgKgorCWpnCXN5c19nZXRncm91cHMJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX3NldGdyb3Vwc193cmFwcGVyIAorc3lzMzJfc2V0Z3JvdXBzX3dyYXBwZXI6CisJbGdmcgklcjIsJXIyCQkJIyBpbnQKKwlsbGd0cgklcjMsJXIzCQkJIyBnaWRfdCAqCisJamcJc3lzX3NldGdyb3VwcwkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCBzeXMzMl9mY2hvd25fd3JhcHBlcgkKK3N5czMyX2ZjaG93bl93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAorCWxsZ2ZyCSVyMywlcjMJCQkjIHVpZF90CisJbGxnZnIJJXI0LCVyNAkJCSMgZ2lkX3QKKwlqZwlzeXNfZmNob3duCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsIHN5czMyX3NldHJlc3VpZF93cmFwcGVyCQorc3lzMzJfc2V0cmVzdWlkX3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgdWlkX3QKKwlsbGdmcgklcjMsJXIzCQkJIyB1aWRfdAorCWxsZ2ZyCSVyNCwlcjQJCQkjIHVpZF90CisJamcJc3lzX3NldHJlc3VpZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCBzeXMzMl9nZXRyZXN1aWRfd3JhcHBlcgkKK3N5czMyX2dldHJlc3VpZF93cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIHVpZF90ICoKKwlsbGd0cgklcjMsJXIzCQkJIyB1aWRfdCAqCisJbGxndHIJJXI0LCVyNAkJCSMgdWlkX3QgKgorCWpnCXN5c19nZXRyZXN1aWQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgc3lzMzJfc2V0cmVzZ2lkX3dyYXBwZXIJCitzeXMzMl9zZXRyZXNnaWRfd3JhcHBlcjoKKwlsbGdmcgklcjIsJXIyCQkJIyBnaWRfdAorCWxsZ2ZyCSVyMywlcjMJCQkjIGdpZF90CisJbGxnZnIJJXI0LCVyNAkJCSMgZ2lkX3QKKwlqZwlzeXNfc2V0cmVzZ2lkCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsIHN5czMyX2dldHJlc2dpZF93cmFwcGVyCQorc3lzMzJfZ2V0cmVzZ2lkX3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgZ2lkX3QgKgorCWxsZ3RyCSVyMywlcjMJCQkjIGdpZF90ICoKKwlsbGd0cgklcjQsJXI0CQkJIyBnaWRfdCAqCisJamcJc3lzX2dldHJlc2dpZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCBzeXMzMl9jaG93bl93cmFwcGVyCQorc3lzMzJfY2hvd25fd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKKwlsbGdmcgklcjMsJXIzCQkJIyB1aWRfdAorCWxsZ2ZyCSVyNCwlcjQJCQkjIGdpZF90CisJamcJc3lzX2Nob3duCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsIHN5czMyX3NldHVpZF93cmFwcGVyCQorc3lzMzJfc2V0dWlkX3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgdWlkX3QKKwlqZwlzeXNfc2V0dWlkCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsIHN5czMyX3NldGdpZF93cmFwcGVyCQorc3lzMzJfc2V0Z2lkX3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgZ2lkX3QKKwlqZwlzeXNfc2V0Z2lkCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsIHN5czMyX3NldGZzdWlkX3dyYXBwZXIJCitzeXMzMl9zZXRmc3VpZF93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIHVpZF90CisJamcJc3lzX3NldGZzdWlkCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsIHN5czMyX3NldGZzZ2lkX3dyYXBwZXIJCitzeXMzMl9zZXRmc2dpZF93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIGdpZF90CisJamcJc3lzX3NldGZzZ2lkCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9waXZvdF9yb290X3dyYXBwZXIgCitzeXMzMl9waXZvdF9yb290X3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCisJbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciAqCisJamcJc3lzX3Bpdm90X3Jvb3QJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX21pbmNvcmVfd3JhcHBlciAKK3N5czMyX21pbmNvcmVfd3JhcHBlcjoKKwlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nCisJbGxnZnIJJXIzLCVyMwkJCSMgc2l6ZV90CisJbGxndHIJJXI0LCVyNAkJCSMgdW5zaWduZWQgY2hhciAqCisJamcJc3lzX21pbmNvcmUJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5czMyX21hZHZpc2Vfd3JhcHBlciAKK3N5czMyX21hZHZpc2Vfd3JhcHBlcjoKKwlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nCisJbGxnZnIJJXIzLCVyMwkJCSMgc2l6ZV90CisJbGdmcgklcjQsJXI0CQkJIyBpbnQKKwlqZwlzeXNfbWFkdmlzZQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibCAgc3lzMzJfZ2V0ZGVudHM2NF93cmFwcGVyIAorc3lzMzJfZ2V0ZGVudHM2NF93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAorCWxsZ3RyCSVyMywlcjMJCQkjIHZvaWQgKgorCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGludAorCWpnCXN5c19nZXRkZW50czY0CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBjb21wYXRfc3lzX2ZjbnRsNjRfd3JhcHBlciAKK2NvbXBhdF9zeXNfZmNudGw2NF93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAorCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGludCAKKwlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBsb25nCisJamcJY29tcGF0X3N5c19mY250bDY0CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwJc3lzMzJfc3RhdDY0X3dyYXBwZXIKK3N5czMyX3N0YXQ2NF93cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgorCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBzdGF0NjQgKgorCWpnCXN5czMyX3N0YXQ2NAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibAlzeXMzMl9sc3RhdDY0X3dyYXBwZXIKK3N5czMyX2xzdGF0NjRfd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKKwlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3Qgc3RhdDY0ICoKKwlqZwlzeXMzMl9sc3RhdDY0CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsCXN5czMyX3N0aW1lX3dyYXBwZXIKK3N5czMyX3N0aW1lX3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgbG9uZyAqCisJamcJY29tcGF0X3N5c19zdGltZQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9zeXNjdGxfd3JhcHBlcgorc3lzMzJfc3lzY3RsX3dyYXBwZXI6CisJbGxndHIgICAlcjIsJXIyICAgICAgICAgICAgICAgICAjIHN0cnVjdCBfX3N5c2N0bF9hcmdzMzIgKgorCWpnICAgICAgc3lzMzJfc3lzY3RsCisKKwkuZ2xvYmwJc3lzMzJfZnN0YXQ2NF93cmFwcGVyCitzeXMzMl9mc3RhdDY0X3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgbG9uZworCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBzdGF0NjQgKgorCWpnCXN5czMyX2ZzdGF0NjQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIGNvbXBhdF9zeXNfZnV0ZXhfd3JhcHBlciAKK2NvbXBhdF9zeXNfZnV0ZXhfd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyB1MzIgKgorCWxnZnIJJXIzLCVyMwkJCSMgaW50CisJbGdmcgklcjQsJXI0CQkJIyBpbnQKKwlsbGd0cgklcjUsJXI1CQkJIyBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjICoKKwlsbGd0cgklcjYsJXI2CQkJIyB1MzIgKgorCWxnZgklcjAsMTY0KCVyMTUpCQkjIGludAorCXN0ZwklcjAsMTYwKCVyMTUpCisJamcJY29tcGF0X3N5c19mdXRleAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsCXN5czMyX3NldHhhdHRyX3dyYXBwZXIKK3N5czMyX3NldHhhdHRyX3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCisJbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCisJbGxndHIJJXI0LCVyNAkJCSMgdm9pZCAqCisJbGxnZnIJJXI1LCVyNQkJCSMgc2l6ZV90CisJbGdmcgklcjYsJXI2CQkJIyBpbnQKKwlqZwlzeXNfc2V0eGF0dHIKKworCS5nbG9ibAlzeXMzMl9sc2V0eGF0dHJfd3JhcHBlcgorc3lzMzJfbHNldHhhdHRyX3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCisJbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCisJbGxndHIJJXI0LCVyNAkJCSMgdm9pZCAqCisJbGxnZnIJJXI1LCVyNQkJCSMgc2l6ZV90CisJbGdmcgklcjYsJXI2CQkJIyBpbnQKKwlqZwlzeXNfbHNldHhhdHRyCisKKwkuZ2xvYmwJc3lzMzJfZnNldHhhdHRyX3dyYXBwZXIKK3N5czMyX2ZzZXR4YXR0cl93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgaW50CisJbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCisJbGxndHIJJXI0LCVyNAkJCSMgdm9pZCAqCisJbGxnZnIJJXI1LCVyNQkJCSMgc2l6ZV90CisJbGdmcgklcjYsJXI2CQkJIyBpbnQKKwlqZwlzeXNfZnNldHhhdHRyCisKKwkuZ2xvYmwJc3lzMzJfZ2V0eGF0dHJfd3JhcHBlcgorc3lzMzJfZ2V0eGF0dHJfd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKKwlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKKwlsbGd0cgklcjQsJXI0CQkJIyB2b2lkICoKKwlsbGdmcgklcjUsJXI1CQkJIyBzaXplX3QKKwlqZwlzeXNfZ2V0eGF0dHIKKworCS5nbG9ibAlzeXMzMl9sZ2V0eGF0dHJfd3JhcHBlcgorc3lzMzJfbGdldHhhdHRyX3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCisJbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCisJbGxndHIJJXI0LCVyNAkJCSMgdm9pZCAqCisJbGxnZnIJJXI1LCVyNQkJCSMgc2l6ZV90CisJamcJc3lzX2xnZXR4YXR0cgorCisJLmdsb2JsCXN5czMyX2ZnZXR4YXR0cl93cmFwcGVyCitzeXMzMl9mZ2V0eGF0dHJfd3JhcHBlcjoKKwlsZ2ZyCSVyMiwlcjIJCQkjIGludAorCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgorCWxsZ3RyCSVyNCwlcjQJCQkjIHZvaWQgKgorCWxsZ2ZyCSVyNSwlcjUJCQkjIHNpemVfdAorCWpnCXN5c19mZ2V0eGF0dHIKKworCS5nbG9ibAlzeXMzMl9saXN0eGF0dHJfd3JhcHBlcgorc3lzMzJfbGlzdHhhdHRyX3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCisJbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCisJbGxnZnIJJXI0LCVyNAkJCSMgc2l6ZV90CisJamcJc3lzX2xpc3R4YXR0cgorCisJLmdsb2JsCXN5czMyX2xsaXN0eGF0dHJfd3JhcHBlcgorc3lzMzJfbGxpc3R4YXR0cl93cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgorCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgorCWxsZ2ZyCSVyNCwlcjQJCQkjIHNpemVfdAorCWpnCXN5c19sbGlzdHhhdHRyCisKKwkuZ2xvYmwJc3lzMzJfZmxpc3R4YXR0cl93cmFwcGVyCitzeXMzMl9mbGlzdHhhdHRyX3dyYXBwZXI6CisJbGdmcgklcjIsJXIyCQkJIyBpbnQKKwlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKKwlsbGdmcgklcjQsJXI0CQkJIyBzaXplX3QKKwlqZwlzeXNfZmxpc3R4YXR0cgorCisJLmdsb2JsCXN5czMyX3JlbW92ZXhhdHRyX3dyYXBwZXIKK3N5czMyX3JlbW92ZXhhdHRyX3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCisJbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCisJamcJc3lzX3JlbW92ZXhhdHRyCisKKwkuZ2xvYmwJc3lzMzJfbHJlbW92ZXhhdHRyX3dyYXBwZXIKK3N5czMyX2xyZW1vdmV4YXR0cl93cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgorCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgorCWpnCXN5c19scmVtb3ZleGF0dHIKKworCS5nbG9ibAlzeXMzMl9mcmVtb3ZleGF0dHJfd3JhcHBlcgorc3lzMzJfZnJlbW92ZXhhdHRyX3dyYXBwZXI6CisJbGdmcgklcjIsJXIyCQkJIyBpbnQKKwlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKKwlqZwlzeXNfZnJlbW92ZXhhdHRyCisKKwkuZ2xvYmwJc3lzMzJfc2NoZWRfc2V0YWZmaW5pdHlfd3JhcHBlcgorc3lzMzJfc2NoZWRfc2V0YWZmaW5pdHlfd3JhcHBlcjoKKwlsZ2ZyCSVyMiwlcjIJCQkjIGludAorCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGludAorCWxsZ3RyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcgKgorCWpnCWNvbXBhdF9zeXNfc2NoZWRfc2V0YWZmaW5pdHkKKworCS5nbG9ibAlzeXMzMl9zY2hlZF9nZXRhZmZpbml0eV93cmFwcGVyCitzeXMzMl9zY2hlZF9nZXRhZmZpbml0eV93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgaW50CisJbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50CisJbGxndHIJJXI0LCVyNAkJCSMgdW5zaWduZWQgbG9uZyAqCisJamcJY29tcGF0X3N5c19zY2hlZF9nZXRhZmZpbml0eQorCisJLmdsb2JsICBzeXMzMl9leGl0X2dyb3VwX3dyYXBwZXIKK3N5czMyX2V4aXRfZ3JvdXBfd3JhcHBlcjoKKwlsZ2ZyCSVyMiwlcjIJCQkjIGludAorCWpnCXN5c19leGl0X2dyb3VwCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXMzMl9zZXRfdGlkX2FkZHJlc3Nfd3JhcHBlcgorc3lzMzJfc2V0X3RpZF9hZGRyZXNzX3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgaW50ICoKKwlqZwlzeXNfc2V0X3RpZF9hZGRyZXNzCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5c19lcG9sbF9jcmVhdGVfd3JhcHBlcgorc3lzX2Vwb2xsX2NyZWF0ZV93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgaW50CisJamcJc3lzX2Vwb2xsX2NyZWF0ZQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCisJLmdsb2JsICBzeXNfZXBvbGxfY3RsX3dyYXBwZXIKK3N5c19lcG9sbF9jdGxfd3JhcHBlcjoKKwlsZ2ZyCSVyMiwlcjIJCQkjIGludAorCWxnZnIJJXIzLCVyMwkJCSMgaW50CisJbGdmcgklcjQsJXI0CQkJIyBpbnQKKwlsbGd0cgklcjUsJXI1CQkJIyBzdHJ1Y3QgZXBvbGxfZXZlbnQgKgorCWpnCXN5c19lcG9sbF9jdGwJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCisKKwkuZ2xvYmwgIHN5c19lcG9sbF93YWl0X3dyYXBwZXIKK3N5c19lcG9sbF93YWl0X3dyYXBwZXI6CisJbGdmcgklcjIsJXIyCQkJIyBpbnQKKwlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgZXBvbGxfZXZlbnQgKgorCWxnZnIJJXI0LCVyNAkJCSMgaW50CisJbGdmcgklcjUsJXI1CQkJIyBpbnQKKwlqZwlzeXNfZXBvbGxfd2FpdAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKworCS5nbG9ibAlzeXMzMl9sb29rdXBfZGNvb2tpZV93cmFwcGVyCitzeXMzMl9sb29rdXBfZGNvb2tpZV93cmFwcGVyOgorCXNsbGcJJXIyLCVyMiwzMgkJIyBnZXQgaGlnaCB3b3JkIG9mIDY0Yml0IGRjb29raWUKKwlvcgklcjIsJXIzCQkJIyBnZXQgbG93IHdvcmQgb2YgNjRiaXQgZGNvb2tpZQorCWxsZ3RyCSVyMywlcjQJCQkjIGNoYXIgKgorCWxsZ2ZyCSVyNCwlcjUJCQkjIHNpemVfdAorCWpnCXN5c19sb29rdXBfZGNvb2tpZQorCisJLmdsb2JsCXN5czMyX2ZhZHZpc2U2NF93cmFwcGVyCitzeXMzMl9mYWR2aXNlNjRfd3JhcHBlcjoKKwlsZ2ZyCSVyMiwlcjIJCQkjIGludAorCXNsbGcJJXIzLCVyMywzMgkJIyBnZXQgaGlnaCB3b3JkIG9mIDY0Yml0IGxvZmZfdAorCW9yCSVyMywlcjQJCQkjIGdldCBsb3cgd29yZCBvZiA2NGJpdCBsb2ZmX3QKKwlsbGdmcgklcjQsJXI1CQkJIyBzaXplX3QgKHVuc2lnbmVkIGxvbmcpCisJbGdmcgklcjUsJXI2CQkJIyBpbnQKKwlqZwlzeXNfZmFkdmlzZTY0CisKKwkuZ2xvYmwJc3lzMzJfZmFkdmlzZTY0XzY0X3dyYXBwZXIKK3N5czMyX2ZhZHZpc2U2NF82NF93cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIHN0cnVjdCBmYWR2aXNlNjRfNjRfYXJncyAqCisJamcJczM5MF9mYWR2aXNlNjRfNjQKKworCS5nbG9ibAlzeXMzMl9jbG9ja19zZXR0aW1lX3dyYXBwZXIKK3N5czMyX2Nsb2NrX3NldHRpbWVfd3JhcHBlcjoKKwlsZ2ZyCSVyMiwlcjIJCQkjIGNsb2NraWRfdCAoaW50KQorCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgKgorCWpnCWNvbXBhdF9zeXNfY2xvY2tfc2V0dGltZQorCisJLmdsb2JsCXN5czMyX2Nsb2NrX2dldHRpbWVfd3JhcHBlcgorc3lzMzJfY2xvY2tfZ2V0dGltZV93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgY2xvY2tpZF90IChpbnQpCisJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF90aW1lc3BlYyAqCisJamcJY29tcGF0X3N5c19jbG9ja19nZXR0aW1lCisKKwkuZ2xvYmwJc3lzMzJfY2xvY2tfZ2V0cmVzX3dyYXBwZXIKK3N5czMyX2Nsb2NrX2dldHJlc193cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgY2xvY2tpZF90IChpbnQpCisJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF90aW1lc3BlYyAqCisJamcJY29tcGF0X3N5c19jbG9ja19nZXRyZXMKKworCS5nbG9ibAlzeXMzMl9jbG9ja19uYW5vc2xlZXBfd3JhcHBlcgorc3lzMzJfY2xvY2tfbmFub3NsZWVwX3dyYXBwZXI6CisJbGdmcgklcjIsJXIyCQkJIyBjbG9ja2lkX3QgKGludCkKKwlsZ2ZyCSVyMywlcjMJCQkjIGludAorCWxsZ3RyCSVyNCwlcjQJCQkjIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgKgorCWxsZ3RyCSVyNSwlcjUJCQkjIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgKgorCWpnCWNvbXBhdF9zeXNfY2xvY2tfbmFub3NsZWVwCisKKwkuZ2xvYmwJc3lzMzJfdGltZXJfY3JlYXRlX3dyYXBwZXIKK3N5czMyX3RpbWVyX2NyZWF0ZV93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgdGltZXJfdCAoaW50KQorCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBjb21wYXRfc2lnZXZlbnQgKgorCWxsZ3RyCSVyNCwlcjQJCQkjIHRpbWVyX3QgKgorCWpnCXN5czMyX3RpbWVyX2NyZWF0ZQorCisJLmdsb2JsCXN5czMyX3RpbWVyX3NldHRpbWVfd3JhcHBlcgorc3lzMzJfdGltZXJfc2V0dGltZV93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgdGltZXJfdCAoaW50KQorCWxnZnIJJXIzLCVyMwkJCSMgaW50CisJbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IGNvbXBhdF9pdGltZXJzcGVjICoKKwlsbGd0cgklcjUsJXI1CQkJIyBzdHJ1Y3QgY29tcGF0X2l0aW1lcnNwZWMgKgorCWpnCWNvbXBhdF9zeXNfdGltZXJfc2V0dGltZQorCisJLmdsb2JsCXN5czMyX3RpbWVyX2dldHRpbWVfd3JhcHBlcgorc3lzMzJfdGltZXJfZ2V0dGltZV93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgdGltZXJfdCAoaW50KQorCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBjb21wYXRfaXRpbWVyc3BlYyAqCisJamcJY29tcGF0X3N5c190aW1lcl9nZXR0aW1lCisKKwkuZ2xvYmwJc3lzMzJfdGltZXJfZ2V0b3ZlcnJ1bl93cmFwcGVyCitzeXMzMl90aW1lcl9nZXRvdmVycnVuX3dyYXBwZXI6CisJbGdmcgklcjIsJXIyCQkJIyB0aW1lcl90IChpbnQpCisJamcJc3lzX3RpbWVyX2dldG92ZXJydW4KKworCS5nbG9ibAlzeXMzMl90aW1lcl9kZWxldGVfd3JhcHBlcgorc3lzMzJfdGltZXJfZGVsZXRlX3dyYXBwZXI6CisJbGdmcgklcjIsJXIyCQkJIyB0aW1lcl90IChpbnQpCisJamcJc3lzX3RpbWVyX2RlbGV0ZQorCisJLmdsb2JsCXN5czMyX2lvX3NldHVwX3dyYXBwZXIKK3N5czMyX2lvX3NldHVwX3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CisJbGxndHIJJXIzLCVyMwkJCSMgdTMyICoKKwlqZwljb21wYXRfc3lzX2lvX3NldHVwCisKKwkuZ2xvYmwJc3lzMzJfaW9fZGVzdHJveV93cmFwcGVyCitzeXMzMl9pb19kZXN0cm95X3dyYXBwZXI6CisJbGxnZnIJJXIyLCVyMgkJCSMgKGFpb19jb250ZXh0X3QpIHUzMgorCWpnCXN5c19pb19kZXN0cm95CisKKwkuZ2xvYmwJc3lzMzJfaW9fZ2V0ZXZlbnRzX3dyYXBwZXIKK3N5czMyX2lvX2dldGV2ZW50c193cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIChhaW9fY29udGV4dF90KSB1MzIKKwlsZ2ZyCSVyMywlcjMJCQkjIGxvbmcKKwlsZ2ZyCSVyNCwlcjQJCQkjIGxvbmcKKwlsbGd0cgklcjUsJXI1CQkJIyBzdHJ1Y3QgaW9fZXZlbnQgKgorCWxsZ3RyCSVyNiwlcjYJCQkjIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgKgorCWpnCWNvbXBhdF9zeXNfaW9fZ2V0ZXZlbnRzCisKKwkuZ2xvYmwJc3lzMzJfaW9fc3VibWl0X3dyYXBwZXIKK3N5czMyX2lvX3N1Ym1pdF93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIChhaW9fY29udGV4dF90KSB1MzIKKwlsZ2ZyCSVyMywlcjMJCQkjIGxvbmcKKwlsbGd0cgklcjQsJXI0CQkJIyBzdHJ1Y3QgaW9jYiAqKgorCWpnCWNvbXBhdF9zeXNfaW9fc3VibWl0CisKKwkuZ2xvYmwJc3lzMzJfaW9fY2FuY2VsX3dyYXBwZXIKK3N5czMyX2lvX2NhbmNlbF93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIChhaW9fY29udGV4dF90KSB1MzIKKwlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgaW9jYiAqCisJbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IGlvX2V2ZW50ICoKKwlqZwlzeXNfaW9fY2FuY2VsCisKKwkuZ2xvYmwgY29tcGF0X3N5c19zdGF0ZnM2NF93cmFwcGVyCitjb21wYXRfc3lzX3N0YXRmczY0X3dyYXBwZXI6CisJbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCisJbGxnZnIJJXIzLCVyMwkJCSMgY29tcGF0X3NpemVfdAorCWxsZ3RyCSVyNCwlcjQJCQkjIHN0cnVjdCBjb21wYXRfc3RhdGZzNjQgKgorCWpnCWNvbXBhdF9zeXNfc3RhdGZzNjQKKworCS5nbG9ibCBjb21wYXRfc3lzX2ZzdGF0ZnM2NF93cmFwcGVyCitjb21wYXRfc3lzX2ZzdGF0ZnM2NF93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludCBmZAorCWxsZ2ZyCSVyMywlcjMJCQkjIGNvbXBhdF9zaXplX3QKKwlsbGd0cgklcjQsJXI0CQkJIyBzdHJ1Y3QgY29tcGF0X3N0YXRmczY0ICoKKwlqZwljb21wYXRfc3lzX2ZzdGF0ZnM2NAorCisJLmdsb2JsCWNvbXBhdF9zeXNfbXFfb3Blbl93cmFwcGVyCitjb21wYXRfc3lzX21xX29wZW5fd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKKwlsZ2ZyCSVyMywlcjMJCQkjIGludAorCWxsZ2ZyCSVyNCwlcjQJCQkjIG1vZGVfdAorCWxsZ3RyCSVyNSwlcjUJCQkjIHN0cnVjdCBjb21wYXRfbXFfYXR0ciAqCisJamcJY29tcGF0X3N5c19tcV9vcGVuCisKKwkuZ2xvYmwJc3lzMzJfbXFfdW5saW5rX3dyYXBwZXIKK3N5czMyX21xX3VubGlua193cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgorCWpnCXN5c19tcV91bmxpbmsKKworCS5nbG9ibAljb21wYXRfc3lzX21xX3RpbWVkc2VuZF93cmFwcGVyCitjb21wYXRfc3lzX21xX3RpbWVkc2VuZF93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgbXFkX3QKKwlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKKwlsbGdmcgklcjQsJXI0CQkJIyBzaXplX3QKKwlsbGdmcgklcjUsJXI1CQkJIyB1bnNpZ25lZCBpbnQKKwlsbGd0cgklcjYsJXI2CQkJIyBjb25zdCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjICoKKwlqZwljb21wYXRfc3lzX21xX3RpbWVkc2VuZAorCisJLmdsb2JsCWNvbXBhdF9zeXNfbXFfdGltZWRyZWNlaXZlX3dyYXBwZXIKK2NvbXBhdF9zeXNfbXFfdGltZWRyZWNlaXZlX3dyYXBwZXI6CisJbGdmcgklcjIsJXIyCQkJIyBtcWRfdAorCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgorCWxsZ2ZyCSVyNCwlcjQJCQkjIHNpemVfdAorCWxsZ3RyCSVyNSwlcjUJCQkjIHVuc2lnbmVkIGludCAqCisJbGxndHIJJXI2LCVyNgkJCSMgY29uc3Qgc3RydWN0IGNvbXBhdF90aW1lc3BlYyAqCisJamcJY29tcGF0X3N5c19tcV90aW1lZHJlY2VpdmUKKworCS5nbG9ibAljb21wYXRfc3lzX21xX25vdGlmeV93cmFwcGVyCitjb21wYXRfc3lzX21xX25vdGlmeV93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgbXFkX3QKKwlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgY29tcGF0X3NpZ2V2ZW50ICoKKwlqZwljb21wYXRfc3lzX21xX25vdGlmeQorCisJLmdsb2JsCWNvbXBhdF9zeXNfbXFfZ2V0c2V0YXR0cl93cmFwcGVyCitjb21wYXRfc3lzX21xX2dldHNldGF0dHJfd3JhcHBlcjoKKwlsZ2ZyCSVyMiwlcjIJCQkjIG1xZF90CisJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF9tcV9hdHRyICoKKwlsbGd0cgklcjQsJXI0CQkJIyBzdHJ1Y3QgY29tcGF0X21xX2F0dHIgKgorCWpnCWNvbXBhdF9zeXNfbXFfZ2V0c2V0YXR0cgorCisJLmdsb2JsCWNvbXBhdF9zeXNfYWRkX2tleV93cmFwcGVyCitjb21wYXRfc3lzX2FkZF9rZXlfd3JhcHBlcjoKKwlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKKwlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKKwlsbGd0cgklcjQsJXI0CQkJIyBjb25zdCB2b2lkICoKKwlsbGdmcgklcjUsJXI1CQkJIyBzaXplX3QKKwlsbGdmcgklcjYsJXI2CQkJIyAoa2V5X3NlcmlhbF90KSB1MzIKKwlqZwlzeXNfYWRkX2tleQorCisJLmdsb2JsCWNvbXBhdF9zeXNfcmVxdWVzdF9rZXlfd3JhcHBlcgorY29tcGF0X3N5c19yZXF1ZXN0X2tleV93cmFwcGVyOgorCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgorCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgorCWxsZ3RyCSVyNCwlcjQJCQkjIGNvbnN0IHZvaWQgKgorCWxsZ2ZyCSVyNSwlcjUJCQkjIChrZXlfc2VyaWFsX3QpIHUzMgorCWpnCXN5c19yZXF1ZXN0X2tleQorCisJLmdsb2JsCXN5czMyX3JlbWFwX2ZpbGVfcGFnZXNfd3JhcHBlcgorc3lzMzJfcmVtYXBfZmlsZV9wYWdlc193cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGxvbmcKKwlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBsb25nCisJbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgbG9uZworCWxsZ2ZyCSVyNSwlcjUJCQkjIHVuc2lnbmVkIGxvbmcKKwlsbGdmcgklcjYsJXI2CQkJIyB1bnNpZ25lZCBsb25nCisJamcJc3lzX3JlbWFwX2ZpbGVfcGFnZXMKKworCS5nbG9ibAljb21wYXRfc3lzX3dhaXRpZF93cmFwcGVyCitjb21wYXRfc3lzX3dhaXRpZF93cmFwcGVyOgorCWxnZnIJJXIyLCVyMgkJCSMgaW50CisJbGdmcgklcjMsJXIzCQkJIyBwaWRfdAorCWxsZ3RyCSVyNCwlcjQJCQkjIHNpZ2luZm9fZW11MzFfdCAqCisJbGdmcgklcjUsJXI1CQkJIyBpbnQKKwlsbGd0cgklcjYsJXI2CQkJIyBzdHJ1Y3QgcnVzYWdlX2VtdTMxICoKKwlqZwljb21wYXRfc3lzX3dhaXRpZApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jcGNtZC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9jcGNtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZGY4ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL2NwY21kLmMKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiAgYXJjaC9zMzkwL2tlcm5lbC9jcGNtZC5jCisgKgorICogIFMzOTAgdmVyc2lvbgorICogICAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgorICogICAgQXV0aG9yKHMpOiBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pLAorICogICAgICAgICAgICAgICBDaHJpc3RpYW4gQm9ybnRyYWVnZXIgKGNib3JudHJhQGRlLmlibS5jb20pLAorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vZWJjZGljLmg+CisjaW5jbHVkZSA8YXNtL2NwY21kLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNwY21kX2xvY2spOworc3RhdGljIGNoYXIgY3BjbWRfYnVmWzI0MF07CisKKy8qCisgKiB0aGUgY2FsbGVyIG9mIF9fY3BjbWQgaGFzIHRvIGVuc3VyZSB0aGF0IHRoZSByZXNwb25zZSBidWZmZXIgaXMgYmVsb3cgMiBHQgorICovCit2b2lkIF9fY3BjbWQoY2hhciAqY21kLCBjaGFyICpyZXNwb25zZSwgaW50IHJsZW4pCit7CisJY29uc3QgaW50IG1hc2sgPSAweDQwMDAwMDAwTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjbWRsZW47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3BjbWRfbG9jaywgZmxhZ3MpOworCWNtZGxlbiA9IHN0cmxlbihjbWQpOworCUJVR19PTihjbWRsZW4gPiAyNDApOworCXN0cmNweShjcGNtZF9idWYsIGNtZCk7CisJQVNDRUJDKGNwY21kX2J1ZiwgY21kbGVuKTsKKworCWlmIChyZXNwb25zZSAhPSBOVUxMICYmIHJsZW4gPiAwKSB7CisJCW1lbXNldChyZXNwb25zZSwgMCwgcmxlbik7CisjaWZuZGVmIENPTkZJR19BUkNIX1MzOTBYCisJCWFzbSB2b2xhdGlsZSAoIkxSQSAgIDIsMCglMClcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxSICAgIDQsJTFcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk8gICAgIDQsJTRcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxSQSAgIDMsMCglMilcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxSICAgIDUsJTNcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5sb25nIDB4ODMyNDAwMDggIyBEaWFnbm9zZSBYJzA4J1xuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IC8qIG5vIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiYSIgKGNwY21kX2J1ZiksICJkIiAoY21kbGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImEiIChyZXNwb25zZSksICJkIiAocmxlbiksICJtIiAobWFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogImNjIiwgIjIiLCAiMyIsICI0IiwgIjUiICk7CisjZWxzZSAvKiBDT05GSUdfQVJDSF9TMzkwWCAqLworICAgICAgICAgICAgICAgIGFzbSB2b2xhdGlsZSAoIiAgIGxyYWcgIDIsMCglMClcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICBsZ3IgICA0LCUxXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgbyAgICAgNCwlNFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIGxyYWcgIDMsMCglMilcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICBsZ3IgICA1LCUzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgc2FtMzFcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAubG9uZyAweDgzMjQwMDA4ICMgRGlhZ25vc2UgWCcwOCdcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICBzYW02NCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogLyogbm8gb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJhIiAoY3BjbWRfYnVmKSwgImQiIChjbWRsZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSIgKHJlc3BvbnNlKSwgImQiIChybGVuKSwgIm0iIChtYXNrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiY2MiLCAiMiIsICIzIiwgIjQiLCAiNSIgKTsKKyNlbmRpZiAvKiBDT05GSUdfQVJDSF9TMzkwWCAqLworICAgICAgICAgICAgICAgIEVCQ0FTQyhyZXNwb25zZSwgcmxlbik7CisgICAgICAgIH0gZWxzZSB7CisjaWZuZGVmIENPTkZJR19BUkNIX1MzOTBYCisgICAgICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgiTFJBICAgMiwwKCUwKVxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTFIgICAgMywlMVxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmxvbmcgMHg4MzIzMDAwOCAjIERpYWdub3NlIFgnMDgnXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogLyogbm8gb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJhIiAoY3BjbWRfYnVmKSwgImQiIChjbWRsZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIyIiwgIjMiICApOworI2Vsc2UgLyogQ09ORklHX0FSQ0hfUzM5MFggKi8KKyAgICAgICAgICAgICAgICBhc20gdm9sYXRpbGUgKCIgICBscmFnICAyLDAoJTApXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgbGdyICAgMywlMVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIHNhbTMxXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgLmxvbmcgMHg4MzIzMDAwOCAjIERpYWdub3NlIFgnMDgnXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgc2FtNjQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IC8qIG5vIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiYSIgKGNwY21kX2J1ZiksICJkIiAoY21kbGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiMiIsICIzIiAgKTsKKyNlbmRpZiAvKiBDT05GSUdfQVJDSF9TMzkwWCAqLworICAgICAgICB9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3BjbWRfbG9jaywgZmxhZ3MpOworfQorCitFWFBPUlRfU1lNQk9MKF9fY3BjbWQpOworCisjaWZkZWYgQ09ORklHX0FSQ0hfUzM5MFgKK3ZvaWQgY3BjbWQoY2hhciAqY21kLCBjaGFyICpyZXNwb25zZSwgaW50IHJsZW4pCit7CisJY2hhciAqbG93YnVmOworCWlmICgocmxlbiA9PSAwKSB8fCAocmVzcG9uc2UgPT0gTlVMTCkKKwkgICAgfHwgISgodW5zaWduZWQgbG9uZylyZXNwb25zZSA+PiAzMSkpCisJCV9fY3BjbWQoY21kLCByZXNwb25zZSwgcmxlbik7CisJZWxzZSB7CisJCWxvd2J1ZiA9IGttYWxsb2MocmxlbiwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCQlpZiAoIWxvd2J1ZikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJjcGNtZDogY291bGQgbm90IGFsbG9jYXRlIHJlc3BvbnNlIGJ1ZmZlclxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJX19jcGNtZChjbWQsIGxvd2J1Ziwgcmxlbik7CisJCW1lbWNweShyZXNwb25zZSwgbG93YnVmLCBybGVuKTsKKwkJa2ZyZWUobG93YnVmKTsKKwl9Cit9CisKK0VYUE9SVF9TWU1CT0woY3BjbWQpOworI2VuZGlmCQkvKiBDT05GSUdfQVJDSF9TMzkwWCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9kZWJ1Zy5jIGIvYXJjaC9zMzkwL2tlcm5lbC9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjhjZTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL2RlYnVnLmMKQEAgLTAsMCArMSwxMjg2IEBACisvKgorICogIGFyY2gvczM5MC9rZXJuZWwvZGVidWcuYworICogICBTLzM5MCBkZWJ1ZyBmYWNpbGl0eQorICoKKyAqICAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQk0gQ29ycG9yYXRpb24KKyAqICAgIEF1dGhvcihzKTogTWljaGFlbCBIb2x6aGV1IChob2x6aGV1QGRlLmlibS5jb20pLAorICogICAgICAgICAgICAgICBIb2xnZXIgU21vbGluc2tpIChIb2xnZXIuU21vbGluc2tpQGRlLmlibS5jb20pCisgKgorICogICAgQnVncmVwb3J0cyB0bzogPExpbnV4MzkwQGRlLmlibS5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vZGVidWcuaD4KKworI2RlZmluZSBERUJVR19QUk9MT0dfRU5UUlkgLTEKKworLyogdHlwZWRlZnMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZmlsZV9wcml2YXRlX2luZm8geworCWxvZmZfdCBvZmZzZXQ7CQkJLyogb2Zmc2V0IG9mIGxhc3QgcmVhZCBpbiBmaWxlICovCisJaW50ICAgIGFjdF9hcmVhOyAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbGFzdCBmb3JtYXRlZCBhcmVhICovCisJaW50ICAgIGFjdF9lbnRyeTsgICAgICAgICAgICAgICAvKiBsYXN0IGZvcm1hdGVkIGVudHJ5IChvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWxhdGl2ZSB0byBiZWdpbm5pbmcgb2YgbGFzdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcm1hdGVkIGFyZWEpICovIAorCXNpemVfdCBhY3RfZW50cnlfb2Zmc2V0OyAgICAgICAgLyogdXAgdG8gdGhpcyBvZmZzZXQgd2UgY29waWVkICovCisJCQkJCS8qIGluIGxhc3QgcmVhZCB0aGUgbGFzdCBmb3JtYXRlZCAqLworCQkJCQkvKiBlbnRyeSB0byB1c2VybGFuZCAqLworCWNoYXIgICB0ZW1wX2J1ZlsyMDQ4XTsJCS8qIGJ1ZmZlciBmb3Igb3V0cHV0ICovCisJZGVidWdfaW5mb190ICpkZWJ1Z19pbmZvX29yZzsgICAvKiBvcmlnaW5hbCBkZWJ1ZyBpbmZvcm1hdGlvbiAqLworCWRlYnVnX2luZm9fdCAqZGVidWdfaW5mb19zbmFwOwkvKiBzbmFwc2hvdCBvZiBkZWJ1ZyBpbmZvcm1hdGlvbiAqLworCXN0cnVjdCBkZWJ1Z192aWV3ICp2aWV3OwkvKiB1c2VkIHZpZXcgb2YgZGVidWcgaW5mbyAqLworfSBmaWxlX3ByaXZhdGVfaW5mb190OworCit0eXBlZGVmIHN0cnVjdAoreworCWNoYXIgKnN0cmluZzsKKwkvKiAKKwkgKiBUaGlzIGFzc3VtZXMgdGhhdCBhbGwgYXJncyBhcmUgY29udmVydGVkIGludG8gbG9uZ3MgCisJICogb24gTC8zOTAgdGhpcyBpcyB0aGUgY2FzZSBmb3IgYWxsIHR5cGVzIG9mIHBhcmFtZXRlciAKKwkgKiBleGNlcHQgb2YgZmxvYXRzLCBhbmQgbG9uZyBsb25nICgzMiBiaXQpIAorICAgICAgICAgKgorICAgICAgICAgKi8KKwlsb25nIGFyZ3NbMF07Cit9IGRlYnVnX3NwcmludGZfZW50cnlfdDsKKworCitleHRlcm4gdm9pZCB0b2RfdG9fdGltZXZhbCh1aW50NjRfdCB0b2R2YWwsIHN0cnVjdCB0aW1ldmFsICp4dGltZSk7CisKKy8qIGludGVybmFsIGZ1bmN0aW9uIHByb3RvdHllcyAqLworCitzdGF0aWMgaW50IGRlYnVnX2luaXQodm9pZCk7CitzdGF0aWMgc3NpemVfdCBkZWJ1Z19vdXRwdXQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgICBzaXplX3QgdXNlcl9sZW4sIGxvZmZfdCAqIG9mZnNldCk7CitzdGF0aWMgc3NpemVfdCBkZWJ1Z19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICAgc2l6ZV90IHVzZXJfbGVuLCBsb2ZmX3QgKiBvZmZzZXQpOworc3RhdGljIGludCBkZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgZGVidWdfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGRlYnVnX2luZm9fdCogIGRlYnVnX2luZm9fY3JlYXRlKGNoYXIgKm5hbWUsIGludCBwYWdlX29yZGVyLCBpbnQgbnJfYXJlYXMsIGludCBidWZfc2l6ZSk7CitzdGF0aWMgdm9pZCBkZWJ1Z19pbmZvX2dldChkZWJ1Z19pbmZvX3QgKik7CitzdGF0aWMgdm9pZCBkZWJ1Z19pbmZvX3B1dChkZWJ1Z19pbmZvX3QgKik7CitzdGF0aWMgaW50IGRlYnVnX3Byb2xvZ19sZXZlbF9mbihkZWJ1Z19pbmZvX3QgKiBpZCwKKwkJCQkgc3RydWN0IGRlYnVnX3ZpZXcgKnZpZXcsIGNoYXIgKm91dF9idWYpOworc3RhdGljIGludCBkZWJ1Z19pbnB1dF9sZXZlbF9mbihkZWJ1Z19pbmZvX3QgKiBpZCwgc3RydWN0IGRlYnVnX3ZpZXcgKnZpZXcsCisJCQkJc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQlzaXplX3QgdXNlcl9idWZfc2l6ZSwgbG9mZl90ICogb2Zmc2V0KTsKK3N0YXRpYyBpbnQgZGVidWdfaW5wdXRfZmx1c2hfZm4oZGVidWdfaW5mb190ICogaWQsIHN0cnVjdCBkZWJ1Z192aWV3ICp2aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdXNlcl9idWZfc2l6ZSwgbG9mZl90ICogb2Zmc2V0KTsKK3N0YXRpYyBpbnQgZGVidWdfaGV4X2FzY2lpX2Zvcm1hdF9mbihkZWJ1Z19pbmZvX3QgKiBpZCwgc3RydWN0IGRlYnVnX3ZpZXcgKnZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm91dF9idWYsIGNvbnN0IGNoYXIgKmluX2J1Zik7CitzdGF0aWMgaW50IGRlYnVnX3Jhd19mb3JtYXRfZm4oZGVidWdfaW5mb190ICogaWQsCisJCQkJIHN0cnVjdCBkZWJ1Z192aWV3ICp2aWV3LCBjaGFyICpvdXRfYnVmLAorCQkJCSBjb25zdCBjaGFyICppbl9idWYpOworc3RhdGljIGludCBkZWJ1Z19yYXdfaGVhZGVyX2ZuKGRlYnVnX2luZm9fdCAqIGlkLCBzdHJ1Y3QgZGVidWdfdmlldyAqdmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJlYSwgZGVidWdfZW50cnlfdCAqIGVudHJ5LCBjaGFyICpvdXRfYnVmKTsKKworc3RhdGljIGludCBkZWJ1Z19zcHJpbnRmX2Zvcm1hdF9mbihkZWJ1Z19pbmZvX3QgKiBpZCwgc3RydWN0IGRlYnVnX3ZpZXcgKnZpZXcsCisJCQkJICAgY2hhciAqb3V0X2J1ZiwgZGVidWdfc3ByaW50Zl9lbnRyeV90ICpjdXJyX2V2ZW50KTsKKworLyogZ2xvYmFscyAqLworCitzdHJ1Y3QgZGVidWdfdmlldyBkZWJ1Z19yYXdfdmlldyA9IHsKKwkicmF3IiwKKwlOVUxMLAorCSZkZWJ1Z19yYXdfaGVhZGVyX2ZuLAorCSZkZWJ1Z19yYXdfZm9ybWF0X2ZuLAorCU5VTEwsCisJTlVMTAorfTsKKworc3RydWN0IGRlYnVnX3ZpZXcgZGVidWdfaGV4X2FzY2lpX3ZpZXcgPSB7CisJImhleF9hc2NpaSIsCisJTlVMTCwKKwkmZGVidWdfZGZsdF9oZWFkZXJfZm4sCisJJmRlYnVnX2hleF9hc2NpaV9mb3JtYXRfZm4sCisJTlVMTCwKKwlOVUxMCit9OworCitzdHJ1Y3QgZGVidWdfdmlldyBkZWJ1Z19sZXZlbF92aWV3ID0geworCSJsZXZlbCIsCisJJmRlYnVnX3Byb2xvZ19sZXZlbF9mbiwKKwlOVUxMLAorCU5VTEwsCisJJmRlYnVnX2lucHV0X2xldmVsX2ZuLAorCU5VTEwKK307CisKK3N0cnVjdCBkZWJ1Z192aWV3IGRlYnVnX2ZsdXNoX3ZpZXcgPSB7CisgICAgICAgICJmbHVzaCIsCisgICAgICAgIE5VTEwsCisgICAgICAgIE5VTEwsCisgICAgICAgIE5VTEwsCisgICAgICAgICZkZWJ1Z19pbnB1dF9mbHVzaF9mbiwKKyAgICAgICAgTlVMTAorfTsKKworc3RydWN0IGRlYnVnX3ZpZXcgZGVidWdfc3ByaW50Zl92aWV3ID0geworCSJzcHJpbnRmIiwKKwlOVUxMLAorCSZkZWJ1Z19kZmx0X2hlYWRlcl9mbiwKKwkoZGVidWdfZm9ybWF0X3Byb2NfdCopJmRlYnVnX3NwcmludGZfZm9ybWF0X2ZuLAorCU5VTEwsCisJTlVMTAorfTsKKworCit1bnNpZ25lZCBpbnQgZGVidWdfZmVhdHVyZV92ZXJzaW9uID0gX19ERUJVR19GRUFUVVJFX1ZFUlNJT047CisKKy8qIHN0YXRpYyBnbG9iYWxzICovCisKK3N0YXRpYyBkZWJ1Z19pbmZvX3QgKmRlYnVnX2FyZWFfZmlyc3QgPSBOVUxMOworc3RhdGljIGRlYnVnX2luZm9fdCAqZGVidWdfYXJlYV9sYXN0ID0gTlVMTDsKK0RFQ0xBUkVfTVVURVgoZGVidWdfbG9jayk7CisKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnX2ZpbGVfb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkucmVhZCAgICA9IGRlYnVnX291dHB1dCwKKwkud3JpdGUgICA9IGRlYnVnX2lucHV0LAkKKwkub3BlbiAgICA9IGRlYnVnX29wZW4sCisJLnJlbGVhc2UgPSBkZWJ1Z19jbG9zZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlYnVnX3Byb2Nfcm9vdF9lbnRyeTsKKworLyogZnVuY3Rpb25zICovCisKKy8qCisgKiBkZWJ1Z19pbmZvX2FsbG9jCisgKiAtIGFsbG9jIG5ldyBkZWJ1Zy1pbmZvCisgKi8KKworc3RhdGljIGRlYnVnX2luZm9fdCogIGRlYnVnX2luZm9fYWxsb2MoY2hhciAqbmFtZSwgaW50IHBhZ2Vfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5yX2FyZWFzLCBpbnQgYnVmX3NpemUpCit7CisJZGVidWdfaW5mb190KiByYzsKKwlpbnQgaTsKKworCS8qIGFsbG9jIGV2ZXJ5dGhpbmcgKi8KKworCXJjID0gKGRlYnVnX2luZm9fdCopIGttYWxsb2Moc2l6ZW9mKGRlYnVnX2luZm9fdCksIEdGUF9BVE9NSUMpOworCWlmKCFyYykKKwkJZ290byBmYWlsX21hbGxvY19yYzsKKwlyYy0+YWN0aXZlX2VudHJ5ID0gKGludCopa21hbGxvYyhucl9hcmVhcyAqIHNpemVvZihpbnQpLCBHRlBfQVRPTUlDKTsKKwlpZighcmMtPmFjdGl2ZV9lbnRyeSkKKwkJZ290byBmYWlsX21hbGxvY19hY3RpdmVfZW50cnk7CisJbWVtc2V0KHJjLT5hY3RpdmVfZW50cnksIDAsIG5yX2FyZWFzICogc2l6ZW9mKGludCkpOworCXJjLT5hcmVhcyA9IChkZWJ1Z19lbnRyeV90ICoqKSBrbWFsbG9jKG5yX2FyZWFzICoKKwkJCQkJCXNpemVvZihkZWJ1Z19lbnRyeV90ICopLAorCQkJCQkJR0ZQX0FUT01JQyk7CisJaWYgKCFyYy0+YXJlYXMpCisJCWdvdG8gZmFpbF9tYWxsb2NfYXJlYXM7CisJZm9yIChpID0gMDsgaSA8IG5yX2FyZWFzOyBpKyspIHsKKwkJcmMtPmFyZWFzW2ldID0gKGRlYnVnX2VudHJ5X3QgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfQVRPTUlDLAorCQkJCQkJCQlwYWdlX29yZGVyKTsKKwkJaWYgKCFyYy0+YXJlYXNbaV0pIHsKKwkJCWZvciAoaS0tOyBpID49IDA7IGktLSkgeworCQkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIHJjLT5hcmVhc1tpXSwKKwkJCQkJCXBhZ2Vfb3JkZXIpOworCQkJfQorCQkJZ290byBmYWlsX21hbGxvY19hcmVhczI7CisJCX0gZWxzZSB7CisJCQltZW1zZXQocmMtPmFyZWFzW2ldLCAwLCBQQUdFX1NJWkUgPDwgcGFnZV9vcmRlcik7CisJCX0KKwl9CisKKwkvKiBpbml0aWFsaXplIG1lbWJlcnMgKi8KKworCXNwaW5fbG9ja19pbml0KCZyYy0+bG9jayk7CisJcmMtPnBhZ2Vfb3JkZXIgID0gcGFnZV9vcmRlcjsKKwlyYy0+bnJfYXJlYXMgICAgPSBucl9hcmVhczsKKwlyYy0+YWN0aXZlX2FyZWEgPSAwOworCXJjLT5sZXZlbCAgICAgICA9IERFQlVHX0RFRkFVTFRfTEVWRUw7CisJcmMtPmJ1Zl9zaXplICAgID0gYnVmX3NpemU7CisJcmMtPmVudHJ5X3NpemUgID0gc2l6ZW9mKGRlYnVnX2VudHJ5X3QpICsgYnVmX3NpemU7CisJc3RybGNweShyYy0+bmFtZSwgbmFtZSwgc2l6ZW9mKHJjLT5uYW1lKSk7CisJbWVtc2V0KHJjLT52aWV3cywgMCwgREVCVUdfTUFYX1ZJRVdTICogc2l6ZW9mKHN0cnVjdCBkZWJ1Z192aWV3ICopKTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCW1lbXNldChyYy0+cHJvY19lbnRyaWVzLCAwICxERUJVR19NQVhfVklFV1MgKgorCQlzaXplb2Yoc3RydWN0IHByb2NfZGlyX2VudHJ5KikpOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisJYXRvbWljX3NldCgmKHJjLT5yZWZfY291bnQpLCAwKTsKKworCXJldHVybiByYzsKKworZmFpbF9tYWxsb2NfYXJlYXMyOgorCWtmcmVlKHJjLT5hcmVhcyk7CitmYWlsX21hbGxvY19hcmVhczoKKwlrZnJlZShyYy0+YWN0aXZlX2VudHJ5KTsKK2ZhaWxfbWFsbG9jX2FjdGl2ZV9lbnRyeToKKwlrZnJlZShyYyk7CitmYWlsX21hbGxvY19yYzoKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIGRlYnVnX2luZm9fZnJlZQorICogLSBmcmVlIG1lbW9yeSBkZWJ1Zy1pbmZvCisgKi8KKworc3RhdGljIHZvaWQgZGVidWdfaW5mb19mcmVlKGRlYnVnX2luZm9fdCogZGJfaW5mbyl7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGRiX2luZm8tPm5yX2FyZWFzOyBpKyspIHsKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgZGJfaW5mby0+YXJlYXNbaV0sCisJCWRiX2luZm8tPnBhZ2Vfb3JkZXIpOworCX0KKwlrZnJlZShkYl9pbmZvLT5hcmVhcyk7CisJa2ZyZWUoZGJfaW5mby0+YWN0aXZlX2VudHJ5KTsKKwlrZnJlZShkYl9pbmZvKTsKK30KKworLyoKKyAqIGRlYnVnX2luZm9fY3JlYXRlCisgKiAtIGNyZWF0ZSBuZXcgZGVidWctaW5mbworICovCisKK3N0YXRpYyBkZWJ1Z19pbmZvX3QqICBkZWJ1Z19pbmZvX2NyZWF0ZShjaGFyICpuYW1lLCBpbnQgcGFnZV9vcmRlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5yX2FyZWFzLCBpbnQgYnVmX3NpemUpCit7CisJZGVidWdfaW5mb190KiByYzsKKworICAgICAgICByYyA9IGRlYnVnX2luZm9fYWxsb2MobmFtZSwgcGFnZV9vcmRlciwgbnJfYXJlYXMsIGJ1Zl9zaXplKTsKKyAgICAgICAgaWYoIXJjKSAKKwkJZ290byBvdXQ7CisKKworCS8qIGNyZWF0ZSBwcm9jIHJvb2QgZGlyZWN0b3J5ICovCisgICAgICAgIHJjLT5wcm9jX3Jvb3RfZW50cnkgPSBwcm9jX21rZGlyKHJjLT5uYW1lLCBkZWJ1Z19wcm9jX3Jvb3RfZW50cnkpOworCisJLyogYXBwZW5kIG5ldyBlbGVtZW50IHRvIGxpbmtlZCBsaXN0ICovCisgICAgICAgIGlmIChkZWJ1Z19hcmVhX2ZpcnN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvKiBmaXJzdCBlbGVtZW50IGluIGxpc3QgKi8KKyAgICAgICAgICAgICAgICBkZWJ1Z19hcmVhX2ZpcnN0ID0gcmM7CisgICAgICAgICAgICAgICAgcmMtPnByZXYgPSBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIGFwcGVuZCBlbGVtZW50IHRvIGVuZCBvZiBsaXN0ICovCisgICAgICAgICAgICAgICAgZGVidWdfYXJlYV9sYXN0LT5uZXh0ID0gcmM7CisgICAgICAgICAgICAgICAgcmMtPnByZXYgPSBkZWJ1Z19hcmVhX2xhc3Q7CisgICAgICAgIH0KKyAgICAgICAgZGVidWdfYXJlYV9sYXN0ID0gcmM7CisgICAgICAgIHJjLT5uZXh0ID0gTlVMTDsKKworCWRlYnVnX2luZm9fZ2V0KHJjKTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBkZWJ1Z19pbmZvX2NvcHkKKyAqIC0gY29weSBkZWJ1Zy1pbmZvCisgKi8KKworc3RhdGljIGRlYnVnX2luZm9fdCogZGVidWdfaW5mb19jb3B5KGRlYnVnX2luZm9fdCogaW4pCit7CisgICAgICAgIGludCBpOworICAgICAgICBkZWJ1Z19pbmZvX3QqIHJjOworICAgICAgICByYyA9IGRlYnVnX2luZm9fYWxsb2MoaW4tPm5hbWUsIGluLT5wYWdlX29yZGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4tPm5yX2FyZWFzLCBpbi0+YnVmX3NpemUpOworICAgICAgICBpZighcmMpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgaW4tPm5yX2FyZWFzOyBpKyspeworICAgICAgICAgICAgICAgIG1lbWNweShyYy0+YXJlYXNbaV0saW4tPmFyZWFzW2ldLCBQQUdFX1NJWkUgPDwgaW4tPnBhZ2Vfb3JkZXIpOworICAgICAgICB9CitvdXQ6CisgICAgICAgIHJldHVybiByYzsKK30KKworLyoKKyAqIGRlYnVnX2luZm9fZ2V0CisgKiAtIGluY3JlbWVudHMgcmVmZXJlbmNlIGNvdW50IGZvciBkZWJ1Zy1pbmZvCisgKi8KKworc3RhdGljIHZvaWQgZGVidWdfaW5mb19nZXQoZGVidWdfaW5mb190ICogZGJfaW5mbykKK3sKKwlpZiAoZGJfaW5mbykKKwkJYXRvbWljX2luYygmZGJfaW5mby0+cmVmX2NvdW50KTsKK30KKworLyoKKyAqIGRlYnVnX2luZm9fcHV0OgorICogLSBkZWNyZWFzZXMgcmVmZXJlbmNlIGNvdW50IGZvciBkZWJ1Zy1pbmZvIGFuZCBmcmVlcyBpdCBpZiBuZWNlc3NhcnkKKyAqLworCitzdGF0aWMgdm9pZCBkZWJ1Z19pbmZvX3B1dChkZWJ1Z19pbmZvX3QgKmRiX2luZm8pCit7CisJaW50IGk7CisKKwlpZiAoIWRiX2luZm8pCisJCXJldHVybjsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZGJfaW5mby0+cmVmX2NvdW50KSkgeworI2lmZGVmIERFQlVHCisJCXByaW50ayhLRVJOX0lORk8gImRlYnVnOiBmcmVlaW5nIGRlYnVnIGFyZWEgJXAgKCVzKVxuIiwKKwkJICAgICAgIGRiX2luZm8sIGRiX2luZm8tPm5hbWUpOworI2VuZGlmCisJCWZvciAoaSA9IDA7IGkgPCBERUJVR19NQVhfVklFV1M7IGkrKykgeworCQkJaWYgKGRiX2luZm8tPnZpZXdzW2ldID09IE5VTEwpCisJCQkJY29udGludWU7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwkJCXJlbW92ZV9wcm9jX2VudHJ5KGRiX2luZm8tPnByb2NfZW50cmllc1tpXS0+bmFtZSwKKwkJCQkJICBkYl9pbmZvLT5wcm9jX3Jvb3RfZW50cnkpOworI2VuZGlmCisJCX0KKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCQlyZW1vdmVfcHJvY19lbnRyeShkYl9pbmZvLT5wcm9jX3Jvb3RfZW50cnktPm5hbWUsCisJCQkJICBkZWJ1Z19wcm9jX3Jvb3RfZW50cnkpOworI2VuZGlmCisJCWlmKGRiX2luZm8gPT0gZGVidWdfYXJlYV9maXJzdCkKKwkJCWRlYnVnX2FyZWFfZmlyc3QgPSBkYl9pbmZvLT5uZXh0OworCQlpZihkYl9pbmZvID09IGRlYnVnX2FyZWFfbGFzdCkKKwkJCWRlYnVnX2FyZWFfbGFzdCA9IGRiX2luZm8tPnByZXY7CisJCWlmKGRiX2luZm8tPnByZXYpIGRiX2luZm8tPnByZXYtPm5leHQgPSBkYl9pbmZvLT5uZXh0OworCQlpZihkYl9pbmZvLT5uZXh0KSBkYl9pbmZvLT5uZXh0LT5wcmV2ID0gZGJfaW5mby0+cHJldjsKKwkJZGVidWdfaW5mb19mcmVlKGRiX2luZm8pOworCX0KK30KKworLyoKKyAqIGRlYnVnX2Zvcm1hdF9lbnRyeToKKyAqIC0gZm9ybWF0IG9uZSBkZWJ1ZyBlbnRyeSBhbmQgcmV0dXJuIHNpemUgb2YgZm9ybWF0ZWQgZGF0YQorICovCisKK3N0YXRpYyBpbnQgZGVidWdfZm9ybWF0X2VudHJ5KGZpbGVfcHJpdmF0ZV9pbmZvX3QgKnBfaW5mbykKK3sKKwlkZWJ1Z19pbmZvX3QgKmlkX29yZyAgICA9IHBfaW5mby0+ZGVidWdfaW5mb19vcmc7CisJZGVidWdfaW5mb190ICppZF9zbmFwICAgPSBwX2luZm8tPmRlYnVnX2luZm9fc25hcDsKKwlzdHJ1Y3QgZGVidWdfdmlldyAqdmlldyA9IHBfaW5mby0+dmlldzsKKwlkZWJ1Z19lbnRyeV90ICphY3RfZW50cnk7CisJc2l6ZV90IGxlbiA9IDA7CisJaWYocF9pbmZvLT5hY3RfZW50cnkgPT0gREVCVUdfUFJPTE9HX0VOVFJZKXsKKwkJLyogcHJpbnQgcHJvbG9nICovCisgICAgICAgIAlpZiAodmlldy0+cHJvbG9nX3Byb2MpCisgICAgICAgICAgICAgICAgCWxlbiArPSB2aWV3LT5wcm9sb2dfcHJvYyhpZF9vcmcsIHZpZXcscF9pbmZvLT50ZW1wX2J1Zik7CisJCWdvdG8gb3V0OworCX0KKworCWFjdF9lbnRyeSA9IChkZWJ1Z19lbnRyeV90ICopICgoY2hhciopaWRfc25hcC0+YXJlYXNbcF9pbmZvLT5hY3RfYXJlYV0gKworCQkJCQlwX2luZm8tPmFjdF9lbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKwlpZiAoYWN0X2VudHJ5LT5pZC5zdGNrID09IDBMTCkKKwkJCWdvdG8gb3V0OyAgLyogZW1wdHkgZW50cnkgKi8KKwlpZiAodmlldy0+aGVhZGVyX3Byb2MpCisJCWxlbiArPSB2aWV3LT5oZWFkZXJfcHJvYyhpZF9vcmcsIHZpZXcsIHBfaW5mby0+YWN0X2FyZWEsIAorCQkJCQlhY3RfZW50cnksIHBfaW5mby0+dGVtcF9idWYgKyBsZW4pOworCWlmICh2aWV3LT5mb3JtYXRfcHJvYykKKwkJbGVuICs9IHZpZXctPmZvcm1hdF9wcm9jKGlkX29yZywgdmlldywgcF9pbmZvLT50ZW1wX2J1ZiArIGxlbiwKKwkJCQkJCURFQlVHX0RBVEEoYWN0X2VudHJ5KSk7CisgICAgICBvdXQ6CisgICAgICAgIHJldHVybiBsZW47Cit9CisKKy8qCisgKiBkZWJ1Z19uZXh0X2VudHJ5OgorICogLSBnb3RvIG5leHQgZW50cnkgaW4gcF9pbmZvCisgKi8KKworZXh0ZXJuIGlubGluZSBpbnQgZGVidWdfbmV4dF9lbnRyeShmaWxlX3ByaXZhdGVfaW5mb190ICpwX2luZm8pCit7CisJZGVidWdfaW5mb190ICppZCA9IHBfaW5mby0+ZGVidWdfaW5mb19zbmFwOworCWlmKHBfaW5mby0+YWN0X2VudHJ5ID09IERFQlVHX1BST0xPR19FTlRSWSl7CisJCXBfaW5mby0+YWN0X2VudHJ5ID0gMDsKKwkJZ290byBvdXQ7CisJfQorCWlmICgocF9pbmZvLT5hY3RfZW50cnkgKz0gaWQtPmVudHJ5X3NpemUpCisJCT4gKChQQUdFX1NJWkUgPDwgKGlkLT5wYWdlX29yZGVyKSkgCisJCS0gaWQtPmVudHJ5X3NpemUpKXsKKworCQkvKiBuZXh0IGFyZWEgKi8KKwkJcF9pbmZvLT5hY3RfZW50cnkgPSAwOworICAgICAgICAJcF9pbmZvLT5hY3RfYXJlYSsrOworICAgICAgICAJaWYocF9pbmZvLT5hY3RfYXJlYSA+PSBpZC0+bnJfYXJlYXMpCisJCQlyZXR1cm4gMTsKKwl9CitvdXQ6CisJcmV0dXJuIDA7CQorfQorCisvKgorICogZGVidWdfb3V0cHV0OgorICogLSBjYWxsZWQgZm9yIHVzZXIgcmVhZCgpCisgKiAtIGNvcGllcyBmb3JtYXRlZCBkZWJ1ZyBlbnRyaWVzIHRvIHRoZSB1c2VyIGJ1ZmZlcgorICovCisKK3N0YXRpYyBzc2l6ZV90IGRlYnVnX291dHB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwJCS8qIGZpbGUgZGVzY3JpcHRvciAqLworCQkJICAgIGNoYXIgX191c2VyICp1c2VyX2J1ZiwJLyogdXNlciBidWZmZXIgKi8KKwkJCSAgICBzaXplX3QgIGxlbiwJCS8qIGxlbmd0aCBvZiBidWZmZXIgKi8KKwkJCSAgICBsb2ZmX3QgKm9mZnNldCkJICAgICAgLyogb2Zmc2V0IGluIHRoZSBmaWxlICovCit7CisJc2l6ZV90IGNvdW50ID0gMDsKKwlzaXplX3QgZW50cnlfb2Zmc2V0LCBzaXplID0gMDsKKwlmaWxlX3ByaXZhdGVfaW5mb190ICpwX2luZm87CisKKwlwX2luZm8gPSAoKGZpbGVfcHJpdmF0ZV9pbmZvX3QgKikgZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwlpZiAoKm9mZnNldCAhPSBwX2luZm8tPm9mZnNldCkgCisJCXJldHVybiAtRVBJUEU7CisJaWYocF9pbmZvLT5hY3RfYXJlYSA+PSBwX2luZm8tPmRlYnVnX2luZm9fc25hcC0+bnJfYXJlYXMpCisJCXJldHVybiAwOworCisJZW50cnlfb2Zmc2V0ID0gcF9pbmZvLT5hY3RfZW50cnlfb2Zmc2V0OworCisJd2hpbGUoY291bnQgPCBsZW4peworCQlzaXplID0gZGVidWdfZm9ybWF0X2VudHJ5KHBfaW5mbyk7CisJCXNpemUgPSBtaW4oKGxlbiAtIGNvdW50KSwgKHNpemUgLSBlbnRyeV9vZmZzZXQpKTsKKworCQlpZihzaXplKXsKKwkJCWlmIChjb3B5X3RvX3VzZXIodXNlcl9idWYgKyBjb3VudCwgCisJCQkJCXBfaW5mby0+dGVtcF9idWYgKyBlbnRyeV9vZmZzZXQsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJY291bnQgKz0gc2l6ZTsKKwkJZW50cnlfb2Zmc2V0ID0gMDsKKwkJaWYoY291bnQgIT0gbGVuKQorCQkJaWYoZGVidWdfbmV4dF9lbnRyeShwX2luZm8pKSAKKwkJCQlnb3RvIG91dDsKKwl9CitvdXQ6CisJcF9pbmZvLT5vZmZzZXQgICAgICAgICAgID0gKm9mZnNldCArIGNvdW50OworCXBfaW5mby0+YWN0X2VudHJ5X29mZnNldCA9IHNpemU7CQorCSpvZmZzZXQgPSBwX2luZm8tPm9mZnNldDsKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qCisgKiBkZWJ1Z19pbnB1dDoKKyAqIC0gY2FsbGVkIGZvciB1c2VyIHdyaXRlKCkKKyAqIC0gY2FsbHMgaW5wdXQgZnVuY3Rpb24gb2YgdmlldworICovCisKK3N0YXRpYyBzc2l6ZV90IGRlYnVnX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgbGVuZ3RoLAorCQkJICAgbG9mZl90ICpvZmZzZXQpCit7CisJaW50IHJjID0gMDsKKwlmaWxlX3ByaXZhdGVfaW5mb190ICpwX2luZm87CisKKwlkb3duKCZkZWJ1Z19sb2NrKTsKKwlwX2luZm8gPSAoKGZpbGVfcHJpdmF0ZV9pbmZvX3QgKikgZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwlpZiAocF9pbmZvLT52aWV3LT5pbnB1dF9wcm9jKQorCQlyYyA9IHBfaW5mby0+dmlldy0+aW5wdXRfcHJvYyhwX2luZm8tPmRlYnVnX2luZm9fb3JnLAorCQkJCQkgICAgICBwX2luZm8tPnZpZXcsIGZpbGUsIHVzZXJfYnVmLAorCQkJCQkgICAgICBsZW5ndGgsIG9mZnNldCk7CisJZWxzZQorCQlyYyA9IC1FUEVSTTsKKwl1cCgmZGVidWdfbG9jayk7CisJcmV0dXJuIHJjOwkJLyogbnVtYmVyIG9mIGlucHV0IGNoYXJhY3RlcnMgKi8KK30KKworLyoKKyAqIGRlYnVnX29wZW46CisgKiAtIGNhbGxlZCBmb3IgdXNlciBvcGVuKCkKKyAqIC0gY29waWVzIGZvcm1hdGVkIG91dHB1dCB0byBwcml2YXRlX2RhdGEgYXJlYSBvZiB0aGUgZmlsZQorICogICBoYW5kbGUKKyAqLworCitzdGF0aWMgaW50IGRlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGkgPSAwLCByYyA9IDA7CisJZmlsZV9wcml2YXRlX2luZm9fdCAqcF9pbmZvOworCWRlYnVnX2luZm9fdCAqZGVidWdfaW5mbywgKmRlYnVnX2luZm9fc25hcHNob3Q7CisKKyNpZmRlZiBERUJVRworCXByaW50aygiZGVidWdfb3BlblxuIik7CisjZW5kaWYKKwlkb3duKCZkZWJ1Z19sb2NrKTsKKworCS8qIGZpbmQgZGVidWcgbG9nIGFuZCB2aWV3ICovCisKKwlkZWJ1Z19pbmZvID0gZGVidWdfYXJlYV9maXJzdDsKKwl3aGlsZShkZWJ1Z19pbmZvICE9IE5VTEwpeworCQlmb3IgKGkgPSAwOyBpIDwgREVCVUdfTUFYX1ZJRVdTOyBpKyspIHsKKwkJCWlmIChkZWJ1Z19pbmZvLT52aWV3c1tpXSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJZWxzZSBpZiAoZGVidWdfaW5mby0+cHJvY19lbnRyaWVzW2ldID09CisJCQkJIFBERShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSkpIHsKKwkJCQlnb3RvIGZvdW5kOwkvKiBmb3VuZCB2aWV3ICEgKi8KKwkJCX0KKwkJfQorCQlkZWJ1Z19pbmZvID0gZGVidWdfaW5mby0+bmV4dDsKKwl9CisJLyogbm8gZW50cnkgZm91bmQgKi8KKwlyYyA9IC1FSU5WQUw7CisJZ290byBvdXQ7CisKKyAgICAgIGZvdW5kOgorCisJLyogbWFrZSBzbmFwc2hvdCBvZiBjdXJyZW50IGRlYnVnIGFyZWFzIHRvIGdldCBpdCBjb25zaXN0ZW50ICovCisKKwlkZWJ1Z19pbmZvX3NuYXBzaG90ID0gZGVidWdfaW5mb19jb3B5KGRlYnVnX2luZm8pOworCisJaWYoIWRlYnVnX2luZm9fc25hcHNob3QpeworI2lmZGVmIERFQlVHCisJCXByaW50ayhLRVJOX0VSUiAiZGVidWdfb3BlbjogZGVidWdfaW5mb19jb3B5IGZhaWxlZCAob3V0IG9mIG1lbSlcbiIpOworI2VuZGlmCisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKChmaWxlLT5wcml2YXRlX2RhdGEgPQorCSAgICAga21hbGxvYyhzaXplb2YoZmlsZV9wcml2YXRlX2luZm9fdCksIEdGUF9BVE9NSUMpKSA9PSAwKSB7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKEtFUk5fRVJSICJkZWJ1Z19vcGVuOiBrbWFsbG9jIGZhaWxlZFxuIik7CisjZW5kaWYKKwkJZGVidWdfaW5mb19mcmVlKGRlYnVnX2luZm9fc25hcHNob3QpOwkKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJcF9pbmZvID0gKGZpbGVfcHJpdmF0ZV9pbmZvX3QgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXBfaW5mby0+b2Zmc2V0ID0gMDsKKwlwX2luZm8tPmRlYnVnX2luZm9fc25hcCA9IGRlYnVnX2luZm9fc25hcHNob3Q7CisJcF9pbmZvLT5kZWJ1Z19pbmZvX29yZyAgPSBkZWJ1Z19pbmZvOworCXBfaW5mby0+dmlldyA9IGRlYnVnX2luZm8tPnZpZXdzW2ldOworCXBfaW5mby0+YWN0X2FyZWEgPSAwOworCXBfaW5mby0+YWN0X2VudHJ5ID0gREVCVUdfUFJPTE9HX0VOVFJZOworCXBfaW5mby0+YWN0X2VudHJ5X29mZnNldCA9IDA7CisKKwlkZWJ1Z19pbmZvX2dldChkZWJ1Z19pbmZvKTsKKworICAgICAgb3V0OgorCXVwKCZkZWJ1Z19sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBkZWJ1Z19jbG9zZToKKyAqIC0gY2FsbGVkIGZvciB1c2VyIGNsb3NlKCkKKyAqIC0gZGVsZXRlcyAgcHJpdmF0ZV9kYXRhIGFyZWEgb2YgdGhlIGZpbGUgaGFuZGxlCisgKi8KKworc3RhdGljIGludCBkZWJ1Z19jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlmaWxlX3ByaXZhdGVfaW5mb190ICpwX2luZm87CisjaWZkZWYgREVCVUcKKwlwcmludGsoImRlYnVnX2Nsb3NlXG4iKTsKKyNlbmRpZgorCXBfaW5mbyA9IChmaWxlX3ByaXZhdGVfaW5mb190ICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlkZWJ1Z19pbmZvX2ZyZWUocF9pbmZvLT5kZWJ1Z19pbmZvX3NuYXApOworCWRlYnVnX2luZm9fcHV0KHBfaW5mby0+ZGVidWdfaW5mb19vcmcpOworCWtmcmVlKGZpbGUtPnByaXZhdGVfZGF0YSk7CisJcmV0dXJuIDA7CQkvKiBzdWNjZXNzICovCit9CisKKy8qCisgKiBkZWJ1Z19yZWdpc3RlcjoKKyAqIC0gY3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgZGVidWcgYXJlYSBmb3IgdGhlIGNhbGxlcgorICogLSByZXR1cm5zIGhhbmRsZSBmb3IgZGVidWcgYXJlYQorICovCisKK2RlYnVnX2luZm9fdCAqZGVidWdfcmVnaXN0ZXIKKyAgICAoY2hhciAqbmFtZSwgaW50IHBhZ2Vfb3JkZXIsIGludCBucl9hcmVhcywgaW50IGJ1Zl9zaXplKSAKK3sKKwlkZWJ1Z19pbmZvX3QgKnJjID0gTlVMTDsKKworCWlmICghaW5pdGlhbGl6ZWQpCisJCUJVRygpOworCWRvd24oJmRlYnVnX2xvY2spOworCisgICAgICAgIC8qIGNyZWF0ZSBuZXcgZGVidWdfaW5mbyAqLworCisJcmMgPSBkZWJ1Z19pbmZvX2NyZWF0ZShuYW1lLCBwYWdlX29yZGVyLCBucl9hcmVhcywgYnVmX3NpemUpOworCWlmKCFyYykgCisJCWdvdG8gb3V0OworCWRlYnVnX3JlZ2lzdGVyX3ZpZXcocmMsICZkZWJ1Z19sZXZlbF92aWV3KTsKKyAgICAgICAgZGVidWdfcmVnaXN0ZXJfdmlldyhyYywgJmRlYnVnX2ZsdXNoX3ZpZXcpOworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fSU5GTworCSAgICAgICAiZGVidWc6IHJlc2VydmVkICVkIGFyZWFzIG9mICVkIHBhZ2VzIGZvciBkZWJ1Z2dpbmcgJXNcbiIsCisJICAgICAgIG5yX2FyZWFzLCAxIDw8IHBhZ2Vfb3JkZXIsIHJjLT5uYW1lKTsKKyNlbmRpZgorICAgICAgb3V0OgorICAgICAgICBpZiAocmMgPT0gTlVMTCl7CisJCXByaW50ayhLRVJOX0VSUiAiZGVidWc6IGRlYnVnX3JlZ2lzdGVyIGZhaWxlZCBmb3IgJXNcbiIsbmFtZSk7CisgICAgICAgIH0KKwl1cCgmZGVidWdfbG9jayk7CisJcmV0dXJuIHJjOworfQorCisvKgorICogZGVidWdfdW5yZWdpc3RlcjoKKyAqIC0gZ2l2ZSBiYWNrIGRlYnVnIGFyZWEKKyAqLworCit2b2lkIGRlYnVnX3VucmVnaXN0ZXIoZGVidWdfaW5mb190ICogaWQpCit7CisJaWYgKCFpZCkKKwkJZ290byBvdXQ7CisJZG93bigmZGVidWdfbG9jayk7CisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9JTkZPICJkZWJ1ZzogdW5yZWdpc3RlcmluZyAlc1xuIiwgaWQtPm5hbWUpOworI2VuZGlmCisJZGVidWdfaW5mb19wdXQoaWQpOworCXVwKCZkZWJ1Z19sb2NrKTsKKworICAgICAgb3V0OgorCXJldHVybjsKK30KKworLyoKKyAqIGRlYnVnX3NldF9sZXZlbDoKKyAqIC0gc2V0IGFjdHVhbCBkZWJ1ZyBsZXZlbAorICovCisKK3ZvaWQgZGVidWdfc2V0X2xldmVsKGRlYnVnX2luZm9fdCogaWQsIGludCBuZXdfbGV2ZWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpZighaWQpCisJCXJldHVybjsJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkLT5sb2NrLGZsYWdzKTsKKyAgICAgICAgaWYobmV3X2xldmVsID09IERFQlVHX09GRl9MRVZFTCl7CisgICAgICAgICAgICAgICAgaWQtPmxldmVsID0gREVCVUdfT0ZGX0xFVkVMOworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImRlYnVnOiAlczogc3dpdGNoZWQgb2ZmXG4iLGlkLT5uYW1lKTsKKyAgICAgICAgfSBlbHNlIGlmICgobmV3X2xldmVsID4gREVCVUdfTUFYX0xFVkVMKSB8fCAobmV3X2xldmVsIDwgMCkpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVidWc6ICVzOiBsZXZlbCAlaSBpcyBvdXQgb2YgcmFuZ2UgKCVpIC0gJWkpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaWQtPm5hbWUsIG5ld19sZXZlbCwgMCwgREVCVUdfTUFYX0xFVkVMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZC0+bGV2ZWwgPSBuZXdfbGV2ZWw7CisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPIAorCQkJImRlYnVnOiAlczogbmV3IGxldmVsICVpXG4iLGlkLT5uYW1lLGlkLT5sZXZlbCk7CisjZW5kaWYKKyAgICAgICAgfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkLT5sb2NrLGZsYWdzKTsKK30KKworCisvKgorICogcHJvY2VlZF9hY3RpdmVfZW50cnk6CisgKiAtIHNldCBhY3RpdmUgZW50cnkgdG8gbmV4dCBpbiB0aGUgcmluZyBidWZmZXIKKyAqLworCitleHRlcm4gaW5saW5lIHZvaWQgcHJvY2VlZF9hY3RpdmVfZW50cnkoZGVidWdfaW5mb190ICogaWQpCit7CisJaWYgKChpZC0+YWN0aXZlX2VudHJ5W2lkLT5hY3RpdmVfYXJlYV0gKz0gaWQtPmVudHJ5X3NpemUpCisJICAgID4gKChQQUdFX1NJWkUgPDwgKGlkLT5wYWdlX29yZGVyKSkgLSBpZC0+ZW50cnlfc2l6ZSkpCisJCWlkLT5hY3RpdmVfZW50cnlbaWQtPmFjdGl2ZV9hcmVhXSA9IDA7Cit9CisKKy8qCisgKiBwcm9jZWVkX2FjdGl2ZV9hcmVhOgorICogLSBzZXQgYWN0aXZlIGFyZWEgdG8gbmV4dCBpbiB0aGUgcmluZyBidWZmZXIKKyAqLworCitleHRlcm4gaW5saW5lIHZvaWQgcHJvY2VlZF9hY3RpdmVfYXJlYShkZWJ1Z19pbmZvX3QgKiBpZCkKK3sKKwlpZC0+YWN0aXZlX2FyZWErKzsKKwlpZC0+YWN0aXZlX2FyZWEgPSBpZC0+YWN0aXZlX2FyZWEgJSBpZC0+bnJfYXJlYXM7Cit9CisKKy8qCisgKiBnZXRfYWN0aXZlX2VudHJ5OgorICovCisKK2V4dGVybiBpbmxpbmUgZGVidWdfZW50cnlfdCAqZ2V0X2FjdGl2ZV9lbnRyeShkZWJ1Z19pbmZvX3QgKiBpZCkKK3sKKwlyZXR1cm4gKGRlYnVnX2VudHJ5X3QgKikgKChjaGFyICopIGlkLT5hcmVhc1tpZC0+YWN0aXZlX2FyZWFdICsKKwkJCQkgIGlkLT5hY3RpdmVfZW50cnlbaWQtPmFjdGl2ZV9hcmVhXSk7Cit9CisKKy8qCisgKiBkZWJ1Z19maW5pc2hfZW50cnk6CisgKiAtIHNldCB0aW1lc3RhbXAsIGNhbGxlciBhZGRyZXNzLCBjcHUgbnVtYmVyIGV0Yy4KKyAqLworCitleHRlcm4gaW5saW5lIHZvaWQgZGVidWdfZmluaXNoX2VudHJ5KGRlYnVnX2luZm9fdCAqIGlkLCBkZWJ1Z19lbnRyeV90KiBhY3RpdmUsCisJCWludCBsZXZlbCwgaW50IGV4Y2VwdGlvbikKK3sKKwlTVENLKGFjdGl2ZS0+aWQuc3Rjayk7CisJYWN0aXZlLT5pZC5maWVsZHMuY3B1aWQgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJYWN0aXZlLT5jYWxsZXIgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CisJYWN0aXZlLT5pZC5maWVsZHMuZXhjZXB0aW9uID0gZXhjZXB0aW9uOworCWFjdGl2ZS0+aWQuZmllbGRzLmxldmVsICAgICA9IGxldmVsOworCXByb2NlZWRfYWN0aXZlX2VudHJ5KGlkKTsKKwlpZihleGNlcHRpb24pCisJCXByb2NlZWRfYWN0aXZlX2FyZWEoaWQpOworfQorCitzdGF0aWMgaW50IGRlYnVnX3N0b3BwYWJsZT0xOworc3RhdGljIGludCBkZWJ1Z19hY3RpdmU9MTsKKworI2RlZmluZSBDVExfUzM5MERCRiA1Njc3CisjZGVmaW5lIENUTF9TMzkwREJGX1NUT1BQQUJMRSA1Njc4CisjZGVmaW5lIENUTF9TMzkwREJGX0FDVElWRSA1Njc5CisKKy8qCisgKiBwcm9jIGhhbmRsZXIgZm9yIHRoZSBydW5uaW5nIGRlYnVnX2FjdGl2ZSBzeXNjdGwKKyAqIGFsd2F5cyBhbGxvdyByZWFkLCBhbGxvdyB3cml0ZSBvbmx5IGlmIGRlYnVnX3N0b3BwYWJsZSBpcyBzZXQgb3IKKyAqIGlmIGRlYnVnX2FjdGl2ZSBpcyBhbHJlYWR5IG9mZgorICovCitzdGF0aWMgaW50IHMzOTBkYmZfcHJvY2FjdGl2ZShjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKCF3cml0ZSB8fCBkZWJ1Z19zdG9wcGFibGUgfHwgIWRlYnVnX2FjdGl2ZSkKKwkJcmV0dXJuIHByb2NfZG9pbnR2ZWModGFibGUsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgczM5MGRiZl90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lICAgICAgID0gQ1RMX1MzOTBEQkZfU1RPUFBBQkxFLAorCQkucHJvY25hbWUgICAgICAgPSAiZGVidWdfc3RvcHBhYmxlIiwKKwkJLmRhdGEJCT0gJmRlYnVnX3N0b3BwYWJsZSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUgICAgICAgICAgID0gU19JUlVHTyB8IFNfSVdVU1IsCisJCS5wcm9jX2hhbmRsZXIgICA9ICZwcm9jX2RvaW50dmVjLAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwl9LAorCSB7CisJCS5jdGxfbmFtZSAgICAgICA9IENUTF9TMzkwREJGX0FDVElWRSwKKwkJLnByb2NuYW1lICAgICAgID0gImRlYnVnX2FjdGl2ZSIsCisJCS5kYXRhCQk9ICZkZWJ1Z19hY3RpdmUsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlICAgICAgICAgICA9IFNfSVJVR08gfCBTX0lXVVNSLAorCQkucHJvY19oYW5kbGVyICAgPSAmczM5MGRiZl9wcm9jYWN0aXZlLAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSBzMzkwZGJmX2Rpcl90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lICAgICAgID0gQ1RMX1MzOTBEQkYsCisJCS5wcm9jbmFtZSAgICAgICA9ICJzMzkwZGJmIiwKKwkJLm1heGxlbiAgICAgICAgID0gMCwKKwkJLm1vZGUgICAgICAgICAgID0gU19JUlVHTyB8IFNfSVhVR08sCisJCS5jaGlsZCAgICAgICAgICA9IHMzOTBkYmZfdGFibGUsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKnMzOTBkYmZfc3lzY3RsX2hlYWRlcjsKKwordm9pZCBkZWJ1Z19zdG9wX2FsbCh2b2lkKQoreworCWlmIChkZWJ1Z19zdG9wcGFibGUpCisJCWRlYnVnX2FjdGl2ZSA9IDA7Cit9CisKKworLyoKKyAqIGRlYnVnX2V2ZW50X2NvbW1vbjoKKyAqIC0gd3JpdGUgZGVidWcgZW50cnkgd2l0aCBnaXZlbiBzaXplCisgKi8KKworZGVidWdfZW50cnlfdCAqZGVidWdfZXZlbnRfY29tbW9uKGRlYnVnX2luZm9fdCAqIGlkLCBpbnQgbGV2ZWwsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCSAgICAgICAgICBpbnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZGVidWdfZW50cnlfdCAqYWN0aXZlOworCisJaWYgKCFkZWJ1Z19hY3RpdmUpCisJCXJldHVybiBOVUxMOworCXNwaW5fbG9ja19pcnFzYXZlKCZpZC0+bG9jaywgZmxhZ3MpOworCWFjdGl2ZSA9IGdldF9hY3RpdmVfZW50cnkoaWQpOworCW1lbXNldChERUJVR19EQVRBKGFjdGl2ZSksIDAsIGlkLT5idWZfc2l6ZSk7CisJbWVtY3B5KERFQlVHX0RBVEEoYWN0aXZlKSwgYnVmLCBtaW4obGVuLCBpZC0+YnVmX3NpemUpKTsKKwlkZWJ1Z19maW5pc2hfZW50cnkoaWQsIGFjdGl2ZSwgbGV2ZWwsIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gYWN0aXZlOworfQorCisvKgorICogZGVidWdfZXhjZXB0aW9uX2NvbW1vbjoKKyAqIC0gd3JpdGUgZGVidWcgZW50cnkgd2l0aCBnaXZlbiBzaXplIGFuZCBzd2l0Y2ggdG8gbmV4dCBkZWJ1ZyBhcmVhCisgKi8KKworZGVidWdfZW50cnlfdCAqZGVidWdfZXhjZXB0aW9uX2NvbW1vbihkZWJ1Z19pbmZvX3QgKiBpZCwgaW50IGxldmVsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZGVidWdfZW50cnlfdCAqYWN0aXZlOworCisJaWYgKCFkZWJ1Z19hY3RpdmUpCisJCXJldHVybiBOVUxMOworCXNwaW5fbG9ja19pcnFzYXZlKCZpZC0+bG9jaywgZmxhZ3MpOworCWFjdGl2ZSA9IGdldF9hY3RpdmVfZW50cnkoaWQpOworCW1lbXNldChERUJVR19EQVRBKGFjdGl2ZSksIDAsIGlkLT5idWZfc2l6ZSk7CisJbWVtY3B5KERFQlVHX0RBVEEoYWN0aXZlKSwgYnVmLCBtaW4obGVuLCBpZC0+YnVmX3NpemUpKTsKKwlkZWJ1Z19maW5pc2hfZW50cnkoaWQsIGFjdGl2ZSwgbGV2ZWwsIDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gYWN0aXZlOworfQorCisvKgorICogY291bnRzIGFyZ3VtZW50cyBpbiBmb3JtYXQgc3RyaW5nIGZvciBzcHJpbnRmIHZpZXcKKyAqLworCitleHRlcm4gaW5saW5lIGludCBkZWJ1Z19jb3VudF9udW1hcmdzKGNoYXIgKnN0cmluZykKK3sKKwlpbnQgbnVtYXJncz0wOworCisJd2hpbGUoKnN0cmluZykgeworCQlpZigqc3RyaW5nKys9PSclJykKKwkJCW51bWFyZ3MrKzsKKwl9CisJcmV0dXJuKG51bWFyZ3MpOworfQorCisvKgorICogZGVidWdfc3ByaW50Zl9ldmVudDoKKyAqLworCitkZWJ1Z19lbnRyeV90ICpkZWJ1Z19zcHJpbnRmX2V2ZW50KGRlYnVnX2luZm9fdCogaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCxjaGFyICpzdHJpbmcsLi4uKQoreworCXZhX2xpc3QgICBhcDsKKwlpbnQgbnVtYXJncyxpZHg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlkZWJ1Z19zcHJpbnRmX2VudHJ5X3QgKmN1cnJfZXZlbnQ7CisJZGVidWdfZW50cnlfdCAqYWN0aXZlOworCisJaWYoKCFpZCkgfHwgKGxldmVsID4gaWQtPmxldmVsKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCFkZWJ1Z19hY3RpdmUpCisJCXJldHVybiBOVUxMOworCW51bWFyZ3M9ZGVidWdfY291bnRfbnVtYXJncyhzdHJpbmcpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkLT5sb2NrLCBmbGFncyk7CisJYWN0aXZlID0gZ2V0X2FjdGl2ZV9lbnRyeShpZCk7CisJY3Vycl9ldmVudD0oZGVidWdfc3ByaW50Zl9lbnRyeV90ICopIERFQlVHX0RBVEEoYWN0aXZlKTsKKwl2YV9zdGFydChhcCxzdHJpbmcpOworCWN1cnJfZXZlbnQtPnN0cmluZz1zdHJpbmc7CisJZm9yKGlkeD0wO2lkeDxtaW4obnVtYXJncywoaW50KShpZC0+YnVmX3NpemUgLyBzaXplb2YobG9uZykpLTEpO2lkeCsrKQorCQljdXJyX2V2ZW50LT5hcmdzW2lkeF09dmFfYXJnKGFwLGxvbmcpOworCXZhX2VuZChhcCk7CisJZGVidWdfZmluaXNoX2VudHJ5KGlkLCBhY3RpdmUsIGxldmVsLCAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGFjdGl2ZTsKK30KKworLyoKKyAqIGRlYnVnX3NwcmludGZfZXhjZXB0aW9uOgorICovCisKK2RlYnVnX2VudHJ5X3QgKmRlYnVnX3NwcmludGZfZXhjZXB0aW9uKGRlYnVnX2luZm9fdCogaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwsY2hhciAqc3RyaW5nLC4uLikKK3sKKwl2YV9saXN0ICAgYXA7CisJaW50IG51bWFyZ3MsaWR4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZGVidWdfc3ByaW50Zl9lbnRyeV90ICpjdXJyX2V2ZW50OworCWRlYnVnX2VudHJ5X3QgKmFjdGl2ZTsKKworCWlmKCghaWQpIHx8IChsZXZlbCA+IGlkLT5sZXZlbCkpCisJCXJldHVybiBOVUxMOworCWlmICghZGVidWdfYWN0aXZlKQorCQlyZXR1cm4gTlVMTDsKKworCW51bWFyZ3M9ZGVidWdfY291bnRfbnVtYXJncyhzdHJpbmcpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkLT5sb2NrLCBmbGFncyk7CisJYWN0aXZlID0gZ2V0X2FjdGl2ZV9lbnRyeShpZCk7CisJY3Vycl9ldmVudD0oZGVidWdfc3ByaW50Zl9lbnRyeV90ICopREVCVUdfREFUQShhY3RpdmUpOworCXZhX3N0YXJ0KGFwLHN0cmluZyk7CisJY3Vycl9ldmVudC0+c3RyaW5nPXN0cmluZzsKKwlmb3IoaWR4PTA7aWR4PG1pbihudW1hcmdzLChpbnQpKGlkLT5idWZfc2l6ZSAvIHNpemVvZihsb25nKSktMSk7aWR4KyspCisJCWN1cnJfZXZlbnQtPmFyZ3NbaWR4XT12YV9hcmcoYXAsbG9uZyk7CisJdmFfZW5kKGFwKTsKKwlkZWJ1Z19maW5pc2hfZW50cnkoaWQsIGFjdGl2ZSwgbGV2ZWwsIDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gYWN0aXZlOworfQorCisvKgorICogZGVidWdfaW5pdDoKKyAqIC0gaXMgY2FsbGVkIGV4YWN0bHkgb25jZSB0byBpbml0aWFsaXplIHRoZSBkZWJ1ZyBmZWF0dXJlCisgKi8KKworc3RhdGljIGludCBfX2luaXQgZGVidWdfaW5pdCh2b2lkKQoreworCWludCByYyA9IDA7CisKKwlzMzkwZGJmX3N5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUoczM5MGRiZl9kaXJfdGFibGUsIDEpOworCWRvd24oJmRlYnVnX2xvY2spOworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJZGVidWdfcHJvY19yb290X2VudHJ5ID0gcHJvY19ta2RpcihERUJVR19ESVJfUk9PVCwgTlVMTCk7CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKwlwcmludGsoS0VSTl9JTkZPICJkZWJ1ZzogSW5pdGlhbGl6YXRpb24gY29tcGxldGVcbiIpOworCWluaXRpYWxpemVkID0gMTsKKwl1cCgmZGVidWdfbG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBkZWJ1Z19yZWdpc3Rlcl92aWV3OgorICovCisKK2ludCBkZWJ1Z19yZWdpc3Rlcl92aWV3KGRlYnVnX2luZm9fdCAqIGlkLCBzdHJ1Y3QgZGVidWdfdmlldyAqdmlldykKK3sKKwlpbnQgcmMgPSAwOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJbW9kZV90IG1vZGUgPSBTX0lGUkVHOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlOworCisJaWYgKCFpZCkKKwkJZ290byBvdXQ7CisJaWYgKHZpZXctPnByb2xvZ19wcm9jIHx8IHZpZXctPmZvcm1hdF9wcm9jIHx8IHZpZXctPmhlYWRlcl9wcm9jKQorCQltb2RlIHw9IFNfSVJVU1I7CisJaWYgKHZpZXctPmlucHV0X3Byb2MpCisJCW1vZGUgfD0gU19JV1VTUjsKKwlwZGUgPSBjcmVhdGVfcHJvY19lbnRyeSh2aWV3LT5uYW1lLCBtb2RlLCBpZC0+cHJvY19yb290X2VudHJ5KTsKKwlpZiAoIXBkZSl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImRlYnVnOiBjcmVhdGVfcHJvY19lbnRyeSgpIGZhaWxlZCEgQ2Fubm90IHJlZ2lzdGVyIHZpZXcgJXMvJXNcbiIsIGlkLT5uYW1lLHZpZXctPm5hbWUpOworCQlyYyA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWQtPmxvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgREVCVUdfTUFYX1ZJRVdTOyBpKyspIHsKKwkJaWYgKGlkLT52aWV3c1tpXSA9PSBOVUxMKQorCQkJYnJlYWs7CisJfQorCWlmIChpID09IERFQlVHX01BWF9WSUVXUykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJkZWJ1ZzogY2Fubm90IHJlZ2lzdGVyIHZpZXcgJXMvJXNcbiIsCisJCQlpZC0+bmFtZSx2aWV3LT5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCSJkZWJ1ZzogbWF4aW11bSBudW1iZXIgb2Ygdmlld3MgcmVhY2hlZCAoJWkpIVxuIiwgaSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KHBkZS0+bmFtZSwgaWQtPnByb2Nfcm9vdF9lbnRyeSk7CisJCXJjID0gLTE7CisJfQorCWVsc2UgeworCQlpZC0+dmlld3NbaV0gPSB2aWV3OworCQlwZGUtPnByb2NfZm9wcyA9ICZkZWJ1Z19maWxlX29wczsKKwkJaWQtPnByb2NfZW50cmllc1tpXSA9IHBkZTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWQtPmxvY2ssIGZsYWdzKTsKKyAgICAgIG91dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBkZWJ1Z191bnJlZ2lzdGVyX3ZpZXc6CisgKi8KKworaW50IGRlYnVnX3VucmVnaXN0ZXJfdmlldyhkZWJ1Z19pbmZvX3QgKiBpZCwgc3RydWN0IGRlYnVnX3ZpZXcgKnZpZXcpCit7CisJaW50IHJjID0gMDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFpZCkKKwkJZ290byBvdXQ7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkLT5sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IERFQlVHX01BWF9WSUVXUzsgaSsrKSB7CisJCWlmIChpZC0+dmlld3NbaV0gPT0gdmlldykKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBERUJVR19NQVhfVklFV1MpCisJCXJjID0gLTE7CisJZWxzZSB7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwkJcmVtb3ZlX3Byb2NfZW50cnkoaWQtPnByb2NfZW50cmllc1tpXS0+bmFtZSwKKwkJCQkgIGlkLT5wcm9jX3Jvb3RfZW50cnkpOworI2VuZGlmCisJCWlkLT52aWV3c1tpXSA9IE5VTEw7CisJCXJjID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWQtPmxvY2ssIGZsYWdzKTsKKyAgICAgIG91dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBmdW5jdGlvbnMgZm9yIGRlYnVnLXZpZXdzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKy8qCisgKiBwcmludHMgb3V0IGFjdHVhbCBkZWJ1ZyBsZXZlbAorICovCisKK3N0YXRpYyBpbnQgZGVidWdfcHJvbG9nX2xldmVsX2ZuKGRlYnVnX2luZm9fdCAqIGlkLAorCQkJCSBzdHJ1Y3QgZGVidWdfdmlldyAqdmlldywgY2hhciAqb3V0X2J1ZikKK3sKKwlpbnQgcmMgPSAwOworCisJaWYoaWQtPmxldmVsID09IC0xKSByYyA9IHNwcmludGYob3V0X2J1ZiwiLVxuIik7CisJZWxzZSByYyA9IHNwcmludGYob3V0X2J1ZiwgIiVpXG4iLCBpZC0+bGV2ZWwpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIHJlYWRzIG5ldyBkZWJ1ZyBsZXZlbAorICovCisKK3N0YXRpYyBpbnQgZGVidWdfaW5wdXRfbGV2ZWxfZm4oZGVidWdfaW5mb190ICogaWQsIHN0cnVjdCBkZWJ1Z192aWV3ICp2aWV3LAorCQkJCXN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJc2l6ZV90IGluX2J1Zl9zaXplLCBsb2ZmX3QgKiBvZmZzZXQpCit7CisJY2hhciBpbnB1dF9idWZbMV07CisJaW50IHJjID0gaW5fYnVmX3NpemU7CisKKwlpZiAoKm9mZnNldCAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoY29weV9mcm9tX3VzZXIoaW5wdXRfYnVmLCB1c2VyX2J1ZiwgMSkpeworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoaXNkaWdpdChpbnB1dF9idWZbMF0pKSB7CisJCWludCBuZXdfbGV2ZWwgPSAoKGludCkgaW5wdXRfYnVmWzBdIC0gKGludCkgJzAnKTsKKwkJZGVidWdfc2V0X2xldmVsKGlkLCBuZXdfbGV2ZWwpOworCX0gZWxzZSBpZihpbnB1dF9idWZbMF0gPT0gJy0nKSB7CisJCWRlYnVnX3NldF9sZXZlbChpZCwgREVCVUdfT0ZGX0xFVkVMKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJkZWJ1ZzogbGV2ZWwgYCVjYCBpcyBub3QgdmFsaWRcbiIsCisJCSAgICAgICBpbnB1dF9idWZbMF0pOworCX0KKyAgICAgIG91dDoKKwkqb2Zmc2V0ICs9IGluX2J1Zl9zaXplOworCXJldHVybiByYzsJCS8qIG51bWJlciBvZiBpbnB1dCBjaGFyYWN0ZXJzICovCit9CisKKworLyoKKyAqIGZsdXNoZXMgZGVidWcgYXJlYXMKKyAqLworIAordm9pZCBkZWJ1Z19mbHVzaChkZWJ1Z19pbmZvX3QqIGlkLCBpbnQgYXJlYSkKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgaWYoIWlkKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmlkLT5sb2NrLGZsYWdzKTsKKyAgICAgICAgaWYoYXJlYSA9PSBERUJVR19GTFVTSF9BTEwpeworICAgICAgICAgICAgICAgIGlkLT5hY3RpdmVfYXJlYSA9IDA7CisgICAgICAgICAgICAgICAgbWVtc2V0KGlkLT5hY3RpdmVfZW50cnksIDAsIGlkLT5ucl9hcmVhcyAqIHNpemVvZihpbnQpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaWQtPm5yX2FyZWFzOyBpKyspIAorICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGlkLT5hcmVhc1tpXSwgMCwgUEFHRV9TSVpFIDw8IGlkLT5wYWdlX29yZGVyKTsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJkZWJ1ZzogJXM6IGFsbCBhcmVhcyBmbHVzaGVkXG4iLGlkLT5uYW1lKTsKKyAgICAgICAgfSBlbHNlIGlmKGFyZWEgPj0gMCAmJiBhcmVhIDwgaWQtPm5yX2FyZWFzKSB7CisgICAgICAgICAgICAgICAgaWQtPmFjdGl2ZV9lbnRyeVthcmVhXSA9IDA7CisgICAgICAgICAgICAgICAgbWVtc2V0KGlkLT5hcmVhc1thcmVhXSwgMCwgUEFHRV9TSVpFIDw8IGlkLT5wYWdlX29yZGVyKTsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVidWc6ICVzOiBhcmVhICVpIGhhcyBiZWVuIGZsdXNoZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpZC0+bmFtZSwgYXJlYSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTworICAgICAgICAgICAgICAgICAgICAgICAgImRlYnVnOiAlczogYXJlYSAlaSBjYW5ub3QgYmUgZmx1c2hlZCAocmFuZ2U6ICVpIC0gJWkpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaWQtPm5hbWUsIGFyZWEsIDAsIGlkLT5ucl9hcmVhcy0xKTsKKyAgICAgICAgfQorICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZC0+bG9jayxmbGFncyk7Cit9CisKKy8qCisgKiB2aWV3IGZ1bmN0aW9uOiBmbHVzaGVzIGRlYnVnIGFyZWFzIAorICovCisKK3N0YXRpYyBpbnQgZGVidWdfaW5wdXRfZmx1c2hfZm4oZGVidWdfaW5mb190ICogaWQsIHN0cnVjdCBkZWJ1Z192aWV3ICp2aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5fYnVmX3NpemUsIGxvZmZfdCAqIG9mZnNldCkKK3sKKyAgICAgICAgY2hhciBpbnB1dF9idWZbMV07CisgICAgICAgIGludCByYyA9IGluX2J1Zl9zaXplOworIAorICAgICAgICBpZiAoKm9mZnNldCAhPSAwKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoaW5wdXRfYnVmLCB1c2VyX2J1ZiwgMSkpeworICAgICAgICAgICAgICAgIHJjID0gLUVGQVVMVDsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICBpZihpbnB1dF9idWZbMF0gPT0gJy0nKSB7IAorICAgICAgICAgICAgICAgIGRlYnVnX2ZsdXNoKGlkLCBERUJVR19GTFVTSF9BTEwpOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIGlmIChpc2RpZ2l0KGlucHV0X2J1ZlswXSkpIHsKKyAgICAgICAgICAgICAgICBpbnQgYXJlYSA9ICgoaW50KSBpbnB1dF9idWZbMF0gLSAoaW50KSAnMCcpOworICAgICAgICAgICAgICAgIGRlYnVnX2ZsdXNoKGlkLCBhcmVhKTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICAgIHByaW50ayhLRVJOX0lORk8gImRlYnVnOiBhcmVhIGAlY2AgaXMgbm90IHZhbGlkXG4iLCBpbnB1dF9idWZbMF0pOworCisgICAgICBvdXQ6CisgICAgICAgICpvZmZzZXQgKz0gaW5fYnVmX3NpemU7CisgICAgICAgIHJldHVybiByYzsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBpbnB1dCBjaGFyYWN0ZXJzICovCit9CisKKy8qCisgKiBwcmludHMgZGVidWcgaGVhZGVyIGluIHJhdyBmb3JtYXQKKyAqLworCitpbnQgZGVidWdfcmF3X2hlYWRlcl9mbihkZWJ1Z19pbmZvX3QgKiBpZCwgc3RydWN0IGRlYnVnX3ZpZXcgKnZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZWEsIGRlYnVnX2VudHJ5X3QgKiBlbnRyeSwgY2hhciAqb3V0X2J1ZikKK3sKKyAgICAgICAgaW50IHJjOworCisJcmMgPSBzaXplb2YoZGVidWdfZW50cnlfdCk7CisJbWVtY3B5KG91dF9idWYsZW50cnksc2l6ZW9mKGRlYnVnX2VudHJ5X3QpKTsKKyAgICAgICAgcmV0dXJuIHJjOworfQorCisvKgorICogcHJpbnRzIGRlYnVnIGRhdGEgaW4gcmF3IGZvcm1hdAorICovCisKK3N0YXRpYyBpbnQgZGVidWdfcmF3X2Zvcm1hdF9mbihkZWJ1Z19pbmZvX3QgKiBpZCwgc3RydWN0IGRlYnVnX3ZpZXcgKnZpZXcsCisJCQkgICAgICAgY2hhciAqb3V0X2J1ZiwgY29uc3QgY2hhciAqaW5fYnVmKQoreworCWludCByYzsKKworCXJjID0gaWQtPmJ1Zl9zaXplOworCW1lbWNweShvdXRfYnVmLCBpbl9idWYsIGlkLT5idWZfc2l6ZSk7CisJcmV0dXJuIHJjOworfQorCisvKgorICogcHJpbnRzIGRlYnVnIGRhdGEgaW4gaGV4L2FzY2lpIGZvcm1hdAorICovCisKK3N0YXRpYyBpbnQgZGVidWdfaGV4X2FzY2lpX2Zvcm1hdF9mbihkZWJ1Z19pbmZvX3QgKiBpZCwgc3RydWN0IGRlYnVnX3ZpZXcgKnZpZXcsCisJCSAgICAJCSAgY2hhciAqb3V0X2J1ZiwgY29uc3QgY2hhciAqaW5fYnVmKQoreworCWludCBpLCByYyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgaWQtPmJ1Zl9zaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICByYyArPSBzcHJpbnRmKG91dF9idWYgKyByYywgIiUwMnggIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQgY2hhciAqKSBpbl9idWYpW2ldKTsKKyAgICAgICAgfQorCXJjICs9IHNwcmludGYob3V0X2J1ZiArIHJjLCAifCAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgaWQtPmJ1Zl9zaXplOyBpKyspIHsKKwkJdW5zaWduZWQgY2hhciBjID0gaW5fYnVmW2ldOworCQlpZiAoIWlzcHJpbnQoYykpCisJCQlyYyArPSBzcHJpbnRmKG91dF9idWYgKyByYywgIi4iKTsKKwkJZWxzZQorCQkJcmMgKz0gc3ByaW50ZihvdXRfYnVmICsgcmMsICIlYyIsIGMpOworCX0KKwlyYyArPSBzcHJpbnRmKG91dF9idWYgKyByYywgIlxuIik7CisJcmV0dXJuIHJjOworfQorCisvKgorICogcHJpbnRzIGhlYWRlciBmb3IgZGVidWcgZW50cnkKKyAqLworCitpbnQgZGVidWdfZGZsdF9oZWFkZXJfZm4oZGVidWdfaW5mb190ICogaWQsIHN0cnVjdCBkZWJ1Z192aWV3ICp2aWV3LAorCQkJIGludCBhcmVhLCBkZWJ1Z19lbnRyeV90ICogZW50cnksIGNoYXIgKm91dF9idWYpCit7CisJc3RydWN0IHRpbWV2YWwgdGltZV92YWw7CisJdW5zaWduZWQgbG9uZyBsb25nIHRpbWU7CisJY2hhciAqZXhjZXB0X3N0cjsKKwl1bnNpZ25lZCBsb25nIGNhbGxlcjsKKwlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGludCBsZXZlbDsKKworCWxldmVsID0gZW50cnktPmlkLmZpZWxkcy5sZXZlbDsKKwl0aW1lID0gZW50cnktPmlkLnN0Y2s7CisJLyogYWRqdXN0IHRvZGNsb2NrIHRvIDE5NzAgKi8KKwl0aW1lIC09IDB4ODEyNmQ2MGU0NjAwMDAwMExMIC0gKDB4M2MyNjcwMExMICogMTAwMDAwMCAqIDQwOTYpOworCXRvZF90b190aW1ldmFsKHRpbWUsICZ0aW1lX3ZhbCk7CisKKwlpZiAoZW50cnktPmlkLmZpZWxkcy5leGNlcHRpb24pCisJCWV4Y2VwdF9zdHIgPSAiKiI7CisJZWxzZQorCQlleGNlcHRfc3RyID0gIi0iOworCWNhbGxlciA9ICgodW5zaWduZWQgbG9uZykgZW50cnktPmNhbGxlcikgJiBQU1dfQUREUl9JTlNOOworCXJjICs9IHNwcmludGYob3V0X2J1ZiwgIiUwMmkgJTAxMWx1OiUwNmx1ICUxdSAlMXMgJTAyaSAlcCAgIiwKKwkJICAgICAgYXJlYSwgdGltZV92YWwudHZfc2VjLCB0aW1lX3ZhbC50dl91c2VjLCBsZXZlbCwKKwkJICAgICAgZXhjZXB0X3N0ciwgZW50cnktPmlkLmZpZWxkcy5jcHVpZCwgKHZvaWQgKikgY2FsbGVyKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBwcmludHMgZGVidWcgZGF0YSBzcHJpbnRmLWZvcm1hdGVkOgorICogZGVidWdfc3ByaW5mX2V2ZW50L2V4Y2VwdGlvbiBjYWxscyBtdXN0IGJlIHVzZWQgdG9nZXRoZXIgd2l0aCB0aGlzIHZpZXcKKyAqLworCisjZGVmaW5lIERFQlVHX1NQUklOVEZfTUFYX0FSR1MgMTAKKworaW50IGRlYnVnX3NwcmludGZfZm9ybWF0X2ZuKGRlYnVnX2luZm9fdCAqIGlkLCBzdHJ1Y3QgZGVidWdfdmlldyAqdmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpvdXRfYnVmLCBkZWJ1Z19zcHJpbnRmX2VudHJ5X3QgKmN1cnJfZXZlbnQpCit7CisJaW50IG51bV9sb25ncywgbnVtX3VzZWRfYXJncyA9IDAsaSwgcmMgPSAwOworCWludCBpbmRleFtERUJVR19TUFJJTlRGX01BWF9BUkdTXTsKKworCS8qIGNvdW50IG9mIGxvbmdzIGZpdCBpbnRvIG9uZSBlbnRyeSAqLworCW51bV9sb25ncyA9IGlkLT5idWZfc2l6ZSAvICBzaXplb2YobG9uZyk7IAorCisJaWYobnVtX2xvbmdzIDwgMSkKKwkJZ290byBvdXQ7IC8qIGJ1ZnNpemUgb2YgZW50cnkgdG9vIHNtYWxsICovCisJaWYobnVtX2xvbmdzID09IDEpIHsKKwkJLyogbm8gYXJncywgd2UgdXNlIG9ubHkgdGhlIHN0cmluZyAqLworCQlzdHJjcHkob3V0X2J1ZiwgY3Vycl9ldmVudC0+c3RyaW5nKTsKKwkJcmMgPSBzdHJsZW4oY3Vycl9ldmVudC0+c3RyaW5nKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogbnVtYmVyIG9mIGFyZ3VtZW50cyB1c2VkIGZvciBzcHJpbnRmICh3aXRob3V0IHRoZSBmb3JtYXQgc3RyaW5nKSAqLworCW51bV91c2VkX2FyZ3MgICA9IG1pbihERUJVR19TUFJJTlRGX01BWF9BUkdTLCAobnVtX2xvbmdzIC0gMSkpOworCisJbWVtc2V0KGluZGV4LDAsIERFQlVHX1NQUklOVEZfTUFYX0FSR1MgKiBzaXplb2YoaW50KSk7CisKKwlmb3IoaSA9IDA7IGkgPCBudW1fdXNlZF9hcmdzOyBpKyspCisJCWluZGV4W2ldID0gaTsKKworCXJjID0gIHNwcmludGYob3V0X2J1ZiwgY3Vycl9ldmVudC0+c3RyaW5nLCBjdXJyX2V2ZW50LT5hcmdzW2luZGV4WzBdXSwKKwkJY3Vycl9ldmVudC0+YXJnc1tpbmRleFsxXV0sIGN1cnJfZXZlbnQtPmFyZ3NbaW5kZXhbMl1dLAorCQljdXJyX2V2ZW50LT5hcmdzW2luZGV4WzNdXSwgY3Vycl9ldmVudC0+YXJnc1tpbmRleFs0XV0sCisJCWN1cnJfZXZlbnQtPmFyZ3NbaW5kZXhbNV1dLCBjdXJyX2V2ZW50LT5hcmdzW2luZGV4WzZdXSwKKwkJY3Vycl9ldmVudC0+YXJnc1tpbmRleFs3XV0sIGN1cnJfZXZlbnQtPmFyZ3NbaW5kZXhbOF1dLAorCQljdXJyX2V2ZW50LT5hcmdzW2luZGV4WzldXSk7CisKK291dDoKKworCXJldHVybiByYzsKK30KKworLyoKKyAqIGNsZWFuIHVwIG1vZHVsZQorICovCit2b2lkIF9fZXhpdCBkZWJ1Z19leGl0KHZvaWQpCit7CisjaWZkZWYgREVCVUcKKwlwcmludGsoImRlYnVnX2NsZWFudXBfbW9kdWxlOiBcbiIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlyZW1vdmVfcHJvY19lbnRyeShkZWJ1Z19wcm9jX3Jvb3RfZW50cnktPm5hbWUsIE5VTEwpOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoczM5MGRiZl9zeXNjdGxfaGVhZGVyKTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBtb2R1bGUgZGVmaW5pdGlvbnMKKyAqLworY29yZV9pbml0Y2FsbChkZWJ1Z19pbml0KTsKK21vZHVsZV9leGl0KGRlYnVnX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitFWFBPUlRfU1lNQk9MKGRlYnVnX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woZGVidWdfdW5yZWdpc3Rlcik7IAorRVhQT1JUX1NZTUJPTChkZWJ1Z19zZXRfbGV2ZWwpOworRVhQT1JUX1NZTUJPTChkZWJ1Z19zdG9wX2FsbCk7CitFWFBPUlRfU1lNQk9MKGRlYnVnX3JlZ2lzdGVyX3ZpZXcpOworRVhQT1JUX1NZTUJPTChkZWJ1Z191bnJlZ2lzdGVyX3ZpZXcpOworRVhQT1JUX1NZTUJPTChkZWJ1Z19ldmVudF9jb21tb24pOworRVhQT1JUX1NZTUJPTChkZWJ1Z19leGNlcHRpb25fY29tbW9uKTsKK0VYUE9SVF9TWU1CT0woZGVidWdfaGV4X2FzY2lpX3ZpZXcpOworRVhQT1JUX1NZTUJPTChkZWJ1Z19yYXdfdmlldyk7CitFWFBPUlRfU1lNQk9MKGRlYnVnX2RmbHRfaGVhZGVyX2ZuKTsKK0VYUE9SVF9TWU1CT0woZGVidWdfc3ByaW50Zl92aWV3KTsKK0VYUE9SVF9TWU1CT0woZGVidWdfc3ByaW50Zl9leGNlcHRpb24pOworRVhQT1JUX1NZTUJPTChkZWJ1Z19zcHJpbnRmX2V2ZW50KTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZWJjZGljLmMgYi9hcmNoL3MzOTAva2VybmVsL2ViY2RpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMGY5NzMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL2ViY2RpYy5jCkBAIC0wLDAgKzEsNDAwIEBACisvKgorICogIGFyY2gvczM5MC9rZXJuZWwvZWJjZGljLmMKKyAqICAgIEVDQkRJQyAtPiBBU0NJSSwgQVNDSUkgLT4gRUNCRElDLAorICogICAgdXBwZXIgdG8gbG93ZXIgY2FzZSAoRUJDRElDKSBjb252ZXJzaW9uIHRhYmxlcy4KKyAqCisgKiAgUzM5MCB2ZXJzaW9uCisgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTkgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgorICogICAgQXV0aG9yKHMpOiBNYXJ0aW4gU2Nod2lkZWZza3kgPHNjaHdpZGVmc2t5QGRlLmlibS5jb20+CisgKiAgICAgICAgICAgICAgIE1hcnRpbiBQZXNjaGtlIDxwZXNjaGtlQGZoLWJyYW5kZW5idXJnLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworLyoKKyAqIEFTQ0lJIChJQk0gUEMgNDM3KSAgLT4gRUJDRElDIDAzNworICovCitfX3U4IF9hc2NlYmNbMjU2XSA9Cit7CisgLyowMCBOVUwgICBTT0ggICBTVFggICBFVFggICBFT1QgICBFTlEgICBBQ0sgICBCRUwgKi8KKyAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgzNywgMHgyRCwgMHgyRSwgMHgyRiwKKyAvKjA4ICBCUyAgICBIVCAgICBMRiAgICBWVCAgICBGRiAgICBDUiAgICBTTyAgICBTSSAqLworIC8qICAgICAgICAgICAgICAtPk5MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgIDB4MTYsIDB4MDUsIDB4MTUsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCisgLyoxMCBETEUgICBEQzEgICBEQzIgICBEQzMgICBEQzQgICBOQUsgICBTWU4gICBFVEIgKi8KKyAgICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgzQywgMHgzRCwgMHgzMiwgMHgyNiwKKyAvKjE4IENBTiAgICBFTSAgIFNVQiAgIEVTQyAgICBGUyAgICBHUyAgICBSUyAgICBVUyAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+SUdTIC0+SVJTIC0+SVVTICovCisgICAgIDB4MTgsIDB4MTksIDB4M0YsIDB4MjcsIDB4MjIsIDB4MUQsIDB4MUUsIDB4MUYsCisgLyoyMCAgU1AgICAgICEgICAgICIgICAgICMgICAgICQgICAgICUgICAgICYgICAgICcgKi8KKyAgICAgMHg0MCwgMHg1QSwgMHg3RiwgMHg3QiwgMHg1QiwgMHg2QywgMHg1MCwgMHg3RCwKKyAvKjI4ICAgKCAgICAgKSAgICAgKiAgICAgKyAgICAgLCAgICAgLSAgICAuICAgICAgLyAqLworICAgICAweDRELCAweDVELCAweDVDLCAweDRFLCAweDZCLCAweDYwLCAweDRCLCAweDYxLAorIC8qMzAgICAwICAgICAxICAgICAyICAgICAzICAgICA0ICAgICA1ICAgICA2ICAgICA3ICovCisgICAgIDB4RjAsIDB4RjEsIDB4RjIsIDB4RjMsIDB4RjQsIDB4RjUsIDB4RjYsIDB4RjcsCisgLyozOCAgIDggICAgIDkgICAgIDogICAgIDsgICAgIDwgICAgID0gICAgID4gICAgID8gKi8KKyAgICAgMHhGOCwgMHhGOSwgMHg3QSwgMHg1RSwgMHg0QywgMHg3RSwgMHg2RSwgMHg2RiwKKyAvKjQwICAgQCAgICAgQSAgICAgQiAgICAgQyAgICAgRCAgICAgRSAgICAgRiAgICAgRyAqLworICAgICAweDdDLCAweEMxLCAweEMyLCAweEMzLCAweEM0LCAweEM1LCAweEM2LCAweEM3LAorIC8qNDggICBIICAgICBJICAgICBKICAgICBLICAgICBMICAgICBNICAgICBOICAgICBPICovCisgICAgIDB4QzgsIDB4QzksIDB4RDEsIDB4RDIsIDB4RDMsIDB4RDQsIDB4RDUsIDB4RDYsCisgLyo1MCAgIFAgICAgIFEgICAgIFIgICAgIFMgICAgIFQgICAgIFUgICAgIFYgICAgIFcgKi8KKyAgICAgMHhENywgMHhEOCwgMHhEOSwgMHhFMiwgMHhFMywgMHhFNCwgMHhFNSwgMHhFNiwKKyAvKjU4ICAgWCAgICAgWSAgICAgWiAgICAgWyAgICAgXCAgICAgXSAgICAgXiAgICAgXyAqLworICAgICAweEU3LCAweEU4LCAweEU5LCAweEJBLCAweEUwLCAweEJCLCAweEIwLCAweDZELAorIC8qNjAgICBgICAgICBhICAgICBiICAgICBjICAgICBkICAgICBlICAgICBmICAgICBnICovCisgICAgIDB4NzksIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsCisgLyo2OCAgIGggICAgIGkgICAgIGogICAgIGsgICAgIGwgICAgIG0gICAgIG4gICAgIG8gKi8KKyAgICAgMHg4OCwgMHg4OSwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwKKyAvKjcwICAgcCAgICAgcSAgICAgciAgICAgcyAgICAgdCAgICAgdSAgICAgdiAgICAgdyAqLworICAgICAweDk3LCAweDk4LCAweDk5LCAweEEyLCAweEEzLCAweEE0LCAweEE1LCAweEE2LAorIC8qNzggICB4ICAgICB5ICAgICB6ICAgICB7ICAgICB8ICAgICB9ICAgICB+ICAgIERMICovCisgICAgIDB4QTcsIDB4QTgsIDB4QTksIDB4QzAsIDB4NEYsIDB4RDAsIDB4QTEsIDB4MDcsCisgLyo4MCovCisgICAgIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsCisgLyo4OCovCisgICAgIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsCisgLyo5MCovCisgICAgIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsCisgLyo5OCovCisgICAgIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsCisgLypBMCovCisgICAgIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsCisgLypBOCovCisgICAgIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsCisgLypCMCovCisgICAgIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsCisgLypCOCovCisgICAgIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsCisgLypDMCovCisgICAgIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsCisgLypDOCovCisgICAgIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsCisgLypEMCovCisgICAgIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsCisgLypEOCovCisgICAgIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsCisgLypFMCAgICAgICAgc3oJCQkJCQkqLworICAgICAweDNGLCAweDU5LCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLAorIC8qRTgqLworICAgICAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLAorIC8qRjAqLworICAgICAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLAorIC8qRjgqLworICAgICAweDkwLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweEVBLCAweDNGLCAweEZGCit9OworCisvKgorICogRUJDRElDIDAzNyAtPiBBU0NJSSAoSUJNIFBDIDQzNykKKyAqLworX191OCBfZWJjYXNjWzI1Nl0gPQoreworIC8qIDB4MDAgICBOVUwgICBTT0ggICBTVFggICBFVFggICpTRUwgICAgSFQgICpSTkwgICBERUwgKi8KKyAgICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA3LCAweDA5LCAweDA3LCAweDdGLAorIC8qIDB4MDggICAtR0UgIC1TUFMgIC1SUFQgICAgVlQgICAgRkYgICAgQ1IgICAgU08gICAgU0kgKi8KKyAgICAgICAgICAweDA3LCAweDA3LCAweDA3LCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAorIC8qIDB4MTAgICBETEUgICBEQzEgICBEQzIgICBEQzMgIC1SRVMgICAtTkwgICAgQlMgIC1QT0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5QICAtPkxGICAgICAgICAgICAgICovCisgICAgICAgICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgwNywgMHgwQSwgMHgwOCwgMHgwNywKKyAvKiAweDE4ICAgQ0FOICAgIEVNICAtVUJTICAtQ1UxICAtSUZTICAtSUdTICAtSVJTICAtSVRCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLUlVUyAqLworICAgICAgICAgIDB4MTgsIDB4MTksIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsCisgLyogMHgyMCAgIC1EUyAgLVNPUyAgICBGUyAgLVdVUyAgLUJZUCAgICBMRiAgIEVUQiAgIEVTQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1JTlAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAweDA3LCAweDA3LCAweDFDLCAweDA3LCAweDA3LCAweDBBLCAweDE3LCAweDFCLAorIC8qIDB4MjggICAtU0EgIC1TRkUgICAtU00gIC1DU1AgIC1NRkEgICBFTlEgICBBQ0sgICBCRUwKKyAgICAgICAgICAgICAgICAgICAgICAgLVNXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIAorICAgICAgICAgIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDUsIDB4MDYsIDB4MDcsCisgLyogMHgzMCAgLS0tLSAgLS0tLSAgIFNZTiAgIC1JUiAgIC1QUCAgLVRSTiAgLU5CUyAgIEVPVCAqLworICAgICAgICAgIDB4MDcsIDB4MDcsIDB4MTYsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDQsCisgLyogMHgzOCAgLVNCUyAgIC1JVCAgLVJGRiAgLUNVMyAgIERDNCAgIE5BSyAgLS0tLSAgIFNVQiAqLworICAgICAgICAgIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MTQsIDB4MTUsIDB4MDcsIDB4MUEsCisgLyogMHg0MCAgICBTUCAgIFJTUCAgICAgICAgICAggeQgICAgICAgICAgICAgIC0tLS0gICAgICAgKi8KKyAgICAgICAgICAweDIwLCAweEZGLCAweDgzLCAweDg0LCAweDg1LCAweEEwLCAweDA3LCAweDg2LAorIC8qIDB4NDggICAgICAgICAgICAgICAgICAgICAgIC4gICAgIDwgICAgICggICAgICsgICAgIHwgKi8KKyAgICAgICAgICAweDg3LCAweEE0LCAweDlCLCAweDJFLCAweDNDLCAweDI4LCAweDJCLCAweDdDLAorIC8qIDB4NTAgICAgICYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0gKi8KKyAgICAgICAgICAweDI2LCAweDgyLCAweDg4LCAweDg5LCAweDhBLCAweEExLCAweDhDLCAweDA3LAorIC8qIDB4NTggICAgICAgICAgIIHfICAgICAhICAgICAkICAgICAqICAgICApICAgICA7ICAgICAgICovCisgICAgICAgICAgMHg4RCwgMHhFMSwgMHgyMSwgMHgyNCwgMHgyQSwgMHgyOSwgMHgzQiwgMHhBQSwKKyAvKiAweDYwICAgICAtICAgICAvICAtLS0tICAgICCBxCAgLS0tLSAgLS0tLSAgLS0tLSAgICAgICAqLworICAgICAgICAgIDB4MkQsIDB4MkYsIDB4MDcsIDB4OEUsIDB4MDcsIDB4MDcsIDB4MDcsIDB4OEYsCisgLyogMHg2OCAgICAgICAgICAgICAgLS0tLSAgICAgLCAgICAgJSAgICAgXyAgICAgPiAgICAgPyAqLyAKKyAgICAgICAgICAweDgwLCAweEE1LCAweDA3LCAweDJDLCAweDI1LCAweDVGLCAweDNFLCAweDNGLAorIC8qIDB4NzAgIC0tLS0gICAgICAgIC0tLS0gIC0tLS0gIC0tLS0gIC0tLS0gIC0tLS0gIC0tLS0gKi8KKyAgICAgICAgICAweDA3LCAweDkwLCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LAorIC8qIDB4NzggICAgICogICAgIGAgICAgIDogICAgICMgICAgIEAgICAgICcgICAgID0gICAgICIgKi8KKyAgICAgICAgICAweDcwLCAweDYwLCAweDNBLCAweDIzLCAweDQwLCAweDI3LCAweDNELCAweDIyLAorIC8qIDB4ODAgICAgICogICAgIGEgICAgIGIgICAgIGMgICAgIGQgICAgIGUgICAgIGYgICAgIGcgKi8KKyAgICAgICAgICAweDA3LCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LAorIC8qIDB4ODggICAgIGggICAgIGkgICAgICAgICAgICAgIC0tLS0gIC0tLS0gIC0tLS0gICAgICAgKi8KKyAgICAgICAgICAweDY4LCAweDY5LCAweEFFLCAweEFGLCAweDA3LCAweDA3LCAweDA3LCAweEYxLAorIC8qIDB4OTAgICAgIIGwICAgICBqICAgICBrICAgICBsICAgICBtICAgICBuICAgICBvICAgICBwICovCisgICAgICAgICAgMHhGOCwgMHg2QSwgMHg2QiwgMHg2QywgMHg2RCwgMHg2RSwgMHg2RiwgMHg3MCwKKyAvKiAweDk4ICAgICBxICAgICByICAgICAgICAgICAgICAgICAgICAtLS0tICAgICAgICAtLS0tICovCisgICAgICAgICAgMHg3MSwgMHg3MiwgMHhBNiwgMHhBNywgMHg5MSwgMHgwNywgMHg5MiwgMHgwNywKKyAvKiAweEEwICAgICAgICAgICB+ICAgICBzICAgICB0ICAgICB1ICAgICB2ICAgICB3ICAgICB4ICovCisgICAgICAgICAgMHhFNiwgMHg3RSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwKKyAvKiAweEE4ICAgICB5ICAgICB6ICAgICAgICAgICAgICAtLS0tICAtLS0tICAtLS0tICAtLS0tICovCisgICAgICAgICAgMHg3OSwgMHg3QSwgMHhBRCwgMHhBQiwgMHgwNywgMHgwNywgMHgwNywgMHgwNywKKyAvKiAweEIwICAgICBeICAgICAgICAgICAgICAgICAgICAtLS0tICAgICCBpyAgLS0tLSAgICAgICAqLworICAgICAgICAgIDB4NUUsIDB4OUMsIDB4OUQsIDB4RkEsIDB4MDcsIDB4MDcsIDB4MDcsIDB4QUMsCisgLyogMHhCOCAgICAgICAgLS0tLSAgICAgWyAgICAgXSAgLS0tLSAgLS0tLSAgLS0tLSAgLS0tLSAqLworICAgICAgICAgIDB4QUIsIDB4MDcsIDB4NUIsIDB4NUQsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsCisgLyogMHhDMCAgICAgeyAgICAgQSAgICAgQiAgICAgQyAgICAgRCAgICAgRSAgICAgRiAgICAgRyAqLworICAgICAgICAgIDB4N0IsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsCisgLyogMHhDOCAgICAgSCAgICAgSSAgLS0tLSAgICAgICAgICAggfYgICAgICAgICAgICAgIC0tLS0gKi8KKyAgICAgICAgICAweDQ4LCAweDQ5LCAweDA3LCAweDkzLCAweDk0LCAweDk1LCAweEEyLCAweDA3LAorIC8qIDB4RDAgICAgIH0gICAgIEogICAgIEsgICAgIEwgICAgIE0gICAgIE4gICAgIE8gICAgIFAgKi8KKyAgICAgICAgICAweDdELCAweDRBLCAweDRCLCAweDRDLCAweDRELCAweDRFLCAweDRGLCAweDUwLAorIC8qIDB4RDggICAgIFEgICAgIFIgIC0tLS0gICAgICAgICAgIIH8ICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgMHg1MSwgMHg1MiwgMHgwNywgMHg5NiwgMHg4MSwgMHg5NywgMHhBMywgMHg5OCwKKyAvKiAweEUwICAgICBcICAgICAgICAgICBTICAgICBUICAgICBVICAgICBWICAgICBXICAgICBYICovCisgICAgICAgICAgMHg1QywgMHhGNiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwKKyAvKiAweEU4ICAgICBZICAgICBaICAgICAgICAtLS0tICAgICCB1iAgLS0tLSAgLS0tLSAgLS0tLSAqLworICAgICAgICAgIDB4NTksIDB4NUEsIDB4RkQsIDB4MDcsIDB4OTksIDB4MDcsIDB4MDcsIDB4MDcsCisgLyogMHhGMCAgICAgMCAgICAgMSAgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgNiAgICAgNyAqLworICAgICAgICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsCisgLyogMHhGOCAgICAgOCAgICAgOSAgLS0tLSAgLS0tLSAgICAggdwgIC0tLS0gIC0tLS0gIC0tLS0gKi8KKyAgICAgICAgICAweDM4LCAweDM5LCAweDA3LCAweDA3LCAweDlBLCAweDA3LCAweDA3LCAweDA3Cit9OworCisKKy8qCisgKiBBU0NJSSAoSUJNIFBDIDQzNykgIC0+IEVCQ0RJQyA1MDAKKyAqLworX191OCBfYXNjZWJjXzUwMFsyNTZdID0KK3sKKyAvKjAwIE5VTCAgIFNPSCAgIFNUWCAgIEVUWCAgIEVPVCAgIEVOUSAgIEFDSyAgIEJFTCAqLworICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDM3LCAweDJELCAweDJFLCAweDJGLAorIC8qMDggIEJTICAgIEhUICAgIExGICAgIFZUICAgIEZGICAgIENSICAgIFNPICAgIFNJICovCisgLyogICAgICAgICAgICAgIC0+TkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgMHgxNiwgMHgwNSwgMHgxNSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKKyAvKjEwIERMRSAgIERDMSAgIERDMiAgIERDMyAgIERDNCAgIE5BSyAgIFNZTiAgIEVUQiAqLworICAgICAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDNDLCAweDNELCAweDMyLCAweDI2LAorIC8qMTggQ0FOICAgIEVNICAgU1VCICAgRVNDICAgIEZTICAgIEdTICAgIFJTICAgIFVTICovCisgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5JR1MgLT5JUlMgLT5JVVMgKi8KKyAgICAgMHgxOCwgMHgxOSwgMHgzRiwgMHgyNywgMHgyMiwgMHgxRCwgMHgxRSwgMHgxRiwKKyAvKjIwICBTUCAgICAgISAgICAgIiAgICAgIyAgICAgJCAgICAgJSAgICAgJiAgICAgJyAqLworICAgICAweDQwLCAweDRGLCAweDdGLCAweDdCLCAweDVCLCAweDZDLCAweDUwLCAweDdELAorIC8qMjggICAoICAgICApICAgICAqICAgICArICAgICAsICAgICAtICAgIC4gICAgICAvICovCisgICAgIDB4NEQsIDB4NUQsIDB4NUMsIDB4NEUsIDB4NkIsIDB4NjAsIDB4NEIsIDB4NjEsCisgLyozMCAgIDAgICAgIDEgICAgIDIgICAgIDMgICAgIDQgICAgIDUgICAgIDYgICAgIDcgKi8KKyAgICAgMHhGMCwgMHhGMSwgMHhGMiwgMHhGMywgMHhGNCwgMHhGNSwgMHhGNiwgMHhGNywKKyAvKjM4ICAgOCAgICAgOSAgICAgOiAgICAgOyAgICAgPCAgICAgPSAgICAgPiAgICAgPyAqLworICAgICAweEY4LCAweEY5LCAweDdBLCAweDVFLCAweDRDLCAweDdFLCAweDZFLCAweDZGLAorIC8qNDAgICBAICAgICBBICAgICBCICAgICBDICAgICBEICAgICBFICAgICBGICAgICBHICovCisgICAgIDB4N0MsIDB4QzEsIDB4QzIsIDB4QzMsIDB4QzQsIDB4QzUsIDB4QzYsIDB4QzcsCisgLyo0OCAgIEggICAgIEkgICAgIEogICAgIEsgICAgIEwgICAgIE0gICAgIE4gICAgIE8gKi8KKyAgICAgMHhDOCwgMHhDOSwgMHhEMSwgMHhEMiwgMHhEMywgMHhENCwgMHhENSwgMHhENiwKKyAvKjUwICAgUCAgICAgUSAgICAgUiAgICAgUyAgICAgVCAgICAgVSAgICAgViAgICAgVyAqLworICAgICAweEQ3LCAweEQ4LCAweEQ5LCAweEUyLCAweEUzLCAweEU0LCAweEU1LCAweEU2LAorIC8qNTggICBYICAgICBZICAgICBaICAgICBbICAgICBcICAgICBdICAgICBeICAgICBfICovCisgICAgIDB4RTcsIDB4RTgsIDB4RTksIDB4NEEsIDB4RTAsIDB4NUEsIDB4NUYsIDB4NkQsCisgLyo2MCAgIGAgICAgIGEgICAgIGIgICAgIGMgICAgIGQgICAgIGUgICAgIGYgICAgIGcgKi8KKyAgICAgMHg3OSwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywKKyAvKjY4ICAgaCAgICAgaSAgICAgaiAgICAgayAgICAgbCAgICAgbSAgICAgbiAgICAgbyAqLworICAgICAweDg4LCAweDg5LCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LAorIC8qNzAgICBwICAgICBxICAgICByICAgICBzICAgICB0ICAgICB1ICAgICB2ICAgICB3ICovCisgICAgIDB4OTcsIDB4OTgsIDB4OTksIDB4QTIsIDB4QTMsIDB4QTQsIDB4QTUsIDB4QTYsCisgLyo3OCAgIHggICAgIHkgICAgIHogICAgIHsgICAgIHwgICAgIH0gICAgIH4gICAgREwgKi8KKyAgICAgMHhBNywgMHhBOCwgMHhBOSwgMHhDMCwgMHhCQiwgMHhEMCwgMHhBMSwgMHgwNywKKyAvKjgwKi8KKyAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKKyAvKjg4Ki8KKyAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKKyAvKjkwKi8KKyAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKKyAvKjk4Ki8KKyAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKKyAvKkEwKi8KKyAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKKyAvKkE4Ki8KKyAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKKyAvKkIwKi8KKyAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKKyAvKkI4Ki8KKyAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKKyAvKkMwKi8KKyAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKKyAvKkM4Ki8KKyAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKKyAvKkQwKi8KKyAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKKyAvKkQ4Ki8KKyAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKKyAvKkUwICAgICAgICBzegkJCQkJCSovCisgICAgIDB4M0YsIDB4NTksIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsCisgLypFOCovCisgICAgIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsCisgLypGMCovCisgICAgIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsCisgLypGOCovCisgICAgIDB4OTAsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4RUEsIDB4M0YsIDB4RkYKK307CisKKy8qCisgKiBFQkNESUMgNTAwIC0+IEFTQ0lJIChJQk0gUEMgNDM3KQorICovCitfX3U4IF9lYmNhc2NfNTAwWzI1Nl0gPQoreworIC8qIDB4MDAgICBOVUwgICBTT0ggICBTVFggICBFVFggICpTRUwgICAgSFQgICpSTkwgICBERUwgKi8KKyAgICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA3LCAweDA5LCAweDA3LCAweDdGLAorIC8qIDB4MDggICAtR0UgIC1TUFMgIC1SUFQgICAgVlQgICAgRkYgICAgQ1IgICAgU08gICAgU0kgKi8KKyAgICAgICAgICAweDA3LCAweDA3LCAweDA3LCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAorIC8qIDB4MTAgICBETEUgICBEQzEgICBEQzIgICBEQzMgIC1SRVMgICAtTkwgICAgQlMgIC1QT0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5QICAtPkxGICAgICAgICAgICAgICovCisgICAgICAgICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgwNywgMHgwQSwgMHgwOCwgMHgwNywKKyAvKiAweDE4ICAgQ0FOICAgIEVNICAtVUJTICAtQ1UxICAtSUZTICAtSUdTICAtSVJTICAtSVRCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLUlVUyAqLworICAgICAgICAgIDB4MTgsIDB4MTksIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsCisgLyogMHgyMCAgIC1EUyAgLVNPUyAgICBGUyAgLVdVUyAgLUJZUCAgICBMRiAgIEVUQiAgIEVTQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1JTlAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAweDA3LCAweDA3LCAweDFDLCAweDA3LCAweDA3LCAweDBBLCAweDE3LCAweDFCLAorIC8qIDB4MjggICAtU0EgIC1TRkUgICAtU00gIC1DU1AgIC1NRkEgICBFTlEgICBBQ0sgICBCRUwKKyAgICAgICAgICAgICAgICAgICAgICAgLVNXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIAorICAgICAgICAgIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDUsIDB4MDYsIDB4MDcsCisgLyogMHgzMCAgLS0tLSAgLS0tLSAgIFNZTiAgIC1JUiAgIC1QUCAgLVRSTiAgLU5CUyAgIEVPVCAqLworICAgICAgICAgIDB4MDcsIDB4MDcsIDB4MTYsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDQsCisgLyogMHgzOCAgLVNCUyAgIC1JVCAgLVJGRiAgLUNVMyAgIERDNCAgIE5BSyAgLS0tLSAgIFNVQiAqLworICAgICAgICAgIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MTQsIDB4MTUsIDB4MDcsIDB4MUEsCisgLyogMHg0MCAgICBTUCAgIFJTUCAgICAgICAgICAggeQgICAgICAgICAgICAgIC0tLS0gICAgICAgKi8KKyAgICAgICAgICAweDIwLCAweEZGLCAweDgzLCAweDg0LCAweDg1LCAweEEwLCAweDA3LCAweDg2LAorIC8qIDB4NDggICAgICAgICAgICAgICAgIFsgICAgIC4gICAgIDwgICAgICggICAgICsgICAgICEgKi8KKyAgICAgICAgICAweDg3LCAweEE0LCAweDVCLCAweDJFLCAweDNDLCAweDI4LCAweDJCLCAweDIxLAorIC8qIDB4NTAgICAgICYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0gKi8KKyAgICAgICAgICAweDI2LCAweDgyLCAweDg4LCAweDg5LCAweDhBLCAweEExLCAweDhDLCAweDA3LAorIC8qIDB4NTggICAgICAgICAgIIHfICAgICBdICAgICAkICAgICAqICAgICApICAgICA7ICAgICBeICovCisgICAgICAgICAgMHg4RCwgMHhFMSwgMHg1RCwgMHgyNCwgMHgyQSwgMHgyOSwgMHgzQiwgMHg1RSwKKyAvKiAweDYwICAgICAtICAgICAvICAtLS0tICAgICCBxCAgLS0tLSAgLS0tLSAgLS0tLSAgICAgICAqLworICAgICAgICAgIDB4MkQsIDB4MkYsIDB4MDcsIDB4OEUsIDB4MDcsIDB4MDcsIDB4MDcsIDB4OEYsCisgLyogMHg2OCAgICAgICAgICAgICAgLS0tLSAgICAgLCAgICAgJSAgICAgXyAgICAgPiAgICAgPyAqLyAKKyAgICAgICAgICAweDgwLCAweEE1LCAweDA3LCAweDJDLCAweDI1LCAweDVGLCAweDNFLCAweDNGLAorIC8qIDB4NzAgIC0tLS0gICAgICAgIC0tLS0gIC0tLS0gIC0tLS0gIC0tLS0gIC0tLS0gIC0tLS0gKi8KKyAgICAgICAgICAweDA3LCAweDkwLCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LAorIC8qIDB4NzggICAgICogICAgIGAgICAgIDogICAgICMgICAgIEAgICAgICcgICAgID0gICAgICIgKi8KKyAgICAgICAgICAweDcwLCAweDYwLCAweDNBLCAweDIzLCAweDQwLCAweDI3LCAweDNELCAweDIyLAorIC8qIDB4ODAgICAgICogICAgIGEgICAgIGIgICAgIGMgICAgIGQgICAgIGUgICAgIGYgICAgIGcgKi8KKyAgICAgICAgICAweDA3LCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LAorIC8qIDB4ODggICAgIGggICAgIGkgICAgICAgICAgICAgIC0tLS0gIC0tLS0gIC0tLS0gICAgICAgKi8KKyAgICAgICAgICAweDY4LCAweDY5LCAweEFFLCAweEFGLCAweDA3LCAweDA3LCAweDA3LCAweEYxLAorIC8qIDB4OTAgICAgIIGwICAgICBqICAgICBrICAgICBsICAgICBtICAgICBuICAgICBvICAgICBwICovCisgICAgICAgICAgMHhGOCwgMHg2QSwgMHg2QiwgMHg2QywgMHg2RCwgMHg2RSwgMHg2RiwgMHg3MCwKKyAvKiAweDk4ICAgICBxICAgICByICAgICAgICAgICAgICAgICAgICAtLS0tICAgICAgICAtLS0tICovCisgICAgICAgICAgMHg3MSwgMHg3MiwgMHhBNiwgMHhBNywgMHg5MSwgMHgwNywgMHg5MiwgMHgwNywKKyAvKiAweEEwICAgICAgICAgICB+ICAgICBzICAgICB0ICAgICB1ICAgICB2ICAgICB3ICAgICB4ICovCisgICAgICAgICAgMHhFNiwgMHg3RSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwKKyAvKiAweEE4ICAgICB5ICAgICB6ICAgICAgICAgICAgICAtLS0tICAtLS0tICAtLS0tICAtLS0tICovCisgICAgICAgICAgMHg3OSwgMHg3QSwgMHhBRCwgMHhBQiwgMHgwNywgMHgwNywgMHgwNywgMHgwNywKKyAvKiAweEIwICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tICAgICCBpyAgLS0tLSAgICAgICAqLworICAgICAgICAgIDB4OUIsIDB4OUMsIDB4OUQsIDB4RkEsIDB4MDcsIDB4MDcsIDB4MDcsIDB4QUMsCisgLyogMHhCOCAgICAgICAgLS0tLSAgICAgICAgICAgfCAgLS0tLSAgLS0tLSAgLS0tLSAgLS0tLSAqLworICAgICAgICAgIDB4QUIsIDB4MDcsIDB4QUEsIDB4N0MsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsCisgLyogMHhDMCAgICAgeyAgICAgQSAgICAgQiAgICAgQyAgICAgRCAgICAgRSAgICAgRiAgICAgRyAqLworICAgICAgICAgIDB4N0IsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsCisgLyogMHhDOCAgICAgSCAgICAgSSAgLS0tLSAgICAgICAgICAggfYgICAgICAgICAgICAgIC0tLS0gKi8KKyAgICAgICAgICAweDQ4LCAweDQ5LCAweDA3LCAweDkzLCAweDk0LCAweDk1LCAweEEyLCAweDA3LAorIC8qIDB4RDAgICAgIH0gICAgIEogICAgIEsgICAgIEwgICAgIE0gICAgIE4gICAgIE8gICAgIFAgKi8KKyAgICAgICAgICAweDdELCAweDRBLCAweDRCLCAweDRDLCAweDRELCAweDRFLCAweDRGLCAweDUwLAorIC8qIDB4RDggICAgIFEgICAgIFIgIC0tLS0gICAgICAgICAgIIH8ICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgMHg1MSwgMHg1MiwgMHgwNywgMHg5NiwgMHg4MSwgMHg5NywgMHhBMywgMHg5OCwKKyAvKiAweEUwICAgICBcICAgICAgICAgICBTICAgICBUICAgICBVICAgICBWICAgICBXICAgICBYICovCisgICAgICAgICAgMHg1QywgMHhGNiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwKKyAvKiAweEU4ICAgICBZICAgICBaICAgICAgICAtLS0tICAgICCB1iAgLS0tLSAgLS0tLSAgLS0tLSAqLworICAgICAgICAgIDB4NTksIDB4NUEsIDB4RkQsIDB4MDcsIDB4OTksIDB4MDcsIDB4MDcsIDB4MDcsCisgLyogMHhGMCAgICAgMCAgICAgMSAgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgNiAgICAgNyAqLworICAgICAgICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsCisgLyogMHhGOCAgICAgOCAgICAgOSAgLS0tLSAgLS0tLSAgICAggdwgIC0tLS0gIC0tLS0gIC0tLS0gKi8KKyAgICAgICAgICAweDM4LCAweDM5LCAweDA3LCAweDA3LCAweDlBLCAweDA3LCAweDA3LCAweDA3Cit9OworCisKKy8qCisgKiBFQkNESUMgMDM3LzUwMCBjb252ZXJzaW9uIHRhYmxlOgorICogZnJvbSB1cHBlciB0byBsb3dlciBjYXNlCisgKi8KK19fdTggX2ViY190b2xvd2VyWzI1Nl0gPQoreworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisJMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LAorCTB4MTgsIDB4MTksIDB4MUEsIDB4MUIsIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYsCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywKKwkweDI4LCAweDI5LCAweDJBLCAweDJCLCAweDJDLCAweDJELCAweDJFLCAweDJGLAorCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsCisJMHgzOCwgMHgzOSwgMHgzQSwgMHgzQiwgMHgzQywgMHgzRCwgMHgzRSwgMHgzRiwKKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LAorCTB4NDgsIDB4NDksIDB4NEEsIDB4NEIsIDB4NEMsIDB4NEQsIDB4NEUsIDB4NEYsCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywKKwkweDU4LCAweDU5LCAweDVBLCAweDVCLCAweDVDLCAweDVELCAweDVFLCAweDVGLAorCTB4NjAsIDB4NjEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsCisJMHg0OCwgMHg0OSwgMHg2QSwgMHg2QiwgMHg2QywgMHg2RCwgMHg2RSwgMHg2RiwKKwkweDcwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LAorCTB4NTgsIDB4NzksIDB4N0EsIDB4N0IsIDB4N0MsIDB4N0QsIDB4N0UsIDB4N0YsCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywKKwkweDg4LCAweDg5LCAweDhBLCAweDhCLCAweDhDLCAweDhELCAweDhFLCAweDhGLAorCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsCisJMHg5OCwgMHg5OSwgMHg5QSwgMHg5QiwgMHg5QywgMHg5RCwgMHg5QywgMHg5RiwKKwkweEEwLCAweEExLCAweEEyLCAweEEzLCAweEE0LCAweEE1LCAweEE2LCAweEE3LAorCTB4QTgsIDB4QTksIDB4QUEsIDB4QUIsIDB4OEMsIDB4OEQsIDB4OEUsIDB4QUYsCisJMHhCMCwgMHhCMSwgMHhCMiwgMHhCMywgMHhCNCwgMHhCNSwgMHhCNiwgMHhCNywKKwkweEI4LCAweEI5LCAweEJBLCAweEJCLCAweEJDLCAweEJELCAweEJFLCAweEJGLAorCTB4QzAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsCisJMHg4OCwgMHg4OSwgMHhDQSwgMHhDQiwgMHhDQywgMHhDRCwgMHhDRSwgMHhDRiwKKwkweEQwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LAorCTB4OTgsIDB4OTksIDB4REEsIDB4REIsIDB4REMsIDB4REQsIDB4REUsIDB4REYsCisJMHhFMCwgMHhFMSwgMHhBMiwgMHhBMywgMHhBNCwgMHhBNSwgMHhBNiwgMHhBNywKKwkweEE4LCAweEE5LCAweEVBLCAweENCLCAweENDLCAweENELCAweENFLCAweENGLAorCTB4RjAsIDB4RjEsIDB4RjIsIDB4RjMsIDB4RjQsIDB4RjUsIDB4RjYsIDB4RjcsCisJMHhGOCwgMHhGOSwgMHhGQSwgMHhEQiwgMHhEQywgMHhERCwgMHhERSwgMHhGRgorfTsKKworCisvKgorICogRUJDRElDIDAzNy81MDAgY29udmVyc2lvbiB0YWJsZToKKyAqIGZyb20gbG93ZXIgdG8gdXBwZXIgY2FzZQorICovCitfX3U4IF9lYmNfdG91cHBlclsyNTZdID0KK3sKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorCTB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywKKwkweDE4LCAweDE5LCAweDFBLCAweDFCLCAweDFDLCAweDFELCAweDFFLCAweDFGLAorCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsCisJMHgyOCwgMHgyOSwgMHgyQSwgMHgyQiwgMHgyQywgMHgyRCwgMHgyRSwgMHgyRiwKKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LAorCTB4MzgsIDB4MzksIDB4M0EsIDB4M0IsIDB4M0MsIDB4M0QsIDB4M0UsIDB4M0YsCisJMHg0MCwgMHg0MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywKKwkweDY4LCAweDY5LCAweDRBLCAweDRCLCAweDRDLCAweDRELCAweDRFLCAweDRGLAorCTB4NTAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsCisJMHg3OCwgMHg1OSwgMHg1QSwgMHg1QiwgMHg1QywgMHg1RCwgMHg1RSwgMHg1RiwKKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LAorCTB4NjgsIDB4NjksIDB4NkEsIDB4NkIsIDB4NkMsIDB4NkQsIDB4NkUsIDB4NkYsCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywKKwkweDc4LCAweDc5LCAweDdBLCAweDdCLCAweDdDLCAweDdELCAweDdFLCAweDdGLAorCTB4ODAsIDB4QzEsIDB4QzIsIDB4QzMsIDB4QzQsIDB4QzUsIDB4QzYsIDB4QzcsCisJMHhDOCwgMHhDOSwgMHg4QSwgMHg4QiwgMHhBQywgMHhBRCwgMHhBRSwgMHg4RiwKKwkweDkwLCAweEQxLCAweEQyLCAweEQzLCAweEQ0LCAweEQ1LCAweEQ2LCAweEQ3LAorCTB4RDgsIDB4RDksIDB4OUEsIDB4OUIsIDB4OUUsIDB4OUQsIDB4OUUsIDB4OUYsCisJMHhBMCwgMHhBMSwgMHhFMiwgMHhFMywgMHhFNCwgMHhFNSwgMHhFNiwgMHhFNywKKwkweEU4LCAweEU5LCAweEFBLCAweEFCLCAweEFDLCAweEFELCAweEFFLCAweEFGLAorCTB4QjAsIDB4QjEsIDB4QjIsIDB4QjMsIDB4QjQsIDB4QjUsIDB4QjYsIDB4QjcsCisJMHhCOCwgMHhCOSwgMHhCQSwgMHhCQiwgMHhCQywgMHhCRCwgMHhCRSwgMHhCRiwKKwkweEMwLCAweEMxLCAweEMyLCAweEMzLCAweEM0LCAweEM1LCAweEM2LCAweEM3LAorCTB4QzgsIDB4QzksIDB4Q0EsIDB4RUIsIDB4RUMsIDB4RUQsIDB4RUUsIDB4RUYsCisJMHhEMCwgMHhEMSwgMHhEMiwgMHhEMywgMHhENCwgMHhENSwgMHhENiwgMHhENywKKwkweEQ4LCAweEQ5LCAweERBLCAweEZCLCAweEZDLCAweEZELCAweEZFLCAweERGLAorCTB4RTAsIDB4RTEsIDB4RTIsIDB4RTMsIDB4RTQsIDB4RTUsIDB4RTYsIDB4RTcsCisJMHhFOCwgMHhFOSwgMHhFQSwgMHhFQiwgMHhFQywgMHhFRCwgMHhFRSwgMHhFRiwKKwkweEYwLCAweEYxLCAweEYyLCAweEYzLCAweEY0LCAweEY1LCAweEY2LCAweEY3LAorCTB4RjgsIDB4RjksIDB4RkEsIDB4RkIsIDB4RkMsIDB4RkQsIDB4RkUsIDB4RkYKK307CisKK0VYUE9SVF9TWU1CT0woX2FzY2ViY181MDApOworRVhQT1JUX1NZTUJPTChfZWJjYXNjXzUwMCk7CitFWFBPUlRfU1lNQk9MKF9hc2NlYmMpOworRVhQT1JUX1NZTUJPTChfZWJjYXNjKTsKK0VYUE9SVF9TWU1CT0woX2ViY190b2xvd2VyKTsKK0VYUE9SVF9TWU1CT0woX2ViY190b3VwcGVyKTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZTA5YjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMKQEAgLTAsMCArMSw4NjggQEAKKy8qCisgKiAgYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TCisgKiAgICBTMzkwIGxvdy1sZXZlbCBlbnRyeSBwb2ludHMuCisgKgorICogIFMzOTAgdmVyc2lvbgorICogICAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgorICogICAgQXV0aG9yKHMpOiBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pLAorICogICAgICAgICAgICAgICBIYXJ0bXV0IFBlbm5lciAoaHBAZGUuaWJtLmNvbSksCisgKiAgICAgICAgICAgICAgIERlbmlzIEpvc2VwaCBCYXJyb3cgKGRqYmFycm93QGRlLmlibS5jb20sYmFycm93X2RqQHlhaG9vLmNvbSksCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N5cy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vbG93Y29yZS5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCisvKgorICogU3RhY2sgbGF5b3V0IGZvciB0aGUgc3lzdGVtX2NhbGwgc3RhY2sgZW50cnkuCisgKiBUaGUgZmlyc3QgZmV3IGVudHJpZXMgYXJlIGlkZW50aWNhbCB0byB0aGUgdXNlcl9yZWdzX3N0cnVjdC4KKyAqLworU1BfUFRSRUdTICAgID0gIFNUQUNLX0ZSQU1FX09WRVJIRUFECitTUF9BUkdTICAgICAgPSAgU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX0FSR1MKK1NQX1BTVyAgICAgICA9ICBTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfUFNXCitTUF9SMCAgICAgICAgPSAgU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX0dQUlMKK1NQX1IxICAgICAgICA9ICBTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfR1BSUyArIDQKK1NQX1IyICAgICAgICA9ICBTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfR1BSUyArIDgKK1NQX1IzICAgICAgICA9ICBTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfR1BSUyArIDEyCitTUF9SNCAgICAgICAgPSAgU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX0dQUlMgKyAxNgorU1BfUjUgICAgICAgID0gIFNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9HUFJTICsgMjAKK1NQX1I2ICAgICAgICA9ICBTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfR1BSUyArIDI0CitTUF9SNyAgICAgICAgPSAgU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX0dQUlMgKyAyOAorU1BfUjggICAgICAgID0gIFNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9HUFJTICsgMzIKK1NQX1I5ICAgICAgICA9ICBTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfR1BSUyArIDM2CitTUF9SMTAgICAgICAgPSAgU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX0dQUlMgKyA0MAorU1BfUjExICAgICAgID0gIFNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9HUFJTICsgNDQKK1NQX1IxMiAgICAgICA9ICBTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfR1BSUyArIDQ4CitTUF9SMTMgICAgICAgPSAgU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX0dQUlMgKyA1MgorU1BfUjE0ICAgICAgID0gIFNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9HUFJTICsgNTYKK1NQX1IxNSAgICAgICA9ICBTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfR1BSUyArIDYwCitTUF9PUklHX1IyICAgPSAgU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX09SSUdfR1BSMgorU1BfSUxDICAgICAgID0gIFNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9JTEMKK1NQX1RSQVAgICAgICA9ICBTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfVFJBUAorU1BfU0laRSAgICAgID0gIFNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9TSVpFCisKK19USUZfV09SS19TVkMgPSAoX1RJRl9TSUdQRU5ESU5HIHwgX1RJRl9ORUVEX1JFU0NIRUQgfCBcCisJCSBfVElGX1JFU1RBUlRfU1ZDIHwgX1RJRl9TSU5HTEVfU1RFUCApCitfVElGX1dPUktfSU5UID0gKF9USUZfU0lHUEVORElORyB8IF9USUZfTkVFRF9SRVNDSEVEKQorCitTVEFDS19TSElGVCA9IFBBR0VfU0hJRlQgKyBUSFJFQURfT1JERVIKK1NUQUNLX1NJWkUgID0gMSA8PCBTVEFDS19TSElGVAorCisjZGVmaW5lIEJBU0VEKG5hbWUpIG5hbWUtc3lzdGVtX2NhbGwoJXIxMykKKworLyoKKyAqIFJlZ2lzdGVyIHVzYWdlIGluIGludGVycnVwdCBoYW5kbGVyczoKKyAqICAgIFI5ICAtIHBvaW50ZXIgdG8gY3VycmVudCB0YXNrIHN0cnVjdHVyZQorICogICAgUjEzIC0gcG9pbnRlciB0byBsaXRlcmFsIHBvb2wKKyAqICAgIFIxNCAtIHJldHVybiByZWdpc3RlciBmb3IgZnVuY3Rpb24gY2FsbHMKKyAqICAgIFIxNSAtIGtlcm5lbCBzdGFjayBwb2ludGVyCisgKi8KKworCS5tYWNybyAgU1RPUkVfVElNRVIgbGNfb2Zmc2V0CisjaWZkZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKKwlzdHB0CVxsY19vZmZzZXQKKyNlbmRpZgorCS5lbmRtCisKKyNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORworCS5tYWNybyAgVVBEQVRFX1ZUSU1FIGxjX2Zyb20sbGNfdG8sbGNfc3VtCisJbG0JJXIxMCwlcjExLFxsY19mcm9tCisJc2wJJXIxMCxcbGNfdG8KKwlzbAklcjExLFxsY190bys0CisJYmMJMyxCQVNFRCgwZikKKwlzbAklcjEwLEJBU0VEKC5MY18xKQorMDoJYWwJJXIxMCxcbGNfc3VtCisJYWwJJXIxMSxcbGNfc3VtKzQKKwliYwkxMixCQVNFRCgxZikKKwlhbAklcjEwLEJBU0VEKC5MY18xKQorMToJc3RtCSVyMTAsJXIxMSxcbGNfc3VtCisJLmVuZG0KKyNlbmRpZgorCisJLm1hY3JvCVNBVkVfQUxMX0JBU0Ugc2F2ZWFyZWEKKwlzdG0JJXIxMiwlcjE1LFxzYXZlYXJlYQorCWwJJXIxMyxfX0xDX1NWQ19ORVdfUFNXKzQJIyBsb2FkICZzeXN0ZW1fY2FsbCB0byAlcjEzCisJLmVuZG0KKworCS5tYWNybwlTQVZFX0FMTCBwc3dvcmcsc2F2ZWFyZWEsc3luYworCWxhCSVyMTIsXHBzd29yZworCS5pZglcc3luYworCXRtCVxwc3dvcmcrMSwweDAxCQkjIHRlc3QgcHJvYmxlbSBzdGF0ZSBiaXQKKwlieglCQVNFRCgyZikJCSMgc2tpcCBzdGFjayBzZXR1cCBzYXZlCisJbAklcjE1LF9fTENfS0VSTkVMX1NUQUNLCSMgcHJvYmxlbSBzdGF0ZSAtPiBsb2FkIGtzcAorCS5lbHNlCisJdG0JXHBzd29yZysxLDB4MDEJCSMgdGVzdCBwcm9ibGVtIHN0YXRlIGJpdAorCWJueglCQVNFRCgxZikJCSMgZnJvbSB1c2VyIC0+IGxvYWQgYXN5bmMgc3RhY2sKKwljbGMJXHBzd29yZys0KDQpLEJBU0VEKC5MY3JpdGljYWxfZW5kKQorCWJoZQlCQVNFRCgwZikKKwljbGMJXHBzd29yZys0KDQpLEJBU0VEKC5MY3JpdGljYWxfc3RhcnQpCisJYmwJQkFTRUQoMGYpCisJbAklcjE0LEJBU0VEKC5MY2xlYW51cF9jcml0aWNhbCkKKwliYXNyCSVyMTQsJXIxNAorCXRtCTAoJXIxMiksMHgwMQkJIyByZXRlc3QgcHJvYmxlbSBzdGF0ZSBhZnRlciBjbGVhbnVwCisJYm56CUJBU0VEKDFmKQorMDoJbAklcjE0LF9fTENfQVNZTkNfU1RBQ0sJIyBhcmUgd2UgYWxyZWFkeSBvbiB0aGUgYXN5bmMgc3RhY2sgPworCXNscgklcjE0LCVyMTUKKwlzcmEJJXIxNCxTVEFDS19TSElGVAorCWJlCUJBU0VEKDJmKQorMToJbAklcjE1LF9fTENfQVNZTkNfU1RBQ0sKKwkuZW5kaWYKKyNpZmRlZiBDT05GSUdfQ0hFQ0tfU1RBQ0sKKwliCUJBU0VEKDNmKQorMjoJdG1sCSVyMTUsU1RBQ0tfU0laRSAtIENPTkZJR19TVEFDS19HVUFSRAorCWJ6CUJBU0VEKHN0YWNrX292ZXJmbG93KQorMzoKKyNlbmRpZgorMjoJcwklcjE1LEJBU0VEKC5MY19zcHNpemUpCSMgbWFrZSByb29tIGZvciByZWdpc3RlcnMgJiBwc3cKKwltdmMJU1BfUFNXKDgsJXIxNSksMCglcjEyKQkjIG1vdmUgdXNlciBQU1cgdG8gc3RhY2sKKwlsYQklcjEyLFxwc3dvcmcKKwlzdAklcjIsU1BfT1JJR19SMiglcjE1KQkjIHN0b3JlIG9yaWdpbmFsIGNvbnRlbnQgb2YgZ3ByIDIKKwlpY20JJXIxMiwxMixfX0xDX1NWQ19JTEMKKwlzdG0JJXIwLCVyMTEsU1BfUjAoJXIxNSkJIyBzdG9yZSBncHJzICVyMC0lcjExIHRvIGtlcm5lbCBzdGFjaworCXN0CSVyMTIsU1BfSUxDKCVyMTUpCisJbXZjCVNQX1IxMigxNiwlcjE1KSxcc2F2ZWFyZWEgIyBtb3ZlICVyMTItJXIxNSB0byBzdGFjaworCWxhCSVyMTIsMAorCXN0CSVyMTIsX19TRl9CQUNLQ0hBSU4oJXIxNSkJIyBjbGVhciBiYWNrIGNoYWluCisJLmVuZG0KKworCS5tYWNybyAgUkVTVE9SRV9BTEwgc3luYworCW12YwlfX0xDX1JFVFVSTl9QU1coOCksU1BfUFNXKCVyMTUpICMgbW92ZSB1c2VyIFBTVyB0byBsb3djb3JlCisJLmlmICFcc3luYworCW5pCV9fTENfUkVUVVJOX1BTVysxLDB4ZmQJIyBjbGVhciB3YWl0IHN0YXRlIGJpdAorCS5lbmRpZgorCWxtCSVyMCwlcjE1LFNQX1IwKCVyMTUpCSMgbG9hZCBncHJzIDAtMTUgb2YgdXNlcgorCVNUT1JFX1RJTUVSIF9fTENfRVhJVF9USU1FUgorCWxwc3cJX19MQ19SRVRVUk5fUFNXCQkjIGJhY2sgdG8gY2FsbGVyCisJLmVuZG0KKworLyoKKyAqIFNjaGVkdWxlciByZXN1bWUgZnVuY3Rpb24sIGNhbGxlZCBieSBzd2l0Y2hfdG8KKyAqICBncHIyID0gKHRhc2tfc3RydWN0ICopIHByZXYKKyAqICBncHIzID0gKHRhc2tfc3RydWN0ICopIG5leHQKKyAqIFJldHVybnM6CisgKiAgZ3ByMiA9IHByZXYKKyAqLworICAgICAgICAuZ2xvYmwgIF9fc3dpdGNoX3RvCitfX3N3aXRjaF90bzoKKyAgICAgICAgYmFzciAgICAlcjEsMAorX19zd2l0Y2hfdG9fYmFzZToKKwl0bQlfX1RIUkVBRF9wZXIoJXIzKSwweGU4CQkjIG5ldyBwcm9jZXNzIGlzIHVzaW5nIHBlciA/CisJYnoJX19zd2l0Y2hfdG9fbm9wZXItX19zd2l0Y2hfdG9fYmFzZSglcjEpCSMgaWYgbm90IHdlJ3JlIGZpbmUKKyAgICAgICAgc3RjdGwgICAlYzksJWMxMSxfX1NGX0VNUFRZKCVyMTUpCSMgV2UgYXJlIHVzaW5nIHBlciBzdHVmZgorICAgICAgICBjbGMgICAgIF9fVEhSRUFEX3BlcigxMiwlcjMpLF9fU0ZfRU1QVFkoJXIxNSkKKyAgICAgICAgYmUgICAgICBfX3N3aXRjaF90b19ub3Blci1fX3N3aXRjaF90b19iYXNlKCVyMSkJIyB3ZSBnb3QgYXdheSB3L28gYmFzaGluZyBUTEIncworICAgICAgICBsY3RsICAgICVjOSwlYzExLF9fVEhSRUFEX3BlciglcjMpCSMgTm9wZSB3ZSBkaWRuJ3QKK19fc3dpdGNoX3RvX25vcGVyOgorICAgICAgICBzdG0gICAgICVyNiwlcjE1LF9fU0ZfR1BSUyglcjE1KSMgc3RvcmUgX19zd2l0Y2hfdG8gcmVnaXN0ZXJzIG9mIHByZXYgdGFzaworCXN0CSVyMTUsX19USFJFQURfa3NwKCVyMikJIyBzdG9yZSBrZXJuZWwgc3RhY2sgdG8gcHJldi0+dHNzLmtzcAorCWwJJXIxNSxfX1RIUkVBRF9rc3AoJXIzKQkjIGxvYWQga2VybmVsIHN0YWNrIGZyb20gbmV4dC0+dHNzLmtzcAorCWxtCSVyNiwlcjE1LF9fU0ZfR1BSUyglcjE1KSMgbG9hZCBfX3N3aXRjaF90byByZWdpc3RlcnMgb2YgbmV4dCB0YXNrCisJc3QJJXIzLF9fTENfQ1VSUkVOVAkjIF9fTENfQ1VSUkVOVCA9IGN1cnJlbnQgdGFzayBzdHJ1Y3QKKwlsY3RsCSVjNCwlYzQsX19UQVNLX3BpZCglcjMpICMgbG9hZCBwaWQgdG8gY29udHJvbCByZWcuIDQKKwlsCSVyMyxfX1RIUkVBRF9pbmZvKCVyMykgICMgbG9hZCB0aHJlYWRfaW5mbyBmcm9tIHRhc2sgc3RydWN0CisJc3QJJXIzLF9fTENfVEhSRUFEX0lORk8KKwlhaGkJJXIzLFNUQUNLX1NJWkUKKwlzdAklcjMsX19MQ19LRVJORUxfU1RBQ0sJIyBfX0xDX0tFUk5FTF9TVEFDSyA9IG5ldyBrZXJuZWwgc3RhY2sKKwlicgklcjE0CisKK19fY3JpdGljYWxfc3RhcnQ6CisvKgorICogU1ZDIGludGVycnVwdCBoYW5kbGVyIHJvdXRpbmUuIFN5c3RlbSBjYWxscyBhcmUgc3luY2hyb25vdXMgZXZlbnRzIGFuZAorICogYXJlIGV4ZWN1dGVkIHdpdGggaW50ZXJydXB0cyBlbmFibGVkLgorICovCisKKwkuZ2xvYmwgIHN5c3RlbV9jYWxsCitzeXN0ZW1fY2FsbDoKKwlTVE9SRV9USU1FUiBfX0xDX1NZTkNfRU5URVJfVElNRVIKK3N5c2Nfc2F2ZWFsbDoKKwlTQVZFX0FMTF9CQVNFIF9fTENfU0FWRV9BUkVBCisgICAgICAgIFNBVkVfQUxMIF9fTENfU1ZDX09MRF9QU1csX19MQ19TQVZFX0FSRUEsMQorCWxoCSVyNywweDhhCSAgIyBnZXQgc3ZjIG51bWJlciBmcm9tIGxvd2NvcmUKKyNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORworc3lzY192dGltZToKKwl0bQlTUF9QU1crMSglcjE1KSwweDAxCSMgaW50ZXJydXB0aW5nIGZyb20gdXNlciA/CisJYnoJQkFTRUQoc3lzY19kb19zdmMpCisJVVBEQVRFX1ZUSU1FIF9fTENfRVhJVF9USU1FUixfX0xDX1NZTkNfRU5URVJfVElNRVIsX19MQ19VU0VSX1RJTUVSCitzeXNjX3N0aW1lOgorCVVQREFURV9WVElNRSBfX0xDX0xBU1RfVVBEQVRFX1RJTUVSLF9fTENfRVhJVF9USU1FUixfX0xDX1NZU1RFTV9USU1FUgorc3lzY191cGRhdGU6CisJbXZjCV9fTENfTEFTVF9VUERBVEVfVElNRVIoOCksX19MQ19TWU5DX0VOVEVSX1RJTUVSCisjZW5kaWYKK3N5c2NfZG9fc3ZjOgorCWwJJXI5LF9fTENfVEhSRUFEX0lORk8JIyBsb2FkIHBvaW50ZXIgdG8gdGhyZWFkX2luZm8gc3RydWN0CisJc2xhCSVyNywyICAgICAgICAgICAgICMgKjQgYW5kIHRlc3QgZm9yIHN2YyAwCisJYm56CUJBU0VEKHN5c2NfbnJfb2spICMgc3ZjIG51bWJlciA+IDAKKwkjIHN2YyAwOiBzeXN0ZW0gY2FsbCBudW1iZXIgaW4gJXIxCisJY2wJJXIxLEJBU0VEKC5MbnJfc3lzY2FsbHMpCisJYm5sCUJBU0VEKHN5c2NfbnJfb2spCisJbHIJJXI3LCVyMSAgICAgICAgICAgIyBjb3B5IHN2YyBudW1iZXIgdG8gJXI3CisJc2xhCSVyNywyICAgICAgICAgICAgICMgKjQKK3N5c2NfbnJfb2s6CisJbXZjCVNQX0FSR1MoNCwlcjE1KSxTUF9SNyglcjE1KQorc3lzY19kb19yZXN0YXJ0OgorCXRtCV9fVElfZmxhZ3MrMyglcjkpLChfVElGX1NZU0NBTExfVFJBQ0V8X1RJRl9TWVNDQUxMX0FVRElUKQorICAgICAgICBsICAgICAgICVyOCxzeXNfY2FsbF90YWJsZS1zeXN0ZW1fY2FsbCglcjcsJXIxMykgIyBnZXQgc3lzdGVtIGNhbGwgYWRkci4KKyAgICAgICAgYm56ICAgICBCQVNFRChzeXNjX3RyYWNlc3lzKQorICAgICAgICBiYXNyICAgICVyMTQsJXI4ICAgICAgICAgICMgY2FsbCBzeXNfeHh4eAorICAgICAgICBzdCAgICAgICVyMixTUF9SMiglcjE1KSAgICMgc3RvcmUgcmV0dXJuIHZhbHVlIChjaGFuZ2UgUjIgb24gc3RhY2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBBVFRFTlRJT046IGNoZWNrIHN5c19leGVjdmVfZ2x1ZSBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNoYW5naW5nIGFueXRoaW5nIGhlcmUgISEKKworc3lzY19yZXR1cm46CisJdG0JU1BfUFNXKzEoJXIxNSksMHgwMQkjIHJldHVybmluZyB0byB1c2VyID8KKwlibm8JQkFTRUQoc3lzY19sZWF2ZSkKKwl0bQlfX1RJX2ZsYWdzKzMoJXI5KSxfVElGX1dPUktfU1ZDCisJYm56CUJBU0VEKHN5c2Nfd29yaykgICMgdGhlcmUgaXMgd29yayB0byBkbyAoc2lnbmFscyBldGMuKQorc3lzY19sZWF2ZToKKyAgICAgICAgUkVTVE9SRV9BTEwgMQorCisjCisjIHJlY2hlY2sgaWYgdGhlcmUgaXMgbW9yZSB3b3JrIHRvIGRvCisjCitzeXNjX3dvcmtfbG9vcDoKKwl0bQlfX1RJX2ZsYWdzKzMoJXI5KSxfVElGX1dPUktfU1ZDCisJYnoJQkFTRUQoc3lzY19sZWF2ZSkgICAgICAjIHRoZXJlIGlzIG5vIHdvcmsgdG8gZG8KKyMKKyMgT25lIG9mIHRoZSB3b3JrIGJpdHMgaXMgb24uIEZpbmQgb3V0IHdoaWNoIG9uZS4KKyMKK3N5c2Nfd29yazoKKwl0bQlfX1RJX2ZsYWdzKzMoJXI5KSxfVElGX05FRURfUkVTQ0hFRAorCWJvCUJBU0VEKHN5c2NfcmVzY2hlZHVsZSkKKwl0bQlfX1RJX2ZsYWdzKzMoJXI5KSxfVElGX1NJR1BFTkRJTkcKKwlibwlCQVNFRChzeXNjX3NpZ3BlbmRpbmcpCisJdG0JX19USV9mbGFncyszKCVyOSksX1RJRl9SRVNUQVJUX1NWQworCWJvCUJBU0VEKHN5c2NfcmVzdGFydCkKKwl0bQlfX1RJX2ZsYWdzKzMoJXI5KSxfVElGX1NJTkdMRV9TVEVQCisJYm8JQkFTRUQoc3lzY19zaW5nbGVzdGVwKQorCWIJQkFTRUQoc3lzY19sZWF2ZSkKKworIworIyBfVElGX05FRURfUkVTQ0hFRCBpcyBzZXQsIGNhbGwgc2NoZWR1bGUKKyMJCitzeXNjX3Jlc2NoZWR1bGU6ICAgICAgICAKKyAgICAgICAgbCAgICAgICAlcjEsQkFTRUQoLkxzY2hlZHVsZSkKKwlsYSAgICAgICVyMTQsQkFTRUQoc3lzY193b3JrX2xvb3ApCisJYnIgICAgICAlcjEJCSAgICAgICAjIGNhbGwgc2NoZWR1bGVyCisKKyMKKyMgX1RJRl9TSUdQRU5ESU5HIGlzIHNldCwgY2FsbCBkb19zaWduYWwKKyMKK3N5c2Nfc2lncGVuZGluZzogICAgIAorCW5pCV9fVElfZmxhZ3MrMyglcjkpLDI1NS1fVElGX1NJTkdMRV9TVEVQICMgY2xlYXIgVElGX1NJTkdMRV9TVEVQCisgICAgICAgIGxhICAgICAgJXIyLFNQX1BUUkVHUyglcjE1KSAgICAjIGxvYWQgcHRfcmVncworICAgICAgICBzciAgICAgICVyMywlcjMgICAgICAgICAgICAgICAgIyBjbGVhciAqb2xkc2V0CisgICAgICAgIGwgICAgICAgJXIxLEJBU0VEKC5MZG9fc2lnbmFsKQorCWJhc3IJJXIxNCwlcjEgICAgICAgICAgICAgICAjIGNhbGwgZG9fc2lnbmFsCisJdG0JX19USV9mbGFncyszKCVyOSksX1RJRl9SRVNUQVJUX1NWQworCWJvCUJBU0VEKHN5c2NfcmVzdGFydCkKKwl0bQlfX1RJX2ZsYWdzKzMoJXI5KSxfVElGX1NJTkdMRV9TVEVQCisJYm8JQkFTRUQoc3lzY19zaW5nbGVzdGVwKQorCWIJQkFTRUQoc3lzY19sZWF2ZSkgICAgICAjIG91dCBvZiBoZXJlLCBkbyBOT1QgcmVjaGVjaworCisjCisjIF9USUZfUkVTVEFSVF9TVkMgaXMgc2V0LCBzZXQgdXAgcmVnaXN0ZXJzIGFuZCByZXN0YXJ0IHN2YworIworc3lzY19yZXN0YXJ0OgorCW5pCV9fVElfZmxhZ3MrMyglcjkpLDI1NS1fVElGX1JFU1RBUlRfU1ZDICMgY2xlYXIgVElGX1JFU1RBUlRfU1ZDCisJbAklcjcsU1BfUjIoJXIxNSkgICAgICAgICMgbG9hZCBuZXcgc3ZjIG51bWJlcgorCXNsYQklcjcsMgorCW12YwlTUF9SMig0LCVyMTUpLFNQX09SSUdfUjIoJXIxNSkgIyByZXN0b3JlIGZpcnN0IGFyZ3VtZW50CisJbG0JJXIyLCVyNixTUF9SMiglcjE1KSAgICAjIGxvYWQgc3ZjIGFyZ3VtZW50cworCWIJQkFTRUQoc3lzY19kb19yZXN0YXJ0KSAjIHJlc3RhcnQgc3ZjCisKKyMKKyMgX1RJRl9TSU5HTEVfU1RFUCBpcyBzZXQsIGNhbGwgZG9fc2luZ2xlX3N0ZXAKKyMKK3N5c2Nfc2luZ2xlc3RlcDoKKwluaQlfX1RJX2ZsYWdzKzMoJXI5KSwyNTUtX1RJRl9TSU5HTEVfU1RFUCAjIGNsZWFyIFRJRl9TSU5HTEVfU1RFUAorCW12aQlTUF9UUkFQKzEoJXIxNSksMHgyOAkjIHNldCB0cmFwIGluZGljYXRpb24gdG8gcGdtIGNoZWNrCisJbGEJJXIyLFNQX1BUUkVHUyglcjE1KQkjIGFkZHJlc3Mgb2YgcmVnaXN0ZXItc2F2ZSBhcmVhCisJbAklcjEsQkFTRUQoLkxoYW5kbGVfcGVyKQkjIGxvYWQgYWRyLiBvZiBwZXIgaGFuZGxlcgorCWxhCSVyMTQsQkFTRUQoc3lzY19yZXR1cm4pCSMgbG9hZCBhZHIuIG9mIHN5c3RlbSByZXR1cm4KKwlicgklcjEJCQkjIGJyYW5jaCB0byBkb19zaW5nbGVfc3RlcAorCitfX2NyaXRpY2FsX2VuZDoKKworIworIyBjYWxsIHRyYWNlIGJlZm9yZSBhbmQgYWZ0ZXIgc3lzX2NhbGwKKyMKK3N5c2NfdHJhY2VzeXM6CisgICAgICAgIGwgICAgICAgJXIxLEJBU0VEKC5MdHJhY2UpCisJbGEJJXIyLFNQX1BUUkVHUyglcjE1KSAgICAjIGxvYWQgcHRfcmVncworCWxhCSVyMywwCisJc3JsCSVyNywyCisJc3QJJXI3LFNQX1IyKCVyMTUpCisJYmFzcgklcjE0LCVyMQorCWNsYwlTUF9SMig0LCVyMTUpLEJBU0VEKC5MbnJfc3lzY2FsbHMpCisJYm5sCUJBU0VEKHN5c2NfdHJhY2Vub2dvKQorCWwJJXI3LFNQX1IyKCVyMTUpICAgICAgICAjIHN0cmFjZSBtaWdodCBoYXZlIGNoYW5nZWQgdGhlIAorCXNsbAklcjcsMiAgICAgICAgICAgICAgICAgICMgIHN5c3RlbSBjYWxsCisJbAklcjgsc3lzX2NhbGxfdGFibGUtc3lzdGVtX2NhbGwoJXI3LCVyMTMpCitzeXNjX3RyYWNlZ286CisJbG0JJXIzLCVyNixTUF9SMyglcjE1KQorCWwJJXIyLFNQX09SSUdfUjIoJXIxNSkKKwliYXNyCSVyMTQsJXI4ICAgICAgICAgICMgY2FsbCBzeXNfeHh4CisJc3QJJXIyLFNQX1IyKCVyMTUpICAgIyBzdG9yZSByZXR1cm4gdmFsdWUKK3N5c2NfdHJhY2Vub2dvOgorCXRtCV9fVElfZmxhZ3MrMyglcjkpLChfVElGX1NZU0NBTExfVFJBQ0V8X1RJRl9TWVNDQUxMX0FVRElUKQorICAgICAgICBieiAgICAgIEJBU0VEKHN5c2NfcmV0dXJuKQorCWwJJXIxLEJBU0VEKC5MdHJhY2UpCisJbGEJJXIyLFNQX1BUUkVHUyglcjE1KSAgICAjIGxvYWQgcHRfcmVncworCWxhCSVyMywxCisJbGEJJXIxNCxCQVNFRChzeXNjX3JldHVybikKKwlicgklcjEKKworIworIyBhIG5ldyBwcm9jZXNzIGV4aXRzIHRoZSBrZXJuZWwgd2l0aCByZXRfZnJvbV9mb3JrCisjCisgICAgICAgIC5nbG9ibCAgcmV0X2Zyb21fZm9yaworcmV0X2Zyb21fZm9yazoKKwlsCSVyMTMsX19MQ19TVkNfTkVXX1BTVys0CisJbAklcjksX19MQ19USFJFQURfSU5GTwkjIGxvYWQgcG9pbnRlciB0byB0aHJlYWRfaW5mbyBzdHJ1Y3QKKwl0bQlTUF9QU1crMSglcjE1KSwweDAxCSMgZm9ya2luZyBhIGtlcm5lbCB0aHJlYWQgPworCWJvCUJBU0VEKDBmKQorCXN0CSVyMTUsU1BfUjE1KCVyMTUpCSMgc3RvcmUgc3RhY2sgcG9pbnRlciBmb3IgbmV3IGt0aHJlYWQKKzA6CWwgICAgICAgJXIxLEJBU0VEKC5Mc2NoZWR0YWlsKQorCWJhc3IgICAgJXIxNCwlcjEKKyAgICAgICAgc3Rvc20gICBfX1NGX0VNUFRZKCVyMTUpLDB4MDMgICAgICMgcmVlbmFibGUgaW50ZXJydXB0cworCWIJQkFTRUQoc3lzY19yZXR1cm4pCisKKyMKKyMgY2xvbmUsIGZvcmssIHZmb3JrLCBleGVjIGFuZCBzaWdyZXR1cm4gbmVlZCBnbHVlLAorIyBiZWNhdXNlIHRoZXkgYWxsIGV4cGVjdCBwdF9yZWdzIGFzIHBhcmFtZXRlciwKKyMgYnV0IGFyZSBjYWxsZWQgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVyLgorIyByZXR1cm4tYWRkcmVzcyBpcyBzZXQgdXAgYWJvdmUKKyMKK3N5c19jbG9uZV9nbHVlOiAKKyAgICAgICAgbGEgICAgICAlcjIsU1BfUFRSRUdTKCVyMTUpICAgICMgbG9hZCBwdF9yZWdzCisgICAgICAgIGwgICAgICAgJXIxLEJBU0VEKC5MY2xvbmUpCisgICAgICAgIGJyICAgICAgJXIxICAgICAgICAgICAgICAgICAgICMgYnJhbmNoIHRvIHN5c19jbG9uZQorCitzeXNfZm9ya19nbHVlOiAgCisgICAgICAgIGxhICAgICAgJXIyLFNQX1BUUkVHUyglcjE1KSAgICAjIGxvYWQgcHRfcmVncworICAgICAgICBsICAgICAgICVyMSxCQVNFRCguTGZvcmspCisgICAgICAgIGJyICAgICAgJXIxICAgICAgICAgICAgICAgICAgICMgYnJhbmNoIHRvIHN5c19mb3JrCisKK3N5c192Zm9ya19nbHVlOiAKKyAgICAgICAgbGEgICAgICAlcjIsU1BfUFRSRUdTKCVyMTUpICAgICMgbG9hZCBwdF9yZWdzCisgICAgICAgIGwgICAgICAgJXIxLEJBU0VEKC5MdmZvcmspCisgICAgICAgIGJyICAgICAgJXIxICAgICAgICAgICAgICAgICAgICMgYnJhbmNoIHRvIHN5c192Zm9yaworCitzeXNfZXhlY3ZlX2dsdWU6ICAgICAgICAKKyAgICAgICAgbGEgICAgICAlcjIsU1BfUFRSRUdTKCVyMTUpICAgIyBsb2FkIHB0X3JlZ3MKKyAgICAgICAgbCAgICAgICAlcjEsQkFTRUQoLkxleGVjdmUpCisJbHIgICAgICAlcjEyLCVyMTQgICAgICAgICAgICAgIyBzYXZlIHJldHVybiBhZGRyZXNzCisgICAgICAgIGJhc3IgICAgJXIxNCwlcjEgICAgICAgICAgICAgICMgY2FsbCBzeXNfZXhlY3ZlCisgICAgICAgIGx0ciAgICAgJXIyLCVyMiAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZXhlY3ZlIGZhaWxlZAorICAgICAgICBibnogICAgIDAoJXIxMikgICAgICAgICAgICAgICAjIGl0IGRpZCBmYWlsIC0+IHN0b3JlIHJlc3VsdCBpbiBncHIyCisgICAgICAgIGIgICAgICAgNCglcjEyKSAgICAgICAgICAgICAgICMgU0tJUCBTVCAyLFNQX1IyKDE1KSBhZnRlciBCQVNSIDE0LDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiBzeXN0ZW1fY2FsbC9zeXNjX3RyYWNlc3lzCisKK3N5c19zaWdyZXR1cm5fZ2x1ZTogICAgIAorICAgICAgICBsYSAgICAgICVyMixTUF9QVFJFR1MoJXIxNSkgICAjIGxvYWQgcHRfcmVncyBhcyBwYXJhbWV0ZXIKKyAgICAgICAgbCAgICAgICAlcjEsQkFTRUQoLkxzaWdyZXR1cm4pCisgICAgICAgIGJyICAgICAgJXIxICAgICAgICAgICAgICAgICAgICMgYnJhbmNoIHRvIHN5c19zaWdyZXR1cm4KKworc3lzX3J0X3NpZ3JldHVybl9nbHVlOiAgICAgCisgICAgICAgIGxhICAgICAgJXIyLFNQX1BUUkVHUyglcjE1KSAgICMgbG9hZCBwdF9yZWdzIGFzIHBhcmFtZXRlcgorICAgICAgICBsICAgICAgICVyMSxCQVNFRCguTHJ0X3NpZ3JldHVybikKKyAgICAgICAgYnIgICAgICAlcjEgICAgICAgICAgICAgICAgICAgIyBicmFuY2ggdG8gc3lzX3NpZ3JldHVybgorCisjCisjIHNpZ3N1c3BlbmQgYW5kIHJ0X3NpZ3N1c3BlbmQgbmVlZCBwdF9yZWdzIGFzIGFuIGFkZGl0aW9uYWwKKyMgcGFyYW1ldGVyIGFuZCB0aGV5IGhhdmUgdG8gc2tpcCB0aGUgc3RvcmUgb2YgJXIyIGludG8gdGhlCisjIHVzZXIgcmVnaXN0ZXIgJXIyIGJlY2F1c2UgdGhlIHJldHVybiB2YWx1ZSB3YXMgc2V0IGluIAorIyBzaWdzdXNwZW5kIGFuZCBydF9zaWdzdXNwZW5kIGFscmVhZHkgYW5kIG11c3Qgbm90IGJlIG92ZXJ3cml0dGVuIQorIworCitzeXNfc2lnc3VzcGVuZF9nbHVlOiAgICAKKyAgICAgICAgbHIgICAgICAlcjUsJXI0ICAgICAgICAgICAgICAgIyBtb3ZlIG1hc2sgYmFjaworICAgICAgICBsciAgICAgICVyNCwlcjMgICAgICAgICAgICAgICAjIG1vdmUgaGlzdG9yeTEgcGFyYW1ldGVyCisgICAgICAgIGxyICAgICAgJXIzLCVyMiAgICAgICAgICAgICAgICMgbW92ZSBoaXN0b3J5MCBwYXJhbWV0ZXIKKyAgICAgICAgbGEgICAgICAlcjIsU1BfUFRSRUdTKCVyMTUpICAgIyBsb2FkIHB0X3JlZ3MgYXMgZmlyc3QgcGFyYW1ldGVyCisgICAgICAgIGwgICAgICAgJXIxLEJBU0VEKC5Mc2lnc3VzcGVuZCkKKwlsYSAgICAgICVyMTQsNCglcjE0KSAgICAgICAgICAjIHNraXAgc3RvcmUgb2YgcmV0dXJuIHZhbHVlCisgICAgICAgIGJyICAgICAgJXIxICAgICAgICAgICAgICAgICAgICMgYnJhbmNoIHRvIHN5c19zaWdzdXNwZW5kCisKK3N5c19ydF9zaWdzdXNwZW5kX2dsdWU6IAorICAgICAgICBsciAgICAgICVyNCwlcjMgICAgICAgICAgICAgICAjIG1vdmUgc2lnc2V0c2l6ZSBwYXJhbWV0ZXIKKyAgICAgICAgbHIgICAgICAlcjMsJXIyICAgICAgICAgICAgICAgIyBtb3ZlIHVuZXdzZXQgcGFyYW1ldGVyCisgICAgICAgIGxhICAgICAgJXIyLFNQX1BUUkVHUyglcjE1KSAgICMgbG9hZCBwdF9yZWdzIGFzIGZpcnN0IHBhcmFtZXRlcgorICAgICAgICBsICAgICAgICVyMSxCQVNFRCguTHJ0X3NpZ3N1c3BlbmQpCisJbGEgICAgICAlcjE0LDQoJXIxNCkgICAgICAgICAgIyBza2lwIHN0b3JlIG9mIHJldHVybiB2YWx1ZQorICAgICAgICBiciAgICAgICVyMSAgICAgICAgICAgICAgICAgICAjIGJyYW5jaCB0byBzeXNfcnRfc2lnc3VzcGVuZAorCitzeXNfc2lnYWx0c3RhY2tfZ2x1ZToKKyAgICAgICAgbGEgICAgICAlcjQsU1BfUFRSRUdTKCVyMTUpICAgIyBsb2FkIHB0X3JlZ3MgYXMgcGFyYW1ldGVyCisgICAgICAgIGwgICAgICAgJXIxLEJBU0VEKC5Mc2lnYWx0c3RhY2spCisgICAgICAgIGJyICAgICAgJXIxICAgICAgICAgICAgICAgICAgICMgYnJhbmNoIHRvIHN5c19zaWdyZXR1cm4KKworCisvKgorICogUHJvZ3JhbSBjaGVjayBoYW5kbGVyIHJvdXRpbmUKKyAqLworCisgICAgICAgIC5nbG9ibCAgcGdtX2NoZWNrX2hhbmRsZXIKK3BnbV9jaGVja19oYW5kbGVyOgorLyoKKyAqIEZpcnN0IHdlIG5lZWQgdG8gY2hlY2sgZm9yIGEgc3BlY2lhbCBjYXNlOgorICogU2luZ2xlIHN0ZXBwaW5nIGFuIGluc3RydWN0aW9uIHRoYXQgZGlzYWJsZXMgdGhlIFBFUiBldmVudCBtYXNrIHdpbGwKKyAqIGNhdXNlIGEgUEVSIGV2ZW50IEFGVEVSIHRoZSBtYXNrIGhhcyBiZWVuIHNldC4gRXhhbXBsZTogU1ZDIG9yIExQU1cuCisgKiBGb3IgYSBzaW5nbGUgc3RlcHBlZCBTVkMgdGhlIHByb2dyYW0gY2hlY2sgaGFuZGxlciBnZXRzIGNvbnRyb2wgYWZ0ZXIKKyAqIHRoZSBTVkMgbmV3IFBTVyBoYXMgYmVlbiBsb2FkZWQuIEJ1dCB3ZSB3YW50IHRvIGV4ZWN1dGUgdGhlIFNWQyBmaXJzdCBhbmQKKyAqIHRoZW4gaGFuZGxlIHRoZSBQRVIgZXZlbnQuIFRoZXJlZm9yZSB3ZSB1cGRhdGUgdGhlIFNWQyBvbGQgUFNXIHRvIHBvaW50CisgKiB0byB0aGUgcGdtX2NoZWNrX2hhbmRsZXIgYW5kIGJyYW5jaCB0byB0aGUgU1ZDIGhhbmRsZXIgYWZ0ZXIgd2UgY2hlY2tlZAorICogaWYgd2UgaGF2ZSB0byBsb2FkIHRoZSBrZXJuZWwgc3RhY2sgcmVnaXN0ZXIuCisgKiBGb3IgZXZlcnkgb3RoZXIgcG9zc2libGUgY2F1c2UgZm9yIFBFUiBldmVudCB3aXRob3V0IHRoZSBQRVIgbWFzayBzZXQKKyAqIHdlIGp1c3QgaWdub3JlIHRoZSBQRVIgZXZlbnQgKEZJWE1FOiBpcyB0aGVyZSBhbnl0aGluZyB3ZSBoYXZlIHRvIGRvCisgKiBmb3IgTFBTVz8pLgorICovCisJU1RPUkVfVElNRVIgX19MQ19TWU5DX0VOVEVSX1RJTUVSCisJU0FWRV9BTExfQkFTRSBfX0xDX1NBVkVfQVJFQQorICAgICAgICB0bSAgICAgIF9fTENfUEdNX0lOVF9DT0RFKzEsMHg4MCAjIGNoZWNrIHdoZXRoZXIgd2UgZ290IGEgcGVyIGV4Y2VwdGlvbgorICAgICAgICBibnogICAgIEJBU0VEKHBnbV9wZXIpICAgICAgICAgICAjIGdvdCBwZXIgZXhjZXB0aW9uIC0+IHNwZWNpYWwgY2FzZQorCVNBVkVfQUxMIF9fTENfUEdNX09MRF9QU1csX19MQ19TQVZFX0FSRUEsMQorI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCisJdG0JU1BfUFNXKzEoJXIxNSksMHgwMQkjIGludGVycnVwdGluZyBmcm9tIHVzZXIgPworCWJ6CUJBU0VEKHBnbV9ub192dGltZSkKKwlVUERBVEVfVlRJTUUgX19MQ19FWElUX1RJTUVSLF9fTENfU1lOQ19FTlRFUl9USU1FUixfX0xDX1VTRVJfVElNRVIKKwlVUERBVEVfVlRJTUUgX19MQ19MQVNUX1VQREFURV9USU1FUixfX0xDX0VYSVRfVElNRVIsX19MQ19TWVNURU1fVElNRVIKKwltdmMJX19MQ19MQVNUX1VQREFURV9USU1FUig4KSxfX0xDX1NZTkNfRU5URVJfVElNRVIKK3BnbV9ub192dGltZToKKyNlbmRpZgorCWwJJXI5LF9fTENfVEhSRUFEX0lORk8JIyBsb2FkIHBvaW50ZXIgdG8gdGhyZWFkX2luZm8gc3RydWN0CisgICAgICAgIGwgICAgICAgJXIzLF9fTENfUEdNX0lMQyAgICAgICAgICMgbG9hZCBwcm9ncmFtIGludGVycnVwdGlvbiBjb2RlCisJbGEJJXI4LDB4N2YKKwlucgklcjgsJXIzCitwZ21fZG9fY2FsbDoKKyAgICAgICAgbCAgICAgICAlcjcsQkFTRUQoLkxqdW1wX3RhYmxlKQorICAgICAgICBzbGwgICAgICVyOCwyCisgICAgICAgIGwgICAgICAgJXI3LDAoJXI4LCVyNykJCSAjIGxvYWQgYWRkcmVzcyBvZiBoYW5kbGVyIHJvdXRpbmUKKyAgICAgICAgbGEgICAgICAlcjIsU1BfUFRSRUdTKCVyMTUpCSAjIGFkZHJlc3Mgb2YgcmVnaXN0ZXItc2F2ZSBhcmVhCisJbGEgICAgICAlcjE0LEJBU0VEKHN5c2NfcmV0dXJuKQorCWJyICAgICAgJXI3CQkJICMgYnJhbmNoIHRvIGludGVycnVwdC1oYW5kbGVyCisKKyMKKyMgaGFuZGxlIHBlciBleGNlcHRpb24KKyMKK3BnbV9wZXI6CisgICAgICAgIHRtICAgICAgX19MQ19QR01fT0xEX1BTVywweDQwICAgICMgdGVzdCBpZiBwZXIgZXZlbnQgcmVjb3JkaW5nIGlzIG9uCisgICAgICAgIGJueiAgICAgQkFTRUQocGdtX3Blcl9zdGQpICAgICAgICMgb2ssIG5vcm1hbCBwZXIgZXZlbnQgZnJvbSB1c2VyIHNwYWNlCisjIG9rIGl0cyBvbmUgb2YgdGhlIHNwZWNpYWwgY2FzZXMsIG5vdyB3ZSBuZWVkIHRvIGZpbmQgb3V0IHdoaWNoIG9uZQorICAgICAgICBjbGMgICAgIF9fTENfUEdNX09MRF9QU1coOCksX19MQ19TVkNfTkVXX1BTVworICAgICAgICBiZSAgICAgIEJBU0VEKHBnbV9zdmNwZXIpCisjIG5vIGludGVyZXN0aW5nIHNwZWNpYWwgY2FzZSwgaWdub3JlIFBFUiBldmVudAorICAgICAgICBsbSAgICAgICVyMTIsJXIxNSxfX0xDX1NBVkVfQVJFQQorCWxwc3cgICAgMHgyOAorCisjCisjIE5vcm1hbCBwZXIgZXhjZXB0aW9uCisjCitwZ21fcGVyX3N0ZDoKKwlTQVZFX0FMTCBfX0xDX1BHTV9PTERfUFNXLF9fTENfU0FWRV9BUkVBLDEKKyNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORworCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyBpbnRlcnJ1cHRpbmcgZnJvbSB1c2VyID8KKwlieglCQVNFRChwZ21fbm9fdnRpbWUyKQorCVVQREFURV9WVElNRSBfX0xDX0VYSVRfVElNRVIsX19MQ19TWU5DX0VOVEVSX1RJTUVSLF9fTENfVVNFUl9USU1FUgorCVVQREFURV9WVElNRSBfX0xDX0xBU1RfVVBEQVRFX1RJTUVSLF9fTENfRVhJVF9USU1FUixfX0xDX1NZU1RFTV9USU1FUgorCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLF9fTENfU1lOQ19FTlRFUl9USU1FUgorcGdtX25vX3Z0aW1lMjoKKyNlbmRpZgorCWwJJXI5LF9fTENfVEhSRUFEX0lORk8JIyBsb2FkIHBvaW50ZXIgdG8gdGhyZWFkX2luZm8gc3RydWN0CisJbAklcjEsX19USV90YXNrKCVyOSkKKwltdmMJX19USFJFQURfcGVyK19fUEVSX2F0bWlkKDIsJXIxKSxfX0xDX1BFUl9BVE1JRAorCW12YwlfX1RIUkVBRF9wZXIrX19QRVJfYWRkcmVzcyg0LCVyMSksX19MQ19QRVJfQUREUkVTUworCW12YwlfX1RIUkVBRF9wZXIrX19QRVJfYWNjZXNzX2lkKDEsJXIxKSxfX0xDX1BFUl9BQ0NFU1NfSUQKKwlvaQlfX1RJX2ZsYWdzKzMoJXI5KSxfVElGX1NJTkdMRV9TVEVQICMgc2V0IFRJRl9TSU5HTEVfU1RFUAorCWwJJXIzLF9fTENfUEdNX0lMQwkgIyBsb2FkIHByb2dyYW0gaW50ZXJydXB0aW9uIGNvZGUKKwlsYQklcjgsMHg3ZgorCW5yCSVyOCwlcjMgICAgICAgICAgICAgICAgICAjIGNsZWFyIHBlci1ldmVudC1iaXQgYW5kIGlsYworCWJlCUJBU0VEKHN5c2NfcmV0dXJuKSAgICAgICAjIG9ubHkgcGVyIG9yIHBlcitjaGVjayA/CisJYglCQVNFRChwZ21fZG9fY2FsbCkKKworIworIyBpdCB3YXMgYSBzaW5nbGUgc3RlcHBlZCBTVkMgdGhhdCBpcyBjYXVzaW5nIGFsbCB0aGUgdHJvdWJsZQorIworcGdtX3N2Y3BlcjoKKwlTQVZFX0FMTCBfX0xDX1NWQ19PTERfUFNXLF9fTENfU0FWRV9BUkVBLDEKKyNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORworCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyBpbnRlcnJ1cHRpbmcgZnJvbSB1c2VyID8KKwlieglCQVNFRChwZ21fbm9fdnRpbWUzKQorCVVQREFURV9WVElNRSBfX0xDX0VYSVRfVElNRVIsX19MQ19TWU5DX0VOVEVSX1RJTUVSLF9fTENfVVNFUl9USU1FUgorCVVQREFURV9WVElNRSBfX0xDX0xBU1RfVVBEQVRFX1RJTUVSLF9fTENfRVhJVF9USU1FUixfX0xDX1NZU1RFTV9USU1FUgorCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLF9fTENfU1lOQ19FTlRFUl9USU1FUgorcGdtX25vX3Z0aW1lMzoKKyNlbmRpZgorCWxoCSVyNywweDhhCQkjIGdldCBzdmMgbnVtYmVyIGZyb20gbG93Y29yZQorCWwJJXI5LF9fTENfVEhSRUFEX0lORk8JIyBsb2FkIHBvaW50ZXIgdG8gdGhyZWFkX2luZm8gc3RydWN0CisJbAklcjEsX19USV90YXNrKCVyOSkKKwltdmMJX19USFJFQURfcGVyK19fUEVSX2F0bWlkKDIsJXIxKSxfX0xDX1BFUl9BVE1JRAorCW12YwlfX1RIUkVBRF9wZXIrX19QRVJfYWRkcmVzcyg0LCVyMSksX19MQ19QRVJfQUREUkVTUworCW12YwlfX1RIUkVBRF9wZXIrX19QRVJfYWNjZXNzX2lkKDEsJXIxKSxfX0xDX1BFUl9BQ0NFU1NfSUQKKwlvaQlfX1RJX2ZsYWdzKzMoJXI5KSxfVElGX1NJTkdMRV9TVEVQICMgc2V0IFRJRl9TSU5HTEVfU1RFUAorCXN0b3NtCV9fU0ZfRU1QVFkoJXIxNSksMHgwMwkjIHJlZW5hYmxlIGludGVycnVwdHMKKwliCUJBU0VEKHN5c2NfZG9fc3ZjKQorCisvKgorICogSU8gaW50ZXJydXB0IGhhbmRsZXIgcm91dGluZQorICovCisKKyAgICAgICAgLmdsb2JsIGlvX2ludF9oYW5kbGVyCitpb19pbnRfaGFuZGxlcjoKKwlTVE9SRV9USU1FUiBfX0xDX0FTWU5DX0VOVEVSX1RJTUVSCisJc3RjawlfX0xDX0lOVF9DTE9DSworCVNBVkVfQUxMX0JBU0UgX19MQ19TQVZFX0FSRUErMTYKKyAgICAgICAgU0FWRV9BTEwgX19MQ19JT19PTERfUFNXLF9fTENfU0FWRV9BUkVBKzE2LDAKKyNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORworCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyBpbnRlcnJ1cHRpbmcgZnJvbSB1c2VyID8KKwlieglCQVNFRChpb19ub192dGltZSkKKwlVUERBVEVfVlRJTUUgX19MQ19FWElUX1RJTUVSLF9fTENfQVNZTkNfRU5URVJfVElNRVIsX19MQ19VU0VSX1RJTUVSCisJVVBEQVRFX1ZUSU1FIF9fTENfTEFTVF9VUERBVEVfVElNRVIsX19MQ19FWElUX1RJTUVSLF9fTENfU1lTVEVNX1RJTUVSCisJbXZjCV9fTENfTEFTVF9VUERBVEVfVElNRVIoOCksX19MQ19BU1lOQ19FTlRFUl9USU1FUgoraW9fbm9fdnRpbWU6CisjZW5kaWYKKwlsCSVyOSxfX0xDX1RIUkVBRF9JTkZPCSMgbG9hZCBwb2ludGVyIHRvIHRocmVhZF9pbmZvIHN0cnVjdAorICAgICAgICBsICAgICAgICVyMSxCQVNFRCguTGRvX0lSUSkgICAgICAgICMgbG9hZCBhZGRyZXNzIG9mIGRvX0lSUQorICAgICAgICBsYSAgICAgICVyMixTUF9QVFJFR1MoJXIxNSkgIyBhZGRyZXNzIG9mIHJlZ2lzdGVyLXNhdmUgYXJlYQorICAgICAgICBiYXNyICAgICVyMTQsJXIxICAgICAgICAgICMgYnJhbmNoIHRvIHN0YW5kYXJkIGlycSBoYW5kbGVyCisKK2lvX3JldHVybjoKKyAgICAgICAgdG0gICAgICBTUF9QU1crMSglcjE1KSwweDAxICAgICMgcmV0dXJuaW5nIHRvIHVzZXIgPworI2lmZGVmIENPTkZJR19QUkVFTVBUCisJYm5vICAgICBCQVNFRChpb19wcmVlbXB0KSAgICAgICMgbm8gLT4gY2hlY2sgZm9yIHByZWVtcHRpdmUgc2NoZWR1bGluZworI2Vsc2UKKyAgICAgICAgYm5vICAgICBCQVNFRChpb19sZWF2ZSkgICAgICAgICMgbm8tPiBza2lwIHJlc2NoZWQgJiBzaWduYWwKKyNlbmRpZgorCXRtCV9fVElfZmxhZ3MrMyglcjkpLF9USUZfV09SS19JTlQKKwlibnoJQkFTRUQoaW9fd29yaykgICAgICAgICAjIHRoZXJlIGlzIHdvcmsgdG8gZG8gKHNpZ25hbHMgZXRjLikKK2lvX2xlYXZlOgorICAgICAgICBSRVNUT1JFX0FMTCAwCisKKyNpZmRlZiBDT05GSUdfUFJFRU1QVAoraW9fcHJlZW1wdDoKKwlpY20JJXIwLDE1LF9fVElfcHJlY291bnQoJXI5KQorCWJueiAgICAgQkFTRUQoaW9fbGVhdmUpCisJbAklcjEsU1BfUjE1KCVyMTUpCisJcwklcjEsQkFTRUQoLkxjX3Nwc2l6ZSkKKwltdmMJU1BfUFRSRUdTKF9fUFRfU0laRSwlcjEpLFNQX1BUUkVHUyglcjE1KQorICAgICAgICB4YyAgICAgIF9fU0ZfQkFDS0NIQUlOKDQsJXIxKSxfX1NGX0JBQ0tDSEFJTiglcjEpICMgY2xlYXIgYmFjayBjaGFpbgorCWxyCSVyMTUsJXIxCitpb19yZXN1bWVfbG9vcDoKKwl0bQlfX1RJX2ZsYWdzKzMoJXI5KSxfVElGX05FRURfUkVTQ0hFRAorCWJubwlCQVNFRChpb19sZWF2ZSkKKwltdmMgICAgIF9fVElfcHJlY291bnQoNCwlcjkpLEJBU0VEKC5MY19wYWN0aXZlKQorICAgICAgICBzdG9zbSAgIF9fU0ZfRU1QVFkoJXIxNSksMHgwMyAgIyByZWVuYWJsZSBpbnRlcnJ1cHRzCisgICAgICAgIGwgICAgICAgJXIxLEJBU0VEKC5Mc2NoZWR1bGUpCisJYmFzcgklcjE0LCVyMQkgICAgICAgIyBjYWxsIHNjaGVkdWxlCisgICAgICAgIHN0bnNtICAgX19TRl9FTVBUWSglcjE1KSwweGZjICAjIGRpc2FibGUgSS9PIGFuZCBleHQuIGludGVycnVwdHMKKwl4YyAgICAgIF9fVElfcHJlY291bnQoNCwlcjkpLF9fVElfcHJlY291bnQoJXI5KQorCWIJQkFTRUQoaW9fcmVzdW1lX2xvb3ApCisjZW5kaWYKKworIworIyBzd2l0Y2ggdG8ga2VybmVsIHN0YWNrLCB0aGVuIGNoZWNrIHRoZSBUSUYgYml0cworIworaW9fd29yazoKKwlsCSVyMSxfX0xDX0tFUk5FTF9TVEFDSworCXMJJXIxLEJBU0VEKC5MY19zcHNpemUpCisJbXZjCVNQX1BUUkVHUyhfX1BUX1NJWkUsJXIxKSxTUF9QVFJFR1MoJXIxNSkKKyAgICAgICAgeGMgICAgICBfX1NGX0JBQ0tDSEFJTig0LCVyMSksX19TRl9CQUNLQ0hBSU4oJXIxKSAjIGNsZWFyIGJhY2sgY2hhaW4KKwlscgklcjE1LCVyMQorIworIyBPbmUgb2YgdGhlIHdvcmsgYml0cyBpcyBvbi4gRmluZCBvdXQgd2hpY2ggb25lLgorIyBDaGVja2VkIGFyZTogX1RJRl9TSUdQRU5ESU5HIGFuZCBfVElGX05FRURfUkVTQ0hFRAorIworaW9fd29ya19sb29wOgorCXRtCV9fVElfZmxhZ3MrMyglcjkpLF9USUZfTkVFRF9SRVNDSEVECisJYm8JQkFTRUQoaW9fcmVzY2hlZHVsZSkKKwl0bQlfX1RJX2ZsYWdzKzMoJXI5KSxfVElGX1NJR1BFTkRJTkcKKwlibwlCQVNFRChpb19zaWdwZW5kaW5nKQorCWIJQkFTRUQoaW9fbGVhdmUpCisKKyMKKyMgX1RJRl9ORUVEX1JFU0NIRUQgaXMgc2V0LCBjYWxsIHNjaGVkdWxlCisjCQoraW9fcmVzY2hlZHVsZTogICAgICAgIAorICAgICAgICBsICAgICAgICVyMSxCQVNFRCguTHNjaGVkdWxlKQorICAgICAgICBzdG9zbSAgIF9fU0ZfRU1QVFkoJXIxNSksMHgwMyAgIyByZWVuYWJsZSBpbnRlcnJ1cHRzCisJYmFzciAgICAlcjE0LCVyMQkgICAgICAgIyBjYWxsIHNjaGVkdWxlcgorICAgICAgICBzdG5zbSAgIF9fU0ZfRU1QVFkoJXIxNSksMHhmYyAgIyBkaXNhYmxlIEkvTyBhbmQgZXh0LiBpbnRlcnJ1cHRzCisJdG0JX19USV9mbGFncyszKCVyOSksX1RJRl9XT1JLX0lOVAorCWJ6CUJBU0VEKGlvX2xlYXZlKSAgICAgICAgIyB0aGVyZSBpcyBubyB3b3JrIHRvIGRvCisJYglCQVNFRChpb193b3JrX2xvb3ApCisKKyMKKyMgX1RJRl9TSUdQRU5ESU5HIGlzIHNldCwgY2FsbCBkb19zaWduYWwKKyMKK2lvX3NpZ3BlbmRpbmc6ICAgICAKKyAgICAgICAgc3Rvc20gICBfX1NGX0VNUFRZKCVyMTUpLDB4MDMgICMgcmVlbmFibGUgaW50ZXJydXB0cworICAgICAgICBsYSAgICAgICVyMixTUF9QVFJFR1MoJXIxNSkgICAgIyBsb2FkIHB0X3JlZ3MKKyAgICAgICAgc3IgICAgICAlcjMsJXIzICAgICAgICAgICAgICAgICMgY2xlYXIgKm9sZHNldAorICAgICAgICBsICAgICAgICVyMSxCQVNFRCguTGRvX3NpZ25hbCkKKwliYXNyICAgICVyMTQsJXIxCSAgICAgICAjIGNhbGwgZG9fc2lnbmFsCisgICAgICAgIHN0bnNtICAgX19TRl9FTVBUWSglcjE1KSwweGZjICAjIGRpc2FibGUgSS9PIGFuZCBleHQuIGludGVycnVwdHMKKwliCUJBU0VEKGlvX2xlYXZlKSAgICAgICAgIyBvdXQgb2YgaGVyZSwgZG8gTk9UIHJlY2hlY2sKKworLyoKKyAqIEV4dGVybmFsIGludGVycnVwdCBoYW5kbGVyIHJvdXRpbmUKKyAqLworCisgICAgICAgIC5nbG9ibCAgZXh0X2ludF9oYW5kbGVyCitleHRfaW50X2hhbmRsZXI6CisJU1RPUkVfVElNRVIgX19MQ19BU1lOQ19FTlRFUl9USU1FUgorCXN0Y2sJX19MQ19JTlRfQ0xPQ0sKKwlTQVZFX0FMTF9CQVNFIF9fTENfU0FWRV9BUkVBKzE2CisgICAgICAgIFNBVkVfQUxMIF9fTENfRVhUX09MRF9QU1csX19MQ19TQVZFX0FSRUErMTYsMAorI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCisJdG0JU1BfUFNXKzEoJXIxNSksMHgwMQkjIGludGVycnVwdGluZyBmcm9tIHVzZXIgPworCWJ6CUJBU0VEKGV4dF9ub192dGltZSkKKwlVUERBVEVfVlRJTUUgX19MQ19FWElUX1RJTUVSLF9fTENfQVNZTkNfRU5URVJfVElNRVIsX19MQ19VU0VSX1RJTUVSCisJVVBEQVRFX1ZUSU1FIF9fTENfTEFTVF9VUERBVEVfVElNRVIsX19MQ19FWElUX1RJTUVSLF9fTENfU1lTVEVNX1RJTUVSCisJbXZjCV9fTENfTEFTVF9VUERBVEVfVElNRVIoOCksX19MQ19BU1lOQ19FTlRFUl9USU1FUgorZXh0X25vX3Z0aW1lOgorI2VuZGlmCisJbAklcjksX19MQ19USFJFQURfSU5GTwkjIGxvYWQgcG9pbnRlciB0byB0aHJlYWRfaW5mbyBzdHJ1Y3QKKwlsYQklcjIsU1BfUFRSRUdTKCVyMTUpICAgICMgYWRkcmVzcyBvZiByZWdpc3Rlci1zYXZlIGFyZWEKKwlsaAklcjMsX19MQ19FWFRfSU5UX0NPREUgICMgZ2V0IGludGVycnVwdGlvbiBjb2RlCisJbAklcjEsQkFTRUQoLkxkb19leHRpbnQpCisJYmFzcgklcjE0LCVyMQorCWIJQkFTRUQoaW9fcmV0dXJuKQorCisvKgorICogTWFjaGluZSBjaGVjayBoYW5kbGVyIHJvdXRpbmVzCisgKi8KKworICAgICAgICAuZ2xvYmwgbWNja19pbnRfaGFuZGxlcgorbWNja19pbnRfaGFuZGxlcjoKKwlTVE9SRV9USU1FUiBfX0xDX0FTWU5DX0VOVEVSX1RJTUVSCisJU0FWRV9BTExfQkFTRSBfX0xDX1NBVkVfQVJFQSszMgorICAgICAgICBTQVZFX0FMTCBfX0xDX01DS19PTERfUFNXLF9fTENfU0FWRV9BUkVBKzMyLDAKKyNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORworCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyBpbnRlcnJ1cHRpbmcgZnJvbSB1c2VyID8KKwlieglCQVNFRChtY2NrX25vX3Z0aW1lKQorCVVQREFURV9WVElNRSBfX0xDX0VYSVRfVElNRVIsX19MQ19BU1lOQ19FTlRFUl9USU1FUixfX0xDX1VTRVJfVElNRVIKKwlVUERBVEVfVlRJTUUgX19MQ19MQVNUX1VQREFURV9USU1FUixfX0xDX0VYSVRfVElNRVIsX19MQ19TWVNURU1fVElNRVIKKwltdmMJX19MQ19MQVNUX1VQREFURV9USU1FUig4KSxfX0xDX0FTWU5DX0VOVEVSX1RJTUVSCittY2NrX25vX3Z0aW1lOgorI2VuZGlmCisJbCAgICAgICAlcjEsQkFTRUQoLkxzMzkwX21jY2spCisJYmFzciAgICAlcjE0LCVyMQkgICMgY2FsbCBtYWNoaW5lIGNoZWNrIGhhbmRsZXIKK21jY2tfcmV0dXJuOgorICAgICAgICBSRVNUT1JFX0FMTCAwCisKKyNpZmRlZiBDT05GSUdfU01QCisvKgorICogUmVzdGFydCBpbnRlcnJ1cHRpb24gaGFuZGxlciwga2ljayBzdGFydGVyIGZvciBhZGRpdGlvbmFsIENQVXMKKyAqLworICAgICAgICAuZ2xvYmwgcmVzdGFydF9pbnRfaGFuZGxlcgorcmVzdGFydF9pbnRfaGFuZGxlcjoKKyAgICAgICAgbCAgICAgICAlcjE1LF9fTENfU0FWRV9BUkVBKzYwICMgbG9hZCBrc3AKKyAgICAgICAgbGN0bCAgICAlYzAsJWMxNSxfX0xDX0NSRUdTX1NBVkVfQVJFQSAjIGdldCBuZXcgY3RsIHJlZ3MKKyAgICAgICAgbGFtICAgICAlYTAsJWExNSxfX0xDX0FSRUdTX1NBVkVfQVJFQQorICAgICAgICBsbSAgICAgICVyNiwlcjE1LF9fU0ZfR1BSUyglcjE1KSAjIGxvYWQgcmVnaXN0ZXJzIGZyb20gY2xvbmUKKyAgICAgICAgc3Rvc20gICBfX1NGX0VNUFRZKCVyMTUpLDB4MDQgICAgIyBub3cgd2UgY2FuIHR1cm4gZGF0IG9uCisgICAgICAgIGJhc3IgICAgJXIxNCwwCisgICAgICAgIGwgICAgICAgJXIxNCxyZXN0YXJ0X2FkZHItLiglcjE0KQorICAgICAgICBiciAgICAgICVyMTQgICAgICAgICAgICAgICAgICAgIyBicmFuY2ggdG8gc3RhcnRfc2Vjb25kYXJ5CityZXN0YXJ0X2FkZHI6CisgICAgICAgIC5sb25nICAgc3RhcnRfc2Vjb25kYXJ5CisjZWxzZQorLyoKKyAqIElmIHdlIGRvIG5vdCBydW4gd2l0aCBTTVAgZW5hYmxlZCwgbGV0IHRoZSBuZXcgQ1BVIGNyYXNoIC4uLgorICovCisgICAgICAgIC5nbG9ibCByZXN0YXJ0X2ludF9oYW5kbGVyCityZXN0YXJ0X2ludF9oYW5kbGVyOgorICAgICAgICBiYXNyICAgICVyMSwwCityZXN0YXJ0X2Jhc2U6CisgICAgICAgIGxwc3cgICAgcmVzdGFydF9jcmFzaC1yZXN0YXJ0X2Jhc2UoJXIxKQorICAgICAgICAuYWxpZ24gOAorcmVzdGFydF9jcmFzaDoKKyAgICAgICAgLmxvbmcgIDB4MDAwYTAwMDAsMHgwMDAwMDAwMAorcmVzdGFydF9nbzoKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NIRUNLX1NUQUNLCisvKgorICogVGhlIHN5bmNocm9ub3VzIG9yIHRoZSBhc3luY2hyb25vdXMgc3RhY2sgb3ZlcmZsb3dlZC4gV2UgYXJlIGRlYWQuCisgKiBObyBuZWVkIHRvIHByb3Blcmx5IHNhdmUgdGhlIHJlZ2lzdGVycywgd2UgYXJlIGdvaW5nIHRvIHBhbmljIGFueXdheS4KKyAqIFNldHVwIGEgcHRfcmVncyBzbyB0aGF0IHNob3dfdHJhY2UgY2FuIHByb3ZpZGUgYSBnb29kIGNhbGwgdHJhY2UuCisgKi8KK3N0YWNrX292ZXJmbG93OgorCWwJJXIxNSxfX0xDX1BBTklDX1NUQUNLCSMgY2hhbmdlIHRvIHBhbmljIHN0YWNrCisJc2wJJXIxNSxCQVNFRCguTGNfc3BzaXplKQorCW12YwlTUF9QU1coOCwlcjE1KSwwKCVyMTIpCSMgbW92ZSB1c2VyIFBTVyB0byBzdGFjaworCXN0bQklcjAsJXIxMSxTUF9SMCglcjE1KQkjIHN0b3JlIGdwcnMgJXIwLSVyMTEgdG8ga2VybmVsIHN0YWNrCisJbGEJJXIxLF9fTENfU0FWRV9BUkVBCisJY2gJJXIxMixCQVNFRCguTDB4MDIwKQkjIG9sZCBwc3cgYWRkciA9PSBfX0xDX1NWQ19PTERfUFNXID8KKwliZQlCQVNFRCgwZikKKwljaAklcjEyLEJBU0VEKC5MMHgwMjgpCSMgb2xkIHBzdyBhZGRyID09IF9fTENfUEdNX09MRF9QU1cgPworCWJlCUJBU0VEKDBmKQorCWxhCSVyMSxfX0xDX1NBVkVfQVJFQSsxNgorMDoJbXZjCVNQX1IxMigxNiwlcjE1KSwwKCVyMSkJIyBtb3ZlICVyMTItJXIxNSB0byBzdGFjaworICAgICAgICB4YyAgICAgIF9fU0ZfQkFDS0NIQUlOKDQsJXIxNSksX19TRl9CQUNLQ0hBSU4oJXIxNSkgIyBjbGVhciBiYWNrIGNoYWluCisJbAklcjEsQkFTRUQoMWYpCQkjIGJyYW5jaCB0byBrZXJuZWxfc3RhY2tfb3ZlcmZsb3cKKyAgICAgICAgbGEgICAgICAlcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzCisJYnIJJXIxCisxOgkubG9uZyAga2VybmVsX3N0YWNrX292ZXJmbG93CisjZW5kaWYKKworY2xlYW51cF90YWJsZV9zeXN0ZW1fY2FsbDoKKwkubG9uZwlzeXN0ZW1fY2FsbCArIDB4ODAwMDAwMDAsIHN5c2NfZG9fc3ZjICsgMHg4MDAwMDAwMAorY2xlYW51cF90YWJsZV9zeXNjX3JldHVybjoKKwkubG9uZwlzeXNjX3JldHVybiArIDB4ODAwMDAwMDAsIHN5c2NfbGVhdmUgKyAweDgwMDAwMDAwCitjbGVhbnVwX3RhYmxlX3N5c2NfbGVhdmU6CisJLmxvbmcJc3lzY19sZWF2ZSArIDB4ODAwMDAwMDAsIHN5c2Nfd29ya19sb29wICsgMHg4MDAwMDAwMAorY2xlYW51cF90YWJsZV9zeXNjX3dvcmtfbG9vcDoKKwkubG9uZwlzeXNjX3dvcmtfbG9vcCArIDB4ODAwMDAwMDAsIHN5c2NfcmVzY2hlZHVsZSArIDB4ODAwMDAwMDAKKworY2xlYW51cF9jcml0aWNhbDoKKwljbGMJNCg0LCVyMTIpLEJBU0VEKGNsZWFudXBfdGFibGVfc3lzdGVtX2NhbGwpCisJYmwJQkFTRUQoMGYpCisJY2xjCTQoNCwlcjEyKSxCQVNFRChjbGVhbnVwX3RhYmxlX3N5c3RlbV9jYWxsKzQpCisJYmwJQkFTRUQoY2xlYW51cF9zeXN0ZW1fY2FsbCkKKzA6CisJY2xjCTQoNCwlcjEyKSxCQVNFRChjbGVhbnVwX3RhYmxlX3N5c2NfcmV0dXJuKQorCWJsCUJBU0VEKDBmKQorCWNsYwk0KDQsJXIxMiksQkFTRUQoY2xlYW51cF90YWJsZV9zeXNjX3JldHVybis0KQorCWJsCUJBU0VEKGNsZWFudXBfc3lzY19yZXR1cm4pCiswOgorCWNsYwk0KDQsJXIxMiksQkFTRUQoY2xlYW51cF90YWJsZV9zeXNjX2xlYXZlKQorCWJsCUJBU0VEKDBmKQorCWNsYwk0KDQsJXIxMiksQkFTRUQoY2xlYW51cF90YWJsZV9zeXNjX2xlYXZlKzQpCisJYmwJQkFTRUQoY2xlYW51cF9zeXNjX2xlYXZlKQorMDoKKwljbGMJNCg0LCVyMTIpLEJBU0VEKGNsZWFudXBfdGFibGVfc3lzY193b3JrX2xvb3ApCisJYmwJQkFTRUQoMGYpCisJY2xjCTQoNCwlcjEyKSxCQVNFRChjbGVhbnVwX3RhYmxlX3N5c2Nfd29ya19sb29wKzQpCisJYmwJQkFTRUQoY2xlYW51cF9zeXNjX2xlYXZlKQorMDoKKwlicgklcjE0CisKK2NsZWFudXBfc3lzdGVtX2NhbGw6CisJbXZjCV9fTENfUkVUVVJOX1BTVyg4KSwwKCVyMTIpCisjaWZkZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKKwljbGMJX19MQ19SRVRVUk5fUFNXKzQoNCksQkFTRUQoY2xlYW51cF9zeXN0ZW1fY2FsbF9pbnNuKzQpCisJYmgJQkFTRUQoMGYpCisJbXZjCV9fTENfU1lOQ19FTlRFUl9USU1FUig4KSxfX0xDX0FTWU5DX0VOVEVSX1RJTUVSCiswOgljbGMJX19MQ19SRVRVUk5fUFNXKzQoNCksQkFTRUQoY2xlYW51cF9zeXN0ZW1fY2FsbF9pbnNuKzgpCisJYmhlCUJBU0VEKGNsZWFudXBfdnRpbWUpCisjZW5kaWYKKwljbGMJX19MQ19SRVRVUk5fUFNXKzQoNCksQkFTRUQoY2xlYW51cF9zeXN0ZW1fY2FsbF9pbnNuKQorCWJoCUJBU0VEKDBmKQorCW12YwlfX0xDX1NBVkVfQVJFQSgxNiksX19MQ19TQVZFX0FSRUErMTYKKzA6CXN0CSVyMTMsX19MQ19TQVZFX0FSRUErMjAKKwlTQVZFX0FMTCBfX0xDX1NWQ19PTERfUFNXLF9fTENfU0FWRV9BUkVBLDEKKwlzdAklcjE1LF9fTENfU0FWRV9BUkVBKzI4CisJbGgJJXI3LDB4OGEKKyNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORworY2xlYW51cF92dGltZToKKwljbGMJX19MQ19SRVRVUk5fUFNXKzQoNCksQkFTRUQoY2xlYW51cF9zeXN0ZW1fY2FsbF9pbnNuKzEyKQorCWJoZQlCQVNFRChjbGVhbnVwX3N0aW1lKQorCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyBpbnRlcnJ1cHRpbmcgZnJvbSB1c2VyID8KKwlieglCQVNFRChjbGVhbnVwX25vdnRpbWUpCisJVVBEQVRFX1ZUSU1FIF9fTENfRVhJVF9USU1FUixfX0xDX1NZTkNfRU5URVJfVElNRVIsX19MQ19VU0VSX1RJTUVSCitjbGVhbnVwX3N0aW1lOgorCWNsYwlfX0xDX1JFVFVSTl9QU1crNCg0KSxCQVNFRChjbGVhbnVwX3N5c3RlbV9jYWxsX2luc24rMTYpCisJYmgJQkFTRUQoY2xlYW51cF91cGRhdGUpCisJVVBEQVRFX1ZUSU1FIF9fTENfTEFTVF9VUERBVEVfVElNRVIsX19MQ19FWElUX1RJTUVSLF9fTENfU1lTVEVNX1RJTUVSCitjbGVhbnVwX3VwZGF0ZToKKwltdmMJX19MQ19MQVNUX1VQREFURV9USU1FUig4KSxfX0xDX1NZTkNfRU5URVJfVElNRVIKK2NsZWFudXBfbm92dGltZToKKyNlbmRpZgorCW12YwlfX0xDX1JFVFVSTl9QU1crNCg0KSxCQVNFRChjbGVhbnVwX3RhYmxlX3N5c3RlbV9jYWxsKzQpCisJbGEJJXIxMixfX0xDX1JFVFVSTl9QU1cKKwlicgklcjE0CitjbGVhbnVwX3N5c3RlbV9jYWxsX2luc246CisJLmxvbmcJc3lzY19zYXZlYWxsICsgMHg4MDAwMDAwMAorI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCisJLmxvbmcgICBzeXN0ZW1fY2FsbCArIDB4ODAwMDAwMDAKKwkubG9uZyAgIHN5c2NfdnRpbWUgKyAweDgwMDAwMDAwCisJLmxvbmcgICBzeXNjX3N0aW1lICsgMHg4MDAwMDAwMAorCS5sb25nICAgc3lzY191cGRhdGUgKyAweDgwMDAwMDAwCisjZW5kaWYKKworY2xlYW51cF9zeXNjX3JldHVybjoKKwltdmMJX19MQ19SRVRVUk5fUFNXKDQpLDAoJXIxMikKKwltdmMJX19MQ19SRVRVUk5fUFNXKzQoNCksQkFTRUQoY2xlYW51cF90YWJsZV9zeXNjX3JldHVybikKKwlsYQklcjEyLF9fTENfUkVUVVJOX1BTVworCWJyCSVyMTQKKworY2xlYW51cF9zeXNjX2xlYXZlOgorCWNsYwk0KDQsJXIxMiksQkFTRUQoY2xlYW51cF9zeXNjX2xlYXZlX2luc24pCisJYmUJQkFTRUQoMGYpCisjaWZkZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKKwltdmMJX19MQ19FWElUX1RJTUVSKDgpLF9fTENfQVNZTkNfRU5URVJfVElNRVIKKwljbGMJNCg0LCVyMTIpLEJBU0VEKGNsZWFudXBfc3lzY19sZWF2ZV9pbnNuKzQpCisJYmUJQkFTRUQoMGYpCisjZW5kaWYKKwltdmMJX19MQ19SRVRVUk5fUFNXKDgpLFNQX1BTVyglcjE1KQorCW12YwlfX0xDX1NBVkVfQVJFQSsxNigxNiksU1BfUjEyKCVyMTUpCisJbG0JJXIwLCVyMTEsU1BfUjAoJXIxNSkKKwlsCSVyMTUsU1BfUjE1KCVyMTUpCiswOglsYQklcjEyLF9fTENfUkVUVVJOX1BTVworCWJyCSVyMTQKK2NsZWFudXBfc3lzY19sZWF2ZV9pbnNuOgorI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCisJLmxvbmcJc3lzY19sZWF2ZSArIDE0ICsgMHg4MDAwMDAwMAorI2VuZGlmCisJLmxvbmcJc3lzY19sZWF2ZSArIDEwICsgMHg4MDAwMDAwMAorCisvKgorICogSW50ZWdlciBjb25zdGFudHMKKyAqLworICAgICAgICAgICAgICAgLmFsaWduIDQKKy5MY19zcHNpemU6ICAgIC5sb25nICBTUF9TSVpFCisuTGNfb3ZlcmhlYWQ6ICAubG9uZyAgU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKy5MY19wYWN0aXZlOiAgIC5sb25nICBQUkVFTVBUX0FDVElWRQorLkxucl9zeXNjYWxsczogLmxvbmcgIE5SX3N5c2NhbGxzCisuTDB4MDE4OiAgICAgICAuc2hvcnQgMHgwMTgKKy5MMHgwMjA6ICAgICAgIC5zaG9ydCAweDAyMAorLkwweDAyODogICAgICAgLnNob3J0IDB4MDI4CisuTDB4MDMwOiAgICAgICAuc2hvcnQgMHgwMzAKKy5MMHgwMzg6ICAgICAgIC5zaG9ydCAweDAzOAorLkxjXzE6ICAgICAgICAgLmxvbmcgIDEKKworLyoKKyAqIFN5bWJvbCBjb25zdGFudHMKKyAqLworLkxzMzkwX21jY2s6ICAgLmxvbmcgIHMzOTBfZG9fbWFjaGluZV9jaGVjaworLkxkb19JUlE6ICAgICAgLmxvbmcgIGRvX0lSUQorLkxkb19leHRpbnQ6ICAgLmxvbmcgIGRvX2V4dGludAorLkxkb19zaWduYWw6ICAgLmxvbmcgIGRvX3NpZ25hbAorLkxoYW5kbGVfcGVyOiAgLmxvbmcgIGRvX3NpbmdsZV9zdGVwCisuTGp1bXBfdGFibGU6ICAubG9uZyAgcGdtX2NoZWNrX3RhYmxlCisuTHNjaGVkdWxlOiAgICAubG9uZyAgc2NoZWR1bGUKKy5MY2xvbmU6ICAgICAgIC5sb25nICBzeXNfY2xvbmUKKy5MZXhlY3ZlOiAgICAgIC5sb25nICBzeXNfZXhlY3ZlCisuTGZvcms6ICAgICAgICAubG9uZyAgc3lzX2ZvcmsKKy5McnRfc2lncmV0dXJuOi5sb25nICBzeXNfcnRfc2lncmV0dXJuCisuTHJ0X3NpZ3N1c3BlbmQ6CisgICAgICAgICAgICAgICAubG9uZyAgc3lzX3J0X3NpZ3N1c3BlbmQKKy5Mc2lncmV0dXJuOiAgIC5sb25nICBzeXNfc2lncmV0dXJuCisuTHNpZ3N1c3BlbmQ6ICAubG9uZyAgc3lzX3NpZ3N1c3BlbmQKKy5Mc2lnYWx0c3RhY2s6IC5sb25nICBzeXNfc2lnYWx0c3RhY2sKKy5MdHJhY2U6ICAgICAgIC5sb25nICBzeXNjYWxsX3RyYWNlCisuTHZmb3JrOiAgICAgICAubG9uZyAgc3lzX3Zmb3JrCisuTHNjaGVkdGFpbDogICAubG9uZyAgc2NoZWR1bGVfdGFpbAorCisuTGNyaXRpY2FsX3N0YXJ0OgorICAgICAgICAgICAgICAgLmxvbmcgIF9fY3JpdGljYWxfc3RhcnQgKyAweDgwMDAwMDAwCisuTGNyaXRpY2FsX2VuZDoKKyAgICAgICAgICAgICAgIC5sb25nICBfX2NyaXRpY2FsX2VuZCArIDB4ODAwMDAwMDAKKy5MY2xlYW51cF9jcml0aWNhbDoKKyAgICAgICAgICAgICAgIC5sb25nICBjbGVhbnVwX2NyaXRpY2FsCisKKyNkZWZpbmUgU1lTQ0FMTChlc2EsZXNhbWUsZW11KQkubG9uZyBlc2EKKwkuZ2xvYmwgIHN5c19jYWxsX3RhYmxlCitzeXNfY2FsbF90YWJsZToKKyNpbmNsdWRlICJzeXNjYWxscy5TIgorI3VuZGVmIFNZU0NBTEwKKwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeTY0LlMgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTUyN2FiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeTY0LlMKQEAgLTAsMCArMSw4ODEgQEAKKy8qCisgKiAgYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TCisgKiAgICBTMzkwIGxvdy1sZXZlbCBlbnRyeSBwb2ludHMuCisgKgorICogIFMzOTAgdmVyc2lvbgorICogICAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgorICogICAgQXV0aG9yKHMpOiBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pLAorICogICAgICAgICAgICAgICBIYXJ0bXV0IFBlbm5lciAoaHBAZGUuaWJtLmNvbSksCisgKiAgICAgICAgICAgICAgIERlbmlzIEpvc2VwaCBCYXJyb3cgKGRqYmFycm93QGRlLmlibS5jb20sYmFycm93X2RqQHlhaG9vLmNvbSksCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N5cy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vbG93Y29yZS5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCisvKgorICogU3RhY2sgbGF5b3V0IGZvciB0aGUgc3lzdGVtX2NhbGwgc3RhY2sgZW50cnkuCisgKiBUaGUgZmlyc3QgZmV3IGVudHJpZXMgYXJlIGlkZW50aWNhbCB0byB0aGUgdXNlcl9yZWdzX3N0cnVjdC4KKyAqLworU1BfUFRSRUdTICAgID0gIFNUQUNLX0ZSQU1FX09WRVJIRUFECitTUF9BUkdTICAgICAgPSAgU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX0FSR1MKK1NQX1BTVyAgICAgICA9ICBTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfUFNXCitTUF9SMCAgICAgICAgPSAgU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX0dQUlMKK1NQX1IxICAgICAgICA9ICBTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfR1BSUyArIDgKK1NQX1IyICAgICAgICA9ICBTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfR1BSUyArIDE2CitTUF9SMyAgICAgICAgPSAgU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX0dQUlMgKyAyNAorU1BfUjQgICAgICAgID0gIFNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9HUFJTICsgMzIKK1NQX1I1ICAgICAgICA9ICBTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfR1BSUyArIDQwCitTUF9SNiAgICAgICAgPSAgU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX0dQUlMgKyA0OAorU1BfUjcgICAgICAgID0gIFNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9HUFJTICsgNTYKK1NQX1I4ICAgICAgICA9ICBTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfR1BSUyArIDY0CitTUF9SOSAgICAgICAgPSAgU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX0dQUlMgKyA3MgorU1BfUjEwICAgICAgID0gIFNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9HUFJTICsgODAKK1NQX1IxMSAgICAgICA9ICBTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfR1BSUyArIDg4CitTUF9SMTIgICAgICAgPSAgU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX0dQUlMgKyA5NgorU1BfUjEzICAgICAgID0gIFNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9HUFJTICsgMTA0CitTUF9SMTQgICAgICAgPSAgU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX0dQUlMgKyAxMTIKK1NQX1IxNSAgICAgICA9ICBTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfR1BSUyArIDEyMAorU1BfT1JJR19SMiAgID0gIFNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9PUklHX0dQUjIKK1NQX0lMQyAgICAgICA9ICBTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfSUxDCitTUF9UUkFQICAgICAgPSAgU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX1RSQVAKK1NQX1NJWkUgICAgICA9ICBTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfU0laRQorCitTVEFDS19TSElGVCA9IFBBR0VfU0hJRlQgKyBUSFJFQURfT1JERVIKK1NUQUNLX1NJWkUgID0gMSA8PCBTVEFDS19TSElGVAorCitfVElGX1dPUktfU1ZDID0gKF9USUZfU0lHUEVORElORyB8IF9USUZfTkVFRF9SRVNDSEVEIHwgXAorCQkgX1RJRl9SRVNUQVJUX1NWQyB8IF9USUZfU0lOR0xFX1NURVAgKQorX1RJRl9XT1JLX0lOVCA9IChfVElGX1NJR1BFTkRJTkcgfCBfVElGX05FRURfUkVTQ0hFRCkKKworI2RlZmluZSBCQVNFRChuYW1lKSBuYW1lLXN5c3RlbV9jYWxsKCVyMTMpCisKKwkubWFjcm8gIFNUT1JFX1RJTUVSIGxjX29mZnNldAorI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCisJc3RwdAlcbGNfb2Zmc2V0CisjZW5kaWYKKwkuZW5kbQorCisjaWZkZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKKwkubWFjcm8gIFVQREFURV9WVElNRSBsY19mcm9tLGxjX3RvLGxjX3N1bQorCWxnCSVyMTAsXGxjX2Zyb20KKwlzbGcJJXIxMCxcbGNfdG8KKwlhbGcJJXIxMCxcbGNfc3VtCisJc3RnCSVyMTAsXGxjX3N1bQorCS5lbmRtCisjZW5kaWYKKworLyoKKyAqIFJlZ2lzdGVyIHVzYWdlIGluIGludGVycnVwdCBoYW5kbGVyczoKKyAqICAgIFI5ICAtIHBvaW50ZXIgdG8gY3VycmVudCB0YXNrIHN0cnVjdHVyZQorICogICAgUjEzIC0gcG9pbnRlciB0byBsaXRlcmFsIHBvb2wKKyAqICAgIFIxNCAtIHJldHVybiByZWdpc3RlciBmb3IgZnVuY3Rpb24gY2FsbHMKKyAqICAgIFIxNSAtIGtlcm5lbCBzdGFjayBwb2ludGVyCisgKi8KKworICAgICAgICAubWFjcm8gIFNBVkVfQUxMX0JBU0Ugc2F2ZWFyZWEKKwlzdG1nCSVyMTIsJXIxNSxcc2F2ZWFyZWEKKwlsYXJsCSVyMTMsc3lzdGVtX2NhbGwKKwkuZW5kbQorCisgICAgICAgIC5tYWNybyAgU0FWRV9BTEwgcHN3b3JnLHNhdmVhcmVhLHN5bmMKKwlsYQklcjEyLFxwc3dvcmcKKwkuaWYJXHN5bmMKKwl0bQlccHN3b3JnKzEsMHgwMQkJIyB0ZXN0IHByb2JsZW0gc3RhdGUgYml0CisJanoJMmYJCQkjIHNraXAgc3RhY2sgc2V0dXAgc2F2ZQorCWxnCSVyMTUsX19MQ19LRVJORUxfU1RBQ0sJIyBwcm9ibGVtIHN0YXRlIC0+IGxvYWQga3NwCisJLmVsc2UKKwl0bQlccHN3b3JnKzEsMHgwMQkJIyB0ZXN0IHByb2JsZW0gc3RhdGUgYml0CisJam56CTFmCQkJIyBmcm9tIHVzZXIgLT4gbG9hZCBrZXJuZWwgc3RhY2sKKwljbGMJXHBzd29yZys4KDgpLEJBU0VEKC5MY3JpdGljYWxfZW5kKQorCWpoZQkwZgorCWNsYwlccHN3b3JnKzgoOCksQkFTRUQoLkxjcml0aWNhbF9zdGFydCkKKwlqbAkwZgorCWJyYXNsCSVyMTQsY2xlYW51cF9jcml0aWNhbAorCXRtCTAoJXIxMiksMHgwMQkJIyByZXRlc3QgcHJvYmxlbSBzdGF0ZSBhZnRlciBjbGVhbnVwCisJam56CTFmCiswOglsZwklcjE0LF9fTENfQVNZTkNfU1RBQ0sJIyBhcmUgd2UgYWxyZWFkeSBvbiB0aGUgYXN5bmMuIHN0YWNrID8KKwlzbGdyCSVyMTQsJXIxNQorCXNyYWcJJXIxNCwlcjE0LFNUQUNLX1NISUZUCisJanoJMmYKKzE6CWxnCSVyMTUsX19MQ19BU1lOQ19TVEFDSwkjIGxvYWQgYXN5bmMgc3RhY2sKKwkuZW5kaWYKKyNpZmRlZiBDT05GSUdfQ0hFQ0tfU1RBQ0sKKwlqCTNmCisyOgl0bWwJJXIxNSxTVEFDS19TSVpFIC0gQ09ORklHX1NUQUNLX0dVQVJECisJanoJc3RhY2tfb3ZlcmZsb3cKKzM6CisjZW5kaWYKKzI6CWFnaGkgICAgJXIxNSwtU1BfU0laRQkJIyBtYWtlIHJvb20gZm9yIHJlZ2lzdGVycyAmIHBzdworCW12YyAgICAgU1BfUFNXKDE2LCVyMTUpLDAoJXIxMikJIyBtb3ZlIHVzZXIgUFNXIHRvIHN0YWNrCisJbGEJJXIxMixccHN3b3JnCisJc3RnCSVyMixTUF9PUklHX1IyKCVyMTUpCSMgc3RvcmUgb3JpZ2luYWwgY29udGVudCBvZiBncHIgMgorCWljbQklcjEyLDEyLF9fTENfU1ZDX0lMQworCXN0bWcJJXIwLCVyMTEsU1BfUjAoJXIxNSkJIyBzdG9yZSBncHJzICVyMC0lcjExIHRvIGtlcm5lbCBzdGFjaworCXN0CSVyMTIsU1BfSUxDKCVyMTUpCisJbXZjCVNQX1IxMigzMiwlcjE1KSxcc2F2ZWFyZWEgIyBtb3ZlICVyMTItJXIxNSB0byBzdGFjaworCWxhCSVyMTIsMAorCXN0ZwklcjEyLF9fU0ZfQkFDS0NIQUlOKCVyMTUpCisgICAgICAgIC5lbmRtCisKKwkubWFjcm8JUkVTVE9SRV9BTEwgc3luYworCW12YwlfX0xDX1JFVFVSTl9QU1coMTYpLFNQX1BTVyglcjE1KSAjIG1vdmUgdXNlciBQU1cgdG8gbG93Y29yZQorCS5pZiAhXHN5bmMKKwluaQlfX0xDX1JFVFVSTl9QU1crMSwweGZkCSMgY2xlYXIgd2FpdCBzdGF0ZSBiaXQKKwkuZW5kaWYKKwlsbWcJJXIwLCVyMTUsU1BfUjAoJXIxNSkJIyBsb2FkIGdwcnMgMC0xNSBvZiB1c2VyCisJU1RPUkVfVElNRVIgX19MQ19FWElUX1RJTUVSCisJbHBzd2UJX19MQ19SRVRVUk5fUFNXCQkjIGJhY2sgdG8gY2FsbGVyCisJLmVuZG0KKworLyoKKyAqIFNjaGVkdWxlciByZXN1bWUgZnVuY3Rpb24sIGNhbGxlZCBieSBzd2l0Y2hfdG8KKyAqICBncHIyID0gKHRhc2tfc3RydWN0ICopIHByZXYKKyAqICBncHIzID0gKHRhc2tfc3RydWN0ICopIG5leHQKKyAqIFJldHVybnM6CisgKiAgZ3ByMiA9IHByZXYKKyAqLworICAgICAgICAuZ2xvYmwgIF9fc3dpdGNoX3RvCitfX3N3aXRjaF90bzoKKwl0bQlfX1RIUkVBRF9wZXIrNCglcjMpLDB4ZTggIyBpcyB0aGUgbmV3IHByb2Nlc3MgdXNpbmcgcGVyID8KKwlqeglfX3N3aXRjaF90b19ub3BlcgkJIyBpZiBub3Qgd2UncmUgZmluZQorICAgICAgICBzdGN0ZyAgICVjOSwlYzExLF9fU0ZfRU1QVFkoJXIxNSkjIFdlIGFyZSB1c2luZyBwZXIgc3R1ZmYKKyAgICAgICAgY2xjICAgICBfX1RIUkVBRF9wZXIoMjQsJXIzKSxfX1NGX0VNUFRZKCVyMTUpCisgICAgICAgIGplICAgICAgX19zd2l0Y2hfdG9fbm9wZXIgICAgICAgICAgICAjIHdlIGdvdCBhd2F5IHdpdGhvdXQgYmFzaGluZyBUTEIncworICAgICAgICBsY3RsZyAgICVjOSwlYzExLF9fVEhSRUFEX3BlciglcjMpCSMgTm9wZSB3ZSBkaWRuJ3QKK19fc3dpdGNoX3RvX25vcGVyOgorICAgICAgICBzdG1nICAgICVyNiwlcjE1LF9fU0ZfR1BSUyglcjE1KSMgc3RvcmUgX19zd2l0Y2hfdG8gcmVnaXN0ZXJzIG9mIHByZXYgdGFzaworCXN0ZwklcjE1LF9fVEhSRUFEX2tzcCglcjIpCSMgc3RvcmUga2VybmVsIHN0YWNrIHRvIHByZXYtPnRzcy5rc3AKKwlsZwklcjE1LF9fVEhSRUFEX2tzcCglcjMpCSMgbG9hZCBrZXJuZWwgc3RhY2sgZnJvbSBuZXh0LT50c3Mua3NwCisgICAgICAgIGxtZyAgICAgJXI2LCVyMTUsX19TRl9HUFJTKCVyMTUpIyBsb2FkIF9fc3dpdGNoX3RvIHJlZ2lzdGVycyBvZiBuZXh0IHRhc2sKKwlzdGcJJXIzLF9fTENfQ1VSUkVOVAkjIF9fTENfQ1VSUkVOVCA9IGN1cnJlbnQgdGFzayBzdHJ1Y3QKKwlsY3RsCSVjNCwlYzQsX19UQVNLX3BpZCglcjMpICMgbG9hZCBwaWQgdG8gY29udHJvbCByZWcuIDQKKwlsZwklcjMsX19USFJFQURfaW5mbyglcjMpICAjIGxvYWQgdGhyZWFkX2luZm8gZnJvbSB0YXNrIHN0cnVjdAorCXN0ZwklcjMsX19MQ19USFJFQURfSU5GTworCWFnaGkJJXIzLFNUQUNLX1NJWkUKKwlzdGcJJXIzLF9fTENfS0VSTkVMX1NUQUNLCSMgX19MQ19LRVJORUxfU1RBQ0sgPSBuZXcga2VybmVsIHN0YWNrCisJYnIJJXIxNAorCitfX2NyaXRpY2FsX3N0YXJ0OgorLyoKKyAqIFNWQyBpbnRlcnJ1cHQgaGFuZGxlciByb3V0aW5lLiBTeXN0ZW0gY2FsbHMgYXJlIHN5bmNocm9ub3VzIGV2ZW50cyBhbmQKKyAqIGFyZSBleGVjdXRlZCB3aXRoIGludGVycnVwdHMgZW5hYmxlZC4KKyAqLworCisJLmdsb2JsICBzeXN0ZW1fY2FsbAorc3lzdGVtX2NhbGw6CisJU1RPUkVfVElNRVIgX19MQ19TWU5DX0VOVEVSX1RJTUVSCitzeXNjX3NhdmVhbGw6CisJU0FWRV9BTExfQkFTRSBfX0xDX1NBVkVfQVJFQQorICAgICAgICBTQVZFX0FMTCBfX0xDX1NWQ19PTERfUFNXLF9fTENfU0FWRV9BUkVBLDEKKwlsbGdoICAgICVyNyxfX0xDX1NWQ19JTlRfQ09ERSAjIGdldCBzdmMgbnVtYmVyIGZyb20gbG93Y29yZQorI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCitzeXNjX3Z0aW1lOgorCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyBpbnRlcnJ1cHRpbmcgZnJvbSB1c2VyID8KKwlqeglzeXNjX2RvX3N2YworCVVQREFURV9WVElNRSBfX0xDX0VYSVRfVElNRVIsX19MQ19TWU5DX0VOVEVSX1RJTUVSLF9fTENfVVNFUl9USU1FUgorc3lzY19zdGltZToKKwlVUERBVEVfVlRJTUUgX19MQ19MQVNUX1VQREFURV9USU1FUixfX0xDX0VYSVRfVElNRVIsX19MQ19TWVNURU1fVElNRVIKK3N5c2NfdXBkYXRlOgorCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLF9fTENfU1lOQ19FTlRFUl9USU1FUgorI2VuZGlmCitzeXNjX2RvX3N2YzoKKwlsZwklcjksX19MQ19USFJFQURfSU5GTwkjIGxvYWQgcG9pbnRlciB0byB0aHJlYWRfaW5mbyBzdHJ1Y3QKKyAgICAgICAgc2xhZyAgICAlcjcsJXI3LDIgICAgICAgICAjICo0IGFuZCB0ZXN0IGZvciBzdmMgMAorCWpueglzeXNjX25yX29rCisJIyBzdmMgMDogc3lzdGVtIGNhbGwgbnVtYmVyIGluICVyMQorCWNsCSVyMSxCQVNFRCguTG5yX3N5c2NhbGxzKQorCWpubAlzeXNjX25yX29rCisJbGdmcgklcjcsJXIxICAgICAgICAgICAjIGNsZWFyIGhpZ2ggd29yZCBpbiByMQorCXNsYWcgICAgJXI3LCVyNywyICAgICAgICAgIyBzdmMgMDogc3lzdGVtIGNhbGwgbnVtYmVyIGluICVyMQorc3lzY19ucl9vazoKKwltdmMJU1BfQVJHUyg4LCVyMTUpLFNQX1I3KCVyMTUpCitzeXNjX2RvX3Jlc3RhcnQ6CisJbGFybCAgICAlcjEwLHN5c19jYWxsX3RhYmxlCisjaWZkZWYgQ09ORklHX1MzOTBfU1VQUE9SVAorICAgICAgICB0bSAgICAgIFNQX1BTVyszKCVyMTUpLDB4MDEgICMgYXJlIHdlIHJ1bm5pbmcgaW4gMzEgYml0IG1vZGUgPworICAgICAgICBqbyAgICAgIHN5c2Nfbm9lbXUKKwlsYXJsICAgICVyMTAsc3lzX2NhbGxfdGFibGVfZW11ICAjIHVzZSAzMSBiaXQgZW11bGF0aW9uIHN5c3RlbSBjYWxscworc3lzY19ub2VtdToKKyNlbmRpZgorCXRtCV9fVElfZmxhZ3MrNyglcjkpLChfVElGX1NZU0NBTExfVFJBQ0V8X1RJRl9TWVNDQUxMX0FVRElUKQorICAgICAgICBsZ2YgICAgICVyOCwwKCVyNywlcjEwKSAgICMgbG9hZCBhZGRyZXNzIG9mIHN5c3RlbSBjYWxsIHJvdXRpbmUKKyAgICAgICAgam56ICAgICBzeXNjX3RyYWNlc3lzCisgICAgICAgIGJhc3IgICAgJXIxNCwlcjggICAgICAgICAgIyBjYWxsIHN5c194eHh4CisgICAgICAgIHN0ZyAgICAgJXIyLFNQX1IyKCVyMTUpICAgIyBzdG9yZSByZXR1cm4gdmFsdWUgKGNoYW5nZSBSMiBvbiBzdGFjaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEFUVEVOVElPTjogY2hlY2sgc3lzX2V4ZWN2ZV9nbHVlIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2hhbmdpbmcgYW55dGhpbmcgaGVyZSAhIQorCitzeXNjX3JldHVybjoKKyAgICAgICAgdG0gICAgICBTUF9QU1crMSglcjE1KSwweDAxICAgICMgcmV0dXJuaW5nIHRvIHVzZXIgPworICAgICAgICBqbm8gICAgIHN5c2NfbGVhdmUKKwl0bQlfX1RJX2ZsYWdzKzcoJXI5KSxfVElGX1dPUktfU1ZDCisJam56CXN5c2Nfd29yayAgICAgICAgICMgdGhlcmUgaXMgd29yayB0byBkbyAoc2lnbmFscyBldGMuKQorc3lzY19sZWF2ZToKKyAgICAgICAgUkVTVE9SRV9BTEwgMQorCisjCisjIHJlY2hlY2sgaWYgdGhlcmUgaXMgbW9yZSB3b3JrIHRvIGRvCisjCitzeXNjX3dvcmtfbG9vcDoKKwl0bQlfX1RJX2ZsYWdzKzcoJXI5KSxfVElGX1dPUktfU1ZDCisJanoJc3lzY19sZWF2ZSAgICAgICAgIyB0aGVyZSBpcyBubyB3b3JrIHRvIGRvCisjCisjIE9uZSBvZiB0aGUgd29yayBiaXRzIGlzIG9uLiBGaW5kIG91dCB3aGljaCBvbmUuCisjCitzeXNjX3dvcms6CisJdG0JX19USV9mbGFncys3KCVyOSksX1RJRl9ORUVEX1JFU0NIRUQKKwlqbwlzeXNjX3Jlc2NoZWR1bGUKKwl0bQlfX1RJX2ZsYWdzKzcoJXI5KSxfVElGX1NJR1BFTkRJTkcKKwlqbwlzeXNjX3NpZ3BlbmRpbmcKKwl0bQlfX1RJX2ZsYWdzKzcoJXI5KSxfVElGX1JFU1RBUlRfU1ZDCisJam8Jc3lzY19yZXN0YXJ0CisJdG0JX19USV9mbGFncys3KCVyOSksX1RJRl9TSU5HTEVfU1RFUAorCWpvCXN5c2Nfc2luZ2xlc3RlcAorCWoJc3lzY19sZWF2ZQorCisjCisjIF9USUZfTkVFRF9SRVNDSEVEIGlzIHNldCwgY2FsbCBzY2hlZHVsZQorIwkKK3N5c2NfcmVzY2hlZHVsZTogICAgICAgIAorCWxhcmwgICAgJXIxNCxzeXNjX3dvcmtfbG9vcAorICAgICAgICBqZyAgICAgIHNjaGVkdWxlICAgICAgICAgICAgIyByZXR1cm4gcG9pbnQgaXMgc3lzY19yZXR1cm4KKworIworIyBfVElGX1NJR1BFTkRJTkcgaXMgc2V0LCBjYWxsIGRvX3NpZ25hbAorIworc3lzY19zaWdwZW5kaW5nOiAgICAgCisJbmkJX19USV9mbGFncys3KCVyOSksMjU1LV9USUZfU0lOR0xFX1NURVAgIyBjbGVhciBUSUZfU0lOR0xFX1NURVAKKyAgICAgICAgbGEgICAgICAlcjIsU1BfUFRSRUdTKCVyMTUpICMgbG9hZCBwdF9yZWdzCisgICAgICAgIHNnciAgICAgJXIzLCVyMyAgICAgICAgICAgIyBjbGVhciAqb2xkc2V0CisJYnJhc2wJJXIxNCxkb19zaWduYWwgICAgIyBjYWxsIGRvX3NpZ25hbAorCXRtCV9fVElfZmxhZ3MrNyglcjkpLF9USUZfUkVTVEFSVF9TVkMKKwlqbwlzeXNjX3Jlc3RhcnQKKwl0bQlfX1RJX2ZsYWdzKzcoJXI5KSxfVElGX1NJTkdMRV9TVEVQCisJam8Jc3lzY19zaW5nbGVzdGVwCisJaglzeXNjX2xlYXZlICAgICAgICAjIG91dCBvZiBoZXJlLCBkbyBOT1QgcmVjaGVjaworCisjCisjIF9USUZfUkVTVEFSVF9TVkMgaXMgc2V0LCBzZXQgdXAgcmVnaXN0ZXJzIGFuZCByZXN0YXJ0IHN2YworIworc3lzY19yZXN0YXJ0OgorCW5pCV9fVElfZmxhZ3MrNyglcjkpLDI1NS1fVElGX1JFU1RBUlRfU1ZDICMgY2xlYXIgVElGX1JFU1RBUlRfU1ZDCisJbGcJJXI3LFNQX1IyKCVyMTUpICAgICAgICAjIGxvYWQgbmV3IHN2YyBudW1iZXIKKyAgICAgICAgc2xhZyAgICAlcjcsJXI3LDIgICAgICAgICAgICAgICMgKjQKKwltdmMJU1BfUjIoOCwlcjE1KSxTUF9PUklHX1IyKCVyMTUpICMgcmVzdG9yZSBmaXJzdCBhcmd1bWVudAorCWxtZwklcjIsJXI2LFNQX1IyKCVyMTUpICAgICMgbG9hZCBzdmMgYXJndW1lbnRzCisJaglzeXNjX2RvX3Jlc3RhcnQgICAgICAgICMgcmVzdGFydCBzdmMKKworIworIyBfVElGX1NJTkdMRV9TVEVQIGlzIHNldCwgY2FsbCBkb19zaW5nbGVfc3RlcAorIworc3lzY19zaW5nbGVzdGVwOgorCW5pCV9fVElfZmxhZ3MrNyglcjkpLDI1NS1fVElGX1NJTkdMRV9TVEVQICMgY2xlYXIgVElGX1NJTkdMRV9TVEVQCisJbGhpCSVyMCxfX0xDX1BHTV9PTERfUFNXCisJc3RoCSVyMCxTUF9UUkFQKCVyMTUpCSMgc2V0IHRyYXAgaW5kaWNhdGlvbiB0byBwZ20gY2hlY2sKKwlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgYWRkcmVzcyBvZiByZWdpc3Rlci1zYXZlIGFyZWEKKwlsYXJsCSVyMTQsc3lzY19yZXR1cm4JIyBsb2FkIGFkci4gb2Ygc3lzdGVtIHJldHVybgorCWpnCWRvX3NpbmdsZV9zdGVwCQkjIGJyYW5jaCB0byBkb19zaWd0cmFwCisKKworX19jcml0aWNhbF9lbmQ6CisKKyMKKyMgY2FsbCBzeXNjYWxsX3RyYWNlIGJlZm9yZSBhbmQgYWZ0ZXIgc3lzdGVtIGNhbGwKKyMgc3BlY2lhbCBsaW5rYWdlOiAlcjEyIGNvbnRhaW5zIHRoZSByZXR1cm4gYWRkcmVzcyBmb3IgdHJhY2Vfc3ZjCisjCitzeXNjX3RyYWNlc3lzOgorCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkgICAgIyBsb2FkIHB0X3JlZ3MKKwlsYQklcjMsMAorCXNybAklcjcsMgorCXN0ZyAgICAgJXI3LFNQX1IyKCVyMTUpCisgICAgICAgIGJyYXNsICAgJXIxNCxzeXNjYWxsX3RyYWNlCisJbGdoaQklcjAsTlJfc3lzY2FsbHMKKwljbGcJJXIwLFNQX1IyKCVyMTUpCisJam5oCXN5c2NfdHJhY2Vub2dvCisJbGcJJXI3LFNQX1IyKCVyMTUpICAgIyBzdHJhY2UgbWlnaHQgaGF2ZSBjaGFuZ2VkIHRoZQorCXNsbCAgICAgJXI3LDIgICAgICAgICAgICAgIyAgc3lzdGVtIGNhbGwKKwlsZ2YJJXI4LDAoJXI3LCVyMTApCitzeXNjX3RyYWNlZ286CisJbG1nICAgICAlcjMsJXI2LFNQX1IzKCVyMTUpCisJbGcgICAgICAlcjIsU1BfT1JJR19SMiglcjE1KQorICAgICAgICBiYXNyICAgICVyMTQsJXI4ICAgICAgICAgICAgIyBjYWxsIHN5c194eHgKKyAgICAgICAgc3RnICAgICAlcjIsU1BfUjIoJXIxNSkgICAgICMgc3RvcmUgcmV0dXJuIHZhbHVlCitzeXNjX3RyYWNlbm9nbzoKKwl0bQlfX1RJX2ZsYWdzKzcoJXI5KSwoX1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU1lTQ0FMTF9BVURJVCkKKyAgICAgICAganogICAgICBzeXNjX3JldHVybgorCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkgICAgIyBsb2FkIHB0X3JlZ3MKKwlsYQklcjMsMQorCWxhcmwJJXIxNCxzeXNjX3JldHVybiAgICAjIHJldHVybiBwb2ludCBpcyBzeXNjX3JldHVybgorCWpnCXN5c2NhbGxfdHJhY2UKKworIworIyBhIG5ldyBwcm9jZXNzIGV4aXRzIHRoZSBrZXJuZWwgd2l0aCByZXRfZnJvbV9mb3JrCisjCisgICAgICAgIC5nbG9ibCAgcmV0X2Zyb21fZm9yaworcmV0X2Zyb21fZm9yazoKKwlsZwklcjEzLF9fTENfU1ZDX05FV19QU1crOAorCWxnCSVyOSxfX0xDX1RIUkVBRF9JTkZPCSMgbG9hZCBwb2ludGVyIHRvIHRocmVhZF9pbmZvIHN0cnVjdAorCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyBmb3JraW5nIGEga2VybmVsIHRocmVhZCA/CisJam8JMGYKKwlzdGcJJXIxNSxTUF9SMTUoJXIxNSkJIyBzdG9yZSBzdGFjayBwb2ludGVyIGZvciBuZXcga3RocmVhZAorMDoJYnJhc2wgICAlcjE0LHNjaGVkdWxlX3RhaWwKKyAgICAgICAgc3Rvc20gICAyNCglcjE1KSwweDAzICAgICAjIHJlZW5hYmxlIGludGVycnVwdHMKKwlqCXN5c2NfcmV0dXJuCisKKyMKKyMgY2xvbmUsIGZvcmssIHZmb3JrLCBleGVjIGFuZCBzaWdyZXR1cm4gbmVlZCBnbHVlLAorIyBiZWNhdXNlIHRoZXkgYWxsIGV4cGVjdCBwdF9yZWdzIGFzIHBhcmFtZXRlciwKKyMgYnV0IGFyZSBjYWxsZWQgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVyLgorIyByZXR1cm4tYWRkcmVzcyBpcyBzZXQgdXAgYWJvdmUKKyMKK3N5c19jbG9uZV9nbHVlOiAKKyAgICAgICAgbGEgICAgICAlcjIsU1BfUFRSRUdTKCVyMTUpICAgICMgbG9hZCBwdF9yZWdzCisgICAgICAgIGpnICAgICAgc3lzX2Nsb25lICAgICAgICAgICAgICAjIGJyYW5jaCB0byBzeXNfY2xvbmUKKworI2lmZGVmIENPTkZJR19TMzkwX1NVUFBPUlQKK3N5czMyX2Nsb25lX2dsdWU6IAorICAgICAgICBsYSAgICAgICVyMixTUF9QVFJFR1MoJXIxNSkgICAgIyBsb2FkIHB0X3JlZ3MKKyAgICAgICAgamcgICAgICBzeXMzMl9jbG9uZSAgICAgICAgICAgICMgYnJhbmNoIHRvIHN5czMyX2Nsb25lCisjZW5kaWYKKworc3lzX2ZvcmtfZ2x1ZTogIAorICAgICAgICBsYSAgICAgICVyMixTUF9QVFJFR1MoJXIxNSkgICAgIyBsb2FkIHB0X3JlZ3MKKyAgICAgICAgamcgICAgICBzeXNfZm9yayAgICAgICAgICAgICAgICMgYnJhbmNoIHRvIHN5c19mb3JrCisKK3N5c192Zm9ya19nbHVlOiAKKyAgICAgICAgbGEgICAgICAlcjIsU1BfUFRSRUdTKCVyMTUpICAgICMgbG9hZCBwdF9yZWdzCisgICAgICAgIGpnICAgICAgc3lzX3Zmb3JrICAgICAgICAgICAgICAjIGJyYW5jaCB0byBzeXNfdmZvcmsKKworc3lzX2V4ZWN2ZV9nbHVlOiAgICAgICAgCisgICAgICAgIGxhICAgICAgJXIyLFNQX1BUUkVHUyglcjE1KSAgICMgbG9hZCBwdF9yZWdzCisJbGdyICAgICAlcjEyLCVyMTQgICAgICAgICAgICAgIyBzYXZlIHJldHVybiBhZGRyZXNzCisgICAgICAgIGJyYXNsICAgJXIxNCxzeXNfZXhlY3ZlICAgICAgICMgY2FsbCBzeXNfZXhlY3ZlCisgICAgICAgIGx0Z3IgICAgJXIyLCVyMiAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZXhlY3ZlIGZhaWxlZAorICAgICAgICBibnogICAgIDAoJXIxMikgICAgICAgICAgICAgICAjIGl0IGRpZCBmYWlsIC0+IHN0b3JlIHJlc3VsdCBpbiBncHIyCisgICAgICAgIGIgICAgICAgNiglcjEyKSAgICAgICAgICAgICAgICMgU0tJUCBTVEcgMixTUF9SMigxNSkgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzeXN0ZW1fY2FsbC9zeXNjX3RyYWNlc3lzCisjaWZkZWYgQ09ORklHX1MzOTBfU1VQUE9SVAorc3lzMzJfZXhlY3ZlX2dsdWU6ICAgICAgICAKKyAgICAgICAgbGEgICAgICAlcjIsU1BfUFRSRUdTKCVyMTUpICAgIyBsb2FkIHB0X3JlZ3MKKwlsZ3IgICAgICVyMTIsJXIxNCAgICAgICAgICAgICAjIHNhdmUgcmV0dXJuIGFkZHJlc3MKKyAgICAgICAgYnJhc2wgICAlcjE0LHN5czMyX2V4ZWN2ZSAgICAgIyBjYWxsIHN5czMyX2V4ZWN2ZQorICAgICAgICBsdGdyICAgICVyMiwlcjIgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGV4ZWN2ZSBmYWlsZWQKKyAgICAgICAgYm56ICAgICAwKCVyMTIpICAgICAgICAgICAgICAgIyBpdCBkaWQgZmFpbCAtPiBzdG9yZSByZXN1bHQgaW4gZ3ByMgorICAgICAgICBiICAgICAgIDYoJXIxMikgICAgICAgICAgICAgICAjIFNLSVAgU1RHIDIsU1BfUjIoMTUpIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3lzdGVtX2NhbGwvc3lzY190cmFjZXN5cworI2VuZGlmCisKK3N5c19zaWdyZXR1cm5fZ2x1ZTogICAgIAorICAgICAgICBsYSAgICAgICVyMixTUF9QVFJFR1MoJXIxNSkgICAjIGxvYWQgcHRfcmVncyBhcyBwYXJhbWV0ZXIKKyAgICAgICAgamcgICAgICBzeXNfc2lncmV0dXJuICAgICAgICAgIyBicmFuY2ggdG8gc3lzX3NpZ3JldHVybgorCisjaWZkZWYgQ09ORklHX1MzOTBfU1VQUE9SVAorc3lzMzJfc2lncmV0dXJuX2dsdWU6ICAgICAKKyAgICAgICAgbGEgICAgICAlcjIsU1BfUFRSRUdTKCVyMTUpICAgIyBsb2FkIHB0X3JlZ3MgYXMgcGFyYW1ldGVyCisgICAgICAgIGpnICAgICAgc3lzMzJfc2lncmV0dXJuICAgICAgICMgYnJhbmNoIHRvIHN5czMyX3NpZ3JldHVybgorI2VuZGlmCisKK3N5c19ydF9zaWdyZXR1cm5fZ2x1ZTogICAgIAorICAgICAgICBsYSAgICAgICVyMixTUF9QVFJFR1MoJXIxNSkgICAjIGxvYWQgcHRfcmVncyBhcyBwYXJhbWV0ZXIKKyAgICAgICAgamcgICAgICBzeXNfcnRfc2lncmV0dXJuICAgICAgIyBicmFuY2ggdG8gc3lzX3NpZ3JldHVybgorCisjaWZkZWYgQ09ORklHX1MzOTBfU1VQUE9SVAorc3lzMzJfcnRfc2lncmV0dXJuX2dsdWU6ICAgICAKKyAgICAgICAgbGEgICAgICAlcjIsU1BfUFRSRUdTKCVyMTUpICAgIyBsb2FkIHB0X3JlZ3MgYXMgcGFyYW1ldGVyCisgICAgICAgIGpnICAgICAgc3lzMzJfcnRfc2lncmV0dXJuICAgICMgYnJhbmNoIHRvIHN5czMyX3NpZ3JldHVybgorI2VuZGlmCisKKyMKKyMgc2lnc3VzcGVuZCBhbmQgcnRfc2lnc3VzcGVuZCBuZWVkIHB0X3JlZ3MgYXMgYW4gYWRkaXRpb25hbAorIyBwYXJhbWV0ZXIgYW5kIHRoZXkgaGF2ZSB0byBza2lwIHRoZSBzdG9yZSBvZiAlcjIgaW50byB0aGUKKyMgdXNlciByZWdpc3RlciAlcjIgYmVjYXVzZSB0aGUgcmV0dXJuIHZhbHVlIHdhcyBzZXQgaW4gCisjIHNpZ3N1c3BlbmQgYW5kIHJ0X3NpZ3N1c3BlbmQgYWxyZWFkeSBhbmQgbXVzdCBub3QgYmUgb3ZlcndyaXR0ZW4hCisjCisKK3N5c19zaWdzdXNwZW5kX2dsdWU6ICAgIAorICAgICAgICBsZ3IgICAgICVyNSwlcjQgICAgICAgICAgICAgICAjIG1vdmUgbWFzayBiYWNrCisgICAgICAgIGxnciAgICAgJXI0LCVyMyAgICAgICAgICAgICAgICMgbW92ZSBoaXN0b3J5MSBwYXJhbWV0ZXIKKyAgICAgICAgbGdyICAgICAlcjMsJXIyICAgICAgICAgICAgICAgIyBtb3ZlIGhpc3RvcnkwIHBhcmFtZXRlcgorICAgICAgICBsYSAgICAgICVyMixTUF9QVFJFR1MoJXIxNSkgICAjIGxvYWQgcHRfcmVncyBhcyBmaXJzdCBwYXJhbWV0ZXIKKwlsYSAgICAgICVyMTQsNiglcjE0KSAgICAgICAgICAjIHNraXAgc3RvcmUgb2YgcmV0dXJuIHZhbHVlCisgICAgICAgIGpnICAgICAgc3lzX3NpZ3N1c3BlbmQgICAgICAgICMgYnJhbmNoIHRvIHN5c19zaWdzdXNwZW5kCisKKyNpZmRlZiBDT05GSUdfUzM5MF9TVVBQT1JUCitzeXMzMl9zaWdzdXNwZW5kX2dsdWU6ICAgIAorCWxsZ2ZyCSVyNCwlcjQgICAgICAgICAgICAgICAjIHVuc2lnbmVkIGxvbmcJCQkKKyAgICAgICAgbGdyICAgICAlcjUsJXI0ICAgICAgICAgICAgICAgIyBtb3ZlIG1hc2sgYmFjaworCWxnZnIJJXIzLCVyMyAgICAgICAgICAgICAgICMgaW50CQkJCisgICAgICAgIGxnciAgICAgJXI0LCVyMyAgICAgICAgICAgICAgICMgbW92ZSBoaXN0b3J5MSBwYXJhbWV0ZXIKKwlsZ2ZyCSVyMiwlcjIgICAgICAgICAgICAgICAjIGludAkJCQorICAgICAgICBsZ3IgICAgICVyMywlcjIgICAgICAgICAgICAgICAjIG1vdmUgaGlzdG9yeTAgcGFyYW1ldGVyCisgICAgICAgIGxhICAgICAgJXIyLFNQX1BUUkVHUyglcjE1KSAgICMgbG9hZCBwdF9yZWdzIGFzIGZpcnN0IHBhcmFtZXRlcgorCWxhICAgICAgJXIxNCw2KCVyMTQpICAgICAgICAgICMgc2tpcCBzdG9yZSBvZiByZXR1cm4gdmFsdWUKKyAgICAgICAgamcgICAgICBzeXMzMl9zaWdzdXNwZW5kICAgICAgIyBicmFuY2ggdG8gc3lzMzJfc2lnc3VzcGVuZAorI2VuZGlmCisKK3N5c19ydF9zaWdzdXNwZW5kX2dsdWU6IAorICAgICAgICBsZ3IgICAgICVyNCwlcjMgICAgICAgICAgICAgICAjIG1vdmUgc2lnc2V0c2l6ZSBwYXJhbWV0ZXIKKyAgICAgICAgbGdyICAgICAlcjMsJXIyICAgICAgICAgICAgICAgIyBtb3ZlIHVuZXdzZXQgcGFyYW1ldGVyCisgICAgICAgIGxhICAgICAgJXIyLFNQX1BUUkVHUyglcjE1KSAgICMgbG9hZCBwdF9yZWdzIGFzIGZpcnN0IHBhcmFtZXRlcgorCWxhICAgICAgJXIxNCw2KCVyMTQpICAgICAgICAgICMgc2tpcCBzdG9yZSBvZiByZXR1cm4gdmFsdWUKKyAgICAgICAgamcgICAgICBzeXNfcnRfc2lnc3VzcGVuZCAgICAgIyBicmFuY2ggdG8gc3lzX3J0X3NpZ3N1c3BlbmQKKworI2lmZGVmIENPTkZJR19TMzkwX1NVUFBPUlQKK3N5czMyX3J0X3NpZ3N1c3BlbmRfZ2x1ZTogCisJbGxnZnIJJXIzLCVyMyAgICAgICAgICAgICAgICMgc2l6ZV90CQkJCisgICAgICAgIGxnciAgICAgJXI0LCVyMyAgICAgICAgICAgICAgICMgbW92ZSBzaWdzZXRzaXplIHBhcmFtZXRlcgorCWxsZ3RyCSVyMiwlcjIgICAgICAgICAgICAgICAjIHNpZ3NldF9lbXUzMV90ICoKKyAgICAgICAgbGdyICAgICAlcjMsJXIyICAgICAgICAgICAgICAgIyBtb3ZlIHVuZXdzZXQgcGFyYW1ldGVyCisgICAgICAgIGxhICAgICAgJXIyLFNQX1BUUkVHUyglcjE1KSAgICMgbG9hZCBwdF9yZWdzIGFzIGZpcnN0IHBhcmFtZXRlcgorCWxhICAgICAgJXIxNCw2KCVyMTQpICAgICAgICAgICMgc2tpcCBzdG9yZSBvZiByZXR1cm4gdmFsdWUKKyAgICAgICAgamcgICAgICBzeXMzMl9ydF9zaWdzdXNwZW5kICAgIyBicmFuY2ggdG8gc3lzMzJfcnRfc2lnc3VzcGVuZAorI2VuZGlmCisKK3N5c19zaWdhbHRzdGFja19nbHVlOgorICAgICAgICBsYSAgICAgICVyNCxTUF9QVFJFR1MoJXIxNSkgICAjIGxvYWQgcHRfcmVncyBhcyBwYXJhbWV0ZXIKKyAgICAgICAgamcgICAgICBzeXNfc2lnYWx0c3RhY2sgICAgICAgIyBicmFuY2ggdG8gc3lzX3NpZ3JldHVybgorCisjaWZkZWYgQ09ORklHX1MzOTBfU1VQUE9SVAorc3lzMzJfc2lnYWx0c3RhY2tfZ2x1ZToKKyAgICAgICAgbGEgICAgICAlcjQsU1BfUFRSRUdTKCVyMTUpICAgIyBsb2FkIHB0X3JlZ3MgYXMgcGFyYW1ldGVyCisgICAgICAgIGpnICAgICAgc3lzMzJfc2lnYWx0c3RhY2tfd3JhcHBlciAjIGJyYW5jaCB0byBzeXNfc2lncmV0dXJuCisjZW5kaWYKKworLyoKKyAqIFByb2dyYW0gY2hlY2sgaGFuZGxlciByb3V0aW5lCisgKi8KKworICAgICAgICAuZ2xvYmwgIHBnbV9jaGVja19oYW5kbGVyCitwZ21fY2hlY2tfaGFuZGxlcjoKKy8qCisgKiBGaXJzdCB3ZSBuZWVkIHRvIGNoZWNrIGZvciBhIHNwZWNpYWwgY2FzZToKKyAqIFNpbmdsZSBzdGVwcGluZyBhbiBpbnN0cnVjdGlvbiB0aGF0IGRpc2FibGVzIHRoZSBQRVIgZXZlbnQgbWFzayB3aWxsCisgKiBjYXVzZSBhIFBFUiBldmVudCBBRlRFUiB0aGUgbWFzayBoYXMgYmVlbiBzZXQuIEV4YW1wbGU6IFNWQyBvciBMUFNXLgorICogRm9yIGEgc2luZ2xlIHN0ZXBwZWQgU1ZDIHRoZSBwcm9ncmFtIGNoZWNrIGhhbmRsZXIgZ2V0cyBjb250cm9sIGFmdGVyCisgKiB0aGUgU1ZDIG5ldyBQU1cgaGFzIGJlZW4gbG9hZGVkLiBCdXQgd2Ugd2FudCB0byBleGVjdXRlIHRoZSBTVkMgZmlyc3QgYW5kCisgKiB0aGVuIGhhbmRsZSB0aGUgUEVSIGV2ZW50LiBUaGVyZWZvcmUgd2UgdXBkYXRlIHRoZSBTVkMgb2xkIFBTVyB0byBwb2ludAorICogdG8gdGhlIHBnbV9jaGVja19oYW5kbGVyIGFuZCBicmFuY2ggdG8gdGhlIFNWQyBoYW5kbGVyIGFmdGVyIHdlIGNoZWNrZWQKKyAqIGlmIHdlIGhhdmUgdG8gbG9hZCB0aGUga2VybmVsIHN0YWNrIHJlZ2lzdGVyLgorICogRm9yIGV2ZXJ5IG90aGVyIHBvc3NpYmxlIGNhdXNlIGZvciBQRVIgZXZlbnQgd2l0aG91dCB0aGUgUEVSIG1hc2sgc2V0CisgKiB3ZSBqdXN0IGlnbm9yZSB0aGUgUEVSIGV2ZW50IChGSVhNRTogaXMgdGhlcmUgYW55dGhpbmcgd2UgaGF2ZSB0byBkbworICogZm9yIExQU1c/KS4KKyAqLworCVNUT1JFX1RJTUVSIF9fTENfU1lOQ19FTlRFUl9USU1FUgorCVNBVkVfQUxMX0JBU0UgX19MQ19TQVZFX0FSRUEKKyAgICAgICAgdG0gICAgICBfX0xDX1BHTV9JTlRfQ09ERSsxLDB4ODAgIyBjaGVjayB3aGV0aGVyIHdlIGdvdCBhIHBlciBleGNlcHRpb24KKyAgICAgICAgam56ICAgICBwZ21fcGVyICAgICAgICAgICAgICAgICAgIyBnb3QgcGVyIGV4Y2VwdGlvbiAtPiBzcGVjaWFsIGNhc2UKKwlTQVZFX0FMTCBfX0xDX1BHTV9PTERfUFNXLF9fTENfU0FWRV9BUkVBLDEKKyNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORworCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyBpbnRlcnJ1cHRpbmcgZnJvbSB1c2VyID8KKwlqeglwZ21fbm9fdnRpbWUKKwlVUERBVEVfVlRJTUUgX19MQ19FWElUX1RJTUVSLF9fTENfU1lOQ19FTlRFUl9USU1FUixfX0xDX1VTRVJfVElNRVIKKwlVUERBVEVfVlRJTUUgX19MQ19MQVNUX1VQREFURV9USU1FUixfX0xDX0VYSVRfVElNRVIsX19MQ19TWVNURU1fVElNRVIKKwltdmMJX19MQ19MQVNUX1VQREFURV9USU1FUig4KSxfX0xDX1NZTkNfRU5URVJfVElNRVIKK3BnbV9ub192dGltZToKKyNlbmRpZgorCWxnCSVyOSxfX0xDX1RIUkVBRF9JTkZPCSMgbG9hZCBwb2ludGVyIHRvIHRocmVhZF9pbmZvIHN0cnVjdAorCWxnZiAgICAgJXIzLF9fTENfUEdNX0lMQwkgIyBsb2FkIHByb2dyYW0gaW50ZXJydXB0aW9uIGNvZGUKKwlsZ2hpCSVyOCwweDdmCisJbmdyCSVyOCwlcjMKK3BnbV9kb19jYWxsOgorICAgICAgICBzbGwgICAgICVyOCwzCisgICAgICAgIGxhcmwgICAgJXIxLHBnbV9jaGVja190YWJsZQorICAgICAgICBsZyAgICAgICVyMSwwKCVyOCwlcjEpCQkgIyBsb2FkIGFkZHJlc3Mgb2YgaGFuZGxlciByb3V0aW5lCisgICAgICAgIGxhICAgICAgJXIyLFNQX1BUUkVHUyglcjE1KQkgIyBhZGRyZXNzIG9mIHJlZ2lzdGVyLXNhdmUgYXJlYQorCWxhcmwJJXIxNCxzeXNjX3JldHVybgorICAgICAgICBiciAgICAgICVyMQkJCSAjIGJyYW5jaCB0byBpbnRlcnJ1cHQtaGFuZGxlcgorCisjCisjIGhhbmRsZSBwZXIgZXhjZXB0aW9uCisjCitwZ21fcGVyOgorICAgICAgICB0bSAgICAgIF9fTENfUEdNX09MRF9QU1csMHg0MCAgICAjIHRlc3QgaWYgcGVyIGV2ZW50IHJlY29yZGluZyBpcyBvbgorICAgICAgICBqbnogICAgIHBnbV9wZXJfc3RkICAgICAgICAgICAgICAjIG9rLCBub3JtYWwgcGVyIGV2ZW50IGZyb20gdXNlciBzcGFjZQorIyBvayBpdHMgb25lIG9mIHRoZSBzcGVjaWFsIGNhc2VzLCBub3cgd2UgbmVlZCB0byBmaW5kIG91dCB3aGljaCBvbmUKKyAgICAgICAgY2xjICAgICBfX0xDX1BHTV9PTERfUFNXKDE2KSxfX0xDX1NWQ19ORVdfUFNXCisgICAgICAgIGplICAgICAgcGdtX3N2Y3BlcgorIyBubyBpbnRlcmVzdGluZyBzcGVjaWFsIGNhc2UsIGlnbm9yZSBQRVIgZXZlbnQKKwlsbWcJJXIxMiwlcjE1LF9fTENfU0FWRV9BUkVBCisJbHBzd2UgICBfX0xDX1BHTV9PTERfUFNXCisKKyMKKyMgTm9ybWFsIHBlciBleGNlcHRpb24KKyMKK3BnbV9wZXJfc3RkOgorCVNBVkVfQUxMIF9fTENfUEdNX09MRF9QU1csX19MQ19TQVZFX0FSRUEsMQorI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCisJdG0JU1BfUFNXKzEoJXIxNSksMHgwMQkjIGludGVycnVwdGluZyBmcm9tIHVzZXIgPworCWp6CXBnbV9ub192dGltZTIKKwlVUERBVEVfVlRJTUUgX19MQ19FWElUX1RJTUVSLF9fTENfU1lOQ19FTlRFUl9USU1FUixfX0xDX1VTRVJfVElNRVIKKwlVUERBVEVfVlRJTUUgX19MQ19MQVNUX1VQREFURV9USU1FUixfX0xDX0VYSVRfVElNRVIsX19MQ19TWVNURU1fVElNRVIKKwltdmMJX19MQ19MQVNUX1VQREFURV9USU1FUig4KSxfX0xDX1NZTkNfRU5URVJfVElNRVIKK3BnbV9ub192dGltZTI6CisjZW5kaWYKKwlsZwklcjksX19MQ19USFJFQURfSU5GTwkjIGxvYWQgcG9pbnRlciB0byB0aHJlYWRfaW5mbyBzdHJ1Y3QKKwlsZwklcjEsX19USV90YXNrKCVyOSkKKwltdmMJX19USFJFQURfcGVyK19fUEVSX2F0bWlkKDIsJXIxKSxfX0xDX1BFUl9BVE1JRAorCW12YwlfX1RIUkVBRF9wZXIrX19QRVJfYWRkcmVzcyg4LCVyMSksX19MQ19QRVJfQUREUkVTUworCW12YwlfX1RIUkVBRF9wZXIrX19QRVJfYWNjZXNzX2lkKDEsJXIxKSxfX0xDX1BFUl9BQ0NFU1NfSUQKKwlvaQlfX1RJX2ZsYWdzKzcoJXI5KSxfVElGX1NJTkdMRV9TVEVQICMgc2V0IFRJRl9TSU5HTEVfU1RFUAorCWxnZiAgICAgJXIzLF9fTENfUEdNX0lMQwkgIyBsb2FkIHByb2dyYW0gaW50ZXJydXB0aW9uIGNvZGUKKwlsZ2hpCSVyOCwweDdmCisJbmdyCSVyOCwlcjMJCQkgIyBjbGVhciBwZXItZXZlbnQtYml0IGFuZCBpbGMKKwlqZQlzeXNjX3JldHVybgorCWoJcGdtX2RvX2NhbGwKKworIworIyBpdCB3YXMgYSBzaW5nbGUgc3RlcHBlZCBTVkMgdGhhdCBpcyBjYXVzaW5nIGFsbCB0aGUgdHJvdWJsZQorIworcGdtX3N2Y3BlcjoKKwlTQVZFX0FMTCBfX0xDX1NWQ19PTERfUFNXLF9fTENfU0FWRV9BUkVBLDEKKyNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORworCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyBpbnRlcnJ1cHRpbmcgZnJvbSB1c2VyID8KKwlqeglwZ21fbm9fdnRpbWUzCisJVVBEQVRFX1ZUSU1FIF9fTENfRVhJVF9USU1FUixfX0xDX1NZTkNfRU5URVJfVElNRVIsX19MQ19VU0VSX1RJTUVSCisJVVBEQVRFX1ZUSU1FIF9fTENfTEFTVF9VUERBVEVfVElNRVIsX19MQ19FWElUX1RJTUVSLF9fTENfU1lTVEVNX1RJTUVSCisJbXZjCV9fTENfTEFTVF9VUERBVEVfVElNRVIoOCksX19MQ19TWU5DX0VOVEVSX1RJTUVSCitwZ21fbm9fdnRpbWUzOgorI2VuZGlmCisJbGxnaCAgICAlcjcsX19MQ19TVkNfSU5UX0NPREUJIyBnZXQgc3ZjIG51bWJlciBmcm9tIGxvd2NvcmUKKwlsZwklcjksX19MQ19USFJFQURfSU5GTwkjIGxvYWQgcG9pbnRlciB0byB0aHJlYWRfaW5mbyBzdHJ1Y3QKKwlsZwklcjEsX19USV90YXNrKCVyOSkKKwltdmMJX19USFJFQURfcGVyK19fUEVSX2F0bWlkKDIsJXIxKSxfX0xDX1BFUl9BVE1JRAorCW12YwlfX1RIUkVBRF9wZXIrX19QRVJfYWRkcmVzcyg4LCVyMSksX19MQ19QRVJfQUREUkVTUworCW12YwlfX1RIUkVBRF9wZXIrX19QRVJfYWNjZXNzX2lkKDEsJXIxKSxfX0xDX1BFUl9BQ0NFU1NfSUQKKwlvaQlfX1RJX2ZsYWdzKzcoJXI5KSxfVElGX1NJTkdMRV9TVEVQICMgc2V0IFRJRl9TSU5HTEVfU1RFUAorCXN0b3NtCV9fU0ZfRU1QVFkoJXIxNSksMHgwMwkjIHJlZW5hYmxlIGludGVycnVwdHMKKwlqCXN5c2NfZG9fc3ZjCisKKy8qCisgKiBJTyBpbnRlcnJ1cHQgaGFuZGxlciByb3V0aW5lCisgKi8KKyAgICAgICAgLmdsb2JsIGlvX2ludF9oYW5kbGVyCitpb19pbnRfaGFuZGxlcjoKKwlTVE9SRV9USU1FUiBfX0xDX0FTWU5DX0VOVEVSX1RJTUVSCisJc3RjawlfX0xDX0lOVF9DTE9DSworCVNBVkVfQUxMX0JBU0UgX19MQ19TQVZFX0FSRUErMzIKKyAgICAgICAgU0FWRV9BTEwgX19MQ19JT19PTERfUFNXLF9fTENfU0FWRV9BUkVBKzMyLDAKKyNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORworCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyBpbnRlcnJ1cHRpbmcgZnJvbSB1c2VyID8KKwlqeglpb19ub192dGltZQorCVVQREFURV9WVElNRSBfX0xDX0VYSVRfVElNRVIsX19MQ19BU1lOQ19FTlRFUl9USU1FUixfX0xDX1VTRVJfVElNRVIKKwlVUERBVEVfVlRJTUUgX19MQ19MQVNUX1VQREFURV9USU1FUixfX0xDX0VYSVRfVElNRVIsX19MQ19TWVNURU1fVElNRVIKKwltdmMJX19MQ19MQVNUX1VQREFURV9USU1FUig4KSxfX0xDX0FTWU5DX0VOVEVSX1RJTUVSCitpb19ub192dGltZToKKyNlbmRpZgorCWxnCSVyOSxfX0xDX1RIUkVBRF9JTkZPCSMgbG9hZCBwb2ludGVyIHRvIHRocmVhZF9pbmZvIHN0cnVjdAorICAgICAgICBsYSAgICAgICVyMixTUF9QVFJFR1MoJXIxNSkgICAgIyBhZGRyZXNzIG9mIHJlZ2lzdGVyLXNhdmUgYXJlYQorCWJyYXNsICAgJXIxNCxkb19JUlEgICAgICAgICAgICAjIGNhbGwgc3RhbmRhcmQgaXJxIGhhbmRsZXIKKworaW9fcmV0dXJuOgorICAgICAgICB0bSAgICAgIFNQX1BTVysxKCVyMTUpLDB4MDEgICAgIyByZXR1cm5pbmcgdG8gdXNlciA/CisjaWZkZWYgQ09ORklHX1BSRUVNUFQKKwlqbm8gICAgIGlvX3ByZWVtcHQgICAgICAgICAgICAgIyBubyAtPiBjaGVjayBmb3IgcHJlZW1wdGl2ZSBzY2hlZHVsaW5nCisjZWxzZQorICAgICAgICBqbm8gICAgIGlvX2xlYXZlICAgICAgICAgICAgICAgIyBuby0+IHNraXAgcmVzY2hlZCAmIHNpZ25hbAorI2VuZGlmCisJdG0JX19USV9mbGFncys3KCVyOSksX1RJRl9XT1JLX0lOVAorCWpueglpb193b3JrICAgICAgICAgICAgICAgICMgdGhlcmUgaXMgd29yayB0byBkbyAoc2lnbmFscyBldGMuKQoraW9fbGVhdmU6CisgICAgICAgIFJFU1RPUkVfQUxMIDAKKworI2lmZGVmIENPTkZJR19QUkVFTVBUCitpb19wcmVlbXB0OgorCWljbQklcjAsMTUsX19USV9wcmVjb3VudCglcjkpCQorCWpueiAgICAgaW9fbGVhdmUKKwkjIHN3aXRjaCB0byBrZXJuZWwgc3RhY2sKKwlsZwklcjEsU1BfUjE1KCVyMTUpCisJYWdoaQklcjEsLVNQX1NJWkUKKwltdmMJU1BfUFRSRUdTKF9fUFRfU0laRSwlcjEpLFNQX1BUUkVHUyglcjE1KQorICAgICAgICB4YyAgICAgIF9fU0ZfQkFDS0NIQUlOKDgsJXIxKSxfX1NGX0JBQ0tDSEFJTiglcjEpICMgY2xlYXIgYmFjayBjaGFpbgorCWxncgklcjE1LCVyMQoraW9fcmVzdW1lX2xvb3A6CisJdG0JX19USV9mbGFncys3KCVyOSksX1RJRl9ORUVEX1JFU0NIRUQKKwlqbm8JaW9fbGVhdmUKKwlsYXJsICAgICVyMSwuTGNfcGFjdGl2ZQorCW12YyAgICAgX19USV9wcmVjb3VudCg0LCVyOSksMCglcjEpCisgICAgICAgIHN0b3NtICAgX19TRl9FTVBUWSglcjE1KSwweDAzICAgIyByZWVuYWJsZSBpbnRlcnJ1cHRzCisJYnJhc2wgICAlcjE0LHNjaGVkdWxlICAgICAgICAgICMgY2FsbCBzY2hlZHVsZQorICAgICAgICBzdG5zbSAgIF9fU0ZfRU1QVFkoJXIxNSksMHhmYyAgICMgZGlzYWJsZSBJL08gYW5kIGV4dC4gaW50ZXJydXB0cworCXhjICAgICAgX19USV9wcmVjb3VudCg0LCVyOSksX19USV9wcmVjb3VudCglcjkpCisJaglpb19yZXN1bWVfbG9vcAorI2VuZGlmCisKKyMKKyMgc3dpdGNoIHRvIGtlcm5lbCBzdGFjaywgdGhlbiBjaGVjayBUSUYgYml0cworIworaW9fd29yazoKKwlsZwklcjEsX19MQ19LRVJORUxfU1RBQ0sKKwlhZ2hpCSVyMSwtU1BfU0laRQorCW12YwlTUF9QVFJFR1MoX19QVF9TSVpFLCVyMSksU1BfUFRSRUdTKCVyMTUpCisgICAgICAgIHhjICAgICAgX19TRl9CQUNLQ0hBSU4oOCwlcjEpLF9fU0ZfQkFDS0NIQUlOKCVyMSkgIyBjbGVhciBiYWNrIGNoYWluCisJbGdyCSVyMTUsJXIxCisjCisjIE9uZSBvZiB0aGUgd29yayBiaXRzIGlzIG9uLiBGaW5kIG91dCB3aGljaCBvbmUuCisjIENoZWNrZWQgYXJlOiBfVElGX1NJR1BFTkRJTkcgYW5kIF9USUZfTkVFRF9SRVNDSEVECisjCitpb193b3JrX2xvb3A6CisJdG0JX19USV9mbGFncys3KCVyOSksX1RJRl9ORUVEX1JFU0NIRUQKKwlqbwlpb19yZXNjaGVkdWxlCisJdG0JX19USV9mbGFncys3KCVyOSksX1RJRl9TSUdQRU5ESU5HCisJam8JaW9fc2lncGVuZGluZworCWoJaW9fbGVhdmUKKworIworIyBfVElGX05FRURfUkVTQ0hFRCBpcyBzZXQsIGNhbGwgc2NoZWR1bGUKKyMJCitpb19yZXNjaGVkdWxlOiAgICAgICAgCisJc3Rvc20gICBfX1NGX0VNUFRZKCVyMTUpLDB4MDMJIyByZWVuYWJsZSBpbnRlcnJ1cHRzCisJYnJhc2wgICAlcjE0LHNjaGVkdWxlCQkjIGNhbGwgc2NoZWR1bGVyCisJc3Ruc20gICBfX1NGX0VNUFRZKCVyMTUpLDB4ZmMJIyBkaXNhYmxlIEkvTyBhbmQgZXh0LiBpbnRlcnJ1cHRzCisJdG0JX19USV9mbGFncys3KCVyOSksX1RJRl9XT1JLX0lOVAorCWp6CWlvX2xlYXZlCQkjIHRoZXJlIGlzIG5vIHdvcmsgdG8gZG8KKwlqCWlvX3dvcmtfbG9vcAorCisjCisjIF9USUZfU0lHUEVORElORyBpcyBzZXQsIGNhbGwgZG9fc2lnbmFsCisjCitpb19zaWdwZW5kaW5nOiAgICAgCisJc3Rvc20gICBfX1NGX0VNUFRZKCVyMTUpLDB4MDMJIyByZWVuYWJsZSBpbnRlcnJ1cHRzCisJbGEgICAgICAlcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzCisJc2xnciAgICAlcjMsJXIzCQkJIyBjbGVhciAqb2xkc2V0CisJYnJhc2wJJXIxNCxkb19zaWduYWwJCSMgY2FsbCBkb19zaWduYWwKKwlzdG5zbSAgIF9fU0ZfRU1QVFkoJXIxNSksMHhmYwkjIGRpc2FibGUgSS9PIGFuZCBleHQuIGludGVycnVwdHMKKwlqCXN5c2NfbGVhdmUJCSMgb3V0IG9mIGhlcmUsIGRvIE5PVCByZWNoZWNrCisKKy8qCisgKiBFeHRlcm5hbCBpbnRlcnJ1cHQgaGFuZGxlciByb3V0aW5lCisgKi8KKyAgICAgICAgLmdsb2JsICBleHRfaW50X2hhbmRsZXIKK2V4dF9pbnRfaGFuZGxlcjoKKwlTVE9SRV9USU1FUiBfX0xDX0FTWU5DX0VOVEVSX1RJTUVSCisJc3RjawlfX0xDX0lOVF9DTE9DSworCVNBVkVfQUxMX0JBU0UgX19MQ19TQVZFX0FSRUErMzIKKyAgICAgICAgU0FWRV9BTEwgX19MQ19FWFRfT0xEX1BTVyxfX0xDX1NBVkVfQVJFQSszMiwwCisjaWZkZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKKwl0bQlTUF9QU1crMSglcjE1KSwweDAxCSMgaW50ZXJydXB0aW5nIGZyb20gdXNlciA/CisJanoJZXh0X25vX3Z0aW1lCisJVVBEQVRFX1ZUSU1FIF9fTENfRVhJVF9USU1FUixfX0xDX0FTWU5DX0VOVEVSX1RJTUVSLF9fTENfVVNFUl9USU1FUgorCVVQREFURV9WVElNRSBfX0xDX0xBU1RfVVBEQVRFX1RJTUVSLF9fTENfRVhJVF9USU1FUixfX0xDX1NZU1RFTV9USU1FUgorCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLF9fTENfQVNZTkNfRU5URVJfVElNRVIKK2V4dF9ub192dGltZToKKyNlbmRpZgorCWxnCSVyOSxfX0xDX1RIUkVBRF9JTkZPCSMgbG9hZCBwb2ludGVyIHRvIHRocmVhZF9pbmZvIHN0cnVjdAorCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkgICAgIyBhZGRyZXNzIG9mIHJlZ2lzdGVyLXNhdmUgYXJlYQorCWxsZ2gJJXIzLF9fTENfRVhUX0lOVF9DT0RFICAjIGdldCBpbnRlcnJ1cHRpb24gY29kZQorCWJyYXNsICAgJXIxNCxkb19leHRpbnQKKwlqCWlvX3JldHVybgorCisvKgorICogTWFjaGluZSBjaGVjayBoYW5kbGVyIHJvdXRpbmVzCisgKi8KKyAgICAgICAgLmdsb2JsIG1jY2tfaW50X2hhbmRsZXIKK21jY2tfaW50X2hhbmRsZXI6CisJU1RPUkVfVElNRVIgX19MQ19BU1lOQ19FTlRFUl9USU1FUgorCVNBVkVfQUxMX0JBU0UgX19MQ19TQVZFX0FSRUErNjQKKyAgICAgICAgU0FWRV9BTEwgX19MQ19NQ0tfT0xEX1BTVyxfX0xDX1NBVkVfQVJFQSs2NCwwCisjaWZkZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKKwl0bQlTUF9QU1crMSglcjE1KSwweDAxCSMgaW50ZXJydXB0aW5nIGZyb20gdXNlciA/CisJanoJbWNja19ub192dGltZQorCVVQREFURV9WVElNRSBfX0xDX0VYSVRfVElNRVIsX19MQ19BU1lOQ19FTlRFUl9USU1FUixfX0xDX1VTRVJfVElNRVIKKwlVUERBVEVfVlRJTUUgX19MQ19MQVNUX1VQREFURV9USU1FUixfX0xDX0VYSVRfVElNRVIsX19MQ19TWVNURU1fVElNRVIKKwltdmMJX19MQ19MQVNUX1VQREFURV9USU1FUig4KSxfX0xDX0FTWU5DX0VOVEVSX1RJTUVSCittY2NrX25vX3Z0aW1lOgorI2VuZGlmCisJYnJhc2wgICAlcjE0LHMzOTBfZG9fbWFjaGluZV9jaGVjaworbWNja19yZXR1cm46CisgICAgICAgIFJFU1RPUkVfQUxMIDAKKworI2lmZGVmIENPTkZJR19TTVAKKy8qCisgKiBSZXN0YXJ0IGludGVycnVwdGlvbiBoYW5kbGVyLCBraWNrIHN0YXJ0ZXIgZm9yIGFkZGl0aW9uYWwgQ1BVcworICovCisgICAgICAgIC5nbG9ibCByZXN0YXJ0X2ludF9oYW5kbGVyCityZXN0YXJ0X2ludF9oYW5kbGVyOgorICAgICAgICBsZyAgICAgICVyMTUsX19MQ19TQVZFX0FSRUErMTIwICMgbG9hZCBrc3AKKyAgICAgICAgbGdoaSAgICAlcjEwLF9fTENfQ1JFR1NfU0FWRV9BUkVBCisgICAgICAgIGxjdGxnICAgJWMwLCVjMTUsMCglcjEwKSAjIGdldCBuZXcgY3RsIHJlZ3MKKyAgICAgICAgbGdoaSAgICAlcjEwLF9fTENfQVJFR1NfU0FWRV9BUkVBCisgICAgICAgIGxhbSAgICAgJWEwLCVhMTUsMCglcjEwKQorICAgICAgICBsbWcgICAgICVyNiwlcjE1LF9fU0ZfR1BSUyglcjE1KSAjIGxvYWQgcmVnaXN0ZXJzIGZyb20gY2xvbmUKKyAgICAgICAgc3Rvc20gICBfX1NGX0VNUFRZKCVyMTUpLDB4MDQgICAgIyBub3cgd2UgY2FuIHR1cm4gZGF0IG9uCisJamcgICAgICBzdGFydF9zZWNvbmRhcnkKKyNlbHNlCisvKgorICogSWYgd2UgZG8gbm90IHJ1biB3aXRoIFNNUCBlbmFibGVkLCBsZXQgdGhlIG5ldyBDUFUgY3Jhc2ggLi4uCisgKi8KKyAgICAgICAgLmdsb2JsIHJlc3RhcnRfaW50X2hhbmRsZXIKK3Jlc3RhcnRfaW50X2hhbmRsZXI6CisgICAgICAgIGJhc3IgICAgJXIxLDAKK3Jlc3RhcnRfYmFzZToKKyAgICAgICAgbHBzd2UgICByZXN0YXJ0X2NyYXNoLXJlc3RhcnRfYmFzZSglcjEpCisgICAgICAgIC5hbGlnbiA4CityZXN0YXJ0X2NyYXNoOgorICAgICAgICAubG9uZyAgMHgwMDBhMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMAorcmVzdGFydF9nbzoKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NIRUNLX1NUQUNLCisvKgorICogVGhlIHN5bmNocm9ub3VzIG9yIHRoZSBhc3luY2hyb25vdXMgc3RhY2sgb3ZlcmZsb3dlZC4gV2UgYXJlIGRlYWQuCisgKiBObyBuZWVkIHRvIHByb3Blcmx5IHNhdmUgdGhlIHJlZ2lzdGVycywgd2UgYXJlIGdvaW5nIHRvIHBhbmljIGFueXdheS4KKyAqIFNldHVwIGEgcHRfcmVncyBzbyB0aGF0IHNob3dfdHJhY2UgY2FuIHByb3ZpZGUgYSBnb29kIGNhbGwgdHJhY2UuCisgKi8KK3N0YWNrX292ZXJmbG93OgorCWxnCSVyMTUsX19MQ19QQU5JQ19TVEFDSwkjIGNoYW5nZSB0byBwYW5pYyBzdGFjaworCWFnaGkJJXIxLC1TUF9TSVpFCisJbXZjCVNQX1BTVygxNiwlcjE1KSwwKCVyMTIpCSMgbW92ZSB1c2VyIFBTVyB0byBzdGFjaworCXN0bWcJJXIwLCVyMTEsU1BfUjAoJXIxNSkJIyBzdG9yZSBncHJzICVyMC0lcjExIHRvIGtlcm5lbCBzdGFjaworCWxhCSVyMSxfX0xDX1NBVkVfQVJFQQorCWNoaQklcjEyLF9fTENfU1ZDX09MRF9QU1cKKwlqZQkwZgorCWNoaQklcjEyLF9fTENfUEdNX09MRF9QU1cKKwlqZQkwZgorCWxhCSVyMSxfX0xDX1NBVkVfQVJFQSsxNgorMDoJbXZjCVNQX1IxMigzMiwlcjE1KSwwKCVyMSkgICMgbW92ZSAlcjEyLSVyMTUgdG8gc3RhY2sKKyAgICAgICAgeGMgICAgICBfX1NGX0JBQ0tDSEFJTig4LCVyMTUpLF9fU0ZfQkFDS0NIQUlOKCVyMTUpICMgY2xlYXIgYmFjayBjaGFpbgorICAgICAgICBsYSAgICAgICVyMixTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MKKwlqZwlrZXJuZWxfc3RhY2tfb3ZlcmZsb3cKKyNlbmRpZgorCitjbGVhbnVwX3RhYmxlX3N5c3RlbV9jYWxsOgorCS5xdWFkCXN5c3RlbV9jYWxsLCBzeXNjX2RvX3N2YworY2xlYW51cF90YWJsZV9zeXNjX3JldHVybjoKKwkucXVhZAlzeXNjX3JldHVybiwgc3lzY19sZWF2ZQorY2xlYW51cF90YWJsZV9zeXNjX2xlYXZlOgorCS5xdWFkCXN5c2NfbGVhdmUsIHN5c2Nfd29ya19sb29wCitjbGVhbnVwX3RhYmxlX3N5c2Nfd29ya19sb29wOgorCS5xdWFkCXN5c2Nfd29ya19sb29wLCBzeXNjX3Jlc2NoZWR1bGUKKworY2xlYW51cF9jcml0aWNhbDoKKwljbGMJOCg4LCVyMTIpLEJBU0VEKGNsZWFudXBfdGFibGVfc3lzdGVtX2NhbGwpCisJamwJMGYKKwljbGMJOCg4LCVyMTIpLEJBU0VEKGNsZWFudXBfdGFibGVfc3lzdGVtX2NhbGwrOCkKKwlqbAljbGVhbnVwX3N5c3RlbV9jYWxsCiswOgorCWNsYwk4KDgsJXIxMiksQkFTRUQoY2xlYW51cF90YWJsZV9zeXNjX3JldHVybikKKwlqbAkwZgorCWNsYwk4KDgsJXIxMiksQkFTRUQoY2xlYW51cF90YWJsZV9zeXNjX3JldHVybis4KQorCWpsCWNsZWFudXBfc3lzY19yZXR1cm4KKzA6CisJY2xjCTgoOCwlcjEyKSxCQVNFRChjbGVhbnVwX3RhYmxlX3N5c2NfbGVhdmUpCisJamwJMGYKKwljbGMJOCg4LCVyMTIpLEJBU0VEKGNsZWFudXBfdGFibGVfc3lzY19sZWF2ZSs4KQorCWpsCWNsZWFudXBfc3lzY19sZWF2ZQorMDoKKwljbGMJOCg4LCVyMTIpLEJBU0VEKGNsZWFudXBfdGFibGVfc3lzY193b3JrX2xvb3ApCisJamwJMGYKKwljbGMJOCg4LCVyMTIpLEJBU0VEKGNsZWFudXBfdGFibGVfc3lzY193b3JrX2xvb3ArOCkKKwlqbAljbGVhbnVwX3N5c2NfbGVhdmUKKzA6CisJYnIJJXIxNAorCitjbGVhbnVwX3N5c3RlbV9jYWxsOgorCW12YwlfX0xDX1JFVFVSTl9QU1coMTYpLDAoJXIxMikKKyNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORworCWNsYwlfX0xDX1JFVFVSTl9QU1crOCg4KSxCQVNFRChjbGVhbnVwX3N5c3RlbV9jYWxsX2luc24rOCkKKwlqaAkwZgorCW12YwlfX0xDX1NZTkNfRU5URVJfVElNRVIoOCksX19MQ19BU1lOQ19FTlRFUl9USU1FUgorMDoJY2xjCV9fTENfUkVUVVJOX1BTVys4KDgpLEJBU0VEKGNsZWFudXBfc3lzdGVtX2NhbGxfaW5zbisxNikKKwlqaGUJY2xlYW51cF92dGltZQorI2VuZGlmCisJY2xjCV9fTENfUkVUVVJOX1BTVys4KDgpLEJBU0VEKGNsZWFudXBfc3lzdGVtX2NhbGxfaW5zbikKKwlqaAkwZgorCW12YwlfX0xDX1NBVkVfQVJFQSgzMiksX19MQ19TQVZFX0FSRUErMzIKKzA6CXN0ZwklcjEzLF9fTENfU0FWRV9BUkVBKzQwCisJU0FWRV9BTEwgX19MQ19TVkNfT0xEX1BTVyxfX0xDX1NBVkVfQVJFQSwxCisJc3RnCSVyMTUsX19MQ19TQVZFX0FSRUErNTYKKwlsbGdoCSVyNyxfX0xDX1NWQ19JTlRfQ09ERQorI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCitjbGVhbnVwX3Z0aW1lOgorCWNsYwlfX0xDX1JFVFVSTl9QU1crOCg4KSxCQVNFRChjbGVhbnVwX3N5c3RlbV9jYWxsX2luc24rMjQpCisJamhlCWNsZWFudXBfc3RpbWUKKwl0bQlTUF9QU1crMSglcjE1KSwweDAxCSMgaW50ZXJydXB0aW5nIGZyb20gdXNlciA/CisJanoJY2xlYW51cF9ub3Z0aW1lCisJVVBEQVRFX1ZUSU1FIF9fTENfRVhJVF9USU1FUixfX0xDX1NZTkNfRU5URVJfVElNRVIsX19MQ19VU0VSX1RJTUVSCitjbGVhbnVwX3N0aW1lOgorCWNsYwlfX0xDX1JFVFVSTl9QU1crOCg4KSxCQVNFRChjbGVhbnVwX3N5c3RlbV9jYWxsX2luc24rMzIpCisJamgJY2xlYW51cF91cGRhdGUKKwlVUERBVEVfVlRJTUUgX19MQ19MQVNUX1VQREFURV9USU1FUixfX0xDX0VYSVRfVElNRVIsX19MQ19TWVNURU1fVElNRVIKK2NsZWFudXBfdXBkYXRlOgorCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLF9fTENfU1lOQ19FTlRFUl9USU1FUgorY2xlYW51cF9ub3Z0aW1lOgorI2VuZGlmCisJbXZjCV9fTENfUkVUVVJOX1BTVys4KDgpLEJBU0VEKGNsZWFudXBfdGFibGVfc3lzdGVtX2NhbGwrOCkKKwlsYQklcjEyLF9fTENfUkVUVVJOX1BTVworCWJyCSVyMTQKK2NsZWFudXBfc3lzdGVtX2NhbGxfaW5zbjoKKwkucXVhZAlzeXNjX3NhdmVhbGwKKyNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORworCS5xdWFkICAgc3lzdGVtX2NhbGwKKwkucXVhZCAgIHN5c2NfdnRpbWUKKwkucXVhZCAgIHN5c2Nfc3RpbWUKKwkucXVhZCAgIHN5c2NfdXBkYXRlCisjZW5kaWYKKworY2xlYW51cF9zeXNjX3JldHVybjoKKwltdmMJX19MQ19SRVRVUk5fUFNXKDgpLDAoJXIxMikKKwltdmMJX19MQ19SRVRVUk5fUFNXKzgoOCksQkFTRUQoY2xlYW51cF90YWJsZV9zeXNjX3JldHVybikKKwlsYQklcjEyLF9fTENfUkVUVVJOX1BTVworCWJyCSVyMTQKKworY2xlYW51cF9zeXNjX2xlYXZlOgorCWNsYwk4KDgsJXIxMiksQkFTRUQoY2xlYW51cF9zeXNjX2xlYXZlX2luc24pCisJamUJMGYKKyNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORworCW12YwlfX0xDX0VYSVRfVElNRVIoOCksX19MQ19BU1lOQ19FTlRFUl9USU1FUgorCWNsYwk4KDgsJXIxMiksQkFTRUQoY2xlYW51cF9zeXNjX2xlYXZlX2luc24rOCkKKwlqZQkwZgorI2VuZGlmCisJbXZjCV9fTENfUkVUVVJOX1BTVygxNiksU1BfUFNXKCVyMTUpCisJbXZjCV9fTENfU0FWRV9BUkVBKzMyKDMyKSxTUF9SMTIoJXIxNSkKKwlsbWcJJXIwLCVyMTEsU1BfUjAoJXIxNSkKKwlsZwklcjE1LFNQX1IxNSglcjE1KQorMDoJbGEJJXIxMixfX0xDX1JFVFVSTl9QU1cKKwlicgklcjE0CitjbGVhbnVwX3N5c2NfbGVhdmVfaW5zbjoKKyNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORworCS5xdWFkCXN5c2NfbGVhdmUgKyAxNgorI2VuZGlmCisJLnF1YWQJc3lzY19sZWF2ZSArIDEyCisKKy8qCisgKiBJbnRlZ2VyIGNvbnN0YW50cworICovCisgICAgICAgICAgICAgICAuYWxpZ24gNAorLkxjb25zdDoKKy5MY19wYWN0aXZlOiAgIC5sb25nICBQUkVFTVBUX0FDVElWRQorLkxucl9zeXNjYWxsczogLmxvbmcgIE5SX3N5c2NhbGxzCisuTDB4MDEzMDogICAgICAuc2hvcnQgMHgxMzAKKy5MMHgwMTQwOiAgICAgIC5zaG9ydCAweDE0MAorLkwweDAxNTA6ICAgICAgLnNob3J0IDB4MTUwCisuTDB4MDE2MDogICAgICAuc2hvcnQgMHgxNjAKKy5MMHgwMTcwOiAgICAgIC5zaG9ydCAweDE3MAorLkxjcml0aWNhbF9zdGFydDoKKyAgICAgICAgICAgICAgIC5xdWFkICBfX2NyaXRpY2FsX3N0YXJ0CisuTGNyaXRpY2FsX2VuZDoKKyAgICAgICAgICAgICAgIC5xdWFkICBfX2NyaXRpY2FsX2VuZAorCisjZGVmaW5lIFNZU0NBTEwoZXNhLGVzYW1lLGVtdSkJLmxvbmcgZXNhbWUKKwkuZ2xvYmwgIHN5c19jYWxsX3RhYmxlCitzeXNfY2FsbF90YWJsZToKKyNpbmNsdWRlICJzeXNjYWxscy5TIgorI3VuZGVmIFNZU0NBTEwKKworI2lmZGVmIENPTkZJR19TMzkwX1NVUFBPUlQKKworI2RlZmluZSBTWVNDQUxMKGVzYSxlc2FtZSxlbXUpCS5sb25nIGVtdQorCS5nbG9ibCAgc3lzX2NhbGxfdGFibGVfZW11CitzeXNfY2FsbF90YWJsZV9lbXU6CisjaW5jbHVkZSAic3lzY2FsbHMuUyIKKyN1bmRlZiBTWVNDQUxMCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvaGVhZC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9oZWFkLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgwNGM1NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvaGVhZC5TCkBAIC0wLDAgKzEsNzcyIEBACisvKgorICogIGFyY2gvczM5MC9rZXJuZWwvaGVhZC5TCisgKgorICogIFMzOTAgdmVyc2lvbgorICogICAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgorICogICAgQXV0aG9yKHMpOiBIYXJ0bXV0IFBlbm5lciAoaHBAZGUuaWJtLmNvbSksCisgKiAgICAgICAgICAgICAgIE1hcnRpbiBTY2h3aWRlZnNreSAoc2Nod2lkZWZza3lAZGUuaWJtLmNvbSksCisgKiAgICAgICAgICAgICAgIFJvYiB2YW4gZGVyIEhlaWogKHJ2ZGhlaUBpYWUubmwpCisgKgorICogVGhlcmUgYXJlIDUgZGlmZmVyZW50IElQTCBtZXRob2RzCisgKiAgMSkgbG9hZCB0aGUgaW1hZ2UgZGlyZWN0bHkgaW50byByYW0gYXQgYWRkcmVzcyAwIGFuZCBkbyBhbiBQU1cgcmVzdGFydAorICogIDIpIGxpbmxvYWQgd2lsbCBsb2FkIHRoZSBpbWFnZSBmcm9tIGFkZHJlc3MgMHgxMDAwMCB0byBtZW1vcnkgMHgxMDAwMAorICogICAgIGFuZCBzdGFydCB0aGUgY29kZSB0aHJ1IExQU1cgMHgwMDA4MDAwMDgwMDEwMDAwIChWTSBvbmx5LCBkZXByZWNhdGVkKQorICogIDMpIGdlbmVyYXRlIHRoZSB0YXBlIGlwbCBoZWFkZXIsIHN0b3JlIHRoZSBnZW5lcmF0ZWQgaW1hZ2Ugb24gYSB0YXBlCisgKiAgICAgYW5kIGlwbCBmcm9tIGl0CisgKiAgICAgSW4gY2FzZSBvZiBTTCB0YXBlIHlvdSBuZWVkIHRvIElQTCA1IHRpbWVzIHRvIGdldCBwYXN0IFZPTDEgZXRjCisgKiAgNCkgZ2VuZXJhdGUgdGhlIHZtIHJlYWRlciBpcGwgaGVhZGVyLCBtb3ZlIHRoZSBnZW5lcmF0ZWQgaW1hZ2UgdG8gdGhlCisgKiAgICAgVk0gcmVhZGVyICh1c2Ugb3B0aW9uIE5PSCEpIGFuZCBkbyBhIGlwbCBmcm9tIHJlYWRlciAoVk0gb25seSkKKyAqICA1KSBkaXJlY3QgY2FsbCBvZiBzdGFydCBieSB0aGUgU0FMSVBMIGxvYWRlcgorICogIFdlIHVzZSB0aGUgY3B1aWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBWTSBhbmQgbmF0aXZlIGlwbAorICogIHBhcmFtcyBmb3Iga2VybmVsIGFyZSBwdXNoZWQgdG8gMHgxMDQwMCAoc2VlIHNldHVwLmgpCisKKyAgICBDaGFuZ2VzOiAKKyAgICBPa3QgMjUgMjAwMCA8cnZkaGVpakBpYWUubmw+CisJYWRkZWQgY29kZSB0byBza2lwIEhEUiBhbmQgRU9GIHRvIGFsbG93IFNMIHRhcGUgSVBMICg1IHJldHJpZXMpCisJY2hhbmdlZCBmaXJzdCBDQ1cgZnJvbSByZXdpbmQgdG8gYmFja3NwYWNlIGJsb2NrCisKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL2xvd2NvcmUuaD4KKyNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKKyNpZm5kZWYgQ09ORklHX0lQTAorICAgICAgICAub3JnICAgMAorICAgICAgICAubG9uZyAgMHgwMDA4MDAwMCwweDgwMDAwMDAwK3N0YXJ0dXAgICAjIEp1c3QgYSByZXN0YXJ0IFBTVworI2Vsc2UKKyNpZmRlZiBDT05GSUdfSVBMX1RBUEUKKyNkZWZpbmUgSVBMX0JTIDEwMjQKKyAgICAgICAgLm9yZyAgIDAKKyAgICAgICAgLmxvbmcgIDB4MDAwODAwMDAsMHg4MDAwMDAwMCtpcGxzdGFydCAgIyBUaGUgZmlyc3QgMjQgYnl0ZXMgYXJlIGxvYWRlZAorICAgICAgICAubG9uZyAgMHgyNzAwMDAwMCwweDYwMDAwMDAxICAgICAgICAgICAjIGJ5IGlwbCB0byBhZGRyZXNzZXMgMC0yMy4KKyAgICAgICAgLmxvbmcgIDB4MDIwMDAwMDAsMHgyMDAwMDAwMCtJUExfQlMgICAgIyAoYSBQU1cgYW5kIHR3byBDQ1dzKS4KKyAgICAgICAgLmxvbmcgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCAgICAgICAgICAgIyBleHRlcm5hbCBvbGQgcHN3CisgICAgICAgIC5sb25nICAweDAwMDAwMDAwLDB4MDAwMDAwMDAgICAgICAgICAgICMgc3ZjIG9sZCBwc3cKKyAgICAgICAgLmxvbmcgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCAgICAgICAgICAgIyBwcm9ncmFtIGNoZWNrIG9sZCBwc3cKKyAgICAgICAgLmxvbmcgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCAgICAgICAgICAgIyBtYWNoaW5lIGNoZWNrIG9sZCBwc3cKKyAgICAgICAgLmxvbmcgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCAgICAgICAgICAgIyBpbyBvbGQgcHN3CisgICAgICAgIC5sb25nICAweDAwMDAwMDAwLDB4MDAwMDAwMDAKKyAgICAgICAgLmxvbmcgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMAorICAgICAgICAubG9uZyAgMHgwMDAwMDAwMCwweDAwMDAwMDAwCisgICAgICAgIC5sb25nICAweDAwMGEwMDAwLDB4MDAwMDAwNTggICAgICAgICAgICMgZXh0ZXJuYWwgbmV3IHBzdworICAgICAgICAubG9uZyAgMHgwMDBhMDAwMCwweDAwMDAwMDYwICAgICAgICAgICAjIHN2YyBuZXcgcHN3CisgICAgICAgIC5sb25nICAweDAwMGEwMDAwLDB4MDAwMDAwNjggICAgICAgICAgICMgcHJvZ3JhbSBjaGVjayBuZXcgcHN3CisgICAgICAgIC5sb25nICAweDAwMGEwMDAwLDB4MDAwMDAwNzAgICAgICAgICAgICMgbWFjaGluZSBjaGVjayBuZXcgcHN3CisgICAgICAgIC5sb25nICAweDAwMDgwMDAwLDB4ODAwMDAwMDArLkxpb2ludCAgICMgaW8gbmV3IHBzdworCisgICAgICAgIC5vcmcgICAweDEwMAorIworIyBzdWJyb3V0aW5lIGZvciBsb2FkaW5nIGZyb20gdGFwZQorIyBQYXJhbXRlcnM6CQorIyAgUjEgPSBkZXZpY2UgbnVtYmVyCisjICBSMiA9IGxvYWQgYWRkcmVzcworLkxsb2FkZXI6CQorICAgICAgICBzdCAgICAlcjE0LC5MbGRyZXQKKyAgICAgICAgbGEgICAgJXIzLC5Mb3JicmVhZCAgICAgICAgICAgICAgICAgICAgIyByMyA9IGFkZHJlc3Mgb2Ygb3JiIAorCWxhICAgICVyNSwuTGlyYiAgICAgICAgICAgICAgICAgICAgICAgICMgcjUgPSBhZGRyZXNzIG9mIGlyYgorICAgICAgICBzdCAgICAlcjIsLkxjY3dyZWFkKzQgICAgICAgICAgICAgICAgICAjIGluaXRpYWxpemUgQ0NXIGRhdGEgYWRkcmVzc2VzCisgICAgICAgIGxjdGwgICVjNiwlYzYsLkxjcjYgICAgICAgICAgICAgICAKKyAgICAgICAgc2xyICAgJXIyLCVyMgorLkxsZGxwOgorICAgICAgICBsYSAgICAlcjYsMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDMgcmV0cmllcworLkxzc2NoOgorICAgICAgICBzc2NoICAwKCVyMykgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxvYWQgY2h1bmsgb2YgSVBMX0JTIGJ5dGVzCisgICAgICAgIGJueiAgIC5MbGRlcnIKKy5MdzRlbmQ6CisgICAgICAgIGJhcyAgICVyMTQsLkx3YWl0NGlvCisgICAgICAgIHRtICAgIDgoJXI1KSwweDgyICAgICAgICAgICAgICAgICAgICAgICMgZG8gd2UgaGF2ZSBhIHByb2JsZW0gPworICAgICAgICBibnogICAuTHJlY292CisgICAgICAgIHNsciAgICVyNywlcjcKKyAgICAgICAgaWNtICAgJXI3LDMsMTAoJXI1KSAgICAgICAgICAgICAgICAgICAgIyBnZXQgcmVzaWR1YWwgY291bnQKKyAgICAgICAgbGNyICAgJXI3LCVyNworICAgICAgICBsYSAgICAlcjcsSVBMX0JTKCVyNykgICAgICAgICAgICAgICAgICAjIElQTF9CUy1yZXNpZHVhbD0jYnl0ZXMgcmVhZAorICAgICAgICBhciAgICAlcjIsJXI3ICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFkZCB0byB0b3RhbCBzaXplCisgICAgICAgIHRtICAgIDgoJXI1KSwweDAxICAgICAgICAgICAgICAgICAgICAgICMgZm91bmQgYSB0YXBlIG1hcmsgPworICAgICAgICBibnogICAuTGRvbmUKKyAgICAgICAgbCAgICAgJXIwLC5MY2N3cmVhZCs0ICAgICAgICAgICAgICAgICAgIyB1cGRhdGUgQ0NXIGRhdGEgYWRkcmVzc2VzCisgICAgICAgIGFyICAgICVyMCwlcjcKKyAgICAgICAgc3QgICAgJXIwLC5MY2N3cmVhZCs0ICAgICAgICAgICAgICAgIAorICAgICAgICBiICAgICAuTGxkbHAKKy5MZG9uZToKKyAgICAgICAgbCAgICAgJXIxNCwuTGxkcmV0CisgICAgICAgIGJyICAgICVyMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcjIgY29udGFpbnMgdGhlIHRvdGFsIHNpemUKKy5McmVjb3Y6CisgICAgICAgIGJhcyAgICVyMTQsLkxzZW5zZSAgICAgICAgICAgICAgICAgICAgICMgZG8gdGhlIHNlbnNpbmcKKyAgICAgICAgYmN0ICAgJXI2LC5Mc3NjaCAgICAgICAgICAgICAgICAgICAgICAgIyBkZWMuIHJldHJ5IGNvdW50ICYgYnJhbmNoCisgICAgICAgIGIgICAgIC5MbGRlcnIKKyMKKyMgU2Vuc2Ugc3Vicm91dGluZQorIworLkxzZW5zZToKKyAgICAgICAgc3QgICAgJXIxNCwuTHNuc3JldAorICAgICAgICBsYSAgICAlcjcsLkxvcmJzZW5zZSAgICAgICAgICAgICAgCisgICAgICAgIHNzY2ggIDAoJXI3KSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RhcnQgc2Vuc2UgY29tbWFuZAorICAgICAgICBibnogICAuTGxkZXJyCisgICAgICAgIGJhcyAgICVyMTQsLkx3YWl0NGlvCisgICAgICAgIGwgICAgICVyMTQsLkxzbnNyZXQKKyAgICAgICAgdG0gICAgOCglcjUpLDB4ODIgICAgICAgICAgICAgICAgICAgICAgIyBkbyB3ZSBoYXZlIGEgcHJvYmxlbSA/CisgICAgICAgIGJueiAgIC5MbGRlcnIKKyAgICAgICAgYnIgICAgJXIxNAorIworIyBXYWl0IGZvciBpbnRlcnJ1cHQgc3Vicm91dGluZQorIworLkx3YWl0NGlvOgorICAgICAgICBscHN3ICAuTHdhaXRwc3cgICAgICAgICAgICAgICAgIAorLkxpb2ludDoKKyAgICAgICAgYyAgICAgJXIxLDB4YjggICAgICAgICAgICAgICAgICAgICAgICAgIyBjb21wYXJlIHN1YmNoYW5uZWwgbnVtYmVyCisgICAgICAgIGJuZSAgIC5Md2FpdDRpbworICAgICAgICB0c2NoICAwKCVyNSkKKyAgICAgICAgc2xyICAgJXIwLCVyMAorICAgICAgICB0bSAgICA4KCVyNSksMHg4MiAgICAgICAgICAgICAgICAgICAgICAjIGRvIHdlIGhhdmUgYSBwcm9ibGVtID8KKyAgICAgICAgYm56ICAgLkx3dGV4aXQKKyAgICAgICAgdG0gICAgOCglcjUpLDB4MDQgICAgICAgICAgICAgICAgICAgICAgIyBnb3QgZGV2aWNlIGVuZCA/CisgICAgICAgIGJ6ICAgIC5Md2FpdDRpbworLkx3dGV4aXQ6CisgICAgICAgIGJyICAgICVyMTQKKy5MbGRlcnI6CisgICAgICAgIGxwc3cgIC5MY3Jhc2ggICAgICAgICAgICAgIAorCisgICAgICAgIC5hbGlnbiA4CisuTG9yYnJlYWQ6CisJLmxvbmcgIDB4MDAwMDAwMDAsMHgwMDgwZmYwMCwuTGNjd3JlYWQKKyAgICAgICAgLmFsaWduIDgKKy5Mb3Jic2Vuc2U6CisgICAgICAgIC5sb25nICAweDAwMDAwMDAwLDB4MDA4MGZmMDAsLkxjY3dzZW5zZQorICAgICAgICAuYWxpZ24gOAorLkxjY3dyZWFkOgorICAgICAgICAubG9uZyAgMHgwMjIwMDAwMCtJUExfQlMsMHgwMDAwMDAwMAorLkxjY3dzZW5zZToKKyAgICAgICAgLmxvbmcgIDB4MDQyMDAwMDEsMHgwMDAwMDAwMAorLkx3YWl0cHN3OgorCS5sb25nICAweDAyMGEwMDAwLDB4ODAwMDAwMDArLkxpb2ludAorCisuTGlyYjoJLmxvbmcgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAKKy5MY3I2OiAgLmxvbmcgIDB4ZmYwMDAwMDAKKyAgICAgICAgLmFsaWduIDgKKy5MY3Jhc2g6LmxvbmcgIDB4MDAwYTAwMDAsMHgwMDAwMDAwMAorLkxsZHJldDoubG9uZyAgMAorLkxzbnNyZXQ6IC5sb25nIDAKKyNlbmRpZiAgLyogQ09ORklHX0lQTF9UQVBFICovCisKKyNpZmRlZiBDT05GSUdfSVBMX1ZNCisjZGVmaW5lIElQTF9CUyAweDczMAorICAgICAgICAub3JnICAgMAorICAgICAgICAubG9uZyAgMHgwMDA4MDAwMCwweDgwMDAwMDAwK2lwbHN0YXJ0ICAjIFRoZSBmaXJzdCAyNCBieXRlcyBhcmUgbG9hZGVkCisgICAgICAgIC5sb25nICAweDAyMDAwMDE4LDB4NjAwMDAwNTAgICAgICAgICAgICMgYnkgaXBsIHRvIGFkZHJlc3NlcyAwLTIzLgorICAgICAgICAubG9uZyAgMHgwMjAwMDA2OCwweDYwMDAwMDUwICAgICAgICAgICAjIChhIFBTVyBhbmQgdHdvIENDV3MpLgorICAgICAgICAuZmlsbCAgODAtMjQsMSwweDQwICAgICAgICAgICAgICAgICAgICAjIGJ5dGVzIDI0LTc5IGFyZSBkaXNjYXJkZWQgISEKKyAgICAgICAgLmxvbmcgIDB4MDIwMDAwZjAsMHg2MDAwMDA1MCAgICAgICAgICAgIyBUaGUgbmV4dCAxNjAgYnl0ZSBhcmUgbG9hZGVkCisgICAgICAgIC5sb25nICAweDAyMDAwMTQwLDB4NjAwMDAwNTAgICAgICAgICAgICMgdG8gYWRkcmVzc2VzIDB4MTgtMHhiNworICAgICAgICAubG9uZyAgMHgwMjAwMDE5MCwweDYwMDAwMDUwICAgICAgICAgICAjIFRoZXkgZm9ybSB0aGUgY29udGludWF0aW9uCisgICAgICAgIC5sb25nICAweDAyMDAwMWUwLDB4NjAwMDAwNTAgICAgICAgICAgICMgb2YgdGhlIENDVyBwcm9ncmFtIHN0YXJ0ZWQKKyAgICAgICAgLmxvbmcgIDB4MDIwMDAyMzAsMHg2MDAwMDA1MCAgICAgICAgICAgIyBieSBpcGwgYW5kIGxvYWQgdGhlIHJhbmdlCisgICAgICAgIC5sb25nICAweDAyMDAwMjgwLDB4NjAwMDAwNTAgICAgICAgICAgICMgMHgwZjAtMHg3MzAgZnJvbSB0aGUgaW1hZ2UKKyAgICAgICAgLmxvbmcgIDB4MDIwMDAyZDAsMHg2MDAwMDA1MCAgICAgICAgICAgIyB0byB0aGUgcmFuZ2UgMHgwZjAtMHg3MzAKKyAgICAgICAgLmxvbmcgIDB4MDIwMDAzMjAsMHg2MDAwMDA1MCAgICAgICAgICAgIyBpbiBtZW1vcnkuIEF0IHRoZSBlbmQgb2YKKyAgICAgICAgLmxvbmcgIDB4MDIwMDAzNzAsMHg2MDAwMDA1MCAgICAgICAgICAgIyB0aGUgY2hhbm5lbCBwcm9ncmFtIHRoZSBQU1cKKyAgICAgICAgLmxvbmcgIDB4MDIwMDAzYzAsMHg2MDAwMDA1MCAgICAgICAgICAgIyBhdCBsb2NhdGlvbiAwIGlzIGxvYWRlZC4KKyAgICAgICAgLmxvbmcgIDB4MDIwMDA0MTAsMHg2MDAwMDA1MCAgICAgICAgICAgIyBJbml0aWFsIHByb2Nlc3Npbmcgc3RhcnRzCisgICAgICAgIC5sb25nICAweDAyMDAwNDYwLDB4NjAwMDAwNTAgICAgICAgICAgICMgYXQgMHhmMCA9IGlwbHN0YXJ0LgorICAgICAgICAubG9uZyAgMHgwMjAwMDRiMCwweDYwMDAwMDUwCisgICAgICAgIC5sb25nICAweDAyMDAwNTAwLDB4NjAwMDAwNTAKKyAgICAgICAgLmxvbmcgIDB4MDIwMDA1NTAsMHg2MDAwMDA1MAorICAgICAgICAubG9uZyAgMHgwMjAwMDVhMCwweDYwMDAwMDUwCisgICAgICAgIC5sb25nICAweDAyMDAwNWYwLDB4NjAwMDAwNTAKKyAgICAgICAgLmxvbmcgIDB4MDIwMDA2NDAsMHg2MDAwMDA1MAorICAgICAgICAubG9uZyAgMHgwMjAwMDY5MCwweDYwMDAwMDUwCisgICAgICAgIC5sb25nICAweDAyMDAwNmUwLDB4MjAwMDAwNTAKKworICAgICAgICAub3JnICAgMHhmMAorIworIyBzdWJyb3V0aW5lIGZvciBsb2FkaW5nIGNhcmRzIGZyb20gdGhlIHJlYWRlcgorIworLkxsb2FkZXI6CQorCWxhICAgICVyMywuTG9yYiAgICAgICAgICAgICAgICAgICAgICAgICMgcjIgPSBhZGRyZXNzIG9mIG9yYiBpbnRvIHIyCisJbGEgICAgJXI1LC5MaXJiICAgICAgICAgICAgICAgICAgICAgICAgIyByNCA9IGFkZHJlc3Mgb2YgaXJiCisgICAgICAgIGxhICAgICVyNiwuTGNjd3MgICAgICAgICAgICAgIAorICAgICAgICBsYSAgICAlcjcsMjAKKy5MaW5pdDoKKyAgICAgICAgc3QgICAgJXIyLDQoJXI2KSAgICAgICAgICAgICAgICAgICAgICAgIyBpbml0aWFsaXplIENDVyBkYXRhIGFkZHJlc3NlcworICAgICAgICBsYSAgICAlcjIsMHg1MCglcjIpCisgICAgICAgIGxhICAgICVyNiw4KCVyNikKKyAgICAgICAgYmN0ICAgNywuTGluaXQKKworICAgICAgICBsY3RsICAlYzYsJWM2LC5MY3I2ICAgICAgICAgICAgICAgICAgICAjIHNldCBJTyBzdWJjbGFzcyBtYXNrCisJc2xyICAgJXIyLCVyMgorLkxsZGxwOgorICAgICAgICBzc2NoICAwKCVyMykgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxvYWQgY2h1bmsgb2YgMTYwMCBieXRlcworICAgICAgICBibnogICAuTGxkZXJyCisuTHdhaXQ0aXJxOgorICAgICAgICBtdmMgICBfX0xDX0lPX05FV19QU1coOCksLkxuZXdwc3cgICAgICAjIHNldCB1cCBJTyBpbnRlcnJ1cHQgcHN3CisgICAgICAgIGxwc3cgIC5Md2FpdHBzdyAgICAgICAgICAgICAgCisuTGlvaW50OgorICAgICAgICBjICAgICAlcjEsMHhiOCAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbXBhcmUgc3ViY2hhbm5lbCBudW1iZXIKKwlibmUgICAuTHdhaXQ0aXJxCisJdHNjaCAgMCglcjUpCisKKwlzbHIgICAlcjAsJXIwCisJaWMgICAgJXIwLDgoJXI1KSAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgZGV2aWNlIHN0YXR1cworCWNoaSAgICVyMCw4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2hhbm5lbCBlbmQgPworCWJlICAgIC5MY29udAorCWNoaSAgICVyMCwxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2hhbm5lbCBlbmQgKyBkZXZpY2UgZW5kID8KKwliZSAgICAuTGNvbnQKKworICAgICAgICBsICAgICAlcjAsNCglcjUpCisgICAgICAgIHMgICAgICVyMCw4KCVyMykgICAgICAgICAgICAgICAgICAgICAgICMgcjAvOCA9IG51bWJlciBvZiBjY3dzIGV4ZWN1dGVkCisgICAgICAgIG1oaSAgICVyMCwxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKjEwID0gbnVtYmVyIG9mIGJ5dGVzIGluIGNjd3MKKyAgICAgICAgbGggICAgJXIzLDEwKCVyNSkgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgcmVzaWR1YWwgY291bnQKKyAgICAgICAgc3IgICAgJXIwLCVyMyAgICAgICAgICAgICAgICAgICAgICAgICAgIyAjY2N3cyo4MC1yZXNpZHVhbD0jYnl0ZXMgcmVhZAorCWFyICAgICVyMiwlcjAKKwkKKyAgICAgICAgYnIgICAgJXIxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByMiBjb250YWlucyB0aGUgdG90YWwgc2l6ZQorCisuTGNvbnQ6CisJYWhpICAgJXIyLDB4NjQwICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgMHg2NDAgdG8gdG90YWwgc2l6ZQorICAgICAgICBsYSAgICAlcjYsLkxjY3dzICAgICAgICAgICAgIAorICAgICAgICBsYSAgICAlcjcsMjAKKy5MaW5jcjoKKyAgICAgICAgbCAgICAgJXIwLDQoJXI2KSAgICAgICAgICAgICAgICAgICAgICAgIyB1cGRhdGUgQ0NXIGRhdGEgYWRkcmVzc2VzCisgICAgICAgIGFoaSAgICVyMCwweDY0MAorICAgICAgICBzdCAgICAlcjAsNCglcjYpCisgICAgICAgIGFoaSAgICVyNiw4CisgICAgICAgIGJjdCAgIDcsLkxpbmNyCisKKyAgICAgICAgYiAgICAgLkxsZGxwCisuTGxkZXJyOgorICAgICAgICBscHN3ICAuTGNyYXNoICAgICAgICAgICAgICAKKworICAgICAgICAuYWxpZ24gOAorLkxvcmI6CS5sb25nICAweDAwMDAwMDAwLDB4MDA4MGZmMDAsLkxjY3dzCisuTGlyYjoJLmxvbmcgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAKKy5MY3I2OiAgLmxvbmcgIDB4ZmYwMDAwMDAKKy5MbG9hZHA6LmxvbmcgIDAsMAorICAgICAgICAuYWxpZ24gOAorLkxjcmFzaDoubG9uZyAgMHgwMDBhMDAwMCwweDAwMDAwMDAwCisuTG5ld3BzdzoKKyAgICAgICAgLmxvbmcgIDB4MDAwODAwMDAsMHg4MDAwMDAwMCsuTGlvaW50CisuTHdhaXRwc3c6CisgICAgICAgIC5sb25nICAweDAyMGEwMDAwLDB4ODAwMDAwMDArLkxpb2ludAorCisgICAgICAgIC5hbGlnbiA4CisuTGNjd3M6IC5yZXB0ICAxOQorICAgICAgICAubG9uZyAgMHgwMjYwMDA1MCwweDAwMDAwMDAwCisgICAgICAgIC5lbmRyCisgICAgICAgIC5sb25nICAweDAyMjAwMDUwLDB4MDAwMDAwMDAKKyNlbmRpZiAgLyogQ09ORklHX0lQTF9WTSAqLworCitpcGxzdGFydDoKKyAgICAgICAgbGggICAgJXIxLDB4YjggICAgICAgICAgICAgICAgICAgICAgICAgIyB0ZXN0IGlmIHN1YmNoYW5uZWwgbnVtYmVyCisgICAgICAgIGJjdCAgICVyMSwuTG5vbG9hZCAgICAgICAgICAgICAgICAgICAgICMgIGlzIHZhbGlkCisJbCAgICAgJXIxLDB4YjggICAgICAgICAgICAgICAgICAgICAgICAgIyBsb2FkIGlwbCBzdWJjaGFubmVsIG51bWJlcgorICAgICAgICBsYSAgICAlcjIsSVBMX0JTICAgICAgICAgICAgICAgICAgICAgICAjIGxvYWQgc3RhcnQgYWRkcmVzcworICAgICAgICBiYXMgICAlcjE0LC5MbG9hZGVyICAgICAgICAgICAgICAgICAgICAjIGxvYWQgcmVzdCBvZiBpcGwgaW1hZ2UKKyAgICAgICAgbCAgICAgJXIxMiwuTHBhcm0gICAgICAgICAgICAgICAgICAgICAgIyBwb2ludGVyIHRvIHBhcmFtZXRlciBhcmVhCisgICAgICAgIHN0ICAgICVyMSxJUExfREVWSUNFLVBBUk1BUkVBKCVyMTIpICAgICMgc3RvcmUgaXBsIGRldmljZSBudW1iZXIKKworIworIyBsb2FkIHBhcmFtZXRlciBmaWxlIGZyb20gaXBsIGRldmljZQorIworLkxhZ2FpbjE6CisgCWwgICAgICVyMixJTklUUkRfU1RBUlQtUEFSTUFSRUEoJXIxMikgICMgdXNlIHJhbWRpc2sgbG9jYXRpb24gYXMgdGVtcAorICAgICAgICBiYXMgICAlcjE0LC5MbG9hZGVyICAgICAgICAgICAgICAgICAgICAjIGxvYWQgcGFyYW1ldGVyIGZpbGUKKyAgICAgICAgbHRyICAgJXIyLCVyMiAgICAgICAgICAgICAgICAgICAgICAgICAgIyBnb3QgYW55dGhpbmcgPworICAgICAgICBieiAgICAuTG5vcGYKKwljaGkgICAlcjIsODk1CisJYm5oICAgLkxub3RydW5jCisJbGEgICAgJXIyLDg5NQorLkxub3RydW5jOgorCWwgICAgICVyNCxJTklUUkRfU1RBUlQtUEFSTUFSRUEoJXIxMikKKwljbGMgICAwKDMsJXI0KSwuTF9oZHIJCSAgICAgICAjIGlmIGl0IGlzIEhEUngKKwlieiAgICAuTGFnYWluMQkJCSAgICAgICAjIHNraXAgZGF0YXNldCBoZWFkZXIKKwljbGMgICAwKDMsJXI0KSwuTF9lb2YJCSAgICAgICAjIGlmIGl0IGlzIEVPRngKKwlieiAgICAuTGFnYWluMQkJCSAgICAgICAjIHNraXAgZGF0ZXNldCB0cmFpbGVyCisgICAgICAgIGxhICAgICVyNSwwKCVyNCwlcjIpCisgICAgICAgIGxyICAgICVyMywlcjIKKy5MaWRlYmM6CisgICAgICAgIHRtICAgIDAoJXI1KSwweDgwICAgICAgICAgICAgICAgICAgICAgICMgaGlnaCBvcmRlciBiaXQgc2V0ID8KKyAgICAgICAgYm8gICAgLkxkb2N2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgeWVzIC0+IGNvbnZlcnQgZnJvbSBFQkNESUMKKyAgICAgICAgYWhpICAgJXI1LC0xCisgICAgICAgIGJjdCAgICVyMywuTGlkZWJjCisgICAgICAgIGIgICAgIC5Mbm9jdgorLkxkb2N2OgorICAgICAgICBsICAgICAlcjMsLkxjdnRhYgorICAgICAgICB0ciAgICAwKDI1NiwlcjQpLDAoJXIzKSAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcGFyYW1ldGVycyB0byBhc2NpaQorICAgICAgICB0ciAgICAyNTYoMjU2LCVyNCksMCglcjMpCisgICAgICAgIHRyICAgIDUxMigyNTYsJXI0KSwwKCVyMykKKyAgICAgICAgdHIgICAgNzY4KDEyMiwlcjQpLDAoJXIzKQorLkxub2N2OiBsYSAgICAlcjMsQ09NTUFORF9MSU5FLVBBUk1BUkVBKCVyMTIpICAjIGxvYWQgYWRyLiBvZiBjb21tYW5kIGxpbmUKKwltdmMgICAwKDI1NiwlcjMpLDAoJXI0KQorCW12YyAgIDI1NigyNTYsJXIzKSwyNTYoJXI0KQorCW12YyAgIDUxMigyNTYsJXIzKSw1MTIoJXI0KQorCW12YyAgIDc2OCgxMjIsJXIzKSw3NjgoJXI0KQorICAgICAgICBzbHIgICAlcjAsJXIwCisgICAgICAgIGIgICAgIC5MY250bHAKKy5MZGVsc3BjOgorICAgICAgICBpYyAgICAlcjAsMCglcjIsJXIzKQorICAgICAgICBjaGkgICAlcjAsMHgyMCAgICAgICAgICAgICAgICAgICAgICAgICAjIGlzIGl0IGEgc3BhY2UgPworICAgICAgICBiZSAgICAuTGNudGxwCisgICAgICAgIGFoaSAgICVyMiwxCisgICAgICAgIGIgICAgIC5MZW9scAorLkxjbnRscDoKKyAgICAgICAgYnJjdCAgJXIyLC5MZGVsc3BjCisuTGVvbHA6CisgICAgICAgIHNsciAgICVyMCwlcjAKKyAgICAgICAgc3RjICAgJXIwLDAoJXIyLCVyMykgICAgICAgICAgICAgICAgICAgIyB0ZXJtaW5hdGUgYnVmZmVyCisuTG5vcGY6CisKKyMKKyMgbG9hZCByYW1kaXNrIGZyb20gaXBsIGRldmljZQorIwkKKy5MYWdhaW4yOgorIAlsICAgICAlcjIsSU5JVFJEX1NUQVJULVBBUk1BUkVBKCVyMTIpICAjIGxvYWQgYWRyLiBvZiByYW1kaXNrCisgICAgICAgIGJhcyAgICVyMTQsLkxsb2FkZXIgICAgICAgICAgICAgICAgICAgICMgbG9hZCByYW1kaXNrCisgCXN0ICAgICVyMixJTklUUkRfU0laRS1QQVJNQVJFQSglcjEyKSAgICMgc3RvcmUgc2l6ZSBvZiByYW1kaXNrCisgICAgICAgIGx0ciAgICVyMiwlcjIKKyAgICAgICAgYm56ICAgLkxyZGNvbnQKKyAgICAgICAgc3QgICAgJXIyLElOSVRSRF9TVEFSVC1QQVJNQVJFQSglcjEyKSAgIyBubyByYW1kaXNrIGZvdW5kLCBudWxsIGl0CisuTHJkY29udDoKKwlsICAgICAlcjIsSU5JVFJEX1NUQVJULVBBUk1BUkVBKCVyMTIpCisKKwljbGMgICAwKDMsJXIyKSwuTF9oZHIJCSAgICAgICAjIHNraXAgSERSeCBhbmQgRU9GeCAKKwlieiAgICAuTGFnYWluMgorCWNsYyAgIDAoMywlcjIpLC5MX2VvZgorCWJ6ICAgIC5MYWdhaW4yCisKKyNpZmRlZiBDT05GSUdfSVBMX1ZNCisjCisjIHJlc2V0IGZpbGVzIGluIFZNIHJlYWRlcgorIworICAgICAgICBzdGlkcCBfX0xDX0NQVUlEICAgICAgICAgICAgICAgICAgICAgICAjIHN0b3JlIGNwdWlkCisJdG0gICAgX19MQ19DUFVJRCwweGZmICAgICAgICAgICAgICAgICAgIyBydW5uaW5nIFZNID8KKwlibm8gICAuTG5vcmVzZXQKKyAgICAgICAgbGEgICAgJXIyLC5McmVzZXQgICAgICAgICAgICAgIAorICAgICAgICBsaGkgICAlcjMsMjYKKyAgICAgICAgLmxvbmcgMHg4MzIzMDAwOAorLkxub3Jlc2V0OgorI2VuZGlmCisJCisjCisjIGV2ZXJ5dGhpbmcgbG9hZGVkLCBnbyBmb3IgaXQKKyMKKy5Mbm9sb2FkOgorICAgICAgICBsICAgICAlcjEsLkxzdGFydHVwCisgICAgICAgIGJyICAgICVyMQorCisuTHBhcm06CS5sb25nICBQQVJNQVJFQQorLkxzdGFydHVwOiAubG9uZyBzdGFydHVwCisuTGN2dGFiOi5sb25nICBfZWJjYXNjICAgICAgICAgICAgICAgICAgICAgICAgICMgZWJjZGljIHRvIGFzY2lpIHRhYmxlCisuTHJlc2V0Oi5ieXRlICAweGMzLDB4YzgsMHhjMSwweGQ1LDB4YzcsMHhjNSwweDQwLDB4ZDksMHhjNCwweGQ5LDB4NDAKKyAgICAgICAgLmJ5dGUgIDB4YzEsMHhkMywweGQzLDB4NDAsMHhkMiwweGM1LDB4YzUsMHhkNywweDQwLDB4ZDUsMHhkNgorICAgICAgICAuYnl0ZSAgMHhjOCwweGQ2LDB4ZDMsMHhjNCAgICAgICAgICAgICAjICJjaGFuZ2UgcmRyIGFsbCBrZWVwIG5vaG9sZCIKKy5MX2VvZjogLmxvbmcgIDB4YzVkNmM2MDAgICAgICAgLyogQydFT0YnICovCisuTF9oZHI6IC5sb25nICAweGM4YzRkOTAwICAgICAgIC8qIEMnSERSJyAqLworCisjZW5kaWYgIC8qIENPTkZJR19JUEwgKi8KKworIworIyBTQUxJUEwgbG9hZGVyIHN1cHBvcnQuIEJhc2VkIG9uIGEgcGF0Y2ggYnkgUm9iIHZhbiBkZXIgSGVpai4KKyMgVGhpcyBlbnRyeSBwb2ludCBpcyBjYWxsZWQgZGlyZWN0bHkgZnJvbSB0aGUgU0FMSVBMIGxvYWRlciBhbmQKKyMgZG9lc24ndCBuZWVkIGEgYnVpbHRpbiBpcGwgcmVjb3JkLgorIworICAgICAgICAub3JnICAweDgwMAorCS5nbG9ibCBzdGFydAorc3RhcnQ6CisJc3RtICAgJXIwLCVyMTUsMHgwN2IwCQkjIHN0b3JlIHJlZ2lzdGVycworCWJhc3IgICVyMTIsJXIwCisuYmFzZToKKwlsICAgICAlcjExLC5wYXJtCisJbCAgICAgJXI4LC5jbWQJCQkjIHBvaW50ZXIgdG8gY29tbWFuZCBidWZmZXIKKworCWx0ciAgICVyOSwlcjkJCQkjIGRvIHdlIGhhdmUgU0FMSVBMIHBhcmFtZXRlcnM/CisJYnAgICAgLnNrOHg4CisKKwltdmMgICAwKDY0LCVyOCksMHgwMGIwCQkjIGNvcHkgc2F2ZWQgcmVnaXN0ZXJzCisJeGMgICAgNjQoMjQwLTY0LCVyOCksMCglcjgpCSMgcmVtYWluZGVyIG9mIGJ1ZmZlcgorCXRyICAgIDAoNjQsJXI4KSwubG93Y2FzZQkKKwliICAgICAuZ290cgorLnNrOHg4OgorCW12YyAgIDAoMjQwLCVyOCksMCglcjkpCQkjIGNvcHkgaXBscGFybXMgaW50byBidWZmZXIKKy5nb3RyOgorCWwgICAgICVyMTAsLnRibAkJCSMgRUJDRElDIHRvIEFTQ0lJIHRhYmxlCisJdHIgICAgMCgyNDAsJXI4KSwwKCVyMTApCisJc3RpZHAgX19MQ19DUFVJRAkJIyBBcmUgd2UgcnVubmluZyBvbiBWTSBtYXliZQorCWNsaSAgIF9fTENfQ1BVSUQsMHhmZgorCWJueiAgIC50ZXN0CisJLmxvbmcgMHg4MzMwMDA2MAkJIyBkaWFnIDMsMCx4JzAwNjAnIC0gc3RvcmFnZSBzaXplCisJYiAgICAgLmRvbmUKKy50ZXN0OgorCW12YyAgIDB4NjgoOCksLnBnbW53CQkjIHNldCB1cCBwZ20gY2hlY2sgaGFuZGxlcgorCWwgICAgICVyMiwuZm91cm1lZworCWxyICAgICVyMywlcjIKKwliY3RyICAlcjMsJXIwCQkJIyA0TS0xCisubG9vcDogIGlza2UgICVyMCwlcjMKKwlhciAgICAlcjMsJXIyCisucGdteDoKKwlzciAgICAlcjMsJXIyCisJbGEgICAgJXIzLDEoJXIzKQorLmRvbmU6CisgICAgICAgIGwgICAgICVyMSwubWVtc2l6ZQorCXN0ICAgICVyMywwKCVyMSkKKwlzbHIgICAlcjAsJXIwCisJc3QgICAgJXIwLElOSVRSRF9TSVpFLVBBUk1BUkVBKCVyMTEpCisJc3QgICAgJXIwLElOSVRSRF9TVEFSVC1QQVJNQVJFQSglcjExKQorCWogICAgIHN0YXJ0dXAgICAgICAgICAgICAgICAgICAgIyBjb250aW51ZSB3aXRoIHN0YXJ0dXAKKy50Ymw6CS5sb25nIF9lYmNhc2MJCQkjIHRyYW5zbGF0ZSB0YWJsZQorLmNtZDoJLmxvbmcgQ09NTUFORF9MSU5FCQkjIGFkZHJlc3Mgb2YgY29tbWFuZCBsaW5lIGJ1ZmZlcgorLnBhcm06CS5sb25nIFBBUk1BUkVBCisubWVtc2l6ZTogLmxvbmcgbWVtb3J5X3NpemUKKy5mb3VybWVnOiAubG9uZyAweDAwNDAwMDAwICAgICAgCSMgNE0KKy5wZ21udzoJLmxvbmcgMHgwMDA4MDAwMCwucGdteAorLmxvd2Nhc2U6CisJLmJ5dGUgMHgwMCwweDAxLDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3IAorCS5ieXRlIDB4MDgsMHgwOSwweDBhLDB4MGIsMHgwYywweDBkLDB4MGUsMHgwZgorCS5ieXRlIDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNyAKKwkuYnl0ZSAweDE4LDB4MTksMHgxYSwweDFiLDB4MWMsMHgxZCwweDFlLDB4MWYKKwkuYnl0ZSAweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcgCisJLmJ5dGUgMHgyOCwweDI5LDB4MmEsMHgyYiwweDJjLDB4MmQsMHgyZSwweDJmCisJLmJ5dGUgMHgzMCwweDMxLDB4MzIsMHgzMywweDM0LDB4MzUsMHgzNiwweDM3IAorCS5ieXRlIDB4MzgsMHgzOSwweDNhLDB4M2IsMHgzYywweDNkLDB4M2UsMHgzZgorCS5ieXRlIDB4NDAsMHg0MSwweDQyLDB4NDMsMHg0NCwweDQ1LDB4NDYsMHg0NyAKKwkuYnl0ZSAweDQ4LDB4NDksMHg0YSwweDRiLDB4NGMsMHg0ZCwweDRlLDB4NGYKKwkuYnl0ZSAweDUwLDB4NTEsMHg1MiwweDUzLDB4NTQsMHg1NSwweDU2LDB4NTcgCisJLmJ5dGUgMHg1OCwweDU5LDB4NWEsMHg1YiwweDVjLDB4NWQsMHg1ZSwweDVmCisJLmJ5dGUgMHg2MCwweDYxLDB4NjIsMHg2MywweDY0LDB4NjUsMHg2NiwweDY3IAorCS5ieXRlIDB4NjgsMHg2OSwweDZhLDB4NmIsMHg2YywweDZkLDB4NmUsMHg2ZgorCS5ieXRlIDB4NzAsMHg3MSwweDcyLDB4NzMsMHg3NCwweDc1LDB4NzYsMHg3NyAKKwkuYnl0ZSAweDc4LDB4NzksMHg3YSwweDdiLDB4N2MsMHg3ZCwweDdlLDB4N2YKKworCS5ieXRlIDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NyAKKwkuYnl0ZSAweDg4LDB4ODksMHg4YSwweDhiLDB4OGMsMHg4ZCwweDhlLDB4OGYKKwkuYnl0ZSAweDkwLDB4OTEsMHg5MiwweDkzLDB4OTQsMHg5NSwweDk2LDB4OTcgCisJLmJ5dGUgMHg5OCwweDk5LDB4OWEsMHg5YiwweDljLDB4OWQsMHg5ZSwweDlmCisJLmJ5dGUgMHhhMCwweGExLDB4YTIsMHhhMywweGE0LDB4YTUsMHhhNiwweGE3IAorCS5ieXRlIDB4YTgsMHhhOSwweGFhLDB4YWIsMHhhYywweGFkLDB4YWUsMHhhZgorCS5ieXRlIDB4YjAsMHhiMSwweGIyLDB4YjMsMHhiNCwweGI1LDB4YjYsMHhiNyAKKwkuYnl0ZSAweGI4LDB4YjksMHhiYSwweGJiLDB4YmMsMHhiZCwweGJlLDB4YmYKKwkuYnl0ZSAweGMwLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcJIyAuYWJjZGVmZyAKKwkuYnl0ZSAweDg4LDB4ODksMHhjYSwweGNiLDB4Y2MsMHhjZCwweGNlLDB4Y2YJIyBoaQorCS5ieXRlIDB4ZDAsMHg5MSwweDkyLDB4OTMsMHg5NCwweDk1LDB4OTYsMHg5NyAJIyAuamtsbW5vcAorCS5ieXRlIDB4OTgsMHg5OSwweGRhLDB4ZGIsMHhkYywweGRkLDB4ZGUsMHhkZgkjIHFyCisJLmJ5dGUgMHhlMCwweGUxLDB4YTIsMHhhMywweGE0LDB4YTUsMHhhNiwweGE3CSMgLi5zdHV2d3gKKwkuYnl0ZSAweGE4LDB4YTksMHhlYSwweGViLDB4ZWMsMHhlZCwweGVlLDB4ZWYJIyB5egorCS5ieXRlIDB4ZjAsMHhmMSwweGYyLDB4ZjMsMHhmNCwweGY1LDB4ZjYsMHhmNyAKKwkuYnl0ZSAweGY4LDB4ZjksMHhmYSwweGZiLDB4ZmMsMHhmZCwweGZlLDB4ZmYKKworIworIyBzdGFydHVwLWNvZGUgYXQgMHgxMDAwMCwgcnVubmluZyBpbiByZWFsIG1vZGUKKyMgdGhpcyBpcyBjYWxsZWQgZWl0aGVyIGJ5IHRoZSBpcGwgbG9hZGVyIG9yIGRpcmVjdGx5IGJ5IFBTVyByZXN0YXJ0CisjIG9yIGxpbmxvYWQgb3IgU0FMSVBMCisjCisgICAgICAgIC5vcmcgIDB4MTAwMDAKK3N0YXJ0dXA6YmFzciAgJXIxMywwICAgICAgICAgICAgICAgICAgICAgIyBnZXQgYmFzZQorLkxQRzE6ICBsY3RsICAlYzAsJWMxNSwuTGN0bC0uTFBHMSglcjEzKSAjIGxvYWQgY29udHJvbCByZWdpc3RlcnMKKwlsYSAgICAlcjEyLF9wc3RhcnQtLkxQRzEoJXIxMykgICAjIHBvaW50ZXIgdG8gcGFyYW1ldGVyIGFyZWEKKwkJCQkJICMgbW92ZSBJUEwgZGV2aWNlIHRvIGxvd2NvcmUKKyAgICAgICAgbXZjICAgX19MQ19JUExERVYoNCksSVBMX0RFVklDRS1QQVJNQVJFQSglcjEyKQorCQorIworIyBjbGVhciBic3MgbWVtb3J5CisjCisgICAgICAgIGwgICAgICVyMiwuTGJzc19iZ24tLkxQRzEoJXIxMykgIyBzdGFydCBvZiBic3MKKyAgICAgICAgbCAgICAgJXIzLC5MYnNzX2VuZC0uTFBHMSglcjEzKSAjIGVuZCBvZiBic3MKKyAgICAgICAgc3IgICAgJXIzLCVyMiAgICAgICAgICAgICAgICAgICAjIGxlbmd0aCBvZiBic3MKKyAgICAgICAgc3IgICAgJXI0LCVyNCAgICAgICAgICAgICAgICAgICAjCisgICAgICAgIHNyICAgICVyNSwlcjUgICAgICAgICAgICAgICAgICAgIyBzZXQgc3JjLGxlbmd0aCBhbmQgcGFkIHRvIHplcm8KKyAgICAgICAgc3IgICAgJXIwLCVyMCAgICAgICAgICAgICAgICAgICAjCisgICAgICAgIG12Y2xlICVyMiwlcjQsMCAgICAgICAgICAgICAgICAgIyBjbGVhciBtZW0KKyAgICAgICAgam8gICAgLi00ICAgICAgICAgICAgICAgICAgICAgICAjIGJyYW5jaCBiYWNrLCBpZiBub3QgZmluaXNoCisKKwlsICAgICAlcjIsLkxyY3AtLkxQRzEoJXIxMykJIyBSZWFkIFNDUCBmb3JjZWQgY29tbWFuZCB3b3JkCisuTHNlcnZpY2VjYWxsOgorCXN0b3NtIC5McG1hc2stLkxQRzEoJXIxMyksMHgwMQkjIGF1dGhvcml6ZSBleHQgaW50ZXJydXB0cworCisJc3RjdGwgJXIwLCAlcjAsLkxjci0uTFBHMSglcjEzKQkjIGdldCBjcjAKKwlsYSAgICAlcjEsMHgyMDAJCQkjIHNldCBiaXQgMjIKKwlvICAgICAlcjEsLkxjci0uTFBHMSglcjEzKQkjIG9yIG9sZCBjcjAgd2l0aCByMQorCXN0ICAgICVyMSwuTGNyLS5MUEcxKCVyMTMpCisJbGN0bCAgJXIwLCAlcjAsLkxjci0uTFBHMSglcjEzKQkjIGxvYWQgbW9kaWZpZWQgY3IwCisKKwltdmMgICBfX0xDX0VYVF9ORVdfUFNXKDgpLC5McGNleHQtLkxQRzEoJXIxMykgIyBzZXQgcG9zdGNhbGwgcHN3CisJbGEgICAgJXIxLCAuTHNjbHBoLS5MUEcxKCVyMTMpCisJYSAgICAgJXIxLF9fTENfRVhUX05FV19QU1crNAkjIHNldCBoYW5kbGVyCisJc3QgICAgJXIxLF9fTENfRVhUX05FV19QU1crNAorCisJbGEgICAgJXI0LF9wc3RhcnQtLkxQRzEoJXIxMykJIyAlcjQgaXMgb3VyIGluZGV4IGZvciBzY2NiIHN0dWZmCisJbGEgICAgJXIxLCAuTHNjY2ItUEFSTUFSRUEoJXI0KQkjIG91ciBzY2NiCisJLmluc24gcnJlLDB4YjIyMDAwMDAsJXIyLCVyMQkjIHNlcnZpY2UgY2FsbAorCWlwbSAgICVyMQorCXNybCAgICVyMSwyOAkJCSMgZ2V0IGNjIGNvZGUKKwl4ciAgICAlcjMsICVyMworCWNoaSAgICVyMSwzCisJYmUgICAgLkxmY2h1bmstLkxQRzEoJXIxMykJIyBsZWF2ZQorCWNoaSAgICVyMSwyCisJYmUgICAgLkxzZXJ2aWNlY2FsbC0uTFBHMSglcjEzKQorCWxwc3cgIC5Md2FpdHNjbHAtLkxQRzEoJXIxMykKKy5Mc2NscGg6CisJbGggICAgJXIxLC5Mc2NjYnItUEFSTUFSRUEoJXI0KQorCWNoaSAgICVyMSwweDEwCQkJIyAweDAwMTAgaXMgdGhlIHN1Y2VzcyBjb2RlCisJamUgICAgLkxwcm9jc2NjYgkJIyBsZXQncyBwcm9jZXNzIHRoZSBzY2NiCisJY2hpICAgJXIxLDB4MWYwCisJYm5lICAgLkxmY2h1bmstLkxQRzEoJXIxMykJIyB1bmhhbmRsZWQgZXJyb3IgY29kZQorCWMgICAgICVyMiwgLkxyY3AtLkxQRzEoJXIxMykJIyBEaWQgd2UgdHJ5IFJlYWQgU0NQIGZvcmNlZAorCWJuZSAgIC5MZmNodW5rLS5MUEcxKCVyMTMpCSMgaWYgbm8sIGdpdmUgdXAKKwlsICAgICAlcjIsIC5McmNwMi0uTFBHMSglcjEzKQkjIHRyeSB3aXRoIFJlYWQgU0NQCisJYiAgICAgLkxzZXJ2aWNlY2FsbC0uTFBHMSglcjEzKQorLkxwcm9jc2NjYjoKKwlsaCAgICAlcjEsLkxzY3BpbmNyMS1QQVJNQVJFQSglcjQpICMgdXNlIHRoaXMgb25lIGlmICE9IDAKKwljaGkgICAlcjEsMHgwMAorCWpuZSAgIC5Mc2NuZAorCWwgICAgICVyMSwuTHNjcGluY3IyLVBBUk1BUkVBKCVyNCkgIyBvdGhlcndpc2UgdXNlIHRoaXMgb25lCisuTHNjbmQ6CisJeHIgICAgJXIzLCVyMwkJCSMgc2FtZSBsb2dpYworCWljICAgICVyMywuTHNjcGExLVBBUk1BUkVBKCVyNCkKKwljaGkgICAlcjMsMHgwMAorCWpuZSAgIC5MY29tcG1lbQorCWwgICAgICVyMywuTHNjcGEyLVBBUk1BUkVBKCVyMTMpCisuTGNvbXBtZW06CisJbXIgICAgJXIyLCVyMQkJCSMgbWVtIGluIE1CIG9uIDEyOC1iaXQKKwlsICAgICAlcjEsLkxvbmVtYi0uTFBHMSglcjEzKQorCW1yICAgICVyMiwlcjEJCQkjIG1lbSBzaXplIGluIGJ5dGVzIGluICVyMworCWIgICAgIC5MZmNodW5rLS5MUEcxKCVyMTMpCisKKy5McG1hc2s6CisJLmJ5dGUgMAorLmFsaWduIDgKKy5McGNleHQ6LmxvbmcgIDB4MDAwODAwMDAsMHg4MDAwMDAwMAorLkxjcjoKKwkubG9uZyAweDAwCQkJIyBwbGFjZSBob2xkZXIgZm9yIGNyMAorLkx3YWl0c2NscDoKKwkubG9uZyAweDAyMEEwMDAwCisJLmxvbmcgLkxzY2xwaAorLkxyY3A6CisJLmludCAweDAwMTIwMDAxCQkJIyBSZWFkIFNDUCBmb3JjZWQgY29kZQorLkxyY3AyOgorCS5pbnQgMHgwMDAyMDAwMQkJCSMgUmVhZCBTQ1AgY29kZQorLkxvbmVtYjoKKwkuaW50IDB4MTAwMDAwCisuTGZjaHVuazoKKworIworIyBmaW5kIG1lbW9yeSBjaHVua3MuCisjCisJbHIgICAgJXI5LCVyMwkJCSAjIGVuZCBvZiBtZW0KKwltdmMgICBfX0xDX1BHTV9ORVdfUFNXKDgpLC5McGNtZW0tLkxQRzEoJXIxMykKKwlsYSAgICAlcjEsMSAgICAgICAgICAgICAgICAgICAgICAjIHRlc3QgaW4gaW5jcmVtZW50cyBvZiAxMjhLQgorCXNsbCAgICVyMSwxNworCWwgICAgICVyMywuTG1jaHVuay0uTFBHMSglcjEzKSAgICMgZ2V0IHBvaW50ZXIgdG8gbWVtb3J5X2NodW5rIGFycmF5CisJc2xyICAgJXI0LCVyNCAgICAgICAgICAgICAgICAgICAgIyBzZXQgc3RhcnQgb2YgY2h1bmsgdG8gemVybworCXNsciAgICVyNSwlcjUgICAgICAgICAgICAgICAgICAgICMgc2V0IGVuZCBvZiBjaHVuayB0byB6ZXJvCisJc2xyICAgJXI2LCVyNgkJCSAjIHNldCBhY2Nlc3MgY29kZSB0byB6ZXJvCisJbGEgICAgJXIxMCwgTUVNT1JZX0NIVU5LUwkgIyBudW1iZXIgb2YgY2h1bmtzCisuTGxvb3A6CisJdHByb3QgMCglcjUpLDAJCQkgIyB0ZXN0IHByb3RlY3Rpb24gb2YgZmlyc3QgYnl0ZQorCWlwbSAgICVyNworCXNybCAgICVyNywyOAorCWNsciAgICVyNiwlcjcJCQkgIyBjb21wYXJlIGNjIHdpdGggbGFzdCBhY2Nlc3MgY29kZQorCWJlICAgIC5Mc2FtZS0uTFBHMSglcjEzKQorCWIgICAgIC5MY2hrbWVtLS5MUEcxKCVyMTMpCisuTHNhbWU6CisJYXIgICAgJXI1LCVyMQkJCSAjIGFkZCAxMjhLQiB0byBlbmQgb2YgY2h1bmsKKwlibm8gICAuTGxvb3AtLkxQRzEoJXIxMykJICMgcjEgPCAweDgwMDAwMDAwIC0+IGxvb3AKKy5MY2hrbWVtOgkJCQkgIyA+IDJHQiBvciB0cHJvdCBnb3QgYSBwcm9ncmFtIGNoZWNrCisJY2xyICAgJXI0LCVyNQkJCSAjIGNodW5rIHNpemUgPiAwPworCWJlICAgIC5MY2hrbG9vcC0uTFBHMSglcjEzKQorCXN0ICAgICVyNCwwKCVyMykJCSAjIHN0b3JlIHN0YXJ0IGFkZHJlc3Mgb2YgY2h1bmsKKwlsciAgICAlcjAsJXI1CisJc2xyICAgJXIwLCVyNAorCXN0ICAgICVyMCw0KCVyMykJCSAjIHN0b3JlIHNpemUgb2YgY2h1bmsKKwlzdCAgICAlcjYsOCglcjMpCQkgIyBzdG9yZSB0eXBlIG9mIGNodW5rCisJbGEgICAgJXIzLDEyKCVyMykKKwlsICAgICAlcjQsLkxtZW1zaXplLS5MUEcxKCVyMTMpCSAjIGFkZHJlc3Mgb2YgdmFyaWFibGUgbWVtb3J5X3NpemUKKwlzdCAgICAlcjUsMCglcjQpCQkgIyBzdG9yZSBsYXN0IGVuZCB0byBtZW1vcnkgc2l6ZQorCWFoaSAgICVyMTAsLTEJCQkgIyB1cGRhdGUgY2h1bmsgbnVtYmVyCisuTGNoa2xvb3A6CisJbHIgICAgJXI2LCVyNwkJCSAjIHNldCBhY2Nlc3MgY29kZSB0byBsYXN0IGNjCisJIyB3ZSBnb3QgYW4gZXhjZXB0aW9uIG9yIHdlJ3JlIHN0YXJ0aW5nIGEgbmV3CisJIyBjaHVuayAsIHdlIG11c3QgY2hlY2sgaWYgd2Ugc2hvdWxkCisJIyBzdGlsbCB0cnkgdG8gZmluZCB2YWxpZCBtZW1vcnkgKGlmIHdlIGRldGVjdGVkCisJIyB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZSBzdG9yYWdlKSwgYW5kIGlmIHdlCisJIyBoYXZlIGNodW5rcyBsZWZ0CisJeHIgICAgJXIwLCVyMAorCWNsciAgICVyMCwlcjkJCQkgIyBkaWQgd2UgZGV0ZWN0IG1lbW9yeT8KKwlqZSAgICAuTGRvbmVtZW0JCQkgIyBpZiBub3QsIGxlYXZlCisJY2hpICAgJXIxMCwwCQkJICMgZG8gd2UgaGF2ZSBjaHVua3MgbGVmdD8KKwlqZSAgICAuTGRvbmVtZW0KKwlhbHIgICAlcjUsJXIxCQkJICMgYWRkIDEyOEtCIHRvIGVuZCBvZiBjaHVuaworCWxyICAgICVyNCwlcjUJCQkgIyBwb3RlbnRpYWwgbmV3IGNodW5rCisJY2xyICAgICVyNSwlcjkJCQkgIyBzaG91bGQgd2UgZ28gb24/CisJamwgICAgIC5MbG9vcAorLkxkb25lbWVtOgkJCisgICAgICAgIGwgICAgICAlcjEyLC5MbWZsYWdzLS5MUEcxKCVyMTMpICMgZ2V0IGFkZHJlc3Mgb2YgbWFjaGluZV9mbGFncworIworIyBmaW5kIG91dCBpZiB3ZSBhcmUgcnVubmluZyB1bmRlciBWTQorIworICAgICAgICBzdGlkcCAgX19MQ19DUFVJRCAgICAgICAgICAgICAgICMgc3RvcmUgY3B1aWQKKwl0bSAgICAgX19MQ19DUFVJRCwweGZmICAgICAgICAgICMgcnVubmluZyB1bmRlciBWTSA/CisJYm5vICAgIC5Mbm92bS0uTFBHMSglcjEzKQorICAgICAgICBvaSAgICAgMyglcjEyKSwxICAgICAgICAgICAgICAgICMgc2V0IFZNIGZsYWcKKy5Mbm92bToKKyAgICAgICAgbGggICAgICVyMCxfX0xDX0NQVUlEKzQgICAgICAgICAjIGdldCBjcHUgdmVyc2lvbgorICAgICAgICBjaGkgICAgJXIwLDB4NzQ5MCAgICAgICAgICAgICAgICMgcnVubmluZyBvbiBhIFAvMzkwID8KKyAgICAgICAgYm5lICAgIC5Mbm9wMzkwLS5MUEcxKCVyMTMpCisgICAgICAgIG9pICAgICAzKCVyMTIpLDQgICAgICAgICAgICAgICAgIyBzZXQgUC8zOTAgZmxhZworLkxub3AzOTA6CisKKyMKKyMgZmluZCBvdXQgaWYgd2UgaGF2ZSBhbiBJRUVFIGZwdQorIworICAgICAgICBtdmMgICAgX19MQ19QR01fTkVXX1BTVyg4KSwuTHBjZnB1LS5MUEcxKCVyMTMpCisJZWZwYyAgICVyMCwwICAgICAgICAgICAgICAgICAgICAjIHRlc3QgSUVFRSBleHRyYWN0IGZwYyBpbnN0cnVjdGlvbgorICAgICAgICBvaSAgICAgMyglcjEyKSwyICAgICAgICAgICAgICAgICMgc2V0IElFRUUgZnB1IGZsYWcKKy5MY2hrZnB1OgorCisjCisjIGZpbmQgb3V0IGlmIHdlIGhhdmUgdGhlIENTUCBpbnN0cnVjdGlvbgorIworICAgICAgIG12YyAgICBfX0xDX1BHTV9ORVdfUFNXKDgpLC5McGNjc3AtLkxQRzEoJXIxMykKKyAgICAgICBsYSAgICAgJXIwLDAKKyAgICAgICBsciAgICAgJXIxLCVyMAorICAgICAgIGxhICAgICAlcjIsNAorICAgICAgIGNzcCAgICAlcjAsJXIyICAgICAgICAgICAgICAgICAgICMgVGVzdCBDU1AgaW5zdHJ1Y3Rpb24KKyAgICAgICBvaSAgICAgMyglcjEyKSw4ICAgICAgICAgICAgICAgICAjIHNldCBDU1AgZmxhZworLkxjaGtjc3A6CisKKyMKKyMgZmluZCBvdXQgaWYgd2UgaGF2ZSB0aGUgTVZQRyBpbnN0cnVjdGlvbgorIworICAgICAgIG12YyAgICBfX0xDX1BHTV9ORVdfUFNXKDgpLC5McGNtdnBnLS5MUEcxKCVyMTMpCisgICAgICAgc3IgICAgICVyMCwlcjAKKyAgICAgICBsYSAgICAgJXIxLDAKKyAgICAgICBsYSAgICAgJXIyLDAKKyAgICAgICBtdnBnICAgJXIxLCVyMiAgICAgICAgICAgICAgICAgICAjIFRlc3QgQ1NQIGluc3RydWN0aW9uCisgICAgICAgb2kgICAgIDMoJXIxMiksMTYgICAgICAgICAgICAgICAgIyBzZXQgTVZQRyBmbGFnCisuTGNoa212cGc6CisKKyMKKyMgZmluZCBvdXQgaWYgd2UgaGF2ZSB0aGUgSURURSBpbnN0cnVjdGlvbgorIworCW12YwlfX0xDX1BHTV9ORVdfUFNXKDgpLC5McGNpZHRlLS5MUEcxKCVyMTMpCisJLmxvbmcJMHhiMmIxMDAwMAkJIyBzdG9yZSBmYWNpbGl0eSBsaXN0CisJdG0JMHhjOCwweDA4CQkjIGNoZWNrIGJpdCBmb3IgY2xlYXJpbmctYnktQVNDRQorCWJubwkuTGNoa2lkdGUtLkxQRzEoJXIxMykKKwlsaGkJJXIxLDIwOTQKKwlsaGkJJXIyLDAKKwkubG9uZwkweGI5OGUyMDAxCisJb2kJMyglcjEyKSwweDgwCQkjIHNldCBJRFRFIGZsYWcKKy5MY2hraWR0ZToKKworICAgICAgICBscHN3ICAuTGVudHJ5LS5MUEcxKDEzKSAgICAgICAgICMganVtcCB0byBfc3RleHQgaW4gcHJpbWFyeS1zcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHZpcnR1YWwgYW5kIG5ldmVyIHJldHVybiAuLi4KKyAgICAgICAgLmFsaWduIDgKKy5MZW50cnk6LmxvbmcgIDB4MDAwODAwMDAsMHg4MDAwMDAwMCArIF9zdGV4dAorLkxjdGw6ICAubG9uZyAgMHgwNGI1MDAwMiAgICAgICAgICAgICAgICMgY3IwOiB2YXJpb3VzIHRoaW5ncworICAgICAgICAubG9uZyAgMCAgICAgICAgICAgICAgICAgICAgICAgICMgY3IxOiBwcmltYXJ5IHNwYWNlIHNlZ21lbnQgdGFibGUKKyAgICAgICAgLmxvbmcgIC5MZHVjdCAgICAgICAgICAgICAgICAgICAjIGNyMjogZGlzcGF0Y2hhYmxlIHVuaXQgY29udHJvbCB0YWJsZQorICAgICAgICAubG9uZyAgMCAgICAgICAgICAgICAgICAgICAgICAgICMgY3IzOiBpbnN0cnVjdGlvbiBhdXRob3JpemF0aW9uCisgICAgICAgIC5sb25nICAwICAgICAgICAgICAgICAgICAgICAgICAgIyBjcjQ6IGluc3RydWN0aW9uIGF1dGhvcml6YXRpb24KKyAgICAgICAgLmxvbmcgIDB4ZmZmZmZmZmYgICAgICAgICAgICAgICAjIGNyNTogcHJpbWFyeS1hc3RlIG9yaWdpbgorICAgICAgICAubG9uZyAgMCAgICAgICAgICAgICAgICAgICAgICAgICMgY3I2OiAgSS9PIGludGVycnVwdHMKKyAgICAgICAgLmxvbmcgIDAgICAgICAgICAgICAgICAgICAgICAgICAjIGNyNzogIHNlY29uZGFyeSBzcGFjZSBzZWdtZW50IHRhYmxlCisgICAgICAgIC5sb25nICAwICAgICAgICAgICAgICAgICAgICAgICAgIyBjcjg6ICBhY2Nlc3MgcmVnaXN0ZXJzIHRyYW5zbGF0aW9uCisgICAgICAgIC5sb25nICAwICAgICAgICAgICAgICAgICAgICAgICAgIyBjcjk6ICB0cmFjaW5nIG9mZgorICAgICAgICAubG9uZyAgMCAgICAgICAgICAgICAgICAgICAgICAgICMgY3IxMDogdHJhY2luZyBvZmYKKyAgICAgICAgLmxvbmcgIDAgICAgICAgICAgICAgICAgICAgICAgICAjIGNyMTE6IHRyYWNpbmcgb2ZmCisgICAgICAgIC5sb25nICAwICAgICAgICAgICAgICAgICAgICAgICAgIyBjcjEyOiB0cmFjaW5nIG9mZgorICAgICAgICAubG9uZyAgMCAgICAgICAgICAgICAgICAgICAgICAgICMgY3IxMzogaG9tZSBzcGFjZSBzZWdtZW50IHRhYmxlCisgICAgICAgIC5sb25nICAweGMwMDAwMDAwICAgICAgICAgICAgICAgIyBjcjE0OiBtYWNoaW5lIGNoZWNrIGhhbmRsaW5nIG9mZgorICAgICAgICAubG9uZyAgMCAgICAgICAgICAgICAgICAgICAgICAgICMgY3IxNTogbGlua2FnZSBzdGFjayBvcGVyYXRpb25zCisuTHBjbWVtOi5sb25nICAweDAwMDgwMDAwLDB4ODAwMDAwMDAgKyAuTGNoa21lbQorLkxwY2ZwdToubG9uZyAgMHgwMDA4MDAwMCwweDgwMDAwMDAwICsgLkxjaGtmcHUKKy5McGNjc3A6LmxvbmcgIDB4MDAwODAwMDAsMHg4MDAwMDAwMCArIC5MY2hrY3NwCisuTHBjbXZwZzoubG9uZyAweDAwMDgwMDAwLDB4ODAwMDAwMDAgKyAuTGNoa212cGcKKy5McGNpZHRlOi5sb25nIDB4MDAwODAwMDAsMHg4MDAwMDAwMCArIC5MY2hraWR0ZQorLkxtZW1zaXplOi5sb25nIG1lbW9yeV9zaXplCisuTG1jaHVuazoubG9uZyBtZW1vcnlfY2h1bmsKKy5MbWZsYWdzOi5sb25nIG1hY2hpbmVfZmxhZ3MKKy5MYnNzX2JnbjogIC5sb25nICBfX2Jzc19zdGFydAorLkxic3NfZW5kOiAgLmxvbmcgIF9lbmQKKworCS5vcmcgUEFSTUFSRUEtNjQKKy5MZHVjdDoJLmxvbmcgMCwwLDAsMCwwLDAsMCwwCisJLmxvbmcgMCwwLDAsMCwwLDAsMCwwCisKKyMKKyMgcGFyYW1zIGF0IDEwNDAwIChzZXR1cC5oKQorIworCS5vcmcgICBQQVJNQVJFQQorCS5nbG9iYWwgX3BzdGFydAorX3BzdGFydDoJCisgICAgICAgIC5sb25nICAwLDAgICAgICAgICAgICAgICAgICAgICAgIyBJUExfREVWSUNFCisgICAgICAgIC5sb25nICAwLFJBTURJU0tfT1JJR0lOICAgICAgICAgIyBJTklUUkRfU1RBUlQKKyAgICAgICAgLmxvbmcgIDAsUkFNRElTS19TSVpFICAgICAgICAgICAjIElOSVRSRF9TSVpFCisKKyAgICAgICAgLm9yZyAgIENPTU1BTkRfTElORQorICAgIAkuYnl0ZSAgInJvb3Q9L2Rldi9yYW0wIHJvIgorICAgICAgICAuYnl0ZSAgMAorCS5vcmcgICAweDExMDAwCisuTHNjY2I6CisJLmh3b3JkIDB4MTAwMAkJCSMgbGVuZ3RoLCBvbmUgcGFnZQorCS5ieXRlIDB4MDAsMHgwMCwweDAwCisJLmJ5dGUgMHg4MAkJCSMgdmFyaWFibGUgcmVzcG9uc2UgYml0IHNldAorLkxzY2NicjoKKwkuaHdvcmQgMHgwMAkJCSMgcmVzcG9uc2UgY29kZQorLkxzY3BpbmNyMToKKwkuaHdvcmQgMHgwMAorLkxzY3BhMToKKwkuYnl0ZSAweDAwCisJLmZpbGwgODksMSwwCisuTHNjcGEyOgorCS5pbnQgMHgwMAorLkxzY3BpbmNyMjoKKwkucXVhZCAweDAwCisJLmZpbGwgMzk4NCwxLDAKKwkub3JnIDB4MTIwMDAKKwkuZ2xvYmFsIF9wZW5kCitfcGVuZDoJCisKKyNpZmRlZiBDT05GSUdfU0hBUkVEX0tFUk5FTAorCS5vcmcgICAweDEwMDAwMAorI2VuZGlmCisKKyMKKyMgc3RhcnR1cC1jb2RlLCBydW5uaW5nIGluIHZpcnR1YWwgbW9kZQorIworICAgICAgICAuZ2xvYmwgX3N0ZXh0Citfc3RleHQ6CWJhc3IgICVyMTMsMCAgICAgICAgICAgICAgICAgICAgIyBnZXQgYmFzZQorLkxQRzI6CisjCisjIFNldHVwIHN0YWNrCisjCisgICAgICAgIGwgICAgICVyMTUsLkxpbml0dHUtLkxQRzIoJXIxMykKKwltdmMgICBfX0xDX0NVUlJFTlQoNCksX19USV90YXNrKCVyMTUpCisgICAgICAgIGFoaSAgICVyMTUsMTw8KFBBR0VfU0hJRlQrVEhSRUFEX09SREVSKSAjIGluaXRfdGFza191bmlvbiArIFRIUkVBRF9TSVpFCisgICAgICAgIHN0ICAgICVyMTUsX19MQ19LRVJORUxfU1RBQ0sgICAgIyBzZXQgZW5kIG9mIGtlcm5lbCBzdGFjaworICAgICAgICBhaGkgICAlcjE1LC05NgorICAgICAgICB4YyAgICBfX1NGX0JBQ0tDSEFJTig0LCVyMTUpLF9fU0ZfQkFDS0NIQUlOKCVyMTUpICMgY2xlYXIgYmFja2NoYWluCisKKyMgY2hlY2sgY29udHJvbCByZWdpc3RlcnMKKyAgICAgICAgc3RjdGwgICVjMCwlYzE1LDAoJXIxNSkKKwlvaSAgICAgMiglcjE1KSwweDIwICAgICAgICAgICAgICMgZW5hYmxlIHNpZ3AgZXh0ZXJuYWwgaW50ZXJydXB0cworCW9pICAgICAwKCVyMTUpLDB4MTAgICAgICAgICAgICAgIyBzd2l0Y2ggb24gbG93IGFkZHJlc3MgcHJvdGVjdGlvbgorICAgICAgICBsY3RsICAgJWMwLCVjMTUsMCglcjE1KQorCisjCisgICAgICAgIGxhbSAgICAwLDE1LC5MYXJlZ3MtLkxQRzIoJXIxMykgIyBsb2FkIGFjY2VzcyByZWdzIG5lZWRlZCBieSB1YWNjZXNzCisgICAgICAgIGwgICAgICAlcjE0LC5Mc3RhcnQtLkxQRzIoJXIxMykKKyAgICAgICAgYmFzciAgICVyMTQsJXIxNCAgICAgICAgICAgICAgICAjIGNhbGwgc3RhcnRfa2VybmVsCisjCisjIFdlIHJldHVybmVkIGZyb20gc3RhcnRfa2VybmVsID8hPyBQQU5JSworIworICAgICAgICBiYXNyICAlcjEzLDAKKwlscHN3ICAuTGR3LS4oJXIxMykgICAgICAgICAgICMgbG9hZCBkaXNhYmxlZCB3YWl0IHBzdworIworICAgICAgICAgICAgLmFsaWduIDgKKy5MZHc6CSAgICAubG9uZyAgMHgwMDBhMDAwMCwweDAwMDAwMDAwCisuTGluaXR0dTogICAubG9uZyAgaW5pdF90aHJlYWRfdW5pb24KKy5Mc3RhcnQ6ICAgIC5sb25nICBzdGFydF9rZXJuZWwKKy5MYXJlZ3M6ICAgIC5sb25nICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwCisKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvaGVhZDY0LlMgYi9hcmNoL3MzOTAva2VybmVsL2hlYWQ2NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNjY3OTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL2hlYWQ2NC5TCkBAIC0wLDAgKzEsNzY5IEBACisvKgorICogIGFyY2gvczM5MC9rZXJuZWwvaGVhZC5TCisgKgorICogIFMzOTAgdmVyc2lvbgorICogICAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgorICogICAgQXV0aG9yKHMpOiBIYXJ0bXV0IFBlbm5lciAoaHBAZGUuaWJtLmNvbSksCisgKiAgICAgICAgICAgICAgIE1hcnRpbiBTY2h3aWRlZnNreSAoc2Nod2lkZWZza3lAZGUuaWJtLmNvbSksCisgKiAgICAgICAgICAgICAgIFJvYiB2YW4gZGVyIEhlaWogKHJ2ZGhlaUBpYWUubmwpCisgKgorICogVGhlcmUgYXJlIDUgZGlmZmVyZW50IElQTCBtZXRob2RzCisgKiAgMSkgbG9hZCB0aGUgaW1hZ2UgZGlyZWN0bHkgaW50byByYW0gYXQgYWRkcmVzcyAwIGFuZCBkbyBhbiBQU1cgcmVzdGFydAorICogIDIpIGxpbmxvYWQgd2lsbCBsb2FkIHRoZSBpbWFnZSBmcm9tIGFkZHJlc3MgMHgxMDAwMCB0byBtZW1vcnkgMHgxMDAwMAorICogICAgIGFuZCBzdGFydCB0aGUgY29kZSB0aHJ1IExQU1cgMHgwMDA4MDAwMDgwMDEwMDAwIChWTSBvbmx5LCBkZXByZWNhdGVkKQorICogIDMpIGdlbmVyYXRlIHRoZSB0YXBlIGlwbCBoZWFkZXIsIHN0b3JlIHRoZSBnZW5lcmF0ZWQgaW1hZ2Ugb24gYSB0YXBlCisgKiAgICAgYW5kIGlwbCBmcm9tIGl0CisgKiAgICAgSW4gY2FzZSBvZiBTTCB0YXBlIHlvdSBuZWVkIHRvIElQTCA1IHRpbWVzIHRvIGdldCBwYXN0IFZPTDEgZXRjCisgKiAgNCkgZ2VuZXJhdGUgdGhlIHZtIHJlYWRlciBpcGwgaGVhZGVyLCBtb3ZlIHRoZSBnZW5lcmF0ZWQgaW1hZ2UgdG8gdGhlCisgKiAgICAgVk0gcmVhZGVyICh1c2Ugb3B0aW9uIE5PSCEpIGFuZCBkbyBhIGlwbCBmcm9tIHJlYWRlciAoVk0gb25seSkKKyAqICA1KSBkaXJlY3QgY2FsbCBvZiBzdGFydCBieSB0aGUgU0FMSVBMIGxvYWRlcgorICogIFdlIHVzZSB0aGUgY3B1aWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBWTSBhbmQgbmF0aXZlIGlwbAorICogIHBhcmFtcyBmb3Iga2VybmVsIGFyZSBwdXNoZWQgdG8gMHgxMDQwMCAoc2VlIHNldHVwLmgpCisKKyAgICBDaGFuZ2VzOiAKKyAgICBPa3QgMjUgMjAwMCA8cnZkaGVpakBpYWUubmw+CisJYWRkZWQgY29kZSB0byBza2lwIEhEUiBhbmQgRU9GIHRvIGFsbG93IFNMIHRhcGUgSVBMICg1IHJldHJpZXMpCisJY2hhbmdlZCBmaXJzdCBDQ1cgZnJvbSByZXdpbmQgdG8gYmFja3NwYWNlIGJsb2NrCisKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL2xvd2NvcmUuaD4KKyNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKKyNpZm5kZWYgQ09ORklHX0lQTAorICAgICAgICAub3JnICAgMAorICAgICAgICAubG9uZyAgMHgwMDA4MDAwMCwweDgwMDAwMDAwK3N0YXJ0dXAgICAjIEp1c3QgYSByZXN0YXJ0IFBTVworI2Vsc2UKKyNpZmRlZiBDT05GSUdfSVBMX1RBUEUKKyNkZWZpbmUgSVBMX0JTIDEwMjQKKyAgICAgICAgLm9yZyAgIDAKKyAgICAgICAgLmxvbmcgIDB4MDAwODAwMDAsMHg4MDAwMDAwMCtpcGxzdGFydCAgIyBUaGUgZmlyc3QgMjQgYnl0ZXMgYXJlIGxvYWRlZAorICAgICAgICAubG9uZyAgMHgyNzAwMDAwMCwweDYwMDAwMDAxICAgICAgICAgICAjIGJ5IGlwbCB0byBhZGRyZXNzZXMgMC0yMy4KKyAgICAgICAgLmxvbmcgIDB4MDIwMDAwMDAsMHgyMDAwMDAwMCtJUExfQlMgICAgIyAoYSBQU1cgYW5kIHR3byBDQ1dzKS4KKyAgICAgICAgLmxvbmcgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCAgICAgICAgICAgIyBleHRlcm5hbCBvbGQgcHN3CisgICAgICAgIC5sb25nICAweDAwMDAwMDAwLDB4MDAwMDAwMDAgICAgICAgICAgICMgc3ZjIG9sZCBwc3cKKyAgICAgICAgLmxvbmcgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCAgICAgICAgICAgIyBwcm9ncmFtIGNoZWNrIG9sZCBwc3cKKyAgICAgICAgLmxvbmcgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCAgICAgICAgICAgIyBtYWNoaW5lIGNoZWNrIG9sZCBwc3cKKyAgICAgICAgLmxvbmcgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCAgICAgICAgICAgIyBpbyBvbGQgcHN3CisgICAgICAgIC5sb25nICAweDAwMDAwMDAwLDB4MDAwMDAwMDAKKyAgICAgICAgLmxvbmcgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMAorICAgICAgICAubG9uZyAgMHgwMDAwMDAwMCwweDAwMDAwMDAwCisgICAgICAgIC5sb25nICAweDAwMGEwMDAwLDB4MDAwMDAwNTggICAgICAgICAgICMgZXh0ZXJuYWwgbmV3IHBzdworICAgICAgICAubG9uZyAgMHgwMDBhMDAwMCwweDAwMDAwMDYwICAgICAgICAgICAjIHN2YyBuZXcgcHN3CisgICAgICAgIC5sb25nICAweDAwMGEwMDAwLDB4MDAwMDAwNjggICAgICAgICAgICMgcHJvZ3JhbSBjaGVjayBuZXcgcHN3CisgICAgICAgIC5sb25nICAweDAwMGEwMDAwLDB4MDAwMDAwNzAgICAgICAgICAgICMgbWFjaGluZSBjaGVjayBuZXcgcHN3CisgICAgICAgIC5sb25nICAweDAwMDgwMDAwLDB4ODAwMDAwMDArLkxpb2ludCAgICMgaW8gbmV3IHBzdworCisgICAgICAgIC5vcmcgICAweDEwMAorIworIyBzdWJyb3V0aW5lIGZvciBsb2FkaW5nIGZyb20gdGFwZQorIyBQYXJhbXRlcnM6CQorIyAgUjEgPSBkZXZpY2UgbnVtYmVyCisjICBSMiA9IGxvYWQgYWRkcmVzcworLkxsb2FkZXI6CQorICAgICAgICBzdCAgICAlcjE0LC5MbGRyZXQKKyAgICAgICAgbGEgICAgJXIzLC5Mb3JicmVhZCAgICAgICAgICAgICAgICAgICAgIyByMyA9IGFkZHJlc3Mgb2Ygb3JiIAorCWxhICAgICVyNSwuTGlyYiAgICAgICAgICAgICAgICAgICAgICAgICMgcjUgPSBhZGRyZXNzIG9mIGlyYgorICAgICAgICBzdCAgICAlcjIsLkxjY3dyZWFkKzQgICAgICAgICAgICAgICAgICAjIGluaXRpYWxpemUgQ0NXIGRhdGEgYWRkcmVzc2VzCisgICAgICAgIGxjdGwgICVjNiwlYzYsLkxjcjYgICAgICAgICAgICAgICAKKyAgICAgICAgc2xyICAgJXIyLCVyMgorLkxsZGxwOgorICAgICAgICBsYSAgICAlcjYsMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDMgcmV0cmllcworLkxzc2NoOgorICAgICAgICBzc2NoICAwKCVyMykgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxvYWQgY2h1bmsgb2YgSVBMX0JTIGJ5dGVzCisgICAgICAgIGJueiAgIC5MbGRlcnIKKy5MdzRlbmQ6CisgICAgICAgIGJhcyAgICVyMTQsLkx3YWl0NGlvCisgICAgICAgIHRtICAgIDgoJXI1KSwweDgyICAgICAgICAgICAgICAgICAgICAgICMgZG8gd2UgaGF2ZSBhIHByb2JsZW0gPworICAgICAgICBibnogICAuTHJlY292CisgICAgICAgIHNsciAgICVyNywlcjcKKyAgICAgICAgaWNtICAgJXI3LDMsMTAoJXI1KSAgICAgICAgICAgICAgICAgICAgIyBnZXQgcmVzaWR1YWwgY291bnQKKyAgICAgICAgbGNyICAgJXI3LCVyNworICAgICAgICBsYSAgICAlcjcsSVBMX0JTKCVyNykgICAgICAgICAgICAgICAgICAjIElQTF9CUy1yZXNpZHVhbD0jYnl0ZXMgcmVhZAorICAgICAgICBhciAgICAlcjIsJXI3ICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFkZCB0byB0b3RhbCBzaXplCisgICAgICAgIHRtICAgIDgoJXI1KSwweDAxICAgICAgICAgICAgICAgICAgICAgICMgZm91bmQgYSB0YXBlIG1hcmsgPworICAgICAgICBibnogICAuTGRvbmUKKyAgICAgICAgbCAgICAgJXIwLC5MY2N3cmVhZCs0ICAgICAgICAgICAgICAgICAgIyB1cGRhdGUgQ0NXIGRhdGEgYWRkcmVzc2VzCisgICAgICAgIGFyICAgICVyMCwlcjcKKyAgICAgICAgc3QgICAgJXIwLC5MY2N3cmVhZCs0ICAgICAgICAgICAgICAgIAorICAgICAgICBiICAgICAuTGxkbHAKKy5MZG9uZToKKyAgICAgICAgbCAgICAgJXIxNCwuTGxkcmV0CisgICAgICAgIGJyICAgICVyMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcjIgY29udGFpbnMgdGhlIHRvdGFsIHNpemUKKy5McmVjb3Y6CisgICAgICAgIGJhcyAgICVyMTQsLkxzZW5zZSAgICAgICAgICAgICAgICAgICAgICMgZG8gdGhlIHNlbnNpbmcKKyAgICAgICAgYmN0ICAgJXI2LC5Mc3NjaCAgICAgICAgICAgICAgICAgICAgICAgIyBkZWMuIHJldHJ5IGNvdW50ICYgYnJhbmNoCisgICAgICAgIGIgICAgIC5MbGRlcnIKKyMKKyMgU2Vuc2Ugc3Vicm91dGluZQorIworLkxzZW5zZToKKyAgICAgICAgc3QgICAgJXIxNCwuTHNuc3JldAorICAgICAgICBsYSAgICAlcjcsLkxvcmJzZW5zZSAgICAgICAgICAgICAgCisgICAgICAgIHNzY2ggIDAoJXI3KSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RhcnQgc2Vuc2UgY29tbWFuZAorICAgICAgICBibnogICAuTGxkZXJyCisgICAgICAgIGJhcyAgICVyMTQsLkx3YWl0NGlvCisgICAgICAgIGwgICAgICVyMTQsLkxzbnNyZXQKKyAgICAgICAgdG0gICAgOCglcjUpLDB4ODIgICAgICAgICAgICAgICAgICAgICAgIyBkbyB3ZSBoYXZlIGEgcHJvYmxlbSA/CisgICAgICAgIGJueiAgIC5MbGRlcnIKKyAgICAgICAgYnIgICAgJXIxNAorIworIyBXYWl0IGZvciBpbnRlcnJ1cHQgc3Vicm91dGluZQorIworLkx3YWl0NGlvOgorICAgICAgICBscHN3ICAuTHdhaXRwc3cgICAgICAgICAgICAgICAgIAorLkxpb2ludDoKKyAgICAgICAgYyAgICAgJXIxLDB4YjggICAgICAgICAgICAgICAgICAgICAgICAgIyBjb21wYXJlIHN1YmNoYW5uZWwgbnVtYmVyCisgICAgICAgIGJuZSAgIC5Md2FpdDRpbworICAgICAgICB0c2NoICAwKCVyNSkKKyAgICAgICAgc2xyICAgJXIwLCVyMAorICAgICAgICB0bSAgICA4KCVyNSksMHg4MiAgICAgICAgICAgICAgICAgICAgICAjIGRvIHdlIGhhdmUgYSBwcm9ibGVtID8KKyAgICAgICAgYm56ICAgLkx3dGV4aXQKKyAgICAgICAgdG0gICAgOCglcjUpLDB4MDQgICAgICAgICAgICAgICAgICAgICAgIyBnb3QgZGV2aWNlIGVuZCA/CisgICAgICAgIGJ6ICAgIC5Md2FpdDRpbworLkx3dGV4aXQ6CisgICAgICAgIGJyICAgICVyMTQKKy5MbGRlcnI6CisgICAgICAgIGxwc3cgIC5MY3Jhc2ggICAgICAgICAgICAgIAorCisgICAgICAgIC5hbGlnbiA4CisuTG9yYnJlYWQ6CisJLmxvbmcgIDB4MDAwMDAwMDAsMHgwMDgwZmYwMCwuTGNjd3JlYWQKKyAgICAgICAgLmFsaWduIDgKKy5Mb3Jic2Vuc2U6CisgICAgICAgIC5sb25nICAweDAwMDAwMDAwLDB4MDA4MGZmMDAsLkxjY3dzZW5zZQorICAgICAgICAuYWxpZ24gOAorLkxjY3dyZWFkOgorICAgICAgICAubG9uZyAgMHgwMjIwMDAwMCtJUExfQlMsMHgwMDAwMDAwMAorLkxjY3dzZW5zZToKKyAgICAgICAgLmxvbmcgIDB4MDQyMDAwMDEsMHgwMDAwMDAwMAorLkx3YWl0cHN3OgorCS5sb25nICAweDAyMGEwMDAwLDB4ODAwMDAwMDArLkxpb2ludAorCisuTGlyYjoJLmxvbmcgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAKKy5MY3I2OiAgLmxvbmcgIDB4ZmYwMDAwMDAKKyAgICAgICAgLmFsaWduIDgKKy5MY3Jhc2g6LmxvbmcgIDB4MDAwYTAwMDAsMHgwMDAwMDAwMAorLkxsZHJldDoubG9uZyAgMAorLkxzbnNyZXQ6IC5sb25nIDAKKyNlbmRpZiAgLyogQ09ORklHX0lQTF9UQVBFICovCisKKyNpZmRlZiBDT05GSUdfSVBMX1ZNCisjZGVmaW5lIElQTF9CUyAweDczMAorICAgICAgICAub3JnICAgMAorICAgICAgICAubG9uZyAgMHgwMDA4MDAwMCwweDgwMDAwMDAwK2lwbHN0YXJ0ICAjIFRoZSBmaXJzdCAyNCBieXRlcyBhcmUgbG9hZGVkCisgICAgICAgIC5sb25nICAweDAyMDAwMDE4LDB4NjAwMDAwNTAgICAgICAgICAgICMgYnkgaXBsIHRvIGFkZHJlc3NlcyAwLTIzLgorICAgICAgICAubG9uZyAgMHgwMjAwMDA2OCwweDYwMDAwMDUwICAgICAgICAgICAjIChhIFBTVyBhbmQgdHdvIENDV3MpLgorICAgICAgICAuZmlsbCAgODAtMjQsMSwweDQwICAgICAgICAgICAgICAgICAgICAjIGJ5dGVzIDI0LTc5IGFyZSBkaXNjYXJkZWQgISEKKyAgICAgICAgLmxvbmcgIDB4MDIwMDAwZjAsMHg2MDAwMDA1MCAgICAgICAgICAgIyBUaGUgbmV4dCAxNjAgYnl0ZSBhcmUgbG9hZGVkCisgICAgICAgIC5sb25nICAweDAyMDAwMTQwLDB4NjAwMDAwNTAgICAgICAgICAgICMgdG8gYWRkcmVzc2VzIDB4MTgtMHhiNworICAgICAgICAubG9uZyAgMHgwMjAwMDE5MCwweDYwMDAwMDUwICAgICAgICAgICAjIFRoZXkgZm9ybSB0aGUgY29udGludWF0aW9uCisgICAgICAgIC5sb25nICAweDAyMDAwMWUwLDB4NjAwMDAwNTAgICAgICAgICAgICMgb2YgdGhlIENDVyBwcm9ncmFtIHN0YXJ0ZWQKKyAgICAgICAgLmxvbmcgIDB4MDIwMDAyMzAsMHg2MDAwMDA1MCAgICAgICAgICAgIyBieSBpcGwgYW5kIGxvYWQgdGhlIHJhbmdlCisgICAgICAgIC5sb25nICAweDAyMDAwMjgwLDB4NjAwMDAwNTAgICAgICAgICAgICMgMHgwZjAtMHg3MzAgZnJvbSB0aGUgaW1hZ2UKKyAgICAgICAgLmxvbmcgIDB4MDIwMDAyZDAsMHg2MDAwMDA1MCAgICAgICAgICAgIyB0byB0aGUgcmFuZ2UgMHgwZjAtMHg3MzAKKyAgICAgICAgLmxvbmcgIDB4MDIwMDAzMjAsMHg2MDAwMDA1MCAgICAgICAgICAgIyBpbiBtZW1vcnkuIEF0IHRoZSBlbmQgb2YKKyAgICAgICAgLmxvbmcgIDB4MDIwMDAzNzAsMHg2MDAwMDA1MCAgICAgICAgICAgIyB0aGUgY2hhbm5lbCBwcm9ncmFtIHRoZSBQU1cKKyAgICAgICAgLmxvbmcgIDB4MDIwMDAzYzAsMHg2MDAwMDA1MCAgICAgICAgICAgIyBhdCBsb2NhdGlvbiAwIGlzIGxvYWRlZC4KKyAgICAgICAgLmxvbmcgIDB4MDIwMDA0MTAsMHg2MDAwMDA1MCAgICAgICAgICAgIyBJbml0aWFsIHByb2Nlc3Npbmcgc3RhcnRzCisgICAgICAgIC5sb25nICAweDAyMDAwNDYwLDB4NjAwMDAwNTAgICAgICAgICAgICMgYXQgMHhmMCA9IGlwbHN0YXJ0LgorICAgICAgICAubG9uZyAgMHgwMjAwMDRiMCwweDYwMDAwMDUwCisgICAgICAgIC5sb25nICAweDAyMDAwNTAwLDB4NjAwMDAwNTAKKyAgICAgICAgLmxvbmcgIDB4MDIwMDA1NTAsMHg2MDAwMDA1MAorICAgICAgICAubG9uZyAgMHgwMjAwMDVhMCwweDYwMDAwMDUwCisgICAgICAgIC5sb25nICAweDAyMDAwNWYwLDB4NjAwMDAwNTAKKyAgICAgICAgLmxvbmcgIDB4MDIwMDA2NDAsMHg2MDAwMDA1MAorICAgICAgICAubG9uZyAgMHgwMjAwMDY5MCwweDYwMDAwMDUwCisgICAgICAgIC5sb25nICAweDAyMDAwNmUwLDB4MjAwMDAwNTAKKworICAgICAgICAub3JnICAgMHhmMAorIworIyBzdWJyb3V0aW5lIGZvciBsb2FkaW5nIGNhcmRzIGZyb20gdGhlIHJlYWRlcgorIworLkxsb2FkZXI6CQorCWxhICAgICVyMywuTG9yYiAgICAgICAgICAgICAgICAgICAgICAgICMgcjIgPSBhZGRyZXNzIG9mIG9yYiBpbnRvIHIyCisJbGEgICAgJXI1LC5MaXJiICAgICAgICAgICAgICAgICAgICAgICAgIyByNCA9IGFkZHJlc3Mgb2YgaXJiCisgICAgICAgIGxhICAgICVyNiwuTGNjd3MgICAgICAgICAgICAgIAorICAgICAgICBsYSAgICAlcjcsMjAKKy5MaW5pdDoKKyAgICAgICAgc3QgICAgJXIyLDQoJXI2KSAgICAgICAgICAgICAgICAgICAgICAgIyBpbml0aWFsaXplIENDVyBkYXRhIGFkZHJlc3NlcworICAgICAgICBsYSAgICAlcjIsMHg1MCglcjIpCisgICAgICAgIGxhICAgICVyNiw4KCVyNikKKyAgICAgICAgYmN0ICAgNywuTGluaXQKKworICAgICAgICBsY3RsICAlYzYsJWM2LC5MY3I2ICAgICAgICAgICAgICAgICAgICAjIHNldCBJTyBzdWJjbGFzcyBtYXNrCisJc2xyICAgJXIyLCVyMgorLkxsZGxwOgorICAgICAgICBzc2NoICAwKCVyMykgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxvYWQgY2h1bmsgb2YgMTYwMCBieXRlcworICAgICAgICBibnogICAuTGxkZXJyCisuTHdhaXQ0aXJxOgorICAgICAgICBtdmMgICAweDc4KDgpLC5MbmV3cHN3ICAgICAgICAgICAgICAgICAjIHNldCB1cCBJTyBpbnRlcnJ1cHQgcHN3CisgICAgICAgIGxwc3cgIC5Md2FpdHBzdyAgICAgICAgICAgICAgCisuTGlvaW50OgorICAgICAgICBjICAgICAlcjEsMHhiOCAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbXBhcmUgc3ViY2hhbm5lbCBudW1iZXIKKwlibmUgICAuTHdhaXQ0aXJxCisJdHNjaCAgMCglcjUpCisKKwlzbHIgICAlcjAsJXIwCisJaWMgICAgJXIwLDgoJXI1KSAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgZGV2aWNlIHN0YXR1cworCWNoaSAgICVyMCw4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2hhbm5lbCBlbmQgPworCWJlICAgIC5MY29udAorCWNoaSAgICVyMCwxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2hhbm5lbCBlbmQgKyBkZXZpY2UgZW5kID8KKwliZSAgICAuTGNvbnQKKworICAgICAgICBsICAgICAlcjAsNCglcjUpCisgICAgICAgIHMgICAgICVyMCw4KCVyMykgICAgICAgICAgICAgICAgICAgICAgICMgcjAvOCA9IG51bWJlciBvZiBjY3dzIGV4ZWN1dGVkCisgICAgICAgIG1oaSAgICVyMCwxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKjEwID0gbnVtYmVyIG9mIGJ5dGVzIGluIGNjd3MKKyAgICAgICAgbGggICAgJXIzLDEwKCVyNSkgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgcmVzaWR1YWwgY291bnQKKyAgICAgICAgc3IgICAgJXIwLCVyMyAgICAgICAgICAgICAgICAgICAgICAgICAgIyAjY2N3cyo4MC1yZXNpZHVhbD0jYnl0ZXMgcmVhZAorCWFyICAgICVyMiwlcjAKKwkKKyAgICAgICAgYnIgICAgJXIxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByMiBjb250YWlucyB0aGUgdG90YWwgc2l6ZQorCisuTGNvbnQ6CisJYWhpICAgJXIyLDB4NjQwICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgMHg2NDAgdG8gdG90YWwgc2l6ZQorICAgICAgICBsYSAgICAlcjYsLkxjY3dzICAgICAgICAgICAgIAorICAgICAgICBsYSAgICAlcjcsMjAKKy5MaW5jcjoKKyAgICAgICAgbCAgICAgJXIwLDQoJXI2KSAgICAgICAgICAgICAgICAgICAgICAgIyB1cGRhdGUgQ0NXIGRhdGEgYWRkcmVzc2VzCisgICAgICAgIGFoaSAgICVyMCwweDY0MAorICAgICAgICBzdCAgICAlcjAsNCglcjYpCisgICAgICAgIGFoaSAgICVyNiw4CisgICAgICAgIGJjdCAgIDcsLkxpbmNyCisKKyAgICAgICAgYiAgICAgLkxsZGxwCisuTGxkZXJyOgorICAgICAgICBscHN3ICAuTGNyYXNoICAgICAgICAgICAgICAKKworICAgICAgICAuYWxpZ24gOAorLkxvcmI6CS5sb25nICAweDAwMDAwMDAwLDB4MDA4MGZmMDAsLkxjY3dzCisuTGlyYjoJLmxvbmcgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAKKy5MY3I2OiAgLmxvbmcgIDB4ZmYwMDAwMDAKKy5MbG9hZHA6LmxvbmcgIDAsMAorICAgICAgICAuYWxpZ24gOAorLkxjcmFzaDoubG9uZyAgMHgwMDBhMDAwMCwweDAwMDAwMDAwCisuTG5ld3BzdzoKKyAgICAgICAgLmxvbmcgIDB4MDAwODAwMDAsMHg4MDAwMDAwMCsuTGlvaW50CisuTHdhaXRwc3c6CisgICAgICAgIC5sb25nICAweDAyMGEwMDAwLDB4ODAwMDAwMDArLkxpb2ludAorCisgICAgICAgIC5hbGlnbiA4CisuTGNjd3M6IC5yZXB0ICAxOQorICAgICAgICAubG9uZyAgMHgwMjYwMDA1MCwweDAwMDAwMDAwCisgICAgICAgIC5lbmRyCisgICAgICAgIC5sb25nICAweDAyMjAwMDUwLDB4MDAwMDAwMDAKKyNlbmRpZiAgLyogQ09ORklHX0lQTF9WTSAqLworCitpcGxzdGFydDoKKyAgICAgICAgbGggICAgJXIxLDB4YjggICAgICAgICAgICAgICAgICAgICAgICAgIyB0ZXN0IGlmIHN1YmNoYW5uZWwgbnVtYmVyCisgICAgICAgIGJjdCAgICVyMSwuTG5vbG9hZCAgICAgICAgICAgICAgICAgICAgICMgIGlzIHZhbGlkCisJbCAgICAgJXIxLDB4YjggICAgICAgICAgICAgICAgICAgICAgICAgIyBsb2FkIGlwbCBzdWJjaGFubmVsIG51bWJlcgorICAgICAgICBsYSAgICAlcjIsSVBMX0JTICAgICAgICAgICAgICAgICAgICAgICAjIGxvYWQgc3RhcnQgYWRkcmVzcworICAgICAgICBiYXMgICAlcjE0LC5MbG9hZGVyICAgICAgICAgICAgICAgICAgICAjIGxvYWQgcmVzdCBvZiBpcGwgaW1hZ2UKKyAgICAgICAgbGFybCAgJXIxMixfcHN0YXJ0ICAgICAgICAgICAgICAgICAgICAgIyBwb2ludGVyIHRvIHBhcmFtZXRlciBhcmVhCisgICAgICAgIHN0ICAgICVyMSxJUExfREVWSUNFKzQtUEFSTUFSRUEoJXIxMikgICMgc3RvcmUgaXBsIGRldmljZSBudW1iZXIKKworIworIyBsb2FkIHBhcmFtZXRlciBmaWxlIGZyb20gaXBsIGRldmljZQorIworLkxhZ2FpbjE6CisgCWwgICAgICVyMixJTklUUkRfU1RBUlQrNC1QQVJNQVJFQSglcjEyKSMgdXNlIHJhbWRpc2sgbG9jYXRpb24gYXMgdGVtcAorICAgICAgICBiYXMgICAlcjE0LC5MbG9hZGVyICAgICAgICAgICAgICAgICAgICAjIGxvYWQgcGFyYW1ldGVyIGZpbGUKKyAgICAgICAgbHRyICAgJXIyLCVyMiAgICAgICAgICAgICAgICAgICAgICAgICAgIyBnb3QgYW55dGhpbmcgPworICAgICAgICBieiAgICAuTG5vcGYKKwljaGkgICAlcjIsODk1CisJYm5oICAgLkxub3RydW5jCisJbGEgICAgJXIyLDg5NQorLkxub3RydW5jOgorCWwgICAgICVyNCxJTklUUkRfU1RBUlQrNC1QQVJNQVJFQSglcjEyKQorIAljbGMgICAwKDMsJXI0KSwuTF9oZHIJCSAgICAgICAjIGlmIGl0IGlzIEhEUngKKyAJYnogICAgLkxhZ2FpbjEJCQkgICAgICAgIyBza2lwIGRhdGFzZXQgaGVhZGVyCisgCWNsYyAgIDAoMywlcjQpLC5MX2VvZgkJICAgICAgICMgaWYgaXQgaXMgRU9GeAorIAlieiAgICAuTGFnYWluMQkJCSAgICAgICAjIHNraXAgZGF0ZXNldCB0cmFpbGVyCisgICAgICAgIGxhICAgICVyNSwwKCVyNCwlcjIpCisgICAgICAgIGxyICAgICVyMywlcjIKKy5MaWRlYmM6CisgICAgICAgIHRtICAgIDAoJXI1KSwweDgwICAgICAgICAgICAgICAgICAgICAgICMgaGlnaCBvcmRlciBiaXQgc2V0ID8KKyAgICAgICAgYm8gICAgLkxkb2N2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgeWVzIC0+IGNvbnZlcnQgZnJvbSBFQkNESUMKKyAgICAgICAgYWhpICAgJXI1LC0xCisgICAgICAgIGJjdCAgICVyMywuTGlkZWJjCisgICAgICAgIGIgICAgIC5Mbm9jdgorLkxkb2N2OgorICAgICAgICBsICAgICAlcjMsLkxjdnRhYgorICAgICAgICB0ciAgICAwKDI1NiwlcjQpLDAoJXIzKSAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcGFyYW1ldGVycyB0byBhc2NpaQorICAgICAgICB0ciAgICAyNTYoMjU2LCVyNCksMCglcjMpCisgICAgICAgIHRyICAgIDUxMigyNTYsJXI0KSwwKCVyMykKKyAgICAgICAgdHIgICAgNzY4KDEyMiwlcjQpLDAoJXIzKQorLkxub2N2OiBsYSAgICAlcjMsQ09NTUFORF9MSU5FLVBBUk1BUkVBKCVyMTIpICAjIGxvYWQgYWRyLiBvZiBjb21tYW5kIGxpbmUKKwltdmMgICAwKDI1NiwlcjMpLDAoJXI0KQorCW12YyAgIDI1NigyNTYsJXIzKSwyNTYoJXI0KQorCW12YyAgIDUxMigyNTYsJXIzKSw1MTIoJXI0KQorCW12YyAgIDc2OCgxMjIsJXIzKSw3NjgoJXI0KQorICAgICAgICBzbHIgICAlcjAsJXIwCisgICAgICAgIGIgICAgIC5MY250bHAKKy5MZGVsc3BjOgorICAgICAgICBpYyAgICAlcjAsMCglcjIsJXIzKQorICAgICAgICBjaGkgICAlcjAsMHgyMCAgICAgICAgICAgICAgICAgICAgICAgICAjIGlzIGl0IGEgc3BhY2UgPworICAgICAgICBiZSAgICAuTGNudGxwCisgICAgICAgIGFoaSAgICVyMiwxCisgICAgICAgIGIgICAgIC5MZW9scAorLkxjbnRscDoKKyAgICAgICAgYnJjdCAgJXIyLC5MZGVsc3BjCisuTGVvbHA6CisgICAgICAgIHNsciAgICVyMCwlcjAKKyAgICAgICAgc3RjICAgJXIwLDAoJXIyLCVyMykgICAgICAgICAgICAgICAgICAgIyB0ZXJtaW5hdGUgYnVmZmVyCisuTG5vcGY6CisKKyMKKyMgbG9hZCByYW1kaXNrIGZyb20gaXBsIGRldmljZQorIworLkxhZ2FpbjI6CisgCWwgICAgICVyMixJTklUUkRfU1RBUlQrNC1QQVJNQVJFQSglcjEyKSMgbG9hZCBhZHIuIG9mIHJhbWRpc2sKKyAgICAgICAgYmFzICAgJXIxNCwuTGxvYWRlciAgICAgICAgICAgICAgICAgICAgIyBsb2FkIHJhbWRpc2sKKyAJc3QgICAgJXIyLElOSVRSRF9TSVpFKzQtUEFSTUFSRUEoJXIxMikgIyBzdG9yZSBzaXplIG9mIHJhbWRpc2sKKyAgICAgICAgbHRyICAgJXIyLCVyMgorICAgICAgICBibnogICAuTHJkY29udAorICAgICAgICBzdCAgICAlcjIsSU5JVFJEX1NUQVJUKzQtUEFSTUFSRUEoJXIxMikjIG5vIHJhbWRpc2sgZm91bmQsIG51bGwgaXQKKy5McmRjb250OgorCWwgICAgICVyMixJTklUUkRfU1RBUlQrNC1QQVJNQVJFQSglcjEyKQorCWNsYyAgIDAoMywlcjIpLC5MX2hkcgkJICAgICAgICMgc2tpcCBIRFJ4IGFuZCBFT0Z4IAorCWJ6ICAgIC5MYWdhaW4yCisJY2xjICAgMCgzLCVyMiksLkxfZW9mCisJYnogICAgLkxhZ2FpbjIKKworI2lmZGVmIENPTkZJR19JUExfVk0KKyMKKyMgcmVzZXQgZmlsZXMgaW4gVk0gcmVhZGVyCisjCisgICAgICAgIHN0aWRwIF9fTENfQ1BVSUQgICAgICAgICAgICAgICAgICAgICAgICMgc3RvcmUgY3B1aWQKKwl0bSAgICBfX0xDX0NQVUlELDB4ZmYgICAgICAgICAgICAgICAgICAjIHJ1bm5pbmcgVk0gPworCWJubyAgIC5Mbm9yZXNldAorICAgICAgICBsYSAgICAlcjIsLkxyZXNldCAgICAgICAgICAgICAgCisgICAgICAgIGxoaSAgICVyMywyNgorICAgICAgICAubG9uZyAweDgzMjMwMDA4CisuTG5vcmVzZXQ6CisjZW5kaWYKKwkKKyMKKyMgZXZlcnl0aGluZyBsb2FkZWQsIGdvIGZvciBpdAorIworLkxub2xvYWQ6CisgICAgICAgIGwgICAgICVyMSwuTHN0YXJ0dXAKKyAgICAgICAgYnIgICAgJXIxCisKKy5Mc3RhcnR1cDogLmxvbmcgc3RhcnR1cAorLkxjdnRhYjoubG9uZyAgX2ViY2FzYyAgICAgICAgICAgICAgICAgICAgICAgICAjIGViY2RpYyB0byBhc2NpaSB0YWJsZQorLkxyZXNldDouYnl0ZSAgMHhjMywweGM4LDB4YzEsMHhkNSwweGM3LDB4YzUsMHg0MCwweGQ5LDB4YzQsMHhkOSwweDQwCisgICAgICAgIC5ieXRlICAweGMxLDB4ZDMsMHhkMywweDQwLDB4ZDIsMHhjNSwweGM1LDB4ZDcsMHg0MCwweGQ1LDB4ZDYKKyAgICAgICAgLmJ5dGUgIDB4YzgsMHhkNiwweGQzLDB4YzQgICAgICAgICAgICAgIyAiY2hhbmdlIHJkciBhbGwga2VlcCBub2hvbGQiCisuTF9lb2Y6IC5sb25nICAweGM1ZDZjNjAwICAgICAgIC8qIEMnRU9GJyAqLworLkxfaGRyOiAubG9uZyAgMHhjOGM0ZDkwMCAgICAgICAvKiBDJ0hEUicgKi8KKyNlbmRpZiAgLyogQ09ORklHX0lQTCAqLworCisjCisjIFNBTElQTCBsb2FkZXIgc3VwcG9ydC4gQmFzZWQgb24gYSBwYXRjaCBieSBSb2IgdmFuIGRlciBIZWlqLgorIyBUaGlzIGVudHJ5IHBvaW50IGlzIGNhbGxlZCBkaXJlY3RseSBmcm9tIHRoZSBTQUxJUEwgbG9hZGVyIGFuZAorIyBkb2Vzbid0IG5lZWQgYSBidWlsdGluIGlwbCByZWNvcmQuCisjCisgICAgICAgIC5vcmcgIDB4ODAwCisJLmdsb2JsIHN0YXJ0CitzdGFydDoKKwlzdG0gICAlcjAsJXIxNSwweDA3YjAJCSMgc3RvcmUgcmVnaXN0ZXJzCisJYmFzciAgJXIxMiwlcjAKKy5iYXNlOgorCWwgICAgICVyMTEsLnBhcm0KKwlsICAgICAlcjgsLmNtZAkJCSMgcG9pbnRlciB0byBjb21tYW5kIGJ1ZmZlcgorCisJbHRyICAgJXI5LCVyOQkJCSMgZG8gd2UgaGF2ZSBTQUxJUEwgcGFyYW1ldGVycz8KKwlicCAgICAuc2s4eDgKKworCW12YyAgIDAoNjQsJXI4KSwweDAwYjAJCSMgY29weSBzYXZlZCByZWdpc3RlcnMKKwl4YyAgICA2NCgyNDAtNjQsJXI4KSwwKCVyOCkJIyByZW1haW5kZXIgb2YgYnVmZmVyCisJdHIgICAgMCg2NCwlcjgpLC5sb3djYXNlCQorCWIgICAgIC5nb3RyCisuc2s4eDg6CisJbXZjICAgMCgyNDAsJXI4KSwwKCVyOSkJCSMgY29weSBpcGxwYXJtcyBpbnRvIGJ1ZmZlcgorLmdvdHI6CisJbCAgICAgJXIxMCwudGJsCQkJIyBFQkNESUMgdG8gQVNDSUkgdGFibGUKKwl0ciAgICAwKDI0MCwlcjgpLDAoJXIxMCkKKwlzdGlkcCBfX0xDX0NQVUlECQkjIEFyZSB3ZSBydW5uaW5nIG9uIFZNIG1heWJlCisJY2xpICAgX19MQ19DUFVJRCwweGZmCisJYm56ICAgLnRlc3QKKwkubG9uZyAweDgzMzAwMDYwCQkjIGRpYWcgMywwLHgnMDA2MCcgLSBzdG9yYWdlIHNpemUKKwliICAgICAuZG9uZQorLnRlc3Q6CisJbXZjICAgMHg2OCg4KSwucGdtbncJCSMgc2V0IHVwIHBnbSBjaGVjayBoYW5kbGVyCisJbCAgICAgJXIyLC5mb3VybWVnCisJbHIgICAgJXIzLCVyMgorCWJjdHIgICVyMywlcjAJCQkjIDRNLTEKKy5sb29wOiAgaXNrZSAgJXIwLCVyMworCWFyICAgICVyMywlcjIKKy5wZ214OgorCXNyICAgICVyMywlcjIKKwlsYSAgICAlcjMsMSglcjMpCisuZG9uZToKKwlsICAgICAlcjEsLm1lbXNpemUKKwlzdCAgICAlcjMsNCglcjEpCisJc2xyICAgJXIwLCVyMAorCXN0ICAgICVyMCxJTklUUkRfU0laRSs0LVBBUk1BUkVBKCVyMTEpCisJc3QgICAgJXIwLElOSVRSRF9TVEFSVCs0LVBBUk1BUkVBKCVyMTEpCisJaiAgICAgc3RhcnR1cCAgICAgICAgICAgICAgICAgICAjIGNvbnRpbnVlIHdpdGggc3RhcnR1cAorLnRibDoJLmxvbmcgX2ViY2FzYwkJCSMgdHJhbnNsYXRlIHRhYmxlCisuY21kOgkubG9uZyBDT01NQU5EX0xJTkUJCSMgYWRkcmVzcyBvZiBjb21tYW5kIGxpbmUgYnVmZmVyCisucGFybToJLmxvbmcgUEFSTUFSRUEKKy5mb3VybWVnOiAubG9uZyAweDAwNDAwMDAwICAgICAgCSMgNE0KKy5wZ21udzoJLmxvbmcgMHgwMDA4MDAwMCwucGdteAorLm1lbXNpemU6IC5sb25nIG1lbW9yeV9zaXplCisubG93Y2FzZToKKwkuYnl0ZSAweDAwLDB4MDEsMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcgCisJLmJ5dGUgMHgwOCwweDA5LDB4MGEsMHgwYiwweDBjLDB4MGQsMHgwZSwweDBmCisJLmJ5dGUgMHgxMCwweDExLDB4MTIsMHgxMywweDE0LDB4MTUsMHgxNiwweDE3IAorCS5ieXRlIDB4MTgsMHgxOSwweDFhLDB4MWIsMHgxYywweDFkLDB4MWUsMHgxZgorCS5ieXRlIDB4MjAsMHgyMSwweDIyLDB4MjMsMHgyNCwweDI1LDB4MjYsMHgyNyAKKwkuYnl0ZSAweDI4LDB4MjksMHgyYSwweDJiLDB4MmMsMHgyZCwweDJlLDB4MmYKKwkuYnl0ZSAweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwweDM2LDB4MzcgCisJLmJ5dGUgMHgzOCwweDM5LDB4M2EsMHgzYiwweDNjLDB4M2QsMHgzZSwweDNmCisJLmJ5dGUgMHg0MCwweDQxLDB4NDIsMHg0MywweDQ0LDB4NDUsMHg0NiwweDQ3IAorCS5ieXRlIDB4NDgsMHg0OSwweDRhLDB4NGIsMHg0YywweDRkLDB4NGUsMHg0ZgorCS5ieXRlIDB4NTAsMHg1MSwweDUyLDB4NTMsMHg1NCwweDU1LDB4NTYsMHg1NyAKKwkuYnl0ZSAweDU4LDB4NTksMHg1YSwweDViLDB4NWMsMHg1ZCwweDVlLDB4NWYKKwkuYnl0ZSAweDYwLDB4NjEsMHg2MiwweDYzLDB4NjQsMHg2NSwweDY2LDB4NjcgCisJLmJ5dGUgMHg2OCwweDY5LDB4NmEsMHg2YiwweDZjLDB4NmQsMHg2ZSwweDZmCisJLmJ5dGUgMHg3MCwweDcxLDB4NzIsMHg3MywweDc0LDB4NzUsMHg3NiwweDc3IAorCS5ieXRlIDB4NzgsMHg3OSwweDdhLDB4N2IsMHg3YywweDdkLDB4N2UsMHg3ZgorCisJLmJ5dGUgMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3IAorCS5ieXRlIDB4ODgsMHg4OSwweDhhLDB4OGIsMHg4YywweDhkLDB4OGUsMHg4ZgorCS5ieXRlIDB4OTAsMHg5MSwweDkyLDB4OTMsMHg5NCwweDk1LDB4OTYsMHg5NyAKKwkuYnl0ZSAweDk4LDB4OTksMHg5YSwweDliLDB4OWMsMHg5ZCwweDllLDB4OWYKKwkuYnl0ZSAweGEwLDB4YTEsMHhhMiwweGEzLDB4YTQsMHhhNSwweGE2LDB4YTcgCisJLmJ5dGUgMHhhOCwweGE5LDB4YWEsMHhhYiwweGFjLDB4YWQsMHhhZSwweGFmCisJLmJ5dGUgMHhiMCwweGIxLDB4YjIsMHhiMywweGI0LDB4YjUsMHhiNiwweGI3IAorCS5ieXRlIDB4YjgsMHhiOSwweGJhLDB4YmIsMHhiYywweGJkLDB4YmUsMHhiZgorCS5ieXRlIDB4YzAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NwkjIC5hYmNkZWZnIAorCS5ieXRlIDB4ODgsMHg4OSwweGNhLDB4Y2IsMHhjYywweGNkLDB4Y2UsMHhjZgkjIGhpCisJLmJ5dGUgMHhkMCwweDkxLDB4OTIsMHg5MywweDk0LDB4OTUsMHg5NiwweDk3IAkjIC5qa2xtbm9wCisJLmJ5dGUgMHg5OCwweDk5LDB4ZGEsMHhkYiwweGRjLDB4ZGQsMHhkZSwweGRmCSMgcXIKKwkuYnl0ZSAweGUwLDB4ZTEsMHhhMiwweGEzLDB4YTQsMHhhNSwweGE2LDB4YTcJIyAuLnN0dXZ3eAorCS5ieXRlIDB4YTgsMHhhOSwweGVhLDB4ZWIsMHhlYywweGVkLDB4ZWUsMHhlZgkjIHl6CisJLmJ5dGUgMHhmMCwweGYxLDB4ZjIsMHhmMywweGY0LDB4ZjUsMHhmNiwweGY3IAorCS5ieXRlIDB4ZjgsMHhmOSwweGZhLDB4ZmIsMHhmYywweGZkLDB4ZmUsMHhmZgorCisjCisjIHN0YXJ0dXAtY29kZSBhdCAweDEwMDAwLCBydW5uaW5nIGluIHJlYWwgbW9kZQorIyB0aGlzIGlzIGNhbGxlZCBlaXRoZXIgYnkgdGhlIGlwbCBsb2FkZXIgb3IgZGlyZWN0bHkgYnkgUFNXIHJlc3RhcnQKKyMgb3IgbGlubG9hZCBvciBTQUxJUEwKKyMKKyAgICAgICAgLm9yZyAgMHgxMDAwMAorc3RhcnR1cDpiYXNyICAlcjEzLDAgICAgICAgICAgICAgICAgICAgICAjIGdldCBiYXNlCisuTFBHMTogIHNsbCAgICVyMTMsMSAgICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIGhpZ2ggb3JkZXIgYml0CisgICAgICAgIHNybCAgICVyMTMsMQorICAgICAgICBsaGkgICAlcjEsMSAgICAgICAgICAgICAgICAgICAgICAjIG1vZGUgMSA9IGVzYW1lCisgICAgICAgIHNsciAgICVyMCwlcjAgICAgICAgICAgICAgICAgICAgICMgc2V0IGNwdWlkIHRvIHplcm8KKyAgICAgICAgc2lncCAgJXIxLCVyMCwweDEyICAgICAgICAgICAgICAgIyBzd2l0Y2ggdG8gZXNhbWUgbW9kZQorCXNhbTY0CQkJCSAjIHN3aXRjaCB0byA2NCBiaXQgbW9kZQorCWxjdGxnICVjMCwlYzE1LC5MY3RsLS5MUEcxKCVyMTMpICMgbG9hZCBjb250cm9sIHJlZ2lzdGVycworCWxhcmwgICVyMTIsX3BzdGFydCAgICAgICAgICAgICAgICMgcG9pbnRlciB0byBwYXJhbWV0ZXIgYXJlYQorCQkJCQkgIyBtb3ZlIElQTCBkZXZpY2UgdG8gbG93Y29yZQorICAgICAgICBtdmMgICBfX0xDX0lQTERFVig0KSxJUExfREVWSUNFKzQtUEFSTUFSRUEoJXIxMikKKworIworIyBjbGVhciBic3MgbWVtb3J5CisjCisJbGFybCAgJXIyLF9fYnNzX3N0YXJ0ICAgICAgICAgICAjIHN0YXJ0IG9mIGJzcyBzZWdtZW50CisgICAgICAgIGxhcmwgICVyMyxfZW5kICAgICAgICAgICAgICAgICAgIyBlbmQgb2YgYnNzIHNlZ21lbnQKKyAgICAgICAgc2dyICAgJXIzLCVyMiAgICAgICAgICAgICAgICAgICAjIGxlbmd0aCBvZiBic3MKKyAgICAgICAgc2dyICAgJXI0LCVyNCAgICAgICAgICAgICAgICAgICAjCisgICAgICAgIHNnciAgICVyNSwlcjUgICAgICAgICAgICAgICAgICAgIyBzZXQgc3JjLGxlbmd0aCBhbmQgcGFkIHRvIHplcm8KKyAgICAgICAgbXZjbGUgJXIyLCVyNCwwICAgICAgICAgICAgICAgICAjIGNsZWFyIG1lbQorICAgICAgICBqbyAgICAuLTQgICAgICAgICAgICAgICAgICAgICAgICMgYnJhbmNoIGJhY2ssIGlmIG5vdCBmaW5pc2gKKworCWwgICAgICVyMiwuTHJjcC0uTFBHMSglcjEzKQkjIFJlYWQgU0NQIGZvcmNlZCBjb21tYW5kIHdvcmQKKy5Mc2VydmljZWNhbGw6CisJc3Rvc20gLkxwbWFzay0uTFBHMSglcjEzKSwweDAxCSMgYXV0aG9yaXplIGV4dCBpbnRlcnJ1cHRzCisKKwlzdGN0ZyAlcjAsJXIwLC5MY3ItLkxQRzEoJXIxMykJIyBnZXQgY3IwCisJbGEgICAgJXIxLDB4MjAwCQkJIyBzZXQgYml0IDIyCisJb2cgICAgJXIxLC5MY3ItLkxQRzEoJXIxMykJIyBvciBvbGQgY3IwIHdpdGggcjEKKwlzdGcgICAlcjEsLkxjci0uTFBHMSglcjEzKQorCWxjdGxnICVyMCwlcjAsLkxjci0uTFBHMSglcjEzKQkjIGxvYWQgbW9kaWZpZWQgY3IwCisKKwltdmMgICBfX0xDX0VYVF9ORVdfUFNXKDgpLC5McGNtc2stLkxQRzEoJXIxMykgIyBzZXQgcG9zdGNhbGwgcHN3CisJbGFybCAgJXIxLC5Mc2NscGgKKwlzdGcgICAlcjEsX19MQ19FWFRfTkVXX1BTVys4CSMgc2V0IGhhbmRsZXIKKworCWxhcmwgICVyNCxfcHN0YXJ0CQkjICVyNCBpcyBvdXIgaW5kZXggZm9yIHNjY2Igc3R1ZmYKKwlsYSAgICAlcjEsLkxzY2NiLVBBUk1BUkVBKCVyNCkJIyBvdXIgc2NjYgorCS5pbnNuIHJyZSwweGIyMjAwMDAwLCVyMiwlcjEJIyBzZXJ2aWNlIGNhbGwKKwlpcG0gICAlcjEKKwlzcmwgICAlcjEsMjgJCQkjIGdldCBjYyBjb2RlCisJeHIgICAgJXIzLCVyMworCWNoaSAgICVyMSwzCisJYmUgICAgLkxmY2h1bmstLkxQRzEoJXIxMykJIyBsZWF2ZQorCWNoaSAgICVyMSwyCisJYmUgICAgLkxzZXJ2aWNlY2FsbC0uTFBHMSglcjEzKQorCWxwc3cgIC5Md2FpdHNjbHAtLkxQRzEoJXIxMykKKy5Mc2NscGg6CisJbGggICAgJXIxLC5Mc2NjYnItUEFSTUFSRUEoJXI0KQorCWNoaSAgICVyMSwweDEwCQkJIyAweDAwMTAgaXMgdGhlIHN1Y2VzcyBjb2RlCisJamUgICAgLkxwcm9jc2NjYgkJIyBsZXQncyBwcm9jZXNzIHRoZSBzY2NiCisJY2hpICAgJXIxLDB4MWYwCisJYm5lICAgLkxmY2h1bmstLkxQRzEoJXIxMykJIyB1bmhhbmRsZWQgZXJyb3IgY29kZQorCWMgICAgICVyMiwuTHJjcC0uTFBHMSglcjEzKQkjIERpZCB3ZSB0cnkgUmVhZCBTQ1AgZm9yY2VkCisJYm5lICAgLkxmY2h1bmstLkxQRzEoJXIxMykJIyBpZiBubywgZ2l2ZSB1cAorCWwgICAgICVyMiwuTHJjcDItLkxQRzEoJXIxMykJIyB0cnkgd2l0aCBSZWFkIFNDUAorCWIgICAgIC5Mc2VydmljZWNhbGwtLkxQRzEoJXIxMykKKy5McHJvY3NjY2I6CisJbGggICAgJXIxLC5Mc2NwaW5jcjEtUEFSTUFSRUEoJXI0KSAjIHVzZSB0aGlzIG9uZSBpZiAhPSAwCisJY2hpICAgJXIxLDB4MDAKKwlqbmUgICAuTHNjbmQKKwlsZyAgICAlcjEsLkxzY3BpbmNyMi1QQVJNQVJFQSglcjQpICMgb3RoZXJ3aXNlIHVzZSB0aGlzIG9uZQorLkxzY25kOgorCXhyICAgICVyMywlcjMJCQkjIHNhbWUgbG9naWMKKwlpYyAgICAlcjMsLkxzY3BhMS1QQVJNQVJFQSglcjQpCisJY2hpICAgJXIzLDB4MDAKKwlqbmUgICAuTGNvbXBtZW0KKwlsICAgICAlcjMsLkxzY3BhMi1QQVJNQVJFQSglcjEzKQorLkxjb21wbWVtOgorCW1sZ3IgICVyMiwlcjEJCQkjIG1lbSBpbiBNQiBvbiAxMjgtYml0CisJbCAgICAgJXIxLC5Mb25lbWItLkxQRzEoJXIxMykKKwltbGdyICAlcjIsJXIxCQkJIyBtZW0gc2l6ZSBpbiBieXRlcyBpbiAlcjMKKwliICAgICAuTGZjaHVuay0uTFBHMSglcjEzKQorCisuTHBtYXNrOgorCS5ieXRlIDAKKwkuYWxpZ24gOAorLkxjcjoKKwkucXVhZCAweDAwICAjIHBsYWNlIGhvbGRlciBmb3IgY3IwCisuTHdhaXRzY2xwOgorCS5sb25nIDB4MDIwQTAwMDAKKwkucXVhZCAuTHNjbHBoCisuTHJjcDoKKwkuaW50IDB4MDAxMjAwMDEgIyBSZWFkIFNDUCBmb3JjZWQgY29kZQorLkxyY3AyOgorCS5pbnQgMHgwMDAyMDAwMSAjIFJlYWQgU0NQIGNvZGUKKy5Mb25lbWI6CisJLmludCAweDEwMDAwMAorCisuTGZjaHVuazoKKwkJCQkJICMgc2V0IHByb2dyYW0gY2hlY2sgbmV3IHBzdyBtYXNrCisJbXZjICAgX19MQ19QR01fTkVXX1BTVyg4KSwuTHBjbXNrLS5MUEcxKCVyMTMpCisKKyMKKyMgZmluZCBtZW1vcnkgY2h1bmtzLgorIworCWxnciAgICVyOSwlcjMJCQkgIyBlbmQgb2YgbWVtCisJbGFybCAgJXIxLC5MY2hrbWVtICAgICAgICAgICAgICAgIyBzZXQgcHJvZ3JhbSBjaGVjayBhZGRyZXNzCisJc3RnICAgJXIxLF9fTENfUEdNX05FV19QU1crOAorCWxhICAgICVyMSwxICAgICAgICAgICAgICAgICAgICAgICMgdGVzdCBpbiBpbmNyZW1lbnRzIG9mIDEyOEtCCisJc2xsZyAgJXIxLCVyMSwxNworCWxhcmwgICVyMyxtZW1vcnlfY2h1bmsKKwlzbGdyICAlcjQsJXI0ICAgICAgICAgICAgICAgICAgICAjIHNldCBzdGFydCBvZiBjaHVuayB0byB6ZXJvCisJc2xnciAgJXI1LCVyNSAgICAgICAgICAgICAgICAgICAgIyBzZXQgZW5kIG9mIGNodW5rIHRvIHplcm8KKwlzbHIgICVyNiwlcjYJCQkgIyBzZXQgYWNjZXNzIGNvZGUgdG8gemVybworCWxhICAgICVyMTAsTUVNT1JZX0NIVU5LUwkgIyBudW1iZXIgb2YgY2h1bmtzCisuTGxvb3A6CisJdHByb3QgMCglcjUpLDAJCQkgIyB0ZXN0IHByb3RlY3Rpb24gb2YgZmlyc3QgYnl0ZQorCWlwbSAgICVyNworCXNybCAgICVyNywyOAorCWNsciAgICVyNiwlcjcJCQkgIyBjb21wYXJlIGNjIHdpdGggbGFzdCBhY2Nlc3MgY29kZQorCWplICAgIC5Mc2FtZQorCWogICAgIC5MY2hrbWVtCisuTHNhbWU6CisJYWxnciAgJXI1LCVyMQkJCSAjIGFkZCAxMjhLQiB0byBlbmQgb2YgY2h1bmsKKwkJCQkJICMgbm8gbmVlZCB0byBjaGVjayBoZXJlLAorCWJyYyAgIDEyLC5MbG9vcAkJCSAjIHRoaXMgaXMgdGhlIHNhbWUgY2h1bmsKKy5MY2hrbWVtOgkJCQkgIyA+IDE2RUIgb3IgdHByb3QgZ290IGEgcHJvZ3JhbSBjaGVjaworCWNsZ3IgICVyNCwlcjUJCQkgIyBjaHVuayBzaXplID4gMD8KKwlqZSAgICAuTGNoa2xvb3AKKwlzdGcgICAlcjQsMCglcjMpCQkgIyBzdG9yZSBzdGFydCBhZGRyZXNzIG9mIGNodW5rCisJbGdyICAgJXIwLCVyNQorCXNsZ3IgICVyMCwlcjQKKwlzdGcgICAlcjAsOCglcjMpCQkgIyBzdG9yZSBzaXplIG9mIGNodW5rCisJc3QgICAgJXI2LDIwKCVyMykJCSAjIHN0b3JlIHR5cGUgb2YgY2h1bmsKKwlsYSAgICAlcjMsMjQoJXIzKQorCWxhcmwgICVyOCxtZW1vcnlfc2l6ZQorCXN0ZyAgICVyNSwwKCVyOCkgICAgICAgICAgICAgICAgICMgc3RvcmUgbWVtb3J5IHNpemUKKwlhaGkgICAlcjEwLC0xCQkJICMgdXBkYXRlIGNodW5rIG51bWJlcgorLkxjaGtsb29wOgorCWxyICAgICVyNiwlcjcJCQkgIyBzZXQgYWNjZXNzIGNvZGUgdG8gbGFzdCBjYworCSMgd2UgZ290IGFuIGV4Y2VwdGlvbiBvciB3ZSdyZSBzdGFydGluZyBhIG5ldworCSMgY2h1bmsgLCB3ZSBtdXN0IGNoZWNrIGlmIHdlIHNob3VsZAorCSMgc3RpbGwgdHJ5IHRvIGZpbmQgdmFsaWQgbWVtb3J5IChpZiB3ZSBkZXRlY3RlZAorCSMgdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgc3RvcmFnZSksIGFuZCBpZiB3ZQorCSMgaGF2ZSBjaHVua3MgbGVmdAorCWxnaGkgICVyNCwxCisJc2xsZyAgJXI0LCVyNCwzMQorCWNsZ3IgICVyNSwlcjQKKwlqZSAgICAuTGhzYXNraXAKKwl4ciAgICAlcjAsICVyMAorCWNsZ3IgICVyMCwgJXI5CQkJICMgZGlkIHdlIGRldGVjdCBtZW1vcnk/CisJamUgICAgLkxkb25lbWVtCQkJICMgaWYgbm90LCBsZWF2ZQorCWNoaSAgICVyMTAsIDAJCQkgIyBkbyB3ZSBoYXZlIGNodW5rcyBsZWZ0PworCWplICAgIC5MZG9uZW1lbQorLkxoc2Fza2lwOgorCWFsZ3IgICVyNSwlcjEJCQkgIyBhZGQgMTI4S0IgdG8gZW5kIG9mIGNodW5rCisJbGdyICAgJXI0LCVyNQkJCSAjIHBvdGVudGlhbCBuZXcgY2h1bmsKKwljbGdyICAlcjUsJXI5CQkJICMgc2hvdWxkIHdlIGdvIG9uPworCWpsICAgIC5MbG9vcAorLkxkb25lbWVtOgkJCisKKwlsYXJsICAlcjEyLG1hY2hpbmVfZmxhZ3MKKyMKKyMgZmluZCBvdXQgaWYgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgVk0KKyMKKyAgICAgICAgc3RpZHAgIF9fTENfQ1BVSUQgICAgICAgICAgICAgICAjIHN0b3JlIGNwdWlkCisJdG0gICAgIF9fTENfQ1BVSUQsMHhmZiAgICAgICAgICAjIHJ1bm5pbmcgdW5kZXIgVk0gPworCWJubyAgICAwZi0uTFBHMSglcjEzKQorICAgICAgICBvaSAgICAgNyglcjEyKSwxICAgICAgICAgICAgICAgICMgc2V0IFZNIGZsYWcKKzA6ICAgICAgbGggICAgICVyMCxfX0xDX0NQVUlEKzQgICAgICAgICAjIGdldCBjcHUgdmVyc2lvbgorICAgICAgICBjaGkgICAgJXIwLDB4NzQ5MCAgICAgICAgICAgICAgICMgcnVubmluZyBvbiBhIFAvMzkwID8KKyAgICAgICAgYm5lICAgIDFmLS5MUEcxKCVyMTMpCisgICAgICAgIG9pICAgICA3KCVyMTIpLDQgICAgICAgICAgICAgICAgIyBzZXQgUC8zOTAgZmxhZworMToKKworIworIyBmaW5kIG91dCBpZiB3ZSBoYXZlIHRoZSBNVlBHIGluc3RydWN0aW9uCisjCisJbGEgICAgICVyMSwwZi0uTFBHMSglcjEzKSAgICAgICAjIHNldCBwcm9ncmFtIGNoZWNrIGFkZHJlc3MKKwlzdGcgICAgJXIxLF9fTENfUEdNX05FV19QU1crOAorCXNnciAgICAlcjAsJXIwCisJbGdoaSAgICVyMSwwCisJbGdoaSAgICVyMiwwCisJbXZwZyAgICVyMSwlcjIgICAgICAgICAgICAgICAgICAjIHRlc3QgTVZQRyBpbnN0cnVjdGlvbgorCW9pICAgICA3KCVyMTIpLDE2ICAgICAgICAgICAgICAgIyBzZXQgTVZQRyBmbGFnCiswOgorCisjCisjIGZpbmQgb3V0IGlmIHRoZSBkaWFnIDB4NDQgd29ya3MgaW4gNjQgYml0IG1vZGUKKyMKKwlsYSAgICAgJXIxLDBmLS5MUEcxKCVyMTMpCSMgc2V0IHByb2dyYW0gY2hlY2sgYWRkcmVzcworCXN0ZyAgICAlcjEsX19MQ19QR01fTkVXX1BTVys4CisJbXZjICAgIF9fTENfRElBRzQ0X09QQ09ERSg4KSwuTG5vcC0uTFBHMSglcjEzKQorCWRpYWcgICAwLDAsMHg0NAkJCSMgdGVzdCBkaWFnIDB4NDQKKwlvaSAgICAgNyglcjEyKSwzMgkJIyBzZXQgZGlhZzQ0IGZsYWcKKwltdmMgICAgX19MQ19ESUFHNDRfT1BDT0RFKDgpLC5MZGlhZzQ0LS5MUEcxKCVyMTMpCiswOgkKKworIworIyBmaW5kIG91dCBpZiB3ZSBoYXZlIHRoZSBJRFRFIGluc3RydWN0aW9uCisjCisJbGEgICAgICVyMSwwZi0uTFBHMSglcjEzKQkjIHNldCBwcm9ncmFtIGNoZWNrIGFkZHJlc3MKKwlzdGcgICAgJXIxLF9fTENfUEdNX05FV19QU1crOAorCS5sb25nCTB4YjJiMTAwMDAJCSMgc3RvcmUgZmFjaWxpdHkgbGlzdAorCXRtCTB4YzgsMHgwOAkJIyBjaGVjayBiaXQgZm9yIGNsZWFyaW5nLWJ5LUFTQ0UKKwlibm8JMGYtLkxQRzEoJXIxMykKKwlsaGkJJXIxLDIwOTQKKwlsaGkJJXIyLDAKKwkubG9uZwkweGI5OGUyMDAxCisJb2kJNyglcjEyKSwweDgwCQkjIHNldCBJRFRFIGZsYWcKKzA6CisKKyAgICAgICAgbHBzd2UgLkxlbnRyeS0uTFBHMSgxMykgICAgICAgICAjIGp1bXAgdG8gX3N0ZXh0IGluIHByaW1hcnktc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB2aXJ0dWFsIGFuZCBuZXZlciByZXR1cm4gLi4uCisgICAgICAgIC5hbGlnbiAxNgorLkxlbnRyeToucXVhZCAgMHgwMDAwMDAwMTgwMDAwMDAwLF9zdGV4dAorLkxjdGw6ICAucXVhZCAgMHgwNGI1MDAwMiAgICAgICAgICAgICAgICMgY3IwOiB2YXJpb3VzIHRoaW5ncworICAgICAgICAucXVhZCAgMCAgICAgICAgICAgICAgICAgICAgICAgICMgY3IxOiBwcmltYXJ5IHNwYWNlIHNlZ21lbnQgdGFibGUKKyAgICAgICAgLnF1YWQgIC5MZHVjdCAgICAgICAgICAgICAgICAgICAjIGNyMjogZGlzcGF0Y2hhYmxlIHVuaXQgY29udHJvbCB0YWJsZQorICAgICAgICAucXVhZCAgMCAgICAgICAgICAgICAgICAgICAgICAgICMgY3IzOiBpbnN0cnVjdGlvbiBhdXRob3JpemF0aW9uCisgICAgICAgIC5xdWFkICAwICAgICAgICAgICAgICAgICAgICAgICAgIyBjcjQ6IGluc3RydWN0aW9uIGF1dGhvcml6YXRpb24KKyAgICAgICAgLnF1YWQgIDB4ZmZmZmZmZmZmZmZmZmZmZiAgICAgICAjIGNyNTogcHJpbWFyeS1hc3RlIG9yaWdpbgorICAgICAgICAucXVhZCAgMCAgICAgICAgICAgICAgICAgICAgICAgICMgY3I2OiAgSS9PIGludGVycnVwdHMKKyAgICAgICAgLnF1YWQgIDAgICAgICAgICAgICAgICAgICAgICAgICAjIGNyNzogIHNlY29uZGFyeSBzcGFjZSBzZWdtZW50IHRhYmxlCisgICAgICAgIC5xdWFkICAwICAgICAgICAgICAgICAgICAgICAgICAgIyBjcjg6ICBhY2Nlc3MgcmVnaXN0ZXJzIHRyYW5zbGF0aW9uCisgICAgICAgIC5xdWFkICAwICAgICAgICAgICAgICAgICAgICAgICAgIyBjcjk6ICB0cmFjaW5nIG9mZgorICAgICAgICAucXVhZCAgMCAgICAgICAgICAgICAgICAgICAgICAgICMgY3IxMDogdHJhY2luZyBvZmYKKyAgICAgICAgLnF1YWQgIDAgICAgICAgICAgICAgICAgICAgICAgICAjIGNyMTE6IHRyYWNpbmcgb2ZmCisgICAgICAgIC5xdWFkICAwICAgICAgICAgICAgICAgICAgICAgICAgIyBjcjEyOiB0cmFjaW5nIG9mZgorICAgICAgICAucXVhZCAgMCAgICAgICAgICAgICAgICAgICAgICAgICMgY3IxMzogaG9tZSBzcGFjZSBzZWdtZW50IHRhYmxlCisgICAgICAgIC5xdWFkICAweGMwMDAwMDAwICAgICAgICAgICAgICAgIyBjcjE0OiBtYWNoaW5lIGNoZWNrIGhhbmRsaW5nIG9mZgorICAgICAgICAucXVhZCAgMCAgICAgICAgICAgICAgICAgICAgICAgICMgY3IxNTogbGlua2FnZSBzdGFjayBvcGVyYXRpb25zCisuTHBjbXNrOi5xdWFkICAweDAwMDAwMDAxODAwMDAwMDAKKy5MNG1hbGlnbjoucXVhZCAweGZmZmZmZmZmZmZjMDAwMDAKKy5Mc2NhbjJnOi5xdWFkIDB4ODAwMDAwMDAgKyAweDIwMDAwIC0gOCAjIDJHQiArIDEyOEsgLSA4CisuTG5vcDoJLmxvbmcgIDB4MDcwMDA3MDAKKy5MZGlhZzQ0Oi5sb25nIDB4ODMwMDAwNDQKKworCS5vcmcgUEFSTUFSRUEtNjQKKy5MZHVjdDoJLmxvbmcgMCwwLDAsMCwwLDAsMCwwCisJLmxvbmcgMCwwLDAsMCwwLDAsMCwwCisKKyMKKyMgcGFyYW1zIGF0IDEwNDAwIChzZXR1cC5oKQorIworCS5vcmcgICBQQVJNQVJFQQorCS5nbG9iYWwgX3BzdGFydAorX3BzdGFydDoKKwkucXVhZCAgMCAgICAgICAgICAgICAgICAgICAgICAgICMgSVBMX0RFVklDRQorICAgICAgICAucXVhZCAgUkFNRElTS19PUklHSU4gICAgICAgICAgICMgSU5JVFJEX1NUQVJUCisgICAgICAgIC5xdWFkICBSQU1ESVNLX1NJWkUgICAgICAgICAgICAgIyBJTklUUkRfU0laRQorCisgICAgICAgIC5vcmcgICBDT01NQU5EX0xJTkUKKyAgICAJLmJ5dGUgICJyb290PS9kZXYvcmFtMCBybyIKKyAgICAgICAgLmJ5dGUgIDAKKwkub3JnICAgMHgxMTAwMAorLkxzY2NiOgorCS5od29yZCAweDEwMDAJCQkjIGxlbmd0aCwgb25lIHBhZ2UKKwkuYnl0ZSAweDAwLDB4MDAsMHgwMAorCS5ieXRlIDB4ODAJCQkjIHZhcmlhYmxlIHJlc3BvbnNlIGJpdCBzZXQKKy5Mc2NjYnI6CisJLmh3b3JkIDB4MDAJCQkjIHJlc3BvbnNlIGNvZGUKKy5Mc2NwaW5jcjE6CisJLmh3b3JkIDB4MDAKKy5Mc2NwYTE6CisJLmJ5dGUgMHgwMAorCS5maWxsIDg5LDEsMAorLkxzY3BhMjoKKwkuaW50IDB4MDAKKy5Mc2NwaW5jcjI6CisJLnF1YWQgMHgwMAorCS5maWxsIDM5ODQsMSwwCisJLm9yZyAweDEyMDAwCisJLmdsb2JhbCBfcGVuZAorX3BlbmQ6CQorCisjaWZkZWYgQ09ORklHX1NIQVJFRF9LRVJORUwKKwkub3JnICAgMHgxMDAwMDAKKyNlbmRpZgorCQorIworIyBzdGFydHVwLWNvZGUsIHJ1bm5pbmcgaW4gdmlydHVhbCBtb2RlCisjCisgICAgICAgIC5nbG9ibCBfc3RleHQKK19zdGV4dDoJYmFzciAgJXIxMywwICAgICAgICAgICAgICAgICAgICAjIGdldCBiYXNlCisuTFBHMjoKKyMKKyMgU2V0dXAgc3RhY2sKKyMKKwlsYXJsICAlcjE1LGluaXRfdGhyZWFkX3VuaW9uCisJbGcgICAgJXIxNCxfX1RJX3Rhc2soJXIxNSkgICAgICAjIGNhY2hlIGN1cnJlbnQgaW4gbG93Y29yZQorCXN0ZyAgICVyMTQsX19MQ19DVVJSRU5UCisgICAgICAgIGFnaGkgICVyMTUsMTw8KFBBR0VfU0hJRlQrVEhSRUFEX09SREVSKSAjIGluaXRfdGFza191bmlvbiArIFRIUkVBRF9TSVpFCisgICAgICAgIHN0ZyAgICVyMTUsX19MQ19LRVJORUxfU1RBQ0sgICAgIyBzZXQgZW5kIG9mIGtlcm5lbCBzdGFjaworICAgICAgICBhZ2hpICAlcjE1LC0xNjAKKyAgICAgICAgeGMgICAgX19TRl9CQUNLQ0hBSU4oNCwlcjE1KSxfX1NGX0JBQ0tDSEFJTiglcjE1KSAjIGNsZWFyIGJhY2tjaGFpbgorCisjIGNoZWNrIGNvbnRyb2wgcmVnaXN0ZXJzCisgICAgICAgIHN0Y3RnICAlYzAsJWMxNSwwKCVyMTUpCisJb2kgICAgIDYoJXIxNSksMHgyMCAgICAgICAgICAgICAjIGVuYWJsZSBzaWdwIGV4dGVybmFsIGludGVycnVwdHMKKwlvaSAgICAgNCglcjE1KSwweDEwICAgICAgICAgICAgICMgc3dpdGNoIG9uIGxvdyBhZGRyZXNzIHByb2N0ZWN0aW9uCisgICAgICAgIGxjdGxnICAlYzAsJWMxNSwwKCVyMTUpCisKKyMKKyAgICAgICAgbGFtICAgIDAsMTUsLkxhcmVncy0uTFBHMiglcjEzKSAjIGxvYWQgYWNjZXNzIHJlZ3MgbmVlZGVkIGJ5IHVhY2Nlc3MKKyAgICAgICAgYnJhc2wgICVyMTQsc3RhcnRfa2VybmVsICAgICAgICAjIGdvIHRvIEMgY29kZQorIworIyBXZSByZXR1cm5lZCBmcm9tIHN0YXJ0X2tlcm5lbCA/IT8gUEFOSUsKKyMKKyAgICAgICAgYmFzciAgJXIxMywwCisJbHBzd2UgLkxkdy0uKCVyMTMpICAgICAgICAgICAjIGxvYWQgZGlzYWJsZWQgd2FpdCBwc3cKKyMKKyAgICAgICAgICAgIC5hbGlnbiA4CisuTGR3OiAgICAgICAucXVhZCAgMHgwMDAyMDAwMTgwMDAwMDAwLDB4MDAwMDAwMDAwMDAwMDAwMAorLkxhcmVnczogICAgLmxvbmcgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAKKwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9pbml0X3Rhc2suYyBiL2FyY2gvczM5MC9rZXJuZWwvaW5pdF90YXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDczYTc0MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvaW5pdF90YXNrLmMKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqICBhcmNoL3MzOTAva2VybmVsL2luaXRfdGFzay5jCisgKgorICogIFMzOTAgdmVyc2lvbgorICoKKyAqICBEZXJpdmVkIGZyb20gImFyY2gvaTM4Ni9rZXJuZWwvaW5pdF90YXNrLmMiCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0X3Rhc2suaD4KKyNpbmNsdWRlIDxsaW51eC9tcXVldWUuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKworc3RhdGljIHN0cnVjdCBmc19zdHJ1Y3QgaW5pdF9mcyA9IElOSVRfRlM7CitzdGF0aWMgc3RydWN0IGZpbGVzX3N0cnVjdCBpbml0X2ZpbGVzID0gSU5JVF9GSUxFUzsKK3N0YXRpYyBzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCBpbml0X3NpZ25hbHMgPSBJTklUX1NJR05BTFMoaW5pdF9zaWduYWxzKTsKK3N0YXRpYyBzdHJ1Y3Qgc2lnaGFuZF9zdHJ1Y3QgaW5pdF9zaWdoYW5kID0gSU5JVF9TSUdIQU5EKGluaXRfc2lnaGFuZCk7CitzdHJ1Y3QgbW1fc3RydWN0IGluaXRfbW0gPSBJTklUX01NKGluaXRfbW0pOworCitFWFBPUlRfU1lNQk9MKGluaXRfbW0pOworCisvKgorICogSW5pdGlhbCB0aHJlYWQgc3RydWN0dXJlLgorICoKKyAqIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhpcyBpcyA4MTkyLWJ5dGUgYWxpZ25lZCBkdWUgdG8gdGhlCisgKiB3YXkgcHJvY2VzcyBzdGFja3MgYXJlIGhhbmRsZWQuIFRoaXMgaXMgZG9uZSBieSBoYXZpbmcgYSBzcGVjaWFsCisgKiAiaW5pdF90YXNrIiBsaW5rZXIgbWFwIGVudHJ5Li4KKyAqLwordW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uIAorCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YS5pbml0X3Rhc2siKSkpID0KKwkJeyBJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzaykgfTsKKworLyoKKyAqIEluaXRpYWwgdGFzayBzdHJ1Y3R1cmUuCisgKgorICogQWxsIG90aGVyIHRhc2sgc3RydWN0cyB3aWxsIGJlIGFsbG9jYXRlZCBvbiBzbGFicyBpbiBmb3JrLmMKKyAqLworc3RydWN0IHRhc2tfc3RydWN0IGluaXRfdGFzayA9IElOSVRfVEFTSyhpbml0X3Rhc2spOworCitFWFBPUlRfU1lNQk9MKGluaXRfdGFzayk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2lycS5jIGIvYXJjaC9zMzkwL2tlcm5lbC9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODBiNmE1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9pcnEuYwpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqICBhcmNoL3MzOTAva2VybmVsL2lycS5jCisgKgorICogIFMzOTAgdmVyc2lvbgorICogICAgQ29weXJpZ2h0IChDKSAyMDA0IElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCBJQk0gQ29ycG9yYXRpb24KKyAqICAgIEF1dGhvcihzKTogTWFydGluIFNjaHdpZGVmc2t5IChzY2h3aWRlZnNreUBkZS5pYm0uY29tKSwKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgaW50ZXJydXB0IHJlbGF0ZWQgZnVuY3Rpb25zLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisKKy8qCisgKiBzaG93X2ludGVycnVwdHMgaXMgbmVlZGVkIGJ5IC9wcm9jL2ludGVycnVwdHMuCisgKi8KK2ludCBzaG93X2ludGVycnVwdHMoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQoreworCXN0YXRpYyBjb25zdCBjaGFyICppbnRyY2xhc3NfbmFtZXNbXSA9IHsgIkVYVCIsICJJL08iLCB9OworCWludCBpID0gKihsb2ZmX3QgKikgdiwgajsKKworCWlmIChpID09IDApIHsKKwkJc2VxX3B1dHMocCwgIiAgICAgICAgICAgIik7CisJCWZvcl9lYWNoX29ubGluZV9jcHUoaikKKwkJCXNlcV9wcmludGYocCwgIkNQVSVkICAgICAgICIsaik7CisJCXNlcV9wdXRjKHAsICdcbicpOworCX0KKworCWlmIChpIDwgTlJfSVJRUykgeworCQlzZXFfcHJpbnRmKHAsICIlczogIiwgaW50cmNsYXNzX25hbWVzW2ldKTsKKyNpZm5kZWYgQ09ORklHX1NNUAorCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsIGtzdGF0X2lycXMoaSkpOworI2Vsc2UKKwkJZm9yX2VhY2hfb25saW5lX2NwdShqKQorCQkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBrc3RhdF9jcHUoaikuaXJxc1tpXSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBzZXFfcHV0YyhwLCAnXG4nKTsKKworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGb3IgY29tcGF0aWJpbHR5IG9ubHkuIFMvMzkwIHNwZWNpZmljIHNldHVwIG9mIGludGVycnVwdHMgZXQgYWwuIGlzIGRvbmUKKyAqIG11Y2ggbGF0ZXIgaW4gaW5pdF9jaGFubmVsX3N1YnN5c3RlbSgpLgorICovCit2b2lkIF9faW5pdAoraW5pdF9JUlEodm9pZCkKK3sKKwkvKiBub3RoaW5nLi4uICovCit9CisKKy8qCisgKiBTd2l0Y2ggdG8gdGhlIGFzeW5jaHJvbm91cyBpbnRlcnJ1cHQgc3RhY2sgZm9yIHNvZnRpcnEgZXhlY3V0aW9uLgorICovCitleHRlcm4gdm9pZCBfX2RvX3NvZnRpcnEodm9pZCk7CisKK2FzbWxpbmthZ2Ugdm9pZCBkb19zb2Z0aXJxKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgb2xkLCBuZXc7CisKKwlpZiAoaW5faW50ZXJydXB0KCkpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWFjY291bnRfc3lzdGVtX3Z0aW1lKGN1cnJlbnQpOworCisJbG9jYWxfYmhfZGlzYWJsZSgpOworCisJaWYgKGxvY2FsX3NvZnRpcnFfcGVuZGluZygpKSB7CisJCS8qIEdldCBjdXJyZW50IHN0YWNrIHBvaW50ZXIuICovCisJCWFzbSB2b2xhdGlsZSgibGEgJTAsMCgxNSkiIDogIj1hIiAob2xkKSk7CisJCS8qIENoZWNrIGFnYWluc3QgYXN5bmMuIHN0YWNrIGFkZHJlc3MgcmFuZ2UuICovCisJCW5ldyA9IFMzOTBfbG93Y29yZS5hc3luY19zdGFjazsKKwkJaWYgKCgobmV3IC0gb2xkKSA+PiAoUEFHRV9TSElGVCArIFRIUkVBRF9PUkRFUikpICE9IDApIHsKKwkJCS8qIE5lZWQgdG8gc3dpdGNoIHRvIHRoZSBhc3luYy4gc3RhY2suICovCisJCQluZXcgLT0gU1RBQ0tfRlJBTUVfT1ZFUkhFQUQ7CisJCQkoKHN0cnVjdCBzdGFja19mcmFtZSAqKSBuZXcpLT5iYWNrX2NoYWluID0gb2xkOworCisJCQlhc20gdm9sYXRpbGUoIiAgIGxhICAgIDE1LDAoJTApXG4iCisJCQkJICAgICAiICAgYmFzciAgMTQsJTJcbiIKKwkJCQkgICAgICIgICBsYSAgICAxNSwwKCUxKVxuIgorCQkJCSAgICAgOiA6ICJhIiAobmV3KSwgImEiIChvbGQpLAorCQkJCSAgICAgICAgICJhIiAoX19kb19zb2Z0aXJxKQorCQkJCSAgICAgOiAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiMTQiLAorCQkJCSAgICAgICAiY2MiLCAibWVtb3J5IiApOworCQl9IGVsc2UKKwkJCS8qIFdlIGFyZSBhbHJlYWR5IG9uIHRoZSBhc3luYyBzdGFjay4gKi8KKwkJCV9fZG9fc29mdGlycSgpOworCX0KKworCWFjY291bnRfc3lzdGVtX3Z0aW1lKGN1cnJlbnQpOworCisJX19sb2NhbF9iaF9lbmFibGUoKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworRVhQT1JUX1NZTUJPTChkb19zb2Z0aXJxKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL3MzOTAva2VybmVsL21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwN2Q1MDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL21vZHVsZS5jCkBAIC0wLDAgKzEsNDA1IEBACisvKgorICogIGFyY2gvczM5MC9rZXJuZWwvbW9kdWxlLmMgLSBLZXJuZWwgbW9kdWxlIGhlbHAgZm9yIHMzOTAuCisgKgorICogIFMzOTAgdmVyc2lvbgorICogICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILAorICoJCQkgICAgICAgSUJNIENvcnBvcmF0aW9uCisgKiAgICBBdXRob3Iocyk6IEFybmQgQmVyZ21hbm4gKGFybmRiQGRlLmlibS5jb20pCisgKgkJIE1hcnRpbiBTY2h3aWRlZnNreSAoc2Nod2lkZWZza3lAZGUuaWJtLmNvbSkKKyAqCisgKiAgYmFzZWQgb24gaTM4NiB2ZXJzaW9uCisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDEgUnVzdHkgUnVzc2VsbC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaWYgMAorI2RlZmluZSBERUJVR1AgcHJpbnRrCisjZWxzZQorI2RlZmluZSBERUJVR1AoZm10ICwgLi4uKQorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX0FSQ0hfUzM5MFgKKyNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMTIKKyNlbHNlIC8qIENPTkZJR19BUkNIX1MzOTBYICovCisjZGVmaW5lIFBMVF9FTlRSWV9TSVpFIDIwCisjZW5kaWYgLyogQ09ORklHX0FSQ0hfUzM5MFggKi8KKwordm9pZCAqbW9kdWxlX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gdm1hbGxvYyhzaXplKTsKK30KKworLyogRnJlZSBtZW1vcnkgcmV0dXJuZWQgZnJvbSBtb2R1bGVfYWxsb2MgKi8KK3ZvaWQgbW9kdWxlX2ZyZWUoc3RydWN0IG1vZHVsZSAqbW9kLCB2b2lkICptb2R1bGVfcmVnaW9uKQoreworCXZmcmVlKG1vZHVsZV9yZWdpb24pOworCS8qIEZJWE1FOiBJZiBtb2R1bGVfcmVnaW9uID09IG1vZC0+aW5pdF9yZWdpb24sIHRyaW0gZXhjZXB0aW9uCisgICAgICAgICAgIHRhYmxlIGVudHJpZXMuICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY2hlY2tfcmVsYShFbGZfUmVsYSAqcmVsYSwgc3RydWN0IG1vZHVsZSAqbWUpCit7CisJc3RydWN0IG1vZF9hcmNoX3N5bWluZm8gKmluZm87CisKKwlpbmZvID0gbWUtPmFyY2guc3ltaW5mbyArIEVMRl9SX1NZTSAocmVsYS0+cl9pbmZvKTsKKwlzd2l0Y2ggKEVMRl9SX1RZUEUgKHJlbGEtPnJfaW5mbykpIHsKKwljYXNlIFJfMzkwX0dPVDEyOgkvKiAxMiBiaXQgR09UIG9mZnNldC4gICovCisJY2FzZSBSXzM5MF9HT1QxNjoJLyogMTYgYml0IEdPVCBvZmZzZXQuICAqLworCWNhc2UgUl8zOTBfR09UMjA6CS8qIDIwIGJpdCBHT1Qgb2Zmc2V0LiAgKi8KKwljYXNlIFJfMzkwX0dPVDMyOgkvKiAzMiBiaXQgR09UIG9mZnNldC4gICovCisJY2FzZSBSXzM5MF9HT1Q2NDoJLyogNjQgYml0IEdPVCBvZmZzZXQuICAqLworCWNhc2UgUl8zOTBfR09URU5UOgkvKiAzMiBiaXQgUEMgcmVsLiB0byBHT1QgZW50cnkgc2hpZnRlZCBieSAxLiAqLworCWNhc2UgUl8zOTBfR09UUExUMTI6CS8qIDEyIGJpdCBvZmZzZXQgdG8ganVtcCBzbG90LgkqLworCWNhc2UgUl8zOTBfR09UUExUMTY6CS8qIDE2IGJpdCBvZmZzZXQgdG8ganVtcCBzbG90LiAgKi8KKwljYXNlIFJfMzkwX0dPVFBMVDIwOgkvKiAyMCBiaXQgb2Zmc2V0IHRvIGp1bXAgc2xvdC4gICovCisJY2FzZSBSXzM5MF9HT1RQTFQzMjoJLyogMzIgYml0IG9mZnNldCB0byBqdW1wIHNsb3QuICAqLworCWNhc2UgUl8zOTBfR09UUExUNjQ6CS8qIDY0IGJpdCBvZmZzZXQgdG8ganVtcCBzbG90LgkqLworCWNhc2UgUl8zOTBfR09UUExURU5UOgkvKiAzMiBiaXQgcmVsLiBvZmZzZXQgdG8ganVtcCBzbG90ID4+IDEuICovCisJCWlmIChpbmZvLT5nb3Rfb2Zmc2V0ID09IC0xVUwpIHsKKwkJCWluZm8tPmdvdF9vZmZzZXQgPSBtZS0+YXJjaC5nb3Rfc2l6ZTsKKwkJCW1lLT5hcmNoLmdvdF9zaXplICs9IHNpemVvZih2b2lkKik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBSXzM5MF9QTFQxNkRCTDoJLyogMTYgYml0IFBDIHJlbC4gUExUIHNoaWZ0ZWQgYnkgMS4gICovCisJY2FzZSBSXzM5MF9QTFQzMkRCTDoJLyogMzIgYml0IFBDIHJlbC4gUExUIHNoaWZ0ZWQgYnkgMS4gICovCisJY2FzZSBSXzM5MF9QTFQzMjoJLyogMzIgYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzLiAgKi8KKwljYXNlIFJfMzkwX1BMVDY0OgkvKiA2NCBiaXQgUEMgcmVsYXRpdmUgUExUIGFkZHJlc3MuICAqLworCWNhc2UgUl8zOTBfUExUT0ZGMTY6CS8qIDE2IGJpdCBvZmZzZXQgZnJvbSBHT1QgdG8gUExULiAqLworCWNhc2UgUl8zOTBfUExUT0ZGMzI6CS8qIDMyIGJpdCBvZmZzZXQgZnJvbSBHT1QgdG8gUExULiAqLworCWNhc2UgUl8zOTBfUExUT0ZGNjQ6CS8qIDE2IGJpdCBvZmZzZXQgZnJvbSBHT1QgdG8gUExULiAqLworCQlpZiAoaW5mby0+cGx0X29mZnNldCA9PSAtMVVMKSB7CisJCQlpbmZvLT5wbHRfb2Zmc2V0ID0gbWUtPmFyY2gucGx0X3NpemU7CisJCQltZS0+YXJjaC5wbHRfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJfMzkwX0NPUFk6CisJY2FzZSBSXzM5MF9HTE9CX0RBVDoKKwljYXNlIFJfMzkwX0pNUF9TTE9UOgorCWNhc2UgUl8zOTBfUkVMQVRJVkU6CisJCS8qIE9ubHkgbmVlZGVkIGlmIHdlIHdhbnQgdG8gc3VwcG9ydCBsb2FkaW5nIG9mIAorCQkgICBtb2R1bGVzIGxpbmtlZCB3aXRoIC1zaGFyZWQuICovCisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIEFjY291bnQgZm9yIEdPVCBhbmQgUExUIHJlbG9jYXRpb25zLiBXZSBjYW4ndCBhZGQgc2VjdGlvbnMgZm9yCisgKiBnb3QgYW5kIHBsdCBidXQgd2UgY2FuIGluY3JlYXNlIHRoZSBjb3JlIG1vZHVsZSBzaXplLgorICovCitpbnQKK21vZHVsZV9mcm9iX2FyY2hfc2VjdGlvbnMoRWxmX0VoZHIgKmhkciwgRWxmX1NoZHIgKnNlY2hkcnMsCisJCQkgIGNoYXIgKnNlY3N0cmluZ3MsIHN0cnVjdCBtb2R1bGUgKm1lKQoreworCUVsZl9TaGRyICpzeW10YWI7CisJRWxmX1N5bSAqc3ltYm9sczsKKwlFbGZfUmVsYSAqcmVsYTsKKwljaGFyICpzdHJpbmdzOworCWludCBucmVsYSwgaSwgajsKKworCS8qIEZpbmQgc3ltYm9sIHRhYmxlIGFuZCBzdHJpbmcgdGFibGUuICovCisJc3ltdGFiID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgaGRyLT5lX3NobnVtOyBpKyspCisJCXN3aXRjaCAoc2VjaGRyc1tpXS5zaF90eXBlKSB7CisJCWNhc2UgU0hUX1NZTVRBQjoKKwkJCXN5bXRhYiA9IHNlY2hkcnMgKyBpOworCQkJYnJlYWs7CisJCX0KKwlpZiAoIXN5bXRhYikgeworCQlwcmludGsoS0VSTl9FUlIgIm1vZHVsZSAlczogbm8gc3ltYm9sIHRhYmxlXG4iLCBtZS0+bmFtZSk7CisJCXJldHVybiAtRU5PRVhFQzsKKwl9CisKKwkvKiBBbGxvY2F0ZSBvbmUgc3ltaW5mbyBzdHJ1Y3R1cmUgcGVyIHN5bWJvbC4gKi8KKwltZS0+YXJjaC5uc3ltcyA9IHN5bXRhYi0+c2hfc2l6ZSAvIHNpemVvZihFbGZfU3ltKTsKKwltZS0+YXJjaC5zeW1pbmZvID0gdm1hbGxvYyhtZS0+YXJjaC5uc3ltcyAqCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBtb2RfYXJjaF9zeW1pbmZvKSk7CisJaWYgKCFtZS0+YXJjaC5zeW1pbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzeW1ib2xzID0gKHZvaWQgKikgaGRyICsgc3ltdGFiLT5zaF9vZmZzZXQ7CisJc3RyaW5ncyA9ICh2b2lkICopIGhkciArIHNlY2hkcnNbc3ltdGFiLT5zaF9saW5rXS5zaF9vZmZzZXQ7CisJZm9yIChpID0gMDsgaSA8IG1lLT5hcmNoLm5zeW1zOyBpKyspIHsKKwkJaWYgKHN5bWJvbHNbaV0uc3Rfc2huZHggPT0gU0hOX1VOREVGICYmCisJCSAgICBzdHJjbXAoc3RyaW5ncyArIHN5bWJvbHNbaV0uc3RfbmFtZSwKKwkJCSAgICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQorCQkJLyogIkRlZmluZSIgaXQgYXMgYWJzb2x1dGUuICovCisJCQlzeW1ib2xzW2ldLnN0X3NobmR4ID0gU0hOX0FCUzsKKwkJbWUtPmFyY2guc3ltaW5mb1tpXS5nb3Rfb2Zmc2V0ID0gLTFVTDsKKwkJbWUtPmFyY2guc3ltaW5mb1tpXS5wbHRfb2Zmc2V0ID0gLTFVTDsKKwkJbWUtPmFyY2guc3ltaW5mb1tpXS5nb3RfaW5pdGlhbGl6ZWQgPSAwOworCQltZS0+YXJjaC5zeW1pbmZvW2ldLnBsdF9pbml0aWFsaXplZCA9IDA7CisJfQorCisJLyogU2VhcmNoIGZvciBnb3QvcGx0IHJlbG9jYXRpb25zLiAqLworCW1lLT5hcmNoLmdvdF9zaXplID0gbWUtPmFyY2gucGx0X3NpemUgPSAwOworCWZvciAoaSA9IDA7IGkgPCBoZHItPmVfc2hudW07IGkrKykgeworCQlpZiAoc2VjaGRyc1tpXS5zaF90eXBlICE9IFNIVF9SRUxBKQorCQkJY29udGludWU7CisJCW5yZWxhID0gc2VjaGRyc1tpXS5zaF9zaXplIC8gc2l6ZW9mKEVsZl9SZWxhKTsKKwkJcmVsYSA9ICh2b2lkICopIGhkciArIHNlY2hkcnNbaV0uc2hfb2Zmc2V0OworCQlmb3IgKGogPSAwOyBqIDwgbnJlbGE7IGorKykKKwkJCWNoZWNrX3JlbGEocmVsYSArIGosIG1lKTsKKwl9CisKKwkvKiBJbmNyZWFzZSBjb3JlIHNpemUgYnkgc2l6ZSBvZiBnb3QgJiBwbHQgYW5kIHNldCBzdGFydAorCSAgIG9mZnNldHMgZm9yIGdvdCBhbmQgcGx0LiAqLworCW1lLT5jb3JlX3NpemUgPSBBTElHTihtZS0+Y29yZV9zaXplLCA0KTsKKwltZS0+YXJjaC5nb3Rfb2Zmc2V0ID0gbWUtPmNvcmVfc2l6ZTsKKwltZS0+Y29yZV9zaXplICs9IG1lLT5hcmNoLmdvdF9zaXplOworCW1lLT5hcmNoLnBsdF9vZmZzZXQgPSBtZS0+Y29yZV9zaXplOworCW1lLT5jb3JlX3NpemUgKz0gbWUtPmFyY2gucGx0X3NpemU7CisJcmV0dXJuIDA7Cit9CisKK2ludAorYXBwbHlfcmVsb2NhdGUoRWxmX1NoZHIgKnNlY2hkcnMsIGNvbnN0IGNoYXIgKnN0cnRhYiwgdW5zaWduZWQgaW50IHN5bWluZGV4LAorCSAgICAgICB1bnNpZ25lZCBpbnQgcmVsc2VjLCBzdHJ1Y3QgbW9kdWxlICptZSkKK3sKKwlwcmludGsoS0VSTl9FUlIgIm1vZHVsZSAlczogUkVMT0NBVElPTiB1bnN1cHBvcnRlZFxuIiwKKwkgICAgICAgbWUtPm5hbWUpOworCXJldHVybiAtRU5PRVhFQzsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2FwcGx5X3JlbGEoRWxmX1JlbGEgKnJlbGEsIEVsZl9BZGRyIGJhc2UsIEVsZl9TeW0gKnN5bXRhYiwgCisJICAgc3RydWN0IG1vZHVsZSAqbWUpCit7CisJc3RydWN0IG1vZF9hcmNoX3N5bWluZm8gKmluZm87CisJRWxmX0FkZHIgbG9jLCB2YWw7CisJaW50IHJfdHlwZSwgcl9zeW07CisKKwkvKiBUaGlzIGlzIHdoZXJlIHRvIG1ha2UgdGhlIGNoYW5nZSAqLworCWxvYyA9IGJhc2UgKyByZWxhLT5yX29mZnNldDsKKwkvKiBUaGlzIGlzIHRoZSBzeW1ib2wgaXQgaXMgcmVmZXJyaW5nIHRvLiAgTm90ZSB0aGF0IGFsbAorCSAgIHVuZGVmaW5lZCBzeW1ib2xzIGhhdmUgYmVlbiByZXNvbHZlZC4gICovCisJcl9zeW0gPSBFTEZfUl9TWU0ocmVsYS0+cl9pbmZvKTsKKwlyX3R5cGUgPSBFTEZfUl9UWVBFKHJlbGEtPnJfaW5mbyk7CisJaW5mbyA9IG1lLT5hcmNoLnN5bWluZm8gKyByX3N5bTsKKwl2YWwgPSBzeW10YWJbcl9zeW1dLnN0X3ZhbHVlOworCisJc3dpdGNoIChyX3R5cGUpIHsKKwljYXNlIFJfMzkwXzg6CQkvKiBEaXJlY3QgOCBiaXQuICAgKi8KKwljYXNlIFJfMzkwXzEyOgkJLyogRGlyZWN0IDEyIGJpdC4gICovCisJY2FzZSBSXzM5MF8xNjoJCS8qIERpcmVjdCAxNiBiaXQuICAqLworCWNhc2UgUl8zOTBfMjA6CQkvKiBEaXJlY3QgMjAgYml0LiAgKi8KKwljYXNlIFJfMzkwXzMyOgkJLyogRGlyZWN0IDMyIGJpdC4gICovCisJY2FzZSBSXzM5MF82NDoJCS8qIERpcmVjdCA2NCBiaXQuICAqLworCQl2YWwgKz0gcmVsYS0+cl9hZGRlbmQ7CisJCWlmIChyX3R5cGUgPT0gUl8zOTBfOCkKKwkJCSoodW5zaWduZWQgY2hhciAqKSBsb2MgPSB2YWw7CisJCWVsc2UgaWYgKHJfdHlwZSA9PSBSXzM5MF8xMikKKwkJCSoodW5zaWduZWQgc2hvcnQgKikgbG9jID0gKHZhbCAmIDB4ZmZmKSB8CisJCQkJKCoodW5zaWduZWQgc2hvcnQgKikgbG9jICYgMHhmMDAwKTsKKwkJZWxzZSBpZiAocl90eXBlID09IFJfMzkwXzE2KQorCQkJKih1bnNpZ25lZCBzaG9ydCAqKSBsb2MgPSB2YWw7CisJCWVsc2UgaWYgKHJfdHlwZSA9PSBSXzM5MF8yMCkKKwkJCSoodW5zaWduZWQgaW50ICopIGxvYyA9CisJCQkJKCoodW5zaWduZWQgaW50ICopIGxvYyAmIDB4ZjAwMDAwZmYpIHwKKwkJCQkodmFsICYgMHhmZmYpIDw8IDE2IHwgKHZhbCAmIDB4ZmYwMDApID4+IDQ7CisJCWVsc2UgaWYgKHJfdHlwZSA9PSBSXzM5MF8zMikKKwkJCSoodW5zaWduZWQgaW50ICopIGxvYyA9IHZhbDsKKwkJZWxzZSBpZiAocl90eXBlID09IFJfMzkwXzY0KQorCQkJKih1bnNpZ25lZCBsb25nICopIGxvYyA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSBSXzM5MF9QQzE2OgkvKiBQQyByZWxhdGl2ZSAxNiBiaXQuICAqLworCWNhc2UgUl8zOTBfUEMxNkRCTDoJLyogUEMgcmVsYXRpdmUgMTYgYml0IHNoaWZ0ZWQgYnkgMS4gICovCisJY2FzZSBSXzM5MF9QQzMyREJMOgkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgc2hpZnRlZCBieSAxLiAgKi8KKwljYXNlIFJfMzkwX1BDMzI6CS8qIFBDIHJlbGF0aXZlIDMyIGJpdC4gICovCisJY2FzZSBSXzM5MF9QQzY0OgkvKiBQQyByZWxhdGl2ZSA2NCBiaXQuCSovCisJCXZhbCArPSByZWxhLT5yX2FkZGVuZCAtIGxvYzsKKwkJaWYgKHJfdHlwZSA9PSBSXzM5MF9QQzE2KQorCQkJKih1bnNpZ25lZCBzaG9ydCAqKSBsb2MgPSB2YWw7CisJCWVsc2UgaWYgKHJfdHlwZSA9PSBSXzM5MF9QQzE2REJMKQorCQkJKih1bnNpZ25lZCBzaG9ydCAqKSBsb2MgPSB2YWwgPj4gMTsKKwkJZWxzZSBpZiAocl90eXBlID09IFJfMzkwX1BDMzJEQkwpCisJCQkqKHVuc2lnbmVkIGludCAqKSBsb2MgPSB2YWwgPj4gMTsKKwkJZWxzZSBpZiAocl90eXBlID09IFJfMzkwX1BDMzIpCisJCQkqKHVuc2lnbmVkIGludCAqKSBsb2MgPSB2YWw7CisJCWVsc2UgaWYgKHJfdHlwZSA9PSBSXzM5MF9QQzY0KQorCQkJKih1bnNpZ25lZCBsb25nICopIGxvYyA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSBSXzM5MF9HT1QxMjoJLyogMTIgYml0IEdPVCBvZmZzZXQuICAqLworCWNhc2UgUl8zOTBfR09UMTY6CS8qIDE2IGJpdCBHT1Qgb2Zmc2V0LiAgKi8KKwljYXNlIFJfMzkwX0dPVDIwOgkvKiAyMCBiaXQgR09UIG9mZnNldC4gICovCisJY2FzZSBSXzM5MF9HT1QzMjoJLyogMzIgYml0IEdPVCBvZmZzZXQuICAqLworCWNhc2UgUl8zOTBfR09UNjQ6CS8qIDY0IGJpdCBHT1Qgb2Zmc2V0LiAgKi8KKwljYXNlIFJfMzkwX0dPVEVOVDoJLyogMzIgYml0IFBDIHJlbC4gdG8gR09UIGVudHJ5IHNoaWZ0ZWQgYnkgMS4gKi8KKwljYXNlIFJfMzkwX0dPVFBMVDEyOgkvKiAxMiBiaXQgb2Zmc2V0IHRvIGp1bXAgc2xvdC4JKi8KKwljYXNlIFJfMzkwX0dPVFBMVDIwOgkvKiAyMCBiaXQgb2Zmc2V0IHRvIGp1bXAgc2xvdC4gICovCisJY2FzZSBSXzM5MF9HT1RQTFQxNjoJLyogMTYgYml0IG9mZnNldCB0byBqdW1wIHNsb3QuICAqLworCWNhc2UgUl8zOTBfR09UUExUMzI6CS8qIDMyIGJpdCBvZmZzZXQgdG8ganVtcCBzbG90LiAgKi8KKwljYXNlIFJfMzkwX0dPVFBMVDY0OgkvKiA2NCBiaXQgb2Zmc2V0IHRvIGp1bXAgc2xvdC4JKi8KKwljYXNlIFJfMzkwX0dPVFBMVEVOVDoJLyogMzIgYml0IHJlbC4gb2Zmc2V0IHRvIGp1bXAgc2xvdCA+PiAxLiAqLworCQlpZiAoaW5mby0+Z290X2luaXRpYWxpemVkID09IDApIHsKKwkJCUVsZl9BZGRyICpnb3RlbnQ7CisKKwkJCWdvdGVudCA9IG1lLT5tb2R1bGVfY29yZSArIG1lLT5hcmNoLmdvdF9vZmZzZXQgKworCQkJCWluZm8tPmdvdF9vZmZzZXQ7CisJCQkqZ290ZW50ID0gdmFsOworCQkJaW5mby0+Z290X2luaXRpYWxpemVkID0gMTsKKwkJfQorCQl2YWwgPSBpbmZvLT5nb3Rfb2Zmc2V0ICsgcmVsYS0+cl9hZGRlbmQ7CisJCWlmIChyX3R5cGUgPT0gUl8zOTBfR09UMTIgfHwKKwkJICAgIHJfdHlwZSA9PSBSXzM5MF9HT1RQTFQxMikKKwkJCSoodW5zaWduZWQgc2hvcnQgKikgbG9jID0gKHZhbCAmIDB4ZmZmKSB8CisJCQkJKCoodW5zaWduZWQgc2hvcnQgKikgbG9jICYgMHhmMDAwKTsKKwkJZWxzZSBpZiAocl90eXBlID09IFJfMzkwX0dPVDE2IHx8CisJCQkgcl90eXBlID09IFJfMzkwX0dPVFBMVDE2KQorCQkJKih1bnNpZ25lZCBzaG9ydCAqKSBsb2MgPSB2YWw7CisJCWVsc2UgaWYgKHJfdHlwZSA9PSBSXzM5MF9HT1QyMCB8fAorCQkJIHJfdHlwZSA9PSBSXzM5MF9HT1RQTFQyMCkKKwkJCSoodW5zaWduZWQgaW50ICopIGxvYyA9CisJCQkJKCoodW5zaWduZWQgaW50ICopIGxvYyAmIDB4ZjAwMDAwZmYpIHwKKwkJCQkodmFsICYgMHhmZmYpIDw8IDE2IHwgKHZhbCAmIDB4ZmYwMDApID4+IDQ7CisJCWVsc2UgaWYgKHJfdHlwZSA9PSBSXzM5MF9HT1QzMiB8fAorCQkJIHJfdHlwZSA9PSBSXzM5MF9HT1RQTFQzMikKKwkJCSoodW5zaWduZWQgaW50ICopIGxvYyA9IHZhbDsKKwkJZWxzZSBpZiAocl90eXBlID09IFJfMzkwX0dPVEVOVCB8fAorCQkJIHJfdHlwZSA9PSBSXzM5MF9HT1RQTFRFTlQpCisJCQkqKHVuc2lnbmVkIGludCAqKSBsb2MgPQorCQkJCSh2YWwgKyAoRWxmX0FkZHIpIG1lLT5tb2R1bGVfY29yZSAtIGxvYykgPj4gMTsKKwkJZWxzZSBpZiAocl90eXBlID09IFJfMzkwX0dPVDY0IHx8CisJCQkgcl90eXBlID09IFJfMzkwX0dPVFBMVDY0KQorCQkJKih1bnNpZ25lZCBsb25nICopIGxvYyA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSBSXzM5MF9QTFQxNkRCTDoJLyogMTYgYml0IFBDIHJlbC4gUExUIHNoaWZ0ZWQgYnkgMS4gICovCisJY2FzZSBSXzM5MF9QTFQzMkRCTDoJLyogMzIgYml0IFBDIHJlbC4gUExUIHNoaWZ0ZWQgYnkgMS4gICovCisJY2FzZSBSXzM5MF9QTFQzMjoJLyogMzIgYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzLiAgKi8KKwljYXNlIFJfMzkwX1BMVDY0OgkvKiA2NCBiaXQgUEMgcmVsYXRpdmUgUExUIGFkZHJlc3MuICAqLworCWNhc2UgUl8zOTBfUExUT0ZGMTY6CS8qIDE2IGJpdCBvZmZzZXQgZnJvbSBHT1QgdG8gUExULiAqLworCWNhc2UgUl8zOTBfUExUT0ZGMzI6CS8qIDMyIGJpdCBvZmZzZXQgZnJvbSBHT1QgdG8gUExULiAqLworCWNhc2UgUl8zOTBfUExUT0ZGNjQ6CS8qIDE2IGJpdCBvZmZzZXQgZnJvbSBHT1QgdG8gUExULiAqLworCQlpZiAoaW5mby0+cGx0X2luaXRpYWxpemVkID09IDApIHsKKwkJCXVuc2lnbmVkIGludCAqaXA7CisJCQlpcCA9IG1lLT5tb2R1bGVfY29yZSArIG1lLT5hcmNoLnBsdF9vZmZzZXQgKworCQkJCWluZm8tPnBsdF9vZmZzZXQ7CisjaWZuZGVmIENPTkZJR19BUkNIX1MzOTBYCisJCQlpcFswXSA9IDB4MGQxMDU4MTA7IC8qIGJhc3IgMSwwOyBsIDEsNigxKTsgYnIgMSAqLworCQkJaXBbMV0gPSAweDEwMDYwN2YxOworCQkJaXBbMl0gPSB2YWw7CisjZWxzZSAvKiBDT05GSUdfQVJDSF9TMzkwWCAqLworCQkJaXBbMF0gPSAweDBkMTBlMzEwOyAvKiBiYXNyIDEsMDsgbGcgMSwxMCgxKTsgYnIgMSAqLworCQkJaXBbMV0gPSAweDEwMGEwMDA0OworCQkJaXBbMl0gPSAweDA3ZjEwMDAwOworCQkJaXBbM10gPSAodW5zaWduZWQgaW50KSAodmFsID4+IDMyKTsKKwkJCWlwWzRdID0gKHVuc2lnbmVkIGludCkgdmFsOworI2VuZGlmIC8qIENPTkZJR19BUkNIX1MzOTBYICovCisJCQlpbmZvLT5wbHRfaW5pdGlhbGl6ZWQgPSAxOworCQl9CisJCWlmIChyX3R5cGUgPT0gUl8zOTBfUExUT0ZGMTYgfHwKKwkJICAgIHJfdHlwZSA9PSBSXzM5MF9QTFRPRkYzMgorCQkgICAgfHwgcl90eXBlID09IFJfMzkwX1BMVE9GRjY0CisJCQkpCisJCQl2YWwgPSBtZS0+YXJjaC5wbHRfb2Zmc2V0IC0gbWUtPmFyY2guZ290X29mZnNldCArCisJCQkJaW5mby0+cGx0X29mZnNldCArIHJlbGEtPnJfYWRkZW5kOworCQllbHNlCisJCQl2YWwgPSAgKEVsZl9BZGRyKSBtZS0+bW9kdWxlX2NvcmUgKworCQkJCW1lLT5hcmNoLnBsdF9vZmZzZXQgKyBpbmZvLT5wbHRfb2Zmc2V0ICsgCisJCQkJcmVsYS0+cl9hZGRlbmQgLSBsb2M7CisJCWlmIChyX3R5cGUgPT0gUl8zOTBfUExUMTZEQkwpCisJCQkqKHVuc2lnbmVkIHNob3J0ICopIGxvYyA9IHZhbCA+PiAxOworCQllbHNlIGlmIChyX3R5cGUgPT0gUl8zOTBfUExUT0ZGMTYpCisJCQkqKHVuc2lnbmVkIHNob3J0ICopIGxvYyA9IHZhbDsKKwkJZWxzZSBpZiAocl90eXBlID09IFJfMzkwX1BMVDMyREJMKQorCQkJKih1bnNpZ25lZCBpbnQgKikgbG9jID0gdmFsID4+IDE7CisJCWVsc2UgaWYgKHJfdHlwZSA9PSBSXzM5MF9QTFQzMiB8fAorCQkJIHJfdHlwZSA9PSBSXzM5MF9QTFRPRkYzMikKKwkJCSoodW5zaWduZWQgaW50ICopIGxvYyA9IHZhbDsKKwkJZWxzZSBpZiAocl90eXBlID09IFJfMzkwX1BMVDY0IHx8CisJCQkgcl90eXBlID09IFJfMzkwX1BMVE9GRjY0KQorCQkJKih1bnNpZ25lZCBsb25nICopIGxvYyA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSBSXzM5MF9HT1RPRkYxNjoJLyogMTYgYml0IG9mZnNldCB0byBHT1QuICAqLworCWNhc2UgUl8zOTBfR09UT0ZGMzI6CS8qIDMyIGJpdCBvZmZzZXQgdG8gR09ULiAgKi8KKwljYXNlIFJfMzkwX0dPVE9GRjY0OgkvKiA2NCBiaXQgb2Zmc2V0IHRvIEdPVC4gKi8KKwkJdmFsID0gdmFsICsgcmVsYS0+cl9hZGRlbmQgLQorCQkJKChFbGZfQWRkcikgbWUtPm1vZHVsZV9jb3JlICsgbWUtPmFyY2guZ290X29mZnNldCk7CisJCWlmIChyX3R5cGUgPT0gUl8zOTBfR09UT0ZGMTYpCisJCQkqKHVuc2lnbmVkIHNob3J0ICopIGxvYyA9IHZhbDsKKwkJZWxzZSBpZiAocl90eXBlID09IFJfMzkwX0dPVE9GRjMyKQorCQkJKih1bnNpZ25lZCBpbnQgKikgbG9jID0gdmFsOworCQllbHNlIGlmIChyX3R5cGUgPT0gUl8zOTBfR09UT0ZGNjQpCisJCQkqKHVuc2lnbmVkIGxvbmcgKikgbG9jID0gdmFsOworCQlicmVhazsKKwljYXNlIFJfMzkwX0dPVFBDOgkvKiAzMiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvIEdPVC4gKi8KKwljYXNlIFJfMzkwX0dPVFBDREJMOgkvKiAzMiBiaXQgUEMgcmVsLiBvZmYuIHRvIEdPVCBzaGlmdGVkIGJ5IDEuICovCisJCXZhbCA9IChFbGZfQWRkcikgbWUtPm1vZHVsZV9jb3JlICsgbWUtPmFyY2guZ290X29mZnNldCArCisJCQlyZWxhLT5yX2FkZGVuZCAtIGxvYzsKKwkJaWYgKHJfdHlwZSA9PSBSXzM5MF9HT1RQQykKKwkJCSoodW5zaWduZWQgaW50ICopIGxvYyA9IHZhbDsKKwkJZWxzZSBpZiAocl90eXBlID09IFJfMzkwX0dPVFBDREJMKQorCQkJKih1bnNpZ25lZCBpbnQgKikgbG9jID0gdmFsID4+IDE7CisJCWJyZWFrOworCWNhc2UgUl8zOTBfQ09QWToKKwljYXNlIFJfMzkwX0dMT0JfREFUOgkvKiBDcmVhdGUgR09UIGVudHJ5LiAgKi8KKwljYXNlIFJfMzkwX0pNUF9TTE9UOgkvKiBDcmVhdGUgUExUIGVudHJ5LiAgKi8KKwljYXNlIFJfMzkwX1JFTEFUSVZFOgkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlLiAgKi8KKwkJLyogT25seSBuZWVkZWQgaWYgd2Ugd2FudCB0byBzdXBwb3J0IGxvYWRpbmcgb2YgCisJCSAgIG1vZHVsZXMgbGlua2VkIHdpdGggLXNoYXJlZC4gKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJtb2R1bGUgJXM6IFVua25vd24gcmVsb2NhdGlvbjogJXVcbiIsCisJCSAgICAgICBtZS0+bmFtZSwgcl90eXBlKTsKKwkJcmV0dXJuIC1FTk9FWEVDOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50CithcHBseV9yZWxvY2F0ZV9hZGQoRWxmX1NoZHIgKnNlY2hkcnMsIGNvbnN0IGNoYXIgKnN0cnRhYiwKKwkJICAgdW5zaWduZWQgaW50IHN5bWluZGV4LCB1bnNpZ25lZCBpbnQgcmVsc2VjLAorCQkgICBzdHJ1Y3QgbW9kdWxlICptZSkKK3sKKwlFbGZfQWRkciBiYXNlOworCUVsZl9TeW0gKnN5bXRhYjsKKwlFbGZfUmVsYSAqcmVsYTsKKwl1bnNpZ25lZCBsb25nIGksIG47CisJaW50IHJjOworCisJREVCVUdQKCJBcHBseWluZyByZWxvY2F0ZSBzZWN0aW9uICV1IHRvICV1XG4iLAorCSAgICAgICByZWxzZWMsIHNlY2hkcnNbcmVsc2VjXS5zaF9pbmZvKTsKKwliYXNlID0gc2VjaGRyc1tzZWNoZHJzW3JlbHNlY10uc2hfaW5mb10uc2hfYWRkcjsKKwlzeW10YWIgPSAoRWxmX1N5bSAqKSBzZWNoZHJzW3N5bWluZGV4XS5zaF9hZGRyOworCXJlbGEgPSAoRWxmX1JlbGEgKikgc2VjaGRyc1tyZWxzZWNdLnNoX2FkZHI7CisJbiA9IHNlY2hkcnNbcmVsc2VjXS5zaF9zaXplIC8gc2l6ZW9mKEVsZl9SZWxhKTsKKworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyssIHJlbGErKykgeworCQlyYyA9IGFwcGx5X3JlbGEocmVsYSwgYmFzZSwgc3ltdGFiLCBtZSk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBtb2R1bGVfZmluYWxpemUoY29uc3QgRWxmX0VoZHIgKmhkciwKKwkJICAgIGNvbnN0IEVsZl9TaGRyICpzZWNoZHJzLAorCQkgICAgc3RydWN0IG1vZHVsZSAqbWUpCit7CisJdmZyZWUobWUtPmFyY2guc3ltaW5mbyk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbW9kdWxlX2FyY2hfY2xlYW51cChzdHJ1Y3QgbW9kdWxlICptb2QpCit7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZWEyNWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYwpAQCAtMCwwICsxLDQxNiBAQAorLyoKKyAqICBhcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYworICoKKyAqICBTMzkwIHZlcnNpb24KKyAqICAgIENvcHlyaWdodCAoQykgMTk5OSBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwgSUJNIENvcnBvcmF0aW9uCisgKiAgICBBdXRob3Iocyk6IE1hcnRpbiBTY2h3aWRlZnNreSAoc2Nod2lkZWZza3lAZGUuaWJtLmNvbSksCisgKiAgICAgICAgICAgICAgIEhhcnRtdXQgUGVubmVyIChocEBkZS5pYm0uY29tKSwKKyAqICAgICAgICAgICAgICAgRGVuaXMgSm9zZXBoIEJhcnJvdyAoZGpiYXJyb3dAZGUuaWJtLmNvbSxiYXJyb3dfZGpAeWFob28uY29tKSwKKyAqCisgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYyIKKyAqICAgIENvcHlyaWdodCAoQykgMTk5NSwgTGludXMgVG9ydmFsZHMKKyAqLworCisvKgorICogVGhpcyBmaWxlIGhhbmRsZXMgdGhlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgcGFydHMgb2YgcHJvY2VzcyBoYW5kbGluZy4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisKK2FzbWxpbmthZ2Ugdm9pZCByZXRfZnJvbV9mb3JrKHZvaWQpIF9fYXNtX18oInJldF9mcm9tX2ZvcmsiKTsKKworLyoKKyAqIFJldHVybiBzYXZlZCBQQyBvZiBhIGJsb2NrZWQgdGhyZWFkLiB1c2VkIGluIGtlcm5lbC9zY2hlZC4KKyAqIHJlc3VtZSBpbiBlbnRyeS5TIGRvZXMgbm90IGNyZWF0ZSBhIG5ldyBzdGFjayBmcmFtZSwgaXQKKyAqIGp1c3Qgc3RvcmVzIHRoZSByZWdpc3RlcnMgJXI2LSVyMTUgdG8gdGhlIGZyYW1lIGdpdmVuIGJ5CisgKiBzY2hlZHVsZS4gV2Ugd2FudCB0byByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGNhbGxlciBvZgorICogc2NoZWR1bGUsIHNvIHdlIGhhdmUgdG8gd2FsayB0aGUgYmFja2NoYWluIG9uZSB0aW1lIHRvCisgKiBmaW5kIHRoZSBmcmFtZSBzY2hlZHVsZSgpIHN0b3JlIGl0cyByZXR1cm4gYWRkcmVzcy4KKyAqLwordW5zaWduZWQgbG9uZyB0aHJlYWRfc2F2ZWRfcGMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJc3RydWN0IHN0YWNrX2ZyYW1lICpzZjsKKworCXNmID0gKHN0cnVjdCBzdGFja19mcmFtZSAqKSB0c2stPnRocmVhZC5rc3A7CisJc2YgPSAoc3RydWN0IHN0YWNrX2ZyYW1lICopIHNmLT5iYWNrX2NoYWluOworCXJldHVybiBzZi0+Z3Byc1s4XTsKK30KKworLyoKKyAqIE5lZWQgdG8ga25vdyBhYm91dCBDUFVzIGdvaW5nIGlkbGU/CisgKi8KK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKmlkbGVfY2hhaW47CisKK2ludCByZWdpc3Rlcl9pZGxlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIG5vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZpZGxlX2NoYWluLCBuYik7Cit9CitFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX2lkbGVfbm90aWZpZXIpOworCitpbnQgdW5yZWdpc3Rlcl9pZGxlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIG5vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJmlkbGVfY2hhaW4sIG5iKTsKK30KK0VYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9pZGxlX25vdGlmaWVyKTsKKwordm9pZCBkb19tb25pdG9yX2NhbGwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgaW50ZXJydXB0aW9uX2NvZGUpCit7CisJLyogZGlzYWJsZSBtb25pdG9yIGNhbGwgY2xhc3MgMCAqLworCV9fY3RsX2NsZWFyX2JpdCg4LCAxNSk7CisKKwlub3RpZmllcl9jYWxsX2NoYWluKCZpZGxlX2NoYWluLCBDUFVfTk9UX0lETEUsCisJCQkgICAgKHZvaWQgKikobG9uZykgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKK30KKworLyoKKyAqIFRoZSBpZGxlIGxvb3Agb24gYSBTMzkwLi4uCisgKi8KK3ZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpCit7CisJcHN3X3Qgd2FpdF9wc3c7CisJdW5zaWduZWQgbG9uZyByZWc7CisJaW50IGNwdSwgcmM7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworICAgICAgICBpZiAobmVlZF9yZXNjaGVkKCkpIHsKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworICAgICAgICAgICAgICAgIHNjaGVkdWxlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKwkvKiBDUFUgaXMgZ29pbmcgaWRsZS4gKi8KKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJcmMgPSBub3RpZmllcl9jYWxsX2NoYWluKCZpZGxlX2NoYWluLCBDUFVfSURMRSwgKHZvaWQgKikobG9uZykgY3B1KTsKKwlpZiAocmMgIT0gTk9USUZZX09LICYmIHJjICE9IE5PVElGWV9ET05FKQorCQlCVUcoKTsKKwlpZiAocmMgIT0gTk9USUZZX09LKSB7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGVuYWJsZSBtb25pdG9yIGNhbGwgY2xhc3MgMCAqLworCV9fY3RsX3NldF9iaXQoOCwgMTUpOworCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJaWYgKGNwdV9pc19vZmZsaW5lKHNtcF9wcm9jZXNzb3JfaWQoKSkpCisJCWNwdV9kaWUoKTsKKyNlbmRpZgorCisJLyogCisJICogV2FpdCBmb3IgZXh0ZXJuYWwsIEkvTyBvciBtYWNoaW5lIGNoZWNrIGludGVycnVwdCBhbmQKKwkgKiBzd2l0Y2ggb2ZmIG1hY2hpbmUgY2hlY2sgYml0IGFmdGVyIHRoZSB3YWl0IGhhcyBlbmRlZC4KKwkgKi8KKwl3YWl0X3Bzdy5tYXNrID0gUFNXX0tFUk5FTF9CSVRTIHwgUFNXX01BU0tfTUNIRUNLIHwgUFNXX01BU0tfV0FJVCB8CisJCVBTV19NQVNLX0lPIHwgUFNXX01BU0tfRVhUOworI2lmbmRlZiBDT05GSUdfQVJDSF9TMzkwWAorCWFzbSB2b2xhdGlsZSAoCisJCSIgICAgYmFzciAlMCwwXG4iCisJCSIwOiAgbGEgICAlMCwxZi0wYiglMClcbiIKKwkJIiAgICBzdCAgICUwLDQoJTEpXG4iCisJCSIgICAgb2kgICA0KCUxKSwweDgwXG4iCisJCSIgICAgbHBzdyAwKCUxKVxuIgorCQkiMTogIGxhICAgJTAsMmYtMWIoJTApXG4iCisJCSIgICAgc3QgICAlMCw0KCUxKVxuIgorCQkiICAgIG9pICAgNCglMSksMHg4MFxuIgorCQkiICAgIG5pICAgMSglMSksMHhmOVxuIgorCQkiICAgIGxwc3cgMCglMSlcbiIKKwkJIjI6IgorCQk6ICI9JmEiIChyZWcpIDogImEiICgmd2FpdF9wc3cpIDogIm1lbW9yeSIsICJjYyIgKTsKKyNlbHNlIC8qIENPTkZJR19BUkNIX1MzOTBYICovCisJYXNtIHZvbGF0aWxlICgKKwkJIiAgICBsYXJsICAlMCwwZlxuIgorCQkiICAgIHN0ZyAgICUwLDgoJTEpXG4iCisJCSIgICAgbHBzd2UgMCglMSlcbiIKKwkJIjA6ICBsYXJsICAlMCwxZlxuIgorCQkiICAgIHN0ZyAgICUwLDgoJTEpXG4iCisJCSIgICAgbmkgICAgMSglMSksMHhmOVxuIgorCQkiICAgIGxwc3dlIDAoJTEpXG4iCisJCSIxOiIKKwkJOiAiPSZhIiAocmVnKSA6ICJhIiAoJndhaXRfcHN3KSA6ICJtZW1vcnkiLCAiY2MiICk7CisjZW5kaWYgLyogQ09ORklHX0FSQ0hfUzM5MFggKi8KK30KKwordm9pZCBjcHVfaWRsZSh2b2lkKQoreworCWZvciAoOzspCisJCWRlZmF1bHRfaWRsZSgpOworfQorCit2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisKKyAgICAgICAgcHJpbnRrKCJDUFU6ICAgICVkICAgICVzXG4iLCB0c2stPnRocmVhZF9pbmZvLT5jcHUsIHByaW50X3RhaW50ZWQoKSk7CisgICAgICAgIHByaW50aygiUHJvY2VzcyAlcyAocGlkOiAlZCwgdGFzazogJXAsIGtzcDogJXApXG4iLAorCSAgICAgICBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsICh2b2lkICopIHRzaywKKwkgICAgICAgKHZvaWQgKikgdHNrLT50aHJlYWQua3NwKTsKKworCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworCS8qIFNob3cgc3RhY2sgYmFja3RyYWNlIGlmIHB0X3JlZ3MgaXMgZnJvbSBrZXJuZWwgbW9kZSAqLworCWlmICghKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKSkKKwkJc2hvd190cmFjZSgwLCh1bnNpZ25lZCBsb25nICopIHJlZ3MtPmdwcnNbMTVdKTsKK30KKworZXh0ZXJuIHZvaWQga2VybmVsX3RocmVhZF9zdGFydGVyKHZvaWQpOworCitfX2FzbV9fKCIuYWxpZ24gNFxuIgorCSJrZXJuZWxfdGhyZWFkX3N0YXJ0ZXI6XG4iCisJIiAgICBsYSAgICAyLDAoMTApXG4iCisJIiAgICBiYXNyICAxNCw5XG4iCisJIiAgICBsYSAgICAyLDBcbiIKKwkiICAgIGJyICAgIDExXG4iKTsKKworaW50IGtlcm5lbF90aHJlYWQoaW50ICgqZm4pKHZvaWQgKiksIHZvaWQgKiBhcmcsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IHB0X3JlZ3MgcmVnczsKKworCW1lbXNldCgmcmVncywgMCwgc2l6ZW9mKHJlZ3MpKTsKKwlyZWdzLnBzdy5tYXNrID0gUFNXX0tFUk5FTF9CSVRTIHwgUFNXX01BU0tfSU8gfCBQU1dfTUFTS19FWFQ7CisJcmVncy5wc3cuYWRkciA9ICh1bnNpZ25lZCBsb25nKSBrZXJuZWxfdGhyZWFkX3N0YXJ0ZXIgfCBQU1dfQUREUl9BTU9ERTsKKwlyZWdzLmdwcnNbOV0gPSAodW5zaWduZWQgbG9uZykgZm47CisJcmVncy5ncHJzWzEwXSA9ICh1bnNpZ25lZCBsb25nKSBhcmc7CisJcmVncy5ncHJzWzExXSA9ICh1bnNpZ25lZCBsb25nKSBkb19leGl0OworCXJlZ3Mub3JpZ19ncHIyID0gLTE7CisKKwkvKiBPaywgY3JlYXRlIHRoZSBuZXcgcHJvY2Vzcy4uICovCisJcmV0dXJuIGRvX2ZvcmsoZmxhZ3MgfCBDTE9ORV9WTSB8IENMT05FX1VOVFJBQ0VELAorCQkgICAgICAgMCwgJnJlZ3MsIDAsIE5VTEwsIE5VTEwpOworfQorCisvKgorICogRnJlZSBjdXJyZW50IHRocmVhZCBkYXRhIHN0cnVjdHVyZXMgZXRjLi4KKyAqLwordm9pZCBleGl0X3RocmVhZCh2b2lkKQoreworfQorCit2b2lkIGZsdXNoX3RocmVhZCh2b2lkKQoreworCWNsZWFyX3VzZWRfbWF0aCgpOworCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjdXJyZW50LCBUSUZfVVNFREZQVSk7Cit9CisKK3ZvaWQgcmVsZWFzZV90aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICpkZWFkX3Rhc2spCit7Cit9CisKK2ludCBjb3B5X3RocmVhZChpbnQgbnIsIHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MsIHVuc2lnbmVkIGxvbmcgbmV3X3N0YWNrcCwKKwl1bnNpZ25lZCBsb25nIHVudXNlZCwKKyAgICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICogcCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworICAgICAgICBzdHJ1Y3QgZmFrZV9mcmFtZQorICAgICAgICAgIHsKKwkgICAgc3RydWN0IHN0YWNrX2ZyYW1lIHNmOworICAgICAgICAgICAgc3RydWN0IHB0X3JlZ3MgY2hpbGRyZWdzOworICAgICAgICAgIH0gKmZyYW1lOworCisgICAgICAgIGZyYW1lID0gKChzdHJ1Y3QgZmFrZV9mcmFtZSAqKQorCQkgKFRIUkVBRF9TSVpFICsgKHVuc2lnbmVkIGxvbmcpIHAtPnRocmVhZF9pbmZvKSkgLSAxOworICAgICAgICBwLT50aHJlYWQua3NwID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lOworCS8qIFN0b3JlIGFjY2VzcyByZWdpc3RlcnMgdG8ga2VybmVsIHN0YWNrIG9mIG5ldyBwcm9jZXNzLiAqLworICAgICAgICBmcmFtZS0+Y2hpbGRyZWdzID0gKnJlZ3M7CisJZnJhbWUtPmNoaWxkcmVncy5ncHJzWzJdID0gMDsJLyogY2hpbGQgcmV0dXJucyAwIG9uIGZvcmsuICovCisgICAgICAgIGZyYW1lLT5jaGlsZHJlZ3MuZ3Byc1sxNV0gPSBuZXdfc3RhY2twOworICAgICAgICBmcmFtZS0+c2YuYmFja19jaGFpbiA9IDA7CisKKyAgICAgICAgLyogbmV3IHJldHVybiBwb2ludCBpcyByZXRfZnJvbV9mb3JrICovCisgICAgICAgIGZyYW1lLT5zZi5ncHJzWzhdID0gKHVuc2lnbmVkIGxvbmcpIHJldF9mcm9tX2Zvcms7CisKKyAgICAgICAgLyogZmFrZSByZXR1cm4gc3RhY2sgZm9yIHJlc3VtZSgpLCBkb24ndCBnbyBiYWNrIHRvIHNjaGVkdWxlICovCisgICAgICAgIGZyYW1lLT5zZi5ncHJzWzldID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lOworCisJLyogU2F2ZSBhY2Nlc3MgcmVnaXN0ZXJzIHRvIG5ldyB0aHJlYWQgc3RydWN0dXJlLiAqLworCXNhdmVfYWNjZXNzX3JlZ3MoJnAtPnRocmVhZC5hY3JzWzBdKTsKKworI2lmbmRlZiBDT05GSUdfQVJDSF9TMzkwWAorICAgICAgICAvKgorCSAqIHNhdmUgZnBycyB0byBjdXJyZW50LT50aHJlYWQuZnBfcmVncyB0byBtZXJnZSB0aGVtIHdpdGgKKwkgKiB0aGUgZW11bGF0ZWQgcmVnaXN0ZXJzIGFuZCB0aGVuIGNvcHkgdGhlIHJlc3VsdCB0byB0aGUgY2hpbGQuCisJICovCisJc2F2ZV9mcF9yZWdzKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncyk7CisJbWVtY3B5KCZwLT50aHJlYWQuZnBfcmVncywgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLAorCSAgICAgICBzaXplb2YoczM5MF9mcF9yZWdzKSk7CisgICAgICAgIHAtPnRocmVhZC51c2VyX3NlZyA9IF9fcGEoKHVuc2lnbmVkIGxvbmcpIHAtPm1tLT5wZ2QpIHwgX1NFR01FTlRfVEFCTEU7CisJLyogU2V0IGEgbmV3IFRMUyA/ICAqLworCWlmIChjbG9uZV9mbGFncyAmIENMT05FX1NFVFRMUykKKwkJcC0+dGhyZWFkLmFjcnNbMF0gPSByZWdzLT5ncHJzWzZdOworI2Vsc2UgLyogQ09ORklHX0FSQ0hfUzM5MFggKi8KKwkvKiBTYXZlIHRoZSBmcHUgcmVnaXN0ZXJzIHRvIG5ldyB0aHJlYWQgc3RydWN0dXJlLiAqLworCXNhdmVfZnBfcmVncygmcC0+dGhyZWFkLmZwX3JlZ3MpOworICAgICAgICBwLT50aHJlYWQudXNlcl9zZWcgPSBfX3BhKCh1bnNpZ25lZCBsb25nKSBwLT5tbS0+cGdkKSB8IF9SRUdJT05fVEFCTEU7CisJLyogU2V0IGEgbmV3IFRMUyA/ICAqLworCWlmIChjbG9uZV9mbGFncyAmIENMT05FX1NFVFRMUykgeworCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfMzFCSVQpKSB7CisJCQlwLT50aHJlYWQuYWNyc1swXSA9ICh1bnNpZ25lZCBpbnQpIHJlZ3MtPmdwcnNbNl07CisJCX0gZWxzZSB7CisJCQlwLT50aHJlYWQuYWNyc1swXSA9ICh1bnNpZ25lZCBpbnQpKHJlZ3MtPmdwcnNbNl0gPj4gMzIpOworCQkJcC0+dGhyZWFkLmFjcnNbMV0gPSAodW5zaWduZWQgaW50KSByZWdzLT5ncHJzWzZdOworCQl9CisJfQorI2VuZGlmIC8qIENPTkZJR19BUkNIX1MzOTBYICovCisJLyogc3RhcnQgbmV3IHByb2Nlc3Mgd2l0aCBhcjQgcG9pbnRpbmcgdG8gdGhlIGNvcnJlY3QgYWRkcmVzcyBzcGFjZSAqLworCXAtPnRocmVhZC5tbV9zZWdtZW50ID0gZ2V0X2ZzKCk7CisgICAgICAgIC8qIERvbid0IGNvcHkgZGVidWcgcmVnaXN0ZXJzICovCisgICAgICAgIG1lbXNldCgmcC0+dGhyZWFkLnBlcl9pbmZvLDAsc2l6ZW9mKHAtPnRocmVhZC5wZXJfaW5mbykpOworCisgICAgICAgIHJldHVybiAwOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX2Zvcmsoc3RydWN0IHB0X3JlZ3MgcmVncykKK3sKKwlyZXR1cm4gZG9fZm9yayhTSUdDSExELCByZWdzLmdwcnNbMTVdLCAmcmVncywgMCwgTlVMTCwgTlVMTCk7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfY2xvbmUoc3RydWN0IHB0X3JlZ3MgcmVncykKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFnczsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBuZXdzcDsKKwlpbnQgX191c2VyICpwYXJlbnRfdGlkcHRyLCAqY2hpbGRfdGlkcHRyOworCisgICAgICAgIGNsb25lX2ZsYWdzID0gcmVncy5ncHJzWzNdOworICAgICAgICBuZXdzcCA9IHJlZ3Mub3JpZ19ncHIyOworCXBhcmVudF90aWRwdHIgPSAoaW50IF9fdXNlciAqKSByZWdzLmdwcnNbNF07CisJY2hpbGRfdGlkcHRyID0gKGludCBfX3VzZXIgKikgcmVncy5ncHJzWzVdOworICAgICAgICBpZiAoIW5ld3NwKQorICAgICAgICAgICAgICAgIG5ld3NwID0gcmVncy5ncHJzWzE1XTsKKyAgICAgICAgcmV0dXJuIGRvX2ZvcmsoY2xvbmVfZmxhZ3MsIG5ld3NwLCAmcmVncywgMCwKKwkJICAgICAgIHBhcmVudF90aWRwdHIsIGNoaWxkX3RpZHB0cik7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRyaXZpYWwsIGFuZCBvbiB0aGUgZmFjZSBvZiBpdCBsb29rcyBsaWtlIGl0CisgKiBjb3VsZCBlcXVhbGx5IHdlbGwgYmUgZG9uZSBpbiB1c2VyIG1vZGUuCisgKgorICogTm90IHNvLCBmb3IgcXVpdGUgdW5vYnZpb3VzIHJlYXNvbnMgLSByZWdpc3RlciBwcmVzc3VyZS4KKyAqIEluIHVzZXIgbW9kZSB2Zm9yaygpIGNhbm5vdCBoYXZlIGEgc3RhY2sgZnJhbWUsIGFuZCBpZgorICogZG9uZSBieSBjYWxsaW5nIHRoZSAiY2xvbmUoKSIgc3lzdGVtIGNhbGwgZGlyZWN0bHksIHlvdQorICogZG8gbm90IGhhdmUgZW5vdWdoIGNhbGwtY2xvYmJlcmVkIHJlZ2lzdGVycyB0byBob2xkIGFsbAorICogdGhlIGluZm9ybWF0aW9uIHlvdSBuZWVkLgorICovCithc21saW5rYWdlIGxvbmcgc3lzX3Zmb3JrKHN0cnVjdCBwdF9yZWdzIHJlZ3MpCit7CisJcmV0dXJuIGRvX2ZvcmsoQ0xPTkVfVkZPUksgfCBDTE9ORV9WTSB8IFNJR0NITEQsCisJCSAgICAgICByZWdzLmdwcnNbMTVdLCAmcmVncywgMCwgTlVMTCwgTlVMTCk7Cit9CisKKy8qCisgKiBzeXNfZXhlY3ZlKCkgZXhlY3V0ZXMgYSBuZXcgcHJvZ3JhbS4KKyAqLworYXNtbGlua2FnZSBsb25nIHN5c19leGVjdmUoc3RydWN0IHB0X3JlZ3MgcmVncykKK3sKKyAgICAgICAgaW50IGVycm9yOworICAgICAgICBjaGFyICogZmlsZW5hbWU7CisKKyAgICAgICAgZmlsZW5hbWUgPSBnZXRuYW1lKChjaGFyIF9fdXNlciAqKSByZWdzLm9yaWdfZ3ByMik7CisgICAgICAgIGVycm9yID0gUFRSX0VSUihmaWxlbmFtZSk7CisgICAgICAgIGlmIChJU19FUlIoZmlsZW5hbWUpKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICBlcnJvciA9IGRvX2V4ZWN2ZShmaWxlbmFtZSwgKGNoYXIgX191c2VyICogX191c2VyICopIHJlZ3MuZ3Byc1szXSwKKwkJCSAgKGNoYXIgX191c2VyICogX191c2VyICopIHJlZ3MuZ3Byc1s0XSwgJnJlZ3MpOworCWlmIChlcnJvciA9PSAwKSB7CisJCXRhc2tfbG9jayhjdXJyZW50KTsKKwkJY3VycmVudC0+cHRyYWNlICY9IH5QVF9EVFJBQ0U7CisJCXRhc2tfdW5sb2NrKGN1cnJlbnQpOworCQljdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgPSAwOworCQlpZiAoTUFDSElORV9IQVNfSUVFRSkKKwkJCWFzbSB2b2xhdGlsZSgic2ZwYyAlMCwlMCIgOiA6ICJkIiAoMCkpOworCX0KKyAgICAgICAgcHV0bmFtZShmaWxlbmFtZSk7CitvdXQ6CisgICAgICAgIHJldHVybiBlcnJvcjsKK30KKworCisvKgorICogZmlsbCBpbiB0aGUgRlBVIHN0cnVjdHVyZSBmb3IgYSBjb3JlIGR1bXAuCisgKi8KK2ludCBkdW1wX2ZwdSAoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBzMzkwX2ZwX3JlZ3MgKmZwcmVncykKK3sKKyNpZm5kZWYgQ09ORklHX0FSQ0hfUzM5MFgKKyAgICAgICAgLyoKKwkgKiBzYXZlIGZwcnMgdG8gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MgdG8gbWVyZ2UgdGhlbSB3aXRoCisJICogdGhlIGVtdWxhdGVkIHJlZ2lzdGVycyBhbmQgdGhlbiBjb3B5IHRoZSByZXN1bHQgdG8gdGhlIGR1bXAuCisJICovCisJc2F2ZV9mcF9yZWdzKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncyk7CisJbWVtY3B5KGZwcmVncywgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLCBzaXplb2YoczM5MF9mcF9yZWdzKSk7CisjZWxzZSAvKiBDT05GSUdfQVJDSF9TMzkwWCAqLworCXNhdmVfZnBfcmVncyhmcHJlZ3MpOworI2VuZGlmIC8qIENPTkZJR19BUkNIX1MzOTBYICovCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBmaWxsIGluIHRoZSB1c2VyIHN0cnVjdHVyZSBmb3IgYSBjb3JlIGR1bXAuLgorICovCit2b2lkIGR1bXBfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICogcmVncywgc3RydWN0IHVzZXIgKiBkdW1wKQoreworCisvKiBjaGFuZ2VkIHRoZSBzaXplIGNhbGN1bGF0aW9ucyAtIHNob3VsZCBob3BlZnVsbHkgd29yayBiZXR0ZXIuIGxidCAqLworCWR1bXAtPm1hZ2ljID0gQ01BR0lDOworCWR1bXAtPnN0YXJ0X2NvZGUgPSAwOworCWR1bXAtPnN0YXJ0X3N0YWNrID0gcmVncy0+Z3Byc1sxNV0gJiB+KFBBR0VfU0laRSAtIDEpOworCWR1bXAtPnVfdHNpemUgPSBjdXJyZW50LT5tbS0+ZW5kX2NvZGUgPj4gUEFHRV9TSElGVDsKKwlkdW1wLT51X2RzaXplID0gKGN1cnJlbnQtPm1tLT5icmsgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOworCWR1bXAtPnVfZHNpemUgLT0gZHVtcC0+dV90c2l6ZTsKKwlkdW1wLT51X3NzaXplID0gMDsKKwlpZiAoZHVtcC0+c3RhcnRfc3RhY2sgPCBUQVNLX1NJWkUpCisJCWR1bXAtPnVfc3NpemUgPSAoVEFTS19TSVpFIC0gZHVtcC0+c3RhcnRfc3RhY2spID4+IFBBR0VfU0hJRlQ7CisJbWVtY3B5KCZkdW1wLT5yZWdzLCByZWdzLCBzaXplb2YoczM5MF9yZWdzKSk7CisJZHVtcF9mcHUgKHJlZ3MsICZkdW1wLT5yZWdzLmZwX3JlZ3MpOworCWR1bXAtPnJlZ3MucGVyX2luZm8gPSBjdXJyZW50LT50aHJlYWQucGVyX2luZm87Cit9CisKK3Vuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlzdHJ1Y3Qgc3RhY2tfZnJhbWUgKnNmLCAqbG93LCAqaGlnaDsKKwl1bnNpZ25lZCBsb25nIHJldHVybl9hZGRyZXNzOworCWludCBjb3VudDsKKworCWlmICghcCB8fCBwID09IGN1cnJlbnQgfHwgcC0+c3RhdGUgPT0gVEFTS19SVU5OSU5HIHx8ICFwLT50aHJlYWRfaW5mbykKKwkJcmV0dXJuIDA7CisJbG93ID0gKHN0cnVjdCBzdGFja19mcmFtZSAqKSBwLT50aHJlYWRfaW5mbzsKKwloaWdoID0gKHN0cnVjdCBzdGFja19mcmFtZSAqKQorCQkoKHVuc2lnbmVkIGxvbmcpIHAtPnRocmVhZF9pbmZvICsgVEhSRUFEX1NJWkUpIC0gMTsKKwlzZiA9IChzdHJ1Y3Qgc3RhY2tfZnJhbWUgKikgKHAtPnRocmVhZC5rc3AgJiBQU1dfQUREUl9JTlNOKTsKKwlpZiAoc2YgPD0gbG93IHx8IHNmID4gaGlnaCkKKwkJcmV0dXJuIDA7CisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMTY7IGNvdW50KyspIHsKKwkJc2YgPSAoc3RydWN0IHN0YWNrX2ZyYW1lICopIChzZi0+YmFja19jaGFpbiAmIFBTV19BRERSX0lOU04pOworCQlpZiAoc2YgPD0gbG93IHx8IHNmID4gaGlnaCkKKwkJCXJldHVybiAwOworCQlyZXR1cm5fYWRkcmVzcyA9IHNmLT5ncHJzWzhdICYgUFNXX0FERFJfSU5TTjsKKwkJaWYgKCFpbl9zY2hlZF9mdW5jdGlvbnMocmV0dXJuX2FkZHJlc3MpKQorCQkJcmV0dXJuIHJldHVybl9hZGRyZXNzOworCX0KKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9wcm9maWxlLmMgYi9hcmNoL3MzOTAva2VybmVsL3Byb2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmE3NzdlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9wcm9maWxlLmMKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIGFyY2gvczM5MC9rZXJuZWwvcHJvZmlsZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCBJQk0gQ29ycG9yYXRpb24KKyAqIEF1dGhvcihzKTogVGhvbWFzIFNwYXR6aWVyICh0c3BhdEBkZS5pYm0uY29tKQorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKiByb290X2lycV9kaXI7CisKK3ZvaWQgaW5pdF9pcnFfcHJvYyh2b2lkKQoreworCS8qIGNyZWF0ZSAvcHJvYy9pcnEgKi8KKwlyb290X2lycV9kaXIgPSBwcm9jX21rZGlyKCJpcnEiLCAwKTsKKworCS8qIGNyZWF0ZSAvcHJvYy9pcnEvcHJvZl9jcHVfbWFzayAqLworCWNyZWF0ZV9wcm9mX2NwdV9tYXNrKHJvb3RfaXJxX2Rpcik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDcyMzNjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYwpAQCAtMCwwICsxLDczOCBAQAorLyoKKyAqICBhcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jCisgKgorICogIFMzOTAgdmVyc2lvbgorICogICAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgorICogICAgQXV0aG9yKHMpOiBEZW5pcyBKb3NlcGggQmFycm93IChkamJhcnJvd0BkZS5pYm0uY29tLGJhcnJvd19kakB5YWhvby5jb20pLAorICogICAgICAgICAgICAgICBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pCisgKgorICogIEJhc2VkIG9uIFBvd2VyUEMgdmVyc2lvbiAKKyAqICAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk2IEdhcnkgVGhvbWFzIChnZHRAbGludXhwcGMub3JnKQorICoKKyAqICBEZXJpdmVkIGZyb20gImFyY2gvbTY4ay9rZXJuZWwvcHRyYWNlLmMiCisgKiAgQ29weXJpZ2h0IChDKSAxOTk0IGJ5IEhhbWlzaCBNYWNkb25hbGQKKyAqICBUYWtlbiBmcm9tIGxpbnV4L2tlcm5lbC9wdHJhY2UuYyBhbmQgbW9kaWZpZWQgZm9yIE02ODB4MC4KKyAqICBsaW51eC9rZXJuZWwvcHRyYWNlLmMgaXMgYnkgUm9zcyBCaXJvIDEvMjMvOTIsIGVkaXRlZCBieSBMaW51cyBUb3J2YWxkcworICoKKyAqIE1vZGlmaWVkIGJ5IENvcnQgRG91Z2FuIChjb3J0QGNzLm5tdC5lZHUpIAorICoKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBSRUFETUUubGVnYWwgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mCisgKiB0aGlzIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91c2VyLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgorCisjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmZGVmIENPTkZJR19TMzkwX1NVUFBPUlQKKyNpbmNsdWRlICJjb21wYXRfcHRyYWNlLmgiCisjZW5kaWYKKworc3RhdGljIHZvaWQKK0ZpeFBlclJlZ2lzdGVycyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CisJcGVyX3N0cnVjdCAqcGVyX2luZm87CisKKwlyZWdzID0gX19LU1RLX1BUUkVHUyh0YXNrKTsKKwlwZXJfaW5mbyA9IChwZXJfc3RydWN0ICopICZ0YXNrLT50aHJlYWQucGVyX2luZm87CisJcGVyX2luZm8tPmNvbnRyb2xfcmVncy5iaXRzLmVtX2luc3RydWN0aW9uX2ZldGNoID0KKwkJcGVyX2luZm8tPnNpbmdsZV9zdGVwIHwgcGVyX2luZm8tPmluc3RydWN0aW9uX2ZldGNoOworCQorCWlmIChwZXJfaW5mby0+c2luZ2xlX3N0ZXApIHsKKwkJcGVyX2luZm8tPmNvbnRyb2xfcmVncy5iaXRzLnN0YXJ0aW5nX2FkZHIgPSAwOworI2lmZGVmIENPTkZJR19TMzkwX1NVUFBPUlQKKwkJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMxQklUKSkKKwkJCXBlcl9pbmZvLT5jb250cm9sX3JlZ3MuYml0cy5lbmRpbmdfYWRkciA9IDB4N2ZmZmZmZmZVTDsKKwkJZWxzZQorI2VuZGlmCisJCQlwZXJfaW5mby0+Y29udHJvbF9yZWdzLmJpdHMuZW5kaW5nX2FkZHIgPSBQU1dfQUREUl9JTlNOOworCX0gZWxzZSB7CisJCXBlcl9pbmZvLT5jb250cm9sX3JlZ3MuYml0cy5zdGFydGluZ19hZGRyID0KKwkJCXBlcl9pbmZvLT5zdGFydGluZ19hZGRyOworCQlwZXJfaW5mby0+Y29udHJvbF9yZWdzLmJpdHMuZW5kaW5nX2FkZHIgPQorCQkJcGVyX2luZm8tPmVuZGluZ19hZGRyOworCX0KKwkvKgorCSAqIGlmIGFueSBvZiB0aGUgY29udHJvbCByZWcgdHJhY2luZyBiaXRzIGFyZSBvbiAKKwkgKiB3ZSBzd2l0Y2ggb24gcGVyIGluIHRoZSBwc3cKKwkgKi8KKwlpZiAocGVyX2luZm8tPmNvbnRyb2xfcmVncy53b3Jkcy5jclswXSAmIFBFUl9FTV9NQVNLKQorCQlyZWdzLT5wc3cubWFzayB8PSBQU1dfTUFTS19QRVI7CisJZWxzZQorCQlyZWdzLT5wc3cubWFzayAmPSB+UFNXX01BU0tfUEVSOworCisJaWYgKHBlcl9pbmZvLT5jb250cm9sX3JlZ3MuYml0cy5lbV9zdG9yYWdlX2FsdGVyYXRpb24pCisJCXBlcl9pbmZvLT5jb250cm9sX3JlZ3MuYml0cy5zdG9yYWdlX2FsdF9zcGFjZV9jdGwgPSAxOworCWVsc2UKKwkJcGVyX2luZm8tPmNvbnRyb2xfcmVncy5iaXRzLnN0b3JhZ2VfYWx0X3NwYWNlX2N0bCA9IDA7Cit9CisKK3ZvaWQKK3NldF9zaW5nbGVfc3RlcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJdGFzay0+dGhyZWFkLnBlcl9pbmZvLnNpbmdsZV9zdGVwID0gMTsKKwlGaXhQZXJSZWdpc3RlcnModGFzayk7Cit9CisKK3ZvaWQKK2NsZWFyX3NpbmdsZV9zdGVwKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwl0YXNrLT50aHJlYWQucGVyX2luZm8uc2luZ2xlX3N0ZXAgPSAwOworCUZpeFBlclJlZ2lzdGVycyh0YXNrKTsKK30KKworLyoKKyAqIENhbGxlZCBieSBrZXJuZWwvcHRyYWNlLmMgd2hlbiBkZXRhY2hpbmcuLgorICoKKyAqIE1ha2Ugc3VyZSBzaW5nbGUgc3RlcCBiaXRzIGV0YyBhcmUgbm90IHNldC4KKyAqLwordm9pZAorcHRyYWNlX2Rpc2FibGUoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKK3sKKwkvKiBtYWtlIHN1cmUgdGhlIHNpbmdsZSBzdGVwIGJpdCBpcyBub3Qgc2V0LiAqLworCWNsZWFyX3NpbmdsZV9zdGVwKGNoaWxkKTsKK30KKworI2lmbmRlZiBDT05GSUdfQVJDSF9TMzkwWAorIyBkZWZpbmUgX19BRERSX01BU0sgMworI2Vsc2UKKyMgZGVmaW5lIF9fQUREUl9NQVNLIDcKKyNlbmRpZgorCisvKgorICogUmVhZCB0aGUgd29yZCBhdCBvZmZzZXQgYWRkciBmcm9tIHRoZSB1c2VyIGFyZWEgb2YgYSBwcm9jZXNzLiBUaGUKKyAqIHRyb3VibGUgaGVyZSBpcyB0aGF0IHRoZSBpbmZvcm1hdGlvbiBpcyBsaXR0ZXJlZCBvdmVyIGRpZmZlcmVudAorICogbG9jYXRpb25zLiBUaGUgcHJvY2VzcyByZWdpc3RlcnMgYXJlIGZvdW5kIG9uIHRoZSBrZXJuZWwgc3RhY2ssCisgKiB0aGUgZmxvYXRpbmcgcG9pbnQgc3R1ZmYgYW5kIHRoZSB0cmFjZSBzZXR0aW5ncyBhcmUgc3RvcmVkIGluCisgKiB0aGUgdGFzayBzdHJ1Y3R1cmUuIEluIGFkZGl0aW9uIHRoZSBkaWZmZXJlbnQgc3RydWN0dXJlcyBpbgorICogc3RydWN0IHVzZXIgY29udGFpbiBwYWQgYnl0ZXMgdGhhdCBzaG91bGQgYmUgcmVhZCBhcyB6ZXJvZXMuCisgKiBMb3ZlbHkuLi4KKyAqLworc3RhdGljIGludAorcGVla191c2VyKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGFkZHJfdCBhZGRyLCBhZGRyX3QgZGF0YSkKK3sKKwlzdHJ1Y3QgdXNlciAqZHVtbXkgPSBOVUxMOworCWFkZHJfdCBvZmZzZXQsIHRtcDsKKworCS8qCisJICogU3R1cGlkIGdkYiBwZWVrcy9wb2tlcyB0aGUgYWNjZXNzIHJlZ2lzdGVycyBpbiA2NCBiaXQgd2l0aAorCSAqIGFuIGFsaWdubWVudCBvZiA0LiBQcm9ncmFtbWVycyBmcm9tIGhlbGwuLi4KKwkgKi8KKwlpZiAoKGFkZHIgJiAzKSB8fCBhZGRyID4gc2l6ZW9mKHN0cnVjdCB1c2VyKSAtIF9fQUREUl9NQVNLKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChhZGRyIDwgKGFkZHJfdCkgJmR1bW15LT5yZWdzLmFjcnMpIHsKKwkJLyoKKwkJICogcHN3IGFuZCBncHJzIGFyZSBzdG9yZWQgb24gdGhlIHN0YWNrCisJCSAqLworCQl0bXAgPSAqKGFkZHJfdCAqKSgoYWRkcl90KSAmX19LU1RLX1BUUkVHUyhjaGlsZCktPnBzdyArIGFkZHIpOworCQlpZiAoYWRkciA9PSAoYWRkcl90KSAmZHVtbXktPnJlZ3MucHN3Lm1hc2spCisJCQkvKiBSZW1vdmUgcGVyIGJpdCBmcm9tIHVzZXIgcHN3LiAqLworCQkJdG1wICY9IH5QU1dfTUFTS19QRVI7CisKKwl9IGVsc2UgaWYgKGFkZHIgPCAoYWRkcl90KSAmZHVtbXktPnJlZ3Mub3JpZ19ncHIyKSB7CisJCS8qCisJCSAqIGFjY2VzcyByZWdpc3RlcnMgYXJlIHN0b3JlZCBpbiB0aGUgdGhyZWFkIHN0cnVjdHVyZQorCQkgKi8KKwkJb2Zmc2V0ID0gYWRkciAtIChhZGRyX3QpICZkdW1teS0+cmVncy5hY3JzOworCQl0bXAgPSAqKGFkZHJfdCAqKSgoYWRkcl90KSAmY2hpbGQtPnRocmVhZC5hY3JzICsgb2Zmc2V0KTsKKworCX0gZWxzZSBpZiAoYWRkciA9PSAoYWRkcl90KSAmZHVtbXktPnJlZ3Mub3JpZ19ncHIyKSB7CisJCS8qCisJCSAqIG9yaWdfZ3ByMiBpcyBzdG9yZWQgb24gdGhlIGtlcm5lbCBzdGFjaworCQkgKi8KKwkJdG1wID0gKGFkZHJfdCkgX19LU1RLX1BUUkVHUyhjaGlsZCktPm9yaWdfZ3ByMjsKKworCX0gZWxzZSBpZiAoYWRkciA8IChhZGRyX3QpICgmZHVtbXktPnJlZ3MuZnBfcmVncyArIDEpKSB7CisJCS8qIAorCQkgKiBmbG9hdGluZyBwb2ludCByZWdzLiBhcmUgc3RvcmVkIGluIHRoZSB0aHJlYWQgc3RydWN0dXJlCisJCSAqLworCQlvZmZzZXQgPSBhZGRyIC0gKGFkZHJfdCkgJmR1bW15LT5yZWdzLmZwX3JlZ3M7CisJCXRtcCA9ICooYWRkcl90ICopKChhZGRyX3QpICZjaGlsZC0+dGhyZWFkLmZwX3JlZ3MgKyBvZmZzZXQpOworCisJfSBlbHNlIGlmIChhZGRyIDwgKGFkZHJfdCkgKCZkdW1teS0+cmVncy5wZXJfaW5mbyArIDEpKSB7CisJCS8qCisJCSAqIHBlcl9pbmZvIGlzIGZvdW5kIGluIHRoZSB0aHJlYWQgc3RydWN0dXJlCisJCSAqLworCQlvZmZzZXQgPSBhZGRyIC0gKGFkZHJfdCkgJmR1bW15LT5yZWdzLnBlcl9pbmZvOworCQl0bXAgPSAqKGFkZHJfdCAqKSgoYWRkcl90KSAmY2hpbGQtPnRocmVhZC5wZXJfaW5mbyArIG9mZnNldCk7CisKKwl9IGVsc2UKKwkJdG1wID0gMDsKKworCXJldHVybiBwdXRfdXNlcih0bXAsIChhZGRyX3QgX191c2VyICopIGRhdGEpOworfQorCisvKgorICogV3JpdGUgYSB3b3JkIHRvIHRoZSB1c2VyIGFyZWEgb2YgYSBwcm9jZXNzIGF0IGxvY2F0aW9uIGFkZHIuIFRoaXMKKyAqIG9wZXJhdGlvbiBkb2VzIGhhdmUgYW4gYWRkaXRpb25hbCBwcm9ibGVtIGNvbXBhcmVkIHRvIHBlZWtfdXNlci4KKyAqIFN0b3JlcyB0byB0aGUgcHJvZ3JhbSBzdGF0dXMgd29yZCBhbmQgb24gdGhlIGZsb2F0aW5nIHBvaW50CisgKiBjb250cm9sIHJlZ2lzdGVyIG5lZWRzIHRvIGdldCBjaGVja2VkIGZvciB2YWxpZGl0eS4KKyAqLworc3RhdGljIGludAorcG9rZV91c2VyKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGFkZHJfdCBhZGRyLCBhZGRyX3QgZGF0YSkKK3sKKwlzdHJ1Y3QgdXNlciAqZHVtbXkgPSBOVUxMOworCWFkZHJfdCBvZmZzZXQ7CisKKwkvKgorCSAqIFN0dXBpZCBnZGIgcGVla3MvcG9rZXMgdGhlIGFjY2VzcyByZWdpc3RlcnMgaW4gNjQgYml0IHdpdGgKKwkgKiBhbiBhbGlnbm1lbnQgb2YgNC4gUHJvZ3JhbW1lcnMgZnJvbSBoZWxsIGluZGVlZC4uLgorCSAqLworCWlmICgoYWRkciAmIDMpIHx8IGFkZHIgPiBzaXplb2Yoc3RydWN0IHVzZXIpIC0gX19BRERSX01BU0spCisJCXJldHVybiAtRUlPOworCisJaWYgKGFkZHIgPCAoYWRkcl90KSAmZHVtbXktPnJlZ3MuYWNycykgeworCQkvKgorCQkgKiBwc3cgYW5kIGdwcnMgYXJlIHN0b3JlZCBvbiB0aGUgc3RhY2sKKwkJICovCisJCWlmIChhZGRyID09IChhZGRyX3QpICZkdW1teS0+cmVncy5wc3cubWFzayAmJgorI2lmZGVmIENPTkZJR19TMzkwX1NVUFBPUlQKKwkJICAgIGRhdGEgIT0gUFNXX01BU0tfTUVSR0UoUFNXX1VTRVIzMl9CSVRTLCBkYXRhKSAmJgorI2VuZGlmCisJCSAgICBkYXRhICE9IFBTV19NQVNLX01FUkdFKFBTV19VU0VSX0JJVFMsIGRhdGEpKQorCQkJLyogSW52YWxpZCBwc3cgbWFzay4gKi8KKwkJCXJldHVybiAtRUlOVkFMOworI2lmbmRlZiBDT05GSUdfQVJDSF9TMzkwWAorCQlpZiAoYWRkciA9PSAoYWRkcl90KSAmZHVtbXktPnJlZ3MucHN3LmFkZHIpCisJCQkvKiBJJ2QgbGlrZSB0byByZWplY3QgYWRkcmVzc2VzIHdpdGhvdXQgdGhlCisJCQkgICBoaWdoIG9yZGVyIGJpdCBidXQgb2xkZXIgZ2RiJ3MgcmVseSBvbiBpdCAqLworCQkJZGF0YSB8PSBQU1dfQUREUl9BTU9ERTsKKyNlbmRpZgorCQkqKGFkZHJfdCAqKSgoYWRkcl90KSAmX19LU1RLX1BUUkVHUyhjaGlsZCktPnBzdyArIGFkZHIpID0gZGF0YTsKKworCX0gZWxzZSBpZiAoYWRkciA8IChhZGRyX3QpICgmZHVtbXktPnJlZ3Mub3JpZ19ncHIyKSkgeworCQkvKgorCQkgKiBhY2Nlc3MgcmVnaXN0ZXJzIGFyZSBzdG9yZWQgaW4gdGhlIHRocmVhZCBzdHJ1Y3R1cmUKKwkJICovCisJCW9mZnNldCA9IGFkZHIgLSAoYWRkcl90KSAmZHVtbXktPnJlZ3MuYWNyczsKKwkJKihhZGRyX3QgKikoKGFkZHJfdCkgJmNoaWxkLT50aHJlYWQuYWNycyArIG9mZnNldCkgPSBkYXRhOworCisJfSBlbHNlIGlmIChhZGRyID09IChhZGRyX3QpICZkdW1teS0+cmVncy5vcmlnX2dwcjIpIHsKKwkJLyoKKwkJICogb3JpZ19ncHIyIGlzIHN0b3JlZCBvbiB0aGUga2VybmVsIHN0YWNrCisJCSAqLworCQlfX0tTVEtfUFRSRUdTKGNoaWxkKS0+b3JpZ19ncHIyID0gZGF0YTsKKworCX0gZWxzZSBpZiAoYWRkciA8IChhZGRyX3QpICgmZHVtbXktPnJlZ3MuZnBfcmVncyArIDEpKSB7CisJCS8qCisJCSAqIGZsb2F0aW5nIHBvaW50IHJlZ3MuIGFyZSBzdG9yZWQgaW4gdGhlIHRocmVhZCBzdHJ1Y3R1cmUKKwkJICovCisJCWlmIChhZGRyID09IChhZGRyX3QpICZkdW1teS0+cmVncy5mcF9yZWdzLmZwYyAmJgorCQkgICAgKGRhdGEgJiB+RlBDX1ZBTElEX01BU0spICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJb2Zmc2V0ID0gYWRkciAtIChhZGRyX3QpICZkdW1teS0+cmVncy5mcF9yZWdzOworCQkqKGFkZHJfdCAqKSgoYWRkcl90KSAmY2hpbGQtPnRocmVhZC5mcF9yZWdzICsgb2Zmc2V0KSA9IGRhdGE7CisKKwl9IGVsc2UgaWYgKGFkZHIgPCAoYWRkcl90KSAoJmR1bW15LT5yZWdzLnBlcl9pbmZvICsgMSkpIHsKKwkJLyoKKwkJICogcGVyX2luZm8gaXMgZm91bmQgaW4gdGhlIHRocmVhZCBzdHJ1Y3R1cmUgCisJCSAqLworCQlvZmZzZXQgPSBhZGRyIC0gKGFkZHJfdCkgJmR1bW15LT5yZWdzLnBlcl9pbmZvOworCQkqKGFkZHJfdCAqKSgoYWRkcl90KSAmY2hpbGQtPnRocmVhZC5wZXJfaW5mbyArIG9mZnNldCkgPSBkYXRhOworCisJfQorCisJRml4UGVyUmVnaXN0ZXJzKGNoaWxkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZG9fcHRyYWNlX25vcm1hbChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIHJlcXVlc3QsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCXB0cmFjZV9hcmVhIHBhcmVhOyAKKwlpbnQgY29waWVkLCByZXQ7CisKKwlzd2l0Y2ggKHJlcXVlc3QpIHsKKwljYXNlIFBUUkFDRV9QRUVLVEVYVDoKKwljYXNlIFBUUkFDRV9QRUVLREFUQToKKwkJLyogUmVtb3ZlIGhpZ2ggb3JkZXIgYml0IGZyb20gYWRkcmVzcyAob25seSBmb3IgMzEgYml0KS4gKi8KKwkJYWRkciAmPSBQU1dfQUREUl9JTlNOOworCQkvKiByZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KKwkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKKwkJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKKwkJCXJldHVybiAtRUlPOworCQlyZXR1cm4gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGF0YSk7CisKKwljYXNlIFBUUkFDRV9QRUVLVVNSOgorCQkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KKwkJcmV0dXJuIHBlZWtfdXNlcihjaGlsZCwgYWRkciwgZGF0YSk7CisKKwljYXNlIFBUUkFDRV9QT0tFVEVYVDoKKwljYXNlIFBUUkFDRV9QT0tFREFUQToKKwkJLyogUmVtb3ZlIGhpZ2ggb3JkZXIgYml0IGZyb20gYWRkcmVzcyAob25seSBmb3IgMzEgYml0KS4gKi8KKwkJYWRkciAmPSBQU1dfQUREUl9JTlNOOworCQkvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLworCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwxKTsKKwkJaWYgKGNvcGllZCAhPSBzaXplb2YoZGF0YSkpCisJCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFBUUkFDRV9QT0tFVVNSOgorCQkvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KKwkJcmV0dXJuIHBva2VfdXNlcihjaGlsZCwgYWRkciwgZGF0YSk7CisKKwljYXNlIFBUUkFDRV9QRUVLVVNSX0FSRUE6CisJY2FzZSBQVFJBQ0VfUE9LRVVTUl9BUkVBOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnBhcmVhLCAodm9pZCBfX3VzZXIgKikgYWRkciwKKwkJCQkJCQlzaXplb2YocGFyZWEpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlhZGRyID0gcGFyZWEua2VybmVsX2FkZHI7CisJCWRhdGEgPSBwYXJlYS5wcm9jZXNzX2FkZHI7CisJCWNvcGllZCA9IDA7CisJCXdoaWxlIChjb3BpZWQgPCBwYXJlYS5sZW4pIHsKKwkJCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9QRUVLVVNSX0FSRUEpCisJCQkJcmV0ID0gcGVla191c2VyKGNoaWxkLCBhZGRyLCBkYXRhKTsKKwkJCWVsc2UgeworCQkJCWFkZHJfdCB0bXA7CisJCQkJaWYgKGdldF91c2VyICh0bXAsIChhZGRyX3QgX191c2VyICopIGRhdGEpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlyZXQgPSBwb2tlX3VzZXIoY2hpbGQsIGFkZHIsIHRtcCk7CisJCQl9CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCQlhZGRyICs9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwkJCWRhdGEgKz0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCQkJY29waWVkICs9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHB0cmFjZV9yZXF1ZXN0KGNoaWxkLCByZXF1ZXN0LCBhZGRyLCBkYXRhKTsKK30KKworI2lmZGVmIENPTkZJR19TMzkwX1NVUFBPUlQKKy8qCisgKiBOb3cgdGhlIGZ1biBwYXJ0IHN0YXJ0cy4uLiBhIDMxIGJpdCBwcm9ncmFtIHJ1bm5pbmcgaW4gdGhlCisgKiAzMSBiaXQgZW11bGF0aW9uIHRyYWNpbmcgYW5vdGhlciBwcm9ncmFtLiBQVFJBQ0VfUEVFS1RFWFQsCisgKiBQVFJBQ0VfUEVFS0RBVEEsIFBUUkFDRV9QT0tFVEVYVCBhbmQgUFRSQUNFX1BPS0VEQVRBIGFyZSBlYXN5CisgKiB0byBoYW5kbGUsIHRoZSBkaWZmZXJlbmNlIHRvIHRoZSA2NCBiaXQgdmVyc2lvbnMgb2YgdGhlIHJlcXVlc3RzCisgKiBpcyB0aGF0IHRoZSBhY2Nlc3MgaXMgZG9uZSBpbiBtdWx0aXBsZXMgb2YgNCBieXRlIGluc3RlYWQgb2YKKyAqIDggYnl0ZXMgKHNpemVvZih1bnNpZ25lZCBsb25nKSBvbiAzMS82NCBiaXQpLgorICogVGhlIHVnbHkgcGFydCBhcmUgUFRSQUNFX1BFRUtVU1IsIFBUUkFDRV9QRUVLVVNSX0FSRUEsCisgKiBQVFJBQ0VfUE9LRVVTUiBhbmQgUFRSQUNFX1BPS0VVU1JfQVJFQS4gSWYgdGhlIHRyYWNlZCBwcm9ncmFtCisgKiBpcyBhIDMxIGJpdCBwcm9ncmFtIHRvbywgdGhlIGNvbnRlbnQgb2Ygc3RydWN0IHVzZXIgY2FuIGJlCisgKiBlbXVsYXRlZC4gQSAzMSBiaXQgcHJvZ3JhbSBwZWVraW5nIGludG8gdGhlIHN0cnVjdCB1c2VyIG9mCisgKiBhIDY0IGJpdCBwcm9ncmFtIGlzIGEgbm8tbm8uCisgKi8KKworLyoKKyAqIFNhbWUgYXMgcGVla191c2VyIGJ1dCBmb3IgYSAzMSBiaXQgcHJvZ3JhbS4KKyAqLworc3RhdGljIGludAorcGVla191c2VyX2VtdTMxKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGFkZHJfdCBhZGRyLCBhZGRyX3QgZGF0YSkKK3sKKwlzdHJ1Y3QgdXNlcjMyICpkdW1teTMyID0gTlVMTDsKKwlwZXJfc3RydWN0MzIgKmR1bW15X3BlcjMyID0gTlVMTDsKKwlhZGRyX3Qgb2Zmc2V0OworCV9fdTMyIHRtcDsKKworCWlmICghdGVzdF90aHJlYWRfZmxhZyhUSUZfMzFCSVQpIHx8CisJICAgIChhZGRyICYgMykgfHwgYWRkciA+IHNpemVvZihzdHJ1Y3QgdXNlcikgLSAzKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChhZGRyIDwgKGFkZHJfdCkgJmR1bW15MzItPnJlZ3MuYWNycykgeworCQkvKgorCQkgKiBwc3cgYW5kIGdwcnMgYXJlIHN0b3JlZCBvbiB0aGUgc3RhY2sKKwkJICovCisJCWlmIChhZGRyID09IChhZGRyX3QpICZkdW1teTMyLT5yZWdzLnBzdy5tYXNrKSB7CisJCQkvKiBGYWtlIGEgMzEgYml0IHBzdyBtYXNrLiAqLworCQkJdG1wID0gKF9fdTMyKShfX0tTVEtfUFRSRUdTKGNoaWxkKS0+cHN3Lm1hc2sgPj4gMzIpOworCQkJdG1wID0gUFNXMzJfTUFTS19NRVJHRShQU1czMl9VU0VSX0JJVFMsIHRtcCk7CisJCX0gZWxzZSBpZiAoYWRkciA9PSAoYWRkcl90KSAmZHVtbXkzMi0+cmVncy5wc3cuYWRkcikgeworCQkJLyogRmFrZSBhIDMxIGJpdCBwc3cgYWRkcmVzcy4gKi8KKwkJCXRtcCA9IChfX3UzMikgX19LU1RLX1BUUkVHUyhjaGlsZCktPnBzdy5hZGRyIHwKKwkJCQlQU1czMl9BRERSX0FNT0RFMzE7CisJCX0gZWxzZSB7CisJCQkvKiBncHIgMC0xNSAqLworCQkJdG1wID0gKihfX3UzMiAqKSgoYWRkcl90KSAmX19LU1RLX1BUUkVHUyhjaGlsZCktPnBzdyArCisJCQkJCSBhZGRyKjIgKyA0KTsKKwkJfQorCX0gZWxzZSBpZiAoYWRkciA8IChhZGRyX3QpICgmZHVtbXkzMi0+cmVncy5vcmlnX2dwcjIpKSB7CisJCS8qCisJCSAqIGFjY2VzcyByZWdpc3RlcnMgYXJlIHN0b3JlZCBpbiB0aGUgdGhyZWFkIHN0cnVjdHVyZQorCQkgKi8KKwkJb2Zmc2V0ID0gYWRkciAtIChhZGRyX3QpICZkdW1teTMyLT5yZWdzLmFjcnM7CisJCXRtcCA9ICooX191MzIqKSgoYWRkcl90KSAmY2hpbGQtPnRocmVhZC5hY3JzICsgb2Zmc2V0KTsKKworCX0gZWxzZSBpZiAoYWRkciA9PSAoYWRkcl90KSAoJmR1bW15MzItPnJlZ3Mub3JpZ19ncHIyKSkgeworCQkvKgorCQkgKiBvcmlnX2dwcjIgaXMgc3RvcmVkIG9uIHRoZSBrZXJuZWwgc3RhY2sKKwkJICovCisJCXRtcCA9ICooX191MzIqKSgoYWRkcl90KSAmX19LU1RLX1BUUkVHUyhjaGlsZCktPm9yaWdfZ3ByMiArIDQpOworCisJfSBlbHNlIGlmIChhZGRyIDwgKGFkZHJfdCkgKCZkdW1teTMyLT5yZWdzLmZwX3JlZ3MgKyAxKSkgeworCQkvKgorCQkgKiBmbG9hdGluZyBwb2ludCByZWdzLiBhcmUgc3RvcmVkIGluIHRoZSB0aHJlYWQgc3RydWN0dXJlIAorCQkgKi8KKwkgICAgICAgIG9mZnNldCA9IGFkZHIgLSAoYWRkcl90KSAmZHVtbXkzMi0+cmVncy5mcF9yZWdzOworCQl0bXAgPSAqKF9fdTMyICopKChhZGRyX3QpICZjaGlsZC0+dGhyZWFkLmZwX3JlZ3MgKyBvZmZzZXQpOworCisJfSBlbHNlIGlmIChhZGRyIDwgKGFkZHJfdCkgKCZkdW1teTMyLT5yZWdzLnBlcl9pbmZvICsgMSkpIHsKKwkJLyoKKwkJICogcGVyX2luZm8gaXMgZm91bmQgaW4gdGhlIHRocmVhZCBzdHJ1Y3R1cmUKKwkJICovCisJCW9mZnNldCA9IGFkZHIgLSAoYWRkcl90KSAmZHVtbXkzMi0+cmVncy5wZXJfaW5mbzsKKwkJLyogVGhpcyBpcyBtYWdpYy4gU2VlIHBlcl9zdHJ1Y3QgYW5kIHBlcl9zdHJ1Y3QzMi4gKi8KKwkJaWYgKChvZmZzZXQgPj0gKGFkZHJfdCkgJmR1bW15X3BlcjMyLT5jb250cm9sX3JlZ3MgJiYKKwkJICAgICBvZmZzZXQgPCAoYWRkcl90KSAoJmR1bW15X3BlcjMyLT5jb250cm9sX3JlZ3MgKyAxKSkgfHwKKwkJICAgIChvZmZzZXQgPj0gKGFkZHJfdCkgJmR1bW15X3BlcjMyLT5zdGFydGluZ19hZGRyICYmCisJCSAgICAgb2Zmc2V0IDw9IChhZGRyX3QpICZkdW1teV9wZXIzMi0+ZW5kaW5nX2FkZHIpIHx8CisJCSAgICBvZmZzZXQgPT0gKGFkZHJfdCkgJmR1bW15X3BlcjMyLT5sb3djb3JlLndvcmRzLmFkZHJlc3MpCisJCQlvZmZzZXQgPSBvZmZzZXQqMiArIDQ7CisJCWVsc2UKKwkJCW9mZnNldCA9IG9mZnNldCoyOworCQl0bXAgPSAqKF9fdTMyICopKChhZGRyX3QpICZjaGlsZC0+dGhyZWFkLnBlcl9pbmZvICsgb2Zmc2V0KTsKKworCX0gZWxzZQorCQl0bXAgPSAwOworCisJcmV0dXJuIHB1dF91c2VyKHRtcCwgKF9fdTMyIF9fdXNlciAqKSBkYXRhKTsKK30KKworLyoKKyAqIFNhbWUgYXMgcG9rZV91c2VyIGJ1dCBmb3IgYSAzMSBiaXQgcHJvZ3JhbS4KKyAqLworc3RhdGljIGludAorcG9rZV91c2VyX2VtdTMxKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGFkZHJfdCBhZGRyLCBhZGRyX3QgZGF0YSkKK3sKKwlzdHJ1Y3QgdXNlcjMyICpkdW1teTMyID0gTlVMTDsKKwlwZXJfc3RydWN0MzIgKmR1bW15X3BlcjMyID0gTlVMTDsKKwlhZGRyX3Qgb2Zmc2V0OworCV9fdTMyIHRtcDsKKworCWlmICghdGVzdF90aHJlYWRfZmxhZyhUSUZfMzFCSVQpIHx8CisJICAgIChhZGRyICYgMykgfHwgYWRkciA+IHNpemVvZihzdHJ1Y3QgdXNlcjMyKSAtIDMpCisJCXJldHVybiAtRUlPOworCisJdG1wID0gKF9fdTMyKSBkYXRhOworCisJaWYgKGFkZHIgPCAoYWRkcl90KSAmZHVtbXkzMi0+cmVncy5hY3JzKSB7CisJCS8qCisJCSAqIHBzdywgZ3BycywgYWNycyBhbmQgb3JpZ19ncHIyIGFyZSBzdG9yZWQgb24gdGhlIHN0YWNrCisJCSAqLworCQlpZiAoYWRkciA9PSAoYWRkcl90KSAmZHVtbXkzMi0+cmVncy5wc3cubWFzaykgeworCQkJLyogQnVpbGQgYSA2NCBiaXQgcHN3IG1hc2sgZnJvbSAzMSBiaXQgbWFzay4gKi8KKwkJCWlmICh0bXAgIT0gUFNXMzJfTUFTS19NRVJHRShQU1czMl9VU0VSX0JJVFMsIHRtcCkpCisJCQkJLyogSW52YWxpZCBwc3cgbWFzay4gKi8KKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCV9fS1NUS19QVFJFR1MoY2hpbGQpLT5wc3cubWFzayA9CisJCQkJUFNXX01BU0tfTUVSR0UoUFNXX1VTRVIzMl9CSVRTLCAoX191NjQpIHRtcCA8PCAzMik7CisJCX0gZWxzZSBpZiAoYWRkciA9PSAoYWRkcl90KSAmZHVtbXkzMi0+cmVncy5wc3cuYWRkcikgeworCQkJLyogQnVpbGQgYSA2NCBiaXQgcHN3IGFkZHJlc3MgZnJvbSAzMSBiaXQgYWRkcmVzcy4gKi8KKwkJCV9fS1NUS19QVFJFR1MoY2hpbGQpLT5wc3cuYWRkciA9IAorCQkJCShfX3U2NCkgdG1wICYgUFNXMzJfQUREUl9JTlNOOworCQl9IGVsc2UgeworCQkJLyogZ3ByIDAtMTUgKi8KKwkJCSooX191MzIqKSgoYWRkcl90KSAmX19LU1RLX1BUUkVHUyhjaGlsZCktPnBzdworCQkJCSAgKyBhZGRyKjIgKyA0KSA9IHRtcDsKKwkJfQorCX0gZWxzZSBpZiAoYWRkciA8IChhZGRyX3QpICgmZHVtbXkzMi0+cmVncy5vcmlnX2dwcjIpKSB7CisJCS8qCisJCSAqIGFjY2VzcyByZWdpc3RlcnMgYXJlIHN0b3JlZCBpbiB0aGUgdGhyZWFkIHN0cnVjdHVyZQorCQkgKi8KKwkJb2Zmc2V0ID0gYWRkciAtIChhZGRyX3QpICZkdW1teTMyLT5yZWdzLmFjcnM7CisJCSooX191MzIqKSgoYWRkcl90KSAmY2hpbGQtPnRocmVhZC5hY3JzICsgb2Zmc2V0KSA9IHRtcDsKKworCX0gZWxzZSBpZiAoYWRkciA9PSAoYWRkcl90KSAoJmR1bW15MzItPnJlZ3Mub3JpZ19ncHIyKSkgeworCQkvKgorCQkgKiBvcmlnX2dwcjIgaXMgc3RvcmVkIG9uIHRoZSBrZXJuZWwgc3RhY2sKKwkJICovCisJCSooX191MzIqKSgoYWRkcl90KSAmX19LU1RLX1BUUkVHUyhjaGlsZCktPm9yaWdfZ3ByMiArIDQpID0gdG1wOworCisJfSBlbHNlIGlmIChhZGRyIDwgKGFkZHJfdCkgKCZkdW1teTMyLT5yZWdzLmZwX3JlZ3MgKyAxKSkgeworCQkvKgorCQkgKiBmbG9hdGluZyBwb2ludCByZWdzLiBhcmUgc3RvcmVkIGluIHRoZSB0aHJlYWQgc3RydWN0dXJlIAorCQkgKi8KKwkJaWYgKGFkZHIgPT0gKGFkZHJfdCkgJmR1bW15MzItPnJlZ3MuZnBfcmVncy5mcGMgJiYKKwkJICAgICh0bXAgJiB+RlBDX1ZBTElEX01BU0spICE9IDApCisJCQkvKiBJbnZhbGlkIGZsb2F0aW5nIHBvaW50IGNvbnRyb2wuICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkgICAgICAgIG9mZnNldCA9IGFkZHIgLSAoYWRkcl90KSAmZHVtbXkzMi0+cmVncy5mcF9yZWdzOworCQkqKF9fdTMyICopKChhZGRyX3QpICZjaGlsZC0+dGhyZWFkLmZwX3JlZ3MgKyBvZmZzZXQpID0gdG1wOworCisJfSBlbHNlIGlmIChhZGRyIDwgKGFkZHJfdCkgKCZkdW1teTMyLT5yZWdzLnBlcl9pbmZvICsgMSkpIHsKKwkJLyoKKwkJICogcGVyX2luZm8gaXMgZm91bmQgaW4gdGhlIHRocmVhZCBzdHJ1Y3R1cmUuCisJCSAqLworCQlvZmZzZXQgPSBhZGRyIC0gKGFkZHJfdCkgJmR1bW15MzItPnJlZ3MucGVyX2luZm87CisJCS8qCisJCSAqIFRoaXMgaXMgbWFnaWMuIFNlZSBwZXJfc3RydWN0IGFuZCBwZXJfc3RydWN0MzIuCisJCSAqIEJ5IGluY2lkZW50IHRoZSBvZmZzZXRzIGluIHBlcl9zdHJ1Y3QgYXJlIGV4YWN0bHkKKwkJICogdHdpY2UgdGhlIG9mZnNldHMgaW4gcGVyX3N0cnVjdDMyIGZvciBhbGwgZmllbGRzLgorCQkgKiBUaGUgOCBieXRlIGZpZWxkcyBuZWVkIHNwZWNpYWwgaGFuZGxpbmcgdGhvdWdoLAorCQkgKiBiZWNhdXNlIHRoZSBzZWNvbmQgaGFsZiAoYnl0ZXMgNC03KSBpcyBuZWVkZWQgYW5kCisJCSAqIG5vdCB0aGUgZmlyc3QgaGFsZi4KKwkJICovCisJCWlmICgob2Zmc2V0ID49IChhZGRyX3QpICZkdW1teV9wZXIzMi0+Y29udHJvbF9yZWdzICYmCisJCSAgICAgb2Zmc2V0IDwgKGFkZHJfdCkgKCZkdW1teV9wZXIzMi0+Y29udHJvbF9yZWdzICsgMSkpIHx8CisJCSAgICAob2Zmc2V0ID49IChhZGRyX3QpICZkdW1teV9wZXIzMi0+c3RhcnRpbmdfYWRkciAmJgorCQkgICAgIG9mZnNldCA8PSAoYWRkcl90KSAmZHVtbXlfcGVyMzItPmVuZGluZ19hZGRyKSB8fAorCQkgICAgb2Zmc2V0ID09IChhZGRyX3QpICZkdW1teV9wZXIzMi0+bG93Y29yZS53b3Jkcy5hZGRyZXNzKQorCQkJb2Zmc2V0ID0gb2Zmc2V0KjIgKyA0OworCQllbHNlCisJCQlvZmZzZXQgPSBvZmZzZXQqMjsKKwkJKihfX3UzMiAqKSgoYWRkcl90KSAmY2hpbGQtPnRocmVhZC5wZXJfaW5mbyArIG9mZnNldCkgPSB0bXA7CisKKwl9CisKKwlGaXhQZXJSZWdpc3RlcnMoY2hpbGQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citkb19wdHJhY2VfZW11MzEoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyByZXF1ZXN0LCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOyAgLyogNCBieXRlcyAhISAqLworCXB0cmFjZV9hcmVhX2VtdTMxIHBhcmVhOyAKKwlpbnQgY29waWVkLCByZXQ7CisKKwlzd2l0Y2ggKHJlcXVlc3QpIHsKKwljYXNlIFBUUkFDRV9QRUVLVEVYVDoKKwljYXNlIFBUUkFDRV9QRUVLREFUQToKKwkJLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCisJCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7CisJCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCisJCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIHB1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKikgZGF0YSk7CisKKwljYXNlIFBUUkFDRV9QRUVLVVNSOgorCQkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KKwkJcmV0dXJuIHBlZWtfdXNlcl9lbXUzMShjaGlsZCwgYWRkciwgZGF0YSk7CisKKwljYXNlIFBUUkFDRV9QT0tFVEVYVDoKKwljYXNlIFBUUkFDRV9QT0tFREFUQToKKwkJLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KKwkJdG1wID0gZGF0YTsKKwkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAxKTsKKwkJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKKwkJCXJldHVybiAtRUlPOworCQlyZXR1cm4gMDsKKworCWNhc2UgUFRSQUNFX1BPS0VVU1I6CisJCS8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYSAqLworCQlyZXR1cm4gcG9rZV91c2VyX2VtdTMxKGNoaWxkLCBhZGRyLCBkYXRhKTsKKworCWNhc2UgUFRSQUNFX1BFRUtVU1JfQVJFQToKKwljYXNlIFBUUkFDRV9QT0tFVVNSX0FSRUE6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcGFyZWEsICh2b2lkIF9fdXNlciAqKSBhZGRyLAorCQkJCQkJCXNpemVvZihwYXJlYSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWFkZHIgPSBwYXJlYS5rZXJuZWxfYWRkcjsKKwkJZGF0YSA9IHBhcmVhLnByb2Nlc3NfYWRkcjsKKwkJY29waWVkID0gMDsKKwkJd2hpbGUgKGNvcGllZCA8IHBhcmVhLmxlbikgeworCQkJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1BFRUtVU1JfQVJFQSkKKwkJCQlyZXQgPSBwZWVrX3VzZXJfZW11MzEoY2hpbGQsIGFkZHIsIGRhdGEpOworCQkJZWxzZSB7CisJCQkJX191MzIgdG1wOworCQkJCWlmIChnZXRfdXNlciAodG1wLCAoX191MzIgX191c2VyICopIGRhdGEpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlyZXQgPSBwb2tlX3VzZXJfZW11MzEoY2hpbGQsIGFkZHIsIHRtcCk7CisJCQl9CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCQlhZGRyICs9IHNpemVvZih1bnNpZ25lZCBpbnQpOworCQkJZGF0YSArPSBzaXplb2YodW5zaWduZWQgaW50KTsKKwkJCWNvcGllZCArPSBzaXplb2YodW5zaWduZWQgaW50KTsKKwkJfQorCQlyZXR1cm4gMDsKKwljYXNlIFBUUkFDRV9HRVRFVkVOVE1TRzoKKwkJcmV0dXJuIHB1dF91c2VyKChfX3UzMikgY2hpbGQtPnB0cmFjZV9tZXNzYWdlLAorCQkJCSh1bnNpZ25lZCBpbnQgX191c2VyICopIGRhdGEpOworCWNhc2UgUFRSQUNFX0dFVFNJR0lORk86CisJCWlmIChjaGlsZC0+bGFzdF9zaWdpbmZvID09IE5VTEwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGNvcHlfc2lnaW5mb190b191c2VyMzIoKGNvbXBhdF9zaWdpbmZvX3QgX191c2VyICopIGRhdGEsCisJCQkJCSAgICAgIGNoaWxkLT5sYXN0X3NpZ2luZm8pOworCWNhc2UgUFRSQUNFX1NFVFNJR0lORk86CisJCWlmIChjaGlsZC0+bGFzdF9zaWdpbmZvID09IE5VTEwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGNvcHlfc2lnaW5mb19mcm9tX3VzZXIzMihjaGlsZC0+bGFzdF9zaWdpbmZvLAorCQkJCQkJKGNvbXBhdF9zaWdpbmZvX3QgX191c2VyICopIGRhdGEpOworCX0KKwlyZXR1cm4gcHRyYWNlX3JlcXVlc3QoY2hpbGQsIHJlcXVlc3QsIGFkZHIsIGRhdGEpOworfQorI2VuZGlmCisKKyNkZWZpbmUgUFQzMl9JRUVFX0lQIDB4MTNjCisKK3N0YXRpYyBpbnQKK2RvX3B0cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIHJlcXVlc3QsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQoreworCWludCByZXQ7CisKKwlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfQVRUQUNIKQorCQlyZXR1cm4gcHRyYWNlX2F0dGFjaChjaGlsZCk7CisKKwkvKgorCSAqIFNwZWNpYWwgY2FzZXMgdG8gZ2V0L3N0b3JlIHRoZSBpZWVlIGluc3RydWN0aW9ucyBwb2ludGVyLgorCSAqLworCWlmIChjaGlsZCA9PSBjdXJyZW50KSB7CisJCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9QRUVLVVNSICYmIGFkZHIgPT0gUFRfSUVFRV9JUCkKKwkJCXJldHVybiBwZWVrX3VzZXIoY2hpbGQsIGFkZHIsIGRhdGEpOworCQlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfUE9LRVVTUiAmJiBhZGRyID09IFBUX0lFRUVfSVApCisJCQlyZXR1cm4gcG9rZV91c2VyKGNoaWxkLCBhZGRyLCBkYXRhKTsKKyNpZmRlZiBDT05GSUdfUzM5MF9TVVBQT1JUCisJCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9QRUVLVVNSICYmCisJCSAgICBhZGRyID09IFBUMzJfSUVFRV9JUCAmJiB0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMUJJVCkpCisJCQlyZXR1cm4gcGVla191c2VyX2VtdTMxKGNoaWxkLCBhZGRyLCBkYXRhKTsKKwkJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1BPS0VVU1IgJiYKKwkJICAgIGFkZHIgPT0gUFQzMl9JRUVFX0lQICYmIHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMxQklUKSkKKwkJCXJldHVybiBwb2tlX3VzZXJfZW11MzEoY2hpbGQsIGFkZHIsIGRhdGEpOworI2VuZGlmCisJfQorCisJcmV0ID0gcHRyYWNlX2NoZWNrX2F0dGFjaChjaGlsZCwgcmVxdWVzdCA9PSBQVFJBQ0VfS0lMTCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKHJlcXVlc3QpIHsKKwljYXNlIFBUUkFDRV9TWVNDQUxMOgorCQkvKiBjb250aW51ZSBhbmQgc3RvcCBhdCBuZXh0IChyZXR1cm4gZnJvbSkgc3lzY2FsbCAqLworCWNhc2UgUFRSQUNFX0NPTlQ6CisJCS8qIHJlc3RhcnQgYWZ0ZXIgc2lnbmFsLiAqLworCQlpZiAoKHVuc2lnbmVkIGxvbmcpIGRhdGEgPj0gX05TSUcpCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1NZU0NBTEwpCisJCQlzZXRfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU1lTQ0FMTF9UUkFDRSk7CisJCWVsc2UKKwkJCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOworCQljaGlsZC0+ZXhpdF9jb2RlID0gZGF0YTsKKwkJLyogbWFrZSBzdXJlIHRoZSBzaW5nbGUgc3RlcCBiaXQgaXMgbm90IHNldC4gKi8KKwkJY2xlYXJfc2luZ2xlX3N0ZXAoY2hpbGQpOworCQl3YWtlX3VwX3Byb2Nlc3MoY2hpbGQpOworCQlyZXR1cm4gMDsKKworCWNhc2UgUFRSQUNFX0tJTEw6CisJCS8qCisJCSAqIG1ha2UgdGhlIGNoaWxkIGV4aXQuICBCZXN0IEkgY2FuIGRvIGlzIHNlbmQgaXQgYSBzaWdraWxsLiAKKwkJICogcGVyaGFwcyBpdCBzaG91bGQgYmUgcHV0IGluIHRoZSBzdGF0dXMgdGhhdCBpdCB3YW50cyB0byAKKwkJICogZXhpdC4KKwkJICovCisJCWlmIChjaGlsZC0+ZXhpdF9zdGF0ZSA9PSBFWElUX1pPTUJJRSkgLyogYWxyZWFkeSBkZWFkICovCisJCQlyZXR1cm4gMDsKKwkJY2hpbGQtPmV4aXRfY29kZSA9IFNJR0tJTEw7CisJCS8qIG1ha2Ugc3VyZSB0aGUgc2luZ2xlIHN0ZXAgYml0IGlzIG5vdCBzZXQuICovCisJCWNsZWFyX3NpbmdsZV9zdGVwKGNoaWxkKTsKKwkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFBUUkFDRV9TSU5HTEVTVEVQOgorCQkvKiBzZXQgdGhlIHRyYXAgZmxhZy4gKi8KKwkJaWYgKCh1bnNpZ25lZCBsb25nKSBkYXRhID49IF9OU0lHKQorCQkJcmV0dXJuIC1FSU87CisJCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOworCQljaGlsZC0+ZXhpdF9jb2RlID0gZGF0YTsKKwkJaWYgKGRhdGEpCisJCQlzZXRfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU0lOR0xFX1NURVApOworCQllbHNlCisJCQlzZXRfc2luZ2xlX3N0ZXAoY2hpbGQpOworCQkvKiBnaXZlIGl0IGEgY2hhbmNlIHRvIHJ1bi4gKi8KKwkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFBUUkFDRV9ERVRBQ0g6CisJCS8qIGRldGFjaCBhIHByb2Nlc3MgdGhhdCB3YXMgYXR0YWNoZWQuICovCisJCXJldHVybiBwdHJhY2VfZGV0YWNoKGNoaWxkLCBkYXRhKTsKKworCisJLyogRG8gcmVxdWVzdHMgdGhhdCBkaWZmZXIgZm9yIDMxLzY0IGJpdCAqLworCWRlZmF1bHQ6CisjaWZkZWYgQ09ORklHX1MzOTBfU1VQUE9SVAorCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfMzFCSVQpKQorCQkJcmV0dXJuIGRvX3B0cmFjZV9lbXUzMShjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7CisjZW5kaWYKKwkJcmV0dXJuIGRvX3B0cmFjZV9ub3JtYWwoY2hpbGQsIHJlcXVlc3QsIGFkZHIsIGRhdGEpOworCX0KKwkvKiBOb3QgcmVhY2hlZC4gICovCisJcmV0dXJuIC1FSU87Cit9CisKK2FzbWxpbmthZ2UgbG9uZworc3lzX3B0cmFjZShsb25nIHJlcXVlc3QsIGxvbmcgcGlkLCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkOworCWludCByZXQ7CisKKwlsb2NrX2tlcm5lbCgpOworCisJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1RSQUNFTUUpIHsKKwkJLyogYXJlIHdlIGFscmVhZHkgYmVpbmcgdHJhY2VkPyAqLworCQlyZXQgPSAtRVBFUk07CisJCWlmIChjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKQorCQkJZ290byBvdXQ7CisJCXJldCA9IHNlY3VyaXR5X3B0cmFjZShjdXJyZW50LT5wYXJlbnQsIGN1cnJlbnQpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJCS8qIHNldCB0aGUgcHRyYWNlIGJpdCBpbiB0aGUgcHJvY2VzcyBmbGFncy4gKi8KKwkJY3VycmVudC0+cHRyYWNlIHw9IFBUX1BUUkFDRUQ7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IC1FUEVSTTsKKwlpZiAocGlkID09IDEpCQkvKiB5b3UgbWF5IG5vdCBtZXNzIHdpdGggaW5pdCAqLworCQlnb3RvIG91dDsKKworCXJldCA9IC1FU1JDSDsKKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCWNoaWxkID0gZmluZF90YXNrX2J5X3BpZChwaWQpOworCWlmIChjaGlsZCkKKwkJZ2V0X3Rhc2tfc3RydWN0KGNoaWxkKTsKKwlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJaWYgKCFjaGlsZCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBkb19wdHJhY2UoY2hpbGQsIHJlcXVlc3QsIGFkZHIsIGRhdGEpOworCisJcHV0X3Rhc2tfc3RydWN0KGNoaWxkKTsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KKworYXNtbGlua2FnZSB2b2lkCitzeXNjYWxsX3RyYWNlKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgZW50cnlleGl0KQoreworCWlmICh1bmxpa2VseShjdXJyZW50LT5hdWRpdF9jb250ZXh0KSkgeworCQlpZiAoIWVudHJ5ZXhpdCkKKwkJCWF1ZGl0X3N5c2NhbGxfZW50cnkoY3VycmVudCwgcmVncy0+Z3Byc1syXSwKKwkJCQkJICAgIHJlZ3MtPm9yaWdfZ3ByMiwgcmVncy0+Z3Byc1szXSwKKwkJCQkJICAgIHJlZ3MtPmdwcnNbNF0sIHJlZ3MtPmdwcnNbNV0pOworCQllbHNlCisJCQlhdWRpdF9zeXNjYWxsX2V4aXQoY3VycmVudCwgcmVncy0+Z3Byc1syXSk7CisJfQorCWlmICghdGVzdF90aHJlYWRfZmxhZyhUSUZfU1lTQ0FMTF9UUkFDRSkpCisJCXJldHVybjsKKwlpZiAoIShjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSkKKwkJcmV0dXJuOworCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCB8ICgoY3VycmVudC0+cHRyYWNlICYgUFRfVFJBQ0VTWVNHT09EKQorCQkJCSA/IDB4ODAgOiAwKSk7CisKKwkvKgorCSAqIHRoaXMgaXNuJ3QgdGhlIHNhbWUgYXMgY29udGludWluZyB3aXRoIGEgc2lnbmFsLCBidXQgaXQgd2lsbCBkbworCSAqIGZvciBub3JtYWwgdXNlLiAgc3RyYWNlIG9ubHkgY29udGludWVzIHdpdGggYSBzaWduYWwgaWYgdGhlCisJICogc3RvcHBpbmcgc2lnbmFsIGlzIG5vdCBTSUdUUkFQLiAgLWJybAorCSAqLworCWlmIChjdXJyZW50LT5leGl0X2NvZGUpIHsKKwkJc2VuZF9zaWcoY3VycmVudC0+ZXhpdF9jb2RlLCBjdXJyZW50LCAxKTsKKwkJY3VycmVudC0+ZXhpdF9jb2RlID0gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3JlaXBsLlMgYi9hcmNoL3MzOTAva2VybmVsL3JlaXBsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU4ZTVhYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvcmVpcGwuUwpAQCAtMCwwICsxLDc4IEBACisvKgorICogIGFyY2gvczM5MC9rZXJuZWwvcmVpcGwuUworICoKKyAqICBTMzkwIHZlcnNpb24KKyAqICAgIENvcHlyaWdodCAoQykgMjAwMCBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwgSUJNIENvcnBvcmF0aW9uCisgKiAgICBBdXRob3Iocyk6IEhvbGdlciBTbW9saW5za2kgKEhvbGdlci5TbW9saW5za2lAZGUuaWJtLmNvbSkKKyAqLworCisjaW5jbHVkZSA8YXNtL2xvd2NvcmUuaD4KKworCQkuZ2xvYmwJZG9fcmVpcGwKK2RvX3JlaXBsOgliYXNyCSVyMTMsMAorLkxwZzA6CQlscHN3CS5MbmV3cHN3LS5McGcwKCVyMTMpCisuTHBnMToJCWxjdGwJJWM2LCVjNiwuTGFsbC0uTHBnMCglcjEzKQorICAgICAgICAgICAgICAgIHN0Y3RsICAgJWMwLCVjMCwuTGN0bHNhdmUtLkxwZzAoJXIxMykKKyAgICAgICAgICAgICAgICBuaSAgICAgIC5MY3Rsc2F2ZS0uTHBnMCglcjEzKSwweGVmCisgICAgICAgICAgICAgICAgbGN0bCAgICAlYzAsJWMwLC5MY3Rsc2F2ZS0uTHBnMCglcjEzKQorICAgICAgICAgICAgICAgIGxyICAgICAgJXIxLCVyMgorICAgICAgICAJbXZjICAgICBfX0xDX1BHTV9ORVdfUFNXKDgpLC5McGNuZXctLkxwZzAoJXIxMykKKyAgICAgICAgICAgICAgICBzdHNjaCAgIC5Mc2NoaWItLkxwZzAoJXIxMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgICAgICAgIG9pICAgICAgLkxzY2hpYis1LS5McGcwKCVyMTMpLDB4ODQgCisuTGVjczogIAl4aSAgICAgIC5Mc2NoaWIrMjctLkxwZzAoJXIxMyksMHgwMSAKKyAgICAgICAgCW1zY2ggICAgLkxzY2hpYi0uTHBnMCglcjEzKSAKKyAgICAgICAgICAgICAgICBsaGkgICAgICVyMCw1CisuTHNzY2g6CQlzc2NoCS5MaXBsb3JiLS5McGcwKCVyMTMpICAgICAgICAgICAKKwkJanoJLkwwMDEKKyAgICAgICAgICAgICAgICBicmN0ICAgICVyMCwuTHNzY2ggIAorCQliYXMJJXIxNCwuTGRpc2FiLS5McGcwKCVyMTMpCisuTDAwMToJCW12YwlfX0xDX0lPX05FV19QU1coOCksLkxpb25ldy0uTHBnMCglcjEzKQkKKy5MdHBpOgkJbHBzdwkuTHdhaXRwc3ctLkxwZzAoJXIxMykgICAgICAgICAgCisuTGNvbnQ6CQljCSVyMSxfX0xDX1NVQkNIQU5ORUxfSUQKKwkJam56CS5MdHBpCisJCWNsYwlfX0xDX0lPX0lOVF9QQVJNKDQpLC5MaXBsb3JiLS5McGcwKCVyMTMpCisJCWpuegkuTHRwaQorCQl0c2NoCS5MaXBsaXJiLS5McGcwKCVyMTMpICAgICAgICAgICAKKwkJdG0JLkxpcGxpcmIrOS0uTHBnMCglcjEzKSwweGJmCisgICAgICAgICAgICAgICAganogICAgICAuTDAwMgorICAgICAgICAgICAgICAgIGJhcyAgICAgJXIxNCwuTGRpc2FiLS5McGcwKCVyMTMpICAgIAorLkwwMDI6CQl0bQkuTGlwbGlyYis4LS5McGcwKCVyMTMpLDB4ZjMgICAgCisgICAgICAgICAgICAgICAganogICAgICAuTDAwMworICAgICAgICAgICAgICAgIGJhcyAgICAgJXIxNCwuTGRpc2FiLS5McGcwKCVyMTMpCQorLkwwMDM6CQlzcHgJLkxudWxsLS5McGcwKCVyMTMpCisJCXN0IAklcjEsX19MQ19TVUJDSEFOTkVMX0lECisgICAgICAgICAgICAgICAgbHBzdyAJMAorCQlzaWdwICAgIDAsMCwwKDYpICAgICAgICAgICAgICAgCisuTGRpc2FiOglzdCAgICAgICVyMTQsLkxkaXNwc3crNC0uTHBnMCglcjEzKQorCQlscHN3CS5MZGlzcHN3LS5McGcwKCVyMTMpCisgICAgICAgICAgICAgICAgLmFsaWduIAk4CisuTGFsbDoJCS5sb25nCTB4ZmYwMDAwMDAKKy5MbnVsbDoJCS5sb25nICAgMHgwMDAwMDAwMAorLkxjdGxzYXZlOiAgICAgIC5sb25nICAgMHgwMDAwMDAwMAorICAgICAgICAgICAgICAgIC5hbGlnbiAJOAorLkxuZXdwc3c6CS5sb25nICAgMHgwMDA4MDAwMCwweDgwMDAwMDAwKy5McGcxCisuTHBjbmV3OiAgCS5sb25nICAgMHgwMDA4MDAwMCwweDgwMDAwMDAwKy5MZWNzCisuTGlvbmV3OgkubG9uZyAgIDB4MDAwODAwMDAsMHg4MDAwMDAwMCsuTGNvbnQKKy5Md2FpdHBzdzoJLmxvbmcJMHgwMjBhMDAwMCwweDAwMDAwMDAwKy5MdHBpCisuTGRpc3BzdzoJLmxvbmcgICAweDAwMGEwMDAwLDB4MDAwMDAwMDAKKy5MaXBsY2N3czoJLmxvbmcgICAweDAyMDAwMDAwLDB4NjAwMDAwMTgKKwkJLmxvbmcgICAweDA4MDAwMDA4LDB4MjAwMDAwMDEKKy5MaXBsb3JiOgkubG9uZwkweDAwNDk1MDRjLDB4MDA0MGZmODAKKwkJLmxvbmcJMHgwMDAwMDAwMCsuTGlwbGNjd3MKKy5Mc2NoaWI6ICAgICAgICAubG9uZyAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMAorCQkubG9uZyAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMAorCQkubG9uZyAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMAorCQkubG9uZyAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMAorCQkubG9uZyAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMAorCQkubG9uZyAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMAorLkxpcGxpcmI6CS5sb25nCTB4MDAwMDAwMDAsMHgwMDAwMDAwMAorCQkubG9uZwkweDAwMDAwMDAwLDB4MDAwMDAwMDAKKwkJLmxvbmcJMHgwMDAwMDAwMCwweDAwMDAwMDAwCisJCS5sb25nCTB4MDAwMDAwMDAsMHgwMDAwMDAwMAorCQkubG9uZwkweDAwMDAwMDAwLDB4MDAwMDAwMDAKKwkJLmxvbmcJMHgwMDAwMDAwMCwweDAwMDAwMDAwCisJCS5sb25nCTB4MDAwMDAwMDAsMHgwMDAwMDAwMAorCQkubG9uZwkweDAwMDAwMDAwLDB4MDAwMDAwMDAKKwkKKworCQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9yZWlwbDY0LlMgYi9hcmNoL3MzOTAva2VybmVsL3JlaXBsNjQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDA5MGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9yZWlwbDY0LlMKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqICBhcmNoL3MzOTAva2VybmVsL3JlaXBsLlMKKyAqCisgKiAgUzM5MCB2ZXJzaW9uCisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDAgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgorICogICAgQXV0aG9yKHMpOiBIb2xnZXIgU21vbGluc2tpIChIb2xnZXIuU21vbGluc2tpQGRlLmlibS5jb20pCisJICAgICAgICAgRGVuaXMgSm9zZXBoIEJhcnJvdyAoZGpiYXJyb3dAZGUuaWJtLmNvbSxiYXJyb3dfZGpAeWFob28uY29tKQorICovCisKKyNpbmNsdWRlIDxhc20vbG93Y29yZS5oPgorCQkuZ2xvYmwJZG9fcmVpcGwKK2RvX3JlaXBsOgliYXNyCSVyMTMsMAorLkxwZzA6CQlscHN3ZSAgIC5MbmV3cHN3LS5McGcwKCVyMTMpCisuTHBnMToJCWxjdGxnCSVjNiwlYzYsLkxhbGwtLkxwZzAoJXIxMykKKyAgICAgICAgICAgICAgICBzdGN0ZyAgICVjMCwlYzAsLkxjdGxzYXZlLS5McGcwKCVyMTMpCisgICAgICAgICAgICAgICAgbmkgICAgICAuTGN0bHNhdmUrNC0uTHBnMCglcjEzKSwweGVmCisgICAgICAgICAgICAgICAgbGN0bGcgICAlYzAsJWMwLC5MY3Rsc2F2ZS0uTHBnMCglcjEzKQorICAgICAgICAgICAgICAgIGxnciAgICAgJXIxLCVyMgorICAgICAgICAJbXZjICAgICBfX0xDX1BHTV9ORVdfUFNXKDE2KSwuTHBjbmV3LS5McGcwKCVyMTMpCisgICAgICAgICAgICAgICAgc3RzY2ggICAuTHNjaGliLS5McGcwKCVyMTMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJICAgICAgICBvaSAgICAgIC5Mc2NoaWIrNS0uTHBnMCglcjEzKSwweDg0IAorLkxlY3M6ICAJeGkgICAgICAuTHNjaGliKzI3LS5McGcwKCVyMTMpLDB4MDEgCisgICAgICAgIAltc2NoICAgIC5Mc2NoaWItLkxwZzAoJXIxMykgCisJICAgICAgICBsZ2hpICAgICVyMCw1CisuTHNzY2g6CQlzc2NoCS5MaXBsb3JiLS5McGcwKCVyMTMpICAgICAgICAgICAKKwkJanoJLkwwMDEKKwkJYnJjdCAgICAlcjAsLkxzc2NoICAgCisJCWJhcwklcjE0LC5MZGlzYWItLkxwZzAoJXIxMykKKy5MMDAxOgkJbXZjCV9fTENfSU9fTkVXX1BTVygxNiksLkxpb25ldy0uTHBnMCglcjEzKQkKKy5MdHBpOgkJbHBzd2UJLkx3YWl0cHN3LS5McGcwKCVyMTMpICAgICAgICAgIAorLkxjb250OgkJYwklcjEsX19MQ19TVUJDSEFOTkVMX0lECisJCWpuegkuTHRwaQorCQljbGMJX19MQ19JT19JTlRfUEFSTSg0KSwuTGlwbG9yYi0uTHBnMCglcjEzKQorCQlqbnoJLkx0cGkKKwkJdHNjaAkuTGlwbGlyYi0uTHBnMCglcjEzKSAgICAgICAgICAgCisJCXRtCS5MaXBsaXJiKzktLkxwZzAoJXIxMyksMHhiZgorICAgICAgICAgICAgICAgIGp6ICAgICAgLkwwMDIKKyAgICAgICAgICAgICAgICBiYXMgICAgICVyMTQsLkxkaXNhYi0uTHBnMCglcjEzKSAgICAKKy5MMDAyOgkJdG0JLkxpcGxpcmIrOC0uTHBnMCglcjEzKSwweGYzICAgIAorICAgICAgICAgICAgICAgIGp6ICAgICAgLkwwMDMKKyAgICAgICAgICAgICAgICBiYXMgICAgICVyMTQsLkxkaXNhYi0uTHBnMCglcjEzKQkKKy5MMDAzOgkJc3B4CS5MbnVsbC0uTHBnMCglcjEzKQorCQlzdCAJJXIxLF9fTENfU1VCQ0hBTk5FTF9JRAorICAgICAgICAgICAgICAgIGxoaSAgICAgJXIxLDAgICAgICAgICAgICAjIG1vZGUgMCA9IGVzYQorICAgICAgICAgICAgICAgIHNsciAgICAgJXIwLCVyMCAgICAgICAgICAjIHNldCBjcHVpZCB0byB6ZXJvCisgICAgICAgICAgICAgICAgc2lncCAgICAlcjEsJXIwLDB4MTIgICAgICMgc3dpdGNoIHRvIGVzYSBtb2RlCisgICAgICAgICAgICAgICAgbHBzdyAJMAorLkxkaXNhYjoJc2xsICAgICVyMTQsMQorCQlzcmwgICAgJXIxNCwxICAgICAgICAgICAgIyBuZWVkIHRvIGtpbGwgaGkgYml0IHRvIGF2b2lkIHNwZWNpZmljYXRpb24gZXhjZXB0aW9ucy4KKwkJc3QgICAgICVyMTQsLkxkaXNwc3crMTItLkxwZzAoJXIxMykKKwkJbHBzd2UJLkxkaXNwc3ctLkxwZzAoJXIxMykKKyAgICAgICAgICAgICAgICAuYWxpZ24gCTgKKy5MYWxsOgkJLnF1YWQJMHgwMDAwMDAwMGZmMDAwMDAwCisuTGN0bHNhdmU6ICAgICAgLnF1YWQgICAweDAwMDAwMDAwMDAwMDAwMDAKKy5MbnVsbDoJCS5sb25nICAgMHgwMDAwMDAwMDAwMDAwMDAwCisgICAgICAgICAgICAgICAgLmFsaWduIAkxNgorLyoKKyAqIFRoZXNlIGFkZHJlc3NlcyBoYXZlIHRvIGJlIDMxIGJpdCBvdGhlcndpc2UKKyAqIHRoZSBzaWdwIHdpbGwgdGhyb3cgYSBzcGVjaWZjYXRpb24gZXhjZXB0aW9uCisgKiB3aGVuIHN3aXRjaGluZyB0byBFU0EgbW9kZSBhcyBiaXQgMzEgYmUgc2V0CisgKiBpbiB0aGUgRVNBIHBzdy4KKyAqIEJpdCAzMSBvZiB0aGUgYWRkcmVzc2VzIGhhcyB0byBiZSAwIGZvciB0aGUKKyAqIDMxYml0IGxwc3dlIGluc3RydWN0aW9uIGEgZmFjdCB0aGV5IGFwcGVhciB0byBoYXZlCisgKiBvbW1pdGVkIGZyb20gdGhlIHBvcC4KKyAqLworLkxuZXdwc3c6CS5xdWFkICAgMHgwMDAwMDAwMDgwMDAwMDAwCisJCS5xdWFkICAgLkxwZzEKKy5McGNuZXc6CS5xdWFkICAgMHgwMDAwMDAwMDgwMDAwMDAwCisJICAJLnF1YWQgICAuTGVjcworLkxpb25ldzoJLnF1YWQgICAweDAwMDAwMDAwODAwMDAwMDAKKwkJLnF1YWQgICAuTGNvbnQKKy5Md2FpdHBzdzoJLnF1YWQJMHgwMjAyMDAwMDgwMDAwMDAwCisJCS5xdWFkICAgLkx0cGkKKy5MZGlzcHN3OgkucXVhZCAgIDB4MDAwMjAwMDA4MDAwMDAwMAorCQkucXVhZCAgIDB4MDAwMDAwMDAwMDAwMDAwMAorLkxpcGxjY3dzOgkubG9uZyAgIDB4MDIwMDAwMDAsMHg2MDAwMDAxOAorCQkubG9uZyAgIDB4MDgwMDAwMDgsMHgyMDAwMDAwMQorLkxpcGxvcmI6CS5sb25nCTB4MDA0OTUwNGMsMHgwMDQwZmY4MAorCQkubG9uZwkweDAwMDAwMDAwKy5MaXBsY2N3cworLkxzY2hpYjogICAgICAgIC5sb25nICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwCisJCS5sb25nICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwCisJCS5sb25nICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwCisJCS5sb25nICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwCisJCS5sb25nICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwCisJCS5sb25nICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwCisuTGlwbGlyYjoJLmxvbmcJMHgwMDAwMDAwMCwweDAwMDAwMDAwCisJCS5sb25nCTB4MDAwMDAwMDAsMHgwMDAwMDAwMAorCQkubG9uZwkweDAwMDAwMDAwLDB4MDAwMDAwMDAKKwkJLmxvbmcJMHgwMDAwMDAwMCwweDAwMDAwMDAwCisJCS5sb25nCTB4MDAwMDAwMDAsMHgwMDAwMDAwMAorCQkubG9uZwkweDAwMDAwMDAwLDB4MDAwMDAwMDAKKwkJLmxvbmcJMHgwMDAwMDAwMCwweDAwMDAwMDAwCisJCS5sb25nCTB4MDAwMDAwMDAsMHgwMDAwMDAwMAorCQorCisJCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3MzOTBfZXh0LmMgYi9hcmNoL3MzOTAva2VybmVsL3MzOTBfZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JkZDM4ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvczM5MF9leHQuYwpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqICBhcmNoL3MzOTAva2VybmVsL3MzOTBfZXh0LmMKKyAqCisgKiAgUzM5MCB2ZXJzaW9uCisgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwgSUJNIENvcnBvcmF0aW9uCisgKiAgICBBdXRob3Iocyk6IEhvbGdlciBTbW9saW5za2kgKEhvbGdlci5TbW9saW5za2lAZGUuaWJtLmNvbSksCisgKiAgICAgICAgICAgICAgIE1hcnRpbiBTY2h3aWRlZnNreSAoc2Nod2lkZWZza3lAZGUuaWJtLmNvbSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGFzbS9sb3djb3JlLmg+CisjaW5jbHVkZSA8YXNtL3MzOTBfZXh0Lmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisvKgorICogU2ltcGxlIGhhc2ggc3RyYXRlZ3k6IGluZGV4ID0gY29kZSAmIDB4ZmY7CisgKiBleHRfaW50X2hhc2hbaW5kZXhdIGlzIHRoZSBzdGFydCBvZiB0aGUgbGlzdCBmb3IgYWxsIGV4dGVybmFsIGludGVycnVwdHMKKyAqIHRoYXQgaGFzaCB0byB0aGlzIGluZGV4LiBXaXRoIHRoZSBjdXJyZW50IHNldCBvZiBleHRlcm5hbCBpbnRlcnJ1cHRzIAorICogKDB4MTIwMiBleHRlcm5hbCBjYWxsLCAweDEwMDQgY3B1IHRpbWVyLCAweDI0MDEgaHdjIGNvbnNvbGUsIDB4NDAwMAorICogaXVjdiBhbmQgMHgyNjAzIHBmYXVsdCkgdGhpcyBpcyBhbHdheXMgdGhlIGZpcnN0IGVsZW1lbnQuIAorICovCitleHRfaW50X2luZm9fdCAqZXh0X2ludF9oYXNoWzI1Nl0gPSB7IDAsIH07CisKK2ludCByZWdpc3Rlcl9leHRlcm5hbF9pbnRlcnJ1cHQoX191MTYgY29kZSwgZXh0X2ludF9oYW5kbGVyX3QgaGFuZGxlcikKK3sKKyAgICAgICAgZXh0X2ludF9pbmZvX3QgKnA7CisgICAgICAgIGludCBpbmRleDsKKworCXAgPSAoZXh0X2ludF9pbmZvX3QgKikga21hbGxvYyhzaXplb2YoZXh0X2ludF9pbmZvX3QpLCBHRlBfQVRPTUlDKTsKKyAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgcC0+Y29kZSA9IGNvZGU7CisgICAgICAgIHAtPmhhbmRsZXIgPSBoYW5kbGVyOworICAgICAgICBpbmRleCA9IGNvZGUgJiAweGZmOworICAgICAgICBwLT5uZXh0ID0gZXh0X2ludF9oYXNoW2luZGV4XTsKKyAgICAgICAgZXh0X2ludF9oYXNoW2luZGV4XSA9IHA7CisgICAgICAgIHJldHVybiAwOworfQorCitpbnQgcmVnaXN0ZXJfZWFybHlfZXh0ZXJuYWxfaW50ZXJydXB0KF9fdTE2IGNvZGUsIGV4dF9pbnRfaGFuZGxlcl90IGhhbmRsZXIsCisJCQkJICAgICAgZXh0X2ludF9pbmZvX3QgKnApCit7CisgICAgICAgIGludCBpbmRleDsKKworICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICBwLT5jb2RlID0gY29kZTsKKyAgICAgICAgcC0+aGFuZGxlciA9IGhhbmRsZXI7CisgICAgICAgIGluZGV4ID0gY29kZSAmIDB4ZmY7CisgICAgICAgIHAtPm5leHQgPSBleHRfaW50X2hhc2hbaW5kZXhdOworICAgICAgICBleHRfaW50X2hhc2hbaW5kZXhdID0gcDsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1bnJlZ2lzdGVyX2V4dGVybmFsX2ludGVycnVwdChfX3UxNiBjb2RlLCBleHRfaW50X2hhbmRsZXJfdCBoYW5kbGVyKQoreworICAgICAgICBleHRfaW50X2luZm9fdCAqcCwgKnE7CisgICAgICAgIGludCBpbmRleDsKKworICAgICAgICBpbmRleCA9IGNvZGUgJiAweGZmOworICAgICAgICBxID0gTlVMTDsKKyAgICAgICAgcCA9IGV4dF9pbnRfaGFzaFtpbmRleF07CisgICAgICAgIHdoaWxlIChwICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAocC0+Y29kZSA9PSBjb2RlICYmIHAtPmhhbmRsZXIgPT0gaGFuZGxlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHEgPSBwOworICAgICAgICAgICAgICAgIHAgPSBwLT5uZXh0OworICAgICAgICB9CisgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgICAgIGlmIChxICE9IE5VTEwpCisgICAgICAgICAgICAgICAgcS0+bmV4dCA9IHAtPm5leHQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBleHRfaW50X2hhc2hbaW5kZXhdID0gcC0+bmV4dDsKKwlrZnJlZShwKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1bnJlZ2lzdGVyX2Vhcmx5X2V4dGVybmFsX2ludGVycnVwdChfX3UxNiBjb2RlLCBleHRfaW50X2hhbmRsZXJfdCBoYW5kbGVyLAorCQkJCQlleHRfaW50X2luZm9fdCAqcCkKK3sKKwlleHRfaW50X2luZm9fdCAqcTsKKwlpbnQgaW5kZXg7CisKKwlpZiAocCA9PSBOVUxMIHx8IHAtPmNvZGUgIT0gY29kZSB8fCBwLT5oYW5kbGVyICE9IGhhbmRsZXIpCisJCXJldHVybiAtRUlOVkFMOworCWluZGV4ID0gY29kZSAmIDB4ZmY7CisJcSA9IGV4dF9pbnRfaGFzaFtpbmRleF07CisJaWYgKHAgIT0gcSkgeworCQl3aGlsZSAocSAhPSBOVUxMKSB7CisJCQlpZiAocS0+bmV4dCA9PSBwKQorCQkJCWJyZWFrOworCQkJcSA9IHEtPm5leHQ7CisJCX0KKwkJaWYgKHEgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PRU5UOworCQlxLT5uZXh0ID0gcC0+bmV4dDsKKwl9IGVsc2UKKwkJZXh0X2ludF9oYXNoW2luZGV4XSA9IHAtPm5leHQ7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZG9fZXh0aW50KHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBzaG9ydCBjb2RlKQoreworICAgICAgICBleHRfaW50X2luZm9fdCAqcDsKKyAgICAgICAgaW50IGluZGV4OworCisJaXJxX2VudGVyKCk7CisJYXNtIHZvbGF0aWxlICgibWMgMCwwIik7CisJaWYgKFMzOTBfbG93Y29yZS5pbnRfY2xvY2sgPj0gUzM5MF9sb3djb3JlLmppZmZ5X3RpbWVyKQorCQkvKioKKwkJICogTWFrZSBzdXJlIHRoYXQgdGhlIGkvbyBpbnRlcnJ1cHQgZGlkIG5vdCAib3ZlcnRha2UiCisJCSAqIHRoZSBsYXN0IEhaIHRpbWVyIGludGVycnVwdC4KKwkJICovCisJCWFjY291bnRfdGlja3MocmVncyk7CisJa3N0YXRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSkuaXJxc1tFWFRFUk5BTF9JTlRFUlJVUFRdKys7CisgICAgICAgIGluZGV4ID0gY29kZSAmIDB4ZmY7CisJZm9yIChwID0gZXh0X2ludF9oYXNoW2luZGV4XTsgcDsgcCA9IHAtPm5leHQpIHsKKwkJaWYgKGxpa2VseShwLT5jb2RlID09IGNvZGUpKSB7CisJCQlpZiAobGlrZWx5KHAtPmhhbmRsZXIpKQorCQkJCXAtPmhhbmRsZXIocmVncywgY29kZSk7CisJCX0KKwl9CisJaXJxX2V4aXQoKTsKK30KKworRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9leHRlcm5hbF9pbnRlcnJ1cHQpOworRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2V4dGVybmFsX2ludGVycnVwdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvczM5MF9rc3ltcy5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zMzkwX2tzeW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmZDZkNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvczM5MF9rc3ltcy5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiAgYXJjaC9zMzkwL2tlcm5lbC9zMzkwX2tzeW1zLmMKKyAqCisgKiAgUzM5MCB2ZXJzaW9uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdodWlkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsMzIuaD4KKyNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxhc20vY3BjbWQuaD4KKyNpbmNsdWRlIDxhc20vZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2lmZGVmIENPTkZJR19JUF9NVUxUSUNBU1QKKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisjZW5kaWYKKworLyoKKyAqIG1lbW9yeSBtYW5hZ2VtZW50CisgKi8KK0VYUE9SVF9TWU1CT0woX29pX2JpdG1hcCk7CitFWFBPUlRfU1lNQk9MKF9uaV9iaXRtYXApOworRVhQT1JUX1NZTUJPTChfemJfZmluZG1hcCk7CitFWFBPUlRfU1lNQk9MKF9zYl9maW5kbWFwKTsKK0VYUE9SVF9TWU1CT0woX19jb3B5X2Zyb21fdXNlcl9hc20pOworRVhQT1JUX1NZTUJPTChfX2NvcHlfdG9fdXNlcl9hc20pOworRVhQT1JUX1NZTUJPTChfX2NvcHlfaW5fdXNlcl9hc20pOworRVhQT1JUX1NZTUJPTChfX2NsZWFyX3VzZXJfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19zdHJuY3B5X2Zyb21fdXNlcl9hc20pOworRVhQT1JUX1NZTUJPTChfX3N0cm5sZW5fdXNlcl9hc20pOworRVhQT1JUX1NZTUJPTChkaWFnMTApOworRVhQT1JUX1NZTUJPTChkZWZhdWx0X3N0b3JhZ2Vfa2V5KTsKKworLyoKKyAqIHNlbWFwaG9yZSBvcHMKKyAqLworRVhQT1JUX1NZTUJPTChfX3VwKTsKK0VYUE9SVF9TWU1CT0woX19kb3duKTsKK0VYUE9SVF9TWU1CT0woX19kb3duX2ludGVycnVwdGlibGUpOworCisvKgorICogYmluZm10X2VsZiBsb2FkZXIgCisgKi8KK2V4dGVybiBpbnQgZHVtcF9mcHUgKHN0cnVjdCBwdF9yZWdzICogcmVncywgczM5MF9mcF9yZWdzICpmcHJlZ3MpOworRVhQT1JUX1NZTUJPTChkdW1wX2ZwdSk7CitFWFBPUlRfU1lNQk9MKG92ZXJmbG93dWlkKTsKK0VYUE9SVF9TWU1CT0wob3ZlcmZsb3dnaWQpOworRVhQT1JUX1NZTUJPTChlbXB0eV96ZXJvX3BhZ2UpOworCisvKgorICogbWlzYy4KKyAqLworRVhQT1JUX1NZTUJPTChtYWNoaW5lX2ZsYWdzKTsKK0VYUE9SVF9TWU1CT0woX191ZGVsYXkpOworRVhQT1JUX1NZTUJPTChrZXJuZWxfdGhyZWFkKTsKK0VYUE9SVF9TWU1CT0woY3N1bV9mb2xkKTsKK0VYUE9SVF9TWU1CT0woY29uc29sZV9tb2RlKTsKK0VYUE9SVF9TWU1CT0woY29uc29sZV9kZXZubyk7CitFWFBPUlRfU1lNQk9MKGNvbnNvbGVfaXJxKTsKK0VYUE9SVF9TWU1CT0woc3lzX3dhaXQ0KTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc2VtYXBob3JlLmMgYi9hcmNoL3MzOTAva2VybmVsL3NlbWFwaG9yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZmI2OTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL3NlbWFwaG9yZS5jCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogIGxpbnV4L2FyY2gvczM5MC9rZXJuZWwvc2VtYXBob3JlLmMKKyAqCisgKiAgUzM5MCB2ZXJzaW9uCisgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCBJQk0gQ29ycG9yYXRpb24KKyAqICAgIEF1dGhvcihzKTogTWFydGluIFNjaHdpZGVmc2t5CisgKgorICogIERlcml2ZWQgZnJvbSAibGludXgvYXJjaC9pMzg2L2tlcm5lbC9zZW1hcGhvcmUuYworICogICAgQ29weXJpZ2h0IChDKSAxOTk5LCBMaW51cyBUb3J2YWxkcworICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKy8qCisgKiBBdG9taWNhbGx5IHVwZGF0ZSBzZW0tPmNvdW50LiBFcXVpdmFsZW50IHRvOgorICogICBvbGRfdmFsID0gc2VtLT5jb3VudC5jb3VudGVyOworICogICBuZXdfdmFsID0gKChvbGRfdmFsID49IDApID8gb2xkX3ZhbCA6IDApICsgaW5jcjsKKyAqICAgc2VtLT5jb3VudC5jb3VudGVyID0gbmV3X3ZhbDsKKyAqICAgcmV0dXJuIG9sZF92YWw7CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fc2VtX3VwZGF0ZV9jb3VudChzdHJ1Y3Qgc2VtYXBob3JlICpzZW0sIGludCBpbmNyKQoreworCWludCBvbGRfdmFsLCBuZXdfdmFsOworCisgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCIgICBsICAgICAlMCwwKCUzKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMDogbHRyICAgJTEsJTBcbiIKKwkJCSAgICAgIiAgIGpoZSAgIDFmXG4iCisJCQkgICAgICIgICBsaGkgICAlMSwwXG4iCisJCQkgICAgICIxOiBhciAgICAlMSwlNFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgY3MgICAgJTAsJTEsMCglMylcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIGpsICAgIDBiXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIj0mZCIgKG9sZF92YWwpLCAiPSZkIiAobmV3X3ZhbCksCisJCQkgICAgICAgIj1tIiAoc2VtLT5jb3VudCkKKwkJCSAgICAgOiAiYSIgKCZzZW0tPmNvdW50KSwgImQiIChpbmNyKSwgIm0iIChzZW0tPmNvdW50KQorCQkJICAgICA6ICJjYyIgKTsKKwlyZXR1cm4gb2xkX3ZhbDsKK30KKworLyoKKyAqIFRoZSBpbmxpbmUgZnVuY3Rpb24gdXAoKSBpbmNyZW1lbnRlZCBjb3VudCBidXQgdGhlIHJlc3VsdAorICogd2FzIDw9IDAuIFRoaXMgaW5kaWNhdGVzIHRoYXQgc29tZSBwcm9jZXNzIGlzIHdhaXRpbmcgb24KKyAqIHRoZSBzZW1hcGhvcmUuIFRoZSBzZW1hcGhvcmUgaXMgZnJlZSBhbmQgd2UnbGwgd2FrZSB0aGUKKyAqIGZpcnN0IHNsZWVwaW5nIHByb2Nlc3MsIHNvIHdlIHNldCBjb3VudCB0byAxIHVubGVzcyBzb21lCisgKiBvdGhlciBjcHUgaGFzIGNhbGxlZCB1cCBpbiB0aGUgbWVhbnRpbWUgaW4gd2hpY2ggY2FzZQorICogd2UganVzdCBpbmNyZW1lbnQgY291bnQgYnkgMS4KKyAqLwordm9pZCBfX3VwKHN0cnVjdCBzZW1hcGhvcmUgKnNlbSkKK3sKKwlfX3NlbV91cGRhdGVfY291bnQoc2VtLCAxKTsKKwl3YWtlX3VwKCZzZW0tPndhaXQpOworfQorCisvKgorICogVGhlIGlubGluZSBmdW5jdGlvbiBkb3duKCkgZGVjcmVtZW50ZWQgY291bnQgYW5kIHRoZSByZXN1bHQKKyAqIHdhcyA8IDAuIFRoZSB3YWl0IGxvb3Agd2lsbCBhdG9taWNhbGx5IHRlc3QgYW5kIHVwZGF0ZSB0aGUKKyAqIHNlbWFwaG9yZSBjb3VudGVyIGZvbGxvd2luZyB0aGUgcnVsZXM6CisgKiAgIGNvdW50ID4gMDogZGVjcmVtZW50IGNvdW50LCB3YWtlIHVwIHF1ZXVlIGFuZCBleGl0LgorICogICBjb3VudCA8PSAwOiBzZXQgY291bnQgdG8gLTEsIGdvIHRvIHNsZWVwLgorICovCit2b2lkIF9fc2NoZWQgX19kb3duKHN0cnVjdCBzZW1hcGhvcmUgKiBzZW0pCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIHRzayk7CisKKwlfX3NldF90YXNrX3N0YXRlKHRzaywgVEFTS19VTklOVEVSUlVQVElCTEUpOworCWFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZSgmc2VtLT53YWl0LCAmd2FpdCk7CisJd2hpbGUgKF9fc2VtX3VwZGF0ZV9jb3VudChzZW0sIC0xKSA8PSAwKSB7CisJCXNjaGVkdWxlKCk7CisJCXNldF90YXNrX3N0YXRlKHRzaywgVEFTS19VTklOVEVSUlVQVElCTEUpOworCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmc2VtLT53YWl0LCAmd2FpdCk7CisJX19zZXRfdGFza19zdGF0ZSh0c2ssIFRBU0tfUlVOTklORyk7CisJd2FrZV91cCgmc2VtLT53YWl0KTsKK30KKworLyoKKyAqIFNhbWUgYXMgX19kb3duKCkgd2l0aCBhbiBhZGRpdGlvbmFsIHRlc3QgZm9yIHNpZ25hbHMuCisgKiBJZiBhIHNpZ25hbCBpcyBwZW5kaW5nIHRoZSBjb3VudCBpcyB1cGRhdGVkIGFzIGZvbGxvd3M6CisgKiAgIGNvdW50ID4gMDogd2FrZSB1cCBxdWV1ZSBhbmQgZXhpdC4KKyAqICAgY291bnQgPD0gMDogc2V0IGNvdW50IHRvIDAsIHdha2UgdXAgcXVldWUgYW5kIGV4aXQuCisgKi8KK2ludCBfX3NjaGVkIF9fZG93bl9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBzZW1hcGhvcmUgKiBzZW0pCit7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIHRzayk7CisKKwlfX3NldF90YXNrX3N0YXRlKHRzaywgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlhZGRfd2FpdF9xdWV1ZV9leGNsdXNpdmUoJnNlbS0+d2FpdCwgJndhaXQpOworCXdoaWxlIChfX3NlbV91cGRhdGVfY291bnQoc2VtLCAtMSkgPD0gMCkgeworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCV9fc2VtX3VwZGF0ZV9jb3VudChzZW0sIDApOworCQkJcmV0dmFsID0gLUVJTlRSOworCQkJYnJlYWs7CisJCX0KKwkJc2NoZWR1bGUoKTsKKwkJc2V0X3Rhc2tfc3RhdGUodHNrLCBUQVNLX0lOVEVSUlVQVElCTEUpOworCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmc2VtLT53YWl0LCAmd2FpdCk7CisJX19zZXRfdGFza19zdGF0ZSh0c2ssIFRBU0tfUlVOTklORyk7CisJd2FrZV91cCgmc2VtLT53YWl0KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMgYi9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3OWM0MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYwpAQCAtMCwwICsxLDYzMiBAQAorLyoKKyAqICBhcmNoL3MzOTAva2VybmVsL3NldHVwLmMKKyAqCisgKiAgUzM5MCB2ZXJzaW9uCisgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwgSUJNIENvcnBvcmF0aW9uCisgKiAgICBBdXRob3Iocyk6IEhhcnRtdXQgUGVubmVyIChocEBkZS5pYm0uY29tKSwKKyAqICAgICAgICAgICAgICAgTWFydGluIFNjaHdpZGVmc2t5IChzY2h3aWRlZnNreUBkZS5pYm0uY29tKQorICoKKyAqICBEZXJpdmVkIGZyb20gImFyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYyIKKyAqICAgIENvcHlyaWdodCAoQykgMTk5NSwgTGludXMgVG9ydmFsZHMKKyAqLworCisvKgorICogVGhpcyBmaWxlIGhhbmRsZXMgdGhlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgcGFydHMgb2YgaW5pdGlhbGl6YXRpb24KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL2NwY21kLmg+CisjaW5jbHVkZSA8YXNtL2xvd2NvcmUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKy8qCisgKiBNYWNoaW5lIHNldHVwLi4KKyAqLwordW5zaWduZWQgaW50IGNvbnNvbGVfbW9kZSA9IDA7Cit1bnNpZ25lZCBpbnQgY29uc29sZV9kZXZubyA9IC0xOwordW5zaWduZWQgaW50IGNvbnNvbGVfaXJxID0gLTE7Cit1bnNpZ25lZCBsb25nIG1lbW9yeV9zaXplID0gMDsKK3Vuc2lnbmVkIGxvbmcgbWFjaGluZV9mbGFncyA9IDA7Cit1bnNpZ25lZCBpbnQgZGVmYXVsdF9zdG9yYWdlX2tleSA9IDA7CitzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZSwgdHlwZTsKK30gbWVtb3J5X2NodW5rW01FTU9SWV9DSFVOS1NdID0geyB7IDAgfSB9OworI2RlZmluZSBDSFVOS19SRUFEX1dSSVRFIDAKKyNkZWZpbmUgQ0hVTktfUkVBRF9PTkxZIDEKK3ZvbGF0aWxlIGludCBfX2NwdV9sb2dpY2FsX21hcFtOUl9DUFVTXTsgLyogbG9naWNhbCBjcHUgdG8gY3B1IGFkZHJlc3MgKi8KKworLyoKKyAqIFNldHVwIG9wdGlvbnMKKyAqLworZXh0ZXJuIGludCBfdGV4dCxfZXRleHQsIF9lZGF0YSwgX2VuZDsKKworLyoKKyAqIFRoaXMgaXMgc2V0IHVwIGJ5IHRoZSBzZXR1cC1yb3V0aW5lIGF0IGJvb3QtdGltZQorICogZm9yIFMzOTAgbmVlZCB0byBmaW5kIG91dCwgd2hhdCB3ZSBoYXZlIHRvIHNldHVwCisgKiB1c2luZyBhZGRyZXNzIDB4MTA0MDAgLi4uCisgKi8KKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorCitzdGF0aWMgY2hhciBjb21tYW5kX2xpbmVbQ09NTUFORF9MSU5FX1NJWkVdID0geyAwLCB9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvZGVfcmVzb3VyY2UgPSB7CisJLm5hbWUgID0gIktlcm5lbCBjb2RlIiwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZGF0YV9yZXNvdXJjZSA9IHsKKwkubmFtZSA9ICJLZXJuZWwgZGF0YSIsCisJLmZsYWdzID0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9NRU0sCit9OworCisvKgorICogY3B1X2luaXQoKSBpbml0aWFsaXplcyBzdGF0ZSB0aGF0IGlzIHBlci1DUFUuCisgKi8KK3ZvaWQgX19kZXZpbml0IGNwdV9pbml0ICh2b2lkKQoreworICAgICAgICBpbnQgYWRkciA9IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFN0b3JlIHByb2Nlc3NvciBpZCBpbiBsb3djb3JlICh1c2VkIGUuZy4gaW4gdGltZXJfaW50ZXJydXB0KQorICAgICAgICAgKi8KKyAgICAgICAgYXNtIHZvbGF0aWxlICgic3RpZHAgJTAiOiAiPW0iIChTMzkwX2xvd2NvcmUuY3B1X2RhdGEuY3B1X2lkKSk7CisgICAgICAgIFMzOTBfbG93Y29yZS5jcHVfZGF0YS5jcHVfYWRkciA9IGFkZHI7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRm9yY2UgRlBVIGluaXRpYWxpemF0aW9uOgorICAgICAgICAgKi8KKyAgICAgICAgY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1VTRURGUFUpOworICAgICAgICBjbGVhcl91c2VkX21hdGgoKTsKKworCWF0b21pY19pbmMoJmluaXRfbW0ubW1fY291bnQpOworCWN1cnJlbnQtPmFjdGl2ZV9tbSA9ICZpbml0X21tOworICAgICAgICBpZiAoY3VycmVudC0+bW0pCisgICAgICAgICAgICAgICAgQlVHKCk7CisgICAgICAgIGVudGVyX2xhenlfdGxiKCZpbml0X21tLCBjdXJyZW50KTsKK30KKworLyoKKyAqIFZNIGhhbHQgYW5kIHBvd2Vyb2ZmIHNldHVwIHJvdXRpbmVzCisgKi8KK2NoYXIgdm1oYWx0X2NtZFsxMjhdID0gIiI7CitjaGFyIHZtcG9mZl9jbWRbMTI4XSA9ICIiOworCitzdGF0aWMgaW5saW5lIHZvaWQgc3RybmNweV9za2lwX3F1b3RlKGNoYXIgKmRzdCwgY2hhciAqc3JjLCBpbnQgbikKK3sKKyAgICAgICAgaW50IHN4LCBkeDsKKworICAgICAgICBkeCA9IDA7CisgICAgICAgIGZvciAoc3ggPSAwOyBzcmNbc3hdICE9IDA7IHN4KyspIHsKKyAgICAgICAgICAgICAgICBpZiAoc3JjW3N4XSA9PSAnIicpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGRzdFtkeCsrXSA9IHNyY1tzeF07CisgICAgICAgICAgICAgICAgaWYgKGR4ID49IG4pIGJyZWFrOworICAgICAgICB9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHZtaGFsdF9zZXR1cChjaGFyICpzdHIpCit7CisgICAgICAgIHN0cm5jcHlfc2tpcF9xdW90ZSh2bWhhbHRfY21kLCBzdHIsIDEyNyk7CisgICAgICAgIHZtaGFsdF9jbWRbMTI3XSA9IDA7CisgICAgICAgIHJldHVybiAxOworfQorCitfX3NldHVwKCJ2bWhhbHQ9Iiwgdm1oYWx0X3NldHVwKTsKKworc3RhdGljIGludCBfX2luaXQgdm1wb2ZmX3NldHVwKGNoYXIgKnN0cikKK3sKKyAgICAgICAgc3RybmNweV9za2lwX3F1b3RlKHZtcG9mZl9jbWQsIHN0ciwgMTI3KTsKKyAgICAgICAgdm1wb2ZmX2NtZFsxMjddID0gMDsKKyAgICAgICAgcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoInZtcG9mZj0iLCB2bXBvZmZfc2V0dXApOworCisvKgorICogY29uZGV2PSBhbmQgY29ubW9kZT0gc2V0dXAgcGFyYW1ldGVyLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGNvbmRldl9zZXR1cChjaGFyICpzdHIpCit7CisJaW50IHZkZXY7CisKKwl2ZGV2ID0gc2ltcGxlX3N0cnRvdWwoc3RyLCAmc3RyLCAwKTsKKwlpZiAodmRldiA+PSAwICYmIHZkZXYgPCA2NTUzNikgeworCQljb25zb2xlX2Rldm5vID0gdmRldjsKKwkJY29uc29sZV9pcnEgPSAtMTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImNvbmRldj0iLCBjb25kZXZfc2V0dXApOworCitzdGF0aWMgaW50IF9faW5pdCBjb25tb2RlX3NldHVwKGNoYXIgKnN0cikKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19TQ0xQX0NPTlNPTEUpCisJaWYgKHN0cm5jbXAoc3RyLCAiaHdjIiwgNCkgPT0gMCB8fCBzdHJuY21wKHN0ciwgInNjbHAiLCA1KSA9PSAwKQorICAgICAgICAgICAgICAgIFNFVF9DT05TT0xFX1NDTFA7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19UTjMyMTVfQ09OU09MRSkKKwlpZiAoc3RybmNtcChzdHIsICIzMjE1IiwgNSkgPT0gMCkKKwkJU0VUX0NPTlNPTEVfMzIxNTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1ROMzI3MF9DT05TT0xFKQorCWlmIChzdHJuY21wKHN0ciwgIjMyNzAiLCA1KSA9PSAwKQorCQlTRVRfQ09OU09MRV8zMjcwOworI2VuZGlmCisgICAgICAgIHJldHVybiAxOworfQorCitfX3NldHVwKCJjb25tb2RlPSIsIGNvbm1vZGVfc2V0dXApOworCitzdGF0aWMgdm9pZCBfX2luaXQgY29ubW9kZV9kZWZhdWx0KHZvaWQpCit7CisJY2hhciBxdWVyeV9idWZmZXJbMTAyNF07CisJY2hhciAqcHRyOworCisgICAgICAgIGlmIChNQUNISU5FX0lTX1ZNKSB7CisJCV9fY3BjbWQoIlFVRVJZIENPTlNPTEUiLCBxdWVyeV9idWZmZXIsIDEwMjQpOworCQljb25zb2xlX2Rldm5vID0gc2ltcGxlX3N0cnRvdWwocXVlcnlfYnVmZmVyICsgNSwgTlVMTCwgMTYpOworCQlwdHIgPSBzdHJzdHIocXVlcnlfYnVmZmVyLCAiU1VCQ0hBTk5FTCA9Iik7CisJCWNvbnNvbGVfaXJxID0gc2ltcGxlX3N0cnRvdWwocHRyICsgMTMsIE5VTEwsIDE2KTsKKwkJX19jcGNtZCgiUVVFUlkgVEVSTSIsIHF1ZXJ5X2J1ZmZlciwgMTAyNCk7CisJCXB0ciA9IHN0cnN0cihxdWVyeV9idWZmZXIsICJDT05NT0RFIik7CisJCS8qCisJCSAqIFNldCB0aGUgY29ubW9kZSB0byAzMjE1IHNvIHRoYXQgdGhlIGRldmljZSByZWNvZ25pdGlvbiAKKwkJICogd2lsbCBzZXQgdGhlIGN1X3R5cGUgb2YgdGhlIGNvbnNvbGUgdG8gMzIxNS4gSWYgdGhlCisJCSAqIGNvbm1vZGUgaXMgMzI3MCBhbmQgd2UgZG9uJ3Qgc2V0IGl0IGJhY2sgdGhlbiBib3RoCisJCSAqIDMyMTUgYW5kIHRoZSAzMjcwIGRyaXZlciB3aWxsIHRyeSB0byBhY2Nlc3MgdGhlIGNvbnNvbGUKKwkJICogZGV2aWNlICgzMjE1IGFzIGNvbnNvbGUgYW5kIDMyNzAgYXMgbm9ybWFsIHR0eSkuCisJCSAqLworCQlfX2NwY21kKCJURVJNIENPTk1PREUgMzIxNSIsIE5VTEwsIDApOworCQlpZiAocHRyID09IE5VTEwpIHsKKyNpZiBkZWZpbmVkKENPTkZJR19TQ0xQX0NPTlNPTEUpCisJCQlTRVRfQ09OU09MRV9TQ0xQOworI2VuZGlmCisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHN0cm5jbXAocHRyICsgOCwgIjMyNzAiLCA0KSA9PSAwKSB7CisjaWYgZGVmaW5lZChDT05GSUdfVE4zMjcwX0NPTlNPTEUpCisJCQlTRVRfQ09OU09MRV8zMjcwOworI2VsaWYgZGVmaW5lZChDT05GSUdfVE4zMjE1X0NPTlNPTEUpCisJCQlTRVRfQ09OU09MRV8zMjE1OworI2VsaWYgZGVmaW5lZChDT05GSUdfU0NMUF9DT05TT0xFKQorCQkJU0VUX0NPTlNPTEVfU0NMUDsKKyNlbmRpZgorCQl9IGVsc2UgaWYgKHN0cm5jbXAocHRyICsgOCwgIjMyMTUiLCA0KSA9PSAwKSB7CisjaWYgZGVmaW5lZChDT05GSUdfVE4zMjE1X0NPTlNPTEUpCisJCQlTRVRfQ09OU09MRV8zMjE1OworI2VsaWYgZGVmaW5lZChDT05GSUdfVE4zMjcwX0NPTlNPTEUpCisJCQlTRVRfQ09OU09MRV8zMjcwOworI2VsaWYgZGVmaW5lZChDT05GSUdfU0NMUF9DT05TT0xFKQorCQkJU0VUX0NPTlNPTEVfU0NMUDsKKyNlbmRpZgorCQl9CisgICAgICAgIH0gZWxzZSBpZiAoTUFDSElORV9JU19QMzkwKSB7CisjaWYgZGVmaW5lZChDT05GSUdfVE4zMjE1X0NPTlNPTEUpCisJCVNFVF9DT05TT0xFXzMyMTU7CisjZWxpZiBkZWZpbmVkKENPTkZJR19UTjMyNzBfQ09OU09MRSkKKwkJU0VUX0NPTlNPTEVfMzI3MDsKKyNlbmRpZgorCX0gZWxzZSB7CisjaWYgZGVmaW5lZChDT05GSUdfU0NMUF9DT05TT0xFKQorCQlTRVRfQ09OU09MRV9TQ0xQOworI2VuZGlmCisJfQorfQorCisjaWZkZWYgQ09ORklHX1NNUAorZXh0ZXJuIHZvaWQgbWFjaGluZV9yZXN0YXJ0X3NtcChjaGFyICopOworZXh0ZXJuIHZvaWQgbWFjaGluZV9oYWx0X3NtcCh2b2lkKTsKK2V4dGVybiB2b2lkIG1hY2hpbmVfcG93ZXJfb2ZmX3NtcCh2b2lkKTsKKwordm9pZCAoKl9tYWNoaW5lX3Jlc3RhcnQpKGNoYXIgKmNvbW1hbmQpID0gbWFjaGluZV9yZXN0YXJ0X3NtcDsKK3ZvaWQgKCpfbWFjaGluZV9oYWx0KSh2b2lkKSA9IG1hY2hpbmVfaGFsdF9zbXA7Cit2b2lkICgqX21hY2hpbmVfcG93ZXJfb2ZmKSh2b2lkKSA9IG1hY2hpbmVfcG93ZXJfb2ZmX3NtcDsKKyNlbHNlCisvKgorICogUmVib290LCBoYWx0IGFuZCBwb3dlcl9vZmYgcm91dGluZXMgZm9yIG5vbiBTTVAuCisgKi8KK2V4dGVybiB2b2lkIHJlaXBsKHVuc2lnbmVkIGxvbmcgZGV2bm8pOworc3RhdGljIHZvaWQgZG9fbWFjaGluZV9yZXN0YXJ0X25vbnNtcChjaGFyICogX191bnVzZWQpCit7CisJaWYgKE1BQ0hJTkVfSVNfVk0pCisJCWNwY21kICgiSVBMIiwgTlVMTCwgMCk7CisJZWxzZQorCQlyZWlwbCAoMHgxMDAwMCB8IFMzOTBfbG93Y29yZS5pcGxfZGV2aWNlKTsKK30KKworc3RhdGljIHZvaWQgZG9fbWFjaGluZV9oYWx0X25vbnNtcCh2b2lkKQoreworICAgICAgICBpZiAoTUFDSElORV9JU19WTSAmJiBzdHJsZW4odm1oYWx0X2NtZCkgPiAwKQorICAgICAgICAgICAgICAgIGNwY21kKHZtaGFsdF9jbWQsIE5VTEwsIDApOworICAgICAgICBzaWduYWxfcHJvY2Vzc29yKHNtcF9wcm9jZXNzb3JfaWQoKSwgc2lncF9zdG9wX2FuZF9zdG9yZV9zdGF0dXMpOworfQorCitzdGF0aWMgdm9pZCBkb19tYWNoaW5lX3Bvd2VyX29mZl9ub25zbXAodm9pZCkKK3sKKyAgICAgICAgaWYgKE1BQ0hJTkVfSVNfVk0gJiYgc3RybGVuKHZtcG9mZl9jbWQpID4gMCkKKyAgICAgICAgICAgICAgICBjcGNtZCh2bXBvZmZfY21kLCBOVUxMLCAwKTsKKyAgICAgICAgc2lnbmFsX3Byb2Nlc3NvcihzbXBfcHJvY2Vzc29yX2lkKCksIHNpZ3Bfc3RvcF9hbmRfc3RvcmVfc3RhdHVzKTsKK30KKwordm9pZCAoKl9tYWNoaW5lX3Jlc3RhcnQpKGNoYXIgKmNvbW1hbmQpID0gZG9fbWFjaGluZV9yZXN0YXJ0X25vbnNtcDsKK3ZvaWQgKCpfbWFjaGluZV9oYWx0KSh2b2lkKSA9IGRvX21hY2hpbmVfaGFsdF9ub25zbXA7Cit2b2lkICgqX21hY2hpbmVfcG93ZXJfb2ZmKSh2b2lkKSA9IGRvX21hY2hpbmVfcG93ZXJfb2ZmX25vbnNtcDsKKyNlbmRpZgorCisgLyoKKyAqIFJlYm9vdCwgaGFsdCBhbmQgcG93ZXJfb2ZmIHN0dWJzLiBUaGV5IGp1c3QgY2FsbCBfbWFjaGluZV9yZXN0YXJ0LAorICogX21hY2hpbmVfaGFsdCBvciBfbWFjaGluZV9wb3dlcl9vZmYuIAorICovCisKK3ZvaWQgbWFjaGluZV9yZXN0YXJ0KGNoYXIgKmNvbW1hbmQpCit7CisJY29uc29sZV91bmJsYW5rKCk7CisJX21hY2hpbmVfcmVzdGFydChjb21tYW5kKTsKK30KKworRVhQT1JUX1NZTUJPTChtYWNoaW5lX3Jlc3RhcnQpOworCit2b2lkIG1hY2hpbmVfaGFsdCh2b2lkKQoreworCWNvbnNvbGVfdW5ibGFuaygpOworCV9tYWNoaW5lX2hhbHQoKTsKK30KKworRVhQT1JUX1NZTUJPTChtYWNoaW5lX2hhbHQpOworCit2b2lkIG1hY2hpbmVfcG93ZXJfb2ZmKHZvaWQpCit7CisJY29uc29sZV91bmJsYW5rKCk7CisJX21hY2hpbmVfcG93ZXJfb2ZmKCk7Cit9CisKK0VYUE9SVF9TWU1CT0wobWFjaGluZV9wb3dlcl9vZmYpOworCisvKgorICogU2V0dXAgZnVuY3Rpb24gY2FsbGVkIGZyb20gaW5pdC9tYWluLmMganVzdCBhZnRlciB0aGUgYmFubmVyCisgKiB3YXMgcHJpbnRlZC4KKyAqLworZXh0ZXJuIGNoYXIgX3BzdGFydCwgX3BlbmQsIF9zdGV4dDsKKwordm9pZCBfX2luaXQgc2V0dXBfYXJjaChjaGFyICoqY21kbGluZV9wKQoreworICAgICAgICB1bnNpZ25lZCBsb25nIGJvb3RtYXBfc2l6ZTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBtZW1vcnlfc3RhcnQsIG1lbW9yeV9lbmQ7CisgICAgICAgIGNoYXIgYyA9ICcgJywgY24sICp0byA9IGNvbW1hbmRfbGluZSwgKmZyb20gPSBDT01NQU5EX0xJTkU7CisJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIGVuZF9wZm47CisgICAgICAgIHN0YXRpYyB1bnNpZ25lZCBpbnQgc21wdHJhcD0wOworICAgICAgICB1bnNpZ25lZCBsb25nIGRlbGF5ID0gMDsKKwlzdHJ1Y3QgX2xvd2NvcmUgKmxjOworCWludCBpOworCisgICAgICAgIGlmIChzbXB0cmFwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgc21wdHJhcD0xOworCisgICAgICAgIC8qCisgICAgICAgICAqIHByaW50IHdoYXQgaGVhZC5TIGhhcyBmb3VuZCBvdXQgYWJvdXQgdGhlIG1hY2hpbmUgCisgICAgICAgICAqLworI2lmbmRlZiBDT05GSUdfQVJDSF9TMzkwWAorCXByaW50aygoTUFDSElORV9JU19WTSkgPworCSAgICAgICAiV2UgYXJlIHJ1bm5pbmcgdW5kZXIgVk0gKDMxIGJpdCBtb2RlKVxuIiA6CisJICAgICAgICJXZSBhcmUgcnVubmluZyBuYXRpdmUgKDMxIGJpdCBtb2RlKVxuIik7CisJcHJpbnRrKChNQUNISU5FX0hBU19JRUVFKSA/CisJICAgICAgICJUaGlzIG1hY2hpbmUgaGFzIGFuIElFRUUgZnB1XG4iIDoKKwkgICAgICAgIlRoaXMgbWFjaGluZSBoYXMgbm8gSUVFRSBmcHVcbiIpOworI2Vsc2UgLyogQ09ORklHX0FSQ0hfUzM5MFggKi8KKwlwcmludGsoKE1BQ0hJTkVfSVNfVk0pID8KKwkgICAgICAgIldlIGFyZSBydW5uaW5nIHVuZGVyIFZNICg2NCBiaXQgbW9kZSlcbiIgOgorCSAgICAgICAiV2UgYXJlIHJ1bm5pbmcgbmF0aXZlICg2NCBiaXQgbW9kZSlcbiIpOworI2VuZGlmIC8qIENPTkZJR19BUkNIX1MzOTBYICovCisKKyAgICAgICAgUk9PVF9ERVYgPSBSb290X1JBTTA7CisgICAgICAgIG1lbW9yeV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKSAmX2VuZDsgICAgLyogZml4aXQgaWYgdXNlICRDT0RFTE8gZXRjKi8KKyNpZm5kZWYgQ09ORklHX0FSQ0hfUzM5MFgKKwltZW1vcnlfZW5kID0gbWVtb3J5X3NpemUgJiB+MHg0MDAwMDBVTDsgIC8qIGFsaWduIG1lbW9yeSBlbmQgdG8gNE1CICovCisgICAgICAgIC8qCisgICAgICAgICAqIFdlIG5lZWQgc29tZSBmcmVlIHZpcnR1YWwgc3BhY2UgdG8gYmUgYWJsZSB0byBkbyB2bWFsbG9jLgorICAgICAgICAgKiBPbiBhIG1hY2hpbmUgd2l0aCAyR0IgbWVtb3J5IHdlIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYXQKKyAgICAgICAgICogbGVhc3QgMTI4IE1CIGZyZWUgc3BhY2UgZm9yIHZtYWxsb2MuCisgICAgICAgICAqLworICAgICAgICBpZiAobWVtb3J5X2VuZCA+IDE5MjAqMTAyNCoxMDI0KQorICAgICAgICAgICAgICAgIG1lbW9yeV9lbmQgPSAxOTIwKjEwMjQqMTAyNDsKKyNlbHNlIC8qIENPTkZJR19BUkNIX1MzOTBYICovCisJbWVtb3J5X2VuZCA9IG1lbW9yeV9zaXplICYgfjB4MjAwMDAwVUw7ICAvKiBkZXRlY3RlZCBpbiBoZWFkLnMgKi8KKyNlbmRpZiAvKiBDT05GSUdfQVJDSF9TMzkwWCAqLworICAgICAgICBpbml0X21tLnN0YXJ0X2NvZGUgPSBQQUdFX09GRlNFVDsKKyAgICAgICAgaW5pdF9tbS5lbmRfY29kZSA9ICh1bnNpZ25lZCBsb25nKSAmX2V0ZXh0OworICAgICAgICBpbml0X21tLmVuZF9kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZfZWRhdGE7CisgICAgICAgIGluaXRfbW0uYnJrID0gKHVuc2lnbmVkIGxvbmcpICZfZW5kOworCisJY29kZV9yZXNvdXJjZS5zdGFydCA9ICh1bnNpZ25lZCBsb25nKSAmX3RleHQ7CisJY29kZV9yZXNvdXJjZS5lbmQgPSAodW5zaWduZWQgbG9uZykgJl9ldGV4dCAtIDE7CisJZGF0YV9yZXNvdXJjZS5zdGFydCA9ICh1bnNpZ25lZCBsb25nKSAmX2V0ZXh0OworCWRhdGFfcmVzb3VyY2UuZW5kID0gKHVuc2lnbmVkIGxvbmcpICZfZWRhdGEgLSAxOworCisgICAgICAgIC8qIFNhdmUgdW5wYXJzZWQgY29tbWFuZCBsaW5lIGNvcHkgZm9yIC9wcm9jL2NtZGxpbmUgKi8KKyAgICAgICAgbWVtY3B5KHNhdmVkX2NvbW1hbmRfbGluZSwgQ09NTUFORF9MSU5FLCBDT01NQU5EX0xJTkVfU0laRSk7CisgICAgICAgIHNhdmVkX2NvbW1hbmRfbGluZVtDT01NQU5EX0xJTkVfU0laRS0xXSA9ICdcMCc7CisKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogIm1lbT1YWFhba0ttTV0iIHNldHMgbWVtc2l6ZSAKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnICcgJiYgc3RybmNtcChmcm9tLCAibWVtPSIsIDQpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9lbmQgPSBzaW1wbGVfc3RydG91bChmcm9tKzQsICZmcm9tLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKmZyb20gPT0gJ0snIHx8ICpmcm9tID09ICdrJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X2VuZCA9IG1lbW9yeV9lbmQgPDwgMTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoICpmcm9tID09ICdNJyB8fCAqZnJvbSA9PSAnbScgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9lbmQgPSBtZW1vcnlfZW5kIDw8IDIwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogImlwbGRlbGF5PVhYWFtzbV0iIHNldHMgaXBsIGRlbGF5IGluIHNlY29uZHMgb3IgbWludXRlcworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChjID09ICcgJyAmJiBzdHJuY21wKGZyb20sICJpcGxkZWxheT0iLCA5KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxheSA9IHNpbXBsZV9zdHJ0b3VsKGZyb20rOSwgJmZyb20sIDApOworCQkJaWYgKCpmcm9tID09ICdzJyB8fCAqZnJvbSA9PSAnUycpIHsKKwkJCQlkZWxheSA9IGRlbGF5KjEwMDAwMDA7CisJCQkJZnJvbSsrOworCQkJfSBlbHNlIGlmICgqZnJvbSA9PSAnbScgfHwgKmZyb20gPT0gJ00nKSB7CisJCQkJZGVsYXkgPSBkZWxheSo2MCoxMDAwMDAwOworCQkJCWZyb20rKzsKKwkJCX0KKwkJCS8qIG5vdyB3YWl0IGZvciB0aGUgcmVxdWVzdGVkIGFtb3VudCBvZiB0aW1lICovCisJCQl1ZGVsYXkoZGVsYXkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbiA9ICooZnJvbSsrKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNuKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKGNuID09ICdcbicpCisgICAgICAgICAgICAgICAgICAgICAgICBjbiA9ICcgJzsgIC8qIHJlcGxhY2UgbmV3bGluZXMgd2l0aCBzcGFjZSAqLworCQlpZiAoY24gPT0gMHgwZCkKKwkJCWNuID0gJyAnOyAgLyogcmVwbGFjZSAweDBkIHdpdGggc3BhY2UgKi8KKyAgICAgICAgICAgICAgICBpZiAoY24gPT0gJyAnICYmIGMgPT0gJyAnKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAvKiByZW1vdmUgYWRkaXRpb25hbCBzcGFjZXMgKi8KKyAgICAgICAgICAgICAgICBjID0gY247CisgICAgICAgICAgICAgICAgaWYgKHRvIC0gY29tbWFuZF9saW5lID49IENPTU1BTkRfTElORV9TSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgKih0bysrKSA9IGM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMgPT0gJyAnICYmIHRvID4gY29tbWFuZF9saW5lKSB0by0tOworICAgICAgICAqdG8gPSAnXDAnOworICAgICAgICAqY21kbGluZV9wID0gY29tbWFuZF9saW5lOworCisJLyoKKwkgKiBwYXJ0aWFsbHkgdXNlZCBwYWdlcyBhcmUgbm90IHVzYWJsZSAtIHRodXMKKwkgKiB3ZSBhcmUgcm91bmRpbmcgdXB3YXJkczoKKwkgKi8KKwlzdGFydF9wZm4gPSAoX19wYSgmX2VuZCkgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOworCWVuZF9wZm4gPSBtYXhfcGZuID0gbWVtb3J5X2VuZCA+PiBQQUdFX1NISUZUOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBib290LXRpbWUgYWxsb2NhdG9yICh3aXRoIGxvdyBtZW1vcnkgb25seSk6CisJICovCisJYm9vdG1hcF9zaXplID0gaW5pdF9ib290bWVtKHN0YXJ0X3BmbiwgZW5kX3Bmbik7CisKKwkvKgorCSAqIFJlZ2lzdGVyIFJBTSBhcmVhcyB3aXRoIHRoZSBib290bWVtIGFsbG9jYXRvci4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTYgJiYgbWVtb3J5X2NodW5rW2ldLnNpemUgPiAwOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBzdGFydF9jaHVuaywgZW5kX2NodW5rOworCisJCWlmIChtZW1vcnlfY2h1bmtbaV0udHlwZSAhPSBDSFVOS19SRUFEX1dSSVRFKQorCQkJY29udGludWU7CisJCXN0YXJ0X2NodW5rID0gKG1lbW9yeV9jaHVua1tpXS5hZGRyICsgUEFHRV9TSVpFIC0gMSk7CisJCXN0YXJ0X2NodW5rID4+PSBQQUdFX1NISUZUOworCQllbmRfY2h1bmsgPSAobWVtb3J5X2NodW5rW2ldLmFkZHIgKyBtZW1vcnlfY2h1bmtbaV0uc2l6ZSk7CisJCWVuZF9jaHVuayA+Pj0gUEFHRV9TSElGVDsKKwkJaWYgKHN0YXJ0X2NodW5rIDwgc3RhcnRfcGZuKQorCQkJc3RhcnRfY2h1bmsgPSBzdGFydF9wZm47CisJCWlmIChlbmRfY2h1bmsgPiBlbmRfcGZuKQorCQkJZW5kX2NodW5rID0gZW5kX3BmbjsKKwkJaWYgKHN0YXJ0X2NodW5rIDwgZW5kX2NodW5rKQorCQkJZnJlZV9ib290bWVtKHN0YXJ0X2NodW5rIDw8IFBBR0VfU0hJRlQsCisJCQkJICAgICAoZW5kX2NodW5rIC0gc3RhcnRfY2h1bmspIDw8IFBBR0VfU0hJRlQpOworCX0KKworICAgICAgICAvKgorICAgICAgICAgKiBSZXNlcnZlIHRoZSBib290bWVtIGJpdG1hcCBpdHNlbGYgYXMgd2VsbC4gV2UgZG8gdGhpcyBpbiB0d28KKyAgICAgICAgICogc3RlcHMgKGZpcnN0IHN0ZXAgd2FzIGluaXRfYm9vdG1lbSgpKSBiZWNhdXNlIHRoaXMgY2F0Y2hlcworICAgICAgICAgKiB0aGUgKHZlcnkgdW5saWtlbHkpIGNhc2Ugb2YgdXMgYWNjaWRlbnRhbGx5IGluaXRpYWxpemluZyB0aGUKKyAgICAgICAgICogYm9vdG1lbSBhbGxvY2F0b3Igd2l0aCBhbiBpbnZhbGlkIFJBTSBhcmVhLgorICAgICAgICAgKi8KKyAgICAgICAgcmVzZXJ2ZV9ib290bWVtKHN0YXJ0X3BmbiA8PCBQQUdFX1NISUZULCBib290bWFwX3NpemUpOworCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECisgICAgICAgIGlmIChJTklUUkRfU1RBUlQpIHsKKwkJaWYgKElOSVRSRF9TVEFSVCArIElOSVRSRF9TSVpFIDw9IG1lbW9yeV9lbmQpIHsKKwkJCXJlc2VydmVfYm9vdG1lbShJTklUUkRfU1RBUlQsIElOSVRSRF9TSVpFKTsKKwkJCWluaXRyZF9zdGFydCA9IElOSVRSRF9TVEFSVDsKKwkJCWluaXRyZF9lbmQgPSBpbml0cmRfc3RhcnQgKyBJTklUUkRfU0laRTsKKwkJfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiaW5pdHJkIGV4dGVuZHMgYmV5b25kIGVuZCBvZiBtZW1vcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoMHglMDhseCA+IDB4JTA4bHgpXG5kaXNhYmxpbmcgaW5pdHJkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRyZF9zdGFydCArIElOSVRSRF9TSVpFLCBtZW1vcnlfZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRyZF9zdGFydCA9IGluaXRyZF9lbmQgPSAwOworCQl9CisgICAgICAgIH0KKyNlbmRpZgorCisJZm9yIChpID0gMDsgaSA8IDE2ICYmIG1lbW9yeV9jaHVua1tpXS5zaXplID4gMDsgaSsrKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJCXJlcyA9IGFsbG9jX2Jvb3RtZW1fbG93KHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKwkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfTUVNOworCisJCXN3aXRjaCAobWVtb3J5X2NodW5rW2ldLnR5cGUpIHsKKwkJY2FzZSBDSFVOS19SRUFEX1dSSVRFOgorCQkJcmVzLT5uYW1lID0gIlN5c3RlbSBSQU0iOworCQkJYnJlYWs7CisJCWNhc2UgQ0hVTktfUkVBRF9PTkxZOgorCQkJcmVzLT5uYW1lID0gIlN5c3RlbSBST00iOworCQkJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX1JFQURPTkxZOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXMtPm5hbWUgPSAicmVzZXJ2ZWQiOworCQl9CisJCXJlcy0+c3RhcnQgPSBtZW1vcnlfY2h1bmtbaV0uYWRkcjsKKwkJcmVzLT5lbmQgPSBtZW1vcnlfY2h1bmtbaV0uYWRkciArICBtZW1vcnlfY2h1bmtbaV0uc2l6ZSAtIDE7CisJCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCByZXMpOworCQlyZXF1ZXN0X3Jlc291cmNlKHJlcywgJmNvZGVfcmVzb3VyY2UpOworCQlyZXF1ZXN0X3Jlc291cmNlKHJlcywgJmRhdGFfcmVzb3VyY2UpOworCX0KKworICAgICAgICAvKgorICAgICAgICAgKiBTZXR1cCBsb3djb3JlIGZvciBib290IGNwdQorICAgICAgICAgKi8KKyNpZm5kZWYgQ09ORklHX0FSQ0hfUzM5MFgKKwlsYyA9IChzdHJ1Y3QgX2xvd2NvcmUgKikgX19hbGxvY19ib290bWVtKFBBR0VfU0laRSwgUEFHRV9TSVpFLCAwKTsKKwltZW1zZXQobGMsIDAsIFBBR0VfU0laRSk7CisjZWxzZSAvKiBDT05GSUdfQVJDSF9TMzkwWCAqLworCWxjID0gKHN0cnVjdCBfbG93Y29yZSAqKSBfX2FsbG9jX2Jvb3RtZW0oMipQQUdFX1NJWkUsIDIqUEFHRV9TSVpFLCAwKTsKKwltZW1zZXQobGMsIDAsIDIqUEFHRV9TSVpFKTsKKyNlbmRpZiAvKiBDT05GSUdfQVJDSF9TMzkwWCAqLworCWxjLT5yZXN0YXJ0X3Bzdy5tYXNrID0gUFNXX0JBU0VfQklUUzsKKwlsYy0+cmVzdGFydF9wc3cuYWRkciA9CisJCVBTV19BRERSX0FNT0RFIHwgKHVuc2lnbmVkIGxvbmcpIHJlc3RhcnRfaW50X2hhbmRsZXI7CisJbGMtPmV4dGVybmFsX25ld19wc3cubWFzayA9IFBTV19LRVJORUxfQklUUzsKKwlsYy0+ZXh0ZXJuYWxfbmV3X3Bzdy5hZGRyID0KKwkJUFNXX0FERFJfQU1PREUgfCAodW5zaWduZWQgbG9uZykgZXh0X2ludF9oYW5kbGVyOworCWxjLT5zdmNfbmV3X3Bzdy5tYXNrID0gUFNXX0tFUk5FTF9CSVRTIHwgUFNXX01BU0tfSU8gfCBQU1dfTUFTS19FWFQ7CisJbGMtPnN2Y19uZXdfcHN3LmFkZHIgPSBQU1dfQUREUl9BTU9ERSB8ICh1bnNpZ25lZCBsb25nKSBzeXN0ZW1fY2FsbDsKKwlsYy0+cHJvZ3JhbV9uZXdfcHN3Lm1hc2sgPSBQU1dfS0VSTkVMX0JJVFM7CisJbGMtPnByb2dyYW1fbmV3X3Bzdy5hZGRyID0KKwkJUFNXX0FERFJfQU1PREUgfCAodW5zaWduZWQgbG9uZylwZ21fY2hlY2tfaGFuZGxlcjsKKwlsYy0+bWNja19uZXdfcHN3Lm1hc2sgPSBQU1dfS0VSTkVMX0JJVFM7CisJbGMtPm1jY2tfbmV3X3Bzdy5hZGRyID0KKwkJUFNXX0FERFJfQU1PREUgfCAodW5zaWduZWQgbG9uZykgbWNja19pbnRfaGFuZGxlcjsKKwlsYy0+aW9fbmV3X3Bzdy5tYXNrID0gUFNXX0tFUk5FTF9CSVRTOworCWxjLT5pb19uZXdfcHN3LmFkZHIgPSBQU1dfQUREUl9BTU9ERSB8ICh1bnNpZ25lZCBsb25nKSBpb19pbnRfaGFuZGxlcjsKKwlsYy0+aXBsX2RldmljZSA9IFMzOTBfbG93Y29yZS5pcGxfZGV2aWNlOworCWxjLT5qaWZmeV90aW1lciA9IC0xTEw7CisJbGMtPmtlcm5lbF9zdGFjayA9ICgodW5zaWduZWQgbG9uZykgJmluaXRfdGhyZWFkX3VuaW9uKSArIFRIUkVBRF9TSVpFOworCWxjLT5hc3luY19zdGFjayA9ICh1bnNpZ25lZCBsb25nKQorCQlfX2FsbG9jX2Jvb3RtZW0oQVNZTkNfU0laRSwgQVNZTkNfU0laRSwgMCkgKyBBU1lOQ19TSVpFOworI2lmZGVmIENPTkZJR19DSEVDS19TVEFDSworCWxjLT5wYW5pY19zdGFjayA9ICh1bnNpZ25lZCBsb25nKQorCQlfX2FsbG9jX2Jvb3RtZW0oUEFHRV9TSVpFLCBQQUdFX1NJWkUsIDApICsgUEFHRV9TSVpFOworI2VuZGlmCisJbGMtPmN1cnJlbnRfdGFzayA9ICh1bnNpZ25lZCBsb25nKSBpbml0X3RocmVhZF91bmlvbi50aHJlYWRfaW5mby50YXNrOworCWxjLT50aHJlYWRfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmaW5pdF90aHJlYWRfdW5pb247CisjaWZkZWYgQ09ORklHX0FSQ0hfUzM5MFgKKwlpZiAoTUFDSElORV9IQVNfRElBRzQ0KQorCQlsYy0+ZGlhZzQ0X29wY29kZSA9IDB4ODMwMDAwNDQ7CisJZWxzZQorCQlsYy0+ZGlhZzQ0X29wY29kZSA9IDB4MDcwMDA3MDA7CisjZW5kaWYgLyogQ09ORklHX0FSQ0hfUzM5MFggKi8KKwlzZXRfcHJlZml4KCh1MzIpKHVuc2lnbmVkIGxvbmcpIGxjKTsKKyAgICAgICAgY3B1X2luaXQoKTsKKyAgICAgICAgX19jcHVfbG9naWNhbF9tYXBbMF0gPSBTMzkwX2xvd2NvcmUuY3B1X2RhdGEuY3B1X2FkZHI7CisKKwkvKgorCSAqIENyZWF0ZSBrZXJuZWwgcGFnZSB0YWJsZXMgYW5kIHN3aXRjaCB0byB2aXJ0dWFsIGFkZHJlc3NpbmcuCisJICovCisgICAgICAgIHBhZ2luZ19pbml0KCk7CisKKyAgICAgICAgLyogU2V0dXAgZGVmYXVsdCBjb25zb2xlICovCisJY29ubW9kZV9kZWZhdWx0KCk7Cit9CisKK3ZvaWQgcHJpbnRfY3B1X2luZm8oc3RydWN0IGNwdWluZm9fUzM5MCAqY3B1aW5mbykKK3sKKyAgIHByaW50aygiY3B1ICVkICIKKyNpZmRlZiBDT05GSUdfU01QCisgICAgICAgICAgICJwaHlzX2lkeD0lZCAiCisjZW5kaWYKKyAgICAgICAgICAgInZlcnM9JTAyWCBpZGVudD0lMDZYIG1hY2hpbmU9JTA0WCB1bnVzZWQ9JTA0WFxuIiwKKyAgICAgICAgICAgY3B1aW5mby0+Y3B1X25yLAorI2lmZGVmIENPTkZJR19TTVAKKyAgICAgICAgICAgY3B1aW5mby0+Y3B1X2FkZHIsCisjZW5kaWYKKyAgICAgICAgICAgY3B1aW5mby0+Y3B1X2lkLnZlcnNpb24sCisgICAgICAgICAgIGNwdWluZm8tPmNwdV9pZC5pZGVudCwKKyAgICAgICAgICAgY3B1aW5mby0+Y3B1X2lkLm1hY2hpbmUsCisgICAgICAgICAgIGNwdWluZm8tPmNwdV9pZC51bnVzZWQpOworfQorCisvKgorICogc2hvd19jcHVpbmZvIC0gR2V0IGluZm9ybWF0aW9uIG9uIG9uZSBDUFUgZm9yIHVzZSBieSBwcm9jZnMuCisgKi8KKworc3RhdGljIGludCBzaG93X2NwdWluZm8oc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworICAgICAgICBzdHJ1Y3QgY3B1aW5mb19TMzkwICpjcHVpbmZvOworCXVuc2lnbmVkIGxvbmcgbiA9ICh1bnNpZ25lZCBsb25nKSB2IC0gMTsKKworCWlmICghbikgeworCQlzZXFfcHJpbnRmKG0sICJ2ZW5kb3JfaWQgICAgICAgOiBJQk0vUzM5MFxuIgorCQkJICAgICAgICIjIHByb2Nlc3NvcnMgICAgOiAlaVxuIgorCQkJICAgICAgICJib2dvbWlwcyBwZXIgY3B1OiAlbHUuJTAybHVcbiIsCisJCQkgICAgICAgbnVtX29ubGluZV9jcHVzKCksIGxvb3BzX3Blcl9qaWZmeS8oNTAwMDAwL0haKSwKKwkJCSAgICAgICAobG9vcHNfcGVyX2ppZmZ5Lyg1MDAwL0haKSklMTAwKTsKKwl9CisJaWYgKGNwdV9vbmxpbmUobikpIHsKKyNpZmRlZiBDT05GSUdfU01QCisJCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgPT0gbikKKwkJCWNwdWluZm8gPSAmUzM5MF9sb3djb3JlLmNwdV9kYXRhOworCQllbHNlCisJCQljcHVpbmZvID0gJmxvd2NvcmVfcHRyW25dLT5jcHVfZGF0YTsKKyNlbHNlCisJCWNwdWluZm8gPSAmUzM5MF9sb3djb3JlLmNwdV9kYXRhOworI2VuZGlmCisJCXNlcV9wcmludGYobSwgInByb2Nlc3NvciAlbGk6ICIKKwkJCSAgICAgICAidmVyc2lvbiA9ICUwMlgsICAiCisJCQkgICAgICAgImlkZW50aWZpY2F0aW9uID0gJTA2WCwgICIKKwkJCSAgICAgICAibWFjaGluZSA9ICUwNFhcbiIsCisJCQkgICAgICAgbiwgY3B1aW5mby0+Y3B1X2lkLnZlcnNpb24sCisJCQkgICAgICAgY3B1aW5mby0+Y3B1X2lkLmlkZW50LAorCQkJICAgICAgIGNwdWluZm8tPmNwdV9pZC5tYWNoaW5lKTsKKwl9CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCAqY19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQoreworCXJldHVybiAqcG9zIDwgTlJfQ1BVUyA/ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKSAqcG9zICsgMSkgOiBOVUxMOworfQorc3RhdGljIHZvaWQgKmNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCSsrKnBvczsKKwlyZXR1cm4gY19zdGFydChtLCBwb3MpOworfQorc3RhdGljIHZvaWQgY19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKK30KK3N0cnVjdCBzZXFfb3BlcmF0aW9ucyBjcHVpbmZvX29wID0geworCS5zdGFydAk9IGNfc3RhcnQsCisJLm5leHQJPSBjX25leHQsCisJLnN0b3AJPSBjX3N0b3AsCisJLnNob3cJPSBzaG93X2NwdWluZm8sCit9OworCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zaWduYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTBjMWQwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zaWduYWwuYwpAQCAtMCwwICsxLDUyNyBAQAorLyoKKyAqICBhcmNoL3MzOTAva2VybmVsL3NpZ25hbC5jCisgKgorICogIFMzOTAgdmVyc2lvbgorICogICAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgorICogICAgQXV0aG9yKHMpOiBEZW5pcyBKb3NlcGggQmFycm93IChkamJhcnJvd0BkZS5pYm0uY29tLGJhcnJvd19kakB5YWhvby5jb20pCisgKgorICogICAgQmFzZWQgb24gSW50ZWwgdmVyc2lvbgorICogCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICAxOTk3LTExLTI4ICBNb2RpZmllZCBmb3IgUE9TSVguMWIgc2lnbmFscyBieSBSaWNoYXJkIEhlbmRlcnNvbgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpbmZtdHMuaD4KKyNpbmNsdWRlIDxhc20vdWNvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9sb3djb3JlLmg+CisKKyNkZWZpbmUgX0JMT0NLQUJMRSAofihzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSkpCisKKwordHlwZWRlZiBzdHJ1Y3QgCit7CisJX191OCBjYWxsZWVfdXNlZF9zdGFja1tfX1NJR05BTF9GUkFNRVNJWkVdOworCXN0cnVjdCBzaWdjb250ZXh0IHNjOworCV9zaWdyZWdzIHNyZWdzOworCWludCBzaWdubzsKKwlfX3U4IHJldGNvZGVbUzM5MF9TWVNDQUxMX1NJWkVdOworfSBzaWdmcmFtZTsKKwordHlwZWRlZiBzdHJ1Y3QgCit7CisJX191OCBjYWxsZWVfdXNlZF9zdGFja1tfX1NJR05BTF9GUkFNRVNJWkVdOworCV9fdTggcmV0Y29kZVtTMzkwX1NZU0NBTExfU0laRV07CisJc3RydWN0IHNpZ2luZm8gaW5mbzsKKwlzdHJ1Y3QgdWNvbnRleHQgdWM7Cit9IHJ0X3NpZ2ZyYW1lOworCitpbnQgZG9fc2lnbmFsKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzaWdzZXRfdCAqb2xkc2V0KTsKKworLyoKKyAqIEF0b21pY2FsbHkgc3dhcCBpbiB0aGUgbmV3IHNpZ25hbCBtYXNrLCBhbmQgd2FpdCBmb3IgYSBzaWduYWwuCisgKi8KK2FzbWxpbmthZ2UgaW50CitzeXNfc2lnc3VzcGVuZChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGludCBoaXN0b3J5MCwgaW50IGhpc3RvcnkxLAorCSAgICAgICBvbGRfc2lnc2V0X3QgbWFzaykKK3sKKwlzaWdzZXRfdCBzYXZlc2V0OworCisJbWFzayAmPSBfQkxPQ0tBQkxFOworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCXNhdmVzZXQgPSBjdXJyZW50LT5ibG9ja2VkOworCXNpZ2luaXRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsIG1hc2spOworCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlyZWdzLT5ncHJzWzJdID0gLUVJTlRSOworCisJd2hpbGUgKDEpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGUoKTsKKwkJaWYgKGRvX3NpZ25hbChyZWdzLCAmc2F2ZXNldCkpCisJCQlyZXR1cm4gLUVJTlRSOworCX0KK30KKworYXNtbGlua2FnZSBsb25nCitzeXNfcnRfc2lnc3VzcGVuZChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc2lnc2V0X3QgX191c2VyICp1bmV3c2V0LAorCQkJCQkJc2l6ZV90IHNpZ3NldHNpemUpCit7CisJc2lnc2V0X3Qgc2F2ZXNldCwgbmV3c2V0OworCisJLyogWFhYOiBEb24ndCBwcmVjbHVkZSBoYW5kbGluZyBkaWZmZXJlbnQgc2l6ZWQgc2lnc2V0X3Qncy4gICovCisJaWYgKHNpZ3NldHNpemUgIT0gc2l6ZW9mKHNpZ3NldF90KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm5ld3NldCwgdW5ld3NldCwgc2l6ZW9mKG5ld3NldCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlzaWdkZWxzZXRtYXNrKCZuZXdzZXQsIH5fQkxPQ0tBQkxFKTsKKworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCXNhdmVzZXQgPSBjdXJyZW50LT5ibG9ja2VkOworCWN1cnJlbnQtPmJsb2NrZWQgPSBuZXdzZXQ7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCXJlZ3MtPmdwcnNbMl0gPSAtRUlOVFI7CisKKwl3aGlsZSAoMSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZSgpOworCQlpZiAoZG9fc2lnbmFsKHJlZ3MsICZzYXZlc2V0KSkKKwkJCXJldHVybiAtRUlOVFI7CisJfQorfQorCithc21saW5rYWdlIGxvbmcKK3N5c19zaWdhY3Rpb24oaW50IHNpZywgY29uc3Qgc3RydWN0IG9sZF9zaWdhY3Rpb24gX191c2VyICphY3QsCisJICAgICAgc3RydWN0IG9sZF9zaWdhY3Rpb24gX191c2VyICpvYWN0KQoreworCXN0cnVjdCBrX3NpZ2FjdGlvbiBuZXdfa2EsIG9sZF9rYTsKKwlpbnQgcmV0OworCisJaWYgKGFjdCkgeworCQlvbGRfc2lnc2V0X3QgbWFzazsKKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGFjdCwgc2l6ZW9mKCphY3QpKSB8fAorCQkgICAgX19nZXRfdXNlcihuZXdfa2Euc2Euc2FfaGFuZGxlciwgJmFjdC0+c2FfaGFuZGxlcikgfHwKKwkJICAgIF9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX3Jlc3RvcmVyLCAmYWN0LT5zYV9yZXN0b3JlcikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJX19nZXRfdXNlcihuZXdfa2Euc2Euc2FfZmxhZ3MsICZhY3QtPnNhX2ZsYWdzKTsKKwkJX19nZXRfdXNlcihtYXNrLCAmYWN0LT5zYV9tYXNrKTsKKwkJc2lnaW5pdHNldCgmbmV3X2thLnNhLnNhX21hc2ssIG1hc2spOworCX0KKworCXJldCA9IGRvX3NpZ2FjdGlvbihzaWcsIGFjdCA/ICZuZXdfa2EgOiBOVUxMLCBvYWN0ID8gJm9sZF9rYSA6IE5VTEwpOworCisJaWYgKCFyZXQgJiYgb2FjdCkgeworCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIG9hY3QsIHNpemVvZigqb2FjdCkpIHx8CisJCSAgICBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9oYW5kbGVyLCAmb2FjdC0+c2FfaGFuZGxlcikgfHwKKwkJICAgIF9fcHV0X3VzZXIob2xkX2thLnNhLnNhX3Jlc3RvcmVyLCAmb2FjdC0+c2FfcmVzdG9yZXIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCV9fcHV0X3VzZXIob2xkX2thLnNhLnNhX2ZsYWdzLCAmb2FjdC0+c2FfZmxhZ3MpOworCQlfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9tYXNrLnNpZ1swXSwgJm9hY3QtPnNhX21hc2spOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2FzbWxpbmthZ2UgbG9uZworc3lzX3NpZ2FsdHN0YWNrKGNvbnN0IHN0YWNrX3QgX191c2VyICp1c3MsIHN0YWNrX3QgX191c2VyICp1b3NzLAorCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZXR1cm4gZG9fc2lnYWx0c3RhY2sodXNzLCB1b3NzLCByZWdzLT5ncHJzWzE1XSk7Cit9CisKKworCisvKiBSZXR1cm5zIG5vbi16ZXJvIG9uIGZhdWx0LiAqLworc3RhdGljIGludCBzYXZlX3NpZ3JlZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIF9zaWdyZWdzIF9fdXNlciAqc3JlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBvbGRfbWFzayA9IHJlZ3MtPnBzdy5tYXNrOworCWludCBlcnI7CisgIAorCXNhdmVfYWNjZXNzX3JlZ3MoY3VycmVudC0+dGhyZWFkLmFjcnMpOworCisJLyogQ29weSBhICdjbGVhbicgUFNXIG1hc2sgdG8gdGhlIHVzZXIgdG8gYXZvaWQgbGVha2luZworCSAgIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgUEVSIGlzIGN1cnJlbnRseSBvbi4gICovCisJcmVncy0+cHN3Lm1hc2sgPSBQU1dfTUFTS19NRVJHRShQU1dfVVNFUl9CSVRTLCByZWdzLT5wc3cubWFzayk7CisJZXJyID0gX19jb3B5X3RvX3VzZXIoJnNyZWdzLT5yZWdzLnBzdywgJnJlZ3MtPnBzdywKKwkJCSAgICAgc2l6ZW9mKHNyZWdzLT5yZWdzLnBzdykrc2l6ZW9mKHNyZWdzLT5yZWdzLmdwcnMpKTsKKwlyZWdzLT5wc3cubWFzayA9IG9sZF9tYXNrOworCWlmIChlcnIgIT0gMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBfX2NvcHlfdG9fdXNlcigmc3JlZ3MtPnJlZ3MuYWNycywgY3VycmVudC0+dGhyZWFkLmFjcnMsCisJCQkgICAgIHNpemVvZihzcmVncy0+cmVncy5hY3JzKSk7CisJaWYgKGVyciAhPSAwKQorCQlyZXR1cm4gZXJyOworCS8qIAorCSAqIFdlIGhhdmUgdG8gc3RvcmUgdGhlIGZwIHJlZ2lzdGVycyB0byBjdXJyZW50LT50aHJlYWQuZnBfcmVncworCSAqIHRvIG1lcmdlIHRoZW0gd2l0aCB0aGUgZW11bGF0ZWQgcmVnaXN0ZXJzLgorCSAqLworCXNhdmVfZnBfcmVncygmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MpOworCXJldHVybiBfX2NvcHlfdG9fdXNlcigmc3JlZ3MtPmZwcmVncywgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLAorCQkJICAgICAgc2l6ZW9mKHMzOTBfZnBfcmVncykpOworfQorCisvKiBSZXR1cm5zIHBvc2l0aXZlIG51bWJlciBvbiBlcnJvciAqLworc3RhdGljIGludCByZXN0b3JlX3NpZ3JlZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIF9zaWdyZWdzIF9fdXNlciAqc3JlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBvbGRfbWFzayA9IHJlZ3MtPnBzdy5tYXNrOworCWludCBlcnI7CisKKwkvKiBBbHd5cyBtYWtlIGFueSBwZW5kaW5nIHJlc3RhcnRlZCBzeXN0ZW0gY2FsbCByZXR1cm4gLUVJTlRSICovCisJY3VycmVudF90aHJlYWRfaW5mbygpLT5yZXN0YXJ0X2Jsb2NrLmZuID0gZG9fbm9fcmVzdGFydF9zeXNjYWxsOworCisJZXJyID0gX19jb3B5X2Zyb21fdXNlcigmcmVncy0+cHN3LCAmc3JlZ3MtPnJlZ3MucHN3LAorCQkJICAgICAgIHNpemVvZihzcmVncy0+cmVncy5wc3cpK3NpemVvZihzcmVncy0+cmVncy5ncHJzKSk7CisJcmVncy0+cHN3Lm1hc2sgPSBQU1dfTUFTS19NRVJHRShvbGRfbWFzaywgcmVncy0+cHN3Lm1hc2spOworCXJlZ3MtPnBzdy5hZGRyIHw9IFBTV19BRERSX0FNT0RFOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZXJyID0gX19jb3B5X2Zyb21fdXNlcigmY3VycmVudC0+dGhyZWFkLmFjcnMsICZzcmVncy0+cmVncy5hY3JzLAorCQkJICAgICAgIHNpemVvZihzcmVncy0+cmVncy5hY3JzKSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlyZXN0b3JlX2FjY2Vzc19yZWdzKGN1cnJlbnQtPnRocmVhZC5hY3JzKTsKKworCWVyciA9IF9fY29weV9mcm9tX3VzZXIoJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLCAmc3JlZ3MtPmZwcmVncywKKwkJCSAgICAgICBzaXplb2YoczM5MF9mcF9yZWdzKSk7CisJY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjICY9IEZQQ19WQUxJRF9NQVNLOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXN0b3JlX2ZwX3JlZ3MoJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzKTsKKwlyZWdzLT50cmFwID0gLTE7CS8qIGRpc2FibGUgc3lzY2FsbCBjaGVja3MgKi8KKwlyZXR1cm4gMDsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc2lnZnJhbWUgX191c2VyICpmcmFtZSA9IChzaWdmcmFtZSBfX3VzZXIgKilyZWdzLT5ncHJzWzE1XTsKKwlzaWdzZXRfdCBzZXQ7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKKwkJZ290byBiYWRmcmFtZTsKKwlpZiAoX19jb3B5X2Zyb21fdXNlcigmc2V0LnNpZywgJmZyYW1lLT5zYy5vbGRtYXNrLCBfU0lHTUFTS19DT1BZX1NJWkUpKQorCQlnb3RvIGJhZGZyYW1lOworCisJc2lnZGVsc2V0bWFzaygmc2V0LCB+X0JMT0NLQUJMRSk7CisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJY3VycmVudC0+YmxvY2tlZCA9IHNldDsKKwlyZWNhbGNfc2lncGVuZGluZygpOworCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisKKwlpZiAocmVzdG9yZV9zaWdyZWdzKHJlZ3MsICZmcmFtZS0+c3JlZ3MpKQorCQlnb3RvIGJhZGZyYW1lOworCisJcmV0dXJuIHJlZ3MtPmdwcnNbMl07CisKK2JhZGZyYW1lOgorCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKKwlyZXR1cm4gMDsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19ydF9zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZSA9IChydF9zaWdmcmFtZSBfX3VzZXIgKilyZWdzLT5ncHJzWzE1XTsKKwlzaWdzZXRfdCBzZXQ7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKKwkJZ290byBiYWRmcmFtZTsKKwlpZiAoX19jb3B5X2Zyb21fdXNlcigmc2V0LnNpZywgJmZyYW1lLT51Yy51Y19zaWdtYXNrLCBzaXplb2Yoc2V0KSkpCisJCWdvdG8gYmFkZnJhbWU7CisKKwlzaWdkZWxzZXRtYXNrKCZzZXQsIH5fQkxPQ0tBQkxFKTsKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwljdXJyZW50LT5ibG9ja2VkID0gc2V0OworCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKworCWlmIChyZXN0b3JlX3NpZ3JlZ3MocmVncywgJmZyYW1lLT51Yy51Y19tY29udGV4dCkpCisJCWdvdG8gYmFkZnJhbWU7CisKKwkvKiBJdCBpcyBtb3JlIGRpZmZpY3VsdCB0byBhdm9pZCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gdGhhbiB0bworCSAgIGNhbGwgaXQgYW5kIGlnbm9yZSBlcnJvcnMuICAqLworCWRvX3NpZ2FsdHN0YWNrKCZmcmFtZS0+dWMudWNfc3RhY2ssIE5VTEwsIHJlZ3MtPmdwcnNbMTVdKTsKKwlyZXR1cm4gcmVncy0+Z3Byc1syXTsKKworYmFkZnJhbWU6CisJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOworCXJldHVybiAwOworfQorCisvKgorICogU2V0IHVwIGEgc2lnbmFsIGZyYW1lLgorICovCisKKworLyoKKyAqIERldGVybWluZSB3aGljaCBzdGFjayB0byB1c2UuLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX191c2VyICoKK2dldF9zaWdmcmFtZShzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIHNpemVfdCBmcmFtZV9zaXplKQoreworCXVuc2lnbmVkIGxvbmcgc3A7CisKKwkvKiBEZWZhdWx0IHRvIHVzaW5nIG5vcm1hbCBzdGFjayAqLworCXNwID0gcmVncy0+Z3Byc1sxNV07CisKKwkvKiBUaGlzIGlzIHRoZSBYL09wZW4gc2FuY3Rpb25lZCBzaWduYWwgc3RhY2sgc3dpdGNoaW5nLiAgKi8KKwlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfT05TVEFDSykgeworCQlpZiAoISBzYXNfc3NfZmxhZ3Moc3ApKQorCQkJc3AgPSBjdXJyZW50LT5zYXNfc3Nfc3AgKyBjdXJyZW50LT5zYXNfc3Nfc2l6ZTsKKwl9CisKKwkvKiBUaGlzIGlzIHRoZSBsZWdhY3kgc2lnbmFsIHN0YWNrIHN3aXRjaGluZy4gKi8KKwllbHNlIGlmICghdXNlcl9tb2RlKHJlZ3MpICYmCisJCSAhKGthLT5zYS5zYV9mbGFncyAmIFNBX1JFU1RPUkVSKSAmJgorCQkga2EtPnNhLnNhX3Jlc3RvcmVyKSB7CisJCXNwID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9yZXN0b3JlcjsKKwl9CisKKwlyZXR1cm4gKHZvaWQgX191c2VyICopKChzcCAtIGZyYW1lX3NpemUpICYgLTh1bCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1hcF9zaWduYWwoaW50IHNpZykKK3sKKwlpZiAoY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbgorCSAgICAmJiBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwCisJICAgICYmIHNpZyA8IDMyKQorCQlyZXR1cm4gY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcFtzaWddOworCWVsc2UKKwkJcmV0dXJuIHNpZzsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfZnJhbWUoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKKwkJCXNpZ3NldF90ICpzZXQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlzaWdmcmFtZSBfX3VzZXIgKmZyYW1lOworCisJZnJhbWUgPSBnZXRfc2lnZnJhbWUoa2EsIHJlZ3MsIHNpemVvZihzaWdmcmFtZSkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZnJhbWUsIHNpemVvZihzaWdmcmFtZSkpKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKworCWlmIChfX2NvcHlfdG9fdXNlcigmZnJhbWUtPnNjLm9sZG1hc2ssICZzZXQtPnNpZywgX1NJR01BU0tfQ09QWV9TSVpFKSkKKwkJZ290byBnaXZlX3NpZ3NlZ3Y7CisKKwlpZiAoc2F2ZV9zaWdyZWdzKHJlZ3MsICZmcmFtZS0+c3JlZ3MpKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKwlpZiAoX19wdXRfdXNlcigmZnJhbWUtPnNyZWdzLCAmZnJhbWUtPnNjLnNyZWdzKSkKKwkJZ290byBnaXZlX3NpZ3NlZ3Y7CisKKwkvKiBTZXQgdXAgdG8gcmV0dXJuIGZyb20gdXNlcnNwYWNlLiAgSWYgcHJvdmlkZWQsIHVzZSBhIHN0dWIKKwkgICBhbHJlYWR5IGluIHVzZXJzcGFjZS4gICovCisJaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX1JFU1RPUkVSKSB7CisgICAgICAgICAgICAgICAgcmVncy0+Z3Byc1sxNF0gPSAodW5zaWduZWQgbG9uZykKKwkJCWthLT5zYS5zYV9yZXN0b3JlciB8IFBTV19BRERSX0FNT0RFOworCX0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVncy0+Z3Byc1sxNF0gPSAodW5zaWduZWQgbG9uZykKKwkJCWZyYW1lLT5yZXRjb2RlIHwgUFNXX0FERFJfQU1PREU7CisJCWlmIChfX3B1dF91c2VyKFMzOTBfU1lTQ0FMTF9PUENPREUgfCBfX05SX3NpZ3JldHVybiwKKwkgICAgICAgICAgICAgICAgICAgICAgICh1MTYgX191c2VyICopKGZyYW1lLT5yZXRjb2RlKSkpCisJCQlnb3RvIGdpdmVfc2lnc2VndjsKKwl9CisKKwkvKiBTZXQgdXAgYmFja2NoYWluLiAqLworCWlmIChfX3B1dF91c2VyKHJlZ3MtPmdwcnNbMTVdLCAoYWRkcl90IF9fdXNlciAqKSBmcmFtZSkpCisJCWdvdG8gZ2l2ZV9zaWdzZWd2OworCisJLyogU2V0IHVwIHJlZ2lzdGVycyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KKwlyZWdzLT5ncHJzWzE1XSA9ICh1bnNpZ25lZCBsb25nKSBmcmFtZTsKKwlyZWdzLT5wc3cuYWRkciA9ICh1bnNpZ25lZCBsb25nKSBrYS0+c2Euc2FfaGFuZGxlciB8IFBTV19BRERSX0FNT0RFOworCisJcmVncy0+Z3Byc1syXSA9IG1hcF9zaWduYWwoc2lnKTsKKwlyZWdzLT5ncHJzWzNdID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+c2M7CisKKwkvKiBXZSBmb3Jnb3QgdG8gaW5jbHVkZSB0aGVzZSBpbiB0aGUgc2lnY29udGV4dC4KKwkgICBUbyBhdm9pZCBicmVha2luZyBiaW5hcnkgY29tcGF0aWJpbGl0eSwgdGhleSBhcmUgcGFzc2VkIGFzIGFyZ3MuICovCisJcmVncy0+Z3Byc1s0XSA9IGN1cnJlbnQtPnRocmVhZC50cmFwX25vOworCXJlZ3MtPmdwcnNbNV0gPSBjdXJyZW50LT50aHJlYWQucHJvdF9hZGRyOworCisJLyogUGxhY2Ugc2lnbmFsIG51bWJlciBvbiBzdGFjayB0byBhbGxvdyBiYWNrdHJhY2UgZnJvbSBoYW5kbGVyLiAgKi8KKwlpZiAoX19wdXRfdXNlcihyZWdzLT5ncHJzWzJdLCAoaW50IF9fdXNlciAqKSAmZnJhbWUtPnNpZ25vKSkKKwkJZ290byBnaXZlX3NpZ3NlZ3Y7CisJcmV0dXJuOworCitnaXZlX3NpZ3NlZ3Y6CisJZm9yY2Vfc2lnc2VndihzaWcsIGN1cnJlbnQpOworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9ydF9mcmFtZShpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdpbmZvX3QgKmluZm8sCisJCQkgICBzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJaW50IGVyciA9IDA7CisJcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZTsKKworCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGthLCByZWdzLCBzaXplb2YocnRfc2lnZnJhbWUpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBzaXplb2YocnRfc2lnZnJhbWUpKSkKKwkJZ290byBnaXZlX3NpZ3NlZ3Y7CisKKwlpZiAoY29weV9zaWdpbmZvX3RvX3VzZXIoJmZyYW1lLT5pbmZvLCBpbmZvKSkKKwkJZ290byBnaXZlX3NpZ3NlZ3Y7CisKKwkvKiBDcmVhdGUgdGhlIHVjb250ZXh0LiAgKi8KKwllcnIgfD0gX19wdXRfdXNlcigwLCAmZnJhbWUtPnVjLnVjX2ZsYWdzKTsKKwllcnIgfD0gX19wdXRfdXNlcigwLCAmZnJhbWUtPnVjLnVjX2xpbmspOworCWVyciB8PSBfX3B1dF91c2VyKCh2b2lkICopY3VycmVudC0+c2FzX3NzX3NwLCAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX3NwKTsKKwllcnIgfD0gX19wdXRfdXNlcihzYXNfc3NfZmxhZ3MocmVncy0+Z3Byc1sxNV0pLAorCQkJICAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX2ZsYWdzKTsKKwllcnIgfD0gX19wdXRfdXNlcihjdXJyZW50LT5zYXNfc3Nfc2l6ZSwgJmZyYW1lLT51Yy51Y19zdGFjay5zc19zaXplKTsKKwllcnIgfD0gc2F2ZV9zaWdyZWdzKHJlZ3MsICZmcmFtZS0+dWMudWNfbWNvbnRleHQpOworCWVyciB8PSBfX2NvcHlfdG9fdXNlcigmZnJhbWUtPnVjLnVjX3NpZ21hc2ssIHNldCwgc2l6ZW9mKCpzZXQpKTsKKwlpZiAoZXJyKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKworCS8qIFNldCB1cCB0byByZXR1cm4gZnJvbSB1c2Vyc3BhY2UuICBJZiBwcm92aWRlZCwgdXNlIGEgc3R1YgorCSAgIGFscmVhZHkgaW4gdXNlcnNwYWNlLiAgKi8KKwlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfUkVTVE9SRVIpIHsKKyAgICAgICAgICAgICAgICByZWdzLT5ncHJzWzE0XSA9ICh1bnNpZ25lZCBsb25nKQorCQkJa2EtPnNhLnNhX3Jlc3RvcmVyIHwgUFNXX0FERFJfQU1PREU7CisJfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZWdzLT5ncHJzWzE0XSA9ICh1bnNpZ25lZCBsb25nKQorCQkJZnJhbWUtPnJldGNvZGUgfCBQU1dfQUREUl9BTU9ERTsKKwkJZXJyIHw9IF9fcHV0X3VzZXIoUzM5MF9TWVNDQUxMX09QQ09ERSB8IF9fTlJfcnRfc2lncmV0dXJuLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgKHUxNiBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUpKTsKKwl9CisKKwkvKiBTZXQgdXAgYmFja2NoYWluLiAqLworCWlmIChfX3B1dF91c2VyKHJlZ3MtPmdwcnNbMTVdLCAoYWRkcl90IF9fdXNlciAqKSBmcmFtZSkpCisJCWdvdG8gZ2l2ZV9zaWdzZWd2OworCisJLyogU2V0IHVwIHJlZ2lzdGVycyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KKwlyZWdzLT5ncHJzWzE1XSA9ICh1bnNpZ25lZCBsb25nKSBmcmFtZTsKKwlyZWdzLT5wc3cuYWRkciA9ICh1bnNpZ25lZCBsb25nKSBrYS0+c2Euc2FfaGFuZGxlciB8IFBTV19BRERSX0FNT0RFOworCisJcmVncy0+Z3Byc1syXSA9IG1hcF9zaWduYWwoc2lnKTsKKwlyZWdzLT5ncHJzWzNdID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+aW5mbzsKKwlyZWdzLT5ncHJzWzRdID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+dWM7CisJcmV0dXJuOworCitnaXZlX3NpZ3NlZ3Y6CisJZm9yY2Vfc2lnc2VndihzaWcsIGN1cnJlbnQpOworfQorCisvKgorICogT0ssIHdlJ3JlIGludm9raW5nIGEgaGFuZGxlcgorICovCQorCitzdGF0aWMgdm9pZAoraGFuZGxlX3NpZ25hbCh1bnNpZ25lZCBsb25nIHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKKwkgICAgICBzaWdpbmZvX3QgKmluZm8sIHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwkvKiBTZXQgdXAgdGhlIHN0YWNrIGZyYW1lICovCisJaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX1NJR0lORk8pCisJCXNldHVwX3J0X2ZyYW1lKHNpZywga2EsIGluZm8sIG9sZHNldCwgcmVncyk7CisJZWxzZQorCQlzZXR1cF9mcmFtZShzaWcsIGthLCBvbGRzZXQsIHJlZ3MpOworCisJaWYgKCEoa2EtPnNhLnNhX2ZsYWdzICYgU0FfTk9ERUZFUikpIHsKKwkJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJCXNpZ29yc2V0cygmY3VycmVudC0+YmxvY2tlZCwmY3VycmVudC0+YmxvY2tlZCwma2EtPnNhLnNhX21hc2spOworCQlzaWdhZGRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsc2lnKTsKKwkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwl9Cit9CisKKy8qCisgKiBOb3RlIHRoYXQgJ2luaXQnIGlzIGEgc3BlY2lhbCBwcm9jZXNzOiBpdCBkb2Vzbid0IGdldCBzaWduYWxzIGl0IGRvZXNuJ3QKKyAqIHdhbnQgdG8gaGFuZGxlLiBUaHVzIHlvdSBjYW5ub3Qga2lsbCBpbml0IGV2ZW4gd2l0aCBhIFNJR0tJTEwgZXZlbiBieQorICogbWlzdGFrZS4KKyAqCisgKiBOb3RlIHRoYXQgd2UgZ28gdGhyb3VnaCB0aGUgc2lnbmFscyB0d2ljZTogb25jZSB0byBjaGVjayB0aGUgc2lnbmFscyB0aGF0CisgKiB0aGUga2VybmVsIGNhbiBoYW5kbGUsIGFuZCB0aGVuIHdlIGJ1aWxkIGFsbCB0aGUgdXNlci1sZXZlbCBzaWduYWwgaGFuZGxpbmcKKyAqIHN0YWNrLWZyYW1lcyBpbiBvbmUgZ28gYWZ0ZXIgdGhhdC4KKyAqLworaW50IGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc2lnc2V0X3QgKm9sZHNldCkKK3sKKwl1bnNpZ25lZCBsb25nIHJldHZhbCA9IDAsIGNvbnRpbnVlX2FkZHIgPSAwLCByZXN0YXJ0X2FkZHIgPSAwOworCXNpZ2luZm9fdCBpbmZvOworCWludCBzaWducjsKKwlzdHJ1Y3Qga19zaWdhY3Rpb24ga2E7CisKKwkvKgorCSAqIFdlIHdhbnQgdGhlIGNvbW1vbiBjYXNlIHRvIGdvIGZhc3QsIHdoaWNoCisJICogaXMgd2h5IHdlIG1heSBpbiBjZXJ0YWluIGNhc2VzIGdldCBoZXJlIGZyb20KKwkgKiBrZXJuZWwgbW9kZS4gSnVzdCByZXR1cm4gd2l0aG91dCBkb2luZyBhbnl0aGluZworCSAqIGlmIHNvLgorCSAqLworCWlmICghdXNlcl9tb2RlKHJlZ3MpKQorCQlyZXR1cm4gMTsKKworCWlmICghb2xkc2V0KQorCQlvbGRzZXQgPSAmY3VycmVudC0+YmxvY2tlZDsKKworCS8qIEFyZSB3ZSBmcm9tIGEgc3lzdGVtIGNhbGw/ICovCisJaWYgKHJlZ3MtPnRyYXAgPT0gX19MQ19TVkNfT0xEX1BTVykgeworCQljb250aW51ZV9hZGRyID0gcmVncy0+cHN3LmFkZHI7CisJCXJlc3RhcnRfYWRkciA9IGNvbnRpbnVlX2FkZHIgLSByZWdzLT5pbGM7CisJCXJldHZhbCA9IHJlZ3MtPmdwcnNbMl07CisKKwkJLyogUHJlcGFyZSBmb3Igc3lzdGVtIGNhbGwgcmVzdGFydC4gIFdlIGRvIHRoaXMgaGVyZSBzbyB0aGF0IGEKKwkJICAgZGVidWdnZXIgd2lsbCBzZWUgdGhlIGFscmVhZHkgY2hhbmdlZCBQU1cuICovCisJCWlmIChyZXR2YWwgPT0gLUVSRVNUQVJUTk9IQU5EIHx8CisJCSAgICByZXR2YWwgPT0gLUVSRVNUQVJUU1lTIHx8CisJCSAgICByZXR2YWwgPT0gLUVSRVNUQVJUTk9JTlRSKSB7CisJCQlyZWdzLT5ncHJzWzJdID0gcmVncy0+b3JpZ19ncHIyOworCQkJcmVncy0+cHN3LmFkZHIgPSByZXN0YXJ0X2FkZHI7CisJCX0gZWxzZSBpZiAocmV0dmFsID09IC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0spIHsKKwkJCXJlZ3MtPmdwcnNbMl0gPSAtRUlOVFI7CisJCX0KKwl9CisKKwkvKiBHZXQgc2lnbmFsIHRvIGRlbGl2ZXIuICBXaGVuIHJ1bm5pbmcgdW5kZXIgcHRyYWNlLCBhdCB0aGlzIHBvaW50CisJICAgdGhlIGRlYnVnZ2VyIG1heSBjaGFuZ2UgYWxsIG91ciByZWdpc3RlcnMgLi4uICovCisJc2lnbnIgPSBnZXRfc2lnbmFsX3RvX2RlbGl2ZXIoJmluZm8sICZrYSwgcmVncywgTlVMTCk7CisKKwkvKiBEZXBlbmRpbmcgb24gdGhlIHNpZ25hbCBzZXR0aW5ncyB3ZSBtYXkgbmVlZCB0byByZXZlcnQgdGhlCisJICAgZGVjaXNpb24gdG8gcmVzdGFydCB0aGUgc3lzdGVtIGNhbGwuICovCisJaWYgKHNpZ25yID4gMCAmJiByZWdzLT5wc3cuYWRkciA9PSByZXN0YXJ0X2FkZHIpIHsKKwkJaWYgKHJldHZhbCA9PSAtRVJFU1RBUlROT0hBTkQKKwkJICAgIHx8IChyZXR2YWwgPT0gLUVSRVNUQVJUU1lTCisJCQkgJiYgIShjdXJyZW50LT5zaWdoYW5kLT5hY3Rpb25bc2lnbnItMV0uc2Euc2FfZmxhZ3MKKwkJCSAgICAgICYgU0FfUkVTVEFSVCkpKSB7CisJCQlyZWdzLT5ncHJzWzJdID0gLUVJTlRSOworCQkJcmVncy0+cHN3LmFkZHIgPSBjb250aW51ZV9hZGRyOworCQl9CisJfQorCisJaWYgKHNpZ25yID4gMCkgeworCQkvKiBXaGVlISAgQWN0dWFsbHkgZGVsaXZlciB0aGUgc2lnbmFsLiAgKi8KKyNpZmRlZiBDT05GSUdfUzM5MF9TVVBQT1JUCisJCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMUJJVCkpIHsKKwkJCWV4dGVybiB2b2lkIGhhbmRsZV9zaWduYWwzMih1bnNpZ25lZCBsb25nIHNpZywKKwkJCQkJCSAgICBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAorCQkJCQkJICAgIHNpZ2luZm9fdCAqaW5mbywKKwkJCQkJCSAgICBzaWdzZXRfdCAqb2xkc2V0LAorCQkJCQkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKwkJCWhhbmRsZV9zaWduYWwzMihzaWduciwgJmthLCAmaW5mbywgb2xkc2V0LCByZWdzKTsKKwkJCXJldHVybiAxOworCSAgICAgICAgfQorI2VuZGlmCisJCWhhbmRsZV9zaWduYWwoc2lnbnIsICZrYSwgJmluZm8sIG9sZHNldCwgcmVncyk7CisJCXJldHVybiAxOworCX0KKworCS8qIFJlc3RhcnQgYSBkaWZmZXJlbnQgc3lzdGVtIGNhbGwuICovCisJaWYgKHJldHZhbCA9PSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLCisJICAgICYmIHJlZ3MtPnBzdy5hZGRyID09IGNvbnRpbnVlX2FkZHIpIHsKKwkJcmVncy0+Z3Byc1syXSA9IF9fTlJfcmVzdGFydF9zeXNjYWxsOworCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1JFU1RBUlRfU1ZDKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NtcC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGZjZjA0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYwpAQCAtMCwwICsxLDg0MCBAQAorLyoKKyAqICBhcmNoL3MzOTAva2VybmVsL3NtcC5jCisgKgorICogIFMzOTAgdmVyc2lvbgorICogICAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgorICogICAgQXV0aG9yKHMpOiBEZW5pcyBKb3NlcGggQmFycm93IChkamJhcnJvd0BkZS5pYm0uY29tLGJhcnJvd19kakB5YWhvby5jb20pLAorICogICAgICAgICAgICAgICBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pCisgKiAgICAgICAgICAgICAgIEhlaWtvIENhcnN0ZW5zIChoZWlrby5jYXJzdGVuc0BkZS5pYm0uY29tKQorICoKKyAqICBiYXNlZCBvbiBvdGhlciBzbXAgc3R1ZmYgYnkgCisgKiAgICAoYykgMTk5NSBBbGFuIENveCwgQ3ltcnVORVQgTHRkICA8YWxhbkBjeW1ydS5uZXQ+CisgKiAgICAoYykgMTk5OCBJbmdvIE1vbG5hcgorICoKKyAqIFdlIHdvcmsgd2l0aCBsb2dpY2FsIGNwdSBudW1iZXJpbmcgZXZlcnl3aGVyZSB3ZSBjYW4uIFRoZSBvbmx5CisgKiBmdW5jdGlvbnMgdXNpbmcgdGhlIHJlYWwgY3B1IGFkZHJlc3MgKGdvdCBmcm9tIFNUQVApIGFyZSB0aGUgc2lncAorICogZnVuY3Rpb25zLiBGb3IgYWxsIG90aGVyIGZ1bmN0aW9ucyB3ZSB1c2UgdGhlIGlkZW50aXR5IG1hcHBpbmcuCisgKiBUaGF0IG1lYW5zIHRoYXQgY3B1X251bWJlcl9tYXBbaV0gPT0gaSBmb3IgZXZlcnkgY3B1LiBjcHVfbnVtYmVyX21hcCBpcworICogdXNlZCBlLmcuIHRvIGZpbmQgdGhlIGlkbGUgdGFzayBiZWxvbmdpbmcgdG8gYSBsb2dpY2FsIGNwdS4gRXZlcnkgYXJyYXkKKyAqIGluIHRoZSBrZXJuZWwgaXMgc29ydGVkIGJ5IHRoZSBsb2dpY2FsIGNwdSBudW1iZXIgYW5kIG5vdCBieSB0aGUgcGh5c2ljYWwKKyAqIG9uZSB3aGljaCBpcyBjYXVzaW5nIGFsbCB0aGUgY29uZnVzaW9uIHdpdGggX19jcHVfbG9naWNhbF9tYXAgYW5kCisgKiBjcHVfbnVtYmVyX21hcCBpbiBvdGhlciBhcmNoaXRlY3R1cmVzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorCisjaW5jbHVkZSA8YXNtL3NpZ3AuaD4KKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vczM5MF9leHQuaD4KKyNpbmNsdWRlIDxhc20vY3BjbWQuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKworLyogcHJvdG90eXBlcyAqLworCitleHRlcm4gdm9sYXRpbGUgaW50IF9fY3B1X2xvZ2ljYWxfbWFwW107CisKKy8qCisgKiBBbiBhcnJheSB3aXRoIGEgcG9pbnRlciB0aGUgbG93Y29yZSBvZiBldmVyeSBDUFUuCisgKi8KKworc3RydWN0IF9sb3djb3JlICpsb3djb3JlX3B0cltOUl9DUFVTXTsKKworY3B1bWFza190IGNwdV9vbmxpbmVfbWFwOworY3B1bWFza190IGNwdV9wb3NzaWJsZV9tYXA7CisKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnJlbnRfc2V0W05SX0NQVVNdOworCitFWFBPUlRfU1lNQk9MKGNwdV9vbmxpbmVfbWFwKTsKKworLyoKKyAqIFJlYm9vdCwgaGFsdCBhbmQgcG93ZXJfb2ZmIHJvdXRpbmVzIGZvciBTTVAuCisgKi8KK2V4dGVybiBjaGFyIHZtaGFsdF9jbWRbXTsKK2V4dGVybiBjaGFyIHZtcG9mZl9jbWRbXTsKKworZXh0ZXJuIHZvaWQgcmVpcGwodW5zaWduZWQgbG9uZyBkZXZubyk7CisKK3N0YXRpYyB2b2lkIHNtcF9leHRfYml0Y2FsbChpbnQsIGVjX2JpdF9zaWcpOworc3RhdGljIHZvaWQgc21wX2V4dF9iaXRjYWxsX290aGVycyhlY19iaXRfc2lnKTsKKworLyoKKyAqIFN0cnVjdHVyZSBhbmQgZGF0YSBmb3Igc21wX2NhbGxfZnVuY3Rpb24oKS4gVGhpcyBpcyBkZXNpZ25lZCB0byBtaW5pbWlzZQorICogc3RhdGljIG1lbW9yeSByZXF1aXJlbWVudHMuIEl0IGFsc28gbG9va3MgY2xlYW5lci4KKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhjYWxsX2xvY2spOworCitzdHJ1Y3QgY2FsbF9kYXRhX3N0cnVjdCB7CisJdm9pZCAoKmZ1bmMpICh2b2lkICppbmZvKTsKKwl2b2lkICppbmZvOworCWF0b21pY190IHN0YXJ0ZWQ7CisJYXRvbWljX3QgZmluaXNoZWQ7CisJaW50IHdhaXQ7Cit9OworCitzdGF0aWMgc3RydWN0IGNhbGxfZGF0YV9zdHJ1Y3QgKiBjYWxsX2RhdGE7CisKKy8qCisgKiAnQ2FsbCBmdW5jdGlvbicgaW50ZXJydXB0IGNhbGxiYWNrCisgKi8KK3N0YXRpYyB2b2lkIGRvX2NhbGxfZnVuY3Rpb24odm9pZCkKK3sKKwl2b2lkICgqZnVuYykgKHZvaWQgKmluZm8pID0gY2FsbF9kYXRhLT5mdW5jOworCXZvaWQgKmluZm8gPSBjYWxsX2RhdGEtPmluZm87CisJaW50IHdhaXQgPSBjYWxsX2RhdGEtPndhaXQ7CisKKwlhdG9taWNfaW5jKCZjYWxsX2RhdGEtPnN0YXJ0ZWQpOworCSgqZnVuYykoaW5mbyk7CisJaWYgKHdhaXQpCisJCWF0b21pY19pbmMoJmNhbGxfZGF0YS0+ZmluaXNoZWQpOworfQorCisvKgorICogdGhpcyBmdW5jdGlvbiBzZW5kcyBhICdnZW5lcmljIGNhbGwgZnVuY3Rpb24nIElQSSB0byBhbGwgb3RoZXIgQ1BVcworICogaW4gdGhlIHN5c3RlbS4KKyAqLworCitpbnQgc21wX2NhbGxfZnVuY3Rpb24gKHZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbyksIHZvaWQgKmluZm8sIGludCBub25hdG9taWMsCisJCQlpbnQgd2FpdCkKKy8qCisgKiBbU1VNTUFSWV0gUnVuIGEgZnVuY3Rpb24gb24gYWxsIG90aGVyIENQVXMuCisgKiA8ZnVuYz4gVGhlIGZ1bmN0aW9uIHRvIHJ1bi4gVGhpcyBtdXN0IGJlIGZhc3QgYW5kIG5vbi1ibG9ja2luZy4KKyAqIDxpbmZvPiBBbiBhcmJpdHJhcnkgcG9pbnRlciB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbi4KKyAqIDxub25hdG9taWM+IGN1cnJlbnRseSB1bnVzZWQuCisgKiA8d2FpdD4gSWYgdHJ1ZSwgd2FpdCAoYXRvbWljYWxseSkgdW50aWwgZnVuY3Rpb24gaGFzIGNvbXBsZXRlZCBvbiBvdGhlciBDUFVzLgorICogW1JFVFVSTlNdIDAgb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIHN0YXR1cyBjb2RlLiBEb2VzIG5vdCByZXR1cm4gdW50aWwKKyAqIHJlbW90ZSBDUFVzIGFyZSBuZWFybHkgcmVhZHkgdG8gZXhlY3V0ZSA8PGZ1bmM+PiBvciBhcmUgb3IgaGF2ZSBleGVjdXRlZC4KKyAqCisgKiBZb3UgbXVzdCBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggZGlzYWJsZWQgaW50ZXJydXB0cyBvciBmcm9tIGEKKyAqIGhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIG9yIGZyb20gYSBib3R0b20gaGFsZiBoYW5kbGVyLgorICovCit7CisJc3RydWN0IGNhbGxfZGF0YV9zdHJ1Y3QgZGF0YTsKKwlpbnQgY3B1cyA9IG51bV9vbmxpbmVfY3B1cygpLTE7CisKKwlpZiAoY3B1cyA8PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIENhbiBkZWFkbG9jayB3aGVuIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgKi8KKwlXQVJOX09OKGlycXNfZGlzYWJsZWQoKSk7CisKKwlkYXRhLmZ1bmMgPSBmdW5jOworCWRhdGEuaW5mbyA9IGluZm87CisJYXRvbWljX3NldCgmZGF0YS5zdGFydGVkLCAwKTsKKwlkYXRhLndhaXQgPSB3YWl0OworCWlmICh3YWl0KQorCQlhdG9taWNfc2V0KCZkYXRhLmZpbmlzaGVkLCAwKTsKKworCXNwaW5fbG9jaygmY2FsbF9sb2NrKTsKKwljYWxsX2RhdGEgPSAmZGF0YTsKKwkvKiBTZW5kIGEgbWVzc2FnZSB0byBhbGwgb3RoZXIgQ1BVcyBhbmQgd2FpdCBmb3IgdGhlbSB0byByZXNwb25kICovCisgICAgICAgIHNtcF9leHRfYml0Y2FsbF9vdGhlcnMoZWNfY2FsbF9mdW5jdGlvbik7CisKKwkvKiBXYWl0IGZvciByZXNwb25zZSAqLworCXdoaWxlIChhdG9taWNfcmVhZCgmZGF0YS5zdGFydGVkKSAhPSBjcHVzKQorCQljcHVfcmVsYXgoKTsKKworCWlmICh3YWl0KQorCQl3aGlsZSAoYXRvbWljX3JlYWQoJmRhdGEuZmluaXNoZWQpICE9IGNwdXMpCisJCQljcHVfcmVsYXgoKTsKKwlzcGluX3VubG9jaygmY2FsbF9sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQ2FsbCBhIGZ1bmN0aW9uIG9uIG9uZSBDUFUKKyAqIGNwdSA6IHRoZSBDUFUgdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBleGVjdXRlZCBvbgorICoKKyAqIFlvdSBtdXN0IG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzIG9yIGZyb20gYQorICogaGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIuIFlvdSBtYXkgY2FsbCBpdCBmcm9tIGEgYm90dG9tIGhhbGYuCisgKgorICogSXQgaXMgZ3VhcmFudGVlZCB0aGF0IHRoZSBjYWxsZWQgZnVuY3Rpb24gcnVucyBvbiB0aGUgc3BlY2lmaWVkIENQVSwKKyAqIHByZWVtcHRpb24gaXMgZGlzYWJsZWQuCisgKi8KK2ludCBzbXBfY2FsbF9mdW5jdGlvbl9vbih2b2lkICgqZnVuYykgKHZvaWQgKmluZm8pLCB2b2lkICppbmZvLAorCQkJIGludCBub25hdG9taWMsIGludCB3YWl0LCBpbnQgY3B1KQoreworCXN0cnVjdCBjYWxsX2RhdGFfc3RydWN0IGRhdGE7CisJaW50IGN1cnJfY3B1OworCisJaWYgKCFjcHVfb25saW5lKGNwdSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogZGlzYWJsZSBwcmVlbXB0aW9uIGZvciBsb2NhbCBmdW5jdGlvbiBjYWxsICovCisJY3Vycl9jcHUgPSBnZXRfY3B1KCk7CisKKwlpZiAoY3Vycl9jcHUgPT0gY3B1KSB7CisJCS8qIGRpcmVjdCBjYWxsIHRvIGZ1bmN0aW9uICovCisJCWZ1bmMoaW5mbyk7CisJCXB1dF9jcHUoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZGF0YS5mdW5jID0gZnVuYzsKKwlkYXRhLmluZm8gPSBpbmZvOworCWF0b21pY19zZXQoJmRhdGEuc3RhcnRlZCwgMCk7CisJZGF0YS53YWl0ID0gd2FpdDsKKwlpZiAod2FpdCkKKwkJYXRvbWljX3NldCgmZGF0YS5maW5pc2hlZCwgMCk7CisKKwlzcGluX2xvY2tfYmgoJmNhbGxfbG9jayk7CisJY2FsbF9kYXRhID0gJmRhdGE7CisJc21wX2V4dF9iaXRjYWxsKGNwdSwgZWNfY2FsbF9mdW5jdGlvbik7CisKKwkvKiBXYWl0IGZvciByZXNwb25zZSAqLworCXdoaWxlIChhdG9taWNfcmVhZCgmZGF0YS5zdGFydGVkKSAhPSAxKQorCQljcHVfcmVsYXgoKTsKKworCWlmICh3YWl0KQorCQl3aGlsZSAoYXRvbWljX3JlYWQoJmRhdGEuZmluaXNoZWQpICE9IDEpCisJCQljcHVfcmVsYXgoKTsKKworCXNwaW5fdW5sb2NrX2JoKCZjYWxsX2xvY2spOworCXB1dF9jcHUoKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc21wX2NhbGxfZnVuY3Rpb25fb24pOworCitzdGF0aWMgaW5saW5lIHZvaWQgZG9fc2VuZF9zdG9wKHZvaWQpCit7CisgICAgICAgIGludCBjcHUsIHJjOworCisgICAgICAgIC8qIHN0b3AgYWxsIHByb2Nlc3NvcnMgKi8KKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlpZiAoY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJCWNvbnRpbnVlOworCQlkbyB7CisJCQlyYyA9IHNpZ25hbF9wcm9jZXNzb3IoY3B1LCBzaWdwX3N0b3ApOworCQl9IHdoaWxlIChyYyA9PSBzaWdwX2J1c3kpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGRvX3N0b3JlX3N0YXR1cyh2b2lkKQoreworICAgICAgICBpbnQgY3B1LCByYzsKKworICAgICAgICAvKiBzdG9yZSBzdGF0dXMgb2YgYWxsIHByb2Nlc3NvcnMgaW4gdGhlaXIgbG93Y29yZXMgKHJlYWwgMCkgKi8KKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlpZiAoY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJCWNvbnRpbnVlOworCQlkbyB7CisJCQlyYyA9IHNpZ25hbF9wcm9jZXNzb3JfcCgKKwkJCQkoX191MzIpKHVuc2lnbmVkIGxvbmcpIGxvd2NvcmVfcHRyW2NwdV0sIGNwdSwKKwkJCQlzaWdwX3N0b3JlX3N0YXR1c19hdF9hZGRyZXNzKTsKKwkJfSB3aGlsZShyYyA9PSBzaWdwX2J1c3kpOworICAgICAgICB9Cit9CisKKy8qCisgKiB0aGlzIGZ1bmN0aW9uIHNlbmRzIGEgJ3N0b3AnIHNpZ3AgdG8gYWxsIG90aGVyIENQVXMgaW4gdGhlIHN5c3RlbS4KKyAqIGl0IGdvZXMgc3RyYWlnaHQgdGhyb3VnaC4KKyAqLwordm9pZCBzbXBfc2VuZF9zdG9wKHZvaWQpCit7CisgICAgICAgIC8qIHdyaXRlIG1hZ2ljIG51bWJlciB0byB6ZXJvIHBhZ2UgKGFic29sdXRlIDApICovCisJbG93Y29yZV9wdHJbc21wX3Byb2Nlc3Nvcl9pZCgpXS0+cGFuaWNfbWFnaWMgPSBfX1BBTklDX01BR0lDOworCisJLyogc3RvcCBvdGhlciBwcm9jZXNzb3JzLiAqLworCWRvX3NlbmRfc3RvcCgpOworCisJLyogc3RvcmUgc3RhdHVzIG9mIG90aGVyIHByb2Nlc3NvcnMuICovCisJZG9fc3RvcmVfc3RhdHVzKCk7Cit9CisKKy8qCisgKiBSZWJvb3QsIGhhbHQgYW5kIHBvd2VyX29mZiByb3V0aW5lcyBmb3IgU01QLgorICovCisKK3N0YXRpYyB2b2lkIGRvX21hY2hpbmVfcmVzdGFydCh2b2lkICogX191bnVzZWQpCit7CisJaW50IGNwdTsKKwlzdGF0aWMgYXRvbWljX3QgY3B1aWQgPSBBVE9NSUNfSU5JVCgtMSk7CisKKwlpZiAoYXRvbWljX2NvbXBhcmVfYW5kX3N3YXAoLTEsIHNtcF9wcm9jZXNzb3JfaWQoKSwgJmNwdWlkKSkKKwkJc2lnbmFsX3Byb2Nlc3NvcihzbXBfcHJvY2Vzc29yX2lkKCksIHNpZ3Bfc3RvcCk7CisKKwkvKiBXYWl0IGZvciBhbGwgb3RoZXIgY3B1cyB0byBlbnRlciBzdG9wcGVkIHN0YXRlICovCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJaWYgKGNwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpCisJCQljb250aW51ZTsKKwkJd2hpbGUoIXNtcF9jcHVfbm90X3J1bm5pbmcoY3B1KSkKKwkJCWNwdV9yZWxheCgpOworCX0KKworCS8qIFN0b3JlIHN0YXR1cyBvZiBvdGhlciBjcHVzLiAqLworCWRvX3N0b3JlX3N0YXR1cygpOworCisJLyoKKwkgKiBGaW5hbGx5IGNhbGwgcmVpcGwuIEJlY2F1c2Ugd2Ugd2FpdGVkIGZvciBhbGwgb3RoZXIKKwkgKiBjcHVzIHRvIGVudGVyIHRoaXMgZnVuY3Rpb24gd2Uga25vdyB0aGF0IHRoZXkgZG8KKwkgKiBub3QgaG9sZCBhbnkgczM5MGlycS1sb2NrcyAodGhlIGNwdXMgaGF2ZSBiZWVuCisJICogaW50ZXJydXB0ZWQgYnkgYW4gZXh0ZXJuYWwgaW50ZXJydXB0IGFuZCBzMzkwaXJxCisJICogbG9ja3MgYXJlIGFsd2F5cyBoZWxkIGRpc2FibGVkKS4KKwkgKi8KKwlpZiAoTUFDSElORV9JU19WTSkKKwkJY3BjbWQgKCJJUEwiLCBOVUxMLCAwKTsKKwllbHNlCisJCXJlaXBsICgweDEwMDAwIHwgUzM5MF9sb3djb3JlLmlwbF9kZXZpY2UpOworfQorCit2b2lkIG1hY2hpbmVfcmVzdGFydF9zbXAoY2hhciAqIF9fdW51c2VkKSAKK3sKKyAgICAgICAgb25fZWFjaF9jcHUoZG9fbWFjaGluZV9yZXN0YXJ0LCBOVUxMLCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQgZG9fd2FpdF9mb3Jfc3RvcCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgY3JbMTZdOworCisJX19jdGxfc3RvcmUoY3IsIDAsIDE1KTsKKwljclswXSAmPSB+MHhmZmZmOworCWNyWzZdID0gMDsKKwlfX2N0bF9sb2FkKGNyLCAwLCAxNSk7CisJZm9yICg7OykKKwkJZW5hYmxlZF93YWl0KCk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX21hY2hpbmVfaGFsdCh2b2lkICogX191bnVzZWQpCit7CisJc3RhdGljIGF0b21pY190IGNwdWlkID0gQVRPTUlDX0lOSVQoLTEpOworCisJaWYgKGF0b21pY19jb21wYXJlX2FuZF9zd2FwKC0xLCBzbXBfcHJvY2Vzc29yX2lkKCksICZjcHVpZCkgPT0gMCkgeworCQlzbXBfc2VuZF9zdG9wKCk7CisJCWlmIChNQUNISU5FX0lTX1ZNICYmIHN0cmxlbih2bWhhbHRfY21kKSA+IDApCisJCQljcGNtZCh2bWhhbHRfY21kLCBOVUxMLCAwKTsKKwkJc2lnbmFsX3Byb2Nlc3NvcihzbXBfcHJvY2Vzc29yX2lkKCksCisJCQkJIHNpZ3Bfc3RvcF9hbmRfc3RvcmVfc3RhdHVzKTsKKwl9CisJZG9fd2FpdF9mb3Jfc3RvcCgpOworfQorCit2b2lkIG1hY2hpbmVfaGFsdF9zbXAodm9pZCkKK3sKKyAgICAgICAgb25fZWFjaF9jcHUoZG9fbWFjaGluZV9oYWx0LCBOVUxMLCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQgZG9fbWFjaGluZV9wb3dlcl9vZmYodm9pZCAqIF9fdW51c2VkKQoreworCXN0YXRpYyBhdG9taWNfdCBjcHVpZCA9IEFUT01JQ19JTklUKC0xKTsKKworCWlmIChhdG9taWNfY29tcGFyZV9hbmRfc3dhcCgtMSwgc21wX3Byb2Nlc3Nvcl9pZCgpLCAmY3B1aWQpID09IDApIHsKKwkJc21wX3NlbmRfc3RvcCgpOworCQlpZiAoTUFDSElORV9JU19WTSAmJiBzdHJsZW4odm1wb2ZmX2NtZCkgPiAwKQorCQkJY3BjbWQodm1wb2ZmX2NtZCwgTlVMTCwgMCk7CisJCXNpZ25hbF9wcm9jZXNzb3Ioc21wX3Byb2Nlc3Nvcl9pZCgpLAorCQkJCSBzaWdwX3N0b3BfYW5kX3N0b3JlX3N0YXR1cyk7CisJfQorCWRvX3dhaXRfZm9yX3N0b3AoKTsKK30KKwordm9pZCBtYWNoaW5lX3Bvd2VyX29mZl9zbXAodm9pZCkKK3sKKyAgICAgICAgb25fZWFjaF9jcHUoZG9fbWFjaGluZV9wb3dlcl9vZmYsIE5VTEwsIDAsIDApOworfQorCisvKgorICogVGhpcyBpcyB0aGUgbWFpbiByb3V0aW5lIHdoZXJlIGNvbW1hbmRzIGlzc3VlZCBieSBvdGhlcgorICogY3B1cyBhcmUgaGFuZGxlZC4KKyAqLworCit2b2lkIGRvX2V4dF9jYWxsX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncywgX191MTYgY29kZSkKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyBiaXRzOworCisgICAgICAgIC8qCisgICAgICAgICAqIGhhbmRsZSBiaXQgc2lnbmFsIGV4dGVybmFsIGNhbGxzCisgICAgICAgICAqCisgICAgICAgICAqIEZvciB0aGUgZWNfc2NoZWR1bGUgc2lnbmFsIHdlIGhhdmUgdG8gZG8gbm90aGluZy4gQWxsIHRoZSB3b3JrCisgICAgICAgICAqIGlzIGRvbmUgYXV0b21hdGljYWxseSB3aGVuIHdlIHJldHVybiBmcm9tIHRoZSBpbnRlcnJ1cHQuCisgICAgICAgICAqLworCWJpdHMgPSB4Y2hnKCZTMzkwX2xvd2NvcmUuZXh0X2NhbGxfZmFzdCwgMCk7CisKKwlpZiAodGVzdF9iaXQoZWNfY2FsbF9mdW5jdGlvbiwgJmJpdHMpKSAKKwkJZG9fY2FsbF9mdW5jdGlvbigpOworfQorCisvKgorICogU2VuZCBhbiBleHRlcm5hbCBjYWxsIHNpZ3AgdG8gYW5vdGhlciBjcHUgYW5kIHJldHVybiB3aXRob3V0IHdhaXRpbmcKKyAqIGZvciBpdHMgY29tcGxldGlvbi4KKyAqLworc3RhdGljIHZvaWQgc21wX2V4dF9iaXRjYWxsKGludCBjcHUsIGVjX2JpdF9zaWcgc2lnKQoreworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgc2lnbmFsaW5nIGJpdCBpbiBsb3djb3JlIG9mIHRhcmdldCBjcHUgYW5kIGtpY2sgaXQKKyAgICAgICAgICovCisJc2V0X2JpdChzaWcsICh1bnNpZ25lZCBsb25nICopICZsb3djb3JlX3B0cltjcHVdLT5leHRfY2FsbF9mYXN0KTsKKwl3aGlsZShzaWduYWxfcHJvY2Vzc29yKGNwdSwgc2lncF9leHRlcm5hbF9jYWxsKSA9PSBzaWdwX2J1c3kpCisJCXVkZWxheSgxMCk7Cit9CisKKy8qCisgKiBTZW5kIGFuIGV4dGVybmFsIGNhbGwgc2lncCB0byBldmVyeSBvdGhlciBjcHUgaW4gdGhlIHN5c3RlbSBhbmQKKyAqIHJldHVybiB3aXRob3V0IHdhaXRpbmcgZm9yIGl0cyBjb21wbGV0aW9uLgorICovCitzdGF0aWMgdm9pZCBzbXBfZXh0X2JpdGNhbGxfb3RoZXJzKGVjX2JpdF9zaWcgc2lnKQoreworICAgICAgICBpbnQgY3B1OworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJaWYgKGNwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNldCBzaWduYWxpbmcgYml0IGluIGxvd2NvcmUgb2YgdGFyZ2V0IGNwdSBhbmQga2ljayBpdAorICAgICAgICAgICAgICAgICAqLworCQlzZXRfYml0KHNpZywgKHVuc2lnbmVkIGxvbmcgKikgJmxvd2NvcmVfcHRyW2NwdV0tPmV4dF9jYWxsX2Zhc3QpOworCQl3aGlsZSAoc2lnbmFsX3Byb2Nlc3NvcihjcHUsIHNpZ3BfZXh0ZXJuYWxfY2FsbCkgPT0gc2lncF9idXN5KQorCQkJdWRlbGF5KDEwKTsKKyAgICAgICAgfQorfQorCisjaWZuZGVmIENPTkZJR19BUkNIX1MzOTBYCisvKgorICogdGhpcyBmdW5jdGlvbiBzZW5kcyBhICdwdXJnZSB0bGInIHNpZ25hbCB0byBhbm90aGVyIENQVS4KKyAqLwordm9pZCBzbXBfcHRsYl9jYWxsYmFjayh2b2lkICppbmZvKQoreworCWxvY2FsX2ZsdXNoX3RsYigpOworfQorCit2b2lkIHNtcF9wdGxiX2FsbCh2b2lkKQoreworICAgICAgICBvbl9lYWNoX2NwdShzbXBfcHRsYl9jYWxsYmFjaywgTlVMTCwgMCwgMSk7Cit9CitFWFBPUlRfU1lNQk9MKHNtcF9wdGxiX2FsbCk7CisjZW5kaWYgLyogISBDT05GSUdfQVJDSF9TMzkwWCAqLworCisvKgorICogdGhpcyBmdW5jdGlvbiBzZW5kcyBhICdyZXNjaGVkdWxlJyBJUEkgdG8gYW5vdGhlciBDUFUuCisgKiBpdCBnb2VzIHN0cmFpZ2h0IHRocm91Z2ggYW5kIHdhc3RlcyBubyB0aW1lIHNlcmlhbGl6aW5nCisgKiBhbnl0aGluZy4gV29yc3QgY2FzZSBpcyB0aGF0IHdlIGxvc2UgYSByZXNjaGVkdWxlIC4uLgorICovCit2b2lkIHNtcF9zZW5kX3Jlc2NoZWR1bGUoaW50IGNwdSkKK3sKKyAgICAgICAgc21wX2V4dF9iaXRjYWxsKGNwdSwgZWNfc2NoZWR1bGUpOworfQorCisvKgorICogcGFyYW1ldGVyIGFyZWEgZm9yIHRoZSBzZXQvY2xlYXIgY29udHJvbCBiaXQgY2FsbGJhY2tzCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisJX191MTYgc3RhcnRfY3RsOworCV9fdTE2IGVuZF9jdGw7CisJdW5zaWduZWQgbG9uZyBvcnZhbHNbMTZdOworCXVuc2lnbmVkIGxvbmcgYW5kdmFsc1sxNl07Cit9IGVjX2NyZWdfbWFza19wYXJtczsKKworLyoKKyAqIGNhbGxiYWNrIGZvciBzZXR0aW5nL2NsZWFyaW5nIGNvbnRyb2wgYml0cworICovCit2b2lkIHNtcF9jdGxfYml0X2NhbGxiYWNrKHZvaWQgKmluZm8pIHsKKwllY19jcmVnX21hc2tfcGFybXMgKnBwOworCXVuc2lnbmVkIGxvbmcgY3JlZ3NbMTZdOworCWludCBpOworCQorCXBwID0gKGVjX2NyZWdfbWFza19wYXJtcyAqKSBpbmZvOworCV9fY3RsX3N0b3JlKGNyZWdzW3BwLT5zdGFydF9jdGxdLCBwcC0+c3RhcnRfY3RsLCBwcC0+ZW5kX2N0bCk7CisJZm9yIChpID0gcHAtPnN0YXJ0X2N0bDsgaSA8PSBwcC0+ZW5kX2N0bDsgaSsrKQorCQljcmVnc1tpXSA9IChjcmVnc1tpXSAmIHBwLT5hbmR2YWxzW2ldKSB8IHBwLT5vcnZhbHNbaV07CisJX19jdGxfbG9hZChjcmVnc1twcC0+c3RhcnRfY3RsXSwgcHAtPnN0YXJ0X2N0bCwgcHAtPmVuZF9jdGwpOworfQorCisvKgorICogU2V0IGEgYml0IGluIGEgY29udHJvbCByZWdpc3RlciBvZiBhbGwgY3B1cworICovCit2b2lkIHNtcF9jdGxfc2V0X2JpdChpbnQgY3IsIGludCBiaXQpIHsKKyAgICAgICAgZWNfY3JlZ19tYXNrX3Bhcm1zIHBhcm1zOworCisJcGFybXMuc3RhcnRfY3RsID0gY3I7CisJcGFybXMuZW5kX2N0bCA9IGNyOworCXBhcm1zLm9ydmFsc1tjcl0gPSAxIDw8IGJpdDsKKwlwYXJtcy5hbmR2YWxzW2NyXSA9IC0xTDsKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwlzbXBfY2FsbF9mdW5jdGlvbihzbXBfY3RsX2JpdF9jYWxsYmFjaywgJnBhcm1zLCAwLCAxKTsKKyAgICAgICAgX19jdGxfc2V0X2JpdChjciwgYml0KTsKKwlwcmVlbXB0X2VuYWJsZSgpOworfQorCisvKgorICogQ2xlYXIgYSBiaXQgaW4gYSBjb250cm9sIHJlZ2lzdGVyIG9mIGFsbCBjcHVzCisgKi8KK3ZvaWQgc21wX2N0bF9jbGVhcl9iaXQoaW50IGNyLCBpbnQgYml0KSB7CisgICAgICAgIGVjX2NyZWdfbWFza19wYXJtcyBwYXJtczsKKworCXBhcm1zLnN0YXJ0X2N0bCA9IGNyOworCXBhcm1zLmVuZF9jdGwgPSBjcjsKKwlwYXJtcy5vcnZhbHNbY3JdID0gMDsKKwlwYXJtcy5hbmR2YWxzW2NyXSA9IH4oMUwgPDwgYml0KTsKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwlzbXBfY2FsbF9mdW5jdGlvbihzbXBfY3RsX2JpdF9jYWxsYmFjaywgJnBhcm1zLCAwLCAxKTsKKyAgICAgICAgX19jdGxfY2xlYXJfYml0KGNyLCBiaXQpOworCXByZWVtcHRfZW5hYmxlKCk7Cit9CisKKy8qCisgKiBMZXRzIGNoZWNrIGhvdyBtYW55IENQVXMgd2UgaGF2ZS4KKyAqLworCit2b2lkCitfX2luaXQgc21wX2NoZWNrX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQoreworCWludCBjcHUsIG51bV9jcHVzOworCV9fdTE2IGJvb3RfY3B1X2FkZHI7CisKKwkvKgorCSAqIGNwdSAwIGlzIHRoZSBib290IGNwdS4gU2VlIHNtcF9wcmVwYXJlX2Jvb3RfY3B1LgorCSAqLworCisJYm9vdF9jcHVfYWRkciA9IFMzOTBfbG93Y29yZS5jcHVfZGF0YS5jcHVfYWRkcjsKKwljdXJyZW50X3RocmVhZF9pbmZvKCktPmNwdSA9IDA7CisJbnVtX2NwdXMgPSAxOworCWZvciAoY3B1ID0gMDsgY3B1IDw9IDY1NTM1ICYmIG51bV9jcHVzIDwgbWF4X2NwdXM7IGNwdSsrKSB7CisJCWlmICgoX191MTYpIGNwdSA9PSBib290X2NwdV9hZGRyKQorCQkJY29udGludWU7CisJCV9fY3B1X2xvZ2ljYWxfbWFwW251bV9jcHVzXSA9IChfX3UxNikgY3B1OworCQlpZiAoc2lnbmFsX3Byb2Nlc3NvcihudW1fY3B1cywgc2lncF9zZW5zZSkgPT0KKwkJICAgIHNpZ3Bfbm90X29wZXJhdGlvbmFsKQorCQkJY29udGludWU7CisJCWNwdV9zZXQobnVtX2NwdXMsIGNwdV9wcmVzZW50X21hcCk7CisJCW51bV9jcHVzKys7CisJfQorCisJZm9yIChjcHUgPSAxOyBjcHUgPCBtYXhfY3B1czsgY3B1KyspCisJCWNwdV9zZXQoY3B1LCBjcHVfcG9zc2libGVfbWFwKTsKKworCXByaW50aygiRGV0ZWN0ZWQgJWQgQ1BVJ3NcbiIsKGludCkgbnVtX2NwdXMpOworCXByaW50aygiQm9vdCBjcHUgYWRkcmVzcyAlMlhcbiIsIGJvb3RfY3B1X2FkZHIpOworfQorCisvKgorICogICAgICBBY3RpdmF0ZSBhIHNlY29uZGFyeSBwcm9jZXNzb3IuCisgKi8KK2V4dGVybiB2b2lkIGluaXRfY3B1X3RpbWVyKHZvaWQpOworZXh0ZXJuIHZvaWQgaW5pdF9jcHVfdnRpbWVyKHZvaWQpOworZXh0ZXJuIGludCBwZmF1bHRfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHBmYXVsdF9maW5pKHZvaWQpOworCitpbnQgX19kZXZpbml0IHN0YXJ0X3NlY29uZGFyeSh2b2lkICpjcHV2b2lkKQoreworICAgICAgICAvKiBTZXR1cCB0aGUgY3B1ICovCisgICAgICAgIGNwdV9pbml0KCk7CisgICAgICAgIC8qIGluaXQgcGVyIENQVSB0aW1lciAqLworICAgICAgICBpbml0X2NwdV90aW1lcigpOworI2lmZGVmIENPTkZJR19WSVJUX1RJTUVSCisgICAgICAgIGluaXRfY3B1X3Z0aW1lcigpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1BGQVVMVAorCS8qIEVuYWJsZSBwZmF1bHQgcHNldWRvIHBhZ2UgZmF1bHRzIG9uIHRoaXMgY3B1LiAqLworCXBmYXVsdF9pbml0KCk7CisjZW5kaWYKKwkvKiBNYXJrIHRoaXMgY3B1IGFzIG9ubGluZSAqLworCWNwdV9zZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHVfb25saW5lX21hcCk7CisJLyogU3dpdGNoIG9uIGludGVycnVwdHMgKi8KKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisgICAgICAgIC8qIFByaW50IGluZm8gYWJvdXQgdGhpcyBwcm9jZXNzb3IgKi8KKyAgICAgICAgcHJpbnRfY3B1X2luZm8oJlMzOTBfbG93Y29yZS5jcHVfZGF0YSk7CisgICAgICAgIC8qIGNwdV9pZGxlIHdpbGwgY2FsbCBzY2hlZHVsZSBmb3IgdXMgKi8KKyAgICAgICAgY3B1X2lkbGUoKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzbXBfY3JlYXRlX2lkbGUodW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CisKKwkvKgorCSAqICBkb24ndCBjYXJlIGFib3V0IHRoZSBwc3cgYW5kIHJlZ3Mgc2V0dGluZ3Mgc2luY2Ugd2UnbGwgbmV2ZXIKKwkgKiAgcmVzY2hlZHVsZSB0aGUgZm9ya2VkIHRhc2suCisJICovCisJcCA9IGZvcmtfaWRsZShjcHUpOworCWlmIChJU19FUlIocCkpCisJCXBhbmljKCJmYWlsZWQgZm9yayBmb3IgQ1BVICV1OiAlbGkiLCBjcHUsIFBUUl9FUlIocCkpOworCWN1cnJlbnRfc2V0W2NwdV0gPSBwOworfQorCisvKiBSZXNlcnZpbmcgYW5kIHJlbGVhc2luZyBvZiBDUFVzICovCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc21wX3Jlc2VydmVfbG9jayk7CitzdGF0aWMgaW50IHNtcF9jcHVfcmVzZXJ2ZWRbTlJfQ1BVU107CisKK2ludAorc21wX2dldF9jcHUoY3B1bWFza190IGNwdV9tYXNrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNwdTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzbXBfcmVzZXJ2ZV9sb2NrLCBmbGFncyk7CisJLyogVHJ5IHRvIGZpbmQgYW4gYWxyZWFkeSByZXNlcnZlZCBjcHUuICovCisJZm9yX2VhY2hfY3B1X21hc2soY3B1LCBjcHVfbWFzaykgeworCQlpZiAoc21wX2NwdV9yZXNlcnZlZFtjcHVdICE9IDApIHsKKwkJCXNtcF9jcHVfcmVzZXJ2ZWRbY3B1XSsrOworCQkJLyogRm91bmQgb25lLiAqLworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJLyogUmVzZXJ2ZSBhIG5ldyBjcHUgZnJvbSBjcHVfbWFzay4gKi8KKwlmb3JfZWFjaF9jcHVfbWFzayhjcHUsIGNwdV9tYXNrKSB7CisJCWlmIChjcHVfb25saW5lKGNwdSkpIHsKKwkJCXNtcF9jcHVfcmVzZXJ2ZWRbY3B1XSsrOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJY3B1ID0gLUVOT0RFVjsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbXBfcmVzZXJ2ZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIGNwdTsKK30KKwordm9pZAorc21wX3B1dF9jcHUoaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNtcF9yZXNlcnZlX2xvY2ssIGZsYWdzKTsKKwlzbXBfY3B1X3Jlc2VydmVkW2NwdV0tLTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbXBfcmVzZXJ2ZV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitjcHVfc3RvcHBlZChpbnQgY3B1KQoreworCV9fdTMyIHN0YXR1czsKKworCS8qIENoZWNrIGZvciBzdG9wcGVkIHN0YXRlICovCisJaWYgKHNpZ25hbF9wcm9jZXNzb3JfcHMoJnN0YXR1cywgMCwgY3B1LCBzaWdwX3NlbnNlKSA9PSBzaWdwX3N0YXR1c19zdG9yZWQpIHsKKwkJaWYgKHN0YXR1cyAmIDB4NDApCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFVwcGluZyBhbmQgZG93bmluZyBvZiBDUFVzICovCisKK2ludAorX19jcHVfdXAodW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGU7CisgICAgICAgIHN0cnVjdCBfbG93Y29yZSAgICAqY3B1X2xvd2NvcmU7CisJc3RydWN0IHN0YWNrX2ZyYW1lICpzZjsKKyAgICAgICAgc2lncF9jY29kZSAgICAgICAgICBjY29kZTsKKwlpbnQgICAgICAgICAgICAgICAgIGN1cnJfY3B1OworCisJZm9yIChjdXJyX2NwdSA9IDA7IGN1cnJfY3B1IDw9IDY1NTM1OyBjdXJyX2NwdSsrKSB7CisJCV9fY3B1X2xvZ2ljYWxfbWFwW2NwdV0gPSAoX191MTYpIGN1cnJfY3B1OworCQlpZiAoY3B1X3N0b3BwZWQoY3B1KSkKKwkJCWJyZWFrOworCX0KKworCWlmICghY3B1X3N0b3BwZWQoY3B1KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljY29kZSA9IHNpZ25hbF9wcm9jZXNzb3JfcCgoX191MzIpKHVuc2lnbmVkIGxvbmcpKGxvd2NvcmVfcHRyW2NwdV0pLAorCQkJCSAgIGNwdSwgc2lncF9zZXRfcHJlZml4KTsKKwlpZiAoY2NvZGUpeworCQlwcmludGsoInNpZ3Bfc2V0X3ByZWZpeCBmYWlsZWQgZm9yIGNwdSAlZCAiCisJCSAgICAgICAid2l0aCBjb25kaXRpb24gY29kZSAlZFxuIiwKKwkJICAgICAgIChpbnQpIGNwdSwgKGludCkgY2NvZGUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZGxlID0gY3VycmVudF9zZXRbY3B1XTsKKyAgICAgICAgY3B1X2xvd2NvcmUgPSBsb3djb3JlX3B0cltjcHVdOworCWNwdV9sb3djb3JlLT5rZXJuZWxfc3RhY2sgPSAodW5zaWduZWQgbG9uZykKKwkJaWRsZS0+dGhyZWFkX2luZm8gKyAoVEhSRUFEX1NJWkUpOworCXNmID0gKHN0cnVjdCBzdGFja19mcmFtZSAqKSAoY3B1X2xvd2NvcmUtPmtlcm5lbF9zdGFjaworCQkJCSAgICAgLSBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpCisJCQkJICAgICAtIHNpemVvZihzdHJ1Y3Qgc3RhY2tfZnJhbWUpKTsKKwltZW1zZXQoc2YsIDAsIHNpemVvZihzdHJ1Y3Qgc3RhY2tfZnJhbWUpKTsKKwlzZi0+Z3Byc1s5XSA9ICh1bnNpZ25lZCBsb25nKSBzZjsKKwljcHVfbG93Y29yZS0+c2F2ZV9hcmVhWzE1XSA9ICh1bnNpZ25lZCBsb25nKSBzZjsKKwlfX2N0bF9zdG9yZShjcHVfbG93Y29yZS0+Y3JlZ3Nfc2F2ZV9hcmVhWzBdLCAwLCAxNSk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oInN0YW0gIDAsMTUsMCglMCkiCisJCQkgICAgIDogOiAiYSIgKCZjcHVfbG93Y29yZS0+YWNjZXNzX3JlZ3Nfc2F2ZV9hcmVhKQorCQkJICAgICA6ICJtZW1vcnkiKTsKKwljcHVfbG93Y29yZS0+cGVyY3B1X29mZnNldCA9IF9fcGVyX2NwdV9vZmZzZXRbY3B1XTsKKyAgICAgICAgY3B1X2xvd2NvcmUtPmN1cnJlbnRfdGFzayA9ICh1bnNpZ25lZCBsb25nKSBpZGxlOworICAgICAgICBjcHVfbG93Y29yZS0+Y3B1X2RhdGEuY3B1X25yID0gY3B1OworCWVpZWlvKCk7CisJc2lnbmFsX3Byb2Nlc3NvcihjcHUsc2lncF9yZXN0YXJ0KTsKKworCXdoaWxlICghY3B1X29ubGluZShjcHUpKQorCQljcHVfcmVsYXgoKTsKKwlyZXR1cm4gMDsKK30KKworaW50CitfX2NwdV9kaXNhYmxlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwllY19jcmVnX21hc2tfcGFybXMgY3JfcGFybXM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc21wX3Jlc2VydmVfbG9jaywgZmxhZ3MpOworCWlmIChzbXBfY3B1X3Jlc2VydmVkW3NtcF9wcm9jZXNzb3JfaWQoKV0gIT0gMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbXBfcmVzZXJ2ZV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisjaWZkZWYgQ09ORklHX1BGQVVMVAorCS8qIERpc2FibGUgcGZhdWx0IHBzZXVkbyBwYWdlIGZhdWx0cyBvbiB0aGlzIGNwdS4gKi8KKwlwZmF1bHRfZmluaSgpOworI2VuZGlmCisKKwkvKiBkaXNhYmxlIGFsbCBleHRlcm5hbCBpbnRlcnJ1cHRzICovCisKKwljcl9wYXJtcy5zdGFydF9jdGwgPSAwOworCWNyX3Bhcm1zLmVuZF9jdGwgPSAwOworCWNyX3Bhcm1zLm9ydmFsc1swXSA9IDA7CisJY3JfcGFybXMuYW5kdmFsc1swXSA9IH4oMTw8MTUgfCAxPDwxNCB8IDE8PDEzIHwgMTw8MTIgfAorCQkJCTE8PDExIHwgMTw8MTAgfCAxPDwgNiB8IDE8PCA0KTsKKwlzbXBfY3RsX2JpdF9jYWxsYmFjaygmY3JfcGFybXMpOworCisJLyogZGlzYWJsZSBhbGwgSS9PIGludGVycnVwdHMgKi8KKworCWNyX3Bhcm1zLnN0YXJ0X2N0bCA9IDY7CisJY3JfcGFybXMuZW5kX2N0bCA9IDY7CisJY3JfcGFybXMub3J2YWxzWzZdID0gMDsKKwljcl9wYXJtcy5hbmR2YWxzWzZdID0gfigxPDwzMSB8IDE8PDMwIHwgMTw8MjkgfCAxPDwyOCB8CisJCQkJMTw8MjcgfCAxPDwyNiB8IDE8PDI1IHwgMTw8MjQpOworCXNtcF9jdGxfYml0X2NhbGxiYWNrKCZjcl9wYXJtcyk7CisKKwkvKiBkaXNhYmxlIG1vc3QgbWFjaGluZSBjaGVja3MgKi8KKworCWNyX3Bhcm1zLnN0YXJ0X2N0bCA9IDE0OworCWNyX3Bhcm1zLmVuZF9jdGwgPSAxNDsKKwljcl9wYXJtcy5vcnZhbHNbMTRdID0gMDsKKwljcl9wYXJtcy5hbmR2YWxzWzE0XSA9IH4oMTw8MjggfCAxPDwyNyB8IDE8PDI2IHwgMTw8MjUgfCAxPDwyNCk7CisJc21wX2N0bF9iaXRfY2FsbGJhY2soJmNyX3Bhcm1zKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNtcF9yZXNlcnZlX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZAorX19jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpCit7CisJLyogV2FpdCB1bnRpbCB0YXJnZXQgY3B1IGlzIGRvd24gKi8KKwl3aGlsZSAoIXNtcF9jcHVfbm90X3J1bm5pbmcoY3B1KSkKKwkJY3B1X3JlbGF4KCk7CisJcHJpbnRrKCJQcm9jZXNzb3IgJWQgc3B1biBkb3duXG4iLCBjcHUpOworfQorCit2b2lkCitjcHVfZGllKHZvaWQpCit7CisJaWRsZV90YXNrX2V4aXQoKTsKKwlzaWduYWxfcHJvY2Vzc29yKHNtcF9wcm9jZXNzb3JfaWQoKSwgc2lncF9zdG9wKTsKKwlCVUcoKTsKKwlmb3IoOzspOworfQorCisvKgorICoJQ3ljbGUgdGhyb3VnaCB0aGUgcHJvY2Vzc29ycyBhbmQgc2V0dXAgc3RydWN0dXJlcy4KKyAqLworCit2b2lkIF9faW5pdCBzbXBfcHJlcGFyZV9jcHVzKHVuc2lnbmVkIGludCBtYXhfY3B1cykKK3sKKwl1bnNpZ25lZCBsb25nIHN0YWNrOworCXVuc2lnbmVkIGludCBjcHU7CisgICAgICAgIGludCBpOworCisgICAgICAgIC8qIHJlcXVlc3QgdGhlIDB4MTIwMiBleHRlcm5hbCBpbnRlcnJ1cHQgKi8KKyAgICAgICAgaWYgKHJlZ2lzdGVyX2V4dGVybmFsX2ludGVycnVwdCgweDEyMDIsIGRvX2V4dF9jYWxsX2ludGVycnVwdCkgIT0gMCkKKyAgICAgICAgICAgICAgICBwYW5pYygiQ291bGRuJ3QgcmVxdWVzdCBleHRlcm5hbCBpbnRlcnJ1cHQgMHgxMjAyIik7CisgICAgICAgIHNtcF9jaGVja19jcHVzKG1heF9jcHVzKTsKKyAgICAgICAgbWVtc2V0KGxvd2NvcmVfcHRyLDAsc2l6ZW9mKGxvd2NvcmVfcHRyKSk7ICAKKyAgICAgICAgLyoKKyAgICAgICAgICogIEluaXRpYWxpemUgcHJlZml4IHBhZ2VzIGFuZCBzdGFja3MgZm9yIGFsbCBwb3NzaWJsZSBjcHVzCisgICAgICAgICAqLworCXByaW50X2NwdV9pbmZvKCZTMzkwX2xvd2NvcmUuY3B1X2RhdGEpOworCisgICAgICAgIGZvcihpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlpZiAoIWNwdV9wb3NzaWJsZShpKSkKKwkJCWNvbnRpbnVlOworCQlsb3djb3JlX3B0cltpXSA9IChzdHJ1Y3QgX2xvd2NvcmUgKikKKwkJCV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTHxHRlBfRE1BLCAKKwkJCQkJc2l6ZW9mKHZvaWQqKSA9PSA4ID8gMSA6IDApOworCQlzdGFjayA9IF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCxBU1lOQ19PUkRFUik7CisJCWlmIChsb3djb3JlX3B0cltpXSA9PSBOVUxMIHx8IHN0YWNrID09IDBVTEwpCisJCQlwYW5pYygic21wX2Jvb3RfY3B1cyBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKKworCQkqKGxvd2NvcmVfcHRyW2ldKSA9IFMzOTBfbG93Y29yZTsKKwkJbG93Y29yZV9wdHJbaV0tPmFzeW5jX3N0YWNrID0gc3RhY2sgKyAoQVNZTkNfU0laRSk7CisjaWZkZWYgQ09ORklHX0NIRUNLX1NUQUNLCisJCXN0YWNrID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLDApOworCQlpZiAoc3RhY2sgPT0gMFVMTCkKKwkJCXBhbmljKCJzbXBfYm9vdF9jcHVzIGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlsb3djb3JlX3B0cltpXS0+cGFuaWNfc3RhY2sgPSBzdGFjayArIChQQUdFX1NJWkUpOworI2VuZGlmCisJfQorCXNldF9wcmVmaXgoKHUzMikodW5zaWduZWQgbG9uZykgbG93Y29yZV9wdHJbc21wX3Byb2Nlc3Nvcl9pZCgpXSk7CisKKwlmb3JfZWFjaF9jcHUoY3B1KQorCQlpZiAoY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJCXNtcF9jcmVhdGVfaWRsZShjcHUpOworfQorCit2b2lkIF9fZGV2aW5pdCBzbXBfcHJlcGFyZV9ib290X2NwdSh2b2lkKQoreworCUJVR19PTihzbXBfcHJvY2Vzc29yX2lkKCkgIT0gMCk7CisKKwljcHVfc2V0KDAsIGNwdV9vbmxpbmVfbWFwKTsKKwljcHVfc2V0KDAsIGNwdV9wcmVzZW50X21hcCk7CisJY3B1X3NldCgwLCBjcHVfcG9zc2libGVfbWFwKTsKKwlTMzkwX2xvd2NvcmUucGVyY3B1X29mZnNldCA9IF9fcGVyX2NwdV9vZmZzZXRbMF07CisJY3VycmVudF9zZXRbMF0gPSBjdXJyZW50OworfQorCit2b2lkIHNtcF9jcHVzX2RvbmUodW5zaWduZWQgaW50IG1heF9jcHVzKQoreworCWNwdV9wcmVzZW50X21hcCA9IGNwdV9wb3NzaWJsZV9tYXA7Cit9CisKKy8qCisgKiB0aGUgZnJlcXVlbmN5IG9mIHRoZSBwcm9maWxpbmcgdGltZXIgY2FuIGJlIGNoYW5nZWQKKyAqIGJ5IHdyaXRpbmcgYSBtdWx0aXBsaWVyIHZhbHVlIGludG8gL3Byb2MvcHJvZmlsZS4KKyAqCisgKiB1c3VhbGx5IHlvdSB3YW50IHRvIHJ1biB0aGlzIG9uIGFsbCBDUFVzIDspCisgKi8KK2ludCBzZXR1cF9wcm9maWxpbmdfdGltZXIodW5zaWduZWQgaW50IG11bHRpcGxpZXIpCit7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdSwgY3B1X2RldmljZXMpOworCitzdGF0aWMgaW50IF9faW5pdCB0b3BvbG9neV9pbml0KHZvaWQpCit7CisJaW50IGNwdTsKKwlpbnQgcmV0OworCisJZm9yX2VhY2hfY3B1KGNwdSkgeworCQlyZXQgPSByZWdpc3Rlcl9jcHUoJnBlcl9jcHUoY3B1X2RldmljZXMsIGNwdSksIGNwdSwgTlVMTCk7CisJCWlmIChyZXQpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0b3BvbG9neV9pbml0OiByZWdpc3Rlcl9jcHUgJWQgIgorCQkJICAgICAgICJmYWlsZWQgKCVkKVxuIiwgY3B1LCByZXQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3Vic3lzX2luaXRjYWxsKHRvcG9sb2d5X2luaXQpOworCitFWFBPUlRfU1lNQk9MKGNwdV9wb3NzaWJsZV9tYXApOworRVhQT1JUX1NZTUJPTChsb3djb3JlX3B0cik7CitFWFBPUlRfU1lNQk9MKHNtcF9jdGxfc2V0X2JpdCk7CitFWFBPUlRfU1lNQk9MKHNtcF9jdGxfY2xlYXJfYml0KTsKK0VYUE9SVF9TWU1CT0woc21wX2NhbGxfZnVuY3Rpb24pOworRVhQT1JUX1NZTUJPTChzbXBfZ2V0X2NwdSk7CitFWFBPUlRfU1lNQk9MKHNtcF9wdXRfY3B1KTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zeXNfczM5MC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zeXNfczM5MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZTZiODMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL3N5c19zMzkwLmMKQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiAgYXJjaC9zMzkwL2tlcm5lbC9zeXNfczM5MC5jCisgKgorICogIFMzOTAgdmVyc2lvbgorICogICAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgorICogICAgQXV0aG9yKHMpOiBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pLAorICogICAgICAgICAgICAgICBUaG9tYXMgU3BhdHppZXIgKHRzcGF0QGRlLmlibS5jb20pCisgKgorICogIERlcml2ZWQgZnJvbSAiYXJjaC9pMzg2L2tlcm5lbC9zeXNfaTM4Ni5jIgorICoKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgdmFyaW91cyByYW5kb20gc3lzdGVtIGNhbGxzIHRoYXQKKyAqICBoYXZlIGEgbm9uLXN0YW5kYXJkIGNhbGxpbmcgc2VxdWVuY2Ugb24gdGhlIExpbnV4L3MzOTAKKyAqICBwbGF0Zm9ybS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tc2cuaD4KKyNpbmNsdWRlIDxsaW51eC9zaG0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpZmRlZiBDT05GSUdfQVJDSF9TMzkwWAorI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CisjZW5kaWYgLyogQ09ORklHX0FSQ0hfUzM5MFggKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lwYy5oPgorCisvKgorICogc3lzX3BpcGUoKSBpcyB0aGUgbm9ybWFsIEMgY2FsbGluZyBzdGFuZGFyZCBmb3IgY3JlYXRpbmcKKyAqIGEgcGlwZS4gSXQncyBub3QgdGhlIHdheSBVbml4IHRyYWRpdGlvbmFsbHkgZG9lcyB0aGlzLCB0aG91Z2guCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfcGlwZSh1bnNpZ25lZCBsb25nIF9fdXNlciAqZmlsZGVzKQoreworCWludCBmZFsyXTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGRvX3BpcGUoZmQpOworCWlmICghZXJyb3IpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihmaWxkZXMsIGZkLCAyKnNpemVvZihpbnQpKSkKKwkJCWVycm9yID0gLUVGQVVMVDsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCisvKiBjb21tb24gY29kZSBmb3Igb2xkIGFuZCBuZXcgbW1hcHMgKi8KK3N0YXRpYyBpbmxpbmUgbG9uZyBkb19tbWFwMigKKwl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAorCXVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKKwl1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQoreworCWxvbmcgZXJyb3IgPSAtRUJBREY7CisJc3RydWN0IGZpbGUgKiBmaWxlID0gTlVMTDsKKworCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKKwlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7CisJCWZpbGUgPSBmZ2V0KGZkKTsKKwkJaWYgKCFmaWxlKQorCQkJZ290byBvdXQ7CisJfQorCisJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCisJaWYgKGZpbGUpCisJCWZwdXQoZmlsZSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogUGVyZm9ybSB0aGUgc2VsZWN0KG5kLCBpbiwgb3V0LCBleCwgdHYpIGFuZCBtbWFwKCkgc3lzdGVtCisgKiBjYWxscy4gTGludXggZm9yIFMvMzkwIGlzbid0IGFibGUgdG8gaGFuZGxlIG1vcmUgdGhhbiA1CisgKiBzeXN0ZW0gY2FsbCBwYXJhbWV0ZXJzLCBzbyB0aGVzZSBzeXN0ZW0gY2FsbHMgdXNlZCBhIG1lbW9yeQorICogYmxvY2sgZm9yIHBhcmFtZXRlciBwYXNzaW5nLi4KKyAqLworCitzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdW5zaWduZWQgbG9uZyBsZW47CisJdW5zaWduZWQgbG9uZyBwcm90OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmZDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKK307CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfbW1hcDIoc3RydWN0IG1tYXBfYXJnX3N0cnVjdCBfX3VzZXIgICphcmcpCit7CisJc3RydWN0IG1tYXBfYXJnX3N0cnVjdCBhOworCWludCBlcnJvciA9IC1FRkFVTFQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmEsIGFyZywgc2l6ZW9mKGEpKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkb19tbWFwMihhLmFkZHIsIGEubGVuLCBhLnByb3QsIGEuZmxhZ3MsIGEuZmQsIGEub2Zmc2V0KTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBvbGRfbW1hcChzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0IF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3QgYTsKKwlsb25nIGVycm9yID0gLUVGQVVMVDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmYSwgYXJnLCBzaXplb2YoYSkpKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gLUVJTlZBTDsKKwlpZiAoYS5vZmZzZXQgJiB+UEFHRV9NQVNLKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gZG9fbW1hcDIoYS5hZGRyLCBhLmxlbiwgYS5wcm90LCBhLmZsYWdzLCBhLmZkLCBhLm9mZnNldCA+PiBQQUdFX1NISUZUKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKKyNpZm5kZWYgQ09ORklHX0FSQ0hfUzM5MFgKK3N0cnVjdCBzZWxfYXJnX3N0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBuOworCWZkX3NldCAqaW5wLCAqb3V0cCwgKmV4cDsKKwlzdHJ1Y3QgdGltZXZhbCAqdHZwOworfTsKKworYXNtbGlua2FnZSBsb25nIG9sZF9zZWxlY3Qoc3RydWN0IHNlbF9hcmdfc3RydWN0IF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBzZWxfYXJnX3N0cnVjdCBhOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZhLCBhcmcsIHNpemVvZihhKSkpCisJCXJldHVybiAtRUZBVUxUOworCS8qIHN5c19zZWxlY3QoKSBkb2VzIHRoZSBhcHByb3ByaWF0ZSBrZXJuZWwgbG9ja2luZyAqLworCXJldHVybiBzeXNfc2VsZWN0KGEubiwgYS5pbnAsIGEub3V0cCwgYS5leHAsIGEudHZwKTsKKworfQorI2VuZGlmIC8qIENPTkZJR19BUkNIX1MzOTBYICovCisKKy8qCisgKiBzeXNfaXBjKCkgaXMgdGhlIGRlLW11bHRpcGxleGVyIGZvciB0aGUgU3lzViBJUEMgY2FsbHMuLgorICoKKyAqIFRoaXMgaXMgcmVhbGx5IGhvcnJpYmx5IHVnbHkuCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfaXBjKHVpbnQgY2FsbCwgaW50IGZpcnN0LCB1bnNpZ25lZCBsb25nIHNlY29uZCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgdGhpcmQsIHZvaWQgX191c2VyICpwdHIpCit7CisgICAgICAgIHN0cnVjdCBpcGNfa2x1ZGdlIHRtcDsKKwlpbnQgcmV0OworCisgICAgICAgIHN3aXRjaCAoY2FsbCkgeworICAgICAgICBjYXNlIFNFTU9QOgorCQlyZXR1cm4gc3lzX3NlbXRpbWVkb3AoZmlyc3QsIChzdHJ1Y3Qgc2VtYnVmIF9fdXNlciAqKXB0ciwKKwkJCQkgICAgICAgKHVuc2lnbmVkKXNlY29uZCwgTlVMTCk7CisJY2FzZSBTRU1USU1FRE9QOgorCQlyZXR1cm4gc3lzX3NlbXRpbWVkb3AoZmlyc3QsIChzdHJ1Y3Qgc2VtYnVmIF9fdXNlciAqKXB0ciwKKwkJCQkgICAgICAgKHVuc2lnbmVkKXNlY29uZCwKKwkJCQkgICAgICAgKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKikgdGhpcmQpOworICAgICAgICBjYXNlIFNFTUdFVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3lzX3NlbWdldChmaXJzdCwgKGludClzZWNvbmQsIHRoaXJkKTsKKyAgICAgICAgY2FzZSBTRU1DVEw6IHsKKyAgICAgICAgICAgICAgICB1bmlvbiBzZW11biBmb3VydGg7CisgICAgICAgICAgICAgICAgaWYgKCFwdHIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIoZm91cnRoLl9fcGFkLCAodm9pZCBfX3VzZXIgKiBfX3VzZXIgKikgcHRyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICAgICAgICAgIHJldHVybiBzeXNfc2VtY3RsKGZpcnN0LCAoaW50KXNlY29uZCwgdGhpcmQsIGZvdXJ0aCk7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBNU0dTTkQ6CisJCXJldHVybiBzeXNfbXNnc25kIChmaXJzdCwgKHN0cnVjdCBtc2didWYgX191c2VyICopIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdClzZWNvbmQsIHRoaXJkKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgTVNHUkNWOgorICAgICAgICAgICAgICAgIGlmICghcHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyICgmdG1wLCAoc3RydWN0IGlwY19rbHVkZ2UgX191c2VyICopIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IGlwY19rbHVkZ2UpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICAgICAgICAgIHJldHVybiBzeXNfbXNncmN2IChmaXJzdCwgdG1wLm1zZ3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3Qpc2Vjb25kLCB0bXAubXNndHlwLCB0aGlyZCk7CisgICAgICAgIGNhc2UgTVNHR0VUOgorICAgICAgICAgICAgICAgIHJldHVybiBzeXNfbXNnZ2V0KChrZXlfdClmaXJzdCwgKGludClzZWNvbmQpOworICAgICAgICBjYXNlIE1TR0NUTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3lzX21zZ2N0bChmaXJzdCwgKGludClzZWNvbmQsCisJCQkJICAgKHN0cnVjdCBtc3FpZF9kcyBfX3VzZXIgKilwdHIpOworCisJY2FzZSBTSE1BVDogeworCQl1bG9uZyByYWRkcjsKKwkJcmV0ID0gZG9fc2htYXQoZmlyc3QsIChjaGFyIF9fdXNlciAqKXB0ciwKKwkJCQkoaW50KXNlY29uZCwgJnJhZGRyKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXJldHVybiBwdXRfdXNlciAocmFkZHIsICh1bG9uZyBfX3VzZXIgKikgdGhpcmQpOworCQlicmVhazsKKyAgICAgICAgfQorCWNhc2UgU0hNRFQ6CisJCXJldHVybiBzeXNfc2htZHQgKChjaGFyIF9fdXNlciAqKXB0cik7CisJY2FzZSBTSE1HRVQ6CisJCXJldHVybiBzeXNfc2htZ2V0KGZpcnN0LCAoc2l6ZV90KXNlY29uZCwgdGhpcmQpOworCWNhc2UgU0hNQ1RMOgorCQlyZXR1cm4gc3lzX3NobWN0bChmaXJzdCwgKGludClzZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc2htaWRfZHMgX191c2VyICopIHB0cik7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9TWVM7CisKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworI2lmZGVmIENPTkZJR19BUkNIX1MzOTBYCithc21saW5rYWdlIGxvbmcgczM5MHhfbmV3dW5hbWUoc3RydWN0IG5ld191dHNuYW1lIF9fdXNlciAqbmFtZSkKK3sKKwlpbnQgcmV0ID0gc3lzX25ld3VuYW1lKG5hbWUpOworCisJaWYgKGN1cnJlbnQtPnBlcnNvbmFsaXR5ID09IFBFUl9MSU5VWDMyICYmICFyZXQpIHsKKwkJcmV0ID0gY29weV90b191c2VyKG5hbWUtPm1hY2hpbmUsICJzMzkwXDBcMFwwXDAiLCA4KTsKKwkJaWYgKHJldCkgcmV0ID0gLUVGQVVMVDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworYXNtbGlua2FnZSBsb25nIHMzOTB4X3BlcnNvbmFsaXR5KHVuc2lnbmVkIGxvbmcgcGVyc29uYWxpdHkpCit7CisJaW50IHJldDsKKworCWlmIChjdXJyZW50LT5wZXJzb25hbGl0eSA9PSBQRVJfTElOVVgzMiAmJiBwZXJzb25hbGl0eSA9PSBQRVJfTElOVVgpCisJCXBlcnNvbmFsaXR5ID0gUEVSX0xJTlVYMzI7CisJcmV0ID0gc3lzX3BlcnNvbmFsaXR5KHBlcnNvbmFsaXR5KTsKKwlpZiAocmV0ID09IFBFUl9MSU5VWDMyKQorCQlyZXQgPSBQRVJfTElOVVg7CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmIC8qIENPTkZJR19BUkNIX1MzOTBYICovCisKKy8qCisgKiBXcmFwcGVyIGZ1bmN0aW9uIGZvciBzeXNfZmFkdmlzZTY0L2ZhZHZpc2U2NF82NAorICovCisjaWZuZGVmIENPTkZJR19BUkNIX1MzOTBYCisKK2FzbWxpbmthZ2UgbG9uZworczM5MF9mYWR2aXNlNjQoaW50IGZkLCB1MzIgb2Zmc2V0X2hpZ2gsIHUzMiBvZmZzZXRfbG93LCBzaXplX3QgbGVuLCBpbnQgYWR2aWNlKQoreworCXJldHVybiBzeXNfZmFkdmlzZTY0KGZkLCAodTY0KSBvZmZzZXRfaGlnaCA8PCAzMiB8IG9mZnNldF9sb3csCisJCQlsZW4sIGFkdmljZSk7Cit9CisKKyNlbmRpZgorCitzdHJ1Y3QgZmFkdmlzZTY0XzY0X2FyZ3MgeworCWludCBmZDsKKwlsb25nIGxvbmcgb2Zmc2V0OworCWxvbmcgbG9uZyBsZW47CisJaW50IGFkdmljZTsKK307CisKK2FzbWxpbmthZ2UgbG9uZworczM5MF9mYWR2aXNlNjRfNjQoc3RydWN0IGZhZHZpc2U2NF82NF9hcmdzIF9fdXNlciAqYXJncykKK3sKKwlzdHJ1Y3QgZmFkdmlzZTY0XzY0X2FyZ3MgYTsKKworCWlmICggY29weV9mcm9tX3VzZXIoJmEsIGFyZ3MsIHNpemVvZihhKSkgKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gc3lzX2ZhZHZpc2U2NF82NChhLmZkLCBhLm9mZnNldCwgYS5sZW4sIGEuYWR2aWNlKTsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zeXNjYWxscy5TIGIvYXJjaC9zMzkwL2tlcm5lbC9zeXNjYWxscy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNTkzODYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL3N5c2NhbGxzLlMKQEAgLTAsMCArMSwyOTIgQEAKKy8qCisgKiBkZWZpbml0aW9ucyBmb3Igc3lzX2NhbGxfdGFibGUsIGVhY2ggbGluZSByZXByZXNlbnRzIGFuCisgKiBlbnRyeSBpbiB0aGUgdGFibGUgaW4gdGhlIGZvcm0gCisgKiBTWVNDQUxMKDMxIGJpdCBzeXNjYWxsLCA2NCBiaXQgc3lzY2FsbCwgMzEgYml0IGVtdWxhdGVkIHN5c2NhbGwpCisgKgorICogdGhpcyBmaWxlIGlzIG1lYW50IHRvIGJlIGluY2x1ZGVkIGZyb20gZW50cnkuUyBhbmQgZW50cnk2NC5TCisgKi8KKworI2RlZmluZSBOSV9TWVNDQUxMIFNZU0NBTEwoc3lzX25pX3N5c2NhbGwsc3lzX25pX3N5c2NhbGwsc3lzX25pX3N5c2NhbGwpCisKK05JX1NZU0NBTEwJCQkJCQkJLyogMCAqLworU1lTQ0FMTChzeXNfZXhpdCxzeXNfZXhpdCxzeXMzMl9leGl0X3dyYXBwZXIpCitTWVNDQUxMKHN5c19mb3JrX2dsdWUsc3lzX2ZvcmtfZ2x1ZSxzeXNfZm9ya19nbHVlKQorU1lTQ0FMTChzeXNfcmVhZCxzeXNfcmVhZCxzeXMzMl9yZWFkX3dyYXBwZXIpCitTWVNDQUxMKHN5c193cml0ZSxzeXNfd3JpdGUsc3lzMzJfd3JpdGVfd3JhcHBlcikKK1NZU0NBTEwoc3lzX29wZW4sc3lzX29wZW4sc3lzMzJfb3Blbl93cmFwcGVyKQkJCS8qIDUgKi8KK1NZU0NBTEwoc3lzX2Nsb3NlLHN5c19jbG9zZSxzeXMzMl9jbG9zZV93cmFwcGVyKQorU1lTQ0FMTChzeXNfcmVzdGFydF9zeXNjYWxsLHN5c19yZXN0YXJ0X3N5c2NhbGwsc3lzX3Jlc3RhcnRfc3lzY2FsbCkKK1NZU0NBTEwoc3lzX2NyZWF0LHN5c19jcmVhdCxzeXMzMl9jcmVhdF93cmFwcGVyKQorU1lTQ0FMTChzeXNfbGluayxzeXNfbGluayxzeXMzMl9saW5rX3dyYXBwZXIpCitTWVNDQUxMKHN5c191bmxpbmssc3lzX3VubGluayxzeXMzMl91bmxpbmtfd3JhcHBlcikJCS8qIDEwICovCitTWVNDQUxMKHN5c19leGVjdmVfZ2x1ZSxzeXNfZXhlY3ZlX2dsdWUsc3lzMzJfZXhlY3ZlX2dsdWUpCitTWVNDQUxMKHN5c19jaGRpcixzeXNfY2hkaXIsc3lzMzJfY2hkaXJfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3RpbWUsc3lzX25pX3N5c2NhbGwsc3lzMzJfdGltZV93cmFwcGVyKQkJLyogb2xkIHRpbWUgc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfbWtub2Qsc3lzX21rbm9kLHN5czMyX21rbm9kX3dyYXBwZXIpCitTWVNDQUxMKHN5c19jaG1vZCxzeXNfY2htb2Qsc3lzMzJfY2htb2Rfd3JhcHBlcikJCS8qIDE1ICovCitTWVNDQUxMKHN5c19sY2hvd24xNixzeXNfbmlfc3lzY2FsbCxzeXMzMl9sY2hvd24xNl93cmFwcGVyKQkvKiBvbGQgbGNob3duMTYgc3lzY2FsbCovCitOSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCBicmVhayBzeXNjYWxsIGhvbGRlciAqLworTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgc3RhdCBzeXNjYWxsIGhvbGRlciAqLworU1lTQ0FMTChzeXNfbHNlZWssc3lzX2xzZWVrLHN5czMyX2xzZWVrX3dyYXBwZXIpCitTWVNDQUxMKHN5c19nZXRwaWQsc3lzX2dldHBpZCxzeXNfZ2V0cGlkKQkJCS8qIDIwICovCitTWVNDQUxMKHN5c19tb3VudCxzeXNfbW91bnQsc3lzMzJfbW91bnRfd3JhcHBlcikKK1NZU0NBTEwoc3lzX29sZHVtb3VudCxzeXNfb2xkdW1vdW50LHN5czMyX29sZHVtb3VudF93cmFwcGVyKQorU1lTQ0FMTChzeXNfc2V0dWlkMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfc2V0dWlkMTZfd3JhcHBlcikJLyogb2xkIHNldHVpZDE2IHN5c2NhbGwqLworU1lTQ0FMTChzeXNfZ2V0dWlkMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfZ2V0dWlkMTYpCQkvKiBvbGQgZ2V0dWlkMTYgc3lzY2FsbCovCitTWVNDQUxMKHN5c19zdGltZSxzeXNfbmlfc3lzY2FsbCxzeXMzMl9zdGltZV93cmFwcGVyKQkJLyogMjUgb2xkIHN0aW1lIHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX3B0cmFjZSxzeXNfcHRyYWNlLHN5czMyX3B0cmFjZV93cmFwcGVyKQorU1lTQ0FMTChzeXNfYWxhcm0sc3lzX2FsYXJtLHN5czMyX2FsYXJtX3dyYXBwZXIpCitOSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCBmc3RhdCBzeXNjYWxsICovCitTWVNDQUxMKHN5c19wYXVzZSxzeXNfcGF1c2Usc3lzMzJfcGF1c2UpCitTWVNDQUxMKHN5c191dGltZSxzeXNfdXRpbWUsY29tcGF0X3N5c191dGltZV93cmFwcGVyKQkJLyogMzAgKi8KK05JX1NZU0NBTEwJCQkJCQkJLyogb2xkIHN0dHkgc3lzY2FsbCAqLworTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgZ3R0eSBzeXNjYWxsICovCitTWVNDQUxMKHN5c19hY2Nlc3Msc3lzX2FjY2VzcyxzeXMzMl9hY2Nlc3Nfd3JhcHBlcikKK1NZU0NBTEwoc3lzX25pY2Usc3lzX25pY2Usc3lzMzJfbmljZV93cmFwcGVyKQorTklfU1lTQ0FMTAkJCQkJCQkvKiAzNSBvbGQgZnRpbWUgc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfc3luYyxzeXNfc3luYyxzeXNfc3luYykKK1NZU0NBTEwoc3lzX2tpbGwsc3lzX2tpbGwsc3lzMzJfa2lsbF93cmFwcGVyKQorU1lTQ0FMTChzeXNfcmVuYW1lLHN5c19yZW5hbWUsc3lzMzJfcmVuYW1lX3dyYXBwZXIpCitTWVNDQUxMKHN5c19ta2RpcixzeXNfbWtkaXIsc3lzMzJfbWtkaXJfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3JtZGlyLHN5c19ybWRpcixzeXMzMl9ybWRpcl93cmFwcGVyKQkJLyogNDAgKi8KK1NZU0NBTEwoc3lzX2R1cCxzeXNfZHVwLHN5czMyX2R1cF93cmFwcGVyKQorU1lTQ0FMTChzeXNfcGlwZSxzeXNfcGlwZSxzeXMzMl9waXBlX3dyYXBwZXIpCitTWVNDQUxMKHN5c190aW1lcyxzeXNfdGltZXMsY29tcGF0X3N5c190aW1lc193cmFwcGVyKQorTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgcHJvZiBzeXNjYWxsICovCitTWVNDQUxMKHN5c19icmssc3lzX2JyayxzeXMzMl9icmtfd3JhcHBlcikJCQkvKiA0NSAqLworU1lTQ0FMTChzeXNfc2V0Z2lkMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfc2V0Z2lkMTZfd3JhcHBlcikJLyogb2xkIHNldGdpZDE2IHN5c2NhbGwqLworU1lTQ0FMTChzeXNfZ2V0Z2lkMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfZ2V0Z2lkMTYpCQkvKiBvbGQgZ2V0Z2lkMTYgc3lzY2FsbCovCitTWVNDQUxMKHN5c19zaWduYWwsc3lzX3NpZ25hbCxzeXMzMl9zaWduYWxfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2dldGV1aWQxNixzeXNfbmlfc3lzY2FsbCxzeXMzMl9nZXRldWlkMTYpCQkvKiBvbGQgZ2V0ZXVpZDE2IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX2dldGVnaWQxNixzeXNfbmlfc3lzY2FsbCxzeXMzMl9nZXRlZ2lkMTYpCQkvKiA1MCBvbGQgZ2V0ZWdpZDE2IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX2FjY3Qsc3lzX2FjY3Qsc3lzMzJfYWNjdF93cmFwcGVyKQorU1lTQ0FMTChzeXNfdW1vdW50LHN5c191bW91bnQsc3lzMzJfdW1vdW50X3dyYXBwZXIpCitOSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCBsb2NrIHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX2lvY3RsLHN5c19pb2N0bCxjb21wYXRfc3lzX2lvY3RsX3dyYXBwZXIpCitTWVNDQUxMKHN5c19mY250bCxzeXNfZmNudGwsY29tcGF0X3N5c19mY250bF93cmFwcGVyKQkJLyogNTUgKi8KK05JX1NZU0NBTEwJCQkJCQkJLyogaW50ZWwgbXB4IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX3NldHBnaWQsc3lzX3NldHBnaWQsc3lzMzJfc2V0cGdpZF93cmFwcGVyKQorTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgdWxpbWl0IHN5c2NhbGwgKi8KK05JX1NZU0NBTEwJCQkJCQkJLyogb2xkIHVuYW1lIHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX3VtYXNrLHN5c191bWFzayxzeXMzMl91bWFza193cmFwcGVyKQkJLyogNjAgKi8KK1NZU0NBTEwoc3lzX2Nocm9vdCxzeXNfY2hyb290LHN5czMyX2Nocm9vdF93cmFwcGVyKQorU1lTQ0FMTChzeXNfdXN0YXQsc3lzX3VzdGF0LHN5czMyX3VzdGF0X3dyYXBwZXIpCitTWVNDQUxMKHN5c19kdXAyLHN5c19kdXAyLHN5czMyX2R1cDJfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2dldHBwaWQsc3lzX2dldHBwaWQsc3lzX2dldHBwaWQpCitTWVNDQUxMKHN5c19nZXRwZ3JwLHN5c19nZXRwZ3JwLHN5c19nZXRwZ3JwKQkJCS8qIDY1ICovCitTWVNDQUxMKHN5c19zZXRzaWQsc3lzX3NldHNpZCxzeXNfc2V0c2lkKQorU1lTQ0FMTChzeXNfc2lnYWN0aW9uLHN5c19zaWdhY3Rpb24sc3lzMzJfc2lnYWN0aW9uX3dyYXBwZXIpCitOSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCBzZ2V0bWFzayBzeXNjYWxsKi8KK05JX1NZU0NBTEwJCQkJCQkJLyogb2xkIHNzZXRtYXNrIHN5c2NhbGwqLworU1lTQ0FMTChzeXNfc2V0cmV1aWQxNixzeXNfbmlfc3lzY2FsbCxzeXMzMl9zZXRyZXVpZDE2X3dyYXBwZXIpCS8qIG9sZCBzZXRyZXVpZDE2IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX3NldHJlZ2lkMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfc2V0cmVnaWQxNl93cmFwcGVyKQkvKiBvbGQgc2V0cmVnaWQxNiBzeXNjYWxsICovCitTWVNDQUxMKHN5c19zaWdzdXNwZW5kX2dsdWUsc3lzX3NpZ3N1c3BlbmRfZ2x1ZSxzeXMzMl9zaWdzdXNwZW5kX2dsdWUpCitTWVNDQUxMKHN5c19zaWdwZW5kaW5nLHN5c19zaWdwZW5kaW5nLGNvbXBhdF9zeXNfc2lncGVuZGluZ193cmFwcGVyKQorU1lTQ0FMTChzeXNfc2V0aG9zdG5hbWUsc3lzX3NldGhvc3RuYW1lLHN5czMyX3NldGhvc3RuYW1lX3dyYXBwZXIpCitTWVNDQUxMKHN5c19zZXRybGltaXQsc3lzX3NldHJsaW1pdCxjb21wYXRfc3lzX3NldHJsaW1pdF93cmFwcGVyKQkvKiA3NSAqLworU1lTQ0FMTChzeXNfb2xkX2dldHJsaW1pdCxzeXNfZ2V0cmxpbWl0LGNvbXBhdF9zeXNfb2xkX2dldHJsaW1pdF93cmFwcGVyKQorU1lTQ0FMTChzeXNfZ2V0cnVzYWdlLHN5c19nZXRydXNhZ2UsY29tcGF0X3N5c19nZXRydXNhZ2Vfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2dldHRpbWVvZmRheSxzeXNfZ2V0dGltZW9mZGF5LHN5czMyX2dldHRpbWVvZmRheV93cmFwcGVyKQorU1lTQ0FMTChzeXNfc2V0dGltZW9mZGF5LHN5c19zZXR0aW1lb2ZkYXksc3lzMzJfc2V0dGltZW9mZGF5X3dyYXBwZXIpCitTWVNDQUxMKHN5c19nZXRncm91cHMxNixzeXNfbmlfc3lzY2FsbCxzeXMzMl9nZXRncm91cHMxNl93cmFwcGVyKQkvKiA4MCBvbGQgZ2V0Z3JvdXBzMTYgc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfc2V0Z3JvdXBzMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfc2V0Z3JvdXBzMTZfd3JhcHBlcikJLyogb2xkIHNldGdyb3VwczE2IHN5c2NhbGwgKi8KK05JX1NZU0NBTEwJCQkJCQkJLyogb2xkIHNlbGVjdCBzeXNjYWxsICovCitTWVNDQUxMKHN5c19zeW1saW5rLHN5c19zeW1saW5rLHN5czMyX3N5bWxpbmtfd3JhcHBlcikKK05JX1NZU0NBTEwJCQkJCQkJLyogb2xkIGxzdGF0IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX3JlYWRsaW5rLHN5c19yZWFkbGluayxzeXMzMl9yZWFkbGlua193cmFwcGVyKQkvKiA4NSAqLworU1lTQ0FMTChzeXNfdXNlbGliLHN5c191c2VsaWIsc3lzMzJfdXNlbGliX3dyYXBwZXIpCitTWVNDQUxMKHN5c19zd2Fwb24sc3lzX3N3YXBvbixzeXMzMl9zd2Fwb25fd3JhcHBlcikKK1NZU0NBTEwoc3lzX3JlYm9vdCxzeXNfcmVib290LHN5czMyX3JlYm9vdF93cmFwcGVyKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCxzeXNfbmlfc3lzY2FsbCxvbGQzMl9yZWFkZGlyX3dyYXBwZXIpCS8qIG9sZCByZWFkZGlyIHN5c2NhbGwgKi8KK1NZU0NBTEwob2xkX21tYXAsb2xkX21tYXAsb2xkMzJfbW1hcF93cmFwcGVyKQkJCS8qIDkwICovCitTWVNDQUxMKHN5c19tdW5tYXAsc3lzX211bm1hcCxzeXMzMl9tdW5tYXBfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3RydW5jYXRlLHN5c190cnVuY2F0ZSxzeXMzMl90cnVuY2F0ZV93cmFwcGVyKQorU1lTQ0FMTChzeXNfZnRydW5jYXRlLHN5c19mdHJ1bmNhdGUsc3lzMzJfZnRydW5jYXRlX3dyYXBwZXIpCitTWVNDQUxMKHN5c19mY2htb2Qsc3lzX2ZjaG1vZCxzeXMzMl9mY2htb2Rfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2ZjaG93bjE2LHN5c19uaV9zeXNjYWxsLHN5czMyX2ZjaG93bjE2X3dyYXBwZXIpCS8qIDk1IG9sZCBmY2hvd24xNiBzeXNjYWxsKi8KK1NZU0NBTEwoc3lzX2dldHByaW9yaXR5LHN5c19nZXRwcmlvcml0eSxzeXMzMl9nZXRwcmlvcml0eV93cmFwcGVyKQorU1lTQ0FMTChzeXNfc2V0cHJpb3JpdHksc3lzX3NldHByaW9yaXR5LHN5czMyX3NldHByaW9yaXR5X3dyYXBwZXIpCitOSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCBwcm9maWwgc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfc3RhdGZzLHN5c19zdGF0ZnMsY29tcGF0X3N5c19zdGF0ZnNfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2ZzdGF0ZnMsc3lzX2ZzdGF0ZnMsY29tcGF0X3N5c19mc3RhdGZzX3dyYXBwZXIpCS8qIDEwMCAqLworTklfU1lTQ0FMTAkJCQkJCQkvKiBpb3Blcm0gZm9yIGkzODYgKi8KK1NZU0NBTEwoc3lzX3NvY2tldGNhbGwsc3lzX3NvY2tldGNhbGwsY29tcGF0X3N5c19zb2NrZXRjYWxsX3dyYXBwZXIpCitTWVNDQUxMKHN5c19zeXNsb2csc3lzX3N5c2xvZyxzeXMzMl9zeXNsb2dfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3NldGl0aW1lcixzeXNfc2V0aXRpbWVyLGNvbXBhdF9zeXNfc2V0aXRpbWVyX3dyYXBwZXIpCitTWVNDQUxMKHN5c19nZXRpdGltZXIsc3lzX2dldGl0aW1lcixjb21wYXRfc3lzX2dldGl0aW1lcl93cmFwcGVyKQkvKiAxMDUgKi8KK1NZU0NBTEwoc3lzX25ld3N0YXQsc3lzX25ld3N0YXQsY29tcGF0X3N5c19uZXdzdGF0X3dyYXBwZXIpCitTWVNDQUxMKHN5c19uZXdsc3RhdCxzeXNfbmV3bHN0YXQsY29tcGF0X3N5c19uZXdsc3RhdF93cmFwcGVyKQorU1lTQ0FMTChzeXNfbmV3ZnN0YXQsc3lzX25ld2ZzdGF0LGNvbXBhdF9zeXNfbmV3ZnN0YXRfd3JhcHBlcikKK05JX1NZU0NBTEwJCQkJCQkJLyogb2xkIHVuYW1lIHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX2xvb2t1cF9kY29va2llLHN5c19sb29rdXBfZGNvb2tpZSxzeXMzMl9sb29rdXBfZGNvb2tpZV93cmFwcGVyKQkvKiAxMTAgKi8KK1NZU0NBTEwoc3lzX3ZoYW5ndXAsc3lzX3ZoYW5ndXAsc3lzX3ZoYW5ndXApCitOSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCAiaWRsZSIgc3lzdGVtIGNhbGwgKi8KK05JX1NZU0NBTEwJCQkJCQkJLyogdm04Nm9sZCBmb3IgaTM4NiAqLworU1lTQ0FMTChzeXNfd2FpdDQsc3lzX3dhaXQ0LGNvbXBhdF9zeXNfd2FpdDRfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3N3YXBvZmYsc3lzX3N3YXBvZmYsc3lzMzJfc3dhcG9mZl93cmFwcGVyKQkJLyogMTE1ICovCitTWVNDQUxMKHN5c19zeXNpbmZvLHN5c19zeXNpbmZvLHN5czMyX3N5c2luZm9fd3JhcHBlcikKK1NZU0NBTEwoc3lzX2lwYyxzeXNfaXBjLHN5czMyX2lwY193cmFwcGVyKQorU1lTQ0FMTChzeXNfZnN5bmMsc3lzX2ZzeW5jLHN5czMyX2ZzeW5jX3dyYXBwZXIpCitTWVNDQUxMKHN5c19zaWdyZXR1cm5fZ2x1ZSxzeXNfc2lncmV0dXJuX2dsdWUsc3lzMzJfc2lncmV0dXJuX2dsdWUpCitTWVNDQUxMKHN5c19jbG9uZV9nbHVlLHN5c19jbG9uZV9nbHVlLHN5czMyX2Nsb25lX2dsdWUpCQkvKiAxMjAgKi8KK1NZU0NBTEwoc3lzX3NldGRvbWFpbm5hbWUsc3lzX3NldGRvbWFpbm5hbWUsc3lzMzJfc2V0ZG9tYWlubmFtZV93cmFwcGVyKQorU1lTQ0FMTChzeXNfbmV3dW5hbWUsczM5MHhfbmV3dW5hbWUsc3lzMzJfbmV3dW5hbWVfd3JhcHBlcikKK05JX1NZU0NBTEwJCQkJCQkJLyogbW9kaWZ5X2xkdCBmb3IgaTM4NiAqLworU1lTQ0FMTChzeXNfYWRqdGltZXgsc3lzX2FkanRpbWV4LHN5czMyX2FkanRpbWV4X3dyYXBwZXIpCitTWVNDQUxMKHN5c19tcHJvdGVjdCxzeXNfbXByb3RlY3Qsc3lzMzJfbXByb3RlY3Rfd3JhcHBlcikJLyogMTI1ICovCitTWVNDQUxMKHN5c19zaWdwcm9jbWFzayxzeXNfc2lncHJvY21hc2ssY29tcGF0X3N5c19zaWdwcm9jbWFza193cmFwcGVyKQorTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgImNyZWF0ZSBtb2R1bGUiICovCitTWVNDQUxMKHN5c19pbml0X21vZHVsZSxzeXNfaW5pdF9tb2R1bGUsc3lzMzJfaW5pdF9tb2R1bGVfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2RlbGV0ZV9tb2R1bGUsc3lzX2RlbGV0ZV9tb2R1bGUsc3lzMzJfZGVsZXRlX21vZHVsZV93cmFwcGVyKQorTklfU1lTQ0FMTAkJCQkJCQkvKiAxMzA6IG9sZCBnZXRfa2VybmVsX3N5bXMgKi8KK1NZU0NBTEwoc3lzX3F1b3RhY3RsLHN5c19xdW90YWN0bCxzeXMzMl9xdW90YWN0bF93cmFwcGVyKQorU1lTQ0FMTChzeXNfZ2V0cGdpZCxzeXNfZ2V0cGdpZCxzeXMzMl9nZXRwZ2lkX3dyYXBwZXIpCitTWVNDQUxMKHN5c19mY2hkaXIsc3lzX2ZjaGRpcixzeXMzMl9mY2hkaXJfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2JkZmx1c2gsc3lzX2JkZmx1c2gsc3lzMzJfYmRmbHVzaF93cmFwcGVyKQorU1lTQ0FMTChzeXNfc3lzZnMsc3lzX3N5c2ZzLHN5czMyX3N5c2ZzX3dyYXBwZXIpCQkvKiAxMzUgKi8KK1NZU0NBTEwoc3lzX3BlcnNvbmFsaXR5LHMzOTB4X3BlcnNvbmFsaXR5LHN5czMyX3BlcnNvbmFsaXR5X3dyYXBwZXIpCitOSV9TWVNDQUxMCQkJCQkJCS8qIGZvciBhZnNfc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfc2V0ZnN1aWQxNixzeXNfbmlfc3lzY2FsbCxzeXMzMl9zZXRmc3VpZDE2X3dyYXBwZXIpCS8qIG9sZCBzZXRmc3VpZDE2IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX3NldGZzZ2lkMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfc2V0ZnNnaWQxNl93cmFwcGVyKQkvKiBvbGQgc2V0ZnNnaWQxNiBzeXNjYWxsICovCitTWVNDQUxMKHN5c19sbHNlZWssc3lzX2xsc2VlayxzeXMzMl9sbHNlZWtfd3JhcHBlcikJCS8qIDE0MCAqLworU1lTQ0FMTChzeXNfZ2V0ZGVudHMsc3lzX2dldGRlbnRzLHN5czMyX2dldGRlbnRzX3dyYXBwZXIpCitTWVNDQUxMKHN5c19zZWxlY3Qsc3lzX3NlbGVjdCxjb21wYXRfc3lzX3NlbGVjdF93cmFwcGVyKQorU1lTQ0FMTChzeXNfZmxvY2ssc3lzX2Zsb2NrLHN5czMyX2Zsb2NrX3dyYXBwZXIpCitTWVNDQUxMKHN5c19tc3luYyxzeXNfbXN5bmMsc3lzMzJfbXN5bmNfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3JlYWR2LHN5c19yZWFkdixjb21wYXRfc3lzX3JlYWR2X3dyYXBwZXIpCQkvKiAxNDUgKi8KK1NZU0NBTEwoc3lzX3dyaXRldixzeXNfd3JpdGV2LGNvbXBhdF9zeXNfd3JpdGV2X3dyYXBwZXIpCitTWVNDQUxMKHN5c19nZXRzaWQsc3lzX2dldHNpZCxzeXMzMl9nZXRzaWRfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2ZkYXRhc3luYyxzeXNfZmRhdGFzeW5jLHN5czMyX2ZkYXRhc3luY193cmFwcGVyKQorU1lTQ0FMTChzeXNfc3lzY3RsLHN5c19zeXNjdGwsc3lzMzJfc3lzY3RsX3dyYXBwZXIpCitTWVNDQUxMKHN5c19tbG9jayxzeXNfbWxvY2ssc3lzMzJfbWxvY2tfd3JhcHBlcikJCS8qIDE1MCAqLworU1lTQ0FMTChzeXNfbXVubG9jayxzeXNfbXVubG9jayxzeXMzMl9tdW5sb2NrX3dyYXBwZXIpCitTWVNDQUxMKHN5c19tbG9ja2FsbCxzeXNfbWxvY2thbGwsc3lzMzJfbWxvY2thbGxfd3JhcHBlcikKK1NZU0NBTEwoc3lzX211bmxvY2thbGwsc3lzX211bmxvY2thbGwsc3lzX211bmxvY2thbGwpCitTWVNDQUxMKHN5c19zY2hlZF9zZXRwYXJhbSxzeXNfc2NoZWRfc2V0cGFyYW0sc3lzMzJfc2NoZWRfc2V0cGFyYW1fd3JhcHBlcikKK1NZU0NBTEwoc3lzX3NjaGVkX2dldHBhcmFtLHN5c19zY2hlZF9nZXRwYXJhbSxzeXMzMl9zY2hlZF9nZXRwYXJhbV93cmFwcGVyKQkvKiAxNTUgKi8KK1NZU0NBTEwoc3lzX3NjaGVkX3NldHNjaGVkdWxlcixzeXNfc2NoZWRfc2V0c2NoZWR1bGVyLHN5czMyX3NjaGVkX3NldHNjaGVkdWxlcl93cmFwcGVyKQorU1lTQ0FMTChzeXNfc2NoZWRfZ2V0c2NoZWR1bGVyLHN5c19zY2hlZF9nZXRzY2hlZHVsZXIsc3lzMzJfc2NoZWRfZ2V0c2NoZWR1bGVyX3dyYXBwZXIpCitTWVNDQUxMKHN5c19zY2hlZF95aWVsZCxzeXNfc2NoZWRfeWllbGQsc3lzX3NjaGVkX3lpZWxkKQorU1lTQ0FMTChzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21heCxzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21heCxzeXMzMl9zY2hlZF9nZXRfcHJpb3JpdHlfbWF4X3dyYXBwZXIpCitTWVNDQUxMKHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWluLHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWluLHN5czMyX3NjaGVkX2dldF9wcmlvcml0eV9taW5fd3JhcHBlcikJLyogMTYwICovCitTWVNDQUxMKHN5c19zY2hlZF9ycl9nZXRfaW50ZXJ2YWwsc3lzX3NjaGVkX3JyX2dldF9pbnRlcnZhbCxzeXMzMl9zY2hlZF9ycl9nZXRfaW50ZXJ2YWxfd3JhcHBlcikKK1NZU0NBTEwoc3lzX25hbm9zbGVlcCxzeXNfbmFub3NsZWVwLGNvbXBhdF9zeXNfbmFub3NsZWVwX3dyYXBwZXIpCitTWVNDQUxMKHN5c19tcmVtYXAsc3lzX21yZW1hcCxzeXMzMl9tcmVtYXBfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3NldHJlc3VpZDE2LHN5c19uaV9zeXNjYWxsLHN5czMyX3NldHJlc3VpZDE2X3dyYXBwZXIpCS8qIG9sZCBzZXRyZXN1aWQxNiBzeXNjYWxsICovCitTWVNDQUxMKHN5c19nZXRyZXN1aWQxNixzeXNfbmlfc3lzY2FsbCxzeXMzMl9nZXRyZXN1aWQxNl93cmFwcGVyKQkvKiAxNjUgb2xkIGdldHJlc3VpZDE2IHN5c2NhbGwgKi8KK05JX1NZU0NBTEwJCQkJCQkJLyogZm9yIHZtODYgKi8KK05JX1NZU0NBTEwJCQkJCQkJLyogb2xkIHN5c19xdWVyeV9tb2R1bGUgKi8KK1NZU0NBTEwoc3lzX3BvbGwsc3lzX3BvbGwsc3lzMzJfcG9sbF93cmFwcGVyKQorU1lTQ0FMTChzeXNfbmZzc2VydmN0bCxzeXNfbmZzc2VydmN0bCxjb21wYXRfc3lzX25mc3NlcnZjdGxfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3NldHJlc2dpZDE2LHN5c19uaV9zeXNjYWxsLHN5czMyX3NldHJlc2dpZDE2X3dyYXBwZXIpCS8qIDE3MCBvbGQgc2V0cmVzZ2lkMTYgc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfZ2V0cmVzZ2lkMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfZ2V0cmVzZ2lkMTZfd3JhcHBlcikJLyogb2xkIGdldHJlc2dpZDE2IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX3ByY3RsLHN5c19wcmN0bCxzeXMzMl9wcmN0bF93cmFwcGVyKQorU1lTQ0FMTChzeXNfcnRfc2lncmV0dXJuX2dsdWUsc3lzX3J0X3NpZ3JldHVybl9nbHVlLHN5czMyX3J0X3NpZ3JldHVybl9nbHVlKQorU1lTQ0FMTChzeXNfcnRfc2lnYWN0aW9uLHN5c19ydF9zaWdhY3Rpb24sc3lzMzJfcnRfc2lnYWN0aW9uX3dyYXBwZXIpCitTWVNDQUxMKHN5c19ydF9zaWdwcm9jbWFzayxzeXNfcnRfc2lncHJvY21hc2ssc3lzMzJfcnRfc2lncHJvY21hc2tfd3JhcHBlcikJLyogMTc1ICovCitTWVNDQUxMKHN5c19ydF9zaWdwZW5kaW5nLHN5c19ydF9zaWdwZW5kaW5nLHN5czMyX3J0X3NpZ3BlbmRpbmdfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3J0X3NpZ3RpbWVkd2FpdCxzeXNfcnRfc2lndGltZWR3YWl0LGNvbXBhdF9zeXNfcnRfc2lndGltZWR3YWl0X3dyYXBwZXIpCitTWVNDQUxMKHN5c19ydF9zaWdxdWV1ZWluZm8sc3lzX3J0X3NpZ3F1ZXVlaW5mbyxzeXMzMl9ydF9zaWdxdWV1ZWluZm9fd3JhcHBlcikKK1NZU0NBTEwoc3lzX3J0X3NpZ3N1c3BlbmRfZ2x1ZSxzeXNfcnRfc2lnc3VzcGVuZF9nbHVlLHN5czMyX3J0X3NpZ3N1c3BlbmRfZ2x1ZSkKK1NZU0NBTEwoc3lzX3ByZWFkNjQsc3lzX3ByZWFkNjQsc3lzMzJfcHJlYWQ2NF93cmFwcGVyKQkJLyogMTgwICovCitTWVNDQUxMKHN5c19wd3JpdGU2NCxzeXNfcHdyaXRlNjQsc3lzMzJfcHdyaXRlNjRfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2Nob3duMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfY2hvd24xNl93cmFwcGVyKQkvKiBvbGQgY2hvd24xNiBzeXNjYWxsICovCitTWVNDQUxMKHN5c19nZXRjd2Qsc3lzX2dldGN3ZCxzeXMzMl9nZXRjd2Rfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2NhcGdldCxzeXNfY2FwZ2V0LHN5czMyX2NhcGdldF93cmFwcGVyKQorU1lTQ0FMTChzeXNfY2Fwc2V0LHN5c19jYXBzZXQsc3lzMzJfY2Fwc2V0X3dyYXBwZXIpCQkvKiAxODUgKi8KK1NZU0NBTEwoc3lzX3NpZ2FsdHN0YWNrX2dsdWUsc3lzX3NpZ2FsdHN0YWNrX2dsdWUsc3lzMzJfc2lnYWx0c3RhY2tfZ2x1ZSkKK1NZU0NBTEwoc3lzX3NlbmRmaWxlLHN5c19zZW5kZmlsZTY0LHN5czMyX3NlbmRmaWxlX3dyYXBwZXIpCitOSV9TWVNDQUxMCQkJCQkJCS8qIHN0cmVhbXMxICovCitOSV9TWVNDQUxMCQkJCQkJCS8qIHN0cmVhbXMyICovCitTWVNDQUxMKHN5c192Zm9ya19nbHVlLHN5c192Zm9ya19nbHVlLHN5c192Zm9ya19nbHVlKQkJLyogMTkwICovCitTWVNDQUxMKHN5c19nZXRybGltaXQsc3lzX2dldHJsaW1pdCxjb21wYXRfc3lzX2dldHJsaW1pdF93cmFwcGVyKQorU1lTQ0FMTChzeXNfbW1hcDIsc3lzX21tYXAyLHN5czMyX21tYXAyX3dyYXBwZXIpCitTWVNDQUxMKHN5c190cnVuY2F0ZTY0LHN5c19uaV9zeXNjYWxsLHN5czMyX3RydW5jYXRlNjRfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2Z0cnVuY2F0ZTY0LHN5c19uaV9zeXNjYWxsLHN5czMyX2Z0cnVuY2F0ZTY0X3dyYXBwZXIpCitTWVNDQUxMKHN5c19zdGF0NjQsc3lzX25pX3N5c2NhbGwsc3lzMzJfc3RhdDY0X3dyYXBwZXIpCQkvKiAxOTUgKi8KK1NZU0NBTEwoc3lzX2xzdGF0NjQsc3lzX25pX3N5c2NhbGwsc3lzMzJfbHN0YXQ2NF93cmFwcGVyKQorU1lTQ0FMTChzeXNfZnN0YXQ2NCxzeXNfbmlfc3lzY2FsbCxzeXMzMl9mc3RhdDY0X3dyYXBwZXIpCitTWVNDQUxMKHN5c19sY2hvd24sc3lzX2xjaG93bixzeXMzMl9sY2hvd25fd3JhcHBlcikKK1NZU0NBTEwoc3lzX2dldHVpZCxzeXNfZ2V0dWlkLHN5c19nZXR1aWQpCitTWVNDQUxMKHN5c19nZXRnaWQsc3lzX2dldGdpZCxzeXNfZ2V0Z2lkKQkJCS8qIDIwMCAqLworU1lTQ0FMTChzeXNfZ2V0ZXVpZCxzeXNfZ2V0ZXVpZCxzeXNfZ2V0ZXVpZCkKK1NZU0NBTEwoc3lzX2dldGVnaWQsc3lzX2dldGVnaWQsc3lzX2dldGVnaWQpCitTWVNDQUxMKHN5c19zZXRyZXVpZCxzeXNfc2V0cmV1aWQsc3lzMzJfc2V0cmV1aWRfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3NldHJlZ2lkLHN5c19zZXRyZWdpZCxzeXMzMl9zZXRyZWdpZF93cmFwcGVyKQorU1lTQ0FMTChzeXNfZ2V0Z3JvdXBzLHN5c19nZXRncm91cHMsc3lzMzJfZ2V0Z3JvdXBzX3dyYXBwZXIpCS8qIDIwNSAqLworU1lTQ0FMTChzeXNfc2V0Z3JvdXBzLHN5c19zZXRncm91cHMsc3lzMzJfc2V0Z3JvdXBzX3dyYXBwZXIpCitTWVNDQUxMKHN5c19mY2hvd24sc3lzX2ZjaG93bixzeXMzMl9mY2hvd25fd3JhcHBlcikKK1NZU0NBTEwoc3lzX3NldHJlc3VpZCxzeXNfc2V0cmVzdWlkLHN5czMyX3NldHJlc3VpZF93cmFwcGVyKQorU1lTQ0FMTChzeXNfZ2V0cmVzdWlkLHN5c19nZXRyZXN1aWQsc3lzMzJfZ2V0cmVzdWlkX3dyYXBwZXIpCitTWVNDQUxMKHN5c19zZXRyZXNnaWQsc3lzX3NldHJlc2dpZCxzeXMzMl9zZXRyZXNnaWRfd3JhcHBlcikJLyogMjEwICovCitTWVNDQUxMKHN5c19nZXRyZXNnaWQsc3lzX2dldHJlc2dpZCxzeXMzMl9nZXRyZXNnaWRfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2Nob3duLHN5c19jaG93bixzeXMzMl9jaG93bl93cmFwcGVyKQorU1lTQ0FMTChzeXNfc2V0dWlkLHN5c19zZXR1aWQsc3lzMzJfc2V0dWlkX3dyYXBwZXIpCitTWVNDQUxMKHN5c19zZXRnaWQsc3lzX3NldGdpZCxzeXMzMl9zZXRnaWRfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3NldGZzdWlkLHN5c19zZXRmc3VpZCxzeXMzMl9zZXRmc3VpZF93cmFwcGVyKQkvKiAyMTUgKi8KK1NZU0NBTEwoc3lzX3NldGZzZ2lkLHN5c19zZXRmc2dpZCxzeXMzMl9zZXRmc2dpZF93cmFwcGVyKQorU1lTQ0FMTChzeXNfcGl2b3Rfcm9vdCxzeXNfcGl2b3Rfcm9vdCxzeXMzMl9waXZvdF9yb290X3dyYXBwZXIpCitTWVNDQUxMKHN5c19taW5jb3JlLHN5c19taW5jb3JlLHN5czMyX21pbmNvcmVfd3JhcHBlcikKK1NZU0NBTEwoc3lzX21hZHZpc2Usc3lzX21hZHZpc2Usc3lzMzJfbWFkdmlzZV93cmFwcGVyKQorU1lTQ0FMTChzeXNfZ2V0ZGVudHM2NCxzeXNfZ2V0ZGVudHM2NCxzeXMzMl9nZXRkZW50czY0X3dyYXBwZXIpCS8qIDIyMCAqLworU1lTQ0FMTChzeXNfZmNudGw2NCxzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX2ZjbnRsNjRfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3JlYWRhaGVhZCxzeXNfcmVhZGFoZWFkLHN5czMyX3JlYWRhaGVhZCkKK1NZU0NBTEwoc3lzX3NlbmRmaWxlNjQsc3lzX25pX3N5c2NhbGwsc3lzMzJfc2VuZGZpbGU2NCkKK1NZU0NBTEwoc3lzX3NldHhhdHRyLHN5c19zZXR4YXR0cixzeXMzMl9zZXR4YXR0cl93cmFwcGVyKQorU1lTQ0FMTChzeXNfbHNldHhhdHRyLHN5c19sc2V0eGF0dHIsc3lzMzJfbHNldHhhdHRyX3dyYXBwZXIpCS8qIDIyNSAqLworU1lTQ0FMTChzeXNfZnNldHhhdHRyLHN5c19mc2V0eGF0dHIsc3lzMzJfZnNldHhhdHRyX3dyYXBwZXIpCitTWVNDQUxMKHN5c19nZXR4YXR0cixzeXNfZ2V0eGF0dHIsc3lzMzJfZ2V0eGF0dHJfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2xnZXR4YXR0cixzeXNfbGdldHhhdHRyLHN5czMyX2xnZXR4YXR0cl93cmFwcGVyKQorU1lTQ0FMTChzeXNfZmdldHhhdHRyLHN5c19mZ2V0eGF0dHIsc3lzMzJfZmdldHhhdHRyX3dyYXBwZXIpCitTWVNDQUxMKHN5c19saXN0eGF0dHIsc3lzX2xpc3R4YXR0cixzeXMzMl9saXN0eGF0dHJfd3JhcHBlcikJLyogMjMwICovCitTWVNDQUxMKHN5c19sbGlzdHhhdHRyLHN5c19sbGlzdHhhdHRyLHN5czMyX2xsaXN0eGF0dHJfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2ZsaXN0eGF0dHIsc3lzX2ZsaXN0eGF0dHIsc3lzMzJfZmxpc3R4YXR0cl93cmFwcGVyKQorU1lTQ0FMTChzeXNfcmVtb3ZleGF0dHIsc3lzX3JlbW92ZXhhdHRyLHN5czMyX3JlbW92ZXhhdHRyX3dyYXBwZXIpCitTWVNDQUxMKHN5c19scmVtb3ZleGF0dHIsc3lzX2xyZW1vdmV4YXR0cixzeXMzMl9scmVtb3ZleGF0dHJfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2ZyZW1vdmV4YXR0cixzeXNfZnJlbW92ZXhhdHRyLHN5czMyX2ZyZW1vdmV4YXR0cl93cmFwcGVyKQkvKiAyMzUgKi8KK1NZU0NBTEwoc3lzX2dldHRpZCxzeXNfZ2V0dGlkLHN5c19nZXR0aWQpCitTWVNDQUxMKHN5c190a2lsbCxzeXNfdGtpbGwsc3lzX3RraWxsKQorU1lTQ0FMTChzeXNfZnV0ZXgsc3lzX2Z1dGV4LGNvbXBhdF9zeXNfZnV0ZXhfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3NjaGVkX3NldGFmZmluaXR5LHN5c19zY2hlZF9zZXRhZmZpbml0eSxzeXMzMl9zY2hlZF9zZXRhZmZpbml0eV93cmFwcGVyKQorU1lTQ0FMTChzeXNfc2NoZWRfZ2V0YWZmaW5pdHksc3lzX3NjaGVkX2dldGFmZmluaXR5LHN5czMyX3NjaGVkX2dldGFmZmluaXR5X3dyYXBwZXIpCS8qIDI0MCAqLworU1lTQ0FMTChzeXNfdGdraWxsLHN5c190Z2tpbGwsc3lzX3Rna2lsbCkKK05JX1NZU0NBTEwJCQkJCQkJLyogcmVzZXJ2ZWQgZm9yIFRVWCAqLworU1lTQ0FMTChzeXNfaW9fc2V0dXAsc3lzX2lvX3NldHVwLHN5czMyX2lvX3NldHVwX3dyYXBwZXIpCitTWVNDQUxMKHN5c19pb19kZXN0cm95LHN5c19pb19kZXN0cm95LHN5czMyX2lvX2Rlc3Ryb3lfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2lvX2dldGV2ZW50cyxzeXNfaW9fZ2V0ZXZlbnRzLHN5czMyX2lvX2dldGV2ZW50c193cmFwcGVyKQkvKiAyNDUgKi8KK1NZU0NBTEwoc3lzX2lvX3N1Ym1pdCxzeXNfaW9fc3VibWl0LHN5czMyX2lvX3N1Ym1pdF93cmFwcGVyKQorU1lTQ0FMTChzeXNfaW9fY2FuY2VsLHN5c19pb19jYW5jZWwsc3lzMzJfaW9fY2FuY2VsX3dyYXBwZXIpCitTWVNDQUxMKHN5c19leGl0X2dyb3VwLHN5c19leGl0X2dyb3VwLHN5czMyX2V4aXRfZ3JvdXBfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2Vwb2xsX2NyZWF0ZSxzeXNfZXBvbGxfY3JlYXRlLHN5c19lcG9sbF9jcmVhdGVfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2Vwb2xsX2N0bCxzeXNfZXBvbGxfY3RsLHN5c19lcG9sbF9jdGxfd3JhcHBlcikJLyogMjUwICovCitTWVNDQUxMKHN5c19lcG9sbF93YWl0LHN5c19lcG9sbF93YWl0LHN5c19lcG9sbF93YWl0X3dyYXBwZXIpCitTWVNDQUxMKHN5c19zZXRfdGlkX2FkZHJlc3Msc3lzX3NldF90aWRfYWRkcmVzcyxzeXMzMl9zZXRfdGlkX2FkZHJlc3Nfd3JhcHBlcikKK1NZU0NBTEwoczM5MF9mYWR2aXNlNjQsc3lzX2ZhZHZpc2U2NF82NCxzeXMzMl9mYWR2aXNlNjRfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3RpbWVyX2NyZWF0ZSxzeXNfdGltZXJfY3JlYXRlLHN5czMyX3RpbWVyX2NyZWF0ZV93cmFwcGVyKQorU1lTQ0FMTChzeXNfdGltZXJfc2V0dGltZSxzeXNfdGltZXJfc2V0dGltZSxzeXMzMl90aW1lcl9zZXR0aW1lX3dyYXBwZXIpCS8qIDI1NSAqLworU1lTQ0FMTChzeXNfdGltZXJfZ2V0dGltZSxzeXNfdGltZXJfZ2V0dGltZSxzeXMzMl90aW1lcl9nZXR0aW1lX3dyYXBwZXIpCitTWVNDQUxMKHN5c190aW1lcl9nZXRvdmVycnVuLHN5c190aW1lcl9nZXRvdmVycnVuLHN5czMyX3RpbWVyX2dldG92ZXJydW5fd3JhcHBlcikKK1NZU0NBTEwoc3lzX3RpbWVyX2RlbGV0ZSxzeXNfdGltZXJfZGVsZXRlLHN5czMyX3RpbWVyX2RlbGV0ZV93cmFwcGVyKQorU1lTQ0FMTChzeXNfY2xvY2tfc2V0dGltZSxzeXNfY2xvY2tfc2V0dGltZSxzeXMzMl9jbG9ja19zZXR0aW1lX3dyYXBwZXIpCitTWVNDQUxMKHN5c19jbG9ja19nZXR0aW1lLHN5c19jbG9ja19nZXR0aW1lLHN5czMyX2Nsb2NrX2dldHRpbWVfd3JhcHBlcikJLyogMjYwICovCitTWVNDQUxMKHN5c19jbG9ja19nZXRyZXMsc3lzX2Nsb2NrX2dldHJlcyxzeXMzMl9jbG9ja19nZXRyZXNfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2Nsb2NrX25hbm9zbGVlcCxzeXNfY2xvY2tfbmFub3NsZWVwLHN5czMyX2Nsb2NrX25hbm9zbGVlcF93cmFwcGVyKQorTklfU1lTQ0FMTAkJCQkJCQkvKiByZXNlcnZlZCBmb3IgdnNlcnZlciAqLworU1lTQ0FMTChzMzkwX2ZhZHZpc2U2NF82NCxzeXNfbmlfc3lzY2FsbCxzeXMzMl9mYWR2aXNlNjRfNjRfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3N0YXRmczY0LHN5c19zdGF0ZnM2NCxjb21wYXRfc3lzX3N0YXRmczY0X3dyYXBwZXIpCitTWVNDQUxMKHN5c19mc3RhdGZzNjQsc3lzX2ZzdGF0ZnM2NCxjb21wYXRfc3lzX2ZzdGF0ZnM2NF93cmFwcGVyKQorU1lTQ0FMTChzeXNfcmVtYXBfZmlsZV9wYWdlcyxzeXNfcmVtYXBfZmlsZV9wYWdlcyxzeXMzMl9yZW1hcF9maWxlX3BhZ2VzX3dyYXBwZXIpCitOSV9TWVNDQUxMCQkJCQkJCS8qIDI2OCBzeXNfbWJpbmQgKi8KK05JX1NZU0NBTEwJCQkJCQkJLyogMjY5IHN5c19nZXRfbWVtcG9saWN5ICovCitOSV9TWVNDQUxMCQkJCQkJCS8qIDI3MCBzeXNfc2V0X21lbXBvbGljeSAqLworU1lTQ0FMTChzeXNfbXFfb3BlbixzeXNfbXFfb3Blbixjb21wYXRfc3lzX21xX29wZW5fd3JhcHBlcikKK1NZU0NBTEwoc3lzX21xX3VubGluayxzeXNfbXFfdW5saW5rLHN5czMyX21xX3VubGlua193cmFwcGVyKQorU1lTQ0FMTChzeXNfbXFfdGltZWRzZW5kLHN5c19tcV90aW1lZHNlbmQsY29tcGF0X3N5c19tcV90aW1lZHNlbmRfd3JhcHBlcikKK1NZU0NBTEwoc3lzX21xX3RpbWVkcmVjZWl2ZSxzeXNfbXFfdGltZWRyZWNlaXZlLGNvbXBhdF9zeXNfbXFfdGltZWRyZWNlaXZlX3dyYXBwZXIpCitTWVNDQUxMKHN5c19tcV9ub3RpZnksc3lzX21xX25vdGlmeSxjb21wYXRfc3lzX21xX25vdGlmeV93cmFwcGVyKSAvKiAyNzUgKi8KK1NZU0NBTEwoc3lzX21xX2dldHNldGF0dHIsc3lzX21xX2dldHNldGF0dHIsY29tcGF0X3N5c19tcV9nZXRzZXRhdHRyX3dyYXBwZXIpCitOSV9TWVNDQUxMCQkJCQkJCS8qIHJlc2VydmVkIGZvciBrZXhlYyAqLworU1lTQ0FMTChzeXNfYWRkX2tleSxzeXNfYWRkX2tleSxjb21wYXRfc3lzX2FkZF9rZXlfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3JlcXVlc3Rfa2V5LHN5c19yZXF1ZXN0X2tleSxjb21wYXRfc3lzX3JlcXVlc3Rfa2V5X3dyYXBwZXIpCitTWVNDQUxMKHN5c19rZXljdGwsc3lzX2tleWN0bCxjb21wYXRfc3lzX2tleWN0bCkJCS8qIDI4MCAqLworU1lTQ0FMTChzeXNfd2FpdGlkLHN5c193YWl0aWQsY29tcGF0X3N5c193YWl0aWRfd3JhcHBlcikKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdGltZS5jIGIvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxZTgxMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdGltZS5jCkBAIC0wLDAgKzEsMzgyIEBACisvKgorICogIGFyY2gvczM5MC9rZXJuZWwvdGltZS5jCisgKiAgICBUaW1lIG9mIGRheSBiYXNlZCB0aW1lciBmdW5jdGlvbnMuCisgKgorICogIFMzOTAgdmVyc2lvbgorICogICAgQ29weXJpZ2h0IChDKSAxOTk5IElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCBJQk0gQ29ycG9yYXRpb24KKyAqICAgIEF1dGhvcihzKTogSGFydG11dCBQZW5uZXIgKGhwQGRlLmlibS5jb20pLAorICogICAgICAgICAgICAgICBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pLAorICogICAgICAgICAgICAgICBEZW5pcyBKb3NlcGggQmFycm93IChkamJhcnJvd0BkZS5pYm0uY29tLGJhcnJvd19kakB5YWhvby5jb20pCisgKgorICogIERlcml2ZWQgZnJvbSAiYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMiCisgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTUgIExpbnVzIFRvcnZhbGRzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3MzOTBfZXh0Lmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS90aW1lci5oPgorCisvKiBjaGFuZ2UgdGhpcyBpZiB5b3UgaGF2ZSBzb21lIGNvbnN0YW50IHRpbWUgZHJpZnQgKi8KKyNkZWZpbmUgVVNFQ1NfUEVSX0pJRkZZICAgICAoKHVuc2lnbmVkIGxvbmcpIDEwMDAwMDAvSFopCisjZGVmaW5lIENMS19USUNLU19QRVJfSklGRlkgKCh1bnNpZ25lZCBsb25nKSBVU0VDU19QRVJfSklGRlkgPDwgMTIpCisKKy8qCisgKiBDcmVhdGUgYSBzbWFsbCB0aW1lIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdGltZXIgaW50ZXJydXB0cworICogb24gdGhlIGRpZmZlcmVudCBjcHVzIHRvIGF2b2lkIGxvY2sgY29udGVudGlvbi4KKyAqLworI2RlZmluZSBDUFVfREVWSUFUSU9OICAgICAgIChzbXBfcHJvY2Vzc29yX2lkKCkgPDwgMTIpCisKKyNkZWZpbmUgVElDS19TSVpFIHRpY2sKKwordTY0IGppZmZpZXNfNjQgPSBJTklUSUFMX0pJRkZJRVM7CisKK0VYUE9SVF9TWU1CT0woamlmZmllc182NCk7CisKK3N0YXRpYyBleHRfaW50X2luZm9fdCBleHRfaW50X2luZm9fY2M7CitzdGF0aWMgdTY0IGluaXRfdGltZXJfY2M7CitzdGF0aWMgdTY0IGppZmZpZXNfdGltZXJfY2M7CitzdGF0aWMgdTY0IHh0aW1lX2NjOworCitleHRlcm4gdW5zaWduZWQgbG9uZyB3YWxsX2ppZmZpZXM7CisKKy8qCisgKiBTY2hlZHVsZXIgY2xvY2sgLSByZXR1cm5zIGN1cnJlbnQgdGltZSBpbiBuYW5vc2VjIHVuaXRzLgorICovCit1bnNpZ25lZCBsb25nIGxvbmcgc2NoZWRfY2xvY2sodm9pZCkKK3sKKwlyZXR1cm4gKChnZXRfY2xvY2soKSAtIGppZmZpZXNfdGltZXJfY2MpICogMTAwMCkgPj4gMTI7Cit9CisKK3ZvaWQgdG9kX3RvX3RpbWV2YWwoX191NjQgdG9kdmFsLCBzdHJ1Y3QgdGltZXNwZWMgKnh0aW1lKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBzZWM7CisKKwlzZWMgPSB0b2R2YWwgPj4gMTI7CisJZG9fZGl2KHNlYywgMTAwMDAwMCk7CisJeHRpbWUtPnR2X3NlYyA9IHNlYzsKKwl0b2R2YWwgLT0gKHNlYyAqIDEwMDAwMDApIDw8IDEyOworCXh0aW1lLT50dl9uc2VjID0gKCh0b2R2YWwgKiAxMDAwKSA+PiAxMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBkb19nZXR0aW1lb2Zmc2V0KHZvaWQpIAoreworCV9fdTY0IG5vdzsKKworICAgICAgICBub3cgPSAoZ2V0X2Nsb2NrKCkgLSBqaWZmaWVzX3RpbWVyX2NjKSA+PiAxMjsKKwkvKiBXZSByZXF1aXJlIHRoZSBvZmZzZXQgZnJvbSB0aGUgbGF0ZXN0IHVwZGF0ZSBvZiB4dGltZSAqLworCW5vdyAtPSAoX191NjQpIHdhbGxfamlmZmllcypVU0VDU19QRVJfSklGRlk7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nKSBub3c7Cit9CisKKy8qCisgKiBUaGlzIHZlcnNpb24gb2YgZ2V0dGltZW9mZGF5IGhhcyBtaWNyb3NlY29uZCByZXNvbHV0aW9uLgorICovCit2b2lkIGRvX2dldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqdHYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHNlcTsKKwl1bnNpZ25lZCBsb25nIHVzZWMsIHNlYzsKKworCWRvIHsKKwkJc2VxID0gcmVhZF9zZXFiZWdpbl9pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7CisKKwkJc2VjID0geHRpbWUudHZfc2VjOworCQl1c2VjID0geHRpbWUudHZfbnNlYyAvIDEwMDAgKyBkb19nZXR0aW1lb2Zmc2V0KCk7CisJfSB3aGlsZSAocmVhZF9zZXFyZXRyeV9pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBzZXEsIGZsYWdzKSk7CisKKwl3aGlsZSAodXNlYyA+PSAxMDAwMDAwKSB7CisJCXVzZWMgLT0gMTAwMDAwMDsKKwkJc2VjKys7CisJfQorCisJdHYtPnR2X3NlYyA9IHNlYzsKKwl0di0+dHZfdXNlYyA9IHVzZWM7Cit9CisKK0VYUE9SVF9TWU1CT0woZG9fZ2V0dGltZW9mZGF5KTsKKworaW50IGRvX3NldHRpbWVvZmRheShzdHJ1Y3QgdGltZXNwZWMgKnR2KQoreworCXRpbWVfdCB3dG1fc2VjLCBzZWMgPSB0di0+dHZfc2VjOworCWxvbmcgd3RtX25zZWMsIG5zZWMgPSB0di0+dHZfbnNlYzsKKworCWlmICgodW5zaWduZWQgbG9uZyl0di0+dHZfbnNlYyA+PSBOU0VDX1BFUl9TRUMpCisJCXJldHVybiAtRUlOVkFMOworCisJd3JpdGVfc2VxbG9ja19pcnEoJnh0aW1lX2xvY2spOworCS8qIFRoaXMgaXMgcmV2b2x0aW5nLiBXZSBuZWVkIHRvIHNldCB0aGUgeHRpbWUudHZfbnNlYworCSAqIGNvcnJlY3RseS4gSG93ZXZlciwgdGhlIHZhbHVlIGluIHRoaXMgbG9jYXRpb24gaXMKKwkgKiBpcyB2YWx1ZSBhdCB0aGUgbGFzdCB0aWNrLgorCSAqIERpc2NvdmVyIHdoYXQgY29ycmVjdGlvbiBnZXR0aW1lb2ZkYXkKKwkgKiB3b3VsZCBoYXZlIGRvbmUsIGFuZCB0aGVuIHVuZG8gaXQhCisJICovCisJbnNlYyAtPSBkb19nZXR0aW1lb2Zmc2V0KCkgKiAxMDAwOworCisJd3RtX3NlYyAgPSB3YWxsX3RvX21vbm90b25pYy50dl9zZWMgKyAoeHRpbWUudHZfc2VjIC0gc2VjKTsKKwl3dG1fbnNlYyA9IHdhbGxfdG9fbW9ub3RvbmljLnR2X25zZWMgKyAoeHRpbWUudHZfbnNlYyAtIG5zZWMpOworCisJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJnh0aW1lLCBzZWMsIG5zZWMpOworCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywgd3RtX3NlYywgd3RtX25zZWMpOworCisJdGltZV9hZGp1c3QgPSAwOwkJLyogc3RvcCBhY3RpdmUgYWRqdGltZSgpICovCisJdGltZV9zdGF0dXMgfD0gU1RBX1VOU1lOQzsKKwl0aW1lX21heGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOworCXRpbWVfZXN0ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7CisJd3JpdGVfc2VxdW5sb2NrX2lycSgmeHRpbWVfbG9jayk7CisJY2xvY2tfd2FzX3NldCgpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKGRvX3NldHRpbWVvZmRheSk7CisKKworI2lmZGVmIENPTkZJR19QUk9GSUxJTkcKKyNkZWZpbmUgczM5MF9kb19wcm9maWxlKHJlZ3MpCXByb2ZpbGVfdGljayhDUFVfUFJPRklMSU5HLCByZWdzKQorI2Vsc2UKKyNkZWZpbmUgczM5MF9kb19wcm9maWxlKHJlZ3MpICBkbyB7IDsgfSB3aGlsZSgwKQorI2VuZGlmIC8qIENPTkZJR19QUk9GSUxJTkcgKi8KKworCisvKgorICogdGltZXJfaW50ZXJydXB0KCkgbmVlZHMgdG8ga2VlcCB1cCB0aGUgcmVhbC10aW1lIGNsb2NrLAorICogYXMgd2VsbCBhcyBjYWxsIHRoZSAiZG9fdGltZXIoKSIgcm91dGluZSBldmVyeSBjbG9ja3RpY2sKKyAqLwordm9pZCBhY2NvdW50X3RpY2tzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCV9fdTY0IHRtcDsKKwlfX3UzMiB0aWNrcywgeHRpY2tzOworCisJLyogQ2FsY3VsYXRlIGhvdyBtYW55IHRpY2tzIGhhdmUgcGFzc2VkLiAqLworCWlmIChTMzkwX2xvd2NvcmUuaW50X2Nsb2NrIDwgUzM5MF9sb3djb3JlLmppZmZ5X3RpbWVyKSB7CisJCS8qCisJCSAqIFdlIGhhdmUgdG8gcHJvZ3JhbSB0aGUgY2xvY2sgY29tcGFyYXRvciBldmVuIGlmCisJCSAqIG5vIHRpY2sgaGFzIHBhc3NlZC4gVGhhdCBoYXBwZW5zIGlmIGUuZy4gYW4gaS9vCisJCSAqIGludGVycnVwdCB3YWtlcyB1cCBhbiBpZGxlIHByb2Nlc3NvciB0aGF0IGhhcworCQkgKiBzd2l0Y2hlZCBvZmYgaXRzIGh6IHRpbWVyLgorCQkgKi8KKwkJdG1wID0gUzM5MF9sb3djb3JlLmppZmZ5X3RpbWVyICsgQ1BVX0RFVklBVElPTjsKKwkJYXNtIHZvbGF0aWxlICgiU0NLQyAlMCIgOiA6ICJtIiAodG1wKSk7CisJCXJldHVybjsKKwl9CisJdG1wID0gUzM5MF9sb3djb3JlLmludF9jbG9jayAtIFMzOTBfbG93Y29yZS5qaWZmeV90aW1lcjsKKwlpZiAodG1wID49IDIqQ0xLX1RJQ0tTX1BFUl9KSUZGWSkgeyAgLyogbW9yZSB0aGFuIHR3byB0aWNrcyA/ICovCisJCXRpY2tzID0gX19kaXYodG1wLCBDTEtfVElDS1NfUEVSX0pJRkZZKSArIDE7CisJCVMzOTBfbG93Y29yZS5qaWZmeV90aW1lciArPQorCQkJQ0xLX1RJQ0tTX1BFUl9KSUZGWSAqIChfX3U2NCkgdGlja3M7CisJfSBlbHNlIGlmICh0bXAgPj0gQ0xLX1RJQ0tTX1BFUl9KSUZGWSkgeworCQl0aWNrcyA9IDI7CisJCVMzOTBfbG93Y29yZS5qaWZmeV90aW1lciArPSAyKkNMS19USUNLU19QRVJfSklGRlk7CisJfSBlbHNlIHsKKwkJdGlja3MgPSAxOworCQlTMzkwX2xvd2NvcmUuamlmZnlfdGltZXIgKz0gQ0xLX1RJQ0tTX1BFUl9KSUZGWTsKKwl9CisKKwkvKiBzZXQgY2xvY2sgY29tcGFyYXRvciBmb3IgbmV4dCB0aWNrICovCisJdG1wID0gUzM5MF9sb3djb3JlLmppZmZ5X3RpbWVyICsgQ1BVX0RFVklBVElPTjsKKyAgICAgICAgYXNtIHZvbGF0aWxlICgiU0NLQyAlMCIgOiA6ICJtIiAodG1wKSk7CisKKyNpZmRlZiBDT05GSUdfU01QCisJLyoKKwkgKiBEbyBub3QgcmVseSBvbiB0aGUgYm9vdCBjcHUgdG8gZG8gdGhlIGNhbGxzIHRvIGRvX3RpbWVyLgorCSAqIFNwcmVhZCBpdCBvdmVyIGFsbCBjcHVzIGluc3RlYWQuCisJICovCisJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7CisJaWYgKFMzOTBfbG93Y29yZS5qaWZmeV90aW1lciA+IHh0aW1lX2NjKSB7CisJCXRtcCA9IFMzOTBfbG93Y29yZS5qaWZmeV90aW1lciAtIHh0aW1lX2NjOworCQlpZiAodG1wID49IDIqQ0xLX1RJQ0tTX1BFUl9KSUZGWSkgeworCQkJeHRpY2tzID0gX19kaXYodG1wLCBDTEtfVElDS1NfUEVSX0pJRkZZKTsKKwkJCXh0aW1lX2NjICs9IChfX3U2NCkgeHRpY2tzICogQ0xLX1RJQ0tTX1BFUl9KSUZGWTsKKwkJfSBlbHNlIHsKKwkJCXh0aWNrcyA9IDE7CisJCQl4dGltZV9jYyArPSBDTEtfVElDS1NfUEVSX0pJRkZZOworCQl9CisJCXdoaWxlICh4dGlja3MtLSkKKwkJCWRvX3RpbWVyKHJlZ3MpOworCX0KKwl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOworI2Vsc2UKKwlmb3IgKHh0aWNrcyA9IHRpY2tzOyB4dGlja3MgPiAwOyB4dGlja3MtLSkKKwkJZG9fdGltZXIocmVncyk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCisJYWNjb3VudF91c2VyX3Z0aW1lKGN1cnJlbnQpOworI2Vsc2UKKwl3aGlsZSAodGlja3MtLSkKKwkJdXBkYXRlX3Byb2Nlc3NfdGltZXModXNlcl9tb2RlKHJlZ3MpKTsKKyNlbmRpZgorCisJczM5MF9kb19wcm9maWxlKHJlZ3MpOworfQorCisjaWZkZWYgQ09ORklHX05PX0lETEVfSFoKKworI2lmZGVmIENPTkZJR19OT19JRExFX0haX0lOSVQKK2ludCBzeXNjdGxfaHpfdGltZXIgPSAwOworI2Vsc2UKK2ludCBzeXNjdGxfaHpfdGltZXIgPSAxOworI2VuZGlmCisKKy8qCisgKiBTdG9wIHRoZSBIWiB0aWNrIG9uIHRoZSBjdXJyZW50IENQVS4KKyAqIE9ubHkgY3B1X2lkbGUgbWF5IGNhbGwgdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHN0b3BfaHpfdGltZXIodm9pZCkKK3sKKwlfX3U2NCB0aW1lcjsKKworCWlmIChzeXNjdGxfaHpfdGltZXIgIT0gMCkKKwkJcmV0dXJuOworCisJY3B1X3NldChzbXBfcHJvY2Vzc29yX2lkKCksIG5vaHpfY3B1X21hc2spOworCisJLyoKKwkgKiBMZWF2ZSB0aGUgY2xvY2sgY29tcGFyYXRvciBzZXQgdXAgZm9yIHRoZSBuZXh0IHRpbWVyCisJICogdGljayBpZiBlaXRoZXIgcmN1IG9yIGEgc29mdGlycSBpcyBwZW5kaW5nLgorCSAqLworCWlmIChyY3VfcGVuZGluZyhzbXBfcHJvY2Vzc29yX2lkKCkpIHx8IGxvY2FsX3NvZnRpcnFfcGVuZGluZygpKSB7CisJCWNwdV9jbGVhcihzbXBfcHJvY2Vzc29yX2lkKCksIG5vaHpfY3B1X21hc2spOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBUaGlzIGNwdSBpcyBnb2luZyByZWFsbHkgaWRsZS4gU2V0IHVwIHRoZSBjbG9jayBjb21wYXJhdG9yCisJICogZm9yIHRoZSBuZXh0IGV2ZW50LgorCSAqLworCXRpbWVyID0gKF9fdTY0KSAobmV4dF90aW1lcl9pbnRlcnJ1cHQoKSAtIGppZmZpZXMpICsgamlmZmllc182NDsKKwl0aW1lciA9IGppZmZpZXNfdGltZXJfY2MgKyB0aW1lciAqIENMS19USUNLU19QRVJfSklGRlk7CisJYXNtIHZvbGF0aWxlICgiU0NLQyAlMCIgOiA6ICJtIiAodGltZXIpKTsKK30KKworLyoKKyAqIFN0YXJ0IHRoZSBIWiB0aWNrIG9uIHRoZSBjdXJyZW50IENQVS4KKyAqIE9ubHkgY3B1X2lkbGUgbWF5IGNhbGwgdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0X2h6X3RpbWVyKHZvaWQpCit7CisJaWYgKCFjcHVfaXNzZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBub2h6X2NwdV9tYXNrKSkKKwkJcmV0dXJuOworCWFjY291bnRfdGlja3MoX19LU1RLX1BUUkVHUyhjdXJyZW50KSk7CisJY3B1X2NsZWFyKHNtcF9wcm9jZXNzb3JfaWQoKSwgbm9oel9jcHVfbWFzayk7Cit9CisKK3N0YXRpYyBpbnQgbm9oel9pZGxlX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJCQkgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIENQVV9JRExFOgorCQlzdG9wX2h6X3RpbWVyKCk7CisJCWJyZWFrOworCWNhc2UgQ1BVX05PVF9JRExFOgorCQlzdGFydF9oel90aW1lcigpOworCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBub2h6X2lkbGVfbmIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBub2h6X2lkbGVfbm90aWZ5LAorfTsKKwordm9pZCBfX2luaXQgbm9oel9pbml0KHZvaWQpCit7CisJaWYgKHJlZ2lzdGVyX2lkbGVfbm90aWZpZXIoJm5vaHpfaWRsZV9uYikpCisJCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciBpZGxlIG5vdGlmaWVyIik7Cit9CisKKyNlbmRpZgorCisvKgorICogU3RhcnQgdGhlIGNsb2NrIGNvbXBhcmF0b3Igb24gdGhlIGN1cnJlbnQgQ1BVLgorICovCit2b2lkIGluaXRfY3B1X3RpbWVyKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjcjA7CisJX191NjQgdGltZXI7CisKKwl0aW1lciA9IGppZmZpZXNfdGltZXJfY2MgKyBqaWZmaWVzXzY0ICogQ0xLX1RJQ0tTX1BFUl9KSUZGWTsKKwlTMzkwX2xvd2NvcmUuamlmZnlfdGltZXIgPSB0aW1lciArIENMS19USUNLU19QRVJfSklGRlk7CisJdGltZXIgKz0gQ0xLX1RJQ0tTX1BFUl9KSUZGWSArIENQVV9ERVZJQVRJT047CisJYXNtIHZvbGF0aWxlICgiU0NLQyAlMCIgOiA6ICJtIiAodGltZXIpKTsKKyAgICAgICAgLyogYWxsb3cgY2xvY2sgY29tcGFyYXRvciB0aW1lciBpbnRlcnJ1cHQgKi8KKwlfX2N0bF9zdG9yZShjcjAsIDAsIDApOworICAgICAgICBjcjAgfD0gMHg4MDA7CisJX19jdGxfbG9hZChjcjAsIDAsIDApOworfQorCitleHRlcm4gdm9pZCB2dGltZV9pbml0KHZvaWQpOworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgVE9EIGNsb2NrIGFuZCB0aGUgQ1BVIHRpbWVyIG9mCisgKiB0aGUgYm9vdCBjcHUuCisgKi8KK3ZvaWQgX19pbml0IHRpbWVfaW5pdCh2b2lkKQoreworCV9fdTY0IHNldF90aW1lX2NjOworCWludCBjYzsKKworICAgICAgICAvKiBraWNrIHRoZSBUT0QgY2xvY2sgKi8KKyAgICAgICAgYXNtIHZvbGF0aWxlICgiU1RDSyAwKCUxKVxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgIklQTSAgJTBcblx0IgorICAgICAgICAgICAgICAgICAgICAgICJTUkwgICUwLDI4IiA6ICI9ciIgKGNjKSA6ICJhIiAoJmluaXRfdGltZXJfY2MpIAorCQkJCSAgIDogIm1lbW9yeSIsICJjYyIpOworICAgICAgICBzd2l0Y2ggKGNjKSB7CisgICAgICAgIGNhc2UgMDogLyogY2xvY2sgaW4gc2V0IHN0YXRlOiBhbGwgaXMgZmluZSAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6IC8qIGNsb2NrIGluIG5vbi1zZXQgc3RhdGU6IEZJWE1FICovCisgICAgICAgICAgICAgICAgcHJpbnRrKCJ0aW1lX2luaXQ6IFRPRCBjbG9jayBpbiBub24tc2V0IHN0YXRlXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOiAvKiBjbG9jayBpbiBlcnJvciBzdGF0ZTogRklYTUUgKi8KKyAgICAgICAgICAgICAgICBwcmludGsoInRpbWVfaW5pdDogVE9EIGNsb2NrIGluIGVycm9yIHN0YXRlXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOiAvKiBjbG9jayBpbiBzdG9wcGVkIG9yIG5vdC1vcGVyYXRpb25hbCBzdGF0ZTogRklYTUUgKi8KKyAgICAgICAgICAgICAgICBwcmludGsoInRpbWVfaW5pdDogVE9EIGNsb2NrIHN0b3BwZWQvbm9uLW9wZXJhdGlvbmFsXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCWppZmZpZXNfdGltZXJfY2MgPSBpbml0X3RpbWVyX2NjIC0gamlmZmllc182NCAqIENMS19USUNLU19QRVJfSklGRlk7CisKKwkvKiBzZXQgeHRpbWUgKi8KKwl4dGltZV9jYyA9IGluaXRfdGltZXJfY2MgKyBDTEtfVElDS1NfUEVSX0pJRkZZOworCXNldF90aW1lX2NjID0gaW5pdF90aW1lcl9jYyAtIDB4ODEyNmQ2MGU0NjAwMDAwMExMICsKKwkJKDB4M2MyNjcwMExMKjEwMDAwMDAqNDA5Nik7CisgICAgICAgIHRvZF90b190aW1ldmFsKHNldF90aW1lX2NjLCAmeHRpbWUpOworICAgICAgICBzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC14dGltZS50dl9zZWMsIC14dGltZS50dl9uc2VjKTsKKworCS8qIHJlcXVlc3QgdGhlIGNsb2NrIGNvbXBhcmF0b3IgZXh0ZXJuYWwgaW50ZXJydXB0ICovCisgICAgICAgIGlmIChyZWdpc3Rlcl9lYXJseV9leHRlcm5hbF9pbnRlcnJ1cHQoMHgxMDA0LCAwLAorCQkJCQkgICAgICAmZXh0X2ludF9pbmZvX2NjKSAhPSAwKQorICAgICAgICAgICAgICAgIHBhbmljKCJDb3VsZG4ndCByZXF1ZXN0IGV4dGVybmFsIGludGVycnVwdCAweDEwMDQiKTsKKworICAgICAgICBpbml0X2NwdV90aW1lcigpOworCisjaWZkZWYgQ09ORklHX05PX0lETEVfSFoKKwlub2h6X2luaXQoKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1ZJUlRfVElNRVIKKwl2dGltZV9pbml0KCk7CisjZW5kaWYKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOTBlOTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMKQEAgLTAsMCArMSw3MzggQEAKKy8qCisgKiAgYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCisgKgorICogIFMzOTAgdmVyc2lvbgorICogICAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgorICogICAgQXV0aG9yKHMpOiBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pLAorICogICAgICAgICAgICAgICBEZW5pcyBKb3NlcGggQmFycm93IChkamJhcnJvd0BkZS5pYm0uY29tLGJhcnJvd19kakB5YWhvby5jb20pLAorICoKKyAqICBEZXJpdmVkIGZyb20gImFyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYyIKKyAqICAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBMaW51cyBUb3J2YWxkcworICovCisKKy8qCisgKiAnVHJhcHMuYycgaGFuZGxlcyBoYXJkd2FyZSB0cmFwcyBhbmQgZmF1bHRzIGFmdGVyIHdlIGhhdmUgc2F2ZWQgc29tZQorICogc3RhdGUgaW4gJ2FzbS5zJy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9tYXRoZW11Lmg+CisjaW5jbHVkZSA8YXNtL2NwY21kLmg+CisjaW5jbHVkZSA8YXNtL3MzOTBfZXh0Lmg+CisjaW5jbHVkZSA8YXNtL2xvd2NvcmUuaD4KKyNpbmNsdWRlIDxhc20vZGVidWcuaD4KKworLyogQ2FsbGVkIGZyb20gZW50cnkuUyBvbmx5ICovCitleHRlcm4gdm9pZCBoYW5kbGVfcGVyX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKK3R5cGVkZWYgdm9pZCBwZ21fY2hlY2tfaGFuZGxlcl90KHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOworcGdtX2NoZWNrX2hhbmRsZXJfdCAqcGdtX2NoZWNrX3RhYmxlWzEyOF07CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisjaWZkZWYgQ09ORklHX1BST0NFU1NfREVCVUcKK2ludCBzeXNjdGxfdXNlcnByb2Nlc3NfZGVidWcgPSAxOworI2Vsc2UKK2ludCBzeXNjdGxfdXNlcnByb2Nlc3NfZGVidWcgPSAwOworI2VuZGlmCisjZW5kaWYKKworZXh0ZXJuIHBnbV9jaGVja19oYW5kbGVyX3QgZG9fcHJvdGVjdGlvbl9leGNlcHRpb247CitleHRlcm4gcGdtX2NoZWNrX2hhbmRsZXJfdCBkb19kYXRfZXhjZXB0aW9uOworZXh0ZXJuIHBnbV9jaGVja19oYW5kbGVyX3QgZG9fcHNldWRvX3BhZ2VfZmF1bHQ7CisjaWZkZWYgQ09ORklHX1BGQVVMVAorZXh0ZXJuIGludCBwZmF1bHRfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHBmYXVsdF9maW5pKHZvaWQpOworZXh0ZXJuIHZvaWQgcGZhdWx0X2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncywgX191MTYgZXJyb3JfY29kZSk7CitzdGF0aWMgZXh0X2ludF9pbmZvX3QgZXh0X2ludF9wZmF1bHQ7CisjZW5kaWYKK2V4dGVybiBwZ21fY2hlY2tfaGFuZGxlcl90IGRvX21vbml0b3JfY2FsbDsKKworI2RlZmluZSBzdGFja19wb2ludGVyICh7IHZvaWQgKipzcDsgYXNtKCJsYSAlMCwwKDE1KSIgOiAiPSZkIiAoc3ApKTsgc3A7IH0pCisKKyNpZm5kZWYgQ09ORklHX0FSQ0hfUzM5MFgKKyNkZWZpbmUgRk9VUkxPTkcgIiUwOGx4ICUwOGx4ICUwOGx4ICUwOGx4XG4iCitzdGF0aWMgaW50IGtzdGFja19kZXB0aF90b19wcmludCA9IDEyOworI2Vsc2UgLyogQ09ORklHX0FSQ0hfUzM5MFggKi8KKyNkZWZpbmUgRk9VUkxPTkcgIiUwMTZseCAlMDE2bHggJTAxNmx4ICUwMTZseFxuIgorc3RhdGljIGludCBrc3RhY2tfZGVwdGhfdG9fcHJpbnQgPSAyMDsKKyNlbmRpZiAvKiBDT05GSUdfQVJDSF9TMzkwWCAqLworCisvKgorICogRm9yIHNob3dfdHJhY2Ugd2UgaGF2ZSB0cmVlIGRpZmZlcmVudCBzdGFjayB0byBjb25zaWRlcjoKKyAqICAgLSB0aGUgcGFuaWMgc3RhY2sgd2hpY2ggaXMgdXNlZCBpZiB0aGUga2VybmVsIHN0YWNrIGhhcyBvdmVyZmxvd24KKyAqICAgLSB0aGUgYXN5bmNocm9ub3VzIGludGVycnVwdCBzdGFjayAoY3B1IHJlbGF0ZWQpCisgKiAgIC0gdGhlIHN5bmNocm9ub3VzIGtlcm5lbCBzdGFjayAocHJvY2VzcyByZWxhdGVkKQorICogVGhlIHN0YWNrIHRyYWNlIGNhbiBzdGFydCBhdCBhbnkgb2YgdGhlIHRocmVlIHN0YWNrIGFuZCBjYW4gcG90ZW50aWFsbHkKKyAqIHRvdWNoIGFsbCBvZiB0aGVtLiBUaGUgb3JkZXIgaXM6IHBhbmljIHN0YWNrLCBhc3luYyBzdGFjaywgc3luYyBzdGFjay4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcKK19fc2hvd190cmFjZSh1bnNpZ25lZCBsb25nIHNwLCB1bnNpZ25lZCBsb25nIGxvdywgdW5zaWduZWQgbG9uZyBoaWdoKQoreworCXN0cnVjdCBzdGFja19mcmFtZSAqc2Y7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CisKKwl3aGlsZSAoMSkgeworCQlzcCA9IHNwICYgUFNXX0FERFJfSU5TTjsKKwkJaWYgKHNwIDwgbG93IHx8IHNwID4gaGlnaCAtIHNpemVvZigqc2YpKQorCQkJcmV0dXJuIHNwOworCQlzZiA9IChzdHJ1Y3Qgc3RhY2tfZnJhbWUgKikgc3A7CisJCXByaW50aygiKFs8JTAxNmx4Pl0gIiwgc2YtPmdwcnNbOF0gJiBQU1dfQUREUl9JTlNOKTsKKwkJcHJpbnRfc3ltYm9sKCIlcylcbiIsIHNmLT5ncHJzWzhdICYgUFNXX0FERFJfSU5TTik7CisJCS8qIEZvbGxvdyB0aGUgYmFja2NoYWluLiAqLworCQl3aGlsZSAoMSkgeworCQkJbG93ID0gc3A7CisJCQlzcCA9IHNmLT5iYWNrX2NoYWluICYgUFNXX0FERFJfSU5TTjsKKwkJCWlmICghc3ApCisJCQkJYnJlYWs7CisJCQlpZiAoc3AgPD0gbG93IHx8IHNwID4gaGlnaCAtIHNpemVvZigqc2YpKQorCQkJCXJldHVybiBzcDsKKwkJCXNmID0gKHN0cnVjdCBzdGFja19mcmFtZSAqKSBzcDsKKwkJCXByaW50aygiIFs8JTAxNmx4Pl0gIiwgc2YtPmdwcnNbOF0gJiBQU1dfQUREUl9JTlNOKTsKKwkJCXByaW50X3N5bWJvbCgiJXNcbiIsIHNmLT5ncHJzWzhdICYgUFNXX0FERFJfSU5TTik7CisJCX0KKwkJLyogWmVybyBiYWNrY2hhaW4gZGV0ZWN0ZWQsIGNoZWNrIGZvciBpbnRlcnJ1cHQgZnJhbWUuICovCisJCXNwID0gKHVuc2lnbmVkIGxvbmcpIChzZiArIDEpOworCQlpZiAoc3AgPD0gbG93IHx8IHNwID4gaGlnaCAtIHNpemVvZigqcmVncykpCisJCQlyZXR1cm4gc3A7CisJCXJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgc3A7CisJCXByaW50aygiIFs8JTAxNmx4Pl0gIiwgcmVncy0+cHN3LmFkZHIgJiBQU1dfQUREUl9JTlNOKTsKKwkJcHJpbnRfc3ltYm9sKCIlc1xuIiwgcmVncy0+cHN3LmFkZHIgJiBQU1dfQUREUl9JTlNOKTsKKwkJbG93ID0gc3A7CisJCXNwID0gcmVncy0+Z3Byc1sxNV07CisJfQorfQorCit2b2lkIHNob3dfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICogc3RhY2spCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3IxNSBhc20gKCIxNSIpOworCXVuc2lnbmVkIGxvbmcgc3A7CisKKwlzcCA9ICh1bnNpZ25lZCBsb25nKSBzdGFjazsKKwlpZiAoIXNwKQorCQlzcCA9IHRhc2sgPyB0YXNrLT50aHJlYWQua3NwIDogX19yMTU7CisJcHJpbnRrKCJDYWxsIFRyYWNlOlxuIik7CisjaWZkZWYgQ09ORklHX0NIRUNLX1NUQUNLCisJc3AgPSBfX3Nob3dfdHJhY2Uoc3AsIFMzOTBfbG93Y29yZS5wYW5pY19zdGFjayAtIDQwOTYsCisJCQkgIFMzOTBfbG93Y29yZS5wYW5pY19zdGFjayk7CisjZW5kaWYKKwlzcCA9IF9fc2hvd190cmFjZShzcCwgUzM5MF9sb3djb3JlLmFzeW5jX3N0YWNrIC0gQVNZTkNfU0laRSwKKwkJCSAgUzM5MF9sb3djb3JlLmFzeW5jX3N0YWNrKTsKKwlpZiAodGFzaykKKwkJX19zaG93X3RyYWNlKHNwLCAodW5zaWduZWQgbG9uZykgdGFzay0+dGhyZWFkX2luZm8sCisJCQkgICAgICh1bnNpZ25lZCBsb25nKSB0YXNrLT50aHJlYWRfaW5mbyArIFRIUkVBRF9TSVpFKTsKKwllbHNlCisJCV9fc2hvd190cmFjZShzcCwgUzM5MF9sb3djb3JlLnRocmVhZF9pbmZvLAorCQkJICAgICBTMzkwX2xvd2NvcmUudGhyZWFkX2luZm8gKyBUSFJFQURfU0laRSk7CisJcHJpbnRrKCJcbiIpOworfQorCit2b2lkIHNob3dfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICpzcCkKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nICogX19yMTUgYXNtICgiMTUiKTsKKwl1bnNpZ25lZCBsb25nICpzdGFjazsKKwlpbnQgaTsKKworCS8vIGRlYnVnZ2luZyBhaWQ6ICJzaG93X3N0YWNrKE5VTEwpOyIgcHJpbnRzIHRoZQorCS8vIGJhY2sgdHJhY2UgZm9yIHRoaXMgY3B1LgorCisJaWYgKCFzcCkKKwkJc3AgPSB0YXNrID8gKHVuc2lnbmVkIGxvbmcgKikgdGFzay0+dGhyZWFkLmtzcCA6IF9fcjE1OworCisJc3RhY2sgPSBzcDsKKwlmb3IgKGkgPSAwOyBpIDwga3N0YWNrX2RlcHRoX3RvX3ByaW50OyBpKyspIHsKKwkJaWYgKCgoYWRkcl90KSBzdGFjayAmIChUSFJFQURfU0laRS0xKSkgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoaSAmJiAoKGkgKiBzaXplb2YgKGxvbmcpICUgMzIpID09IDApKQorCQkJcHJpbnRrKCJcbiAgICAgICAiKTsKKwkJcHJpbnRrKCIlcCAiLCAodm9pZCAqKSpzdGFjaysrKTsKKwl9CisJcHJpbnRrKCJcbiIpOworCXNob3dfdHJhY2UodGFzaywgc3ApOworfQorCisvKgorICogVGhlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkdW1wX3N0YWNrIGdlbmVyYXRvcgorICovCit2b2lkIGR1bXBfc3RhY2sodm9pZCkKK3sKKwlzaG93X3N0YWNrKDAsIDApOworfQorCitFWFBPUlRfU1lNQk9MKGR1bXBfc3RhY2spOworCit2b2lkIHNob3dfcmVnaXN0ZXJzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCW1tX3NlZ21lbnRfdCBvbGRfZnM7CisJY2hhciAqbW9kZTsKKwlpbnQgaTsKKworCW1vZGUgPSAocmVncy0+cHN3Lm1hc2sgJiBQU1dfTUFTS19QU1RBVEUpID8gIlVzZXIiIDogIktybmwiOworCXByaW50aygiJXMgUFNXIDogJXAgJXAiLAorCSAgICAgICBtb2RlLCAodm9pZCAqKSByZWdzLT5wc3cubWFzaywKKwkgICAgICAgKHZvaWQgKikgcmVncy0+cHN3LmFkZHIpOworCXByaW50X3N5bWJvbCgiICglcylcbiIsIHJlZ3MtPnBzdy5hZGRyICYgUFNXX0FERFJfSU5TTik7CisJcHJpbnRrKCIlcyBHUFJTOiAiIEZPVVJMT05HLCBtb2RlLAorCSAgICAgICByZWdzLT5ncHJzWzBdLCByZWdzLT5ncHJzWzFdLCByZWdzLT5ncHJzWzJdLCByZWdzLT5ncHJzWzNdKTsKKwlwcmludGsoIiAgICAgICAgICAgIiBGT1VSTE9ORywKKwkgICAgICAgcmVncy0+Z3Byc1s0XSwgcmVncy0+Z3Byc1s1XSwgcmVncy0+Z3Byc1s2XSwgcmVncy0+Z3Byc1s3XSk7CisJcHJpbnRrKCIgICAgICAgICAgICIgRk9VUkxPTkcsCisJICAgICAgIHJlZ3MtPmdwcnNbOF0sIHJlZ3MtPmdwcnNbOV0sIHJlZ3MtPmdwcnNbMTBdLCByZWdzLT5ncHJzWzExXSk7CisJcHJpbnRrKCIgICAgICAgICAgICIgRk9VUkxPTkcsCisJICAgICAgIHJlZ3MtPmdwcnNbMTJdLCByZWdzLT5ncHJzWzEzXSwgcmVncy0+Z3Byc1sxNF0sIHJlZ3MtPmdwcnNbMTVdKTsKKworI2lmIDAKKwkvKiBGSVhNRTogdGhpcyBpc24ndCBuZWVkZWQgYW55IG1vcmUgYnV0IGl0IGNoYW5nZXMgdGhlIGtzeW1vb3BzCisJICogaW5wdXQuIFRvIHJlbW92ZSBvciBub3QgdG8gcmVtb3ZlIC4uLiAqLworCXNhdmVfYWNjZXNzX3JlZ3MocmVncy0+YWNycyk7CisJcHJpbnRrKCIlcyBBQ1JTOiAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLCBtb2RlLAorCSAgICAgICByZWdzLT5hY3JzWzBdLCByZWdzLT5hY3JzWzFdLCByZWdzLT5hY3JzWzJdLCByZWdzLT5hY3JzWzNdKTsKKwlwcmludGsoIiAgICAgICAgICAgJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKKwkgICAgICAgcmVncy0+YWNyc1s0XSwgcmVncy0+YWNyc1s1XSwgcmVncy0+YWNyc1s2XSwgcmVncy0+YWNyc1s3XSk7CisJcHJpbnRrKCIgICAgICAgICAgICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCisJICAgICAgIHJlZ3MtPmFjcnNbOF0sIHJlZ3MtPmFjcnNbOV0sIHJlZ3MtPmFjcnNbMTBdLCByZWdzLT5hY3JzWzExXSk7CisJcHJpbnRrKCIgICAgICAgICAgICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCisJICAgICAgIHJlZ3MtPmFjcnNbMTJdLCByZWdzLT5hY3JzWzEzXSwgcmVncy0+YWNyc1sxNF0sIHJlZ3MtPmFjcnNbMTVdKTsKKyNlbmRpZgorCisJLyoKKwkgKiBQcmludCB0aGUgZmlyc3QgMjAgYnl0ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtIGF0IHRoZQorCSAqIHRpbWUgb2YgdGhlIGZhdWx0LgorCSAqLworCW9sZF9mcyA9IGdldF9mcygpOworCWlmIChyZWdzLT5wc3cubWFzayAmIFBTV19NQVNLX1BTVEFURSkKKwkJc2V0X2ZzKFVTRVJfRFMpOworCWVsc2UKKwkJc2V0X2ZzKEtFUk5FTF9EUyk7CisJcHJpbnRrKCIlcyBDb2RlOiAiLCBtb2RlKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworCQl1bnNpZ25lZCBjaGFyIGM7CisJCWlmIChfX2dldF91c2VyKGMsIChjaGFyIF9fdXNlciAqKShyZWdzLT5wc3cuYWRkciArIGkpKSkgeworCQkJcHJpbnRrKCIgQmFkIFBTVy4iKTsKKwkJCWJyZWFrOworCQl9CisJCXByaW50aygiJTAyeCAiLCBjKTsKKwl9CisJc2V0X2ZzKG9sZF9mcyk7CisKKwlwcmludGsoIlxuIik7Cit9CQorCisvKiBUaGlzIGlzIGNhbGxlZCBmcm9tIGZzL3Byb2MvYXJyYXkuYyAqLworY2hhciAqdGFza19zaG93X3JlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICpidWZmZXIpCit7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CisKKwlyZWdzID0gX19LU1RLX1BUUkVHUyh0YXNrKTsKKwlidWZmZXIgKz0gc3ByaW50ZihidWZmZXIsICJ0YXNrOiAlcCwga3NwOiAlcFxuIiwKKwkJICAgICAgIHRhc2ssICh2b2lkICopdGFzay0+dGhyZWFkLmtzcCk7CisJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiVXNlciBQU1cgOiAlcCAlcFxuIiwKKwkJICAgICAgICh2b2lkICopIHJlZ3MtPnBzdy5tYXNrLCAodm9pZCAqKXJlZ3MtPnBzdy5hZGRyKTsKKworCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwgIlVzZXIgR1BSUzogIiBGT1VSTE9ORywKKwkJCSAgcmVncy0+Z3Byc1swXSwgcmVncy0+Z3Byc1sxXSwKKwkJCSAgcmVncy0+Z3Byc1syXSwgcmVncy0+Z3Byc1szXSk7CisJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiICAgICAgICAgICAiIEZPVVJMT05HLAorCQkJICByZWdzLT5ncHJzWzRdLCByZWdzLT5ncHJzWzVdLAorCQkJICByZWdzLT5ncHJzWzZdLCByZWdzLT5ncHJzWzddKTsKKwlidWZmZXIgKz0gc3ByaW50ZihidWZmZXIsICIgICAgICAgICAgICIgRk9VUkxPTkcsCisJCQkgIHJlZ3MtPmdwcnNbOF0sIHJlZ3MtPmdwcnNbOV0sCisJCQkgIHJlZ3MtPmdwcnNbMTBdLCByZWdzLT5ncHJzWzExXSk7CisJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiICAgICAgICAgICAiIEZPVVJMT05HLAorCQkJICByZWdzLT5ncHJzWzEyXSwgcmVncy0+Z3Byc1sxM10sCisJCQkgIHJlZ3MtPmdwcnNbMTRdLCByZWdzLT5ncHJzWzE1XSk7CisJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiVXNlciBBQ1JTOiAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLAorCQkJICB0YXNrLT50aHJlYWQuYWNyc1swXSwgdGFzay0+dGhyZWFkLmFjcnNbMV0sCisJCQkgIHRhc2stPnRocmVhZC5hY3JzWzJdLCB0YXNrLT50aHJlYWQuYWNyc1szXSk7CisJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiICAgICAgICAgICAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLAorCQkJICB0YXNrLT50aHJlYWQuYWNyc1s0XSwgdGFzay0+dGhyZWFkLmFjcnNbNV0sCisJCQkgIHRhc2stPnRocmVhZC5hY3JzWzZdLCB0YXNrLT50aHJlYWQuYWNyc1s3XSk7CisJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiICAgICAgICAgICAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLAorCQkJICB0YXNrLT50aHJlYWQuYWNyc1s4XSwgdGFzay0+dGhyZWFkLmFjcnNbOV0sCisJCQkgIHRhc2stPnRocmVhZC5hY3JzWzEwXSwgdGFzay0+dGhyZWFkLmFjcnNbMTFdKTsKKwlidWZmZXIgKz0gc3ByaW50ZihidWZmZXIsICIgICAgICAgICAgICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCisJCQkgIHRhc2stPnRocmVhZC5hY3JzWzEyXSwgdGFzay0+dGhyZWFkLmFjcnNbMTNdLAorCQkJICB0YXNrLT50aHJlYWQuYWNyc1sxNF0sIHRhc2stPnRocmVhZC5hY3JzWzE1XSk7CisJcmV0dXJuIGJ1ZmZlcjsKK30KKworREVGSU5FX1NQSU5MT0NLKGRpZV9sb2NrKTsKKwordm9pZCBkaWUoY29uc3QgY2hhciAqIHN0ciwgc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycikKK3sKKwlzdGF0aWMgaW50IGRpZV9jb3VudGVyOworCisJZGVidWdfc3RvcF9hbGwoKTsKKwljb25zb2xlX3ZlcmJvc2UoKTsKKwlzcGluX2xvY2tfaXJxKCZkaWVfbG9jayk7CisJYnVzdF9zcGlubG9ja3MoMSk7CisJcHJpbnRrKCIlczogJTA0bHggWyMlZF1cbiIsIHN0ciwgZXJyICYgMHhmZmZmLCArK2RpZV9jb3VudGVyKTsKKyAgICAgICAgc2hvd19yZWdzKHJlZ3MpOworCWJ1c3Rfc3BpbmxvY2tzKDApOworICAgICAgICBzcGluX3VubG9ja19pcnEoJmRpZV9sb2NrKTsKKwlpZiAoaW5faW50ZXJydXB0KCkpCisJCXBhbmljKCJGYXRhbCBleGNlcHRpb24gaW4gaW50ZXJydXB0Iik7CisJaWYgKHBhbmljX29uX29vcHMpCisJCXBhbmljKCJGYXRhbCBleGNlcHRpb246IHBhbmljX29uX29vcHMiKTsKKyAgICAgICAgZG9fZXhpdChTSUdTRUdWKTsKK30KKworc3RhdGljIHZvaWQgaW5saW5lCityZXBvcnRfdXNlcl9mYXVsdChsb25nIGludGVycnVwdGlvbl9jb2RlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNDVEwpCisJaWYgKCFzeXNjdGxfdXNlcnByb2Nlc3NfZGVidWcpCisJCXJldHVybjsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NZU0NUTCkgfHwgZGVmaW5lZChDT05GSUdfUFJPQ0VTU19ERUJVRykKKwlwcmludGsoIlVzZXIgcHJvY2VzcyBmYXVsdDogaW50ZXJydXB0aW9uIGNvZGUgMHglbFhcbiIsCisJICAgICAgIGludGVycnVwdGlvbl9jb2RlKTsKKwlzaG93X3JlZ3MocmVncyk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgaW5saW5lIGRvX3RyYXAobG9uZyBpbnRlcnJ1cHRpb25fY29kZSwgaW50IHNpZ25yLCBjaGFyICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncywgc2lnaW5mb190ICppbmZvKQoreworCS8qCisJICogV2UgZ290IGFsbCBuZWVkZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgbG93Y29yZSBhbmQgY2FuCisJICogbm93IHNhZmVseSBzd2l0Y2ggb24gaW50ZXJydXB0cy4KKwkgKi8KKyAgICAgICAgaWYgKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKQorCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKyAgICAgICAgaWYgKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCisgICAgICAgICAgICAgICAgdHNrLT50aHJlYWQudHJhcF9ubyA9IGludGVycnVwdGlvbl9jb2RlICYgMHhmZmZmOworCQlmb3JjZV9zaWdfaW5mbyhzaWduciwgaW5mbywgdHNrKTsKKwkJcmVwb3J0X3VzZXJfZmF1bHQoaW50ZXJydXB0aW9uX2NvZGUsIHJlZ3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKmZpeHVwOworICAgICAgICAgICAgICAgIGZpeHVwID0gc2VhcmNoX2V4Y2VwdGlvbl90YWJsZXMocmVncy0+cHN3LmFkZHIgJiBQU1dfQUREUl9JTlNOKTsKKyAgICAgICAgICAgICAgICBpZiAoZml4dXApCisgICAgICAgICAgICAgICAgICAgICAgICByZWdzLT5wc3cuYWRkciA9IGZpeHVwLT5maXh1cCB8IFBTV19BRERSX0FNT0RFOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZShzdHIsIHJlZ3MsIGludGVycnVwdGlvbl9jb2RlKTsKKyAgICAgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmdldF9jaGVja19hZGRyZXNzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJldHVybiAodm9pZCAqKSgocmVncy0+cHN3LmFkZHItUzM5MF9sb3djb3JlLnBnbV9pbGMpICYgUFNXX0FERFJfSU5TTik7Cit9CisKK3ZvaWQgZG9fc2luZ2xlX3N0ZXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKChjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSAhPSAwKQorCQlmb3JjZV9zaWcoU0lHVFJBUCwgY3VycmVudCk7Cit9CisKK2FzbWxpbmthZ2Ugdm9pZAorZGVmYXVsdF90cmFwX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGludGVycnVwdGlvbl9jb2RlKQoreworICAgICAgICBpZiAocmVncy0+cHN3Lm1hc2sgJiBQU1dfTUFTS19QU1RBVEUpIHsKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworCQlkb19leGl0KFNJR1NFR1YpOworCQlyZXBvcnRfdXNlcl9mYXVsdChpbnRlcnJ1cHRpb25fY29kZSwgcmVncyk7CisJfSBlbHNlCisJCWRpZSgiVW5rbm93biBwcm9ncmFtIGV4Y2VwdGlvbiIsIHJlZ3MsIGludGVycnVwdGlvbl9jb2RlKTsKK30KKworI2RlZmluZSBET19FUlJPUl9JTkZPKHNpZ25yLCBzdHIsIG5hbWUsIHNpY29kZSwgc2lhZGRyKSBcCithc21saW5rYWdlIHZvaWQgbmFtZShzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgaW50ZXJydXB0aW9uX2NvZGUpIFwKK3sgXAorICAgICAgICBzaWdpbmZvX3QgaW5mbzsgXAorICAgICAgICBpbmZvLnNpX3NpZ25vID0gc2lnbnI7IFwKKyAgICAgICAgaW5mby5zaV9lcnJubyA9IDA7IFwKKyAgICAgICAgaW5mby5zaV9jb2RlID0gc2ljb2RlOyBcCisgICAgICAgIGluZm8uc2lfYWRkciA9ICh2b2lkICopc2lhZGRyOyBcCisgICAgICAgIGRvX3RyYXAoaW50ZXJydXB0aW9uX2NvZGUsIHNpZ25yLCBzdHIsIHJlZ3MsICZpbmZvKTsgXAorfQorCitET19FUlJPUl9JTkZPKFNJR0lMTCwgImFkZHJlc3NpbmcgZXhjZXB0aW9uIiwgYWRkcmVzc2luZ19leGNlcHRpb24sCisJICAgICAgSUxMX0lMTEFEUiwgZ2V0X2NoZWNrX2FkZHJlc3MocmVncykpCitET19FUlJPUl9JTkZPKFNJR0lMTCwgICJleGVjdXRlIGV4Y2VwdGlvbiIsIGV4ZWN1dGVfZXhjZXB0aW9uLAorCSAgICAgIElMTF9JTExPUE4sIGdldF9jaGVja19hZGRyZXNzKHJlZ3MpKQorRE9fRVJST1JfSU5GTyhTSUdGUEUsICAiZml4cG9pbnQgZGl2aWRlIGV4Y2VwdGlvbiIsIGRpdmlkZV9leGNlcHRpb24sCisJICAgICAgRlBFX0lOVERJViwgZ2V0X2NoZWNrX2FkZHJlc3MocmVncykpCitET19FUlJPUl9JTkZPKFNJR0ZQRSwgICJmaXhwb2ludCBvdmVyZmxvdyBleGNlcHRpb24iLCBvdmVyZmxvd19leGNlcHRpb24sCisJICAgICAgRlBFX0lOVE9WRiwgZ2V0X2NoZWNrX2FkZHJlc3MocmVncykpCitET19FUlJPUl9JTkZPKFNJR0ZQRSwgICJIRlAgb3ZlcmZsb3cgZXhjZXB0aW9uIiwgaGZwX292ZXJmbG93X2V4Y2VwdGlvbiwKKwkgICAgICBGUEVfRkxUT1ZGLCBnZXRfY2hlY2tfYWRkcmVzcyhyZWdzKSkKK0RPX0VSUk9SX0lORk8oU0lHRlBFLCAgIkhGUCB1bmRlcmZsb3cgZXhjZXB0aW9uIiwgaGZwX3VuZGVyZmxvd19leGNlcHRpb24sCisJICAgICAgRlBFX0ZMVFVORCwgZ2V0X2NoZWNrX2FkZHJlc3MocmVncykpCitET19FUlJPUl9JTkZPKFNJR0ZQRSwgICJIRlAgc2lnbmlmaWNhbmNlIGV4Y2VwdGlvbiIsIGhmcF9zaWduaWZpY2FuY2VfZXhjZXB0aW9uLAorCSAgICAgIEZQRV9GTFRSRVMsIGdldF9jaGVja19hZGRyZXNzKHJlZ3MpKQorRE9fRVJST1JfSU5GTyhTSUdGUEUsICAiSEZQIGRpdmlkZSBleGNlcHRpb24iLCBoZnBfZGl2aWRlX2V4Y2VwdGlvbiwKKwkgICAgICBGUEVfRkxURElWLCBnZXRfY2hlY2tfYWRkcmVzcyhyZWdzKSkKK0RPX0VSUk9SX0lORk8oU0lHRlBFLCAgIkhGUCBzcXVhcmUgcm9vdCBleGNlcHRpb24iLCBoZnBfc3FydF9leGNlcHRpb24sCisJICAgICAgRlBFX0ZMVElOViwgZ2V0X2NoZWNrX2FkZHJlc3MocmVncykpCitET19FUlJPUl9JTkZPKFNJR0lMTCwgICJvcGVyYW5kIGV4Y2VwdGlvbiIsIG9wZXJhbmRfZXhjZXB0aW9uLAorCSAgICAgIElMTF9JTExPUE4sIGdldF9jaGVja19hZGRyZXNzKHJlZ3MpKQorRE9fRVJST1JfSU5GTyhTSUdJTEwsICAicHJpdmlsZWdlZCBvcGVyYXRpb24iLCBwcml2aWxlZ2VkX29wLAorCSAgICAgIElMTF9QUlZPUEMsIGdldF9jaGVja19hZGRyZXNzKHJlZ3MpKQorRE9fRVJST1JfSU5GTyhTSUdJTEwsICAic3BlY2lhbCBvcGVyYXRpb24gZXhjZXB0aW9uIiwgc3BlY2lhbF9vcF9leGNlcHRpb24sCisJICAgICAgSUxMX0lMTE9QTiwgZ2V0X2NoZWNrX2FkZHJlc3MocmVncykpCitET19FUlJPUl9JTkZPKFNJR0lMTCwgICJ0cmFuc2xhdGlvbiBleGNlcHRpb24iLCB0cmFuc2xhdGlvbl9leGNlcHRpb24sCisJICAgICAgSUxMX0lMTE9QTiwgZ2V0X2NoZWNrX2FkZHJlc3MocmVncykpCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZG9fZnBfdHJhcChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdm9pZCAqbG9jYXRpb24sCisgICAgICAgICAgIGludCBmcGMsIGxvbmcgaW50ZXJydXB0aW9uX2NvZGUpCit7CisJc2lnaW5mb190IHNpOworCisJc2kuc2lfc2lnbm8gPSBTSUdGUEU7CisJc2kuc2lfZXJybm8gPSAwOworCXNpLnNpX2FkZHIgPSBsb2NhdGlvbjsKKwlzaS5zaV9jb2RlID0gMDsKKwkvKiBGUENbMl0gaXMgRGF0YSBFeGNlcHRpb24gQ29kZSAqLworCWlmICgoZnBjICYgMHgwMDAwMDMwMCkgPT0gMCkgeworCQkvKiBiaXRzIDYgYW5kIDcgb2YgRFhDIGFyZSAwIGlmZiBJRUVFIGV4Y2VwdGlvbiAqLworCQlpZiAoZnBjICYgMHg4MDAwKSAvKiBpbnZhbGlkIGZwIG9wZXJhdGlvbiAqLworCQkJc2kuc2lfY29kZSA9IEZQRV9GTFRJTlY7CisJCWVsc2UgaWYgKGZwYyAmIDB4NDAwMCkgLyogZGl2IGJ5IDAgKi8KKwkJCXNpLnNpX2NvZGUgPSBGUEVfRkxURElWOworCQllbHNlIGlmIChmcGMgJiAweDIwMDApIC8qIG92ZXJmbG93ICovCisJCQlzaS5zaV9jb2RlID0gRlBFX0ZMVE9WRjsKKwkJZWxzZSBpZiAoZnBjICYgMHgxMDAwKSAvKiB1bmRlcmZsb3cgKi8KKwkJCXNpLnNpX2NvZGUgPSBGUEVfRkxUVU5EOworCQllbHNlIGlmIChmcGMgJiAweDA4MDApIC8qIGluZXhhY3QgKi8KKwkJCXNpLnNpX2NvZGUgPSBGUEVfRkxUUkVTOworCX0KKwljdXJyZW50LT50aHJlYWQuaWVlZV9pbnN0cnVjdGlvbl9wb2ludGVyID0gKGFkZHJfdCkgbG9jYXRpb247CisJZG9fdHJhcChpbnRlcnJ1cHRpb25fY29kZSwgU0lHRlBFLAorCQkiZmxvYXRpbmcgcG9pbnQgZXhjZXB0aW9uIiwgcmVncywgJnNpKTsKK30KKworYXNtbGlua2FnZSB2b2lkIGlsbGVnYWxfb3Aoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGludGVycnVwdGlvbl9jb2RlKQoreworCXNpZ2luZm9fdCBpbmZvOworICAgICAgICBfX3U4IG9wY29kZVs2XTsKKwlfX3UxNiAqbG9jYXRpb247CisJaW50IHNpZ25hbCA9IDA7CisKKwlsb2NhdGlvbiA9IChfX3UxNiAqKSBnZXRfY2hlY2tfYWRkcmVzcyhyZWdzKTsKKworCS8qCisJICogV2UgZ290IGFsbCBuZWVkZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgbG93Y29yZSBhbmQgY2FuCisJICogbm93IHNhZmVseSBzd2l0Y2ggb24gaW50ZXJydXB0cy4KKwkgKi8KKwlpZiAocmVncy0+cHN3Lm1hc2sgJiBQU1dfTUFTS19QU1RBVEUpCisJCWxvY2FsX2lycV9lbmFibGUoKTsKKworCWlmIChyZWdzLT5wc3cubWFzayAmIFBTV19NQVNLX1BTVEFURSkgeworCQlnZXRfdXNlcigqKChfX3UxNiAqKSBvcGNvZGUpLCAoX191MTYgX191c2VyICopIGxvY2F0aW9uKTsKKwkJaWYgKCooKF9fdTE2ICopIG9wY29kZSkgPT0gUzM5MF9CUkVBS1BPSU5UX1UxNikgeworCQkJaWYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpCisJCQkJZm9yY2Vfc2lnKFNJR1RSQVAsIGN1cnJlbnQpOworCQkJZWxzZQorCQkJCXNpZ25hbCA9IFNJR0lMTDsKKyNpZmRlZiBDT05GSUdfTUFUSEVNVQorCQl9IGVsc2UgaWYgKG9wY29kZVswXSA9PSAweGIzKSB7CisJCQlnZXRfdXNlcigqKChfX3UxNiAqKSAob3Bjb2RlKzIpKSwgbG9jYXRpb24rMSk7CisJCQlzaWduYWwgPSBtYXRoX2VtdV9iMyhvcGNvZGUsIHJlZ3MpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3Bjb2RlWzBdID09IDB4ZWQpIHsKKwkJCWdldF91c2VyKCooKF9fdTMyICopIChvcGNvZGUrMikpLAorCQkJCSAoX191MzIgKikobG9jYXRpb24rMSkpOworCQkJc2lnbmFsID0gbWF0aF9lbXVfZWQob3Bjb2RlLCByZWdzKTsKKwkJfSBlbHNlIGlmICgqKChfX3UxNiAqKSBvcGNvZGUpID09IDB4YjI5OSkgeworCQkJZ2V0X3VzZXIoKigoX191MTYgKikgKG9wY29kZSsyKSksIGxvY2F0aW9uKzEpOworCQkJc2lnbmFsID0gbWF0aF9lbXVfc3JubShvcGNvZGUsIHJlZ3MpOworCQl9IGVsc2UgaWYgKCooKF9fdTE2ICopIG9wY29kZSkgPT0gMHhiMjljKSB7CisJCQlnZXRfdXNlcigqKChfX3UxNiAqKSAob3Bjb2RlKzIpKSwgbG9jYXRpb24rMSk7CisJCQlzaWduYWwgPSBtYXRoX2VtdV9zdGZwYyhvcGNvZGUsIHJlZ3MpOworCQl9IGVsc2UgaWYgKCooKF9fdTE2ICopIG9wY29kZSkgPT0gMHhiMjlkKSB7CisJCQlnZXRfdXNlcigqKChfX3UxNiAqKSAob3Bjb2RlKzIpKSwgbG9jYXRpb24rMSk7CisJCQlzaWduYWwgPSBtYXRoX2VtdV9sZnBjKG9wY29kZSwgcmVncyk7CisjZW5kaWYKKwkJfSBlbHNlCisJCQlzaWduYWwgPSBTSUdJTEw7CisJfSBlbHNlCisJCXNpZ25hbCA9IFNJR0lMTDsKKworI2lmZGVmIENPTkZJR19NQVRIRU1VCisgICAgICAgIGlmIChzaWduYWwgPT0gU0lHRlBFKQorCQlkb19mcF90cmFwKHJlZ3MsIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjLCBpbnRlcnJ1cHRpb25fY29kZSk7CisgICAgICAgIGVsc2UgaWYgKHNpZ25hbCA9PSBTSUdTRUdWKSB7CisJCWluZm8uc2lfc2lnbm8gPSBzaWduYWw7CisJCWluZm8uc2lfZXJybm8gPSAwOworCQlpbmZvLnNpX2NvZGUgPSBTRUdWX01BUEVSUjsKKwkJaW5mby5zaV9hZGRyID0gKHZvaWQgKikgbG9jYXRpb247CisJCWRvX3RyYXAoaW50ZXJydXB0aW9uX2NvZGUsIHNpZ25hbCwKKwkJCSJ1c2VyIGFkZHJlc3MgZmF1bHQiLCByZWdzLCAmaW5mbyk7CisJfSBlbHNlCisjZW5kaWYKKyAgICAgICAgaWYgKHNpZ25hbCkgeworCQlpbmZvLnNpX3NpZ25vID0gc2lnbmFsOworCQlpbmZvLnNpX2Vycm5vID0gMDsKKwkJaW5mby5zaV9jb2RlID0gSUxMX0lMTE9QQzsKKwkJaW5mby5zaV9hZGRyID0gKHZvaWQgKikgbG9jYXRpb247CisJCWRvX3RyYXAoaW50ZXJydXB0aW9uX2NvZGUsIHNpZ25hbCwKKwkJCSJpbGxlZ2FsIG9wZXJhdGlvbiIsIHJlZ3MsICZpbmZvKTsKKwl9Cit9CisKKworI2lmZGVmIENPTkZJR19NQVRIRU1VCithc21saW5rYWdlIHZvaWQgCitzcGVjaWZpY2F0aW9uX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgaW50ZXJydXB0aW9uX2NvZGUpCit7CisgICAgICAgIF9fdTggb3Bjb2RlWzZdOworCV9fdTE2ICpsb2NhdGlvbiA9IE5VTEw7CisJaW50IHNpZ25hbCA9IDA7CisKKwlsb2NhdGlvbiA9IChfX3UxNiAqKSBnZXRfY2hlY2tfYWRkcmVzcyhyZWdzKTsKKworCS8qCisJICogV2UgZ290IGFsbCBuZWVkZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgbG93Y29yZSBhbmQgY2FuCisJICogbm93IHNhZmVseSBzd2l0Y2ggb24gaW50ZXJydXB0cy4KKwkgKi8KKyAgICAgICAgaWYgKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKQorCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKyAgICAgICAgaWYgKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKSB7CisJCWdldF91c2VyKCooKF9fdTE2ICopIG9wY29kZSksIGxvY2F0aW9uKTsKKwkJc3dpdGNoIChvcGNvZGVbMF0pIHsKKwkJY2FzZSAweDI4OiAvKiBMRFIgUngsUnkgICAqLworCQkJc2lnbmFsID0gbWF0aF9lbXVfbGRyKG9wY29kZSk7CisJCQlicmVhazsKKwkJY2FzZSAweDM4OiAvKiBMRVIgUngsUnkgICAqLworCQkJc2lnbmFsID0gbWF0aF9lbXVfbGVyKG9wY29kZSk7CisJCQlicmVhazsKKwkJY2FzZSAweDYwOiAvKiBTVEQgUixEKFgsQikgKi8KKwkJCWdldF91c2VyKCooKF9fdTE2ICopIChvcGNvZGUrMikpLCBsb2NhdGlvbisxKTsKKwkJCXNpZ25hbCA9IG1hdGhfZW11X3N0ZChvcGNvZGUsIHJlZ3MpOworCQkJYnJlYWs7CisJCWNhc2UgMHg2ODogLyogTEQgUixEKFgsQikgKi8KKwkJCWdldF91c2VyKCooKF9fdTE2ICopIChvcGNvZGUrMikpLCBsb2NhdGlvbisxKTsKKwkJCXNpZ25hbCA9IG1hdGhfZW11X2xkKG9wY29kZSwgcmVncyk7CisJCQlicmVhazsKKwkJY2FzZSAweDcwOiAvKiBTVEUgUixEKFgsQikgKi8KKwkJCWdldF91c2VyKCooKF9fdTE2ICopIChvcGNvZGUrMikpLCBsb2NhdGlvbisxKTsKKwkJCXNpZ25hbCA9IG1hdGhfZW11X3N0ZShvcGNvZGUsIHJlZ3MpOworCQkJYnJlYWs7CisJCWNhc2UgMHg3ODogLyogTEUgUixEKFgsQikgKi8KKwkJCWdldF91c2VyKCooKF9fdTE2ICopIChvcGNvZGUrMikpLCBsb2NhdGlvbisxKTsKKwkJCXNpZ25hbCA9IG1hdGhfZW11X2xlKG9wY29kZSwgcmVncyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNpZ25hbCA9IFNJR0lMTDsKKwkJCWJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisJCXNpZ25hbCA9IFNJR0lMTDsKKworICAgICAgICBpZiAoc2lnbmFsID09IFNJR0ZQRSkKKwkJZG9fZnBfdHJhcChyZWdzLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYywgaW50ZXJydXB0aW9uX2NvZGUpOworICAgICAgICBlbHNlIGlmIChzaWduYWwpIHsKKwkJc2lnaW5mb190IGluZm87CisJCWluZm8uc2lfc2lnbm8gPSBzaWduYWw7CisJCWluZm8uc2lfZXJybm8gPSAwOworCQlpbmZvLnNpX2NvZGUgPSBJTExfSUxMT1BOOworCQlpbmZvLnNpX2FkZHIgPSBsb2NhdGlvbjsKKwkJZG9fdHJhcChpbnRlcnJ1cHRpb25fY29kZSwgc2lnbmFsLCAKKwkJCSJzcGVjaWZpY2F0aW9uIGV4Y2VwdGlvbiIsIHJlZ3MsICZpbmZvKTsKKwl9Cit9CisjZWxzZQorRE9fRVJST1JfSU5GTyhTSUdJTEwsICJzcGVjaWZpY2F0aW9uIGV4Y2VwdGlvbiIsIHNwZWNpZmljYXRpb25fZXhjZXB0aW9uLAorCSAgICAgIElMTF9JTExPUE4sIGdldF9jaGVja19hZGRyZXNzKHJlZ3MpKTsKKyNlbmRpZgorCithc21saW5rYWdlIHZvaWQgZGF0YV9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGludGVycnVwdGlvbl9jb2RlKQoreworCV9fdTE2ICpsb2NhdGlvbjsKKwlpbnQgc2lnbmFsID0gMDsKKworCWxvY2F0aW9uID0gKF9fdTE2ICopIGdldF9jaGVja19hZGRyZXNzKHJlZ3MpOworCisJLyoKKwkgKiBXZSBnb3QgYWxsIG5lZWRlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBsb3djb3JlIGFuZCBjYW4KKwkgKiBub3cgc2FmZWx5IHN3aXRjaCBvbiBpbnRlcnJ1cHRzLgorCSAqLworCWlmIChyZWdzLT5wc3cubWFzayAmIFBTV19NQVNLX1BTVEFURSkKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJaWYgKE1BQ0hJTkVfSEFTX0lFRUUpCisJCV9fYXNtX18gdm9sYXRpbGUgKCJzdGZwYyAlMFxuXHQiIAorCQkJCSAgOiAiPW0iIChjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMpKTsKKworI2lmZGVmIENPTkZJR19NQVRIRU1VCisgICAgICAgIGVsc2UgaWYgKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKSB7CisgICAgICAgIAlfX3U4IG9wY29kZVs2XTsKKwkJZ2V0X3VzZXIoKigoX191MTYgKikgb3Bjb2RlKSwgbG9jYXRpb24pOworCQlzd2l0Y2ggKG9wY29kZVswXSkgeworCQljYXNlIDB4Mjg6IC8qIExEUiBSeCxSeSAgICovCisJCQlzaWduYWwgPSBtYXRoX2VtdV9sZHIob3Bjb2RlKTsKKwkJCWJyZWFrOworCQljYXNlIDB4Mzg6IC8qIExFUiBSeCxSeSAgICovCisJCQlzaWduYWwgPSBtYXRoX2VtdV9sZXIob3Bjb2RlKTsKKwkJCWJyZWFrOworCQljYXNlIDB4NjA6IC8qIFNURCBSLEQoWCxCKSAqLworCQkJZ2V0X3VzZXIoKigoX191MTYgKikgKG9wY29kZSsyKSksIGxvY2F0aW9uKzEpOworCQkJc2lnbmFsID0gbWF0aF9lbXVfc3RkKG9wY29kZSwgcmVncyk7CisJCQlicmVhazsKKwkJY2FzZSAweDY4OiAvKiBMRCBSLEQoWCxCKSAqLworCQkJZ2V0X3VzZXIoKigoX191MTYgKikgKG9wY29kZSsyKSksIGxvY2F0aW9uKzEpOworCQkJc2lnbmFsID0gbWF0aF9lbXVfbGQob3Bjb2RlLCByZWdzKTsKKwkJCWJyZWFrOworCQljYXNlIDB4NzA6IC8qIFNURSBSLEQoWCxCKSAqLworCQkJZ2V0X3VzZXIoKigoX191MTYgKikgKG9wY29kZSsyKSksIGxvY2F0aW9uKzEpOworCQkJc2lnbmFsID0gbWF0aF9lbXVfc3RlKG9wY29kZSwgcmVncyk7CisJCQlicmVhazsKKwkJY2FzZSAweDc4OiAvKiBMRSBSLEQoWCxCKSAqLworCQkJZ2V0X3VzZXIoKigoX191MTYgKikgKG9wY29kZSsyKSksIGxvY2F0aW9uKzEpOworCQkJc2lnbmFsID0gbWF0aF9lbXVfbGUob3Bjb2RlLCByZWdzKTsKKwkJCWJyZWFrOworCQljYXNlIDB4YjM6CisJCQlnZXRfdXNlcigqKChfX3UxNiAqKSAob3Bjb2RlKzIpKSwgbG9jYXRpb24rMSk7CisJCQlzaWduYWwgPSBtYXRoX2VtdV9iMyhvcGNvZGUsIHJlZ3MpOworCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweGVkOgorCQkJZ2V0X3VzZXIoKigoX191MzIgKikgKG9wY29kZSsyKSksCisJCQkJIChfX3UzMiAqKShsb2NhdGlvbisxKSk7CisJCQlzaWduYWwgPSBtYXRoX2VtdV9lZChvcGNvZGUsIHJlZ3MpOworCQkJYnJlYWs7CisJICAgICAgICBjYXNlIDB4YjI6CisJCQlpZiAob3Bjb2RlWzFdID09IDB4OTkpIHsKKwkJCQlnZXRfdXNlcigqKChfX3UxNiAqKSAob3Bjb2RlKzIpKSwgbG9jYXRpb24rMSk7CisJCQkJc2lnbmFsID0gbWF0aF9lbXVfc3JubShvcGNvZGUsIHJlZ3MpOworCQkJfSBlbHNlIGlmIChvcGNvZGVbMV0gPT0gMHg5YykgeworCQkJCWdldF91c2VyKCooKF9fdTE2ICopIChvcGNvZGUrMikpLCBsb2NhdGlvbisxKTsKKwkJCQlzaWduYWwgPSBtYXRoX2VtdV9zdGZwYyhvcGNvZGUsIHJlZ3MpOworCQkJfSBlbHNlIGlmIChvcGNvZGVbMV0gPT0gMHg5ZCkgeworCQkJCWdldF91c2VyKCooKF9fdTE2ICopIChvcGNvZGUrMikpLCBsb2NhdGlvbisxKTsKKwkJCQlzaWduYWwgPSBtYXRoX2VtdV9sZnBjKG9wY29kZSwgcmVncyk7CisJCQl9IGVsc2UKKwkJCQlzaWduYWwgPSBTSUdJTEw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNpZ25hbCA9IFNJR0lMTDsKKwkJCWJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIAorCWlmIChjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiBGUENfRFhDX01BU0spCisJCXNpZ25hbCA9IFNJR0ZQRTsKKwllbHNlCisJCXNpZ25hbCA9IFNJR0lMTDsKKyAgICAgICAgaWYgKHNpZ25hbCA9PSBTSUdGUEUpCisJCWRvX2ZwX3RyYXAocmVncywgbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMsIGludGVycnVwdGlvbl9jb2RlKTsKKyAgICAgICAgZWxzZSBpZiAoc2lnbmFsKSB7CisJCXNpZ2luZm9fdCBpbmZvOworCQlpbmZvLnNpX3NpZ25vID0gc2lnbmFsOworCQlpbmZvLnNpX2Vycm5vID0gMDsKKwkJaW5mby5zaV9jb2RlID0gSUxMX0lMTE9QTjsKKwkJaW5mby5zaV9hZGRyID0gbG9jYXRpb247CisJCWRvX3RyYXAoaW50ZXJydXB0aW9uX2NvZGUsIHNpZ25hbCwgCisJCQkiZGF0YSBleGNlcHRpb24iLCByZWdzLCAmaW5mbyk7CisJfQorfQorCithc21saW5rYWdlIHZvaWQgc3BhY2Vfc3dpdGNoX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgaW50X2NvZGUpCit7CisgICAgICAgIHNpZ2luZm9fdCBpbmZvOworCisJLyogU2V0IHVzZXIgcHN3IGJhY2sgdG8gaG9tZSBzcGFjZSBtb2RlLiAqLworCWlmIChyZWdzLT5wc3cubWFzayAmIFBTV19NQVNLX1BTVEFURSkKKwkJcmVncy0+cHN3Lm1hc2sgfD0gUFNXX0FTQ19IT01FOworCS8qIFNlbmQgU0lHSUxMLiAqLworICAgICAgICBpbmZvLnNpX3NpZ25vID0gU0lHSUxMOworICAgICAgICBpbmZvLnNpX2Vycm5vID0gMDsKKyAgICAgICAgaW5mby5zaV9jb2RlID0gSUxMX1BSVk9QQzsKKyAgICAgICAgaW5mby5zaV9hZGRyID0gZ2V0X2NoZWNrX2FkZHJlc3MocmVncyk7CisgICAgICAgIGRvX3RyYXAoaW50X2NvZGUsIFNJR0lMTCwgInNwYWNlIHN3aXRjaCBldmVudCIsIHJlZ3MsICZpbmZvKTsKK30KKworYXNtbGlua2FnZSB2b2lkIGtlcm5lbF9zdGFja19vdmVyZmxvdyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJZGllKCJLZXJuZWwgc3RhY2sgb3ZlcmZsb3ciLCByZWdzLCAwKTsKKwlwYW5pYygiQ29ycnVwdCBrZXJuZWwgc3RhY2ssIGNhbid0IGNvbnRpbnVlLiIpOworfQorCisKKy8qIGluaXQgaXMgZG9uZSBpbiBsb3djb3JlLlMgYW5kIGhlYWQuUyAqLworCit2b2lkIF9faW5pdCB0cmFwX2luaXQodm9pZCkKK3sKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgICAgICAgIHBnbV9jaGVja190YWJsZVtpXSA9ICZkZWZhdWx0X3RyYXBfaGFuZGxlcjsKKyAgICAgICAgcGdtX2NoZWNrX3RhYmxlWzFdID0gJmlsbGVnYWxfb3A7CisgICAgICAgIHBnbV9jaGVja190YWJsZVsyXSA9ICZwcml2aWxlZ2VkX29wOworICAgICAgICBwZ21fY2hlY2tfdGFibGVbM10gPSAmZXhlY3V0ZV9leGNlcHRpb247CisgICAgICAgIHBnbV9jaGVja190YWJsZVs0XSA9ICZkb19wcm90ZWN0aW9uX2V4Y2VwdGlvbjsKKyAgICAgICAgcGdtX2NoZWNrX3RhYmxlWzVdID0gJmFkZHJlc3NpbmdfZXhjZXB0aW9uOworICAgICAgICBwZ21fY2hlY2tfdGFibGVbNl0gPSAmc3BlY2lmaWNhdGlvbl9leGNlcHRpb247CisgICAgICAgIHBnbV9jaGVja190YWJsZVs3XSA9ICZkYXRhX2V4Y2VwdGlvbjsKKyAgICAgICAgcGdtX2NoZWNrX3RhYmxlWzhdID0gJm92ZXJmbG93X2V4Y2VwdGlvbjsKKyAgICAgICAgcGdtX2NoZWNrX3RhYmxlWzldID0gJmRpdmlkZV9leGNlcHRpb247CisgICAgICAgIHBnbV9jaGVja190YWJsZVsweDBBXSA9ICZvdmVyZmxvd19leGNlcHRpb247CisgICAgICAgIHBnbV9jaGVja190YWJsZVsweDBCXSA9ICZkaXZpZGVfZXhjZXB0aW9uOworICAgICAgICBwZ21fY2hlY2tfdGFibGVbMHgwQ10gPSAmaGZwX292ZXJmbG93X2V4Y2VwdGlvbjsKKyAgICAgICAgcGdtX2NoZWNrX3RhYmxlWzB4MERdID0gJmhmcF91bmRlcmZsb3dfZXhjZXB0aW9uOworICAgICAgICBwZ21fY2hlY2tfdGFibGVbMHgwRV0gPSAmaGZwX3NpZ25pZmljYW5jZV9leGNlcHRpb247CisgICAgICAgIHBnbV9jaGVja190YWJsZVsweDBGXSA9ICZoZnBfZGl2aWRlX2V4Y2VwdGlvbjsKKyAgICAgICAgcGdtX2NoZWNrX3RhYmxlWzB4MTBdID0gJmRvX2RhdF9leGNlcHRpb247CisgICAgICAgIHBnbV9jaGVja190YWJsZVsweDExXSA9ICZkb19kYXRfZXhjZXB0aW9uOworICAgICAgICBwZ21fY2hlY2tfdGFibGVbMHgxMl0gPSAmdHJhbnNsYXRpb25fZXhjZXB0aW9uOworICAgICAgICBwZ21fY2hlY2tfdGFibGVbMHgxM10gPSAmc3BlY2lhbF9vcF9leGNlcHRpb247CisjaWZuZGVmIENPTkZJR19BUkNIX1MzOTBYCisgCXBnbV9jaGVja190YWJsZVsweDE0XSA9ICZkb19wc2V1ZG9fcGFnZV9mYXVsdDsKKyNlbHNlIC8qIENPTkZJR19BUkNIX1MzOTBYICovCisgICAgICAgIHBnbV9jaGVja190YWJsZVsweDM4XSA9ICZkb19kYXRfZXhjZXB0aW9uOworCXBnbV9jaGVja190YWJsZVsweDM5XSA9ICZkb19kYXRfZXhjZXB0aW9uOworCXBnbV9jaGVja190YWJsZVsweDNBXSA9ICZkb19kYXRfZXhjZXB0aW9uOworICAgICAgICBwZ21fY2hlY2tfdGFibGVbMHgzQl0gPSAmZG9fZGF0X2V4Y2VwdGlvbjsKKyNlbmRpZiAvKiBDT05GSUdfQVJDSF9TMzkwWCAqLworICAgICAgICBwZ21fY2hlY2tfdGFibGVbMHgxNV0gPSAmb3BlcmFuZF9leGNlcHRpb247CisgICAgICAgIHBnbV9jaGVja190YWJsZVsweDFDXSA9ICZzcGFjZV9zd2l0Y2hfZXhjZXB0aW9uOworICAgICAgICBwZ21fY2hlY2tfdGFibGVbMHgxRF0gPSAmaGZwX3NxcnRfZXhjZXB0aW9uOworCXBnbV9jaGVja190YWJsZVsweDQwXSA9ICZkb19tb25pdG9yX2NhbGw7CisKKwlpZiAoTUFDSElORV9JU19WTSkgeworCQkvKgorCQkgKiBGaXJzdCB0cnkgdG8gZ2V0IHBmYXVsdCBwc2V1ZG8gcGFnZSBmYXVsdHMgZ29pbmcuCisJCSAqIElmIHRoaXMgaXNuJ3QgYXZhaWxhYmxlIHR1cm4gb24gcGFnZXggcGFnZSBmYXVsdHMuCisJCSAqLworI2lmZGVmIENPTkZJR19QRkFVTFQKKwkJLyogcmVxdWVzdCB0aGUgMHgyNjAzIGV4dGVybmFsIGludGVycnVwdCAqLworCQlpZiAocmVnaXN0ZXJfZWFybHlfZXh0ZXJuYWxfaW50ZXJydXB0KDB4MjYwMywgcGZhdWx0X2ludGVycnVwdCwKKwkJCQkJCSAgICAgICZleHRfaW50X3BmYXVsdCkgIT0gMCkKKwkJCXBhbmljKCJDb3VsZG4ndCByZXF1ZXN0IGV4dGVybmFsIGludGVycnVwdCAweDI2MDMiKTsKKworCQlpZiAocGZhdWx0X2luaXQoKSA9PSAwKSAKKwkJCXJldHVybjsKKwkJCisJCS8qIFRvdWdoIGx1Y2ssIG5vIHBmYXVsdC4gKi8KKwkJdW5yZWdpc3Rlcl9lYXJseV9leHRlcm5hbF9pbnRlcnJ1cHQoMHgyNjAzLCBwZmF1bHRfaW50ZXJydXB0LAorCQkJCQkJICAgICZleHRfaW50X3BmYXVsdCk7CisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX0FSQ0hfUzM5MFgKKwkJY3BjbWQoIlNFVCBQQUdFWCBPTiIsIE5VTEwsIDApOworI2VuZGlmCisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9zMzkwL2tlcm5lbC92bWxpbnV4Lmxkcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZmRiMzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTAsMCArMSwxMzAgQEAKKy8qIGxkIHNjcmlwdCB0byBtYWtlIHMzOTAgTGludXgga2VybmVsCisgKiBXcml0dGVuIGJ5IE1hcnRpbiBTY2h3aWRlZnNreSAoc2Nod2lkZWZza3lAZGUuaWJtLmNvbSkKKyAqLworCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2lmbmRlZiBDT05GSUdfQVJDSF9TMzkwWAorT1VUUFVUX0ZPUk1BVCgiZWxmMzItczM5MCIsICJlbGYzMi1zMzkwIiwgImVsZjMyLXMzOTAiKQorT1VUUFVUX0FSQ0goczM5MCkKK0VOVFJZKF9zdGFydCkKK2ppZmZpZXMgPSBqaWZmaWVzXzY0ICsgNDsKKyNlbHNlCitPVVRQVVRfRk9STUFUKCJlbGY2NC1zMzkwIiwgImVsZjY0LXMzOTAiLCAiZWxmNjQtczM5MCIpCitPVVRQVVRfQVJDSChzMzkwOjY0LWJpdCkKK0VOVFJZKF9zdGFydCkKK2ppZmZpZXMgPSBqaWZmaWVzXzY0OworI2VuZGlmCisKK1NFQ1RJT05TCit7CisgIC4gPSAweDAwMDAwMDAwOworICBfdGV4dCA9IC47CQkJLyogVGV4dCBhbmQgcmVhZC1vbmx5IGRhdGEgKi8KKyAgLnRleHQgOiB7CisJKigudGV4dCkKKwlTQ0hFRF9URVhUCisJTE9DS19URVhUCisJKiguZml4dXApCisJKiguZ251Lndhcm5pbmcpCisJfSA9IDB4MDcwMAorCisgIF9ldGV4dCA9IC47CQkJLyogRW5kIG9mIHRleHQgc2VjdGlvbiAqLworCisgIC4gPSBBTElHTigxNik7CQkvKiBFeGNlcHRpb24gdGFibGUgKi8KKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICBST0RBVEEKKworI2lmZGVmIENPTkZJR19TSEFSRURfS0VSTkVMCisgIC4gPSBBTElHTigxMDQ4NTc2KTsJCS8qIFZNIHNoYXJlZCBzZWdtZW50cyBhcmUgMU1CIGFsaWduZWQgKi8KKworICBfZXNoYXJlZCA9IC47CQkJLyogRW5kIG9mIHNoYXJlYWJsZSBkYXRhICovCisjZW5kaWYKKworICAuZGF0YSA6IHsJCQkvKiBEYXRhICovCisJKiguZGF0YSkKKwlDT05TVFJVQ1RPUlMKKwl9CisKKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX25vc2F2ZV9iZWdpbiA9IC47CisgIC5kYXRhX25vc2F2ZSA6IHsgKiguZGF0YS5ub3NhdmUpIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX25vc2F2ZV9lbmQgPSAuOworCisgIC4gPSBBTElHTig0MDk2KTsKKyAgLmRhdGEucGFnZV9hbGlnbmVkIDogeyAqKC5kYXRhLmlkdCkgfQorCisgIC4gPSBBTElHTigzMik7CisgIC5kYXRhLmNhY2hlbGluZV9hbGlnbmVkIDogeyAqKC5kYXRhLmNhY2hlbGluZV9hbGlnbmVkKSB9CisKKyAgX2VkYXRhID0gLjsJCQkvKiBFbmQgb2YgZGF0YSBzZWN0aW9uICovCisKKyAgLiA9IEFMSUdOKDgxOTIpOwkJLyogaW5pdF90YXNrICovCisgIC5kYXRhLmluaXRfdGFzayA6IHsgKiguZGF0YS5pbml0X3Rhc2spIH0KKworICAvKiB3aWxsIGJlIGZyZWVkIGFmdGVyIGluaXQgKi8KKyAgLiA9IEFMSUdOKDQwOTYpOwkJLyogSW5pdCBjb2RlIGFuZCBkYXRhICovCisgIF9faW5pdF9iZWdpbiA9IC47CisgIC5pbml0LnRleHQgOiB7IAorCV9zaW5pdHRleHQgPSAuOworCSooLmluaXQudGV4dCkKKwlfZWluaXR0ZXh0ID0gLjsKKyAgfQorICAuaW5pdC5kYXRhIDogeyAqKC5pbml0LmRhdGEpIH0KKyAgLiA9IEFMSUdOKDI1Nik7CisgIF9fc2V0dXBfc3RhcnQgPSAuOworICAuaW5pdC5zZXR1cCA6IHsgKiguaW5pdC5zZXR1cCkgfQorICBfX3NldHVwX2VuZCA9IC47CisgIF9faW5pdGNhbGxfc3RhcnQgPSAuOworICAuaW5pdGNhbGwuaW5pdCA6IHsKKwkqKC5pbml0Y2FsbDEuaW5pdCkgCisJKiguaW5pdGNhbGwyLmluaXQpIAorCSooLmluaXRjYWxsMy5pbml0KSAKKwkqKC5pbml0Y2FsbDQuaW5pdCkgCisJKiguaW5pdGNhbGw1LmluaXQpIAorCSooLmluaXRjYWxsNi5pbml0KSAKKwkqKC5pbml0Y2FsbDcuaW5pdCkKKyAgfQorICBfX2luaXRjYWxsX2VuZCA9IC47CisgIF9fY29uX2luaXRjYWxsX3N0YXJ0ID0gLjsKKyAgLmNvbl9pbml0Y2FsbC5pbml0IDogeyAqKC5jb25faW5pdGNhbGwuaW5pdCkgfQorICBfX2Nvbl9pbml0Y2FsbF9lbmQgPSAuOworICBTRUNVUklUWV9JTklUCisgIC4gPSBBTElHTigyNTYpOworICBfX2luaXRyYW1mc19zdGFydCA9IC47CisgIC5pbml0LnJhbWZzIDogeyAqKC5pbml0LmluaXRyYW1mcykgfQorICAuID0gQUxJR04oMik7CisgIF9faW5pdHJhbWZzX2VuZCA9IC47CisgIC4gPSBBTElHTigyNTYpOworICBfX3Blcl9jcHVfc3RhcnQgPSAuOworICAuZGF0YS5wZXJjcHUgIDogeyAqKC5kYXRhLnBlcmNwdSkgfQorICBfX3Blcl9jcHVfZW5kID0gLjsKKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfZW5kID0gLjsKKyAgLyogZnJlZWQgYWZ0ZXIgaW5pdCBlbmRzIGhlcmUgKi8KKworICBfX2Jzc19zdGFydCA9IC47CQkvKiBCU1MgKi8KKyAgLmJzcyA6IHsgKiguYnNzKSB9CisgIC4gPSBBTElHTigyKTsKKyAgX19ic3Nfc3RvcCA9IC47CisKKyAgX2VuZCA9IC4gOworCisgIC8qIFNlY3Rpb25zIHRvIGJlIGRpc2NhcmRlZCAqLworICAvRElTQ0FSRC8gOiB7CisJKiguZXhpdGNhbGwuZXhpdCkKKwl9CisKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4IDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9Cit9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3Z0aW1lLmMgYi9hcmNoL3MzOTAva2VybmVsL3Z0aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI2Y2YwMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdnRpbWUuYwpAQCAtMCwwICsxLDU2NSBAQAorLyoKKyAqICBhcmNoL3MzOTAva2VybmVsL3Z0aW1lLmMKKyAqICAgIFZpcnR1YWwgY3B1IHRpbWVyIGJhc2VkIHRpbWVyIGZ1bmN0aW9ucy4KKyAqCisgKiAgUzM5MCB2ZXJzaW9uCisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDQgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgorICogICAgQXV0aG9yKHMpOiBKYW4gR2xhdWJlciA8amFuLmdsYXViZXJAZGUuaWJtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3NpeC10aW1lcnMuaD4KKworI2luY2x1ZGUgPGFzbS9zMzkwX2V4dC5oPgorI2luY2x1ZGUgPGFzbS90aW1lci5oPgorCisjZGVmaW5lIFZUSU1FUl9NQUdJQyAoVElNRVJfTUFHSUMgKyAxKQorc3RhdGljIGV4dF9pbnRfaW5mb190IGV4dF9pbnRfaW5mb190aW1lcjsKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCB2dGltZXJfcXVldWUsIHZpcnRfY3B1X3RpbWVyKTsKKworI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCisvKgorICogVXBkYXRlIHByb2Nlc3MgdGltZXMgYmFzZWQgb24gdmlydHVhbCBjcHUgdGltZXMgc3RvcmVkIGJ5IGVudHJ5LlMKKyAqIHRvIHRoZSBsb3djb3JlIGZpZWxkcyB1c2VyX3RpbWVyLCBzeXN0ZW1fdGltZXIgJiBzdGVhbF9jbG9jay4KKyAqLwordm9pZCBhY2NvdW50X3VzZXJfdnRpbWUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJY3B1dGltZV90IGNwdXRpbWU7CisJX191NjQgdGltZXIsIGNsb2NrOworCWludCByY3VfdXNlcl9mbGFnOworCisJdGltZXIgPSBTMzkwX2xvd2NvcmUubGFzdF91cGRhdGVfdGltZXI7CisJY2xvY2sgPSBTMzkwX2xvd2NvcmUubGFzdF91cGRhdGVfY2xvY2s7CisJYXNtIHZvbGF0aWxlICgiICBTVFBUICUwXG4iICAgIC8qIFN0b3JlIGN1cnJlbnQgY3B1IHRpbWVyIHZhbHVlICovCisJCSAgICAgICIgIFNUQ0sgJTEiICAgICAgLyogU3RvcmUgY3VycmVudCB0b2QgY2xvY2sgdmFsdWUgKi8KKwkJICAgICAgOiAiPW0iIChTMzkwX2xvd2NvcmUubGFzdF91cGRhdGVfdGltZXIpLAorCQkgICAgICAgICI9bSIgKFMzOTBfbG93Y29yZS5sYXN0X3VwZGF0ZV9jbG9jaykgKTsKKwlTMzkwX2xvd2NvcmUuc3lzdGVtX3RpbWVyICs9IHRpbWVyIC0gUzM5MF9sb3djb3JlLmxhc3RfdXBkYXRlX3RpbWVyOworCVMzOTBfbG93Y29yZS5zdGVhbF9jbG9jayArPSBTMzkwX2xvd2NvcmUubGFzdF91cGRhdGVfY2xvY2sgLSBjbG9jazsKKworCWNwdXRpbWUgPSBTMzkwX2xvd2NvcmUudXNlcl90aW1lciA+PiAxMjsKKwlyY3VfdXNlcl9mbGFnID0gY3B1dGltZSAhPSAwOworCVMzOTBfbG93Y29yZS51c2VyX3RpbWVyIC09IGNwdXRpbWUgPDwgMTI7CisJUzM5MF9sb3djb3JlLnN0ZWFsX2Nsb2NrIC09IGNwdXRpbWUgPDwgMTI7CisJYWNjb3VudF91c2VyX3RpbWUodHNrLCBjcHV0aW1lKTsKKworCWNwdXRpbWUgPSAgUzM5MF9sb3djb3JlLnN5c3RlbV90aW1lciA+PiAxMjsKKwlTMzkwX2xvd2NvcmUuc3lzdGVtX3RpbWVyIC09IGNwdXRpbWUgPDwgMTI7CisJUzM5MF9sb3djb3JlLnN0ZWFsX2Nsb2NrIC09IGNwdXRpbWUgPDwgMTI7CisJYWNjb3VudF9zeXN0ZW1fdGltZSh0c2ssIEhBUkRJUlFfT0ZGU0VULCBjcHV0aW1lKTsKKworCWNwdXRpbWUgPSBTMzkwX2xvd2NvcmUuc3RlYWxfY2xvY2s7CisJaWYgKChfX3M2NCkgY3B1dGltZSA+IDApIHsKKwkJY3B1dGltZSA+Pj0gMTI7CisJCVMzOTBfbG93Y29yZS5zdGVhbF9jbG9jayAtPSBjcHV0aW1lIDw8IDEyOworCQlhY2NvdW50X3N0ZWFsX3RpbWUodHNrLCBjcHV0aW1lKTsKKwl9CisKKwlydW5fbG9jYWxfdGltZXJzKCk7CisJaWYgKHJjdV9wZW5kaW5nKHNtcF9wcm9jZXNzb3JfaWQoKSkpCisJCXJjdV9jaGVja19jYWxsYmFja3Moc21wX3Byb2Nlc3Nvcl9pZCgpLCByY3VfdXNlcl9mbGFnKTsKKwlzY2hlZHVsZXJfdGljaygpOworIAlydW5fcG9zaXhfY3B1X3RpbWVycyh0c2spOworfQorCisvKgorICogVXBkYXRlIHByb2Nlc3MgdGltZXMgYmFzZWQgb24gdmlydHVhbCBjcHUgdGltZXMgc3RvcmVkIGJ5IGVudHJ5LlMKKyAqIHRvIHRoZSBsb3djb3JlIGZpZWxkcyB1c2VyX3RpbWVyLCBzeXN0ZW1fdGltZXIgJiBzdGVhbF9jbG9jay4KKyAqLwordm9pZCBhY2NvdW50X3N5c3RlbV92dGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwljcHV0aW1lX3QgY3B1dGltZTsKKwlfX3U2NCB0aW1lcjsKKworCXRpbWVyID0gUzM5MF9sb3djb3JlLmxhc3RfdXBkYXRlX3RpbWVyOworCWFzbSB2b2xhdGlsZSAoIiAgU1RQVCAlMCIgICAgLyogU3RvcmUgY3VycmVudCBjcHUgdGltZXIgdmFsdWUgKi8KKwkJICAgICAgOiAiPW0iIChTMzkwX2xvd2NvcmUubGFzdF91cGRhdGVfdGltZXIpICk7CisJUzM5MF9sb3djb3JlLnN5c3RlbV90aW1lciArPSB0aW1lciAtIFMzOTBfbG93Y29yZS5sYXN0X3VwZGF0ZV90aW1lcjsKKworCWNwdXRpbWUgPSAgUzM5MF9sb3djb3JlLnN5c3RlbV90aW1lciA+PiAxMjsKKwlTMzkwX2xvd2NvcmUuc3lzdGVtX3RpbWVyIC09IGNwdXRpbWUgPDwgMTI7CisJUzM5MF9sb3djb3JlLnN0ZWFsX2Nsb2NrIC09IGNwdXRpbWUgPDwgMTI7CisJYWNjb3VudF9zeXN0ZW1fdGltZSh0c2ssIDAsIGNwdXRpbWUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3Z0aW1lcihfX3U2NCBleHBpcmVzKQoreworCV9fdTY0IHRpbWVyOworCisJYXNtIHZvbGF0aWxlICgiICBTVFBUICUwXG4iICAvKiBTdG9yZSBjdXJyZW50IGNwdSB0aW1lciB2YWx1ZSAqLworCQkgICAgICAiICBTUFQgJTEiICAgICAvKiBTZXQgbmV3IHZhbHVlIGltbWVkaWF0bHkgYWZ0ZXJ3YXJkcyAqLworCQkgICAgICA6ICI9bSIgKHRpbWVyKSA6ICJtIiAoZXhwaXJlcykgKTsKKwlTMzkwX2xvd2NvcmUuc3lzdGVtX3RpbWVyICs9IFMzOTBfbG93Y29yZS5sYXN0X3VwZGF0ZV90aW1lciAtIHRpbWVyOworCVMzOTBfbG93Y29yZS5sYXN0X3VwZGF0ZV90aW1lciA9IGV4cGlyZXM7CisKKwkvKiBzdG9yZSBleHBpcmUgdGltZSBmb3IgdGhpcyBDUFUgdGltZXIgKi8KKwlwZXJfY3B1KHZpcnRfY3B1X3RpbWVyLCBzbXBfcHJvY2Vzc29yX2lkKCkpLnRvX2V4cGlyZSA9IGV4cGlyZXM7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHNldF92dGltZXIoX191NjQgZXhwaXJlcykKK3sKKwlTMzkwX2xvd2NvcmUubGFzdF91cGRhdGVfdGltZXIgPSBleHBpcmVzOworCWFzbSB2b2xhdGlsZSAoIlNQVCAlMCIgOiA6ICJtIiAoUzM5MF9sb3djb3JlLmxhc3RfdXBkYXRlX3RpbWVyKSk7CisKKwkvKiBzdG9yZSBleHBpcmUgdGltZSBmb3IgdGhpcyBDUFUgdGltZXIgKi8KKwlwZXJfY3B1KHZpcnRfY3B1X3RpbWVyLCBzbXBfcHJvY2Vzc29yX2lkKCkpLnRvX2V4cGlyZSA9IGV4cGlyZXM7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgc3RhcnRfY3B1X3RpbWVyKHZvaWQpCit7CisJc3RydWN0IHZ0aW1lcl9xdWV1ZSAqdnRfbGlzdDsKKworCXZ0X2xpc3QgPSAmcGVyX2NwdSh2aXJ0X2NwdV90aW1lciwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlzZXRfdnRpbWVyKHZ0X2xpc3QtPmlkbGUpOworfQorCitzdGF0aWMgdm9pZCBzdG9wX2NwdV90aW1lcih2b2lkKQoreworCV9fdTY0IGRvbmU7CisJc3RydWN0IHZ0aW1lcl9xdWV1ZSAqdnRfbGlzdDsKKworCXZ0X2xpc3QgPSAmcGVyX2NwdSh2aXJ0X2NwdV90aW1lciwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCS8qIG5vdGhpbmcgdG8gZG8gKi8KKwlpZiAobGlzdF9lbXB0eSgmdnRfbGlzdC0+bGlzdCkpIHsKKwkJdnRfbGlzdC0+aWRsZSA9IFZUSU1FUl9NQVhfU0xJQ0U7CisJCWdvdG8gZmlyZTsKKwl9CisKKwkvKiBzdG9yZSBwcm9ncmVzcyAqLworCWFzbSB2b2xhdGlsZSAoIlNUUFQgJTAiIDogIj1tIiAoZG9uZSkpOworCisJLyoKKwkgKiBJZiBkb25lIGlzIG5lZ2F0aXZlIHdlIGRvIG5vdCBzdG9wIHRoZSBDUFUgdGltZXIKKwkgKiBiZWNhdXNlIHdlIHdpbGwgZ2V0IGluc3RhbnRseSBhbiBpbnRlcnJ1cHQgdGhhdAorCSAqIHdpbGwgc3RhcnQgdGhlIENQVSB0aW1lciBhZ2Fpbi4KKwkgKi8KKwlpZiAoZG9uZSAmIDFMTDw8NjMpCisJCXJldHVybjsKKwllbHNlCisJCXZ0X2xpc3QtPm9mZnNldCArPSB2dF9saXN0LT50b19leHBpcmUgLSBkb25lOworCisJLyogc2F2ZSB0aGUgYWN0dWFsIGV4cGlyZSB2YWx1ZSAqLworCXZ0X2xpc3QtPmlkbGUgPSBkb25lOworCisJLyoKKwkgKiBXZSBjYW5ub3QgaGFsdCB0aGUgQ1BVIHRpbWVyLCB3ZSBqdXN0IHdyaXRlIGEgdmFsdWUgdGhhdAorCSAqIG5lYXJseSBuZXZlciBleHBpcmVzIChvbmx5IGFmdGVyIDcxIHllYXJzKSBhbmQgcmUtd3JpdGUKKwkgKiB0aGUgc3RvcmVkIGV4cGlyZSB2YWx1ZSBpZiB3ZSBjb250aW51ZSB0aGUgdGltZXIKKwkgKi8KKyBmaXJlOgorCXNldF92dGltZXIoVlRJTUVSX01BWF9TTElDRSk7Cit9CisKKy8qCisgKiBTb3J0ZWQgYWRkIHRvIGEgbGlzdC4gTGlzdCBpcyBsaW5lYXIgc2VhcmNoZWQgdW50aWwgZmlyc3QgYmlnZ2VyCisgKiBlbGVtZW50IGlzIGZvdW5kLgorICovCitzdGF0aWMgdm9pZCBsaXN0X2FkZF9zb3J0ZWQoc3RydWN0IHZ0aW1lcl9saXN0ICp0aW1lciwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgdnRpbWVyX2xpc3QgKmV2ZW50OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShldmVudCwgaGVhZCwgZW50cnkpIHsKKwkJaWYgKGV2ZW50LT5leHBpcmVzID4gdGltZXItPmV4cGlyZXMpIHsKKwkJCWxpc3RfYWRkX3RhaWwoJnRpbWVyLT5lbnRyeSwgJmV2ZW50LT5lbnRyeSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJbGlzdF9hZGRfdGFpbCgmdGltZXItPmVudHJ5LCBoZWFkKTsKK30KKworLyoKKyAqIERvIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMgb2YgZXhwaXJlZCB2dGltZXIgZXZlbnRzLgorICogQ2FsbGVkIGZyb20gd2l0aGluIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworc3RhdGljIHZvaWQgZG9fY2FsbGJhY2tzKHN0cnVjdCBsaXN0X2hlYWQgKmNiX2xpc3QsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB2dGltZXJfcXVldWUgKnZ0X2xpc3Q7CisJc3RydWN0IHZ0aW1lcl9saXN0ICpldmVudCwgKnRtcDsKKwl2b2lkICgqZm4pKHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBwdF9yZWdzKik7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCisJaWYgKGxpc3RfZW1wdHkoY2JfbGlzdCkpCisJCXJldHVybjsKKworCXZ0X2xpc3QgPSAmcGVyX2NwdSh2aXJ0X2NwdV90aW1lciwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShldmVudCwgdG1wLCBjYl9saXN0LCBlbnRyeSkgeworCQlmbiA9IGV2ZW50LT5mdW5jdGlvbjsKKwkJZGF0YSA9IGV2ZW50LT5kYXRhOworCQlmbihkYXRhLCByZWdzKTsKKworCQlpZiAoIWV2ZW50LT5pbnRlcnZhbCkKKwkJCS8qIGRlbGV0ZSBvbmUgc2hvdCB0aW1lciAqLworCQkJbGlzdF9kZWxfaW5pdCgmZXZlbnQtPmVudHJ5KTsKKwkJZWxzZSB7CisJCQkvKiBtb3ZlIGludGVydmFsIHRpbWVyIGJhY2sgdG8gbGlzdCAqLworCQkJc3Bpbl9sb2NrKCZ2dF9saXN0LT5sb2NrKTsKKwkJCWxpc3RfZGVsX2luaXQoJmV2ZW50LT5lbnRyeSk7CisJCQlsaXN0X2FkZF9zb3J0ZWQoZXZlbnQsICZ2dF9saXN0LT5saXN0KTsKKwkJCXNwaW5fdW5sb2NrKCZ2dF9saXN0LT5sb2NrKTsKKwkJfQorCX0KK30KKworLyoKKyAqIEhhbmRsZXIgZm9yIHRoZSB2aXJ0dWFsIENQVSB0aW1lci4KKyAqLworc3RhdGljIHZvaWQgZG9fY3B1X3RpbWVyX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncywgX191MTYgZXJyb3JfY29kZSkKK3sKKwlpbnQgY3B1OworCV9fdTY0IG5leHQsIGRlbHRhOworCXN0cnVjdCB2dGltZXJfcXVldWUgKnZ0X2xpc3Q7CisJc3RydWN0IHZ0aW1lcl9saXN0ICpldmVudCwgKnRtcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CisJLyogdGhlIGNhbGxiYWNrIHF1ZXVlICovCisJc3RydWN0IGxpc3RfaGVhZCBjYl9saXN0OworCisJSU5JVF9MSVNUX0hFQUQoJmNiX2xpc3QpOworCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwl2dF9saXN0ID0gJnBlcl9jcHUodmlydF9jcHVfdGltZXIsIGNwdSk7CisKKwkvKiB3YWxrIHRpbWVyIGxpc3QsIGZpcmUgYWxsIGV4cGlyZWQgZXZlbnRzICovCisJc3Bpbl9sb2NrKCZ2dF9saXN0LT5sb2NrKTsKKworCWlmICh2dF9saXN0LT50b19leHBpcmUgPCBWVElNRVJfTUFYX1NMSUNFKQorCQl2dF9saXN0LT5vZmZzZXQgKz0gdnRfbGlzdC0+dG9fZXhwaXJlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGV2ZW50LCB0bXAsICZ2dF9saXN0LT5saXN0LCBlbnRyeSkgeworCQlpZiAoZXZlbnQtPmV4cGlyZXMgPiB2dF9saXN0LT5vZmZzZXQpCisJCQkvKiBmb3VuZCBmaXJzdCB1bmV4cGlyZWQgZXZlbnQsIGxlYXZlICovCisJCQlicmVhazsKKworCQkvKiByZS1jaGFyZ2UgaW50ZXJ2YWwgdGltZXIsIHdlIGhhdmUgdG8gYWRkIHRoZSBvZmZzZXQgKi8KKwkJaWYgKGV2ZW50LT5pbnRlcnZhbCkKKwkJCWV2ZW50LT5leHBpcmVzID0gZXZlbnQtPmludGVydmFsICsgdnRfbGlzdC0+b2Zmc2V0OworCisJCS8qIG1vdmUgZXhwaXJlZCB0aW1lciB0byB0aGUgY2FsbGJhY2sgcXVldWUgKi8KKwkJbGlzdF9tb3ZlX3RhaWwoJmV2ZW50LT5lbnRyeSwgJmNiX2xpc3QpOworCX0KKwlzcGluX3VubG9jaygmdnRfbGlzdC0+bG9jayk7CisJZG9fY2FsbGJhY2tzKCZjYl9saXN0LCByZWdzKTsKKworCS8qIG5leHQgZXZlbnQgaXMgZmlyc3QgaW4gbGlzdCAqLworCXNwaW5fbG9jaygmdnRfbGlzdC0+bG9jayk7CisJaWYgKCFsaXN0X2VtcHR5KCZ2dF9saXN0LT5saXN0KSkgeworCQlwdHIgPSB2dF9saXN0LT5saXN0Lm5leHQ7CisJCWV2ZW50ID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCB2dGltZXJfbGlzdCwgZW50cnkpOworCQluZXh0ID0gZXZlbnQtPmV4cGlyZXMgLSB2dF9saXN0LT5vZmZzZXQ7CisKKwkJLyogYWRkIHRoZSBleHBpcmVkIHRpbWUgZnJvbSB0aGlzIGludGVycnVwdCBoYW5kbGVyCisJCSAqIGFuZCB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zCisJCSAqLworCQlhc20gdm9sYXRpbGUgKCJTVFBUICUwIiA6ICI9bSIgKGRlbHRhKSk7CisJCWRlbHRhID0gMHhmZmZmZmZmZmZmZmZmZmZmTEwgLSBkZWx0YSArIDE7CisJCXZ0X2xpc3QtPm9mZnNldCArPSBkZWx0YTsKKwkJbmV4dCAtPSBkZWx0YTsKKwl9IGVsc2UgeworCQl2dF9saXN0LT5vZmZzZXQgPSAwOworCQluZXh0ID0gVlRJTUVSX01BWF9TTElDRTsKKwl9CisJc3Bpbl91bmxvY2soJnZ0X2xpc3QtPmxvY2spOworCXNldF92dGltZXIobmV4dCk7Cit9CisKK3ZvaWQgaW5pdF92aXJ0X3RpbWVyKHN0cnVjdCB2dGltZXJfbGlzdCAqdGltZXIpCit7CisJdGltZXItPm1hZ2ljID0gVlRJTUVSX01BR0lDOworCXRpbWVyLT5mdW5jdGlvbiA9IE5VTEw7CisJSU5JVF9MSVNUX0hFQUQoJnRpbWVyLT5lbnRyeSk7CisJc3Bpbl9sb2NrX2luaXQoJnRpbWVyLT5sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0woaW5pdF92aXJ0X3RpbWVyKTsKKworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfdnRpbWVyKHN0cnVjdCB2dGltZXJfbGlzdCAqdGltZXIpCit7CisJaWYgKHRpbWVyLT5tYWdpYyAhPSBWVElNRVJfTUFHSUMpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCB2dGltZXJfcGVuZGluZyhzdHJ1Y3QgdnRpbWVyX2xpc3QgKnRpbWVyKQoreworCXJldHVybiAoIWxpc3RfZW1wdHkoJnRpbWVyLT5lbnRyeSkpOworfQorCisvKgorICogdGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBydW4gb24gdGhlIHNwZWNpZmllZCBDUFUKKyAqLworc3RhdGljIHZvaWQgaW50ZXJuYWxfYWRkX3Z0aW1lcihzdHJ1Y3QgdnRpbWVyX2xpc3QgKnRpbWVyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJX191NjQgZG9uZTsKKwlzdHJ1Y3QgdnRpbWVyX2xpc3QgKmV2ZW50OworCXN0cnVjdCB2dGltZXJfcXVldWUgKnZ0X2xpc3Q7CisKKwl2dF9saXN0ID0gJnBlcl9jcHUodmlydF9jcHVfdGltZXIsIHRpbWVyLT5jcHUpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ2dF9saXN0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAodGltZXItPmNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpCisJCXByaW50aygiaW50ZXJuYWxfYWRkX3Z0aW1lcjogQlVHLCBydW5uaW5nIG9uIHdyb25nIENQVSIpOworCisJLyogaWYgbGlzdCBpcyBlbXB0eSB3ZSBvbmx5IGhhdmUgdG8gc2V0IHRoZSB0aW1lciAqLworCWlmIChsaXN0X2VtcHR5KCZ2dF9saXN0LT5saXN0KSkgeworCQkvKiByZXNldCB0aGUgb2Zmc2V0LCB0aGlzIG1heSBoYXBwZW4gaWYgdGhlIGxhc3QgdGltZXIgd2FzCisJCSAqIGp1c3QgZGVsZXRlZCBieSBtb2RfdmlydF90aW1lciBhbmQgdGhlIGludGVycnVwdAorCQkgKiBkaWRuJ3QgaGFwcGVuIHVudGlsIGhlcmUKKwkJICovCisJCXZ0X2xpc3QtPm9mZnNldCA9IDA7CisJCWdvdG8gZmlyZTsKKwl9CisKKwkvKiBzYXZlIHByb2dyZXNzICovCisJYXNtIHZvbGF0aWxlICgiU1RQVCAlMCIgOiAiPW0iIChkb25lKSk7CisKKwkvKiBjYWxjdWxhdGUgY29tcGxldGVkIHdvcmsgKi8KKwlkb25lID0gdnRfbGlzdC0+dG9fZXhwaXJlIC0gZG9uZSArIHZ0X2xpc3QtPm9mZnNldDsKKwl2dF9saXN0LT5vZmZzZXQgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShldmVudCwgJnZ0X2xpc3QtPmxpc3QsIGVudHJ5KQorCQlldmVudC0+ZXhwaXJlcyAtPSBkb25lOworCisgZmlyZToKKwlsaXN0X2FkZF9zb3J0ZWQodGltZXIsICZ2dF9saXN0LT5saXN0KTsKKworCS8qIGdldCBmaXJzdCBlbGVtZW50LCB3aGljaCBpcyB0aGUgbmV4dCB2dGltZXIgc2xpY2UgKi8KKwlldmVudCA9IGxpc3RfZW50cnkodnRfbGlzdC0+bGlzdC5uZXh0LCBzdHJ1Y3QgdnRpbWVyX2xpc3QsIGVudHJ5KTsKKworCXNldF92dGltZXIoZXZlbnQtPmV4cGlyZXMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZ0X2xpc3QtPmxvY2ssIGZsYWdzKTsKKwkvKiByZWxlYXNlIENQVSBhcXVpcmVkIGluIHByZXBhcmVfdnRpbWVyIG9yIG1vZF92aXJ0X3RpbWVyKCkgKi8KKwlwdXRfY3B1KCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByZXBhcmVfdnRpbWVyKHN0cnVjdCB2dGltZXJfbGlzdCAqdGltZXIpCit7CisJaWYgKGNoZWNrX3Z0aW1lcih0aW1lcikgfHwgIXRpbWVyLT5mdW5jdGlvbikgeworCQlwcmludGsoImFkZF92aXJ0X3RpbWVyOiB1bmluaXRpYWxpemVkIHRpbWVyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCF0aW1lci0+ZXhwaXJlcyB8fCB0aW1lci0+ZXhwaXJlcyA+IFZUSU1FUl9NQVhfU0xJQ0UpIHsKKwkJcHJpbnRrKCJhZGRfdmlydF90aW1lcjogaW52YWxpZCB0aW1lciBleHBpcmUgdmFsdWUhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHZ0aW1lcl9wZW5kaW5nKHRpbWVyKSkgeworCQlwcmludGsoImFkZF92aXJ0X3RpbWVyOiB0aW1lciBwZW5kaW5nXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwl0aW1lci0+Y3B1ID0gZ2V0X2NwdSgpOworCXJldHVybiAwOworfQorCisvKgorICogYWRkX3ZpcnRfdGltZXIgLSBhZGQgYW4gb25lc2hvdCB2aXJ0dWFsIENQVSB0aW1lcgorICovCit2b2lkIGFkZF92aXJ0X3RpbWVyKHZvaWQgKm5ldykKK3sKKwlzdHJ1Y3QgdnRpbWVyX2xpc3QgKnRpbWVyOworCisJdGltZXIgPSAoc3RydWN0IHZ0aW1lcl9saXN0ICopbmV3OworCisJaWYgKHByZXBhcmVfdnRpbWVyKHRpbWVyKSA8IDApCisJCXJldHVybjsKKworCXRpbWVyLT5pbnRlcnZhbCA9IDA7CisJaW50ZXJuYWxfYWRkX3Z0aW1lcih0aW1lcik7Cit9CitFWFBPUlRfU1lNQk9MKGFkZF92aXJ0X3RpbWVyKTsKKworLyoKKyAqIGFkZF92aXJ0X3RpbWVyX2ludCAtIGFkZCBhbiBpbnRlcnZhbCB2aXJ0dWFsIENQVSB0aW1lcgorICovCit2b2lkIGFkZF92aXJ0X3RpbWVyX3BlcmlvZGljKHZvaWQgKm5ldykKK3sKKwlzdHJ1Y3QgdnRpbWVyX2xpc3QgKnRpbWVyOworCisJdGltZXIgPSAoc3RydWN0IHZ0aW1lcl9saXN0ICopbmV3OworCisJaWYgKHByZXBhcmVfdnRpbWVyKHRpbWVyKSA8IDApCisJCXJldHVybjsKKworCXRpbWVyLT5pbnRlcnZhbCA9IHRpbWVyLT5leHBpcmVzOworCWludGVybmFsX2FkZF92dGltZXIodGltZXIpOworfQorRVhQT1JUX1NZTUJPTChhZGRfdmlydF90aW1lcl9wZXJpb2RpYyk7CisKKy8qCisgKiBJZiB3ZSBjaGFuZ2UgYSBwZW5kaW5nIHRpbWVyIHRoZSBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbiB0aGUgQ1BVCisgKiB3aGVyZSB0aGUgdGltZXIgaXMgcnVubmluZyBvbiwgZS5nLiBieSBzbXBfY2FsbF9mdW5jdGlvbl9vbigpCisgKgorICogVGhlIG9yaWdpbmFsIG1vZF90aW1lciBhZGRzIHRoZSB0aW1lciBpZiBpdCBpcyBub3QgcGVuZGluZy4gRm9yIGNvbXBhdGliaWxpdHkKKyAqIHdlIGRvIHRoZSBzYW1lLiBUaGUgdGltZXIgd2lsbCBiZSBhZGRlZCBvbiB0aGUgY3VycmVudCBDUFUgYXMgYSBvbmVzaG90IHRpbWVyLgorICoKKyAqIHJldHVybnMgd2hldGhlciBpdCBoYXMgbW9kaWZpZWQgYSBwZW5kaW5nIHRpbWVyICgxKSBvciBub3QgKDApCisgKi8KK2ludCBtb2RfdmlydF90aW1lcihzdHJ1Y3QgdnRpbWVyX2xpc3QgKnRpbWVyLCBfX3U2NCBleHBpcmVzKQoreworCXN0cnVjdCB2dGltZXJfcXVldWUgKnZ0X2xpc3Q7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY3B1OworCisJaWYgKGNoZWNrX3Z0aW1lcih0aW1lcikgfHwgIXRpbWVyLT5mdW5jdGlvbikgeworCQlwcmludGsoIm1vZF92aXJ0X3RpbWVyOiB1bmluaXRpYWxpemVkIHRpbWVyXG4iKTsKKwkJcmV0dXJuCS1FSU5WQUw7CisJfQorCisJaWYgKCFleHBpcmVzIHx8IGV4cGlyZXMgPiBWVElNRVJfTUFYX1NMSUNFKSB7CisJCXByaW50aygibW9kX3ZpcnRfdGltZXI6IGludmFsaWQgZXhwaXJlIHJhbmdlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBUaGlzIGlzIGEgY29tbW9uIG9wdGltaXphdGlvbiB0cmlnZ2VyZWQgYnkgdGhlCisJICogbmV0d29ya2luZyBjb2RlIC0gaWYgdGhlIHRpbWVyIGlzIHJlLW1vZGlmaWVkCisJICogdG8gYmUgdGhlIHNhbWUgdGhpbmcgdGhlbiBqdXN0IHJldHVybjoKKwkgKi8KKwlpZiAodGltZXItPmV4cGlyZXMgPT0gZXhwaXJlcyAmJiB2dGltZXJfcGVuZGluZyh0aW1lcikpCisJCXJldHVybiAxOworCisJY3B1ID0gZ2V0X2NwdSgpOworCXZ0X2xpc3QgPSAmcGVyX2NwdSh2aXJ0X2NwdV90aW1lciwgY3B1KTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyBiZWZvcmUgdGVzdCBpZiB0aW1lciBpcyBwZW5kaW5nICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZ0X2xpc3QtPmxvY2ssIGZsYWdzKTsKKworCS8qIGlmIHRpbWVyIGlzbid0IHBlbmRpbmcgYWRkIGl0IG9uIHRoZSBjdXJyZW50IENQVSAqLworCWlmICghdnRpbWVyX3BlbmRpbmcodGltZXIpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZ0X2xpc3QtPmxvY2ssIGZsYWdzKTsKKwkJLyogd2UgZG8gbm90IGFjdGl2YXRlIGFuIGludGVydmFsIHRpbWVyIHdpdGggbW9kX3ZpcnRfdGltZXIgKi8KKwkJdGltZXItPmludGVydmFsID0gMDsKKwkJdGltZXItPmV4cGlyZXMgPSBleHBpcmVzOworCQl0aW1lci0+Y3B1ID0gY3B1OworCQlpbnRlcm5hbF9hZGRfdnRpbWVyKHRpbWVyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogY2hlY2sgaWYgd2UgcnVuIG9uIHRoZSByaWdodCBDUFUgKi8KKwlpZiAodGltZXItPmNwdSAhPSBjcHUpIHsKKwkJcHJpbnRrKCJtb2RfdmlydF90aW1lcjogcnVubmluZyBvbiB3cm9uZyBDUFUsIGNoZWNrIHlvdXIgY29kZVxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZ0X2xpc3QtPmxvY2ssIGZsYWdzKTsKKwkJcHV0X2NwdSgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsaXN0X2RlbF9pbml0KCZ0aW1lci0+ZW50cnkpOworCXRpbWVyLT5leHBpcmVzID0gZXhwaXJlczsKKworCS8qIGFsc28gY2hhbmdlIHRoZSBpbnRlcnZhbCBpZiB3ZSBoYXZlIGFuIGludGVydmFsIHRpbWVyICovCisJaWYgKHRpbWVyLT5pbnRlcnZhbCkKKwkJdGltZXItPmludGVydmFsID0gZXhwaXJlczsKKworCS8qIHRoZSB0aW1lciBjYW4ndCBleHBpcmUgYW55bW9yZSBzbyB3ZSBjYW4gcmVsZWFzZSB0aGUgbG9jayAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZ0X2xpc3QtPmxvY2ssIGZsYWdzKTsKKwlpbnRlcm5hbF9hZGRfdnRpbWVyKHRpbWVyKTsKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0wobW9kX3ZpcnRfdGltZXIpOworCisvKgorICogZGVsZXRlIGEgdmlydHVhbCB0aW1lcgorICoKKyAqIHJldHVybnMgd2hldGhlciB0aGUgZGVsZXRlZCB0aW1lciB3YXMgcGVuZGluZyAoMSkgb3Igbm90ICgwKQorICovCitpbnQgZGVsX3ZpcnRfdGltZXIoc3RydWN0IHZ0aW1lcl9saXN0ICp0aW1lcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB2dGltZXJfcXVldWUgKnZ0X2xpc3Q7CisKKwlpZiAoY2hlY2tfdnRpbWVyKHRpbWVyKSkgeworCQlwcmludGsoImRlbF92aXJ0X3RpbWVyOiB0aW1lciBub3QgaW5pdGlhbGl6ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBjaGVjayBpZiB0aW1lciBpcyBwZW5kaW5nICovCisJaWYgKCF2dGltZXJfcGVuZGluZyh0aW1lcikpCisJCXJldHVybiAwOworCisJdnRfbGlzdCA9ICZwZXJfY3B1KHZpcnRfY3B1X3RpbWVyLCB0aW1lci0+Y3B1KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdnRfbGlzdC0+bG9jaywgZmxhZ3MpOworCisJLyogd2UgZG9uJ3QgaW50ZXJydXB0IGEgcnVubmluZyB0aW1lciwganVzdCBsZXQgaXQgZXhwaXJlISAqLworCWxpc3RfZGVsX2luaXQoJnRpbWVyLT5lbnRyeSk7CisKKwkvKiBsYXN0IHRpbWVyIHJlbW92ZWQgKi8KKwlpZiAobGlzdF9lbXB0eSgmdnRfbGlzdC0+bGlzdCkpIHsKKwkJdnRfbGlzdC0+dG9fZXhwaXJlID0gMDsKKwkJdnRfbGlzdC0+b2Zmc2V0ID0gMDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2dF9saXN0LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDE7Cit9CitFWFBPUlRfU1lNQk9MKGRlbF92aXJ0X3RpbWVyKTsKKworLyoKKyAqIFN0YXJ0IHRoZSB2aXJ0dWFsIENQVSB0aW1lciBvbiB0aGUgY3VycmVudCBDUFUuCisgKi8KK3ZvaWQgaW5pdF9jcHVfdnRpbWVyKHZvaWQpCit7CisJc3RydWN0IHZ0aW1lcl9xdWV1ZSAqdnRfbGlzdDsKKwl1bnNpZ25lZCBsb25nIGNyMDsKKworCS8qIGtpY2sgdGhlIHZpcnR1YWwgdGltZXIgKi8KKwlTMzkwX2xvd2NvcmUuZXhpdF90aW1lciA9IFZUSU1FUl9NQVhfU0xJQ0U7CisJUzM5MF9sb3djb3JlLmxhc3RfdXBkYXRlX3RpbWVyID0gVlRJTUVSX01BWF9TTElDRTsKKwlhc20gdm9sYXRpbGUgKCJTUFQgJTAiIDogOiAibSIgKFMzOTBfbG93Y29yZS5sYXN0X3VwZGF0ZV90aW1lcikpOworCWFzbSB2b2xhdGlsZSAoIlNUQ0sgJTAiIDogIj1tIiAoUzM5MF9sb3djb3JlLmxhc3RfdXBkYXRlX2Nsb2NrKSk7CisJX19jdGxfc3RvcmUoY3IwLCAwLCAwKTsKKwljcjAgfD0gMHg0MDA7CisJX19jdGxfbG9hZChjcjAsIDAsIDApOworCisJdnRfbGlzdCA9ICZwZXJfY3B1KHZpcnRfY3B1X3RpbWVyLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCUlOSVRfTElTVF9IRUFEKCZ2dF9saXN0LT5saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmdnRfbGlzdC0+bG9jayk7CisJdnRfbGlzdC0+dG9fZXhwaXJlID0gMDsKKwl2dF9saXN0LT5vZmZzZXQgPSAwOworCXZ0X2xpc3QtPmlkbGUgPSAwOworCit9CisKK3N0YXRpYyBpbnQgdnRpbWVyX2lkbGVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQoreworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBDUFVfSURMRToKKwkJc3RvcF9jcHVfdGltZXIoKTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfTk9UX0lETEU6CisJCXN0YXJ0X2NwdV90aW1lcigpOworCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB2dGltZXJfaWRsZV9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHZ0aW1lcl9pZGxlX25vdGlmeSwKK307CisKK3ZvaWQgX19pbml0IHZ0aW1lX2luaXQodm9pZCkKK3sKKwkvKiByZXF1ZXN0IHRoZSBjcHUgdGltZXIgZXh0ZXJuYWwgaW50ZXJydXB0ICovCisJaWYgKHJlZ2lzdGVyX2Vhcmx5X2V4dGVybmFsX2ludGVycnVwdCgweDEwMDUsIGRvX2NwdV90aW1lcl9pbnRlcnJ1cHQsCisJCQkJCSAgICAgICZleHRfaW50X2luZm9fdGltZXIpICE9IDApCisJCXBhbmljKCJDb3VsZG4ndCByZXF1ZXN0IGV4dGVybmFsIGludGVycnVwdCAweDEwMDUiKTsKKworCWlmIChyZWdpc3Rlcl9pZGxlX25vdGlmaWVyKCZ2dGltZXJfaWRsZV9uYikpCisJCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciBpZGxlIG5vdGlmaWVyIik7CisKKwlpbml0X2NwdV92dGltZXIoKTsKK30KKwo=